diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..fdee6325d0 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,21 @@ +# This file contains file patterns that triggers automatic +# code review requests from users that are owners of these files +# Order matters, the last match has the highest precedence + +# library folders +lib/colvars/* @giacomofiorin +lib/compress/* @akohlmey +lib/kokkos/* @stanmoore1 +lib/molfile/* @akohlmey +lib/qmmm/* @akohlmey +lib/vtk/* @rbberger + +# packages +src/KOKKOS @stanmoore1 +src/USER-CGSDK @akohlmey +src/USER-COLVARS @giacomofiorin +src/USER-OMP @akohlmey +src/USER-QMMM @akohlmey + +# tools +tools/msi2lmp/* @akohlmey diff --git a/.gitignore b/.gitignore index 74e511515e..50b970249a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,11 @@ log.cite .Trashes ehthumbs.db Thumbs.db + +#cmake +/build* +/CMakeCache.txt +/CMakeFiles/ +/Makefile +/cmake_install.cmake +/lmp diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt new file mode 100644 index 0000000000..3a7e5dace6 --- /dev/null +++ b/cmake/CMakeLists.txt @@ -0,0 +1,732 @@ +######################################## +# CMake build system +# This file is part of LAMMPS +# Created by Christoph Junghans and Richard Berger +cmake_minimum_required(VERSION 3.1) + +project(lammps) +set(SOVERSION 0) +set(LAMMPS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../src) +set(LAMMPS_LIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../lib) +set(LAMMPS_LIB_BINARY_DIR ${CMAKE_BINARY_DIR}/lib) + +#To not conflict with old Makefile build system, we build everything here +file(GLOB LIB_SOURCES ${LAMMPS_SOURCE_DIR}/*.cpp) +file(GLOB LMP_SOURCES ${LAMMPS_SOURCE_DIR}/main.cpp) +list(REMOVE_ITEM LIB_SOURCES ${LMP_SOURCES}) + +# Cmake modules/macros are in a subdirectory to keep this file cleaner +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Modules) + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) + #release comes with -O3 by default + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) +endif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) + +# remove any style headers in the src dir +file(GLOB SRC_STYLE_FILES ${LAMMPS_SOURCE_DIR}/style_*.h) +if(SRC_STYLE_FILES) + file(REMOVE ${SRC_STYLE_FILES}) +endif() + +enable_language(CXX) + +###################################################################### +# compiler tests +# these need ot be done early (before further tests). +##################################################################### +include(CheckCCompilerFlag) + +if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -restrict") +endif() + +######################################################################## +# User input options # +######################################################################## +option(BUILD_SHARED_LIBS "Build shared libs" OFF) +if(BUILD_SHARED_LIBS) # for all pkg libs, mpi_stubs and linalg + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +endif() +include(GNUInstallDirs) + +set(LAMMPS_LINK_LIBS) +set(LAMMPS_DEPS) +set(LAMMPS_API_DEFINES) +option(ENABLE_MPI "Build MPI version" OFF) +if(ENABLE_MPI) + find_package(MPI REQUIRED) + include_directories(${MPI_C_INCLUDE_PATH}) + list(APPEND LAMMPS_LINK_LIBS ${MPI_CXX_LIBRARIES}) + option(LAMMPS_LONGLONG_TO_LONG "Workaround if your system or MPI version does not recognize 'long long' data types" OFF) + if(LAMMPS_LONGLONG_TO_LONG) + add_definitions(-DLAMMPS_LONGLONG_TO_LONG) + endif() +else() + file(GLOB MPI_SOURCES ${LAMMPS_SOURCE_DIR}/STUBS/mpi.c) + add_library(mpi_stubs STATIC ${MPI_SOURCES}) + include_directories(${LAMMPS_SOURCE_DIR}/STUBS) + list(APPEND LAMMPS_LINK_LIBS mpi_stubs) +endif() + +set(LAMMPS_SIZE_LIMIT "LAMMPS_SMALLBIG" CACHE STRING "Lammps size limit") +set_property(CACHE LAMMPS_SIZE_LIMIT PROPERTY STRINGS LAMMPS_SMALLBIG LAMMPS_BIGBIG LAMMPS_SMALLSMALL) +add_definitions(-D${LAMMPS_SIZE_LIMIT}) +set(LAMMPS_API_DEFINES "${LAMMPS_API_DEFINES} -D${LAMMPS_SIZE_LIMIT}") + +set(LAMMPS_MEMALIGN "64" CACHE STRING "enables the use of the posix_memalign() call instead of malloc() when large chunks or memory are allocated by LAMMPS") +add_definitions(-DLAMMPS_MEMALIGN=${LAMMPS_MEMALIGN}) + +option(LAMMPS_EXCEPTIONS "enable the use of C++ exceptions for error messages (useful for library interface)" OFF) +if(LAMMPS_EXCEPTIONS) + add_definitions(-DLAMMPS_EXCEPTIONS) + set(LAMMPS_API_DEFINES "${LAMMPS_API_DEFINES} -DLAMMPS_EXCEPTIONS") +endif() + +set(LAMMPS_MACHINE "" CACHE STRING "Suffix to append to lmp binary and liblammps (WON'T enable any features automatically") +mark_as_advanced(LAMMPS_MACHINE) +if(LAMMPS_MACHINE) + set(LAMMPS_MACHINE "_${LAMMPS_MACHINE}") +endif() + +option(CMAKE_VERBOSE_MAKEFILE "Verbose makefile" OFF) + +option(ENABLE_TESTING "Enable testing" OFF) +if(ENABLE_TESTING) + enable_testing() +endif(ENABLE_TESTING) + +option(ENABLE_ALL "Build all default packages" OFF) +set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GRANULAR + KSPACE MANYBODY MC MEAM MISC MOLECULE PERI QEQ + REAX REPLICA RIGID SHOCK SNAP SRD) +set(OTHER_PACKAGES KIM PYTHON MSCG MPIIO VORONOI POEMS LATTE + USER-ATC USER-AWPMD USER-CGDNA USER-MESO + USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF + USER-FEP USER-H5MD USER-LB USER-MANIFOLD USER-MEAMC USER-MGPT USER-MISC + USER-MOFFF USER-MOLFILE USER-NETCDF USER-PHONON USER-QTB USER-REAXC USER-SMD + USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM) +set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU) +foreach(PKG ${DEFAULT_PACKAGES}) + option(ENABLE_${PKG} "Build ${PKG} Package" ${ENABLE_ALL}) +endforeach() +foreach(PKG ${ACCEL_PACKAGES} ${OTHER_PACKAGES}) + option(ENABLE_${PKG} "Build ${PKG} Package" OFF) +endforeach() + +macro(pkg_depends PKG1 PKG2) + if(ENABLE_${PKG1} AND NOT ENABLE_${PKG2}) + message(FATAL_ERROR "${PKG1} package needs LAMMPS to be build with ${PKG2}") + endif() +endmacro() + +pkg_depends(MPIIO MPI) +pkg_depends(QEQ MANYBODY) +pkg_depends(USER-ATC MANYBODY) +pkg_depends(USER-H5MD MPI) +pkg_depends(USER-LB MPI) +pkg_depends(USER-MISC MANYBODY) +pkg_depends(USER-PHONON KSPACE) + +if(ENABLE_BODY AND ENABLE_POEMS) + message(FATAL_ERROR "BODY and POEMS cannot be enabled at the same time") +endif() + +###################################################### +# packages with special compiler needs or external libs +###################################################### +if(ENABLE_REAX OR ENABLE_MEAM OR ENABLE_USER-QUIP OR ENABLE_USER-QMMM OR ENABLE_LATTE) + enable_language(Fortran) + include(CheckFortranCompilerFlag) + check_Fortran_compiler_flag("-fno-second-underscore" FC_HAS_NO_SECOND_UNDERSCORE) +endif() + +if(ENABLE_KOKKOS OR ENABLE_MSCG) + # starting with CMake 3.1 this is all you have to do to enforce C++11 + set(CMAKE_CXX_STANDARD 11) # C++11... + set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required... + set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11 +endif() + +if(ENABLE_USER-OMP OR ENABLE_KOKKOS OR ENABLE_USER-INTEL) + find_package(OpenMP REQUIRED) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +endif() + +if(ENABLE_KSPACE) + set(FFT "KISSFFT" CACHE STRING "FFT library for KSPACE package") + set_property(CACHE FFT PROPERTY STRINGS KISSFFT FFTW3 MKL FFTW2) + if(NOT FFT STREQUAL "KISSFFT") + find_package(${FFT} REQUIRED) + add_definitions(-DFFT_${FFT}) + include_directories(${${FFT}_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${${FFT}_LIBRARIES}) + endif() + set(PACK_OPTIMIZATION "PACK_ARRAY" CACHE STRING "Optimization for FFT") + set_property(CACHE PACK_OPTIMIZATION PROPERTY STRINGS PACK_ARRAY PACK_POINTER PACK_MEMCPY) + if(NOT PACK_OPTIMIZATION STREQUAL "PACK_ARRAY") + add_definitions(-D${PACK_OPTIMIZATION}) + endif() +endif() + +if(ENABLE_MSCG OR ENABLE_USER-ATC OR ENABLE_USER-AWPMD OR ENABLE_USER-QUIP OR ENABLE_LATTE) + find_package(LAPACK) + if(NOT LAPACK_FOUND) + enable_language(Fortran) + file(GLOB LAPACK_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/linalg/*.f) + add_library(linalg STATIC ${LAPACK_SOURCES}) + include(CheckFortranCompilerFlag) + check_Fortran_compiler_flag("-fno-second-underscore" FC_HAS_NO_SECOND_UNDERSCORE) + if(FC_HAS_NO_SECOND_UNDERSCORE) + target_compile_options(linalg PRIVATE -fno-second-underscore) + endif() + set(LAPACK_LIBRARIES linalg) + endif() +endif() + +if(ENABLE_PYTHON) + find_package(PythonInterp REQUIRED) + find_package(PythonLibs REQUIRED) + add_definitions(-DLMP_PYTHON) + include_directories(${PYTHON_INCLUDE_DIR}) + list(APPEND LAMMPS_LINK_LIBS ${PYTHON_LIBRARY}) + if(BUILD_SHARED_LIBS) + if(NOT PYTHON_INSTDIR) + execute_process(COMMAND ${PYTHON_EXECUTABLE} + -c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" + OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR}) + endif() +endif() + +find_package(JPEG) +if(JPEG_FOUND) + add_definitions(-DLAMMPS_JPEG) + include_directories(${JPEG_INCLUDE_DIR}) + list(APPEND LAMMPS_LINK_LIBS ${JPEG_LIBRARIES}) +endif() + +find_package(PNG) +find_package(ZLIB) +if(PNG_FOUND AND ZLIB_FOUND) + include_directories(${PNG_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${PNG_LIBRARIES} ${ZLIB_LIBRARIES}) + add_definitions(-DLAMMPS_PNG) +endif() + +find_program(GZIP_EXECUTABLE gzip) +find_package_handle_standard_args(GZIP REQUIRED_VARS GZIP_EXECUTABLE) +if(GZIP_FOUND) + add_definitions(-DLAMMPS_GZIP) +endif() + +find_program(FFMPEG_EXECUTABLE ffmpeg) +find_package_handle_standard_args(FFMPEG REQUIRED_VARS FFMPEG_EXECUTABLE) +if(FFMPEG_FOUND) + add_definitions(-DLAMMPS_FFMPEG) +endif() + +if(ENABLE_VORONOI) + find_package(VORO REQUIRED) #some distros + include_directories(${VORO_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${VORO_LIBRARIES}) +endif() + +if(ENABLE_LATTE) + find_package(LATTE QUIET) + if(NOT LATTE_FOUND) + message(STATUS "LATTE not found - we will build our own") + include(ExternalProject) + ExternalProject_Add(latte_build + URL https://github.com/lanl/LATTE/archive/v1.0.1.tar.gz + URL_MD5 5137e28cb1a64444bd571c98c98a6eee + SOURCE_SUBDIR cmake + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE} + ) + ExternalProject_get_property(latte_build INSTALL_DIR) + set(LATTE_LIBRARIES ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/liblatte.a) + list(APPEND LAMMPS_DEPS latte_build) + endif() + list(APPEND LAMMPS_LINK_LIBS ${LATTE_LIBRARIES} ${LAPACK_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) +endif() + +if(ENABLE_USER-MOLFILE) + add_library(molfile INTERFACE) + target_include_directories(molfile INTERFACE ${LAMMPS_LIB_SOURCE_DIR}/molfile) + target_link_libraries(molfile INTERFACE ${CMAKE_DL_LIBS}) + list(APPEND LAMMPS_LINK_LIBS molfile) +endif() + +if(ENABLE_USER-NETCDF) + find_package(NetCDF REQUIRED) + include_directories(NETCDF_INCLUDE_DIR) + list(APPEND LAMMPS_LINK_LIBS ${NETCDF_LIBRARY}) + add_definitions(-DLMP_HAS_NETCDF -DNC_64BIT_DATA=0x0020) +endif() + +if(ENABLE_USER-SMD) + find_package(Eigen3 REQUIRED) + include_directories(${EIGEN3_INCLUDE_DIR}) +endif() + +if(ENABLE_USER-QUIP) + find_package(QUIP REQUIRED) + list(APPEND LAMMPS_LINK_LIBS ${QUIP_LIBRARIES} ${LAPACK_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) +endif() + +if(ENABLE_USER-QMMM) + find_package(QE REQUIRED) + include_directories(${QE_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${QE_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) +endif() + +if(ENABLE_USER-VTK) + find_package(VTK REQUIRED NO_MODULE) + include(${VTK_USE_FILE}) + add_definitions(-DLAMMPS_VTK) + list(APPEND LAMMPS_LINK_LIBS ${VTK_LIBRARIES}) +endif() + +if(ENABLE_KIM) + find_package(KIM REQUIRED) + list(APPEND LAMMPS_LINK_LIBS ${KIM_LIBRARIES}) + include_directories(${KIM_INCLUDE_DIRS}) +endif() + +if(ENABLE_MSCG) + find_package(GSL REQUIRED) + set(LAMMPS_LIB_MSCG_BIN_DIR ${LAMMPS_LIB_BINARY_DIR}/mscg) + set(MSCG_TARBALL ${LAMMPS_LIB_MSCG_BIN_DIR}/MS-CG-master.zip) + set(LAMMPS_LIB_MSCG_BIN_DIR ${LAMMPS_LIB_MSCG_BIN_DIR}/MSCG-release-master/src) + if(NOT EXISTS ${LAMMPS_LIB_MSCG_BIN_DIR}) + if(NOT EXISTS ${MSCG_TARBALL}) + message(STATUS "Downloading ${MSCG_TARBALL}") + file(DOWNLOAD + https://github.com/uchicago-voth/MSCG-release/archive/master.zip + ${MSCG_TARBALL} SHOW_PROGRESS) #EXPECTED_MD5 cannot be due due to master + endif() + message(STATUS "Unpacking ${MSCG_TARBALL}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ${MSCG_TARBALL} + WORKING_DIRECTORY ${LAMMPS_LIB_BINARY_DIR}/mscg) + endif() + file(GLOB MSCG_SOURCES ${LAMMPS_LIB_MSCG_BIN_DIR}/*.cpp) + add_library(mscg STATIC ${MSCG_SOURCES}) + list(APPEND LAMMPS_LINK_LIBS mscg) + target_compile_options(mscg PRIVATE -DDIMENSION=3 -D_exclude_gromacs=1) + target_include_directories(mscg PUBLIC ${LAMMPS_LIB_MSCG_BIN_DIR}) + target_link_libraries(mscg ${GSL_LIBRARIES} ${LAPACK_LIBRARIES}) +endif() + +######################################################################## +# Basic system tests (standard libraries, headers, functions, types) # +######################################################################## +include(CheckIncludeFile) +foreach(HEADER math.h) + check_include_file(${HEADER} FOUND_${HEADER}) + if(NOT FOUND_${HEADER}) + message(FATAL_ERROR "Could not find needed header - ${HEADER}") + endif(NOT FOUND_${HEADER}) +endforeach(HEADER) + +set(MATH_LIBRARIES "m" CACHE STRING "math library") +mark_as_advanced( MATH_LIBRARIES ) +include(CheckLibraryExists) +foreach(FUNC sin cos) + check_library_exists(${MATH_LIBRARIES} ${FUNC} "" FOUND_${FUNC}_${MATH_LIBRARIES}) + if(NOT FOUND_${FUNC}_${MATH_LIBRARIES}) + message(FATAL_ERROR "Could not find needed math function - ${FUNC}") + endif(NOT FOUND_${FUNC}_${MATH_LIBRARIES}) +endforeach(FUNC) +list(APPEND LAMMPS_LINK_LIBS ${MATH_LIBRARIES}) + +###################################### +# Generate Basic Style files +###################################### +include(StyleHeaderUtils) +RegisterStyles(${LAMMPS_SOURCE_DIR}) + +############################################## +# add sources of enabled packages +############################################ +foreach(PKG ${DEFAULT_PACKAGES} ${OTHER_PACKAGES}) + set(${PKG}_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/${PKG}) + + # ignore PKG files which were manually installed in src folder + # headers are ignored during RegisterStyles + file(GLOB ${PKG}_SOURCES ${${PKG}_SOURCES_DIR}/*.cpp) + file(GLOB ${PKG}_HEADERS ${${PKG}_SOURCES_DIR}/*.h) + + foreach(PKG_FILE in ${${PKG}_SOURCES}) + get_filename_component(FNAME ${PKG_FILE} NAME) + list(REMOVE_ITEM LIB_SOURCES ${LAMMPS_SOURCE_DIR}/${FNAME}) + endforeach() + + foreach(PKG_FILE in ${${PKG}_HEADERS}) + get_filename_component(FNAME ${PKG_FILE} NAME) + DetectAndRemovePackageHeader(${LAMMPS_SOURCE_DIR}/${FNAME}) + endforeach() + + if(ENABLE_${PKG}) + # detects styles in package and adds them to global list + RegisterStyles(${${PKG}_SOURCES_DIR}) + + list(APPEND LIB_SOURCES ${${PKG}_SOURCES}) + include_directories(${${PKG}_SOURCES_DIR}) + endif() +endforeach() + +############################################## +# add lib sources of (simple) enabled packages +############################################ +foreach(SIMPLE_LIB REAX MEAM POEMS USER-ATC USER-AWPMD USER-COLVARS USER-H5MD + USER-QMMM) + if(ENABLE_${SIMPLE_LIB}) + string(REGEX REPLACE "^USER-" "" PKG_LIB "${SIMPLE_LIB}") + string(TOLOWER "${PKG_LIB}" PKG_LIB) + file(GLOB_RECURSE ${PKG_LIB}_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/${PKG_LIB}/*.F + ${LAMMPS_LIB_SOURCE_DIR}/${PKG_LIB}/*.c ${LAMMPS_LIB_SOURCE_DIR}/${PKG_LIB}/*.cpp) + add_library(${PKG_LIB} STATIC ${${PKG_LIB}_SOURCES}) + list(APPEND LAMMPS_LINK_LIBS ${PKG_LIB}) + if(PKG_LIB STREQUAL awpmd) + target_include_directories(awpmd PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/awpmd/systems/interact ${LAMMPS_LIB_SOURCE_DIR}/awpmd/ivutils/include) + elseif(PKG_LIB STREQUAL h5md) + target_include_directories(h5md PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/h5md/include) + elseif(PKG_LIB STREQUAL colvars) + target_compile_options(colvars PRIVATE -DLEPTON) + target_include_directories(colvars PRIVATE ${LAMMPS_LIB_SOURCE_DIR}/colvars/lepton/include) + target_include_directories(colvars PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/colvars) + else() + target_include_directories(${PKG_LIB} PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/${PKG_LIB}) + endif() + endif() +endforeach() + +if(ENABLE_USER-AWPMD) + target_link_libraries(awpmd ${LAPACK_LIBRARIES}) +endif() + +if(ENABLE_USER-ATC) + target_link_libraries(atc ${LAPACK_LIBRARIES}) +endif() + +if(ENABLE_USER-H5MD) + find_package(HDF5 REQUIRED) + target_link_libraries(h5md ${HDF5_LIBRARIES}) + target_include_directories(h5md PRIVATE ${HDF5_INCLUDE_DIRS}) +endif() + +if(ENABLE_MEAM AND FC_HAS_NO_SECOND_UNDERSCORE) + foreach(FSRC ${meam_SOURCES}) + string(REGEX REPLACE "^.*\\." "" FEXT "${FSRC}") + list(FIND CMAKE_Fortran_SOURCE_FILE_EXTENSIONS "${FEXT}" FINDEX) + if(FINDEX GREATER -1) + set_property(SOURCE ${FSRC} APPEND PROPERTY COMPILE_FLAGS "-fno-second-underscore") + endif() + endforeach() +endif() + +if(ENABLE_REAX AND FC_HAS_NO_SECOND_UNDERSCORE) + target_compile_options(reax PRIVATE -fno-second-underscore) +endif() + + +###################################################################### +# packages which selectively include variants based on enabled styles +# e.g. accelerator packages +###################################################################### +if(ENABLE_USER-OMP) + set(USER-OMP_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-OMP) + set(USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/thr_data.cpp + ${USER-OMP_SOURCES_DIR}/thr_omp.cpp + ${USER-OMP_SOURCES_DIR}/fix_nh_omp.cpp + ${USER-OMP_SOURCES_DIR}/fix_nh_sphere_omp.cpp) + set_property(GLOBAL PROPERTY "OMP_SOURCES" "${USER-OMP_SOURCES}") + + # detects styles which have USER-OMP version + RegisterStylesExt(${USER-OMP_SOURCES_DIR} omp OMP_SOURCES) + + get_property(USER-OMP_SOURCES GLOBAL PROPERTY OMP_SOURCES) + + list(APPEND LIB_SOURCES ${USER-OMP_SOURCES}) + include_directories(${USER-OMP_SOURCES_DIR}) +endif() + +if(ENABLE_KOKKOS) + set(LAMMPS_LIB_KOKKOS_SRC_DIR ${LAMMPS_LIB_SOURCE_DIR}/kokkos) + set(LAMMPS_LIB_KOKKOS_BIN_DIR ${LAMMPS_LIB_BINARY_DIR}/kokkos) + add_definitions(-DLMP_KOKKOS) + add_subdirectory(${LAMMPS_LIB_KOKKOS_SRC_DIR} ${LAMMPS_LIB_KOKKOS_BIN_DIR}) + + set(Kokkos_INCLUDE_DIRS ${LAMMPS_LIB_KOKKOS_SRC_DIR}/core/src + ${LAMMPS_LIB_KOKKOS_SRC_DIR}/containers/src + ${LAMMPS_LIB_KOKKOS_SRC_DIR}/algorithms/src + ${LAMMPS_LIB_KOKKOS_BIN_DIR}) + include_directories(${Kokkos_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS kokkos) + + set(KOKKOS_PKG_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/KOKKOS) + set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/atom_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/atom_vec_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/comm_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/comm_tiled_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/neighbor_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/neigh_list_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/neigh_bond_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/fix_nh_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/nbin_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/npair_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/domain_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/modify_kokkos.cpp) + set_property(GLOBAL PROPERTY "KOKKOS_PKG_SOURCES" "${KOKKOS_PKG_SOURCES}") + + # detects styles which have KOKKOS version + RegisterStylesExt(${KOKKOS_PKG_SOURCES_DIR} kokkos KOKKOS_PKG_SOURCES) + + # register kokkos-only styles + RegisterNBinStyle(${KOKKOS_PKG_SOURCES_DIR}/nbin_kokkos.h) + RegisterNPairStyle(${KOKKOS_PKG_SOURCES_DIR}/npair_kokkos.h) + + if(ENABLE_USER-DPD) + get_property(KOKKOS_PKG_SOURCES GLOBAL PROPERTY KOKKOS_PKG_SOURCES) + list(APPEND KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/npair_ssa_kokkos.cpp) + RegisterNPairStyle(${KOKKOS_PKG_SOURCES_DIR}/npair_ssa_kokkos.h) + set_property(GLOBAL PROPERTY "KOKKOS_PKG_SOURCES" "${KOKKOS_PKG_SOURCES}") + endif() + + get_property(KOKKOS_PKG_SOURCES GLOBAL PROPERTY KOKKOS_PKG_SOURCES) + + list(APPEND LIB_SOURCES ${KOKKOS_PKG_SOURCES}) + include_directories(${KOKKOS_PKG_SOURCES_DIR}) +endif() + +if(ENABLE_OPT) + set(OPT_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/OPT) + set(OPT_SOURCES) + set_property(GLOBAL PROPERTY "OPT_SOURCES" "${OPT_SOURCES}") + + # detects styles which have OPT version + RegisterStylesExt(${OPT_SOURCES_DIR} opt OPT_SOURCES) + + get_property(OPT_SOURCES GLOBAL PROPERTY OPT_SOURCES) + + list(APPEND LIB_SOURCES ${OPT_SOURCES}) + include_directories(${OPT_SOURCES_DIR}) +endif() + +if(ENABLE_USER-INTEL) + set(USER-INTEL_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-INTEL) + set(USER-INTEL_SOURCES ${USER-INTEL_SOURCES_DIR}/intel_preprocess.h + ${USER-INTEL_SOURCES_DIR}/intel_buffers.h + ${USER-INTEL_SOURCES_DIR}/intel_buffers.cpp + ${USER-INTEL_SOURCES_DIR}/math_extra_intel.h + ${USER-INTEL_SOURCES_DIR}/nbin_intel.h + ${USER-INTEL_SOURCES_DIR}/nbin_intel.cpp + ${USER-INTEL_SOURCES_DIR}/npair_intel.h + ${USER-INTEL_SOURCES_DIR}/npair_intel.cpp + ${USER-INTEL_SOURCES_DIR}/intel_simd.h + ${USER-INTEL_SOURCES_DIR}/intel_intrinsics.h) + + set_property(GLOBAL PROPERTY "USER-INTEL_SOURCES" "${USER-INTEL_SOURCES}") + + # detects styles which have USER-INTEL version + RegisterStylesExt(${USER-INTEL_SOURCES_DIR} opt USER-INTEL_SOURCES) + + get_property(USER-INTEL_SOURCES GLOBAL PROPERTY USER-INTEL_SOURCES) + + list(APPEND LIB_SOURCES ${USER-INTEL_SOURCES}) + include_directories(${USER-INTEL_SOURCES_DIR}) +endif() + +if(ENABLE_GPU) + set(GPU_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/GPU) + set(GPU_SOURCES ${GPU_SOURCES_DIR}/gpu_extra.h + ${GPU_SOURCES_DIR}/fix_gpu.h + ${GPU_SOURCES_DIR}/fix_gpu.cpp) + + set(GPU_API "OpenCL" CACHE STRING "API used by GPU package") + set_property(CACHE GPU_API PROPERTY STRINGS OpenCL CUDA) + + set(GPU_PREC "SINGLE_DOUBLE" CACHE STRING "LAMMPS GPU precision size") + set_property(CACHE GPU_PREC PROPERTY STRINGS SINGLE_DOUBLE SINGLE_SINGLE DOUBLE_DOUBLE) + + file(GLOB GPU_LIB_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/gpu/*.cpp) + file(MAKE_DIRECTORY ${LAMMPS_LIB_BINARY_DIR}/gpu) + + if(GPU_API STREQUAL "CUDA") + find_package(CUDA REQUIRED) + find_program(BIN2C bin2c) + if(NOT BIN2C) + message(FATAL_ERROR "Couldn't find bin2c, use -DBIN2C helping cmake to find it.") + endif() + option(CUDPP_OPT "Enable CUDPP_OPT" ON) + + set(GPU_ARCH "sm_30" CACHE STRING "LAMMPS GPU CUDA SM architecture") + set_property(CACHE GPU_ARCH PROPERTY STRINGS sm_10 sm_20 sm_30 sm_60) + + file(GLOB GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/*.cu ${CMAKE_CURRENT_SOURCE_DIR}/gpu/*.cu) + list(REMOVE_ITEM GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_pppm.cu) + + cuda_include_directories(${LAMMPS_LIB_SOURCE_DIR}/gpu ${LAMMPS_LIB_BINARY_DIR}/gpu) + + if(CUDPP_OPT) + cuda_include_directories(${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini) + file(GLOB GPU_LIB_CUDPP_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini/*.cpp) + file(GLOB GPU_LIB_CUDPP_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini/*.cu) + endif() + + cuda_compile_cubin(GPU_GEN_OBJS ${GPU_LIB_CU} OPTIONS + -DUNIX -O3 -Xptxas -v --use_fast_math -DNV_KERNEL -DUCL_CUDADR -arch=${GPU_ARCH} -D_${GPU_PREC}) + + cuda_compile(GPU_OBJS ${GPU_LIB_CUDPP_CU} OPTIONS $<$:-Xcompiler=-fPIC> + -DUNIX -O3 -Xptxas -v --use_fast_math -DUCL_CUDADR -arch=${GPU_ARCH} -D_${GPU_PREC}) + + foreach(CU_OBJ ${GPU_GEN_OBJS}) + get_filename_component(CU_NAME ${CU_OBJ} NAME_WE) + string(REGEX REPLACE "^.*_lal_" "" CU_NAME "${CU_NAME}") + add_custom_command(OUTPUT ${LAMMPS_LIB_BINARY_DIR}/gpu/${CU_NAME}_cubin.h + COMMAND ${BIN2C} -c -n ${CU_NAME} ${CU_OBJ} > ${LAMMPS_LIB_BINARY_DIR}/gpu/${CU_NAME}_cubin.h + DEPENDS ${CU_OBJ} + COMMENT "Generating ${CU_NAME}_cubin.h") + list(APPEND GPU_LIB_SOURCES ${LAMMPS_LIB_BINARY_DIR}/gpu/${CU_NAME}_cubin.h) + endforeach() + set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LAMMPS_LIB_BINARY_DIR}/gpu/*_cubin.h") + + + add_library(gpu STATIC ${GPU_LIB_SOURCES} ${GPU_LIB_CUDPP_SOURCES} ${GPU_OBJS}) + target_link_libraries(gpu ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY}) + target_include_directories(gpu PRIVATE ${LAMMPS_LIB_BINARY_DIR}/gpu ${CUDA_INCLUDE_DIRS}) + target_compile_definitions(gpu PRIVATE -D_${GPU_PREC} -DMPI_GERYON -DUCL_NO_EXIT) + if(CUDPP_OPT) + target_include_directories(gpu PRIVATE ${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini) + target_compile_definitions(gpu PRIVATE -DUSE_CUDPP) + endif() + + list(APPEND LAMMPS_LINK_LIBS gpu) + + add_executable(nvc_get_devices ${LAMMPS_LIB_SOURCE_DIR}/gpu/geryon/ucl_get_devices.cpp) + target_compile_definitions(nvc_get_devices PRIVATE -DUCL_CUDADR) + target_link_libraries(nvc_get_devices PRIVATE ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY}) + target_include_directories(nvc_get_devices PRIVATE ${CUDA_INCLUDE_DIRS}) + + + elseif(GPU_API STREQUAL "OpenCL") + find_package(OpenCL REQUIRED) + set(OCL_TUNE "GENERIC" CACHE STRING "OpenCL Device Tuning") + set_property(CACHE OCL_TUNE PROPERTY STRINGS INTEL FERMI KEPLER CYPRESS GENERIC) + + include(OpenCLUtils) + set(OCL_COMMON_HEADERS ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_preprocessor.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_aux_fun1.h) + + file(GLOB GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/*.cu) + list(REMOVE_ITEM GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne.cu ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne_lj.cu) + + foreach(GPU_KERNEL ${GPU_LIB_CU}) + get_filename_component(basename ${GPU_KERNEL} NAME_WE) + string(SUBSTRING ${basename} 4 -1 KERNEL_NAME) + GenerateOpenCLHeader(${KERNEL_NAME} ${CMAKE_CURRENT_BINARY_DIR}/gpu/${KERNEL_NAME}_cl.h ${OCL_COMMON_HEADERS} ${GPU_KERNEL}) + list(APPEND GPU_LIB_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/gpu/${KERNEL_NAME}_cl.h) + endforeach() + + GenerateOpenCLHeader(gayberne ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_ellipsoid_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne.cu) + GenerateOpenCLHeader(gayberne_lj ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_lj_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_ellipsoid_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne_lj.cu) + list(APPEND GPU_LIB_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_cl.h ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_lj_cl.h) + + add_library(gpu STATIC ${GPU_LIB_SOURCES}) + target_link_libraries(gpu ${OpenCL_LIBRARIES}) + target_include_directories(gpu PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/gpu ${OpenCL_INCLUDE_DIRS}) + target_compile_definitions(gpu PRIVATE -D_${GPU_PREC} -DMPI_GERYON -DUCL_NO_EXIT) + target_compile_definitions(gpu PRIVATE -DUSE_OPENCL) + + list(APPEND LAMMPS_LINK_LIBS gpu) + + add_executable(ocl_get_devices ${LAMMPS_LIB_SOURCE_DIR}/gpu/geryon/ucl_get_devices.cpp) + target_compile_definitions(ocl_get_devices PRIVATE -DUCL_OPENCL) + target_link_libraries(ocl_get_devices PRIVATE ${OpenCL_LIBRARIES}) + target_include_directories(ocl_get_devices PRIVATE ${OpenCL_INCLUDE_DIRS}) + endif() + + # GPU package + FindStyleHeaders(${GPU_SOURCES_DIR} FIX_CLASS fix_ FIX) + + set_property(GLOBAL PROPERTY "GPU_SOURCES" "${GPU_SOURCES}") + + # detects styles which have GPU version + RegisterStylesExt(${GPU_SOURCES_DIR} gpu GPU_SOURCES) + + get_property(GPU_SOURCES GLOBAL PROPERTY GPU_SOURCES) + + list(APPEND LIB_SOURCES ${GPU_SOURCES}) + include_directories(${GPU_SOURCES_DIR}) +endif() + +###################################################### +# Generate style headers based on global list of +# styles registered during package selection +###################################################### +set(LAMMPS_STYLE_HEADERS_DIR ${CMAKE_CURRENT_BINARY_DIR}/styles) + +GenerateStyleHeaders(${LAMMPS_STYLE_HEADERS_DIR}) + +include_directories(${LAMMPS_SOURCE_DIR}) +include_directories(${LAMMPS_STYLE_HEADERS_DIR}) + +########################################### +# Actually add executable and lib to build +############################################ +add_library(lammps ${LIB_SOURCES}) +target_link_libraries(lammps ${LAMMPS_LINK_LIBS}) +if(LAMMPS_DEPS) + add_dependencies(lammps ${LAMMPS_DEPS}) +endif() +set_target_properties(lammps PROPERTIES OUTPUT_NAME lammps${LAMMPS_MACHINE}) +if(BUILD_SHARED_LIBS) + set_target_properties(lammps PROPERTIES SOVERSION ${SOVERSION}) + install(TARGETS lammps LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(FILES ${LAMMPS_SOURCE_DIR}/library.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lammps) + configure_file(pkgconfig/liblammps.pc.in ${CMAKE_CURRENT_BINARY_DIR}/liblammps${LAMMPS_MACHINE}.pc @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/liblammps${LAMMPS_MACHINE}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() + +add_executable(lmp ${LMP_SOURCES}) +target_link_libraries(lmp lammps) +set_target_properties(lmp PROPERTIES OUTPUT_NAME lmp${LAMMPS_MACHINE}) +install(TARGETS lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) +if(ENABLE_TESTING) + add_test(ShowHelp lmp${LAMMPS_MACHINE} -help) +endif() + +################################## +# Print package summary +################################## +foreach(PKG ${DEFAULT_PACKAGES} ${OTHER_PACKAGES} ${ACCEL_PACKAGES}) + if(ENABLE_${PKG}) + message(STATUS "Building package: ${PKG}") + endif() +endforeach() + +string(TOUPPER "${CMAKE_BUILD_TYPE}" BTYPE) +message(STATUS "<<< Build configuration >>> + Build type ${CMAKE_BUILD_TYPE} + Install path ${CMAKE_INSTALL_PREFIX} + Compilers and Flags: + C++ Compiler ${CMAKE_CXX_COMPILER} + Type ${CMAKE_CXX_COMPILER_ID} + C++ Flags ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BTYPE}}") +get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) +if(LANGUAGES MATCHES ".*Fortran.*") + message(STATUS "Fortran Compiler ${CMAKE_Fortran_COMPILER} + Type ${CMAKE_Fortran_COMPILER_ID} + Fortran Flags ${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${BTYPE}}") +endif() +message(STATUS "Linker flags: + Executable ${CMAKE_EXE_LINKER_FLAGS}") +if(BUILD_SHARED_LIBS) + message(STATUS "Shared libries ${CMAKE_SHARED_LINKER_FLAGS}") +else() + message(STATUS "Static libries ${CMAKE_STATIC_LINKER_FLAGS}") +endif() +message(STATUS "Link libraries: ${LAMMPS_LINK_LIBS}") + diff --git a/cmake/Modules/FindFFTW2.cmake b/cmake/Modules/FindFFTW2.cmake new file mode 100644 index 0000000000..c77e6cf8e9 --- /dev/null +++ b/cmake/Modules/FindFFTW2.cmake @@ -0,0 +1,22 @@ +# - Find fftw2 +# Find the native FFTW2 headers and libraries. +# +# FFTW2_INCLUDE_DIRS - where to find fftw2.h, etc. +# FFTW2_LIBRARIES - List of libraries when using fftw2. +# FFTW2_FOUND - True if fftw2 found. +# + +find_path(FFTW2_INCLUDE_DIR fftw.h) + +find_library(FFTW2_LIBRARY NAMES fftw) + +set(FFTW2_LIBRARIES ${FFTW2_LIBRARY}) +set(FFTW2_INCLUDE_DIRS ${FFTW2_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set FFTW2_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(FFTW2 DEFAULT_MSG FFTW2_LIBRARY FFTW2_INCLUDE_DIR) + +mark_as_advanced(FFTW2_INCLUDE_DIR FFTW2_LIBRARY ) diff --git a/cmake/Modules/FindFFTW3.cmake b/cmake/Modules/FindFFTW3.cmake new file mode 100644 index 0000000000..552bcc4257 --- /dev/null +++ b/cmake/Modules/FindFFTW3.cmake @@ -0,0 +1,25 @@ +# - Find fftw3 +# Find the native FFTW3 headers and libraries. +# +# FFTW3_INCLUDE_DIRS - where to find fftw3.h, etc. +# FFTW3_LIBRARIES - List of libraries when using fftw3. +# FFTW3_FOUND - True if fftw3 found. +# + +find_package(PkgConfig) + +pkg_check_modules(PC_FFTW3 fftw3) +find_path(FFTW3_INCLUDE_DIR fftw3.h HINTS ${PC_FFTW3_INCLUDE_DIRS}) + +find_library(FFTW3_LIBRARY NAMES fftw3 HINTS ${PC_FFTW3_LIBRARY_DIRS}) + +set(FFTW3_LIBRARIES ${FFTW3_LIBRARY}) +set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set FFTW3_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(FFTW3 DEFAULT_MSG FFTW3_LIBRARY FFTW3_INCLUDE_DIR) + +mark_as_advanced(FFTW3_INCLUDE_DIR FFTW3_LIBRARY ) diff --git a/cmake/Modules/FindKIM.cmake b/cmake/Modules/FindKIM.cmake new file mode 100644 index 0000000000..a01f817cf6 --- /dev/null +++ b/cmake/Modules/FindKIM.cmake @@ -0,0 +1,22 @@ +# - Find kim +# Find the native KIM headers and libraries. +# +# KIM_INCLUDE_DIRS - where to find kim.h, etc. +# KIM_LIBRARIES - List of libraries when using kim. +# KIM_FOUND - True if kim found. +# + +find_path(KIM_INCLUDE_DIR KIM_API.h PATH_SUFFIXES kim-api-v1) + +find_library(KIM_LIBRARY NAMES kim-api-v1) + +set(KIM_LIBRARIES ${KIM_LIBRARY}) +set(KIM_INCLUDE_DIRS ${KIM_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set KIM_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(KIM DEFAULT_MSG KIM_LIBRARY KIM_INCLUDE_DIR) + +mark_as_advanced(KIM_INCLUDE_DIR KIM_LIBRARY ) diff --git a/cmake/Modules/FindLATTE.cmake b/cmake/Modules/FindLATTE.cmake new file mode 100644 index 0000000000..74d5173bf0 --- /dev/null +++ b/cmake/Modules/FindLATTE.cmake @@ -0,0 +1,18 @@ +# - Find latte +# Find the native LATTE libraries. +# +# LATTE_LIBRARIES - List of libraries when using latte. +# LATTE_FOUND - True if latte found. +# + +find_library(LATTE_LIBRARY NAMES latte) + +set(LATTE_LIBRARIES ${LATTE_LIBRARY}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set LATTE_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(LATTE DEFAULT_MSG LATTE_LIBRARY) + +mark_as_advanced(LATTE_LIBRARY) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake new file mode 100644 index 0000000000..4246062103 --- /dev/null +++ b/cmake/Modules/FindMKL.cmake @@ -0,0 +1,22 @@ +# - Find mkl +# Find the native MKL headers and libraries. +# +# MKL_INCLUDE_DIRS - where to find mkl.h, etc. +# MKL_LIBRARIES - List of libraries when using mkl. +# MKL_FOUND - True if mkl found. +# + +find_path(MKL_INCLUDE_DIR mkl_dfti.h HINTS $ENV{MKLROOT}/include) + +find_library(MKL_LIBRARY NAMES mkl_rt HINTS $ENV{MKLROOT}/lib $ENV{MKLROOT}/lib/intel64) + +set(MKL_LIBRARIES ${MKL_LIBRARY}) +set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set MKL_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(MKL DEFAULT_MSG MKL_LIBRARY MKL_INCLUDE_DIR) + +mark_as_advanced(MKL_INCLUDE_DIR MKL_LIBRARY ) diff --git a/cmake/Modules/FindNetCDF.cmake b/cmake/Modules/FindNetCDF.cmake new file mode 100644 index 0000000000..a28c959acf --- /dev/null +++ b/cmake/Modules/FindNetCDF.cmake @@ -0,0 +1,118 @@ +# - Find NetCDF +# Find the native NetCDF includes and library +# +# NETCDF_INCLUDE_DIR - user modifiable choice of where netcdf headers are +# NETCDF_LIBRARY - user modifiable choice of where netcdf libraries are +# +# Your package can require certain interfaces to be FOUND by setting these +# +# NETCDF_CXX - require the C++ interface and link the C++ library +# NETCDF_F77 - require the F77 interface and link the fortran library +# NETCDF_F90 - require the F90 interface and link the fortran library +# +# Or equivalently by calling FindNetCDF with a COMPONENTS argument containing one or +# more of "CXX;F77;F90". +# +# When interfaces are requested the user has access to interface specific hints: +# +# NETCDF_${LANG}_INCLUDE_DIR - where to search for interface header files +# NETCDF_${LANG}_LIBRARY - where to search for interface libraries +# +# This module returns these variables for the rest of the project to use. +# +# NETCDF_FOUND - True if NetCDF found including required interfaces (see below) +# NETCDF_LIBRARIES - All netcdf related libraries. +# NETCDF_INCLUDE_DIRS - All directories to include. +# NETCDF_HAS_INTERFACES - Whether requested interfaces were found or not. +# NETCDF_${LANG}_INCLUDE_DIRS/NETCDF_${LANG}_LIBRARIES - C/C++/F70/F90 only interface +# +# Normal usage would be: +# set (NETCDF_F90 "YES") +# find_package (NetCDF REQUIRED) +# target_link_libraries (uses_everthing ${NETCDF_LIBRARIES}) +# target_link_libraries (only_uses_f90 ${NETCDF_F90_LIBRARIES}) + +#search starting from user editable cache var +if (NETCDF_INCLUDE_DIR AND NETCDF_LIBRARY) + # Already in cache, be silent + set (NETCDF_FIND_QUIETLY TRUE) +endif () + +set(USE_DEFAULT_PATHS "NO_DEFAULT_PATH") +if(NETCDF_USE_DEFAULT_PATHS) + set(USE_DEFAULT_PATHS "") +endif() + +find_path (NETCDF_INCLUDE_DIR netcdf.h + HINTS "${NETCDF_DIR}/include") +mark_as_advanced (NETCDF_INCLUDE_DIR) +set (NETCDF_C_INCLUDE_DIRS ${NETCDF_INCLUDE_DIR}) + +find_library (NETCDF_LIBRARY NAMES netcdf + HINTS "${NETCDF_DIR}/lib") +mark_as_advanced (NETCDF_LIBRARY) + +set (NETCDF_C_LIBRARIES ${NETCDF_LIBRARY}) + +#start finding requested language components +set (NetCDF_libs "") +set (NetCDF_includes "${NETCDF_INCLUDE_DIR}") + +get_filename_component (NetCDF_lib_dirs "${NETCDF_LIBRARY}" PATH) +set (NETCDF_HAS_INTERFACES "YES") # will be set to NO if we're missing any interfaces + +macro (NetCDF_check_interface lang header libs) + if (NETCDF_${lang}) + #search starting from user modifiable cache var + find_path (NETCDF_${lang}_INCLUDE_DIR NAMES ${header} + HINTS "${NETCDF_INCLUDE_DIR}" + HINTS "${NETCDF_${lang}_ROOT}/include" + ${USE_DEFAULT_PATHS}) + + find_library (NETCDF_${lang}_LIBRARY NAMES ${libs} + HINTS "${NetCDF_lib_dirs}" + HINTS "${NETCDF_${lang}_ROOT}/lib" + ${USE_DEFAULT_PATHS}) + + mark_as_advanced (NETCDF_${lang}_INCLUDE_DIR NETCDF_${lang}_LIBRARY) + + #export to internal varS that rest of project can use directly + set (NETCDF_${lang}_LIBRARIES ${NETCDF_${lang}_LIBRARY}) + set (NETCDF_${lang}_INCLUDE_DIRS ${NETCDF_${lang}_INCLUDE_DIR}) + + if (NETCDF_${lang}_INCLUDE_DIR AND NETCDF_${lang}_LIBRARY) + list (APPEND NetCDF_libs ${NETCDF_${lang}_LIBRARY}) + list (APPEND NetCDF_includes ${NETCDF_${lang}_INCLUDE_DIR}) + else () + set (NETCDF_HAS_INTERFACES "NO") + message (STATUS "Failed to find NetCDF interface for ${lang}") + endif () + endif () +endmacro () + +list (FIND NetCDF_FIND_COMPONENTS "CXX" _nextcomp) +if (_nextcomp GREATER -1) + set (NETCDF_CXX 1) +endif () +list (FIND NetCDF_FIND_COMPONENTS "F77" _nextcomp) +if (_nextcomp GREATER -1) + set (NETCDF_F77 1) +endif () +list (FIND NetCDF_FIND_COMPONENTS "F90" _nextcomp) +if (_nextcomp GREATER -1) + set (NETCDF_F90 1) +endif () +NetCDF_check_interface (CXX netcdfcpp.h netcdf_c++) +NetCDF_check_interface (F77 netcdf.inc netcdff) +NetCDF_check_interface (F90 netcdf.mod netcdff) + +#export accumulated results to internal varS that rest of project can depend on +list (APPEND NetCDF_libs "${NETCDF_C_LIBRARIES}") +set (NETCDF_LIBRARIES ${NetCDF_libs}) +set (NETCDF_INCLUDE_DIRS ${NetCDF_includes}) + +# handle the QUIETLY and REQUIRED arguments and set NETCDF_FOUND to TRUE if +# all listed variables are TRUE +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (NetCDF + DEFAULT_MSG NETCDF_LIBRARIES NETCDF_INCLUDE_DIRS NETCDF_HAS_INTERFACES) diff --git a/cmake/Modules/FindQE.cmake b/cmake/Modules/FindQE.cmake new file mode 100644 index 0000000000..4484bd4db2 --- /dev/null +++ b/cmake/Modules/FindQE.cmake @@ -0,0 +1,29 @@ +# - Find quantum-espresso +# Find the native QE headers and libraries. +# +# QE_INCLUDE_DIRS - where to find quantum-espresso.h, etc. +# QE_LIBRARIES - List of libraries when using quantum-espresso. +# QE_FOUND - True if quantum-espresso found. +# + +find_path(QE_INCLUDE_DIR libqecouple.h PATH_SUFFIXES COUPLE/include) + +find_library(QECOUPLE_LIBRARY NAMES qecouple) +find_library(PW_LIBRARY NAMES pw) +find_library(QEMOD_LIBRARY NAMES qemod) +find_library(QEFFT_LIBRARY NAMES qefft) +find_library(QELA_LIBRARY NAMES qela) +find_library(CLIB_LIBRARY NAMES clib) +find_library(IOTK_LIBRARY NAMES iotk) + + +set(QE_LIBRARIES ${QECOUPLE_LIBRARY} ${PW_LIBRARY} ${QEMOD_LIBRARY} ${QEFFT_LIBRARY} ${QELA_LIBRARY} ${CLIB_LIBRARY} ${IOTK_LIBRARY}) +set(QE_INCLUDE_DIRS ${QE_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set QE_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(QE DEFAULT_MSG QECOUPLE_LIBRARY PW_LIBRARY QEMOD_LIBRARY QEFFT_LIBRARY QELA_LIBRARY CLIB_LIBRARY IOTK_LIBRARY QE_INCLUDE_DIR) + +mark_as_advanced(QE_INCLUDE_DIR QECOUPLE_LIBRARY PW_LIBRARY QEMOD_LIBRARY QEFFT_LIBRARY QELA_LIBRARY CLIB_LIBRARY IOTK_LIBRARY) diff --git a/cmake/Modules/FindQUIP.cmake b/cmake/Modules/FindQUIP.cmake new file mode 100644 index 0000000000..4ee1baf4f8 --- /dev/null +++ b/cmake/Modules/FindQUIP.cmake @@ -0,0 +1,18 @@ +# - Find quip +# Find the native QUIP libraries. +# +# QUIP_LIBRARIES - List of libraries when using fftw3. +# QUIP_FOUND - True if fftw3 found. +# + +find_library(QUIP_LIBRARY NAMES quip) + +set(QUIP_LIBRARIES ${QUIP_LIBRARY}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set QUIP_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(QUIP DEFAULT_MSG QUIP_LIBRARY) + +mark_as_advanced(QUIP_LIBRARY) diff --git a/cmake/Modules/FindVORO.cmake b/cmake/Modules/FindVORO.cmake new file mode 100644 index 0000000000..b0cccbcd1d --- /dev/null +++ b/cmake/Modules/FindVORO.cmake @@ -0,0 +1,22 @@ +# - Find voro++ +# Find the native VORO headers and libraries. +# +# VORO_INCLUDE_DIRS - where to find voro++.hh, etc. +# VORO_LIBRARIES - List of libraries when using voro++. +# VORO_FOUND - True if voro++ found. +# + +find_path(VORO_INCLUDE_DIR voro++.hh PATH_SUFFIXES voro++) + +find_library(VORO_LIBRARY NAMES voro++) + +set(VORO_LIBRARIES ${VORO_LIBRARY}) +set(VORO_INCLUDE_DIRS ${VORO_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set VORO_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(VORO DEFAULT_MSG VORO_LIBRARY VORO_INCLUDE_DIR) + +mark_as_advanced(VORO_INCLUDE_DIR VORO_LIBRARY ) diff --git a/cmake/Modules/OpenCLUtils.cmake b/cmake/Modules/OpenCLUtils.cmake new file mode 100644 index 0000000000..5c147a685c --- /dev/null +++ b/cmake/Modules/OpenCLUtils.cmake @@ -0,0 +1,18 @@ +function(GenerateOpenCLHeader varname outfile files) + message("Creating ${outfile}...") + file(WRITE ${outfile} "const char * ${varname} = \n") + math(EXPR ARG_END "${ARGC}-1") + + foreach(IDX RANGE 2 ${ARG_END}) + list(GET ARGV ${IDX} filename) + file(READ ${filename} content) + string(REGEX REPLACE "\\s*//[^\n]*\n" "" content "${content}") + string(REGEX REPLACE "\\\\" "\\\\\\\\" content "${content}") + string(REGEX REPLACE "\"" "\\\\\"" content "${content}") + string(REGEX REPLACE "([^\n]+)\n" "\"\\1\\\\n\"\n" content "${content}") + string(REGEX REPLACE "\n+" "\n" content "${content}") + file(APPEND ${outfile} "${content}") + endforeach() + + file(APPEND ${outfile} ";\n") +endfunction(GenerateOpenCLHeader) diff --git a/cmake/Modules/StyleHeaderUtils.cmake b/cmake/Modules/StyleHeaderUtils.cmake new file mode 100644 index 0000000000..c6f580f463 --- /dev/null +++ b/cmake/Modules/StyleHeaderUtils.cmake @@ -0,0 +1,183 @@ +function(FindStyleHeaders path style_class file_pattern headers) + file(GLOB files "${path}/${file_pattern}*.h") + get_property(hlist GLOBAL PROPERTY ${headers}) + + foreach(file_name ${files}) + file(STRINGS ${file_name} is_style LIMIT_COUNT 1 REGEX ${style_class}) + if(is_style) + list(APPEND hlist ${file_name}) + endif() + endforeach() + set_property(GLOBAL PROPERTY ${headers} "${hlist}") +endfunction(FindStyleHeaders) + +function(AddStyleHeader path headers) + get_property(hlist GLOBAL PROPERTY ${headers}) + list(APPEND hlist ${path}) + set_property(GLOBAL PROPERTY ${headers} "${hlist}") +endfunction(AddStyleHeader) + +function(FindStyleHeadersExt path style_class extension headers sources) + get_property(hlist GLOBAL PROPERTY ${headers}) + get_property(slist GLOBAL PROPERTY ${sources}) + set(ext_list) + get_filename_component(abs_path "${path}" ABSOLUTE) + + foreach(file_name ${hlist}) + get_filename_component(basename ${file_name} NAME_WE) + set(ext_file_name "${abs_path}/${basename}_${extension}.h") + if(EXISTS "${ext_file_name}") + file(STRINGS ${ext_file_name} is_style LIMIT_COUNT 1 REGEX ${style_class}) + if(is_style) + list(APPEND ext_list ${ext_file_name}) + + set(source_file_name "${abs_path}/${basename}_${extension}.cpp") + if(EXISTS "${source_file_name}") + list(APPEND slist ${source_file_name}) + endif() + endif() + endif() + endforeach() + + list(APPEND hlist ${ext_list}) + set_property(GLOBAL PROPERTY ${headers} "${hlist}") + set_property(GLOBAL PROPERTY ${sources} "${slist}") +endfunction(FindStyleHeadersExt) + +function(CreateStyleHeader path filename) + math(EXPR N "${ARGC}-2") + + set(temp "") + if(N GREATER 0) + math(EXPR ARG_END "${ARGC}-1") + + foreach(IDX RANGE 2 ${ARG_END}) + list(GET ARGV ${IDX} FNAME) + get_filename_component(FNAME ${FNAME} NAME) + set(temp "${temp}#include \"${FNAME}\"\n") + endforeach() + endif() + message(STATUS "Generating ${filename}...") + file(WRITE "${path}/${filename}.tmp" "${temp}" ) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${path}/${filename}.tmp" "${path}/${filename}") +endfunction(CreateStyleHeader) + +function(GenerateStyleHeader path property style) + get_property(files GLOBAL PROPERTY ${property}) + #message("${property} = ${files}") + CreateStyleHeader("${path}" "style_${style}.h" ${files}) +endfunction(GenerateStyleHeader) + +function(RegisterNBinStyles search_path) + FindStyleHeaders(${search_path} NBIN_CLASS nbin_ NBIN ) # nbin ) # neighbor +endfunction(RegisterNBinStyles) + +function(RegisterNPairStyles search_path) + FindStyleHeaders(${search_path} NPAIR_CLASS npair_ NPAIR ) # npair ) # neighbor +endfunction(RegisterNPairStyles) + +function(RegisterNBinStyle path) + AddStyleHeader(${path} NBIN) +endfunction(RegisterNBinStyle) + +function(RegisterNPairStyle path) + AddStyleHeader(${path} NPAIR) +endfunction(RegisterNPairStyle) + +function(RegisterStyles search_path) + FindStyleHeaders(${search_path} ANGLE_CLASS angle_ ANGLE ) # angle ) # force + FindStyleHeaders(${search_path} ATOM_CLASS atom_vec_ ATOM_VEC ) # atom ) # atom atom_vec_hybrid + FindStyleHeaders(${search_path} BODY_CLASS body_ BODY ) # body ) # atom_vec_body + FindStyleHeaders(${search_path} BOND_CLASS bond_ BOND ) # bond ) # force + FindStyleHeaders(${search_path} COMMAND_CLASS "" COMMAND ) # command ) # input + FindStyleHeaders(${search_path} COMPUTE_CLASS compute_ COMPUTE ) # compute ) # modify + FindStyleHeaders(${search_path} DIHEDRAL_CLASS dihedral_ DIHEDRAL ) # dihedral ) # force + FindStyleHeaders(${search_path} DUMP_CLASS dump_ DUMP ) # dump ) # output write_dump + FindStyleHeaders(${search_path} FIX_CLASS fix_ FIX ) # fix ) # modify + FindStyleHeaders(${search_path} IMPROPER_CLASS improper_ IMPROPER ) # improper ) # force + FindStyleHeaders(${search_path} INTEGRATE_CLASS "" INTEGRATE ) # integrate ) # update + FindStyleHeaders(${search_path} KSPACE_CLASS "" KSPACE ) # kspace ) # force + FindStyleHeaders(${search_path} MINIMIZE_CLASS min_ MINIMIZE ) # minimize ) # update + FindStyleHeaders(${search_path} NBIN_CLASS nbin_ NBIN ) # nbin ) # neighbor + FindStyleHeaders(${search_path} NPAIR_CLASS npair_ NPAIR ) # npair ) # neighbor + FindStyleHeaders(${search_path} NSTENCIL_CLASS nstencil_ NSTENCIL ) # nstencil ) # neighbor + FindStyleHeaders(${search_path} NTOPO_CLASS ntopo_ NTOPO ) # ntopo ) # neighbor + FindStyleHeaders(${search_path} PAIR_CLASS pair_ PAIR ) # pair ) # force + FindStyleHeaders(${search_path} READER_CLASS reader_ READER ) # reader ) # read_dump + FindStyleHeaders(${search_path} REGION_CLASS region_ REGION ) # region ) # domain +endfunction(RegisterStyles) + +function(RemovePackageHeader headers pkg_header) + get_property(hlist GLOBAL PROPERTY ${headers}) + list(REMOVE_ITEM hlist ${pkg_header}) + set_property(GLOBAL PROPERTY ${headers} "${hlist}") +endfunction(RemovePackageHeader) + +function(DetectAndRemovePackageHeader fname) + RemovePackageHeader(ANGLE ${fname}) + RemovePackageHeader(ATOM_VEC ${fname}) + RemovePackageHeader(BODY ${fname}) + RemovePackageHeader(BOND ${fname}) + RemovePackageHeader(COMMAND ${fname}) + RemovePackageHeader(COMPUTE ${fname}) + RemovePackageHeader(DIHEDRAL ${fname}) + RemovePackageHeader(DUMP ${fname}) + RemovePackageHeader(FIX ${fname}) + RemovePackageHeader(IMPROPER ${fname}) + RemovePackageHeader(INTEGRATE ${fname}) + RemovePackageHeader(KSPACE ${fname}) + RemovePackageHeader(MINIMIZE ${fname}) + RemovePackageHeader(NBIN ${fname}) + RemovePackageHeader(NPAIR ${fname}) + RemovePackageHeader(NSTENCIL ${fname}) + RemovePackageHeader(NTOPO ${fname}) + RemovePackageHeader(PAIR ${fname}) + RemovePackageHeader(READER ${fname}) + RemovePackageHeader(REGION ${fname}) +endfunction(DetectAndRemovePackageHeader) + +function(RegisterStylesExt search_path extension sources) + FindStyleHeadersExt(${search_path} ANGLE_CLASS ${extension} ANGLE ${sources}) + FindStyleHeadersExt(${search_path} ATOM_CLASS ${extension} ATOM_VEC ${sources}) + FindStyleHeadersExt(${search_path} BODY_CLASS ${extension} BODY ${sources}) + FindStyleHeadersExt(${search_path} BOND_CLASS ${extension} BOND ${sources}) + FindStyleHeadersExt(${search_path} COMMAND_CLASS ${extension} COMMAND ${sources}) + FindStyleHeadersExt(${search_path} COMPUTE_CLASS ${extension} COMPUTE ${sources}) + FindStyleHeadersExt(${search_path} DIHEDRAL_CLASS ${extension} DIHEDRAL ${sources}) + FindStyleHeadersExt(${search_path} DUMP_CLASS ${extension} DUMP ${sources}) + FindStyleHeadersExt(${search_path} FIX_CLASS ${extension} FIX ${sources}) + FindStyleHeadersExt(${search_path} IMPROPER_CLASS ${extension} IMPROPER ${sources}) + FindStyleHeadersExt(${search_path} INTEGRATE_CLASS ${extension} INTEGRATE ${sources}) + FindStyleHeadersExt(${search_path} KSPACE_CLASS ${extension} KSPACE ${sources}) + FindStyleHeadersExt(${search_path} MINIMIZE_CLASS ${extension} MINIMIZE ${sources}) + FindStyleHeadersExt(${search_path} NBIN_CLASS ${extension} NBIN ${sources}) + FindStyleHeadersExt(${search_path} NPAIR_CLASS ${extension} NPAIR ${sources}) + FindStyleHeadersExt(${search_path} NSTENCIL_CLASS ${extension} NSTENCIL ${sources}) + FindStyleHeadersExt(${search_path} NTOPO_CLASS ${extension} NTOPO ${sources}) + FindStyleHeadersExt(${search_path} PAIR_CLASS ${extension} PAIR ${sources}) + FindStyleHeadersExt(${search_path} READER_CLASS ${extension} READER ${sources}) + FindStyleHeadersExt(${search_path} REGION_CLASS ${extension} REGION ${sources}) +endfunction(RegisterStylesExt) + +function(GenerateStyleHeaders output_path) + GenerateStyleHeader(${output_path} ANGLE angle ) # force + GenerateStyleHeader(${output_path} ATOM_VEC atom ) # atom atom_vec_hybrid + GenerateStyleHeader(${output_path} BODY body ) # atom_vec_body + GenerateStyleHeader(${output_path} BOND bond ) # force + GenerateStyleHeader(${output_path} COMMAND command ) # input + GenerateStyleHeader(${output_path} COMPUTE compute ) # modify + GenerateStyleHeader(${output_path} DIHEDRAL dihedral ) # force + GenerateStyleHeader(${output_path} DUMP dump ) # output write_dump + GenerateStyleHeader(${output_path} FIX fix ) # modify + GenerateStyleHeader(${output_path} IMPROPER improper ) # force + GenerateStyleHeader(${output_path} INTEGRATE integrate ) # update + GenerateStyleHeader(${output_path} KSPACE kspace ) # force + GenerateStyleHeader(${output_path} MINIMIZE minimize ) # update + GenerateStyleHeader(${output_path} NBIN nbin ) # neighbor + GenerateStyleHeader(${output_path} NPAIR npair ) # neighbor + GenerateStyleHeader(${output_path} NSTENCIL nstencil ) # neighbor + GenerateStyleHeader(${output_path} NTOPO ntopo ) # neighbor + GenerateStyleHeader(${output_path} PAIR pair ) # force + GenerateStyleHeader(${output_path} READER reader ) # read_dump + GenerateStyleHeader(${output_path} REGION region ) # domain +endfunction(GenerateStyleHeaders) diff --git a/cmake/README.md b/cmake/README.md new file mode 100644 index 0000000000..cc67cceb52 --- /dev/null +++ b/cmake/README.md @@ -0,0 +1,19 @@ +cmake-buildsystem +----------------- + +To use the cmake build system instead of the make-driven one, do: +``` +cmake /path/to/lammps/source/cmake +``` +(please note the cmake directory as the very end) + +To enable package, e.g. GPU do +``` +cmake /path/to/lammps/source/cmake -DENABLE_GPU=ON +``` + +cmake has many many options, do get an overview use the curses-based cmake interface, ccmake: +``` +ccmake /path/to/lammps/source/cmake +``` +(Don't forget to press "g" for generate once you are done with configuring) diff --git a/cmake/gpu/lal_pppm_d.cu b/cmake/gpu/lal_pppm_d.cu new file mode 100644 index 0000000000..a49a535013 --- /dev/null +++ b/cmake/gpu/lal_pppm_d.cu @@ -0,0 +1,4 @@ +#define grdtyp double +#define grdtyp4 double4 + +#include "lal_pppm.cu" diff --git a/cmake/gpu/lal_pppm_f.cu b/cmake/gpu/lal_pppm_f.cu new file mode 100644 index 0000000000..e7f5116fa0 --- /dev/null +++ b/cmake/gpu/lal_pppm_f.cu @@ -0,0 +1,4 @@ +#define grdtyp float +#define grdtyp4 float4 + +#include "lal_pppm.cu" diff --git a/cmake/pkgconfig/liblammps.pc.in b/cmake/pkgconfig/liblammps.pc.in new file mode 100644 index 0000000000..c5e1701782 --- /dev/null +++ b/cmake/pkgconfig/liblammps.pc.in @@ -0,0 +1,18 @@ +# pkg-config file for lammps +# https://people.freedesktop.org/~dbn/pkg-config-guide.html +# Usage: cc `pkg-config --cflags --libs liblammps` -o myapp myapp.c +# after you added @CMAKE_INSTALL_FULL_LIBDIR@/pkg-config to PKG_CONFIG_PATH, +# e.g. export PKG_CONFIG_PATH=@CMAKE_INSTALL_FULL_LIBDIR@/pkgconfig + +prefix=@CMAKE_INSTALL_FULL_PREFIX@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: liblammps@LAMMPS_MACHINE@ +Description: Large-scale Atomic/Molecular Massively Parallel Simulator Library +URL: http://lammps.sandia.gov +Version: +Requires: +Libs: -L${libdir} -llammps@LAMMPS_MACHINE@ +Libs.private: -lm +Cflags: -I${includedir} @LAMMPS_API_DEFINES@ diff --git a/doc/Makefile b/doc/Makefile index 2274ca5550..6e6f36a378 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -20,7 +20,8 @@ ifeq ($(shell which virtualenv >/dev/null 2>&1; echo $$?), 0) HAS_VIRTUALENV = YES endif -SOURCES=$(wildcard src/*.txt) +SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') +SOURCES=$(filter-out src/lammps_commands.txt src/lammps_tutorials.txt,$(wildcard src/*.txt)) OBJECTS=$(SOURCES:src/%.txt=$(RSTDIR)/%.rst) .PHONY: help clean-all clean epub html pdf old venv spelling anchor_check @@ -55,7 +56,7 @@ html: $(OBJECTS) $(ANCHORCHECK) @(\ . $(VENV)/bin/activate ;\ cp -r src/* $(RSTDIR)/ ;\ - sphinx-build -j 8 -b html -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) html ;\ + sphinx-build $(SPHINXEXTRA) -b html -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) html ;\ echo "############################################" ;\ doc_anchor_check src/*.txt ;\ echo "############################################" ;\ @@ -91,7 +92,7 @@ epub: $(OBJECTS) @(\ . $(VENV)/bin/activate ;\ cp -r src/* $(RSTDIR)/ ;\ - sphinx-build -j 8 -b epub -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) epub ;\ + sphinx-build $(SPHINXEXTRA) -b epub -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) epub ;\ deactivate ;\ ) @mv epub/LAMMPS.epub . @@ -159,7 +160,7 @@ $(VENV): @( \ virtualenv -p $(PYTHON) $(VENV); \ . $(VENV)/bin/activate; \ - pip install Sphinx==1.5.6; \ + pip install Sphinx; \ pip install sphinxcontrib-images; \ deactivate;\ ) diff --git a/doc/src/Eqs/angle_class2_p6.jpg b/doc/src/Eqs/angle_class2_p6.jpg new file mode 100644 index 0000000000..c096f6922c Binary files /dev/null and b/doc/src/Eqs/angle_class2_p6.jpg differ diff --git a/doc/src/Eqs/angle_cosine_buck6d.jpg b/doc/src/Eqs/angle_cosine_buck6d.jpg new file mode 100644 index 0000000000..69b668c086 Binary files /dev/null and b/doc/src/Eqs/angle_cosine_buck6d.jpg differ diff --git a/doc/src/Eqs/bond_gromos.jpg b/doc/src/Eqs/bond_gromos.jpg new file mode 100644 index 0000000000..479e6b2d3b Binary files /dev/null and b/doc/src/Eqs/bond_gromos.jpg differ diff --git a/doc/src/Eqs/bond_gromos.tex b/doc/src/Eqs/bond_gromos.tex new file mode 100644 index 0000000000..2cd8c39535 --- /dev/null +++ b/doc/src/Eqs/bond_gromos.tex @@ -0,0 +1,10 @@ +\documentclass[12pt]{article} +\pagestyle{empty} + +\begin{document} + +$$ + E = K (r^2 - r_0^2)^2 +$$ + +\end{document} diff --git a/doc/src/Eqs/fix_mvv_dpd.jpg b/doc/src/Eqs/fix_mvv_dpd.jpg new file mode 100644 index 0000000000..b5f39bb470 Binary files /dev/null and b/doc/src/Eqs/fix_mvv_dpd.jpg differ diff --git a/doc/src/Eqs/fix_mvv_dpd.tex b/doc/src/Eqs/fix_mvv_dpd.tex new file mode 100644 index 0000000000..685d527763 --- /dev/null +++ b/doc/src/Eqs/fix_mvv_dpd.tex @@ -0,0 +1,21 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + v(t+\frac{\Delta t}{2}) = v(t) + \frac{\Delta t}{2}\cdot a(t), +$$ + +$$ + r(t+\Delta t) = r(t) + \Delta t\cdot v(t+\frac{\Delta t}{2}), +$$ + +$$ + a(t+\Delta t) = \frac{1}{m}\cdot F\left[ r(t+\Delta t), v(t) +\lambda \cdot \Delta t\cdot a(t)\right], +$$ + +$$ + v(t+\Delta t) = v(t+\frac{\Delta t}{2}) + \frac{\Delta t}{2}\cdot a(t+\Delta t) +$$ + +\end{document} diff --git a/doc/src/Eqs/fix_rhok.jpg b/doc/src/Eqs/fix_rhok.jpg new file mode 100644 index 0000000000..829a866be4 Binary files /dev/null and b/doc/src/Eqs/fix_rhok.jpg differ diff --git a/doc/src/Eqs/fix_rhok.tex b/doc/src/Eqs/fix_rhok.tex new file mode 100644 index 0000000000..a468dfedc9 --- /dev/null +++ b/doc/src/Eqs/fix_rhok.tex @@ -0,0 +1,11 @@ +\documentclass[12pt]{article} + +\begin{document} + +\begin{eqnarray*} + U &=& \frac{1}{2} K (|\rho_{\vec{k}}| - a)^2 \\ + \rho_{\vec{k}} &=& \sum_j^N \exp(-i\vec{k} \cdot \vec{r}_j )/\sqrt{N} \\ + \vec{k} &=& (2\pi n_x /L_x , 2\pi n_y /L_y , 2\pi n_z/L_z ) +\end{eqnarray*} + +\end{document} diff --git a/doc/src/Eqs/improper_inversion_harmonic.jpg b/doc/src/Eqs/improper_inversion_harmonic.jpg new file mode 100644 index 0000000000..793311e8ad Binary files /dev/null and b/doc/src/Eqs/improper_inversion_harmonic.jpg differ diff --git a/doc/src/Eqs/pair_buck6d.jpg b/doc/src/Eqs/pair_buck6d.jpg new file mode 100644 index 0000000000..ca7f071b03 Binary files /dev/null and b/doc/src/Eqs/pair_buck6d.jpg differ diff --git a/doc/src/Eqs/pair_buck6d.txt b/doc/src/Eqs/pair_buck6d.txt new file mode 100644 index 0000000000..4888444d8c --- /dev/null +++ b/doc/src/Eqs/pair_buck6d.txt @@ -0,0 +1,9 @@ +\documentclass[12pt]{article} + +\begin{document} + +\begin{eqnarray*} + E = A e^{-\kappa r} - \frac{C}{r^6} \cdot \frac{1}{1 + D r^{14}} \qquad r < r_c \\ +\end{eqnarray*} + +\end{document} diff --git a/doc/src/Eqs/pair_coul_gauss.jpg b/doc/src/Eqs/pair_coul_gauss.jpg new file mode 100644 index 0000000000..c286650eb2 Binary files /dev/null and b/doc/src/Eqs/pair_coul_gauss.jpg differ diff --git a/doc/src/Eqs/pair_edpd_force.jpg b/doc/src/Eqs/pair_edpd_force.jpg new file mode 100644 index 0000000000..fabb6f772e Binary files /dev/null and b/doc/src/Eqs/pair_edpd_force.jpg differ diff --git a/doc/src/Eqs/pair_edpd_force.tex b/doc/src/Eqs/pair_edpd_force.tex new file mode 100644 index 0000000000..f6a0ca0d3c --- /dev/null +++ b/doc/src/Eqs/pair_edpd_force.tex @@ -0,0 +1,33 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + \mathbf{F}_{ij}^{C} = \alpha_{ij}{\omega_{C}}(r_{ij})\mathbf{e}_{ij}, +$$ + +$$ + \mathbf{F}_{ij}^{D} = -\gamma {\omega_{D}}(r_{ij})(\mathbf{e}_{ij} \cdot \mathbf{v}_{ij})\mathbf{e}_{ij}, +$$ + +$$ + \mathbf{F}_{ij}^{R} = \sigma {\omega_{R}}(r_{ij}){\xi_{ij}}\Delta t^{-1/2} \mathbf{e}_{ij}, +$$ + +$$ + \omega_{C}(r) = 1 - r/r_c, +$$ + +$$ + \alpha_{ij} = A\cdot k_B(T_i + T_j)/2, +$$ + +$$ + \omega_{D}(r) = \omega^2_{R}(r) = (1-r/r_c)^s, +$$ + +$$ + \sigma_{ij}^2 = 4\gamma k_B T_i T_j/(T_i + T_j), +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_edpd_gov.jpg b/doc/src/Eqs/pair_edpd_gov.jpg new file mode 100644 index 0000000000..10b303a218 Binary files /dev/null and b/doc/src/Eqs/pair_edpd_gov.jpg differ diff --git a/doc/src/Eqs/pair_edpd_gov.tex b/doc/src/Eqs/pair_edpd_gov.tex new file mode 100644 index 0000000000..782cdec99e --- /dev/null +++ b/doc/src/Eqs/pair_edpd_gov.tex @@ -0,0 +1,15 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + \frac{\mathrm{d}^2 \mathbf{r}_i}{\mathrm{d} t^2}= + \frac{\mathrm{d} \mathbf{v}_i}{\mathrm{d} t} + =\mathbf{F}_{i}=\sum_{i\neq j}(\mathbf{F}_{ij}^{C}+\mathbf{F}_{ij}^{D}+\mathbf{F}_{ij}^{R}), +$$ + +$$ + C_v\frac{\mathrm{d} T_i}{\mathrm{d} t}= q_{i} = \sum_{i\neq j}(q_{ij}^{C}+q_{ij}^{V}+q_{ij}^{R}), +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_edpd_heat.jpg b/doc/src/Eqs/pair_edpd_heat.jpg new file mode 100644 index 0000000000..b9256a1d13 Binary files /dev/null and b/doc/src/Eqs/pair_edpd_heat.jpg differ diff --git a/doc/src/Eqs/pair_edpd_heat.tex b/doc/src/Eqs/pair_edpd_heat.tex new file mode 100644 index 0000000000..241a1bad64 --- /dev/null +++ b/doc/src/Eqs/pair_edpd_heat.tex @@ -0,0 +1,29 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + q_i^C = \sum_{j \ne i} k_{ij} \omega_{CT}(r_{ij}) \left( \frac{1}{T_i} - \frac{1}{T_j} \right), +$$ + +$$ + q_i^V = \frac{1}{2 C_v}\sum_{j \ne i}{ \left\{ \omega_D(r_{ij})\left[\gamma_{ij} \left( \mathbf{e}_{ij} \cdot \mathbf{v}_{ij} \right)^2 - \frac{\left( \sigma _{ij} \right)^2}{m}\right] - \sigma _{ij} \omega_R(r_{ij})\left( \mathbf{e}_{ij} \cdot \mathbf{v}_{ij} \right){\xi_{ij}} \right\} }, +$$ + +$$ + q_i^R = \sum_{j \ne i} \beta _{ij} \omega_{RT}(r_{ij}) d {t^{ - 1/2}} \xi_{ij}^e, +$$ + +$$ + \omega_{CT}(r)=\omega_{RT}^2(r)=\left(1-r/r_{ct}\right)^{s_T}, +$$ + +$$ + k_{ij}=C_v^2\kappa(T_i + T_j)^2/4k_B, +$$ + +$$ + \beta_{ij}^2=2k_Bk_{ij}, +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_edpd_kappa.jpg b/doc/src/Eqs/pair_edpd_kappa.jpg new file mode 100644 index 0000000000..158974d374 Binary files /dev/null and b/doc/src/Eqs/pair_edpd_kappa.jpg differ diff --git a/doc/src/Eqs/pair_edpd_kappa.tex b/doc/src/Eqs/pair_edpd_kappa.tex new file mode 100644 index 0000000000..ac5ca9f740 --- /dev/null +++ b/doc/src/Eqs/pair_edpd_kappa.tex @@ -0,0 +1,9 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + \kappa = \frac{315k_B\upsilon }{2\pi \rho C_v r_{ct}^5}\frac{1}{Pr}, +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_mdpd_force.jpg b/doc/src/Eqs/pair_mdpd_force.jpg new file mode 100644 index 0000000000..9b0e573b79 Binary files /dev/null and b/doc/src/Eqs/pair_mdpd_force.jpg differ diff --git a/doc/src/Eqs/pair_mdpd_force.tex b/doc/src/Eqs/pair_mdpd_force.tex new file mode 100644 index 0000000000..b5c8d9be4a --- /dev/null +++ b/doc/src/Eqs/pair_mdpd_force.tex @@ -0,0 +1,17 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + \mathbf{F}_{ij}^C = Aw_c(r_{ij})\mathbf{e}_{ij} + B(\rho_i+\rho_j)w_d(r_{ij})\mathbf{e}_{ij}, +$$ + +$$ + \mathbf{F}_{ij}^{D} = -\gamma {\omega_{D}}(r_{ij})(\mathbf{e}_{ij} \cdot \mathbf{v}_{ij})\mathbf{e}_{ij}, +$$ + +$$ + \mathbf{F}_{ij}^{R} = \sigma {\omega_{R}}(r_{ij}){\xi_{ij}}\Delta t^{-1/2} \mathbf{e}_{ij}, +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_tdpd_flux.jpg b/doc/src/Eqs/pair_tdpd_flux.jpg new file mode 100644 index 0000000000..9da788ae9b Binary files /dev/null and b/doc/src/Eqs/pair_tdpd_flux.jpg differ diff --git a/doc/src/Eqs/pair_tdpd_flux.tex b/doc/src/Eqs/pair_tdpd_flux.tex new file mode 100644 index 0000000000..f753f16acf --- /dev/null +++ b/doc/src/Eqs/pair_tdpd_flux.tex @@ -0,0 +1,21 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + Q_{ij}^D = -\kappa_{ij} w_{DC}(r_{ij}) \left( C_i - C_j \right), +$$ + +$$ + Q_{ij}^R = \epsilon_{ij}\left( C_i + C_j \right) w_{RC}(r_{ij}) \xi_{ij}, +$$ + +$$ + w_{DC}(r_{ij})=w^2_{RC}(r_{ij}) = (1 - r/r_{cc})^{\rm power\_{cc}}, +$$ + +$$ + \epsilon_{ij}^2 = m_s^2\kappa_{ij}\rho, +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_tdpd_force.jpg b/doc/src/Eqs/pair_tdpd_force.jpg new file mode 100644 index 0000000000..f6feb35397 Binary files /dev/null and b/doc/src/Eqs/pair_tdpd_force.jpg differ diff --git a/doc/src/Eqs/pair_tdpd_force.tex b/doc/src/Eqs/pair_tdpd_force.tex new file mode 100644 index 0000000000..49edff9700 --- /dev/null +++ b/doc/src/Eqs/pair_tdpd_force.tex @@ -0,0 +1,29 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + \mathbf{F}_{ij}^{C} = A{\omega_{C}}(r_{ij})\mathbf{e}_{ij}, +$$ + +$$ + \mathbf{F}_{ij}^{D} = -\gamma {\omega_{D}}(r_{ij})(\mathbf{e}_{ij} \cdot \mathbf{v}_{ij})\mathbf{e}_{ij}, +$$ + +$$ + \mathbf{F}_{ij}^{R} = \sigma {\omega_{R}}(r_{ij}){\xi_{ij}}\Delta t^{-1/2} \mathbf{e}_{ij}, +$$ + +$$ + \omega_{C}(r) = 1 - r/r_c, +$$ + +$$ + \omega_{D}(r) = \omega^2_{R}(r) = (1-r/r_c)^{\rm power\_f}, +$$ + +$$ + \sigma^2 = 2\gamma k_B T, +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_tdpd_gov.jpg b/doc/src/Eqs/pair_tdpd_gov.jpg new file mode 100644 index 0000000000..0ed793a132 Binary files /dev/null and b/doc/src/Eqs/pair_tdpd_gov.jpg differ diff --git a/doc/src/Eqs/pair_tdpd_gov.tex b/doc/src/Eqs/pair_tdpd_gov.tex new file mode 100644 index 0000000000..e4b5f5790a --- /dev/null +++ b/doc/src/Eqs/pair_tdpd_gov.tex @@ -0,0 +1,13 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + \frac{\mathrm{d}^2 \mathbf{r}_i}{\mathrm{d} t^2} = \frac{\mathrm{d} \mathbf{v}_i}{\mathrm{d} t}=\mathbf{F}_{i}=\sum_{i\neq j}(\mathbf{F}_{ij}^{C}+\mathbf{F}_{ij}^{D}+\mathbf{F}_{ij}^{R}), +$$ + +$$ + \frac{\mathrm{d} C_{i}}{\mathrm{d} t}= Q_{i} = \sum_{i\neq j}(Q_{ij}^{D}+Q_{ij}^{R}) + Q_{i}^{S}, +$$ + +\end{document} diff --git a/doc/src/Eqs/pair_ufm.jpg b/doc/src/Eqs/pair_ufm.jpg new file mode 100644 index 0000000000..40273da680 Binary files /dev/null and b/doc/src/Eqs/pair_ufm.jpg differ diff --git a/doc/src/Eqs/pair_ufm.tex b/doc/src/Eqs/pair_ufm.tex new file mode 100644 index 0000000000..8a6dde5520 --- /dev/null +++ b/doc/src/Eqs/pair_ufm.tex @@ -0,0 +1,14 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + E = -\varepsilon\, \ln{\left[1-\exp{\left(-r^{2}/\sigma^{2}\right)}\right]} \qquad r < r_c +$$ + +$$ + \varepsilon = p\,k_B\,T +$$ + +\end{document} + diff --git a/doc/src/JPG/bow_tutorial_01.png b/doc/src/JPG/bow_tutorial_01.png new file mode 100755 index 0000000000..2060927250 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_01.png differ diff --git a/doc/src/JPG/bow_tutorial_01_small.png b/doc/src/JPG/bow_tutorial_01_small.png new file mode 100755 index 0000000000..a31ad22501 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_01_small.png differ diff --git a/doc/src/JPG/bow_tutorial_02.png b/doc/src/JPG/bow_tutorial_02.png new file mode 100755 index 0000000000..166a0d1a3c Binary files /dev/null and b/doc/src/JPG/bow_tutorial_02.png differ diff --git a/doc/src/JPG/bow_tutorial_02_small.png b/doc/src/JPG/bow_tutorial_02_small.png new file mode 100755 index 0000000000..a8fa24957a Binary files /dev/null and b/doc/src/JPG/bow_tutorial_02_small.png differ diff --git a/doc/src/JPG/bow_tutorial_03.png b/doc/src/JPG/bow_tutorial_03.png new file mode 100755 index 0000000000..4058a4577c Binary files /dev/null and b/doc/src/JPG/bow_tutorial_03.png differ diff --git a/doc/src/JPG/bow_tutorial_03_small.png b/doc/src/JPG/bow_tutorial_03_small.png new file mode 100755 index 0000000000..e440c89483 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_03_small.png differ diff --git a/doc/src/JPG/bow_tutorial_04.png b/doc/src/JPG/bow_tutorial_04.png new file mode 100755 index 0000000000..d0c454ef06 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_04.png differ diff --git a/doc/src/JPG/bow_tutorial_04_small.png b/doc/src/JPG/bow_tutorial_04_small.png new file mode 100755 index 0000000000..fae576a7bb Binary files /dev/null and b/doc/src/JPG/bow_tutorial_04_small.png differ diff --git a/doc/src/JPG/bow_tutorial_05.png b/doc/src/JPG/bow_tutorial_05.png new file mode 100755 index 0000000000..8d1dcc581d Binary files /dev/null and b/doc/src/JPG/bow_tutorial_05.png differ diff --git a/doc/src/JPG/bow_tutorial_06.png b/doc/src/JPG/bow_tutorial_06.png new file mode 100755 index 0000000000..00c3947b1d Binary files /dev/null and b/doc/src/JPG/bow_tutorial_06.png differ diff --git a/doc/src/JPG/bow_tutorial_07.png b/doc/src/JPG/bow_tutorial_07.png new file mode 100755 index 0000000000..aad4e5eaae Binary files /dev/null and b/doc/src/JPG/bow_tutorial_07.png differ diff --git a/doc/src/JPG/bow_tutorial_08.png b/doc/src/JPG/bow_tutorial_08.png new file mode 100755 index 0000000000..beb1bcff28 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_08.png differ diff --git a/doc/src/JPG/bow_tutorial_09.png b/doc/src/JPG/bow_tutorial_09.png new file mode 100755 index 0000000000..187f4bbdb2 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_09.png differ diff --git a/doc/src/JPG/bow_tutorial_10.png b/doc/src/JPG/bow_tutorial_10.png new file mode 100755 index 0000000000..4603a46637 Binary files /dev/null and b/doc/src/JPG/bow_tutorial_10.png differ diff --git a/doc/src/JPG/examples_edpd.jpg b/doc/src/JPG/examples_edpd.jpg new file mode 100644 index 0000000000..4d0cde6370 Binary files /dev/null and b/doc/src/JPG/examples_edpd.jpg differ diff --git a/doc/src/JPG/examples_mdpd.gif b/doc/src/JPG/examples_mdpd.gif new file mode 100644 index 0000000000..29ace1a0b2 Binary files /dev/null and b/doc/src/JPG/examples_mdpd.gif differ diff --git a/doc/src/JPG/examples_mdpd_first.jpg b/doc/src/JPG/examples_mdpd_first.jpg new file mode 100644 index 0000000000..958912e662 Binary files /dev/null and b/doc/src/JPG/examples_mdpd_first.jpg differ diff --git a/doc/src/JPG/examples_mdpd_last.jpg b/doc/src/JPG/examples_mdpd_last.jpg new file mode 100644 index 0000000000..1bf8b9ac82 Binary files /dev/null and b/doc/src/JPG/examples_mdpd_last.jpg differ diff --git a/doc/src/JPG/examples_tdpd.jpg b/doc/src/JPG/examples_tdpd.jpg new file mode 100644 index 0000000000..c00e83e003 Binary files /dev/null and b/doc/src/JPG/examples_tdpd.jpg differ diff --git a/doc/src/JPG/uef_frames.jpg b/doc/src/JPG/uef_frames.jpg new file mode 100644 index 0000000000..3b3bfc3a24 Binary files /dev/null and b/doc/src/JPG/uef_frames.jpg differ diff --git a/doc/src/JPG/user_intel.png b/doc/src/JPG/user_intel.png index 302b50124a..5061f1af2e 100755 Binary files a/doc/src/JPG/user_intel.png and b/doc/src/JPG/user_intel.png differ diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 07f0c8df41..2f957eb113 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,9 +1,9 @@ LAMMPS Users Manual - + - + @@ -21,7 +21,7 @@

LAMMPS Documentation :c,h3 -24 Jul 2017 version :c,h4 +8 Mar 2018 version :c,h4 Version info: :h4 @@ -79,7 +79,7 @@ bug reports and feature requests are mainly coordinated through the "LAMMPS project on GitHub."_https://github.com/lammps/lammps The lammps.org domain, currently hosting "public continuous integration testing"_https://ci.lammps.org/job/lammps/ and "precompiled Linux -RPM and Windows installer packages"_http://rpm.lammps.org is located +RPM and Windows installer packages"_http://packages.lammps.org is located at Temple University and managed by Richard Berger, richard.berger at temple.edu. @@ -176,11 +176,11 @@ END_RST --> 5.1 "Measuring performance"_acc_1 :ulb,b 5.2 "Algorithms and code options to boost performace"_acc_2 :b 5.3 "Accelerator packages with optimized styles"_acc_3 :b - 5.3.1 "GPU package"_accelerate_gpu.html :ulb,b + 5.3.1 "GPU package"_accelerate_gpu.html :b 5.3.2 "USER-INTEL package"_accelerate_intel.html :b 5.3.3 "KOKKOS package"_accelerate_kokkos.html :b 5.3.4 "USER-OMP package"_accelerate_omp.html :b - 5.3.5 "OPT package"_accelerate_opt.html :ule,b + 5.3.5 "OPT package"_accelerate_opt.html :b 5.4 "Comparison of various accelerator packages"_acc_4 :ule,b "How-to discussions"_Section_howto.html :l 6.1 "Restarting a simulation"_howto_1 :ulb,b diff --git a/doc/src/PDF/USER-CGDNA-overview.pdf b/doc/src/PDF/USER-CGDNA-overview.pdf index cada7eaebf..e329877bc2 100644 Binary files a/doc/src/PDF/USER-CGDNA-overview.pdf and b/doc/src/PDF/USER-CGDNA-overview.pdf differ diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index a14d93cd69..2d28758819 100644 Binary files a/doc/src/PDF/colvars-refman-lammps.pdf and b/doc/src/PDF/colvars-refman-lammps.pdf differ diff --git a/doc/src/Section_accelerate.txt b/doc/src/Section_accelerate.txt index 8812358886..bb0c93b8aa 100644 --- a/doc/src/Section_accelerate.txt +++ b/doc/src/Section_accelerate.txt @@ -233,8 +233,8 @@ set any needed options for the package via "-pk" "command-line switch"_Section_s use accelerated styles in your input via "-sf" "command-line switch"_Section_start.html#start_6 or "suffix"_suffix.html command | lmp_machine -in in.script -sf gpu :tb(c=2,s=|) -Note that the first 4 steps can be done as a single command, using the -src/Make.py tool. This tool is discussed in "Section +Note that the first 4 steps can be done as a single command with +suitable make command invocations. This is discussed in "Section 4"_Section_packages.html of the manual, and its use is illustrated in the individual accelerator sections. Typically these steps only need to be done once, to create an executable that uses one diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index f1eb225fe5..faf254f93d 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -532,7 +532,8 @@ package"_Section_start.html#start_3. "dump vtk"_dump_vtk.html, "group2ndx"_group2ndx.html, "ndx2group"_group2ndx.html, -"temper/grem"_temper_grem.html :tb(c=3,ea=c) +"temper/grem"_temper_grem.html, +"temper/npt"_temper_npt.html :tb(c=3,ea=c) :line @@ -579,6 +580,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "halt"_fix_halt.html, "heat"_fix_heat.html, "indent"_fix_indent.html, +"latte"_fix_latte.html, "langevin (k)"_fix_langevin.html, "lineforce"_fix_lineforce.html, "momentum (k)"_fix_momentum.html, @@ -617,8 +619,9 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "pour"_fix_pour.html, "press/berendsen"_fix_press_berendsen.html, "print"_fix_print.html, -"property/atom"_fix_property_atom.html, -"python"_fix_python.html, +"property/atom (k)"_fix_property_atom.html, +"python/invoke"_fix_python_invoke.html, +"python/move"_fix_python_move.html, "qeq/comb (o)"_fix_qeq_comb.html, "qeq/dynamic"_fix_qeq.html, "qeq/fire"_fix_qeq.html, @@ -635,10 +638,10 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "rigid/nve (o)"_fix_rigid.html, "rigid/nvt (o)"_fix_rigid.html, "rigid/small (o)"_fix_rigid.html, -"rigid/small/nph (o)"_fix_rigid.html, -"rigid/small/npt (o)"_fix_rigid.html, -"rigid/small/nve (o)"_fix_rigid.html, -"rigid/small/nvt (o)"_fix_rigid.html, +"rigid/small/nph"_fix_rigid.html, +"rigid/small/npt"_fix_rigid.html, +"rigid/small/nve"_fix_rigid.html, +"rigid/small/nvt"_fix_rigid.html, "setforce (k)"_fix_setforce.html, "shake"_fix_shake.html, "spring"_fix_spring.html, @@ -666,7 +669,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "wall/harmonic"_fix_wall.html, "wall/lj1043"_fix_wall.html, "wall/lj126"_fix_wall.html, -"wall/lj93"_fix_wall.html, +"wall/lj93 (k)"_fix_wall.html, "wall/piston"_fix_wall_piston.html, "wall/reflect (k)"_fix_wall_reflect.html, "wall/region"_fix_wall_region.html, @@ -681,13 +684,14 @@ package"_Section_start.html#start_3. "atc"_fix_atc.html, "ave/correlate/long"_fix_ave_correlate_long.html, "colvars"_fix_colvars.html, -"dpd/energy"_fix_dpd_energy.html, +"dpd/energy (k)"_fix_dpd_energy.html, "drude"_fix_drude.html, "drude/transform/direct"_fix_drude_transform.html, "drude/transform/reverse"_fix_drude_transform.html, +"edpd/source"_fix_dpd_source.html, "eos/cv"_fix_eos_cv.html, "eos/table"_fix_eos_table.html, -"eos/table/rx"_fix_eos_table_rx.html, +"eos/table/rx (k)"_fix_eos_table_rx.html, "filter/corotate"_fix_filter_corotate.html, "flow/gauss"_fix_flow_gauss.html, "gle"_fix_gle.html, @@ -704,6 +708,9 @@ package"_Section_start.html#start_3. "meso"_fix_meso.html, "manifoldforce"_fix_manifoldforce.html, "meso/stationary"_fix_meso_stationary.html, +"mvv/dpd"_fix_mvv_dpd.html, +"mvv/edpd"_fix_mvv_dpd.html, +"mvv/tdpd"_fix_mvv_dpd.html, "nve/dot"_fix_nve_dot.html, "nve/dotc/langevin"_fix_nve_dotc_langevin.html, "nve/manifold/rattle"_fix_nve_manifold_rattle.html, @@ -714,17 +721,20 @@ package"_Section_start.html#start_3. "nve/eff"_fix_nve_eff.html, "nvt/eff"_fix_nh_eff.html, "nvt/sllod/eff"_fix_nvt_sllod_eff.html, +"npt/uef"_fix_nh_uef.html, +"nvt/uef"_fix_nh_uef.html, "phonon"_fix_phonon.html, "pimd"_fix_pimd.html, "qbmsst"_fix_qbmsst.html, "qeq/reax (ko)"_fix_qeq_reax.html, "qmmm"_fix_qmmm.html, "qtb"_fix_qtb.html, -"reax/c/bonds"_fix_reax_bonds.html, -"reax/c/species"_fix_reaxc_species.html, -"rx"_fix_rx.html, +"reax/c/bonds (k)"_fix_reax_bonds.html, +"reax/c/species (k)"_fix_reaxc_species.html, +"rhok"_fix_rhok.html, +"rx (k)"_fix_rx.html, "saed/vtk"_fix_saed_vtk.html, -"shardlow"_fix_shardlow.html, +"shardlow (k)"_fix_shardlow.html, "smd"_fix_smd.html, "smd/adjust/dt"_fix_smd_adjust_dt.html, "smd/integrate/tlsph"_fix_smd_integrate_tlsph.html, @@ -732,6 +742,7 @@ package"_Section_start.html#start_3. "smd/move/triangulated/surface"_fix_smd_move_triangulated_surface.html, "smd/setvel"_fix_smd_setvel.html, "smd/wall/surface"_fix_smd_wall_surface.html, +"tdpd/source"_fix_dpd_source.html, "temp/rescale/eff"_fix_temp_rescale_eff.html, "ti/spring"_fix_ti_spring.html, "ttm/mod"_fix_ttm.html, @@ -750,6 +761,7 @@ package"_Section_accelerate.html. This is indicated by additional letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. +"aggregate/atom"_compute_cluster_atom.html, "angle"_compute_angle.html, "angle/local"_compute_angle_local.html, "angmom/chunk"_compute_angmom_chunk.html, @@ -775,6 +787,7 @@ KOKKOS, o = USER-OMP, t = OPT. "erotate/sphere"_compute_erotate_sphere.html, "erotate/sphere/atom"_compute_erotate_sphere_atom.html, "event/displace"_compute_event_displace.html, +"fragment/atom"_compute_cluster_atom.html, "global/atom"_compute_global_atom.html, "group/group"_compute_group_group.html, "gyration"_compute_gyration.html, @@ -836,6 +849,7 @@ package"_Section_start.html#start_3. "cnp/atom"_compute_cnp_atom.html, "dpd"_compute_dpd.html, "dpd/atom"_compute_dpd_atom.html, +"edpd/temp/atom"_compute_edpd_temp_atom.html, "fep"_compute_fep.html, "force/tally"_compute_tally.html, "heat/flux/tally"_compute_tally.html, @@ -846,6 +860,7 @@ package"_Section_start.html#start_3. "meso/t/atom"_compute_meso_t_atom.html, "pe/tally"_compute_tally.html, "pe/mol/tally"_compute_tally.html, +"pressure/uef"_compute_pressure_uef.html, "saed"_compute_saed.html, "smd/contact/radius"_compute_smd_contact_radius.html, "smd/damage"_compute_smd_damage.html, @@ -868,11 +883,13 @@ package"_Section_start.html#start_3. "smd/ulsph/stress"_compute_smd_ulsph_stress.html, "smd/vol"_compute_smd_vol.html, "stress/tally"_compute_tally.html, +"tdpd/cc/atom"_compute_tdpd_cc_atom.html, "temp/drude"_compute_temp_drude.html, "temp/eff"_compute_temp_eff.html, "temp/deform/eff"_compute_temp_deform_eff.html, "temp/region/eff"_compute_temp_region_eff.html, "temp/rotate"_compute_temp_rotate.html, +"temp/uef"_compute_temp_uef.html, "xrd"_compute_xrd.html :tb(c=6,ea=c) :line @@ -890,10 +907,10 @@ KOKKOS, o = USER-OMP, t = OPT. "none"_pair_none.html, "zero"_pair_zero.html, "hybrid"_pair_hybrid.html, -"hybrid/overlay"_pair_hybrid.html, +"hybrid/overlay (k)"_pair_hybrid.html, "adp (o)"_pair_adp.html, -"airebo (o)"_pair_airebo.html, -"airebo/morse (o)"_pair_airebo.html, +"airebo (oi)"_pair_airebo.html, +"airebo/morse (oi)"_pair_airebo.html, "beck (go)"_pair_beck.html, "body"_pair_body.html, "bop"_pair_bop.html, @@ -904,11 +921,12 @@ KOKKOS, o = USER-OMP, t = OPT. "born/coul/long/cs"_pair_born.html, "born/coul/msm (o)"_pair_born.html, "born/coul/wolf (go)"_pair_born.html, +"born/coul/wolf/cs"_pair_born.html, "brownian (o)"_pair_brownian.html, "brownian/poly (o)"_pair_brownian.html, -"buck (gkio)"_pair_buck.html, -"buck/coul/cut (gkio)"_pair_buck.html, -"buck/coul/long (gkio)"_pair_buck.html, +"buck (giko)"_pair_buck.html, +"buck/coul/cut (giko)"_pair_buck.html, +"buck/coul/long (giko)"_pair_buck.html, "buck/coul/long/cs"_pair_buck.html, "buck/coul/msm (o)"_pair_buck.html, "buck/long/coul/long (o)"_pair_buck_long.html, @@ -923,12 +941,13 @@ KOKKOS, o = USER-OMP, t = OPT. "coul/msm"_pair_coul.html, "coul/streitz"_pair_coul.html, "coul/wolf (ko)"_pair_coul.html, -"dpd (go)"_pair_dpd.html, +"coul/wolf/cs"_pair_coul.html, +"dpd (gio)"_pair_dpd.html, "dpd/tstat (go)"_pair_dpd.html, "dsmc"_pair_dsmc.html, -"eam (gkiot)"_pair_eam.html, -"eam/alloy (gkot)"_pair_eam.html, -"eam/fs (gkot)"_pair_eam.html, +"eam (gikot)"_pair_eam.html, +"eam/alloy (gikot)"_pair_eam.html, +"eam/fs (gikot)"_pair_eam.html, "eim (o)"_pair_eim.html, "gauss (go)"_pair_gauss.html, "gayberne (gio)"_pair_gayberne.html, @@ -942,7 +961,7 @@ KOKKOS, o = USER-OMP, t = OPT. "kim"_pair_kim.html, "lcbop"_pair_lcbop.html, "line/lj"_pair_line_lj.html, -"lj/charmm/coul/charmm (ko)"_pair_charmm.html, +"lj/charmm/coul/charmm (iko)"_pair_charmm.html, "lj/charmm/coul/charmm/implicit (ko)"_pair_charmm.html, "lj/charmm/coul/long (giko)"_pair_charmm.html, "lj/charmm/coul/msm"_pair_charmm.html, @@ -959,6 +978,7 @@ KOKKOS, o = USER-OMP, t = OPT. "lj/cut/coul/long (gikot)"_pair_lj.html, "lj/cut/coul/long/cs"_pair_lj.html, "lj/cut/coul/msm (go)"_pair_lj.html, +"lj/cut/coul/wolf (o)"_pair_lj.html, "lj/cut/dipole/cut (go)"_pair_dipole.html, "lj/cut/dipole/long"_pair_dipole.html, "lj/cut/tip4p/cut (o)"_pair_lj.html, @@ -990,24 +1010,25 @@ KOKKOS, o = USER-OMP, t = OPT. "polymorphic"_pair_polymorphic.html, "python"_pair_python.html, "reax"_pair_reax.html, -"rebo (o)"_pair_airebo.html, +"rebo (oi)"_pair_airebo.html, "resquared (go)"_pair_resquared.html, -"snap"_pair_snap.html, +"snap (k)"_pair_snap.html, "soft (go)"_pair_soft.html, -"sw (gkio)"_pair_sw.html, +"sw (giko)"_pair_sw.html, "table (gko)"_pair_table.html, -"tersoff (gkio)"_pair_tersoff.html, +"tersoff (giko)"_pair_tersoff.html, "tersoff/mod (gko)"_pair_tersoff_mod.html, "tersoff/mod/c (o)"_pair_tersoff_mod.html, "tersoff/zbl (gko)"_pair_tersoff_zbl.html, "tip4p/cut (o)"_pair_coul.html, "tip4p/long (o)"_pair_coul.html, "tri/lj"_pair_tri_lj.html, +"ufm (got)"_pair_ufm.html, "vashishta (ko)"_pair_vashishta.html, "vashishta/table (o)"_pair_vashishta.html, -"yukawa (go)"_pair_yukawa.html, +"yukawa (gok)"_pair_yukawa.html, "yukawa/colloid (go)"_pair_yukawa_colloid.html, -"zbl (go)"_pair_zbl.html :tb(c=4,ea=c) +"zbl (gok)"_pair_zbl.html :tb(c=4,ea=c) These are additional pair styles in USER packages, which can be used if "LAMMPS is built with the appropriate @@ -1020,12 +1041,14 @@ package"_Section_start.html#start_3. "coul/diel (o)"_pair_coul_diel.html, "coul/long/soft (o)"_pair_lj_soft.html, "dpd/fdt"_pair_dpd_fdt.html, -"dpd/fdt/energy"_pair_dpd_fdt.html, +"dpd/fdt/energy (k)"_pair_dpd_fdt.html, "eam/cd (o)"_pair_eam.html, "edip (o)"_pair_edip.html, "edip/multi"_pair_edip.html, +"edpd"_pair_meso.html, "eff/cut"_pair_eff.html, -"exp6/rx"_pair_exp6_rx.html, +"exp6/rx (k)"_pair_exp6_rx.html, +"extep"_pair_extep.html, "gauss/cut"_pair_gauss.html, "kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html, "lennard/mdf"_pair_mdf.html, @@ -1041,6 +1064,8 @@ package"_Section_start.html#start_3. "lj/sdk (gko)"_pair_sdk.html, "lj/sdk/coul/long (go)"_pair_sdk.html, "lj/sdk/coul/msm (o)"_pair_sdk.html, +"mdpd"_pair_meso.html, +"mdpd/rhosum"_pair_meso.html, "meam/c"_pair_meam.html, "meam/spline (o)"_pair_meam_spline.html, "meam/sw/spline"_pair_meam_sw_spline.html, @@ -1049,7 +1074,7 @@ package"_Section_start.html#start_3. "morse/smooth/linear"_pair_morse.html, "morse/soft"_pair_morse.html, "multi/lucy"_pair_multi_lucy.html, -"multi/lucy/rx"_pair_multi_lucy_rx.html, +"multi/lucy/rx (k)"_pair_multi_lucy_rx.html, "oxdna/coaxstk"_pair_oxdna.html, "oxdna/excv"_pair_oxdna.html, "oxdna/hbond"_pair_oxdna.html, @@ -1066,6 +1091,7 @@ package"_Section_start.html#start_3. "smd/triangulated/surface"_pair_smd_triangulated_surface.html, "smd/ulsph"_pair_smd_ulsph.html, "smtbq"_pair_smtbq.html, +"snap (k)"_pair_snap.html, "sph/heatconduction"_pair_sph_heatconduction.html, "sph/idealgas"_pair_sph_idealgas.html, "sph/lj"_pair_sph_lj.html, @@ -1073,7 +1099,8 @@ package"_Section_start.html#start_3. "sph/taitwater"_pair_sph_taitwater.html, "sph/taitwater/morris"_pair_sph_taitwater_morris.html, "srp"_pair_srp.html, -"table/rx"_pair_table_rx.html, +"table/rx (k)"_pair_table_rx.html, +"tdpd"_pair_meso.html, "tersoff/table (o)"_pair_tersoff.html, "thole"_pair_thole.html, "tip4p/long/soft (o)"_pair_lj_soft.html :tb(c=4,ea=c) @@ -1096,6 +1123,7 @@ KOKKOS, o = USER-OMP, t = OPT. "class2 (ko)"_bond_class2.html, "fene (iko)"_bond_fene.html, "fene/expand (o)"_bond_fene_expand.html, +"gromos (o)"_bond_gromos.html, "harmonic (ko)"_bond_harmonic.html, "morse (o)"_bond_morse.html, "nonlinear (o)"_bond_nonlinear.html, @@ -1162,7 +1190,7 @@ USER-OMP, t = OPT. "none"_dihedral_none.html, "zero"_dihedral_zero.html, "hybrid"_dihedral_hybrid.html, -"charmm (ko)"_dihedral_charmm.html, +"charmm (iko)"_dihedral_charmm.html, "charmmfsw"_dihedral_charmm.html, "class2 (ko)"_dihedral_class2.html, "harmonic (io)"_dihedral_harmonic.html, @@ -1175,7 +1203,7 @@ used if "LAMMPS is built with the appropriate package"_Section_start.html#start_3. "cosine/shift/exp (o)"_dihedral_cosine_shift_exp.html, -"fourier (o)"_dihedral_fourier.html, +"fourier (io)"_dihedral_fourier.html, "nharmonic (o)"_dihedral_nharmonic.html, "quadratic (o)"_dihedral_quadratic.html, "spherical (o)"_dihedral_spherical.html, @@ -1198,7 +1226,7 @@ USER-OMP, t = OPT. "hybrid"_improper_hybrid.html, "class2 (ko)"_improper_class2.html, "cvff (io)"_improper_cvff.html, -"harmonic (ko)"_improper_harmonic.html, +"harmonic (iko)"_improper_harmonic.html, "umbrella (o)"_improper_umbrella.html :tb(c=4,ea=c) These are additional improper styles in USER packages, which can be @@ -1226,7 +1254,7 @@ USER-OMP, t = OPT. "ewald/disp"_kspace_style.html, "msm (o)"_kspace_style.html, "msm/cg (o)"_kspace_style.html, -"pppm (go)"_kspace_style.html, +"pppm (gok)"_kspace_style.html, "pppm/cg (o)"_kspace_style.html, "pppm/disp (i)"_kspace_style.html, "pppm/disp/tip4p"_kspace_style.html, diff --git a/doc/src/Section_errors.txt b/doc/src/Section_errors.txt index 408c01d52c..f5829f92fb 100644 --- a/doc/src/Section_errors.txt +++ b/doc/src/Section_errors.txt @@ -7886,8 +7886,8 @@ keyword to allow for additional bonds to be formed :dd {New bond exceeded special list size in fix bond/create} :dt -See the "special_bonds extra" command -(or the "read_data extra/special/per/atom" command) +See the "read_data extra/special/per/atom" command +(or the "create_box extra/special/per/atom" command) for info on how to leave space in the special bonds list to allow for additional bonds to be formed. :dd @@ -9666,8 +9666,8 @@ you are running. :dd {Special list size exceeded in fix bond/create} :dt -See the special_bonds extra command -(or the read_data extra/special/per/atom command) +See the "read_data extra/special/per/atom" command +(or the "create_box extra/special/per/atom" command) for info on how to leave space in the special bonds list to allow for additional bonds to be formed. :dd diff --git a/doc/src/Section_example.txt b/doc/src/Section_example.txt index 26dc3b9698..f8b39be173 100644 --- a/doc/src/Section_example.txt +++ b/doc/src/Section_example.txt @@ -49,6 +49,7 @@ Lists of both kinds of directories are given below. Lowercase directories :h4 accelerate: run with various acceleration options (OpenMP, GPU, Phi) +airebo: polyethylene with AIREBO potential balance: dynamic load balancing, 2d system body: body particles, 2d system cmap: CMAP 5-body contributions to CHARMM force field diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 6d699fe24b..f4396cce7d 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -454,7 +454,7 @@ NOTE: By default, for 2d systems, granular particles are still modeled as 3d spheres, not 2d discs (circles), meaning their moment of inertia will be the same as in 3d. If you wish to model granular particles in 2d as 2d discs, see the note on this topic in "Section -6.2"_Section_howto.html#howto_2, where 2d simulations are disussed. +6.2"_Section_howto.html#howto_2, where 2d simulations are discussed. :line @@ -2859,8 +2859,8 @@ The nature of the atoms (core, Drude particle or non-polarizable) is specified via the "fix drude"_fix_drude.html command. The special list of neighbors is automatically refactored to account for the equivalence of core and Drude particles as regards special 1-2 to 1-4 -screening. It may be necessary to use the {extra} keyword of the -"special_bonds"_special_bonds.html command. If using "fix +screening. It may be necessary to use the {extra/special/per/atom} +keyword of the "read_data"_read_data.html command. If using "fix shake"_fix_shake.html, make sure no Drude particle is in this fix group. diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index bfb6ef3901..604df6c1ae 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -507,11 +507,15 @@ we'll be pleased to add them to the "Movies"_http://lammps.sandia.gov/movies.html pages of the LAMMPS WWW site. -The core group of LAMMPS developers is at Sandia National Labs: +The primary LAMMPS developers are at Sandia National Labs and Temple University: Steve Plimpton, sjplimp at sandia.gov Aidan Thompson, athomps at sandia.gov -Paul Crozier, pscrozi at sandia.gov :ul +Stan Moore, stamoor at sandia.gov +Axel Kohlmeyer, akohlmey at gmail.com :ul + +Past primary developers include Paul Crozier and Mark Stevens, +both at Sandia, and Ray Shan, now at Materials Design. The following folks are responsible for significant contributions to the code, or other aspects of the LAMMPS development effort. Many of @@ -519,19 +523,20 @@ the packages they have written are somewhat unique to LAMMPS and the code would not be as general-purpose as it is without their expertise and efforts. -Axel Kohlmeyer (Temple U), akohlmey at gmail.com, SVN and Git repositories, indefatigable mail list responder, USER-CGSDK and USER-OMP packages +Axel Kohlmeyer (Temple U), akohlmey at gmail.com, SVN and Git repositories, indefatigable mail list responder, USER-CGSDK, USER-OMP, USER-COLVARS, USER-MOLFILE, USER-QMMM, USER-TALLY, and COMPRESS packages Roy Pollock (LLNL), Ewald and PPPM solvers -Mike Brown (ORNL), brownw at ornl.gov, GPU package +Mike Brown (ORNL), brownw at ornl.gov, GPU and USER-INTEL package Greg Wagner (Sandia), gjwagne at sandia.gov, MEAM package for MEAM potential Mike Parks (Sandia), mlparks at sandia.gov, PERI package for Peridynamics Rudra Mukherjee (JPL), Rudranarayan.M.Mukherjee at jpl.nasa.gov, POEMS package for articulated rigid body motion Reese Jones (Sandia) and collaborators, rjones at sandia.gov, USER-ATC package for atom/continuum coupling Ilya Valuev (JIHT), valuev at physik.hu-berlin.de, USER-AWPMD package for wave-packet MD -Christian Trott (U Tech Ilmenau), christian.trott at tu-ilmenau.de, USER-CUDA package +Christian Trott (U Tech Ilmenau), christian.trott at tu-ilmenau.de, USER-CUDA and KOKKOS packages Andres Jaramillo-Botero (Caltech), ajaramil at wag.caltech.edu, USER-EFF package for electron force field Christoph Kloss (JKU), Christoph.Kloss at jku.at, USER-LIGGGHTS package for granular models and granular/fluid coupling Metin Aktulga (LBL), hmaktulga at lbl.gov, USER-REAXC package for C version of ReaxFF -Georg Gunzenmuller (EMI), georg.ganzenmueller at emi.fhg.de, USER-SPH package :ul +Georg Gunzenmuller (EMI), georg.ganzenmueller at emi.fhg.de, USER-SMD and USER-SPH packages +Colin Denniston (U Western Ontario), cdennist at uwo.ca, USER-LB package :ul As discussed in "Section 13"_Section_history.html, LAMMPS originated as a cooperative project between DOE labs and industrial diff --git a/doc/src/Section_packages.txt b/doc/src/Section_packages.txt index 6afcb2758d..efbe5a4305 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -25,6 +25,17 @@ There are two kinds of packages in LAMMPS, standard and user packages: "Table of standard packages"_#table_standard "Table of user packages"_#table_user :ul +Either of these kinds of packages may work as is, may require some +additional code compiled located in the lib folder, or may require +an external library to be downloaded, compiled, installed, and LAMMPS +configured to know about its location and additional compiler flags. +You can often do the build of the internal or external libraries +in one step by typing "make lib-name args='...'" from the src dir, +with appropriate arguments included in args='...'. If you just type +"make lib-name" you should see a help message about supported flags +and some examples. For more details about this, please study the +tables below and the sections about the individual packages. + Standard packages are supported by the LAMMPS developers and are written in a syntax and style consistent with the rest of LAMMPS. This means the developers will answer questions about them, debug and @@ -34,7 +45,9 @@ LAMMPS. User packages have been contributed by users, and begin with the "user" prefix. If they are a single command (single file), they are typically in the user-misc package. User packages don't necessarily -meet the requirements of the standard packages. If you have problems +meet the requirements of the standard packages. This means the +developers will try to keep things working and usually can answer +technical questions about compiling the package. If you have problems using a feature provided in a user package, you may need to contact the contributor directly to get help. Information on how to submit additions you make to LAMMPS as single files or as a standard or user @@ -78,11 +91,12 @@ Package, Description, Doc page, Example, Library "COMPRESS"_#COMPRESS, I/O compression, "dump */gz"_dump.html, -, sys "CORESHELL"_#CORESHELL, adiabatic core/shell model, "Section 6.6.25"_Section_howto.html#howto_25, coreshell, - "DIPOLE"_#DIPOLE, point dipole particles, "pair_style dipole/cut"_pair_dipole.html, dipole, - -"GPU"_#GPU, GPU-enabled styles, "Section 5.3.1"_accelerate_gpu.html, WWW bench, int +"GPU"_#GPU, GPU-enabled styles, "Section 5.3.1"_accelerate_gpu.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, int "GRANULAR"_#GRANULAR, granular systems, "Section 6.6.6"_Section_howto.html#howto_6, pour, - -"KIM"_#KIM, openKIM wrapper, "pair_style kim"_pair_kim.html, kim, ext -"KOKKOS"_#KOKKOS, Kokkos-enabled styles, "Section 5.3.3"_accelerate_kokkos.html, WWW bench, - +"KIM"_#KIM, OpenKIM wrapper, "pair_style kim"_pair_kim.html, kim, ext +"KOKKOS"_#KOKKOS, Kokkos-enabled styles, "Section 5.3.3"_accelerate_kokkos.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - "KSPACE"_#KSPACE, long-range Coulombic solvers, "kspace_style"_kspace_style.html, peptide, - +"LATTE"_#LATTE, quantum DFTB forces via LATTE, "fix latte"_fix_latte.html, latte, ext "MANYBODY"_#MANYBODY, many-body potentials, "pair_style tersoff"_pair_tersoff.html, shear, - "MC"_#MC, Monte Carlo options, "fix gcmc"_fix_gcmc.html, -, - "MEAM"_#MEAM, modified EAM potential, "pair_style meam"_pair_meam.html, meam, int @@ -90,7 +104,7 @@ Package, Description, Doc page, Example, Library "MOLECULE"_#MOLECULE, molecular system force fields, "Section 6.6.3"_Section_howto.html#howto_3, peptide, - "MPIIO"_#MPIIO, MPI parallel I/O dump and restart, "dump"_dump.html, -, - "MSCG"_#MSCG, multi-scale coarse-graining wrapper, "fix mscg"_fix_mscg.html, mscg, ext -"OPT"_#OPT, optimized pair styles, "Section 5.3.5"_accelerate_opt.html, WWW bench, - +"OPT"_#OPT, optimized pair styles, "Section 5.3.5"_accelerate_opt.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - "PERI"_#PERI, Peridynamics models, "pair_style peri"_pair_peri.html, peri, - "POEMS"_#POEMS, coupled rigid body motion, "fix poems"_fix_poems.html, rigid, int "PYTHON"_#PYTHON, embed Python code in an input script, "python"_python.html, python, sys @@ -99,10 +113,9 @@ Package, Description, Doc page, Example, Library "REPLICA"_#REPLICA, multi-replica methods, "Section 6.6.5"_Section_howto.html#howto_5, tad, - "RIGID"_#RIGID, rigid bodies and constraints, "fix rigid"_fix_rigid.html, rigid, - "SHOCK"_#SHOCK, shock loading methods, "fix msst"_fix_msst.html, -, - -"SNAP"_#SNAP, quantum-fitted potential, "pair snap"_pair_snap.html, snap, - +"SNAP"_#SNAP, quantum-fitted potential, "pair_style snap"_pair_snap.html, snap, - "SRD"_#SRD, stochastic rotation dynamics, "fix srd"_fix_srd.html, srd, - -"VORONOI"_#VORONOI, Voronoi tesselation, "compute voronoi/atom"_compute_voronoi_atom.html, -, ext -:tb(ea=c,ca1=l) +"VORONOI"_#VORONOI, Voronoi tesselation, "compute voronoi/atom"_compute_voronoi_atom.html, -, ext :tb(ea=c,ca1=l) [USER packages] :link(table_user),p @@ -118,15 +131,17 @@ Package, Description, Doc page, Example, Library "USER-EFF"_#USER-EFF, electron force field,"pair_style eff/cut"_pair_eff.html, USER/eff, - "USER-FEP"_#USER-FEP, free energy perturbation,"compute fep"_compute_fep.html, USER/fep, - "USER-H5MD"_#USER-H5MD, dump output via HDF5,"dump h5md"_dump_h5md.html, -, ext -"USER-INTEL"_#USER-INTEL, optimized Intel CPU and KNL styles,"Section 5.3.2"_accelerate_intel.html, WWW bench, - +"USER-INTEL"_#USER-INTEL, optimized Intel CPU and KNL styles,"Section 5.3.2"_accelerate_intel.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - "USER-LB"_#USER-LB, Lattice Boltzmann fluid,"fix lb/fluid"_fix_lb_fluid.html, USER/lb, - "USER-MANIFOLD"_#USER-MANIFOLD, motion on 2d surfaces,"fix manifoldforce"_fix_manifoldforce.html, USER/manifold, - "USER-MEAMC"_#USER-MEAMC, modified EAM potential (C++), "pair_style meam/c"_pair_meam.html, meam, - +"USER-MESO"_#USER-MESO, mesoscale DPD models, "pair_style edpd"_pair_meso.html, USER/meso, - "USER-MGPT"_#USER-MGPT, fast MGPT multi-ion potentials, "pair_style mgpt"_pair_mgpt.html, USER/mgpt, - "USER-MISC"_#USER-MISC, single-file contributions, USER-MISC/README, USER/misc, - +"USER-MOFFF"_#USER-MOFFF, styles for "MOF-FF"_MOFplus force field, "pair_style buck6d/coul/gauss"_pair_buck6d_coul_gauss.html, USER/mofff, - "USER-MOLFILE"_#USER-MOLFILE, "VMD"_vmd_home molfile plug-ins,"dump molfile"_dump_molfile.html, -, ext "USER-NETCDF"_#USER-NETCDF, dump output via NetCDF,"dump netcdf"_dump_netcdf.html, -, ext -"USER-OMP"_#USER-OMP, OpenMP-enabled styles,"Section 5.3.4"_accelerate_omp.html, WWW bench, - +"USER-OMP"_#USER-OMP, OpenMP-enabled styles,"Section 5.3.4"_accelerate_omp.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - "USER-PHONON"_#USER-PHONON, phonon dynamical matrix,"fix phonon"_fix_phonon.html, USER/phonon, - "USER-QMMM"_#USER-QMMM, QM/MM coupling,"fix qmmm"_fix_qmmm.html, USER/qmmm, ext "USER-QTB"_#USER-QTB, quantum nuclear effects,"fix qtb"_fix_qtb.html "fix qbmsst"_fix_qbmsst.html, qtb, - @@ -136,8 +151,8 @@ Package, Description, Doc page, Example, Library "USER-SMTBQ"_#USER-SMTBQ, second moment tight binding QEq potential,"pair_style smtbq"_pair_smtbq.html, USER/smtbq, - "USER-SPH"_#USER-SPH, smoothed particle hydrodynamics,"SPH User Guide"_PDF/SPH_LAMMPS_userguide.pdf, USER/sph, - "USER-TALLY"_#USER-TALLY, pairwise tally computes,"compute XXX/tally"_compute_tally.html, USER/tally, - -"USER-VTK"_#USER-VTK, dump output via VTK, "compute vtk"_dump_vtk.html, -, ext -:tb(ea=c,ca1=l) +"USER-UEF"_#USER-UEF, extensional flow,"fix nvt/uef"_fix_nh_uef.html, USER/uef, - +"USER-VTK"_#USER-VTK, dump output via VTK, "compute vtk"_dump_vtk.html, -, ext :tb(ea=c,ca1=l) :line :line @@ -229,7 +244,7 @@ COLLOID package :link(COLLOID),h4 [Contents:] -Coarse-grained finite-size colloidal particles. Pair stayle and fix +Coarse-grained finite-size colloidal particles. Pair styles and fix wall styles for colloidal interactions. Includes the Fast Lubrication Dynamics (FLD) method for hydrodynamic interactions, which is a simplified approximation to Stokesian dynamics. @@ -364,9 +379,12 @@ GPU package :link(GPU),h4 [Contents:] Dozens of pair styles and a version of the PPPM long-range Coulombic -solver optimized for NVIDIA GPUs. All such styles have a "gpu" as a -suffix in their style name. "Section 5.3.1"_accelerate_gpu.html gives -details of what hardware and Cuda software is required on your system, +solver optimized for GPUs. All such styles have a "gpu" as a +suffix in their style name. The GPU code can be compiled with either +CUDA or OpenCL, however the OpenCL variants are no longer actively +maintained and only the CUDA versions are regularly tested. +"Section 5.3.1"_accelerate_gpu.html gives details of what +hardware and GPU software is required on your system, and details on how to build and use this package. Its styles can be invoked at run time via the "-sf gpu" or "-suffix gpu" "command-line switches"_Section_start.html#start_6. See also the "KOKKOS"_#KOKKOS @@ -378,32 +396,41 @@ package, which has GPU-enabled styles. [Install or un-install:] Before building LAMMPS with this package, you must first build the GPU -library in lib/gpu from a set of provided C and Cuda files. You can +library in lib/gpu from a set of provided C and CUDA files. You can do this manually if you prefer; follow the instructions in -lib/gpu/README. You can also do it in one step from the lammps/src +lib/gpu/README. Please note, that the GPU library uses MPI calls, so +you have to make certain to use the same MPI library (or the STUBS +library) settings as the main LAMMPS code. That same applies to the +-DLAMMPS_BIGBIG, -DLAMMPS_SMALLBIG, or -DLAMMPS_SMALLSMALL define. + +You can also do it in one step from the lammps/src dir, using a command like these, which simply invoke the lib/gpu/Install.py script with the specified args: -make lib-gpu # print help message -make lib-gpu args="-m" # build GPU library with default Makefile.linux -make lib-gpu args="-i xk7 -p single -o xk7.single" # create new Makefile.xk7.single, altered for single-precision -make lib-gpu args="-i xk7 -p single -o xk7.single -m" # ditto, also build GPU library +make lib-gpu # print help message +make lib-gpu args="-b" # build GPU library with default Makefile.linux +make lib-gpu args="-m xk7 -p single -o xk7.single" # create new Makefile.xk7.single, altered for single-precision +make lib-gpu args="-m mpi -p mixed -b" # build GPU library with mixed precision using settings in Makefile.mpi :pre -Note that this procedure starts with one of the existing -Makefile.machine files in lib/gpu. It allows you to alter 4 important -settings in that Makefile, via the -h, -a, -p, -e switches, -and save the new Makefile, if desired: +Note that this procedure through the '-m machine' flag starts with one of +the existing Makefile.machine files in lib/gpu. For your convenience, +machine makefiles for "mpi" and "serial" are provided, which have the +same settings as the corresponding machine makefiles in the main LAMMPS +source folder. In addition you can alter 4 important settings in that +Makefile, via the -h, -a, -p, -e switches, and also save a copy of the +new Makefile, if desired: -CUDA_HOME = where NVIDIA Cuda software is installed on your system +CUDA_HOME = where NVIDIA CUDA software is installed on your system CUDA_ARCH = what GPU hardware you have (see help message for details) CUDA_PRECISION = precision (double, mixed, single) EXTRAMAKE = which Makefile.lammps.* file to copy to Makefile.lammps :ul -If the library build is successful, 2 files should be created: -lib/gpu/libgpu.a and lib/gpu/Makefile.lammps. The latter has settings -that enable LAMMPS to link with Cuda libraries. If the settings in -Makefile.lammps for your machine are not correct, the LAMMPS build -will fail. +If the library build is successful, at least 3 files should be created: +lib/gpu/libgpu.a, lib/gpu/nvc_get_devices, and lib/gpu/Makefile.lammps. +The latter has settings that enable LAMMPS to link with CUDA libraries. +If the settings in Makefile.lammps for your machine are not correct, +the LAMMPS build will fail, and lib/gpu/Makefile.lammps may need to +be edited. You can then install/un-install the package and build LAMMPS in the usual manner: @@ -499,11 +526,13 @@ in lib/kim/README. You can also do it in one step from the lammps/src dir, using a command like these, which simply invoke the lib/kim/Install.py script with the specified args. -make lib-kim # print help message -make lib-kim args="-b . none" # install KIM API lib with only example models -make lib-kim args="-b . Glue_Ercolessi_Adams_Al__MO_324507536345_001" # ditto plus one model -make lib-kim args="-b . OpenKIM" # install KIM API lib with all models -make lib-kim args="-a EAM_Dynamo_Ackland_W__MO_141627196590_002" # add one model or model driver :pre +make lib-kim # print help message +make lib-kim args="-b " # (re-)install KIM API lib with only example models +make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # ditto plus one model +make lib-kim args="-b -a everything" # install KIM API lib with all models +make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # add one model or model driver +make lib-kim args="-p /usr/local/kim-api" # use an existing KIM API installation at the provided location +make lib-kim args="-p /usr/local/kim-api -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # ditto but add one model or driver :pre Note that in LAMMPS lingo, a KIM model driver is a pair style (e.g. EAM or Tersoff). A KIM model is a pair style for a particular @@ -547,7 +576,7 @@ KOKKOS package :link(KOKKOS),h4 Dozens of atom, pair, bond, angle, dihedral, improper, fix, compute styles adapted to compile using the Kokkos library which can convert -them to OpenMP or Cuda code so that they run efficiently on multicore +them to OpenMP or CUDA code so that they run efficiently on multicore CPUs, KNLs, or GPUs. All the styles have a "kk" as a suffix in their style name. "Section 5.3.3"_accelerate_kokkos.html gives details of what hardware and software is required on your system, and how to @@ -577,28 +606,28 @@ files for examples. For multicore CPUs using OpenMP: KOKKOS_DEVICES = OpenMP -KOKKOS_ARCH = HSW # HSW = Haswell, SNB = SandyBridge, BDW = Broadwell, etc +KOKKOS_ARCH = HSW # HSW = Haswell, SNB = SandyBridge, BDW = Broadwell, etc :pre For Intel KNLs using OpenMP: KOKKOS_DEVICES = OpenMP -KOKKOS_ARCH = KNL +KOKKOS_ARCH = KNL :pre -For NVIDIA GPUs using Cuda: +For NVIDIA GPUs using CUDA: KOKKOS_DEVICES = Cuda KOKKOS_ARCH = Pascal60,Power8 # P100 hosted by an IBM Power8, etc -KOKKOS_ARCH = Kepler37,Power8 # K80 hosted by an IBM Power8, etc +KOKKOS_ARCH = Kepler37,Power8 # K80 hosted by an IBM Power8, etc :pre For GPUs, you also need these 2 lines in your Makefile.machine before the CC line is defined, in this case for use with OpenMPI mpicxx. The 2 lines define a nvcc wrapper compiler, which will use nvcc for -compiling Cuda files or use a C++ compiler for non-Kokkos, non-Cuda +compiling CUDA files or use a C++ compiler for non-Kokkos, non-CUDA files. KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper -CC = mpicxx +CC = mpicxx :pre Once you have an appropriate Makefile.machine, you can install/un-install the package and build LAMMPS in the usual manner. @@ -669,6 +698,66 @@ bench/in.rhodo :ul :line +LATTE package :link(LATTE),h4 + +[Contents:] + +A fix command which wraps the LATTE DFTB code, so that molecular +dynamics can be run with LAMMPS using density-functional tight-binding +quantum forces calculated by LATTE. + +More information on LATTE can be found at this web site: +"https://github.com/lanl/LATTE"_latte_home. A brief technical +description is given with the "fix latte"_fix_latte.html command. + +:link(latte_home,https://github.com/lanl/LATTE) + +[Authors:] Christian Negre (LANL) and Steve Plimpton (Sandia). LATTE +itself is developed at Los Alamos National Laboratory by Marc +Cawkwell, Anders Niklasson, and Christian Negre. + +[Install or un-install:] + +Before building LAMMPS with this package, you must first download and +build the LATTE library. You can do this manually if you prefer; +follow the instructions in lib/latte/README. You can also do it in +one step from the lammps/src dir, using a command like these, which +simply invokes the lib/latte/Install.py script with the specified +args: + +make lib-latte # print help message +make lib-latte args="-b" # download and build in lib/latte/LATTE-master +make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte +make lib-latte args="-b -m gfortran" # download and build in lib/latte and + # copy Makefile.lammps.gfortran to Makefile.lammps +:pre + +Note that 3 symbolic (soft) links, "includelink" and "liblink" and +"filelink.o", are created in lib/latte to point into the LATTE home dir. +When LAMMPS builds in src it will use these links. You should +also check that the Makefile.lammps file you create is appropriate +for the compiler you use on your system to build LATTE. + +You can then install/un-install the package and build LAMMPS in the +usual manner: + +make yes-latte +make machine :pre + +make no-latte +make machine :pre + +[Supporting info:] + +src/LATTE: filenames -> commands +src/LATTE/README +lib/latte/README +"fix latte"_fix_latte.html +examples/latte +"LAMMPS-LATTE tutorial"_https://github.com/lanl/LATTE/wiki/Using-LATTE-through-LAMMPS :ul + +:line + MANYBODY package :link(MANYBODY),h4 [Contents:] @@ -734,6 +823,12 @@ MEAM package :link(MEAM),h4 A pair style for the modified embedded atom (MEAM) potential. +Please note that the MEAM package has been superseded by the +"USER-MEAMC"_#USER-MEAMC package, which is a direct translation +of the MEAM package to C++. USER-MEAMC contains additional +optimizations making it run faster than MEAM on most machines, +while providing the identical features and USER interface. + [Author:] Greg Wagner (Northwestern U) while at Sandia. [Install or un-install:] @@ -744,9 +839,10 @@ follow the instructions in lib/meam/README. You can also do it in one step from the lammps/src dir, using a command like these, which simply invoke the lib/meam/Install.py script with the specified args: -make lib-meam # print help message -make lib-meam args="-m gfortran" # build with GNU Fortran compiler -make lib-meam args="-m ifort" # build with Intel ifort compiler :pre +make lib-meam # print help message +make lib-meam args="-m mpi" # build with default Fortran compiler compatible with your MPI library +make lib-meam args="-m serial" # build with compiler compatible with "make serial" (GNU Fortran) +make lib-meam args="-m ifort" # build with Intel Fortran compiler using Makefile.ifort :pre The build should produce two files: lib/meam/libmeam.a and lib/meam/Makefile.lammps. The latter is copied from an existing @@ -789,6 +885,9 @@ A variety of compute, fix, pair, dump styles with specialized capabilities that don't align with other packages. Do a directory listing, "ls src/MISC", to see the list of commands. +NOTE: the MISC package contains styles that require using the +-restrict flag, when compiling with Intel compilers. + [Install or un-install:] make yes-misc @@ -886,7 +985,7 @@ MSCG package :link(mscg),h4 [Contents:] A "fix mscg"_fix_mscg.html command which can parameterize a -Mulit-Scale Coarse-Graining (MSCG) model using the open-source "MS-CG +Multi-Scale Coarse-Graining (MSCG) model using the open-source "MS-CG library"_mscg_home. :link(mscg_home,https://github.com/uchicago-voth/MSCG-release) @@ -902,9 +1001,9 @@ University of Chicago. Before building LAMMPS with this package, you must first download and build the MS-CG library. Building the MS-CG library and using it from -LAMMPS requires a C++11 compatible compiler, and that LAPACK and GSL -(GNU Scientific Library) libraries be installed on your machine. See -the lib/mscg/README and MSCG/Install files for more details. +LAMMPS requires a C++11 compatible compiler and that the GSL +(GNU Scientific Library) headers and libraries are installed on your +machine. See the lib/mscg/README and MSCG/Install files for more details. Assuming these libraries are in place, you can do the download and build of MS-CG manually if you prefer; follow the instructions in @@ -912,15 +1011,16 @@ 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 lib/mscg/Install.py script with the specified args: -make lib-mscg # print help message -make lib-mscg args="-g -b -l" # download and build in default lib/mscg/MSCG-release-master -make lib-mscg args="-h . MSCG -g -b -l" # download and build in lib/mscg/MSCG -make lib-mscg args="-h ~ MSCG -g -b -l" # download and build in ~/mscg :pre +make lib-mscg # print help message +make lib-mscg args="-b -m serial" # download and build in lib/mscg/MSCG-release-master + # with the settings compatible with "make serial" +make lib-mscg args="-b -m mpi" # download and build in lib/mscg/MSCG-release-master + # with the settings compatible with "make mpi" +make lib-mscg args="-p /usr/local/mscg-release" # use the existing MS-CG installation in /usr/local/mscg-release :pre -Note that the final -l switch is to create 2 symbolic (soft) links, -"includelink" and "liblink", in lib/mscg to point to the MS-CG src -dir. When LAMMPS builds it will use these links. You should not need -to edit the lib/mscg/Makefile.lammps file. +Note that 2 symbolic (soft) links, "includelink" and "liblink", will be created in lib/mscg +to point to the MS-CG src/installation dir. When LAMMPS is built in src it will use these links. +You should not need to edit the lib/mscg/Makefile.lammps file. You can then install/un-install the package and build LAMMPS in the usual manner: @@ -966,11 +1066,11 @@ make no-opt make machine :pre NOTE: The compile flag "-restrict" must be used to build LAMMPS with -the OPT package. It should be added to the CCFLAGS line of your -Makefile.machine. See Makefile.opt in src/MAKE/OPTIONS for an -example. +the OPT package when using Intel compilers. It should be added to +the CCFLAGS line of your Makefile.machine. See Makefile.opt in +src/MAKE/OPTIONS for an example. -CCFLAGS: add -restrict :ul +CCFLAGS: add -restrict for Intel compilers :ul [Supporting info:] @@ -1039,9 +1139,10 @@ 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 specified args: -make lib-poems # print help message -make lib-poems args="-m g++" # build with GNU g++ compiler -make lib-poems args="-m icc" # build with Intel icc compiler :pre +make lib-poems # print help message +make lib-poems args="-m serial" # build with GNU g++ compiler (settings as with "make serial") +make lib-poems args="-m mpi" # build with default MPI C++ compiler (settings as with "make mpi") +make lib-poems args="-m icc" # build with Intel icc compiler :pre The build should produce two files: lib/poems/libpoems.a and lib/poems/Makefile.lammps. The latter is copied from an existing @@ -1151,9 +1252,10 @@ follow the instructions in lib/reax/README. You can also do it in one step from the lammps/src dir, using a command like these, which simply invoke the lib/reax/Install.py script with the specified args: -make lib-reax # print help message -make lib-reax args="-m gfortran" # build with GNU Fortran compiler -make lib-reax args="-m ifort" # build with Intel ifort compiler :pre +make lib-reax # print help message +make lib-reax args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") +make lib-reax args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") +make lib-reax args="-m ifort" # build with Intel ifort compiler :pre The build should produce two files: lib/reax/libreax.a and lib/reax/Makefile.lammps. The latter is copied from an existing @@ -1304,7 +1406,7 @@ make machine :pre [Supporting info:] src/SNAP: filenames -> commands -"pair snap"_pair_snap.html +"pair_style snap"_pair_snap.html "compute sna/atom"_compute_sna_atom.html "compute snad/atom"_compute_sna_atom.html "compute snav/atom"_compute_sna_atom.html @@ -1370,15 +1472,15 @@ one step from the lammps/src dir, using a command like these, which simply invoke the lib/voronoi/Install.py script with the specified args: -make lib-voronoi # print help message -make lib-voronoi args="-g -b -l" # download and build in default lib/voronoi/voro++-0.4.6 -make lib-voronoi args="-h . voro++ -g -b -l" # download and build in lib/voronoi/voro++ -make lib-voronoi args="-h ~ voro++ -g -b -l" # download and build in ~/voro++ :pre +make lib-voronoi # print help message +make lib-voronoi args="-b" # download and build the default version in lib/voronoi/voro++- +make lib-voronoi args="-p $HOME/voro++" # use existing Voro++ installation in $HOME/voro++ +make lib-voronoi args="-b -v voro++0.4.6" # download and build the 0.4.6 version in lib/voronoi/voro++-0.4.6 :pre -Note that the final -l switch is to create 2 symbolic (soft) links, -"includelink" and "liblink", in lib/voronoi to point to the Voro++ src -dir. When LAMMPS builds it will use these links. You should not need -to edit the lib/voronoi/Makefile.lammps file. +Note that 2 symbolic (soft) links, "includelink" and "liblink", are +created in lib/voronoi to point to the Voro++ src dir. When LAMMPS +builds in src it will use these links. You should not need to edit +the lib/voronoi/Makefile.lammps file. You can then install/un-install the package and build LAMMPS in the usual manner: @@ -1420,7 +1522,8 @@ from the lammps/src dir, using a command like these, which simply invoke the lib/atc/Install.py script with the specified args: make lib-atc # print help message -make lib-atc args="-m g++" # build with GNU g++ compiler +make lib-atc args="-m serial" # build with GNU g++ compiler and MPI STUBS (settings as with "make serial") +make lib-atc args="-m mpi" # build with default MPI compiler (settings as with "make mpi") make lib-atc args="-m icc" # build with Intel icc compiler :pre The build should produce two files: lib/atc/libatc.a and @@ -1437,8 +1540,10 @@ 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: -make lib-linalg # print help message -make lib-atc args="-m gfortran" # build with GNU Fortran compiler +make lib-linalg # print help message +make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") +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 :pre You can then install/un-install the package and build LAMMPS in the usual manner: @@ -1478,9 +1583,10 @@ 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 specified args: -make lib-awpmd # print help message -make lib-awpmd args="-m g++" # build with GNU g++ compiler -make lib-awpmd args="-m icc" # build with Intel icc compiler :pre +make lib-awpmd # print help message +make lib-awpmd args="-m serial" # build with GNU g++ compiler and MPI STUBS (settings as with "make serial") +make lib-awpmd args="-m mpi" # build with default MPI compiler (settings as with "make mpi") +make lib-awpmd args="-m icc" # build with Intel icc compiler :pre The build should produce two files: lib/awpmd/libawpmd.a and lib/awpmd/Makefile.lammps. The latter is copied from an existing @@ -1496,8 +1602,10 @@ 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: -make lib-linalg # print help message -make lib-atc args="-m gfortran" # build with GNU Fortran compiler +make lib-linalg # print help message +make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") +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 :pre You can then install/un-install the package and build LAMMPS in the usual manner: @@ -1512,7 +1620,7 @@ make machine :pre src/USER-AWPMD: filenames -> commands src/USER-AWPMD/README -"pair awpmd/cut"_pair_awpmd.html +"pair_style awpmd/cut"_pair_awpmd.html examples/USER/awpmd :ul :line @@ -1590,9 +1698,11 @@ Restraints. A "fix colvars"_fix_colvars.html command is implemented which wraps a COLVARS library, which implements these methods. simulations. -[Authors:] Axel Kohlmeyer (Temple U). The COLVARS library was written -by Giacomo Fiorin (ICMS, Temple University, Philadelphia, PA, USA) and -Jerome Henin (LISM, CNRS, Marseille, France). +[Authors:] The COLVARS library is written and maintained by +Giacomo Fiorin (ICMS, Temple University, Philadelphia, PA, USA) +and Jerome Henin (LISM, CNRS, Marseille, France), originally for +the NAMD MD code, but with portability in mind. Axel Kohlmeyer +(Temple U) provided the interface to LAMMPS. [Install or un-install:] @@ -1604,7 +1714,9 @@ which simply invoke the lib/colvars/Install.py script with the specified args: make lib-colvars # print help message -make lib-colvars args="-m g++" # build with GNU g++ compiler :pre +make lib-colvars args="-m serial" # build with GNU g++ compiler (settings as with "make serial") +make lib-colvars args="-m mpi" # build with default MPI compiler (settings as with "make mpi") +make lib-colvars args="-m g++-debug" # build with GNU g++ compiler and colvars debugging enabled :pre The build should produce two files: lib/colvars/libcolvars.a and lib/colvars/Makefile.lammps. The latter is copied from an existing @@ -1670,7 +1782,7 @@ coarse-grained DPD-based models for energetic, reactive molecular crystalline materials. It includes many pair styles specific to these systems, including for reactive DPD, where each particle has internal state for multiple species and a coupled set of chemical reaction ODEs -are integrated each timestep. Highly accurate time intergrators for +are integrated each timestep. Highly accurate time integrators for isothermal, isoenergetic, isobaric and isenthalpic conditions are included. These enable long timesteps via the Shardlow splitting algorithm. @@ -1697,12 +1809,12 @@ src/USER-DPD: filenames -> commands "fix eos/table/rx"_fix_eos_table_rx.html "fix shardlow"_fix_shardlow.html "fix rx"_fix_rx.html -"pair table/rx"_pair_table_rx.html -"pair dpd/fdt"_pair_dpd_fdt.html -"pair dpd/fdt/energy"_pair_dpd_fdt.html -"pair exp6/rx"_pair_exp6_rx.html -"pair multi/lucy"_pair_multi_lucy.html -"pair multi/lucy/rx"_pair_multi_lucy_rx.html +"pair_style table/rx"_pair_table_rx.html +"pair_style dpd/fdt"_pair_dpd_fdt.html +"pair_style dpd/fdt/energy"_pair_dpd_fdt.html +"pair_style exp6/rx"_pair_exp6_rx.html +"pair_style multi/lucy"_pair_multi_lucy.html +"pair_style multi/lucy/rx"_pair_multi_lucy_rx.html examples/USER/dpd :ul :line @@ -1737,8 +1849,8 @@ src/USER-DRUDE/README "fix drude"_fix_drude.html "fix drude/transform/*"_fix_drude_transform.html "compute temp/drude"_compute_temp_drude.html -"pair thole"_pair_thole.html -"pair lj/cut/thole/long"_pair_thole.html +"pair_style thole"_pair_thole.html +"pair_style lj/cut/thole/long"_pair_thole.html examples/USER/drude tools/drude :ul @@ -1776,8 +1888,8 @@ src/USER-EFF/README "fix npt/eff"_fix_nh_eff.html "fix langevin/eff"_fix_langevin_eff.html "compute temp/eff"_compute_temp_eff.html -"pair eff/cut"_pair_eff.html -"pair eff/inline"_pair_eff.html +"pair_style eff/cut"_pair_eff.html +"pair_style eff/inline"_pair_eff.html examples/USER/eff tools/eff/README tools/eff @@ -1892,7 +2004,12 @@ Also see the "KOKKOS"_#KOKKOS, "OPT"_#OPT, and "USER-OMP"_#USER-OMP packages, which have styles optimized for CPUs and KNLs. You need to have an Intel compiler, version 14 or higher to take full -advantage of this package. +advantage of this package. While compilation with GNU compilers is +supported, performance will be suboptimal. + +NOTE: the USER-INTEL package contains styles that require using the +-restrict flag, when compiling with Intel compilers. + [Author:] Mike Brown (Intel). @@ -1909,17 +2026,17 @@ For CPUs: OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +-fno-alias -ansi-alias -restrict $(OPTFLAGS) LINKFLAGS = -g -qopenmp $(OPTFLAGS) -LIB = -ltbbmalloc -ltbbmalloc_proxy +LIB = -ltbbmalloc -ltbbmalloc_proxy :pre For KNLs: OPTFLAGS = -xMIC-AVX512 -O2 -fp-model fast=2 -no-prec-div -qoverride-limits CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +-fno-alias -ansi-alias -restrict $(OPTFLAGS) LINKFLAGS = -g -qopenmp $(OPTFLAGS) -LIB = -ltbbmalloc +LIB = -ltbbmalloc :pre Once you have an appropriate Makefile.machine, you can install/un-install the package and build LAMMPS in the usual manner. @@ -2102,11 +2219,85 @@ make machine :pre src/USER-MEAMC: filenames -> commands src/USER-MEAMC/README -"pair meam/c"_pair_meam.html +"pair_style meam/c"_pair_meam.html examples/meam :ul :line +USER-MESO package :link(USER-MESO),h4 + +[Contents:] + +Several extensions of the the dissipative particle dynamics (DPD) +method. Specifically, energy-conserving DPD (eDPD) that can model +non-isothermal processes, many-body DPD (mDPD) for simulating +vapor-liquid coexistence, and transport DPD (tDPD) for modeling +advection-diffusion-reaction systems. The equations of motion of these +DPD extensions are integrated through a modified velocity-Verlet (MVV) +algorithm. + +[Author:] Zhen Li (Division of Applied Mathematics, Brown University) + +[Install or un-install:] + +make yes-user-meso +make machine :pre + +make no-user-meso +make machine :pre + +[Supporting info:] + +src/USER-MESO: filenames -> commands +src/USER-MESO/README +"atom_style edpd"_atom_style.html +"pair_style edpd"_pair_meso.html +"pair_style mdpd"_pair_meso.html +"pair_style tdpd"_pair_meso.html +"fix mvv/dpd"_fix_mvv_dpd.html +examples/USER/meso +http://lammps.sandia.gov/movies.html#mesodpd :ul + +:line + +USER-MOFFF package :link(USER-MOFFF),h4 + +[Contents:] + +Pair, angle and improper styles needed to employ the MOF-FF +force field by Schmid and coworkers with LAMMPS. +MOF-FF is a first principles derived force field with the primary aim +to simulate MOFs and related porous framework materials, using spherical +Gaussian charges. It is described in S. Bureekaew et al., Phys. Stat. Sol. B +2013, 250, 1128-1141. +For the usage of MOF-FF see the example in the example directory as +well as the "MOF+"_MOFplus website. + +:link(MOFplus,https://www.mofplus.org/content/show/MOF-FF) + +[Author:] Hendrik Heenen (Technical U of Munich), +Rochus Schmid (Ruhr-University Bochum). + +[Install or un-install:] + +make yes-user-mofff +make machine :pre + +make no-user-mofff +make machine :pre + +[Supporting info:] + +src/USER-MOFFF: filenames -> commands +src/USER-MOFFF/README +"pair_style buck6d/coul/gauss"_pair_buck6d_coul_gauss.html +"angle_style class2"_angle_class2.html +"angle_style cosine/buck6d"_angle_cosine_buck6d.html +"improper_style inversion/harmonic"_improper_inversion_harmonic.html +examples/USER/mofff :ul + +:line + USER-MOLFILE package :link(USER-MOLFILE),h4 [Contents:] @@ -2224,11 +2415,15 @@ CPUs. [Author:] Axel Kohlmeyer (Temple U). -NOTE: The compile flags "-restrict" and "-fopenmp" must be used to -build LAMMPS with the USER-OMP package, as well as the link flag -"-fopenmp". They should be added to the CCFLAGS and LINKFLAGS lines -of your Makefile.machine. See src/MAKE/OPTIONS/Makefile.omp for an -example. +NOTE: To enable multi-threading support the compile flag "-fopenmp" +and the link flag "-fopenmp" (for GNU compilers, you have to look up +the equivalent flags for other compilers) must be used to build LAMMPS. +When using Intel compilers, also the "-restrict" flag is required. +The USER-OMP package can be compiled without enabling OpenMP; then +all code will be compiled as serial and the only improvement over the +regular styles are some data access optimization. These flags should +be added to the CCFLAGS and LINKFLAGS lines of your Makefile.machine. +See src/MAKE/OPTIONS/Makefile.omp for an example. Once you have an appropriate Makefile.machine, you can install/un-install the package and build LAMMPS in the usual manner: @@ -2241,7 +2436,7 @@ make machine :pre make no-user-omp make machine :pre -CCFLAGS: add -fopenmp and -restrict +CCFLAGS: add -fopenmp (and -restrict when using Intel compilers) LINKFLAGS: add -fopenmp :ul [Supporting info:] @@ -2310,12 +2505,14 @@ without changes to LAMMPS itself. Before building LAMMPS with this package, you must first build the QMMM library in lib/qmmm. You can do this manually if you prefer; -follow the first two steps explained in lib/colvars/README. You can +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/colvars/Install.py script with the +these, which simply invoke the lib/qmmm/Install.py script with the specified args: make lib-qmmm # print help message +make lib-qmmm args="-m serial" # build with GNU Fortran compiler (settings as in "make serial") +make lib-qmmm args="-m mpi" # build with default MPI compiler (settings as in "make mpi") make lib-qmmm args="-m gfortran" # build with GNU Fortran compiler :pre The build should produce two files: lib/qmmm/libqmmm.a and @@ -2337,7 +2534,7 @@ make machine :pre NOTE: The LAMMPS executable these steps produce is not yet functional for a QM/MM simulation. You must also build Quantum ESPRESSO and -create a new executable which links LAMMPS and Quanutm ESPRESSO +create a new executable which links LAMMPS and Quantum ESPRESSO together. These are steps 3 and 4 described in the lib/qmmm/README file. @@ -2396,7 +2593,7 @@ developed by the Cambridge University group. :link(quip,https://github.com/libAtoms/QUIP) -To use this package you must have the QUIP libAatoms library available +To use this package you must have the QUIP libAtoms library available on your system. [Author:] Albert Bartok (Cambridge University) @@ -2492,15 +2689,13 @@ 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 specified args: -make lib-smd # print help message -make lib-smd args="-g -l" # download in default lib/smd/eigen-eigen-* -make lib-smd args="-h . eigen -g -l" # download in lib/smd/eigen -make lib-smd args="-h ~ eigen -g -l" # download and build in ~/eigen :pre +make lib-smd # print help message +make lib-smd args="-b" # download and build in default lib/smd/eigen-eigen-... +make lib-smd args="-p /usr/include/eigen3" # use existing Eigen installation in /usr/include/eigen3 :pre -Note that the final -l switch is to create a symbolic (soft) link -named "includelink" in lib/smd to point to the Eigen dir. When LAMMPS -builds it will use this link. You should not need to edit the -lib/smd/Makefile.lammps file. +Note that a symbolic (soft) link named "includelink" is created in +lib/smd to point to the Eigen dir. When LAMMPS builds it will use +this link. You should not need to edit the lib/smd/Makefile.lammps file. You can then install/un-install the package and build LAMMPS in the usual manner: @@ -2616,13 +2811,44 @@ examples/USER/tally :ul :line +USER-UEF package :link(USER-UEF),h4 + +[Contents:] + +A fix style for the integration of the equations of motion under +extensional flow with proper boundary conditions, as well as several +supporting compute styles and an output option. + +[Author:] David Nicholson (MIT). + +[Install or un-install:] + +make yes-user-uef +make machine :pre + +make no-user-uef +make machine :pre + +[Supporting info:] + +src/USER-UEF: filenames -> commands +src/USER-UEF/README +"fix nvt/uef"_fix_nh_uef.html +"fix npt/uef"_fix_nh_uef.html +"compute pressure/uef"_compute_pressure_uef.html +"compute temp/uef"_compute_temp_uef.html +"dump cfg/uef"_dump_cfg_uef.html +examples/uef :ul + +:line + USER-VTK package :link(USER-VTK),h4 [Contents:] -A "dump vtk"_dump_vtk.html command which outputs -snapshot info in the "VTK format"_vtk, enabling visualization by -"Paraview"_paraview or other visuzlization packages. +A "dump vtk"_dump_vtk.html command which outputs snapshot info in the +"VTK format"_vtk, enabling visualization by "Paraview"_paraview or +other visualization packages. :link(vtk,http://www.vtk.org) :link(paraview,http://www.paraview.org) diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt index f4b6bdad97..26e1c84c09 100644 --- a/doc/src/Section_python.txt +++ b/doc/src/Section_python.txt @@ -123,7 +123,7 @@ code directly from an input script: "python"_python.html "variable python"_variable.html -"fix python"_fix_python.html +"fix python/invoke"_fix_python_invoke.html "pair_style python"_pair_python.html :ul The "python"_python.html command which can be used to define and @@ -165,7 +165,7 @@ doc page for its python-style variables for more info, including examples of Python code you can write for both pure Python operations and callbacks to LAMMPS. -The "fix python"_fix_python.html command can execute +The "fix python/invoke"_fix_python_invoke.html command can execute Python code at selected timesteps during a simulation run. The "pair_style python"_pair_python command allows you to define diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index c798005f5e..6473c346dc 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -79,7 +79,7 @@ This section has the following sub-sections: Read this first :h5,link(start_2_1) -If you want to avoid building LAMMPS yourself, read the preceeding +If you want to avoid building LAMMPS yourself, read the preceding section about options available for downloading and installing executables. Details are discussed on the "download"_download page. @@ -252,14 +252,13 @@ re-compile, after typing "make clean" (which will describe different clean options). The LMP_INC variable is used to include options that turn on ifdefs -within the LAMMPS code. The options that are currently recogized are: +within the LAMMPS code. The options that are currently recognized are: -DLAMMPS_GZIP -DLAMMPS_JPEG -DLAMMPS_PNG -DLAMMPS_FFMPEG -DLAMMPS_MEMALIGN --DLAMMPS_XDR -DLAMMPS_SMALLBIG -DLAMMPS_BIGBIG -DLAMMPS_SMALLSMALL @@ -308,11 +307,6 @@ has to be aligned on larger than default byte boundaries (e.g. 16 bytes instead of 8 bytes on x86 type platforms) for optimal performance. -If you use -DLAMMPS_XDR, the build will include XDR compatibility -files for doing particle dumps in XTC format. This is only necessary -if your platform does have its own XDR files available. See the -Restrictions section of the "dump"_dump.html command for details. - Use at most one of the -DLAMMPS_SMALLBIG, -DLAMMPS_BIGBIG, -DLAMMPS_SMALLSMALL settings. The default is -DLAMMPS_SMALLBIG. These settings refer to use of 4-byte (small) vs 8-byte (big) integers @@ -363,7 +357,7 @@ installed on your platform. If MPI is installed on your system in the usual place (under /usr/local), you also may not need to specify these 3 variables, assuming /usr/local is in your path. On some large parallel machines which use "modules" for their compile/link -environements, you may simply need to include the correct module in +environments, you may simply need to include the correct module in your build environment, before building LAMMPS. Or the parallel machine may have a vendor-provided MPI which the compiler has no trouble finding. @@ -431,7 +425,7 @@ use the KISS library described above. You may also need to set the FFT_INC, FFT_PATH, and FFT_LIB variables, so the compiler and linker can find the needed FFT header and library files. Note that on some large parallel machines which use "modules" -for their compile/link environements, you may simply need to include +for their compile/link environments, you may simply need to include the correct module in your build environment. Or the parallel machine may have a vendor-provided FFT library which the compiler has no trouble finding. See the src/MAKE/OPTIONS/Makefile.fftw file for an @@ -470,7 +464,7 @@ precision. The FFT_INC variable also allows for a -DFFT_SINGLE setting that will use single-precision FFTs with PPPM, which can speed-up long-range -calulations, particularly in parallel or on GPUs. Fourier transform +calculations, particularly in parallel or on GPUs. Fourier transform and related PPPM operations are somewhat insensitive to floating point truncation errors and thus do not always need to be performed in double precision. Using the -DFFT_SINGLE setting trades off a little @@ -483,7 +477,7 @@ with support for single-precision, as explained above. For FFTW3 you also need to include -lfftw3f with the FFT_LIB setting, in addition to -lfftw3. For FFTW2, you also need to specify -DFFT_SIZE with the FFT_INC setting and -lsfftw with the FFT_LIB setting (in place of --lfftw). Similarly, if FFTW2 has been preinstalled with an explicit +-lfftw). Similarly, if FFTW2 has been pre-installed with an explicit double-precision library (libdfftw.a and not the default libfftw.a), then you can specify -DFFT_SIZE (and not -DFFT_SINGLE), and specify -ldfftw to use double-precision FFTs. @@ -536,7 +530,7 @@ You should get the executable lmp_foo when the build is complete. :line -Errors that can occur when making LAMMPS: h5 :link(start_2_3) +Errors that can occur when making LAMMPS :h5 :link(start_2_3) If an error occurs when building LAMMPS, the compiler or linker will state very explicitly what the problem is. The error message should @@ -587,8 +581,7 @@ Typing "make clean-all" or "make clean-machine" will delete *.o object files created when LAMMPS is built, for either all builds or for a particular machine. -Changing the LAMMPS size limits via -DLAMMPS_SMALLBIG or --DLAMMPS_BIGBIG or -DLAMMPS_SMALLSMALL :h6 +Changing the LAMMPS size limits via -DLAMMPS_SMALLBIG or -DLAMMPS_BIGBIG or -DLAMMPS_SMALLSMALL :h6 As explained above, any of these 3 settings can be specified on the LMP_INC line in your low-level src/MAKE/Makefile.foo. @@ -659,22 +652,29 @@ utilities. For Cygwin and the MinGW cross-compilers, suitable makefiles are provided in src/MAKE/MACHINES. When using other compilers, like Visual C++ or Intel compilers for Windows, you may have to implement -your own build system. Since none of the current LAMMPS core developers -has significant experience building executables on Windows, we are -happy to distribute contributed instructions and modifications, but -we cannot provide support for those. +your own build system. Due to differences between the Windows OS +and Windows system libraries to Unix-like environments like Linux +or MacOS, when compiling for Windows a few adjustments may be needed: + +Do [not] set the -DLAMMPS_MEMALIGN define (see LMP_INC makefile variable) +Add -lwsock32 -lpsapi to the linker flags (see LIB makefile variable) +Try adding -static-libgcc or -static or both to the linker flags when your LAMMPS executable complains about missing .dll files :ul + +Since none of the current LAMMPS core developers has significant +experience building executables on Windows, we are happy to distribute +contributed instructions and modifications to improve the situation, +but we cannot provide support for those. With the so-called "Anniversary Update" to Windows 10, there is a Ubuntu Linux subsystem available for Windows, that can be installed and then used to compile/install LAMMPS as if you are running on a Ubuntu Linux system instead of Windows. -As an alternative, you can download "daily builds" (and some older -versions) of the installer packages from -"rpm.lammps.org/windows.html"_http://rpm.lammps.org/windows.html. -These executables are built with most optional packages and the -download includes documentation, potential files, some tools and -many examples, but no source code. +As an alternative, you can download pre-compiled installer packages from +"packages.lammps.org/windows.html"_http://packages.lammps.org/windows.html. +These executables are built with most optional packages included and the +download includes documentation, potential files, some tools and many +examples, but no source code. :line @@ -708,7 +708,7 @@ list various make commands that can be used to manage packages. If you use a command in a LAMMPS input script that is part of a package, you must have built LAMMPS with that package, else you will get an error that the style is invalid or the command is unknown. -Every command's doc page specfies if it is part of a package. You can +Every command's doc page specifies if it is part of a package. You can type lmp_machine -h :pre @@ -803,6 +803,10 @@ currently installed. For those that are installed, it will list any files that are different in the src directory and package sub-directory. +Typing "make package-installed" or "make pi" will list which packages are +currently installed, without listing the status of packages that are not +installed. + Typing "make package-update" or "make pu" will overwrite src files with files from the package sub-directories if the package is installed. It should be used after a patch has been applied, since @@ -853,7 +857,7 @@ details for each package. [External libraries:] Packages in the tables "Section 4"_Section_packages.html with an "ext" -in the last column link to exernal libraries whose source code is not +in the last column link to external libraries whose source code is not included with LAMMPS. You must first download and install the library before building LAMMPS with that package installed. E.g. the voronoi package links to the freely available "Voro++ library"_voro_home2. You @@ -909,12 +913,12 @@ src/MAKE/OPTIONS, which include the settings. Note that the USER-INTEL and KOKKOS packages can use settings that build LAMMPS for different hardware. The USER-INTEL package can be compiled for Intel CPUs and KNLs; the KOKKOS package builds for CPUs (OpenMP), GPUs -(Cuda), and Intel KNLs. +(CUDA), and Intel KNLs. Makefile.intel_cpu Makefile.intel_phi Makefile.kokkos_omp -Makefile.kokkos_cuda +Makefile.kokkos_cuda_mpi Makefile.kokkos_phi Makefile.omp Makefile.opt :ul @@ -957,7 +961,7 @@ src/MAKE/Makefile.foo and perform the build in the directory Obj_shared_foo. This is so that each file can be compiled with the -fPIC flag which is required for inclusion in a shared library. The build will create the file liblammps_foo.so which another application -can link to dyamically. It will also create a soft link liblammps.so, +can link to dynamically. It will also create a soft link liblammps.so, which will point to the most recently built shared library. This is the file the Python wrapper loads by default. @@ -1087,7 +1091,7 @@ LAMMPS to be built with one or more of its optional packages. :line On a Windows box, you can skip making LAMMPS and simply download an -installer package from "here"_http://rpm.lammps.org/windows.html +installer package from "here"_http://packages.lammps.org/windows.html For running the non-MPI executable, follow these steps: @@ -1099,18 +1103,27 @@ the [in.lj] input from the bench folder. (e.g. by typing: cd "Documents"). :l At the command prompt, type "lmp_serial -in in.lj", replacing [in.lj] with the name of your LAMMPS input script. :l + +The serial executable includes support for multi-threading +parallelization from the styles in the USER-OMP packages. + +To run with, e.g. 4 threads, type "lmp_serial -in in.lj -pk omp 4 -sf omp" :ule -For the MPI version, which allows you to run LAMMPS under Windows on -multiple processors, follow these steps: +For the MPI version, which allows you to run LAMMPS under Windows with +the more general message passing parallel library (LAMMPS has been +designed from ground up to use MPI efficiently), follow these steps: -Download and install -"MPICH2"_http://www.mcs.anl.gov/research/projects/mpich2/downloads/index.php?s=downloads -for Windows. :ulb,l +Download and install a compatible MPI library binary package: +for 32-bit Windows +"mpich2-1.4.1p1-win-ia32.msi"_download.lammps.org/thirdparty/mpich2-1.4.1p1-win-ia32.msi +and for 64-bit Windows +"mpich2-1.4.1p1-win-x86-64.msi"_download.lammps.org/thirdparty/mpich2-1.4.1p1-win-x86-64.msi +:ulb,l The LAMMPS Windows installer packages will automatically adjust your path for the default location of this MPI package. After the installation -of the MPICH software, it needs to be integrated into the system. +of the MPICH2 software, it needs to be integrated into the system. For this you need to start a Command Prompt in {Administrator Mode} (right click on the icon and select it). Change into the MPICH2 installation directory, then into the subdirectory [bin] and execute @@ -1129,7 +1142,7 @@ or mpiexec -np 4 lmp_mpi -in in.lj :pre -replacing in.lj with the name of your LAMMPS input script. For the latter +replacing [in.lj] with the name of your LAMMPS input script. For the latter case, you may be prompted to enter your password. :l In this mode, output may not immediately show up on the screen, so if @@ -1141,6 +1154,11 @@ something like: lmp_mpi -in in.lj :pre +And the parallel executable also includes OpenMP multi-threading, which +can be combined with MPI using something like: + +mpiexec -localonly 2 lmp_mpi -in in.lj -pk omp 2 -sf omp :pre + :ule :line @@ -1309,8 +1327,8 @@ LAMMPS is compiled with CUDA=yes. numa Nm :pre This option is only relevant when using pthreads with hwloc support. -In this case Nm defines the number of NUMA regions (typicaly sockets) -on a node which will be utilizied by a single MPI rank. By default Nm +In this case Nm defines the number of NUMA regions (typically sockets) +on a node which will be utilized by a single MPI rank. By default Nm = 1. If this option is used the total number of worker-threads per MPI rank is threads*numa. Currently it is always almost better to assign at least one MPI rank per NUMA region, and leave numa set to @@ -1374,7 +1392,7 @@ replica runs on on one or a few processors. Note that with MPI installed on a machine (e.g. your desktop), you can run on more (virtual) processors than you have physical processors. -To run multiple independent simulatoins from one input script, using +To run multiple independent simulations from one input script, using multiple partitions, see "Section 6.4"_Section_howto.html#howto_4 of the manual. World- and universe-style "variables"_variable.html are useful in this context. @@ -1653,7 +1671,7 @@ The first section provides a global loop timing summary. The {loop time} is the total wall time for the section. The {Performance} line is provided for convenience to help predicting the number of loop continuations required and for comparing performance with other, -similar MD codes. The {CPU use} line provides the CPU utilzation per +similar MD codes. 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 no OpenMP). Lower numbers correspond to delays due to file I/O or insufficient thread utilization. diff --git a/doc/src/Section_tools.txt b/doc/src/Section_tools.txt index d95c4f0cd4..e85c0d818f 100644 --- a/doc/src/Section_tools.txt +++ b/doc/src/Section_tools.txt @@ -48,6 +48,7 @@ own sub-directories with their own Makefiles and/or README files. "chain"_#chain "colvars"_#colvars "createatoms"_#createatoms +"doxygen"_#doxygen "drude"_#drude "eam database"_#eamdb "eam generate"_#eamgn @@ -110,14 +111,21 @@ back-and-forth between the CHARMM MD code and LAMMPS. They are intended to make it easy to use CHARMM as a builder and as a post-processor for LAMMPS. Using charmm2lammps.pl, you can convert a PDB file with associated CHARMM info, including CHARMM force field -data, into its LAMMPS equivalent. Using lammps2pdb.pl you can convert -LAMMPS atom dumps into PDB files. +data, into its LAMMPS equivalent. Support for the CMAP correction of +CHARMM22 and later is available as an option. This tool can also add +solvent water molecules and Na+ or Cl- ions to the system. +Using lammps2pdb.pl you can convert LAMMPS atom dumps into PDB files. See the README file in the ch2lmp sub-directory for more information. These tools were created by Pieter in't Veld (pjintve at sandia.gov) and Paul Crozier (pscrozi at sandia.gov) at Sandia. +CMAP support added and tested by Xiaohu Hu (hux2 at ornl.gov) and +Robert A. Latour (latourr at clemson.edu), David Hyde-Volpe, and +Tigran Abramyan, (Clemson University) and +Chris Lorenz (chris.lorenz at kcl.ac.uk), King's College London. + :line chain tool :h4,link(chain) @@ -172,6 +180,18 @@ The tool is authored by Xiaowang Zhou (Sandia), xzhou at sandia.gov. :line +doxygen tool :h4,link(doxygen) + +The tools/doxygen directory contains a shell script called +doxygen.sh which can generate a call graph and API lists using +the "Doxygen software"_http://doxygen.org. + +See the included README file for details. + +The tool is authored by Nandor Tamaskovics, numericalfreedom at googlemail.com. + +:line + drude tool :h4,link(drude) The tools/drude directory contains a Python script called diff --git a/doc/src/USER/atc/man_add_molecule.html b/doc/src/USER/atc/man_add_molecule.html index 99270c7276..8d9625e1bd 100644 --- a/doc/src/USER/atc/man_add_molecule.html +++ b/doc/src/USER/atc/man_add_molecule.html @@ -7,24 +7,22 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC add_molecule

-syntax

+

fix_modify AtC add_molecule

+syntax

fix_modify_AtC add_molecule <small|large> <TAG> <GROUP_NAME>

    @@ -35,21 +33,21 @@ syntax
  • <GROUP_NAME> = name of group that tracking will be applied to
-

-examples

+

+examples

group WATERGROUP type 1 2
fix_modify AtC add_molecule small water WATERGROUP

-

-description

+

+description

Associates a tag with all molecules corresponding to a specified group.

-

-restrictions

-

-related

-

-default

+

+restrictions

+

+related

+

+default

No defaults for this command.


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_add_species.html b/doc/src/USER/atc/man_add_species.html index 95192034d9..9beded1b16 100644 --- a/doc/src/USER/atc/man_add_species.html +++ b/doc/src/USER/atc/man_add_species.html @@ -7,24 +7,22 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC add_species

-syntax

+

fix_modify AtC add_species

+syntax

fix_modify_AtC add_species <TAG> <group|type> <ID>

    @@ -35,21 +33,21 @@ syntax
  • <ID> = name of group or type number
-

-examples

+

+examples

fix_modify AtC add_species gold type 1
group GOLDGROUP type 1
fix_modify AtC add_species gold group GOLDGROUP

-

-description

+

+description

Associates a tag with all atoms of a specified type or within a specified group.

-

-restrictions

-

-related

-

-default

+

+restrictions

+

+related

+

+default

No defaults for this command.


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_atom_element_map.html b/doc/src/USER/atc/man_atom_element_map.html index 3073c0f920..6725170928 100644 --- a/doc/src/USER/atc/man_atom_element_map.html +++ b/doc/src/USER/atc/man_atom_element_map.html @@ -7,42 +7,40 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC atom_element_map

-syntax

+

fix_modify AtC atom_element_map

+syntax

fix_modify AtC atom_element_map <eulerian|lagrangian> <frequency>

  • frequency (int) : frequency of updating atom-to-continuum maps based on the current configuration - only for eulerian
-

-examples

+

+examples

fix_modify atc atom_element_map eulerian 100

-

-description

+

+description

Changes frame of reference from eulerian to lagrangian and sets the frequency for which the map from atoms to elements is reformed and all the attendant data is recalculated.

-

-restrictions

+

+restrictions

Cannot change map type after initialization.

-

-related

-

-default

+

+related

+

+default

lagrangian


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_atom_weight.html b/doc/src/USER/atc/man_atom_weight.html index 18b0dcae6e..28bc90fa01 100644 --- a/doc/src/USER/atc/man_atom_weight.html +++ b/doc/src/USER/atc/man_atom_weight.html @@ -7,24 +7,22 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC atom_weight

-syntax

+

fix_modify AtC atom_weight

+syntax

fix_modify AtC atom_weight <method> <arguments>

  • <method> =
    @@ -36,22 +34,22 @@ syntax read_in: list of values for atoms are read-in from specified file
-

-examples

+

+examples

fix_modify atc atom_weight constant myatoms 11.8
fix_modify atc atom_weight lattice
fix_modify atc atom_weight read-in atm_wt_file.txt

-

-description

+

+description

Command for assigning the value of atomic weights used for atomic integration in atom-continuum coupled simulations.

-

-restrictions

+

+restrictions

Use of lattice option requires a lattice type and parameter is already specified.

-

-related

-

-default

+

+related

+

+default

lattice


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_atomic_charge.html b/doc/src/USER/atc/man_atomic_charge.html index 718f8a433f..ef787f53ac 100644 --- a/doc/src/USER/atc/man_atomic_charge.html +++ b/doc/src/USER/atc/man_atomic_charge.html @@ -7,41 +7,39 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC atomic_charge

-syntax

+

fix_modify AtC atomic_charge

+syntax

fix_modify AtC <include | omit> atomic_charge

  • <include | omit> = switch to activiate/deactiviate inclusion of intrinsic atomic charge in ATC
-

-examples

+

+examples

fix_modify atc compute include atomic_charge

-

-description

+

+description

Determines whether AtC tracks the total charge as a finite element field

-

-restrictions

+

+restrictions

Required for: electrostatics

-

-related

-

-default

+

+related

+

+default

if the atom charge is defined, default is on, otherwise default is off


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary.html b/doc/src/USER/atc/man_boundary.html index 3e877355f1..61596d3b31 100644 --- a/doc/src/USER/atc/man_boundary.html +++ b/doc/src/USER/atc/man_boundary.html @@ -7,38 +7,36 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC boundary

-syntax

+

fix_modify AtC boundary

+syntax

fix_modify AtC boundary type <atom-type-id>

  • <atom-type-id> = type id for atoms that represent a ficticious boundary internal to the FE mesh
-

-examples

+

+examples

fix_modify AtC boundary type ghost_atoms

-

-description

+

+description

Command to define the atoms that represent the ficticious boundary internal to the FE mesh. For fully overlapped MD/FE domains with periodic boundary conditions no boundary atoms should be defined.

-

-restrictions

-

-default

+

+restrictions

+

+default

none


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary_dynamics.html b/doc/src/USER/atc/man_boundary_dynamics.html index 87696b8b43..40b82f3f61 100644 --- a/doc/src/USER/atc/man_boundary_dynamics.html +++ b/doc/src/USER/atc/man_boundary_dynamics.html @@ -7,36 +7,34 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC boundary_dynamics

-syntax

+

fix_modify AtC boundary_dynamics

+syntax

fix_modify AtC boundary_dynamics < on | damped_harmonic | prescribed | coupled | none > [args]

-

-description

+

+description

Sets different schemes for controlling boundary atoms. On will integrate the boundary atoms using the velocity-verlet algorithm. Damped harmonic uses a mass/spring/dashpot for the boundary atoms with added arguments of the damping and spring constants followed by the ratio of the boundary type mass to the desired mass. Prescribed forces the boundary atoms to follow the finite element displacement. Coupled does the same.

-

-restrictions

+

+restrictions

Boundary atoms must be specified. When using swaps between internal and boundary atoms, the initial configuration must have already correctly partitioned the two.

-

-related

-

-default

+

+related

+

+default

prescribed on


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary_faceset.html b/doc/src/USER/atc/man_boundary_faceset.html index 2e96330d6c..7eb950f78e 100644 --- a/doc/src/USER/atc/man_boundary_faceset.html +++ b/doc/src/USER/atc/man_boundary_faceset.html @@ -7,38 +7,36 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC boundary_faceset

-syntax

+

fix_modify AtC boundary_faceset

+syntax

fix_modify AtC boundary_faceset <is | add> [args]

-

-examples

+

+examples

fix_modify AtC boundary_faceset is obndy

-

-description

+

+description

This command species the faceset name when using a faceset to compute the MD/FE boundary fluxes. The faceset must already exist.

-

-restrictions

+

+restrictions

This is only valid when fe_md_boundary is set to faceset.

-

-related

-

-default

+

+related

+

+default


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_boundary_integral.html b/doc/src/USER/atc/man_boundary_integral.html index 3e78f12963..0663dba176 100644 --- a/doc/src/USER/atc/man_boundary_integral.html +++ b/doc/src/USER/atc/man_boundary_integral.html @@ -7,43 +7,41 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC output boundary_integral

-syntax

+

fix_modify AtC output boundary_integral

+syntax

fix_modify AtC output boundary_integral [field] faceset [name]

  • field (string) : name of hardy field
  • name (string) : name of faceset
-

-examples

+

+examples

fix_modify AtC output boundary_integral stress faceset loop1

-

-description

+

+description

Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file

-

-restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

-

-related

-

-default

+

+restrictions

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

+related

+

+default

none


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_consistent_fe_initialization.html b/doc/src/USER/atc/man_consistent_fe_initialization.html index f4c33f5076..a731b09116 100644 --- a/doc/src/USER/atc/man_consistent_fe_initialization.html +++ b/doc/src/USER/atc/man_consistent_fe_initialization.html @@ -7,41 +7,39 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC consistent_fe_initialization

-syntax

+

fix_modify AtC consistent_fe_initialization

+syntax

fix_modify AtC consistent_fe_initialization <on | off>

  • <on|off> = switch to activiate/deactiviate the initial setting of FE intrinsic field to match the projected MD field
-

-examples

+

+examples

fix_modify atc consistent_fe_initialization on

-

-description

+

+description

Determines whether AtC initializes FE intrinsic fields (e.g., temperature) to match the projected MD values. This is particularly useful for fully overlapping simulations.

-

-restrictions

+

+restrictions

Can be used with: thermal, two_temperature. Cannot be used with time filtering on. Does not include boundary nodes.

-

-related

-

-default

+

+related

+

+default

Default is off


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_contour_integral.html b/doc/src/USER/atc/man_contour_integral.html index c321605e88..690f0fcc98 100644 --- a/doc/src/USER/atc/man_contour_integral.html +++ b/doc/src/USER/atc/man_contour_integral.html @@ -7,44 +7,42 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC output contour_integral

-syntax

+

fix_modify AtC output contour_integral

+syntax

fix_modify AtC output contour_integral [field] faceset [name] <axis [x | y | z ]>

  • field (string) : name of hardy field
  • name (string) : name of faceset
  • axis (string) : x or y or z
-

-examples

+

+examples

fix_modify AtC output contour_integral stress faceset loop1

-

-description

+

+description

Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file

-

-restrictions

-

Must be used with the hardy/field type of AtC fix ( see fix atc command )

-

-related

-

-default

+

+restrictions

+

Must be used with the hardy/field type of AtC fix ( see fix atc command )

+

+related

+

+default

none


Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_control.html b/doc/src/USER/atc/man_control.html index af0236f30e..900952ba0b 100644 --- a/doc/src/USER/atc/man_control.html +++ b/doc/src/USER/atc/man_control.html @@ -7,24 +7,22 @@ +
+ LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
+ +
+ + -
-

fix_modify AtC control

-syntax

+

fix_modify AtC control

+syntax

fix_modify AtC control <physics_type> <solution_parameter>


@@ -46,22 +44,22 @@ syntax
  • tolerance (float) = relative tolerance to which matrix equations will be solved
  • -

    -examples

    +

    +examples

    fix_modify AtC control thermal max_iterations 10
    fix_modify AtC control momentum tolerance 1.e-5

    -

    -description

    +

    +description

    Sets the numerical parameters for the matrix solvers used in the specified control algorithm. Many solution approaches require iterative solvers, and these methods enable users to provide the maximum number of iterations and the relative tolerance.

    -

    -restrictions

    +

    +restrictions

    only for be used with specific controllers : thermal, momentum
    They are ignored if a lumped solution is requested

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    max_iterations is the number of rows in the matrix
    tolerance is 1.e-10

    diff --git a/doc/src/USER/atc/man_control_momentum.html b/doc/src/USER/atc/man_control_momentum.html index 805c12567a..8f4f486595 100644 --- a/doc/src/USER/atc/man_control_momentum.html +++ b/doc/src/USER/atc/man_control_momentum.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC control momentum

    -syntax

    +

    fix_modify AtC control momentum

    +syntax

    fix_modify AtC control momentum none

    fix_modify AtC control momentum rescale <frequency>
    @@ -44,21 +42,21 @@ syntax

  • face_set_id (string) = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation
  • -

    -examples

    +

    +examples

    fix_modify AtC control momentum glc_velocity
    fix_modify AtC control momentum flux faceset bndy_faces

    -

    -description

    -

    -restrictions

    +

    +description

    +

    +restrictions

    only to be used with specific transfers : elastic
    rescale not valid with time filtering activated

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_control_thermal.html b/doc/src/USER/atc/man_control_thermal.html index 301297f306..eab186f715 100644 --- a/doc/src/USER/atc/man_control_thermal.html +++ b/doc/src/USER/atc/man_control_thermal.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC control thermal

    -syntax

    +

    fix_modify AtC control thermal

    +syntax

    fix_modify AtC control thermal <control_type> <optional_args>

    • control_type (string) = none | rescale | hoover | flux
      @@ -46,25 +44,25 @@ syntax
    • face_set_id (string), optional = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation, does not work with interpolate
    -

    -examples

    +

    +examples

    fix_modify AtC control thermal none
    fix_modify AtC control thermal rescale 10
    fix_modify AtC control thermal hoover
    fix_modify AtC control thermal flux
    fix_modify AtC control thermal flux faceset bndy_faces

    -

    -description

    +

    +description

    Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms.

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers : thermal (rescale, hoover, flux), two_temperature (flux)
    rescale not valid with time filtering activated

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none
    rescale frequency is 1
    flux boundary_integration_type is interpolate

    diff --git a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html index 8a511019f9..a337a495e0 100644 --- a/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html +++ b/doc/src/USER/atc/man_control_thermal_correction_max_iterations.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC control thermal correction_max_iterations

    -syntax

    +

    fix_modify AtC control thermal correction_max_iterations

    +syntax

    fix_modify AtC control thermal correction_max_iterations <max_iterations>

    • max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers
    -

    -examples

    +

    +examples

    fix_modify AtC control thermal correction_max_iterations 10

    -

    -description

    +

    +description

    Sets the maximum number of iterations to compute the 2nd order in time correction term for lambda with the fractional step method. The method uses the same tolerance as the controller's matrix solver.

    -

    -restrictions

    +

    +restrictions

    only for use with thermal physics using the fractional step method.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    correction_max_iterations is 20


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_decomposition.html b/doc/src/USER/atc/man_decomposition.html index 15725073d3..d54a201034 100644 --- a/doc/src/USER/atc/man_decomposition.html +++ b/doc/src/USER/atc/man_decomposition.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC decomposition

    -syntax

    +

    fix_modify AtC decomposition

    +syntax

    fix_modify AtC decomposition <type>

    • <type> =
      @@ -32,20 +30,20 @@ syntax distributed_memory: only owned nodal information on processor
    -

    -examples

    +

    +examples

    fix_modify atc decomposition distributed_memory

    -

    -description

    +

    +description

    Command for assigning the distribution of work and memory for parallel runs.

    -

    -restrictions

    +

    +restrictions

    replicated_memory is appropriate for simulations were the number of nodes << number of atoms

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    replicated_memory


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_electron_integration.html b/doc/src/USER/atc/man_electron_integration.html index b14c14d86d..ab454c16d2 100644 --- a/doc/src/USER/atc/man_electron_integration.html +++ b/doc/src/USER/atc/man_electron_integration.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC extrinsic electron_integration

    -syntax

    +

    fix_modify AtC extrinsic electron_integration

    +syntax

    fix_modify AtC extrinsic electron_integration <integration_type> <num_subcyle_steps(optional)>

      @@ -32,20 +30,20 @@ syntax
    • num_subcycle_steps (int), optional = number of subcycle steps for the electron time integration
    -

    -examples

    +

    +examples

    fix_modify AtC extrinsic electron_integration implicit
    fix_modify AtC extrinsic electron_integration explicit 100

    -

    -description

    +

    +description

    Switches between integration scheme for the electron temperature. The number of subcyling steps used to integrate the electron temperature 1 LAMMPS timestep can be manually adjusted to capture fast electron dynamics.

    -

    -restrictions

    -

    For use only with two_temperature type of AtC fix ( see fix atc command )
    +

    +restrictions

    +

    For use only with two_temperature type of AtC fix ( see fix atc command )

    -

    -default

    +

    +default

    implicit
    subcycle_steps = 1

    diff --git a/doc/src/USER/atc/man_equilibrium_start.html b/doc/src/USER/atc/man_equilibrium_start.html index 3723cf98bf..d01253c4b3 100644 --- a/doc/src/USER/atc/man_equilibrium_start.html +++ b/doc/src/USER/atc/man_equilibrium_start.html @@ -7,40 +7,38 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC equilibrium_start

    -syntax

    +

    fix_modify AtC equilibrium_start

    +syntax

    fix_modify AtC equilibrium_start <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc equilibrium_start on

    -

    -description

    +

    +description

    Starts filtered calculations assuming they start in equilibrium, i.e. perfect finite element force balance.

    -

    -restrictions

    +

    +restrictions

    only needed before filtering is begun

    -

    -related

    +

    +related

    see fix_modify AtC filter

    -

    -default

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_extrinsic_exchange.html b/doc/src/USER/atc/man_extrinsic_exchange.html index 8f6533ad64..4f1f5962d9 100644 --- a/doc/src/USER/atc/man_extrinsic_exchange.html +++ b/doc/src/USER/atc/man_extrinsic_exchange.html @@ -7,40 +7,38 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC extrinsic exchange

    -syntax

    +

    fix_modify AtC extrinsic exchange

    +syntax

    fix_modify AtC extrinsic exchange <on|off>

    -

    -examples

    +

    +examples

    fix_modify AtC extrinsic exchange on

    -

    -description

    +

    +description

    Switches energy exchange between the MD system and electron system on and off

    -

    -restrictions

    +

    +restrictions

    Only valid for use with two_temperature type of AtC fix.

    -

    -related

    -

    see fix atc command

    -

    -default

    +

    +related

    +

    see fix atc command

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fe_md_boundary.html b/doc/src/USER/atc/man_fe_md_boundary.html index 06bca2b337..e517dd4855 100644 --- a/doc/src/USER/atc/man_fe_md_boundary.html +++ b/doc/src/USER/atc/man_fe_md_boundary.html @@ -7,40 +7,38 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC fe_md_boundary

    -syntax

    +

    fix_modify AtC fe_md_boundary

    +syntax

    fix_modify AtC fe_md_boundary <faceset | interpolate | no_boundary> [args]

    -

    -examples

    +

    +examples

    fix_modify atc fe_md_boundary interpolate

    -

    -description

    +

    +description

    Specifies different methods for computing fluxes between between the MD and FE integration regions. Faceset defines a faceset separating the MD and FE regions and uses finite element face quadrature to compute the flux. Interpolate uses a reconstruction scheme to approximate the flux, which is more robust but less accurate if the MD/FE boundary does correspond to a faceset. No boundary results in no fluxes between the systems being computed.

    -

    -restrictions

    +

    +restrictions

    If faceset is used, all the AtC non-boundary atoms must lie within and completely fill the domain enclosed by the faceset.

    -

    -related

    +

    +related

    see for how to specify the faceset name.

    -

    -default

    +

    +default

    Interpolate.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fem_mesh.html b/doc/src/USER/atc/man_fem_mesh.html index 2abd84d6ce..b8ba584816 100644 --- a/doc/src/USER/atc/man_fem_mesh.html +++ b/doc/src/USER/atc/man_fem_mesh.html @@ -1,24 +1,45 @@ - - + + + + ATC: fix_modify AtC fem create mesh - - - -

    fix_modify AtC fem create mesh

    -syntax

    + + + + +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + + +
    + +

    fix_modify AtC fem create mesh

    +syntax

    fix_modify AtC fem create mesh <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>
    • nx ny nz = number of elements in x, y, z
    • region-id = id of region that is to be meshed
    • f p p = perioidicity flags for x, y, z
    -

    -examples

    - fix_modify AtC fem create mesh 10 1 1 feRegion p p p

    -description

    -Creates a uniform mesh in a rectangular region

    -restrictions

    -creates only uniform rectangular grids in a rectangular region

    -related

    -

    -default

    -none
    Generated on Mon Aug 17 09:35:16 2009 for ATC by  +

    +examples

    +

    fix_modify AtC fem create mesh 10 1 1 feRegion p p p
    +

    +

    +description

    +

    Creates a uniform mesh in a rectangular region

    +

    +restrictions

    +

    creates only uniform rectangular grids in a rectangular region

    +

    +related

    +

    +default

    +none +
    Generated on Mon Aug 17 09:35:16 2009 for ATC by  doxygen 1.3.9.1
    diff --git a/doc/src/USER/atc/man_filter_scale.html b/doc/src/USER/atc/man_filter_scale.html index 975f87e949..7a871f5c81 100644 --- a/doc/src/USER/atc/man_filter_scale.html +++ b/doc/src/USER/atc/man_filter_scale.html @@ -7,45 +7,43 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC filter scale

    -syntax

    +

    fix_modify AtC filter scale

    +syntax

    fix_modify AtC filter scale <scale>

    • scale (real) = characteristic time scale of the filter
    -

    -examples

    +

    +examples

    fix_modify AtC filter scale 10.0

    -

    -description

    +

    +description

    Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers: thermal, two_temperature

    -

    -related

    +

    +related

    fix_modify AtC filter fix_modify AtC filter type

    -

    -default

    +

    +default

    0.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_filter_type.html b/doc/src/USER/atc/man_filter_type.html index 8d9dbd3d12..2711d128e9 100644 --- a/doc/src/USER/atc/man_filter_type.html +++ b/doc/src/USER/atc/man_filter_type.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC filter type

    -syntax

    +

    fix_modify AtC filter type

    +syntax

    fix_modify AtC filter type <exponential | step | no_filter>

    -

    -examples

    +

    +examples

    fix_modify AtC filter type exponential

    -

    -description

    +

    +description

    Specifies the type of time filter used.

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers: thermal, two_temperature

    -

    -related

    +

    +related

    fix_modify AtC filter fix_modify AtC filter scale

    -

    -default

    +

    +default

    No default.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fix_atc.html b/doc/src/USER/atc/man_fix_atc.html index e710c28ed2..7cc6cfea5b 100644 --- a/doc/src/USER/atc/man_fix_atc.html +++ b/doc/src/USER/atc/man_fix_atc.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix atc command

    -syntax

    +

    fix atc command

    +syntax

    fix <fixID> <group> atc <type> <parameter_file>

    • fixID = name of fix
    • @@ -38,15 +36,15 @@ syntax
    • parameter_file = name of the file with material parameters.
      note: Neither hardy nor field requires a parameter file
    -

    -examples

    +

    +examples

    fix AtC internal atc thermal Ar_thermal.dat
    fix AtC internal atc two_temperature Ar_ttm.mat
    fix AtC internal atc hardy
    fix AtC internal atc field

    -

    -description

    +

    +description

    This fix is the beginning to creating a coupled FE/MD simulation and/or an on-the-fly estimation of continuum fields. The coupled versions of this fix do Verlet integration and the /post-processing does not. After instantiating this fix, several other fix_modify commands will be needed to set up the problem, e.g. define the finite element mesh and prescribe initial and boundary conditions.

    The following coupling example is typical, but non-exhaustive:

    @@ -134,16 +132,16 @@ description

    Please refer to the standard finite element (FE) texts, e.g. T.J.R Hughes The finite element method , Dover 2003, for the basics of FE simulation.

    -

    -restrictions

    +

    +restrictions

    Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc.

    Currently,

    • the coupling is restricted to thermal physics
    • the FE computations are done in serial on each processor.
    -

    -related

    +

    +related

    fix_modify commands for setup:

    Note: a set of example input files with the attendant material files are included with this package

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fix_flux.html b/doc/src/USER/atc/man_fix_flux.html index d8369a8785..42815def6b 100644 --- a/doc/src/USER/atc/man_fix_flux.html +++ b/doc/src/USER/atc/man_fix_flux.html @@ -7,44 +7,42 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC fix_flux

    -syntax

    +

    fix_modify AtC fix_flux

    +syntax

    fix_modify AtC fix_flux <field> <face_set> <value | function>

    • <field> = field name valid for type of physics, temperature | electron_temperature
    • <face_set> = name of set of element faces
    -

    -examples

    +

    +examples

    fix_modify atc fix_flux temperature faceSet 10.0

    -

    -description

    +

    +description

    Command for fixing normal fluxes e.g. heat_flux. This command only prescribes the normal component of the physical flux, e.g. heat (energy) flux. The units are in AtC units, i.e. derived from the LAMMPS length, time, and mass scales.

    -

    -restrictions

    +

    +restrictions

    Only normal fluxes (Neumann data) can be prescribed.

    -

    -related

    +

    +related

    see fix_modify AtC unfix_flux

    -

    -default

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_fix_nodes.html b/doc/src/USER/atc/man_fix_nodes.html index cf5c93590a..03cf86eb92 100644 --- a/doc/src/USER/atc/man_fix_nodes.html +++ b/doc/src/USER/atc/man_fix_nodes.html @@ -7,46 +7,44 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC fix

    -syntax

    +

    fix_modify AtC fix

    +syntax

    fix_modify AtC fix <field> <nodeset> <constant | function>

    • <field> = field name valid for type of physics
    • <nodeset> = name of set of nodes to apply boundary condition
    • <constant | function> = value or name of function followed by its parameters
    -

    -examples

    +

    +examples

    fix_modify AtC fix temperature groupNAME 10.
    fix_modify AtC fix temperature groupNAME 0 0 0 10.0 0 0 1.0

    -

    -description

    +

    +description

    Creates a constraint on the values of the specified field at specified nodes.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in nodeset name

    -

    -related

    +

    +related

    see fix_modify AtC unfix

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_computes.html b/doc/src/USER/atc/man_hardy_computes.html index c16550742b..b45b7dfb01 100644 --- a/doc/src/USER/atc/man_hardy_computes.html +++ b/doc/src/USER/atc/man_hardy_computes.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC computes

    -syntax

    +

    fix_modify AtC computes

    +syntax

    fix_modify AtC computes <add | delete> [per-atom compute id] <volume | number>

      @@ -35,8 +33,8 @@ syntax
    • volume | number (keyword) = field created is a per-unit-volume quantity or a per-atom quantity as weighted by kernel functions
    -

    -examples

    +

    +examples

    compute virial all stress/atom
    fix_modify AtC computes add virial volume
    fix_modify AtC computes delete virial
    @@ -44,20 +42,20 @@ examples compute centrosymmetry all centro/atom
    fix_modify AtC computes add centrosymmetry number

    -

    -description

    +

    +description

    Calculates continuum fields corresponding to specified per-atom computes created by LAMMPS

    -

    -restrictions

    -

    Must be used with the hardy/field type of AtC fix ( see fix atc command )
    +

    +restrictions

    +

    Must be used with the hardy/field type of AtC fix ( see fix atc command )
    Per-atom compute must be specified before corresponding continuum field can be requested

    -

    -related

    +

    +related

    See manual page for compute

    -

    -default

    +

    +default

    No defaults exist for this command


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_fields.html b/doc/src/USER/atc/man_hardy_fields.html index 1f55fd5e37..17903aabd0 100644 --- a/doc/src/USER/atc/man_hardy_fields.html +++ b/doc/src/USER/atc/man_hardy_fields.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC fields

    -syntax

    +

    fix_modify AtC fields

    +syntax

    fix_modify AtC fields <all | none>
    fix_modify AtC fields <add | delete> <list_of_fields>

    @@ -56,24 +54,24 @@ syntax type_concentration: volume fraction of a specific atom type
    -

    -examples

    +

    +examples

    fix_modify AtC fields add velocity temperature

    -

    -description

    +

    +description

    Allows modification of the fields calculated and output by the transfer class. The commands are cumulative, e.g.
    fix_modify AtC fields none
    followed by
    fix_modify AtC fields add velocity temperature
    will only output the velocity and temperature fields.

    -

    -restrictions

    -

    Must be used with the hardy/field type of AtC fix, see fix atc command. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber.

    -

    -related

    +

    +restrictions

    +

    Must be used with the hardy/field type of AtC fix, see fix atc command. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber.

    +

    +related

    See fix_modify AtC gradients , fix_modify AtC rates and fix_modify AtC computes

    -

    -default

    +

    +default

    By default, no fields are output


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_gradients.html b/doc/src/USER/atc/man_hardy_gradients.html index 708fecbca1..00935f0ae2 100644 --- a/doc/src/USER/atc/man_hardy_gradients.html +++ b/doc/src/USER/atc/man_hardy_gradients.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC gradients

    -syntax

    +

    fix_modify AtC gradients

    +syntax

    fix_modify AtC gradients <add | delete> <list_of_fields>

      @@ -33,21 +31,21 @@ syntax
    • fields (keyword) =
      gradients can be calculated for all fields listed in fix_modify AtC fields
    -

    -examples

    +

    +examples

    fix_modify AtC gradients add temperature velocity stress
    fix_modify AtC gradients delete velocity

    -

    -description

    +

    +description

    Requests calculation and ouput of gradients of the fields from the transfer class. These gradients will be with regard to spatial or material coordinate for eulerian or lagrangian analysis, respectively, as specified by atom_element_map (see fix_modify AtC atom_element_map )

    -

    -restrictions

    -

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +restrictions

    +

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    +

    +related

    +

    +default

    No gradients are calculated by default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_kernel.html b/doc/src/USER/atc/man_hardy_kernel.html index 3d81b367dd..f97037784c 100644 --- a/doc/src/USER/atc/man_hardy_kernel.html +++ b/doc/src/USER/atc/man_hardy_kernel.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC kernel

    -syntax

    +

    fix_modify AtC kernel

    +syntax

    fix_modify AtC kernel <type> <parameters>

    • type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere
      @@ -40,22 +38,22 @@ syntax quartic_sphere = radius (double)
    -

    -examples

    +

    +examples

    fix_modify AtC kernel cell 1.0 1.0 1.0
    fix_modify AtC kernel quartic_sphere 10.0

    -

    -description

    -

    -restrictions

    +

    +description

    +

    +restrictions

    Must be used with the hardy AtC fix
    For bar kernel types, half-width oriented along x-direction
    For cylinder kernel types, cylindrical axis is assumed to be in z-direction
    - ( see fix atc command )

    -

    -related

    -

    -default

    + ( see fix atc command )

    +

    +related

    +

    +default

    No default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_hardy_on_the_fly.html b/doc/src/USER/atc/man_hardy_on_the_fly.html index d140cf6840..79c1006c97 100644 --- a/doc/src/USER/atc/man_hardy_on_the_fly.html +++ b/doc/src/USER/atc/man_hardy_on_the_fly.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC on_the_fly

    -syntax

    +

    fix_modify AtC on_the_fly

    +syntax

    fix_modify AtC on_the_fly <bond | kernel> <optional on | off>
    - bond | kernel (keyword) = specifies on-the-fly calculation of bond or kernel matrix elements

    @@ -32,24 +30,24 @@ syntax
  • on | off (keyword) = activate or discontinue on-the-fly mode
  • -

    -examples

    +

    +examples

    fix_modify AtC on_the_fly bond on
    fix_modify AtC on_the_fly kernel
    fix_modify AtC on_the_fly kernel off

    -

    -description

    +

    +description

    Overrides normal mode of pre-calculating and storing bond pair-to-node a nd kernel atom-to-node matrices. If activated, will calculate elements of t hese matrices during repeated calls of field computations (i.e. "on-the-fly") and not store them for future use.
    on flag is optional - if omitted, on_the_fly will be activated for the s pecified matrix. Can be deactivated using off flag.

    -

    -restrictions

    -

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +restrictions

    +

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    +

    +related

    +

    +default

    By default, on-the-fly calculation is not active (i.e. off). However, code does a memory allocation check to determine if it can store all needed bond and kernel matrix ele ments. If this allocation fails, on-the-fly is activated.

    diff --git a/doc/src/USER/atc/man_hardy_rates.html b/doc/src/USER/atc/man_hardy_rates.html index ab0315cb65..e51cbc9873 100644 --- a/doc/src/USER/atc/man_hardy_rates.html +++ b/doc/src/USER/atc/man_hardy_rates.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC rates

    -syntax

    +

    fix_modify AtC rates

    +syntax

    fix_modify AtC rates <add | delete> <list_of_fields>

      @@ -33,22 +31,22 @@ syntax
    • fields (keyword) =
      rates can be calculated for all fields listed in fix_modify AtC fields
    -

    -examples

    +

    +examples

    fix_modify AtC rates add temperature velocity stress
    fix_modify AtC rates delete stress

    -

    -description

    +

    +description

    Requests calculation and ouput of rates (time derivatives) of the fields from the transfer class. For eulerian analysis (see fix_modify AtC atom_element_map ), these rates are the partial time derivatives of the nodal fields, not the full (material) time derivatives.

    -

    -restrictions

    -

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +restrictions

    +

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    +

    +related

    +

    +default

    No rates are calculated by default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_initial.html b/doc/src/USER/atc/man_initial.html index c0a0be3852..41ae06eb8c 100644 --- a/doc/src/USER/atc/man_initial.html +++ b/doc/src/USER/atc/man_initial.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC initial

    -syntax

    +

    fix_modify AtC initial

    +syntax

    fix_modify AtC initial <field> <nodeset> <constant | function>

    • <field> = field name valid for type of physics, temperature | electron_temperature
    • <nodeset> = name of set of nodes to apply initial condition
    • <constant | function> = value or name of function followed by its parameters
    -

    -examples

    +

    +examples

    fix_modify atc initial temperature groupNAME 10.

    -

    -description

    +

    +description

    Sets the initial values for the specified field at the specified nodes.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in nodeset name

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_internal_atom_integrate.html b/doc/src/USER/atc/man_internal_atom_integrate.html index b15bf71aad..dfa19474e5 100644 --- a/doc/src/USER/atc/man_internal_atom_integrate.html +++ b/doc/src/USER/atc/man_internal_atom_integrate.html @@ -7,30 +7,28 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC internal_atom_integrate

    -syntax

    +

    fix_modify AtC internal_atom_integrate

    +syntax

    fix_modify AtC internal_atom_integrate <on | off> fix_modify AtC internal_atom_integrate on

    -

    -description

    +

    +description

    Has AtC perform time integration for the atoms in the group on which it operates. This does not include boundary atoms.

    -

    -default

    +

    +default

    on for coupling methods, off for post-processors off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_internal_element_set.html b/doc/src/USER/atc/man_internal_element_set.html index 31bee57860..849e8f0671 100644 --- a/doc/src/USER/atc/man_internal_element_set.html +++ b/doc/src/USER/atc/man_internal_element_set.html @@ -7,42 +7,40 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC internal_element_set

    -syntax

    +

    fix_modify AtC internal_element_set

    +syntax

    fix_modify AtC internal_element_set <element-set-name>

    • <element-set-name> = name of element set defining internal region, or off
    -

    -examples

    +

    +examples

    fix_modify AtC internal_element_set myElementSet fix_modify AtC internal_element_set off

    -

    -description

    +

    +description

    Enables AtC to base the region for internal atoms to be an element set. If no ghost atoms are used, all the AtC atoms must be constrained to remain in this element set by the user, e.g., with walls. If boundary atoms are used in conjunction with Eulerian atom maps AtC will partition all atoms of a boundary or internal type to be of type internal if they are in the internal region or to be of type boundary otherwise.

    -

    -restrictions

    +

    +restrictions

    If boundary atoms are used in conjunction with Eulerian atom maps, the Eulerian reset frequency must be an integer multiple of the Lammps reneighbor frequency

    -

    -related

    +

    +related

    see atom_element_map_type and boundary

    -

    -default

    +

    +default

    off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_internal_quadrature.html b/doc/src/USER/atc/man_internal_quadrature.html index 172187c298..7f10e17076 100644 --- a/doc/src/USER/atc/man_internal_quadrature.html +++ b/doc/src/USER/atc/man_internal_quadrature.html @@ -7,40 +7,38 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC internal_quadrature

    -syntax

    +

    fix_modify AtC internal_quadrature

    +syntax

    fix_modify atc internal_quadrature <on | off> [region]

    -

    -examples

    +

    +examples

    fix_modify atc internal_quadrature off

    -

    -description

    +

    +description

    Command to use or not use atomic quadrature on internal elements fully filled with atoms. By turning the internal quadrature off these elements do not contribute to the governing PDE and the fields at the internal nodes follow the weighted averages of the atomic data.

    -

    -optional

    +

    +optional

    Optional region tag specifies which finite element nodes will be treated as being within the MD region. This option is only valid with internal_quadrature off.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_kernel_function.html b/doc/src/USER/atc/man_kernel_function.html index 08ec827dec..92db590198 100644 --- a/doc/src/USER/atc/man_kernel_function.html +++ b/doc/src/USER/atc/man_kernel_function.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC kernel

    -syntax

    +

    fix_modify AtC kernel

    +syntax

    fix_modify AtC kernel <type> <parameters>

    • type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere
      @@ -40,21 +38,21 @@ syntax quartic_sphere = radius (double)
    -

    -examples

    +

    +examples

    fix_modify AtC kernel cell 1.0 1.0 1.0 fix_modify AtC kernel quartic_sphere 10.0

    -

    -description

    -

    -restrictions

    +

    +description

    +

    +restrictions

    Must be used with the hardy AtC fix
    For bar kernel types, half-width oriented along x-direction
    For cylinder kernel types, cylindrical axis is assumed to be in z-direction
    - ( see fix atc command )

    -

    -related

    -

    -default

    + ( see fix atc command )

    +

    +related

    +

    +default

    No default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_localized_lambda.html b/doc/src/USER/atc/man_localized_lambda.html index 5dadb9d730..fd845d0a71 100644 --- a/doc/src/USER/atc/man_localized_lambda.html +++ b/doc/src/USER/atc/man_localized_lambda.html @@ -7,38 +7,36 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC control localized_lambda

    -syntax

    +

    fix_modify AtC control localized_lambda

    +syntax

    fix_modify AtC control localized_lambda <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc control localized_lambda on

    -

    -description

    +

    +description

    Turns on localization algorithms for control algorithms to restrict the influence of FE coupling or boundary conditions to a region near the boundary of the MD region. Control algorithms will not affect atoms in elements not possessing faces on the boundary of the region. Flux-based control is localized via row-sum lumping while quantity control is done by solving a truncated matrix equation.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    Default is off.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_lumped_lambda_solve.html b/doc/src/USER/atc/man_lumped_lambda_solve.html index bb3f8cfde8..ade780ddee 100644 --- a/doc/src/USER/atc/man_lumped_lambda_solve.html +++ b/doc/src/USER/atc/man_lumped_lambda_solve.html @@ -7,38 +7,36 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC control lumped_lambda_solve

    -syntax

    +

    fix_modify AtC control lumped_lambda_solve

    +syntax

    fix_modify AtC control lumped_lambda_solve <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc control lumped_lambda_solve on

    -

    -description

    +

    +description

    Command to use or not use lumped matrix for lambda solve

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mask_direction.html b/doc/src/USER/atc/man_mask_direction.html index 01ca9d192b..31c18b4f1f 100644 --- a/doc/src/USER/atc/man_mask_direction.html +++ b/doc/src/USER/atc/man_mask_direction.html @@ -7,38 +7,36 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC control mask_direction

    -syntax

    +

    fix_modify AtC control mask_direction

    +syntax

    fix_modify AtC control mask_direction <direction> <on|off>

    -

    -examples

    +

    +examples

    fix_modify atc control mask_direction 0 on

    -

    -description

    +

    +description

    Command to mask out certain dimensions from the atomic regulator

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mass_matrix.html b/doc/src/USER/atc/man_mass_matrix.html index 5f543fc20c..140b745f09 100644 --- a/doc/src/USER/atc/man_mass_matrix.html +++ b/doc/src/USER/atc/man_mass_matrix.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mass_matrix

    -syntax

    +

    fix_modify AtC mass_matrix

    +syntax

    fix_modify AtC mass_matrix <fe | md_fe>

    • <fe | md_fe> = activiate/deactiviate using the FE mass matrix in the MD region
    -

    -examples

    +

    +examples

    fix_modify atc mass_matrix fe

    -

    -description

    +

    +description

    Determines whether AtC uses the FE mass matrix based on Gaussian quadrature or based on atomic quadrature in the MD region. This is useful for fully overlapping simulations to improve efficiency.

    -

    -restrictions

    +

    +restrictions

    Should not be used unless the FE region is contained within the MD region, otherwise the method will be unstable and inaccurate

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Default is off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_material.html b/doc/src/USER/atc/man_material.html index 9867e90f77..c31ab4938d 100644 --- a/doc/src/USER/atc/man_material.html +++ b/doc/src/USER/atc/man_material.html @@ -7,39 +7,37 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC material

    -syntax

    +

    fix_modify AtC material

    +syntax

    fix_modify AtC material [elementset_name] [material_id]

    -

    -examples

    +

    +examples

    fix_modify AtC material gap_region 2

    -

    -description

    +

    +description

    Sets the material model in elementset_name to be of type material_id.

    -

    -restrictions

    +

    +restrictions

    The element set must already be created and the material must be specified in the material file given the the atc fix on construction

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    All elements default to the first material in the material file.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_add_to_nodeset.html b/doc/src/USER/atc/man_mesh_add_to_nodeset.html index cf5ad52f60..25a5c2cdae 100644 --- a/doc/src/USER/atc/man_mesh_add_to_nodeset.html +++ b/doc/src/USER/atc/man_mesh_add_to_nodeset.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh add_to_nodeset

    -syntax

    +

    fix_modify AtC mesh add_to_nodeset

    +syntax

    fix_modify AtC mesh add_to_nodeset <id> <xmin> <xmax> <ymin> <ymax> <zmin> <zmax>

    • <id> = id of FE nodeset to be added to
    • <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of the bounding box that contains the desired nodes to be added
    -

    -examples

    +

    +examples

    fix_modify AtC mesh add_to_nodeset lbc -11.9 -11 -12 12 -12 12

    -

    -description

    +

    +description

    Command to add nodes to an already existing FE nodeset.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    Coordinates are assumed to be in lattice units.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create.html b/doc/src/USER/atc/man_mesh_create.html index efaf7f4307..a7ee112614 100644 --- a/doc/src/USER/atc/man_mesh_create.html +++ b/doc/src/USER/atc/man_mesh_create.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh create

    -syntax

    +

    fix_modify AtC mesh create

    +syntax

    fix_modify AtC mesh create <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>

      @@ -32,21 +30,21 @@ syntax
    • region-id = id of region that is to be meshed
    • f p p = periodicity flags for x, y, z
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create 10 1 1 feRegion p p p

    -

    -description

    +

    +description

    Creates a uniform mesh in a rectangular region

    -

    -restrictions

    +

    +restrictions

    Creates only uniform rectangular grids in a rectangular region

    -

    -related

    +

    +related

    fix_modify AtC mesh quadrature

    -

    -default

    +

    +default

    When created, mesh defaults to gauss2 (2-point Gaussian) quadrature. Use "mesh quadrature" command to change quadrature style.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_elementset.html b/doc/src/USER/atc/man_mesh_create_elementset.html index 51bdae4faa..2ac383a974 100644 --- a/doc/src/USER/atc/man_mesh_create_elementset.html +++ b/doc/src/USER/atc/man_mesh_create_elementset.html @@ -7,42 +7,40 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh create_elementset

    -syntax

    +

    fix_modify AtC mesh create_elementset

    +syntax

    fix_modify AtC create_elementset <id> <xmin> <xmax> <ymin> <ymax> <zmin> <zmax>

    • <id> = id to assign to the collection of FE element
    • <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of the bounding box that contains only the desired elements
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_elementset middle -4.1 4.1 -100 100 -100 1100

    -

    -description

    +

    +description

    Command to assign an id to a set of FE elements to be used subsequently in defining material and mesh-based operations.

    -

    -restrictions

    +

    +restrictions

    Only viable for rectangular grids.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Coordinates are assumed to be in lattice units.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_faceset_box.html b/doc/src/USER/atc/man_mesh_create_faceset_box.html index 163a6b442c..e62a827a78 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_box.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_box.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh create_faceset box

    -syntax

    +

    fix_modify AtC mesh create_faceset box

    +syntax

    fix_modify AtC mesh create_faceset <id> box <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> <in|out> [units]

    • <id> = id to assign to the collection of FE faces
    • @@ -32,19 +30,19 @@ syntax
    • <in|out> = "in" gives inner faces to the box, "out" gives the outer faces to the box
    • units = option to specify real as opposed to lattice units
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 out

    -

    -description

    +

    +description

    Command to assign an id to a set of FE faces.

    -

    -restrictions

    +

    +restrictions

    Only viable for rectangular grids.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    The default options are units = lattice and the use of outer faces


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_faceset_plane.html b/doc/src/USER/atc/man_mesh_create_faceset_plane.html index 3ca1108d1a..b1969cb79d 100644 --- a/doc/src/USER/atc/man_mesh_create_faceset_plane.html +++ b/doc/src/USER/atc/man_mesh_create_faceset_plane.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh create_faceset plane

    -syntax

    +

    fix_modify AtC mesh create_faceset plane

    +syntax

    fix_modify AtC mesh create_faceset <id> plane <x|y|z> <val1> <x|y|z> <lval2> <uval2> [units]

    • <id> = id to assign to the collection of FE faces
    • @@ -32,19 +30,19 @@ syntax
    • <val1>,<lval2>,<uval2> = plane is specified as the x|y|z=val1 plane bounded by the segments x|y|z = [lval2,uval2]
    • units = option to specify real as opposed to lattice units
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_faceset xyplane plane y 0 x -4 0

    -

    -description

    +

    +description

    Command to assign an id to a set of FE faces.

    -

    -restrictions

    +

    +restrictions

    Only viable for rectangular grids.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    The default option is units = lattice.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_create_nodeset.html b/doc/src/USER/atc/man_mesh_create_nodeset.html index 9d5d155654..39bfffd119 100644 --- a/doc/src/USER/atc/man_mesh_create_nodeset.html +++ b/doc/src/USER/atc/man_mesh_create_nodeset.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh create_nodeset

    -syntax

    +

    fix_modify AtC mesh create_nodeset

    +syntax

    fix_modify AtC mesh create_nodeset <id> <xmin> <xmax> <ymin> <ymax> <zmin> <zmax>

    • <id> = id to assign to the collection of FE nodes
    • <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of the bounding box that contains only the desired nodes
    -

    -examples

    +

    +examples

    fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12

    -

    -description

    +

    +description

    Command to assign an id to a set of FE nodes to be used subsequently in defining boundary conditions.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    Coordinates are assumed to be in lattice units.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_delete_elements.html b/doc/src/USER/atc/man_mesh_delete_elements.html index cc269c8e65..60a2fe59a1 100644 --- a/doc/src/USER/atc/man_mesh_delete_elements.html +++ b/doc/src/USER/atc/man_mesh_delete_elements.html @@ -7,40 +7,38 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh delete_elements

    -syntax

    +

    fix_modify AtC mesh delete_elements

    +syntax

    fix_modify AtC mesh delete_elements <element_set>

    • <element_set> = name of an element set
    -

    -examples

    +

    +examples

    fix_modify AtC delete_elements gap

    -

    -description

    +

    +description

    Deletes a group of elements from the mesh.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html index 45d03fc986..d05429ebab 100644 --- a/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html +++ b/doc/src/USER/atc/man_mesh_nodeset_to_elementset.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh nodeset_to_elementset

    -syntax

    +

    fix_modify AtC mesh nodeset_to_elementset

    +syntax

    fix_modify AtC nodeset_to_elementset <nodeset_id> <elementset_id> <max/min>

    • <nodeset_id> = id of desired nodeset from which to create elementset
    • <elementset_id> = id to assign to the collection of FE element
    • <max/min> = flag to choose either the maximal or minimal elementset
    -

    -examples

    +

    +examples

    fix_modify AtC mesh nodeset_to_elementset myNodeset myElementset min

    -

    -description

    +

    +description

    Command to create an elementset from an existing nodeset. Either the minimal element set of elements with all nodes in the set, or maximal element set with all elements with at least one node in the set, can be created

    -

    -restrictions

    +

    +restrictions

    None.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Unless specified, the maximal element set is created


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_output.html b/doc/src/USER/atc/man_mesh_output.html index be1b4c194f..f768a29c41 100644 --- a/doc/src/USER/atc/man_mesh_output.html +++ b/doc/src/USER/atc/man_mesh_output.html @@ -7,39 +7,37 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh output

    -syntax

    +

    fix_modify AtC mesh output

    +syntax

    fix_modify AtC mesh output <file_prefix>

    -

    -examples

    +

    +examples

    fix_modify AtC mesh output meshData

    -

    -description

    +

    +description

    Command to output mesh and associated data: nodesets, facesets, and elementsets. This data is only output once upon initialization since currently the mesh is static. Creates (binary, "gold" format) Ensight output of mesh data.

    -

    -restrictions

    +

    +restrictions

    none

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_quadrature.html b/doc/src/USER/atc/man_mesh_quadrature.html index d5291d99db..46487fdce7 100644 --- a/doc/src/USER/atc/man_mesh_quadrature.html +++ b/doc/src/USER/atc/man_mesh_quadrature.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh quadrature

    -syntax

    +

    fix_modify AtC mesh quadrature

    +syntax

    fix_modify AtC mesh quadrature <quad>

    • quad = one of <nodal|gauss1|gauss2|gauss3|face> --- when a mesh is created it defaults to gauss2, use this call to change it after the fact
    -

    -examples

    +

    +examples

    fix_modify AtC mesh quadrature face

    -

    -description

    +

    +description

    (Re-)assigns the quadrature style for the existing mesh.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    fix_modify AtC mesh create

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_read.html b/doc/src/USER/atc/man_mesh_read.html index a497a2ed04..e0571ccf88 100644 --- a/doc/src/USER/atc/man_mesh_read.html +++ b/doc/src/USER/atc/man_mesh_read.html @@ -7,42 +7,40 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh read

    -syntax

    +

    fix_modify AtC mesh read

    +syntax

    fix_modify AtC mesh read <filename> <f|p> <f|p> <f|p>

    • filename = name of file containing mesh to be read
    • f p p = periodicity flags for x, y, z
    -

    -examples

    +

    +examples

    fix_modify AtC mesh read myComponent.mesh p p p
    fix_modify AtC mesh read myOtherComponent.exo

    -

    -description

    +

    +description

    Reads a mesh from a text or exodus file, and assigns periodic boundary conditions if needed.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    periodicity flags are false by default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_mesh_write.html b/doc/src/USER/atc/man_mesh_write.html index 21754a1e68..756cf49922 100644 --- a/doc/src/USER/atc/man_mesh_write.html +++ b/doc/src/USER/atc/man_mesh_write.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC mesh write

    -syntax

    +

    fix_modify AtC mesh write

    +syntax

    fix_modify AtC mesh write <filename>

    • filename = name of file to write mesh
    -

    -examples

    +

    +examples

    fix_modify AtC mesh write myMesh.mesh

    -

    -description

    +

    +description

    Writes a mesh to a text file.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_momentum_time_integration.html b/doc/src/USER/atc/man_momentum_time_integration.html index 3b987f70ef..60fbfcd888 100644 --- a/doc/src/USER/atc/man_momentum_time_integration.html +++ b/doc/src/USER/atc/man_momentum_time_integration.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC time_integration (momentum)

    -syntax

    +

    fix_modify AtC time_integration (momentum)

    +syntax

    fix_modify AtC time_integration <descriptor>

      @@ -33,24 +31,24 @@ syntax

    various time integration methods for the finite elements

    -

    -description

    +

    +description

    verlet - atomic velocity update with 2nd order Verlet, nodal temperature update with 2nd order Verlet, kinetostats based on controlling force
    fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal momentum update, 2nd order Verlet for continuum and exact 2nd order Verlet for atomic contributions, kinetostats based on controlling discrete momentum changes
    gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, kinetostats based on controlling power

    -

    -examples

    +

    +examples

    fix_modify atc time_integration verlet
    fix_modify atc time_integration fractional_step

    -

    -description

    -

    -related

    -

    see fix atc command

    -

    -default

    +

    +description

    +

    +related

    +

    see fix atc command

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_output.html b/doc/src/USER/atc/man_output.html index 3129ff30c9..aec1d5d55a 100644 --- a/doc/src/USER/atc/man_output.html +++ b/doc/src/USER/atc/man_output.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC output

    -syntax

    +

    fix_modify AtC output

    +syntax

    fix_modify AtC output <filename_prefix> <frequency> [text | full_text | binary | vector_components | tensor_components ] fix_modify AtC output index [step | time ]

    • filename_prefix (string) = prefix for data files
    • @@ -37,23 +35,23 @@ syntax tensor_components = outputs tensor as scalar components (use this for Paraview)
    -

    -examples

    +

    +examples

    fix_modify AtC output heatFE 100
    fix_modify AtC output hardyFE 1 text tensor_components
    fix_modify AtC output hardyFE 10 text binary tensor_components
    fix_modify AtC output index step

    -

    -description

    +

    +description

    Creates text and/or binary (Ensight, "gold" format) output of nodal/mesh data which is transfer/physics specific. Output indexed by step or time is possible.

    -

    -restrictions

    -

    -related

    -

    see fix atc command

    -

    -default

    +

    +restrictions

    +

    +related

    +

    see fix atc command

    +

    +default

    no default format output indexed by time


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_output_elementset.html b/doc/src/USER/atc/man_output_elementset.html index be259388ba..54079027c5 100644 --- a/doc/src/USER/atc/man_output_elementset.html +++ b/doc/src/USER/atc/man_output_elementset.html @@ -7,44 +7,42 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC output elementset

    -syntax

    +

    fix_modify AtC output elementset

    +syntax

    fix_modify AtC output volume_integral <eset_name> <field> {`

    • set_name (string) = name of elementset to be integrated over
    • fieldname (string) = name of field to integrate csum = creates nodal sum over nodes in specified nodeset
    -

    -examples

    +

    +examples

    fix_modify AtC output eset1 mass_density

    -

    -description

    +

    +description

    Performs volume integration of specified field over elementset and outputs resulting variable values to GLOBALS file.

    -

    -restrictions

    -

    -related

    -

    see fix atc command

    -

    -default

    +

    +restrictions

    +

    +related

    +

    see fix atc command

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_output_nodeset.html b/doc/src/USER/atc/man_output_nodeset.html index db76c8008e..2fc6e02681 100644 --- a/doc/src/USER/atc/man_output_nodeset.html +++ b/doc/src/USER/atc/man_output_nodeset.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC output nodeset

    -syntax

    +

    fix_modify AtC output nodeset

    +syntax

    fix_modify AtC output nodeset <nodeset_name> <operation>

    • nodeset_name (string) = name of nodeset to be operated on
    • @@ -32,20 +30,20 @@ syntax sum = creates nodal sum over nodes in specified nodeset
    -

    -examples

    +

    +examples

    fix_modify AtC output nodeset nset1 sum

    -

    -description

    +

    +description

    Performs operation over the nodes belonging to specified nodeset and outputs resulting variable values to GLOBALS file.

    -

    -restrictions

    -

    -related

    -

    see fix atc command

    -

    -default

    +

    +restrictions

    +

    +related

    +

    see fix atc command

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_pair_interactions.html b/doc/src/USER/atc/man_pair_interactions.html index d46dcb1234..2cb2cb6113 100644 --- a/doc/src/USER/atc/man_pair_interactions.html +++ b/doc/src/USER/atc/man_pair_interactions.html @@ -7,40 +7,38 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC pair_interactions/bond_interactions

    -syntax

    +

    fix_modify AtC pair_interactions/bond_interactions

    +syntax

    fix_modify AtC pair_interactions <on|off>
    fix_modify AtC bond_interactions <on|off>

    -

    -examples

    +

    +examples

    fix_modify AtC bond_interactions on

    -

    -description

    +

    +description

    include bonds and/or pairs in the stress and heat flux computations

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    pair interactions: on, bond interactions: off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_poisson_solver.html b/doc/src/USER/atc/man_poisson_solver.html index d69d74db1a..b6fabbb27c 100644 --- a/doc/src/USER/atc/man_poisson_solver.html +++ b/doc/src/USER/atc/man_poisson_solver.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC poisson_solver

    -syntax

    +

    fix_modify AtC poisson_solver

    +syntax

    fix_modify AtC poisson_solver mesh create <nx> <ny> <nz> <region-id> <f|p> <f|p> <f|p>

    • nx ny nz = number of elements in x, y, z
    • region-id = id of region that is to be meshed
    • f p p = perioidicity flags for x, y, z
    -

    -examples

    +

    +examples

    fix_modify AtC poisson_solver mesh create 10 1 1 feRegion p p p

    -

    -description

    +

    +description

    Creates a uniform mesh in a rectangular region

    -

    -restrictions

    +

    +restrictions

    creates only uniform rectangular grids in a rectangular region

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_read_restart.html b/doc/src/USER/atc/man_read_restart.html index 96168fccc7..5fc21282f6 100644 --- a/doc/src/USER/atc/man_read_restart.html +++ b/doc/src/USER/atc/man_read_restart.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC read_restart

    -syntax

    +

    fix_modify AtC read_restart

    +syntax

    fix_modify AtC read_restart [file_name]

    -

    -examples

    +

    +examples

    fix_modify AtC read_restart ATC_state

    -

    -description

    +

    +description

    Reads the current state of the fields from a named text-based restart file.

    -

    -restrictions

    +

    +restrictions

    The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated.

    -

    -related

    +

    +related

    see write_restart fix_modify AtC write_restart

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_remove_molecule.html b/doc/src/USER/atc/man_remove_molecule.html index 054291efda..e6ad418de6 100644 --- a/doc/src/USER/atc/man_remove_molecule.html +++ b/doc/src/USER/atc/man_remove_molecule.html @@ -7,44 +7,42 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC remove_molecule

    -syntax

    +

    fix_modify AtC remove_molecule

    +syntax

    fix_modify_AtC remove_molecule <TAG>

    • <TAG> = tag for tracking a molecule type
    -

    -examples

    +

    +examples

    fix_modify AtC remove_molecule water

    -

    -description

    +

    +description

    Removes tag designated for tracking a specified set of molecules.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    No defaults for this command.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_remove_source.html b/doc/src/USER/atc/man_remove_source.html index d1d249eb76..acea7a5607 100644 --- a/doc/src/USER/atc/man_remove_source.html +++ b/doc/src/USER/atc/man_remove_source.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC remove_source

    -syntax

    +

    fix_modify AtC remove_source

    +syntax

    fix_modify AtC remove_source <field> <element_set>

    • <field> = field name valid for type of physics
    • <element_set> = name of set of elements
    -

    -examples

    +

    +examples

    fix_modify atc remove_source temperature groupNAME

    -

    -description

    +

    +description

    Remove a domain source.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in element_set name

    -

    -related

    +

    +related

    see fix_modify AtC source

    -

    -default

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_remove_species.html b/doc/src/USER/atc/man_remove_species.html index ba94a52658..561364518f 100644 --- a/doc/src/USER/atc/man_remove_species.html +++ b/doc/src/USER/atc/man_remove_species.html @@ -7,44 +7,42 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC remove_species

    -syntax

    +

    fix_modify AtC remove_species

    +syntax

    fix_modify_AtC delete_species <TAG>

    • <TAG> = tag for tracking a species
    -

    -examples

    +

    +examples

    fix_modify AtC remove_species gold

    -

    -description

    +

    +description

    Removes tag designated for tracking a specified species.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default

    No defaults for this command.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_reset_atomic_reference_positions.html b/doc/src/USER/atc/man_reset_atomic_reference_positions.html index cb82f61bbb..88e6748001 100644 --- a/doc/src/USER/atc/man_reset_atomic_reference_positions.html +++ b/doc/src/USER/atc/man_reset_atomic_reference_positions.html @@ -7,39 +7,37 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC reset_atomic_reference_positions

    -syntax

    +

    fix_modify AtC reset_atomic_reference_positions

    +syntax

    fix_modify AtC reset_atomic_reference_positions

    -

    -examples

    +

    +examples

    fix_modify atc reset_atomic_reference_positions

    -

    -description

    +

    +description

    Resets the atomic positions ATC uses to perform point to field operations. In can be used to use perfect lattice sites in ATC but a thermalized or deformed lattice in LAMMPS.

    -

    -restrictions

    +

    +restrictions

    -

    -related

    +

    +related

    -

    -default

    +

    +default

    Default is off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_reset_time.html b/doc/src/USER/atc/man_reset_time.html index 35d75ccb97..a6429bf6d6 100644 --- a/doc/src/USER/atc/man_reset_time.html +++ b/doc/src/USER/atc/man_reset_time.html @@ -7,55 +7,53 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC reset_time

    -syntax

    +

    fix_modify AtC reset_time

    +syntax

    fix_modify AtC reset_time

    -

    -examples

    +

    +examples

    fix_modify atc reset_time 0.0

    -

    -description

    +

    +description

    Resets the simulation time counter.

    -

    -restrictions

    -

    -related

    -

    -default

    -

    -syntax

    +

    +restrictions

    +

    +related

    +

    +default

    +

    +syntax

    fix_modify AtC kernel_bandwidth

    -

    -examples

    +

    +examples

    fix_modify atc reset_time 8

    -

    -description

    +

    +description

    Sets a maximum parallel bandwidth for the kernel functions during parallel communication. If the command is not issued, the default will be to assume the bandwidth of the kernel matrix corresponds to the number of sampling locations.

    -

    -restrictions

    +

    +restrictions

    Only is used if kernel functions are being used.

    -

    -related

    -

    -default

    +

    +related

    +

    +default

    Number of sample locations.


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_sample_frequency.html b/doc/src/USER/atc/man_sample_frequency.html index 13f468b222..4e48c4bb29 100644 --- a/doc/src/USER/atc/man_sample_frequency.html +++ b/doc/src/USER/atc/man_sample_frequency.html @@ -7,42 +7,40 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC sample_frequency

    -syntax

    +

    fix_modify AtC sample_frequency

    +syntax

    fix_modify AtC sample_frequency [freq]

    • freq (int) : frequency to sample field in number of steps
    -

    -examples

    +

    +examples

    fix_modify AtC sample_frequency 10

    -

    -description

    +

    +description

    Specifies a frequency at which fields are computed for the case where time filters are being applied.

    -

    -restrictions

    -

    Must be used with the hardy/field AtC fix ( see fix atc command ) and is only relevant when time filters are being used.

    -

    -related

    +

    +restrictions

    +

    Must be used with the hardy/field AtC fix ( see fix atc command ) and is only relevant when time filters are being used.

    +

    +related

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_set.html b/doc/src/USER/atc/man_set.html index d104e535b6..cf775c9b36 100644 --- a/doc/src/USER/atc/man_set.html +++ b/doc/src/USER/atc/man_set.html @@ -7,46 +7,44 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC set

    -syntax

    +

    fix_modify AtC set

    +syntax

    fix_modify AtC set reference_potential_energy <value_or_filename(optional)>

    • value (double) : optional user specified zero point for PE in native LAMMPS energy units
    • filename (string) : optional user specified string for file of nodal PE values to be read-in
    -

    -examples

    +

    +examples

    fix_modify AtC set reference_potential_energy
    fix_modify AtC set reference_potential_energy -0.05
    fix_modify AtC set reference_potential_energy myPEvalues

    -

    -description

    +

    +description

    Used to set various quantities for the post-processing algorithms. It sets the zero point for the potential energy density using the value provided for all nodes, or from the current configuration of the lattice if no value is provided, or values provided within the specified filename.

    -

    -restrictions

    -

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    -

    -related

    -

    -default

    +

    +restrictions

    +

    Must be used with the hardy/field type of AtC fix ( see fix atc command )

    +

    +related

    +

    +default

    Defaults to lammps zero point i.e. isolated atoms


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_source.html b/doc/src/USER/atc/man_source.html index 833b2a866f..c7239f2c41 100644 --- a/doc/src/USER/atc/man_source.html +++ b/doc/src/USER/atc/man_source.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC source

    -syntax

    +

    fix_modify AtC source

    +syntax

    fix_modify AtC source <field> <element_set> <value | function>

    • <field> = field name valid for type of physics
    • <element_set> = name of set of elements
    -

    -examples

    +

    +examples

    fix_modify atc source temperature middle temporal_ramp 10. 0.

    -

    -description

    +

    +description

    Add domain sources to the mesh. The units are consistent with LAMMPS's units for mass, length and time and are defined by the PDE being solved, e.g. for thermal transfer the balance equation is for energy and source is energy per time.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in element_set name

    -

    -related

    +

    +related

    see fix_modify AtC remove_source

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_source_integration.html b/doc/src/USER/atc/man_source_integration.html index 70f62d2e57..3f43340af8 100644 --- a/doc/src/USER/atc/man_source_integration.html +++ b/doc/src/USER/atc/man_source_integration.html @@ -7,36 +7,34 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_temperature_definition.html b/doc/src/USER/atc/man_temperature_definition.html index f4fb21471c..a07ba29cab 100644 --- a/doc/src/USER/atc/man_temperature_definition.html +++ b/doc/src/USER/atc/man_temperature_definition.html @@ -7,37 +7,35 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC temperature_definition

    -syntax

    +

    fix_modify AtC temperature_definition

    +syntax

    fix_modify AtC temperature_definition <kinetic|total>

    -

    -examples

    +

    +examples

    fix_modify atc temperature_definition kinetic

    -

    -description

    +

    +description

    Change the definition for the atomic temperature used to create the finite element temperature. The kinetic option is based only on the kinetic energy of the atoms while the total option uses the total energy (kinetic + potential) of an atom.

    -

    -restrictions

    +

    +restrictions

    This command is only valid when using thermal coupling. Also, while not a formal restriction, the user should ensure that associating a potential energy with each atom makes physical sense for the total option to be meaningful.

    -

    -default

    +

    +default

    kinetic


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_thermal_time_integration.html b/doc/src/USER/atc/man_thermal_time_integration.html index c2f636134f..fe293138be 100644 --- a/doc/src/USER/atc/man_thermal_time_integration.html +++ b/doc/src/USER/atc/man_thermal_time_integration.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC time_integration (thermal)

    -syntax

    +

    fix_modify AtC time_integration (thermal)

    +syntax

    fix_modify AtC time_integration <descriptor>

      @@ -33,23 +31,23 @@ syntax

    various time integration methods for the finite elements

    -

    -description

    +

    +description

    gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, thermostats based on controlling power
    fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal temperature update, 3/4 Gear for continuum and 2 Verlet for atomic contributions, thermostats based on controlling discrete energy changes

    -

    -examples

    +

    +examples

    fix_modify atc time_integration gear
    fix_modify atc time_integration fractional_step

    -

    -description

    -

    -related

    -

    see fix atc command

    -

    -default

    +

    +description

    +

    +related

    +

    see fix atc command

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_time_filter.html b/doc/src/USER/atc/man_time_filter.html index ec70fed871..732eaa3a36 100644 --- a/doc/src/USER/atc/man_time_filter.html +++ b/doc/src/USER/atc/man_time_filter.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC filter

    -syntax

    +

    fix_modify AtC filter

    +syntax

    fix_modify AtC filter <on | off | equilibrate>

      @@ -32,22 +30,22 @@ syntax
    • equilibrate = runs dynamics without filtering but initializes filtered quantities
    -

    -examples

    +

    +examples

    fix_modify atc transfer filter on

    -

    -description

    +

    +description

    Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics

    -

    -restrictions

    +

    +restrictions

    only for be used with specific transfers: thermal, two_temperature

    -

    -related

    +

    +related

    fix_modify AtC filter scale
    fix_modify AtC equilibrium_start

    -

    -default

    +

    +default

    off


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_track_displacement.html b/doc/src/USER/atc/man_track_displacement.html index 8f729cffe3..f5410816d7 100644 --- a/doc/src/USER/atc/man_track_displacement.html +++ b/doc/src/USER/atc/man_track_displacement.html @@ -7,38 +7,36 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC track_displacement

    -syntax

    +

    fix_modify AtC track_displacement

    +syntax

    fix_modify AtC track_displacement <on/off>

    -

    -examples

    +

    +examples

    fix_modify atc track_displacement on

    -

    -description

    +

    +description

    Determines whether displacement is tracked or not. For solids problems this is a useful quantity, but for fluids it is not relevant.

    -

    -restrictions

    +

    +restrictions

    Some constitutive models require the displacement field

    -

    -default

    +

    +default

    on


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_unfix_flux.html b/doc/src/USER/atc/man_unfix_flux.html index b2a19a7fd0..95e1f4be5a 100644 --- a/doc/src/USER/atc/man_unfix_flux.html +++ b/doc/src/USER/atc/man_unfix_flux.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC unfix_flux

    -syntax

    +

    fix_modify AtC unfix_flux

    +syntax

    fix_modify AtC fix_flux <field> <face_set> <value | function>

    • <field> = field name valid for type of physics, temperature | electron_temperature
    • <face_set> = name of set of element faces
    -

    -examples

    +

    +examples

    fix_modify atc unfix_flux temperature faceSet

    -

    -description

    +

    +description

    Command for removing prescribed normal fluxes e.g. heat_flux, stress.

    -

    -restrictions

    -

    -related

    +

    +restrictions

    +

    +related

    see fix_modify AtC unfix_flux

    -

    -default

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_unfix_nodes.html b/doc/src/USER/atc/man_unfix_nodes.html index 498d549f9e..78495c928a 100644 --- a/doc/src/USER/atc/man_unfix_nodes.html +++ b/doc/src/USER/atc/man_unfix_nodes.html @@ -7,43 +7,41 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC unfix

    -syntax

    +

    fix_modify AtC unfix

    +syntax

    fix_modify AtC unfix <field> <nodeset>

    • <field> = field name valid for type of physics
    • <nodeset> = name of set of nodes
    -

    -examples

    +

    +examples

    fix_modify AtC unfix temperature groupNAME

    -

    -description

    +

    +description

    Removes constraint on field values for specified nodes.

    -

    -restrictions

    +

    +restrictions

    keyword 'all' reserved in nodeset name

    -

    -related

    +

    +related

    see fix_modify AtC fix

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_write_atom_weights.html b/doc/src/USER/atc/man_write_atom_weights.html index 939506a28e..8a0e5b62a8 100644 --- a/doc/src/USER/atc/man_write_atom_weights.html +++ b/doc/src/USER/atc/man_write_atom_weights.html @@ -7,24 +7,22 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC write_atom_weights

    -syntax

    +

    fix_modify AtC write_atom_weights

    +syntax

    fix_modify AtC write_atom_weights <filename> <frequency>

    • <filename> = name of file that atomic weights are written to
      @@ -32,19 +30,19 @@ syntax
    • <frequency> = how often writes will occur
    -

    -examples

    +

    +examples

    fix_modify atc write_atom_weights atm_wt_file.txt 10

    -

    -description

    +

    +description

    Command for writing the values of atomic weights to a specified file.

    -

    -restrictions

    -

    -related

    -

    -default

    +

    +restrictions

    +

    +related

    +

    +default


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/USER/atc/man_write_restart.html b/doc/src/USER/atc/man_write_restart.html index 6ea350d5e8..6dca57673b 100644 --- a/doc/src/USER/atc/man_write_restart.html +++ b/doc/src/USER/atc/man_write_restart.html @@ -7,41 +7,39 @@ +
    + LAMMPS Website     + LAMMPS Manual     + USER-AtC Manual     + Commands +
    + +
    + + -
    -

    fix_modify AtC write_restart

    -syntax

    +

    fix_modify AtC write_restart

    +syntax

    fix_modify AtC write_restart [file_name]

    -

    -examples

    +

    +examples

    fix_modify AtC write_restart restart.mydata

    -

    -description

    +

    +description

    Dumps the current state of the fields to a named text-based restart file. This done when the command is invoked and not repeated, unlike the similar lammps command.

    -

    -restrictions

    +

    +restrictions

    The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated.

    -

    -related

    +

    +related

    see read_restart fix_modify AtC read_restart

    -

    -default

    +

    +default

    none


    Generated on 21 Aug 2013 for ATC by  diff --git a/doc/src/accelerate_gpu.txt b/doc/src/accelerate_gpu.txt index 68e9fa477a..816a31c788 100644 --- a/doc/src/accelerate_gpu.txt +++ b/doc/src/accelerate_gpu.txt @@ -62,7 +62,7 @@ respectively to your input script. [Required hardware/software:] To use this package, you currently need to have an NVIDIA GPU and -install the NVIDIA Cuda software on your system: +install the NVIDIA CUDA software on your system: Check if you have an NVIDIA GPU: cat /proc/driver/nvidia/gpus/0/information Go to http://www.nvidia.com/object/cuda_get.html @@ -74,13 +74,8 @@ Run lammps/lib/gpu/nvc_get_devices (after building the GPU library, see below) t This requires two steps (a,b): build the GPU library, then build LAMMPS with the GPU package. -You can do both these steps in one line, using the src/Make.py script, -described in "Section 4"_Section_packages.html of the manual. -Type "Make.py -h" for help. If run from the src directory, this -command will create src/lmp_gpu using src/MAKE/Makefile.mpi as the -starting Makefile.machine: - -Make.py -p gpu -gpu mode=single arch=31 -o gpu -a lib-gpu file mpi :pre +You can do both these steps in one line as described in +"Section 4"_Section_packages.html of the manual. Or you can follow these two (a,b) steps: @@ -90,7 +85,7 @@ The GPU library is in lammps/lib/gpu. Select a Makefile.machine (in lib/gpu) appropriate for your system. You should pay special attention to 3 settings in this makefile. -CUDA_HOME = needs to be where NVIDIA Cuda software is installed on your system +CUDA_HOME = needs to be where NVIDIA CUDA software is installed on your system CUDA_ARCH = needs to be appropriate to your GPUs CUDA_PREC = precision (double, mixed, single) you desire :ul diff --git a/doc/src/accelerate_intel.txt b/doc/src/accelerate_intel.txt index 74ae9d9a42..71f5185b15 100644 --- a/doc/src/accelerate_intel.txt +++ b/doc/src/accelerate_intel.txt @@ -25,12 +25,14 @@ LAMMPS to run on the CPU cores and coprocessor cores simultaneously. [Currently Available USER-INTEL Styles:] Angle Styles: charmm, harmonic :ulb,l -Bond Styles: fene, harmonic :l +Bond Styles: fene, fourier, harmonic :l Dihedral Styles: charmm, harmonic, opls :l -Fixes: nve, npt, nvt, nvt/sllod :l +Fixes: nve, npt, nvt, nvt/sllod, nve/asphere :l Improper Styles: cvff, harmonic :l -Pair Styles: buck/coul/cut, buck/coul/long, buck, eam, gayberne, -charmm/coul/long, lj/cut, lj/cut/coul/long, lj/long/coul/long, sw, tersoff :l +Pair Styles: airebo, airebo/morse, buck/coul/cut, buck/coul/long, +buck, dpd, eam, eam/alloy, eam/fs, gayberne, lj/charmm/coul/charmm, +lj/charmm/coul/long, lj/cut, lj/cut/coul/long, lj/long/coul/long, +rebo, sw, tersoff :l K-Space Styles: pppm, pppm/disp :l :ule @@ -52,11 +54,12 @@ warmup run (for use with offload benchmarks). :c,image(JPG/user_intel.png) Results are speedups obtained on Intel Xeon E5-2697v4 processors -(code-named Broadwell) and Intel Xeon Phi 7250 processors -(code-named Knights Landing) with "June 2017" LAMMPS built with -Intel Parallel Studio 2017 update 2. Results are with 1 MPI task -per physical core. See {src/USER-INTEL/TEST/README} for the raw -simulation rates and instructions to reproduce. +(code-named Broadwell), Intel Xeon Phi 7250 processors (code-named +Knights Landing), and Intel Xeon Gold 6148 processors (code-named +Skylake) with "June 2017" LAMMPS built with Intel Parallel Studio +2017 update 2. Results are with 1 MPI task per physical core. See +{src/USER-INTEL/TEST/README} for the raw simulation rates and +instructions to reproduce. :line @@ -75,11 +78,16 @@ order of operations compared to LAMMPS without acceleration: Neighbor lists can be created in a different order :ulb,l Bins used for sorting atoms can be oriented differently :l The default stencil order for PPPM is 7. By default, LAMMPS will -calculate other PPPM parameters to fit the desired acuracy with +calculate other PPPM parameters to fit the desired accuracy with this order :l The {newton} setting applies to all atoms, not just atoms shared between MPI tasks :l Vectorization can change the order for adding pairwise forces :l +When using the -DLMP_USE_MKL_RNG define (all included intel optimized +makefiles do) at build time, the random number generator for +dissipative particle dynamics (pair style dpd/intel) uses the Mersenne +Twister generator included in the Intel MKL library (that should be +more robust than the default Masaglia random number generator) :l :ule The precision mode (described below) used with the USER-INTEL @@ -106,7 +114,7 @@ $t should be 2 for Intel Xeon CPUs and 2 or 4 for Intel Xeon Phi :l For some of the simple 2-body potentials without long-range electrostatics, performance and scalability can be better with the "newton off" setting added to the input script :l -For simulations on higher node counts, add "processors * * * grid +For simulations on higher node counts, add "processors * * * grid numa" to the beginning of the input script for better scalability :l If using {kspace_style pppm} in the input script, add "kspace_modify diff ad" for better performance :l @@ -117,8 +125,8 @@ For Intel Xeon Phi CPUs: Runs should be performed using MCDRAM. :ulb,l :ule -For simulations using {kspace_style pppm} on Intel CPUs -supporting AVX-512: +For simulations using {kspace_style pppm} on Intel CPUs supporting +AVX-512: Add "kspace_modify diff ad" to the input script :ulb,l The command-line option should be changed to @@ -225,11 +233,9 @@ source /opt/intel/parallel_studio_xe_2016.3.067/psxevars.sh # or psxevars.csh for C-shell make intel_cpu_intelmpi :pre -Alternatively, the build can be accomplished with the src/Make.py -script, described in "Section 4"_Section_packages.html of the -manual. Type "Make.py -h" for help. For an example: - -Make.py -v -p intel omp -intel cpu -a file intel_cpu_intelmpi :pre +Alternatively this can be done as a single command with +suitable make command invocations. This is discussed in "Section +4"_Section_packages.html of the manual. Note that if you build with support for a Phi coprocessor, the same binary can be used on nodes with or without coprocessors installed. @@ -237,15 +243,17 @@ However, if you do not have coprocessors on your system, building without offload support will produce a smaller binary. The general requirements for Makefiles with the USER-INTEL package -are as follows. "-DLAMMPS_MEMALIGN=64" is required for CCFLAGS. When -using Intel compilers, "-restrict" is required and "-qopenmp" is -highly recommended for CCFLAGS and LINKFLAGS. LIB should include -"-ltbbmalloc". For builds supporting offload, "-DLMP_INTEL_OFFLOAD" -is required for CCFLAGS and "-qoffload" is required for LINKFLAGS. -Other recommended CCFLAG options for best performance are -"-O2 -fno-alias -ansi-alias -qoverride-limits fp-model fast=2 --no-prec-div". The Make.py command will add all of these -automatically. +are as follows. When using Intel compilers, "-restrict" is required +and "-qopenmp" is highly recommended for CCFLAGS and LINKFLAGS. +CCFLAGS should include "-DLMP_INTEL_USELRT" (unless POSIX Threads +are not supported in the build environment) and "-DLMP_USE_MKL_RNG" +(unless Intel Math Kernel Library (MKL) is not available in the build +environment). For Intel compilers, LIB should include "-ltbbmalloc" +or if the library is not available, "-DLMP_INTEL_NO_TBB" can be added +to CCFLAGS. For builds supporting offload, "-DLMP_INTEL_OFFLOAD" is +required for CCFLAGS and "-qoffload" is required for LINKFLAGS. Other +recommended CCFLAG options for best performance are "-O2 -fno-alias +-ansi-alias -qoverride-limits fp-model fast=2 -no-prec-div". NOTE: The vectorization and math capabilities can differ depending on the CPU. For Intel compilers, the "-x" flag specifies the type of @@ -362,10 +370,14 @@ intel"_package.html command that can improve performance when using "PPPM"_kspace_style.html for long-range electrostatics on processors with SMT. It generates an extra pthread for each MPI task. The thread is dedicated to performing some of the PPPM calculations and MPI -communications. On Intel Xeon Phi x200 series CPUs, this will likely -always improve performance, even on a single node. On Intel Xeon -processors, using this mode might result in better performance when -using multiple nodes, depending on the machine. To use this mode, +communications. This feature requires setting the preprocessor flag +-DLMP_INTEL_USELRT in the makefile when compiling LAMMPS. It is unset +in the default makefiles ({Makefile.mpi} and {Makefile.serial}) but +it is set in all makefiles tuned for the USER-INTEL package. On Intel +Xeon Phi x200 series CPUs, the LRT feature will likely improve +performance, even on a single node. On Intel Xeon processors, using +this mode might result in better performance when using multiple nodes, +depending on the specific machine configuration. To enable LRT mode, specify that the number of OpenMP threads is one less than would normally be used for the run and add the "lrt yes" option to the "-pk" command-line suffix or "package intel" command. For example, if a run diff --git a/doc/src/accelerate_kokkos.txt b/doc/src/accelerate_kokkos.txt index 6ccd695841..0c9178d6e4 100644 --- a/doc/src/accelerate_kokkos.txt +++ b/doc/src/accelerate_kokkos.txt @@ -11,339 +11,346 @@ 5.3.3 KOKKOS package :h5 -The KOKKOS package was developed primarily by Christian Trott (Sandia) -with contributions of various styles by others, including Sikandar -Mashayak (UIUC), Stan Moore (Sandia), and Ray Shan (Sandia). The -underlying Kokkos library was written primarily by Carter Edwards, +Kokkos is a templated C++ library that provides abstractions to allow +a single implementation of an application kernel (e.g. a pair style) to run efficiently on +different kinds of hardware, such as GPUs, Intel Xeon Phis, or many-core +CPUs. Kokkos maps the C++ kernel onto different backend languages such as CUDA, OpenMP, or Pthreads. +The Kokkos library also provides data abstractions to adjust (at +compile time) the memory layout of data structures like 2d and +3d arrays to optimize performance on different hardware. For more information on Kokkos, see +"Github"_https://github.com/kokkos/kokkos. Kokkos is part of +"Trilinos"_http://trilinos.sandia.gov/packages/kokkos. The Kokkos library was written primarily by Carter Edwards, Christian Trott, and Dan Sunderland (all Sandia). -The KOKKOS package contains versions of pair, fix, and atom styles +The LAMMPS KOKKOS package contains versions of pair, fix, and atom styles that use data structures and macros provided by the Kokkos library, -which is included with LAMMPS in lib/kokkos. - -The Kokkos library is part of -"Trilinos"_http://trilinos.sandia.gov/packages/kokkos and can also be -downloaded from "Github"_https://github.com/kokkos/kokkos. Kokkos is a -templated C++ library that provides two key abstractions for an -application like LAMMPS. First, it allows a single implementation of -an application kernel (e.g. a pair style) to run efficiently on -different kinds of hardware, such as a GPU, Intel Phi, or many-core -CPU. - -The Kokkos library also provides data abstractions to adjust (at -compile time) the memory layout of basic data structures like 2d and -3d arrays and allow the transparent utilization of special hardware -load and store operations. Such data structures are used in LAMMPS to -store atom coordinates or forces or neighbor lists. The layout is -chosen to optimize performance on different platforms. Again this -functionality is hidden from the developer, and does not affect how -the kernel is coded. - -These abstractions are set at build time, when LAMMPS is compiled with -the KOKKOS package installed. 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. +which is included with LAMMPS in /lib/kokkos. The KOKKOS package was developed primarily by Christian Trott (Sandia) +and Stan Moore (Sandia) with contributions of various styles by others, including Sikandar +Mashayak (UIUC), Ray Shan (Sandia), and Dan Ibanez (Sandia). For more information on developing using Kokkos abstractions +see the Kokkos programmers' guide at /lib/kokkos/doc/Kokkos_PG.pdf. Kokkos currently provides support for 3 modes of execution (per MPI -task). These are OpenMP (for many-core CPUs), Cuda (for NVIDIA GPUs), -and OpenMP (for Intel Phi). Note that the KOKKOS package supports -running on the Phi in native mode, not offload mode like the -USER-INTEL package supports. You choose the mode at build time to +task). These are Serial (MPI-only for CPUs and Intel Phi), OpenMP (threading +for many-core CPUs and Intel Phi), and CUDA (for NVIDIA GPUs). You choose the mode at build time to produce an executable compatible with specific hardware. -Here is a quick overview of how to use the KOKKOS package -for CPU acceleration, assuming one or more 16-core nodes. -More details follow. - -use a C++11 compatible compiler -make yes-kokkos -make mpi KOKKOS_DEVICES=OpenMP # build with the KOKKOS package -make kokkos_omp # or Makefile.kokkos_omp already has variable set -Make.py -v -p kokkos -kokkos omp -o mpi -a file mpi # or one-line build via Make.py :pre - -mpirun -np 16 lmp_mpi -k on -sf kk -in in.lj # 1 node, 16 MPI tasks/node, no threads -mpirun -np 2 -ppn 1 lmp_mpi -k on t 16 -sf kk -in in.lj # 2 nodes, 1 MPI task/node, 16 threads/task -mpirun -np 2 lmp_mpi -k on t 8 -sf kk -in in.lj # 1 node, 2 MPI tasks/node, 8 threads/task -mpirun -np 32 -ppn 4 lmp_mpi -k on t 4 -sf kk -in in.lj # 8 nodes, 4 MPI tasks/node, 4 threads/task :pre - -specify variables and settings in your Makefile.machine that enable OpenMP, GPU, or Phi support -include the KOKKOS package and build LAMMPS -enable the KOKKOS package and its hardware options via the "-k on" command-line switch use KOKKOS styles in your input script :ul - -Here is a quick overview of how to use the KOKKOS package for GPUs, -assuming one or more nodes, each with 16 cores and a GPU. More -details follow. - -discuss use of NVCC, which Makefiles to examine - -use a C++11 compatible compiler -KOKKOS_DEVICES = Cuda, OpenMP -KOKKOS_ARCH = Kepler35 -make yes-kokkos -make machine -Make.py -p kokkos -kokkos cuda arch=31 -o kokkos_cuda -a file kokkos_cuda :pre - -mpirun -np 1 lmp_cuda -k on t 6 -sf kk -in in.lj # one MPI task, 6 threads on CPU -mpirun -np 4 -ppn 1 lmp_cuda -k on t 6 -sf kk -in in.lj # ditto on 4 nodes :pre - -mpirun -np 2 lmp_cuda -k on t 8 g 2 -sf kk -in in.lj # two MPI tasks, 8 threads per CPU -mpirun -np 32 -ppn 2 lmp_cuda -k on t 8 g 2 -sf kk -in in.lj # ditto on 16 nodes :pre - -Here is a quick overview of how to use the KOKKOS package -for the Intel Phi: - -use a C++11 compatible compiler -KOKKOS_DEVICES = OpenMP -KOKKOS_ARCH = KNC -make yes-kokkos -make machine -Make.py -p kokkos -kokkos phi -o kokkos_phi -a file mpi :pre - -host=MIC, Intel Phi with 61 cores (240 threads/phi via 4x hardware threading): -mpirun -np 1 lmp_g++ -k on t 240 -sf kk -in in.lj # 1 MPI task on 1 Phi, 1*240 = 240 -mpirun -np 30 lmp_g++ -k on t 8 -sf kk -in in.lj # 30 MPI tasks on 1 Phi, 30*8 = 240 -mpirun -np 12 lmp_g++ -k on t 20 -sf kk -in in.lj # 12 MPI tasks on 1 Phi, 12*20 = 240 -mpirun -np 96 -ppn 12 lmp_g++ -k on t 20 -sf kk -in in.lj # ditto on 8 Phis :pre - -[Required hardware/software:] - -Kokkos support within LAMMPS must be built with a C++11 compatible -compiler. If using gcc, version 4.7.2 or later is required. - -To build with Kokkos support for CPUs, your compiler must support the -OpenMP interface. You should have one or more multi-core CPUs so that -multiple threads can be launched by each MPI task running on a CPU. - -To build with Kokkos support for NVIDIA GPUs, NVIDIA Cuda software -version 7.5 or later must be installed on your system. See the -discussion for the "GPU"_accelerate_gpu.html package for details of -how to check and do this. - -NOTE: For good performance of the KOKKOS package on GPUs, you must -have Kepler generation GPUs (or later). The Kokkos library exploits -texture cache options not supported by Telsa generation GPUs (or -older). - -To build with Kokkos support for Intel Xeon Phi coprocessors, your -sysmte must be configured to use them in "native" mode, not "offload" -mode like the USER-INTEL package supports. - [Building LAMMPS with the KOKKOS package:] -You must choose at build time whether to build for CPUs (OpenMP), -GPUs, or Phi. +NOTE: Kokkos support within LAMMPS must be built with a C++11 compatible +compiler. This means GCC version 4.7.2 or later, Intel 14.0.4 or later, or +Clang 3.5.2 or later is required. -You can do any of these in one line, using the src/Make.py script, -described in "Section 4"_Section_packages.html of the manual. -Type "Make.py -h" for help. If run from the src directory, these -commands will create src/lmp_kokkos_omp, lmp_kokkos_cuda, and -lmp_kokkos_phi. Note that the OMP and PHI options use -src/MAKE/Makefile.mpi as the starting Makefile.machine. The CUDA -option uses src/MAKE/OPTIONS/Makefile.kokkos_cuda. +The recommended method of building the KOKKOS package is to start with the provided Kokkos +Makefiles in /src/MAKE/OPTIONS/. You may need to modify the KOKKOS_ARCH variable in the Makefile +to match your specific hardware. For example: -The latter two steps can be done using the "-k on", "-pk kokkos" and -"-sf kk" "command-line switches"_Section_start.html#start_6 -respectively. Or the effect of the "-pk" or "-sf" switches can be -duplicated by adding the "package kokkos"_package.html or "suffix -kk"_suffix.html commands respectively to your input script. +for Sandy Bridge CPUs, set KOKKOS_ARCH=SNB +for Broadwell CPUs, set KOKKOS_ARCH=BWD +for K80 GPUs, set KOKKOS_ARCH=Kepler37 +for P100 GPUs and Power8 CPUs, set KOKKOS_ARCH=Pascal60,Power8 :ul +See the [Advanced Kokkos Options] section below for a listing of all KOKKOS_ARCH options. -Or you can follow these steps: +[Compile for CPU-only (MPI only, no threading):] -CPU-only (run all-MPI or with OpenMP threading): +use a C++11 compatible compiler and set KOKKOS_ARCH variable in +/src/MAKE/OPTIONS/Makefile.kokkos_mpi_only as described above. Then do the +following: + +cd lammps/src +make yes-kokkos +make kokkos_mpi_only :pre + +[Compile for CPU-only (MPI plus OpenMP threading):] + +NOTE: To build with Kokkos support for OpenMP threading, your compiler must support the +OpenMP interface. You should have one or more multi-core CPUs so that +multiple threads can be launched by each MPI task running on a CPU. + +use a C++11 compatible compiler and set KOKKOS_ARCH variable in +/src/MAKE/OPTIONS/Makefile.kokkos_omp as described above. Then do the +following: cd lammps/src make yes-kokkos make kokkos_omp :pre -CPU-only (only MPI, no threading): +[Compile for Intel KNL Xeon Phi (Intel Compiler, OpenMPI):] -cd lammps/src -make yes-kokkos -make kokkos_mpi :pre - -Intel Xeon Phi (Intel Compiler, Intel MPI): +use a C++11 compatible compiler and do the following: cd lammps/src make yes-kokkos make kokkos_phi :pre -CPUs and GPUs (with MPICH): +[Compile for CPUs and GPUs (with OpenMPI or MPICH):] + +NOTE: To build with Kokkos support for NVIDIA GPUs, NVIDIA CUDA software +version 7.5 or later must be installed on your system. See the +discussion for the "GPU"_accelerate_gpu.html package for details of +how to check and do this. + +use a C++11 compatible compiler and set KOKKOS_ARCH variable in +/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi for both GPU and CPU as described +above. Then do the following: cd lammps/src make yes-kokkos -make kokkos_cuda_mpich :pre +make kokkos_cuda_mpi :pre -These examples set the KOKKOS-specific OMP, MIC, CUDA variables on the -make command line which requires a GNU-compatible make command. Try +[Alternative Methods of Compiling:] + +Alternatively, the KOKKOS package can be built by specifying Kokkos variables +on the make command line. For example: + +make mpi KOKKOS_DEVICES=OpenMP KOKKOS_ARCH=SNB # set the KOKKOS_DEVICES and KOKKOS_ARCH variable explicitly +make kokkos_cuda_mpi KOKKOS_ARCH=Pascal60,Power8 # set the KOKKOS_ARCH variable explicitly :pre + +Setting the KOKKOS_DEVICES and KOKKOS_ARCH variables on the +make command line requires a GNU-compatible make command. Try "gmake" if your system's standard make complains. NOTE: If you build using make line variables and re-build LAMMPS twice -with different KOKKOS options and the *same* target, e.g. g++ in the -first two examples above, then you *must* perform a "make clean-all" -or "make clean-machine" before each build. This is to force all the +with different KOKKOS options and the *same* target, then you *must* perform a "make clean-all" +or "make clean-machine" before each build. This is to force all the KOKKOS-dependent files to be re-compiled with the new options. -NOTE: Currently, there are no precision options with the KOKKOS -package. All compilation and computation is performed in double -precision. +[Running LAMMPS with the KOKKOS package:] -There are other allowed options when building with the KOKKOS package. -As above, they can be set either as variables on the make command line -or in Makefile.machine. This is the full list of options, including -those discussed above, Each takes a value shown below. The -default value is listed, which is set in the -lib/kokkos/Makefile.kokkos file. +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. -#Default settings specific options -#Options: force_uvm,use_ldg,rdc +[Running on a multi-core CPU:] -KOKKOS_DEVICES, values = {OpenMP}, {Serial}, {Pthreads}, {Cuda}, default = {OpenMP} -KOKKOS_ARCH, values = {KNC}, {SNB}, {HSW}, {Kepler}, {Kepler30}, {Kepler32}, {Kepler35}, {Kepler37}, {Maxwell}, {Maxwell50}, {Maxwell52}, {Maxwell53}, {ARMv8}, {BGQ}, {Power7}, {Power8}, default = {none} -KOKKOS_DEBUG, values = {yes}, {no}, default = {no} -KOKKOS_USE_TPLS, values = {hwloc}, {librt}, default = {none} -KOKKOS_CUDA_OPTIONS, values = {force_uvm}, {use_ldg}, {rdc} :ul +Here is a quick overview of how to use the KOKKOS package +for CPU acceleration, assuming one or more 16-core nodes. -KOKKOS_DEVICE sets the parallelization method used for Kokkos code -(within LAMMPS). KOKKOS_DEVICES=OpenMP means that OpenMP will be -used. KOKKOS_DEVICES=Pthreads means that pthreads will be used. -KOKKOS_DEVICES=Cuda means an NVIDIA GPU running CUDA will be used. - -If KOKKOS_DEVICES=Cuda, then the lo-level Makefile in the src/MAKE -directory must use "nvcc" as its compiler, via its CC setting. For -best performance its CCFLAGS setting should use -O3 and have a -KOKKOS_ARCH setting that matches the compute capability of your NVIDIA -hardware and software installation, e.g. KOKKOS_ARCH=Kepler30. Note -the minimal required compute capability is 2.0, but this will give -significantly reduced performance compared to Kepler generation GPUs -with compute capability 3.x. For the LINK setting, "nvcc" should not -be used; instead use g++ or another compiler suitable for linking C++ -applications. Often you will want to use your MPI compiler wrapper -for this setting (i.e. mpicxx). Finally, the lo-level Makefile must -also have a "Compilation rule" for creating *.o files from *.cu files. -See src/Makefile.cuda for an example of a lo-level Makefile with all -of these settings. - -KOKKOS_USE_TPLS=hwloc binds threads to hardware cores, so they do not -migrate during a simulation. KOKKOS_USE_TPLS=hwloc should always be -used if running with KOKKOS_DEVICES=Pthreads for pthreads. It is not -necessary for KOKKOS_DEVICES=OpenMP for OpenMP, because OpenMP -provides alternative methods via environment variables for binding -threads to hardware cores. More info on binding threads to cores is -given in "Section 5.3"_Section_accelerate.html#acc_3. - -KOKKOS_ARCH=KNC enables compiler switches needed when compiling for an -Intel Phi processor. - -KOKKOS_USE_TPLS=librt enables use of a more accurate timer mechanism -on most Unix platforms. This library is not available on all -platforms. - -KOKKOS_DEBUG is only useful when developing a Kokkos-enabled style -within LAMMPS. KOKKOS_DEBUG=yes enables printing of run-time -debugging information that can be useful. It also enables runtime -bounds checking on Kokkos data structures. - -KOKKOS_CUDA_OPTIONS are additional options for CUDA. - -For more information on Kokkos see the Kokkos programmers' guide here: -/lib/kokkos/doc/Kokkos_PG.pdf. - -[Run with the KOKKOS 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. - -When using KOKKOS built with host=OMP, you need to choose how many -OpenMP threads per MPI task will be used (via the "-k" command-line -switch discussed below). Note that the product of MPI tasks * OpenMP -threads/task should not exceed the physical number of cores (on a -node), otherwise performance will suffer. - -When using the KOKKOS package built with device=CUDA, you must use -exactly one MPI task per physical GPU. - -When using the KOKKOS package built with host=MIC for Intel Xeon Phi -coprocessor support you need to insure there are one or more MPI tasks -per coprocessor, and choose the number of coprocessor threads to use -per MPI task (via the "-k" command-line switch discussed below). The -product of MPI tasks * coprocessor threads/task should not exceed the -maximum number of threads the coprocessor is designed to run, -otherwise performance will suffer. This value is 240 for current -generation Xeon Phi(TM) chips, which is 60 physical cores * 4 -threads/core. Note that with the KOKKOS package you do not need to -specify how many Phi coprocessors there are per node; each -coprocessors is simply treated as running some number of MPI tasks. +mpirun -np 16 lmp_kokkos_mpi_only -k on -sf kk -in in.lj # 1 node, 16 MPI tasks/node, no multi-threading +mpirun -np 2 -ppn 1 lmp_kokkos_omp -k on t 16 -sf kk -in in.lj # 2 nodes, 1 MPI task/node, 16 threads/task +mpirun -np 2 lmp_kokkos_omp -k on t 8 -sf kk -in in.lj # 1 node, 2 MPI tasks/node, 8 threads/task +mpirun -np 32 -ppn 4 lmp_kokkos_omp -k on t 4 -sf kk -in in.lj # 8 nodes, 4 MPI tasks/node, 4 threads/task :pre +To run using the KOKKOS package, use the "-k on", "-sf kk" and "-pk kokkos" "command-line switches"_Section_start.html#start_7 in your mpirun command. You must use the "-k on" "command-line -switch"_Section_start.html#start_6 to enable the KOKKOS package. It +switch"_Section_start.html#start_7 to enable the KOKKOS package. It takes additional arguments for hardware settings appropriate to your -system. Those arguments are "documented -here"_Section_start.html#start_6. The two most commonly used -options are: +system. Those arguments are "documented +here"_Section_start.html#start_7. For OpenMP use: --k on t Nt g Ng :pre - -The "t Nt" option applies to host=OMP (even if device=CUDA) and -host=MIC. For host=OMP, it specifies how many OpenMP threads per MPI -task to use with a node. For host=MIC, it specifies how many Xeon Phi -threads per MPI task to use within a node. The default is Nt = 1. -Note that for host=OMP this is effectively MPI-only mode which may be -fine. But for host=MIC you will typically end up using far less than -all the 240 available threads, which could give very poor performance. - -The "g Ng" option applies to device=CUDA. It specifies how many GPUs -per compute node to use. The default is 1, so this only needs to be -specified is you have 2 or more GPUs per compute node. +-k on t Nt :pre +The "t Nt" option specifies how many OpenMP threads per MPI +task to use with a node. The default is Nt = 1, which is MPI-only mode. +Note that the product of MPI tasks * OpenMP +threads/task should not exceed the physical number of cores (on a +node), otherwise performance will suffer. If hyperthreading is enabled, then +the product of MPI tasks * OpenMP threads/task should not exceed the +physical number of cores * hardware threads. The "-k on" switch also issues a "package kokkos" command (with no additional arguments) which sets various KOKKOS options to default values, as discussed on the "package"_package.html command doc page. -Use the "-sf kk" "command-line switch"_Section_start.html#start_6, -which will automatically append "kk" to styles that support it. Use -the "-pk kokkos" "command-line switch"_Section_start.html#start_6 if -you wish to change any of the default "package kokkos"_package.html -optionns set by the "-k on" "command-line -switch"_Section_start.html#start_6. +The "-sf kk" "command-line switch"_Section_start.html#start_7 +will automatically append the "/kk" suffix to styles that support it. +In this manner no modification to the input script is needed. Alternatively, +one can run with the KOKKOS package by editing the input script as described below. - - -Note that the default for the "package kokkos"_package.html command is +NOTE: The default for the "package kokkos"_package.html command is to use "full" neighbor lists and set the Newton flag to "off" for both -pairwise and bonded interactions. This typically gives fastest -performance. If the "newton"_newton.html command is used in the input -script, it can override the Newton flag defaults. - -However, when running in MPI-only mode with 1 thread per MPI task, it +pairwise and bonded interactions. However, when running on CPUs, it will typically be faster to use "half" neighbor lists and set the Newton flag to "on", just as is the case for non-accelerated pair -styles. You can do this with the "-pk" "command-line -switch"_Section_start.html#start_6. +styles. It can also be faster to use non-threaded communication. +Use the "-pk kokkos" "command-line switch"_Section_start.html#start_7 to +change the default "package kokkos"_package.html +options. See its doc page for details and default settings. Experimenting with +its options can provide a speed-up for specific calculations. For example: -[Or run with the KOKKOS package by editing an input script:] +mpirun -np 16 lmp_kokkos_mpi_only -k on -sf kk -pk kokkos newton on neigh half comm no -in in.lj # Newton on, Half neighbor list, non-threaded comm :pre -The discussion above for the mpirun/mpiexec command and setting -appropriate thread and GPU values for host=OMP or host=MIC or -device=CUDA are the same. +If the "newton"_newton.html command is used in the input +script, it can also override the Newton flag defaults. + +[Core and Thread Affinity:] + +When using multi-threading, it is important for +performance to bind both MPI tasks to physical cores, and threads to +physical cores, so they do not migrate during a simulation. + +If you are not certain MPI tasks are being bound (check the defaults +for your MPI installation), binding can be forced with these flags: + +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 ... :pre + +For binding threads with KOKKOS OpenMP, use thread affinity +environment variables to force binding. With OpenMP 3.1 (gcc 4.7 or +later, intel 12 or later) setting the environment variable +OMP_PROC_BIND=true should be sufficient. In general, for best performance +with OpenMP 4.0 or better set OMP_PROC_BIND=spread and OMP_PLACES=threads. +For binding threads with the +KOKKOS pthreads option, compile LAMMPS the KOKKOS HWLOC=yes option +as described below. + +[Running on Knight's Landing (KNL) Intel Xeon Phi:] + +Here is a quick overview of how to use the KOKKOS package +for the Intel Knight's Landing (KNL) Xeon Phi: + +KNL Intel Phi chips have 68 physical cores. Typically 1 to 4 cores +are reserved for the OS, and only 64 or 66 cores are used. Each core +has 4 hyperthreads,so there are effectively N = 256 (4*64) or +N = 264 (4*66) cores to run on. The product of MPI tasks * OpenMP threads/task should not exceed this limit, +otherwise performance will suffer. Note that with the KOKKOS package you do not need to +specify how many KNLs there are per node; each +KNL is simply treated as running some number of MPI tasks. + +Examples of mpirun commands that follow these rules are shown below. + +Intel KNL node with 68 cores (272 threads/node via 4x hardware threading): +mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -in in.lj # 1 node, 64 MPI tasks/node, 4 threads/task +mpirun -np 66 lmp_kokkos_phi -k on t 4 -sf kk -in in.lj # 1 node, 66 MPI tasks/node, 4 threads/task +mpirun -np 32 lmp_kokkos_phi -k on t 8 -sf kk -in in.lj # 1 node, 32 MPI tasks/node, 8 threads/task +mpirun -np 512 -ppn 64 lmp_kokkos_phi -k on t 4 -sf kk -in in.lj # 8 nodes, 64 MPI tasks/node, 4 threads/task :pre + +The -np setting of the mpirun command sets the number of MPI +tasks/node. The "-k on t Nt" command-line switch sets the number of +threads/task as Nt. The product of these two values should be N, i.e. +256 or 264. + +NOTE: The default for the "package kokkos"_package.html command is +to use "full" neighbor lists and set the Newton flag to "off" for both +pairwise and bonded interactions. When running on KNL, this +will typically be best for pair-wise potentials. For manybody potentials, +using "half" neighbor lists and setting the +Newton flag to "on" may be faster. It can also be faster to use non-threaded communication. +Use the "-pk kokkos" "command-line switch"_Section_start.html#start_7 to +change the default "package kokkos"_package.html +options. See its doc page for details and default settings. Experimenting with +its options can provide a speed-up for specific calculations. For example: + +mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -pk kokkos comm no -in in.lj # Newton off, full neighbor list, non-threaded comm +mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -pk kokkos newton on neigh half comm no -in in.reax # Newton on, half neighbor list, non-threaded comm :pre + +NOTE: MPI tasks and threads should be bound to cores as described above for CPUs. + +NOTE: To build with Kokkos support for Intel Xeon Phi coprocessors such as Knight's Corner (KNC), your +system must be configured to use them in "native" mode, not "offload" +mode like the USER-INTEL package supports. + +[Running on GPUs:] + +Use the "-k" "command-line switch"_Section_commands.html#start_7 to +specify the number of GPUs per node. Typically the -np setting +of the mpirun command should set the number of MPI +tasks/node to be equal to the # of physical GPUs on the node. +You can assign multiple MPI tasks to the same GPU with the +KOKKOS package, but this is usually only faster if significant portions +of the input script have not been ported to use Kokkos. Using CUDA MPS +is recommended in this scenario. As above for multi-core CPUs (and no GPU), if N is the number +of physical cores/node, then the number of MPI tasks/node should not exceed N. + +-k on g Ng :pre + +Here are examples of how to use the KOKKOS package for GPUs, +assuming one or more nodes, each with two GPUs: + +mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -in in.lj # 1 node, 2 MPI tasks/node, 2 GPUs/node +mpirun -np 32 -ppn 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -in in.lj # 16 nodes, 2 MPI tasks/node, 2 GPUs/node (32 GPUs total) :pre + +NOTE: The default for the "package kokkos"_package.html command is +to use "full" neighbor lists and set the Newton flag to "off" for both +pairwise and bonded interactions, along with threaded communication. +When running on Maxwell or Kepler GPUs, this will typically be best. For Pascal GPUs, +using "half" neighbor lists and setting the +Newton flag to "on" may be faster. For many pair styles, setting the neighbor binsize +equal to the ghost atom cutoff will give speedup. +Use the "-pk kokkos" "command-line switch"_Section_start.html#start_7 to +change the default "package kokkos"_package.html +options. See its doc page for details and default settings. Experimenting with +its options can provide a speed-up for specific calculations. For example: + +mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -pk kokkos binsize 2.8 -in in.lj # Set binsize = neighbor ghost cutoff +mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -pk kokkos newton on neigh half binsize 2.8 -in in.lj # Newton on, half neighborlist, set binsize = neighbor ghost cutoff :pre + +NOTE: For good performance of the KOKKOS package on GPUs, you must +have Kepler generation GPUs (or later). The Kokkos library exploits +texture cache options not supported by Telsa generation GPUs (or +older). + +NOTE: When using a GPU, you will achieve the best performance if your +input script does not use fix or compute styles which are not yet +Kokkos-enabled. This allows data to stay on the GPU for multiple +timesteps, without being copied back to the host CPU. Invoking a +non-Kokkos fix or compute, or performing I/O for +"thermo"_thermo_style.html or "dump"_dump.html output will cause data +to be copied back to the CPU incurring a performance penalty. + +NOTE: To get an accurate timing breakdown between time spend in pair, +kspace, etc., you must set the environment variable CUDA_LAUNCH_BLOCKING=1. +However, this will reduce performance and is not recommended for production runs. + +[Run with the KOKKOS package by editing an input script:] + +Alternatively the effect of the "-sf" or "-pk" switches can be +duplicated by adding the "package kokkos"_package.html or "suffix +kk"_suffix.html 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. You must still use the "-k on" "command-line -switch"_Section_start.html#start_6 to enable the KOKKOS package, and +switch"_Section_start.html#start_7 to enable the KOKKOS package, and specify its additional arguments for hardware options appropriate to your system, as documented above. -Use the "suffix kk"_suffix.html command, or you can explicitly add a +You can use the "suffix kk"_suffix.html command, or you can explicitly add a "kk" suffix to individual styles in your input script, e.g. pair_style lj/cut/kk 2.5 :pre You only need to use the "package kokkos"_package.html command if you wish to change any of its option defaults, as set by the "-k on" -"command-line switch"_Section_start.html#start_6. +"command-line switch"_Section_start.html#start_7. + +[Using OpenMP threading and CUDA together (experimental):] + +With the KOKKOS package, both OpenMP multi-threading and GPUs can be used +together in a few special cases. In the Makefile, the KOKKOS_DEVICES variable must +include both "Cuda" and "OpenMP", as is the case for /src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi + +KOKKOS_DEVICES=Cuda,OpenMP :pre + +The suffix "/kk" is equivalent to "/kk/device", and for Kokkos CUDA, +using the "-sf kk" in the command line gives the default CUDA version everywhere. +However, if the "/kk/host" suffix is added to a specific style in the input +script, the Kokkos OpenMP (CPU) version of that specific style will be used instead. +Set the number of OpenMP threads as "t Nt" and the number of GPUs as "g Ng" + +-k on t Nt g Ng :pre + +For example, the command to run with 1 GPU and 8 OpenMP threads is then: + +mpiexec -np 1 lmp_kokkos_cuda_openmpi -in in.lj -k on g 1 t 8 -sf kk :pre + +Conversely, if the "-sf kk/host" is used in the command line and then the +"/kk" or "/kk/device" suffix is added to a specific style in your input script, +then only that specific style will run on the GPU while everything else will +run on the CPU in OpenMP mode. Note that the execution of the CPU and GPU +styles will NOT overlap, except for a special case: + +A kspace style and/or molecular topology (bonds, angles, etc.) running on +the host CPU can overlap with a pair style running on the GPU. First compile +with "--default-stream per-thread" added to CCFLAGS in the Kokkos CUDA Makefile. +Then explicitly use the "/kk/host" suffix for kspace and bonds, angles, etc. +in the input file and the "kk" suffix (equal to "kk/device") on the command line. +Also make sure the environment variable CUDA_LAUNCH_BLOCKING is not set to "1" +so CPU/GPU overlap can occur. [Speed-ups to expect:] @@ -356,7 +363,7 @@ Generally speaking, the following rules of thumb apply: When running on CPUs only, with a single thread per MPI task, performance of a KOKKOS style is somewhere between the standard (un-accelerated) styles (MPI-only mode), and those provided by the -USER-OMP package. However the difference between all 3 is small (less +USER-OMP package. However the difference between all 3 is small (less than 20%). :ulb,l When running on CPUs only, with multiple threads per MPI task, @@ -366,7 +373,7 @@ package. :l When running large number of atoms per GPU, KOKKOS is typically faster than the GPU package. :l -When running on Intel Xeon Phi, KOKKOS is not as fast as +When running on Intel hardware, KOKKOS is not as fast as the USER-INTEL package, which is optimized for that hardware. :l :ule @@ -374,123 +381,78 @@ See the "Benchmark page"_http://lammps.sandia.gov/bench.html of the LAMMPS web site for performance of the KOKKOS package on different hardware. -[Guidelines for best performance:] +[Advanced Kokkos options:] -Here are guidline for using the KOKKOS package on the different -hardware configurations listed above. +There are other allowed options when building with the KOKKOS package. +As above, they can be set either as variables on the make command line +or in Makefile.machine. This is the full list of options, including +those discussed above. Each takes a value shown below. The +default value is listed, which is set in the +/lib/kokkos/Makefile.kokkos file. -Many of the guidelines use the "package kokkos"_package.html command -See its doc page for details and default settings. Experimenting with -its options can provide a speed-up for specific calculations. +KOKKOS_DEVICES, values = {Serial}, {OpenMP}, {Pthreads}, {Cuda}, default = {OpenMP} +KOKKOS_ARCH, values = {KNC}, {SNB}, {HSW}, {Kepler30}, {Kepler32}, {Kepler35}, {Kepler37}, {Maxwell50}, {Maxwell52}, {Maxwell53}, {Pascal60}, {Pascal61}, {ARMv80}, {ARMv81}, {ARMv81}, {ARMv8-ThunderX}, {BGQ}, {Power7}, {Power8}, {Power9}, {KNL}, {BDW}, {SKX}, default = {none} +KOKKOS_DEBUG, values = {yes}, {no}, default = {no} +KOKKOS_USE_TPLS, values = {hwloc}, {librt}, {experimental_memkind}, default = {none} +KOKKOS_CXX_STANDARD, values = {c++11}, {c++1z}, default = {c++11} +KOKKOS_OPTIONS, values = {aggressive_vectorization}, {disable_profiling}, default = {none} +KOKKOS_CUDA_OPTIONS, values = {force_uvm}, {use_ldg}, {rdc}, {enable_lambda}, default = {enable_lambda} :ul -[Running on a multi-core CPU:] +KOKKOS_DEVICES sets the parallelization method used for Kokkos code +(within LAMMPS). KOKKOS_DEVICES=Serial means that no threading will be used. +KOKKOS_DEVICES=OpenMP means that OpenMP threading will be +used. KOKKOS_DEVICES=Pthreads means that pthreads will be used. +KOKKOS_DEVICES=Cuda means an NVIDIA GPU running CUDA will be used. -If N is the number of physical cores/node, then the number of MPI -tasks/node * number of threads/task should not exceed N, and should -typically equal N. Note that the default threads/task is 1, as set by -the "t" keyword of the "-k" "command-line -switch"_Section_start.html#start_6. If you do not change this, no -additional parallelism (beyond MPI) will be invoked on the host -CPU(s). +KOKKOS_ARCH enables compiler switches needed when compiling for a +specific hardware: -You can compare the performance running in different modes: +ARMv80 = ARMv8.0 Compatible CPU +ARMv81 = ARMv8.1 Compatible CPU +ARMv8-ThunderX = ARMv8 Cavium ThunderX CPU +SNB = Intel Sandy/Ivy Bridge CPUs +HSW = Intel Haswell CPUs +BDW = Intel Broadwell Xeon E-class CPUs +SKX = Intel Sky Lake Xeon E-class HPC CPUs (AVX512) +KNC = Intel Knights Corner Xeon Phi +KNL = Intel Knights Landing Xeon Phi +Kepler30 = NVIDIA Kepler generation CC 3.0 +Kepler32 = NVIDIA Kepler generation CC 3.2 +Kepler35 = NVIDIA Kepler generation CC 3.5 +Kepler37 = NVIDIA Kepler generation CC 3.7 +Maxwell50 = NVIDIA Maxwell generation CC 5.0 +Maxwell52 = NVIDIA Maxwell generation CC 5.2 +Maxwell53 = NVIDIA Maxwell generation CC 5.3 +Pascal60 = NVIDIA Pascal generation CC 6.0 +Pascal61 = NVIDIA Pascal generation CC 6.1 +BGQ = IBM Blue Gene/Q CPUs +Power8 = IBM POWER8 CPUs +Power9 = IBM POWER9 CPUs :ul -run with 1 MPI task/node and N threads/task -run with N MPI tasks/node and 1 thread/task -run with settings in between these extremes :ul +KOKKOS_USE_TPLS=hwloc binds threads to hardware cores, so they do not +migrate during a simulation. KOKKOS_USE_TPLS=hwloc should always be +used if running with KOKKOS_DEVICES=Pthreads for pthreads. It is not +necessary for KOKKOS_DEVICES=OpenMP for OpenMP, because OpenMP +provides alternative methods via environment variables for binding +threads to hardware cores. More info on binding threads to cores is +given in "Section 5.3"_Section_accelerate.html#acc_3. -Examples of mpirun commands in these modes are shown above. +KOKKOS_USE_TPLS=librt enables use of a more accurate timer mechanism +on most Unix platforms. This library is not available on all +platforms. -When using KOKKOS to perform multi-threading, it is important for -performance to bind both MPI tasks to physical cores, and threads to -physical cores, so they do not migrate during a simulation. +KOKKOS_DEBUG is only useful when developing a Kokkos-enabled style +within LAMMPS. KOKKOS_DEBUG=yes enables printing of run-time +debugging information that can be useful. It also enables runtime +bounds checking on Kokkos data structures. -If you are not certain MPI tasks are being bound (check the defaults -for your MPI installation), binding can be forced with these flags: +KOKKOS_CXX_STANDARD and KOKKOS_OPTIONS are typically not changed when building LAMMPS. -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 ... :pre - -For binding threads with the KOKKOS OMP option, use thread affinity -environment variables to force binding. With OpenMP 3.1 (gcc 4.7 or -later, intel 12 or later) setting the environment variable -OMP_PROC_BIND=true should be sufficient. For binding threads with the -KOKKOS pthreads option, compile LAMMPS the KOKKOS HWLOC=yes option -(see "this section"_Section_packages.html#KOKKOS of the manual for -details). - -[Running on GPUs:] - -Insure the -arch setting in the machine makefile you are using, -e.g. src/MAKE/Makefile.cuda, is correct for your GPU hardware/software. -(see "this section"_Section_packages.html#KOKKOS of the manual for -details). - -The -np setting of the mpirun command should set the number of MPI -tasks/node to be equal to the # of physical GPUs on the node. - -Use the "-k" "command-line switch"_Section_commands.html#start_6 to -specify the number of GPUs per node, and the number of threads per MPI -task. As above for multi-core CPUs (and no GPU), if N is the number -of physical cores/node, then the number of MPI tasks/node * number of -threads/task should not exceed N. With one GPU (and one MPI task) it -may be faster to use less than all the available cores, by setting -threads/task to a smaller value. This is because using all the cores -on a dual-socket node will incur extra cost to copy memory from the -2nd socket to the GPU. - -Examples of mpirun commands that follow these rules are shown above. - -NOTE: When using a GPU, you will achieve the best performance if your -input script does not use any fix or compute styles which are not yet -Kokkos-enabled. This allows data to stay on the GPU for multiple -timesteps, without being copied back to the host CPU. Invoking a -non-Kokkos fix or compute, or performing I/O for -"thermo"_thermo_style.html or "dump"_dump.html output will cause data -to be copied back to the CPU. - -You cannot yet assign multiple MPI tasks to the same GPU with the -KOKKOS package. We plan to support this in the future, similar to the -GPU package in LAMMPS. - -You cannot yet use both the host (multi-threaded) and device (GPU) -together to compute pairwise interactions with the KOKKOS package. We -hope to support this in the future, similar to the GPU package in -LAMMPS. - -[Running on an Intel Phi:] - -Kokkos only uses Intel Phi processors in their "native" mode, i.e. -not hosted by a CPU. - -As illustrated above, build LAMMPS with OMP=yes (the default) and -MIC=yes. The latter insures code is correctly compiled for the Intel -Phi. The OMP setting means OpenMP will be used for parallelization on -the Phi, which is currently the best option within Kokkos. In the -future, other options may be added. - -Current-generation Intel Phi chips have either 61 or 57 cores. One -core should be excluded for running the OS, leaving 60 or 56 cores. -Each core is hyperthreaded, so there are effectively N = 240 (4*60) or -N = 224 (4*56) cores to run on. - -The -np setting of the mpirun command sets the number of MPI -tasks/node. The "-k on t Nt" command-line switch sets the number of -threads/task as Nt. The product of these 2 values should be N, i.e. -240 or 224. Also, the number of threads/task should be a multiple of -4 so that logical threads from more than one MPI task do not run on -the same physical core. - -Examples of mpirun commands that follow these rules are shown above. +KOKKOS_CUDA_OPTIONS are additional options for CUDA. The LAMMPS KOKKOS package must be compiled +with the {enable_lambda} option when using GPUs. [Restrictions:] -As noted above, if using GPUs, the number of MPI tasks per compute -node should equal to the number of GPUs per compute node. In the -future Kokkos will support assigning multiple MPI tasks to a single -GPU. - -Currently Kokkos does not support AMD GPUs due to limits in the -available backend programming models. Specifically, Kokkos requires -extensive C++ support from the Kernel language. This is expected to -change in the future. +Currently, there are no precision options with the KOKKOS +package. All compilation and computation is performed in double +precision. diff --git a/doc/src/accelerate_omp.txt b/doc/src/accelerate_omp.txt index 81b7a5adc2..fa7bef1a52 100644 --- a/doc/src/accelerate_omp.txt +++ b/doc/src/accelerate_omp.txt @@ -23,8 +23,7 @@ one or more 16-core nodes. More details follow. use -fopenmp with CCFLAGS and LINKFLAGS in Makefile.machine make yes-user-omp make mpi # build with USER-OMP package, if settings added to Makefile.mpi -make omp # or Makefile.omp already has settings -Make.py -v -p omp -o mpi -a file mpi # or one-line build via Make.py :pre +make omp # or Makefile.omp already has settings :pre lmp_mpi -sf omp -pk omp 16 < in.script # 1 MPI task, 16 threads mpirun -np 4 lmp_mpi -sf omp -pk omp 4 -in in.script # 4 MPI tasks, 4 threads/task @@ -40,14 +39,11 @@ each MPI task running on a CPU. The lines above illustrate how to include/build with the USER-OMP package in two steps, using the "make" command. Or how to do it with -one command via the src/Make.py script, described in "Section -4"_Section_packages.html of the manual. Type "Make.py -h" for -help. +one command as described in "Section 4"_Section_packages.html of the manual. Note that the CCFLAGS and LINKFLAGS settings in Makefile.machine must include "-fopenmp". Likewise, if you use an Intel compiler, the -CCFLAGS setting must include "-restrict". The Make.py command will -add these automatically. +CCFLAGS setting must include "-restrict". [Run with the USER-OMP package from the command line:] diff --git a/doc/src/accelerate_opt.txt b/doc/src/accelerate_opt.txt index 5a2a5eac0a..845264b522 100644 --- a/doc/src/accelerate_opt.txt +++ b/doc/src/accelerate_opt.txt @@ -21,8 +21,7 @@ Here is a quick overview of how to use the OPT package. More details follow. make yes-opt -make mpi # build with the OPT package -Make.py -v -p opt -o mpi -a file mpi # or one-line build via Make.py :pre +make mpi # build with the OPT package :pre lmp_mpi -sf opt -in in.script # run in serial mpirun -np 4 lmp_mpi -sf opt -in in.script # run in parallel :pre @@ -35,13 +34,10 @@ None. The lines above illustrate how to build LAMMPS with the OPT package in two steps, using the "make" command. Or how to do it with one command -via the src/Make.py script, described in "Section -4"_Section_packages.html of the manual. Type "Make.py -h" for -help. +as described in "Section 4"_Section_packages.html of the manual. Note that if you use an Intel compiler to build with the OPT package, the CCFLAGS setting in your Makefile.machine must include "-restrict". -The Make.py command will add this automatically. [Run with the OPT package from the command line:] diff --git a/doc/src/angle_class2.txt b/doc/src/angle_class2.txt index 71a508d691..d4330139c9 100644 --- a/doc/src/angle_class2.txt +++ b/doc/src/angle_class2.txt @@ -9,6 +9,7 @@ angle_style class2 command :h3 angle_style class2/omp command :h3 angle_style class2/kk command :h3 +angle_style class2/p6 command :h3 [Syntax:] @@ -102,11 +103,29 @@ more instructions on how to use the accelerated styles effectively. :line +The {class2/p6} angle style uses the {class2} potential expanded to sixth order: + +:c,image(Eqs/angle_class2_p6.jpg) + +In this expanded term 6 coefficients for the Ea formula need to be set: + +theta0 (degrees) +K2 (energy/radian^2) +K3 (energy/radian^3) +K4 (energy/radian^4) +K5 (energy/radian^5) +K6 (energy/radian^6) :ul + +The bond-bond and bond-angle terms remain unchanged. + +:line + [Restrictions:] This angle style can only be used if LAMMPS was built with the CLASS2 -package. See the "Making LAMMPS"_Section_start.html#start_3 section -for more info on packages. +package. For the {class2/p6} style LAMMPS needs to be built with the +USER-MOFFF package. See the "Making LAMMPS"_Section_start.html#start_3 +section for more info on packages. [Related commands:] diff --git a/doc/src/angle_cosine_buck6d.txt b/doc/src/angle_cosine_buck6d.txt new file mode 100644 index 0000000000..7182ffecc8 --- /dev/null +++ b/doc/src/angle_cosine_buck6d.txt @@ -0,0 +1,65 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +angle_style cosine/buck6d command :h3 + +[Syntax:] + +angle_style cosine/buck6d :pre + +[Examples:] + +angle_style cosine/buck6d +angle_coeff 1 cosine/buck6d 1.978350 4 180.000000 :pre + +[Description:] + +The {cosine/buck6d} angle style uses the potential + +:c,image(Eqs/angle_cosine_buck6d.jpg) + +where K is the energy constant, n is the periodic multiplicity and +Theta0 is the equilibrium angle. + +The coefficients must be defined for each angle type via the +"angle_coeff"_angle_coeff.html command as in the example above, or in +the data file or restart files read by the "read_data"_read_data.html +or "read_restart"_read_restart.html commands in the following order: + +K (energy) +n +Theta0 (degrees) :ul + +Theta0 is specified in degrees, but LAMMPS converts it to radians +internally. + +Additional to the cosine term the {cosine/buck6d} angle style computes +the short range (vdW) interaction belonging to the +"pair_buck6d"_pair_buck6d_coul_gauss.html between the end atoms of +the angle. For this reason this angle style only works in combination +with the "pair_buck6d"_pair_buck6d_coul_gauss.html styles and needs +the "special_bonds"_special_bonds.html 1-3 interactions to be weighted +0.0 to prevent double counting. + +:line + +[Restrictions:] + +{cosine/buck6d} can only be used in combination with the +"pair_buck6d"_pair_buck6d_coul_gauss.html style and with a +"special_bonds"_special_bonds.html 0.0 weighting of 1-3 interactions. + +This angle style can only be used if LAMMPS was built with the +USER-MOFFF package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info on packages. + +[Related commands:] + +"angle_coeff"_angle_coeff.html + +[Default:] none diff --git a/doc/src/angles.txt b/doc/src/angles.txt index ff1f68d45a..3e91ba9917 100644 --- a/doc/src/angles.txt +++ b/doc/src/angles.txt @@ -8,6 +8,7 @@ Angle Styles :h1 angle_charmm angle_class2 angle_cosine + angle_cosine_buck6d angle_cosine_delta angle_cosine_periodic angle_cosine_shift diff --git a/doc/src/atom_modify.txt b/doc/src/atom_modify.txt index d5c82f16ac..1dc0fa6bfb 100644 --- a/doc/src/atom_modify.txt +++ b/doc/src/atom_modify.txt @@ -16,7 +16,7 @@ atom_modify keyword values ... :pre one or more keyword/value pairs may be appended :ulb,l keyword = {id} or {map} or {first} or {sort} :l {id} value = {yes} or {no} - {map} value = {array} or {hash} + {map} value = {yes} or {array} or {hash} {first} value = group-ID = group whose atoms will appear first in internal atom lists {sort} values = Nfreq binsize Nfreq = sort atoms spatially every this many time steps @@ -25,8 +25,8 @@ keyword = {id} or {map} or {first} or {sort} :l [Examples:] -atom_modify map hash -atom_modify map array sort 10000 2.0 +atom_modify map yes +atom_modify map hash sort 10000 2.0 atom_modify first colloid :pre [Description:] @@ -62,29 +62,33 @@ switch. This is described in "Section 2.2"_Section_start.html#start_2 of the manual. If atom IDs are not used, they must be specified as 0 for all atoms, e.g. in a data or restart file. -The {map} keyword determines how atom ID lookup is done for molecular -atom styles. Lookups are performed by bond (angle, etc) routines in -LAMMPS to find the local atom index associated with a global atom ID. +The {map} keyword determines how atoms with specific IDs are found +when required. An example are the bond (angle, etc) methods which +need to find the local index of an atom with a specific global ID +which is a bond (angle, etc) partner. LAMMPS performs this operation +efficiently by creating a "map", which is either an {array} or {hash} +table, as descibed below. -When the {array} value is used, each processor stores a lookup table -of length N, where N is the largest atom ID in the system. This is a +When the {map} keyword is not specified in your input script, LAMMPS +only creates a map for "atom_styles"_atom_style.html for molecular +systems which have permanent bonds (angles, etc). No map is created +for atomic systems, since it is normally not needed. However some +LAMMPS commands require a map, even for atomic systems, and will +generate an error if one does not exist. The {map} keyword thus +allows you to force the creation of a map. The {yes} value will +create either an {array} or {hash} style map, as explained in the next +paragraph. The {array} and {hash} values create an atom-style or +hash-style map respectively. + +For an {array}-style map, each processor stores a lookup table of +length N, where N is the largest atom ID in the system. This is a fast, simple method for many simulations, but requires too much memory -for large simulations. The {hash} value uses a hash table to perform -the lookups. This can be slightly slower than the {array} method, but -its memory cost is proportional to the number of atoms owned by a -processor, i.e. N/P when N is the total number of atoms in the system -and P is the number of processors. - -When this setting is not specified in your input script, LAMMPS -creates a map, if one is needed, as an array or hash. See the -discussion of default values below for how LAMMPS chooses which kind -of map to build. Note that atomic systems do not normally need to -create a map. However, even in this case some LAMMPS commands will -create a map to find atoms (and then destroy it), or require a -permanent map. An example of the former is the "velocity loop -all"_velocity.html command, which uses a map when looping over all -atoms and insuring the same velocity values are assigned to an atom -ID, no matter which processor owns it. +for large simulations. For a {hash}-style map, a hash table is +created on each processor, which finds an atom ID in constant time +(independent of the global number of atom IDs). It can be slightly +slower than the {array} map, but its memory cost is proportional to +the number of atoms owned by a processor, i.e. N/P when N is the total +number of atoms in the system and P is the number of processors. The {first} keyword allows a "group"_group.html to be specified whose atoms will be maintained as the first atoms in each processor's list diff --git a/doc/src/atom_style.txt b/doc/src/atom_style.txt index 077636dfd1..49d9dde791 100644 --- a/doc/src/atom_style.txt +++ b/doc/src/atom_style.txt @@ -13,17 +13,19 @@ atom_style command :h3 atom_style style args :pre style = {angle} or {atomic} or {body} or {bond} or {charge} or {dipole} or \ - {dpd} or {electron} or {ellipsoid} or {full} or {line} or {meso} or \ - {molecular} or {peri} or {smd} or {sphere} or {tri} or \ - {template} or {hybrid} :ulb,l + {dpd} or {edpd} or {mdpd} or {tdpd} or {electron} or {ellipsoid} or \ + {full} or {line} or {meso} or {molecular} or {peri} or {smd} or \ + {sphere} or {tri} or {template} or {hybrid} :ulb,l args = none for any style except the following - {body} args = bstyle bstyle-args - bstyle = style of body particles - bstyle-args = additional arguments specific to the bstyle - see the "body"_body.html doc page for details - {template} args = template-ID - template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command - {hybrid} args = list of one or more sub-styles, each with their args :pre + {body} args = bstyle bstyle-args + bstyle = style of body particles + bstyle-args = additional arguments specific to the bstyle + see the "body"_body.html doc page for details + {tdpd} arg = Nspecies + Nspecies = # of chemical species + {template} arg = template-ID + template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command + {hybrid} args = list of one or more sub-styles, each with their args :pre accelerated styles (with same args) = {angle/kk} or {atomic/kk} or {bond/kk} or {charge/kk} or {full/kk} or {molecular/kk} :l :ule @@ -36,7 +38,8 @@ atom_style full atom_style body nparticle 2 10 atom_style hybrid charge bond atom_style hybrid charge body nparticle 2 5 -atom_style template myMols :pre +atom_style template myMols +atom_style tdpd 2 :pre [Description:] @@ -74,6 +77,9 @@ quantities. {charge} | charge | atomic system with charges | {dipole} | charge and dipole moment | system with dipolar particles | {dpd} | internal temperature and internal energies | DPD particles | +{edpd} | temperature and heat capacity | eDPD particles | +{mdpd} | density | mDPD particles | +{tdpd} | chemical concentration | tDPD particles | {electron} | charge and spin and eradius | electronic force field | {ellipsoid} | shape, quaternion, angular momentum | aspherical particles | {full} | molecular + charge | bio-molecules | @@ -145,6 +151,19 @@ properties with internal temperature (dpdTheta), internal conductive energy (uCond), internal mechanical energy (uMech), and internal chemical energy (uChem). +The {edpd} style is for energy-conserving dissipative particle +dynamics (eDPD) particles which store a temperature (edpd_temp), and +heat capacity(edpd_cv). + +The {mdpd} style is for many-body dissipative particle dynamics (mDPD) +particles which store a density (rho) for considering +density-dependent many-body interactions. + +The {tdpd} style is for transport dissipative particle dynamics (tDPD) +particles which store a set of chemical concentration. An integer +"cc_species" is required to specify the number of chemical species +involved in a tDPD system. + The {meso} style is for smoothed particle hydrodynamics (SPH) particles which store a density (rho), energy (e), and heat capacity (cv). @@ -284,6 +303,11 @@ force fields"_pair_eff.html. The {dpd} style is part of the USER-DPD package for dissipative particle dynamics (DPD). +The {edpd}, {mdpd}, and {tdpd} styles are part of the USER-MESO package +for energy-conserving dissipative particle dynamics (eDPD), many-body +dissipative particle dynamics (mDPD), and transport dissipative particle +dynamics (tDPD), respectively. + The {meso} style is part of the USER-SPH package for smoothed particle hydrodynamics (SPH). See "this PDF guide"_USER/sph/SPH_LAMMPS_userguide.pdf to using SPH in LAMMPS. diff --git a/doc/src/body.txt b/doc/src/body.txt index d44f82d4cc..344e5b1d65 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -6,7 +6,7 @@ :line -Body particles :h3 +Body particles :h1 [Overview:] @@ -261,7 +261,7 @@ For images created by the "dump image"_dump_image.html command, if the polygon consisting of N line segments. Note that the line segments are drawn between the N vertices, which does not correspond exactly to the physical extent of the body (because the "pair_style -rounded/polygon"_pair_body_rounded_polygon.cpp defines finite-size +rounded/polygon"_pair_body_rounded_polygon.html defines finite-size spheres at those point and the line segments between the spheres are tangent to the spheres). The drawn diameter of each line segment is determined by the {bflag1} parameter for the {body} keyword. The diff --git a/doc/src/bond_gromos.txt b/doc/src/bond_gromos.txt new file mode 100644 index 0000000000..cc3ff75878 --- /dev/null +++ b/doc/src/bond_gromos.txt @@ -0,0 +1,73 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +bond_style gromos command :h3 +bond_style gromos/omp command :h3 + +[Syntax:] + +bond_style gromos :pre + +[Examples:] + +bond_style gromos +bond_coeff 5 80.0 1.2 :pre + +[Description:] + +The {gromos} bond style uses the potential + +:c,image(Eqs/bond_gromos.jpg) + +where r0 is the equilibrium bond distance. Note that the usual 1/4 +factor is included in K. + +The following coefficients must be defined for each bond type via the +"bond_coeff"_bond_coeff.html command as in the example above, or in +the data file or restart files read by the "read_data"_read_data.html +or "read_restart"_read_restart.html commands: + +K (energy/distance^4) +r0 (distance) :ul + +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + +[Restrictions:] + +This bond style can only be used if LAMMPS was built with the +MOLECULE package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info on packages. + +[Related commands:] + +"bond_coeff"_bond_coeff.html, "delete_bonds"_delete_bonds.html + +[Default:] none diff --git a/doc/src/bonds.txt b/doc/src/bonds.txt index 169d56ecbe..d33515eb88 100644 --- a/doc/src/bonds.txt +++ b/doc/src/bonds.txt @@ -8,6 +8,7 @@ Bond Styles :h1 bond_class2 bond_fene bond_fene_expand + bond_gromos bond_harmonic bond_harmonic_shift bond_harmonic_shift_cut diff --git a/doc/src/commands.txt b/doc/src/commands.txt index 7889ea5e7a..5fb06f2011 100644 --- a/doc/src/commands.txt +++ b/doc/src/commands.txt @@ -32,6 +32,7 @@ Commands :h1 dimension displace_atoms dump + dump_cfg_uef dump_h5md dump_image dump_modify @@ -92,6 +93,7 @@ Commands :h1 tad temper temper_grem + temper_npt thermo thermo_modify thermo_style diff --git a/doc/src/compute.txt b/doc/src/compute.txt index eed190aeb2..c06735d28e 100644 --- a/doc/src/compute.txt +++ b/doc/src/compute.txt @@ -169,6 +169,7 @@ by users which are included in the LAMMPS distribution. The list of these with links to the individual styles are given in the compute section of "this page"_Section_commands.html#cmd_5. +"aggregate/atom"_compute_cluster_atom.html - aggregate ID for each atom "angle/local"_compute_bond_local.html - theta and energy of each angle "angmom/chunk"_compute_angmom_chunk.html - angular momentum for each chunk "body/local"_compute_body_local.html - attributes of body sub-particles @@ -191,6 +192,7 @@ section of "this page"_Section_commands.html#cmd_5. "erotate/sphere"_compute_erotate_sphere.html - rotational energy of spherical particles "erotate/sphere/atom"_compute_erotate_sphere.html - rotational energy for each spherical particle "event/displace"_compute_event_displace.html - detect event on atom displacement +"fragment/atom"_compute_cluster_atom.html - fragment ID for each atom "group/group"_compute_group_group.html - energy/force between two groups of atoms "gyration"_compute_gyration.html - radius of gyration of group of atoms "gyration/chunk"_compute_gyration_chunk.html - radius of gyration for each chunk diff --git a/doc/src/compute_cluster_atom.txt b/doc/src/compute_cluster_atom.txt index 147d06c2a8..94113de5f2 100644 --- a/doc/src/compute_cluster_atom.txt +++ b/doc/src/compute_cluster_atom.txt @@ -7,37 +7,62 @@ :line compute cluster/atom command :h3 +compute fragment/atom command :h3 +compute aggregate/atom command :h3 [Syntax:] -compute ID group-ID cluster/atom cutoff :pre +compute ID group-ID cluster/atom cutoff +compute ID group-ID fragment/atom +compute ID group-ID aggregate/atom cutoff :pre ID, group-ID are documented in "compute"_compute.html command -cluster/atom = style name of this compute command +{cluster/atom} or {fragment/atom} or {aggregate/atom} = style name of this compute command cutoff = distance within which to label atoms as part of same cluster (distance units) :ul [Examples:] -compute 1 all cluster/atom 1.0 :pre +compute 1 all cluster/atom 3.5 +compute 1 all fragment/atom :pre +compute 1 all aggregate/atom 3.5 :pre [Description:] -Define a computation that assigns each atom a cluster ID. +Define a computation that assigns each atom a cluster, fragment, +or aggregate ID. A cluster is defined as a set of atoms, each of which is within the cutoff distance from one or more other atoms in the cluster. If an atom has no neighbors within the cutoff distance, then it is a 1-atom -cluster. The ID of every atom in the cluster will be the smallest -atom ID of any atom in the cluster. +cluster. + +A fragment is similarly defined as a set of atoms, each of +which has an explicit bond (i.e. defined via a "data file"_read_data.html, +the "create_bonds"_create_bonds.html command, or through fixes like +"fix bond/create"_fix_bond_create.html, "fix bond/swap"_fix_bond_swap.html, +or "fix bond/break"_fix_bond_break.html). The cluster ID or fragment ID +of every atom in the cluster will be set to the smallest atom ID of any atom +in the cluster or fragment, respectively. + +An aggregate is defined by combining the rules for clusters and +fragments, i.e. a set of atoms, where each of it is within the cutoff +distance from one or more atoms within a fragment that is part of +the same cluster. This measure can be used to track molecular assemblies +like micelles. Only atoms in the compute group are clustered and assigned cluster -IDs. Atoms not in the compute group are assigned a cluster ID = 0. +IDs. Atoms not in the compute group are assigned a cluster ID = 0. +For fragments, only bonds where [both] atoms of the bond are included +in the compute group are assigned to fragments, so that only fragments +are detected where [all] atoms are in the compute group. Thus atoms +may be included in the compute group, yes still have a fragment ID of 0. -The neighbor list needed to compute this quantity is constructed each -time the calculation is performed (i.e. each time a snapshot of atoms -is dumped). Thus it can be inefficient to compute/dump this quantity -too frequently or to have multiple compute/dump commands, each of a -{cluster/atom} style. +For computes {cluster/atom} and {aggregate/atom} the neighbor list needed +to compute this quantity is constructed each time the calculation is +performed (i.e. each time a snapshot of atoms is dumped). Thus it can be +inefficient to compute/dump this quantity too frequently or to have +multiple compute/dump commands, each of a {cluster/atom} or +{aggregate/atom} style. NOTE: If you have a bonded system, then the settings of "special_bonds"_special_bonds.html command can remove pairwise diff --git a/doc/src/compute_dihedral_local.txt b/doc/src/compute_dihedral_local.txt index 91370a947a..865e86fddb 100644 --- a/doc/src/compute_dihedral_local.txt +++ b/doc/src/compute_dihedral_local.txt @@ -27,8 +27,8 @@ compute 1 all dihedral/local phi :pre Define a computation that calculates properties of individual dihedral interactions. The number of datums generated, aggregated across all -processors, equals the number of angles in the system, modified by the -group parameter as explained below. +processors, equals the number of dihedral angles in the system, modified +by the group parameter as explained below. The value {phi} is the dihedral angle, as defined in the diagram on the "dihedral_style"_dihedral_style.html doc page. diff --git a/doc/src/compute_edpd_temp_atom.txt b/doc/src/compute_edpd_temp_atom.txt new file mode 100644 index 0000000000..5b8c8ebd67 --- /dev/null +++ b/doc/src/compute_edpd_temp_atom.txt @@ -0,0 +1,62 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +compute edpd/temp/atom command :h3 + +[Syntax:] + +compute ID group-ID edpd/temp/atom :pre + +ID, group-ID are documented in "compute"_compute.html command +edpd/temp/atom = style name of this compute command :ul + +[Examples:] + +compute 1 all edpd/temp/atom :pre + +[Description:] + +Define a computation that calculates the per-atom temperature +for each eDPD particle in a group. + +The temperature is a local temperature derived from the internal energy +of each eDPD particle based on the local equilibrium hypothesis. +For more details please see "(Espanol1997)"_#Espanol1997 and +"(Li2014)"_#Li2014a. + +[Output info:] + +This compute calculates a per-atom vector, which can be accessed by +any command that uses per-atom values from a compute as input. See +"Section 6.15"_Section_howto.html#howto_15 for an overview of +LAMMPS output options. + +The per-atom vector values will be in temperature "units"_units.html. + +[Restrictions:] + +This compute is part of the USER-MESO package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"pair_style edpd"_pair_meso.html + +[Default:] none + +:line + +:link(Espanol1997) +[(Espanol1997)] Espanol, Europhys Lett, 40(6): 631-636 (1997). DOI: +10.1209/epl/i1997-00515-8 + +:link(Li2014a) +[(Li2014)] Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, 265: +113-127 (2014). DOI: 10.1016/j.jcp.2014.02.003. + diff --git a/doc/src/compute_orientorder_atom.txt b/doc/src/compute_orientorder_atom.txt index 70c7ef68f7..adf11dcfcf 100644 --- a/doc/src/compute_orientorder_atom.txt +++ b/doc/src/compute_orientorder_atom.txt @@ -67,7 +67,7 @@ parameters. This is followed by that number of integers giving the degree of each order parameter. Because {Q}2 and all odd-degree order parameters are zero for atoms in cubic crystals (see "Steinhardt"_#Steinhardt), the default order parameters are {Q}4, -{Q}6, {Q}8, {Q}10, and {Q}12. For the FCC crystal with {nnn}=12, {Q}4 +{Q}6, {Q}8, {Q}10, and {Q}12. For the FCC crystal with {nnn} =12, {Q}4 = sqrt(7/3)/8 = 0.19094.... The numerical values of all order parameters up to {Q}12 for a range of commonly encountered high-symmetry structures are given in Table I of "Mickel et diff --git a/doc/src/compute_pressure_uef.txt b/doc/src/compute_pressure_uef.txt new file mode 100644 index 0000000000..5b252b369d --- /dev/null +++ b/doc/src/compute_pressure_uef.txt @@ -0,0 +1,61 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +compute pressure/uef command :h3 + +[Syntax:] + +compute ID group-ID pressure/uef temp-ID keyword ... :pre + +ID, group-ID are documented in "compute"_compute.html command +pressure/uef = style name of this compute command +temp-ID = ID of compute that calculates temperature, can be NULL if not needed +zero or more keywords may be appended +keyword = {ke} or {pair} or {bond} or {angle} or {dihedral} or {improper} or {kspace} or {fix} or {virial} :ul + +[Examples:] + +compute 1 all pressure/uef my_temp_uef +compute 2 all pressure/uef my_temp_uef virial :pre + +[Description:] + +This command is used to compute the pressure tensor in +the reference frame of the applied flow field when +"fix nvt/uef"_fix_nh_uef.html" or +"fix npt/uef"_fix_nh_uef.html" is used. +It is not necessary to use this command to compute the scalar +value of the pressure. A "compute pressure"_compute_pressure.html +may be used for that purpose. + +The keywords and output information are documented in +"compute_pressure"_compute_pressure.html. + +[Restrictions:] + +This fix is part of the USER-UEF package. It is only enabled if +LAMMPS was built with that package. See the +"Making LAMMPS"_Section_start.html#start_3 section for more info. + +This command can only be used when "fix nvt/uef"_fix_nh_uef.html +or "fix npt/uef"_fix_nh_uef.html is active. + +The kinetic contribution to the pressure tensor +will be accurate only when +the compute specified by {temp-ID} is a +"compute temp/uef"_compute_temp_uef.html. + +[Related commands:] + +"compute pressure"_compute_pressure.html, +"fix nvt/uef"_fix_nh_uef.html, +"compute temp/uef"_compute_temp_uef.html + +[Default:] none + + diff --git a/doc/src/compute_sna_atom.txt b/doc/src/compute_sna_atom.txt index defd98d520..1c3787e696 100644 --- a/doc/src/compute_sna_atom.txt +++ b/doc/src/compute_sna_atom.txt @@ -224,7 +224,7 @@ block contains six sub-blocks corresponding to the {xx}, {yy}, {zz}, notation. Each of these sub-blocks contains one column for each bispectrum component, the same as for compute {sna/atom} -For example, if {K}=30 and ntypes=1, the number of columns in the per-atom +For example, if {K} =30 and ntypes=1, the number of columns in the per-atom arrays generated by {sna/atom}, {snad/atom}, and {snav/atom} are 30, 90, and 180, respectively. With {quadratic} value=1, the numbers of columns are 930, 2790, and 5580, respectively. diff --git a/doc/src/compute_tdpd_cc_atom.txt b/doc/src/compute_tdpd_cc_atom.txt new file mode 100644 index 0000000000..a6a12dc52c --- /dev/null +++ b/doc/src/compute_tdpd_cc_atom.txt @@ -0,0 +1,60 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +compute tdpd/cc/atom command :h3 + +[Syntax:] + +compute ID group-ID tdpd/cc/atom index :pre + +ID, group-ID are documented in "compute"_compute.html command +tdpd/cc/atom = style name of this compute command +index = index of chemical species (1 to Nspecies) :ul + +[Examples:] + +compute 1 all tdpd/cc/atom 2 :pre + +[Description:] + +Define a computation that calculates the per-atom chemical +concentration of a specified species for each tDPD particle in a +group. + +The chemical concentration of each species is defined as the number of +molecules carried by a tDPD particle for dilute solution. For more +details see "(Li2015)"_#Li2015a. + +[Output info:] + +This compute calculates a per-atom vector, which can be accessed by +any command that uses per-atom values from a compute as input. See +"Section 6.15"_Section_howto.html#howto_15 for an overview of +LAMMPS output options. + +The per-atom vector values will be in the units of chemical species +per unit mass. + +[Restrictions:] + +This compute is part of the USER-MESO package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"pair_style tdpd"_pair_meso.html + +[Default:] none + +:line + +:link(Li2015a) +[(Li2015)] Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, 143: +014101 (2015). DOI: 10.1063/1.4923254 + diff --git a/doc/src/compute_temp_uef.txt b/doc/src/compute_temp_uef.txt new file mode 100644 index 0000000000..acd3a6218d --- /dev/null +++ b/doc/src/compute_temp_uef.txt @@ -0,0 +1,52 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +compute temp/uef command :h3 + +[Syntax:] + +compute ID group-ID temp/uef :pre + +ID, group-ID are documented in "compute"_compute.html command +temp/uef = style name of this compute command :ul + +[Examples:] + +compute 1 all temp/uef +compute 2 sel temp/uef :pre + +[Description:] + +This command is used to compute the kinetic energy tensor in +the reference frame of the applied flow field when +"fix nvt/uef"_fix_nh_uef.html" or +"fix npt/uef"_fix_nh_uef.html" is used. +It is not necessary to use this command to compute the scalar +value of the temperature. A "compute temp"_compute_temp.html +may be used for that purpose. + +Output information for this command can be found in the +documentation for "compute temp"_compute_temp.html. + +[Restrictions:] + +This fix is part of the USER-UEF package. It is only enabled if +LAMMPS was built with that package. See the +"Making LAMMPS"_Section_start.html#start_3 section for more info. + +This command can only be used when "fix nvt/uef"_fix_nh_uef.html +or "fix npt/uef"_fix_nh_uef.html is active. + +[Related commands:] + +"compute temp"_compute_temp.html, +"fix nvt/uef"_fix_nh_uef.html, +"compute pressure/uef"_compute_pressure_uef.html + + +[Default:] none diff --git a/doc/src/compute_voronoi_atom.txt b/doc/src/compute_voronoi_atom.txt index d084fcee66..a280b2b151 100644 --- a/doc/src/compute_voronoi_atom.txt +++ b/doc/src/compute_voronoi_atom.txt @@ -217,7 +217,7 @@ This compute is part of the VORONOI package. It is only enabled if LAMMPS was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. -It also requiers you have a copy of the Voro++ library built and +It also requires you have a copy of the Voro++ library built and installed on your system. See instructions on obtaining and installing the Voro++ software in the src/VORONOI/README file. diff --git a/doc/src/computes.txt b/doc/src/computes.txt index 5a6ca66c46..1b64e2e5b4 100644 --- a/doc/src/computes.txt +++ b/doc/src/computes.txt @@ -30,6 +30,7 @@ Computes :h1 compute_displace_atom compute_dpd compute_dpd_atom + compute_edpd_temp_atom compute_erotate_asphere compute_erotate_rigid compute_erotate_sphere @@ -64,6 +65,7 @@ Computes :h1 compute_pe_atom compute_plasticity_atom compute_pressure + compute_pressure_uef compute_property_atom compute_property_chunk compute_property_local @@ -95,6 +97,7 @@ Computes :h1 compute_sna_atom compute_stress_atom compute_tally + compute_tdpd_cc_atom compute_temp compute_temp_asphere compute_temp_body @@ -112,6 +115,7 @@ Computes :h1 compute_temp_region_eff compute_temp_rotate compute_temp_sphere + compute_temp_uef compute_ti compute_torque_chunk compute_vacf diff --git a/doc/src/create_atoms.txt b/doc/src/create_atoms.txt index 7182f001d4..37e7cc1892 100644 --- a/doc/src/create_atoms.txt +++ b/doc/src/create_atoms.txt @@ -37,9 +37,9 @@ keyword = {mol} or {basis} or {insert} or {remap} or {var} or {set} or {units} : {set} values = dim name dim = {x} or {y} or {z} name = name of variable to set with x, y, or z atom position - {rotate} values = Rx Ry Rz theta - Rx,Ry,Rz = rotation vector for single molecule + {rotate} values = theta Rx Ry Rz theta = rotation angle for single molecule (degrees) + Rx,Ry,Rz = rotation vector for single molecule {units} value = {lattice} or {box} {lattice} = the geometry is defined in lattice units {box} = the geometry is defined in simulation box units :pre @@ -233,28 +233,30 @@ the sinusoid would appear to be "smoother". Also note the use of the converts lattice spacings to distance. Click on the image for a larger version. +dimension 2 variable x equal 100 variable y equal 25 lattice hex 0.8442 region box block 0 $x 0 $y -0.5 0.5 create_box 1 box :pre -variable xx equal 0.0 -variable yy equal 0.0 +variable xx internal 0.0 +variable yy internal 0.0 variable v equal "(0.2*v_y*ylat * cos(v_xx/xlat * 2.0*PI*4.0/v_x) + 0.5*v_y*ylat - v_yy) > 0.0" -create_atoms 1 box var v set x xx set y yy :pre +create_atoms 1 box var v set x xx set y yy +write_dump all atom sinusoid.lammpstrj :pre :c,image(JPG/sinusoid_small.jpg,JPG/sinusoid.jpg) -The {rotate} keyword can be used with the {single} style, when adding -a single molecule to specify the orientation at which the molecule is -inserted. The axis of rotation is determined by the rotation vector -(Rx,Ry,Rz) that goes through the insertion point. The specified -{theta} determines the angle of rotation around that axis. Note that -the direction of rotation for the atoms around the rotation axis is -consistent with the right-hand rule: if your right-hand's thumb points -along {R}, then your fingers wrap around the axis in the direction of -rotation. +The {rotate} keyword can only be used with the {single} style and +when adding a single molecule. It allows to specify the orientation +at which the molecule is inserted. The axis of rotation is +determined by the rotation vector (Rx,Ry,Rz) that goes through the +insertion point. The specified {theta} determines the angle of +rotation around that axis. Note that the direction of rotation for +the atoms around the rotation axis is consistent with the right-hand +rule: if your right-hand's thumb points along {R}, then your fingers +wrap around the axis in the direction of rotation. The {units} keyword determines the meaning of the distance units used to specify the coordinates of the one particle created by the {single} diff --git a/doc/src/create_bonds.txt b/doc/src/create_bonds.txt index 5a87852169..6af69214d3 100644 --- a/doc/src/create_bonds.txt +++ b/doc/src/create_bonds.txt @@ -18,7 +18,7 @@ style = {many} or {single/bond} or {single/angle} or {single/dihedral} :ule,l group2-ID = ID of second group, bonds will be between atoms in the 2 groups btype = bond type of created bonds rmin = minimum distance between pair of atoms to bond together - rmax = minimum distance between pair of atoms to bond together + rmax = maximum distance between pair of atoms to bond together {single/bond} args = btype batom1 batom2 btype = bond type of new bond batom1,batom2 = atom IDs for two atoms in bond diff --git a/doc/src/dihedral_fourier.txt b/doc/src/dihedral_fourier.txt index da892b59da..0accbb22bf 100644 --- a/doc/src/dihedral_fourier.txt +++ b/doc/src/dihedral_fourier.txt @@ -7,6 +7,7 @@ :line dihedral_style fourier command :h3 +dihedral_style fourier/intel command :h3 dihedral_style fourier/omp command :h3 [Syntax:] diff --git a/doc/src/dump.txt b/doc/src/dump.txt index 69a00eb473..1e6acc67e6 100644 --- a/doc/src/dump.txt +++ b/doc/src/dump.txt @@ -45,7 +45,7 @@ args = list of arguments for a particular style :l {xyz/gz} args = none {xyz/mpiio} args = none :pre -{custom} or {custom/gz} or {custom/mpiio} args = list of atom attributes :l +{custom} or {custom/gz} or {custom/mpiio} or {netcdf} or {netcdf/mpiio} args = list of atom attributes :l possible attributes = id, mol, proc, procp1, type, element, mass, x, y, z, xs, ys, zs, xu, yu, zu, xsu, ysu, zsu, ix, iy, iz, @@ -649,20 +649,7 @@ LAMMPS"_Section_start.html#start_3 section for more info. The {xtc} style is part of the MISC package. It is only enabled if LAMMPS was built with that package. See the "Making -LAMMPS"_Section_start.html#start_3 section for more info. This is -because some machines may not support the low-level XDR data format -that XTC files are written with, which will result in a compile-time -error when a low-level include file is not found. Putting this style -in a package makes it easy to exclude from a LAMMPS build for those -machines. However, the MISC package also includes two compatibility -header files and associated functions, which should be a suitable -substitute on machines that do not have the appropriate native header -files. This option can be invoked at build time by adding --DLAMMPS_XDR to the CCFLAGS variable in the appropriate low-level -Makefile, e.g. src/MAKE/Makefile.foo. This compatibility mode has -been tested successfully on Cray XT3/XT4/XT5 and IBM BlueGene/L -machines and should also work on IBM BG/P, and Windows XP/Vista/7 -machines. +LAMMPS"_Section_start.html#start_3 section for more info. [Related commands:] diff --git a/doc/src/dump_cfg_uef.txt b/doc/src/dump_cfg_uef.txt new file mode 100644 index 0000000000..e257f9c4f1 --- /dev/null +++ b/doc/src/dump_cfg_uef.txt @@ -0,0 +1,53 @@ + "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +dump cfg/uef command :h3 + +[Syntax:] + +dump ID group-ID cfg/uef N file mass type xs ys zs args :pre + +ID = user-assigned name for the dump :ulb,l +group-ID = ID of the group of atoms to be dumped :l +N = dump every this many timesteps :l +file = name of file to write dump info to :l +args = same as args for "dump custom"_dump.html :pre + +:ule + +[Examples:] + +dump 1 all cfg/uef 10 dump.*.cfg mass type xs ys zs +dump 2 all cfg/uef 100 dump.*.cfg mass type xs ys zs id c_stress :pre + +[Description:] + +This command is used to dump atomic coordinates in the +reference frame of the applied flow field when +"fix nvt/uef"_fix_nh_uef.html or +"fix npt/uef"_fix_nh_uef.html or is used. Only the atomic +coordinates and frame-invariant scalar quantities +will be in the flow frame. If velocities are selected +as output, for example, they will not be in the same +reference frame as the atomic positions. + +[Restrictions:] + +This fix is part of the USER-UEF package. It is only enabled if +LAMMPS was built with that package. See the +"Making LAMMPS"_Section_start.html#start_3 section for more info. + +This command can only be used when "fix nvt/uef"_fix_nh_uef.html +or "fix npt/uef"_fix_nh_uef.html is active. + +[Related commands:] + +"dump"_dump.html, +"fix nvt/uef"_fix_nh_uef.html + +[Default:] none diff --git a/doc/src/dump_modify.txt b/doc/src/dump_modify.txt index 2ea1da3db3..db727c2d4f 100644 --- a/doc/src/dump_modify.txt +++ b/doc/src/dump_modify.txt @@ -15,8 +15,9 @@ dump_modify dump-ID keyword values ... :pre dump-ID = ID of dump to modify :ulb,l one or more keyword/value pairs may be appended :l these keywords apply to various dump styles :l -keyword = {append} or {buffer} or {element} or {every} or {fileper} or {first} or {flush} or {format} or {image} or {label} or {nfile} or {pad} or {precision} or {region} or {scale} or {sort} or {thresh} or {unwrap} :l - {append} arg = {yes} or {no} or {at} N +keyword = {append} or {at} or {buffer} or {element} or {every} or {fileper} or {first} or {flush} or {format} or {image} or {label} or {nfile} or {pad} or {precision} or {region} or {scale} or {sort} or {thresh} or {unwrap} :l + {append} arg = {yes} or {no} + {at} arg = N N = index of frame written upon first dump {buffer} arg = {yes} or {no} {element} args = E1 E2 ... EN, where N = # of atom types @@ -141,13 +142,18 @@ and {dcd}. It also applies only to text output files, not to binary or gzipped or image/movie files. If specified as {yes}, then dump snapshots are appended to the end of an existing dump file. If specified as {no}, then a new dump file will be created which will -overwrite an existing file with the same name. If the {at} option is present -({netcdf} only), then the frame to append to can be specified. Negative values -are counted from the end of the file. This keyword can only take effect if the -dump_modify command is used after the "dump"_dump.html command, but before the -first command that causes dump snapshots to be output, e.g. a "run"_run.html or -"minimize"_minimize.html command. Once the dump file has been opened, this -keyword has no further effect. +overwrite an existing file with the same name. + +:line + +The {at} keyword only applies to the {netcdf} dump style. It can only +be used if the {append yes} keyword is also used. The {N} argument is +the index of which frame to append to. A negative value can be +specified for {N}, which means a frame counted from the end of the +file. The {at} keyword can only be used if the dump_modify command is +before the first command that causes dump snapshots to be output, +e.g. a "run"_run.html or "minimize"_minimize.html command. Once the +dump file has been opened, this keyword has no further effect. :line diff --git a/doc/src/dump_netcdf.txt b/doc/src/dump_netcdf.txt index 63568137a6..70111a36a8 100644 --- a/doc/src/dump_netcdf.txt +++ b/doc/src/dump_netcdf.txt @@ -25,7 +25,8 @@ args = list of atom attributes, same as for "dump_style custom"_dump.html :l,ule dump 1 all netcdf 100 traj.nc type x y z vx vy vz dump_modify 1 append yes at -1 thermo yes -dump 1 all netcdf/mpiio 1000 traj.nc id type x y z :pre +dump 1 all netcdf/mpiio 1000 traj.nc id type x y z +dump 1 all netcdf 1000 traj.*.nc id type x y z :pre [Description:] @@ -73,4 +74,3 @@ section for more info. [Related commands:] "dump"_dump.html, "dump_modify"_dump_modify.html, "undump"_undump.html - diff --git a/doc/src/fix.txt b/doc/src/fix.txt index 464eab3169..e54a918cd0 100644 --- a/doc/src/fix.txt +++ b/doc/src/fix.txt @@ -193,6 +193,7 @@ of "this page"_Section_commands.html#cmd_5. "halt"_fix_halt.html - terminate a dynamics run or minimization "heat"_fix_heat.html - add/subtract momentum-conserving heat "indent"_fix_indent.html - impose force due to an indenter +"latte"_fix_latte.html - wrapper on LATTE density-functional tight-binding code "langevin"_fix_langevin.html - Langevin temperature control "lineforce"_fix_lineforce.html - constrain atoms to move in a line "momentum"_fix_momentum.html - zero the linear and/or angular momentum of a group of atoms diff --git a/doc/src/fix_addforce.txt b/doc/src/fix_addforce.txt index 1cc0a15332..b2ac95eabb 100644 --- a/doc/src/fix_addforce.txt +++ b/doc/src/fix_addforce.txt @@ -139,6 +139,11 @@ forces added by this fix in a consistent manner. I.e. there is a decrease in potential energy when atoms move in the direction of the added force. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the added forces on atoms to the +system's virial as part of "thermodynamic output"_thermo_style.html. +The default is {virial no} + The "fix_modify"_fix_modify.html {respa} option is supported by this fix. This allows to set at which level of the "r-RESPA"_run_style.html integrator the fix is adding its forces. Default is the outermost diff --git a/doc/src/fix_atc.txt b/doc/src/fix_atc.txt index 75a82f063a..49014f0591 100644 --- a/doc/src/fix_atc.txt +++ b/doc/src/fix_atc.txt @@ -90,13 +90,11 @@ likewise for this post-processing example: run 1000 :pre the mesh's linear interpolation functions can be used as the localization function - by using the field option: +by using the field option: fix AtC internal atc field - fix_modify AtC mesh create 1 1 1 box p p p - - ... + ... :pre Note coupling and post-processing can be combined in the same simulations using separate fixes. @@ -108,11 +106,10 @@ No information about this fix is written to "binary restart files"_restart.html. [Restrictions:] -Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc. +Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc. In addition, currently: -Currently, -- the coupling is restricted to thermal physics -- the FE computations are done in serial on each processor. :ul +the coupling is restricted to thermal physics :ulb,l +the FE computations are done in serial on each processor. :l,ule [Related commands:] diff --git a/doc/src/fix_bond_create.txt b/doc/src/fix_bond_create.txt index a44c3103dd..c0045ac0f0 100644 --- a/doc/src/fix_bond_create.txt +++ b/doc/src/fix_bond_create.txt @@ -150,10 +150,9 @@ atoms. Note that adding a single bond always adds a new 1st neighbor but may also induce *many* new 2nd and 3rd 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 (1st + 2nd + 3rd neighbors) of this per-atom list. There are 3 +size (1st + 2nd + 3rd neighbors) of this per-atom list. There are 2 ways to do this. See the "read_data"_read_data.html or -"create_box"_create_box.html or "special_bonds extra" commands for -details. +"create_box"_create_box.html commands for details. NOTE: Even if you do not use the {atype}, {dtype}, or {itype} keywords, the list of topological neighbors is updated for atoms diff --git a/doc/src/fix_cmap.txt b/doc/src/fix_cmap.txt index 2b14a20c1d..f8de2b4efe 100644 --- a/doc/src/fix_cmap.txt +++ b/doc/src/fix_cmap.txt @@ -97,6 +97,11 @@ The "fix_modify"_fix_modify.html {energy} option is supported by this fix to add the potential "energy" of the CMAP interactions system's potential energy as part of "thermodynamic output"_thermo_style.html. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the interaction between atoms to +the system's virial as part of "thermodynamic output"_thermo_style.html. +The default is {virial yes} + This fix computes a global scalar which can be accessed by various "output commands"_Section_howto.html#howto_15. The scalar is the potential energy discussed above. The scalar value calculated by this @@ -115,6 +120,10 @@ quantity being minimized), you MUST enable the [Restrictions:] +To function as expected this fix command must be issued {before} a +"read_data"_read_data.html command but {after} a +"read_restart"_read_restart.html command. + This fix can only be used if LAMMPS was built with the MOLECULE package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info on packages. diff --git a/doc/src/fix_controller.txt b/doc/src/fix_controller.txt index cd4d6adfdf..cfb26138fd 100644 --- a/doc/src/fix_controller.txt +++ b/doc/src/fix_controller.txt @@ -83,7 +83,7 @@ the following dynamic equation: :c,image(Eqs/fix_controller1.jpg) where {c} is the continuous time analog of the control variable, -{e}={pvar}-{setpoint} is the error in the process variable, and +{e} ={pvar}-{setpoint} is the error in the process variable, and {alpha}, {Kp}, {Ki}, and {Kd} are constants set by the corresponding keywords described above. The discretized version of this equation is: @@ -106,10 +106,10 @@ the value of {alpha} to reflect this, while leaving {Kp}, {Ki}, and When choosing the values of the four constants, it is best to first pick a value and sign for {alpha} that is consistent with the magnitudes and signs of {pvar} and {cvar}. The magnitude of {Kp} -should then be tested over a large positive range keeping {Ki}={Kd}=0. +should then be tested over a large positive range keeping {Ki} = {Kd} =0. A good value for {Kp} will produce a fast response in {pvar}, without overshooting the {setpoint}. For many applications, proportional -feedback is sufficient, and so {Ki}={Kd}=0 can be used. In cases where +feedback is sufficient, and so {Ki} = {Kd} =0 can be used. In cases where there is a substantial lag time in the response of {pvar} to a change in {cvar}, this can be counteracted by increasing {Kd}. In situations where {pvar} plateaus without reaching {setpoint}, this can be diff --git a/doc/src/fix_deform.txt b/doc/src/fix_deform.txt index 63d872eded..c870c73bdc 100644 --- a/doc/src/fix_deform.txt +++ b/doc/src/fix_deform.txt @@ -86,11 +86,16 @@ Change the volume and/or shape of the simulation box during a dynamics run. Orthogonal simulation boxes have 3 adjustable parameters (x,y,z). Triclinic (non-orthogonal) simulation boxes have 6 adjustable parameters (x,y,z,xy,xz,yz). Any or all of them can be -adjusted independently and simultaneously by this command. This fix -can be used to perform non-equilibrium MD (NEMD) simulations of a -continuously strained system. See the "fix +adjusted independently and simultaneously by this command. + +This fix can be used to perform non-equilibrium MD (NEMD) simulations +of a continuously strained system. See the "fix nvt/sllod"_fix_nvt_sllod.html and "compute -temp/deform"_compute_temp_deform.html commands for more details. +temp/deform"_compute_temp_deform.html commands for more details. Note +that simulation of a continuously extended system (extensional flow) +can be modeled using the "USER-UEF +package"_Section_packages.html#USER-UEF and its "fix +commands"_fix_nh_uef.html. For the {x}, {y}, {z} parameters, the associated dimension cannot be shrink-wrapped. For the {xy}, {yz}, {xz} parameters, the associated diff --git a/doc/src/fix_dpd_energy.txt b/doc/src/fix_dpd_energy.txt index ed49e5a671..1c10d954d6 100644 --- a/doc/src/fix_dpd_energy.txt +++ b/doc/src/fix_dpd_energy.txt @@ -7,6 +7,7 @@ :line fix dpd/energy command :h3 +fix dpd/energy/kk command :h3 [Syntax:] @@ -46,6 +47,29 @@ examples/USER/dpd directory. :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/fix_dpd_source.txt b/doc/src/fix_dpd_source.txt new file mode 100644 index 0000000000..b6decc657c --- /dev/null +++ b/doc/src/fix_dpd_source.txt @@ -0,0 +1,101 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix edpd/source command :h3 +fix tdpd/source command :h3 + +[Syntax:] + +fix ID group-ID edpd/source keyword values ... +fix ID group-ID tdpd/source cc_index keyword values ... :pre + +ID, group-ID are documented in "fix"_fix.html command :ulb,l +edpd/source or tdpd/source = style name of this fix command :l +index (only specified for tdpd/source) = index of chemical species (1 to Nspecies) :l +keyword = {sphere} or {cuboid} :l + {sphere} values = cx,cy,cz,radius,source + cx,cy,cz = x,y,z center of spherical domain (distance units) + radius = radius of a spherical domain (distance units) + source = heat source or concentration source (flux units, see below) + {cuboid} values = cx,cy,cz,dLx,dLy,dLz,source + cx,cy,cz = x,y,z lower left corner of a cuboid domain (distance units) + dLx,dLy,dLz = x,y,z side length of a cuboid domain (distance units) + source = heat source or concentration source (flux units, see below) :pre +:ule + +[Examples:] + +fix 1 all edpd/source sphere 0.0 0.0 0.0 5.0 0.01 +fix 1 all edpd/source cuboid 0.0 0.0 0.0 20.0 10.0 10.0 -0.01 +fix 1 all tdpd/source 1 sphere 5.0 0.0 0.0 5.0 0.01 +fix 1 all tdpd/source 2 cuboid 0.0 0.0 0.0 20.0 10.0 10.0 0.01 :pre + +[Description:] + +Fix {edpd/source} adds a heat source as an external heat flux to each +atom in a spherical or cuboid domain, where the {source} is in units +of energy/time. Fix {tdpd/source} adds an external concentration +source of the chemical species specified by {index} as an external +concentration flux for each atom in a spherical or cuboid domain, +where the {source} is in units of mole/volume/time. + +This command can be used to give an additional heat/concentration +source term to atoms in a simulation, such as for a simulation of a +heat conduction with a source term (see Fig.12 in "(Li2014)"_#Li2014b) +or diffusion with a source term (see Fig.1 in "(Li2015)"_#Li2015b), as +an analog of a periodic Poiseuille flow problem. + +If the {sphere} keyword is used, the {cx,cy,cz,radius} defines a +spherical domain to apply the source flux to. + +If the {cuboid} keyword is used, the {cx,cy,cz,dLx,dLy,dLz} defines a +cuboid domain to apply the source flux to. + +:line + +[Restart, fix_modify, output, run start/stop, minimize info:] + +No information about this fix is written to "binary restart +files"_restart.html. None of the "fix_modify"_fix_modify.html options +are relevant to this fix. No global or per-atom quantities are stored +by this fix for access by various "output +commands"_Section_howto.html#howto_15. No parameter of this fix can +be used with the {start/stop} keywords of the "run"_run.html command. +This fix is not invoked during "energy minimization"_minimize.html. + +[Restrictions:] + +This fix is part of the USER-MESO package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +Fix {edpd/source} must be used with the "pair_style +edpd"_pair_meso.html command. Fix {tdpd/source} must be used with the +"pair_style tdpd"_pair_meso.html command. + +[Related commands:] + +"pair_style edpd"_pair_meso.html, "pair_style tdpd"_pair_meso.html, +"compute edpd/temp/atom"_compute_edpd_temp_atom.html, "compute +tdpd/cc/atom"_compute_tdpd_cc_atom.html + +[Default:] none + +:line + +:link(Li2014b) +[(Li2014)] Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis, +"Energy-conserving dissipative particle dynamics with +temperature-dependent properties", J. Comput. Phys., 265: 113-127 +(2014). DOI: 10.1016/j.jcp.2014.02.003 + +:link(Li2015b) +[(Li2015)] Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis, +"Transport dissipative particle dynamics model for mesoscopic +advection-diffusion-reaction problems", J. Chem. Phys., 143: 014101 +(2015). DOI: 10.1063/1.4923254 diff --git a/doc/src/fix_efield.txt b/doc/src/fix_efield.txt index 9e3d7797d8..5d2b86fe4b 100644 --- a/doc/src/fix_efield.txt +++ b/doc/src/fix_efield.txt @@ -124,6 +124,11 @@ can include the forces added by this fix in a consistent manner. I.e. there is a decrease in potential energy when atoms move in the direction of the added force due to the electric field. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the added forces on atoms to the +system's virial as part of "thermodynamic output"_thermo_style.html. +The default is {virial no} + The "fix_modify"_fix_modify.html {respa} option is supported by this fix. This allows to set at which level of the "r-RESPA"_run_style.html integrator the fix adding its forces. Default is the outermost level. diff --git a/doc/src/fix_eos_table_rx.txt b/doc/src/fix_eos_table_rx.txt index e5e4f772f6..0c87874347 100644 --- a/doc/src/fix_eos_table_rx.txt +++ b/doc/src/fix_eos_table_rx.txt @@ -7,6 +7,7 @@ :line fix eos/table/rx command :h3 +fix eos/table/rx/kk command :h3 [Syntax:] @@ -152,6 +153,29 @@ no 0.93 0.00 0.000 -1.76 :pre :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/fix_external.txt b/doc/src/fix_external.txt index 25158be0db..b28d33446f 100644 --- a/doc/src/fix_external.txt +++ b/doc/src/fix_external.txt @@ -131,6 +131,11 @@ forces added by this fix in a consistent manner. I.e. there is a decrease in potential energy when atoms move in the direction of the added force. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the interactions computed by the +external program to the system's virial as part of "thermodynamic +output"_thermo_style.html. The default is {virial yes} + This fix computes a global scalar which can be accessed by various "output commands"_Section_howto.html#howto_15. The scalar is the potential energy discussed above. The scalar stored by this fix diff --git a/doc/src/fix_gcmc.txt b/doc/src/fix_gcmc.txt index 405738276f..38f0fb95ce 100644 --- a/doc/src/fix_gcmc.txt +++ b/doc/src/fix_gcmc.txt @@ -26,16 +26,20 @@ zero or more keyword/value pairs may be appended to args :l keyword = {mol}, {region}, {maxangle}, {pressure}, {fugacity_coeff}, {full_energy}, {charge}, {group}, {grouptype}, {intra_energy}, {tfac_insert}, or {overlap_cutoff} {mol} value = template-ID template-ID = ID of molecule template specified in a separate "molecule"_molecule.html command + {mcmoves} values = Patomtrans Pmoltrans Pmolrotate + Patomtrans = proportion of atom translation MC moves + Pmoltrans = proportion of molecule translation MC moves + Pmolrotate = proportion of molecule rotation MC moves {rigid} value = fix-ID fix-ID = ID of "fix rigid/small"_fix_rigid.html command {shake} value = fix-ID fix-ID = ID of "fix shake"_fix_shake.html command {region} value = region-ID - region-ID = ID of region where MC moves are allowed + region-ID = ID of region where GCMC exchanges and MC moves are allowed {maxangle} value = maximum molecular rotation angle (degrees) {pressure} value = pressure of the gas reservoir (pressure units) {fugacity_coeff} value = fugacity coefficient of the gas reservoir (unitless) - {full_energy} = compute the entire system energy when performing MC moves + {full_energy} = compute the entire system energy when performing GCMC exchanges and MC moves {charge} value = charge of inserted atoms (charge units) {group} value = group-ID group-ID = group-ID for inserted atoms (string) @@ -56,35 +60,43 @@ fix 4 my_gas gcmc 1 10 10 1 123456543 300.0 -12.5 1.0 region disk :pre [Description:] This fix performs grand canonical Monte Carlo (GCMC) exchanges of -atoms or molecules of the given type with an imaginary ideal gas +atoms or molecules with an imaginary ideal gas reservoir at the specified T and chemical potential (mu) as discussed -in "(Frenkel)"_#Frenkel. If used with the "fix nvt"_fix_nh.html +in "(Frenkel)"_#Frenkel. It also +attempts Monte Carlo (MC) moves (translations and molecule +rotations) within the simulation cell or +region. If used with the "fix nvt"_fix_nh.html command, simulations in the grand canonical ensemble (muVT, constant chemical potential, constant volume, and constant temperature) can be performed. Specific uses include computing isotherms in microporous materials, or computing vapor-liquid coexistence curves. -Every N timesteps the fix attempts a number of GCMC exchanges -(insertions or deletions) of gas atoms or molecules of the given type -between the simulation cell and the imaginary reservoir. It also -attempts a number of Monte Carlo moves (translations and molecule -rotations) of gas of the given type within the simulation cell or -region. The average number of attempted GCMC exchanges is X. The -average number of attempted MC moves is M. M should typically be +Every N timesteps the fix attempts both GCMC exchanges +(insertions or deletions) and MC moves of gas atoms or molecules. +On those timesteps, the average number of attempted GCMC exchanges is X, +while the average number of attempted MC moves is M. +For GCMC exchanges of either molecular or atomic gasses, +these exchanges can be either deletions or insertions, +with equal probability. + +The possible choices for MC moves are translation of an atom, +translation of a molecule, and rotation of a molecule. +The relative amounts of each are determined by the optional +{mcmoves} keyword (see below). +The default behavior is as follows. +If the {mol} keyword is used, only molecule translations +and molecule rotations are performed with equal probability. +Conversely, if the {mol} keyword is not used, only atom +translations are performed. +M should typically be chosen to be approximately equal to the expected number of gas atoms or molecules of the given type within the simulation cell or region, -which will result in roughly one MC translation per atom or molecule +which will result in roughly one MC move per atom or molecule per MC cycle. -For MC moves of molecular gasses, rotations and translations are each -attempted with 50% probability. For MC moves of atomic gasses, -translations are attempted 100% of the time. For MC exchanges of -either molecular or atomic gasses, deletions and insertions are each -attempted with 50% probability. - -All inserted particles are always assigned to two groups: the default -group "all" and the group specified in the fix gcmc command (which can -also be "all"). In addition, particles are also added to any groups +All inserted particles are always added to two groups: the default +group "all" and the fix group specified in the fix command. +In addition, particles are also added to any groups specified by the {group} and {grouptype} keywords. If inserted particles are individual atoms, they are assigned the atom type given by the type argument. If they are molecules, the type argument has no @@ -92,9 +104,15 @@ effect and must be set to zero. Instead, the type of each atom in the inserted molecule is specified in the file read by the "molecule"_molecule.html command. -This fix cannot be used to perform MC insertions of gas atoms or -molecules other than the exchanged type, but MC deletions, -translations, and rotations can be performed on any atom/molecule in +NOTE: Care should be taken to apply fix gcmc only to +a group that contains only those atoms and molecules +that you wish to manipulate using Monte Carlo. +Hence it is generally not a good idea to specify +the default group "all" in the fix command, although it is allowed. + +This fix cannot be used to perform GCMC insertions of gas atoms or +molecules other than the exchanged type, but GCMC deletions, +and MC translations, and rotations can be performed on any atom/molecule in the fix group. All atoms in the simulation cell can be moved using regular time integration translations, e.g. via "fix nvt"_fix_nh.html, resulting in a hybrid GCMC+MD simulation. A smaller-than-usual @@ -150,8 +168,8 @@ about this point. Individual atoms are inserted, unless the {mol} keyword is used. It specifies a {template-ID} previously defined using the "molecule"_molecule.html command, which reads a file that defines the -molecule. The coordinates, atom types, charges, etc, as well as any -bond/angle/etc and special neighbor information for the molecule can +molecule. The coordinates, atom types, charges, etc., as well as any +bonding and special neighbor information for the molecule can be specified in the molecule file. See the "molecule"_molecule.html command for details. The only settings required to be in this file are the coordinates and types of atoms in the molecule. @@ -162,7 +180,7 @@ error when it tries to find bonded neighbors. LAMMPS will warn you if any of the atoms eligible for deletion have a non-zero molecule ID, but does not check for this at the time of deletion. -If you wish to insert molecules via the {mol} keyword, that will be +If you wish to insert molecules using the {mol} keyword that will be treated as rigid bodies, use the {rigid} keyword, specifying as its value the ID of a separate "fix rigid/small"_fix_rigid.html command which also appears in your input script. @@ -178,6 +196,15 @@ their bonds or angles constrained via SHAKE, use the {shake} keyword, specifying as its value the ID of a separate "fix shake"_fix_shake.html command which also appears in your input script. +Optionally, users may specify the relative amounts of different MC +moves using the {mcmoves} keyword. The values {Patomtrans}, +{Pmoltrans}, {Pmolrotate} specify the average proportion of +atom translations, molecule translations, and molecule rotations, +respectively. The values must be non-negative integers or real +numbers, with at least one non-zero value. For example, (10,30,0) +would result in 25% of the MC moves being atomic translations, 75% +molecular translations, and no molecular rotations. + Optionally, users may specify the maximum rotation angle for molecular rotations using the {maxangle} keyword and specifying the angle in degrees. Rotations are performed by generating a random point on the @@ -188,19 +215,19 @@ to the unit vector defined by the point on the unit sphere. The same procedure is used for randomly rotating molecules when they are inserted, except that the maximum angle is 360 degrees. -Note that fix GCMC does not use configurational bias MC or any other +Note that fix gcmc does not use configurational bias MC or any other kind of sampling of intramolecular degrees of freedom. Inserted molecules can have different orientations, but they will all have the same intramolecular configuration, which was specified in the molecule command input. For atomic gasses, inserted atoms have the specified atom type, but -deleted atoms are any atoms that have been inserted or that belong to -the user-specified fix group. For molecular gasses, exchanged +deleted atoms are any atoms that have been inserted or that already +belong to the fix group. For molecular gasses, exchanged molecules use the same atom types as in the template molecule supplied by the user. In both cases, exchanged atoms/molecules are assigned to -two groups: the default group "all" and the group specified in the fix -gcmc command (which can also be "all"). +two groups: the default group "all" and the fix group +(which can also be "all"). The chemical potential is a user-specified input parameter defined as: @@ -241,13 +268,16 @@ which case the user-specified chemical potential is ignored. The user may also specify the fugacity coefficient phi using the {fugacity_coeff} keyword, which defaults to unity. -The {full_energy} option means that fix GCMC will compute the total -potential energy of the entire simulated system. The total system -energy before and after the proposed GCMC move is then used in the +The {full_energy} option means that the fix calculates the total +potential energy of the entire simulated system, instead of just +the energy of the part that is changed. The total system +energy before and after the proposed GCMC exchange or MC move +is then used in the Metropolis criterion to determine whether or not to accept the -proposed GCMC move. By default, this option is off, in which case only -partial energies are computed to determine the difference in energy -that would be caused by the proposed GCMC move. +proposed change. By default, this option is off, +in which case only +partial energies are computed to determine the energy difference +due to the proposed change. The {full_energy} option is needed for systems with complicated potential energy calculations, including the following: @@ -263,10 +293,11 @@ In these cases, LAMMPS will automatically apply the {full_energy} keyword and issue a warning message. When the {mol} keyword is used, the {full_energy} option also includes -the intramolecular energy of inserted and deleted molecules. If this +the intramolecular energy of inserted and deleted molecules, whereas +this energy is not included when {full_energy} is not used. If this is not desired, the {intra_energy} keyword can be used to define an amount of energy that is subtracted from the final energy when a -molecule is inserted, and added to the initial energy when a molecule +molecule is inserted, and subtracted from the initial energy when a molecule is deleted. For molecules that have a non-zero intramolecular energy, this will ensure roughly the same behavior whether or not the {full_energy} option is used. @@ -291,7 +322,8 @@ include: "efield"_fix_efield.html, "gravity"_fix_gravity.html, "temp/berendsen"_fix_temp_berendsen.html, "temp/rescale"_fix_temp_rescale.html, and "wall fixes"_fix_wall.html. For that energy to be included in the total potential energy of the -system (the quantity used when performing GCMC moves), you MUST enable +system (the quantity used when performing GCMC exchange and MC moves), +you MUST enable the "fix_modify"_fix_modify.html {energy} option for that fix. The doc pages for individual "fix"_fix.html commands specify if this should be done. @@ -305,9 +337,14 @@ about simulating non-neutral systems with kspace on. Use of this fix typically will cause the number of atoms to fluctuate, therefore, you will want to use the -"compute_modify"_compute_modify.html command to insure that the +"compute_modify dynamic/dof"_compute_modify.html command to insure that the current number of atoms is used as a normalizing factor each time -temperature is computed. Here is the necessary command: +temperature is computed. A simple example of this is: + +compute_modify thermo_temp dynamic yes :pre + +A more complicated example is listed earlier on this page +in the context of NVT dynamics. NOTE: If the density of the cell is initially very small or zero, and increases to a much larger density after a period of equilibration, @@ -327,17 +364,9 @@ assigning an infinite positive energy to all new configurations that place any pair of atoms closer than the specified overlap cutoff distance. -compute_modify thermo_temp dynamic yes :pre - -If LJ units are used, note that a value of 0.18292026 is used by this -fix as the reduced value for Planck's constant. This value was -derived from LJ parameters for argon, where h* = h/sqrt(sigma^2 * -epsilon * mass), sigma = 3.429 angstroms, epsilon/k = 121.85 K, and -mass = 39.948 amu. - -The {group} keyword assigns all inserted atoms to the +The {group} keyword adds all inserted atoms to the "group"_group.html of the group-ID value. The {grouptype} keyword -assigns all inserted atoms of the specified type to the +adds all inserted atoms of the specified type to the "group"_group.html of the group-ID value. [Restart, fix_modify, output, run start/stop, minimize info:] @@ -384,7 +413,8 @@ Can be run in parallel, but aspects of the GCMC part will not scale well in parallel. Only usable for 3D simulations. When using fix gcmc in combination with fix shake or fix rigid, -only gcmc exchange moves are supported. +only GCMC exchange moves are supported, so the argument +{M} must be zero. Note that very lengthy simulations involving insertions/deletions of billions of gas molecules may run out of atom or molecule IDs and @@ -409,7 +439,9 @@ the user for each subsequent fix gcmc command. [Default:] The option defaults are mol = no, maxangle = 10, overlap_cutoff = 0.0, -fugacity_coeff = 1, and full_energy = no, +fugacity_coeff = 1.0, intra_energy = 0.0, tfac_insert = 1.0. +(Patomtrans, Pmoltrans, Pmolrotate) = (1, 0, 0) for mol = no and +(0, 1, 1) for mol = yes. full_energy = no, except for the situations where full_energy is required, as listed above. diff --git a/doc/src/fix_halt.txt b/doc/src/fix_halt.txt index ced489a54c..08043eb5fb 100644 --- a/doc/src/fix_halt.txt +++ b/doc/src/fix_halt.txt @@ -64,10 +64,10 @@ not performed once every {N} steps by this command. Instead it is performed (typically) only a small number of times and the elapsed times are used to predict when the end-of-the-run will be. Both of these attributes can be useful when performing benchmark calculations -for a desired length of time with minmimal overhead. For example, if +for a desired length of time with minimal overhead. For example, if a run is performing 1000s of timesteps/sec, the overhead for syncing the timer frequently across a large number of processors may be -non-negligble. +non-negligible. Equal-style variables evaluate to a numeric value. See the "variable"_variable.html command for a description. They calculate @@ -125,7 +125,7 @@ to the screen and logfile when the halt condition is triggered. If {message} is set to yes, a one line message with the values that triggered the halt is printed. If {message} is set to no, no message is printed; the run simply exits. The latter may be desirable for -post-processing tools that extract thermodyanmic information from log +post-processing tools that extract thermodynamic information from log files. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_latte.txt b/doc/src/fix_latte.txt new file mode 100644 index 0000000000..4edd610546 --- /dev/null +++ b/doc/src/fix_latte.txt @@ -0,0 +1,210 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix latte command :h3 + +[Syntax:] + +fix ID group-ID latte peID :pre + +ID, group-ID are documented in "fix"_fix.html command +latte = style name of this fix command +peID = NULL or ID of compute used to calculate per-atom energy :ul + +[Examples:] + +fix dftb all latte NULL :pre + +[Description:] + +This fix style is a wrapper on the self-consistent charge transfer +density functional based tight binding (DFTB) code LATTE. If you +download and build LATTE, it can be called as a library by LAMMPS via +this fix to run dynamics or perform energy minimization using DFTB +forces and energies computed by LATTE. + +LATTE is principally developed and supported by Marc Cawkwell and +co-workers at Los Alamos National Laboratory (LANL). See the full +list of contributors in the src/LATTE/README file. + +To use this fix, the LATTE program needs to be compiled as a library +and linked with LAMMPS. LATTE can be downloaded (or cloned) from +"https://github.com/lanl/LATTE"_https://github.com/lanl/LATTE. +Instructions on how to download and build LATTE on your system can be +found in the lib/latte/README. Note that you can also use the "make +lib-latte" command from the LAMMPS src directory to automate this +process. + +Once LAMMPS is built with the LATTE package, you can run the example +input scripts for molecular dynamics or energy minimization that are +found in examples/latte. + +A step-by-step tutorial can be follwed at: "LAMMPS-LATTE +tutorial"_https://github.com/lanl/LATTE/wiki/Using-LATTE-through-LAMMPS + +The {peID} argument is not yet supported by fix latte, so it must be +specified as NULL. Eventually it will be used to enable LAMMPS to +calculate a Coulomb potential as an alternative to LATTE performing +the calculation. + +:line + +LATTE is a code for performing self-consistent charge transfer +tight-binding (SC-TB) calculations of total energies and the forces +acting on atoms in molecules and solids. This tight-binding method is +becoming more and more popular and widely used in chemistry, +biochemistry, material science, etc. + +The SC-TB formalism is derived from an expansion of the Kohn-Sham +density functional to second order in charge fluctuations about a +reference charge of overlapping atom-centered densities and bond +integrals are parameterized using a Slater-Koster tight-binding +approach. This procedure, which usually is referred to as the DFTB +method has been described in detail by ("Elstner"_#Elstner) and +("Finnis"_#Finnis2) and coworkers. + +The work of the LATTE developers follows that of Elstner closely with +respect to the physical model. However, the development of LATTE is +geared principally toward large-scale, long duration, microcanonical +quantum-based Born-Oppenheimer molecular dynamics (QMD) simulations. +One of the main bottlenecks of an electronic structure calculation is +the solution of the generalized eigenvalue problem which scales with +the cube of the system size O(N^3). + +The Theoretical and Computer sciences divisions at Los Alamos National +Laboratory have accumulated large experience addressing this issue by +calculating the density matrix directly instead of using +diagonalization. We typically use a recursive sparse Fermi-operator +expansion using second-order spectral projection functions +(SP2-algorithm), which was introduced by Niklasson in 2002 +("Niklasson2002"_#Niklasson2002), ("Rubensson"_#Rubensson), +("Mniszewski"_#Mniszewski). When the matrices involved in the +recursive expansion are sufficiently sparse, the calculation of the +density matrix scales linearly as a function of the system size O(N). + +Another important feature is the extended Lagrangian framework for +Born-Oppenheimer molecular dynamics (XL-BOMD) +("Niklasson2008"_#Niklasson2008) ("Niklasson2014"_#Niklasson2014), +("Niklasson2017"_#Niklasson2017) that allows for a drastic reduction +or even a complete removal of the iterative self-consistent field +optimization. Often only a single density matrix calculation per +molecular dynamics time step is required, yet total energy stability +is well maintained. The SP2 and XL-BOMD techniques enables stable +linear scaling MD simulations with a very small computational +overhead. This opens a number of opportunities in many different +areas of chemistry and materials science, as we now can simulate +larger system sizes and longer time scales +("Cawkwell2012"_#Cawkwell2012), ("Negre2016"_#Negre2016). + +:line + +[Restart, fix_modify, output, run start/stop, minimize info:] + +No information about this fix is written to "binary restart +files"_restart.html. + +The "fix_modify"_fix_modify.html {energy} option is supported by this +fix to add the potential energy computed by LATTE to the system's +potential energy as part of "thermodynamic output"_thermo_style.html. + +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the LATTE DFTB contribution to the system's virial as part +of "thermodynamic output"_thermo_style.html. The default is {virial +yes} + +This fix computes a global scalar which can be accessed by various +"output commands"_Section_howto.html#howto_15. The scalar is the +potential energy discussed above. The scalar value calculated by this +fix is "extensive". + +No parameter of this fix can be used with the {start/stop} keywords of +the "run"_run.html command. + +The DFTB forces computed by LATTE via this fix are imposed during an +energy minimization, invoked by the "minimize"_minimize.html command. + +NOTE: If you want the potential energy associated with the DFTB +forces to be included in the total potential energy of the system (the +quantity being minimized), you MUST enable the +"fix_modify"_fix_modify.html {energy} option for this fix. + +[Restrictions:] + +This fix is part of the LATTE package. It is only enabled if LAMMPS +was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You must use metal units, as set by the "units"_units command to use +this fix. + +LATTE does not currently compute per-atom energy or per-atom virial +contributions. So they will not show up as part of the calculations +performed by the "compute pe/atom"_compute_pe_atom.html or "compute +stress/atom"_compute_stress_atom.html commands. + +Currently, LAMMPS must be run in serial or as a single MPI task, to +use this fix. This is typically not a bottleneck, since LATTE will be +doing 99% or more of the work to compute quantum-accurate forces. + +NOTE: NEB calculations can be done using this fix using multiple +replicas and running LAMMPS in parallel. However, each replica must +be run on a single MPI task. For details, see the "neb"_neb.html +command and -partition command-line explained in "Section +2.6"_Section_start.html#start_6 of the manual. + +[Related commands:] none + +[Default:] none + +:line + +:link(Elstner) +[(Elstner)] M. Elstner, D. Poresag, G. Jungnickel, J. Elsner, +M. Haugk, T. Frauenheim, S. Suhai, and G. Seifert, Phys. Rev. B, 58, +7260 (1998). + +:link(Elstner1) +[(Elstner)] M. Elstner, D. Poresag, G. Jungnickel, J. Elsner, +M. Haugk, T. Frauenheim, S. Suhai, and G. Seifert, Phys. Rev. B, 58, +7260 (1998). + +:link(Finnis2) +[(Finnis)] M. W. Finnis, A. T. Paxton, M. Methfessel, and M. van +Schilfgarde, Phys. Rev. Lett., 81, 5149 (1998). + +:link(Mniszewski) +[(Mniszewski)] S. M. Mniszewski, M. J. Cawkwell, M. E. Wall, +J. Mohd-Yusof, N. Bock, T. C. Germann, and A. M. N. Niklasson, +J. Chem. Theory Comput., 11, 4644 (2015). + +:link(Niklasson2002) +[(Niklasson2002)] A. M. N. Niklasson, Phys. Rev. B, 66, 155115 (2002). + +:link(Rubensson) +[(Rubensson)] E. H. Rubensson, A. M. N. Niklasson, SIAM +J. Sci. Comput. 36 (2), 147-170, (2014). + +:link(Niklasson2008) +[(Niklasson2008)] A. M. N. Niklasson, Phys. Rev. Lett., 100, 123004 +(2008). + +:link(Niklasson2014) +[(Niklasson2014)] A. M. N. Niklasson and M. Cawkwell, J. Chem. Phys., +141, 164123, (2014). + +:link(Niklasson2017) +[(Niklasson2017)] A. M. N. Niklasson, J. Chem. Phys., 147, 054103 (2017). + +:link(Cawkwell2012) +[(Cawkwell2012)] A. M. N. Niklasson, M. J. Cawkwell, Phys. Rev. B, 86 +(17), 174308 (2012). + +:link(Negre2016) +[(Negre2016)] C. F. A. Negre, S. M. Mniszewski, M. J. Cawkwell, +N. Bock, M. E. Wall, and A. M. N. Niklasson, J. Chem. Theory Comp., +12, 3063 (2016). diff --git a/doc/src/fix_modify.txt b/doc/src/fix_modify.txt index 4e31092888..1c7dcf77a5 100644 --- a/doc/src/fix_modify.txt +++ b/doc/src/fix_modify.txt @@ -14,10 +14,11 @@ fix_modify fix-ID keyword value ... :pre fix-ID = ID of the fix to modify :ulb,l one or more keyword/value pairs may be appended :l -keyword = {temp} or {press} or {energy} or {respa} or {dynamic/dof} :l +keyword = {temp} or {press} or {energy} or {virial} or {respa} or {dynamic/dof} :l {temp} value = compute ID that calculates a temperature {press} value = compute ID that calculates a pressure {energy} value = {yes} or {no} + {virial} value = {yes} or {no} {respa} value = {1} to {max respa level} or {0} (for outermost level) {dynamic/dof} value = {yes} or {no} yes/no = do or do not recompute the number of degrees of freedom (DOF) contributing to the temperature :pre @@ -52,11 +53,10 @@ define their own compute by default, as described in their documentation. Thus this option allows the user to override the default method for computing P. -For fixes that calculate a contribution to the potential energy of the -system, the {energy} keyword will include that contribution in -thermodynamic output of potential energy. This is because the {energy -yes} setting must be specified to include the fix's global or per-atom -energy in the calculation performed by the "compute +The {energy} keyword can be used with fixes that support it. +{energy yes} adds a contribution to the potential energy of the +system. The fix's global and per-atom +energy is included in the calculation performed by the "compute pe"_compute_pe.html or "compute pe/atom"_compute_pe_atom.html commands. See the "thermo_style"_thermo_style.html command for info on how potential energy is output. For fixes that tally a global @@ -69,6 +69,25 @@ are using it when performing an "energy minimization"_minimize.html and if you want the energy and forces it produces to be part of the optimization criteria. +The {virial} keyword can be used with fixes that support it. +{virial yes} adds a contribution to the virial of the +system. The fix's global and per-atom +virial is included in the calculation performed by the "compute +pressure"_compute_pressure.html or +"compute stress/atom"_compute_stress_atom.html +commands. See the "thermo_style"_thermo_style.html command for info +on how pressure is output. + +NOTE: You must specify the {virial yes} setting for a fix if you +are doing "box relaxation"_fix_box_relax.html and +if you want virial contribution of the fix to be part of the +relaxation criteria, although this seems unlikely. + +NOTE: This option is only supported by fixes that explicitly say +so. For some of these (e.g. the +"fix shake"_fix_shake.html command) the default setting is +{virial yes}, for others it is {virial no}. + For fixes that set or modify forces, it may be possible to select at which "r-RESPA"_run_style.html level the fix operates via the {respa} keyword. The RESPA level at which the fix is active can be selected. @@ -111,4 +130,4 @@ pressure"_compute_pressure.html, "thermo_style"_thermo_style.html [Default:] The option defaults are temp = ID defined by fix, press = ID defined -by fix, energy = no, respa = 0. +by fix, energy = no, virial = different for each fix style, respa = 0. diff --git a/doc/src/fix_msst.txt b/doc/src/fix_msst.txt index 025c733897..310692669a 100644 --- a/doc/src/fix_msst.txt +++ b/doc/src/fix_msst.txt @@ -75,7 +75,7 @@ equations, but is used in calculating the deviation from the Hugoniot. The keyword {beta} is a scaling term that can be added to the MSST ionic equations of motion to account for drift in the conserved quantity during long timescale simulations, similar to a Berendson -thermostat. See "(Reed)"_#Reed and "(Goldman)"_#Goldman for more +thermostat. See "(Reed)"_#Reed and "(Goldman)"_#Goldman2 for more details. The value of {beta} must be between 0.0 and 1.0 inclusive. A value of 0.0 means no contribution, a value of 1.0 means a full contribution. @@ -108,7 +108,7 @@ being driven by DFTB+, a density-functional tight-binding code. If the keyword {dftb} is used with a value of {yes}, then the MSST equations are altered to account for the electron entropy contribution to the Hugonio relations and total energy. See "(Reed2)"_#Reed2 and -"(Goldman)"_#Goldman for details on this contribution. In this case, +"(Goldman)"_#Goldman2 for details on this contribution. In this case, you must define a "fix external"_fix_external.html command in your input script, which is used to callback to DFTB+ during the LAMMPS timestepping. DFTB+ will communicate its info to LAMMPS via that fix. @@ -188,6 +188,6 @@ timestep. :link(Reed2) [(Reed2)] Reed, J. Phys. Chem. C, 116, 2205 (2012). -:link(Goldman) +:link(Goldman2) [(Goldman)] Goldman, Srinivasan, Hamel, Fried, Gaus, and Elstner, J. Phys. Chem. C, 117, 7885 (2013). diff --git a/doc/src/fix_mvv_dpd.txt b/doc/src/fix_mvv_dpd.txt new file mode 100644 index 0000000000..fb3c6fe888 --- /dev/null +++ b/doc/src/fix_mvv_dpd.txt @@ -0,0 +1,97 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix mvv/dpd command :h3 +fix mvv/edpd command :h3 +fix mvv/tdpd command :h3 + +[Syntax:] + +fix ID group-ID mvv/dpd lambda :pre +fix ID group-ID mvv/edpd lambda :pre +fix ID group-ID mvv/tdpd lambda :pre + +ID, group-ID are documented in "fix"_fix.html command +mvv/dpd, mvv/edpd, mvv/tdpd = style name of this fix command +lambda = (optional) relaxation parameter (unitless) :ul + +[Examples:] + +fix 1 all mvv/dpd +fix 1 all mvv/dpd 0.5 +fix 1 all mvv/edpd +fix 1 all mvv/edpd 0.5 +fix 1 all mvv/tdpd +fix 1 all mvv/tdpd 0.5 :pre + +[Description:] + +Perform time integration using the modified velocity-Verlet (MVV) +algorithm to update position and velocity (fix mvv/dpd), or position, +velocity and temperature (fix mvv/edpd), or position, velocity and +concentration (fix mvv/tdpd) for particles in the group each timestep. + +The modified velocity-Verlet (MVV) algorithm aims to improve the +stability of the time integrator by using an extrapolated version of +the velocity for the force evaluation: + +:c,image(Eqs/fix_mvv_dpd.jpg) + +where the parameter λ depends on the +specific choice of DPD parameters, and needs to be tuned on a +case-by-case basis. Specification of a {lambda} value is optional. +If specified, the setting must be from 0.0 to 1.0. If not specified, +a default value of 0.5 is used, which effectively reproduces the +standard velocity-Verlet (VV) scheme. For more details, see +"Groot"_#Groot2. + +Fix {mvv/dpd} updates the position and velocity of each atom. It can +be used with the "pair_style mdpd"_pair_meso.html command or other +pair styles such as "pair dpd"_pair_dpd.html. + +Fix {mvv/edpd} updates the per-atom temperature, in addition to +position and velocity, and must be used with the "pair_style +edpd"_pair_meso.html command. + +Fix {mvv/tdpd} updates the per-atom chemical concentration, in +addition to position and velocity, and must be used with the +"pair_style tdpd"_pair_meso.html command. + +:line + +[Restart, fix_modify, output, run start/stop, minimize info:] + +No information about this fix is written to "binary restart +files"_restart.html. None of the "fix_modify"_fix_modify.html options +are relevant to this fix. No global or per-atom quantities are stored +by this fix for access by various "output +commands"_Section_howto.html#howto_15. No parameter of this fix can +be used with the {start/stop} keywords of the "run"_run.html command. +This fix is not invoked during "energy minimization"_minimize.html. + +[Restrictions:] + +This fix is part of the USER-MESO package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"pair_style mdpd"_pair_meso.html, "pair_style edpd"_pair_meso.html, +"pair_style tdpd"_pair_meso.html + +[Default:] + +The default value for the optional {lambda} parameter is 0.5. + +:line + +:link(Groot2) +[(Groot)] Groot and Warren, J Chem Phys, 107: 4423-4435 (1997). DOI: +10.1063/1.474784 + diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index 52d8a7df84..5d18c39d99 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -93,7 +93,7 @@ intermediate replica with the previous and the next image: Fnudge_parallel = {Kspring} * (|Ri+1 - Ri| - |Ri - Ri-1|) :pre -Note that in this case the specified {Kspring) is in force/distance +Note that in this case the specified {Kspring} is in force/distance units. With a value of {ideal}, the spring force is computed as suggested in @@ -105,7 +105,7 @@ where RD is the "reaction coordinate" see "neb"_neb.html section, and RDideal is the ideal RD for which all the images are equally spaced. I.e. RDideal = (I-1)*meanDist when the climbing replica is off, where I is the replica number). The meanDist is the average distance -between replicas. Note that in this case the specified {Kspring) is +between replicas. Note that in this case the specified {Kspring} is in force units. Note that the {ideal} form of nudging can often be more effective at @@ -113,9 +113,9 @@ keeping the replicas equally spaced. :line -The keyword {perp} specifies if and how a perpendicual nudging force +The keyword {perp} specifies if and how a perpendicular nudging force is computed. It adds a spring force perpendicular to the path in -order to prevent the path from becoming too kinky. It can +order to prevent the path from becoming too strongly kinked. It can significantly improve the convergence of the NEB calculation when the resolution is poor. I.e. when few replicas are used; see "(Maras)"_#Maras1 for details. @@ -138,17 +138,17 @@ By default, no additional forces act on the first and last replicas during the NEB relaxation, so these replicas simply relax toward their respective local minima. By using the key word {end}, additional forces can be applied to the first and/or last replicas, to enable -them to relax toward a MEP while constraining their energy. +them to relax toward a MEP while constraining their energy E to the +target energy ETarget. -The interatomic force Fi for the specified replica becomes: +If ETarget>E, the interatomic force Fi for the specified replica becomes: Fi = -Grad(V) + (Grad(V) dot T' + (E-ETarget)*Kspring3) T', {when} Grad(V) dot T' < 0 Fi = -Grad(V) + (Grad(V) dot T' + (ETarget- E)*Kspring3) T', {when} Grad(V) dot T' > 0 :pre -where E is the current energy of the replica and ETarget is the target -energy. The "spring" constant on the difference in energies is the -specified {Kspring3} value. +The "spring" constant on the difference in energies is the specified +{Kspring3} value. When {estyle} is specified as {first}, the force is applied to the first replica. When {estyle} is specified as {last}, the force is @@ -183,10 +183,9 @@ After converging a NEB calculation using an {estyle} of have a larger energy than the first replica. If this is not the case, the path is probably not a MEP. -Finally, note that if the last replica converges toward a local -minimum which has a larger energy than the energy of the first -replica, a NEB calculation using an {estyle} of {last/efirst} or -{last/efirst/middle} cannot reach final convergence. +Finally, note that the last replica may never reach the target energy +if it is stuck in a local minima which has a larger energy than the +target energy. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nh.txt b/doc/src/fix_nh.txt index 8fa30ac222..41d0e6438f 100644 --- a/doc/src/fix_nh.txt +++ b/doc/src/fix_nh.txt @@ -393,32 +393,36 @@ thermostatting and barostatting. :line These fixes compute a temperature and pressure each timestep. To do -this, the fix creates its own computes of style "temp" and "pressure", -as if one of these two sets of commands had been issued: +this, the thermostat and barostat fixes create their own computes of +style "temp" and "pressure", as if one of these sets of commands had +been issued: +For fix nvt: compute fix-ID_temp group-ID temp -compute fix-ID_press group-ID pressure fix-ID_temp :pre +For fix npt and fix nph: compute fix-ID_temp all temp compute fix-ID_press all pressure fix-ID_temp :pre -See the "compute temp"_compute_temp.html and "compute -pressure"_compute_pressure.html commands for details. Note that the -IDs of the new computes are the fix-ID + underscore + "temp" or fix_ID -+ underscore + "press". For fix nvt, the group for the new computes -is the same as the fix group. For fix nph and fix npt, the group for -the new computes is "all" since pressure is computed for the entire -system. +For fix nvt, the group for the new temperature compute is the same as +the fix group. For fix npt and fix nph, the group for both the new +temperature and pressure compute is "all" since pressure is computed +for the entire system. In the case of fix nph, the temperature +compute is not used for thermostatting, but just for a kinetic-energy +contribution to the pressure. See the "compute +temp"_compute_temp.html and "compute pressure"_compute_pressure.html +commands for details. Note that the IDs of the new computes are the +fix-ID + underscore + "temp" or fix_ID + underscore + "press". Note that these are NOT the computes used by thermodynamic output (see the "thermo_style"_thermo_style.html command) with ID = {thermo_temp} -and {thermo_press}. This means you can change the attributes of this +and {thermo_press}. This means you can change the attributes of these fix's temperature or pressure via the -"compute_modify"_compute_modify.html command or print this temperature -or pressure during thermodynamic output via the "thermo_style -custom"_thermo_style.html command using the appropriate compute-ID. -It also means that changing attributes of {thermo_temp} or -{thermo_press} will have no effect on this fix. +"compute_modify"_compute_modify.html command. Or you can print this +temperature or pressure during thermodynamic output via the +"thermo_style custom"_thermo_style.html command using the appropriate +compute-ID. It also means that changing attributes of {thermo_temp} +or {thermo_press} will have no effect on this fix. Like other fixes that perform thermostatting, fix nvt and fix npt can be used with "compute commands"_compute.html that calculate a diff --git a/doc/src/fix_nh_uef.txt b/doc/src/fix_nh_uef.txt new file mode 100644 index 0000000000..bde1818371 --- /dev/null +++ b/doc/src/fix_nh_uef.txt @@ -0,0 +1,228 @@ +<"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix nvt/uef command :h3 +fix npt/uef command :h3 + +[Syntax:] + +fix ID group-ID style_name erate edot_x edot_y temp Tstart Tstop Tdamp keyword value ... :pre + +ID, group-ID are documented in "fix"_fix.html command :ulb,l +style_name = {nvt/uef} or {npt/uef} :l +{Tstart}, {Tstop}, and {Tdamp} are documented in the "fix npt"_fix_nh.html command :l +{edot_x} and {edot_y} are the strain rates in the x and y directions (1/(time units)) :l +one or more keyword/value pairs may be appended :l +keyword = {ext} or {strain} or {iso} or {x} or {y} or {z} or {tchain} or {pchain} or {tloop} or {ploop} or {mtk} + {ext} value = {x} or {y} or {z} or {xy} or {yz} or {xz} = external dimensions + sets the external dimensions used to calculate the scalar pressure + {strain} values = e_x e_y = initial strain + usually not needed, but may be needed to resume a run with a data file. + {iso}, {x}, {y}, {z}, {tchain}, {pchain}, {tloop}, {ploop}, {mtk} keywords + documented by the "fix npt"_fix_nh.html command :pre +:ule + +[Examples:] + +fix uniax_nvt all nvt/uef temp 400 400 100 erate 0.00001 -0.000005 +fix biax_nvt all nvt/uef temp 400 400 100 erate 0.000005 0.000005 +fix uniax_npt all npt/uef temp 400 400 300 iso 1 1 3000 erate 0.00001 -0.000005 ext yz +fix biax_npt all npt/uef temp 400 400 100 erate -0.00001 0.000005 x 1 1 3000 :pre + +[Description:] + +This fix can be used to simulate non-equilibrium molecular dynamics +(NEMD) under diagonal flow fields, including uniaxial and biaxial +flow. Simulations under continuous extensional flow may be carried +out for an indefinite amount of time. It is an implementation of the +boundary conditions from "(Dobson)"_#Dobson, and also uses numerical +lattice reduction as was proposed by "(Hunt)"_#Hunt. The lattice +reduction algorithm is from "(Semaev)"_Semaev. The fix is intended for +simulations of homogeneous flows, and integrates the SLLOD equations +of motion, originally proposed by Hoover and Ladd (see "(Evans and +Morriss)"_#Sllod). Additional detail about this implementation can be +found in "(Nicholson and Rutledge)"_#Nicholson. + +Note that NEMD simulations of a continuously strained system can be +performed using the "fix deform"_fix_deform.html, "fix +nvt/sllod"_fix_nvt_sllod.html, and "compute +temp/deform"_compute_temp_deform.html commands. + +The applied flow field is set by the {eps} keyword. The values +{edot_x} and {edot_y} correspond to the strain rates in the xx and yy +directions. It is implicitly assumed that the flow field is +traceless, and therefore the strain rate in the zz direction is eqal +to -({edot_x} + {edot_y}). + +NOTE: Due to an instability in the SLLOD equations under extension, +"fix momentum"_fix_momentum.html should be used to regularly reset the +linear momentum. + +The boundary conditions require a simulation box that does not have a +consistent alignment relative to the applied flow field. Since LAMMPS +utilizes an upper-triangular simulation box, it is not possible to +express the evolving simulation box in the same coordinate system as +the flow field. This fix keeps track of two coordinate systems: the +flow frame, and the upper triangular LAMMPS frame. The coordinate +systems are related to each other through the QR decomposition, as is +illustrated in the image below. + +:c,image(JPG/uef_frames.jpg) + +During most molecular dynamics operations, the system is represented +in the LAMMPS frame. Only when the positions and velocities are +updated is the system rotated to the flow frame, and it is rotated +back to the LAMMPS frame immediately afterwards. For this reason, all +vector-valued quantities (except for the tensors from +"compute_pressure/uef"_compute_pressure_uef.html and +"compute_temp/uef"_compute_temp_uef.html) will be computed in the +LAMMPS frame. Rotationally invariant scalar quantities like the +temperature and hydrostatic pressure are frame-invariant and will be +computed correctly. Additionally, the system is in the LAMMPS frame +during all of the output steps, and therefore trajectory files made +using the dump command will be in the LAMMPS frame unless the +"dump_cfg/uef"_dump_cfg_uef.html command is used. + +:line + +Temperature control is achieved with the default Nose-Hoover style +thermostat documented in "fix npt"_fix_nh.html. When this fix is +active, only the peculiar velocity of each atom is stored, defined as +the velocity relative to the streaming velocity. This is in contrast +to "fix nvt/sllod"_fix_nvt_sllod.html, which uses a lab-frame +velocity, and removes the contribution from the streaming velocity in +order to compute the temperature. + +Pressure control is achieved using the default Nose-Hoover barostat +documented in "fix npt"_fix_nh.html. There are two ways to control the +pressure using this fix. The first method involves using the {ext} +keyword along with the {iso} pressure style. With this method, the +pressure is controlled by scaling the simulation box isotropically to +achieve the average pressure only in the directions specified by +{ext}. For example, if the {ext} value is set to {xy}, the average +pressure (Pxx+Pyy)/2 will be controlled. + +This example command will control the total hydrostatic pressure under +uniaxial tension: + +fix f1 all npt/uef temp 0.7 0.7 0.5 iso 1 1 5 erate -0.5 -0.5 ext xyz :pre + +This example command will control the average stress in compression +directions, which would typically correspond to free surfaces under +drawing with uniaxial tension: + +fix f2 all npt/uef temp 0.7 0.7 0.5 iso 1 1 5 erate -0.5 -0.5 ext xy :pre + +The second method for pressure control involves setting the normal +stresses using the {x}, {y} , and/or {z} keywords. When using this +method, the same pressure must be specified via {Pstart} and {Pstop} +for all dimensions controlled. Any choice of pressure conditions that +would cause LAMMPS to compute a deviatoric stress are not permissible +and will result in an error. Additionally, all dimensions with +controlled stress must have the same applied strain rate. The {ext} +keyword must be set to the default value ({xyz}) when using this +method. + +For example, the following commands will work: + +fix f3 all npt/uef temp 0.7 0.7 0.5 x 1 1 5 y 1 1 5 erate -0.5 -0.5 +fix f4 all npt/uef temp 0.7 0.7 0.5 z 1 1 5 erate 0.5 0.5 :pre + +The following commands will not work: + +fix f5 all npt/uef temp 0.7 0.7 0.5 x 1 1 5 z 1 1 5 erate -0.5 -0.5 +fix f6 all npt/uef temp 0.7 0.7 0.5 x 1 1 5 z 2 2 5 erate 0.5 0.5 :pre + +:line + +These fix computes a temperature and pressure each timestep. To do +this, it creates its own computes of style "temp/uef" and +"pressure/uef", as if one of these two sets of commands had been +issued: + +compute fix-ID_temp group-ID temp/uef +compute fix-ID_press group-ID pressure/uef fix-ID_temp :pre + +compute fix-ID_temp all temp/uef +compute fix-ID_press all pressure/uef fix-ID_temp :pre + +See the "compute temp/uef"_compute_temp_uef.html and "compute +pressure/uef"_compute_pressure_uef.html commands for details. Note +that the IDs of the new computes are the fix-ID + underscore + "temp" +or fix_ID + underscore + "press". + +[Restart, fix_modify, output, run start/stop, minimize info:] + +The fix writes the state of all the thermostat and barostat variables, +as well as the cumulative strain applied, to "binary restart +files"_restart.html. See the "read_restart"_read_restart.html command +for info on how to re-specify a fix in an input script that reads a +restart file, so that the operation of the fix continues in an +uninterrupted fashion. + +NOTE: It is not necessary to set the {strain} keyword when resuming a +run from a restart file. Only for resuming from data files, which do +not contain the cumulative applied strain, will this keyword be +necessary. + +This fix can be used with the "fix_modify"_fix_modify.html {temp} and +{press} options. The temperature and pressure computes used must be of +type {temp/uef} and {pressure/uef}. + +This fix computes the same global scalar and vecor quantities as "fix +npt"_fix_nh.html. + +The fix is not invoked during "energy minimization"_minimize.html. + +[Restrictions:] + +This fix is part of the USER-UEF package. It is only enabled if LAMMPS +was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +Due to requirements of the boundary conditions, when the {strain} +keyword is set to zero (or unset), the initial simulation box must be +cubic and have style triclinic. If the box is initially of type ortho, +use "change_box"_change_box.html before invoking the fix. + +NOTE: When resuming from restart files, you may need to use "box tilt +large"_box.html since lammps has internal criteria from lattice +reduction that are not the same as the criteria in the numerical +lattice reduction algorithm. + +[Related commands:] + +"fix nvt"_fix_nh.html, "fix nvt/sllod"_fix_nvt_sllod.html, "compute +temp/uef"_compute_temp_uef.html, "compute +pressure/uef"_compute_pressure_uef.html, "dump +cfg/uef"_dump_cfg_uef.html + +[Default:] + +The default keyword values specific to this fix are exy = xyz, strain += 0 0. The remaining defaults are the same as for {fix +npt}_fix_nh.html except tchain = 1. The reason for this change is +given in "fix nvt/sllod"_fix_nvt_sllod.html. + +:line + +:link(Dobson) +[(Dobson)] Dobson, J Chem Phys, 141, 184103 (2014). + +:link(Hunt) +[(Hunt)] Hunt, Mol Simul, 42, 347 (2016). + +:link(Semaev) +[(Semaev)] Semaev, Cryptography and Lattices, 181 (2001). + +:link(Sllod) +[(Evans and Morriss)] Evans and Morriss, Phys Rev A, 30, 1528 (1984). + +:link(Nicholson) +[(Nicholson and Rutledge)] Nicholson and Rutledge, J Chem Phys, 145, +244903 (2016). diff --git a/doc/src/fix_nve_dot.txt b/doc/src/fix_nve_dot.txt index 7ad51f3768..0e0c8f8ecf 100644 --- a/doc/src/fix_nve_dot.txt +++ b/doc/src/fix_nve_dot.txt @@ -44,7 +44,7 @@ A technical report with more information on this integrator can be found [Restrictions:] These pair styles can only be used if LAMMPS was built with the -USER-CGDNA package and the MOLECULE and ASPHERE package. See the "Making +"USER-CGDNA"_#USER-CGDNA package and the MOLECULE and ASPHERE package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info on packages. [Related commands:] diff --git a/doc/src/fix_nve_dotc_langevin.txt b/doc/src/fix_nve_dotc_langevin.txt index 5de8e663c4..93d875bca5 100644 --- a/doc/src/fix_nve_dotc_langevin.txt +++ b/doc/src/fix_nve_dotc_langevin.txt @@ -24,7 +24,8 @@ keyword = {angmom} :l [Examples:] -fix 1 all nve/dotc/langevin 1.0 1.0 0.03 457145 angmom 10 :pre +fix 1 all nve/dotc/langevin 1.0 1.0 0.03 457145 angmom 10 +fix 1 all nve/dotc/langevin 0.1 0.1 78.9375 457145 angmom 10 :pre [Description:] @@ -78,7 +79,9 @@ a Gaussian random number) for speed. :line {Tstart} and {Tstop} have to be constant values, i.e. they cannot -be variables. +be variables. If used together with the oxDNA force field for +coarse-grained simulation of DNA please note that T = 0.1 in oxDNA units +corresponds to T = 300 K. The {damp} parameter is specified in time units and determines how rapidly the temperature is relaxed. For example, a value of 0.03 @@ -89,6 +92,10 @@ viscosity of the solvent, i.e. a small relaxation time implies a hi-viscosity solvent and vice versa. See the discussion about gamma and viscosity in the documentation for the "fix viscous"_fix_viscous.html command for more details. +Note that the value 78.9375 in the second example above corresponds +to a diffusion constant, which is about an order of magnitude larger +than realistic ones. This has been used to sample configurations faster +in Brownian dynamics simulations. The random # {seed} must be a positive integer. A Marsaglia random number generator is used. Each processor uses the input seed to @@ -115,12 +122,12 @@ A technical report with more information on this integrator can be found [Restrictions:] These pair styles can only be used if LAMMPS was built with the -USER-CGDNA package and the MOLECULE and ASPHERE package. See the "Making +"USER-CGDNA"_#USER-CGDNA package and the MOLECULE and ASPHERE package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info on packages. [Related commands:] -"fix nve"_fix_nve.html, "fix langevin"_fix_langevin.html, "fix nve/dot"_fix_nve_dot.html, +"fix nve"_fix_nve.html, "fix langevin"_fix_langevin.html, "fix nve/dot"_fix_nve_dot.html, "bond_style oxdna/fene"_bond_oxdna.html, "bond_style oxdna2/fene"_bond_oxdna.html, "pair_style oxdna/excv"_pair_oxdna.html, "pair_style oxdna2/excv"_pair_oxdna2.html [Default:] none diff --git a/doc/src/fix_property_atom.txt b/doc/src/fix_property_atom.txt index aef534ad25..10bb89c94c 100644 --- a/doc/src/fix_property_atom.txt +++ b/doc/src/fix_property_atom.txt @@ -111,6 +111,10 @@ need to communicate their new values to/from ghost atoms, an operation that can be invoked from within a "pair style"_pair_style.html or "fix"_fix.html or "compute"_compute.html that you write. +NOTE: If this fix is defined [after] the simulation box is created, +a 'run 0' command should be issued to properly initialize the storage +created by this fix. + :line This fix is one of a small number that can be defined in an input @@ -155,7 +159,7 @@ these commands could be used: fix prop all property/atom mol variable cluster atom ((id-1)/10)+1 -set id * mol v_cluster :pre +set atom * mol v_cluster :pre The "atom-style variable"_variable.html will create values for atoms with IDs 31,32,33,...40 that are 4.0,4.1,4.2,...,4.9. When the diff --git a/doc/src/fix_python.txt b/doc/src/fix_python_invoke.txt similarity index 89% rename from doc/src/fix_python.txt rename to doc/src/fix_python_invoke.txt index c6e1ad9dac..787940d9eb 100644 --- a/doc/src/fix_python.txt +++ b/doc/src/fix_python_invoke.txt @@ -6,14 +6,14 @@ :line -fix python command :h3 +fix python/invoke command :h3 [Syntax:] -fix ID group-ID python N callback function_name :pre +fix ID group-ID python/invoke N callback function_name :pre ID, group-ID are ignored by this fix :ulb,l -python = style name of this fix command :l +python/invoke = style name of this fix command :l N = execute every N steps :l callback = {post_force} or {end_of_step} :l {post_force} = callback after force computations on atoms every N time steps @@ -36,8 +36,8 @@ def end_of_step_callback(lammps_ptr): # access LAMMPS state using Python interface """ :pre -fix pf all python 50 post_force post_force_callback -fix eos all python 50 end_of_step end_of_step_callback :pre +fix pf all python/invoke 50 post_force post_force_callback +fix eos all python/invoke 50 end_of_step end_of_step_callback :pre [Description:] diff --git a/doc/src/fix_python_move.txt b/doc/src/fix_python_move.txt new file mode 100644 index 0000000000..f10f607a9b --- /dev/null +++ b/doc/src/fix_python_move.txt @@ -0,0 +1,102 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix python/move command :h3 + +[Syntax:] + +fix python/move pymodule.CLASS :pre + +pymodule.CLASS = use class [CLASS] in module/file [pymodule] to compute how to move atoms + +[Examples:] + +fix 1 all python/move py_nve.NVE +fix 1 all python/move py_nve.NVE_OPT :pre + +[Description:] + +The {python/move} fix style provides a way to define ways how particles +are moved during an MD run from python script code, that is loaded from +a file into LAMMPS and executed at the various steps where other fixes +can be executed. This python script must contain specific python class +definitions. + +This allows to implement complex position updates and also modified +time integration methods. Due to python being an interpreted language, +however, the performance of this fix can be moderately to significantly +slower than the corresponding C++ code. For specific cases, this +performance penalty can be limited through effective use of NumPy. + +:line + +The python module file has to start with the following code: + +from __future__ import print_function +import lammps +import ctypes +import traceback +import numpy as np +# +class LAMMPSFix(object): + def __init__(self, ptr, group_name="all"): + self.lmp = lammps.lammps(ptr=ptr) + self.group_name = group_name +# +class LAMMPSFixMove(LAMMPSFix): + def __init__(self, ptr, group_name="all"): + super(LAMMPSFixMove, self).__init__(ptr, group_name) +# + def init(self): + pass +# + def initial_integrate(self, vflag): + pass +# + def final_integrate(self): + pass +# + def initial_integrate_respa(self, vflag, ilevel, iloop): + pass +# + def final_integrate_respa(self, ilevel, iloop): + pass +# + def reset_dt(self): + pass :pre + +Any classes implementing new atom motion functionality have to be +derived from the [LAMMPSFixMove] class, overriding the available +methods as needed. + +Examples for how to do this are in the {examples/python} folder. + +:line + +[Restart, fix_modify, output, run start/stop, minimize info:] + +No information about this fix is written to "binary restart +files"_restart.html. None of the "fix_modify"_fix_modify.html options +are relevant to this fix. No global or per-atom quantities are stored +by this fix for access by various "output +commands"_Section_howto.html#howto_15. No parameter of this fix can +be used with the {start/stop} keywords of the "run"_run.html command. +This fix is not invoked during "energy minimization"_minimize.html. + +[Restrictions:] + +This pair style is part of the PYTHON package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"fix nve"_fix_nve.html, "fix python/invoke"_fix_python_invoke.html + +[Default:] none + diff --git a/doc/src/fix_qbmsst.txt b/doc/src/fix_qbmsst.txt index 468206a57b..2c116fb0f8 100644 --- a/doc/src/fix_qbmsst.txt +++ b/doc/src/fix_qbmsst.txt @@ -78,7 +78,7 @@ especially when the temperature of the initial state is below the classical limit or there is a great change in the zero point energies between the initial and final states. Theoretical post processing quantum corrections of shock compressed water and methane have been -reported as much as 30% of the temperatures "(Goldman)"_#Goldman. A +reported as much as 30% of the temperatures "(Goldman)"_#Goldman1. A self-consistent method that couples the shock to a quantum thermal bath described by a colored noise Langevin thermostat has been developed by Qi et al "(Qi)"_#Qi and applied to shocked methane. The @@ -212,7 +212,7 @@ T_init=300.0. e0, p0, and v0 are calculated on the first step. :line -:link(Goldman) +:link(Goldman1) [(Goldman)] Goldman, Reed and Fried, J. Chem. Phys. 131, 204103 (2009) :link(Qi) diff --git a/doc/src/fix_qeq.txt b/doc/src/fix_qeq.txt index 22f4766896..194361e990 100644 --- a/doc/src/fix_qeq.txt +++ b/doc/src/fix_qeq.txt @@ -90,9 +90,14 @@ file specified by {qfile}. The file has the following format ... Ntype chi eta gamma zeta qcore :pre -There is one line per atom type with the following parameters. +There have to be parameters given for every atom type. Wildcard entries +are possible using the same syntax as elsewhere in LAMMPS +(i.e., n*m, n*, *m, *). Later entries will overwrite previous ones. +Empty lines or any text following the pound sign (#) are ignored. +Each line starts with the atom type followed by five parameters. Only a subset of the parameters is used by each QEq style as described -below, thus the others can be set to 0.0 if desired. +below, thus the others can be set to 0.0 if desired, but all five +entries per line are required. {chi} = electronegativity in energy units {eta} = self-Coulomb potential in energy units diff --git a/doc/src/fix_rhok.txt b/doc/src/fix_rhok.txt new file mode 100644 index 0000000000..2db920ac4b --- /dev/null +++ b/doc/src/fix_rhok.txt @@ -0,0 +1,56 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix rhok command :h3 + +fix ID group-ID rhok nx ny nz K a :pre + +ID, group-ID are documented in "fix"_fix.html command +nx, ny, nz = k-vektor of collective density field +K = spring constant of bias potential +a = anchor point of bias potential :ul + +[Examples:] + +fix bias all rhok 16 0 0 4.0 16.0 +fix 1 all npt temp 0.8 0.8 4.0 z 2.2 2.2 8.0 +# output of 4 values from fix rhok: U_bias rho_k_RE rho_k_IM |rho_k| +thermo_style custom step temp pzz lz f_bias f_bias\[1\] f_bias\[2\] f_bias\[3\] :pre + +[Description:] + +The fix applies a force to atoms given by the potential + +:c,image(Eqs/fix_rhok.jpg) + +as described in "(Pedersen)"_#Pedersen. + +This field, which biases configurations with long-range order, can be +used to study crystal-liquid interfaces and determine melting +temperatures "(Pedersen)"_#Pedersen. + +An example of using the interface pinning method is located in the +{examples/USER/misc/rhok} directory. + +[Restrictions:] + +This fix is part of the MISC package. It is only enabled if LAMMPS +was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"thermo_style"_thermo_style.html + +[Default:] none + +:line + +:link(Pedersen) +[(Pedersen)] Pedersen, J. Chem. Phys., 139, 104102 (2013). + diff --git a/doc/src/fix_rigid.txt b/doc/src/fix_rigid.txt index 62969112f7..eced602c4b 100644 --- a/doc/src/fix_rigid.txt +++ b/doc/src/fix_rigid.txt @@ -7,11 +7,17 @@ :line fix rigid command :h3 +fix rigid/omp command :h3 fix rigid/nve command :h3 +fix rigid/nve/omp command :h3 fix rigid/nvt command :h3 +fix rigid/nvt/omp command :h3 fix rigid/npt command :h3 +fix rigid/npt/omp command :h3 fix rigid/nph command :h3 +fix rigid/nph/omp command :h3 fix rigid/small command :h3 +fix rigid/small/omp command :h3 fix rigid/nve/small command :h3 fix rigid/nvt/small command :h3 fix rigid/npt/small command :h3 @@ -26,6 +32,9 @@ style = {rigid} or {rigid/nve} or {rigid/nvt} or {rigid/npt} or {rigid/nph} or { bodystyle = {single} or {molecule} or {group} :l {single} args = none {molecule} args = none + {custom} args = {i_propname} or {v_varname} + i_propname = an integer property defined via fix property/atom + v_varname = an atom-style or atomfile-style variable {group} args = N groupID1 groupID2 ... N = # of groups groupID1, groupID2, ... = list of N group IDs :pre @@ -80,7 +89,17 @@ fix 1 rods rigid/npt molecule temp 300.0 300.0 100.0 iso 0.5 0.5 10.0 fix 1 particles rigid/npt molecule temp 1.0 1.0 5.0 x 0.5 0.5 1.0 z 0.5 0.5 1.0 couple xz fix 1 water rigid/nph molecule iso 0.5 0.5 1.0 fix 1 particles rigid/npt/small molecule temp 1.0 1.0 1.0 iso 0.5 0.5 1.0 :pre - + +variable bodyid atom 1.0*gmask(clump1)+2.0*gmask(clump2)+3.0*gmask(clump3) +fix 1 clump rigid custom v_bodyid :pre + +variable bodyid atomfile bodies.txt +fix 1 clump rigid custom v_bodyid :pre + +fix 0 all property/atom i_bodyid +read_restart data.rigid fix 0 NULL Bodies +fix 1 clump rigid/small custom i_bodyid :pre + [Description:] Treat one or more sets of atoms as independent rigid bodies. This @@ -100,7 +119,7 @@ of a biomolecule such as a protein. Example of small rigid bodies are patchy nanoparticles, such as those modeled in "this paper"_#Zhang1 by Sharon Glotzer's group, clumps of -granular particles, lipid molecules consiting of one or more point +granular particles, lipid molecules consisting of one or more point dipoles connected to other spheroids or ellipsoids, irregular particles built from line segments (2d) or triangles (3d), and coarse-grain models of nano or colloidal particles consisting of a @@ -203,11 +222,11 @@ most one rigid body. Which atoms are in which bodies can be defined via several options. NOTE: With the {rigid/small} styles, which require that {bodystyle} be -specified as {molecule}, you can define a system that has no rigid -bodies initially. This is useful when you are using the {mol} keyword -in conjunction with another fix that is adding rigid bodies on-the-fly -as molecules, such as "fix deposit"_fix_deposit.html or "fix -pour"_fix_pour.html. +specified as {molecule} or {custom}, you can define a system that has +no rigid bodies initially. This is useful when you are using the {mol} +keyword in conjunction with another fix that is adding rigid bodies +on-the-fly as molecules, such as "fix deposit"_fix_deposit.html or +"fix pour"_fix_pour.html. For bodystyle {single} the entire fix group of atoms is treated as one rigid body. This option is only allowed for the {rigid} styles. @@ -222,6 +241,15 @@ molecule ID = 0) surrounding rigid bodies, this may not be what you want. Thus you should be careful to use a fix group that only includes atoms you want to be part of rigid bodies. +Bodystyle {custom} is similar to bodystyle {molecule}, however some +custom properties are used to group atoms into rigid bodies. The +special case for molecule/body ID = 0 is not available. Possible +custom properties are an integer property associated with atoms through +"fix property/atom"_fix_property_atom.html or an atom style variable +or an atomfile style variable. For the latter two, the variable value +will be rounded to an integer and then rigid bodies defined from +those values. + For bodystyle {group}, each of the listed groups is treated as a separate rigid body. Only atoms that are also in the fix group are included in each rigid body. This option is only allowed for the @@ -703,6 +731,11 @@ NVT, NPT, NPH rigid styles to add the energy change induced by the thermostatting to the system's potential energy as part of "thermodynamic output"_thermo_style.html. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to keeping the objects rigid to the +system's virial as part of "thermodynamic output"_thermo_style.html. +The default is {virial yes} + The "fix_modify"_fix_modify.html {temp} and {press} options are supported by the 4 NPT and NPH rigid styles to change the computes used to calculate the instantaneous pressure tensor. Note that the 2 diff --git a/doc/src/fix_rx.txt b/doc/src/fix_rx.txt index 6a800f3865..0810a34740 100644 --- a/doc/src/fix_rx.txt +++ b/doc/src/fix_rx.txt @@ -7,6 +7,7 @@ :line fix rx command :h3 +fix rx/kk command :h3 [Syntax:] @@ -182,6 +183,29 @@ read_data data.dpd fix foo_SPECIES NULL Species :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/fix_saed_vtk.txt b/doc/src/fix_saed_vtk.txt index 3523233cee..814e17b8e9 100644 --- a/doc/src/fix_saed_vtk.txt +++ b/doc/src/fix_saed_vtk.txt @@ -37,8 +37,8 @@ keyword = {file} or {ave} or {start} or {file} or {overwrite}:l compute 1 all saed 0.0251 Al O Kmax 1.70 Zone 0 0 1 dR_Ewald 0.01 c 0.5 0.5 0.5 compute 2 all saed 0.0251 Ni Kmax 1.70 Zone 0 0 0 c 0.05 0.05 0.05 manual echo :pre -fix saed/vtk 1 1 1 c_1 file Al2O3_001.saed -fix saed/vtk 1 1 1 c_2 file Ni_000.saed :pre +fix 1 all saed/vtk 1 1 1 c_1 file Al2O3_001.saed +fix 2 all saed/vtk 1 1 1 c_2 file Ni_000.saed :pre [Description:] diff --git a/doc/src/fix_shake.txt b/doc/src/fix_shake.txt index c187b17c6c..46452a1f7e 100644 --- a/doc/src/fix_shake.txt +++ b/doc/src/fix_shake.txt @@ -58,7 +58,7 @@ required in order to eliminate velocity components along the bonds In order to formulate individual constraints for SHAKE and RATTLE, focus on a single molecule whose bonds are constrained. Let Ri and Vi be the position and velocity of atom {i} at time {n}, for -{i}=1,...,{N}, where {N} is the number of sites of our reference +{i} =1,...,{N}, where {N} is the number of sites of our reference molecule. The distance vector between sites {i} and {j} is given by :c,image(Eqs/fix_rattle_rij.jpg) @@ -186,6 +186,11 @@ to 1 and recompiling LAMMPS. [Restart, fix_modify, output, run start/stop, minimize info:] +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to keeping the constraints to the +system's virial as part of "thermodynamic output"_thermo_style.html. +The default is {virial yes} + No information about these fixes is written to "binary restart files"_restart.html. None of the "fix_modify"_fix_modify.html options are relevant to these fixes. No global or per-atom quantities are diff --git a/doc/src/fix_shardlow.txt b/doc/src/fix_shardlow.txt index 8354b4c41c..24726d8610 100644 --- a/doc/src/fix_shardlow.txt +++ b/doc/src/fix_shardlow.txt @@ -7,6 +7,7 @@ :line fix shardlow command :h3 +fix shardlow/kk command :h3 [Syntax:] @@ -52,6 +53,29 @@ examples/USER/dpd directory. :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/fix_smd.txt b/doc/src/fix_smd.txt index dca45f4548..cb4a40f0fd 100644 --- a/doc/src/fix_smd.txt +++ b/doc/src/fix_smd.txt @@ -101,6 +101,11 @@ See the "read_restart"_read_restart.html command for info on how to re-specify a fix in an input script that reads a restart file, so that the operation of the fix continues in an uninterrupted fashion. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the added forces on atoms to the +system's virial as part of "thermodynamic output"_thermo_style.html. +The default is {virial no} + The "fix_modify"_fix_modify.html {respa} option is supported by this fix. This allows to set at which level of the "r-RESPA"_run_style.html integrator the fix is adding its forces. Default is the outermost level. diff --git a/doc/src/fix_smd_integrate_tlsph.txt b/doc/src/fix_smd_integrate_tlsph.txt index 24d319bdb9..17c9c0f400 100644 --- a/doc/src/fix_smd_integrate_tlsph.txt +++ b/doc/src/fix_smd_integrate_tlsph.txt @@ -14,15 +14,12 @@ fix ID group-ID smd/integrate_tlsph keyword values :pre ID, group-ID are documented in "fix"_fix.html command smd/integrate_tlsph = style name of this fix command -zero or more keyword/value pairs may be appended :ul - -keyword = {limit_velocity} :l +zero or more keyword/value pairs may be appended +keyword = {limit_velocity} :ul {limit_velocity} value = max_vel max_vel = maximum allowed velocity :pre -:ule - [Examples:] fix 1 all smd/integrate_tlsph diff --git a/doc/src/fix_smd_integrate_ulsph.txt b/doc/src/fix_smd_integrate_ulsph.txt index 0dfb9451de..28e38c7f97 100644 --- a/doc/src/fix_smd_integrate_ulsph.txt +++ b/doc/src/fix_smd_integrate_ulsph.txt @@ -14,9 +14,8 @@ fix ID group-ID smd/integrate_ulsph keyword :pre ID, group-ID are documented in "fix"_fix.html command smd/integrate_ulsph = style name of this fix command -zero or more keyword/value pairs may be appended :ul - -keyword = adjust_radius or limit_velocity +zero or more keyword/value pairs may be appended +keyword = adjust_radius or limit_velocity :ul adjust_radius values = adjust_radius_factor min_nn max_nn adjust_radius_factor = factor which scale the smooth/kernel radius @@ -28,7 +27,7 @@ limit_velocity values = max_velocity [Examples:] -fix 1 all smd/integrate_ulsph adjust_radius 1.02 25 50 :pre +fix 1 all smd/integrate_ulsph adjust_radius 1.02 25 50 fix 1 all smd/integrate_ulsph limit_velocity 1000 :pre [Description:] @@ -38,7 +37,7 @@ See "this PDF guide"_PDF/SMD_LAMMPS_userguide.pdf to using Smooth Mach Dynamics The {adjust_radius} keyword activates dynamic adjustment of the per-particle SPH smoothing kernel radius such that the number of neighbors per particles remains within the interval {min_nn} to {max_nn}. The parameter {adjust_radius_factor} determines the amount of adjustment per timestep. Typical values are -{adjust_radius_factor}=1.02, {min_nn}=15, and {max_nn}=20. +{adjust_radius_factor} =1.02, {min_nn} =15, and {max_nn} =20. The {limit_velocity} keyword will control the velocity, scaling the norm of the velocity vector to max_vel in case it exceeds this velocity limit. diff --git a/doc/src/fix_surface_global.txt b/doc/src/fix_surface_global.txt new file mode 100644 index 0000000000..b470babab7 --- /dev/null +++ b/doc/src/fix_surface_global.txt @@ -0,0 +1,19 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix wall/surface/globale command :h3 + +[Description:] + +This feature is not yet implemented. + +[Related commands:] + +"dump image"_dump_image.html + + diff --git a/doc/src/fix_ti_spring.txt b/doc/src/fix_ti_spring.txt index afb1dcf8ff..191f9e7c6b 100644 --- a/doc/src/fix_ti_spring.txt +++ b/doc/src/fix_ti_spring.txt @@ -34,7 +34,7 @@ by performing a nonequilibrium thermodynamic integration between the solid of interest and an Einstein crystal. A detailed explanation of how to use this command and choose its parameters for optimal performance and accuracy is given in the paper by -"Freitas"_#Freitas. The paper also presents a short summary of the +"Freitas"_#Freitas1. The paper also presents a short summary of the theory of nonequilibrium thermodynamic integrations. The thermodynamic integration procedure is performed by rescaling the @@ -67,13 +67,13 @@ of lambda is kept equal to zero and the fix has no other effect on the dynamics of the system. The processes described above is known as nonequilibrium thermodynamic -integration and is has been shown ("Freitas"_#Freitas) to present a +integration and is has been shown ("Freitas"_#Freitas1) to present a much superior efficiency when compared to standard equilibrium methods. The reason why the switching it is made in both directions (potential to Einstein crystal and back) is to eliminate the dissipated heat due to the nonequilibrium process. Further details about nonequilibrium thermodynamic integration and its implementation -in LAMMPS is available in "Freitas"_#Freitas. +in LAMMPS is available in "Freitas"_#Freitas1. The {function} keyword allows the use of two different lambda paths. Option {1} results in a constant rate of change of lambda with @@ -94,7 +94,7 @@ thermodynamic integration. The use of option {2} is recommended since it results in better accuracy and less dissipation without any increase in computational resources cost. -NOTE: As described in "Freitas"_#Freitas, it is important to keep the +NOTE: As described in "Freitas"_#Freitas1, it is important to keep the center-of-mass fixed during the thermodynamic integration. A nonzero total velocity will result in divergences during the integration due to the fact that the atoms are 'attached' to their equilibrium @@ -156,7 +156,7 @@ The keyword default is function = 1. :line -:link(Freitas) +:link(Freitas1) [(Freitas)] Freitas, Asta, and de Koning, Computational Materials Science, 112, 333 (2016). diff --git a/doc/src/fix_wall.txt b/doc/src/fix_wall.txt index 6d76956620..e814c89a07 100644 --- a/doc/src/fix_wall.txt +++ b/doc/src/fix_wall.txt @@ -7,6 +7,7 @@ :line fix wall/lj93 command :h3 +fix wall/lj93/kk command :h3 fix wall/lj126 command :h3 fix wall/lj1043 command :h3 fix wall/colloid command :h3 @@ -251,6 +252,11 @@ fix to add the energy of interaction between atoms and each wall to the system's potential energy as part of "thermodynamic output"_thermo_style.html. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the interaction between +atoms and each wall to the system's virial as part of "thermodynamic +output"_thermo_style.html. The default is {virial no} + The "fix_modify"_fix_modify.html {respa} option is supported by this fix. This allows to set at which level of the "r-RESPA"_run_style.html integrator the fix is adding its forces. Default is the outermost level. @@ -277,6 +283,31 @@ the total potential energy of the system (the quantity being minimized), you MUST enable the "fix_modify"_fix_modify.html {energy} option for this fix. +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] none [Related commands:] diff --git a/doc/src/fix_wall_ees.txt b/doc/src/fix_wall_ees.txt index a8688e8e41..f141a19405 100644 --- a/doc/src/fix_wall_ees.txt +++ b/doc/src/fix_wall_ees.txt @@ -50,17 +50,17 @@ fix ees_cube all wall/region/ees myCube 1.0 1.0 2.5 :pre Fix {wall/ees} bounds the simulation domain on one or more of its faces with a flat wall that interacts with the ellipsoidal atoms in the group by generating a force on the atom in a direction perpendicular to -the wall and a torque parallel with the wall.  The energy of +the wall and a torque parallel with the wall. The energy of wall-particle interactions E is given by: :c,image(Eqs/fix_wall_ees.jpg) Introduced by Babadi and Ejtehadi in "(Babadi)"_#BabadiEjtehadi. Here, {r} is the distance from the particle to the wall at position {coord}, -and Rc is the {cutoff} distance at which the  particle and wall no -longer interact. Also,  sigma_n is the distance between center of -ellipsoid and the nearest point of its surface to the wall  The energy -of the wall (see the image below). +and Rc is the {cutoff} distance at which the particle and wall no +longer interact. Also, sigma_n is the distance between center of +ellipsoid and the nearest point of its surface to the wall. The energy +of the wall is: :c,image(JPG/fix_wall_ees_image.jpg) @@ -68,21 +68,22 @@ Details of using this command and specifications are the same as fix/wall command. You can also find an example in USER/ees/ under examples/ directory. -The prefactor {epsilon} can be thought of as an -effective Hamaker constant with energy units for the strength of the -ellipsoid-wall interaction.  More specifically, the {epsilon} pre-factor -= 8 * pi^2 * rho_wall * rho_ellipsoid * epsilon -* sigma_a * sigma_b * sigma_c, where epsilon is the LJ parameters for -the constituent LJ particles and sigma_a, sigma_b, and sigma_c are radii -of ellipsoidal particles. Rho_wall and rho_ellipsoid are the number +The prefactor {epsilon} can be thought of as an +effective Hamaker constant with energy units for the strength of the +ellipsoid-wall interaction. More specifically, the {epsilon} pre-factor += 8 * pi^2 * rho_wall * rho_ellipsoid * epsilon +* sigma_a * sigma_b * sigma_c, where epsilon is the LJ parameters for +the constituent LJ particles and sigma_a, sigma_b, and sigma_c are radii +of ellipsoidal particles. Rho_wall and rho_ellipsoid are the number density of the constituent particles, in the wall and ellipsoid respectively, in units of 1/volume. NOTE: You must insure that r is always bigger than sigma_n for -all particles in the group, or LAMMPS will generate an error.  This +all particles in the group, or LAMMPS will generate an error. This means you cannot start your simulation with particles touching the wall -position {coord} (r = sigma_n) or with particles penetrating the wall (0 =< r < sigma_n) or with particles on the wrong side of the -wall (r < 0). +position {coord} (r = sigma_n) or with particles penetrating the wall +(0 =< r < sigma_n) or with particles on the wrong side of the +wall (r < 0). Fix {wall/region/ees} treats the surface of the geometric region defined @@ -93,7 +94,7 @@ Other details of this command are the same as for the "fix wall/region"_fix_wall_region.html command. One may also find an example of using this fix in the examples/USER/misc/ees/ directory. -[Restrictions:] +[Restrictions:] This fix is part of the USER-MISC package. It is only enabled if LAMMPS was built with that package. See the "Making diff --git a/doc/src/fix_wall_region.txt b/doc/src/fix_wall_region.txt index ca5335e3fb..9700545dc9 100644 --- a/doc/src/fix_wall_region.txt +++ b/doc/src/fix_wall_region.txt @@ -15,7 +15,7 @@ fix ID group-ID wall/region region-ID style epsilon sigma cutoff :pre ID, group-ID are documented in "fix"_fix.html command wall/region = style name of this fix command region-ID = region whose boundary will act as wall -style = {lj93} or {lj126} or {colloid} or {harmonic} +style = {lj93} or {lj126} or {lj1043} or {colloid} or {harmonic} epsilon = strength factor for wall-particle interaction (energy or energy/distance^2 units) sigma = size factor for wall-particle interaction (distance units) cutoff = distance from wall at which wall-particle interaction is cut off (distance units) :ul @@ -112,6 +112,10 @@ For style {lj126}, the energy E is given by the 12/6 potential: :c,image(Eqs/pair_lj.jpg) +For style {wall/lj1043}, the energy E is given by the 10/4/3 potential: + +:c,image(Eqs/fix_wall_lj1043.jpg) + For style {colloid}, the energy E is given by an integrated form of the "pair_style colloid"_pair_colloid.html potential: @@ -128,49 +132,8 @@ surface no longer interact. The energy of the wall potential is shifted so that the wall-particle interaction energy is 0.0 at the cutoff distance. -For the {lj93} and {lj126} styles, {epsilon} and {sigma} are the usual -Lennard-Jones parameters, which determine the strength and size of the -particle as it interacts with the wall. Epsilon has energy units. -Note that this {epsilon} and {sigma} may be different than any -{epsilon} or {sigma} values defined for a pair style that computes -particle-particle interactions. - -The {lj93} interaction is derived by integrating over a 3d -half-lattice of Lennard-Jones 12/6 particles. The {lj126} interaction -is effectively a harder, more repulsive wall interaction. - -For the {colloid} style, {epsilon} is effectively a Hamaker constant -with energy units for the colloid-wall interaction, {R} is the radius -of the colloid particle, {D} is the distance from the surface of the -colloid particle to the wall (r-R), and {sigma} is the size of a -constituent LJ particle inside the colloid particle. Note that the -cutoff distance Rc in this case is the distance from the colloid -particle center to the wall. - -The {colloid} interaction is derived by integrating over constituent -LJ particles of size {sigma} within the colloid particle and a 3d -half-lattice of Lennard-Jones 12/6 particles of size {sigma} in the -wall. - -For the {wall/harmonic} style, {epsilon} is effectively the spring -constant K, and has units (energy/distance^2). The input parameter -{sigma} is ignored. The minimum energy position of the harmonic -spring is at the {cutoff}. This is a repulsive-only spring since the -interaction is truncated at the {cutoff} - -NOTE: For all of the styles, you must insure that r is always > 0 for -all particles in the group, or LAMMPS will generate an error. This -means you cannot start your simulation with particles on the region -surface (r = 0) or with particles on the wrong side of the region -surface (r < 0). For the {wall/lj93} and {wall/lj126} styles, the -energy of the wall/particle interaction (and hence the force on the -particle) blows up as r -> 0. The {wall/colloid} style is even more -restrictive, since the energy blows up as D = r-R -> 0. This means -the finite-size particles of radius R must be a distance larger than R -from the region surface. The {harmonic} style is a softer potential -and does not blow up as r -> 0, but you must use a large enough -{epsilon} that particles always reamin on the correct side of the -region surface (r > 0). +For a full description of these wall styles, see fix_style +"wall"_fix_wall.html [Restart, fix_modify, output, run start/stop, minimize info:] @@ -182,6 +145,11 @@ fix to add the energy of interaction between atoms and the wall to the system's potential energy as part of "thermodynamic output"_thermo_style.html. +The "fix_modify"_fix_modify.html {virial} option is supported by this +fix to add the contribution due to the interaction between +atoms and each wall to the system's virial as part of "thermodynamic +output"_thermo_style.html. The default is {virial no} + The "fix_modify"_fix_modify.html {respa} option is supported by this fix. This allows to set at which level of the "r-RESPA"_run_style.html integrator the fix is adding its forces. Default is the outermost level. diff --git a/doc/src/fixes.txt b/doc/src/fixes.txt index 3dc5e77e14..c3fcc06bf1 100644 --- a/doc/src/fixes.txt +++ b/doc/src/fixes.txt @@ -33,6 +33,7 @@ Fixes :h1 fix_drude fix_drude_transform fix_dpd_energy + fix_dpd_source fix_dt_reset fix_efield fix_ehex @@ -58,6 +59,7 @@ Fixes :h1 fix_langevin fix_langevin_drude fix_langevin_eff + fix_latte fix_lb_fluid fix_lb_momentum fix_lb_pc @@ -71,9 +73,11 @@ Fixes :h1 fix_move fix_mscg fix_msst + fix_mvv_dpd fix_neb fix_nh fix_nh_eff + fix_nh_uef fix_nph_asphere fix_nph_body fix_nph_sphere @@ -111,7 +115,8 @@ Fixes :h1 fix_press_berendsen fix_print fix_property_atom - fix_python + fix_python_invoke + fix_python_move fix_qbmsst fix_qeq fix_qeq_comb @@ -122,6 +127,7 @@ Fixes :h1 fix_reaxc_species fix_recenter fix_restrain + fix_rhok fix_rigid fix_rx fix_saed_vtk @@ -142,6 +148,7 @@ Fixes :h1 fix_srd fix_store_force fix_store_state + fix_surface_global fix_temp_berendsen fix_temp_csvr fix_temp_rescale diff --git a/doc/src/group.txt b/doc/src/group.txt index afa218c5a3..dddb0459e3 100644 --- a/doc/src/group.txt +++ b/doc/src/group.txt @@ -13,11 +13,13 @@ group command :h3 group ID style args :pre ID = user-defined name of the group :ulb,l -style = {delete} or {region} or {type} or {id} or {molecule} or {variable} or \ +style = {delete} or {clear} or {empty} or {region} or \ + {type} or {id} or {molecule} or {variable} or \ {include} or {subtract} or {union} or {intersect} or \ {dynamic} or {static} :l {delete} = no args {clear} = no args + {empty} = no args {region} args = region-ID {type} or {id} or {molecule} args = list of one or more atom types, atom IDs, or molecule IDs @@ -41,6 +43,7 @@ style = {delete} or {region} or {type} or {id} or {molecule} or {variable} or \ keyword = {region} or {var} or {every} {region} value = region-ID {var} value = name of variable + {property} value = name of per-atom property {every} value = N = update group every this many timesteps {static} = no args :pre :ule @@ -99,6 +102,10 @@ e.g. using the "run every"_run.html command if a fix or compute or other operation expects the atoms in the group to remain constant, but LAMMPS does not check for this. +The {empty} style creates an empty group, which is useful for commands +like "fix gcmc"_fix_gcmc.html or with complex scripts that add atoms +to a group. + The {region} style puts all atoms in the region volume into the group. Note that this is a static one-time assignment. The atoms remain assigned (or not assigned) to the group even in they later move out of @@ -215,7 +222,11 @@ conditions are applied. If the {region} keyword is used, atoms not in the specified region are removed from the dynamic group. If the {var} keyword is used, the variable name must be an atom-style or atomfile-style variable. The variable is evaluated and atoms whose -per-atom values are 0.0, are removed from the dynamic group. +per-atom values are 0.0, are removed from the dynamic group. If the {property} +keyword is used, the per-atom property name must be a previously defined +per-atom property. The per-atom property is evaluated and atoms whose +values are 0.0 are removed from the dynamic group, otherwise they +are added to the group. The assignment of atoms to a dynamic group is done at the beginning of each run and on every timestep that is a multiple of {N}, which is the diff --git a/doc/src/improper_inversion_harmonic.txt b/doc/src/improper_inversion_harmonic.txt new file mode 100644 index 0000000000..34683ca2bb --- /dev/null +++ b/doc/src/improper_inversion_harmonic.txt @@ -0,0 +1,65 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +improper_style inversion/harmonic command :h3 + +[Syntax:] + +improper_style inversion/harmonic :pre + +[Examples:] + +improper_style inversion/harmonic +improper_coeff 1 18.776340 0.000000 :pre + +[Description:] + +The {inversion/harmonic} improper style follows the Wilson-Decius +out-of-plane angle definition and uses an harmonic potential: + +:c,image(Eqs/improper_inversion_harmonic.jpg) + +where K is the force constant and omega is the angle evaluated for +all three axis-plane combinations centered around the atom I. For +the IL axis and the IJK plane omega looks as follows: + +:c,image(Eqs/umbrella.jpg) + +Note that the {inversion/harmonic} angle term evaluation differs to +the "improper_umbrella"_improper_umbrella.html due to the cyclic +evaluation of all possible angles omega. + +The following coefficients must be defined for each improper type via +the "improper_coeff"_improper_coeff.html command as in the example +above, or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands: + +K (energy) +omega0 (degrees) :ul + +If omega0 = 0 the potential term has a minimum for the planar +structure. Otherwise it has two minima at +/- omega0, with a barrier +in between. + +:line + +[Restrictions:] + +This improper style can only be used if LAMMPS was built with the +USER-MOFFF package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info on packages. + +[Related commands:] + +"improper_coeff"_improper_coeff.html + +[Default:] none + +:line + diff --git a/doc/src/impropers.txt b/doc/src/impropers.txt index ced6128879..ca6c839c95 100644 --- a/doc/src/impropers.txt +++ b/doc/src/impropers.txt @@ -12,6 +12,7 @@ Improper Styles :h1 improper_fourier improper_harmonic improper_hybrid + improper_inversion_harmonic improper_none improper_ring improper_umbrella diff --git a/doc/src/info.txt b/doc/src/info.txt index 43b430f746..d5b5bd97b9 100644 --- a/doc/src/info.txt +++ b/doc/src/info.txt @@ -12,7 +12,7 @@ info command :h3 info args :pre -args = one or more of the following keywords: {out}, {all}, {system}, {memory}, {communication}, {computes}, {dumps}, {fixes}, {groups}, {regions}, {variables}, {styles}, {time}, or {configuration} +args = one or more of the following keywords: {out}, {all}, {system}, {memory}, {communication}, {computes}, {dumps}, {fixes}, {groups}, {regions}, {variables}, {coeffs}, {styles}, {time}, or {configuration} {out} values = {screen}, {log}, {append} filename, {overwrite} filename {styles} values = {all}, {angle}, {atom}, {bond}, {compute}, {command}, {dump}, {dihedral}, {fix}, {improper}, {integrate}, {kspace}, {minimize}, {pair}, {region} :ul @@ -81,6 +81,11 @@ The {variables} category prints a list of all currently defined variables, their names, styles, definition and last computed value, if available. +The {coeffs} category prints a list for each defined force style +(pair, bond, angle, dihedral, improper) indicating which of the +corresponding coefficients have been set. This can be very helpful +to debug error messages like "All pair coeffs are not set". + The {styles} category prints the list of styles available in the current LAMMPS binary. It supports one of the following options to control which category of styles is printed out: diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 76b6743657..878e4ad355 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -1,6 +1,5 @@ -#HTMLDOC 1.8.27 --t pdf14 -f "../Manual.pdf" --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --textcolor #000000 --linkcolor #0000ff --linkstyle plain --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont helvetica --bodyfont times --headfootsize 11.0 --headfootfont helvetica --charset iso-8859-1 --links --embedfonts --pagemode document --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --no-strict --no-overflow - +#HTMLDOC 1.8.28 +-t pdf14 -f "../Manual.pdf" --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --textcolor #000000 --linkcolor #0000ff --linkstyle plain --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont Sans --bodyfont Serif --headfootsize 11.0 --headfootfont Sans-Bold --charset iso-8859-15 --links --embedfonts --pagemode document --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --no-strict --no-overflow Manual.html Section_intro.html Section_start.html @@ -21,6 +20,8 @@ Section_python.html Section_errors.html Section_history.html +lammps_tutorials.html +tutorial_bash_on_windows.html tutorial_drude.html tutorial_github.html tutorial_pylammps.html @@ -28,6 +29,7 @@ tutorial_pylammps.html body.html manifolds.html +lammps_commands.html angle_coeff.html angle_style.html atom_modify.html @@ -61,6 +63,7 @@ dump_modify.html dump_molfile.html dump_netcdf.html dump_vtk.html +dump_cfg_uef.html echo.html fix.html fix_modify.html @@ -115,6 +118,7 @@ suffix.html tad.html temper.html temper_grem.html +temper_npt.html thermo.html thermo_modify.html thermo_style.html @@ -136,7 +140,6 @@ fix_adapt_fep.html fix_addforce.html fix_addtorque.html fix_append_atoms.html -fix_atc.html fix_atom_swap.html fix_ave_atom.html fix_ave_chunk.html @@ -156,6 +159,7 @@ fix_controller.html fix_deform.html fix_deposit.html fix_dpd_energy.html +fix_dpd_source.html fix_drag.html fix_drude.html fix_drude_transform.html @@ -184,6 +188,7 @@ fix_ipi.html fix_langevin.html fix_langevin_drude.html fix_langevin_eff.html +fix_latte.html fix_lb_fluid.html fix_lb_momentum.html fix_lb_pc.html @@ -197,6 +202,7 @@ fix_momentum.html fix_move.html fix_mscg.html fix_msst.html +fix_mvv_dpd.html fix_neb.html fix_nh.html fix_nh_eff.html @@ -227,6 +233,7 @@ fix_nvt_manifold_rattle.html fix_nvt_sllod.html fix_nvt_sllod_eff.html fix_nvt_sphere.html +fix_nh_uef.html fix_oneway.html fix_orient.html fix_phonon.html @@ -237,7 +244,8 @@ fix_pour.html fix_press_berendsen.html fix_print.html fix_property_atom.html -fix_python.html +fix_python_invoke.html +fix_python_move.html fix_qbmsst.html fix_qeq.html fix_qeq_comb.html @@ -249,6 +257,7 @@ fix_reaxc_species.html fix_recenter.html fix_restrain.html fix_rigid.html +fix_rhok.html fix_rx.html fix_saed_vtk.html fix_setforce.html @@ -268,6 +277,7 @@ fix_spring_self.html fix_srd.html fix_store_force.html fix_store_state.html +fix_surface_global.html fix_temp_berendsen.html fix_temp_csvr.html fix_temp_rescale.html @@ -315,6 +325,7 @@ compute_dipole_chunk.html compute_displace_atom.html compute_dpd.html compute_dpd_atom.html +compute_edpd_temp_atom.html compute_erotate_asphere.html compute_erotate_rigid.html compute_erotate_sphere.html @@ -349,6 +360,7 @@ compute_pe.html compute_pe_atom.html compute_plasticity_atom.html compute_pressure.html +compute_pressure_uef.html compute_property_atom.html compute_property_chunk.html compute_property_local.html @@ -380,6 +392,7 @@ compute_smd_vol.html compute_sna_atom.html compute_stress_atom.html compute_tally.html +compute_tdpd_cc_atom.html compute_temp.html compute_temp_asphere.html compute_temp_body.html @@ -397,6 +410,7 @@ compute_temp_region.html compute_temp_region_eff.html compute_temp_rotate.html compute_temp_sphere.html +compute_temp_uef.html compute_ti.html compute_torque_chunk.html compute_vacf.html @@ -410,11 +424,13 @@ pair_airebo.html pair_awpmd.html pair_beck.html pair_body.html +pair_body_rounded_polygon.html pair_bop.html pair_born.html pair_brownian.html pair_buck.html pair_buck_long.html +pair_buck6d_coul_gauss.html pair_charmm.html pair_class2.html pair_colloid.html @@ -431,6 +447,7 @@ pair_edip.html pair_eff.html pair_eim.html pair_exp6_rx.html +pair_extep.html pair_gauss.html pair_gayberne.html pair_gran.html @@ -457,6 +474,7 @@ pair_mdf.html pair_meam.html pair_meam_spline.html pair_meam_sw_spline.html +pair_meso.html pair_mgpt.html pair_mie.html pair_momb.html @@ -498,6 +516,7 @@ pair_tersoff_mod.html pair_tersoff_zbl.html pair_thole.html pair_tri_lj.html +pair_ufm.html pair_vashishta.html pair_yukawa.html pair_yukawa_colloid.html @@ -507,7 +526,7 @@ pair_zero.html bond_class2.html bond_fene.html bond_fene_expand.html -bond_oxdna.html +bond_gromos.html bond_harmonic.html bond_harmonic_shift.html bond_harmonic_shift_cut.html @@ -515,6 +534,7 @@ bond_hybrid.html bond_morse.html bond_none.html bond_nonlinear.html +bond_oxdna.html bond_quartic.html bond_table.html bond_zero.html @@ -522,6 +542,7 @@ bond_zero.html angle_charmm.html angle_class2.html angle_cosine.html +angle_cosine_buck6d.html angle_cosine_delta.html angle_cosine_periodic.html angle_cosine_shift.html @@ -561,11 +582,13 @@ improper_distance.html improper_fourier.html improper_harmonic.html improper_hybrid.html +improper_inversion_harmonic.html improper_none.html improper_ring.html improper_umbrella.html improper_zero.html +fix_atc.html USER/atc/man_add_molecule.html USER/atc/man_add_species.html USER/atc/man_atom_element_map.html @@ -644,4 +667,3 @@ USER/atc/man_unfix_flux.html USER/atc/man_unfix_nodes.html USER/atc/man_write_atom_weights.html USER/atc/man_write_restart.html - diff --git a/doc/src/lammps_commands.txt b/doc/src/lammps_commands.txt new file mode 100644 index 0000000000..f9c2e7366a --- /dev/null +++ b/doc/src/lammps_commands.txt @@ -0,0 +1,10 @@ + +LAMMPS Commands :h1 + +The following pages contain the detailed documentation of all +LAMMPS commands included in this version of LAMMPS. Generic +commands are listed first (in alphabetical order) followed by +command categories like compute styles or pair styles and so on. + +The documentation for the USER-ATC package fix_modify commands +follow at the very end of this manual. diff --git a/doc/src/lammps_tutorials.txt b/doc/src/lammps_tutorials.txt new file mode 100644 index 0000000000..5ceda65b60 --- /dev/null +++ b/doc/src/lammps_tutorials.txt @@ -0,0 +1,6 @@ + +Tutorials :h2 + +The following pages contain some in-depth tutorials for +selected topics, that did not fit into any other place +in the manual. diff --git a/doc/src/manifolds.txt b/doc/src/manifolds.txt index c9bb1ce57f..36c6caacb7 100644 --- a/doc/src/manifolds.txt +++ b/doc/src/manifolds.txt @@ -6,7 +6,7 @@ :line -Manifolds (surfaces) :h3 +Manifolds (surfaces) :h1 [Overview:] diff --git a/doc/src/neb.txt b/doc/src/neb.txt index 144fe8bdef..56f075c301 100644 --- a/doc/src/neb.txt +++ b/doc/src/neb.txt @@ -322,9 +322,9 @@ the fix neb command. The forward (reverse) energy barrier is the potential energy of the highest replica minus the energy of the first (last) replica. -Supplementary informations for all replicas can be printed out to the -screen and master log.lammps file by adding the verbose keyword. These -informations include the following. The "path angle" (pathangle) for +Supplementary information for all replicas can be printed out to the +screen and master log.lammps file by adding the verbose keyword. This +information include the following. The "path angle" (pathangle) for the replica i which is the angle between the 3N-length vectors (Ri-1 - Ri) and (Ri+1 - Ri) (where Ri is the atomic coordinates of replica i). A "path angle" of 180 indicates that replicas i-1, i and i+1 are @@ -339,8 +339,8 @@ energy gradient of image i. ReplicaForce is the two-norm of the 3N-length force vector (including nudging forces) for replica i. MaxAtomForce is the maximum force component of any atom in replica i. -When a NEB calculation does not converge properly, these suplementary -informations can help understanding what is going wrong. For instance +When a NEB calculation does not converge properly, the suplementary +information can help understanding what is going wrong. For instance when the path angle becomes accute the definition of tangent used in the NEB calculation is questionable and the NEB cannot may diverge "(Maras)"_#Maras2. diff --git a/doc/src/neigh_modify.txt b/doc/src/neigh_modify.txt index 5c149d892d..c4544cb29b 100644 --- a/doc/src/neigh_modify.txt +++ b/doc/src/neigh_modify.txt @@ -109,7 +109,8 @@ atoms in the specified group. This can be useful for models where a large portion of the simulation is particles that do not interact with other particles or with each other via pairwise interactions. The group specified with this option must also be specified via the -"atom_modify first"_atom_modify.html command. +"atom_modify first"_atom_modify.html command. Note that specifying +"all" as the group-ID effectively turns off the {include} option. The {exclude} option turns off pairwise interactions between certain pairs of atoms, by not including them in the neighbor list. These are @@ -213,5 +214,5 @@ space. [Default:] The option defaults are delay = 10, every = 1, check = yes, once = no, -cluster = no, include = all, exclude = none, page = 100000, one = -2000, and binsize = 0.0. +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/package.txt b/doc/src/package.txt index 1b9092644f..5c698934e8 100644 --- a/doc/src/package.txt +++ b/doc/src/package.txt @@ -62,7 +62,7 @@ args = arguments specific to the style :l {no_affinity} values = none {kokkos} args = keyword value ... zero or more keyword/value pairs may be appended - keywords = {neigh} or {neigh/qeq} or {newton} or {binsize} or {comm} or {comm/exchange} or {comm/forward} + keywords = {neigh} or {neigh/qeq} or {newton} or {binsize} or {comm} or {comm/exchange} or {comm/forward} or {comm/reverse} {neigh} value = {full} or {half} full = full neighbor list half = half neighbor list built in thread-safe manner @@ -75,9 +75,10 @@ args = arguments specific to the style :l {binsize} value = size size = bin size for neighbor list construction (distance units) {comm} value = {no} or {host} or {device} - use value for both comm/exchange and comm/forward + use value for comm/exchange and comm/forward and comm/reverse {comm/exchange} value = {no} or {host} or {device} {comm/forward} value = {no} or {host} or {device} + {comm/reverse} value = {no} or {host} or {device} no = perform communication pack/unpack in non-KOKKOS mode host = perform pack/unpack on host (e.g. with OpenMP threading) device = perform pack/unpack on device (e.g. on GPU) @@ -335,7 +336,8 @@ from the USER-INTEL package is not used, then the LRT setting is ignored and no extra threads are generated. Enabling LRT will replace the "run_style"_run_style.html with the {verlet/lrt/intel} style that is identical to the default {verlet} style aside from supporting the -LRT feature. +LRT feature. This feature requires setting the preprocessor flag +-DLMP_INTEL_USELRT in the makefile when compiling LAMMPS. The {balance} keyword sets the fraction of "pair style"_pair_style.html work offloaded to the coprocessor for split @@ -428,17 +430,18 @@ Coulombic solver"_kspace_style.html because the GPU is faster at performing pairwise interactions, then this rule of thumb may give too large a binsize. -The {comm} and {comm/exchange} and {comm/forward} keywords determine +The {comm} and {comm/exchange} and {comm/forward} and {comm/reverse} keywords determine whether the host or device performs the packing and unpacking of data when communicating per-atom data between processors. "Exchange" communication happens only on timesteps that neighbor lists are rebuilt. The data is only for atoms that migrate to new processors. -"Forward" communication happens every timestep. The data is for atom +"Forward" communication happens every timestep. "Reverse" communication +happens every timestep if the {newton} option is on. The data is for atom coordinates and any other atom properties that needs to be updated for ghost atoms owned by each processor. The {comm} keyword is simply a short-cut to set the same value -for both the {comm/exchange} and {comm/forward} keywords. +for both the {comm/exchange} and {comm/forward} and {comm/reverse} keywords. The value options for all 3 keywords are {no} or {host} or {device}. A value of {no} means to use the standard non-KOKKOS method of diff --git a/doc/src/pair_airebo.txt b/doc/src/pair_airebo.txt index e66ecb637f..1aa017f278 100644 --- a/doc/src/pair_airebo.txt +++ b/doc/src/pair_airebo.txt @@ -7,10 +7,13 @@ :line pair_style airebo command :h3 +pair_style airebo/intel command :h3 pair_style airebo/omp command :h3 pair_style airebo/morse command :h3 +pair_style airebo/morse/intel command :h3 pair_style airebo/morse/omp command :h3 pair_style rebo command :h3 +pair_style rebo/intel command :h3 pair_style rebo/omp command :h3 [Syntax:] diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt new file mode 100644 index 0000000000..b6dc2e37b5 --- /dev/null +++ b/doc/src/pair_body_rounded_polygon.txt @@ -0,0 +1,19 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style body/rounded/polygon command :h3 + +[Description:] + +Note: This feature is not yet implemented. + +[Related commands:] + +"pair_style body"_pair_body.html + +[Default:] none diff --git a/doc/src/pair_born.txt b/doc/src/pair_born.txt index a3cc744a22..a016f77fa3 100644 --- a/doc/src/pair_born.txt +++ b/doc/src/pair_born.txt @@ -17,6 +17,7 @@ pair_style born/coul/long/omp command :h3 pair_style born/coul/msm command :h3 pair_style born/coul/msm/omp command :h3 pair_style born/coul/wolf command :h3 +pair_style born/coul/wolf/cs command :h3 pair_style born/coul/wolf/gpu command :h3 pair_style born/coul/wolf/omp command :h3 pair_style born/coul/dsf command :h3 @@ -36,7 +37,7 @@ args = list of arguments for a particular style :ul {born/coul/msm} args = cutoff (cutoff2) cutoff = global cutoff for non-Coulombic (and Coulombic if only 1 arg) (distance units) cutoff2 = global cutoff for Coulombic (optional) (distance units) - {born/coul/wolf} args = alpha cutoff (cutoff2) + {born/coul/wolf} or {born/coul/wolf/cs} args = alpha cutoff (cutoff2) alpha = damping parameter (inverse distance units) cutoff = global cutoff for non-Coulombic (and Coulombic if only 1 arg) (distance units) cutoff2 = global cutoff for Coulombic (optional) (distance units) @@ -65,6 +66,7 @@ pair_coeff 1 1 6.08 0.317 2.340 24.18 11.51 :pre pair_style born/coul/wolf 0.25 10.0 pair_style born/coul/wolf 0.25 10.0 9.0 +pair_style born/coul/wolf/cs 0.25 10.0 9.0 pair_coeff * * 6.08 0.317 2.340 24.18 11.51 pair_coeff 1 1 6.08 0.317 2.340 24.18 11.51 :pre @@ -106,8 +108,9 @@ damped shifted force model as in the "coul/dsf"_pair_coul.html style. Style {born/coul/long/cs} is identical to {born/coul/long} except that a term is added for the "core/shell model"_Section_howto.html#howto_25 to allow charges on core and shell particles to be separated by r = -0.0. The same correction is introduced for {born/coul/dsf/cs} style -which is identical to {born/coul/dsf}. +0.0. The same correction is introduced for the {born/coul/dsf/cs} +style which is identical to {born/coul/dsf}. And likewise for +{born/coul/wolf/cs} style which is identical to {born/coul/wolf}. Note that these potentials are related to the "Buckingham potential"_pair_buck.html. diff --git a/doc/src/pair_buck6d_coul_gauss.txt b/doc/src/pair_buck6d_coul_gauss.txt new file mode 100644 index 0000000000..879972772b --- /dev/null +++ b/doc/src/pair_buck6d_coul_gauss.txt @@ -0,0 +1,138 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style buck6d/coul/gauss/dsf :h3 +pair_style buck6d/coul/gauss/long :h3 + +[Syntax:] + +pair_style style args :pre + +style = {buck6d/coul/gauss/dsf} or {buck6d/coul/gauss/long} +args = list of arguments for a particular style :ul + {buck6d/coul/gauss/dsf} args = smooth cutoff (cutoff2) + smooth = smoothing onset within Buckingham cutoff (ratio) + cutoff = global cutoff for Buckingham (and Coulombic if only 1 arg) (distance units) + cutoff2 = global cutoff for Coulombic (optional) (distance units) + {buck6d/coul/gauss/long} args = smooth smooth2 cutoff (cutoff2) + smooth = smoothing onset within Buckingham cutoff (ratio) + smooth2 = smoothing onset within Coulombic cutoff (ratio) + cutoff = global cutoff for Buckingham (and Coulombic if only 1 arg) (distance units) + cutoff2 = global cutoff for Coulombic (optional) (distance units) :pre + +[Examples:] + +pair_style buck6d/coul/gauss/dsf 0.9000 12.0000 +pair_coeff 1 1 1030. 3.061 457.179 4.521 0.608 :pre + +pair_style buck6d/coul/gauss/long 0.9000 1.0000 12.0000 +pair_coeff 1 1 1030. 3.061 457.179 4.521 0.608 :pre + +[Description:] + +The {buck6d/coul/gauss} styles evaluate vdW and Coulomb +interactions following the MOF-FF force field after +"(Schmid)"_#Schmid. The vdW term of the {buck6d} styles +computes a dispersion damped Buckingham potential: + +:c,image(Eqs/pair_buck6d.jpg) + +where A and C are a force constant, kappa is an ionic-pair dependent +reciprocal length parameter, D is a dispersion correction parameter, +and the cutoff Rc truncates the interaction distance. +The first term in the potential corresponds to the Buckingham +repulsion term and the second term to the dispersion attraction with +a damping correction analog to the Grimme correction used in DFT. +The latter corrects for artifacts occurring at short distances which +become an issue for soft vdW potentials. + +The {buck6d} styles include a smoothing function which is invoked +according to the global smooting parameter within the specified +cutoff. Hereby a parameter of i.e. 0.9 invokes the smoothing +within 90% of the cutoff. No smoothing is applied at a value +of 1.0. For the {gauss/dsf} style this smoothing is only applicable +for the dispersion damped Buckingham potential. For the {gauss/long} +styles the smoothing function can also be invoked for the real +space coulomb interactions which enforce continous energies and +forces at the cutoff. + +Both styles {buck6d/coul/gauss/dsf} and {buck6d/coul/gauss/long} +evaluate a Coulomb potential using spherical Gaussian type charge +distributions which effectively dampen electrostatic ineractions +for high charges at close distances. The electrostatic potential +is thus evaluated as: + +:c,image(Eqs/pair_coul_gauss.jpg) + +where C is an energy-conversion constant, Qi and Qj are the +charges on the 2 atoms, epsilon is the dielectric constant which +can be set by the "dielectric"_dielectric.html command, alpha is +ion pair dependent damping parameter and erf() is the error-function. +The cutoff Rc truncates the interaction distance. + +The style {buck6d/coul/gauss/dsf} computes the Coulomb interaction +via the damped shifted force model described in "(Fennell)"_#Fennell +approximating an Ewald sum similar to the "pair coul/dsf"_pair_coul.html +styles. In {buck6d/coul/gauss/long} an additional damping factor is +applied to the Coulombic term so it can be used in conjunction with the +"kspace_style"_kspace_style.html command and its {ewald} or {pppm} +options. The Coulombic cutoff in this case separates the real and +reciprocal space evaluation of the Ewald sum. + +If one cutoff is specified it is used for both the vdW and Coulomb +terms. If two cutoffs are specified, the first is used as the cutoff +for the vdW terms, and the second is the cutoff for the Coulombic term. + +The following coefficients must be defined for each pair of atoms +types via the "pair_coeff"_pair_coeff.html command as in the examples +above, or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands: + +A (energy units) +rho (distance^-1 units) +C (energy-distance^6 units) +D (distance^14 units) +alpha (distance^-1 units) +cutoff (distance units) :ul + +The second coefficient, rho, must be greater than zero. The latter +coefficient is optional. If not specified, the global vdW cutoff +is used. + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +These pair styles do not support mixing. Thus, coefficients for all +I,J pairs must be specified explicitly. + +These styles do not support the "pair_modify"_pair_modify.html shift +option for the energy. Instead the smoothing function should be applied +by setting the global smoothing parameter to a value < 1.0. + +These styles write their information to "binary restart +files"_restart.html, so pair_style and pair_coeff commands do not need +to be specified in an input script that reads a restart file. + +[Restrictions:] + +These styles are part of the USER-MOFFF package. They are only enabled +if LAMMPS was built with that package. See the +"Making LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"pair_coeff"_pair_coeff.html + +[Default:] none + +:link(Schmid) +[(Schmid)] S. Bureekaew, S. Amirjalayer, M. Tafipolsky, C. Spickermann, T.K. Roy and R. Schmid, Phys. Status Solidi B, 6, 1128 (2013). +:link(Fennell) +[(Fennell)] C. J. Fennell, J. D. Gezelter, J Chem Phys, 124, 234104 (2006). diff --git a/doc/src/pair_charmm.txt b/doc/src/pair_charmm.txt index ef4ef41c95..75a8e4bff9 100644 --- a/doc/src/pair_charmm.txt +++ b/doc/src/pair_charmm.txt @@ -7,6 +7,7 @@ :line pair_style lj/charmm/coul/charmm command :h3 +pair_style lj/charmm/coul/charmm/intel command :h3 pair_style lj/charmm/coul/charmm/omp command :h3 pair_style lj/charmm/coul/charmm/implicit command :h3 pair_style lj/charmm/coul/charmm/implicit/omp command :h3 diff --git a/doc/src/pair_coul.txt b/doc/src/pair_coul.txt index 29e5beed3c..4cca5ee0d7 100644 --- a/doc/src/pair_coul.txt +++ b/doc/src/pair_coul.txt @@ -29,6 +29,7 @@ pair_style coul/streitz command :h3 pair_style coul/wolf command :h3 pair_style coul/wolf/kk command :h3 pair_style coul/wolf/omp command :h3 +pair_style coul/wolf/cs command :h3 pair_style tip4p/cut command :h3 pair_style tip4p/long command :h3 pair_style tip4p/cut/omp command :h3 @@ -43,6 +44,7 @@ pair_style coul/long cutoff pair_style coul/long/cs cutoff pair_style coul/long/gpu cutoff pair_style coul/wolf alpha cutoff +pair_style coul/wolf/cs alpha cutoff pair_style coul/streitz cutoff keyword alpha pair_style tip4p/cut otype htype btype atype qdist cutoff pair_style tip4p/long otype htype btype atype qdist cutoff :pre @@ -72,6 +74,7 @@ pair_style coul/msm 10.0 pair_coeff * * :pre pair_style coul/wolf 0.2 9.0 +pair_style coul/wolf/cs 0.2 9.0 pair_coeff * * :pre pair_style coul/streitz 12.0 ewald @@ -202,7 +205,9 @@ interactions outside that distance are computed in reciprocal space. Style {coul/long/cs} is identical to {coul/long} except that a term is added for the "core/shell model"_Section_howto.html#howto_25 to allow -charges on core and shell particles to be separated by r = 0.0. +charges on core and shell particles to be separated by r = 0.0. The +same correction is introduced for the {coul/wolf/cs} style which is +identical to {coul/wolf}. Styles {tip4p/cut} and {tip4p/long} implement the coulomb part of the TIP4P water model of "(Jorgensen)"_#Jorgensen3, which introduces diff --git a/doc/src/pair_cs.txt b/doc/src/pair_cs.txt index 64dfc20d47..c1084c6087 100644 --- a/doc/src/pair_cs.txt +++ b/doc/src/pair_cs.txt @@ -9,12 +9,13 @@ pair_style born/coul/long/cs command :h3 pair_style buck/coul/long/cs command :h3 pair_style born/coul/dsf/cs command :h3 +pair_style born/coul/wolf/cs command :h3 [Syntax:] pair_style style args :pre -style = {born/coul/long/cs} or {buck/coul/long/cs} or {born/coul/dsf/cs} +style = {born/coul/long/cs} or {buck/coul/long/cs} or {born/coul/dsf/cs} or {born/coul/wolf/cs} args = list of arguments for a particular style :ul {born/coul/long/cs} args = cutoff (cutoff2) cutoff = global cutoff for non-Coulombic (and Coulombic if only 1 arg) (distance units) @@ -26,6 +27,10 @@ args = list of arguments for a particular style :ul alpha = damping parameter (inverse distance units) cutoff = global cutoff for non-Coulombic (and Coulombic if only 1 arg) (distance units) cutoff2 = global cutoff for Coulombic (distance units) :pre + {born/coul/wolf/cs} args = alpha cutoff (cutoff2) + alpha = damping parameter (inverse distance units) + cutoff = global cutoff for Buckingham (and Coulombic if only 1 arg) (distance units) + cutoff2 = global cutoff for Coulombic (optional) (distance units) [Examples:] @@ -41,6 +46,10 @@ pair_style born/coul/dsf/cs 0.1 10.0 12.0 pair_coeff * * 0.0 1.00 0.00 0.00 0.00 pair_coeff 1 1 480.0 0.25 0.00 1.05 0.50 :pre +pair_style born/coul/wolf/cs 0.25 10.0 12.0 +pair_coeff * * 0.0 1.00 0.00 0.00 0.00 +pair_coeff 1 1 480.0 0.25 0.00 1.05 0.50 :pre + [Description:] These pair styles are designed to be used with the adiabatic @@ -73,13 +82,21 @@ the core and shell, epsilon is the dielectric constant and r_min is the minimal distance. The pair style {born/coul/dsf/cs} is identical to the -"pair_style born/coul/dsf"_pair_born.html style, which uses the +"pair_style born/coul/dsf"_pair_born.html style, which uses the damped shifted force model as in "coul/dsf"_pair_coul.html to compute the Coulomb contribution. This approach does not require a long-range solver, thus the only correction is the addition of a minimal distance to avoid the possible r = 0.0 case for a core/shell pair. +The pair style {born/coul/wolf/cs} is identical to the +"pair_style born/coul/wolf"_pair_born.html style, which uses +the Wolf summation as in "coul/wolf"_pair_coul.html to compute +the Coulomb contribution. This approach does not require +a long-range solver, thus the only correction is the addition of a +minimal distance to avoid the possible r = 0.0 case for a +core/shell pair. + [Restrictions:] These pair styles are part of the CORESHELL package. They are only diff --git a/doc/src/pair_dpd.txt b/doc/src/pair_dpd.txt index 9dd204ad2d..9e29e93430 100644 --- a/doc/src/pair_dpd.txt +++ b/doc/src/pair_dpd.txt @@ -8,6 +8,7 @@ pair_style dpd command :h3 pair_style dpd/gpu command :h3 +pair_style dpd/intel command :h3 pair_style dpd/omp command :h3 pair_style dpd/tstat command :h3 pair_style dpd/tstat/gpu command :h3 @@ -36,7 +37,7 @@ pair_coeff 1 1 1.0 1.0 :pre [Description:] Style {dpd} computes a force field for dissipative particle dynamics -(DPD) following the exposition in "(Groot)"_#Groot. +(DPD) following the exposition in "(Groot)"_#Groot1. Style {dpd/tstat} invokes a DPD thermostat on pairwise interactions, which is equivalent to the non-conservative portion of the DPD force @@ -196,7 +197,7 @@ langevin"_fix_langevin.html, "pair_style srp"_pair_srp.html :line -:link(Groot) +:link(Groot1) [(Groot)] Groot and Warren, J Chem Phys, 107, 4423-35 (1997). :link(Afshar) diff --git a/doc/src/pair_dpd_fdt.txt b/doc/src/pair_dpd_fdt.txt index b75e7c323c..867f3f2315 100644 --- a/doc/src/pair_dpd_fdt.txt +++ b/doc/src/pair_dpd_fdt.txt @@ -8,6 +8,7 @@ pair_style dpd/fdt command :h3 pair_style dpd/fdt/energy command :h3 +pair_style dpd/fdt/energy/kk command :h3 [Syntax:] @@ -125,6 +126,29 @@ significantly larger timesteps to be taken. :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] These commands are part of the USER-DPD package. They are only diff --git a/doc/src/pair_eam.txt b/doc/src/pair_eam.txt index ce8495affd..03e77f53ab 100644 --- a/doc/src/pair_eam.txt +++ b/doc/src/pair_eam.txt @@ -14,6 +14,7 @@ pair_style eam/omp command :h3 pair_style eam/opt command :h3 pair_style eam/alloy command :h3 pair_style eam/alloy/gpu command :h3 +pair_style eam/alloy/intel command :h3 pair_style eam/alloy/kk command :h3 pair_style eam/alloy/omp command :h3 pair_style eam/alloy/opt command :h3 @@ -21,6 +22,7 @@ pair_style eam/cd command :h3 pair_style eam/cd/omp command :h3 pair_style eam/fs command :h3 pair_style eam/fs/gpu command :h3 +pair_style eam/fs/intel command :h3 pair_style eam/fs/kk command :h3 pair_style eam/fs/omp command :h3 pair_style eam/fs/opt command :h3 @@ -292,7 +294,7 @@ distribution have a ".cdeam" suffix. Style {eam/fs} computes pairwise interactions for metals and metal alloys using a generalized form of EAM potentials due to Finnis and -Sinclair "(Finnis)"_#Finnis. The total energy Ei of an atom I is +Sinclair "(Finnis)"_#Finnis1. The total energy Ei of an atom I is given by :c,image(Eqs/pair_eam_fs.jpg) @@ -440,7 +442,7 @@ of Physics: Condensed Matter, 16, S2629 (2004). [(Daw)] Daw, Baskes, Phys Rev Lett, 50, 1285 (1983). Daw, Baskes, Phys Rev B, 29, 6443 (1984). -:link(Finnis) +:link(Finnis1) [(Finnis)] Finnis, Sinclair, Philosophical Magazine A, 50, 45 (1984). :link(Stukowski) diff --git a/doc/src/pair_exp6_rx.txt b/doc/src/pair_exp6_rx.txt index cbc17d357d..7eafa23543 100644 --- a/doc/src/pair_exp6_rx.txt +++ b/doc/src/pair_exp6_rx.txt @@ -7,6 +7,7 @@ :line pair_style exp6/rx command :h3 +pair_style exp6/rx/kk command :h3 [Syntax:] @@ -147,6 +148,31 @@ This style does not support the pair_modify tail option for adding long-range tail corrections to energy and pressure for the A,C terms in the pair interaction. +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/pair_extep.txt b/doc/src/pair_extep.txt new file mode 100644 index 0000000000..9a784e2501 --- /dev/null +++ b/doc/src/pair_extep.txt @@ -0,0 +1,40 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style extep command :h3 + +[Syntax:] + +pair_style extep :pre + +[Examples:] + +pair_style extep +pair_coeff * * BN.extep B N :pre + +[Description:] + +Style {extep} computes the Extended Tersoff Potential (ExTeP) +interactions as described in "(Los2017)"_#Los2017. + +:line + +[Restrictions:] none + +[Related commands:] + +"pair_tersoff" pair_tersoff.html + +[Default:] none + +:line + +:link(Los2017) +[(Los2017)] J. H. Los et al. "Extended Tersoff potential for boron nitride: +Energetics and elastic properties of pristine and defective h-BN", +Phys. Rev. B 96 (184108), 2017. diff --git a/doc/src/pair_hybrid.txt b/doc/src/pair_hybrid.txt index fc1824cf62..d37dedc709 100644 --- a/doc/src/pair_hybrid.txt +++ b/doc/src/pair_hybrid.txt @@ -10,6 +10,7 @@ pair_style hybrid command :h3 pair_style hybrid/omp command :h3 pair_style hybrid/overlay command :h3 pair_style hybrid/overlay/omp command :h3 +pair_style hybrid/overlay/kk command :h3 [Syntax:] diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index 5a623e5ece..c5d910e27c 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -27,13 +27,34 @@ pair_coeff * * Ar Ar :pre [Description:] This pair style is a wrapper on the "Knowledge Base for Interatomic -Models (KIM)"_https://openkim.org repository of interatomic potentials, -so that they can be used by LAMMPS scripts. +Models (OpenKIM)"_https://openkim.org repository of interatomic +potentials, so that they can be used by LAMMPS scripts. -In KIM lingo, a potential is a "model" and a model contains both the -analytic formulas that define the potential as well as the parameters -needed to run it for one or more materials, including coefficients and -cutoffs. +Note that in LAMMPS lingo, a KIM model driver is a pair style +(e.g. EAM or Tersoff). A KIM model is a pair style for a particular +element or alloy and set of parameters, e.g. EAM for Cu with a +specific EAM potential file. + +See the current list of "KIM model +drivers"_https://openkim.org/kim-items/model-drivers/alphabetical. + +See the current list of all "KIM +models"_https://openkim.org/kim-items/models/by-model-drivers + +See the list of "example KIM models"_https://openkim.org/kim-api which +are included in the KIM library by default, in the "What is in the KIM +API source package?" section. + +To use this pair style, you must first download and install the KIM +API library from the "OpenKIM website"_https://openkim.org. The "KIM +section of Section packages"_Section_packages.html#KIM has +instructions on how to do this with a simple make command, when +building LAMMPS. + +See the examples/kim dir for an input script that uses a KIM model +(potential) for Lennard-Jones. + +:line The argument {virialmode} determines how the global virial is calculated. If {KIMvirial} is specified, the KIM model performs the diff --git a/doc/src/pair_lj.txt b/doc/src/pair_lj.txt index 058d54fb59..e297d479bc 100644 --- a/doc/src/pair_lj.txt +++ b/doc/src/pair_lj.txt @@ -32,6 +32,8 @@ pair_style lj/cut/coul/long/omp command :h3 pair_style lj/cut/coul/msm command :h3 pair_style lj/cut/coul/msm/gpu command :h3 pair_style lj/cut/coul/msm/omp command :h3 +pair_style lj/cut/coul/wolf command :h3 +pair_style lj/cut/coul/wolf/omp command :h3 pair_style lj/cut/tip4p/cut command :h3 pair_style lj/cut/tip4p/cut/omp command :h3 pair_style lj/cut/tip4p/long command :h3 @@ -63,6 +65,10 @@ args = list of arguments for a particular style :ul {lj/cut/coul/msm} args = cutoff (cutoff2) cutoff = global cutoff for LJ (and Coulombic if only 1 arg) (distance units) cutoff2 = global cutoff for Coulombic (optional) (distance units) + {lj/cut/coul/wolf} args = alpha cutoff (cutoff2) + alpha = damping parameter (inverse distance units) + cutoff = global cutoff for LJ (and Coulombic if only 2 arg) (distance units) + cutoff2 = global cutoff for Coulombic (optional) (distance units) {lj/cut/tip4p/cut} args = otype htype btype atype qdist cutoff (cutoff2) otype,htype = atom types for TIP4P O and H btype,atype = bond and angle types for TIP4P waters @@ -115,6 +121,10 @@ pair_style lj/cut/tip4p/cut 1 2 7 8 0.15 12.0 10.0 pair_coeff * * 100.0 3.0 pair_coeff 1 1 100.0 3.5 9.0 :pre +pair_style lj/cut/coul/wolf 0.2 5. 10.0 +pair_coeff * * 1.0 1.0 +pair_coeff 1 1 1.0 1.0 2.5 :pre + pair_style lj/cut/tip4p/long 1 2 7 8 0.15 12.0 pair_style lj/cut/tip4p/long 1 2 7 8 0.15 12.0 10.0 pair_coeff * * 100.0 3.0 @@ -179,6 +189,24 @@ that a term is added for the "core/shell model"_Section_howto.html#howto_25 to allow charges on core and shell particles to be separated by r = 0.0. +Style {coul/wolf} adds a Coulombic pairwise interaction via the Wolf +summation method, described in "Wolf"_#Wolf1, given by: + +:c,image(Eqs/pair_coul_wolf.jpg) + +where {alpha} is the damping parameter, and erfc() is the +complementary error-function terms. This potential +is essentially a short-range, spherically-truncated, +charge-neutralized, shifted, pairwise {1/r} summation. With a +manipulation of adding and subtracting a self term (for i = j) to the +first and second term on the right-hand-side, respectively, and a +small enough {alpha} damping parameter, the second term shrinks and +the potential becomes a rapidly-converging real-space summation. With +a long enough cutoff and small enough alpha parameter, the energy and +forces calculated by the Wolf summation method approach those of the +Ewald sum. So it is a means of getting effective long-range +interactions with a short-range potential. + Styles {lj/cut/tip4p/cut} and {lj/cut/tip4p/long} implement the TIP4P water model of "(Jorgensen)"_#Jorgensen2, which introduces a massless site located a short distance away from the oxygen atom along the diff --git a/doc/src/pair_meam.txt b/doc/src/pair_meam.txt index 62fa59f406..c7449428bd 100644 --- a/doc/src/pair_meam.txt +++ b/doc/src/pair_meam.txt @@ -77,7 +77,7 @@ See the "pair_coeff"_pair_coeff.html doc page for alternate ways to specify the path for the potential files. As an example, the potentials/library.meam file has generic MEAM -settings for a variety of elements. The potentials/sic.meam file has +settings for a variety of elements. The potentials/SiC.meam file has specific parameter settings for a Si and C alloy system. If your LAMMPS simulation has 4 atoms types and you want the 1st 3 to be Si, and the 4th to be C, you would use the following pair_coeff command: @@ -105,6 +105,15 @@ This can be used when a {meam} potential is used as part of the {hybrid} pair style. The NULL values are placeholders for atom types that will be used with other potentials. +NOTE: If the 2nd filename is NULL, the element names between the two +filenames can appear in any order, e.g. "Si C" or "C Si" in the +example above. However, if the 2nd filename is not NULL (as in the +example above), it contains settings that are Fortran-indexed for the +elements that preceed it. Thus you need to insure you list the +elements between the filenames in an order consistent with how the +values in the 2nd filename are indexed. See details below on the +syntax for settings in the 2nd file. + The MEAM library file provided with LAMMPS has the name potentials/library.meam. It is the "meamf" file used by other MD codes. Aside from blank and comment lines (start with #) which can @@ -164,7 +173,15 @@ keyword(I) = value keyword(I,J) = value keyword(I,J,K) = value :pre -The recognized keywords are as follows: +The indices I, J, K correspond to the elements selected from the +MEAM library file numbered in the order of how those elements were +selected starting from 1. Thus for the example given below + +pair_coeff * * library.meam Si C sic.meam Si Si Si C :pre + +an index of 1 would refer to Si and an index of 2 to C. + +The recognized keywords for the parameter file are as follows: Ec, alpha, rho0, delta, lattce, attrac, repuls, nn2, Cmin, Cmax, rc, delr, augt1, gsmooth_factor, re diff --git a/doc/src/pair_meso.txt b/doc/src/pair_meso.txt new file mode 100644 index 0000000000..bcdf717d68 --- /dev/null +++ b/doc/src/pair_meso.txt @@ -0,0 +1,277 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style edpd command :h3 +pair_style mdpd command :h3 +pair_style mdpd/rhosum command :h3 +pair_style tdpd command :h3 + +[Syntax:] + +pair_style style args :pre + +style = {edpd} or {mdpd} or {mdpd/rhosum} or {tdpd} :ulb,l +args = list of arguments for a particular style :l + {edpd} args = cutoff seed + cutoff = global cutoff for eDPD interactions (distance units) + seed = random # seed (integer) (if <= 0, eDPD will use current time as the seed) + {mdpd} args = T cutoff seed + T = temperature (temperature units) + cutoff = global cutoff for mDPD interactions (distance units) + seed = random # seed (integer) (if <= 0, mDPD will use current time as the seed) + {mdpd/rhosum} args = + {tdpd} args = T cutoff seed + T = temperature (temperature units) + cutoff = global cutoff for tDPD interactions (distance units) + seed = random # seed (integer) (if <= 0, tDPD will use current time as the seed) :pre +:ule + +[Examples:] + +pair_style edpd 1.58 9872598 +pair_coeff * * 18.75 4.5 0.41 1.58 1.42E-5 2.0 1.58 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.42E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.42E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 kappa -0.44 -3.21 5.04 0.00 :pre + +pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 65689 +pair_coeff 1 1 mdpd/rhosum 0.75 +pair_coeff 1 1 mdpd -40.0 25.0 18.0 1.0 0.75 :pre + +pair_style tdpd 1.0 1.58 935662 +pair_coeff * * 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 :pre + +[Description:] + +The {edpd} style computes the pairwise interactions and heat fluxes +for eDPD particles following the formulations in +"(Li2014_JCP)"_#Li2014_JCP and "Li2015_CC"_#Li2015_CC. The time +evolution of an eDPD particle is governed by the conservation of +momentum and energy given by + +:c,image(Eqs/pair_edpd_gov.jpg) + +where the three components of Fi +including the conservative force FijC, dissipative force FijD and random force FijR are expressed as + +:c,image(Eqs/pair_edpd_force.jpg) + +in which the exponent of the weighting function s can be defined as a temperature-dependent +variable. The heat flux between particles accounting for the +collisional heat flux qC, viscous +heat flux qV, and random heat flux +qR are given by + +:c,image(Eqs/pair_edpd_heat.jpg) + +where the mesoscopic heat friction κ is given by + +:c,image(Eqs/pair_edpd_kappa.jpg) + +with υ being the kinematic +viscosity. For more details, see Eq.(15) in "(Li2014_JCP)"_#Li2014_JCP. + +The following coefficients must be defined in eDPD system for each +pair of atom types via the "pair_coeff"_pair_coeff.html command as in +the examples above. + +A (force units) +gamma (force/velocity units) +power_f (positive real) +cutoff (distance units) +kappa (thermal conductivity units) +power_T (positive real) +cutoff_T (distance units) +optional keyword = power or kappa :ul + +The keyword {power} or {kappa} is optional. Both "power" and "kappa" +require 4 parameters c1, c2, +c4, c4 showing the temperature dependence +of the exponent
    s(T) = +power_f*(1+c1*(T-1)+c2*(T-1)2 ++c3*(T-1)3+c4*(T-1)4)
    +and of the mesoscopic heat friction
    +sT(T) = +kappa*(1+c1*(T-1)+c2*(T-1)2 ++c3*(T-1)3+c4*(T-1)4)
    +If the keyword {power} or {kappa} is not specified, the eDPD system +will use constant power_f and kappa, which is independent to +temperature changes. + +:line + +The {mdpd/rhosum} style computes the local particle mass density rho +for mDPD particles by kernel function interpolation. + +The following coefficients must be defined for each pair of atom types +via the "pair_coeff"_pair_coeff.html command as in the examples above. + +cutoff (distance units) :ul + +:line + +The {mdpd} style computes the many-body interactions between mDPD +particles following the formulations in +"(Li2013_POF)"_#Li2013_POF. The dissipative and random forces are in +the form same as the classical DPD, but the conservative force is +local density dependent, which are given by + +:c,image(Eqs/pair_mdpd_force.jpg) + +where the first term in FC with a +negative coefficient A < 0 stands for an attractive force within an +interaction range rc, and the second +term with B > 0 is the density-dependent repulsive force within an +interaction range rd. + +The following coefficients must be defined for each pair of atom types via the +"pair_coeff"_pair_coeff.html command as in the examples above. + +A (force units) +B (force units) +gamma (force/velocity units) +cutoff_c (distance units) +cutoff_d (distance units) :ul + +:line + +The {tdpd} style computes the pairwise interactions and chemical +concentration fluxes for tDPD particles following the formulations in +"(Li2015_JCP)"_#Li2015_JCP. The time evolution of a tDPD particle is +governed by the conservation of momentum and concentration given by + +:c,image(Eqs/pair_tdpd_gov.jpg) + +where the three components of Fi +including the conservative force FijC, dissipative force FijD and random force FijR are expressed as + +:c,image(Eqs/pair_tdpd_force.jpg) + +The concentration flux between two tDPD particles includes the Fickian +flux QijD and random flux +QijR, which are given by + +:c,image(Eqs/pair_tdpd_flux.jpg) + +where the parameters kappa and epsilon determine the strength of the +Fickian and random fluxes. ms +is the mass of a single solute molecule. In general, ms is much smaller than the mass of +a tDPD particle m. For more details, see +"(Li2015_JCP)"_#Li2015_JCP. + +The following coefficients must be defined for each pair of atom types via the +"pair_coeff"_pair_coeff.html command as in the examples above. + +A (force units) +gamma (force/velocity units) +power_f (positive real) +cutoff (distance units) +cutoff_CC (distance units) +kappa_i (diffusivity units) +epsilon_i (diffusivity units) +power_cc_i (positive real) :ul + +The last 3 values must be repeated Nspecies times, so that values for +each of the Nspecies chemical species are specified, as indicated by +the "I" suffix. In the first pair_coeff example above for pair_style +tdpd, Nspecies = 1. In the second example, Nspecies = 2, so 3 +additional coeffs are specified (for species 2). + +:line + +[Example scripts] + +There are example scripts for using all these pair styles in +examples/USER/meso. The example for an eDPD simulation models heat +conduction with source terms analog of periodic Poiseuille flow +problem. The setup follows Fig.12 in "(Li2014_JCP)"_#Li2014_JCP. The +output of the short eDPD simulation (about 2 minutes on a single core) +gives a temperature and density profiles as + +:c,image(JPG/examples_edpd.jpg) + +The example for a mDPD simulation models the oscillations of a liquid +droplet started from a liquid film. The mDPD parameters are adopted +from "(Li2013_POF)"_#Li2013_POF. The short mDPD run (about 2 minutes +on a single core) generates a particle trajectory which can +be visualized as follows. + +:c,image(JPG/examples_mdpd_first.jpg,JPG/examples_mdpd.gif) +:c,image(JPG/examples_mdpd_last.jpg) + +The first image is the initial state of the simulation. If you +click it a GIF movie should play in your browser. The second image +is the final state of the simulation. + +The example for a tDPD simulation computes the effective diffusion +coefficient of a tDPD system using a method analogous to the periodic +Poiseuille flow. The tDPD system is specified with two chemical +species, and the setup follows Fig.1 in +"(Li2015_JCP)"_#Li2015_JCP. The output of the short tDPD simulation +(about one and a half minutes on a single core) gives the +concentration profiles of the two chemical species as + +:c,image(JPG/examples_tdpd.jpg) + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +The styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} do not support +mixing. Thus, coefficients for all I,J pairs must be specified explicitly. + +The styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} do not support +the "pair_modify"_pair_modify.html shift, table, and tail options. + +The styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} do not write +information to "binary restart files"_restart.html. Thus, you need +to re-specify the pair_style and pair_coeff commands in an input script +that reads a restart file. + +[Restrictions:] + +The pair styles {edpd}, {mdpd}, {mdpd/rhosum} and {tdpd} are part of +the USER-MESO package. It is only enabled if LAMMPS was built with +that package. See the "Making LAMMPS"_Section_start.html#start_3 +section for more info. + +[Related commands:] + +"pair_coeff"_pair_coeff.html, "fix mvv/dpd"_fix_mvv_dpd.html, +"fix mvv/edpd"_fix_mvv_dpd.html, "fix mvv/tdpd"_fix_mvv_dpd.html, +"fix edpd/source"_fix_dpd_source.html, "fix tdpd/source"_fix_dpd_source.html, +"compute edpd/temp/atom"_compute_edpd_temp_atom.html, +"compute tdpd/cc/atom"_compute_tdpd_cc_atom.html + +[Default:] none + +:line + +:link(Li2014_JCP) +[(Li2014_JCP)] Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, +265: 113-127 (2014). DOI: 10.1016/j.jcp.2014.02.003. + +:link(Li2015_CC) +[(Li2015_CC)] Li, Tang, Li, Karniadakis, Chem Commun, 51: 11038-11040 +(2015). DOI: 10.1039/C5CC01684C. + +:link(Li2013_POF) +[(Li2013_POF)] Li, Hu, Wang, Ma, Zhou, Phys Fluids, 25: 072103 (2013). +DOI: 10.1063/1.4812366. + +:link(Li2015_JCP) +[(Li2015_JCP)] Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, +143: 014101 (2015). DOI: 10.1063/1.4923254. diff --git a/doc/src/pair_multi_lucy_rx.txt b/doc/src/pair_multi_lucy_rx.txt index 77ed223e2a..57abcf4a4c 100644 --- a/doc/src/pair_multi_lucy_rx.txt +++ b/doc/src/pair_multi_lucy_rx.txt @@ -7,6 +7,7 @@ :line pair_style multi/lucy/rx command :h3 +pair_style multi/lucy/rx/kk command :h3 [Syntax:] @@ -200,6 +201,29 @@ This pair style can only be used via the {pair} keyword of the :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/pair_oxdna.txt b/doc/src/pair_oxdna.txt index d9734f122d..26a205bcf9 100644 --- a/doc/src/pair_oxdna.txt +++ b/doc/src/pair_oxdna.txt @@ -20,20 +20,24 @@ pair_coeff * * style2 args :pre style1 = {hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk} :ul -style2 = {oxdna/stk} -args = list of arguments for these two particular styles :ul +style2 = {oxdna/excv} or {oxdna/stk} or {oxdna/hbond} or {oxdna/xstk} or {oxdna/coaxstk} +args = list of arguments for these particular styles :ul - {oxdna2/stk} args = T 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 - T = temperature (oxDNA units, 0.1 = 300 K) :pre + {oxdna/stk} args = seq T 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 + seq = seqav (for average sequence stacking strength) or seqdep (for sequence-dependent stacking strength) + T = temperature (oxDNA units, 0.1 = 300 K) + {oxdna/hbond} args = seq eps 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 + seq = seqav (for average sequence base-pairing strength) or seqdep (for sequence-dependent base-pairing strength) + eps = 1.077 (between base pairs A-T and C-G) or 0 (all other pairs) :pre [Examples:] pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqdep 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqdep 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqdep 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqdep 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 :pre @@ -44,10 +48,11 @@ for coarse-grained modelling of DNA. The effective interaction between the nucle excluded volume interaction {oxdna/excv}, the stacking {oxdna/stk}, cross-stacking {oxdna/xstk} and coaxial stacking interaction {oxdna/coaxstk} as well as the hydrogen-bonding interaction {oxdna/hbond} between complementary pairs of nucleotides on -opposite strands. +opposite strands. Average sequence or sequence-dependent stacking and base-pairing strengths +are supported "(Sulc)"_#Sulc1. -The exact functional form of the pair styles is rather complex, which manifests itself in the 144 coefficients -in the above example. The individual potentials consist of products of modulation factors, +The exact functional form of the pair styles is rather complex. +The individual potentials consist of products of modulation factors, which themselves are constructed from a number of more basic potentials (Morse, Lennard-Jones, harmonic angle and distance) as well as quadratic smoothing and modulation terms. We refer to "(Ouldridge-DPhil)"_#Ouldridge-DPhil1 and "(Ouldridge)"_#Ouldridge1 @@ -55,9 +60,10 @@ for a detailed description of the oxDNA force field. NOTE: These pair styles have to be used together with the related oxDNA bond style {oxdna/fene} for the connectivity of the phosphate backbone (see also documentation of -"bond_style oxdna/fene"_bond_oxdna.html). With one exception the coefficients +"bond_style oxdna/fene"_bond_oxdna.html). Most of the coefficients in the above example have to be kept fixed and cannot be changed without reparametrizing the entire model. -The exception is the first coefficient after {oxdna/stk} (T=0.1 in the above example). +Exceptions are the first and second coefficient after {oxdna/stk} (seq=seqdep and T=0.1 in the above example) +and the first coefficient after {oxdna/hbond} (seq=seqdep in the above example). When using a Langevin thermostat, e.g. through "fix langevin"_fix_langevin.html or "fix nve/dotc/langevin"_fix_nve_dotc_langevin.html the temperature coefficients have to be matched to the one used in the fix. @@ -86,7 +92,11 @@ LAMMPS"_Section_start.html#start_3 section for more info on packages. :line +:link(Sulc1) +[(Sulc)] P. Sulc, F. Romano, T.E. Ouldridge, L. Rovigatti, J.P.K. Doye, A.A. Louis, J. Chem. Phys. 137, 135101 (2012). + :link(Ouldridge-DPhil1) [(Ouldrigde-DPhil)] T.E. Ouldridge, Coarse-grained modelling of DNA and DNA self-assembly, DPhil. University of Oxford (2011). + :link(Ouldridge1) [(Ouldridge)] T.E. Ouldridge, A.A. Louis, J.P.K. Doye, J. Chem. Phys. 134, 085101 (2011). diff --git a/doc/src/pair_oxdna2.txt b/doc/src/pair_oxdna2.txt index 1728a0bc7b..2408c02d10 100644 --- a/doc/src/pair_oxdna2.txt +++ b/doc/src/pair_oxdna2.txt @@ -21,11 +21,15 @@ pair_coeff * * style2 args :pre style1 = {hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh} :ul -style2 = {oxdna2/stk} or {oxdna2/dh} -args = list of arguments for these two particular styles :ul +style2 = {oxdna2/excv} or {oxdna2/stk} or {oxdna2/hbond} or {oxdna2/xstk} or {oxdna2/coaxstk} or {oxdna2/dh} +args = list of arguments for these particular styles :ul - {oxdna2/stk} args = T 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 + {oxdna2/stk} args = seq T 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 + seq = seqav (for average sequence stacking strength) or seqdep (for sequence-dependent stacking strength) T = temperature (oxDNA units, 0.1 = 300 K) + {oxdna/hbond} args = seq eps 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 + seq = seqav (for average sequence base-pairing strength) or seqdep (for sequence-dependent base-pairing strength) + eps = 1.0678 (between base pairs A-T and C-G) or 0 (all other pairs) {oxdna2/dh} args = T rhos qeff T = temperature (oxDNA units, 0.1 = 300 K) rhos = salt concentration (mole per litre) @@ -35,10 +39,10 @@ args = list of arguments for these two particular styles :ul pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqdep 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqdep 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqdep 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqdep 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 :pre @@ -50,7 +54,8 @@ for coarse-grained modelling of DNA. The effective interaction between the nucle excluded volume interaction {oxdna2/excv}, the stacking {oxdna2/stk}, cross-stacking {oxdna2/xstk} and coaxial stacking interaction {oxdna2/coaxstk}, electrostatic Debye-Hueckel interaction {oxdna2/dh} as well as the hydrogen-bonding interaction {oxdna2/hbond} between complementary pairs of nucleotides on -opposite strands. +opposite strands. Average sequence or sequence-dependent stacking and base-pairing strengths +are supported "(Sulc)"_#Sulc2. The exact functional form of the pair styles is rather complex. The individual potentials consist of products of modulation factors, @@ -61,9 +66,10 @@ and "(Ouldridge)"_#Ouldridge2 for a detailed description of the oxDNA2 force fi NOTE: These pair styles have to be used together with the related oxDNA2 bond style {oxdna2/fene} for the connectivity of the phosphate backbone (see also documentation of -"bond_style oxdna2/fene"_bond_oxdna.html). Almost all coefficients +"bond_style oxdna2/fene"_bond_oxdna.html). Most of the coefficients in the above example have to be kept fixed and cannot be changed without reparametrizing the entire model. -Exceptions are the first coefficient after {oxdna2/stk} (T=0.1 in the above example) and the coefficients +Exceptions are the first and the second coefficient after {oxdna2/stk} (seq=seqdep and T=0.1 in the above example), +the first coefficient after {oxdna/hbond} (seq=seqdep in the above example) and the three coefficients after {oxdna2/dh} (T=0.1, rhos=1.0, qeff=0.815 in the above example). When using a Langevin thermostat e.g. through "fix langevin"_fix_langevin.html or "fix nve/dotc/langevin"_fix_nve_dotc_langevin.html the temperature coefficients have to be matched to the one used in the fix. @@ -92,6 +98,9 @@ LAMMPS"_Section_start.html#start_3 section for more info on packages. :line +:link(Sulc2) +[(Sulc)] P. Sulc, F. Romano, T.E. Ouldridge, L. Rovigatti, J.P.K. Doye, A.A. Louis, J. Chem. Phys. 137, 135101 (2012). + :link(Snodin) [(Snodin)] B.E. Snodin, F. Randisi, M. Mosayebi, et al., J. Chem. Phys. 142, 234901 (2015). diff --git a/doc/src/pair_smd_hertz.txt b/doc/src/pair_smd_hertz.txt index 2a70c598ce..eeaa3387a4 100644 --- a/doc/src/pair_smd_hertz.txt +++ b/doc/src/pair_smd_hertz.txt @@ -28,7 +28,7 @@ The parameter has units of pressure and should equal roughly of the Young's modulus (or bulk modulus in the case of fluids) of the material model associated with the SPH particles. The parameter {scale_factor} can be used to scale the particles' contact radii. This can be useful to control how close -particles can approach each other. Usually, {scale_factor}=1.0. +particles can approach each other. Usually, {scale_factor} =1.0. :line diff --git a/doc/src/pair_smd_triangulated_surface.txt b/doc/src/pair_smd_triangulated_surface.txt index 76d3891a3c..c32bf3a22e 100644 --- a/doc/src/pair_smd_triangulated_surface.txt +++ b/doc/src/pair_smd_triangulated_surface.txt @@ -29,7 +29,7 @@ The parameter has units of pressure and should equal roughly of the Young's modulus (or bulk modulus in the case of fluids) of the material model associated with the SPH particle The parameter {scale_factor} can be used to scale the particles' contact radii. This can be useful to control how close -particles can approach the triangulated surface. Usually, {scale_factor}=1.0. +particles can approach the triangulated surface. Usually, {scale_factor} =1.0. :line diff --git a/doc/src/pair_smd_ulsph.txt b/doc/src/pair_smd_ulsph.txt index 393bbc0665..268fe78d02 100644 --- a/doc/src/pair_smd_ulsph.txt +++ b/doc/src/pair_smd_ulsph.txt @@ -12,8 +12,8 @@ pair_style smd/ulsph command :h3 pair_style smd/ulsph args :pre -these keywords must be given :l -keyword = {*DENSITY_SUMMATION} or {*DENSITY_CONTINUITY} and {*VELOCITY_GRADIENT} or {*NO_VELOCITY_GRADIENT} and {*GRADIENT_CORRECTION} or {*NO_GRADIENT_CORRECTION} +these keywords must be given :ul +keyword = {*DENSITY_SUMMATION} or {*DENSITY_CONTINUITY} and {*VELOCITY_GRADIENT} or {*NO_VELOCITY_GRADIENT} and {*GRADIENT_CORRECTION} or {*NO_GRADIENT_CORRECTION} :pre [Examples:] diff --git a/doc/src/pair_snap.txt b/doc/src/pair_snap.txt index fa90dc34e9..27dcf6082b 100644 --- a/doc/src/pair_snap.txt +++ b/doc/src/pair_snap.txt @@ -7,11 +7,11 @@ :line pair_style snap command :h3 +pair_style snap/kk command :h3 [Syntax:] -pair_style snap -:pre +pair_style snap :pre [Examples:] @@ -20,17 +20,16 @@ pair_coeff * * InP.snapcoeff In P InP.snapparam In In P P :pre [Description:] -Pair style {snap} computes interactions -using the spectral neighbor analysis potential (SNAP) -"(Thompson)"_#Thompson20142. Like the GAP framework of Bartok et al. -"(Bartok2010)"_#Bartok20102, "(Bartok2013)"_#Bartok2013 -which uses bispectrum components +Pair style {snap} computes interactions using the spectral +neighbor analysis potential (SNAP) "(Thompson)"_#Thompson20142. +Like the GAP framework of Bartok et al. "(Bartok2010)"_#Bartok20102, +"(Bartok2013)"_#Bartok2013 which uses bispectrum components to characterize the local neighborhood of each atom in a very general way. The mathematical definition of the bispectrum calculation used by SNAP is identical to that used by "compute sna/atom"_compute_sna_atom.html. In SNAP, the total energy is decomposed into a sum over -atom energies. The energy of atom {i } is +atom energies. The energy of atom {i} is expressed as a weighted sum over bispectrum components. :c,image(Eqs/pair_snap.jpg) @@ -173,6 +172,29 @@ This pair style can only be used via the {pair} keyword of the :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This style is part of the SNAP package. It is only enabled if diff --git a/doc/src/pair_table_rx.txt b/doc/src/pair_table_rx.txt index f93af21da4..cd3a7ef31b 100644 --- a/doc/src/pair_table_rx.txt +++ b/doc/src/pair_table_rx.txt @@ -7,6 +7,7 @@ :line pair_style table/rx command :h3 +pair_style table/rx/kk command :h3 [Syntax:] @@ -223,6 +224,29 @@ This pair style can only be used via the {pair} keyword of the :line +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + [Restrictions:] This command is part of the USER-DPD package. It is only enabled if diff --git a/doc/src/pair_ufm.txt b/doc/src/pair_ufm.txt new file mode 100644 index 0000000000..88a22864cc --- /dev/null +++ b/doc/src/pair_ufm.txt @@ -0,0 +1,135 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style ufm command :h3 +pair_style ufm/gpu command :h3 +pair_style ufm/omp command :h3 +pair_style ufm/opt command :h3 + +[Syntax:] + +pair_style ufm cutoff :pre + +cutoff = global cutoff for {ufm} interactions (distance units) :ul + +[Examples:] + +pair_style ufm 4.0 +pair_coeff 1 1 100.0 1.0 2.5 +pair_coeff * * 100.0 1.0 :pre + + +pair_style ufm 4.0 +pair_coeff * * 10.0 1.0 +variable prefactor equal ramp(10,100) +fix 1 all adapt 1 pair ufm epsilon * * v_prefactor :pre + +[Description:] + +Style {ufm} computes pairwise interactions using the Uhlenbeck-Ford model (UFM) potential "(Paula Leite2016)"_#PL2 which is given by + +:c,image(Eqs/pair_ufm.jpg) + +where rc is the cutoff, sigma is a distance-scale and epsilon is an energy-scale, i.e., a product of Boltzmann constant kB, temperature T and the Uhlenbeck-Ford p-parameter which is responsible +to control the softness of the interactions "(Paula Leite2017)"_#PL1. +This model is useful as a reference system for fluid-phase free-energy calculations "(Paula Leite2016)"_#PL2. + +The following coefficients must be defined for each pair of atom types +via the "pair_coeff"_pair_coeff.html command as in the examples above, +or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands, or by mixing as described below: + +epsilon (energy units) +sigma (distance units) +cutoff (distance units) :ul + +The last coefficient is optional. If not specified, the global {ufm} +cutoff is used. + + +The "fix adapt"_fix_adapt.html command can be used to vary epsilon and sigma for this pair style over the course of a simulation, in which case +pair_coeff settings for epsilon and sigma must still be specified, but will be +overridden. For example these commands will vary the prefactor epsilon for +all pairwise interactions from 10.0 at the beginning to 100.0 at the end +of a run: + +variable prefactor equal ramp(10,100) +fix 1 all adapt 1 pair ufm epsilon * * v_prefactor :pre + +NOTE: The thermodynamic integration procedure can be performed with this potential using "fix adapt"_fix_adapt.html. This command will rescale the force on each atom by varying a scale variable, which always starts with value 1.0. The syntax is the same described above, however, changing epsilon to scale. A detailed explanation of how to use this command and perform nonequilibrium thermodynamic integration in LAMMPS is given in the paper by "(Freitas)"_#Freitas2. + +:line + +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. + +These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, +USER-OMP and OPT packages, respectively. They are only enabled if +LAMMPS was built with those packages. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +You can specify the accelerated styles explicitly in your input script +by including their suffix, or you can use the "-suffix command-line +switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can +use the "suffix"_suffix.html command in your input script. + +See "Section 5"_Section_accelerate.html of the manual for +more instructions on how to use the accelerated styles effectively. + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +For atom type pairs I,J and I != J, the A coefficient and cutoff +distance for this pair style can be mixed. A is always mixed via a +{geometric} rule. The cutoff is mixed according to the pair_modify +mix value. The default mix value is {geometric}. See the +"pair_modify" command for details. + +This pair style support the "pair_modify"_pair_modify.html shift option for the energy of the pair interaction. + +The "pair_modify"_pair_modify.html table and tail are not relevant for this +pair style. + +This pair style does not support the "pair_modify"_pair_modify.html tail option for adding long-range tail corrections to energy and pressure. + +This pair style writes its information to "binary restart +files"_restart.html, 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 +"run_style respa"_run_style.html command. It does not support the +{inner}, {middle}, {outer} keywords. + +:line + +[Restrictions:] none + +[Related commands:] + +"pair_coeff"_pair_coeff.html, "fix adapt"_fix_adapt.html + +[Default:] none + + +:link(PL1) +[(Paula Leite2017)] Paula Leite, Santos-Florez, and de Koning, Phys Rev E, 96, +32115 (2017). + +:link(PL2) +[(Paula Leite2016)] Paula Leite , Freitas, Azevedo, and de Koning, J Chem Phys, 126, +044509 (2016). + +:link(Freitas2) +[(Freitas)] Freitas, Asta, and de Koning, Computational Materials Science, 112, 333 (2016). diff --git a/doc/src/pair_yukawa.txt b/doc/src/pair_yukawa.txt index 61d6bde6a9..e7c063ded9 100644 --- a/doc/src/pair_yukawa.txt +++ b/doc/src/pair_yukawa.txt @@ -9,6 +9,7 @@ pair_style yukawa command :h3 pair_style yukawa/gpu command :h3 pair_style yukawa/omp command :h3 +pair_style yukawa/kk command :h3 [Syntax:] diff --git a/doc/src/pair_zbl.txt b/doc/src/pair_zbl.txt index 5ab672171b..1984cd831f 100644 --- a/doc/src/pair_zbl.txt +++ b/doc/src/pair_zbl.txt @@ -8,6 +8,7 @@ pair_style zbl command :h3 pair_style zbl/gpu command :h3 +pair_style zbl/kk command :h3 pair_style zbl/omp command :h3 [Syntax:] diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt index 2c1b20f4d3..f99c9d1a4b 100644 --- a/doc/src/pairs.txt +++ b/doc/src/pairs.txt @@ -11,11 +11,13 @@ Pair Styles :h1 pair_awpmd pair_beck pair_body + pair_body_rounded_polygon pair_bop pair_born pair_brownian pair_buck pair_buck_long + pair_buck6d_coul_gauss pair_charmm pair_class2 pair_colloid @@ -32,6 +34,7 @@ Pair Styles :h1 pair_eff pair_eim pair_exp6_rx + pair_extep pair_gauss pair_gayberne pair_gran @@ -58,6 +61,7 @@ Pair Styles :h1 pair_meam pair_meam_spline pair_meam_sw_spline + pair_meso pair_mgpt pair_mie pair_momb @@ -99,6 +103,7 @@ Pair Styles :h1 pair_tersoff_zbl pair_thole pair_tri_lj + pair_ufm pair_vashishta pair_yukawa pair_yukawa_colloid diff --git a/doc/src/print.txt b/doc/src/print.txt index 4c9e5b4d76..77e0c7cfd3 100644 --- a/doc/src/print.txt +++ b/doc/src/print.txt @@ -14,10 +14,11 @@ print string keyword value :pre string = text string to print, which may contain variables :ulb,l zero or more keyword/value pairs may be appended :l -keyword = {file} or {append} or {screen} :l +keyword = {file} or {append} or {screen} or {universe} :l {file} value = filename {append} value = filename - {screen} value = {yes} or {no} :pre + {screen} value = {yes} or {no} + {universe} value = {yes} or {no} :pre :ule [Examples:] @@ -26,6 +27,7 @@ print "Done with equilibration" file info.dat print Vol=$v append info.dat screen no print "The system volume is now $v" print 'The system volume is now $v' +print "NEB calculation 1 complete" screen no universe yes print """ System volume = $v System temperature = $t @@ -49,6 +51,11 @@ it does not exist. If the {screen} keyword is used, output to the screen and logfile can be turned on or off as desired. +If the {universe} keyword is used, output to the global screen and +logfile can be turned on or off as desired. In multi-partition +calculations, the {screen} option and the corresponding output only +apply to the screen and logfile of the individual partition. + If you want the print command to be executed multiple times (with changing variable values), there are 3 options. First, consider using the "fix print"_fix_print.html command, which will print a string @@ -74,4 +81,4 @@ thermodynamic properties, global values calculated by a [Default:] -The option defaults are no file output and screen = yes. +The option defaults are no file output, screen = yes, and universe = no. diff --git a/doc/src/python.txt b/doc/src/python.txt index c6538ded45..1ac2b48528 100644 --- a/doc/src/python.txt +++ b/doc/src/python.txt @@ -406,7 +406,7 @@ cases, LAMMPS has no simple way to check that something illogical is being attempted. The same applies to Python functions called during a simulation run at -each time step using "fix python"_fix_python.html. +each time step using "fix python/invoke"_fix_python_invoke.html. :line @@ -493,6 +493,6 @@ different source files, problems may occur. [Related commands:] -"shell"_shell.html, "variable"_variable.html, "fix python"_fix_python.html +"shell"_shell.html, "variable"_variable.html, "fix python/invoke"_fix_python_invoke.html [Default:] none diff --git a/doc/src/read_data.txt b/doc/src/read_data.txt index a8aca53693..fd297e36c1 100644 --- a/doc/src/read_data.txt +++ b/doc/src/read_data.txt @@ -15,10 +15,11 @@ read_data file keyword args ... :pre file = name of data file to read in :ulb,l zero or more keyword/arg pairs may be appended :l keyword = {add} or {offset} or {shift} or {extra/atom/types} or {extra/bond/types} or {extra/angle/types} or {extra/dihedral/types} or {extra/improper/types} or {extra/bond/per/atom} or {extra/angle/per/atom} or {extra/dihedral/per/atom} or {extra/improper/per/atom} or {group} or {nocoeff} or {fix} :l - {add} arg = {append} or {Nstart} or {merge} - append = add new atoms with IDs appended to current IDs - Nstart = add new atoms with IDs starting with Nstart - merge = add new atoms with their IDs unchanged + {add} arg = {append} or {IDoffset} or {IDoffset MOLoffset} or {merge} + append = add new atoms with atom IDs appended to current IDs + IDoffset = add new atoms with atom IDs having IDoffset added + MOLoffset = add new atoms with molecule IDs having MOLoffset added (only when molecule IDs are enabled) + merge = add new atoms with their atom IDs (and molecule IDs) unchanged {offset} args = toff boff aoff doff ioff toff = offset to add to atom types boff = offset to add to bond types @@ -120,20 +121,26 @@ boundary, then the atoms may become far apart if the box size grows. This will separate the atoms in the bond, which can lead to "lost" bond atoms or bad dynamics. -The three choices for the {add} argument affect how the IDs of atoms -in the data file are treated. If {append} is specified, atoms in the -data file are added to the current system, with their atom IDs reset -so that an atomID = M in the data file becomes atomID = N+M, where N -is the largest atom ID in the current system. This rule is applied to -all occurrences of atom IDs in the data file, e.g. in the Velocity or -Bonds section. If {Nstart} is specified, then {Nstart} is a numeric -value is given, e.g. 1000, so that an atomID = M in the data file -becomes atomID = 1000+M. If {merge} is specified, the data file atoms +The three choices for the {add} argument affect how the atom IDs and +molecule IDs of atoms in the data file are treated. If {append} is +specified, atoms in the data file are added to the current system, +with their atom IDs reset so that an atomID = M in the data file +becomes atomID = N+M, where N is the largest atom ID in the current +system. This rule is applied to all occurrences of atom IDs in the +data file, e.g. in the Velocity or Bonds section. This is also done +for molecule IDs, if the atom style does support molecule IDs or +they are enabled via fix property/atom. If {IDoffset} is specified, +then {IDoffset} is a numeric value is given, e.g. 1000, so that an +atomID = M in the data file becomes atomID = 1000+M. For systems +with enabled molecule IDs, another numerical argument {MOLoffset} +is required representing the equivalent offset for molecule IDs. +If {merge} is specified, the data file atoms are added to the current system without changing their IDs. They are assumed to merge (without duplication) with the currently defined atoms. It is up to you to insure there are no multiply defined atom IDs, as LAMMPS only performs an incomplete check that this is the case -by insuring the resulting max atomID >= the number of atoms. +by insuring the resulting max atomID >= the number of atoms. For +molecule IDs, there is no check done at all. The {offset} and {shift} keywords can only be used if the {add} keyword is also specified. @@ -374,10 +381,9 @@ needed if new bonds (angles, dihedrals, impropers) will be added to the system when a simulation runs, e.g. by using the "fix bond/create"_fix_bond_create.html command. Using this header flag is deprecated; please use the {extra/bond/per/atom} keyword (and -correspondingly for angles, dihedrals and impropers) in the -read_data command instead. Either will pre-allocate space in LAMMPS - data structures for storing the new bonds (angles, -dihedrals, impropers). +correspondingly for angles, dihedrals and impropers) in the read_data +command instead. Either will pre-allocate space in LAMMPS data +structures for storing the new bonds (angles, dihedrals, impropers). The "extra special per atom" setting is typically only needed if new bonds/angles/etc will be added to the system, e.g. by using the "fix @@ -547,6 +553,9 @@ bond: atom-ID molecule-ID atom-type x y z charge: atom-ID atom-type q x y z dipole: atom-ID atom-type q x y z mux muy muz dpd: atom-ID atom-type theta x y z +edpd: atom-ID atom-type edpd_temp edpd_cv x y z +mdpd: atom-ID atom-type rho x y z +tdpd: atom-ID atom-type x y z cc1 cc2 ... ccNspecies electron: atom-ID atom-type q spin eradius x y z ellipsoid: atom-ID atom-type ellipsoidflag density x y z full: atom-ID molecule-ID atom-type q x y z @@ -566,12 +575,15 @@ The per-atom values have these meanings and units, listed alphabetically: atom-ID = integer ID of atom atom-type = type of atom (1-Ntype) bodyflag = 1 for body particles, 0 for point particles +cc = chemical concentration for tDPD particles for each species (mole/volume units) contact-radius = ??? (distance units) cs_re,cs_im = real/imaginary parts of wavepacket coefficients cv = heat capacity (need units) for SPH particles density = density of particle (mass/distance^3 or mass/distance^2 or mass/distance units, depending on dimensionality of particle) diameter = diameter of spherical atom (distance units) e = energy (need units) for SPH particles +edpd_temp = temperature for eDPD particles (temperature units) +edpd_cv = volumetric heat capacity for eDPD particles (energy/temperature/volume units) ellipsoidflag = 1 for ellipsoidal particles, 0 for point particles eradius = electron radius (or fixed-core radius) etag = integer ID of electron that each wavepacket belongs to diff --git a/doc/src/read_restart.txt b/doc/src/read_restart.txt index d1091542b8..a5a2bfcc97 100644 --- a/doc/src/read_restart.txt +++ b/doc/src/read_restart.txt @@ -178,7 +178,7 @@ not the same and the current value is not the default. Note that some force field styles (pair, bond, angle, etc) do not store their coefficient info in restart files. Typically these are many-body or tabulated potentials which read their parameters from -separate files. In these cases you will need to re-specify the "pair +separate files. In these cases you will need to re-specify the "pair_coeff"_pair_coeff.html, "bond_coeff"_bond_coeff.html, etc commands in your restart input script. The doc pages for individual force field styles mention if this is the case. This is also true of diff --git a/doc/src/replicate.txt b/doc/src/replicate.txt index 291558e0e5..08523ecdd8 100644 --- a/doc/src/replicate.txt +++ b/doc/src/replicate.txt @@ -10,9 +10,11 @@ replicate command :h3 [Syntax:] -replicate nx ny nz :pre +replicate nx ny nz {keyword} :pre -nx,ny,nz = replication factors in each dimension :ul +nx,ny,nz = replication factors in each dimension :ulb +optional {keyword} = {bbox} :l + {bbox} = only check atoms in replicas that overlap with a processor's subdomain :ule [Examples:] @@ -43,6 +45,12 @@ file that crosses a periodic boundary should be between two atoms with image flags that differ by 1. This will allow the bond to be unwrapped appropriately. +The optional keyword {bbox} uses a bounding box to only check atoms +in replicas that overlap with a processor's subdomain when assigning +atoms to processors, and thus can result in substantial speedups for +calculations using a large number of processors. It does require +temporarily using more memory. + [Restrictions:] A 2d simulation cannot be replicated in the z dimension. diff --git a/doc/src/set.txt b/doc/src/set.txt index 14460c9741..4757d1c575 100644 --- a/doc/src/set.txt +++ b/doc/src/set.txt @@ -24,7 +24,7 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \ {bond} or {angle} or {dihedral} or {improper} or \ {meso/e} or {meso/cv} or {meso/rho} or \ {smd/contact/radius} or {smd/mass/density} or {dpd/theta} or \ - {i_name} or {d_name} :l + {edpd/temp} or {edpd/cv} or {cc} or {i_name} or {d_name} :l {type} value = atom type value can be an atom-style variable (see below) {type/fraction} values = type fraction seed @@ -98,6 +98,13 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \ {dpd/theta} value = internal temperature of DPD particles (temperature units) value can be an atom-style variable (see below) value can be NULL which sets internal temp of each particle to KE temp + {edpd/temp} value = temperature of eDPD particles (temperature units) + value can be an atom-style variable (see below) + {edpd/cv} value = volumetric heat capacity of eDPD particles (energy/temperature/volume units) + value can be an atom-style variable (see below) + {cc} values = index cc + index = index of a chemical species (1 to Nspecies) + cc = chemical concentration of tDPD particles for a species (mole/volume units) {i_name} value = value for custom integer vector with name {d_name} value = value for custom floating-point vector with name :pre :ule @@ -418,6 +425,19 @@ value >= 0.0, the internal temperature is set to that value. If it is < 0.0, the computation of Tkin is performed and the internal temperature is set to that value. +Keywords {edpd/temp} and {edpd/cv} set the temperature and volumetric +heat capacity of an eDPD particle as defined by the USER-MESO package. +Currently, only "atom_style edpd"_atom_style.html defines particles +with these attributes. The values for the temperature and heat +capacity must be positive. + +Keyword {cc} sets the chemical concentration of a tDPD particle for a +specified species as defined by the USER-MESO package. Currently, only +"atom_style tdpd"_atom_style.html defines particles with this +attribute. An integer for "index" selects a chemical species (1 to +Nspecies) where Nspecies is set by the atom_style command. The value +for the chemical concentration must be >= 0.0. + Keywords {i_name} and {d_name} refer to custom integer and floating-point properties that have been added to each atom via the "fix property/atom"_fix_property_atom.html command. When that command diff --git a/doc/src/special_bonds.txt b/doc/src/special_bonds.txt index 6a661015bd..1021c4856b 100644 --- a/doc/src/special_bonds.txt +++ b/doc/src/special_bonds.txt @@ -25,9 +25,7 @@ keyword = {amber} or {charmm} or {dreiding} or {fene} or {lj/coul} or {lj} or {c {coul} values = w1,w2,w3 w1,w2,w3 = weights (0.0 to 1.0) on pairwise Coulombic interactions {angle} value = {yes} or {no} - {dihedral} value = {yes} or {no} - {extra} value = N - N = number of extra 1-2,1-3,1-4 interactions to save space for :pre + {dihedral} value = {yes} or {no} :pre :ule Examples: @@ -36,8 +34,7 @@ special_bonds amber special_bonds charmm special_bonds fene dihedral no special_bonds lj/coul 0.0 0.0 0.5 angle yes dihedral yes -special_bonds lj 0.0 0.0 0.5 coul 0.0 0.0 0.0 dihedral yes -special_bonds lj/coul 0 1 1 extra 2 :pre +special_bonds lj 0.0 0.0 0.5 coul 0.0 0.0 0.0 dihedral yes :pre [Description:] @@ -178,14 +175,6 @@ interaction between atoms 2 and 5 will be unaffected (full weighting of 1.0). If the {dihedral} keyword is specified as {no} which is the default, then the 2,5 interaction will also be weighted by 0.5. -The {extra} keyword can be used when additional bonds will be created -during a simulation run, e.g. by the "fix -bond/create"_fix_bond_create.html command. It can also be used if -molecules will be added to the system, e.g. via the "fix -deposit"_fix_deposit.html, or "fix pour"_fix_pour.html commands, which -will have atoms with more special neighbors than any atom in the -current system has. - :line NOTE: LAMMPS stores and maintains a data structure with a list of the @@ -194,8 +183,9 @@ the system). If new bonds are created (or molecules added containing atoms with more special neighbors), the size of this list needs to grow. Note that adding a single bond always adds a new 1st neighbor but may also induce *many* new 2nd and 3rd neighbors, depending on the -molecular topology of your system. Using the {extra} keyword leaves -empty space in the list for this N additional 1st, 2nd, or 3rd +molecular topology of your system. Using the {extra/special/per/atom} +keyword to either "read_data"_read_data.html or "create_box"_create_box.html +reserves empty space in the list for this N additional 1st, 2nd, or 3rd neighbors to be added. If you do not do this, you may get an error when bonds (or molecules) are added. @@ -203,8 +193,7 @@ when bonds (or molecules) are added. NOTE: If you reuse this command in an input script, you should set all the options you need each time. This command cannot be used a 2nd -time incrementally, e.g. to add some extra storage locations via the -{extra} keyword. E.g. these two commands: +time incrementally. E.g. these two commands: special_bonds lj 0.0 1.0 1.0 special_bonds coul 0.0 0.0 1.0 @@ -221,25 +210,6 @@ Coul: coul 0.0 0.0 1.0 because the LJ settings are reset to their default values each time the command is issued. -Likewise - -special_bonds amber -special_bonds extra 2 :pre - -is not the same as this single command: - -special_bonds amber extra 2 :pre - -since in the former case, the 2nd command will reset all the LJ and -Coulombic weights to 0.0 (the default). - -One exception to this rule is the {extra} option itself. It is not -reset to its default value of 0 each time the special_bonds command is -invoked. This is because it can also be set by the -"read_data"_read_data.html and "create_box"_create_box.html commands, -so this command will not override those settings unless you explicitly -use {extra} as an option. - [Restrictions:] none [Related commands:] diff --git a/doc/src/suffix.txt b/doc/src/suffix.txt index 7a4adb50b6..74f69b6dfe 100644 --- a/doc/src/suffix.txt +++ b/doc/src/suffix.txt @@ -50,7 +50,7 @@ Intel(R) Xeon Phi(TM) coprocessors. :l KOKKOS = a collection of atom, pair, and fix styles optimized to run using the Kokkos library on various kinds of hardware, including GPUs -via Cuda and many-core chips via OpenMP or threading. :l +via CUDA and many-core chips via OpenMP or threading. :l USER-OMP = a collection of pair, bond, angle, dihedral, improper, kspace, compute, and fix styles with support for OpenMP diff --git a/doc/src/temper_npt.txt b/doc/src/temper_npt.txt new file mode 100644 index 0000000000..4ad49f9e33 --- /dev/null +++ b/doc/src/temper_npt.txt @@ -0,0 +1,67 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line +temper/npt command :h3 + +[Syntax:] + +temper/npt N M temp fix-ID seed1 seed2 pressure index :pre + +N = total # of timesteps to run +M = attempt a tempering swap every this many steps +temp = initial temperature for this ensemble +fix-ID = ID of the fix that will control temperature and pressure during the run +seed1 = random # seed used to decide on adjacent temperature to partner with +seed2 = random # seed for Boltzmann factor in Metropolis swap +pressure = setpoint pressure for the ensemble +index = which temperature (0 to N-1) I am simulating (optional) :ul + +[Examples:] + +temper/npt 100000 100 $t nptfix 0 58728 1 +temper/npt 2500000 1000 300 nptfix 0 32285 $p +temper/npt 5000000 2000 $t nptfix 0 12523 1 $w :pre + +[Description:] + +Run a parallel tempering or replica exchange simulation using multiple +replicas (ensembles) of a system in the isothermal-isobaric (NPT) +ensemble. The command temper/npt works like "temper"_temper.html but +requires running replicas in the NPT ensemble instead of the canonical +(NVT) ensemble and allows for pressure to be set in the ensembles. +These multiple ensembles can run in parallel at different temperatures +or different pressures. The acceptance criteria for temper/npt is +specific to the NPT ensemble and can be found in references +"(Okabe)"_#Okabe2 and "(Mori)"_#Mori2. + +Apart from the difference in acceptance criteria and the specification +of pressure, this command works much like the "temper"_temper.html +command. See the documentation on "temper"_temper.html for information +on how the parallel tempering is handled in general. + +:line + +[Restrictions:] + +This command can only be used if LAMMPS was built with the USER-MISC +package. See the "Making LAMMPS"_Section_start.html#start_3 section +for more info on packages. + +This command should be used with a fix that maintains the +isothermal-isobaric (NPT) ensemble. + +[Related commands:] + +"temper"_temper.html, "variable"_variable.html, "fix_npt"_fix_nh.html + +[Default:] none + +:link(Okabe2) +[(Okabe)] T. Okabe, M. Kawata, Y. Okamoto, M. Masuhiro, Chem. Phys. Lett., 335, 435-439 (2001). + +:link(Mori2) +[(Mori)] Y. Mori, Y. Okamoto, J. Phys. Soc. Jpn., 7, 074003 (2010). diff --git a/doc/src/tutorial_bash_on_windows.txt b/doc/src/tutorial_bash_on_windows.txt new file mode 100644 index 0000000000..66712bdffa --- /dev/null +++ b/doc/src/tutorial_bash_on_windows.txt @@ -0,0 +1,203 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Using LAMMPS with Bash on Windows :h3 +[written by Richard Berger] + +:line +Starting with Windows 10 you can install Linux tools directly in Windows. This +allows you to compile LAMMPS following the same procedure as on a real Ubuntu +Linux installation. Software can be easily installed using the package manager +via apt-get and all files are accessible in both the Windows Explorer and your +Linux shell (bash). This avoids switching to a different operating system or +installing a virtual machine. Everything runs on Windows. + +Installing Bash on Windows :h4 + +Prerequisites :h5 + +Windows 10 (64bit only) +Latest updates installed :ul + +Enable developer mode :h5 +You enable this feature by first opening Windows Settings and enabling +Developer mode. Go to the Windows settings and search for "developer". This +will allow you to install software which comes from outside of the Windows +Store. You might be prompted to reboot your compute. Please do so. + +:image(JPG/bow_tutorial_01_small.png,JPG/bow_tutorial_01.png) +:image(JPG/bow_tutorial_02_small.png,JPG/bow_tutorial_02.png) +:image(JPG/bow_tutorial_03_small.png,JPG/bow_tutorial_03.png) + +Install Windows Subsystem for Linux :h5 + +Next you must ensure that the Window Subsystem for Linux is installed. Again, +search for "enable windows features" in the Settings dialog. This opens a +dialog with a list of features you can install. Add a checkmark to Windows +Subsystem for Linux (Beta) and press OK. + +:image(JPG/bow_tutorial_04_small.png,JPG/bow_tutorial_04.png) +:image(JPG/bow_tutorial_05.png,JPG/bow_tutorial_05.png) + +Install Bash for Windows :h5 + +After installation completes, type "bash" in the Windows Start menu search. +Select the first found option. This will launch a command-line window which +will prompt you about installing Ubuntu on Windows. Confirm with "y" and press +enter. This will then download Ubuntu for Windows. + +:image(JPG/bow_tutorial_06.png) +:image(JPG/bow_tutorial_07.png) + +During installation, you will be asked for a new password. This will be used +for installing new software and running commands with sudo. + +:image(JPG/bow_tutorial_08.png) + +Type exit to close the command-line window. + +Go to the Start menu and type "bash" again. This time you will see a "Bash on +Ubuntu on Windows" Icon. Start this program. + +:image(JPG/bow_tutorial_09.png) + +Congratulations, you have installed [Bash on Ubuntu on Windows]. + +:image(JPG/bow_tutorial_10.png) + +:line + +Compiling LAMMPS in Bash on Windows :h4 + +The installation of LAMMPS in this environment is identical to working inside +of a real Ubuntu Linux installation. At the time writing, it uses Ubuntu 16.04. + +Installing prerequisite packages :h5 + +First upgrade all existing packages using + +sudo apt update +sudo apt upgrade -y :pre + +Next install the following packages, which include compilers and libraries +needed for various LAMMPS features: + +sudo apt install -y build-essential ccache gfortran openmpi-bin libopenmpi-dev libfftw3-dev libjpeg-dev libpng12-dev python-dev python-virtualenv libblas-dev liblapack-dev libhdf5-serial-dev hdf5-tools :pre + +Files in Ubuntu on Windows :h5 + +When you launch "Bash on Ubuntu on Windows" you will start out in your Linux +user home directory /home/[username]. You can access your Windows user directory +using the /mnt/c/Users/[username] folder. + + +Download LAMMPS :h5 + +Obtain a copy of the LAMMPS code and go into it using "cd" + +Option 1: Downloading LAMMPS tarball using wget :h6 + +wget http://lammps.sandia.gov/tars/lammps-stable.tar.gz +tar xvzf lammps-stable.tar.gz +cd lammps-31Mar17 :pre + +Option 2: Obtaining LAMMPS code from GitHub :h6 + +git clone https://github.com/lammps/lammps.git +cd lammps :pre + +Compiling LAMMPS :h5 + +At this point you can compile LAMMPS like on Ubuntu Linux. + +Compiling serial version :h6 + +cd src/ +make -j 4 serial :pre + +This will create an executable called lmp_serial in the src/ directory + +Compiling MPI version :h6 + +cd src/ +make -j 4 mpi :pre + +This will create an executable called lmp_mpi in the src/ directory + +:line + +Finally, please note the absolute path of your src folder. You can get this using + +pwd :pre + +or + +echo $PWD :pre + +To run any examples you need the location of the executable. For now, let us +save this location in a temporary variable + +LAMMPS_DIR=$PWD :pre + +:line + +Running an example script :h5 + +Once compiled you can execute some of the LAMMPS examples. Switch into the +examples/melt folder + +cd ../examples/melt :pre + +The full path of the serial executable is $LAMMPS_DIR/lmp_serial, while the mpi +version is $LAMMPS_DIR/lmp_mpi. You can run the melt example with either +version as follows: + +$LAMMPS_DIR/lmp_serial -in in.melt :pre + +or + +mpirun -np 4 $LAMMPS_DIR/lmp_mpi -in in.melt :pre + +Note the use of our variable $LAMMPS_DIR, which expands into the full path of +the LAMMPS src folder we saved earlier. + +Adding your executable directory to your PATH :h6 + +You can avoid having to type the full path of your LAMMPS binary by adding its +parent folder to the PATH environment variable as follows: + +export PATH=$LAMMPS_DIR:$PATH :pre + +Input scripts can then be run like this: + +lmp_serial -in in.melt :pre + +or + +mpirun -np 4 lmp_mpi -in in.melt :pre + +However, this PATH variable will not persist if you close your bash window. +To persist this setting edit the $HOME/.bashrc file using your favorite editor +and add this line + +export PATH=/full/path/to/your/lammps/src:$PATH :pre + +[Example:] + +For an executable lmp_serial with a full path + +/home/richard/lammps/src/lmp_serial :pre + +the PATH variable should be + +export PATH=/home/richard/lammps/src:$PATH :pre + +NOTE: This should give you a jump start when trying to run LAMMPS on Windows. +To become effective in this environment I encourage you to look into Linux +tutorials explaining Bash and Basic Unix commands (e.g., "Linux +Journey"_https://linuxjourney.com) diff --git a/doc/src/tutorial_drude.txt b/doc/src/tutorial_drude.txt index b9a167b804..f6e7eed40b 100644 --- a/doc/src/tutorial_drude.txt +++ b/doc/src/tutorial_drude.txt @@ -176,12 +176,13 @@ By recognizing the fix {drude}, LAMMPS will find and store matching DC-DP pairs and will treat DP as equivalent to their DC in the {special bonds} relations. It may be necessary to extend the space for storing such special relations. In this case extra space should -be reserved by using the {extra} keyword of the {special_bonds} +be reserved by using the {extra/special/per/atom} keyword of either +the "read_data"_read_data.html or "create_box"_create_box.html command. With our phenol, there is 1 more special neighbor for which space is required. Otherwise LAMMPS crashes and gives the required value. -special_bonds lj/coul 0.0 0.0 0.5 extra 1 :pre +read_data data-p.lmp extra/special/per/atom 1 :pre Let us assume we want to run a simple NVT simulation at 300 K. Note that Drude oscillators need to be thermalized at a low temperature in diff --git a/doc/src/tutorial_pylammps.txt b/doc/src/tutorial_pylammps.txt index 52eb6415db..11cddb3cbf 100644 --- a/doc/src/tutorial_pylammps.txt +++ b/doc/src/tutorial_pylammps.txt @@ -6,14 +6,14 @@ :line -PyLammps Tutorial :h1 +PyLammps Tutorial :h3 -Overview :h2 +Overview :h4 PyLammps is a Python wrapper class which can be created on its own or use an existing lammps Python object. It creates a simpler, Python-like interface to @@ -23,16 +23,16 @@ C++ code implementation. Finally, the IPyLammps wrapper builds on top of PyLammps and adds some additional features for IPython integration into IPython notebooks, e.g. for embedded visualization output from dump/image. -Comparison of lammps and PyLammps interfaces :h3 +Comparison of lammps and PyLammps interfaces :h5 -lammps.lammps :h4 +lammps.lammps :h6 uses C-Types direct memory access to native C++ data provides functions to send and receive data to LAMMPS requires knowledge of how LAMMPS internally works (C pointers, etc) :ul -lammps.PyLammps :h4 +lammps.PyLammps :h6 higher-level abstraction built on top of original C-Types interface manipulation of Python objects @@ -41,11 +41,11 @@ shorter, more concise Python better IPython integration, designed for quick prototyping :ul -Quick Start :h2 +Quick Start :h4 -System-wide Installation :h3 +System-wide Installation :h5 -Step 1: Building LAMMPS as a shared library :h4 +Step 1: Building LAMMPS as a shared library :h6 To use LAMMPS inside of Python it has to be compiled as shared library. This library is then loaded by the Python interface. In this example we enable the @@ -60,7 +60,7 @@ make yes-MOLECULE :pre # compile shared library using Makefile make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG -DLAMMPS_EXCEPTIONS" JPG_LIB="-lpng -ljpeg" :pre -Step 2: Installing the LAMMPS Python package :h4 +Step 2: Installing the LAMMPS Python package :h6 PyLammps is part of the lammps Python package. To install it simply install that package into your current Python installation. @@ -71,12 +71,12 @@ python install.py :pre NOTE: Recompiling the shared library requires reinstalling the Python package -Installation inside of a virtualenv :h3 +Installation inside of a virtualenv :h5 You can use virtualenv to create a custom Python environment specifically tuned for your workflow. -Benefits of using a virtualenv :h4 +Benefits of using a virtualenv :h6 isolation of your system Python installation from your development installation installation can happen in your user directory without root access (useful for HPC clusters) @@ -87,7 +87,7 @@ you can even install specific old versions of a package if necessary :ul apt-get install python-virtualenv :pre -Creating a virtualenv with lammps installed :h4 +Creating a virtualenv with lammps installed :h6 # create virtualenv name 'testing' :pre @@ -107,7 +107,7 @@ source testing/bin/activate :pre (testing) deactivate :pre -Creating a new instance of PyLammps :h2 +Creating a new instance of PyLammps :h4 To create a PyLammps object you need to first import the class from the lammps module. By using the default constructor, a new {lammps} instance is created. @@ -121,7 +121,7 @@ from lammps import lammps, PyLammps lmp = lammps() L = PyLammps(ptr=lmp) :pre -Commands :h2 +Commands :h4 Sending a LAMMPS command with the existing library interfaces is done using the command method of the lammps object instance. @@ -155,7 +155,7 @@ them automatically to a final command string. L.region("box block", xlo, xhi, ylo, yhi, zlo, zhi) :pre -System state :h2 +System state :h4 In addition to dispatching commands directly through the PyLammps object, it also provides several properties which allow you to query the system state. @@ -208,7 +208,7 @@ List of groups present in the current system :dd :dle -Working with LAMMPS variables :h2 +Working with LAMMPS variables :h4 LAMMPS variables can be both defined and accessed via the PyLammps interface. @@ -229,7 +229,7 @@ property of this object. print(a.value) a.value = 4 :pre -Retrieving the value of an arbitrary LAMMPS expressions :h2 +Retrieving the value of an arbitrary LAMMPS expressions :h4 LAMMPS expressions can be immediately evaluated by using the eval method. The passed string parameter can be any expression containing global thermo values, @@ -240,7 +240,7 @@ result = L.eval("pe") # potential energy :pre result = L.eval("v_t/2.0") :pre -Accessing atom data :h2 +Accessing atom data :h4 All atoms in the current simulation can be accessed by using the L.atoms list. Each element of this list is an object which exposes its properties (id, type, @@ -263,7 +263,7 @@ L.atoms\[0\].position = (1.0, 0.0) :pre # set position in 3D simulation L.atoms\[0\].position = (1.0, 0.0, 1.) :pre -Evaluating thermo data :h2 +Evaluating thermo data :h4 Each simulation run usually produces thermo output based on system state, computes, fixes or variables. The trajectories of these values can be queried @@ -291,7 +291,7 @@ steps = L.runs\[0\].step ke = L.runs\[0\].ke plt.plot(steps, ke) :pre -Error handling with PyLammps :h2 +Error handling with PyLammps :h4 Compiling the shared library with C++ exception support provides a better error handling experience. Without exceptions the LAMMPS code will terminate the @@ -304,7 +304,7 @@ current LAMMPS process is in an illegal state and must be terminated. It is advised to save your data and terminate the Python instance as quickly as possible. -Using PyLammps in IPython notebooks and Jupyter :h2 +Using PyLammps in IPython notebooks and Jupyter :h4 If the LAMMPS Python package is installed for the same Python interpreter as IPython, you can use PyLammps directly inside of an IPython notebook inside of @@ -320,7 +320,7 @@ Python environment (this assumes you followed the Quick Start instructions): jupyter notebook :pre -IPyLammps Examples :h2 +IPyLammps Examples :h4 Examples of IPython notebooks can be found in the python/examples/pylammps subdirectory. To open these notebooks launch {jupyter notebook} inside this @@ -328,7 +328,7 @@ directory and navigate to one of them. If you compiled and installed a LAMMPS shared library with exceptions, PNG, JPEG and FFMPEG support you should be able to rerun all of these notebooks. -Validating a dihedral potential :h3 +Validating a dihedral potential :h5 This example showcases how an IPython Notebook can be used to compare a simple LAMMPS simulation of a harmonic dihedral potential to its analytical solution. @@ -353,7 +353,7 @@ plot inside the IPython notebook. :c,image(JPG/pylammps_dihedral.jpg) -Running a Monte Carlo relaxation :h3 +Running a Monte Carlo relaxation :h5 This second example shows how to use PyLammps to create a 2D Monte Carlo Relaxation simulation, computing and plotting energy terms and even embedding video output. @@ -424,7 +424,7 @@ The energies of each iteration are collected in a Python list and finally plotte The IPython notebook also shows how to use dump commands and embed video files inside of the IPython notebook. -Using PyLammps and mpi4py (Experimental) :h2 +Using PyLammps and mpi4py (Experimental) :h4 PyLammps can be run in parallel using mpi4py. This python package can be installed using @@ -451,7 +451,7 @@ mpirun -np 4 python melt.py :pre IMPORTANT NOTE: Any command must be executed by all MPI processes. However, evaluations and querying the system state is only available on rank 0. -Feedback and Contributing :h2 +Feedback and Contributing :h4 If you find this Python interface useful, please feel free to provide feedback and ideas on how to improve it to Richard Berger (richard.berger@temple.edu). We also diff --git a/doc/src/tutorials.txt b/doc/src/tutorials.txt index 569ad892b7..338439ac8e 100644 --- a/doc/src/tutorials.txt +++ b/doc/src/tutorials.txt @@ -8,6 +8,7 @@ Tutorials :h1 tutorial_drude tutorial_github tutorial_pylammps + tutorial_bash_on_windows body manifolds diff --git a/doc/src/variable.txt b/doc/src/variable.txt index e3b7c5de0d..c0851464c3 100644 --- a/doc/src/variable.txt +++ b/doc/src/variable.txt @@ -689,7 +689,7 @@ increase in increments of z, starting at x, until a is reached. At that point the timestep increases in increments of c, from a to b, then after b, increments by z are resumed until y is reached. For any current timestep, the next timestep in the sequence is returned. Thus -if stride(1000,2000,100,1350,1360,1) is used in a variable by the +if stride2(1000,2000,100,1350,1360,1) is used in a variable by the "dump_modify every"_dump_modify.html command, it will generate the sequence of output timesteps: diff --git a/doc/utils/converters/lammpsdoc/txt2rst.py b/doc/utils/converters/lammpsdoc/txt2rst.py index 9fac2f0635..17d0916157 100755 --- a/doc/utils/converters/lammpsdoc/txt2rst.py +++ b/doc/utils/converters/lammpsdoc/txt2rst.py @@ -67,7 +67,8 @@ class RSTMarkup(Markup): text = text.replace('*', '\\*') text = text.replace('^', '\\^') text = text.replace('|', '\\|') - text = re.sub(r'([^"])_', r'\1\\_', text) + text = re.sub(r'([^"])_([ \t\n\r\f])', r'\1\\\\_\2', text) + text = re.sub(r'([^"])_([^ \t\n\r\f])', r'\1\\_\2', text) return text def unescape_rst_chars(self, text): @@ -148,15 +149,18 @@ class RSTFormatting(Formatting): return "\n----------\n\n" + content.strip() def image(self, content, file, link=None): - if link and (link.lower().endswith('.jpg') or - link.lower().endswith('.jpeg') or - link.lower().endswith('.png') or - link.lower().endswith('.gif')): - converted = ".. thumbnail:: " + self.markup.unescape_rst_chars(link) + "\n" - else: - converted = ".. image:: " + self.markup.unescape_rst_chars(file) + "\n" - if link: - converted += " :target: " + self.markup.unescape_rst_chars(link) + "\n" + # 2017-12-07: commented out to disable thumbnail processing due to dropping + # support for obsolete sphinxcontrib.images extension + # + #if link and (link.lower().endswith('.jpg') or + # link.lower().endswith('.jpeg') or + # link.lower().endswith('.png') or + # link.lower().endswith('.gif')): + # converted = ".. thumbnail:: " + self.markup.unescape_rst_chars(link) + "\n" + #else: + converted = ".. image:: " + self.markup.unescape_rst_chars(file) + "\n" + if link: + converted += " :target: " + self.markup.unescape_rst_chars(link) + "\n" if "c" in self.current_command_list: converted += " :align: center\n" diff --git a/doc/utils/sphinx-config/conf.py b/doc/utils/sphinx-config/conf.py index 9cca50b3bf..6c70cf9804 100644 --- a/doc/utils/sphinx-config/conf.py +++ b/doc/utils/sphinx-config/conf.py @@ -31,8 +31,11 @@ import os # ones. extensions = [ 'sphinx.ext.mathjax', - 'sphinxcontrib.images', ] +# 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%', diff --git a/examples/COUPLE/simple/README b/examples/COUPLE/simple/README index 404bb37004..8a97137bf7 100644 --- a/examples/COUPLE/simple/README +++ b/examples/COUPLE/simple/README @@ -17,33 +17,36 @@ additional wrapper library that interfaces the C interface of the LAMMPS library to Fortran and also translates the MPI communicator from Fortran to C. -Once you have built LAMMPS as a library (see examples/COUPLE/README), -you can then build any of the driver codes with compile lines like -these, which include paths to the LAMMPS library interface, MPI (an -installed MPICH in this case), and FFTW (assuming you built LAMMPS as -a library with its PPPM solver). +First build LAMMPS as a library (see examples/COUPLE/README), e.g. -This builds the C++ driver with the LAMMPS library using a C++ compiler: +make mode=shlib mpi -g++ -I/home/sjplimp/lammps/src -c simple.cpp -g++ -L/home/sjplimp/lammps/src simple.o \ - -llammps -lfftw -lmpich -lmpl -lpthread -o simpleCC +You can then build any of the driver codes with compile lines like +these, which include paths to the LAMMPS library interface, and +linking with FFTW (only needed if you built LAMMPS as a library with +its PPPM solver). -This builds the C driver with the LAMMPS library using a C compiler: +This builds the C++ driver with the LAMMPS library using the mpiCC +(C++) compiler: -gcc -I/home/sjplimp/lammps/src -c simple.c -gcc -L/home/sjplimp/lammps/src simple.o \ - -llammps -lfftw -lmpich -lmpl -lpthread -lstdc++ -o simpleC +mpiCC -I/home/sjplimp/lammps/src -c simple.cpp +mpiCC -L/home/sjplimp/lammps/src simple.o -llammps -lfftw -o simpleCC + +This builds the C driver with the LAMMPS library using the mpicc (C) +compiler: + +mpicc -I/home/sjplimp/lammps/src -c simple.c +mpicc -L/home/sjplimp/lammps/src simple.o -llammps -lfftw -o simpleC This builds the Fortran wrapper and driver with the LAMMPS library -using a Fortran and C compiler, using the wrapper in the fortran -directory: +using the mpicc (C) and mpifort (Fortran) compilers, using the wrapper +in the fortran directory: cp ../fortran/libfwrapper.c . -gcc -I/home/sjplimp/lammps/src -c libfwrapper.c -gfortran -I/home/sjplimp/lammps/src -c simple.f90 -gfortran -L/home/sjplimp/lammps/src simple.o libfwrapper.o \ - -llammps -lfftw -lfmpich -lmpich -lpthread -lstdc++ -o simpleF +mpicc -I/home/sjplimp/lammps/src -c libfwrapper.c +mpifort -c simple.f90 +mpifort -L/home/sjplimp/lammps/src simple.o libfwrapper.o \ + -llammps -lfftw -o simpleF You then run simpleCC, simpleC, or simpleF on a parallel machine on some number of processors Q with 2 arguments: diff --git a/examples/COUPLE/simple/simple.c b/examples/COUPLE/simple/simple.c index cc813d78fe..ad603e09a6 100644 --- a/examples/COUPLE/simple/simple.c +++ b/examples/COUPLE/simple/simple.c @@ -145,7 +145,7 @@ int main(int narg, char **arg) for (i = 0; i < natoms; i++) type[i] = 1; lammps_command(lmp,"delete_atoms group all"); - lammps_create_atoms(lmp,natoms,NULL,type,x,v); + lammps_create_atoms(lmp,natoms,NULL,type,x,v,NULL,0); lammps_command(lmp,"run 10"); } diff --git a/examples/COUPLE/simple/simple.cpp b/examples/COUPLE/simple/simple.cpp index 894c708978..912f4b8689 100644 --- a/examples/COUPLE/simple/simple.cpp +++ b/examples/COUPLE/simple/simple.cpp @@ -109,11 +109,11 @@ int main(int narg, char **arg) int natoms = static_cast (lmp->atom->natoms); x = new double[3*natoms]; v = new double[3*natoms]; - lammps_gather_atoms(lmp,"x",1,3,x); - lammps_gather_atoms(lmp,"v",1,3,v); + lammps_gather_atoms(lmp,(char *) "x",1,3,x); + lammps_gather_atoms(lmp,(char *) "v",1,3,v); double epsilon = 0.1; x[0] += epsilon; - lammps_scatter_atoms(lmp,"x",1,3,x); + lammps_scatter_atoms(lmp,(char *) "x",1,3,x); // these 2 lines are the same @@ -124,21 +124,22 @@ int main(int narg, char **arg) // extract force on single atom two different ways if (lammps == 1) { - double **f = (double **) lammps_extract_atom(lmp,"f"); + double **f = (double **) lammps_extract_atom(lmp,(char *) "f"); printf("Force on 1 atom via extract_atom: %g\n",f[0][0]); - double *fx = (double *) lammps_extract_variable(lmp,"fx","all"); + double *fx = (double *) + lammps_extract_variable(lmp,(char *) "fx",(char *) "all"); printf("Force on 1 atom via extract_variable: %g\n",fx[0]); } // use commands_string() and commands_list() to invoke more commands - char *strtwo = "run 10\nrun 20"; + char *strtwo = (char *) "run 10\nrun 20"; if (lammps == 1) lammps_commands_string(lmp,strtwo); char *cmds[2]; - cmds[0] = "run 10"; - cmds[1] = "run 20"; + cmds[0] = (char *) "run 10"; + cmds[1] = (char *) "run 20"; if (lammps == 1) lammps_commands_list(lmp,2,cmds); // delete all atoms diff --git a/examples/COUPLE/simple/simple.f90 b/examples/COUPLE/simple/simple.f90 index eb5c272527..0ac3e4fd5c 100644 --- a/examples/COUPLE/simple/simple.f90 +++ b/examples/COUPLE/simple/simple.f90 @@ -115,9 +115,12 @@ PROGRAM f_driver CALL lammps_get_natoms(ptr,natoms) ALLOCATE(x(3*natoms)) - CALL lammps_gather_atoms(ptr,'x',1,3,x); - x(1) = x(1) + epsilon - CALL lammps_scatter_atoms(ptr,'x',1,3,x); + ! these calls are commented out, b/c libfwrapper.c + ! needs to be updated to use gather_atoms and scatter_atoms + + !CALL lammps_gather_atoms(ptr,'x',1,3,x); + !x(1) = x(1) + epsilon + !CALL lammps_scatter_atoms(ptr,'x',1,3,x); DEALLOCATE(x) diff --git a/examples/README b/examples/README index 0b037f5c38..a8dfe63d92 100644 --- a/examples/README +++ b/examples/README @@ -58,7 +58,7 @@ These are the sample problems and their output in the various sub-directories: accelerate: use of all the various accelerator packages -airebo: example for using AIREBO and AIREBO-M +airebo: polyethylene with AIREBO potential balance: dynamic load balancing, 2d system body: body particles, 2d system cmap: CMAP 5-body contributions to CHARMM force field @@ -79,6 +79,7 @@ granregion: use of fix wall/region/gran as boundary on granular particles hugoniostat: Hugoniostat shock dynamics indent: spherical indenter into a 2d solid kim: use of potentials in Knowledge Base for Interatomic Models (KIM) +latte: use of LATTE density-functional tight-binding quantum code meam: MEAM test for SiC and shear (same as shear examples) melt: rapid melt of 3d LJ system micelle: self-assembly of small lipid-like molecules into 2d bilayers diff --git a/examples/USER/cgdna/examples/oxDNA/duplex1/input.duplex1 b/examples/USER/cgdna/examples/oxDNA/duplex1/input.duplex1 index 07409eea8b..af0f965336 100644 --- a/examples/USER/cgdna/examples/oxDNA/duplex1/input.duplex1 +++ b/examples/USER/cgdna/examples/oxDNA/duplex1/input.duplex1 @@ -30,10 +30,10 @@ bond_coeff * 2.0 0.25 0.7525 # oxDNA pair interactions pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 diff --git a/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.1 b/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.1 index e1ba51d045..3afed6b6ce 100644 --- a/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.1 +++ b/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.1 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7525 # oxDNA pair interactions pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 diff --git a/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.4 b/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.4 index 0d41a5813e..ba8d099913 100644 --- a/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.4 +++ b/examples/USER/cgdna/examples/oxDNA/duplex1/log.24Mar17.duplex1.g++.4 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7525 # oxDNA pair interactions pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 diff --git a/examples/USER/cgdna/examples/oxDNA/duplex2/input.duplex2 b/examples/USER/cgdna/examples/oxDNA/duplex2/input.duplex2 index 859e6af436..dd14c3ae11 100644 --- a/examples/USER/cgdna/examples/oxDNA/duplex2/input.duplex2 +++ b/examples/USER/cgdna/examples/oxDNA/duplex2/input.duplex2 @@ -30,10 +30,10 @@ bond_coeff * 2.0 0.25 0.7525 # oxDNA pair interactions pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 diff --git a/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.1 b/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.1 index e1cfa10175..f59e6bd016 100644 --- a/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.1 +++ b/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.1 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7525 # oxDNA pair interactions pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 diff --git a/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.4 b/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.4 index 5900f5b4bf..54ec267735 100644 --- a/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.4 +++ b/examples/USER/cgdna/examples/oxDNA/duplex2/log.24Mar17.duplex2.g++.4 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7525 # oxDNA pair interactions pair_style hybrid/overlay oxdna/excv oxdna/stk oxdna/hbond oxdna/xstk oxdna/coaxstk pair_coeff * * oxdna/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna/hbond 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna/hbond seqav 1.077 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna/coaxstk 46.0 0.4 0.6 0.22 0.58 2.0 2.541592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 -0.65 2.0 -0.65 diff --git a/examples/USER/cgdna/examples/oxDNA2/duplex1/input.duplex1 b/examples/USER/cgdna/examples/oxDNA2/duplex1/input.duplex1 index b15262b1d3..366e5db67a 100644 --- a/examples/USER/cgdna/examples/oxDNA2/duplex1/input.duplex1 +++ b/examples/USER/cgdna/examples/oxDNA2/duplex1/input.duplex1 @@ -30,10 +30,10 @@ bond_coeff * 2.0 0.25 0.7564 # oxDNA pair interactions pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 diff --git a/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.1 b/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.1 index 481422a6f2..25c705daf8 100644 --- a/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.1 +++ b/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.1 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7564 # oxDNA pair interactions pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 diff --git a/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.4 b/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.4 index aff8fe9bba..6ee77cb005 100644 --- a/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.4 +++ b/examples/USER/cgdna/examples/oxDNA2/duplex1/log.24Mar17.duplex1.g++.4 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7564 # oxDNA pair interactions pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 diff --git a/examples/USER/cgdna/examples/oxDNA2/duplex2/input.duplex2 b/examples/USER/cgdna/examples/oxDNA2/duplex2/input.duplex2 index 1cb16c82ca..451fe62e3c 100644 --- a/examples/USER/cgdna/examples/oxDNA2/duplex2/input.duplex2 +++ b/examples/USER/cgdna/examples/oxDNA2/duplex2/input.duplex2 @@ -30,10 +30,10 @@ bond_coeff * 2.0 0.25 0.7564 # oxDNA pair interactions pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 diff --git a/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.1 b/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.1 index f05e61a7a7..386fbd7579 100644 --- a/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.1 +++ b/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.1 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7564 # oxDNA pair interactions pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 diff --git a/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.4 b/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.4 index f3ceee3309..320d186f80 100644 --- a/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.4 +++ b/examples/USER/cgdna/examples/oxDNA2/duplex2/log.24Mar17.duplex2.g++.4 @@ -48,10 +48,10 @@ bond_coeff * 2.0 0.25 0.7564 # oxDNA pair interactions pair_style hybrid/overlay oxdna2/excv oxdna2/stk oxdna2/hbond oxdna2/xstk oxdna2/coaxstk oxdna2/dh pair_coeff * * oxdna2/excv 2.0 0.7 0.675 2.0 0.515 0.5 2.0 0.33 0.32 -pair_coeff * * oxdna2/stk 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 -pair_coeff * * oxdna2/hbond 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 1 4 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 -pair_coeff 2 3 oxdna2/hbond 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff * * oxdna2/stk seqav 0.1 6.0 0.4 0.9 0.32 0.6 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 2.0 0.65 2.0 0.65 +pair_coeff * * oxdna2/hbond seqav 0.0 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 1 4 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 +pair_coeff 2 3 oxdna2/hbond seqav 1.0678 8.0 0.4 0.75 0.34 0.7 1.5 0 0.7 1.5 0 0.7 1.5 0 0.7 0.46 3.141592653589793 0.7 4.0 1.5707963267948966 0.45 4.0 1.5707963267948966 0.45 pair_coeff * * oxdna2/xstk 47.5 0.575 0.675 0.495 0.655 2.25 0.791592653589793 0.58 1.7 1.0 0.68 1.7 1.0 0.68 1.5 0 0.65 1.7 0.875 0.68 1.7 0.875 0.68 pair_coeff * * oxdna2/coaxstk 58.5 0.4 0.6 0.22 0.58 2.0 2.891592653589793 0.65 1.3 0 0.8 0.9 0 0.95 0.9 0 0.95 40.0 3.116592653589793 pair_coeff * * oxdna2/dh 0.1 1.0 0.815 diff --git a/examples/USER/drude/README b/examples/USER/drude/README index 28395507b7..fb58fae83f 100644 --- a/examples/USER/drude/README +++ b/examples/USER/drude/README @@ -6,8 +6,11 @@ Nosé-Hoover or Langevin thermostats. * `butane` -- simulation in NVT ensemble with Thole damping +* `toluene` -- simulation in NVT ensemble with Thole damping and +use of the `extra/special/per/atom` keyword + * `ethanol` -- simulation in NpT ensemble with Thole damping -* `swm4-ndp` -- 4-site rigid water model in NpT ensemble (no Thole +* `swm4-ndp` -- 4-site rigid water model in NpT ensemble (no Thole damping) diff --git a/examples/USER/drude/toluene/data.toluene b/examples/USER/drude/toluene/data.toluene new file mode 100644 index 0000000000..48d44016d7 --- /dev/null +++ b/examples/USER/drude/toluene/data.toluene @@ -0,0 +1,24601 @@ +data.lmp create_conf simbox.xyz (Built with Packmol) + +5500 atoms +5500 bonds +6000 angles +6000 dihedrals +1500 impropers + +12 atom types +13 bond types +12 angle types +12 dihedral types +4 improper types + +-18.290765 18.335673 xlo xhi +-18.163588 18.162094 ylo yhi +-18.223046 18.328654 zlo zhi + +Masses + + 1 11.91100 # CAT + 2 11.91100 # CAO + 3 11.91100 # CAM + 4 11.91100 # CAP + 5 11.91100 # CTT + 6 1.00800 # HAT + 7 1.00800 # HT + 8 0.10000 # D_CAT + 9 0.10000 # D_CAO + 10 0.10000 # D_CAM + 11 0.10000 # D_CAP + 12 0.10000 # D_CTT + +Bond Coeffs + + 1 468.9897 1.4000 # CAT-CAO + 2 316.9976 1.5100 # CAT-CTT + 3 468.9897 1.4000 # CAO-CAM + 4 366.9964 1.0800 # CAO-HAT + 5 468.9897 1.4000 # CAM-CAP + 6 366.9964 1.0800 # CAM-HAT + 7 366.9964 1.0800 # CAP-HAT + 8 339.9894 1.0900 # CTT-HT + 9 500.0000 0.0000 # D_CAT + 10 500.0000 0.0000 # D_CAO + 11 500.0000 0.0000 # D_CAM + 12 500.0000 0.0000 # D_CAP + 13 500.0000 0.0000 # D_CTT + +Angle Coeffs + + 1 63.0004 120.0000 # CAT-CAO-CAM + 2 35.0015 120.0000 # CAT-CAO-HAT + 3 49.9988 109.5000 # CAT-CTT-HT + 4 70.0031 120.0000 # CAO-CAT-CTT + 5 63.0004 120.0000 # CAO-CAT-CAO + 6 63.0004 120.0000 # CAO-CAM-CAP + 7 35.0015 120.0000 # CAO-CAM-HAT + 8 35.0015 120.0000 # CAM-CAO-HAT + 9 63.0004 120.0000 # CAM-CAP-CAM + 10 35.0015 120.0000 # CAM-CAP-HAT + 11 35.0015 120.0000 # CAP-CAM-HAT + 12 32.9939 107.8000 # HT-CTT-HT + +Dihedral Coeffs + + 1 0.0000 7.2498 0.0000 0.0000 # CAT-CAO-CAM-CAP + 2 0.0000 7.2498 0.0000 0.0000 # CAT-CAO-CAM-HAT + 3 0.0000 7.2498 0.0000 0.0000 # CAO-CAT-CAO-CAM + 4 0.0000 7.2498 0.0000 0.0000 # CAO-CAT-CAO-HAT + 5 0.0000 7.2498 0.0000 0.0000 # CAO-CAM-CAP-CAM + 6 0.0000 7.2498 0.0000 0.0000 # CAO-CAM-CAP-HAT + 7 0.0000 7.2498 0.0000 0.0000 # CTT-CAT-CAO-CAM + 8 0.0000 7.2498 0.0000 0.0000 # CAM-CAP-CAM-HAT + 9 0.0000 7.2498 0.0000 0.0000 # CAP-CAM-CAO-HAT + 10 0.0000 7.2498 0.0000 0.0000 # CTT-CAT-CAO-HAT + 11 0.0000 7.2498 0.0000 0.0000 # HAT-CAO-CAM-HAT + 12 0.0000 7.2498 0.0000 0.0000 # HAT-CAM-CAP-HAT + +Improper Coeffs + + 1 0.0000 2.1999 0.0000 0.0000 # CAO-CAO-CAT-CTT + 2 0.0000 2.1999 0.0000 0.0000 # CAT-CAM-CAO-HAT + 3 0.0000 2.1999 0.0000 0.0000 # CAO-CAP-CAM-HAT + 4 0.0000 2.1999 0.0000 0.0000 # CAM-CAM-CAP-HAT + +Atoms + + 1 1 1 -2.2897 -3.322109e+00 6.095540e+00 -1.811877e+00 # CAT + 2 1 2 -2.3557 -3.122514e+00 5.166589e+00 -7.836690e-01 # CAO + 3 1 3 -2.3537 -4.088997e+00 5.011926e+00 2.173260e-01 # CAM + 4 1 4 -2.3627 -5.255074e+00 5.786214e+00 1.901130e-01 # CAP + 5 1 3 -2.3537 -5.454669e+00 6.715166e+00 -8.380940e-01 # CAM + 6 1 2 -2.3557 -4.488187e+00 6.869829e+00 -1.839089e+00 # CAO + 7 1 5 -2.4057 -2.279689e+00 6.262356e+00 -2.891521e+00 # CTT + 8 1 6 0.1480 -2.222969e+00 4.569281e+00 -7.626760e-01 # HAT + 9 1 6 0.1480 -3.935023e+00 4.295306e+00 1.010515e+00 # HAT + 10 1 6 0.1480 -6.000647e+00 5.666903e+00 9.623090e-01 # HAT + 11 1 6 0.1480 -6.354215e+00 7.312474e+00 -8.590870e-01 # HAT + 12 1 6 0.1480 -4.642160e+00 7.586449e+00 -2.632278e+00 # HAT + 13 1 7 0.0920 -1.760670e+00 5.316298e+00 -3.045455e+00 # HT + 14 1 7 0.0920 -2.762956e+00 6.566329e+00 -3.820043e+00 # HT + 15 1 7 0.0920 -1.561895e+00 7.025026e+00 -2.589519e+00 # HT + 16 2 1 -2.2897 1.330080e+01 1.242859e+01 -6.628229e+00 # CAT + 17 2 2 -2.3557 1.309005e+01 1.275263e+01 -7.973808e+00 # CAO + 18 2 3 -2.3537 1.378722e+01 1.381879e+01 -8.554560e+00 # CAM + 19 2 4 -2.3627 1.469514e+01 1.456090e+01 -7.789733e+00 # CAP + 20 2 3 -2.3537 1.490588e+01 1.423686e+01 -6.444154e+00 # CAM + 21 2 2 -2.3557 1.420871e+01 1.317071e+01 -5.863402e+00 # CAO + 22 2 5 -2.4057 1.254886e+01 1.127867e+01 -6.001846e+00 # CTT + 23 2 6 0.1480 1.238967e+01 1.218015e+01 -8.563818e+00 # HAT + 24 2 6 0.1480 1.362465e+01 1.406876e+01 -9.592579e+00 # HAT + 25 2 6 0.1480 1.523295e+01 1.538336e+01 -8.237742e+00 # HAT + 26 2 6 0.1480 1.560627e+01 1.480935e+01 -5.854145e+00 # HAT + 27 2 6 0.1480 1.437129e+01 1.292073e+01 -4.825384e+00 # HAT + 28 2 7 0.0920 1.233441e+01 1.052720e+01 -6.761720e+00 # HT + 29 2 7 0.0920 1.315541e+01 1.083403e+01 -5.212864e+00 # HT + 30 2 7 0.0920 1.161319e+01 1.164352e+01 -5.578156e+00 # HT + 31 3 1 -2.2897 -1.408348e+01 5.594982e+00 -2.513424e+00 # CAT + 32 3 2 -2.3557 -1.291948e+01 5.491245e+00 -1.742491e+00 # CAO + 33 3 3 -2.3537 -1.179772e+01 4.828081e+00 -2.254234e+00 # CAM + 34 3 4 -2.3627 -1.183997e+01 4.268654e+00 -3.536909e+00 # CAP + 35 3 3 -2.3537 -1.300397e+01 4.372391e+00 -4.307842e+00 # CAM + 36 3 2 -2.3557 -1.412572e+01 5.035554e+00 -3.796099e+00 # CAO + 37 3 5 -2.4057 -1.529337e+01 6.310251e+00 -1.961473e+00 # CTT + 38 3 6 0.1480 -1.288688e+01 5.922803e+00 -7.529990e-01 # HAT + 39 3 6 0.1480 -1.089978e+01 4.748056e+00 -1.659514e+00 # HAT + 40 3 6 0.1480 -1.097462e+01 3.757070e+00 -3.931682e+00 # HAT + 41 3 6 0.1480 -1.303656e+01 3.940832e+00 -5.297334e+00 # HAT + 42 3 6 0.1480 -1.502367e+01 5.115579e+00 -4.390819e+00 # HAT + 43 3 7 0.0920 -1.497146e+01 7.091848e+00 -1.273301e+00 # HT + 44 3 7 0.0920 -1.585674e+01 6.757410e+00 -2.780472e+00 # HT + 45 3 7 0.0920 -1.592651e+01 5.598550e+00 -1.431652e+00 # HT + 46 4 1 -2.2897 9.996776e+00 -8.572805e+00 1.865019e+00 # CAT + 47 4 2 -2.3557 1.107481e+01 -8.713030e+00 9.828700e-01 # CAO + 48 4 3 -2.3537 1.095335e+01 -8.284936e+00 -3.445280e-01 # CAM + 49 4 4 -2.3627 9.753863e+00 -7.716618e+00 -7.897760e-01 # CAP + 50 4 3 -2.3537 8.675833e+00 -7.576394e+00 9.237300e-02 # CAM + 51 4 2 -2.3557 8.797289e+00 -8.004487e+00 1.419771e+00 # CAO + 52 4 5 -2.4057 1.012777e+01 -9.034534e+00 3.296712e+00 # CTT + 53 4 6 0.1480 1.200012e+01 -9.151446e+00 1.326347e+00 # HAT + 54 4 6 0.1480 1.178497e+01 -8.393110e+00 -1.025043e+00 # HAT + 55 4 6 0.1480 9.660168e+00 -7.386375e+00 -1.813769e+00 # HAT + 56 4 6 0.1480 7.750514e+00 -7.137977e+00 -2.511040e-01 # HAT + 57 4 6 0.1480 7.965665e+00 -7.896313e+00 2.100286e+00 # HAT + 58 4 7 0.0920 1.116573e+01 -8.940268e+00 3.615892e+00 # HT + 59 4 7 0.0920 9.494223e+00 -8.420259e+00 3.936540e+00 # HT + 60 4 7 0.0920 9.818074e+00 -1.007685e+01 3.372648e+00 # HT + 61 5 1 -2.2897 9.714973e+00 7.617683e+00 -7.105923e+00 # CAT + 62 5 2 -2.3557 9.300090e+00 8.888751e+00 -7.520961e+00 # CAO + 63 5 3 -2.3537 1.015024e+01 9.682967e+00 -8.299714e+00 # CAM + 64 5 4 -2.3627 1.141528e+01 9.206115e+00 -8.663429e+00 # CAP + 65 5 3 -2.3537 1.183017e+01 7.935046e+00 -8.248390e+00 # CAM + 66 5 2 -2.3557 1.098001e+01 7.140830e+00 -7.469638e+00 # CAO + 67 5 5 -2.4057 8.798020e+00 6.761064e+00 -6.265982e+00 # CTT + 68 5 6 0.1480 8.324203e+00 9.256609e+00 -7.240381e+00 # HAT + 69 5 6 0.1480 9.830193e+00 1.066351e+01 -8.619887e+00 # HAT + 70 5 6 0.1480 1.207112e+01 9.818796e+00 -9.264181e+00 # HAT + 71 5 6 0.1480 1.280606e+01 7.567189e+00 -8.528971e+00 # HAT + 72 5 6 0.1480 1.130007e+01 6.160292e+00 -7.149465e+00 # HAT + 73 5 7 0.0920 7.760789e+00 6.991484e+00 -6.509210e+00 # HT + 74 5 7 0.0920 8.993707e+00 5.708661e+00 -6.471543e+00 # HT + 75 5 7 0.0920 8.976715e+00 6.963813e+00 -5.210018e+00 # HT + 76 6 1 -2.2897 -1.352073e+01 1.296150e+01 1.439885e+01 # CAT + 77 6 2 -2.3557 -1.303733e+01 1.426398e+01 1.422604e+01 # CAO + 78 6 3 -2.3537 -1.167562e+01 1.453488e+01 1.440593e+01 # CAM + 79 6 4 -2.3627 -1.079731e+01 1.350329e+01 1.475863e+01 # CAP + 80 6 3 -2.3537 -1.128071e+01 1.220081e+01 1.493144e+01 # CAM + 81 6 2 -2.3557 -1.264242e+01 1.192991e+01 1.475155e+01 # CAO + 82 6 5 -2.4057 -1.498943e+01 1.266933e+01 1.420482e+01 # CTT + 83 6 6 0.1480 -1.371488e+01 1.505978e+01 1.395396e+01 # HAT + 84 6 6 0.1480 -1.130271e+01 1.553965e+01 1.427262e+01 # HAT + 85 6 6 0.1480 -9.746848e+00 1.371226e+01 1.489741e+01 # HAT + 86 6 6 0.1480 -1.060316e+01 1.140501e+01 1.520352e+01 # HAT + 87 6 6 0.1480 -1.301533e+01 1.092514e+01 1.488485e+01 # HAT + 88 6 7 0.0920 -1.540316e+01 1.335789e+01 1.346806e+01 # HT + 89 6 7 0.0920 -1.511334e+01 1.164488e+01 1.385374e+01 # HT + 90 6 7 0.0920 -1.551350e+01 1.279400e+01 1.515240e+01 # HT + 91 7 1 -2.2897 4.518322e+00 6.121948e+00 -1.516985e+01 # CAT + 92 7 2 -2.3557 4.488764e+00 7.521332e+00 -1.519903e+01 # CAO + 93 7 3 -2.3537 5.681482e+00 8.244300e+00 -1.532045e+01 # CAM + 94 7 4 -2.3627 6.903755e+00 7.567885e+00 -1.541269e+01 # CAP + 95 7 3 -2.3537 6.933312e+00 6.168501e+00 -1.538351e+01 # CAM + 96 7 2 -2.3557 5.740596e+00 5.445533e+00 -1.526209e+01 # CAO + 97 7 5 -2.4057 3.231892e+00 5.342175e+00 -1.503889e+01 # CTT + 98 7 6 0.1480 3.545868e+00 8.043138e+00 -1.512787e+01 # HAT + 99 7 6 0.1480 5.658680e+00 9.323825e+00 -1.534296e+01 # HAT + 100 7 6 0.1480 7.823851e+00 8.125604e+00 -1.550636e+01 # HAT + 101 7 6 0.1480 7.876210e+00 5.646695e+00 -1.545467e+01 # HAT + 102 7 6 0.1480 5.763397e+00 4.366008e+00 -1.523958e+01 # HAT + 103 7 7 0.0920 2.417503e+00 5.904391e+00 -1.549582e+01 # HT + 104 7 7 0.0920 3.336239e+00 4.380933e+00 -1.554210e+01 # HT + 105 7 7 0.0920 3.011997e+00 5.177518e+00 -1.398408e+01 # HT + 106 8 1 -2.2897 -5.377166e+00 5.156898e+00 9.712011e+00 # CAT + 107 8 2 -2.3557 -4.563142e+00 4.268089e+00 1.042432e+01 # CAO + 108 8 3 -2.3537 -4.033520e+00 3.139720e+00 9.786916e+00 # CAM + 109 8 4 -2.3627 -4.317922e+00 2.900160e+00 8.437203e+00 # CAP + 110 8 3 -2.3537 -5.131946e+00 3.788968e+00 7.724894e+00 # CAM + 111 8 2 -2.3557 -5.661568e+00 4.917337e+00 8.362297e+00 # CAO + 112 8 5 -2.4057 -5.948401e+00 6.373924e+00 1.039950e+01 # CTT + 113 8 6 0.1480 -4.343746e+00 4.452893e+00 1.146553e+01 # HAT + 114 8 6 0.1480 -3.405558e+00 2.454068e+00 1.033641e+01 # HAT + 115 8 6 0.1480 -3.909356e+00 2.029703e+00 7.945491e+00 # HAT + 116 8 6 0.1480 -5.351342e+00 3.604164e+00 6.683686e+00 # HAT + 117 8 6 0.1480 -6.289530e+00 5.602989e+00 7.812802e+00 # HAT + 118 8 7 0.0920 -5.268241e+00 6.700153e+00 1.118630e+01 # HT + 119 8 7 0.0920 -6.074391e+00 7.176645e+00 9.672953e+00 # HT + 120 8 7 0.0920 -6.915505e+00 6.124740e+00 1.083621e+01 # HT + 121 9 1 -2.2897 -1.150352e+01 -2.635798e+00 -5.817707e+00 # CAT + 122 9 2 -2.3557 -1.078710e+01 -1.579569e+00 -6.393141e+00 # CAO + 123 9 3 -2.3537 -1.059426e+01 -1.537647e+00 -7.779162e+00 # CAM + 124 9 4 -2.3627 -1.111783e+01 -2.551955e+00 -8.589748e+00 # CAP + 125 9 3 -2.3537 -1.183425e+01 -3.608184e+00 -8.014314e+00 # CAM + 126 9 2 -2.3557 -1.202709e+01 -3.650106e+00 -6.628294e+00 # CAO + 127 9 5 -2.4057 -1.171151e+01 -2.681014e+00 -4.322784e+00 # CTT + 128 9 6 0.1480 -1.038320e+01 -7.971030e-01 -5.767832e+00 # HAT + 129 9 6 0.1480 -1.004159e+01 -7.228420e-01 -8.223068e+00 # HAT + 130 9 6 0.1480 -1.096906e+01 -2.519615e+00 -9.658965e+00 # HAT + 131 9 6 0.1480 -1.223815e+01 -4.390650e+00 -8.639624e+00 # HAT + 132 9 6 0.1480 -1.257976e+01 -4.464911e+00 -6.184387e+00 # HAT + 133 9 7 0.0920 -1.174239e+01 -1.665163e+00 -3.928835e+00 # HT + 134 9 7 0.0920 -1.265244e+01 -3.184759e+00 -4.101417e+00 # HT + 135 9 7 0.0920 -1.089007e+01 -3.225804e+00 -3.857451e+00 # HT + 136 10 1 -2.2897 1.392120e+01 -2.108610e+00 -1.308417e+01 # CAT + 137 10 2 -2.3557 1.254408e+01 -2.352254e+00 -1.301957e+01 # CAO + 138 10 3 -2.3537 1.197493e+01 -2.844561e+00 -1.183901e+01 # CAM + 139 10 4 -2.3627 1.278291e+01 -3.093223e+00 -1.072306e+01 # CAP + 140 10 3 -2.3537 1.416003e+01 -2.849579e+00 -1.078767e+01 # CAM + 141 10 2 -2.3557 1.472917e+01 -2.357272e+00 -1.196822e+01 # CAO + 142 10 5 -2.4057 1.453506e+01 -1.577622e+00 -1.435748e+01 # CTT + 143 10 6 0.1480 1.192078e+01 -2.160429e+00 -1.388044e+01 # HAT + 144 10 6 0.1480 1.091258e+01 -3.032515e+00 -1.178917e+01 # HAT + 145 10 6 0.1480 1.234385e+01 -3.473003e+00 -9.812350e+00 # HAT + 146 10 6 0.1480 1.478333e+01 -3.041404e+00 -9.926794e+00 # HAT + 147 10 6 0.1480 1.579153e+01 -2.169318e+00 -1.201806e+01 # HAT + 148 10 7 0.0920 1.380371e+01 -9.669060e-01 -1.488687e+01 # HT + 149 10 7 0.0920 1.540739e+01 -9.705890e-01 -1.411528e+01 # HT + 150 10 7 0.0920 1.483784e+01 -2.411529e+00 -1.499075e+01 # HT + 151 11 1 -2.2897 1.483606e+01 -2.727292e+00 -5.740444e+00 # CAT + 152 11 2 -2.3557 1.468234e+01 -3.925798e+00 -5.033370e+00 # CAO + 153 11 3 -2.3537 1.473882e+01 -3.925451e+00 -3.634509e+00 # CAM + 154 11 4 -2.3627 1.494901e+01 -2.726598e+00 -2.942723e+00 # CAP + 155 11 3 -2.3537 1.510273e+01 -1.528091e+00 -3.649797e+00 # CAM + 156 11 2 -2.3557 1.504626e+01 -1.528438e+00 -5.048657e+00 # CAO + 157 11 5 -2.4057 1.477515e+01 -2.727666e+00 -7.249214e+00 # CTT + 158 11 6 0.1480 1.452019e+01 -4.850628e+00 -5.567034e+00 # HAT + 159 11 6 0.1480 1.462023e+01 -4.850013e+00 -3.089052e+00 # HAT + 160 11 6 0.1480 1.499258e+01 -2.726330e+00 -1.863602e+00 # HAT + 161 11 6 0.1480 1.526488e+01 -6.032610e-01 -3.116133e+00 # HAT + 162 11 6 0.1480 1.516484e+01 -6.038770e-01 -5.594114e+00 # HAT + 163 11 7 0.0920 1.411943e+01 -3.530317e+00 -7.586688e+00 # HT + 164 11 7 0.0920 1.438651e+01 -1.770862e+00 -7.597908e+00 # HT + 165 11 7 0.0920 1.577547e+01 -2.882092e+00 -7.653708e+00 # HT + 166 12 1 -2.2897 -1.418351e+01 1.029711e+01 -6.488122e+00 # CAT + 167 12 2 -2.3557 -1.308377e+01 1.038532e+01 -5.626265e+00 # CAO + 168 12 3 -2.3537 -1.268345e+01 9.266821e+00 -4.885525e+00 # CAM + 169 12 4 -2.3627 -1.338286e+01 8.060110e+00 -5.006642e+00 # CAP + 170 12 3 -2.3537 -1.448259e+01 7.971898e+00 -5.868499e+00 # CAM + 171 12 2 -2.3557 -1.488292e+01 9.090399e+00 -6.609239e+00 # CAO + 172 12 5 -2.4057 -1.461529e+01 1.150349e+01 -7.287063e+00 # CTT + 173 12 6 0.1480 -1.254422e+01 1.131621e+01 -5.532832e+00 # HAT + 174 12 6 0.1480 -1.183508e+01 9.334869e+00 -4.220664e+00 # HAT + 175 12 6 0.1480 -1.307404e+01 7.197266e+00 -4.435213e+00 # HAT + 176 12 6 0.1480 -1.502214e+01 7.041006e+00 -5.961931e+00 # HAT + 177 12 6 0.1480 -1.573129e+01 9.022350e+00 -7.274100e+00 # HAT + 178 12 7 0.0920 -1.374758e+01 1.212724e+01 -7.501845e+00 # HT + 179 12 7 0.0920 -1.506800e+01 1.117687e+01 -8.223263e+00 # HT + 180 12 7 0.0920 -1.534240e+01 1.207844e+01 -6.713621e+00 # HT + 181 13 1 -2.2897 -4.403558e+00 -1.346616e+01 -9.613074e+00 # CAT + 182 13 2 -2.3557 -5.060220e+00 -1.343664e+01 -8.376982e+00 # CAO + 183 13 3 -2.3537 -4.680611e+00 -1.432230e+01 -7.361350e+00 # CAM + 184 13 4 -2.3627 -3.644342e+00 -1.523747e+01 -7.581810e+00 # CAP + 185 13 3 -2.3537 -2.987680e+00 -1.526699e+01 -8.817903e+00 # CAM + 186 13 2 -2.3557 -3.367288e+00 -1.438133e+01 -9.833535e+00 # CAO + 187 13 5 -2.4057 -4.812992e+00 -1.251091e+01 -1.070851e+01 # CTT + 188 13 6 0.1480 -5.859628e+00 -1.273065e+01 -8.206913e+00 # HAT + 189 13 6 0.1480 -5.187179e+00 -1.429953e+01 -6.407793e+00 # HAT + 190 13 6 0.1480 -3.351501e+00 -1.592069e+01 -6.798323e+00 # HAT + 191 13 6 0.1480 -2.188271e+00 -1.597298e+01 -8.987972e+00 # HAT + 192 13 6 0.1480 -2.860720e+00 -1.440410e+01 -1.078709e+01 # HAT + 193 13 7 0.0920 -5.192471e+00 -1.159020e+01 -1.026534e+01 # HT + 194 13 7 0.0920 -3.950005e+00 -1.228352e+01 -1.133432e+01 # HT + 195 13 7 0.0920 -5.592474e+00 -1.296848e+01 -1.131772e+01 # HT + 196 14 1 -2.2897 1.813791e+00 3.337542e+00 -6.732800e-01 # CAT + 197 14 2 -2.3557 1.154851e+00 2.140895e+00 -9.796040e-01 # CAO + 198 14 3 -2.3537 3.310130e-01 2.064694e+00 -2.108978e+00 # CAM + 199 14 4 -2.3627 1.661160e-01 3.185139e+00 -2.932027e+00 # CAP + 200 14 3 -2.3537 8.250570e-01 4.381786e+00 -2.625703e+00 # CAM + 201 14 2 -2.3557 1.648894e+00 4.457987e+00 -1.496330e+00 # CAO + 202 14 5 -2.4057 2.702359e+00 3.419730e+00 5.448300e-01 # CTT + 203 14 6 0.1480 1.282057e+00 1.276552e+00 -3.446800e-01 # HAT + 204 14 6 0.1480 -1.773120e-01 1.141567e+00 -2.345285e+00 # HAT + 205 14 6 0.1480 -4.694160e-01 3.126356e+00 -3.803259e+00 # HAT + 206 14 6 0.1480 6.978500e-01 5.246130e+00 -3.260628e+00 # HAT + 207 14 6 0.1480 2.157219e+00 5.381115e+00 -1.260023e+00 # HAT + 208 14 7 0.0920 3.137146e+00 2.440404e+00 7.447830e-01 # HT + 209 14 7 0.0920 3.499731e+00 4.140949e+00 3.655510e-01 # HT + 210 14 7 0.0920 2.112529e+00 3.737249e+00 1.404703e+00 # HT + 211 15 1 -2.2897 -1.490141e+01 -1.346290e+01 -7.801144e+00 # CAT + 212 15 2 -2.3557 -1.494447e+01 -1.206668e+01 -7.894572e+00 # CAO + 213 15 3 -2.3537 -1.510236e+01 -1.145320e+01 -9.143055e+00 # CAM + 214 15 4 -2.3627 -1.521717e+01 -1.223593e+01 -1.029811e+01 # CAP + 215 15 3 -2.3537 -1.517411e+01 -1.363214e+01 -1.020468e+01 # CAM + 216 15 2 -2.3557 -1.501623e+01 -1.424563e+01 -8.956200e+00 # CAO + 217 15 5 -2.4057 -1.473112e+01 -1.412459e+01 -6.454567e+00 # CTT + 218 15 6 0.1480 -1.485590e+01 -1.146287e+01 -7.003530e+00 # HAT + 219 15 6 0.1480 -1.513558e+01 -1.037612e+01 -9.215127e+00 # HAT + 220 15 6 0.1480 -1.533897e+01 -1.176267e+01 -1.126122e+01 # HAT + 221 15 6 0.1480 -1.526268e+01 -1.423596e+01 -1.109572e+01 # HAT + 222 15 6 0.1480 -1.498301e+01 -1.532271e+01 -8.884128e+00 # HAT + 223 15 7 0.0920 -1.517400e+01 -1.349626e+01 -5.681803e+00 # HT + 224 15 7 0.0920 -1.522666e+01 -1.509541e+01 -6.460946e+00 # HT + 225 15 7 0.0920 -1.366962e+01 -1.426041e+01 -6.247539e+00 # HT + 226 16 1 -2.2897 -1.304159e+00 -2.149027e+00 -8.322736e+00 # CAT + 227 16 2 -2.3557 -3.711000e-02 -1.761204e+00 -7.870871e+00 # CAO + 228 16 3 -2.3537 6.666540e-01 -2.576093e+00 -6.976069e+00 # CAM + 229 16 4 -2.3627 1.033700e-01 -3.778805e+00 -6.533131e+00 # CAP + 230 16 3 -2.3537 -1.163679e+00 -4.166628e+00 -6.984995e+00 # CAM + 231 16 2 -2.3557 -1.867443e+00 -3.351740e+00 -7.879797e+00 # CAO + 232 16 5 -2.4057 -2.063219e+00 -1.270111e+00 -9.287844e+00 # CTT + 233 16 6 0.1480 3.974230e-01 -8.333980e-01 -8.212566e+00 # HAT + 234 16 6 0.1480 1.644091e+00 -2.276916e+00 -6.627488e+00 # HAT + 235 16 6 0.1480 6.462740e-01 -4.407434e+00 -5.842854e+00 # HAT + 236 16 6 0.1480 -1.598212e+00 -5.094436e+00 -6.643300e+00 # HAT + 237 16 6 0.1480 -2.844880e+00 -3.650918e+00 -8.228378e+00 # HAT + 238 16 7 0.0920 -1.357992e+00 -7.215660e-01 -9.912227e+00 # HT + 239 16 7 0.0920 -2.701298e+00 -1.888882e+00 -9.918778e+00 # HT + 240 16 7 0.0920 -2.679075e+00 -5.645350e-01 -8.730185e+00 # HT + 241 17 1 -2.2897 -7.611989e+00 -7.448325e+00 -1.200176e+01 # CAT + 242 17 2 -2.3557 -6.822933e+00 -8.246950e+00 -1.116535e+01 # CAO + 243 17 3 -2.3537 -5.698847e+00 -7.701741e+00 -1.053354e+01 # CAM + 244 17 4 -2.3627 -5.363817e+00 -6.357907e+00 -1.073815e+01 # CAP + 245 17 3 -2.3537 -6.152873e+00 -5.559282e+00 -1.157457e+01 # CAM + 246 17 2 -2.3557 -7.276959e+00 -6.104491e+00 -1.220637e+01 # CAO + 247 17 5 -2.4057 -8.824397e+00 -8.036372e+00 -1.268321e+01 # CTT + 248 17 6 0.1480 -7.081385e+00 -9.283622e+00 -1.100751e+01 # HAT + 249 17 6 0.1480 -5.090147e+00 -8.317823e+00 -9.888309e+00 # HAT + 250 17 6 0.1480 -4.496664e+00 -5.937317e+00 -1.025076e+01 # HAT + 251 17 6 0.1480 -5.894421e+00 -4.522610e+00 -1.173241e+01 # HAT + 252 17 6 0.1480 -7.885659e+00 -5.488409e+00 -1.285160e+01 # HAT + 253 17 7 0.0920 -9.240665e+00 -8.830581e+00 -1.206349e+01 # HT + 254 17 7 0.0920 -9.573881e+00 -7.258201e+00 -1.282751e+01 # HT + 255 17 7 0.0920 -8.535069e+00 -8.445421e+00 -1.365123e+01 # HT + 256 18 1 -2.2897 7.923460e+00 1.302445e+01 1.357670e+00 # CAT + 257 18 2 -2.3557 6.852707e+00 1.375915e+01 8.345080e-01 # CAO + 258 18 3 -2.3537 7.062252e+00 1.463533e+01 -2.371250e-01 # CAM + 259 18 4 -2.3627 8.342551e+00 1.477681e+01 -7.855940e-01 # CAP + 260 18 3 -2.3537 9.413304e+00 1.404211e+01 -2.624310e-01 # CAM + 261 18 2 -2.3557 9.203759e+00 1.316593e+01 8.092010e-01 # CAO + 262 18 5 -2.4057 7.697451e+00 1.207943e+01 2.513502e+00 # CTT + 263 18 6 0.1480 5.865048e+00 1.365001e+01 1.257612e+00 # HAT + 264 18 6 0.1480 6.236242e+00 1.520210e+01 -6.407080e-01 # HAT + 265 18 6 0.1480 8.504200e+00 1.545273e+01 -1.612282e+00 # HAT + 266 18 6 0.1480 1.040096e+01 1.415125e+01 -6.855360e-01 # HAT + 267 18 6 0.1480 1.002977e+01 1.259916e+01 1.212783e+00 # HAT + 268 18 7 0.0920 6.680698e+00 1.168893e+01 2.470753e+00 # HT + 269 18 7 0.0920 8.406167e+00 1.125356e+01 2.452180e+00 # HT + 270 18 7 0.0920 7.842109e+00 1.261265e+01 3.453100e+00 # HT + 271 19 1 -2.2897 -2.186224e+00 -1.425547e+01 -5.395257e+00 # CAT + 272 19 2 -2.3557 -3.218403e+00 -1.332156e+01 -5.245537e+00 # CAO + 273 19 3 -2.3537 -3.525908e+00 -1.244425e+01 -6.292331e+00 # CAM + 274 19 4 -2.3627 -2.801235e+00 -1.250086e+01 -7.488843e+00 # CAP + 275 19 3 -2.3537 -1.769056e+00 -1.343477e+01 -7.638563e+00 # CAM + 276 19 2 -2.3557 -1.461551e+00 -1.431207e+01 -6.591770e+00 # CAO + 277 19 5 -2.4057 -1.854558e+00 -1.520170e+01 -4.266216e+00 # CTT + 278 19 6 0.1480 -3.777437e+00 -1.327789e+01 -4.322513e+00 # HAT + 279 19 6 0.1480 -4.322161e+00 -1.172381e+01 -6.176832e+00 # HAT + 280 19 6 0.1480 -3.038453e+00 -1.182408e+01 -8.296370e+00 # HAT + 281 19 6 0.1480 -1.210022e+00 -1.347844e+01 -8.561588e+00 # HAT + 282 19 6 0.1480 -6.652980e-01 -1.503252e+01 -6.707269e+00 # HAT + 283 19 7 0.0920 -2.754968e+00 -1.540718e+01 -3.687303e+00 # HT + 284 19 7 0.0920 -1.465590e+00 -1.613414e+01 -4.675322e+00 # HT + 285 19 7 0.0920 -1.103360e+00 -1.474780e+01 -3.619859e+00 # HT + 286 20 1 -2.2897 -1.346451e+00 6.661046e+00 8.787523e+00 # CAT + 287 20 2 -2.3557 -6.521460e-01 7.709245e+00 9.403331e+00 # CAO + 288 20 3 -2.3537 5.137470e-01 8.216290e+00 8.817157e+00 # CAM + 289 20 4 -2.3627 9.853350e-01 7.675137e+00 7.615177e+00 # CAP + 290 20 3 -2.3537 2.910300e-01 6.626938e+00 6.999369e+00 # CAM + 291 20 2 -2.3557 -8.748630e-01 6.119893e+00 7.585541e+00 # CAO + 292 20 5 -2.4057 -2.603949e+00 6.114161e+00 9.419752e+00 # CTT + 293 20 6 0.1480 -1.015941e+00 8.126706e+00 1.033057e+01 # HAT + 294 20 6 0.1480 1.049354e+00 9.024901e+00 9.292209e+00 # HAT + 295 20 6 0.1480 1.884738e+00 8.066287e+00 7.162986e+00 # HAT + 296 20 6 0.1480 6.548260e-01 6.209477e+00 6.072126e+00 # HAT + 297 20 6 0.1480 -1.410470e+00 5.311282e+00 7.110489e+00 # HAT + 298 20 7 0.0920 -3.105695e+00 6.906086e+00 9.975816e+00 # HT + 299 20 7 0.0920 -3.269150e+00 5.739638e+00 8.641716e+00 # HT + 300 20 7 0.0920 -2.346023e+00 5.301427e+00 1.009875e+01 # HT + 301 21 1 -2.2897 -6.695500e-01 6.618239e+00 1.261271e+01 # CAT + 302 21 2 -2.3557 1.759880e-01 7.733820e+00 1.258937e+01 # CAO + 303 21 3 -2.3537 -3.674810e-01 9.023277e+00 1.254529e+01 # CAM + 304 21 4 -2.3627 -1.756486e+00 9.197152e+00 1.252454e+01 # CAP + 305 21 3 -2.3537 -2.602023e+00 8.081571e+00 1.254787e+01 # CAM + 306 21 2 -2.3557 -2.058556e+00 6.792114e+00 1.259196e+01 # CAO + 307 21 5 -2.4057 -8.338100e-02 5.227468e+00 1.266026e+01 # CTT + 308 21 6 0.1480 1.247506e+00 7.599688e+00 1.260538e+01 # HAT + 309 21 6 0.1480 2.847910e-01 9.883868e+00 1.252728e+01 # HAT + 310 21 6 0.1480 -2.175733e+00 1.019188e+01 1.249052e+01 # HAT + 311 21 6 0.1480 -3.673543e+00 8.215703e+00 1.253186e+01 # HAT + 312 21 6 0.1480 -2.710827e+00 5.931523e+00 1.260996e+01 # HAT + 313 21 7 0.0920 8.720660e-01 5.253034e+00 1.318426e+01 # HT + 314 21 7 0.0920 -7.678960e-01 4.561903e+00 1.318615e+01 # HT + 315 21 7 0.0920 6.941900e-02 4.862105e+00 1.164475e+01 # HT + 316 22 1 -2.2897 3.267763e+00 -7.412651e+00 -5.063502e+00 # CAT + 317 22 2 -2.3557 4.097818e+00 -7.104204e+00 -3.979127e+00 # CAO + 318 22 3 -2.3537 5.248325e+00 -6.331161e+00 -4.175947e+00 # CAM + 319 22 4 -2.3627 5.568777e+00 -5.866566e+00 -5.457142e+00 # CAP + 320 22 3 -2.3537 4.738722e+00 -6.175013e+00 -6.541517e+00 # CAM + 321 22 2 -2.3557 3.588215e+00 -6.948055e+00 -6.344697e+00 # CAO + 322 22 5 -2.4057 2.026859e+00 -8.246432e+00 -4.851217e+00 # CTT + 323 22 6 0.1480 3.850612e+00 -7.462606e+00 -2.990776e+00 # HAT + 324 22 6 0.1480 5.888653e+00 -6.093216e+00 -3.339430e+00 # HAT + 325 22 6 0.1480 6.456312e+00 -5.270218e+00 -5.608975e+00 # HAT + 326 22 6 0.1480 4.985929e+00 -5.816610e+00 -7.529868e+00 # HAT + 327 22 6 0.1480 2.947887e+00 -7.186000e+00 -7.181215e+00 # HAT + 328 22 7 0.0920 1.642767e+00 -8.077600e+00 -3.845200e+00 # HT + 329 22 7 0.0920 1.268763e+00 -7.963000e+00 -5.581325e+00 # HT + 330 22 7 0.0920 2.272021e+00 -9.301421e+00 -4.973670e+00 # HT + 331 23 1 -2.2897 -1.396646e+01 1.398547e+01 -1.488841e+01 # CAT + 332 23 2 -2.3557 -1.260950e+01 1.432984e+01 -1.488085e+01 # CAO + 333 23 3 -2.3537 -1.163478e+01 1.333847e+01 -1.504552e+01 # CAM + 334 23 4 -2.3627 -1.201703e+01 1.200272e+01 -1.521775e+01 # CAP + 335 23 3 -2.3537 -1.337400e+01 1.165835e+01 -1.522532e+01 # CAM + 336 23 2 -2.3557 -1.434871e+01 1.264972e+01 -1.506065e+01 # CAO + 337 23 5 -2.4057 -1.501776e+01 1.505473e+01 -1.471081e+01 # CTT + 338 23 6 0.1480 -1.231462e+01 1.536028e+01 -1.474798e+01 # HAT + 339 23 6 0.1480 -1.058798e+01 1.360413e+01 -1.503968e+01 # HAT + 340 23 6 0.1480 -1.126511e+01 1.123795e+01 -1.534478e+01 # HAT + 341 23 6 0.1480 -1.366887e+01 1.062792e+01 -1.535819e+01 # HAT + 342 23 6 0.1480 -1.539551e+01 1.238406e+01 -1.506649e+01 # HAT + 343 23 7 0.0920 -1.464775e+01 1.599878e+01 -1.511078e+01 # HT + 344 23 7 0.0920 -1.592418e+01 1.476572e+01 -1.524274e+01 # HT + 345 23 7 0.0920 -1.524129e+01 1.517266e+01 -1.365051e+01 # HT + 346 24 1 -2.2897 7.073328e+00 3.274310e-01 1.124904e+01 # CAT + 347 24 2 -2.3557 6.704396e+00 -8.240710e-01 1.054339e+01 # CAO + 348 24 3 -2.3537 7.426782e+00 -2.011111e+00 1.071397e+01 # CAM + 349 24 4 -2.3627 8.518099e+00 -2.046648e+00 1.159019e+01 # CAP + 350 24 3 -2.3537 8.887030e+00 -8.951470e-01 1.229584e+01 # CAM + 351 24 2 -2.3557 8.164646e+00 2.918920e-01 1.212526e+01 # CAO + 352 24 5 -2.4057 6.294184e+00 1.607737e+00 1.106506e+01 # CTT + 353 24 6 0.1480 5.862523e+00 -7.966560e-01 9.867451e+00 # HAT + 354 24 6 0.1480 7.142177e+00 -2.899412e+00 1.016962e+01 # HAT + 355 24 6 0.1480 9.075368e+00 -2.962365e+00 1.172178e+01 # HAT + 356 24 6 0.1480 9.728904e+00 -9.225620e-01 1.297178e+01 # HAT + 357 24 6 0.1480 8.449250e+00 1.180194e+00 1.266961e+01 # HAT + 358 24 7 0.0920 5.257627e+00 1.371496e+00 1.082456e+01 # HT + 359 24 7 0.0920 6.329323e+00 2.190517e+00 1.198551e+01 # HT + 360 24 7 0.0920 6.732373e+00 2.186707e+00 1.025211e+01 # HT + 361 25 1 -2.2897 1.404970e+01 9.282252e+00 -6.988980e-01 # CAT + 362 25 2 -2.3557 1.397606e+01 8.699221e+00 5.717920e-01 # CAO + 363 25 3 -2.3537 1.297396e+01 9.094110e+00 1.466140e+00 # CAM + 364 25 4 -2.3627 1.204550e+01 1.007203e+01 1.089798e+00 # CAP + 365 25 3 -2.3537 1.211914e+01 1.065506e+01 -1.808920e-01 # CAM + 366 25 2 -2.3557 1.312124e+01 1.026017e+01 -1.075239e+00 # CAO + 367 25 5 -2.4057 1.513054e+01 8.856337e+00 -1.663516e+00 # CTT + 368 25 6 0.1480 1.469230e+01 7.944826e+00 8.621120e-01 # HAT + 369 25 6 0.1480 1.291715e+01 8.644343e+00 2.446386e+00 # HAT + 370 25 6 0.1480 1.127245e+01 1.037666e+01 1.779723e+00 # HAT + 371 25 6 0.1480 1.140290e+01 1.140946e+01 -4.712120e-01 # HAT + 372 25 6 0.1480 1.317805e+01 1.070994e+01 -2.055486e+00 # HAT + 373 25 7 0.0920 1.539497e+01 7.815443e+00 -1.477193e+00 # HT + 374 25 7 0.0920 1.476761e+01 8.961046e+00 -2.685972e+00 # HT + 375 25 7 0.0920 1.601035e+01 9.484634e+00 -1.524685e+00 # HT + 376 26 1 -2.2897 3.982353e+00 5.958042e+00 1.417544e+01 # CAT + 377 26 2 -2.3557 3.685958e+00 6.519328e+00 1.292760e+01 # CAO + 378 26 3 -2.3537 4.184851e+00 7.783769e+00 1.259249e+01 # CAM + 379 26 4 -2.3627 4.980137e+00 8.486925e+00 1.350523e+01 # CAP + 380 26 3 -2.3537 5.276532e+00 7.925639e+00 1.475308e+01 # CAM + 381 26 2 -2.3557 4.777639e+00 6.661198e+00 1.508818e+01 # CAO + 382 26 5 -2.4057 3.444262e+00 4.594252e+00 1.453687e+01 # CTT + 383 26 6 0.1480 3.072452e+00 5.976894e+00 1.222349e+01 # HAT + 384 26 6 0.1480 3.956204e+00 8.216761e+00 1.162987e+01 # HAT + 385 26 6 0.1480 5.364998e+00 9.462351e+00 1.324672e+01 # HAT + 386 26 6 0.1480 5.890039e+00 8.468074e+00 1.545719e+01 # HAT + 387 26 6 0.1480 5.006286e+00 6.228207e+00 1.605080e+01 # HAT + 388 26 7 0.0920 3.334621e+00 3.995093e+00 1.363294e+01 # HT + 389 26 7 0.0920 4.135821e+00 4.099214e+00 1.521862e+01 # HT + 390 26 7 0.0920 2.473367e+00 4.702592e+00 1.502033e+01 # HT + 391 27 1 -2.2897 -8.156929e+00 -6.727910e-01 1.041336e+01 # CAT + 392 27 2 -2.3557 -7.256069e+00 -1.681662e+00 1.005193e+01 # CAO + 393 27 3 -2.3537 -5.889993e+00 -1.394764e+00 9.944572e+00 # CAM + 394 27 4 -2.3627 -5.424776e+00 -9.899400e-02 1.019865e+01 # CAP + 395 27 3 -2.3537 -6.325636e+00 9.098770e-01 1.056008e+01 # CAM + 396 27 2 -2.3557 -7.691711e+00 6.229790e-01 1.066743e+01 # CAO + 397 27 5 -2.4057 -9.630339e+00 -9.822310e-01 1.052914e+01 # CTT + 398 27 6 0.1480 -7.614950e+00 -2.681256e+00 9.855926e+00 # HAT + 399 27 6 0.1480 -5.195044e+00 -2.173036e+00 9.665756e+00 # HAT + 400 27 6 0.1480 -4.370945e+00 1.223280e-01 1.011583e+01 # HAT + 401 27 6 0.1480 -5.966754e+00 1.909471e+00 1.075608e+01 # HAT + 402 27 6 0.1480 -8.386660e+00 1.401251e+00 1.094625e+01 # HAT + 403 27 7 0.0920 -9.761346e+00 -2.022664e+00 1.082653e+01 # HT + 404 27 7 0.0920 -1.008107e+01 -3.312560e-01 1.127826e+01 # HT + 405 27 7 0.0920 -1.011370e+01 -8.164640e-01 9.566345e+00 # HT + 406 28 1 -2.2897 1.090031e+01 5.485730e-01 -1.378836e+00 # CAT + 407 28 2 -2.3557 1.165724e+01 5.792750e-01 -2.015000e-01 # CAO + 408 28 3 -2.3537 1.120518e+01 1.312097e+00 9.024110e-01 # CAM + 409 28 4 -2.3627 9.996198e+00 2.014216e+00 8.289840e-01 # CAP + 410 28 3 -2.3537 9.239272e+00 1.983514e+00 -3.483520e-01 # CAM + 411 28 2 -2.3557 9.691327e+00 1.250693e+00 -1.452262e+00 # CAO + 412 28 5 -2.4057 1.138788e+01 -2.418270e-01 -2.569483e+00 # CTT + 413 28 6 0.1480 1.258988e+01 3.764000e-02 -1.448570e-01 # HAT + 414 28 6 0.1480 1.178909e+01 1.335781e+00 1.810641e+00 # HAT + 415 28 6 0.1480 9.647468e+00 2.579535e+00 1.680573e+00 # HAT + 416 28 6 0.1480 8.306628e+00 2.525149e+00 -4.049940e-01 # HAT + 417 28 6 0.1480 9.107413e+00 1.227009e+00 -2.360493e+00 # HAT + 418 28 7 0.0920 1.197590e+01 -1.092643e+00 -2.225321e+00 # HT + 419 28 7 0.0920 1.053310e+01 -5.998800e-01 -3.143272e+00 # HT + 420 28 7 0.0920 1.200711e+01 3.956780e-01 -3.200549e+00 # HT + 421 29 1 -2.2897 1.363202e+01 -6.775318e+00 -1.215244e+01 # CAT + 422 29 2 -2.3557 1.403126e+01 -7.995461e+00 -1.271088e+01 # CAO + 423 29 3 -2.3537 1.331979e+01 -9.165234e+00 -1.241857e+01 # CAM + 424 29 4 -2.3627 1.220908e+01 -9.114862e+00 -1.156781e+01 # CAP + 425 29 3 -2.3537 1.180984e+01 -7.894719e+00 -1.100937e+01 # CAM + 426 29 2 -2.3557 1.252130e+01 -6.724947e+00 -1.130169e+01 # CAO + 427 29 5 -2.4057 1.439938e+01 -5.513635e+00 -1.246773e+01 # CTT + 428 29 6 0.1480 1.488809e+01 -8.034319e+00 -1.336718e+01 # HAT + 429 29 6 0.1480 1.362778e+01 -1.010649e+01 -1.284936e+01 # HAT + 430 29 6 0.1480 1.166024e+01 -1.001726e+01 -1.134231e+01 # HAT + 431 29 6 0.1480 1.095300e+01 -7.855862e+00 -1.035308e+01 # HAT + 432 29 6 0.1480 1.221331e+01 -5.783694e+00 -1.087089e+01 # HAT + 433 29 7 0.0920 1.483271e+01 -5.590916e+00 -1.346490e+01 # HT + 434 29 7 0.0920 1.372454e+01 -4.658468e+00 -1.243067e+01 # HT + 435 29 7 0.0920 1.519561e+01 -5.379476e+00 -1.173552e+01 # HT + 436 30 1 -2.2897 1.311201e+01 -4.467822e+00 7.465110e+00 # CAT + 437 30 2 -2.3557 1.442032e+01 -4.250114e+00 7.016857e+00 # CAO + 438 30 3 -2.3537 1.493802e+01 -2.950089e+00 6.972985e+00 # CAM + 439 30 4 -2.3627 1.414741e+01 -1.867773e+00 7.377365e+00 # CAP + 440 30 3 -2.3537 1.283910e+01 -2.085480e+00 7.825617e+00 # CAM + 441 30 2 -2.3557 1.232140e+01 -3.385504e+00 7.869490e+00 # CAO + 442 30 5 -2.4057 1.255364e+01 -5.869991e+00 7.512429e+00 # CTT + 443 30 6 0.1480 1.503022e+01 -5.085044e+00 6.704907e+00 # HAT + 444 30 6 0.1480 1.594729e+01 -2.782143e+00 6.627190e+00 # HAT + 445 30 6 0.1480 1.454678e+01 -8.648960e-01 7.343520e+00 # HAT + 446 30 6 0.1480 1.222920e+01 -1.250549e+00 8.137568e+00 # HAT + 447 30 6 0.1480 1.131213e+01 -3.553450e+00 8.215285e+00 # HAT + 448 30 7 0.0920 1.336279e+01 -6.577996e+00 7.691616e+00 # HT + 449 30 7 0.0920 1.182236e+01 -5.943447e+00 8.317375e+00 # HT + 450 30 7 0.0920 1.207213e+01 -6.102132e+00 6.562503e+00 # HT + 451 31 1 -2.2897 -6.823581e+00 1.490997e+01 -8.926240e+00 # CAT + 452 31 2 -2.3557 -7.713620e+00 1.544262e+01 -7.985965e+00 # CAO + 453 31 3 -2.3537 -7.390246e+00 1.541864e+01 -6.624034e+00 # CAM + 454 31 4 -2.3627 -6.176835e+00 1.486200e+01 -6.202379e+00 # CAP + 455 31 3 -2.3537 -5.286797e+00 1.432935e+01 -7.142653e+00 # CAM + 456 31 2 -2.3557 -5.610169e+00 1.435334e+01 -8.504583e+00 # CAO + 457 31 5 -2.4057 -7.172362e+00 1.493584e+01 -1.039518e+01 # CTT + 458 31 6 0.1480 -8.649680e+00 1.587202e+01 -8.311242e+00 # HAT + 459 31 6 0.1480 -8.076848e+00 1.582954e+01 -5.898680e+00 # HAT + 460 31 6 0.1480 -5.927376e+00 1.484350e+01 -5.151746e+00 # HAT + 461 31 6 0.1480 -4.350736e+00 1.389995e+01 -6.817375e+00 # HAT + 462 31 6 0.1480 -4.923568e+00 1.394244e+01 -9.229938e+00 # HAT + 463 31 7 0.0920 -7.801895e+00 1.580069e+01 -1.060450e+01 # HT + 464 31 7 0.0920 -6.258144e+00 1.500125e+01 -1.098512e+01 # HT + 465 31 7 0.0920 -7.709173e+00 1.402426e+01 -1.065779e+01 # HT + 466 32 1 -2.2897 1.411995e+01 1.456169e+01 1.351718e+01 # CAT + 467 32 2 -2.3557 1.297633e+01 1.522716e+01 1.305969e+01 # CAO + 468 32 3 -2.3537 1.266342e+01 1.522396e+01 1.169511e+01 # CAM + 469 32 4 -2.3627 1.349413e+01 1.455529e+01 1.078802e+01 # CAP + 470 32 3 -2.3537 1.463775e+01 1.388982e+01 1.124551e+01 # CAM + 471 32 2 -2.3557 1.495065e+01 1.389302e+01 1.261009e+01 # CAO + 472 32 5 -2.4057 1.445745e+01 1.456514e+01 1.498898e+01 # CTT + 473 32 6 0.1480 1.233550e+01 1.574299e+01 1.375944e+01 # HAT + 474 32 6 0.1480 1.178121e+01 1.573732e+01 1.134219e+01 # HAT + 475 32 6 0.1480 1.325274e+01 1.455282e+01 9.735345e+00 # HAT + 476 32 6 0.1480 1.527858e+01 1.337399e+01 1.054575e+01 # HAT + 477 32 6 0.1480 1.583287e+01 1.337966e+01 1.296301e+01 # HAT + 478 32 7 0.0920 1.353899e+01 1.462655e+01 1.557274e+01 # HT + 479 32 7 0.0920 1.498797e+01 1.364741e+01 1.524277e+01 # HT + 480 32 7 0.0920 1.508934e+01 1.542396e+01 1.521536e+01 # HT + 481 33 1 -2.2897 3.215304e+00 1.411064e+01 -1.236815e+01 # CAT + 482 33 2 -2.3557 3.329978e+00 1.277388e+01 -1.276805e+01 # CAO + 483 33 3 -2.3537 4.588659e+00 1.216269e+01 -1.281470e+01 # CAM + 484 33 4 -2.3627 5.732666e+00 1.288827e+01 -1.246145e+01 # CAP + 485 33 3 -2.3537 5.617992e+00 1.422503e+01 -1.206155e+01 # CAM + 486 33 2 -2.3557 4.359312e+00 1.483621e+01 -1.201490e+01 # CAO + 487 33 5 -2.4057 1.857727e+00 1.476984e+01 -1.231784e+01 # CTT + 488 33 6 0.1480 2.447459e+00 1.221415e+01 -1.304056e+01 # HAT + 489 33 6 0.1480 4.677122e+00 1.113148e+01 -1.312319e+01 # HAT + 490 33 6 0.1480 6.703648e+00 1.241678e+01 -1.249743e+01 # HAT + 491 33 6 0.1480 6.500512e+00 1.478476e+01 -1.178904e+01 # HAT + 492 33 6 0.1480 4.270849e+00 1.586743e+01 -1.170641e+01 # HAT + 493 33 7 0.0920 1.097783e+00 1.402117e+01 -1.209406e+01 # HT + 494 33 7 0.0920 1.853225e+00 1.553475e+01 -1.154131e+01 # HT + 495 33 7 0.0920 1.640808e+00 1.523013e+01 -1.328178e+01 # HT + 496 34 1 -2.2897 3.000548e+00 1.515891e+01 2.865667e+00 # CAT + 497 34 2 -2.3557 2.835921e+00 1.496898e+01 1.488415e+00 # CAO + 498 34 3 -2.3537 1.554469e+00 1.500150e+01 9.255440e-01 # CAM + 499 34 4 -2.3627 4.376440e-01 1.522395e+01 1.739926e+00 # CAP + 500 34 3 -2.3537 6.022710e-01 1.541388e+01 3.117178e+00 # CAM + 501 34 2 -2.3557 1.883722e+00 1.538136e+01 3.680049e+00 # CAO + 502 34 5 -2.4057 4.382685e+00 1.512384e+01 3.472763e+00 # CTT + 503 34 6 0.1480 3.697471e+00 1.479738e+01 8.601770e-01 # HAT + 504 34 6 0.1480 1.427471e+00 1.485498e+01 -1.369080e-01 # HAT + 505 34 6 0.1480 -5.509050e-01 1.524903e+01 1.305711e+00 # HAT + 506 34 6 0.1480 -2.592810e-01 1.558548e+01 3.745416e+00 # HAT + 507 34 6 0.1480 2.010720e+00 1.552788e+01 4.742501e+00 # HAT + 508 34 7 0.0920 5.111052e+00 1.547018e+01 2.739529e+00 # HT + 509 34 7 0.0920 4.412221e+00 1.577283e+01 4.348000e+00 # HT + 510 34 7 0.0920 4.623902e+00 1.410316e+01 3.769617e+00 # HT + 511 35 1 -2.2897 -8.172544e+00 -1.299712e+01 -3.742319e+00 # CAT + 512 35 2 -2.3557 -8.933558e+00 -1.351687e+01 -4.796228e+00 # CAO + 513 35 3 -2.3537 -8.454042e+00 -1.460443e+01 -5.536013e+00 # CAM + 514 35 4 -2.3627 -7.213514e+00 -1.517224e+01 -5.221888e+00 # CAP + 515 35 3 -2.3537 -6.452500e+00 -1.465250e+01 -4.167979e+00 # CAM + 516 35 2 -2.3557 -6.932015e+00 -1.356494e+01 -3.428195e+00 # CAO + 517 35 5 -2.4057 -8.689735e+00 -1.182411e+01 -2.944409e+00 # CTT + 518 35 6 0.1480 -9.890537e+00 -1.307884e+01 -5.038553e+00 # HAT + 519 35 6 0.1480 -9.041110e+00 -1.500537e+01 -6.349028e+00 # HAT + 520 35 6 0.1480 -6.843602e+00 -1.601121e+01 -5.792579e+00 # HAT + 521 35 6 0.1480 -5.495520e+00 -1.509052e+01 -3.925655e+00 # HAT + 522 35 6 0.1480 -6.344947e+00 -1.316399e+01 -2.615180e+00 # HAT + 523 35 7 0.0920 -9.779371e+00 -1.184717e+01 -2.928226e+00 # HT + 524 35 7 0.0920 -8.310411e+00 -1.188245e+01 -1.924208e+00 # HT + 525 35 7 0.0920 -8.353290e+00 -1.089477e+01 -3.403999e+00 # HT + 526 36 1 -2.2897 9.752079e+00 1.395551e+01 1.150840e+01 # CAT + 527 36 2 -2.3557 1.053444e+01 1.379872e+01 1.265876e+01 # CAO + 528 36 3 -2.3537 1.008963e+01 1.431168e+01 1.388310e+01 # CAM + 529 36 4 -2.3627 8.862450e+00 1.498143e+01 1.395708e+01 # CAP + 530 36 3 -2.3537 8.080087e+00 1.513822e+01 1.280672e+01 # CAM + 531 36 2 -2.3557 8.524902e+00 1.462526e+01 1.158238e+01 # CAO + 532 36 5 -2.4057 1.023184e+01 1.340225e+01 1.018786e+01 # CTT + 533 36 6 0.1480 1.148112e+01 1.328206e+01 1.260168e+01 # HAT + 534 36 6 0.1480 1.069316e+01 1.419073e+01 1.477052e+01 # HAT + 535 36 6 0.1480 8.519306e+00 1.537714e+01 1.490157e+01 # HAT + 536 36 6 0.1480 7.133407e+00 1.565488e+01 1.286380e+01 # HAT + 537 36 6 0.1480 7.921365e+00 1.474621e+01 1.069496e+01 # HAT + 538 36 7 0.0920 1.084817e+01 1.252085e+01 1.036500e+01 # HT + 539 36 7 0.0920 9.373337e+00 1.312746e+01 9.575030e+00 # HT + 540 36 7 0.0920 1.082084e+01 1.415850e+01 9.668949e+00 # HT + 541 37 1 -2.2897 6.562359e+00 -9.208247e+00 -1.006677e+01 # CAT + 542 37 2 -2.3557 6.568936e+00 -1.026614e+01 -1.098374e+01 # CAO + 543 37 3 -2.3537 5.360046e+00 -1.078344e+01 -1.146435e+01 # CAM + 544 37 4 -2.3627 4.144580e+00 -1.024286e+01 -1.102799e+01 # CAP + 545 37 3 -2.3537 4.138003e+00 -9.184968e+00 -1.011102e+01 # CAM + 546 37 2 -2.3557 5.346892e+00 -8.667663e+00 -9.630414e+00 # CAO + 547 37 5 -2.4057 7.866232e+00 -8.650297e+00 -9.548406e+00 # CTT + 548 37 6 0.1480 7.506581e+00 -1.068316e+01 -1.132036e+01 # HAT + 549 37 6 0.1480 5.365120e+00 -1.159953e+01 -1.217172e+01 # HAT + 550 37 6 0.1480 3.212008e+00 -1.064192e+01 -1.139874e+01 # HAT + 551 37 6 0.1480 3.200357e+00 -8.767946e+00 -9.774400e+00 # HAT + 552 37 6 0.1480 5.341818e+00 -7.851577e+00 -8.923040e+00 # HAT + 553 37 7 0.0920 8.639165e+00 -8.765964e+00 -1.030821e+01 # HT + 554 37 7 0.0920 7.742290e+00 -7.592822e+00 -9.314982e+00 # HT + 555 37 7 0.0920 8.159786e+00 -9.188772e+00 -8.647312e+00 # HT + 556 38 1 -2.2897 -4.019183e+00 1.916059e+00 -7.112550e-01 # CAT + 557 38 2 -2.3557 -4.483269e+00 1.194991e+00 3.954000e-01 # CAO + 558 38 3 -2.3537 -5.706562e+00 1.531552e+00 9.872470e-01 # CAM + 559 38 4 -2.3627 -6.465768e+00 2.589180e+00 4.724390e-01 # CAP + 560 38 3 -2.3537 -6.001682e+00 3.310248e+00 -6.342160e-01 # CAM + 561 38 2 -2.3557 -4.778390e+00 2.973688e+00 -1.226063e+00 # CAO + 562 38 5 -2.4057 -2.699775e+00 1.553054e+00 -1.349604e+00 # CTT + 563 38 6 0.1480 -3.897596e+00 3.791060e-01 7.925370e-01 # HAT + 564 38 6 0.1480 -6.064571e+00 9.753000e-01 1.840952e+00 # HAT + 565 38 6 0.1480 -7.409451e+00 2.848813e+00 9.290060e-01 # HAT + 566 38 6 0.1480 -6.587355e+00 4.126134e+00 -1.031354e+00 # HAT + 567 38 6 0.1480 -4.420381e+00 3.529940e+00 -2.079768e+00 # HAT + 568 38 7 0.0920 -2.515446e+00 4.862790e-01 -1.222658e+00 # HT + 569 38 7 0.0920 -2.732039e+00 1.791689e+00 -2.412672e+00 # HT + 570 38 7 0.0920 -1.898066e+00 2.118784e+00 -8.749340e-01 # HT + 571 39 1 -2.2897 -1.255099e+01 -1.432022e+01 1.295543e+01 # CAT + 572 39 2 -2.3557 -1.207889e+01 -1.486004e+01 1.415781e+01 # CAO + 573 39 3 -2.3537 -1.070272e+01 -1.490979e+01 1.441019e+01 # CAM + 574 39 4 -2.3627 -9.798659e+00 -1.441972e+01 1.346019e+01 # CAP + 575 39 3 -2.3537 -1.027076e+01 -1.387990e+01 1.225781e+01 # CAM + 576 39 2 -2.3557 -1.164692e+01 -1.383015e+01 1.200543e+01 # CAO + 577 39 5 -2.4057 -1.403528e+01 -1.426656e+01 1.268322e+01 # CTT + 578 39 6 0.1480 -1.277631e+01 -1.523809e+01 1.489067e+01 # HAT + 579 39 6 0.1480 -1.033853e+01 -1.532622e+01 1.533774e+01 # HAT + 580 39 6 0.1480 -8.737046e+00 -1.445810e+01 1.365488e+01 # HAT + 581 39 6 0.1480 -9.573338e+00 -1.350185e+01 1.152495e+01 # HAT + 582 39 6 0.1480 -1.201112e+01 -1.341372e+01 1.107788e+01 # HAT + 583 39 7 0.0920 -1.457458e+01 -1.416682e+01 1.362519e+01 # HT + 584 39 7 0.0920 -1.425755e+01 -1.341097e+01 1.204553e+01 # HT + 585 39 7 0.0920 -1.434667e+01 -1.518312e+01 1.218216e+01 # HT + 586 40 1 -2.2897 -1.288795e+01 -5.477285e+00 -2.280075e+00 # CAT + 587 40 2 -2.3557 -1.196205e+01 -5.955224e+00 -3.215111e+00 # CAO + 588 40 3 -2.3537 -1.236716e+01 -6.864406e+00 -4.199627e+00 # CAM + 589 40 4 -2.3627 -1.369817e+01 -7.295648e+00 -4.249108e+00 # CAP + 590 40 3 -2.3537 -1.462407e+01 -6.817709e+00 -3.314072e+00 # CAM + 591 40 2 -2.3557 -1.421895e+01 -5.908527e+00 -2.329555e+00 # CAO + 592 40 5 -2.4057 -1.245100e+01 -4.496668e+00 -1.218204e+00 # CTT + 593 40 6 0.1480 -1.093527e+01 -5.622551e+00 -3.176941e+00 # HAT + 594 40 6 0.1480 -1.165290e+01 -7.233102e+00 -4.920941e+00 # HAT + 595 40 6 0.1480 -1.401069e+01 -7.997017e+00 -5.008592e+00 # HAT + 596 40 6 0.1480 -1.565084e+01 -7.150382e+00 -3.352242e+00 # HAT + 597 40 6 0.1480 -1.493322e+01 -5.539831e+00 -1.608242e+00 # HAT + 598 40 7 0.0920 -1.163241e+01 -3.886974e+00 -1.600679e+00 # HT + 599 40 7 0.0920 -1.328879e+01 -3.852702e+00 -9.507580e-01 # HT + 600 40 7 0.0920 -1.211595e+01 -5.041457e+00 -3.355690e-01 # HT + 601 41 1 -2.2897 -1.047485e+01 2.136872e+00 -1.505524e+01 # CAT + 602 41 2 -2.3557 -1.086108e+01 8.189820e-01 -1.532726e+01 # CAO + 603 41 3 -2.3537 -1.221469e+01 5.086590e-01 -1.550455e+01 # CAM + 604 41 4 -2.3627 -1.318208e+01 1.516226e+00 -1.540982e+01 # CAP + 605 41 3 -2.3537 -1.279585e+01 2.834115e+00 -1.513780e+01 # CAM + 606 41 2 -2.3557 -1.144224e+01 3.144439e+00 -1.496051e+01 # CAO + 607 41 5 -2.4057 -9.014887e+00 2.471578e+00 -1.486401e+01 # CTT + 608 41 6 0.1480 -1.011481e+01 4.171700e-02 -1.540034e+01 # HAT + 609 41 6 0.1480 -1.251264e+01 -5.079990e-01 -1.571440e+01 # HAT + 610 41 6 0.1480 -1.422630e+01 1.276834e+00 -1.554659e+01 # HAT + 611 41 6 0.1480 -1.354212e+01 3.611381e+00 -1.506472e+01 # HAT + 612 41 6 0.1480 -1.114429e+01 4.161096e+00 -1.475066e+01 # HAT + 613 41 7 0.0920 -8.404664e+00 1.789605e+00 -1.545616e+01 # HT + 614 41 7 0.0920 -8.831185e+00 3.496289e+00 -1.518700e+01 # HT + 615 41 7 0.0920 -8.753430e+00 2.370791e+00 -1.381065e+01 # HT + 616 42 1 -2.2897 -1.318090e+01 7.763980e+00 -1.044097e+01 # CAT + 617 42 2 -2.3557 -1.250450e+01 8.983816e+00 -1.056132e+01 # CAO + 618 42 3 -2.3537 -1.111011e+01 9.001788e+00 -1.068521e+01 # CAM + 619 42 4 -2.3627 -1.039212e+01 7.799925e+00 -1.068875e+01 # CAP + 620 42 3 -2.3537 -1.106852e+01 6.580089e+00 -1.056841e+01 # CAM + 621 42 2 -2.3557 -1.246291e+01 6.562116e+00 -1.044452e+01 # CAO + 622 42 5 -2.4057 -1.468485e+01 7.744595e+00 -1.030735e+01 # CTT + 623 42 6 0.1480 -1.305838e+01 9.910968e+00 -1.055858e+01 # HAT + 624 42 6 0.1480 -1.058831e+01 9.942805e+00 -1.077804e+01 # HAT + 625 42 6 0.1480 -9.316443e+00 7.813790e+00 -1.078433e+01 # HAT + 626 42 6 0.1480 -1.051464e+01 5.652937e+00 -1.057115e+01 # HAT + 627 42 6 0.1480 -1.298470e+01 5.621100e+00 -1.035168e+01 # HAT + 628 42 7 0.0920 -1.510759e+01 8.603158e+00 -1.082914e+01 # HT + 629 42 7 0.0920 -1.507707e+01 6.825840e+00 -1.074342e+01 # HT + 630 42 7 0.0920 -1.495707e+01 7.790774e+00 -9.252900e+00 # HT + 631 43 1 -2.2897 1.392383e+00 -3.646782e+00 -9.449799e+00 # CAT + 632 43 2 -2.3557 1.455034e+00 -4.722187e+00 -8.555607e+00 # CAO + 633 43 3 -2.3537 3.450150e-01 -5.558685e+00 -8.387891e+00 # CAM + 634 43 4 -2.3627 -8.276550e-01 -5.319778e+00 -9.114367e+00 # CAP + 635 43 3 -2.3537 -8.903060e-01 -4.244373e+00 -1.000856e+01 # CAM + 636 43 2 -2.3557 2.197120e-01 -3.407875e+00 -1.017628e+01 # CAO + 637 43 5 -2.4057 2.589618e+00 -2.744559e+00 -9.630692e+00 # CTT + 638 43 6 0.1480 2.359665e+00 -4.906487e+00 -7.995182e+00 # HAT + 639 43 6 0.1480 3.933460e-01 -6.388283e+00 -7.698086e+00 # HAT + 640 43 6 0.1480 -1.683956e+00 -5.965077e+00 -8.984987e+00 # HAT + 641 43 6 0.1480 -1.794938e+00 -4.060074e+00 -1.056898e+01 # HAT + 642 43 6 0.1480 1.713810e-01 -2.578277e+00 -1.086608e+01 # HAT + 643 43 7 0.0920 3.503212e+00 -3.313048e+00 -9.456719e+00 # HT + 644 43 7 0.0920 2.596593e+00 -2.348457e+00 -1.064615e+01 # HT + 645 43 7 0.0920 2.534506e+00 -1.919975e+00 -8.919972e+00 # HT + 646 44 1 -2.2897 1.212087e+01 1.338823e+01 -1.297049e+01 # CAT + 647 44 2 -2.3557 1.181938e+01 1.346860e+01 -1.433527e+01 # CAO + 648 44 3 -2.3537 1.205557e+01 1.236992e+01 -1.517021e+01 # CAM + 649 44 4 -2.3627 1.259324e+01 1.119087e+01 -1.464036e+01 # CAP + 650 44 3 -2.3537 1.289474e+01 1.111050e+01 -1.327557e+01 # CAM + 651 44 2 -2.3557 1.265855e+01 1.220918e+01 -1.244064e+01 # CAO + 652 44 5 -2.4057 1.186613e+01 1.457323e+01 -1.206995e+01 # CTT + 653 44 6 0.1480 1.140460e+01 1.437815e+01 -1.474401e+01 # HAT + 654 44 6 0.1480 1.182299e+01 1.243192e+01 -1.622305e+01 # HAT + 655 44 6 0.1480 1.277544e+01 1.034332e+01 -1.528445e+01 # HAT + 656 44 6 0.1480 1.330951e+01 1.020094e+01 -1.286683e+01 # HAT + 657 44 6 0.1480 1.289113e+01 1.214717e+01 -1.138780e+01 # HAT + 658 44 7 0.0920 1.102267e+01 1.514718e+01 -1.245369e+01 # HT + 659 44 7 0.0920 1.163854e+01 1.422287e+01 -1.106319e+01 # HT + 660 44 7 0.0920 1.275302e+01 1.520627e+01 -1.204197e+01 # HT + 661 45 1 -2.2897 7.711795e+00 -2.613003e+00 -1.408413e+01 # CAT + 662 45 2 -2.3557 7.279556e+00 -1.455632e+00 -1.474266e+01 # CAO + 663 45 3 -2.3537 6.088643e+00 -8.315960e-01 -1.435239e+01 # CAM + 664 45 4 -2.3627 5.329970e+00 -1.364931e+00 -1.330360e+01 # CAP + 665 45 3 -2.3537 5.762210e+00 -2.522303e+00 -1.264507e+01 # CAM + 666 45 2 -2.3557 6.953122e+00 -3.146339e+00 -1.303533e+01 # CAO + 667 45 5 -2.4057 8.996279e+00 -3.286071e+00 -1.450506e+01 # CTT + 668 45 6 0.1480 7.864817e+00 -1.044202e+00 -1.555173e+01 # HAT + 669 45 6 0.1480 5.755201e+00 6.123400e-02 -1.486040e+01 # HAT + 670 45 6 0.1480 4.411266e+00 -8.835320e-01 -1.300254e+01 # HAT + 671 45 6 0.1480 5.176947e+00 -2.933733e+00 -1.183600e+01 # HAT + 672 45 6 0.1480 7.286563e+00 -4.039169e+00 -1.252733e+01 # HAT + 673 45 7 0.0920 9.686659e+00 -2.539419e+00 -1.489747e+01 # HT + 674 45 7 0.0920 9.447085e+00 -3.780252e+00 -1.364444e+01 # HT + 675 45 7 0.0920 8.783621e+00 -4.025087e+00 -1.527754e+01 # HT + 676 46 1 -2.2897 4.820759e+00 -1.500242e+01 7.600837e+00 # CAT + 677 46 2 -2.3557 4.647658e+00 -1.514626e+01 6.219047e+00 # CAO + 678 46 3 -2.3537 5.751327e+00 -1.505734e+01 5.362305e+00 # CAM + 679 46 4 -2.3627 7.028096e+00 -1.482456e+01 5.887353e+00 # CAP + 680 46 3 -2.3537 7.201197e+00 -1.468071e+01 7.269143e+00 # CAM + 681 46 2 -2.3557 6.097529e+00 -1.476965e+01 8.125885e+00 # CAO + 682 46 5 -2.4057 3.630374e+00 -1.509834e+01 8.524895e+00 # CTT + 683 46 6 0.1480 3.662722e+00 -1.532583e+01 5.814010e+00 # HAT + 684 46 6 0.1480 5.617792e+00 -1.516830e+01 4.296352e+00 # HAT + 685 46 6 0.1480 7.879498e+00 -1.475596e+01 5.226437e+00 # HAT + 686 46 6 0.1480 8.186134e+00 -1.450115e+01 7.674180e+00 # HAT + 687 46 6 0.1480 6.231064e+00 -1.465868e+01 9.191838e+00 # HAT + 688 46 7 0.0920 2.885989e+00 -1.576611e+01 8.091219e+00 # HT + 689 46 7 0.0920 3.950069e+00 -1.548970e+01 9.490674e+00 # HT + 690 46 7 0.0920 3.194557e+00 -1.410854e+01 8.660775e+00 # HT + 691 47 1 -2.2897 9.764872e+00 -1.331634e+01 1.332376e+01 # CAT + 692 47 2 -2.3557 9.185102e+00 -1.340091e+01 1.205226e+01 # CAO + 693 47 3 -2.3537 7.837319e+00 -1.306677e+01 1.187384e+01 # CAM + 694 47 4 -2.3627 7.069307e+00 -1.264806e+01 1.296693e+01 # CAP + 695 47 3 -2.3537 7.649077e+00 -1.256349e+01 1.423843e+01 # CAM + 696 47 2 -2.3557 8.996860e+00 -1.289763e+01 1.441685e+01 # CAO + 697 47 5 -2.4057 1.121855e+01 -1.367674e+01 1.351619e+01 # CTT + 698 47 6 0.1480 9.777568e+00 -1.372391e+01 1.120902e+01 # HAT + 699 47 6 0.1480 7.390067e+00 -1.313200e+01 1.089297e+01 # HAT + 700 47 6 0.1480 6.029588e+00 -1.239029e+01 1.282930e+01 # HAT + 701 47 6 0.1480 7.056610e+00 -1.224048e+01 1.508167e+01 # HAT + 702 47 6 0.1480 9.444111e+00 -1.283239e+01 1.539772e+01 # HAT + 703 47 7 0.0920 1.177106e+01 -1.346089e+01 1.260173e+01 # HT + 704 47 7 0.0920 1.163291e+01 -1.309153e+01 1.433713e+01 # HT + 705 47 7 0.0920 1.130252e+01 -1.473831e+01 1.374882e+01 # HT + 706 48 1 -2.2897 -5.467190e-01 1.109515e+01 -9.120245e+00 # CAT + 707 48 2 -2.3557 -7.564600e-02 1.175994e+01 -1.025873e+01 # CAO + 708 48 3 -2.3537 -5.495780e-01 1.139983e+01 -1.152590e+01 # CAM + 709 48 4 -2.3627 -1.494582e+00 1.037493e+01 -1.165458e+01 # CAP + 710 48 3 -2.3537 -1.965655e+00 9.710148e+00 -1.051609e+01 # CAM + 711 48 2 -2.3557 -1.491723e+00 1.007025e+01 -9.248926e+00 # CAO + 712 48 5 -2.4057 -3.555000e-02 1.148355e+01 -7.753515e+00 # CTT + 713 48 6 0.1480 6.533570e-01 1.255057e+01 -1.015946e+01 # HAT + 714 48 6 0.1480 -1.861790e-01 1.191266e+01 -1.240416e+01 # HAT + 715 48 6 0.1480 -1.860187e+00 1.009714e+01 -1.263211e+01 # HAT + 716 48 6 0.1480 -2.694658e+00 8.919515e+00 -1.061536e+01 # HAT + 717 48 6 0.1480 -1.855122e+00 9.557420e+00 -8.370666e+00 # HAT + 718 48 7 0.0920 2.282170e-01 1.254115e+01 -7.750728e+00 # HT + 719 48 7 0.0920 -8.110620e-01 1.130107e+01 -7.009618e+00 # HT + 720 48 7 0.0920 8.457100e-01 1.088920e+01 -7.512218e+00 # HT + 721 49 1 -2.2897 1.027240e+01 -5.417260e-01 -8.013583e+00 # CAT + 722 49 2 -2.3557 1.166978e+01 -4.638740e-01 -7.978000e+00 # CAO + 723 49 3 -2.3537 1.230242e+01 3.269810e-01 -7.011399e+00 # CAM + 724 49 4 -2.3627 1.153768e+01 1.039985e+00 -6.080382e+00 # CAP + 725 49 3 -2.3537 1.014030e+01 9.621340e-01 -6.115965e+00 # CAM + 726 49 2 -2.3557 9.507662e+00 1.712790e-01 -7.082565e+00 # CAO + 727 49 5 -2.4057 9.590059e+00 -1.394719e+00 -9.056131e+00 # CTT + 728 49 6 0.1480 1.225973e+01 -1.013906e+00 -8.696214e+00 # HAT + 729 49 6 0.1480 1.338040e+01 3.870380e-01 -6.983950e+00 # HAT + 730 49 6 0.1480 1.202572e+01 1.650074e+00 -5.334718e+00 # HAT + 731 49 6 0.1480 9.550356e+00 1.512166e+00 -5.397751e+00 # HAT + 732 49 6 0.1480 8.429682e+00 1.112220e-01 -7.110015e+00 # HAT + 733 49 7 0.0920 1.023331e+01 -2.235325e+00 -9.316357e+00 # HT + 734 49 7 0.0920 8.646494e+00 -1.769177e+00 -8.659185e+00 # HT + 735 49 7 0.0920 9.397124e+00 -7.962700e-01 -9.946487e+00 # HT + 736 50 1 -2.2897 1.050095e+01 1.503957e+01 6.028631e+00 # CAT + 737 50 2 -2.3557 1.047309e+01 1.512451e+01 4.631488e+00 # CAO + 738 50 3 -2.3537 9.247246e+00 1.513918e+01 3.955396e+00 # CAM + 739 50 4 -2.3627 8.049270e+00 1.506892e+01 4.676448e+00 # CAP + 740 50 3 -2.3537 8.077134e+00 1.498398e+01 6.073591e+00 # CAM + 741 50 2 -2.3557 9.302974e+00 1.496931e+01 6.749683e+00 # CAO + 742 50 5 -2.4057 1.182311e+01 1.502375e+01 6.757844e+00 # CTT + 743 50 6 0.1480 1.139724e+01 1.517872e+01 4.075248e+00 # HAT + 744 50 6 0.1480 9.225750e+00 1.520471e+01 2.877600e+00 # HAT + 745 50 6 0.1480 7.103621e+00 1.508023e+01 4.154891e+00 # HAT + 746 50 6 0.1480 7.152980e+00 1.492977e+01 6.629831e+00 # HAT + 747 50 6 0.1480 9.324469e+00 1.490378e+01 7.827479e+00 # HAT + 748 50 7 0.0920 1.255990e+01 1.558955e+01 6.187658e+00 # HT + 749 50 7 0.0920 1.170114e+01 1.547564e+01 7.742231e+00 # HT + 750 50 7 0.0920 1.216405e+01 1.399462e+01 6.870776e+00 # HT + 751 51 1 -2.2897 1.198479e+01 -4.731049e+00 -3.780931e+00 # CAT + 752 51 2 -2.3557 1.186218e+01 -5.989429e+00 -4.382136e+00 # CAO + 753 51 3 -2.3537 1.177712e+01 -6.094168e+00 -5.775619e+00 # CAM + 754 51 4 -2.3627 1.181467e+01 -4.940528e+00 -6.567897e+00 # CAP + 755 51 3 -2.3537 1.193728e+01 -3.682148e+00 -5.966691e+00 # CAM + 756 51 2 -2.3557 1.202234e+01 -3.577409e+00 -4.573209e+00 # CAO + 757 51 5 -2.4057 1.207654e+01 -4.618080e+00 -2.277960e+00 # CTT + 758 51 6 0.1480 1.183321e+01 -6.879379e+00 -3.770951e+00 # HAT + 759 51 6 0.1480 1.168254e+01 -7.064917e+00 -6.239406e+00 # HAT + 760 51 6 0.1480 1.174906e+01 -5.021326e+00 -7.642870e+00 # HAT + 761 51 6 0.1480 1.196625e+01 -2.792197e+00 -6.577878e+00 # HAT + 762 51 6 0.1480 1.211693e+01 -2.606659e+00 -4.109422e+00 # HAT + 763 51 7 0.0920 1.255154e+01 -5.512201e+00 -1.874198e+00 # HT + 764 51 7 0.0920 1.266908e+01 -3.741986e+00 -2.014429e+00 # HT + 765 51 7 0.0920 1.107531e+01 -4.518391e+00 -1.858786e+00 # HT + 766 52 1 -2.2897 1.555598e+00 -1.219226e+01 -6.042517e+00 # CAT + 767 52 2 -2.3557 2.702586e+00 -1.154517e+01 -6.517580e+00 # CAO + 768 52 3 -2.3537 2.587985e+00 -1.032673e+01 -7.197485e+00 # CAM + 769 52 4 -2.3627 1.326396e+00 -9.755383e+00 -7.402326e+00 # CAP + 770 52 3 -2.3537 1.794080e-01 -1.040248e+01 -6.927263e+00 # CAM + 771 52 2 -2.3557 2.940090e-01 -1.162092e+01 -6.247359e+00 # CAO + 772 52 5 -2.4057 1.679203e+00 -1.350644e+01 -5.309192e+00 # CTT + 773 52 6 0.1480 3.675811e+00 -1.198592e+01 -6.359560e+00 # HAT + 774 52 6 0.1480 3.472804e+00 -9.827537e+00 -7.563962e+00 # HAT + 775 52 6 0.1480 1.237989e+00 -8.815443e+00 -7.926824e+00 # HAT + 776 52 6 0.1480 -7.938180e-01 -9.961728e+00 -7.085284e+00 # HAT + 777 52 6 0.1480 -5.908100e-01 -1.212011e+01 -5.880881e+00 # HAT + 778 52 7 0.0920 2.634862e+00 -1.354280e+01 -4.786224e+00 # HT + 779 52 7 0.0920 8.671750e-01 -1.359839e+01 -4.587905e+00 # HT + 780 52 7 0.0920 1.624924e+00 -1.432811e+01 -6.023338e+00 # HT + 781 53 1 -2.2897 1.358410e+01 4.592482e+00 -1.702511e+00 # CAT + 782 53 2 -2.3557 1.283435e+01 5.448527e+00 -8.869910e-01 # CAO + 783 53 3 -2.3537 1.144342e+01 5.306593e+00 -8.150550e-01 # CAM + 784 53 4 -2.3627 1.080224e+01 4.308613e+00 -1.558640e+00 # CAP + 785 53 3 -2.3537 1.155198e+01 3.452568e+00 -2.374160e+00 # CAM + 786 53 2 -2.3557 1.294291e+01 3.594502e+00 -2.446095e+00 # CAO + 787 53 5 -2.4057 1.508431e+01 4.745568e+00 -1.780098e+00 # CTT + 788 53 6 0.1480 1.332898e+01 6.218397e+00 -3.133690e-01 # HAT + 789 53 6 0.1480 1.086505e+01 5.966970e+00 -1.859400e-01 # HAT + 790 53 6 0.1480 9.729239e+00 4.199121e+00 -1.503147e+00 # HAT + 791 53 6 0.1480 1.105735e+01 2.682698e+00 -2.947782e+00 # HAT + 792 53 6 0.1480 1.352128e+01 2.934124e+00 -3.075211e+00 # HAT + 793 53 7 0.0920 1.545964e+01 5.135810e+00 -8.340840e-01 # HT + 794 53 7 0.0920 1.553931e+01 3.775115e+00 -1.978333e+00 # HT + 795 53 7 0.0920 1.533846e+01 5.436443e+00 -2.583964e+00 # HT + 796 54 1 -2.2897 2.946326e+00 1.231817e+01 1.120154e+01 # CAT + 797 54 2 -2.3557 3.413214e+00 1.353105e+01 1.172203e+01 # CAO + 798 54 3 -2.3537 3.004023e+00 1.474181e+01 1.115052e+01 # CAM + 799 54 4 -2.3627 2.127946e+00 1.473968e+01 1.005851e+01 # CAP + 800 54 3 -2.3537 1.661058e+00 1.352679e+01 9.538017e+00 # CAM + 801 54 2 -2.3557 2.070248e+00 1.231603e+01 1.010953e+01 # CAO + 802 54 5 -2.4057 3.387667e+00 1.101228e+01 1.181796e+01 # CTT + 803 54 6 0.1480 4.089045e+00 1.353270e+01 1.256444e+01 # HAT + 804 54 6 0.1480 3.364193e+00 1.567747e+01 1.155204e+01 # HAT + 805 54 6 0.1480 1.812284e+00 1.567370e+01 9.617630e+00 # HAT + 806 54 6 0.1480 9.852260e-01 1.352515e+01 8.695610e+00 # HAT + 807 54 6 0.1480 1.710078e+00 1.138038e+01 9.708006e+00 # HAT + 808 54 7 0.0920 3.586288e+00 1.115977e+01 1.287951e+01 # HT + 809 54 7 0.0920 2.600668e+00 1.026805e+01 1.169607e+01 # HT + 810 54 7 0.0920 4.295081e+00 1.066501e+01 1.132389e+01 # HT + 811 55 1 -2.2897 1.509559e+01 -9.015908e+00 -4.919870e+00 # CAT + 812 55 2 -2.3557 1.504119e+01 -9.790899e+00 -3.755211e+00 # CAO + 813 55 3 -2.3537 1.508387e+01 -1.118761e+01 -3.841170e+00 # CAM + 814 55 4 -2.3627 1.518095e+01 -1.180932e+01 -5.091787e+00 # CAP + 815 55 3 -2.3537 1.523534e+01 -1.103433e+01 -6.256447e+00 # CAM + 816 55 2 -2.3557 1.519266e+01 -9.637625e+00 -6.170488e+00 # CAO + 817 55 5 -2.4057 1.504955e+01 -7.509461e+00 -4.827157e+00 # CTT + 818 55 6 0.1480 1.496631e+01 -9.311290e+00 -2.790448e+00 # HAT + 819 55 6 0.1480 1.504191e+01 -1.178546e+01 -2.942718e+00 # HAT + 820 55 6 0.1480 1.521387e+01 -1.288678e+01 -5.158099e+00 # HAT + 821 55 6 0.1480 1.531023e+01 -1.151394e+01 -7.221209e+00 # HAT + 822 55 6 0.1480 1.523462e+01 -9.039775e+00 -7.068939e+00 # HAT + 823 55 7 0.0920 1.549537e+01 -7.189083e+00 -3.885508e+00 # HT + 824 55 7 0.0920 1.560654e+01 -7.076592e+00 -5.658113e+00 # HT + 825 55 7 0.0920 1.401347e+01 -7.173726e+00 -4.870828e+00 # HT + 826 56 1 -2.2897 1.504423e+01 1.367656e+01 -1.353903e+01 # CAT + 827 56 2 -2.3557 1.515546e+01 1.362343e+01 -1.214447e+01 # CAO + 828 56 3 -2.3537 1.536449e+01 1.239557e+01 -1.150519e+01 # CAM + 829 56 4 -2.3627 1.546230e+01 1.122085e+01 -1.226048e+01 # CAP + 830 56 3 -2.3537 1.535107e+01 1.127398e+01 -1.365504e+01 # CAM + 831 56 2 -2.3557 1.514203e+01 1.250184e+01 -1.429432e+01 # CAO + 832 56 5 -2.4057 1.481877e+01 1.500089e+01 -1.422854e+01 # CTT + 833 56 6 0.1480 1.508001e+01 1.452965e+01 -1.156182e+01 # HAT + 834 56 6 0.1480 1.545030e+01 1.235459e+01 -1.042939e+01 # HAT + 835 56 6 0.1480 1.562355e+01 1.027365e+01 -1.176732e+01 # HAT + 836 56 6 0.1480 1.542651e+01 1.036777e+01 -1.423769e+01 # HAT + 837 56 6 0.1480 1.505622e+01 1.254283e+01 -1.537012e+01 # HAT + 838 56 7 0.0920 1.527734e+01 1.579829e+01 -1.364375e+01 # HT + 839 56 7 0.0920 1.526749e+01 1.497514e+01 -1.522156e+01 # HT + 840 56 7 0.0920 1.374849e+01 1.518659e+01 -1.431873e+01 # HT + 841 57 1 -2.2897 3.073517e+00 -2.366873e+00 -1.448425e+01 # CAT + 842 57 2 -2.3557 2.748964e+00 -3.255809e+00 -1.345253e+01 # CAO + 843 57 3 -2.3537 3.602298e+00 -4.325242e+00 -1.315565e+01 # CAM + 844 57 4 -2.3627 4.780184e+00 -4.505739e+00 -1.389050e+01 # CAP + 845 57 3 -2.3537 5.104736e+00 -3.616802e+00 -1.492223e+01 # CAM + 846 57 2 -2.3557 4.251403e+00 -2.547370e+00 -1.521911e+01 # CAO + 847 57 5 -2.4057 2.153136e+00 -1.213413e+00 -1.480446e+01 # CTT + 848 57 6 0.1480 1.840310e+00 -3.116569e+00 -1.288564e+01 # HAT + 849 57 6 0.1480 3.351929e+00 -5.010993e+00 -1.235975e+01 # HAT + 850 57 6 0.1480 5.438470e+00 -5.330730e+00 -1.366149e+01 # HAT + 851 57 6 0.1480 6.013391e+00 -3.756043e+00 -1.548911e+01 # HAT + 852 57 6 0.1480 4.501772e+00 -1.861619e+00 -1.601501e+01 # HAT + 853 57 7 0.0920 1.634102e+00 -8.998150e-01 -1.389872e+01 # HT + 854 57 7 0.0920 2.736762e+00 -3.798820e-01 -1.519523e+01 # HT + 855 57 7 0.0920 1.423218e+00 -1.526728e+00 -1.555088e+01 # HT + 856 58 1 -2.2897 -4.576135e+00 -7.197530e+00 2.226547e+00 # CAT + 857 58 2 -2.3557 -5.896264e+00 -7.198509e+00 1.760437e+00 # CAO + 858 58 3 -2.3537 -6.909917e+00 -6.612010e+00 2.527593e+00 # CAM + 859 58 4 -2.3627 -6.603440e+00 -6.024533e+00 3.760858e+00 # CAP + 860 58 3 -2.3537 -5.283311e+00 -6.023554e+00 4.226967e+00 # CAM + 861 58 2 -2.3557 -4.269659e+00 -6.610053e+00 3.459813e+00 # CAO + 862 58 5 -2.4057 -3.482838e+00 -7.830111e+00 1.399116e+00 # CTT + 863 58 6 0.1480 -6.132688e+00 -7.651706e+00 8.090620e-01 # HAT + 864 58 6 0.1480 -7.928302e+00 -6.612765e+00 2.168023e+00 # HAT + 865 58 6 0.1480 -7.385401e+00 -5.572090e+00 4.352663e+00 # HAT + 866 58 6 0.1480 -5.046887e+00 -5.570357e+00 5.178344e+00 # HAT + 867 58 6 0.1480 -3.251273e+00 -6.609298e+00 3.819383e+00 # HAT + 868 58 7 0.0920 -3.733779e+00 -7.748958e+00 3.415030e-01 # HT + 869 58 7 0.0920 -2.539991e+00 -7.317082e+00 1.588698e+00 # HT + 870 58 7 0.0920 -3.384421e+00 -8.881572e+00 1.669011e+00 # HT + 871 59 1 -2.2897 -7.772433e+00 3.565982e+00 1.411000e+01 # CAT + 872 59 2 -2.3557 -7.230055e+00 3.567265e+00 1.281933e+01 # CAO + 873 59 3 -2.3537 -8.063716e+00 3.752056e+00 1.170989e+01 # CAM + 874 59 4 -2.3627 -9.439754e+00 3.935563e+00 1.189111e+01 # CAP + 875 59 3 -2.3537 -9.982132e+00 3.934280e+00 1.318178e+01 # CAM + 876 59 2 -2.3557 -9.148472e+00 3.749489e+00 1.429123e+01 # CAO + 877 59 5 -2.4057 -6.873271e+00 3.366672e+00 1.530661e+01 # CTT + 878 59 6 0.1480 -6.168540e+00 3.425703e+00 1.267953e+01 # HAT + 879 59 6 0.1480 -7.645310e+00 3.753046e+00 1.071423e+01 # HAT + 880 59 6 0.1480 -1.008286e+01 4.078115e+00 1.103526e+01 # HAT + 881 59 6 0.1480 -1.104365e+01 4.075842e+00 1.332159e+01 # HAT + 882 59 6 0.1480 -9.566878e+00 3.748499e+00 1.528688e+01 # HAT + 883 59 7 0.0920 -5.880878e+00 3.759558e+00 1.508549e+01 # HT + 884 59 7 0.0920 -7.288830e+00 3.893294e+00 1.616573e+01 # HT + 885 59 7 0.0920 -6.800118e+00 2.303088e+00 1.553363e+01 # HT + 886 60 1 -2.2897 -2.982640e+00 7.509455e+00 -7.413426e+00 # CAT + 887 60 2 -2.3557 -2.407439e+00 8.205173e+00 -6.343322e+00 # CAO + 888 60 3 -2.3537 -2.797571e+00 9.522525e+00 -6.074284e+00 # CAM + 889 60 4 -2.3627 -3.762903e+00 1.014416e+01 -6.875349e+00 # CAP + 890 60 3 -2.3537 -4.338103e+00 9.448441e+00 -7.945452e+00 # CAM + 891 60 2 -2.3557 -3.947972e+00 8.131090e+00 -8.214491e+00 # CAO + 892 60 5 -2.4057 -2.561855e+00 6.088598e+00 -7.703604e+00 # CTT + 893 60 6 0.1480 -1.662755e+00 7.725627e+00 -5.725358e+00 # HAT + 894 60 6 0.1480 -2.353845e+00 1.005922e+01 -5.248775e+00 # HAT + 895 60 6 0.1480 -4.063862e+00 1.116040e+01 -6.667805e+00 # HAT + 896 60 6 0.1480 -5.082788e+00 9.927988e+00 -8.563417e+00 # HAT + 897 60 6 0.1480 -4.391698e+00 7.594394e+00 -9.040000e+00 # HAT + 898 60 7 0.0920 -2.265165e+00 5.600221e+00 -6.775399e+00 # HT + 899 60 7 0.0920 -3.395783e+00 5.545850e+00 -8.148675e+00 # HT + 900 60 7 0.0920 -1.720440e+00 6.092613e+00 -8.396499e+00 # HT + 901 61 1 -2.2897 3.258301e+00 -4.694480e-01 4.582762e+00 # CAT + 902 61 2 -2.3557 1.983033e+00 -1.037576e+00 4.687274e+00 # CAO + 903 61 3 -2.3537 1.724756e+00 -2.002305e+00 5.668392e+00 # CAM + 904 61 4 -2.3627 2.741747e+00 -2.398904e+00 6.544998e+00 # CAP + 905 61 3 -2.3537 4.017015e+00 -1.830776e+00 6.440486e+00 # CAM + 906 61 2 -2.3557 4.275292e+00 -8.660480e-01 5.459369e+00 # CAO + 907 61 5 -2.4057 3.536871e+00 5.710800e-01 3.524557e+00 # CTT + 908 61 6 0.1480 1.198498e+00 -7.316280e-01 4.011035e+00 # HAT + 909 61 6 0.1480 7.409790e-01 -2.440575e+00 5.749015e+00 # HAT + 910 61 6 0.1480 2.542505e+00 -3.143123e+00 7.301861e+00 # HAT + 911 61 6 0.1480 4.801550e+00 -2.136725e+00 7.116726e+00 # HAT + 912 61 6 0.1480 5.259070e+00 -4.277770e-01 5.378745e+00 # HAT + 913 61 7 0.0920 2.624647e+00 1.129379e+00 3.314195e+00 # HT + 914 61 7 0.0920 4.306967e+00 1.255266e+00 3.880845e+00 # HT + 915 61 7 0.0920 3.880371e+00 8.077400e-02 2.613674e+00 # HT + 916 62 1 -2.2897 -1.408416e+01 6.936970e+00 1.496073e+01 # CAT + 917 62 2 -2.3557 -1.268811e+01 6.990609e+00 1.505098e+01 # CAO + 918 62 3 -2.3537 -1.195414e+01 5.815894e+00 1.525429e+01 # CAM + 919 62 4 -2.3627 -1.261623e+01 4.587541e+00 1.536736e+01 # CAP + 920 62 3 -2.3537 -1.401229e+01 4.533902e+00 1.527711e+01 # CAM + 921 62 2 -2.3557 -1.474625e+01 5.708616e+00 1.507380e+01 # CAO + 922 62 5 -2.4057 -1.487580e+01 8.203983e+00 1.474144e+01 # CTT + 923 62 6 0.1480 -1.217735e+01 7.938196e+00 1.496376e+01 # HAT + 924 62 6 0.1480 -1.087718e+01 5.857273e+00 1.532391e+01 # HAT + 925 62 6 0.1480 -1.205002e+01 3.681332e+00 1.552420e+01 # HAT + 926 62 6 0.1480 -1.452304e+01 3.586314e+00 1.536434e+01 # HAT + 927 62 6 0.1480 -1.582321e+01 5.667237e+00 1.500418e+01 # HAT + 928 62 7 0.0920 -1.427591e+01 8.913860e+00 1.417196e+01 # HT + 929 62 7 0.0920 -1.578642e+01 7.972988e+00 1.418871e+01 # HT + 930 62 7 0.0920 -1.513733e+01 8.641001e+00 1.570514e+01 # HT + 931 63 1 -2.2897 4.427510e+00 1.380200e+01 -2.876622e+00 # CAT + 932 63 2 -2.3557 3.351363e+00 1.334945e+01 -2.103896e+00 # CAO + 933 63 3 -2.3537 3.583186e+00 1.252985e+01 -9.928050e-01 # CAM + 934 63 4 -2.3627 4.891157e+00 1.216281e+01 -6.544420e-01 # CAP + 935 63 3 -2.3537 5.967304e+00 1.261535e+01 -1.427168e+00 # CAM + 936 63 2 -2.3557 5.735481e+00 1.343495e+01 -2.538258e+00 # CAO + 937 63 5 -2.4057 4.177472e+00 1.468599e+01 -4.075012e+00 # CTT + 938 63 6 0.1480 2.342357e+00 1.363260e+01 -2.364919e+00 # HAT + 939 63 6 0.1480 2.753016e+00 1.218074e+01 -3.967020e-01 # HAT + 940 63 6 0.1480 5.069992e+00 1.153055e+01 2.026860e-01 # HAT + 941 63 6 0.1480 6.976310e+00 1.233221e+01 -1.166144e+00 # HAT + 942 63 6 0.1480 6.565652e+00 1.378406e+01 -3.134362e+00 # HAT + 943 63 7 0.0920 3.281851e+00 1.528373e+01 -3.905683e+00 # HT + 944 63 7 0.0920 5.031588e+00 1.534648e+01 -4.224468e+00 # HT + 945 63 7 0.0920 4.038229e+00 1.406678e+01 -4.961179e+00 # HT + 946 64 1 -2.2897 1.294754e+01 1.091054e+01 1.325336e+01 # CAT + 947 64 2 -2.3557 1.303118e+01 1.132003e+01 1.458952e+01 # CAO + 948 64 3 -2.3537 1.186669e+01 1.163965e+01 1.529790e+01 # CAM + 949 64 4 -2.3627 1.061857e+01 1.154977e+01 1.467013e+01 # CAP + 950 64 3 -2.3537 1.053493e+01 1.114028e+01 1.333397e+01 # CAM + 951 64 2 -2.3557 1.169942e+01 1.082066e+01 1.262559e+01 # CAO + 952 64 5 -2.4057 1.420353e+01 1.056581e+01 1.248932e+01 # CTT + 953 64 6 0.1480 1.399402e+01 1.138937e+01 1.507380e+01 # HAT + 954 64 6 0.1480 1.193121e+01 1.195555e+01 1.632865e+01 # HAT + 955 64 6 0.1480 9.720244e+00 1.179633e+01 1.521660e+01 # HAT + 956 64 6 0.1480 9.572085e+00 1.107094e+01 1.284969e+01 # HAT + 957 64 6 0.1480 1.163490e+01 1.050477e+01 1.159484e+01 # HAT + 958 64 7 0.0920 1.495341e+01 1.017713e+01 1.317831e+01 # HT + 959 64 7 0.0920 1.397601e+01 9.810639e+00 1.173695e+01 # HT + 960 64 7 0.0920 1.458909e+01 1.146045e+01 1.200038e+01 # HT + 961 65 1 -2.2897 8.908436e+00 -5.228769e+00 -5.981125e+00 # CAT + 962 65 2 -2.3557 8.694744e+00 -5.687037e+00 -4.675627e+00 # CAO + 963 65 3 -2.3537 8.944404e+00 -4.842216e+00 -3.587533e+00 # CAM + 964 65 4 -2.3627 9.407756e+00 -3.539128e+00 -3.804938e+00 # CAP + 965 65 3 -2.3537 9.621449e+00 -3.080860e+00 -5.110437e+00 # CAM + 966 65 2 -2.3557 9.371789e+00 -3.925680e+00 -6.198530e+00 # CAO + 967 65 5 -2.4057 8.639160e+00 -6.139969e+00 -7.154712e+00 # CTT + 968 65 6 0.1480 8.337301e+00 -6.692276e+00 -4.507914e+00 # HAT + 969 65 6 0.1480 8.779556e+00 -5.195736e+00 -2.580434e+00 # HAT + 970 65 6 0.1480 9.600352e+00 -2.887408e+00 -2.965552e+00 # HAT + 971 65 6 0.1480 9.978892e+00 -2.075620e+00 -5.278149e+00 # HAT + 972 65 6 0.1480 9.536637e+00 -3.572160e+00 -7.205629e+00 # HAT + 973 65 7 0.0920 7.841102e+00 -6.836853e+00 -6.898671e+00 # HT + 974 65 7 0.0920 8.337994e+00 -5.544170e+00 -8.016351e+00 # HT + 975 65 7 0.0920 9.543728e+00 -6.697572e+00 -7.397475e+00 # HT + 976 66 1 -2.2897 4.271883e+00 1.385249e+01 1.507117e+01 # CAT + 977 66 2 -2.3557 3.745530e+00 1.255618e+01 1.512165e+01 # CAO + 978 66 3 -2.3537 4.605755e+00 1.145201e+01 1.515002e+01 # CAM + 979 66 4 -2.3627 5.992332e+00 1.164413e+01 1.512791e+01 # CAP + 980 66 3 -2.3537 6.518686e+00 1.294044e+01 1.507743e+01 # CAM + 981 66 2 -2.3557 5.658462e+00 1.404461e+01 1.504907e+01 # CAO + 982 66 5 -2.4057 3.344070e+00 1.504342e+01 1.504058e+01 # CTT + 983 66 6 0.1480 2.675884e+00 1.240797e+01 1.513870e+01 # HAT + 984 66 6 0.1480 4.199710e+00 1.045200e+01 1.518896e+01 # HAT + 985 66 6 0.1480 6.655934e+00 1.079234e+01 1.514979e+01 # HAT + 986 66 6 0.1480 7.588332e+00 1.308865e+01 1.506038e+01 # HAT + 987 66 6 0.1480 6.064506e+00 1.504462e+01 1.501013e+01 # HAT + 988 66 7 0.0920 2.424279e+00 1.480186e+01 1.557324e+01 # HT + 989 66 7 0.0920 3.828206e+00 1.589424e+01 1.551997e+01 # HT + 990 66 7 0.0920 3.109027e+00 1.529507e+01 1.400640e+01 # HT + 991 67 1 -2.2897 -7.561472e+00 1.370177e+01 6.200833e+00 # CAT + 992 67 2 -2.3557 -6.272456e+00 1.402062e+01 5.757246e+00 # CAO + 993 67 3 -2.3537 -5.576063e+00 1.313004e+01 4.931472e+00 # CAM + 994 67 4 -2.3627 -6.168687e+00 1.192061e+01 4.549285e+00 # CAP + 995 67 3 -2.3537 -7.457703e+00 1.160176e+01 4.992872e+00 # CAM + 996 67 2 -2.3557 -8.154096e+00 1.249234e+01 5.818646e+00 # CAO + 997 67 5 -2.4057 -8.312581e+00 1.466233e+01 7.091488e+00 # CTT + 998 67 6 0.1480 -5.815289e+00 1.495361e+01 6.052075e+00 # HAT + 999 67 6 0.1480 -4.581679e+00 1.337601e+01 4.589276e+00 # HAT + 1000 67 6 0.1480 -5.631469e+00 1.123359e+01 3.912260e+00 # HAT + 1001 67 6 0.1480 -7.914870e+00 1.066876e+01 4.698042e+00 # HAT + 1002 67 6 0.1480 -9.148480e+00 1.224637e+01 6.160841e+00 # HAT + 1003 67 7 0.0920 -8.002345e+00 1.568327e+01 6.868917e+00 # HT + 1004 67 7 0.0920 -9.383306e+00 1.456164e+01 6.913980e+00 # HT + 1005 67 7 0.0920 -8.095055e+00 1.443645e+01 8.135404e+00 # HT + 1006 68 1 -2.2897 1.113894e+01 1.100598e+01 5.908326e+00 # CAT + 1007 68 2 -2.3557 1.160678e+01 9.846555e+00 5.278348e+00 # CAO + 1008 68 3 -2.3537 1.212450e+01 8.794542e+00 6.043353e+00 # CAM + 1009 68 4 -2.3627 1.217439e+01 8.901951e+00 7.438334e+00 # CAP + 1010 68 3 -2.3537 1.170656e+01 1.006137e+01 8.068312e+00 # CAM + 1011 68 2 -2.3557 1.118883e+01 1.111339e+01 7.303308e+00 # CAO + 1012 68 5 -2.4057 1.058054e+01 1.214065e+01 5.083215e+00 # CTT + 1013 68 6 0.1480 1.156829e+01 9.763697e+00 4.202220e+00 # HAT + 1014 68 6 0.1480 1.248540e+01 7.900131e+00 5.557370e+00 # HAT + 1015 68 6 0.1480 1.257378e+01 8.090398e+00 8.028480e+00 # HAT + 1016 68 6 0.1480 1.174504e+01 1.014423e+01 9.144441e+00 # HAT + 1017 68 6 0.1480 1.082793e+01 1.200780e+01 7.789291e+00 # HAT + 1018 68 7 0.0920 1.013032e+01 1.174215e+01 4.174038e+00 # HT + 1019 68 7 0.0920 9.823584e+00 1.267189e+01 5.660184e+00 # HT + 1020 68 7 0.0920 1.138406e+01 1.282813e+01 4.818966e+00 # HT + 1021 69 1 -2.2897 -5.279193e+00 1.087257e+01 8.274740e-01 # CAT + 1022 69 2 -2.3557 -5.525088e+00 9.494584e+00 8.538170e-01 # CAO + 1023 69 3 -2.3537 -6.666408e+00 8.999337e+00 1.495782e+00 # CAM + 1024 69 4 -2.3627 -7.561833e+00 9.882074e+00 2.111403e+00 # CAP + 1025 69 3 -2.3537 -7.315938e+00 1.126006e+01 2.085060e+00 # CAM + 1026 69 2 -2.3557 -6.174618e+00 1.175531e+01 1.443095e+00 # CAO + 1027 69 5 -2.4057 -4.048198e+00 1.140673e+01 1.350690e-01 # CTT + 1028 69 6 0.1480 -4.834332e+00 8.813616e+00 3.789100e-01 # HAT + 1029 69 6 0.1480 -6.856099e+00 7.936320e+00 1.516104e+00 # HAT + 1030 69 6 0.1480 -8.442280e+00 9.500026e+00 2.606633e+00 # HAT + 1031 69 6 0.1480 -8.006695e+00 1.194103e+01 2.559968e+00 # HAT + 1032 69 6 0.1480 -5.984928e+00 1.281832e+01 1.422773e+00 # HAT + 1033 69 7 0.0920 -3.777019e+00 1.074453e+01 -6.871560e-01 # HT + 1034 69 7 0.0920 -4.253717e+00 1.240370e+01 -2.546770e-01 # HT + 1035 69 7 0.0920 -3.223997e+00 1.145809e+01 8.465140e-01 # HT + 1036 70 1 -2.2897 9.133436e+00 7.176267e+00 1.077745e+01 # CAT + 1037 70 2 -2.3557 8.434500e+00 7.432350e+00 9.591744e+00 # CAO + 1038 70 3 -2.3537 7.652014e+00 6.427969e+00 9.009563e+00 # CAM + 1039 70 4 -2.3627 7.568465e+00 5.167505e+00 9.613092e+00 # CAP + 1040 70 3 -2.3537 8.267401e+00 4.911421e+00 1.079880e+01 # CAM + 1041 70 2 -2.3557 9.049886e+00 5.915801e+00 1.138098e+01 # CAO + 1042 70 5 -2.4057 9.977402e+00 8.259563e+00 1.140538e+01 # CTT + 1043 70 6 0.1480 8.498952e+00 8.404709e+00 9.126164e+00 # HAT + 1044 70 6 0.1480 7.112834e+00 6.625519e+00 8.094872e+00 # HAT + 1045 70 6 0.1480 6.964833e+00 4.392696e+00 9.163981e+00 # HAT + 1046 70 6 0.1480 8.202948e+00 3.939061e+00 1.126438e+01 # HAT + 1047 70 6 0.1480 9.589066e+00 5.718251e+00 1.229567e+01 # HAT + 1048 70 7 0.0920 9.549380e+00 9.234757e+00 1.117322e+01 # HT + 1049 70 7 0.0920 1.000102e+01 8.121741e+00 1.248637e+01 # HT + 1050 70 7 0.0920 1.099189e+01 8.205286e+00 1.101045e+01 # HT + 1051 71 1 -2.2897 4.710830e-01 -5.315780e+00 1.262183e+00 # CAT + 1052 71 2 -2.3557 5.895940e-01 -6.504279e+00 5.318220e-01 # CAO + 1053 71 3 -2.3537 1.499878e+00 -6.586382e+00 -5.286700e-01 # CAM + 1054 71 4 -2.3627 2.291651e+00 -5.479988e+00 -8.588000e-01 # CAP + 1055 71 3 -2.3537 2.173141e+00 -4.291490e+00 -1.284380e-01 # CAM + 1056 71 2 -2.3557 1.262857e+00 -4.209386e+00 9.320530e-01 # CAO + 1057 71 5 -2.4057 -5.107230e-01 -5.227226e+00 2.405998e+00 # CTT + 1058 71 6 0.1480 -2.120300e-02 -7.357783e+00 7.864930e-01 # HAT + 1059 71 6 0.1480 1.591300e+00 -7.503223e+00 -1.092092e+00 # HAT + 1060 71 6 0.1480 2.993871e+00 -5.543324e+00 -1.676893e+00 # HAT + 1061 71 6 0.1480 2.783938e+00 -3.437985e+00 -3.831100e-01 # HAT + 1062 71 6 0.1480 1.171435e+00 -3.292544e+00 1.495474e+00 # HAT + 1063 71 7 0.0920 -6.310350e-01 -6.211197e+00 2.859240e+00 # HT + 1064 71 7 0.0920 -1.369180e-01 -4.526943e+00 3.152975e+00 # HT + 1065 71 7 0.0920 -1.473943e+00 -4.879524e+00 2.032622e+00 # HT + 1066 72 1 -2.2897 -1.108013e+01 -6.188383e+00 8.896229e+00 # CAT + 1067 72 2 -2.3557 -1.071769e+01 -6.033910e+00 1.023965e+01 # CAO + 1068 72 3 -2.3537 -1.106984e+01 -4.868023e+00 1.093008e+01 # CAM + 1069 72 4 -2.3627 -1.178444e+01 -3.856609e+00 1.027709e+01 # CAP + 1070 72 3 -2.3537 -1.214688e+01 -4.011081e+00 8.933676e+00 # CAM + 1071 72 2 -2.3557 -1.179473e+01 -5.176968e+00 8.243244e+00 # CAO + 1072 72 5 -2.4057 -1.070031e+01 -7.445875e+00 8.151548e+00 # CTT + 1073 72 6 0.1480 -1.016642e+01 -6.814144e+00 1.074338e+01 # HAT + 1074 72 6 0.1480 -1.079023e+01 -4.748858e+00 1.196643e+01 # HAT + 1075 72 6 0.1480 -1.205609e+01 -2.957209e+00 1.080971e+01 # HAT + 1076 72 6 0.1480 -1.269815e+01 -3.230847e+00 8.429945e+00 # HAT + 1077 72 6 0.1480 -1.207434e+01 -5.296132e+00 7.206894e+00 # HAT + 1078 72 7 0.0920 -1.065533e+01 -8.282266e+00 8.849064e+00 # HT + 1079 72 7 0.0920 -1.144579e+01 -7.653344e+00 7.383877e+00 # HT + 1080 72 7 0.0920 -9.725253e+00 -7.311032e+00 7.683389e+00 # HT + 1081 73 1 -2.2897 -9.089503e+00 -1.159685e+01 4.608762e+00 # CAT + 1082 73 2 -2.3557 -8.523278e+00 -1.061468e+01 5.430178e+00 # CAO + 1083 73 3 -2.3537 -7.162889e+00 -1.067332e+01 5.755606e+00 # CAM + 1084 73 4 -2.3627 -6.368726e+00 -1.171414e+01 5.259618e+00 # CAP + 1085 73 3 -2.3537 -6.934951e+00 -1.269631e+01 4.438202e+00 # CAM + 1086 73 2 -2.3557 -8.295339e+00 -1.263767e+01 4.112774e+00 # CAO + 1087 73 5 -2.4057 -1.055678e+01 -1.153360e+01 4.257765e+00 # CTT + 1088 73 6 0.1480 -9.135918e+00 -9.811760e+00 5.812798e+00 # HAT + 1089 73 6 0.1480 -6.726086e+00 -9.915643e+00 6.389270e+00 # HAT + 1090 73 6 0.1480 -5.319282e+00 -1.175938e+01 5.510662e+00 # HAT + 1091 73 6 0.1480 -6.322310e+00 -1.349923e+01 4.055582e+00 # HAT + 1092 73 6 0.1480 -8.732141e+00 -1.339534e+01 3.479110e+00 # HAT + 1093 73 7 0.0920 -1.088266e+01 -1.049357e+01 4.242172e+00 # HT + 1094 73 7 0.0920 -1.071537e+01 -1.197827e+01 3.275311e+00 # HT + 1095 73 7 0.0920 -1.113297e+01 -1.208323e+01 5.002081e+00 # HT + 1096 74 1 -2.2897 1.155483e+01 -7.697853e+00 -1.484975e+01 # CAT + 1097 74 2 -2.3557 1.101652e+01 -6.405634e+00 -1.483011e+01 # CAO + 1098 74 3 -2.3537 1.184001e+01 -5.300457e+00 -1.507594e+01 # CAM + 1099 74 4 -2.3627 1.320183e+01 -5.487500e+00 -1.534141e+01 # CAP + 1100 74 3 -2.3537 1.374015e+01 -6.779719e+00 -1.536105e+01 # CAM + 1101 74 2 -2.3557 1.291665e+01 -7.884895e+00 -1.511521e+01 # CAO + 1102 74 5 -2.4057 1.066663e+01 -8.889864e+00 -1.458460e+01 # CTT + 1103 74 6 0.1480 9.965971e+00 -6.261344e+00 -1.462532e+01 # HAT + 1104 74 6 0.1480 1.142474e+01 -4.303603e+00 -1.506080e+01 # HAT + 1105 74 6 0.1480 1.383710e+01 -4.634935e+00 -1.553105e+01 # HAT + 1106 74 6 0.1480 1.479069e+01 -6.924008e+00 -1.556583e+01 # HAT + 1107 74 6 0.1480 1.333192e+01 -8.881750e+00 -1.513036e+01 # HAT + 1108 74 7 0.0920 9.652627e+00 -8.669426e+00 -1.491822e+01 # HT + 1109 74 7 0.0920 1.104716e+01 -9.755076e+00 -1.512746e+01 # HT + 1110 74 7 0.0920 1.065803e+01 -9.106773e+00 -1.351643e+01 # HT + 1111 75 1 -2.2897 4.533850e-01 1.554472e+00 -1.405462e+01 # CAT + 1112 75 2 -2.3557 3.674000e-02 9.675280e-01 -1.285383e+01 # CAO + 1113 75 3 -2.3537 9.848330e-01 5.628790e-01 -1.190653e+01 # CAM + 1114 75 4 -2.3627 2.349571e+00 7.451730e-01 -1.216002e+01 # CAP + 1115 75 3 -2.3537 2.766216e+00 1.332116e+00 -1.336082e+01 # CAM + 1116 75 2 -2.3557 1.818123e+00 1.736766e+00 -1.430812e+01 # CAO + 1117 75 5 -2.4057 -5.692010e-01 1.990916e+00 -1.507635e+01 # CTT + 1118 75 6 0.1480 -1.016058e+00 8.269020e-01 -1.265828e+01 # HAT + 1119 75 6 0.1480 6.634210e-01 1.100930e-01 -1.098020e+01 # HAT + 1120 75 6 0.1480 3.080958e+00 4.330140e-01 -1.142925e+01 # HAT + 1121 75 6 0.1480 3.819014e+00 1.472743e+00 -1.355637e+01 # HAT + 1122 75 6 0.1480 2.139535e+00 2.189551e+00 -1.523444e+01 # HAT + 1123 75 7 0.0920 -1.490515e+00 2.277830e+00 -1.456944e+01 # HT + 1124 75 7 0.0920 -1.831330e-01 2.842384e+00 -1.563676e+01 # HT + 1125 75 7 0.0920 -7.731630e-01 1.168031e+00 -1.576145e+01 # HT + 1126 76 1 -2.2897 -1.453937e+01 -4.604499e+00 9.359840e+00 # CAT + 1127 76 2 -2.3557 -1.465981e+01 -4.694566e+00 7.967941e+00 # CAO + 1128 76 3 -2.3537 -1.498582e+01 -3.557864e+00 7.218524e+00 # CAM + 1129 76 4 -2.3627 -1.519139e+01 -2.331096e+00 7.861004e+00 # CAP + 1130 76 3 -2.3537 -1.507094e+01 -2.241030e+00 9.252903e+00 # CAM + 1131 76 2 -2.3557 -1.474493e+01 -3.377731e+00 1.000232e+01 # CAO + 1132 76 5 -2.4057 -1.418774e+01 -5.830513e+00 1.016814e+01 # CTT + 1133 76 6 0.1480 -1.450123e+01 -5.640930e+00 7.472313e+00 # HAT + 1134 76 6 0.1480 -1.507873e+01 -3.627344e+00 6.144773e+00 # HAT + 1135 76 6 0.1480 -1.544288e+01 -1.454212e+00 7.282882e+00 # HAT + 1136 76 6 0.1480 -1.522952e+01 -1.294665e+00 9.748531e+00 # HAT + 1137 76 6 0.1480 -1.465202e+01 -3.308250e+00 1.107607e+01 # HAT + 1138 76 7 0.0920 -1.357249e+01 -6.499135e+00 9.566054e+00 # HT + 1139 76 7 0.0920 -1.363496e+01 -5.532692e+00 1.105911e+01 # HT + 1140 76 7 0.0920 -1.510159e+01 -6.345974e+00 1.046356e+01 # HT + 1141 77 1 -2.2897 -1.356475e+00 1.280972e+01 -1.503091e+01 # CAT + 1142 77 2 -2.3557 -2.646687e+00 1.334968e+01 -1.509245e+01 # CAO + 1143 77 3 -2.3537 -3.759439e+00 1.250109e+01 -1.513348e+01 # CAM + 1144 77 4 -2.3627 -3.581977e+00 1.111254e+01 -1.511297e+01 # CAP + 1145 77 3 -2.3537 -2.291764e+00 1.057257e+01 -1.505143e+01 # CAM + 1146 77 2 -2.3557 -1.179013e+00 1.142116e+01 -1.501041e+01 # CAO + 1147 77 5 -2.4057 -1.562930e-01 1.372498e+01 -1.498666e+01 # CTT + 1148 77 6 0.1480 -2.783586e+00 1.442085e+01 -1.510827e+01 # HAT + 1149 77 6 0.1480 -4.754745e+00 1.291764e+01 -1.518094e+01 # HAT + 1150 77 6 0.1480 -4.440385e+00 1.045791e+01 -1.514462e+01 # HAT + 1151 77 6 0.1480 -2.154865e+00 9.501400e+00 -1.503561e+01 # HAT + 1152 77 6 0.1480 -1.837060e-01 1.100461e+01 -1.496294e+01 # HAT + 1153 77 7 0.0920 -4.281800e-01 1.465791e+01 -1.449288e+01 # HT + 1154 77 7 0.0920 6.489660e-01 1.324254e+01 -1.443267e+01 # HT + 1155 77 7 0.0920 1.779210e-01 1.393611e+01 -1.600245e+01 # HT + 1156 78 1 -2.2897 -1.451534e+01 -1.140433e+01 -1.362441e+00 # CAT + 1157 78 2 -2.3557 -1.500953e+01 -1.012406e+01 -1.639323e+00 # CAO + 1158 78 3 -2.3537 -1.507508e+01 -9.163990e+00 -6.224780e-01 # CAM + 1159 78 4 -2.3627 -1.464643e+01 -9.484199e+00 6.712480e-01 # CAP + 1160 78 3 -2.3537 -1.415224e+01 -1.076448e+01 9.481300e-01 # CAM + 1161 78 2 -2.3557 -1.408669e+01 -1.172455e+01 -6.871400e-02 # CAO + 1162 78 5 -2.4057 -1.444464e+01 -1.243984e+01 -2.459180e+00 # CTT + 1163 78 6 0.1480 -1.534020e+01 -9.877039e+00 -2.637340e+00 # HAT + 1164 78 6 0.1480 -1.545631e+01 -8.176347e+00 -8.360730e-01 # HAT + 1165 78 6 0.1480 -1.469699e+01 -8.743575e+00 1.455671e+00 # HAT + 1166 78 6 0.1480 -1.382157e+01 -1.101150e+01 1.946148e+00 # HAT + 1167 78 6 0.1480 -1.370546e+01 -1.271219e+01 1.448800e-01 # HAT + 1168 78 7 0.0920 -1.429178e+01 -1.194446e+01 -3.417998e+00 # HT + 1169 78 7 0.0920 -1.361449e+01 -1.311908e+01 -2.265307e+00 # HT + 1170 78 7 0.0920 -1.537655e+01 -1.300452e+01 -2.487048e+00 # HT + 1171 79 1 -2.2897 1.742080e-01 -1.134914e+01 1.270981e+01 # CAT + 1172 79 2 -2.3557 -8.388630e-01 -1.185601e+01 1.188715e+01 # CAO + 1173 79 3 -2.3537 -1.509277e+00 -1.100707e+01 1.099842e+01 # CAM + 1174 79 4 -2.3627 -1.166620e+00 -9.651261e+00 1.093234e+01 # CAP + 1175 79 3 -2.3537 -1.535490e-01 -9.144390e+00 1.175500e+01 # CAM + 1176 79 2 -2.3557 5.168650e-01 -9.993328e+00 1.264374e+01 # CAO + 1177 79 5 -2.4057 8.972970e-01 -1.226478e+01 1.366837e+01 # CTT + 1178 79 6 0.1480 -1.103198e+00 -1.290192e+01 1.193812e+01 # HAT + 1179 79 6 0.1480 -2.290788e+00 -1.139809e+01 1.036379e+01 # HAT + 1180 79 6 0.1480 -1.683796e+00 -8.996364e+00 1.024675e+01 # HAT + 1181 79 6 0.1480 1.107860e-01 -8.098479e+00 1.170403e+01 # HAT + 1182 79 6 0.1480 1.298377e+00 -9.602313e+00 1.327836e+01 # HAT + 1183 79 7 0.0920 9.217550e-01 -1.327451e+01 1.325857e+01 # HT + 1184 79 7 0.0920 1.916742e+00 -1.190747e+01 1.381384e+01 # HT + 1185 79 7 0.0920 3.761020e-01 -1.227426e+01 1.462564e+01 # HT + 1186 80 1 -2.2897 -9.539257e+00 1.287627e+01 -8.732643e+00 # CAT + 1187 80 2 -2.3557 -8.340077e+00 1.276433e+01 -8.018895e+00 # CAO + 1188 80 3 -2.3537 -7.243438e+00 1.210868e+01 -8.591176e+00 # CAM + 1189 80 4 -2.3627 -7.345979e+00 1.156497e+01 -9.877203e+00 # CAP + 1190 80 3 -2.3537 -8.545159e+00 1.167692e+01 -1.059095e+01 # CAM + 1191 80 2 -2.3557 -9.641798e+00 1.233257e+01 -1.001867e+01 # CAO + 1192 80 5 -2.4057 -1.072206e+01 1.358344e+01 -8.115398e+00 # CTT + 1193 80 6 0.1480 -8.260974e+00 1.318376e+01 -7.026816e+00 # HAT + 1194 80 6 0.1480 -6.318356e+00 1.202232e+01 -8.040570e+00 # HAT + 1195 80 6 0.1480 -6.500000e+00 1.105919e+01 -1.031868e+01 # HAT + 1196 80 6 0.1480 -8.624262e+00 1.125749e+01 -1.158303e+01 # HAT + 1197 80 6 0.1480 -1.056688e+01 1.241892e+01 -1.056928e+01 # HAT + 1198 80 7 0.0920 -1.036837e+01 1.435688e+01 -7.433644e+00 # HT + 1199 80 7 0.0920 -1.132372e+01 1.404001e+01 -8.901307e+00 # HT + 1200 80 7 0.0920 -1.132912e+01 1.286463e+01 -7.565047e+00 # HT + 1201 81 1 -2.2897 -1.067394e+01 1.385396e+01 1.014313e+01 # CAT + 1202 81 2 -2.3557 -1.028730e+01 1.297778e+01 1.116432e+01 # CAO + 1203 81 3 -2.3537 -1.079180e+01 1.167219e+01 1.119479e+01 # CAM + 1204 81 4 -2.3627 -1.168292e+01 1.124278e+01 1.020408e+01 # CAP + 1205 81 3 -2.3537 -1.206955e+01 1.211896e+01 9.182895e+00 # CAM + 1206 81 2 -2.3557 -1.156506e+01 1.342455e+01 9.152419e+00 # CAO + 1207 81 5 -2.4057 -1.012981e+01 1.526213e+01 1.011026e+01 # CTT + 1208 81 6 0.1480 -9.599867e+00 1.330904e+01 1.192858e+01 # HAT + 1209 81 6 0.1480 -1.049353e+01 1.099628e+01 1.198256e+01 # HAT + 1210 81 6 0.1480 -1.207209e+01 1.023561e+01 1.022759e+01 # HAT + 1211 81 6 0.1480 -1.275699e+01 1.178770e+01 8.418632e+00 # HAT + 1212 81 6 0.1480 -1.186332e+01 1.410046e+01 8.364646e+00 # HAT + 1213 81 7 0.0920 -9.134375e+00 1.527801e+01 1.055406e+01 # HT + 1214 81 7 0.0920 -1.007214e+01 1.560590e+01 9.077497e+00 # HT + 1215 81 7 0.0920 -1.078958e+01 1.592042e+01 1.067546e+01 # HT + 1216 82 1 -2.2897 -9.909117e+00 -3.793439e+00 1.879500e-01 # CAT + 1217 82 2 -2.3557 -1.055152e+01 -2.549535e+00 1.926740e-01 # CAO + 1218 82 3 -2.3537 -1.042096e+01 -1.690100e+00 -9.047440e-01 # CAM + 1219 82 4 -2.3627 -9.648002e+00 -2.074569e+00 -2.006886e+00 # CAP + 1220 82 3 -2.3537 -9.005600e+00 -3.318473e+00 -2.011610e+00 # CAM + 1221 82 2 -2.3557 -9.136157e+00 -4.177908e+00 -9.141920e-01 # CAO + 1222 82 5 -2.4057 -1.004993e+01 -4.720401e+00 1.371593e+00 # CTT + 1223 82 6 0.1480 -1.114780e+01 -2.252945e+00 1.042897e+00 # HAT + 1224 82 6 0.1480 -1.091653e+01 -7.305170e-01 -9.011000e-01 # HAT + 1225 82 6 0.1480 -9.547286e+00 -1.411576e+00 -2.853466e+00 # HAT + 1226 82 6 0.1480 -8.409316e+00 -3.615063e+00 -2.861834e+00 # HAT + 1227 82 6 0.1480 -8.640590e+00 -5.137491e+00 -9.178370e-01 # HAT + 1228 82 7 0.0920 -1.101763e+01 -4.559403e+00 1.846724e+00 # HT + 1229 82 7 0.0920 -9.978873e+00 -5.754489e+00 1.034380e+00 # HT + 1230 82 7 0.0920 -9.255091e+00 -4.517393e+00 2.089309e+00 # HT + 1231 83 1 -2.2897 -1.083905e+01 -9.379606e+00 -4.000286e+00 # CAT + 1232 83 2 -2.3557 -9.716936e+00 -8.596094e+00 -3.705379e+00 # CAO + 1233 83 3 -2.3537 -9.728335e+00 -7.748314e+00 -2.591314e+00 # CAM + 1234 83 4 -2.3627 -1.086185e+01 -7.684047e+00 -1.772157e+00 # CAP + 1235 83 3 -2.3537 -1.198396e+01 -8.467559e+00 -2.067064e+00 # CAM + 1236 83 2 -2.3557 -1.197256e+01 -9.315338e+00 -3.181128e+00 # CAO + 1237 83 5 -2.4057 -1.082676e+01 -1.029400e+01 -5.201884e+00 # CTT + 1238 83 6 0.1480 -8.842512e+00 -8.645672e+00 -4.337300e+00 # HAT + 1239 83 6 0.1480 -8.862704e+00 -7.143891e+00 -2.363814e+00 # HAT + 1240 83 6 0.1480 -1.087064e+01 -7.030045e+00 -9.127350e-01 # HAT + 1241 83 6 0.1480 -1.285839e+01 -8.417980e+00 -1.435142e+00 # HAT + 1242 83 6 0.1480 -1.283819e+01 -9.919761e+00 -3.408628e+00 # HAT + 1243 83 7 0.0920 -9.807557e+00 -1.062977e+01 -5.393173e+00 # HT + 1244 83 7 0.0920 -1.146299e+01 -1.115764e+01 -5.008419e+00 # HT + 1245 83 7 0.0920 -1.120083e+01 -9.755576e+00 -6.072673e+00 # HT + 1246 84 1 -2.2897 -1.457376e+01 1.395836e+01 8.709069e+00 # CAT + 1247 84 2 -2.3557 -1.507878e+01 1.267616e+01 8.462217e+00 # CAO + 1248 84 3 -2.3537 -1.500554e+01 1.169185e+01 9.455081e+00 # CAM + 1249 84 4 -2.3627 -1.442730e+01 1.198974e+01 1.069479e+01 # CAP + 1250 84 3 -2.3537 -1.392228e+01 1.327194e+01 1.094165e+01 # CAM + 1251 84 2 -2.3557 -1.399551e+01 1.425624e+01 9.948784e+00 # CAO + 1252 84 5 -2.4057 -1.465275e+01 1.502000e+01 7.638195e+00 # CTT + 1253 84 6 0.1480 -1.552485e+01 1.244636e+01 7.505866e+00 # HAT + 1254 84 6 0.1480 -1.539513e+01 1.070273e+01 9.264652e+00 # HAT + 1255 84 6 0.1480 -1.437081e+01 1.123042e+01 1.146072e+01 # HAT + 1256 84 6 0.1480 -1.347620e+01 1.350174e+01 1.189800e+01 # HAT + 1257 84 6 0.1480 -1.360593e+01 1.524536e+01 1.013921e+01 # HAT + 1258 84 7 0.0920 -1.552813e+01 1.484228e+01 7.013521e+00 # HT + 1259 84 7 0.0920 -1.473311e+01 1.600192e+01 8.104532e+00 # HT + 1260 84 7 0.0920 -1.375410e+01 1.498324e+01 7.022420e+00 # HT + 1261 85 1 -2.2897 -4.326090e+00 -1.501734e+01 9.998178e+00 # CAT + 1262 85 2 -2.3557 -5.108654e+00 -1.507744e+01 1.115748e+01 # CAO + 1263 85 3 -2.3537 -6.501509e+00 -1.517717e+01 1.105743e+01 # CAM + 1264 85 4 -2.3627 -7.111800e+00 -1.521679e+01 9.798072e+00 # CAP + 1265 85 3 -2.3537 -6.329236e+00 -1.515669e+01 8.638770e+00 # CAM + 1266 85 2 -2.3557 -4.936381e+00 -1.505697e+01 8.738822e+00 # CAO + 1267 85 5 -2.4057 -2.823797e+00 -1.490978e+01 1.010609e+01 # CTT + 1268 85 6 0.1480 -4.637859e+00 -1.504688e+01 1.212898e+01 # HAT + 1269 85 6 0.1480 -7.105202e+00 -1.522353e+01 1.195175e+01 # HAT + 1270 85 6 0.1480 -8.186288e+00 -1.529373e+01 9.720888e+00 # HAT + 1271 85 6 0.1480 -6.800032e+00 -1.518726e+01 7.667267e+00 # HAT + 1272 85 6 0.1480 -4.332689e+00 -1.501060e+01 7.844503e+00 # HAT + 1273 85 7 0.0920 -2.488210e+00 -1.540379e+01 1.101792e+01 # HT + 1274 85 7 0.0920 -2.361776e+00 -1.538876e+01 9.242836e+00 # HT + 1275 85 7 0.0920 -2.535428e+00 -1.385903e+01 1.013553e+01 # HT + 1276 86 1 -2.2897 -7.760465e+00 8.226135e+00 1.389052e+01 # CAT + 1277 86 2 -2.3557 -7.924327e+00 8.977335e+00 1.506049e+01 # CAO + 1278 86 3 -2.3537 -8.141873e+00 1.035805e+01 1.498114e+01 # CAM + 1279 86 4 -2.3627 -8.195558e+00 1.098757e+01 1.373181e+01 # CAP + 1280 86 3 -2.3537 -8.031696e+00 1.023637e+01 1.256183e+01 # CAM + 1281 86 2 -2.3557 -7.814150e+00 8.855652e+00 1.264119e+01 # CAO + 1282 86 5 -2.4057 -7.525827e+00 6.736935e+00 1.397610e+01 # CTT + 1283 86 6 0.1480 -7.882913e+00 8.491708e+00 1.602426e+01 # HAT + 1284 86 6 0.1480 -8.268281e+00 1.093755e+01 1.588370e+01 # HAT + 1285 86 6 0.1480 -8.363379e+00 1.205269e+01 1.367060e+01 # HAT + 1286 86 6 0.1480 -8.073110e+00 1.072200e+01 1.159806e+01 # HAT + 1287 86 6 0.1480 -7.687742e+00 8.276156e+00 1.173863e+01 # HAT + 1288 86 7 0.0920 -8.016681e+00 6.341779e+00 1.486549e+01 # HT + 1289 86 7 0.0920 -7.935820e+00 6.252474e+00 1.308993e+01 # HT + 1290 86 7 0.0920 -6.455364e+00 6.540037e+00 1.403476e+01 # HT + 1291 87 1 -2.2897 -5.665998e+00 -1.453981e+00 -1.300441e+01 # CAT + 1292 87 2 -2.3557 -4.478425e+00 -1.864129e+00 -1.238679e+01 # CAO + 1293 87 3 -2.3537 -3.242805e+00 -1.473060e+00 -1.291623e+01 # CAM + 1294 87 4 -2.3627 -3.194760e+00 -6.718440e-01 -1.406329e+01 # CAP + 1295 87 3 -2.3537 -4.382333e+00 -2.616960e-01 -1.468091e+01 # CAM + 1296 87 2 -2.3557 -5.617952e+00 -6.527640e-01 -1.415146e+01 # CAO + 1297 87 5 -2.4057 -6.998702e+00 -1.875777e+00 -1.243336e+01 # CTT + 1298 87 6 0.1480 -4.515489e+00 -2.482211e+00 -1.150192e+01 # HAT + 1299 87 6 0.1480 -2.326678e+00 -1.789460e+00 -1.243979e+01 # HAT + 1300 87 6 0.1480 -2.241567e+00 -3.701620e-01 -1.447172e+01 # HAT + 1301 87 6 0.1480 -4.345268e+00 3.563860e-01 -1.556578e+01 # HAT + 1302 87 6 0.1480 -6.534080e+00 -3.363640e-01 -1.462791e+01 # HAT + 1303 87 7 0.0920 -6.909051e+00 -2.000661e+00 -1.135426e+01 # HT + 1304 87 7 0.0920 -7.745366e+00 -1.111623e+00 -1.264938e+01 # HT + 1305 87 7 0.0920 -7.305072e+00 -2.819954e+00 -1.288366e+01 # HT + 1306 88 1 -2.2897 -1.721862e+00 -1.003904e+01 -1.428543e+01 # CAT + 1307 88 2 -2.3557 -2.279951e+00 -1.130601e+01 -1.449359e+01 # CAO + 1308 88 3 -2.3537 -1.677385e+00 -1.243741e+01 -1.393071e+01 # CAM + 1309 88 4 -2.3627 -5.167300e-01 -1.230185e+01 -1.315967e+01 # CAP + 1310 88 3 -2.3537 4.135900e-02 -1.103489e+01 -1.295151e+01 # CAM + 1311 88 2 -2.3557 -5.612070e-01 -9.903480e+00 -1.351439e+01 # CAO + 1312 88 5 -2.4057 -2.371772e+00 -8.818738e+00 -1.489254e+01 # CTT + 1313 88 6 0.1480 -3.175313e+00 -1.141058e+01 -1.508839e+01 # HAT + 1314 88 6 0.1480 -2.107911e+00 -1.341479e+01 -1.409129e+01 # HAT + 1315 88 6 0.1480 -5.189300e-02 -1.317465e+01 -1.272545e+01 # HAT + 1316 88 6 0.1480 9.367220e-01 -1.093031e+01 -1.235671e+01 # HAT + 1317 88 6 0.1480 -1.306810e-01 -8.926105e+00 -1.335381e+01 # HAT + 1318 88 7 0.0920 -3.446204e+00 -8.982247e+00 -1.497598e+01 # HT + 1319 88 7 0.0920 -2.184794e+00 -7.952912e+00 -1.425733e+01 # HT + 1320 88 7 0.0920 -1.954127e+00 -8.638922e+00 -1.588316e+01 # HT + 1321 89 1 -2.2897 -1.216032e+01 -1.089932e+01 1.505688e+01 # CAT + 1322 89 2 -2.3557 -1.178544e+01 -9.550441e+00 1.505823e+01 # CAO + 1323 89 3 -2.3537 -1.276617e+01 -8.551349e+00 1.505863e+01 # CAM + 1324 89 4 -2.3627 -1.412176e+01 -8.901132e+00 1.505766e+01 # CAP + 1325 89 3 -2.3537 -1.449664e+01 -1.025001e+01 1.505631e+01 # CAM + 1326 89 2 -2.3557 -1.351592e+01 -1.124910e+01 1.505592e+01 # CAO + 1327 89 5 -2.4057 -1.110254e+01 -1.197691e+01 1.505645e+01 # CTT + 1328 89 6 0.1480 -1.073969e+01 -9.280609e+00 1.505898e+01 # HAT + 1329 89 6 0.1480 -1.247697e+01 -7.510788e+00 1.505967e+01 # HAT + 1330 89 6 0.1480 -1.487832e+01 -8.130403e+00 1.505797e+01 # HAT + 1331 89 6 0.1480 -1.554239e+01 -1.051984e+01 1.505556e+01 # HAT + 1332 89 6 0.1480 -1.380511e+01 -1.228966e+01 1.505487e+01 # HAT + 1333 89 7 0.0920 -1.021290e+01 -1.161368e+01 1.557094e+01 # HT + 1334 89 7 0.0920 -1.148292e+01 -1.286035e+01 1.556924e+01 # HT + 1335 89 7 0.0920 -1.084716e+01 -1.223567e+01 1.402887e+01 # HT + 1336 90 1 -2.2897 1.840033e+00 -7.284373e+00 -1.384030e+01 # CAT + 1337 90 2 -2.3557 1.841175e+00 -6.950912e+00 -1.248059e+01 # CAO + 1338 90 3 -2.3537 1.062150e+00 -5.882190e+00 -1.202129e+01 # CAM + 1339 90 4 -2.3627 2.819840e-01 -5.146931e+00 -1.292170e+01 # CAP + 1340 90 3 -2.3537 2.808430e-01 -5.480391e+00 -1.428141e+01 # CAM + 1341 90 2 -2.3557 1.059868e+00 -6.549112e+00 -1.474071e+01 # CAO + 1342 90 5 -2.4057 2.680267e+00 -8.437064e+00 -1.433569e+01 # CTT + 1343 90 6 0.1480 2.443016e+00 -7.518112e+00 -1.178599e+01 # HAT + 1344 90 6 0.1480 1.063030e+00 -5.624949e+00 -1.097238e+01 # HAT + 1345 90 6 0.1480 -3.189780e-01 -4.322488e+00 -1.256738e+01 # HAT + 1346 90 6 0.1480 -3.209990e-01 -4.913190e+00 -1.497601e+01 # HAT + 1347 90 6 0.1480 1.058987e+00 -6.806353e+00 -1.578962e+01 # HAT + 1348 90 7 0.0920 2.775980e+00 -9.183011e+00 -1.354670e+01 # HT + 1349 90 7 0.0920 2.202568e+00 -8.888125e+00 -1.520543e+01 # HT + 1350 90 7 0.0920 3.669641e+00 -8.073316e+00 -1.461304e+01 # HT + 1351 91 1 -2.2897 -5.690301e+00 1.122488e+01 -4.040437e+00 # CAT + 1352 91 2 -2.3557 -4.946904e+00 1.004591e+01 -4.172300e+00 # CAO + 1353 91 3 -2.3537 -5.264129e+00 9.127371e+00 -5.180096e+00 # CAM + 1354 91 4 -2.3627 -6.324750e+00 9.387802e+00 -6.056028e+00 # CAP + 1355 91 3 -2.3537 -7.068147e+00 1.056677e+01 -5.924164e+00 # CAM + 1356 91 2 -2.3557 -6.750923e+00 1.148531e+01 -4.916369e+00 # CAO + 1357 91 5 -2.4057 -5.348151e+00 1.221559e+01 -2.953458e+00 # CTT + 1358 91 6 0.1480 -4.128710e+00 9.845008e+00 -3.496582e+00 # HAT + 1359 91 6 0.1480 -4.690651e+00 8.217879e+00 -5.281819e+00 # HAT + 1360 91 6 0.1480 -6.569467e+00 8.679213e+00 -6.833470e+00 # HAT + 1361 91 6 0.1480 -7.886342e+00 1.076768e+01 -6.599884e+00 # HAT + 1362 91 6 0.1480 -7.324401e+00 1.239480e+01 -4.814646e+00 # HAT + 1363 91 7 0.0920 -4.280758e+00 1.216553e+01 -2.738362e+00 # HT + 1364 91 7 0.0920 -5.604752e+00 1.322193e+01 -3.284444e+00 # HT + 1365 91 7 0.0920 -5.911609e+00 1.197549e+01 -2.051811e+00 # HT + 1366 92 1 -2.2897 1.434381e+01 -1.521711e+01 -4.979180e+00 # CAT + 1367 92 2 -2.3557 1.297434e+01 -1.517910e+01 -5.267442e+00 # CAO + 1368 92 3 -2.3537 1.254027e+01 -1.511957e+01 -6.597120e+00 # CAM + 1369 92 4 -2.3627 1.347568e+01 -1.509806e+01 -7.638536e+00 # CAP + 1370 92 3 -2.3537 1.484516e+01 -1.513607e+01 -7.350274e+00 # CAM + 1371 92 2 -2.3557 1.527922e+01 -1.519560e+01 -6.020596e+00 # CAO + 1372 92 5 -2.4057 1.481198e+01 -1.528131e+01 -3.545027e+00 # CTT + 1373 92 6 0.1480 1.225274e+01 -1.519569e+01 -4.464064e+00 # HAT + 1374 92 6 0.1480 1.148382e+01 -1.509025e+01 -6.819494e+00 # HAT + 1375 92 6 0.1480 1.314083e+01 -1.505214e+01 -8.664288e+00 # HAT + 1376 92 6 0.1480 1.556676e+01 -1.511948e+01 -8.153652e+00 # HAT + 1377 92 6 0.1480 1.633567e+01 -1.522493e+01 -5.798222e+00 # HAT + 1378 92 7 0.0920 1.406889e+01 -1.580399e+01 -2.942756e+00 # HT + 1379 92 7 0.0920 1.576048e+01 -1.581610e+01 -3.495506e+00 # HT + 1380 92 7 0.0920 1.494500e+01 -1.427026e+01 -3.160097e+00 # HT + 1381 93 1 -2.2897 -1.238449e+01 -9.611322e+00 1.166292e+01 # CAT + 1382 93 2 -2.3557 -1.351364e+01 -1.039426e+01 1.139453e+01 # CAO + 1383 93 3 -2.3537 -1.478705e+01 -9.929297e+00 1.174414e+01 # CAM + 1384 93 4 -2.3627 -1.493132e+01 -8.681393e+00 1.236214e+01 # CAP + 1385 93 3 -2.3537 -1.380217e+01 -7.898453e+00 1.263053e+01 # CAM + 1386 93 2 -2.3557 -1.252876e+01 -8.363418e+00 1.228092e+01 # CAO + 1387 93 5 -2.4057 -1.101103e+01 -1.011282e+01 1.128584e+01 # CTT + 1388 93 6 0.1480 -1.340235e+01 -1.135693e+01 1.091779e+01 # HAT + 1389 93 6 0.1480 -1.565811e+01 -1.053328e+01 1.153710e+01 # HAT + 1390 93 6 0.1480 -1.591367e+01 -8.322706e+00 1.263184e+01 # HAT + 1391 93 6 0.1480 -1.391346e+01 -6.935784e+00 1.310727e+01 # HAT + 1392 93 6 0.1480 -1.165770e+01 -7.759436e+00 1.248796e+01 # HAT + 1393 93 7 0.0920 -1.108656e+01 -1.075597e+01 1.040906e+01 # HT + 1394 93 7 0.0920 -1.036374e+01 -9.265509e+00 1.105959e+01 # HT + 1395 93 7 0.0920 -1.058992e+01 -1.067950e+01 1.211629e+01 # HT + 1396 94 1 -2.2897 1.312021e+01 -1.378752e+01 2.987183e+00 # CAT + 1397 94 2 -2.3557 1.206443e+01 -1.292926e+01 3.316933e+00 # CAO + 1398 94 3 -2.3537 1.077308e+01 -1.319503e+01 2.846008e+00 # CAM + 1399 94 4 -2.3627 1.053750e+01 -1.431905e+01 2.045333e+00 # CAP + 1400 94 3 -2.3537 1.159328e+01 -1.517730e+01 1.715582e+00 # CAM + 1401 94 2 -2.3557 1.288463e+01 -1.491154e+01 2.186507e+00 # CAO + 1402 94 5 -2.4057 1.451303e+01 -1.350087e+01 3.495109e+00 # CTT + 1403 94 6 0.1480 1.224617e+01 -1.206216e+01 3.934597e+00 # HAT + 1404 94 6 0.1480 9.958623e+00 -1.253294e+01 3.100387e+00 # HAT + 1405 94 6 0.1480 9.541311e+00 -1.452407e+01 1.682048e+00 # HAT + 1406 94 6 0.1480 1.141154e+01 -1.604440e+01 1.097918e+00 # HAT + 1407 94 6 0.1480 1.369909e+01 -1.557362e+01 1.932128e+00 # HAT + 1408 94 7 0.0920 1.445186e+01 -1.298375e+01 4.452683e+00 # HT + 1409 94 7 0.0920 1.505382e+01 -1.443857e+01 3.623047e+00 # HT + 1410 94 7 0.0920 1.504025e+01 -1.287308e+01 2.776767e+00 # HT + 1411 95 1 -2.2897 6.124870e+00 -1.159902e+01 -1.509942e+01 # CAT + 1412 95 2 -2.3557 7.518826e+00 -1.146922e+01 -1.510562e+01 # CAO + 1413 95 3 -2.3537 8.328187e+00 -1.261152e+01 -1.511493e+01 # CAM + 1414 95 4 -2.3627 7.743591e+00 -1.388362e+01 -1.511804e+01 # CAP + 1415 95 3 -2.3537 6.349635e+00 -1.401342e+01 -1.511183e+01 # CAM + 1416 95 2 -2.3557 5.540275e+00 -1.287112e+01 -1.510252e+01 # CAO + 1417 95 5 -2.4057 5.251916e+00 -1.036697e+01 -1.508937e+01 # CTT + 1418 95 6 0.1480 7.969799e+00 -1.048789e+01 -1.510323e+01 # HAT + 1419 95 6 0.1480 9.403524e+00 -1.251139e+01 -1.511972e+01 # HAT + 1420 95 6 0.1480 8.367955e+00 -1.476483e+01 -1.512522e+01 # HAT + 1421 95 6 0.1480 5.898662e+00 -1.499476e+01 -1.511422e+01 # HAT + 1422 95 6 0.1480 4.464937e+00 -1.297126e+01 -1.509773e+01 # HAT + 1423 95 7 0.0920 5.765101e+00 -9.553253e+00 -1.560182e+01 # HT + 1424 95 7 0.0920 4.313015e+00 -1.058213e+01 -1.559954e+01 # HT + 1425 95 7 0.0920 5.046593e+00 -1.007491e+01 -1.405950e+01 # HT + 1426 96 1 -2.2897 8.018714e+00 -6.023042e+00 6.060337e+00 # CAT + 1427 96 2 -2.3557 8.013557e+00 -4.831507e+00 6.795334e+00 # CAO + 1428 96 3 -2.3537 7.171494e+00 -3.779107e+00 6.416674e+00 # CAM + 1429 96 4 -2.3627 6.334588e+00 -3.918241e+00 5.303018e+00 # CAP + 1430 96 3 -2.3537 6.339745e+00 -5.109775e+00 4.568022e+00 # CAM + 1431 96 2 -2.3557 7.181807e+00 -6.162175e+00 4.946681e+00 # CAO + 1432 96 5 -2.4057 8.926939e+00 -7.158131e+00 6.468749e+00 # CTT + 1433 96 6 0.1480 8.659170e+00 -4.724176e+00 7.654440e+00 # HAT + 1434 96 6 0.1480 7.167515e+00 -2.859923e+00 6.983671e+00 # HAT + 1435 96 6 0.1480 5.684996e+00 -3.106389e+00 5.010909e+00 # HAT + 1436 96 6 0.1480 5.694131e+00 -5.217106e+00 3.708915e+00 # HAT + 1437 96 6 0.1480 7.185785e+00 -7.081359e+00 4.379684e+00 # HAT + 1438 96 7 0.0920 9.080333e+00 -7.131256e+00 7.547567e+00 # HT + 1439 96 7 0.0920 8.469901e+00 -8.107851e+00 6.190816e+00 # HT + 1440 96 7 0.0920 9.887120e+00 -7.055818e+00 5.963097e+00 # HT + 1441 97 1 -2.2897 1.159832e+01 -1.139460e+01 -4.402062e+00 # CAT + 1442 97 2 -2.3557 1.161785e+01 -1.181286e+01 -5.737980e+00 # CAO + 1443 97 3 -2.3537 1.109937e+01 -1.098275e+01 -6.739033e+00 # CAM + 1444 97 4 -2.3627 1.056137e+01 -9.734388e+00 -6.404167e+00 # CAP + 1445 97 3 -2.3537 1.054184e+01 -9.316128e+00 -5.068249e+00 # CAM + 1446 97 2 -2.3557 1.106032e+01 -1.014623e+01 -4.067197e+00 # CAO + 1447 97 5 -2.4057 1.215753e+01 -1.228993e+01 -3.322355e+00 # CTT + 1448 97 6 0.1480 1.203288e+01 -1.277589e+01 -5.996305e+00 # HAT + 1449 97 6 0.1480 1.111444e+01 -1.130541e+01 -7.769598e+00 # HAT + 1450 97 6 0.1480 1.016140e+01 -9.094019e+00 -7.176408e+00 # HAT + 1451 97 6 0.1480 1.012681e+01 -8.353102e+00 -4.809925e+00 # HAT + 1452 97 6 0.1480 1.104525e+01 -9.823576e+00 -3.036631e+00 # HAT + 1453 97 7 0.0920 1.295923e+01 -1.290170e+01 -3.736023e+00 # HT + 1454 97 7 0.0920 1.255005e+01 -1.167854e+01 -2.509812e+00 # HT + 1455 97 7 0.0920 1.136756e+01 -1.293677e+01 -2.940732e+00 # HT + 1456 98 1 -2.2897 1.097270e+01 -1.040427e+01 7.794839e+00 # CAT + 1457 98 2 -2.3557 9.768431e+00 -1.080133e+01 7.201475e+00 # CAO + 1458 98 3 -2.3537 9.740620e+00 -1.191187e+01 6.349457e+00 # CAM + 1459 98 4 -2.3627 1.091708e+01 -1.262535e+01 6.090803e+00 # CAP + 1460 98 3 -2.3537 1.212134e+01 -1.222828e+01 6.684167e+00 # CAM + 1461 98 2 -2.3557 1.214916e+01 -1.111775e+01 7.536185e+00 # CAO + 1462 98 5 -2.4057 1.100270e+01 -9.206479e+00 8.713800e+00 # CTT + 1463 98 6 0.1480 8.860879e+00 -1.025094e+01 7.401008e+00 # HAT + 1464 98 6 0.1480 8.811613e+00 -1.221818e+01 5.891719e+00 # HAT + 1465 98 6 0.1480 1.089562e+01 -1.348205e+01 5.433532e+00 # HAT + 1466 98 6 0.1480 1.302890e+01 -1.277868e+01 6.484634e+00 # HAT + 1467 98 6 0.1480 1.307816e+01 -1.081144e+01 7.993922e+00 # HAT + 1468 98 7 0.0920 1.003925e+01 -9.107301e+00 9.213841e+00 # HT + 1469 98 7 0.0920 1.178650e+01 -9.339522e+00 9.459490e+00 # HT + 1470 98 7 0.0920 1.120402e+01 -8.306753e+00 8.132370e+00 # HT + 1471 99 1 -2.2897 5.902108e+00 -1.280254e+01 -5.594853e+00 # CAT + 1472 99 2 -2.3557 6.108247e+00 -1.215230e+01 -6.817429e+00 # CAO + 1473 99 3 -2.3537 5.895951e+00 -1.077236e+01 -6.920873e+00 # CAM + 1474 99 4 -2.3627 5.477516e+00 -1.004266e+01 -5.801742e+00 # CAP + 1475 99 3 -2.3537 5.271377e+00 -1.069290e+01 -4.579166e+00 # CAM + 1476 99 2 -2.3557 5.483673e+00 -1.207284e+01 -4.475722e+00 # CAO + 1477 99 5 -2.4057 6.131085e+00 -1.429090e+01 -5.483281e+00 # CTT + 1478 99 6 0.1480 6.431040e+00 -1.271520e+01 -7.680759e+00 # HAT + 1479 99 6 0.1480 6.054972e+00 -1.027074e+01 -7.864003e+00 # HAT + 1480 99 6 0.1480 5.313744e+00 -8.978137e+00 -5.881541e+00 # HAT + 1481 99 6 0.1480 4.948584e+00 -1.012999e+01 -3.715835e+00 # HAT + 1482 99 6 0.1480 5.324652e+00 -1.257446e+01 -3.532592e+00 # HAT + 1483 99 7 0.0920 6.905706e+00 -1.459368e+01 -6.187828e+00 # HT + 1484 99 7 0.0920 6.447323e+00 -1.453537e+01 -4.469217e+00 # HT + 1485 99 7 0.0920 5.205750e+00 -1.481955e+01 -5.712147e+00 # HT + 1486 100 1 -2.2897 5.216360e-01 7.390706e+00 3.157980e-01 # CAT + 1487 100 2 -2.3557 -6.668380e-01 6.672686e+00 4.946240e-01 # CAO + 1488 100 3 -2.3537 -7.306110e-01 5.651322e+00 1.450003e+00 # CAM + 1489 100 4 -2.3627 3.940880e-01 5.347977e+00 2.226554e+00 # CAP + 1490 100 3 -2.3537 1.582561e+00 6.065997e+00 2.047728e+00 # CAM + 1491 100 2 -2.3557 1.646335e+00 7.087361e+00 1.092350e+00 # CAO + 1492 100 5 -2.4057 5.904210e-01 8.492320e+00 -7.146450e-01 # CTT + 1493 100 6 0.1480 -1.534463e+00 6.906695e+00 -1.044300e-01 # HAT + 1494 100 6 0.1480 -1.647434e+00 5.097421e+00 1.587954e+00 # HAT + 1495 100 6 0.1480 3.448910e-01 4.560067e+00 2.963560e+00 # HAT + 1496 100 6 0.1480 2.450187e+00 5.831987e+00 2.646783e+00 # HAT + 1497 100 6 0.1480 2.563158e+00 7.641262e+00 9.543990e-01 # HAT + 1498 100 7 0.0920 -3.941800e-01 8.945800e+00 -8.287500e-01 # HT + 1499 100 7 0.0920 1.303490e+00 9.250136e+00 -3.900710e-01 # HT + 1500 100 7 0.0920 9.116740e-01 8.077362e+00 -1.670001e+00 # HT + 1501 101 1 -2.2897 3.742060e+00 9.359838e+00 -1.051156e+01 # CAT + 1502 101 2 -2.3557 3.067834e+00 9.013687e+00 -1.168867e+01 # CAO + 1503 101 3 -2.3537 3.009054e+00 7.674891e+00 -1.209385e+01 # CAM + 1504 101 4 -2.3627 3.624502e+00 6.682247e+00 -1.132192e+01 # CAP + 1505 101 3 -2.3537 4.298729e+00 7.028398e+00 -1.014481e+01 # CAM + 1506 101 2 -2.3557 4.357508e+00 8.367192e+00 -9.739626e+00 # CAO + 1507 101 5 -2.4057 3.805458e+00 1.080382e+01 -1.007454e+01 # CTT + 1508 101 6 0.1480 2.593060e+00 9.779441e+00 -1.228416e+01 # HAT + 1509 101 6 0.1480 2.488937e+00 7.407861e+00 -1.300191e+01 # HAT + 1510 101 6 0.1480 3.579158e+00 5.649462e+00 -1.163449e+01 # HAT + 1511 101 6 0.1480 4.773503e+00 6.262642e+00 -9.549317e+00 # HAT + 1512 101 6 0.1480 4.877626e+00 8.634223e+00 -8.831567e+00 # HAT + 1513 101 7 0.0920 2.912960e+00 1.132726e+01 -1.041742e+01 # HT + 1514 101 7 0.0920 3.859470e+00 1.085279e+01 -8.986983e+00 # HT + 1515 101 7 0.0920 4.689772e+00 1.127525e+01 -1.050332e+01 # HT + 1516 102 1 -2.2897 5.790821e+00 1.743258e+00 -1.151733e+01 # CAT + 1517 102 2 -2.3557 6.762540e+00 1.054323e+00 -1.225295e+01 # CAO + 1518 102 3 -2.3537 7.158187e+00 -2.298010e-01 -1.185990e+01 # CAM + 1519 102 4 -2.3627 6.582116e+00 -8.249900e-01 -1.073123e+01 # CAP + 1520 102 3 -2.3537 5.610397e+00 -1.360550e-01 -9.995616e+00 # CAM + 1521 102 2 -2.3557 5.214749e+00 1.148068e+00 -1.038867e+01 # CAO + 1522 102 5 -2.4057 5.364088e+00 3.128277e+00 -1.194127e+01 # CTT + 1523 102 6 0.1480 7.206939e+00 1.513469e+00 -1.312364e+01 # HAT + 1524 102 6 0.1480 7.907799e+00 -7.612650e-01 -1.242737e+01 # HAT + 1525 102 6 0.1480 6.887329e+00 -1.815600e+00 -1.042802e+01 # HAT + 1526 102 6 0.1480 5.165998e+00 -5.952020e-01 -9.124929e+00 # HAT + 1527 102 6 0.1480 4.465138e+00 1.679532e+00 -9.821192e+00 # HAT + 1528 102 7 0.0920 5.461378e+00 3.223926e+00 -1.302270e+01 # HT + 1529 102 7 0.0920 4.325433e+00 3.292727e+00 -1.165447e+01 # HT + 1530 102 7 0.0920 5.996975e+00 3.869380e+00 -1.145309e+01 # HT + 1531 103 1 -2.2897 1.440694e+01 -6.070601e+00 1.167603e+01 # CAT + 1532 103 2 -2.3557 1.413987e+01 -7.085700e+00 1.260244e+01 # CAO + 1533 103 3 -2.3537 1.447403e+01 -6.908831e+00 1.395042e+01 # CAM + 1534 103 4 -2.3627 1.507527e+01 -5.716864e+00 1.437199e+01 # CAP + 1535 103 3 -2.3537 1.534235e+01 -4.701764e+00 1.344557e+01 # CAM + 1536 103 2 -2.3557 1.500819e+01 -4.878633e+00 1.209760e+01 # CAO + 1537 103 5 -2.4057 1.404652e+01 -6.261366e+00 1.022213e+01 # CTT + 1538 103 6 0.1480 1.367605e+01 -8.005218e+00 1.227723e+01 # HAT + 1539 103 6 0.1480 1.426800e+01 -7.691908e+00 1.466508e+01 # HAT + 1540 103 6 0.1480 1.533306e+01 -5.580422e+00 1.541186e+01 # HAT + 1541 103 6 0.1480 1.580617e+01 -3.782246e+00 1.377078e+01 # HAT + 1542 103 6 0.1480 1.521422e+01 -4.095556e+00 1.138293e+01 # HAT + 1543 103 7 0.0920 1.317731e+01 -6.914573e+00 1.014543e+01 # HT + 1544 103 7 0.0920 1.381458e+01 -5.294776e+00 9.774916e+00 # HT + 1545 103 7 0.0920 1.488714e+01 -6.712652e+00 9.695068e+00 # HT + 1546 104 1 -2.2897 -2.482202e+00 1.402149e+01 1.418476e+01 # CAT + 1547 104 2 -2.3557 -1.144630e+00 1.434808e+01 1.443822e+01 # CAO + 1548 104 3 -2.3537 -1.453870e-01 1.395269e+01 1.354090e+01 # CAM + 1549 104 4 -2.3627 -4.837150e-01 1.323071e+01 1.239013e+01 # CAP + 1550 104 3 -2.3537 -1.821287e+00 1.290411e+01 1.213667e+01 # CAM + 1551 104 2 -2.3557 -2.820530e+00 1.329950e+01 1.303399e+01 # CAO + 1552 104 5 -2.4057 -3.559957e+00 1.444794e+01 1.515258e+01 # CTT + 1553 104 6 0.1480 -8.836330e-01 1.490503e+01 1.532595e+01 # HAT + 1554 104 6 0.1480 8.864550e-01 1.420463e+01 1.373642e+01 # HAT + 1555 104 6 0.1480 2.871300e-01 1.292569e+01 1.169791e+01 # HAT + 1556 104 6 0.1480 -2.082284e+00 1.234716e+01 1.124893e+01 # HAT + 1557 104 6 0.1480 -3.852372e+00 1.304756e+01 1.283847e+01 # HAT + 1558 104 7 0.0920 -3.263036e+00 1.537540e+01 1.564224e+01 # HT + 1559 104 7 0.0920 -4.493003e+00 1.460583e+01 1.461166e+01 # HT + 1560 104 7 0.0920 -3.702920e+00 1.367087e+01 1.590347e+01 # HT + 1561 105 1 -2.2897 -1.333497e+01 8.938620e-01 8.000506e+00 # CAT + 1562 105 2 -2.3557 -1.282236e+01 -3.141580e-01 7.512741e+00 # CAO + 1563 105 3 -2.3537 -1.327348e+01 -8.226600e-01 6.288849e+00 # CAM + 1564 105 4 -2.3627 -1.423722e+01 -1.231420e-01 5.552723e+00 # CAP + 1565 105 3 -2.3537 -1.474983e+01 1.084878e+00 6.040489e+00 # CAM + 1566 105 2 -2.3557 -1.429871e+01 1.593380e+00 7.264380e+00 # CAO + 1567 105 5 -2.4057 -1.284840e+01 1.442318e+00 9.320561e+00 # CTT + 1568 105 6 0.1480 -1.207890e+01 -8.537860e-01 8.080609e+00 # HAT + 1569 105 6 0.1480 -1.287804e+01 -1.754561e+00 5.912572e+00 # HAT + 1570 105 6 0.1480 -1.458523e+01 -5.154150e-01 4.608578e+00 # HAT + 1571 105 6 0.1480 -1.549329e+01 1.624507e+00 5.472620e+00 # HAT + 1572 105 6 0.1480 -1.469415e+01 2.525282e+00 7.640656e+00 # HAT + 1573 105 7 0.0920 -1.181698e+01 1.130972e+00 9.485945e+00 # HT + 1574 105 7 0.0920 -1.290050e+01 2.530941e+00 9.303670e+00 # HT + 1575 105 7 0.0920 -1.347598e+01 1.061508e+00 1.012631e+01 # HT + 1576 106 1 -2.2897 -1.090187e+01 -1.510898e+01 -2.175142e+00 # CAT + 1577 106 2 -2.3557 -9.518208e+00 -1.529910e+01 -2.271776e+00 # CAO + 1578 106 3 -2.3537 -8.743893e+00 -1.540864e+01 -1.110553e+00 # CAM + 1579 106 4 -2.3627 -9.353240e+00 -1.532806e+01 1.473030e-01 # CAP + 1580 106 3 -2.3537 -1.073690e+01 -1.513795e+01 2.439370e-01 # CAM + 1581 106 2 -2.3557 -1.151121e+01 -1.502841e+01 -9.172850e-01 # CAO + 1582 106 5 -2.4057 -1.173702e+01 -1.499084e+01 -3.427603e+00 # CTT + 1583 106 6 0.1480 -9.048140e+00 -1.536126e+01 -3.242123e+00 # HAT + 1584 106 6 0.1480 -7.676498e+00 -1.555530e+01 -1.185100e+00 # HAT + 1585 106 6 0.1480 -8.755912e+00 -1.541257e+01 1.043104e+00 # HAT + 1586 106 6 0.1480 -1.120697e+01 -1.507579e+01 1.214285e+00 # HAT + 1587 106 6 0.1480 -1.257861e+01 -1.488175e+01 -8.427380e-01 # HAT + 1588 106 7 0.0920 -1.127693e+01 -1.557064e+01 -4.227756e+00 # HT + 1589 106 7 0.0920 -1.273963e+01 -1.537198e+01 -3.233676e+00 # HT + 1590 106 7 0.0920 -1.179822e+01 -1.394448e+01 -3.726759e+00 # HT + 1591 107 1 -2.2897 1.485156e+01 -8.683868e+00 3.837336e+00 # CAT + 1592 107 2 -2.3557 1.448918e+01 -9.659552e+00 2.901002e+00 # CAO + 1593 107 3 -2.3537 1.461091e+01 -9.395029e+00 1.531618e+00 # CAM + 1594 107 4 -2.3627 1.509501e+01 -8.154824e+00 1.098569e+00 # CAP + 1595 107 3 -2.3537 1.545739e+01 -7.179140e+00 2.034904e+00 # CAM + 1596 107 2 -2.3557 1.533567e+01 -7.443662e+00 3.404287e+00 # CAO + 1597 107 5 -2.4057 1.472027e+01 -8.969174e+00 5.314314e+00 # CTT + 1598 107 6 0.1480 1.411573e+01 -1.061628e+01 3.235068e+00 # HAT + 1599 107 6 0.1480 1.433136e+01 -1.014770e+01 8.093030e-01 # HAT + 1600 107 6 0.1480 1.518891e+01 -7.950763e+00 4.218700e-02 # HAT + 1601 107 6 0.1480 1.583085e+01 -6.222410e+00 1.700837e+00 # HAT + 1602 107 6 0.1480 1.561522e+01 -6.690992e+00 4.126602e+00 # HAT + 1603 107 7 0.0920 1.485736e+01 -1.003575e+01 5.492456e+00 # HT + 1604 107 7 0.0920 1.547861e+01 -8.409473e+00 5.861824e+00 # HT + 1605 107 7 0.0920 1.372995e+01 -8.668546e+00 5.656340e+00 # HT + 1606 108 1 -2.2897 7.053604e+00 -1.198305e+00 1.433600e+01 # CAT + 1607 108 2 -2.3557 5.850128e+00 -8.496370e-01 1.371143e+01 # CAO + 1608 108 3 -2.3537 5.410047e+00 4.792340e-01 1.373219e+01 # CAM + 1609 108 4 -2.3627 6.173441e+00 1.459437e+00 1.437750e+01 # CAP + 1610 108 3 -2.3537 7.376917e+00 1.110769e+00 1.500206e+01 # CAM + 1611 108 2 -2.3557 7.816999e+00 -2.181010e-01 1.498131e+01 # CAO + 1612 108 5 -2.4057 7.528264e+00 -2.631586e+00 1.431361e+01 # CTT + 1613 108 6 0.1480 5.261224e+00 -1.605793e+00 1.321362e+01 # HAT + 1614 108 6 0.1480 4.481651e+00 7.482070e-01 1.325038e+01 # HAT + 1615 108 6 0.1480 5.833950e+00 2.484566e+00 1.439351e+01 # HAT + 1616 108 6 0.1480 7.965822e+00 1.866926e+00 1.549988e+01 # HAT + 1617 108 6 0.1480 8.745395e+00 -4.870740e-01 1.546311e+01 # HAT + 1618 108 7 0.0920 7.174268e+00 -3.117948e+00 1.340463e+01 # HT + 1619 108 7 0.0920 8.617781e+00 -2.654456e+00 1.433661e+01 # HT + 1620 108 7 0.0920 7.135865e+00 -3.158447e+00 1.518340e+01 # HT + 1621 109 1 -2.2897 -5.062468e+00 -8.672008e+00 -5.149188e+00 # CAT + 1622 109 2 -2.3557 -5.546499e+00 -9.500329e+00 -6.168795e+00 # CAO + 1623 109 3 -2.3537 -4.847095e+00 -9.604849e+00 -7.377063e+00 # CAM + 1624 109 4 -2.3627 -3.663660e+00 -8.881048e+00 -7.565723e+00 # CAP + 1625 109 3 -2.3537 -3.179628e+00 -8.052728e+00 -6.546116e+00 # CAM + 1626 109 2 -2.3557 -3.879032e+00 -7.948208e+00 -5.337849e+00 # CAO + 1627 109 5 -2.4057 -5.816824e+00 -8.559276e+00 -3.845986e+00 # CTT + 1628 109 6 0.1480 -6.459435e+00 -1.005869e+01 -6.023257e+00 # HAT + 1629 109 6 0.1480 -5.220491e+00 -1.024384e+01 -8.163617e+00 # HAT + 1630 109 6 0.1480 -3.124119e+00 -8.961678e+00 -8.497815e+00 # HAT + 1631 109 6 0.1480 -2.266692e+00 -7.494367e+00 -6.691654e+00 # HAT + 1632 109 6 0.1480 -3.505636e+00 -7.309217e+00 -4.551295e+00 # HAT + 1633 109 7 0.0920 -6.339824e+00 -9.494515e+00 -3.646235e+00 # HT + 1634 109 7 0.0920 -5.116047e+00 -8.355392e+00 -3.036392e+00 # HT + 1635 109 7 0.0920 -6.539911e+00 -7.746431e+00 -3.913271e+00 # HT + 1636 110 1 -2.2897 7.826080e-01 -1.315461e+01 9.963484e+00 # CAT + 1637 110 2 -2.3557 -7.975300e-02 -1.240422e+01 9.155251e+00 # CAO + 1638 110 3 -2.3537 7.728100e-02 -1.101605e+01 9.064012e+00 # CAM + 1639 110 4 -2.3627 1.096675e+00 -1.037827e+01 9.781006e+00 # CAP + 1640 110 3 -2.3537 1.959035e+00 -1.112867e+01 1.058924e+01 # CAM + 1641 110 2 -2.3557 1.802002e+00 -1.251684e+01 1.068048e+01 # CAO + 1642 110 5 -2.4057 6.132360e-01 -1.465185e+01 1.006189e+01 # CTT + 1643 110 6 0.1480 -8.661420e-01 -1.289621e+01 8.602142e+00 # HAT + 1644 110 6 0.1480 -5.879680e-01 -1.043717e+01 8.440518e+00 # HAT + 1645 110 6 0.1480 1.217816e+00 -9.307398e+00 9.710622e+00 # HAT + 1646 110 6 0.1480 2.745425e+00 -1.063667e+01 1.114235e+01 # HAT + 1647 110 6 0.1480 2.467251e+00 -1.309572e+01 1.130397e+01 # HAT + 1648 110 7 0.0920 2.007540e-01 -1.503353e+01 9.127930e+00 # HT + 1649 110 7 0.0920 1.581799e+00 -1.511618e+01 1.024732e+01 # HT + 1650 110 7 0.0920 -6.528200e-02 -1.488817e+01 1.088157e+01 # HT + 1651 111 1 -2.2897 -1.291260e+01 -8.264540e-01 -9.041030e+00 # CAT + 1652 111 2 -2.3557 -1.280581e+01 -3.265760e-01 -7.737680e+00 # CAO + 1653 111 3 -2.3537 -1.336279e+01 -1.037064e+00 -6.667642e+00 # CAM + 1654 111 4 -2.3627 -1.402655e+01 -2.247430e+00 -6.900953e+00 # CAP + 1655 111 3 -2.3537 -1.413334e+01 -2.747308e+00 -8.204302e+00 # CAM + 1656 111 2 -2.3557 -1.357636e+01 -2.036820e+00 -9.274340e+00 # CAO + 1657 111 5 -2.4057 -1.231185e+01 -6.014200e-02 -1.019514e+01 # CTT + 1658 111 6 0.1480 -1.229377e+01 6.071350e-01 -7.557698e+00 # HAT + 1659 111 6 0.1480 -1.328041e+01 -6.514440e-01 -5.662201e+00 # HAT + 1660 111 6 0.1480 -1.445622e+01 -2.795521e+00 -6.075494e+00 # HAT + 1661 111 6 0.1480 -1.464538e+01 -3.681019e+00 -8.384284e+00 # HAT + 1662 111 6 0.1480 -1.365873e+01 -2.422440e+00 -1.027978e+01 # HAT + 1663 111 7 0.0920 -1.144219e+01 4.977990e-01 -9.848044e+00 # HT + 1664 111 7 0.0920 -1.200770e+01 -7.573720e-01 -1.097582e+01 # HT + 1665 111 7 0.0920 -1.305142e+01 6.331000e-01 -1.059585e+01 # HT + 1666 112 1 -2.2897 3.669180e+00 -1.289656e+01 1.859004e+00 # CAT + 1667 112 2 -2.3557 3.066123e+00 -1.258217e+01 6.352890e-01 # CAO + 1668 112 3 -2.3537 3.856992e+00 -1.222813e+01 -4.643390e-01 # CAM + 1669 112 4 -2.3627 5.250918e+00 -1.218848e+01 -3.402530e-01 # CAP + 1670 112 3 -2.3537 5.853976e+00 -1.250288e+01 8.834620e-01 # CAM + 1671 112 2 -2.3557 5.063107e+00 -1.285692e+01 1.983090e+00 # CAO + 1672 112 5 -2.4057 2.816172e+00 -1.327842e+01 3.045032e+00 # CTT + 1673 112 6 0.1480 1.990809e+00 -1.261275e+01 5.395650e-01 # HAT + 1674 112 6 0.1480 3.391777e+00 -1.198559e+01 -1.408348e+00 # HAT + 1675 112 6 0.1480 5.861018e+00 -1.191537e+01 -1.188538e+00 # HAT + 1676 112 6 0.1480 6.929291e+00 -1.247229e+01 9.791860e-01 # HAT + 1677 112 6 0.1480 5.528323e+00 -1.309945e+01 2.927099e+00 # HAT + 1678 112 7 0.0920 1.904314e+00 -1.376323e+01 2.696357e+00 # HT + 1679 112 7 0.0920 3.369928e+00 -1.396487e+01 3.685527e+00 # HT + 1680 112 7 0.0920 2.557650e+00 -1.238319e+01 3.610567e+00 # HT + 1681 113 1 -2.2897 2.691100e+00 -3.765048e+00 1.065112e+01 # CAT + 1682 113 2 -2.3557 3.376504e+00 -2.573420e+00 1.038608e+01 # CAO + 1683 113 3 -2.3537 3.142258e+00 -1.440821e+00 1.117498e+01 # CAM + 1684 113 4 -2.3627 2.222609e+00 -1.499851e+00 1.222890e+01 # CAP + 1685 113 3 -2.3537 1.537206e+00 -2.691479e+00 1.249394e+01 # CAM + 1686 113 2 -2.3557 1.771451e+00 -3.824078e+00 1.170505e+01 # CAO + 1687 113 5 -2.4057 2.943750e+00 -4.986637e+00 9.800245e+00 # CTT + 1688 113 6 0.1480 4.085947e+00 -2.527883e+00 9.573056e+00 # HAT + 1689 113 6 0.1480 3.670999e+00 -5.215650e-01 1.097052e+01 # HAT + 1690 113 6 0.1480 2.041906e+00 -6.261320e-01 1.283748e+01 # HAT + 1691 113 6 0.1480 8.277620e-01 -2.737016e+00 1.330697e+01 # HAT + 1692 113 6 0.1480 1.242710e+00 -4.743334e+00 1.190950e+01 # HAT + 1693 113 7 0.0920 3.968988e+00 -4.966915e+00 9.430650e+00 # HT + 1694 113 7 0.0920 2.791017e+00 -5.884790e+00 1.039865e+01 # HT + 1695 113 7 0.0920 2.253882e+00 -4.991268e+00 8.956349e+00 # HT + 1696 114 1 -2.2897 1.480026e+01 7.773135e+00 -6.883086e+00 # CAT + 1697 114 2 -2.3557 1.483961e+01 9.031244e+00 -7.495959e+00 # CAO + 1698 114 3 -2.3537 1.500052e+01 9.129373e+00 -8.883216e+00 # CAM + 1699 114 4 -2.3627 1.512208e+01 7.969393e+00 -9.657598e+00 # CAP + 1700 114 3 -2.3537 1.508273e+01 6.711284e+00 -9.044725e+00 # CAM + 1701 114 2 -2.3557 1.492182e+01 6.613154e+00 -7.657469e+00 # CAO + 1702 114 5 -2.4057 1.462671e+01 7.667296e+00 -5.386832e+00 # CTT + 1703 114 6 0.1480 1.474583e+01 9.926085e+00 -6.898579e+00 # HAT + 1704 114 6 0.1480 1.503087e+01 1.009991e+01 -9.356003e+00 # HAT + 1705 114 6 0.1480 1.524621e+01 8.045092e+00 -1.072777e+01 # HAT + 1706 114 6 0.1480 1.517651e+01 5.816442e+00 -9.642106e+00 # HAT + 1707 114 6 0.1480 1.489147e+01 5.642613e+00 -7.184681e+00 # HAT + 1708 114 7 0.0920 1.404468e+01 8.515801e+00 -5.027129e+00 # HT + 1709 114 7 0.0920 1.410502e+01 6.741132e+00 -5.145663e+00 # HT + 1710 114 7 0.0920 1.560496e+01 7.668446e+00 -4.906090e+00 # HT + 1711 115 1 -2.2897 8.921963e+00 3.704670e-01 8.737032e+00 # CAT + 1712 115 2 -2.3557 9.429860e+00 -9.116820e-01 8.978142e+00 # CAO + 1713 115 3 -2.3537 1.039505e+01 -1.106532e+00 9.973352e+00 # CAM + 1714 115 4 -2.3627 1.085234e+01 -1.923400e-02 1.072745e+01 # CAP + 1715 115 3 -2.3537 1.034445e+01 1.262915e+00 1.048634e+01 # CAM + 1716 115 2 -2.3557 9.379256e+00 1.457766e+00 9.491131e+00 # CAO + 1717 115 5 -2.4057 7.880937e+00 5.806270e-01 7.663628e+00 # CTT + 1718 115 6 0.1480 9.077092e+00 -1.750455e+00 8.396409e+00 # HAT + 1719 115 6 0.1480 1.078686e+01 -2.095618e+00 1.015935e+01 # HAT + 1720 115 6 0.1480 1.159692e+01 -1.695470e-01 1.149518e+01 # HAT + 1721 115 6 0.1480 1.069721e+01 2.101689e+00 1.106807e+01 # HAT + 1722 115 6 0.1480 8.987449e+00 2.446852e+00 9.305132e+00 # HAT + 1723 115 7 0.0920 7.276682e+00 -3.207680e-01 7.561331e+00 # HT + 1724 115 7 0.0920 7.239543e+00 1.418202e+00 7.937820e+00 # HT + 1725 115 7 0.0920 8.374047e+00 7.963680e-01 6.715789e+00 # HT + 1726 116 1 -2.2897 -8.783770e+00 2.631318e+00 4.578235e+00 # CAT + 1727 116 2 -2.3557 -9.809750e+00 3.577836e+00 4.471148e+00 # CAO + 1728 116 3 -2.3537 -1.114535e+01 3.180924e+00 4.607636e+00 # CAM + 1729 116 4 -2.3627 -1.145497e+01 1.837493e+00 4.851210e+00 # CAP + 1730 116 3 -2.3537 -1.042899e+01 8.909750e-01 4.958296e+00 # CAM + 1731 116 2 -2.3557 -9.093392e+00 1.287887e+00 4.821809e+00 # CAO + 1732 116 5 -2.4057 -7.343228e+00 3.059416e+00 4.431024e+00 # CTT + 1733 116 6 0.1480 -9.570899e+00 4.614197e+00 4.283249e+00 # HAT + 1734 116 6 0.1480 -1.193682e+01 3.911095e+00 4.525026e+00 # HAT + 1735 116 6 0.1480 -1.248530e+01 1.531303e+00 4.956500e+00 # HAT + 1736 116 6 0.1480 -1.066784e+01 -1.453870e-01 5.146196e+00 # HAT + 1737 116 6 0.1480 -8.301921e+00 5.577150e-01 4.904418e+00 # HAT + 1738 116 7 0.0920 -7.232752e+00 4.088554e+00 4.772741e+00 # HT + 1739 116 7 0.0920 -6.707007e+00 2.407929e+00 5.030095e+00 # HT + 1740 116 7 0.0920 -7.048587e+00 2.991229e+00 3.383819e+00 # HT + 1741 117 1 -2.2897 9.838466e+00 7.528724e+00 3.793763e+00 # CAT + 1742 117 2 -2.3557 1.040992e+01 6.412119e+00 4.415559e+00 # CAO + 1743 117 3 -2.3537 1.053779e+01 6.375987e+00 5.809240e+00 # CAM + 1744 117 4 -2.3627 1.009419e+01 7.456458e+00 6.581124e+00 # CAP + 1745 117 3 -2.3537 9.522736e+00 8.573063e+00 5.959328e+00 # CAM + 1746 117 2 -2.3557 9.394872e+00 8.609195e+00 4.565648e+00 # CAO + 1747 117 5 -2.4057 9.700556e+00 7.567695e+00 2.290580e+00 # CTT + 1748 117 6 0.1480 1.075213e+01 5.578613e+00 3.820106e+00 # HAT + 1749 117 6 0.1480 1.097863e+01 5.514607e+00 6.288912e+00 # HAT + 1750 117 6 0.1480 1.019283e+01 7.428585e+00 7.656249e+00 # HAT + 1751 117 6 0.1480 9.180535e+00 9.406569e+00 6.554782e+00 # HAT + 1752 117 6 0.1480 8.954032e+00 9.470576e+00 4.085976e+00 # HAT + 1753 117 7 0.0920 9.575607e+00 6.553868e+00 1.910259e+00 # HT + 1754 117 7 0.0920 8.830646e+00 8.166332e+00 2.020410e+00 # HT + 1755 117 7 0.0920 1.059572e+01 8.011056e+00 1.854447e+00 # HT + 1756 118 1 -2.2897 -1.442953e+01 3.205871e+00 1.871362e+00 # CAT + 1757 118 2 -2.3557 -1.524982e+01 4.269017e+00 1.475329e+00 # CAO + 1758 118 3 -2.3537 -1.472075e+01 5.561214e+00 1.373811e+00 # CAM + 1759 118 4 -2.3627 -1.337138e+01 5.790264e+00 1.668325e+00 # CAP + 1760 118 3 -2.3537 -1.255109e+01 4.727119e+00 2.064358e+00 # CAM + 1761 118 2 -2.3557 -1.308016e+01 3.434923e+00 2.165876e+00 # CAO + 1762 118 5 -2.4057 -1.500018e+01 1.812145e+00 1.980856e+00 # CTT + 1763 118 6 0.1480 -1.629077e+01 4.092320e+00 1.248133e+00 # HAT + 1764 118 6 0.1480 -1.535354e+01 6.381355e+00 1.068300e+00 # HAT + 1765 118 6 0.1480 -1.296323e+01 6.787102e+00 1.590011e+00 # HAT + 1766 118 6 0.1480 -1.151014e+01 4.903816e+00 2.291554e+00 # HAT + 1767 118 6 0.1480 -1.244736e+01 2.614782e+00 2.471387e+00 # HAT + 1768 118 7 0.0920 -1.581163e+01 1.693768e+00 1.262782e+00 # HT + 1769 118 7 0.0920 -1.421929e+01 1.081615e+00 1.769584e+00 # HT + 1770 118 7 0.0920 -1.538212e+01 1.653555e+00 2.989353e+00 # HT + 1771 119 1 -2.2897 -1.115158e+01 -1.425992e+01 6.732243e+00 # CAT + 1772 119 2 -2.3557 -1.196293e+01 -1.435384e+01 5.595186e+00 # CAO + 1773 119 3 -2.3537 -1.143741e+01 -1.485937e+01 4.400083e+00 # CAM + 1774 119 4 -2.3627 -1.010054e+01 -1.527098e+01 4.342037e+00 # CAP + 1775 119 3 -2.3537 -9.289195e+00 -1.517705e+01 5.479094e+00 # CAM + 1776 119 2 -2.3557 -9.814715e+00 -1.467153e+01 6.674196e+00 # CAO + 1777 119 5 -2.4057 -1.171839e+01 -1.371467e+01 8.021246e+00 # CTT + 1778 119 6 0.1480 -1.299422e+01 -1.403632e+01 5.639964e+00 # HAT + 1779 119 6 0.1480 -1.206330e+01 -1.493182e+01 3.522925e+00 # HAT + 1780 119 6 0.1480 -9.695138e+00 -1.566095e+01 3.420100e+00 # HAT + 1781 119 6 0.1480 -8.257898e+00 -1.549458e+01 5.434315e+00 # HAT + 1782 119 6 0.1480 -9.188820e+00 -1.459908e+01 7.551354e+00 # HAT + 1783 119 7 0.0920 -1.278327e+01 -1.394104e+01 8.074971e+00 # HT + 1784 119 7 0.0920 -1.120667e+01 -1.417420e+01 8.866872e+00 # HT + 1785 119 7 0.0920 -1.157497e+01 -1.263464e+01 8.053691e+00 # HT + 1786 120 1 -2.2897 1.928003e+00 2.853704e+00 7.037061e+00 # CAT + 1787 120 2 -2.3557 1.367216e+00 3.864441e+00 7.826953e+00 # CAO + 1788 120 3 -2.3537 2.346030e-01 3.597334e+00 8.605313e+00 # CAM + 1789 120 4 -2.3627 -3.372200e-01 2.319491e+00 8.593781e+00 # CAP + 1790 120 3 -2.3537 2.235670e-01 1.308754e+00 7.803889e+00 # CAM + 1791 120 2 -2.3557 1.356178e+00 1.575861e+00 7.025529e+00 # CAO + 1792 120 5 -2.4057 3.149605e+00 3.141798e+00 6.197544e+00 # CTT + 1793 120 6 0.1480 1.808337e+00 4.850206e+00 7.835849e+00 # HAT + 1794 120 6 0.1480 -1.980040e-01 4.377045e+00 9.214658e+00 # HAT + 1795 120 6 0.1480 -1.210950e+00 2.113436e+00 9.194231e+00 # HAT + 1796 120 6 0.1480 -2.175550e-01 3.229890e-01 7.794994e+00 # HAT + 1797 120 6 0.1480 1.788786e+00 7.961500e-01 6.416184e+00 # HAT + 1798 120 7 0.0920 3.749979e+00 3.912365e+00 6.681156e+00 # HT + 1799 120 7 0.0920 3.741879e+00 2.232744e+00 6.092980e+00 # HT + 1800 120 7 0.0920 2.840032e+00 3.488543e+00 5.211627e+00 # HT + 1801 121 1 -2.2897 -2.751472e+00 -5.157973e+00 -1.772767e+00 # CAT + 1802 121 2 -2.3557 -2.764936e+00 -4.342735e+00 -2.910839e+00 # CAO + 1803 121 3 -2.3537 -3.275484e+00 -3.041429e+00 -2.833738e+00 # CAM + 1804 121 4 -2.3627 -3.772568e+00 -2.555362e+00 -1.618565e+00 # CAP + 1805 121 3 -2.3537 -3.759104e+00 -3.370599e+00 -4.804940e-01 # CAM + 1806 121 2 -2.3557 -3.248556e+00 -4.671904e+00 -5.575940e-01 # CAO + 1807 121 5 -2.4057 -2.200809e+00 -6.561523e+00 -1.855926e+00 # CTT + 1808 121 6 0.1480 -2.381471e+00 -4.717702e+00 -3.848258e+00 # HAT + 1809 121 6 0.1480 -3.285870e+00 -2.412532e+00 -3.711678e+00 # HAT + 1810 121 6 0.1480 -4.166420e+00 -1.551497e+00 -1.559087e+00 # HAT + 1811 121 6 0.1480 -4.142569e+00 -2.995632e+00 4.569260e-01 # HAT + 1812 121 6 0.1480 -3.238170e+00 -5.300801e+00 3.203460e-01 # HAT + 1813 121 7 0.0920 -1.423395e+00 -6.602760e+00 -2.618834e+00 # HT + 1814 121 7 0.0920 -1.778331e+00 -6.844342e+00 -8.917560e-01 # HT + 1815 121 7 0.0920 -3.002638e+00 -7.252068e+00 -2.117305e+00 # HT + 1816 122 1 -2.2897 1.350243e+01 2.696234e+00 -7.919477e+00 # CAT + 1817 122 2 -2.3557 1.273451e+01 3.410477e+00 -6.992039e+00 # CAO + 1818 122 3 -2.3537 1.133731e+01 3.330882e+00 -7.030958e+00 # CAM + 1819 122 4 -2.3627 1.070805e+01 2.537044e+00 -7.997315e+00 # CAP + 1820 122 3 -2.3537 1.147598e+01 1.822801e+00 -8.924754e+00 # CAM + 1821 122 2 -2.3557 1.287317e+01 1.902396e+00 -8.885835e+00 # CAO + 1822 122 5 -2.4057 1.500941e+01 2.782083e+00 -7.877500e+00 # CTT + 1823 122 6 0.1480 1.321994e+01 4.022867e+00 -6.246563e+00 # HAT + 1824 122 6 0.1480 1.074491e+01 3.881870e+00 -6.315505e+00 # HAT + 1825 122 6 0.1480 9.630212e+00 2.475642e+00 -8.027339e+00 # HAT + 1826 122 6 0.1480 1.099054e+01 1.210411e+00 -9.670230e+00 # HAT + 1827 122 6 0.1480 1.346557e+01 1.351408e+00 -9.601287e+00 # HAT + 1828 122 7 0.0920 1.533557e+01 2.954933e+00 -6.851908e+00 # HT + 1829 122 7 0.0920 1.543734e+01 1.848132e+00 -8.241791e+00 # HT + 1830 122 7 0.0920 1.534467e+01 3.605243e+00 -8.508457e+00 # HT + 1831 123 1 -2.2897 3.785378e+00 7.806950e+00 -4.675381e+00 # CAT + 1832 123 2 -2.3557 2.552886e+00 7.449670e+00 -4.115636e+00 # CAO + 1833 123 3 -2.3537 1.364288e+00 7.743054e+00 -4.794724e+00 # CAM + 1834 123 4 -2.3627 1.408182e+00 8.393720e+00 -6.033556e+00 # CAP + 1835 123 3 -2.3537 2.640673e+00 8.751001e+00 -6.593302e+00 # CAM + 1836 123 2 -2.3557 3.829271e+00 8.457616e+00 -5.914215e+00 # CAO + 1837 123 5 -2.4057 5.067366e+00 7.490514e+00 -3.942937e+00 # CTT + 1838 123 6 0.1480 2.519025e+00 6.947728e+00 -3.159965e+00 # HAT + 1839 123 6 0.1480 4.135090e-01 7.467438e+00 -4.362920e+00 # HAT + 1840 123 6 0.1480 4.912630e-01 8.620045e+00 -6.557425e+00 # HAT + 1841 123 6 0.1480 2.674534e+00 9.252943e+00 -7.548974e+00 # HAT + 1842 123 6 0.1480 4.780050e+00 8.733233e+00 -6.346019e+00 # HAT + 1843 123 7 0.0920 4.931625e+00 6.589710e+00 -3.344415e+00 # HT + 1844 123 7 0.0920 5.868382e+00 7.329456e+00 -4.664417e+00 # HT + 1845 123 7 0.0920 5.328814e+00 8.323630e+00 -3.290509e+00 # HT + 1846 124 1 -2.2897 8.061584e+00 6.340090e+00 -1.306458e+01 # CAT + 1847 124 2 -2.3557 6.711833e+00 6.688290e+00 -1.293446e+01 # CAO + 1848 124 3 -2.3537 6.331200e+00 8.035379e+00 -1.295612e+01 # CAM + 1849 124 4 -2.3627 7.300317e+00 9.034268e+00 -1.310788e+01 # CAP + 1850 124 3 -2.3537 8.650068e+00 8.686068e+00 -1.323799e+01 # CAM + 1851 124 2 -2.3557 9.030701e+00 7.338979e+00 -1.321634e+01 # CAO + 1852 124 5 -2.4057 8.472125e+00 4.887158e+00 -1.304122e+01 # CTT + 1853 124 6 0.1480 5.964228e+00 5.917718e+00 -1.281739e+01 # HAT + 1854 124 6 0.1480 5.289963e+00 8.303991e+00 -1.285574e+01 # HAT + 1855 124 6 0.1480 7.006685e+00 1.007345e+01 -1.312458e+01 # HAT + 1856 124 6 0.1480 9.397673e+00 9.456640e+00 -1.335506e+01 # HAT + 1857 124 6 0.1480 1.007194e+01 7.070368e+00 -1.331671e+01 # HAT + 1858 124 7 0.0920 7.664794e+00 4.274450e+00 -1.344236e+01 # HT + 1859 124 7 0.0920 9.366643e+00 4.752000e+00 -1.364923e+01 # HT + 1860 124 7 0.0920 8.681708e+00 4.584728e+00 -1.201521e+01 # HT + 1861 125 1 -2.2897 -2.549713e+00 9.789634e+00 8.472710e+00 # CAT + 1862 125 2 -2.3557 -1.424449e+00 1.061945e+01 8.400703e+00 # CAO + 1863 125 3 -2.3537 -4.451710e-01 1.038803e+01 7.427327e+00 # CAM + 1864 125 4 -2.3627 -5.911570e-01 9.326795e+00 6.525959e+00 # CAP + 1865 125 3 -2.3537 -1.716421e+00 8.496978e+00 6.597966e+00 # CAM + 1866 125 2 -2.3557 -2.695699e+00 8.728398e+00 7.571341e+00 # CAO + 1867 125 5 -2.4057 -3.605934e+00 1.003924e+01 9.522565e+00 # CTT + 1868 125 6 0.1480 -1.311831e+00 1.143812e+01 9.096044e+00 # HAT + 1869 125 6 0.1480 4.228900e-01 1.102818e+01 7.371779e+00 # HAT + 1870 125 6 0.1480 1.642860e-01 9.148271e+00 5.775069e+00 # HAT + 1871 125 6 0.1480 -1.829039e+00 7.678310e+00 5.902624e+00 # HAT + 1872 125 6 0.1480 -3.563760e+00 8.088253e+00 7.626890e+00 # HAT + 1873 125 7 0.0920 -3.643457e+00 1.110348e+01 9.755114e+00 # HT + 1874 125 7 0.0920 -4.576445e+00 9.715610e+00 9.146434e+00 # HT + 1875 125 7 0.0920 -3.361421e+00 9.479054e+00 1.042507e+01 # HT + 1876 126 1 -2.2897 1.451605e+01 2.865241e+00 2.456541e+00 # CAT + 1877 126 2 -2.3557 1.504542e+01 3.373650e+00 3.648721e+00 # CAO + 1878 126 3 -2.3537 1.458030e+01 4.592116e+00 4.157650e+00 # CAM + 1879 126 4 -2.3627 1.358582e+01 5.302173e+00 3.474400e+00 # CAP + 1880 126 3 -2.3537 1.305646e+01 4.793763e+00 2.282220e+00 # CAM + 1881 126 2 -2.3557 1.352157e+01 3.575298e+00 1.773290e+00 # CAO + 1882 126 5 -2.4057 1.501771e+01 1.551039e+00 1.907624e+00 # CTT + 1883 126 6 0.1480 1.581259e+01 2.825893e+00 4.175800e+00 # HAT + 1884 126 6 0.1480 1.498867e+01 4.984318e+00 5.077332e+00 # HAT + 1885 126 6 0.1480 1.322702e+01 6.242133e+00 3.867003e+00 # HAT + 1886 126 6 0.1480 1.228929e+01 5.341522e+00 1.755141e+00 # HAT + 1887 126 6 0.1480 1.311321e+01 3.183097e+00 8.536080e-01 # HAT + 1888 126 7 0.0920 1.533643e+01 9.110070e-01 2.730349e+00 # HT + 1889 126 7 0.0920 1.421806e+01 1.058999e+00 1.353945e+00 # HT + 1890 126 7 0.0920 1.586128e+01 1.733099e+00 1.241777e+00 # HT + 1891 127 1 -2.2897 -1.372433e+01 1.514106e+01 -5.264600e+00 # CAT + 1892 127 2 -2.3557 -1.240982e+01 1.519323e+01 -4.785692e+00 # CAO + 1893 127 3 -2.3537 -1.216919e+01 1.527912e+01 -3.409203e+00 # CAM + 1894 127 4 -2.3627 -1.324307e+01 1.531284e+01 -2.511623e+00 # CAP + 1895 127 3 -2.3537 -1.455757e+01 1.526068e+01 -2.990531e+00 # CAM + 1896 127 2 -2.3557 -1.479820e+01 1.517479e+01 -4.367019e+00 # CAO + 1897 127 5 -2.4057 -1.398386e+01 1.504843e+01 -6.749241e+00 # CTT + 1898 127 6 0.1480 -1.158140e+01 1.516721e+01 -5.478111e+00 # HAT + 1899 127 6 0.1480 -1.115514e+01 1.531936e+01 -3.039760e+00 # HAT + 1900 127 6 0.1480 -1.305744e+01 1.537910e+01 -1.449760e+00 # HAT + 1901 127 6 0.1480 -1.538599e+01 1.528669e+01 -2.298111e+00 # HAT + 1902 127 6 0.1480 -1.581225e+01 1.513455e+01 -4.736462e+00 # HAT + 1903 127 7 0.0920 -1.316068e+01 1.452011e+01 -7.230243e+00 # HT + 1904 127 7 0.0920 -1.491355e+01 1.450658e+01 -6.922973e+00 # HT + 1905 127 7 0.0920 -1.406497e+01 1.605162e+01 -7.167724e+00 # HT + 1906 128 1 -2.2897 -1.483493e+00 8.383138e+00 2.980222e+00 # CAT + 1907 128 2 -2.3557 -2.845707e+00 8.484447e+00 2.673446e+00 # CAO + 1908 128 3 -2.3537 -3.717088e+00 7.439458e+00 3.003136e+00 # CAM + 1909 128 4 -2.3627 -3.226256e+00 6.293162e+00 3.639601e+00 # CAP + 1910 128 3 -2.3537 -1.864043e+00 6.191854e+00 3.946377e+00 # CAM + 1911 128 2 -2.3557 -9.926610e-01 7.236841e+00 3.616687e+00 # CAO + 1912 128 5 -2.4057 -5.436460e-01 9.510231e+00 2.624628e+00 # CTT + 1913 128 6 0.1480 -3.224349e+00 9.368732e+00 2.182459e+00 # HAT + 1914 128 6 0.1480 -4.767938e+00 7.517611e+00 2.766480e+00 # HAT + 1915 128 6 0.1480 -3.898464e+00 5.487028e+00 3.893933e+00 # HAT + 1916 128 6 0.1480 -1.485401e+00 5.307567e+00 4.437364e+00 # HAT + 1917 128 6 0.1480 5.818900e-02 7.158688e+00 3.853343e+00 # HAT + 1918 128 7 0.0920 -1.084086e+00 1.045647e+01 2.650371e+00 # HT + 1919 128 7 0.0920 2.758900e-01 9.540833e+00 3.342628e+00 # HT + 1920 128 7 0.0920 -1.433470e-01 9.348148e+00 1.623834e+00 # HT + 1921 129 1 -2.2897 -1.498436e+01 1.154171e+01 -1.505108e+00 # CAT + 1922 129 2 -2.3557 -1.472194e+01 1.249848e+01 -5.173210e-01 # CAO + 1923 129 3 -2.3537 -1.468057e+01 1.212039e+01 8.300240e-01 # CAM + 1924 129 4 -2.3627 -1.490163e+01 1.078553e+01 1.189582e+00 # CAP + 1925 129 3 -2.3537 -1.516406e+01 9.828762e+00 2.017960e-01 # CAM + 1926 129 2 -2.3557 -1.520542e+01 1.020685e+01 -1.145549e+00 # CAO + 1927 129 5 -2.4057 -1.502898e+01 1.194950e+01 -2.958315e+00 # CTT + 1928 129 6 0.1480 -1.455140e+01 1.352823e+01 -7.946950e-01 # HAT + 1929 129 6 0.1480 -1.447813e+01 1.285847e+01 1.592031e+00 # HAT + 1930 129 6 0.1480 -1.486973e+01 1.049386e+01 2.228963e+00 # HAT + 1931 129 6 0.1480 -1.533459e+01 8.799013e+00 4.791700e-01 # HAT + 1932 129 6 0.1480 -1.540787e+01 9.468769e+00 -1.907555e+00 # HAT + 1933 129 7 0.0920 -1.435911e+01 1.279405e+01 -3.119956e+00 # HT + 1934 129 7 0.0920 -1.471395e+01 1.111219e+01 -3.581021e+00 # HT + 1935 129 7 0.0920 -1.604612e+01 1.223706e+01 -3.224464e+00 # HT + 1936 130 1 -2.2897 7.162802e+00 4.203182e+00 2.047940e+00 # CAT + 1937 130 2 -2.3557 6.589962e+00 2.974944e+00 1.696819e+00 # CAO + 1938 130 3 -2.3537 6.631757e+00 1.901063e+00 2.594056e+00 # CAM + 1939 130 4 -2.3627 7.246392e+00 2.055421e+00 3.842414e+00 # CAP + 1940 130 3 -2.3537 7.819231e+00 3.283659e+00 4.193535e+00 # CAM + 1941 130 2 -2.3557 7.777436e+00 4.357540e+00 3.296298e+00 # CAO + 1942 130 5 -2.4057 7.117723e+00 5.361438e+00 1.080206e+00 # CTT + 1943 130 6 0.1480 6.115816e+00 2.855868e+00 7.338000e-01 # HAT + 1944 130 6 0.1480 6.189852e+00 9.535650e-01 2.323191e+00 # HAT + 1945 130 6 0.1480 7.278633e+00 1.226999e+00 4.534568e+00 # HAT + 1946 130 6 0.1480 8.293378e+00 3.402735e+00 5.156555e+00 # HAT + 1947 130 6 0.1480 8.219341e+00 5.305038e+00 3.567163e+00 # HAT + 1948 130 7 0.0920 6.223448e+00 5.284297e+00 4.618020e-01 # HT + 1949 130 7 0.0920 7.094951e+00 6.299003e+00 1.635682e+00 # HT + 1950 130 7 0.0920 8.002182e+00 5.338296e+00 4.435770e-01 # HT + 1951 131 1 -2.2897 -5.388345e+00 1.137542e+01 7.418770e+00 # CAT + 1952 131 2 -2.3557 -4.077509e+00 1.183212e+01 7.236760e+00 # CAO + 1953 131 3 -2.3537 -3.239993e+00 1.120372e+01 6.307417e+00 # CAM + 1954 131 4 -2.3627 -3.713314e+00 1.011861e+01 5.560085e+00 # CAP + 1955 131 3 -2.3537 -5.024151e+00 9.661906e+00 5.742095e+00 # CAM + 1956 131 2 -2.3557 -5.861666e+00 1.029031e+01 6.671437e+00 # CAO + 1957 131 5 -2.4057 -6.291665e+00 1.205320e+01 8.421132e+00 # CTT + 1958 131 6 0.1480 -3.712375e+00 1.266921e+01 7.813273e+00 # HAT + 1959 131 6 0.1480 -2.228776e+00 1.155604e+01 6.167009e+00 # HAT + 1960 131 6 0.1480 -3.067231e+00 9.633843e+00 4.843164e+00 # HAT + 1961 131 6 0.1480 -5.389284e+00 8.824821e+00 5.165582e+00 # HAT + 1962 131 6 0.1480 -6.872883e+00 9.937993e+00 6.811845e+00 # HAT + 1963 131 7 0.0920 -6.017697e+00 1.310486e+01 8.505030e+00 # HT + 1964 131 7 0.0920 -7.327115e+00 1.197330e+01 8.090133e+00 # HT + 1965 131 7 0.0920 -6.183175e+00 1.157137e+01 9.392819e+00 # HT + 1966 132 1 -2.2897 1.082242e+01 4.282266e+00 -1.074652e+01 # CAT + 1967 132 2 -2.3557 9.922925e+00 4.897800e+00 -9.867866e+00 # CAO + 1968 132 3 -2.3537 8.712925e+00 4.269041e+00 -9.550750e+00 # CAM + 1969 132 4 -2.3627 8.402418e+00 3.024750e+00 -1.011229e+01 # CAP + 1970 132 3 -2.3537 9.301910e+00 2.409217e+00 -1.099094e+01 # CAM + 1971 132 2 -2.3557 1.051191e+01 3.037975e+00 -1.130806e+01 # CAO + 1972 132 5 -2.4057 1.212749e+01 4.960427e+00 -1.108855e+01 # CTT + 1973 132 6 0.1480 1.016246e+01 5.857682e+00 -9.434681e+00 # HAT + 1974 132 6 0.1480 8.019031e+00 4.743881e+00 -8.872932e+00 # HAT + 1975 132 6 0.1480 7.468988e+00 2.539708e+00 -9.867654e+00 # HAT + 1976 132 6 0.1480 9.062375e+00 1.449334e+00 -1.142413e+01 # HAT + 1977 132 6 0.1480 1.120580e+01 2.563134e+00 -1.198588e+01 # HAT + 1978 132 7 0.0920 1.245211e+01 5.570864e+00 -1.024589e+01 # HT + 1979 132 7 0.0920 1.288438e+01 4.205913e+00 -1.130286e+01 # HT + 1980 132 7 0.0920 1.198939e+01 5.594732e+00 -1.196416e+01 # HT + 1981 133 1 -2.2897 -9.177104e+00 6.175441e+00 -5.703014e+00 # CAT + 1982 133 2 -2.3557 -7.847634e+00 5.794025e+00 -5.919881e+00 # CAO + 1983 133 3 -2.3537 -7.546785e+00 4.472275e+00 -6.269835e+00 # CAM + 1984 133 4 -2.3627 -8.575406e+00 3.531942e+00 -6.402922e+00 # CAP + 1985 133 3 -2.3537 -9.904876e+00 3.913359e+00 -6.186056e+00 # CAM + 1986 133 2 -2.3557 -1.020572e+01 5.235108e+00 -5.836102e+00 # CAO + 1987 133 5 -2.4057 -9.501591e+00 7.601042e+00 -5.325564e+00 # CTT + 1988 133 6 0.1480 -7.054127e+00 6.519424e+00 -5.817214e+00 # HAT + 1989 133 6 0.1480 -6.521194e+00 4.178039e+00 -6.437132e+00 # HAT + 1990 133 6 0.1480 -8.343323e+00 2.512306e+00 -6.672887e+00 # HAT + 1991 133 6 0.1480 -1.069838e+01 3.187958e+00 -6.288723e+00 # HAT + 1992 133 6 0.1480 -1.123132e+01 5.529343e+00 -5.668805e+00 # HAT + 1993 133 7 0.0920 -8.760819e+00 8.270721e+00 -5.762471e+00 # HT + 1994 133 7 0.0920 -1.049145e+01 7.860525e+00 -5.700985e+00 # HT + 1995 133 7 0.0920 -9.487066e+00 7.702421e+00 -4.240386e+00 # HT + 1996 134 1 -2.2897 5.627380e+00 -2.965699e+00 -5.690414e+00 # CAT + 1997 134 2 -2.3557 4.416214e+00 -3.593700e+00 -5.376263e+00 # CAO + 1998 134 3 -2.3537 4.049351e+00 -3.777065e+00 -4.037686e+00 # CAM + 1999 134 4 -2.3627 4.893654e+00 -3.332429e+00 -3.013260e+00 # CAP + 2000 134 3 -2.3537 6.104820e+00 -2.704427e+00 -3.327410e+00 # CAM + 2001 134 2 -2.3557 6.471683e+00 -2.521062e+00 -4.665986e+00 # CAO + 2002 134 5 -2.4057 6.023068e+00 -2.767927e+00 -7.134164e+00 # CTT + 2003 134 6 0.1480 3.764894e+00 -3.936706e+00 -6.166535e+00 # HAT + 2004 134 6 0.1480 3.115023e+00 -4.261524e+00 -3.795341e+00 # HAT + 2005 134 6 0.1480 4.610645e+00 -3.473881e+00 -1.980642e+00 # HAT + 2006 134 6 0.1480 6.756140e+00 -2.361421e+00 -2.537137e+00 # HAT + 2007 134 6 0.1480 7.406012e+00 -2.036604e+00 -4.908331e+00 # HAT + 2008 134 7 0.0920 5.127153e+00 -2.658079e+00 -7.745206e+00 # HT + 2009 134 7 0.0920 6.635690e+00 -1.870855e+00 -7.223924e+00 # HT + 2010 134 7 0.0920 6.592395e+00 -3.631880e+00 -7.477023e+00 # HT + 2011 135 1 -2.2897 -1.717690e-01 -1.103069e+01 -1.166510e-01 # CAT + 2012 135 2 -2.3557 9.866870e-01 -1.039695e+01 -5.817830e-01 # CAO + 2013 135 3 -2.3537 1.326610e+00 -1.046738e+01 -1.938062e+00 # CAM + 2014 135 4 -2.3627 5.080780e-01 -1.117155e+01 -2.829208e+00 # CAP + 2015 135 3 -2.3537 -6.503780e-01 -1.180530e+01 -2.364076e+00 # CAM + 2016 135 2 -2.3557 -9.903010e-01 -1.173487e+01 -1.007798e+00 # CAO + 2017 135 5 -2.4057 -5.384000e-01 -1.095473e+01 1.346192e+00 # CTT + 2018 135 6 0.1480 1.618127e+00 -9.853730e+00 1.056730e-01 # HAT + 2019 135 6 0.1480 2.220276e+00 -9.978491e+00 -2.296878e+00 # HAT + 2020 135 6 0.1480 7.703040e-01 -1.122589e+01 -3.875481e+00 # HAT + 2021 135 6 0.1480 -1.281817e+00 -1.234852e+01 -3.051533e+00 # HAT + 2022 135 6 0.1480 -1.883967e+00 -1.222376e+01 -6.489820e-01 # HAT + 2023 135 7 0.0920 -1.713360e-01 -1.001778e+01 1.765114e+00 # HT + 2024 135 7 0.0920 -1.622275e+00 -1.099970e+01 1.452456e+00 # HT + 2025 135 7 0.0920 -8.661900e-02 -1.179180e+01 1.878468e+00 # HT + 2026 136 1 -2.2897 8.563566e+00 -1.178331e+01 -4.534035e+00 # CAT + 2027 136 2 -2.3557 8.924931e+00 -1.312727e+01 -4.381769e+00 # CAO + 2028 136 3 -2.3537 9.182152e+00 -1.391513e+01 -5.510093e+00 # CAM + 2029 136 4 -2.3627 9.078009e+00 -1.335903e+01 -6.790681e+00 # CAP + 2030 136 3 -2.3537 8.716645e+00 -1.201507e+01 -6.942946e+00 # CAM + 2031 136 2 -2.3557 8.459423e+00 -1.122721e+01 -5.814624e+00 # CAO + 2032 136 5 -2.4057 8.286135e+00 -1.093354e+01 -3.317059e+00 # CTT + 2033 136 6 0.1480 9.005269e+00 -1.355626e+01 -3.393887e+00 # HAT + 2034 136 6 0.1480 9.460919e+00 -1.495190e+01 -5.392630e+00 # HAT + 2035 136 6 0.1480 9.276437e+00 -1.396681e+01 -7.661102e+00 # HAT + 2036 136 6 0.1480 8.636306e+00 -1.158608e+01 -7.930830e+00 # HAT + 2037 136 6 0.1480 8.180656e+00 -1.019044e+01 -5.932087e+00 # HAT + 2038 136 7 0.0920 8.885376e+00 -1.129076e+01 -2.479560e+00 # HT + 2039 136 7 0.0920 8.543734e+00 -9.896283e+00 -3.531152e+00 # HT + 2040 136 7 0.0920 7.228745e+00 -1.099930e+01 -3.060735e+00 # HT + 2041 137 1 -2.2897 7.375371e+00 5.980524e+00 1.362288e+01 # CAT + 2042 137 2 -2.3557 6.537586e+00 5.649783e+00 1.255109e+01 # CAO + 2043 137 3 -2.3537 6.171405e+00 6.629625e+00 1.162059e+01 # CAM + 2044 137 4 -2.3627 6.643009e+00 7.940207e+00 1.176188e+01 # CAP + 2045 137 3 -2.3537 7.480794e+00 8.270948e+00 1.283367e+01 # CAM + 2046 137 2 -2.3557 7.846975e+00 7.291107e+00 1.376417e+01 # CAO + 2047 137 5 -2.4057 7.770324e+00 4.923695e+00 1.462648e+01 # CTT + 2048 137 6 0.1480 6.173777e+00 4.638762e+00 1.244209e+01 # HAT + 2049 137 6 0.1480 5.525114e+00 6.374482e+00 1.079379e+01 # HAT + 2050 137 6 0.1480 6.360527e+00 8.696085e+00 1.104407e+01 # HAT + 2051 137 6 0.1480 7.844603e+00 9.281969e+00 1.294267e+01 # HAT + 2052 137 6 0.1480 8.493267e+00 7.546250e+00 1.459097e+01 # HAT + 2053 137 7 0.0920 7.795996e+00 3.949590e+00 1.413805e+01 # HT + 2054 137 7 0.0920 8.756974e+00 5.154179e+00 1.502835e+01 # HT + 2055 137 7 0.0920 7.043505e+00 4.903354e+00 1.543853e+01 # HT + 2056 138 1 -2.2897 5.710643e+00 7.296478e+00 3.951699e+00 # CAT + 2057 138 2 -2.3557 5.056977e+00 6.447365e+00 3.050741e+00 # CAO + 2058 138 3 -2.3537 4.957378e+00 5.078232e+00 3.325617e+00 # CAM + 2059 138 4 -2.3627 5.511446e+00 4.558214e+00 4.501453e+00 # CAP + 2060 138 3 -2.3537 6.165112e+00 5.407327e+00 5.402412e+00 # CAM + 2061 138 2 -2.3557 6.264711e+00 6.776459e+00 5.127535e+00 # CAO + 2062 138 5 -2.4057 5.818067e+00 8.773185e+00 3.655226e+00 # CTT + 2063 138 6 0.1480 4.629553e+00 6.848522e+00 2.143668e+00 # HAT + 2064 138 6 0.1480 4.453122e+00 4.423202e+00 2.630592e+00 # HAT + 2065 138 6 0.1480 5.434613e+00 3.502025e+00 4.713501e+00 # HAT + 2066 138 6 0.1480 6.592536e+00 5.006169e+00 6.309485e+00 # HAT + 2067 138 6 0.1480 6.768967e+00 7.431489e+00 5.822561e+00 # HAT + 2068 138 7 0.0920 4.956781e+00 9.089789e+00 3.066965e+00 # HT + 2069 138 7 0.0920 5.843154e+00 9.331316e+00 4.591153e+00 # HT + 2070 138 7 0.0920 6.731918e+00 8.965931e+00 3.093244e+00 # HT + 2071 139 1 -2.2897 -1.373410e+01 5.414493e+00 -1.333437e+01 # CAT + 2072 139 2 -2.3557 -1.431209e+01 6.385914e+00 -1.416037e+01 # CAO + 2073 139 3 -2.3537 -1.352599e+01 7.422290e+00 -1.467803e+01 # CAM + 2074 139 4 -2.3627 -1.216191e+01 7.487246e+00 -1.436971e+01 # CAP + 2075 139 3 -2.3537 -1.158393e+01 6.515825e+00 -1.354371e+01 # CAM + 2076 139 2 -2.3557 -1.237002e+01 5.479449e+00 -1.302604e+01 # CAO + 2077 139 5 -2.4057 -1.458196e+01 4.296688e+00 -1.277602e+01 # CTT + 2078 139 6 0.1480 -1.536438e+01 6.335806e+00 -1.439822e+01 # HAT + 2079 139 6 0.1480 -1.397187e+01 8.171672e+00 -1.531523e+01 # HAT + 2080 139 6 0.1480 -1.155550e+01 8.286736e+00 -1.476905e+01 # HAT + 2081 139 6 0.1480 -1.053163e+01 6.565934e+00 -1.330585e+01 # HAT + 2082 139 6 0.1480 -1.192414e+01 4.730067e+00 -1.238884e+01 # HAT + 2083 139 7 0.0920 -1.539202e+01 4.072895e+00 -1.347015e+01 # HT + 2084 139 7 0.0920 -1.396671e+01 3.407628e+00 -1.263765e+01 # HT + 2085 139 7 0.0920 -1.500004e+01 4.601499e+00 -1.181665e+01 # HT + 2086 140 1 -2.2897 4.140618e+00 8.961519e+00 7.208404e+00 # CAT + 2087 140 2 -2.3557 4.256650e+00 7.654541e+00 6.720198e+00 # CAO + 2088 140 3 -2.3537 3.632181e+00 7.297977e+00 5.518990e+00 # CAM + 2089 140 4 -2.3627 2.891680e+00 8.248390e+00 4.805989e+00 # CAP + 2090 140 3 -2.3537 2.775648e+00 9.555369e+00 5.294194e+00 # CAM + 2091 140 2 -2.3557 3.400117e+00 9.911933e+00 6.495401e+00 # CAO + 2092 140 5 -2.4057 4.814152e+00 9.346100e+00 8.503992e+00 # CTT + 2093 140 6 0.1480 4.827893e+00 6.921365e+00 7.270228e+00 # HAT + 2094 140 6 0.1480 3.721691e+00 6.289736e+00 5.142375e+00 # HAT + 2095 140 6 0.1480 2.409946e+00 7.973326e+00 3.879342e+00 # HAT + 2096 140 6 0.1480 2.204404e+00 1.028854e+01 4.744163e+00 # HAT + 2097 140 6 0.1480 3.310607e+00 1.092017e+01 6.872017e+00 # HAT + 2098 140 7 0.0920 5.713235e+00 8.744859e+00 8.639124e+00 # HT + 2099 140 7 0.0920 5.084614e+00 1.040159e+01 8.474143e+00 # HT + 2100 140 7 0.0920 4.131493e+00 9.169856e+00 9.335265e+00 # HT + 2101 141 1 -2.2897 1.364885e+01 -2.553844e+00 1.367616e+01 # CAT + 2102 141 2 -2.3557 1.282678e+01 -3.658050e+00 1.393099e+01 # CAO + 2103 141 3 -2.3537 1.215234e+01 -4.286606e+00 1.287740e+01 # CAM + 2104 141 4 -2.3627 1.229997e+01 -3.810958e+00 1.156898e+01 # CAP + 2105 141 3 -2.3537 1.312204e+01 -2.706753e+00 1.131415e+01 # CAM + 2106 141 2 -2.3557 1.379647e+01 -2.078196e+00 1.236774e+01 # CAO + 2107 141 5 -2.4057 1.437627e+01 -1.875901e+00 1.481254e+01 # CTT + 2108 141 6 0.1480 1.271290e+01 -4.024978e+00 1.494035e+01 # HAT + 2109 141 6 0.1480 1.151818e+01 -5.138422e+00 1.307399e+01 # HAT + 2110 141 6 0.1480 1.177969e+01 -4.295845e+00 1.075622e+01 # HAT + 2111 141 6 0.1480 1.323592e+01 -2.339824e+00 1.030480e+01 # HAT + 2112 141 6 0.1480 1.443064e+01 -1.226380e+00 1.217116e+01 # HAT + 2113 141 7 0.0920 1.459631e+01 -2.606440e+00 1.559099e+01 # HT + 2114 141 7 0.0920 1.530798e+01 -1.446964e+00 1.444370e+01 # HT + 2115 141 7 0.0920 1.375038e+01 -1.084227e+00 1.522437e+01 # HT + 2116 142 1 -2.2897 -3.421791e+00 -1.030121e+01 -2.050744e+00 # CAT + 2117 142 2 -2.3557 -2.296499e+00 -9.672944e+00 -1.503934e+00 # CAO + 2118 142 3 -2.3537 -1.272438e+00 -9.217228e+00 -2.342756e+00 # CAM + 2119 142 4 -2.3627 -1.373670e+00 -9.389776e+00 -3.728389e+00 # CAP + 2120 142 3 -2.3537 -2.498962e+00 -1.001804e+01 -4.275200e+00 # CAM + 2121 142 2 -2.3557 -3.523022e+00 -1.047376e+01 -3.436378e+00 # CAO + 2122 142 5 -2.4057 -4.526313e+00 -1.079273e+01 -1.146015e+00 # CTT + 2123 142 6 0.1480 -2.218406e+00 -9.539835e+00 -4.350170e-01 # HAT + 2124 142 6 0.1480 -4.043560e-01 -8.732567e+00 -1.920931e+00 # HAT + 2125 142 6 0.1480 -5.836800e-01 -9.038224e+00 -4.375481e+00 # HAT + 2126 142 6 0.1480 -2.577054e+00 -1.015115e+01 -5.344117e+00 # HAT + 2127 142 6 0.1480 -4.391104e+00 -1.095842e+01 -3.858203e+00 # HAT + 2128 142 7 0.0920 -4.577301e+00 -1.016213e+01 -2.584050e-01 # HT + 2129 142 7 0.0920 -5.477463e+00 -1.074986e+01 -1.676652e+00 # HT + 2130 142 7 0.0920 -4.322613e+00 -1.182150e+01 -8.489760e-01 # HT + 2131 143 1 -2.2897 -3.254075e+00 -1.542278e+00 3.485028e+00 # CAT + 2132 143 2 -2.3557 -3.735366e+00 -4.399480e-01 4.201426e+00 # CAO + 2133 143 3 -2.3537 -5.000521e+00 -4.914670e-01 4.798695e+00 # CAM + 2134 143 4 -2.3627 -5.784384e+00 -1.645315e+00 4.679565e+00 # CAP + 2135 143 3 -2.3537 -5.303093e+00 -2.747645e+00 3.963166e+00 # CAM + 2136 143 2 -2.3557 -4.037939e+00 -2.696127e+00 3.365898e+00 # CAO + 2137 143 5 -2.4057 -1.889516e+00 -1.486712e+00 2.840831e+00 # CTT + 2138 143 6 0.1480 -3.130672e+00 4.501630e-01 4.293327e+00 # HAT + 2139 143 6 0.1480 -5.371803e+00 3.589020e-01 5.351345e+00 # HAT + 2140 143 6 0.1480 -6.760361e+00 -1.685058e+00 5.140315e+00 # HAT + 2141 143 6 0.1480 -5.907788e+00 -3.637757e+00 3.871266e+00 # HAT + 2142 143 6 0.1480 -3.666657e+00 -3.546496e+00 2.813247e+00 # HAT + 2143 143 7 0.0920 -1.239241e+00 -8.327180e-01 3.421810e+00 # HT + 2144 143 7 0.0920 -1.461303e+00 -2.488558e+00 2.808604e+00 # HT + 2145 143 7 0.0920 -1.981588e+00 -1.098693e+00 1.826404e+00 # HT + 2146 144 1 -2.2897 -1.321271e+01 1.486223e+00 1.342973e+01 # CAT + 2147 144 2 -2.3557 -1.191691e+01 1.077110e+00 1.376667e+01 # CAO + 2148 144 3 -2.3537 -1.172798e+01 -9.540000e-04 1.463964e+01 # CAM + 2149 144 4 -2.3627 -1.283486e+01 -6.699040e-01 1.517568e+01 # CAP + 2150 144 3 -2.3537 -1.413066e+01 -2.607900e-01 1.483875e+01 # CAM + 2151 144 2 -2.3557 -1.431959e+01 8.172730e-01 1.396577e+01 # CAO + 2152 144 5 -2.4057 -1.341649e+01 2.648992e+00 1.248817e+01 # CTT + 2153 144 6 0.1480 -1.106304e+01 1.593156e+00 1.335315e+01 # HAT + 2154 144 6 0.1480 -1.072837e+01 -3.165560e-01 1.489956e+01 # HAT + 2155 144 6 0.1480 -1.268911e+01 -1.501553e+00 1.584912e+01 # HAT + 2156 144 6 0.1480 -1.498453e+01 -7.768380e-01 1.525226e+01 # HAT + 2157 144 6 0.1480 -1.531921e+01 1.132875e+00 1.370585e+01 # HAT + 2158 144 7 0.0920 -1.258207e+01 2.701417e+00 1.178881e+01 # HT + 2159 144 7 0.0920 -1.434542e+01 2.510720e+00 1.193494e+01 # HT + 2160 144 7 0.0920 -1.346928e+01 3.575381e+00 1.306011e+01 # HT + 2161 145 1 -2.2897 2.676064e+00 -1.393412e+01 -9.307367e+00 # CAT + 2162 145 2 -2.3557 1.589914e+00 -1.464981e+01 -9.825116e+00 # CAO + 2163 145 3 -2.3537 4.557370e-01 -1.396767e+01 -1.028154e+01 # CAM + 2164 145 4 -2.3627 4.077100e-01 -1.256984e+01 -1.022022e+01 # CAP + 2165 145 3 -2.3537 1.493860e+00 -1.185415e+01 -9.702476e+00 # CAM + 2166 145 2 -2.3557 2.628037e+00 -1.253629e+01 -9.246047e+00 # CAO + 2167 145 5 -2.4057 3.899355e+00 -1.466986e+01 -8.815076e+00 # CTT + 2168 145 6 0.1480 1.626963e+00 -1.572814e+01 -9.872420e+00 # HAT + 2169 145 6 0.1480 -3.821500e-01 -1.451978e+01 -1.068095e+01 # HAT + 2170 145 6 0.1480 -4.672270e-01 -1.204362e+01 -1.057233e+01 # HAT + 2171 145 6 0.1480 1.456811e+00 -1.077582e+01 -9.655172e+00 # HAT + 2172 145 6 0.1480 3.465924e+00 -1.198418e+01 -8.846641e+00 # HAT + 2173 145 7 0.0920 4.018934e+00 -1.559503e+01 -9.378867e+00 # HT + 2174 145 7 0.0920 4.780827e+00 -1.404388e+01 -8.953881e+00 # HT + 2175 145 7 0.0920 3.782598e+00 -1.490251e+01 -7.756615e+00 # HT + 2176 146 1 -2.2897 -1.508577e+01 -1.366191e+01 4.111691e+00 # CAT + 2177 146 2 -2.3557 -1.520451e+01 -1.480745e+01 4.907706e+00 # CAO + 2178 146 3 -2.3537 -1.528508e+01 -1.468698e+01 6.300185e+00 # CAM + 2179 146 4 -2.3627 -1.524691e+01 -1.342097e+01 6.896648e+00 # CAP + 2180 146 3 -2.3537 -1.512818e+01 -1.227543e+01 6.100633e+00 # CAM + 2181 146 2 -2.3557 -1.504761e+01 -1.239590e+01 4.708155e+00 # CAO + 2182 146 5 -2.4057 -1.499887e+01 -1.379184e+01 2.609804e+00 # CTT + 2183 146 6 0.1480 -1.523395e+01 -1.578408e+01 4.447577e+00 # HAT + 2184 146 6 0.1480 -1.537668e+01 -1.557068e+01 6.914253e+00 # HAT + 2185 146 6 0.1480 -1.530907e+01 -1.332804e+01 7.970846e+00 # HAT + 2186 146 6 0.1480 -1.509874e+01 -1.129880e+01 6.560762e+00 # HAT + 2187 146 6 0.1480 -1.495601e+01 -1.151220e+01 4.094086e+00 # HAT + 2188 146 7 0.0920 -1.554732e+01 -1.467745e+01 2.288872e+00 # HT + 2189 146 7 0.0920 -1.543217e+01 -1.290758e+01 2.142418e+00 # HT + 2190 146 7 0.0920 -1.395431e+01 -1.388441e+01 2.312436e+00 # HT + 2191 147 1 -2.2897 -1.493266e+01 -7.051872e+00 -1.339764e+01 # CAT + 2192 147 2 -2.3557 -1.515348e+01 -7.930497e+00 -1.233028e+01 # CAO + 2193 147 3 -2.3537 -1.522821e+01 -7.437767e+00 -1.102198e+01 # CAM + 2194 147 4 -2.3627 -1.508213e+01 -6.066413e+00 -1.078105e+01 # CAP + 2195 147 3 -2.3537 -1.486132e+01 -5.187788e+00 -1.184841e+01 # CAM + 2196 147 2 -2.3557 -1.478659e+01 -5.680517e+00 -1.315670e+01 # CAO + 2197 147 5 -2.4057 -1.485206e+01 -7.583315e+00 -1.480872e+01 # CTT + 2198 147 6 0.1480 -1.526616e+01 -8.988399e+00 -1.251614e+01 # HAT + 2199 147 6 0.1480 -1.539855e+01 -8.115564e+00 -1.019859e+01 # HAT + 2200 147 6 0.1480 -1.513979e+01 -5.686307e+00 -9.771793e+00 # HAT + 2201 147 6 0.1480 -1.474864e+01 -4.129885e+00 -1.166255e+01 # HAT + 2202 147 6 0.1480 -1.461625e+01 -5.002720e+00 -1.398010e+01 # HAT + 2203 147 7 0.0920 -1.547435e+01 -8.473726e+00 -1.489828e+01 # HT + 2204 147 7 0.0920 -1.520509e+01 -6.822435e+00 -1.550481e+01 # HT + 2205 147 7 0.0920 -1.381846e+01 -7.837954e+00 -1.504313e+01 # HT + 2206 148 1 -2.2897 -9.003944e+00 -1.518163e+01 -1.201469e+01 # CAT + 2207 148 2 -2.3557 -7.698917e+00 -1.524014e+01 -1.251816e+01 # CAO + 2208 148 3 -2.3537 -6.611785e+00 -1.530902e+01 -1.163872e+01 # CAM + 2209 148 4 -2.3627 -6.829682e+00 -1.531939e+01 -1.025582e+01 # CAP + 2210 148 3 -2.3537 -8.134709e+00 -1.526088e+01 -9.752355e+00 # CAM + 2211 148 2 -2.3557 -9.221840e+00 -1.519200e+01 -1.063179e+01 # CAO + 2212 148 5 -2.4057 -1.017649e+01 -1.510734e+01 -1.296322e+01 # CTT + 2213 148 6 0.1480 -7.530826e+00 -1.523214e+01 -1.358497e+01 # HAT + 2214 148 6 0.1480 -5.605050e+00 -1.535415e+01 -1.202711e+01 # HAT + 2215 148 6 0.1480 -5.991037e+00 -1.537252e+01 -9.577404e+00 # HAT + 2216 148 6 0.1480 -8.302800e+00 -1.526888e+01 -8.685546e+00 # HAT + 2217 148 6 0.1480 -1.022858e+01 -1.514687e+01 -1.024340e+01 # HAT + 2218 148 7 0.0920 -9.926252e+00 -1.562012e+01 -1.389195e+01 # HT + 2219 148 7 0.0920 -1.104395e+01 -1.558479e+01 -1.250751e+01 # HT + 2220 148 7 0.0920 -1.040689e+01 -1.406341e+01 -1.317587e+01 # HT + 2221 149 1 -2.2897 -2.124431e+00 -8.312026e+00 1.500379e+01 # CAT + 2222 149 2 -2.3557 -3.503661e+00 -8.176363e+00 1.520208e+01 # CAO + 2223 149 3 -2.3537 -4.271812e+00 -9.289741e+00 1.556310e+01 # CAM + 2224 149 4 -2.3627 -3.660733e+00 -1.053878e+01 1.572582e+01 # CAP + 2225 149 3 -2.3537 -2.281503e+00 -1.067445e+01 1.552753e+01 # CAM + 2226 149 2 -2.3557 -1.513353e+00 -9.561068e+00 1.516651e+01 # CAO + 2227 149 5 -2.4057 -1.295926e+00 -7.111169e+00 1.461441e+01 # CTT + 2228 149 6 0.1480 -3.975064e+00 -7.212817e+00 1.507656e+01 # HAT + 2229 149 6 0.1480 -5.335789e+00 -9.185087e+00 1.571607e+01 # HAT + 2230 149 6 0.1480 -4.253307e+00 -1.139767e+01 1.600432e+01 # HAT + 2231 149 6 0.1480 -1.810100e+00 -1.163799e+01 1.565305e+01 # HAT + 2232 149 6 0.1480 -4.493750e-01 -9.665723e+00 1.501354e+01 # HAT + 2233 149 7 0.0920 -1.745002e+00 -6.209082e+00 1.502994e+01 # HT + 2234 149 7 0.0920 -2.842870e-01 -7.225335e+00 1.500383e+01 # HT + 2235 149 7 0.0920 -1.259577e+00 -7.031012e+00 1.352797e+01 # HT + 2236 150 1 -2.2897 6.160140e-01 6.504548e+00 -1.121167e+01 # CAT + 2237 150 2 -2.3557 2.635550e-01 7.662884e+00 -1.191455e+01 # CAO + 2238 150 3 -2.3537 4.372600e-02 7.603825e+00 -1.329592e+01 # CAM + 2239 150 4 -2.3627 1.763560e-01 6.386431e+00 -1.397442e+01 # CAP + 2240 150 3 -2.3537 5.288140e-01 5.228095e+00 -1.327154e+01 # CAM + 2241 150 2 -2.3557 7.486430e-01 5.287153e+00 -1.189017e+01 # CAO + 2242 150 5 -2.4057 8.531150e-01 6.568247e+00 -9.721768e+00 # CTT + 2243 150 6 0.1480 1.612420e-01 8.602017e+00 -1.139114e+01 # HAT + 2244 150 6 0.1480 -2.281700e-01 8.497399e+00 -1.383814e+01 # HAT + 2245 150 6 0.1480 6.773000e-03 6.340871e+00 -1.504005e+01 # HAT + 2246 150 6 0.1480 6.311280e-01 4.288962e+00 -1.379496e+01 # HAT + 2247 150 6 0.1480 1.020539e+00 4.393580e+00 -1.134796e+01 # HAT + 2248 150 7 0.0920 2.353910e-01 7.354794e+00 -9.288336e+00 # HT + 2249 150 7 0.0920 5.914040e-01 5.611212e+00 -9.270446e+00 # HT + 2250 150 7 0.0920 1.903945e+00 6.784783e+00 -9.529496e+00 # HT + 2251 151 1 -2.2897 1.207702e+01 -1.370896e+01 -4.524010e-01 # CAT + 2252 151 2 -2.3557 1.133644e+01 -1.269888e+01 1.731330e-01 # CAO + 2253 151 3 -2.3537 9.940848e+00 -1.268379e+01 6.318200e-02 # CAM + 2254 151 4 -2.3627 9.285827e+00 -1.367878e+01 -6.723020e-01 # CAP + 2255 151 3 -2.3537 1.002640e+01 -1.468886e+01 -1.297836e+00 # CAM + 2256 151 2 -2.3557 1.142199e+01 -1.470395e+01 -1.187885e+00 # CAO + 2257 151 5 -2.4057 1.358226e+01 -1.372523e+01 -3.338110e-01 # CTT + 2258 151 6 0.1480 1.184174e+01 -1.193131e+01 7.405070e-01 # HAT + 2259 151 6 0.1480 9.369549e+00 -1.190459e+01 5.457360e-01 # HAT + 2260 151 6 0.1480 8.209226e+00 -1.366714e+01 -7.571220e-01 # HAT + 2261 151 6 0.1480 9.521098e+00 -1.545643e+01 -1.865210e+00 # HAT + 2262 151 6 0.1480 1.199329e+01 -1.548315e+01 -1.670440e+00 # HAT + 2263 151 7 0.0920 1.387711e+01 -1.328224e+01 6.174680e-01 # HT + 2264 151 7 0.0920 1.393989e+01 -1.475379e+01 -3.814020e-01 # HT + 2265 151 7 0.0920 1.401791e+01 -1.315142e+01 -1.151770e+00 # HT + 2266 152 1 -2.2897 -1.493725e+01 2.303280e+00 -8.327449e+00 # CAT + 2267 152 2 -2.3557 -1.502782e+01 1.857168e+00 -9.651376e+00 # CAO + 2268 152 3 -2.3537 -1.539929e+01 5.344440e-01 -9.920480e+00 # CAM + 2269 152 4 -2.3627 -1.568018e+01 -3.421670e-01 -8.865659e+00 # CAP + 2270 152 3 -2.3537 -1.558962e+01 1.039450e-01 -7.541732e+00 # CAM + 2271 152 2 -2.3557 -1.521815e+01 1.426668e+00 -7.272627e+00 # CAO + 2272 152 5 -2.4057 -1.453660e+01 3.729931e+00 -8.037200e+00 # CTT + 2273 152 6 0.1480 -1.481113e+01 2.533411e+00 -1.046509e+01 # HAT + 2274 152 6 0.1480 -1.546915e+01 1.903010e-01 -1.094180e+01 # HAT + 2275 152 6 0.1480 -1.596674e+01 -1.362554e+00 -9.073254e+00 # HAT + 2276 152 6 0.1480 -1.580631e+01 -5.722990e-01 -6.728012e+00 # HAT + 2277 152 6 0.1480 -1.514828e+01 1.770811e+00 -6.251312e+00 # HAT + 2278 152 7 0.0920 -1.486390e+01 4.373142e+00 -8.854058e+00 # HT + 2279 152 7 0.0920 -1.500359e+01 4.057192e+00 -7.108262e+00 # HT + 2280 152 7 0.0920 -1.345270e+01 3.790758e+00 -7.939466e+00 # HT + 2281 153 1 -2.2897 -8.212781e+00 3.518071e+00 -1.036323e+01 # CAT + 2282 153 2 -2.3557 -8.529789e+00 4.396365e+00 -1.140635e+01 # CAO + 2283 153 3 -2.3537 -7.856827e+00 5.618628e+00 -1.152123e+01 # CAM + 2284 153 4 -2.3627 -6.866857e+00 5.962596e+00 -1.059298e+01 # CAP + 2285 153 3 -2.3537 -6.549848e+00 5.084301e+00 -9.549860e+00 # CAM + 2286 153 2 -2.3557 -7.222810e+00 3.862039e+00 -9.434985e+00 # CAO + 2287 153 5 -2.4057 -8.938618e+00 2.199774e+00 -1.023933e+01 # CTT + 2288 153 6 0.1480 -9.293481e+00 4.131018e+00 -1.212243e+01 # HAT + 2289 153 6 0.1480 -8.101377e+00 6.296169e+00 -1.232592e+01 # HAT + 2290 153 6 0.1480 -6.347714e+00 6.905484e+00 -1.068160e+01 # HAT + 2291 153 6 0.1480 -5.786156e+00 5.349649e+00 -8.833783e+00 # HAT + 2292 153 6 0.1480 -6.978260e+00 3.184498e+00 -8.630290e+00 # HAT + 2293 153 7 0.0920 -9.237774e+00 1.854707e+00 -1.122905e+01 # HT + 2294 153 7 0.0920 -8.278564e+00 1.462557e+00 -9.782231e+00 # HT + 2295 153 7 0.0920 -9.824209e+00 2.329085e+00 -9.617153e+00 # HT + 2296 154 1 -2.2897 7.033272e+00 1.353738e+01 -1.470868e+01 # CAT + 2297 154 2 -2.3557 6.369972e+00 1.237288e+01 -1.511362e+01 # CAO + 2298 154 3 -2.3537 4.977919e+00 1.237602e+01 -1.526254e+01 # CAM + 2299 154 4 -2.3627 4.249166e+00 1.354365e+01 -1.500653e+01 # CAP + 2300 154 3 -2.3537 4.912466e+00 1.470815e+01 -1.460159e+01 # CAM + 2301 154 2 -2.3557 6.304518e+00 1.470501e+01 -1.445266e+01 # CAO + 2302 154 5 -2.4057 8.534700e+00 1.353399e+01 -1.454805e+01 # CTT + 2303 154 6 0.1480 6.932153e+00 1.147213e+01 -1.531112e+01 # HAT + 2304 154 6 0.1480 4.466231e+00 1.147769e+01 -1.557493e+01 # HAT + 2305 154 6 0.1480 3.175296e+00 1.354607e+01 -1.512141e+01 # HAT + 2306 154 6 0.1480 4.350284e+00 1.560890e+01 -1.440409e+01 # HAT + 2307 154 6 0.1480 6.816207e+00 1.560334e+01 -1.414028e+01 # HAT + 2308 154 7 0.0920 8.973376e+00 1.281809e+01 -1.524315e+01 # HT + 2309 154 7 0.0920 8.925339e+00 1.452968e+01 -1.475806e+01 # HT + 2310 154 7 0.0920 8.790738e+00 1.325175e+01 -1.352683e+01 # HT + 2311 155 1 -2.2897 1.494315e+01 7.729348e+00 8.620680e+00 # CAT + 2312 155 2 -2.3557 1.481343e+01 7.137743e+00 7.358469e+00 # CAO + 2313 155 3 -2.3537 1.500194e+01 7.905314e+00 6.202916e+00 # CAM + 2314 155 4 -2.3627 1.532016e+01 9.264490e+00 6.309575e+00 # CAP + 2315 155 3 -2.3537 1.544987e+01 9.856095e+00 7.571787e+00 # CAM + 2316 155 2 -2.3557 1.526137e+01 9.088525e+00 8.727339e+00 # CAO + 2317 155 5 -2.4057 1.473983e+01 6.901468e+00 9.867025e+00 # CTT + 2318 155 6 0.1480 1.456795e+01 6.089236e+00 7.276189e+00 # HAT + 2319 155 6 0.1480 1.490187e+01 7.448933e+00 5.229210e+00 # HAT + 2320 155 6 0.1480 1.546557e+01 9.856617e+00 5.418149e+00 # HAT + 2321 155 6 0.1480 1.569536e+01 1.090460e+01 7.654066e+00 # HAT + 2322 155 6 0.1480 1.536144e+01 9.544906e+00 9.701044e+00 # HAT + 2323 155 7 0.0920 1.502661e+01 5.868749e+00 9.668646e+00 # HT + 2324 155 7 0.0920 1.535535e+01 7.300454e+00 1.067328e+01 # HT + 2325 155 7 0.0920 1.369057e+01 6.936742e+00 1.016011e+01 # HT + 2326 156 1 -2.2897 -6.158456e+00 -2.559693e+00 1.238154e+01 # CAT + 2327 156 2 -2.3557 -5.156109e+00 -1.583005e+00 1.234440e+01 # CAO + 2328 156 3 -2.3537 -5.462517e+00 -2.532580e-01 1.265728e+01 # CAM + 2329 156 4 -2.3627 -6.771273e+00 9.979900e-02 1.300729e+01 # CAP + 2330 156 3 -2.3537 -7.773621e+00 -8.768900e-01 1.304443e+01 # CAM + 2331 156 2 -2.3557 -7.467212e+00 -2.206635e+00 1.273155e+01 # CAO + 2332 156 5 -2.4057 -5.827973e+00 -3.993919e+00 1.204409e+01 # CTT + 2333 156 6 0.1480 -4.146497e+00 -1.855363e+00 1.207439e+01 # HAT + 2334 156 6 0.1480 -4.689278e+00 5.001870e-01 1.262863e+01 # HAT + 2335 156 6 0.1480 -7.007646e+00 1.125603e+00 1.324865e+01 # HAT + 2336 156 6 0.1480 -8.783233e+00 -6.045310e-01 1.331443e+01 # HAT + 2337 156 6 0.1480 -8.240452e+00 -2.960081e+00 1.276020e+01 # HAT + 2338 156 7 0.0920 -4.792829e+00 -4.202137e+00 1.231469e+01 # HT + 2339 156 7 0.0920 -6.488980e+00 -4.659828e+00 1.259882e+01 # HT + 2340 156 7 0.0920 -5.963207e+00 -4.156564e+00 1.097481e+01 # HT + 2341 157 1 -2.2897 5.347793e+00 -8.630432e+00 1.406359e+01 # CAT + 2342 157 2 -2.3557 6.333015e+00 -8.775293e+00 1.307954e+01 # CAO + 2343 157 3 -2.3537 7.062091e+00 -7.660184e+00 1.264945e+01 # CAM + 2344 157 4 -2.3627 6.805945e+00 -6.400215e+00 1.320340e+01 # CAP + 2345 157 3 -2.3537 5.820723e+00 -6.255354e+00 1.418745e+01 # CAM + 2346 157 2 -2.3557 5.091647e+00 -7.370462e+00 1.461754e+01 # CAO + 2347 157 5 -2.4057 4.561432e+00 -9.833155e+00 1.452748e+01 # CTT + 2348 157 6 0.1480 6.530613e+00 -9.747269e+00 1.265220e+01 # HAT + 2349 157 6 0.1480 7.822119e+00 -7.771934e+00 1.189032e+01 # HAT + 2350 157 6 0.1480 7.368375e+00 -5.539988e+00 1.287161e+01 # HAT + 2351 157 6 0.1480 5.623125e+00 -5.283377e+00 1.461479e+01 # HAT + 2352 157 6 0.1480 4.331619e+00 -7.258712e+00 1.537667e+01 # HAT + 2353 157 7 0.0920 5.178453e+00 -1.072737e+01 1.443935e+01 # HT + 2354 157 7 0.0920 4.267396e+00 -9.696346e+00 1.556811e+01 # HT + 2355 157 7 0.0920 3.670004e+00 -9.945175e+00 1.391030e+01 # HT + 2356 158 1 -2.2897 3.321750e-01 -7.796423e+00 4.481877e+00 # CAT + 2357 158 2 -2.3557 1.512905e+00 -8.140109e+00 3.812731e+00 # CAO + 2358 158 3 -2.3537 2.630578e+00 -7.300482e+00 3.889099e+00 # CAM + 2359 158 4 -2.3627 2.567522e+00 -6.117168e+00 4.634613e+00 # CAP + 2360 158 3 -2.3537 1.386793e+00 -5.773481e+00 5.303759e+00 # CAM + 2361 158 2 -2.3557 2.691190e-01 -6.613108e+00 5.227392e+00 # CAO + 2362 158 5 -2.4057 -8.733150e-01 -8.702020e+00 4.399509e+00 # CTT + 2363 158 6 0.1480 1.561548e+00 -9.052951e+00 3.237620e+00 # HAT + 2364 158 6 0.1480 3.541427e+00 -7.565612e+00 3.372900e+00 # HAT + 2365 158 6 0.1480 3.429728e+00 -5.469455e+00 4.693525e+00 # HAT + 2366 158 6 0.1480 1.338150e+00 -4.860639e+00 5.878871e+00 # HAT + 2367 158 6 0.1480 -6.417290e-01 -6.347978e+00 5.743591e+00 # HAT + 2368 158 7 0.0920 -5.452730e-01 -9.734224e+00 4.276853e+00 # HT + 2369 158 7 0.0920 -1.458105e+00 -8.613537e+00 5.315092e+00 # HT + 2370 158 7 0.0920 -1.487993e+00 -8.412939e+00 3.547041e+00 # HT + 2371 159 1 -2.2897 5.524772e+00 -9.960755e+00 2.157545e+00 # CAT + 2372 159 2 -2.3557 4.454155e+00 -9.613388e+00 1.325009e+00 # CAO + 2373 159 3 -2.3537 4.673169e+00 -9.386165e+00 -3.895700e-02 # CAM + 2374 159 4 -2.3627 5.962800e+00 -9.506309e+00 -5.703870e-01 # CAP + 2375 159 3 -2.3537 7.033416e+00 -9.853676e+00 2.621490e-01 # CAM + 2376 159 2 -2.3557 6.814403e+00 -1.008090e+01 1.626114e+00 # CAO + 2377 159 5 -2.4057 5.288550e+00 -1.020583e+01 3.628679e+00 # CTT + 2378 159 6 0.1480 3.459297e+00 -9.520705e+00 1.734969e+00 # HAT + 2379 159 6 0.1480 3.847265e+00 -9.118196e+00 -6.811990e-01 # HAT + 2380 159 6 0.1480 6.131754e+00 -9.331023e+00 -1.622589e+00 # HAT + 2381 159 6 0.1480 8.028275e+00 -9.946359e+00 -1.478120e-01 # HAT + 2382 159 6 0.1480 7.640307e+00 -1.034887e+01 2.268356e+00 # HAT + 2383 159 7 0.0920 4.279375e+00 -1.059049e+01 3.776017e+00 # HT + 2384 159 7 0.0920 6.011593e+00 -1.093360e+01 3.997003e+00 # HT + 2385 159 7 0.0920 5.403920e+00 -9.270570e+00 4.176471e+00 # HT + 2386 160 1 -2.2897 5.104672e+00 1.661963e+00 -3.318084e+00 # CAT + 2387 160 2 -2.3557 5.569579e+00 7.517380e-01 -4.274825e+00 # CAO + 2388 160 3 -2.3537 4.663457e+00 1.028640e-01 -5.122119e+00 # CAM + 2389 160 4 -2.3627 3.292429e+00 3.642150e-01 -5.012672e+00 # CAP + 2390 160 3 -2.3537 2.827523e+00 1.274441e+00 -4.055931e+00 # CAM + 2391 160 2 -2.3557 3.733644e+00 1.923314e+00 -3.208638e+00 # CAO + 2392 160 5 -2.4057 6.081989e+00 2.361820e+00 -2.404218e+00 # CTT + 2393 160 6 0.1480 6.627228e+00 5.501240e-01 -4.359255e+00 # HAT + 2394 160 6 0.1480 5.022099e+00 -5.993100e-01 -5.860176e+00 # HAT + 2395 160 6 0.1480 2.593421e+00 -1.363440e-01 -5.666298e+00 # HAT + 2396 160 6 0.1480 1.769873e+00 1.476054e+00 -3.971501e+00 # HAT + 2397 160 6 0.1480 3.375002e+00 2.625488e+00 -2.470581e+00 # HAT + 2398 160 7 0.0920 7.036720e+00 2.482145e+00 -2.916187e+00 # HT + 2399 160 7 0.0920 5.689303e+00 3.341981e+00 -2.133697e+00 # HT + 2400 160 7 0.0920 6.226428e+00 1.767246e+00 -1.502154e+00 # HT + 2401 161 1 -2.2897 -7.990068e+00 -5.329315e+00 -6.623098e+00 # CAT + 2402 161 2 -2.3557 -6.680085e+00 -5.810586e+00 -6.734102e+00 # CAO + 2403 161 3 -2.3537 -5.826116e+00 -5.295764e+00 -7.716801e+00 # CAM + 2404 161 4 -2.3627 -6.282131e+00 -4.299671e+00 -8.588494e+00 # CAP + 2405 161 3 -2.3537 -7.592114e+00 -3.818400e+00 -8.477489e+00 # CAM + 2406 161 2 -2.3557 -8.446083e+00 -4.333222e+00 -7.494791e+00 # CAO + 2407 161 5 -2.4057 -8.911135e+00 -5.884587e+00 -5.563188e+00 # CTT + 2408 161 6 0.1480 -6.328302e+00 -6.579001e+00 -6.061654e+00 # HAT + 2409 161 6 0.1480 -4.815558e+00 -5.667030e+00 -7.802433e+00 # HAT + 2410 161 6 0.1480 -5.623355e+00 -3.902522e+00 -9.346576e+00 # HAT + 2411 161 6 0.1480 -7.943896e+00 -3.049985e+00 -9.149938e+00 # HAT + 2412 161 6 0.1480 -9.456641e+00 -3.961955e+00 -7.409159e+00 # HAT + 2413 161 7 0.0920 -8.324591e+00 -6.199585e+00 -4.700144e+00 # HT + 2414 161 7 0.0920 -9.620681e+00 -5.115327e+00 -5.258423e+00 # HT + 2415 161 7 0.0920 -9.453951e+00 -6.740246e+00 -5.964807e+00 # HT + 2416 162 1 -2.2897 1.292764e+01 6.799594e+00 1.480299e+01 # CAT + 2417 162 2 -2.3557 1.176741e+01 6.066701e+00 1.508001e+01 # CAO + 2418 162 3 -2.3537 1.185052e+01 4.691027e+00 1.532621e+01 # CAM + 2419 162 4 -2.3627 1.309385e+01 4.048247e+00 1.529539e+01 # CAP + 2420 162 3 -2.3537 1.425408e+01 4.781140e+00 1.501837e+01 # CAM + 2421 162 2 -2.3557 1.417097e+01 6.156813e+00 1.477217e+01 # CAO + 2422 162 5 -2.4057 1.283800e+01 8.283357e+00 1.453745e+01 # CTT + 2423 162 6 0.1480 1.080827e+01 6.562560e+00 1.510379e+01 # HAT + 2424 162 6 0.1480 1.095549e+01 4.125652e+00 1.553991e+01 # HAT + 2425 162 6 0.1480 1.315797e+01 2.987012e+00 1.548532e+01 # HAT + 2426 162 6 0.1480 1.521322e+01 4.285280e+00 1.499459e+01 # HAT + 2427 162 6 0.1480 1.506601e+01 6.722188e+00 1.455847e+01 # HAT + 2428 162 7 0.0920 1.199512e+01 8.701239e+00 1.508794e+01 # HT + 2429 162 7 0.0920 1.375913e+01 8.767374e+00 1.486201e+01 # HT + 2430 162 7 0.0920 1.269494e+01 8.454039e+00 1.347044e+01 # HT + 2431 163 1 -2.2897 -3.377246e+00 3.740501e+00 -1.361312e+01 # CAT + 2432 163 2 -2.3557 -3.073129e+00 2.710030e+00 -1.271554e+01 # CAO + 2433 163 3 -2.3537 -2.321238e+00 2.981930e+00 -1.156631e+01 # CAM + 2434 163 4 -2.3627 -1.873465e+00 4.284300e+00 -1.131466e+01 # CAP + 2435 163 3 -2.3537 -2.177581e+00 5.314771e+00 -1.221223e+01 # CAM + 2436 163 2 -2.3557 -2.929471e+00 5.042872e+00 -1.336146e+01 # CAO + 2437 163 5 -2.4057 -4.188213e+00 3.447239e+00 -1.485265e+01 # CTT + 2438 163 6 0.1480 -3.418554e+00 1.705345e+00 -1.290968e+01 # HAT + 2439 163 6 0.1480 -2.086634e+00 2.186995e+00 -1.087390e+01 # HAT + 2440 163 6 0.1480 -1.293434e+00 4.494051e+00 -1.042811e+01 # HAT + 2441 163 6 0.1480 -1.832155e+00 6.319457e+00 -1.201810e+01 # HAT + 2442 163 6 0.1480 -3.164076e+00 5.837807e+00 -1.405388e+01 # HAT + 2443 163 7 0.0920 -4.868631e+00 2.619001e+00 -1.465477e+01 # HT + 2444 163 7 0.0920 -4.763199e+00 4.331105e+00 -1.512882e+01 # HT + 2445 163 7 0.0920 -3.519043e+00 3.179615e+00 -1.567038e+01 # HT + 2446 164 1 -2.2897 -5.047939e+00 -4.647917e+00 -1.503865e+01 # CAT + 2447 164 2 -2.3557 -5.061912e+00 -6.047845e+00 -1.503660e+01 # CAO + 2448 164 3 -2.3537 -6.277979e+00 -6.735872e+00 -1.512494e+01 # CAM + 2449 164 4 -2.3627 -7.480071e+00 -6.023970e+00 -1.521532e+01 # CAP + 2450 164 3 -2.3537 -7.466098e+00 -4.624042e+00 -1.521737e+01 # CAM + 2451 164 2 -2.3557 -6.250032e+00 -3.936015e+00 -1.512903e+01 # CAO + 2452 164 5 -2.4057 -3.736326e+00 -3.905831e+00 -1.494337e+01 # CTT + 2453 164 6 0.1480 -4.134584e+00 -6.597027e+00 -1.496688e+01 # HAT + 2454 164 6 0.1480 -6.288758e+00 -7.815817e+00 -1.512336e+01 # HAT + 2455 164 6 0.1480 -8.418179e+00 -6.554734e+00 -1.528347e+01 # HAT + 2456 164 6 0.1480 -8.393427e+00 -4.074860e+00 -1.528709e+01 # HAT + 2457 164 6 0.1480 -6.239253e+00 -2.856070e+00 -1.513061e+01 # HAT + 2458 164 7 0.0920 -2.946436e+00 -4.503095e+00 -1.539884e+01 # HT + 2459 164 7 0.0920 -3.818413e+00 -2.953194e+00 -1.546668e+01 # HT + 2460 164 7 0.0920 -3.495988e+00 -3.724764e+00 -1.389573e+01 # HT + 2461 165 1 -2.2897 8.001863e+00 -6.090471e+00 -1.129725e+01 # CAT + 2462 165 2 -2.3557 8.091928e+00 -7.164614e+00 -1.219062e+01 # CAO + 2463 165 3 -2.3537 6.944618e+00 -7.892469e+00 -1.252812e+01 # CAM + 2464 165 4 -2.3627 5.707243e+00 -7.546182e+00 -1.197226e+01 # CAP + 2465 165 3 -2.3537 5.617178e+00 -6.472039e+00 -1.107889e+01 # CAM + 2466 165 2 -2.3557 6.764487e+00 -5.744184e+00 -1.074139e+01 # CAO + 2467 165 5 -2.4057 9.239318e+00 -5.305428e+00 -1.093323e+01 # CTT + 2468 165 6 0.1480 9.046474e+00 -7.431750e+00 -1.261943e+01 # HAT + 2469 165 6 0.1480 7.014096e+00 -8.721093e+00 -1.321729e+01 # HAT + 2470 165 6 0.1480 4.822175e+00 -8.107670e+00 -1.223261e+01 # HAT + 2471 165 6 0.1480 4.662631e+00 -6.204903e+00 -1.065008e+01 # HAT + 2472 165 6 0.1480 6.695008e+00 -4.915560e+00 -1.005222e+01 # HAT + 2473 165 7 0.0920 9.937528e+00 -5.318082e+00 -1.177016e+01 # HT + 2474 165 7 0.0920 8.963301e+00 -4.275609e+00 -1.070655e+01 # HT + 2475 165 7 0.0920 9.711657e+00 -5.755100e+00 -1.005986e+01 # HT + 2476 166 1 -2.2897 -1.110602e+00 2.274025e+00 3.053234e+00 # CAT + 2477 166 2 -2.3557 -3.738200e-01 2.535818e+00 4.214534e+00 # CAO + 2478 166 3 -2.3537 -1.023746e+00 2.989927e+00 5.368389e+00 # CAM + 2479 166 4 -2.3627 -2.410454e+00 3.182243e+00 5.360944e+00 # CAP + 2480 166 3 -2.3537 -3.147236e+00 2.920449e+00 4.199645e+00 # CAM + 2481 166 2 -2.3557 -2.497311e+00 2.466341e+00 3.045790e+00 # CAO + 2482 166 5 -2.4057 -4.096110e-01 1.784236e+00 1.808719e+00 # CTT + 2483 166 6 0.1480 6.959260e-01 2.387460e+00 4.220277e+00 # HAT + 2484 166 6 0.1480 -4.553720e-01 3.191881e+00 6.264248e+00 # HAT + 2485 166 6 0.1480 -2.911826e+00 3.532555e+00 6.251061e+00 # HAT + 2486 166 6 0.1480 -4.216983e+00 3.068808e+00 4.193902e+00 # HAT + 2487 166 6 0.1480 -3.065686e+00 2.264386e+00 2.149930e+00 # HAT + 2488 166 7 0.0920 4.703450e-01 1.205971e+00 2.090480e+00 # HT + 2489 166 7 0.0920 -1.088114e+00 1.154981e+00 1.232723e+00 # HT + 2490 166 7 0.0920 -1.043300e-01 2.637696e+00 1.203319e+00 # HT + 2491 167 1 -2.2897 2.019364e+00 1.358022e+01 -6.321715e+00 # CAT + 2492 167 2 -2.3557 2.403359e+00 1.224988e+01 -6.114996e+00 # CAO + 2493 167 3 -2.3537 1.950629e+00 1.155811e+01 -4.985177e+00 # CAM + 2494 167 4 -2.3627 1.113906e+00 1.219668e+01 -4.062077e+00 # CAP + 2495 167 3 -2.3537 7.299110e-01 1.352703e+01 -4.268796e+00 # CAM + 2496 167 2 -2.3557 1.182640e+00 1.421880e+01 -5.398614e+00 # CAO + 2497 167 5 -2.4057 2.507665e+00 1.432634e+01 -7.540306e+00 # CTT + 2498 167 6 0.1480 3.048832e+00 1.175726e+01 -6.827102e+00 # HAT + 2499 167 6 0.1480 2.246854e+00 1.053184e+01 -4.825708e+00 # HAT + 2500 167 6 0.1480 7.646570e-01 1.166303e+01 -3.190501e+00 # HAT + 2501 167 6 0.1480 8.443800e-02 1.401964e+01 -3.556689e+00 # HAT + 2502 167 6 0.1480 8.864150e-01 1.524506e+01 -5.558083e+00 # HAT + 2503 167 7 0.0920 2.661644e+00 1.362399e+01 -8.359505e+00 # HT + 2504 167 7 0.0920 1.765742e+00 1.506901e+01 -7.833743e+00 # HT + 2505 167 7 0.0920 3.448592e+00 1.482540e+01 -7.308566e+00 # HT + 2506 168 1 -2.2897 1.087030e+01 -1.087734e+01 1.120032e+01 # CAT + 2507 168 2 -2.3557 1.125090e+01 -1.176333e+01 1.018535e+01 # CAO + 2508 168 3 -2.3537 1.029277e+01 -1.225833e+01 9.292617e+00 # CAM + 2509 168 4 -2.3627 8.954049e+00 -1.186732e+01 9.414847e+00 # CAP + 2510 168 3 -2.3537 8.573453e+00 -1.098133e+01 1.042981e+01 # CAM + 2511 168 2 -2.3557 9.531578e+00 -1.048633e+01 1.132255e+01 # CAO + 2512 168 5 -2.4057 1.190371e+01 -1.034345e+01 1.216320e+01 # CTT + 2513 168 6 0.1480 1.228362e+01 -1.206497e+01 1.009106e+01 # HAT + 2514 168 6 0.1480 1.058637e+01 -1.294181e+01 8.509642e+00 # HAT + 2515 168 6 0.1480 8.214923e+00 -1.224917e+01 8.726164e+00 # HAT + 2516 168 6 0.1480 7.540724e+00 -1.067969e+01 1.052411e+01 # HAT + 2517 168 6 0.1480 9.237975e+00 -9.802851e+00 1.210553e+01 # HAT + 2518 168 7 0.0920 1.287097e+01 -1.028625e+01 1.166397e+01 # HT + 2519 168 7 0.0920 1.160914e+01 -9.349042e+00 1.249857e+01 # HT + 2520 168 7 0.0920 1.197804e+01 -1.100914e+01 1.302311e+01 # HT + 2521 169 1 -2.2897 -1.353616e+01 -1.030034e+00 -1.354210e+01 # CAT + 2522 169 2 -2.3557 -1.247673e+01 -1.935247e+00 -1.367696e+01 # CAO + 2523 169 3 -2.3537 -1.116202e+01 -1.513760e+00 -1.344479e+01 # CAM + 2524 169 4 -2.3627 -1.090675e+01 -1.870620e-01 -1.307777e+01 # CAP + 2525 169 3 -2.3537 -1.196618e+01 7.181510e-01 -1.294291e+01 # CAM + 2526 169 2 -2.3557 -1.328089e+01 2.966650e-01 -1.317507e+01 # CAO + 2527 169 5 -2.4057 -1.495416e+01 -1.484636e+00 -1.379250e+01 # CTT + 2528 169 6 0.1480 -1.267365e+01 -2.958700e+00 -1.396009e+01 # HAT + 2529 169 6 0.1480 -1.034474e+01 -2.212067e+00 -1.354883e+01 # HAT + 2530 169 6 0.1480 -9.892549e+00 1.380850e-01 -1.289867e+01 # HAT + 2531 169 6 0.1480 -1.176926e+01 1.741604e+00 -1.265977e+01 # HAT + 2532 169 6 0.1480 -1.409817e+01 9.949720e-01 -1.307104e+01 # HAT + 2533 169 7 0.0920 -1.504715e+01 -2.541299e+00 -1.354167e+01 # HT + 2534 169 7 0.0920 -1.563734e+01 -9.032690e-01 -1.317333e+01 # HT + 2535 169 7 0.0920 -1.520304e+01 -1.337965e+00 -1.484352e+01 # HT + 2536 170 1 -2.2897 -9.776519e+00 8.663007e+00 8.064009e+00 # CAT + 2537 170 2 -2.3557 -8.973606e+00 7.580481e+00 7.685238e+00 # CAO + 2538 170 3 -2.3537 -9.466861e+00 6.621857e+00 6.792074e+00 # CAM + 2539 170 4 -2.3627 -1.076303e+01 6.745760e+00 6.277683e+00 # CAP + 2540 170 3 -2.3537 -1.156594e+01 7.828287e+00 6.656455e+00 # CAM + 2541 170 2 -2.3557 -1.107269e+01 8.786910e+00 7.549618e+00 # CAO + 2542 170 5 -2.4057 -9.244509e+00 9.696951e+00 9.027350e+00 # CTT + 2543 170 6 0.1480 -7.973706e+00 7.484899e+00 8.082054e+00 # HAT + 2544 170 6 0.1480 -8.847471e+00 5.786766e+00 6.499878e+00 # HAT + 2545 170 6 0.1480 -1.114354e+01 6.006251e+00 5.588671e+00 # HAT + 2546 170 6 0.1480 -1.256584e+01 7.923869e+00 6.259638e+00 # HAT + 2547 170 6 0.1480 -1.169208e+01 9.622002e+00 7.841813e+00 # HAT + 2548 170 7 0.0920 -8.163304e+00 9.776977e+00 8.914678e+00 # HT + 2549 170 7 0.0920 -9.703848e+00 1.066239e+01 8.815145e+00 # HT + 2550 170 7 0.0920 -9.481793e+00 9.398902e+00 1.004861e+01 # HT + 2551 171 1 -2.2897 -1.360872e+01 1.342994e+01 -1.165809e+01 # CAT + 2552 171 2 -2.3557 -1.228082e+01 1.335143e+01 -1.209454e+01 # CAO + 2553 171 3 -2.3537 -1.181263e+01 1.218177e+01 -1.270504e+01 # CAM + 2554 171 4 -2.3627 -1.267236e+01 1.109063e+01 -1.287908e+01 # CAP + 2555 171 3 -2.3537 -1.400027e+01 1.116915e+01 -1.244262e+01 # CAM + 2556 171 2 -2.3557 -1.446845e+01 1.233881e+01 -1.183213e+01 # CAO + 2557 171 5 -2.4057 -1.411369e+01 1.469150e+01 -1.099962e+01 # CTT + 2558 171 6 0.1480 -1.161760e+01 1.419316e+01 -1.196029e+01 # HAT + 2559 171 6 0.1480 -1.078825e+01 1.212120e+01 -1.304174e+01 # HAT + 2560 171 6 0.1480 -1.231119e+01 1.018832e+01 -1.335004e+01 # HAT + 2561 171 6 0.1480 -1.466348e+01 1.032741e+01 -1.257688e+01 # HAT + 2562 171 6 0.1480 -1.549284e+01 1.239938e+01 -1.149543e+01 # HAT + 2563 171 7 0.0920 -1.357260e+01 1.555059e+01 -1.139622e+01 # HT + 2564 171 7 0.0920 -1.517814e+01 1.480742e+01 -1.120363e+01 # HT + 2565 171 7 0.0920 -1.395537e+01 1.462846e+01 -9.923027e+00 # HT + 2566 172 1 -2.2897 1.389519e+01 2.485259e+00 1.299849e+01 # CAT + 2567 172 2 -2.3557 1.290828e+01 1.539973e+00 1.330255e+01 # CAO + 2568 172 3 -2.3537 1.156842e+01 1.933772e+00 1.340100e+01 # CAM + 2569 172 4 -2.3627 1.121546e+01 3.272856e+00 1.319539e+01 # CAP + 2570 172 3 -2.3537 1.220237e+01 4.218143e+00 1.289134e+01 # CAM + 2571 172 2 -2.3557 1.354223e+01 3.824345e+00 1.279289e+01 # CAO + 2572 172 5 -2.4057 1.534032e+01 2.060520e+00 1.289231e+01 # CTT + 2573 172 6 0.1480 1.318056e+01 5.069640e-01 1.346116e+01 # HAT + 2574 172 6 0.1480 1.080709e+01 1.204550e+00 1.363555e+01 # HAT + 2575 172 6 0.1480 1.018185e+01 3.576644e+00 1.327134e+01 # HAT + 2576 172 6 0.1480 1.193009e+01 5.251152e+00 1.273273e+01 # HAT + 2577 172 6 0.1480 1.430356e+01 4.553566e+00 1.255833e+01 # HAT + 2578 172 7 0.0920 1.539151e+01 1.026013e+00 1.255278e+01 # HT + 2579 172 7 0.0920 1.585677e+01 2.702545e+00 1.217874e+01 # HT + 2580 172 7 0.0920 1.581735e+01 2.145964e+00 1.386865e+01 # HT + 2581 173 1 -2.2897 -1.484313e+01 -2.172971e+00 -2.676600e-02 # CAT + 2582 173 2 -2.3557 -1.401990e+01 -1.171460e+00 -5.552330e-01 # CAO + 2583 173 3 -2.3537 -1.393181e+01 -9.968400e-01 -1.941504e+00 # CAM + 2584 173 4 -2.3627 -1.466695e+01 -1.823731e+00 -2.799308e+00 # CAP + 2585 173 3 -2.3537 -1.549017e+01 -2.825242e+00 -2.270842e+00 # CAM + 2586 173 2 -2.3557 -1.557826e+01 -2.999863e+00 -8.845710e-01 # CAO + 2587 173 5 -2.4057 -1.493814e+01 -2.361311e+00 1.468426e+00 # CTT + 2588 173 6 0.1480 -1.345280e+01 -5.335730e-01 1.065020e-01 # HAT + 2589 173 6 0.1480 -1.329675e+01 -2.242460e-01 -2.349178e+00 # HAT + 2590 173 6 0.1480 -1.459899e+01 -1.689025e+00 -3.868718e+00 # HAT + 2591 173 6 0.1480 -1.605728e+01 -3.463130e+00 -2.932577e+00 # HAT + 2592 173 6 0.1480 -1.621332e+01 -3.772457e+00 -4.768970e-01 # HAT + 2593 173 7 0.0920 -1.478146e+01 -1.404438e+00 1.966367e+00 # HT + 2594 173 7 0.0920 -1.592516e+01 -2.746327e+00 1.724661e+00 # HT + 2595 173 7 0.0920 -1.417649e+01 -3.069315e+00 1.795096e+00 # HT + 2596 174 1 -2.2897 1.158764e+01 6.596540e-01 -1.381122e+01 # CAT + 2597 174 2 -2.3557 1.171831e+01 -3.742800e-02 -1.260416e+01 # CAO + 2598 174 3 -2.3537 1.295993e+01 -9.496100e-02 -1.195990e+01 # CAM + 2599 174 4 -2.3627 1.407088e+01 5.445890e-01 -1.252271e+01 # CAP + 2600 174 3 -2.3537 1.394022e+01 1.241670e+00 -1.372977e+01 # CAM + 2601 174 2 -2.3557 1.269860e+01 1.299203e+00 -1.437403e+01 # CAO + 2602 174 5 -2.4057 1.024846e+01 7.217070e-01 -1.450610e+01 # CTT + 2603 174 6 0.1480 1.086128e+01 -5.307950e-01 -1.216999e+01 # HAT + 2604 174 6 0.1480 1.306073e+01 -6.327100e-01 -1.102874e+01 # HAT + 2605 174 6 0.1480 1.502871e+01 5.002060e-01 -1.202571e+01 # HAT + 2606 174 6 0.1480 1.479724e+01 1.735037e+00 -1.416394e+01 # HAT + 2607 174 6 0.1480 1.259780e+01 1.836952e+00 -1.530519e+01 # HAT + 2608 174 7 0.0920 9.451144e+00 6.742970e-01 -1.376439e+01 # HT + 2609 174 7 0.0920 1.017059e+01 1.655269e+00 -1.506332e+01 # HT + 2610 174 7 0.0920 1.015559e+01 -1.195900e-01 -1.519290e+01 # HT + 2611 175 1 -2.2897 5.827072e+00 9.473576e+00 -1.185464e+00 # CAT + 2612 175 2 -2.3557 6.676509e+00 1.006857e+01 -2.125910e+00 # CAO + 2613 175 3 -2.3537 6.140518e+00 1.083965e+01 -3.164252e+00 # CAM + 2614 175 4 -2.3627 4.755090e+00 1.101573e+01 -3.262148e+00 # CAP + 2615 175 3 -2.3537 3.905653e+00 1.042074e+01 -2.321702e+00 # CAM + 2616 175 2 -2.3557 4.441644e+00 9.649659e+00 -1.283360e+00 # CAO + 2617 175 5 -2.4057 6.405177e+00 8.641916e+00 -6.553700e-02 # CTT + 2618 175 6 0.1480 7.745268e+00 9.932736e+00 -2.050390e+00 # HAT + 2619 175 6 0.1480 6.795798e+00 1.129864e+01 -3.889739e+00 # HAT + 2620 175 6 0.1480 4.341611e+00 1.161056e+01 -4.063156e+00 # HAT + 2621 175 6 0.1480 2.836894e+00 1.055657e+01 -2.397222e+00 # HAT + 2622 175 6 0.1480 3.786364e+00 9.190663e+00 -5.578730e-01 # HAT + 2623 175 7 0.0920 7.397067e+00 9.014753e+00 1.899000e-01 # HT + 2624 175 7 0.0920 5.756868e+00 8.707308e+00 8.082590e-01 # HT + 2625 175 7 0.0920 6.479497e+00 7.602496e+00 -3.851980e-01 # HT + 2626 176 1 -2.2897 -2.122912e+00 -1.483338e+01 7.414950e-01 # CAT + 2627 176 2 -2.3557 -2.789685e+00 -1.475037e+01 -4.867240e-01 # CAO + 2628 176 3 -2.3537 -4.181364e+00 -1.489362e+01 -5.387970e-01 # CAM + 2629 176 4 -2.3627 -4.906269e+00 -1.511987e+01 6.373490e-01 # CAP + 2630 176 3 -2.3537 -4.239496e+00 -1.520288e+01 1.865568e+00 # CAM + 2631 176 2 -2.3557 -2.847818e+00 -1.505964e+01 1.917642e+00 # CAO + 2632 176 5 -2.4057 -6.218880e-01 -1.467888e+01 7.976600e-01 # CTT + 2633 176 6 0.1480 -2.230472e+00 -1.457583e+01 -1.394037e+00 # HAT + 2634 176 6 0.1480 -4.695731e+00 -1.482958e+01 -1.486281e+00 # HAT + 2635 176 6 0.1480 -5.979850e+00 -1.523038e+01 5.971780e-01 # HAT + 2636 176 6 0.1480 -4.798710e+00 -1.537742e+01 2.772881e+00 # HAT + 2637 176 6 0.1480 -2.333450e+00 -1.512368e+01 2.865125e+00 # HAT + 2638 176 7 0.0920 -2.934260e-01 -1.402134e+01 -7.234000e-03 # HT + 2639 176 7 0.0920 -3.360900e-01 -1.424832e+01 1.757364e+00 # HT + 2640 176 7 0.0920 -1.510860e-01 -1.565531e+01 6.834490e-01 # HT + 2641 177 1 -2.2897 9.515090e+00 -8.536665e+00 1.503099e+01 # CAT + 2642 177 2 -2.3557 8.489560e+00 -7.588200e+00 1.512428e+01 # CAO + 2643 177 3 -2.3537 8.801377e+00 -6.225783e+00 1.520545e+01 # CAM + 2644 177 4 -2.3627 1.013872e+01 -5.811831e+00 1.519334e+01 # CAP + 2645 177 3 -2.3537 1.116425e+01 -6.760296e+00 1.510005e+01 # CAM + 2646 177 2 -2.3557 1.085244e+01 -8.122712e+00 1.501888e+01 # CAO + 2647 177 5 -2.4057 9.178773e+00 -1.000613e+01 1.494343e+01 # CTT + 2648 177 6 0.1480 7.457892e+00 -7.907535e+00 1.513362e+01 # HAT + 2649 177 6 0.1480 8.010254e+00 -5.494110e+00 1.527742e+01 # HAT + 2650 177 6 0.1480 1.037927e+01 -4.760823e+00 1.525596e+01 # HAT + 2651 177 6 0.1480 1.219592e+01 -6.440961e+00 1.509071e+01 # HAT + 2652 177 6 0.1480 1.164356e+01 -8.854385e+00 1.494691e+01 # HAT + 2653 177 7 0.0920 8.215495e+00 -1.013007e+01 1.444862e+01 # HT + 2654 177 7 0.0920 9.949643e+00 -1.052235e+01 1.437127e+01 # HT + 2655 177 7 0.0920 9.128063e+00 -1.042821e+01 1.594711e+01 # HT + 2656 178 1 -2.2897 1.367948e+01 5.896505e+00 -1.390580e+01 # CAT + 2657 178 2 -2.3557 1.296901e+01 4.728532e+00 -1.420757e+01 # CAO + 2658 178 3 -2.3537 1.174486e+01 4.808414e+00 -1.488216e+01 # CAM + 2659 178 4 -2.3627 1.123118e+01 6.056268e+00 -1.525498e+01 # CAP + 2660 178 3 -2.3537 1.194166e+01 7.224241e+00 -1.495321e+01 # CAM + 2661 178 2 -2.3557 1.316581e+01 7.144360e+00 -1.427862e+01 # CAO + 2662 178 5 -2.4057 1.499982e+01 5.810348e+00 -1.317820e+01 # CTT + 2663 178 6 0.1480 1.336528e+01 3.765902e+00 -1.391996e+01 # HAT + 2664 178 6 0.1480 1.119678e+01 3.907406e+00 -1.511495e+01 # HAT + 2665 178 6 0.1480 1.028684e+01 6.117892e+00 -1.577537e+01 # HAT + 2666 178 6 0.1480 1.154539e+01 8.186872e+00 -1.524081e+01 # HAT + 2667 178 6 0.1480 1.371389e+01 8.045368e+00 -1.404582e+01 # HAT + 2668 178 7 0.0920 1.549151e+01 4.869830e+00 -1.342672e+01 # HT + 2669 178 7 0.0920 1.563595e+01 6.642839e+00 -1.347887e+01 # HT + 2670 178 7 0.0920 1.482644e+01 5.856091e+00 -1.210305e+01 # HT + 2671 179 1 -2.2897 7.461620e-01 8.867300e-01 1.424244e+01 # CAT + 2672 179 2 -2.3557 4.145600e-02 -3.086450e-01 1.442810e+01 # CAO + 2673 179 3 -2.3537 -1.062513e+00 -6.032940e-01 1.361913e+01 # CAM + 2674 179 4 -2.3627 -1.461776e+00 2.974320e-01 1.262450e+01 # CAP + 2675 179 3 -2.3537 -7.570700e-01 1.492807e+00 1.243885e+01 # CAM + 2676 179 2 -2.3557 3.468990e-01 1.787456e+00 1.324782e+01 # CAO + 2677 179 5 -2.4057 1.936871e+00 1.204531e+00 1.511498e+01 # CTT + 2678 179 6 0.1480 3.494590e-01 -1.003490e+00 1.519538e+01 # HAT + 2679 179 6 0.1480 -1.606144e+00 -1.525440e+00 1.376235e+01 # HAT + 2680 179 6 0.1480 -2.313410e+00 7.013100e-02 1.200044e+01 # HAT + 2681 179 6 0.1480 -1.065073e+00 2.187653e+00 1.167156e+01 # HAT + 2682 179 6 0.1480 8.905290e-01 2.709603e+00 1.310460e+01 # HAT + 2683 179 7 0.0920 2.420938e+00 2.773530e-01 1.542177e+01 # HT + 2684 179 7 0.0920 2.645106e+00 1.815710e+00 1.455555e+01 # HT + 2685 179 7 0.0920 1.605311e+00 1.750259e+00 1.599835e+01 # HT + 2686 180 1 -2.2897 8.257893e+00 1.390264e+01 -8.376581e+00 # CAT + 2687 180 2 -2.3557 9.097894e+00 1.306944e+01 -7.628136e+00 # CAO + 2688 180 3 -2.3537 8.556801e+00 1.200737e+01 -6.893824e+00 # CAM + 2689 180 4 -2.3627 7.175709e+00 1.177849e+01 -6.907958e+00 # CAP + 2690 180 3 -2.3537 6.335708e+00 1.261170e+01 -7.656404e+00 # CAM + 2691 180 2 -2.3557 6.876800e+00 1.367377e+01 -8.390715e+00 # CAO + 2692 180 5 -2.4057 8.841499e+00 1.504817e+01 -9.168589e+00 # CTT + 2693 180 6 0.1480 1.016331e+01 1.324600e+01 -7.617232e+00 # HAT + 2694 180 6 0.1480 9.204802e+00 1.136461e+01 -6.316452e+00 # HAT + 2695 180 6 0.1480 6.758295e+00 1.095918e+01 -6.341489e+00 # HAT + 2696 180 6 0.1480 5.270293e+00 1.243514e+01 -7.667307e+00 # HAT + 2697 180 6 0.1480 6.228799e+00 1.431653e+01 -8.968087e+00 # HAT + 2698 180 7 0.0920 9.852580e+00 1.479317e+01 -9.486066e+00 # HT + 2699 180 7 0.0920 8.222489e+00 1.523670e+01 -1.004573e+01 # HT + 2700 180 7 0.0920 8.871305e+00 1.594271e+01 -8.546493e+00 # HT + 2701 181 1 -2.2897 1.444772e+01 -3.863891e+00 1.817972e+00 # CAT + 2702 181 2 -2.3557 1.422203e+01 -4.194798e+00 3.159451e+00 # CAO + 2703 181 3 -2.3537 1.359364e+01 -5.402369e+00 3.486394e+00 # CAM + 2704 181 4 -2.3627 1.319093e+01 -6.279033e+00 2.471857e+00 # CAP + 2705 181 3 -2.3537 1.341661e+01 -5.948125e+00 1.130378e+00 # CAM + 2706 181 2 -2.3557 1.404501e+01 -4.740555e+00 8.034350e-01 # CAO + 2707 181 5 -2.4057 1.512549e+01 -2.561440e+00 1.465340e+00 # CTT + 2708 181 6 0.1480 1.453270e+01 -3.518515e+00 3.942093e+00 # HAT + 2709 181 6 0.1480 1.341954e+01 -5.657641e+00 4.521249e+00 # HAT + 2710 181 6 0.1480 1.270617e+01 -7.210588e+00 2.724070e+00 # HAT + 2711 181 6 0.1480 1.310595e+01 -6.624409e+00 3.477350e-01 # HAT + 2712 181 6 0.1480 1.421911e+01 -4.485284e+00 -2.314210e-01 # HAT + 2713 181 7 0.0920 1.581131e+01 -2.280137e+00 2.264475e+00 # HT + 2714 181 7 0.0920 1.568139e+01 -2.680675e+00 5.353630e-01 # HT + 2715 181 7 0.0920 1.437371e+01 -1.781991e+00 1.341273e+00 # HT + 2716 182 1 -2.2897 -7.049633e+00 3.258089e+00 -3.485856e+00 # CAT + 2717 182 2 -2.3557 -5.944612e+00 3.940870e+00 -4.008100e+00 # CAO + 2718 182 3 -2.3537 -5.908871e+00 5.340124e+00 -3.979612e+00 # CAM + 2719 182 4 -2.3627 -6.978151e+00 6.056597e+00 -3.428880e+00 # CAP + 2720 182 3 -2.3537 -8.083172e+00 5.373816e+00 -2.906636e+00 # CAM + 2721 182 2 -2.3557 -8.118913e+00 3.974563e+00 -2.935124e+00 # CAO + 2722 182 5 -2.4057 -7.088183e+00 1.748895e+00 -3.516583e+00 # CTT + 2723 182 6 0.1480 -5.119739e+00 3.388162e+00 -4.432951e+00 # HAT + 2724 182 6 0.1480 -5.056426e+00 5.866840e+00 -4.382486e+00 # HAT + 2725 182 6 0.1480 -6.950579e+00 7.136021e+00 -3.406903e+00 # HAT + 2726 182 6 0.1480 -8.908045e+00 5.926525e+00 -2.481785e+00 # HAT + 2727 182 6 0.1480 -8.971358e+00 3.447847e+00 -2.532250e+00 # HAT + 2728 182 7 0.0920 -6.072539e+00 1.357698e+00 -3.457133e+00 # HT + 2729 182 7 0.0920 -7.668289e+00 1.382425e+00 -2.669661e+00 # HT + 2730 182 7 0.0920 -7.551586e+00 1.415593e+00 -4.445166e+00 # HT + 2731 183 1 -2.2897 2.502015e+00 4.732922e+00 -7.662594e+00 # CAT + 2732 183 2 -2.3557 1.227819e+00 4.651111e+00 -7.088372e+00 # CAO + 2733 183 3 -2.3537 2.742260e-01 3.776189e+00 -7.622387e+00 # CAM + 2734 183 4 -2.3627 5.948300e-01 2.983078e+00 -8.730624e+00 # CAP + 2735 183 3 -2.3537 1.869026e+00 3.064889e+00 -9.304845e+00 # CAM + 2736 183 2 -2.3557 2.822619e+00 3.939811e+00 -8.770831e+00 # CAO + 2737 183 5 -2.4057 3.530533e+00 5.676588e+00 -7.086621e+00 # CTT + 2738 183 6 0.1480 9.804960e-01 5.262940e+00 -6.233447e+00 # HAT + 2739 183 6 0.1480 -7.087250e-01 3.713077e+00 -7.179416e+00 # HAT + 2740 183 6 0.1480 -1.407990e-01 2.308138e+00 -9.142578e+00 # HAT + 2741 183 6 0.1480 2.116348e+00 2.453060e+00 -1.015977e+01 # HAT + 2742 183 6 0.1480 3.805570e+00 4.002923e+00 -9.213802e+00 # HAT + 2743 183 7 0.0920 3.358422e+00 5.793319e+00 -6.016643e+00 # HT + 2744 183 7 0.0920 4.528867e+00 5.271286e+00 -7.251423e+00 # HT + 2745 183 7 0.0920 3.447806e+00 6.647317e+00 -7.575437e+00 # HT + 2746 184 1 -2.2897 2.488684e+00 -1.208082e+00 -1.389090e+00 # CAT + 2747 184 2 -2.3557 2.406245e+00 -1.648242e+00 -2.715537e+00 # CAO + 2748 184 3 -2.3537 1.238156e+00 -2.267307e+00 -3.176329e+00 # CAM + 2749 184 4 -2.3627 1.525080e-01 -2.446211e+00 -2.310674e+00 # CAP + 2750 184 3 -2.3537 2.349470e-01 -2.006051e+00 -9.842260e-01 # CAM + 2751 184 2 -2.3557 1.403034e+00 -1.386987e+00 -5.234340e-01 # CAO + 2752 184 5 -2.4057 3.748550e+00 -5.403760e-01 -8.920920e-01 # CTT + 2753 184 6 0.1480 3.243745e+00 -1.510229e+00 -3.383328e+00 # HAT + 2754 184 6 0.1480 1.174561e+00 -2.606858e+00 -4.199589e+00 # HAT + 2755 184 6 0.1480 -7.485890e-01 -2.923776e+00 -2.666142e+00 # HAT + 2756 184 6 0.1480 -6.025540e-01 -2.144064e+00 -3.164350e-01 # HAT + 2757 184 6 0.1480 1.466630e+00 -1.047435e+00 4.998260e-01 # HAT + 2758 184 7 0.0920 4.233116e+00 -1.790700e-02 -1.716909e+00 # HT + 2759 184 7 0.0920 3.496847e+00 1.738310e-01 -1.080940e-01 # HT + 2760 184 7 0.0920 4.426419e+00 -1.294381e+00 -4.920050e-01 # HT + 2761 185 1 -2.2897 6.499895e+00 1.238470e+01 7.987218e+00 # CAT + 2762 185 2 -2.3557 6.407935e+00 1.292084e+01 9.277217e+00 # CAO + 2763 185 3 -2.3537 5.541048e+00 1.399058e+01 9.530512e+00 # CAM + 2764 185 4 -2.3627 4.766122e+00 1.452418e+01 8.493807e+00 # CAP + 2765 185 3 -2.3537 4.858083e+00 1.398804e+01 7.203808e+00 # CAM + 2766 185 2 -2.3557 5.724968e+00 1.291830e+01 6.950513e+00 # CAO + 2767 185 5 -2.4057 7.434893e+00 1.123090e+01 7.714021e+00 # CTT + 2768 185 6 0.1480 7.005734e+00 1.250920e+01 1.007696e+01 # HAT + 2769 185 6 0.1480 5.470107e+00 1.440417e+01 1.052565e+01 # HAT + 2770 185 6 0.1480 4.097381e+00 1.534941e+01 8.689206e+00 # HAT + 2771 185 6 0.1480 4.260282e+00 1.439968e+01 6.404064e+00 # HAT + 2772 185 6 0.1480 5.795909e+00 1.250471e+01 5.955371e+00 # HAT + 2773 185 7 0.0920 7.534249e+00 1.062240e+01 8.612887e+00 # HT + 2774 185 7 0.0920 7.033011e+00 1.062054e+01 6.905287e+00 # HT + 2775 185 7 0.0920 8.413312e+00 1.161571e+01 7.426403e+00 # HT + 2776 186 1 -2.2897 -6.530651e+00 -1.265391e+00 -6.616663e+00 # CAT + 2777 186 2 -2.3557 -7.198240e+00 -2.283231e+00 -5.925051e+00 # CAO + 2778 186 3 -2.3537 -6.469391e+00 -3.320646e+00 -5.331293e+00 # CAM + 2779 186 4 -2.3627 -5.072952e+00 -3.340221e+00 -5.429148e+00 # CAP + 2780 186 3 -2.3537 -4.405363e+00 -2.322382e+00 -6.120760e+00 # CAM + 2781 186 2 -2.3557 -5.134212e+00 -1.284967e+00 -6.714517e+00 # CAO + 2782 186 5 -2.4057 -7.316767e+00 -1.464650e-01 -7.257074e+00 # CTT + 2783 186 6 0.1480 -8.275493e+00 -2.268130e+00 -5.849564e+00 # HAT + 2784 186 6 0.1480 -6.984388e+00 -4.105836e+00 -4.797764e+00 # HAT + 2785 186 6 0.1480 -4.510696e+00 -4.140513e+00 -4.971106e+00 # HAT + 2786 186 6 0.1480 -3.328110e+00 -2.337483e+00 -6.196247e+00 # HAT + 2787 186 6 0.1480 -4.619215e+00 -4.997760e-01 -7.248047e+00 # HAT + 2788 186 7 0.0920 -8.229357e+00 2.936800e-02 -6.687544e+00 # HT + 2789 186 7 0.0920 -6.714538e+00 7.620080e-01 -7.266944e+00 # HT + 2790 186 7 0.0920 -7.574675e+00 -4.219210e-01 -8.279672e+00 # HT + 2791 187 1 -2.2897 6.095636e+00 -8.359262e+00 7.428506e+00 # CAT + 2792 187 2 -2.3557 6.964857e+00 -8.012640e+00 8.469807e+00 # CAO + 2793 187 3 -2.3537 7.037953e+00 -6.684987e+00 8.907979e+00 # CAM + 2794 187 4 -2.3627 6.241829e+00 -5.703957e+00 8.304850e+00 # CAP + 2795 187 3 -2.3537 5.372608e+00 -6.050579e+00 7.263549e+00 # CAM + 2796 187 2 -2.3557 5.299511e+00 -7.378231e+00 6.825377e+00 # CAO + 2797 187 5 -2.4057 6.016796e+00 -9.791230e+00 6.955906e+00 # CTT + 2798 187 6 0.1480 7.579010e+00 -8.769435e+00 8.935078e+00 # HAT + 2799 187 6 0.1480 7.708495e+00 -6.417592e+00 9.711268e+00 # HAT + 2800 187 6 0.1480 6.298217e+00 -4.679767e+00 8.642868e+00 # HAT + 2801 187 6 0.1480 4.758454e+00 -5.293783e+00 6.798278e+00 # HAT + 2802 187 6 0.1480 4.628969e+00 -7.645626e+00 6.022087e+00 # HAT + 2803 187 7 0.0920 6.236452e+00 -1.046132e+01 7.787073e+00 # HT + 2804 187 7 0.0920 5.014232e+00 -9.995714e+00 6.580204e+00 # HT + 2805 187 7 0.0920 6.742711e+00 -9.951804e+00 6.158810e+00 # HT + 2806 188 1 -2.2897 -1.740414e+00 -8.387832e+00 -1.100746e+01 # CAT + 2807 188 2 -2.3557 -1.999287e+00 -7.117476e+00 -1.153583e+01 # CAO + 2808 188 3 -2.3537 -3.185823e+00 -6.880791e+00 -1.224018e+01 # CAM + 2809 188 4 -2.3627 -4.113485e+00 -7.914461e+00 -1.241616e+01 # CAP + 2810 188 3 -2.3537 -3.854612e+00 -9.184817e+00 -1.188779e+01 # CAM + 2811 188 2 -2.3557 -2.668077e+00 -9.421503e+00 -1.118343e+01 # CAO + 2812 188 5 -2.4057 -4.606500e-01 -8.643115e+00 -1.024776e+01 # CTT + 2813 188 6 0.1480 -1.283662e+00 -6.320074e+00 -1.140008e+01 # HAT + 2814 188 6 0.1480 -3.385525e+00 -5.900802e+00 -1.264779e+01 # HAT + 2815 188 6 0.1480 -5.028813e+00 -7.731875e+00 -1.295952e+01 # HAT + 2816 188 6 0.1480 -4.570238e+00 -9.982220e+00 -1.202354e+01 # HAT + 2817 188 6 0.1480 -2.468374e+00 -1.040149e+01 -1.077583e+01 # HAT + 2818 188 7 0.0920 -1.398260e-01 -7.724587e+00 -9.756357e+00 # HT + 2819 188 7 0.0920 -6.306590e-01 -9.415543e+00 -9.497727e+00 # HT + 2820 188 7 0.0920 3.136500e-01 -8.973753e+00 -1.094003e+01 # HT + 2821 189 1 -2.2897 -6.395831e+00 -8.968700e+00 4.116490e+00 # CAT + 2822 189 2 -2.3557 -7.311288e+00 -8.133883e+00 4.768426e+00 # CAO + 2823 189 3 -2.3537 -6.946709e+00 -7.487054e+00 5.955310e+00 # CAM + 2824 189 4 -2.3627 -5.666674e+00 -7.675041e+00 6.490259e+00 # CAP + 2825 189 3 -2.3537 -4.751217e+00 -8.509857e+00 5.838323e+00 # CAM + 2826 189 2 -2.3557 -5.115795e+00 -9.156686e+00 4.651439e+00 # CAO + 2827 189 5 -2.4057 -6.789055e+00 -9.666351e+00 2.836351e+00 # CTT + 2828 189 6 0.1480 -8.298743e+00 -7.988865e+00 4.355752e+00 # HAT + 2829 189 6 0.1480 -7.652919e+00 -6.843053e+00 6.458232e+00 # HAT + 2830 189 6 0.1480 -5.385427e+00 -7.176058e+00 7.405855e+00 # HAT + 2831 189 6 0.1480 -3.763760e+00 -8.654875e+00 6.250998e+00 # HAT + 2832 189 6 0.1480 -4.409585e+00 -9.800688e+00 4.148517e+00 # HAT + 2833 189 7 0.0920 -7.517201e+00 -9.058342e+00 2.299482e+00 # HT + 2834 189 7 0.0920 -5.905899e+00 -9.808991e+00 2.213623e+00 # HT + 2835 189 7 0.0920 -7.228318e+00 -1.063604e+01 3.070560e+00 # HT + 2836 190 1 -2.2897 -1.552224e+00 1.304410e+01 -1.945146e+00 # CAT + 2837 190 2 -2.3557 -1.811149e+00 1.441590e+01 -1.839755e+00 # CAO + 2838 190 3 -2.3537 -2.388413e+00 1.510384e+01 -2.913768e+00 # CAM + 2839 190 4 -2.3627 -2.706752e+00 1.441998e+01 -4.093170e+00 # CAP + 2840 190 3 -2.3537 -2.447828e+00 1.304818e+01 -4.198561e+00 # CAM + 2841 190 2 -2.3557 -1.870564e+00 1.236023e+01 -3.124549e+00 # CAO + 2842 190 5 -2.4057 -9.296040e-01 1.230210e+01 -7.867480e-01 # CTT + 2843 190 6 0.1480 -1.565572e+00 1.494345e+01 -9.299310e-01 # HAT + 2844 190 6 0.1480 -2.588154e+00 1.616209e+01 -2.832466e+00 # HAT + 2845 190 6 0.1480 -3.152070e+00 1.495068e+01 -4.921694e+00 # HAT + 2846 190 6 0.1480 -2.693404e+00 1.252062e+01 -5.108386e+00 # HAT + 2847 190 6 0.1480 -1.670822e+00 1.130198e+01 -3.205851e+00 # HAT + 2848 190 7 0.0920 -1.225639e+00 1.277507e+01 1.496080e-01 # HT + 2849 190 7 0.0920 -1.269245e+00 1.126639e+01 -7.933200e-01 # HT + 2850 190 7 0.0920 1.561520e-01 1.232847e+01 -8.791480e-01 # HT + 2851 191 1 -2.2897 5.414297e+00 2.981189e+00 -6.176554e+00 # CAT + 2852 191 2 -2.3557 4.958390e+00 2.000237e+00 -7.065307e+00 # CAO + 2853 191 3 -2.3537 3.594411e+00 1.690726e+00 -7.126671e+00 # CAM + 2854 191 4 -2.3627 2.686340e+00 2.362168e+00 -6.299282e+00 # CAP + 2855 191 3 -2.3537 3.142247e+00 3.343119e+00 -5.410529e+00 # CAM + 2856 191 2 -2.3557 4.506225e+00 3.652630e+00 -5.349164e+00 # CAO + 2857 191 5 -2.4057 6.885445e+00 3.315018e+00 -6.110368e+00 # CTT + 2858 191 6 0.1480 5.658902e+00 1.482268e+00 -7.703578e+00 # HAT + 2859 191 6 0.1480 3.242711e+00 9.339920e-01 -7.812280e+00 # HAT + 2860 191 6 0.1480 1.634127e+00 2.123402e+00 -6.346620e+00 # HAT + 2861 191 6 0.1480 2.441734e+00 3.861089e+00 -4.772257e+00 # HAT + 2862 191 6 0.1480 4.857925e+00 4.409364e+00 -4.663555e+00 # HAT + 2863 191 7 0.0920 7.340821e+00 3.147531e+00 -7.086422e+00 # HT + 2864 191 7 0.0920 7.008972e+00 4.360245e+00 -5.826922e+00 # HT + 2865 191 7 0.0920 7.370006e+00 2.678597e+00 -5.369917e+00 # HT + 2866 192 1 -2.2897 -1.317401e+01 2.235010e+00 -2.093310e+00 # CAT + 2867 192 2 -2.3557 -1.201646e+01 2.075060e+00 -1.322284e+00 # CAO + 2868 192 3 -2.3537 -1.082984e+01 1.638379e+00 -1.923327e+00 # CAM + 2869 192 4 -2.3627 -1.080078e+01 1.361647e+00 -3.295396e+00 # CAP + 2870 192 3 -2.3537 -1.195833e+01 1.521596e+00 -4.066422e+00 # CAM + 2871 192 2 -2.3557 -1.314495e+01 1.958277e+00 -3.465380e+00 # CAO + 2872 192 5 -2.4057 -1.445386e+01 2.706002e+00 -1.445043e+00 # CTT + 2873 192 6 0.1480 -1.203887e+01 2.288539e+00 -2.638300e-01 # HAT + 2874 192 6 0.1480 -9.936868e+00 1.514989e+00 -1.328535e+00 # HAT + 2875 192 6 0.1480 -9.885389e+00 1.024778e+00 -3.759058e+00 # HAT + 2876 192 6 0.1480 -1.193592e+01 1.308117e+00 -5.124877e+00 # HAT + 2877 192 6 0.1480 -1.403792e+01 2.081667e+00 -4.060172e+00 # HAT + 2878 192 7 0.0920 -1.421714e+01 3.349828e+00 -5.979570e-01 # HT + 2879 192 7 0.0920 -1.504536e+01 3.264120e+00 -2.170805e+00 # HT + 2880 192 7 0.0920 -1.502425e+01 1.844529e+00 -1.097746e+00 # HT + 2881 193 1 -2.2897 5.525683e+00 -1.475982e+01 1.370636e+01 # CAT + 2882 193 2 -2.3557 5.896111e+00 -1.506207e+01 1.239052e+01 # CAO + 2883 193 3 -2.3537 7.219616e+00 -1.541329e+01 1.209901e+01 # CAM + 2884 193 4 -2.3627 8.172692e+00 -1.546227e+01 1.312334e+01 # CAP + 2885 193 3 -2.3537 7.802263e+00 -1.516002e+01 1.443918e+01 # CAM + 2886 193 2 -2.3557 6.478759e+00 -1.480880e+01 1.473069e+01 # CAO + 2887 193 5 -2.4057 4.098189e+00 -1.438101e+01 1.402078e+01 # CTT + 2888 193 6 0.1480 5.160881e+00 -1.502429e+01 1.160033e+01 # HAT + 2889 193 6 0.1480 7.505375e+00 -1.564645e+01 1.108394e+01 # HAT + 2890 193 6 0.1480 9.193682e+00 -1.573321e+01 1.289846e+01 # HAT + 2891 193 6 0.1480 8.537494e+00 -1.519781e+01 1.522937e+01 # HAT + 2892 193 6 0.1480 6.193000e+00 -1.457564e+01 1.574576e+01 # HAT + 2893 193 7 0.0920 3.427204e+00 -1.487707e+01 1.331949e+01 # HT + 2894 193 7 0.0920 3.854817e+00 -1.469120e+01 1.503697e+01 # HT + 2895 193 7 0.0920 3.980636e+00 -1.330091e+01 1.393315e+01 # HT + 2896 194 1 -2.2897 -3.310230e-01 -1.389826e+01 5.677412e+00 # CAT + 2897 194 2 -2.3557 -1.358414e+00 -1.481879e+01 5.916352e+00 # CAO + 2898 194 3 -2.3537 -2.634615e+00 -1.459690e+01 5.385241e+00 # CAM + 2899 194 4 -2.3627 -2.883424e+00 -1.345449e+01 4.615191e+00 # CAP + 2900 194 3 -2.3537 -1.856033e+00 -1.253396e+01 4.376251e+00 # CAM + 2901 194 2 -2.3557 -5.798320e-01 -1.275584e+01 4.907361e+00 # CAO + 2902 194 5 -2.4057 1.045450e+00 -1.413758e+01 6.250252e+00 # CTT + 2903 194 6 0.1480 -1.166475e+00 -1.570008e+01 6.510390e+00 # HAT + 2904 194 6 0.1480 -3.427173e+00 -1.530703e+01 5.569566e+00 # HAT + 2905 194 6 0.1480 -3.867922e+00 -1.328332e+01 4.205477e+00 # HAT + 2906 194 6 0.1480 -2.047972e+00 -1.165266e+01 3.782212e+00 # HAT + 2907 194 6 0.1480 2.127260e-01 -1.204572e+01 4.723037e+00 # HAT + 2908 194 7 0.0920 1.223345e+00 -1.520970e+01 6.333984e+00 # HT + 2909 194 7 0.0920 1.794757e+00 -1.369568e+01 5.593472e+00 # HT + 2910 194 7 0.0920 1.113275e+00 -1.368037e+01 7.237396e+00 # HT + 2911 195 1 -2.2897 -5.882757e+00 1.207718e+01 1.390659e+01 # CAT + 2912 195 2 -2.3557 -6.150973e+00 1.226499e+01 1.254542e+01 # CAO + 2913 195 3 -2.3537 -6.910744e+00 1.336384e+01 1.212678e+01 # CAM + 2914 195 4 -2.3627 -7.402299e+00 1.427489e+01 1.306931e+01 # CAP + 2915 195 3 -2.3537 -7.134083e+00 1.408708e+01 1.443048e+01 # CAM + 2916 195 2 -2.3557 -6.374312e+00 1.298823e+01 1.484912e+01 # CAO + 2917 195 5 -2.4057 -5.063289e+00 1.089198e+01 1.435813e+01 # CTT + 2918 195 6 0.1480 -5.771774e+00 1.156218e+01 1.181833e+01 # HAT + 2919 195 6 0.1480 -7.117654e+00 1.350873e+01 1.107673e+01 # HAT + 2920 195 6 0.1480 -7.988408e+00 1.512258e+01 1.274636e+01 # HAT + 2921 195 6 0.1480 -7.513283e+00 1.478989e+01 1.515758e+01 # HAT + 2922 195 6 0.1480 -6.167402e+00 1.284334e+01 1.589917e+01 # HAT + 2923 195 7 0.0920 -4.354971e+00 1.062002e+01 1.357555e+01 # HT + 2924 195 7 0.0920 -4.518882e+00 1.115081e+01 1.526627e+01 # HT + 2925 195 7 0.0920 -5.723637e+00 1.004836e+01 1.455896e+01 # HT + 2926 196 1 -2.2897 -1.238219e+01 -6.156582e+00 3.380572e+00 # CAT + 2927 196 2 -2.3557 -1.334353e+01 -5.343366e+00 3.992551e+00 # CAO + 2928 196 3 -2.3537 -1.451124e+01 -4.998602e+00 3.301471e+00 # CAM + 2929 196 4 -2.3627 -1.471761e+01 -5.467054e+00 1.998412e+00 # CAP + 2930 196 3 -2.3537 -1.375628e+01 -6.280269e+00 1.386433e+00 # CAM + 2931 196 2 -2.3557 -1.258857e+01 -6.625033e+00 2.077513e+00 # CAO + 2932 196 5 -2.4057 -1.112273e+01 -6.528434e+00 4.125951e+00 # CTT + 2933 196 6 0.1480 -1.318432e+01 -4.981989e+00 4.997767e+00 # HAT + 2934 196 6 0.1480 -1.525284e+01 -4.371265e+00 3.773569e+00 # HAT + 2935 196 6 0.1480 -1.561842e+01 -5.201093e+00 1.465293e+00 # HAT + 2936 196 6 0.1480 -1.391548e+01 -6.641646e+00 3.812160e-01 # HAT + 2937 196 6 0.1480 -1.184697e+01 -7.252371e+00 1.605415e+00 # HAT + 2938 196 7 0.0920 -1.133024e+01 -6.565081e+00 5.195389e+00 # HT + 2939 196 7 0.0920 -1.077617e+01 -7.505714e+00 3.789917e+00 # HT + 2940 196 7 0.0920 -1.035135e+01 -5.783314e+00 3.931368e+00 # HT + 2941 197 1 -2.2897 -5.514279e+00 -2.651366e+00 1.504457e+01 # CAT + 2942 197 2 -2.3557 -5.915400e+00 -3.987426e+00 1.492606e+01 # CAO + 2943 197 3 -2.3537 -7.265943e+00 -4.328013e+00 1.506761e+01 # CAM + 2944 197 4 -2.3627 -8.215362e+00 -3.332539e+00 1.532768e+01 # CAP + 2945 197 3 -2.3537 -7.814241e+00 -1.996479e+00 1.544619e+01 # CAM + 2946 197 2 -2.3557 -6.463700e+00 -1.655892e+00 1.530463e+01 # CAO + 2947 197 5 -2.4057 -4.057624e+00 -2.284019e+00 1.489189e+01 # CTT + 2948 197 6 0.1480 -5.182991e+00 -4.755363e+00 1.472544e+01 # HAT + 2949 197 6 0.1480 -7.575379e+00 -5.358688e+00 1.497619e+01 # HAT + 2950 197 6 0.1480 -9.257209e+00 -3.595277e+00 1.543688e+01 # HAT + 2951 197 6 0.1480 -8.546651e+00 -1.228542e+00 1.564681e+01 # HAT + 2952 197 6 0.1480 -6.154263e+00 -6.252170e-01 1.539605e+01 # HAT + 2953 197 7 0.0920 -3.574883e+00 -2.985449e+00 1.421141e+01 # HT + 2954 197 7 0.0920 -3.977287e+00 -1.274304e+00 1.448925e+01 # HT + 2955 197 7 0.0920 -3.567713e+00 -2.326756e+00 1.586465e+01 # HT + 2956 198 1 -2.2897 -1.086921e+01 -1.289564e+01 -9.489864e+00 # CAT + 2957 198 2 -2.3557 -1.033218e+01 -1.226149e+01 -1.061656e+01 # CAO + 2958 198 3 -2.3537 -9.084394e+00 -1.163164e+01 -1.053711e+01 # CAM + 2959 198 4 -2.3627 -8.373641e+00 -1.163593e+01 -9.330952e+00 # CAP + 2960 198 3 -2.3537 -8.910675e+00 -1.227008e+01 -8.204252e+00 # CAM + 2961 198 2 -2.3557 -1.015846e+01 -1.289993e+01 -8.283708e+00 # CAO + 2962 198 5 -2.4057 -1.221504e+01 -1.357498e+01 -9.575563e+00 # CTT + 2963 198 6 0.1480 -1.088047e+01 -1.225818e+01 -1.154703e+01 # HAT + 2964 198 6 0.1480 -8.670111e+00 -1.114244e+01 -1.140628e+01 # HAT + 2965 198 6 0.1480 -7.411063e+00 -1.115004e+01 -9.269656e+00 # HAT + 2966 198 6 0.1480 -8.362379e+00 -1.227339e+01 -7.273788e+00 # HAT + 2967 198 6 0.1480 -1.057274e+01 -1.338913e+01 -7.414539e+00 # HAT + 2968 198 7 0.0920 -1.237304e+01 -1.394282e+01 -1.058939e+01 # HT + 2969 198 7 0.0920 -1.224555e+01 -1.441138e+01 -8.877270e+00 # HT + 2970 198 7 0.0920 -1.299940e+01 -1.286184e+01 -9.321986e+00 # HT + 2971 199 1 -2.2897 -3.678911e+00 -1.404636e+01 1.441704e+01 # CAT + 2972 199 2 -2.3557 -3.908525e+00 -1.274929e+01 1.394281e+01 # CAO + 2973 199 3 -2.3537 -5.200093e+00 -1.221011e+01 1.397639e+01 # CAM + 2974 199 4 -2.3627 -6.262047e+00 -1.296798e+01 1.448421e+01 # CAP + 2975 199 3 -2.3537 -6.032434e+00 -1.426505e+01 1.495844e+01 # CAM + 2976 199 2 -2.3557 -4.740866e+00 -1.480424e+01 1.492486e+01 # CAO + 2977 199 5 -2.4057 -2.285863e+00 -1.462791e+01 1.438082e+01 # CTT + 2978 199 6 0.1480 -3.089303e+00 -1.216465e+01 1.355107e+01 # HAT + 2979 199 6 0.1480 -5.377223e+00 -1.120951e+01 1.361056e+01 # HAT + 2980 199 6 0.1480 -7.258400e+00 -1.255204e+01 1.451011e+01 # HAT + 2981 199 6 0.1480 -6.851656e+00 -1.484970e+01 1.535018e+01 # HAT + 2982 199 6 0.1480 -4.563736e+00 -1.580483e+01 1.529069e+01 # HAT + 2983 199 7 0.0920 -1.554187e+00 -1.382625e+01 1.448129e+01 # HT + 2984 199 7 0.0920 -2.165054e+00 -1.533441e+01 1.520203e+01 # HT + 2985 199 7 0.0920 -2.131342e+00 -1.514348e+01 1.343297e+01 # HT + 2986 200 1 -2.2897 -1.063285e+01 8.561015e+00 -8.050563e+00 # CAT + 2987 200 2 -2.3557 -9.532956e+00 7.704269e+00 -8.177930e+00 # CAO + 2988 200 3 -2.3537 -9.726573e+00 6.318431e+00 -8.222262e+00 # CAM + 2989 200 4 -2.3627 -1.102008e+01 5.789339e+00 -8.139227e+00 # CAP + 2990 200 3 -2.3537 -1.211998e+01 6.646085e+00 -8.011861e+00 # CAM + 2991 200 2 -2.3557 -1.192636e+01 8.031922e+00 -7.967528e+00 # CAO + 2992 200 5 -2.4057 -1.042402e+01 1.005574e+01 -8.002748e+00 # CTT + 2993 200 6 0.1480 -8.535106e+00 8.112425e+00 -8.241985e+00 # HAT + 2994 200 6 0.1480 -8.878084e+00 5.657512e+00 -8.320516e+00 # HAT + 2995 200 6 0.1480 -1.116944e+01 4.720263e+00 -8.173426e+00 # HAT + 2996 200 6 0.1480 -1.311782e+01 6.237927e+00 -7.947805e+00 # HAT + 2997 200 6 0.1480 -1.277485e+01 8.692841e+00 -7.869274e+00 # HAT + 2998 200 7 0.0920 -9.537351e+00 1.031790e+01 -8.579978e+00 # HT + 2999 200 7 0.0920 -1.129390e+01 1.055837e+01 -8.425562e+00 # HT + 3000 200 7 0.0920 -1.028985e+01 1.037147e+01 -6.968139e+00 # HT + 3001 201 1 -2.2897 -3.364643e+00 -4.878223e+00 8.756435e+00 # CAT + 3002 201 2 -2.3557 -3.105328e+00 -5.029538e+00 7.389007e+00 # CAO + 3003 201 3 -2.3537 -2.590532e+00 -3.956828e+00 6.651255e+00 # CAM + 3004 201 4 -2.3627 -2.335051e+00 -2.732803e+00 7.280931e+00 # CAP + 3005 201 3 -2.3537 -2.594366e+00 -2.581488e+00 8.648359e+00 # CAM + 3006 201 2 -2.3557 -3.109162e+00 -3.654198e+00 9.386111e+00 # CAO + 3007 201 5 -2.4057 -3.919887e+00 -6.035217e+00 9.552153e+00 # CTT + 3008 201 6 0.1480 -3.302414e+00 -5.973786e+00 6.903257e+00 # HAT + 3009 201 6 0.1480 -2.390489e+00 -4.073556e+00 5.596382e+00 # HAT + 3010 201 6 0.1480 -1.937922e+00 -1.905284e+00 6.711808e+00 # HAT + 3011 201 6 0.1480 -2.397280e+00 -1.637240e+00 9.134109e+00 # HAT + 3012 201 6 0.1480 -3.309204e+00 -3.537469e+00 1.044098e+01 # HAT + 3013 201 7 0.0920 -3.574526e+00 -6.973853e+00 9.118805e+00 # HT + 3014 201 7 0.0920 -3.577339e+00 -5.964472e+00 1.058451e+01 # HT + 3015 201 7 0.0920 -5.009172e+00 -6.003696e+00 9.528355e+00 # HT + 3016 202 1 -2.2897 -6.204205e+00 -1.326058e+01 -1.472969e+01 # CAT + 3017 202 2 -2.3557 -5.991274e+00 -1.209594e+01 -1.398253e+01 # CAO + 3018 202 3 -2.3537 -7.024459e+00 -1.116365e+01 -1.382967e+01 # CAM + 3019 202 4 -2.3627 -8.270574e+00 -1.139600e+01 -1.442399e+01 # CAP + 3020 202 3 -2.3537 -8.483505e+00 -1.256065e+01 -1.517115e+01 # CAM + 3021 202 2 -2.3557 -7.450321e+00 -1.349294e+01 -1.532401e+01 # CAO + 3022 202 5 -2.4057 -5.089842e+00 -1.426613e+01 -1.489456e+01 # CTT + 3023 202 6 0.1480 -5.029985e+00 -1.191669e+01 -1.352406e+01 # HAT + 3024 202 6 0.1480 -6.860198e+00 -1.026520e+01 -1.325329e+01 # HAT + 3025 202 6 0.1480 -9.067603e+00 -1.067681e+01 -1.430607e+01 # HAT + 3026 202 6 0.1480 -9.444795e+00 -1.273990e+01 -1.562962e+01 # HAT + 3027 202 6 0.1480 -7.614582e+00 -1.439138e+01 -1.590039e+01 # HAT + 3028 202 7 0.0920 -4.442863e+00 -1.423927e+01 -1.401775e+01 # HT + 3029 202 7 0.0920 -5.513677e+00 -1.526455e+01 -1.500228e+01 # HT + 3030 202 7 0.0920 -4.507433e+00 -1.402143e+01 -1.578283e+01 # HT + 3031 203 1 -2.2897 1.034287e+01 1.302354e+01 -3.944776e+00 # CAT + 3032 203 2 -2.3557 9.343867e+00 1.357643e+01 -4.754899e+00 # CAO + 3033 203 3 -2.3537 9.640272e+00 1.465964e+01 -5.590836e+00 # CAM + 3034 203 4 -2.3627 1.093568e+01 1.518997e+01 -5.616649e+00 # CAP + 3035 203 3 -2.3537 1.193469e+01 1.463708e+01 -4.806526e+00 # CAM + 3036 203 2 -2.3557 1.163828e+01 1.355387e+01 -3.970589e+00 # CAO + 3037 203 5 -2.4057 1.002318e+01 1.185522e+01 -3.043158e+00 # CTT + 3038 203 6 0.1480 8.344550e+00 1.316732e+01 -4.734986e+00 # HAT + 3039 203 6 0.1480 8.869611e+00 1.508616e+01 -6.215789e+00 # HAT + 3040 203 6 0.1480 1.116434e+01 1.602559e+01 -6.261515e+00 # HAT + 3041 203 6 0.1480 1.293401e+01 1.504619e+01 -4.826439e+00 # HAT + 3042 203 6 0.1480 1.240895e+01 1.312735e+01 -3.345637e+00 # HAT + 3043 203 7 0.0920 9.229905e+00 1.125655e+01 -3.490834e+00 # HT + 3044 203 7 0.0920 1.091381e+01 1.123999e+01 -2.915217e+00 # HT + 3045 203 7 0.0920 9.694721e+00 1.222456e+01 -2.071663e+00 # HT + 3046 204 1 -2.2897 -2.744967e+00 1.345101e+00 -6.350607e+00 # CAT + 3047 204 2 -2.3557 -1.400370e+00 9.885780e-01 -6.192646e+00 # CAO + 3048 204 3 -2.3537 -9.972000e-01 2.585550e-01 -5.068137e+00 # CAM + 3049 204 4 -2.3627 -1.938625e+00 -1.149460e-01 -4.101590e+00 # CAP + 3050 204 3 -2.3537 -3.283222e+00 2.415770e-01 -4.259550e+00 # CAM + 3051 204 2 -2.3557 -3.686393e+00 9.716000e-01 -5.384058e+00 # CAO + 3052 204 5 -2.4057 -3.179815e+00 2.132483e+00 -7.563469e+00 # CTT + 3053 204 6 0.1480 -6.741270e-01 1.276707e+00 -6.938268e+00 # HAT + 3054 204 6 0.1480 4.006100e-02 -1.647700e-02 -4.946282e+00 # HAT + 3055 204 6 0.1480 -1.627608e+00 -6.781070e-01 -3.234111e+00 # HAT + 3056 204 6 0.1480 -4.009465e+00 -4.655200e-02 -3.513927e+00 # HAT + 3057 204 6 0.1480 -4.723653e+00 1.246632e+00 -5.505914e+00 # HAT + 3058 204 7 0.0920 -2.532164e+00 1.890089e+00 -8.406021e+00 # HT + 3059 204 7 0.0920 -4.209907e+00 1.877629e+00 -7.812588e+00 # HT + 3060 204 7 0.0920 -3.111718e+00 3.198913e+00 -7.348553e+00 # HT + 3061 205 1 -2.2897 4.540297e+00 -3.988752e+00 1.300658e+00 # CAT + 3062 205 2 -2.3557 3.827865e+00 -5.176111e+00 1.507103e+00 # CAO + 3063 205 3 -2.3537 4.106183e+00 -6.304247e+00 7.261740e-01 # CAM + 3064 205 4 -2.3627 5.096933e+00 -6.245023e+00 -2.611990e-01 # CAP + 3065 205 3 -2.3537 5.809365e+00 -5.057665e+00 -4.676440e-01 # CAM + 3066 205 2 -2.3557 5.531048e+00 -3.929529e+00 3.132840e-01 # CAO + 3067 205 5 -2.4057 4.240111e+00 -2.771978e+00 2.142945e+00 # CTT + 3068 205 6 0.1480 3.063572e+00 -5.221797e+00 2.268791e+00 # HAT + 3069 205 6 0.1480 3.556592e+00 -7.220209e+00 8.854320e-01 # HAT + 3070 205 6 0.1480 5.311636e+00 -7.115300e+00 -8.636300e-01 # HAT + 3071 205 6 0.1480 6.573659e+00 -5.011979e+00 -1.229332e+00 # HAT + 3072 205 6 0.1480 6.080638e+00 -3.013567e+00 1.540270e-01 # HAT + 3073 205 7 0.0920 3.893913e+00 -3.087223e+00 3.127256e+00 # HT + 3074 205 7 0.0920 5.143902e+00 -2.172340e+00 2.251096e+00 # HT + 3075 205 7 0.0920 3.465521e+00 -2.176788e+00 1.659356e+00 # HT + 3076 206 1 -2.2897 1.255695e+01 2.235945e+00 4.897591e+00 # CAT + 3077 206 2 -2.3557 1.304331e+01 9.618420e-01 4.581186e+00 # CAO + 3078 206 3 -2.3537 1.425329e+01 5.186480e-01 5.128477e+00 # CAM + 3079 206 4 -2.3627 1.497691e+01 1.349557e+00 5.992172e+00 # CAP + 3080 206 3 -2.3537 1.449054e+01 2.623660e+00 6.308577e+00 # CAM + 3081 206 2 -2.3557 1.328056e+01 3.066854e+00 5.761287e+00 # CAO + 3082 206 5 -2.4057 1.125190e+01 2.713962e+00 4.307299e+00 # CTT + 3083 206 6 0.1480 1.248509e+01 3.208560e-01 3.914907e+00 # HAT + 3084 206 6 0.1480 1.462849e+01 -4.642310e-01 4.884394e+00 # HAT + 3085 206 6 0.1480 1.591032e+01 1.007665e+00 6.414368e+00 # HAT + 3086 206 6 0.1480 1.504876e+01 3.264647e+00 6.974857e+00 # HAT + 3087 206 6 0.1480 1.290537e+01 4.049734e+00 6.005370e+00 # HAT + 3088 206 7 0.0920 1.059688e+01 1.860261e+00 4.133371e+00 # HT + 3089 206 7 0.0920 1.077101e+01 3.405158e+00 4.999462e+00 # HT + 3090 206 7 0.0920 1.144441e+01 3.222014e+00 3.362354e+00 # HT + 3091 207 1 -2.2897 -1.498549e+01 8.233727e+00 5.715321e+00 # CAT + 3092 207 2 -2.3557 -1.499714e+01 7.430636e+00 4.568626e+00 # CAO + 3093 207 3 -2.3537 -1.513734e+01 6.042748e+00 4.687433e+00 # CAM + 3094 207 4 -2.3627 -1.526588e+01 5.457954e+00 5.952933e+00 # CAP + 3095 207 3 -2.3537 -1.525423e+01 6.261046e+00 7.099627e+00 # CAM + 3096 207 2 -2.3557 -1.511403e+01 7.648932e+00 6.980821e+00 # CAO + 3097 207 5 -2.4057 -1.483427e+01 9.730662e+00 5.587180e+00 # CTT + 3098 207 6 0.1480 -1.489798e+01 7.881763e+00 3.592383e+00 # HAT + 3099 207 6 0.1480 -1.514633e+01 5.423221e+00 3.802840e+00 # HAT + 3100 207 6 0.1480 -1.537403e+01 4.387298e+00 6.044584e+00 # HAT + 3101 207 6 0.1480 -1.535339e+01 5.809917e+00 8.075871e+00 # HAT + 3102 207 6 0.1480 -1.510504e+01 8.268460e+00 7.865414e+00 # HAT + 3103 207 7 0.0920 -1.526550e+01 1.006033e+01 4.641950e+00 # HT + 3104 207 7 0.0920 -1.535129e+01 1.022054e+01 6.412293e+00 # HT + 3105 207 7 0.0920 -1.377673e+01 9.993212e+00 5.614664e+00 # HT + 3106 208 1 -2.2897 -9.936892e+00 -3.099620e-01 2.660255e+00 # CAT + 3107 208 2 -2.3557 -1.131494e+01 -5.310740e-01 2.770235e+00 # CAO + 3108 208 3 -2.3537 -1.179012e+01 -1.701989e+00 3.372865e+00 # CAM + 3109 208 4 -2.3627 -1.088725e+01 -2.651792e+00 3.865514e+00 # CAP + 3110 208 3 -2.3537 -9.509204e+00 -2.430680e+00 3.755534e+00 # CAM + 3111 208 2 -2.3557 -9.034024e+00 -1.259765e+00 3.152905e+00 # CAO + 3112 208 5 -2.4057 -9.424378e+00 9.529530e-01 2.010276e+00 # CTT + 3113 208 6 0.1480 -1.201144e+01 2.016310e-01 2.390191e+00 # HAT + 3114 208 6 0.1480 -1.285318e+01 -1.872561e+00 3.457707e+00 # HAT + 3115 208 6 0.1480 -1.125382e+01 -3.555070e+00 4.330401e+00 # HAT + 3116 208 6 0.1480 -8.812705e+00 -3.163386e+00 4.135578e+00 # HAT + 3117 208 6 0.1480 -7.970959e+00 -1.089193e+00 3.068063e+00 # HAT + 3118 208 7 0.0920 -1.013923e+01 1.760193e+00 2.169800e+00 # HT + 3119 208 7 0.0920 -8.465238e+00 1.225396e+00 2.450647e+00 # HT + 3120 208 7 0.0920 -9.298175e+00 7.862090e-01 9.405240e-01 # HT + 3121 209 1 -2.2897 -1.128588e+01 1.082310e+01 -7.797800e-01 # CAT + 3122 209 2 -2.3557 -1.018425e+01 1.033878e+01 -6.435400e-02 # CAO + 3123 209 3 -2.3537 -9.865241e+00 8.976310e+00 -1.080970e-01 # CAM + 3124 209 4 -2.3627 -1.064787e+01 8.098158e+00 -8.672670e-01 # CAP + 3125 209 3 -2.3537 -1.174951e+01 8.582475e+00 -1.582693e+00 # CAM + 3126 209 2 -2.3557 -1.206851e+01 9.944944e+00 -1.538950e+00 # CAO + 3127 209 5 -2.4057 -1.162995e+01 1.229262e+01 -7.326000e-01 # CTT + 3128 209 6 0.1480 -9.580504e+00 1.101621e+01 5.212910e-01 # HAT + 3129 209 6 0.1480 -9.015408e+00 8.602694e+00 4.438030e-01 # HAT + 3130 209 6 0.1480 -1.040178e+01 7.047110e+00 -9.010120e-01 # HAT + 3131 209 6 0.1480 -1.235325e+01 7.905043e+00 -2.168339e+00 # HAT + 3132 209 6 0.1480 -1.291835e+01 1.031856e+01 -2.090851e+00 # HAT + 3133 209 7 0.0920 -1.071999e+01 1.287489e+01 -5.876350e-01 # HT + 3134 209 7 0.0920 -1.210287e+01 1.258585e+01 -1.669861e+00 # HT + 3135 209 7 0.0920 -1.231572e+01 1.247939e+01 9.380100e-02 # HT + 3136 210 1 -2.2897 1.301040e+01 2.812060e+00 9.018224e+00 # CAT + 3137 210 2 -2.3557 1.250388e+01 1.946096e+00 8.041730e+00 # CAO + 3138 210 3 -2.3537 1.129930e+01 2.247944e+00 7.395293e+00 # CAM + 3139 210 4 -2.3627 1.060124e+01 3.415756e+00 7.725349e+00 # CAP + 3140 210 3 -2.3537 1.110777e+01 4.281720e+00 8.701843e+00 # CAM + 3141 210 2 -2.3557 1.231235e+01 3.979872e+00 9.348280e+00 # CAO + 3142 210 5 -2.4057 1.430962e+01 2.486495e+00 9.715452e+00 # CTT + 3143 210 6 0.1480 1.304237e+01 1.045213e+00 7.787115e+00 # HAT + 3144 210 6 0.1480 1.090855e+01 1.579915e+00 6.641997e+00 # HAT + 3145 210 6 0.1480 9.671998e+00 3.648610e+00 7.226669e+00 # HAT + 3146 210 6 0.1480 1.056927e+01 5.182603e+00 8.956458e+00 # HAT + 3147 210 6 0.1480 1.270309e+01 4.647901e+00 1.010158e+01 # HAT + 3148 210 7 0.0920 1.495160e+01 1.918646e+00 9.042022e+00 # HT + 3149 210 7 0.0920 1.481104e+01 3.411262e+00 1.000092e+01 # HT + 3150 210 7 0.0920 1.410541e+01 1.894235e+00 1.060743e+01 # HT + 3151 211 1 -2.2897 9.281277e+00 6.265614e+00 -2.826980e+00 # CAT + 3152 211 2 -2.3557 9.830021e+00 7.297883e+00 -2.056720e+00 # CAO + 3153 211 3 -2.3537 1.121024e+01 7.531180e+00 -2.080367e+00 # CAM + 3154 211 4 -2.3627 1.204172e+01 6.732208e+00 -2.874274e+00 # CAP + 3155 211 3 -2.3537 1.149298e+01 5.699939e+00 -3.644534e+00 # CAM + 3156 211 2 -2.3557 1.011275e+01 5.466641e+00 -3.620886e+00 # CAO + 3157 211 5 -2.4057 7.792609e+00 6.013986e+00 -2.801474e+00 # CTT + 3158 211 6 0.1480 9.188595e+00 7.914233e+00 -1.444278e+00 # HAT + 3159 211 6 0.1480 1.163356e+01 8.327502e+00 -1.486167e+00 # HAT + 3160 211 6 0.1480 1.310646e+01 6.912180e+00 -2.892516e+00 # HAT + 3161 211 6 0.1480 1.213440e+01 5.083589e+00 -4.256976e+00 # HAT + 3162 211 6 0.1480 9.689438e+00 4.670319e+00 -4.215087e+00 # HAT + 3163 211 7 0.0920 7.268372e+00 6.951036e+00 -2.613820e+00 # HT + 3164 211 7 0.0920 7.475874e+00 5.607063e+00 -3.761783e+00 # HT + 3165 211 7 0.0920 7.557451e+00 5.301963e+00 -2.010384e+00 # HT + 3166 212 1 -2.2897 -4.721170e-01 -5.109767e+00 9.475459e+00 # CAT + 3167 212 2 -2.3557 -1.063280e-01 -3.903542e+00 8.866181e+00 # CAO + 3168 212 3 -2.3537 -2.049970e-01 -2.701819e+00 9.577607e+00 # CAM + 3169 212 4 -2.3627 -6.694560e-01 -2.706321e+00 1.089831e+01 # CAP + 3170 212 3 -2.3537 -1.035245e+00 -3.912546e+00 1.150759e+01 # CAM + 3171 212 2 -2.3557 -9.365750e-01 -5.114269e+00 1.079616e+01 # CAO + 3172 212 5 -2.4057 -3.656950e-01 -6.405911e+00 8.708136e+00 # CTT + 3173 212 6 0.1480 2.519690e-01 -3.900068e+00 7.847353e+00 # HAT + 3174 212 6 0.1480 7.718300e-02 -1.771302e+00 9.107593e+00 # HAT + 3175 212 6 0.1480 -7.455720e-01 -1.779278e+00 1.144712e+01 # HAT + 3176 212 6 0.1480 -1.393541e+00 -3.916019e+00 1.252642e+01 # HAT + 3177 212 6 0.1480 -1.218755e+00 -6.044785e+00 1.126618e+01 # HAT + 3178 212 7 0.0920 4.459430e-01 -6.334511e+00 7.984086e+00 # HT + 3179 212 7 0.0920 -1.633870e-01 -7.223081e+00 9.400526e+00 # HT + 3180 212 7 0.0920 -1.302708e+00 -6.597096e+00 8.185112e+00 # HT + 3181 213 1 -2.2897 2.686429e+00 -9.732333e+00 7.577507e+00 # CAT + 3182 213 2 -2.3557 3.221801e+00 -1.090485e+01 8.123937e+00 # CAO + 3183 213 3 -2.3537 4.195198e+00 -1.082862e+01 9.127275e+00 # CAM + 3184 213 4 -2.3627 4.633223e+00 -9.579871e+00 9.584183e+00 # CAP + 3185 213 3 -2.3537 4.097851e+00 -8.407355e+00 9.037754e+00 # CAM + 3186 213 2 -2.3557 3.124455e+00 -8.483587e+00 8.034416e+00 # CAO + 3187 213 5 -2.4057 1.636551e+00 -9.814554e+00 6.495336e+00 # CTT + 3188 213 6 0.1480 2.883895e+00 -1.186817e+01 7.771465e+00 # HAT + 3189 213 6 0.1480 4.608199e+00 -1.173313e+01 9.548806e+00 # HAT + 3190 213 6 0.1480 5.384129e+00 -9.521063e+00 1.035819e+01 # HAT + 3191 213 6 0.1480 4.435757e+00 -7.444036e+00 9.390226e+00 # HAT + 3192 213 6 0.1480 2.711454e+00 -7.579075e+00 7.612885e+00 # HAT + 3193 213 7 0.0920 1.050628e+00 -1.072446e+01 6.625212e+00 # HT + 3194 213 7 0.0920 9.791840e-01 -8.947462e+00 6.559511e+00 # HT + 3195 213 7 0.0920 2.120906e+00 -9.831179e+00 5.519004e+00 # HT + 3196 214 1 -2.2897 3.165577e+00 -1.495072e+01 -1.389433e+00 # CAT + 3197 214 2 -2.3557 4.360512e+00 -1.492252e+01 -2.118359e+00 # CAO + 3198 214 3 -2.3537 5.588826e+00 -1.501285e+01 -1.452711e+00 # CAM + 3199 214 4 -2.3627 5.622203e+00 -1.513138e+01 -5.813800e-02 # CAP + 3200 214 3 -2.3537 4.427267e+00 -1.515958e+01 6.707890e-01 # CAM + 3201 214 2 -2.3557 3.198954e+00 -1.506925e+01 5.142000e-03 # CAO + 3202 214 5 -2.4057 1.840753e+00 -1.485328e+01 -2.107381e+00 # CTT + 3203 214 6 0.1480 4.334764e+00 -1.483108e+01 -3.194173e+00 # HAT + 3204 214 6 0.1480 6.510633e+00 -1.499110e+01 -2.015026e+00 # HAT + 3205 214 6 0.1480 6.569759e+00 -1.520107e+01 4.553620e-01 # HAT + 3206 214 6 0.1480 4.453016e+00 -1.525102e+01 1.746603e+00 # HAT + 3207 214 6 0.1480 2.277147e+00 -1.509100e+01 5.674560e-01 # HAT + 3208 214 7 0.0920 1.933517e+00 -1.528769e+01 -3.102764e+00 # HT + 3209 214 7 0.0920 1.081033e+00 -1.539537e+01 -1.544298e+00 # HT + 3210 214 7 0.0920 1.550020e+00 -1.380635e+01 -2.194072e+00 # HT + 3211 215 1 -2.2897 8.304900e+00 -1.400075e+01 -1.118018e+01 # CAT + 3212 215 2 -2.3557 9.076243e+00 -1.308215e+01 -1.190213e+01 # CAO + 3213 215 3 -2.3537 1.044605e+01 -1.295965e+01 -1.164017e+01 # CAM + 3214 215 4 -2.3627 1.104451e+01 -1.375574e+01 -1.065626e+01 # CAP + 3215 215 3 -2.3537 1.027317e+01 -1.467434e+01 -9.934312e+00 # CAM + 3216 215 2 -2.3557 8.903363e+00 -1.479684e+01 -1.019628e+01 # CAO + 3217 215 5 -2.4057 6.827467e+00 -1.413288e+01 -1.146273e+01 # CTT + 3218 215 6 0.1480 8.614573e+00 -1.246802e+01 -1.266114e+01 # HAT + 3219 215 6 0.1480 1.104109e+01 -1.225101e+01 -1.219709e+01 # HAT + 3220 215 6 0.1480 1.210122e+01 -1.366123e+01 -1.045417e+01 # HAT + 3221 215 6 0.1480 1.073484e+01 -1.528847e+01 -9.175297e+00 # HAT + 3222 215 6 0.1480 8.308326e+00 -1.550548e+01 -9.639347e+00 # HAT + 3223 215 7 0.0920 6.634505e+00 -1.389597e+01 -1.250903e+01 # HT + 3224 215 7 0.0920 6.507625e+00 -1.515440e+01 -1.125708e+01 # HT + 3225 215 7 0.0920 6.272264e+00 -1.344379e+01 -1.082634e+01 # HT + 3226 216 1 -2.2897 -1.032770e+01 8.121681e+00 3.445124e+00 # CAT + 3227 216 2 -2.3557 -9.530305e+00 8.376676e+00 4.567240e+00 # CAO + 3228 216 3 -2.3537 -8.292679e+00 7.737217e+00 4.706429e+00 # CAM + 3229 216 4 -2.3627 -7.852444e+00 6.842764e+00 3.723501e+00 # CAP + 3230 216 3 -2.3537 -8.649835e+00 6.587769e+00 2.601385e+00 # CAM + 3231 216 2 -2.3557 -9.887461e+00 7.227227e+00 2.462196e+00 # CAO + 3232 216 5 -2.4057 -1.166257e+01 8.811382e+00 3.294999e+00 # CTT + 3233 216 6 0.1480 -9.869915e+00 9.066682e+00 5.325498e+00 # HAT + 3234 216 6 0.1480 -7.677548e+00 7.933927e+00 5.572061e+00 # HAT + 3235 216 6 0.1480 -6.897703e+00 6.349467e+00 3.830875e+00 # HAT + 3236 216 6 0.1480 -8.310225e+00 5.897762e+00 1.843127e+00 # HAT + 3237 216 6 0.1480 -1.050259e+01 7.030517e+00 1.596564e+00 # HAT + 3238 216 7 0.0920 -1.162524e+01 9.786103e+00 3.781443e+00 # HT + 3239 216 7 0.0920 -1.188736e+01 8.942508e+00 2.236522e+00 # HT + 3240 216 7 0.0920 -1.244005e+01 8.204109e+00 3.758510e+00 # HT + 3241 217 1 -2.2897 -1.002253e+01 4.173486e+00 8.199715e+00 # CAT + 3242 217 2 -2.3557 -1.127824e+01 3.901538e+00 7.643638e+00 # CAO + 3243 217 3 -2.3537 -1.233910e+01 4.793599e+00 7.840629e+00 # CAM + 3244 217 4 -2.3627 -1.214424e+01 5.957608e+00 8.593698e+00 # CAP + 3245 217 3 -2.3537 -1.088853e+01 6.229556e+00 9.149776e+00 # CAM + 3246 217 2 -2.3557 -9.827670e+00 5.337496e+00 8.952784e+00 # CAO + 3247 217 5 -2.4057 -8.878315e+00 3.211335e+00 7.987245e+00 # CTT + 3248 217 6 0.1480 -1.142856e+01 3.003588e+00 7.062699e+00 # HAT + 3249 217 6 0.1480 -1.330780e+01 4.583810e+00 7.411656e+00 # HAT + 3250 217 6 0.1480 -1.296262e+01 6.645770e+00 8.745664e+00 # HAT + 3251 217 6 0.1480 -1.073821e+01 7.127507e+00 9.730715e+00 # HAT + 3252 217 6 0.1480 -8.858975e+00 5.547285e+00 9.381758e+00 # HAT + 3253 217 7 0.0920 -9.000981e+00 2.705974e+00 7.029297e+00 # HT + 3254 217 7 0.0920 -7.936385e+00 3.759843e+00 7.990098e+00 # HT + 3255 217 7 0.0920 -8.870450e+00 2.472668e+00 8.788750e+00 # HT + 3256 218 1 -2.2897 -1.848644e+00 1.429582e+01 -8.960886e+00 # CAT + 3257 218 2 -2.3557 -2.568974e+00 1.311960e+01 -9.200977e+00 # CAO + 3258 218 3 -2.3537 -2.764197e+00 1.267394e+01 -1.051371e+01 # CAM + 3259 218 4 -2.3627 -2.239089e+00 1.340449e+01 -1.158635e+01 # CAP + 3260 218 3 -2.3537 -1.518759e+00 1.458070e+01 -1.134626e+01 # CAM + 3261 218 2 -2.3557 -1.323536e+00 1.502637e+01 -1.003353e+01 # CAO + 3262 218 5 -2.4057 -1.638083e+00 1.477650e+01 -7.545009e+00 # CTT + 3263 218 6 0.1480 -2.974057e+00 1.255604e+01 -8.373510e+00 # HAT + 3264 218 6 0.1480 -3.319880e+00 1.176657e+01 -1.069892e+01 # HAT + 3265 218 6 0.1480 -2.389689e+00 1.306069e+01 -1.259903e+01 # HAT + 3266 218 6 0.1480 -1.113676e+00 1.514427e+01 -1.217373e+01 # HAT + 3267 218 6 0.1480 -7.678530e-01 1.593373e+01 -9.848315e+00 # HAT + 3268 218 7 0.0920 -1.609427e+00 1.392062e+01 -6.870664e+00 # HT + 3269 218 7 0.0920 -6.953830e-01 1.532002e+01 -7.481685e+00 # HT + 3270 218 7 0.0920 -2.457227e+00 1.543635e+01 -7.259168e+00 # HT + 3271 219 1 -2.2897 -5.251021e+00 2.389609e+00 -1.119055e+01 # CAT + 3272 219 2 -2.3557 -6.056942e+00 2.536566e+00 -1.232584e+01 # CAO + 3273 219 3 -2.3537 -6.203449e+00 3.794699e+00 -1.292220e+01 # CAM + 3274 219 4 -2.3627 -5.544037e+00 4.905876e+00 -1.238325e+01 # CAP + 3275 219 3 -2.3537 -4.738116e+00 4.758920e+00 -1.124796e+01 # CAM + 3276 219 2 -2.3557 -4.591608e+00 3.500787e+00 -1.065160e+01 # CAO + 3277 219 5 -2.4057 -5.093002e+00 1.032623e+00 -1.054734e+01 # CTT + 3278 219 6 0.1480 -6.565632e+00 1.679372e+00 -1.274160e+01 # HAT + 3279 219 6 0.1480 -6.825160e+00 3.908066e+00 -1.379799e+01 # HAT + 3280 219 6 0.1480 -5.657057e+00 5.876437e+00 -1.284329e+01 # HAT + 3281 219 6 0.1480 -4.229426e+00 5.616114e+00 -1.083220e+01 # HAT + 3282 219 6 0.1480 -3.969898e+00 3.387421e+00 -9.775804e+00 # HAT + 3283 219 7 0.0920 -5.186858e+00 2.566940e-01 -1.130709e+01 # HT + 3284 219 7 0.0920 -4.111429e+00 9.643490e-01 -1.007835e+01 # HT + 3285 219 7 0.0920 -5.866490e+00 8.958860e-01 -9.791614e+00 # HT + 3286 220 1 -2.2897 -2.368165e+00 1.502559e+01 8.934386e+00 # CAT + 3287 220 2 -2.3557 -3.766193e+00 1.509228e+01 8.967111e+00 # CAO + 3288 220 3 -2.3537 -4.430353e+00 1.526555e+01 1.018730e+01 # CAM + 3289 220 4 -2.3627 -3.696486e+00 1.537211e+01 1.137477e+01 # CAP + 3290 220 3 -2.3537 -2.298458e+00 1.530542e+01 1.134205e+01 # CAM + 3291 220 2 -2.3557 -1.634298e+00 1.513215e+01 1.012186e+01 # CAO + 3292 220 5 -2.4057 -1.651821e+00 1.483871e+01 7.618321e+00 # CTT + 3293 220 6 0.1480 -4.332319e+00 1.501008e+01 8.051064e+00 # HAT + 3294 220 6 0.1480 -5.508831e+00 1.531700e+01 1.021255e+01 # HAT + 3295 220 6 0.1480 -4.208838e+00 1.550577e+01 1.231607e+01 # HAT + 3296 220 6 0.1480 -1.732332e+00 1.538763e+01 1.225810e+01 # HAT + 3297 220 6 0.1480 -5.558200e-01 1.508070e+01 1.009661e+01 # HAT + 3298 220 7 0.0920 -2.238610e+00 1.528877e+01 6.817555e+00 # HT + 3299 220 7 0.0920 -6.739830e-01 1.531803e+01 7.665037e+00 # HT + 3300 220 7 0.0920 -1.525041e+00 1.377424e+01 7.421013e+00 # HT + 3301 221 1 -2.2897 -9.343050e+00 1.213794e+01 -3.331035e+00 # CAT + 3302 221 2 -2.3557 -8.863913e+00 1.284139e+01 -2.219463e+00 # CAO + 3303 221 3 -2.3537 -8.176929e+00 1.216377e+01 -1.205124e+00 # CAM + 3304 221 4 -2.3627 -7.969083e+00 1.078270e+01 -1.302358e+00 # CAP + 3305 221 3 -2.3537 -8.448220e+00 1.007925e+01 -2.413929e+00 # CAM + 3306 221 2 -2.3557 -9.135204e+00 1.075687e+01 -3.428268e+00 # CAO + 3307 221 5 -2.4057 -1.008401e+01 1.286880e+01 -4.425072e+00 # CTT + 3308 221 6 0.1480 -9.024251e+00 1.390678e+01 -2.144455e+00 # HAT + 3309 221 6 0.1480 -7.807309e+00 1.270642e+01 -3.476260e-01 # HAT + 3310 221 6 0.1480 -7.439124e+00 1.025996e+01 -5.198680e-01 # HAT + 3311 221 6 0.1480 -8.287882e+00 9.013859e+00 -2.488937e+00 # HAT + 3312 221 6 0.1480 -9.504824e+00 1.021422e+01 -4.285766e+00 # HAT + 3313 221 7 0.0920 -9.719070e+00 1.389387e+01 -4.489640e+00 # HT + 3314 221 7 0.0920 -9.918175e+00 1.236401e+01 -5.376799e+00 # HT + 3315 221 7 0.0920 -1.115041e+01 1.287686e+01 -4.199634e+00 # HT + 3316 222 1 -2.2897 -6.493769e+00 -9.969038e+00 1.173161e+01 # CAT + 3317 222 2 -2.3557 -7.283025e+00 -8.949753e+00 1.227763e+01 # CAO + 3318 222 3 -2.3537 -6.691773e+00 -7.746524e+00 1.268094e+01 # CAM + 3319 222 4 -2.3627 -5.311265e+00 -7.562582e+00 1.253824e+01 # CAP + 3320 222 3 -2.3537 -4.522009e+00 -8.581868e+00 1.199223e+01 # CAM + 3321 222 2 -2.3557 -5.113260e+00 -9.785096e+00 1.158891e+01 # CAO + 3322 222 5 -2.4057 -7.131476e+00 -1.126681e+01 1.129661e+01 # CTT + 3323 222 6 0.1480 -8.347988e+00 -9.091651e+00 1.238771e+01 # HAT + 3324 222 6 0.1480 -7.300628e+00 -6.960218e+00 1.310215e+01 # HAT + 3325 222 6 0.1480 -4.855156e+00 -6.634377e+00 1.284937e+01 # HAT + 3326 222 6 0.1480 -3.457045e+00 -8.439969e+00 1.188215e+01 # HAT + 3327 222 6 0.1480 -4.504406e+00 -1.057140e+01 1.116770e+01 # HAT + 3328 222 7 0.0920 -8.155768e+00 -1.107893e+01 1.097469e+01 # HT + 3329 222 7 0.0920 -6.563349e+00 -1.169200e+01 1.046924e+01 # HT + 3330 222 7 0.0920 -7.136298e+00 -1.196762e+01 1.213144e+01 # HT + 3331 223 1 -2.2897 8.421867e+00 8.921465e+00 -1.032221e+01 # CAT + 3332 223 2 -2.3557 7.686991e+00 1.009309e+01 -1.010481e+01 # CAO + 3333 223 3 -2.3537 8.246241e+00 1.133813e+01 -1.041641e+01 # CAM + 3334 223 4 -2.3627 9.540366e+00 1.141156e+01 -1.094542e+01 # CAP + 3335 223 3 -2.3537 1.027524e+01 1.023994e+01 -1.116282e+01 # CAM + 3336 223 2 -2.3557 9.715992e+00 8.994892e+00 -1.085122e+01 # CAO + 3337 223 5 -2.4057 7.818677e+00 7.578593e+00 -9.986123e+00 # CTT + 3338 223 6 0.1480 6.688666e+00 1.003644e+01 -9.696717e+00 # HAT + 3339 223 6 0.1480 7.679337e+00 1.224195e+01 -1.024870e+01 # HAT + 3340 223 6 0.1480 9.971787e+00 1.237203e+01 -1.118580e+01 # HAT + 3341 223 6 0.1480 1.127357e+01 1.029658e+01 -1.157091e+01 # HAT + 3342 223 6 0.1480 1.028290e+01 8.091071e+00 -1.101893e+01 # HAT + 3343 223 7 0.0920 6.736356e+00 7.625495e+00 -1.010647e+01 # HT + 3344 223 7 0.0920 8.225468e+00 6.819516e+00 -1.065427e+01 # HT + 3345 223 7 0.0920 8.058171e+00 7.320030e+00 -8.954674e+00 # HT + 3346 224 1 -2.2897 2.974821e+00 -5.402190e+00 1.377239e+01 # CAT + 3347 224 2 -2.3557 3.168572e+00 -6.686142e+00 1.324901e+01 # CAO + 3348 224 3 -2.3537 4.120605e+00 -6.896176e+00 1.224426e+01 # CAM + 3349 224 4 -2.3627 4.878885e+00 -5.822260e+00 1.176289e+01 # CAP + 3350 224 3 -2.3537 4.685134e+00 -4.538309e+00 1.228627e+01 # CAM + 3351 224 2 -2.3557 3.733102e+00 -4.328274e+00 1.329102e+01 # CAO + 3352 224 5 -2.4057 1.947986e+00 -5.175653e+00 1.485608e+01 # CTT + 3353 224 6 0.1480 2.583613e+00 -7.514592e+00 1.362035e+01 # HAT + 3354 224 6 0.1480 4.270070e+00 -7.886653e+00 1.184051e+01 # HAT + 3355 224 6 0.1480 5.613310e+00 -5.984287e+00 1.098780e+01 # HAT + 3356 224 6 0.1480 5.270094e+00 -3.709858e+00 1.191493e+01 # HAT + 3357 224 6 0.1480 3.583637e+00 -3.337797e+00 1.369477e+01 # HAT + 3358 224 7 0.0920 1.850579e+00 -6.078192e+00 1.545944e+01 # HT + 3359 224 7 0.0920 2.264894e+00 -4.347721e+00 1.549027e+01 # HT + 3360 224 7 0.0920 9.862080e-01 -4.937287e+00 1.440192e+01 # HT + 3361 225 1 -2.2897 1.995570e+00 1.229734e+01 3.214788e+00 # CAT + 3362 225 2 -2.3557 2.071363e+00 1.274202e+01 4.540122e+00 # CAO + 3363 225 3 -2.3537 9.263350e-01 1.322939e+01 5.181515e+00 # CAM + 3364 225 4 -2.3627 -2.944860e-01 1.327207e+01 4.497575e+00 # CAP + 3365 225 3 -2.3537 -3.702790e-01 1.282738e+01 3.172241e+00 # CAM + 3366 225 2 -2.3557 7.747480e-01 1.234002e+01 2.530847e+00 # CAO + 3367 225 5 -2.4057 3.230563e+00 1.177168e+01 2.522999e+00 # CTT + 3368 225 6 0.1480 3.013138e+00 1.270909e+01 5.067733e+00 # HAT + 3369 225 6 0.1480 9.848040e-01 1.357243e+01 6.203916e+00 # HAT + 3370 225 6 0.1480 -1.177793e+00 1.364804e+01 4.992364e+00 # HAT + 3371 225 6 0.1480 -1.312055e+00 1.286031e+01 2.644629e+00 # HAT + 3372 225 6 0.1480 7.162790e-01 1.199698e+01 1.508446e+00 # HAT + 3373 225 7 0.0920 3.894778e+00 1.131852e+01 3.258911e+00 # HT + 3374 225 7 0.0920 2.943175e+00 1.102348e+01 1.784276e+00 # HT + 3375 225 7 0.0920 3.746490e+00 1.259304e+01 2.025730e+00 # HT + 3376 226 1 -2.2897 -1.378433e+01 -3.335146e+00 1.409496e+01 # CAT + 3377 226 2 -2.3557 -1.469299e+01 -2.486551e+00 1.345135e+01 # CAO + 3378 226 3 -2.3537 -1.422495e+01 -1.437313e+00 1.265132e+01 # CAM + 3379 226 4 -2.3627 -1.284826e+01 -1.236671e+00 1.249490e+01 # CAP + 3380 226 3 -2.3537 -1.193961e+01 -2.085266e+00 1.313851e+01 # CAM + 3381 226 2 -2.3557 -1.240764e+01 -3.134503e+00 1.393854e+01 # CAO + 3382 226 5 -2.4057 -1.428914e+01 -4.466824e+00 1.495784e+01 # CTT + 3383 226 6 0.1480 -1.575500e+01 -2.641332e+00 1.357202e+01 # HAT + 3384 226 6 0.1480 -1.492591e+01 -7.826820e-01 1.215483e+01 # HAT + 3385 226 6 0.1480 -1.248721e+01 -4.272580e-01 1.187774e+01 # HAT + 3386 226 6 0.1480 -1.087759e+01 -1.930484e+00 1.301784e+01 # HAT + 3387 226 6 0.1480 -1.170668e+01 -3.789134e+00 1.443503e+01 # HAT + 3388 226 7 0.0920 -1.525049e+01 -4.812932e+00 1.457822e+01 # HT + 3389 226 7 0.0920 -1.357324e+01 -5.288474e+00 1.493578e+01 # HT + 3390 226 7 0.0920 -1.440859e+01 -4.117133e+00 1.598329e+01 # HT + 3391 227 1 -2.2897 -1.042660e+01 -8.285627e+00 -8.428330e+00 # CAT + 3392 227 2 -2.3557 -1.118645e+01 -7.162339e+00 -8.080692e+00 # CAO + 3393 227 3 -2.3537 -1.255114e+01 -7.299878e+00 -7.800111e+00 # CAM + 3394 227 4 -2.3627 -1.315597e+01 -8.560703e+00 -7.867169e+00 # CAP + 3395 227 3 -2.3537 -1.239612e+01 -9.683991e+00 -8.214808e+00 # CAM + 3396 227 2 -2.3557 -1.103143e+01 -9.546453e+00 -8.495388e+00 # CAO + 3397 227 5 -2.4057 -8.954695e+00 -8.137282e+00 -8.730957e+00 # CTT + 3398 227 6 0.1480 -1.071987e+01 -6.189702e+00 -8.028961e+00 # HAT + 3399 227 6 0.1480 -1.313730e+01 -6.433342e+00 -7.531933e+00 # HAT + 3400 227 6 0.1480 -1.420872e+01 -8.666804e+00 -7.650721e+00 # HAT + 3401 227 6 0.1480 -1.286270e+01 -1.065663e+01 -8.266538e+00 # HAT + 3402 227 6 0.1480 -1.044526e+01 -1.041299e+01 -8.763567e+00 # HAT + 3403 227 7 0.0920 -8.547047e+00 -7.305730e+00 -8.156112e+00 # HT + 3404 227 7 0.0920 -8.433277e+00 -9.055463e+00 -8.460464e+00 # HT + 3405 227 7 0.0920 -8.819747e+00 -7.943417e+00 -9.795055e+00 # HT + 3406 228 1 -2.2897 -7.081981e+00 1.256677e+01 -1.438085e+01 # CAT + 3407 228 2 -2.3557 -6.252768e+00 1.238036e+01 -1.326835e+01 # CAO + 3408 228 3 -2.3537 -5.424952e+00 1.342089e+01 -1.283013e+01 # CAM + 3409 228 4 -2.3627 -5.426348e+00 1.464781e+01 -1.350441e+01 # CAP + 3410 228 3 -2.3537 -6.255561e+00 1.483421e+01 -1.461691e+01 # CAM + 3411 228 2 -2.3557 -7.083377e+00 1.379369e+01 -1.505513e+01 # CAO + 3412 228 5 -2.4057 -7.974840e+00 1.144449e+01 -1.485350e+01 # CTT + 3413 228 6 0.1480 -6.251691e+00 1.143388e+01 -1.274819e+01 # HAT + 3414 228 6 0.1480 -4.785274e+00 1.327709e+01 -1.197191e+01 # HAT + 3415 228 6 0.1480 -4.787747e+00 1.545050e+01 -1.316635e+01 # HAT + 3416 228 6 0.1480 -6.256638e+00 1.578070e+01 -1.513707e+01 # HAT + 3417 228 6 0.1480 -7.723055e+00 1.393749e+01 -1.591335e+01 # HAT + 3418 228 7 0.0920 -8.260263e+00 1.082419e+01 -1.400388e+01 # HT + 3419 228 7 0.0920 -8.869859e+00 1.186145e+01 -1.531522e+01 # HT + 3420 228 7 0.0920 -7.439828e+00 1.083656e+01 -1.558308e+01 # HT + 3421 229 1 -2.2897 -1.356107e+01 6.868361e+00 1.152945e+01 # CAT + 3422 229 2 -2.3557 -1.365399e+01 8.225274e+00 1.186134e+01 # CAO + 3423 229 3 -2.3537 -1.254314e+01 8.894617e+00 1.238858e+01 # CAM + 3424 229 4 -2.3627 -1.133935e+01 8.207047e+00 1.258392e+01 # CAP + 3425 229 3 -2.3537 -1.124643e+01 6.850135e+00 1.225203e+01 # CAM + 3426 229 2 -2.3557 -1.235728e+01 6.180792e+00 1.172479e+01 # CAO + 3427 229 5 -2.4057 -1.475920e+01 6.146427e+00 1.096078e+01 # CTT + 3428 229 6 0.1480 -1.458262e+01 8.755684e+00 1.171065e+01 # HAT + 3429 229 6 0.1480 -1.261482e+01 9.941378e+00 1.264461e+01 # HAT + 3430 229 6 0.1480 -1.048241e+01 8.723398e+00 1.299065e+01 # HAT + 3431 229 6 0.1480 -1.031780e+01 6.319724e+00 1.240272e+01 # HAT + 3432 229 6 0.1480 -1.228560e+01 5.134031e+00 1.146876e+01 # HAT + 3433 229 7 0.0920 -1.537445e+01 6.849122e+00 1.039883e+01 # HT + 3434 229 7 0.0920 -1.442278e+01 5.348649e+00 1.029861e+01 # HT + 3435 229 7 0.0920 -1.534649e+01 5.719639e+00 1.177383e+01 # HT + 3436 230 1 -2.2897 1.490995e+01 -1.148403e+01 1.279530e+01 # CAT + 3437 230 2 -2.3557 1.469701e+01 -1.238792e+01 1.174762e+01 # CAO + 3438 230 3 -2.3537 1.481987e+01 -1.196189e+01 1.041969e+01 # CAM + 3439 230 4 -2.3627 1.515567e+01 -1.063197e+01 1.013944e+01 # CAP + 3440 230 3 -2.3537 1.536861e+01 -9.728074e+00 1.118712e+01 # CAM + 3441 230 2 -2.3557 1.524575e+01 -1.015411e+01 1.251505e+01 # CAO + 3442 230 5 -2.4057 1.477744e+01 -1.194354e+01 1.422757e+01 # CTT + 3443 230 6 0.1480 1.443797e+01 -1.341386e+01 1.196382e+01 # HAT + 3444 230 6 0.1480 1.465560e+01 -1.265918e+01 9.611479e+00 # HAT + 3445 230 6 0.1480 1.525044e+01 -1.030331e+01 9.115035e+00 # HAT + 3446 230 6 0.1480 1.562766e+01 -8.702132e+00 1.097093e+01 # HAT + 3447 230 6 0.1480 1.541002e+01 -9.456818e+00 1.332326e+01 # HAT + 3448 230 7 0.0920 1.504252e+01 -1.299851e+01 1.429723e+01 # HT + 3449 230 7 0.0920 1.544525e+01 -1.135909e+01 1.486046e+01 # HT + 3450 230 7 0.0920 1.374876e+01 -1.180518e+01 1.456039e+01 # HT + 3451 231 1 -2.2897 -5.100543e+00 1.508962e+01 1.302112e+00 # CAT + 3452 231 2 -2.3557 -5.395204e+00 1.508844e+01 -6.652700e-02 # CAO + 3453 231 3 -2.3537 -6.725763e+00 1.515934e+01 -4.961650e-01 # CAM + 3454 231 4 -2.3627 -7.761659e+00 1.523141e+01 4.428360e-01 # CAP + 3455 231 3 -2.3537 -7.466998e+00 1.523259e+01 1.811475e+00 # CAM + 3456 231 2 -2.3557 -6.136440e+00 1.516170e+01 2.241113e+00 # CAO + 3457 231 5 -2.4057 -3.665441e+00 1.501316e+01 1.765508e+00 # CTT + 3458 231 6 0.1480 -4.596084e+00 1.503284e+01 -7.908990e-01 # HAT + 3459 231 6 0.1480 -6.953073e+00 1.515842e+01 -1.551973e+00 # HAT + 3460 231 6 0.1480 -8.788090e+00 1.528610e+01 1.114010e-01 # HAT + 3461 231 6 0.1480 -8.266119e+00 1.528819e+01 2.535847e+00 # HAT + 3462 231 6 0.1480 -5.909130e+00 1.516261e+01 3.296921e+00 # HAT + 3463 231 7 0.0920 -3.018117e+00 1.548070e+01 1.023565e+00 # HT + 3464 231 7 0.0920 -3.562120e+00 1.553447e+01 2.717174e+00 # HT + 3465 231 7 0.0920 -3.378678e+00 1.396905e+01 1.890764e+00 # HT + 3466 232 1 -2.2897 -1.397997e+01 -9.179766e+00 7.175708e+00 # CAT + 3467 232 2 -2.3557 -1.493768e+01 -8.161807e+00 7.094722e+00 # CAO + 3468 232 3 -2.3537 -1.519721e+01 -7.540934e+00 5.867057e+00 # CAM + 3469 232 4 -2.3627 -1.449903e+01 -7.938019e+00 4.720379e+00 # CAP + 3470 232 3 -2.3537 -1.354133e+01 -8.955977e+00 4.801364e+00 # CAM + 3471 232 2 -2.3557 -1.328180e+01 -9.576851e+00 6.029029e+00 # CAO + 3472 232 5 -2.4057 -1.370005e+01 -9.849422e+00 8.499832e+00 # CTT + 3473 232 6 0.1480 -1.547627e+01 -7.855484e+00 7.979303e+00 # HAT + 3474 232 6 0.1480 -1.593601e+01 -6.755652e+00 5.804582e+00 # HAT + 3475 232 6 0.1480 -1.469924e+01 -7.459060e+00 3.773322e+00 # HAT + 3476 232 6 0.1480 -1.300273e+01 -9.262300e+00 3.916783e+00 # HAT + 3477 232 6 0.1480 -1.254299e+01 -1.036213e+01 6.091503e+00 # HAT + 3478 232 7 0.0920 -1.460326e+01 -9.841012e+00 9.109950e+00 # HT + 3479 232 7 0.0920 -1.338798e+01 -1.087953e+01 8.327823e+00 # HT + 3480 232 7 0.0920 -1.290656e+01 -9.311802e+00 9.018905e+00 # HT + 3481 233 1 -2.2897 -5.932378e+00 8.303040e+00 -1.339464e+01 # CAT + 3482 233 2 -2.3557 -5.906568e+00 7.591306e+00 -1.459995e+01 # CAO + 3483 233 3 -2.3537 -7.103161e+00 7.294150e+00 -1.526317e+01 # CAM + 3484 233 4 -2.3627 -8.325563e+00 7.708728e+00 -1.472109e+01 # CAP + 3485 233 3 -2.3537 -8.351373e+00 8.420463e+00 -1.351578e+01 # CAM + 3486 233 2 -2.3557 -7.154781e+00 8.717618e+00 -1.285256e+01 # CAO + 3487 233 5 -2.4057 -4.641768e+00 8.623544e+00 -1.267931e+01 # CTT + 3488 233 6 0.1480 -4.963572e+00 7.271488e+00 -1.501813e+01 # HAT + 3489 233 6 0.1480 -7.083251e+00 6.745098e+00 -1.619298e+01 # HAT + 3490 233 6 0.1480 -9.248650e+00 7.479494e+00 -1.523272e+01 # HAT + 3491 233 6 0.1480 -9.294370e+00 8.740281e+00 -1.309760e+01 # HAT + 3492 233 6 0.1480 -7.174691e+00 9.266671e+00 -1.192275e+01 # HAT + 3493 233 7 0.0920 -3.838276e+00 8.729162e+00 -1.340824e+01 # HT + 3494 233 7 0.0920 -4.754356e+00 9.555778e+00 -1.212581e+01 # HT + 3495 233 7 0.0920 -4.399712e+00 7.817377e+00 -1.198677e+01 # HT + 3496 234 1 -2.2897 1.097005e+01 -1.777224e+00 3.712898e+00 # CAT + 3497 234 2 -2.3557 9.944070e+00 -8.259280e-01 3.761940e+00 # CAO + 3498 234 3 -2.3537 9.401032e+00 -3.202220e-01 2.574770e+00 # CAM + 3499 234 4 -2.3627 9.883973e+00 -7.658120e-01 1.338559e+00 # CAP + 3500 234 3 -2.3537 1.090995e+01 -1.717108e+00 1.289518e+00 # CAM + 3501 234 2 -2.3557 1.145299e+01 -2.222814e+00 2.476687e+00 # CAO + 3502 234 5 -2.4057 1.155575e+01 -2.322663e+00 4.993345e+00 # CTT + 3503 234 6 0.1480 9.571516e+00 -4.821860e-01 4.715588e+00 # HAT + 3504 234 6 0.1480 8.609564e+00 4.136350e-01 2.612602e+00 # HAT + 3505 234 6 0.1480 9.465058e+00 -3.756960e-01 4.227420e-01 # HAT + 3506 234 6 0.1480 1.128250e+01 -2.060850e+00 3.358680e-01 # HAT + 3507 234 6 0.1480 1.224446e+01 -2.956671e+00 2.438855e+00 # HAT + 3508 234 7 0.0920 1.079386e+01 -2.318200e+00 5.772832e+00 # HT + 3509 234 7 0.0920 1.190128e+01 -3.343394e+00 4.829568e+00 # HT + 3510 234 7 0.0920 1.239552e+01 -1.700684e+00 5.303246e+00 # HT + 3511 235 1 -2.2897 9.322411e+00 -4.181456e+00 2.478236e+00 # CAT + 3512 235 2 -2.3557 8.615316e+00 -3.413223e+00 3.410885e+00 # CAO + 3513 235 3 -2.3537 7.852389e+00 -2.320174e+00 2.982881e+00 # CAM + 3514 235 4 -2.3627 7.796558e+00 -1.995359e+00 1.622228e+00 # CAP + 3515 235 3 -2.3537 8.503653e+00 -2.763592e+00 6.895790e-01 # CAM + 3516 235 2 -2.3557 9.266579e+00 -3.856640e+00 1.117582e+00 # CAO + 3517 235 5 -2.4057 1.014528e+01 -5.360387e+00 2.939869e+00 # CTT + 3518 235 6 0.1480 8.658385e+00 -3.663795e+00 4.460532e+00 # HAT + 3519 235 6 0.1480 7.306916e+00 -1.727537e+00 3.702353e+00 # HAT + 3520 235 6 0.1480 7.208014e+00 -1.152149e+00 1.292053e+00 # HAT + 3521 235 6 0.1480 8.460583e+00 -2.513019e+00 -3.600690e-01 # HAT + 3522 235 6 0.1480 9.812052e+00 -4.449277e+00 3.981100e-01 # HAT + 3523 235 7 0.0920 9.696515e+00 -5.788701e+00 3.836115e+00 # HT + 3524 235 7 0.0920 1.017449e+01 -6.114131e+00 2.153029e+00 # HT + 3525 235 7 0.0920 1.115968e+01 -5.030556e+00 3.164168e+00 # HT + 3526 236 1 -2.2897 -8.226582e+00 -2.617350e+00 7.379013e+00 # CAT + 3527 236 2 -2.3557 -7.060570e+00 -3.392213e+00 7.377614e+00 # CAO + 3528 236 3 -2.3537 -5.806514e+00 -2.769847e+00 7.375148e+00 # CAM + 3529 236 4 -2.3627 -5.718472e+00 -1.372619e+00 7.374081e+00 # CAP + 3530 236 3 -2.3537 -6.884484e+00 -5.977560e-01 7.375479e+00 # CAM + 3531 236 2 -2.3557 -8.138539e+00 -1.220122e+00 7.377945e+00 # CAO + 3532 236 5 -2.4057 -9.579171e+00 -3.288616e+00 7.381673e+00 # CTT + 3533 236 6 0.1480 -7.128488e+00 -4.470075e+00 7.378438e+00 # HAT + 3534 236 6 0.1480 -4.907019e+00 -3.367599e+00 7.374069e+00 # HAT + 3535 236 6 0.1480 -4.751057e+00 -8.925080e-01 7.372178e+00 # HAT + 3536 236 6 0.1480 -6.816565e+00 4.801060e-01 7.374656e+00 # HAT + 3537 236 6 0.1480 -9.038035e+00 -6.223700e-01 7.379024e+00 # HAT + 3538 236 7 0.0920 -9.508680e+00 -4.247089e+00 7.895931e+00 # HT + 3539 236 7 0.0920 -1.029982e+01 -2.652961e+00 7.896174e+00 # HT + 3540 236 7 0.0920 -9.906774e+00 -3.451043e+00 6.354836e+00 # HT + 3541 237 1 -2.2897 1.484335e+01 1.399167e+01 4.958142e+00 # CAT + 3542 237 2 -2.3557 1.424780e+01 1.273303e+01 5.103596e+00 # CAO + 3543 237 3 -2.3537 1.398874e+01 1.222474e+01 6.382082e+00 # CAM + 3544 237 4 -2.3627 1.432524e+01 1.297508e+01 7.515113e+00 # CAP + 3545 237 3 -2.3537 1.492079e+01 1.423371e+01 7.369660e+00 # CAM + 3546 237 2 -2.3557 1.517984e+01 1.474201e+01 6.091175e+00 # CAO + 3547 237 5 -2.4057 1.512276e+01 1.453990e+01 3.579205e+00 # CTT + 3548 237 6 0.1480 1.398822e+01 1.215420e+01 4.229543e+00 # HAT + 3549 237 6 0.1480 1.352932e+01 1.125379e+01 6.494289e+00 # HAT + 3550 237 6 0.1480 1.412539e+01 1.258296e+01 8.501374e+00 # HAT + 3551 237 6 0.1480 1.518037e+01 1.481255e+01 8.243714e+00 # HAT + 3552 237 6 0.1480 1.563927e+01 1.571296e+01 5.978968e+00 # HAT + 3553 237 7 0.0920 1.438342e+01 1.415384e+01 2.877471e+00 # HT + 3554 237 7 0.0920 1.506746e+01 1.562825e+01 3.602269e+00 # HT + 3555 237 7 0.0920 1.611939e+01 1.423392e+01 3.261066e+00 # HT + 3556 238 1 -2.2897 2.315717e+00 -1.382941e+01 -1.346265e+01 # CAT + 3557 238 2 -2.3557 2.234335e+00 -1.251565e+01 -1.393951e+01 # CAO + 3558 238 3 -2.3537 1.246063e+00 -1.216801e+01 -1.486821e+01 # CAM + 3559 238 4 -2.3627 3.391750e-01 -1.313414e+01 -1.532003e+01 # CAP + 3560 238 3 -2.3537 4.205580e-01 -1.444791e+01 -1.484317e+01 # CAM + 3561 238 2 -2.3557 1.408828e+00 -1.479554e+01 -1.391448e+01 # CAO + 3562 238 5 -2.4057 3.381638e+00 -1.420436e+01 -1.246099e+01 # CTT + 3563 238 6 0.1480 2.933934e+00 -1.177035e+01 -1.359096e+01 # HAT + 3564 238 6 0.1480 1.183283e+00 -1.115454e+01 -1.523607e+01 # HAT + 3565 238 6 0.1480 -4.232060e-01 -1.286596e+01 -1.603645e+01 # HAT + 3566 238 6 0.1480 -2.790430e-01 -1.519321e+01 -1.519172e+01 # HAT + 3567 238 6 0.1480 1.471609e+00 -1.580902e+01 -1.354661e+01 # HAT + 3568 238 7 0.0920 3.622310e+00 -1.333833e+01 -1.184441e+01 # HT + 3569 238 7 0.0920 3.016459e+00 -1.501157e+01 -1.182604e+01 # HT + 3570 238 7 0.0920 4.276678e+00 -1.453423e+01 -1.298842e+01 # HT + 3571 239 1 -2.2897 -1.366387e+01 -1.239712e+01 -1.436625e+01 # CAT + 3572 239 2 -2.3557 -1.245976e+01 -1.278830e+01 -1.496381e+01 # CAO + 3573 239 3 -2.3537 -1.217969e+01 -1.414734e+01 -1.514979e+01 # CAM + 3574 239 4 -2.3627 -1.310373e+01 -1.511519e+01 -1.473821e+01 # CAP + 3575 239 3 -2.3537 -1.430785e+01 -1.472401e+01 -1.414064e+01 # CAM + 3576 239 2 -2.3557 -1.458792e+01 -1.336498e+01 -1.395466e+01 # CAO + 3577 239 5 -2.4057 -1.396595e+01 -1.093131e+01 -1.416565e+01 # CTT + 3578 239 6 0.1480 -1.174692e+01 -1.204168e+01 -1.528132e+01 # HAT + 3579 239 6 0.1480 -1.125080e+01 -1.444911e+01 -1.561077e+01 # HAT + 3580 239 6 0.1480 -1.288768e+01 -1.616359e+01 -1.488168e+01 # HAT + 3581 239 6 0.1480 -1.502068e+01 -1.547064e+01 -1.382314e+01 # HAT + 3582 239 6 0.1480 -1.551681e+01 -1.306321e+01 -1.349368e+01 # HAT + 3583 239 7 0.0920 -1.348156e+01 -1.034937e+01 -1.494976e+01 # HT + 3584 239 7 0.0920 -1.504345e+01 -1.077259e+01 -1.420913e+01 # HT + 3585 239 7 0.0920 -1.359118e+01 -1.061236e+01 -1.319307e+01 # HT + 3586 240 1 -2.2897 1.370349e+01 -1.311656e+01 -1.393122e+01 # CAT + 3587 240 2 -2.3557 1.237589e+01 -1.330863e+01 -1.433195e+01 # CAO + 3588 240 3 -2.3537 1.157489e+01 -1.424900e+01 -1.367308e+01 # CAM + 3589 240 4 -2.3627 1.210149e+01 -1.499730e+01 -1.261349e+01 # CAP + 3590 240 3 -2.3537 1.342909e+01 -1.480522e+01 -1.221275e+01 # CAM + 3591 240 2 -2.3557 1.423009e+01 -1.386485e+01 -1.287162e+01 # CAO + 3592 240 5 -2.4057 1.456743e+01 -1.210231e+01 -1.464185e+01 # CTT + 3593 240 6 0.1480 1.196965e+01 -1.273138e+01 -1.514936e+01 # HAT + 3594 240 6 0.1480 1.055074e+01 -1.439717e+01 -1.398222e+01 # HAT + 3595 240 6 0.1480 1.148357e+01 -1.572272e+01 -1.210522e+01 # HAT + 3596 240 6 0.1480 1.383532e+01 -1.538248e+01 -1.139535e+01 # HAT + 3597 240 6 0.1480 1.525424e+01 -1.371668e+01 -1.256249e+01 # HAT + 3598 240 7 0.0920 1.394283e+01 -1.129191e+01 -1.501768e+01 # HT + 3599 240 7 0.0920 1.530365e+01 -1.170013e+01 -1.394593e+01 # HT + 3600 240 7 0.0920 1.508031e+01 -1.258169e+01 -1.547566e+01 # HT + 3601 241 1 -2.2897 -6.252455e+00 -4.082195e+00 -1.249946e+00 # CAT + 3602 241 2 -2.3557 -6.258884e+00 -2.842686e+00 -1.900773e+00 # CAO + 3603 241 3 -2.3537 -6.622709e+00 -1.686267e+00 -1.200539e+00 # CAM + 3604 241 4 -2.3627 -6.980106e+00 -1.769357e+00 1.505200e-01 # CAP + 3605 241 3 -2.3537 -6.973678e+00 -3.008866e+00 8.013470e-01 # CAM + 3606 241 2 -2.3557 -6.609852e+00 -4.165285e+00 1.011150e-01 # CAO + 3607 241 5 -2.4057 -5.860043e+00 -5.329475e+00 -2.005197e+00 # CTT + 3608 241 6 0.1480 -5.983178e+00 -2.778588e+00 -2.943019e+00 # HAT + 3609 241 6 0.1480 -6.627669e+00 -7.300740e-01 -1.702606e+00 # HAT + 3610 241 6 0.1480 -7.260772e+00 -8.772620e-01 6.907000e-01 # HAT + 3611 241 6 0.1480 -7.249384e+00 -3.072964e+00 1.843594e+00 # HAT + 3612 241 6 0.1480 -6.604893e+00 -5.121478e+00 6.031820e-01 # HAT + 3613 241 7 0.0920 -5.146213e+00 -5.071654e+00 -2.787549e+00 # HT + 3614 241 7 0.0920 -5.403793e+00 -6.042328e+00 -1.318337e+00 # HT + 3615 241 7 0.0920 -6.746456e+00 -5.776078e+00 -2.455661e+00 # HT + 3616 242 1 -2.2897 -1.221430e+01 1.329763e+01 3.916373e+00 # CAT + 3617 242 2 -2.3557 -1.316864e+01 1.411929e+01 3.304715e+00 # CAO + 3618 242 3 -2.3537 -1.288521e+01 1.472593e+01 2.075220e+00 # CAM + 3619 242 4 -2.3627 -1.164745e+01 1.451092e+01 1.457384e+00 # CAP + 3620 242 3 -2.3537 -1.069312e+01 1.368926e+01 2.069043e+00 # CAM + 3621 242 2 -2.3557 -1.097654e+01 1.308262e+01 3.298536e+00 # CAO + 3622 242 5 -2.4057 -1.252000e+01 1.264333e+01 5.242470e+00 # CTT + 3623 242 6 0.1480 -1.412348e+01 1.428516e+01 3.781331e+00 # HAT + 3624 242 6 0.1480 -1.362141e+01 1.535978e+01 1.603369e+00 # HAT + 3625 242 6 0.1480 -1.142881e+01 1.497890e+01 5.089170e-01 # HAT + 3626 242 6 0.1480 -9.738276e+00 1.352339e+01 1.592426e+00 # HAT + 3627 242 6 0.1480 -1.024034e+01 1.244876e+01 3.770387e+00 # HAT + 3628 242 7 0.0920 -1.359151e+01 1.245848e+01 5.318568e+00 # HT + 3629 242 7 0.0920 -1.198270e+01 1.169765e+01 5.314034e+00 # HT + 3630 242 7 0.0920 -1.220675e+01 1.330086e+01 6.053417e+00 # HT + 3631 243 1 -2.2897 1.347380e+01 -1.506411e+01 7.994116e+00 # CAT + 3632 243 2 -2.3557 1.320620e+01 -1.509269e+01 9.368007e+00 # CAO + 3633 243 3 -2.3537 1.189122e+01 -1.525013e+01 9.821913e+00 # CAM + 3634 243 4 -2.3627 1.084383e+01 -1.537899e+01 8.901929e+00 # CAP + 3635 243 3 -2.3537 1.111142e+01 -1.535041e+01 7.528038e+00 # CAM + 3636 243 2 -2.3557 1.242641e+01 -1.519297e+01 7.074131e+00 # CAO + 3637 243 5 -2.4057 1.489210e+01 -1.489431e+01 7.504546e+00 # CTT + 3638 243 6 0.1480 1.401419e+01 -1.499329e+01 1.007771e+01 # HAT + 3639 243 6 0.1480 1.168479e+01 -1.527217e+01 1.088177e+01 # HAT + 3640 243 6 0.1480 9.829412e+00 -1.550044e+01 9.252085e+00 # HAT + 3641 243 6 0.1480 1.030344e+01 -1.544981e+01 6.818335e+00 # HAT + 3642 243 6 0.1480 1.263284e+01 -1.517093e+01 6.014273e+00 # HAT + 3643 243 7 0.0920 1.558155e+01 -1.532663e+01 8.229710e+00 # HT + 3644 243 7 0.0920 1.500924e+01 -1.540023e+01 6.546203e+00 # HT + 3645 243 7 0.0920 1.511078e+01 -1.383332e+01 7.383824e+00 # HT + 3646 244 1 -2.2897 -1.185795e+01 -8.305821e+00 -1.238018e+01 # CAT + 3647 244 2 -2.3557 -1.133203e+01 -9.079506e+00 -1.342173e+01 # CAO + 3648 244 3 -2.3537 -1.097981e+01 -8.474561e+00 -1.463416e+01 # CAM + 3649 244 4 -2.3627 -1.115353e+01 -7.095931e+00 -1.480504e+01 # CAP + 3650 244 3 -2.3537 -1.167946e+01 -6.322246e+00 -1.376350e+01 # CAM + 3651 244 2 -2.3557 -1.203167e+01 -6.927190e+00 -1.255107e+01 # CAO + 3652 244 5 -2.4057 -1.223784e+01 -8.958297e+00 -1.107249e+01 # CTT + 3653 244 6 0.1480 -1.119802e+01 -1.014302e+01 -1.328990e+01 # HAT + 3654 244 6 0.1480 -1.057410e+01 -9.071403e+00 -1.543763e+01 # HAT + 3655 244 6 0.1480 -1.088182e+01 -6.629259e+00 -1.574035e+01 # HAT + 3656 244 6 0.1480 -1.181346e+01 -5.258731e+00 -1.389533e+01 # HAT + 3657 244 6 0.1480 -1.243738e+01 -6.330348e+00 -1.174759e+01 # HAT + 3658 244 7 0.0920 -1.159803e+01 -9.823362e+00 -1.089811e+01 # HT + 3659 244 7 0.0920 -1.211151e+01 -8.243749e+00 -1.025912e+01 # HT + 3660 244 7 0.0920 -1.327859e+01 -9.279442e+00 -1.111493e+01 # HT + 3661 245 1 -2.2897 -3.917380e-01 9.824529e+00 1.492691e+01 # CAT + 3662 245 2 -2.3557 8.219070e-01 9.127241e+00 1.495613e+01 # CAO + 3663 245 3 -2.3537 8.247680e-01 7.731159e+00 1.506076e+01 # CAM + 3664 245 4 -2.3627 -3.860170e-01 7.032365e+00 1.513616e+01 # CAP + 3665 245 3 -2.3537 -1.599663e+00 7.729653e+00 1.510694e+01 # CAM + 3666 245 2 -2.3557 -1.602524e+00 9.125735e+00 1.500232e+01 # CAO + 3667 245 5 -2.4057 -3.948240e-01 1.133030e+01 1.481407e+01 # CTT + 3668 245 6 0.1480 1.755941e+00 9.666311e+00 1.489796e+01 # HAT + 3669 245 6 0.1480 1.761009e+00 7.193251e+00 1.508329e+01 # HAT + 3670 245 6 0.1480 -3.838110e-01 5.955387e+00 1.521687e+01 # HAT + 3671 245 6 0.1480 -2.533697e+00 7.190583e+00 1.516511e+01 # HAT + 3672 245 6 0.1480 -2.538764e+00 9.663643e+00 1.497978e+01 # HAT + 3673 245 7 0.0920 4.843610e-01 1.165528e+01 1.425772e+01 # HT + 3674 245 7 0.0920 -1.294962e+00 1.165418e+01 1.429162e+01 # HT + 3675 245 7 0.0920 -3.760990e-01 1.176995e+01 1.581130e+01 # HT + 3676 246 1 -2.2897 -7.702370e+00 -1.097468e+01 8.402998e+00 # CAT + 3677 246 2 -2.3557 -7.485572e+00 -9.724118e+00 8.993841e+00 # CAO + 3678 246 3 -2.3537 -6.180140e+00 -9.249831e+00 9.169624e+00 # CAM + 3679 246 4 -2.3627 -5.091507e+00 -1.002610e+01 8.754564e+00 # CAP + 3680 246 3 -2.3537 -5.308304e+00 -1.127667e+01 8.163721e+00 # CAM + 3681 246 2 -2.3557 -6.613736e+00 -1.175095e+01 7.987938e+00 # CAO + 3682 246 5 -2.4057 -9.110371e+00 -1.148623e+01 8.213404e+00 # CTT + 3683 246 6 0.1480 -8.325375e+00 -9.125278e+00 9.314030e+00 # HAT + 3684 246 6 0.1480 -6.012896e+00 -8.285112e+00 9.625416e+00 # HAT + 3685 246 6 0.1480 -4.084459e+00 -9.660226e+00 8.890168e+00 # HAT + 3686 246 6 0.1480 -4.468501e+00 -1.187551e+01 7.843532e+00 # HAT + 3687 246 6 0.1480 -6.780980e+00 -1.271567e+01 7.532146e+00 # HAT + 3688 246 7 0.0920 -9.787851e+00 -1.064382e+01 8.073862e+00 # HT + 3689 246 7 0.0920 -9.147999e+00 -1.213135e+01 7.335616e+00 # HT + 3690 246 7 0.0920 -9.413081e+00 -1.205331e+01 9.093678e+00 # HT + 3691 247 1 -2.2897 1.430444e+01 -8.346234e+00 -9.416239e+00 # CAT + 3692 247 2 -2.3557 1.515919e+01 -8.527741e+00 -1.051007e+01 # CAO + 3693 247 3 -2.3537 1.531795e+01 -9.800719e+00 -1.107071e+01 # CAM + 3694 247 4 -2.3627 1.462196e+01 -1.089219e+01 -1.053753e+01 # CAP + 3695 247 3 -2.3537 1.376721e+01 -1.071068e+01 -9.443702e+00 # CAM + 3696 247 2 -2.3557 1.360845e+01 -9.437706e+00 -8.883057e+00 # CAO + 3697 247 5 -2.4057 1.413321e+01 -6.973236e+00 -8.811544e+00 # CTT + 3698 247 6 0.1480 1.569610e+01 -7.685749e+00 -1.092138e+01 # HAT + 3699 247 6 0.1480 1.597733e+01 -9.940738e+00 -1.191452e+01 # HAT + 3700 247 6 0.1480 1.474443e+01 -1.187420e+01 -1.097003e+01 # HAT + 3701 247 6 0.1480 1.323030e+01 -1.155268e+01 -9.032390e+00 # HAT + 3702 247 6 0.1480 1.294907e+01 -9.297687e+00 -8.039247e+00 # HAT + 3703 247 7 0.0920 1.427038e+01 -6.216000e+00 -9.583476e+00 # HT + 3704 247 7 0.0920 1.313227e+01 -6.883835e+00 -8.389391e+00 # HT + 3705 247 7 0.0920 1.487322e+01 -6.827360e+00 -8.024642e+00 # HT + 3706 248 1 -2.2897 -8.220178e+00 -1.162064e+01 6.221310e-01 # CAT + 3707 248 2 -2.3557 -8.030915e+00 -1.029204e+01 2.233820e-01 # CAO + 3708 248 3 -2.3537 -9.131018e+00 -9.435211e+00 9.844500e-02 # CAM + 3709 248 4 -2.3627 -1.042038e+01 -9.906977e+00 3.722570e-01 # CAP + 3710 248 3 -2.3537 -1.060965e+01 -1.123558e+01 7.710060e-01 # CAM + 3711 248 2 -2.3557 -9.509544e+00 -1.209241e+01 8.959430e-01 # CAO + 3712 248 5 -2.4057 -7.033639e+00 -1.254480e+01 7.568850e-01 # CTT + 3713 248 6 0.1480 -7.036262e+00 -9.928111e+00 1.215500e-02 # HAT + 3714 248 6 0.1480 -8.985015e+00 -8.410290e+00 -2.091620e-01 # HAT + 3715 248 6 0.1480 -1.126903e+01 -9.245990e+00 2.758770e-01 # HAT + 3716 248 6 0.1480 -1.160430e+01 -1.159951e+01 9.822330e-01 # HAT + 3717 248 6 0.1480 -9.655547e+00 -1.311733e+01 1.203550e+00 # HAT + 3718 248 7 0.0920 -6.151968e+00 -1.196691e+01 1.034004e+00 # HT + 3719 248 7 0.0920 -7.237154e+00 -1.328822e+01 1.527606e+00 # HT + 3720 248 7 0.0920 -6.854068e+00 -1.304733e+01 -1.935440e-01 # HT + 3721 249 1 -2.2897 1.389114e+01 1.396626e+01 -6.825400e-01 # CAT + 3722 249 2 -2.3557 1.436134e+01 1.277267e+01 -1.219550e-01 # CAO + 3723 249 3 -2.3537 1.375983e+01 1.225670e+01 1.032151e+00 # CAM + 3724 249 4 -2.3627 1.268812e+01 1.293431e+01 1.625671e+00 # CAP + 3725 249 3 -2.3537 1.221791e+01 1.412790e+01 1.065086e+00 # CAM + 3726 249 2 -2.3557 1.281942e+01 1.464387e+01 -8.901900e-02 # CAO + 3727 249 5 -2.4057 1.453991e+01 1.452277e+01 -1.927324e+00 # CTT + 3728 249 6 0.1480 1.518809e+01 1.224994e+01 -5.798130e-01 # HAT + 3729 249 6 0.1480 1.412256e+01 1.133593e+01 1.464602e+00 # HAT + 3730 249 6 0.1480 1.222409e+01 1.253628e+01 2.515981e+00 # HAT + 3731 249 6 0.1480 1.139116e+01 1.465063e+01 1.522945e+00 # HAT + 3732 249 6 0.1480 1.245669e+01 1.556464e+01 -5.214700e-01 # HAT + 3733 249 7 0.0920 1.493267e+01 1.370392e+01 -2.530080e+00 # HT + 3734 249 7 0.0920 1.380104e+01 1.507722e+01 -2.505908e+00 # HT + 3735 249 7 0.0920 1.535499e+01 1.518947e+01 -1.645816e+00 # HT + 3736 250 1 -2.2897 3.313581e+00 2.809477e+00 9.547205e+00 # CAT + 3737 250 2 -2.3557 4.189188e+00 2.123048e+00 8.697424e+00 # CAO + 3738 250 3 -2.3537 3.904718e+00 8.069070e-01 8.314213e+00 # CAM + 3739 250 4 -2.3627 2.744643e+00 1.771950e-01 8.780783e+00 # CAP + 3740 250 3 -2.3537 1.869037e+00 8.636240e-01 9.630565e+00 # CAM + 3741 250 2 -2.3557 2.153506e+00 2.179764e+00 1.001378e+01 # CAO + 3742 250 5 -2.4057 3.620401e+00 4.229028e+00 9.960526e+00 # CTT + 3743 250 6 0.1480 5.084103e+00 2.608825e+00 8.337498e+00 # HAT + 3744 250 6 0.1480 4.580186e+00 2.773760e-01 7.658667e+00 # HAT + 3745 250 6 0.1480 2.525195e+00 -8.381140e-01 8.485163e+00 # HAT + 3746 250 6 0.1480 9.741210e-01 3.778460e-01 9.990491e+00 # HAT + 3747 250 6 0.1480 1.478038e+00 2.709295e+00 1.066932e+01 # HAT + 3748 250 7 0.0920 4.182449e+00 4.724991e+00 9.169182e+00 # HT + 3749 250 7 0.0920 2.688434e+00 4.766616e+00 1.013527e+01 # HT + 3750 250 7 0.0920 4.212116e+00 4.221644e+00 1.087590e+01 # HT + 3751 1 8 2.2087 -3.329314e+00 6.086895e+00 -1.817443e+00 # D_CAT + 3752 1 9 2.2087 -3.087415e+00 5.160210e+00 -8.585367e-01 # D_CAO + 3753 1 10 2.2087 -4.072381e+00 4.998559e+00 2.064781e-01 # D_CAM + 3754 1 11 2.2087 -5.249280e+00 5.797829e+00 2.482909e-01 # D_CAP + 3755 1 10 2.2087 -5.421837e+00 6.720691e+00 -8.750101e-01 # D_CAM + 3756 1 9 2.2087 -4.538920e+00 6.882146e+00 -1.773535e+00 # D_CAO + 3757 1 12 2.2087 -2.277606e+00 6.257040e+00 -2.864932e+00 # D_CTT + 3758 2 8 2.2087 1.322812e+01 1.241298e+01 -6.603711e+00 # D_CAT + 3759 2 9 2.2087 1.313373e+01 1.274060e+01 -7.954978e+00 # D_CAO + 3760 2 10 2.2087 1.379963e+01 1.385791e+01 -8.610221e+00 # D_CAM + 3761 2 11 2.2087 1.472355e+01 1.448518e+01 -7.920730e+00 # D_CAP + 3762 2 10 2.2087 1.487554e+01 1.419107e+01 -6.400353e+00 # D_CAM + 3763 2 9 2.2087 1.424193e+01 1.310975e+01 -5.821034e+00 # D_CAO + 3764 2 12 2.2087 1.249875e+01 1.127436e+01 -6.016541e+00 # D_CTT + 3765 3 8 2.2087 -1.407776e+01 5.635914e+00 -2.481503e+00 # D_CAT + 3766 3 9 2.2087 -1.290198e+01 5.523742e+00 -1.718566e+00 # D_CAO + 3767 3 10 2.2087 -1.182907e+01 4.792212e+00 -2.277732e+00 # D_CAM + 3768 3 11 2.2087 -1.181500e+01 4.256148e+00 -3.420121e+00 # D_CAP + 3769 3 10 2.2087 -1.304494e+01 4.317447e+00 -4.269418e+00 # D_CAM + 3770 3 9 2.2087 -1.405463e+01 5.060839e+00 -3.754308e+00 # D_CAO + 3771 3 12 2.2087 -1.522205e+01 6.305550e+00 -2.032621e+00 # D_CTT + 3772 4 8 2.2087 9.970172e+00 -8.525160e+00 1.792835e+00 # D_CAT + 3773 4 9 2.2087 1.107648e+01 -8.700368e+00 9.670904e-01 # D_CAO + 3774 4 10 2.2087 1.098953e+01 -8.255897e+00 -2.284576e-01 # D_CAM + 3775 4 11 2.2087 9.784861e+00 -7.747088e+00 -8.178659e-01 # D_CAP + 3776 4 10 2.2087 8.634254e+00 -7.528780e+00 6.403136e-02 # D_CAM + 3777 4 9 2.2087 8.793776e+00 -7.967022e+00 1.383598e+00 # D_CAO + 3778 4 12 2.2087 1.011309e+01 -9.126598e+00 3.242588e+00 # D_CTT + 3779 5 8 2.2087 9.686586e+00 7.638471e+00 -7.046248e+00 # D_CAT + 3780 5 9 2.2087 9.299167e+00 8.901819e+00 -7.512563e+00 # D_CAO + 3781 5 10 2.2087 1.020448e+01 9.727635e+00 -8.286029e+00 # D_CAM + 3782 5 11 2.2087 1.136474e+01 9.251284e+00 -8.644377e+00 # D_CAP + 3783 5 10 2.2087 1.189151e+01 7.933551e+00 -8.150735e+00 # D_CAM + 3784 5 9 2.2087 1.096207e+01 7.220483e+00 -7.463882e+00 # D_CAO + 3785 5 12 2.2087 8.772207e+00 6.704642e+00 -6.273534e+00 # D_CTT + 3786 6 8 2.2087 -1.344957e+01 1.300232e+01 1.443329e+01 # D_CAT + 3787 6 9 2.2087 -1.315612e+01 1.429953e+01 1.425383e+01 # D_CAO + 3788 6 10 2.2087 -1.170312e+01 1.450351e+01 1.440582e+01 # D_CAM + 3789 6 11 2.2087 -1.071107e+01 1.345053e+01 1.473724e+01 # D_CAP + 3790 6 10 2.2087 -1.121262e+01 1.217850e+01 1.491323e+01 # D_CAM + 3791 6 9 2.2087 -1.263754e+01 1.186785e+01 1.476254e+01 # D_CAO + 3792 6 12 2.2087 -1.504991e+01 1.271359e+01 1.420498e+01 # D_CTT + 3793 7 8 2.2087 4.632494e+00 6.135990e+00 -1.510157e+01 # D_CAT + 3794 7 9 2.2087 4.423601e+00 7.515225e+00 -1.518287e+01 # D_CAO + 3795 7 10 2.2087 5.768768e+00 8.160254e+00 -1.527092e+01 # D_CAM + 3796 7 11 2.2087 6.933323e+00 7.644562e+00 -1.537707e+01 # D_CAP + 3797 7 10 2.2087 6.935916e+00 6.142419e+00 -1.544592e+01 # D_CAM + 3798 7 9 2.2087 5.750367e+00 5.435948e+00 -1.516108e+01 # D_CAO + 3799 7 12 2.2087 3.201341e+00 5.358195e+00 -1.511734e+01 # D_CTT + 3800 8 8 2.2087 -5.396939e+00 5.169955e+00 9.753209e+00 # D_CAT + 3801 8 9 2.2087 -4.490737e+00 4.265882e+00 1.036846e+01 # D_CAO + 3802 8 10 2.2087 -4.010627e+00 3.165569e+00 9.811499e+00 # D_CAM + 3803 8 11 2.2087 -4.352936e+00 2.956829e+00 8.441598e+00 # D_CAP + 3804 8 10 2.2087 -5.096955e+00 3.852672e+00 7.755358e+00 # D_CAM + 3805 8 9 2.2087 -5.647242e+00 5.024977e+00 8.374482e+00 # D_CAO + 3806 8 12 2.2087 -5.963199e+00 6.379522e+00 1.047364e+01 # D_CTT + 3807 9 8 2.2087 -1.149758e+01 -2.609829e+00 -5.757920e+00 # D_CAT + 3808 9 9 2.2087 -1.081274e+01 -1.665897e+00 -6.378170e+00 # D_CAO + 3809 9 10 2.2087 -1.058277e+01 -1.568048e+00 -7.735608e+00 # D_CAM + 3810 9 11 2.2087 -1.108745e+01 -2.601705e+00 -8.563837e+00 # D_CAP + 3811 9 10 2.2087 -1.184405e+01 -3.682335e+00 -7.991666e+00 # D_CAM + 3812 9 9 2.2087 -1.202935e+01 -3.687370e+00 -6.602147e+00 # D_CAO + 3813 9 12 2.2087 -1.168711e+01 -2.709891e+00 -4.302766e+00 # D_CTT + 3814 10 8 2.2087 1.397195e+01 -2.144243e+00 -1.306513e+01 # D_CAT + 3815 10 9 2.2087 1.254422e+01 -2.238953e+00 -1.311268e+01 # D_CAO + 3816 10 10 2.2087 1.200970e+01 -2.859873e+00 -1.184402e+01 # D_CAM + 3817 10 11 2.2087 1.287799e+01 -3.093652e+00 -1.061102e+01 # D_CAP + 3818 10 10 2.2087 1.413792e+01 -2.832053e+00 -1.081221e+01 # D_CAM + 3819 10 9 2.2087 1.469464e+01 -2.354148e+00 -1.198235e+01 # D_CAO + 3820 10 12 2.2087 1.454519e+01 -1.682873e+00 -1.425736e+01 # D_CTT + 3821 11 8 2.2087 1.482771e+01 -2.640147e+00 -5.790800e+00 # D_CAT + 3822 11 9 2.2087 1.469697e+01 -3.767551e+00 -5.076856e+00 # D_CAO + 3823 11 10 2.2087 1.466405e+01 -3.952776e+00 -3.610885e+00 # D_CAM + 3824 11 11 2.2087 1.498368e+01 -2.662080e+00 -2.955574e+00 # D_CAP + 3825 11 10 2.2087 1.502262e+01 -1.549842e+00 -3.587786e+00 # D_CAM + 3826 11 9 2.2087 1.506954e+01 -1.626285e+00 -5.050410e+00 # D_CAO + 3827 11 12 2.2087 1.484506e+01 -2.621339e+00 -7.221130e+00 # D_CTT + 3828 12 8 2.2087 -1.416804e+01 1.023510e+01 -6.530284e+00 # D_CAT + 3829 12 9 2.2087 -1.308142e+01 1.041048e+01 -5.597256e+00 # D_CAO + 3830 12 10 2.2087 -1.270736e+01 9.209224e+00 -4.924414e+00 # D_CAM + 3831 12 11 2.2087 -1.344071e+01 8.092280e+00 -5.122256e+00 # D_CAP + 3832 12 10 2.2087 -1.449926e+01 7.994392e+00 -5.792398e+00 # D_CAM + 3833 12 9 2.2087 -1.487936e+01 9.140463e+00 -6.629189e+00 # D_CAO + 3834 12 12 2.2087 -1.465251e+01 1.146977e+01 -7.210696e+00 # D_CTT + 3835 13 8 2.2087 -4.353847e+00 -1.344179e+01 -9.446561e+00 # D_CAT + 3836 13 9 2.2087 -5.061837e+00 -1.340562e+01 -8.361602e+00 # D_CAO + 3837 13 10 2.2087 -4.691705e+00 -1.420649e+01 -7.286020e+00 # D_CAM + 3838 13 11 2.2087 -3.714316e+00 -1.525746e+01 -7.560393e+00 # D_CAP + 3839 13 10 2.2087 -2.948521e+00 -1.533441e+01 -8.930681e+00 # D_CAM + 3840 13 9 2.2087 -3.462606e+00 -1.438489e+01 -9.838695e+00 # D_CAO + 3841 13 12 2.2087 -4.795731e+00 -1.254940e+01 -1.076972e+01 # D_CTT + 3842 14 8 2.2087 1.712639e+00 3.354001e+00 -6.547773e-01 # D_CAT + 3843 14 9 2.2087 1.204501e+00 2.180435e+00 -9.891398e-01 # D_CAO + 3844 14 10 2.2087 3.984760e-01 2.057876e+00 -2.142020e+00 # D_CAM + 3845 14 11 2.2087 1.400871e-01 3.155898e+00 -3.040314e+00 # D_CAP + 3846 14 10 2.2087 8.328733e-01 4.394280e+00 -2.643816e+00 # D_CAM + 3847 14 9 2.2087 1.613202e+00 4.476577e+00 -1.410486e+00 # D_CAO + 3848 14 12 2.2087 2.704272e+00 3.394348e+00 5.152576e-01 # D_CTT + 3849 15 8 2.2087 -1.490490e+01 -1.352614e+01 -7.807407e+00 # D_CAT + 3850 15 9 2.2087 -1.494141e+01 -1.197445e+01 -7.847398e+00 # D_CAO + 3851 15 10 2.2087 -1.505065e+01 -1.148885e+01 -9.109559e+00 # D_CAM + 3852 15 11 2.2087 -1.527414e+01 -1.222033e+01 -1.027717e+01 # D_CAP + 3853 15 10 2.2087 -1.521243e+01 -1.353217e+01 -1.017631e+01 # D_CAM + 3854 15 9 2.2087 -1.511136e+01 -1.421799e+01 -8.976571e+00 # D_CAO + 3855 15 12 2.2087 -1.473106e+01 -1.410130e+01 -6.435040e+00 # D_CTT + 3856 16 8 2.2087 -1.406117e+00 -2.206943e+00 -8.284105e+00 # D_CAT + 3857 16 9 2.2087 2.795021e-02 -1.666046e+00 -7.780713e+00 # D_CAO + 3858 16 10 2.2087 5.638772e-01 -2.537619e+00 -7.071884e+00 # D_CAM + 3859 16 11 2.2087 1.840500e-01 -3.766138e+00 -6.590189e+00 # D_CAP + 3860 16 10 2.2087 -1.063184e+00 -4.134429e+00 -7.079552e+00 # D_CAM + 3861 16 9 2.2087 -1.852770e+00 -3.388297e+00 -7.874232e+00 # D_CAO + 3862 16 12 2.2087 -2.086479e+00 -1.201436e+00 -9.359008e+00 # D_CTT + 3863 17 8 2.2087 -7.596119e+00 -7.357616e+00 -1.204311e+01 # D_CAT + 3864 17 9 2.2087 -6.812401e+00 -8.236850e+00 -1.119983e+01 # D_CAO + 3865 17 10 2.2087 -5.666452e+00 -7.696888e+00 -1.058073e+01 # D_CAM + 3866 17 11 2.2087 -5.275716e+00 -6.318326e+00 -1.074651e+01 # D_CAP + 3867 17 10 2.2087 -6.184707e+00 -5.598500e+00 -1.151302e+01 # D_CAM + 3868 17 9 2.2087 -7.284283e+00 -6.081519e+00 -1.221559e+01 # D_CAO + 3869 17 12 2.2087 -8.793577e+00 -8.042171e+00 -1.264502e+01 # D_CTT + 3870 18 8 2.2087 7.914299e+00 1.306593e+01 1.391289e+00 # D_CAT + 3871 18 9 2.2087 6.846877e+00 1.371616e+01 7.875020e-01 # D_CAO + 3872 18 10 2.2087 7.025215e+00 1.458611e+01 -1.938352e-01 # D_CAM + 3873 18 11 2.2087 8.340221e+00 1.485532e+01 -6.716275e-01 # D_CAP + 3874 18 10 2.2087 9.414515e+00 1.396471e+01 -2.815037e-01 # D_CAM + 3875 18 9 2.2087 9.199992e+00 1.309151e+01 7.966763e-01 # D_CAO + 3876 18 12 2.2087 7.711798e+00 1.205645e+01 2.475081e+00 # D_CTT + 3877 19 8 2.2087 -2.224162e+00 -1.416613e+01 -5.403239e+00 # D_CAT + 3878 19 9 2.2087 -3.259900e+00 -1.334020e+01 -5.197820e+00 # D_CAO + 3879 19 10 2.2087 -3.560142e+00 -1.242016e+01 -6.255937e+00 # D_CAM + 3880 19 11 2.2087 -2.763779e+00 -1.243087e+01 -7.516367e+00 # D_CAP + 3881 19 10 2.2087 -1.712419e+00 -1.347441e+01 -7.658390e+00 # D_CAM + 3882 19 9 2.2087 -1.401747e+00 -1.427096e+01 -6.591665e+00 # D_CAO + 3883 19 12 2.2087 -1.914129e+00 -1.517362e+01 -4.297735e+00 # D_CTT + 3884 20 8 2.2087 -1.392645e+00 6.628639e+00 8.799848e+00 # D_CAT + 3885 20 9 2.2087 -7.581976e-01 7.727283e+00 9.412026e+00 # D_CAO + 3886 20 10 2.2087 4.845207e-01 8.268136e+00 8.847729e+00 # D_CAM + 3887 20 11 2.2087 9.550208e-01 7.641636e+00 7.649935e+00 # D_CAP + 3888 20 10 2.2087 2.152263e-01 6.610307e+00 6.967817e+00 # D_CAM + 3889 20 9 2.2087 -8.713691e-01 6.130449e+00 7.587380e+00 # D_CAO + 3890 20 12 2.2087 -2.547207e+00 6.125564e+00 9.404002e+00 # D_CTT + 3891 21 8 2.2087 -7.300927e-01 6.654331e+00 1.263912e+01 # D_CAT + 3892 21 9 2.2087 2.485285e-01 7.696447e+00 1.259069e+01 # D_CAO + 3893 21 10 2.2087 -3.704156e-01 9.018896e+00 1.254581e+01 # D_CAM + 3894 21 11 2.2087 -1.842213e+00 9.238401e+00 1.255720e+01 # D_CAP + 3895 21 10 2.2087 -2.545499e+00 8.194050e+00 1.253192e+01 # D_CAM + 3896 21 9 2.2087 -2.060363e+00 6.792603e+00 1.268907e+01 # D_CAO + 3897 21 12 2.2087 -1.699420e-01 5.251756e+00 1.258672e+01 # D_CTT + 3898 22 8 2.2087 3.138684e+00 -7.513693e+00 -5.132590e+00 # D_CAT + 3899 22 9 2.2087 4.151269e+00 -7.147622e+00 -3.990500e+00 # D_CAO + 3900 22 10 2.2087 5.190149e+00 -6.300613e+00 -4.231045e+00 # D_CAM + 3901 22 11 2.2087 5.634660e+00 -5.916221e+00 -5.495383e+00 # D_CAP + 3902 22 10 2.2087 4.744859e+00 -6.173777e+00 -6.470282e+00 # D_CAM + 3903 22 9 2.2087 3.594235e+00 -7.008447e+00 -6.372714e+00 # D_CAO + 3904 22 12 2.2087 1.998220e+00 -8.210180e+00 -4.832027e+00 # D_CTT + 3905 23 8 2.2087 -1.397243e+01 1.402895e+01 -1.491484e+01 # D_CAT + 3906 23 9 2.2087 -1.261631e+01 1.433888e+01 -1.480444e+01 # D_CAO + 3907 23 10 2.2087 -1.163971e+01 1.332093e+01 -1.509781e+01 # D_CAM + 3908 23 11 2.2087 -1.198273e+01 1.197334e+01 -1.520057e+01 # D_CAP + 3909 23 10 2.2087 -1.346908e+01 1.171051e+01 -1.529192e+01 # D_CAM + 3910 23 9 2.2087 -1.438758e+01 1.270265e+01 -1.512737e+01 # D_CAO + 3911 23 12 2.2087 -1.502173e+01 1.505845e+01 -1.476073e+01 # D_CTT + 3912 24 8 2.2087 7.140475e+00 4.023699e-01 1.115046e+01 # D_CAT + 3913 24 9 2.2087 6.631946e+00 -7.836594e-01 1.047824e+01 # D_CAO + 3914 24 10 2.2087 7.407350e+00 -2.004633e+00 1.074856e+01 # D_CAM + 3915 24 11 2.2087 8.506936e+00 -2.041887e+00 1.155136e+01 # D_CAP + 3916 24 10 2.2087 8.951648e+00 -9.199127e-01 1.231282e+01 # D_CAM + 3917 24 9 2.2087 8.139064e+00 2.972082e-01 1.211685e+01 # D_CAO + 3918 24 12 2.2087 6.286061e+00 1.557048e+00 1.110488e+01 # D_CTT + 3919 25 8 2.2087 1.412041e+01 9.294409e+00 -6.622812e-01 # D_CAT + 3920 25 9 2.2087 1.401797e+01 8.745620e+00 5.869598e-01 # D_CAO + 3921 25 10 2.2087 1.298458e+01 9.137310e+00 1.469582e+00 # D_CAM + 3922 25 11 2.2087 1.199681e+01 1.007322e+01 9.953772e-01 # D_CAP + 3923 25 10 2.2087 1.211885e+01 1.067573e+01 -1.190930e-01 # D_CAM + 3924 25 9 2.2087 1.312880e+01 1.030658e+01 -1.075266e+00 # D_CAO + 3925 25 12 2.2087 1.507937e+01 8.785768e+00 -1.712003e+00 # D_CTT + 3926 26 8 2.2087 3.914046e+00 5.989727e+00 1.416506e+01 # D_CAT + 3927 26 9 2.2087 3.714474e+00 6.523000e+00 1.297980e+01 # D_CAO + 3928 26 10 2.2087 4.237861e+00 7.751502e+00 1.257878e+01 # D_CAM + 3929 26 11 2.2087 4.953496e+00 8.405859e+00 1.353899e+01 # D_CAP + 3930 26 10 2.2087 5.335972e+00 7.925318e+00 1.472842e+01 # D_CAM + 3931 26 9 2.2087 4.832184e+00 6.543950e+00 1.509705e+01 # D_CAO + 3932 26 12 2.2087 3.451426e+00 4.565709e+00 1.460645e+01 # D_CTT + 3933 27 8 2.2087 -8.108392e+00 -6.858489e-01 1.040902e+01 # D_CAT + 3934 27 9 2.2087 -7.275470e+00 -1.707268e+00 9.986516e+00 # D_CAO + 3935 27 10 2.2087 -5.820996e+00 -1.343364e+00 9.984480e+00 # D_CAM + 3936 27 11 2.2087 -5.479493e+00 5.048258e-03 1.029766e+01 # D_CAP + 3937 27 10 2.2087 -6.316233e+00 8.646660e-01 1.051676e+01 # D_CAM + 3938 27 9 2.2087 -7.670784e+00 5.773283e-01 1.066572e+01 # D_CAO + 3939 27 12 2.2087 -9.575907e+00 -1.057572e+00 1.062943e+01 # D_CTT + 3940 28 8 2.2087 1.097864e+01 4.867187e-01 -1.449518e+00 # D_CAT + 3941 28 9 2.2087 1.164306e+01 5.277178e-01 -2.146860e-01 # D_CAO + 3942 28 10 2.2087 1.107612e+01 1.300662e+00 9.925538e-01 # D_CAM + 3943 28 11 2.2087 9.940368e+00 2.000563e+00 7.545035e-01 # D_CAP + 3944 28 10 2.2087 9.271184e+00 1.972248e+00 -2.513153e-01 # D_CAM + 3945 28 9 2.2087 9.701669e+00 1.232084e+00 -1.424748e+00 # D_CAO + 3946 28 12 2.2087 1.136257e+01 -3.087924e-01 -2.554386e+00 # D_CTT + 3947 29 8 2.2087 1.362327e+01 -6.767002e+00 -1.213367e+01 # D_CAT + 3948 29 9 2.2087 1.400574e+01 -7.974382e+00 -1.262400e+01 # D_CAO + 3949 29 10 2.2087 1.326440e+01 -9.078363e+00 -1.243071e+01 # D_CAM + 3950 29 11 2.2087 1.217075e+01 -8.993501e+00 -1.156006e+01 # D_CAP + 3951 29 10 2.2087 1.187836e+01 -7.853839e+00 -1.109340e+01 # D_CAM + 3952 29 9 2.2087 1.252734e+01 -6.751213e+00 -1.136878e+01 # D_CAO + 3953 29 12 2.2087 1.431080e+01 -5.508520e+00 -1.243821e+01 # D_CTT + 3954 30 8 2.2087 1.313155e+01 -4.483113e+00 7.425184e+00 # D_CAT + 3955 30 9 2.2087 1.437098e+01 -4.277872e+00 6.965204e+00 # D_CAO + 3956 30 10 2.2087 1.492786e+01 -2.951233e+00 6.928186e+00 # D_CAM + 3957 30 11 2.2087 1.413581e+01 -1.905789e+00 7.377141e+00 # D_CAP + 3958 30 10 2.2087 1.286445e+01 -2.076574e+00 7.849225e+00 # D_CAM + 3959 30 9 2.2087 1.223880e+01 -3.404439e+00 7.883327e+00 # D_CAO + 3960 30 12 2.2087 1.258570e+01 -5.949891e+00 7.520388e+00 # D_CTT + 3961 31 8 2.2087 -6.763260e+00 1.490104e+01 -8.930978e+00 # D_CAT + 3962 31 9 2.2087 -7.691097e+00 1.545497e+01 -7.952233e+00 # D_CAO + 3963 31 10 2.2087 -7.386625e+00 1.542626e+01 -6.663156e+00 # D_CAM + 3964 31 11 2.2087 -6.185357e+00 1.492466e+01 -6.212587e+00 # D_CAP + 3965 31 10 2.2087 -5.295225e+00 1.430478e+01 -7.103294e+00 # D_CAM + 3966 31 9 2.2087 -5.652903e+00 1.439886e+01 -8.551432e+00 # D_CAO + 3967 31 12 2.2087 -7.225251e+00 1.494613e+01 -1.038867e+01 # D_CTT + 3968 32 8 2.2087 1.413483e+01 1.461482e+01 1.349656e+01 # D_CAT + 3969 32 9 2.2087 1.299848e+01 1.518167e+01 1.312265e+01 # D_CAO + 3970 32 10 2.2087 1.269505e+01 1.525078e+01 1.170450e+01 # D_CAM + 3971 32 11 2.2087 1.345485e+01 1.453892e+01 1.081311e+01 # D_CAP + 3972 32 10 2.2087 1.463679e+01 1.389601e+01 1.117752e+01 # D_CAM + 3973 32 9 2.2087 1.495971e+01 1.385843e+01 1.255592e+01 # D_CAO + 3974 32 12 2.2087 1.444971e+01 1.447232e+01 1.502390e+01 # D_CTT + 3975 33 8 2.2087 3.257905e+00 1.410796e+01 -1.241784e+01 # D_CAT + 3976 33 9 2.2087 3.282710e+00 1.276632e+01 -1.288924e+01 # D_CAO + 3977 33 10 2.2087 4.597683e+00 1.219591e+01 -1.283029e+01 # D_CAM + 3978 33 11 2.2087 5.707946e+00 1.289737e+01 -1.244392e+01 # D_CAP + 3979 33 10 2.2087 5.672700e+00 1.422595e+01 -1.209604e+01 # D_CAM + 3980 33 9 2.2087 4.336249e+00 1.484531e+01 -1.193709e+01 # D_CAO + 3981 33 12 2.2087 1.841713e+00 1.471722e+01 -1.236134e+01 # D_CTT + 3982 34 8 2.2087 2.895731e+00 1.517540e+01 2.797601e+00 # D_CAT + 3983 34 9 2.2087 2.774246e+00 1.487018e+01 1.432516e+00 # D_CAO + 3984 34 10 2.2087 1.582890e+00 1.493593e+01 8.380619e-01 # D_CAM + 3985 34 11 2.2087 4.465572e-01 1.520689e+01 1.761536e+00 # D_CAP + 3986 34 10 2.2087 6.392990e-01 1.541346e+01 3.052290e+00 # D_CAM + 3987 34 9 2.2087 1.877532e+00 1.540637e+01 3.650900e+00 # D_CAO + 3988 34 12 2.2087 4.310812e+00 1.517897e+01 3.452001e+00 # D_CTT + 3989 35 8 2.2087 -8.193006e+00 -1.299632e+01 -3.690795e+00 # D_CAT + 3990 35 9 2.2087 -8.920377e+00 -1.353353e+01 -4.762121e+00 # D_CAO + 3991 35 10 2.2087 -8.346691e+00 -1.453504e+01 -5.502369e+00 # D_CAM + 3992 35 11 2.2087 -7.269628e+00 -1.498464e+01 -5.281821e+00 # D_CAP + 3993 35 10 2.2087 -6.471090e+00 -1.468749e+01 -4.086634e+00 # D_CAM + 3994 35 9 2.2087 -6.911003e+00 -1.363629e+01 -3.414816e+00 # D_CAO + 3995 35 12 2.2087 -8.662390e+00 -1.184004e+01 -3.005418e+00 # D_CTT + 3996 36 8 2.2087 9.715827e+00 1.393367e+01 1.150953e+01 # D_CAT + 3997 36 9 2.2087 1.050845e+01 1.383548e+01 1.261126e+01 # D_CAO + 3998 36 10 2.2087 1.000306e+01 1.427471e+01 1.395054e+01 # D_CAM + 3999 36 11 2.2087 8.833792e+00 1.509847e+01 1.398166e+01 # D_CAP + 4000 36 10 2.2087 8.021866e+00 1.509650e+01 1.281889e+01 # D_CAM + 4001 36 9 2.2087 8.466020e+00 1.474399e+01 1.153284e+01 # D_CAO + 4002 36 12 2.2087 1.026589e+01 1.347526e+01 1.018240e+01 # D_CTT + 4003 37 8 2.2087 6.512566e+00 -9.221900e+00 -1.004866e+01 # D_CAT + 4004 37 9 2.2087 6.612724e+00 -1.026330e+01 -1.105375e+01 # D_CAO + 4005 37 10 2.2087 5.362162e+00 -1.081711e+01 -1.157351e+01 # D_CAM + 4006 37 11 2.2087 4.109702e+00 -1.031448e+01 -1.099864e+01 # D_CAP + 4007 37 10 2.2087 4.235211e+00 -9.092030e+00 -1.013968e+01 # D_CAM + 4008 37 9 2.2087 5.323522e+00 -8.633224e+00 -9.577350e+00 # D_CAO + 4009 37 12 2.2087 7.845295e+00 -8.657429e+00 -9.438060e+00 # D_CTT + 4010 38 8 2.2087 -4.024556e+00 1.891793e+00 -7.052593e-01 # D_CAT + 4011 38 9 2.2087 -4.454284e+00 1.143909e+00 3.829799e-01 # D_CAO + 4012 38 10 2.2087 -5.764880e+00 1.517639e+00 1.081093e+00 # D_CAM + 4013 38 11 2.2087 -6.428682e+00 2.584553e+00 4.257834e-01 # D_CAP + 4014 38 10 2.2087 -6.017252e+00 3.362785e+00 -6.623003e-01 # D_CAM + 4015 38 9 2.2087 -4.705869e+00 2.905006e+00 -1.240565e+00 # D_CAO + 4016 38 12 2.2087 -2.612637e+00 1.452662e+00 -1.290183e+00 # D_CTT + 4017 39 8 2.2087 -1.264356e+01 -1.432473e+01 1.294680e+01 # D_CAT + 4018 39 9 2.2087 -1.203767e+01 -1.501777e+01 1.406192e+01 # D_CAO + 4019 39 10 2.2087 -1.073102e+01 -1.490794e+01 1.436553e+01 # D_CAM + 4020 39 11 2.2087 -9.809702e+00 -1.447903e+01 1.344013e+01 # D_CAP + 4021 39 10 2.2087 -1.031310e+01 -1.386770e+01 1.228688e+01 # D_CAM + 4022 39 9 2.2087 -1.157528e+01 -1.386297e+01 1.198953e+01 # D_CAO + 4023 39 12 2.2087 -1.403289e+01 -1.428131e+01 1.268062e+01 # D_CTT + 4024 40 8 2.2087 -1.296605e+01 -5.458697e+00 -2.325835e+00 # D_CAT + 4025 40 9 2.2087 -1.200990e+01 -6.034630e+00 -3.157061e+00 # D_CAO + 4026 40 10 2.2087 -1.237419e+01 -6.806931e+00 -4.186012e+00 # D_CAM + 4027 40 11 2.2087 -1.378334e+01 -7.349833e+00 -4.211211e+00 # D_CAP + 4028 40 10 2.2087 -1.466235e+01 -6.872226e+00 -3.323041e+00 # D_CAM + 4029 40 9 2.2087 -1.422780e+01 -5.959120e+00 -2.345862e+00 # D_CAO + 4030 40 12 2.2087 -1.247493e+01 -4.626167e+00 -1.193071e+00 # D_CTT + 4031 41 8 2.2087 -1.051542e+01 2.202094e+00 -1.511274e+01 # D_CAT + 4032 41 9 2.2087 -1.094006e+01 8.783632e-01 -1.540651e+01 # D_CAO + 4033 41 10 2.2087 -1.224650e+01 5.385258e-01 -1.552103e+01 # D_CAM + 4034 41 11 2.2087 -1.326485e+01 1.525628e+00 -1.541954e+01 # D_CAP + 4035 41 10 2.2087 -1.273166e+01 2.863547e+00 -1.498601e+01 # D_CAM + 4036 41 9 2.2087 -1.152454e+01 3.143355e+00 -1.501384e+01 # D_CAO + 4037 41 12 2.2087 -8.957149e+00 2.512670e+00 -1.482631e+01 # D_CTT + 4038 42 8 2.2087 -1.321977e+01 7.726722e+00 -1.054246e+01 # D_CAT + 4039 42 9 2.2087 -1.241902e+01 9.009227e+00 -1.057436e+01 # D_CAO + 4040 42 10 2.2087 -1.106343e+01 9.039334e+00 -1.063644e+01 # D_CAM + 4041 42 11 2.2087 -1.047329e+01 7.764233e+00 -1.067898e+01 # D_CAP + 4042 42 10 2.2087 -1.105075e+01 6.627951e+00 -1.061884e+01 # D_CAM + 4043 42 9 2.2087 -1.245655e+01 6.672384e+00 -1.040992e+01 # D_CAO + 4044 42 12 2.2087 -1.464132e+01 7.743636e+00 -1.026897e+01 # D_CTT + 4045 43 8 2.2087 1.482582e+00 -3.641450e+00 -9.388600e+00 # D_CAT + 4046 43 9 2.2087 1.411277e+00 -4.692682e+00 -8.510396e+00 # D_CAO + 4047 43 10 2.2087 3.074148e-01 -5.503779e+00 -8.421653e+00 # D_CAM + 4048 43 11 2.2087 -8.679170e-01 -5.319838e+00 -9.017768e+00 # D_CAP + 4049 43 10 2.2087 -8.748484e-01 -4.197584e+00 -1.004515e+01 # D_CAM + 4050 43 9 2.2087 2.235869e-01 -3.466703e+00 -1.020483e+01 # D_CAO + 4051 43 12 2.2087 2.631400e+00 -2.746479e+00 -9.558127e+00 # D_CTT + 4052 44 8 2.2087 1.211075e+01 1.337833e+01 -1.290665e+01 # D_CAT + 4053 44 9 2.2087 1.178695e+01 1.339261e+01 -1.427021e+01 # D_CAO + 4054 44 10 2.2087 1.207628e+01 1.226166e+01 -1.516798e+01 # D_CAM + 4055 44 11 2.2087 1.257305e+01 1.127811e+01 -1.467681e+01 # D_CAP + 4056 44 10 2.2087 1.286570e+01 1.106498e+01 -1.332828e+01 # D_CAM + 4057 44 9 2.2087 1.262352e+01 1.213738e+01 -1.249220e+01 # D_CAO + 4058 44 12 2.2087 1.178580e+01 1.449837e+01 -1.214793e+01 # D_CTT + 4059 45 8 2.2087 7.685737e+00 -2.647187e+00 -1.414545e+01 # D_CAT + 4060 45 9 2.2087 7.303470e+00 -1.458036e+00 -1.476426e+01 # D_CAO + 4061 45 10 2.2087 6.065444e+00 -7.519520e-01 -1.434040e+01 # D_CAM + 4062 45 11 2.2087 5.353739e+00 -1.494233e+00 -1.333628e+01 # D_CAP + 4063 45 10 2.2087 5.653660e+00 -2.543613e+00 -1.262640e+01 # D_CAM + 4064 45 9 2.2087 6.919407e+00 -3.120409e+00 -1.308647e+01 # D_CAO + 4065 45 12 2.2087 9.025069e+00 -3.363751e+00 -1.451814e+01 # D_CTT + 4066 46 8 2.2087 4.841749e+00 -1.497562e+01 7.594474e+00 # D_CAT + 4067 46 9 2.2087 4.744644e+00 -1.516699e+01 6.196497e+00 # D_CAO + 4068 46 10 2.2087 5.613352e+00 -1.496889e+01 5.343855e+00 # D_CAM + 4069 46 11 2.2087 6.969295e+00 -1.475852e+01 5.949128e+00 # D_CAP + 4070 46 10 2.2087 7.206613e+00 -1.475246e+01 7.290092e+00 # D_CAM + 4071 46 9 2.2087 6.066459e+00 -1.482818e+01 8.178054e+00 # D_CAO + 4072 46 12 2.2087 3.523744e+00 -1.506998e+01 8.547863e+00 # D_CTT + 4073 47 8 2.2087 9.867423e+00 -1.330008e+01 1.322084e+01 # D_CAT + 4074 47 9 2.2087 9.143296e+00 -1.339767e+01 1.207004e+01 # D_CAO + 4075 47 10 2.2087 7.886360e+00 -1.316475e+01 1.185735e+01 # D_CAM + 4076 47 11 2.2087 7.117800e+00 -1.257086e+01 1.305998e+01 # D_CAP + 4077 47 10 2.2087 7.629566e+00 -1.250861e+01 1.432402e+01 # D_CAM + 4078 47 9 2.2087 9.056763e+00 -1.286144e+01 1.445824e+01 # D_CAO + 4079 47 12 2.2087 1.117906e+01 -1.374910e+01 1.356533e+01 # D_CTT + 4080 48 8 2.2087 -5.640723e-01 1.109374e+01 -9.149181e+00 # D_CAT + 4081 48 9 2.2087 -9.529134e-02 1.177157e+01 -1.030982e+01 # D_CAO + 4082 48 10 2.2087 -5.461530e-01 1.141213e+01 -1.152976e+01 # D_CAM + 4083 48 11 2.2087 -1.531763e+00 1.041426e+01 -1.156095e+01 # D_CAP + 4084 48 10 2.2087 -1.995717e+00 9.771871e+00 -1.047163e+01 # D_CAM + 4085 48 9 2.2087 -1.624386e+00 1.003220e+01 -9.280718e+00 # D_CAO + 4086 48 12 2.2087 3.538578e-03 1.149298e+01 -7.729795e+00 # D_CTT + 4087 49 8 2.2087 1.030422e+01 -5.866718e-01 -8.050910e+00 # D_CAT + 4088 49 9 2.2087 1.160864e+01 -4.723875e-01 -7.983955e+00 # D_CAO + 4089 49 10 2.2087 1.231098e+01 2.906156e-01 -6.966073e+00 # D_CAM + 4090 49 11 2.2087 1.158354e+01 1.117311e+00 -6.044817e+00 # D_CAP + 4091 49 10 2.2087 1.014958e+01 9.957552e-01 -6.085477e+00 # D_CAM + 4092 49 9 2.2087 9.475071e+00 2.357483e-01 -6.996639e+00 # D_CAO + 4093 49 12 2.2087 9.688907e+00 -1.392958e+00 -9.039917e+00 # D_CTT + 4094 50 8 2.2087 1.052177e+01 1.503944e+01 6.059595e+00 # D_CAT + 4095 50 9 2.2087 1.046703e+01 1.511482e+01 4.719437e+00 # D_CAO + 4096 50 10 2.2087 9.255482e+00 1.514253e+01 3.999497e+00 # D_CAM + 4097 50 11 2.2087 8.056787e+00 1.508350e+01 4.673270e+00 # D_CAP + 4098 50 10 2.2087 8.016113e+00 1.498243e+01 6.016747e+00 # D_CAM + 4099 50 9 2.2087 9.313482e+00 1.491023e+01 6.795518e+00 # D_CAO + 4100 50 12 2.2087 1.186057e+01 1.503777e+01 6.752837e+00 # D_CTT + 4101 51 8 2.2087 1.200561e+01 -4.829299e+00 -3.835772e+00 # D_CAT + 4102 51 9 2.2087 1.185475e+01 -5.972166e+00 -4.386106e+00 # D_CAO + 4103 51 10 2.2087 1.172689e+01 -6.087496e+00 -5.798304e+00 # D_CAM + 4104 51 11 2.2087 1.176124e+01 -4.924053e+00 -6.578396e+00 # D_CAP + 4105 51 10 2.2087 1.199711e+01 -3.648871e+00 -5.929957e+00 # D_CAM + 4106 51 9 2.2087 1.203843e+01 -3.619668e+00 -4.619990e+00 # D_CAO + 4107 51 12 2.2087 1.200298e+01 -4.474129e+00 -2.331932e+00 # D_CTT + 4108 52 8 2.2087 1.545106e+00 -1.221028e+01 -6.056572e+00 # D_CAT + 4109 52 9 2.2087 2.673383e+00 -1.163858e+01 -6.567490e+00 # D_CAO + 4110 52 10 2.2087 2.518452e+00 -1.033306e+01 -7.231695e+00 # D_CAM + 4111 52 11 2.2087 1.292037e+00 -9.744589e+00 -7.431465e+00 # D_CAP + 4112 52 10 2.2087 2.260127e-01 -1.042179e+01 -6.916005e+00 # D_CAM + 4113 52 9 2.2087 2.277442e-01 -1.158808e+01 -6.267618e+00 # D_CAO + 4114 52 12 2.2087 1.699641e+00 -1.348994e+01 -5.317864e+00 # D_CTT + 4115 53 8 2.2087 1.359497e+01 4.573217e+00 -1.635206e+00 # D_CAT + 4116 53 9 2.2087 1.288107e+01 5.472652e+00 -9.459980e-01 # D_CAO + 4117 53 10 2.2087 1.138846e+01 5.273400e+00 -8.273051e-01 # D_CAM + 4118 53 11 2.2087 1.082464e+01 4.263786e+00 -1.499786e+00 # D_CAP + 4119 53 10 2.2087 1.155216e+01 3.351929e+00 -2.397926e+00 # D_CAM + 4120 53 9 2.2087 1.281365e+01 3.556916e+00 -2.473551e+00 # D_CAO + 4121 53 12 2.2087 1.505379e+01 4.729305e+00 -1.799803e+00 # D_CTT + 4122 54 8 2.2087 2.916639e+00 1.239329e+01 1.126229e+01 # D_CAT + 4123 54 9 2.2087 3.356122e+00 1.359375e+01 1.164097e+01 # D_CAO + 4124 54 10 2.2087 2.963292e+00 1.481807e+01 1.103854e+01 # D_CAM + 4125 54 11 2.2087 2.156685e+00 1.467701e+01 1.005131e+01 # D_CAP + 4126 54 10 2.2087 1.652048e+00 1.361165e+01 9.497487e+00 # D_CAM + 4127 54 9 2.2087 2.066797e+00 1.234738e+01 1.009694e+01 # D_CAO + 4128 54 12 2.2087 3.346564e+00 1.100932e+01 1.182263e+01 # D_CTT + 4129 55 8 2.2087 1.513979e+01 -9.063061e+00 -4.942327e+00 # D_CAT + 4130 55 9 2.2087 1.505734e+01 -9.799257e+00 -3.764475e+00 # D_CAO + 4131 55 10 2.2087 1.508302e+01 -1.122240e+01 -3.881155e+00 # D_CAM + 4132 55 11 2.2087 1.520298e+01 -1.186408e+01 -5.033518e+00 # D_CAP + 4133 55 10 2.2087 1.524621e+01 -1.109816e+01 -6.242296e+00 # D_CAM + 4134 55 9 2.2087 1.520103e+01 -9.599517e+00 -6.112546e+00 # D_CAO + 4135 55 12 2.2087 1.503123e+01 -7.544849e+00 -4.857456e+00 # D_CTT + 4136 56 8 2.2087 1.499517e+01 1.363924e+01 -1.352480e+01 # D_CAT + 4137 56 9 2.2087 1.515622e+01 1.359886e+01 -1.218138e+01 # D_CAO + 4138 56 10 2.2087 1.538189e+01 1.237050e+01 -1.155720e+01 # D_CAM + 4139 56 11 2.2087 1.545471e+01 1.120763e+01 -1.231398e+01 # D_CAP + 4140 56 10 2.2087 1.539242e+01 1.131628e+01 -1.365300e+01 # D_CAM + 4141 56 9 2.2087 1.514858e+01 1.252820e+01 -1.429586e+01 # D_CAO + 4142 56 12 2.2087 1.486333e+01 1.508369e+01 -1.422451e+01 # D_CTT + 4143 57 8 2.2087 3.095530e+00 -2.323200e+00 -1.450116e+01 # D_CAT + 4144 57 9 2.2087 2.692549e+00 -3.210509e+00 -1.353097e+01 # D_CAO + 4145 57 10 2.2087 3.691740e+00 -4.281720e+00 -1.314627e+01 # D_CAM + 4146 57 11 2.2087 4.782739e+00 -4.418171e+00 -1.393782e+01 # D_CAP + 4147 57 10 2.2087 5.046726e+00 -3.646709e+00 -1.493532e+01 # D_CAM + 4148 57 9 2.2087 4.201080e+00 -2.539677e+00 -1.521231e+01 # D_CAO + 4149 57 12 2.2087 2.112443e+00 -1.133260e+00 -1.487406e+01 # D_CTT + 4150 58 8 2.2087 -4.639971e+00 -7.178724e+00 2.216173e+00 # D_CAT + 4151 58 9 2.2087 -5.875378e+00 -7.229458e+00 1.708770e+00 # D_CAO + 4152 58 10 2.2087 -6.942194e+00 -6.646190e+00 2.553843e+00 # D_CAM + 4153 58 11 2.2087 -6.627438e+00 -5.986461e+00 3.790262e+00 # D_CAP + 4154 58 10 2.2087 -5.231281e+00 -5.978518e+00 4.266185e+00 # D_CAM + 4155 58 9 2.2087 -4.231166e+00 -6.635888e+00 3.446719e+00 # D_CAO + 4156 58 12 2.2087 -3.574344e+00 -7.815523e+00 1.365428e+00 # D_CTT + 4157 59 8 2.2087 -7.752356e+00 3.592356e+00 1.404240e+01 # D_CAT + 4158 59 9 2.2087 -7.280747e+00 3.549798e+00 1.279345e+01 # D_CAO + 4159 59 10 2.2087 -8.055365e+00 3.694285e+00 1.171225e+01 # D_CAM + 4160 59 11 2.2087 -9.524178e+00 3.827807e+00 1.192695e+01 # D_CAP + 4161 59 10 2.2087 -1.004740e+01 3.906284e+00 1.311091e+01 # D_CAM + 4162 59 9 2.2087 -9.218916e+00 3.729546e+00 1.427072e+01 # D_CAO + 4163 59 12 2.2087 -6.824142e+00 3.389148e+00 1.529356e+01 # D_CTT + 4164 60 8 2.2087 -2.944756e+00 7.565283e+00 -7.392861e+00 # D_CAT + 4165 60 9 2.2087 -2.427755e+00 8.256103e+00 -6.254896e+00 # D_CAO + 4166 60 10 2.2087 -2.764544e+00 9.611059e+00 -6.027954e+00 # D_CAM + 4167 60 11 2.2087 -3.720460e+00 1.008965e+01 -6.931026e+00 # D_CAP + 4168 60 10 2.2087 -4.340577e+00 9.364968e+00 -7.975100e+00 # D_CAM + 4169 60 9 2.2087 -3.904605e+00 8.097832e+00 -8.187831e+00 # D_CAO + 4170 60 12 2.2087 -2.629418e+00 6.063916e+00 -7.652432e+00 # D_CTT + 4171 61 8 2.2087 3.268727e+00 -4.549339e-01 4.667998e+00 # D_CAT + 4172 61 9 2.2087 2.047873e+00 -1.081419e+00 4.753169e+00 # D_CAO + 4173 61 10 2.2087 1.693994e+00 -2.003184e+00 5.669153e+00 # D_CAM + 4174 61 11 2.2087 2.795399e+00 -2.455367e+00 6.567591e+00 # D_CAP + 4175 61 10 2.2087 4.043216e+00 -1.790200e+00 6.429967e+00 # D_CAM + 4176 61 9 2.2087 4.325463e+00 -9.016252e-01 5.516722e+00 # D_CAO + 4177 61 12 2.2087 3.554483e+00 5.010759e-01 3.544953e+00 # D_CTT + 4178 62 8 2.2087 -1.407520e+01 6.919187e+00 1.492392e+01 # D_CAT + 4179 62 9 2.2087 -1.270012e+01 6.918501e+00 1.513551e+01 # D_CAO + 4180 62 10 2.2087 -1.201055e+01 5.782830e+00 1.531154e+01 # D_CAM + 4181 62 11 2.2087 -1.258698e+01 4.623553e+00 1.544320e+01 # D_CAP + 4182 62 10 2.2087 -1.402789e+01 4.481577e+00 1.531933e+01 # D_CAM + 4183 62 9 2.2087 -1.470644e+01 5.692272e+00 1.501052e+01 # D_CAO + 4184 62 12 2.2087 -1.481384e+01 8.232775e+00 1.467277e+01 # D_CTT + 4185 63 8 2.2087 4.466508e+00 1.372995e+01 -2.900754e+00 # D_CAT + 4186 63 9 2.2087 3.295198e+00 1.331756e+01 -2.145562e+00 # D_CAO + 4187 63 10 2.2087 3.552520e+00 1.256607e+01 -9.780755e-01 # D_CAM + 4188 63 11 2.2087 4.922594e+00 1.221742e+01 -6.730771e-01 # D_CAP + 4189 63 10 2.2087 5.971299e+00 1.264226e+01 -1.341831e+00 # D_CAM + 4190 63 9 2.2087 5.780435e+00 1.350403e+01 -2.487310e+00 # D_CAO + 4191 63 12 2.2087 4.230335e+00 1.459675e+01 -4.030969e+00 # D_CTT + 4192 64 8 2.2087 1.295819e+01 1.091325e+01 1.322700e+01 # D_CAT + 4193 64 9 2.2087 1.300992e+01 1.134084e+01 1.463152e+01 # D_CAO + 4194 64 10 2.2087 1.179180e+01 1.165056e+01 1.526987e+01 # D_CAM + 4195 64 11 2.2087 1.057102e+01 1.156940e+01 1.465369e+01 # D_CAP + 4196 64 10 2.2087 1.050198e+01 1.110182e+01 1.334804e+01 # D_CAM + 4197 64 9 2.2087 1.169891e+01 1.076608e+01 1.258354e+01 # D_CAO + 4198 64 12 2.2087 1.419440e+01 1.058607e+01 1.243683e+01 # D_CTT + 4199 65 8 2.2087 8.932841e+00 -5.269969e+00 -5.844738e+00 # D_CAT + 4200 65 9 2.2087 8.647694e+00 -5.726543e+00 -4.665927e+00 # D_CAO + 4201 65 10 2.2087 8.899285e+00 -4.800834e+00 -3.497462e+00 # D_CAM + 4202 65 11 2.2087 9.388375e+00 -3.530489e+00 -3.830826e+00 # D_CAP + 4203 65 10 2.2087 9.621448e+00 -3.009273e+00 -5.065725e+00 # D_CAM + 4204 65 9 2.2087 9.326578e+00 -3.848385e+00 -6.140427e+00 # D_CAO + 4205 65 12 2.2087 8.663478e+00 -6.172930e+00 -7.151427e+00 # D_CTT + 4206 66 8 2.2087 4.232110e+00 1.387587e+01 1.505535e+01 # D_CAT + 4207 66 9 2.2087 3.633782e+00 1.260249e+01 1.513122e+01 # D_CAO + 4208 66 10 2.2087 4.659679e+00 1.144520e+01 1.515944e+01 # D_CAM + 4209 66 11 2.2087 6.048098e+00 1.166352e+01 1.514231e+01 # D_CAP + 4210 66 10 2.2087 6.679406e+00 1.293199e+01 1.508589e+01 # D_CAM + 4211 66 9 2.2087 5.745163e+00 1.400436e+01 1.499702e+01 # D_CAO + 4212 66 12 2.2087 3.272467e+00 1.507011e+01 1.507186e+01 # D_CTT + 4213 67 8 2.2087 -7.524398e+00 1.363409e+01 6.251126e+00 # D_CAT + 4214 67 9 2.2087 -6.212593e+00 1.401576e+01 5.758874e+00 # D_CAO + 4215 67 10 2.2087 -5.542283e+00 1.314840e+01 4.963570e+00 # D_CAM + 4216 67 11 2.2087 -6.222991e+00 1.191188e+01 4.488661e+00 # D_CAP + 4217 67 10 2.2087 -7.426139e+00 1.162827e+01 4.987931e+00 # D_CAM + 4218 67 9 2.2087 -8.139256e+00 1.241451e+01 5.861542e+00 # D_CAO + 4219 67 12 2.2087 -8.335945e+00 1.466878e+01 7.147256e+00 # D_CTT + 4220 68 8 2.2087 1.110112e+01 1.106584e+01 5.914530e+00 # D_CAT + 4221 68 9 2.2087 1.160819e+01 9.874357e+00 5.215997e+00 # D_CAO + 4222 68 10 2.2087 1.215421e+01 8.797617e+00 6.095167e+00 # D_CAM + 4223 68 11 2.2087 1.216355e+01 8.883785e+00 7.456816e+00 # D_CAP + 4224 68 10 2.2087 1.170359e+01 1.000267e+01 8.058614e+00 # D_CAM + 4225 68 9 2.2087 1.125221e+01 1.110873e+01 7.259785e+00 # D_CAO + 4226 68 12 2.2087 1.061634e+01 1.204798e+01 4.977202e+00 # D_CTT + 4227 69 8 2.2087 -5.279401e+00 1.088162e+01 8.384940e-01 # D_CAT + 4228 69 9 2.2087 -5.569727e+00 9.487059e+00 7.838803e-01 # D_CAO + 4229 69 10 2.2087 -6.655430e+00 8.918571e+00 1.488320e+00 # D_CAM + 4230 69 11 2.2087 -7.548754e+00 9.794243e+00 2.085278e+00 # D_CAP + 4231 69 10 2.2087 -7.276531e+00 1.133751e+01 2.009862e+00 # D_CAM + 4232 69 9 2.2087 -6.157622e+00 1.169351e+01 1.375832e+00 # D_CAO + 4233 69 12 2.2087 -3.968394e+00 1.144014e+01 9.485929e-02 # D_CTT + 4234 70 8 2.2087 9.144387e+00 7.208364e+00 1.078652e+01 # D_CAT + 4235 70 9 2.2087 8.546864e+00 7.462639e+00 9.442095e+00 # D_CAO + 4236 70 10 2.2087 7.637504e+00 6.391140e+00 8.999356e+00 # D_CAM + 4237 70 11 2.2087 7.569138e+00 5.134948e+00 9.558846e+00 # D_CAP + 4238 70 10 2.2087 8.335571e+00 4.941288e+00 1.076527e+01 # D_CAM + 4239 70 9 2.2087 9.083868e+00 5.949560e+00 1.144435e+01 # D_CAO + 4240 70 12 2.2087 9.924636e+00 8.298557e+00 1.137499e+01 # D_CTT + 4241 71 8 2.2087 5.288352e-01 -5.325402e+00 1.148594e+00 # D_CAT + 4242 71 9 2.2087 5.913617e-01 -6.593487e+00 5.209645e-01 # D_CAO + 4243 71 10 2.2087 1.496968e+00 -6.606447e+00 -6.030160e-01 # D_CAM + 4244 71 11 2.2087 2.235865e+00 -5.522218e+00 -8.712054e-01 # D_CAP + 4245 71 10 2.2087 2.237566e+00 -4.256036e+00 -1.520478e-01 # D_CAM + 4246 71 9 2.2087 1.326551e+00 -4.277789e+00 9.663041e-01 # D_CAO + 4247 71 12 2.2087 -5.194847e-01 -5.215410e+00 2.437921e+00 # D_CTT + 4248 72 8 2.2087 -1.111411e+01 -6.148325e+00 8.895764e+00 # D_CAT + 4249 72 9 2.2087 -1.059710e+01 -6.049123e+00 1.030310e+01 # D_CAO + 4250 72 10 2.2087 -1.103748e+01 -4.926729e+00 1.099811e+01 # D_CAM + 4251 72 11 2.2087 -1.183746e+01 -3.968209e+00 1.031976e+01 # D_CAP + 4252 72 10 2.2087 -1.209344e+01 -4.008480e+00 8.920625e+00 # D_CAM + 4253 72 9 2.2087 -1.171555e+01 -5.141375e+00 8.210451e+00 # D_CAO + 4254 72 12 2.2087 -1.066374e+01 -7.508040e+00 8.123600e+00 # D_CTT + 4255 73 8 2.2087 -9.142060e+00 -1.170685e+01 4.549897e+00 # D_CAT + 4256 73 9 2.2087 -8.462162e+00 -1.066957e+01 5.402676e+00 # D_CAO + 4257 73 10 2.2087 -7.220938e+00 -1.063004e+01 5.755666e+00 # D_CAM + 4258 73 11 2.2087 -6.344189e+00 -1.171942e+01 5.201067e+00 # D_CAP + 4259 73 10 2.2087 -6.983648e+00 -1.265445e+01 4.435332e+00 # D_CAM + 4260 73 9 2.2087 -8.256619e+00 -1.279580e+01 4.168279e+00 # D_CAO + 4261 73 12 2.2087 -1.058148e+01 -1.142496e+01 4.232227e+00 # D_CTT + 4262 74 8 2.2087 1.155624e+01 -7.664834e+00 -1.489353e+01 # D_CAT + 4263 74 9 2.2087 1.106015e+01 -6.437895e+00 -1.476566e+01 # D_CAO + 4264 74 10 2.2087 1.187967e+01 -5.275675e+00 -1.511215e+01 # D_CAM + 4265 74 11 2.2087 1.319130e+01 -5.472504e+00 -1.544308e+01 # D_CAP + 4266 74 10 2.2087 1.371256e+01 -6.732815e+00 -1.542445e+01 # D_CAM + 4267 74 9 2.2087 1.298060e+01 -7.916311e+00 -1.509905e+01 # D_CAO + 4268 74 12 2.2087 1.060925e+01 -8.865645e+00 -1.456146e+01 # D_CTT + 4269 75 8 2.2087 5.102037e-01 1.622176e+00 -1.399195e+01 # D_CAT + 4270 75 9 2.2087 4.718595e-02 9.062198e-01 -1.278764e+01 # D_CAO + 4271 75 10 2.2087 9.196263e-01 5.409435e-01 -1.186968e+01 # D_CAM + 4272 75 11 2.2087 2.371749e+00 8.248263e-01 -1.216023e+01 # D_CAP + 4273 75 10 2.2087 2.681713e+00 1.318353e+00 -1.335211e+01 # D_CAM + 4274 75 9 2.2087 1.800593e+00 1.807389e+00 -1.432050e+01 # D_CAO + 4275 75 12 2.2087 -6.409934e-01 2.014255e+00 -1.513374e+01 # D_CTT + 4276 76 8 2.2087 -1.445437e+01 -4.590994e+00 9.289676e+00 # D_CAT + 4277 76 9 2.2087 -1.460584e+01 -4.576104e+00 7.867738e+00 # D_CAO + 4278 76 10 2.2087 -1.494067e+01 -3.533663e+00 7.227308e+00 # D_CAM + 4279 76 11 2.2087 -1.517422e+01 -2.306502e+00 7.826354e+00 # D_CAP + 4280 76 10 2.2087 -1.500039e+01 -2.308506e+00 9.350831e+00 # D_CAM + 4281 76 9 2.2087 -1.466855e+01 -3.437038e+00 1.000205e+01 # D_CAO + 4282 76 12 2.2087 -1.411675e+01 -5.855063e+00 1.016002e+01 # D_CTT + 4283 77 8 2.2087 -1.376594e+00 1.286809e+01 -1.506130e+01 # D_CAT + 4284 77 9 2.2087 -2.647178e+00 1.337669e+01 -1.510283e+01 # D_CAO + 4285 77 10 2.2087 -3.802761e+00 1.243402e+01 -1.520939e+01 # D_CAM + 4286 77 11 2.2087 -3.640967e+00 1.102651e+01 -1.514931e+01 # D_CAP + 4287 77 10 2.2087 -2.276753e+00 1.057528e+01 -1.509276e+01 # D_CAM + 4288 77 9 2.2087 -1.229914e+00 1.137149e+01 -1.507980e+01 # D_CAO + 4289 77 12 2.2087 -2.180869e-01 1.376070e+01 -1.505689e+01 # D_CTT + 4290 78 8 2.2087 -1.451447e+01 -1.143524e+01 -1.241044e+00 # D_CAT + 4291 78 9 2.2087 -1.509938e+01 -1.011439e+01 -1.656011e+00 # D_CAO + 4292 78 10 2.2087 -1.511363e+01 -9.148229e+00 -6.146988e-01 # D_CAM + 4293 78 11 2.2087 -1.469988e+01 -9.462885e+00 6.907064e-01 # D_CAP + 4294 78 10 2.2087 -1.408676e+01 -1.079498e+01 1.021652e+00 # D_CAM + 4295 78 9 2.2087 -1.409653e+01 -1.182335e+01 -4.255921e-02 # D_CAO + 4296 78 12 2.2087 -1.444872e+01 -1.248395e+01 -2.412518e+00 # D_CTT + 4297 79 8 2.2087 1.506266e-01 -1.129829e+01 1.270568e+01 # D_CAT + 4298 79 9 2.2087 -8.013469e-01 -1.182204e+01 1.191081e+01 # D_CAO + 4299 79 10 2.2087 -1.560879e+00 -1.096108e+01 1.099951e+01 # D_CAM + 4300 79 11 2.2087 -1.066507e+00 -9.627328e+00 1.096990e+01 # D_CAP + 4301 79 10 2.2087 -1.917936e-01 -9.164697e+00 1.175984e+01 # D_CAM + 4302 79 9 2.2087 4.583412e-01 -1.005184e+01 1.263831e+01 # D_CAO + 4303 79 12 2.2087 8.934034e-01 -1.225468e+01 1.372423e+01 # D_CTT + 4304 80 8 2.2087 -9.559274e+00 1.291032e+01 -8.739875e+00 # D_CAT + 4305 80 9 2.2087 -8.349778e+00 1.277718e+01 -8.122281e+00 # D_CAO + 4306 80 10 2.2087 -7.240120e+00 1.207677e+01 -8.637668e+00 # D_CAM + 4307 80 11 2.2087 -7.440329e+00 1.154283e+01 -9.971075e+00 # D_CAP + 4308 80 10 2.2087 -8.501653e+00 1.166495e+01 -1.067505e+01 # D_CAM + 4309 80 9 2.2087 -9.675474e+00 1.237032e+01 -1.004842e+01 # D_CAO + 4310 80 12 2.2087 -1.073612e+01 1.356498e+01 -8.121812e+00 # D_CTT + 4311 81 8 2.2087 -1.075893e+01 1.385169e+01 1.011522e+01 # D_CAT + 4312 81 9 2.2087 -1.013962e+01 1.296713e+01 1.114153e+01 # D_CAO + 4313 81 10 2.2087 -1.074237e+01 1.166439e+01 1.120746e+01 # D_CAM + 4314 81 11 2.2087 -1.172662e+01 1.132054e+01 1.017270e+01 # D_CAP + 4315 81 10 2.2087 -1.205078e+01 1.217558e+01 9.167670e+00 # D_CAM + 4316 81 9 2.2087 -1.156507e+01 1.345388e+01 9.186553e+00 # D_CAO + 4317 81 12 2.2087 -1.018432e+01 1.527120e+01 1.006299e+01 # D_CTT + 4318 82 8 2.2087 -9.946386e+00 -3.825859e+00 2.487489e-01 # D_CAT + 4319 82 9 2.2087 -1.047169e+01 -2.419262e+00 1.898465e-01 # D_CAO + 4320 82 10 2.2087 -1.046303e+01 -1.738574e+00 -8.243700e-01 # D_CAM + 4321 82 11 2.2087 -9.724921e+00 -2.090417e+00 -2.035189e+00 # D_CAP + 4322 82 10 2.2087 -8.918100e+00 -3.369140e+00 -1.956527e+00 # D_CAM + 4323 82 9 2.2087 -9.070489e+00 -4.186247e+00 -8.909172e-01 # D_CAO + 4324 82 12 2.2087 -1.012687e+01 -4.724811e+00 1.360842e+00 # D_CTT + 4325 83 8 2.2087 -1.096803e+01 -9.358837e+00 -3.982528e+00 # D_CAT + 4326 83 9 2.2087 -9.801605e+00 -8.666708e+00 -3.742843e+00 # D_CAO + 4327 83 10 2.2087 -9.754794e+00 -7.763632e+00 -2.639220e+00 # D_CAM + 4328 83 11 2.2087 -1.091224e+01 -7.668721e+00 -1.795919e+00 # D_CAP + 4329 83 10 2.2087 -1.198930e+01 -8.479043e+00 -2.044204e+00 # D_CAM + 4330 83 9 2.2087 -1.198028e+01 -9.272261e+00 -3.175978e+00 # D_CAO + 4331 83 12 2.2087 -1.078230e+01 -1.023164e+01 -5.274908e+00 # D_CTT + 4332 84 8 2.2087 -1.452766e+01 1.404750e+01 8.660443e+00 # D_CAT + 4333 84 9 2.2087 -1.508037e+01 1.265830e+01 8.484259e+00 # D_CAO + 4334 84 10 2.2087 -1.497955e+01 1.165839e+01 9.520709e+00 # D_CAM + 4335 84 11 2.2087 -1.447013e+01 1.198283e+01 1.074597e+01 # D_CAP + 4336 84 10 2.2087 -1.382461e+01 1.324630e+01 1.098076e+01 # D_CAM + 4337 84 9 2.2087 -1.398451e+01 1.417712e+01 9.901025e+00 # D_CAO + 4338 84 12 2.2087 -1.471298e+01 1.499484e+01 7.617356e+00 # D_CTT + 4339 85 8 2.2087 -4.324693e+00 -1.495346e+01 1.001930e+01 # D_CAT + 4340 85 9 2.2087 -4.976001e+00 -1.508962e+01 1.119694e+01 # D_CAO + 4341 85 10 2.2087 -6.480788e+00 -1.510184e+01 1.103849e+01 # D_CAM + 4342 85 11 2.2087 -7.069537e+00 -1.513534e+01 9.762031e+00 # D_CAP + 4343 85 10 2.2087 -6.332980e+00 -1.513148e+01 8.617031e+00 # D_CAM + 4344 85 9 2.2087 -4.980143e+00 -1.496533e+01 8.727339e+00 # D_CAO + 4345 85 12 2.2087 -2.737092e+00 -1.493520e+01 1.009574e+01 # D_CTT + 4346 86 8 2.2087 -7.720608e+00 8.215834e+00 1.384557e+01 # D_CAT + 4347 86 9 2.2087 -7.960323e+00 8.990969e+00 1.502719e+01 # D_CAO + 4348 86 10 2.2087 -8.137470e+00 1.024519e+01 1.495323e+01 # D_CAM + 4349 86 11 2.2087 -8.204574e+00 1.096194e+01 1.368213e+01 # D_CAP + 4350 86 10 2.2087 -8.075871e+00 1.023989e+01 1.263619e+01 # D_CAM + 4351 86 9 2.2087 -7.884071e+00 8.841839e+00 1.269004e+01 # D_CAO + 4352 86 12 2.2087 -7.509104e+00 6.732247e+00 1.395357e+01 # D_CTT + 4353 87 8 2.2087 -5.665335e+00 -1.459034e+00 -1.311373e+01 # D_CAT + 4354 87 9 2.2087 -4.514214e+00 -1.961608e+00 -1.232224e+01 # D_CAO + 4355 87 10 2.2087 -3.201673e+00 -1.512472e+00 -1.287599e+01 # D_CAM + 4356 87 11 2.2087 -3.072328e+00 -7.029978e-01 -1.399833e+01 # D_CAP + 4357 87 10 2.2087 -4.364208e+00 -2.735310e-01 -1.473620e+01 # D_CAM + 4358 87 9 2.2087 -5.645748e+00 -6.725096e-01 -1.426725e+01 # D_CAO + 4359 87 12 2.2087 -6.972179e+00 -1.891864e+00 -1.241040e+01 # D_CTT + 4360 88 8 2.2087 -1.742823e+00 -9.889126e+00 -1.436830e+01 # D_CAT + 4361 88 9 2.2087 -2.326604e+00 -1.127075e+01 -1.437567e+01 # D_CAO + 4362 88 10 2.2087 -1.727006e+00 -1.234595e+01 -1.397656e+01 # D_CAM + 4363 88 11 2.2087 -4.520616e-01 -1.229808e+01 -1.304817e+01 # D_CAP + 4364 88 10 2.2087 1.304583e-01 -1.106727e+01 -1.280472e+01 # D_CAM + 4365 88 9 2.2087 -6.174149e-01 -9.919161e+00 -1.342399e+01 # D_CAO + 4366 88 12 2.2087 -2.408511e+00 -8.850806e+00 -1.488601e+01 # D_CTT + 4367 89 8 2.2087 -1.213770e+01 -1.087996e+01 1.501959e+01 # D_CAT + 4368 89 9 2.2087 -1.177560e+01 -9.518570e+00 1.513343e+01 # D_CAO + 4369 89 10 2.2087 -1.274976e+01 -8.613998e+00 1.506005e+01 # D_CAM + 4370 89 11 2.2087 -1.415279e+01 -8.835180e+00 1.497389e+01 # D_CAP + 4371 89 10 2.2087 -1.446866e+01 -1.030328e+01 1.511991e+01 # D_CAM + 4372 89 9 2.2087 -1.347736e+01 -1.123813e+01 1.508116e+01 # D_CAO + 4373 89 12 2.2087 -1.111939e+01 -1.194312e+01 1.505397e+01 # D_CTT + 4374 90 8 2.2087 1.876593e+00 -7.281444e+00 -1.396436e+01 # D_CAT + 4375 90 9 2.2087 1.815492e+00 -6.875037e+00 -1.240796e+01 # D_CAO + 4376 90 10 2.2087 1.067377e+00 -5.888492e+00 -1.203806e+01 # D_CAM + 4377 90 11 2.2087 3.135120e-01 -5.117979e+00 -1.297065e+01 # D_CAP + 4378 90 10 2.2087 3.139255e-01 -5.418746e+00 -1.432915e+01 # D_CAM + 4379 90 9 2.2087 1.050526e+00 -6.525934e+00 -1.470457e+01 # D_CAO + 4380 90 12 2.2087 2.659240e+00 -8.463498e+00 -1.435888e+01 # D_CTT + 4381 91 8 2.2087 -5.671039e+00 1.124634e+01 -4.041408e+00 # D_CAT + 4382 91 9 2.2087 -5.015115e+00 9.991413e+00 -4.140459e+00 # D_CAO + 4383 91 10 2.2087 -5.325183e+00 9.138689e+00 -5.198136e+00 # D_CAM + 4384 91 11 2.2087 -6.354861e+00 9.389137e+00 -5.972210e+00 # D_CAP + 4385 91 10 2.2087 -7.053706e+00 1.055199e+01 -5.997833e+00 # D_CAM + 4386 91 9 2.2087 -6.725311e+00 1.154215e+01 -4.886000e+00 # D_CAO + 4387 91 12 2.2087 -5.289853e+00 1.223942e+01 -3.018622e+00 # D_CTT + 4388 92 8 2.2087 1.434156e+01 -1.519087e+01 -4.943129e+00 # D_CAT + 4389 92 9 2.2087 1.294968e+01 -1.518227e+01 -5.249149e+00 # D_CAO + 4390 92 10 2.2087 1.260384e+01 -1.506931e+01 -6.564804e+00 # D_CAM + 4391 92 11 2.2087 1.349549e+01 -1.514933e+01 -7.693584e+00 # D_CAP + 4392 92 10 2.2087 1.484056e+01 -1.508400e+01 -7.330506e+00 # D_CAM + 4393 92 9 2.2087 1.530728e+01 -1.527068e+01 -6.093679e+00 # D_CAO + 4394 92 12 2.2087 1.486798e+01 -1.528305e+01 -3.610711e+00 # D_CTT + 4395 93 8 2.2087 -1.234038e+01 -9.598420e+00 1.181049e+01 # D_CAT + 4396 93 9 2.2087 -1.345114e+01 -1.037693e+01 1.138697e+01 # D_CAO + 4397 93 10 2.2087 -1.477544e+01 -9.934430e+00 1.167220e+01 # D_CAM + 4398 93 11 2.2087 -1.488494e+01 -8.667650e+00 1.222440e+01 # D_CAP + 4399 93 10 2.2087 -1.383395e+01 -7.939890e+00 1.267957e+01 # D_CAM + 4400 93 9 2.2087 -1.253096e+01 -8.289048e+00 1.220134e+01 # D_CAO + 4401 93 12 2.2087 -1.106482e+01 -1.005946e+01 1.125308e+01 # D_CTT + 4402 94 8 2.2087 1.306728e+01 -1.381385e+01 2.949192e+00 # D_CAT + 4403 94 9 2.2087 1.209140e+01 -1.287335e+01 3.237587e+00 # D_CAO + 4404 94 10 2.2087 1.075854e+01 -1.319432e+01 2.850118e+00 # D_CAM + 4405 94 11 2.2087 1.057916e+01 -1.431306e+01 2.016343e+00 # D_CAP + 4406 94 10 2.2087 1.153768e+01 -1.526854e+01 1.697026e+00 # D_CAM + 4407 94 9 2.2087 1.288535e+01 -1.486545e+01 2.167619e+00 # D_CAO + 4408 94 12 2.2087 1.462922e+01 -1.350469e+01 3.470942e+00 # D_CTT + 4409 95 8 2.2087 6.143900e+00 -1.164755e+01 -1.508897e+01 # D_CAT + 4410 95 9 2.2087 7.415621e+00 -1.143542e+01 -1.510229e+01 # D_CAO + 4411 95 10 2.2087 8.338716e+00 -1.260378e+01 -1.517862e+01 # D_CAM + 4412 95 11 2.2087 7.698660e+00 -1.380530e+01 -1.509331e+01 # D_CAP + 4413 95 10 2.2087 6.319772e+00 -1.399237e+01 -1.509144e+01 # D_CAM + 4414 95 9 2.2087 5.637999e+00 -1.281561e+01 -1.508196e+01 # D_CAO + 4415 95 12 2.2087 5.229457e+00 -1.027779e+01 -1.509445e+01 # D_CTT + 4416 96 8 2.2087 7.975188e+00 -6.084054e+00 6.017217e+00 # D_CAT + 4417 96 9 2.2087 7.995353e+00 -4.793237e+00 6.840993e+00 # D_CAO + 4418 96 10 2.2087 7.229047e+00 -3.771458e+00 6.458249e+00 # D_CAM + 4419 96 11 2.2087 6.447554e+00 -3.872727e+00 5.383162e+00 # D_CAP + 4420 96 10 2.2087 6.264213e+00 -5.146865e+00 4.530466e+00 # D_CAM + 4421 96 9 2.2087 7.047955e+00 -6.158491e+00 5.016303e+00 # D_CAO + 4422 96 12 2.2087 8.900173e+00 -7.148359e+00 6.426046e+00 # D_CTT + 4423 97 8 2.2087 1.157373e+01 -1.138033e+01 -4.461851e+00 # D_CAT + 4424 97 9 2.2087 1.167655e+01 -1.190880e+01 -5.721868e+00 # D_CAO + 4425 97 10 2.2087 1.107480e+01 -1.090830e+01 -6.700941e+00 # D_CAM + 4426 97 11 2.2087 1.045716e+01 -9.855508e+00 -6.454235e+00 # D_CAP + 4427 97 10 2.2087 1.051673e+01 -9.325578e+00 -5.066737e+00 # D_CAM + 4428 97 9 2.2087 1.109400e+01 -1.021453e+01 -4.157224e+00 # D_CAO + 4429 97 12 2.2087 1.217016e+01 -1.230798e+01 -3.327524e+00 # D_CTT + 4430 98 8 2.2087 1.094061e+01 -1.041293e+01 7.869164e+00 # D_CAT + 4431 98 9 2.2087 9.687267e+00 -1.086261e+01 7.233555e+00 # D_CAO + 4432 98 10 2.2087 9.818990e+00 -1.192215e+01 6.286321e+00 # D_CAM + 4433 98 11 2.2087 1.081702e+01 -1.261232e+01 6.028335e+00 # D_CAP + 4434 98 10 2.2087 1.223012e+01 -1.211120e+01 6.695482e+00 # D_CAM + 4435 98 9 2.2087 1.217343e+01 -1.112364e+01 7.593275e+00 # D_CAO + 4436 98 12 2.2087 1.100254e+01 -9.203311e+00 8.781820e+00 # D_CTT + 4437 99 8 2.2087 5.933417e+00 -1.269599e+01 -5.676694e+00 # D_CAT + 4438 99 9 2.2087 6.080468e+00 -1.219749e+01 -6.775340e+00 # D_CAO + 4439 99 10 2.2087 5.871271e+00 -1.074224e+01 -6.979322e+00 # D_CAM + 4440 99 11 2.2087 5.472799e+00 -9.927811e+00 -5.719824e+00 # D_CAP + 4441 99 10 2.2087 5.177450e+00 -1.067467e+01 -4.537848e+00 # D_CAM + 4442 99 9 2.2087 5.459003e+00 -1.212796e+01 -4.442623e+00 # D_CAO + 4443 99 12 2.2087 6.136126e+00 -1.426327e+01 -5.491184e+00 # D_CTT + 4444 100 8 2.2087 6.381943e-01 7.345014e+00 2.909981e-01 # D_CAT + 4445 100 9 2.2087 -6.410937e-01 6.709273e+00 4.256883e-01 # D_CAO + 4446 100 10 2.2087 -6.657454e-01 5.578416e+00 1.450323e+00 # D_CAM + 4447 100 11 2.2087 3.787367e-01 5.312596e+00 2.283217e+00 # D_CAP + 4448 100 10 2.2087 1.465208e+00 6.029458e+00 2.002590e+00 # D_CAM + 4449 100 9 2.2087 1.690080e+00 7.164882e+00 1.131123e+00 # D_CAO + 4450 100 12 2.2087 6.601853e-01 8.381092e+00 -7.064650e-01 # D_CTT + 4451 101 8 2.2087 3.672908e+00 9.341090e+00 -1.049933e+01 # D_CAT + 4452 101 9 2.2087 3.072565e+00 9.082475e+00 -1.178760e+01 # D_CAO + 4453 101 10 2.2087 2.967267e+00 7.600860e+00 -1.217579e+01 # D_CAM + 4454 101 11 2.2087 3.674791e+00 6.691368e+00 -1.124409e+01 # D_CAP + 4455 101 10 2.2087 4.357989e+00 7.031806e+00 -1.019329e+01 # D_CAM + 4456 101 9 2.2087 4.407098e+00 8.332612e+00 -9.799597e+00 # D_CAO + 4457 101 12 2.2087 3.747937e+00 1.080992e+01 -1.001127e+01 # D_CTT + 4458 102 8 2.2087 5.793451e+00 1.804479e+00 -1.151277e+01 # D_CAT + 4459 102 9 2.2087 6.741218e+00 1.190382e+00 -1.216190e+01 # D_CAO + 4460 102 10 2.2087 7.168032e+00 -2.714107e-01 -1.194035e+01 # D_CAM + 4461 102 11 2.2087 6.602184e+00 -8.377656e-01 -1.070788e+01 # D_CAP + 4462 102 10 2.2087 5.626549e+00 -1.142412e-01 -9.938505e+00 # D_CAM + 4463 102 9 2.2087 5.230460e+00 1.111896e+00 -1.042719e+01 # D_CAO + 4464 102 12 2.2087 5.393244e+00 3.074686e+00 -1.190535e+01 # D_CTT + 4465 103 8 2.2087 1.444265e+01 -6.072795e+00 1.163696e+01 # D_CAT + 4466 103 9 2.2087 1.405105e+01 -7.141898e+00 1.252115e+01 # D_CAO + 4467 103 10 2.2087 1.447536e+01 -6.930945e+00 1.390439e+01 # D_CAM + 4468 103 11 2.2087 1.511890e+01 -5.710398e+00 1.437437e+01 # D_CAP + 4469 103 10 2.2087 1.537026e+01 -4.649941e+00 1.336543e+01 # D_CAM + 4470 103 9 2.2087 1.504352e+01 -4.969080e+00 1.205788e+01 # D_CAO + 4471 103 12 2.2087 1.409713e+01 -6.226805e+00 1.025537e+01 # D_CTT + 4472 104 8 2.2087 -2.473098e+00 1.409213e+01 1.410772e+01 # D_CAT + 4473 104 9 2.2087 -1.159888e+00 1.435044e+01 1.453998e+01 # D_CAO + 4474 104 10 2.2087 -9.405950e-02 1.400461e+01 1.350283e+01 # D_CAM + 4475 104 11 2.2087 -3.712319e-01 1.325430e+01 1.233983e+01 # D_CAP + 4476 104 10 2.2087 -1.704019e+00 1.283277e+01 1.209324e+01 # D_CAM + 4477 104 9 2.2087 -2.832230e+00 1.325048e+01 1.306035e+01 # D_CAO + 4478 104 12 2.2087 -3.546119e+00 1.445362e+01 1.524727e+01 # D_CTT + 4479 105 8 2.2087 -1.341667e+01 9.621813e-01 7.959273e+00 # D_CAT + 4480 105 9 2.2087 -1.274925e+01 -2.188973e-01 7.627819e+00 # D_CAO + 4481 105 10 2.2087 -1.328301e+01 -8.808230e-01 6.305245e+00 # D_CAM + 4482 105 11 2.2087 -1.423989e+01 -2.112845e-01 5.589500e+00 # D_CAP + 4483 105 10 2.2087 -1.479597e+01 1.156978e+00 6.088747e+00 # D_CAM + 4484 105 9 2.2087 -1.431277e+01 1.595188e+00 7.252252e+00 # D_CAO + 4485 105 12 2.2087 -1.287127e+01 1.597234e+00 9.273751e+00 # D_CTT + 4486 106 8 2.2087 -1.089910e+01 -1.505941e+01 -2.194359e+00 # D_CAT + 4487 106 9 2.2087 -9.549635e+00 -1.536556e+01 -2.212174e+00 # D_CAO + 4488 106 10 2.2087 -8.708293e+00 -1.538514e+01 -1.185993e+00 # D_CAM + 4489 106 11 2.2087 -9.328061e+00 -1.531380e+01 1.303998e-01 # D_CAP + 4490 106 10 2.2087 -1.080574e+01 -1.514078e+01 2.003949e-01 # D_CAM + 4491 106 9 2.2087 -1.150721e+01 -1.502524e+01 -9.341929e-01 # D_CAO + 4492 106 12 2.2087 -1.169292e+01 -1.499414e+01 -3.401149e+00 # D_CTT + 4493 107 8 2.2087 1.487248e+01 -8.633459e+00 3.789133e+00 # D_CAT + 4494 107 9 2.2087 1.447192e+01 -9.613452e+00 2.908679e+00 # D_CAO + 4495 107 10 2.2087 1.466720e+01 -9.357767e+00 1.509384e+00 # D_CAM + 4496 107 11 2.2087 1.513904e+01 -8.167698e+00 1.146399e+00 # D_CAP + 4497 107 10 2.2087 1.555008e+01 -7.124560e+00 2.149379e+00 # D_CAM + 4498 107 9 2.2087 1.525809e+01 -7.471081e+00 3.390970e+00 # D_CAO + 4499 107 12 2.2087 1.470026e+01 -8.950552e+00 5.295909e+00 # D_CTT + 4500 108 8 2.2087 7.108909e+00 -1.149067e+00 1.435667e+01 # D_CAT + 4501 108 9 2.2087 5.799517e+00 -8.222683e-01 1.374515e+01 # D_CAO + 4502 108 10 2.2087 5.427741e+00 4.807344e-01 1.380221e+01 # D_CAM + 4503 108 11 2.2087 6.146022e+00 1.441102e+00 1.441086e+01 # D_CAP + 4504 108 10 2.2087 7.403457e+00 1.153399e+00 1.498786e+01 # D_CAM + 4505 108 9 2.2087 7.751264e+00 -2.799801e-01 1.495968e+01 # D_CAO + 4506 108 12 2.2087 7.567885e+00 -2.591973e+00 1.422282e+01 # D_CTT + 4507 109 8 2.2087 -5.035773e+00 -8.676369e+00 -5.201293e+00 # D_CAT + 4508 109 9 2.2087 -5.436960e+00 -9.487131e+00 -6.127424e+00 # D_CAO + 4509 109 10 2.2087 -4.718719e+00 -9.633905e+00 -7.396903e+00 # D_CAM + 4510 109 11 2.2087 -3.589209e+00 -8.946432e+00 -7.562025e+00 # D_CAP + 4511 109 10 2.2087 -3.177317e+00 -8.004219e+00 -6.525846e+00 # D_CAM + 4512 109 9 2.2087 -3.924691e+00 -7.899596e+00 -5.295592e+00 # D_CAO + 4513 109 12 2.2087 -5.869374e+00 -8.593666e+00 -3.872276e+00 # D_CTT + 4514 110 8 2.2087 7.251410e-01 -1.310138e+01 9.947292e+00 # D_CAT + 4515 110 9 2.2087 -9.364451e-02 -1.245610e+01 9.135524e+00 # D_CAO + 4516 110 10 2.2087 1.515286e-01 -1.097863e+01 8.983142e+00 # D_CAM + 4517 110 11 2.2087 1.047190e+00 -1.034649e+01 9.756100e+00 # D_CAP + 4518 110 10 2.2087 1.931373e+00 -1.117169e+01 1.052269e+01 # D_CAM + 4519 110 9 2.2087 1.806766e+00 -1.253585e+01 1.073750e+01 # D_CAO + 4520 110 12 2.2087 6.099006e-01 -1.470011e+01 1.009658e+01 # D_CTT + 4521 111 8 2.2087 -1.284529e+01 -8.632408e-01 -9.126159e+00 # D_CAT + 4522 111 9 2.2087 -1.282976e+01 -3.940715e-01 -7.655599e+00 # D_CAO + 4523 111 10 2.2087 -1.343218e+01 -1.053449e+00 -6.593966e+00 # D_CAM + 4524 111 11 2.2087 -1.398299e+01 -2.273113e+00 -6.940106e+00 # D_CAP + 4525 111 10 2.2087 -1.414241e+01 -2.759316e+00 -8.129482e+00 # D_CAM + 4526 111 9 2.2087 -1.358409e+01 -2.104318e+00 -9.225051e+00 # D_CAO + 4527 111 12 2.2087 -1.226003e+01 -7.148180e-02 -1.015654e+01 # D_CTT + 4528 112 8 2.2087 3.671742e+00 -1.295690e+01 1.854950e+00 # D_CAT + 4529 112 9 2.2087 3.008889e+00 -1.261387e+01 5.883441e-01 # D_CAO + 4530 112 10 2.2087 3.873634e+00 -1.221880e+01 -5.303230e-01 # D_CAM + 4531 112 11 2.2087 5.204925e+00 -1.218862e+01 -3.170346e-01 # D_CAP + 4532 112 10 2.2087 5.857588e+00 -1.261322e+01 9.478072e-01 # D_CAM + 4533 112 9 2.2087 5.151723e+00 -1.277773e+01 2.010295e+00 # D_CAO + 4534 112 12 2.2087 2.849771e+00 -1.331113e+01 3.054461e+00 # D_CTT + 4535 113 8 2.2087 2.634569e+00 -3.758960e+00 1.057964e+01 # D_CAT + 4536 113 9 2.2087 3.405764e+00 -2.591148e+00 1.042444e+01 # D_CAO + 4537 113 10 2.2087 3.151387e+00 -1.463799e+00 1.121714e+01 # D_CAM + 4538 113 11 2.2087 2.163939e+00 -1.513094e+00 1.220202e+01 # D_CAP + 4539 113 10 2.2087 1.574405e+00 -2.695255e+00 1.250744e+01 # D_CAM + 4540 113 9 2.2087 1.797725e+00 -3.941384e+00 1.165873e+01 # D_CAO + 4541 113 12 2.2087 2.949546e+00 -4.936013e+00 9.828874e+00 # D_CTT + 4542 114 8 2.2087 1.486580e+01 7.762054e+00 -6.878052e+00 # D_CAT + 4543 114 9 2.2087 1.481462e+01 9.009460e+00 -7.537481e+00 # D_CAO + 4544 114 10 2.2087 1.497335e+01 9.119850e+00 -8.915794e+00 # D_CAM + 4545 114 11 2.2087 1.512341e+01 7.878461e+00 -9.636201e+00 # D_CAP + 4546 114 10 2.2087 1.509160e+01 6.733595e+00 -9.067900e+00 # D_CAM + 4547 114 9 2.2087 1.489641e+01 6.662272e+00 -7.665194e+00 # D_CAO + 4548 114 12 2.2087 1.472604e+01 7.596990e+00 -5.399200e+00 # D_CTT + 4549 115 8 2.2087 8.865594e+00 3.311298e-01 8.697532e+00 # D_CAT + 4550 115 9 2.2087 9.405823e+00 -8.725399e-01 8.920947e+00 # D_CAO + 4551 115 10 2.2087 1.042555e+01 -1.178576e+00 9.953076e+00 # D_CAM + 4552 115 11 2.2087 1.091833e+01 3.868139e-03 1.074107e+01 # D_CAP + 4553 115 10 2.2087 1.037595e+01 1.291714e+00 1.051774e+01 # D_CAM + 4554 115 9 2.2087 9.449439e+00 1.405843e+00 9.487594e+00 # D_CAO + 4555 115 12 2.2087 7.912800e+00 6.181091e-01 7.691531e+00 # D_CTT + 4556 116 8 2.2087 -8.718443e+00 2.606268e+00 4.510749e+00 # D_CAT + 4557 116 9 2.2087 -9.746131e+00 3.577796e+00 4.443714e+00 # D_CAO + 4558 116 10 2.2087 -1.114356e+01 3.159310e+00 4.657946e+00 # D_CAM + 4559 116 11 2.2087 -1.141046e+01 1.853080e+00 4.878253e+00 # D_CAP + 4560 116 10 2.2087 -1.042736e+01 9.423004e-01 4.840130e+00 # D_CAM + 4561 116 9 2.2087 -9.151802e+00 1.285890e+00 4.801135e+00 # D_CAO + 4562 116 12 2.2087 -7.390754e+00 3.090414e+00 4.382105e+00 # D_CTT + 4563 117 8 2.2087 9.849334e+00 7.534938e+00 3.796648e+00 # D_CAT + 4564 117 9 2.2087 1.036847e+01 6.402461e+00 4.476906e+00 # D_CAO + 4565 117 10 2.2087 1.056497e+01 6.424129e+00 5.805236e+00 # D_CAM + 4566 117 11 2.2087 1.000908e+01 7.433135e+00 6.573590e+00 # D_CAP + 4567 117 10 2.2087 9.587811e+00 8.629861e+00 5.980570e+00 # D_CAM + 4568 117 9 2.2087 9.352046e+00 8.615617e+00 4.552561e+00 # D_CAO + 4569 117 12 2.2087 9.688381e+00 7.506019e+00 2.313775e+00 # D_CTT + 4570 118 8 2.2087 -1.443102e+01 3.246090e+00 1.798281e+00 # D_CAT + 4571 118 9 2.2087 -1.530617e+01 4.451331e+00 1.431326e+00 # D_CAO + 4572 118 10 2.2087 -1.470637e+01 5.583102e+00 1.324702e+00 # D_CAM + 4573 118 11 2.2087 -1.328500e+01 5.786983e+00 1.675799e+00 # D_CAP + 4574 118 10 2.2087 -1.246017e+01 4.687568e+00 2.039976e+00 # D_CAM + 4575 118 9 2.2087 -1.309744e+01 3.366291e+00 2.179668e+00 # D_CAO + 4576 118 12 2.2087 -1.497653e+01 1.821311e+00 2.013648e+00 # D_CTT + 4577 119 8 2.2087 -1.110830e+01 -1.424299e+01 6.720171e+00 # D_CAT + 4578 119 9 2.2087 -1.190191e+01 -1.438868e+01 5.665004e+00 # D_CAO + 4579 119 10 2.2087 -1.144705e+01 -1.482113e+01 4.491411e+00 # D_CAM + 4580 119 11 2.2087 -1.021378e+01 -1.528059e+01 4.321840e+00 # D_CAP + 4581 119 10 2.2087 -9.203826e+00 -1.519740e+01 5.615545e+00 # D_CAM + 4582 119 9 2.2087 -9.891110e+00 -1.465405e+01 6.654881e+00 # D_CAO + 4583 119 12 2.2087 -1.169314e+01 -1.374293e+01 7.998694e+00 # D_CTT + 4584 120 8 2.2087 1.836862e+00 2.859113e+00 6.962165e+00 # D_CAT + 4585 120 9 2.2087 1.301733e+00 3.868785e+00 7.820886e+00 # D_CAO + 4586 120 10 2.2087 2.859575e-01 3.529678e+00 8.626364e+00 # D_CAM + 4587 120 11 2.2087 -3.210950e-01 2.304372e+00 8.553599e+00 # D_CAP + 4588 120 10 2.2087 2.196124e-01 1.352953e+00 7.785201e+00 # D_CAM + 4589 120 9 2.2087 1.398543e+00 1.562171e+00 7.111769e+00 # D_CAO + 4590 120 12 2.2087 3.150945e+00 3.133021e+00 6.117003e+00 # D_CTT + 4591 121 8 2.2087 -2.822830e+00 -5.138908e+00 -1.784139e+00 # D_CAT + 4592 121 9 2.2087 -2.750872e+00 -4.376967e+00 -2.918361e+00 # D_CAO + 4593 121 10 2.2087 -3.306669e+00 -3.026669e+00 -2.844646e+00 # D_CAM + 4594 121 11 2.2087 -3.679335e+00 -2.589766e+00 -1.562625e+00 # D_CAP + 4595 121 10 2.2087 -3.811829e+00 -3.393866e+00 -5.225712e-01 # D_CAM + 4596 121 9 2.2087 -3.185574e+00 -4.650055e+00 -5.507353e-01 # D_CAO + 4597 121 12 2.2087 -2.189086e+00 -6.615741e+00 -1.785780e+00 # D_CTT + 4598 122 8 2.2087 1.357191e+01 2.694519e+00 -7.918814e+00 # D_CAT + 4599 122 9 2.2087 1.276696e+01 3.401714e+00 -7.002048e+00 # D_CAO + 4600 122 10 2.2087 1.131267e+01 3.313587e+00 -7.054761e+00 # D_CAM + 4601 122 11 2.2087 1.074454e+01 2.520629e+00 -8.018733e+00 # D_CAP + 4602 122 10 2.2087 1.144463e+01 1.747826e+00 -8.846745e+00 # D_CAM + 4603 122 9 2.2087 1.289860e+01 1.945721e+00 -8.912330e+00 # D_CAO + 4604 122 12 2.2087 1.508227e+01 2.789343e+00 -7.804868e+00 # D_CTT + 4605 123 8 2.2087 3.784709e+00 7.804717e+00 -4.701779e+00 # D_CAT + 4606 123 9 2.2087 2.556760e+00 7.460919e+00 -4.041001e+00 # D_CAO + 4607 123 10 2.2087 1.441274e+00 7.747551e+00 -4.733772e+00 # D_CAM + 4608 123 11 2.2087 1.272299e+00 8.370205e+00 -6.021070e+00 # D_CAP + 4609 123 10 2.2087 2.685029e+00 8.772156e+00 -6.596105e+00 # D_CAM + 4610 123 9 2.2087 3.806196e+00 8.417628e+00 -5.819117e+00 # D_CAO + 4611 123 12 2.2087 5.123477e+00 7.555903e+00 -3.942407e+00 # D_CTT + 4612 124 8 2.2087 8.034861e+00 6.367825e+00 -1.306581e+01 # D_CAT + 4613 124 9 2.2087 6.705429e+00 6.687047e+00 -1.296611e+01 # D_CAO + 4614 124 10 2.2087 6.287629e+00 8.023259e+00 -1.302539e+01 # D_CAM + 4615 124 11 2.2087 7.330229e+00 9.076196e+00 -1.314635e+01 # D_CAP + 4616 124 10 2.2087 8.558697e+00 8.705747e+00 -1.322607e+01 # D_CAM + 4617 124 9 2.2087 9.031726e+00 7.272258e+00 -1.331223e+01 # D_CAO + 4618 124 12 2.2087 8.557703e+00 4.876338e+00 -1.301600e+01 # D_CTT + 4619 125 8 2.2087 -2.553250e+00 9.810311e+00 8.408797e+00 # D_CAT + 4620 125 9 2.2087 -1.446734e+00 1.055168e+01 8.346345e+00 # D_CAO + 4621 125 10 2.2087 -4.806220e-01 1.029770e+01 7.404267e+00 # D_CAM + 4622 125 11 2.2087 -6.267014e-01 9.267484e+00 6.519317e+00 # D_CAP + 4623 125 10 2.2087 -1.716988e+00 8.455129e+00 6.698565e+00 # D_CAM + 4624 125 9 2.2087 -2.659789e+00 8.784481e+00 7.554922e+00 # D_CAO + 4625 125 12 2.2087 -3.561254e+00 1.007752e+01 9.471640e+00 # D_CTT + 4626 126 8 2.2087 1.448194e+01 3.011002e+00 2.435980e+00 # D_CAT + 4627 126 9 2.2087 1.506976e+01 3.362920e+00 3.690291e+00 # D_CAO + 4628 126 10 2.2087 1.453057e+01 4.541851e+00 4.214367e+00 # D_CAM + 4629 126 11 2.2087 1.359575e+01 5.178292e+00 3.475571e+00 # D_CAP + 4630 126 10 2.2087 1.304736e+01 4.829296e+00 2.298273e+00 # D_CAM + 4631 126 9 2.2087 1.353868e+01 3.579671e+00 1.787813e+00 # D_CAO + 4632 126 12 2.2087 1.496008e+01 1.510294e+00 1.865008e+00 # D_CTT + 4633 127 8 2.2087 -1.379138e+01 1.518048e+01 -5.210721e+00 # D_CAT + 4634 127 9 2.2087 -1.237912e+01 1.516317e+01 -4.812548e+00 # D_CAO + 4635 127 10 2.2087 -1.219118e+01 1.533476e+01 -3.382872e+00 # D_CAM + 4636 127 11 2.2087 -1.315612e+01 1.526436e+01 -2.522905e+00 # D_CAP + 4637 127 10 2.2087 -1.462061e+01 1.518982e+01 -2.998294e+00 # D_CAM + 4638 127 9 2.2087 -1.481499e+01 1.514915e+01 -4.443755e+00 # D_CAO + 4639 127 12 2.2087 -1.397402e+01 1.503423e+01 -6.703498e+00 # D_CTT + 4640 128 8 2.2087 -1.455968e+00 8.317551e+00 3.000007e+00 # D_CAT + 4641 128 9 2.2087 -2.875650e+00 8.561072e+00 2.671967e+00 # D_CAO + 4642 128 10 2.2087 -3.742264e+00 7.419131e+00 2.928091e+00 # D_CAM + 4643 128 11 2.2087 -3.162533e+00 6.399130e+00 3.553111e+00 # D_CAP + 4644 128 10 2.2087 -1.876633e+00 6.186334e+00 3.916663e+00 # D_CAM + 4645 128 9 2.2087 -9.317842e-01 7.299213e+00 3.604420e+00 # D_CAO + 4646 128 12 2.2087 -4.400819e-01 9.511870e+00 2.612533e+00 # D_CTT + 4647 129 8 2.2087 -1.497037e+01 1.150441e+01 -1.432451e+00 # D_CAT + 4648 129 9 2.2087 -1.469110e+01 1.248073e+01 -5.265969e-01 # D_CAO + 4649 129 10 2.2087 -1.472596e+01 1.213352e+01 7.653421e-01 # D_CAM + 4650 129 11 2.2087 -1.490148e+01 1.075967e+01 1.217935e+00 # D_CAP + 4651 129 10 2.2087 -1.511193e+01 9.868109e+00 1.956675e-01 # D_CAM + 4652 129 9 2.2087 -1.524091e+01 1.019187e+01 -1.146381e+00 # D_CAO + 4653 129 12 2.2087 -1.500458e+01 1.192110e+01 -3.006679e+00 # D_CTT + 4654 130 8 2.2087 7.171473e+00 4.271122e+00 2.141556e+00 # D_CAT + 4655 130 9 2.2087 6.629622e+00 2.925431e+00 1.767249e+00 # D_CAO + 4656 130 10 2.2087 6.589474e+00 1.862534e+00 2.615437e+00 # D_CAM + 4657 130 11 2.2087 7.177376e+00 2.095505e+00 3.839733e+00 # D_CAP + 4658 130 10 2.2087 7.839187e+00 3.242488e+00 4.235856e+00 # D_CAM + 4659 130 9 2.2087 7.803092e+00 4.339374e+00 3.343562e+00 # D_CAO + 4660 130 12 2.2087 6.984709e+00 5.379554e+00 1.074829e+00 # D_CTT + 4661 131 8 2.2087 -5.428095e+00 1.138428e+01 7.443760e+00 # D_CAT + 4662 131 9 2.2087 -4.114357e+00 1.182615e+01 7.234689e+00 # D_CAO + 4663 131 10 2.2087 -3.220348e+00 1.126506e+01 6.284220e+00 # D_CAM + 4664 131 11 2.2087 -3.647468e+00 1.005340e+01 5.575124e+00 # D_CAP + 4665 131 10 2.2087 -5.110131e+00 9.665495e+00 5.778208e+00 # D_CAM + 4666 131 9 2.2087 -5.760518e+00 1.029278e+01 6.634021e+00 # D_CAO + 4667 131 12 2.2087 -6.240340e+00 1.205525e+01 8.426049e+00 # D_CTT + 4668 132 8 2.2087 1.086827e+01 4.336904e+00 -1.083313e+01 # D_CAT + 4669 132 9 2.2087 9.925502e+00 4.896980e+00 -9.921344e+00 # D_CAO + 4670 132 10 2.2087 8.631730e+00 4.265699e+00 -9.573937e+00 # D_CAM + 4671 132 11 2.2087 8.366183e+00 3.017882e+00 -1.012984e+01 # D_CAP + 4672 132 10 2.2087 9.302790e+00 2.488057e+00 -1.099245e+01 # D_CAM + 4673 132 9 2.2087 1.060593e+01 3.100180e+00 -1.125968e+01 # D_CAO + 4674 132 12 2.2087 1.209106e+01 4.945755e+00 -1.113454e+01 # D_CTT + 4675 133 8 2.2087 -9.156310e+00 6.172088e+00 -5.680929e+00 # D_CAT + 4676 133 9 2.2087 -7.832508e+00 5.802417e+00 -5.937726e+00 # D_CAO + 4677 133 10 2.2087 -7.595435e+00 4.450191e+00 -6.234004e+00 # D_CAM + 4678 133 11 2.2087 -8.583600e+00 3.528941e+00 -6.359531e+00 # D_CAP + 4679 133 10 2.2087 -9.880497e+00 3.839619e+00 -6.190077e+00 # D_CAM + 4680 133 9 2.2087 -1.024929e+01 5.232399e+00 -5.816588e+00 # D_CAO + 4681 133 12 2.2087 -9.476120e+00 7.684231e+00 -5.350605e+00 # D_CTT + 4682 134 8 2.2087 5.612633e+00 -2.936998e+00 -5.642315e+00 # D_CAT + 4683 134 9 2.2087 4.364643e+00 -3.559364e+00 -5.342989e+00 # D_CAO + 4684 134 10 2.2087 4.041833e+00 -3.791120e+00 -4.001054e+00 # D_CAM + 4685 134 11 2.2087 4.915013e+00 -3.312394e+00 -3.049850e+00 # D_CAP + 4686 134 10 2.2087 6.018705e+00 -2.709127e+00 -3.340965e+00 # D_CAM + 4687 134 9 2.2087 6.494590e+00 -2.559288e+00 -4.634251e+00 # D_CAO + 4688 134 12 2.2087 6.043548e+00 -2.804933e+00 -7.086913e+00 # D_CTT + 4689 135 8 2.2087 -1.889148e-01 -1.106552e+01 -1.041076e-01 # D_CAT + 4690 135 9 2.2087 9.859514e-01 -1.044220e+01 -5.507760e-01 # D_CAO + 4691 135 10 2.2087 1.326152e+00 -1.050529e+01 -2.025760e+00 # D_CAM + 4692 135 11 2.2087 5.293989e-01 -1.116660e+01 -2.823239e+00 # D_CAP + 4693 135 10 2.2087 -5.815368e-01 -1.192983e+01 -2.300616e+00 # D_CAM + 4694 135 9 2.2087 -9.221111e-01 -1.178387e+01 -9.570643e-01 # D_CAO + 4695 135 12 2.2087 -5.789980e-01 -1.100686e+01 1.341122e+00 # D_CTT + 4696 136 8 2.2087 8.654949e+00 -1.176522e+01 -4.531542e+00 # D_CAT + 4697 136 9 2.2087 8.969215e+00 -1.315839e+01 -4.306893e+00 # D_CAO + 4698 136 10 2.2087 9.260683e+00 -1.389367e+01 -5.549506e+00 # D_CAM + 4699 136 11 2.2087 9.131610e+00 -1.334429e+01 -6.758498e+00 # D_CAP + 4700 136 10 2.2087 8.773473e+00 -1.199325e+01 -6.988073e+00 # D_CAM + 4701 136 9 2.2087 8.533939e+00 -1.121324e+01 -5.798416e+00 # D_CAO + 4702 136 12 2.2087 8.316890e+00 -1.091796e+01 -3.279662e+00 # D_CTT + 4703 137 8 2.2087 7.385244e+00 5.971645e+00 1.359537e+01 # D_CAT + 4704 137 9 2.2087 6.512020e+00 5.635375e+00 1.260056e+01 # D_CAO + 4705 137 10 2.2087 6.154560e+00 6.624071e+00 1.161554e+01 # D_CAM + 4706 137 11 2.2087 6.669702e+00 7.972656e+00 1.186061e+01 # D_CAP + 4707 137 10 2.2087 7.411141e+00 8.259551e+00 1.286232e+01 # D_CAM + 4708 137 9 2.2087 7.762719e+00 7.378174e+00 1.375836e+01 # D_CAO + 4709 137 12 2.2087 7.730624e+00 4.972233e+00 1.451658e+01 # D_CTT + 4710 138 8 2.2087 5.721255e+00 7.246903e+00 3.950953e+00 # D_CAT + 4711 138 9 2.2087 5.075680e+00 6.486992e+00 3.071307e+00 # D_CAO + 4712 138 10 2.2087 5.061697e+00 5.081331e+00 3.308521e+00 # D_CAM + 4713 138 11 2.2087 5.572752e+00 4.554949e+00 4.522364e+00 # D_CAP + 4714 138 10 2.2087 5.968248e+00 5.429989e+00 5.398674e+00 # D_CAM + 4715 138 9 2.2087 6.242966e+00 6.743642e+00 5.172693e+00 # D_CAO + 4716 138 12 2.2087 5.715984e+00 8.930643e+00 3.712932e+00 # D_CTT + 4717 139 8 2.2087 -1.371561e+01 5.509512e+00 -1.332063e+01 # D_CAT + 4718 139 9 2.2087 -1.435683e+01 6.437268e+00 -1.424217e+01 # D_CAO + 4719 139 10 2.2087 -1.349599e+01 7.482195e+00 -1.465129e+01 # D_CAM + 4720 139 11 2.2087 -1.223447e+01 7.497502e+00 -1.437586e+01 # D_CAP + 4721 139 10 2.2087 -1.162104e+01 6.400226e+00 -1.360298e+01 # D_CAM + 4722 139 9 2.2087 -1.239506e+01 5.535727e+00 -1.288838e+01 # D_CAO + 4723 139 12 2.2087 -1.453912e+01 4.257275e+00 -1.279708e+01 # D_CTT + 4724 140 8 2.2087 4.194727e+00 8.992209e+00 7.227950e+00 # D_CAT + 4725 140 9 2.2087 4.268555e+00 7.714506e+00 6.831995e+00 # D_CAO + 4726 140 10 2.2087 3.632661e+00 7.305916e+00 5.544211e+00 # D_CAM + 4727 140 11 2.2087 2.868572e+00 8.138759e+00 4.830676e+00 # D_CAP + 4728 140 10 2.2087 2.738969e+00 9.621199e+00 5.303315e+00 # D_CAM + 4729 140 9 2.2087 3.474988e+00 9.869055e+00 6.551961e+00 # D_CAO + 4730 140 12 2.2087 4.732570e+00 9.392983e+00 8.492130e+00 # D_CTT + 4731 141 8 2.2087 1.369572e+01 -2.571750e+00 1.371029e+01 # D_CAT + 4732 141 9 2.2087 1.285191e+01 -3.638892e+00 1.395313e+01 # D_CAO + 4733 141 10 2.2087 1.223637e+01 -4.314671e+00 1.294758e+01 # D_CAM + 4734 141 11 2.2087 1.228227e+01 -3.750611e+00 1.168597e+01 # D_CAP + 4735 141 10 2.2087 1.308212e+01 -2.814555e+00 1.132234e+01 # D_CAM + 4736 141 9 2.2087 1.376189e+01 -2.104520e+00 1.235128e+01 # D_CAO + 4737 141 12 2.2087 1.434959e+01 -1.804351e+00 1.486880e+01 # D_CTT + 4738 142 8 2.2087 -3.363836e+00 -1.018560e+01 -2.089283e+00 # D_CAT + 4739 142 9 2.2087 -2.421338e+00 -9.571767e+00 -1.491410e+00 # D_CAO + 4740 142 10 2.2087 -1.275222e+00 -9.307374e+00 -2.410341e+00 # D_CAM + 4741 142 11 2.2087 -1.339075e+00 -9.396933e+00 -3.836033e+00 # D_CAP + 4742 142 10 2.2087 -2.545986e+00 -9.965583e+00 -4.211266e+00 # D_CAM + 4743 142 9 2.2087 -3.512314e+00 -1.033206e+01 -3.385042e+00 # D_CAO + 4744 142 12 2.2087 -4.435800e+00 -1.072607e+01 -1.104453e+00 # D_CTT + 4745 143 8 2.2087 -3.321035e+00 -1.622296e+00 3.447961e+00 # D_CAT + 4746 143 9 2.2087 -3.722448e+00 -4.398940e-01 4.220161e+00 # D_CAO + 4747 143 10 2.2087 -5.001521e+00 -4.675789e-01 4.848072e+00 # D_CAM + 4748 143 11 2.2087 -5.783987e+00 -1.659714e+00 4.548500e+00 # D_CAP + 4749 143 10 2.2087 -5.259482e+00 -2.786312e+00 3.917709e+00 # D_CAM + 4750 143 9 2.2087 -3.994555e+00 -2.650205e+00 3.399896e+00 # D_CAO + 4751 143 12 2.2087 -1.841866e+00 -1.541415e+00 2.829371e+00 # D_CTT + 4752 144 8 2.2087 -1.324022e+01 1.572715e+00 1.347292e+01 # D_CAT + 4753 144 9 2.2087 -1.192911e+01 1.119183e+00 1.378540e+01 # D_CAO + 4754 144 10 2.2087 -1.173386e+01 2.239006e-02 1.468217e+01 # D_CAM + 4755 144 11 2.2087 -1.284196e+01 -7.324285e-01 1.519341e+01 # D_CAP + 4756 144 10 2.2087 -1.414386e+01 -3.180576e-01 1.480034e+01 # D_CAM + 4757 144 9 2.2087 -1.433206e+01 8.186312e-01 1.399386e+01 # D_CAO + 4758 144 12 2.2087 -1.342711e+01 2.671487e+00 1.246950e+01 # D_CTT + 4759 145 8 2.2087 2.703347e+00 -1.391397e+01 -9.278908e+00 # D_CAT + 4760 145 9 2.2087 1.661771e+00 -1.466395e+01 -9.904779e+00 # D_CAO + 4761 145 10 2.2087 4.518434e-01 -1.392720e+01 -1.028030e+01 # D_CAM + 4762 145 11 2.2087 4.236158e-01 -1.265597e+01 -1.026193e+01 # D_CAP + 4763 145 10 2.2087 1.520796e+00 -1.181526e+01 -9.739997e+00 # D_CAM + 4764 145 9 2.2087 2.646388e+00 -1.257184e+01 -9.303669e+00 # D_CAO + 4765 145 12 2.2087 3.902905e+00 -1.465900e+01 -8.795257e+00 # D_CTT + 4766 146 8 2.2087 -1.504927e+01 -1.357805e+01 4.159128e+00 # D_CAT + 4767 146 9 2.2087 -1.522255e+01 -1.476046e+01 4.834330e+00 # D_CAO + 4768 146 10 2.2087 -1.528004e+01 -1.463431e+01 6.334143e+00 # D_CAM + 4769 146 11 2.2087 -1.520550e+01 -1.332547e+01 6.859611e+00 # D_CAP + 4770 146 10 2.2087 -1.508844e+01 -1.228010e+01 6.156366e+00 # D_CAM + 4771 146 9 2.2087 -1.504173e+01 -1.235680e+01 4.785493e+00 # D_CAO + 4772 146 12 2.2087 -1.496733e+01 -1.380233e+01 2.591420e+00 # D_CTT + 4773 147 8 2.2087 -1.496737e+01 -6.999966e+00 -1.333202e+01 # D_CAT + 4774 147 9 2.2087 -1.516569e+01 -8.020965e+00 -1.236195e+01 # D_CAO + 4775 147 10 2.2087 -1.520651e+01 -7.485106e+00 -1.111991e+01 # D_CAM + 4776 147 11 2.2087 -1.510436e+01 -6.168422e+00 -1.076478e+01 # D_CAP + 4777 147 10 2.2087 -1.488138e+01 -5.184775e+00 -1.178358e+01 # D_CAM + 4778 147 9 2.2087 -1.483199e+01 -5.787912e+00 -1.315812e+01 # D_CAO + 4779 147 12 2.2087 -1.482861e+01 -7.654792e+00 -1.482715e+01 # D_CTT + 4780 148 8 2.2087 -9.021304e+00 -1.518024e+01 -1.204546e+01 # D_CAT + 4781 148 9 2.2087 -7.565744e+00 -1.525326e+01 -1.250883e+01 # D_CAO + 4782 148 10 2.2087 -6.636023e+00 -1.544117e+01 -1.156968e+01 # D_CAM + 4783 148 11 2.2087 -6.987522e+00 -1.525155e+01 -1.032190e+01 # D_CAP + 4784 148 10 2.2087 -8.202655e+00 -1.526632e+01 -9.642560e+00 # D_CAM + 4785 148 9 2.2087 -9.205860e+00 -1.520156e+01 -1.067017e+01 # D_CAO + 4786 148 12 2.2087 -1.014396e+01 -1.512585e+01 -1.292753e+01 # D_CTT + 4787 149 8 2.2087 -2.222605e+00 -8.285604e+00 1.501969e+01 # D_CAT + 4788 149 9 2.2087 -3.571672e+00 -8.227995e+00 1.519472e+01 # D_CAO + 4789 149 10 2.2087 -4.296137e+00 -9.275240e+00 1.549137e+01 # D_CAM + 4790 149 11 2.2087 -3.704961e+00 -1.043308e+01 1.568370e+01 # D_CAP + 4791 149 10 2.2087 -2.302808e+00 -1.068330e+01 1.551360e+01 # D_CAM + 4792 149 9 2.2087 -1.453008e+00 -9.589677e+00 1.520926e+01 # D_CAO + 4793 149 12 2.2087 -1.338699e+00 -7.072515e+00 1.460370e+01 # D_CTT + 4794 150 8 2.2087 6.072759e-01 6.500117e+00 -1.118416e+01 # D_CAT + 4795 150 9 2.2087 2.038819e-01 7.614361e+00 -1.181269e+01 # D_CAO + 4796 150 10 2.2087 6.905058e-02 7.585781e+00 -1.326382e+01 # D_CAM + 4797 150 11 2.2087 1.733491e-01 6.273861e+00 -1.396635e+01 # D_CAP + 4798 150 10 2.2087 5.227203e-01 5.245552e+00 -1.331028e+01 # D_CAM + 4799 150 9 2.2087 7.376204e-01 5.344259e+00 -1.189772e+01 # D_CAO + 4800 150 12 2.2087 8.316668e-01 6.586500e+00 -9.741476e+00 # D_CTT + 4801 151 8 2.2087 1.213041e+01 -1.371768e+01 -4.342325e-01 # D_CAT + 4802 151 9 2.2087 1.130124e+01 -1.276127e+01 2.090984e-01 # D_CAO + 4803 151 10 2.2087 9.953948e+00 -1.265192e+01 1.000161e-01 # D_CAM + 4804 151 11 2.2087 9.212364e+00 -1.367279e+01 -7.725929e-01 # D_CAP + 4805 151 10 2.2087 1.005237e+01 -1.474314e+01 -1.274471e+00 # D_CAM + 4806 151 9 2.2087 1.145829e+01 -1.473092e+01 -1.189037e+00 # D_CAO + 4807 151 12 2.2087 1.364338e+01 -1.380792e+01 -3.016293e-01 # D_CTT + 4808 152 8 2.2087 -1.493134e+01 2.350687e+00 -8.410044e+00 # D_CAT + 4809 152 9 2.2087 -1.502764e+01 1.912378e+00 -9.583418e+00 # D_CAO + 4810 152 10 2.2087 -1.543775e+01 5.204672e-01 -9.828409e+00 # D_CAM + 4811 152 11 2.2087 -1.575117e+01 -3.444544e-01 -8.856788e+00 # D_CAP + 4812 152 10 2.2087 -1.558087e+01 5.723269e-02 -7.493508e+00 # D_CAM + 4813 152 9 2.2087 -1.517372e+01 1.517475e+00 -7.312275e+00 # D_CAO + 4814 152 12 2.2087 -1.456069e+01 3.784761e+00 -7.946434e+00 # D_CTT + 4815 153 8 2.2087 -8.213280e+00 3.441670e+00 -1.037404e+01 # D_CAT + 4816 153 9 2.2087 -8.481553e+00 4.430270e+00 -1.135071e+01 # D_CAO + 4817 153 10 2.2087 -7.760581e+00 5.597062e+00 -1.156645e+01 # D_CAM + 4818 153 11 2.2087 -6.926992e+00 5.956457e+00 -1.054203e+01 # D_CAP + 4819 153 10 2.2087 -6.463489e+00 5.095240e+00 -9.549123e+00 # D_CAM + 4820 153 9 2.2087 -7.229454e+00 3.923358e+00 -9.473085e+00 # D_CAO + 4821 153 12 2.2087 -8.943864e+00 2.195904e+00 -1.024069e+01 # D_CTT + 4822 154 8 2.2087 7.123683e+00 1.349278e+01 -1.458591e+01 # D_CAT + 4823 154 9 2.2087 6.337207e+00 1.233185e+01 -1.514666e+01 # D_CAO + 4824 154 10 2.2087 5.010355e+00 1.237531e+01 -1.520648e+01 # D_CAM + 4825 154 11 2.2087 4.207983e+00 1.345999e+01 -1.502508e+01 # D_CAP + 4826 154 10 2.2087 4.926455e+00 1.463466e+01 -1.460691e+01 # D_CAM + 4827 154 9 2.2087 6.331297e+00 1.466468e+01 -1.449386e+01 # D_CAO + 4828 154 12 2.2087 8.479941e+00 1.352682e+01 -1.452523e+01 # D_CTT + 4829 155 8 2.2087 1.508053e+01 7.787609e+00 8.557595e+00 # D_CAT + 4830 155 9 2.2087 1.473659e+01 7.132229e+00 7.437068e+00 # D_CAO + 4831 155 10 2.2087 1.503479e+01 7.878948e+00 6.252998e+00 # D_CAM + 4832 155 11 2.2087 1.538902e+01 9.337577e+00 6.256254e+00 # D_CAP + 4833 155 10 2.2087 1.547174e+01 9.792036e+00 7.531514e+00 # D_CAM + 4834 155 9 2.2087 1.519744e+01 9.075427e+00 8.655538e+00 # D_CAO + 4835 155 12 2.2087 1.477858e+01 6.900852e+00 9.823802e+00 # D_CTT + 4836 156 8 2.2087 -6.134184e+00 -2.483156e+00 1.239881e+01 # D_CAT + 4837 156 9 2.2087 -5.185292e+00 -1.597198e+00 1.233920e+01 # D_CAO + 4838 156 10 2.2087 -5.497594e+00 -3.388445e-01 1.263835e+01 # D_CAM + 4839 156 11 2.2087 -6.709137e+00 5.843699e-02 1.291077e+01 # D_CAP + 4840 156 10 2.2087 -7.778060e+00 -8.217496e-01 1.295830e+01 # D_CAM + 4841 156 9 2.2087 -7.457710e+00 -2.186063e+00 1.275840e+01 # D_CAO + 4842 156 12 2.2087 -5.800118e+00 -3.963512e+00 1.196489e+01 # D_CTT + 4843 157 8 2.2087 5.378596e+00 -8.561556e+00 1.405251e+01 # D_CAT + 4844 157 9 2.2087 6.351586e+00 -8.826014e+00 1.314469e+01 # D_CAO + 4845 157 10 2.2087 7.031172e+00 -7.577710e+00 1.263045e+01 # D_CAM + 4846 157 11 2.2087 6.839833e+00 -6.426886e+00 1.329729e+01 # D_CAP + 4847 157 10 2.2087 5.722116e+00 -6.236888e+00 1.408348e+01 # D_CAM + 4848 157 9 2.2087 5.031408e+00 -7.275862e+00 1.466295e+01 # D_CAO + 4849 157 12 2.2087 4.460905e+00 -9.833457e+00 1.449649e+01 # D_CTT + 4850 158 8 2.2087 3.606648e-01 -7.703903e+00 4.514572e+00 # D_CAT + 4851 158 9 2.2087 1.534638e+00 -8.114707e+00 3.758106e+00 # D_CAO + 4852 158 10 2.2087 2.665635e+00 -7.254427e+00 3.858481e+00 # D_CAM + 4853 158 11 2.2087 2.535398e+00 -6.044669e+00 4.645069e+00 # D_CAP + 4854 158 10 2.2087 1.329927e+00 -5.794685e+00 5.280883e+00 # D_CAM + 4855 158 9 2.2087 2.658933e-01 -6.616744e+00 5.214928e+00 # D_CAO + 4856 158 12 2.2087 -7.896182e-01 -8.660406e+00 4.473658e+00 # D_CTT + 4857 159 8 2.2087 5.440039e+00 -9.955198e+00 2.216284e+00 # D_CAT + 4858 159 9 2.2087 4.490426e+00 -9.647355e+00 1.287211e+00 # D_CAO + 4859 159 10 2.2087 4.721170e+00 -9.396791e+00 -6.541913e-03 # D_CAM + 4860 159 11 2.2087 5.970631e+00 -9.512191e+00 -5.643630e-01 # D_CAP + 4861 159 10 2.2087 6.991936e+00 -9.768617e+00 2.895580e-01 # D_CAM + 4862 159 9 2.2087 6.884370e+00 -1.010736e+01 1.599087e+00 # D_CAO + 4863 159 12 2.2087 5.272588e+00 -1.024891e+01 3.662587e+00 # D_CTT + 4864 160 8 2.2087 5.140297e+00 1.636306e+00 -3.334067e+00 # D_CAT + 4865 160 9 2.2087 5.588409e+00 7.141085e-01 -4.295291e+00 # D_CAO + 4866 160 10 2.2087 4.741481e+00 6.553518e-02 -5.147960e+00 # D_CAM + 4867 160 11 2.2087 3.417666e+00 2.578964e-01 -5.071891e+00 # D_CAP + 4868 160 10 2.2087 2.917388e+00 1.253964e+00 -4.030940e+00 # D_CAM + 4869 160 9 2.2087 3.839627e+00 1.887462e+00 -3.238213e+00 # D_CAO + 4870 160 12 2.2087 6.102528e+00 2.358029e+00 -2.430464e+00 # D_CTT + 4871 161 8 2.2087 -7.996734e+00 -5.395721e+00 -6.599812e+00 # D_CAT + 4872 161 9 2.2087 -6.638360e+00 -5.818659e+00 -6.745293e+00 # D_CAO + 4873 161 10 2.2087 -5.798677e+00 -5.322676e+00 -7.732208e+00 # D_CAM + 4874 161 11 2.2087 -6.285548e+00 -4.226070e+00 -8.590955e+00 # D_CAP + 4875 161 10 2.2087 -7.597800e+00 -3.826607e+00 -8.496679e+00 # D_CAM + 4876 161 9 2.2087 -8.494329e+00 -4.379178e+00 -7.451773e+00 # D_CAO + 4877 161 12 2.2087 -8.939590e+00 -5.879969e+00 -5.587001e+00 # D_CTT + 4878 162 8 2.2087 1.286124e+01 6.776356e+00 1.487284e+01 # D_CAT + 4879 162 9 2.2087 1.174668e+01 6.032882e+00 1.505862e+01 # D_CAO + 4880 162 10 2.2087 1.183379e+01 4.702452e+00 1.530563e+01 # D_CAM + 4881 162 11 2.2087 1.308897e+01 4.023701e+00 1.531327e+01 # D_CAP + 4882 162 10 2.2087 1.426964e+01 4.791724e+00 1.505003e+01 # D_CAM + 4883 162 9 2.2087 1.416601e+01 6.217460e+00 1.479548e+01 # D_CAO + 4884 162 12 2.2087 1.291239e+01 8.279371e+00 1.455105e+01 # D_CTT + 4885 163 8 2.2087 -3.411355e+00 3.741282e+00 -1.357222e+01 # D_CAT + 4886 163 9 2.2087 -3.091404e+00 2.784639e+00 -1.271426e+01 # D_CAO + 4887 163 10 2.2087 -2.242079e+00 2.929490e+00 -1.158016e+01 # D_CAM + 4888 163 11 2.2087 -1.898283e+00 4.334832e+00 -1.128255e+01 # D_CAP + 4889 163 10 2.2087 -2.181402e+00 5.291981e+00 -1.221358e+01 # D_CAM + 4890 163 9 2.2087 -2.893242e+00 5.084659e+00 -1.336444e+01 # D_CAO + 4891 163 12 2.2087 -4.210567e+00 3.452342e+00 -1.484618e+01 # D_CTT + 4892 164 8 2.2087 -5.035312e+00 -4.670592e+00 -1.495163e+01 # D_CAT + 4893 164 9 2.2087 -5.093352e+00 -5.972221e+00 -1.496692e+01 # D_CAO + 4894 164 10 2.2087 -6.230623e+00 -6.642169e+00 -1.509715e+01 # D_CAM + 4895 164 11 2.2087 -7.495905e+00 -6.050124e+00 -1.524887e+01 # D_CAP + 4896 164 10 2.2087 -7.424231e+00 -4.698072e+00 -1.528849e+01 # D_CAM + 4897 164 9 2.2087 -6.173408e+00 -3.885371e+00 -1.510832e+01 # D_CAO + 4898 164 12 2.2087 -3.690159e+00 -3.867116e+00 -1.495272e+01 # D_CTT + 4899 165 8 2.2087 7.928431e+00 -6.026317e+00 -1.127494e+01 # D_CAT + 4900 165 9 2.2087 8.023117e+00 -7.157499e+00 -1.221406e+01 # D_CAO + 4901 165 10 2.2087 6.938850e+00 -7.908868e+00 -1.250056e+01 # D_CAM + 4902 165 11 2.2087 5.696822e+00 -7.603930e+00 -1.193861e+01 # D_CAP + 4903 165 10 2.2087 5.641468e+00 -6.543328e+00 -1.105843e+01 # D_CAM + 4904 165 9 2.2087 6.808868e+00 -5.751809e+00 -1.073200e+01 # D_CAO + 4905 165 12 2.2087 9.201102e+00 -5.392932e+00 -1.090714e+01 # D_CTT + 4906 166 8 2.2087 -1.114996e+00 2.295505e+00 3.041495e+00 # D_CAT + 4907 166 9 2.2087 -3.868378e-01 2.543933e+00 4.211368e+00 # D_CAO + 4908 166 10 2.2087 -9.804320e-01 2.968733e+00 5.296169e+00 # D_CAM + 4909 166 11 2.2087 -2.403248e+00 3.117083e+00 5.234245e+00 # D_CAP + 4910 166 10 2.2087 -3.202075e+00 2.898520e+00 4.159848e+00 # D_CAM + 4911 166 9 2.2087 -2.574144e+00 2.455109e+00 3.106613e+00 # D_CAO + 4912 166 12 2.2087 -3.681401e-01 1.784648e+00 1.854775e+00 # D_CTT + 4913 167 8 2.2087 1.997344e+00 1.353612e+01 -6.287792e+00 # D_CAT + 4914 167 9 2.2087 2.349180e+00 1.226658e+01 -6.116280e+00 # D_CAO + 4915 167 10 2.2087 1.932492e+00 1.153521e+01 -4.928316e+00 # D_CAM + 4916 167 11 2.2087 1.034438e+00 1.221013e+01 -4.076505e+00 # D_CAP + 4917 167 10 2.2087 6.928399e-01 1.352898e+01 -4.253006e+00 # D_CAM + 4918 167 9 2.2087 1.179643e+00 1.423105e+01 -5.327872e+00 # D_CAO + 4919 167 12 2.2087 2.477620e+00 1.434724e+01 -7.627236e+00 # D_CTT + 4920 168 8 2.2087 1.089315e+01 -1.097069e+01 1.123189e+01 # D_CAT + 4921 168 9 2.2087 1.122714e+01 -1.175513e+01 1.011258e+01 # D_CAO + 4922 168 10 2.2087 1.029397e+01 -1.221713e+01 9.323609e+00 # D_CAM + 4923 168 11 2.2087 8.953186e+00 -1.186764e+01 9.472119e+00 # D_CAP + 4924 168 10 2.2087 8.610253e+00 -1.101256e+01 1.040082e+01 # D_CAM + 4925 168 9 2.2087 9.497585e+00 -1.048812e+01 1.126452e+01 # D_CAO + 4926 168 12 2.2087 1.179579e+01 -1.035437e+01 1.217585e+01 # D_CTT + 4927 169 8 2.2087 -1.352684e+01 -9.757845e-01 -1.360672e+01 # D_CAT + 4928 169 9 2.2087 -1.250238e+01 -2.007368e+00 -1.366467e+01 # D_CAO + 4929 169 10 2.2087 -1.116725e+01 -1.537801e+00 -1.344272e+01 # D_CAM + 4930 169 11 2.2087 -1.094209e+01 -2.381634e-01 -1.299874e+01 # D_CAP + 4931 169 10 2.2087 -1.192567e+01 7.089428e-01 -1.301998e+01 # D_CAM + 4932 169 9 2.2087 -1.329160e+01 3.253776e-01 -1.316658e+01 # D_CAO + 4933 169 12 2.2087 -1.490371e+01 -1.423292e+00 -1.379673e+01 # D_CTT + 4934 170 8 2.2087 -9.799923e+00 8.638287e+00 8.043335e+00 # D_CAT + 4935 170 9 2.2087 -8.928379e+00 7.559274e+00 7.601199e+00 # D_CAO + 4936 170 10 2.2087 -9.443613e+00 6.616910e+00 6.768715e+00 # D_CAM + 4937 170 11 2.2087 -1.086120e+01 6.804263e+00 6.312501e+00 # D_CAP + 4938 170 10 2.2087 -1.162278e+01 7.835876e+00 6.602268e+00 # D_CAM + 4939 170 9 2.2087 -1.114072e+01 8.681975e+00 7.588585e+00 # D_CAO + 4940 170 12 2.2087 -9.200513e+00 9.681459e+00 9.024358e+00 # D_CTT + 4941 171 8 2.2087 -1.352098e+01 1.339217e+01 -1.171732e+01 # D_CAT + 4942 171 9 2.2087 -1.227444e+01 1.337890e+01 -1.210939e+01 # D_CAO + 4943 171 10 2.2087 -1.188394e+01 1.214341e+01 -1.267079e+01 # D_CAM + 4944 171 11 2.2087 -1.263662e+01 1.100709e+01 -1.294021e+01 # D_CAP + 4945 171 10 2.2087 -1.404952e+01 1.116788e+01 -1.233228e+01 # D_CAM + 4946 171 9 2.2087 -1.448274e+01 1.234191e+01 -1.187198e+01 # D_CAO + 4947 171 12 2.2087 -1.398443e+01 1.466141e+01 -1.102521e+01 # D_CTT + 4948 172 8 2.2087 1.390300e+01 2.419041e+00 1.303893e+01 # D_CAT + 4949 172 9 2.2087 1.290786e+01 1.497837e+00 1.327276e+01 # D_CAO + 4950 172 10 2.2087 1.147372e+01 1.905994e+00 1.328727e+01 # D_CAM + 4951 172 11 2.2087 1.119294e+01 3.248077e+00 1.316594e+01 # D_CAP + 4952 172 10 2.2087 1.217323e+01 4.176044e+00 1.295304e+01 # D_CAM + 4953 172 9 2.2087 1.361419e+01 3.815867e+00 1.285007e+01 # D_CAO + 4954 172 12 2.2087 1.532500e+01 2.045398e+00 1.285087e+01 # D_CTT + 4955 173 8 2.2087 -1.480826e+01 -2.142068e+00 -9.128959e-02 # D_CAT + 4956 173 9 2.2087 -1.401191e+01 -1.197311e+00 -6.003291e-01 # D_CAO + 4957 173 10 2.2087 -1.393310e+01 -1.092782e+00 -1.963201e+00 # D_CAM + 4958 173 11 2.2087 -1.457247e+01 -1.801947e+00 -2.856087e+00 # D_CAP + 4959 173 10 2.2087 -1.546250e+01 -2.820811e+00 -2.286883e+00 # D_CAM + 4960 173 9 2.2087 -1.560755e+01 -2.999829e+00 -9.141909e-01 # D_CAO + 4961 173 12 2.2087 -1.494680e+01 -2.324336e+00 1.509212e+00 # D_CTT + 4962 174 8 2.2087 1.152282e+01 6.362345e-01 -1.373087e+01 # D_CAT + 4963 174 9 2.2087 1.180813e+01 -1.893961e-02 -1.252368e+01 # D_CAO + 4964 174 10 2.2087 1.302034e+01 -1.015604e-01 -1.205971e+01 # D_CAM + 4965 174 11 2.2087 1.406782e+01 4.804797e-01 -1.251589e+01 # D_CAP + 4966 174 10 2.2087 1.402753e+01 1.254105e+00 -1.376903e+01 # D_CAM + 4967 174 9 2.2087 1.264013e+01 1.201055e+00 -1.446933e+01 # D_CAO + 4968 174 12 2.2087 1.032980e+01 7.645049e-01 -1.451265e+01 # D_CTT + 4969 175 8 2.2087 5.819424e+00 9.470978e+00 -1.186051e+00 # D_CAT + 4970 175 9 2.2087 6.746115e+00 1.008808e+01 -2.225032e+00 # D_CAO + 4971 175 10 2.2087 6.193551e+00 1.074316e+01 -3.184562e+00 # D_CAM + 4972 175 11 2.2087 4.685787e+00 1.101775e+01 -3.325005e+00 # D_CAP + 4973 175 10 2.2087 3.836764e+00 1.036841e+01 -2.281011e+00 # D_CAM + 4974 175 9 2.2087 4.432358e+00 9.683018e+00 -1.215345e+00 # D_CAO + 4975 175 12 2.2087 6.417094e+00 8.670421e+00 -1.140113e-01 # D_CTT + 4976 176 8 2.2087 -2.127140e+00 -1.489083e+01 7.691860e-01 # D_CAT + 4977 176 9 2.2087 -2.744374e+00 -1.470208e+01 -4.881356e-01 # D_CAO + 4978 176 10 2.2087 -4.136591e+00 -1.490088e+01 -5.668708e-01 # D_CAM + 4979 176 11 2.2087 -4.881166e+00 -1.508358e+01 7.475321e-01 # D_CAP + 4980 176 10 2.2087 -4.203039e+00 -1.525793e+01 1.816662e+00 # D_CAM + 4981 176 9 2.2087 -2.912903e+00 -1.505577e+01 1.862658e+00 # D_CAO + 4982 176 12 2.2087 -5.537716e-01 -1.469346e+01 8.297477e-01 # D_CTT + 4983 177 8 2.2087 9.522675e+00 -8.519474e+00 1.497916e+01 # D_CAT + 4984 177 9 2.2087 8.487886e+00 -7.609568e+00 1.511921e+01 # D_CAO + 4985 177 10 2.2087 8.807611e+00 -6.191709e+00 1.518217e+01 # D_CAM + 4986 177 11 2.2087 1.017990e+01 -5.795369e+00 1.527528e+01 # D_CAP + 4987 177 10 2.2087 1.099862e+01 -6.792430e+00 1.516298e+01 # D_CAM + 4988 177 9 2.2087 1.072637e+01 -8.048480e+00 1.502299e+01 # D_CAO + 4989 177 12 2.2087 9.076662e+00 -9.969849e+00 1.489080e+01 # D_CTT + 4990 178 8 2.2087 1.363384e+01 5.969737e+00 -1.392514e+01 # D_CAT + 4991 178 9 2.2087 1.292104e+01 4.828930e+00 -1.416111e+01 # D_CAO + 4992 178 10 2.2087 1.172813e+01 4.768940e+00 -1.489235e+01 # D_CAM + 4993 178 11 2.2087 1.131005e+01 6.007143e+00 -1.531867e+01 # D_CAP + 4994 178 10 2.2087 1.200538e+01 7.210135e+00 -1.494818e+01 # D_CAM + 4995 178 9 2.2087 1.319205e+01 7.124856e+00 -1.439982e+01 # D_CAO + 4996 178 12 2.2087 1.498921e+01 5.872400e+00 -1.306958e+01 # D_CTT + 4997 179 8 2.2087 7.402685e-01 8.852965e-01 1.431072e+01 # D_CAT + 4998 179 9 2.2087 7.124110e-02 -2.938742e-01 1.432914e+01 # D_CAO + 4999 179 10 2.2087 -1.083331e+00 -5.925564e-01 1.354343e+01 # D_CAM + 5000 179 11 2.2087 -1.480078e+00 3.828577e-01 1.261164e+01 # D_CAP + 5001 179 10 2.2087 -8.287880e-01 1.398452e+00 1.243828e+01 # D_CAM + 5002 179 9 2.2087 3.180128e-01 1.744030e+00 1.325919e+01 # D_CAO + 5003 179 12 2.2087 1.951111e+00 1.213260e+00 1.513250e+01 # D_CTT + 5004 180 8 2.2087 8.196443e+00 1.387062e+01 -8.392889e+00 # D_CAT + 5005 180 9 2.2087 9.095203e+00 1.311892e+01 -7.664546e+00 # D_CAO + 5006 180 10 2.2087 8.517922e+00 1.208173e+01 -6.885901e+00 # D_CAM + 5007 180 11 2.2087 7.105807e+00 1.176294e+01 -6.969767e+00 # D_CAP + 5008 180 10 2.2087 6.278860e+00 1.254498e+01 -7.696203e+00 # D_CAM + 5009 180 9 2.2087 6.979786e+00 1.372430e+01 -8.321631e+00 # D_CAO + 5010 180 12 2.2087 8.895880e+00 1.504143e+01 -9.148417e+00 # D_CTT + 5011 181 8 2.2087 1.445286e+01 -3.917295e+00 1.759850e+00 # D_CAT + 5012 181 9 2.2087 1.426705e+01 -4.255718e+00 3.169497e+00 # D_CAO + 5013 181 10 2.2087 1.362624e+01 -5.364732e+00 3.504857e+00 # D_CAM + 5014 181 11 2.2087 1.313089e+01 -6.252013e+00 2.464944e+00 # D_CAP + 5015 181 10 2.2087 1.336773e+01 -6.047563e+00 1.152938e+00 # D_CAM + 5016 181 9 2.2087 1.396739e+01 -4.825921e+00 8.908308e-01 # D_CAO + 5017 181 12 2.2087 1.506542e+01 -2.582439e+00 1.468930e+00 # D_CTT + 5018 182 8 2.2087 -7.046122e+00 3.207124e+00 -3.521272e+00 # D_CAT + 5019 182 9 2.2087 -5.904329e+00 3.926931e+00 -4.009257e+00 # D_CAO + 5020 182 10 2.2087 -6.017001e+00 5.311439e+00 -3.936741e+00 # D_CAM + 5021 182 11 2.2087 -7.014611e+00 6.009020e+00 -3.410135e+00 # D_CAP + 5022 182 10 2.2087 -8.053239e+00 5.390503e+00 -2.934954e+00 # D_CAM + 5023 182 9 2.2087 -8.081432e+00 4.056011e+00 -2.876626e+00 # D_CAO + 5024 182 12 2.2087 -7.166350e+00 1.895370e+00 -3.582863e+00 # D_CTT + 5025 183 8 2.2087 2.440719e+00 4.748142e+00 -7.667312e+00 # D_CAT + 5026 183 9 2.2087 1.245887e+00 4.716693e+00 -7.041846e+00 # D_CAO + 5027 183 10 2.2087 2.295521e-01 3.779792e+00 -7.571827e+00 # D_CAM + 5028 183 11 2.2087 6.474756e-01 3.039301e+00 -8.689751e+00 # D_CAP + 5029 183 10 2.2087 1.904421e+00 3.039213e+00 -9.370754e+00 # D_CAM + 5030 183 9 2.2087 2.843739e+00 3.917110e+00 -8.708605e+00 # D_CAO + 5031 183 12 2.2087 3.486905e+00 5.657529e+00 -7.108026e+00 # D_CTT + 5032 184 8 2.2087 2.537033e+00 -1.170510e+00 -1.387949e+00 # D_CAT + 5033 184 9 2.2087 2.420846e+00 -1.567504e+00 -2.803670e+00 # D_CAO + 5034 184 10 2.2087 1.275558e+00 -2.213308e+00 -3.115615e+00 # D_CAM + 5035 184 11 2.2087 1.926330e-01 -2.484907e+00 -2.337626e+00 # D_CAP + 5036 184 10 2.2087 2.680559e-01 -2.035516e+00 -9.941431e-01 # D_CAM + 5037 184 9 2.2087 1.327772e+00 -1.446609e+00 -5.061011e-01 # D_CAO + 5038 184 12 2.2087 3.727250e+00 -5.783135e-01 -9.014823e-01 # D_CTT + 5039 185 8 2.2087 6.514965e+00 1.237163e+01 7.995847e+00 # D_CAT + 5040 185 9 2.2087 6.412359e+00 1.290826e+01 9.276649e+00 # D_CAO + 5041 185 10 2.2087 5.496685e+00 1.396550e+01 9.438658e+00 # D_CAM + 5042 185 11 2.2087 4.707801e+00 1.446483e+01 8.473863e+00 # D_CAP + 5043 185 10 2.2087 4.914599e+00 1.398759e+01 7.211331e+00 # D_CAM + 5044 185 9 2.2087 5.677846e+00 1.293266e+01 7.035302e+00 # D_CAO + 5045 185 12 2.2087 7.430531e+00 1.118967e+01 7.655727e+00 # D_CTT + 5046 186 8 2.2087 -6.517506e+00 -1.312456e+00 -6.580994e+00 # D_CAT + 5047 186 9 2.2087 -7.248856e+00 -2.366037e+00 -5.901053e+00 # D_CAO + 5048 186 10 2.2087 -6.534076e+00 -3.290339e+00 -5.279422e+00 # D_CAM + 5049 186 11 2.2087 -5.102593e+00 -3.329806e+00 -5.359540e+00 # D_CAP + 5050 186 10 2.2087 -4.428605e+00 -2.242459e+00 -6.137188e+00 # D_CAM + 5051 186 9 2.2087 -5.181097e+00 -1.280090e+00 -6.703261e+00 # D_CAO + 5052 186 12 2.2087 -7.260049e+00 -1.021443e-01 -7.238598e+00 # D_CTT + 5053 187 8 2.2087 6.128445e+00 -8.350218e+00 7.468111e+00 # D_CAT + 5054 187 9 2.2087 6.938922e+00 -8.066703e+00 8.480235e+00 # D_CAO + 5055 187 10 2.2087 7.172411e+00 -6.644603e+00 8.872978e+00 # D_CAM + 5056 187 11 2.2087 6.311525e+00 -5.797181e+00 8.292255e+00 # D_CAP + 5057 187 10 2.2087 5.392479e+00 -6.084241e+00 7.233840e+00 # D_CAM + 5058 187 9 2.2087 5.291011e+00 -7.405356e+00 6.786170e+00 # D_CAO + 5059 187 12 2.2087 5.962585e+00 -9.869233e+00 6.907585e+00 # D_CTT + 5060 188 8 2.2087 -1.745492e+00 -8.337513e+00 -1.104063e+01 # D_CAT + 5061 188 9 2.2087 -2.059872e+00 -7.037204e+00 -1.159299e+01 # D_CAO + 5062 188 10 2.2087 -3.181093e+00 -6.927610e+00 -1.227613e+01 # D_CAM + 5063 188 11 2.2087 -4.094157e+00 -7.891403e+00 -1.235261e+01 # D_CAP + 5064 188 10 2.2087 -3.821174e+00 -9.177115e+00 -1.185656e+01 # D_CAM + 5065 188 9 2.2087 -2.719589e+00 -9.360977e+00 -1.115680e+01 # D_CAO + 5066 188 12 2.2087 -4.361604e-01 -8.613190e+00 -1.032175e+01 # D_CTT + 5067 189 8 2.2087 -6.452528e+00 -8.962086e+00 4.123737e+00 # D_CAT + 5068 189 9 2.2087 -7.282536e+00 -8.128554e+00 4.759200e+00 # D_CAO + 5069 189 10 2.2087 -6.883820e+00 -7.469575e+00 5.992643e+00 # D_CAM + 5070 189 11 2.2087 -5.606914e+00 -7.611843e+00 6.506143e+00 # D_CAP + 5071 189 10 2.2087 -4.714928e+00 -8.496557e+00 5.891949e+00 # D_CAM + 5072 189 9 2.2087 -5.001764e+00 -9.208931e+00 4.613802e+00 # D_CAO + 5073 189 12 2.2087 -6.709871e+00 -9.657044e+00 2.814856e+00 # D_CTT + 5074 190 8 2.2087 -1.586930e+00 1.309097e+01 -1.917128e+00 # D_CAT + 5075 190 9 2.2087 -1.710762e+00 1.441134e+01 -1.794676e+00 # D_CAO + 5076 190 10 2.2087 -2.305719e+00 1.503215e+01 -2.966438e+00 # D_CAM + 5077 190 11 2.2087 -2.693181e+00 1.439135e+01 -4.114244e+00 # D_CAP + 5078 190 10 2.2087 -2.480874e+00 1.304078e+01 -4.243762e+00 # D_CAM + 5079 190 9 2.2087 -1.934551e+00 1.237949e+01 -3.118308e+00 # D_CAO + 5080 190 12 2.2087 -8.806605e-01 1.232820e+01 -7.655503e-01 # D_CTT + 5081 191 8 2.2087 5.451942e+00 2.935446e+00 -6.201477e+00 # D_CAT + 5082 191 9 2.2087 4.972133e+00 2.046981e+00 -7.032979e+00 # D_CAO + 5083 191 10 2.2087 3.583812e+00 1.681412e+00 -7.114178e+00 # D_CAM + 5084 191 11 2.2087 2.628521e+00 2.404596e+00 -6.260667e+00 # D_CAP + 5085 191 10 2.2087 3.188699e+00 3.392791e+00 -5.360635e+00 # D_CAM + 5086 191 9 2.2087 4.412022e+00 3.663894e+00 -5.420657e+00 # D_CAO + 5087 191 12 2.2087 6.837810e+00 3.308378e+00 -6.051216e+00 # D_CTT + 5088 192 8 2.2087 -1.315745e+01 2.246582e+00 -2.004029e+00 # D_CAT + 5089 192 9 2.2087 -1.200440e+01 2.027574e+00 -1.391978e+00 # D_CAO + 5090 192 10 2.2087 -1.087349e+01 1.643974e+00 -2.000359e+00 # D_CAM + 5091 192 11 2.2087 -1.077887e+01 1.377092e+00 -3.331397e+00 # D_CAP + 5092 192 10 2.2087 -1.195313e+01 1.547420e+00 -4.098019e+00 # D_CAM + 5093 192 9 2.2087 -1.310831e+01 1.922441e+00 -3.436004e+00 # D_CAO + 5094 192 12 2.2087 -1.438098e+01 2.722105e+00 -1.508716e+00 # D_CTT + 5095 193 8 2.2087 5.530119e+00 -1.475577e+01 1.366330e+01 # D_CAT + 5096 193 9 2.2087 5.833136e+00 -1.508115e+01 1.243394e+01 # D_CAO + 5097 193 10 2.2087 7.260510e+00 -1.535330e+01 1.209677e+01 # D_CAM + 5098 193 11 2.2087 8.270923e+00 -1.550458e+01 1.314538e+01 # D_CAP + 5099 193 10 2.2087 7.790183e+00 -1.508545e+01 1.444079e+01 # D_CAM + 5100 193 9 2.2087 6.427155e+00 -1.479671e+01 1.467459e+01 # D_CAO + 5101 193 12 2.2087 4.054577e+00 -1.433469e+01 1.401976e+01 # D_CTT + 5102 194 8 2.2087 -2.882434e-01 -1.394194e+01 5.742251e+00 # D_CAT + 5103 194 9 2.2087 -1.367180e+00 -1.491666e+01 5.871566e+00 # D_CAO + 5104 194 10 2.2087 -2.704488e+00 -1.467009e+01 5.410766e+00 # D_CAM + 5105 194 11 2.2087 -2.865141e+00 -1.342495e+01 4.578327e+00 # D_CAP + 5106 194 10 2.2087 -1.829448e+00 -1.260736e+01 4.352107e+00 # D_CAM + 5107 194 9 2.2087 -5.877700e-01 -1.278436e+01 4.912384e+00 # D_CAO + 5108 194 12 2.2087 1.044313e+00 -1.411403e+01 6.265428e+00 # D_CTT + 5109 195 8 2.2087 -5.834993e+00 1.205316e+01 1.393917e+01 # D_CAT + 5110 195 9 2.2087 -6.137099e+00 1.227714e+01 1.255211e+01 # D_CAO + 5111 195 10 2.2087 -7.018568e+00 1.345972e+01 1.208102e+01 # D_CAM + 5112 195 11 2.2087 -7.442121e+00 1.425878e+01 1.300381e+01 # D_CAP + 5113 195 10 2.2087 -7.046789e+00 1.405610e+01 1.439629e+01 # D_CAM + 5114 195 9 2.2087 -6.415796e+00 1.301008e+01 1.491892e+01 # D_CAO + 5115 195 12 2.2087 -5.049651e+00 1.085327e+01 1.442427e+01 # D_CTT + 5116 196 8 2.2087 -1.236801e+01 -6.192703e+00 3.376971e+00 # D_CAT + 5117 196 9 2.2087 -1.333696e+01 -5.331512e+00 3.992632e+00 # D_CAO + 5118 196 10 2.2087 -1.451004e+01 -4.905462e+00 3.443156e+00 # D_CAM + 5119 196 11 2.2087 -1.470896e+01 -5.512915e+00 1.945900e+00 # D_CAP + 5120 196 10 2.2087 -1.371562e+01 -6.361472e+00 1.377343e+00 # D_CAM + 5121 196 9 2.2087 -1.256882e+01 -6.615949e+00 2.057280e+00 # D_CAO + 5122 196 12 2.2087 -1.103085e+01 -6.488621e+00 4.102409e+00 # D_CTT + 5123 197 8 2.2087 -5.475116e+00 -2.660563e+00 1.501876e+01 # D_CAT + 5124 197 9 2.2087 -5.935779e+00 -3.928300e+00 1.489811e+01 # D_CAO + 5125 197 10 2.2087 -7.269508e+00 -4.277011e+00 1.508282e+01 # D_CAM + 5126 197 11 2.2087 -8.203342e+00 -3.365804e+00 1.544422e+01 # D_CAP + 5127 197 10 2.2087 -7.773326e+00 -2.114906e+00 1.551140e+01 # D_CAM + 5128 197 9 2.2087 -6.528003e+00 -1.724494e+00 1.526974e+01 # D_CAO + 5129 197 12 2.2087 -3.994731e+00 -2.297640e+00 1.490242e+01 # D_CTT + 5130 198 8 2.2087 -1.095271e+01 -1.284187e+01 -9.503226e+00 # D_CAT + 5131 198 9 2.2087 -1.039664e+01 -1.224525e+01 -1.059207e+01 # D_CAO + 5132 198 10 2.2087 -9.080143e+00 -1.156707e+01 -1.050793e+01 # D_CAM + 5133 198 11 2.2087 -8.298530e+00 -1.163867e+01 -9.325474e+00 # D_CAP + 5134 198 10 2.2087 -8.867466e+00 -1.221215e+01 -8.220907e+00 # D_CAM + 5135 198 9 2.2087 -1.006417e+01 -1.289417e+01 -8.283466e+00 # D_CAO + 5136 198 12 2.2087 -1.219295e+01 -1.361777e+01 -9.657863e+00 # D_CTT + 5137 199 8 2.2087 -3.576123e+00 -1.399315e+01 1.437085e+01 # D_CAT + 5138 199 9 2.2087 -3.901670e+00 -1.271812e+01 1.391841e+01 # D_CAO + 5139 199 10 2.2087 -5.128437e+00 -1.223483e+01 1.402601e+01 # D_CAM + 5140 199 11 2.2087 -6.293568e+00 -1.294262e+01 1.456170e+01 # D_CAP + 5141 199 10 2.2087 -6.008713e+00 -1.428945e+01 1.496952e+01 # D_CAM + 5142 199 9 2.2087 -4.704623e+00 -1.482564e+01 1.490511e+01 # D_CAO + 5143 199 12 2.2087 -2.197763e+00 -1.455807e+01 1.434766e+01 # D_CTT + 5144 200 8 2.2087 -1.069876e+01 8.496844e+00 -8.106302e+00 # D_CAT + 5145 200 9 2.2087 -9.547154e+00 7.700483e+00 -8.247118e+00 # D_CAO + 5146 200 10 2.2087 -9.718843e+00 6.173271e+00 -8.215270e+00 # D_CAM + 5147 200 11 2.2087 -1.093969e+01 5.728584e+00 -8.283211e+00 # D_CAP + 5148 200 10 2.2087 -1.211165e+01 6.681119e+00 -8.032282e+00 # D_CAM + 5149 200 9 2.2087 -1.191492e+01 8.096476e+00 -7.883060e+00 # D_CAO + 5150 200 12 2.2087 -1.039412e+01 9.993940e+00 -7.994277e+00 # D_CTT + 5151 201 8 2.2087 -3.414657e+00 -4.879001e+00 8.744365e+00 # D_CAT + 5152 201 9 2.2087 -3.133876e+00 -4.952980e+00 7.377624e+00 # D_CAO + 5153 201 10 2.2087 -2.664580e+00 -3.937851e+00 6.685560e+00 # D_CAM + 5154 201 11 2.2087 -2.332499e+00 -2.771546e+00 7.259311e+00 # D_CAP + 5155 201 10 2.2087 -2.623807e+00 -2.606722e+00 8.613270e+00 # D_CAM + 5156 201 9 2.2087 -3.120214e+00 -3.721988e+00 9.398450e+00 # D_CAO + 5157 201 12 2.2087 -3.959005e+00 -5.991362e+00 9.571216e+00 # D_CTT + 5158 202 8 2.2087 -6.128916e+00 -1.332880e+01 -1.465913e+01 # D_CAT + 5159 202 9 2.2087 -5.997103e+00 -1.206499e+01 -1.393804e+01 # D_CAO + 5160 202 10 2.2087 -6.976400e+00 -1.116057e+01 -1.380695e+01 # D_CAM + 5161 202 11 2.2087 -8.275158e+00 -1.135962e+01 -1.446857e+01 # D_CAP + 5162 202 10 2.2087 -8.463277e+00 -1.248368e+01 -1.507083e+01 # D_CAM + 5163 202 9 2.2087 -7.396916e+00 -1.341987e+01 -1.529783e+01 # D_CAO + 5164 202 12 2.2087 -5.037151e+00 -1.416887e+01 -1.489727e+01 # D_CTT + 5165 203 8 2.2087 1.026349e+01 1.301502e+01 -3.935477e+00 # D_CAT + 5166 203 9 2.2087 9.302671e+00 1.351654e+01 -4.779548e+00 # D_CAO + 5167 203 10 2.2087 9.578772e+00 1.470528e+01 -5.505602e+00 # D_CAM + 5168 203 11 2.2087 1.096945e+01 1.512024e+01 -5.606295e+00 # D_CAP + 5169 203 10 2.2087 1.189177e+01 1.465107e+01 -4.847683e+00 # D_CAM + 5170 203 9 2.2087 1.168743e+01 1.358898e+01 -3.986619e+00 # D_CAO + 5171 203 12 2.2087 1.004840e+01 1.185838e+01 -2.956787e+00 # D_CTT + 5172 204 8 2.2087 -2.840046e+00 1.365746e+00 -6.288457e+00 # D_CAT + 5173 204 9 2.2087 -1.418710e+00 9.636235e-01 -6.183781e+00 # D_CAO + 5174 204 10 2.2087 -1.043187e+00 2.317258e-01 -5.119346e+00 # D_CAM + 5175 204 11 2.2087 -1.947501e+00 -2.195448e-01 -4.131729e+00 # D_CAP + 5176 204 10 2.2087 -3.255299e+00 2.226499e-01 -4.280145e+00 # D_CAM + 5177 204 9 2.2087 -3.641445e+00 1.050490e+00 -5.420919e+00 # D_CAO + 5178 204 12 2.2087 -3.119568e+00 2.044958e+00 -7.605760e+00 # D_CTT + 5179 205 8 2.2087 4.567087e+00 -3.975868e+00 1.306613e+00 # D_CAT + 5180 205 9 2.2087 3.871108e+00 -5.186247e+00 1.545228e+00 # D_CAO + 5181 205 10 2.2087 4.081734e+00 -6.335621e+00 6.324288e-01 # D_CAM + 5182 205 11 2.2087 5.130751e+00 -6.288414e+00 -2.108224e-01 # D_CAP + 5183 205 10 2.2087 5.859849e+00 -5.068775e+00 -4.632814e-01 # D_CAM + 5184 205 9 2.2087 5.540939e+00 -3.939781e+00 2.403541e-01 # D_CAO + 5185 205 12 2.2087 4.312398e+00 -2.800369e+00 2.169418e+00 # D_CTT + 5186 206 8 2.2087 1.257151e+01 2.250428e+00 4.908538e+00 # D_CAT + 5187 206 9 2.2087 1.308892e+01 9.183055e-01 4.630790e+00 # D_CAO + 5188 206 10 2.2087 1.426158e+01 5.206094e-01 5.107722e+00 # D_CAM + 5189 206 11 2.2087 1.497464e+01 1.378515e+00 5.933574e+00 # D_CAP + 5190 206 10 2.2087 1.440452e+01 2.609921e+00 6.343682e+00 # D_CAM + 5191 206 9 2.2087 1.326561e+01 3.135413e+00 5.826088e+00 # D_CAO + 5192 206 12 2.2087 1.132202e+01 2.786577e+00 4.320477e+00 # D_CTT + 5193 207 8 2.2087 -1.495714e+01 8.199622e+00 5.581046e+00 # D_CAT + 5194 207 9 2.2087 -1.497687e+01 7.392049e+00 4.558567e+00 # D_CAO + 5195 207 10 2.2087 -1.526161e+01 6.087625e+00 4.677346e+00 # D_CAM + 5196 207 11 2.2087 -1.529542e+01 5.400208e+00 5.912303e+00 # D_CAP + 5197 207 10 2.2087 -1.529657e+01 6.212494e+00 7.028975e+00 # D_CAM + 5198 207 9 2.2087 -1.512452e+01 7.632025e+00 7.023790e+00 # D_CAO + 5199 207 12 2.2087 -1.492185e+01 9.708371e+00 5.542612e+00 # D_CTT + 5200 208 8 2.2087 -9.919846e+00 -3.125811e-01 2.702706e+00 # D_CAT + 5201 208 9 2.2087 -1.122303e+01 -5.310207e-01 2.796735e+00 # D_CAO + 5202 208 10 2.2087 -1.182760e+01 -1.708331e+00 3.374108e+00 # D_CAM + 5203 208 11 2.2087 -1.078031e+01 -2.708770e+00 3.858811e+00 # D_CAP + 5204 208 10 2.2087 -9.508231e+00 -2.468396e+00 3.773156e+00 # D_CAM + 5205 208 9 2.2087 -9.033315e+00 -1.253788e+00 3.116796e+00 # D_CAO + 5206 208 12 2.2087 -9.387649e+00 9.064304e-01 1.991669e+00 # D_CTT + 5207 209 8 2.2087 -1.124352e+01 1.089299e+01 -8.172915e-01 # D_CAT + 5208 209 9 2.2087 -1.015310e+01 1.033451e+01 -1.215464e-02 # D_CAO + 5209 209 10 2.2087 -9.859668e+00 9.061163e+00 -3.146641e-02 # D_CAM + 5210 209 11 2.2087 -1.069653e+01 8.081819e+00 -9.047921e-01 # D_CAP + 5211 209 10 2.2087 -1.175355e+01 8.491612e+00 -1.666377e+00 # D_CAM + 5212 209 9 2.2087 -1.201752e+01 9.961981e+00 -1.501276e+00 # D_CAO + 5213 209 12 2.2087 -1.167519e+01 1.224006e+01 -7.422783e-01 # D_CTT + 5214 210 8 2.2087 1.307954e+01 2.815830e+00 9.027374e+00 # D_CAT + 5215 210 9 2.2087 1.256276e+01 1.965080e+00 8.050828e+00 # D_CAO + 5216 210 10 2.2087 1.132067e+01 2.238410e+00 7.473962e+00 # D_CAM + 5217 210 11 2.2087 1.059603e+01 3.379730e+00 7.759429e+00 # D_CAP + 5218 210 10 2.2087 1.115510e+01 4.258132e+00 8.738042e+00 # D_CAM + 5219 210 9 2.2087 1.236617e+01 3.812286e+00 9.262046e+00 # D_CAO + 5220 210 12 2.2087 1.432965e+01 2.439967e+00 9.799774e+00 # D_CTT + 5221 211 8 2.2087 9.297480e+00 6.260534e+00 -2.823892e+00 # D_CAT + 5222 211 9 2.2087 9.811027e+00 7.265789e+00 -2.050628e+00 # D_CAO + 5223 211 10 2.2087 1.126039e+01 7.453826e+00 -2.068328e+00 # D_CAM + 5224 211 11 2.2087 1.201924e+01 6.736512e+00 -2.911863e+00 # D_CAP + 5225 211 10 2.2087 1.150017e+01 5.646330e+00 -3.645549e+00 # D_CAM + 5226 211 9 2.2087 1.009974e+01 5.383378e+00 -3.599973e+00 # D_CAO + 5227 211 12 2.2087 7.652016e+00 5.995202e+00 -2.876003e+00 # D_CTT + 5228 212 8 2.2087 -4.592666e-01 -5.126569e+00 9.516307e+00 # D_CAT + 5229 212 9 2.2087 -1.164333e-01 -3.914190e+00 8.922211e+00 # D_CAO + 5230 212 10 2.2087 -2.282380e-01 -2.703304e+00 9.648920e+00 # D_CAM + 5231 212 11 2.2087 -6.363607e-01 -2.607177e+00 1.092126e+01 # D_CAP + 5232 212 10 2.2087 -1.061727e+00 -3.858843e+00 1.155370e+01 # D_CAM + 5233 212 9 2.2087 -9.502310e-01 -5.087264e+00 1.079204e+01 # D_CAO + 5234 212 12 2.2087 -3.407913e-01 -6.404280e+00 8.701641e+00 # D_CTT + 5235 213 8 2.2087 2.770868e+00 -9.709522e+00 7.510981e+00 # D_CAT + 5236 213 9 2.2087 3.232222e+00 -1.091981e+01 8.139588e+00 # D_CAO + 5237 213 10 2.2087 4.207194e+00 -1.081030e+01 9.042355e+00 # D_CAM + 5238 213 11 2.2087 4.554828e+00 -9.509841e+00 9.582851e+00 # D_CAP + 5239 213 10 2.2087 4.164756e+00 -8.380975e+00 9.011099e+00 # D_CAM + 5240 213 9 2.2087 3.040029e+00 -8.457990e+00 8.060281e+00 # D_CAO + 5241 213 12 2.2087 1.724110e+00 -9.824680e+00 6.499143e+00 # D_CTT + 5242 214 8 2.2087 3.075174e+00 -1.498106e+01 -1.377136e+00 # D_CAT + 5243 214 9 2.2087 4.342972e+00 -1.496622e+01 -2.047471e+00 # D_CAO + 5244 214 10 2.2087 5.668960e+00 -1.506626e+01 -1.447765e+00 # D_CAM + 5245 214 11 2.2087 5.600778e+00 -1.505714e+01 -4.626528e-02 # D_CAP + 5246 214 10 2.2087 4.457131e+00 -1.520633e+01 7.371639e-01 # D_CAM + 5247 214 9 2.2087 3.184006e+00 -1.497610e+01 5.976478e-02 # D_CAO + 5248 214 12 2.2087 1.808205e+00 -1.482694e+01 -2.095210e+00 # D_CTT + 5249 215 8 2.2087 8.293835e+00 -1.396326e+01 -1.118146e+01 # D_CAT + 5250 215 9 2.2087 9.077650e+00 -1.311373e+01 -1.193935e+01 # D_CAO + 5251 215 10 2.2087 1.044988e+01 -1.295071e+01 -1.158637e+01 # D_CAM + 5252 215 11 2.2087 1.097678e+01 -1.375011e+01 -1.057656e+01 # D_CAP + 5253 215 10 2.2087 1.023927e+01 -1.472651e+01 -9.980641e+00 # D_CAM + 5254 215 9 2.2087 8.942936e+00 -1.486015e+01 -1.019530e+01 # D_CAO + 5255 215 12 2.2087 6.794007e+00 -1.416165e+01 -1.147805e+01 # D_CTT + 5256 216 8 2.2087 -1.034642e+01 8.103303e+00 3.442426e+00 # D_CAT + 5257 216 9 2.2087 -9.516858e+00 8.354000e+00 4.590770e+00 # D_CAO + 5258 216 10 2.2087 -8.316659e+00 7.714512e+00 4.708522e+00 # D_CAM + 5259 216 11 2.2087 -7.938255e+00 6.801716e+00 3.690102e+00 # D_CAP + 5260 216 10 2.2087 -8.700975e+00 6.576191e+00 2.564723e+00 # D_CAM + 5261 216 9 2.2087 -9.933021e+00 7.278027e+00 2.566319e+00 # D_CAO + 5262 216 12 2.2087 -1.161287e+01 8.826287e+00 3.351198e+00 # D_CTT + 5263 217 8 2.2087 -1.000682e+01 4.160452e+00 8.205291e+00 # D_CAT + 5264 217 9 2.2087 -1.129504e+01 3.791297e+00 7.601569e+00 # D_CAO + 5265 217 10 2.2087 -1.238055e+01 4.817779e+00 7.816578e+00 # D_CAM + 5266 217 11 2.2087 -1.223423e+01 5.956179e+00 8.608032e+00 # D_CAP + 5267 217 10 2.2087 -1.085006e+01 6.247771e+00 9.269306e+00 # D_CAM + 5268 217 9 2.2087 -9.871040e+00 5.403354e+00 8.998835e+00 # D_CAO + 5269 217 12 2.2087 -8.910084e+00 3.204930e+00 7.949938e+00 # D_CTT + 5270 218 8 2.2087 -1.854840e+00 1.427367e+01 -8.983130e+00 # D_CAT + 5271 218 9 2.2087 -2.569236e+00 1.306781e+01 -9.144750e+00 # D_CAO + 5272 218 10 2.2087 -2.720291e+00 1.263917e+01 -1.047058e+01 # D_CAM + 5273 218 11 2.2087 -2.291659e+00 1.331529e+01 -1.157061e+01 # D_CAP + 5274 218 10 2.2087 -1.491432e+00 1.454373e+01 -1.131995e+01 # D_CAM + 5275 218 9 2.2087 -1.225512e+00 1.517699e+01 -1.007718e+01 # D_CAO + 5276 218 12 2.2087 -1.621750e+00 1.471507e+01 -7.403435e+00 # D_CTT + 5277 219 8 2.2087 -5.272813e+00 2.432609e+00 -1.118582e+01 # D_CAT + 5278 219 9 2.2087 -6.109795e+00 2.526224e+00 -1.239352e+01 # D_CAO + 5279 219 10 2.2087 -6.235446e+00 3.781293e+00 -1.291095e+01 # D_CAM + 5280 219 11 2.2087 -5.657623e+00 4.902596e+00 -1.225560e+01 # D_CAP + 5281 219 10 2.2087 -4.785703e+00 4.775213e+00 -1.126911e+01 # D_CAM + 5282 219 9 2.2087 -4.732719e+00 3.451016e+00 -1.068578e+01 # D_CAO + 5283 219 12 2.2087 -5.050653e+00 1.030869e+00 -1.055835e+01 # D_CTT + 5284 220 8 2.2087 -2.334504e+00 1.503204e+01 8.926139e+00 # D_CAT + 5285 220 9 2.2087 -3.732782e+00 1.502347e+01 8.956799e+00 # D_CAO + 5286 220 10 2.2087 -4.367687e+00 1.515854e+01 1.014777e+01 # D_CAM + 5287 220 11 2.2087 -3.688670e+00 1.538357e+01 1.135796e+01 # D_CAP + 5288 220 10 2.2087 -2.276962e+00 1.526109e+01 1.139102e+01 # D_CAM + 5289 220 9 2.2087 -1.624563e+00 1.522291e+01 1.016419e+01 # D_CAO + 5290 220 12 2.2087 -1.624241e+00 1.490952e+01 7.578159e+00 # D_CTT + 5291 221 8 2.2087 -9.357711e+00 1.205043e+01 -3.287511e+00 # D_CAT + 5292 221 9 2.2087 -8.781205e+00 1.281711e+01 -2.280320e+00 # D_CAO + 5293 221 10 2.2087 -8.120687e+00 1.212690e+01 -1.230345e+00 # D_CAM + 5294 221 11 2.2087 -7.892108e+00 1.076476e+01 -1.311680e+00 # D_CAP + 5295 221 10 2.2087 -8.367627e+00 1.010880e+01 -2.467131e+00 # D_CAM + 5296 221 9 2.2087 -9.059939e+00 1.066981e+01 -3.377894e+00 # D_CAO + 5297 221 12 2.2087 -1.005950e+01 1.284263e+01 -4.464017e+00 # D_CTT + 5298 222 8 2.2087 -6.549389e+00 -9.882588e+00 1.173783e+01 # D_CAT + 5299 222 9 2.2087 -7.314556e+00 -8.921057e+00 1.233786e+01 # D_CAO + 5300 222 10 2.2087 -6.675831e+00 -7.711675e+00 1.272864e+01 # D_CAM + 5301 222 11 2.2087 -5.308327e+00 -7.546752e+00 1.253247e+01 # D_CAP + 5302 222 10 2.2087 -4.571626e+00 -8.645219e+00 1.201476e+01 # D_CAM + 5303 222 9 2.2087 -5.148680e+00 -9.786149e+00 1.157653e+01 # D_CAO + 5304 222 12 2.2087 -7.082962e+00 -1.125281e+01 1.131193e+01 # D_CTT + 5305 223 8 2.2087 8.407541e+00 8.914565e+00 -1.033921e+01 # D_CAT + 5306 223 9 2.2087 7.699471e+00 1.000688e+01 -1.010580e+01 # D_CAO + 5307 223 10 2.2087 8.264619e+00 1.135780e+01 -1.047029e+01 # D_CAM + 5308 223 11 2.2087 9.519311e+00 1.139252e+01 -1.097242e+01 # D_CAP + 5309 223 10 2.2087 1.021440e+01 1.018562e+01 -1.116237e+01 # D_CAM + 5310 223 9 2.2087 9.735266e+00 9.002292e+00 -1.089479e+01 # D_CAO + 5311 223 12 2.2087 7.837926e+00 7.568653e+00 -1.001090e+01 # D_CTT + 5312 224 8 2.2087 2.928557e+00 -5.427658e+00 1.380824e+01 # D_CAT + 5313 224 9 2.2087 3.159373e+00 -6.692299e+00 1.319895e+01 # D_CAO + 5314 224 10 2.2087 4.260126e+00 -7.009423e+00 1.214286e+01 # D_CAM + 5315 224 11 2.2087 4.852643e+00 -5.812289e+00 1.185157e+01 # D_CAP + 5316 224 10 2.2087 4.710823e+00 -4.523268e+00 1.233226e+01 # D_CAM + 5317 224 9 2.2087 3.737856e+00 -4.426029e+00 1.330376e+01 # D_CAO + 5318 224 12 2.2087 1.958851e+00 -5.067170e+00 1.482003e+01 # D_CTT + 5319 225 8 2.2087 2.058439e+00 1.222933e+01 3.291427e+00 # D_CAT + 5320 225 9 2.2087 2.077993e+00 1.278387e+01 4.575313e+00 # D_CAO + 5321 225 10 2.2087 9.602254e-01 1.323426e+01 5.148716e+00 # D_CAM + 5322 225 11 2.2087 -3.024706e-01 1.323380e+01 4.491940e+00 # D_CAP + 5323 225 10 2.2087 -4.507221e-01 1.283600e+01 3.221105e+00 # D_CAM + 5324 225 9 2.2087 8.348434e-01 1.240571e+01 2.538471e+00 # D_CAO + 5325 225 12 2.2087 3.222855e+00 1.175891e+01 2.542617e+00 # D_CTT + 5326 226 8 2.2087 -1.374847e+01 -3.318239e+00 1.402769e+01 # D_CAT + 5327 226 9 2.2087 -1.462408e+01 -2.462677e+00 1.350088e+01 # D_CAO + 5328 226 10 2.2087 -1.422236e+01 -1.450363e+00 1.274820e+01 # D_CAM + 5329 226 11 2.2087 -1.290175e+01 -1.321078e+00 1.259469e+01 # D_CAP + 5330 226 10 2.2087 -1.192759e+01 -2.106684e+00 1.310926e+01 # D_CAM + 5331 226 9 2.2087 -1.250794e+01 -3.041139e+00 1.397382e+01 # D_CAO + 5332 226 12 2.2087 -1.426364e+01 -4.425590e+00 1.491211e+01 # D_CTT + 5333 227 8 2.2087 -1.040368e+01 -8.231341e+00 -8.538576e+00 # D_CAT + 5334 227 9 2.2087 -1.115665e+01 -7.124985e+00 -8.075618e+00 # D_CAO + 5335 227 10 2.2087 -1.259541e+01 -7.308156e+00 -7.823020e+00 # D_CAM + 5336 227 11 2.2087 -1.313782e+01 -8.587308e+00 -7.828948e+00 # D_CAP + 5337 227 10 2.2087 -1.242203e+01 -9.709983e+00 -8.156381e+00 # D_CAM + 5338 227 9 2.2087 -1.103947e+01 -9.519872e+00 -8.560259e+00 # D_CAO + 5339 227 12 2.2087 -8.878651e+00 -8.209891e+00 -8.726110e+00 # D_CTT + 5340 228 8 2.2087 -7.093208e+00 1.252862e+01 -1.439457e+01 # D_CAT + 5341 228 9 2.2087 -6.191012e+00 1.246731e+01 -1.328018e+01 # D_CAO + 5342 228 10 2.2087 -5.442825e+00 1.332699e+01 -1.274437e+01 # D_CAM + 5343 228 11 2.2087 -5.479652e+00 1.460231e+01 -1.349917e+01 # D_CAP + 5344 228 10 2.2087 -6.218858e+00 1.491038e+01 -1.450818e+01 # D_CAM + 5345 228 9 2.2087 -7.045685e+00 1.376969e+01 -1.508797e+01 # D_CAO + 5346 228 12 2.2087 -7.983765e+00 1.148472e+01 -1.480576e+01 # D_CTT + 5347 229 8 2.2087 -1.353022e+01 6.773639e+00 1.150114e+01 # D_CAT + 5348 229 9 2.2087 -1.358116e+01 8.198620e+00 1.185732e+01 # D_CAO + 5349 229 10 2.2087 -1.240680e+01 8.890920e+00 1.245975e+01 # D_CAM + 5350 229 11 2.2087 -1.124742e+01 8.244956e+00 1.256218e+01 # D_CAP + 5351 229 10 2.2087 -1.136043e+01 6.807188e+00 1.228419e+01 # D_CAM + 5352 229 9 2.2087 -1.232769e+01 6.239406e+00 1.166950e+01 # D_CAO + 5353 229 12 2.2087 -1.474923e+01 6.043922e+00 1.091664e+01 # D_CTT + 5354 230 8 2.2087 1.493642e+01 -1.159314e+01 1.283614e+01 # D_CAT + 5355 230 9 2.2087 1.478854e+01 -1.245973e+01 1.173468e+01 # D_CAO + 5356 230 10 2.2087 1.490579e+01 -1.193686e+01 1.043956e+01 # D_CAM + 5357 230 11 2.2087 1.516104e+01 -1.070056e+01 1.013260e+01 # D_CAP + 5358 230 10 2.2087 1.543294e+01 -9.723725e+00 1.122320e+01 # D_CAM + 5359 230 9 2.2087 1.522766e+01 -1.019768e+01 1.249349e+01 # D_CAO + 5360 230 12 2.2087 1.472479e+01 -1.201165e+01 1.422658e+01 # D_CTT + 5361 231 8 2.2087 -5.111982e+00 1.504261e+01 1.336915e+00 # D_CAT + 5362 231 9 2.2087 -5.441783e+00 1.510972e+01 -4.160801e-02 # D_CAO + 5363 231 10 2.2087 -6.642465e+00 1.517644e+01 -4.566855e-01 # D_CAM + 5364 231 11 2.2087 -7.757924e+00 1.516105e+01 4.856221e-01 # D_CAP + 5365 231 10 2.2087 -7.383029e+00 1.522638e+01 1.916164e+00 # D_CAM + 5366 231 9 2.2087 -6.090247e+00 1.526175e+01 2.232054e+00 # D_CAO + 5367 231 12 2.2087 -3.709675e+00 1.501596e+01 1.729196e+00 # D_CTT + 5368 232 8 2.2087 -1.397005e+01 -9.191848e+00 7.183934e+00 # D_CAT + 5369 232 9 2.2087 -1.494218e+01 -8.210520e+00 7.068252e+00 # D_CAO + 5370 232 10 2.2087 -1.513375e+01 -7.544109e+00 5.800016e+00 # D_CAM + 5371 232 11 2.2087 -1.459987e+01 -7.954140e+00 4.734319e+00 # D_CAP + 5372 232 10 2.2087 -1.360034e+01 -9.045343e+00 4.829405e+00 # D_CAM + 5373 232 9 2.2087 -1.312209e+01 -9.533251e+00 5.979198e+00 # D_CAO + 5374 232 12 2.2087 -1.370593e+01 -9.855364e+00 8.436243e+00 # D_CTT + 5375 233 8 2.2087 -6.002585e+00 8.295902e+00 -1.335513e+01 # D_CAT + 5376 233 9 2.2087 -5.893924e+00 7.557141e+00 -1.457448e+01 # D_CAO + 5377 233 10 2.2087 -7.077098e+00 7.245016e+00 -1.532406e+01 # D_CAM + 5378 233 11 2.2087 -8.293304e+00 7.765539e+00 -1.470082e+01 # D_CAP + 5379 233 10 2.2087 -8.292411e+00 8.493813e+00 -1.359220e+01 # D_CAM + 5380 233 9 2.2087 -7.130850e+00 8.783416e+00 -1.279588e+01 # D_CAO + 5381 233 12 2.2087 -4.570407e+00 8.594165e+00 -1.264522e+01 # D_CTT + 5382 234 8 2.2087 1.100886e+01 -1.807133e+00 3.722432e+00 # D_CAT + 5383 234 9 2.2087 9.877484e+00 -8.683700e-01 3.778318e+00 # D_CAO + 5384 234 10 2.2087 9.453603e+00 -3.202617e-01 2.651475e+00 # D_CAM + 5385 234 11 2.2087 9.958439e+00 -8.149535e-01 1.333490e+00 # D_CAP + 5386 234 10 2.2087 1.088478e+01 -1.675945e+00 1.325426e+00 # D_CAM + 5387 234 9 2.2087 1.141330e+01 -2.176610e+00 2.410654e+00 # D_CAO + 5388 234 12 2.2087 1.161465e+01 -2.444622e+00 4.984389e+00 # D_CTT + 5389 235 8 2.2087 9.287015e+00 -4.147660e+00 2.490864e+00 # D_CAT + 5390 235 9 2.2087 8.505739e+00 -3.480493e+00 3.381528e+00 # D_CAO + 5391 235 10 2.2087 7.911578e+00 -2.238611e+00 3.016981e+00 # D_CAM + 5392 235 11 2.2087 7.867705e+00 -2.033014e+00 1.643058e+00 # D_CAP + 5393 235 10 2.2087 8.510002e+00 -2.817582e+00 6.720594e-01 # D_CAM + 5394 235 9 2.2087 9.248737e+00 -3.833836e+00 1.142352e+00 # D_CAO + 5395 235 12 2.2087 1.011786e+01 -5.386981e+00 2.844838e+00 # D_CTT + 5396 236 8 2.2087 -8.201316e+00 -2.622521e+00 7.377563e+00 # D_CAT + 5397 236 9 2.2087 -7.033280e+00 -3.416982e+00 7.329422e+00 # D_CAO + 5398 236 10 2.2087 -5.836616e+00 -2.787030e+00 7.386030e+00 # D_CAM + 5399 236 11 2.2087 -5.748764e+00 -1.394657e+00 7.307601e+00 # D_CAP + 5400 236 10 2.2087 -6.904863e+00 -6.851089e-01 7.342441e+00 # D_CAM + 5401 236 9 2.2087 -8.111541e+00 -1.211552e+00 7.370135e+00 # D_CAO + 5402 236 12 2.2087 -9.590399e+00 -3.243602e+00 7.322751e+00 # D_CTT + 5403 237 8 2.2087 1.486546e+01 1.395585e+01 4.972054e+00 # D_CAT + 5404 237 9 2.2087 1.424020e+01 1.270587e+01 5.119212e+00 # D_CAO + 5405 237 10 2.2087 1.395643e+01 1.216409e+01 6.357931e+00 # D_CAM + 5406 237 11 2.2087 1.426250e+01 1.298234e+01 7.484718e+00 # D_CAP + 5407 237 10 2.2087 1.485759e+01 1.425193e+01 7.389751e+00 # D_CAM + 5408 237 9 2.2087 1.517062e+01 1.472740e+01 6.136840e+00 # D_CAO + 5409 237 12 2.2087 1.510920e+01 1.455280e+01 3.522455e+00 # D_CTT + 5410 238 8 2.2087 2.343596e+00 -1.383656e+01 -1.343674e+01 # D_CAT + 5411 238 9 2.2087 2.220679e+00 -1.255330e+01 -1.399961e+01 # D_CAO + 5412 238 10 2.2087 1.235748e+00 -1.219098e+01 -1.493307e+01 # D_CAM + 5413 238 11 2.2087 4.017199e-01 -1.308286e+01 -1.542176e+01 # D_CAP + 5414 238 10 2.2087 3.136090e-01 -1.452389e+01 -1.483534e+01 # D_CAM + 5415 238 9 2.2087 1.542813e+00 -1.485463e+01 -1.393034e+01 # D_CAO + 5416 238 12 2.2087 3.448284e+00 -1.422913e+01 -1.240519e+01 # D_CTT + 5417 239 8 2.2087 -1.361716e+01 -1.239858e+01 -1.432214e+01 # D_CAT + 5418 239 9 2.2087 -1.241296e+01 -1.285845e+01 -1.497254e+01 # D_CAO + 5419 239 10 2.2087 -1.221114e+01 -1.414586e+01 -1.521048e+01 # D_CAM + 5420 239 11 2.2087 -1.315355e+01 -1.511240e+01 -1.473857e+01 # D_CAP + 5421 239 10 2.2087 -1.423857e+01 -1.471349e+01 -1.406903e+01 # D_CAM + 5422 239 9 2.2087 -1.452240e+01 -1.330808e+01 -1.413140e+01 # D_CAO + 5423 239 12 2.2087 -1.400460e+01 -1.090814e+01 -1.423181e+01 # D_CTT + 5424 240 8 2.2087 1.367709e+01 -1.308313e+01 -1.392884e+01 # D_CAT + 5425 240 9 2.2087 1.235844e+01 -1.322201e+01 -1.435306e+01 # D_CAO + 5426 240 10 2.2087 1.163045e+01 -1.425149e+01 -1.366813e+01 # D_CAM + 5427 240 11 2.2087 1.208356e+01 -1.503933e+01 -1.262457e+01 # D_CAP + 5428 240 10 2.2087 1.336080e+01 -1.477466e+01 -1.220710e+01 # D_CAM + 5429 240 9 2.2087 1.420808e+01 -1.382513e+01 -1.292373e+01 # D_CAO + 5430 240 12 2.2087 1.446904e+01 -1.208123e+01 -1.471073e+01 # D_CTT + 5431 241 8 2.2087 -6.322220e+00 -4.074047e+00 -1.201631e+00 # D_CAT + 5432 241 9 2.2087 -6.297812e+00 -2.887296e+00 -1.825460e+00 # D_CAO + 5433 241 10 2.2087 -6.693334e+00 -1.643870e+00 -1.179046e+00 # D_CAM + 5434 241 11 2.2087 -7.016393e+00 -1.776177e+00 1.075219e-01 # D_CAP + 5435 241 10 2.2087 -7.006984e+00 -3.016505e+00 7.660013e-01 # D_CAM + 5436 241 9 2.2087 -6.692231e+00 -4.129667e+00 7.089882e-02 # D_CAO + 5437 241 12 2.2087 -5.820213e+00 -5.337173e+00 -1.864558e+00 # D_CTT + 5438 242 8 2.2087 -1.218640e+01 1.323032e+01 3.847765e+00 # D_CAT + 5439 242 9 2.2087 -1.321345e+01 1.409786e+01 3.222086e+00 # D_CAO + 5440 242 10 2.2087 -1.294151e+01 1.472669e+01 1.997067e+00 # D_CAM + 5441 242 11 2.2087 -1.165245e+01 1.452257e+01 1.407140e+00 # D_CAP + 5442 242 10 2.2087 -1.066292e+01 1.369351e+01 2.123710e+00 # D_CAM + 5443 242 9 2.2087 -1.094331e+01 1.307198e+01 3.290660e+00 # D_CAO + 5444 242 12 2.2087 -1.249691e+01 1.266221e+01 5.157830e+00 # D_CTT + 5445 243 8 2.2087 1.352012e+01 -1.509216e+01 8.050818e+00 # D_CAT + 5446 243 9 2.2087 1.321516e+01 -1.512517e+01 9.367996e+00 # D_CAO + 5447 243 10 2.2087 1.196324e+01 -1.528761e+01 9.736434e+00 # D_CAM + 5448 243 11 2.2087 1.083104e+01 -1.531602e+01 8.981337e+00 # D_CAP + 5449 243 10 2.2087 1.116306e+01 -1.545642e+01 7.516182e+00 # D_CAM + 5450 243 9 2.2087 1.240250e+01 -1.520180e+01 7.019384e+00 # D_CAO + 5451 243 12 2.2087 1.487835e+01 -1.495351e+01 7.620551e+00 # D_CTT + 5452 244 8 2.2087 -1.185496e+01 -8.331697e+00 -1.244216e+01 # D_CAT + 5453 244 9 2.2087 -1.128413e+01 -9.050332e+00 -1.336363e+01 # D_CAO + 5454 244 10 2.2087 -1.096248e+01 -8.497985e+00 -1.467055e+01 # D_CAM + 5455 244 11 2.2087 -1.119175e+01 -7.116185e+00 -1.477078e+01 # D_CAP + 5456 244 10 2.2087 -1.170704e+01 -6.308033e+00 -1.372585e+01 # D_CAM + 5457 244 9 2.2087 -1.205437e+01 -6.878266e+00 -1.253006e+01 # D_CAO + 5458 244 12 2.2087 -1.221868e+01 -8.959594e+00 -1.106382e+01 # D_CTT + 5459 245 8 2.2087 -4.347585e-01 9.782605e+00 1.493943e+01 # D_CAT + 5460 245 9 2.2087 8.666260e-01 9.115717e+00 1.498124e+01 # D_CAO + 5461 245 10 2.2087 8.132240e-01 7.692018e+00 1.506138e+01 # D_CAM + 5462 245 11 2.2087 -3.668037e-01 6.997927e+00 1.510646e+01 # D_CAP + 5463 245 10 2.2087 -1.624421e+00 7.738805e+00 1.503319e+01 # D_CAM + 5464 245 9 2.2087 -1.588808e+00 9.138814e+00 1.501259e+01 # D_CAO + 5465 245 12 2.2087 -4.229331e-01 1.134430e+01 1.475890e+01 # D_CTT + 5466 246 8 2.2087 -7.740431e+00 -1.093473e+01 8.336567e+00 # D_CAT + 5467 246 9 2.2087 -7.517798e+00 -9.753006e+00 9.026321e+00 # D_CAO + 5468 246 10 2.2087 -6.252145e+00 -9.279280e+00 9.115355e+00 # D_CAM + 5469 246 11 2.2087 -5.008702e+00 -1.003992e+01 8.728596e+00 # D_CAP + 5470 246 10 2.2087 -5.302619e+00 -1.123347e+01 8.060073e+00 # D_CAM + 5471 246 9 2.2087 -6.667782e+00 -1.174004e+01 7.956447e+00 # D_CAO + 5472 246 12 2.2087 -9.182492e+00 -1.152168e+01 8.221235e+00 # D_CTT + 5473 247 8 2.2087 1.432073e+01 -8.248230e+00 -9.498198e+00 # D_CAT + 5474 247 9 2.2087 1.508514e+01 -8.588131e+00 -1.046142e+01 # D_CAO + 5475 247 10 2.2087 1.527315e+01 -9.876663e+00 -1.103009e+01 # D_CAM + 5476 247 11 2.2087 1.458495e+01 -1.083642e+01 -1.052680e+01 # D_CAP + 5477 247 10 2.2087 1.373412e+01 -1.066599e+01 -9.402908e+00 # D_CAM + 5478 247 9 2.2087 1.368355e+01 -9.458387e+00 -8.898983e+00 # D_CAO + 5479 247 12 2.2087 1.420682e+01 -6.917659e+00 -8.798686e+00 # D_CTT + 5480 248 8 2.2087 -8.262679e+00 -1.167301e+01 5.505797e-01 # D_CAT + 5481 248 9 2.2087 -8.080453e+00 -1.030238e+01 1.637916e-01 # D_CAO + 5482 248 10 2.2087 -9.094984e+00 -9.564139e+00 5.838292e-02 # D_CAM + 5483 248 11 2.2087 -1.045439e+01 -9.876541e+00 3.983904e-01 # D_CAP + 5484 248 10 2.2087 -1.067118e+01 -1.122414e+01 7.187855e-01 # D_CAM + 5485 248 9 2.2087 -9.494972e+00 -1.215340e+01 9.023470e-01 # D_CAO + 5486 248 12 2.2087 -6.960211e+00 -1.244279e+01 8.112205e-01 # D_CTT + 5487 249 8 2.2087 1.383956e+01 1.394031e+01 -7.292000e-01 # D_CAT + 5488 249 9 2.2087 1.433083e+01 1.268528e+01 -1.534721e-01 # D_CAO + 5489 249 10 2.2087 1.381572e+01 1.236841e+01 1.053885e+00 # D_CAM + 5490 249 11 2.2087 1.269828e+01 1.296796e+01 1.546643e+00 # D_CAP + 5491 249 10 2.2087 1.217562e+01 1.416816e+01 1.053433e+00 # D_CAM + 5492 249 9 2.2087 1.280102e+01 1.468658e+01 -1.843564e-01 # D_CAO + 5493 249 12 2.2087 1.459827e+01 1.448216e+01 -1.899157e+00 # D_CTT + 5494 250 8 2.2087 3.313614e+00 2.845900e+00 9.596822e+00 # D_CAT + 5495 250 9 2.2087 4.138591e+00 2.164915e+00 8.722747e+00 # D_CAO + 5496 250 10 2.2087 3.975990e+00 7.805009e-01 8.373591e+00 # D_CAM + 5497 250 11 2.2087 2.781076e+00 1.550901e-01 8.830840e+00 # D_CAP + 5498 250 10 2.2087 1.850421e+00 9.092838e-01 9.625547e+00 # D_CAM + 5499 250 9 2.2087 2.158912e+00 2.183161e+00 1.006448e+01 # D_CAO + 5500 250 12 2.2087 3.616065e+00 4.258063e+00 9.990509e+00 # D_CTT + +Bonds + + 1 1 1 2 # CAT-CAO + 2 2 1 7 # CAT-CTT + 3 1 1 6 # CAT-CAO + 4 3 2 3 # CAO-CAM + 5 4 2 8 # CAO-HAT + 6 5 3 4 # CAM-CAP + 7 6 3 9 # CAM-HAT + 8 5 4 5 # CAP-CAM + 9 7 4 10 # CAP-HAT + 10 3 5 6 # CAM-CAO + 11 6 5 11 # CAM-HAT + 12 4 6 12 # CAO-HAT + 13 8 7 13 # CTT-HT + 14 8 7 14 # CTT-HT + 15 8 7 15 # CTT-HT + 16 1 16 17 # CAT-CAO + 17 2 16 22 # CAT-CTT + 18 1 16 21 # CAT-CAO + 19 3 17 18 # CAO-CAM + 20 4 17 23 # CAO-HAT + 21 5 18 19 # CAM-CAP + 22 6 18 24 # CAM-HAT + 23 5 19 20 # CAP-CAM + 24 7 19 25 # CAP-HAT + 25 3 20 21 # CAM-CAO + 26 6 20 26 # CAM-HAT + 27 4 21 27 # CAO-HAT + 28 8 22 28 # CTT-HT + 29 8 22 29 # CTT-HT + 30 8 22 30 # CTT-HT + 31 1 31 32 # CAT-CAO + 32 2 31 37 # CAT-CTT + 33 1 31 36 # CAT-CAO + 34 3 32 33 # CAO-CAM + 35 4 32 38 # CAO-HAT + 36 5 33 34 # CAM-CAP + 37 6 33 39 # CAM-HAT + 38 5 34 35 # CAP-CAM + 39 7 34 40 # CAP-HAT + 40 3 35 36 # CAM-CAO + 41 6 35 41 # CAM-HAT + 42 4 36 42 # CAO-HAT + 43 8 37 43 # CTT-HT + 44 8 37 44 # CTT-HT + 45 8 37 45 # CTT-HT + 46 1 46 47 # CAT-CAO + 47 2 46 52 # CAT-CTT + 48 1 46 51 # CAT-CAO + 49 3 47 48 # CAO-CAM + 50 4 47 53 # CAO-HAT + 51 5 48 49 # CAM-CAP + 52 6 48 54 # CAM-HAT + 53 5 49 50 # CAP-CAM + 54 7 49 55 # CAP-HAT + 55 3 50 51 # CAM-CAO + 56 6 50 56 # CAM-HAT + 57 4 51 57 # CAO-HAT + 58 8 52 58 # CTT-HT + 59 8 52 59 # CTT-HT + 60 8 52 60 # CTT-HT + 61 1 61 62 # CAT-CAO + 62 2 61 67 # CAT-CTT + 63 1 61 66 # CAT-CAO + 64 3 62 63 # CAO-CAM + 65 4 62 68 # CAO-HAT + 66 5 63 64 # CAM-CAP + 67 6 63 69 # CAM-HAT + 68 5 64 65 # CAP-CAM + 69 7 64 70 # CAP-HAT + 70 3 65 66 # CAM-CAO + 71 6 65 71 # CAM-HAT + 72 4 66 72 # CAO-HAT + 73 8 67 73 # CTT-HT + 74 8 67 74 # CTT-HT + 75 8 67 75 # CTT-HT + 76 1 76 77 # CAT-CAO + 77 2 76 82 # CAT-CTT + 78 1 76 81 # CAT-CAO + 79 3 77 78 # CAO-CAM + 80 4 77 83 # CAO-HAT + 81 5 78 79 # CAM-CAP + 82 6 78 84 # CAM-HAT + 83 5 79 80 # CAP-CAM + 84 7 79 85 # CAP-HAT + 85 3 80 81 # CAM-CAO + 86 6 80 86 # CAM-HAT + 87 4 81 87 # CAO-HAT + 88 8 82 88 # CTT-HT + 89 8 82 89 # CTT-HT + 90 8 82 90 # CTT-HT + 91 1 91 92 # CAT-CAO + 92 2 91 97 # CAT-CTT + 93 1 91 96 # CAT-CAO + 94 3 92 93 # CAO-CAM + 95 4 92 98 # CAO-HAT + 96 5 93 94 # CAM-CAP + 97 6 93 99 # CAM-HAT + 98 5 94 95 # CAP-CAM + 99 7 94 100 # CAP-HAT + 100 3 95 96 # CAM-CAO + 101 6 95 101 # CAM-HAT + 102 4 96 102 # CAO-HAT + 103 8 97 103 # CTT-HT + 104 8 97 104 # CTT-HT + 105 8 97 105 # CTT-HT + 106 1 106 107 # CAT-CAO + 107 2 106 112 # CAT-CTT + 108 1 106 111 # CAT-CAO + 109 3 107 108 # CAO-CAM + 110 4 107 113 # CAO-HAT + 111 5 108 109 # CAM-CAP + 112 6 108 114 # CAM-HAT + 113 5 109 110 # CAP-CAM + 114 7 109 115 # CAP-HAT + 115 3 110 111 # CAM-CAO + 116 6 110 116 # CAM-HAT + 117 4 111 117 # CAO-HAT + 118 8 112 118 # CTT-HT + 119 8 112 119 # CTT-HT + 120 8 112 120 # CTT-HT + 121 1 121 122 # CAT-CAO + 122 2 121 127 # CAT-CTT + 123 1 121 126 # CAT-CAO + 124 3 122 123 # CAO-CAM + 125 4 122 128 # CAO-HAT + 126 5 123 124 # CAM-CAP + 127 6 123 129 # CAM-HAT + 128 5 124 125 # CAP-CAM + 129 7 124 130 # CAP-HAT + 130 3 125 126 # CAM-CAO + 131 6 125 131 # CAM-HAT + 132 4 126 132 # CAO-HAT + 133 8 127 133 # CTT-HT + 134 8 127 134 # CTT-HT + 135 8 127 135 # CTT-HT + 136 1 136 137 # CAT-CAO + 137 2 136 142 # CAT-CTT + 138 1 136 141 # CAT-CAO + 139 3 137 138 # CAO-CAM + 140 4 137 143 # CAO-HAT + 141 5 138 139 # CAM-CAP + 142 6 138 144 # CAM-HAT + 143 5 139 140 # CAP-CAM + 144 7 139 145 # CAP-HAT + 145 3 140 141 # CAM-CAO + 146 6 140 146 # CAM-HAT + 147 4 141 147 # CAO-HAT + 148 8 142 148 # CTT-HT + 149 8 142 149 # CTT-HT + 150 8 142 150 # CTT-HT + 151 1 151 152 # CAT-CAO + 152 2 151 157 # CAT-CTT + 153 1 151 156 # CAT-CAO + 154 3 152 153 # CAO-CAM + 155 4 152 158 # CAO-HAT + 156 5 153 154 # CAM-CAP + 157 6 153 159 # CAM-HAT + 158 5 154 155 # CAP-CAM + 159 7 154 160 # CAP-HAT + 160 3 155 156 # CAM-CAO + 161 6 155 161 # CAM-HAT + 162 4 156 162 # CAO-HAT + 163 8 157 163 # CTT-HT + 164 8 157 164 # CTT-HT + 165 8 157 165 # CTT-HT + 166 1 166 167 # CAT-CAO + 167 2 166 172 # CAT-CTT + 168 1 166 171 # CAT-CAO + 169 3 167 168 # CAO-CAM + 170 4 167 173 # CAO-HAT + 171 5 168 169 # CAM-CAP + 172 6 168 174 # CAM-HAT + 173 5 169 170 # CAP-CAM + 174 7 169 175 # CAP-HAT + 175 3 170 171 # CAM-CAO + 176 6 170 176 # CAM-HAT + 177 4 171 177 # CAO-HAT + 178 8 172 178 # CTT-HT + 179 8 172 179 # CTT-HT + 180 8 172 180 # CTT-HT + 181 1 181 182 # CAT-CAO + 182 2 181 187 # CAT-CTT + 183 1 181 186 # CAT-CAO + 184 3 182 183 # CAO-CAM + 185 4 182 188 # CAO-HAT + 186 5 183 184 # CAM-CAP + 187 6 183 189 # CAM-HAT + 188 5 184 185 # CAP-CAM + 189 7 184 190 # CAP-HAT + 190 3 185 186 # CAM-CAO + 191 6 185 191 # CAM-HAT + 192 4 186 192 # CAO-HAT + 193 8 187 193 # CTT-HT + 194 8 187 194 # CTT-HT + 195 8 187 195 # CTT-HT + 196 1 196 197 # CAT-CAO + 197 2 196 202 # CAT-CTT + 198 1 196 201 # CAT-CAO + 199 3 197 198 # CAO-CAM + 200 4 197 203 # CAO-HAT + 201 5 198 199 # CAM-CAP + 202 6 198 204 # CAM-HAT + 203 5 199 200 # CAP-CAM + 204 7 199 205 # CAP-HAT + 205 3 200 201 # CAM-CAO + 206 6 200 206 # CAM-HAT + 207 4 201 207 # CAO-HAT + 208 8 202 208 # CTT-HT + 209 8 202 209 # CTT-HT + 210 8 202 210 # CTT-HT + 211 1 211 212 # CAT-CAO + 212 2 211 217 # CAT-CTT + 213 1 211 216 # CAT-CAO + 214 3 212 213 # CAO-CAM + 215 4 212 218 # CAO-HAT + 216 5 213 214 # CAM-CAP + 217 6 213 219 # CAM-HAT + 218 5 214 215 # CAP-CAM + 219 7 214 220 # CAP-HAT + 220 3 215 216 # CAM-CAO + 221 6 215 221 # CAM-HAT + 222 4 216 222 # CAO-HAT + 223 8 217 223 # CTT-HT + 224 8 217 224 # CTT-HT + 225 8 217 225 # CTT-HT + 226 1 226 227 # CAT-CAO + 227 2 226 232 # CAT-CTT + 228 1 226 231 # CAT-CAO + 229 3 227 228 # CAO-CAM + 230 4 227 233 # CAO-HAT + 231 5 228 229 # CAM-CAP + 232 6 228 234 # CAM-HAT + 233 5 229 230 # CAP-CAM + 234 7 229 235 # CAP-HAT + 235 3 230 231 # CAM-CAO + 236 6 230 236 # CAM-HAT + 237 4 231 237 # CAO-HAT + 238 8 232 238 # CTT-HT + 239 8 232 239 # CTT-HT + 240 8 232 240 # CTT-HT + 241 1 241 242 # CAT-CAO + 242 2 241 247 # CAT-CTT + 243 1 241 246 # CAT-CAO + 244 3 242 243 # CAO-CAM + 245 4 242 248 # CAO-HAT + 246 5 243 244 # CAM-CAP + 247 6 243 249 # CAM-HAT + 248 5 244 245 # CAP-CAM + 249 7 244 250 # CAP-HAT + 250 3 245 246 # CAM-CAO + 251 6 245 251 # CAM-HAT + 252 4 246 252 # CAO-HAT + 253 8 247 253 # CTT-HT + 254 8 247 254 # CTT-HT + 255 8 247 255 # CTT-HT + 256 1 256 257 # CAT-CAO + 257 2 256 262 # CAT-CTT + 258 1 256 261 # CAT-CAO + 259 3 257 258 # CAO-CAM + 260 4 257 263 # CAO-HAT + 261 5 258 259 # CAM-CAP + 262 6 258 264 # CAM-HAT + 263 5 259 260 # CAP-CAM + 264 7 259 265 # CAP-HAT + 265 3 260 261 # CAM-CAO + 266 6 260 266 # CAM-HAT + 267 4 261 267 # CAO-HAT + 268 8 262 268 # CTT-HT + 269 8 262 269 # CTT-HT + 270 8 262 270 # CTT-HT + 271 1 271 272 # CAT-CAO + 272 2 271 277 # CAT-CTT + 273 1 271 276 # CAT-CAO + 274 3 272 273 # CAO-CAM + 275 4 272 278 # CAO-HAT + 276 5 273 274 # CAM-CAP + 277 6 273 279 # CAM-HAT + 278 5 274 275 # CAP-CAM + 279 7 274 280 # CAP-HAT + 280 3 275 276 # CAM-CAO + 281 6 275 281 # CAM-HAT + 282 4 276 282 # CAO-HAT + 283 8 277 283 # CTT-HT + 284 8 277 284 # CTT-HT + 285 8 277 285 # CTT-HT + 286 1 286 287 # CAT-CAO + 287 2 286 292 # CAT-CTT + 288 1 286 291 # CAT-CAO + 289 3 287 288 # CAO-CAM + 290 4 287 293 # CAO-HAT + 291 5 288 289 # CAM-CAP + 292 6 288 294 # CAM-HAT + 293 5 289 290 # CAP-CAM + 294 7 289 295 # CAP-HAT + 295 3 290 291 # CAM-CAO + 296 6 290 296 # CAM-HAT + 297 4 291 297 # CAO-HAT + 298 8 292 298 # CTT-HT + 299 8 292 299 # CTT-HT + 300 8 292 300 # CTT-HT + 301 1 301 302 # CAT-CAO + 302 2 301 307 # CAT-CTT + 303 1 301 306 # CAT-CAO + 304 3 302 303 # CAO-CAM + 305 4 302 308 # CAO-HAT + 306 5 303 304 # CAM-CAP + 307 6 303 309 # CAM-HAT + 308 5 304 305 # CAP-CAM + 309 7 304 310 # CAP-HAT + 310 3 305 306 # CAM-CAO + 311 6 305 311 # CAM-HAT + 312 4 306 312 # CAO-HAT + 313 8 307 313 # CTT-HT + 314 8 307 314 # CTT-HT + 315 8 307 315 # CTT-HT + 316 1 316 317 # CAT-CAO + 317 2 316 322 # CAT-CTT + 318 1 316 321 # CAT-CAO + 319 3 317 318 # CAO-CAM + 320 4 317 323 # CAO-HAT + 321 5 318 319 # CAM-CAP + 322 6 318 324 # CAM-HAT + 323 5 319 320 # CAP-CAM + 324 7 319 325 # CAP-HAT + 325 3 320 321 # CAM-CAO + 326 6 320 326 # CAM-HAT + 327 4 321 327 # CAO-HAT + 328 8 322 328 # CTT-HT + 329 8 322 329 # CTT-HT + 330 8 322 330 # CTT-HT + 331 1 331 332 # CAT-CAO + 332 2 331 337 # CAT-CTT + 333 1 331 336 # CAT-CAO + 334 3 332 333 # CAO-CAM + 335 4 332 338 # CAO-HAT + 336 5 333 334 # CAM-CAP + 337 6 333 339 # CAM-HAT + 338 5 334 335 # CAP-CAM + 339 7 334 340 # CAP-HAT + 340 3 335 336 # CAM-CAO + 341 6 335 341 # CAM-HAT + 342 4 336 342 # CAO-HAT + 343 8 337 343 # CTT-HT + 344 8 337 344 # CTT-HT + 345 8 337 345 # CTT-HT + 346 1 346 347 # CAT-CAO + 347 2 346 352 # CAT-CTT + 348 1 346 351 # CAT-CAO + 349 3 347 348 # CAO-CAM + 350 4 347 353 # CAO-HAT + 351 5 348 349 # CAM-CAP + 352 6 348 354 # CAM-HAT + 353 5 349 350 # CAP-CAM + 354 7 349 355 # CAP-HAT + 355 3 350 351 # CAM-CAO + 356 6 350 356 # CAM-HAT + 357 4 351 357 # CAO-HAT + 358 8 352 358 # CTT-HT + 359 8 352 359 # CTT-HT + 360 8 352 360 # CTT-HT + 361 1 361 362 # CAT-CAO + 362 2 361 367 # CAT-CTT + 363 1 361 366 # CAT-CAO + 364 3 362 363 # CAO-CAM + 365 4 362 368 # CAO-HAT + 366 5 363 364 # CAM-CAP + 367 6 363 369 # CAM-HAT + 368 5 364 365 # CAP-CAM + 369 7 364 370 # CAP-HAT + 370 3 365 366 # CAM-CAO + 371 6 365 371 # CAM-HAT + 372 4 366 372 # CAO-HAT + 373 8 367 373 # CTT-HT + 374 8 367 374 # CTT-HT + 375 8 367 375 # CTT-HT + 376 1 376 377 # CAT-CAO + 377 2 376 382 # CAT-CTT + 378 1 376 381 # CAT-CAO + 379 3 377 378 # CAO-CAM + 380 4 377 383 # CAO-HAT + 381 5 378 379 # CAM-CAP + 382 6 378 384 # CAM-HAT + 383 5 379 380 # CAP-CAM + 384 7 379 385 # CAP-HAT + 385 3 380 381 # CAM-CAO + 386 6 380 386 # CAM-HAT + 387 4 381 387 # CAO-HAT + 388 8 382 388 # CTT-HT + 389 8 382 389 # CTT-HT + 390 8 382 390 # CTT-HT + 391 1 391 392 # CAT-CAO + 392 2 391 397 # CAT-CTT + 393 1 391 396 # CAT-CAO + 394 3 392 393 # CAO-CAM + 395 4 392 398 # CAO-HAT + 396 5 393 394 # CAM-CAP + 397 6 393 399 # CAM-HAT + 398 5 394 395 # CAP-CAM + 399 7 394 400 # CAP-HAT + 400 3 395 396 # CAM-CAO + 401 6 395 401 # CAM-HAT + 402 4 396 402 # CAO-HAT + 403 8 397 403 # CTT-HT + 404 8 397 404 # CTT-HT + 405 8 397 405 # CTT-HT + 406 1 406 407 # CAT-CAO + 407 2 406 412 # CAT-CTT + 408 1 406 411 # CAT-CAO + 409 3 407 408 # CAO-CAM + 410 4 407 413 # CAO-HAT + 411 5 408 409 # CAM-CAP + 412 6 408 414 # CAM-HAT + 413 5 409 410 # CAP-CAM + 414 7 409 415 # CAP-HAT + 415 3 410 411 # CAM-CAO + 416 6 410 416 # CAM-HAT + 417 4 411 417 # CAO-HAT + 418 8 412 418 # CTT-HT + 419 8 412 419 # CTT-HT + 420 8 412 420 # CTT-HT + 421 1 421 422 # CAT-CAO + 422 2 421 427 # CAT-CTT + 423 1 421 426 # CAT-CAO + 424 3 422 423 # CAO-CAM + 425 4 422 428 # CAO-HAT + 426 5 423 424 # CAM-CAP + 427 6 423 429 # CAM-HAT + 428 5 424 425 # CAP-CAM + 429 7 424 430 # CAP-HAT + 430 3 425 426 # CAM-CAO + 431 6 425 431 # CAM-HAT + 432 4 426 432 # CAO-HAT + 433 8 427 433 # CTT-HT + 434 8 427 434 # CTT-HT + 435 8 427 435 # CTT-HT + 436 1 436 437 # CAT-CAO + 437 2 436 442 # CAT-CTT + 438 1 436 441 # CAT-CAO + 439 3 437 438 # CAO-CAM + 440 4 437 443 # CAO-HAT + 441 5 438 439 # CAM-CAP + 442 6 438 444 # CAM-HAT + 443 5 439 440 # CAP-CAM + 444 7 439 445 # CAP-HAT + 445 3 440 441 # CAM-CAO + 446 6 440 446 # CAM-HAT + 447 4 441 447 # CAO-HAT + 448 8 442 448 # CTT-HT + 449 8 442 449 # CTT-HT + 450 8 442 450 # CTT-HT + 451 1 451 452 # CAT-CAO + 452 2 451 457 # CAT-CTT + 453 1 451 456 # CAT-CAO + 454 3 452 453 # CAO-CAM + 455 4 452 458 # CAO-HAT + 456 5 453 454 # CAM-CAP + 457 6 453 459 # CAM-HAT + 458 5 454 455 # CAP-CAM + 459 7 454 460 # CAP-HAT + 460 3 455 456 # CAM-CAO + 461 6 455 461 # CAM-HAT + 462 4 456 462 # CAO-HAT + 463 8 457 463 # CTT-HT + 464 8 457 464 # CTT-HT + 465 8 457 465 # CTT-HT + 466 1 466 467 # CAT-CAO + 467 2 466 472 # CAT-CTT + 468 1 466 471 # CAT-CAO + 469 3 467 468 # CAO-CAM + 470 4 467 473 # CAO-HAT + 471 5 468 469 # CAM-CAP + 472 6 468 474 # CAM-HAT + 473 5 469 470 # CAP-CAM + 474 7 469 475 # CAP-HAT + 475 3 470 471 # CAM-CAO + 476 6 470 476 # CAM-HAT + 477 4 471 477 # CAO-HAT + 478 8 472 478 # CTT-HT + 479 8 472 479 # CTT-HT + 480 8 472 480 # CTT-HT + 481 1 481 482 # CAT-CAO + 482 2 481 487 # CAT-CTT + 483 1 481 486 # CAT-CAO + 484 3 482 483 # CAO-CAM + 485 4 482 488 # CAO-HAT + 486 5 483 484 # CAM-CAP + 487 6 483 489 # CAM-HAT + 488 5 484 485 # CAP-CAM + 489 7 484 490 # CAP-HAT + 490 3 485 486 # CAM-CAO + 491 6 485 491 # CAM-HAT + 492 4 486 492 # CAO-HAT + 493 8 487 493 # CTT-HT + 494 8 487 494 # CTT-HT + 495 8 487 495 # CTT-HT + 496 1 496 497 # CAT-CAO + 497 2 496 502 # CAT-CTT + 498 1 496 501 # CAT-CAO + 499 3 497 498 # CAO-CAM + 500 4 497 503 # CAO-HAT + 501 5 498 499 # CAM-CAP + 502 6 498 504 # CAM-HAT + 503 5 499 500 # CAP-CAM + 504 7 499 505 # CAP-HAT + 505 3 500 501 # CAM-CAO + 506 6 500 506 # CAM-HAT + 507 4 501 507 # CAO-HAT + 508 8 502 508 # CTT-HT + 509 8 502 509 # CTT-HT + 510 8 502 510 # CTT-HT + 511 1 511 512 # CAT-CAO + 512 2 511 517 # CAT-CTT + 513 1 511 516 # CAT-CAO + 514 3 512 513 # CAO-CAM + 515 4 512 518 # CAO-HAT + 516 5 513 514 # CAM-CAP + 517 6 513 519 # CAM-HAT + 518 5 514 515 # CAP-CAM + 519 7 514 520 # CAP-HAT + 520 3 515 516 # CAM-CAO + 521 6 515 521 # CAM-HAT + 522 4 516 522 # CAO-HAT + 523 8 517 523 # CTT-HT + 524 8 517 524 # CTT-HT + 525 8 517 525 # CTT-HT + 526 1 526 527 # CAT-CAO + 527 2 526 532 # CAT-CTT + 528 1 526 531 # CAT-CAO + 529 3 527 528 # CAO-CAM + 530 4 527 533 # CAO-HAT + 531 5 528 529 # CAM-CAP + 532 6 528 534 # CAM-HAT + 533 5 529 530 # CAP-CAM + 534 7 529 535 # CAP-HAT + 535 3 530 531 # CAM-CAO + 536 6 530 536 # CAM-HAT + 537 4 531 537 # CAO-HAT + 538 8 532 538 # CTT-HT + 539 8 532 539 # CTT-HT + 540 8 532 540 # CTT-HT + 541 1 541 542 # CAT-CAO + 542 2 541 547 # CAT-CTT + 543 1 541 546 # CAT-CAO + 544 3 542 543 # CAO-CAM + 545 4 542 548 # CAO-HAT + 546 5 543 544 # CAM-CAP + 547 6 543 549 # CAM-HAT + 548 5 544 545 # CAP-CAM + 549 7 544 550 # CAP-HAT + 550 3 545 546 # CAM-CAO + 551 6 545 551 # CAM-HAT + 552 4 546 552 # CAO-HAT + 553 8 547 553 # CTT-HT + 554 8 547 554 # CTT-HT + 555 8 547 555 # CTT-HT + 556 1 556 557 # CAT-CAO + 557 2 556 562 # CAT-CTT + 558 1 556 561 # CAT-CAO + 559 3 557 558 # CAO-CAM + 560 4 557 563 # CAO-HAT + 561 5 558 559 # CAM-CAP + 562 6 558 564 # CAM-HAT + 563 5 559 560 # CAP-CAM + 564 7 559 565 # CAP-HAT + 565 3 560 561 # CAM-CAO + 566 6 560 566 # CAM-HAT + 567 4 561 567 # CAO-HAT + 568 8 562 568 # CTT-HT + 569 8 562 569 # CTT-HT + 570 8 562 570 # CTT-HT + 571 1 571 572 # CAT-CAO + 572 2 571 577 # CAT-CTT + 573 1 571 576 # CAT-CAO + 574 3 572 573 # CAO-CAM + 575 4 572 578 # CAO-HAT + 576 5 573 574 # CAM-CAP + 577 6 573 579 # CAM-HAT + 578 5 574 575 # CAP-CAM + 579 7 574 580 # CAP-HAT + 580 3 575 576 # CAM-CAO + 581 6 575 581 # CAM-HAT + 582 4 576 582 # CAO-HAT + 583 8 577 583 # CTT-HT + 584 8 577 584 # CTT-HT + 585 8 577 585 # CTT-HT + 586 1 586 587 # CAT-CAO + 587 2 586 592 # CAT-CTT + 588 1 586 591 # CAT-CAO + 589 3 587 588 # CAO-CAM + 590 4 587 593 # CAO-HAT + 591 5 588 589 # CAM-CAP + 592 6 588 594 # CAM-HAT + 593 5 589 590 # CAP-CAM + 594 7 589 595 # CAP-HAT + 595 3 590 591 # CAM-CAO + 596 6 590 596 # CAM-HAT + 597 4 591 597 # CAO-HAT + 598 8 592 598 # CTT-HT + 599 8 592 599 # CTT-HT + 600 8 592 600 # CTT-HT + 601 1 601 602 # CAT-CAO + 602 2 601 607 # CAT-CTT + 603 1 601 606 # CAT-CAO + 604 3 602 603 # CAO-CAM + 605 4 602 608 # CAO-HAT + 606 5 603 604 # CAM-CAP + 607 6 603 609 # CAM-HAT + 608 5 604 605 # CAP-CAM + 609 7 604 610 # CAP-HAT + 610 3 605 606 # CAM-CAO + 611 6 605 611 # CAM-HAT + 612 4 606 612 # CAO-HAT + 613 8 607 613 # CTT-HT + 614 8 607 614 # CTT-HT + 615 8 607 615 # CTT-HT + 616 1 616 617 # CAT-CAO + 617 2 616 622 # CAT-CTT + 618 1 616 621 # CAT-CAO + 619 3 617 618 # CAO-CAM + 620 4 617 623 # CAO-HAT + 621 5 618 619 # CAM-CAP + 622 6 618 624 # CAM-HAT + 623 5 619 620 # CAP-CAM + 624 7 619 625 # CAP-HAT + 625 3 620 621 # CAM-CAO + 626 6 620 626 # CAM-HAT + 627 4 621 627 # CAO-HAT + 628 8 622 628 # CTT-HT + 629 8 622 629 # CTT-HT + 630 8 622 630 # CTT-HT + 631 1 631 632 # CAT-CAO + 632 2 631 637 # CAT-CTT + 633 1 631 636 # CAT-CAO + 634 3 632 633 # CAO-CAM + 635 4 632 638 # CAO-HAT + 636 5 633 634 # CAM-CAP + 637 6 633 639 # CAM-HAT + 638 5 634 635 # CAP-CAM + 639 7 634 640 # CAP-HAT + 640 3 635 636 # CAM-CAO + 641 6 635 641 # CAM-HAT + 642 4 636 642 # CAO-HAT + 643 8 637 643 # CTT-HT + 644 8 637 644 # CTT-HT + 645 8 637 645 # CTT-HT + 646 1 646 647 # CAT-CAO + 647 2 646 652 # CAT-CTT + 648 1 646 651 # CAT-CAO + 649 3 647 648 # CAO-CAM + 650 4 647 653 # CAO-HAT + 651 5 648 649 # CAM-CAP + 652 6 648 654 # CAM-HAT + 653 5 649 650 # CAP-CAM + 654 7 649 655 # CAP-HAT + 655 3 650 651 # CAM-CAO + 656 6 650 656 # CAM-HAT + 657 4 651 657 # CAO-HAT + 658 8 652 658 # CTT-HT + 659 8 652 659 # CTT-HT + 660 8 652 660 # CTT-HT + 661 1 661 662 # CAT-CAO + 662 2 661 667 # CAT-CTT + 663 1 661 666 # CAT-CAO + 664 3 662 663 # CAO-CAM + 665 4 662 668 # CAO-HAT + 666 5 663 664 # CAM-CAP + 667 6 663 669 # CAM-HAT + 668 5 664 665 # CAP-CAM + 669 7 664 670 # CAP-HAT + 670 3 665 666 # CAM-CAO + 671 6 665 671 # CAM-HAT + 672 4 666 672 # CAO-HAT + 673 8 667 673 # CTT-HT + 674 8 667 674 # CTT-HT + 675 8 667 675 # CTT-HT + 676 1 676 677 # CAT-CAO + 677 2 676 682 # CAT-CTT + 678 1 676 681 # CAT-CAO + 679 3 677 678 # CAO-CAM + 680 4 677 683 # CAO-HAT + 681 5 678 679 # CAM-CAP + 682 6 678 684 # CAM-HAT + 683 5 679 680 # CAP-CAM + 684 7 679 685 # CAP-HAT + 685 3 680 681 # CAM-CAO + 686 6 680 686 # CAM-HAT + 687 4 681 687 # CAO-HAT + 688 8 682 688 # CTT-HT + 689 8 682 689 # CTT-HT + 690 8 682 690 # CTT-HT + 691 1 691 692 # CAT-CAO + 692 2 691 697 # CAT-CTT + 693 1 691 696 # CAT-CAO + 694 3 692 693 # CAO-CAM + 695 4 692 698 # CAO-HAT + 696 5 693 694 # CAM-CAP + 697 6 693 699 # CAM-HAT + 698 5 694 695 # CAP-CAM + 699 7 694 700 # CAP-HAT + 700 3 695 696 # CAM-CAO + 701 6 695 701 # CAM-HAT + 702 4 696 702 # CAO-HAT + 703 8 697 703 # CTT-HT + 704 8 697 704 # CTT-HT + 705 8 697 705 # CTT-HT + 706 1 706 707 # CAT-CAO + 707 2 706 712 # CAT-CTT + 708 1 706 711 # CAT-CAO + 709 3 707 708 # CAO-CAM + 710 4 707 713 # CAO-HAT + 711 5 708 709 # CAM-CAP + 712 6 708 714 # CAM-HAT + 713 5 709 710 # CAP-CAM + 714 7 709 715 # CAP-HAT + 715 3 710 711 # CAM-CAO + 716 6 710 716 # CAM-HAT + 717 4 711 717 # CAO-HAT + 718 8 712 718 # CTT-HT + 719 8 712 719 # CTT-HT + 720 8 712 720 # CTT-HT + 721 1 721 722 # CAT-CAO + 722 2 721 727 # CAT-CTT + 723 1 721 726 # CAT-CAO + 724 3 722 723 # CAO-CAM + 725 4 722 728 # CAO-HAT + 726 5 723 724 # CAM-CAP + 727 6 723 729 # CAM-HAT + 728 5 724 725 # CAP-CAM + 729 7 724 730 # CAP-HAT + 730 3 725 726 # CAM-CAO + 731 6 725 731 # CAM-HAT + 732 4 726 732 # CAO-HAT + 733 8 727 733 # CTT-HT + 734 8 727 734 # CTT-HT + 735 8 727 735 # CTT-HT + 736 1 736 737 # CAT-CAO + 737 2 736 742 # CAT-CTT + 738 1 736 741 # CAT-CAO + 739 3 737 738 # CAO-CAM + 740 4 737 743 # CAO-HAT + 741 5 738 739 # CAM-CAP + 742 6 738 744 # CAM-HAT + 743 5 739 740 # CAP-CAM + 744 7 739 745 # CAP-HAT + 745 3 740 741 # CAM-CAO + 746 6 740 746 # CAM-HAT + 747 4 741 747 # CAO-HAT + 748 8 742 748 # CTT-HT + 749 8 742 749 # CTT-HT + 750 8 742 750 # CTT-HT + 751 1 751 752 # CAT-CAO + 752 2 751 757 # CAT-CTT + 753 1 751 756 # CAT-CAO + 754 3 752 753 # CAO-CAM + 755 4 752 758 # CAO-HAT + 756 5 753 754 # CAM-CAP + 757 6 753 759 # CAM-HAT + 758 5 754 755 # CAP-CAM + 759 7 754 760 # CAP-HAT + 760 3 755 756 # CAM-CAO + 761 6 755 761 # CAM-HAT + 762 4 756 762 # CAO-HAT + 763 8 757 763 # CTT-HT + 764 8 757 764 # CTT-HT + 765 8 757 765 # CTT-HT + 766 1 766 767 # CAT-CAO + 767 2 766 772 # CAT-CTT + 768 1 766 771 # CAT-CAO + 769 3 767 768 # CAO-CAM + 770 4 767 773 # CAO-HAT + 771 5 768 769 # CAM-CAP + 772 6 768 774 # CAM-HAT + 773 5 769 770 # CAP-CAM + 774 7 769 775 # CAP-HAT + 775 3 770 771 # CAM-CAO + 776 6 770 776 # CAM-HAT + 777 4 771 777 # CAO-HAT + 778 8 772 778 # CTT-HT + 779 8 772 779 # CTT-HT + 780 8 772 780 # CTT-HT + 781 1 781 782 # CAT-CAO + 782 2 781 787 # CAT-CTT + 783 1 781 786 # CAT-CAO + 784 3 782 783 # CAO-CAM + 785 4 782 788 # CAO-HAT + 786 5 783 784 # CAM-CAP + 787 6 783 789 # CAM-HAT + 788 5 784 785 # CAP-CAM + 789 7 784 790 # CAP-HAT + 790 3 785 786 # CAM-CAO + 791 6 785 791 # CAM-HAT + 792 4 786 792 # CAO-HAT + 793 8 787 793 # CTT-HT + 794 8 787 794 # CTT-HT + 795 8 787 795 # CTT-HT + 796 1 796 797 # CAT-CAO + 797 2 796 802 # CAT-CTT + 798 1 796 801 # CAT-CAO + 799 3 797 798 # CAO-CAM + 800 4 797 803 # CAO-HAT + 801 5 798 799 # CAM-CAP + 802 6 798 804 # CAM-HAT + 803 5 799 800 # CAP-CAM + 804 7 799 805 # CAP-HAT + 805 3 800 801 # CAM-CAO + 806 6 800 806 # CAM-HAT + 807 4 801 807 # CAO-HAT + 808 8 802 808 # CTT-HT + 809 8 802 809 # CTT-HT + 810 8 802 810 # CTT-HT + 811 1 811 812 # CAT-CAO + 812 2 811 817 # CAT-CTT + 813 1 811 816 # CAT-CAO + 814 3 812 813 # CAO-CAM + 815 4 812 818 # CAO-HAT + 816 5 813 814 # CAM-CAP + 817 6 813 819 # CAM-HAT + 818 5 814 815 # CAP-CAM + 819 7 814 820 # CAP-HAT + 820 3 815 816 # CAM-CAO + 821 6 815 821 # CAM-HAT + 822 4 816 822 # CAO-HAT + 823 8 817 823 # CTT-HT + 824 8 817 824 # CTT-HT + 825 8 817 825 # CTT-HT + 826 1 826 827 # CAT-CAO + 827 2 826 832 # CAT-CTT + 828 1 826 831 # CAT-CAO + 829 3 827 828 # CAO-CAM + 830 4 827 833 # CAO-HAT + 831 5 828 829 # CAM-CAP + 832 6 828 834 # CAM-HAT + 833 5 829 830 # CAP-CAM + 834 7 829 835 # CAP-HAT + 835 3 830 831 # CAM-CAO + 836 6 830 836 # CAM-HAT + 837 4 831 837 # CAO-HAT + 838 8 832 838 # CTT-HT + 839 8 832 839 # CTT-HT + 840 8 832 840 # CTT-HT + 841 1 841 842 # CAT-CAO + 842 2 841 847 # CAT-CTT + 843 1 841 846 # CAT-CAO + 844 3 842 843 # CAO-CAM + 845 4 842 848 # CAO-HAT + 846 5 843 844 # CAM-CAP + 847 6 843 849 # CAM-HAT + 848 5 844 845 # CAP-CAM + 849 7 844 850 # CAP-HAT + 850 3 845 846 # CAM-CAO + 851 6 845 851 # CAM-HAT + 852 4 846 852 # CAO-HAT + 853 8 847 853 # CTT-HT + 854 8 847 854 # CTT-HT + 855 8 847 855 # CTT-HT + 856 1 856 857 # CAT-CAO + 857 2 856 862 # CAT-CTT + 858 1 856 861 # CAT-CAO + 859 3 857 858 # CAO-CAM + 860 4 857 863 # CAO-HAT + 861 5 858 859 # CAM-CAP + 862 6 858 864 # CAM-HAT + 863 5 859 860 # CAP-CAM + 864 7 859 865 # CAP-HAT + 865 3 860 861 # CAM-CAO + 866 6 860 866 # CAM-HAT + 867 4 861 867 # CAO-HAT + 868 8 862 868 # CTT-HT + 869 8 862 869 # CTT-HT + 870 8 862 870 # CTT-HT + 871 1 871 872 # CAT-CAO + 872 2 871 877 # CAT-CTT + 873 1 871 876 # CAT-CAO + 874 3 872 873 # CAO-CAM + 875 4 872 878 # CAO-HAT + 876 5 873 874 # CAM-CAP + 877 6 873 879 # CAM-HAT + 878 5 874 875 # CAP-CAM + 879 7 874 880 # CAP-HAT + 880 3 875 876 # CAM-CAO + 881 6 875 881 # CAM-HAT + 882 4 876 882 # CAO-HAT + 883 8 877 883 # CTT-HT + 884 8 877 884 # CTT-HT + 885 8 877 885 # CTT-HT + 886 1 886 887 # CAT-CAO + 887 2 886 892 # CAT-CTT + 888 1 886 891 # CAT-CAO + 889 3 887 888 # CAO-CAM + 890 4 887 893 # CAO-HAT + 891 5 888 889 # CAM-CAP + 892 6 888 894 # CAM-HAT + 893 5 889 890 # CAP-CAM + 894 7 889 895 # CAP-HAT + 895 3 890 891 # CAM-CAO + 896 6 890 896 # CAM-HAT + 897 4 891 897 # CAO-HAT + 898 8 892 898 # CTT-HT + 899 8 892 899 # CTT-HT + 900 8 892 900 # CTT-HT + 901 1 901 902 # CAT-CAO + 902 2 901 907 # CAT-CTT + 903 1 901 906 # CAT-CAO + 904 3 902 903 # CAO-CAM + 905 4 902 908 # CAO-HAT + 906 5 903 904 # CAM-CAP + 907 6 903 909 # CAM-HAT + 908 5 904 905 # CAP-CAM + 909 7 904 910 # CAP-HAT + 910 3 905 906 # CAM-CAO + 911 6 905 911 # CAM-HAT + 912 4 906 912 # CAO-HAT + 913 8 907 913 # CTT-HT + 914 8 907 914 # CTT-HT + 915 8 907 915 # CTT-HT + 916 1 916 917 # CAT-CAO + 917 2 916 922 # CAT-CTT + 918 1 916 921 # CAT-CAO + 919 3 917 918 # CAO-CAM + 920 4 917 923 # CAO-HAT + 921 5 918 919 # CAM-CAP + 922 6 918 924 # CAM-HAT + 923 5 919 920 # CAP-CAM + 924 7 919 925 # CAP-HAT + 925 3 920 921 # CAM-CAO + 926 6 920 926 # CAM-HAT + 927 4 921 927 # CAO-HAT + 928 8 922 928 # CTT-HT + 929 8 922 929 # CTT-HT + 930 8 922 930 # CTT-HT + 931 1 931 932 # CAT-CAO + 932 2 931 937 # CAT-CTT + 933 1 931 936 # CAT-CAO + 934 3 932 933 # CAO-CAM + 935 4 932 938 # CAO-HAT + 936 5 933 934 # CAM-CAP + 937 6 933 939 # CAM-HAT + 938 5 934 935 # CAP-CAM + 939 7 934 940 # CAP-HAT + 940 3 935 936 # CAM-CAO + 941 6 935 941 # CAM-HAT + 942 4 936 942 # CAO-HAT + 943 8 937 943 # CTT-HT + 944 8 937 944 # CTT-HT + 945 8 937 945 # CTT-HT + 946 1 946 947 # CAT-CAO + 947 2 946 952 # CAT-CTT + 948 1 946 951 # CAT-CAO + 949 3 947 948 # CAO-CAM + 950 4 947 953 # CAO-HAT + 951 5 948 949 # CAM-CAP + 952 6 948 954 # CAM-HAT + 953 5 949 950 # CAP-CAM + 954 7 949 955 # CAP-HAT + 955 3 950 951 # CAM-CAO + 956 6 950 956 # CAM-HAT + 957 4 951 957 # CAO-HAT + 958 8 952 958 # CTT-HT + 959 8 952 959 # CTT-HT + 960 8 952 960 # CTT-HT + 961 1 961 962 # CAT-CAO + 962 2 961 967 # CAT-CTT + 963 1 961 966 # CAT-CAO + 964 3 962 963 # CAO-CAM + 965 4 962 968 # CAO-HAT + 966 5 963 964 # CAM-CAP + 967 6 963 969 # CAM-HAT + 968 5 964 965 # CAP-CAM + 969 7 964 970 # CAP-HAT + 970 3 965 966 # CAM-CAO + 971 6 965 971 # CAM-HAT + 972 4 966 972 # CAO-HAT + 973 8 967 973 # CTT-HT + 974 8 967 974 # CTT-HT + 975 8 967 975 # CTT-HT + 976 1 976 977 # CAT-CAO + 977 2 976 982 # CAT-CTT + 978 1 976 981 # CAT-CAO + 979 3 977 978 # CAO-CAM + 980 4 977 983 # CAO-HAT + 981 5 978 979 # CAM-CAP + 982 6 978 984 # CAM-HAT + 983 5 979 980 # CAP-CAM + 984 7 979 985 # CAP-HAT + 985 3 980 981 # CAM-CAO + 986 6 980 986 # CAM-HAT + 987 4 981 987 # CAO-HAT + 988 8 982 988 # CTT-HT + 989 8 982 989 # CTT-HT + 990 8 982 990 # CTT-HT + 991 1 991 992 # CAT-CAO + 992 2 991 997 # CAT-CTT + 993 1 991 996 # CAT-CAO + 994 3 992 993 # CAO-CAM + 995 4 992 998 # CAO-HAT + 996 5 993 994 # CAM-CAP + 997 6 993 999 # CAM-HAT + 998 5 994 995 # CAP-CAM + 999 7 994 1000 # CAP-HAT + 1000 3 995 996 # CAM-CAO + 1001 6 995 1001 # CAM-HAT + 1002 4 996 1002 # CAO-HAT + 1003 8 997 1003 # CTT-HT + 1004 8 997 1004 # CTT-HT + 1005 8 997 1005 # CTT-HT + 1006 1 1006 1007 # CAT-CAO + 1007 2 1006 1012 # CAT-CTT + 1008 1 1006 1011 # CAT-CAO + 1009 3 1007 1008 # CAO-CAM + 1010 4 1007 1013 # CAO-HAT + 1011 5 1008 1009 # CAM-CAP + 1012 6 1008 1014 # CAM-HAT + 1013 5 1009 1010 # CAP-CAM + 1014 7 1009 1015 # CAP-HAT + 1015 3 1010 1011 # CAM-CAO + 1016 6 1010 1016 # CAM-HAT + 1017 4 1011 1017 # CAO-HAT + 1018 8 1012 1018 # CTT-HT + 1019 8 1012 1019 # CTT-HT + 1020 8 1012 1020 # CTT-HT + 1021 1 1021 1022 # CAT-CAO + 1022 2 1021 1027 # CAT-CTT + 1023 1 1021 1026 # CAT-CAO + 1024 3 1022 1023 # CAO-CAM + 1025 4 1022 1028 # CAO-HAT + 1026 5 1023 1024 # CAM-CAP + 1027 6 1023 1029 # CAM-HAT + 1028 5 1024 1025 # CAP-CAM + 1029 7 1024 1030 # CAP-HAT + 1030 3 1025 1026 # CAM-CAO + 1031 6 1025 1031 # CAM-HAT + 1032 4 1026 1032 # CAO-HAT + 1033 8 1027 1033 # CTT-HT + 1034 8 1027 1034 # CTT-HT + 1035 8 1027 1035 # CTT-HT + 1036 1 1036 1037 # CAT-CAO + 1037 2 1036 1042 # CAT-CTT + 1038 1 1036 1041 # CAT-CAO + 1039 3 1037 1038 # CAO-CAM + 1040 4 1037 1043 # CAO-HAT + 1041 5 1038 1039 # CAM-CAP + 1042 6 1038 1044 # CAM-HAT + 1043 5 1039 1040 # CAP-CAM + 1044 7 1039 1045 # CAP-HAT + 1045 3 1040 1041 # CAM-CAO + 1046 6 1040 1046 # CAM-HAT + 1047 4 1041 1047 # CAO-HAT + 1048 8 1042 1048 # CTT-HT + 1049 8 1042 1049 # CTT-HT + 1050 8 1042 1050 # CTT-HT + 1051 1 1051 1052 # CAT-CAO + 1052 2 1051 1057 # CAT-CTT + 1053 1 1051 1056 # CAT-CAO + 1054 3 1052 1053 # CAO-CAM + 1055 4 1052 1058 # CAO-HAT + 1056 5 1053 1054 # CAM-CAP + 1057 6 1053 1059 # CAM-HAT + 1058 5 1054 1055 # CAP-CAM + 1059 7 1054 1060 # CAP-HAT + 1060 3 1055 1056 # CAM-CAO + 1061 6 1055 1061 # CAM-HAT + 1062 4 1056 1062 # CAO-HAT + 1063 8 1057 1063 # CTT-HT + 1064 8 1057 1064 # CTT-HT + 1065 8 1057 1065 # CTT-HT + 1066 1 1066 1067 # CAT-CAO + 1067 2 1066 1072 # CAT-CTT + 1068 1 1066 1071 # CAT-CAO + 1069 3 1067 1068 # CAO-CAM + 1070 4 1067 1073 # CAO-HAT + 1071 5 1068 1069 # CAM-CAP + 1072 6 1068 1074 # CAM-HAT + 1073 5 1069 1070 # CAP-CAM + 1074 7 1069 1075 # CAP-HAT + 1075 3 1070 1071 # CAM-CAO + 1076 6 1070 1076 # CAM-HAT + 1077 4 1071 1077 # CAO-HAT + 1078 8 1072 1078 # CTT-HT + 1079 8 1072 1079 # CTT-HT + 1080 8 1072 1080 # CTT-HT + 1081 1 1081 1082 # CAT-CAO + 1082 2 1081 1087 # CAT-CTT + 1083 1 1081 1086 # CAT-CAO + 1084 3 1082 1083 # CAO-CAM + 1085 4 1082 1088 # CAO-HAT + 1086 5 1083 1084 # CAM-CAP + 1087 6 1083 1089 # CAM-HAT + 1088 5 1084 1085 # CAP-CAM + 1089 7 1084 1090 # CAP-HAT + 1090 3 1085 1086 # CAM-CAO + 1091 6 1085 1091 # CAM-HAT + 1092 4 1086 1092 # CAO-HAT + 1093 8 1087 1093 # CTT-HT + 1094 8 1087 1094 # CTT-HT + 1095 8 1087 1095 # CTT-HT + 1096 1 1096 1097 # CAT-CAO + 1097 2 1096 1102 # CAT-CTT + 1098 1 1096 1101 # CAT-CAO + 1099 3 1097 1098 # CAO-CAM + 1100 4 1097 1103 # CAO-HAT + 1101 5 1098 1099 # CAM-CAP + 1102 6 1098 1104 # CAM-HAT + 1103 5 1099 1100 # CAP-CAM + 1104 7 1099 1105 # CAP-HAT + 1105 3 1100 1101 # CAM-CAO + 1106 6 1100 1106 # CAM-HAT + 1107 4 1101 1107 # CAO-HAT + 1108 8 1102 1108 # CTT-HT + 1109 8 1102 1109 # CTT-HT + 1110 8 1102 1110 # CTT-HT + 1111 1 1111 1112 # CAT-CAO + 1112 2 1111 1117 # CAT-CTT + 1113 1 1111 1116 # CAT-CAO + 1114 3 1112 1113 # CAO-CAM + 1115 4 1112 1118 # CAO-HAT + 1116 5 1113 1114 # CAM-CAP + 1117 6 1113 1119 # CAM-HAT + 1118 5 1114 1115 # CAP-CAM + 1119 7 1114 1120 # CAP-HAT + 1120 3 1115 1116 # CAM-CAO + 1121 6 1115 1121 # CAM-HAT + 1122 4 1116 1122 # CAO-HAT + 1123 8 1117 1123 # CTT-HT + 1124 8 1117 1124 # CTT-HT + 1125 8 1117 1125 # CTT-HT + 1126 1 1126 1127 # CAT-CAO + 1127 2 1126 1132 # CAT-CTT + 1128 1 1126 1131 # CAT-CAO + 1129 3 1127 1128 # CAO-CAM + 1130 4 1127 1133 # CAO-HAT + 1131 5 1128 1129 # CAM-CAP + 1132 6 1128 1134 # CAM-HAT + 1133 5 1129 1130 # CAP-CAM + 1134 7 1129 1135 # CAP-HAT + 1135 3 1130 1131 # CAM-CAO + 1136 6 1130 1136 # CAM-HAT + 1137 4 1131 1137 # CAO-HAT + 1138 8 1132 1138 # CTT-HT + 1139 8 1132 1139 # CTT-HT + 1140 8 1132 1140 # CTT-HT + 1141 1 1141 1142 # CAT-CAO + 1142 2 1141 1147 # CAT-CTT + 1143 1 1141 1146 # CAT-CAO + 1144 3 1142 1143 # CAO-CAM + 1145 4 1142 1148 # CAO-HAT + 1146 5 1143 1144 # CAM-CAP + 1147 6 1143 1149 # CAM-HAT + 1148 5 1144 1145 # CAP-CAM + 1149 7 1144 1150 # CAP-HAT + 1150 3 1145 1146 # CAM-CAO + 1151 6 1145 1151 # CAM-HAT + 1152 4 1146 1152 # CAO-HAT + 1153 8 1147 1153 # CTT-HT + 1154 8 1147 1154 # CTT-HT + 1155 8 1147 1155 # CTT-HT + 1156 1 1156 1157 # CAT-CAO + 1157 2 1156 1162 # CAT-CTT + 1158 1 1156 1161 # CAT-CAO + 1159 3 1157 1158 # CAO-CAM + 1160 4 1157 1163 # CAO-HAT + 1161 5 1158 1159 # CAM-CAP + 1162 6 1158 1164 # CAM-HAT + 1163 5 1159 1160 # CAP-CAM + 1164 7 1159 1165 # CAP-HAT + 1165 3 1160 1161 # CAM-CAO + 1166 6 1160 1166 # CAM-HAT + 1167 4 1161 1167 # CAO-HAT + 1168 8 1162 1168 # CTT-HT + 1169 8 1162 1169 # CTT-HT + 1170 8 1162 1170 # CTT-HT + 1171 1 1171 1172 # CAT-CAO + 1172 2 1171 1177 # CAT-CTT + 1173 1 1171 1176 # CAT-CAO + 1174 3 1172 1173 # CAO-CAM + 1175 4 1172 1178 # CAO-HAT + 1176 5 1173 1174 # CAM-CAP + 1177 6 1173 1179 # CAM-HAT + 1178 5 1174 1175 # CAP-CAM + 1179 7 1174 1180 # CAP-HAT + 1180 3 1175 1176 # CAM-CAO + 1181 6 1175 1181 # CAM-HAT + 1182 4 1176 1182 # CAO-HAT + 1183 8 1177 1183 # CTT-HT + 1184 8 1177 1184 # CTT-HT + 1185 8 1177 1185 # CTT-HT + 1186 1 1186 1187 # CAT-CAO + 1187 2 1186 1192 # CAT-CTT + 1188 1 1186 1191 # CAT-CAO + 1189 3 1187 1188 # CAO-CAM + 1190 4 1187 1193 # CAO-HAT + 1191 5 1188 1189 # CAM-CAP + 1192 6 1188 1194 # CAM-HAT + 1193 5 1189 1190 # CAP-CAM + 1194 7 1189 1195 # CAP-HAT + 1195 3 1190 1191 # CAM-CAO + 1196 6 1190 1196 # CAM-HAT + 1197 4 1191 1197 # CAO-HAT + 1198 8 1192 1198 # CTT-HT + 1199 8 1192 1199 # CTT-HT + 1200 8 1192 1200 # CTT-HT + 1201 1 1201 1202 # CAT-CAO + 1202 2 1201 1207 # CAT-CTT + 1203 1 1201 1206 # CAT-CAO + 1204 3 1202 1203 # CAO-CAM + 1205 4 1202 1208 # CAO-HAT + 1206 5 1203 1204 # CAM-CAP + 1207 6 1203 1209 # CAM-HAT + 1208 5 1204 1205 # CAP-CAM + 1209 7 1204 1210 # CAP-HAT + 1210 3 1205 1206 # CAM-CAO + 1211 6 1205 1211 # CAM-HAT + 1212 4 1206 1212 # CAO-HAT + 1213 8 1207 1213 # CTT-HT + 1214 8 1207 1214 # CTT-HT + 1215 8 1207 1215 # CTT-HT + 1216 1 1216 1217 # CAT-CAO + 1217 2 1216 1222 # CAT-CTT + 1218 1 1216 1221 # CAT-CAO + 1219 3 1217 1218 # CAO-CAM + 1220 4 1217 1223 # CAO-HAT + 1221 5 1218 1219 # CAM-CAP + 1222 6 1218 1224 # CAM-HAT + 1223 5 1219 1220 # CAP-CAM + 1224 7 1219 1225 # CAP-HAT + 1225 3 1220 1221 # CAM-CAO + 1226 6 1220 1226 # CAM-HAT + 1227 4 1221 1227 # CAO-HAT + 1228 8 1222 1228 # CTT-HT + 1229 8 1222 1229 # CTT-HT + 1230 8 1222 1230 # CTT-HT + 1231 1 1231 1232 # CAT-CAO + 1232 2 1231 1237 # CAT-CTT + 1233 1 1231 1236 # CAT-CAO + 1234 3 1232 1233 # CAO-CAM + 1235 4 1232 1238 # CAO-HAT + 1236 5 1233 1234 # CAM-CAP + 1237 6 1233 1239 # CAM-HAT + 1238 5 1234 1235 # CAP-CAM + 1239 7 1234 1240 # CAP-HAT + 1240 3 1235 1236 # CAM-CAO + 1241 6 1235 1241 # CAM-HAT + 1242 4 1236 1242 # CAO-HAT + 1243 8 1237 1243 # CTT-HT + 1244 8 1237 1244 # CTT-HT + 1245 8 1237 1245 # CTT-HT + 1246 1 1246 1247 # CAT-CAO + 1247 2 1246 1252 # CAT-CTT + 1248 1 1246 1251 # CAT-CAO + 1249 3 1247 1248 # CAO-CAM + 1250 4 1247 1253 # CAO-HAT + 1251 5 1248 1249 # CAM-CAP + 1252 6 1248 1254 # CAM-HAT + 1253 5 1249 1250 # CAP-CAM + 1254 7 1249 1255 # CAP-HAT + 1255 3 1250 1251 # CAM-CAO + 1256 6 1250 1256 # CAM-HAT + 1257 4 1251 1257 # CAO-HAT + 1258 8 1252 1258 # CTT-HT + 1259 8 1252 1259 # CTT-HT + 1260 8 1252 1260 # CTT-HT + 1261 1 1261 1262 # CAT-CAO + 1262 2 1261 1267 # CAT-CTT + 1263 1 1261 1266 # CAT-CAO + 1264 3 1262 1263 # CAO-CAM + 1265 4 1262 1268 # CAO-HAT + 1266 5 1263 1264 # CAM-CAP + 1267 6 1263 1269 # CAM-HAT + 1268 5 1264 1265 # CAP-CAM + 1269 7 1264 1270 # CAP-HAT + 1270 3 1265 1266 # CAM-CAO + 1271 6 1265 1271 # CAM-HAT + 1272 4 1266 1272 # CAO-HAT + 1273 8 1267 1273 # CTT-HT + 1274 8 1267 1274 # CTT-HT + 1275 8 1267 1275 # CTT-HT + 1276 1 1276 1277 # CAT-CAO + 1277 2 1276 1282 # CAT-CTT + 1278 1 1276 1281 # CAT-CAO + 1279 3 1277 1278 # CAO-CAM + 1280 4 1277 1283 # CAO-HAT + 1281 5 1278 1279 # CAM-CAP + 1282 6 1278 1284 # CAM-HAT + 1283 5 1279 1280 # CAP-CAM + 1284 7 1279 1285 # CAP-HAT + 1285 3 1280 1281 # CAM-CAO + 1286 6 1280 1286 # CAM-HAT + 1287 4 1281 1287 # CAO-HAT + 1288 8 1282 1288 # CTT-HT + 1289 8 1282 1289 # CTT-HT + 1290 8 1282 1290 # CTT-HT + 1291 1 1291 1292 # CAT-CAO + 1292 2 1291 1297 # CAT-CTT + 1293 1 1291 1296 # CAT-CAO + 1294 3 1292 1293 # CAO-CAM + 1295 4 1292 1298 # CAO-HAT + 1296 5 1293 1294 # CAM-CAP + 1297 6 1293 1299 # CAM-HAT + 1298 5 1294 1295 # CAP-CAM + 1299 7 1294 1300 # CAP-HAT + 1300 3 1295 1296 # CAM-CAO + 1301 6 1295 1301 # CAM-HAT + 1302 4 1296 1302 # CAO-HAT + 1303 8 1297 1303 # CTT-HT + 1304 8 1297 1304 # CTT-HT + 1305 8 1297 1305 # CTT-HT + 1306 1 1306 1307 # CAT-CAO + 1307 2 1306 1312 # CAT-CTT + 1308 1 1306 1311 # CAT-CAO + 1309 3 1307 1308 # CAO-CAM + 1310 4 1307 1313 # CAO-HAT + 1311 5 1308 1309 # CAM-CAP + 1312 6 1308 1314 # CAM-HAT + 1313 5 1309 1310 # CAP-CAM + 1314 7 1309 1315 # CAP-HAT + 1315 3 1310 1311 # CAM-CAO + 1316 6 1310 1316 # CAM-HAT + 1317 4 1311 1317 # CAO-HAT + 1318 8 1312 1318 # CTT-HT + 1319 8 1312 1319 # CTT-HT + 1320 8 1312 1320 # CTT-HT + 1321 1 1321 1322 # CAT-CAO + 1322 2 1321 1327 # CAT-CTT + 1323 1 1321 1326 # CAT-CAO + 1324 3 1322 1323 # CAO-CAM + 1325 4 1322 1328 # CAO-HAT + 1326 5 1323 1324 # CAM-CAP + 1327 6 1323 1329 # CAM-HAT + 1328 5 1324 1325 # CAP-CAM + 1329 7 1324 1330 # CAP-HAT + 1330 3 1325 1326 # CAM-CAO + 1331 6 1325 1331 # CAM-HAT + 1332 4 1326 1332 # CAO-HAT + 1333 8 1327 1333 # CTT-HT + 1334 8 1327 1334 # CTT-HT + 1335 8 1327 1335 # CTT-HT + 1336 1 1336 1337 # CAT-CAO + 1337 2 1336 1342 # CAT-CTT + 1338 1 1336 1341 # CAT-CAO + 1339 3 1337 1338 # CAO-CAM + 1340 4 1337 1343 # CAO-HAT + 1341 5 1338 1339 # CAM-CAP + 1342 6 1338 1344 # CAM-HAT + 1343 5 1339 1340 # CAP-CAM + 1344 7 1339 1345 # CAP-HAT + 1345 3 1340 1341 # CAM-CAO + 1346 6 1340 1346 # CAM-HAT + 1347 4 1341 1347 # CAO-HAT + 1348 8 1342 1348 # CTT-HT + 1349 8 1342 1349 # CTT-HT + 1350 8 1342 1350 # CTT-HT + 1351 1 1351 1352 # CAT-CAO + 1352 2 1351 1357 # CAT-CTT + 1353 1 1351 1356 # CAT-CAO + 1354 3 1352 1353 # CAO-CAM + 1355 4 1352 1358 # CAO-HAT + 1356 5 1353 1354 # CAM-CAP + 1357 6 1353 1359 # CAM-HAT + 1358 5 1354 1355 # CAP-CAM + 1359 7 1354 1360 # CAP-HAT + 1360 3 1355 1356 # CAM-CAO + 1361 6 1355 1361 # CAM-HAT + 1362 4 1356 1362 # CAO-HAT + 1363 8 1357 1363 # CTT-HT + 1364 8 1357 1364 # CTT-HT + 1365 8 1357 1365 # CTT-HT + 1366 1 1366 1367 # CAT-CAO + 1367 2 1366 1372 # CAT-CTT + 1368 1 1366 1371 # CAT-CAO + 1369 3 1367 1368 # CAO-CAM + 1370 4 1367 1373 # CAO-HAT + 1371 5 1368 1369 # CAM-CAP + 1372 6 1368 1374 # CAM-HAT + 1373 5 1369 1370 # CAP-CAM + 1374 7 1369 1375 # CAP-HAT + 1375 3 1370 1371 # CAM-CAO + 1376 6 1370 1376 # CAM-HAT + 1377 4 1371 1377 # CAO-HAT + 1378 8 1372 1378 # CTT-HT + 1379 8 1372 1379 # CTT-HT + 1380 8 1372 1380 # CTT-HT + 1381 1 1381 1382 # CAT-CAO + 1382 2 1381 1387 # CAT-CTT + 1383 1 1381 1386 # CAT-CAO + 1384 3 1382 1383 # CAO-CAM + 1385 4 1382 1388 # CAO-HAT + 1386 5 1383 1384 # CAM-CAP + 1387 6 1383 1389 # CAM-HAT + 1388 5 1384 1385 # CAP-CAM + 1389 7 1384 1390 # CAP-HAT + 1390 3 1385 1386 # CAM-CAO + 1391 6 1385 1391 # CAM-HAT + 1392 4 1386 1392 # CAO-HAT + 1393 8 1387 1393 # CTT-HT + 1394 8 1387 1394 # CTT-HT + 1395 8 1387 1395 # CTT-HT + 1396 1 1396 1397 # CAT-CAO + 1397 2 1396 1402 # CAT-CTT + 1398 1 1396 1401 # CAT-CAO + 1399 3 1397 1398 # CAO-CAM + 1400 4 1397 1403 # CAO-HAT + 1401 5 1398 1399 # CAM-CAP + 1402 6 1398 1404 # CAM-HAT + 1403 5 1399 1400 # CAP-CAM + 1404 7 1399 1405 # CAP-HAT + 1405 3 1400 1401 # CAM-CAO + 1406 6 1400 1406 # CAM-HAT + 1407 4 1401 1407 # CAO-HAT + 1408 8 1402 1408 # CTT-HT + 1409 8 1402 1409 # CTT-HT + 1410 8 1402 1410 # CTT-HT + 1411 1 1411 1412 # CAT-CAO + 1412 2 1411 1417 # CAT-CTT + 1413 1 1411 1416 # CAT-CAO + 1414 3 1412 1413 # CAO-CAM + 1415 4 1412 1418 # CAO-HAT + 1416 5 1413 1414 # CAM-CAP + 1417 6 1413 1419 # CAM-HAT + 1418 5 1414 1415 # CAP-CAM + 1419 7 1414 1420 # CAP-HAT + 1420 3 1415 1416 # CAM-CAO + 1421 6 1415 1421 # CAM-HAT + 1422 4 1416 1422 # CAO-HAT + 1423 8 1417 1423 # CTT-HT + 1424 8 1417 1424 # CTT-HT + 1425 8 1417 1425 # CTT-HT + 1426 1 1426 1427 # CAT-CAO + 1427 2 1426 1432 # CAT-CTT + 1428 1 1426 1431 # CAT-CAO + 1429 3 1427 1428 # CAO-CAM + 1430 4 1427 1433 # CAO-HAT + 1431 5 1428 1429 # CAM-CAP + 1432 6 1428 1434 # CAM-HAT + 1433 5 1429 1430 # CAP-CAM + 1434 7 1429 1435 # CAP-HAT + 1435 3 1430 1431 # CAM-CAO + 1436 6 1430 1436 # CAM-HAT + 1437 4 1431 1437 # CAO-HAT + 1438 8 1432 1438 # CTT-HT + 1439 8 1432 1439 # CTT-HT + 1440 8 1432 1440 # CTT-HT + 1441 1 1441 1442 # CAT-CAO + 1442 2 1441 1447 # CAT-CTT + 1443 1 1441 1446 # CAT-CAO + 1444 3 1442 1443 # CAO-CAM + 1445 4 1442 1448 # CAO-HAT + 1446 5 1443 1444 # CAM-CAP + 1447 6 1443 1449 # CAM-HAT + 1448 5 1444 1445 # CAP-CAM + 1449 7 1444 1450 # CAP-HAT + 1450 3 1445 1446 # CAM-CAO + 1451 6 1445 1451 # CAM-HAT + 1452 4 1446 1452 # CAO-HAT + 1453 8 1447 1453 # CTT-HT + 1454 8 1447 1454 # CTT-HT + 1455 8 1447 1455 # CTT-HT + 1456 1 1456 1457 # CAT-CAO + 1457 2 1456 1462 # CAT-CTT + 1458 1 1456 1461 # CAT-CAO + 1459 3 1457 1458 # CAO-CAM + 1460 4 1457 1463 # CAO-HAT + 1461 5 1458 1459 # CAM-CAP + 1462 6 1458 1464 # CAM-HAT + 1463 5 1459 1460 # CAP-CAM + 1464 7 1459 1465 # CAP-HAT + 1465 3 1460 1461 # CAM-CAO + 1466 6 1460 1466 # CAM-HAT + 1467 4 1461 1467 # CAO-HAT + 1468 8 1462 1468 # CTT-HT + 1469 8 1462 1469 # CTT-HT + 1470 8 1462 1470 # CTT-HT + 1471 1 1471 1472 # CAT-CAO + 1472 2 1471 1477 # CAT-CTT + 1473 1 1471 1476 # CAT-CAO + 1474 3 1472 1473 # CAO-CAM + 1475 4 1472 1478 # CAO-HAT + 1476 5 1473 1474 # CAM-CAP + 1477 6 1473 1479 # CAM-HAT + 1478 5 1474 1475 # CAP-CAM + 1479 7 1474 1480 # CAP-HAT + 1480 3 1475 1476 # CAM-CAO + 1481 6 1475 1481 # CAM-HAT + 1482 4 1476 1482 # CAO-HAT + 1483 8 1477 1483 # CTT-HT + 1484 8 1477 1484 # CTT-HT + 1485 8 1477 1485 # CTT-HT + 1486 1 1486 1487 # CAT-CAO + 1487 2 1486 1492 # CAT-CTT + 1488 1 1486 1491 # CAT-CAO + 1489 3 1487 1488 # CAO-CAM + 1490 4 1487 1493 # CAO-HAT + 1491 5 1488 1489 # CAM-CAP + 1492 6 1488 1494 # CAM-HAT + 1493 5 1489 1490 # CAP-CAM + 1494 7 1489 1495 # CAP-HAT + 1495 3 1490 1491 # CAM-CAO + 1496 6 1490 1496 # CAM-HAT + 1497 4 1491 1497 # CAO-HAT + 1498 8 1492 1498 # CTT-HT + 1499 8 1492 1499 # CTT-HT + 1500 8 1492 1500 # CTT-HT + 1501 1 1501 1502 # CAT-CAO + 1502 2 1501 1507 # CAT-CTT + 1503 1 1501 1506 # CAT-CAO + 1504 3 1502 1503 # CAO-CAM + 1505 4 1502 1508 # CAO-HAT + 1506 5 1503 1504 # CAM-CAP + 1507 6 1503 1509 # CAM-HAT + 1508 5 1504 1505 # CAP-CAM + 1509 7 1504 1510 # CAP-HAT + 1510 3 1505 1506 # CAM-CAO + 1511 6 1505 1511 # CAM-HAT + 1512 4 1506 1512 # CAO-HAT + 1513 8 1507 1513 # CTT-HT + 1514 8 1507 1514 # CTT-HT + 1515 8 1507 1515 # CTT-HT + 1516 1 1516 1517 # CAT-CAO + 1517 2 1516 1522 # CAT-CTT + 1518 1 1516 1521 # CAT-CAO + 1519 3 1517 1518 # CAO-CAM + 1520 4 1517 1523 # CAO-HAT + 1521 5 1518 1519 # CAM-CAP + 1522 6 1518 1524 # CAM-HAT + 1523 5 1519 1520 # CAP-CAM + 1524 7 1519 1525 # CAP-HAT + 1525 3 1520 1521 # CAM-CAO + 1526 6 1520 1526 # CAM-HAT + 1527 4 1521 1527 # CAO-HAT + 1528 8 1522 1528 # CTT-HT + 1529 8 1522 1529 # CTT-HT + 1530 8 1522 1530 # CTT-HT + 1531 1 1531 1532 # CAT-CAO + 1532 2 1531 1537 # CAT-CTT + 1533 1 1531 1536 # CAT-CAO + 1534 3 1532 1533 # CAO-CAM + 1535 4 1532 1538 # CAO-HAT + 1536 5 1533 1534 # CAM-CAP + 1537 6 1533 1539 # CAM-HAT + 1538 5 1534 1535 # CAP-CAM + 1539 7 1534 1540 # CAP-HAT + 1540 3 1535 1536 # CAM-CAO + 1541 6 1535 1541 # CAM-HAT + 1542 4 1536 1542 # CAO-HAT + 1543 8 1537 1543 # CTT-HT + 1544 8 1537 1544 # CTT-HT + 1545 8 1537 1545 # CTT-HT + 1546 1 1546 1547 # CAT-CAO + 1547 2 1546 1552 # CAT-CTT + 1548 1 1546 1551 # CAT-CAO + 1549 3 1547 1548 # CAO-CAM + 1550 4 1547 1553 # CAO-HAT + 1551 5 1548 1549 # CAM-CAP + 1552 6 1548 1554 # CAM-HAT + 1553 5 1549 1550 # CAP-CAM + 1554 7 1549 1555 # CAP-HAT + 1555 3 1550 1551 # CAM-CAO + 1556 6 1550 1556 # CAM-HAT + 1557 4 1551 1557 # CAO-HAT + 1558 8 1552 1558 # CTT-HT + 1559 8 1552 1559 # CTT-HT + 1560 8 1552 1560 # CTT-HT + 1561 1 1561 1562 # CAT-CAO + 1562 2 1561 1567 # CAT-CTT + 1563 1 1561 1566 # CAT-CAO + 1564 3 1562 1563 # CAO-CAM + 1565 4 1562 1568 # CAO-HAT + 1566 5 1563 1564 # CAM-CAP + 1567 6 1563 1569 # CAM-HAT + 1568 5 1564 1565 # CAP-CAM + 1569 7 1564 1570 # CAP-HAT + 1570 3 1565 1566 # CAM-CAO + 1571 6 1565 1571 # CAM-HAT + 1572 4 1566 1572 # CAO-HAT + 1573 8 1567 1573 # CTT-HT + 1574 8 1567 1574 # CTT-HT + 1575 8 1567 1575 # CTT-HT + 1576 1 1576 1577 # CAT-CAO + 1577 2 1576 1582 # CAT-CTT + 1578 1 1576 1581 # CAT-CAO + 1579 3 1577 1578 # CAO-CAM + 1580 4 1577 1583 # CAO-HAT + 1581 5 1578 1579 # CAM-CAP + 1582 6 1578 1584 # CAM-HAT + 1583 5 1579 1580 # CAP-CAM + 1584 7 1579 1585 # CAP-HAT + 1585 3 1580 1581 # CAM-CAO + 1586 6 1580 1586 # CAM-HAT + 1587 4 1581 1587 # CAO-HAT + 1588 8 1582 1588 # CTT-HT + 1589 8 1582 1589 # CTT-HT + 1590 8 1582 1590 # CTT-HT + 1591 1 1591 1592 # CAT-CAO + 1592 2 1591 1597 # CAT-CTT + 1593 1 1591 1596 # CAT-CAO + 1594 3 1592 1593 # CAO-CAM + 1595 4 1592 1598 # CAO-HAT + 1596 5 1593 1594 # CAM-CAP + 1597 6 1593 1599 # CAM-HAT + 1598 5 1594 1595 # CAP-CAM + 1599 7 1594 1600 # CAP-HAT + 1600 3 1595 1596 # CAM-CAO + 1601 6 1595 1601 # CAM-HAT + 1602 4 1596 1602 # CAO-HAT + 1603 8 1597 1603 # CTT-HT + 1604 8 1597 1604 # CTT-HT + 1605 8 1597 1605 # CTT-HT + 1606 1 1606 1607 # CAT-CAO + 1607 2 1606 1612 # CAT-CTT + 1608 1 1606 1611 # CAT-CAO + 1609 3 1607 1608 # CAO-CAM + 1610 4 1607 1613 # CAO-HAT + 1611 5 1608 1609 # CAM-CAP + 1612 6 1608 1614 # CAM-HAT + 1613 5 1609 1610 # CAP-CAM + 1614 7 1609 1615 # CAP-HAT + 1615 3 1610 1611 # CAM-CAO + 1616 6 1610 1616 # CAM-HAT + 1617 4 1611 1617 # CAO-HAT + 1618 8 1612 1618 # CTT-HT + 1619 8 1612 1619 # CTT-HT + 1620 8 1612 1620 # CTT-HT + 1621 1 1621 1622 # CAT-CAO + 1622 2 1621 1627 # CAT-CTT + 1623 1 1621 1626 # CAT-CAO + 1624 3 1622 1623 # CAO-CAM + 1625 4 1622 1628 # CAO-HAT + 1626 5 1623 1624 # CAM-CAP + 1627 6 1623 1629 # CAM-HAT + 1628 5 1624 1625 # CAP-CAM + 1629 7 1624 1630 # CAP-HAT + 1630 3 1625 1626 # CAM-CAO + 1631 6 1625 1631 # CAM-HAT + 1632 4 1626 1632 # CAO-HAT + 1633 8 1627 1633 # CTT-HT + 1634 8 1627 1634 # CTT-HT + 1635 8 1627 1635 # CTT-HT + 1636 1 1636 1637 # CAT-CAO + 1637 2 1636 1642 # CAT-CTT + 1638 1 1636 1641 # CAT-CAO + 1639 3 1637 1638 # CAO-CAM + 1640 4 1637 1643 # CAO-HAT + 1641 5 1638 1639 # CAM-CAP + 1642 6 1638 1644 # CAM-HAT + 1643 5 1639 1640 # CAP-CAM + 1644 7 1639 1645 # CAP-HAT + 1645 3 1640 1641 # CAM-CAO + 1646 6 1640 1646 # CAM-HAT + 1647 4 1641 1647 # CAO-HAT + 1648 8 1642 1648 # CTT-HT + 1649 8 1642 1649 # CTT-HT + 1650 8 1642 1650 # CTT-HT + 1651 1 1651 1652 # CAT-CAO + 1652 2 1651 1657 # CAT-CTT + 1653 1 1651 1656 # CAT-CAO + 1654 3 1652 1653 # CAO-CAM + 1655 4 1652 1658 # CAO-HAT + 1656 5 1653 1654 # CAM-CAP + 1657 6 1653 1659 # CAM-HAT + 1658 5 1654 1655 # CAP-CAM + 1659 7 1654 1660 # CAP-HAT + 1660 3 1655 1656 # CAM-CAO + 1661 6 1655 1661 # CAM-HAT + 1662 4 1656 1662 # CAO-HAT + 1663 8 1657 1663 # CTT-HT + 1664 8 1657 1664 # CTT-HT + 1665 8 1657 1665 # CTT-HT + 1666 1 1666 1667 # CAT-CAO + 1667 2 1666 1672 # CAT-CTT + 1668 1 1666 1671 # CAT-CAO + 1669 3 1667 1668 # CAO-CAM + 1670 4 1667 1673 # CAO-HAT + 1671 5 1668 1669 # CAM-CAP + 1672 6 1668 1674 # CAM-HAT + 1673 5 1669 1670 # CAP-CAM + 1674 7 1669 1675 # CAP-HAT + 1675 3 1670 1671 # CAM-CAO + 1676 6 1670 1676 # CAM-HAT + 1677 4 1671 1677 # CAO-HAT + 1678 8 1672 1678 # CTT-HT + 1679 8 1672 1679 # CTT-HT + 1680 8 1672 1680 # CTT-HT + 1681 1 1681 1682 # CAT-CAO + 1682 2 1681 1687 # CAT-CTT + 1683 1 1681 1686 # CAT-CAO + 1684 3 1682 1683 # CAO-CAM + 1685 4 1682 1688 # CAO-HAT + 1686 5 1683 1684 # CAM-CAP + 1687 6 1683 1689 # CAM-HAT + 1688 5 1684 1685 # CAP-CAM + 1689 7 1684 1690 # CAP-HAT + 1690 3 1685 1686 # CAM-CAO + 1691 6 1685 1691 # CAM-HAT + 1692 4 1686 1692 # CAO-HAT + 1693 8 1687 1693 # CTT-HT + 1694 8 1687 1694 # CTT-HT + 1695 8 1687 1695 # CTT-HT + 1696 1 1696 1697 # CAT-CAO + 1697 2 1696 1702 # CAT-CTT + 1698 1 1696 1701 # CAT-CAO + 1699 3 1697 1698 # CAO-CAM + 1700 4 1697 1703 # CAO-HAT + 1701 5 1698 1699 # CAM-CAP + 1702 6 1698 1704 # CAM-HAT + 1703 5 1699 1700 # CAP-CAM + 1704 7 1699 1705 # CAP-HAT + 1705 3 1700 1701 # CAM-CAO + 1706 6 1700 1706 # CAM-HAT + 1707 4 1701 1707 # CAO-HAT + 1708 8 1702 1708 # CTT-HT + 1709 8 1702 1709 # CTT-HT + 1710 8 1702 1710 # CTT-HT + 1711 1 1711 1712 # CAT-CAO + 1712 2 1711 1717 # CAT-CTT + 1713 1 1711 1716 # CAT-CAO + 1714 3 1712 1713 # CAO-CAM + 1715 4 1712 1718 # CAO-HAT + 1716 5 1713 1714 # CAM-CAP + 1717 6 1713 1719 # CAM-HAT + 1718 5 1714 1715 # CAP-CAM + 1719 7 1714 1720 # CAP-HAT + 1720 3 1715 1716 # CAM-CAO + 1721 6 1715 1721 # CAM-HAT + 1722 4 1716 1722 # CAO-HAT + 1723 8 1717 1723 # CTT-HT + 1724 8 1717 1724 # CTT-HT + 1725 8 1717 1725 # CTT-HT + 1726 1 1726 1727 # CAT-CAO + 1727 2 1726 1732 # CAT-CTT + 1728 1 1726 1731 # CAT-CAO + 1729 3 1727 1728 # CAO-CAM + 1730 4 1727 1733 # CAO-HAT + 1731 5 1728 1729 # CAM-CAP + 1732 6 1728 1734 # CAM-HAT + 1733 5 1729 1730 # CAP-CAM + 1734 7 1729 1735 # CAP-HAT + 1735 3 1730 1731 # CAM-CAO + 1736 6 1730 1736 # CAM-HAT + 1737 4 1731 1737 # CAO-HAT + 1738 8 1732 1738 # CTT-HT + 1739 8 1732 1739 # CTT-HT + 1740 8 1732 1740 # CTT-HT + 1741 1 1741 1742 # CAT-CAO + 1742 2 1741 1747 # CAT-CTT + 1743 1 1741 1746 # CAT-CAO + 1744 3 1742 1743 # CAO-CAM + 1745 4 1742 1748 # CAO-HAT + 1746 5 1743 1744 # CAM-CAP + 1747 6 1743 1749 # CAM-HAT + 1748 5 1744 1745 # CAP-CAM + 1749 7 1744 1750 # CAP-HAT + 1750 3 1745 1746 # CAM-CAO + 1751 6 1745 1751 # CAM-HAT + 1752 4 1746 1752 # CAO-HAT + 1753 8 1747 1753 # CTT-HT + 1754 8 1747 1754 # CTT-HT + 1755 8 1747 1755 # CTT-HT + 1756 1 1756 1757 # CAT-CAO + 1757 2 1756 1762 # CAT-CTT + 1758 1 1756 1761 # CAT-CAO + 1759 3 1757 1758 # CAO-CAM + 1760 4 1757 1763 # CAO-HAT + 1761 5 1758 1759 # CAM-CAP + 1762 6 1758 1764 # CAM-HAT + 1763 5 1759 1760 # CAP-CAM + 1764 7 1759 1765 # CAP-HAT + 1765 3 1760 1761 # CAM-CAO + 1766 6 1760 1766 # CAM-HAT + 1767 4 1761 1767 # CAO-HAT + 1768 8 1762 1768 # CTT-HT + 1769 8 1762 1769 # CTT-HT + 1770 8 1762 1770 # CTT-HT + 1771 1 1771 1772 # CAT-CAO + 1772 2 1771 1777 # CAT-CTT + 1773 1 1771 1776 # CAT-CAO + 1774 3 1772 1773 # CAO-CAM + 1775 4 1772 1778 # CAO-HAT + 1776 5 1773 1774 # CAM-CAP + 1777 6 1773 1779 # CAM-HAT + 1778 5 1774 1775 # CAP-CAM + 1779 7 1774 1780 # CAP-HAT + 1780 3 1775 1776 # CAM-CAO + 1781 6 1775 1781 # CAM-HAT + 1782 4 1776 1782 # CAO-HAT + 1783 8 1777 1783 # CTT-HT + 1784 8 1777 1784 # CTT-HT + 1785 8 1777 1785 # CTT-HT + 1786 1 1786 1787 # CAT-CAO + 1787 2 1786 1792 # CAT-CTT + 1788 1 1786 1791 # CAT-CAO + 1789 3 1787 1788 # CAO-CAM + 1790 4 1787 1793 # CAO-HAT + 1791 5 1788 1789 # CAM-CAP + 1792 6 1788 1794 # CAM-HAT + 1793 5 1789 1790 # CAP-CAM + 1794 7 1789 1795 # CAP-HAT + 1795 3 1790 1791 # CAM-CAO + 1796 6 1790 1796 # CAM-HAT + 1797 4 1791 1797 # CAO-HAT + 1798 8 1792 1798 # CTT-HT + 1799 8 1792 1799 # CTT-HT + 1800 8 1792 1800 # CTT-HT + 1801 1 1801 1802 # CAT-CAO + 1802 2 1801 1807 # CAT-CTT + 1803 1 1801 1806 # CAT-CAO + 1804 3 1802 1803 # CAO-CAM + 1805 4 1802 1808 # CAO-HAT + 1806 5 1803 1804 # CAM-CAP + 1807 6 1803 1809 # CAM-HAT + 1808 5 1804 1805 # CAP-CAM + 1809 7 1804 1810 # CAP-HAT + 1810 3 1805 1806 # CAM-CAO + 1811 6 1805 1811 # CAM-HAT + 1812 4 1806 1812 # CAO-HAT + 1813 8 1807 1813 # CTT-HT + 1814 8 1807 1814 # CTT-HT + 1815 8 1807 1815 # CTT-HT + 1816 1 1816 1817 # CAT-CAO + 1817 2 1816 1822 # CAT-CTT + 1818 1 1816 1821 # CAT-CAO + 1819 3 1817 1818 # CAO-CAM + 1820 4 1817 1823 # CAO-HAT + 1821 5 1818 1819 # CAM-CAP + 1822 6 1818 1824 # CAM-HAT + 1823 5 1819 1820 # CAP-CAM + 1824 7 1819 1825 # CAP-HAT + 1825 3 1820 1821 # CAM-CAO + 1826 6 1820 1826 # CAM-HAT + 1827 4 1821 1827 # CAO-HAT + 1828 8 1822 1828 # CTT-HT + 1829 8 1822 1829 # CTT-HT + 1830 8 1822 1830 # CTT-HT + 1831 1 1831 1832 # CAT-CAO + 1832 2 1831 1837 # CAT-CTT + 1833 1 1831 1836 # CAT-CAO + 1834 3 1832 1833 # CAO-CAM + 1835 4 1832 1838 # CAO-HAT + 1836 5 1833 1834 # CAM-CAP + 1837 6 1833 1839 # CAM-HAT + 1838 5 1834 1835 # CAP-CAM + 1839 7 1834 1840 # CAP-HAT + 1840 3 1835 1836 # CAM-CAO + 1841 6 1835 1841 # CAM-HAT + 1842 4 1836 1842 # CAO-HAT + 1843 8 1837 1843 # CTT-HT + 1844 8 1837 1844 # CTT-HT + 1845 8 1837 1845 # CTT-HT + 1846 1 1846 1847 # CAT-CAO + 1847 2 1846 1852 # CAT-CTT + 1848 1 1846 1851 # CAT-CAO + 1849 3 1847 1848 # CAO-CAM + 1850 4 1847 1853 # CAO-HAT + 1851 5 1848 1849 # CAM-CAP + 1852 6 1848 1854 # CAM-HAT + 1853 5 1849 1850 # CAP-CAM + 1854 7 1849 1855 # CAP-HAT + 1855 3 1850 1851 # CAM-CAO + 1856 6 1850 1856 # CAM-HAT + 1857 4 1851 1857 # CAO-HAT + 1858 8 1852 1858 # CTT-HT + 1859 8 1852 1859 # CTT-HT + 1860 8 1852 1860 # CTT-HT + 1861 1 1861 1862 # CAT-CAO + 1862 2 1861 1867 # CAT-CTT + 1863 1 1861 1866 # CAT-CAO + 1864 3 1862 1863 # CAO-CAM + 1865 4 1862 1868 # CAO-HAT + 1866 5 1863 1864 # CAM-CAP + 1867 6 1863 1869 # CAM-HAT + 1868 5 1864 1865 # CAP-CAM + 1869 7 1864 1870 # CAP-HAT + 1870 3 1865 1866 # CAM-CAO + 1871 6 1865 1871 # CAM-HAT + 1872 4 1866 1872 # CAO-HAT + 1873 8 1867 1873 # CTT-HT + 1874 8 1867 1874 # CTT-HT + 1875 8 1867 1875 # CTT-HT + 1876 1 1876 1877 # CAT-CAO + 1877 2 1876 1882 # CAT-CTT + 1878 1 1876 1881 # CAT-CAO + 1879 3 1877 1878 # CAO-CAM + 1880 4 1877 1883 # CAO-HAT + 1881 5 1878 1879 # CAM-CAP + 1882 6 1878 1884 # CAM-HAT + 1883 5 1879 1880 # CAP-CAM + 1884 7 1879 1885 # CAP-HAT + 1885 3 1880 1881 # CAM-CAO + 1886 6 1880 1886 # CAM-HAT + 1887 4 1881 1887 # CAO-HAT + 1888 8 1882 1888 # CTT-HT + 1889 8 1882 1889 # CTT-HT + 1890 8 1882 1890 # CTT-HT + 1891 1 1891 1892 # CAT-CAO + 1892 2 1891 1897 # CAT-CTT + 1893 1 1891 1896 # CAT-CAO + 1894 3 1892 1893 # CAO-CAM + 1895 4 1892 1898 # CAO-HAT + 1896 5 1893 1894 # CAM-CAP + 1897 6 1893 1899 # CAM-HAT + 1898 5 1894 1895 # CAP-CAM + 1899 7 1894 1900 # CAP-HAT + 1900 3 1895 1896 # CAM-CAO + 1901 6 1895 1901 # CAM-HAT + 1902 4 1896 1902 # CAO-HAT + 1903 8 1897 1903 # CTT-HT + 1904 8 1897 1904 # CTT-HT + 1905 8 1897 1905 # CTT-HT + 1906 1 1906 1907 # CAT-CAO + 1907 2 1906 1912 # CAT-CTT + 1908 1 1906 1911 # CAT-CAO + 1909 3 1907 1908 # CAO-CAM + 1910 4 1907 1913 # CAO-HAT + 1911 5 1908 1909 # CAM-CAP + 1912 6 1908 1914 # CAM-HAT + 1913 5 1909 1910 # CAP-CAM + 1914 7 1909 1915 # CAP-HAT + 1915 3 1910 1911 # CAM-CAO + 1916 6 1910 1916 # CAM-HAT + 1917 4 1911 1917 # CAO-HAT + 1918 8 1912 1918 # CTT-HT + 1919 8 1912 1919 # CTT-HT + 1920 8 1912 1920 # CTT-HT + 1921 1 1921 1922 # CAT-CAO + 1922 2 1921 1927 # CAT-CTT + 1923 1 1921 1926 # CAT-CAO + 1924 3 1922 1923 # CAO-CAM + 1925 4 1922 1928 # CAO-HAT + 1926 5 1923 1924 # CAM-CAP + 1927 6 1923 1929 # CAM-HAT + 1928 5 1924 1925 # CAP-CAM + 1929 7 1924 1930 # CAP-HAT + 1930 3 1925 1926 # CAM-CAO + 1931 6 1925 1931 # CAM-HAT + 1932 4 1926 1932 # CAO-HAT + 1933 8 1927 1933 # CTT-HT + 1934 8 1927 1934 # CTT-HT + 1935 8 1927 1935 # CTT-HT + 1936 1 1936 1937 # CAT-CAO + 1937 2 1936 1942 # CAT-CTT + 1938 1 1936 1941 # CAT-CAO + 1939 3 1937 1938 # CAO-CAM + 1940 4 1937 1943 # CAO-HAT + 1941 5 1938 1939 # CAM-CAP + 1942 6 1938 1944 # CAM-HAT + 1943 5 1939 1940 # CAP-CAM + 1944 7 1939 1945 # CAP-HAT + 1945 3 1940 1941 # CAM-CAO + 1946 6 1940 1946 # CAM-HAT + 1947 4 1941 1947 # CAO-HAT + 1948 8 1942 1948 # CTT-HT + 1949 8 1942 1949 # CTT-HT + 1950 8 1942 1950 # CTT-HT + 1951 1 1951 1952 # CAT-CAO + 1952 2 1951 1957 # CAT-CTT + 1953 1 1951 1956 # CAT-CAO + 1954 3 1952 1953 # CAO-CAM + 1955 4 1952 1958 # CAO-HAT + 1956 5 1953 1954 # CAM-CAP + 1957 6 1953 1959 # CAM-HAT + 1958 5 1954 1955 # CAP-CAM + 1959 7 1954 1960 # CAP-HAT + 1960 3 1955 1956 # CAM-CAO + 1961 6 1955 1961 # CAM-HAT + 1962 4 1956 1962 # CAO-HAT + 1963 8 1957 1963 # CTT-HT + 1964 8 1957 1964 # CTT-HT + 1965 8 1957 1965 # CTT-HT + 1966 1 1966 1967 # CAT-CAO + 1967 2 1966 1972 # CAT-CTT + 1968 1 1966 1971 # CAT-CAO + 1969 3 1967 1968 # CAO-CAM + 1970 4 1967 1973 # CAO-HAT + 1971 5 1968 1969 # CAM-CAP + 1972 6 1968 1974 # CAM-HAT + 1973 5 1969 1970 # CAP-CAM + 1974 7 1969 1975 # CAP-HAT + 1975 3 1970 1971 # CAM-CAO + 1976 6 1970 1976 # CAM-HAT + 1977 4 1971 1977 # CAO-HAT + 1978 8 1972 1978 # CTT-HT + 1979 8 1972 1979 # CTT-HT + 1980 8 1972 1980 # CTT-HT + 1981 1 1981 1982 # CAT-CAO + 1982 2 1981 1987 # CAT-CTT + 1983 1 1981 1986 # CAT-CAO + 1984 3 1982 1983 # CAO-CAM + 1985 4 1982 1988 # CAO-HAT + 1986 5 1983 1984 # CAM-CAP + 1987 6 1983 1989 # CAM-HAT + 1988 5 1984 1985 # CAP-CAM + 1989 7 1984 1990 # CAP-HAT + 1990 3 1985 1986 # CAM-CAO + 1991 6 1985 1991 # CAM-HAT + 1992 4 1986 1992 # CAO-HAT + 1993 8 1987 1993 # CTT-HT + 1994 8 1987 1994 # CTT-HT + 1995 8 1987 1995 # CTT-HT + 1996 1 1996 1997 # CAT-CAO + 1997 2 1996 2002 # CAT-CTT + 1998 1 1996 2001 # CAT-CAO + 1999 3 1997 1998 # CAO-CAM + 2000 4 1997 2003 # CAO-HAT + 2001 5 1998 1999 # CAM-CAP + 2002 6 1998 2004 # CAM-HAT + 2003 5 1999 2000 # CAP-CAM + 2004 7 1999 2005 # CAP-HAT + 2005 3 2000 2001 # CAM-CAO + 2006 6 2000 2006 # CAM-HAT + 2007 4 2001 2007 # CAO-HAT + 2008 8 2002 2008 # CTT-HT + 2009 8 2002 2009 # CTT-HT + 2010 8 2002 2010 # CTT-HT + 2011 1 2011 2012 # CAT-CAO + 2012 2 2011 2017 # CAT-CTT + 2013 1 2011 2016 # CAT-CAO + 2014 3 2012 2013 # CAO-CAM + 2015 4 2012 2018 # CAO-HAT + 2016 5 2013 2014 # CAM-CAP + 2017 6 2013 2019 # CAM-HAT + 2018 5 2014 2015 # CAP-CAM + 2019 7 2014 2020 # CAP-HAT + 2020 3 2015 2016 # CAM-CAO + 2021 6 2015 2021 # CAM-HAT + 2022 4 2016 2022 # CAO-HAT + 2023 8 2017 2023 # CTT-HT + 2024 8 2017 2024 # CTT-HT + 2025 8 2017 2025 # CTT-HT + 2026 1 2026 2027 # CAT-CAO + 2027 2 2026 2032 # CAT-CTT + 2028 1 2026 2031 # CAT-CAO + 2029 3 2027 2028 # CAO-CAM + 2030 4 2027 2033 # CAO-HAT + 2031 5 2028 2029 # CAM-CAP + 2032 6 2028 2034 # CAM-HAT + 2033 5 2029 2030 # CAP-CAM + 2034 7 2029 2035 # CAP-HAT + 2035 3 2030 2031 # CAM-CAO + 2036 6 2030 2036 # CAM-HAT + 2037 4 2031 2037 # CAO-HAT + 2038 8 2032 2038 # CTT-HT + 2039 8 2032 2039 # CTT-HT + 2040 8 2032 2040 # CTT-HT + 2041 1 2041 2042 # CAT-CAO + 2042 2 2041 2047 # CAT-CTT + 2043 1 2041 2046 # CAT-CAO + 2044 3 2042 2043 # CAO-CAM + 2045 4 2042 2048 # CAO-HAT + 2046 5 2043 2044 # CAM-CAP + 2047 6 2043 2049 # CAM-HAT + 2048 5 2044 2045 # CAP-CAM + 2049 7 2044 2050 # CAP-HAT + 2050 3 2045 2046 # CAM-CAO + 2051 6 2045 2051 # CAM-HAT + 2052 4 2046 2052 # CAO-HAT + 2053 8 2047 2053 # CTT-HT + 2054 8 2047 2054 # CTT-HT + 2055 8 2047 2055 # CTT-HT + 2056 1 2056 2057 # CAT-CAO + 2057 2 2056 2062 # CAT-CTT + 2058 1 2056 2061 # CAT-CAO + 2059 3 2057 2058 # CAO-CAM + 2060 4 2057 2063 # CAO-HAT + 2061 5 2058 2059 # CAM-CAP + 2062 6 2058 2064 # CAM-HAT + 2063 5 2059 2060 # CAP-CAM + 2064 7 2059 2065 # CAP-HAT + 2065 3 2060 2061 # CAM-CAO + 2066 6 2060 2066 # CAM-HAT + 2067 4 2061 2067 # CAO-HAT + 2068 8 2062 2068 # CTT-HT + 2069 8 2062 2069 # CTT-HT + 2070 8 2062 2070 # CTT-HT + 2071 1 2071 2072 # CAT-CAO + 2072 2 2071 2077 # CAT-CTT + 2073 1 2071 2076 # CAT-CAO + 2074 3 2072 2073 # CAO-CAM + 2075 4 2072 2078 # CAO-HAT + 2076 5 2073 2074 # CAM-CAP + 2077 6 2073 2079 # CAM-HAT + 2078 5 2074 2075 # CAP-CAM + 2079 7 2074 2080 # CAP-HAT + 2080 3 2075 2076 # CAM-CAO + 2081 6 2075 2081 # CAM-HAT + 2082 4 2076 2082 # CAO-HAT + 2083 8 2077 2083 # CTT-HT + 2084 8 2077 2084 # CTT-HT + 2085 8 2077 2085 # CTT-HT + 2086 1 2086 2087 # CAT-CAO + 2087 2 2086 2092 # CAT-CTT + 2088 1 2086 2091 # CAT-CAO + 2089 3 2087 2088 # CAO-CAM + 2090 4 2087 2093 # CAO-HAT + 2091 5 2088 2089 # CAM-CAP + 2092 6 2088 2094 # CAM-HAT + 2093 5 2089 2090 # CAP-CAM + 2094 7 2089 2095 # CAP-HAT + 2095 3 2090 2091 # CAM-CAO + 2096 6 2090 2096 # CAM-HAT + 2097 4 2091 2097 # CAO-HAT + 2098 8 2092 2098 # CTT-HT + 2099 8 2092 2099 # CTT-HT + 2100 8 2092 2100 # CTT-HT + 2101 1 2101 2102 # CAT-CAO + 2102 2 2101 2107 # CAT-CTT + 2103 1 2101 2106 # CAT-CAO + 2104 3 2102 2103 # CAO-CAM + 2105 4 2102 2108 # CAO-HAT + 2106 5 2103 2104 # CAM-CAP + 2107 6 2103 2109 # CAM-HAT + 2108 5 2104 2105 # CAP-CAM + 2109 7 2104 2110 # CAP-HAT + 2110 3 2105 2106 # CAM-CAO + 2111 6 2105 2111 # CAM-HAT + 2112 4 2106 2112 # CAO-HAT + 2113 8 2107 2113 # CTT-HT + 2114 8 2107 2114 # CTT-HT + 2115 8 2107 2115 # CTT-HT + 2116 1 2116 2117 # CAT-CAO + 2117 2 2116 2122 # CAT-CTT + 2118 1 2116 2121 # CAT-CAO + 2119 3 2117 2118 # CAO-CAM + 2120 4 2117 2123 # CAO-HAT + 2121 5 2118 2119 # CAM-CAP + 2122 6 2118 2124 # CAM-HAT + 2123 5 2119 2120 # CAP-CAM + 2124 7 2119 2125 # CAP-HAT + 2125 3 2120 2121 # CAM-CAO + 2126 6 2120 2126 # CAM-HAT + 2127 4 2121 2127 # CAO-HAT + 2128 8 2122 2128 # CTT-HT + 2129 8 2122 2129 # CTT-HT + 2130 8 2122 2130 # CTT-HT + 2131 1 2131 2132 # CAT-CAO + 2132 2 2131 2137 # CAT-CTT + 2133 1 2131 2136 # CAT-CAO + 2134 3 2132 2133 # CAO-CAM + 2135 4 2132 2138 # CAO-HAT + 2136 5 2133 2134 # CAM-CAP + 2137 6 2133 2139 # CAM-HAT + 2138 5 2134 2135 # CAP-CAM + 2139 7 2134 2140 # CAP-HAT + 2140 3 2135 2136 # CAM-CAO + 2141 6 2135 2141 # CAM-HAT + 2142 4 2136 2142 # CAO-HAT + 2143 8 2137 2143 # CTT-HT + 2144 8 2137 2144 # CTT-HT + 2145 8 2137 2145 # CTT-HT + 2146 1 2146 2147 # CAT-CAO + 2147 2 2146 2152 # CAT-CTT + 2148 1 2146 2151 # CAT-CAO + 2149 3 2147 2148 # CAO-CAM + 2150 4 2147 2153 # CAO-HAT + 2151 5 2148 2149 # CAM-CAP + 2152 6 2148 2154 # CAM-HAT + 2153 5 2149 2150 # CAP-CAM + 2154 7 2149 2155 # CAP-HAT + 2155 3 2150 2151 # CAM-CAO + 2156 6 2150 2156 # CAM-HAT + 2157 4 2151 2157 # CAO-HAT + 2158 8 2152 2158 # CTT-HT + 2159 8 2152 2159 # CTT-HT + 2160 8 2152 2160 # CTT-HT + 2161 1 2161 2162 # CAT-CAO + 2162 2 2161 2167 # CAT-CTT + 2163 1 2161 2166 # CAT-CAO + 2164 3 2162 2163 # CAO-CAM + 2165 4 2162 2168 # CAO-HAT + 2166 5 2163 2164 # CAM-CAP + 2167 6 2163 2169 # CAM-HAT + 2168 5 2164 2165 # CAP-CAM + 2169 7 2164 2170 # CAP-HAT + 2170 3 2165 2166 # CAM-CAO + 2171 6 2165 2171 # CAM-HAT + 2172 4 2166 2172 # CAO-HAT + 2173 8 2167 2173 # CTT-HT + 2174 8 2167 2174 # CTT-HT + 2175 8 2167 2175 # CTT-HT + 2176 1 2176 2177 # CAT-CAO + 2177 2 2176 2182 # CAT-CTT + 2178 1 2176 2181 # CAT-CAO + 2179 3 2177 2178 # CAO-CAM + 2180 4 2177 2183 # CAO-HAT + 2181 5 2178 2179 # CAM-CAP + 2182 6 2178 2184 # CAM-HAT + 2183 5 2179 2180 # CAP-CAM + 2184 7 2179 2185 # CAP-HAT + 2185 3 2180 2181 # CAM-CAO + 2186 6 2180 2186 # CAM-HAT + 2187 4 2181 2187 # CAO-HAT + 2188 8 2182 2188 # CTT-HT + 2189 8 2182 2189 # CTT-HT + 2190 8 2182 2190 # CTT-HT + 2191 1 2191 2192 # CAT-CAO + 2192 2 2191 2197 # CAT-CTT + 2193 1 2191 2196 # CAT-CAO + 2194 3 2192 2193 # CAO-CAM + 2195 4 2192 2198 # CAO-HAT + 2196 5 2193 2194 # CAM-CAP + 2197 6 2193 2199 # CAM-HAT + 2198 5 2194 2195 # CAP-CAM + 2199 7 2194 2200 # CAP-HAT + 2200 3 2195 2196 # CAM-CAO + 2201 6 2195 2201 # CAM-HAT + 2202 4 2196 2202 # CAO-HAT + 2203 8 2197 2203 # CTT-HT + 2204 8 2197 2204 # CTT-HT + 2205 8 2197 2205 # CTT-HT + 2206 1 2206 2207 # CAT-CAO + 2207 2 2206 2212 # CAT-CTT + 2208 1 2206 2211 # CAT-CAO + 2209 3 2207 2208 # CAO-CAM + 2210 4 2207 2213 # CAO-HAT + 2211 5 2208 2209 # CAM-CAP + 2212 6 2208 2214 # CAM-HAT + 2213 5 2209 2210 # CAP-CAM + 2214 7 2209 2215 # CAP-HAT + 2215 3 2210 2211 # CAM-CAO + 2216 6 2210 2216 # CAM-HAT + 2217 4 2211 2217 # CAO-HAT + 2218 8 2212 2218 # CTT-HT + 2219 8 2212 2219 # CTT-HT + 2220 8 2212 2220 # CTT-HT + 2221 1 2221 2222 # CAT-CAO + 2222 2 2221 2227 # CAT-CTT + 2223 1 2221 2226 # CAT-CAO + 2224 3 2222 2223 # CAO-CAM + 2225 4 2222 2228 # CAO-HAT + 2226 5 2223 2224 # CAM-CAP + 2227 6 2223 2229 # CAM-HAT + 2228 5 2224 2225 # CAP-CAM + 2229 7 2224 2230 # CAP-HAT + 2230 3 2225 2226 # CAM-CAO + 2231 6 2225 2231 # CAM-HAT + 2232 4 2226 2232 # CAO-HAT + 2233 8 2227 2233 # CTT-HT + 2234 8 2227 2234 # CTT-HT + 2235 8 2227 2235 # CTT-HT + 2236 1 2236 2237 # CAT-CAO + 2237 2 2236 2242 # CAT-CTT + 2238 1 2236 2241 # CAT-CAO + 2239 3 2237 2238 # CAO-CAM + 2240 4 2237 2243 # CAO-HAT + 2241 5 2238 2239 # CAM-CAP + 2242 6 2238 2244 # CAM-HAT + 2243 5 2239 2240 # CAP-CAM + 2244 7 2239 2245 # CAP-HAT + 2245 3 2240 2241 # CAM-CAO + 2246 6 2240 2246 # CAM-HAT + 2247 4 2241 2247 # CAO-HAT + 2248 8 2242 2248 # CTT-HT + 2249 8 2242 2249 # CTT-HT + 2250 8 2242 2250 # CTT-HT + 2251 1 2251 2252 # CAT-CAO + 2252 2 2251 2257 # CAT-CTT + 2253 1 2251 2256 # CAT-CAO + 2254 3 2252 2253 # CAO-CAM + 2255 4 2252 2258 # CAO-HAT + 2256 5 2253 2254 # CAM-CAP + 2257 6 2253 2259 # CAM-HAT + 2258 5 2254 2255 # CAP-CAM + 2259 7 2254 2260 # CAP-HAT + 2260 3 2255 2256 # CAM-CAO + 2261 6 2255 2261 # CAM-HAT + 2262 4 2256 2262 # CAO-HAT + 2263 8 2257 2263 # CTT-HT + 2264 8 2257 2264 # CTT-HT + 2265 8 2257 2265 # CTT-HT + 2266 1 2266 2267 # CAT-CAO + 2267 2 2266 2272 # CAT-CTT + 2268 1 2266 2271 # CAT-CAO + 2269 3 2267 2268 # CAO-CAM + 2270 4 2267 2273 # CAO-HAT + 2271 5 2268 2269 # CAM-CAP + 2272 6 2268 2274 # CAM-HAT + 2273 5 2269 2270 # CAP-CAM + 2274 7 2269 2275 # CAP-HAT + 2275 3 2270 2271 # CAM-CAO + 2276 6 2270 2276 # CAM-HAT + 2277 4 2271 2277 # CAO-HAT + 2278 8 2272 2278 # CTT-HT + 2279 8 2272 2279 # CTT-HT + 2280 8 2272 2280 # CTT-HT + 2281 1 2281 2282 # CAT-CAO + 2282 2 2281 2287 # CAT-CTT + 2283 1 2281 2286 # CAT-CAO + 2284 3 2282 2283 # CAO-CAM + 2285 4 2282 2288 # CAO-HAT + 2286 5 2283 2284 # CAM-CAP + 2287 6 2283 2289 # CAM-HAT + 2288 5 2284 2285 # CAP-CAM + 2289 7 2284 2290 # CAP-HAT + 2290 3 2285 2286 # CAM-CAO + 2291 6 2285 2291 # CAM-HAT + 2292 4 2286 2292 # CAO-HAT + 2293 8 2287 2293 # CTT-HT + 2294 8 2287 2294 # CTT-HT + 2295 8 2287 2295 # CTT-HT + 2296 1 2296 2297 # CAT-CAO + 2297 2 2296 2302 # CAT-CTT + 2298 1 2296 2301 # CAT-CAO + 2299 3 2297 2298 # CAO-CAM + 2300 4 2297 2303 # CAO-HAT + 2301 5 2298 2299 # CAM-CAP + 2302 6 2298 2304 # CAM-HAT + 2303 5 2299 2300 # CAP-CAM + 2304 7 2299 2305 # CAP-HAT + 2305 3 2300 2301 # CAM-CAO + 2306 6 2300 2306 # CAM-HAT + 2307 4 2301 2307 # CAO-HAT + 2308 8 2302 2308 # CTT-HT + 2309 8 2302 2309 # CTT-HT + 2310 8 2302 2310 # CTT-HT + 2311 1 2311 2312 # CAT-CAO + 2312 2 2311 2317 # CAT-CTT + 2313 1 2311 2316 # CAT-CAO + 2314 3 2312 2313 # CAO-CAM + 2315 4 2312 2318 # CAO-HAT + 2316 5 2313 2314 # CAM-CAP + 2317 6 2313 2319 # CAM-HAT + 2318 5 2314 2315 # CAP-CAM + 2319 7 2314 2320 # CAP-HAT + 2320 3 2315 2316 # CAM-CAO + 2321 6 2315 2321 # CAM-HAT + 2322 4 2316 2322 # CAO-HAT + 2323 8 2317 2323 # CTT-HT + 2324 8 2317 2324 # CTT-HT + 2325 8 2317 2325 # CTT-HT + 2326 1 2326 2327 # CAT-CAO + 2327 2 2326 2332 # CAT-CTT + 2328 1 2326 2331 # CAT-CAO + 2329 3 2327 2328 # CAO-CAM + 2330 4 2327 2333 # CAO-HAT + 2331 5 2328 2329 # CAM-CAP + 2332 6 2328 2334 # CAM-HAT + 2333 5 2329 2330 # CAP-CAM + 2334 7 2329 2335 # CAP-HAT + 2335 3 2330 2331 # CAM-CAO + 2336 6 2330 2336 # CAM-HAT + 2337 4 2331 2337 # CAO-HAT + 2338 8 2332 2338 # CTT-HT + 2339 8 2332 2339 # CTT-HT + 2340 8 2332 2340 # CTT-HT + 2341 1 2341 2342 # CAT-CAO + 2342 2 2341 2347 # CAT-CTT + 2343 1 2341 2346 # CAT-CAO + 2344 3 2342 2343 # CAO-CAM + 2345 4 2342 2348 # CAO-HAT + 2346 5 2343 2344 # CAM-CAP + 2347 6 2343 2349 # CAM-HAT + 2348 5 2344 2345 # CAP-CAM + 2349 7 2344 2350 # CAP-HAT + 2350 3 2345 2346 # CAM-CAO + 2351 6 2345 2351 # CAM-HAT + 2352 4 2346 2352 # CAO-HAT + 2353 8 2347 2353 # CTT-HT + 2354 8 2347 2354 # CTT-HT + 2355 8 2347 2355 # CTT-HT + 2356 1 2356 2357 # CAT-CAO + 2357 2 2356 2362 # CAT-CTT + 2358 1 2356 2361 # CAT-CAO + 2359 3 2357 2358 # CAO-CAM + 2360 4 2357 2363 # CAO-HAT + 2361 5 2358 2359 # CAM-CAP + 2362 6 2358 2364 # CAM-HAT + 2363 5 2359 2360 # CAP-CAM + 2364 7 2359 2365 # CAP-HAT + 2365 3 2360 2361 # CAM-CAO + 2366 6 2360 2366 # CAM-HAT + 2367 4 2361 2367 # CAO-HAT + 2368 8 2362 2368 # CTT-HT + 2369 8 2362 2369 # CTT-HT + 2370 8 2362 2370 # CTT-HT + 2371 1 2371 2372 # CAT-CAO + 2372 2 2371 2377 # CAT-CTT + 2373 1 2371 2376 # CAT-CAO + 2374 3 2372 2373 # CAO-CAM + 2375 4 2372 2378 # CAO-HAT + 2376 5 2373 2374 # CAM-CAP + 2377 6 2373 2379 # CAM-HAT + 2378 5 2374 2375 # CAP-CAM + 2379 7 2374 2380 # CAP-HAT + 2380 3 2375 2376 # CAM-CAO + 2381 6 2375 2381 # CAM-HAT + 2382 4 2376 2382 # CAO-HAT + 2383 8 2377 2383 # CTT-HT + 2384 8 2377 2384 # CTT-HT + 2385 8 2377 2385 # CTT-HT + 2386 1 2386 2387 # CAT-CAO + 2387 2 2386 2392 # CAT-CTT + 2388 1 2386 2391 # CAT-CAO + 2389 3 2387 2388 # CAO-CAM + 2390 4 2387 2393 # CAO-HAT + 2391 5 2388 2389 # CAM-CAP + 2392 6 2388 2394 # CAM-HAT + 2393 5 2389 2390 # CAP-CAM + 2394 7 2389 2395 # CAP-HAT + 2395 3 2390 2391 # CAM-CAO + 2396 6 2390 2396 # CAM-HAT + 2397 4 2391 2397 # CAO-HAT + 2398 8 2392 2398 # CTT-HT + 2399 8 2392 2399 # CTT-HT + 2400 8 2392 2400 # CTT-HT + 2401 1 2401 2402 # CAT-CAO + 2402 2 2401 2407 # CAT-CTT + 2403 1 2401 2406 # CAT-CAO + 2404 3 2402 2403 # CAO-CAM + 2405 4 2402 2408 # CAO-HAT + 2406 5 2403 2404 # CAM-CAP + 2407 6 2403 2409 # CAM-HAT + 2408 5 2404 2405 # CAP-CAM + 2409 7 2404 2410 # CAP-HAT + 2410 3 2405 2406 # CAM-CAO + 2411 6 2405 2411 # CAM-HAT + 2412 4 2406 2412 # CAO-HAT + 2413 8 2407 2413 # CTT-HT + 2414 8 2407 2414 # CTT-HT + 2415 8 2407 2415 # CTT-HT + 2416 1 2416 2417 # CAT-CAO + 2417 2 2416 2422 # CAT-CTT + 2418 1 2416 2421 # CAT-CAO + 2419 3 2417 2418 # CAO-CAM + 2420 4 2417 2423 # CAO-HAT + 2421 5 2418 2419 # CAM-CAP + 2422 6 2418 2424 # CAM-HAT + 2423 5 2419 2420 # CAP-CAM + 2424 7 2419 2425 # CAP-HAT + 2425 3 2420 2421 # CAM-CAO + 2426 6 2420 2426 # CAM-HAT + 2427 4 2421 2427 # CAO-HAT + 2428 8 2422 2428 # CTT-HT + 2429 8 2422 2429 # CTT-HT + 2430 8 2422 2430 # CTT-HT + 2431 1 2431 2432 # CAT-CAO + 2432 2 2431 2437 # CAT-CTT + 2433 1 2431 2436 # CAT-CAO + 2434 3 2432 2433 # CAO-CAM + 2435 4 2432 2438 # CAO-HAT + 2436 5 2433 2434 # CAM-CAP + 2437 6 2433 2439 # CAM-HAT + 2438 5 2434 2435 # CAP-CAM + 2439 7 2434 2440 # CAP-HAT + 2440 3 2435 2436 # CAM-CAO + 2441 6 2435 2441 # CAM-HAT + 2442 4 2436 2442 # CAO-HAT + 2443 8 2437 2443 # CTT-HT + 2444 8 2437 2444 # CTT-HT + 2445 8 2437 2445 # CTT-HT + 2446 1 2446 2447 # CAT-CAO + 2447 2 2446 2452 # CAT-CTT + 2448 1 2446 2451 # CAT-CAO + 2449 3 2447 2448 # CAO-CAM + 2450 4 2447 2453 # CAO-HAT + 2451 5 2448 2449 # CAM-CAP + 2452 6 2448 2454 # CAM-HAT + 2453 5 2449 2450 # CAP-CAM + 2454 7 2449 2455 # CAP-HAT + 2455 3 2450 2451 # CAM-CAO + 2456 6 2450 2456 # CAM-HAT + 2457 4 2451 2457 # CAO-HAT + 2458 8 2452 2458 # CTT-HT + 2459 8 2452 2459 # CTT-HT + 2460 8 2452 2460 # CTT-HT + 2461 1 2461 2462 # CAT-CAO + 2462 2 2461 2467 # CAT-CTT + 2463 1 2461 2466 # CAT-CAO + 2464 3 2462 2463 # CAO-CAM + 2465 4 2462 2468 # CAO-HAT + 2466 5 2463 2464 # CAM-CAP + 2467 6 2463 2469 # CAM-HAT + 2468 5 2464 2465 # CAP-CAM + 2469 7 2464 2470 # CAP-HAT + 2470 3 2465 2466 # CAM-CAO + 2471 6 2465 2471 # CAM-HAT + 2472 4 2466 2472 # CAO-HAT + 2473 8 2467 2473 # CTT-HT + 2474 8 2467 2474 # CTT-HT + 2475 8 2467 2475 # CTT-HT + 2476 1 2476 2477 # CAT-CAO + 2477 2 2476 2482 # CAT-CTT + 2478 1 2476 2481 # CAT-CAO + 2479 3 2477 2478 # CAO-CAM + 2480 4 2477 2483 # CAO-HAT + 2481 5 2478 2479 # CAM-CAP + 2482 6 2478 2484 # CAM-HAT + 2483 5 2479 2480 # CAP-CAM + 2484 7 2479 2485 # CAP-HAT + 2485 3 2480 2481 # CAM-CAO + 2486 6 2480 2486 # CAM-HAT + 2487 4 2481 2487 # CAO-HAT + 2488 8 2482 2488 # CTT-HT + 2489 8 2482 2489 # CTT-HT + 2490 8 2482 2490 # CTT-HT + 2491 1 2491 2492 # CAT-CAO + 2492 2 2491 2497 # CAT-CTT + 2493 1 2491 2496 # CAT-CAO + 2494 3 2492 2493 # CAO-CAM + 2495 4 2492 2498 # CAO-HAT + 2496 5 2493 2494 # CAM-CAP + 2497 6 2493 2499 # CAM-HAT + 2498 5 2494 2495 # CAP-CAM + 2499 7 2494 2500 # CAP-HAT + 2500 3 2495 2496 # CAM-CAO + 2501 6 2495 2501 # CAM-HAT + 2502 4 2496 2502 # CAO-HAT + 2503 8 2497 2503 # CTT-HT + 2504 8 2497 2504 # CTT-HT + 2505 8 2497 2505 # CTT-HT + 2506 1 2506 2507 # CAT-CAO + 2507 2 2506 2512 # CAT-CTT + 2508 1 2506 2511 # CAT-CAO + 2509 3 2507 2508 # CAO-CAM + 2510 4 2507 2513 # CAO-HAT + 2511 5 2508 2509 # CAM-CAP + 2512 6 2508 2514 # CAM-HAT + 2513 5 2509 2510 # CAP-CAM + 2514 7 2509 2515 # CAP-HAT + 2515 3 2510 2511 # CAM-CAO + 2516 6 2510 2516 # CAM-HAT + 2517 4 2511 2517 # CAO-HAT + 2518 8 2512 2518 # CTT-HT + 2519 8 2512 2519 # CTT-HT + 2520 8 2512 2520 # CTT-HT + 2521 1 2521 2522 # CAT-CAO + 2522 2 2521 2527 # CAT-CTT + 2523 1 2521 2526 # CAT-CAO + 2524 3 2522 2523 # CAO-CAM + 2525 4 2522 2528 # CAO-HAT + 2526 5 2523 2524 # CAM-CAP + 2527 6 2523 2529 # CAM-HAT + 2528 5 2524 2525 # CAP-CAM + 2529 7 2524 2530 # CAP-HAT + 2530 3 2525 2526 # CAM-CAO + 2531 6 2525 2531 # CAM-HAT + 2532 4 2526 2532 # CAO-HAT + 2533 8 2527 2533 # CTT-HT + 2534 8 2527 2534 # CTT-HT + 2535 8 2527 2535 # CTT-HT + 2536 1 2536 2537 # CAT-CAO + 2537 2 2536 2542 # CAT-CTT + 2538 1 2536 2541 # CAT-CAO + 2539 3 2537 2538 # CAO-CAM + 2540 4 2537 2543 # CAO-HAT + 2541 5 2538 2539 # CAM-CAP + 2542 6 2538 2544 # CAM-HAT + 2543 5 2539 2540 # CAP-CAM + 2544 7 2539 2545 # CAP-HAT + 2545 3 2540 2541 # CAM-CAO + 2546 6 2540 2546 # CAM-HAT + 2547 4 2541 2547 # CAO-HAT + 2548 8 2542 2548 # CTT-HT + 2549 8 2542 2549 # CTT-HT + 2550 8 2542 2550 # CTT-HT + 2551 1 2551 2552 # CAT-CAO + 2552 2 2551 2557 # CAT-CTT + 2553 1 2551 2556 # CAT-CAO + 2554 3 2552 2553 # CAO-CAM + 2555 4 2552 2558 # CAO-HAT + 2556 5 2553 2554 # CAM-CAP + 2557 6 2553 2559 # CAM-HAT + 2558 5 2554 2555 # CAP-CAM + 2559 7 2554 2560 # CAP-HAT + 2560 3 2555 2556 # CAM-CAO + 2561 6 2555 2561 # CAM-HAT + 2562 4 2556 2562 # CAO-HAT + 2563 8 2557 2563 # CTT-HT + 2564 8 2557 2564 # CTT-HT + 2565 8 2557 2565 # CTT-HT + 2566 1 2566 2567 # CAT-CAO + 2567 2 2566 2572 # CAT-CTT + 2568 1 2566 2571 # CAT-CAO + 2569 3 2567 2568 # CAO-CAM + 2570 4 2567 2573 # CAO-HAT + 2571 5 2568 2569 # CAM-CAP + 2572 6 2568 2574 # CAM-HAT + 2573 5 2569 2570 # CAP-CAM + 2574 7 2569 2575 # CAP-HAT + 2575 3 2570 2571 # CAM-CAO + 2576 6 2570 2576 # CAM-HAT + 2577 4 2571 2577 # CAO-HAT + 2578 8 2572 2578 # CTT-HT + 2579 8 2572 2579 # CTT-HT + 2580 8 2572 2580 # CTT-HT + 2581 1 2581 2582 # CAT-CAO + 2582 2 2581 2587 # CAT-CTT + 2583 1 2581 2586 # CAT-CAO + 2584 3 2582 2583 # CAO-CAM + 2585 4 2582 2588 # CAO-HAT + 2586 5 2583 2584 # CAM-CAP + 2587 6 2583 2589 # CAM-HAT + 2588 5 2584 2585 # CAP-CAM + 2589 7 2584 2590 # CAP-HAT + 2590 3 2585 2586 # CAM-CAO + 2591 6 2585 2591 # CAM-HAT + 2592 4 2586 2592 # CAO-HAT + 2593 8 2587 2593 # CTT-HT + 2594 8 2587 2594 # CTT-HT + 2595 8 2587 2595 # CTT-HT + 2596 1 2596 2597 # CAT-CAO + 2597 2 2596 2602 # CAT-CTT + 2598 1 2596 2601 # CAT-CAO + 2599 3 2597 2598 # CAO-CAM + 2600 4 2597 2603 # CAO-HAT + 2601 5 2598 2599 # CAM-CAP + 2602 6 2598 2604 # CAM-HAT + 2603 5 2599 2600 # CAP-CAM + 2604 7 2599 2605 # CAP-HAT + 2605 3 2600 2601 # CAM-CAO + 2606 6 2600 2606 # CAM-HAT + 2607 4 2601 2607 # CAO-HAT + 2608 8 2602 2608 # CTT-HT + 2609 8 2602 2609 # CTT-HT + 2610 8 2602 2610 # CTT-HT + 2611 1 2611 2612 # CAT-CAO + 2612 2 2611 2617 # CAT-CTT + 2613 1 2611 2616 # CAT-CAO + 2614 3 2612 2613 # CAO-CAM + 2615 4 2612 2618 # CAO-HAT + 2616 5 2613 2614 # CAM-CAP + 2617 6 2613 2619 # CAM-HAT + 2618 5 2614 2615 # CAP-CAM + 2619 7 2614 2620 # CAP-HAT + 2620 3 2615 2616 # CAM-CAO + 2621 6 2615 2621 # CAM-HAT + 2622 4 2616 2622 # CAO-HAT + 2623 8 2617 2623 # CTT-HT + 2624 8 2617 2624 # CTT-HT + 2625 8 2617 2625 # CTT-HT + 2626 1 2626 2627 # CAT-CAO + 2627 2 2626 2632 # CAT-CTT + 2628 1 2626 2631 # CAT-CAO + 2629 3 2627 2628 # CAO-CAM + 2630 4 2627 2633 # CAO-HAT + 2631 5 2628 2629 # CAM-CAP + 2632 6 2628 2634 # CAM-HAT + 2633 5 2629 2630 # CAP-CAM + 2634 7 2629 2635 # CAP-HAT + 2635 3 2630 2631 # CAM-CAO + 2636 6 2630 2636 # CAM-HAT + 2637 4 2631 2637 # CAO-HAT + 2638 8 2632 2638 # CTT-HT + 2639 8 2632 2639 # CTT-HT + 2640 8 2632 2640 # CTT-HT + 2641 1 2641 2642 # CAT-CAO + 2642 2 2641 2647 # CAT-CTT + 2643 1 2641 2646 # CAT-CAO + 2644 3 2642 2643 # CAO-CAM + 2645 4 2642 2648 # CAO-HAT + 2646 5 2643 2644 # CAM-CAP + 2647 6 2643 2649 # CAM-HAT + 2648 5 2644 2645 # CAP-CAM + 2649 7 2644 2650 # CAP-HAT + 2650 3 2645 2646 # CAM-CAO + 2651 6 2645 2651 # CAM-HAT + 2652 4 2646 2652 # CAO-HAT + 2653 8 2647 2653 # CTT-HT + 2654 8 2647 2654 # CTT-HT + 2655 8 2647 2655 # CTT-HT + 2656 1 2656 2657 # CAT-CAO + 2657 2 2656 2662 # CAT-CTT + 2658 1 2656 2661 # CAT-CAO + 2659 3 2657 2658 # CAO-CAM + 2660 4 2657 2663 # CAO-HAT + 2661 5 2658 2659 # CAM-CAP + 2662 6 2658 2664 # CAM-HAT + 2663 5 2659 2660 # CAP-CAM + 2664 7 2659 2665 # CAP-HAT + 2665 3 2660 2661 # CAM-CAO + 2666 6 2660 2666 # CAM-HAT + 2667 4 2661 2667 # CAO-HAT + 2668 8 2662 2668 # CTT-HT + 2669 8 2662 2669 # CTT-HT + 2670 8 2662 2670 # CTT-HT + 2671 1 2671 2672 # CAT-CAO + 2672 2 2671 2677 # CAT-CTT + 2673 1 2671 2676 # CAT-CAO + 2674 3 2672 2673 # CAO-CAM + 2675 4 2672 2678 # CAO-HAT + 2676 5 2673 2674 # CAM-CAP + 2677 6 2673 2679 # CAM-HAT + 2678 5 2674 2675 # CAP-CAM + 2679 7 2674 2680 # CAP-HAT + 2680 3 2675 2676 # CAM-CAO + 2681 6 2675 2681 # CAM-HAT + 2682 4 2676 2682 # CAO-HAT + 2683 8 2677 2683 # CTT-HT + 2684 8 2677 2684 # CTT-HT + 2685 8 2677 2685 # CTT-HT + 2686 1 2686 2687 # CAT-CAO + 2687 2 2686 2692 # CAT-CTT + 2688 1 2686 2691 # CAT-CAO + 2689 3 2687 2688 # CAO-CAM + 2690 4 2687 2693 # CAO-HAT + 2691 5 2688 2689 # CAM-CAP + 2692 6 2688 2694 # CAM-HAT + 2693 5 2689 2690 # CAP-CAM + 2694 7 2689 2695 # CAP-HAT + 2695 3 2690 2691 # CAM-CAO + 2696 6 2690 2696 # CAM-HAT + 2697 4 2691 2697 # CAO-HAT + 2698 8 2692 2698 # CTT-HT + 2699 8 2692 2699 # CTT-HT + 2700 8 2692 2700 # CTT-HT + 2701 1 2701 2702 # CAT-CAO + 2702 2 2701 2707 # CAT-CTT + 2703 1 2701 2706 # CAT-CAO + 2704 3 2702 2703 # CAO-CAM + 2705 4 2702 2708 # CAO-HAT + 2706 5 2703 2704 # CAM-CAP + 2707 6 2703 2709 # CAM-HAT + 2708 5 2704 2705 # CAP-CAM + 2709 7 2704 2710 # CAP-HAT + 2710 3 2705 2706 # CAM-CAO + 2711 6 2705 2711 # CAM-HAT + 2712 4 2706 2712 # CAO-HAT + 2713 8 2707 2713 # CTT-HT + 2714 8 2707 2714 # CTT-HT + 2715 8 2707 2715 # CTT-HT + 2716 1 2716 2717 # CAT-CAO + 2717 2 2716 2722 # CAT-CTT + 2718 1 2716 2721 # CAT-CAO + 2719 3 2717 2718 # CAO-CAM + 2720 4 2717 2723 # CAO-HAT + 2721 5 2718 2719 # CAM-CAP + 2722 6 2718 2724 # CAM-HAT + 2723 5 2719 2720 # CAP-CAM + 2724 7 2719 2725 # CAP-HAT + 2725 3 2720 2721 # CAM-CAO + 2726 6 2720 2726 # CAM-HAT + 2727 4 2721 2727 # CAO-HAT + 2728 8 2722 2728 # CTT-HT + 2729 8 2722 2729 # CTT-HT + 2730 8 2722 2730 # CTT-HT + 2731 1 2731 2732 # CAT-CAO + 2732 2 2731 2737 # CAT-CTT + 2733 1 2731 2736 # CAT-CAO + 2734 3 2732 2733 # CAO-CAM + 2735 4 2732 2738 # CAO-HAT + 2736 5 2733 2734 # CAM-CAP + 2737 6 2733 2739 # CAM-HAT + 2738 5 2734 2735 # CAP-CAM + 2739 7 2734 2740 # CAP-HAT + 2740 3 2735 2736 # CAM-CAO + 2741 6 2735 2741 # CAM-HAT + 2742 4 2736 2742 # CAO-HAT + 2743 8 2737 2743 # CTT-HT + 2744 8 2737 2744 # CTT-HT + 2745 8 2737 2745 # CTT-HT + 2746 1 2746 2747 # CAT-CAO + 2747 2 2746 2752 # CAT-CTT + 2748 1 2746 2751 # CAT-CAO + 2749 3 2747 2748 # CAO-CAM + 2750 4 2747 2753 # CAO-HAT + 2751 5 2748 2749 # CAM-CAP + 2752 6 2748 2754 # CAM-HAT + 2753 5 2749 2750 # CAP-CAM + 2754 7 2749 2755 # CAP-HAT + 2755 3 2750 2751 # CAM-CAO + 2756 6 2750 2756 # CAM-HAT + 2757 4 2751 2757 # CAO-HAT + 2758 8 2752 2758 # CTT-HT + 2759 8 2752 2759 # CTT-HT + 2760 8 2752 2760 # CTT-HT + 2761 1 2761 2762 # CAT-CAO + 2762 2 2761 2767 # CAT-CTT + 2763 1 2761 2766 # CAT-CAO + 2764 3 2762 2763 # CAO-CAM + 2765 4 2762 2768 # CAO-HAT + 2766 5 2763 2764 # CAM-CAP + 2767 6 2763 2769 # CAM-HAT + 2768 5 2764 2765 # CAP-CAM + 2769 7 2764 2770 # CAP-HAT + 2770 3 2765 2766 # CAM-CAO + 2771 6 2765 2771 # CAM-HAT + 2772 4 2766 2772 # CAO-HAT + 2773 8 2767 2773 # CTT-HT + 2774 8 2767 2774 # CTT-HT + 2775 8 2767 2775 # CTT-HT + 2776 1 2776 2777 # CAT-CAO + 2777 2 2776 2782 # CAT-CTT + 2778 1 2776 2781 # CAT-CAO + 2779 3 2777 2778 # CAO-CAM + 2780 4 2777 2783 # CAO-HAT + 2781 5 2778 2779 # CAM-CAP + 2782 6 2778 2784 # CAM-HAT + 2783 5 2779 2780 # CAP-CAM + 2784 7 2779 2785 # CAP-HAT + 2785 3 2780 2781 # CAM-CAO + 2786 6 2780 2786 # CAM-HAT + 2787 4 2781 2787 # CAO-HAT + 2788 8 2782 2788 # CTT-HT + 2789 8 2782 2789 # CTT-HT + 2790 8 2782 2790 # CTT-HT + 2791 1 2791 2792 # CAT-CAO + 2792 2 2791 2797 # CAT-CTT + 2793 1 2791 2796 # CAT-CAO + 2794 3 2792 2793 # CAO-CAM + 2795 4 2792 2798 # CAO-HAT + 2796 5 2793 2794 # CAM-CAP + 2797 6 2793 2799 # CAM-HAT + 2798 5 2794 2795 # CAP-CAM + 2799 7 2794 2800 # CAP-HAT + 2800 3 2795 2796 # CAM-CAO + 2801 6 2795 2801 # CAM-HAT + 2802 4 2796 2802 # CAO-HAT + 2803 8 2797 2803 # CTT-HT + 2804 8 2797 2804 # CTT-HT + 2805 8 2797 2805 # CTT-HT + 2806 1 2806 2807 # CAT-CAO + 2807 2 2806 2812 # CAT-CTT + 2808 1 2806 2811 # CAT-CAO + 2809 3 2807 2808 # CAO-CAM + 2810 4 2807 2813 # CAO-HAT + 2811 5 2808 2809 # CAM-CAP + 2812 6 2808 2814 # CAM-HAT + 2813 5 2809 2810 # CAP-CAM + 2814 7 2809 2815 # CAP-HAT + 2815 3 2810 2811 # CAM-CAO + 2816 6 2810 2816 # CAM-HAT + 2817 4 2811 2817 # CAO-HAT + 2818 8 2812 2818 # CTT-HT + 2819 8 2812 2819 # CTT-HT + 2820 8 2812 2820 # CTT-HT + 2821 1 2821 2822 # CAT-CAO + 2822 2 2821 2827 # CAT-CTT + 2823 1 2821 2826 # CAT-CAO + 2824 3 2822 2823 # CAO-CAM + 2825 4 2822 2828 # CAO-HAT + 2826 5 2823 2824 # CAM-CAP + 2827 6 2823 2829 # CAM-HAT + 2828 5 2824 2825 # CAP-CAM + 2829 7 2824 2830 # CAP-HAT + 2830 3 2825 2826 # CAM-CAO + 2831 6 2825 2831 # CAM-HAT + 2832 4 2826 2832 # CAO-HAT + 2833 8 2827 2833 # CTT-HT + 2834 8 2827 2834 # CTT-HT + 2835 8 2827 2835 # CTT-HT + 2836 1 2836 2837 # CAT-CAO + 2837 2 2836 2842 # CAT-CTT + 2838 1 2836 2841 # CAT-CAO + 2839 3 2837 2838 # CAO-CAM + 2840 4 2837 2843 # CAO-HAT + 2841 5 2838 2839 # CAM-CAP + 2842 6 2838 2844 # CAM-HAT + 2843 5 2839 2840 # CAP-CAM + 2844 7 2839 2845 # CAP-HAT + 2845 3 2840 2841 # CAM-CAO + 2846 6 2840 2846 # CAM-HAT + 2847 4 2841 2847 # CAO-HAT + 2848 8 2842 2848 # CTT-HT + 2849 8 2842 2849 # CTT-HT + 2850 8 2842 2850 # CTT-HT + 2851 1 2851 2852 # CAT-CAO + 2852 2 2851 2857 # CAT-CTT + 2853 1 2851 2856 # CAT-CAO + 2854 3 2852 2853 # CAO-CAM + 2855 4 2852 2858 # CAO-HAT + 2856 5 2853 2854 # CAM-CAP + 2857 6 2853 2859 # CAM-HAT + 2858 5 2854 2855 # CAP-CAM + 2859 7 2854 2860 # CAP-HAT + 2860 3 2855 2856 # CAM-CAO + 2861 6 2855 2861 # CAM-HAT + 2862 4 2856 2862 # CAO-HAT + 2863 8 2857 2863 # CTT-HT + 2864 8 2857 2864 # CTT-HT + 2865 8 2857 2865 # CTT-HT + 2866 1 2866 2867 # CAT-CAO + 2867 2 2866 2872 # CAT-CTT + 2868 1 2866 2871 # CAT-CAO + 2869 3 2867 2868 # CAO-CAM + 2870 4 2867 2873 # CAO-HAT + 2871 5 2868 2869 # CAM-CAP + 2872 6 2868 2874 # CAM-HAT + 2873 5 2869 2870 # CAP-CAM + 2874 7 2869 2875 # CAP-HAT + 2875 3 2870 2871 # CAM-CAO + 2876 6 2870 2876 # CAM-HAT + 2877 4 2871 2877 # CAO-HAT + 2878 8 2872 2878 # CTT-HT + 2879 8 2872 2879 # CTT-HT + 2880 8 2872 2880 # CTT-HT + 2881 1 2881 2882 # CAT-CAO + 2882 2 2881 2887 # CAT-CTT + 2883 1 2881 2886 # CAT-CAO + 2884 3 2882 2883 # CAO-CAM + 2885 4 2882 2888 # CAO-HAT + 2886 5 2883 2884 # CAM-CAP + 2887 6 2883 2889 # CAM-HAT + 2888 5 2884 2885 # CAP-CAM + 2889 7 2884 2890 # CAP-HAT + 2890 3 2885 2886 # CAM-CAO + 2891 6 2885 2891 # CAM-HAT + 2892 4 2886 2892 # CAO-HAT + 2893 8 2887 2893 # CTT-HT + 2894 8 2887 2894 # CTT-HT + 2895 8 2887 2895 # CTT-HT + 2896 1 2896 2897 # CAT-CAO + 2897 2 2896 2902 # CAT-CTT + 2898 1 2896 2901 # CAT-CAO + 2899 3 2897 2898 # CAO-CAM + 2900 4 2897 2903 # CAO-HAT + 2901 5 2898 2899 # CAM-CAP + 2902 6 2898 2904 # CAM-HAT + 2903 5 2899 2900 # CAP-CAM + 2904 7 2899 2905 # CAP-HAT + 2905 3 2900 2901 # CAM-CAO + 2906 6 2900 2906 # CAM-HAT + 2907 4 2901 2907 # CAO-HAT + 2908 8 2902 2908 # CTT-HT + 2909 8 2902 2909 # CTT-HT + 2910 8 2902 2910 # CTT-HT + 2911 1 2911 2912 # CAT-CAO + 2912 2 2911 2917 # CAT-CTT + 2913 1 2911 2916 # CAT-CAO + 2914 3 2912 2913 # CAO-CAM + 2915 4 2912 2918 # CAO-HAT + 2916 5 2913 2914 # CAM-CAP + 2917 6 2913 2919 # CAM-HAT + 2918 5 2914 2915 # CAP-CAM + 2919 7 2914 2920 # CAP-HAT + 2920 3 2915 2916 # CAM-CAO + 2921 6 2915 2921 # CAM-HAT + 2922 4 2916 2922 # CAO-HAT + 2923 8 2917 2923 # CTT-HT + 2924 8 2917 2924 # CTT-HT + 2925 8 2917 2925 # CTT-HT + 2926 1 2926 2927 # CAT-CAO + 2927 2 2926 2932 # CAT-CTT + 2928 1 2926 2931 # CAT-CAO + 2929 3 2927 2928 # CAO-CAM + 2930 4 2927 2933 # CAO-HAT + 2931 5 2928 2929 # CAM-CAP + 2932 6 2928 2934 # CAM-HAT + 2933 5 2929 2930 # CAP-CAM + 2934 7 2929 2935 # CAP-HAT + 2935 3 2930 2931 # CAM-CAO + 2936 6 2930 2936 # CAM-HAT + 2937 4 2931 2937 # CAO-HAT + 2938 8 2932 2938 # CTT-HT + 2939 8 2932 2939 # CTT-HT + 2940 8 2932 2940 # CTT-HT + 2941 1 2941 2942 # CAT-CAO + 2942 2 2941 2947 # CAT-CTT + 2943 1 2941 2946 # CAT-CAO + 2944 3 2942 2943 # CAO-CAM + 2945 4 2942 2948 # CAO-HAT + 2946 5 2943 2944 # CAM-CAP + 2947 6 2943 2949 # CAM-HAT + 2948 5 2944 2945 # CAP-CAM + 2949 7 2944 2950 # CAP-HAT + 2950 3 2945 2946 # CAM-CAO + 2951 6 2945 2951 # CAM-HAT + 2952 4 2946 2952 # CAO-HAT + 2953 8 2947 2953 # CTT-HT + 2954 8 2947 2954 # CTT-HT + 2955 8 2947 2955 # CTT-HT + 2956 1 2956 2957 # CAT-CAO + 2957 2 2956 2962 # CAT-CTT + 2958 1 2956 2961 # CAT-CAO + 2959 3 2957 2958 # CAO-CAM + 2960 4 2957 2963 # CAO-HAT + 2961 5 2958 2959 # CAM-CAP + 2962 6 2958 2964 # CAM-HAT + 2963 5 2959 2960 # CAP-CAM + 2964 7 2959 2965 # CAP-HAT + 2965 3 2960 2961 # CAM-CAO + 2966 6 2960 2966 # CAM-HAT + 2967 4 2961 2967 # CAO-HAT + 2968 8 2962 2968 # CTT-HT + 2969 8 2962 2969 # CTT-HT + 2970 8 2962 2970 # CTT-HT + 2971 1 2971 2972 # CAT-CAO + 2972 2 2971 2977 # CAT-CTT + 2973 1 2971 2976 # CAT-CAO + 2974 3 2972 2973 # CAO-CAM + 2975 4 2972 2978 # CAO-HAT + 2976 5 2973 2974 # CAM-CAP + 2977 6 2973 2979 # CAM-HAT + 2978 5 2974 2975 # CAP-CAM + 2979 7 2974 2980 # CAP-HAT + 2980 3 2975 2976 # CAM-CAO + 2981 6 2975 2981 # CAM-HAT + 2982 4 2976 2982 # CAO-HAT + 2983 8 2977 2983 # CTT-HT + 2984 8 2977 2984 # CTT-HT + 2985 8 2977 2985 # CTT-HT + 2986 1 2986 2987 # CAT-CAO + 2987 2 2986 2992 # CAT-CTT + 2988 1 2986 2991 # CAT-CAO + 2989 3 2987 2988 # CAO-CAM + 2990 4 2987 2993 # CAO-HAT + 2991 5 2988 2989 # CAM-CAP + 2992 6 2988 2994 # CAM-HAT + 2993 5 2989 2990 # CAP-CAM + 2994 7 2989 2995 # CAP-HAT + 2995 3 2990 2991 # CAM-CAO + 2996 6 2990 2996 # CAM-HAT + 2997 4 2991 2997 # CAO-HAT + 2998 8 2992 2998 # CTT-HT + 2999 8 2992 2999 # CTT-HT + 3000 8 2992 3000 # CTT-HT + 3001 1 3001 3002 # CAT-CAO + 3002 2 3001 3007 # CAT-CTT + 3003 1 3001 3006 # CAT-CAO + 3004 3 3002 3003 # CAO-CAM + 3005 4 3002 3008 # CAO-HAT + 3006 5 3003 3004 # CAM-CAP + 3007 6 3003 3009 # CAM-HAT + 3008 5 3004 3005 # CAP-CAM + 3009 7 3004 3010 # CAP-HAT + 3010 3 3005 3006 # CAM-CAO + 3011 6 3005 3011 # CAM-HAT + 3012 4 3006 3012 # CAO-HAT + 3013 8 3007 3013 # CTT-HT + 3014 8 3007 3014 # CTT-HT + 3015 8 3007 3015 # CTT-HT + 3016 1 3016 3017 # CAT-CAO + 3017 2 3016 3022 # CAT-CTT + 3018 1 3016 3021 # CAT-CAO + 3019 3 3017 3018 # CAO-CAM + 3020 4 3017 3023 # CAO-HAT + 3021 5 3018 3019 # CAM-CAP + 3022 6 3018 3024 # CAM-HAT + 3023 5 3019 3020 # CAP-CAM + 3024 7 3019 3025 # CAP-HAT + 3025 3 3020 3021 # CAM-CAO + 3026 6 3020 3026 # CAM-HAT + 3027 4 3021 3027 # CAO-HAT + 3028 8 3022 3028 # CTT-HT + 3029 8 3022 3029 # CTT-HT + 3030 8 3022 3030 # CTT-HT + 3031 1 3031 3032 # CAT-CAO + 3032 2 3031 3037 # CAT-CTT + 3033 1 3031 3036 # CAT-CAO + 3034 3 3032 3033 # CAO-CAM + 3035 4 3032 3038 # CAO-HAT + 3036 5 3033 3034 # CAM-CAP + 3037 6 3033 3039 # CAM-HAT + 3038 5 3034 3035 # CAP-CAM + 3039 7 3034 3040 # CAP-HAT + 3040 3 3035 3036 # CAM-CAO + 3041 6 3035 3041 # CAM-HAT + 3042 4 3036 3042 # CAO-HAT + 3043 8 3037 3043 # CTT-HT + 3044 8 3037 3044 # CTT-HT + 3045 8 3037 3045 # CTT-HT + 3046 1 3046 3047 # CAT-CAO + 3047 2 3046 3052 # CAT-CTT + 3048 1 3046 3051 # CAT-CAO + 3049 3 3047 3048 # CAO-CAM + 3050 4 3047 3053 # CAO-HAT + 3051 5 3048 3049 # CAM-CAP + 3052 6 3048 3054 # CAM-HAT + 3053 5 3049 3050 # CAP-CAM + 3054 7 3049 3055 # CAP-HAT + 3055 3 3050 3051 # CAM-CAO + 3056 6 3050 3056 # CAM-HAT + 3057 4 3051 3057 # CAO-HAT + 3058 8 3052 3058 # CTT-HT + 3059 8 3052 3059 # CTT-HT + 3060 8 3052 3060 # CTT-HT + 3061 1 3061 3062 # CAT-CAO + 3062 2 3061 3067 # CAT-CTT + 3063 1 3061 3066 # CAT-CAO + 3064 3 3062 3063 # CAO-CAM + 3065 4 3062 3068 # CAO-HAT + 3066 5 3063 3064 # CAM-CAP + 3067 6 3063 3069 # CAM-HAT + 3068 5 3064 3065 # CAP-CAM + 3069 7 3064 3070 # CAP-HAT + 3070 3 3065 3066 # CAM-CAO + 3071 6 3065 3071 # CAM-HAT + 3072 4 3066 3072 # CAO-HAT + 3073 8 3067 3073 # CTT-HT + 3074 8 3067 3074 # CTT-HT + 3075 8 3067 3075 # CTT-HT + 3076 1 3076 3077 # CAT-CAO + 3077 2 3076 3082 # CAT-CTT + 3078 1 3076 3081 # CAT-CAO + 3079 3 3077 3078 # CAO-CAM + 3080 4 3077 3083 # CAO-HAT + 3081 5 3078 3079 # CAM-CAP + 3082 6 3078 3084 # CAM-HAT + 3083 5 3079 3080 # CAP-CAM + 3084 7 3079 3085 # CAP-HAT + 3085 3 3080 3081 # CAM-CAO + 3086 6 3080 3086 # CAM-HAT + 3087 4 3081 3087 # CAO-HAT + 3088 8 3082 3088 # CTT-HT + 3089 8 3082 3089 # CTT-HT + 3090 8 3082 3090 # CTT-HT + 3091 1 3091 3092 # CAT-CAO + 3092 2 3091 3097 # CAT-CTT + 3093 1 3091 3096 # CAT-CAO + 3094 3 3092 3093 # CAO-CAM + 3095 4 3092 3098 # CAO-HAT + 3096 5 3093 3094 # CAM-CAP + 3097 6 3093 3099 # CAM-HAT + 3098 5 3094 3095 # CAP-CAM + 3099 7 3094 3100 # CAP-HAT + 3100 3 3095 3096 # CAM-CAO + 3101 6 3095 3101 # CAM-HAT + 3102 4 3096 3102 # CAO-HAT + 3103 8 3097 3103 # CTT-HT + 3104 8 3097 3104 # CTT-HT + 3105 8 3097 3105 # CTT-HT + 3106 1 3106 3107 # CAT-CAO + 3107 2 3106 3112 # CAT-CTT + 3108 1 3106 3111 # CAT-CAO + 3109 3 3107 3108 # CAO-CAM + 3110 4 3107 3113 # CAO-HAT + 3111 5 3108 3109 # CAM-CAP + 3112 6 3108 3114 # CAM-HAT + 3113 5 3109 3110 # CAP-CAM + 3114 7 3109 3115 # CAP-HAT + 3115 3 3110 3111 # CAM-CAO + 3116 6 3110 3116 # CAM-HAT + 3117 4 3111 3117 # CAO-HAT + 3118 8 3112 3118 # CTT-HT + 3119 8 3112 3119 # CTT-HT + 3120 8 3112 3120 # CTT-HT + 3121 1 3121 3122 # CAT-CAO + 3122 2 3121 3127 # CAT-CTT + 3123 1 3121 3126 # CAT-CAO + 3124 3 3122 3123 # CAO-CAM + 3125 4 3122 3128 # CAO-HAT + 3126 5 3123 3124 # CAM-CAP + 3127 6 3123 3129 # CAM-HAT + 3128 5 3124 3125 # CAP-CAM + 3129 7 3124 3130 # CAP-HAT + 3130 3 3125 3126 # CAM-CAO + 3131 6 3125 3131 # CAM-HAT + 3132 4 3126 3132 # CAO-HAT + 3133 8 3127 3133 # CTT-HT + 3134 8 3127 3134 # CTT-HT + 3135 8 3127 3135 # CTT-HT + 3136 1 3136 3137 # CAT-CAO + 3137 2 3136 3142 # CAT-CTT + 3138 1 3136 3141 # CAT-CAO + 3139 3 3137 3138 # CAO-CAM + 3140 4 3137 3143 # CAO-HAT + 3141 5 3138 3139 # CAM-CAP + 3142 6 3138 3144 # CAM-HAT + 3143 5 3139 3140 # CAP-CAM + 3144 7 3139 3145 # CAP-HAT + 3145 3 3140 3141 # CAM-CAO + 3146 6 3140 3146 # CAM-HAT + 3147 4 3141 3147 # CAO-HAT + 3148 8 3142 3148 # CTT-HT + 3149 8 3142 3149 # CTT-HT + 3150 8 3142 3150 # CTT-HT + 3151 1 3151 3152 # CAT-CAO + 3152 2 3151 3157 # CAT-CTT + 3153 1 3151 3156 # CAT-CAO + 3154 3 3152 3153 # CAO-CAM + 3155 4 3152 3158 # CAO-HAT + 3156 5 3153 3154 # CAM-CAP + 3157 6 3153 3159 # CAM-HAT + 3158 5 3154 3155 # CAP-CAM + 3159 7 3154 3160 # CAP-HAT + 3160 3 3155 3156 # CAM-CAO + 3161 6 3155 3161 # CAM-HAT + 3162 4 3156 3162 # CAO-HAT + 3163 8 3157 3163 # CTT-HT + 3164 8 3157 3164 # CTT-HT + 3165 8 3157 3165 # CTT-HT + 3166 1 3166 3167 # CAT-CAO + 3167 2 3166 3172 # CAT-CTT + 3168 1 3166 3171 # CAT-CAO + 3169 3 3167 3168 # CAO-CAM + 3170 4 3167 3173 # CAO-HAT + 3171 5 3168 3169 # CAM-CAP + 3172 6 3168 3174 # CAM-HAT + 3173 5 3169 3170 # CAP-CAM + 3174 7 3169 3175 # CAP-HAT + 3175 3 3170 3171 # CAM-CAO + 3176 6 3170 3176 # CAM-HAT + 3177 4 3171 3177 # CAO-HAT + 3178 8 3172 3178 # CTT-HT + 3179 8 3172 3179 # CTT-HT + 3180 8 3172 3180 # CTT-HT + 3181 1 3181 3182 # CAT-CAO + 3182 2 3181 3187 # CAT-CTT + 3183 1 3181 3186 # CAT-CAO + 3184 3 3182 3183 # CAO-CAM + 3185 4 3182 3188 # CAO-HAT + 3186 5 3183 3184 # CAM-CAP + 3187 6 3183 3189 # CAM-HAT + 3188 5 3184 3185 # CAP-CAM + 3189 7 3184 3190 # CAP-HAT + 3190 3 3185 3186 # CAM-CAO + 3191 6 3185 3191 # CAM-HAT + 3192 4 3186 3192 # CAO-HAT + 3193 8 3187 3193 # CTT-HT + 3194 8 3187 3194 # CTT-HT + 3195 8 3187 3195 # CTT-HT + 3196 1 3196 3197 # CAT-CAO + 3197 2 3196 3202 # CAT-CTT + 3198 1 3196 3201 # CAT-CAO + 3199 3 3197 3198 # CAO-CAM + 3200 4 3197 3203 # CAO-HAT + 3201 5 3198 3199 # CAM-CAP + 3202 6 3198 3204 # CAM-HAT + 3203 5 3199 3200 # CAP-CAM + 3204 7 3199 3205 # CAP-HAT + 3205 3 3200 3201 # CAM-CAO + 3206 6 3200 3206 # CAM-HAT + 3207 4 3201 3207 # CAO-HAT + 3208 8 3202 3208 # CTT-HT + 3209 8 3202 3209 # CTT-HT + 3210 8 3202 3210 # CTT-HT + 3211 1 3211 3212 # CAT-CAO + 3212 2 3211 3217 # CAT-CTT + 3213 1 3211 3216 # CAT-CAO + 3214 3 3212 3213 # CAO-CAM + 3215 4 3212 3218 # CAO-HAT + 3216 5 3213 3214 # CAM-CAP + 3217 6 3213 3219 # CAM-HAT + 3218 5 3214 3215 # CAP-CAM + 3219 7 3214 3220 # CAP-HAT + 3220 3 3215 3216 # CAM-CAO + 3221 6 3215 3221 # CAM-HAT + 3222 4 3216 3222 # CAO-HAT + 3223 8 3217 3223 # CTT-HT + 3224 8 3217 3224 # CTT-HT + 3225 8 3217 3225 # CTT-HT + 3226 1 3226 3227 # CAT-CAO + 3227 2 3226 3232 # CAT-CTT + 3228 1 3226 3231 # CAT-CAO + 3229 3 3227 3228 # CAO-CAM + 3230 4 3227 3233 # CAO-HAT + 3231 5 3228 3229 # CAM-CAP + 3232 6 3228 3234 # CAM-HAT + 3233 5 3229 3230 # CAP-CAM + 3234 7 3229 3235 # CAP-HAT + 3235 3 3230 3231 # CAM-CAO + 3236 6 3230 3236 # CAM-HAT + 3237 4 3231 3237 # CAO-HAT + 3238 8 3232 3238 # CTT-HT + 3239 8 3232 3239 # CTT-HT + 3240 8 3232 3240 # CTT-HT + 3241 1 3241 3242 # CAT-CAO + 3242 2 3241 3247 # CAT-CTT + 3243 1 3241 3246 # CAT-CAO + 3244 3 3242 3243 # CAO-CAM + 3245 4 3242 3248 # CAO-HAT + 3246 5 3243 3244 # CAM-CAP + 3247 6 3243 3249 # CAM-HAT + 3248 5 3244 3245 # CAP-CAM + 3249 7 3244 3250 # CAP-HAT + 3250 3 3245 3246 # CAM-CAO + 3251 6 3245 3251 # CAM-HAT + 3252 4 3246 3252 # CAO-HAT + 3253 8 3247 3253 # CTT-HT + 3254 8 3247 3254 # CTT-HT + 3255 8 3247 3255 # CTT-HT + 3256 1 3256 3257 # CAT-CAO + 3257 2 3256 3262 # CAT-CTT + 3258 1 3256 3261 # CAT-CAO + 3259 3 3257 3258 # CAO-CAM + 3260 4 3257 3263 # CAO-HAT + 3261 5 3258 3259 # CAM-CAP + 3262 6 3258 3264 # CAM-HAT + 3263 5 3259 3260 # CAP-CAM + 3264 7 3259 3265 # CAP-HAT + 3265 3 3260 3261 # CAM-CAO + 3266 6 3260 3266 # CAM-HAT + 3267 4 3261 3267 # CAO-HAT + 3268 8 3262 3268 # CTT-HT + 3269 8 3262 3269 # CTT-HT + 3270 8 3262 3270 # CTT-HT + 3271 1 3271 3272 # CAT-CAO + 3272 2 3271 3277 # CAT-CTT + 3273 1 3271 3276 # CAT-CAO + 3274 3 3272 3273 # CAO-CAM + 3275 4 3272 3278 # CAO-HAT + 3276 5 3273 3274 # CAM-CAP + 3277 6 3273 3279 # CAM-HAT + 3278 5 3274 3275 # CAP-CAM + 3279 7 3274 3280 # CAP-HAT + 3280 3 3275 3276 # CAM-CAO + 3281 6 3275 3281 # CAM-HAT + 3282 4 3276 3282 # CAO-HAT + 3283 8 3277 3283 # CTT-HT + 3284 8 3277 3284 # CTT-HT + 3285 8 3277 3285 # CTT-HT + 3286 1 3286 3287 # CAT-CAO + 3287 2 3286 3292 # CAT-CTT + 3288 1 3286 3291 # CAT-CAO + 3289 3 3287 3288 # CAO-CAM + 3290 4 3287 3293 # CAO-HAT + 3291 5 3288 3289 # CAM-CAP + 3292 6 3288 3294 # CAM-HAT + 3293 5 3289 3290 # CAP-CAM + 3294 7 3289 3295 # CAP-HAT + 3295 3 3290 3291 # CAM-CAO + 3296 6 3290 3296 # CAM-HAT + 3297 4 3291 3297 # CAO-HAT + 3298 8 3292 3298 # CTT-HT + 3299 8 3292 3299 # CTT-HT + 3300 8 3292 3300 # CTT-HT + 3301 1 3301 3302 # CAT-CAO + 3302 2 3301 3307 # CAT-CTT + 3303 1 3301 3306 # CAT-CAO + 3304 3 3302 3303 # CAO-CAM + 3305 4 3302 3308 # CAO-HAT + 3306 5 3303 3304 # CAM-CAP + 3307 6 3303 3309 # CAM-HAT + 3308 5 3304 3305 # CAP-CAM + 3309 7 3304 3310 # CAP-HAT + 3310 3 3305 3306 # CAM-CAO + 3311 6 3305 3311 # CAM-HAT + 3312 4 3306 3312 # CAO-HAT + 3313 8 3307 3313 # CTT-HT + 3314 8 3307 3314 # CTT-HT + 3315 8 3307 3315 # CTT-HT + 3316 1 3316 3317 # CAT-CAO + 3317 2 3316 3322 # CAT-CTT + 3318 1 3316 3321 # CAT-CAO + 3319 3 3317 3318 # CAO-CAM + 3320 4 3317 3323 # CAO-HAT + 3321 5 3318 3319 # CAM-CAP + 3322 6 3318 3324 # CAM-HAT + 3323 5 3319 3320 # CAP-CAM + 3324 7 3319 3325 # CAP-HAT + 3325 3 3320 3321 # CAM-CAO + 3326 6 3320 3326 # CAM-HAT + 3327 4 3321 3327 # CAO-HAT + 3328 8 3322 3328 # CTT-HT + 3329 8 3322 3329 # CTT-HT + 3330 8 3322 3330 # CTT-HT + 3331 1 3331 3332 # CAT-CAO + 3332 2 3331 3337 # CAT-CTT + 3333 1 3331 3336 # CAT-CAO + 3334 3 3332 3333 # CAO-CAM + 3335 4 3332 3338 # CAO-HAT + 3336 5 3333 3334 # CAM-CAP + 3337 6 3333 3339 # CAM-HAT + 3338 5 3334 3335 # CAP-CAM + 3339 7 3334 3340 # CAP-HAT + 3340 3 3335 3336 # CAM-CAO + 3341 6 3335 3341 # CAM-HAT + 3342 4 3336 3342 # CAO-HAT + 3343 8 3337 3343 # CTT-HT + 3344 8 3337 3344 # CTT-HT + 3345 8 3337 3345 # CTT-HT + 3346 1 3346 3347 # CAT-CAO + 3347 2 3346 3352 # CAT-CTT + 3348 1 3346 3351 # CAT-CAO + 3349 3 3347 3348 # CAO-CAM + 3350 4 3347 3353 # CAO-HAT + 3351 5 3348 3349 # CAM-CAP + 3352 6 3348 3354 # CAM-HAT + 3353 5 3349 3350 # CAP-CAM + 3354 7 3349 3355 # CAP-HAT + 3355 3 3350 3351 # CAM-CAO + 3356 6 3350 3356 # CAM-HAT + 3357 4 3351 3357 # CAO-HAT + 3358 8 3352 3358 # CTT-HT + 3359 8 3352 3359 # CTT-HT + 3360 8 3352 3360 # CTT-HT + 3361 1 3361 3362 # CAT-CAO + 3362 2 3361 3367 # CAT-CTT + 3363 1 3361 3366 # CAT-CAO + 3364 3 3362 3363 # CAO-CAM + 3365 4 3362 3368 # CAO-HAT + 3366 5 3363 3364 # CAM-CAP + 3367 6 3363 3369 # CAM-HAT + 3368 5 3364 3365 # CAP-CAM + 3369 7 3364 3370 # CAP-HAT + 3370 3 3365 3366 # CAM-CAO + 3371 6 3365 3371 # CAM-HAT + 3372 4 3366 3372 # CAO-HAT + 3373 8 3367 3373 # CTT-HT + 3374 8 3367 3374 # CTT-HT + 3375 8 3367 3375 # CTT-HT + 3376 1 3376 3377 # CAT-CAO + 3377 2 3376 3382 # CAT-CTT + 3378 1 3376 3381 # CAT-CAO + 3379 3 3377 3378 # CAO-CAM + 3380 4 3377 3383 # CAO-HAT + 3381 5 3378 3379 # CAM-CAP + 3382 6 3378 3384 # CAM-HAT + 3383 5 3379 3380 # CAP-CAM + 3384 7 3379 3385 # CAP-HAT + 3385 3 3380 3381 # CAM-CAO + 3386 6 3380 3386 # CAM-HAT + 3387 4 3381 3387 # CAO-HAT + 3388 8 3382 3388 # CTT-HT + 3389 8 3382 3389 # CTT-HT + 3390 8 3382 3390 # CTT-HT + 3391 1 3391 3392 # CAT-CAO + 3392 2 3391 3397 # CAT-CTT + 3393 1 3391 3396 # CAT-CAO + 3394 3 3392 3393 # CAO-CAM + 3395 4 3392 3398 # CAO-HAT + 3396 5 3393 3394 # CAM-CAP + 3397 6 3393 3399 # CAM-HAT + 3398 5 3394 3395 # CAP-CAM + 3399 7 3394 3400 # CAP-HAT + 3400 3 3395 3396 # CAM-CAO + 3401 6 3395 3401 # CAM-HAT + 3402 4 3396 3402 # CAO-HAT + 3403 8 3397 3403 # CTT-HT + 3404 8 3397 3404 # CTT-HT + 3405 8 3397 3405 # CTT-HT + 3406 1 3406 3407 # CAT-CAO + 3407 2 3406 3412 # CAT-CTT + 3408 1 3406 3411 # CAT-CAO + 3409 3 3407 3408 # CAO-CAM + 3410 4 3407 3413 # CAO-HAT + 3411 5 3408 3409 # CAM-CAP + 3412 6 3408 3414 # CAM-HAT + 3413 5 3409 3410 # CAP-CAM + 3414 7 3409 3415 # CAP-HAT + 3415 3 3410 3411 # CAM-CAO + 3416 6 3410 3416 # CAM-HAT + 3417 4 3411 3417 # CAO-HAT + 3418 8 3412 3418 # CTT-HT + 3419 8 3412 3419 # CTT-HT + 3420 8 3412 3420 # CTT-HT + 3421 1 3421 3422 # CAT-CAO + 3422 2 3421 3427 # CAT-CTT + 3423 1 3421 3426 # CAT-CAO + 3424 3 3422 3423 # CAO-CAM + 3425 4 3422 3428 # CAO-HAT + 3426 5 3423 3424 # CAM-CAP + 3427 6 3423 3429 # CAM-HAT + 3428 5 3424 3425 # CAP-CAM + 3429 7 3424 3430 # CAP-HAT + 3430 3 3425 3426 # CAM-CAO + 3431 6 3425 3431 # CAM-HAT + 3432 4 3426 3432 # CAO-HAT + 3433 8 3427 3433 # CTT-HT + 3434 8 3427 3434 # CTT-HT + 3435 8 3427 3435 # CTT-HT + 3436 1 3436 3437 # CAT-CAO + 3437 2 3436 3442 # CAT-CTT + 3438 1 3436 3441 # CAT-CAO + 3439 3 3437 3438 # CAO-CAM + 3440 4 3437 3443 # CAO-HAT + 3441 5 3438 3439 # CAM-CAP + 3442 6 3438 3444 # CAM-HAT + 3443 5 3439 3440 # CAP-CAM + 3444 7 3439 3445 # CAP-HAT + 3445 3 3440 3441 # CAM-CAO + 3446 6 3440 3446 # CAM-HAT + 3447 4 3441 3447 # CAO-HAT + 3448 8 3442 3448 # CTT-HT + 3449 8 3442 3449 # CTT-HT + 3450 8 3442 3450 # CTT-HT + 3451 1 3451 3452 # CAT-CAO + 3452 2 3451 3457 # CAT-CTT + 3453 1 3451 3456 # CAT-CAO + 3454 3 3452 3453 # CAO-CAM + 3455 4 3452 3458 # CAO-HAT + 3456 5 3453 3454 # CAM-CAP + 3457 6 3453 3459 # CAM-HAT + 3458 5 3454 3455 # CAP-CAM + 3459 7 3454 3460 # CAP-HAT + 3460 3 3455 3456 # CAM-CAO + 3461 6 3455 3461 # CAM-HAT + 3462 4 3456 3462 # CAO-HAT + 3463 8 3457 3463 # CTT-HT + 3464 8 3457 3464 # CTT-HT + 3465 8 3457 3465 # CTT-HT + 3466 1 3466 3467 # CAT-CAO + 3467 2 3466 3472 # CAT-CTT + 3468 1 3466 3471 # CAT-CAO + 3469 3 3467 3468 # CAO-CAM + 3470 4 3467 3473 # CAO-HAT + 3471 5 3468 3469 # CAM-CAP + 3472 6 3468 3474 # CAM-HAT + 3473 5 3469 3470 # CAP-CAM + 3474 7 3469 3475 # CAP-HAT + 3475 3 3470 3471 # CAM-CAO + 3476 6 3470 3476 # CAM-HAT + 3477 4 3471 3477 # CAO-HAT + 3478 8 3472 3478 # CTT-HT + 3479 8 3472 3479 # CTT-HT + 3480 8 3472 3480 # CTT-HT + 3481 1 3481 3482 # CAT-CAO + 3482 2 3481 3487 # CAT-CTT + 3483 1 3481 3486 # CAT-CAO + 3484 3 3482 3483 # CAO-CAM + 3485 4 3482 3488 # CAO-HAT + 3486 5 3483 3484 # CAM-CAP + 3487 6 3483 3489 # CAM-HAT + 3488 5 3484 3485 # CAP-CAM + 3489 7 3484 3490 # CAP-HAT + 3490 3 3485 3486 # CAM-CAO + 3491 6 3485 3491 # CAM-HAT + 3492 4 3486 3492 # CAO-HAT + 3493 8 3487 3493 # CTT-HT + 3494 8 3487 3494 # CTT-HT + 3495 8 3487 3495 # CTT-HT + 3496 1 3496 3497 # CAT-CAO + 3497 2 3496 3502 # CAT-CTT + 3498 1 3496 3501 # CAT-CAO + 3499 3 3497 3498 # CAO-CAM + 3500 4 3497 3503 # CAO-HAT + 3501 5 3498 3499 # CAM-CAP + 3502 6 3498 3504 # CAM-HAT + 3503 5 3499 3500 # CAP-CAM + 3504 7 3499 3505 # CAP-HAT + 3505 3 3500 3501 # CAM-CAO + 3506 6 3500 3506 # CAM-HAT + 3507 4 3501 3507 # CAO-HAT + 3508 8 3502 3508 # CTT-HT + 3509 8 3502 3509 # CTT-HT + 3510 8 3502 3510 # CTT-HT + 3511 1 3511 3512 # CAT-CAO + 3512 2 3511 3517 # CAT-CTT + 3513 1 3511 3516 # CAT-CAO + 3514 3 3512 3513 # CAO-CAM + 3515 4 3512 3518 # CAO-HAT + 3516 5 3513 3514 # CAM-CAP + 3517 6 3513 3519 # CAM-HAT + 3518 5 3514 3515 # CAP-CAM + 3519 7 3514 3520 # CAP-HAT + 3520 3 3515 3516 # CAM-CAO + 3521 6 3515 3521 # CAM-HAT + 3522 4 3516 3522 # CAO-HAT + 3523 8 3517 3523 # CTT-HT + 3524 8 3517 3524 # CTT-HT + 3525 8 3517 3525 # CTT-HT + 3526 1 3526 3527 # CAT-CAO + 3527 2 3526 3532 # CAT-CTT + 3528 1 3526 3531 # CAT-CAO + 3529 3 3527 3528 # CAO-CAM + 3530 4 3527 3533 # CAO-HAT + 3531 5 3528 3529 # CAM-CAP + 3532 6 3528 3534 # CAM-HAT + 3533 5 3529 3530 # CAP-CAM + 3534 7 3529 3535 # CAP-HAT + 3535 3 3530 3531 # CAM-CAO + 3536 6 3530 3536 # CAM-HAT + 3537 4 3531 3537 # CAO-HAT + 3538 8 3532 3538 # CTT-HT + 3539 8 3532 3539 # CTT-HT + 3540 8 3532 3540 # CTT-HT + 3541 1 3541 3542 # CAT-CAO + 3542 2 3541 3547 # CAT-CTT + 3543 1 3541 3546 # CAT-CAO + 3544 3 3542 3543 # CAO-CAM + 3545 4 3542 3548 # CAO-HAT + 3546 5 3543 3544 # CAM-CAP + 3547 6 3543 3549 # CAM-HAT + 3548 5 3544 3545 # CAP-CAM + 3549 7 3544 3550 # CAP-HAT + 3550 3 3545 3546 # CAM-CAO + 3551 6 3545 3551 # CAM-HAT + 3552 4 3546 3552 # CAO-HAT + 3553 8 3547 3553 # CTT-HT + 3554 8 3547 3554 # CTT-HT + 3555 8 3547 3555 # CTT-HT + 3556 1 3556 3557 # CAT-CAO + 3557 2 3556 3562 # CAT-CTT + 3558 1 3556 3561 # CAT-CAO + 3559 3 3557 3558 # CAO-CAM + 3560 4 3557 3563 # CAO-HAT + 3561 5 3558 3559 # CAM-CAP + 3562 6 3558 3564 # CAM-HAT + 3563 5 3559 3560 # CAP-CAM + 3564 7 3559 3565 # CAP-HAT + 3565 3 3560 3561 # CAM-CAO + 3566 6 3560 3566 # CAM-HAT + 3567 4 3561 3567 # CAO-HAT + 3568 8 3562 3568 # CTT-HT + 3569 8 3562 3569 # CTT-HT + 3570 8 3562 3570 # CTT-HT + 3571 1 3571 3572 # CAT-CAO + 3572 2 3571 3577 # CAT-CTT + 3573 1 3571 3576 # CAT-CAO + 3574 3 3572 3573 # CAO-CAM + 3575 4 3572 3578 # CAO-HAT + 3576 5 3573 3574 # CAM-CAP + 3577 6 3573 3579 # CAM-HAT + 3578 5 3574 3575 # CAP-CAM + 3579 7 3574 3580 # CAP-HAT + 3580 3 3575 3576 # CAM-CAO + 3581 6 3575 3581 # CAM-HAT + 3582 4 3576 3582 # CAO-HAT + 3583 8 3577 3583 # CTT-HT + 3584 8 3577 3584 # CTT-HT + 3585 8 3577 3585 # CTT-HT + 3586 1 3586 3587 # CAT-CAO + 3587 2 3586 3592 # CAT-CTT + 3588 1 3586 3591 # CAT-CAO + 3589 3 3587 3588 # CAO-CAM + 3590 4 3587 3593 # CAO-HAT + 3591 5 3588 3589 # CAM-CAP + 3592 6 3588 3594 # CAM-HAT + 3593 5 3589 3590 # CAP-CAM + 3594 7 3589 3595 # CAP-HAT + 3595 3 3590 3591 # CAM-CAO + 3596 6 3590 3596 # CAM-HAT + 3597 4 3591 3597 # CAO-HAT + 3598 8 3592 3598 # CTT-HT + 3599 8 3592 3599 # CTT-HT + 3600 8 3592 3600 # CTT-HT + 3601 1 3601 3602 # CAT-CAO + 3602 2 3601 3607 # CAT-CTT + 3603 1 3601 3606 # CAT-CAO + 3604 3 3602 3603 # CAO-CAM + 3605 4 3602 3608 # CAO-HAT + 3606 5 3603 3604 # CAM-CAP + 3607 6 3603 3609 # CAM-HAT + 3608 5 3604 3605 # CAP-CAM + 3609 7 3604 3610 # CAP-HAT + 3610 3 3605 3606 # CAM-CAO + 3611 6 3605 3611 # CAM-HAT + 3612 4 3606 3612 # CAO-HAT + 3613 8 3607 3613 # CTT-HT + 3614 8 3607 3614 # CTT-HT + 3615 8 3607 3615 # CTT-HT + 3616 1 3616 3617 # CAT-CAO + 3617 2 3616 3622 # CAT-CTT + 3618 1 3616 3621 # CAT-CAO + 3619 3 3617 3618 # CAO-CAM + 3620 4 3617 3623 # CAO-HAT + 3621 5 3618 3619 # CAM-CAP + 3622 6 3618 3624 # CAM-HAT + 3623 5 3619 3620 # CAP-CAM + 3624 7 3619 3625 # CAP-HAT + 3625 3 3620 3621 # CAM-CAO + 3626 6 3620 3626 # CAM-HAT + 3627 4 3621 3627 # CAO-HAT + 3628 8 3622 3628 # CTT-HT + 3629 8 3622 3629 # CTT-HT + 3630 8 3622 3630 # CTT-HT + 3631 1 3631 3632 # CAT-CAO + 3632 2 3631 3637 # CAT-CTT + 3633 1 3631 3636 # CAT-CAO + 3634 3 3632 3633 # CAO-CAM + 3635 4 3632 3638 # CAO-HAT + 3636 5 3633 3634 # CAM-CAP + 3637 6 3633 3639 # CAM-HAT + 3638 5 3634 3635 # CAP-CAM + 3639 7 3634 3640 # CAP-HAT + 3640 3 3635 3636 # CAM-CAO + 3641 6 3635 3641 # CAM-HAT + 3642 4 3636 3642 # CAO-HAT + 3643 8 3637 3643 # CTT-HT + 3644 8 3637 3644 # CTT-HT + 3645 8 3637 3645 # CTT-HT + 3646 1 3646 3647 # CAT-CAO + 3647 2 3646 3652 # CAT-CTT + 3648 1 3646 3651 # CAT-CAO + 3649 3 3647 3648 # CAO-CAM + 3650 4 3647 3653 # CAO-HAT + 3651 5 3648 3649 # CAM-CAP + 3652 6 3648 3654 # CAM-HAT + 3653 5 3649 3650 # CAP-CAM + 3654 7 3649 3655 # CAP-HAT + 3655 3 3650 3651 # CAM-CAO + 3656 6 3650 3656 # CAM-HAT + 3657 4 3651 3657 # CAO-HAT + 3658 8 3652 3658 # CTT-HT + 3659 8 3652 3659 # CTT-HT + 3660 8 3652 3660 # CTT-HT + 3661 1 3661 3662 # CAT-CAO + 3662 2 3661 3667 # CAT-CTT + 3663 1 3661 3666 # CAT-CAO + 3664 3 3662 3663 # CAO-CAM + 3665 4 3662 3668 # CAO-HAT + 3666 5 3663 3664 # CAM-CAP + 3667 6 3663 3669 # CAM-HAT + 3668 5 3664 3665 # CAP-CAM + 3669 7 3664 3670 # CAP-HAT + 3670 3 3665 3666 # CAM-CAO + 3671 6 3665 3671 # CAM-HAT + 3672 4 3666 3672 # CAO-HAT + 3673 8 3667 3673 # CTT-HT + 3674 8 3667 3674 # CTT-HT + 3675 8 3667 3675 # CTT-HT + 3676 1 3676 3677 # CAT-CAO + 3677 2 3676 3682 # CAT-CTT + 3678 1 3676 3681 # CAT-CAO + 3679 3 3677 3678 # CAO-CAM + 3680 4 3677 3683 # CAO-HAT + 3681 5 3678 3679 # CAM-CAP + 3682 6 3678 3684 # CAM-HAT + 3683 5 3679 3680 # CAP-CAM + 3684 7 3679 3685 # CAP-HAT + 3685 3 3680 3681 # CAM-CAO + 3686 6 3680 3686 # CAM-HAT + 3687 4 3681 3687 # CAO-HAT + 3688 8 3682 3688 # CTT-HT + 3689 8 3682 3689 # CTT-HT + 3690 8 3682 3690 # CTT-HT + 3691 1 3691 3692 # CAT-CAO + 3692 2 3691 3697 # CAT-CTT + 3693 1 3691 3696 # CAT-CAO + 3694 3 3692 3693 # CAO-CAM + 3695 4 3692 3698 # CAO-HAT + 3696 5 3693 3694 # CAM-CAP + 3697 6 3693 3699 # CAM-HAT + 3698 5 3694 3695 # CAP-CAM + 3699 7 3694 3700 # CAP-HAT + 3700 3 3695 3696 # CAM-CAO + 3701 6 3695 3701 # CAM-HAT + 3702 4 3696 3702 # CAO-HAT + 3703 8 3697 3703 # CTT-HT + 3704 8 3697 3704 # CTT-HT + 3705 8 3697 3705 # CTT-HT + 3706 1 3706 3707 # CAT-CAO + 3707 2 3706 3712 # CAT-CTT + 3708 1 3706 3711 # CAT-CAO + 3709 3 3707 3708 # CAO-CAM + 3710 4 3707 3713 # CAO-HAT + 3711 5 3708 3709 # CAM-CAP + 3712 6 3708 3714 # CAM-HAT + 3713 5 3709 3710 # CAP-CAM + 3714 7 3709 3715 # CAP-HAT + 3715 3 3710 3711 # CAM-CAO + 3716 6 3710 3716 # CAM-HAT + 3717 4 3711 3717 # CAO-HAT + 3718 8 3712 3718 # CTT-HT + 3719 8 3712 3719 # CTT-HT + 3720 8 3712 3720 # CTT-HT + 3721 1 3721 3722 # CAT-CAO + 3722 2 3721 3727 # CAT-CTT + 3723 1 3721 3726 # CAT-CAO + 3724 3 3722 3723 # CAO-CAM + 3725 4 3722 3728 # CAO-HAT + 3726 5 3723 3724 # CAM-CAP + 3727 6 3723 3729 # CAM-HAT + 3728 5 3724 3725 # CAP-CAM + 3729 7 3724 3730 # CAP-HAT + 3730 3 3725 3726 # CAM-CAO + 3731 6 3725 3731 # CAM-HAT + 3732 4 3726 3732 # CAO-HAT + 3733 8 3727 3733 # CTT-HT + 3734 8 3727 3734 # CTT-HT + 3735 8 3727 3735 # CTT-HT + 3736 1 3736 3737 # CAT-CAO + 3737 2 3736 3742 # CAT-CTT + 3738 1 3736 3741 # CAT-CAO + 3739 3 3737 3738 # CAO-CAM + 3740 4 3737 3743 # CAO-HAT + 3741 5 3738 3739 # CAM-CAP + 3742 6 3738 3744 # CAM-HAT + 3743 5 3739 3740 # CAP-CAM + 3744 7 3739 3745 # CAP-HAT + 3745 3 3740 3741 # CAM-CAO + 3746 6 3740 3746 # CAM-HAT + 3747 4 3741 3747 # CAO-HAT + 3748 8 3742 3748 # CTT-HT + 3749 8 3742 3749 # CTT-HT + 3750 8 3742 3750 # CTT-HT + 3751 9 1 3751 # CAT-D_CAT + 3752 10 2 3752 # CAO-D_CAO + 3753 11 3 3753 # CAM-D_CAM + 3754 12 4 3754 # CAP-D_CAP + 3755 11 5 3755 # CAM-D_CAM + 3756 10 6 3756 # CAO-D_CAO + 3757 13 7 3757 # CTT-D_CTT + 3758 9 16 3758 # CAT-D_CAT + 3759 10 17 3759 # CAO-D_CAO + 3760 11 18 3760 # CAM-D_CAM + 3761 12 19 3761 # CAP-D_CAP + 3762 11 20 3762 # CAM-D_CAM + 3763 10 21 3763 # CAO-D_CAO + 3764 13 22 3764 # CTT-D_CTT + 3765 9 31 3765 # CAT-D_CAT + 3766 10 32 3766 # CAO-D_CAO + 3767 11 33 3767 # CAM-D_CAM + 3768 12 34 3768 # CAP-D_CAP + 3769 11 35 3769 # CAM-D_CAM + 3770 10 36 3770 # CAO-D_CAO + 3771 13 37 3771 # CTT-D_CTT + 3772 9 46 3772 # CAT-D_CAT + 3773 10 47 3773 # CAO-D_CAO + 3774 11 48 3774 # CAM-D_CAM + 3775 12 49 3775 # CAP-D_CAP + 3776 11 50 3776 # CAM-D_CAM + 3777 10 51 3777 # CAO-D_CAO + 3778 13 52 3778 # CTT-D_CTT + 3779 9 61 3779 # CAT-D_CAT + 3780 10 62 3780 # CAO-D_CAO + 3781 11 63 3781 # CAM-D_CAM + 3782 12 64 3782 # CAP-D_CAP + 3783 11 65 3783 # CAM-D_CAM + 3784 10 66 3784 # CAO-D_CAO + 3785 13 67 3785 # CTT-D_CTT + 3786 9 76 3786 # CAT-D_CAT + 3787 10 77 3787 # CAO-D_CAO + 3788 11 78 3788 # CAM-D_CAM + 3789 12 79 3789 # CAP-D_CAP + 3790 11 80 3790 # CAM-D_CAM + 3791 10 81 3791 # CAO-D_CAO + 3792 13 82 3792 # CTT-D_CTT + 3793 9 91 3793 # CAT-D_CAT + 3794 10 92 3794 # CAO-D_CAO + 3795 11 93 3795 # CAM-D_CAM + 3796 12 94 3796 # CAP-D_CAP + 3797 11 95 3797 # CAM-D_CAM + 3798 10 96 3798 # CAO-D_CAO + 3799 13 97 3799 # CTT-D_CTT + 3800 9 106 3800 # CAT-D_CAT + 3801 10 107 3801 # CAO-D_CAO + 3802 11 108 3802 # CAM-D_CAM + 3803 12 109 3803 # CAP-D_CAP + 3804 11 110 3804 # CAM-D_CAM + 3805 10 111 3805 # CAO-D_CAO + 3806 13 112 3806 # CTT-D_CTT + 3807 9 121 3807 # CAT-D_CAT + 3808 10 122 3808 # CAO-D_CAO + 3809 11 123 3809 # CAM-D_CAM + 3810 12 124 3810 # CAP-D_CAP + 3811 11 125 3811 # CAM-D_CAM + 3812 10 126 3812 # CAO-D_CAO + 3813 13 127 3813 # CTT-D_CTT + 3814 9 136 3814 # CAT-D_CAT + 3815 10 137 3815 # CAO-D_CAO + 3816 11 138 3816 # CAM-D_CAM + 3817 12 139 3817 # CAP-D_CAP + 3818 11 140 3818 # CAM-D_CAM + 3819 10 141 3819 # CAO-D_CAO + 3820 13 142 3820 # CTT-D_CTT + 3821 9 151 3821 # CAT-D_CAT + 3822 10 152 3822 # CAO-D_CAO + 3823 11 153 3823 # CAM-D_CAM + 3824 12 154 3824 # CAP-D_CAP + 3825 11 155 3825 # CAM-D_CAM + 3826 10 156 3826 # CAO-D_CAO + 3827 13 157 3827 # CTT-D_CTT + 3828 9 166 3828 # CAT-D_CAT + 3829 10 167 3829 # CAO-D_CAO + 3830 11 168 3830 # CAM-D_CAM + 3831 12 169 3831 # CAP-D_CAP + 3832 11 170 3832 # CAM-D_CAM + 3833 10 171 3833 # CAO-D_CAO + 3834 13 172 3834 # CTT-D_CTT + 3835 9 181 3835 # CAT-D_CAT + 3836 10 182 3836 # CAO-D_CAO + 3837 11 183 3837 # CAM-D_CAM + 3838 12 184 3838 # CAP-D_CAP + 3839 11 185 3839 # CAM-D_CAM + 3840 10 186 3840 # CAO-D_CAO + 3841 13 187 3841 # CTT-D_CTT + 3842 9 196 3842 # CAT-D_CAT + 3843 10 197 3843 # CAO-D_CAO + 3844 11 198 3844 # CAM-D_CAM + 3845 12 199 3845 # CAP-D_CAP + 3846 11 200 3846 # CAM-D_CAM + 3847 10 201 3847 # CAO-D_CAO + 3848 13 202 3848 # CTT-D_CTT + 3849 9 211 3849 # CAT-D_CAT + 3850 10 212 3850 # CAO-D_CAO + 3851 11 213 3851 # CAM-D_CAM + 3852 12 214 3852 # CAP-D_CAP + 3853 11 215 3853 # CAM-D_CAM + 3854 10 216 3854 # CAO-D_CAO + 3855 13 217 3855 # CTT-D_CTT + 3856 9 226 3856 # CAT-D_CAT + 3857 10 227 3857 # CAO-D_CAO + 3858 11 228 3858 # CAM-D_CAM + 3859 12 229 3859 # CAP-D_CAP + 3860 11 230 3860 # CAM-D_CAM + 3861 10 231 3861 # CAO-D_CAO + 3862 13 232 3862 # CTT-D_CTT + 3863 9 241 3863 # CAT-D_CAT + 3864 10 242 3864 # CAO-D_CAO + 3865 11 243 3865 # CAM-D_CAM + 3866 12 244 3866 # CAP-D_CAP + 3867 11 245 3867 # CAM-D_CAM + 3868 10 246 3868 # CAO-D_CAO + 3869 13 247 3869 # CTT-D_CTT + 3870 9 256 3870 # CAT-D_CAT + 3871 10 257 3871 # CAO-D_CAO + 3872 11 258 3872 # CAM-D_CAM + 3873 12 259 3873 # CAP-D_CAP + 3874 11 260 3874 # CAM-D_CAM + 3875 10 261 3875 # CAO-D_CAO + 3876 13 262 3876 # CTT-D_CTT + 3877 9 271 3877 # CAT-D_CAT + 3878 10 272 3878 # CAO-D_CAO + 3879 11 273 3879 # CAM-D_CAM + 3880 12 274 3880 # CAP-D_CAP + 3881 11 275 3881 # CAM-D_CAM + 3882 10 276 3882 # CAO-D_CAO + 3883 13 277 3883 # CTT-D_CTT + 3884 9 286 3884 # CAT-D_CAT + 3885 10 287 3885 # CAO-D_CAO + 3886 11 288 3886 # CAM-D_CAM + 3887 12 289 3887 # CAP-D_CAP + 3888 11 290 3888 # CAM-D_CAM + 3889 10 291 3889 # CAO-D_CAO + 3890 13 292 3890 # CTT-D_CTT + 3891 9 301 3891 # CAT-D_CAT + 3892 10 302 3892 # CAO-D_CAO + 3893 11 303 3893 # CAM-D_CAM + 3894 12 304 3894 # CAP-D_CAP + 3895 11 305 3895 # CAM-D_CAM + 3896 10 306 3896 # CAO-D_CAO + 3897 13 307 3897 # CTT-D_CTT + 3898 9 316 3898 # CAT-D_CAT + 3899 10 317 3899 # CAO-D_CAO + 3900 11 318 3900 # CAM-D_CAM + 3901 12 319 3901 # CAP-D_CAP + 3902 11 320 3902 # CAM-D_CAM + 3903 10 321 3903 # CAO-D_CAO + 3904 13 322 3904 # CTT-D_CTT + 3905 9 331 3905 # CAT-D_CAT + 3906 10 332 3906 # CAO-D_CAO + 3907 11 333 3907 # CAM-D_CAM + 3908 12 334 3908 # CAP-D_CAP + 3909 11 335 3909 # CAM-D_CAM + 3910 10 336 3910 # CAO-D_CAO + 3911 13 337 3911 # CTT-D_CTT + 3912 9 346 3912 # CAT-D_CAT + 3913 10 347 3913 # CAO-D_CAO + 3914 11 348 3914 # CAM-D_CAM + 3915 12 349 3915 # CAP-D_CAP + 3916 11 350 3916 # CAM-D_CAM + 3917 10 351 3917 # CAO-D_CAO + 3918 13 352 3918 # CTT-D_CTT + 3919 9 361 3919 # CAT-D_CAT + 3920 10 362 3920 # CAO-D_CAO + 3921 11 363 3921 # CAM-D_CAM + 3922 12 364 3922 # CAP-D_CAP + 3923 11 365 3923 # CAM-D_CAM + 3924 10 366 3924 # CAO-D_CAO + 3925 13 367 3925 # CTT-D_CTT + 3926 9 376 3926 # CAT-D_CAT + 3927 10 377 3927 # CAO-D_CAO + 3928 11 378 3928 # CAM-D_CAM + 3929 12 379 3929 # CAP-D_CAP + 3930 11 380 3930 # CAM-D_CAM + 3931 10 381 3931 # CAO-D_CAO + 3932 13 382 3932 # CTT-D_CTT + 3933 9 391 3933 # CAT-D_CAT + 3934 10 392 3934 # CAO-D_CAO + 3935 11 393 3935 # CAM-D_CAM + 3936 12 394 3936 # CAP-D_CAP + 3937 11 395 3937 # CAM-D_CAM + 3938 10 396 3938 # CAO-D_CAO + 3939 13 397 3939 # CTT-D_CTT + 3940 9 406 3940 # CAT-D_CAT + 3941 10 407 3941 # CAO-D_CAO + 3942 11 408 3942 # CAM-D_CAM + 3943 12 409 3943 # CAP-D_CAP + 3944 11 410 3944 # CAM-D_CAM + 3945 10 411 3945 # CAO-D_CAO + 3946 13 412 3946 # CTT-D_CTT + 3947 9 421 3947 # CAT-D_CAT + 3948 10 422 3948 # CAO-D_CAO + 3949 11 423 3949 # CAM-D_CAM + 3950 12 424 3950 # CAP-D_CAP + 3951 11 425 3951 # CAM-D_CAM + 3952 10 426 3952 # CAO-D_CAO + 3953 13 427 3953 # CTT-D_CTT + 3954 9 436 3954 # CAT-D_CAT + 3955 10 437 3955 # CAO-D_CAO + 3956 11 438 3956 # CAM-D_CAM + 3957 12 439 3957 # CAP-D_CAP + 3958 11 440 3958 # CAM-D_CAM + 3959 10 441 3959 # CAO-D_CAO + 3960 13 442 3960 # CTT-D_CTT + 3961 9 451 3961 # CAT-D_CAT + 3962 10 452 3962 # CAO-D_CAO + 3963 11 453 3963 # CAM-D_CAM + 3964 12 454 3964 # CAP-D_CAP + 3965 11 455 3965 # CAM-D_CAM + 3966 10 456 3966 # CAO-D_CAO + 3967 13 457 3967 # CTT-D_CTT + 3968 9 466 3968 # CAT-D_CAT + 3969 10 467 3969 # CAO-D_CAO + 3970 11 468 3970 # CAM-D_CAM + 3971 12 469 3971 # CAP-D_CAP + 3972 11 470 3972 # CAM-D_CAM + 3973 10 471 3973 # CAO-D_CAO + 3974 13 472 3974 # CTT-D_CTT + 3975 9 481 3975 # CAT-D_CAT + 3976 10 482 3976 # CAO-D_CAO + 3977 11 483 3977 # CAM-D_CAM + 3978 12 484 3978 # CAP-D_CAP + 3979 11 485 3979 # CAM-D_CAM + 3980 10 486 3980 # CAO-D_CAO + 3981 13 487 3981 # CTT-D_CTT + 3982 9 496 3982 # CAT-D_CAT + 3983 10 497 3983 # CAO-D_CAO + 3984 11 498 3984 # CAM-D_CAM + 3985 12 499 3985 # CAP-D_CAP + 3986 11 500 3986 # CAM-D_CAM + 3987 10 501 3987 # CAO-D_CAO + 3988 13 502 3988 # CTT-D_CTT + 3989 9 511 3989 # CAT-D_CAT + 3990 10 512 3990 # CAO-D_CAO + 3991 11 513 3991 # CAM-D_CAM + 3992 12 514 3992 # CAP-D_CAP + 3993 11 515 3993 # CAM-D_CAM + 3994 10 516 3994 # CAO-D_CAO + 3995 13 517 3995 # CTT-D_CTT + 3996 9 526 3996 # CAT-D_CAT + 3997 10 527 3997 # CAO-D_CAO + 3998 11 528 3998 # CAM-D_CAM + 3999 12 529 3999 # CAP-D_CAP + 4000 11 530 4000 # CAM-D_CAM + 4001 10 531 4001 # CAO-D_CAO + 4002 13 532 4002 # CTT-D_CTT + 4003 9 541 4003 # CAT-D_CAT + 4004 10 542 4004 # CAO-D_CAO + 4005 11 543 4005 # CAM-D_CAM + 4006 12 544 4006 # CAP-D_CAP + 4007 11 545 4007 # CAM-D_CAM + 4008 10 546 4008 # CAO-D_CAO + 4009 13 547 4009 # CTT-D_CTT + 4010 9 556 4010 # CAT-D_CAT + 4011 10 557 4011 # CAO-D_CAO + 4012 11 558 4012 # CAM-D_CAM + 4013 12 559 4013 # CAP-D_CAP + 4014 11 560 4014 # CAM-D_CAM + 4015 10 561 4015 # CAO-D_CAO + 4016 13 562 4016 # CTT-D_CTT + 4017 9 571 4017 # CAT-D_CAT + 4018 10 572 4018 # CAO-D_CAO + 4019 11 573 4019 # CAM-D_CAM + 4020 12 574 4020 # CAP-D_CAP + 4021 11 575 4021 # CAM-D_CAM + 4022 10 576 4022 # CAO-D_CAO + 4023 13 577 4023 # CTT-D_CTT + 4024 9 586 4024 # CAT-D_CAT + 4025 10 587 4025 # CAO-D_CAO + 4026 11 588 4026 # CAM-D_CAM + 4027 12 589 4027 # CAP-D_CAP + 4028 11 590 4028 # CAM-D_CAM + 4029 10 591 4029 # CAO-D_CAO + 4030 13 592 4030 # CTT-D_CTT + 4031 9 601 4031 # CAT-D_CAT + 4032 10 602 4032 # CAO-D_CAO + 4033 11 603 4033 # CAM-D_CAM + 4034 12 604 4034 # CAP-D_CAP + 4035 11 605 4035 # CAM-D_CAM + 4036 10 606 4036 # CAO-D_CAO + 4037 13 607 4037 # CTT-D_CTT + 4038 9 616 4038 # CAT-D_CAT + 4039 10 617 4039 # CAO-D_CAO + 4040 11 618 4040 # CAM-D_CAM + 4041 12 619 4041 # CAP-D_CAP + 4042 11 620 4042 # CAM-D_CAM + 4043 10 621 4043 # CAO-D_CAO + 4044 13 622 4044 # CTT-D_CTT + 4045 9 631 4045 # CAT-D_CAT + 4046 10 632 4046 # CAO-D_CAO + 4047 11 633 4047 # CAM-D_CAM + 4048 12 634 4048 # CAP-D_CAP + 4049 11 635 4049 # CAM-D_CAM + 4050 10 636 4050 # CAO-D_CAO + 4051 13 637 4051 # CTT-D_CTT + 4052 9 646 4052 # CAT-D_CAT + 4053 10 647 4053 # CAO-D_CAO + 4054 11 648 4054 # CAM-D_CAM + 4055 12 649 4055 # CAP-D_CAP + 4056 11 650 4056 # CAM-D_CAM + 4057 10 651 4057 # CAO-D_CAO + 4058 13 652 4058 # CTT-D_CTT + 4059 9 661 4059 # CAT-D_CAT + 4060 10 662 4060 # CAO-D_CAO + 4061 11 663 4061 # CAM-D_CAM + 4062 12 664 4062 # CAP-D_CAP + 4063 11 665 4063 # CAM-D_CAM + 4064 10 666 4064 # CAO-D_CAO + 4065 13 667 4065 # CTT-D_CTT + 4066 9 676 4066 # CAT-D_CAT + 4067 10 677 4067 # CAO-D_CAO + 4068 11 678 4068 # CAM-D_CAM + 4069 12 679 4069 # CAP-D_CAP + 4070 11 680 4070 # CAM-D_CAM + 4071 10 681 4071 # CAO-D_CAO + 4072 13 682 4072 # CTT-D_CTT + 4073 9 691 4073 # CAT-D_CAT + 4074 10 692 4074 # CAO-D_CAO + 4075 11 693 4075 # CAM-D_CAM + 4076 12 694 4076 # CAP-D_CAP + 4077 11 695 4077 # CAM-D_CAM + 4078 10 696 4078 # CAO-D_CAO + 4079 13 697 4079 # CTT-D_CTT + 4080 9 706 4080 # CAT-D_CAT + 4081 10 707 4081 # CAO-D_CAO + 4082 11 708 4082 # CAM-D_CAM + 4083 12 709 4083 # CAP-D_CAP + 4084 11 710 4084 # CAM-D_CAM + 4085 10 711 4085 # CAO-D_CAO + 4086 13 712 4086 # CTT-D_CTT + 4087 9 721 4087 # CAT-D_CAT + 4088 10 722 4088 # CAO-D_CAO + 4089 11 723 4089 # CAM-D_CAM + 4090 12 724 4090 # CAP-D_CAP + 4091 11 725 4091 # CAM-D_CAM + 4092 10 726 4092 # CAO-D_CAO + 4093 13 727 4093 # CTT-D_CTT + 4094 9 736 4094 # CAT-D_CAT + 4095 10 737 4095 # CAO-D_CAO + 4096 11 738 4096 # CAM-D_CAM + 4097 12 739 4097 # CAP-D_CAP + 4098 11 740 4098 # CAM-D_CAM + 4099 10 741 4099 # CAO-D_CAO + 4100 13 742 4100 # CTT-D_CTT + 4101 9 751 4101 # CAT-D_CAT + 4102 10 752 4102 # CAO-D_CAO + 4103 11 753 4103 # CAM-D_CAM + 4104 12 754 4104 # CAP-D_CAP + 4105 11 755 4105 # CAM-D_CAM + 4106 10 756 4106 # CAO-D_CAO + 4107 13 757 4107 # CTT-D_CTT + 4108 9 766 4108 # CAT-D_CAT + 4109 10 767 4109 # CAO-D_CAO + 4110 11 768 4110 # CAM-D_CAM + 4111 12 769 4111 # CAP-D_CAP + 4112 11 770 4112 # CAM-D_CAM + 4113 10 771 4113 # CAO-D_CAO + 4114 13 772 4114 # CTT-D_CTT + 4115 9 781 4115 # CAT-D_CAT + 4116 10 782 4116 # CAO-D_CAO + 4117 11 783 4117 # CAM-D_CAM + 4118 12 784 4118 # CAP-D_CAP + 4119 11 785 4119 # CAM-D_CAM + 4120 10 786 4120 # CAO-D_CAO + 4121 13 787 4121 # CTT-D_CTT + 4122 9 796 4122 # CAT-D_CAT + 4123 10 797 4123 # CAO-D_CAO + 4124 11 798 4124 # CAM-D_CAM + 4125 12 799 4125 # CAP-D_CAP + 4126 11 800 4126 # CAM-D_CAM + 4127 10 801 4127 # CAO-D_CAO + 4128 13 802 4128 # CTT-D_CTT + 4129 9 811 4129 # CAT-D_CAT + 4130 10 812 4130 # CAO-D_CAO + 4131 11 813 4131 # CAM-D_CAM + 4132 12 814 4132 # CAP-D_CAP + 4133 11 815 4133 # CAM-D_CAM + 4134 10 816 4134 # CAO-D_CAO + 4135 13 817 4135 # CTT-D_CTT + 4136 9 826 4136 # CAT-D_CAT + 4137 10 827 4137 # CAO-D_CAO + 4138 11 828 4138 # CAM-D_CAM + 4139 12 829 4139 # CAP-D_CAP + 4140 11 830 4140 # CAM-D_CAM + 4141 10 831 4141 # CAO-D_CAO + 4142 13 832 4142 # CTT-D_CTT + 4143 9 841 4143 # CAT-D_CAT + 4144 10 842 4144 # CAO-D_CAO + 4145 11 843 4145 # CAM-D_CAM + 4146 12 844 4146 # CAP-D_CAP + 4147 11 845 4147 # CAM-D_CAM + 4148 10 846 4148 # CAO-D_CAO + 4149 13 847 4149 # CTT-D_CTT + 4150 9 856 4150 # CAT-D_CAT + 4151 10 857 4151 # CAO-D_CAO + 4152 11 858 4152 # CAM-D_CAM + 4153 12 859 4153 # CAP-D_CAP + 4154 11 860 4154 # CAM-D_CAM + 4155 10 861 4155 # CAO-D_CAO + 4156 13 862 4156 # CTT-D_CTT + 4157 9 871 4157 # CAT-D_CAT + 4158 10 872 4158 # CAO-D_CAO + 4159 11 873 4159 # CAM-D_CAM + 4160 12 874 4160 # CAP-D_CAP + 4161 11 875 4161 # CAM-D_CAM + 4162 10 876 4162 # CAO-D_CAO + 4163 13 877 4163 # CTT-D_CTT + 4164 9 886 4164 # CAT-D_CAT + 4165 10 887 4165 # CAO-D_CAO + 4166 11 888 4166 # CAM-D_CAM + 4167 12 889 4167 # CAP-D_CAP + 4168 11 890 4168 # CAM-D_CAM + 4169 10 891 4169 # CAO-D_CAO + 4170 13 892 4170 # CTT-D_CTT + 4171 9 901 4171 # CAT-D_CAT + 4172 10 902 4172 # CAO-D_CAO + 4173 11 903 4173 # CAM-D_CAM + 4174 12 904 4174 # CAP-D_CAP + 4175 11 905 4175 # CAM-D_CAM + 4176 10 906 4176 # CAO-D_CAO + 4177 13 907 4177 # CTT-D_CTT + 4178 9 916 4178 # CAT-D_CAT + 4179 10 917 4179 # CAO-D_CAO + 4180 11 918 4180 # CAM-D_CAM + 4181 12 919 4181 # CAP-D_CAP + 4182 11 920 4182 # CAM-D_CAM + 4183 10 921 4183 # CAO-D_CAO + 4184 13 922 4184 # CTT-D_CTT + 4185 9 931 4185 # CAT-D_CAT + 4186 10 932 4186 # CAO-D_CAO + 4187 11 933 4187 # CAM-D_CAM + 4188 12 934 4188 # CAP-D_CAP + 4189 11 935 4189 # CAM-D_CAM + 4190 10 936 4190 # CAO-D_CAO + 4191 13 937 4191 # CTT-D_CTT + 4192 9 946 4192 # CAT-D_CAT + 4193 10 947 4193 # CAO-D_CAO + 4194 11 948 4194 # CAM-D_CAM + 4195 12 949 4195 # CAP-D_CAP + 4196 11 950 4196 # CAM-D_CAM + 4197 10 951 4197 # CAO-D_CAO + 4198 13 952 4198 # CTT-D_CTT + 4199 9 961 4199 # CAT-D_CAT + 4200 10 962 4200 # CAO-D_CAO + 4201 11 963 4201 # CAM-D_CAM + 4202 12 964 4202 # CAP-D_CAP + 4203 11 965 4203 # CAM-D_CAM + 4204 10 966 4204 # CAO-D_CAO + 4205 13 967 4205 # CTT-D_CTT + 4206 9 976 4206 # CAT-D_CAT + 4207 10 977 4207 # CAO-D_CAO + 4208 11 978 4208 # CAM-D_CAM + 4209 12 979 4209 # CAP-D_CAP + 4210 11 980 4210 # CAM-D_CAM + 4211 10 981 4211 # CAO-D_CAO + 4212 13 982 4212 # CTT-D_CTT + 4213 9 991 4213 # CAT-D_CAT + 4214 10 992 4214 # CAO-D_CAO + 4215 11 993 4215 # CAM-D_CAM + 4216 12 994 4216 # CAP-D_CAP + 4217 11 995 4217 # CAM-D_CAM + 4218 10 996 4218 # CAO-D_CAO + 4219 13 997 4219 # CTT-D_CTT + 4220 9 1006 4220 # CAT-D_CAT + 4221 10 1007 4221 # CAO-D_CAO + 4222 11 1008 4222 # CAM-D_CAM + 4223 12 1009 4223 # CAP-D_CAP + 4224 11 1010 4224 # CAM-D_CAM + 4225 10 1011 4225 # CAO-D_CAO + 4226 13 1012 4226 # CTT-D_CTT + 4227 9 1021 4227 # CAT-D_CAT + 4228 10 1022 4228 # CAO-D_CAO + 4229 11 1023 4229 # CAM-D_CAM + 4230 12 1024 4230 # CAP-D_CAP + 4231 11 1025 4231 # CAM-D_CAM + 4232 10 1026 4232 # CAO-D_CAO + 4233 13 1027 4233 # CTT-D_CTT + 4234 9 1036 4234 # CAT-D_CAT + 4235 10 1037 4235 # CAO-D_CAO + 4236 11 1038 4236 # CAM-D_CAM + 4237 12 1039 4237 # CAP-D_CAP + 4238 11 1040 4238 # CAM-D_CAM + 4239 10 1041 4239 # CAO-D_CAO + 4240 13 1042 4240 # CTT-D_CTT + 4241 9 1051 4241 # CAT-D_CAT + 4242 10 1052 4242 # CAO-D_CAO + 4243 11 1053 4243 # CAM-D_CAM + 4244 12 1054 4244 # CAP-D_CAP + 4245 11 1055 4245 # CAM-D_CAM + 4246 10 1056 4246 # CAO-D_CAO + 4247 13 1057 4247 # CTT-D_CTT + 4248 9 1066 4248 # CAT-D_CAT + 4249 10 1067 4249 # CAO-D_CAO + 4250 11 1068 4250 # CAM-D_CAM + 4251 12 1069 4251 # CAP-D_CAP + 4252 11 1070 4252 # CAM-D_CAM + 4253 10 1071 4253 # CAO-D_CAO + 4254 13 1072 4254 # CTT-D_CTT + 4255 9 1081 4255 # CAT-D_CAT + 4256 10 1082 4256 # CAO-D_CAO + 4257 11 1083 4257 # CAM-D_CAM + 4258 12 1084 4258 # CAP-D_CAP + 4259 11 1085 4259 # CAM-D_CAM + 4260 10 1086 4260 # CAO-D_CAO + 4261 13 1087 4261 # CTT-D_CTT + 4262 9 1096 4262 # CAT-D_CAT + 4263 10 1097 4263 # CAO-D_CAO + 4264 11 1098 4264 # CAM-D_CAM + 4265 12 1099 4265 # CAP-D_CAP + 4266 11 1100 4266 # CAM-D_CAM + 4267 10 1101 4267 # CAO-D_CAO + 4268 13 1102 4268 # CTT-D_CTT + 4269 9 1111 4269 # CAT-D_CAT + 4270 10 1112 4270 # CAO-D_CAO + 4271 11 1113 4271 # CAM-D_CAM + 4272 12 1114 4272 # CAP-D_CAP + 4273 11 1115 4273 # CAM-D_CAM + 4274 10 1116 4274 # CAO-D_CAO + 4275 13 1117 4275 # CTT-D_CTT + 4276 9 1126 4276 # CAT-D_CAT + 4277 10 1127 4277 # CAO-D_CAO + 4278 11 1128 4278 # CAM-D_CAM + 4279 12 1129 4279 # CAP-D_CAP + 4280 11 1130 4280 # CAM-D_CAM + 4281 10 1131 4281 # CAO-D_CAO + 4282 13 1132 4282 # CTT-D_CTT + 4283 9 1141 4283 # CAT-D_CAT + 4284 10 1142 4284 # CAO-D_CAO + 4285 11 1143 4285 # CAM-D_CAM + 4286 12 1144 4286 # CAP-D_CAP + 4287 11 1145 4287 # CAM-D_CAM + 4288 10 1146 4288 # CAO-D_CAO + 4289 13 1147 4289 # CTT-D_CTT + 4290 9 1156 4290 # CAT-D_CAT + 4291 10 1157 4291 # CAO-D_CAO + 4292 11 1158 4292 # CAM-D_CAM + 4293 12 1159 4293 # CAP-D_CAP + 4294 11 1160 4294 # CAM-D_CAM + 4295 10 1161 4295 # CAO-D_CAO + 4296 13 1162 4296 # CTT-D_CTT + 4297 9 1171 4297 # CAT-D_CAT + 4298 10 1172 4298 # CAO-D_CAO + 4299 11 1173 4299 # CAM-D_CAM + 4300 12 1174 4300 # CAP-D_CAP + 4301 11 1175 4301 # CAM-D_CAM + 4302 10 1176 4302 # CAO-D_CAO + 4303 13 1177 4303 # CTT-D_CTT + 4304 9 1186 4304 # CAT-D_CAT + 4305 10 1187 4305 # CAO-D_CAO + 4306 11 1188 4306 # CAM-D_CAM + 4307 12 1189 4307 # CAP-D_CAP + 4308 11 1190 4308 # CAM-D_CAM + 4309 10 1191 4309 # CAO-D_CAO + 4310 13 1192 4310 # CTT-D_CTT + 4311 9 1201 4311 # CAT-D_CAT + 4312 10 1202 4312 # CAO-D_CAO + 4313 11 1203 4313 # CAM-D_CAM + 4314 12 1204 4314 # CAP-D_CAP + 4315 11 1205 4315 # CAM-D_CAM + 4316 10 1206 4316 # CAO-D_CAO + 4317 13 1207 4317 # CTT-D_CTT + 4318 9 1216 4318 # CAT-D_CAT + 4319 10 1217 4319 # CAO-D_CAO + 4320 11 1218 4320 # CAM-D_CAM + 4321 12 1219 4321 # CAP-D_CAP + 4322 11 1220 4322 # CAM-D_CAM + 4323 10 1221 4323 # CAO-D_CAO + 4324 13 1222 4324 # CTT-D_CTT + 4325 9 1231 4325 # CAT-D_CAT + 4326 10 1232 4326 # CAO-D_CAO + 4327 11 1233 4327 # CAM-D_CAM + 4328 12 1234 4328 # CAP-D_CAP + 4329 11 1235 4329 # CAM-D_CAM + 4330 10 1236 4330 # CAO-D_CAO + 4331 13 1237 4331 # CTT-D_CTT + 4332 9 1246 4332 # CAT-D_CAT + 4333 10 1247 4333 # CAO-D_CAO + 4334 11 1248 4334 # CAM-D_CAM + 4335 12 1249 4335 # CAP-D_CAP + 4336 11 1250 4336 # CAM-D_CAM + 4337 10 1251 4337 # CAO-D_CAO + 4338 13 1252 4338 # CTT-D_CTT + 4339 9 1261 4339 # CAT-D_CAT + 4340 10 1262 4340 # CAO-D_CAO + 4341 11 1263 4341 # CAM-D_CAM + 4342 12 1264 4342 # CAP-D_CAP + 4343 11 1265 4343 # CAM-D_CAM + 4344 10 1266 4344 # CAO-D_CAO + 4345 13 1267 4345 # CTT-D_CTT + 4346 9 1276 4346 # CAT-D_CAT + 4347 10 1277 4347 # CAO-D_CAO + 4348 11 1278 4348 # CAM-D_CAM + 4349 12 1279 4349 # CAP-D_CAP + 4350 11 1280 4350 # CAM-D_CAM + 4351 10 1281 4351 # CAO-D_CAO + 4352 13 1282 4352 # CTT-D_CTT + 4353 9 1291 4353 # CAT-D_CAT + 4354 10 1292 4354 # CAO-D_CAO + 4355 11 1293 4355 # CAM-D_CAM + 4356 12 1294 4356 # CAP-D_CAP + 4357 11 1295 4357 # CAM-D_CAM + 4358 10 1296 4358 # CAO-D_CAO + 4359 13 1297 4359 # CTT-D_CTT + 4360 9 1306 4360 # CAT-D_CAT + 4361 10 1307 4361 # CAO-D_CAO + 4362 11 1308 4362 # CAM-D_CAM + 4363 12 1309 4363 # CAP-D_CAP + 4364 11 1310 4364 # CAM-D_CAM + 4365 10 1311 4365 # CAO-D_CAO + 4366 13 1312 4366 # CTT-D_CTT + 4367 9 1321 4367 # CAT-D_CAT + 4368 10 1322 4368 # CAO-D_CAO + 4369 11 1323 4369 # CAM-D_CAM + 4370 12 1324 4370 # CAP-D_CAP + 4371 11 1325 4371 # CAM-D_CAM + 4372 10 1326 4372 # CAO-D_CAO + 4373 13 1327 4373 # CTT-D_CTT + 4374 9 1336 4374 # CAT-D_CAT + 4375 10 1337 4375 # CAO-D_CAO + 4376 11 1338 4376 # CAM-D_CAM + 4377 12 1339 4377 # CAP-D_CAP + 4378 11 1340 4378 # CAM-D_CAM + 4379 10 1341 4379 # CAO-D_CAO + 4380 13 1342 4380 # CTT-D_CTT + 4381 9 1351 4381 # CAT-D_CAT + 4382 10 1352 4382 # CAO-D_CAO + 4383 11 1353 4383 # CAM-D_CAM + 4384 12 1354 4384 # CAP-D_CAP + 4385 11 1355 4385 # CAM-D_CAM + 4386 10 1356 4386 # CAO-D_CAO + 4387 13 1357 4387 # CTT-D_CTT + 4388 9 1366 4388 # CAT-D_CAT + 4389 10 1367 4389 # CAO-D_CAO + 4390 11 1368 4390 # CAM-D_CAM + 4391 12 1369 4391 # CAP-D_CAP + 4392 11 1370 4392 # CAM-D_CAM + 4393 10 1371 4393 # CAO-D_CAO + 4394 13 1372 4394 # CTT-D_CTT + 4395 9 1381 4395 # CAT-D_CAT + 4396 10 1382 4396 # CAO-D_CAO + 4397 11 1383 4397 # CAM-D_CAM + 4398 12 1384 4398 # CAP-D_CAP + 4399 11 1385 4399 # CAM-D_CAM + 4400 10 1386 4400 # CAO-D_CAO + 4401 13 1387 4401 # CTT-D_CTT + 4402 9 1396 4402 # CAT-D_CAT + 4403 10 1397 4403 # CAO-D_CAO + 4404 11 1398 4404 # CAM-D_CAM + 4405 12 1399 4405 # CAP-D_CAP + 4406 11 1400 4406 # CAM-D_CAM + 4407 10 1401 4407 # CAO-D_CAO + 4408 13 1402 4408 # CTT-D_CTT + 4409 9 1411 4409 # CAT-D_CAT + 4410 10 1412 4410 # CAO-D_CAO + 4411 11 1413 4411 # CAM-D_CAM + 4412 12 1414 4412 # CAP-D_CAP + 4413 11 1415 4413 # CAM-D_CAM + 4414 10 1416 4414 # CAO-D_CAO + 4415 13 1417 4415 # CTT-D_CTT + 4416 9 1426 4416 # CAT-D_CAT + 4417 10 1427 4417 # CAO-D_CAO + 4418 11 1428 4418 # CAM-D_CAM + 4419 12 1429 4419 # CAP-D_CAP + 4420 11 1430 4420 # CAM-D_CAM + 4421 10 1431 4421 # CAO-D_CAO + 4422 13 1432 4422 # CTT-D_CTT + 4423 9 1441 4423 # CAT-D_CAT + 4424 10 1442 4424 # CAO-D_CAO + 4425 11 1443 4425 # CAM-D_CAM + 4426 12 1444 4426 # CAP-D_CAP + 4427 11 1445 4427 # CAM-D_CAM + 4428 10 1446 4428 # CAO-D_CAO + 4429 13 1447 4429 # CTT-D_CTT + 4430 9 1456 4430 # CAT-D_CAT + 4431 10 1457 4431 # CAO-D_CAO + 4432 11 1458 4432 # CAM-D_CAM + 4433 12 1459 4433 # CAP-D_CAP + 4434 11 1460 4434 # CAM-D_CAM + 4435 10 1461 4435 # CAO-D_CAO + 4436 13 1462 4436 # CTT-D_CTT + 4437 9 1471 4437 # CAT-D_CAT + 4438 10 1472 4438 # CAO-D_CAO + 4439 11 1473 4439 # CAM-D_CAM + 4440 12 1474 4440 # CAP-D_CAP + 4441 11 1475 4441 # CAM-D_CAM + 4442 10 1476 4442 # CAO-D_CAO + 4443 13 1477 4443 # CTT-D_CTT + 4444 9 1486 4444 # CAT-D_CAT + 4445 10 1487 4445 # CAO-D_CAO + 4446 11 1488 4446 # CAM-D_CAM + 4447 12 1489 4447 # CAP-D_CAP + 4448 11 1490 4448 # CAM-D_CAM + 4449 10 1491 4449 # CAO-D_CAO + 4450 13 1492 4450 # CTT-D_CTT + 4451 9 1501 4451 # CAT-D_CAT + 4452 10 1502 4452 # CAO-D_CAO + 4453 11 1503 4453 # CAM-D_CAM + 4454 12 1504 4454 # CAP-D_CAP + 4455 11 1505 4455 # CAM-D_CAM + 4456 10 1506 4456 # CAO-D_CAO + 4457 13 1507 4457 # CTT-D_CTT + 4458 9 1516 4458 # CAT-D_CAT + 4459 10 1517 4459 # CAO-D_CAO + 4460 11 1518 4460 # CAM-D_CAM + 4461 12 1519 4461 # CAP-D_CAP + 4462 11 1520 4462 # CAM-D_CAM + 4463 10 1521 4463 # CAO-D_CAO + 4464 13 1522 4464 # CTT-D_CTT + 4465 9 1531 4465 # CAT-D_CAT + 4466 10 1532 4466 # CAO-D_CAO + 4467 11 1533 4467 # CAM-D_CAM + 4468 12 1534 4468 # CAP-D_CAP + 4469 11 1535 4469 # CAM-D_CAM + 4470 10 1536 4470 # CAO-D_CAO + 4471 13 1537 4471 # CTT-D_CTT + 4472 9 1546 4472 # CAT-D_CAT + 4473 10 1547 4473 # CAO-D_CAO + 4474 11 1548 4474 # CAM-D_CAM + 4475 12 1549 4475 # CAP-D_CAP + 4476 11 1550 4476 # CAM-D_CAM + 4477 10 1551 4477 # CAO-D_CAO + 4478 13 1552 4478 # CTT-D_CTT + 4479 9 1561 4479 # CAT-D_CAT + 4480 10 1562 4480 # CAO-D_CAO + 4481 11 1563 4481 # CAM-D_CAM + 4482 12 1564 4482 # CAP-D_CAP + 4483 11 1565 4483 # CAM-D_CAM + 4484 10 1566 4484 # CAO-D_CAO + 4485 13 1567 4485 # CTT-D_CTT + 4486 9 1576 4486 # CAT-D_CAT + 4487 10 1577 4487 # CAO-D_CAO + 4488 11 1578 4488 # CAM-D_CAM + 4489 12 1579 4489 # CAP-D_CAP + 4490 11 1580 4490 # CAM-D_CAM + 4491 10 1581 4491 # CAO-D_CAO + 4492 13 1582 4492 # CTT-D_CTT + 4493 9 1591 4493 # CAT-D_CAT + 4494 10 1592 4494 # CAO-D_CAO + 4495 11 1593 4495 # CAM-D_CAM + 4496 12 1594 4496 # CAP-D_CAP + 4497 11 1595 4497 # CAM-D_CAM + 4498 10 1596 4498 # CAO-D_CAO + 4499 13 1597 4499 # CTT-D_CTT + 4500 9 1606 4500 # CAT-D_CAT + 4501 10 1607 4501 # CAO-D_CAO + 4502 11 1608 4502 # CAM-D_CAM + 4503 12 1609 4503 # CAP-D_CAP + 4504 11 1610 4504 # CAM-D_CAM + 4505 10 1611 4505 # CAO-D_CAO + 4506 13 1612 4506 # CTT-D_CTT + 4507 9 1621 4507 # CAT-D_CAT + 4508 10 1622 4508 # CAO-D_CAO + 4509 11 1623 4509 # CAM-D_CAM + 4510 12 1624 4510 # CAP-D_CAP + 4511 11 1625 4511 # CAM-D_CAM + 4512 10 1626 4512 # CAO-D_CAO + 4513 13 1627 4513 # CTT-D_CTT + 4514 9 1636 4514 # CAT-D_CAT + 4515 10 1637 4515 # CAO-D_CAO + 4516 11 1638 4516 # CAM-D_CAM + 4517 12 1639 4517 # CAP-D_CAP + 4518 11 1640 4518 # CAM-D_CAM + 4519 10 1641 4519 # CAO-D_CAO + 4520 13 1642 4520 # CTT-D_CTT + 4521 9 1651 4521 # CAT-D_CAT + 4522 10 1652 4522 # CAO-D_CAO + 4523 11 1653 4523 # CAM-D_CAM + 4524 12 1654 4524 # CAP-D_CAP + 4525 11 1655 4525 # CAM-D_CAM + 4526 10 1656 4526 # CAO-D_CAO + 4527 13 1657 4527 # CTT-D_CTT + 4528 9 1666 4528 # CAT-D_CAT + 4529 10 1667 4529 # CAO-D_CAO + 4530 11 1668 4530 # CAM-D_CAM + 4531 12 1669 4531 # CAP-D_CAP + 4532 11 1670 4532 # CAM-D_CAM + 4533 10 1671 4533 # CAO-D_CAO + 4534 13 1672 4534 # CTT-D_CTT + 4535 9 1681 4535 # CAT-D_CAT + 4536 10 1682 4536 # CAO-D_CAO + 4537 11 1683 4537 # CAM-D_CAM + 4538 12 1684 4538 # CAP-D_CAP + 4539 11 1685 4539 # CAM-D_CAM + 4540 10 1686 4540 # CAO-D_CAO + 4541 13 1687 4541 # CTT-D_CTT + 4542 9 1696 4542 # CAT-D_CAT + 4543 10 1697 4543 # CAO-D_CAO + 4544 11 1698 4544 # CAM-D_CAM + 4545 12 1699 4545 # CAP-D_CAP + 4546 11 1700 4546 # CAM-D_CAM + 4547 10 1701 4547 # CAO-D_CAO + 4548 13 1702 4548 # CTT-D_CTT + 4549 9 1711 4549 # CAT-D_CAT + 4550 10 1712 4550 # CAO-D_CAO + 4551 11 1713 4551 # CAM-D_CAM + 4552 12 1714 4552 # CAP-D_CAP + 4553 11 1715 4553 # CAM-D_CAM + 4554 10 1716 4554 # CAO-D_CAO + 4555 13 1717 4555 # CTT-D_CTT + 4556 9 1726 4556 # CAT-D_CAT + 4557 10 1727 4557 # CAO-D_CAO + 4558 11 1728 4558 # CAM-D_CAM + 4559 12 1729 4559 # CAP-D_CAP + 4560 11 1730 4560 # CAM-D_CAM + 4561 10 1731 4561 # CAO-D_CAO + 4562 13 1732 4562 # CTT-D_CTT + 4563 9 1741 4563 # CAT-D_CAT + 4564 10 1742 4564 # CAO-D_CAO + 4565 11 1743 4565 # CAM-D_CAM + 4566 12 1744 4566 # CAP-D_CAP + 4567 11 1745 4567 # CAM-D_CAM + 4568 10 1746 4568 # CAO-D_CAO + 4569 13 1747 4569 # CTT-D_CTT + 4570 9 1756 4570 # CAT-D_CAT + 4571 10 1757 4571 # CAO-D_CAO + 4572 11 1758 4572 # CAM-D_CAM + 4573 12 1759 4573 # CAP-D_CAP + 4574 11 1760 4574 # CAM-D_CAM + 4575 10 1761 4575 # CAO-D_CAO + 4576 13 1762 4576 # CTT-D_CTT + 4577 9 1771 4577 # CAT-D_CAT + 4578 10 1772 4578 # CAO-D_CAO + 4579 11 1773 4579 # CAM-D_CAM + 4580 12 1774 4580 # CAP-D_CAP + 4581 11 1775 4581 # CAM-D_CAM + 4582 10 1776 4582 # CAO-D_CAO + 4583 13 1777 4583 # CTT-D_CTT + 4584 9 1786 4584 # CAT-D_CAT + 4585 10 1787 4585 # CAO-D_CAO + 4586 11 1788 4586 # CAM-D_CAM + 4587 12 1789 4587 # CAP-D_CAP + 4588 11 1790 4588 # CAM-D_CAM + 4589 10 1791 4589 # CAO-D_CAO + 4590 13 1792 4590 # CTT-D_CTT + 4591 9 1801 4591 # CAT-D_CAT + 4592 10 1802 4592 # CAO-D_CAO + 4593 11 1803 4593 # CAM-D_CAM + 4594 12 1804 4594 # CAP-D_CAP + 4595 11 1805 4595 # CAM-D_CAM + 4596 10 1806 4596 # CAO-D_CAO + 4597 13 1807 4597 # CTT-D_CTT + 4598 9 1816 4598 # CAT-D_CAT + 4599 10 1817 4599 # CAO-D_CAO + 4600 11 1818 4600 # CAM-D_CAM + 4601 12 1819 4601 # CAP-D_CAP + 4602 11 1820 4602 # CAM-D_CAM + 4603 10 1821 4603 # CAO-D_CAO + 4604 13 1822 4604 # CTT-D_CTT + 4605 9 1831 4605 # CAT-D_CAT + 4606 10 1832 4606 # CAO-D_CAO + 4607 11 1833 4607 # CAM-D_CAM + 4608 12 1834 4608 # CAP-D_CAP + 4609 11 1835 4609 # CAM-D_CAM + 4610 10 1836 4610 # CAO-D_CAO + 4611 13 1837 4611 # CTT-D_CTT + 4612 9 1846 4612 # CAT-D_CAT + 4613 10 1847 4613 # CAO-D_CAO + 4614 11 1848 4614 # CAM-D_CAM + 4615 12 1849 4615 # CAP-D_CAP + 4616 11 1850 4616 # CAM-D_CAM + 4617 10 1851 4617 # CAO-D_CAO + 4618 13 1852 4618 # CTT-D_CTT + 4619 9 1861 4619 # CAT-D_CAT + 4620 10 1862 4620 # CAO-D_CAO + 4621 11 1863 4621 # CAM-D_CAM + 4622 12 1864 4622 # CAP-D_CAP + 4623 11 1865 4623 # CAM-D_CAM + 4624 10 1866 4624 # CAO-D_CAO + 4625 13 1867 4625 # CTT-D_CTT + 4626 9 1876 4626 # CAT-D_CAT + 4627 10 1877 4627 # CAO-D_CAO + 4628 11 1878 4628 # CAM-D_CAM + 4629 12 1879 4629 # CAP-D_CAP + 4630 11 1880 4630 # CAM-D_CAM + 4631 10 1881 4631 # CAO-D_CAO + 4632 13 1882 4632 # CTT-D_CTT + 4633 9 1891 4633 # CAT-D_CAT + 4634 10 1892 4634 # CAO-D_CAO + 4635 11 1893 4635 # CAM-D_CAM + 4636 12 1894 4636 # CAP-D_CAP + 4637 11 1895 4637 # CAM-D_CAM + 4638 10 1896 4638 # CAO-D_CAO + 4639 13 1897 4639 # CTT-D_CTT + 4640 9 1906 4640 # CAT-D_CAT + 4641 10 1907 4641 # CAO-D_CAO + 4642 11 1908 4642 # CAM-D_CAM + 4643 12 1909 4643 # CAP-D_CAP + 4644 11 1910 4644 # CAM-D_CAM + 4645 10 1911 4645 # CAO-D_CAO + 4646 13 1912 4646 # CTT-D_CTT + 4647 9 1921 4647 # CAT-D_CAT + 4648 10 1922 4648 # CAO-D_CAO + 4649 11 1923 4649 # CAM-D_CAM + 4650 12 1924 4650 # CAP-D_CAP + 4651 11 1925 4651 # CAM-D_CAM + 4652 10 1926 4652 # CAO-D_CAO + 4653 13 1927 4653 # CTT-D_CTT + 4654 9 1936 4654 # CAT-D_CAT + 4655 10 1937 4655 # CAO-D_CAO + 4656 11 1938 4656 # CAM-D_CAM + 4657 12 1939 4657 # CAP-D_CAP + 4658 11 1940 4658 # CAM-D_CAM + 4659 10 1941 4659 # CAO-D_CAO + 4660 13 1942 4660 # CTT-D_CTT + 4661 9 1951 4661 # CAT-D_CAT + 4662 10 1952 4662 # CAO-D_CAO + 4663 11 1953 4663 # CAM-D_CAM + 4664 12 1954 4664 # CAP-D_CAP + 4665 11 1955 4665 # CAM-D_CAM + 4666 10 1956 4666 # CAO-D_CAO + 4667 13 1957 4667 # CTT-D_CTT + 4668 9 1966 4668 # CAT-D_CAT + 4669 10 1967 4669 # CAO-D_CAO + 4670 11 1968 4670 # CAM-D_CAM + 4671 12 1969 4671 # CAP-D_CAP + 4672 11 1970 4672 # CAM-D_CAM + 4673 10 1971 4673 # CAO-D_CAO + 4674 13 1972 4674 # CTT-D_CTT + 4675 9 1981 4675 # CAT-D_CAT + 4676 10 1982 4676 # CAO-D_CAO + 4677 11 1983 4677 # CAM-D_CAM + 4678 12 1984 4678 # CAP-D_CAP + 4679 11 1985 4679 # CAM-D_CAM + 4680 10 1986 4680 # CAO-D_CAO + 4681 13 1987 4681 # CTT-D_CTT + 4682 9 1996 4682 # CAT-D_CAT + 4683 10 1997 4683 # CAO-D_CAO + 4684 11 1998 4684 # CAM-D_CAM + 4685 12 1999 4685 # CAP-D_CAP + 4686 11 2000 4686 # CAM-D_CAM + 4687 10 2001 4687 # CAO-D_CAO + 4688 13 2002 4688 # CTT-D_CTT + 4689 9 2011 4689 # CAT-D_CAT + 4690 10 2012 4690 # CAO-D_CAO + 4691 11 2013 4691 # CAM-D_CAM + 4692 12 2014 4692 # CAP-D_CAP + 4693 11 2015 4693 # CAM-D_CAM + 4694 10 2016 4694 # CAO-D_CAO + 4695 13 2017 4695 # CTT-D_CTT + 4696 9 2026 4696 # CAT-D_CAT + 4697 10 2027 4697 # CAO-D_CAO + 4698 11 2028 4698 # CAM-D_CAM + 4699 12 2029 4699 # CAP-D_CAP + 4700 11 2030 4700 # CAM-D_CAM + 4701 10 2031 4701 # CAO-D_CAO + 4702 13 2032 4702 # CTT-D_CTT + 4703 9 2041 4703 # CAT-D_CAT + 4704 10 2042 4704 # CAO-D_CAO + 4705 11 2043 4705 # CAM-D_CAM + 4706 12 2044 4706 # CAP-D_CAP + 4707 11 2045 4707 # CAM-D_CAM + 4708 10 2046 4708 # CAO-D_CAO + 4709 13 2047 4709 # CTT-D_CTT + 4710 9 2056 4710 # CAT-D_CAT + 4711 10 2057 4711 # CAO-D_CAO + 4712 11 2058 4712 # CAM-D_CAM + 4713 12 2059 4713 # CAP-D_CAP + 4714 11 2060 4714 # CAM-D_CAM + 4715 10 2061 4715 # CAO-D_CAO + 4716 13 2062 4716 # CTT-D_CTT + 4717 9 2071 4717 # CAT-D_CAT + 4718 10 2072 4718 # CAO-D_CAO + 4719 11 2073 4719 # CAM-D_CAM + 4720 12 2074 4720 # CAP-D_CAP + 4721 11 2075 4721 # CAM-D_CAM + 4722 10 2076 4722 # CAO-D_CAO + 4723 13 2077 4723 # CTT-D_CTT + 4724 9 2086 4724 # CAT-D_CAT + 4725 10 2087 4725 # CAO-D_CAO + 4726 11 2088 4726 # CAM-D_CAM + 4727 12 2089 4727 # CAP-D_CAP + 4728 11 2090 4728 # CAM-D_CAM + 4729 10 2091 4729 # CAO-D_CAO + 4730 13 2092 4730 # CTT-D_CTT + 4731 9 2101 4731 # CAT-D_CAT + 4732 10 2102 4732 # CAO-D_CAO + 4733 11 2103 4733 # CAM-D_CAM + 4734 12 2104 4734 # CAP-D_CAP + 4735 11 2105 4735 # CAM-D_CAM + 4736 10 2106 4736 # CAO-D_CAO + 4737 13 2107 4737 # CTT-D_CTT + 4738 9 2116 4738 # CAT-D_CAT + 4739 10 2117 4739 # CAO-D_CAO + 4740 11 2118 4740 # CAM-D_CAM + 4741 12 2119 4741 # CAP-D_CAP + 4742 11 2120 4742 # CAM-D_CAM + 4743 10 2121 4743 # CAO-D_CAO + 4744 13 2122 4744 # CTT-D_CTT + 4745 9 2131 4745 # CAT-D_CAT + 4746 10 2132 4746 # CAO-D_CAO + 4747 11 2133 4747 # CAM-D_CAM + 4748 12 2134 4748 # CAP-D_CAP + 4749 11 2135 4749 # CAM-D_CAM + 4750 10 2136 4750 # CAO-D_CAO + 4751 13 2137 4751 # CTT-D_CTT + 4752 9 2146 4752 # CAT-D_CAT + 4753 10 2147 4753 # CAO-D_CAO + 4754 11 2148 4754 # CAM-D_CAM + 4755 12 2149 4755 # CAP-D_CAP + 4756 11 2150 4756 # CAM-D_CAM + 4757 10 2151 4757 # CAO-D_CAO + 4758 13 2152 4758 # CTT-D_CTT + 4759 9 2161 4759 # CAT-D_CAT + 4760 10 2162 4760 # CAO-D_CAO + 4761 11 2163 4761 # CAM-D_CAM + 4762 12 2164 4762 # CAP-D_CAP + 4763 11 2165 4763 # CAM-D_CAM + 4764 10 2166 4764 # CAO-D_CAO + 4765 13 2167 4765 # CTT-D_CTT + 4766 9 2176 4766 # CAT-D_CAT + 4767 10 2177 4767 # CAO-D_CAO + 4768 11 2178 4768 # CAM-D_CAM + 4769 12 2179 4769 # CAP-D_CAP + 4770 11 2180 4770 # CAM-D_CAM + 4771 10 2181 4771 # CAO-D_CAO + 4772 13 2182 4772 # CTT-D_CTT + 4773 9 2191 4773 # CAT-D_CAT + 4774 10 2192 4774 # CAO-D_CAO + 4775 11 2193 4775 # CAM-D_CAM + 4776 12 2194 4776 # CAP-D_CAP + 4777 11 2195 4777 # CAM-D_CAM + 4778 10 2196 4778 # CAO-D_CAO + 4779 13 2197 4779 # CTT-D_CTT + 4780 9 2206 4780 # CAT-D_CAT + 4781 10 2207 4781 # CAO-D_CAO + 4782 11 2208 4782 # CAM-D_CAM + 4783 12 2209 4783 # CAP-D_CAP + 4784 11 2210 4784 # CAM-D_CAM + 4785 10 2211 4785 # CAO-D_CAO + 4786 13 2212 4786 # CTT-D_CTT + 4787 9 2221 4787 # CAT-D_CAT + 4788 10 2222 4788 # CAO-D_CAO + 4789 11 2223 4789 # CAM-D_CAM + 4790 12 2224 4790 # CAP-D_CAP + 4791 11 2225 4791 # CAM-D_CAM + 4792 10 2226 4792 # CAO-D_CAO + 4793 13 2227 4793 # CTT-D_CTT + 4794 9 2236 4794 # CAT-D_CAT + 4795 10 2237 4795 # CAO-D_CAO + 4796 11 2238 4796 # CAM-D_CAM + 4797 12 2239 4797 # CAP-D_CAP + 4798 11 2240 4798 # CAM-D_CAM + 4799 10 2241 4799 # CAO-D_CAO + 4800 13 2242 4800 # CTT-D_CTT + 4801 9 2251 4801 # CAT-D_CAT + 4802 10 2252 4802 # CAO-D_CAO + 4803 11 2253 4803 # CAM-D_CAM + 4804 12 2254 4804 # CAP-D_CAP + 4805 11 2255 4805 # CAM-D_CAM + 4806 10 2256 4806 # CAO-D_CAO + 4807 13 2257 4807 # CTT-D_CTT + 4808 9 2266 4808 # CAT-D_CAT + 4809 10 2267 4809 # CAO-D_CAO + 4810 11 2268 4810 # CAM-D_CAM + 4811 12 2269 4811 # CAP-D_CAP + 4812 11 2270 4812 # CAM-D_CAM + 4813 10 2271 4813 # CAO-D_CAO + 4814 13 2272 4814 # CTT-D_CTT + 4815 9 2281 4815 # CAT-D_CAT + 4816 10 2282 4816 # CAO-D_CAO + 4817 11 2283 4817 # CAM-D_CAM + 4818 12 2284 4818 # CAP-D_CAP + 4819 11 2285 4819 # CAM-D_CAM + 4820 10 2286 4820 # CAO-D_CAO + 4821 13 2287 4821 # CTT-D_CTT + 4822 9 2296 4822 # CAT-D_CAT + 4823 10 2297 4823 # CAO-D_CAO + 4824 11 2298 4824 # CAM-D_CAM + 4825 12 2299 4825 # CAP-D_CAP + 4826 11 2300 4826 # CAM-D_CAM + 4827 10 2301 4827 # CAO-D_CAO + 4828 13 2302 4828 # CTT-D_CTT + 4829 9 2311 4829 # CAT-D_CAT + 4830 10 2312 4830 # CAO-D_CAO + 4831 11 2313 4831 # CAM-D_CAM + 4832 12 2314 4832 # CAP-D_CAP + 4833 11 2315 4833 # CAM-D_CAM + 4834 10 2316 4834 # CAO-D_CAO + 4835 13 2317 4835 # CTT-D_CTT + 4836 9 2326 4836 # CAT-D_CAT + 4837 10 2327 4837 # CAO-D_CAO + 4838 11 2328 4838 # CAM-D_CAM + 4839 12 2329 4839 # CAP-D_CAP + 4840 11 2330 4840 # CAM-D_CAM + 4841 10 2331 4841 # CAO-D_CAO + 4842 13 2332 4842 # CTT-D_CTT + 4843 9 2341 4843 # CAT-D_CAT + 4844 10 2342 4844 # CAO-D_CAO + 4845 11 2343 4845 # CAM-D_CAM + 4846 12 2344 4846 # CAP-D_CAP + 4847 11 2345 4847 # CAM-D_CAM + 4848 10 2346 4848 # CAO-D_CAO + 4849 13 2347 4849 # CTT-D_CTT + 4850 9 2356 4850 # CAT-D_CAT + 4851 10 2357 4851 # CAO-D_CAO + 4852 11 2358 4852 # CAM-D_CAM + 4853 12 2359 4853 # CAP-D_CAP + 4854 11 2360 4854 # CAM-D_CAM + 4855 10 2361 4855 # CAO-D_CAO + 4856 13 2362 4856 # CTT-D_CTT + 4857 9 2371 4857 # CAT-D_CAT + 4858 10 2372 4858 # CAO-D_CAO + 4859 11 2373 4859 # CAM-D_CAM + 4860 12 2374 4860 # CAP-D_CAP + 4861 11 2375 4861 # CAM-D_CAM + 4862 10 2376 4862 # CAO-D_CAO + 4863 13 2377 4863 # CTT-D_CTT + 4864 9 2386 4864 # CAT-D_CAT + 4865 10 2387 4865 # CAO-D_CAO + 4866 11 2388 4866 # CAM-D_CAM + 4867 12 2389 4867 # CAP-D_CAP + 4868 11 2390 4868 # CAM-D_CAM + 4869 10 2391 4869 # CAO-D_CAO + 4870 13 2392 4870 # CTT-D_CTT + 4871 9 2401 4871 # CAT-D_CAT + 4872 10 2402 4872 # CAO-D_CAO + 4873 11 2403 4873 # CAM-D_CAM + 4874 12 2404 4874 # CAP-D_CAP + 4875 11 2405 4875 # CAM-D_CAM + 4876 10 2406 4876 # CAO-D_CAO + 4877 13 2407 4877 # CTT-D_CTT + 4878 9 2416 4878 # CAT-D_CAT + 4879 10 2417 4879 # CAO-D_CAO + 4880 11 2418 4880 # CAM-D_CAM + 4881 12 2419 4881 # CAP-D_CAP + 4882 11 2420 4882 # CAM-D_CAM + 4883 10 2421 4883 # CAO-D_CAO + 4884 13 2422 4884 # CTT-D_CTT + 4885 9 2431 4885 # CAT-D_CAT + 4886 10 2432 4886 # CAO-D_CAO + 4887 11 2433 4887 # CAM-D_CAM + 4888 12 2434 4888 # CAP-D_CAP + 4889 11 2435 4889 # CAM-D_CAM + 4890 10 2436 4890 # CAO-D_CAO + 4891 13 2437 4891 # CTT-D_CTT + 4892 9 2446 4892 # CAT-D_CAT + 4893 10 2447 4893 # CAO-D_CAO + 4894 11 2448 4894 # CAM-D_CAM + 4895 12 2449 4895 # CAP-D_CAP + 4896 11 2450 4896 # CAM-D_CAM + 4897 10 2451 4897 # CAO-D_CAO + 4898 13 2452 4898 # CTT-D_CTT + 4899 9 2461 4899 # CAT-D_CAT + 4900 10 2462 4900 # CAO-D_CAO + 4901 11 2463 4901 # CAM-D_CAM + 4902 12 2464 4902 # CAP-D_CAP + 4903 11 2465 4903 # CAM-D_CAM + 4904 10 2466 4904 # CAO-D_CAO + 4905 13 2467 4905 # CTT-D_CTT + 4906 9 2476 4906 # CAT-D_CAT + 4907 10 2477 4907 # CAO-D_CAO + 4908 11 2478 4908 # CAM-D_CAM + 4909 12 2479 4909 # CAP-D_CAP + 4910 11 2480 4910 # CAM-D_CAM + 4911 10 2481 4911 # CAO-D_CAO + 4912 13 2482 4912 # CTT-D_CTT + 4913 9 2491 4913 # CAT-D_CAT + 4914 10 2492 4914 # CAO-D_CAO + 4915 11 2493 4915 # CAM-D_CAM + 4916 12 2494 4916 # CAP-D_CAP + 4917 11 2495 4917 # CAM-D_CAM + 4918 10 2496 4918 # CAO-D_CAO + 4919 13 2497 4919 # CTT-D_CTT + 4920 9 2506 4920 # CAT-D_CAT + 4921 10 2507 4921 # CAO-D_CAO + 4922 11 2508 4922 # CAM-D_CAM + 4923 12 2509 4923 # CAP-D_CAP + 4924 11 2510 4924 # CAM-D_CAM + 4925 10 2511 4925 # CAO-D_CAO + 4926 13 2512 4926 # CTT-D_CTT + 4927 9 2521 4927 # CAT-D_CAT + 4928 10 2522 4928 # CAO-D_CAO + 4929 11 2523 4929 # CAM-D_CAM + 4930 12 2524 4930 # CAP-D_CAP + 4931 11 2525 4931 # CAM-D_CAM + 4932 10 2526 4932 # CAO-D_CAO + 4933 13 2527 4933 # CTT-D_CTT + 4934 9 2536 4934 # CAT-D_CAT + 4935 10 2537 4935 # CAO-D_CAO + 4936 11 2538 4936 # CAM-D_CAM + 4937 12 2539 4937 # CAP-D_CAP + 4938 11 2540 4938 # CAM-D_CAM + 4939 10 2541 4939 # CAO-D_CAO + 4940 13 2542 4940 # CTT-D_CTT + 4941 9 2551 4941 # CAT-D_CAT + 4942 10 2552 4942 # CAO-D_CAO + 4943 11 2553 4943 # CAM-D_CAM + 4944 12 2554 4944 # CAP-D_CAP + 4945 11 2555 4945 # CAM-D_CAM + 4946 10 2556 4946 # CAO-D_CAO + 4947 13 2557 4947 # CTT-D_CTT + 4948 9 2566 4948 # CAT-D_CAT + 4949 10 2567 4949 # CAO-D_CAO + 4950 11 2568 4950 # CAM-D_CAM + 4951 12 2569 4951 # CAP-D_CAP + 4952 11 2570 4952 # CAM-D_CAM + 4953 10 2571 4953 # CAO-D_CAO + 4954 13 2572 4954 # CTT-D_CTT + 4955 9 2581 4955 # CAT-D_CAT + 4956 10 2582 4956 # CAO-D_CAO + 4957 11 2583 4957 # CAM-D_CAM + 4958 12 2584 4958 # CAP-D_CAP + 4959 11 2585 4959 # CAM-D_CAM + 4960 10 2586 4960 # CAO-D_CAO + 4961 13 2587 4961 # CTT-D_CTT + 4962 9 2596 4962 # CAT-D_CAT + 4963 10 2597 4963 # CAO-D_CAO + 4964 11 2598 4964 # CAM-D_CAM + 4965 12 2599 4965 # CAP-D_CAP + 4966 11 2600 4966 # CAM-D_CAM + 4967 10 2601 4967 # CAO-D_CAO + 4968 13 2602 4968 # CTT-D_CTT + 4969 9 2611 4969 # CAT-D_CAT + 4970 10 2612 4970 # CAO-D_CAO + 4971 11 2613 4971 # CAM-D_CAM + 4972 12 2614 4972 # CAP-D_CAP + 4973 11 2615 4973 # CAM-D_CAM + 4974 10 2616 4974 # CAO-D_CAO + 4975 13 2617 4975 # CTT-D_CTT + 4976 9 2626 4976 # CAT-D_CAT + 4977 10 2627 4977 # CAO-D_CAO + 4978 11 2628 4978 # CAM-D_CAM + 4979 12 2629 4979 # CAP-D_CAP + 4980 11 2630 4980 # CAM-D_CAM + 4981 10 2631 4981 # CAO-D_CAO + 4982 13 2632 4982 # CTT-D_CTT + 4983 9 2641 4983 # CAT-D_CAT + 4984 10 2642 4984 # CAO-D_CAO + 4985 11 2643 4985 # CAM-D_CAM + 4986 12 2644 4986 # CAP-D_CAP + 4987 11 2645 4987 # CAM-D_CAM + 4988 10 2646 4988 # CAO-D_CAO + 4989 13 2647 4989 # CTT-D_CTT + 4990 9 2656 4990 # CAT-D_CAT + 4991 10 2657 4991 # CAO-D_CAO + 4992 11 2658 4992 # CAM-D_CAM + 4993 12 2659 4993 # CAP-D_CAP + 4994 11 2660 4994 # CAM-D_CAM + 4995 10 2661 4995 # CAO-D_CAO + 4996 13 2662 4996 # CTT-D_CTT + 4997 9 2671 4997 # CAT-D_CAT + 4998 10 2672 4998 # CAO-D_CAO + 4999 11 2673 4999 # CAM-D_CAM + 5000 12 2674 5000 # CAP-D_CAP + 5001 11 2675 5001 # CAM-D_CAM + 5002 10 2676 5002 # CAO-D_CAO + 5003 13 2677 5003 # CTT-D_CTT + 5004 9 2686 5004 # CAT-D_CAT + 5005 10 2687 5005 # CAO-D_CAO + 5006 11 2688 5006 # CAM-D_CAM + 5007 12 2689 5007 # CAP-D_CAP + 5008 11 2690 5008 # CAM-D_CAM + 5009 10 2691 5009 # CAO-D_CAO + 5010 13 2692 5010 # CTT-D_CTT + 5011 9 2701 5011 # CAT-D_CAT + 5012 10 2702 5012 # CAO-D_CAO + 5013 11 2703 5013 # CAM-D_CAM + 5014 12 2704 5014 # CAP-D_CAP + 5015 11 2705 5015 # CAM-D_CAM + 5016 10 2706 5016 # CAO-D_CAO + 5017 13 2707 5017 # CTT-D_CTT + 5018 9 2716 5018 # CAT-D_CAT + 5019 10 2717 5019 # CAO-D_CAO + 5020 11 2718 5020 # CAM-D_CAM + 5021 12 2719 5021 # CAP-D_CAP + 5022 11 2720 5022 # CAM-D_CAM + 5023 10 2721 5023 # CAO-D_CAO + 5024 13 2722 5024 # CTT-D_CTT + 5025 9 2731 5025 # CAT-D_CAT + 5026 10 2732 5026 # CAO-D_CAO + 5027 11 2733 5027 # CAM-D_CAM + 5028 12 2734 5028 # CAP-D_CAP + 5029 11 2735 5029 # CAM-D_CAM + 5030 10 2736 5030 # CAO-D_CAO + 5031 13 2737 5031 # CTT-D_CTT + 5032 9 2746 5032 # CAT-D_CAT + 5033 10 2747 5033 # CAO-D_CAO + 5034 11 2748 5034 # CAM-D_CAM + 5035 12 2749 5035 # CAP-D_CAP + 5036 11 2750 5036 # CAM-D_CAM + 5037 10 2751 5037 # CAO-D_CAO + 5038 13 2752 5038 # CTT-D_CTT + 5039 9 2761 5039 # CAT-D_CAT + 5040 10 2762 5040 # CAO-D_CAO + 5041 11 2763 5041 # CAM-D_CAM + 5042 12 2764 5042 # CAP-D_CAP + 5043 11 2765 5043 # CAM-D_CAM + 5044 10 2766 5044 # CAO-D_CAO + 5045 13 2767 5045 # CTT-D_CTT + 5046 9 2776 5046 # CAT-D_CAT + 5047 10 2777 5047 # CAO-D_CAO + 5048 11 2778 5048 # CAM-D_CAM + 5049 12 2779 5049 # CAP-D_CAP + 5050 11 2780 5050 # CAM-D_CAM + 5051 10 2781 5051 # CAO-D_CAO + 5052 13 2782 5052 # CTT-D_CTT + 5053 9 2791 5053 # CAT-D_CAT + 5054 10 2792 5054 # CAO-D_CAO + 5055 11 2793 5055 # CAM-D_CAM + 5056 12 2794 5056 # CAP-D_CAP + 5057 11 2795 5057 # CAM-D_CAM + 5058 10 2796 5058 # CAO-D_CAO + 5059 13 2797 5059 # CTT-D_CTT + 5060 9 2806 5060 # CAT-D_CAT + 5061 10 2807 5061 # CAO-D_CAO + 5062 11 2808 5062 # CAM-D_CAM + 5063 12 2809 5063 # CAP-D_CAP + 5064 11 2810 5064 # CAM-D_CAM + 5065 10 2811 5065 # CAO-D_CAO + 5066 13 2812 5066 # CTT-D_CTT + 5067 9 2821 5067 # CAT-D_CAT + 5068 10 2822 5068 # CAO-D_CAO + 5069 11 2823 5069 # CAM-D_CAM + 5070 12 2824 5070 # CAP-D_CAP + 5071 11 2825 5071 # CAM-D_CAM + 5072 10 2826 5072 # CAO-D_CAO + 5073 13 2827 5073 # CTT-D_CTT + 5074 9 2836 5074 # CAT-D_CAT + 5075 10 2837 5075 # CAO-D_CAO + 5076 11 2838 5076 # CAM-D_CAM + 5077 12 2839 5077 # CAP-D_CAP + 5078 11 2840 5078 # CAM-D_CAM + 5079 10 2841 5079 # CAO-D_CAO + 5080 13 2842 5080 # CTT-D_CTT + 5081 9 2851 5081 # CAT-D_CAT + 5082 10 2852 5082 # CAO-D_CAO + 5083 11 2853 5083 # CAM-D_CAM + 5084 12 2854 5084 # CAP-D_CAP + 5085 11 2855 5085 # CAM-D_CAM + 5086 10 2856 5086 # CAO-D_CAO + 5087 13 2857 5087 # CTT-D_CTT + 5088 9 2866 5088 # CAT-D_CAT + 5089 10 2867 5089 # CAO-D_CAO + 5090 11 2868 5090 # CAM-D_CAM + 5091 12 2869 5091 # CAP-D_CAP + 5092 11 2870 5092 # CAM-D_CAM + 5093 10 2871 5093 # CAO-D_CAO + 5094 13 2872 5094 # CTT-D_CTT + 5095 9 2881 5095 # CAT-D_CAT + 5096 10 2882 5096 # CAO-D_CAO + 5097 11 2883 5097 # CAM-D_CAM + 5098 12 2884 5098 # CAP-D_CAP + 5099 11 2885 5099 # CAM-D_CAM + 5100 10 2886 5100 # CAO-D_CAO + 5101 13 2887 5101 # CTT-D_CTT + 5102 9 2896 5102 # CAT-D_CAT + 5103 10 2897 5103 # CAO-D_CAO + 5104 11 2898 5104 # CAM-D_CAM + 5105 12 2899 5105 # CAP-D_CAP + 5106 11 2900 5106 # CAM-D_CAM + 5107 10 2901 5107 # CAO-D_CAO + 5108 13 2902 5108 # CTT-D_CTT + 5109 9 2911 5109 # CAT-D_CAT + 5110 10 2912 5110 # CAO-D_CAO + 5111 11 2913 5111 # CAM-D_CAM + 5112 12 2914 5112 # CAP-D_CAP + 5113 11 2915 5113 # CAM-D_CAM + 5114 10 2916 5114 # CAO-D_CAO + 5115 13 2917 5115 # CTT-D_CTT + 5116 9 2926 5116 # CAT-D_CAT + 5117 10 2927 5117 # CAO-D_CAO + 5118 11 2928 5118 # CAM-D_CAM + 5119 12 2929 5119 # CAP-D_CAP + 5120 11 2930 5120 # CAM-D_CAM + 5121 10 2931 5121 # CAO-D_CAO + 5122 13 2932 5122 # CTT-D_CTT + 5123 9 2941 5123 # CAT-D_CAT + 5124 10 2942 5124 # CAO-D_CAO + 5125 11 2943 5125 # CAM-D_CAM + 5126 12 2944 5126 # CAP-D_CAP + 5127 11 2945 5127 # CAM-D_CAM + 5128 10 2946 5128 # CAO-D_CAO + 5129 13 2947 5129 # CTT-D_CTT + 5130 9 2956 5130 # CAT-D_CAT + 5131 10 2957 5131 # CAO-D_CAO + 5132 11 2958 5132 # CAM-D_CAM + 5133 12 2959 5133 # CAP-D_CAP + 5134 11 2960 5134 # CAM-D_CAM + 5135 10 2961 5135 # CAO-D_CAO + 5136 13 2962 5136 # CTT-D_CTT + 5137 9 2971 5137 # CAT-D_CAT + 5138 10 2972 5138 # CAO-D_CAO + 5139 11 2973 5139 # CAM-D_CAM + 5140 12 2974 5140 # CAP-D_CAP + 5141 11 2975 5141 # CAM-D_CAM + 5142 10 2976 5142 # CAO-D_CAO + 5143 13 2977 5143 # CTT-D_CTT + 5144 9 2986 5144 # CAT-D_CAT + 5145 10 2987 5145 # CAO-D_CAO + 5146 11 2988 5146 # CAM-D_CAM + 5147 12 2989 5147 # CAP-D_CAP + 5148 11 2990 5148 # CAM-D_CAM + 5149 10 2991 5149 # CAO-D_CAO + 5150 13 2992 5150 # CTT-D_CTT + 5151 9 3001 5151 # CAT-D_CAT + 5152 10 3002 5152 # CAO-D_CAO + 5153 11 3003 5153 # CAM-D_CAM + 5154 12 3004 5154 # CAP-D_CAP + 5155 11 3005 5155 # CAM-D_CAM + 5156 10 3006 5156 # CAO-D_CAO + 5157 13 3007 5157 # CTT-D_CTT + 5158 9 3016 5158 # CAT-D_CAT + 5159 10 3017 5159 # CAO-D_CAO + 5160 11 3018 5160 # CAM-D_CAM + 5161 12 3019 5161 # CAP-D_CAP + 5162 11 3020 5162 # CAM-D_CAM + 5163 10 3021 5163 # CAO-D_CAO + 5164 13 3022 5164 # CTT-D_CTT + 5165 9 3031 5165 # CAT-D_CAT + 5166 10 3032 5166 # CAO-D_CAO + 5167 11 3033 5167 # CAM-D_CAM + 5168 12 3034 5168 # CAP-D_CAP + 5169 11 3035 5169 # CAM-D_CAM + 5170 10 3036 5170 # CAO-D_CAO + 5171 13 3037 5171 # CTT-D_CTT + 5172 9 3046 5172 # CAT-D_CAT + 5173 10 3047 5173 # CAO-D_CAO + 5174 11 3048 5174 # CAM-D_CAM + 5175 12 3049 5175 # CAP-D_CAP + 5176 11 3050 5176 # CAM-D_CAM + 5177 10 3051 5177 # CAO-D_CAO + 5178 13 3052 5178 # CTT-D_CTT + 5179 9 3061 5179 # CAT-D_CAT + 5180 10 3062 5180 # CAO-D_CAO + 5181 11 3063 5181 # CAM-D_CAM + 5182 12 3064 5182 # CAP-D_CAP + 5183 11 3065 5183 # CAM-D_CAM + 5184 10 3066 5184 # CAO-D_CAO + 5185 13 3067 5185 # CTT-D_CTT + 5186 9 3076 5186 # CAT-D_CAT + 5187 10 3077 5187 # CAO-D_CAO + 5188 11 3078 5188 # CAM-D_CAM + 5189 12 3079 5189 # CAP-D_CAP + 5190 11 3080 5190 # CAM-D_CAM + 5191 10 3081 5191 # CAO-D_CAO + 5192 13 3082 5192 # CTT-D_CTT + 5193 9 3091 5193 # CAT-D_CAT + 5194 10 3092 5194 # CAO-D_CAO + 5195 11 3093 5195 # CAM-D_CAM + 5196 12 3094 5196 # CAP-D_CAP + 5197 11 3095 5197 # CAM-D_CAM + 5198 10 3096 5198 # CAO-D_CAO + 5199 13 3097 5199 # CTT-D_CTT + 5200 9 3106 5200 # CAT-D_CAT + 5201 10 3107 5201 # CAO-D_CAO + 5202 11 3108 5202 # CAM-D_CAM + 5203 12 3109 5203 # CAP-D_CAP + 5204 11 3110 5204 # CAM-D_CAM + 5205 10 3111 5205 # CAO-D_CAO + 5206 13 3112 5206 # CTT-D_CTT + 5207 9 3121 5207 # CAT-D_CAT + 5208 10 3122 5208 # CAO-D_CAO + 5209 11 3123 5209 # CAM-D_CAM + 5210 12 3124 5210 # CAP-D_CAP + 5211 11 3125 5211 # CAM-D_CAM + 5212 10 3126 5212 # CAO-D_CAO + 5213 13 3127 5213 # CTT-D_CTT + 5214 9 3136 5214 # CAT-D_CAT + 5215 10 3137 5215 # CAO-D_CAO + 5216 11 3138 5216 # CAM-D_CAM + 5217 12 3139 5217 # CAP-D_CAP + 5218 11 3140 5218 # CAM-D_CAM + 5219 10 3141 5219 # CAO-D_CAO + 5220 13 3142 5220 # CTT-D_CTT + 5221 9 3151 5221 # CAT-D_CAT + 5222 10 3152 5222 # CAO-D_CAO + 5223 11 3153 5223 # CAM-D_CAM + 5224 12 3154 5224 # CAP-D_CAP + 5225 11 3155 5225 # CAM-D_CAM + 5226 10 3156 5226 # CAO-D_CAO + 5227 13 3157 5227 # CTT-D_CTT + 5228 9 3166 5228 # CAT-D_CAT + 5229 10 3167 5229 # CAO-D_CAO + 5230 11 3168 5230 # CAM-D_CAM + 5231 12 3169 5231 # CAP-D_CAP + 5232 11 3170 5232 # CAM-D_CAM + 5233 10 3171 5233 # CAO-D_CAO + 5234 13 3172 5234 # CTT-D_CTT + 5235 9 3181 5235 # CAT-D_CAT + 5236 10 3182 5236 # CAO-D_CAO + 5237 11 3183 5237 # CAM-D_CAM + 5238 12 3184 5238 # CAP-D_CAP + 5239 11 3185 5239 # CAM-D_CAM + 5240 10 3186 5240 # CAO-D_CAO + 5241 13 3187 5241 # CTT-D_CTT + 5242 9 3196 5242 # CAT-D_CAT + 5243 10 3197 5243 # CAO-D_CAO + 5244 11 3198 5244 # CAM-D_CAM + 5245 12 3199 5245 # CAP-D_CAP + 5246 11 3200 5246 # CAM-D_CAM + 5247 10 3201 5247 # CAO-D_CAO + 5248 13 3202 5248 # CTT-D_CTT + 5249 9 3211 5249 # CAT-D_CAT + 5250 10 3212 5250 # CAO-D_CAO + 5251 11 3213 5251 # CAM-D_CAM + 5252 12 3214 5252 # CAP-D_CAP + 5253 11 3215 5253 # CAM-D_CAM + 5254 10 3216 5254 # CAO-D_CAO + 5255 13 3217 5255 # CTT-D_CTT + 5256 9 3226 5256 # CAT-D_CAT + 5257 10 3227 5257 # CAO-D_CAO + 5258 11 3228 5258 # CAM-D_CAM + 5259 12 3229 5259 # CAP-D_CAP + 5260 11 3230 5260 # CAM-D_CAM + 5261 10 3231 5261 # CAO-D_CAO + 5262 13 3232 5262 # CTT-D_CTT + 5263 9 3241 5263 # CAT-D_CAT + 5264 10 3242 5264 # CAO-D_CAO + 5265 11 3243 5265 # CAM-D_CAM + 5266 12 3244 5266 # CAP-D_CAP + 5267 11 3245 5267 # CAM-D_CAM + 5268 10 3246 5268 # CAO-D_CAO + 5269 13 3247 5269 # CTT-D_CTT + 5270 9 3256 5270 # CAT-D_CAT + 5271 10 3257 5271 # CAO-D_CAO + 5272 11 3258 5272 # CAM-D_CAM + 5273 12 3259 5273 # CAP-D_CAP + 5274 11 3260 5274 # CAM-D_CAM + 5275 10 3261 5275 # CAO-D_CAO + 5276 13 3262 5276 # CTT-D_CTT + 5277 9 3271 5277 # CAT-D_CAT + 5278 10 3272 5278 # CAO-D_CAO + 5279 11 3273 5279 # CAM-D_CAM + 5280 12 3274 5280 # CAP-D_CAP + 5281 11 3275 5281 # CAM-D_CAM + 5282 10 3276 5282 # CAO-D_CAO + 5283 13 3277 5283 # CTT-D_CTT + 5284 9 3286 5284 # CAT-D_CAT + 5285 10 3287 5285 # CAO-D_CAO + 5286 11 3288 5286 # CAM-D_CAM + 5287 12 3289 5287 # CAP-D_CAP + 5288 11 3290 5288 # CAM-D_CAM + 5289 10 3291 5289 # CAO-D_CAO + 5290 13 3292 5290 # CTT-D_CTT + 5291 9 3301 5291 # CAT-D_CAT + 5292 10 3302 5292 # CAO-D_CAO + 5293 11 3303 5293 # CAM-D_CAM + 5294 12 3304 5294 # CAP-D_CAP + 5295 11 3305 5295 # CAM-D_CAM + 5296 10 3306 5296 # CAO-D_CAO + 5297 13 3307 5297 # CTT-D_CTT + 5298 9 3316 5298 # CAT-D_CAT + 5299 10 3317 5299 # CAO-D_CAO + 5300 11 3318 5300 # CAM-D_CAM + 5301 12 3319 5301 # CAP-D_CAP + 5302 11 3320 5302 # CAM-D_CAM + 5303 10 3321 5303 # CAO-D_CAO + 5304 13 3322 5304 # CTT-D_CTT + 5305 9 3331 5305 # CAT-D_CAT + 5306 10 3332 5306 # CAO-D_CAO + 5307 11 3333 5307 # CAM-D_CAM + 5308 12 3334 5308 # CAP-D_CAP + 5309 11 3335 5309 # CAM-D_CAM + 5310 10 3336 5310 # CAO-D_CAO + 5311 13 3337 5311 # CTT-D_CTT + 5312 9 3346 5312 # CAT-D_CAT + 5313 10 3347 5313 # CAO-D_CAO + 5314 11 3348 5314 # CAM-D_CAM + 5315 12 3349 5315 # CAP-D_CAP + 5316 11 3350 5316 # CAM-D_CAM + 5317 10 3351 5317 # CAO-D_CAO + 5318 13 3352 5318 # CTT-D_CTT + 5319 9 3361 5319 # CAT-D_CAT + 5320 10 3362 5320 # CAO-D_CAO + 5321 11 3363 5321 # CAM-D_CAM + 5322 12 3364 5322 # CAP-D_CAP + 5323 11 3365 5323 # CAM-D_CAM + 5324 10 3366 5324 # CAO-D_CAO + 5325 13 3367 5325 # CTT-D_CTT + 5326 9 3376 5326 # CAT-D_CAT + 5327 10 3377 5327 # CAO-D_CAO + 5328 11 3378 5328 # CAM-D_CAM + 5329 12 3379 5329 # CAP-D_CAP + 5330 11 3380 5330 # CAM-D_CAM + 5331 10 3381 5331 # CAO-D_CAO + 5332 13 3382 5332 # CTT-D_CTT + 5333 9 3391 5333 # CAT-D_CAT + 5334 10 3392 5334 # CAO-D_CAO + 5335 11 3393 5335 # CAM-D_CAM + 5336 12 3394 5336 # CAP-D_CAP + 5337 11 3395 5337 # CAM-D_CAM + 5338 10 3396 5338 # CAO-D_CAO + 5339 13 3397 5339 # CTT-D_CTT + 5340 9 3406 5340 # CAT-D_CAT + 5341 10 3407 5341 # CAO-D_CAO + 5342 11 3408 5342 # CAM-D_CAM + 5343 12 3409 5343 # CAP-D_CAP + 5344 11 3410 5344 # CAM-D_CAM + 5345 10 3411 5345 # CAO-D_CAO + 5346 13 3412 5346 # CTT-D_CTT + 5347 9 3421 5347 # CAT-D_CAT + 5348 10 3422 5348 # CAO-D_CAO + 5349 11 3423 5349 # CAM-D_CAM + 5350 12 3424 5350 # CAP-D_CAP + 5351 11 3425 5351 # CAM-D_CAM + 5352 10 3426 5352 # CAO-D_CAO + 5353 13 3427 5353 # CTT-D_CTT + 5354 9 3436 5354 # CAT-D_CAT + 5355 10 3437 5355 # CAO-D_CAO + 5356 11 3438 5356 # CAM-D_CAM + 5357 12 3439 5357 # CAP-D_CAP + 5358 11 3440 5358 # CAM-D_CAM + 5359 10 3441 5359 # CAO-D_CAO + 5360 13 3442 5360 # CTT-D_CTT + 5361 9 3451 5361 # CAT-D_CAT + 5362 10 3452 5362 # CAO-D_CAO + 5363 11 3453 5363 # CAM-D_CAM + 5364 12 3454 5364 # CAP-D_CAP + 5365 11 3455 5365 # CAM-D_CAM + 5366 10 3456 5366 # CAO-D_CAO + 5367 13 3457 5367 # CTT-D_CTT + 5368 9 3466 5368 # CAT-D_CAT + 5369 10 3467 5369 # CAO-D_CAO + 5370 11 3468 5370 # CAM-D_CAM + 5371 12 3469 5371 # CAP-D_CAP + 5372 11 3470 5372 # CAM-D_CAM + 5373 10 3471 5373 # CAO-D_CAO + 5374 13 3472 5374 # CTT-D_CTT + 5375 9 3481 5375 # CAT-D_CAT + 5376 10 3482 5376 # CAO-D_CAO + 5377 11 3483 5377 # CAM-D_CAM + 5378 12 3484 5378 # CAP-D_CAP + 5379 11 3485 5379 # CAM-D_CAM + 5380 10 3486 5380 # CAO-D_CAO + 5381 13 3487 5381 # CTT-D_CTT + 5382 9 3496 5382 # CAT-D_CAT + 5383 10 3497 5383 # CAO-D_CAO + 5384 11 3498 5384 # CAM-D_CAM + 5385 12 3499 5385 # CAP-D_CAP + 5386 11 3500 5386 # CAM-D_CAM + 5387 10 3501 5387 # CAO-D_CAO + 5388 13 3502 5388 # CTT-D_CTT + 5389 9 3511 5389 # CAT-D_CAT + 5390 10 3512 5390 # CAO-D_CAO + 5391 11 3513 5391 # CAM-D_CAM + 5392 12 3514 5392 # CAP-D_CAP + 5393 11 3515 5393 # CAM-D_CAM + 5394 10 3516 5394 # CAO-D_CAO + 5395 13 3517 5395 # CTT-D_CTT + 5396 9 3526 5396 # CAT-D_CAT + 5397 10 3527 5397 # CAO-D_CAO + 5398 11 3528 5398 # CAM-D_CAM + 5399 12 3529 5399 # CAP-D_CAP + 5400 11 3530 5400 # CAM-D_CAM + 5401 10 3531 5401 # CAO-D_CAO + 5402 13 3532 5402 # CTT-D_CTT + 5403 9 3541 5403 # CAT-D_CAT + 5404 10 3542 5404 # CAO-D_CAO + 5405 11 3543 5405 # CAM-D_CAM + 5406 12 3544 5406 # CAP-D_CAP + 5407 11 3545 5407 # CAM-D_CAM + 5408 10 3546 5408 # CAO-D_CAO + 5409 13 3547 5409 # CTT-D_CTT + 5410 9 3556 5410 # CAT-D_CAT + 5411 10 3557 5411 # CAO-D_CAO + 5412 11 3558 5412 # CAM-D_CAM + 5413 12 3559 5413 # CAP-D_CAP + 5414 11 3560 5414 # CAM-D_CAM + 5415 10 3561 5415 # CAO-D_CAO + 5416 13 3562 5416 # CTT-D_CTT + 5417 9 3571 5417 # CAT-D_CAT + 5418 10 3572 5418 # CAO-D_CAO + 5419 11 3573 5419 # CAM-D_CAM + 5420 12 3574 5420 # CAP-D_CAP + 5421 11 3575 5421 # CAM-D_CAM + 5422 10 3576 5422 # CAO-D_CAO + 5423 13 3577 5423 # CTT-D_CTT + 5424 9 3586 5424 # CAT-D_CAT + 5425 10 3587 5425 # CAO-D_CAO + 5426 11 3588 5426 # CAM-D_CAM + 5427 12 3589 5427 # CAP-D_CAP + 5428 11 3590 5428 # CAM-D_CAM + 5429 10 3591 5429 # CAO-D_CAO + 5430 13 3592 5430 # CTT-D_CTT + 5431 9 3601 5431 # CAT-D_CAT + 5432 10 3602 5432 # CAO-D_CAO + 5433 11 3603 5433 # CAM-D_CAM + 5434 12 3604 5434 # CAP-D_CAP + 5435 11 3605 5435 # CAM-D_CAM + 5436 10 3606 5436 # CAO-D_CAO + 5437 13 3607 5437 # CTT-D_CTT + 5438 9 3616 5438 # CAT-D_CAT + 5439 10 3617 5439 # CAO-D_CAO + 5440 11 3618 5440 # CAM-D_CAM + 5441 12 3619 5441 # CAP-D_CAP + 5442 11 3620 5442 # CAM-D_CAM + 5443 10 3621 5443 # CAO-D_CAO + 5444 13 3622 5444 # CTT-D_CTT + 5445 9 3631 5445 # CAT-D_CAT + 5446 10 3632 5446 # CAO-D_CAO + 5447 11 3633 5447 # CAM-D_CAM + 5448 12 3634 5448 # CAP-D_CAP + 5449 11 3635 5449 # CAM-D_CAM + 5450 10 3636 5450 # CAO-D_CAO + 5451 13 3637 5451 # CTT-D_CTT + 5452 9 3646 5452 # CAT-D_CAT + 5453 10 3647 5453 # CAO-D_CAO + 5454 11 3648 5454 # CAM-D_CAM + 5455 12 3649 5455 # CAP-D_CAP + 5456 11 3650 5456 # CAM-D_CAM + 5457 10 3651 5457 # CAO-D_CAO + 5458 13 3652 5458 # CTT-D_CTT + 5459 9 3661 5459 # CAT-D_CAT + 5460 10 3662 5460 # CAO-D_CAO + 5461 11 3663 5461 # CAM-D_CAM + 5462 12 3664 5462 # CAP-D_CAP + 5463 11 3665 5463 # CAM-D_CAM + 5464 10 3666 5464 # CAO-D_CAO + 5465 13 3667 5465 # CTT-D_CTT + 5466 9 3676 5466 # CAT-D_CAT + 5467 10 3677 5467 # CAO-D_CAO + 5468 11 3678 5468 # CAM-D_CAM + 5469 12 3679 5469 # CAP-D_CAP + 5470 11 3680 5470 # CAM-D_CAM + 5471 10 3681 5471 # CAO-D_CAO + 5472 13 3682 5472 # CTT-D_CTT + 5473 9 3691 5473 # CAT-D_CAT + 5474 10 3692 5474 # CAO-D_CAO + 5475 11 3693 5475 # CAM-D_CAM + 5476 12 3694 5476 # CAP-D_CAP + 5477 11 3695 5477 # CAM-D_CAM + 5478 10 3696 5478 # CAO-D_CAO + 5479 13 3697 5479 # CTT-D_CTT + 5480 9 3706 5480 # CAT-D_CAT + 5481 10 3707 5481 # CAO-D_CAO + 5482 11 3708 5482 # CAM-D_CAM + 5483 12 3709 5483 # CAP-D_CAP + 5484 11 3710 5484 # CAM-D_CAM + 5485 10 3711 5485 # CAO-D_CAO + 5486 13 3712 5486 # CTT-D_CTT + 5487 9 3721 5487 # CAT-D_CAT + 5488 10 3722 5488 # CAO-D_CAO + 5489 11 3723 5489 # CAM-D_CAM + 5490 12 3724 5490 # CAP-D_CAP + 5491 11 3725 5491 # CAM-D_CAM + 5492 10 3726 5492 # CAO-D_CAO + 5493 13 3727 5493 # CTT-D_CTT + 5494 9 3736 5494 # CAT-D_CAT + 5495 10 3737 5495 # CAO-D_CAO + 5496 11 3738 5496 # CAM-D_CAM + 5497 12 3739 5497 # CAP-D_CAP + 5498 11 3740 5498 # CAM-D_CAM + 5499 10 3741 5499 # CAO-D_CAO + 5500 13 3742 5500 # CTT-D_CTT + +Angles + + 1 1 1 2 3 # CAT-CAO-CAM + 2 2 1 2 8 # CAT-CAO-HAT + 3 3 1 7 13 # CAT-CTT-HT + 4 3 1 7 14 # CAT-CTT-HT + 5 3 1 7 15 # CAT-CTT-HT + 6 1 1 6 5 # CAT-CAO-CAM + 7 2 1 6 12 # CAT-CAO-HAT + 8 4 2 1 7 # CAO-CAT-CTT + 9 5 2 1 6 # CAO-CAT-CAO + 10 6 2 3 4 # CAO-CAM-CAP + 11 7 2 3 9 # CAO-CAM-HAT + 12 8 3 2 8 # CAM-CAO-HAT + 13 9 3 4 5 # CAM-CAP-CAM + 14 10 3 4 10 # CAM-CAP-HAT + 15 11 4 3 9 # CAP-CAM-HAT + 16 6 6 5 4 # CAO-CAM-CAP + 17 11 4 5 11 # CAP-CAM-HAT + 18 10 5 4 10 # CAM-CAP-HAT + 19 8 5 6 12 # CAM-CAO-HAT + 20 7 6 5 11 # CAO-CAM-HAT + 21 4 6 1 7 # CAO-CAT-CTT + 22 12 13 7 14 # HT-CTT-HT + 23 12 13 7 15 # HT-CTT-HT + 24 12 14 7 15 # HT-CTT-HT + 25 1 16 17 18 # CAT-CAO-CAM + 26 2 16 17 23 # CAT-CAO-HAT + 27 3 16 22 28 # CAT-CTT-HT + 28 3 16 22 29 # CAT-CTT-HT + 29 3 16 22 30 # CAT-CTT-HT + 30 1 16 21 20 # CAT-CAO-CAM + 31 2 16 21 27 # CAT-CAO-HAT + 32 4 17 16 22 # CAO-CAT-CTT + 33 5 17 16 21 # CAO-CAT-CAO + 34 6 17 18 19 # CAO-CAM-CAP + 35 7 17 18 24 # CAO-CAM-HAT + 36 8 18 17 23 # CAM-CAO-HAT + 37 9 18 19 20 # CAM-CAP-CAM + 38 10 18 19 25 # CAM-CAP-HAT + 39 11 19 18 24 # CAP-CAM-HAT + 40 6 21 20 19 # CAO-CAM-CAP + 41 11 19 20 26 # CAP-CAM-HAT + 42 10 20 19 25 # CAM-CAP-HAT + 43 8 20 21 27 # CAM-CAO-HAT + 44 7 21 20 26 # CAO-CAM-HAT + 45 4 21 16 22 # CAO-CAT-CTT + 46 12 28 22 29 # HT-CTT-HT + 47 12 28 22 30 # HT-CTT-HT + 48 12 29 22 30 # HT-CTT-HT + 49 1 31 32 33 # CAT-CAO-CAM + 50 2 31 32 38 # CAT-CAO-HAT + 51 3 31 37 43 # CAT-CTT-HT + 52 3 31 37 44 # CAT-CTT-HT + 53 3 31 37 45 # CAT-CTT-HT + 54 1 31 36 35 # CAT-CAO-CAM + 55 2 31 36 42 # CAT-CAO-HAT + 56 4 32 31 37 # CAO-CAT-CTT + 57 5 32 31 36 # CAO-CAT-CAO + 58 6 32 33 34 # CAO-CAM-CAP + 59 7 32 33 39 # CAO-CAM-HAT + 60 8 33 32 38 # CAM-CAO-HAT + 61 9 33 34 35 # CAM-CAP-CAM + 62 10 33 34 40 # CAM-CAP-HAT + 63 11 34 33 39 # CAP-CAM-HAT + 64 6 36 35 34 # CAO-CAM-CAP + 65 11 34 35 41 # CAP-CAM-HAT + 66 10 35 34 40 # CAM-CAP-HAT + 67 8 35 36 42 # CAM-CAO-HAT + 68 7 36 35 41 # CAO-CAM-HAT + 69 4 36 31 37 # CAO-CAT-CTT + 70 12 43 37 44 # HT-CTT-HT + 71 12 43 37 45 # HT-CTT-HT + 72 12 44 37 45 # HT-CTT-HT + 73 1 46 47 48 # CAT-CAO-CAM + 74 2 46 47 53 # CAT-CAO-HAT + 75 3 46 52 58 # CAT-CTT-HT + 76 3 46 52 59 # CAT-CTT-HT + 77 3 46 52 60 # CAT-CTT-HT + 78 1 46 51 50 # CAT-CAO-CAM + 79 2 46 51 57 # CAT-CAO-HAT + 80 4 47 46 52 # CAO-CAT-CTT + 81 5 47 46 51 # CAO-CAT-CAO + 82 6 47 48 49 # CAO-CAM-CAP + 83 7 47 48 54 # CAO-CAM-HAT + 84 8 48 47 53 # CAM-CAO-HAT + 85 9 48 49 50 # CAM-CAP-CAM + 86 10 48 49 55 # CAM-CAP-HAT + 87 11 49 48 54 # CAP-CAM-HAT + 88 6 51 50 49 # CAO-CAM-CAP + 89 11 49 50 56 # CAP-CAM-HAT + 90 10 50 49 55 # CAM-CAP-HAT + 91 8 50 51 57 # CAM-CAO-HAT + 92 7 51 50 56 # CAO-CAM-HAT + 93 4 51 46 52 # CAO-CAT-CTT + 94 12 58 52 59 # HT-CTT-HT + 95 12 58 52 60 # HT-CTT-HT + 96 12 59 52 60 # HT-CTT-HT + 97 1 61 62 63 # CAT-CAO-CAM + 98 2 61 62 68 # CAT-CAO-HAT + 99 3 61 67 73 # CAT-CTT-HT + 100 3 61 67 74 # CAT-CTT-HT + 101 3 61 67 75 # CAT-CTT-HT + 102 1 61 66 65 # CAT-CAO-CAM + 103 2 61 66 72 # CAT-CAO-HAT + 104 4 62 61 67 # CAO-CAT-CTT + 105 5 62 61 66 # CAO-CAT-CAO + 106 6 62 63 64 # CAO-CAM-CAP + 107 7 62 63 69 # CAO-CAM-HAT + 108 8 63 62 68 # CAM-CAO-HAT + 109 9 63 64 65 # CAM-CAP-CAM + 110 10 63 64 70 # CAM-CAP-HAT + 111 11 64 63 69 # CAP-CAM-HAT + 112 6 66 65 64 # CAO-CAM-CAP + 113 11 64 65 71 # CAP-CAM-HAT + 114 10 65 64 70 # CAM-CAP-HAT + 115 8 65 66 72 # CAM-CAO-HAT + 116 7 66 65 71 # CAO-CAM-HAT + 117 4 66 61 67 # CAO-CAT-CTT + 118 12 73 67 74 # HT-CTT-HT + 119 12 73 67 75 # HT-CTT-HT + 120 12 74 67 75 # HT-CTT-HT + 121 1 76 77 78 # CAT-CAO-CAM + 122 2 76 77 83 # CAT-CAO-HAT + 123 3 76 82 88 # CAT-CTT-HT + 124 3 76 82 89 # CAT-CTT-HT + 125 3 76 82 90 # CAT-CTT-HT + 126 1 76 81 80 # CAT-CAO-CAM + 127 2 76 81 87 # CAT-CAO-HAT + 128 4 77 76 82 # CAO-CAT-CTT + 129 5 77 76 81 # CAO-CAT-CAO + 130 6 77 78 79 # CAO-CAM-CAP + 131 7 77 78 84 # CAO-CAM-HAT + 132 8 78 77 83 # CAM-CAO-HAT + 133 9 78 79 80 # CAM-CAP-CAM + 134 10 78 79 85 # CAM-CAP-HAT + 135 11 79 78 84 # CAP-CAM-HAT + 136 6 81 80 79 # CAO-CAM-CAP + 137 11 79 80 86 # CAP-CAM-HAT + 138 10 80 79 85 # CAM-CAP-HAT + 139 8 80 81 87 # CAM-CAO-HAT + 140 7 81 80 86 # CAO-CAM-HAT + 141 4 81 76 82 # CAO-CAT-CTT + 142 12 88 82 89 # HT-CTT-HT + 143 12 88 82 90 # HT-CTT-HT + 144 12 89 82 90 # HT-CTT-HT + 145 1 91 92 93 # CAT-CAO-CAM + 146 2 91 92 98 # CAT-CAO-HAT + 147 3 91 97 103 # CAT-CTT-HT + 148 3 91 97 104 # CAT-CTT-HT + 149 3 91 97 105 # CAT-CTT-HT + 150 1 91 96 95 # CAT-CAO-CAM + 151 2 91 96 102 # CAT-CAO-HAT + 152 4 92 91 97 # CAO-CAT-CTT + 153 5 92 91 96 # CAO-CAT-CAO + 154 6 92 93 94 # CAO-CAM-CAP + 155 7 92 93 99 # CAO-CAM-HAT + 156 8 93 92 98 # CAM-CAO-HAT + 157 9 93 94 95 # CAM-CAP-CAM + 158 10 93 94 100 # CAM-CAP-HAT + 159 11 94 93 99 # CAP-CAM-HAT + 160 6 96 95 94 # CAO-CAM-CAP + 161 11 94 95 101 # CAP-CAM-HAT + 162 10 95 94 100 # CAM-CAP-HAT + 163 8 95 96 102 # CAM-CAO-HAT + 164 7 96 95 101 # CAO-CAM-HAT + 165 4 96 91 97 # CAO-CAT-CTT + 166 12 103 97 104 # HT-CTT-HT + 167 12 103 97 105 # HT-CTT-HT + 168 12 104 97 105 # HT-CTT-HT + 169 1 106 107 108 # CAT-CAO-CAM + 170 2 106 107 113 # CAT-CAO-HAT + 171 3 106 112 118 # CAT-CTT-HT + 172 3 106 112 119 # CAT-CTT-HT + 173 3 106 112 120 # CAT-CTT-HT + 174 1 106 111 110 # CAT-CAO-CAM + 175 2 106 111 117 # CAT-CAO-HAT + 176 4 107 106 112 # CAO-CAT-CTT + 177 5 107 106 111 # CAO-CAT-CAO + 178 6 107 108 109 # CAO-CAM-CAP + 179 7 107 108 114 # CAO-CAM-HAT + 180 8 108 107 113 # CAM-CAO-HAT + 181 9 108 109 110 # CAM-CAP-CAM + 182 10 108 109 115 # CAM-CAP-HAT + 183 11 109 108 114 # CAP-CAM-HAT + 184 6 111 110 109 # CAO-CAM-CAP + 185 11 109 110 116 # CAP-CAM-HAT + 186 10 110 109 115 # CAM-CAP-HAT + 187 8 110 111 117 # CAM-CAO-HAT + 188 7 111 110 116 # CAO-CAM-HAT + 189 4 111 106 112 # CAO-CAT-CTT + 190 12 118 112 119 # HT-CTT-HT + 191 12 118 112 120 # HT-CTT-HT + 192 12 119 112 120 # HT-CTT-HT + 193 1 121 122 123 # CAT-CAO-CAM + 194 2 121 122 128 # CAT-CAO-HAT + 195 3 121 127 133 # CAT-CTT-HT + 196 3 121 127 134 # CAT-CTT-HT + 197 3 121 127 135 # CAT-CTT-HT + 198 1 121 126 125 # CAT-CAO-CAM + 199 2 121 126 132 # CAT-CAO-HAT + 200 4 122 121 127 # CAO-CAT-CTT + 201 5 122 121 126 # CAO-CAT-CAO + 202 6 122 123 124 # CAO-CAM-CAP + 203 7 122 123 129 # CAO-CAM-HAT + 204 8 123 122 128 # CAM-CAO-HAT + 205 9 123 124 125 # CAM-CAP-CAM + 206 10 123 124 130 # CAM-CAP-HAT + 207 11 124 123 129 # CAP-CAM-HAT + 208 6 126 125 124 # CAO-CAM-CAP + 209 11 124 125 131 # CAP-CAM-HAT + 210 10 125 124 130 # CAM-CAP-HAT + 211 8 125 126 132 # CAM-CAO-HAT + 212 7 126 125 131 # CAO-CAM-HAT + 213 4 126 121 127 # CAO-CAT-CTT + 214 12 133 127 134 # HT-CTT-HT + 215 12 133 127 135 # HT-CTT-HT + 216 12 134 127 135 # HT-CTT-HT + 217 1 136 137 138 # CAT-CAO-CAM + 218 2 136 137 143 # CAT-CAO-HAT + 219 3 136 142 148 # CAT-CTT-HT + 220 3 136 142 149 # CAT-CTT-HT + 221 3 136 142 150 # CAT-CTT-HT + 222 1 136 141 140 # CAT-CAO-CAM + 223 2 136 141 147 # CAT-CAO-HAT + 224 4 137 136 142 # CAO-CAT-CTT + 225 5 137 136 141 # CAO-CAT-CAO + 226 6 137 138 139 # CAO-CAM-CAP + 227 7 137 138 144 # CAO-CAM-HAT + 228 8 138 137 143 # CAM-CAO-HAT + 229 9 138 139 140 # CAM-CAP-CAM + 230 10 138 139 145 # CAM-CAP-HAT + 231 11 139 138 144 # CAP-CAM-HAT + 232 6 141 140 139 # CAO-CAM-CAP + 233 11 139 140 146 # CAP-CAM-HAT + 234 10 140 139 145 # CAM-CAP-HAT + 235 8 140 141 147 # CAM-CAO-HAT + 236 7 141 140 146 # CAO-CAM-HAT + 237 4 141 136 142 # CAO-CAT-CTT + 238 12 148 142 149 # HT-CTT-HT + 239 12 148 142 150 # HT-CTT-HT + 240 12 149 142 150 # HT-CTT-HT + 241 1 151 152 153 # CAT-CAO-CAM + 242 2 151 152 158 # CAT-CAO-HAT + 243 3 151 157 163 # CAT-CTT-HT + 244 3 151 157 164 # CAT-CTT-HT + 245 3 151 157 165 # CAT-CTT-HT + 246 1 151 156 155 # CAT-CAO-CAM + 247 2 151 156 162 # CAT-CAO-HAT + 248 4 152 151 157 # CAO-CAT-CTT + 249 5 152 151 156 # CAO-CAT-CAO + 250 6 152 153 154 # CAO-CAM-CAP + 251 7 152 153 159 # CAO-CAM-HAT + 252 8 153 152 158 # CAM-CAO-HAT + 253 9 153 154 155 # CAM-CAP-CAM + 254 10 153 154 160 # CAM-CAP-HAT + 255 11 154 153 159 # CAP-CAM-HAT + 256 6 156 155 154 # CAO-CAM-CAP + 257 11 154 155 161 # CAP-CAM-HAT + 258 10 155 154 160 # CAM-CAP-HAT + 259 8 155 156 162 # CAM-CAO-HAT + 260 7 156 155 161 # CAO-CAM-HAT + 261 4 156 151 157 # CAO-CAT-CTT + 262 12 163 157 164 # HT-CTT-HT + 263 12 163 157 165 # HT-CTT-HT + 264 12 164 157 165 # HT-CTT-HT + 265 1 166 167 168 # CAT-CAO-CAM + 266 2 166 167 173 # CAT-CAO-HAT + 267 3 166 172 178 # CAT-CTT-HT + 268 3 166 172 179 # CAT-CTT-HT + 269 3 166 172 180 # CAT-CTT-HT + 270 1 166 171 170 # CAT-CAO-CAM + 271 2 166 171 177 # CAT-CAO-HAT + 272 4 167 166 172 # CAO-CAT-CTT + 273 5 167 166 171 # CAO-CAT-CAO + 274 6 167 168 169 # CAO-CAM-CAP + 275 7 167 168 174 # CAO-CAM-HAT + 276 8 168 167 173 # CAM-CAO-HAT + 277 9 168 169 170 # CAM-CAP-CAM + 278 10 168 169 175 # CAM-CAP-HAT + 279 11 169 168 174 # CAP-CAM-HAT + 280 6 171 170 169 # CAO-CAM-CAP + 281 11 169 170 176 # CAP-CAM-HAT + 282 10 170 169 175 # CAM-CAP-HAT + 283 8 170 171 177 # CAM-CAO-HAT + 284 7 171 170 176 # CAO-CAM-HAT + 285 4 171 166 172 # CAO-CAT-CTT + 286 12 178 172 179 # HT-CTT-HT + 287 12 178 172 180 # HT-CTT-HT + 288 12 179 172 180 # HT-CTT-HT + 289 1 181 182 183 # CAT-CAO-CAM + 290 2 181 182 188 # CAT-CAO-HAT + 291 3 181 187 193 # CAT-CTT-HT + 292 3 181 187 194 # CAT-CTT-HT + 293 3 181 187 195 # CAT-CTT-HT + 294 1 181 186 185 # CAT-CAO-CAM + 295 2 181 186 192 # CAT-CAO-HAT + 296 4 182 181 187 # CAO-CAT-CTT + 297 5 182 181 186 # CAO-CAT-CAO + 298 6 182 183 184 # CAO-CAM-CAP + 299 7 182 183 189 # CAO-CAM-HAT + 300 8 183 182 188 # CAM-CAO-HAT + 301 9 183 184 185 # CAM-CAP-CAM + 302 10 183 184 190 # CAM-CAP-HAT + 303 11 184 183 189 # CAP-CAM-HAT + 304 6 186 185 184 # CAO-CAM-CAP + 305 11 184 185 191 # CAP-CAM-HAT + 306 10 185 184 190 # CAM-CAP-HAT + 307 8 185 186 192 # CAM-CAO-HAT + 308 7 186 185 191 # CAO-CAM-HAT + 309 4 186 181 187 # CAO-CAT-CTT + 310 12 193 187 194 # HT-CTT-HT + 311 12 193 187 195 # HT-CTT-HT + 312 12 194 187 195 # HT-CTT-HT + 313 1 196 197 198 # CAT-CAO-CAM + 314 2 196 197 203 # CAT-CAO-HAT + 315 3 196 202 208 # CAT-CTT-HT + 316 3 196 202 209 # CAT-CTT-HT + 317 3 196 202 210 # CAT-CTT-HT + 318 1 196 201 200 # CAT-CAO-CAM + 319 2 196 201 207 # CAT-CAO-HAT + 320 4 197 196 202 # CAO-CAT-CTT + 321 5 197 196 201 # CAO-CAT-CAO + 322 6 197 198 199 # CAO-CAM-CAP + 323 7 197 198 204 # CAO-CAM-HAT + 324 8 198 197 203 # CAM-CAO-HAT + 325 9 198 199 200 # CAM-CAP-CAM + 326 10 198 199 205 # CAM-CAP-HAT + 327 11 199 198 204 # CAP-CAM-HAT + 328 6 201 200 199 # CAO-CAM-CAP + 329 11 199 200 206 # CAP-CAM-HAT + 330 10 200 199 205 # CAM-CAP-HAT + 331 8 200 201 207 # CAM-CAO-HAT + 332 7 201 200 206 # CAO-CAM-HAT + 333 4 201 196 202 # CAO-CAT-CTT + 334 12 208 202 209 # HT-CTT-HT + 335 12 208 202 210 # HT-CTT-HT + 336 12 209 202 210 # HT-CTT-HT + 337 1 211 212 213 # CAT-CAO-CAM + 338 2 211 212 218 # CAT-CAO-HAT + 339 3 211 217 223 # CAT-CTT-HT + 340 3 211 217 224 # CAT-CTT-HT + 341 3 211 217 225 # CAT-CTT-HT + 342 1 211 216 215 # CAT-CAO-CAM + 343 2 211 216 222 # CAT-CAO-HAT + 344 4 212 211 217 # CAO-CAT-CTT + 345 5 212 211 216 # CAO-CAT-CAO + 346 6 212 213 214 # CAO-CAM-CAP + 347 7 212 213 219 # CAO-CAM-HAT + 348 8 213 212 218 # CAM-CAO-HAT + 349 9 213 214 215 # CAM-CAP-CAM + 350 10 213 214 220 # CAM-CAP-HAT + 351 11 214 213 219 # CAP-CAM-HAT + 352 6 216 215 214 # CAO-CAM-CAP + 353 11 214 215 221 # CAP-CAM-HAT + 354 10 215 214 220 # CAM-CAP-HAT + 355 8 215 216 222 # CAM-CAO-HAT + 356 7 216 215 221 # CAO-CAM-HAT + 357 4 216 211 217 # CAO-CAT-CTT + 358 12 223 217 224 # HT-CTT-HT + 359 12 223 217 225 # HT-CTT-HT + 360 12 224 217 225 # HT-CTT-HT + 361 1 226 227 228 # CAT-CAO-CAM + 362 2 226 227 233 # CAT-CAO-HAT + 363 3 226 232 238 # CAT-CTT-HT + 364 3 226 232 239 # CAT-CTT-HT + 365 3 226 232 240 # CAT-CTT-HT + 366 1 226 231 230 # CAT-CAO-CAM + 367 2 226 231 237 # CAT-CAO-HAT + 368 4 227 226 232 # CAO-CAT-CTT + 369 5 227 226 231 # CAO-CAT-CAO + 370 6 227 228 229 # CAO-CAM-CAP + 371 7 227 228 234 # CAO-CAM-HAT + 372 8 228 227 233 # CAM-CAO-HAT + 373 9 228 229 230 # CAM-CAP-CAM + 374 10 228 229 235 # CAM-CAP-HAT + 375 11 229 228 234 # CAP-CAM-HAT + 376 6 231 230 229 # CAO-CAM-CAP + 377 11 229 230 236 # CAP-CAM-HAT + 378 10 230 229 235 # CAM-CAP-HAT + 379 8 230 231 237 # CAM-CAO-HAT + 380 7 231 230 236 # CAO-CAM-HAT + 381 4 231 226 232 # CAO-CAT-CTT + 382 12 238 232 239 # HT-CTT-HT + 383 12 238 232 240 # HT-CTT-HT + 384 12 239 232 240 # HT-CTT-HT + 385 1 241 242 243 # CAT-CAO-CAM + 386 2 241 242 248 # CAT-CAO-HAT + 387 3 241 247 253 # CAT-CTT-HT + 388 3 241 247 254 # CAT-CTT-HT + 389 3 241 247 255 # CAT-CTT-HT + 390 1 241 246 245 # CAT-CAO-CAM + 391 2 241 246 252 # CAT-CAO-HAT + 392 4 242 241 247 # CAO-CAT-CTT + 393 5 242 241 246 # CAO-CAT-CAO + 394 6 242 243 244 # CAO-CAM-CAP + 395 7 242 243 249 # CAO-CAM-HAT + 396 8 243 242 248 # CAM-CAO-HAT + 397 9 243 244 245 # CAM-CAP-CAM + 398 10 243 244 250 # CAM-CAP-HAT + 399 11 244 243 249 # CAP-CAM-HAT + 400 6 246 245 244 # CAO-CAM-CAP + 401 11 244 245 251 # CAP-CAM-HAT + 402 10 245 244 250 # CAM-CAP-HAT + 403 8 245 246 252 # CAM-CAO-HAT + 404 7 246 245 251 # CAO-CAM-HAT + 405 4 246 241 247 # CAO-CAT-CTT + 406 12 253 247 254 # HT-CTT-HT + 407 12 253 247 255 # HT-CTT-HT + 408 12 254 247 255 # HT-CTT-HT + 409 1 256 257 258 # CAT-CAO-CAM + 410 2 256 257 263 # CAT-CAO-HAT + 411 3 256 262 268 # CAT-CTT-HT + 412 3 256 262 269 # CAT-CTT-HT + 413 3 256 262 270 # CAT-CTT-HT + 414 1 256 261 260 # CAT-CAO-CAM + 415 2 256 261 267 # CAT-CAO-HAT + 416 4 257 256 262 # CAO-CAT-CTT + 417 5 257 256 261 # CAO-CAT-CAO + 418 6 257 258 259 # CAO-CAM-CAP + 419 7 257 258 264 # CAO-CAM-HAT + 420 8 258 257 263 # CAM-CAO-HAT + 421 9 258 259 260 # CAM-CAP-CAM + 422 10 258 259 265 # CAM-CAP-HAT + 423 11 259 258 264 # CAP-CAM-HAT + 424 6 261 260 259 # CAO-CAM-CAP + 425 11 259 260 266 # CAP-CAM-HAT + 426 10 260 259 265 # CAM-CAP-HAT + 427 8 260 261 267 # CAM-CAO-HAT + 428 7 261 260 266 # CAO-CAM-HAT + 429 4 261 256 262 # CAO-CAT-CTT + 430 12 268 262 269 # HT-CTT-HT + 431 12 268 262 270 # HT-CTT-HT + 432 12 269 262 270 # HT-CTT-HT + 433 1 271 272 273 # CAT-CAO-CAM + 434 2 271 272 278 # CAT-CAO-HAT + 435 3 271 277 283 # CAT-CTT-HT + 436 3 271 277 284 # CAT-CTT-HT + 437 3 271 277 285 # CAT-CTT-HT + 438 1 271 276 275 # CAT-CAO-CAM + 439 2 271 276 282 # CAT-CAO-HAT + 440 4 272 271 277 # CAO-CAT-CTT + 441 5 272 271 276 # CAO-CAT-CAO + 442 6 272 273 274 # CAO-CAM-CAP + 443 7 272 273 279 # CAO-CAM-HAT + 444 8 273 272 278 # CAM-CAO-HAT + 445 9 273 274 275 # CAM-CAP-CAM + 446 10 273 274 280 # CAM-CAP-HAT + 447 11 274 273 279 # CAP-CAM-HAT + 448 6 276 275 274 # CAO-CAM-CAP + 449 11 274 275 281 # CAP-CAM-HAT + 450 10 275 274 280 # CAM-CAP-HAT + 451 8 275 276 282 # CAM-CAO-HAT + 452 7 276 275 281 # CAO-CAM-HAT + 453 4 276 271 277 # CAO-CAT-CTT + 454 12 283 277 284 # HT-CTT-HT + 455 12 283 277 285 # HT-CTT-HT + 456 12 284 277 285 # HT-CTT-HT + 457 1 286 287 288 # CAT-CAO-CAM + 458 2 286 287 293 # CAT-CAO-HAT + 459 3 286 292 298 # CAT-CTT-HT + 460 3 286 292 299 # CAT-CTT-HT + 461 3 286 292 300 # CAT-CTT-HT + 462 1 286 291 290 # CAT-CAO-CAM + 463 2 286 291 297 # CAT-CAO-HAT + 464 4 287 286 292 # CAO-CAT-CTT + 465 5 287 286 291 # CAO-CAT-CAO + 466 6 287 288 289 # CAO-CAM-CAP + 467 7 287 288 294 # CAO-CAM-HAT + 468 8 288 287 293 # CAM-CAO-HAT + 469 9 288 289 290 # CAM-CAP-CAM + 470 10 288 289 295 # CAM-CAP-HAT + 471 11 289 288 294 # CAP-CAM-HAT + 472 6 291 290 289 # CAO-CAM-CAP + 473 11 289 290 296 # CAP-CAM-HAT + 474 10 290 289 295 # CAM-CAP-HAT + 475 8 290 291 297 # CAM-CAO-HAT + 476 7 291 290 296 # CAO-CAM-HAT + 477 4 291 286 292 # CAO-CAT-CTT + 478 12 298 292 299 # HT-CTT-HT + 479 12 298 292 300 # HT-CTT-HT + 480 12 299 292 300 # HT-CTT-HT + 481 1 301 302 303 # CAT-CAO-CAM + 482 2 301 302 308 # CAT-CAO-HAT + 483 3 301 307 313 # CAT-CTT-HT + 484 3 301 307 314 # CAT-CTT-HT + 485 3 301 307 315 # CAT-CTT-HT + 486 1 301 306 305 # CAT-CAO-CAM + 487 2 301 306 312 # CAT-CAO-HAT + 488 4 302 301 307 # CAO-CAT-CTT + 489 5 302 301 306 # CAO-CAT-CAO + 490 6 302 303 304 # CAO-CAM-CAP + 491 7 302 303 309 # CAO-CAM-HAT + 492 8 303 302 308 # CAM-CAO-HAT + 493 9 303 304 305 # CAM-CAP-CAM + 494 10 303 304 310 # CAM-CAP-HAT + 495 11 304 303 309 # CAP-CAM-HAT + 496 6 306 305 304 # CAO-CAM-CAP + 497 11 304 305 311 # CAP-CAM-HAT + 498 10 305 304 310 # CAM-CAP-HAT + 499 8 305 306 312 # CAM-CAO-HAT + 500 7 306 305 311 # CAO-CAM-HAT + 501 4 306 301 307 # CAO-CAT-CTT + 502 12 313 307 314 # HT-CTT-HT + 503 12 313 307 315 # HT-CTT-HT + 504 12 314 307 315 # HT-CTT-HT + 505 1 316 317 318 # CAT-CAO-CAM + 506 2 316 317 323 # CAT-CAO-HAT + 507 3 316 322 328 # CAT-CTT-HT + 508 3 316 322 329 # CAT-CTT-HT + 509 3 316 322 330 # CAT-CTT-HT + 510 1 316 321 320 # CAT-CAO-CAM + 511 2 316 321 327 # CAT-CAO-HAT + 512 4 317 316 322 # CAO-CAT-CTT + 513 5 317 316 321 # CAO-CAT-CAO + 514 6 317 318 319 # CAO-CAM-CAP + 515 7 317 318 324 # CAO-CAM-HAT + 516 8 318 317 323 # CAM-CAO-HAT + 517 9 318 319 320 # CAM-CAP-CAM + 518 10 318 319 325 # CAM-CAP-HAT + 519 11 319 318 324 # CAP-CAM-HAT + 520 6 321 320 319 # CAO-CAM-CAP + 521 11 319 320 326 # CAP-CAM-HAT + 522 10 320 319 325 # CAM-CAP-HAT + 523 8 320 321 327 # CAM-CAO-HAT + 524 7 321 320 326 # CAO-CAM-HAT + 525 4 321 316 322 # CAO-CAT-CTT + 526 12 328 322 329 # HT-CTT-HT + 527 12 328 322 330 # HT-CTT-HT + 528 12 329 322 330 # HT-CTT-HT + 529 1 331 332 333 # CAT-CAO-CAM + 530 2 331 332 338 # CAT-CAO-HAT + 531 3 331 337 343 # CAT-CTT-HT + 532 3 331 337 344 # CAT-CTT-HT + 533 3 331 337 345 # CAT-CTT-HT + 534 1 331 336 335 # CAT-CAO-CAM + 535 2 331 336 342 # CAT-CAO-HAT + 536 4 332 331 337 # CAO-CAT-CTT + 537 5 332 331 336 # CAO-CAT-CAO + 538 6 332 333 334 # CAO-CAM-CAP + 539 7 332 333 339 # CAO-CAM-HAT + 540 8 333 332 338 # CAM-CAO-HAT + 541 9 333 334 335 # CAM-CAP-CAM + 542 10 333 334 340 # CAM-CAP-HAT + 543 11 334 333 339 # CAP-CAM-HAT + 544 6 336 335 334 # CAO-CAM-CAP + 545 11 334 335 341 # CAP-CAM-HAT + 546 10 335 334 340 # CAM-CAP-HAT + 547 8 335 336 342 # CAM-CAO-HAT + 548 7 336 335 341 # CAO-CAM-HAT + 549 4 336 331 337 # CAO-CAT-CTT + 550 12 343 337 344 # HT-CTT-HT + 551 12 343 337 345 # HT-CTT-HT + 552 12 344 337 345 # HT-CTT-HT + 553 1 346 347 348 # CAT-CAO-CAM + 554 2 346 347 353 # CAT-CAO-HAT + 555 3 346 352 358 # CAT-CTT-HT + 556 3 346 352 359 # CAT-CTT-HT + 557 3 346 352 360 # CAT-CTT-HT + 558 1 346 351 350 # CAT-CAO-CAM + 559 2 346 351 357 # CAT-CAO-HAT + 560 4 347 346 352 # CAO-CAT-CTT + 561 5 347 346 351 # CAO-CAT-CAO + 562 6 347 348 349 # CAO-CAM-CAP + 563 7 347 348 354 # CAO-CAM-HAT + 564 8 348 347 353 # CAM-CAO-HAT + 565 9 348 349 350 # CAM-CAP-CAM + 566 10 348 349 355 # CAM-CAP-HAT + 567 11 349 348 354 # CAP-CAM-HAT + 568 6 351 350 349 # CAO-CAM-CAP + 569 11 349 350 356 # CAP-CAM-HAT + 570 10 350 349 355 # CAM-CAP-HAT + 571 8 350 351 357 # CAM-CAO-HAT + 572 7 351 350 356 # CAO-CAM-HAT + 573 4 351 346 352 # CAO-CAT-CTT + 574 12 358 352 359 # HT-CTT-HT + 575 12 358 352 360 # HT-CTT-HT + 576 12 359 352 360 # HT-CTT-HT + 577 1 361 362 363 # CAT-CAO-CAM + 578 2 361 362 368 # CAT-CAO-HAT + 579 3 361 367 373 # CAT-CTT-HT + 580 3 361 367 374 # CAT-CTT-HT + 581 3 361 367 375 # CAT-CTT-HT + 582 1 361 366 365 # CAT-CAO-CAM + 583 2 361 366 372 # CAT-CAO-HAT + 584 4 362 361 367 # CAO-CAT-CTT + 585 5 362 361 366 # CAO-CAT-CAO + 586 6 362 363 364 # CAO-CAM-CAP + 587 7 362 363 369 # CAO-CAM-HAT + 588 8 363 362 368 # CAM-CAO-HAT + 589 9 363 364 365 # CAM-CAP-CAM + 590 10 363 364 370 # CAM-CAP-HAT + 591 11 364 363 369 # CAP-CAM-HAT + 592 6 366 365 364 # CAO-CAM-CAP + 593 11 364 365 371 # CAP-CAM-HAT + 594 10 365 364 370 # CAM-CAP-HAT + 595 8 365 366 372 # CAM-CAO-HAT + 596 7 366 365 371 # CAO-CAM-HAT + 597 4 366 361 367 # CAO-CAT-CTT + 598 12 373 367 374 # HT-CTT-HT + 599 12 373 367 375 # HT-CTT-HT + 600 12 374 367 375 # HT-CTT-HT + 601 1 376 377 378 # CAT-CAO-CAM + 602 2 376 377 383 # CAT-CAO-HAT + 603 3 376 382 388 # CAT-CTT-HT + 604 3 376 382 389 # CAT-CTT-HT + 605 3 376 382 390 # CAT-CTT-HT + 606 1 376 381 380 # CAT-CAO-CAM + 607 2 376 381 387 # CAT-CAO-HAT + 608 4 377 376 382 # CAO-CAT-CTT + 609 5 377 376 381 # CAO-CAT-CAO + 610 6 377 378 379 # CAO-CAM-CAP + 611 7 377 378 384 # CAO-CAM-HAT + 612 8 378 377 383 # CAM-CAO-HAT + 613 9 378 379 380 # CAM-CAP-CAM + 614 10 378 379 385 # CAM-CAP-HAT + 615 11 379 378 384 # CAP-CAM-HAT + 616 6 381 380 379 # CAO-CAM-CAP + 617 11 379 380 386 # CAP-CAM-HAT + 618 10 380 379 385 # CAM-CAP-HAT + 619 8 380 381 387 # CAM-CAO-HAT + 620 7 381 380 386 # CAO-CAM-HAT + 621 4 381 376 382 # CAO-CAT-CTT + 622 12 388 382 389 # HT-CTT-HT + 623 12 388 382 390 # HT-CTT-HT + 624 12 389 382 390 # HT-CTT-HT + 625 1 391 392 393 # CAT-CAO-CAM + 626 2 391 392 398 # CAT-CAO-HAT + 627 3 391 397 403 # CAT-CTT-HT + 628 3 391 397 404 # CAT-CTT-HT + 629 3 391 397 405 # CAT-CTT-HT + 630 1 391 396 395 # CAT-CAO-CAM + 631 2 391 396 402 # CAT-CAO-HAT + 632 4 392 391 397 # CAO-CAT-CTT + 633 5 392 391 396 # CAO-CAT-CAO + 634 6 392 393 394 # CAO-CAM-CAP + 635 7 392 393 399 # CAO-CAM-HAT + 636 8 393 392 398 # CAM-CAO-HAT + 637 9 393 394 395 # CAM-CAP-CAM + 638 10 393 394 400 # CAM-CAP-HAT + 639 11 394 393 399 # CAP-CAM-HAT + 640 6 396 395 394 # CAO-CAM-CAP + 641 11 394 395 401 # CAP-CAM-HAT + 642 10 395 394 400 # CAM-CAP-HAT + 643 8 395 396 402 # CAM-CAO-HAT + 644 7 396 395 401 # CAO-CAM-HAT + 645 4 396 391 397 # CAO-CAT-CTT + 646 12 403 397 404 # HT-CTT-HT + 647 12 403 397 405 # HT-CTT-HT + 648 12 404 397 405 # HT-CTT-HT + 649 1 406 407 408 # CAT-CAO-CAM + 650 2 406 407 413 # CAT-CAO-HAT + 651 3 406 412 418 # CAT-CTT-HT + 652 3 406 412 419 # CAT-CTT-HT + 653 3 406 412 420 # CAT-CTT-HT + 654 1 406 411 410 # CAT-CAO-CAM + 655 2 406 411 417 # CAT-CAO-HAT + 656 4 407 406 412 # CAO-CAT-CTT + 657 5 407 406 411 # CAO-CAT-CAO + 658 6 407 408 409 # CAO-CAM-CAP + 659 7 407 408 414 # CAO-CAM-HAT + 660 8 408 407 413 # CAM-CAO-HAT + 661 9 408 409 410 # CAM-CAP-CAM + 662 10 408 409 415 # CAM-CAP-HAT + 663 11 409 408 414 # CAP-CAM-HAT + 664 6 411 410 409 # CAO-CAM-CAP + 665 11 409 410 416 # CAP-CAM-HAT + 666 10 410 409 415 # CAM-CAP-HAT + 667 8 410 411 417 # CAM-CAO-HAT + 668 7 411 410 416 # CAO-CAM-HAT + 669 4 411 406 412 # CAO-CAT-CTT + 670 12 418 412 419 # HT-CTT-HT + 671 12 418 412 420 # HT-CTT-HT + 672 12 419 412 420 # HT-CTT-HT + 673 1 421 422 423 # CAT-CAO-CAM + 674 2 421 422 428 # CAT-CAO-HAT + 675 3 421 427 433 # CAT-CTT-HT + 676 3 421 427 434 # CAT-CTT-HT + 677 3 421 427 435 # CAT-CTT-HT + 678 1 421 426 425 # CAT-CAO-CAM + 679 2 421 426 432 # CAT-CAO-HAT + 680 4 422 421 427 # CAO-CAT-CTT + 681 5 422 421 426 # CAO-CAT-CAO + 682 6 422 423 424 # CAO-CAM-CAP + 683 7 422 423 429 # CAO-CAM-HAT + 684 8 423 422 428 # CAM-CAO-HAT + 685 9 423 424 425 # CAM-CAP-CAM + 686 10 423 424 430 # CAM-CAP-HAT + 687 11 424 423 429 # CAP-CAM-HAT + 688 6 426 425 424 # CAO-CAM-CAP + 689 11 424 425 431 # CAP-CAM-HAT + 690 10 425 424 430 # CAM-CAP-HAT + 691 8 425 426 432 # CAM-CAO-HAT + 692 7 426 425 431 # CAO-CAM-HAT + 693 4 426 421 427 # CAO-CAT-CTT + 694 12 433 427 434 # HT-CTT-HT + 695 12 433 427 435 # HT-CTT-HT + 696 12 434 427 435 # HT-CTT-HT + 697 1 436 437 438 # CAT-CAO-CAM + 698 2 436 437 443 # CAT-CAO-HAT + 699 3 436 442 448 # CAT-CTT-HT + 700 3 436 442 449 # CAT-CTT-HT + 701 3 436 442 450 # CAT-CTT-HT + 702 1 436 441 440 # CAT-CAO-CAM + 703 2 436 441 447 # CAT-CAO-HAT + 704 4 437 436 442 # CAO-CAT-CTT + 705 5 437 436 441 # CAO-CAT-CAO + 706 6 437 438 439 # CAO-CAM-CAP + 707 7 437 438 444 # CAO-CAM-HAT + 708 8 438 437 443 # CAM-CAO-HAT + 709 9 438 439 440 # CAM-CAP-CAM + 710 10 438 439 445 # CAM-CAP-HAT + 711 11 439 438 444 # CAP-CAM-HAT + 712 6 441 440 439 # CAO-CAM-CAP + 713 11 439 440 446 # CAP-CAM-HAT + 714 10 440 439 445 # CAM-CAP-HAT + 715 8 440 441 447 # CAM-CAO-HAT + 716 7 441 440 446 # CAO-CAM-HAT + 717 4 441 436 442 # CAO-CAT-CTT + 718 12 448 442 449 # HT-CTT-HT + 719 12 448 442 450 # HT-CTT-HT + 720 12 449 442 450 # HT-CTT-HT + 721 1 451 452 453 # CAT-CAO-CAM + 722 2 451 452 458 # CAT-CAO-HAT + 723 3 451 457 463 # CAT-CTT-HT + 724 3 451 457 464 # CAT-CTT-HT + 725 3 451 457 465 # CAT-CTT-HT + 726 1 451 456 455 # CAT-CAO-CAM + 727 2 451 456 462 # CAT-CAO-HAT + 728 4 452 451 457 # CAO-CAT-CTT + 729 5 452 451 456 # CAO-CAT-CAO + 730 6 452 453 454 # CAO-CAM-CAP + 731 7 452 453 459 # CAO-CAM-HAT + 732 8 453 452 458 # CAM-CAO-HAT + 733 9 453 454 455 # CAM-CAP-CAM + 734 10 453 454 460 # CAM-CAP-HAT + 735 11 454 453 459 # CAP-CAM-HAT + 736 6 456 455 454 # CAO-CAM-CAP + 737 11 454 455 461 # CAP-CAM-HAT + 738 10 455 454 460 # CAM-CAP-HAT + 739 8 455 456 462 # CAM-CAO-HAT + 740 7 456 455 461 # CAO-CAM-HAT + 741 4 456 451 457 # CAO-CAT-CTT + 742 12 463 457 464 # HT-CTT-HT + 743 12 463 457 465 # HT-CTT-HT + 744 12 464 457 465 # HT-CTT-HT + 745 1 466 467 468 # CAT-CAO-CAM + 746 2 466 467 473 # CAT-CAO-HAT + 747 3 466 472 478 # CAT-CTT-HT + 748 3 466 472 479 # CAT-CTT-HT + 749 3 466 472 480 # CAT-CTT-HT + 750 1 466 471 470 # CAT-CAO-CAM + 751 2 466 471 477 # CAT-CAO-HAT + 752 4 467 466 472 # CAO-CAT-CTT + 753 5 467 466 471 # CAO-CAT-CAO + 754 6 467 468 469 # CAO-CAM-CAP + 755 7 467 468 474 # CAO-CAM-HAT + 756 8 468 467 473 # CAM-CAO-HAT + 757 9 468 469 470 # CAM-CAP-CAM + 758 10 468 469 475 # CAM-CAP-HAT + 759 11 469 468 474 # CAP-CAM-HAT + 760 6 471 470 469 # CAO-CAM-CAP + 761 11 469 470 476 # CAP-CAM-HAT + 762 10 470 469 475 # CAM-CAP-HAT + 763 8 470 471 477 # CAM-CAO-HAT + 764 7 471 470 476 # CAO-CAM-HAT + 765 4 471 466 472 # CAO-CAT-CTT + 766 12 478 472 479 # HT-CTT-HT + 767 12 478 472 480 # HT-CTT-HT + 768 12 479 472 480 # HT-CTT-HT + 769 1 481 482 483 # CAT-CAO-CAM + 770 2 481 482 488 # CAT-CAO-HAT + 771 3 481 487 493 # CAT-CTT-HT + 772 3 481 487 494 # CAT-CTT-HT + 773 3 481 487 495 # CAT-CTT-HT + 774 1 481 486 485 # CAT-CAO-CAM + 775 2 481 486 492 # CAT-CAO-HAT + 776 4 482 481 487 # CAO-CAT-CTT + 777 5 482 481 486 # CAO-CAT-CAO + 778 6 482 483 484 # CAO-CAM-CAP + 779 7 482 483 489 # CAO-CAM-HAT + 780 8 483 482 488 # CAM-CAO-HAT + 781 9 483 484 485 # CAM-CAP-CAM + 782 10 483 484 490 # CAM-CAP-HAT + 783 11 484 483 489 # CAP-CAM-HAT + 784 6 486 485 484 # CAO-CAM-CAP + 785 11 484 485 491 # CAP-CAM-HAT + 786 10 485 484 490 # CAM-CAP-HAT + 787 8 485 486 492 # CAM-CAO-HAT + 788 7 486 485 491 # CAO-CAM-HAT + 789 4 486 481 487 # CAO-CAT-CTT + 790 12 493 487 494 # HT-CTT-HT + 791 12 493 487 495 # HT-CTT-HT + 792 12 494 487 495 # HT-CTT-HT + 793 1 496 497 498 # CAT-CAO-CAM + 794 2 496 497 503 # CAT-CAO-HAT + 795 3 496 502 508 # CAT-CTT-HT + 796 3 496 502 509 # CAT-CTT-HT + 797 3 496 502 510 # CAT-CTT-HT + 798 1 496 501 500 # CAT-CAO-CAM + 799 2 496 501 507 # CAT-CAO-HAT + 800 4 497 496 502 # CAO-CAT-CTT + 801 5 497 496 501 # CAO-CAT-CAO + 802 6 497 498 499 # CAO-CAM-CAP + 803 7 497 498 504 # CAO-CAM-HAT + 804 8 498 497 503 # CAM-CAO-HAT + 805 9 498 499 500 # CAM-CAP-CAM + 806 10 498 499 505 # CAM-CAP-HAT + 807 11 499 498 504 # CAP-CAM-HAT + 808 6 501 500 499 # CAO-CAM-CAP + 809 11 499 500 506 # CAP-CAM-HAT + 810 10 500 499 505 # CAM-CAP-HAT + 811 8 500 501 507 # CAM-CAO-HAT + 812 7 501 500 506 # CAO-CAM-HAT + 813 4 501 496 502 # CAO-CAT-CTT + 814 12 508 502 509 # HT-CTT-HT + 815 12 508 502 510 # HT-CTT-HT + 816 12 509 502 510 # HT-CTT-HT + 817 1 511 512 513 # CAT-CAO-CAM + 818 2 511 512 518 # CAT-CAO-HAT + 819 3 511 517 523 # CAT-CTT-HT + 820 3 511 517 524 # CAT-CTT-HT + 821 3 511 517 525 # CAT-CTT-HT + 822 1 511 516 515 # CAT-CAO-CAM + 823 2 511 516 522 # CAT-CAO-HAT + 824 4 512 511 517 # CAO-CAT-CTT + 825 5 512 511 516 # CAO-CAT-CAO + 826 6 512 513 514 # CAO-CAM-CAP + 827 7 512 513 519 # CAO-CAM-HAT + 828 8 513 512 518 # CAM-CAO-HAT + 829 9 513 514 515 # CAM-CAP-CAM + 830 10 513 514 520 # CAM-CAP-HAT + 831 11 514 513 519 # CAP-CAM-HAT + 832 6 516 515 514 # CAO-CAM-CAP + 833 11 514 515 521 # CAP-CAM-HAT + 834 10 515 514 520 # CAM-CAP-HAT + 835 8 515 516 522 # CAM-CAO-HAT + 836 7 516 515 521 # CAO-CAM-HAT + 837 4 516 511 517 # CAO-CAT-CTT + 838 12 523 517 524 # HT-CTT-HT + 839 12 523 517 525 # HT-CTT-HT + 840 12 524 517 525 # HT-CTT-HT + 841 1 526 527 528 # CAT-CAO-CAM + 842 2 526 527 533 # CAT-CAO-HAT + 843 3 526 532 538 # CAT-CTT-HT + 844 3 526 532 539 # CAT-CTT-HT + 845 3 526 532 540 # CAT-CTT-HT + 846 1 526 531 530 # CAT-CAO-CAM + 847 2 526 531 537 # CAT-CAO-HAT + 848 4 527 526 532 # CAO-CAT-CTT + 849 5 527 526 531 # CAO-CAT-CAO + 850 6 527 528 529 # CAO-CAM-CAP + 851 7 527 528 534 # CAO-CAM-HAT + 852 8 528 527 533 # CAM-CAO-HAT + 853 9 528 529 530 # CAM-CAP-CAM + 854 10 528 529 535 # CAM-CAP-HAT + 855 11 529 528 534 # CAP-CAM-HAT + 856 6 531 530 529 # CAO-CAM-CAP + 857 11 529 530 536 # CAP-CAM-HAT + 858 10 530 529 535 # CAM-CAP-HAT + 859 8 530 531 537 # CAM-CAO-HAT + 860 7 531 530 536 # CAO-CAM-HAT + 861 4 531 526 532 # CAO-CAT-CTT + 862 12 538 532 539 # HT-CTT-HT + 863 12 538 532 540 # HT-CTT-HT + 864 12 539 532 540 # HT-CTT-HT + 865 1 541 542 543 # CAT-CAO-CAM + 866 2 541 542 548 # CAT-CAO-HAT + 867 3 541 547 553 # CAT-CTT-HT + 868 3 541 547 554 # CAT-CTT-HT + 869 3 541 547 555 # CAT-CTT-HT + 870 1 541 546 545 # CAT-CAO-CAM + 871 2 541 546 552 # CAT-CAO-HAT + 872 4 542 541 547 # CAO-CAT-CTT + 873 5 542 541 546 # CAO-CAT-CAO + 874 6 542 543 544 # CAO-CAM-CAP + 875 7 542 543 549 # CAO-CAM-HAT + 876 8 543 542 548 # CAM-CAO-HAT + 877 9 543 544 545 # CAM-CAP-CAM + 878 10 543 544 550 # CAM-CAP-HAT + 879 11 544 543 549 # CAP-CAM-HAT + 880 6 546 545 544 # CAO-CAM-CAP + 881 11 544 545 551 # CAP-CAM-HAT + 882 10 545 544 550 # CAM-CAP-HAT + 883 8 545 546 552 # CAM-CAO-HAT + 884 7 546 545 551 # CAO-CAM-HAT + 885 4 546 541 547 # CAO-CAT-CTT + 886 12 553 547 554 # HT-CTT-HT + 887 12 553 547 555 # HT-CTT-HT + 888 12 554 547 555 # HT-CTT-HT + 889 1 556 557 558 # CAT-CAO-CAM + 890 2 556 557 563 # CAT-CAO-HAT + 891 3 556 562 568 # CAT-CTT-HT + 892 3 556 562 569 # CAT-CTT-HT + 893 3 556 562 570 # CAT-CTT-HT + 894 1 556 561 560 # CAT-CAO-CAM + 895 2 556 561 567 # CAT-CAO-HAT + 896 4 557 556 562 # CAO-CAT-CTT + 897 5 557 556 561 # CAO-CAT-CAO + 898 6 557 558 559 # CAO-CAM-CAP + 899 7 557 558 564 # CAO-CAM-HAT + 900 8 558 557 563 # CAM-CAO-HAT + 901 9 558 559 560 # CAM-CAP-CAM + 902 10 558 559 565 # CAM-CAP-HAT + 903 11 559 558 564 # CAP-CAM-HAT + 904 6 561 560 559 # CAO-CAM-CAP + 905 11 559 560 566 # CAP-CAM-HAT + 906 10 560 559 565 # CAM-CAP-HAT + 907 8 560 561 567 # CAM-CAO-HAT + 908 7 561 560 566 # CAO-CAM-HAT + 909 4 561 556 562 # CAO-CAT-CTT + 910 12 568 562 569 # HT-CTT-HT + 911 12 568 562 570 # HT-CTT-HT + 912 12 569 562 570 # HT-CTT-HT + 913 1 571 572 573 # CAT-CAO-CAM + 914 2 571 572 578 # CAT-CAO-HAT + 915 3 571 577 583 # CAT-CTT-HT + 916 3 571 577 584 # CAT-CTT-HT + 917 3 571 577 585 # CAT-CTT-HT + 918 1 571 576 575 # CAT-CAO-CAM + 919 2 571 576 582 # CAT-CAO-HAT + 920 4 572 571 577 # CAO-CAT-CTT + 921 5 572 571 576 # CAO-CAT-CAO + 922 6 572 573 574 # CAO-CAM-CAP + 923 7 572 573 579 # CAO-CAM-HAT + 924 8 573 572 578 # CAM-CAO-HAT + 925 9 573 574 575 # CAM-CAP-CAM + 926 10 573 574 580 # CAM-CAP-HAT + 927 11 574 573 579 # CAP-CAM-HAT + 928 6 576 575 574 # CAO-CAM-CAP + 929 11 574 575 581 # CAP-CAM-HAT + 930 10 575 574 580 # CAM-CAP-HAT + 931 8 575 576 582 # CAM-CAO-HAT + 932 7 576 575 581 # CAO-CAM-HAT + 933 4 576 571 577 # CAO-CAT-CTT + 934 12 583 577 584 # HT-CTT-HT + 935 12 583 577 585 # HT-CTT-HT + 936 12 584 577 585 # HT-CTT-HT + 937 1 586 587 588 # CAT-CAO-CAM + 938 2 586 587 593 # CAT-CAO-HAT + 939 3 586 592 598 # CAT-CTT-HT + 940 3 586 592 599 # CAT-CTT-HT + 941 3 586 592 600 # CAT-CTT-HT + 942 1 586 591 590 # CAT-CAO-CAM + 943 2 586 591 597 # CAT-CAO-HAT + 944 4 587 586 592 # CAO-CAT-CTT + 945 5 587 586 591 # CAO-CAT-CAO + 946 6 587 588 589 # CAO-CAM-CAP + 947 7 587 588 594 # CAO-CAM-HAT + 948 8 588 587 593 # CAM-CAO-HAT + 949 9 588 589 590 # CAM-CAP-CAM + 950 10 588 589 595 # CAM-CAP-HAT + 951 11 589 588 594 # CAP-CAM-HAT + 952 6 591 590 589 # CAO-CAM-CAP + 953 11 589 590 596 # CAP-CAM-HAT + 954 10 590 589 595 # CAM-CAP-HAT + 955 8 590 591 597 # CAM-CAO-HAT + 956 7 591 590 596 # CAO-CAM-HAT + 957 4 591 586 592 # CAO-CAT-CTT + 958 12 598 592 599 # HT-CTT-HT + 959 12 598 592 600 # HT-CTT-HT + 960 12 599 592 600 # HT-CTT-HT + 961 1 601 602 603 # CAT-CAO-CAM + 962 2 601 602 608 # CAT-CAO-HAT + 963 3 601 607 613 # CAT-CTT-HT + 964 3 601 607 614 # CAT-CTT-HT + 965 3 601 607 615 # CAT-CTT-HT + 966 1 601 606 605 # CAT-CAO-CAM + 967 2 601 606 612 # CAT-CAO-HAT + 968 4 602 601 607 # CAO-CAT-CTT + 969 5 602 601 606 # CAO-CAT-CAO + 970 6 602 603 604 # CAO-CAM-CAP + 971 7 602 603 609 # CAO-CAM-HAT + 972 8 603 602 608 # CAM-CAO-HAT + 973 9 603 604 605 # CAM-CAP-CAM + 974 10 603 604 610 # CAM-CAP-HAT + 975 11 604 603 609 # CAP-CAM-HAT + 976 6 606 605 604 # CAO-CAM-CAP + 977 11 604 605 611 # CAP-CAM-HAT + 978 10 605 604 610 # CAM-CAP-HAT + 979 8 605 606 612 # CAM-CAO-HAT + 980 7 606 605 611 # CAO-CAM-HAT + 981 4 606 601 607 # CAO-CAT-CTT + 982 12 613 607 614 # HT-CTT-HT + 983 12 613 607 615 # HT-CTT-HT + 984 12 614 607 615 # HT-CTT-HT + 985 1 616 617 618 # CAT-CAO-CAM + 986 2 616 617 623 # CAT-CAO-HAT + 987 3 616 622 628 # CAT-CTT-HT + 988 3 616 622 629 # CAT-CTT-HT + 989 3 616 622 630 # CAT-CTT-HT + 990 1 616 621 620 # CAT-CAO-CAM + 991 2 616 621 627 # CAT-CAO-HAT + 992 4 617 616 622 # CAO-CAT-CTT + 993 5 617 616 621 # CAO-CAT-CAO + 994 6 617 618 619 # CAO-CAM-CAP + 995 7 617 618 624 # CAO-CAM-HAT + 996 8 618 617 623 # CAM-CAO-HAT + 997 9 618 619 620 # CAM-CAP-CAM + 998 10 618 619 625 # CAM-CAP-HAT + 999 11 619 618 624 # CAP-CAM-HAT + 1000 6 621 620 619 # CAO-CAM-CAP + 1001 11 619 620 626 # CAP-CAM-HAT + 1002 10 620 619 625 # CAM-CAP-HAT + 1003 8 620 621 627 # CAM-CAO-HAT + 1004 7 621 620 626 # CAO-CAM-HAT + 1005 4 621 616 622 # CAO-CAT-CTT + 1006 12 628 622 629 # HT-CTT-HT + 1007 12 628 622 630 # HT-CTT-HT + 1008 12 629 622 630 # HT-CTT-HT + 1009 1 631 632 633 # CAT-CAO-CAM + 1010 2 631 632 638 # CAT-CAO-HAT + 1011 3 631 637 643 # CAT-CTT-HT + 1012 3 631 637 644 # CAT-CTT-HT + 1013 3 631 637 645 # CAT-CTT-HT + 1014 1 631 636 635 # CAT-CAO-CAM + 1015 2 631 636 642 # CAT-CAO-HAT + 1016 4 632 631 637 # CAO-CAT-CTT + 1017 5 632 631 636 # CAO-CAT-CAO + 1018 6 632 633 634 # CAO-CAM-CAP + 1019 7 632 633 639 # CAO-CAM-HAT + 1020 8 633 632 638 # CAM-CAO-HAT + 1021 9 633 634 635 # CAM-CAP-CAM + 1022 10 633 634 640 # CAM-CAP-HAT + 1023 11 634 633 639 # CAP-CAM-HAT + 1024 6 636 635 634 # CAO-CAM-CAP + 1025 11 634 635 641 # CAP-CAM-HAT + 1026 10 635 634 640 # CAM-CAP-HAT + 1027 8 635 636 642 # CAM-CAO-HAT + 1028 7 636 635 641 # CAO-CAM-HAT + 1029 4 636 631 637 # CAO-CAT-CTT + 1030 12 643 637 644 # HT-CTT-HT + 1031 12 643 637 645 # HT-CTT-HT + 1032 12 644 637 645 # HT-CTT-HT + 1033 1 646 647 648 # CAT-CAO-CAM + 1034 2 646 647 653 # CAT-CAO-HAT + 1035 3 646 652 658 # CAT-CTT-HT + 1036 3 646 652 659 # CAT-CTT-HT + 1037 3 646 652 660 # CAT-CTT-HT + 1038 1 646 651 650 # CAT-CAO-CAM + 1039 2 646 651 657 # CAT-CAO-HAT + 1040 4 647 646 652 # CAO-CAT-CTT + 1041 5 647 646 651 # CAO-CAT-CAO + 1042 6 647 648 649 # CAO-CAM-CAP + 1043 7 647 648 654 # CAO-CAM-HAT + 1044 8 648 647 653 # CAM-CAO-HAT + 1045 9 648 649 650 # CAM-CAP-CAM + 1046 10 648 649 655 # CAM-CAP-HAT + 1047 11 649 648 654 # CAP-CAM-HAT + 1048 6 651 650 649 # CAO-CAM-CAP + 1049 11 649 650 656 # CAP-CAM-HAT + 1050 10 650 649 655 # CAM-CAP-HAT + 1051 8 650 651 657 # CAM-CAO-HAT + 1052 7 651 650 656 # CAO-CAM-HAT + 1053 4 651 646 652 # CAO-CAT-CTT + 1054 12 658 652 659 # HT-CTT-HT + 1055 12 658 652 660 # HT-CTT-HT + 1056 12 659 652 660 # HT-CTT-HT + 1057 1 661 662 663 # CAT-CAO-CAM + 1058 2 661 662 668 # CAT-CAO-HAT + 1059 3 661 667 673 # CAT-CTT-HT + 1060 3 661 667 674 # CAT-CTT-HT + 1061 3 661 667 675 # CAT-CTT-HT + 1062 1 661 666 665 # CAT-CAO-CAM + 1063 2 661 666 672 # CAT-CAO-HAT + 1064 4 662 661 667 # CAO-CAT-CTT + 1065 5 662 661 666 # CAO-CAT-CAO + 1066 6 662 663 664 # CAO-CAM-CAP + 1067 7 662 663 669 # CAO-CAM-HAT + 1068 8 663 662 668 # CAM-CAO-HAT + 1069 9 663 664 665 # CAM-CAP-CAM + 1070 10 663 664 670 # CAM-CAP-HAT + 1071 11 664 663 669 # CAP-CAM-HAT + 1072 6 666 665 664 # CAO-CAM-CAP + 1073 11 664 665 671 # CAP-CAM-HAT + 1074 10 665 664 670 # CAM-CAP-HAT + 1075 8 665 666 672 # CAM-CAO-HAT + 1076 7 666 665 671 # CAO-CAM-HAT + 1077 4 666 661 667 # CAO-CAT-CTT + 1078 12 673 667 674 # HT-CTT-HT + 1079 12 673 667 675 # HT-CTT-HT + 1080 12 674 667 675 # HT-CTT-HT + 1081 1 676 677 678 # CAT-CAO-CAM + 1082 2 676 677 683 # CAT-CAO-HAT + 1083 3 676 682 688 # CAT-CTT-HT + 1084 3 676 682 689 # CAT-CTT-HT + 1085 3 676 682 690 # CAT-CTT-HT + 1086 1 676 681 680 # CAT-CAO-CAM + 1087 2 676 681 687 # CAT-CAO-HAT + 1088 4 677 676 682 # CAO-CAT-CTT + 1089 5 677 676 681 # CAO-CAT-CAO + 1090 6 677 678 679 # CAO-CAM-CAP + 1091 7 677 678 684 # CAO-CAM-HAT + 1092 8 678 677 683 # CAM-CAO-HAT + 1093 9 678 679 680 # CAM-CAP-CAM + 1094 10 678 679 685 # CAM-CAP-HAT + 1095 11 679 678 684 # CAP-CAM-HAT + 1096 6 681 680 679 # CAO-CAM-CAP + 1097 11 679 680 686 # CAP-CAM-HAT + 1098 10 680 679 685 # CAM-CAP-HAT + 1099 8 680 681 687 # CAM-CAO-HAT + 1100 7 681 680 686 # CAO-CAM-HAT + 1101 4 681 676 682 # CAO-CAT-CTT + 1102 12 688 682 689 # HT-CTT-HT + 1103 12 688 682 690 # HT-CTT-HT + 1104 12 689 682 690 # HT-CTT-HT + 1105 1 691 692 693 # CAT-CAO-CAM + 1106 2 691 692 698 # CAT-CAO-HAT + 1107 3 691 697 703 # CAT-CTT-HT + 1108 3 691 697 704 # CAT-CTT-HT + 1109 3 691 697 705 # CAT-CTT-HT + 1110 1 691 696 695 # CAT-CAO-CAM + 1111 2 691 696 702 # CAT-CAO-HAT + 1112 4 692 691 697 # CAO-CAT-CTT + 1113 5 692 691 696 # CAO-CAT-CAO + 1114 6 692 693 694 # CAO-CAM-CAP + 1115 7 692 693 699 # CAO-CAM-HAT + 1116 8 693 692 698 # CAM-CAO-HAT + 1117 9 693 694 695 # CAM-CAP-CAM + 1118 10 693 694 700 # CAM-CAP-HAT + 1119 11 694 693 699 # CAP-CAM-HAT + 1120 6 696 695 694 # CAO-CAM-CAP + 1121 11 694 695 701 # CAP-CAM-HAT + 1122 10 695 694 700 # CAM-CAP-HAT + 1123 8 695 696 702 # CAM-CAO-HAT + 1124 7 696 695 701 # CAO-CAM-HAT + 1125 4 696 691 697 # CAO-CAT-CTT + 1126 12 703 697 704 # HT-CTT-HT + 1127 12 703 697 705 # HT-CTT-HT + 1128 12 704 697 705 # HT-CTT-HT + 1129 1 706 707 708 # CAT-CAO-CAM + 1130 2 706 707 713 # CAT-CAO-HAT + 1131 3 706 712 718 # CAT-CTT-HT + 1132 3 706 712 719 # CAT-CTT-HT + 1133 3 706 712 720 # CAT-CTT-HT + 1134 1 706 711 710 # CAT-CAO-CAM + 1135 2 706 711 717 # CAT-CAO-HAT + 1136 4 707 706 712 # CAO-CAT-CTT + 1137 5 707 706 711 # CAO-CAT-CAO + 1138 6 707 708 709 # CAO-CAM-CAP + 1139 7 707 708 714 # CAO-CAM-HAT + 1140 8 708 707 713 # CAM-CAO-HAT + 1141 9 708 709 710 # CAM-CAP-CAM + 1142 10 708 709 715 # CAM-CAP-HAT + 1143 11 709 708 714 # CAP-CAM-HAT + 1144 6 711 710 709 # CAO-CAM-CAP + 1145 11 709 710 716 # CAP-CAM-HAT + 1146 10 710 709 715 # CAM-CAP-HAT + 1147 8 710 711 717 # CAM-CAO-HAT + 1148 7 711 710 716 # CAO-CAM-HAT + 1149 4 711 706 712 # CAO-CAT-CTT + 1150 12 718 712 719 # HT-CTT-HT + 1151 12 718 712 720 # HT-CTT-HT + 1152 12 719 712 720 # HT-CTT-HT + 1153 1 721 722 723 # CAT-CAO-CAM + 1154 2 721 722 728 # CAT-CAO-HAT + 1155 3 721 727 733 # CAT-CTT-HT + 1156 3 721 727 734 # CAT-CTT-HT + 1157 3 721 727 735 # CAT-CTT-HT + 1158 1 721 726 725 # CAT-CAO-CAM + 1159 2 721 726 732 # CAT-CAO-HAT + 1160 4 722 721 727 # CAO-CAT-CTT + 1161 5 722 721 726 # CAO-CAT-CAO + 1162 6 722 723 724 # CAO-CAM-CAP + 1163 7 722 723 729 # CAO-CAM-HAT + 1164 8 723 722 728 # CAM-CAO-HAT + 1165 9 723 724 725 # CAM-CAP-CAM + 1166 10 723 724 730 # CAM-CAP-HAT + 1167 11 724 723 729 # CAP-CAM-HAT + 1168 6 726 725 724 # CAO-CAM-CAP + 1169 11 724 725 731 # CAP-CAM-HAT + 1170 10 725 724 730 # CAM-CAP-HAT + 1171 8 725 726 732 # CAM-CAO-HAT + 1172 7 726 725 731 # CAO-CAM-HAT + 1173 4 726 721 727 # CAO-CAT-CTT + 1174 12 733 727 734 # HT-CTT-HT + 1175 12 733 727 735 # HT-CTT-HT + 1176 12 734 727 735 # HT-CTT-HT + 1177 1 736 737 738 # CAT-CAO-CAM + 1178 2 736 737 743 # CAT-CAO-HAT + 1179 3 736 742 748 # CAT-CTT-HT + 1180 3 736 742 749 # CAT-CTT-HT + 1181 3 736 742 750 # CAT-CTT-HT + 1182 1 736 741 740 # CAT-CAO-CAM + 1183 2 736 741 747 # CAT-CAO-HAT + 1184 4 737 736 742 # CAO-CAT-CTT + 1185 5 737 736 741 # CAO-CAT-CAO + 1186 6 737 738 739 # CAO-CAM-CAP + 1187 7 737 738 744 # CAO-CAM-HAT + 1188 8 738 737 743 # CAM-CAO-HAT + 1189 9 738 739 740 # CAM-CAP-CAM + 1190 10 738 739 745 # CAM-CAP-HAT + 1191 11 739 738 744 # CAP-CAM-HAT + 1192 6 741 740 739 # CAO-CAM-CAP + 1193 11 739 740 746 # CAP-CAM-HAT + 1194 10 740 739 745 # CAM-CAP-HAT + 1195 8 740 741 747 # CAM-CAO-HAT + 1196 7 741 740 746 # CAO-CAM-HAT + 1197 4 741 736 742 # CAO-CAT-CTT + 1198 12 748 742 749 # HT-CTT-HT + 1199 12 748 742 750 # HT-CTT-HT + 1200 12 749 742 750 # HT-CTT-HT + 1201 1 751 752 753 # CAT-CAO-CAM + 1202 2 751 752 758 # CAT-CAO-HAT + 1203 3 751 757 763 # CAT-CTT-HT + 1204 3 751 757 764 # CAT-CTT-HT + 1205 3 751 757 765 # CAT-CTT-HT + 1206 1 751 756 755 # CAT-CAO-CAM + 1207 2 751 756 762 # CAT-CAO-HAT + 1208 4 752 751 757 # CAO-CAT-CTT + 1209 5 752 751 756 # CAO-CAT-CAO + 1210 6 752 753 754 # CAO-CAM-CAP + 1211 7 752 753 759 # CAO-CAM-HAT + 1212 8 753 752 758 # CAM-CAO-HAT + 1213 9 753 754 755 # CAM-CAP-CAM + 1214 10 753 754 760 # CAM-CAP-HAT + 1215 11 754 753 759 # CAP-CAM-HAT + 1216 6 756 755 754 # CAO-CAM-CAP + 1217 11 754 755 761 # CAP-CAM-HAT + 1218 10 755 754 760 # CAM-CAP-HAT + 1219 8 755 756 762 # CAM-CAO-HAT + 1220 7 756 755 761 # CAO-CAM-HAT + 1221 4 756 751 757 # CAO-CAT-CTT + 1222 12 763 757 764 # HT-CTT-HT + 1223 12 763 757 765 # HT-CTT-HT + 1224 12 764 757 765 # HT-CTT-HT + 1225 1 766 767 768 # CAT-CAO-CAM + 1226 2 766 767 773 # CAT-CAO-HAT + 1227 3 766 772 778 # CAT-CTT-HT + 1228 3 766 772 779 # CAT-CTT-HT + 1229 3 766 772 780 # CAT-CTT-HT + 1230 1 766 771 770 # CAT-CAO-CAM + 1231 2 766 771 777 # CAT-CAO-HAT + 1232 4 767 766 772 # CAO-CAT-CTT + 1233 5 767 766 771 # CAO-CAT-CAO + 1234 6 767 768 769 # CAO-CAM-CAP + 1235 7 767 768 774 # CAO-CAM-HAT + 1236 8 768 767 773 # CAM-CAO-HAT + 1237 9 768 769 770 # CAM-CAP-CAM + 1238 10 768 769 775 # CAM-CAP-HAT + 1239 11 769 768 774 # CAP-CAM-HAT + 1240 6 771 770 769 # CAO-CAM-CAP + 1241 11 769 770 776 # CAP-CAM-HAT + 1242 10 770 769 775 # CAM-CAP-HAT + 1243 8 770 771 777 # CAM-CAO-HAT + 1244 7 771 770 776 # CAO-CAM-HAT + 1245 4 771 766 772 # CAO-CAT-CTT + 1246 12 778 772 779 # HT-CTT-HT + 1247 12 778 772 780 # HT-CTT-HT + 1248 12 779 772 780 # HT-CTT-HT + 1249 1 781 782 783 # CAT-CAO-CAM + 1250 2 781 782 788 # CAT-CAO-HAT + 1251 3 781 787 793 # CAT-CTT-HT + 1252 3 781 787 794 # CAT-CTT-HT + 1253 3 781 787 795 # CAT-CTT-HT + 1254 1 781 786 785 # CAT-CAO-CAM + 1255 2 781 786 792 # CAT-CAO-HAT + 1256 4 782 781 787 # CAO-CAT-CTT + 1257 5 782 781 786 # CAO-CAT-CAO + 1258 6 782 783 784 # CAO-CAM-CAP + 1259 7 782 783 789 # CAO-CAM-HAT + 1260 8 783 782 788 # CAM-CAO-HAT + 1261 9 783 784 785 # CAM-CAP-CAM + 1262 10 783 784 790 # CAM-CAP-HAT + 1263 11 784 783 789 # CAP-CAM-HAT + 1264 6 786 785 784 # CAO-CAM-CAP + 1265 11 784 785 791 # CAP-CAM-HAT + 1266 10 785 784 790 # CAM-CAP-HAT + 1267 8 785 786 792 # CAM-CAO-HAT + 1268 7 786 785 791 # CAO-CAM-HAT + 1269 4 786 781 787 # CAO-CAT-CTT + 1270 12 793 787 794 # HT-CTT-HT + 1271 12 793 787 795 # HT-CTT-HT + 1272 12 794 787 795 # HT-CTT-HT + 1273 1 796 797 798 # CAT-CAO-CAM + 1274 2 796 797 803 # CAT-CAO-HAT + 1275 3 796 802 808 # CAT-CTT-HT + 1276 3 796 802 809 # CAT-CTT-HT + 1277 3 796 802 810 # CAT-CTT-HT + 1278 1 796 801 800 # CAT-CAO-CAM + 1279 2 796 801 807 # CAT-CAO-HAT + 1280 4 797 796 802 # CAO-CAT-CTT + 1281 5 797 796 801 # CAO-CAT-CAO + 1282 6 797 798 799 # CAO-CAM-CAP + 1283 7 797 798 804 # CAO-CAM-HAT + 1284 8 798 797 803 # CAM-CAO-HAT + 1285 9 798 799 800 # CAM-CAP-CAM + 1286 10 798 799 805 # CAM-CAP-HAT + 1287 11 799 798 804 # CAP-CAM-HAT + 1288 6 801 800 799 # CAO-CAM-CAP + 1289 11 799 800 806 # CAP-CAM-HAT + 1290 10 800 799 805 # CAM-CAP-HAT + 1291 8 800 801 807 # CAM-CAO-HAT + 1292 7 801 800 806 # CAO-CAM-HAT + 1293 4 801 796 802 # CAO-CAT-CTT + 1294 12 808 802 809 # HT-CTT-HT + 1295 12 808 802 810 # HT-CTT-HT + 1296 12 809 802 810 # HT-CTT-HT + 1297 1 811 812 813 # CAT-CAO-CAM + 1298 2 811 812 818 # CAT-CAO-HAT + 1299 3 811 817 823 # CAT-CTT-HT + 1300 3 811 817 824 # CAT-CTT-HT + 1301 3 811 817 825 # CAT-CTT-HT + 1302 1 811 816 815 # CAT-CAO-CAM + 1303 2 811 816 822 # CAT-CAO-HAT + 1304 4 812 811 817 # CAO-CAT-CTT + 1305 5 812 811 816 # CAO-CAT-CAO + 1306 6 812 813 814 # CAO-CAM-CAP + 1307 7 812 813 819 # CAO-CAM-HAT + 1308 8 813 812 818 # CAM-CAO-HAT + 1309 9 813 814 815 # CAM-CAP-CAM + 1310 10 813 814 820 # CAM-CAP-HAT + 1311 11 814 813 819 # CAP-CAM-HAT + 1312 6 816 815 814 # CAO-CAM-CAP + 1313 11 814 815 821 # CAP-CAM-HAT + 1314 10 815 814 820 # CAM-CAP-HAT + 1315 8 815 816 822 # CAM-CAO-HAT + 1316 7 816 815 821 # CAO-CAM-HAT + 1317 4 816 811 817 # CAO-CAT-CTT + 1318 12 823 817 824 # HT-CTT-HT + 1319 12 823 817 825 # HT-CTT-HT + 1320 12 824 817 825 # HT-CTT-HT + 1321 1 826 827 828 # CAT-CAO-CAM + 1322 2 826 827 833 # CAT-CAO-HAT + 1323 3 826 832 838 # CAT-CTT-HT + 1324 3 826 832 839 # CAT-CTT-HT + 1325 3 826 832 840 # CAT-CTT-HT + 1326 1 826 831 830 # CAT-CAO-CAM + 1327 2 826 831 837 # CAT-CAO-HAT + 1328 4 827 826 832 # CAO-CAT-CTT + 1329 5 827 826 831 # CAO-CAT-CAO + 1330 6 827 828 829 # CAO-CAM-CAP + 1331 7 827 828 834 # CAO-CAM-HAT + 1332 8 828 827 833 # CAM-CAO-HAT + 1333 9 828 829 830 # CAM-CAP-CAM + 1334 10 828 829 835 # CAM-CAP-HAT + 1335 11 829 828 834 # CAP-CAM-HAT + 1336 6 831 830 829 # CAO-CAM-CAP + 1337 11 829 830 836 # CAP-CAM-HAT + 1338 10 830 829 835 # CAM-CAP-HAT + 1339 8 830 831 837 # CAM-CAO-HAT + 1340 7 831 830 836 # CAO-CAM-HAT + 1341 4 831 826 832 # CAO-CAT-CTT + 1342 12 838 832 839 # HT-CTT-HT + 1343 12 838 832 840 # HT-CTT-HT + 1344 12 839 832 840 # HT-CTT-HT + 1345 1 841 842 843 # CAT-CAO-CAM + 1346 2 841 842 848 # CAT-CAO-HAT + 1347 3 841 847 853 # CAT-CTT-HT + 1348 3 841 847 854 # CAT-CTT-HT + 1349 3 841 847 855 # CAT-CTT-HT + 1350 1 841 846 845 # CAT-CAO-CAM + 1351 2 841 846 852 # CAT-CAO-HAT + 1352 4 842 841 847 # CAO-CAT-CTT + 1353 5 842 841 846 # CAO-CAT-CAO + 1354 6 842 843 844 # CAO-CAM-CAP + 1355 7 842 843 849 # CAO-CAM-HAT + 1356 8 843 842 848 # CAM-CAO-HAT + 1357 9 843 844 845 # CAM-CAP-CAM + 1358 10 843 844 850 # CAM-CAP-HAT + 1359 11 844 843 849 # CAP-CAM-HAT + 1360 6 846 845 844 # CAO-CAM-CAP + 1361 11 844 845 851 # CAP-CAM-HAT + 1362 10 845 844 850 # CAM-CAP-HAT + 1363 8 845 846 852 # CAM-CAO-HAT + 1364 7 846 845 851 # CAO-CAM-HAT + 1365 4 846 841 847 # CAO-CAT-CTT + 1366 12 853 847 854 # HT-CTT-HT + 1367 12 853 847 855 # HT-CTT-HT + 1368 12 854 847 855 # HT-CTT-HT + 1369 1 856 857 858 # CAT-CAO-CAM + 1370 2 856 857 863 # CAT-CAO-HAT + 1371 3 856 862 868 # CAT-CTT-HT + 1372 3 856 862 869 # CAT-CTT-HT + 1373 3 856 862 870 # CAT-CTT-HT + 1374 1 856 861 860 # CAT-CAO-CAM + 1375 2 856 861 867 # CAT-CAO-HAT + 1376 4 857 856 862 # CAO-CAT-CTT + 1377 5 857 856 861 # CAO-CAT-CAO + 1378 6 857 858 859 # CAO-CAM-CAP + 1379 7 857 858 864 # CAO-CAM-HAT + 1380 8 858 857 863 # CAM-CAO-HAT + 1381 9 858 859 860 # CAM-CAP-CAM + 1382 10 858 859 865 # CAM-CAP-HAT + 1383 11 859 858 864 # CAP-CAM-HAT + 1384 6 861 860 859 # CAO-CAM-CAP + 1385 11 859 860 866 # CAP-CAM-HAT + 1386 10 860 859 865 # CAM-CAP-HAT + 1387 8 860 861 867 # CAM-CAO-HAT + 1388 7 861 860 866 # CAO-CAM-HAT + 1389 4 861 856 862 # CAO-CAT-CTT + 1390 12 868 862 869 # HT-CTT-HT + 1391 12 868 862 870 # HT-CTT-HT + 1392 12 869 862 870 # HT-CTT-HT + 1393 1 871 872 873 # CAT-CAO-CAM + 1394 2 871 872 878 # CAT-CAO-HAT + 1395 3 871 877 883 # CAT-CTT-HT + 1396 3 871 877 884 # CAT-CTT-HT + 1397 3 871 877 885 # CAT-CTT-HT + 1398 1 871 876 875 # CAT-CAO-CAM + 1399 2 871 876 882 # CAT-CAO-HAT + 1400 4 872 871 877 # CAO-CAT-CTT + 1401 5 872 871 876 # CAO-CAT-CAO + 1402 6 872 873 874 # CAO-CAM-CAP + 1403 7 872 873 879 # CAO-CAM-HAT + 1404 8 873 872 878 # CAM-CAO-HAT + 1405 9 873 874 875 # CAM-CAP-CAM + 1406 10 873 874 880 # CAM-CAP-HAT + 1407 11 874 873 879 # CAP-CAM-HAT + 1408 6 876 875 874 # CAO-CAM-CAP + 1409 11 874 875 881 # CAP-CAM-HAT + 1410 10 875 874 880 # CAM-CAP-HAT + 1411 8 875 876 882 # CAM-CAO-HAT + 1412 7 876 875 881 # CAO-CAM-HAT + 1413 4 876 871 877 # CAO-CAT-CTT + 1414 12 883 877 884 # HT-CTT-HT + 1415 12 883 877 885 # HT-CTT-HT + 1416 12 884 877 885 # HT-CTT-HT + 1417 1 886 887 888 # CAT-CAO-CAM + 1418 2 886 887 893 # CAT-CAO-HAT + 1419 3 886 892 898 # CAT-CTT-HT + 1420 3 886 892 899 # CAT-CTT-HT + 1421 3 886 892 900 # CAT-CTT-HT + 1422 1 886 891 890 # CAT-CAO-CAM + 1423 2 886 891 897 # CAT-CAO-HAT + 1424 4 887 886 892 # CAO-CAT-CTT + 1425 5 887 886 891 # CAO-CAT-CAO + 1426 6 887 888 889 # CAO-CAM-CAP + 1427 7 887 888 894 # CAO-CAM-HAT + 1428 8 888 887 893 # CAM-CAO-HAT + 1429 9 888 889 890 # CAM-CAP-CAM + 1430 10 888 889 895 # CAM-CAP-HAT + 1431 11 889 888 894 # CAP-CAM-HAT + 1432 6 891 890 889 # CAO-CAM-CAP + 1433 11 889 890 896 # CAP-CAM-HAT + 1434 10 890 889 895 # CAM-CAP-HAT + 1435 8 890 891 897 # CAM-CAO-HAT + 1436 7 891 890 896 # CAO-CAM-HAT + 1437 4 891 886 892 # CAO-CAT-CTT + 1438 12 898 892 899 # HT-CTT-HT + 1439 12 898 892 900 # HT-CTT-HT + 1440 12 899 892 900 # HT-CTT-HT + 1441 1 901 902 903 # CAT-CAO-CAM + 1442 2 901 902 908 # CAT-CAO-HAT + 1443 3 901 907 913 # CAT-CTT-HT + 1444 3 901 907 914 # CAT-CTT-HT + 1445 3 901 907 915 # CAT-CTT-HT + 1446 1 901 906 905 # CAT-CAO-CAM + 1447 2 901 906 912 # CAT-CAO-HAT + 1448 4 902 901 907 # CAO-CAT-CTT + 1449 5 902 901 906 # CAO-CAT-CAO + 1450 6 902 903 904 # CAO-CAM-CAP + 1451 7 902 903 909 # CAO-CAM-HAT + 1452 8 903 902 908 # CAM-CAO-HAT + 1453 9 903 904 905 # CAM-CAP-CAM + 1454 10 903 904 910 # CAM-CAP-HAT + 1455 11 904 903 909 # CAP-CAM-HAT + 1456 6 906 905 904 # CAO-CAM-CAP + 1457 11 904 905 911 # CAP-CAM-HAT + 1458 10 905 904 910 # CAM-CAP-HAT + 1459 8 905 906 912 # CAM-CAO-HAT + 1460 7 906 905 911 # CAO-CAM-HAT + 1461 4 906 901 907 # CAO-CAT-CTT + 1462 12 913 907 914 # HT-CTT-HT + 1463 12 913 907 915 # HT-CTT-HT + 1464 12 914 907 915 # HT-CTT-HT + 1465 1 916 917 918 # CAT-CAO-CAM + 1466 2 916 917 923 # CAT-CAO-HAT + 1467 3 916 922 928 # CAT-CTT-HT + 1468 3 916 922 929 # CAT-CTT-HT + 1469 3 916 922 930 # CAT-CTT-HT + 1470 1 916 921 920 # CAT-CAO-CAM + 1471 2 916 921 927 # CAT-CAO-HAT + 1472 4 917 916 922 # CAO-CAT-CTT + 1473 5 917 916 921 # CAO-CAT-CAO + 1474 6 917 918 919 # CAO-CAM-CAP + 1475 7 917 918 924 # CAO-CAM-HAT + 1476 8 918 917 923 # CAM-CAO-HAT + 1477 9 918 919 920 # CAM-CAP-CAM + 1478 10 918 919 925 # CAM-CAP-HAT + 1479 11 919 918 924 # CAP-CAM-HAT + 1480 6 921 920 919 # CAO-CAM-CAP + 1481 11 919 920 926 # CAP-CAM-HAT + 1482 10 920 919 925 # CAM-CAP-HAT + 1483 8 920 921 927 # CAM-CAO-HAT + 1484 7 921 920 926 # CAO-CAM-HAT + 1485 4 921 916 922 # CAO-CAT-CTT + 1486 12 928 922 929 # HT-CTT-HT + 1487 12 928 922 930 # HT-CTT-HT + 1488 12 929 922 930 # HT-CTT-HT + 1489 1 931 932 933 # CAT-CAO-CAM + 1490 2 931 932 938 # CAT-CAO-HAT + 1491 3 931 937 943 # CAT-CTT-HT + 1492 3 931 937 944 # CAT-CTT-HT + 1493 3 931 937 945 # CAT-CTT-HT + 1494 1 931 936 935 # CAT-CAO-CAM + 1495 2 931 936 942 # CAT-CAO-HAT + 1496 4 932 931 937 # CAO-CAT-CTT + 1497 5 932 931 936 # CAO-CAT-CAO + 1498 6 932 933 934 # CAO-CAM-CAP + 1499 7 932 933 939 # CAO-CAM-HAT + 1500 8 933 932 938 # CAM-CAO-HAT + 1501 9 933 934 935 # CAM-CAP-CAM + 1502 10 933 934 940 # CAM-CAP-HAT + 1503 11 934 933 939 # CAP-CAM-HAT + 1504 6 936 935 934 # CAO-CAM-CAP + 1505 11 934 935 941 # CAP-CAM-HAT + 1506 10 935 934 940 # CAM-CAP-HAT + 1507 8 935 936 942 # CAM-CAO-HAT + 1508 7 936 935 941 # CAO-CAM-HAT + 1509 4 936 931 937 # CAO-CAT-CTT + 1510 12 943 937 944 # HT-CTT-HT + 1511 12 943 937 945 # HT-CTT-HT + 1512 12 944 937 945 # HT-CTT-HT + 1513 1 946 947 948 # CAT-CAO-CAM + 1514 2 946 947 953 # CAT-CAO-HAT + 1515 3 946 952 958 # CAT-CTT-HT + 1516 3 946 952 959 # CAT-CTT-HT + 1517 3 946 952 960 # CAT-CTT-HT + 1518 1 946 951 950 # CAT-CAO-CAM + 1519 2 946 951 957 # CAT-CAO-HAT + 1520 4 947 946 952 # CAO-CAT-CTT + 1521 5 947 946 951 # CAO-CAT-CAO + 1522 6 947 948 949 # CAO-CAM-CAP + 1523 7 947 948 954 # CAO-CAM-HAT + 1524 8 948 947 953 # CAM-CAO-HAT + 1525 9 948 949 950 # CAM-CAP-CAM + 1526 10 948 949 955 # CAM-CAP-HAT + 1527 11 949 948 954 # CAP-CAM-HAT + 1528 6 951 950 949 # CAO-CAM-CAP + 1529 11 949 950 956 # CAP-CAM-HAT + 1530 10 950 949 955 # CAM-CAP-HAT + 1531 8 950 951 957 # CAM-CAO-HAT + 1532 7 951 950 956 # CAO-CAM-HAT + 1533 4 951 946 952 # CAO-CAT-CTT + 1534 12 958 952 959 # HT-CTT-HT + 1535 12 958 952 960 # HT-CTT-HT + 1536 12 959 952 960 # HT-CTT-HT + 1537 1 961 962 963 # CAT-CAO-CAM + 1538 2 961 962 968 # CAT-CAO-HAT + 1539 3 961 967 973 # CAT-CTT-HT + 1540 3 961 967 974 # CAT-CTT-HT + 1541 3 961 967 975 # CAT-CTT-HT + 1542 1 961 966 965 # CAT-CAO-CAM + 1543 2 961 966 972 # CAT-CAO-HAT + 1544 4 962 961 967 # CAO-CAT-CTT + 1545 5 962 961 966 # CAO-CAT-CAO + 1546 6 962 963 964 # CAO-CAM-CAP + 1547 7 962 963 969 # CAO-CAM-HAT + 1548 8 963 962 968 # CAM-CAO-HAT + 1549 9 963 964 965 # CAM-CAP-CAM + 1550 10 963 964 970 # CAM-CAP-HAT + 1551 11 964 963 969 # CAP-CAM-HAT + 1552 6 966 965 964 # CAO-CAM-CAP + 1553 11 964 965 971 # CAP-CAM-HAT + 1554 10 965 964 970 # CAM-CAP-HAT + 1555 8 965 966 972 # CAM-CAO-HAT + 1556 7 966 965 971 # CAO-CAM-HAT + 1557 4 966 961 967 # CAO-CAT-CTT + 1558 12 973 967 974 # HT-CTT-HT + 1559 12 973 967 975 # HT-CTT-HT + 1560 12 974 967 975 # HT-CTT-HT + 1561 1 976 977 978 # CAT-CAO-CAM + 1562 2 976 977 983 # CAT-CAO-HAT + 1563 3 976 982 988 # CAT-CTT-HT + 1564 3 976 982 989 # CAT-CTT-HT + 1565 3 976 982 990 # CAT-CTT-HT + 1566 1 976 981 980 # CAT-CAO-CAM + 1567 2 976 981 987 # CAT-CAO-HAT + 1568 4 977 976 982 # CAO-CAT-CTT + 1569 5 977 976 981 # CAO-CAT-CAO + 1570 6 977 978 979 # CAO-CAM-CAP + 1571 7 977 978 984 # CAO-CAM-HAT + 1572 8 978 977 983 # CAM-CAO-HAT + 1573 9 978 979 980 # CAM-CAP-CAM + 1574 10 978 979 985 # CAM-CAP-HAT + 1575 11 979 978 984 # CAP-CAM-HAT + 1576 6 981 980 979 # CAO-CAM-CAP + 1577 11 979 980 986 # CAP-CAM-HAT + 1578 10 980 979 985 # CAM-CAP-HAT + 1579 8 980 981 987 # CAM-CAO-HAT + 1580 7 981 980 986 # CAO-CAM-HAT + 1581 4 981 976 982 # CAO-CAT-CTT + 1582 12 988 982 989 # HT-CTT-HT + 1583 12 988 982 990 # HT-CTT-HT + 1584 12 989 982 990 # HT-CTT-HT + 1585 1 991 992 993 # CAT-CAO-CAM + 1586 2 991 992 998 # CAT-CAO-HAT + 1587 3 991 997 1003 # CAT-CTT-HT + 1588 3 991 997 1004 # CAT-CTT-HT + 1589 3 991 997 1005 # CAT-CTT-HT + 1590 1 991 996 995 # CAT-CAO-CAM + 1591 2 991 996 1002 # CAT-CAO-HAT + 1592 4 992 991 997 # CAO-CAT-CTT + 1593 5 992 991 996 # CAO-CAT-CAO + 1594 6 992 993 994 # CAO-CAM-CAP + 1595 7 992 993 999 # CAO-CAM-HAT + 1596 8 993 992 998 # CAM-CAO-HAT + 1597 9 993 994 995 # CAM-CAP-CAM + 1598 10 993 994 1000 # CAM-CAP-HAT + 1599 11 994 993 999 # CAP-CAM-HAT + 1600 6 996 995 994 # CAO-CAM-CAP + 1601 11 994 995 1001 # CAP-CAM-HAT + 1602 10 995 994 1000 # CAM-CAP-HAT + 1603 8 995 996 1002 # CAM-CAO-HAT + 1604 7 996 995 1001 # CAO-CAM-HAT + 1605 4 996 991 997 # CAO-CAT-CTT + 1606 12 1003 997 1004 # HT-CTT-HT + 1607 12 1003 997 1005 # HT-CTT-HT + 1608 12 1004 997 1005 # HT-CTT-HT + 1609 1 1006 1007 1008 # CAT-CAO-CAM + 1610 2 1006 1007 1013 # CAT-CAO-HAT + 1611 3 1006 1012 1018 # CAT-CTT-HT + 1612 3 1006 1012 1019 # CAT-CTT-HT + 1613 3 1006 1012 1020 # CAT-CTT-HT + 1614 1 1006 1011 1010 # CAT-CAO-CAM + 1615 2 1006 1011 1017 # CAT-CAO-HAT + 1616 4 1007 1006 1012 # CAO-CAT-CTT + 1617 5 1007 1006 1011 # CAO-CAT-CAO + 1618 6 1007 1008 1009 # CAO-CAM-CAP + 1619 7 1007 1008 1014 # CAO-CAM-HAT + 1620 8 1008 1007 1013 # CAM-CAO-HAT + 1621 9 1008 1009 1010 # CAM-CAP-CAM + 1622 10 1008 1009 1015 # CAM-CAP-HAT + 1623 11 1009 1008 1014 # CAP-CAM-HAT + 1624 6 1011 1010 1009 # CAO-CAM-CAP + 1625 11 1009 1010 1016 # CAP-CAM-HAT + 1626 10 1010 1009 1015 # CAM-CAP-HAT + 1627 8 1010 1011 1017 # CAM-CAO-HAT + 1628 7 1011 1010 1016 # CAO-CAM-HAT + 1629 4 1011 1006 1012 # CAO-CAT-CTT + 1630 12 1018 1012 1019 # HT-CTT-HT + 1631 12 1018 1012 1020 # HT-CTT-HT + 1632 12 1019 1012 1020 # HT-CTT-HT + 1633 1 1021 1022 1023 # CAT-CAO-CAM + 1634 2 1021 1022 1028 # CAT-CAO-HAT + 1635 3 1021 1027 1033 # CAT-CTT-HT + 1636 3 1021 1027 1034 # CAT-CTT-HT + 1637 3 1021 1027 1035 # CAT-CTT-HT + 1638 1 1021 1026 1025 # CAT-CAO-CAM + 1639 2 1021 1026 1032 # CAT-CAO-HAT + 1640 4 1022 1021 1027 # CAO-CAT-CTT + 1641 5 1022 1021 1026 # CAO-CAT-CAO + 1642 6 1022 1023 1024 # CAO-CAM-CAP + 1643 7 1022 1023 1029 # CAO-CAM-HAT + 1644 8 1023 1022 1028 # CAM-CAO-HAT + 1645 9 1023 1024 1025 # CAM-CAP-CAM + 1646 10 1023 1024 1030 # CAM-CAP-HAT + 1647 11 1024 1023 1029 # CAP-CAM-HAT + 1648 6 1026 1025 1024 # CAO-CAM-CAP + 1649 11 1024 1025 1031 # CAP-CAM-HAT + 1650 10 1025 1024 1030 # CAM-CAP-HAT + 1651 8 1025 1026 1032 # CAM-CAO-HAT + 1652 7 1026 1025 1031 # CAO-CAM-HAT + 1653 4 1026 1021 1027 # CAO-CAT-CTT + 1654 12 1033 1027 1034 # HT-CTT-HT + 1655 12 1033 1027 1035 # HT-CTT-HT + 1656 12 1034 1027 1035 # HT-CTT-HT + 1657 1 1036 1037 1038 # CAT-CAO-CAM + 1658 2 1036 1037 1043 # CAT-CAO-HAT + 1659 3 1036 1042 1048 # CAT-CTT-HT + 1660 3 1036 1042 1049 # CAT-CTT-HT + 1661 3 1036 1042 1050 # CAT-CTT-HT + 1662 1 1036 1041 1040 # CAT-CAO-CAM + 1663 2 1036 1041 1047 # CAT-CAO-HAT + 1664 4 1037 1036 1042 # CAO-CAT-CTT + 1665 5 1037 1036 1041 # CAO-CAT-CAO + 1666 6 1037 1038 1039 # CAO-CAM-CAP + 1667 7 1037 1038 1044 # CAO-CAM-HAT + 1668 8 1038 1037 1043 # CAM-CAO-HAT + 1669 9 1038 1039 1040 # CAM-CAP-CAM + 1670 10 1038 1039 1045 # CAM-CAP-HAT + 1671 11 1039 1038 1044 # CAP-CAM-HAT + 1672 6 1041 1040 1039 # CAO-CAM-CAP + 1673 11 1039 1040 1046 # CAP-CAM-HAT + 1674 10 1040 1039 1045 # CAM-CAP-HAT + 1675 8 1040 1041 1047 # CAM-CAO-HAT + 1676 7 1041 1040 1046 # CAO-CAM-HAT + 1677 4 1041 1036 1042 # CAO-CAT-CTT + 1678 12 1048 1042 1049 # HT-CTT-HT + 1679 12 1048 1042 1050 # HT-CTT-HT + 1680 12 1049 1042 1050 # HT-CTT-HT + 1681 1 1051 1052 1053 # CAT-CAO-CAM + 1682 2 1051 1052 1058 # CAT-CAO-HAT + 1683 3 1051 1057 1063 # CAT-CTT-HT + 1684 3 1051 1057 1064 # CAT-CTT-HT + 1685 3 1051 1057 1065 # CAT-CTT-HT + 1686 1 1051 1056 1055 # CAT-CAO-CAM + 1687 2 1051 1056 1062 # CAT-CAO-HAT + 1688 4 1052 1051 1057 # CAO-CAT-CTT + 1689 5 1052 1051 1056 # CAO-CAT-CAO + 1690 6 1052 1053 1054 # CAO-CAM-CAP + 1691 7 1052 1053 1059 # CAO-CAM-HAT + 1692 8 1053 1052 1058 # CAM-CAO-HAT + 1693 9 1053 1054 1055 # CAM-CAP-CAM + 1694 10 1053 1054 1060 # CAM-CAP-HAT + 1695 11 1054 1053 1059 # CAP-CAM-HAT + 1696 6 1056 1055 1054 # CAO-CAM-CAP + 1697 11 1054 1055 1061 # CAP-CAM-HAT + 1698 10 1055 1054 1060 # CAM-CAP-HAT + 1699 8 1055 1056 1062 # CAM-CAO-HAT + 1700 7 1056 1055 1061 # CAO-CAM-HAT + 1701 4 1056 1051 1057 # CAO-CAT-CTT + 1702 12 1063 1057 1064 # HT-CTT-HT + 1703 12 1063 1057 1065 # HT-CTT-HT + 1704 12 1064 1057 1065 # HT-CTT-HT + 1705 1 1066 1067 1068 # CAT-CAO-CAM + 1706 2 1066 1067 1073 # CAT-CAO-HAT + 1707 3 1066 1072 1078 # CAT-CTT-HT + 1708 3 1066 1072 1079 # CAT-CTT-HT + 1709 3 1066 1072 1080 # CAT-CTT-HT + 1710 1 1066 1071 1070 # CAT-CAO-CAM + 1711 2 1066 1071 1077 # CAT-CAO-HAT + 1712 4 1067 1066 1072 # CAO-CAT-CTT + 1713 5 1067 1066 1071 # CAO-CAT-CAO + 1714 6 1067 1068 1069 # CAO-CAM-CAP + 1715 7 1067 1068 1074 # CAO-CAM-HAT + 1716 8 1068 1067 1073 # CAM-CAO-HAT + 1717 9 1068 1069 1070 # CAM-CAP-CAM + 1718 10 1068 1069 1075 # CAM-CAP-HAT + 1719 11 1069 1068 1074 # CAP-CAM-HAT + 1720 6 1071 1070 1069 # CAO-CAM-CAP + 1721 11 1069 1070 1076 # CAP-CAM-HAT + 1722 10 1070 1069 1075 # CAM-CAP-HAT + 1723 8 1070 1071 1077 # CAM-CAO-HAT + 1724 7 1071 1070 1076 # CAO-CAM-HAT + 1725 4 1071 1066 1072 # CAO-CAT-CTT + 1726 12 1078 1072 1079 # HT-CTT-HT + 1727 12 1078 1072 1080 # HT-CTT-HT + 1728 12 1079 1072 1080 # HT-CTT-HT + 1729 1 1081 1082 1083 # CAT-CAO-CAM + 1730 2 1081 1082 1088 # CAT-CAO-HAT + 1731 3 1081 1087 1093 # CAT-CTT-HT + 1732 3 1081 1087 1094 # CAT-CTT-HT + 1733 3 1081 1087 1095 # CAT-CTT-HT + 1734 1 1081 1086 1085 # CAT-CAO-CAM + 1735 2 1081 1086 1092 # CAT-CAO-HAT + 1736 4 1082 1081 1087 # CAO-CAT-CTT + 1737 5 1082 1081 1086 # CAO-CAT-CAO + 1738 6 1082 1083 1084 # CAO-CAM-CAP + 1739 7 1082 1083 1089 # CAO-CAM-HAT + 1740 8 1083 1082 1088 # CAM-CAO-HAT + 1741 9 1083 1084 1085 # CAM-CAP-CAM + 1742 10 1083 1084 1090 # CAM-CAP-HAT + 1743 11 1084 1083 1089 # CAP-CAM-HAT + 1744 6 1086 1085 1084 # CAO-CAM-CAP + 1745 11 1084 1085 1091 # CAP-CAM-HAT + 1746 10 1085 1084 1090 # CAM-CAP-HAT + 1747 8 1085 1086 1092 # CAM-CAO-HAT + 1748 7 1086 1085 1091 # CAO-CAM-HAT + 1749 4 1086 1081 1087 # CAO-CAT-CTT + 1750 12 1093 1087 1094 # HT-CTT-HT + 1751 12 1093 1087 1095 # HT-CTT-HT + 1752 12 1094 1087 1095 # HT-CTT-HT + 1753 1 1096 1097 1098 # CAT-CAO-CAM + 1754 2 1096 1097 1103 # CAT-CAO-HAT + 1755 3 1096 1102 1108 # CAT-CTT-HT + 1756 3 1096 1102 1109 # CAT-CTT-HT + 1757 3 1096 1102 1110 # CAT-CTT-HT + 1758 1 1096 1101 1100 # CAT-CAO-CAM + 1759 2 1096 1101 1107 # CAT-CAO-HAT + 1760 4 1097 1096 1102 # CAO-CAT-CTT + 1761 5 1097 1096 1101 # CAO-CAT-CAO + 1762 6 1097 1098 1099 # CAO-CAM-CAP + 1763 7 1097 1098 1104 # CAO-CAM-HAT + 1764 8 1098 1097 1103 # CAM-CAO-HAT + 1765 9 1098 1099 1100 # CAM-CAP-CAM + 1766 10 1098 1099 1105 # CAM-CAP-HAT + 1767 11 1099 1098 1104 # CAP-CAM-HAT + 1768 6 1101 1100 1099 # CAO-CAM-CAP + 1769 11 1099 1100 1106 # CAP-CAM-HAT + 1770 10 1100 1099 1105 # CAM-CAP-HAT + 1771 8 1100 1101 1107 # CAM-CAO-HAT + 1772 7 1101 1100 1106 # CAO-CAM-HAT + 1773 4 1101 1096 1102 # CAO-CAT-CTT + 1774 12 1108 1102 1109 # HT-CTT-HT + 1775 12 1108 1102 1110 # HT-CTT-HT + 1776 12 1109 1102 1110 # HT-CTT-HT + 1777 1 1111 1112 1113 # CAT-CAO-CAM + 1778 2 1111 1112 1118 # CAT-CAO-HAT + 1779 3 1111 1117 1123 # CAT-CTT-HT + 1780 3 1111 1117 1124 # CAT-CTT-HT + 1781 3 1111 1117 1125 # CAT-CTT-HT + 1782 1 1111 1116 1115 # CAT-CAO-CAM + 1783 2 1111 1116 1122 # CAT-CAO-HAT + 1784 4 1112 1111 1117 # CAO-CAT-CTT + 1785 5 1112 1111 1116 # CAO-CAT-CAO + 1786 6 1112 1113 1114 # CAO-CAM-CAP + 1787 7 1112 1113 1119 # CAO-CAM-HAT + 1788 8 1113 1112 1118 # CAM-CAO-HAT + 1789 9 1113 1114 1115 # CAM-CAP-CAM + 1790 10 1113 1114 1120 # CAM-CAP-HAT + 1791 11 1114 1113 1119 # CAP-CAM-HAT + 1792 6 1116 1115 1114 # CAO-CAM-CAP + 1793 11 1114 1115 1121 # CAP-CAM-HAT + 1794 10 1115 1114 1120 # CAM-CAP-HAT + 1795 8 1115 1116 1122 # CAM-CAO-HAT + 1796 7 1116 1115 1121 # CAO-CAM-HAT + 1797 4 1116 1111 1117 # CAO-CAT-CTT + 1798 12 1123 1117 1124 # HT-CTT-HT + 1799 12 1123 1117 1125 # HT-CTT-HT + 1800 12 1124 1117 1125 # HT-CTT-HT + 1801 1 1126 1127 1128 # CAT-CAO-CAM + 1802 2 1126 1127 1133 # CAT-CAO-HAT + 1803 3 1126 1132 1138 # CAT-CTT-HT + 1804 3 1126 1132 1139 # CAT-CTT-HT + 1805 3 1126 1132 1140 # CAT-CTT-HT + 1806 1 1126 1131 1130 # CAT-CAO-CAM + 1807 2 1126 1131 1137 # CAT-CAO-HAT + 1808 4 1127 1126 1132 # CAO-CAT-CTT + 1809 5 1127 1126 1131 # CAO-CAT-CAO + 1810 6 1127 1128 1129 # CAO-CAM-CAP + 1811 7 1127 1128 1134 # CAO-CAM-HAT + 1812 8 1128 1127 1133 # CAM-CAO-HAT + 1813 9 1128 1129 1130 # CAM-CAP-CAM + 1814 10 1128 1129 1135 # CAM-CAP-HAT + 1815 11 1129 1128 1134 # CAP-CAM-HAT + 1816 6 1131 1130 1129 # CAO-CAM-CAP + 1817 11 1129 1130 1136 # CAP-CAM-HAT + 1818 10 1130 1129 1135 # CAM-CAP-HAT + 1819 8 1130 1131 1137 # CAM-CAO-HAT + 1820 7 1131 1130 1136 # CAO-CAM-HAT + 1821 4 1131 1126 1132 # CAO-CAT-CTT + 1822 12 1138 1132 1139 # HT-CTT-HT + 1823 12 1138 1132 1140 # HT-CTT-HT + 1824 12 1139 1132 1140 # HT-CTT-HT + 1825 1 1141 1142 1143 # CAT-CAO-CAM + 1826 2 1141 1142 1148 # CAT-CAO-HAT + 1827 3 1141 1147 1153 # CAT-CTT-HT + 1828 3 1141 1147 1154 # CAT-CTT-HT + 1829 3 1141 1147 1155 # CAT-CTT-HT + 1830 1 1141 1146 1145 # CAT-CAO-CAM + 1831 2 1141 1146 1152 # CAT-CAO-HAT + 1832 4 1142 1141 1147 # CAO-CAT-CTT + 1833 5 1142 1141 1146 # CAO-CAT-CAO + 1834 6 1142 1143 1144 # CAO-CAM-CAP + 1835 7 1142 1143 1149 # CAO-CAM-HAT + 1836 8 1143 1142 1148 # CAM-CAO-HAT + 1837 9 1143 1144 1145 # CAM-CAP-CAM + 1838 10 1143 1144 1150 # CAM-CAP-HAT + 1839 11 1144 1143 1149 # CAP-CAM-HAT + 1840 6 1146 1145 1144 # CAO-CAM-CAP + 1841 11 1144 1145 1151 # CAP-CAM-HAT + 1842 10 1145 1144 1150 # CAM-CAP-HAT + 1843 8 1145 1146 1152 # CAM-CAO-HAT + 1844 7 1146 1145 1151 # CAO-CAM-HAT + 1845 4 1146 1141 1147 # CAO-CAT-CTT + 1846 12 1153 1147 1154 # HT-CTT-HT + 1847 12 1153 1147 1155 # HT-CTT-HT + 1848 12 1154 1147 1155 # HT-CTT-HT + 1849 1 1156 1157 1158 # CAT-CAO-CAM + 1850 2 1156 1157 1163 # CAT-CAO-HAT + 1851 3 1156 1162 1168 # CAT-CTT-HT + 1852 3 1156 1162 1169 # CAT-CTT-HT + 1853 3 1156 1162 1170 # CAT-CTT-HT + 1854 1 1156 1161 1160 # CAT-CAO-CAM + 1855 2 1156 1161 1167 # CAT-CAO-HAT + 1856 4 1157 1156 1162 # CAO-CAT-CTT + 1857 5 1157 1156 1161 # CAO-CAT-CAO + 1858 6 1157 1158 1159 # CAO-CAM-CAP + 1859 7 1157 1158 1164 # CAO-CAM-HAT + 1860 8 1158 1157 1163 # CAM-CAO-HAT + 1861 9 1158 1159 1160 # CAM-CAP-CAM + 1862 10 1158 1159 1165 # CAM-CAP-HAT + 1863 11 1159 1158 1164 # CAP-CAM-HAT + 1864 6 1161 1160 1159 # CAO-CAM-CAP + 1865 11 1159 1160 1166 # CAP-CAM-HAT + 1866 10 1160 1159 1165 # CAM-CAP-HAT + 1867 8 1160 1161 1167 # CAM-CAO-HAT + 1868 7 1161 1160 1166 # CAO-CAM-HAT + 1869 4 1161 1156 1162 # CAO-CAT-CTT + 1870 12 1168 1162 1169 # HT-CTT-HT + 1871 12 1168 1162 1170 # HT-CTT-HT + 1872 12 1169 1162 1170 # HT-CTT-HT + 1873 1 1171 1172 1173 # CAT-CAO-CAM + 1874 2 1171 1172 1178 # CAT-CAO-HAT + 1875 3 1171 1177 1183 # CAT-CTT-HT + 1876 3 1171 1177 1184 # CAT-CTT-HT + 1877 3 1171 1177 1185 # CAT-CTT-HT + 1878 1 1171 1176 1175 # CAT-CAO-CAM + 1879 2 1171 1176 1182 # CAT-CAO-HAT + 1880 4 1172 1171 1177 # CAO-CAT-CTT + 1881 5 1172 1171 1176 # CAO-CAT-CAO + 1882 6 1172 1173 1174 # CAO-CAM-CAP + 1883 7 1172 1173 1179 # CAO-CAM-HAT + 1884 8 1173 1172 1178 # CAM-CAO-HAT + 1885 9 1173 1174 1175 # CAM-CAP-CAM + 1886 10 1173 1174 1180 # CAM-CAP-HAT + 1887 11 1174 1173 1179 # CAP-CAM-HAT + 1888 6 1176 1175 1174 # CAO-CAM-CAP + 1889 11 1174 1175 1181 # CAP-CAM-HAT + 1890 10 1175 1174 1180 # CAM-CAP-HAT + 1891 8 1175 1176 1182 # CAM-CAO-HAT + 1892 7 1176 1175 1181 # CAO-CAM-HAT + 1893 4 1176 1171 1177 # CAO-CAT-CTT + 1894 12 1183 1177 1184 # HT-CTT-HT + 1895 12 1183 1177 1185 # HT-CTT-HT + 1896 12 1184 1177 1185 # HT-CTT-HT + 1897 1 1186 1187 1188 # CAT-CAO-CAM + 1898 2 1186 1187 1193 # CAT-CAO-HAT + 1899 3 1186 1192 1198 # CAT-CTT-HT + 1900 3 1186 1192 1199 # CAT-CTT-HT + 1901 3 1186 1192 1200 # CAT-CTT-HT + 1902 1 1186 1191 1190 # CAT-CAO-CAM + 1903 2 1186 1191 1197 # CAT-CAO-HAT + 1904 4 1187 1186 1192 # CAO-CAT-CTT + 1905 5 1187 1186 1191 # CAO-CAT-CAO + 1906 6 1187 1188 1189 # CAO-CAM-CAP + 1907 7 1187 1188 1194 # CAO-CAM-HAT + 1908 8 1188 1187 1193 # CAM-CAO-HAT + 1909 9 1188 1189 1190 # CAM-CAP-CAM + 1910 10 1188 1189 1195 # CAM-CAP-HAT + 1911 11 1189 1188 1194 # CAP-CAM-HAT + 1912 6 1191 1190 1189 # CAO-CAM-CAP + 1913 11 1189 1190 1196 # CAP-CAM-HAT + 1914 10 1190 1189 1195 # CAM-CAP-HAT + 1915 8 1190 1191 1197 # CAM-CAO-HAT + 1916 7 1191 1190 1196 # CAO-CAM-HAT + 1917 4 1191 1186 1192 # CAO-CAT-CTT + 1918 12 1198 1192 1199 # HT-CTT-HT + 1919 12 1198 1192 1200 # HT-CTT-HT + 1920 12 1199 1192 1200 # HT-CTT-HT + 1921 1 1201 1202 1203 # CAT-CAO-CAM + 1922 2 1201 1202 1208 # CAT-CAO-HAT + 1923 3 1201 1207 1213 # CAT-CTT-HT + 1924 3 1201 1207 1214 # CAT-CTT-HT + 1925 3 1201 1207 1215 # CAT-CTT-HT + 1926 1 1201 1206 1205 # CAT-CAO-CAM + 1927 2 1201 1206 1212 # CAT-CAO-HAT + 1928 4 1202 1201 1207 # CAO-CAT-CTT + 1929 5 1202 1201 1206 # CAO-CAT-CAO + 1930 6 1202 1203 1204 # CAO-CAM-CAP + 1931 7 1202 1203 1209 # CAO-CAM-HAT + 1932 8 1203 1202 1208 # CAM-CAO-HAT + 1933 9 1203 1204 1205 # CAM-CAP-CAM + 1934 10 1203 1204 1210 # CAM-CAP-HAT + 1935 11 1204 1203 1209 # CAP-CAM-HAT + 1936 6 1206 1205 1204 # CAO-CAM-CAP + 1937 11 1204 1205 1211 # CAP-CAM-HAT + 1938 10 1205 1204 1210 # CAM-CAP-HAT + 1939 8 1205 1206 1212 # CAM-CAO-HAT + 1940 7 1206 1205 1211 # CAO-CAM-HAT + 1941 4 1206 1201 1207 # CAO-CAT-CTT + 1942 12 1213 1207 1214 # HT-CTT-HT + 1943 12 1213 1207 1215 # HT-CTT-HT + 1944 12 1214 1207 1215 # HT-CTT-HT + 1945 1 1216 1217 1218 # CAT-CAO-CAM + 1946 2 1216 1217 1223 # CAT-CAO-HAT + 1947 3 1216 1222 1228 # CAT-CTT-HT + 1948 3 1216 1222 1229 # CAT-CTT-HT + 1949 3 1216 1222 1230 # CAT-CTT-HT + 1950 1 1216 1221 1220 # CAT-CAO-CAM + 1951 2 1216 1221 1227 # CAT-CAO-HAT + 1952 4 1217 1216 1222 # CAO-CAT-CTT + 1953 5 1217 1216 1221 # CAO-CAT-CAO + 1954 6 1217 1218 1219 # CAO-CAM-CAP + 1955 7 1217 1218 1224 # CAO-CAM-HAT + 1956 8 1218 1217 1223 # CAM-CAO-HAT + 1957 9 1218 1219 1220 # CAM-CAP-CAM + 1958 10 1218 1219 1225 # CAM-CAP-HAT + 1959 11 1219 1218 1224 # CAP-CAM-HAT + 1960 6 1221 1220 1219 # CAO-CAM-CAP + 1961 11 1219 1220 1226 # CAP-CAM-HAT + 1962 10 1220 1219 1225 # CAM-CAP-HAT + 1963 8 1220 1221 1227 # CAM-CAO-HAT + 1964 7 1221 1220 1226 # CAO-CAM-HAT + 1965 4 1221 1216 1222 # CAO-CAT-CTT + 1966 12 1228 1222 1229 # HT-CTT-HT + 1967 12 1228 1222 1230 # HT-CTT-HT + 1968 12 1229 1222 1230 # HT-CTT-HT + 1969 1 1231 1232 1233 # CAT-CAO-CAM + 1970 2 1231 1232 1238 # CAT-CAO-HAT + 1971 3 1231 1237 1243 # CAT-CTT-HT + 1972 3 1231 1237 1244 # CAT-CTT-HT + 1973 3 1231 1237 1245 # CAT-CTT-HT + 1974 1 1231 1236 1235 # CAT-CAO-CAM + 1975 2 1231 1236 1242 # CAT-CAO-HAT + 1976 4 1232 1231 1237 # CAO-CAT-CTT + 1977 5 1232 1231 1236 # CAO-CAT-CAO + 1978 6 1232 1233 1234 # CAO-CAM-CAP + 1979 7 1232 1233 1239 # CAO-CAM-HAT + 1980 8 1233 1232 1238 # CAM-CAO-HAT + 1981 9 1233 1234 1235 # CAM-CAP-CAM + 1982 10 1233 1234 1240 # CAM-CAP-HAT + 1983 11 1234 1233 1239 # CAP-CAM-HAT + 1984 6 1236 1235 1234 # CAO-CAM-CAP + 1985 11 1234 1235 1241 # CAP-CAM-HAT + 1986 10 1235 1234 1240 # CAM-CAP-HAT + 1987 8 1235 1236 1242 # CAM-CAO-HAT + 1988 7 1236 1235 1241 # CAO-CAM-HAT + 1989 4 1236 1231 1237 # CAO-CAT-CTT + 1990 12 1243 1237 1244 # HT-CTT-HT + 1991 12 1243 1237 1245 # HT-CTT-HT + 1992 12 1244 1237 1245 # HT-CTT-HT + 1993 1 1246 1247 1248 # CAT-CAO-CAM + 1994 2 1246 1247 1253 # CAT-CAO-HAT + 1995 3 1246 1252 1258 # CAT-CTT-HT + 1996 3 1246 1252 1259 # CAT-CTT-HT + 1997 3 1246 1252 1260 # CAT-CTT-HT + 1998 1 1246 1251 1250 # CAT-CAO-CAM + 1999 2 1246 1251 1257 # CAT-CAO-HAT + 2000 4 1247 1246 1252 # CAO-CAT-CTT + 2001 5 1247 1246 1251 # CAO-CAT-CAO + 2002 6 1247 1248 1249 # CAO-CAM-CAP + 2003 7 1247 1248 1254 # CAO-CAM-HAT + 2004 8 1248 1247 1253 # CAM-CAO-HAT + 2005 9 1248 1249 1250 # CAM-CAP-CAM + 2006 10 1248 1249 1255 # CAM-CAP-HAT + 2007 11 1249 1248 1254 # CAP-CAM-HAT + 2008 6 1251 1250 1249 # CAO-CAM-CAP + 2009 11 1249 1250 1256 # CAP-CAM-HAT + 2010 10 1250 1249 1255 # CAM-CAP-HAT + 2011 8 1250 1251 1257 # CAM-CAO-HAT + 2012 7 1251 1250 1256 # CAO-CAM-HAT + 2013 4 1251 1246 1252 # CAO-CAT-CTT + 2014 12 1258 1252 1259 # HT-CTT-HT + 2015 12 1258 1252 1260 # HT-CTT-HT + 2016 12 1259 1252 1260 # HT-CTT-HT + 2017 1 1261 1262 1263 # CAT-CAO-CAM + 2018 2 1261 1262 1268 # CAT-CAO-HAT + 2019 3 1261 1267 1273 # CAT-CTT-HT + 2020 3 1261 1267 1274 # CAT-CTT-HT + 2021 3 1261 1267 1275 # CAT-CTT-HT + 2022 1 1261 1266 1265 # CAT-CAO-CAM + 2023 2 1261 1266 1272 # CAT-CAO-HAT + 2024 4 1262 1261 1267 # CAO-CAT-CTT + 2025 5 1262 1261 1266 # CAO-CAT-CAO + 2026 6 1262 1263 1264 # CAO-CAM-CAP + 2027 7 1262 1263 1269 # CAO-CAM-HAT + 2028 8 1263 1262 1268 # CAM-CAO-HAT + 2029 9 1263 1264 1265 # CAM-CAP-CAM + 2030 10 1263 1264 1270 # CAM-CAP-HAT + 2031 11 1264 1263 1269 # CAP-CAM-HAT + 2032 6 1266 1265 1264 # CAO-CAM-CAP + 2033 11 1264 1265 1271 # CAP-CAM-HAT + 2034 10 1265 1264 1270 # CAM-CAP-HAT + 2035 8 1265 1266 1272 # CAM-CAO-HAT + 2036 7 1266 1265 1271 # CAO-CAM-HAT + 2037 4 1266 1261 1267 # CAO-CAT-CTT + 2038 12 1273 1267 1274 # HT-CTT-HT + 2039 12 1273 1267 1275 # HT-CTT-HT + 2040 12 1274 1267 1275 # HT-CTT-HT + 2041 1 1276 1277 1278 # CAT-CAO-CAM + 2042 2 1276 1277 1283 # CAT-CAO-HAT + 2043 3 1276 1282 1288 # CAT-CTT-HT + 2044 3 1276 1282 1289 # CAT-CTT-HT + 2045 3 1276 1282 1290 # CAT-CTT-HT + 2046 1 1276 1281 1280 # CAT-CAO-CAM + 2047 2 1276 1281 1287 # CAT-CAO-HAT + 2048 4 1277 1276 1282 # CAO-CAT-CTT + 2049 5 1277 1276 1281 # CAO-CAT-CAO + 2050 6 1277 1278 1279 # CAO-CAM-CAP + 2051 7 1277 1278 1284 # CAO-CAM-HAT + 2052 8 1278 1277 1283 # CAM-CAO-HAT + 2053 9 1278 1279 1280 # CAM-CAP-CAM + 2054 10 1278 1279 1285 # CAM-CAP-HAT + 2055 11 1279 1278 1284 # CAP-CAM-HAT + 2056 6 1281 1280 1279 # CAO-CAM-CAP + 2057 11 1279 1280 1286 # CAP-CAM-HAT + 2058 10 1280 1279 1285 # CAM-CAP-HAT + 2059 8 1280 1281 1287 # CAM-CAO-HAT + 2060 7 1281 1280 1286 # CAO-CAM-HAT + 2061 4 1281 1276 1282 # CAO-CAT-CTT + 2062 12 1288 1282 1289 # HT-CTT-HT + 2063 12 1288 1282 1290 # HT-CTT-HT + 2064 12 1289 1282 1290 # HT-CTT-HT + 2065 1 1291 1292 1293 # CAT-CAO-CAM + 2066 2 1291 1292 1298 # CAT-CAO-HAT + 2067 3 1291 1297 1303 # CAT-CTT-HT + 2068 3 1291 1297 1304 # CAT-CTT-HT + 2069 3 1291 1297 1305 # CAT-CTT-HT + 2070 1 1291 1296 1295 # CAT-CAO-CAM + 2071 2 1291 1296 1302 # CAT-CAO-HAT + 2072 4 1292 1291 1297 # CAO-CAT-CTT + 2073 5 1292 1291 1296 # CAO-CAT-CAO + 2074 6 1292 1293 1294 # CAO-CAM-CAP + 2075 7 1292 1293 1299 # CAO-CAM-HAT + 2076 8 1293 1292 1298 # CAM-CAO-HAT + 2077 9 1293 1294 1295 # CAM-CAP-CAM + 2078 10 1293 1294 1300 # CAM-CAP-HAT + 2079 11 1294 1293 1299 # CAP-CAM-HAT + 2080 6 1296 1295 1294 # CAO-CAM-CAP + 2081 11 1294 1295 1301 # CAP-CAM-HAT + 2082 10 1295 1294 1300 # CAM-CAP-HAT + 2083 8 1295 1296 1302 # CAM-CAO-HAT + 2084 7 1296 1295 1301 # CAO-CAM-HAT + 2085 4 1296 1291 1297 # CAO-CAT-CTT + 2086 12 1303 1297 1304 # HT-CTT-HT + 2087 12 1303 1297 1305 # HT-CTT-HT + 2088 12 1304 1297 1305 # HT-CTT-HT + 2089 1 1306 1307 1308 # CAT-CAO-CAM + 2090 2 1306 1307 1313 # CAT-CAO-HAT + 2091 3 1306 1312 1318 # CAT-CTT-HT + 2092 3 1306 1312 1319 # CAT-CTT-HT + 2093 3 1306 1312 1320 # CAT-CTT-HT + 2094 1 1306 1311 1310 # CAT-CAO-CAM + 2095 2 1306 1311 1317 # CAT-CAO-HAT + 2096 4 1307 1306 1312 # CAO-CAT-CTT + 2097 5 1307 1306 1311 # CAO-CAT-CAO + 2098 6 1307 1308 1309 # CAO-CAM-CAP + 2099 7 1307 1308 1314 # CAO-CAM-HAT + 2100 8 1308 1307 1313 # CAM-CAO-HAT + 2101 9 1308 1309 1310 # CAM-CAP-CAM + 2102 10 1308 1309 1315 # CAM-CAP-HAT + 2103 11 1309 1308 1314 # CAP-CAM-HAT + 2104 6 1311 1310 1309 # CAO-CAM-CAP + 2105 11 1309 1310 1316 # CAP-CAM-HAT + 2106 10 1310 1309 1315 # CAM-CAP-HAT + 2107 8 1310 1311 1317 # CAM-CAO-HAT + 2108 7 1311 1310 1316 # CAO-CAM-HAT + 2109 4 1311 1306 1312 # CAO-CAT-CTT + 2110 12 1318 1312 1319 # HT-CTT-HT + 2111 12 1318 1312 1320 # HT-CTT-HT + 2112 12 1319 1312 1320 # HT-CTT-HT + 2113 1 1321 1322 1323 # CAT-CAO-CAM + 2114 2 1321 1322 1328 # CAT-CAO-HAT + 2115 3 1321 1327 1333 # CAT-CTT-HT + 2116 3 1321 1327 1334 # CAT-CTT-HT + 2117 3 1321 1327 1335 # CAT-CTT-HT + 2118 1 1321 1326 1325 # CAT-CAO-CAM + 2119 2 1321 1326 1332 # CAT-CAO-HAT + 2120 4 1322 1321 1327 # CAO-CAT-CTT + 2121 5 1322 1321 1326 # CAO-CAT-CAO + 2122 6 1322 1323 1324 # CAO-CAM-CAP + 2123 7 1322 1323 1329 # CAO-CAM-HAT + 2124 8 1323 1322 1328 # CAM-CAO-HAT + 2125 9 1323 1324 1325 # CAM-CAP-CAM + 2126 10 1323 1324 1330 # CAM-CAP-HAT + 2127 11 1324 1323 1329 # CAP-CAM-HAT + 2128 6 1326 1325 1324 # CAO-CAM-CAP + 2129 11 1324 1325 1331 # CAP-CAM-HAT + 2130 10 1325 1324 1330 # CAM-CAP-HAT + 2131 8 1325 1326 1332 # CAM-CAO-HAT + 2132 7 1326 1325 1331 # CAO-CAM-HAT + 2133 4 1326 1321 1327 # CAO-CAT-CTT + 2134 12 1333 1327 1334 # HT-CTT-HT + 2135 12 1333 1327 1335 # HT-CTT-HT + 2136 12 1334 1327 1335 # HT-CTT-HT + 2137 1 1336 1337 1338 # CAT-CAO-CAM + 2138 2 1336 1337 1343 # CAT-CAO-HAT + 2139 3 1336 1342 1348 # CAT-CTT-HT + 2140 3 1336 1342 1349 # CAT-CTT-HT + 2141 3 1336 1342 1350 # CAT-CTT-HT + 2142 1 1336 1341 1340 # CAT-CAO-CAM + 2143 2 1336 1341 1347 # CAT-CAO-HAT + 2144 4 1337 1336 1342 # CAO-CAT-CTT + 2145 5 1337 1336 1341 # CAO-CAT-CAO + 2146 6 1337 1338 1339 # CAO-CAM-CAP + 2147 7 1337 1338 1344 # CAO-CAM-HAT + 2148 8 1338 1337 1343 # CAM-CAO-HAT + 2149 9 1338 1339 1340 # CAM-CAP-CAM + 2150 10 1338 1339 1345 # CAM-CAP-HAT + 2151 11 1339 1338 1344 # CAP-CAM-HAT + 2152 6 1341 1340 1339 # CAO-CAM-CAP + 2153 11 1339 1340 1346 # CAP-CAM-HAT + 2154 10 1340 1339 1345 # CAM-CAP-HAT + 2155 8 1340 1341 1347 # CAM-CAO-HAT + 2156 7 1341 1340 1346 # CAO-CAM-HAT + 2157 4 1341 1336 1342 # CAO-CAT-CTT + 2158 12 1348 1342 1349 # HT-CTT-HT + 2159 12 1348 1342 1350 # HT-CTT-HT + 2160 12 1349 1342 1350 # HT-CTT-HT + 2161 1 1351 1352 1353 # CAT-CAO-CAM + 2162 2 1351 1352 1358 # CAT-CAO-HAT + 2163 3 1351 1357 1363 # CAT-CTT-HT + 2164 3 1351 1357 1364 # CAT-CTT-HT + 2165 3 1351 1357 1365 # CAT-CTT-HT + 2166 1 1351 1356 1355 # CAT-CAO-CAM + 2167 2 1351 1356 1362 # CAT-CAO-HAT + 2168 4 1352 1351 1357 # CAO-CAT-CTT + 2169 5 1352 1351 1356 # CAO-CAT-CAO + 2170 6 1352 1353 1354 # CAO-CAM-CAP + 2171 7 1352 1353 1359 # CAO-CAM-HAT + 2172 8 1353 1352 1358 # CAM-CAO-HAT + 2173 9 1353 1354 1355 # CAM-CAP-CAM + 2174 10 1353 1354 1360 # CAM-CAP-HAT + 2175 11 1354 1353 1359 # CAP-CAM-HAT + 2176 6 1356 1355 1354 # CAO-CAM-CAP + 2177 11 1354 1355 1361 # CAP-CAM-HAT + 2178 10 1355 1354 1360 # CAM-CAP-HAT + 2179 8 1355 1356 1362 # CAM-CAO-HAT + 2180 7 1356 1355 1361 # CAO-CAM-HAT + 2181 4 1356 1351 1357 # CAO-CAT-CTT + 2182 12 1363 1357 1364 # HT-CTT-HT + 2183 12 1363 1357 1365 # HT-CTT-HT + 2184 12 1364 1357 1365 # HT-CTT-HT + 2185 1 1366 1367 1368 # CAT-CAO-CAM + 2186 2 1366 1367 1373 # CAT-CAO-HAT + 2187 3 1366 1372 1378 # CAT-CTT-HT + 2188 3 1366 1372 1379 # CAT-CTT-HT + 2189 3 1366 1372 1380 # CAT-CTT-HT + 2190 1 1366 1371 1370 # CAT-CAO-CAM + 2191 2 1366 1371 1377 # CAT-CAO-HAT + 2192 4 1367 1366 1372 # CAO-CAT-CTT + 2193 5 1367 1366 1371 # CAO-CAT-CAO + 2194 6 1367 1368 1369 # CAO-CAM-CAP + 2195 7 1367 1368 1374 # CAO-CAM-HAT + 2196 8 1368 1367 1373 # CAM-CAO-HAT + 2197 9 1368 1369 1370 # CAM-CAP-CAM + 2198 10 1368 1369 1375 # CAM-CAP-HAT + 2199 11 1369 1368 1374 # CAP-CAM-HAT + 2200 6 1371 1370 1369 # CAO-CAM-CAP + 2201 11 1369 1370 1376 # CAP-CAM-HAT + 2202 10 1370 1369 1375 # CAM-CAP-HAT + 2203 8 1370 1371 1377 # CAM-CAO-HAT + 2204 7 1371 1370 1376 # CAO-CAM-HAT + 2205 4 1371 1366 1372 # CAO-CAT-CTT + 2206 12 1378 1372 1379 # HT-CTT-HT + 2207 12 1378 1372 1380 # HT-CTT-HT + 2208 12 1379 1372 1380 # HT-CTT-HT + 2209 1 1381 1382 1383 # CAT-CAO-CAM + 2210 2 1381 1382 1388 # CAT-CAO-HAT + 2211 3 1381 1387 1393 # CAT-CTT-HT + 2212 3 1381 1387 1394 # CAT-CTT-HT + 2213 3 1381 1387 1395 # CAT-CTT-HT + 2214 1 1381 1386 1385 # CAT-CAO-CAM + 2215 2 1381 1386 1392 # CAT-CAO-HAT + 2216 4 1382 1381 1387 # CAO-CAT-CTT + 2217 5 1382 1381 1386 # CAO-CAT-CAO + 2218 6 1382 1383 1384 # CAO-CAM-CAP + 2219 7 1382 1383 1389 # CAO-CAM-HAT + 2220 8 1383 1382 1388 # CAM-CAO-HAT + 2221 9 1383 1384 1385 # CAM-CAP-CAM + 2222 10 1383 1384 1390 # CAM-CAP-HAT + 2223 11 1384 1383 1389 # CAP-CAM-HAT + 2224 6 1386 1385 1384 # CAO-CAM-CAP + 2225 11 1384 1385 1391 # CAP-CAM-HAT + 2226 10 1385 1384 1390 # CAM-CAP-HAT + 2227 8 1385 1386 1392 # CAM-CAO-HAT + 2228 7 1386 1385 1391 # CAO-CAM-HAT + 2229 4 1386 1381 1387 # CAO-CAT-CTT + 2230 12 1393 1387 1394 # HT-CTT-HT + 2231 12 1393 1387 1395 # HT-CTT-HT + 2232 12 1394 1387 1395 # HT-CTT-HT + 2233 1 1396 1397 1398 # CAT-CAO-CAM + 2234 2 1396 1397 1403 # CAT-CAO-HAT + 2235 3 1396 1402 1408 # CAT-CTT-HT + 2236 3 1396 1402 1409 # CAT-CTT-HT + 2237 3 1396 1402 1410 # CAT-CTT-HT + 2238 1 1396 1401 1400 # CAT-CAO-CAM + 2239 2 1396 1401 1407 # CAT-CAO-HAT + 2240 4 1397 1396 1402 # CAO-CAT-CTT + 2241 5 1397 1396 1401 # CAO-CAT-CAO + 2242 6 1397 1398 1399 # CAO-CAM-CAP + 2243 7 1397 1398 1404 # CAO-CAM-HAT + 2244 8 1398 1397 1403 # CAM-CAO-HAT + 2245 9 1398 1399 1400 # CAM-CAP-CAM + 2246 10 1398 1399 1405 # CAM-CAP-HAT + 2247 11 1399 1398 1404 # CAP-CAM-HAT + 2248 6 1401 1400 1399 # CAO-CAM-CAP + 2249 11 1399 1400 1406 # CAP-CAM-HAT + 2250 10 1400 1399 1405 # CAM-CAP-HAT + 2251 8 1400 1401 1407 # CAM-CAO-HAT + 2252 7 1401 1400 1406 # CAO-CAM-HAT + 2253 4 1401 1396 1402 # CAO-CAT-CTT + 2254 12 1408 1402 1409 # HT-CTT-HT + 2255 12 1408 1402 1410 # HT-CTT-HT + 2256 12 1409 1402 1410 # HT-CTT-HT + 2257 1 1411 1412 1413 # CAT-CAO-CAM + 2258 2 1411 1412 1418 # CAT-CAO-HAT + 2259 3 1411 1417 1423 # CAT-CTT-HT + 2260 3 1411 1417 1424 # CAT-CTT-HT + 2261 3 1411 1417 1425 # CAT-CTT-HT + 2262 1 1411 1416 1415 # CAT-CAO-CAM + 2263 2 1411 1416 1422 # CAT-CAO-HAT + 2264 4 1412 1411 1417 # CAO-CAT-CTT + 2265 5 1412 1411 1416 # CAO-CAT-CAO + 2266 6 1412 1413 1414 # CAO-CAM-CAP + 2267 7 1412 1413 1419 # CAO-CAM-HAT + 2268 8 1413 1412 1418 # CAM-CAO-HAT + 2269 9 1413 1414 1415 # CAM-CAP-CAM + 2270 10 1413 1414 1420 # CAM-CAP-HAT + 2271 11 1414 1413 1419 # CAP-CAM-HAT + 2272 6 1416 1415 1414 # CAO-CAM-CAP + 2273 11 1414 1415 1421 # CAP-CAM-HAT + 2274 10 1415 1414 1420 # CAM-CAP-HAT + 2275 8 1415 1416 1422 # CAM-CAO-HAT + 2276 7 1416 1415 1421 # CAO-CAM-HAT + 2277 4 1416 1411 1417 # CAO-CAT-CTT + 2278 12 1423 1417 1424 # HT-CTT-HT + 2279 12 1423 1417 1425 # HT-CTT-HT + 2280 12 1424 1417 1425 # HT-CTT-HT + 2281 1 1426 1427 1428 # CAT-CAO-CAM + 2282 2 1426 1427 1433 # CAT-CAO-HAT + 2283 3 1426 1432 1438 # CAT-CTT-HT + 2284 3 1426 1432 1439 # CAT-CTT-HT + 2285 3 1426 1432 1440 # CAT-CTT-HT + 2286 1 1426 1431 1430 # CAT-CAO-CAM + 2287 2 1426 1431 1437 # CAT-CAO-HAT + 2288 4 1427 1426 1432 # CAO-CAT-CTT + 2289 5 1427 1426 1431 # CAO-CAT-CAO + 2290 6 1427 1428 1429 # CAO-CAM-CAP + 2291 7 1427 1428 1434 # CAO-CAM-HAT + 2292 8 1428 1427 1433 # CAM-CAO-HAT + 2293 9 1428 1429 1430 # CAM-CAP-CAM + 2294 10 1428 1429 1435 # CAM-CAP-HAT + 2295 11 1429 1428 1434 # CAP-CAM-HAT + 2296 6 1431 1430 1429 # CAO-CAM-CAP + 2297 11 1429 1430 1436 # CAP-CAM-HAT + 2298 10 1430 1429 1435 # CAM-CAP-HAT + 2299 8 1430 1431 1437 # CAM-CAO-HAT + 2300 7 1431 1430 1436 # CAO-CAM-HAT + 2301 4 1431 1426 1432 # CAO-CAT-CTT + 2302 12 1438 1432 1439 # HT-CTT-HT + 2303 12 1438 1432 1440 # HT-CTT-HT + 2304 12 1439 1432 1440 # HT-CTT-HT + 2305 1 1441 1442 1443 # CAT-CAO-CAM + 2306 2 1441 1442 1448 # CAT-CAO-HAT + 2307 3 1441 1447 1453 # CAT-CTT-HT + 2308 3 1441 1447 1454 # CAT-CTT-HT + 2309 3 1441 1447 1455 # CAT-CTT-HT + 2310 1 1441 1446 1445 # CAT-CAO-CAM + 2311 2 1441 1446 1452 # CAT-CAO-HAT + 2312 4 1442 1441 1447 # CAO-CAT-CTT + 2313 5 1442 1441 1446 # CAO-CAT-CAO + 2314 6 1442 1443 1444 # CAO-CAM-CAP + 2315 7 1442 1443 1449 # CAO-CAM-HAT + 2316 8 1443 1442 1448 # CAM-CAO-HAT + 2317 9 1443 1444 1445 # CAM-CAP-CAM + 2318 10 1443 1444 1450 # CAM-CAP-HAT + 2319 11 1444 1443 1449 # CAP-CAM-HAT + 2320 6 1446 1445 1444 # CAO-CAM-CAP + 2321 11 1444 1445 1451 # CAP-CAM-HAT + 2322 10 1445 1444 1450 # CAM-CAP-HAT + 2323 8 1445 1446 1452 # CAM-CAO-HAT + 2324 7 1446 1445 1451 # CAO-CAM-HAT + 2325 4 1446 1441 1447 # CAO-CAT-CTT + 2326 12 1453 1447 1454 # HT-CTT-HT + 2327 12 1453 1447 1455 # HT-CTT-HT + 2328 12 1454 1447 1455 # HT-CTT-HT + 2329 1 1456 1457 1458 # CAT-CAO-CAM + 2330 2 1456 1457 1463 # CAT-CAO-HAT + 2331 3 1456 1462 1468 # CAT-CTT-HT + 2332 3 1456 1462 1469 # CAT-CTT-HT + 2333 3 1456 1462 1470 # CAT-CTT-HT + 2334 1 1456 1461 1460 # CAT-CAO-CAM + 2335 2 1456 1461 1467 # CAT-CAO-HAT + 2336 4 1457 1456 1462 # CAO-CAT-CTT + 2337 5 1457 1456 1461 # CAO-CAT-CAO + 2338 6 1457 1458 1459 # CAO-CAM-CAP + 2339 7 1457 1458 1464 # CAO-CAM-HAT + 2340 8 1458 1457 1463 # CAM-CAO-HAT + 2341 9 1458 1459 1460 # CAM-CAP-CAM + 2342 10 1458 1459 1465 # CAM-CAP-HAT + 2343 11 1459 1458 1464 # CAP-CAM-HAT + 2344 6 1461 1460 1459 # CAO-CAM-CAP + 2345 11 1459 1460 1466 # CAP-CAM-HAT + 2346 10 1460 1459 1465 # CAM-CAP-HAT + 2347 8 1460 1461 1467 # CAM-CAO-HAT + 2348 7 1461 1460 1466 # CAO-CAM-HAT + 2349 4 1461 1456 1462 # CAO-CAT-CTT + 2350 12 1468 1462 1469 # HT-CTT-HT + 2351 12 1468 1462 1470 # HT-CTT-HT + 2352 12 1469 1462 1470 # HT-CTT-HT + 2353 1 1471 1472 1473 # CAT-CAO-CAM + 2354 2 1471 1472 1478 # CAT-CAO-HAT + 2355 3 1471 1477 1483 # CAT-CTT-HT + 2356 3 1471 1477 1484 # CAT-CTT-HT + 2357 3 1471 1477 1485 # CAT-CTT-HT + 2358 1 1471 1476 1475 # CAT-CAO-CAM + 2359 2 1471 1476 1482 # CAT-CAO-HAT + 2360 4 1472 1471 1477 # CAO-CAT-CTT + 2361 5 1472 1471 1476 # CAO-CAT-CAO + 2362 6 1472 1473 1474 # CAO-CAM-CAP + 2363 7 1472 1473 1479 # CAO-CAM-HAT + 2364 8 1473 1472 1478 # CAM-CAO-HAT + 2365 9 1473 1474 1475 # CAM-CAP-CAM + 2366 10 1473 1474 1480 # CAM-CAP-HAT + 2367 11 1474 1473 1479 # CAP-CAM-HAT + 2368 6 1476 1475 1474 # CAO-CAM-CAP + 2369 11 1474 1475 1481 # CAP-CAM-HAT + 2370 10 1475 1474 1480 # CAM-CAP-HAT + 2371 8 1475 1476 1482 # CAM-CAO-HAT + 2372 7 1476 1475 1481 # CAO-CAM-HAT + 2373 4 1476 1471 1477 # CAO-CAT-CTT + 2374 12 1483 1477 1484 # HT-CTT-HT + 2375 12 1483 1477 1485 # HT-CTT-HT + 2376 12 1484 1477 1485 # HT-CTT-HT + 2377 1 1486 1487 1488 # CAT-CAO-CAM + 2378 2 1486 1487 1493 # CAT-CAO-HAT + 2379 3 1486 1492 1498 # CAT-CTT-HT + 2380 3 1486 1492 1499 # CAT-CTT-HT + 2381 3 1486 1492 1500 # CAT-CTT-HT + 2382 1 1486 1491 1490 # CAT-CAO-CAM + 2383 2 1486 1491 1497 # CAT-CAO-HAT + 2384 4 1487 1486 1492 # CAO-CAT-CTT + 2385 5 1487 1486 1491 # CAO-CAT-CAO + 2386 6 1487 1488 1489 # CAO-CAM-CAP + 2387 7 1487 1488 1494 # CAO-CAM-HAT + 2388 8 1488 1487 1493 # CAM-CAO-HAT + 2389 9 1488 1489 1490 # CAM-CAP-CAM + 2390 10 1488 1489 1495 # CAM-CAP-HAT + 2391 11 1489 1488 1494 # CAP-CAM-HAT + 2392 6 1491 1490 1489 # CAO-CAM-CAP + 2393 11 1489 1490 1496 # CAP-CAM-HAT + 2394 10 1490 1489 1495 # CAM-CAP-HAT + 2395 8 1490 1491 1497 # CAM-CAO-HAT + 2396 7 1491 1490 1496 # CAO-CAM-HAT + 2397 4 1491 1486 1492 # CAO-CAT-CTT + 2398 12 1498 1492 1499 # HT-CTT-HT + 2399 12 1498 1492 1500 # HT-CTT-HT + 2400 12 1499 1492 1500 # HT-CTT-HT + 2401 1 1501 1502 1503 # CAT-CAO-CAM + 2402 2 1501 1502 1508 # CAT-CAO-HAT + 2403 3 1501 1507 1513 # CAT-CTT-HT + 2404 3 1501 1507 1514 # CAT-CTT-HT + 2405 3 1501 1507 1515 # CAT-CTT-HT + 2406 1 1501 1506 1505 # CAT-CAO-CAM + 2407 2 1501 1506 1512 # CAT-CAO-HAT + 2408 4 1502 1501 1507 # CAO-CAT-CTT + 2409 5 1502 1501 1506 # CAO-CAT-CAO + 2410 6 1502 1503 1504 # CAO-CAM-CAP + 2411 7 1502 1503 1509 # CAO-CAM-HAT + 2412 8 1503 1502 1508 # CAM-CAO-HAT + 2413 9 1503 1504 1505 # CAM-CAP-CAM + 2414 10 1503 1504 1510 # CAM-CAP-HAT + 2415 11 1504 1503 1509 # CAP-CAM-HAT + 2416 6 1506 1505 1504 # CAO-CAM-CAP + 2417 11 1504 1505 1511 # CAP-CAM-HAT + 2418 10 1505 1504 1510 # CAM-CAP-HAT + 2419 8 1505 1506 1512 # CAM-CAO-HAT + 2420 7 1506 1505 1511 # CAO-CAM-HAT + 2421 4 1506 1501 1507 # CAO-CAT-CTT + 2422 12 1513 1507 1514 # HT-CTT-HT + 2423 12 1513 1507 1515 # HT-CTT-HT + 2424 12 1514 1507 1515 # HT-CTT-HT + 2425 1 1516 1517 1518 # CAT-CAO-CAM + 2426 2 1516 1517 1523 # CAT-CAO-HAT + 2427 3 1516 1522 1528 # CAT-CTT-HT + 2428 3 1516 1522 1529 # CAT-CTT-HT + 2429 3 1516 1522 1530 # CAT-CTT-HT + 2430 1 1516 1521 1520 # CAT-CAO-CAM + 2431 2 1516 1521 1527 # CAT-CAO-HAT + 2432 4 1517 1516 1522 # CAO-CAT-CTT + 2433 5 1517 1516 1521 # CAO-CAT-CAO + 2434 6 1517 1518 1519 # CAO-CAM-CAP + 2435 7 1517 1518 1524 # CAO-CAM-HAT + 2436 8 1518 1517 1523 # CAM-CAO-HAT + 2437 9 1518 1519 1520 # CAM-CAP-CAM + 2438 10 1518 1519 1525 # CAM-CAP-HAT + 2439 11 1519 1518 1524 # CAP-CAM-HAT + 2440 6 1521 1520 1519 # CAO-CAM-CAP + 2441 11 1519 1520 1526 # CAP-CAM-HAT + 2442 10 1520 1519 1525 # CAM-CAP-HAT + 2443 8 1520 1521 1527 # CAM-CAO-HAT + 2444 7 1521 1520 1526 # CAO-CAM-HAT + 2445 4 1521 1516 1522 # CAO-CAT-CTT + 2446 12 1528 1522 1529 # HT-CTT-HT + 2447 12 1528 1522 1530 # HT-CTT-HT + 2448 12 1529 1522 1530 # HT-CTT-HT + 2449 1 1531 1532 1533 # CAT-CAO-CAM + 2450 2 1531 1532 1538 # CAT-CAO-HAT + 2451 3 1531 1537 1543 # CAT-CTT-HT + 2452 3 1531 1537 1544 # CAT-CTT-HT + 2453 3 1531 1537 1545 # CAT-CTT-HT + 2454 1 1531 1536 1535 # CAT-CAO-CAM + 2455 2 1531 1536 1542 # CAT-CAO-HAT + 2456 4 1532 1531 1537 # CAO-CAT-CTT + 2457 5 1532 1531 1536 # CAO-CAT-CAO + 2458 6 1532 1533 1534 # CAO-CAM-CAP + 2459 7 1532 1533 1539 # CAO-CAM-HAT + 2460 8 1533 1532 1538 # CAM-CAO-HAT + 2461 9 1533 1534 1535 # CAM-CAP-CAM + 2462 10 1533 1534 1540 # CAM-CAP-HAT + 2463 11 1534 1533 1539 # CAP-CAM-HAT + 2464 6 1536 1535 1534 # CAO-CAM-CAP + 2465 11 1534 1535 1541 # CAP-CAM-HAT + 2466 10 1535 1534 1540 # CAM-CAP-HAT + 2467 8 1535 1536 1542 # CAM-CAO-HAT + 2468 7 1536 1535 1541 # CAO-CAM-HAT + 2469 4 1536 1531 1537 # CAO-CAT-CTT + 2470 12 1543 1537 1544 # HT-CTT-HT + 2471 12 1543 1537 1545 # HT-CTT-HT + 2472 12 1544 1537 1545 # HT-CTT-HT + 2473 1 1546 1547 1548 # CAT-CAO-CAM + 2474 2 1546 1547 1553 # CAT-CAO-HAT + 2475 3 1546 1552 1558 # CAT-CTT-HT + 2476 3 1546 1552 1559 # CAT-CTT-HT + 2477 3 1546 1552 1560 # CAT-CTT-HT + 2478 1 1546 1551 1550 # CAT-CAO-CAM + 2479 2 1546 1551 1557 # CAT-CAO-HAT + 2480 4 1547 1546 1552 # CAO-CAT-CTT + 2481 5 1547 1546 1551 # CAO-CAT-CAO + 2482 6 1547 1548 1549 # CAO-CAM-CAP + 2483 7 1547 1548 1554 # CAO-CAM-HAT + 2484 8 1548 1547 1553 # CAM-CAO-HAT + 2485 9 1548 1549 1550 # CAM-CAP-CAM + 2486 10 1548 1549 1555 # CAM-CAP-HAT + 2487 11 1549 1548 1554 # CAP-CAM-HAT + 2488 6 1551 1550 1549 # CAO-CAM-CAP + 2489 11 1549 1550 1556 # CAP-CAM-HAT + 2490 10 1550 1549 1555 # CAM-CAP-HAT + 2491 8 1550 1551 1557 # CAM-CAO-HAT + 2492 7 1551 1550 1556 # CAO-CAM-HAT + 2493 4 1551 1546 1552 # CAO-CAT-CTT + 2494 12 1558 1552 1559 # HT-CTT-HT + 2495 12 1558 1552 1560 # HT-CTT-HT + 2496 12 1559 1552 1560 # HT-CTT-HT + 2497 1 1561 1562 1563 # CAT-CAO-CAM + 2498 2 1561 1562 1568 # CAT-CAO-HAT + 2499 3 1561 1567 1573 # CAT-CTT-HT + 2500 3 1561 1567 1574 # CAT-CTT-HT + 2501 3 1561 1567 1575 # CAT-CTT-HT + 2502 1 1561 1566 1565 # CAT-CAO-CAM + 2503 2 1561 1566 1572 # CAT-CAO-HAT + 2504 4 1562 1561 1567 # CAO-CAT-CTT + 2505 5 1562 1561 1566 # CAO-CAT-CAO + 2506 6 1562 1563 1564 # CAO-CAM-CAP + 2507 7 1562 1563 1569 # CAO-CAM-HAT + 2508 8 1563 1562 1568 # CAM-CAO-HAT + 2509 9 1563 1564 1565 # CAM-CAP-CAM + 2510 10 1563 1564 1570 # CAM-CAP-HAT + 2511 11 1564 1563 1569 # CAP-CAM-HAT + 2512 6 1566 1565 1564 # CAO-CAM-CAP + 2513 11 1564 1565 1571 # CAP-CAM-HAT + 2514 10 1565 1564 1570 # CAM-CAP-HAT + 2515 8 1565 1566 1572 # CAM-CAO-HAT + 2516 7 1566 1565 1571 # CAO-CAM-HAT + 2517 4 1566 1561 1567 # CAO-CAT-CTT + 2518 12 1573 1567 1574 # HT-CTT-HT + 2519 12 1573 1567 1575 # HT-CTT-HT + 2520 12 1574 1567 1575 # HT-CTT-HT + 2521 1 1576 1577 1578 # CAT-CAO-CAM + 2522 2 1576 1577 1583 # CAT-CAO-HAT + 2523 3 1576 1582 1588 # CAT-CTT-HT + 2524 3 1576 1582 1589 # CAT-CTT-HT + 2525 3 1576 1582 1590 # CAT-CTT-HT + 2526 1 1576 1581 1580 # CAT-CAO-CAM + 2527 2 1576 1581 1587 # CAT-CAO-HAT + 2528 4 1577 1576 1582 # CAO-CAT-CTT + 2529 5 1577 1576 1581 # CAO-CAT-CAO + 2530 6 1577 1578 1579 # CAO-CAM-CAP + 2531 7 1577 1578 1584 # CAO-CAM-HAT + 2532 8 1578 1577 1583 # CAM-CAO-HAT + 2533 9 1578 1579 1580 # CAM-CAP-CAM + 2534 10 1578 1579 1585 # CAM-CAP-HAT + 2535 11 1579 1578 1584 # CAP-CAM-HAT + 2536 6 1581 1580 1579 # CAO-CAM-CAP + 2537 11 1579 1580 1586 # CAP-CAM-HAT + 2538 10 1580 1579 1585 # CAM-CAP-HAT + 2539 8 1580 1581 1587 # CAM-CAO-HAT + 2540 7 1581 1580 1586 # CAO-CAM-HAT + 2541 4 1581 1576 1582 # CAO-CAT-CTT + 2542 12 1588 1582 1589 # HT-CTT-HT + 2543 12 1588 1582 1590 # HT-CTT-HT + 2544 12 1589 1582 1590 # HT-CTT-HT + 2545 1 1591 1592 1593 # CAT-CAO-CAM + 2546 2 1591 1592 1598 # CAT-CAO-HAT + 2547 3 1591 1597 1603 # CAT-CTT-HT + 2548 3 1591 1597 1604 # CAT-CTT-HT + 2549 3 1591 1597 1605 # CAT-CTT-HT + 2550 1 1591 1596 1595 # CAT-CAO-CAM + 2551 2 1591 1596 1602 # CAT-CAO-HAT + 2552 4 1592 1591 1597 # CAO-CAT-CTT + 2553 5 1592 1591 1596 # CAO-CAT-CAO + 2554 6 1592 1593 1594 # CAO-CAM-CAP + 2555 7 1592 1593 1599 # CAO-CAM-HAT + 2556 8 1593 1592 1598 # CAM-CAO-HAT + 2557 9 1593 1594 1595 # CAM-CAP-CAM + 2558 10 1593 1594 1600 # CAM-CAP-HAT + 2559 11 1594 1593 1599 # CAP-CAM-HAT + 2560 6 1596 1595 1594 # CAO-CAM-CAP + 2561 11 1594 1595 1601 # CAP-CAM-HAT + 2562 10 1595 1594 1600 # CAM-CAP-HAT + 2563 8 1595 1596 1602 # CAM-CAO-HAT + 2564 7 1596 1595 1601 # CAO-CAM-HAT + 2565 4 1596 1591 1597 # CAO-CAT-CTT + 2566 12 1603 1597 1604 # HT-CTT-HT + 2567 12 1603 1597 1605 # HT-CTT-HT + 2568 12 1604 1597 1605 # HT-CTT-HT + 2569 1 1606 1607 1608 # CAT-CAO-CAM + 2570 2 1606 1607 1613 # CAT-CAO-HAT + 2571 3 1606 1612 1618 # CAT-CTT-HT + 2572 3 1606 1612 1619 # CAT-CTT-HT + 2573 3 1606 1612 1620 # CAT-CTT-HT + 2574 1 1606 1611 1610 # CAT-CAO-CAM + 2575 2 1606 1611 1617 # CAT-CAO-HAT + 2576 4 1607 1606 1612 # CAO-CAT-CTT + 2577 5 1607 1606 1611 # CAO-CAT-CAO + 2578 6 1607 1608 1609 # CAO-CAM-CAP + 2579 7 1607 1608 1614 # CAO-CAM-HAT + 2580 8 1608 1607 1613 # CAM-CAO-HAT + 2581 9 1608 1609 1610 # CAM-CAP-CAM + 2582 10 1608 1609 1615 # CAM-CAP-HAT + 2583 11 1609 1608 1614 # CAP-CAM-HAT + 2584 6 1611 1610 1609 # CAO-CAM-CAP + 2585 11 1609 1610 1616 # CAP-CAM-HAT + 2586 10 1610 1609 1615 # CAM-CAP-HAT + 2587 8 1610 1611 1617 # CAM-CAO-HAT + 2588 7 1611 1610 1616 # CAO-CAM-HAT + 2589 4 1611 1606 1612 # CAO-CAT-CTT + 2590 12 1618 1612 1619 # HT-CTT-HT + 2591 12 1618 1612 1620 # HT-CTT-HT + 2592 12 1619 1612 1620 # HT-CTT-HT + 2593 1 1621 1622 1623 # CAT-CAO-CAM + 2594 2 1621 1622 1628 # CAT-CAO-HAT + 2595 3 1621 1627 1633 # CAT-CTT-HT + 2596 3 1621 1627 1634 # CAT-CTT-HT + 2597 3 1621 1627 1635 # CAT-CTT-HT + 2598 1 1621 1626 1625 # CAT-CAO-CAM + 2599 2 1621 1626 1632 # CAT-CAO-HAT + 2600 4 1622 1621 1627 # CAO-CAT-CTT + 2601 5 1622 1621 1626 # CAO-CAT-CAO + 2602 6 1622 1623 1624 # CAO-CAM-CAP + 2603 7 1622 1623 1629 # CAO-CAM-HAT + 2604 8 1623 1622 1628 # CAM-CAO-HAT + 2605 9 1623 1624 1625 # CAM-CAP-CAM + 2606 10 1623 1624 1630 # CAM-CAP-HAT + 2607 11 1624 1623 1629 # CAP-CAM-HAT + 2608 6 1626 1625 1624 # CAO-CAM-CAP + 2609 11 1624 1625 1631 # CAP-CAM-HAT + 2610 10 1625 1624 1630 # CAM-CAP-HAT + 2611 8 1625 1626 1632 # CAM-CAO-HAT + 2612 7 1626 1625 1631 # CAO-CAM-HAT + 2613 4 1626 1621 1627 # CAO-CAT-CTT + 2614 12 1633 1627 1634 # HT-CTT-HT + 2615 12 1633 1627 1635 # HT-CTT-HT + 2616 12 1634 1627 1635 # HT-CTT-HT + 2617 1 1636 1637 1638 # CAT-CAO-CAM + 2618 2 1636 1637 1643 # CAT-CAO-HAT + 2619 3 1636 1642 1648 # CAT-CTT-HT + 2620 3 1636 1642 1649 # CAT-CTT-HT + 2621 3 1636 1642 1650 # CAT-CTT-HT + 2622 1 1636 1641 1640 # CAT-CAO-CAM + 2623 2 1636 1641 1647 # CAT-CAO-HAT + 2624 4 1637 1636 1642 # CAO-CAT-CTT + 2625 5 1637 1636 1641 # CAO-CAT-CAO + 2626 6 1637 1638 1639 # CAO-CAM-CAP + 2627 7 1637 1638 1644 # CAO-CAM-HAT + 2628 8 1638 1637 1643 # CAM-CAO-HAT + 2629 9 1638 1639 1640 # CAM-CAP-CAM + 2630 10 1638 1639 1645 # CAM-CAP-HAT + 2631 11 1639 1638 1644 # CAP-CAM-HAT + 2632 6 1641 1640 1639 # CAO-CAM-CAP + 2633 11 1639 1640 1646 # CAP-CAM-HAT + 2634 10 1640 1639 1645 # CAM-CAP-HAT + 2635 8 1640 1641 1647 # CAM-CAO-HAT + 2636 7 1641 1640 1646 # CAO-CAM-HAT + 2637 4 1641 1636 1642 # CAO-CAT-CTT + 2638 12 1648 1642 1649 # HT-CTT-HT + 2639 12 1648 1642 1650 # HT-CTT-HT + 2640 12 1649 1642 1650 # HT-CTT-HT + 2641 1 1651 1652 1653 # CAT-CAO-CAM + 2642 2 1651 1652 1658 # CAT-CAO-HAT + 2643 3 1651 1657 1663 # CAT-CTT-HT + 2644 3 1651 1657 1664 # CAT-CTT-HT + 2645 3 1651 1657 1665 # CAT-CTT-HT + 2646 1 1651 1656 1655 # CAT-CAO-CAM + 2647 2 1651 1656 1662 # CAT-CAO-HAT + 2648 4 1652 1651 1657 # CAO-CAT-CTT + 2649 5 1652 1651 1656 # CAO-CAT-CAO + 2650 6 1652 1653 1654 # CAO-CAM-CAP + 2651 7 1652 1653 1659 # CAO-CAM-HAT + 2652 8 1653 1652 1658 # CAM-CAO-HAT + 2653 9 1653 1654 1655 # CAM-CAP-CAM + 2654 10 1653 1654 1660 # CAM-CAP-HAT + 2655 11 1654 1653 1659 # CAP-CAM-HAT + 2656 6 1656 1655 1654 # CAO-CAM-CAP + 2657 11 1654 1655 1661 # CAP-CAM-HAT + 2658 10 1655 1654 1660 # CAM-CAP-HAT + 2659 8 1655 1656 1662 # CAM-CAO-HAT + 2660 7 1656 1655 1661 # CAO-CAM-HAT + 2661 4 1656 1651 1657 # CAO-CAT-CTT + 2662 12 1663 1657 1664 # HT-CTT-HT + 2663 12 1663 1657 1665 # HT-CTT-HT + 2664 12 1664 1657 1665 # HT-CTT-HT + 2665 1 1666 1667 1668 # CAT-CAO-CAM + 2666 2 1666 1667 1673 # CAT-CAO-HAT + 2667 3 1666 1672 1678 # CAT-CTT-HT + 2668 3 1666 1672 1679 # CAT-CTT-HT + 2669 3 1666 1672 1680 # CAT-CTT-HT + 2670 1 1666 1671 1670 # CAT-CAO-CAM + 2671 2 1666 1671 1677 # CAT-CAO-HAT + 2672 4 1667 1666 1672 # CAO-CAT-CTT + 2673 5 1667 1666 1671 # CAO-CAT-CAO + 2674 6 1667 1668 1669 # CAO-CAM-CAP + 2675 7 1667 1668 1674 # CAO-CAM-HAT + 2676 8 1668 1667 1673 # CAM-CAO-HAT + 2677 9 1668 1669 1670 # CAM-CAP-CAM + 2678 10 1668 1669 1675 # CAM-CAP-HAT + 2679 11 1669 1668 1674 # CAP-CAM-HAT + 2680 6 1671 1670 1669 # CAO-CAM-CAP + 2681 11 1669 1670 1676 # CAP-CAM-HAT + 2682 10 1670 1669 1675 # CAM-CAP-HAT + 2683 8 1670 1671 1677 # CAM-CAO-HAT + 2684 7 1671 1670 1676 # CAO-CAM-HAT + 2685 4 1671 1666 1672 # CAO-CAT-CTT + 2686 12 1678 1672 1679 # HT-CTT-HT + 2687 12 1678 1672 1680 # HT-CTT-HT + 2688 12 1679 1672 1680 # HT-CTT-HT + 2689 1 1681 1682 1683 # CAT-CAO-CAM + 2690 2 1681 1682 1688 # CAT-CAO-HAT + 2691 3 1681 1687 1693 # CAT-CTT-HT + 2692 3 1681 1687 1694 # CAT-CTT-HT + 2693 3 1681 1687 1695 # CAT-CTT-HT + 2694 1 1681 1686 1685 # CAT-CAO-CAM + 2695 2 1681 1686 1692 # CAT-CAO-HAT + 2696 4 1682 1681 1687 # CAO-CAT-CTT + 2697 5 1682 1681 1686 # CAO-CAT-CAO + 2698 6 1682 1683 1684 # CAO-CAM-CAP + 2699 7 1682 1683 1689 # CAO-CAM-HAT + 2700 8 1683 1682 1688 # CAM-CAO-HAT + 2701 9 1683 1684 1685 # CAM-CAP-CAM + 2702 10 1683 1684 1690 # CAM-CAP-HAT + 2703 11 1684 1683 1689 # CAP-CAM-HAT + 2704 6 1686 1685 1684 # CAO-CAM-CAP + 2705 11 1684 1685 1691 # CAP-CAM-HAT + 2706 10 1685 1684 1690 # CAM-CAP-HAT + 2707 8 1685 1686 1692 # CAM-CAO-HAT + 2708 7 1686 1685 1691 # CAO-CAM-HAT + 2709 4 1686 1681 1687 # CAO-CAT-CTT + 2710 12 1693 1687 1694 # HT-CTT-HT + 2711 12 1693 1687 1695 # HT-CTT-HT + 2712 12 1694 1687 1695 # HT-CTT-HT + 2713 1 1696 1697 1698 # CAT-CAO-CAM + 2714 2 1696 1697 1703 # CAT-CAO-HAT + 2715 3 1696 1702 1708 # CAT-CTT-HT + 2716 3 1696 1702 1709 # CAT-CTT-HT + 2717 3 1696 1702 1710 # CAT-CTT-HT + 2718 1 1696 1701 1700 # CAT-CAO-CAM + 2719 2 1696 1701 1707 # CAT-CAO-HAT + 2720 4 1697 1696 1702 # CAO-CAT-CTT + 2721 5 1697 1696 1701 # CAO-CAT-CAO + 2722 6 1697 1698 1699 # CAO-CAM-CAP + 2723 7 1697 1698 1704 # CAO-CAM-HAT + 2724 8 1698 1697 1703 # CAM-CAO-HAT + 2725 9 1698 1699 1700 # CAM-CAP-CAM + 2726 10 1698 1699 1705 # CAM-CAP-HAT + 2727 11 1699 1698 1704 # CAP-CAM-HAT + 2728 6 1701 1700 1699 # CAO-CAM-CAP + 2729 11 1699 1700 1706 # CAP-CAM-HAT + 2730 10 1700 1699 1705 # CAM-CAP-HAT + 2731 8 1700 1701 1707 # CAM-CAO-HAT + 2732 7 1701 1700 1706 # CAO-CAM-HAT + 2733 4 1701 1696 1702 # CAO-CAT-CTT + 2734 12 1708 1702 1709 # HT-CTT-HT + 2735 12 1708 1702 1710 # HT-CTT-HT + 2736 12 1709 1702 1710 # HT-CTT-HT + 2737 1 1711 1712 1713 # CAT-CAO-CAM + 2738 2 1711 1712 1718 # CAT-CAO-HAT + 2739 3 1711 1717 1723 # CAT-CTT-HT + 2740 3 1711 1717 1724 # CAT-CTT-HT + 2741 3 1711 1717 1725 # CAT-CTT-HT + 2742 1 1711 1716 1715 # CAT-CAO-CAM + 2743 2 1711 1716 1722 # CAT-CAO-HAT + 2744 4 1712 1711 1717 # CAO-CAT-CTT + 2745 5 1712 1711 1716 # CAO-CAT-CAO + 2746 6 1712 1713 1714 # CAO-CAM-CAP + 2747 7 1712 1713 1719 # CAO-CAM-HAT + 2748 8 1713 1712 1718 # CAM-CAO-HAT + 2749 9 1713 1714 1715 # CAM-CAP-CAM + 2750 10 1713 1714 1720 # CAM-CAP-HAT + 2751 11 1714 1713 1719 # CAP-CAM-HAT + 2752 6 1716 1715 1714 # CAO-CAM-CAP + 2753 11 1714 1715 1721 # CAP-CAM-HAT + 2754 10 1715 1714 1720 # CAM-CAP-HAT + 2755 8 1715 1716 1722 # CAM-CAO-HAT + 2756 7 1716 1715 1721 # CAO-CAM-HAT + 2757 4 1716 1711 1717 # CAO-CAT-CTT + 2758 12 1723 1717 1724 # HT-CTT-HT + 2759 12 1723 1717 1725 # HT-CTT-HT + 2760 12 1724 1717 1725 # HT-CTT-HT + 2761 1 1726 1727 1728 # CAT-CAO-CAM + 2762 2 1726 1727 1733 # CAT-CAO-HAT + 2763 3 1726 1732 1738 # CAT-CTT-HT + 2764 3 1726 1732 1739 # CAT-CTT-HT + 2765 3 1726 1732 1740 # CAT-CTT-HT + 2766 1 1726 1731 1730 # CAT-CAO-CAM + 2767 2 1726 1731 1737 # CAT-CAO-HAT + 2768 4 1727 1726 1732 # CAO-CAT-CTT + 2769 5 1727 1726 1731 # CAO-CAT-CAO + 2770 6 1727 1728 1729 # CAO-CAM-CAP + 2771 7 1727 1728 1734 # CAO-CAM-HAT + 2772 8 1728 1727 1733 # CAM-CAO-HAT + 2773 9 1728 1729 1730 # CAM-CAP-CAM + 2774 10 1728 1729 1735 # CAM-CAP-HAT + 2775 11 1729 1728 1734 # CAP-CAM-HAT + 2776 6 1731 1730 1729 # CAO-CAM-CAP + 2777 11 1729 1730 1736 # CAP-CAM-HAT + 2778 10 1730 1729 1735 # CAM-CAP-HAT + 2779 8 1730 1731 1737 # CAM-CAO-HAT + 2780 7 1731 1730 1736 # CAO-CAM-HAT + 2781 4 1731 1726 1732 # CAO-CAT-CTT + 2782 12 1738 1732 1739 # HT-CTT-HT + 2783 12 1738 1732 1740 # HT-CTT-HT + 2784 12 1739 1732 1740 # HT-CTT-HT + 2785 1 1741 1742 1743 # CAT-CAO-CAM + 2786 2 1741 1742 1748 # CAT-CAO-HAT + 2787 3 1741 1747 1753 # CAT-CTT-HT + 2788 3 1741 1747 1754 # CAT-CTT-HT + 2789 3 1741 1747 1755 # CAT-CTT-HT + 2790 1 1741 1746 1745 # CAT-CAO-CAM + 2791 2 1741 1746 1752 # CAT-CAO-HAT + 2792 4 1742 1741 1747 # CAO-CAT-CTT + 2793 5 1742 1741 1746 # CAO-CAT-CAO + 2794 6 1742 1743 1744 # CAO-CAM-CAP + 2795 7 1742 1743 1749 # CAO-CAM-HAT + 2796 8 1743 1742 1748 # CAM-CAO-HAT + 2797 9 1743 1744 1745 # CAM-CAP-CAM + 2798 10 1743 1744 1750 # CAM-CAP-HAT + 2799 11 1744 1743 1749 # CAP-CAM-HAT + 2800 6 1746 1745 1744 # CAO-CAM-CAP + 2801 11 1744 1745 1751 # CAP-CAM-HAT + 2802 10 1745 1744 1750 # CAM-CAP-HAT + 2803 8 1745 1746 1752 # CAM-CAO-HAT + 2804 7 1746 1745 1751 # CAO-CAM-HAT + 2805 4 1746 1741 1747 # CAO-CAT-CTT + 2806 12 1753 1747 1754 # HT-CTT-HT + 2807 12 1753 1747 1755 # HT-CTT-HT + 2808 12 1754 1747 1755 # HT-CTT-HT + 2809 1 1756 1757 1758 # CAT-CAO-CAM + 2810 2 1756 1757 1763 # CAT-CAO-HAT + 2811 3 1756 1762 1768 # CAT-CTT-HT + 2812 3 1756 1762 1769 # CAT-CTT-HT + 2813 3 1756 1762 1770 # CAT-CTT-HT + 2814 1 1756 1761 1760 # CAT-CAO-CAM + 2815 2 1756 1761 1767 # CAT-CAO-HAT + 2816 4 1757 1756 1762 # CAO-CAT-CTT + 2817 5 1757 1756 1761 # CAO-CAT-CAO + 2818 6 1757 1758 1759 # CAO-CAM-CAP + 2819 7 1757 1758 1764 # CAO-CAM-HAT + 2820 8 1758 1757 1763 # CAM-CAO-HAT + 2821 9 1758 1759 1760 # CAM-CAP-CAM + 2822 10 1758 1759 1765 # CAM-CAP-HAT + 2823 11 1759 1758 1764 # CAP-CAM-HAT + 2824 6 1761 1760 1759 # CAO-CAM-CAP + 2825 11 1759 1760 1766 # CAP-CAM-HAT + 2826 10 1760 1759 1765 # CAM-CAP-HAT + 2827 8 1760 1761 1767 # CAM-CAO-HAT + 2828 7 1761 1760 1766 # CAO-CAM-HAT + 2829 4 1761 1756 1762 # CAO-CAT-CTT + 2830 12 1768 1762 1769 # HT-CTT-HT + 2831 12 1768 1762 1770 # HT-CTT-HT + 2832 12 1769 1762 1770 # HT-CTT-HT + 2833 1 1771 1772 1773 # CAT-CAO-CAM + 2834 2 1771 1772 1778 # CAT-CAO-HAT + 2835 3 1771 1777 1783 # CAT-CTT-HT + 2836 3 1771 1777 1784 # CAT-CTT-HT + 2837 3 1771 1777 1785 # CAT-CTT-HT + 2838 1 1771 1776 1775 # CAT-CAO-CAM + 2839 2 1771 1776 1782 # CAT-CAO-HAT + 2840 4 1772 1771 1777 # CAO-CAT-CTT + 2841 5 1772 1771 1776 # CAO-CAT-CAO + 2842 6 1772 1773 1774 # CAO-CAM-CAP + 2843 7 1772 1773 1779 # CAO-CAM-HAT + 2844 8 1773 1772 1778 # CAM-CAO-HAT + 2845 9 1773 1774 1775 # CAM-CAP-CAM + 2846 10 1773 1774 1780 # CAM-CAP-HAT + 2847 11 1774 1773 1779 # CAP-CAM-HAT + 2848 6 1776 1775 1774 # CAO-CAM-CAP + 2849 11 1774 1775 1781 # CAP-CAM-HAT + 2850 10 1775 1774 1780 # CAM-CAP-HAT + 2851 8 1775 1776 1782 # CAM-CAO-HAT + 2852 7 1776 1775 1781 # CAO-CAM-HAT + 2853 4 1776 1771 1777 # CAO-CAT-CTT + 2854 12 1783 1777 1784 # HT-CTT-HT + 2855 12 1783 1777 1785 # HT-CTT-HT + 2856 12 1784 1777 1785 # HT-CTT-HT + 2857 1 1786 1787 1788 # CAT-CAO-CAM + 2858 2 1786 1787 1793 # CAT-CAO-HAT + 2859 3 1786 1792 1798 # CAT-CTT-HT + 2860 3 1786 1792 1799 # CAT-CTT-HT + 2861 3 1786 1792 1800 # CAT-CTT-HT + 2862 1 1786 1791 1790 # CAT-CAO-CAM + 2863 2 1786 1791 1797 # CAT-CAO-HAT + 2864 4 1787 1786 1792 # CAO-CAT-CTT + 2865 5 1787 1786 1791 # CAO-CAT-CAO + 2866 6 1787 1788 1789 # CAO-CAM-CAP + 2867 7 1787 1788 1794 # CAO-CAM-HAT + 2868 8 1788 1787 1793 # CAM-CAO-HAT + 2869 9 1788 1789 1790 # CAM-CAP-CAM + 2870 10 1788 1789 1795 # CAM-CAP-HAT + 2871 11 1789 1788 1794 # CAP-CAM-HAT + 2872 6 1791 1790 1789 # CAO-CAM-CAP + 2873 11 1789 1790 1796 # CAP-CAM-HAT + 2874 10 1790 1789 1795 # CAM-CAP-HAT + 2875 8 1790 1791 1797 # CAM-CAO-HAT + 2876 7 1791 1790 1796 # CAO-CAM-HAT + 2877 4 1791 1786 1792 # CAO-CAT-CTT + 2878 12 1798 1792 1799 # HT-CTT-HT + 2879 12 1798 1792 1800 # HT-CTT-HT + 2880 12 1799 1792 1800 # HT-CTT-HT + 2881 1 1801 1802 1803 # CAT-CAO-CAM + 2882 2 1801 1802 1808 # CAT-CAO-HAT + 2883 3 1801 1807 1813 # CAT-CTT-HT + 2884 3 1801 1807 1814 # CAT-CTT-HT + 2885 3 1801 1807 1815 # CAT-CTT-HT + 2886 1 1801 1806 1805 # CAT-CAO-CAM + 2887 2 1801 1806 1812 # CAT-CAO-HAT + 2888 4 1802 1801 1807 # CAO-CAT-CTT + 2889 5 1802 1801 1806 # CAO-CAT-CAO + 2890 6 1802 1803 1804 # CAO-CAM-CAP + 2891 7 1802 1803 1809 # CAO-CAM-HAT + 2892 8 1803 1802 1808 # CAM-CAO-HAT + 2893 9 1803 1804 1805 # CAM-CAP-CAM + 2894 10 1803 1804 1810 # CAM-CAP-HAT + 2895 11 1804 1803 1809 # CAP-CAM-HAT + 2896 6 1806 1805 1804 # CAO-CAM-CAP + 2897 11 1804 1805 1811 # CAP-CAM-HAT + 2898 10 1805 1804 1810 # CAM-CAP-HAT + 2899 8 1805 1806 1812 # CAM-CAO-HAT + 2900 7 1806 1805 1811 # CAO-CAM-HAT + 2901 4 1806 1801 1807 # CAO-CAT-CTT + 2902 12 1813 1807 1814 # HT-CTT-HT + 2903 12 1813 1807 1815 # HT-CTT-HT + 2904 12 1814 1807 1815 # HT-CTT-HT + 2905 1 1816 1817 1818 # CAT-CAO-CAM + 2906 2 1816 1817 1823 # CAT-CAO-HAT + 2907 3 1816 1822 1828 # CAT-CTT-HT + 2908 3 1816 1822 1829 # CAT-CTT-HT + 2909 3 1816 1822 1830 # CAT-CTT-HT + 2910 1 1816 1821 1820 # CAT-CAO-CAM + 2911 2 1816 1821 1827 # CAT-CAO-HAT + 2912 4 1817 1816 1822 # CAO-CAT-CTT + 2913 5 1817 1816 1821 # CAO-CAT-CAO + 2914 6 1817 1818 1819 # CAO-CAM-CAP + 2915 7 1817 1818 1824 # CAO-CAM-HAT + 2916 8 1818 1817 1823 # CAM-CAO-HAT + 2917 9 1818 1819 1820 # CAM-CAP-CAM + 2918 10 1818 1819 1825 # CAM-CAP-HAT + 2919 11 1819 1818 1824 # CAP-CAM-HAT + 2920 6 1821 1820 1819 # CAO-CAM-CAP + 2921 11 1819 1820 1826 # CAP-CAM-HAT + 2922 10 1820 1819 1825 # CAM-CAP-HAT + 2923 8 1820 1821 1827 # CAM-CAO-HAT + 2924 7 1821 1820 1826 # CAO-CAM-HAT + 2925 4 1821 1816 1822 # CAO-CAT-CTT + 2926 12 1828 1822 1829 # HT-CTT-HT + 2927 12 1828 1822 1830 # HT-CTT-HT + 2928 12 1829 1822 1830 # HT-CTT-HT + 2929 1 1831 1832 1833 # CAT-CAO-CAM + 2930 2 1831 1832 1838 # CAT-CAO-HAT + 2931 3 1831 1837 1843 # CAT-CTT-HT + 2932 3 1831 1837 1844 # CAT-CTT-HT + 2933 3 1831 1837 1845 # CAT-CTT-HT + 2934 1 1831 1836 1835 # CAT-CAO-CAM + 2935 2 1831 1836 1842 # CAT-CAO-HAT + 2936 4 1832 1831 1837 # CAO-CAT-CTT + 2937 5 1832 1831 1836 # CAO-CAT-CAO + 2938 6 1832 1833 1834 # CAO-CAM-CAP + 2939 7 1832 1833 1839 # CAO-CAM-HAT + 2940 8 1833 1832 1838 # CAM-CAO-HAT + 2941 9 1833 1834 1835 # CAM-CAP-CAM + 2942 10 1833 1834 1840 # CAM-CAP-HAT + 2943 11 1834 1833 1839 # CAP-CAM-HAT + 2944 6 1836 1835 1834 # CAO-CAM-CAP + 2945 11 1834 1835 1841 # CAP-CAM-HAT + 2946 10 1835 1834 1840 # CAM-CAP-HAT + 2947 8 1835 1836 1842 # CAM-CAO-HAT + 2948 7 1836 1835 1841 # CAO-CAM-HAT + 2949 4 1836 1831 1837 # CAO-CAT-CTT + 2950 12 1843 1837 1844 # HT-CTT-HT + 2951 12 1843 1837 1845 # HT-CTT-HT + 2952 12 1844 1837 1845 # HT-CTT-HT + 2953 1 1846 1847 1848 # CAT-CAO-CAM + 2954 2 1846 1847 1853 # CAT-CAO-HAT + 2955 3 1846 1852 1858 # CAT-CTT-HT + 2956 3 1846 1852 1859 # CAT-CTT-HT + 2957 3 1846 1852 1860 # CAT-CTT-HT + 2958 1 1846 1851 1850 # CAT-CAO-CAM + 2959 2 1846 1851 1857 # CAT-CAO-HAT + 2960 4 1847 1846 1852 # CAO-CAT-CTT + 2961 5 1847 1846 1851 # CAO-CAT-CAO + 2962 6 1847 1848 1849 # CAO-CAM-CAP + 2963 7 1847 1848 1854 # CAO-CAM-HAT + 2964 8 1848 1847 1853 # CAM-CAO-HAT + 2965 9 1848 1849 1850 # CAM-CAP-CAM + 2966 10 1848 1849 1855 # CAM-CAP-HAT + 2967 11 1849 1848 1854 # CAP-CAM-HAT + 2968 6 1851 1850 1849 # CAO-CAM-CAP + 2969 11 1849 1850 1856 # CAP-CAM-HAT + 2970 10 1850 1849 1855 # CAM-CAP-HAT + 2971 8 1850 1851 1857 # CAM-CAO-HAT + 2972 7 1851 1850 1856 # CAO-CAM-HAT + 2973 4 1851 1846 1852 # CAO-CAT-CTT + 2974 12 1858 1852 1859 # HT-CTT-HT + 2975 12 1858 1852 1860 # HT-CTT-HT + 2976 12 1859 1852 1860 # HT-CTT-HT + 2977 1 1861 1862 1863 # CAT-CAO-CAM + 2978 2 1861 1862 1868 # CAT-CAO-HAT + 2979 3 1861 1867 1873 # CAT-CTT-HT + 2980 3 1861 1867 1874 # CAT-CTT-HT + 2981 3 1861 1867 1875 # CAT-CTT-HT + 2982 1 1861 1866 1865 # CAT-CAO-CAM + 2983 2 1861 1866 1872 # CAT-CAO-HAT + 2984 4 1862 1861 1867 # CAO-CAT-CTT + 2985 5 1862 1861 1866 # CAO-CAT-CAO + 2986 6 1862 1863 1864 # CAO-CAM-CAP + 2987 7 1862 1863 1869 # CAO-CAM-HAT + 2988 8 1863 1862 1868 # CAM-CAO-HAT + 2989 9 1863 1864 1865 # CAM-CAP-CAM + 2990 10 1863 1864 1870 # CAM-CAP-HAT + 2991 11 1864 1863 1869 # CAP-CAM-HAT + 2992 6 1866 1865 1864 # CAO-CAM-CAP + 2993 11 1864 1865 1871 # CAP-CAM-HAT + 2994 10 1865 1864 1870 # CAM-CAP-HAT + 2995 8 1865 1866 1872 # CAM-CAO-HAT + 2996 7 1866 1865 1871 # CAO-CAM-HAT + 2997 4 1866 1861 1867 # CAO-CAT-CTT + 2998 12 1873 1867 1874 # HT-CTT-HT + 2999 12 1873 1867 1875 # HT-CTT-HT + 3000 12 1874 1867 1875 # HT-CTT-HT + 3001 1 1876 1877 1878 # CAT-CAO-CAM + 3002 2 1876 1877 1883 # CAT-CAO-HAT + 3003 3 1876 1882 1888 # CAT-CTT-HT + 3004 3 1876 1882 1889 # CAT-CTT-HT + 3005 3 1876 1882 1890 # CAT-CTT-HT + 3006 1 1876 1881 1880 # CAT-CAO-CAM + 3007 2 1876 1881 1887 # CAT-CAO-HAT + 3008 4 1877 1876 1882 # CAO-CAT-CTT + 3009 5 1877 1876 1881 # CAO-CAT-CAO + 3010 6 1877 1878 1879 # CAO-CAM-CAP + 3011 7 1877 1878 1884 # CAO-CAM-HAT + 3012 8 1878 1877 1883 # CAM-CAO-HAT + 3013 9 1878 1879 1880 # CAM-CAP-CAM + 3014 10 1878 1879 1885 # CAM-CAP-HAT + 3015 11 1879 1878 1884 # CAP-CAM-HAT + 3016 6 1881 1880 1879 # CAO-CAM-CAP + 3017 11 1879 1880 1886 # CAP-CAM-HAT + 3018 10 1880 1879 1885 # CAM-CAP-HAT + 3019 8 1880 1881 1887 # CAM-CAO-HAT + 3020 7 1881 1880 1886 # CAO-CAM-HAT + 3021 4 1881 1876 1882 # CAO-CAT-CTT + 3022 12 1888 1882 1889 # HT-CTT-HT + 3023 12 1888 1882 1890 # HT-CTT-HT + 3024 12 1889 1882 1890 # HT-CTT-HT + 3025 1 1891 1892 1893 # CAT-CAO-CAM + 3026 2 1891 1892 1898 # CAT-CAO-HAT + 3027 3 1891 1897 1903 # CAT-CTT-HT + 3028 3 1891 1897 1904 # CAT-CTT-HT + 3029 3 1891 1897 1905 # CAT-CTT-HT + 3030 1 1891 1896 1895 # CAT-CAO-CAM + 3031 2 1891 1896 1902 # CAT-CAO-HAT + 3032 4 1892 1891 1897 # CAO-CAT-CTT + 3033 5 1892 1891 1896 # CAO-CAT-CAO + 3034 6 1892 1893 1894 # CAO-CAM-CAP + 3035 7 1892 1893 1899 # CAO-CAM-HAT + 3036 8 1893 1892 1898 # CAM-CAO-HAT + 3037 9 1893 1894 1895 # CAM-CAP-CAM + 3038 10 1893 1894 1900 # CAM-CAP-HAT + 3039 11 1894 1893 1899 # CAP-CAM-HAT + 3040 6 1896 1895 1894 # CAO-CAM-CAP + 3041 11 1894 1895 1901 # CAP-CAM-HAT + 3042 10 1895 1894 1900 # CAM-CAP-HAT + 3043 8 1895 1896 1902 # CAM-CAO-HAT + 3044 7 1896 1895 1901 # CAO-CAM-HAT + 3045 4 1896 1891 1897 # CAO-CAT-CTT + 3046 12 1903 1897 1904 # HT-CTT-HT + 3047 12 1903 1897 1905 # HT-CTT-HT + 3048 12 1904 1897 1905 # HT-CTT-HT + 3049 1 1906 1907 1908 # CAT-CAO-CAM + 3050 2 1906 1907 1913 # CAT-CAO-HAT + 3051 3 1906 1912 1918 # CAT-CTT-HT + 3052 3 1906 1912 1919 # CAT-CTT-HT + 3053 3 1906 1912 1920 # CAT-CTT-HT + 3054 1 1906 1911 1910 # CAT-CAO-CAM + 3055 2 1906 1911 1917 # CAT-CAO-HAT + 3056 4 1907 1906 1912 # CAO-CAT-CTT + 3057 5 1907 1906 1911 # CAO-CAT-CAO + 3058 6 1907 1908 1909 # CAO-CAM-CAP + 3059 7 1907 1908 1914 # CAO-CAM-HAT + 3060 8 1908 1907 1913 # CAM-CAO-HAT + 3061 9 1908 1909 1910 # CAM-CAP-CAM + 3062 10 1908 1909 1915 # CAM-CAP-HAT + 3063 11 1909 1908 1914 # CAP-CAM-HAT + 3064 6 1911 1910 1909 # CAO-CAM-CAP + 3065 11 1909 1910 1916 # CAP-CAM-HAT + 3066 10 1910 1909 1915 # CAM-CAP-HAT + 3067 8 1910 1911 1917 # CAM-CAO-HAT + 3068 7 1911 1910 1916 # CAO-CAM-HAT + 3069 4 1911 1906 1912 # CAO-CAT-CTT + 3070 12 1918 1912 1919 # HT-CTT-HT + 3071 12 1918 1912 1920 # HT-CTT-HT + 3072 12 1919 1912 1920 # HT-CTT-HT + 3073 1 1921 1922 1923 # CAT-CAO-CAM + 3074 2 1921 1922 1928 # CAT-CAO-HAT + 3075 3 1921 1927 1933 # CAT-CTT-HT + 3076 3 1921 1927 1934 # CAT-CTT-HT + 3077 3 1921 1927 1935 # CAT-CTT-HT + 3078 1 1921 1926 1925 # CAT-CAO-CAM + 3079 2 1921 1926 1932 # CAT-CAO-HAT + 3080 4 1922 1921 1927 # CAO-CAT-CTT + 3081 5 1922 1921 1926 # CAO-CAT-CAO + 3082 6 1922 1923 1924 # CAO-CAM-CAP + 3083 7 1922 1923 1929 # CAO-CAM-HAT + 3084 8 1923 1922 1928 # CAM-CAO-HAT + 3085 9 1923 1924 1925 # CAM-CAP-CAM + 3086 10 1923 1924 1930 # CAM-CAP-HAT + 3087 11 1924 1923 1929 # CAP-CAM-HAT + 3088 6 1926 1925 1924 # CAO-CAM-CAP + 3089 11 1924 1925 1931 # CAP-CAM-HAT + 3090 10 1925 1924 1930 # CAM-CAP-HAT + 3091 8 1925 1926 1932 # CAM-CAO-HAT + 3092 7 1926 1925 1931 # CAO-CAM-HAT + 3093 4 1926 1921 1927 # CAO-CAT-CTT + 3094 12 1933 1927 1934 # HT-CTT-HT + 3095 12 1933 1927 1935 # HT-CTT-HT + 3096 12 1934 1927 1935 # HT-CTT-HT + 3097 1 1936 1937 1938 # CAT-CAO-CAM + 3098 2 1936 1937 1943 # CAT-CAO-HAT + 3099 3 1936 1942 1948 # CAT-CTT-HT + 3100 3 1936 1942 1949 # CAT-CTT-HT + 3101 3 1936 1942 1950 # CAT-CTT-HT + 3102 1 1936 1941 1940 # CAT-CAO-CAM + 3103 2 1936 1941 1947 # CAT-CAO-HAT + 3104 4 1937 1936 1942 # CAO-CAT-CTT + 3105 5 1937 1936 1941 # CAO-CAT-CAO + 3106 6 1937 1938 1939 # CAO-CAM-CAP + 3107 7 1937 1938 1944 # CAO-CAM-HAT + 3108 8 1938 1937 1943 # CAM-CAO-HAT + 3109 9 1938 1939 1940 # CAM-CAP-CAM + 3110 10 1938 1939 1945 # CAM-CAP-HAT + 3111 11 1939 1938 1944 # CAP-CAM-HAT + 3112 6 1941 1940 1939 # CAO-CAM-CAP + 3113 11 1939 1940 1946 # CAP-CAM-HAT + 3114 10 1940 1939 1945 # CAM-CAP-HAT + 3115 8 1940 1941 1947 # CAM-CAO-HAT + 3116 7 1941 1940 1946 # CAO-CAM-HAT + 3117 4 1941 1936 1942 # CAO-CAT-CTT + 3118 12 1948 1942 1949 # HT-CTT-HT + 3119 12 1948 1942 1950 # HT-CTT-HT + 3120 12 1949 1942 1950 # HT-CTT-HT + 3121 1 1951 1952 1953 # CAT-CAO-CAM + 3122 2 1951 1952 1958 # CAT-CAO-HAT + 3123 3 1951 1957 1963 # CAT-CTT-HT + 3124 3 1951 1957 1964 # CAT-CTT-HT + 3125 3 1951 1957 1965 # CAT-CTT-HT + 3126 1 1951 1956 1955 # CAT-CAO-CAM + 3127 2 1951 1956 1962 # CAT-CAO-HAT + 3128 4 1952 1951 1957 # CAO-CAT-CTT + 3129 5 1952 1951 1956 # CAO-CAT-CAO + 3130 6 1952 1953 1954 # CAO-CAM-CAP + 3131 7 1952 1953 1959 # CAO-CAM-HAT + 3132 8 1953 1952 1958 # CAM-CAO-HAT + 3133 9 1953 1954 1955 # CAM-CAP-CAM + 3134 10 1953 1954 1960 # CAM-CAP-HAT + 3135 11 1954 1953 1959 # CAP-CAM-HAT + 3136 6 1956 1955 1954 # CAO-CAM-CAP + 3137 11 1954 1955 1961 # CAP-CAM-HAT + 3138 10 1955 1954 1960 # CAM-CAP-HAT + 3139 8 1955 1956 1962 # CAM-CAO-HAT + 3140 7 1956 1955 1961 # CAO-CAM-HAT + 3141 4 1956 1951 1957 # CAO-CAT-CTT + 3142 12 1963 1957 1964 # HT-CTT-HT + 3143 12 1963 1957 1965 # HT-CTT-HT + 3144 12 1964 1957 1965 # HT-CTT-HT + 3145 1 1966 1967 1968 # CAT-CAO-CAM + 3146 2 1966 1967 1973 # CAT-CAO-HAT + 3147 3 1966 1972 1978 # CAT-CTT-HT + 3148 3 1966 1972 1979 # CAT-CTT-HT + 3149 3 1966 1972 1980 # CAT-CTT-HT + 3150 1 1966 1971 1970 # CAT-CAO-CAM + 3151 2 1966 1971 1977 # CAT-CAO-HAT + 3152 4 1967 1966 1972 # CAO-CAT-CTT + 3153 5 1967 1966 1971 # CAO-CAT-CAO + 3154 6 1967 1968 1969 # CAO-CAM-CAP + 3155 7 1967 1968 1974 # CAO-CAM-HAT + 3156 8 1968 1967 1973 # CAM-CAO-HAT + 3157 9 1968 1969 1970 # CAM-CAP-CAM + 3158 10 1968 1969 1975 # CAM-CAP-HAT + 3159 11 1969 1968 1974 # CAP-CAM-HAT + 3160 6 1971 1970 1969 # CAO-CAM-CAP + 3161 11 1969 1970 1976 # CAP-CAM-HAT + 3162 10 1970 1969 1975 # CAM-CAP-HAT + 3163 8 1970 1971 1977 # CAM-CAO-HAT + 3164 7 1971 1970 1976 # CAO-CAM-HAT + 3165 4 1971 1966 1972 # CAO-CAT-CTT + 3166 12 1978 1972 1979 # HT-CTT-HT + 3167 12 1978 1972 1980 # HT-CTT-HT + 3168 12 1979 1972 1980 # HT-CTT-HT + 3169 1 1981 1982 1983 # CAT-CAO-CAM + 3170 2 1981 1982 1988 # CAT-CAO-HAT + 3171 3 1981 1987 1993 # CAT-CTT-HT + 3172 3 1981 1987 1994 # CAT-CTT-HT + 3173 3 1981 1987 1995 # CAT-CTT-HT + 3174 1 1981 1986 1985 # CAT-CAO-CAM + 3175 2 1981 1986 1992 # CAT-CAO-HAT + 3176 4 1982 1981 1987 # CAO-CAT-CTT + 3177 5 1982 1981 1986 # CAO-CAT-CAO + 3178 6 1982 1983 1984 # CAO-CAM-CAP + 3179 7 1982 1983 1989 # CAO-CAM-HAT + 3180 8 1983 1982 1988 # CAM-CAO-HAT + 3181 9 1983 1984 1985 # CAM-CAP-CAM + 3182 10 1983 1984 1990 # CAM-CAP-HAT + 3183 11 1984 1983 1989 # CAP-CAM-HAT + 3184 6 1986 1985 1984 # CAO-CAM-CAP + 3185 11 1984 1985 1991 # CAP-CAM-HAT + 3186 10 1985 1984 1990 # CAM-CAP-HAT + 3187 8 1985 1986 1992 # CAM-CAO-HAT + 3188 7 1986 1985 1991 # CAO-CAM-HAT + 3189 4 1986 1981 1987 # CAO-CAT-CTT + 3190 12 1993 1987 1994 # HT-CTT-HT + 3191 12 1993 1987 1995 # HT-CTT-HT + 3192 12 1994 1987 1995 # HT-CTT-HT + 3193 1 1996 1997 1998 # CAT-CAO-CAM + 3194 2 1996 1997 2003 # CAT-CAO-HAT + 3195 3 1996 2002 2008 # CAT-CTT-HT + 3196 3 1996 2002 2009 # CAT-CTT-HT + 3197 3 1996 2002 2010 # CAT-CTT-HT + 3198 1 1996 2001 2000 # CAT-CAO-CAM + 3199 2 1996 2001 2007 # CAT-CAO-HAT + 3200 4 1997 1996 2002 # CAO-CAT-CTT + 3201 5 1997 1996 2001 # CAO-CAT-CAO + 3202 6 1997 1998 1999 # CAO-CAM-CAP + 3203 7 1997 1998 2004 # CAO-CAM-HAT + 3204 8 1998 1997 2003 # CAM-CAO-HAT + 3205 9 1998 1999 2000 # CAM-CAP-CAM + 3206 10 1998 1999 2005 # CAM-CAP-HAT + 3207 11 1999 1998 2004 # CAP-CAM-HAT + 3208 6 2001 2000 1999 # CAO-CAM-CAP + 3209 11 1999 2000 2006 # CAP-CAM-HAT + 3210 10 2000 1999 2005 # CAM-CAP-HAT + 3211 8 2000 2001 2007 # CAM-CAO-HAT + 3212 7 2001 2000 2006 # CAO-CAM-HAT + 3213 4 2001 1996 2002 # CAO-CAT-CTT + 3214 12 2008 2002 2009 # HT-CTT-HT + 3215 12 2008 2002 2010 # HT-CTT-HT + 3216 12 2009 2002 2010 # HT-CTT-HT + 3217 1 2011 2012 2013 # CAT-CAO-CAM + 3218 2 2011 2012 2018 # CAT-CAO-HAT + 3219 3 2011 2017 2023 # CAT-CTT-HT + 3220 3 2011 2017 2024 # CAT-CTT-HT + 3221 3 2011 2017 2025 # CAT-CTT-HT + 3222 1 2011 2016 2015 # CAT-CAO-CAM + 3223 2 2011 2016 2022 # CAT-CAO-HAT + 3224 4 2012 2011 2017 # CAO-CAT-CTT + 3225 5 2012 2011 2016 # CAO-CAT-CAO + 3226 6 2012 2013 2014 # CAO-CAM-CAP + 3227 7 2012 2013 2019 # CAO-CAM-HAT + 3228 8 2013 2012 2018 # CAM-CAO-HAT + 3229 9 2013 2014 2015 # CAM-CAP-CAM + 3230 10 2013 2014 2020 # CAM-CAP-HAT + 3231 11 2014 2013 2019 # CAP-CAM-HAT + 3232 6 2016 2015 2014 # CAO-CAM-CAP + 3233 11 2014 2015 2021 # CAP-CAM-HAT + 3234 10 2015 2014 2020 # CAM-CAP-HAT + 3235 8 2015 2016 2022 # CAM-CAO-HAT + 3236 7 2016 2015 2021 # CAO-CAM-HAT + 3237 4 2016 2011 2017 # CAO-CAT-CTT + 3238 12 2023 2017 2024 # HT-CTT-HT + 3239 12 2023 2017 2025 # HT-CTT-HT + 3240 12 2024 2017 2025 # HT-CTT-HT + 3241 1 2026 2027 2028 # CAT-CAO-CAM + 3242 2 2026 2027 2033 # CAT-CAO-HAT + 3243 3 2026 2032 2038 # CAT-CTT-HT + 3244 3 2026 2032 2039 # CAT-CTT-HT + 3245 3 2026 2032 2040 # CAT-CTT-HT + 3246 1 2026 2031 2030 # CAT-CAO-CAM + 3247 2 2026 2031 2037 # CAT-CAO-HAT + 3248 4 2027 2026 2032 # CAO-CAT-CTT + 3249 5 2027 2026 2031 # CAO-CAT-CAO + 3250 6 2027 2028 2029 # CAO-CAM-CAP + 3251 7 2027 2028 2034 # CAO-CAM-HAT + 3252 8 2028 2027 2033 # CAM-CAO-HAT + 3253 9 2028 2029 2030 # CAM-CAP-CAM + 3254 10 2028 2029 2035 # CAM-CAP-HAT + 3255 11 2029 2028 2034 # CAP-CAM-HAT + 3256 6 2031 2030 2029 # CAO-CAM-CAP + 3257 11 2029 2030 2036 # CAP-CAM-HAT + 3258 10 2030 2029 2035 # CAM-CAP-HAT + 3259 8 2030 2031 2037 # CAM-CAO-HAT + 3260 7 2031 2030 2036 # CAO-CAM-HAT + 3261 4 2031 2026 2032 # CAO-CAT-CTT + 3262 12 2038 2032 2039 # HT-CTT-HT + 3263 12 2038 2032 2040 # HT-CTT-HT + 3264 12 2039 2032 2040 # HT-CTT-HT + 3265 1 2041 2042 2043 # CAT-CAO-CAM + 3266 2 2041 2042 2048 # CAT-CAO-HAT + 3267 3 2041 2047 2053 # CAT-CTT-HT + 3268 3 2041 2047 2054 # CAT-CTT-HT + 3269 3 2041 2047 2055 # CAT-CTT-HT + 3270 1 2041 2046 2045 # CAT-CAO-CAM + 3271 2 2041 2046 2052 # CAT-CAO-HAT + 3272 4 2042 2041 2047 # CAO-CAT-CTT + 3273 5 2042 2041 2046 # CAO-CAT-CAO + 3274 6 2042 2043 2044 # CAO-CAM-CAP + 3275 7 2042 2043 2049 # CAO-CAM-HAT + 3276 8 2043 2042 2048 # CAM-CAO-HAT + 3277 9 2043 2044 2045 # CAM-CAP-CAM + 3278 10 2043 2044 2050 # CAM-CAP-HAT + 3279 11 2044 2043 2049 # CAP-CAM-HAT + 3280 6 2046 2045 2044 # CAO-CAM-CAP + 3281 11 2044 2045 2051 # CAP-CAM-HAT + 3282 10 2045 2044 2050 # CAM-CAP-HAT + 3283 8 2045 2046 2052 # CAM-CAO-HAT + 3284 7 2046 2045 2051 # CAO-CAM-HAT + 3285 4 2046 2041 2047 # CAO-CAT-CTT + 3286 12 2053 2047 2054 # HT-CTT-HT + 3287 12 2053 2047 2055 # HT-CTT-HT + 3288 12 2054 2047 2055 # HT-CTT-HT + 3289 1 2056 2057 2058 # CAT-CAO-CAM + 3290 2 2056 2057 2063 # CAT-CAO-HAT + 3291 3 2056 2062 2068 # CAT-CTT-HT + 3292 3 2056 2062 2069 # CAT-CTT-HT + 3293 3 2056 2062 2070 # CAT-CTT-HT + 3294 1 2056 2061 2060 # CAT-CAO-CAM + 3295 2 2056 2061 2067 # CAT-CAO-HAT + 3296 4 2057 2056 2062 # CAO-CAT-CTT + 3297 5 2057 2056 2061 # CAO-CAT-CAO + 3298 6 2057 2058 2059 # CAO-CAM-CAP + 3299 7 2057 2058 2064 # CAO-CAM-HAT + 3300 8 2058 2057 2063 # CAM-CAO-HAT + 3301 9 2058 2059 2060 # CAM-CAP-CAM + 3302 10 2058 2059 2065 # CAM-CAP-HAT + 3303 11 2059 2058 2064 # CAP-CAM-HAT + 3304 6 2061 2060 2059 # CAO-CAM-CAP + 3305 11 2059 2060 2066 # CAP-CAM-HAT + 3306 10 2060 2059 2065 # CAM-CAP-HAT + 3307 8 2060 2061 2067 # CAM-CAO-HAT + 3308 7 2061 2060 2066 # CAO-CAM-HAT + 3309 4 2061 2056 2062 # CAO-CAT-CTT + 3310 12 2068 2062 2069 # HT-CTT-HT + 3311 12 2068 2062 2070 # HT-CTT-HT + 3312 12 2069 2062 2070 # HT-CTT-HT + 3313 1 2071 2072 2073 # CAT-CAO-CAM + 3314 2 2071 2072 2078 # CAT-CAO-HAT + 3315 3 2071 2077 2083 # CAT-CTT-HT + 3316 3 2071 2077 2084 # CAT-CTT-HT + 3317 3 2071 2077 2085 # CAT-CTT-HT + 3318 1 2071 2076 2075 # CAT-CAO-CAM + 3319 2 2071 2076 2082 # CAT-CAO-HAT + 3320 4 2072 2071 2077 # CAO-CAT-CTT + 3321 5 2072 2071 2076 # CAO-CAT-CAO + 3322 6 2072 2073 2074 # CAO-CAM-CAP + 3323 7 2072 2073 2079 # CAO-CAM-HAT + 3324 8 2073 2072 2078 # CAM-CAO-HAT + 3325 9 2073 2074 2075 # CAM-CAP-CAM + 3326 10 2073 2074 2080 # CAM-CAP-HAT + 3327 11 2074 2073 2079 # CAP-CAM-HAT + 3328 6 2076 2075 2074 # CAO-CAM-CAP + 3329 11 2074 2075 2081 # CAP-CAM-HAT + 3330 10 2075 2074 2080 # CAM-CAP-HAT + 3331 8 2075 2076 2082 # CAM-CAO-HAT + 3332 7 2076 2075 2081 # CAO-CAM-HAT + 3333 4 2076 2071 2077 # CAO-CAT-CTT + 3334 12 2083 2077 2084 # HT-CTT-HT + 3335 12 2083 2077 2085 # HT-CTT-HT + 3336 12 2084 2077 2085 # HT-CTT-HT + 3337 1 2086 2087 2088 # CAT-CAO-CAM + 3338 2 2086 2087 2093 # CAT-CAO-HAT + 3339 3 2086 2092 2098 # CAT-CTT-HT + 3340 3 2086 2092 2099 # CAT-CTT-HT + 3341 3 2086 2092 2100 # CAT-CTT-HT + 3342 1 2086 2091 2090 # CAT-CAO-CAM + 3343 2 2086 2091 2097 # CAT-CAO-HAT + 3344 4 2087 2086 2092 # CAO-CAT-CTT + 3345 5 2087 2086 2091 # CAO-CAT-CAO + 3346 6 2087 2088 2089 # CAO-CAM-CAP + 3347 7 2087 2088 2094 # CAO-CAM-HAT + 3348 8 2088 2087 2093 # CAM-CAO-HAT + 3349 9 2088 2089 2090 # CAM-CAP-CAM + 3350 10 2088 2089 2095 # CAM-CAP-HAT + 3351 11 2089 2088 2094 # CAP-CAM-HAT + 3352 6 2091 2090 2089 # CAO-CAM-CAP + 3353 11 2089 2090 2096 # CAP-CAM-HAT + 3354 10 2090 2089 2095 # CAM-CAP-HAT + 3355 8 2090 2091 2097 # CAM-CAO-HAT + 3356 7 2091 2090 2096 # CAO-CAM-HAT + 3357 4 2091 2086 2092 # CAO-CAT-CTT + 3358 12 2098 2092 2099 # HT-CTT-HT + 3359 12 2098 2092 2100 # HT-CTT-HT + 3360 12 2099 2092 2100 # HT-CTT-HT + 3361 1 2101 2102 2103 # CAT-CAO-CAM + 3362 2 2101 2102 2108 # CAT-CAO-HAT + 3363 3 2101 2107 2113 # CAT-CTT-HT + 3364 3 2101 2107 2114 # CAT-CTT-HT + 3365 3 2101 2107 2115 # CAT-CTT-HT + 3366 1 2101 2106 2105 # CAT-CAO-CAM + 3367 2 2101 2106 2112 # CAT-CAO-HAT + 3368 4 2102 2101 2107 # CAO-CAT-CTT + 3369 5 2102 2101 2106 # CAO-CAT-CAO + 3370 6 2102 2103 2104 # CAO-CAM-CAP + 3371 7 2102 2103 2109 # CAO-CAM-HAT + 3372 8 2103 2102 2108 # CAM-CAO-HAT + 3373 9 2103 2104 2105 # CAM-CAP-CAM + 3374 10 2103 2104 2110 # CAM-CAP-HAT + 3375 11 2104 2103 2109 # CAP-CAM-HAT + 3376 6 2106 2105 2104 # CAO-CAM-CAP + 3377 11 2104 2105 2111 # CAP-CAM-HAT + 3378 10 2105 2104 2110 # CAM-CAP-HAT + 3379 8 2105 2106 2112 # CAM-CAO-HAT + 3380 7 2106 2105 2111 # CAO-CAM-HAT + 3381 4 2106 2101 2107 # CAO-CAT-CTT + 3382 12 2113 2107 2114 # HT-CTT-HT + 3383 12 2113 2107 2115 # HT-CTT-HT + 3384 12 2114 2107 2115 # HT-CTT-HT + 3385 1 2116 2117 2118 # CAT-CAO-CAM + 3386 2 2116 2117 2123 # CAT-CAO-HAT + 3387 3 2116 2122 2128 # CAT-CTT-HT + 3388 3 2116 2122 2129 # CAT-CTT-HT + 3389 3 2116 2122 2130 # CAT-CTT-HT + 3390 1 2116 2121 2120 # CAT-CAO-CAM + 3391 2 2116 2121 2127 # CAT-CAO-HAT + 3392 4 2117 2116 2122 # CAO-CAT-CTT + 3393 5 2117 2116 2121 # CAO-CAT-CAO + 3394 6 2117 2118 2119 # CAO-CAM-CAP + 3395 7 2117 2118 2124 # CAO-CAM-HAT + 3396 8 2118 2117 2123 # CAM-CAO-HAT + 3397 9 2118 2119 2120 # CAM-CAP-CAM + 3398 10 2118 2119 2125 # CAM-CAP-HAT + 3399 11 2119 2118 2124 # CAP-CAM-HAT + 3400 6 2121 2120 2119 # CAO-CAM-CAP + 3401 11 2119 2120 2126 # CAP-CAM-HAT + 3402 10 2120 2119 2125 # CAM-CAP-HAT + 3403 8 2120 2121 2127 # CAM-CAO-HAT + 3404 7 2121 2120 2126 # CAO-CAM-HAT + 3405 4 2121 2116 2122 # CAO-CAT-CTT + 3406 12 2128 2122 2129 # HT-CTT-HT + 3407 12 2128 2122 2130 # HT-CTT-HT + 3408 12 2129 2122 2130 # HT-CTT-HT + 3409 1 2131 2132 2133 # CAT-CAO-CAM + 3410 2 2131 2132 2138 # CAT-CAO-HAT + 3411 3 2131 2137 2143 # CAT-CTT-HT + 3412 3 2131 2137 2144 # CAT-CTT-HT + 3413 3 2131 2137 2145 # CAT-CTT-HT + 3414 1 2131 2136 2135 # CAT-CAO-CAM + 3415 2 2131 2136 2142 # CAT-CAO-HAT + 3416 4 2132 2131 2137 # CAO-CAT-CTT + 3417 5 2132 2131 2136 # CAO-CAT-CAO + 3418 6 2132 2133 2134 # CAO-CAM-CAP + 3419 7 2132 2133 2139 # CAO-CAM-HAT + 3420 8 2133 2132 2138 # CAM-CAO-HAT + 3421 9 2133 2134 2135 # CAM-CAP-CAM + 3422 10 2133 2134 2140 # CAM-CAP-HAT + 3423 11 2134 2133 2139 # CAP-CAM-HAT + 3424 6 2136 2135 2134 # CAO-CAM-CAP + 3425 11 2134 2135 2141 # CAP-CAM-HAT + 3426 10 2135 2134 2140 # CAM-CAP-HAT + 3427 8 2135 2136 2142 # CAM-CAO-HAT + 3428 7 2136 2135 2141 # CAO-CAM-HAT + 3429 4 2136 2131 2137 # CAO-CAT-CTT + 3430 12 2143 2137 2144 # HT-CTT-HT + 3431 12 2143 2137 2145 # HT-CTT-HT + 3432 12 2144 2137 2145 # HT-CTT-HT + 3433 1 2146 2147 2148 # CAT-CAO-CAM + 3434 2 2146 2147 2153 # CAT-CAO-HAT + 3435 3 2146 2152 2158 # CAT-CTT-HT + 3436 3 2146 2152 2159 # CAT-CTT-HT + 3437 3 2146 2152 2160 # CAT-CTT-HT + 3438 1 2146 2151 2150 # CAT-CAO-CAM + 3439 2 2146 2151 2157 # CAT-CAO-HAT + 3440 4 2147 2146 2152 # CAO-CAT-CTT + 3441 5 2147 2146 2151 # CAO-CAT-CAO + 3442 6 2147 2148 2149 # CAO-CAM-CAP + 3443 7 2147 2148 2154 # CAO-CAM-HAT + 3444 8 2148 2147 2153 # CAM-CAO-HAT + 3445 9 2148 2149 2150 # CAM-CAP-CAM + 3446 10 2148 2149 2155 # CAM-CAP-HAT + 3447 11 2149 2148 2154 # CAP-CAM-HAT + 3448 6 2151 2150 2149 # CAO-CAM-CAP + 3449 11 2149 2150 2156 # CAP-CAM-HAT + 3450 10 2150 2149 2155 # CAM-CAP-HAT + 3451 8 2150 2151 2157 # CAM-CAO-HAT + 3452 7 2151 2150 2156 # CAO-CAM-HAT + 3453 4 2151 2146 2152 # CAO-CAT-CTT + 3454 12 2158 2152 2159 # HT-CTT-HT + 3455 12 2158 2152 2160 # HT-CTT-HT + 3456 12 2159 2152 2160 # HT-CTT-HT + 3457 1 2161 2162 2163 # CAT-CAO-CAM + 3458 2 2161 2162 2168 # CAT-CAO-HAT + 3459 3 2161 2167 2173 # CAT-CTT-HT + 3460 3 2161 2167 2174 # CAT-CTT-HT + 3461 3 2161 2167 2175 # CAT-CTT-HT + 3462 1 2161 2166 2165 # CAT-CAO-CAM + 3463 2 2161 2166 2172 # CAT-CAO-HAT + 3464 4 2162 2161 2167 # CAO-CAT-CTT + 3465 5 2162 2161 2166 # CAO-CAT-CAO + 3466 6 2162 2163 2164 # CAO-CAM-CAP + 3467 7 2162 2163 2169 # CAO-CAM-HAT + 3468 8 2163 2162 2168 # CAM-CAO-HAT + 3469 9 2163 2164 2165 # CAM-CAP-CAM + 3470 10 2163 2164 2170 # CAM-CAP-HAT + 3471 11 2164 2163 2169 # CAP-CAM-HAT + 3472 6 2166 2165 2164 # CAO-CAM-CAP + 3473 11 2164 2165 2171 # CAP-CAM-HAT + 3474 10 2165 2164 2170 # CAM-CAP-HAT + 3475 8 2165 2166 2172 # CAM-CAO-HAT + 3476 7 2166 2165 2171 # CAO-CAM-HAT + 3477 4 2166 2161 2167 # CAO-CAT-CTT + 3478 12 2173 2167 2174 # HT-CTT-HT + 3479 12 2173 2167 2175 # HT-CTT-HT + 3480 12 2174 2167 2175 # HT-CTT-HT + 3481 1 2176 2177 2178 # CAT-CAO-CAM + 3482 2 2176 2177 2183 # CAT-CAO-HAT + 3483 3 2176 2182 2188 # CAT-CTT-HT + 3484 3 2176 2182 2189 # CAT-CTT-HT + 3485 3 2176 2182 2190 # CAT-CTT-HT + 3486 1 2176 2181 2180 # CAT-CAO-CAM + 3487 2 2176 2181 2187 # CAT-CAO-HAT + 3488 4 2177 2176 2182 # CAO-CAT-CTT + 3489 5 2177 2176 2181 # CAO-CAT-CAO + 3490 6 2177 2178 2179 # CAO-CAM-CAP + 3491 7 2177 2178 2184 # CAO-CAM-HAT + 3492 8 2178 2177 2183 # CAM-CAO-HAT + 3493 9 2178 2179 2180 # CAM-CAP-CAM + 3494 10 2178 2179 2185 # CAM-CAP-HAT + 3495 11 2179 2178 2184 # CAP-CAM-HAT + 3496 6 2181 2180 2179 # CAO-CAM-CAP + 3497 11 2179 2180 2186 # CAP-CAM-HAT + 3498 10 2180 2179 2185 # CAM-CAP-HAT + 3499 8 2180 2181 2187 # CAM-CAO-HAT + 3500 7 2181 2180 2186 # CAO-CAM-HAT + 3501 4 2181 2176 2182 # CAO-CAT-CTT + 3502 12 2188 2182 2189 # HT-CTT-HT + 3503 12 2188 2182 2190 # HT-CTT-HT + 3504 12 2189 2182 2190 # HT-CTT-HT + 3505 1 2191 2192 2193 # CAT-CAO-CAM + 3506 2 2191 2192 2198 # CAT-CAO-HAT + 3507 3 2191 2197 2203 # CAT-CTT-HT + 3508 3 2191 2197 2204 # CAT-CTT-HT + 3509 3 2191 2197 2205 # CAT-CTT-HT + 3510 1 2191 2196 2195 # CAT-CAO-CAM + 3511 2 2191 2196 2202 # CAT-CAO-HAT + 3512 4 2192 2191 2197 # CAO-CAT-CTT + 3513 5 2192 2191 2196 # CAO-CAT-CAO + 3514 6 2192 2193 2194 # CAO-CAM-CAP + 3515 7 2192 2193 2199 # CAO-CAM-HAT + 3516 8 2193 2192 2198 # CAM-CAO-HAT + 3517 9 2193 2194 2195 # CAM-CAP-CAM + 3518 10 2193 2194 2200 # CAM-CAP-HAT + 3519 11 2194 2193 2199 # CAP-CAM-HAT + 3520 6 2196 2195 2194 # CAO-CAM-CAP + 3521 11 2194 2195 2201 # CAP-CAM-HAT + 3522 10 2195 2194 2200 # CAM-CAP-HAT + 3523 8 2195 2196 2202 # CAM-CAO-HAT + 3524 7 2196 2195 2201 # CAO-CAM-HAT + 3525 4 2196 2191 2197 # CAO-CAT-CTT + 3526 12 2203 2197 2204 # HT-CTT-HT + 3527 12 2203 2197 2205 # HT-CTT-HT + 3528 12 2204 2197 2205 # HT-CTT-HT + 3529 1 2206 2207 2208 # CAT-CAO-CAM + 3530 2 2206 2207 2213 # CAT-CAO-HAT + 3531 3 2206 2212 2218 # CAT-CTT-HT + 3532 3 2206 2212 2219 # CAT-CTT-HT + 3533 3 2206 2212 2220 # CAT-CTT-HT + 3534 1 2206 2211 2210 # CAT-CAO-CAM + 3535 2 2206 2211 2217 # CAT-CAO-HAT + 3536 4 2207 2206 2212 # CAO-CAT-CTT + 3537 5 2207 2206 2211 # CAO-CAT-CAO + 3538 6 2207 2208 2209 # CAO-CAM-CAP + 3539 7 2207 2208 2214 # CAO-CAM-HAT + 3540 8 2208 2207 2213 # CAM-CAO-HAT + 3541 9 2208 2209 2210 # CAM-CAP-CAM + 3542 10 2208 2209 2215 # CAM-CAP-HAT + 3543 11 2209 2208 2214 # CAP-CAM-HAT + 3544 6 2211 2210 2209 # CAO-CAM-CAP + 3545 11 2209 2210 2216 # CAP-CAM-HAT + 3546 10 2210 2209 2215 # CAM-CAP-HAT + 3547 8 2210 2211 2217 # CAM-CAO-HAT + 3548 7 2211 2210 2216 # CAO-CAM-HAT + 3549 4 2211 2206 2212 # CAO-CAT-CTT + 3550 12 2218 2212 2219 # HT-CTT-HT + 3551 12 2218 2212 2220 # HT-CTT-HT + 3552 12 2219 2212 2220 # HT-CTT-HT + 3553 1 2221 2222 2223 # CAT-CAO-CAM + 3554 2 2221 2222 2228 # CAT-CAO-HAT + 3555 3 2221 2227 2233 # CAT-CTT-HT + 3556 3 2221 2227 2234 # CAT-CTT-HT + 3557 3 2221 2227 2235 # CAT-CTT-HT + 3558 1 2221 2226 2225 # CAT-CAO-CAM + 3559 2 2221 2226 2232 # CAT-CAO-HAT + 3560 4 2222 2221 2227 # CAO-CAT-CTT + 3561 5 2222 2221 2226 # CAO-CAT-CAO + 3562 6 2222 2223 2224 # CAO-CAM-CAP + 3563 7 2222 2223 2229 # CAO-CAM-HAT + 3564 8 2223 2222 2228 # CAM-CAO-HAT + 3565 9 2223 2224 2225 # CAM-CAP-CAM + 3566 10 2223 2224 2230 # CAM-CAP-HAT + 3567 11 2224 2223 2229 # CAP-CAM-HAT + 3568 6 2226 2225 2224 # CAO-CAM-CAP + 3569 11 2224 2225 2231 # CAP-CAM-HAT + 3570 10 2225 2224 2230 # CAM-CAP-HAT + 3571 8 2225 2226 2232 # CAM-CAO-HAT + 3572 7 2226 2225 2231 # CAO-CAM-HAT + 3573 4 2226 2221 2227 # CAO-CAT-CTT + 3574 12 2233 2227 2234 # HT-CTT-HT + 3575 12 2233 2227 2235 # HT-CTT-HT + 3576 12 2234 2227 2235 # HT-CTT-HT + 3577 1 2236 2237 2238 # CAT-CAO-CAM + 3578 2 2236 2237 2243 # CAT-CAO-HAT + 3579 3 2236 2242 2248 # CAT-CTT-HT + 3580 3 2236 2242 2249 # CAT-CTT-HT + 3581 3 2236 2242 2250 # CAT-CTT-HT + 3582 1 2236 2241 2240 # CAT-CAO-CAM + 3583 2 2236 2241 2247 # CAT-CAO-HAT + 3584 4 2237 2236 2242 # CAO-CAT-CTT + 3585 5 2237 2236 2241 # CAO-CAT-CAO + 3586 6 2237 2238 2239 # CAO-CAM-CAP + 3587 7 2237 2238 2244 # CAO-CAM-HAT + 3588 8 2238 2237 2243 # CAM-CAO-HAT + 3589 9 2238 2239 2240 # CAM-CAP-CAM + 3590 10 2238 2239 2245 # CAM-CAP-HAT + 3591 11 2239 2238 2244 # CAP-CAM-HAT + 3592 6 2241 2240 2239 # CAO-CAM-CAP + 3593 11 2239 2240 2246 # CAP-CAM-HAT + 3594 10 2240 2239 2245 # CAM-CAP-HAT + 3595 8 2240 2241 2247 # CAM-CAO-HAT + 3596 7 2241 2240 2246 # CAO-CAM-HAT + 3597 4 2241 2236 2242 # CAO-CAT-CTT + 3598 12 2248 2242 2249 # HT-CTT-HT + 3599 12 2248 2242 2250 # HT-CTT-HT + 3600 12 2249 2242 2250 # HT-CTT-HT + 3601 1 2251 2252 2253 # CAT-CAO-CAM + 3602 2 2251 2252 2258 # CAT-CAO-HAT + 3603 3 2251 2257 2263 # CAT-CTT-HT + 3604 3 2251 2257 2264 # CAT-CTT-HT + 3605 3 2251 2257 2265 # CAT-CTT-HT + 3606 1 2251 2256 2255 # CAT-CAO-CAM + 3607 2 2251 2256 2262 # CAT-CAO-HAT + 3608 4 2252 2251 2257 # CAO-CAT-CTT + 3609 5 2252 2251 2256 # CAO-CAT-CAO + 3610 6 2252 2253 2254 # CAO-CAM-CAP + 3611 7 2252 2253 2259 # CAO-CAM-HAT + 3612 8 2253 2252 2258 # CAM-CAO-HAT + 3613 9 2253 2254 2255 # CAM-CAP-CAM + 3614 10 2253 2254 2260 # CAM-CAP-HAT + 3615 11 2254 2253 2259 # CAP-CAM-HAT + 3616 6 2256 2255 2254 # CAO-CAM-CAP + 3617 11 2254 2255 2261 # CAP-CAM-HAT + 3618 10 2255 2254 2260 # CAM-CAP-HAT + 3619 8 2255 2256 2262 # CAM-CAO-HAT + 3620 7 2256 2255 2261 # CAO-CAM-HAT + 3621 4 2256 2251 2257 # CAO-CAT-CTT + 3622 12 2263 2257 2264 # HT-CTT-HT + 3623 12 2263 2257 2265 # HT-CTT-HT + 3624 12 2264 2257 2265 # HT-CTT-HT + 3625 1 2266 2267 2268 # CAT-CAO-CAM + 3626 2 2266 2267 2273 # CAT-CAO-HAT + 3627 3 2266 2272 2278 # CAT-CTT-HT + 3628 3 2266 2272 2279 # CAT-CTT-HT + 3629 3 2266 2272 2280 # CAT-CTT-HT + 3630 1 2266 2271 2270 # CAT-CAO-CAM + 3631 2 2266 2271 2277 # CAT-CAO-HAT + 3632 4 2267 2266 2272 # CAO-CAT-CTT + 3633 5 2267 2266 2271 # CAO-CAT-CAO + 3634 6 2267 2268 2269 # CAO-CAM-CAP + 3635 7 2267 2268 2274 # CAO-CAM-HAT + 3636 8 2268 2267 2273 # CAM-CAO-HAT + 3637 9 2268 2269 2270 # CAM-CAP-CAM + 3638 10 2268 2269 2275 # CAM-CAP-HAT + 3639 11 2269 2268 2274 # CAP-CAM-HAT + 3640 6 2271 2270 2269 # CAO-CAM-CAP + 3641 11 2269 2270 2276 # CAP-CAM-HAT + 3642 10 2270 2269 2275 # CAM-CAP-HAT + 3643 8 2270 2271 2277 # CAM-CAO-HAT + 3644 7 2271 2270 2276 # CAO-CAM-HAT + 3645 4 2271 2266 2272 # CAO-CAT-CTT + 3646 12 2278 2272 2279 # HT-CTT-HT + 3647 12 2278 2272 2280 # HT-CTT-HT + 3648 12 2279 2272 2280 # HT-CTT-HT + 3649 1 2281 2282 2283 # CAT-CAO-CAM + 3650 2 2281 2282 2288 # CAT-CAO-HAT + 3651 3 2281 2287 2293 # CAT-CTT-HT + 3652 3 2281 2287 2294 # CAT-CTT-HT + 3653 3 2281 2287 2295 # CAT-CTT-HT + 3654 1 2281 2286 2285 # CAT-CAO-CAM + 3655 2 2281 2286 2292 # CAT-CAO-HAT + 3656 4 2282 2281 2287 # CAO-CAT-CTT + 3657 5 2282 2281 2286 # CAO-CAT-CAO + 3658 6 2282 2283 2284 # CAO-CAM-CAP + 3659 7 2282 2283 2289 # CAO-CAM-HAT + 3660 8 2283 2282 2288 # CAM-CAO-HAT + 3661 9 2283 2284 2285 # CAM-CAP-CAM + 3662 10 2283 2284 2290 # CAM-CAP-HAT + 3663 11 2284 2283 2289 # CAP-CAM-HAT + 3664 6 2286 2285 2284 # CAO-CAM-CAP + 3665 11 2284 2285 2291 # CAP-CAM-HAT + 3666 10 2285 2284 2290 # CAM-CAP-HAT + 3667 8 2285 2286 2292 # CAM-CAO-HAT + 3668 7 2286 2285 2291 # CAO-CAM-HAT + 3669 4 2286 2281 2287 # CAO-CAT-CTT + 3670 12 2293 2287 2294 # HT-CTT-HT + 3671 12 2293 2287 2295 # HT-CTT-HT + 3672 12 2294 2287 2295 # HT-CTT-HT + 3673 1 2296 2297 2298 # CAT-CAO-CAM + 3674 2 2296 2297 2303 # CAT-CAO-HAT + 3675 3 2296 2302 2308 # CAT-CTT-HT + 3676 3 2296 2302 2309 # CAT-CTT-HT + 3677 3 2296 2302 2310 # CAT-CTT-HT + 3678 1 2296 2301 2300 # CAT-CAO-CAM + 3679 2 2296 2301 2307 # CAT-CAO-HAT + 3680 4 2297 2296 2302 # CAO-CAT-CTT + 3681 5 2297 2296 2301 # CAO-CAT-CAO + 3682 6 2297 2298 2299 # CAO-CAM-CAP + 3683 7 2297 2298 2304 # CAO-CAM-HAT + 3684 8 2298 2297 2303 # CAM-CAO-HAT + 3685 9 2298 2299 2300 # CAM-CAP-CAM + 3686 10 2298 2299 2305 # CAM-CAP-HAT + 3687 11 2299 2298 2304 # CAP-CAM-HAT + 3688 6 2301 2300 2299 # CAO-CAM-CAP + 3689 11 2299 2300 2306 # CAP-CAM-HAT + 3690 10 2300 2299 2305 # CAM-CAP-HAT + 3691 8 2300 2301 2307 # CAM-CAO-HAT + 3692 7 2301 2300 2306 # CAO-CAM-HAT + 3693 4 2301 2296 2302 # CAO-CAT-CTT + 3694 12 2308 2302 2309 # HT-CTT-HT + 3695 12 2308 2302 2310 # HT-CTT-HT + 3696 12 2309 2302 2310 # HT-CTT-HT + 3697 1 2311 2312 2313 # CAT-CAO-CAM + 3698 2 2311 2312 2318 # CAT-CAO-HAT + 3699 3 2311 2317 2323 # CAT-CTT-HT + 3700 3 2311 2317 2324 # CAT-CTT-HT + 3701 3 2311 2317 2325 # CAT-CTT-HT + 3702 1 2311 2316 2315 # CAT-CAO-CAM + 3703 2 2311 2316 2322 # CAT-CAO-HAT + 3704 4 2312 2311 2317 # CAO-CAT-CTT + 3705 5 2312 2311 2316 # CAO-CAT-CAO + 3706 6 2312 2313 2314 # CAO-CAM-CAP + 3707 7 2312 2313 2319 # CAO-CAM-HAT + 3708 8 2313 2312 2318 # CAM-CAO-HAT + 3709 9 2313 2314 2315 # CAM-CAP-CAM + 3710 10 2313 2314 2320 # CAM-CAP-HAT + 3711 11 2314 2313 2319 # CAP-CAM-HAT + 3712 6 2316 2315 2314 # CAO-CAM-CAP + 3713 11 2314 2315 2321 # CAP-CAM-HAT + 3714 10 2315 2314 2320 # CAM-CAP-HAT + 3715 8 2315 2316 2322 # CAM-CAO-HAT + 3716 7 2316 2315 2321 # CAO-CAM-HAT + 3717 4 2316 2311 2317 # CAO-CAT-CTT + 3718 12 2323 2317 2324 # HT-CTT-HT + 3719 12 2323 2317 2325 # HT-CTT-HT + 3720 12 2324 2317 2325 # HT-CTT-HT + 3721 1 2326 2327 2328 # CAT-CAO-CAM + 3722 2 2326 2327 2333 # CAT-CAO-HAT + 3723 3 2326 2332 2338 # CAT-CTT-HT + 3724 3 2326 2332 2339 # CAT-CTT-HT + 3725 3 2326 2332 2340 # CAT-CTT-HT + 3726 1 2326 2331 2330 # CAT-CAO-CAM + 3727 2 2326 2331 2337 # CAT-CAO-HAT + 3728 4 2327 2326 2332 # CAO-CAT-CTT + 3729 5 2327 2326 2331 # CAO-CAT-CAO + 3730 6 2327 2328 2329 # CAO-CAM-CAP + 3731 7 2327 2328 2334 # CAO-CAM-HAT + 3732 8 2328 2327 2333 # CAM-CAO-HAT + 3733 9 2328 2329 2330 # CAM-CAP-CAM + 3734 10 2328 2329 2335 # CAM-CAP-HAT + 3735 11 2329 2328 2334 # CAP-CAM-HAT + 3736 6 2331 2330 2329 # CAO-CAM-CAP + 3737 11 2329 2330 2336 # CAP-CAM-HAT + 3738 10 2330 2329 2335 # CAM-CAP-HAT + 3739 8 2330 2331 2337 # CAM-CAO-HAT + 3740 7 2331 2330 2336 # CAO-CAM-HAT + 3741 4 2331 2326 2332 # CAO-CAT-CTT + 3742 12 2338 2332 2339 # HT-CTT-HT + 3743 12 2338 2332 2340 # HT-CTT-HT + 3744 12 2339 2332 2340 # HT-CTT-HT + 3745 1 2341 2342 2343 # CAT-CAO-CAM + 3746 2 2341 2342 2348 # CAT-CAO-HAT + 3747 3 2341 2347 2353 # CAT-CTT-HT + 3748 3 2341 2347 2354 # CAT-CTT-HT + 3749 3 2341 2347 2355 # CAT-CTT-HT + 3750 1 2341 2346 2345 # CAT-CAO-CAM + 3751 2 2341 2346 2352 # CAT-CAO-HAT + 3752 4 2342 2341 2347 # CAO-CAT-CTT + 3753 5 2342 2341 2346 # CAO-CAT-CAO + 3754 6 2342 2343 2344 # CAO-CAM-CAP + 3755 7 2342 2343 2349 # CAO-CAM-HAT + 3756 8 2343 2342 2348 # CAM-CAO-HAT + 3757 9 2343 2344 2345 # CAM-CAP-CAM + 3758 10 2343 2344 2350 # CAM-CAP-HAT + 3759 11 2344 2343 2349 # CAP-CAM-HAT + 3760 6 2346 2345 2344 # CAO-CAM-CAP + 3761 11 2344 2345 2351 # CAP-CAM-HAT + 3762 10 2345 2344 2350 # CAM-CAP-HAT + 3763 8 2345 2346 2352 # CAM-CAO-HAT + 3764 7 2346 2345 2351 # CAO-CAM-HAT + 3765 4 2346 2341 2347 # CAO-CAT-CTT + 3766 12 2353 2347 2354 # HT-CTT-HT + 3767 12 2353 2347 2355 # HT-CTT-HT + 3768 12 2354 2347 2355 # HT-CTT-HT + 3769 1 2356 2357 2358 # CAT-CAO-CAM + 3770 2 2356 2357 2363 # CAT-CAO-HAT + 3771 3 2356 2362 2368 # CAT-CTT-HT + 3772 3 2356 2362 2369 # CAT-CTT-HT + 3773 3 2356 2362 2370 # CAT-CTT-HT + 3774 1 2356 2361 2360 # CAT-CAO-CAM + 3775 2 2356 2361 2367 # CAT-CAO-HAT + 3776 4 2357 2356 2362 # CAO-CAT-CTT + 3777 5 2357 2356 2361 # CAO-CAT-CAO + 3778 6 2357 2358 2359 # CAO-CAM-CAP + 3779 7 2357 2358 2364 # CAO-CAM-HAT + 3780 8 2358 2357 2363 # CAM-CAO-HAT + 3781 9 2358 2359 2360 # CAM-CAP-CAM + 3782 10 2358 2359 2365 # CAM-CAP-HAT + 3783 11 2359 2358 2364 # CAP-CAM-HAT + 3784 6 2361 2360 2359 # CAO-CAM-CAP + 3785 11 2359 2360 2366 # CAP-CAM-HAT + 3786 10 2360 2359 2365 # CAM-CAP-HAT + 3787 8 2360 2361 2367 # CAM-CAO-HAT + 3788 7 2361 2360 2366 # CAO-CAM-HAT + 3789 4 2361 2356 2362 # CAO-CAT-CTT + 3790 12 2368 2362 2369 # HT-CTT-HT + 3791 12 2368 2362 2370 # HT-CTT-HT + 3792 12 2369 2362 2370 # HT-CTT-HT + 3793 1 2371 2372 2373 # CAT-CAO-CAM + 3794 2 2371 2372 2378 # CAT-CAO-HAT + 3795 3 2371 2377 2383 # CAT-CTT-HT + 3796 3 2371 2377 2384 # CAT-CTT-HT + 3797 3 2371 2377 2385 # CAT-CTT-HT + 3798 1 2371 2376 2375 # CAT-CAO-CAM + 3799 2 2371 2376 2382 # CAT-CAO-HAT + 3800 4 2372 2371 2377 # CAO-CAT-CTT + 3801 5 2372 2371 2376 # CAO-CAT-CAO + 3802 6 2372 2373 2374 # CAO-CAM-CAP + 3803 7 2372 2373 2379 # CAO-CAM-HAT + 3804 8 2373 2372 2378 # CAM-CAO-HAT + 3805 9 2373 2374 2375 # CAM-CAP-CAM + 3806 10 2373 2374 2380 # CAM-CAP-HAT + 3807 11 2374 2373 2379 # CAP-CAM-HAT + 3808 6 2376 2375 2374 # CAO-CAM-CAP + 3809 11 2374 2375 2381 # CAP-CAM-HAT + 3810 10 2375 2374 2380 # CAM-CAP-HAT + 3811 8 2375 2376 2382 # CAM-CAO-HAT + 3812 7 2376 2375 2381 # CAO-CAM-HAT + 3813 4 2376 2371 2377 # CAO-CAT-CTT + 3814 12 2383 2377 2384 # HT-CTT-HT + 3815 12 2383 2377 2385 # HT-CTT-HT + 3816 12 2384 2377 2385 # HT-CTT-HT + 3817 1 2386 2387 2388 # CAT-CAO-CAM + 3818 2 2386 2387 2393 # CAT-CAO-HAT + 3819 3 2386 2392 2398 # CAT-CTT-HT + 3820 3 2386 2392 2399 # CAT-CTT-HT + 3821 3 2386 2392 2400 # CAT-CTT-HT + 3822 1 2386 2391 2390 # CAT-CAO-CAM + 3823 2 2386 2391 2397 # CAT-CAO-HAT + 3824 4 2387 2386 2392 # CAO-CAT-CTT + 3825 5 2387 2386 2391 # CAO-CAT-CAO + 3826 6 2387 2388 2389 # CAO-CAM-CAP + 3827 7 2387 2388 2394 # CAO-CAM-HAT + 3828 8 2388 2387 2393 # CAM-CAO-HAT + 3829 9 2388 2389 2390 # CAM-CAP-CAM + 3830 10 2388 2389 2395 # CAM-CAP-HAT + 3831 11 2389 2388 2394 # CAP-CAM-HAT + 3832 6 2391 2390 2389 # CAO-CAM-CAP + 3833 11 2389 2390 2396 # CAP-CAM-HAT + 3834 10 2390 2389 2395 # CAM-CAP-HAT + 3835 8 2390 2391 2397 # CAM-CAO-HAT + 3836 7 2391 2390 2396 # CAO-CAM-HAT + 3837 4 2391 2386 2392 # CAO-CAT-CTT + 3838 12 2398 2392 2399 # HT-CTT-HT + 3839 12 2398 2392 2400 # HT-CTT-HT + 3840 12 2399 2392 2400 # HT-CTT-HT + 3841 1 2401 2402 2403 # CAT-CAO-CAM + 3842 2 2401 2402 2408 # CAT-CAO-HAT + 3843 3 2401 2407 2413 # CAT-CTT-HT + 3844 3 2401 2407 2414 # CAT-CTT-HT + 3845 3 2401 2407 2415 # CAT-CTT-HT + 3846 1 2401 2406 2405 # CAT-CAO-CAM + 3847 2 2401 2406 2412 # CAT-CAO-HAT + 3848 4 2402 2401 2407 # CAO-CAT-CTT + 3849 5 2402 2401 2406 # CAO-CAT-CAO + 3850 6 2402 2403 2404 # CAO-CAM-CAP + 3851 7 2402 2403 2409 # CAO-CAM-HAT + 3852 8 2403 2402 2408 # CAM-CAO-HAT + 3853 9 2403 2404 2405 # CAM-CAP-CAM + 3854 10 2403 2404 2410 # CAM-CAP-HAT + 3855 11 2404 2403 2409 # CAP-CAM-HAT + 3856 6 2406 2405 2404 # CAO-CAM-CAP + 3857 11 2404 2405 2411 # CAP-CAM-HAT + 3858 10 2405 2404 2410 # CAM-CAP-HAT + 3859 8 2405 2406 2412 # CAM-CAO-HAT + 3860 7 2406 2405 2411 # CAO-CAM-HAT + 3861 4 2406 2401 2407 # CAO-CAT-CTT + 3862 12 2413 2407 2414 # HT-CTT-HT + 3863 12 2413 2407 2415 # HT-CTT-HT + 3864 12 2414 2407 2415 # HT-CTT-HT + 3865 1 2416 2417 2418 # CAT-CAO-CAM + 3866 2 2416 2417 2423 # CAT-CAO-HAT + 3867 3 2416 2422 2428 # CAT-CTT-HT + 3868 3 2416 2422 2429 # CAT-CTT-HT + 3869 3 2416 2422 2430 # CAT-CTT-HT + 3870 1 2416 2421 2420 # CAT-CAO-CAM + 3871 2 2416 2421 2427 # CAT-CAO-HAT + 3872 4 2417 2416 2422 # CAO-CAT-CTT + 3873 5 2417 2416 2421 # CAO-CAT-CAO + 3874 6 2417 2418 2419 # CAO-CAM-CAP + 3875 7 2417 2418 2424 # CAO-CAM-HAT + 3876 8 2418 2417 2423 # CAM-CAO-HAT + 3877 9 2418 2419 2420 # CAM-CAP-CAM + 3878 10 2418 2419 2425 # CAM-CAP-HAT + 3879 11 2419 2418 2424 # CAP-CAM-HAT + 3880 6 2421 2420 2419 # CAO-CAM-CAP + 3881 11 2419 2420 2426 # CAP-CAM-HAT + 3882 10 2420 2419 2425 # CAM-CAP-HAT + 3883 8 2420 2421 2427 # CAM-CAO-HAT + 3884 7 2421 2420 2426 # CAO-CAM-HAT + 3885 4 2421 2416 2422 # CAO-CAT-CTT + 3886 12 2428 2422 2429 # HT-CTT-HT + 3887 12 2428 2422 2430 # HT-CTT-HT + 3888 12 2429 2422 2430 # HT-CTT-HT + 3889 1 2431 2432 2433 # CAT-CAO-CAM + 3890 2 2431 2432 2438 # CAT-CAO-HAT + 3891 3 2431 2437 2443 # CAT-CTT-HT + 3892 3 2431 2437 2444 # CAT-CTT-HT + 3893 3 2431 2437 2445 # CAT-CTT-HT + 3894 1 2431 2436 2435 # CAT-CAO-CAM + 3895 2 2431 2436 2442 # CAT-CAO-HAT + 3896 4 2432 2431 2437 # CAO-CAT-CTT + 3897 5 2432 2431 2436 # CAO-CAT-CAO + 3898 6 2432 2433 2434 # CAO-CAM-CAP + 3899 7 2432 2433 2439 # CAO-CAM-HAT + 3900 8 2433 2432 2438 # CAM-CAO-HAT + 3901 9 2433 2434 2435 # CAM-CAP-CAM + 3902 10 2433 2434 2440 # CAM-CAP-HAT + 3903 11 2434 2433 2439 # CAP-CAM-HAT + 3904 6 2436 2435 2434 # CAO-CAM-CAP + 3905 11 2434 2435 2441 # CAP-CAM-HAT + 3906 10 2435 2434 2440 # CAM-CAP-HAT + 3907 8 2435 2436 2442 # CAM-CAO-HAT + 3908 7 2436 2435 2441 # CAO-CAM-HAT + 3909 4 2436 2431 2437 # CAO-CAT-CTT + 3910 12 2443 2437 2444 # HT-CTT-HT + 3911 12 2443 2437 2445 # HT-CTT-HT + 3912 12 2444 2437 2445 # HT-CTT-HT + 3913 1 2446 2447 2448 # CAT-CAO-CAM + 3914 2 2446 2447 2453 # CAT-CAO-HAT + 3915 3 2446 2452 2458 # CAT-CTT-HT + 3916 3 2446 2452 2459 # CAT-CTT-HT + 3917 3 2446 2452 2460 # CAT-CTT-HT + 3918 1 2446 2451 2450 # CAT-CAO-CAM + 3919 2 2446 2451 2457 # CAT-CAO-HAT + 3920 4 2447 2446 2452 # CAO-CAT-CTT + 3921 5 2447 2446 2451 # CAO-CAT-CAO + 3922 6 2447 2448 2449 # CAO-CAM-CAP + 3923 7 2447 2448 2454 # CAO-CAM-HAT + 3924 8 2448 2447 2453 # CAM-CAO-HAT + 3925 9 2448 2449 2450 # CAM-CAP-CAM + 3926 10 2448 2449 2455 # CAM-CAP-HAT + 3927 11 2449 2448 2454 # CAP-CAM-HAT + 3928 6 2451 2450 2449 # CAO-CAM-CAP + 3929 11 2449 2450 2456 # CAP-CAM-HAT + 3930 10 2450 2449 2455 # CAM-CAP-HAT + 3931 8 2450 2451 2457 # CAM-CAO-HAT + 3932 7 2451 2450 2456 # CAO-CAM-HAT + 3933 4 2451 2446 2452 # CAO-CAT-CTT + 3934 12 2458 2452 2459 # HT-CTT-HT + 3935 12 2458 2452 2460 # HT-CTT-HT + 3936 12 2459 2452 2460 # HT-CTT-HT + 3937 1 2461 2462 2463 # CAT-CAO-CAM + 3938 2 2461 2462 2468 # CAT-CAO-HAT + 3939 3 2461 2467 2473 # CAT-CTT-HT + 3940 3 2461 2467 2474 # CAT-CTT-HT + 3941 3 2461 2467 2475 # CAT-CTT-HT + 3942 1 2461 2466 2465 # CAT-CAO-CAM + 3943 2 2461 2466 2472 # CAT-CAO-HAT + 3944 4 2462 2461 2467 # CAO-CAT-CTT + 3945 5 2462 2461 2466 # CAO-CAT-CAO + 3946 6 2462 2463 2464 # CAO-CAM-CAP + 3947 7 2462 2463 2469 # CAO-CAM-HAT + 3948 8 2463 2462 2468 # CAM-CAO-HAT + 3949 9 2463 2464 2465 # CAM-CAP-CAM + 3950 10 2463 2464 2470 # CAM-CAP-HAT + 3951 11 2464 2463 2469 # CAP-CAM-HAT + 3952 6 2466 2465 2464 # CAO-CAM-CAP + 3953 11 2464 2465 2471 # CAP-CAM-HAT + 3954 10 2465 2464 2470 # CAM-CAP-HAT + 3955 8 2465 2466 2472 # CAM-CAO-HAT + 3956 7 2466 2465 2471 # CAO-CAM-HAT + 3957 4 2466 2461 2467 # CAO-CAT-CTT + 3958 12 2473 2467 2474 # HT-CTT-HT + 3959 12 2473 2467 2475 # HT-CTT-HT + 3960 12 2474 2467 2475 # HT-CTT-HT + 3961 1 2476 2477 2478 # CAT-CAO-CAM + 3962 2 2476 2477 2483 # CAT-CAO-HAT + 3963 3 2476 2482 2488 # CAT-CTT-HT + 3964 3 2476 2482 2489 # CAT-CTT-HT + 3965 3 2476 2482 2490 # CAT-CTT-HT + 3966 1 2476 2481 2480 # CAT-CAO-CAM + 3967 2 2476 2481 2487 # CAT-CAO-HAT + 3968 4 2477 2476 2482 # CAO-CAT-CTT + 3969 5 2477 2476 2481 # CAO-CAT-CAO + 3970 6 2477 2478 2479 # CAO-CAM-CAP + 3971 7 2477 2478 2484 # CAO-CAM-HAT + 3972 8 2478 2477 2483 # CAM-CAO-HAT + 3973 9 2478 2479 2480 # CAM-CAP-CAM + 3974 10 2478 2479 2485 # CAM-CAP-HAT + 3975 11 2479 2478 2484 # CAP-CAM-HAT + 3976 6 2481 2480 2479 # CAO-CAM-CAP + 3977 11 2479 2480 2486 # CAP-CAM-HAT + 3978 10 2480 2479 2485 # CAM-CAP-HAT + 3979 8 2480 2481 2487 # CAM-CAO-HAT + 3980 7 2481 2480 2486 # CAO-CAM-HAT + 3981 4 2481 2476 2482 # CAO-CAT-CTT + 3982 12 2488 2482 2489 # HT-CTT-HT + 3983 12 2488 2482 2490 # HT-CTT-HT + 3984 12 2489 2482 2490 # HT-CTT-HT + 3985 1 2491 2492 2493 # CAT-CAO-CAM + 3986 2 2491 2492 2498 # CAT-CAO-HAT + 3987 3 2491 2497 2503 # CAT-CTT-HT + 3988 3 2491 2497 2504 # CAT-CTT-HT + 3989 3 2491 2497 2505 # CAT-CTT-HT + 3990 1 2491 2496 2495 # CAT-CAO-CAM + 3991 2 2491 2496 2502 # CAT-CAO-HAT + 3992 4 2492 2491 2497 # CAO-CAT-CTT + 3993 5 2492 2491 2496 # CAO-CAT-CAO + 3994 6 2492 2493 2494 # CAO-CAM-CAP + 3995 7 2492 2493 2499 # CAO-CAM-HAT + 3996 8 2493 2492 2498 # CAM-CAO-HAT + 3997 9 2493 2494 2495 # CAM-CAP-CAM + 3998 10 2493 2494 2500 # CAM-CAP-HAT + 3999 11 2494 2493 2499 # CAP-CAM-HAT + 4000 6 2496 2495 2494 # CAO-CAM-CAP + 4001 11 2494 2495 2501 # CAP-CAM-HAT + 4002 10 2495 2494 2500 # CAM-CAP-HAT + 4003 8 2495 2496 2502 # CAM-CAO-HAT + 4004 7 2496 2495 2501 # CAO-CAM-HAT + 4005 4 2496 2491 2497 # CAO-CAT-CTT + 4006 12 2503 2497 2504 # HT-CTT-HT + 4007 12 2503 2497 2505 # HT-CTT-HT + 4008 12 2504 2497 2505 # HT-CTT-HT + 4009 1 2506 2507 2508 # CAT-CAO-CAM + 4010 2 2506 2507 2513 # CAT-CAO-HAT + 4011 3 2506 2512 2518 # CAT-CTT-HT + 4012 3 2506 2512 2519 # CAT-CTT-HT + 4013 3 2506 2512 2520 # CAT-CTT-HT + 4014 1 2506 2511 2510 # CAT-CAO-CAM + 4015 2 2506 2511 2517 # CAT-CAO-HAT + 4016 4 2507 2506 2512 # CAO-CAT-CTT + 4017 5 2507 2506 2511 # CAO-CAT-CAO + 4018 6 2507 2508 2509 # CAO-CAM-CAP + 4019 7 2507 2508 2514 # CAO-CAM-HAT + 4020 8 2508 2507 2513 # CAM-CAO-HAT + 4021 9 2508 2509 2510 # CAM-CAP-CAM + 4022 10 2508 2509 2515 # CAM-CAP-HAT + 4023 11 2509 2508 2514 # CAP-CAM-HAT + 4024 6 2511 2510 2509 # CAO-CAM-CAP + 4025 11 2509 2510 2516 # CAP-CAM-HAT + 4026 10 2510 2509 2515 # CAM-CAP-HAT + 4027 8 2510 2511 2517 # CAM-CAO-HAT + 4028 7 2511 2510 2516 # CAO-CAM-HAT + 4029 4 2511 2506 2512 # CAO-CAT-CTT + 4030 12 2518 2512 2519 # HT-CTT-HT + 4031 12 2518 2512 2520 # HT-CTT-HT + 4032 12 2519 2512 2520 # HT-CTT-HT + 4033 1 2521 2522 2523 # CAT-CAO-CAM + 4034 2 2521 2522 2528 # CAT-CAO-HAT + 4035 3 2521 2527 2533 # CAT-CTT-HT + 4036 3 2521 2527 2534 # CAT-CTT-HT + 4037 3 2521 2527 2535 # CAT-CTT-HT + 4038 1 2521 2526 2525 # CAT-CAO-CAM + 4039 2 2521 2526 2532 # CAT-CAO-HAT + 4040 4 2522 2521 2527 # CAO-CAT-CTT + 4041 5 2522 2521 2526 # CAO-CAT-CAO + 4042 6 2522 2523 2524 # CAO-CAM-CAP + 4043 7 2522 2523 2529 # CAO-CAM-HAT + 4044 8 2523 2522 2528 # CAM-CAO-HAT + 4045 9 2523 2524 2525 # CAM-CAP-CAM + 4046 10 2523 2524 2530 # CAM-CAP-HAT + 4047 11 2524 2523 2529 # CAP-CAM-HAT + 4048 6 2526 2525 2524 # CAO-CAM-CAP + 4049 11 2524 2525 2531 # CAP-CAM-HAT + 4050 10 2525 2524 2530 # CAM-CAP-HAT + 4051 8 2525 2526 2532 # CAM-CAO-HAT + 4052 7 2526 2525 2531 # CAO-CAM-HAT + 4053 4 2526 2521 2527 # CAO-CAT-CTT + 4054 12 2533 2527 2534 # HT-CTT-HT + 4055 12 2533 2527 2535 # HT-CTT-HT + 4056 12 2534 2527 2535 # HT-CTT-HT + 4057 1 2536 2537 2538 # CAT-CAO-CAM + 4058 2 2536 2537 2543 # CAT-CAO-HAT + 4059 3 2536 2542 2548 # CAT-CTT-HT + 4060 3 2536 2542 2549 # CAT-CTT-HT + 4061 3 2536 2542 2550 # CAT-CTT-HT + 4062 1 2536 2541 2540 # CAT-CAO-CAM + 4063 2 2536 2541 2547 # CAT-CAO-HAT + 4064 4 2537 2536 2542 # CAO-CAT-CTT + 4065 5 2537 2536 2541 # CAO-CAT-CAO + 4066 6 2537 2538 2539 # CAO-CAM-CAP + 4067 7 2537 2538 2544 # CAO-CAM-HAT + 4068 8 2538 2537 2543 # CAM-CAO-HAT + 4069 9 2538 2539 2540 # CAM-CAP-CAM + 4070 10 2538 2539 2545 # CAM-CAP-HAT + 4071 11 2539 2538 2544 # CAP-CAM-HAT + 4072 6 2541 2540 2539 # CAO-CAM-CAP + 4073 11 2539 2540 2546 # CAP-CAM-HAT + 4074 10 2540 2539 2545 # CAM-CAP-HAT + 4075 8 2540 2541 2547 # CAM-CAO-HAT + 4076 7 2541 2540 2546 # CAO-CAM-HAT + 4077 4 2541 2536 2542 # CAO-CAT-CTT + 4078 12 2548 2542 2549 # HT-CTT-HT + 4079 12 2548 2542 2550 # HT-CTT-HT + 4080 12 2549 2542 2550 # HT-CTT-HT + 4081 1 2551 2552 2553 # CAT-CAO-CAM + 4082 2 2551 2552 2558 # CAT-CAO-HAT + 4083 3 2551 2557 2563 # CAT-CTT-HT + 4084 3 2551 2557 2564 # CAT-CTT-HT + 4085 3 2551 2557 2565 # CAT-CTT-HT + 4086 1 2551 2556 2555 # CAT-CAO-CAM + 4087 2 2551 2556 2562 # CAT-CAO-HAT + 4088 4 2552 2551 2557 # CAO-CAT-CTT + 4089 5 2552 2551 2556 # CAO-CAT-CAO + 4090 6 2552 2553 2554 # CAO-CAM-CAP + 4091 7 2552 2553 2559 # CAO-CAM-HAT + 4092 8 2553 2552 2558 # CAM-CAO-HAT + 4093 9 2553 2554 2555 # CAM-CAP-CAM + 4094 10 2553 2554 2560 # CAM-CAP-HAT + 4095 11 2554 2553 2559 # CAP-CAM-HAT + 4096 6 2556 2555 2554 # CAO-CAM-CAP + 4097 11 2554 2555 2561 # CAP-CAM-HAT + 4098 10 2555 2554 2560 # CAM-CAP-HAT + 4099 8 2555 2556 2562 # CAM-CAO-HAT + 4100 7 2556 2555 2561 # CAO-CAM-HAT + 4101 4 2556 2551 2557 # CAO-CAT-CTT + 4102 12 2563 2557 2564 # HT-CTT-HT + 4103 12 2563 2557 2565 # HT-CTT-HT + 4104 12 2564 2557 2565 # HT-CTT-HT + 4105 1 2566 2567 2568 # CAT-CAO-CAM + 4106 2 2566 2567 2573 # CAT-CAO-HAT + 4107 3 2566 2572 2578 # CAT-CTT-HT + 4108 3 2566 2572 2579 # CAT-CTT-HT + 4109 3 2566 2572 2580 # CAT-CTT-HT + 4110 1 2566 2571 2570 # CAT-CAO-CAM + 4111 2 2566 2571 2577 # CAT-CAO-HAT + 4112 4 2567 2566 2572 # CAO-CAT-CTT + 4113 5 2567 2566 2571 # CAO-CAT-CAO + 4114 6 2567 2568 2569 # CAO-CAM-CAP + 4115 7 2567 2568 2574 # CAO-CAM-HAT + 4116 8 2568 2567 2573 # CAM-CAO-HAT + 4117 9 2568 2569 2570 # CAM-CAP-CAM + 4118 10 2568 2569 2575 # CAM-CAP-HAT + 4119 11 2569 2568 2574 # CAP-CAM-HAT + 4120 6 2571 2570 2569 # CAO-CAM-CAP + 4121 11 2569 2570 2576 # CAP-CAM-HAT + 4122 10 2570 2569 2575 # CAM-CAP-HAT + 4123 8 2570 2571 2577 # CAM-CAO-HAT + 4124 7 2571 2570 2576 # CAO-CAM-HAT + 4125 4 2571 2566 2572 # CAO-CAT-CTT + 4126 12 2578 2572 2579 # HT-CTT-HT + 4127 12 2578 2572 2580 # HT-CTT-HT + 4128 12 2579 2572 2580 # HT-CTT-HT + 4129 1 2581 2582 2583 # CAT-CAO-CAM + 4130 2 2581 2582 2588 # CAT-CAO-HAT + 4131 3 2581 2587 2593 # CAT-CTT-HT + 4132 3 2581 2587 2594 # CAT-CTT-HT + 4133 3 2581 2587 2595 # CAT-CTT-HT + 4134 1 2581 2586 2585 # CAT-CAO-CAM + 4135 2 2581 2586 2592 # CAT-CAO-HAT + 4136 4 2582 2581 2587 # CAO-CAT-CTT + 4137 5 2582 2581 2586 # CAO-CAT-CAO + 4138 6 2582 2583 2584 # CAO-CAM-CAP + 4139 7 2582 2583 2589 # CAO-CAM-HAT + 4140 8 2583 2582 2588 # CAM-CAO-HAT + 4141 9 2583 2584 2585 # CAM-CAP-CAM + 4142 10 2583 2584 2590 # CAM-CAP-HAT + 4143 11 2584 2583 2589 # CAP-CAM-HAT + 4144 6 2586 2585 2584 # CAO-CAM-CAP + 4145 11 2584 2585 2591 # CAP-CAM-HAT + 4146 10 2585 2584 2590 # CAM-CAP-HAT + 4147 8 2585 2586 2592 # CAM-CAO-HAT + 4148 7 2586 2585 2591 # CAO-CAM-HAT + 4149 4 2586 2581 2587 # CAO-CAT-CTT + 4150 12 2593 2587 2594 # HT-CTT-HT + 4151 12 2593 2587 2595 # HT-CTT-HT + 4152 12 2594 2587 2595 # HT-CTT-HT + 4153 1 2596 2597 2598 # CAT-CAO-CAM + 4154 2 2596 2597 2603 # CAT-CAO-HAT + 4155 3 2596 2602 2608 # CAT-CTT-HT + 4156 3 2596 2602 2609 # CAT-CTT-HT + 4157 3 2596 2602 2610 # CAT-CTT-HT + 4158 1 2596 2601 2600 # CAT-CAO-CAM + 4159 2 2596 2601 2607 # CAT-CAO-HAT + 4160 4 2597 2596 2602 # CAO-CAT-CTT + 4161 5 2597 2596 2601 # CAO-CAT-CAO + 4162 6 2597 2598 2599 # CAO-CAM-CAP + 4163 7 2597 2598 2604 # CAO-CAM-HAT + 4164 8 2598 2597 2603 # CAM-CAO-HAT + 4165 9 2598 2599 2600 # CAM-CAP-CAM + 4166 10 2598 2599 2605 # CAM-CAP-HAT + 4167 11 2599 2598 2604 # CAP-CAM-HAT + 4168 6 2601 2600 2599 # CAO-CAM-CAP + 4169 11 2599 2600 2606 # CAP-CAM-HAT + 4170 10 2600 2599 2605 # CAM-CAP-HAT + 4171 8 2600 2601 2607 # CAM-CAO-HAT + 4172 7 2601 2600 2606 # CAO-CAM-HAT + 4173 4 2601 2596 2602 # CAO-CAT-CTT + 4174 12 2608 2602 2609 # HT-CTT-HT + 4175 12 2608 2602 2610 # HT-CTT-HT + 4176 12 2609 2602 2610 # HT-CTT-HT + 4177 1 2611 2612 2613 # CAT-CAO-CAM + 4178 2 2611 2612 2618 # CAT-CAO-HAT + 4179 3 2611 2617 2623 # CAT-CTT-HT + 4180 3 2611 2617 2624 # CAT-CTT-HT + 4181 3 2611 2617 2625 # CAT-CTT-HT + 4182 1 2611 2616 2615 # CAT-CAO-CAM + 4183 2 2611 2616 2622 # CAT-CAO-HAT + 4184 4 2612 2611 2617 # CAO-CAT-CTT + 4185 5 2612 2611 2616 # CAO-CAT-CAO + 4186 6 2612 2613 2614 # CAO-CAM-CAP + 4187 7 2612 2613 2619 # CAO-CAM-HAT + 4188 8 2613 2612 2618 # CAM-CAO-HAT + 4189 9 2613 2614 2615 # CAM-CAP-CAM + 4190 10 2613 2614 2620 # CAM-CAP-HAT + 4191 11 2614 2613 2619 # CAP-CAM-HAT + 4192 6 2616 2615 2614 # CAO-CAM-CAP + 4193 11 2614 2615 2621 # CAP-CAM-HAT + 4194 10 2615 2614 2620 # CAM-CAP-HAT + 4195 8 2615 2616 2622 # CAM-CAO-HAT + 4196 7 2616 2615 2621 # CAO-CAM-HAT + 4197 4 2616 2611 2617 # CAO-CAT-CTT + 4198 12 2623 2617 2624 # HT-CTT-HT + 4199 12 2623 2617 2625 # HT-CTT-HT + 4200 12 2624 2617 2625 # HT-CTT-HT + 4201 1 2626 2627 2628 # CAT-CAO-CAM + 4202 2 2626 2627 2633 # CAT-CAO-HAT + 4203 3 2626 2632 2638 # CAT-CTT-HT + 4204 3 2626 2632 2639 # CAT-CTT-HT + 4205 3 2626 2632 2640 # CAT-CTT-HT + 4206 1 2626 2631 2630 # CAT-CAO-CAM + 4207 2 2626 2631 2637 # CAT-CAO-HAT + 4208 4 2627 2626 2632 # CAO-CAT-CTT + 4209 5 2627 2626 2631 # CAO-CAT-CAO + 4210 6 2627 2628 2629 # CAO-CAM-CAP + 4211 7 2627 2628 2634 # CAO-CAM-HAT + 4212 8 2628 2627 2633 # CAM-CAO-HAT + 4213 9 2628 2629 2630 # CAM-CAP-CAM + 4214 10 2628 2629 2635 # CAM-CAP-HAT + 4215 11 2629 2628 2634 # CAP-CAM-HAT + 4216 6 2631 2630 2629 # CAO-CAM-CAP + 4217 11 2629 2630 2636 # CAP-CAM-HAT + 4218 10 2630 2629 2635 # CAM-CAP-HAT + 4219 8 2630 2631 2637 # CAM-CAO-HAT + 4220 7 2631 2630 2636 # CAO-CAM-HAT + 4221 4 2631 2626 2632 # CAO-CAT-CTT + 4222 12 2638 2632 2639 # HT-CTT-HT + 4223 12 2638 2632 2640 # HT-CTT-HT + 4224 12 2639 2632 2640 # HT-CTT-HT + 4225 1 2641 2642 2643 # CAT-CAO-CAM + 4226 2 2641 2642 2648 # CAT-CAO-HAT + 4227 3 2641 2647 2653 # CAT-CTT-HT + 4228 3 2641 2647 2654 # CAT-CTT-HT + 4229 3 2641 2647 2655 # CAT-CTT-HT + 4230 1 2641 2646 2645 # CAT-CAO-CAM + 4231 2 2641 2646 2652 # CAT-CAO-HAT + 4232 4 2642 2641 2647 # CAO-CAT-CTT + 4233 5 2642 2641 2646 # CAO-CAT-CAO + 4234 6 2642 2643 2644 # CAO-CAM-CAP + 4235 7 2642 2643 2649 # CAO-CAM-HAT + 4236 8 2643 2642 2648 # CAM-CAO-HAT + 4237 9 2643 2644 2645 # CAM-CAP-CAM + 4238 10 2643 2644 2650 # CAM-CAP-HAT + 4239 11 2644 2643 2649 # CAP-CAM-HAT + 4240 6 2646 2645 2644 # CAO-CAM-CAP + 4241 11 2644 2645 2651 # CAP-CAM-HAT + 4242 10 2645 2644 2650 # CAM-CAP-HAT + 4243 8 2645 2646 2652 # CAM-CAO-HAT + 4244 7 2646 2645 2651 # CAO-CAM-HAT + 4245 4 2646 2641 2647 # CAO-CAT-CTT + 4246 12 2653 2647 2654 # HT-CTT-HT + 4247 12 2653 2647 2655 # HT-CTT-HT + 4248 12 2654 2647 2655 # HT-CTT-HT + 4249 1 2656 2657 2658 # CAT-CAO-CAM + 4250 2 2656 2657 2663 # CAT-CAO-HAT + 4251 3 2656 2662 2668 # CAT-CTT-HT + 4252 3 2656 2662 2669 # CAT-CTT-HT + 4253 3 2656 2662 2670 # CAT-CTT-HT + 4254 1 2656 2661 2660 # CAT-CAO-CAM + 4255 2 2656 2661 2667 # CAT-CAO-HAT + 4256 4 2657 2656 2662 # CAO-CAT-CTT + 4257 5 2657 2656 2661 # CAO-CAT-CAO + 4258 6 2657 2658 2659 # CAO-CAM-CAP + 4259 7 2657 2658 2664 # CAO-CAM-HAT + 4260 8 2658 2657 2663 # CAM-CAO-HAT + 4261 9 2658 2659 2660 # CAM-CAP-CAM + 4262 10 2658 2659 2665 # CAM-CAP-HAT + 4263 11 2659 2658 2664 # CAP-CAM-HAT + 4264 6 2661 2660 2659 # CAO-CAM-CAP + 4265 11 2659 2660 2666 # CAP-CAM-HAT + 4266 10 2660 2659 2665 # CAM-CAP-HAT + 4267 8 2660 2661 2667 # CAM-CAO-HAT + 4268 7 2661 2660 2666 # CAO-CAM-HAT + 4269 4 2661 2656 2662 # CAO-CAT-CTT + 4270 12 2668 2662 2669 # HT-CTT-HT + 4271 12 2668 2662 2670 # HT-CTT-HT + 4272 12 2669 2662 2670 # HT-CTT-HT + 4273 1 2671 2672 2673 # CAT-CAO-CAM + 4274 2 2671 2672 2678 # CAT-CAO-HAT + 4275 3 2671 2677 2683 # CAT-CTT-HT + 4276 3 2671 2677 2684 # CAT-CTT-HT + 4277 3 2671 2677 2685 # CAT-CTT-HT + 4278 1 2671 2676 2675 # CAT-CAO-CAM + 4279 2 2671 2676 2682 # CAT-CAO-HAT + 4280 4 2672 2671 2677 # CAO-CAT-CTT + 4281 5 2672 2671 2676 # CAO-CAT-CAO + 4282 6 2672 2673 2674 # CAO-CAM-CAP + 4283 7 2672 2673 2679 # CAO-CAM-HAT + 4284 8 2673 2672 2678 # CAM-CAO-HAT + 4285 9 2673 2674 2675 # CAM-CAP-CAM + 4286 10 2673 2674 2680 # CAM-CAP-HAT + 4287 11 2674 2673 2679 # CAP-CAM-HAT + 4288 6 2676 2675 2674 # CAO-CAM-CAP + 4289 11 2674 2675 2681 # CAP-CAM-HAT + 4290 10 2675 2674 2680 # CAM-CAP-HAT + 4291 8 2675 2676 2682 # CAM-CAO-HAT + 4292 7 2676 2675 2681 # CAO-CAM-HAT + 4293 4 2676 2671 2677 # CAO-CAT-CTT + 4294 12 2683 2677 2684 # HT-CTT-HT + 4295 12 2683 2677 2685 # HT-CTT-HT + 4296 12 2684 2677 2685 # HT-CTT-HT + 4297 1 2686 2687 2688 # CAT-CAO-CAM + 4298 2 2686 2687 2693 # CAT-CAO-HAT + 4299 3 2686 2692 2698 # CAT-CTT-HT + 4300 3 2686 2692 2699 # CAT-CTT-HT + 4301 3 2686 2692 2700 # CAT-CTT-HT + 4302 1 2686 2691 2690 # CAT-CAO-CAM + 4303 2 2686 2691 2697 # CAT-CAO-HAT + 4304 4 2687 2686 2692 # CAO-CAT-CTT + 4305 5 2687 2686 2691 # CAO-CAT-CAO + 4306 6 2687 2688 2689 # CAO-CAM-CAP + 4307 7 2687 2688 2694 # CAO-CAM-HAT + 4308 8 2688 2687 2693 # CAM-CAO-HAT + 4309 9 2688 2689 2690 # CAM-CAP-CAM + 4310 10 2688 2689 2695 # CAM-CAP-HAT + 4311 11 2689 2688 2694 # CAP-CAM-HAT + 4312 6 2691 2690 2689 # CAO-CAM-CAP + 4313 11 2689 2690 2696 # CAP-CAM-HAT + 4314 10 2690 2689 2695 # CAM-CAP-HAT + 4315 8 2690 2691 2697 # CAM-CAO-HAT + 4316 7 2691 2690 2696 # CAO-CAM-HAT + 4317 4 2691 2686 2692 # CAO-CAT-CTT + 4318 12 2698 2692 2699 # HT-CTT-HT + 4319 12 2698 2692 2700 # HT-CTT-HT + 4320 12 2699 2692 2700 # HT-CTT-HT + 4321 1 2701 2702 2703 # CAT-CAO-CAM + 4322 2 2701 2702 2708 # CAT-CAO-HAT + 4323 3 2701 2707 2713 # CAT-CTT-HT + 4324 3 2701 2707 2714 # CAT-CTT-HT + 4325 3 2701 2707 2715 # CAT-CTT-HT + 4326 1 2701 2706 2705 # CAT-CAO-CAM + 4327 2 2701 2706 2712 # CAT-CAO-HAT + 4328 4 2702 2701 2707 # CAO-CAT-CTT + 4329 5 2702 2701 2706 # CAO-CAT-CAO + 4330 6 2702 2703 2704 # CAO-CAM-CAP + 4331 7 2702 2703 2709 # CAO-CAM-HAT + 4332 8 2703 2702 2708 # CAM-CAO-HAT + 4333 9 2703 2704 2705 # CAM-CAP-CAM + 4334 10 2703 2704 2710 # CAM-CAP-HAT + 4335 11 2704 2703 2709 # CAP-CAM-HAT + 4336 6 2706 2705 2704 # CAO-CAM-CAP + 4337 11 2704 2705 2711 # CAP-CAM-HAT + 4338 10 2705 2704 2710 # CAM-CAP-HAT + 4339 8 2705 2706 2712 # CAM-CAO-HAT + 4340 7 2706 2705 2711 # CAO-CAM-HAT + 4341 4 2706 2701 2707 # CAO-CAT-CTT + 4342 12 2713 2707 2714 # HT-CTT-HT + 4343 12 2713 2707 2715 # HT-CTT-HT + 4344 12 2714 2707 2715 # HT-CTT-HT + 4345 1 2716 2717 2718 # CAT-CAO-CAM + 4346 2 2716 2717 2723 # CAT-CAO-HAT + 4347 3 2716 2722 2728 # CAT-CTT-HT + 4348 3 2716 2722 2729 # CAT-CTT-HT + 4349 3 2716 2722 2730 # CAT-CTT-HT + 4350 1 2716 2721 2720 # CAT-CAO-CAM + 4351 2 2716 2721 2727 # CAT-CAO-HAT + 4352 4 2717 2716 2722 # CAO-CAT-CTT + 4353 5 2717 2716 2721 # CAO-CAT-CAO + 4354 6 2717 2718 2719 # CAO-CAM-CAP + 4355 7 2717 2718 2724 # CAO-CAM-HAT + 4356 8 2718 2717 2723 # CAM-CAO-HAT + 4357 9 2718 2719 2720 # CAM-CAP-CAM + 4358 10 2718 2719 2725 # CAM-CAP-HAT + 4359 11 2719 2718 2724 # CAP-CAM-HAT + 4360 6 2721 2720 2719 # CAO-CAM-CAP + 4361 11 2719 2720 2726 # CAP-CAM-HAT + 4362 10 2720 2719 2725 # CAM-CAP-HAT + 4363 8 2720 2721 2727 # CAM-CAO-HAT + 4364 7 2721 2720 2726 # CAO-CAM-HAT + 4365 4 2721 2716 2722 # CAO-CAT-CTT + 4366 12 2728 2722 2729 # HT-CTT-HT + 4367 12 2728 2722 2730 # HT-CTT-HT + 4368 12 2729 2722 2730 # HT-CTT-HT + 4369 1 2731 2732 2733 # CAT-CAO-CAM + 4370 2 2731 2732 2738 # CAT-CAO-HAT + 4371 3 2731 2737 2743 # CAT-CTT-HT + 4372 3 2731 2737 2744 # CAT-CTT-HT + 4373 3 2731 2737 2745 # CAT-CTT-HT + 4374 1 2731 2736 2735 # CAT-CAO-CAM + 4375 2 2731 2736 2742 # CAT-CAO-HAT + 4376 4 2732 2731 2737 # CAO-CAT-CTT + 4377 5 2732 2731 2736 # CAO-CAT-CAO + 4378 6 2732 2733 2734 # CAO-CAM-CAP + 4379 7 2732 2733 2739 # CAO-CAM-HAT + 4380 8 2733 2732 2738 # CAM-CAO-HAT + 4381 9 2733 2734 2735 # CAM-CAP-CAM + 4382 10 2733 2734 2740 # CAM-CAP-HAT + 4383 11 2734 2733 2739 # CAP-CAM-HAT + 4384 6 2736 2735 2734 # CAO-CAM-CAP + 4385 11 2734 2735 2741 # CAP-CAM-HAT + 4386 10 2735 2734 2740 # CAM-CAP-HAT + 4387 8 2735 2736 2742 # CAM-CAO-HAT + 4388 7 2736 2735 2741 # CAO-CAM-HAT + 4389 4 2736 2731 2737 # CAO-CAT-CTT + 4390 12 2743 2737 2744 # HT-CTT-HT + 4391 12 2743 2737 2745 # HT-CTT-HT + 4392 12 2744 2737 2745 # HT-CTT-HT + 4393 1 2746 2747 2748 # CAT-CAO-CAM + 4394 2 2746 2747 2753 # CAT-CAO-HAT + 4395 3 2746 2752 2758 # CAT-CTT-HT + 4396 3 2746 2752 2759 # CAT-CTT-HT + 4397 3 2746 2752 2760 # CAT-CTT-HT + 4398 1 2746 2751 2750 # CAT-CAO-CAM + 4399 2 2746 2751 2757 # CAT-CAO-HAT + 4400 4 2747 2746 2752 # CAO-CAT-CTT + 4401 5 2747 2746 2751 # CAO-CAT-CAO + 4402 6 2747 2748 2749 # CAO-CAM-CAP + 4403 7 2747 2748 2754 # CAO-CAM-HAT + 4404 8 2748 2747 2753 # CAM-CAO-HAT + 4405 9 2748 2749 2750 # CAM-CAP-CAM + 4406 10 2748 2749 2755 # CAM-CAP-HAT + 4407 11 2749 2748 2754 # CAP-CAM-HAT + 4408 6 2751 2750 2749 # CAO-CAM-CAP + 4409 11 2749 2750 2756 # CAP-CAM-HAT + 4410 10 2750 2749 2755 # CAM-CAP-HAT + 4411 8 2750 2751 2757 # CAM-CAO-HAT + 4412 7 2751 2750 2756 # CAO-CAM-HAT + 4413 4 2751 2746 2752 # CAO-CAT-CTT + 4414 12 2758 2752 2759 # HT-CTT-HT + 4415 12 2758 2752 2760 # HT-CTT-HT + 4416 12 2759 2752 2760 # HT-CTT-HT + 4417 1 2761 2762 2763 # CAT-CAO-CAM + 4418 2 2761 2762 2768 # CAT-CAO-HAT + 4419 3 2761 2767 2773 # CAT-CTT-HT + 4420 3 2761 2767 2774 # CAT-CTT-HT + 4421 3 2761 2767 2775 # CAT-CTT-HT + 4422 1 2761 2766 2765 # CAT-CAO-CAM + 4423 2 2761 2766 2772 # CAT-CAO-HAT + 4424 4 2762 2761 2767 # CAO-CAT-CTT + 4425 5 2762 2761 2766 # CAO-CAT-CAO + 4426 6 2762 2763 2764 # CAO-CAM-CAP + 4427 7 2762 2763 2769 # CAO-CAM-HAT + 4428 8 2763 2762 2768 # CAM-CAO-HAT + 4429 9 2763 2764 2765 # CAM-CAP-CAM + 4430 10 2763 2764 2770 # CAM-CAP-HAT + 4431 11 2764 2763 2769 # CAP-CAM-HAT + 4432 6 2766 2765 2764 # CAO-CAM-CAP + 4433 11 2764 2765 2771 # CAP-CAM-HAT + 4434 10 2765 2764 2770 # CAM-CAP-HAT + 4435 8 2765 2766 2772 # CAM-CAO-HAT + 4436 7 2766 2765 2771 # CAO-CAM-HAT + 4437 4 2766 2761 2767 # CAO-CAT-CTT + 4438 12 2773 2767 2774 # HT-CTT-HT + 4439 12 2773 2767 2775 # HT-CTT-HT + 4440 12 2774 2767 2775 # HT-CTT-HT + 4441 1 2776 2777 2778 # CAT-CAO-CAM + 4442 2 2776 2777 2783 # CAT-CAO-HAT + 4443 3 2776 2782 2788 # CAT-CTT-HT + 4444 3 2776 2782 2789 # CAT-CTT-HT + 4445 3 2776 2782 2790 # CAT-CTT-HT + 4446 1 2776 2781 2780 # CAT-CAO-CAM + 4447 2 2776 2781 2787 # CAT-CAO-HAT + 4448 4 2777 2776 2782 # CAO-CAT-CTT + 4449 5 2777 2776 2781 # CAO-CAT-CAO + 4450 6 2777 2778 2779 # CAO-CAM-CAP + 4451 7 2777 2778 2784 # CAO-CAM-HAT + 4452 8 2778 2777 2783 # CAM-CAO-HAT + 4453 9 2778 2779 2780 # CAM-CAP-CAM + 4454 10 2778 2779 2785 # CAM-CAP-HAT + 4455 11 2779 2778 2784 # CAP-CAM-HAT + 4456 6 2781 2780 2779 # CAO-CAM-CAP + 4457 11 2779 2780 2786 # CAP-CAM-HAT + 4458 10 2780 2779 2785 # CAM-CAP-HAT + 4459 8 2780 2781 2787 # CAM-CAO-HAT + 4460 7 2781 2780 2786 # CAO-CAM-HAT + 4461 4 2781 2776 2782 # CAO-CAT-CTT + 4462 12 2788 2782 2789 # HT-CTT-HT + 4463 12 2788 2782 2790 # HT-CTT-HT + 4464 12 2789 2782 2790 # HT-CTT-HT + 4465 1 2791 2792 2793 # CAT-CAO-CAM + 4466 2 2791 2792 2798 # CAT-CAO-HAT + 4467 3 2791 2797 2803 # CAT-CTT-HT + 4468 3 2791 2797 2804 # CAT-CTT-HT + 4469 3 2791 2797 2805 # CAT-CTT-HT + 4470 1 2791 2796 2795 # CAT-CAO-CAM + 4471 2 2791 2796 2802 # CAT-CAO-HAT + 4472 4 2792 2791 2797 # CAO-CAT-CTT + 4473 5 2792 2791 2796 # CAO-CAT-CAO + 4474 6 2792 2793 2794 # CAO-CAM-CAP + 4475 7 2792 2793 2799 # CAO-CAM-HAT + 4476 8 2793 2792 2798 # CAM-CAO-HAT + 4477 9 2793 2794 2795 # CAM-CAP-CAM + 4478 10 2793 2794 2800 # CAM-CAP-HAT + 4479 11 2794 2793 2799 # CAP-CAM-HAT + 4480 6 2796 2795 2794 # CAO-CAM-CAP + 4481 11 2794 2795 2801 # CAP-CAM-HAT + 4482 10 2795 2794 2800 # CAM-CAP-HAT + 4483 8 2795 2796 2802 # CAM-CAO-HAT + 4484 7 2796 2795 2801 # CAO-CAM-HAT + 4485 4 2796 2791 2797 # CAO-CAT-CTT + 4486 12 2803 2797 2804 # HT-CTT-HT + 4487 12 2803 2797 2805 # HT-CTT-HT + 4488 12 2804 2797 2805 # HT-CTT-HT + 4489 1 2806 2807 2808 # CAT-CAO-CAM + 4490 2 2806 2807 2813 # CAT-CAO-HAT + 4491 3 2806 2812 2818 # CAT-CTT-HT + 4492 3 2806 2812 2819 # CAT-CTT-HT + 4493 3 2806 2812 2820 # CAT-CTT-HT + 4494 1 2806 2811 2810 # CAT-CAO-CAM + 4495 2 2806 2811 2817 # CAT-CAO-HAT + 4496 4 2807 2806 2812 # CAO-CAT-CTT + 4497 5 2807 2806 2811 # CAO-CAT-CAO + 4498 6 2807 2808 2809 # CAO-CAM-CAP + 4499 7 2807 2808 2814 # CAO-CAM-HAT + 4500 8 2808 2807 2813 # CAM-CAO-HAT + 4501 9 2808 2809 2810 # CAM-CAP-CAM + 4502 10 2808 2809 2815 # CAM-CAP-HAT + 4503 11 2809 2808 2814 # CAP-CAM-HAT + 4504 6 2811 2810 2809 # CAO-CAM-CAP + 4505 11 2809 2810 2816 # CAP-CAM-HAT + 4506 10 2810 2809 2815 # CAM-CAP-HAT + 4507 8 2810 2811 2817 # CAM-CAO-HAT + 4508 7 2811 2810 2816 # CAO-CAM-HAT + 4509 4 2811 2806 2812 # CAO-CAT-CTT + 4510 12 2818 2812 2819 # HT-CTT-HT + 4511 12 2818 2812 2820 # HT-CTT-HT + 4512 12 2819 2812 2820 # HT-CTT-HT + 4513 1 2821 2822 2823 # CAT-CAO-CAM + 4514 2 2821 2822 2828 # CAT-CAO-HAT + 4515 3 2821 2827 2833 # CAT-CTT-HT + 4516 3 2821 2827 2834 # CAT-CTT-HT + 4517 3 2821 2827 2835 # CAT-CTT-HT + 4518 1 2821 2826 2825 # CAT-CAO-CAM + 4519 2 2821 2826 2832 # CAT-CAO-HAT + 4520 4 2822 2821 2827 # CAO-CAT-CTT + 4521 5 2822 2821 2826 # CAO-CAT-CAO + 4522 6 2822 2823 2824 # CAO-CAM-CAP + 4523 7 2822 2823 2829 # CAO-CAM-HAT + 4524 8 2823 2822 2828 # CAM-CAO-HAT + 4525 9 2823 2824 2825 # CAM-CAP-CAM + 4526 10 2823 2824 2830 # CAM-CAP-HAT + 4527 11 2824 2823 2829 # CAP-CAM-HAT + 4528 6 2826 2825 2824 # CAO-CAM-CAP + 4529 11 2824 2825 2831 # CAP-CAM-HAT + 4530 10 2825 2824 2830 # CAM-CAP-HAT + 4531 8 2825 2826 2832 # CAM-CAO-HAT + 4532 7 2826 2825 2831 # CAO-CAM-HAT + 4533 4 2826 2821 2827 # CAO-CAT-CTT + 4534 12 2833 2827 2834 # HT-CTT-HT + 4535 12 2833 2827 2835 # HT-CTT-HT + 4536 12 2834 2827 2835 # HT-CTT-HT + 4537 1 2836 2837 2838 # CAT-CAO-CAM + 4538 2 2836 2837 2843 # CAT-CAO-HAT + 4539 3 2836 2842 2848 # CAT-CTT-HT + 4540 3 2836 2842 2849 # CAT-CTT-HT + 4541 3 2836 2842 2850 # CAT-CTT-HT + 4542 1 2836 2841 2840 # CAT-CAO-CAM + 4543 2 2836 2841 2847 # CAT-CAO-HAT + 4544 4 2837 2836 2842 # CAO-CAT-CTT + 4545 5 2837 2836 2841 # CAO-CAT-CAO + 4546 6 2837 2838 2839 # CAO-CAM-CAP + 4547 7 2837 2838 2844 # CAO-CAM-HAT + 4548 8 2838 2837 2843 # CAM-CAO-HAT + 4549 9 2838 2839 2840 # CAM-CAP-CAM + 4550 10 2838 2839 2845 # CAM-CAP-HAT + 4551 11 2839 2838 2844 # CAP-CAM-HAT + 4552 6 2841 2840 2839 # CAO-CAM-CAP + 4553 11 2839 2840 2846 # CAP-CAM-HAT + 4554 10 2840 2839 2845 # CAM-CAP-HAT + 4555 8 2840 2841 2847 # CAM-CAO-HAT + 4556 7 2841 2840 2846 # CAO-CAM-HAT + 4557 4 2841 2836 2842 # CAO-CAT-CTT + 4558 12 2848 2842 2849 # HT-CTT-HT + 4559 12 2848 2842 2850 # HT-CTT-HT + 4560 12 2849 2842 2850 # HT-CTT-HT + 4561 1 2851 2852 2853 # CAT-CAO-CAM + 4562 2 2851 2852 2858 # CAT-CAO-HAT + 4563 3 2851 2857 2863 # CAT-CTT-HT + 4564 3 2851 2857 2864 # CAT-CTT-HT + 4565 3 2851 2857 2865 # CAT-CTT-HT + 4566 1 2851 2856 2855 # CAT-CAO-CAM + 4567 2 2851 2856 2862 # CAT-CAO-HAT + 4568 4 2852 2851 2857 # CAO-CAT-CTT + 4569 5 2852 2851 2856 # CAO-CAT-CAO + 4570 6 2852 2853 2854 # CAO-CAM-CAP + 4571 7 2852 2853 2859 # CAO-CAM-HAT + 4572 8 2853 2852 2858 # CAM-CAO-HAT + 4573 9 2853 2854 2855 # CAM-CAP-CAM + 4574 10 2853 2854 2860 # CAM-CAP-HAT + 4575 11 2854 2853 2859 # CAP-CAM-HAT + 4576 6 2856 2855 2854 # CAO-CAM-CAP + 4577 11 2854 2855 2861 # CAP-CAM-HAT + 4578 10 2855 2854 2860 # CAM-CAP-HAT + 4579 8 2855 2856 2862 # CAM-CAO-HAT + 4580 7 2856 2855 2861 # CAO-CAM-HAT + 4581 4 2856 2851 2857 # CAO-CAT-CTT + 4582 12 2863 2857 2864 # HT-CTT-HT + 4583 12 2863 2857 2865 # HT-CTT-HT + 4584 12 2864 2857 2865 # HT-CTT-HT + 4585 1 2866 2867 2868 # CAT-CAO-CAM + 4586 2 2866 2867 2873 # CAT-CAO-HAT + 4587 3 2866 2872 2878 # CAT-CTT-HT + 4588 3 2866 2872 2879 # CAT-CTT-HT + 4589 3 2866 2872 2880 # CAT-CTT-HT + 4590 1 2866 2871 2870 # CAT-CAO-CAM + 4591 2 2866 2871 2877 # CAT-CAO-HAT + 4592 4 2867 2866 2872 # CAO-CAT-CTT + 4593 5 2867 2866 2871 # CAO-CAT-CAO + 4594 6 2867 2868 2869 # CAO-CAM-CAP + 4595 7 2867 2868 2874 # CAO-CAM-HAT + 4596 8 2868 2867 2873 # CAM-CAO-HAT + 4597 9 2868 2869 2870 # CAM-CAP-CAM + 4598 10 2868 2869 2875 # CAM-CAP-HAT + 4599 11 2869 2868 2874 # CAP-CAM-HAT + 4600 6 2871 2870 2869 # CAO-CAM-CAP + 4601 11 2869 2870 2876 # CAP-CAM-HAT + 4602 10 2870 2869 2875 # CAM-CAP-HAT + 4603 8 2870 2871 2877 # CAM-CAO-HAT + 4604 7 2871 2870 2876 # CAO-CAM-HAT + 4605 4 2871 2866 2872 # CAO-CAT-CTT + 4606 12 2878 2872 2879 # HT-CTT-HT + 4607 12 2878 2872 2880 # HT-CTT-HT + 4608 12 2879 2872 2880 # HT-CTT-HT + 4609 1 2881 2882 2883 # CAT-CAO-CAM + 4610 2 2881 2882 2888 # CAT-CAO-HAT + 4611 3 2881 2887 2893 # CAT-CTT-HT + 4612 3 2881 2887 2894 # CAT-CTT-HT + 4613 3 2881 2887 2895 # CAT-CTT-HT + 4614 1 2881 2886 2885 # CAT-CAO-CAM + 4615 2 2881 2886 2892 # CAT-CAO-HAT + 4616 4 2882 2881 2887 # CAO-CAT-CTT + 4617 5 2882 2881 2886 # CAO-CAT-CAO + 4618 6 2882 2883 2884 # CAO-CAM-CAP + 4619 7 2882 2883 2889 # CAO-CAM-HAT + 4620 8 2883 2882 2888 # CAM-CAO-HAT + 4621 9 2883 2884 2885 # CAM-CAP-CAM + 4622 10 2883 2884 2890 # CAM-CAP-HAT + 4623 11 2884 2883 2889 # CAP-CAM-HAT + 4624 6 2886 2885 2884 # CAO-CAM-CAP + 4625 11 2884 2885 2891 # CAP-CAM-HAT + 4626 10 2885 2884 2890 # CAM-CAP-HAT + 4627 8 2885 2886 2892 # CAM-CAO-HAT + 4628 7 2886 2885 2891 # CAO-CAM-HAT + 4629 4 2886 2881 2887 # CAO-CAT-CTT + 4630 12 2893 2887 2894 # HT-CTT-HT + 4631 12 2893 2887 2895 # HT-CTT-HT + 4632 12 2894 2887 2895 # HT-CTT-HT + 4633 1 2896 2897 2898 # CAT-CAO-CAM + 4634 2 2896 2897 2903 # CAT-CAO-HAT + 4635 3 2896 2902 2908 # CAT-CTT-HT + 4636 3 2896 2902 2909 # CAT-CTT-HT + 4637 3 2896 2902 2910 # CAT-CTT-HT + 4638 1 2896 2901 2900 # CAT-CAO-CAM + 4639 2 2896 2901 2907 # CAT-CAO-HAT + 4640 4 2897 2896 2902 # CAO-CAT-CTT + 4641 5 2897 2896 2901 # CAO-CAT-CAO + 4642 6 2897 2898 2899 # CAO-CAM-CAP + 4643 7 2897 2898 2904 # CAO-CAM-HAT + 4644 8 2898 2897 2903 # CAM-CAO-HAT + 4645 9 2898 2899 2900 # CAM-CAP-CAM + 4646 10 2898 2899 2905 # CAM-CAP-HAT + 4647 11 2899 2898 2904 # CAP-CAM-HAT + 4648 6 2901 2900 2899 # CAO-CAM-CAP + 4649 11 2899 2900 2906 # CAP-CAM-HAT + 4650 10 2900 2899 2905 # CAM-CAP-HAT + 4651 8 2900 2901 2907 # CAM-CAO-HAT + 4652 7 2901 2900 2906 # CAO-CAM-HAT + 4653 4 2901 2896 2902 # CAO-CAT-CTT + 4654 12 2908 2902 2909 # HT-CTT-HT + 4655 12 2908 2902 2910 # HT-CTT-HT + 4656 12 2909 2902 2910 # HT-CTT-HT + 4657 1 2911 2912 2913 # CAT-CAO-CAM + 4658 2 2911 2912 2918 # CAT-CAO-HAT + 4659 3 2911 2917 2923 # CAT-CTT-HT + 4660 3 2911 2917 2924 # CAT-CTT-HT + 4661 3 2911 2917 2925 # CAT-CTT-HT + 4662 1 2911 2916 2915 # CAT-CAO-CAM + 4663 2 2911 2916 2922 # CAT-CAO-HAT + 4664 4 2912 2911 2917 # CAO-CAT-CTT + 4665 5 2912 2911 2916 # CAO-CAT-CAO + 4666 6 2912 2913 2914 # CAO-CAM-CAP + 4667 7 2912 2913 2919 # CAO-CAM-HAT + 4668 8 2913 2912 2918 # CAM-CAO-HAT + 4669 9 2913 2914 2915 # CAM-CAP-CAM + 4670 10 2913 2914 2920 # CAM-CAP-HAT + 4671 11 2914 2913 2919 # CAP-CAM-HAT + 4672 6 2916 2915 2914 # CAO-CAM-CAP + 4673 11 2914 2915 2921 # CAP-CAM-HAT + 4674 10 2915 2914 2920 # CAM-CAP-HAT + 4675 8 2915 2916 2922 # CAM-CAO-HAT + 4676 7 2916 2915 2921 # CAO-CAM-HAT + 4677 4 2916 2911 2917 # CAO-CAT-CTT + 4678 12 2923 2917 2924 # HT-CTT-HT + 4679 12 2923 2917 2925 # HT-CTT-HT + 4680 12 2924 2917 2925 # HT-CTT-HT + 4681 1 2926 2927 2928 # CAT-CAO-CAM + 4682 2 2926 2927 2933 # CAT-CAO-HAT + 4683 3 2926 2932 2938 # CAT-CTT-HT + 4684 3 2926 2932 2939 # CAT-CTT-HT + 4685 3 2926 2932 2940 # CAT-CTT-HT + 4686 1 2926 2931 2930 # CAT-CAO-CAM + 4687 2 2926 2931 2937 # CAT-CAO-HAT + 4688 4 2927 2926 2932 # CAO-CAT-CTT + 4689 5 2927 2926 2931 # CAO-CAT-CAO + 4690 6 2927 2928 2929 # CAO-CAM-CAP + 4691 7 2927 2928 2934 # CAO-CAM-HAT + 4692 8 2928 2927 2933 # CAM-CAO-HAT + 4693 9 2928 2929 2930 # CAM-CAP-CAM + 4694 10 2928 2929 2935 # CAM-CAP-HAT + 4695 11 2929 2928 2934 # CAP-CAM-HAT + 4696 6 2931 2930 2929 # CAO-CAM-CAP + 4697 11 2929 2930 2936 # CAP-CAM-HAT + 4698 10 2930 2929 2935 # CAM-CAP-HAT + 4699 8 2930 2931 2937 # CAM-CAO-HAT + 4700 7 2931 2930 2936 # CAO-CAM-HAT + 4701 4 2931 2926 2932 # CAO-CAT-CTT + 4702 12 2938 2932 2939 # HT-CTT-HT + 4703 12 2938 2932 2940 # HT-CTT-HT + 4704 12 2939 2932 2940 # HT-CTT-HT + 4705 1 2941 2942 2943 # CAT-CAO-CAM + 4706 2 2941 2942 2948 # CAT-CAO-HAT + 4707 3 2941 2947 2953 # CAT-CTT-HT + 4708 3 2941 2947 2954 # CAT-CTT-HT + 4709 3 2941 2947 2955 # CAT-CTT-HT + 4710 1 2941 2946 2945 # CAT-CAO-CAM + 4711 2 2941 2946 2952 # CAT-CAO-HAT + 4712 4 2942 2941 2947 # CAO-CAT-CTT + 4713 5 2942 2941 2946 # CAO-CAT-CAO + 4714 6 2942 2943 2944 # CAO-CAM-CAP + 4715 7 2942 2943 2949 # CAO-CAM-HAT + 4716 8 2943 2942 2948 # CAM-CAO-HAT + 4717 9 2943 2944 2945 # CAM-CAP-CAM + 4718 10 2943 2944 2950 # CAM-CAP-HAT + 4719 11 2944 2943 2949 # CAP-CAM-HAT + 4720 6 2946 2945 2944 # CAO-CAM-CAP + 4721 11 2944 2945 2951 # CAP-CAM-HAT + 4722 10 2945 2944 2950 # CAM-CAP-HAT + 4723 8 2945 2946 2952 # CAM-CAO-HAT + 4724 7 2946 2945 2951 # CAO-CAM-HAT + 4725 4 2946 2941 2947 # CAO-CAT-CTT + 4726 12 2953 2947 2954 # HT-CTT-HT + 4727 12 2953 2947 2955 # HT-CTT-HT + 4728 12 2954 2947 2955 # HT-CTT-HT + 4729 1 2956 2957 2958 # CAT-CAO-CAM + 4730 2 2956 2957 2963 # CAT-CAO-HAT + 4731 3 2956 2962 2968 # CAT-CTT-HT + 4732 3 2956 2962 2969 # CAT-CTT-HT + 4733 3 2956 2962 2970 # CAT-CTT-HT + 4734 1 2956 2961 2960 # CAT-CAO-CAM + 4735 2 2956 2961 2967 # CAT-CAO-HAT + 4736 4 2957 2956 2962 # CAO-CAT-CTT + 4737 5 2957 2956 2961 # CAO-CAT-CAO + 4738 6 2957 2958 2959 # CAO-CAM-CAP + 4739 7 2957 2958 2964 # CAO-CAM-HAT + 4740 8 2958 2957 2963 # CAM-CAO-HAT + 4741 9 2958 2959 2960 # CAM-CAP-CAM + 4742 10 2958 2959 2965 # CAM-CAP-HAT + 4743 11 2959 2958 2964 # CAP-CAM-HAT + 4744 6 2961 2960 2959 # CAO-CAM-CAP + 4745 11 2959 2960 2966 # CAP-CAM-HAT + 4746 10 2960 2959 2965 # CAM-CAP-HAT + 4747 8 2960 2961 2967 # CAM-CAO-HAT + 4748 7 2961 2960 2966 # CAO-CAM-HAT + 4749 4 2961 2956 2962 # CAO-CAT-CTT + 4750 12 2968 2962 2969 # HT-CTT-HT + 4751 12 2968 2962 2970 # HT-CTT-HT + 4752 12 2969 2962 2970 # HT-CTT-HT + 4753 1 2971 2972 2973 # CAT-CAO-CAM + 4754 2 2971 2972 2978 # CAT-CAO-HAT + 4755 3 2971 2977 2983 # CAT-CTT-HT + 4756 3 2971 2977 2984 # CAT-CTT-HT + 4757 3 2971 2977 2985 # CAT-CTT-HT + 4758 1 2971 2976 2975 # CAT-CAO-CAM + 4759 2 2971 2976 2982 # CAT-CAO-HAT + 4760 4 2972 2971 2977 # CAO-CAT-CTT + 4761 5 2972 2971 2976 # CAO-CAT-CAO + 4762 6 2972 2973 2974 # CAO-CAM-CAP + 4763 7 2972 2973 2979 # CAO-CAM-HAT + 4764 8 2973 2972 2978 # CAM-CAO-HAT + 4765 9 2973 2974 2975 # CAM-CAP-CAM + 4766 10 2973 2974 2980 # CAM-CAP-HAT + 4767 11 2974 2973 2979 # CAP-CAM-HAT + 4768 6 2976 2975 2974 # CAO-CAM-CAP + 4769 11 2974 2975 2981 # CAP-CAM-HAT + 4770 10 2975 2974 2980 # CAM-CAP-HAT + 4771 8 2975 2976 2982 # CAM-CAO-HAT + 4772 7 2976 2975 2981 # CAO-CAM-HAT + 4773 4 2976 2971 2977 # CAO-CAT-CTT + 4774 12 2983 2977 2984 # HT-CTT-HT + 4775 12 2983 2977 2985 # HT-CTT-HT + 4776 12 2984 2977 2985 # HT-CTT-HT + 4777 1 2986 2987 2988 # CAT-CAO-CAM + 4778 2 2986 2987 2993 # CAT-CAO-HAT + 4779 3 2986 2992 2998 # CAT-CTT-HT + 4780 3 2986 2992 2999 # CAT-CTT-HT + 4781 3 2986 2992 3000 # CAT-CTT-HT + 4782 1 2986 2991 2990 # CAT-CAO-CAM + 4783 2 2986 2991 2997 # CAT-CAO-HAT + 4784 4 2987 2986 2992 # CAO-CAT-CTT + 4785 5 2987 2986 2991 # CAO-CAT-CAO + 4786 6 2987 2988 2989 # CAO-CAM-CAP + 4787 7 2987 2988 2994 # CAO-CAM-HAT + 4788 8 2988 2987 2993 # CAM-CAO-HAT + 4789 9 2988 2989 2990 # CAM-CAP-CAM + 4790 10 2988 2989 2995 # CAM-CAP-HAT + 4791 11 2989 2988 2994 # CAP-CAM-HAT + 4792 6 2991 2990 2989 # CAO-CAM-CAP + 4793 11 2989 2990 2996 # CAP-CAM-HAT + 4794 10 2990 2989 2995 # CAM-CAP-HAT + 4795 8 2990 2991 2997 # CAM-CAO-HAT + 4796 7 2991 2990 2996 # CAO-CAM-HAT + 4797 4 2991 2986 2992 # CAO-CAT-CTT + 4798 12 2998 2992 2999 # HT-CTT-HT + 4799 12 2998 2992 3000 # HT-CTT-HT + 4800 12 2999 2992 3000 # HT-CTT-HT + 4801 1 3001 3002 3003 # CAT-CAO-CAM + 4802 2 3001 3002 3008 # CAT-CAO-HAT + 4803 3 3001 3007 3013 # CAT-CTT-HT + 4804 3 3001 3007 3014 # CAT-CTT-HT + 4805 3 3001 3007 3015 # CAT-CTT-HT + 4806 1 3001 3006 3005 # CAT-CAO-CAM + 4807 2 3001 3006 3012 # CAT-CAO-HAT + 4808 4 3002 3001 3007 # CAO-CAT-CTT + 4809 5 3002 3001 3006 # CAO-CAT-CAO + 4810 6 3002 3003 3004 # CAO-CAM-CAP + 4811 7 3002 3003 3009 # CAO-CAM-HAT + 4812 8 3003 3002 3008 # CAM-CAO-HAT + 4813 9 3003 3004 3005 # CAM-CAP-CAM + 4814 10 3003 3004 3010 # CAM-CAP-HAT + 4815 11 3004 3003 3009 # CAP-CAM-HAT + 4816 6 3006 3005 3004 # CAO-CAM-CAP + 4817 11 3004 3005 3011 # CAP-CAM-HAT + 4818 10 3005 3004 3010 # CAM-CAP-HAT + 4819 8 3005 3006 3012 # CAM-CAO-HAT + 4820 7 3006 3005 3011 # CAO-CAM-HAT + 4821 4 3006 3001 3007 # CAO-CAT-CTT + 4822 12 3013 3007 3014 # HT-CTT-HT + 4823 12 3013 3007 3015 # HT-CTT-HT + 4824 12 3014 3007 3015 # HT-CTT-HT + 4825 1 3016 3017 3018 # CAT-CAO-CAM + 4826 2 3016 3017 3023 # CAT-CAO-HAT + 4827 3 3016 3022 3028 # CAT-CTT-HT + 4828 3 3016 3022 3029 # CAT-CTT-HT + 4829 3 3016 3022 3030 # CAT-CTT-HT + 4830 1 3016 3021 3020 # CAT-CAO-CAM + 4831 2 3016 3021 3027 # CAT-CAO-HAT + 4832 4 3017 3016 3022 # CAO-CAT-CTT + 4833 5 3017 3016 3021 # CAO-CAT-CAO + 4834 6 3017 3018 3019 # CAO-CAM-CAP + 4835 7 3017 3018 3024 # CAO-CAM-HAT + 4836 8 3018 3017 3023 # CAM-CAO-HAT + 4837 9 3018 3019 3020 # CAM-CAP-CAM + 4838 10 3018 3019 3025 # CAM-CAP-HAT + 4839 11 3019 3018 3024 # CAP-CAM-HAT + 4840 6 3021 3020 3019 # CAO-CAM-CAP + 4841 11 3019 3020 3026 # CAP-CAM-HAT + 4842 10 3020 3019 3025 # CAM-CAP-HAT + 4843 8 3020 3021 3027 # CAM-CAO-HAT + 4844 7 3021 3020 3026 # CAO-CAM-HAT + 4845 4 3021 3016 3022 # CAO-CAT-CTT + 4846 12 3028 3022 3029 # HT-CTT-HT + 4847 12 3028 3022 3030 # HT-CTT-HT + 4848 12 3029 3022 3030 # HT-CTT-HT + 4849 1 3031 3032 3033 # CAT-CAO-CAM + 4850 2 3031 3032 3038 # CAT-CAO-HAT + 4851 3 3031 3037 3043 # CAT-CTT-HT + 4852 3 3031 3037 3044 # CAT-CTT-HT + 4853 3 3031 3037 3045 # CAT-CTT-HT + 4854 1 3031 3036 3035 # CAT-CAO-CAM + 4855 2 3031 3036 3042 # CAT-CAO-HAT + 4856 4 3032 3031 3037 # CAO-CAT-CTT + 4857 5 3032 3031 3036 # CAO-CAT-CAO + 4858 6 3032 3033 3034 # CAO-CAM-CAP + 4859 7 3032 3033 3039 # CAO-CAM-HAT + 4860 8 3033 3032 3038 # CAM-CAO-HAT + 4861 9 3033 3034 3035 # CAM-CAP-CAM + 4862 10 3033 3034 3040 # CAM-CAP-HAT + 4863 11 3034 3033 3039 # CAP-CAM-HAT + 4864 6 3036 3035 3034 # CAO-CAM-CAP + 4865 11 3034 3035 3041 # CAP-CAM-HAT + 4866 10 3035 3034 3040 # CAM-CAP-HAT + 4867 8 3035 3036 3042 # CAM-CAO-HAT + 4868 7 3036 3035 3041 # CAO-CAM-HAT + 4869 4 3036 3031 3037 # CAO-CAT-CTT + 4870 12 3043 3037 3044 # HT-CTT-HT + 4871 12 3043 3037 3045 # HT-CTT-HT + 4872 12 3044 3037 3045 # HT-CTT-HT + 4873 1 3046 3047 3048 # CAT-CAO-CAM + 4874 2 3046 3047 3053 # CAT-CAO-HAT + 4875 3 3046 3052 3058 # CAT-CTT-HT + 4876 3 3046 3052 3059 # CAT-CTT-HT + 4877 3 3046 3052 3060 # CAT-CTT-HT + 4878 1 3046 3051 3050 # CAT-CAO-CAM + 4879 2 3046 3051 3057 # CAT-CAO-HAT + 4880 4 3047 3046 3052 # CAO-CAT-CTT + 4881 5 3047 3046 3051 # CAO-CAT-CAO + 4882 6 3047 3048 3049 # CAO-CAM-CAP + 4883 7 3047 3048 3054 # CAO-CAM-HAT + 4884 8 3048 3047 3053 # CAM-CAO-HAT + 4885 9 3048 3049 3050 # CAM-CAP-CAM + 4886 10 3048 3049 3055 # CAM-CAP-HAT + 4887 11 3049 3048 3054 # CAP-CAM-HAT + 4888 6 3051 3050 3049 # CAO-CAM-CAP + 4889 11 3049 3050 3056 # CAP-CAM-HAT + 4890 10 3050 3049 3055 # CAM-CAP-HAT + 4891 8 3050 3051 3057 # CAM-CAO-HAT + 4892 7 3051 3050 3056 # CAO-CAM-HAT + 4893 4 3051 3046 3052 # CAO-CAT-CTT + 4894 12 3058 3052 3059 # HT-CTT-HT + 4895 12 3058 3052 3060 # HT-CTT-HT + 4896 12 3059 3052 3060 # HT-CTT-HT + 4897 1 3061 3062 3063 # CAT-CAO-CAM + 4898 2 3061 3062 3068 # CAT-CAO-HAT + 4899 3 3061 3067 3073 # CAT-CTT-HT + 4900 3 3061 3067 3074 # CAT-CTT-HT + 4901 3 3061 3067 3075 # CAT-CTT-HT + 4902 1 3061 3066 3065 # CAT-CAO-CAM + 4903 2 3061 3066 3072 # CAT-CAO-HAT + 4904 4 3062 3061 3067 # CAO-CAT-CTT + 4905 5 3062 3061 3066 # CAO-CAT-CAO + 4906 6 3062 3063 3064 # CAO-CAM-CAP + 4907 7 3062 3063 3069 # CAO-CAM-HAT + 4908 8 3063 3062 3068 # CAM-CAO-HAT + 4909 9 3063 3064 3065 # CAM-CAP-CAM + 4910 10 3063 3064 3070 # CAM-CAP-HAT + 4911 11 3064 3063 3069 # CAP-CAM-HAT + 4912 6 3066 3065 3064 # CAO-CAM-CAP + 4913 11 3064 3065 3071 # CAP-CAM-HAT + 4914 10 3065 3064 3070 # CAM-CAP-HAT + 4915 8 3065 3066 3072 # CAM-CAO-HAT + 4916 7 3066 3065 3071 # CAO-CAM-HAT + 4917 4 3066 3061 3067 # CAO-CAT-CTT + 4918 12 3073 3067 3074 # HT-CTT-HT + 4919 12 3073 3067 3075 # HT-CTT-HT + 4920 12 3074 3067 3075 # HT-CTT-HT + 4921 1 3076 3077 3078 # CAT-CAO-CAM + 4922 2 3076 3077 3083 # CAT-CAO-HAT + 4923 3 3076 3082 3088 # CAT-CTT-HT + 4924 3 3076 3082 3089 # CAT-CTT-HT + 4925 3 3076 3082 3090 # CAT-CTT-HT + 4926 1 3076 3081 3080 # CAT-CAO-CAM + 4927 2 3076 3081 3087 # CAT-CAO-HAT + 4928 4 3077 3076 3082 # CAO-CAT-CTT + 4929 5 3077 3076 3081 # CAO-CAT-CAO + 4930 6 3077 3078 3079 # CAO-CAM-CAP + 4931 7 3077 3078 3084 # CAO-CAM-HAT + 4932 8 3078 3077 3083 # CAM-CAO-HAT + 4933 9 3078 3079 3080 # CAM-CAP-CAM + 4934 10 3078 3079 3085 # CAM-CAP-HAT + 4935 11 3079 3078 3084 # CAP-CAM-HAT + 4936 6 3081 3080 3079 # CAO-CAM-CAP + 4937 11 3079 3080 3086 # CAP-CAM-HAT + 4938 10 3080 3079 3085 # CAM-CAP-HAT + 4939 8 3080 3081 3087 # CAM-CAO-HAT + 4940 7 3081 3080 3086 # CAO-CAM-HAT + 4941 4 3081 3076 3082 # CAO-CAT-CTT + 4942 12 3088 3082 3089 # HT-CTT-HT + 4943 12 3088 3082 3090 # HT-CTT-HT + 4944 12 3089 3082 3090 # HT-CTT-HT + 4945 1 3091 3092 3093 # CAT-CAO-CAM + 4946 2 3091 3092 3098 # CAT-CAO-HAT + 4947 3 3091 3097 3103 # CAT-CTT-HT + 4948 3 3091 3097 3104 # CAT-CTT-HT + 4949 3 3091 3097 3105 # CAT-CTT-HT + 4950 1 3091 3096 3095 # CAT-CAO-CAM + 4951 2 3091 3096 3102 # CAT-CAO-HAT + 4952 4 3092 3091 3097 # CAO-CAT-CTT + 4953 5 3092 3091 3096 # CAO-CAT-CAO + 4954 6 3092 3093 3094 # CAO-CAM-CAP + 4955 7 3092 3093 3099 # CAO-CAM-HAT + 4956 8 3093 3092 3098 # CAM-CAO-HAT + 4957 9 3093 3094 3095 # CAM-CAP-CAM + 4958 10 3093 3094 3100 # CAM-CAP-HAT + 4959 11 3094 3093 3099 # CAP-CAM-HAT + 4960 6 3096 3095 3094 # CAO-CAM-CAP + 4961 11 3094 3095 3101 # CAP-CAM-HAT + 4962 10 3095 3094 3100 # CAM-CAP-HAT + 4963 8 3095 3096 3102 # CAM-CAO-HAT + 4964 7 3096 3095 3101 # CAO-CAM-HAT + 4965 4 3096 3091 3097 # CAO-CAT-CTT + 4966 12 3103 3097 3104 # HT-CTT-HT + 4967 12 3103 3097 3105 # HT-CTT-HT + 4968 12 3104 3097 3105 # HT-CTT-HT + 4969 1 3106 3107 3108 # CAT-CAO-CAM + 4970 2 3106 3107 3113 # CAT-CAO-HAT + 4971 3 3106 3112 3118 # CAT-CTT-HT + 4972 3 3106 3112 3119 # CAT-CTT-HT + 4973 3 3106 3112 3120 # CAT-CTT-HT + 4974 1 3106 3111 3110 # CAT-CAO-CAM + 4975 2 3106 3111 3117 # CAT-CAO-HAT + 4976 4 3107 3106 3112 # CAO-CAT-CTT + 4977 5 3107 3106 3111 # CAO-CAT-CAO + 4978 6 3107 3108 3109 # CAO-CAM-CAP + 4979 7 3107 3108 3114 # CAO-CAM-HAT + 4980 8 3108 3107 3113 # CAM-CAO-HAT + 4981 9 3108 3109 3110 # CAM-CAP-CAM + 4982 10 3108 3109 3115 # CAM-CAP-HAT + 4983 11 3109 3108 3114 # CAP-CAM-HAT + 4984 6 3111 3110 3109 # CAO-CAM-CAP + 4985 11 3109 3110 3116 # CAP-CAM-HAT + 4986 10 3110 3109 3115 # CAM-CAP-HAT + 4987 8 3110 3111 3117 # CAM-CAO-HAT + 4988 7 3111 3110 3116 # CAO-CAM-HAT + 4989 4 3111 3106 3112 # CAO-CAT-CTT + 4990 12 3118 3112 3119 # HT-CTT-HT + 4991 12 3118 3112 3120 # HT-CTT-HT + 4992 12 3119 3112 3120 # HT-CTT-HT + 4993 1 3121 3122 3123 # CAT-CAO-CAM + 4994 2 3121 3122 3128 # CAT-CAO-HAT + 4995 3 3121 3127 3133 # CAT-CTT-HT + 4996 3 3121 3127 3134 # CAT-CTT-HT + 4997 3 3121 3127 3135 # CAT-CTT-HT + 4998 1 3121 3126 3125 # CAT-CAO-CAM + 4999 2 3121 3126 3132 # CAT-CAO-HAT + 5000 4 3122 3121 3127 # CAO-CAT-CTT + 5001 5 3122 3121 3126 # CAO-CAT-CAO + 5002 6 3122 3123 3124 # CAO-CAM-CAP + 5003 7 3122 3123 3129 # CAO-CAM-HAT + 5004 8 3123 3122 3128 # CAM-CAO-HAT + 5005 9 3123 3124 3125 # CAM-CAP-CAM + 5006 10 3123 3124 3130 # CAM-CAP-HAT + 5007 11 3124 3123 3129 # CAP-CAM-HAT + 5008 6 3126 3125 3124 # CAO-CAM-CAP + 5009 11 3124 3125 3131 # CAP-CAM-HAT + 5010 10 3125 3124 3130 # CAM-CAP-HAT + 5011 8 3125 3126 3132 # CAM-CAO-HAT + 5012 7 3126 3125 3131 # CAO-CAM-HAT + 5013 4 3126 3121 3127 # CAO-CAT-CTT + 5014 12 3133 3127 3134 # HT-CTT-HT + 5015 12 3133 3127 3135 # HT-CTT-HT + 5016 12 3134 3127 3135 # HT-CTT-HT + 5017 1 3136 3137 3138 # CAT-CAO-CAM + 5018 2 3136 3137 3143 # CAT-CAO-HAT + 5019 3 3136 3142 3148 # CAT-CTT-HT + 5020 3 3136 3142 3149 # CAT-CTT-HT + 5021 3 3136 3142 3150 # CAT-CTT-HT + 5022 1 3136 3141 3140 # CAT-CAO-CAM + 5023 2 3136 3141 3147 # CAT-CAO-HAT + 5024 4 3137 3136 3142 # CAO-CAT-CTT + 5025 5 3137 3136 3141 # CAO-CAT-CAO + 5026 6 3137 3138 3139 # CAO-CAM-CAP + 5027 7 3137 3138 3144 # CAO-CAM-HAT + 5028 8 3138 3137 3143 # CAM-CAO-HAT + 5029 9 3138 3139 3140 # CAM-CAP-CAM + 5030 10 3138 3139 3145 # CAM-CAP-HAT + 5031 11 3139 3138 3144 # CAP-CAM-HAT + 5032 6 3141 3140 3139 # CAO-CAM-CAP + 5033 11 3139 3140 3146 # CAP-CAM-HAT + 5034 10 3140 3139 3145 # CAM-CAP-HAT + 5035 8 3140 3141 3147 # CAM-CAO-HAT + 5036 7 3141 3140 3146 # CAO-CAM-HAT + 5037 4 3141 3136 3142 # CAO-CAT-CTT + 5038 12 3148 3142 3149 # HT-CTT-HT + 5039 12 3148 3142 3150 # HT-CTT-HT + 5040 12 3149 3142 3150 # HT-CTT-HT + 5041 1 3151 3152 3153 # CAT-CAO-CAM + 5042 2 3151 3152 3158 # CAT-CAO-HAT + 5043 3 3151 3157 3163 # CAT-CTT-HT + 5044 3 3151 3157 3164 # CAT-CTT-HT + 5045 3 3151 3157 3165 # CAT-CTT-HT + 5046 1 3151 3156 3155 # CAT-CAO-CAM + 5047 2 3151 3156 3162 # CAT-CAO-HAT + 5048 4 3152 3151 3157 # CAO-CAT-CTT + 5049 5 3152 3151 3156 # CAO-CAT-CAO + 5050 6 3152 3153 3154 # CAO-CAM-CAP + 5051 7 3152 3153 3159 # CAO-CAM-HAT + 5052 8 3153 3152 3158 # CAM-CAO-HAT + 5053 9 3153 3154 3155 # CAM-CAP-CAM + 5054 10 3153 3154 3160 # CAM-CAP-HAT + 5055 11 3154 3153 3159 # CAP-CAM-HAT + 5056 6 3156 3155 3154 # CAO-CAM-CAP + 5057 11 3154 3155 3161 # CAP-CAM-HAT + 5058 10 3155 3154 3160 # CAM-CAP-HAT + 5059 8 3155 3156 3162 # CAM-CAO-HAT + 5060 7 3156 3155 3161 # CAO-CAM-HAT + 5061 4 3156 3151 3157 # CAO-CAT-CTT + 5062 12 3163 3157 3164 # HT-CTT-HT + 5063 12 3163 3157 3165 # HT-CTT-HT + 5064 12 3164 3157 3165 # HT-CTT-HT + 5065 1 3166 3167 3168 # CAT-CAO-CAM + 5066 2 3166 3167 3173 # CAT-CAO-HAT + 5067 3 3166 3172 3178 # CAT-CTT-HT + 5068 3 3166 3172 3179 # CAT-CTT-HT + 5069 3 3166 3172 3180 # CAT-CTT-HT + 5070 1 3166 3171 3170 # CAT-CAO-CAM + 5071 2 3166 3171 3177 # CAT-CAO-HAT + 5072 4 3167 3166 3172 # CAO-CAT-CTT + 5073 5 3167 3166 3171 # CAO-CAT-CAO + 5074 6 3167 3168 3169 # CAO-CAM-CAP + 5075 7 3167 3168 3174 # CAO-CAM-HAT + 5076 8 3168 3167 3173 # CAM-CAO-HAT + 5077 9 3168 3169 3170 # CAM-CAP-CAM + 5078 10 3168 3169 3175 # CAM-CAP-HAT + 5079 11 3169 3168 3174 # CAP-CAM-HAT + 5080 6 3171 3170 3169 # CAO-CAM-CAP + 5081 11 3169 3170 3176 # CAP-CAM-HAT + 5082 10 3170 3169 3175 # CAM-CAP-HAT + 5083 8 3170 3171 3177 # CAM-CAO-HAT + 5084 7 3171 3170 3176 # CAO-CAM-HAT + 5085 4 3171 3166 3172 # CAO-CAT-CTT + 5086 12 3178 3172 3179 # HT-CTT-HT + 5087 12 3178 3172 3180 # HT-CTT-HT + 5088 12 3179 3172 3180 # HT-CTT-HT + 5089 1 3181 3182 3183 # CAT-CAO-CAM + 5090 2 3181 3182 3188 # CAT-CAO-HAT + 5091 3 3181 3187 3193 # CAT-CTT-HT + 5092 3 3181 3187 3194 # CAT-CTT-HT + 5093 3 3181 3187 3195 # CAT-CTT-HT + 5094 1 3181 3186 3185 # CAT-CAO-CAM + 5095 2 3181 3186 3192 # CAT-CAO-HAT + 5096 4 3182 3181 3187 # CAO-CAT-CTT + 5097 5 3182 3181 3186 # CAO-CAT-CAO + 5098 6 3182 3183 3184 # CAO-CAM-CAP + 5099 7 3182 3183 3189 # CAO-CAM-HAT + 5100 8 3183 3182 3188 # CAM-CAO-HAT + 5101 9 3183 3184 3185 # CAM-CAP-CAM + 5102 10 3183 3184 3190 # CAM-CAP-HAT + 5103 11 3184 3183 3189 # CAP-CAM-HAT + 5104 6 3186 3185 3184 # CAO-CAM-CAP + 5105 11 3184 3185 3191 # CAP-CAM-HAT + 5106 10 3185 3184 3190 # CAM-CAP-HAT + 5107 8 3185 3186 3192 # CAM-CAO-HAT + 5108 7 3186 3185 3191 # CAO-CAM-HAT + 5109 4 3186 3181 3187 # CAO-CAT-CTT + 5110 12 3193 3187 3194 # HT-CTT-HT + 5111 12 3193 3187 3195 # HT-CTT-HT + 5112 12 3194 3187 3195 # HT-CTT-HT + 5113 1 3196 3197 3198 # CAT-CAO-CAM + 5114 2 3196 3197 3203 # CAT-CAO-HAT + 5115 3 3196 3202 3208 # CAT-CTT-HT + 5116 3 3196 3202 3209 # CAT-CTT-HT + 5117 3 3196 3202 3210 # CAT-CTT-HT + 5118 1 3196 3201 3200 # CAT-CAO-CAM + 5119 2 3196 3201 3207 # CAT-CAO-HAT + 5120 4 3197 3196 3202 # CAO-CAT-CTT + 5121 5 3197 3196 3201 # CAO-CAT-CAO + 5122 6 3197 3198 3199 # CAO-CAM-CAP + 5123 7 3197 3198 3204 # CAO-CAM-HAT + 5124 8 3198 3197 3203 # CAM-CAO-HAT + 5125 9 3198 3199 3200 # CAM-CAP-CAM + 5126 10 3198 3199 3205 # CAM-CAP-HAT + 5127 11 3199 3198 3204 # CAP-CAM-HAT + 5128 6 3201 3200 3199 # CAO-CAM-CAP + 5129 11 3199 3200 3206 # CAP-CAM-HAT + 5130 10 3200 3199 3205 # CAM-CAP-HAT + 5131 8 3200 3201 3207 # CAM-CAO-HAT + 5132 7 3201 3200 3206 # CAO-CAM-HAT + 5133 4 3201 3196 3202 # CAO-CAT-CTT + 5134 12 3208 3202 3209 # HT-CTT-HT + 5135 12 3208 3202 3210 # HT-CTT-HT + 5136 12 3209 3202 3210 # HT-CTT-HT + 5137 1 3211 3212 3213 # CAT-CAO-CAM + 5138 2 3211 3212 3218 # CAT-CAO-HAT + 5139 3 3211 3217 3223 # CAT-CTT-HT + 5140 3 3211 3217 3224 # CAT-CTT-HT + 5141 3 3211 3217 3225 # CAT-CTT-HT + 5142 1 3211 3216 3215 # CAT-CAO-CAM + 5143 2 3211 3216 3222 # CAT-CAO-HAT + 5144 4 3212 3211 3217 # CAO-CAT-CTT + 5145 5 3212 3211 3216 # CAO-CAT-CAO + 5146 6 3212 3213 3214 # CAO-CAM-CAP + 5147 7 3212 3213 3219 # CAO-CAM-HAT + 5148 8 3213 3212 3218 # CAM-CAO-HAT + 5149 9 3213 3214 3215 # CAM-CAP-CAM + 5150 10 3213 3214 3220 # CAM-CAP-HAT + 5151 11 3214 3213 3219 # CAP-CAM-HAT + 5152 6 3216 3215 3214 # CAO-CAM-CAP + 5153 11 3214 3215 3221 # CAP-CAM-HAT + 5154 10 3215 3214 3220 # CAM-CAP-HAT + 5155 8 3215 3216 3222 # CAM-CAO-HAT + 5156 7 3216 3215 3221 # CAO-CAM-HAT + 5157 4 3216 3211 3217 # CAO-CAT-CTT + 5158 12 3223 3217 3224 # HT-CTT-HT + 5159 12 3223 3217 3225 # HT-CTT-HT + 5160 12 3224 3217 3225 # HT-CTT-HT + 5161 1 3226 3227 3228 # CAT-CAO-CAM + 5162 2 3226 3227 3233 # CAT-CAO-HAT + 5163 3 3226 3232 3238 # CAT-CTT-HT + 5164 3 3226 3232 3239 # CAT-CTT-HT + 5165 3 3226 3232 3240 # CAT-CTT-HT + 5166 1 3226 3231 3230 # CAT-CAO-CAM + 5167 2 3226 3231 3237 # CAT-CAO-HAT + 5168 4 3227 3226 3232 # CAO-CAT-CTT + 5169 5 3227 3226 3231 # CAO-CAT-CAO + 5170 6 3227 3228 3229 # CAO-CAM-CAP + 5171 7 3227 3228 3234 # CAO-CAM-HAT + 5172 8 3228 3227 3233 # CAM-CAO-HAT + 5173 9 3228 3229 3230 # CAM-CAP-CAM + 5174 10 3228 3229 3235 # CAM-CAP-HAT + 5175 11 3229 3228 3234 # CAP-CAM-HAT + 5176 6 3231 3230 3229 # CAO-CAM-CAP + 5177 11 3229 3230 3236 # CAP-CAM-HAT + 5178 10 3230 3229 3235 # CAM-CAP-HAT + 5179 8 3230 3231 3237 # CAM-CAO-HAT + 5180 7 3231 3230 3236 # CAO-CAM-HAT + 5181 4 3231 3226 3232 # CAO-CAT-CTT + 5182 12 3238 3232 3239 # HT-CTT-HT + 5183 12 3238 3232 3240 # HT-CTT-HT + 5184 12 3239 3232 3240 # HT-CTT-HT + 5185 1 3241 3242 3243 # CAT-CAO-CAM + 5186 2 3241 3242 3248 # CAT-CAO-HAT + 5187 3 3241 3247 3253 # CAT-CTT-HT + 5188 3 3241 3247 3254 # CAT-CTT-HT + 5189 3 3241 3247 3255 # CAT-CTT-HT + 5190 1 3241 3246 3245 # CAT-CAO-CAM + 5191 2 3241 3246 3252 # CAT-CAO-HAT + 5192 4 3242 3241 3247 # CAO-CAT-CTT + 5193 5 3242 3241 3246 # CAO-CAT-CAO + 5194 6 3242 3243 3244 # CAO-CAM-CAP + 5195 7 3242 3243 3249 # CAO-CAM-HAT + 5196 8 3243 3242 3248 # CAM-CAO-HAT + 5197 9 3243 3244 3245 # CAM-CAP-CAM + 5198 10 3243 3244 3250 # CAM-CAP-HAT + 5199 11 3244 3243 3249 # CAP-CAM-HAT + 5200 6 3246 3245 3244 # CAO-CAM-CAP + 5201 11 3244 3245 3251 # CAP-CAM-HAT + 5202 10 3245 3244 3250 # CAM-CAP-HAT + 5203 8 3245 3246 3252 # CAM-CAO-HAT + 5204 7 3246 3245 3251 # CAO-CAM-HAT + 5205 4 3246 3241 3247 # CAO-CAT-CTT + 5206 12 3253 3247 3254 # HT-CTT-HT + 5207 12 3253 3247 3255 # HT-CTT-HT + 5208 12 3254 3247 3255 # HT-CTT-HT + 5209 1 3256 3257 3258 # CAT-CAO-CAM + 5210 2 3256 3257 3263 # CAT-CAO-HAT + 5211 3 3256 3262 3268 # CAT-CTT-HT + 5212 3 3256 3262 3269 # CAT-CTT-HT + 5213 3 3256 3262 3270 # CAT-CTT-HT + 5214 1 3256 3261 3260 # CAT-CAO-CAM + 5215 2 3256 3261 3267 # CAT-CAO-HAT + 5216 4 3257 3256 3262 # CAO-CAT-CTT + 5217 5 3257 3256 3261 # CAO-CAT-CAO + 5218 6 3257 3258 3259 # CAO-CAM-CAP + 5219 7 3257 3258 3264 # CAO-CAM-HAT + 5220 8 3258 3257 3263 # CAM-CAO-HAT + 5221 9 3258 3259 3260 # CAM-CAP-CAM + 5222 10 3258 3259 3265 # CAM-CAP-HAT + 5223 11 3259 3258 3264 # CAP-CAM-HAT + 5224 6 3261 3260 3259 # CAO-CAM-CAP + 5225 11 3259 3260 3266 # CAP-CAM-HAT + 5226 10 3260 3259 3265 # CAM-CAP-HAT + 5227 8 3260 3261 3267 # CAM-CAO-HAT + 5228 7 3261 3260 3266 # CAO-CAM-HAT + 5229 4 3261 3256 3262 # CAO-CAT-CTT + 5230 12 3268 3262 3269 # HT-CTT-HT + 5231 12 3268 3262 3270 # HT-CTT-HT + 5232 12 3269 3262 3270 # HT-CTT-HT + 5233 1 3271 3272 3273 # CAT-CAO-CAM + 5234 2 3271 3272 3278 # CAT-CAO-HAT + 5235 3 3271 3277 3283 # CAT-CTT-HT + 5236 3 3271 3277 3284 # CAT-CTT-HT + 5237 3 3271 3277 3285 # CAT-CTT-HT + 5238 1 3271 3276 3275 # CAT-CAO-CAM + 5239 2 3271 3276 3282 # CAT-CAO-HAT + 5240 4 3272 3271 3277 # CAO-CAT-CTT + 5241 5 3272 3271 3276 # CAO-CAT-CAO + 5242 6 3272 3273 3274 # CAO-CAM-CAP + 5243 7 3272 3273 3279 # CAO-CAM-HAT + 5244 8 3273 3272 3278 # CAM-CAO-HAT + 5245 9 3273 3274 3275 # CAM-CAP-CAM + 5246 10 3273 3274 3280 # CAM-CAP-HAT + 5247 11 3274 3273 3279 # CAP-CAM-HAT + 5248 6 3276 3275 3274 # CAO-CAM-CAP + 5249 11 3274 3275 3281 # CAP-CAM-HAT + 5250 10 3275 3274 3280 # CAM-CAP-HAT + 5251 8 3275 3276 3282 # CAM-CAO-HAT + 5252 7 3276 3275 3281 # CAO-CAM-HAT + 5253 4 3276 3271 3277 # CAO-CAT-CTT + 5254 12 3283 3277 3284 # HT-CTT-HT + 5255 12 3283 3277 3285 # HT-CTT-HT + 5256 12 3284 3277 3285 # HT-CTT-HT + 5257 1 3286 3287 3288 # CAT-CAO-CAM + 5258 2 3286 3287 3293 # CAT-CAO-HAT + 5259 3 3286 3292 3298 # CAT-CTT-HT + 5260 3 3286 3292 3299 # CAT-CTT-HT + 5261 3 3286 3292 3300 # CAT-CTT-HT + 5262 1 3286 3291 3290 # CAT-CAO-CAM + 5263 2 3286 3291 3297 # CAT-CAO-HAT + 5264 4 3287 3286 3292 # CAO-CAT-CTT + 5265 5 3287 3286 3291 # CAO-CAT-CAO + 5266 6 3287 3288 3289 # CAO-CAM-CAP + 5267 7 3287 3288 3294 # CAO-CAM-HAT + 5268 8 3288 3287 3293 # CAM-CAO-HAT + 5269 9 3288 3289 3290 # CAM-CAP-CAM + 5270 10 3288 3289 3295 # CAM-CAP-HAT + 5271 11 3289 3288 3294 # CAP-CAM-HAT + 5272 6 3291 3290 3289 # CAO-CAM-CAP + 5273 11 3289 3290 3296 # CAP-CAM-HAT + 5274 10 3290 3289 3295 # CAM-CAP-HAT + 5275 8 3290 3291 3297 # CAM-CAO-HAT + 5276 7 3291 3290 3296 # CAO-CAM-HAT + 5277 4 3291 3286 3292 # CAO-CAT-CTT + 5278 12 3298 3292 3299 # HT-CTT-HT + 5279 12 3298 3292 3300 # HT-CTT-HT + 5280 12 3299 3292 3300 # HT-CTT-HT + 5281 1 3301 3302 3303 # CAT-CAO-CAM + 5282 2 3301 3302 3308 # CAT-CAO-HAT + 5283 3 3301 3307 3313 # CAT-CTT-HT + 5284 3 3301 3307 3314 # CAT-CTT-HT + 5285 3 3301 3307 3315 # CAT-CTT-HT + 5286 1 3301 3306 3305 # CAT-CAO-CAM + 5287 2 3301 3306 3312 # CAT-CAO-HAT + 5288 4 3302 3301 3307 # CAO-CAT-CTT + 5289 5 3302 3301 3306 # CAO-CAT-CAO + 5290 6 3302 3303 3304 # CAO-CAM-CAP + 5291 7 3302 3303 3309 # CAO-CAM-HAT + 5292 8 3303 3302 3308 # CAM-CAO-HAT + 5293 9 3303 3304 3305 # CAM-CAP-CAM + 5294 10 3303 3304 3310 # CAM-CAP-HAT + 5295 11 3304 3303 3309 # CAP-CAM-HAT + 5296 6 3306 3305 3304 # CAO-CAM-CAP + 5297 11 3304 3305 3311 # CAP-CAM-HAT + 5298 10 3305 3304 3310 # CAM-CAP-HAT + 5299 8 3305 3306 3312 # CAM-CAO-HAT + 5300 7 3306 3305 3311 # CAO-CAM-HAT + 5301 4 3306 3301 3307 # CAO-CAT-CTT + 5302 12 3313 3307 3314 # HT-CTT-HT + 5303 12 3313 3307 3315 # HT-CTT-HT + 5304 12 3314 3307 3315 # HT-CTT-HT + 5305 1 3316 3317 3318 # CAT-CAO-CAM + 5306 2 3316 3317 3323 # CAT-CAO-HAT + 5307 3 3316 3322 3328 # CAT-CTT-HT + 5308 3 3316 3322 3329 # CAT-CTT-HT + 5309 3 3316 3322 3330 # CAT-CTT-HT + 5310 1 3316 3321 3320 # CAT-CAO-CAM + 5311 2 3316 3321 3327 # CAT-CAO-HAT + 5312 4 3317 3316 3322 # CAO-CAT-CTT + 5313 5 3317 3316 3321 # CAO-CAT-CAO + 5314 6 3317 3318 3319 # CAO-CAM-CAP + 5315 7 3317 3318 3324 # CAO-CAM-HAT + 5316 8 3318 3317 3323 # CAM-CAO-HAT + 5317 9 3318 3319 3320 # CAM-CAP-CAM + 5318 10 3318 3319 3325 # CAM-CAP-HAT + 5319 11 3319 3318 3324 # CAP-CAM-HAT + 5320 6 3321 3320 3319 # CAO-CAM-CAP + 5321 11 3319 3320 3326 # CAP-CAM-HAT + 5322 10 3320 3319 3325 # CAM-CAP-HAT + 5323 8 3320 3321 3327 # CAM-CAO-HAT + 5324 7 3321 3320 3326 # CAO-CAM-HAT + 5325 4 3321 3316 3322 # CAO-CAT-CTT + 5326 12 3328 3322 3329 # HT-CTT-HT + 5327 12 3328 3322 3330 # HT-CTT-HT + 5328 12 3329 3322 3330 # HT-CTT-HT + 5329 1 3331 3332 3333 # CAT-CAO-CAM + 5330 2 3331 3332 3338 # CAT-CAO-HAT + 5331 3 3331 3337 3343 # CAT-CTT-HT + 5332 3 3331 3337 3344 # CAT-CTT-HT + 5333 3 3331 3337 3345 # CAT-CTT-HT + 5334 1 3331 3336 3335 # CAT-CAO-CAM + 5335 2 3331 3336 3342 # CAT-CAO-HAT + 5336 4 3332 3331 3337 # CAO-CAT-CTT + 5337 5 3332 3331 3336 # CAO-CAT-CAO + 5338 6 3332 3333 3334 # CAO-CAM-CAP + 5339 7 3332 3333 3339 # CAO-CAM-HAT + 5340 8 3333 3332 3338 # CAM-CAO-HAT + 5341 9 3333 3334 3335 # CAM-CAP-CAM + 5342 10 3333 3334 3340 # CAM-CAP-HAT + 5343 11 3334 3333 3339 # CAP-CAM-HAT + 5344 6 3336 3335 3334 # CAO-CAM-CAP + 5345 11 3334 3335 3341 # CAP-CAM-HAT + 5346 10 3335 3334 3340 # CAM-CAP-HAT + 5347 8 3335 3336 3342 # CAM-CAO-HAT + 5348 7 3336 3335 3341 # CAO-CAM-HAT + 5349 4 3336 3331 3337 # CAO-CAT-CTT + 5350 12 3343 3337 3344 # HT-CTT-HT + 5351 12 3343 3337 3345 # HT-CTT-HT + 5352 12 3344 3337 3345 # HT-CTT-HT + 5353 1 3346 3347 3348 # CAT-CAO-CAM + 5354 2 3346 3347 3353 # CAT-CAO-HAT + 5355 3 3346 3352 3358 # CAT-CTT-HT + 5356 3 3346 3352 3359 # CAT-CTT-HT + 5357 3 3346 3352 3360 # CAT-CTT-HT + 5358 1 3346 3351 3350 # CAT-CAO-CAM + 5359 2 3346 3351 3357 # CAT-CAO-HAT + 5360 4 3347 3346 3352 # CAO-CAT-CTT + 5361 5 3347 3346 3351 # CAO-CAT-CAO + 5362 6 3347 3348 3349 # CAO-CAM-CAP + 5363 7 3347 3348 3354 # CAO-CAM-HAT + 5364 8 3348 3347 3353 # CAM-CAO-HAT + 5365 9 3348 3349 3350 # CAM-CAP-CAM + 5366 10 3348 3349 3355 # CAM-CAP-HAT + 5367 11 3349 3348 3354 # CAP-CAM-HAT + 5368 6 3351 3350 3349 # CAO-CAM-CAP + 5369 11 3349 3350 3356 # CAP-CAM-HAT + 5370 10 3350 3349 3355 # CAM-CAP-HAT + 5371 8 3350 3351 3357 # CAM-CAO-HAT + 5372 7 3351 3350 3356 # CAO-CAM-HAT + 5373 4 3351 3346 3352 # CAO-CAT-CTT + 5374 12 3358 3352 3359 # HT-CTT-HT + 5375 12 3358 3352 3360 # HT-CTT-HT + 5376 12 3359 3352 3360 # HT-CTT-HT + 5377 1 3361 3362 3363 # CAT-CAO-CAM + 5378 2 3361 3362 3368 # CAT-CAO-HAT + 5379 3 3361 3367 3373 # CAT-CTT-HT + 5380 3 3361 3367 3374 # CAT-CTT-HT + 5381 3 3361 3367 3375 # CAT-CTT-HT + 5382 1 3361 3366 3365 # CAT-CAO-CAM + 5383 2 3361 3366 3372 # CAT-CAO-HAT + 5384 4 3362 3361 3367 # CAO-CAT-CTT + 5385 5 3362 3361 3366 # CAO-CAT-CAO + 5386 6 3362 3363 3364 # CAO-CAM-CAP + 5387 7 3362 3363 3369 # CAO-CAM-HAT + 5388 8 3363 3362 3368 # CAM-CAO-HAT + 5389 9 3363 3364 3365 # CAM-CAP-CAM + 5390 10 3363 3364 3370 # CAM-CAP-HAT + 5391 11 3364 3363 3369 # CAP-CAM-HAT + 5392 6 3366 3365 3364 # CAO-CAM-CAP + 5393 11 3364 3365 3371 # CAP-CAM-HAT + 5394 10 3365 3364 3370 # CAM-CAP-HAT + 5395 8 3365 3366 3372 # CAM-CAO-HAT + 5396 7 3366 3365 3371 # CAO-CAM-HAT + 5397 4 3366 3361 3367 # CAO-CAT-CTT + 5398 12 3373 3367 3374 # HT-CTT-HT + 5399 12 3373 3367 3375 # HT-CTT-HT + 5400 12 3374 3367 3375 # HT-CTT-HT + 5401 1 3376 3377 3378 # CAT-CAO-CAM + 5402 2 3376 3377 3383 # CAT-CAO-HAT + 5403 3 3376 3382 3388 # CAT-CTT-HT + 5404 3 3376 3382 3389 # CAT-CTT-HT + 5405 3 3376 3382 3390 # CAT-CTT-HT + 5406 1 3376 3381 3380 # CAT-CAO-CAM + 5407 2 3376 3381 3387 # CAT-CAO-HAT + 5408 4 3377 3376 3382 # CAO-CAT-CTT + 5409 5 3377 3376 3381 # CAO-CAT-CAO + 5410 6 3377 3378 3379 # CAO-CAM-CAP + 5411 7 3377 3378 3384 # CAO-CAM-HAT + 5412 8 3378 3377 3383 # CAM-CAO-HAT + 5413 9 3378 3379 3380 # CAM-CAP-CAM + 5414 10 3378 3379 3385 # CAM-CAP-HAT + 5415 11 3379 3378 3384 # CAP-CAM-HAT + 5416 6 3381 3380 3379 # CAO-CAM-CAP + 5417 11 3379 3380 3386 # CAP-CAM-HAT + 5418 10 3380 3379 3385 # CAM-CAP-HAT + 5419 8 3380 3381 3387 # CAM-CAO-HAT + 5420 7 3381 3380 3386 # CAO-CAM-HAT + 5421 4 3381 3376 3382 # CAO-CAT-CTT + 5422 12 3388 3382 3389 # HT-CTT-HT + 5423 12 3388 3382 3390 # HT-CTT-HT + 5424 12 3389 3382 3390 # HT-CTT-HT + 5425 1 3391 3392 3393 # CAT-CAO-CAM + 5426 2 3391 3392 3398 # CAT-CAO-HAT + 5427 3 3391 3397 3403 # CAT-CTT-HT + 5428 3 3391 3397 3404 # CAT-CTT-HT + 5429 3 3391 3397 3405 # CAT-CTT-HT + 5430 1 3391 3396 3395 # CAT-CAO-CAM + 5431 2 3391 3396 3402 # CAT-CAO-HAT + 5432 4 3392 3391 3397 # CAO-CAT-CTT + 5433 5 3392 3391 3396 # CAO-CAT-CAO + 5434 6 3392 3393 3394 # CAO-CAM-CAP + 5435 7 3392 3393 3399 # CAO-CAM-HAT + 5436 8 3393 3392 3398 # CAM-CAO-HAT + 5437 9 3393 3394 3395 # CAM-CAP-CAM + 5438 10 3393 3394 3400 # CAM-CAP-HAT + 5439 11 3394 3393 3399 # CAP-CAM-HAT + 5440 6 3396 3395 3394 # CAO-CAM-CAP + 5441 11 3394 3395 3401 # CAP-CAM-HAT + 5442 10 3395 3394 3400 # CAM-CAP-HAT + 5443 8 3395 3396 3402 # CAM-CAO-HAT + 5444 7 3396 3395 3401 # CAO-CAM-HAT + 5445 4 3396 3391 3397 # CAO-CAT-CTT + 5446 12 3403 3397 3404 # HT-CTT-HT + 5447 12 3403 3397 3405 # HT-CTT-HT + 5448 12 3404 3397 3405 # HT-CTT-HT + 5449 1 3406 3407 3408 # CAT-CAO-CAM + 5450 2 3406 3407 3413 # CAT-CAO-HAT + 5451 3 3406 3412 3418 # CAT-CTT-HT + 5452 3 3406 3412 3419 # CAT-CTT-HT + 5453 3 3406 3412 3420 # CAT-CTT-HT + 5454 1 3406 3411 3410 # CAT-CAO-CAM + 5455 2 3406 3411 3417 # CAT-CAO-HAT + 5456 4 3407 3406 3412 # CAO-CAT-CTT + 5457 5 3407 3406 3411 # CAO-CAT-CAO + 5458 6 3407 3408 3409 # CAO-CAM-CAP + 5459 7 3407 3408 3414 # CAO-CAM-HAT + 5460 8 3408 3407 3413 # CAM-CAO-HAT + 5461 9 3408 3409 3410 # CAM-CAP-CAM + 5462 10 3408 3409 3415 # CAM-CAP-HAT + 5463 11 3409 3408 3414 # CAP-CAM-HAT + 5464 6 3411 3410 3409 # CAO-CAM-CAP + 5465 11 3409 3410 3416 # CAP-CAM-HAT + 5466 10 3410 3409 3415 # CAM-CAP-HAT + 5467 8 3410 3411 3417 # CAM-CAO-HAT + 5468 7 3411 3410 3416 # CAO-CAM-HAT + 5469 4 3411 3406 3412 # CAO-CAT-CTT + 5470 12 3418 3412 3419 # HT-CTT-HT + 5471 12 3418 3412 3420 # HT-CTT-HT + 5472 12 3419 3412 3420 # HT-CTT-HT + 5473 1 3421 3422 3423 # CAT-CAO-CAM + 5474 2 3421 3422 3428 # CAT-CAO-HAT + 5475 3 3421 3427 3433 # CAT-CTT-HT + 5476 3 3421 3427 3434 # CAT-CTT-HT + 5477 3 3421 3427 3435 # CAT-CTT-HT + 5478 1 3421 3426 3425 # CAT-CAO-CAM + 5479 2 3421 3426 3432 # CAT-CAO-HAT + 5480 4 3422 3421 3427 # CAO-CAT-CTT + 5481 5 3422 3421 3426 # CAO-CAT-CAO + 5482 6 3422 3423 3424 # CAO-CAM-CAP + 5483 7 3422 3423 3429 # CAO-CAM-HAT + 5484 8 3423 3422 3428 # CAM-CAO-HAT + 5485 9 3423 3424 3425 # CAM-CAP-CAM + 5486 10 3423 3424 3430 # CAM-CAP-HAT + 5487 11 3424 3423 3429 # CAP-CAM-HAT + 5488 6 3426 3425 3424 # CAO-CAM-CAP + 5489 11 3424 3425 3431 # CAP-CAM-HAT + 5490 10 3425 3424 3430 # CAM-CAP-HAT + 5491 8 3425 3426 3432 # CAM-CAO-HAT + 5492 7 3426 3425 3431 # CAO-CAM-HAT + 5493 4 3426 3421 3427 # CAO-CAT-CTT + 5494 12 3433 3427 3434 # HT-CTT-HT + 5495 12 3433 3427 3435 # HT-CTT-HT + 5496 12 3434 3427 3435 # HT-CTT-HT + 5497 1 3436 3437 3438 # CAT-CAO-CAM + 5498 2 3436 3437 3443 # CAT-CAO-HAT + 5499 3 3436 3442 3448 # CAT-CTT-HT + 5500 3 3436 3442 3449 # CAT-CTT-HT + 5501 3 3436 3442 3450 # CAT-CTT-HT + 5502 1 3436 3441 3440 # CAT-CAO-CAM + 5503 2 3436 3441 3447 # CAT-CAO-HAT + 5504 4 3437 3436 3442 # CAO-CAT-CTT + 5505 5 3437 3436 3441 # CAO-CAT-CAO + 5506 6 3437 3438 3439 # CAO-CAM-CAP + 5507 7 3437 3438 3444 # CAO-CAM-HAT + 5508 8 3438 3437 3443 # CAM-CAO-HAT + 5509 9 3438 3439 3440 # CAM-CAP-CAM + 5510 10 3438 3439 3445 # CAM-CAP-HAT + 5511 11 3439 3438 3444 # CAP-CAM-HAT + 5512 6 3441 3440 3439 # CAO-CAM-CAP + 5513 11 3439 3440 3446 # CAP-CAM-HAT + 5514 10 3440 3439 3445 # CAM-CAP-HAT + 5515 8 3440 3441 3447 # CAM-CAO-HAT + 5516 7 3441 3440 3446 # CAO-CAM-HAT + 5517 4 3441 3436 3442 # CAO-CAT-CTT + 5518 12 3448 3442 3449 # HT-CTT-HT + 5519 12 3448 3442 3450 # HT-CTT-HT + 5520 12 3449 3442 3450 # HT-CTT-HT + 5521 1 3451 3452 3453 # CAT-CAO-CAM + 5522 2 3451 3452 3458 # CAT-CAO-HAT + 5523 3 3451 3457 3463 # CAT-CTT-HT + 5524 3 3451 3457 3464 # CAT-CTT-HT + 5525 3 3451 3457 3465 # CAT-CTT-HT + 5526 1 3451 3456 3455 # CAT-CAO-CAM + 5527 2 3451 3456 3462 # CAT-CAO-HAT + 5528 4 3452 3451 3457 # CAO-CAT-CTT + 5529 5 3452 3451 3456 # CAO-CAT-CAO + 5530 6 3452 3453 3454 # CAO-CAM-CAP + 5531 7 3452 3453 3459 # CAO-CAM-HAT + 5532 8 3453 3452 3458 # CAM-CAO-HAT + 5533 9 3453 3454 3455 # CAM-CAP-CAM + 5534 10 3453 3454 3460 # CAM-CAP-HAT + 5535 11 3454 3453 3459 # CAP-CAM-HAT + 5536 6 3456 3455 3454 # CAO-CAM-CAP + 5537 11 3454 3455 3461 # CAP-CAM-HAT + 5538 10 3455 3454 3460 # CAM-CAP-HAT + 5539 8 3455 3456 3462 # CAM-CAO-HAT + 5540 7 3456 3455 3461 # CAO-CAM-HAT + 5541 4 3456 3451 3457 # CAO-CAT-CTT + 5542 12 3463 3457 3464 # HT-CTT-HT + 5543 12 3463 3457 3465 # HT-CTT-HT + 5544 12 3464 3457 3465 # HT-CTT-HT + 5545 1 3466 3467 3468 # CAT-CAO-CAM + 5546 2 3466 3467 3473 # CAT-CAO-HAT + 5547 3 3466 3472 3478 # CAT-CTT-HT + 5548 3 3466 3472 3479 # CAT-CTT-HT + 5549 3 3466 3472 3480 # CAT-CTT-HT + 5550 1 3466 3471 3470 # CAT-CAO-CAM + 5551 2 3466 3471 3477 # CAT-CAO-HAT + 5552 4 3467 3466 3472 # CAO-CAT-CTT + 5553 5 3467 3466 3471 # CAO-CAT-CAO + 5554 6 3467 3468 3469 # CAO-CAM-CAP + 5555 7 3467 3468 3474 # CAO-CAM-HAT + 5556 8 3468 3467 3473 # CAM-CAO-HAT + 5557 9 3468 3469 3470 # CAM-CAP-CAM + 5558 10 3468 3469 3475 # CAM-CAP-HAT + 5559 11 3469 3468 3474 # CAP-CAM-HAT + 5560 6 3471 3470 3469 # CAO-CAM-CAP + 5561 11 3469 3470 3476 # CAP-CAM-HAT + 5562 10 3470 3469 3475 # CAM-CAP-HAT + 5563 8 3470 3471 3477 # CAM-CAO-HAT + 5564 7 3471 3470 3476 # CAO-CAM-HAT + 5565 4 3471 3466 3472 # CAO-CAT-CTT + 5566 12 3478 3472 3479 # HT-CTT-HT + 5567 12 3478 3472 3480 # HT-CTT-HT + 5568 12 3479 3472 3480 # HT-CTT-HT + 5569 1 3481 3482 3483 # CAT-CAO-CAM + 5570 2 3481 3482 3488 # CAT-CAO-HAT + 5571 3 3481 3487 3493 # CAT-CTT-HT + 5572 3 3481 3487 3494 # CAT-CTT-HT + 5573 3 3481 3487 3495 # CAT-CTT-HT + 5574 1 3481 3486 3485 # CAT-CAO-CAM + 5575 2 3481 3486 3492 # CAT-CAO-HAT + 5576 4 3482 3481 3487 # CAO-CAT-CTT + 5577 5 3482 3481 3486 # CAO-CAT-CAO + 5578 6 3482 3483 3484 # CAO-CAM-CAP + 5579 7 3482 3483 3489 # CAO-CAM-HAT + 5580 8 3483 3482 3488 # CAM-CAO-HAT + 5581 9 3483 3484 3485 # CAM-CAP-CAM + 5582 10 3483 3484 3490 # CAM-CAP-HAT + 5583 11 3484 3483 3489 # CAP-CAM-HAT + 5584 6 3486 3485 3484 # CAO-CAM-CAP + 5585 11 3484 3485 3491 # CAP-CAM-HAT + 5586 10 3485 3484 3490 # CAM-CAP-HAT + 5587 8 3485 3486 3492 # CAM-CAO-HAT + 5588 7 3486 3485 3491 # CAO-CAM-HAT + 5589 4 3486 3481 3487 # CAO-CAT-CTT + 5590 12 3493 3487 3494 # HT-CTT-HT + 5591 12 3493 3487 3495 # HT-CTT-HT + 5592 12 3494 3487 3495 # HT-CTT-HT + 5593 1 3496 3497 3498 # CAT-CAO-CAM + 5594 2 3496 3497 3503 # CAT-CAO-HAT + 5595 3 3496 3502 3508 # CAT-CTT-HT + 5596 3 3496 3502 3509 # CAT-CTT-HT + 5597 3 3496 3502 3510 # CAT-CTT-HT + 5598 1 3496 3501 3500 # CAT-CAO-CAM + 5599 2 3496 3501 3507 # CAT-CAO-HAT + 5600 4 3497 3496 3502 # CAO-CAT-CTT + 5601 5 3497 3496 3501 # CAO-CAT-CAO + 5602 6 3497 3498 3499 # CAO-CAM-CAP + 5603 7 3497 3498 3504 # CAO-CAM-HAT + 5604 8 3498 3497 3503 # CAM-CAO-HAT + 5605 9 3498 3499 3500 # CAM-CAP-CAM + 5606 10 3498 3499 3505 # CAM-CAP-HAT + 5607 11 3499 3498 3504 # CAP-CAM-HAT + 5608 6 3501 3500 3499 # CAO-CAM-CAP + 5609 11 3499 3500 3506 # CAP-CAM-HAT + 5610 10 3500 3499 3505 # CAM-CAP-HAT + 5611 8 3500 3501 3507 # CAM-CAO-HAT + 5612 7 3501 3500 3506 # CAO-CAM-HAT + 5613 4 3501 3496 3502 # CAO-CAT-CTT + 5614 12 3508 3502 3509 # HT-CTT-HT + 5615 12 3508 3502 3510 # HT-CTT-HT + 5616 12 3509 3502 3510 # HT-CTT-HT + 5617 1 3511 3512 3513 # CAT-CAO-CAM + 5618 2 3511 3512 3518 # CAT-CAO-HAT + 5619 3 3511 3517 3523 # CAT-CTT-HT + 5620 3 3511 3517 3524 # CAT-CTT-HT + 5621 3 3511 3517 3525 # CAT-CTT-HT + 5622 1 3511 3516 3515 # CAT-CAO-CAM + 5623 2 3511 3516 3522 # CAT-CAO-HAT + 5624 4 3512 3511 3517 # CAO-CAT-CTT + 5625 5 3512 3511 3516 # CAO-CAT-CAO + 5626 6 3512 3513 3514 # CAO-CAM-CAP + 5627 7 3512 3513 3519 # CAO-CAM-HAT + 5628 8 3513 3512 3518 # CAM-CAO-HAT + 5629 9 3513 3514 3515 # CAM-CAP-CAM + 5630 10 3513 3514 3520 # CAM-CAP-HAT + 5631 11 3514 3513 3519 # CAP-CAM-HAT + 5632 6 3516 3515 3514 # CAO-CAM-CAP + 5633 11 3514 3515 3521 # CAP-CAM-HAT + 5634 10 3515 3514 3520 # CAM-CAP-HAT + 5635 8 3515 3516 3522 # CAM-CAO-HAT + 5636 7 3516 3515 3521 # CAO-CAM-HAT + 5637 4 3516 3511 3517 # CAO-CAT-CTT + 5638 12 3523 3517 3524 # HT-CTT-HT + 5639 12 3523 3517 3525 # HT-CTT-HT + 5640 12 3524 3517 3525 # HT-CTT-HT + 5641 1 3526 3527 3528 # CAT-CAO-CAM + 5642 2 3526 3527 3533 # CAT-CAO-HAT + 5643 3 3526 3532 3538 # CAT-CTT-HT + 5644 3 3526 3532 3539 # CAT-CTT-HT + 5645 3 3526 3532 3540 # CAT-CTT-HT + 5646 1 3526 3531 3530 # CAT-CAO-CAM + 5647 2 3526 3531 3537 # CAT-CAO-HAT + 5648 4 3527 3526 3532 # CAO-CAT-CTT + 5649 5 3527 3526 3531 # CAO-CAT-CAO + 5650 6 3527 3528 3529 # CAO-CAM-CAP + 5651 7 3527 3528 3534 # CAO-CAM-HAT + 5652 8 3528 3527 3533 # CAM-CAO-HAT + 5653 9 3528 3529 3530 # CAM-CAP-CAM + 5654 10 3528 3529 3535 # CAM-CAP-HAT + 5655 11 3529 3528 3534 # CAP-CAM-HAT + 5656 6 3531 3530 3529 # CAO-CAM-CAP + 5657 11 3529 3530 3536 # CAP-CAM-HAT + 5658 10 3530 3529 3535 # CAM-CAP-HAT + 5659 8 3530 3531 3537 # CAM-CAO-HAT + 5660 7 3531 3530 3536 # CAO-CAM-HAT + 5661 4 3531 3526 3532 # CAO-CAT-CTT + 5662 12 3538 3532 3539 # HT-CTT-HT + 5663 12 3538 3532 3540 # HT-CTT-HT + 5664 12 3539 3532 3540 # HT-CTT-HT + 5665 1 3541 3542 3543 # CAT-CAO-CAM + 5666 2 3541 3542 3548 # CAT-CAO-HAT + 5667 3 3541 3547 3553 # CAT-CTT-HT + 5668 3 3541 3547 3554 # CAT-CTT-HT + 5669 3 3541 3547 3555 # CAT-CTT-HT + 5670 1 3541 3546 3545 # CAT-CAO-CAM + 5671 2 3541 3546 3552 # CAT-CAO-HAT + 5672 4 3542 3541 3547 # CAO-CAT-CTT + 5673 5 3542 3541 3546 # CAO-CAT-CAO + 5674 6 3542 3543 3544 # CAO-CAM-CAP + 5675 7 3542 3543 3549 # CAO-CAM-HAT + 5676 8 3543 3542 3548 # CAM-CAO-HAT + 5677 9 3543 3544 3545 # CAM-CAP-CAM + 5678 10 3543 3544 3550 # CAM-CAP-HAT + 5679 11 3544 3543 3549 # CAP-CAM-HAT + 5680 6 3546 3545 3544 # CAO-CAM-CAP + 5681 11 3544 3545 3551 # CAP-CAM-HAT + 5682 10 3545 3544 3550 # CAM-CAP-HAT + 5683 8 3545 3546 3552 # CAM-CAO-HAT + 5684 7 3546 3545 3551 # CAO-CAM-HAT + 5685 4 3546 3541 3547 # CAO-CAT-CTT + 5686 12 3553 3547 3554 # HT-CTT-HT + 5687 12 3553 3547 3555 # HT-CTT-HT + 5688 12 3554 3547 3555 # HT-CTT-HT + 5689 1 3556 3557 3558 # CAT-CAO-CAM + 5690 2 3556 3557 3563 # CAT-CAO-HAT + 5691 3 3556 3562 3568 # CAT-CTT-HT + 5692 3 3556 3562 3569 # CAT-CTT-HT + 5693 3 3556 3562 3570 # CAT-CTT-HT + 5694 1 3556 3561 3560 # CAT-CAO-CAM + 5695 2 3556 3561 3567 # CAT-CAO-HAT + 5696 4 3557 3556 3562 # CAO-CAT-CTT + 5697 5 3557 3556 3561 # CAO-CAT-CAO + 5698 6 3557 3558 3559 # CAO-CAM-CAP + 5699 7 3557 3558 3564 # CAO-CAM-HAT + 5700 8 3558 3557 3563 # CAM-CAO-HAT + 5701 9 3558 3559 3560 # CAM-CAP-CAM + 5702 10 3558 3559 3565 # CAM-CAP-HAT + 5703 11 3559 3558 3564 # CAP-CAM-HAT + 5704 6 3561 3560 3559 # CAO-CAM-CAP + 5705 11 3559 3560 3566 # CAP-CAM-HAT + 5706 10 3560 3559 3565 # CAM-CAP-HAT + 5707 8 3560 3561 3567 # CAM-CAO-HAT + 5708 7 3561 3560 3566 # CAO-CAM-HAT + 5709 4 3561 3556 3562 # CAO-CAT-CTT + 5710 12 3568 3562 3569 # HT-CTT-HT + 5711 12 3568 3562 3570 # HT-CTT-HT + 5712 12 3569 3562 3570 # HT-CTT-HT + 5713 1 3571 3572 3573 # CAT-CAO-CAM + 5714 2 3571 3572 3578 # CAT-CAO-HAT + 5715 3 3571 3577 3583 # CAT-CTT-HT + 5716 3 3571 3577 3584 # CAT-CTT-HT + 5717 3 3571 3577 3585 # CAT-CTT-HT + 5718 1 3571 3576 3575 # CAT-CAO-CAM + 5719 2 3571 3576 3582 # CAT-CAO-HAT + 5720 4 3572 3571 3577 # CAO-CAT-CTT + 5721 5 3572 3571 3576 # CAO-CAT-CAO + 5722 6 3572 3573 3574 # CAO-CAM-CAP + 5723 7 3572 3573 3579 # CAO-CAM-HAT + 5724 8 3573 3572 3578 # CAM-CAO-HAT + 5725 9 3573 3574 3575 # CAM-CAP-CAM + 5726 10 3573 3574 3580 # CAM-CAP-HAT + 5727 11 3574 3573 3579 # CAP-CAM-HAT + 5728 6 3576 3575 3574 # CAO-CAM-CAP + 5729 11 3574 3575 3581 # CAP-CAM-HAT + 5730 10 3575 3574 3580 # CAM-CAP-HAT + 5731 8 3575 3576 3582 # CAM-CAO-HAT + 5732 7 3576 3575 3581 # CAO-CAM-HAT + 5733 4 3576 3571 3577 # CAO-CAT-CTT + 5734 12 3583 3577 3584 # HT-CTT-HT + 5735 12 3583 3577 3585 # HT-CTT-HT + 5736 12 3584 3577 3585 # HT-CTT-HT + 5737 1 3586 3587 3588 # CAT-CAO-CAM + 5738 2 3586 3587 3593 # CAT-CAO-HAT + 5739 3 3586 3592 3598 # CAT-CTT-HT + 5740 3 3586 3592 3599 # CAT-CTT-HT + 5741 3 3586 3592 3600 # CAT-CTT-HT + 5742 1 3586 3591 3590 # CAT-CAO-CAM + 5743 2 3586 3591 3597 # CAT-CAO-HAT + 5744 4 3587 3586 3592 # CAO-CAT-CTT + 5745 5 3587 3586 3591 # CAO-CAT-CAO + 5746 6 3587 3588 3589 # CAO-CAM-CAP + 5747 7 3587 3588 3594 # CAO-CAM-HAT + 5748 8 3588 3587 3593 # CAM-CAO-HAT + 5749 9 3588 3589 3590 # CAM-CAP-CAM + 5750 10 3588 3589 3595 # CAM-CAP-HAT + 5751 11 3589 3588 3594 # CAP-CAM-HAT + 5752 6 3591 3590 3589 # CAO-CAM-CAP + 5753 11 3589 3590 3596 # CAP-CAM-HAT + 5754 10 3590 3589 3595 # CAM-CAP-HAT + 5755 8 3590 3591 3597 # CAM-CAO-HAT + 5756 7 3591 3590 3596 # CAO-CAM-HAT + 5757 4 3591 3586 3592 # CAO-CAT-CTT + 5758 12 3598 3592 3599 # HT-CTT-HT + 5759 12 3598 3592 3600 # HT-CTT-HT + 5760 12 3599 3592 3600 # HT-CTT-HT + 5761 1 3601 3602 3603 # CAT-CAO-CAM + 5762 2 3601 3602 3608 # CAT-CAO-HAT + 5763 3 3601 3607 3613 # CAT-CTT-HT + 5764 3 3601 3607 3614 # CAT-CTT-HT + 5765 3 3601 3607 3615 # CAT-CTT-HT + 5766 1 3601 3606 3605 # CAT-CAO-CAM + 5767 2 3601 3606 3612 # CAT-CAO-HAT + 5768 4 3602 3601 3607 # CAO-CAT-CTT + 5769 5 3602 3601 3606 # CAO-CAT-CAO + 5770 6 3602 3603 3604 # CAO-CAM-CAP + 5771 7 3602 3603 3609 # CAO-CAM-HAT + 5772 8 3603 3602 3608 # CAM-CAO-HAT + 5773 9 3603 3604 3605 # CAM-CAP-CAM + 5774 10 3603 3604 3610 # CAM-CAP-HAT + 5775 11 3604 3603 3609 # CAP-CAM-HAT + 5776 6 3606 3605 3604 # CAO-CAM-CAP + 5777 11 3604 3605 3611 # CAP-CAM-HAT + 5778 10 3605 3604 3610 # CAM-CAP-HAT + 5779 8 3605 3606 3612 # CAM-CAO-HAT + 5780 7 3606 3605 3611 # CAO-CAM-HAT + 5781 4 3606 3601 3607 # CAO-CAT-CTT + 5782 12 3613 3607 3614 # HT-CTT-HT + 5783 12 3613 3607 3615 # HT-CTT-HT + 5784 12 3614 3607 3615 # HT-CTT-HT + 5785 1 3616 3617 3618 # CAT-CAO-CAM + 5786 2 3616 3617 3623 # CAT-CAO-HAT + 5787 3 3616 3622 3628 # CAT-CTT-HT + 5788 3 3616 3622 3629 # CAT-CTT-HT + 5789 3 3616 3622 3630 # CAT-CTT-HT + 5790 1 3616 3621 3620 # CAT-CAO-CAM + 5791 2 3616 3621 3627 # CAT-CAO-HAT + 5792 4 3617 3616 3622 # CAO-CAT-CTT + 5793 5 3617 3616 3621 # CAO-CAT-CAO + 5794 6 3617 3618 3619 # CAO-CAM-CAP + 5795 7 3617 3618 3624 # CAO-CAM-HAT + 5796 8 3618 3617 3623 # CAM-CAO-HAT + 5797 9 3618 3619 3620 # CAM-CAP-CAM + 5798 10 3618 3619 3625 # CAM-CAP-HAT + 5799 11 3619 3618 3624 # CAP-CAM-HAT + 5800 6 3621 3620 3619 # CAO-CAM-CAP + 5801 11 3619 3620 3626 # CAP-CAM-HAT + 5802 10 3620 3619 3625 # CAM-CAP-HAT + 5803 8 3620 3621 3627 # CAM-CAO-HAT + 5804 7 3621 3620 3626 # CAO-CAM-HAT + 5805 4 3621 3616 3622 # CAO-CAT-CTT + 5806 12 3628 3622 3629 # HT-CTT-HT + 5807 12 3628 3622 3630 # HT-CTT-HT + 5808 12 3629 3622 3630 # HT-CTT-HT + 5809 1 3631 3632 3633 # CAT-CAO-CAM + 5810 2 3631 3632 3638 # CAT-CAO-HAT + 5811 3 3631 3637 3643 # CAT-CTT-HT + 5812 3 3631 3637 3644 # CAT-CTT-HT + 5813 3 3631 3637 3645 # CAT-CTT-HT + 5814 1 3631 3636 3635 # CAT-CAO-CAM + 5815 2 3631 3636 3642 # CAT-CAO-HAT + 5816 4 3632 3631 3637 # CAO-CAT-CTT + 5817 5 3632 3631 3636 # CAO-CAT-CAO + 5818 6 3632 3633 3634 # CAO-CAM-CAP + 5819 7 3632 3633 3639 # CAO-CAM-HAT + 5820 8 3633 3632 3638 # CAM-CAO-HAT + 5821 9 3633 3634 3635 # CAM-CAP-CAM + 5822 10 3633 3634 3640 # CAM-CAP-HAT + 5823 11 3634 3633 3639 # CAP-CAM-HAT + 5824 6 3636 3635 3634 # CAO-CAM-CAP + 5825 11 3634 3635 3641 # CAP-CAM-HAT + 5826 10 3635 3634 3640 # CAM-CAP-HAT + 5827 8 3635 3636 3642 # CAM-CAO-HAT + 5828 7 3636 3635 3641 # CAO-CAM-HAT + 5829 4 3636 3631 3637 # CAO-CAT-CTT + 5830 12 3643 3637 3644 # HT-CTT-HT + 5831 12 3643 3637 3645 # HT-CTT-HT + 5832 12 3644 3637 3645 # HT-CTT-HT + 5833 1 3646 3647 3648 # CAT-CAO-CAM + 5834 2 3646 3647 3653 # CAT-CAO-HAT + 5835 3 3646 3652 3658 # CAT-CTT-HT + 5836 3 3646 3652 3659 # CAT-CTT-HT + 5837 3 3646 3652 3660 # CAT-CTT-HT + 5838 1 3646 3651 3650 # CAT-CAO-CAM + 5839 2 3646 3651 3657 # CAT-CAO-HAT + 5840 4 3647 3646 3652 # CAO-CAT-CTT + 5841 5 3647 3646 3651 # CAO-CAT-CAO + 5842 6 3647 3648 3649 # CAO-CAM-CAP + 5843 7 3647 3648 3654 # CAO-CAM-HAT + 5844 8 3648 3647 3653 # CAM-CAO-HAT + 5845 9 3648 3649 3650 # CAM-CAP-CAM + 5846 10 3648 3649 3655 # CAM-CAP-HAT + 5847 11 3649 3648 3654 # CAP-CAM-HAT + 5848 6 3651 3650 3649 # CAO-CAM-CAP + 5849 11 3649 3650 3656 # CAP-CAM-HAT + 5850 10 3650 3649 3655 # CAM-CAP-HAT + 5851 8 3650 3651 3657 # CAM-CAO-HAT + 5852 7 3651 3650 3656 # CAO-CAM-HAT + 5853 4 3651 3646 3652 # CAO-CAT-CTT + 5854 12 3658 3652 3659 # HT-CTT-HT + 5855 12 3658 3652 3660 # HT-CTT-HT + 5856 12 3659 3652 3660 # HT-CTT-HT + 5857 1 3661 3662 3663 # CAT-CAO-CAM + 5858 2 3661 3662 3668 # CAT-CAO-HAT + 5859 3 3661 3667 3673 # CAT-CTT-HT + 5860 3 3661 3667 3674 # CAT-CTT-HT + 5861 3 3661 3667 3675 # CAT-CTT-HT + 5862 1 3661 3666 3665 # CAT-CAO-CAM + 5863 2 3661 3666 3672 # CAT-CAO-HAT + 5864 4 3662 3661 3667 # CAO-CAT-CTT + 5865 5 3662 3661 3666 # CAO-CAT-CAO + 5866 6 3662 3663 3664 # CAO-CAM-CAP + 5867 7 3662 3663 3669 # CAO-CAM-HAT + 5868 8 3663 3662 3668 # CAM-CAO-HAT + 5869 9 3663 3664 3665 # CAM-CAP-CAM + 5870 10 3663 3664 3670 # CAM-CAP-HAT + 5871 11 3664 3663 3669 # CAP-CAM-HAT + 5872 6 3666 3665 3664 # CAO-CAM-CAP + 5873 11 3664 3665 3671 # CAP-CAM-HAT + 5874 10 3665 3664 3670 # CAM-CAP-HAT + 5875 8 3665 3666 3672 # CAM-CAO-HAT + 5876 7 3666 3665 3671 # CAO-CAM-HAT + 5877 4 3666 3661 3667 # CAO-CAT-CTT + 5878 12 3673 3667 3674 # HT-CTT-HT + 5879 12 3673 3667 3675 # HT-CTT-HT + 5880 12 3674 3667 3675 # HT-CTT-HT + 5881 1 3676 3677 3678 # CAT-CAO-CAM + 5882 2 3676 3677 3683 # CAT-CAO-HAT + 5883 3 3676 3682 3688 # CAT-CTT-HT + 5884 3 3676 3682 3689 # CAT-CTT-HT + 5885 3 3676 3682 3690 # CAT-CTT-HT + 5886 1 3676 3681 3680 # CAT-CAO-CAM + 5887 2 3676 3681 3687 # CAT-CAO-HAT + 5888 4 3677 3676 3682 # CAO-CAT-CTT + 5889 5 3677 3676 3681 # CAO-CAT-CAO + 5890 6 3677 3678 3679 # CAO-CAM-CAP + 5891 7 3677 3678 3684 # CAO-CAM-HAT + 5892 8 3678 3677 3683 # CAM-CAO-HAT + 5893 9 3678 3679 3680 # CAM-CAP-CAM + 5894 10 3678 3679 3685 # CAM-CAP-HAT + 5895 11 3679 3678 3684 # CAP-CAM-HAT + 5896 6 3681 3680 3679 # CAO-CAM-CAP + 5897 11 3679 3680 3686 # CAP-CAM-HAT + 5898 10 3680 3679 3685 # CAM-CAP-HAT + 5899 8 3680 3681 3687 # CAM-CAO-HAT + 5900 7 3681 3680 3686 # CAO-CAM-HAT + 5901 4 3681 3676 3682 # CAO-CAT-CTT + 5902 12 3688 3682 3689 # HT-CTT-HT + 5903 12 3688 3682 3690 # HT-CTT-HT + 5904 12 3689 3682 3690 # HT-CTT-HT + 5905 1 3691 3692 3693 # CAT-CAO-CAM + 5906 2 3691 3692 3698 # CAT-CAO-HAT + 5907 3 3691 3697 3703 # CAT-CTT-HT + 5908 3 3691 3697 3704 # CAT-CTT-HT + 5909 3 3691 3697 3705 # CAT-CTT-HT + 5910 1 3691 3696 3695 # CAT-CAO-CAM + 5911 2 3691 3696 3702 # CAT-CAO-HAT + 5912 4 3692 3691 3697 # CAO-CAT-CTT + 5913 5 3692 3691 3696 # CAO-CAT-CAO + 5914 6 3692 3693 3694 # CAO-CAM-CAP + 5915 7 3692 3693 3699 # CAO-CAM-HAT + 5916 8 3693 3692 3698 # CAM-CAO-HAT + 5917 9 3693 3694 3695 # CAM-CAP-CAM + 5918 10 3693 3694 3700 # CAM-CAP-HAT + 5919 11 3694 3693 3699 # CAP-CAM-HAT + 5920 6 3696 3695 3694 # CAO-CAM-CAP + 5921 11 3694 3695 3701 # CAP-CAM-HAT + 5922 10 3695 3694 3700 # CAM-CAP-HAT + 5923 8 3695 3696 3702 # CAM-CAO-HAT + 5924 7 3696 3695 3701 # CAO-CAM-HAT + 5925 4 3696 3691 3697 # CAO-CAT-CTT + 5926 12 3703 3697 3704 # HT-CTT-HT + 5927 12 3703 3697 3705 # HT-CTT-HT + 5928 12 3704 3697 3705 # HT-CTT-HT + 5929 1 3706 3707 3708 # CAT-CAO-CAM + 5930 2 3706 3707 3713 # CAT-CAO-HAT + 5931 3 3706 3712 3718 # CAT-CTT-HT + 5932 3 3706 3712 3719 # CAT-CTT-HT + 5933 3 3706 3712 3720 # CAT-CTT-HT + 5934 1 3706 3711 3710 # CAT-CAO-CAM + 5935 2 3706 3711 3717 # CAT-CAO-HAT + 5936 4 3707 3706 3712 # CAO-CAT-CTT + 5937 5 3707 3706 3711 # CAO-CAT-CAO + 5938 6 3707 3708 3709 # CAO-CAM-CAP + 5939 7 3707 3708 3714 # CAO-CAM-HAT + 5940 8 3708 3707 3713 # CAM-CAO-HAT + 5941 9 3708 3709 3710 # CAM-CAP-CAM + 5942 10 3708 3709 3715 # CAM-CAP-HAT + 5943 11 3709 3708 3714 # CAP-CAM-HAT + 5944 6 3711 3710 3709 # CAO-CAM-CAP + 5945 11 3709 3710 3716 # CAP-CAM-HAT + 5946 10 3710 3709 3715 # CAM-CAP-HAT + 5947 8 3710 3711 3717 # CAM-CAO-HAT + 5948 7 3711 3710 3716 # CAO-CAM-HAT + 5949 4 3711 3706 3712 # CAO-CAT-CTT + 5950 12 3718 3712 3719 # HT-CTT-HT + 5951 12 3718 3712 3720 # HT-CTT-HT + 5952 12 3719 3712 3720 # HT-CTT-HT + 5953 1 3721 3722 3723 # CAT-CAO-CAM + 5954 2 3721 3722 3728 # CAT-CAO-HAT + 5955 3 3721 3727 3733 # CAT-CTT-HT + 5956 3 3721 3727 3734 # CAT-CTT-HT + 5957 3 3721 3727 3735 # CAT-CTT-HT + 5958 1 3721 3726 3725 # CAT-CAO-CAM + 5959 2 3721 3726 3732 # CAT-CAO-HAT + 5960 4 3722 3721 3727 # CAO-CAT-CTT + 5961 5 3722 3721 3726 # CAO-CAT-CAO + 5962 6 3722 3723 3724 # CAO-CAM-CAP + 5963 7 3722 3723 3729 # CAO-CAM-HAT + 5964 8 3723 3722 3728 # CAM-CAO-HAT + 5965 9 3723 3724 3725 # CAM-CAP-CAM + 5966 10 3723 3724 3730 # CAM-CAP-HAT + 5967 11 3724 3723 3729 # CAP-CAM-HAT + 5968 6 3726 3725 3724 # CAO-CAM-CAP + 5969 11 3724 3725 3731 # CAP-CAM-HAT + 5970 10 3725 3724 3730 # CAM-CAP-HAT + 5971 8 3725 3726 3732 # CAM-CAO-HAT + 5972 7 3726 3725 3731 # CAO-CAM-HAT + 5973 4 3726 3721 3727 # CAO-CAT-CTT + 5974 12 3733 3727 3734 # HT-CTT-HT + 5975 12 3733 3727 3735 # HT-CTT-HT + 5976 12 3734 3727 3735 # HT-CTT-HT + 5977 1 3736 3737 3738 # CAT-CAO-CAM + 5978 2 3736 3737 3743 # CAT-CAO-HAT + 5979 3 3736 3742 3748 # CAT-CTT-HT + 5980 3 3736 3742 3749 # CAT-CTT-HT + 5981 3 3736 3742 3750 # CAT-CTT-HT + 5982 1 3736 3741 3740 # CAT-CAO-CAM + 5983 2 3736 3741 3747 # CAT-CAO-HAT + 5984 4 3737 3736 3742 # CAO-CAT-CTT + 5985 5 3737 3736 3741 # CAO-CAT-CAO + 5986 6 3737 3738 3739 # CAO-CAM-CAP + 5987 7 3737 3738 3744 # CAO-CAM-HAT + 5988 8 3738 3737 3743 # CAM-CAO-HAT + 5989 9 3738 3739 3740 # CAM-CAP-CAM + 5990 10 3738 3739 3745 # CAM-CAP-HAT + 5991 11 3739 3738 3744 # CAP-CAM-HAT + 5992 6 3741 3740 3739 # CAO-CAM-CAP + 5993 11 3739 3740 3746 # CAP-CAM-HAT + 5994 10 3740 3739 3745 # CAM-CAP-HAT + 5995 8 3740 3741 3747 # CAM-CAO-HAT + 5996 7 3741 3740 3746 # CAO-CAM-HAT + 5997 4 3741 3736 3742 # CAO-CAT-CTT + 5998 12 3748 3742 3749 # HT-CTT-HT + 5999 12 3748 3742 3750 # HT-CTT-HT + 6000 12 3749 3742 3750 # HT-CTT-HT + +Dihedrals + + 1 1 1 2 3 4 # CAT-CAO-CAM-CAP + 2 2 1 2 3 9 # CAT-CAO-CAM-HAT + 3 1 1 6 5 4 # CAT-CAO-CAM-CAP + 4 2 1 6 5 11 # CAT-CAO-CAM-HAT + 5 3 2 1 6 5 # CAO-CAT-CAO-CAM + 6 4 2 1 6 12 # CAO-CAT-CAO-HAT + 7 5 2 3 4 5 # CAO-CAM-CAP-CAM + 8 6 2 3 4 10 # CAO-CAM-CAP-HAT + 9 7 7 1 2 3 # CTT-CAT-CAO-CAM + 10 3 6 1 2 3 # CAO-CAT-CAO-CAM + 11 5 6 5 4 3 # CAO-CAM-CAP-CAM + 12 8 3 4 5 11 # CAM-CAP-CAM-HAT + 13 9 4 3 2 8 # CAP-CAM-CAO-HAT + 14 9 4 5 6 12 # CAP-CAM-CAO-HAT + 15 8 5 4 3 9 # CAM-CAP-CAM-HAT + 16 7 7 1 6 5 # CTT-CAT-CAO-CAM + 17 6 6 5 4 10 # CAO-CAM-CAP-HAT + 18 4 6 1 2 8 # CAO-CAT-CAO-HAT + 19 10 7 1 2 8 # CTT-CAT-CAO-HAT + 20 10 7 1 6 12 # CTT-CAT-CAO-HAT + 21 11 8 2 3 9 # HAT-CAO-CAM-HAT + 22 12 9 3 4 10 # HAT-CAM-CAP-HAT + 23 12 11 5 4 10 # HAT-CAM-CAP-HAT + 24 11 12 6 5 11 # HAT-CAO-CAM-HAT + 25 1 16 17 18 19 # CAT-CAO-CAM-CAP + 26 2 16 17 18 24 # CAT-CAO-CAM-HAT + 27 1 16 21 20 19 # CAT-CAO-CAM-CAP + 28 2 16 21 20 26 # CAT-CAO-CAM-HAT + 29 3 17 16 21 20 # CAO-CAT-CAO-CAM + 30 4 17 16 21 27 # CAO-CAT-CAO-HAT + 31 5 17 18 19 20 # CAO-CAM-CAP-CAM + 32 6 17 18 19 25 # CAO-CAM-CAP-HAT + 33 7 22 16 17 18 # CTT-CAT-CAO-CAM + 34 3 21 16 17 18 # CAO-CAT-CAO-CAM + 35 5 21 20 19 18 # CAO-CAM-CAP-CAM + 36 8 18 19 20 26 # CAM-CAP-CAM-HAT + 37 9 19 18 17 23 # CAP-CAM-CAO-HAT + 38 9 19 20 21 27 # CAP-CAM-CAO-HAT + 39 8 20 19 18 24 # CAM-CAP-CAM-HAT + 40 7 22 16 21 20 # CTT-CAT-CAO-CAM + 41 6 21 20 19 25 # CAO-CAM-CAP-HAT + 42 4 21 16 17 23 # CAO-CAT-CAO-HAT + 43 10 22 16 17 23 # CTT-CAT-CAO-HAT + 44 10 22 16 21 27 # CTT-CAT-CAO-HAT + 45 11 23 17 18 24 # HAT-CAO-CAM-HAT + 46 12 24 18 19 25 # HAT-CAM-CAP-HAT + 47 12 26 20 19 25 # HAT-CAM-CAP-HAT + 48 11 27 21 20 26 # HAT-CAO-CAM-HAT + 49 1 31 32 33 34 # CAT-CAO-CAM-CAP + 50 2 31 32 33 39 # CAT-CAO-CAM-HAT + 51 1 31 36 35 34 # CAT-CAO-CAM-CAP + 52 2 31 36 35 41 # CAT-CAO-CAM-HAT + 53 3 32 31 36 35 # CAO-CAT-CAO-CAM + 54 4 32 31 36 42 # CAO-CAT-CAO-HAT + 55 5 32 33 34 35 # CAO-CAM-CAP-CAM + 56 6 32 33 34 40 # CAO-CAM-CAP-HAT + 57 7 37 31 32 33 # CTT-CAT-CAO-CAM + 58 3 36 31 32 33 # CAO-CAT-CAO-CAM + 59 5 36 35 34 33 # CAO-CAM-CAP-CAM + 60 8 33 34 35 41 # CAM-CAP-CAM-HAT + 61 9 34 33 32 38 # CAP-CAM-CAO-HAT + 62 9 34 35 36 42 # CAP-CAM-CAO-HAT + 63 8 35 34 33 39 # CAM-CAP-CAM-HAT + 64 7 37 31 36 35 # CTT-CAT-CAO-CAM + 65 6 36 35 34 40 # CAO-CAM-CAP-HAT + 66 4 36 31 32 38 # CAO-CAT-CAO-HAT + 67 10 37 31 32 38 # CTT-CAT-CAO-HAT + 68 10 37 31 36 42 # CTT-CAT-CAO-HAT + 69 11 38 32 33 39 # HAT-CAO-CAM-HAT + 70 12 39 33 34 40 # HAT-CAM-CAP-HAT + 71 12 41 35 34 40 # HAT-CAM-CAP-HAT + 72 11 42 36 35 41 # HAT-CAO-CAM-HAT + 73 1 46 47 48 49 # CAT-CAO-CAM-CAP + 74 2 46 47 48 54 # CAT-CAO-CAM-HAT + 75 1 46 51 50 49 # CAT-CAO-CAM-CAP + 76 2 46 51 50 56 # CAT-CAO-CAM-HAT + 77 3 47 46 51 50 # CAO-CAT-CAO-CAM + 78 4 47 46 51 57 # CAO-CAT-CAO-HAT + 79 5 47 48 49 50 # CAO-CAM-CAP-CAM + 80 6 47 48 49 55 # CAO-CAM-CAP-HAT + 81 7 52 46 47 48 # CTT-CAT-CAO-CAM + 82 3 51 46 47 48 # CAO-CAT-CAO-CAM + 83 5 51 50 49 48 # CAO-CAM-CAP-CAM + 84 8 48 49 50 56 # CAM-CAP-CAM-HAT + 85 9 49 48 47 53 # CAP-CAM-CAO-HAT + 86 9 49 50 51 57 # CAP-CAM-CAO-HAT + 87 8 50 49 48 54 # CAM-CAP-CAM-HAT + 88 7 52 46 51 50 # CTT-CAT-CAO-CAM + 89 6 51 50 49 55 # CAO-CAM-CAP-HAT + 90 4 51 46 47 53 # CAO-CAT-CAO-HAT + 91 10 52 46 47 53 # CTT-CAT-CAO-HAT + 92 10 52 46 51 57 # CTT-CAT-CAO-HAT + 93 11 53 47 48 54 # HAT-CAO-CAM-HAT + 94 12 54 48 49 55 # HAT-CAM-CAP-HAT + 95 12 56 50 49 55 # HAT-CAM-CAP-HAT + 96 11 57 51 50 56 # HAT-CAO-CAM-HAT + 97 1 61 62 63 64 # CAT-CAO-CAM-CAP + 98 2 61 62 63 69 # CAT-CAO-CAM-HAT + 99 1 61 66 65 64 # CAT-CAO-CAM-CAP + 100 2 61 66 65 71 # CAT-CAO-CAM-HAT + 101 3 62 61 66 65 # CAO-CAT-CAO-CAM + 102 4 62 61 66 72 # CAO-CAT-CAO-HAT + 103 5 62 63 64 65 # CAO-CAM-CAP-CAM + 104 6 62 63 64 70 # CAO-CAM-CAP-HAT + 105 7 67 61 62 63 # CTT-CAT-CAO-CAM + 106 3 66 61 62 63 # CAO-CAT-CAO-CAM + 107 5 66 65 64 63 # CAO-CAM-CAP-CAM + 108 8 63 64 65 71 # CAM-CAP-CAM-HAT + 109 9 64 63 62 68 # CAP-CAM-CAO-HAT + 110 9 64 65 66 72 # CAP-CAM-CAO-HAT + 111 8 65 64 63 69 # CAM-CAP-CAM-HAT + 112 7 67 61 66 65 # CTT-CAT-CAO-CAM + 113 6 66 65 64 70 # CAO-CAM-CAP-HAT + 114 4 66 61 62 68 # CAO-CAT-CAO-HAT + 115 10 67 61 62 68 # CTT-CAT-CAO-HAT + 116 10 67 61 66 72 # CTT-CAT-CAO-HAT + 117 11 68 62 63 69 # HAT-CAO-CAM-HAT + 118 12 69 63 64 70 # HAT-CAM-CAP-HAT + 119 12 71 65 64 70 # HAT-CAM-CAP-HAT + 120 11 72 66 65 71 # HAT-CAO-CAM-HAT + 121 1 76 77 78 79 # CAT-CAO-CAM-CAP + 122 2 76 77 78 84 # CAT-CAO-CAM-HAT + 123 1 76 81 80 79 # CAT-CAO-CAM-CAP + 124 2 76 81 80 86 # CAT-CAO-CAM-HAT + 125 3 77 76 81 80 # CAO-CAT-CAO-CAM + 126 4 77 76 81 87 # CAO-CAT-CAO-HAT + 127 5 77 78 79 80 # CAO-CAM-CAP-CAM + 128 6 77 78 79 85 # CAO-CAM-CAP-HAT + 129 7 82 76 77 78 # CTT-CAT-CAO-CAM + 130 3 81 76 77 78 # CAO-CAT-CAO-CAM + 131 5 81 80 79 78 # CAO-CAM-CAP-CAM + 132 8 78 79 80 86 # CAM-CAP-CAM-HAT + 133 9 79 78 77 83 # CAP-CAM-CAO-HAT + 134 9 79 80 81 87 # CAP-CAM-CAO-HAT + 135 8 80 79 78 84 # CAM-CAP-CAM-HAT + 136 7 82 76 81 80 # CTT-CAT-CAO-CAM + 137 6 81 80 79 85 # CAO-CAM-CAP-HAT + 138 4 81 76 77 83 # CAO-CAT-CAO-HAT + 139 10 82 76 77 83 # CTT-CAT-CAO-HAT + 140 10 82 76 81 87 # CTT-CAT-CAO-HAT + 141 11 83 77 78 84 # HAT-CAO-CAM-HAT + 142 12 84 78 79 85 # HAT-CAM-CAP-HAT + 143 12 86 80 79 85 # HAT-CAM-CAP-HAT + 144 11 87 81 80 86 # HAT-CAO-CAM-HAT + 145 1 91 92 93 94 # CAT-CAO-CAM-CAP + 146 2 91 92 93 99 # CAT-CAO-CAM-HAT + 147 1 91 96 95 94 # CAT-CAO-CAM-CAP + 148 2 91 96 95 101 # CAT-CAO-CAM-HAT + 149 3 92 91 96 95 # CAO-CAT-CAO-CAM + 150 4 92 91 96 102 # CAO-CAT-CAO-HAT + 151 5 92 93 94 95 # CAO-CAM-CAP-CAM + 152 6 92 93 94 100 # CAO-CAM-CAP-HAT + 153 7 97 91 92 93 # CTT-CAT-CAO-CAM + 154 3 96 91 92 93 # CAO-CAT-CAO-CAM + 155 5 96 95 94 93 # CAO-CAM-CAP-CAM + 156 8 93 94 95 101 # CAM-CAP-CAM-HAT + 157 9 94 93 92 98 # CAP-CAM-CAO-HAT + 158 9 94 95 96 102 # CAP-CAM-CAO-HAT + 159 8 95 94 93 99 # CAM-CAP-CAM-HAT + 160 7 97 91 96 95 # CTT-CAT-CAO-CAM + 161 6 96 95 94 100 # CAO-CAM-CAP-HAT + 162 4 96 91 92 98 # CAO-CAT-CAO-HAT + 163 10 97 91 92 98 # CTT-CAT-CAO-HAT + 164 10 97 91 96 102 # CTT-CAT-CAO-HAT + 165 11 98 92 93 99 # HAT-CAO-CAM-HAT + 166 12 99 93 94 100 # HAT-CAM-CAP-HAT + 167 12 101 95 94 100 # HAT-CAM-CAP-HAT + 168 11 102 96 95 101 # HAT-CAO-CAM-HAT + 169 1 106 107 108 109 # CAT-CAO-CAM-CAP + 170 2 106 107 108 114 # CAT-CAO-CAM-HAT + 171 1 106 111 110 109 # CAT-CAO-CAM-CAP + 172 2 106 111 110 116 # CAT-CAO-CAM-HAT + 173 3 107 106 111 110 # CAO-CAT-CAO-CAM + 174 4 107 106 111 117 # CAO-CAT-CAO-HAT + 175 5 107 108 109 110 # CAO-CAM-CAP-CAM + 176 6 107 108 109 115 # CAO-CAM-CAP-HAT + 177 7 112 106 107 108 # CTT-CAT-CAO-CAM + 178 3 111 106 107 108 # CAO-CAT-CAO-CAM + 179 5 111 110 109 108 # CAO-CAM-CAP-CAM + 180 8 108 109 110 116 # CAM-CAP-CAM-HAT + 181 9 109 108 107 113 # CAP-CAM-CAO-HAT + 182 9 109 110 111 117 # CAP-CAM-CAO-HAT + 183 8 110 109 108 114 # CAM-CAP-CAM-HAT + 184 7 112 106 111 110 # CTT-CAT-CAO-CAM + 185 6 111 110 109 115 # CAO-CAM-CAP-HAT + 186 4 111 106 107 113 # CAO-CAT-CAO-HAT + 187 10 112 106 107 113 # CTT-CAT-CAO-HAT + 188 10 112 106 111 117 # CTT-CAT-CAO-HAT + 189 11 113 107 108 114 # HAT-CAO-CAM-HAT + 190 12 114 108 109 115 # HAT-CAM-CAP-HAT + 191 12 116 110 109 115 # HAT-CAM-CAP-HAT + 192 11 117 111 110 116 # HAT-CAO-CAM-HAT + 193 1 121 122 123 124 # CAT-CAO-CAM-CAP + 194 2 121 122 123 129 # CAT-CAO-CAM-HAT + 195 1 121 126 125 124 # CAT-CAO-CAM-CAP + 196 2 121 126 125 131 # CAT-CAO-CAM-HAT + 197 3 122 121 126 125 # CAO-CAT-CAO-CAM + 198 4 122 121 126 132 # CAO-CAT-CAO-HAT + 199 5 122 123 124 125 # CAO-CAM-CAP-CAM + 200 6 122 123 124 130 # CAO-CAM-CAP-HAT + 201 7 127 121 122 123 # CTT-CAT-CAO-CAM + 202 3 126 121 122 123 # CAO-CAT-CAO-CAM + 203 5 126 125 124 123 # CAO-CAM-CAP-CAM + 204 8 123 124 125 131 # CAM-CAP-CAM-HAT + 205 9 124 123 122 128 # CAP-CAM-CAO-HAT + 206 9 124 125 126 132 # CAP-CAM-CAO-HAT + 207 8 125 124 123 129 # CAM-CAP-CAM-HAT + 208 7 127 121 126 125 # CTT-CAT-CAO-CAM + 209 6 126 125 124 130 # CAO-CAM-CAP-HAT + 210 4 126 121 122 128 # CAO-CAT-CAO-HAT + 211 10 127 121 122 128 # CTT-CAT-CAO-HAT + 212 10 127 121 126 132 # CTT-CAT-CAO-HAT + 213 11 128 122 123 129 # HAT-CAO-CAM-HAT + 214 12 129 123 124 130 # HAT-CAM-CAP-HAT + 215 12 131 125 124 130 # HAT-CAM-CAP-HAT + 216 11 132 126 125 131 # HAT-CAO-CAM-HAT + 217 1 136 137 138 139 # CAT-CAO-CAM-CAP + 218 2 136 137 138 144 # CAT-CAO-CAM-HAT + 219 1 136 141 140 139 # CAT-CAO-CAM-CAP + 220 2 136 141 140 146 # CAT-CAO-CAM-HAT + 221 3 137 136 141 140 # CAO-CAT-CAO-CAM + 222 4 137 136 141 147 # CAO-CAT-CAO-HAT + 223 5 137 138 139 140 # CAO-CAM-CAP-CAM + 224 6 137 138 139 145 # CAO-CAM-CAP-HAT + 225 7 142 136 137 138 # CTT-CAT-CAO-CAM + 226 3 141 136 137 138 # CAO-CAT-CAO-CAM + 227 5 141 140 139 138 # CAO-CAM-CAP-CAM + 228 8 138 139 140 146 # CAM-CAP-CAM-HAT + 229 9 139 138 137 143 # CAP-CAM-CAO-HAT + 230 9 139 140 141 147 # CAP-CAM-CAO-HAT + 231 8 140 139 138 144 # CAM-CAP-CAM-HAT + 232 7 142 136 141 140 # CTT-CAT-CAO-CAM + 233 6 141 140 139 145 # CAO-CAM-CAP-HAT + 234 4 141 136 137 143 # CAO-CAT-CAO-HAT + 235 10 142 136 137 143 # CTT-CAT-CAO-HAT + 236 10 142 136 141 147 # CTT-CAT-CAO-HAT + 237 11 143 137 138 144 # HAT-CAO-CAM-HAT + 238 12 144 138 139 145 # HAT-CAM-CAP-HAT + 239 12 146 140 139 145 # HAT-CAM-CAP-HAT + 240 11 147 141 140 146 # HAT-CAO-CAM-HAT + 241 1 151 152 153 154 # CAT-CAO-CAM-CAP + 242 2 151 152 153 159 # CAT-CAO-CAM-HAT + 243 1 151 156 155 154 # CAT-CAO-CAM-CAP + 244 2 151 156 155 161 # CAT-CAO-CAM-HAT + 245 3 152 151 156 155 # CAO-CAT-CAO-CAM + 246 4 152 151 156 162 # CAO-CAT-CAO-HAT + 247 5 152 153 154 155 # CAO-CAM-CAP-CAM + 248 6 152 153 154 160 # CAO-CAM-CAP-HAT + 249 7 157 151 152 153 # CTT-CAT-CAO-CAM + 250 3 156 151 152 153 # CAO-CAT-CAO-CAM + 251 5 156 155 154 153 # CAO-CAM-CAP-CAM + 252 8 153 154 155 161 # CAM-CAP-CAM-HAT + 253 9 154 153 152 158 # CAP-CAM-CAO-HAT + 254 9 154 155 156 162 # CAP-CAM-CAO-HAT + 255 8 155 154 153 159 # CAM-CAP-CAM-HAT + 256 7 157 151 156 155 # CTT-CAT-CAO-CAM + 257 6 156 155 154 160 # CAO-CAM-CAP-HAT + 258 4 156 151 152 158 # CAO-CAT-CAO-HAT + 259 10 157 151 152 158 # CTT-CAT-CAO-HAT + 260 10 157 151 156 162 # CTT-CAT-CAO-HAT + 261 11 158 152 153 159 # HAT-CAO-CAM-HAT + 262 12 159 153 154 160 # HAT-CAM-CAP-HAT + 263 12 161 155 154 160 # HAT-CAM-CAP-HAT + 264 11 162 156 155 161 # HAT-CAO-CAM-HAT + 265 1 166 167 168 169 # CAT-CAO-CAM-CAP + 266 2 166 167 168 174 # CAT-CAO-CAM-HAT + 267 1 166 171 170 169 # CAT-CAO-CAM-CAP + 268 2 166 171 170 176 # CAT-CAO-CAM-HAT + 269 3 167 166 171 170 # CAO-CAT-CAO-CAM + 270 4 167 166 171 177 # CAO-CAT-CAO-HAT + 271 5 167 168 169 170 # CAO-CAM-CAP-CAM + 272 6 167 168 169 175 # CAO-CAM-CAP-HAT + 273 7 172 166 167 168 # CTT-CAT-CAO-CAM + 274 3 171 166 167 168 # CAO-CAT-CAO-CAM + 275 5 171 170 169 168 # CAO-CAM-CAP-CAM + 276 8 168 169 170 176 # CAM-CAP-CAM-HAT + 277 9 169 168 167 173 # CAP-CAM-CAO-HAT + 278 9 169 170 171 177 # CAP-CAM-CAO-HAT + 279 8 170 169 168 174 # CAM-CAP-CAM-HAT + 280 7 172 166 171 170 # CTT-CAT-CAO-CAM + 281 6 171 170 169 175 # CAO-CAM-CAP-HAT + 282 4 171 166 167 173 # CAO-CAT-CAO-HAT + 283 10 172 166 167 173 # CTT-CAT-CAO-HAT + 284 10 172 166 171 177 # CTT-CAT-CAO-HAT + 285 11 173 167 168 174 # HAT-CAO-CAM-HAT + 286 12 174 168 169 175 # HAT-CAM-CAP-HAT + 287 12 176 170 169 175 # HAT-CAM-CAP-HAT + 288 11 177 171 170 176 # HAT-CAO-CAM-HAT + 289 1 181 182 183 184 # CAT-CAO-CAM-CAP + 290 2 181 182 183 189 # CAT-CAO-CAM-HAT + 291 1 181 186 185 184 # CAT-CAO-CAM-CAP + 292 2 181 186 185 191 # CAT-CAO-CAM-HAT + 293 3 182 181 186 185 # CAO-CAT-CAO-CAM + 294 4 182 181 186 192 # CAO-CAT-CAO-HAT + 295 5 182 183 184 185 # CAO-CAM-CAP-CAM + 296 6 182 183 184 190 # CAO-CAM-CAP-HAT + 297 7 187 181 182 183 # CTT-CAT-CAO-CAM + 298 3 186 181 182 183 # CAO-CAT-CAO-CAM + 299 5 186 185 184 183 # CAO-CAM-CAP-CAM + 300 8 183 184 185 191 # CAM-CAP-CAM-HAT + 301 9 184 183 182 188 # CAP-CAM-CAO-HAT + 302 9 184 185 186 192 # CAP-CAM-CAO-HAT + 303 8 185 184 183 189 # CAM-CAP-CAM-HAT + 304 7 187 181 186 185 # CTT-CAT-CAO-CAM + 305 6 186 185 184 190 # CAO-CAM-CAP-HAT + 306 4 186 181 182 188 # CAO-CAT-CAO-HAT + 307 10 187 181 182 188 # CTT-CAT-CAO-HAT + 308 10 187 181 186 192 # CTT-CAT-CAO-HAT + 309 11 188 182 183 189 # HAT-CAO-CAM-HAT + 310 12 189 183 184 190 # HAT-CAM-CAP-HAT + 311 12 191 185 184 190 # HAT-CAM-CAP-HAT + 312 11 192 186 185 191 # HAT-CAO-CAM-HAT + 313 1 196 197 198 199 # CAT-CAO-CAM-CAP + 314 2 196 197 198 204 # CAT-CAO-CAM-HAT + 315 1 196 201 200 199 # CAT-CAO-CAM-CAP + 316 2 196 201 200 206 # CAT-CAO-CAM-HAT + 317 3 197 196 201 200 # CAO-CAT-CAO-CAM + 318 4 197 196 201 207 # CAO-CAT-CAO-HAT + 319 5 197 198 199 200 # CAO-CAM-CAP-CAM + 320 6 197 198 199 205 # CAO-CAM-CAP-HAT + 321 7 202 196 197 198 # CTT-CAT-CAO-CAM + 322 3 201 196 197 198 # CAO-CAT-CAO-CAM + 323 5 201 200 199 198 # CAO-CAM-CAP-CAM + 324 8 198 199 200 206 # CAM-CAP-CAM-HAT + 325 9 199 198 197 203 # CAP-CAM-CAO-HAT + 326 9 199 200 201 207 # CAP-CAM-CAO-HAT + 327 8 200 199 198 204 # CAM-CAP-CAM-HAT + 328 7 202 196 201 200 # CTT-CAT-CAO-CAM + 329 6 201 200 199 205 # CAO-CAM-CAP-HAT + 330 4 201 196 197 203 # CAO-CAT-CAO-HAT + 331 10 202 196 197 203 # CTT-CAT-CAO-HAT + 332 10 202 196 201 207 # CTT-CAT-CAO-HAT + 333 11 203 197 198 204 # HAT-CAO-CAM-HAT + 334 12 204 198 199 205 # HAT-CAM-CAP-HAT + 335 12 206 200 199 205 # HAT-CAM-CAP-HAT + 336 11 207 201 200 206 # HAT-CAO-CAM-HAT + 337 1 211 212 213 214 # CAT-CAO-CAM-CAP + 338 2 211 212 213 219 # CAT-CAO-CAM-HAT + 339 1 211 216 215 214 # CAT-CAO-CAM-CAP + 340 2 211 216 215 221 # CAT-CAO-CAM-HAT + 341 3 212 211 216 215 # CAO-CAT-CAO-CAM + 342 4 212 211 216 222 # CAO-CAT-CAO-HAT + 343 5 212 213 214 215 # CAO-CAM-CAP-CAM + 344 6 212 213 214 220 # CAO-CAM-CAP-HAT + 345 7 217 211 212 213 # CTT-CAT-CAO-CAM + 346 3 216 211 212 213 # CAO-CAT-CAO-CAM + 347 5 216 215 214 213 # CAO-CAM-CAP-CAM + 348 8 213 214 215 221 # CAM-CAP-CAM-HAT + 349 9 214 213 212 218 # CAP-CAM-CAO-HAT + 350 9 214 215 216 222 # CAP-CAM-CAO-HAT + 351 8 215 214 213 219 # CAM-CAP-CAM-HAT + 352 7 217 211 216 215 # CTT-CAT-CAO-CAM + 353 6 216 215 214 220 # CAO-CAM-CAP-HAT + 354 4 216 211 212 218 # CAO-CAT-CAO-HAT + 355 10 217 211 212 218 # CTT-CAT-CAO-HAT + 356 10 217 211 216 222 # CTT-CAT-CAO-HAT + 357 11 218 212 213 219 # HAT-CAO-CAM-HAT + 358 12 219 213 214 220 # HAT-CAM-CAP-HAT + 359 12 221 215 214 220 # HAT-CAM-CAP-HAT + 360 11 222 216 215 221 # HAT-CAO-CAM-HAT + 361 1 226 227 228 229 # CAT-CAO-CAM-CAP + 362 2 226 227 228 234 # CAT-CAO-CAM-HAT + 363 1 226 231 230 229 # CAT-CAO-CAM-CAP + 364 2 226 231 230 236 # CAT-CAO-CAM-HAT + 365 3 227 226 231 230 # CAO-CAT-CAO-CAM + 366 4 227 226 231 237 # CAO-CAT-CAO-HAT + 367 5 227 228 229 230 # CAO-CAM-CAP-CAM + 368 6 227 228 229 235 # CAO-CAM-CAP-HAT + 369 7 232 226 227 228 # CTT-CAT-CAO-CAM + 370 3 231 226 227 228 # CAO-CAT-CAO-CAM + 371 5 231 230 229 228 # CAO-CAM-CAP-CAM + 372 8 228 229 230 236 # CAM-CAP-CAM-HAT + 373 9 229 228 227 233 # CAP-CAM-CAO-HAT + 374 9 229 230 231 237 # CAP-CAM-CAO-HAT + 375 8 230 229 228 234 # CAM-CAP-CAM-HAT + 376 7 232 226 231 230 # CTT-CAT-CAO-CAM + 377 6 231 230 229 235 # CAO-CAM-CAP-HAT + 378 4 231 226 227 233 # CAO-CAT-CAO-HAT + 379 10 232 226 227 233 # CTT-CAT-CAO-HAT + 380 10 232 226 231 237 # CTT-CAT-CAO-HAT + 381 11 233 227 228 234 # HAT-CAO-CAM-HAT + 382 12 234 228 229 235 # HAT-CAM-CAP-HAT + 383 12 236 230 229 235 # HAT-CAM-CAP-HAT + 384 11 237 231 230 236 # HAT-CAO-CAM-HAT + 385 1 241 242 243 244 # CAT-CAO-CAM-CAP + 386 2 241 242 243 249 # CAT-CAO-CAM-HAT + 387 1 241 246 245 244 # CAT-CAO-CAM-CAP + 388 2 241 246 245 251 # CAT-CAO-CAM-HAT + 389 3 242 241 246 245 # CAO-CAT-CAO-CAM + 390 4 242 241 246 252 # CAO-CAT-CAO-HAT + 391 5 242 243 244 245 # CAO-CAM-CAP-CAM + 392 6 242 243 244 250 # CAO-CAM-CAP-HAT + 393 7 247 241 242 243 # CTT-CAT-CAO-CAM + 394 3 246 241 242 243 # CAO-CAT-CAO-CAM + 395 5 246 245 244 243 # CAO-CAM-CAP-CAM + 396 8 243 244 245 251 # CAM-CAP-CAM-HAT + 397 9 244 243 242 248 # CAP-CAM-CAO-HAT + 398 9 244 245 246 252 # CAP-CAM-CAO-HAT + 399 8 245 244 243 249 # CAM-CAP-CAM-HAT + 400 7 247 241 246 245 # CTT-CAT-CAO-CAM + 401 6 246 245 244 250 # CAO-CAM-CAP-HAT + 402 4 246 241 242 248 # CAO-CAT-CAO-HAT + 403 10 247 241 242 248 # CTT-CAT-CAO-HAT + 404 10 247 241 246 252 # CTT-CAT-CAO-HAT + 405 11 248 242 243 249 # HAT-CAO-CAM-HAT + 406 12 249 243 244 250 # HAT-CAM-CAP-HAT + 407 12 251 245 244 250 # HAT-CAM-CAP-HAT + 408 11 252 246 245 251 # HAT-CAO-CAM-HAT + 409 1 256 257 258 259 # CAT-CAO-CAM-CAP + 410 2 256 257 258 264 # CAT-CAO-CAM-HAT + 411 1 256 261 260 259 # CAT-CAO-CAM-CAP + 412 2 256 261 260 266 # CAT-CAO-CAM-HAT + 413 3 257 256 261 260 # CAO-CAT-CAO-CAM + 414 4 257 256 261 267 # CAO-CAT-CAO-HAT + 415 5 257 258 259 260 # CAO-CAM-CAP-CAM + 416 6 257 258 259 265 # CAO-CAM-CAP-HAT + 417 7 262 256 257 258 # CTT-CAT-CAO-CAM + 418 3 261 256 257 258 # CAO-CAT-CAO-CAM + 419 5 261 260 259 258 # CAO-CAM-CAP-CAM + 420 8 258 259 260 266 # CAM-CAP-CAM-HAT + 421 9 259 258 257 263 # CAP-CAM-CAO-HAT + 422 9 259 260 261 267 # CAP-CAM-CAO-HAT + 423 8 260 259 258 264 # CAM-CAP-CAM-HAT + 424 7 262 256 261 260 # CTT-CAT-CAO-CAM + 425 6 261 260 259 265 # CAO-CAM-CAP-HAT + 426 4 261 256 257 263 # CAO-CAT-CAO-HAT + 427 10 262 256 257 263 # CTT-CAT-CAO-HAT + 428 10 262 256 261 267 # CTT-CAT-CAO-HAT + 429 11 263 257 258 264 # HAT-CAO-CAM-HAT + 430 12 264 258 259 265 # HAT-CAM-CAP-HAT + 431 12 266 260 259 265 # HAT-CAM-CAP-HAT + 432 11 267 261 260 266 # HAT-CAO-CAM-HAT + 433 1 271 272 273 274 # CAT-CAO-CAM-CAP + 434 2 271 272 273 279 # CAT-CAO-CAM-HAT + 435 1 271 276 275 274 # CAT-CAO-CAM-CAP + 436 2 271 276 275 281 # CAT-CAO-CAM-HAT + 437 3 272 271 276 275 # CAO-CAT-CAO-CAM + 438 4 272 271 276 282 # CAO-CAT-CAO-HAT + 439 5 272 273 274 275 # CAO-CAM-CAP-CAM + 440 6 272 273 274 280 # CAO-CAM-CAP-HAT + 441 7 277 271 272 273 # CTT-CAT-CAO-CAM + 442 3 276 271 272 273 # CAO-CAT-CAO-CAM + 443 5 276 275 274 273 # CAO-CAM-CAP-CAM + 444 8 273 274 275 281 # CAM-CAP-CAM-HAT + 445 9 274 273 272 278 # CAP-CAM-CAO-HAT + 446 9 274 275 276 282 # CAP-CAM-CAO-HAT + 447 8 275 274 273 279 # CAM-CAP-CAM-HAT + 448 7 277 271 276 275 # CTT-CAT-CAO-CAM + 449 6 276 275 274 280 # CAO-CAM-CAP-HAT + 450 4 276 271 272 278 # CAO-CAT-CAO-HAT + 451 10 277 271 272 278 # CTT-CAT-CAO-HAT + 452 10 277 271 276 282 # CTT-CAT-CAO-HAT + 453 11 278 272 273 279 # HAT-CAO-CAM-HAT + 454 12 279 273 274 280 # HAT-CAM-CAP-HAT + 455 12 281 275 274 280 # HAT-CAM-CAP-HAT + 456 11 282 276 275 281 # HAT-CAO-CAM-HAT + 457 1 286 287 288 289 # CAT-CAO-CAM-CAP + 458 2 286 287 288 294 # CAT-CAO-CAM-HAT + 459 1 286 291 290 289 # CAT-CAO-CAM-CAP + 460 2 286 291 290 296 # CAT-CAO-CAM-HAT + 461 3 287 286 291 290 # CAO-CAT-CAO-CAM + 462 4 287 286 291 297 # CAO-CAT-CAO-HAT + 463 5 287 288 289 290 # CAO-CAM-CAP-CAM + 464 6 287 288 289 295 # CAO-CAM-CAP-HAT + 465 7 292 286 287 288 # CTT-CAT-CAO-CAM + 466 3 291 286 287 288 # CAO-CAT-CAO-CAM + 467 5 291 290 289 288 # CAO-CAM-CAP-CAM + 468 8 288 289 290 296 # CAM-CAP-CAM-HAT + 469 9 289 288 287 293 # CAP-CAM-CAO-HAT + 470 9 289 290 291 297 # CAP-CAM-CAO-HAT + 471 8 290 289 288 294 # CAM-CAP-CAM-HAT + 472 7 292 286 291 290 # CTT-CAT-CAO-CAM + 473 6 291 290 289 295 # CAO-CAM-CAP-HAT + 474 4 291 286 287 293 # CAO-CAT-CAO-HAT + 475 10 292 286 287 293 # CTT-CAT-CAO-HAT + 476 10 292 286 291 297 # CTT-CAT-CAO-HAT + 477 11 293 287 288 294 # HAT-CAO-CAM-HAT + 478 12 294 288 289 295 # HAT-CAM-CAP-HAT + 479 12 296 290 289 295 # HAT-CAM-CAP-HAT + 480 11 297 291 290 296 # HAT-CAO-CAM-HAT + 481 1 301 302 303 304 # CAT-CAO-CAM-CAP + 482 2 301 302 303 309 # CAT-CAO-CAM-HAT + 483 1 301 306 305 304 # CAT-CAO-CAM-CAP + 484 2 301 306 305 311 # CAT-CAO-CAM-HAT + 485 3 302 301 306 305 # CAO-CAT-CAO-CAM + 486 4 302 301 306 312 # CAO-CAT-CAO-HAT + 487 5 302 303 304 305 # CAO-CAM-CAP-CAM + 488 6 302 303 304 310 # CAO-CAM-CAP-HAT + 489 7 307 301 302 303 # CTT-CAT-CAO-CAM + 490 3 306 301 302 303 # CAO-CAT-CAO-CAM + 491 5 306 305 304 303 # CAO-CAM-CAP-CAM + 492 8 303 304 305 311 # CAM-CAP-CAM-HAT + 493 9 304 303 302 308 # CAP-CAM-CAO-HAT + 494 9 304 305 306 312 # CAP-CAM-CAO-HAT + 495 8 305 304 303 309 # CAM-CAP-CAM-HAT + 496 7 307 301 306 305 # CTT-CAT-CAO-CAM + 497 6 306 305 304 310 # CAO-CAM-CAP-HAT + 498 4 306 301 302 308 # CAO-CAT-CAO-HAT + 499 10 307 301 302 308 # CTT-CAT-CAO-HAT + 500 10 307 301 306 312 # CTT-CAT-CAO-HAT + 501 11 308 302 303 309 # HAT-CAO-CAM-HAT + 502 12 309 303 304 310 # HAT-CAM-CAP-HAT + 503 12 311 305 304 310 # HAT-CAM-CAP-HAT + 504 11 312 306 305 311 # HAT-CAO-CAM-HAT + 505 1 316 317 318 319 # CAT-CAO-CAM-CAP + 506 2 316 317 318 324 # CAT-CAO-CAM-HAT + 507 1 316 321 320 319 # CAT-CAO-CAM-CAP + 508 2 316 321 320 326 # CAT-CAO-CAM-HAT + 509 3 317 316 321 320 # CAO-CAT-CAO-CAM + 510 4 317 316 321 327 # CAO-CAT-CAO-HAT + 511 5 317 318 319 320 # CAO-CAM-CAP-CAM + 512 6 317 318 319 325 # CAO-CAM-CAP-HAT + 513 7 322 316 317 318 # CTT-CAT-CAO-CAM + 514 3 321 316 317 318 # CAO-CAT-CAO-CAM + 515 5 321 320 319 318 # CAO-CAM-CAP-CAM + 516 8 318 319 320 326 # CAM-CAP-CAM-HAT + 517 9 319 318 317 323 # CAP-CAM-CAO-HAT + 518 9 319 320 321 327 # CAP-CAM-CAO-HAT + 519 8 320 319 318 324 # CAM-CAP-CAM-HAT + 520 7 322 316 321 320 # CTT-CAT-CAO-CAM + 521 6 321 320 319 325 # CAO-CAM-CAP-HAT + 522 4 321 316 317 323 # CAO-CAT-CAO-HAT + 523 10 322 316 317 323 # CTT-CAT-CAO-HAT + 524 10 322 316 321 327 # CTT-CAT-CAO-HAT + 525 11 323 317 318 324 # HAT-CAO-CAM-HAT + 526 12 324 318 319 325 # HAT-CAM-CAP-HAT + 527 12 326 320 319 325 # HAT-CAM-CAP-HAT + 528 11 327 321 320 326 # HAT-CAO-CAM-HAT + 529 1 331 332 333 334 # CAT-CAO-CAM-CAP + 530 2 331 332 333 339 # CAT-CAO-CAM-HAT + 531 1 331 336 335 334 # CAT-CAO-CAM-CAP + 532 2 331 336 335 341 # CAT-CAO-CAM-HAT + 533 3 332 331 336 335 # CAO-CAT-CAO-CAM + 534 4 332 331 336 342 # CAO-CAT-CAO-HAT + 535 5 332 333 334 335 # CAO-CAM-CAP-CAM + 536 6 332 333 334 340 # CAO-CAM-CAP-HAT + 537 7 337 331 332 333 # CTT-CAT-CAO-CAM + 538 3 336 331 332 333 # CAO-CAT-CAO-CAM + 539 5 336 335 334 333 # CAO-CAM-CAP-CAM + 540 8 333 334 335 341 # CAM-CAP-CAM-HAT + 541 9 334 333 332 338 # CAP-CAM-CAO-HAT + 542 9 334 335 336 342 # CAP-CAM-CAO-HAT + 543 8 335 334 333 339 # CAM-CAP-CAM-HAT + 544 7 337 331 336 335 # CTT-CAT-CAO-CAM + 545 6 336 335 334 340 # CAO-CAM-CAP-HAT + 546 4 336 331 332 338 # CAO-CAT-CAO-HAT + 547 10 337 331 332 338 # CTT-CAT-CAO-HAT + 548 10 337 331 336 342 # CTT-CAT-CAO-HAT + 549 11 338 332 333 339 # HAT-CAO-CAM-HAT + 550 12 339 333 334 340 # HAT-CAM-CAP-HAT + 551 12 341 335 334 340 # HAT-CAM-CAP-HAT + 552 11 342 336 335 341 # HAT-CAO-CAM-HAT + 553 1 346 347 348 349 # CAT-CAO-CAM-CAP + 554 2 346 347 348 354 # CAT-CAO-CAM-HAT + 555 1 346 351 350 349 # CAT-CAO-CAM-CAP + 556 2 346 351 350 356 # CAT-CAO-CAM-HAT + 557 3 347 346 351 350 # CAO-CAT-CAO-CAM + 558 4 347 346 351 357 # CAO-CAT-CAO-HAT + 559 5 347 348 349 350 # CAO-CAM-CAP-CAM + 560 6 347 348 349 355 # CAO-CAM-CAP-HAT + 561 7 352 346 347 348 # CTT-CAT-CAO-CAM + 562 3 351 346 347 348 # CAO-CAT-CAO-CAM + 563 5 351 350 349 348 # CAO-CAM-CAP-CAM + 564 8 348 349 350 356 # CAM-CAP-CAM-HAT + 565 9 349 348 347 353 # CAP-CAM-CAO-HAT + 566 9 349 350 351 357 # CAP-CAM-CAO-HAT + 567 8 350 349 348 354 # CAM-CAP-CAM-HAT + 568 7 352 346 351 350 # CTT-CAT-CAO-CAM + 569 6 351 350 349 355 # CAO-CAM-CAP-HAT + 570 4 351 346 347 353 # CAO-CAT-CAO-HAT + 571 10 352 346 347 353 # CTT-CAT-CAO-HAT + 572 10 352 346 351 357 # CTT-CAT-CAO-HAT + 573 11 353 347 348 354 # HAT-CAO-CAM-HAT + 574 12 354 348 349 355 # HAT-CAM-CAP-HAT + 575 12 356 350 349 355 # HAT-CAM-CAP-HAT + 576 11 357 351 350 356 # HAT-CAO-CAM-HAT + 577 1 361 362 363 364 # CAT-CAO-CAM-CAP + 578 2 361 362 363 369 # CAT-CAO-CAM-HAT + 579 1 361 366 365 364 # CAT-CAO-CAM-CAP + 580 2 361 366 365 371 # CAT-CAO-CAM-HAT + 581 3 362 361 366 365 # CAO-CAT-CAO-CAM + 582 4 362 361 366 372 # CAO-CAT-CAO-HAT + 583 5 362 363 364 365 # CAO-CAM-CAP-CAM + 584 6 362 363 364 370 # CAO-CAM-CAP-HAT + 585 7 367 361 362 363 # CTT-CAT-CAO-CAM + 586 3 366 361 362 363 # CAO-CAT-CAO-CAM + 587 5 366 365 364 363 # CAO-CAM-CAP-CAM + 588 8 363 364 365 371 # CAM-CAP-CAM-HAT + 589 9 364 363 362 368 # CAP-CAM-CAO-HAT + 590 9 364 365 366 372 # CAP-CAM-CAO-HAT + 591 8 365 364 363 369 # CAM-CAP-CAM-HAT + 592 7 367 361 366 365 # CTT-CAT-CAO-CAM + 593 6 366 365 364 370 # CAO-CAM-CAP-HAT + 594 4 366 361 362 368 # CAO-CAT-CAO-HAT + 595 10 367 361 362 368 # CTT-CAT-CAO-HAT + 596 10 367 361 366 372 # CTT-CAT-CAO-HAT + 597 11 368 362 363 369 # HAT-CAO-CAM-HAT + 598 12 369 363 364 370 # HAT-CAM-CAP-HAT + 599 12 371 365 364 370 # HAT-CAM-CAP-HAT + 600 11 372 366 365 371 # HAT-CAO-CAM-HAT + 601 1 376 377 378 379 # CAT-CAO-CAM-CAP + 602 2 376 377 378 384 # CAT-CAO-CAM-HAT + 603 1 376 381 380 379 # CAT-CAO-CAM-CAP + 604 2 376 381 380 386 # CAT-CAO-CAM-HAT + 605 3 377 376 381 380 # CAO-CAT-CAO-CAM + 606 4 377 376 381 387 # CAO-CAT-CAO-HAT + 607 5 377 378 379 380 # CAO-CAM-CAP-CAM + 608 6 377 378 379 385 # CAO-CAM-CAP-HAT + 609 7 382 376 377 378 # CTT-CAT-CAO-CAM + 610 3 381 376 377 378 # CAO-CAT-CAO-CAM + 611 5 381 380 379 378 # CAO-CAM-CAP-CAM + 612 8 378 379 380 386 # CAM-CAP-CAM-HAT + 613 9 379 378 377 383 # CAP-CAM-CAO-HAT + 614 9 379 380 381 387 # CAP-CAM-CAO-HAT + 615 8 380 379 378 384 # CAM-CAP-CAM-HAT + 616 7 382 376 381 380 # CTT-CAT-CAO-CAM + 617 6 381 380 379 385 # CAO-CAM-CAP-HAT + 618 4 381 376 377 383 # CAO-CAT-CAO-HAT + 619 10 382 376 377 383 # CTT-CAT-CAO-HAT + 620 10 382 376 381 387 # CTT-CAT-CAO-HAT + 621 11 383 377 378 384 # HAT-CAO-CAM-HAT + 622 12 384 378 379 385 # HAT-CAM-CAP-HAT + 623 12 386 380 379 385 # HAT-CAM-CAP-HAT + 624 11 387 381 380 386 # HAT-CAO-CAM-HAT + 625 1 391 392 393 394 # CAT-CAO-CAM-CAP + 626 2 391 392 393 399 # CAT-CAO-CAM-HAT + 627 1 391 396 395 394 # CAT-CAO-CAM-CAP + 628 2 391 396 395 401 # CAT-CAO-CAM-HAT + 629 3 392 391 396 395 # CAO-CAT-CAO-CAM + 630 4 392 391 396 402 # CAO-CAT-CAO-HAT + 631 5 392 393 394 395 # CAO-CAM-CAP-CAM + 632 6 392 393 394 400 # CAO-CAM-CAP-HAT + 633 7 397 391 392 393 # CTT-CAT-CAO-CAM + 634 3 396 391 392 393 # CAO-CAT-CAO-CAM + 635 5 396 395 394 393 # CAO-CAM-CAP-CAM + 636 8 393 394 395 401 # CAM-CAP-CAM-HAT + 637 9 394 393 392 398 # CAP-CAM-CAO-HAT + 638 9 394 395 396 402 # CAP-CAM-CAO-HAT + 639 8 395 394 393 399 # CAM-CAP-CAM-HAT + 640 7 397 391 396 395 # CTT-CAT-CAO-CAM + 641 6 396 395 394 400 # CAO-CAM-CAP-HAT + 642 4 396 391 392 398 # CAO-CAT-CAO-HAT + 643 10 397 391 392 398 # CTT-CAT-CAO-HAT + 644 10 397 391 396 402 # CTT-CAT-CAO-HAT + 645 11 398 392 393 399 # HAT-CAO-CAM-HAT + 646 12 399 393 394 400 # HAT-CAM-CAP-HAT + 647 12 401 395 394 400 # HAT-CAM-CAP-HAT + 648 11 402 396 395 401 # HAT-CAO-CAM-HAT + 649 1 406 407 408 409 # CAT-CAO-CAM-CAP + 650 2 406 407 408 414 # CAT-CAO-CAM-HAT + 651 1 406 411 410 409 # CAT-CAO-CAM-CAP + 652 2 406 411 410 416 # CAT-CAO-CAM-HAT + 653 3 407 406 411 410 # CAO-CAT-CAO-CAM + 654 4 407 406 411 417 # CAO-CAT-CAO-HAT + 655 5 407 408 409 410 # CAO-CAM-CAP-CAM + 656 6 407 408 409 415 # CAO-CAM-CAP-HAT + 657 7 412 406 407 408 # CTT-CAT-CAO-CAM + 658 3 411 406 407 408 # CAO-CAT-CAO-CAM + 659 5 411 410 409 408 # CAO-CAM-CAP-CAM + 660 8 408 409 410 416 # CAM-CAP-CAM-HAT + 661 9 409 408 407 413 # CAP-CAM-CAO-HAT + 662 9 409 410 411 417 # CAP-CAM-CAO-HAT + 663 8 410 409 408 414 # CAM-CAP-CAM-HAT + 664 7 412 406 411 410 # CTT-CAT-CAO-CAM + 665 6 411 410 409 415 # CAO-CAM-CAP-HAT + 666 4 411 406 407 413 # CAO-CAT-CAO-HAT + 667 10 412 406 407 413 # CTT-CAT-CAO-HAT + 668 10 412 406 411 417 # CTT-CAT-CAO-HAT + 669 11 413 407 408 414 # HAT-CAO-CAM-HAT + 670 12 414 408 409 415 # HAT-CAM-CAP-HAT + 671 12 416 410 409 415 # HAT-CAM-CAP-HAT + 672 11 417 411 410 416 # HAT-CAO-CAM-HAT + 673 1 421 422 423 424 # CAT-CAO-CAM-CAP + 674 2 421 422 423 429 # CAT-CAO-CAM-HAT + 675 1 421 426 425 424 # CAT-CAO-CAM-CAP + 676 2 421 426 425 431 # CAT-CAO-CAM-HAT + 677 3 422 421 426 425 # CAO-CAT-CAO-CAM + 678 4 422 421 426 432 # CAO-CAT-CAO-HAT + 679 5 422 423 424 425 # CAO-CAM-CAP-CAM + 680 6 422 423 424 430 # CAO-CAM-CAP-HAT + 681 7 427 421 422 423 # CTT-CAT-CAO-CAM + 682 3 426 421 422 423 # CAO-CAT-CAO-CAM + 683 5 426 425 424 423 # CAO-CAM-CAP-CAM + 684 8 423 424 425 431 # CAM-CAP-CAM-HAT + 685 9 424 423 422 428 # CAP-CAM-CAO-HAT + 686 9 424 425 426 432 # CAP-CAM-CAO-HAT + 687 8 425 424 423 429 # CAM-CAP-CAM-HAT + 688 7 427 421 426 425 # CTT-CAT-CAO-CAM + 689 6 426 425 424 430 # CAO-CAM-CAP-HAT + 690 4 426 421 422 428 # CAO-CAT-CAO-HAT + 691 10 427 421 422 428 # CTT-CAT-CAO-HAT + 692 10 427 421 426 432 # CTT-CAT-CAO-HAT + 693 11 428 422 423 429 # HAT-CAO-CAM-HAT + 694 12 429 423 424 430 # HAT-CAM-CAP-HAT + 695 12 431 425 424 430 # HAT-CAM-CAP-HAT + 696 11 432 426 425 431 # HAT-CAO-CAM-HAT + 697 1 436 437 438 439 # CAT-CAO-CAM-CAP + 698 2 436 437 438 444 # CAT-CAO-CAM-HAT + 699 1 436 441 440 439 # CAT-CAO-CAM-CAP + 700 2 436 441 440 446 # CAT-CAO-CAM-HAT + 701 3 437 436 441 440 # CAO-CAT-CAO-CAM + 702 4 437 436 441 447 # CAO-CAT-CAO-HAT + 703 5 437 438 439 440 # CAO-CAM-CAP-CAM + 704 6 437 438 439 445 # CAO-CAM-CAP-HAT + 705 7 442 436 437 438 # CTT-CAT-CAO-CAM + 706 3 441 436 437 438 # CAO-CAT-CAO-CAM + 707 5 441 440 439 438 # CAO-CAM-CAP-CAM + 708 8 438 439 440 446 # CAM-CAP-CAM-HAT + 709 9 439 438 437 443 # CAP-CAM-CAO-HAT + 710 9 439 440 441 447 # CAP-CAM-CAO-HAT + 711 8 440 439 438 444 # CAM-CAP-CAM-HAT + 712 7 442 436 441 440 # CTT-CAT-CAO-CAM + 713 6 441 440 439 445 # CAO-CAM-CAP-HAT + 714 4 441 436 437 443 # CAO-CAT-CAO-HAT + 715 10 442 436 437 443 # CTT-CAT-CAO-HAT + 716 10 442 436 441 447 # CTT-CAT-CAO-HAT + 717 11 443 437 438 444 # HAT-CAO-CAM-HAT + 718 12 444 438 439 445 # HAT-CAM-CAP-HAT + 719 12 446 440 439 445 # HAT-CAM-CAP-HAT + 720 11 447 441 440 446 # HAT-CAO-CAM-HAT + 721 1 451 452 453 454 # CAT-CAO-CAM-CAP + 722 2 451 452 453 459 # CAT-CAO-CAM-HAT + 723 1 451 456 455 454 # CAT-CAO-CAM-CAP + 724 2 451 456 455 461 # CAT-CAO-CAM-HAT + 725 3 452 451 456 455 # CAO-CAT-CAO-CAM + 726 4 452 451 456 462 # CAO-CAT-CAO-HAT + 727 5 452 453 454 455 # CAO-CAM-CAP-CAM + 728 6 452 453 454 460 # CAO-CAM-CAP-HAT + 729 7 457 451 452 453 # CTT-CAT-CAO-CAM + 730 3 456 451 452 453 # CAO-CAT-CAO-CAM + 731 5 456 455 454 453 # CAO-CAM-CAP-CAM + 732 8 453 454 455 461 # CAM-CAP-CAM-HAT + 733 9 454 453 452 458 # CAP-CAM-CAO-HAT + 734 9 454 455 456 462 # CAP-CAM-CAO-HAT + 735 8 455 454 453 459 # CAM-CAP-CAM-HAT + 736 7 457 451 456 455 # CTT-CAT-CAO-CAM + 737 6 456 455 454 460 # CAO-CAM-CAP-HAT + 738 4 456 451 452 458 # CAO-CAT-CAO-HAT + 739 10 457 451 452 458 # CTT-CAT-CAO-HAT + 740 10 457 451 456 462 # CTT-CAT-CAO-HAT + 741 11 458 452 453 459 # HAT-CAO-CAM-HAT + 742 12 459 453 454 460 # HAT-CAM-CAP-HAT + 743 12 461 455 454 460 # HAT-CAM-CAP-HAT + 744 11 462 456 455 461 # HAT-CAO-CAM-HAT + 745 1 466 467 468 469 # CAT-CAO-CAM-CAP + 746 2 466 467 468 474 # CAT-CAO-CAM-HAT + 747 1 466 471 470 469 # CAT-CAO-CAM-CAP + 748 2 466 471 470 476 # CAT-CAO-CAM-HAT + 749 3 467 466 471 470 # CAO-CAT-CAO-CAM + 750 4 467 466 471 477 # CAO-CAT-CAO-HAT + 751 5 467 468 469 470 # CAO-CAM-CAP-CAM + 752 6 467 468 469 475 # CAO-CAM-CAP-HAT + 753 7 472 466 467 468 # CTT-CAT-CAO-CAM + 754 3 471 466 467 468 # CAO-CAT-CAO-CAM + 755 5 471 470 469 468 # CAO-CAM-CAP-CAM + 756 8 468 469 470 476 # CAM-CAP-CAM-HAT + 757 9 469 468 467 473 # CAP-CAM-CAO-HAT + 758 9 469 470 471 477 # CAP-CAM-CAO-HAT + 759 8 470 469 468 474 # CAM-CAP-CAM-HAT + 760 7 472 466 471 470 # CTT-CAT-CAO-CAM + 761 6 471 470 469 475 # CAO-CAM-CAP-HAT + 762 4 471 466 467 473 # CAO-CAT-CAO-HAT + 763 10 472 466 467 473 # CTT-CAT-CAO-HAT + 764 10 472 466 471 477 # CTT-CAT-CAO-HAT + 765 11 473 467 468 474 # HAT-CAO-CAM-HAT + 766 12 474 468 469 475 # HAT-CAM-CAP-HAT + 767 12 476 470 469 475 # HAT-CAM-CAP-HAT + 768 11 477 471 470 476 # HAT-CAO-CAM-HAT + 769 1 481 482 483 484 # CAT-CAO-CAM-CAP + 770 2 481 482 483 489 # CAT-CAO-CAM-HAT + 771 1 481 486 485 484 # CAT-CAO-CAM-CAP + 772 2 481 486 485 491 # CAT-CAO-CAM-HAT + 773 3 482 481 486 485 # CAO-CAT-CAO-CAM + 774 4 482 481 486 492 # CAO-CAT-CAO-HAT + 775 5 482 483 484 485 # CAO-CAM-CAP-CAM + 776 6 482 483 484 490 # CAO-CAM-CAP-HAT + 777 7 487 481 482 483 # CTT-CAT-CAO-CAM + 778 3 486 481 482 483 # CAO-CAT-CAO-CAM + 779 5 486 485 484 483 # CAO-CAM-CAP-CAM + 780 8 483 484 485 491 # CAM-CAP-CAM-HAT + 781 9 484 483 482 488 # CAP-CAM-CAO-HAT + 782 9 484 485 486 492 # CAP-CAM-CAO-HAT + 783 8 485 484 483 489 # CAM-CAP-CAM-HAT + 784 7 487 481 486 485 # CTT-CAT-CAO-CAM + 785 6 486 485 484 490 # CAO-CAM-CAP-HAT + 786 4 486 481 482 488 # CAO-CAT-CAO-HAT + 787 10 487 481 482 488 # CTT-CAT-CAO-HAT + 788 10 487 481 486 492 # CTT-CAT-CAO-HAT + 789 11 488 482 483 489 # HAT-CAO-CAM-HAT + 790 12 489 483 484 490 # HAT-CAM-CAP-HAT + 791 12 491 485 484 490 # HAT-CAM-CAP-HAT + 792 11 492 486 485 491 # HAT-CAO-CAM-HAT + 793 1 496 497 498 499 # CAT-CAO-CAM-CAP + 794 2 496 497 498 504 # CAT-CAO-CAM-HAT + 795 1 496 501 500 499 # CAT-CAO-CAM-CAP + 796 2 496 501 500 506 # CAT-CAO-CAM-HAT + 797 3 497 496 501 500 # CAO-CAT-CAO-CAM + 798 4 497 496 501 507 # CAO-CAT-CAO-HAT + 799 5 497 498 499 500 # CAO-CAM-CAP-CAM + 800 6 497 498 499 505 # CAO-CAM-CAP-HAT + 801 7 502 496 497 498 # CTT-CAT-CAO-CAM + 802 3 501 496 497 498 # CAO-CAT-CAO-CAM + 803 5 501 500 499 498 # CAO-CAM-CAP-CAM + 804 8 498 499 500 506 # CAM-CAP-CAM-HAT + 805 9 499 498 497 503 # CAP-CAM-CAO-HAT + 806 9 499 500 501 507 # CAP-CAM-CAO-HAT + 807 8 500 499 498 504 # CAM-CAP-CAM-HAT + 808 7 502 496 501 500 # CTT-CAT-CAO-CAM + 809 6 501 500 499 505 # CAO-CAM-CAP-HAT + 810 4 501 496 497 503 # CAO-CAT-CAO-HAT + 811 10 502 496 497 503 # CTT-CAT-CAO-HAT + 812 10 502 496 501 507 # CTT-CAT-CAO-HAT + 813 11 503 497 498 504 # HAT-CAO-CAM-HAT + 814 12 504 498 499 505 # HAT-CAM-CAP-HAT + 815 12 506 500 499 505 # HAT-CAM-CAP-HAT + 816 11 507 501 500 506 # HAT-CAO-CAM-HAT + 817 1 511 512 513 514 # CAT-CAO-CAM-CAP + 818 2 511 512 513 519 # CAT-CAO-CAM-HAT + 819 1 511 516 515 514 # CAT-CAO-CAM-CAP + 820 2 511 516 515 521 # CAT-CAO-CAM-HAT + 821 3 512 511 516 515 # CAO-CAT-CAO-CAM + 822 4 512 511 516 522 # CAO-CAT-CAO-HAT + 823 5 512 513 514 515 # CAO-CAM-CAP-CAM + 824 6 512 513 514 520 # CAO-CAM-CAP-HAT + 825 7 517 511 512 513 # CTT-CAT-CAO-CAM + 826 3 516 511 512 513 # CAO-CAT-CAO-CAM + 827 5 516 515 514 513 # CAO-CAM-CAP-CAM + 828 8 513 514 515 521 # CAM-CAP-CAM-HAT + 829 9 514 513 512 518 # CAP-CAM-CAO-HAT + 830 9 514 515 516 522 # CAP-CAM-CAO-HAT + 831 8 515 514 513 519 # CAM-CAP-CAM-HAT + 832 7 517 511 516 515 # CTT-CAT-CAO-CAM + 833 6 516 515 514 520 # CAO-CAM-CAP-HAT + 834 4 516 511 512 518 # CAO-CAT-CAO-HAT + 835 10 517 511 512 518 # CTT-CAT-CAO-HAT + 836 10 517 511 516 522 # CTT-CAT-CAO-HAT + 837 11 518 512 513 519 # HAT-CAO-CAM-HAT + 838 12 519 513 514 520 # HAT-CAM-CAP-HAT + 839 12 521 515 514 520 # HAT-CAM-CAP-HAT + 840 11 522 516 515 521 # HAT-CAO-CAM-HAT + 841 1 526 527 528 529 # CAT-CAO-CAM-CAP + 842 2 526 527 528 534 # CAT-CAO-CAM-HAT + 843 1 526 531 530 529 # CAT-CAO-CAM-CAP + 844 2 526 531 530 536 # CAT-CAO-CAM-HAT + 845 3 527 526 531 530 # CAO-CAT-CAO-CAM + 846 4 527 526 531 537 # CAO-CAT-CAO-HAT + 847 5 527 528 529 530 # CAO-CAM-CAP-CAM + 848 6 527 528 529 535 # CAO-CAM-CAP-HAT + 849 7 532 526 527 528 # CTT-CAT-CAO-CAM + 850 3 531 526 527 528 # CAO-CAT-CAO-CAM + 851 5 531 530 529 528 # CAO-CAM-CAP-CAM + 852 8 528 529 530 536 # CAM-CAP-CAM-HAT + 853 9 529 528 527 533 # CAP-CAM-CAO-HAT + 854 9 529 530 531 537 # CAP-CAM-CAO-HAT + 855 8 530 529 528 534 # CAM-CAP-CAM-HAT + 856 7 532 526 531 530 # CTT-CAT-CAO-CAM + 857 6 531 530 529 535 # CAO-CAM-CAP-HAT + 858 4 531 526 527 533 # CAO-CAT-CAO-HAT + 859 10 532 526 527 533 # CTT-CAT-CAO-HAT + 860 10 532 526 531 537 # CTT-CAT-CAO-HAT + 861 11 533 527 528 534 # HAT-CAO-CAM-HAT + 862 12 534 528 529 535 # HAT-CAM-CAP-HAT + 863 12 536 530 529 535 # HAT-CAM-CAP-HAT + 864 11 537 531 530 536 # HAT-CAO-CAM-HAT + 865 1 541 542 543 544 # CAT-CAO-CAM-CAP + 866 2 541 542 543 549 # CAT-CAO-CAM-HAT + 867 1 541 546 545 544 # CAT-CAO-CAM-CAP + 868 2 541 546 545 551 # CAT-CAO-CAM-HAT + 869 3 542 541 546 545 # CAO-CAT-CAO-CAM + 870 4 542 541 546 552 # CAO-CAT-CAO-HAT + 871 5 542 543 544 545 # CAO-CAM-CAP-CAM + 872 6 542 543 544 550 # CAO-CAM-CAP-HAT + 873 7 547 541 542 543 # CTT-CAT-CAO-CAM + 874 3 546 541 542 543 # CAO-CAT-CAO-CAM + 875 5 546 545 544 543 # CAO-CAM-CAP-CAM + 876 8 543 544 545 551 # CAM-CAP-CAM-HAT + 877 9 544 543 542 548 # CAP-CAM-CAO-HAT + 878 9 544 545 546 552 # CAP-CAM-CAO-HAT + 879 8 545 544 543 549 # CAM-CAP-CAM-HAT + 880 7 547 541 546 545 # CTT-CAT-CAO-CAM + 881 6 546 545 544 550 # CAO-CAM-CAP-HAT + 882 4 546 541 542 548 # CAO-CAT-CAO-HAT + 883 10 547 541 542 548 # CTT-CAT-CAO-HAT + 884 10 547 541 546 552 # CTT-CAT-CAO-HAT + 885 11 548 542 543 549 # HAT-CAO-CAM-HAT + 886 12 549 543 544 550 # HAT-CAM-CAP-HAT + 887 12 551 545 544 550 # HAT-CAM-CAP-HAT + 888 11 552 546 545 551 # HAT-CAO-CAM-HAT + 889 1 556 557 558 559 # CAT-CAO-CAM-CAP + 890 2 556 557 558 564 # CAT-CAO-CAM-HAT + 891 1 556 561 560 559 # CAT-CAO-CAM-CAP + 892 2 556 561 560 566 # CAT-CAO-CAM-HAT + 893 3 557 556 561 560 # CAO-CAT-CAO-CAM + 894 4 557 556 561 567 # CAO-CAT-CAO-HAT + 895 5 557 558 559 560 # CAO-CAM-CAP-CAM + 896 6 557 558 559 565 # CAO-CAM-CAP-HAT + 897 7 562 556 557 558 # CTT-CAT-CAO-CAM + 898 3 561 556 557 558 # CAO-CAT-CAO-CAM + 899 5 561 560 559 558 # CAO-CAM-CAP-CAM + 900 8 558 559 560 566 # CAM-CAP-CAM-HAT + 901 9 559 558 557 563 # CAP-CAM-CAO-HAT + 902 9 559 560 561 567 # CAP-CAM-CAO-HAT + 903 8 560 559 558 564 # CAM-CAP-CAM-HAT + 904 7 562 556 561 560 # CTT-CAT-CAO-CAM + 905 6 561 560 559 565 # CAO-CAM-CAP-HAT + 906 4 561 556 557 563 # CAO-CAT-CAO-HAT + 907 10 562 556 557 563 # CTT-CAT-CAO-HAT + 908 10 562 556 561 567 # CTT-CAT-CAO-HAT + 909 11 563 557 558 564 # HAT-CAO-CAM-HAT + 910 12 564 558 559 565 # HAT-CAM-CAP-HAT + 911 12 566 560 559 565 # HAT-CAM-CAP-HAT + 912 11 567 561 560 566 # HAT-CAO-CAM-HAT + 913 1 571 572 573 574 # CAT-CAO-CAM-CAP + 914 2 571 572 573 579 # CAT-CAO-CAM-HAT + 915 1 571 576 575 574 # CAT-CAO-CAM-CAP + 916 2 571 576 575 581 # CAT-CAO-CAM-HAT + 917 3 572 571 576 575 # CAO-CAT-CAO-CAM + 918 4 572 571 576 582 # CAO-CAT-CAO-HAT + 919 5 572 573 574 575 # CAO-CAM-CAP-CAM + 920 6 572 573 574 580 # CAO-CAM-CAP-HAT + 921 7 577 571 572 573 # CTT-CAT-CAO-CAM + 922 3 576 571 572 573 # CAO-CAT-CAO-CAM + 923 5 576 575 574 573 # CAO-CAM-CAP-CAM + 924 8 573 574 575 581 # CAM-CAP-CAM-HAT + 925 9 574 573 572 578 # CAP-CAM-CAO-HAT + 926 9 574 575 576 582 # CAP-CAM-CAO-HAT + 927 8 575 574 573 579 # CAM-CAP-CAM-HAT + 928 7 577 571 576 575 # CTT-CAT-CAO-CAM + 929 6 576 575 574 580 # CAO-CAM-CAP-HAT + 930 4 576 571 572 578 # CAO-CAT-CAO-HAT + 931 10 577 571 572 578 # CTT-CAT-CAO-HAT + 932 10 577 571 576 582 # CTT-CAT-CAO-HAT + 933 11 578 572 573 579 # HAT-CAO-CAM-HAT + 934 12 579 573 574 580 # HAT-CAM-CAP-HAT + 935 12 581 575 574 580 # HAT-CAM-CAP-HAT + 936 11 582 576 575 581 # HAT-CAO-CAM-HAT + 937 1 586 587 588 589 # CAT-CAO-CAM-CAP + 938 2 586 587 588 594 # CAT-CAO-CAM-HAT + 939 1 586 591 590 589 # CAT-CAO-CAM-CAP + 940 2 586 591 590 596 # CAT-CAO-CAM-HAT + 941 3 587 586 591 590 # CAO-CAT-CAO-CAM + 942 4 587 586 591 597 # CAO-CAT-CAO-HAT + 943 5 587 588 589 590 # CAO-CAM-CAP-CAM + 944 6 587 588 589 595 # CAO-CAM-CAP-HAT + 945 7 592 586 587 588 # CTT-CAT-CAO-CAM + 946 3 591 586 587 588 # CAO-CAT-CAO-CAM + 947 5 591 590 589 588 # CAO-CAM-CAP-CAM + 948 8 588 589 590 596 # CAM-CAP-CAM-HAT + 949 9 589 588 587 593 # CAP-CAM-CAO-HAT + 950 9 589 590 591 597 # CAP-CAM-CAO-HAT + 951 8 590 589 588 594 # CAM-CAP-CAM-HAT + 952 7 592 586 591 590 # CTT-CAT-CAO-CAM + 953 6 591 590 589 595 # CAO-CAM-CAP-HAT + 954 4 591 586 587 593 # CAO-CAT-CAO-HAT + 955 10 592 586 587 593 # CTT-CAT-CAO-HAT + 956 10 592 586 591 597 # CTT-CAT-CAO-HAT + 957 11 593 587 588 594 # HAT-CAO-CAM-HAT + 958 12 594 588 589 595 # HAT-CAM-CAP-HAT + 959 12 596 590 589 595 # HAT-CAM-CAP-HAT + 960 11 597 591 590 596 # HAT-CAO-CAM-HAT + 961 1 601 602 603 604 # CAT-CAO-CAM-CAP + 962 2 601 602 603 609 # CAT-CAO-CAM-HAT + 963 1 601 606 605 604 # CAT-CAO-CAM-CAP + 964 2 601 606 605 611 # CAT-CAO-CAM-HAT + 965 3 602 601 606 605 # CAO-CAT-CAO-CAM + 966 4 602 601 606 612 # CAO-CAT-CAO-HAT + 967 5 602 603 604 605 # CAO-CAM-CAP-CAM + 968 6 602 603 604 610 # CAO-CAM-CAP-HAT + 969 7 607 601 602 603 # CTT-CAT-CAO-CAM + 970 3 606 601 602 603 # CAO-CAT-CAO-CAM + 971 5 606 605 604 603 # CAO-CAM-CAP-CAM + 972 8 603 604 605 611 # CAM-CAP-CAM-HAT + 973 9 604 603 602 608 # CAP-CAM-CAO-HAT + 974 9 604 605 606 612 # CAP-CAM-CAO-HAT + 975 8 605 604 603 609 # CAM-CAP-CAM-HAT + 976 7 607 601 606 605 # CTT-CAT-CAO-CAM + 977 6 606 605 604 610 # CAO-CAM-CAP-HAT + 978 4 606 601 602 608 # CAO-CAT-CAO-HAT + 979 10 607 601 602 608 # CTT-CAT-CAO-HAT + 980 10 607 601 606 612 # CTT-CAT-CAO-HAT + 981 11 608 602 603 609 # HAT-CAO-CAM-HAT + 982 12 609 603 604 610 # HAT-CAM-CAP-HAT + 983 12 611 605 604 610 # HAT-CAM-CAP-HAT + 984 11 612 606 605 611 # HAT-CAO-CAM-HAT + 985 1 616 617 618 619 # CAT-CAO-CAM-CAP + 986 2 616 617 618 624 # CAT-CAO-CAM-HAT + 987 1 616 621 620 619 # CAT-CAO-CAM-CAP + 988 2 616 621 620 626 # CAT-CAO-CAM-HAT + 989 3 617 616 621 620 # CAO-CAT-CAO-CAM + 990 4 617 616 621 627 # CAO-CAT-CAO-HAT + 991 5 617 618 619 620 # CAO-CAM-CAP-CAM + 992 6 617 618 619 625 # CAO-CAM-CAP-HAT + 993 7 622 616 617 618 # CTT-CAT-CAO-CAM + 994 3 621 616 617 618 # CAO-CAT-CAO-CAM + 995 5 621 620 619 618 # CAO-CAM-CAP-CAM + 996 8 618 619 620 626 # CAM-CAP-CAM-HAT + 997 9 619 618 617 623 # CAP-CAM-CAO-HAT + 998 9 619 620 621 627 # CAP-CAM-CAO-HAT + 999 8 620 619 618 624 # CAM-CAP-CAM-HAT + 1000 7 622 616 621 620 # CTT-CAT-CAO-CAM + 1001 6 621 620 619 625 # CAO-CAM-CAP-HAT + 1002 4 621 616 617 623 # CAO-CAT-CAO-HAT + 1003 10 622 616 617 623 # CTT-CAT-CAO-HAT + 1004 10 622 616 621 627 # CTT-CAT-CAO-HAT + 1005 11 623 617 618 624 # HAT-CAO-CAM-HAT + 1006 12 624 618 619 625 # HAT-CAM-CAP-HAT + 1007 12 626 620 619 625 # HAT-CAM-CAP-HAT + 1008 11 627 621 620 626 # HAT-CAO-CAM-HAT + 1009 1 631 632 633 634 # CAT-CAO-CAM-CAP + 1010 2 631 632 633 639 # CAT-CAO-CAM-HAT + 1011 1 631 636 635 634 # CAT-CAO-CAM-CAP + 1012 2 631 636 635 641 # CAT-CAO-CAM-HAT + 1013 3 632 631 636 635 # CAO-CAT-CAO-CAM + 1014 4 632 631 636 642 # CAO-CAT-CAO-HAT + 1015 5 632 633 634 635 # CAO-CAM-CAP-CAM + 1016 6 632 633 634 640 # CAO-CAM-CAP-HAT + 1017 7 637 631 632 633 # CTT-CAT-CAO-CAM + 1018 3 636 631 632 633 # CAO-CAT-CAO-CAM + 1019 5 636 635 634 633 # CAO-CAM-CAP-CAM + 1020 8 633 634 635 641 # CAM-CAP-CAM-HAT + 1021 9 634 633 632 638 # CAP-CAM-CAO-HAT + 1022 9 634 635 636 642 # CAP-CAM-CAO-HAT + 1023 8 635 634 633 639 # CAM-CAP-CAM-HAT + 1024 7 637 631 636 635 # CTT-CAT-CAO-CAM + 1025 6 636 635 634 640 # CAO-CAM-CAP-HAT + 1026 4 636 631 632 638 # CAO-CAT-CAO-HAT + 1027 10 637 631 632 638 # CTT-CAT-CAO-HAT + 1028 10 637 631 636 642 # CTT-CAT-CAO-HAT + 1029 11 638 632 633 639 # HAT-CAO-CAM-HAT + 1030 12 639 633 634 640 # HAT-CAM-CAP-HAT + 1031 12 641 635 634 640 # HAT-CAM-CAP-HAT + 1032 11 642 636 635 641 # HAT-CAO-CAM-HAT + 1033 1 646 647 648 649 # CAT-CAO-CAM-CAP + 1034 2 646 647 648 654 # CAT-CAO-CAM-HAT + 1035 1 646 651 650 649 # CAT-CAO-CAM-CAP + 1036 2 646 651 650 656 # CAT-CAO-CAM-HAT + 1037 3 647 646 651 650 # CAO-CAT-CAO-CAM + 1038 4 647 646 651 657 # CAO-CAT-CAO-HAT + 1039 5 647 648 649 650 # CAO-CAM-CAP-CAM + 1040 6 647 648 649 655 # CAO-CAM-CAP-HAT + 1041 7 652 646 647 648 # CTT-CAT-CAO-CAM + 1042 3 651 646 647 648 # CAO-CAT-CAO-CAM + 1043 5 651 650 649 648 # CAO-CAM-CAP-CAM + 1044 8 648 649 650 656 # CAM-CAP-CAM-HAT + 1045 9 649 648 647 653 # CAP-CAM-CAO-HAT + 1046 9 649 650 651 657 # CAP-CAM-CAO-HAT + 1047 8 650 649 648 654 # CAM-CAP-CAM-HAT + 1048 7 652 646 651 650 # CTT-CAT-CAO-CAM + 1049 6 651 650 649 655 # CAO-CAM-CAP-HAT + 1050 4 651 646 647 653 # CAO-CAT-CAO-HAT + 1051 10 652 646 647 653 # CTT-CAT-CAO-HAT + 1052 10 652 646 651 657 # CTT-CAT-CAO-HAT + 1053 11 653 647 648 654 # HAT-CAO-CAM-HAT + 1054 12 654 648 649 655 # HAT-CAM-CAP-HAT + 1055 12 656 650 649 655 # HAT-CAM-CAP-HAT + 1056 11 657 651 650 656 # HAT-CAO-CAM-HAT + 1057 1 661 662 663 664 # CAT-CAO-CAM-CAP + 1058 2 661 662 663 669 # CAT-CAO-CAM-HAT + 1059 1 661 666 665 664 # CAT-CAO-CAM-CAP + 1060 2 661 666 665 671 # CAT-CAO-CAM-HAT + 1061 3 662 661 666 665 # CAO-CAT-CAO-CAM + 1062 4 662 661 666 672 # CAO-CAT-CAO-HAT + 1063 5 662 663 664 665 # CAO-CAM-CAP-CAM + 1064 6 662 663 664 670 # CAO-CAM-CAP-HAT + 1065 7 667 661 662 663 # CTT-CAT-CAO-CAM + 1066 3 666 661 662 663 # CAO-CAT-CAO-CAM + 1067 5 666 665 664 663 # CAO-CAM-CAP-CAM + 1068 8 663 664 665 671 # CAM-CAP-CAM-HAT + 1069 9 664 663 662 668 # CAP-CAM-CAO-HAT + 1070 9 664 665 666 672 # CAP-CAM-CAO-HAT + 1071 8 665 664 663 669 # CAM-CAP-CAM-HAT + 1072 7 667 661 666 665 # CTT-CAT-CAO-CAM + 1073 6 666 665 664 670 # CAO-CAM-CAP-HAT + 1074 4 666 661 662 668 # CAO-CAT-CAO-HAT + 1075 10 667 661 662 668 # CTT-CAT-CAO-HAT + 1076 10 667 661 666 672 # CTT-CAT-CAO-HAT + 1077 11 668 662 663 669 # HAT-CAO-CAM-HAT + 1078 12 669 663 664 670 # HAT-CAM-CAP-HAT + 1079 12 671 665 664 670 # HAT-CAM-CAP-HAT + 1080 11 672 666 665 671 # HAT-CAO-CAM-HAT + 1081 1 676 677 678 679 # CAT-CAO-CAM-CAP + 1082 2 676 677 678 684 # CAT-CAO-CAM-HAT + 1083 1 676 681 680 679 # CAT-CAO-CAM-CAP + 1084 2 676 681 680 686 # CAT-CAO-CAM-HAT + 1085 3 677 676 681 680 # CAO-CAT-CAO-CAM + 1086 4 677 676 681 687 # CAO-CAT-CAO-HAT + 1087 5 677 678 679 680 # CAO-CAM-CAP-CAM + 1088 6 677 678 679 685 # CAO-CAM-CAP-HAT + 1089 7 682 676 677 678 # CTT-CAT-CAO-CAM + 1090 3 681 676 677 678 # CAO-CAT-CAO-CAM + 1091 5 681 680 679 678 # CAO-CAM-CAP-CAM + 1092 8 678 679 680 686 # CAM-CAP-CAM-HAT + 1093 9 679 678 677 683 # CAP-CAM-CAO-HAT + 1094 9 679 680 681 687 # CAP-CAM-CAO-HAT + 1095 8 680 679 678 684 # CAM-CAP-CAM-HAT + 1096 7 682 676 681 680 # CTT-CAT-CAO-CAM + 1097 6 681 680 679 685 # CAO-CAM-CAP-HAT + 1098 4 681 676 677 683 # CAO-CAT-CAO-HAT + 1099 10 682 676 677 683 # CTT-CAT-CAO-HAT + 1100 10 682 676 681 687 # CTT-CAT-CAO-HAT + 1101 11 683 677 678 684 # HAT-CAO-CAM-HAT + 1102 12 684 678 679 685 # HAT-CAM-CAP-HAT + 1103 12 686 680 679 685 # HAT-CAM-CAP-HAT + 1104 11 687 681 680 686 # HAT-CAO-CAM-HAT + 1105 1 691 692 693 694 # CAT-CAO-CAM-CAP + 1106 2 691 692 693 699 # CAT-CAO-CAM-HAT + 1107 1 691 696 695 694 # CAT-CAO-CAM-CAP + 1108 2 691 696 695 701 # CAT-CAO-CAM-HAT + 1109 3 692 691 696 695 # CAO-CAT-CAO-CAM + 1110 4 692 691 696 702 # CAO-CAT-CAO-HAT + 1111 5 692 693 694 695 # CAO-CAM-CAP-CAM + 1112 6 692 693 694 700 # CAO-CAM-CAP-HAT + 1113 7 697 691 692 693 # CTT-CAT-CAO-CAM + 1114 3 696 691 692 693 # CAO-CAT-CAO-CAM + 1115 5 696 695 694 693 # CAO-CAM-CAP-CAM + 1116 8 693 694 695 701 # CAM-CAP-CAM-HAT + 1117 9 694 693 692 698 # CAP-CAM-CAO-HAT + 1118 9 694 695 696 702 # CAP-CAM-CAO-HAT + 1119 8 695 694 693 699 # CAM-CAP-CAM-HAT + 1120 7 697 691 696 695 # CTT-CAT-CAO-CAM + 1121 6 696 695 694 700 # CAO-CAM-CAP-HAT + 1122 4 696 691 692 698 # CAO-CAT-CAO-HAT + 1123 10 697 691 692 698 # CTT-CAT-CAO-HAT + 1124 10 697 691 696 702 # CTT-CAT-CAO-HAT + 1125 11 698 692 693 699 # HAT-CAO-CAM-HAT + 1126 12 699 693 694 700 # HAT-CAM-CAP-HAT + 1127 12 701 695 694 700 # HAT-CAM-CAP-HAT + 1128 11 702 696 695 701 # HAT-CAO-CAM-HAT + 1129 1 706 707 708 709 # CAT-CAO-CAM-CAP + 1130 2 706 707 708 714 # CAT-CAO-CAM-HAT + 1131 1 706 711 710 709 # CAT-CAO-CAM-CAP + 1132 2 706 711 710 716 # CAT-CAO-CAM-HAT + 1133 3 707 706 711 710 # CAO-CAT-CAO-CAM + 1134 4 707 706 711 717 # CAO-CAT-CAO-HAT + 1135 5 707 708 709 710 # CAO-CAM-CAP-CAM + 1136 6 707 708 709 715 # CAO-CAM-CAP-HAT + 1137 7 712 706 707 708 # CTT-CAT-CAO-CAM + 1138 3 711 706 707 708 # CAO-CAT-CAO-CAM + 1139 5 711 710 709 708 # CAO-CAM-CAP-CAM + 1140 8 708 709 710 716 # CAM-CAP-CAM-HAT + 1141 9 709 708 707 713 # CAP-CAM-CAO-HAT + 1142 9 709 710 711 717 # CAP-CAM-CAO-HAT + 1143 8 710 709 708 714 # CAM-CAP-CAM-HAT + 1144 7 712 706 711 710 # CTT-CAT-CAO-CAM + 1145 6 711 710 709 715 # CAO-CAM-CAP-HAT + 1146 4 711 706 707 713 # CAO-CAT-CAO-HAT + 1147 10 712 706 707 713 # CTT-CAT-CAO-HAT + 1148 10 712 706 711 717 # CTT-CAT-CAO-HAT + 1149 11 713 707 708 714 # HAT-CAO-CAM-HAT + 1150 12 714 708 709 715 # HAT-CAM-CAP-HAT + 1151 12 716 710 709 715 # HAT-CAM-CAP-HAT + 1152 11 717 711 710 716 # HAT-CAO-CAM-HAT + 1153 1 721 722 723 724 # CAT-CAO-CAM-CAP + 1154 2 721 722 723 729 # CAT-CAO-CAM-HAT + 1155 1 721 726 725 724 # CAT-CAO-CAM-CAP + 1156 2 721 726 725 731 # CAT-CAO-CAM-HAT + 1157 3 722 721 726 725 # CAO-CAT-CAO-CAM + 1158 4 722 721 726 732 # CAO-CAT-CAO-HAT + 1159 5 722 723 724 725 # CAO-CAM-CAP-CAM + 1160 6 722 723 724 730 # CAO-CAM-CAP-HAT + 1161 7 727 721 722 723 # CTT-CAT-CAO-CAM + 1162 3 726 721 722 723 # CAO-CAT-CAO-CAM + 1163 5 726 725 724 723 # CAO-CAM-CAP-CAM + 1164 8 723 724 725 731 # CAM-CAP-CAM-HAT + 1165 9 724 723 722 728 # CAP-CAM-CAO-HAT + 1166 9 724 725 726 732 # CAP-CAM-CAO-HAT + 1167 8 725 724 723 729 # CAM-CAP-CAM-HAT + 1168 7 727 721 726 725 # CTT-CAT-CAO-CAM + 1169 6 726 725 724 730 # CAO-CAM-CAP-HAT + 1170 4 726 721 722 728 # CAO-CAT-CAO-HAT + 1171 10 727 721 722 728 # CTT-CAT-CAO-HAT + 1172 10 727 721 726 732 # CTT-CAT-CAO-HAT + 1173 11 728 722 723 729 # HAT-CAO-CAM-HAT + 1174 12 729 723 724 730 # HAT-CAM-CAP-HAT + 1175 12 731 725 724 730 # HAT-CAM-CAP-HAT + 1176 11 732 726 725 731 # HAT-CAO-CAM-HAT + 1177 1 736 737 738 739 # CAT-CAO-CAM-CAP + 1178 2 736 737 738 744 # CAT-CAO-CAM-HAT + 1179 1 736 741 740 739 # CAT-CAO-CAM-CAP + 1180 2 736 741 740 746 # CAT-CAO-CAM-HAT + 1181 3 737 736 741 740 # CAO-CAT-CAO-CAM + 1182 4 737 736 741 747 # CAO-CAT-CAO-HAT + 1183 5 737 738 739 740 # CAO-CAM-CAP-CAM + 1184 6 737 738 739 745 # CAO-CAM-CAP-HAT + 1185 7 742 736 737 738 # CTT-CAT-CAO-CAM + 1186 3 741 736 737 738 # CAO-CAT-CAO-CAM + 1187 5 741 740 739 738 # CAO-CAM-CAP-CAM + 1188 8 738 739 740 746 # CAM-CAP-CAM-HAT + 1189 9 739 738 737 743 # CAP-CAM-CAO-HAT + 1190 9 739 740 741 747 # CAP-CAM-CAO-HAT + 1191 8 740 739 738 744 # CAM-CAP-CAM-HAT + 1192 7 742 736 741 740 # CTT-CAT-CAO-CAM + 1193 6 741 740 739 745 # CAO-CAM-CAP-HAT + 1194 4 741 736 737 743 # CAO-CAT-CAO-HAT + 1195 10 742 736 737 743 # CTT-CAT-CAO-HAT + 1196 10 742 736 741 747 # CTT-CAT-CAO-HAT + 1197 11 743 737 738 744 # HAT-CAO-CAM-HAT + 1198 12 744 738 739 745 # HAT-CAM-CAP-HAT + 1199 12 746 740 739 745 # HAT-CAM-CAP-HAT + 1200 11 747 741 740 746 # HAT-CAO-CAM-HAT + 1201 1 751 752 753 754 # CAT-CAO-CAM-CAP + 1202 2 751 752 753 759 # CAT-CAO-CAM-HAT + 1203 1 751 756 755 754 # CAT-CAO-CAM-CAP + 1204 2 751 756 755 761 # CAT-CAO-CAM-HAT + 1205 3 752 751 756 755 # CAO-CAT-CAO-CAM + 1206 4 752 751 756 762 # CAO-CAT-CAO-HAT + 1207 5 752 753 754 755 # CAO-CAM-CAP-CAM + 1208 6 752 753 754 760 # CAO-CAM-CAP-HAT + 1209 7 757 751 752 753 # CTT-CAT-CAO-CAM + 1210 3 756 751 752 753 # CAO-CAT-CAO-CAM + 1211 5 756 755 754 753 # CAO-CAM-CAP-CAM + 1212 8 753 754 755 761 # CAM-CAP-CAM-HAT + 1213 9 754 753 752 758 # CAP-CAM-CAO-HAT + 1214 9 754 755 756 762 # CAP-CAM-CAO-HAT + 1215 8 755 754 753 759 # CAM-CAP-CAM-HAT + 1216 7 757 751 756 755 # CTT-CAT-CAO-CAM + 1217 6 756 755 754 760 # CAO-CAM-CAP-HAT + 1218 4 756 751 752 758 # CAO-CAT-CAO-HAT + 1219 10 757 751 752 758 # CTT-CAT-CAO-HAT + 1220 10 757 751 756 762 # CTT-CAT-CAO-HAT + 1221 11 758 752 753 759 # HAT-CAO-CAM-HAT + 1222 12 759 753 754 760 # HAT-CAM-CAP-HAT + 1223 12 761 755 754 760 # HAT-CAM-CAP-HAT + 1224 11 762 756 755 761 # HAT-CAO-CAM-HAT + 1225 1 766 767 768 769 # CAT-CAO-CAM-CAP + 1226 2 766 767 768 774 # CAT-CAO-CAM-HAT + 1227 1 766 771 770 769 # CAT-CAO-CAM-CAP + 1228 2 766 771 770 776 # CAT-CAO-CAM-HAT + 1229 3 767 766 771 770 # CAO-CAT-CAO-CAM + 1230 4 767 766 771 777 # CAO-CAT-CAO-HAT + 1231 5 767 768 769 770 # CAO-CAM-CAP-CAM + 1232 6 767 768 769 775 # CAO-CAM-CAP-HAT + 1233 7 772 766 767 768 # CTT-CAT-CAO-CAM + 1234 3 771 766 767 768 # CAO-CAT-CAO-CAM + 1235 5 771 770 769 768 # CAO-CAM-CAP-CAM + 1236 8 768 769 770 776 # CAM-CAP-CAM-HAT + 1237 9 769 768 767 773 # CAP-CAM-CAO-HAT + 1238 9 769 770 771 777 # CAP-CAM-CAO-HAT + 1239 8 770 769 768 774 # CAM-CAP-CAM-HAT + 1240 7 772 766 771 770 # CTT-CAT-CAO-CAM + 1241 6 771 770 769 775 # CAO-CAM-CAP-HAT + 1242 4 771 766 767 773 # CAO-CAT-CAO-HAT + 1243 10 772 766 767 773 # CTT-CAT-CAO-HAT + 1244 10 772 766 771 777 # CTT-CAT-CAO-HAT + 1245 11 773 767 768 774 # HAT-CAO-CAM-HAT + 1246 12 774 768 769 775 # HAT-CAM-CAP-HAT + 1247 12 776 770 769 775 # HAT-CAM-CAP-HAT + 1248 11 777 771 770 776 # HAT-CAO-CAM-HAT + 1249 1 781 782 783 784 # CAT-CAO-CAM-CAP + 1250 2 781 782 783 789 # CAT-CAO-CAM-HAT + 1251 1 781 786 785 784 # CAT-CAO-CAM-CAP + 1252 2 781 786 785 791 # CAT-CAO-CAM-HAT + 1253 3 782 781 786 785 # CAO-CAT-CAO-CAM + 1254 4 782 781 786 792 # CAO-CAT-CAO-HAT + 1255 5 782 783 784 785 # CAO-CAM-CAP-CAM + 1256 6 782 783 784 790 # CAO-CAM-CAP-HAT + 1257 7 787 781 782 783 # CTT-CAT-CAO-CAM + 1258 3 786 781 782 783 # CAO-CAT-CAO-CAM + 1259 5 786 785 784 783 # CAO-CAM-CAP-CAM + 1260 8 783 784 785 791 # CAM-CAP-CAM-HAT + 1261 9 784 783 782 788 # CAP-CAM-CAO-HAT + 1262 9 784 785 786 792 # CAP-CAM-CAO-HAT + 1263 8 785 784 783 789 # CAM-CAP-CAM-HAT + 1264 7 787 781 786 785 # CTT-CAT-CAO-CAM + 1265 6 786 785 784 790 # CAO-CAM-CAP-HAT + 1266 4 786 781 782 788 # CAO-CAT-CAO-HAT + 1267 10 787 781 782 788 # CTT-CAT-CAO-HAT + 1268 10 787 781 786 792 # CTT-CAT-CAO-HAT + 1269 11 788 782 783 789 # HAT-CAO-CAM-HAT + 1270 12 789 783 784 790 # HAT-CAM-CAP-HAT + 1271 12 791 785 784 790 # HAT-CAM-CAP-HAT + 1272 11 792 786 785 791 # HAT-CAO-CAM-HAT + 1273 1 796 797 798 799 # CAT-CAO-CAM-CAP + 1274 2 796 797 798 804 # CAT-CAO-CAM-HAT + 1275 1 796 801 800 799 # CAT-CAO-CAM-CAP + 1276 2 796 801 800 806 # CAT-CAO-CAM-HAT + 1277 3 797 796 801 800 # CAO-CAT-CAO-CAM + 1278 4 797 796 801 807 # CAO-CAT-CAO-HAT + 1279 5 797 798 799 800 # CAO-CAM-CAP-CAM + 1280 6 797 798 799 805 # CAO-CAM-CAP-HAT + 1281 7 802 796 797 798 # CTT-CAT-CAO-CAM + 1282 3 801 796 797 798 # CAO-CAT-CAO-CAM + 1283 5 801 800 799 798 # CAO-CAM-CAP-CAM + 1284 8 798 799 800 806 # CAM-CAP-CAM-HAT + 1285 9 799 798 797 803 # CAP-CAM-CAO-HAT + 1286 9 799 800 801 807 # CAP-CAM-CAO-HAT + 1287 8 800 799 798 804 # CAM-CAP-CAM-HAT + 1288 7 802 796 801 800 # CTT-CAT-CAO-CAM + 1289 6 801 800 799 805 # CAO-CAM-CAP-HAT + 1290 4 801 796 797 803 # CAO-CAT-CAO-HAT + 1291 10 802 796 797 803 # CTT-CAT-CAO-HAT + 1292 10 802 796 801 807 # CTT-CAT-CAO-HAT + 1293 11 803 797 798 804 # HAT-CAO-CAM-HAT + 1294 12 804 798 799 805 # HAT-CAM-CAP-HAT + 1295 12 806 800 799 805 # HAT-CAM-CAP-HAT + 1296 11 807 801 800 806 # HAT-CAO-CAM-HAT + 1297 1 811 812 813 814 # CAT-CAO-CAM-CAP + 1298 2 811 812 813 819 # CAT-CAO-CAM-HAT + 1299 1 811 816 815 814 # CAT-CAO-CAM-CAP + 1300 2 811 816 815 821 # CAT-CAO-CAM-HAT + 1301 3 812 811 816 815 # CAO-CAT-CAO-CAM + 1302 4 812 811 816 822 # CAO-CAT-CAO-HAT + 1303 5 812 813 814 815 # CAO-CAM-CAP-CAM + 1304 6 812 813 814 820 # CAO-CAM-CAP-HAT + 1305 7 817 811 812 813 # CTT-CAT-CAO-CAM + 1306 3 816 811 812 813 # CAO-CAT-CAO-CAM + 1307 5 816 815 814 813 # CAO-CAM-CAP-CAM + 1308 8 813 814 815 821 # CAM-CAP-CAM-HAT + 1309 9 814 813 812 818 # CAP-CAM-CAO-HAT + 1310 9 814 815 816 822 # CAP-CAM-CAO-HAT + 1311 8 815 814 813 819 # CAM-CAP-CAM-HAT + 1312 7 817 811 816 815 # CTT-CAT-CAO-CAM + 1313 6 816 815 814 820 # CAO-CAM-CAP-HAT + 1314 4 816 811 812 818 # CAO-CAT-CAO-HAT + 1315 10 817 811 812 818 # CTT-CAT-CAO-HAT + 1316 10 817 811 816 822 # CTT-CAT-CAO-HAT + 1317 11 818 812 813 819 # HAT-CAO-CAM-HAT + 1318 12 819 813 814 820 # HAT-CAM-CAP-HAT + 1319 12 821 815 814 820 # HAT-CAM-CAP-HAT + 1320 11 822 816 815 821 # HAT-CAO-CAM-HAT + 1321 1 826 827 828 829 # CAT-CAO-CAM-CAP + 1322 2 826 827 828 834 # CAT-CAO-CAM-HAT + 1323 1 826 831 830 829 # CAT-CAO-CAM-CAP + 1324 2 826 831 830 836 # CAT-CAO-CAM-HAT + 1325 3 827 826 831 830 # CAO-CAT-CAO-CAM + 1326 4 827 826 831 837 # CAO-CAT-CAO-HAT + 1327 5 827 828 829 830 # CAO-CAM-CAP-CAM + 1328 6 827 828 829 835 # CAO-CAM-CAP-HAT + 1329 7 832 826 827 828 # CTT-CAT-CAO-CAM + 1330 3 831 826 827 828 # CAO-CAT-CAO-CAM + 1331 5 831 830 829 828 # CAO-CAM-CAP-CAM + 1332 8 828 829 830 836 # CAM-CAP-CAM-HAT + 1333 9 829 828 827 833 # CAP-CAM-CAO-HAT + 1334 9 829 830 831 837 # CAP-CAM-CAO-HAT + 1335 8 830 829 828 834 # CAM-CAP-CAM-HAT + 1336 7 832 826 831 830 # CTT-CAT-CAO-CAM + 1337 6 831 830 829 835 # CAO-CAM-CAP-HAT + 1338 4 831 826 827 833 # CAO-CAT-CAO-HAT + 1339 10 832 826 827 833 # CTT-CAT-CAO-HAT + 1340 10 832 826 831 837 # CTT-CAT-CAO-HAT + 1341 11 833 827 828 834 # HAT-CAO-CAM-HAT + 1342 12 834 828 829 835 # HAT-CAM-CAP-HAT + 1343 12 836 830 829 835 # HAT-CAM-CAP-HAT + 1344 11 837 831 830 836 # HAT-CAO-CAM-HAT + 1345 1 841 842 843 844 # CAT-CAO-CAM-CAP + 1346 2 841 842 843 849 # CAT-CAO-CAM-HAT + 1347 1 841 846 845 844 # CAT-CAO-CAM-CAP + 1348 2 841 846 845 851 # CAT-CAO-CAM-HAT + 1349 3 842 841 846 845 # CAO-CAT-CAO-CAM + 1350 4 842 841 846 852 # CAO-CAT-CAO-HAT + 1351 5 842 843 844 845 # CAO-CAM-CAP-CAM + 1352 6 842 843 844 850 # CAO-CAM-CAP-HAT + 1353 7 847 841 842 843 # CTT-CAT-CAO-CAM + 1354 3 846 841 842 843 # CAO-CAT-CAO-CAM + 1355 5 846 845 844 843 # CAO-CAM-CAP-CAM + 1356 8 843 844 845 851 # CAM-CAP-CAM-HAT + 1357 9 844 843 842 848 # CAP-CAM-CAO-HAT + 1358 9 844 845 846 852 # CAP-CAM-CAO-HAT + 1359 8 845 844 843 849 # CAM-CAP-CAM-HAT + 1360 7 847 841 846 845 # CTT-CAT-CAO-CAM + 1361 6 846 845 844 850 # CAO-CAM-CAP-HAT + 1362 4 846 841 842 848 # CAO-CAT-CAO-HAT + 1363 10 847 841 842 848 # CTT-CAT-CAO-HAT + 1364 10 847 841 846 852 # CTT-CAT-CAO-HAT + 1365 11 848 842 843 849 # HAT-CAO-CAM-HAT + 1366 12 849 843 844 850 # HAT-CAM-CAP-HAT + 1367 12 851 845 844 850 # HAT-CAM-CAP-HAT + 1368 11 852 846 845 851 # HAT-CAO-CAM-HAT + 1369 1 856 857 858 859 # CAT-CAO-CAM-CAP + 1370 2 856 857 858 864 # CAT-CAO-CAM-HAT + 1371 1 856 861 860 859 # CAT-CAO-CAM-CAP + 1372 2 856 861 860 866 # CAT-CAO-CAM-HAT + 1373 3 857 856 861 860 # CAO-CAT-CAO-CAM + 1374 4 857 856 861 867 # CAO-CAT-CAO-HAT + 1375 5 857 858 859 860 # CAO-CAM-CAP-CAM + 1376 6 857 858 859 865 # CAO-CAM-CAP-HAT + 1377 7 862 856 857 858 # CTT-CAT-CAO-CAM + 1378 3 861 856 857 858 # CAO-CAT-CAO-CAM + 1379 5 861 860 859 858 # CAO-CAM-CAP-CAM + 1380 8 858 859 860 866 # CAM-CAP-CAM-HAT + 1381 9 859 858 857 863 # CAP-CAM-CAO-HAT + 1382 9 859 860 861 867 # CAP-CAM-CAO-HAT + 1383 8 860 859 858 864 # CAM-CAP-CAM-HAT + 1384 7 862 856 861 860 # CTT-CAT-CAO-CAM + 1385 6 861 860 859 865 # CAO-CAM-CAP-HAT + 1386 4 861 856 857 863 # CAO-CAT-CAO-HAT + 1387 10 862 856 857 863 # CTT-CAT-CAO-HAT + 1388 10 862 856 861 867 # CTT-CAT-CAO-HAT + 1389 11 863 857 858 864 # HAT-CAO-CAM-HAT + 1390 12 864 858 859 865 # HAT-CAM-CAP-HAT + 1391 12 866 860 859 865 # HAT-CAM-CAP-HAT + 1392 11 867 861 860 866 # HAT-CAO-CAM-HAT + 1393 1 871 872 873 874 # CAT-CAO-CAM-CAP + 1394 2 871 872 873 879 # CAT-CAO-CAM-HAT + 1395 1 871 876 875 874 # CAT-CAO-CAM-CAP + 1396 2 871 876 875 881 # CAT-CAO-CAM-HAT + 1397 3 872 871 876 875 # CAO-CAT-CAO-CAM + 1398 4 872 871 876 882 # CAO-CAT-CAO-HAT + 1399 5 872 873 874 875 # CAO-CAM-CAP-CAM + 1400 6 872 873 874 880 # CAO-CAM-CAP-HAT + 1401 7 877 871 872 873 # CTT-CAT-CAO-CAM + 1402 3 876 871 872 873 # CAO-CAT-CAO-CAM + 1403 5 876 875 874 873 # CAO-CAM-CAP-CAM + 1404 8 873 874 875 881 # CAM-CAP-CAM-HAT + 1405 9 874 873 872 878 # CAP-CAM-CAO-HAT + 1406 9 874 875 876 882 # CAP-CAM-CAO-HAT + 1407 8 875 874 873 879 # CAM-CAP-CAM-HAT + 1408 7 877 871 876 875 # CTT-CAT-CAO-CAM + 1409 6 876 875 874 880 # CAO-CAM-CAP-HAT + 1410 4 876 871 872 878 # CAO-CAT-CAO-HAT + 1411 10 877 871 872 878 # CTT-CAT-CAO-HAT + 1412 10 877 871 876 882 # CTT-CAT-CAO-HAT + 1413 11 878 872 873 879 # HAT-CAO-CAM-HAT + 1414 12 879 873 874 880 # HAT-CAM-CAP-HAT + 1415 12 881 875 874 880 # HAT-CAM-CAP-HAT + 1416 11 882 876 875 881 # HAT-CAO-CAM-HAT + 1417 1 886 887 888 889 # CAT-CAO-CAM-CAP + 1418 2 886 887 888 894 # CAT-CAO-CAM-HAT + 1419 1 886 891 890 889 # CAT-CAO-CAM-CAP + 1420 2 886 891 890 896 # CAT-CAO-CAM-HAT + 1421 3 887 886 891 890 # CAO-CAT-CAO-CAM + 1422 4 887 886 891 897 # CAO-CAT-CAO-HAT + 1423 5 887 888 889 890 # CAO-CAM-CAP-CAM + 1424 6 887 888 889 895 # CAO-CAM-CAP-HAT + 1425 7 892 886 887 888 # CTT-CAT-CAO-CAM + 1426 3 891 886 887 888 # CAO-CAT-CAO-CAM + 1427 5 891 890 889 888 # CAO-CAM-CAP-CAM + 1428 8 888 889 890 896 # CAM-CAP-CAM-HAT + 1429 9 889 888 887 893 # CAP-CAM-CAO-HAT + 1430 9 889 890 891 897 # CAP-CAM-CAO-HAT + 1431 8 890 889 888 894 # CAM-CAP-CAM-HAT + 1432 7 892 886 891 890 # CTT-CAT-CAO-CAM + 1433 6 891 890 889 895 # CAO-CAM-CAP-HAT + 1434 4 891 886 887 893 # CAO-CAT-CAO-HAT + 1435 10 892 886 887 893 # CTT-CAT-CAO-HAT + 1436 10 892 886 891 897 # CTT-CAT-CAO-HAT + 1437 11 893 887 888 894 # HAT-CAO-CAM-HAT + 1438 12 894 888 889 895 # HAT-CAM-CAP-HAT + 1439 12 896 890 889 895 # HAT-CAM-CAP-HAT + 1440 11 897 891 890 896 # HAT-CAO-CAM-HAT + 1441 1 901 902 903 904 # CAT-CAO-CAM-CAP + 1442 2 901 902 903 909 # CAT-CAO-CAM-HAT + 1443 1 901 906 905 904 # CAT-CAO-CAM-CAP + 1444 2 901 906 905 911 # CAT-CAO-CAM-HAT + 1445 3 902 901 906 905 # CAO-CAT-CAO-CAM + 1446 4 902 901 906 912 # CAO-CAT-CAO-HAT + 1447 5 902 903 904 905 # CAO-CAM-CAP-CAM + 1448 6 902 903 904 910 # CAO-CAM-CAP-HAT + 1449 7 907 901 902 903 # CTT-CAT-CAO-CAM + 1450 3 906 901 902 903 # CAO-CAT-CAO-CAM + 1451 5 906 905 904 903 # CAO-CAM-CAP-CAM + 1452 8 903 904 905 911 # CAM-CAP-CAM-HAT + 1453 9 904 903 902 908 # CAP-CAM-CAO-HAT + 1454 9 904 905 906 912 # CAP-CAM-CAO-HAT + 1455 8 905 904 903 909 # CAM-CAP-CAM-HAT + 1456 7 907 901 906 905 # CTT-CAT-CAO-CAM + 1457 6 906 905 904 910 # CAO-CAM-CAP-HAT + 1458 4 906 901 902 908 # CAO-CAT-CAO-HAT + 1459 10 907 901 902 908 # CTT-CAT-CAO-HAT + 1460 10 907 901 906 912 # CTT-CAT-CAO-HAT + 1461 11 908 902 903 909 # HAT-CAO-CAM-HAT + 1462 12 909 903 904 910 # HAT-CAM-CAP-HAT + 1463 12 911 905 904 910 # HAT-CAM-CAP-HAT + 1464 11 912 906 905 911 # HAT-CAO-CAM-HAT + 1465 1 916 917 918 919 # CAT-CAO-CAM-CAP + 1466 2 916 917 918 924 # CAT-CAO-CAM-HAT + 1467 1 916 921 920 919 # CAT-CAO-CAM-CAP + 1468 2 916 921 920 926 # CAT-CAO-CAM-HAT + 1469 3 917 916 921 920 # CAO-CAT-CAO-CAM + 1470 4 917 916 921 927 # CAO-CAT-CAO-HAT + 1471 5 917 918 919 920 # CAO-CAM-CAP-CAM + 1472 6 917 918 919 925 # CAO-CAM-CAP-HAT + 1473 7 922 916 917 918 # CTT-CAT-CAO-CAM + 1474 3 921 916 917 918 # CAO-CAT-CAO-CAM + 1475 5 921 920 919 918 # CAO-CAM-CAP-CAM + 1476 8 918 919 920 926 # CAM-CAP-CAM-HAT + 1477 9 919 918 917 923 # CAP-CAM-CAO-HAT + 1478 9 919 920 921 927 # CAP-CAM-CAO-HAT + 1479 8 920 919 918 924 # CAM-CAP-CAM-HAT + 1480 7 922 916 921 920 # CTT-CAT-CAO-CAM + 1481 6 921 920 919 925 # CAO-CAM-CAP-HAT + 1482 4 921 916 917 923 # CAO-CAT-CAO-HAT + 1483 10 922 916 917 923 # CTT-CAT-CAO-HAT + 1484 10 922 916 921 927 # CTT-CAT-CAO-HAT + 1485 11 923 917 918 924 # HAT-CAO-CAM-HAT + 1486 12 924 918 919 925 # HAT-CAM-CAP-HAT + 1487 12 926 920 919 925 # HAT-CAM-CAP-HAT + 1488 11 927 921 920 926 # HAT-CAO-CAM-HAT + 1489 1 931 932 933 934 # CAT-CAO-CAM-CAP + 1490 2 931 932 933 939 # CAT-CAO-CAM-HAT + 1491 1 931 936 935 934 # CAT-CAO-CAM-CAP + 1492 2 931 936 935 941 # CAT-CAO-CAM-HAT + 1493 3 932 931 936 935 # CAO-CAT-CAO-CAM + 1494 4 932 931 936 942 # CAO-CAT-CAO-HAT + 1495 5 932 933 934 935 # CAO-CAM-CAP-CAM + 1496 6 932 933 934 940 # CAO-CAM-CAP-HAT + 1497 7 937 931 932 933 # CTT-CAT-CAO-CAM + 1498 3 936 931 932 933 # CAO-CAT-CAO-CAM + 1499 5 936 935 934 933 # CAO-CAM-CAP-CAM + 1500 8 933 934 935 941 # CAM-CAP-CAM-HAT + 1501 9 934 933 932 938 # CAP-CAM-CAO-HAT + 1502 9 934 935 936 942 # CAP-CAM-CAO-HAT + 1503 8 935 934 933 939 # CAM-CAP-CAM-HAT + 1504 7 937 931 936 935 # CTT-CAT-CAO-CAM + 1505 6 936 935 934 940 # CAO-CAM-CAP-HAT + 1506 4 936 931 932 938 # CAO-CAT-CAO-HAT + 1507 10 937 931 932 938 # CTT-CAT-CAO-HAT + 1508 10 937 931 936 942 # CTT-CAT-CAO-HAT + 1509 11 938 932 933 939 # HAT-CAO-CAM-HAT + 1510 12 939 933 934 940 # HAT-CAM-CAP-HAT + 1511 12 941 935 934 940 # HAT-CAM-CAP-HAT + 1512 11 942 936 935 941 # HAT-CAO-CAM-HAT + 1513 1 946 947 948 949 # CAT-CAO-CAM-CAP + 1514 2 946 947 948 954 # CAT-CAO-CAM-HAT + 1515 1 946 951 950 949 # CAT-CAO-CAM-CAP + 1516 2 946 951 950 956 # CAT-CAO-CAM-HAT + 1517 3 947 946 951 950 # CAO-CAT-CAO-CAM + 1518 4 947 946 951 957 # CAO-CAT-CAO-HAT + 1519 5 947 948 949 950 # CAO-CAM-CAP-CAM + 1520 6 947 948 949 955 # CAO-CAM-CAP-HAT + 1521 7 952 946 947 948 # CTT-CAT-CAO-CAM + 1522 3 951 946 947 948 # CAO-CAT-CAO-CAM + 1523 5 951 950 949 948 # CAO-CAM-CAP-CAM + 1524 8 948 949 950 956 # CAM-CAP-CAM-HAT + 1525 9 949 948 947 953 # CAP-CAM-CAO-HAT + 1526 9 949 950 951 957 # CAP-CAM-CAO-HAT + 1527 8 950 949 948 954 # CAM-CAP-CAM-HAT + 1528 7 952 946 951 950 # CTT-CAT-CAO-CAM + 1529 6 951 950 949 955 # CAO-CAM-CAP-HAT + 1530 4 951 946 947 953 # CAO-CAT-CAO-HAT + 1531 10 952 946 947 953 # CTT-CAT-CAO-HAT + 1532 10 952 946 951 957 # CTT-CAT-CAO-HAT + 1533 11 953 947 948 954 # HAT-CAO-CAM-HAT + 1534 12 954 948 949 955 # HAT-CAM-CAP-HAT + 1535 12 956 950 949 955 # HAT-CAM-CAP-HAT + 1536 11 957 951 950 956 # HAT-CAO-CAM-HAT + 1537 1 961 962 963 964 # CAT-CAO-CAM-CAP + 1538 2 961 962 963 969 # CAT-CAO-CAM-HAT + 1539 1 961 966 965 964 # CAT-CAO-CAM-CAP + 1540 2 961 966 965 971 # CAT-CAO-CAM-HAT + 1541 3 962 961 966 965 # CAO-CAT-CAO-CAM + 1542 4 962 961 966 972 # CAO-CAT-CAO-HAT + 1543 5 962 963 964 965 # CAO-CAM-CAP-CAM + 1544 6 962 963 964 970 # CAO-CAM-CAP-HAT + 1545 7 967 961 962 963 # CTT-CAT-CAO-CAM + 1546 3 966 961 962 963 # CAO-CAT-CAO-CAM + 1547 5 966 965 964 963 # CAO-CAM-CAP-CAM + 1548 8 963 964 965 971 # CAM-CAP-CAM-HAT + 1549 9 964 963 962 968 # CAP-CAM-CAO-HAT + 1550 9 964 965 966 972 # CAP-CAM-CAO-HAT + 1551 8 965 964 963 969 # CAM-CAP-CAM-HAT + 1552 7 967 961 966 965 # CTT-CAT-CAO-CAM + 1553 6 966 965 964 970 # CAO-CAM-CAP-HAT + 1554 4 966 961 962 968 # CAO-CAT-CAO-HAT + 1555 10 967 961 962 968 # CTT-CAT-CAO-HAT + 1556 10 967 961 966 972 # CTT-CAT-CAO-HAT + 1557 11 968 962 963 969 # HAT-CAO-CAM-HAT + 1558 12 969 963 964 970 # HAT-CAM-CAP-HAT + 1559 12 971 965 964 970 # HAT-CAM-CAP-HAT + 1560 11 972 966 965 971 # HAT-CAO-CAM-HAT + 1561 1 976 977 978 979 # CAT-CAO-CAM-CAP + 1562 2 976 977 978 984 # CAT-CAO-CAM-HAT + 1563 1 976 981 980 979 # CAT-CAO-CAM-CAP + 1564 2 976 981 980 986 # CAT-CAO-CAM-HAT + 1565 3 977 976 981 980 # CAO-CAT-CAO-CAM + 1566 4 977 976 981 987 # CAO-CAT-CAO-HAT + 1567 5 977 978 979 980 # CAO-CAM-CAP-CAM + 1568 6 977 978 979 985 # CAO-CAM-CAP-HAT + 1569 7 982 976 977 978 # CTT-CAT-CAO-CAM + 1570 3 981 976 977 978 # CAO-CAT-CAO-CAM + 1571 5 981 980 979 978 # CAO-CAM-CAP-CAM + 1572 8 978 979 980 986 # CAM-CAP-CAM-HAT + 1573 9 979 978 977 983 # CAP-CAM-CAO-HAT + 1574 9 979 980 981 987 # CAP-CAM-CAO-HAT + 1575 8 980 979 978 984 # CAM-CAP-CAM-HAT + 1576 7 982 976 981 980 # CTT-CAT-CAO-CAM + 1577 6 981 980 979 985 # CAO-CAM-CAP-HAT + 1578 4 981 976 977 983 # CAO-CAT-CAO-HAT + 1579 10 982 976 977 983 # CTT-CAT-CAO-HAT + 1580 10 982 976 981 987 # CTT-CAT-CAO-HAT + 1581 11 983 977 978 984 # HAT-CAO-CAM-HAT + 1582 12 984 978 979 985 # HAT-CAM-CAP-HAT + 1583 12 986 980 979 985 # HAT-CAM-CAP-HAT + 1584 11 987 981 980 986 # HAT-CAO-CAM-HAT + 1585 1 991 992 993 994 # CAT-CAO-CAM-CAP + 1586 2 991 992 993 999 # CAT-CAO-CAM-HAT + 1587 1 991 996 995 994 # CAT-CAO-CAM-CAP + 1588 2 991 996 995 1001 # CAT-CAO-CAM-HAT + 1589 3 992 991 996 995 # CAO-CAT-CAO-CAM + 1590 4 992 991 996 1002 # CAO-CAT-CAO-HAT + 1591 5 992 993 994 995 # CAO-CAM-CAP-CAM + 1592 6 992 993 994 1000 # CAO-CAM-CAP-HAT + 1593 7 997 991 992 993 # CTT-CAT-CAO-CAM + 1594 3 996 991 992 993 # CAO-CAT-CAO-CAM + 1595 5 996 995 994 993 # CAO-CAM-CAP-CAM + 1596 8 993 994 995 1001 # CAM-CAP-CAM-HAT + 1597 9 994 993 992 998 # CAP-CAM-CAO-HAT + 1598 9 994 995 996 1002 # CAP-CAM-CAO-HAT + 1599 8 995 994 993 999 # CAM-CAP-CAM-HAT + 1600 7 997 991 996 995 # CTT-CAT-CAO-CAM + 1601 6 996 995 994 1000 # CAO-CAM-CAP-HAT + 1602 4 996 991 992 998 # CAO-CAT-CAO-HAT + 1603 10 997 991 992 998 # CTT-CAT-CAO-HAT + 1604 10 997 991 996 1002 # CTT-CAT-CAO-HAT + 1605 11 998 992 993 999 # HAT-CAO-CAM-HAT + 1606 12 999 993 994 1000 # HAT-CAM-CAP-HAT + 1607 12 1001 995 994 1000 # HAT-CAM-CAP-HAT + 1608 11 1002 996 995 1001 # HAT-CAO-CAM-HAT + 1609 1 1006 1007 1008 1009 # CAT-CAO-CAM-CAP + 1610 2 1006 1007 1008 1014 # CAT-CAO-CAM-HAT + 1611 1 1006 1011 1010 1009 # CAT-CAO-CAM-CAP + 1612 2 1006 1011 1010 1016 # CAT-CAO-CAM-HAT + 1613 3 1007 1006 1011 1010 # CAO-CAT-CAO-CAM + 1614 4 1007 1006 1011 1017 # CAO-CAT-CAO-HAT + 1615 5 1007 1008 1009 1010 # CAO-CAM-CAP-CAM + 1616 6 1007 1008 1009 1015 # CAO-CAM-CAP-HAT + 1617 7 1012 1006 1007 1008 # CTT-CAT-CAO-CAM + 1618 3 1011 1006 1007 1008 # CAO-CAT-CAO-CAM + 1619 5 1011 1010 1009 1008 # CAO-CAM-CAP-CAM + 1620 8 1008 1009 1010 1016 # CAM-CAP-CAM-HAT + 1621 9 1009 1008 1007 1013 # CAP-CAM-CAO-HAT + 1622 9 1009 1010 1011 1017 # CAP-CAM-CAO-HAT + 1623 8 1010 1009 1008 1014 # CAM-CAP-CAM-HAT + 1624 7 1012 1006 1011 1010 # CTT-CAT-CAO-CAM + 1625 6 1011 1010 1009 1015 # CAO-CAM-CAP-HAT + 1626 4 1011 1006 1007 1013 # CAO-CAT-CAO-HAT + 1627 10 1012 1006 1007 1013 # CTT-CAT-CAO-HAT + 1628 10 1012 1006 1011 1017 # CTT-CAT-CAO-HAT + 1629 11 1013 1007 1008 1014 # HAT-CAO-CAM-HAT + 1630 12 1014 1008 1009 1015 # HAT-CAM-CAP-HAT + 1631 12 1016 1010 1009 1015 # HAT-CAM-CAP-HAT + 1632 11 1017 1011 1010 1016 # HAT-CAO-CAM-HAT + 1633 1 1021 1022 1023 1024 # CAT-CAO-CAM-CAP + 1634 2 1021 1022 1023 1029 # CAT-CAO-CAM-HAT + 1635 1 1021 1026 1025 1024 # CAT-CAO-CAM-CAP + 1636 2 1021 1026 1025 1031 # CAT-CAO-CAM-HAT + 1637 3 1022 1021 1026 1025 # CAO-CAT-CAO-CAM + 1638 4 1022 1021 1026 1032 # CAO-CAT-CAO-HAT + 1639 5 1022 1023 1024 1025 # CAO-CAM-CAP-CAM + 1640 6 1022 1023 1024 1030 # CAO-CAM-CAP-HAT + 1641 7 1027 1021 1022 1023 # CTT-CAT-CAO-CAM + 1642 3 1026 1021 1022 1023 # CAO-CAT-CAO-CAM + 1643 5 1026 1025 1024 1023 # CAO-CAM-CAP-CAM + 1644 8 1023 1024 1025 1031 # CAM-CAP-CAM-HAT + 1645 9 1024 1023 1022 1028 # CAP-CAM-CAO-HAT + 1646 9 1024 1025 1026 1032 # CAP-CAM-CAO-HAT + 1647 8 1025 1024 1023 1029 # CAM-CAP-CAM-HAT + 1648 7 1027 1021 1026 1025 # CTT-CAT-CAO-CAM + 1649 6 1026 1025 1024 1030 # CAO-CAM-CAP-HAT + 1650 4 1026 1021 1022 1028 # CAO-CAT-CAO-HAT + 1651 10 1027 1021 1022 1028 # CTT-CAT-CAO-HAT + 1652 10 1027 1021 1026 1032 # CTT-CAT-CAO-HAT + 1653 11 1028 1022 1023 1029 # HAT-CAO-CAM-HAT + 1654 12 1029 1023 1024 1030 # HAT-CAM-CAP-HAT + 1655 12 1031 1025 1024 1030 # HAT-CAM-CAP-HAT + 1656 11 1032 1026 1025 1031 # HAT-CAO-CAM-HAT + 1657 1 1036 1037 1038 1039 # CAT-CAO-CAM-CAP + 1658 2 1036 1037 1038 1044 # CAT-CAO-CAM-HAT + 1659 1 1036 1041 1040 1039 # CAT-CAO-CAM-CAP + 1660 2 1036 1041 1040 1046 # CAT-CAO-CAM-HAT + 1661 3 1037 1036 1041 1040 # CAO-CAT-CAO-CAM + 1662 4 1037 1036 1041 1047 # CAO-CAT-CAO-HAT + 1663 5 1037 1038 1039 1040 # CAO-CAM-CAP-CAM + 1664 6 1037 1038 1039 1045 # CAO-CAM-CAP-HAT + 1665 7 1042 1036 1037 1038 # CTT-CAT-CAO-CAM + 1666 3 1041 1036 1037 1038 # CAO-CAT-CAO-CAM + 1667 5 1041 1040 1039 1038 # CAO-CAM-CAP-CAM + 1668 8 1038 1039 1040 1046 # CAM-CAP-CAM-HAT + 1669 9 1039 1038 1037 1043 # CAP-CAM-CAO-HAT + 1670 9 1039 1040 1041 1047 # CAP-CAM-CAO-HAT + 1671 8 1040 1039 1038 1044 # CAM-CAP-CAM-HAT + 1672 7 1042 1036 1041 1040 # CTT-CAT-CAO-CAM + 1673 6 1041 1040 1039 1045 # CAO-CAM-CAP-HAT + 1674 4 1041 1036 1037 1043 # CAO-CAT-CAO-HAT + 1675 10 1042 1036 1037 1043 # CTT-CAT-CAO-HAT + 1676 10 1042 1036 1041 1047 # CTT-CAT-CAO-HAT + 1677 11 1043 1037 1038 1044 # HAT-CAO-CAM-HAT + 1678 12 1044 1038 1039 1045 # HAT-CAM-CAP-HAT + 1679 12 1046 1040 1039 1045 # HAT-CAM-CAP-HAT + 1680 11 1047 1041 1040 1046 # HAT-CAO-CAM-HAT + 1681 1 1051 1052 1053 1054 # CAT-CAO-CAM-CAP + 1682 2 1051 1052 1053 1059 # CAT-CAO-CAM-HAT + 1683 1 1051 1056 1055 1054 # CAT-CAO-CAM-CAP + 1684 2 1051 1056 1055 1061 # CAT-CAO-CAM-HAT + 1685 3 1052 1051 1056 1055 # CAO-CAT-CAO-CAM + 1686 4 1052 1051 1056 1062 # CAO-CAT-CAO-HAT + 1687 5 1052 1053 1054 1055 # CAO-CAM-CAP-CAM + 1688 6 1052 1053 1054 1060 # CAO-CAM-CAP-HAT + 1689 7 1057 1051 1052 1053 # CTT-CAT-CAO-CAM + 1690 3 1056 1051 1052 1053 # CAO-CAT-CAO-CAM + 1691 5 1056 1055 1054 1053 # CAO-CAM-CAP-CAM + 1692 8 1053 1054 1055 1061 # CAM-CAP-CAM-HAT + 1693 9 1054 1053 1052 1058 # CAP-CAM-CAO-HAT + 1694 9 1054 1055 1056 1062 # CAP-CAM-CAO-HAT + 1695 8 1055 1054 1053 1059 # CAM-CAP-CAM-HAT + 1696 7 1057 1051 1056 1055 # CTT-CAT-CAO-CAM + 1697 6 1056 1055 1054 1060 # CAO-CAM-CAP-HAT + 1698 4 1056 1051 1052 1058 # CAO-CAT-CAO-HAT + 1699 10 1057 1051 1052 1058 # CTT-CAT-CAO-HAT + 1700 10 1057 1051 1056 1062 # CTT-CAT-CAO-HAT + 1701 11 1058 1052 1053 1059 # HAT-CAO-CAM-HAT + 1702 12 1059 1053 1054 1060 # HAT-CAM-CAP-HAT + 1703 12 1061 1055 1054 1060 # HAT-CAM-CAP-HAT + 1704 11 1062 1056 1055 1061 # HAT-CAO-CAM-HAT + 1705 1 1066 1067 1068 1069 # CAT-CAO-CAM-CAP + 1706 2 1066 1067 1068 1074 # CAT-CAO-CAM-HAT + 1707 1 1066 1071 1070 1069 # CAT-CAO-CAM-CAP + 1708 2 1066 1071 1070 1076 # CAT-CAO-CAM-HAT + 1709 3 1067 1066 1071 1070 # CAO-CAT-CAO-CAM + 1710 4 1067 1066 1071 1077 # CAO-CAT-CAO-HAT + 1711 5 1067 1068 1069 1070 # CAO-CAM-CAP-CAM + 1712 6 1067 1068 1069 1075 # CAO-CAM-CAP-HAT + 1713 7 1072 1066 1067 1068 # CTT-CAT-CAO-CAM + 1714 3 1071 1066 1067 1068 # CAO-CAT-CAO-CAM + 1715 5 1071 1070 1069 1068 # CAO-CAM-CAP-CAM + 1716 8 1068 1069 1070 1076 # CAM-CAP-CAM-HAT + 1717 9 1069 1068 1067 1073 # CAP-CAM-CAO-HAT + 1718 9 1069 1070 1071 1077 # CAP-CAM-CAO-HAT + 1719 8 1070 1069 1068 1074 # CAM-CAP-CAM-HAT + 1720 7 1072 1066 1071 1070 # CTT-CAT-CAO-CAM + 1721 6 1071 1070 1069 1075 # CAO-CAM-CAP-HAT + 1722 4 1071 1066 1067 1073 # CAO-CAT-CAO-HAT + 1723 10 1072 1066 1067 1073 # CTT-CAT-CAO-HAT + 1724 10 1072 1066 1071 1077 # CTT-CAT-CAO-HAT + 1725 11 1073 1067 1068 1074 # HAT-CAO-CAM-HAT + 1726 12 1074 1068 1069 1075 # HAT-CAM-CAP-HAT + 1727 12 1076 1070 1069 1075 # HAT-CAM-CAP-HAT + 1728 11 1077 1071 1070 1076 # HAT-CAO-CAM-HAT + 1729 1 1081 1082 1083 1084 # CAT-CAO-CAM-CAP + 1730 2 1081 1082 1083 1089 # CAT-CAO-CAM-HAT + 1731 1 1081 1086 1085 1084 # CAT-CAO-CAM-CAP + 1732 2 1081 1086 1085 1091 # CAT-CAO-CAM-HAT + 1733 3 1082 1081 1086 1085 # CAO-CAT-CAO-CAM + 1734 4 1082 1081 1086 1092 # CAO-CAT-CAO-HAT + 1735 5 1082 1083 1084 1085 # CAO-CAM-CAP-CAM + 1736 6 1082 1083 1084 1090 # CAO-CAM-CAP-HAT + 1737 7 1087 1081 1082 1083 # CTT-CAT-CAO-CAM + 1738 3 1086 1081 1082 1083 # CAO-CAT-CAO-CAM + 1739 5 1086 1085 1084 1083 # CAO-CAM-CAP-CAM + 1740 8 1083 1084 1085 1091 # CAM-CAP-CAM-HAT + 1741 9 1084 1083 1082 1088 # CAP-CAM-CAO-HAT + 1742 9 1084 1085 1086 1092 # CAP-CAM-CAO-HAT + 1743 8 1085 1084 1083 1089 # CAM-CAP-CAM-HAT + 1744 7 1087 1081 1086 1085 # CTT-CAT-CAO-CAM + 1745 6 1086 1085 1084 1090 # CAO-CAM-CAP-HAT + 1746 4 1086 1081 1082 1088 # CAO-CAT-CAO-HAT + 1747 10 1087 1081 1082 1088 # CTT-CAT-CAO-HAT + 1748 10 1087 1081 1086 1092 # CTT-CAT-CAO-HAT + 1749 11 1088 1082 1083 1089 # HAT-CAO-CAM-HAT + 1750 12 1089 1083 1084 1090 # HAT-CAM-CAP-HAT + 1751 12 1091 1085 1084 1090 # HAT-CAM-CAP-HAT + 1752 11 1092 1086 1085 1091 # HAT-CAO-CAM-HAT + 1753 1 1096 1097 1098 1099 # CAT-CAO-CAM-CAP + 1754 2 1096 1097 1098 1104 # CAT-CAO-CAM-HAT + 1755 1 1096 1101 1100 1099 # CAT-CAO-CAM-CAP + 1756 2 1096 1101 1100 1106 # CAT-CAO-CAM-HAT + 1757 3 1097 1096 1101 1100 # CAO-CAT-CAO-CAM + 1758 4 1097 1096 1101 1107 # CAO-CAT-CAO-HAT + 1759 5 1097 1098 1099 1100 # CAO-CAM-CAP-CAM + 1760 6 1097 1098 1099 1105 # CAO-CAM-CAP-HAT + 1761 7 1102 1096 1097 1098 # CTT-CAT-CAO-CAM + 1762 3 1101 1096 1097 1098 # CAO-CAT-CAO-CAM + 1763 5 1101 1100 1099 1098 # CAO-CAM-CAP-CAM + 1764 8 1098 1099 1100 1106 # CAM-CAP-CAM-HAT + 1765 9 1099 1098 1097 1103 # CAP-CAM-CAO-HAT + 1766 9 1099 1100 1101 1107 # CAP-CAM-CAO-HAT + 1767 8 1100 1099 1098 1104 # CAM-CAP-CAM-HAT + 1768 7 1102 1096 1101 1100 # CTT-CAT-CAO-CAM + 1769 6 1101 1100 1099 1105 # CAO-CAM-CAP-HAT + 1770 4 1101 1096 1097 1103 # CAO-CAT-CAO-HAT + 1771 10 1102 1096 1097 1103 # CTT-CAT-CAO-HAT + 1772 10 1102 1096 1101 1107 # CTT-CAT-CAO-HAT + 1773 11 1103 1097 1098 1104 # HAT-CAO-CAM-HAT + 1774 12 1104 1098 1099 1105 # HAT-CAM-CAP-HAT + 1775 12 1106 1100 1099 1105 # HAT-CAM-CAP-HAT + 1776 11 1107 1101 1100 1106 # HAT-CAO-CAM-HAT + 1777 1 1111 1112 1113 1114 # CAT-CAO-CAM-CAP + 1778 2 1111 1112 1113 1119 # CAT-CAO-CAM-HAT + 1779 1 1111 1116 1115 1114 # CAT-CAO-CAM-CAP + 1780 2 1111 1116 1115 1121 # CAT-CAO-CAM-HAT + 1781 3 1112 1111 1116 1115 # CAO-CAT-CAO-CAM + 1782 4 1112 1111 1116 1122 # CAO-CAT-CAO-HAT + 1783 5 1112 1113 1114 1115 # CAO-CAM-CAP-CAM + 1784 6 1112 1113 1114 1120 # CAO-CAM-CAP-HAT + 1785 7 1117 1111 1112 1113 # CTT-CAT-CAO-CAM + 1786 3 1116 1111 1112 1113 # CAO-CAT-CAO-CAM + 1787 5 1116 1115 1114 1113 # CAO-CAM-CAP-CAM + 1788 8 1113 1114 1115 1121 # CAM-CAP-CAM-HAT + 1789 9 1114 1113 1112 1118 # CAP-CAM-CAO-HAT + 1790 9 1114 1115 1116 1122 # CAP-CAM-CAO-HAT + 1791 8 1115 1114 1113 1119 # CAM-CAP-CAM-HAT + 1792 7 1117 1111 1116 1115 # CTT-CAT-CAO-CAM + 1793 6 1116 1115 1114 1120 # CAO-CAM-CAP-HAT + 1794 4 1116 1111 1112 1118 # CAO-CAT-CAO-HAT + 1795 10 1117 1111 1112 1118 # CTT-CAT-CAO-HAT + 1796 10 1117 1111 1116 1122 # CTT-CAT-CAO-HAT + 1797 11 1118 1112 1113 1119 # HAT-CAO-CAM-HAT + 1798 12 1119 1113 1114 1120 # HAT-CAM-CAP-HAT + 1799 12 1121 1115 1114 1120 # HAT-CAM-CAP-HAT + 1800 11 1122 1116 1115 1121 # HAT-CAO-CAM-HAT + 1801 1 1126 1127 1128 1129 # CAT-CAO-CAM-CAP + 1802 2 1126 1127 1128 1134 # CAT-CAO-CAM-HAT + 1803 1 1126 1131 1130 1129 # CAT-CAO-CAM-CAP + 1804 2 1126 1131 1130 1136 # CAT-CAO-CAM-HAT + 1805 3 1127 1126 1131 1130 # CAO-CAT-CAO-CAM + 1806 4 1127 1126 1131 1137 # CAO-CAT-CAO-HAT + 1807 5 1127 1128 1129 1130 # CAO-CAM-CAP-CAM + 1808 6 1127 1128 1129 1135 # CAO-CAM-CAP-HAT + 1809 7 1132 1126 1127 1128 # CTT-CAT-CAO-CAM + 1810 3 1131 1126 1127 1128 # CAO-CAT-CAO-CAM + 1811 5 1131 1130 1129 1128 # CAO-CAM-CAP-CAM + 1812 8 1128 1129 1130 1136 # CAM-CAP-CAM-HAT + 1813 9 1129 1128 1127 1133 # CAP-CAM-CAO-HAT + 1814 9 1129 1130 1131 1137 # CAP-CAM-CAO-HAT + 1815 8 1130 1129 1128 1134 # CAM-CAP-CAM-HAT + 1816 7 1132 1126 1131 1130 # CTT-CAT-CAO-CAM + 1817 6 1131 1130 1129 1135 # CAO-CAM-CAP-HAT + 1818 4 1131 1126 1127 1133 # CAO-CAT-CAO-HAT + 1819 10 1132 1126 1127 1133 # CTT-CAT-CAO-HAT + 1820 10 1132 1126 1131 1137 # CTT-CAT-CAO-HAT + 1821 11 1133 1127 1128 1134 # HAT-CAO-CAM-HAT + 1822 12 1134 1128 1129 1135 # HAT-CAM-CAP-HAT + 1823 12 1136 1130 1129 1135 # HAT-CAM-CAP-HAT + 1824 11 1137 1131 1130 1136 # HAT-CAO-CAM-HAT + 1825 1 1141 1142 1143 1144 # CAT-CAO-CAM-CAP + 1826 2 1141 1142 1143 1149 # CAT-CAO-CAM-HAT + 1827 1 1141 1146 1145 1144 # CAT-CAO-CAM-CAP + 1828 2 1141 1146 1145 1151 # CAT-CAO-CAM-HAT + 1829 3 1142 1141 1146 1145 # CAO-CAT-CAO-CAM + 1830 4 1142 1141 1146 1152 # CAO-CAT-CAO-HAT + 1831 5 1142 1143 1144 1145 # CAO-CAM-CAP-CAM + 1832 6 1142 1143 1144 1150 # CAO-CAM-CAP-HAT + 1833 7 1147 1141 1142 1143 # CTT-CAT-CAO-CAM + 1834 3 1146 1141 1142 1143 # CAO-CAT-CAO-CAM + 1835 5 1146 1145 1144 1143 # CAO-CAM-CAP-CAM + 1836 8 1143 1144 1145 1151 # CAM-CAP-CAM-HAT + 1837 9 1144 1143 1142 1148 # CAP-CAM-CAO-HAT + 1838 9 1144 1145 1146 1152 # CAP-CAM-CAO-HAT + 1839 8 1145 1144 1143 1149 # CAM-CAP-CAM-HAT + 1840 7 1147 1141 1146 1145 # CTT-CAT-CAO-CAM + 1841 6 1146 1145 1144 1150 # CAO-CAM-CAP-HAT + 1842 4 1146 1141 1142 1148 # CAO-CAT-CAO-HAT + 1843 10 1147 1141 1142 1148 # CTT-CAT-CAO-HAT + 1844 10 1147 1141 1146 1152 # CTT-CAT-CAO-HAT + 1845 11 1148 1142 1143 1149 # HAT-CAO-CAM-HAT + 1846 12 1149 1143 1144 1150 # HAT-CAM-CAP-HAT + 1847 12 1151 1145 1144 1150 # HAT-CAM-CAP-HAT + 1848 11 1152 1146 1145 1151 # HAT-CAO-CAM-HAT + 1849 1 1156 1157 1158 1159 # CAT-CAO-CAM-CAP + 1850 2 1156 1157 1158 1164 # CAT-CAO-CAM-HAT + 1851 1 1156 1161 1160 1159 # CAT-CAO-CAM-CAP + 1852 2 1156 1161 1160 1166 # CAT-CAO-CAM-HAT + 1853 3 1157 1156 1161 1160 # CAO-CAT-CAO-CAM + 1854 4 1157 1156 1161 1167 # CAO-CAT-CAO-HAT + 1855 5 1157 1158 1159 1160 # CAO-CAM-CAP-CAM + 1856 6 1157 1158 1159 1165 # CAO-CAM-CAP-HAT + 1857 7 1162 1156 1157 1158 # CTT-CAT-CAO-CAM + 1858 3 1161 1156 1157 1158 # CAO-CAT-CAO-CAM + 1859 5 1161 1160 1159 1158 # CAO-CAM-CAP-CAM + 1860 8 1158 1159 1160 1166 # CAM-CAP-CAM-HAT + 1861 9 1159 1158 1157 1163 # CAP-CAM-CAO-HAT + 1862 9 1159 1160 1161 1167 # CAP-CAM-CAO-HAT + 1863 8 1160 1159 1158 1164 # CAM-CAP-CAM-HAT + 1864 7 1162 1156 1161 1160 # CTT-CAT-CAO-CAM + 1865 6 1161 1160 1159 1165 # CAO-CAM-CAP-HAT + 1866 4 1161 1156 1157 1163 # CAO-CAT-CAO-HAT + 1867 10 1162 1156 1157 1163 # CTT-CAT-CAO-HAT + 1868 10 1162 1156 1161 1167 # CTT-CAT-CAO-HAT + 1869 11 1163 1157 1158 1164 # HAT-CAO-CAM-HAT + 1870 12 1164 1158 1159 1165 # HAT-CAM-CAP-HAT + 1871 12 1166 1160 1159 1165 # HAT-CAM-CAP-HAT + 1872 11 1167 1161 1160 1166 # HAT-CAO-CAM-HAT + 1873 1 1171 1172 1173 1174 # CAT-CAO-CAM-CAP + 1874 2 1171 1172 1173 1179 # CAT-CAO-CAM-HAT + 1875 1 1171 1176 1175 1174 # CAT-CAO-CAM-CAP + 1876 2 1171 1176 1175 1181 # CAT-CAO-CAM-HAT + 1877 3 1172 1171 1176 1175 # CAO-CAT-CAO-CAM + 1878 4 1172 1171 1176 1182 # CAO-CAT-CAO-HAT + 1879 5 1172 1173 1174 1175 # CAO-CAM-CAP-CAM + 1880 6 1172 1173 1174 1180 # CAO-CAM-CAP-HAT + 1881 7 1177 1171 1172 1173 # CTT-CAT-CAO-CAM + 1882 3 1176 1171 1172 1173 # CAO-CAT-CAO-CAM + 1883 5 1176 1175 1174 1173 # CAO-CAM-CAP-CAM + 1884 8 1173 1174 1175 1181 # CAM-CAP-CAM-HAT + 1885 9 1174 1173 1172 1178 # CAP-CAM-CAO-HAT + 1886 9 1174 1175 1176 1182 # CAP-CAM-CAO-HAT + 1887 8 1175 1174 1173 1179 # CAM-CAP-CAM-HAT + 1888 7 1177 1171 1176 1175 # CTT-CAT-CAO-CAM + 1889 6 1176 1175 1174 1180 # CAO-CAM-CAP-HAT + 1890 4 1176 1171 1172 1178 # CAO-CAT-CAO-HAT + 1891 10 1177 1171 1172 1178 # CTT-CAT-CAO-HAT + 1892 10 1177 1171 1176 1182 # CTT-CAT-CAO-HAT + 1893 11 1178 1172 1173 1179 # HAT-CAO-CAM-HAT + 1894 12 1179 1173 1174 1180 # HAT-CAM-CAP-HAT + 1895 12 1181 1175 1174 1180 # HAT-CAM-CAP-HAT + 1896 11 1182 1176 1175 1181 # HAT-CAO-CAM-HAT + 1897 1 1186 1187 1188 1189 # CAT-CAO-CAM-CAP + 1898 2 1186 1187 1188 1194 # CAT-CAO-CAM-HAT + 1899 1 1186 1191 1190 1189 # CAT-CAO-CAM-CAP + 1900 2 1186 1191 1190 1196 # CAT-CAO-CAM-HAT + 1901 3 1187 1186 1191 1190 # CAO-CAT-CAO-CAM + 1902 4 1187 1186 1191 1197 # CAO-CAT-CAO-HAT + 1903 5 1187 1188 1189 1190 # CAO-CAM-CAP-CAM + 1904 6 1187 1188 1189 1195 # CAO-CAM-CAP-HAT + 1905 7 1192 1186 1187 1188 # CTT-CAT-CAO-CAM + 1906 3 1191 1186 1187 1188 # CAO-CAT-CAO-CAM + 1907 5 1191 1190 1189 1188 # CAO-CAM-CAP-CAM + 1908 8 1188 1189 1190 1196 # CAM-CAP-CAM-HAT + 1909 9 1189 1188 1187 1193 # CAP-CAM-CAO-HAT + 1910 9 1189 1190 1191 1197 # CAP-CAM-CAO-HAT + 1911 8 1190 1189 1188 1194 # CAM-CAP-CAM-HAT + 1912 7 1192 1186 1191 1190 # CTT-CAT-CAO-CAM + 1913 6 1191 1190 1189 1195 # CAO-CAM-CAP-HAT + 1914 4 1191 1186 1187 1193 # CAO-CAT-CAO-HAT + 1915 10 1192 1186 1187 1193 # CTT-CAT-CAO-HAT + 1916 10 1192 1186 1191 1197 # CTT-CAT-CAO-HAT + 1917 11 1193 1187 1188 1194 # HAT-CAO-CAM-HAT + 1918 12 1194 1188 1189 1195 # HAT-CAM-CAP-HAT + 1919 12 1196 1190 1189 1195 # HAT-CAM-CAP-HAT + 1920 11 1197 1191 1190 1196 # HAT-CAO-CAM-HAT + 1921 1 1201 1202 1203 1204 # CAT-CAO-CAM-CAP + 1922 2 1201 1202 1203 1209 # CAT-CAO-CAM-HAT + 1923 1 1201 1206 1205 1204 # CAT-CAO-CAM-CAP + 1924 2 1201 1206 1205 1211 # CAT-CAO-CAM-HAT + 1925 3 1202 1201 1206 1205 # CAO-CAT-CAO-CAM + 1926 4 1202 1201 1206 1212 # CAO-CAT-CAO-HAT + 1927 5 1202 1203 1204 1205 # CAO-CAM-CAP-CAM + 1928 6 1202 1203 1204 1210 # CAO-CAM-CAP-HAT + 1929 7 1207 1201 1202 1203 # CTT-CAT-CAO-CAM + 1930 3 1206 1201 1202 1203 # CAO-CAT-CAO-CAM + 1931 5 1206 1205 1204 1203 # CAO-CAM-CAP-CAM + 1932 8 1203 1204 1205 1211 # CAM-CAP-CAM-HAT + 1933 9 1204 1203 1202 1208 # CAP-CAM-CAO-HAT + 1934 9 1204 1205 1206 1212 # CAP-CAM-CAO-HAT + 1935 8 1205 1204 1203 1209 # CAM-CAP-CAM-HAT + 1936 7 1207 1201 1206 1205 # CTT-CAT-CAO-CAM + 1937 6 1206 1205 1204 1210 # CAO-CAM-CAP-HAT + 1938 4 1206 1201 1202 1208 # CAO-CAT-CAO-HAT + 1939 10 1207 1201 1202 1208 # CTT-CAT-CAO-HAT + 1940 10 1207 1201 1206 1212 # CTT-CAT-CAO-HAT + 1941 11 1208 1202 1203 1209 # HAT-CAO-CAM-HAT + 1942 12 1209 1203 1204 1210 # HAT-CAM-CAP-HAT + 1943 12 1211 1205 1204 1210 # HAT-CAM-CAP-HAT + 1944 11 1212 1206 1205 1211 # HAT-CAO-CAM-HAT + 1945 1 1216 1217 1218 1219 # CAT-CAO-CAM-CAP + 1946 2 1216 1217 1218 1224 # CAT-CAO-CAM-HAT + 1947 1 1216 1221 1220 1219 # CAT-CAO-CAM-CAP + 1948 2 1216 1221 1220 1226 # CAT-CAO-CAM-HAT + 1949 3 1217 1216 1221 1220 # CAO-CAT-CAO-CAM + 1950 4 1217 1216 1221 1227 # CAO-CAT-CAO-HAT + 1951 5 1217 1218 1219 1220 # CAO-CAM-CAP-CAM + 1952 6 1217 1218 1219 1225 # CAO-CAM-CAP-HAT + 1953 7 1222 1216 1217 1218 # CTT-CAT-CAO-CAM + 1954 3 1221 1216 1217 1218 # CAO-CAT-CAO-CAM + 1955 5 1221 1220 1219 1218 # CAO-CAM-CAP-CAM + 1956 8 1218 1219 1220 1226 # CAM-CAP-CAM-HAT + 1957 9 1219 1218 1217 1223 # CAP-CAM-CAO-HAT + 1958 9 1219 1220 1221 1227 # CAP-CAM-CAO-HAT + 1959 8 1220 1219 1218 1224 # CAM-CAP-CAM-HAT + 1960 7 1222 1216 1221 1220 # CTT-CAT-CAO-CAM + 1961 6 1221 1220 1219 1225 # CAO-CAM-CAP-HAT + 1962 4 1221 1216 1217 1223 # CAO-CAT-CAO-HAT + 1963 10 1222 1216 1217 1223 # CTT-CAT-CAO-HAT + 1964 10 1222 1216 1221 1227 # CTT-CAT-CAO-HAT + 1965 11 1223 1217 1218 1224 # HAT-CAO-CAM-HAT + 1966 12 1224 1218 1219 1225 # HAT-CAM-CAP-HAT + 1967 12 1226 1220 1219 1225 # HAT-CAM-CAP-HAT + 1968 11 1227 1221 1220 1226 # HAT-CAO-CAM-HAT + 1969 1 1231 1232 1233 1234 # CAT-CAO-CAM-CAP + 1970 2 1231 1232 1233 1239 # CAT-CAO-CAM-HAT + 1971 1 1231 1236 1235 1234 # CAT-CAO-CAM-CAP + 1972 2 1231 1236 1235 1241 # CAT-CAO-CAM-HAT + 1973 3 1232 1231 1236 1235 # CAO-CAT-CAO-CAM + 1974 4 1232 1231 1236 1242 # CAO-CAT-CAO-HAT + 1975 5 1232 1233 1234 1235 # CAO-CAM-CAP-CAM + 1976 6 1232 1233 1234 1240 # CAO-CAM-CAP-HAT + 1977 7 1237 1231 1232 1233 # CTT-CAT-CAO-CAM + 1978 3 1236 1231 1232 1233 # CAO-CAT-CAO-CAM + 1979 5 1236 1235 1234 1233 # CAO-CAM-CAP-CAM + 1980 8 1233 1234 1235 1241 # CAM-CAP-CAM-HAT + 1981 9 1234 1233 1232 1238 # CAP-CAM-CAO-HAT + 1982 9 1234 1235 1236 1242 # CAP-CAM-CAO-HAT + 1983 8 1235 1234 1233 1239 # CAM-CAP-CAM-HAT + 1984 7 1237 1231 1236 1235 # CTT-CAT-CAO-CAM + 1985 6 1236 1235 1234 1240 # CAO-CAM-CAP-HAT + 1986 4 1236 1231 1232 1238 # CAO-CAT-CAO-HAT + 1987 10 1237 1231 1232 1238 # CTT-CAT-CAO-HAT + 1988 10 1237 1231 1236 1242 # CTT-CAT-CAO-HAT + 1989 11 1238 1232 1233 1239 # HAT-CAO-CAM-HAT + 1990 12 1239 1233 1234 1240 # HAT-CAM-CAP-HAT + 1991 12 1241 1235 1234 1240 # HAT-CAM-CAP-HAT + 1992 11 1242 1236 1235 1241 # HAT-CAO-CAM-HAT + 1993 1 1246 1247 1248 1249 # CAT-CAO-CAM-CAP + 1994 2 1246 1247 1248 1254 # CAT-CAO-CAM-HAT + 1995 1 1246 1251 1250 1249 # CAT-CAO-CAM-CAP + 1996 2 1246 1251 1250 1256 # CAT-CAO-CAM-HAT + 1997 3 1247 1246 1251 1250 # CAO-CAT-CAO-CAM + 1998 4 1247 1246 1251 1257 # CAO-CAT-CAO-HAT + 1999 5 1247 1248 1249 1250 # CAO-CAM-CAP-CAM + 2000 6 1247 1248 1249 1255 # CAO-CAM-CAP-HAT + 2001 7 1252 1246 1247 1248 # CTT-CAT-CAO-CAM + 2002 3 1251 1246 1247 1248 # CAO-CAT-CAO-CAM + 2003 5 1251 1250 1249 1248 # CAO-CAM-CAP-CAM + 2004 8 1248 1249 1250 1256 # CAM-CAP-CAM-HAT + 2005 9 1249 1248 1247 1253 # CAP-CAM-CAO-HAT + 2006 9 1249 1250 1251 1257 # CAP-CAM-CAO-HAT + 2007 8 1250 1249 1248 1254 # CAM-CAP-CAM-HAT + 2008 7 1252 1246 1251 1250 # CTT-CAT-CAO-CAM + 2009 6 1251 1250 1249 1255 # CAO-CAM-CAP-HAT + 2010 4 1251 1246 1247 1253 # CAO-CAT-CAO-HAT + 2011 10 1252 1246 1247 1253 # CTT-CAT-CAO-HAT + 2012 10 1252 1246 1251 1257 # CTT-CAT-CAO-HAT + 2013 11 1253 1247 1248 1254 # HAT-CAO-CAM-HAT + 2014 12 1254 1248 1249 1255 # HAT-CAM-CAP-HAT + 2015 12 1256 1250 1249 1255 # HAT-CAM-CAP-HAT + 2016 11 1257 1251 1250 1256 # HAT-CAO-CAM-HAT + 2017 1 1261 1262 1263 1264 # CAT-CAO-CAM-CAP + 2018 2 1261 1262 1263 1269 # CAT-CAO-CAM-HAT + 2019 1 1261 1266 1265 1264 # CAT-CAO-CAM-CAP + 2020 2 1261 1266 1265 1271 # CAT-CAO-CAM-HAT + 2021 3 1262 1261 1266 1265 # CAO-CAT-CAO-CAM + 2022 4 1262 1261 1266 1272 # CAO-CAT-CAO-HAT + 2023 5 1262 1263 1264 1265 # CAO-CAM-CAP-CAM + 2024 6 1262 1263 1264 1270 # CAO-CAM-CAP-HAT + 2025 7 1267 1261 1262 1263 # CTT-CAT-CAO-CAM + 2026 3 1266 1261 1262 1263 # CAO-CAT-CAO-CAM + 2027 5 1266 1265 1264 1263 # CAO-CAM-CAP-CAM + 2028 8 1263 1264 1265 1271 # CAM-CAP-CAM-HAT + 2029 9 1264 1263 1262 1268 # CAP-CAM-CAO-HAT + 2030 9 1264 1265 1266 1272 # CAP-CAM-CAO-HAT + 2031 8 1265 1264 1263 1269 # CAM-CAP-CAM-HAT + 2032 7 1267 1261 1266 1265 # CTT-CAT-CAO-CAM + 2033 6 1266 1265 1264 1270 # CAO-CAM-CAP-HAT + 2034 4 1266 1261 1262 1268 # CAO-CAT-CAO-HAT + 2035 10 1267 1261 1262 1268 # CTT-CAT-CAO-HAT + 2036 10 1267 1261 1266 1272 # CTT-CAT-CAO-HAT + 2037 11 1268 1262 1263 1269 # HAT-CAO-CAM-HAT + 2038 12 1269 1263 1264 1270 # HAT-CAM-CAP-HAT + 2039 12 1271 1265 1264 1270 # HAT-CAM-CAP-HAT + 2040 11 1272 1266 1265 1271 # HAT-CAO-CAM-HAT + 2041 1 1276 1277 1278 1279 # CAT-CAO-CAM-CAP + 2042 2 1276 1277 1278 1284 # CAT-CAO-CAM-HAT + 2043 1 1276 1281 1280 1279 # CAT-CAO-CAM-CAP + 2044 2 1276 1281 1280 1286 # CAT-CAO-CAM-HAT + 2045 3 1277 1276 1281 1280 # CAO-CAT-CAO-CAM + 2046 4 1277 1276 1281 1287 # CAO-CAT-CAO-HAT + 2047 5 1277 1278 1279 1280 # CAO-CAM-CAP-CAM + 2048 6 1277 1278 1279 1285 # CAO-CAM-CAP-HAT + 2049 7 1282 1276 1277 1278 # CTT-CAT-CAO-CAM + 2050 3 1281 1276 1277 1278 # CAO-CAT-CAO-CAM + 2051 5 1281 1280 1279 1278 # CAO-CAM-CAP-CAM + 2052 8 1278 1279 1280 1286 # CAM-CAP-CAM-HAT + 2053 9 1279 1278 1277 1283 # CAP-CAM-CAO-HAT + 2054 9 1279 1280 1281 1287 # CAP-CAM-CAO-HAT + 2055 8 1280 1279 1278 1284 # CAM-CAP-CAM-HAT + 2056 7 1282 1276 1281 1280 # CTT-CAT-CAO-CAM + 2057 6 1281 1280 1279 1285 # CAO-CAM-CAP-HAT + 2058 4 1281 1276 1277 1283 # CAO-CAT-CAO-HAT + 2059 10 1282 1276 1277 1283 # CTT-CAT-CAO-HAT + 2060 10 1282 1276 1281 1287 # CTT-CAT-CAO-HAT + 2061 11 1283 1277 1278 1284 # HAT-CAO-CAM-HAT + 2062 12 1284 1278 1279 1285 # HAT-CAM-CAP-HAT + 2063 12 1286 1280 1279 1285 # HAT-CAM-CAP-HAT + 2064 11 1287 1281 1280 1286 # HAT-CAO-CAM-HAT + 2065 1 1291 1292 1293 1294 # CAT-CAO-CAM-CAP + 2066 2 1291 1292 1293 1299 # CAT-CAO-CAM-HAT + 2067 1 1291 1296 1295 1294 # CAT-CAO-CAM-CAP + 2068 2 1291 1296 1295 1301 # CAT-CAO-CAM-HAT + 2069 3 1292 1291 1296 1295 # CAO-CAT-CAO-CAM + 2070 4 1292 1291 1296 1302 # CAO-CAT-CAO-HAT + 2071 5 1292 1293 1294 1295 # CAO-CAM-CAP-CAM + 2072 6 1292 1293 1294 1300 # CAO-CAM-CAP-HAT + 2073 7 1297 1291 1292 1293 # CTT-CAT-CAO-CAM + 2074 3 1296 1291 1292 1293 # CAO-CAT-CAO-CAM + 2075 5 1296 1295 1294 1293 # CAO-CAM-CAP-CAM + 2076 8 1293 1294 1295 1301 # CAM-CAP-CAM-HAT + 2077 9 1294 1293 1292 1298 # CAP-CAM-CAO-HAT + 2078 9 1294 1295 1296 1302 # CAP-CAM-CAO-HAT + 2079 8 1295 1294 1293 1299 # CAM-CAP-CAM-HAT + 2080 7 1297 1291 1296 1295 # CTT-CAT-CAO-CAM + 2081 6 1296 1295 1294 1300 # CAO-CAM-CAP-HAT + 2082 4 1296 1291 1292 1298 # CAO-CAT-CAO-HAT + 2083 10 1297 1291 1292 1298 # CTT-CAT-CAO-HAT + 2084 10 1297 1291 1296 1302 # CTT-CAT-CAO-HAT + 2085 11 1298 1292 1293 1299 # HAT-CAO-CAM-HAT + 2086 12 1299 1293 1294 1300 # HAT-CAM-CAP-HAT + 2087 12 1301 1295 1294 1300 # HAT-CAM-CAP-HAT + 2088 11 1302 1296 1295 1301 # HAT-CAO-CAM-HAT + 2089 1 1306 1307 1308 1309 # CAT-CAO-CAM-CAP + 2090 2 1306 1307 1308 1314 # CAT-CAO-CAM-HAT + 2091 1 1306 1311 1310 1309 # CAT-CAO-CAM-CAP + 2092 2 1306 1311 1310 1316 # CAT-CAO-CAM-HAT + 2093 3 1307 1306 1311 1310 # CAO-CAT-CAO-CAM + 2094 4 1307 1306 1311 1317 # CAO-CAT-CAO-HAT + 2095 5 1307 1308 1309 1310 # CAO-CAM-CAP-CAM + 2096 6 1307 1308 1309 1315 # CAO-CAM-CAP-HAT + 2097 7 1312 1306 1307 1308 # CTT-CAT-CAO-CAM + 2098 3 1311 1306 1307 1308 # CAO-CAT-CAO-CAM + 2099 5 1311 1310 1309 1308 # CAO-CAM-CAP-CAM + 2100 8 1308 1309 1310 1316 # CAM-CAP-CAM-HAT + 2101 9 1309 1308 1307 1313 # CAP-CAM-CAO-HAT + 2102 9 1309 1310 1311 1317 # CAP-CAM-CAO-HAT + 2103 8 1310 1309 1308 1314 # CAM-CAP-CAM-HAT + 2104 7 1312 1306 1311 1310 # CTT-CAT-CAO-CAM + 2105 6 1311 1310 1309 1315 # CAO-CAM-CAP-HAT + 2106 4 1311 1306 1307 1313 # CAO-CAT-CAO-HAT + 2107 10 1312 1306 1307 1313 # CTT-CAT-CAO-HAT + 2108 10 1312 1306 1311 1317 # CTT-CAT-CAO-HAT + 2109 11 1313 1307 1308 1314 # HAT-CAO-CAM-HAT + 2110 12 1314 1308 1309 1315 # HAT-CAM-CAP-HAT + 2111 12 1316 1310 1309 1315 # HAT-CAM-CAP-HAT + 2112 11 1317 1311 1310 1316 # HAT-CAO-CAM-HAT + 2113 1 1321 1322 1323 1324 # CAT-CAO-CAM-CAP + 2114 2 1321 1322 1323 1329 # CAT-CAO-CAM-HAT + 2115 1 1321 1326 1325 1324 # CAT-CAO-CAM-CAP + 2116 2 1321 1326 1325 1331 # CAT-CAO-CAM-HAT + 2117 3 1322 1321 1326 1325 # CAO-CAT-CAO-CAM + 2118 4 1322 1321 1326 1332 # CAO-CAT-CAO-HAT + 2119 5 1322 1323 1324 1325 # CAO-CAM-CAP-CAM + 2120 6 1322 1323 1324 1330 # CAO-CAM-CAP-HAT + 2121 7 1327 1321 1322 1323 # CTT-CAT-CAO-CAM + 2122 3 1326 1321 1322 1323 # CAO-CAT-CAO-CAM + 2123 5 1326 1325 1324 1323 # CAO-CAM-CAP-CAM + 2124 8 1323 1324 1325 1331 # CAM-CAP-CAM-HAT + 2125 9 1324 1323 1322 1328 # CAP-CAM-CAO-HAT + 2126 9 1324 1325 1326 1332 # CAP-CAM-CAO-HAT + 2127 8 1325 1324 1323 1329 # CAM-CAP-CAM-HAT + 2128 7 1327 1321 1326 1325 # CTT-CAT-CAO-CAM + 2129 6 1326 1325 1324 1330 # CAO-CAM-CAP-HAT + 2130 4 1326 1321 1322 1328 # CAO-CAT-CAO-HAT + 2131 10 1327 1321 1322 1328 # CTT-CAT-CAO-HAT + 2132 10 1327 1321 1326 1332 # CTT-CAT-CAO-HAT + 2133 11 1328 1322 1323 1329 # HAT-CAO-CAM-HAT + 2134 12 1329 1323 1324 1330 # HAT-CAM-CAP-HAT + 2135 12 1331 1325 1324 1330 # HAT-CAM-CAP-HAT + 2136 11 1332 1326 1325 1331 # HAT-CAO-CAM-HAT + 2137 1 1336 1337 1338 1339 # CAT-CAO-CAM-CAP + 2138 2 1336 1337 1338 1344 # CAT-CAO-CAM-HAT + 2139 1 1336 1341 1340 1339 # CAT-CAO-CAM-CAP + 2140 2 1336 1341 1340 1346 # CAT-CAO-CAM-HAT + 2141 3 1337 1336 1341 1340 # CAO-CAT-CAO-CAM + 2142 4 1337 1336 1341 1347 # CAO-CAT-CAO-HAT + 2143 5 1337 1338 1339 1340 # CAO-CAM-CAP-CAM + 2144 6 1337 1338 1339 1345 # CAO-CAM-CAP-HAT + 2145 7 1342 1336 1337 1338 # CTT-CAT-CAO-CAM + 2146 3 1341 1336 1337 1338 # CAO-CAT-CAO-CAM + 2147 5 1341 1340 1339 1338 # CAO-CAM-CAP-CAM + 2148 8 1338 1339 1340 1346 # CAM-CAP-CAM-HAT + 2149 9 1339 1338 1337 1343 # CAP-CAM-CAO-HAT + 2150 9 1339 1340 1341 1347 # CAP-CAM-CAO-HAT + 2151 8 1340 1339 1338 1344 # CAM-CAP-CAM-HAT + 2152 7 1342 1336 1341 1340 # CTT-CAT-CAO-CAM + 2153 6 1341 1340 1339 1345 # CAO-CAM-CAP-HAT + 2154 4 1341 1336 1337 1343 # CAO-CAT-CAO-HAT + 2155 10 1342 1336 1337 1343 # CTT-CAT-CAO-HAT + 2156 10 1342 1336 1341 1347 # CTT-CAT-CAO-HAT + 2157 11 1343 1337 1338 1344 # HAT-CAO-CAM-HAT + 2158 12 1344 1338 1339 1345 # HAT-CAM-CAP-HAT + 2159 12 1346 1340 1339 1345 # HAT-CAM-CAP-HAT + 2160 11 1347 1341 1340 1346 # HAT-CAO-CAM-HAT + 2161 1 1351 1352 1353 1354 # CAT-CAO-CAM-CAP + 2162 2 1351 1352 1353 1359 # CAT-CAO-CAM-HAT + 2163 1 1351 1356 1355 1354 # CAT-CAO-CAM-CAP + 2164 2 1351 1356 1355 1361 # CAT-CAO-CAM-HAT + 2165 3 1352 1351 1356 1355 # CAO-CAT-CAO-CAM + 2166 4 1352 1351 1356 1362 # CAO-CAT-CAO-HAT + 2167 5 1352 1353 1354 1355 # CAO-CAM-CAP-CAM + 2168 6 1352 1353 1354 1360 # CAO-CAM-CAP-HAT + 2169 7 1357 1351 1352 1353 # CTT-CAT-CAO-CAM + 2170 3 1356 1351 1352 1353 # CAO-CAT-CAO-CAM + 2171 5 1356 1355 1354 1353 # CAO-CAM-CAP-CAM + 2172 8 1353 1354 1355 1361 # CAM-CAP-CAM-HAT + 2173 9 1354 1353 1352 1358 # CAP-CAM-CAO-HAT + 2174 9 1354 1355 1356 1362 # CAP-CAM-CAO-HAT + 2175 8 1355 1354 1353 1359 # CAM-CAP-CAM-HAT + 2176 7 1357 1351 1356 1355 # CTT-CAT-CAO-CAM + 2177 6 1356 1355 1354 1360 # CAO-CAM-CAP-HAT + 2178 4 1356 1351 1352 1358 # CAO-CAT-CAO-HAT + 2179 10 1357 1351 1352 1358 # CTT-CAT-CAO-HAT + 2180 10 1357 1351 1356 1362 # CTT-CAT-CAO-HAT + 2181 11 1358 1352 1353 1359 # HAT-CAO-CAM-HAT + 2182 12 1359 1353 1354 1360 # HAT-CAM-CAP-HAT + 2183 12 1361 1355 1354 1360 # HAT-CAM-CAP-HAT + 2184 11 1362 1356 1355 1361 # HAT-CAO-CAM-HAT + 2185 1 1366 1367 1368 1369 # CAT-CAO-CAM-CAP + 2186 2 1366 1367 1368 1374 # CAT-CAO-CAM-HAT + 2187 1 1366 1371 1370 1369 # CAT-CAO-CAM-CAP + 2188 2 1366 1371 1370 1376 # CAT-CAO-CAM-HAT + 2189 3 1367 1366 1371 1370 # CAO-CAT-CAO-CAM + 2190 4 1367 1366 1371 1377 # CAO-CAT-CAO-HAT + 2191 5 1367 1368 1369 1370 # CAO-CAM-CAP-CAM + 2192 6 1367 1368 1369 1375 # CAO-CAM-CAP-HAT + 2193 7 1372 1366 1367 1368 # CTT-CAT-CAO-CAM + 2194 3 1371 1366 1367 1368 # CAO-CAT-CAO-CAM + 2195 5 1371 1370 1369 1368 # CAO-CAM-CAP-CAM + 2196 8 1368 1369 1370 1376 # CAM-CAP-CAM-HAT + 2197 9 1369 1368 1367 1373 # CAP-CAM-CAO-HAT + 2198 9 1369 1370 1371 1377 # CAP-CAM-CAO-HAT + 2199 8 1370 1369 1368 1374 # CAM-CAP-CAM-HAT + 2200 7 1372 1366 1371 1370 # CTT-CAT-CAO-CAM + 2201 6 1371 1370 1369 1375 # CAO-CAM-CAP-HAT + 2202 4 1371 1366 1367 1373 # CAO-CAT-CAO-HAT + 2203 10 1372 1366 1367 1373 # CTT-CAT-CAO-HAT + 2204 10 1372 1366 1371 1377 # CTT-CAT-CAO-HAT + 2205 11 1373 1367 1368 1374 # HAT-CAO-CAM-HAT + 2206 12 1374 1368 1369 1375 # HAT-CAM-CAP-HAT + 2207 12 1376 1370 1369 1375 # HAT-CAM-CAP-HAT + 2208 11 1377 1371 1370 1376 # HAT-CAO-CAM-HAT + 2209 1 1381 1382 1383 1384 # CAT-CAO-CAM-CAP + 2210 2 1381 1382 1383 1389 # CAT-CAO-CAM-HAT + 2211 1 1381 1386 1385 1384 # CAT-CAO-CAM-CAP + 2212 2 1381 1386 1385 1391 # CAT-CAO-CAM-HAT + 2213 3 1382 1381 1386 1385 # CAO-CAT-CAO-CAM + 2214 4 1382 1381 1386 1392 # CAO-CAT-CAO-HAT + 2215 5 1382 1383 1384 1385 # CAO-CAM-CAP-CAM + 2216 6 1382 1383 1384 1390 # CAO-CAM-CAP-HAT + 2217 7 1387 1381 1382 1383 # CTT-CAT-CAO-CAM + 2218 3 1386 1381 1382 1383 # CAO-CAT-CAO-CAM + 2219 5 1386 1385 1384 1383 # CAO-CAM-CAP-CAM + 2220 8 1383 1384 1385 1391 # CAM-CAP-CAM-HAT + 2221 9 1384 1383 1382 1388 # CAP-CAM-CAO-HAT + 2222 9 1384 1385 1386 1392 # CAP-CAM-CAO-HAT + 2223 8 1385 1384 1383 1389 # CAM-CAP-CAM-HAT + 2224 7 1387 1381 1386 1385 # CTT-CAT-CAO-CAM + 2225 6 1386 1385 1384 1390 # CAO-CAM-CAP-HAT + 2226 4 1386 1381 1382 1388 # CAO-CAT-CAO-HAT + 2227 10 1387 1381 1382 1388 # CTT-CAT-CAO-HAT + 2228 10 1387 1381 1386 1392 # CTT-CAT-CAO-HAT + 2229 11 1388 1382 1383 1389 # HAT-CAO-CAM-HAT + 2230 12 1389 1383 1384 1390 # HAT-CAM-CAP-HAT + 2231 12 1391 1385 1384 1390 # HAT-CAM-CAP-HAT + 2232 11 1392 1386 1385 1391 # HAT-CAO-CAM-HAT + 2233 1 1396 1397 1398 1399 # CAT-CAO-CAM-CAP + 2234 2 1396 1397 1398 1404 # CAT-CAO-CAM-HAT + 2235 1 1396 1401 1400 1399 # CAT-CAO-CAM-CAP + 2236 2 1396 1401 1400 1406 # CAT-CAO-CAM-HAT + 2237 3 1397 1396 1401 1400 # CAO-CAT-CAO-CAM + 2238 4 1397 1396 1401 1407 # CAO-CAT-CAO-HAT + 2239 5 1397 1398 1399 1400 # CAO-CAM-CAP-CAM + 2240 6 1397 1398 1399 1405 # CAO-CAM-CAP-HAT + 2241 7 1402 1396 1397 1398 # CTT-CAT-CAO-CAM + 2242 3 1401 1396 1397 1398 # CAO-CAT-CAO-CAM + 2243 5 1401 1400 1399 1398 # CAO-CAM-CAP-CAM + 2244 8 1398 1399 1400 1406 # CAM-CAP-CAM-HAT + 2245 9 1399 1398 1397 1403 # CAP-CAM-CAO-HAT + 2246 9 1399 1400 1401 1407 # CAP-CAM-CAO-HAT + 2247 8 1400 1399 1398 1404 # CAM-CAP-CAM-HAT + 2248 7 1402 1396 1401 1400 # CTT-CAT-CAO-CAM + 2249 6 1401 1400 1399 1405 # CAO-CAM-CAP-HAT + 2250 4 1401 1396 1397 1403 # CAO-CAT-CAO-HAT + 2251 10 1402 1396 1397 1403 # CTT-CAT-CAO-HAT + 2252 10 1402 1396 1401 1407 # CTT-CAT-CAO-HAT + 2253 11 1403 1397 1398 1404 # HAT-CAO-CAM-HAT + 2254 12 1404 1398 1399 1405 # HAT-CAM-CAP-HAT + 2255 12 1406 1400 1399 1405 # HAT-CAM-CAP-HAT + 2256 11 1407 1401 1400 1406 # HAT-CAO-CAM-HAT + 2257 1 1411 1412 1413 1414 # CAT-CAO-CAM-CAP + 2258 2 1411 1412 1413 1419 # CAT-CAO-CAM-HAT + 2259 1 1411 1416 1415 1414 # CAT-CAO-CAM-CAP + 2260 2 1411 1416 1415 1421 # CAT-CAO-CAM-HAT + 2261 3 1412 1411 1416 1415 # CAO-CAT-CAO-CAM + 2262 4 1412 1411 1416 1422 # CAO-CAT-CAO-HAT + 2263 5 1412 1413 1414 1415 # CAO-CAM-CAP-CAM + 2264 6 1412 1413 1414 1420 # CAO-CAM-CAP-HAT + 2265 7 1417 1411 1412 1413 # CTT-CAT-CAO-CAM + 2266 3 1416 1411 1412 1413 # CAO-CAT-CAO-CAM + 2267 5 1416 1415 1414 1413 # CAO-CAM-CAP-CAM + 2268 8 1413 1414 1415 1421 # CAM-CAP-CAM-HAT + 2269 9 1414 1413 1412 1418 # CAP-CAM-CAO-HAT + 2270 9 1414 1415 1416 1422 # CAP-CAM-CAO-HAT + 2271 8 1415 1414 1413 1419 # CAM-CAP-CAM-HAT + 2272 7 1417 1411 1416 1415 # CTT-CAT-CAO-CAM + 2273 6 1416 1415 1414 1420 # CAO-CAM-CAP-HAT + 2274 4 1416 1411 1412 1418 # CAO-CAT-CAO-HAT + 2275 10 1417 1411 1412 1418 # CTT-CAT-CAO-HAT + 2276 10 1417 1411 1416 1422 # CTT-CAT-CAO-HAT + 2277 11 1418 1412 1413 1419 # HAT-CAO-CAM-HAT + 2278 12 1419 1413 1414 1420 # HAT-CAM-CAP-HAT + 2279 12 1421 1415 1414 1420 # HAT-CAM-CAP-HAT + 2280 11 1422 1416 1415 1421 # HAT-CAO-CAM-HAT + 2281 1 1426 1427 1428 1429 # CAT-CAO-CAM-CAP + 2282 2 1426 1427 1428 1434 # CAT-CAO-CAM-HAT + 2283 1 1426 1431 1430 1429 # CAT-CAO-CAM-CAP + 2284 2 1426 1431 1430 1436 # CAT-CAO-CAM-HAT + 2285 3 1427 1426 1431 1430 # CAO-CAT-CAO-CAM + 2286 4 1427 1426 1431 1437 # CAO-CAT-CAO-HAT + 2287 5 1427 1428 1429 1430 # CAO-CAM-CAP-CAM + 2288 6 1427 1428 1429 1435 # CAO-CAM-CAP-HAT + 2289 7 1432 1426 1427 1428 # CTT-CAT-CAO-CAM + 2290 3 1431 1426 1427 1428 # CAO-CAT-CAO-CAM + 2291 5 1431 1430 1429 1428 # CAO-CAM-CAP-CAM + 2292 8 1428 1429 1430 1436 # CAM-CAP-CAM-HAT + 2293 9 1429 1428 1427 1433 # CAP-CAM-CAO-HAT + 2294 9 1429 1430 1431 1437 # CAP-CAM-CAO-HAT + 2295 8 1430 1429 1428 1434 # CAM-CAP-CAM-HAT + 2296 7 1432 1426 1431 1430 # CTT-CAT-CAO-CAM + 2297 6 1431 1430 1429 1435 # CAO-CAM-CAP-HAT + 2298 4 1431 1426 1427 1433 # CAO-CAT-CAO-HAT + 2299 10 1432 1426 1427 1433 # CTT-CAT-CAO-HAT + 2300 10 1432 1426 1431 1437 # CTT-CAT-CAO-HAT + 2301 11 1433 1427 1428 1434 # HAT-CAO-CAM-HAT + 2302 12 1434 1428 1429 1435 # HAT-CAM-CAP-HAT + 2303 12 1436 1430 1429 1435 # HAT-CAM-CAP-HAT + 2304 11 1437 1431 1430 1436 # HAT-CAO-CAM-HAT + 2305 1 1441 1442 1443 1444 # CAT-CAO-CAM-CAP + 2306 2 1441 1442 1443 1449 # CAT-CAO-CAM-HAT + 2307 1 1441 1446 1445 1444 # CAT-CAO-CAM-CAP + 2308 2 1441 1446 1445 1451 # CAT-CAO-CAM-HAT + 2309 3 1442 1441 1446 1445 # CAO-CAT-CAO-CAM + 2310 4 1442 1441 1446 1452 # CAO-CAT-CAO-HAT + 2311 5 1442 1443 1444 1445 # CAO-CAM-CAP-CAM + 2312 6 1442 1443 1444 1450 # CAO-CAM-CAP-HAT + 2313 7 1447 1441 1442 1443 # CTT-CAT-CAO-CAM + 2314 3 1446 1441 1442 1443 # CAO-CAT-CAO-CAM + 2315 5 1446 1445 1444 1443 # CAO-CAM-CAP-CAM + 2316 8 1443 1444 1445 1451 # CAM-CAP-CAM-HAT + 2317 9 1444 1443 1442 1448 # CAP-CAM-CAO-HAT + 2318 9 1444 1445 1446 1452 # CAP-CAM-CAO-HAT + 2319 8 1445 1444 1443 1449 # CAM-CAP-CAM-HAT + 2320 7 1447 1441 1446 1445 # CTT-CAT-CAO-CAM + 2321 6 1446 1445 1444 1450 # CAO-CAM-CAP-HAT + 2322 4 1446 1441 1442 1448 # CAO-CAT-CAO-HAT + 2323 10 1447 1441 1442 1448 # CTT-CAT-CAO-HAT + 2324 10 1447 1441 1446 1452 # CTT-CAT-CAO-HAT + 2325 11 1448 1442 1443 1449 # HAT-CAO-CAM-HAT + 2326 12 1449 1443 1444 1450 # HAT-CAM-CAP-HAT + 2327 12 1451 1445 1444 1450 # HAT-CAM-CAP-HAT + 2328 11 1452 1446 1445 1451 # HAT-CAO-CAM-HAT + 2329 1 1456 1457 1458 1459 # CAT-CAO-CAM-CAP + 2330 2 1456 1457 1458 1464 # CAT-CAO-CAM-HAT + 2331 1 1456 1461 1460 1459 # CAT-CAO-CAM-CAP + 2332 2 1456 1461 1460 1466 # CAT-CAO-CAM-HAT + 2333 3 1457 1456 1461 1460 # CAO-CAT-CAO-CAM + 2334 4 1457 1456 1461 1467 # CAO-CAT-CAO-HAT + 2335 5 1457 1458 1459 1460 # CAO-CAM-CAP-CAM + 2336 6 1457 1458 1459 1465 # CAO-CAM-CAP-HAT + 2337 7 1462 1456 1457 1458 # CTT-CAT-CAO-CAM + 2338 3 1461 1456 1457 1458 # CAO-CAT-CAO-CAM + 2339 5 1461 1460 1459 1458 # CAO-CAM-CAP-CAM + 2340 8 1458 1459 1460 1466 # CAM-CAP-CAM-HAT + 2341 9 1459 1458 1457 1463 # CAP-CAM-CAO-HAT + 2342 9 1459 1460 1461 1467 # CAP-CAM-CAO-HAT + 2343 8 1460 1459 1458 1464 # CAM-CAP-CAM-HAT + 2344 7 1462 1456 1461 1460 # CTT-CAT-CAO-CAM + 2345 6 1461 1460 1459 1465 # CAO-CAM-CAP-HAT + 2346 4 1461 1456 1457 1463 # CAO-CAT-CAO-HAT + 2347 10 1462 1456 1457 1463 # CTT-CAT-CAO-HAT + 2348 10 1462 1456 1461 1467 # CTT-CAT-CAO-HAT + 2349 11 1463 1457 1458 1464 # HAT-CAO-CAM-HAT + 2350 12 1464 1458 1459 1465 # HAT-CAM-CAP-HAT + 2351 12 1466 1460 1459 1465 # HAT-CAM-CAP-HAT + 2352 11 1467 1461 1460 1466 # HAT-CAO-CAM-HAT + 2353 1 1471 1472 1473 1474 # CAT-CAO-CAM-CAP + 2354 2 1471 1472 1473 1479 # CAT-CAO-CAM-HAT + 2355 1 1471 1476 1475 1474 # CAT-CAO-CAM-CAP + 2356 2 1471 1476 1475 1481 # CAT-CAO-CAM-HAT + 2357 3 1472 1471 1476 1475 # CAO-CAT-CAO-CAM + 2358 4 1472 1471 1476 1482 # CAO-CAT-CAO-HAT + 2359 5 1472 1473 1474 1475 # CAO-CAM-CAP-CAM + 2360 6 1472 1473 1474 1480 # CAO-CAM-CAP-HAT + 2361 7 1477 1471 1472 1473 # CTT-CAT-CAO-CAM + 2362 3 1476 1471 1472 1473 # CAO-CAT-CAO-CAM + 2363 5 1476 1475 1474 1473 # CAO-CAM-CAP-CAM + 2364 8 1473 1474 1475 1481 # CAM-CAP-CAM-HAT + 2365 9 1474 1473 1472 1478 # CAP-CAM-CAO-HAT + 2366 9 1474 1475 1476 1482 # CAP-CAM-CAO-HAT + 2367 8 1475 1474 1473 1479 # CAM-CAP-CAM-HAT + 2368 7 1477 1471 1476 1475 # CTT-CAT-CAO-CAM + 2369 6 1476 1475 1474 1480 # CAO-CAM-CAP-HAT + 2370 4 1476 1471 1472 1478 # CAO-CAT-CAO-HAT + 2371 10 1477 1471 1472 1478 # CTT-CAT-CAO-HAT + 2372 10 1477 1471 1476 1482 # CTT-CAT-CAO-HAT + 2373 11 1478 1472 1473 1479 # HAT-CAO-CAM-HAT + 2374 12 1479 1473 1474 1480 # HAT-CAM-CAP-HAT + 2375 12 1481 1475 1474 1480 # HAT-CAM-CAP-HAT + 2376 11 1482 1476 1475 1481 # HAT-CAO-CAM-HAT + 2377 1 1486 1487 1488 1489 # CAT-CAO-CAM-CAP + 2378 2 1486 1487 1488 1494 # CAT-CAO-CAM-HAT + 2379 1 1486 1491 1490 1489 # CAT-CAO-CAM-CAP + 2380 2 1486 1491 1490 1496 # CAT-CAO-CAM-HAT + 2381 3 1487 1486 1491 1490 # CAO-CAT-CAO-CAM + 2382 4 1487 1486 1491 1497 # CAO-CAT-CAO-HAT + 2383 5 1487 1488 1489 1490 # CAO-CAM-CAP-CAM + 2384 6 1487 1488 1489 1495 # CAO-CAM-CAP-HAT + 2385 7 1492 1486 1487 1488 # CTT-CAT-CAO-CAM + 2386 3 1491 1486 1487 1488 # CAO-CAT-CAO-CAM + 2387 5 1491 1490 1489 1488 # CAO-CAM-CAP-CAM + 2388 8 1488 1489 1490 1496 # CAM-CAP-CAM-HAT + 2389 9 1489 1488 1487 1493 # CAP-CAM-CAO-HAT + 2390 9 1489 1490 1491 1497 # CAP-CAM-CAO-HAT + 2391 8 1490 1489 1488 1494 # CAM-CAP-CAM-HAT + 2392 7 1492 1486 1491 1490 # CTT-CAT-CAO-CAM + 2393 6 1491 1490 1489 1495 # CAO-CAM-CAP-HAT + 2394 4 1491 1486 1487 1493 # CAO-CAT-CAO-HAT + 2395 10 1492 1486 1487 1493 # CTT-CAT-CAO-HAT + 2396 10 1492 1486 1491 1497 # CTT-CAT-CAO-HAT + 2397 11 1493 1487 1488 1494 # HAT-CAO-CAM-HAT + 2398 12 1494 1488 1489 1495 # HAT-CAM-CAP-HAT + 2399 12 1496 1490 1489 1495 # HAT-CAM-CAP-HAT + 2400 11 1497 1491 1490 1496 # HAT-CAO-CAM-HAT + 2401 1 1501 1502 1503 1504 # CAT-CAO-CAM-CAP + 2402 2 1501 1502 1503 1509 # CAT-CAO-CAM-HAT + 2403 1 1501 1506 1505 1504 # CAT-CAO-CAM-CAP + 2404 2 1501 1506 1505 1511 # CAT-CAO-CAM-HAT + 2405 3 1502 1501 1506 1505 # CAO-CAT-CAO-CAM + 2406 4 1502 1501 1506 1512 # CAO-CAT-CAO-HAT + 2407 5 1502 1503 1504 1505 # CAO-CAM-CAP-CAM + 2408 6 1502 1503 1504 1510 # CAO-CAM-CAP-HAT + 2409 7 1507 1501 1502 1503 # CTT-CAT-CAO-CAM + 2410 3 1506 1501 1502 1503 # CAO-CAT-CAO-CAM + 2411 5 1506 1505 1504 1503 # CAO-CAM-CAP-CAM + 2412 8 1503 1504 1505 1511 # CAM-CAP-CAM-HAT + 2413 9 1504 1503 1502 1508 # CAP-CAM-CAO-HAT + 2414 9 1504 1505 1506 1512 # CAP-CAM-CAO-HAT + 2415 8 1505 1504 1503 1509 # CAM-CAP-CAM-HAT + 2416 7 1507 1501 1506 1505 # CTT-CAT-CAO-CAM + 2417 6 1506 1505 1504 1510 # CAO-CAM-CAP-HAT + 2418 4 1506 1501 1502 1508 # CAO-CAT-CAO-HAT + 2419 10 1507 1501 1502 1508 # CTT-CAT-CAO-HAT + 2420 10 1507 1501 1506 1512 # CTT-CAT-CAO-HAT + 2421 11 1508 1502 1503 1509 # HAT-CAO-CAM-HAT + 2422 12 1509 1503 1504 1510 # HAT-CAM-CAP-HAT + 2423 12 1511 1505 1504 1510 # HAT-CAM-CAP-HAT + 2424 11 1512 1506 1505 1511 # HAT-CAO-CAM-HAT + 2425 1 1516 1517 1518 1519 # CAT-CAO-CAM-CAP + 2426 2 1516 1517 1518 1524 # CAT-CAO-CAM-HAT + 2427 1 1516 1521 1520 1519 # CAT-CAO-CAM-CAP + 2428 2 1516 1521 1520 1526 # CAT-CAO-CAM-HAT + 2429 3 1517 1516 1521 1520 # CAO-CAT-CAO-CAM + 2430 4 1517 1516 1521 1527 # CAO-CAT-CAO-HAT + 2431 5 1517 1518 1519 1520 # CAO-CAM-CAP-CAM + 2432 6 1517 1518 1519 1525 # CAO-CAM-CAP-HAT + 2433 7 1522 1516 1517 1518 # CTT-CAT-CAO-CAM + 2434 3 1521 1516 1517 1518 # CAO-CAT-CAO-CAM + 2435 5 1521 1520 1519 1518 # CAO-CAM-CAP-CAM + 2436 8 1518 1519 1520 1526 # CAM-CAP-CAM-HAT + 2437 9 1519 1518 1517 1523 # CAP-CAM-CAO-HAT + 2438 9 1519 1520 1521 1527 # CAP-CAM-CAO-HAT + 2439 8 1520 1519 1518 1524 # CAM-CAP-CAM-HAT + 2440 7 1522 1516 1521 1520 # CTT-CAT-CAO-CAM + 2441 6 1521 1520 1519 1525 # CAO-CAM-CAP-HAT + 2442 4 1521 1516 1517 1523 # CAO-CAT-CAO-HAT + 2443 10 1522 1516 1517 1523 # CTT-CAT-CAO-HAT + 2444 10 1522 1516 1521 1527 # CTT-CAT-CAO-HAT + 2445 11 1523 1517 1518 1524 # HAT-CAO-CAM-HAT + 2446 12 1524 1518 1519 1525 # HAT-CAM-CAP-HAT + 2447 12 1526 1520 1519 1525 # HAT-CAM-CAP-HAT + 2448 11 1527 1521 1520 1526 # HAT-CAO-CAM-HAT + 2449 1 1531 1532 1533 1534 # CAT-CAO-CAM-CAP + 2450 2 1531 1532 1533 1539 # CAT-CAO-CAM-HAT + 2451 1 1531 1536 1535 1534 # CAT-CAO-CAM-CAP + 2452 2 1531 1536 1535 1541 # CAT-CAO-CAM-HAT + 2453 3 1532 1531 1536 1535 # CAO-CAT-CAO-CAM + 2454 4 1532 1531 1536 1542 # CAO-CAT-CAO-HAT + 2455 5 1532 1533 1534 1535 # CAO-CAM-CAP-CAM + 2456 6 1532 1533 1534 1540 # CAO-CAM-CAP-HAT + 2457 7 1537 1531 1532 1533 # CTT-CAT-CAO-CAM + 2458 3 1536 1531 1532 1533 # CAO-CAT-CAO-CAM + 2459 5 1536 1535 1534 1533 # CAO-CAM-CAP-CAM + 2460 8 1533 1534 1535 1541 # CAM-CAP-CAM-HAT + 2461 9 1534 1533 1532 1538 # CAP-CAM-CAO-HAT + 2462 9 1534 1535 1536 1542 # CAP-CAM-CAO-HAT + 2463 8 1535 1534 1533 1539 # CAM-CAP-CAM-HAT + 2464 7 1537 1531 1536 1535 # CTT-CAT-CAO-CAM + 2465 6 1536 1535 1534 1540 # CAO-CAM-CAP-HAT + 2466 4 1536 1531 1532 1538 # CAO-CAT-CAO-HAT + 2467 10 1537 1531 1532 1538 # CTT-CAT-CAO-HAT + 2468 10 1537 1531 1536 1542 # CTT-CAT-CAO-HAT + 2469 11 1538 1532 1533 1539 # HAT-CAO-CAM-HAT + 2470 12 1539 1533 1534 1540 # HAT-CAM-CAP-HAT + 2471 12 1541 1535 1534 1540 # HAT-CAM-CAP-HAT + 2472 11 1542 1536 1535 1541 # HAT-CAO-CAM-HAT + 2473 1 1546 1547 1548 1549 # CAT-CAO-CAM-CAP + 2474 2 1546 1547 1548 1554 # CAT-CAO-CAM-HAT + 2475 1 1546 1551 1550 1549 # CAT-CAO-CAM-CAP + 2476 2 1546 1551 1550 1556 # CAT-CAO-CAM-HAT + 2477 3 1547 1546 1551 1550 # CAO-CAT-CAO-CAM + 2478 4 1547 1546 1551 1557 # CAO-CAT-CAO-HAT + 2479 5 1547 1548 1549 1550 # CAO-CAM-CAP-CAM + 2480 6 1547 1548 1549 1555 # CAO-CAM-CAP-HAT + 2481 7 1552 1546 1547 1548 # CTT-CAT-CAO-CAM + 2482 3 1551 1546 1547 1548 # CAO-CAT-CAO-CAM + 2483 5 1551 1550 1549 1548 # CAO-CAM-CAP-CAM + 2484 8 1548 1549 1550 1556 # CAM-CAP-CAM-HAT + 2485 9 1549 1548 1547 1553 # CAP-CAM-CAO-HAT + 2486 9 1549 1550 1551 1557 # CAP-CAM-CAO-HAT + 2487 8 1550 1549 1548 1554 # CAM-CAP-CAM-HAT + 2488 7 1552 1546 1551 1550 # CTT-CAT-CAO-CAM + 2489 6 1551 1550 1549 1555 # CAO-CAM-CAP-HAT + 2490 4 1551 1546 1547 1553 # CAO-CAT-CAO-HAT + 2491 10 1552 1546 1547 1553 # CTT-CAT-CAO-HAT + 2492 10 1552 1546 1551 1557 # CTT-CAT-CAO-HAT + 2493 11 1553 1547 1548 1554 # HAT-CAO-CAM-HAT + 2494 12 1554 1548 1549 1555 # HAT-CAM-CAP-HAT + 2495 12 1556 1550 1549 1555 # HAT-CAM-CAP-HAT + 2496 11 1557 1551 1550 1556 # HAT-CAO-CAM-HAT + 2497 1 1561 1562 1563 1564 # CAT-CAO-CAM-CAP + 2498 2 1561 1562 1563 1569 # CAT-CAO-CAM-HAT + 2499 1 1561 1566 1565 1564 # CAT-CAO-CAM-CAP + 2500 2 1561 1566 1565 1571 # CAT-CAO-CAM-HAT + 2501 3 1562 1561 1566 1565 # CAO-CAT-CAO-CAM + 2502 4 1562 1561 1566 1572 # CAO-CAT-CAO-HAT + 2503 5 1562 1563 1564 1565 # CAO-CAM-CAP-CAM + 2504 6 1562 1563 1564 1570 # CAO-CAM-CAP-HAT + 2505 7 1567 1561 1562 1563 # CTT-CAT-CAO-CAM + 2506 3 1566 1561 1562 1563 # CAO-CAT-CAO-CAM + 2507 5 1566 1565 1564 1563 # CAO-CAM-CAP-CAM + 2508 8 1563 1564 1565 1571 # CAM-CAP-CAM-HAT + 2509 9 1564 1563 1562 1568 # CAP-CAM-CAO-HAT + 2510 9 1564 1565 1566 1572 # CAP-CAM-CAO-HAT + 2511 8 1565 1564 1563 1569 # CAM-CAP-CAM-HAT + 2512 7 1567 1561 1566 1565 # CTT-CAT-CAO-CAM + 2513 6 1566 1565 1564 1570 # CAO-CAM-CAP-HAT + 2514 4 1566 1561 1562 1568 # CAO-CAT-CAO-HAT + 2515 10 1567 1561 1562 1568 # CTT-CAT-CAO-HAT + 2516 10 1567 1561 1566 1572 # CTT-CAT-CAO-HAT + 2517 11 1568 1562 1563 1569 # HAT-CAO-CAM-HAT + 2518 12 1569 1563 1564 1570 # HAT-CAM-CAP-HAT + 2519 12 1571 1565 1564 1570 # HAT-CAM-CAP-HAT + 2520 11 1572 1566 1565 1571 # HAT-CAO-CAM-HAT + 2521 1 1576 1577 1578 1579 # CAT-CAO-CAM-CAP + 2522 2 1576 1577 1578 1584 # CAT-CAO-CAM-HAT + 2523 1 1576 1581 1580 1579 # CAT-CAO-CAM-CAP + 2524 2 1576 1581 1580 1586 # CAT-CAO-CAM-HAT + 2525 3 1577 1576 1581 1580 # CAO-CAT-CAO-CAM + 2526 4 1577 1576 1581 1587 # CAO-CAT-CAO-HAT + 2527 5 1577 1578 1579 1580 # CAO-CAM-CAP-CAM + 2528 6 1577 1578 1579 1585 # CAO-CAM-CAP-HAT + 2529 7 1582 1576 1577 1578 # CTT-CAT-CAO-CAM + 2530 3 1581 1576 1577 1578 # CAO-CAT-CAO-CAM + 2531 5 1581 1580 1579 1578 # CAO-CAM-CAP-CAM + 2532 8 1578 1579 1580 1586 # CAM-CAP-CAM-HAT + 2533 9 1579 1578 1577 1583 # CAP-CAM-CAO-HAT + 2534 9 1579 1580 1581 1587 # CAP-CAM-CAO-HAT + 2535 8 1580 1579 1578 1584 # CAM-CAP-CAM-HAT + 2536 7 1582 1576 1581 1580 # CTT-CAT-CAO-CAM + 2537 6 1581 1580 1579 1585 # CAO-CAM-CAP-HAT + 2538 4 1581 1576 1577 1583 # CAO-CAT-CAO-HAT + 2539 10 1582 1576 1577 1583 # CTT-CAT-CAO-HAT + 2540 10 1582 1576 1581 1587 # CTT-CAT-CAO-HAT + 2541 11 1583 1577 1578 1584 # HAT-CAO-CAM-HAT + 2542 12 1584 1578 1579 1585 # HAT-CAM-CAP-HAT + 2543 12 1586 1580 1579 1585 # HAT-CAM-CAP-HAT + 2544 11 1587 1581 1580 1586 # HAT-CAO-CAM-HAT + 2545 1 1591 1592 1593 1594 # CAT-CAO-CAM-CAP + 2546 2 1591 1592 1593 1599 # CAT-CAO-CAM-HAT + 2547 1 1591 1596 1595 1594 # CAT-CAO-CAM-CAP + 2548 2 1591 1596 1595 1601 # CAT-CAO-CAM-HAT + 2549 3 1592 1591 1596 1595 # CAO-CAT-CAO-CAM + 2550 4 1592 1591 1596 1602 # CAO-CAT-CAO-HAT + 2551 5 1592 1593 1594 1595 # CAO-CAM-CAP-CAM + 2552 6 1592 1593 1594 1600 # CAO-CAM-CAP-HAT + 2553 7 1597 1591 1592 1593 # CTT-CAT-CAO-CAM + 2554 3 1596 1591 1592 1593 # CAO-CAT-CAO-CAM + 2555 5 1596 1595 1594 1593 # CAO-CAM-CAP-CAM + 2556 8 1593 1594 1595 1601 # CAM-CAP-CAM-HAT + 2557 9 1594 1593 1592 1598 # CAP-CAM-CAO-HAT + 2558 9 1594 1595 1596 1602 # CAP-CAM-CAO-HAT + 2559 8 1595 1594 1593 1599 # CAM-CAP-CAM-HAT + 2560 7 1597 1591 1596 1595 # CTT-CAT-CAO-CAM + 2561 6 1596 1595 1594 1600 # CAO-CAM-CAP-HAT + 2562 4 1596 1591 1592 1598 # CAO-CAT-CAO-HAT + 2563 10 1597 1591 1592 1598 # CTT-CAT-CAO-HAT + 2564 10 1597 1591 1596 1602 # CTT-CAT-CAO-HAT + 2565 11 1598 1592 1593 1599 # HAT-CAO-CAM-HAT + 2566 12 1599 1593 1594 1600 # HAT-CAM-CAP-HAT + 2567 12 1601 1595 1594 1600 # HAT-CAM-CAP-HAT + 2568 11 1602 1596 1595 1601 # HAT-CAO-CAM-HAT + 2569 1 1606 1607 1608 1609 # CAT-CAO-CAM-CAP + 2570 2 1606 1607 1608 1614 # CAT-CAO-CAM-HAT + 2571 1 1606 1611 1610 1609 # CAT-CAO-CAM-CAP + 2572 2 1606 1611 1610 1616 # CAT-CAO-CAM-HAT + 2573 3 1607 1606 1611 1610 # CAO-CAT-CAO-CAM + 2574 4 1607 1606 1611 1617 # CAO-CAT-CAO-HAT + 2575 5 1607 1608 1609 1610 # CAO-CAM-CAP-CAM + 2576 6 1607 1608 1609 1615 # CAO-CAM-CAP-HAT + 2577 7 1612 1606 1607 1608 # CTT-CAT-CAO-CAM + 2578 3 1611 1606 1607 1608 # CAO-CAT-CAO-CAM + 2579 5 1611 1610 1609 1608 # CAO-CAM-CAP-CAM + 2580 8 1608 1609 1610 1616 # CAM-CAP-CAM-HAT + 2581 9 1609 1608 1607 1613 # CAP-CAM-CAO-HAT + 2582 9 1609 1610 1611 1617 # CAP-CAM-CAO-HAT + 2583 8 1610 1609 1608 1614 # CAM-CAP-CAM-HAT + 2584 7 1612 1606 1611 1610 # CTT-CAT-CAO-CAM + 2585 6 1611 1610 1609 1615 # CAO-CAM-CAP-HAT + 2586 4 1611 1606 1607 1613 # CAO-CAT-CAO-HAT + 2587 10 1612 1606 1607 1613 # CTT-CAT-CAO-HAT + 2588 10 1612 1606 1611 1617 # CTT-CAT-CAO-HAT + 2589 11 1613 1607 1608 1614 # HAT-CAO-CAM-HAT + 2590 12 1614 1608 1609 1615 # HAT-CAM-CAP-HAT + 2591 12 1616 1610 1609 1615 # HAT-CAM-CAP-HAT + 2592 11 1617 1611 1610 1616 # HAT-CAO-CAM-HAT + 2593 1 1621 1622 1623 1624 # CAT-CAO-CAM-CAP + 2594 2 1621 1622 1623 1629 # CAT-CAO-CAM-HAT + 2595 1 1621 1626 1625 1624 # CAT-CAO-CAM-CAP + 2596 2 1621 1626 1625 1631 # CAT-CAO-CAM-HAT + 2597 3 1622 1621 1626 1625 # CAO-CAT-CAO-CAM + 2598 4 1622 1621 1626 1632 # CAO-CAT-CAO-HAT + 2599 5 1622 1623 1624 1625 # CAO-CAM-CAP-CAM + 2600 6 1622 1623 1624 1630 # CAO-CAM-CAP-HAT + 2601 7 1627 1621 1622 1623 # CTT-CAT-CAO-CAM + 2602 3 1626 1621 1622 1623 # CAO-CAT-CAO-CAM + 2603 5 1626 1625 1624 1623 # CAO-CAM-CAP-CAM + 2604 8 1623 1624 1625 1631 # CAM-CAP-CAM-HAT + 2605 9 1624 1623 1622 1628 # CAP-CAM-CAO-HAT + 2606 9 1624 1625 1626 1632 # CAP-CAM-CAO-HAT + 2607 8 1625 1624 1623 1629 # CAM-CAP-CAM-HAT + 2608 7 1627 1621 1626 1625 # CTT-CAT-CAO-CAM + 2609 6 1626 1625 1624 1630 # CAO-CAM-CAP-HAT + 2610 4 1626 1621 1622 1628 # CAO-CAT-CAO-HAT + 2611 10 1627 1621 1622 1628 # CTT-CAT-CAO-HAT + 2612 10 1627 1621 1626 1632 # CTT-CAT-CAO-HAT + 2613 11 1628 1622 1623 1629 # HAT-CAO-CAM-HAT + 2614 12 1629 1623 1624 1630 # HAT-CAM-CAP-HAT + 2615 12 1631 1625 1624 1630 # HAT-CAM-CAP-HAT + 2616 11 1632 1626 1625 1631 # HAT-CAO-CAM-HAT + 2617 1 1636 1637 1638 1639 # CAT-CAO-CAM-CAP + 2618 2 1636 1637 1638 1644 # CAT-CAO-CAM-HAT + 2619 1 1636 1641 1640 1639 # CAT-CAO-CAM-CAP + 2620 2 1636 1641 1640 1646 # CAT-CAO-CAM-HAT + 2621 3 1637 1636 1641 1640 # CAO-CAT-CAO-CAM + 2622 4 1637 1636 1641 1647 # CAO-CAT-CAO-HAT + 2623 5 1637 1638 1639 1640 # CAO-CAM-CAP-CAM + 2624 6 1637 1638 1639 1645 # CAO-CAM-CAP-HAT + 2625 7 1642 1636 1637 1638 # CTT-CAT-CAO-CAM + 2626 3 1641 1636 1637 1638 # CAO-CAT-CAO-CAM + 2627 5 1641 1640 1639 1638 # CAO-CAM-CAP-CAM + 2628 8 1638 1639 1640 1646 # CAM-CAP-CAM-HAT + 2629 9 1639 1638 1637 1643 # CAP-CAM-CAO-HAT + 2630 9 1639 1640 1641 1647 # CAP-CAM-CAO-HAT + 2631 8 1640 1639 1638 1644 # CAM-CAP-CAM-HAT + 2632 7 1642 1636 1641 1640 # CTT-CAT-CAO-CAM + 2633 6 1641 1640 1639 1645 # CAO-CAM-CAP-HAT + 2634 4 1641 1636 1637 1643 # CAO-CAT-CAO-HAT + 2635 10 1642 1636 1637 1643 # CTT-CAT-CAO-HAT + 2636 10 1642 1636 1641 1647 # CTT-CAT-CAO-HAT + 2637 11 1643 1637 1638 1644 # HAT-CAO-CAM-HAT + 2638 12 1644 1638 1639 1645 # HAT-CAM-CAP-HAT + 2639 12 1646 1640 1639 1645 # HAT-CAM-CAP-HAT + 2640 11 1647 1641 1640 1646 # HAT-CAO-CAM-HAT + 2641 1 1651 1652 1653 1654 # CAT-CAO-CAM-CAP + 2642 2 1651 1652 1653 1659 # CAT-CAO-CAM-HAT + 2643 1 1651 1656 1655 1654 # CAT-CAO-CAM-CAP + 2644 2 1651 1656 1655 1661 # CAT-CAO-CAM-HAT + 2645 3 1652 1651 1656 1655 # CAO-CAT-CAO-CAM + 2646 4 1652 1651 1656 1662 # CAO-CAT-CAO-HAT + 2647 5 1652 1653 1654 1655 # CAO-CAM-CAP-CAM + 2648 6 1652 1653 1654 1660 # CAO-CAM-CAP-HAT + 2649 7 1657 1651 1652 1653 # CTT-CAT-CAO-CAM + 2650 3 1656 1651 1652 1653 # CAO-CAT-CAO-CAM + 2651 5 1656 1655 1654 1653 # CAO-CAM-CAP-CAM + 2652 8 1653 1654 1655 1661 # CAM-CAP-CAM-HAT + 2653 9 1654 1653 1652 1658 # CAP-CAM-CAO-HAT + 2654 9 1654 1655 1656 1662 # CAP-CAM-CAO-HAT + 2655 8 1655 1654 1653 1659 # CAM-CAP-CAM-HAT + 2656 7 1657 1651 1656 1655 # CTT-CAT-CAO-CAM + 2657 6 1656 1655 1654 1660 # CAO-CAM-CAP-HAT + 2658 4 1656 1651 1652 1658 # CAO-CAT-CAO-HAT + 2659 10 1657 1651 1652 1658 # CTT-CAT-CAO-HAT + 2660 10 1657 1651 1656 1662 # CTT-CAT-CAO-HAT + 2661 11 1658 1652 1653 1659 # HAT-CAO-CAM-HAT + 2662 12 1659 1653 1654 1660 # HAT-CAM-CAP-HAT + 2663 12 1661 1655 1654 1660 # HAT-CAM-CAP-HAT + 2664 11 1662 1656 1655 1661 # HAT-CAO-CAM-HAT + 2665 1 1666 1667 1668 1669 # CAT-CAO-CAM-CAP + 2666 2 1666 1667 1668 1674 # CAT-CAO-CAM-HAT + 2667 1 1666 1671 1670 1669 # CAT-CAO-CAM-CAP + 2668 2 1666 1671 1670 1676 # CAT-CAO-CAM-HAT + 2669 3 1667 1666 1671 1670 # CAO-CAT-CAO-CAM + 2670 4 1667 1666 1671 1677 # CAO-CAT-CAO-HAT + 2671 5 1667 1668 1669 1670 # CAO-CAM-CAP-CAM + 2672 6 1667 1668 1669 1675 # CAO-CAM-CAP-HAT + 2673 7 1672 1666 1667 1668 # CTT-CAT-CAO-CAM + 2674 3 1671 1666 1667 1668 # CAO-CAT-CAO-CAM + 2675 5 1671 1670 1669 1668 # CAO-CAM-CAP-CAM + 2676 8 1668 1669 1670 1676 # CAM-CAP-CAM-HAT + 2677 9 1669 1668 1667 1673 # CAP-CAM-CAO-HAT + 2678 9 1669 1670 1671 1677 # CAP-CAM-CAO-HAT + 2679 8 1670 1669 1668 1674 # CAM-CAP-CAM-HAT + 2680 7 1672 1666 1671 1670 # CTT-CAT-CAO-CAM + 2681 6 1671 1670 1669 1675 # CAO-CAM-CAP-HAT + 2682 4 1671 1666 1667 1673 # CAO-CAT-CAO-HAT + 2683 10 1672 1666 1667 1673 # CTT-CAT-CAO-HAT + 2684 10 1672 1666 1671 1677 # CTT-CAT-CAO-HAT + 2685 11 1673 1667 1668 1674 # HAT-CAO-CAM-HAT + 2686 12 1674 1668 1669 1675 # HAT-CAM-CAP-HAT + 2687 12 1676 1670 1669 1675 # HAT-CAM-CAP-HAT + 2688 11 1677 1671 1670 1676 # HAT-CAO-CAM-HAT + 2689 1 1681 1682 1683 1684 # CAT-CAO-CAM-CAP + 2690 2 1681 1682 1683 1689 # CAT-CAO-CAM-HAT + 2691 1 1681 1686 1685 1684 # CAT-CAO-CAM-CAP + 2692 2 1681 1686 1685 1691 # CAT-CAO-CAM-HAT + 2693 3 1682 1681 1686 1685 # CAO-CAT-CAO-CAM + 2694 4 1682 1681 1686 1692 # CAO-CAT-CAO-HAT + 2695 5 1682 1683 1684 1685 # CAO-CAM-CAP-CAM + 2696 6 1682 1683 1684 1690 # CAO-CAM-CAP-HAT + 2697 7 1687 1681 1682 1683 # CTT-CAT-CAO-CAM + 2698 3 1686 1681 1682 1683 # CAO-CAT-CAO-CAM + 2699 5 1686 1685 1684 1683 # CAO-CAM-CAP-CAM + 2700 8 1683 1684 1685 1691 # CAM-CAP-CAM-HAT + 2701 9 1684 1683 1682 1688 # CAP-CAM-CAO-HAT + 2702 9 1684 1685 1686 1692 # CAP-CAM-CAO-HAT + 2703 8 1685 1684 1683 1689 # CAM-CAP-CAM-HAT + 2704 7 1687 1681 1686 1685 # CTT-CAT-CAO-CAM + 2705 6 1686 1685 1684 1690 # CAO-CAM-CAP-HAT + 2706 4 1686 1681 1682 1688 # CAO-CAT-CAO-HAT + 2707 10 1687 1681 1682 1688 # CTT-CAT-CAO-HAT + 2708 10 1687 1681 1686 1692 # CTT-CAT-CAO-HAT + 2709 11 1688 1682 1683 1689 # HAT-CAO-CAM-HAT + 2710 12 1689 1683 1684 1690 # HAT-CAM-CAP-HAT + 2711 12 1691 1685 1684 1690 # HAT-CAM-CAP-HAT + 2712 11 1692 1686 1685 1691 # HAT-CAO-CAM-HAT + 2713 1 1696 1697 1698 1699 # CAT-CAO-CAM-CAP + 2714 2 1696 1697 1698 1704 # CAT-CAO-CAM-HAT + 2715 1 1696 1701 1700 1699 # CAT-CAO-CAM-CAP + 2716 2 1696 1701 1700 1706 # CAT-CAO-CAM-HAT + 2717 3 1697 1696 1701 1700 # CAO-CAT-CAO-CAM + 2718 4 1697 1696 1701 1707 # CAO-CAT-CAO-HAT + 2719 5 1697 1698 1699 1700 # CAO-CAM-CAP-CAM + 2720 6 1697 1698 1699 1705 # CAO-CAM-CAP-HAT + 2721 7 1702 1696 1697 1698 # CTT-CAT-CAO-CAM + 2722 3 1701 1696 1697 1698 # CAO-CAT-CAO-CAM + 2723 5 1701 1700 1699 1698 # CAO-CAM-CAP-CAM + 2724 8 1698 1699 1700 1706 # CAM-CAP-CAM-HAT + 2725 9 1699 1698 1697 1703 # CAP-CAM-CAO-HAT + 2726 9 1699 1700 1701 1707 # CAP-CAM-CAO-HAT + 2727 8 1700 1699 1698 1704 # CAM-CAP-CAM-HAT + 2728 7 1702 1696 1701 1700 # CTT-CAT-CAO-CAM + 2729 6 1701 1700 1699 1705 # CAO-CAM-CAP-HAT + 2730 4 1701 1696 1697 1703 # CAO-CAT-CAO-HAT + 2731 10 1702 1696 1697 1703 # CTT-CAT-CAO-HAT + 2732 10 1702 1696 1701 1707 # CTT-CAT-CAO-HAT + 2733 11 1703 1697 1698 1704 # HAT-CAO-CAM-HAT + 2734 12 1704 1698 1699 1705 # HAT-CAM-CAP-HAT + 2735 12 1706 1700 1699 1705 # HAT-CAM-CAP-HAT + 2736 11 1707 1701 1700 1706 # HAT-CAO-CAM-HAT + 2737 1 1711 1712 1713 1714 # CAT-CAO-CAM-CAP + 2738 2 1711 1712 1713 1719 # CAT-CAO-CAM-HAT + 2739 1 1711 1716 1715 1714 # CAT-CAO-CAM-CAP + 2740 2 1711 1716 1715 1721 # CAT-CAO-CAM-HAT + 2741 3 1712 1711 1716 1715 # CAO-CAT-CAO-CAM + 2742 4 1712 1711 1716 1722 # CAO-CAT-CAO-HAT + 2743 5 1712 1713 1714 1715 # CAO-CAM-CAP-CAM + 2744 6 1712 1713 1714 1720 # CAO-CAM-CAP-HAT + 2745 7 1717 1711 1712 1713 # CTT-CAT-CAO-CAM + 2746 3 1716 1711 1712 1713 # CAO-CAT-CAO-CAM + 2747 5 1716 1715 1714 1713 # CAO-CAM-CAP-CAM + 2748 8 1713 1714 1715 1721 # CAM-CAP-CAM-HAT + 2749 9 1714 1713 1712 1718 # CAP-CAM-CAO-HAT + 2750 9 1714 1715 1716 1722 # CAP-CAM-CAO-HAT + 2751 8 1715 1714 1713 1719 # CAM-CAP-CAM-HAT + 2752 7 1717 1711 1716 1715 # CTT-CAT-CAO-CAM + 2753 6 1716 1715 1714 1720 # CAO-CAM-CAP-HAT + 2754 4 1716 1711 1712 1718 # CAO-CAT-CAO-HAT + 2755 10 1717 1711 1712 1718 # CTT-CAT-CAO-HAT + 2756 10 1717 1711 1716 1722 # CTT-CAT-CAO-HAT + 2757 11 1718 1712 1713 1719 # HAT-CAO-CAM-HAT + 2758 12 1719 1713 1714 1720 # HAT-CAM-CAP-HAT + 2759 12 1721 1715 1714 1720 # HAT-CAM-CAP-HAT + 2760 11 1722 1716 1715 1721 # HAT-CAO-CAM-HAT + 2761 1 1726 1727 1728 1729 # CAT-CAO-CAM-CAP + 2762 2 1726 1727 1728 1734 # CAT-CAO-CAM-HAT + 2763 1 1726 1731 1730 1729 # CAT-CAO-CAM-CAP + 2764 2 1726 1731 1730 1736 # CAT-CAO-CAM-HAT + 2765 3 1727 1726 1731 1730 # CAO-CAT-CAO-CAM + 2766 4 1727 1726 1731 1737 # CAO-CAT-CAO-HAT + 2767 5 1727 1728 1729 1730 # CAO-CAM-CAP-CAM + 2768 6 1727 1728 1729 1735 # CAO-CAM-CAP-HAT + 2769 7 1732 1726 1727 1728 # CTT-CAT-CAO-CAM + 2770 3 1731 1726 1727 1728 # CAO-CAT-CAO-CAM + 2771 5 1731 1730 1729 1728 # CAO-CAM-CAP-CAM + 2772 8 1728 1729 1730 1736 # CAM-CAP-CAM-HAT + 2773 9 1729 1728 1727 1733 # CAP-CAM-CAO-HAT + 2774 9 1729 1730 1731 1737 # CAP-CAM-CAO-HAT + 2775 8 1730 1729 1728 1734 # CAM-CAP-CAM-HAT + 2776 7 1732 1726 1731 1730 # CTT-CAT-CAO-CAM + 2777 6 1731 1730 1729 1735 # CAO-CAM-CAP-HAT + 2778 4 1731 1726 1727 1733 # CAO-CAT-CAO-HAT + 2779 10 1732 1726 1727 1733 # CTT-CAT-CAO-HAT + 2780 10 1732 1726 1731 1737 # CTT-CAT-CAO-HAT + 2781 11 1733 1727 1728 1734 # HAT-CAO-CAM-HAT + 2782 12 1734 1728 1729 1735 # HAT-CAM-CAP-HAT + 2783 12 1736 1730 1729 1735 # HAT-CAM-CAP-HAT + 2784 11 1737 1731 1730 1736 # HAT-CAO-CAM-HAT + 2785 1 1741 1742 1743 1744 # CAT-CAO-CAM-CAP + 2786 2 1741 1742 1743 1749 # CAT-CAO-CAM-HAT + 2787 1 1741 1746 1745 1744 # CAT-CAO-CAM-CAP + 2788 2 1741 1746 1745 1751 # CAT-CAO-CAM-HAT + 2789 3 1742 1741 1746 1745 # CAO-CAT-CAO-CAM + 2790 4 1742 1741 1746 1752 # CAO-CAT-CAO-HAT + 2791 5 1742 1743 1744 1745 # CAO-CAM-CAP-CAM + 2792 6 1742 1743 1744 1750 # CAO-CAM-CAP-HAT + 2793 7 1747 1741 1742 1743 # CTT-CAT-CAO-CAM + 2794 3 1746 1741 1742 1743 # CAO-CAT-CAO-CAM + 2795 5 1746 1745 1744 1743 # CAO-CAM-CAP-CAM + 2796 8 1743 1744 1745 1751 # CAM-CAP-CAM-HAT + 2797 9 1744 1743 1742 1748 # CAP-CAM-CAO-HAT + 2798 9 1744 1745 1746 1752 # CAP-CAM-CAO-HAT + 2799 8 1745 1744 1743 1749 # CAM-CAP-CAM-HAT + 2800 7 1747 1741 1746 1745 # CTT-CAT-CAO-CAM + 2801 6 1746 1745 1744 1750 # CAO-CAM-CAP-HAT + 2802 4 1746 1741 1742 1748 # CAO-CAT-CAO-HAT + 2803 10 1747 1741 1742 1748 # CTT-CAT-CAO-HAT + 2804 10 1747 1741 1746 1752 # CTT-CAT-CAO-HAT + 2805 11 1748 1742 1743 1749 # HAT-CAO-CAM-HAT + 2806 12 1749 1743 1744 1750 # HAT-CAM-CAP-HAT + 2807 12 1751 1745 1744 1750 # HAT-CAM-CAP-HAT + 2808 11 1752 1746 1745 1751 # HAT-CAO-CAM-HAT + 2809 1 1756 1757 1758 1759 # CAT-CAO-CAM-CAP + 2810 2 1756 1757 1758 1764 # CAT-CAO-CAM-HAT + 2811 1 1756 1761 1760 1759 # CAT-CAO-CAM-CAP + 2812 2 1756 1761 1760 1766 # CAT-CAO-CAM-HAT + 2813 3 1757 1756 1761 1760 # CAO-CAT-CAO-CAM + 2814 4 1757 1756 1761 1767 # CAO-CAT-CAO-HAT + 2815 5 1757 1758 1759 1760 # CAO-CAM-CAP-CAM + 2816 6 1757 1758 1759 1765 # CAO-CAM-CAP-HAT + 2817 7 1762 1756 1757 1758 # CTT-CAT-CAO-CAM + 2818 3 1761 1756 1757 1758 # CAO-CAT-CAO-CAM + 2819 5 1761 1760 1759 1758 # CAO-CAM-CAP-CAM + 2820 8 1758 1759 1760 1766 # CAM-CAP-CAM-HAT + 2821 9 1759 1758 1757 1763 # CAP-CAM-CAO-HAT + 2822 9 1759 1760 1761 1767 # CAP-CAM-CAO-HAT + 2823 8 1760 1759 1758 1764 # CAM-CAP-CAM-HAT + 2824 7 1762 1756 1761 1760 # CTT-CAT-CAO-CAM + 2825 6 1761 1760 1759 1765 # CAO-CAM-CAP-HAT + 2826 4 1761 1756 1757 1763 # CAO-CAT-CAO-HAT + 2827 10 1762 1756 1757 1763 # CTT-CAT-CAO-HAT + 2828 10 1762 1756 1761 1767 # CTT-CAT-CAO-HAT + 2829 11 1763 1757 1758 1764 # HAT-CAO-CAM-HAT + 2830 12 1764 1758 1759 1765 # HAT-CAM-CAP-HAT + 2831 12 1766 1760 1759 1765 # HAT-CAM-CAP-HAT + 2832 11 1767 1761 1760 1766 # HAT-CAO-CAM-HAT + 2833 1 1771 1772 1773 1774 # CAT-CAO-CAM-CAP + 2834 2 1771 1772 1773 1779 # CAT-CAO-CAM-HAT + 2835 1 1771 1776 1775 1774 # CAT-CAO-CAM-CAP + 2836 2 1771 1776 1775 1781 # CAT-CAO-CAM-HAT + 2837 3 1772 1771 1776 1775 # CAO-CAT-CAO-CAM + 2838 4 1772 1771 1776 1782 # CAO-CAT-CAO-HAT + 2839 5 1772 1773 1774 1775 # CAO-CAM-CAP-CAM + 2840 6 1772 1773 1774 1780 # CAO-CAM-CAP-HAT + 2841 7 1777 1771 1772 1773 # CTT-CAT-CAO-CAM + 2842 3 1776 1771 1772 1773 # CAO-CAT-CAO-CAM + 2843 5 1776 1775 1774 1773 # CAO-CAM-CAP-CAM + 2844 8 1773 1774 1775 1781 # CAM-CAP-CAM-HAT + 2845 9 1774 1773 1772 1778 # CAP-CAM-CAO-HAT + 2846 9 1774 1775 1776 1782 # CAP-CAM-CAO-HAT + 2847 8 1775 1774 1773 1779 # CAM-CAP-CAM-HAT + 2848 7 1777 1771 1776 1775 # CTT-CAT-CAO-CAM + 2849 6 1776 1775 1774 1780 # CAO-CAM-CAP-HAT + 2850 4 1776 1771 1772 1778 # CAO-CAT-CAO-HAT + 2851 10 1777 1771 1772 1778 # CTT-CAT-CAO-HAT + 2852 10 1777 1771 1776 1782 # CTT-CAT-CAO-HAT + 2853 11 1778 1772 1773 1779 # HAT-CAO-CAM-HAT + 2854 12 1779 1773 1774 1780 # HAT-CAM-CAP-HAT + 2855 12 1781 1775 1774 1780 # HAT-CAM-CAP-HAT + 2856 11 1782 1776 1775 1781 # HAT-CAO-CAM-HAT + 2857 1 1786 1787 1788 1789 # CAT-CAO-CAM-CAP + 2858 2 1786 1787 1788 1794 # CAT-CAO-CAM-HAT + 2859 1 1786 1791 1790 1789 # CAT-CAO-CAM-CAP + 2860 2 1786 1791 1790 1796 # CAT-CAO-CAM-HAT + 2861 3 1787 1786 1791 1790 # CAO-CAT-CAO-CAM + 2862 4 1787 1786 1791 1797 # CAO-CAT-CAO-HAT + 2863 5 1787 1788 1789 1790 # CAO-CAM-CAP-CAM + 2864 6 1787 1788 1789 1795 # CAO-CAM-CAP-HAT + 2865 7 1792 1786 1787 1788 # CTT-CAT-CAO-CAM + 2866 3 1791 1786 1787 1788 # CAO-CAT-CAO-CAM + 2867 5 1791 1790 1789 1788 # CAO-CAM-CAP-CAM + 2868 8 1788 1789 1790 1796 # CAM-CAP-CAM-HAT + 2869 9 1789 1788 1787 1793 # CAP-CAM-CAO-HAT + 2870 9 1789 1790 1791 1797 # CAP-CAM-CAO-HAT + 2871 8 1790 1789 1788 1794 # CAM-CAP-CAM-HAT + 2872 7 1792 1786 1791 1790 # CTT-CAT-CAO-CAM + 2873 6 1791 1790 1789 1795 # CAO-CAM-CAP-HAT + 2874 4 1791 1786 1787 1793 # CAO-CAT-CAO-HAT + 2875 10 1792 1786 1787 1793 # CTT-CAT-CAO-HAT + 2876 10 1792 1786 1791 1797 # CTT-CAT-CAO-HAT + 2877 11 1793 1787 1788 1794 # HAT-CAO-CAM-HAT + 2878 12 1794 1788 1789 1795 # HAT-CAM-CAP-HAT + 2879 12 1796 1790 1789 1795 # HAT-CAM-CAP-HAT + 2880 11 1797 1791 1790 1796 # HAT-CAO-CAM-HAT + 2881 1 1801 1802 1803 1804 # CAT-CAO-CAM-CAP + 2882 2 1801 1802 1803 1809 # CAT-CAO-CAM-HAT + 2883 1 1801 1806 1805 1804 # CAT-CAO-CAM-CAP + 2884 2 1801 1806 1805 1811 # CAT-CAO-CAM-HAT + 2885 3 1802 1801 1806 1805 # CAO-CAT-CAO-CAM + 2886 4 1802 1801 1806 1812 # CAO-CAT-CAO-HAT + 2887 5 1802 1803 1804 1805 # CAO-CAM-CAP-CAM + 2888 6 1802 1803 1804 1810 # CAO-CAM-CAP-HAT + 2889 7 1807 1801 1802 1803 # CTT-CAT-CAO-CAM + 2890 3 1806 1801 1802 1803 # CAO-CAT-CAO-CAM + 2891 5 1806 1805 1804 1803 # CAO-CAM-CAP-CAM + 2892 8 1803 1804 1805 1811 # CAM-CAP-CAM-HAT + 2893 9 1804 1803 1802 1808 # CAP-CAM-CAO-HAT + 2894 9 1804 1805 1806 1812 # CAP-CAM-CAO-HAT + 2895 8 1805 1804 1803 1809 # CAM-CAP-CAM-HAT + 2896 7 1807 1801 1806 1805 # CTT-CAT-CAO-CAM + 2897 6 1806 1805 1804 1810 # CAO-CAM-CAP-HAT + 2898 4 1806 1801 1802 1808 # CAO-CAT-CAO-HAT + 2899 10 1807 1801 1802 1808 # CTT-CAT-CAO-HAT + 2900 10 1807 1801 1806 1812 # CTT-CAT-CAO-HAT + 2901 11 1808 1802 1803 1809 # HAT-CAO-CAM-HAT + 2902 12 1809 1803 1804 1810 # HAT-CAM-CAP-HAT + 2903 12 1811 1805 1804 1810 # HAT-CAM-CAP-HAT + 2904 11 1812 1806 1805 1811 # HAT-CAO-CAM-HAT + 2905 1 1816 1817 1818 1819 # CAT-CAO-CAM-CAP + 2906 2 1816 1817 1818 1824 # CAT-CAO-CAM-HAT + 2907 1 1816 1821 1820 1819 # CAT-CAO-CAM-CAP + 2908 2 1816 1821 1820 1826 # CAT-CAO-CAM-HAT + 2909 3 1817 1816 1821 1820 # CAO-CAT-CAO-CAM + 2910 4 1817 1816 1821 1827 # CAO-CAT-CAO-HAT + 2911 5 1817 1818 1819 1820 # CAO-CAM-CAP-CAM + 2912 6 1817 1818 1819 1825 # CAO-CAM-CAP-HAT + 2913 7 1822 1816 1817 1818 # CTT-CAT-CAO-CAM + 2914 3 1821 1816 1817 1818 # CAO-CAT-CAO-CAM + 2915 5 1821 1820 1819 1818 # CAO-CAM-CAP-CAM + 2916 8 1818 1819 1820 1826 # CAM-CAP-CAM-HAT + 2917 9 1819 1818 1817 1823 # CAP-CAM-CAO-HAT + 2918 9 1819 1820 1821 1827 # CAP-CAM-CAO-HAT + 2919 8 1820 1819 1818 1824 # CAM-CAP-CAM-HAT + 2920 7 1822 1816 1821 1820 # CTT-CAT-CAO-CAM + 2921 6 1821 1820 1819 1825 # CAO-CAM-CAP-HAT + 2922 4 1821 1816 1817 1823 # CAO-CAT-CAO-HAT + 2923 10 1822 1816 1817 1823 # CTT-CAT-CAO-HAT + 2924 10 1822 1816 1821 1827 # CTT-CAT-CAO-HAT + 2925 11 1823 1817 1818 1824 # HAT-CAO-CAM-HAT + 2926 12 1824 1818 1819 1825 # HAT-CAM-CAP-HAT + 2927 12 1826 1820 1819 1825 # HAT-CAM-CAP-HAT + 2928 11 1827 1821 1820 1826 # HAT-CAO-CAM-HAT + 2929 1 1831 1832 1833 1834 # CAT-CAO-CAM-CAP + 2930 2 1831 1832 1833 1839 # CAT-CAO-CAM-HAT + 2931 1 1831 1836 1835 1834 # CAT-CAO-CAM-CAP + 2932 2 1831 1836 1835 1841 # CAT-CAO-CAM-HAT + 2933 3 1832 1831 1836 1835 # CAO-CAT-CAO-CAM + 2934 4 1832 1831 1836 1842 # CAO-CAT-CAO-HAT + 2935 5 1832 1833 1834 1835 # CAO-CAM-CAP-CAM + 2936 6 1832 1833 1834 1840 # CAO-CAM-CAP-HAT + 2937 7 1837 1831 1832 1833 # CTT-CAT-CAO-CAM + 2938 3 1836 1831 1832 1833 # CAO-CAT-CAO-CAM + 2939 5 1836 1835 1834 1833 # CAO-CAM-CAP-CAM + 2940 8 1833 1834 1835 1841 # CAM-CAP-CAM-HAT + 2941 9 1834 1833 1832 1838 # CAP-CAM-CAO-HAT + 2942 9 1834 1835 1836 1842 # CAP-CAM-CAO-HAT + 2943 8 1835 1834 1833 1839 # CAM-CAP-CAM-HAT + 2944 7 1837 1831 1836 1835 # CTT-CAT-CAO-CAM + 2945 6 1836 1835 1834 1840 # CAO-CAM-CAP-HAT + 2946 4 1836 1831 1832 1838 # CAO-CAT-CAO-HAT + 2947 10 1837 1831 1832 1838 # CTT-CAT-CAO-HAT + 2948 10 1837 1831 1836 1842 # CTT-CAT-CAO-HAT + 2949 11 1838 1832 1833 1839 # HAT-CAO-CAM-HAT + 2950 12 1839 1833 1834 1840 # HAT-CAM-CAP-HAT + 2951 12 1841 1835 1834 1840 # HAT-CAM-CAP-HAT + 2952 11 1842 1836 1835 1841 # HAT-CAO-CAM-HAT + 2953 1 1846 1847 1848 1849 # CAT-CAO-CAM-CAP + 2954 2 1846 1847 1848 1854 # CAT-CAO-CAM-HAT + 2955 1 1846 1851 1850 1849 # CAT-CAO-CAM-CAP + 2956 2 1846 1851 1850 1856 # CAT-CAO-CAM-HAT + 2957 3 1847 1846 1851 1850 # CAO-CAT-CAO-CAM + 2958 4 1847 1846 1851 1857 # CAO-CAT-CAO-HAT + 2959 5 1847 1848 1849 1850 # CAO-CAM-CAP-CAM + 2960 6 1847 1848 1849 1855 # CAO-CAM-CAP-HAT + 2961 7 1852 1846 1847 1848 # CTT-CAT-CAO-CAM + 2962 3 1851 1846 1847 1848 # CAO-CAT-CAO-CAM + 2963 5 1851 1850 1849 1848 # CAO-CAM-CAP-CAM + 2964 8 1848 1849 1850 1856 # CAM-CAP-CAM-HAT + 2965 9 1849 1848 1847 1853 # CAP-CAM-CAO-HAT + 2966 9 1849 1850 1851 1857 # CAP-CAM-CAO-HAT + 2967 8 1850 1849 1848 1854 # CAM-CAP-CAM-HAT + 2968 7 1852 1846 1851 1850 # CTT-CAT-CAO-CAM + 2969 6 1851 1850 1849 1855 # CAO-CAM-CAP-HAT + 2970 4 1851 1846 1847 1853 # CAO-CAT-CAO-HAT + 2971 10 1852 1846 1847 1853 # CTT-CAT-CAO-HAT + 2972 10 1852 1846 1851 1857 # CTT-CAT-CAO-HAT + 2973 11 1853 1847 1848 1854 # HAT-CAO-CAM-HAT + 2974 12 1854 1848 1849 1855 # HAT-CAM-CAP-HAT + 2975 12 1856 1850 1849 1855 # HAT-CAM-CAP-HAT + 2976 11 1857 1851 1850 1856 # HAT-CAO-CAM-HAT + 2977 1 1861 1862 1863 1864 # CAT-CAO-CAM-CAP + 2978 2 1861 1862 1863 1869 # CAT-CAO-CAM-HAT + 2979 1 1861 1866 1865 1864 # CAT-CAO-CAM-CAP + 2980 2 1861 1866 1865 1871 # CAT-CAO-CAM-HAT + 2981 3 1862 1861 1866 1865 # CAO-CAT-CAO-CAM + 2982 4 1862 1861 1866 1872 # CAO-CAT-CAO-HAT + 2983 5 1862 1863 1864 1865 # CAO-CAM-CAP-CAM + 2984 6 1862 1863 1864 1870 # CAO-CAM-CAP-HAT + 2985 7 1867 1861 1862 1863 # CTT-CAT-CAO-CAM + 2986 3 1866 1861 1862 1863 # CAO-CAT-CAO-CAM + 2987 5 1866 1865 1864 1863 # CAO-CAM-CAP-CAM + 2988 8 1863 1864 1865 1871 # CAM-CAP-CAM-HAT + 2989 9 1864 1863 1862 1868 # CAP-CAM-CAO-HAT + 2990 9 1864 1865 1866 1872 # CAP-CAM-CAO-HAT + 2991 8 1865 1864 1863 1869 # CAM-CAP-CAM-HAT + 2992 7 1867 1861 1866 1865 # CTT-CAT-CAO-CAM + 2993 6 1866 1865 1864 1870 # CAO-CAM-CAP-HAT + 2994 4 1866 1861 1862 1868 # CAO-CAT-CAO-HAT + 2995 10 1867 1861 1862 1868 # CTT-CAT-CAO-HAT + 2996 10 1867 1861 1866 1872 # CTT-CAT-CAO-HAT + 2997 11 1868 1862 1863 1869 # HAT-CAO-CAM-HAT + 2998 12 1869 1863 1864 1870 # HAT-CAM-CAP-HAT + 2999 12 1871 1865 1864 1870 # HAT-CAM-CAP-HAT + 3000 11 1872 1866 1865 1871 # HAT-CAO-CAM-HAT + 3001 1 1876 1877 1878 1879 # CAT-CAO-CAM-CAP + 3002 2 1876 1877 1878 1884 # CAT-CAO-CAM-HAT + 3003 1 1876 1881 1880 1879 # CAT-CAO-CAM-CAP + 3004 2 1876 1881 1880 1886 # CAT-CAO-CAM-HAT + 3005 3 1877 1876 1881 1880 # CAO-CAT-CAO-CAM + 3006 4 1877 1876 1881 1887 # CAO-CAT-CAO-HAT + 3007 5 1877 1878 1879 1880 # CAO-CAM-CAP-CAM + 3008 6 1877 1878 1879 1885 # CAO-CAM-CAP-HAT + 3009 7 1882 1876 1877 1878 # CTT-CAT-CAO-CAM + 3010 3 1881 1876 1877 1878 # CAO-CAT-CAO-CAM + 3011 5 1881 1880 1879 1878 # CAO-CAM-CAP-CAM + 3012 8 1878 1879 1880 1886 # CAM-CAP-CAM-HAT + 3013 9 1879 1878 1877 1883 # CAP-CAM-CAO-HAT + 3014 9 1879 1880 1881 1887 # CAP-CAM-CAO-HAT + 3015 8 1880 1879 1878 1884 # CAM-CAP-CAM-HAT + 3016 7 1882 1876 1881 1880 # CTT-CAT-CAO-CAM + 3017 6 1881 1880 1879 1885 # CAO-CAM-CAP-HAT + 3018 4 1881 1876 1877 1883 # CAO-CAT-CAO-HAT + 3019 10 1882 1876 1877 1883 # CTT-CAT-CAO-HAT + 3020 10 1882 1876 1881 1887 # CTT-CAT-CAO-HAT + 3021 11 1883 1877 1878 1884 # HAT-CAO-CAM-HAT + 3022 12 1884 1878 1879 1885 # HAT-CAM-CAP-HAT + 3023 12 1886 1880 1879 1885 # HAT-CAM-CAP-HAT + 3024 11 1887 1881 1880 1886 # HAT-CAO-CAM-HAT + 3025 1 1891 1892 1893 1894 # CAT-CAO-CAM-CAP + 3026 2 1891 1892 1893 1899 # CAT-CAO-CAM-HAT + 3027 1 1891 1896 1895 1894 # CAT-CAO-CAM-CAP + 3028 2 1891 1896 1895 1901 # CAT-CAO-CAM-HAT + 3029 3 1892 1891 1896 1895 # CAO-CAT-CAO-CAM + 3030 4 1892 1891 1896 1902 # CAO-CAT-CAO-HAT + 3031 5 1892 1893 1894 1895 # CAO-CAM-CAP-CAM + 3032 6 1892 1893 1894 1900 # CAO-CAM-CAP-HAT + 3033 7 1897 1891 1892 1893 # CTT-CAT-CAO-CAM + 3034 3 1896 1891 1892 1893 # CAO-CAT-CAO-CAM + 3035 5 1896 1895 1894 1893 # CAO-CAM-CAP-CAM + 3036 8 1893 1894 1895 1901 # CAM-CAP-CAM-HAT + 3037 9 1894 1893 1892 1898 # CAP-CAM-CAO-HAT + 3038 9 1894 1895 1896 1902 # CAP-CAM-CAO-HAT + 3039 8 1895 1894 1893 1899 # CAM-CAP-CAM-HAT + 3040 7 1897 1891 1896 1895 # CTT-CAT-CAO-CAM + 3041 6 1896 1895 1894 1900 # CAO-CAM-CAP-HAT + 3042 4 1896 1891 1892 1898 # CAO-CAT-CAO-HAT + 3043 10 1897 1891 1892 1898 # CTT-CAT-CAO-HAT + 3044 10 1897 1891 1896 1902 # CTT-CAT-CAO-HAT + 3045 11 1898 1892 1893 1899 # HAT-CAO-CAM-HAT + 3046 12 1899 1893 1894 1900 # HAT-CAM-CAP-HAT + 3047 12 1901 1895 1894 1900 # HAT-CAM-CAP-HAT + 3048 11 1902 1896 1895 1901 # HAT-CAO-CAM-HAT + 3049 1 1906 1907 1908 1909 # CAT-CAO-CAM-CAP + 3050 2 1906 1907 1908 1914 # CAT-CAO-CAM-HAT + 3051 1 1906 1911 1910 1909 # CAT-CAO-CAM-CAP + 3052 2 1906 1911 1910 1916 # CAT-CAO-CAM-HAT + 3053 3 1907 1906 1911 1910 # CAO-CAT-CAO-CAM + 3054 4 1907 1906 1911 1917 # CAO-CAT-CAO-HAT + 3055 5 1907 1908 1909 1910 # CAO-CAM-CAP-CAM + 3056 6 1907 1908 1909 1915 # CAO-CAM-CAP-HAT + 3057 7 1912 1906 1907 1908 # CTT-CAT-CAO-CAM + 3058 3 1911 1906 1907 1908 # CAO-CAT-CAO-CAM + 3059 5 1911 1910 1909 1908 # CAO-CAM-CAP-CAM + 3060 8 1908 1909 1910 1916 # CAM-CAP-CAM-HAT + 3061 9 1909 1908 1907 1913 # CAP-CAM-CAO-HAT + 3062 9 1909 1910 1911 1917 # CAP-CAM-CAO-HAT + 3063 8 1910 1909 1908 1914 # CAM-CAP-CAM-HAT + 3064 7 1912 1906 1911 1910 # CTT-CAT-CAO-CAM + 3065 6 1911 1910 1909 1915 # CAO-CAM-CAP-HAT + 3066 4 1911 1906 1907 1913 # CAO-CAT-CAO-HAT + 3067 10 1912 1906 1907 1913 # CTT-CAT-CAO-HAT + 3068 10 1912 1906 1911 1917 # CTT-CAT-CAO-HAT + 3069 11 1913 1907 1908 1914 # HAT-CAO-CAM-HAT + 3070 12 1914 1908 1909 1915 # HAT-CAM-CAP-HAT + 3071 12 1916 1910 1909 1915 # HAT-CAM-CAP-HAT + 3072 11 1917 1911 1910 1916 # HAT-CAO-CAM-HAT + 3073 1 1921 1922 1923 1924 # CAT-CAO-CAM-CAP + 3074 2 1921 1922 1923 1929 # CAT-CAO-CAM-HAT + 3075 1 1921 1926 1925 1924 # CAT-CAO-CAM-CAP + 3076 2 1921 1926 1925 1931 # CAT-CAO-CAM-HAT + 3077 3 1922 1921 1926 1925 # CAO-CAT-CAO-CAM + 3078 4 1922 1921 1926 1932 # CAO-CAT-CAO-HAT + 3079 5 1922 1923 1924 1925 # CAO-CAM-CAP-CAM + 3080 6 1922 1923 1924 1930 # CAO-CAM-CAP-HAT + 3081 7 1927 1921 1922 1923 # CTT-CAT-CAO-CAM + 3082 3 1926 1921 1922 1923 # CAO-CAT-CAO-CAM + 3083 5 1926 1925 1924 1923 # CAO-CAM-CAP-CAM + 3084 8 1923 1924 1925 1931 # CAM-CAP-CAM-HAT + 3085 9 1924 1923 1922 1928 # CAP-CAM-CAO-HAT + 3086 9 1924 1925 1926 1932 # CAP-CAM-CAO-HAT + 3087 8 1925 1924 1923 1929 # CAM-CAP-CAM-HAT + 3088 7 1927 1921 1926 1925 # CTT-CAT-CAO-CAM + 3089 6 1926 1925 1924 1930 # CAO-CAM-CAP-HAT + 3090 4 1926 1921 1922 1928 # CAO-CAT-CAO-HAT + 3091 10 1927 1921 1922 1928 # CTT-CAT-CAO-HAT + 3092 10 1927 1921 1926 1932 # CTT-CAT-CAO-HAT + 3093 11 1928 1922 1923 1929 # HAT-CAO-CAM-HAT + 3094 12 1929 1923 1924 1930 # HAT-CAM-CAP-HAT + 3095 12 1931 1925 1924 1930 # HAT-CAM-CAP-HAT + 3096 11 1932 1926 1925 1931 # HAT-CAO-CAM-HAT + 3097 1 1936 1937 1938 1939 # CAT-CAO-CAM-CAP + 3098 2 1936 1937 1938 1944 # CAT-CAO-CAM-HAT + 3099 1 1936 1941 1940 1939 # CAT-CAO-CAM-CAP + 3100 2 1936 1941 1940 1946 # CAT-CAO-CAM-HAT + 3101 3 1937 1936 1941 1940 # CAO-CAT-CAO-CAM + 3102 4 1937 1936 1941 1947 # CAO-CAT-CAO-HAT + 3103 5 1937 1938 1939 1940 # CAO-CAM-CAP-CAM + 3104 6 1937 1938 1939 1945 # CAO-CAM-CAP-HAT + 3105 7 1942 1936 1937 1938 # CTT-CAT-CAO-CAM + 3106 3 1941 1936 1937 1938 # CAO-CAT-CAO-CAM + 3107 5 1941 1940 1939 1938 # CAO-CAM-CAP-CAM + 3108 8 1938 1939 1940 1946 # CAM-CAP-CAM-HAT + 3109 9 1939 1938 1937 1943 # CAP-CAM-CAO-HAT + 3110 9 1939 1940 1941 1947 # CAP-CAM-CAO-HAT + 3111 8 1940 1939 1938 1944 # CAM-CAP-CAM-HAT + 3112 7 1942 1936 1941 1940 # CTT-CAT-CAO-CAM + 3113 6 1941 1940 1939 1945 # CAO-CAM-CAP-HAT + 3114 4 1941 1936 1937 1943 # CAO-CAT-CAO-HAT + 3115 10 1942 1936 1937 1943 # CTT-CAT-CAO-HAT + 3116 10 1942 1936 1941 1947 # CTT-CAT-CAO-HAT + 3117 11 1943 1937 1938 1944 # HAT-CAO-CAM-HAT + 3118 12 1944 1938 1939 1945 # HAT-CAM-CAP-HAT + 3119 12 1946 1940 1939 1945 # HAT-CAM-CAP-HAT + 3120 11 1947 1941 1940 1946 # HAT-CAO-CAM-HAT + 3121 1 1951 1952 1953 1954 # CAT-CAO-CAM-CAP + 3122 2 1951 1952 1953 1959 # CAT-CAO-CAM-HAT + 3123 1 1951 1956 1955 1954 # CAT-CAO-CAM-CAP + 3124 2 1951 1956 1955 1961 # CAT-CAO-CAM-HAT + 3125 3 1952 1951 1956 1955 # CAO-CAT-CAO-CAM + 3126 4 1952 1951 1956 1962 # CAO-CAT-CAO-HAT + 3127 5 1952 1953 1954 1955 # CAO-CAM-CAP-CAM + 3128 6 1952 1953 1954 1960 # CAO-CAM-CAP-HAT + 3129 7 1957 1951 1952 1953 # CTT-CAT-CAO-CAM + 3130 3 1956 1951 1952 1953 # CAO-CAT-CAO-CAM + 3131 5 1956 1955 1954 1953 # CAO-CAM-CAP-CAM + 3132 8 1953 1954 1955 1961 # CAM-CAP-CAM-HAT + 3133 9 1954 1953 1952 1958 # CAP-CAM-CAO-HAT + 3134 9 1954 1955 1956 1962 # CAP-CAM-CAO-HAT + 3135 8 1955 1954 1953 1959 # CAM-CAP-CAM-HAT + 3136 7 1957 1951 1956 1955 # CTT-CAT-CAO-CAM + 3137 6 1956 1955 1954 1960 # CAO-CAM-CAP-HAT + 3138 4 1956 1951 1952 1958 # CAO-CAT-CAO-HAT + 3139 10 1957 1951 1952 1958 # CTT-CAT-CAO-HAT + 3140 10 1957 1951 1956 1962 # CTT-CAT-CAO-HAT + 3141 11 1958 1952 1953 1959 # HAT-CAO-CAM-HAT + 3142 12 1959 1953 1954 1960 # HAT-CAM-CAP-HAT + 3143 12 1961 1955 1954 1960 # HAT-CAM-CAP-HAT + 3144 11 1962 1956 1955 1961 # HAT-CAO-CAM-HAT + 3145 1 1966 1967 1968 1969 # CAT-CAO-CAM-CAP + 3146 2 1966 1967 1968 1974 # CAT-CAO-CAM-HAT + 3147 1 1966 1971 1970 1969 # CAT-CAO-CAM-CAP + 3148 2 1966 1971 1970 1976 # CAT-CAO-CAM-HAT + 3149 3 1967 1966 1971 1970 # CAO-CAT-CAO-CAM + 3150 4 1967 1966 1971 1977 # CAO-CAT-CAO-HAT + 3151 5 1967 1968 1969 1970 # CAO-CAM-CAP-CAM + 3152 6 1967 1968 1969 1975 # CAO-CAM-CAP-HAT + 3153 7 1972 1966 1967 1968 # CTT-CAT-CAO-CAM + 3154 3 1971 1966 1967 1968 # CAO-CAT-CAO-CAM + 3155 5 1971 1970 1969 1968 # CAO-CAM-CAP-CAM + 3156 8 1968 1969 1970 1976 # CAM-CAP-CAM-HAT + 3157 9 1969 1968 1967 1973 # CAP-CAM-CAO-HAT + 3158 9 1969 1970 1971 1977 # CAP-CAM-CAO-HAT + 3159 8 1970 1969 1968 1974 # CAM-CAP-CAM-HAT + 3160 7 1972 1966 1971 1970 # CTT-CAT-CAO-CAM + 3161 6 1971 1970 1969 1975 # CAO-CAM-CAP-HAT + 3162 4 1971 1966 1967 1973 # CAO-CAT-CAO-HAT + 3163 10 1972 1966 1967 1973 # CTT-CAT-CAO-HAT + 3164 10 1972 1966 1971 1977 # CTT-CAT-CAO-HAT + 3165 11 1973 1967 1968 1974 # HAT-CAO-CAM-HAT + 3166 12 1974 1968 1969 1975 # HAT-CAM-CAP-HAT + 3167 12 1976 1970 1969 1975 # HAT-CAM-CAP-HAT + 3168 11 1977 1971 1970 1976 # HAT-CAO-CAM-HAT + 3169 1 1981 1982 1983 1984 # CAT-CAO-CAM-CAP + 3170 2 1981 1982 1983 1989 # CAT-CAO-CAM-HAT + 3171 1 1981 1986 1985 1984 # CAT-CAO-CAM-CAP + 3172 2 1981 1986 1985 1991 # CAT-CAO-CAM-HAT + 3173 3 1982 1981 1986 1985 # CAO-CAT-CAO-CAM + 3174 4 1982 1981 1986 1992 # CAO-CAT-CAO-HAT + 3175 5 1982 1983 1984 1985 # CAO-CAM-CAP-CAM + 3176 6 1982 1983 1984 1990 # CAO-CAM-CAP-HAT + 3177 7 1987 1981 1982 1983 # CTT-CAT-CAO-CAM + 3178 3 1986 1981 1982 1983 # CAO-CAT-CAO-CAM + 3179 5 1986 1985 1984 1983 # CAO-CAM-CAP-CAM + 3180 8 1983 1984 1985 1991 # CAM-CAP-CAM-HAT + 3181 9 1984 1983 1982 1988 # CAP-CAM-CAO-HAT + 3182 9 1984 1985 1986 1992 # CAP-CAM-CAO-HAT + 3183 8 1985 1984 1983 1989 # CAM-CAP-CAM-HAT + 3184 7 1987 1981 1986 1985 # CTT-CAT-CAO-CAM + 3185 6 1986 1985 1984 1990 # CAO-CAM-CAP-HAT + 3186 4 1986 1981 1982 1988 # CAO-CAT-CAO-HAT + 3187 10 1987 1981 1982 1988 # CTT-CAT-CAO-HAT + 3188 10 1987 1981 1986 1992 # CTT-CAT-CAO-HAT + 3189 11 1988 1982 1983 1989 # HAT-CAO-CAM-HAT + 3190 12 1989 1983 1984 1990 # HAT-CAM-CAP-HAT + 3191 12 1991 1985 1984 1990 # HAT-CAM-CAP-HAT + 3192 11 1992 1986 1985 1991 # HAT-CAO-CAM-HAT + 3193 1 1996 1997 1998 1999 # CAT-CAO-CAM-CAP + 3194 2 1996 1997 1998 2004 # CAT-CAO-CAM-HAT + 3195 1 1996 2001 2000 1999 # CAT-CAO-CAM-CAP + 3196 2 1996 2001 2000 2006 # CAT-CAO-CAM-HAT + 3197 3 1997 1996 2001 2000 # CAO-CAT-CAO-CAM + 3198 4 1997 1996 2001 2007 # CAO-CAT-CAO-HAT + 3199 5 1997 1998 1999 2000 # CAO-CAM-CAP-CAM + 3200 6 1997 1998 1999 2005 # CAO-CAM-CAP-HAT + 3201 7 2002 1996 1997 1998 # CTT-CAT-CAO-CAM + 3202 3 2001 1996 1997 1998 # CAO-CAT-CAO-CAM + 3203 5 2001 2000 1999 1998 # CAO-CAM-CAP-CAM + 3204 8 1998 1999 2000 2006 # CAM-CAP-CAM-HAT + 3205 9 1999 1998 1997 2003 # CAP-CAM-CAO-HAT + 3206 9 1999 2000 2001 2007 # CAP-CAM-CAO-HAT + 3207 8 2000 1999 1998 2004 # CAM-CAP-CAM-HAT + 3208 7 2002 1996 2001 2000 # CTT-CAT-CAO-CAM + 3209 6 2001 2000 1999 2005 # CAO-CAM-CAP-HAT + 3210 4 2001 1996 1997 2003 # CAO-CAT-CAO-HAT + 3211 10 2002 1996 1997 2003 # CTT-CAT-CAO-HAT + 3212 10 2002 1996 2001 2007 # CTT-CAT-CAO-HAT + 3213 11 2003 1997 1998 2004 # HAT-CAO-CAM-HAT + 3214 12 2004 1998 1999 2005 # HAT-CAM-CAP-HAT + 3215 12 2006 2000 1999 2005 # HAT-CAM-CAP-HAT + 3216 11 2007 2001 2000 2006 # HAT-CAO-CAM-HAT + 3217 1 2011 2012 2013 2014 # CAT-CAO-CAM-CAP + 3218 2 2011 2012 2013 2019 # CAT-CAO-CAM-HAT + 3219 1 2011 2016 2015 2014 # CAT-CAO-CAM-CAP + 3220 2 2011 2016 2015 2021 # CAT-CAO-CAM-HAT + 3221 3 2012 2011 2016 2015 # CAO-CAT-CAO-CAM + 3222 4 2012 2011 2016 2022 # CAO-CAT-CAO-HAT + 3223 5 2012 2013 2014 2015 # CAO-CAM-CAP-CAM + 3224 6 2012 2013 2014 2020 # CAO-CAM-CAP-HAT + 3225 7 2017 2011 2012 2013 # CTT-CAT-CAO-CAM + 3226 3 2016 2011 2012 2013 # CAO-CAT-CAO-CAM + 3227 5 2016 2015 2014 2013 # CAO-CAM-CAP-CAM + 3228 8 2013 2014 2015 2021 # CAM-CAP-CAM-HAT + 3229 9 2014 2013 2012 2018 # CAP-CAM-CAO-HAT + 3230 9 2014 2015 2016 2022 # CAP-CAM-CAO-HAT + 3231 8 2015 2014 2013 2019 # CAM-CAP-CAM-HAT + 3232 7 2017 2011 2016 2015 # CTT-CAT-CAO-CAM + 3233 6 2016 2015 2014 2020 # CAO-CAM-CAP-HAT + 3234 4 2016 2011 2012 2018 # CAO-CAT-CAO-HAT + 3235 10 2017 2011 2012 2018 # CTT-CAT-CAO-HAT + 3236 10 2017 2011 2016 2022 # CTT-CAT-CAO-HAT + 3237 11 2018 2012 2013 2019 # HAT-CAO-CAM-HAT + 3238 12 2019 2013 2014 2020 # HAT-CAM-CAP-HAT + 3239 12 2021 2015 2014 2020 # HAT-CAM-CAP-HAT + 3240 11 2022 2016 2015 2021 # HAT-CAO-CAM-HAT + 3241 1 2026 2027 2028 2029 # CAT-CAO-CAM-CAP + 3242 2 2026 2027 2028 2034 # CAT-CAO-CAM-HAT + 3243 1 2026 2031 2030 2029 # CAT-CAO-CAM-CAP + 3244 2 2026 2031 2030 2036 # CAT-CAO-CAM-HAT + 3245 3 2027 2026 2031 2030 # CAO-CAT-CAO-CAM + 3246 4 2027 2026 2031 2037 # CAO-CAT-CAO-HAT + 3247 5 2027 2028 2029 2030 # CAO-CAM-CAP-CAM + 3248 6 2027 2028 2029 2035 # CAO-CAM-CAP-HAT + 3249 7 2032 2026 2027 2028 # CTT-CAT-CAO-CAM + 3250 3 2031 2026 2027 2028 # CAO-CAT-CAO-CAM + 3251 5 2031 2030 2029 2028 # CAO-CAM-CAP-CAM + 3252 8 2028 2029 2030 2036 # CAM-CAP-CAM-HAT + 3253 9 2029 2028 2027 2033 # CAP-CAM-CAO-HAT + 3254 9 2029 2030 2031 2037 # CAP-CAM-CAO-HAT + 3255 8 2030 2029 2028 2034 # CAM-CAP-CAM-HAT + 3256 7 2032 2026 2031 2030 # CTT-CAT-CAO-CAM + 3257 6 2031 2030 2029 2035 # CAO-CAM-CAP-HAT + 3258 4 2031 2026 2027 2033 # CAO-CAT-CAO-HAT + 3259 10 2032 2026 2027 2033 # CTT-CAT-CAO-HAT + 3260 10 2032 2026 2031 2037 # CTT-CAT-CAO-HAT + 3261 11 2033 2027 2028 2034 # HAT-CAO-CAM-HAT + 3262 12 2034 2028 2029 2035 # HAT-CAM-CAP-HAT + 3263 12 2036 2030 2029 2035 # HAT-CAM-CAP-HAT + 3264 11 2037 2031 2030 2036 # HAT-CAO-CAM-HAT + 3265 1 2041 2042 2043 2044 # CAT-CAO-CAM-CAP + 3266 2 2041 2042 2043 2049 # CAT-CAO-CAM-HAT + 3267 1 2041 2046 2045 2044 # CAT-CAO-CAM-CAP + 3268 2 2041 2046 2045 2051 # CAT-CAO-CAM-HAT + 3269 3 2042 2041 2046 2045 # CAO-CAT-CAO-CAM + 3270 4 2042 2041 2046 2052 # CAO-CAT-CAO-HAT + 3271 5 2042 2043 2044 2045 # CAO-CAM-CAP-CAM + 3272 6 2042 2043 2044 2050 # CAO-CAM-CAP-HAT + 3273 7 2047 2041 2042 2043 # CTT-CAT-CAO-CAM + 3274 3 2046 2041 2042 2043 # CAO-CAT-CAO-CAM + 3275 5 2046 2045 2044 2043 # CAO-CAM-CAP-CAM + 3276 8 2043 2044 2045 2051 # CAM-CAP-CAM-HAT + 3277 9 2044 2043 2042 2048 # CAP-CAM-CAO-HAT + 3278 9 2044 2045 2046 2052 # CAP-CAM-CAO-HAT + 3279 8 2045 2044 2043 2049 # CAM-CAP-CAM-HAT + 3280 7 2047 2041 2046 2045 # CTT-CAT-CAO-CAM + 3281 6 2046 2045 2044 2050 # CAO-CAM-CAP-HAT + 3282 4 2046 2041 2042 2048 # CAO-CAT-CAO-HAT + 3283 10 2047 2041 2042 2048 # CTT-CAT-CAO-HAT + 3284 10 2047 2041 2046 2052 # CTT-CAT-CAO-HAT + 3285 11 2048 2042 2043 2049 # HAT-CAO-CAM-HAT + 3286 12 2049 2043 2044 2050 # HAT-CAM-CAP-HAT + 3287 12 2051 2045 2044 2050 # HAT-CAM-CAP-HAT + 3288 11 2052 2046 2045 2051 # HAT-CAO-CAM-HAT + 3289 1 2056 2057 2058 2059 # CAT-CAO-CAM-CAP + 3290 2 2056 2057 2058 2064 # CAT-CAO-CAM-HAT + 3291 1 2056 2061 2060 2059 # CAT-CAO-CAM-CAP + 3292 2 2056 2061 2060 2066 # CAT-CAO-CAM-HAT + 3293 3 2057 2056 2061 2060 # CAO-CAT-CAO-CAM + 3294 4 2057 2056 2061 2067 # CAO-CAT-CAO-HAT + 3295 5 2057 2058 2059 2060 # CAO-CAM-CAP-CAM + 3296 6 2057 2058 2059 2065 # CAO-CAM-CAP-HAT + 3297 7 2062 2056 2057 2058 # CTT-CAT-CAO-CAM + 3298 3 2061 2056 2057 2058 # CAO-CAT-CAO-CAM + 3299 5 2061 2060 2059 2058 # CAO-CAM-CAP-CAM + 3300 8 2058 2059 2060 2066 # CAM-CAP-CAM-HAT + 3301 9 2059 2058 2057 2063 # CAP-CAM-CAO-HAT + 3302 9 2059 2060 2061 2067 # CAP-CAM-CAO-HAT + 3303 8 2060 2059 2058 2064 # CAM-CAP-CAM-HAT + 3304 7 2062 2056 2061 2060 # CTT-CAT-CAO-CAM + 3305 6 2061 2060 2059 2065 # CAO-CAM-CAP-HAT + 3306 4 2061 2056 2057 2063 # CAO-CAT-CAO-HAT + 3307 10 2062 2056 2057 2063 # CTT-CAT-CAO-HAT + 3308 10 2062 2056 2061 2067 # CTT-CAT-CAO-HAT + 3309 11 2063 2057 2058 2064 # HAT-CAO-CAM-HAT + 3310 12 2064 2058 2059 2065 # HAT-CAM-CAP-HAT + 3311 12 2066 2060 2059 2065 # HAT-CAM-CAP-HAT + 3312 11 2067 2061 2060 2066 # HAT-CAO-CAM-HAT + 3313 1 2071 2072 2073 2074 # CAT-CAO-CAM-CAP + 3314 2 2071 2072 2073 2079 # CAT-CAO-CAM-HAT + 3315 1 2071 2076 2075 2074 # CAT-CAO-CAM-CAP + 3316 2 2071 2076 2075 2081 # CAT-CAO-CAM-HAT + 3317 3 2072 2071 2076 2075 # CAO-CAT-CAO-CAM + 3318 4 2072 2071 2076 2082 # CAO-CAT-CAO-HAT + 3319 5 2072 2073 2074 2075 # CAO-CAM-CAP-CAM + 3320 6 2072 2073 2074 2080 # CAO-CAM-CAP-HAT + 3321 7 2077 2071 2072 2073 # CTT-CAT-CAO-CAM + 3322 3 2076 2071 2072 2073 # CAO-CAT-CAO-CAM + 3323 5 2076 2075 2074 2073 # CAO-CAM-CAP-CAM + 3324 8 2073 2074 2075 2081 # CAM-CAP-CAM-HAT + 3325 9 2074 2073 2072 2078 # CAP-CAM-CAO-HAT + 3326 9 2074 2075 2076 2082 # CAP-CAM-CAO-HAT + 3327 8 2075 2074 2073 2079 # CAM-CAP-CAM-HAT + 3328 7 2077 2071 2076 2075 # CTT-CAT-CAO-CAM + 3329 6 2076 2075 2074 2080 # CAO-CAM-CAP-HAT + 3330 4 2076 2071 2072 2078 # CAO-CAT-CAO-HAT + 3331 10 2077 2071 2072 2078 # CTT-CAT-CAO-HAT + 3332 10 2077 2071 2076 2082 # CTT-CAT-CAO-HAT + 3333 11 2078 2072 2073 2079 # HAT-CAO-CAM-HAT + 3334 12 2079 2073 2074 2080 # HAT-CAM-CAP-HAT + 3335 12 2081 2075 2074 2080 # HAT-CAM-CAP-HAT + 3336 11 2082 2076 2075 2081 # HAT-CAO-CAM-HAT + 3337 1 2086 2087 2088 2089 # CAT-CAO-CAM-CAP + 3338 2 2086 2087 2088 2094 # CAT-CAO-CAM-HAT + 3339 1 2086 2091 2090 2089 # CAT-CAO-CAM-CAP + 3340 2 2086 2091 2090 2096 # CAT-CAO-CAM-HAT + 3341 3 2087 2086 2091 2090 # CAO-CAT-CAO-CAM + 3342 4 2087 2086 2091 2097 # CAO-CAT-CAO-HAT + 3343 5 2087 2088 2089 2090 # CAO-CAM-CAP-CAM + 3344 6 2087 2088 2089 2095 # CAO-CAM-CAP-HAT + 3345 7 2092 2086 2087 2088 # CTT-CAT-CAO-CAM + 3346 3 2091 2086 2087 2088 # CAO-CAT-CAO-CAM + 3347 5 2091 2090 2089 2088 # CAO-CAM-CAP-CAM + 3348 8 2088 2089 2090 2096 # CAM-CAP-CAM-HAT + 3349 9 2089 2088 2087 2093 # CAP-CAM-CAO-HAT + 3350 9 2089 2090 2091 2097 # CAP-CAM-CAO-HAT + 3351 8 2090 2089 2088 2094 # CAM-CAP-CAM-HAT + 3352 7 2092 2086 2091 2090 # CTT-CAT-CAO-CAM + 3353 6 2091 2090 2089 2095 # CAO-CAM-CAP-HAT + 3354 4 2091 2086 2087 2093 # CAO-CAT-CAO-HAT + 3355 10 2092 2086 2087 2093 # CTT-CAT-CAO-HAT + 3356 10 2092 2086 2091 2097 # CTT-CAT-CAO-HAT + 3357 11 2093 2087 2088 2094 # HAT-CAO-CAM-HAT + 3358 12 2094 2088 2089 2095 # HAT-CAM-CAP-HAT + 3359 12 2096 2090 2089 2095 # HAT-CAM-CAP-HAT + 3360 11 2097 2091 2090 2096 # HAT-CAO-CAM-HAT + 3361 1 2101 2102 2103 2104 # CAT-CAO-CAM-CAP + 3362 2 2101 2102 2103 2109 # CAT-CAO-CAM-HAT + 3363 1 2101 2106 2105 2104 # CAT-CAO-CAM-CAP + 3364 2 2101 2106 2105 2111 # CAT-CAO-CAM-HAT + 3365 3 2102 2101 2106 2105 # CAO-CAT-CAO-CAM + 3366 4 2102 2101 2106 2112 # CAO-CAT-CAO-HAT + 3367 5 2102 2103 2104 2105 # CAO-CAM-CAP-CAM + 3368 6 2102 2103 2104 2110 # CAO-CAM-CAP-HAT + 3369 7 2107 2101 2102 2103 # CTT-CAT-CAO-CAM + 3370 3 2106 2101 2102 2103 # CAO-CAT-CAO-CAM + 3371 5 2106 2105 2104 2103 # CAO-CAM-CAP-CAM + 3372 8 2103 2104 2105 2111 # CAM-CAP-CAM-HAT + 3373 9 2104 2103 2102 2108 # CAP-CAM-CAO-HAT + 3374 9 2104 2105 2106 2112 # CAP-CAM-CAO-HAT + 3375 8 2105 2104 2103 2109 # CAM-CAP-CAM-HAT + 3376 7 2107 2101 2106 2105 # CTT-CAT-CAO-CAM + 3377 6 2106 2105 2104 2110 # CAO-CAM-CAP-HAT + 3378 4 2106 2101 2102 2108 # CAO-CAT-CAO-HAT + 3379 10 2107 2101 2102 2108 # CTT-CAT-CAO-HAT + 3380 10 2107 2101 2106 2112 # CTT-CAT-CAO-HAT + 3381 11 2108 2102 2103 2109 # HAT-CAO-CAM-HAT + 3382 12 2109 2103 2104 2110 # HAT-CAM-CAP-HAT + 3383 12 2111 2105 2104 2110 # HAT-CAM-CAP-HAT + 3384 11 2112 2106 2105 2111 # HAT-CAO-CAM-HAT + 3385 1 2116 2117 2118 2119 # CAT-CAO-CAM-CAP + 3386 2 2116 2117 2118 2124 # CAT-CAO-CAM-HAT + 3387 1 2116 2121 2120 2119 # CAT-CAO-CAM-CAP + 3388 2 2116 2121 2120 2126 # CAT-CAO-CAM-HAT + 3389 3 2117 2116 2121 2120 # CAO-CAT-CAO-CAM + 3390 4 2117 2116 2121 2127 # CAO-CAT-CAO-HAT + 3391 5 2117 2118 2119 2120 # CAO-CAM-CAP-CAM + 3392 6 2117 2118 2119 2125 # CAO-CAM-CAP-HAT + 3393 7 2122 2116 2117 2118 # CTT-CAT-CAO-CAM + 3394 3 2121 2116 2117 2118 # CAO-CAT-CAO-CAM + 3395 5 2121 2120 2119 2118 # CAO-CAM-CAP-CAM + 3396 8 2118 2119 2120 2126 # CAM-CAP-CAM-HAT + 3397 9 2119 2118 2117 2123 # CAP-CAM-CAO-HAT + 3398 9 2119 2120 2121 2127 # CAP-CAM-CAO-HAT + 3399 8 2120 2119 2118 2124 # CAM-CAP-CAM-HAT + 3400 7 2122 2116 2121 2120 # CTT-CAT-CAO-CAM + 3401 6 2121 2120 2119 2125 # CAO-CAM-CAP-HAT + 3402 4 2121 2116 2117 2123 # CAO-CAT-CAO-HAT + 3403 10 2122 2116 2117 2123 # CTT-CAT-CAO-HAT + 3404 10 2122 2116 2121 2127 # CTT-CAT-CAO-HAT + 3405 11 2123 2117 2118 2124 # HAT-CAO-CAM-HAT + 3406 12 2124 2118 2119 2125 # HAT-CAM-CAP-HAT + 3407 12 2126 2120 2119 2125 # HAT-CAM-CAP-HAT + 3408 11 2127 2121 2120 2126 # HAT-CAO-CAM-HAT + 3409 1 2131 2132 2133 2134 # CAT-CAO-CAM-CAP + 3410 2 2131 2132 2133 2139 # CAT-CAO-CAM-HAT + 3411 1 2131 2136 2135 2134 # CAT-CAO-CAM-CAP + 3412 2 2131 2136 2135 2141 # CAT-CAO-CAM-HAT + 3413 3 2132 2131 2136 2135 # CAO-CAT-CAO-CAM + 3414 4 2132 2131 2136 2142 # CAO-CAT-CAO-HAT + 3415 5 2132 2133 2134 2135 # CAO-CAM-CAP-CAM + 3416 6 2132 2133 2134 2140 # CAO-CAM-CAP-HAT + 3417 7 2137 2131 2132 2133 # CTT-CAT-CAO-CAM + 3418 3 2136 2131 2132 2133 # CAO-CAT-CAO-CAM + 3419 5 2136 2135 2134 2133 # CAO-CAM-CAP-CAM + 3420 8 2133 2134 2135 2141 # CAM-CAP-CAM-HAT + 3421 9 2134 2133 2132 2138 # CAP-CAM-CAO-HAT + 3422 9 2134 2135 2136 2142 # CAP-CAM-CAO-HAT + 3423 8 2135 2134 2133 2139 # CAM-CAP-CAM-HAT + 3424 7 2137 2131 2136 2135 # CTT-CAT-CAO-CAM + 3425 6 2136 2135 2134 2140 # CAO-CAM-CAP-HAT + 3426 4 2136 2131 2132 2138 # CAO-CAT-CAO-HAT + 3427 10 2137 2131 2132 2138 # CTT-CAT-CAO-HAT + 3428 10 2137 2131 2136 2142 # CTT-CAT-CAO-HAT + 3429 11 2138 2132 2133 2139 # HAT-CAO-CAM-HAT + 3430 12 2139 2133 2134 2140 # HAT-CAM-CAP-HAT + 3431 12 2141 2135 2134 2140 # HAT-CAM-CAP-HAT + 3432 11 2142 2136 2135 2141 # HAT-CAO-CAM-HAT + 3433 1 2146 2147 2148 2149 # CAT-CAO-CAM-CAP + 3434 2 2146 2147 2148 2154 # CAT-CAO-CAM-HAT + 3435 1 2146 2151 2150 2149 # CAT-CAO-CAM-CAP + 3436 2 2146 2151 2150 2156 # CAT-CAO-CAM-HAT + 3437 3 2147 2146 2151 2150 # CAO-CAT-CAO-CAM + 3438 4 2147 2146 2151 2157 # CAO-CAT-CAO-HAT + 3439 5 2147 2148 2149 2150 # CAO-CAM-CAP-CAM + 3440 6 2147 2148 2149 2155 # CAO-CAM-CAP-HAT + 3441 7 2152 2146 2147 2148 # CTT-CAT-CAO-CAM + 3442 3 2151 2146 2147 2148 # CAO-CAT-CAO-CAM + 3443 5 2151 2150 2149 2148 # CAO-CAM-CAP-CAM + 3444 8 2148 2149 2150 2156 # CAM-CAP-CAM-HAT + 3445 9 2149 2148 2147 2153 # CAP-CAM-CAO-HAT + 3446 9 2149 2150 2151 2157 # CAP-CAM-CAO-HAT + 3447 8 2150 2149 2148 2154 # CAM-CAP-CAM-HAT + 3448 7 2152 2146 2151 2150 # CTT-CAT-CAO-CAM + 3449 6 2151 2150 2149 2155 # CAO-CAM-CAP-HAT + 3450 4 2151 2146 2147 2153 # CAO-CAT-CAO-HAT + 3451 10 2152 2146 2147 2153 # CTT-CAT-CAO-HAT + 3452 10 2152 2146 2151 2157 # CTT-CAT-CAO-HAT + 3453 11 2153 2147 2148 2154 # HAT-CAO-CAM-HAT + 3454 12 2154 2148 2149 2155 # HAT-CAM-CAP-HAT + 3455 12 2156 2150 2149 2155 # HAT-CAM-CAP-HAT + 3456 11 2157 2151 2150 2156 # HAT-CAO-CAM-HAT + 3457 1 2161 2162 2163 2164 # CAT-CAO-CAM-CAP + 3458 2 2161 2162 2163 2169 # CAT-CAO-CAM-HAT + 3459 1 2161 2166 2165 2164 # CAT-CAO-CAM-CAP + 3460 2 2161 2166 2165 2171 # CAT-CAO-CAM-HAT + 3461 3 2162 2161 2166 2165 # CAO-CAT-CAO-CAM + 3462 4 2162 2161 2166 2172 # CAO-CAT-CAO-HAT + 3463 5 2162 2163 2164 2165 # CAO-CAM-CAP-CAM + 3464 6 2162 2163 2164 2170 # CAO-CAM-CAP-HAT + 3465 7 2167 2161 2162 2163 # CTT-CAT-CAO-CAM + 3466 3 2166 2161 2162 2163 # CAO-CAT-CAO-CAM + 3467 5 2166 2165 2164 2163 # CAO-CAM-CAP-CAM + 3468 8 2163 2164 2165 2171 # CAM-CAP-CAM-HAT + 3469 9 2164 2163 2162 2168 # CAP-CAM-CAO-HAT + 3470 9 2164 2165 2166 2172 # CAP-CAM-CAO-HAT + 3471 8 2165 2164 2163 2169 # CAM-CAP-CAM-HAT + 3472 7 2167 2161 2166 2165 # CTT-CAT-CAO-CAM + 3473 6 2166 2165 2164 2170 # CAO-CAM-CAP-HAT + 3474 4 2166 2161 2162 2168 # CAO-CAT-CAO-HAT + 3475 10 2167 2161 2162 2168 # CTT-CAT-CAO-HAT + 3476 10 2167 2161 2166 2172 # CTT-CAT-CAO-HAT + 3477 11 2168 2162 2163 2169 # HAT-CAO-CAM-HAT + 3478 12 2169 2163 2164 2170 # HAT-CAM-CAP-HAT + 3479 12 2171 2165 2164 2170 # HAT-CAM-CAP-HAT + 3480 11 2172 2166 2165 2171 # HAT-CAO-CAM-HAT + 3481 1 2176 2177 2178 2179 # CAT-CAO-CAM-CAP + 3482 2 2176 2177 2178 2184 # CAT-CAO-CAM-HAT + 3483 1 2176 2181 2180 2179 # CAT-CAO-CAM-CAP + 3484 2 2176 2181 2180 2186 # CAT-CAO-CAM-HAT + 3485 3 2177 2176 2181 2180 # CAO-CAT-CAO-CAM + 3486 4 2177 2176 2181 2187 # CAO-CAT-CAO-HAT + 3487 5 2177 2178 2179 2180 # CAO-CAM-CAP-CAM + 3488 6 2177 2178 2179 2185 # CAO-CAM-CAP-HAT + 3489 7 2182 2176 2177 2178 # CTT-CAT-CAO-CAM + 3490 3 2181 2176 2177 2178 # CAO-CAT-CAO-CAM + 3491 5 2181 2180 2179 2178 # CAO-CAM-CAP-CAM + 3492 8 2178 2179 2180 2186 # CAM-CAP-CAM-HAT + 3493 9 2179 2178 2177 2183 # CAP-CAM-CAO-HAT + 3494 9 2179 2180 2181 2187 # CAP-CAM-CAO-HAT + 3495 8 2180 2179 2178 2184 # CAM-CAP-CAM-HAT + 3496 7 2182 2176 2181 2180 # CTT-CAT-CAO-CAM + 3497 6 2181 2180 2179 2185 # CAO-CAM-CAP-HAT + 3498 4 2181 2176 2177 2183 # CAO-CAT-CAO-HAT + 3499 10 2182 2176 2177 2183 # CTT-CAT-CAO-HAT + 3500 10 2182 2176 2181 2187 # CTT-CAT-CAO-HAT + 3501 11 2183 2177 2178 2184 # HAT-CAO-CAM-HAT + 3502 12 2184 2178 2179 2185 # HAT-CAM-CAP-HAT + 3503 12 2186 2180 2179 2185 # HAT-CAM-CAP-HAT + 3504 11 2187 2181 2180 2186 # HAT-CAO-CAM-HAT + 3505 1 2191 2192 2193 2194 # CAT-CAO-CAM-CAP + 3506 2 2191 2192 2193 2199 # CAT-CAO-CAM-HAT + 3507 1 2191 2196 2195 2194 # CAT-CAO-CAM-CAP + 3508 2 2191 2196 2195 2201 # CAT-CAO-CAM-HAT + 3509 3 2192 2191 2196 2195 # CAO-CAT-CAO-CAM + 3510 4 2192 2191 2196 2202 # CAO-CAT-CAO-HAT + 3511 5 2192 2193 2194 2195 # CAO-CAM-CAP-CAM + 3512 6 2192 2193 2194 2200 # CAO-CAM-CAP-HAT + 3513 7 2197 2191 2192 2193 # CTT-CAT-CAO-CAM + 3514 3 2196 2191 2192 2193 # CAO-CAT-CAO-CAM + 3515 5 2196 2195 2194 2193 # CAO-CAM-CAP-CAM + 3516 8 2193 2194 2195 2201 # CAM-CAP-CAM-HAT + 3517 9 2194 2193 2192 2198 # CAP-CAM-CAO-HAT + 3518 9 2194 2195 2196 2202 # CAP-CAM-CAO-HAT + 3519 8 2195 2194 2193 2199 # CAM-CAP-CAM-HAT + 3520 7 2197 2191 2196 2195 # CTT-CAT-CAO-CAM + 3521 6 2196 2195 2194 2200 # CAO-CAM-CAP-HAT + 3522 4 2196 2191 2192 2198 # CAO-CAT-CAO-HAT + 3523 10 2197 2191 2192 2198 # CTT-CAT-CAO-HAT + 3524 10 2197 2191 2196 2202 # CTT-CAT-CAO-HAT + 3525 11 2198 2192 2193 2199 # HAT-CAO-CAM-HAT + 3526 12 2199 2193 2194 2200 # HAT-CAM-CAP-HAT + 3527 12 2201 2195 2194 2200 # HAT-CAM-CAP-HAT + 3528 11 2202 2196 2195 2201 # HAT-CAO-CAM-HAT + 3529 1 2206 2207 2208 2209 # CAT-CAO-CAM-CAP + 3530 2 2206 2207 2208 2214 # CAT-CAO-CAM-HAT + 3531 1 2206 2211 2210 2209 # CAT-CAO-CAM-CAP + 3532 2 2206 2211 2210 2216 # CAT-CAO-CAM-HAT + 3533 3 2207 2206 2211 2210 # CAO-CAT-CAO-CAM + 3534 4 2207 2206 2211 2217 # CAO-CAT-CAO-HAT + 3535 5 2207 2208 2209 2210 # CAO-CAM-CAP-CAM + 3536 6 2207 2208 2209 2215 # CAO-CAM-CAP-HAT + 3537 7 2212 2206 2207 2208 # CTT-CAT-CAO-CAM + 3538 3 2211 2206 2207 2208 # CAO-CAT-CAO-CAM + 3539 5 2211 2210 2209 2208 # CAO-CAM-CAP-CAM + 3540 8 2208 2209 2210 2216 # CAM-CAP-CAM-HAT + 3541 9 2209 2208 2207 2213 # CAP-CAM-CAO-HAT + 3542 9 2209 2210 2211 2217 # CAP-CAM-CAO-HAT + 3543 8 2210 2209 2208 2214 # CAM-CAP-CAM-HAT + 3544 7 2212 2206 2211 2210 # CTT-CAT-CAO-CAM + 3545 6 2211 2210 2209 2215 # CAO-CAM-CAP-HAT + 3546 4 2211 2206 2207 2213 # CAO-CAT-CAO-HAT + 3547 10 2212 2206 2207 2213 # CTT-CAT-CAO-HAT + 3548 10 2212 2206 2211 2217 # CTT-CAT-CAO-HAT + 3549 11 2213 2207 2208 2214 # HAT-CAO-CAM-HAT + 3550 12 2214 2208 2209 2215 # HAT-CAM-CAP-HAT + 3551 12 2216 2210 2209 2215 # HAT-CAM-CAP-HAT + 3552 11 2217 2211 2210 2216 # HAT-CAO-CAM-HAT + 3553 1 2221 2222 2223 2224 # CAT-CAO-CAM-CAP + 3554 2 2221 2222 2223 2229 # CAT-CAO-CAM-HAT + 3555 1 2221 2226 2225 2224 # CAT-CAO-CAM-CAP + 3556 2 2221 2226 2225 2231 # CAT-CAO-CAM-HAT + 3557 3 2222 2221 2226 2225 # CAO-CAT-CAO-CAM + 3558 4 2222 2221 2226 2232 # CAO-CAT-CAO-HAT + 3559 5 2222 2223 2224 2225 # CAO-CAM-CAP-CAM + 3560 6 2222 2223 2224 2230 # CAO-CAM-CAP-HAT + 3561 7 2227 2221 2222 2223 # CTT-CAT-CAO-CAM + 3562 3 2226 2221 2222 2223 # CAO-CAT-CAO-CAM + 3563 5 2226 2225 2224 2223 # CAO-CAM-CAP-CAM + 3564 8 2223 2224 2225 2231 # CAM-CAP-CAM-HAT + 3565 9 2224 2223 2222 2228 # CAP-CAM-CAO-HAT + 3566 9 2224 2225 2226 2232 # CAP-CAM-CAO-HAT + 3567 8 2225 2224 2223 2229 # CAM-CAP-CAM-HAT + 3568 7 2227 2221 2226 2225 # CTT-CAT-CAO-CAM + 3569 6 2226 2225 2224 2230 # CAO-CAM-CAP-HAT + 3570 4 2226 2221 2222 2228 # CAO-CAT-CAO-HAT + 3571 10 2227 2221 2222 2228 # CTT-CAT-CAO-HAT + 3572 10 2227 2221 2226 2232 # CTT-CAT-CAO-HAT + 3573 11 2228 2222 2223 2229 # HAT-CAO-CAM-HAT + 3574 12 2229 2223 2224 2230 # HAT-CAM-CAP-HAT + 3575 12 2231 2225 2224 2230 # HAT-CAM-CAP-HAT + 3576 11 2232 2226 2225 2231 # HAT-CAO-CAM-HAT + 3577 1 2236 2237 2238 2239 # CAT-CAO-CAM-CAP + 3578 2 2236 2237 2238 2244 # CAT-CAO-CAM-HAT + 3579 1 2236 2241 2240 2239 # CAT-CAO-CAM-CAP + 3580 2 2236 2241 2240 2246 # CAT-CAO-CAM-HAT + 3581 3 2237 2236 2241 2240 # CAO-CAT-CAO-CAM + 3582 4 2237 2236 2241 2247 # CAO-CAT-CAO-HAT + 3583 5 2237 2238 2239 2240 # CAO-CAM-CAP-CAM + 3584 6 2237 2238 2239 2245 # CAO-CAM-CAP-HAT + 3585 7 2242 2236 2237 2238 # CTT-CAT-CAO-CAM + 3586 3 2241 2236 2237 2238 # CAO-CAT-CAO-CAM + 3587 5 2241 2240 2239 2238 # CAO-CAM-CAP-CAM + 3588 8 2238 2239 2240 2246 # CAM-CAP-CAM-HAT + 3589 9 2239 2238 2237 2243 # CAP-CAM-CAO-HAT + 3590 9 2239 2240 2241 2247 # CAP-CAM-CAO-HAT + 3591 8 2240 2239 2238 2244 # CAM-CAP-CAM-HAT + 3592 7 2242 2236 2241 2240 # CTT-CAT-CAO-CAM + 3593 6 2241 2240 2239 2245 # CAO-CAM-CAP-HAT + 3594 4 2241 2236 2237 2243 # CAO-CAT-CAO-HAT + 3595 10 2242 2236 2237 2243 # CTT-CAT-CAO-HAT + 3596 10 2242 2236 2241 2247 # CTT-CAT-CAO-HAT + 3597 11 2243 2237 2238 2244 # HAT-CAO-CAM-HAT + 3598 12 2244 2238 2239 2245 # HAT-CAM-CAP-HAT + 3599 12 2246 2240 2239 2245 # HAT-CAM-CAP-HAT + 3600 11 2247 2241 2240 2246 # HAT-CAO-CAM-HAT + 3601 1 2251 2252 2253 2254 # CAT-CAO-CAM-CAP + 3602 2 2251 2252 2253 2259 # CAT-CAO-CAM-HAT + 3603 1 2251 2256 2255 2254 # CAT-CAO-CAM-CAP + 3604 2 2251 2256 2255 2261 # CAT-CAO-CAM-HAT + 3605 3 2252 2251 2256 2255 # CAO-CAT-CAO-CAM + 3606 4 2252 2251 2256 2262 # CAO-CAT-CAO-HAT + 3607 5 2252 2253 2254 2255 # CAO-CAM-CAP-CAM + 3608 6 2252 2253 2254 2260 # CAO-CAM-CAP-HAT + 3609 7 2257 2251 2252 2253 # CTT-CAT-CAO-CAM + 3610 3 2256 2251 2252 2253 # CAO-CAT-CAO-CAM + 3611 5 2256 2255 2254 2253 # CAO-CAM-CAP-CAM + 3612 8 2253 2254 2255 2261 # CAM-CAP-CAM-HAT + 3613 9 2254 2253 2252 2258 # CAP-CAM-CAO-HAT + 3614 9 2254 2255 2256 2262 # CAP-CAM-CAO-HAT + 3615 8 2255 2254 2253 2259 # CAM-CAP-CAM-HAT + 3616 7 2257 2251 2256 2255 # CTT-CAT-CAO-CAM + 3617 6 2256 2255 2254 2260 # CAO-CAM-CAP-HAT + 3618 4 2256 2251 2252 2258 # CAO-CAT-CAO-HAT + 3619 10 2257 2251 2252 2258 # CTT-CAT-CAO-HAT + 3620 10 2257 2251 2256 2262 # CTT-CAT-CAO-HAT + 3621 11 2258 2252 2253 2259 # HAT-CAO-CAM-HAT + 3622 12 2259 2253 2254 2260 # HAT-CAM-CAP-HAT + 3623 12 2261 2255 2254 2260 # HAT-CAM-CAP-HAT + 3624 11 2262 2256 2255 2261 # HAT-CAO-CAM-HAT + 3625 1 2266 2267 2268 2269 # CAT-CAO-CAM-CAP + 3626 2 2266 2267 2268 2274 # CAT-CAO-CAM-HAT + 3627 1 2266 2271 2270 2269 # CAT-CAO-CAM-CAP + 3628 2 2266 2271 2270 2276 # CAT-CAO-CAM-HAT + 3629 3 2267 2266 2271 2270 # CAO-CAT-CAO-CAM + 3630 4 2267 2266 2271 2277 # CAO-CAT-CAO-HAT + 3631 5 2267 2268 2269 2270 # CAO-CAM-CAP-CAM + 3632 6 2267 2268 2269 2275 # CAO-CAM-CAP-HAT + 3633 7 2272 2266 2267 2268 # CTT-CAT-CAO-CAM + 3634 3 2271 2266 2267 2268 # CAO-CAT-CAO-CAM + 3635 5 2271 2270 2269 2268 # CAO-CAM-CAP-CAM + 3636 8 2268 2269 2270 2276 # CAM-CAP-CAM-HAT + 3637 9 2269 2268 2267 2273 # CAP-CAM-CAO-HAT + 3638 9 2269 2270 2271 2277 # CAP-CAM-CAO-HAT + 3639 8 2270 2269 2268 2274 # CAM-CAP-CAM-HAT + 3640 7 2272 2266 2271 2270 # CTT-CAT-CAO-CAM + 3641 6 2271 2270 2269 2275 # CAO-CAM-CAP-HAT + 3642 4 2271 2266 2267 2273 # CAO-CAT-CAO-HAT + 3643 10 2272 2266 2267 2273 # CTT-CAT-CAO-HAT + 3644 10 2272 2266 2271 2277 # CTT-CAT-CAO-HAT + 3645 11 2273 2267 2268 2274 # HAT-CAO-CAM-HAT + 3646 12 2274 2268 2269 2275 # HAT-CAM-CAP-HAT + 3647 12 2276 2270 2269 2275 # HAT-CAM-CAP-HAT + 3648 11 2277 2271 2270 2276 # HAT-CAO-CAM-HAT + 3649 1 2281 2282 2283 2284 # CAT-CAO-CAM-CAP + 3650 2 2281 2282 2283 2289 # CAT-CAO-CAM-HAT + 3651 1 2281 2286 2285 2284 # CAT-CAO-CAM-CAP + 3652 2 2281 2286 2285 2291 # CAT-CAO-CAM-HAT + 3653 3 2282 2281 2286 2285 # CAO-CAT-CAO-CAM + 3654 4 2282 2281 2286 2292 # CAO-CAT-CAO-HAT + 3655 5 2282 2283 2284 2285 # CAO-CAM-CAP-CAM + 3656 6 2282 2283 2284 2290 # CAO-CAM-CAP-HAT + 3657 7 2287 2281 2282 2283 # CTT-CAT-CAO-CAM + 3658 3 2286 2281 2282 2283 # CAO-CAT-CAO-CAM + 3659 5 2286 2285 2284 2283 # CAO-CAM-CAP-CAM + 3660 8 2283 2284 2285 2291 # CAM-CAP-CAM-HAT + 3661 9 2284 2283 2282 2288 # CAP-CAM-CAO-HAT + 3662 9 2284 2285 2286 2292 # CAP-CAM-CAO-HAT + 3663 8 2285 2284 2283 2289 # CAM-CAP-CAM-HAT + 3664 7 2287 2281 2286 2285 # CTT-CAT-CAO-CAM + 3665 6 2286 2285 2284 2290 # CAO-CAM-CAP-HAT + 3666 4 2286 2281 2282 2288 # CAO-CAT-CAO-HAT + 3667 10 2287 2281 2282 2288 # CTT-CAT-CAO-HAT + 3668 10 2287 2281 2286 2292 # CTT-CAT-CAO-HAT + 3669 11 2288 2282 2283 2289 # HAT-CAO-CAM-HAT + 3670 12 2289 2283 2284 2290 # HAT-CAM-CAP-HAT + 3671 12 2291 2285 2284 2290 # HAT-CAM-CAP-HAT + 3672 11 2292 2286 2285 2291 # HAT-CAO-CAM-HAT + 3673 1 2296 2297 2298 2299 # CAT-CAO-CAM-CAP + 3674 2 2296 2297 2298 2304 # CAT-CAO-CAM-HAT + 3675 1 2296 2301 2300 2299 # CAT-CAO-CAM-CAP + 3676 2 2296 2301 2300 2306 # CAT-CAO-CAM-HAT + 3677 3 2297 2296 2301 2300 # CAO-CAT-CAO-CAM + 3678 4 2297 2296 2301 2307 # CAO-CAT-CAO-HAT + 3679 5 2297 2298 2299 2300 # CAO-CAM-CAP-CAM + 3680 6 2297 2298 2299 2305 # CAO-CAM-CAP-HAT + 3681 7 2302 2296 2297 2298 # CTT-CAT-CAO-CAM + 3682 3 2301 2296 2297 2298 # CAO-CAT-CAO-CAM + 3683 5 2301 2300 2299 2298 # CAO-CAM-CAP-CAM + 3684 8 2298 2299 2300 2306 # CAM-CAP-CAM-HAT + 3685 9 2299 2298 2297 2303 # CAP-CAM-CAO-HAT + 3686 9 2299 2300 2301 2307 # CAP-CAM-CAO-HAT + 3687 8 2300 2299 2298 2304 # CAM-CAP-CAM-HAT + 3688 7 2302 2296 2301 2300 # CTT-CAT-CAO-CAM + 3689 6 2301 2300 2299 2305 # CAO-CAM-CAP-HAT + 3690 4 2301 2296 2297 2303 # CAO-CAT-CAO-HAT + 3691 10 2302 2296 2297 2303 # CTT-CAT-CAO-HAT + 3692 10 2302 2296 2301 2307 # CTT-CAT-CAO-HAT + 3693 11 2303 2297 2298 2304 # HAT-CAO-CAM-HAT + 3694 12 2304 2298 2299 2305 # HAT-CAM-CAP-HAT + 3695 12 2306 2300 2299 2305 # HAT-CAM-CAP-HAT + 3696 11 2307 2301 2300 2306 # HAT-CAO-CAM-HAT + 3697 1 2311 2312 2313 2314 # CAT-CAO-CAM-CAP + 3698 2 2311 2312 2313 2319 # CAT-CAO-CAM-HAT + 3699 1 2311 2316 2315 2314 # CAT-CAO-CAM-CAP + 3700 2 2311 2316 2315 2321 # CAT-CAO-CAM-HAT + 3701 3 2312 2311 2316 2315 # CAO-CAT-CAO-CAM + 3702 4 2312 2311 2316 2322 # CAO-CAT-CAO-HAT + 3703 5 2312 2313 2314 2315 # CAO-CAM-CAP-CAM + 3704 6 2312 2313 2314 2320 # CAO-CAM-CAP-HAT + 3705 7 2317 2311 2312 2313 # CTT-CAT-CAO-CAM + 3706 3 2316 2311 2312 2313 # CAO-CAT-CAO-CAM + 3707 5 2316 2315 2314 2313 # CAO-CAM-CAP-CAM + 3708 8 2313 2314 2315 2321 # CAM-CAP-CAM-HAT + 3709 9 2314 2313 2312 2318 # CAP-CAM-CAO-HAT + 3710 9 2314 2315 2316 2322 # CAP-CAM-CAO-HAT + 3711 8 2315 2314 2313 2319 # CAM-CAP-CAM-HAT + 3712 7 2317 2311 2316 2315 # CTT-CAT-CAO-CAM + 3713 6 2316 2315 2314 2320 # CAO-CAM-CAP-HAT + 3714 4 2316 2311 2312 2318 # CAO-CAT-CAO-HAT + 3715 10 2317 2311 2312 2318 # CTT-CAT-CAO-HAT + 3716 10 2317 2311 2316 2322 # CTT-CAT-CAO-HAT + 3717 11 2318 2312 2313 2319 # HAT-CAO-CAM-HAT + 3718 12 2319 2313 2314 2320 # HAT-CAM-CAP-HAT + 3719 12 2321 2315 2314 2320 # HAT-CAM-CAP-HAT + 3720 11 2322 2316 2315 2321 # HAT-CAO-CAM-HAT + 3721 1 2326 2327 2328 2329 # CAT-CAO-CAM-CAP + 3722 2 2326 2327 2328 2334 # CAT-CAO-CAM-HAT + 3723 1 2326 2331 2330 2329 # CAT-CAO-CAM-CAP + 3724 2 2326 2331 2330 2336 # CAT-CAO-CAM-HAT + 3725 3 2327 2326 2331 2330 # CAO-CAT-CAO-CAM + 3726 4 2327 2326 2331 2337 # CAO-CAT-CAO-HAT + 3727 5 2327 2328 2329 2330 # CAO-CAM-CAP-CAM + 3728 6 2327 2328 2329 2335 # CAO-CAM-CAP-HAT + 3729 7 2332 2326 2327 2328 # CTT-CAT-CAO-CAM + 3730 3 2331 2326 2327 2328 # CAO-CAT-CAO-CAM + 3731 5 2331 2330 2329 2328 # CAO-CAM-CAP-CAM + 3732 8 2328 2329 2330 2336 # CAM-CAP-CAM-HAT + 3733 9 2329 2328 2327 2333 # CAP-CAM-CAO-HAT + 3734 9 2329 2330 2331 2337 # CAP-CAM-CAO-HAT + 3735 8 2330 2329 2328 2334 # CAM-CAP-CAM-HAT + 3736 7 2332 2326 2331 2330 # CTT-CAT-CAO-CAM + 3737 6 2331 2330 2329 2335 # CAO-CAM-CAP-HAT + 3738 4 2331 2326 2327 2333 # CAO-CAT-CAO-HAT + 3739 10 2332 2326 2327 2333 # CTT-CAT-CAO-HAT + 3740 10 2332 2326 2331 2337 # CTT-CAT-CAO-HAT + 3741 11 2333 2327 2328 2334 # HAT-CAO-CAM-HAT + 3742 12 2334 2328 2329 2335 # HAT-CAM-CAP-HAT + 3743 12 2336 2330 2329 2335 # HAT-CAM-CAP-HAT + 3744 11 2337 2331 2330 2336 # HAT-CAO-CAM-HAT + 3745 1 2341 2342 2343 2344 # CAT-CAO-CAM-CAP + 3746 2 2341 2342 2343 2349 # CAT-CAO-CAM-HAT + 3747 1 2341 2346 2345 2344 # CAT-CAO-CAM-CAP + 3748 2 2341 2346 2345 2351 # CAT-CAO-CAM-HAT + 3749 3 2342 2341 2346 2345 # CAO-CAT-CAO-CAM + 3750 4 2342 2341 2346 2352 # CAO-CAT-CAO-HAT + 3751 5 2342 2343 2344 2345 # CAO-CAM-CAP-CAM + 3752 6 2342 2343 2344 2350 # CAO-CAM-CAP-HAT + 3753 7 2347 2341 2342 2343 # CTT-CAT-CAO-CAM + 3754 3 2346 2341 2342 2343 # CAO-CAT-CAO-CAM + 3755 5 2346 2345 2344 2343 # CAO-CAM-CAP-CAM + 3756 8 2343 2344 2345 2351 # CAM-CAP-CAM-HAT + 3757 9 2344 2343 2342 2348 # CAP-CAM-CAO-HAT + 3758 9 2344 2345 2346 2352 # CAP-CAM-CAO-HAT + 3759 8 2345 2344 2343 2349 # CAM-CAP-CAM-HAT + 3760 7 2347 2341 2346 2345 # CTT-CAT-CAO-CAM + 3761 6 2346 2345 2344 2350 # CAO-CAM-CAP-HAT + 3762 4 2346 2341 2342 2348 # CAO-CAT-CAO-HAT + 3763 10 2347 2341 2342 2348 # CTT-CAT-CAO-HAT + 3764 10 2347 2341 2346 2352 # CTT-CAT-CAO-HAT + 3765 11 2348 2342 2343 2349 # HAT-CAO-CAM-HAT + 3766 12 2349 2343 2344 2350 # HAT-CAM-CAP-HAT + 3767 12 2351 2345 2344 2350 # HAT-CAM-CAP-HAT + 3768 11 2352 2346 2345 2351 # HAT-CAO-CAM-HAT + 3769 1 2356 2357 2358 2359 # CAT-CAO-CAM-CAP + 3770 2 2356 2357 2358 2364 # CAT-CAO-CAM-HAT + 3771 1 2356 2361 2360 2359 # CAT-CAO-CAM-CAP + 3772 2 2356 2361 2360 2366 # CAT-CAO-CAM-HAT + 3773 3 2357 2356 2361 2360 # CAO-CAT-CAO-CAM + 3774 4 2357 2356 2361 2367 # CAO-CAT-CAO-HAT + 3775 5 2357 2358 2359 2360 # CAO-CAM-CAP-CAM + 3776 6 2357 2358 2359 2365 # CAO-CAM-CAP-HAT + 3777 7 2362 2356 2357 2358 # CTT-CAT-CAO-CAM + 3778 3 2361 2356 2357 2358 # CAO-CAT-CAO-CAM + 3779 5 2361 2360 2359 2358 # CAO-CAM-CAP-CAM + 3780 8 2358 2359 2360 2366 # CAM-CAP-CAM-HAT + 3781 9 2359 2358 2357 2363 # CAP-CAM-CAO-HAT + 3782 9 2359 2360 2361 2367 # CAP-CAM-CAO-HAT + 3783 8 2360 2359 2358 2364 # CAM-CAP-CAM-HAT + 3784 7 2362 2356 2361 2360 # CTT-CAT-CAO-CAM + 3785 6 2361 2360 2359 2365 # CAO-CAM-CAP-HAT + 3786 4 2361 2356 2357 2363 # CAO-CAT-CAO-HAT + 3787 10 2362 2356 2357 2363 # CTT-CAT-CAO-HAT + 3788 10 2362 2356 2361 2367 # CTT-CAT-CAO-HAT + 3789 11 2363 2357 2358 2364 # HAT-CAO-CAM-HAT + 3790 12 2364 2358 2359 2365 # HAT-CAM-CAP-HAT + 3791 12 2366 2360 2359 2365 # HAT-CAM-CAP-HAT + 3792 11 2367 2361 2360 2366 # HAT-CAO-CAM-HAT + 3793 1 2371 2372 2373 2374 # CAT-CAO-CAM-CAP + 3794 2 2371 2372 2373 2379 # CAT-CAO-CAM-HAT + 3795 1 2371 2376 2375 2374 # CAT-CAO-CAM-CAP + 3796 2 2371 2376 2375 2381 # CAT-CAO-CAM-HAT + 3797 3 2372 2371 2376 2375 # CAO-CAT-CAO-CAM + 3798 4 2372 2371 2376 2382 # CAO-CAT-CAO-HAT + 3799 5 2372 2373 2374 2375 # CAO-CAM-CAP-CAM + 3800 6 2372 2373 2374 2380 # CAO-CAM-CAP-HAT + 3801 7 2377 2371 2372 2373 # CTT-CAT-CAO-CAM + 3802 3 2376 2371 2372 2373 # CAO-CAT-CAO-CAM + 3803 5 2376 2375 2374 2373 # CAO-CAM-CAP-CAM + 3804 8 2373 2374 2375 2381 # CAM-CAP-CAM-HAT + 3805 9 2374 2373 2372 2378 # CAP-CAM-CAO-HAT + 3806 9 2374 2375 2376 2382 # CAP-CAM-CAO-HAT + 3807 8 2375 2374 2373 2379 # CAM-CAP-CAM-HAT + 3808 7 2377 2371 2376 2375 # CTT-CAT-CAO-CAM + 3809 6 2376 2375 2374 2380 # CAO-CAM-CAP-HAT + 3810 4 2376 2371 2372 2378 # CAO-CAT-CAO-HAT + 3811 10 2377 2371 2372 2378 # CTT-CAT-CAO-HAT + 3812 10 2377 2371 2376 2382 # CTT-CAT-CAO-HAT + 3813 11 2378 2372 2373 2379 # HAT-CAO-CAM-HAT + 3814 12 2379 2373 2374 2380 # HAT-CAM-CAP-HAT + 3815 12 2381 2375 2374 2380 # HAT-CAM-CAP-HAT + 3816 11 2382 2376 2375 2381 # HAT-CAO-CAM-HAT + 3817 1 2386 2387 2388 2389 # CAT-CAO-CAM-CAP + 3818 2 2386 2387 2388 2394 # CAT-CAO-CAM-HAT + 3819 1 2386 2391 2390 2389 # CAT-CAO-CAM-CAP + 3820 2 2386 2391 2390 2396 # CAT-CAO-CAM-HAT + 3821 3 2387 2386 2391 2390 # CAO-CAT-CAO-CAM + 3822 4 2387 2386 2391 2397 # CAO-CAT-CAO-HAT + 3823 5 2387 2388 2389 2390 # CAO-CAM-CAP-CAM + 3824 6 2387 2388 2389 2395 # CAO-CAM-CAP-HAT + 3825 7 2392 2386 2387 2388 # CTT-CAT-CAO-CAM + 3826 3 2391 2386 2387 2388 # CAO-CAT-CAO-CAM + 3827 5 2391 2390 2389 2388 # CAO-CAM-CAP-CAM + 3828 8 2388 2389 2390 2396 # CAM-CAP-CAM-HAT + 3829 9 2389 2388 2387 2393 # CAP-CAM-CAO-HAT + 3830 9 2389 2390 2391 2397 # CAP-CAM-CAO-HAT + 3831 8 2390 2389 2388 2394 # CAM-CAP-CAM-HAT + 3832 7 2392 2386 2391 2390 # CTT-CAT-CAO-CAM + 3833 6 2391 2390 2389 2395 # CAO-CAM-CAP-HAT + 3834 4 2391 2386 2387 2393 # CAO-CAT-CAO-HAT + 3835 10 2392 2386 2387 2393 # CTT-CAT-CAO-HAT + 3836 10 2392 2386 2391 2397 # CTT-CAT-CAO-HAT + 3837 11 2393 2387 2388 2394 # HAT-CAO-CAM-HAT + 3838 12 2394 2388 2389 2395 # HAT-CAM-CAP-HAT + 3839 12 2396 2390 2389 2395 # HAT-CAM-CAP-HAT + 3840 11 2397 2391 2390 2396 # HAT-CAO-CAM-HAT + 3841 1 2401 2402 2403 2404 # CAT-CAO-CAM-CAP + 3842 2 2401 2402 2403 2409 # CAT-CAO-CAM-HAT + 3843 1 2401 2406 2405 2404 # CAT-CAO-CAM-CAP + 3844 2 2401 2406 2405 2411 # CAT-CAO-CAM-HAT + 3845 3 2402 2401 2406 2405 # CAO-CAT-CAO-CAM + 3846 4 2402 2401 2406 2412 # CAO-CAT-CAO-HAT + 3847 5 2402 2403 2404 2405 # CAO-CAM-CAP-CAM + 3848 6 2402 2403 2404 2410 # CAO-CAM-CAP-HAT + 3849 7 2407 2401 2402 2403 # CTT-CAT-CAO-CAM + 3850 3 2406 2401 2402 2403 # CAO-CAT-CAO-CAM + 3851 5 2406 2405 2404 2403 # CAO-CAM-CAP-CAM + 3852 8 2403 2404 2405 2411 # CAM-CAP-CAM-HAT + 3853 9 2404 2403 2402 2408 # CAP-CAM-CAO-HAT + 3854 9 2404 2405 2406 2412 # CAP-CAM-CAO-HAT + 3855 8 2405 2404 2403 2409 # CAM-CAP-CAM-HAT + 3856 7 2407 2401 2406 2405 # CTT-CAT-CAO-CAM + 3857 6 2406 2405 2404 2410 # CAO-CAM-CAP-HAT + 3858 4 2406 2401 2402 2408 # CAO-CAT-CAO-HAT + 3859 10 2407 2401 2402 2408 # CTT-CAT-CAO-HAT + 3860 10 2407 2401 2406 2412 # CTT-CAT-CAO-HAT + 3861 11 2408 2402 2403 2409 # HAT-CAO-CAM-HAT + 3862 12 2409 2403 2404 2410 # HAT-CAM-CAP-HAT + 3863 12 2411 2405 2404 2410 # HAT-CAM-CAP-HAT + 3864 11 2412 2406 2405 2411 # HAT-CAO-CAM-HAT + 3865 1 2416 2417 2418 2419 # CAT-CAO-CAM-CAP + 3866 2 2416 2417 2418 2424 # CAT-CAO-CAM-HAT + 3867 1 2416 2421 2420 2419 # CAT-CAO-CAM-CAP + 3868 2 2416 2421 2420 2426 # CAT-CAO-CAM-HAT + 3869 3 2417 2416 2421 2420 # CAO-CAT-CAO-CAM + 3870 4 2417 2416 2421 2427 # CAO-CAT-CAO-HAT + 3871 5 2417 2418 2419 2420 # CAO-CAM-CAP-CAM + 3872 6 2417 2418 2419 2425 # CAO-CAM-CAP-HAT + 3873 7 2422 2416 2417 2418 # CTT-CAT-CAO-CAM + 3874 3 2421 2416 2417 2418 # CAO-CAT-CAO-CAM + 3875 5 2421 2420 2419 2418 # CAO-CAM-CAP-CAM + 3876 8 2418 2419 2420 2426 # CAM-CAP-CAM-HAT + 3877 9 2419 2418 2417 2423 # CAP-CAM-CAO-HAT + 3878 9 2419 2420 2421 2427 # CAP-CAM-CAO-HAT + 3879 8 2420 2419 2418 2424 # CAM-CAP-CAM-HAT + 3880 7 2422 2416 2421 2420 # CTT-CAT-CAO-CAM + 3881 6 2421 2420 2419 2425 # CAO-CAM-CAP-HAT + 3882 4 2421 2416 2417 2423 # CAO-CAT-CAO-HAT + 3883 10 2422 2416 2417 2423 # CTT-CAT-CAO-HAT + 3884 10 2422 2416 2421 2427 # CTT-CAT-CAO-HAT + 3885 11 2423 2417 2418 2424 # HAT-CAO-CAM-HAT + 3886 12 2424 2418 2419 2425 # HAT-CAM-CAP-HAT + 3887 12 2426 2420 2419 2425 # HAT-CAM-CAP-HAT + 3888 11 2427 2421 2420 2426 # HAT-CAO-CAM-HAT + 3889 1 2431 2432 2433 2434 # CAT-CAO-CAM-CAP + 3890 2 2431 2432 2433 2439 # CAT-CAO-CAM-HAT + 3891 1 2431 2436 2435 2434 # CAT-CAO-CAM-CAP + 3892 2 2431 2436 2435 2441 # CAT-CAO-CAM-HAT + 3893 3 2432 2431 2436 2435 # CAO-CAT-CAO-CAM + 3894 4 2432 2431 2436 2442 # CAO-CAT-CAO-HAT + 3895 5 2432 2433 2434 2435 # CAO-CAM-CAP-CAM + 3896 6 2432 2433 2434 2440 # CAO-CAM-CAP-HAT + 3897 7 2437 2431 2432 2433 # CTT-CAT-CAO-CAM + 3898 3 2436 2431 2432 2433 # CAO-CAT-CAO-CAM + 3899 5 2436 2435 2434 2433 # CAO-CAM-CAP-CAM + 3900 8 2433 2434 2435 2441 # CAM-CAP-CAM-HAT + 3901 9 2434 2433 2432 2438 # CAP-CAM-CAO-HAT + 3902 9 2434 2435 2436 2442 # CAP-CAM-CAO-HAT + 3903 8 2435 2434 2433 2439 # CAM-CAP-CAM-HAT + 3904 7 2437 2431 2436 2435 # CTT-CAT-CAO-CAM + 3905 6 2436 2435 2434 2440 # CAO-CAM-CAP-HAT + 3906 4 2436 2431 2432 2438 # CAO-CAT-CAO-HAT + 3907 10 2437 2431 2432 2438 # CTT-CAT-CAO-HAT + 3908 10 2437 2431 2436 2442 # CTT-CAT-CAO-HAT + 3909 11 2438 2432 2433 2439 # HAT-CAO-CAM-HAT + 3910 12 2439 2433 2434 2440 # HAT-CAM-CAP-HAT + 3911 12 2441 2435 2434 2440 # HAT-CAM-CAP-HAT + 3912 11 2442 2436 2435 2441 # HAT-CAO-CAM-HAT + 3913 1 2446 2447 2448 2449 # CAT-CAO-CAM-CAP + 3914 2 2446 2447 2448 2454 # CAT-CAO-CAM-HAT + 3915 1 2446 2451 2450 2449 # CAT-CAO-CAM-CAP + 3916 2 2446 2451 2450 2456 # CAT-CAO-CAM-HAT + 3917 3 2447 2446 2451 2450 # CAO-CAT-CAO-CAM + 3918 4 2447 2446 2451 2457 # CAO-CAT-CAO-HAT + 3919 5 2447 2448 2449 2450 # CAO-CAM-CAP-CAM + 3920 6 2447 2448 2449 2455 # CAO-CAM-CAP-HAT + 3921 7 2452 2446 2447 2448 # CTT-CAT-CAO-CAM + 3922 3 2451 2446 2447 2448 # CAO-CAT-CAO-CAM + 3923 5 2451 2450 2449 2448 # CAO-CAM-CAP-CAM + 3924 8 2448 2449 2450 2456 # CAM-CAP-CAM-HAT + 3925 9 2449 2448 2447 2453 # CAP-CAM-CAO-HAT + 3926 9 2449 2450 2451 2457 # CAP-CAM-CAO-HAT + 3927 8 2450 2449 2448 2454 # CAM-CAP-CAM-HAT + 3928 7 2452 2446 2451 2450 # CTT-CAT-CAO-CAM + 3929 6 2451 2450 2449 2455 # CAO-CAM-CAP-HAT + 3930 4 2451 2446 2447 2453 # CAO-CAT-CAO-HAT + 3931 10 2452 2446 2447 2453 # CTT-CAT-CAO-HAT + 3932 10 2452 2446 2451 2457 # CTT-CAT-CAO-HAT + 3933 11 2453 2447 2448 2454 # HAT-CAO-CAM-HAT + 3934 12 2454 2448 2449 2455 # HAT-CAM-CAP-HAT + 3935 12 2456 2450 2449 2455 # HAT-CAM-CAP-HAT + 3936 11 2457 2451 2450 2456 # HAT-CAO-CAM-HAT + 3937 1 2461 2462 2463 2464 # CAT-CAO-CAM-CAP + 3938 2 2461 2462 2463 2469 # CAT-CAO-CAM-HAT + 3939 1 2461 2466 2465 2464 # CAT-CAO-CAM-CAP + 3940 2 2461 2466 2465 2471 # CAT-CAO-CAM-HAT + 3941 3 2462 2461 2466 2465 # CAO-CAT-CAO-CAM + 3942 4 2462 2461 2466 2472 # CAO-CAT-CAO-HAT + 3943 5 2462 2463 2464 2465 # CAO-CAM-CAP-CAM + 3944 6 2462 2463 2464 2470 # CAO-CAM-CAP-HAT + 3945 7 2467 2461 2462 2463 # CTT-CAT-CAO-CAM + 3946 3 2466 2461 2462 2463 # CAO-CAT-CAO-CAM + 3947 5 2466 2465 2464 2463 # CAO-CAM-CAP-CAM + 3948 8 2463 2464 2465 2471 # CAM-CAP-CAM-HAT + 3949 9 2464 2463 2462 2468 # CAP-CAM-CAO-HAT + 3950 9 2464 2465 2466 2472 # CAP-CAM-CAO-HAT + 3951 8 2465 2464 2463 2469 # CAM-CAP-CAM-HAT + 3952 7 2467 2461 2466 2465 # CTT-CAT-CAO-CAM + 3953 6 2466 2465 2464 2470 # CAO-CAM-CAP-HAT + 3954 4 2466 2461 2462 2468 # CAO-CAT-CAO-HAT + 3955 10 2467 2461 2462 2468 # CTT-CAT-CAO-HAT + 3956 10 2467 2461 2466 2472 # CTT-CAT-CAO-HAT + 3957 11 2468 2462 2463 2469 # HAT-CAO-CAM-HAT + 3958 12 2469 2463 2464 2470 # HAT-CAM-CAP-HAT + 3959 12 2471 2465 2464 2470 # HAT-CAM-CAP-HAT + 3960 11 2472 2466 2465 2471 # HAT-CAO-CAM-HAT + 3961 1 2476 2477 2478 2479 # CAT-CAO-CAM-CAP + 3962 2 2476 2477 2478 2484 # CAT-CAO-CAM-HAT + 3963 1 2476 2481 2480 2479 # CAT-CAO-CAM-CAP + 3964 2 2476 2481 2480 2486 # CAT-CAO-CAM-HAT + 3965 3 2477 2476 2481 2480 # CAO-CAT-CAO-CAM + 3966 4 2477 2476 2481 2487 # CAO-CAT-CAO-HAT + 3967 5 2477 2478 2479 2480 # CAO-CAM-CAP-CAM + 3968 6 2477 2478 2479 2485 # CAO-CAM-CAP-HAT + 3969 7 2482 2476 2477 2478 # CTT-CAT-CAO-CAM + 3970 3 2481 2476 2477 2478 # CAO-CAT-CAO-CAM + 3971 5 2481 2480 2479 2478 # CAO-CAM-CAP-CAM + 3972 8 2478 2479 2480 2486 # CAM-CAP-CAM-HAT + 3973 9 2479 2478 2477 2483 # CAP-CAM-CAO-HAT + 3974 9 2479 2480 2481 2487 # CAP-CAM-CAO-HAT + 3975 8 2480 2479 2478 2484 # CAM-CAP-CAM-HAT + 3976 7 2482 2476 2481 2480 # CTT-CAT-CAO-CAM + 3977 6 2481 2480 2479 2485 # CAO-CAM-CAP-HAT + 3978 4 2481 2476 2477 2483 # CAO-CAT-CAO-HAT + 3979 10 2482 2476 2477 2483 # CTT-CAT-CAO-HAT + 3980 10 2482 2476 2481 2487 # CTT-CAT-CAO-HAT + 3981 11 2483 2477 2478 2484 # HAT-CAO-CAM-HAT + 3982 12 2484 2478 2479 2485 # HAT-CAM-CAP-HAT + 3983 12 2486 2480 2479 2485 # HAT-CAM-CAP-HAT + 3984 11 2487 2481 2480 2486 # HAT-CAO-CAM-HAT + 3985 1 2491 2492 2493 2494 # CAT-CAO-CAM-CAP + 3986 2 2491 2492 2493 2499 # CAT-CAO-CAM-HAT + 3987 1 2491 2496 2495 2494 # CAT-CAO-CAM-CAP + 3988 2 2491 2496 2495 2501 # CAT-CAO-CAM-HAT + 3989 3 2492 2491 2496 2495 # CAO-CAT-CAO-CAM + 3990 4 2492 2491 2496 2502 # CAO-CAT-CAO-HAT + 3991 5 2492 2493 2494 2495 # CAO-CAM-CAP-CAM + 3992 6 2492 2493 2494 2500 # CAO-CAM-CAP-HAT + 3993 7 2497 2491 2492 2493 # CTT-CAT-CAO-CAM + 3994 3 2496 2491 2492 2493 # CAO-CAT-CAO-CAM + 3995 5 2496 2495 2494 2493 # CAO-CAM-CAP-CAM + 3996 8 2493 2494 2495 2501 # CAM-CAP-CAM-HAT + 3997 9 2494 2493 2492 2498 # CAP-CAM-CAO-HAT + 3998 9 2494 2495 2496 2502 # CAP-CAM-CAO-HAT + 3999 8 2495 2494 2493 2499 # CAM-CAP-CAM-HAT + 4000 7 2497 2491 2496 2495 # CTT-CAT-CAO-CAM + 4001 6 2496 2495 2494 2500 # CAO-CAM-CAP-HAT + 4002 4 2496 2491 2492 2498 # CAO-CAT-CAO-HAT + 4003 10 2497 2491 2492 2498 # CTT-CAT-CAO-HAT + 4004 10 2497 2491 2496 2502 # CTT-CAT-CAO-HAT + 4005 11 2498 2492 2493 2499 # HAT-CAO-CAM-HAT + 4006 12 2499 2493 2494 2500 # HAT-CAM-CAP-HAT + 4007 12 2501 2495 2494 2500 # HAT-CAM-CAP-HAT + 4008 11 2502 2496 2495 2501 # HAT-CAO-CAM-HAT + 4009 1 2506 2507 2508 2509 # CAT-CAO-CAM-CAP + 4010 2 2506 2507 2508 2514 # CAT-CAO-CAM-HAT + 4011 1 2506 2511 2510 2509 # CAT-CAO-CAM-CAP + 4012 2 2506 2511 2510 2516 # CAT-CAO-CAM-HAT + 4013 3 2507 2506 2511 2510 # CAO-CAT-CAO-CAM + 4014 4 2507 2506 2511 2517 # CAO-CAT-CAO-HAT + 4015 5 2507 2508 2509 2510 # CAO-CAM-CAP-CAM + 4016 6 2507 2508 2509 2515 # CAO-CAM-CAP-HAT + 4017 7 2512 2506 2507 2508 # CTT-CAT-CAO-CAM + 4018 3 2511 2506 2507 2508 # CAO-CAT-CAO-CAM + 4019 5 2511 2510 2509 2508 # CAO-CAM-CAP-CAM + 4020 8 2508 2509 2510 2516 # CAM-CAP-CAM-HAT + 4021 9 2509 2508 2507 2513 # CAP-CAM-CAO-HAT + 4022 9 2509 2510 2511 2517 # CAP-CAM-CAO-HAT + 4023 8 2510 2509 2508 2514 # CAM-CAP-CAM-HAT + 4024 7 2512 2506 2511 2510 # CTT-CAT-CAO-CAM + 4025 6 2511 2510 2509 2515 # CAO-CAM-CAP-HAT + 4026 4 2511 2506 2507 2513 # CAO-CAT-CAO-HAT + 4027 10 2512 2506 2507 2513 # CTT-CAT-CAO-HAT + 4028 10 2512 2506 2511 2517 # CTT-CAT-CAO-HAT + 4029 11 2513 2507 2508 2514 # HAT-CAO-CAM-HAT + 4030 12 2514 2508 2509 2515 # HAT-CAM-CAP-HAT + 4031 12 2516 2510 2509 2515 # HAT-CAM-CAP-HAT + 4032 11 2517 2511 2510 2516 # HAT-CAO-CAM-HAT + 4033 1 2521 2522 2523 2524 # CAT-CAO-CAM-CAP + 4034 2 2521 2522 2523 2529 # CAT-CAO-CAM-HAT + 4035 1 2521 2526 2525 2524 # CAT-CAO-CAM-CAP + 4036 2 2521 2526 2525 2531 # CAT-CAO-CAM-HAT + 4037 3 2522 2521 2526 2525 # CAO-CAT-CAO-CAM + 4038 4 2522 2521 2526 2532 # CAO-CAT-CAO-HAT + 4039 5 2522 2523 2524 2525 # CAO-CAM-CAP-CAM + 4040 6 2522 2523 2524 2530 # CAO-CAM-CAP-HAT + 4041 7 2527 2521 2522 2523 # CTT-CAT-CAO-CAM + 4042 3 2526 2521 2522 2523 # CAO-CAT-CAO-CAM + 4043 5 2526 2525 2524 2523 # CAO-CAM-CAP-CAM + 4044 8 2523 2524 2525 2531 # CAM-CAP-CAM-HAT + 4045 9 2524 2523 2522 2528 # CAP-CAM-CAO-HAT + 4046 9 2524 2525 2526 2532 # CAP-CAM-CAO-HAT + 4047 8 2525 2524 2523 2529 # CAM-CAP-CAM-HAT + 4048 7 2527 2521 2526 2525 # CTT-CAT-CAO-CAM + 4049 6 2526 2525 2524 2530 # CAO-CAM-CAP-HAT + 4050 4 2526 2521 2522 2528 # CAO-CAT-CAO-HAT + 4051 10 2527 2521 2522 2528 # CTT-CAT-CAO-HAT + 4052 10 2527 2521 2526 2532 # CTT-CAT-CAO-HAT + 4053 11 2528 2522 2523 2529 # HAT-CAO-CAM-HAT + 4054 12 2529 2523 2524 2530 # HAT-CAM-CAP-HAT + 4055 12 2531 2525 2524 2530 # HAT-CAM-CAP-HAT + 4056 11 2532 2526 2525 2531 # HAT-CAO-CAM-HAT + 4057 1 2536 2537 2538 2539 # CAT-CAO-CAM-CAP + 4058 2 2536 2537 2538 2544 # CAT-CAO-CAM-HAT + 4059 1 2536 2541 2540 2539 # CAT-CAO-CAM-CAP + 4060 2 2536 2541 2540 2546 # CAT-CAO-CAM-HAT + 4061 3 2537 2536 2541 2540 # CAO-CAT-CAO-CAM + 4062 4 2537 2536 2541 2547 # CAO-CAT-CAO-HAT + 4063 5 2537 2538 2539 2540 # CAO-CAM-CAP-CAM + 4064 6 2537 2538 2539 2545 # CAO-CAM-CAP-HAT + 4065 7 2542 2536 2537 2538 # CTT-CAT-CAO-CAM + 4066 3 2541 2536 2537 2538 # CAO-CAT-CAO-CAM + 4067 5 2541 2540 2539 2538 # CAO-CAM-CAP-CAM + 4068 8 2538 2539 2540 2546 # CAM-CAP-CAM-HAT + 4069 9 2539 2538 2537 2543 # CAP-CAM-CAO-HAT + 4070 9 2539 2540 2541 2547 # CAP-CAM-CAO-HAT + 4071 8 2540 2539 2538 2544 # CAM-CAP-CAM-HAT + 4072 7 2542 2536 2541 2540 # CTT-CAT-CAO-CAM + 4073 6 2541 2540 2539 2545 # CAO-CAM-CAP-HAT + 4074 4 2541 2536 2537 2543 # CAO-CAT-CAO-HAT + 4075 10 2542 2536 2537 2543 # CTT-CAT-CAO-HAT + 4076 10 2542 2536 2541 2547 # CTT-CAT-CAO-HAT + 4077 11 2543 2537 2538 2544 # HAT-CAO-CAM-HAT + 4078 12 2544 2538 2539 2545 # HAT-CAM-CAP-HAT + 4079 12 2546 2540 2539 2545 # HAT-CAM-CAP-HAT + 4080 11 2547 2541 2540 2546 # HAT-CAO-CAM-HAT + 4081 1 2551 2552 2553 2554 # CAT-CAO-CAM-CAP + 4082 2 2551 2552 2553 2559 # CAT-CAO-CAM-HAT + 4083 1 2551 2556 2555 2554 # CAT-CAO-CAM-CAP + 4084 2 2551 2556 2555 2561 # CAT-CAO-CAM-HAT + 4085 3 2552 2551 2556 2555 # CAO-CAT-CAO-CAM + 4086 4 2552 2551 2556 2562 # CAO-CAT-CAO-HAT + 4087 5 2552 2553 2554 2555 # CAO-CAM-CAP-CAM + 4088 6 2552 2553 2554 2560 # CAO-CAM-CAP-HAT + 4089 7 2557 2551 2552 2553 # CTT-CAT-CAO-CAM + 4090 3 2556 2551 2552 2553 # CAO-CAT-CAO-CAM + 4091 5 2556 2555 2554 2553 # CAO-CAM-CAP-CAM + 4092 8 2553 2554 2555 2561 # CAM-CAP-CAM-HAT + 4093 9 2554 2553 2552 2558 # CAP-CAM-CAO-HAT + 4094 9 2554 2555 2556 2562 # CAP-CAM-CAO-HAT + 4095 8 2555 2554 2553 2559 # CAM-CAP-CAM-HAT + 4096 7 2557 2551 2556 2555 # CTT-CAT-CAO-CAM + 4097 6 2556 2555 2554 2560 # CAO-CAM-CAP-HAT + 4098 4 2556 2551 2552 2558 # CAO-CAT-CAO-HAT + 4099 10 2557 2551 2552 2558 # CTT-CAT-CAO-HAT + 4100 10 2557 2551 2556 2562 # CTT-CAT-CAO-HAT + 4101 11 2558 2552 2553 2559 # HAT-CAO-CAM-HAT + 4102 12 2559 2553 2554 2560 # HAT-CAM-CAP-HAT + 4103 12 2561 2555 2554 2560 # HAT-CAM-CAP-HAT + 4104 11 2562 2556 2555 2561 # HAT-CAO-CAM-HAT + 4105 1 2566 2567 2568 2569 # CAT-CAO-CAM-CAP + 4106 2 2566 2567 2568 2574 # CAT-CAO-CAM-HAT + 4107 1 2566 2571 2570 2569 # CAT-CAO-CAM-CAP + 4108 2 2566 2571 2570 2576 # CAT-CAO-CAM-HAT + 4109 3 2567 2566 2571 2570 # CAO-CAT-CAO-CAM + 4110 4 2567 2566 2571 2577 # CAO-CAT-CAO-HAT + 4111 5 2567 2568 2569 2570 # CAO-CAM-CAP-CAM + 4112 6 2567 2568 2569 2575 # CAO-CAM-CAP-HAT + 4113 7 2572 2566 2567 2568 # CTT-CAT-CAO-CAM + 4114 3 2571 2566 2567 2568 # CAO-CAT-CAO-CAM + 4115 5 2571 2570 2569 2568 # CAO-CAM-CAP-CAM + 4116 8 2568 2569 2570 2576 # CAM-CAP-CAM-HAT + 4117 9 2569 2568 2567 2573 # CAP-CAM-CAO-HAT + 4118 9 2569 2570 2571 2577 # CAP-CAM-CAO-HAT + 4119 8 2570 2569 2568 2574 # CAM-CAP-CAM-HAT + 4120 7 2572 2566 2571 2570 # CTT-CAT-CAO-CAM + 4121 6 2571 2570 2569 2575 # CAO-CAM-CAP-HAT + 4122 4 2571 2566 2567 2573 # CAO-CAT-CAO-HAT + 4123 10 2572 2566 2567 2573 # CTT-CAT-CAO-HAT + 4124 10 2572 2566 2571 2577 # CTT-CAT-CAO-HAT + 4125 11 2573 2567 2568 2574 # HAT-CAO-CAM-HAT + 4126 12 2574 2568 2569 2575 # HAT-CAM-CAP-HAT + 4127 12 2576 2570 2569 2575 # HAT-CAM-CAP-HAT + 4128 11 2577 2571 2570 2576 # HAT-CAO-CAM-HAT + 4129 1 2581 2582 2583 2584 # CAT-CAO-CAM-CAP + 4130 2 2581 2582 2583 2589 # CAT-CAO-CAM-HAT + 4131 1 2581 2586 2585 2584 # CAT-CAO-CAM-CAP + 4132 2 2581 2586 2585 2591 # CAT-CAO-CAM-HAT + 4133 3 2582 2581 2586 2585 # CAO-CAT-CAO-CAM + 4134 4 2582 2581 2586 2592 # CAO-CAT-CAO-HAT + 4135 5 2582 2583 2584 2585 # CAO-CAM-CAP-CAM + 4136 6 2582 2583 2584 2590 # CAO-CAM-CAP-HAT + 4137 7 2587 2581 2582 2583 # CTT-CAT-CAO-CAM + 4138 3 2586 2581 2582 2583 # CAO-CAT-CAO-CAM + 4139 5 2586 2585 2584 2583 # CAO-CAM-CAP-CAM + 4140 8 2583 2584 2585 2591 # CAM-CAP-CAM-HAT + 4141 9 2584 2583 2582 2588 # CAP-CAM-CAO-HAT + 4142 9 2584 2585 2586 2592 # CAP-CAM-CAO-HAT + 4143 8 2585 2584 2583 2589 # CAM-CAP-CAM-HAT + 4144 7 2587 2581 2586 2585 # CTT-CAT-CAO-CAM + 4145 6 2586 2585 2584 2590 # CAO-CAM-CAP-HAT + 4146 4 2586 2581 2582 2588 # CAO-CAT-CAO-HAT + 4147 10 2587 2581 2582 2588 # CTT-CAT-CAO-HAT + 4148 10 2587 2581 2586 2592 # CTT-CAT-CAO-HAT + 4149 11 2588 2582 2583 2589 # HAT-CAO-CAM-HAT + 4150 12 2589 2583 2584 2590 # HAT-CAM-CAP-HAT + 4151 12 2591 2585 2584 2590 # HAT-CAM-CAP-HAT + 4152 11 2592 2586 2585 2591 # HAT-CAO-CAM-HAT + 4153 1 2596 2597 2598 2599 # CAT-CAO-CAM-CAP + 4154 2 2596 2597 2598 2604 # CAT-CAO-CAM-HAT + 4155 1 2596 2601 2600 2599 # CAT-CAO-CAM-CAP + 4156 2 2596 2601 2600 2606 # CAT-CAO-CAM-HAT + 4157 3 2597 2596 2601 2600 # CAO-CAT-CAO-CAM + 4158 4 2597 2596 2601 2607 # CAO-CAT-CAO-HAT + 4159 5 2597 2598 2599 2600 # CAO-CAM-CAP-CAM + 4160 6 2597 2598 2599 2605 # CAO-CAM-CAP-HAT + 4161 7 2602 2596 2597 2598 # CTT-CAT-CAO-CAM + 4162 3 2601 2596 2597 2598 # CAO-CAT-CAO-CAM + 4163 5 2601 2600 2599 2598 # CAO-CAM-CAP-CAM + 4164 8 2598 2599 2600 2606 # CAM-CAP-CAM-HAT + 4165 9 2599 2598 2597 2603 # CAP-CAM-CAO-HAT + 4166 9 2599 2600 2601 2607 # CAP-CAM-CAO-HAT + 4167 8 2600 2599 2598 2604 # CAM-CAP-CAM-HAT + 4168 7 2602 2596 2601 2600 # CTT-CAT-CAO-CAM + 4169 6 2601 2600 2599 2605 # CAO-CAM-CAP-HAT + 4170 4 2601 2596 2597 2603 # CAO-CAT-CAO-HAT + 4171 10 2602 2596 2597 2603 # CTT-CAT-CAO-HAT + 4172 10 2602 2596 2601 2607 # CTT-CAT-CAO-HAT + 4173 11 2603 2597 2598 2604 # HAT-CAO-CAM-HAT + 4174 12 2604 2598 2599 2605 # HAT-CAM-CAP-HAT + 4175 12 2606 2600 2599 2605 # HAT-CAM-CAP-HAT + 4176 11 2607 2601 2600 2606 # HAT-CAO-CAM-HAT + 4177 1 2611 2612 2613 2614 # CAT-CAO-CAM-CAP + 4178 2 2611 2612 2613 2619 # CAT-CAO-CAM-HAT + 4179 1 2611 2616 2615 2614 # CAT-CAO-CAM-CAP + 4180 2 2611 2616 2615 2621 # CAT-CAO-CAM-HAT + 4181 3 2612 2611 2616 2615 # CAO-CAT-CAO-CAM + 4182 4 2612 2611 2616 2622 # CAO-CAT-CAO-HAT + 4183 5 2612 2613 2614 2615 # CAO-CAM-CAP-CAM + 4184 6 2612 2613 2614 2620 # CAO-CAM-CAP-HAT + 4185 7 2617 2611 2612 2613 # CTT-CAT-CAO-CAM + 4186 3 2616 2611 2612 2613 # CAO-CAT-CAO-CAM + 4187 5 2616 2615 2614 2613 # CAO-CAM-CAP-CAM + 4188 8 2613 2614 2615 2621 # CAM-CAP-CAM-HAT + 4189 9 2614 2613 2612 2618 # CAP-CAM-CAO-HAT + 4190 9 2614 2615 2616 2622 # CAP-CAM-CAO-HAT + 4191 8 2615 2614 2613 2619 # CAM-CAP-CAM-HAT + 4192 7 2617 2611 2616 2615 # CTT-CAT-CAO-CAM + 4193 6 2616 2615 2614 2620 # CAO-CAM-CAP-HAT + 4194 4 2616 2611 2612 2618 # CAO-CAT-CAO-HAT + 4195 10 2617 2611 2612 2618 # CTT-CAT-CAO-HAT + 4196 10 2617 2611 2616 2622 # CTT-CAT-CAO-HAT + 4197 11 2618 2612 2613 2619 # HAT-CAO-CAM-HAT + 4198 12 2619 2613 2614 2620 # HAT-CAM-CAP-HAT + 4199 12 2621 2615 2614 2620 # HAT-CAM-CAP-HAT + 4200 11 2622 2616 2615 2621 # HAT-CAO-CAM-HAT + 4201 1 2626 2627 2628 2629 # CAT-CAO-CAM-CAP + 4202 2 2626 2627 2628 2634 # CAT-CAO-CAM-HAT + 4203 1 2626 2631 2630 2629 # CAT-CAO-CAM-CAP + 4204 2 2626 2631 2630 2636 # CAT-CAO-CAM-HAT + 4205 3 2627 2626 2631 2630 # CAO-CAT-CAO-CAM + 4206 4 2627 2626 2631 2637 # CAO-CAT-CAO-HAT + 4207 5 2627 2628 2629 2630 # CAO-CAM-CAP-CAM + 4208 6 2627 2628 2629 2635 # CAO-CAM-CAP-HAT + 4209 7 2632 2626 2627 2628 # CTT-CAT-CAO-CAM + 4210 3 2631 2626 2627 2628 # CAO-CAT-CAO-CAM + 4211 5 2631 2630 2629 2628 # CAO-CAM-CAP-CAM + 4212 8 2628 2629 2630 2636 # CAM-CAP-CAM-HAT + 4213 9 2629 2628 2627 2633 # CAP-CAM-CAO-HAT + 4214 9 2629 2630 2631 2637 # CAP-CAM-CAO-HAT + 4215 8 2630 2629 2628 2634 # CAM-CAP-CAM-HAT + 4216 7 2632 2626 2631 2630 # CTT-CAT-CAO-CAM + 4217 6 2631 2630 2629 2635 # CAO-CAM-CAP-HAT + 4218 4 2631 2626 2627 2633 # CAO-CAT-CAO-HAT + 4219 10 2632 2626 2627 2633 # CTT-CAT-CAO-HAT + 4220 10 2632 2626 2631 2637 # CTT-CAT-CAO-HAT + 4221 11 2633 2627 2628 2634 # HAT-CAO-CAM-HAT + 4222 12 2634 2628 2629 2635 # HAT-CAM-CAP-HAT + 4223 12 2636 2630 2629 2635 # HAT-CAM-CAP-HAT + 4224 11 2637 2631 2630 2636 # HAT-CAO-CAM-HAT + 4225 1 2641 2642 2643 2644 # CAT-CAO-CAM-CAP + 4226 2 2641 2642 2643 2649 # CAT-CAO-CAM-HAT + 4227 1 2641 2646 2645 2644 # CAT-CAO-CAM-CAP + 4228 2 2641 2646 2645 2651 # CAT-CAO-CAM-HAT + 4229 3 2642 2641 2646 2645 # CAO-CAT-CAO-CAM + 4230 4 2642 2641 2646 2652 # CAO-CAT-CAO-HAT + 4231 5 2642 2643 2644 2645 # CAO-CAM-CAP-CAM + 4232 6 2642 2643 2644 2650 # CAO-CAM-CAP-HAT + 4233 7 2647 2641 2642 2643 # CTT-CAT-CAO-CAM + 4234 3 2646 2641 2642 2643 # CAO-CAT-CAO-CAM + 4235 5 2646 2645 2644 2643 # CAO-CAM-CAP-CAM + 4236 8 2643 2644 2645 2651 # CAM-CAP-CAM-HAT + 4237 9 2644 2643 2642 2648 # CAP-CAM-CAO-HAT + 4238 9 2644 2645 2646 2652 # CAP-CAM-CAO-HAT + 4239 8 2645 2644 2643 2649 # CAM-CAP-CAM-HAT + 4240 7 2647 2641 2646 2645 # CTT-CAT-CAO-CAM + 4241 6 2646 2645 2644 2650 # CAO-CAM-CAP-HAT + 4242 4 2646 2641 2642 2648 # CAO-CAT-CAO-HAT + 4243 10 2647 2641 2642 2648 # CTT-CAT-CAO-HAT + 4244 10 2647 2641 2646 2652 # CTT-CAT-CAO-HAT + 4245 11 2648 2642 2643 2649 # HAT-CAO-CAM-HAT + 4246 12 2649 2643 2644 2650 # HAT-CAM-CAP-HAT + 4247 12 2651 2645 2644 2650 # HAT-CAM-CAP-HAT + 4248 11 2652 2646 2645 2651 # HAT-CAO-CAM-HAT + 4249 1 2656 2657 2658 2659 # CAT-CAO-CAM-CAP + 4250 2 2656 2657 2658 2664 # CAT-CAO-CAM-HAT + 4251 1 2656 2661 2660 2659 # CAT-CAO-CAM-CAP + 4252 2 2656 2661 2660 2666 # CAT-CAO-CAM-HAT + 4253 3 2657 2656 2661 2660 # CAO-CAT-CAO-CAM + 4254 4 2657 2656 2661 2667 # CAO-CAT-CAO-HAT + 4255 5 2657 2658 2659 2660 # CAO-CAM-CAP-CAM + 4256 6 2657 2658 2659 2665 # CAO-CAM-CAP-HAT + 4257 7 2662 2656 2657 2658 # CTT-CAT-CAO-CAM + 4258 3 2661 2656 2657 2658 # CAO-CAT-CAO-CAM + 4259 5 2661 2660 2659 2658 # CAO-CAM-CAP-CAM + 4260 8 2658 2659 2660 2666 # CAM-CAP-CAM-HAT + 4261 9 2659 2658 2657 2663 # CAP-CAM-CAO-HAT + 4262 9 2659 2660 2661 2667 # CAP-CAM-CAO-HAT + 4263 8 2660 2659 2658 2664 # CAM-CAP-CAM-HAT + 4264 7 2662 2656 2661 2660 # CTT-CAT-CAO-CAM + 4265 6 2661 2660 2659 2665 # CAO-CAM-CAP-HAT + 4266 4 2661 2656 2657 2663 # CAO-CAT-CAO-HAT + 4267 10 2662 2656 2657 2663 # CTT-CAT-CAO-HAT + 4268 10 2662 2656 2661 2667 # CTT-CAT-CAO-HAT + 4269 11 2663 2657 2658 2664 # HAT-CAO-CAM-HAT + 4270 12 2664 2658 2659 2665 # HAT-CAM-CAP-HAT + 4271 12 2666 2660 2659 2665 # HAT-CAM-CAP-HAT + 4272 11 2667 2661 2660 2666 # HAT-CAO-CAM-HAT + 4273 1 2671 2672 2673 2674 # CAT-CAO-CAM-CAP + 4274 2 2671 2672 2673 2679 # CAT-CAO-CAM-HAT + 4275 1 2671 2676 2675 2674 # CAT-CAO-CAM-CAP + 4276 2 2671 2676 2675 2681 # CAT-CAO-CAM-HAT + 4277 3 2672 2671 2676 2675 # CAO-CAT-CAO-CAM + 4278 4 2672 2671 2676 2682 # CAO-CAT-CAO-HAT + 4279 5 2672 2673 2674 2675 # CAO-CAM-CAP-CAM + 4280 6 2672 2673 2674 2680 # CAO-CAM-CAP-HAT + 4281 7 2677 2671 2672 2673 # CTT-CAT-CAO-CAM + 4282 3 2676 2671 2672 2673 # CAO-CAT-CAO-CAM + 4283 5 2676 2675 2674 2673 # CAO-CAM-CAP-CAM + 4284 8 2673 2674 2675 2681 # CAM-CAP-CAM-HAT + 4285 9 2674 2673 2672 2678 # CAP-CAM-CAO-HAT + 4286 9 2674 2675 2676 2682 # CAP-CAM-CAO-HAT + 4287 8 2675 2674 2673 2679 # CAM-CAP-CAM-HAT + 4288 7 2677 2671 2676 2675 # CTT-CAT-CAO-CAM + 4289 6 2676 2675 2674 2680 # CAO-CAM-CAP-HAT + 4290 4 2676 2671 2672 2678 # CAO-CAT-CAO-HAT + 4291 10 2677 2671 2672 2678 # CTT-CAT-CAO-HAT + 4292 10 2677 2671 2676 2682 # CTT-CAT-CAO-HAT + 4293 11 2678 2672 2673 2679 # HAT-CAO-CAM-HAT + 4294 12 2679 2673 2674 2680 # HAT-CAM-CAP-HAT + 4295 12 2681 2675 2674 2680 # HAT-CAM-CAP-HAT + 4296 11 2682 2676 2675 2681 # HAT-CAO-CAM-HAT + 4297 1 2686 2687 2688 2689 # CAT-CAO-CAM-CAP + 4298 2 2686 2687 2688 2694 # CAT-CAO-CAM-HAT + 4299 1 2686 2691 2690 2689 # CAT-CAO-CAM-CAP + 4300 2 2686 2691 2690 2696 # CAT-CAO-CAM-HAT + 4301 3 2687 2686 2691 2690 # CAO-CAT-CAO-CAM + 4302 4 2687 2686 2691 2697 # CAO-CAT-CAO-HAT + 4303 5 2687 2688 2689 2690 # CAO-CAM-CAP-CAM + 4304 6 2687 2688 2689 2695 # CAO-CAM-CAP-HAT + 4305 7 2692 2686 2687 2688 # CTT-CAT-CAO-CAM + 4306 3 2691 2686 2687 2688 # CAO-CAT-CAO-CAM + 4307 5 2691 2690 2689 2688 # CAO-CAM-CAP-CAM + 4308 8 2688 2689 2690 2696 # CAM-CAP-CAM-HAT + 4309 9 2689 2688 2687 2693 # CAP-CAM-CAO-HAT + 4310 9 2689 2690 2691 2697 # CAP-CAM-CAO-HAT + 4311 8 2690 2689 2688 2694 # CAM-CAP-CAM-HAT + 4312 7 2692 2686 2691 2690 # CTT-CAT-CAO-CAM + 4313 6 2691 2690 2689 2695 # CAO-CAM-CAP-HAT + 4314 4 2691 2686 2687 2693 # CAO-CAT-CAO-HAT + 4315 10 2692 2686 2687 2693 # CTT-CAT-CAO-HAT + 4316 10 2692 2686 2691 2697 # CTT-CAT-CAO-HAT + 4317 11 2693 2687 2688 2694 # HAT-CAO-CAM-HAT + 4318 12 2694 2688 2689 2695 # HAT-CAM-CAP-HAT + 4319 12 2696 2690 2689 2695 # HAT-CAM-CAP-HAT + 4320 11 2697 2691 2690 2696 # HAT-CAO-CAM-HAT + 4321 1 2701 2702 2703 2704 # CAT-CAO-CAM-CAP + 4322 2 2701 2702 2703 2709 # CAT-CAO-CAM-HAT + 4323 1 2701 2706 2705 2704 # CAT-CAO-CAM-CAP + 4324 2 2701 2706 2705 2711 # CAT-CAO-CAM-HAT + 4325 3 2702 2701 2706 2705 # CAO-CAT-CAO-CAM + 4326 4 2702 2701 2706 2712 # CAO-CAT-CAO-HAT + 4327 5 2702 2703 2704 2705 # CAO-CAM-CAP-CAM + 4328 6 2702 2703 2704 2710 # CAO-CAM-CAP-HAT + 4329 7 2707 2701 2702 2703 # CTT-CAT-CAO-CAM + 4330 3 2706 2701 2702 2703 # CAO-CAT-CAO-CAM + 4331 5 2706 2705 2704 2703 # CAO-CAM-CAP-CAM + 4332 8 2703 2704 2705 2711 # CAM-CAP-CAM-HAT + 4333 9 2704 2703 2702 2708 # CAP-CAM-CAO-HAT + 4334 9 2704 2705 2706 2712 # CAP-CAM-CAO-HAT + 4335 8 2705 2704 2703 2709 # CAM-CAP-CAM-HAT + 4336 7 2707 2701 2706 2705 # CTT-CAT-CAO-CAM + 4337 6 2706 2705 2704 2710 # CAO-CAM-CAP-HAT + 4338 4 2706 2701 2702 2708 # CAO-CAT-CAO-HAT + 4339 10 2707 2701 2702 2708 # CTT-CAT-CAO-HAT + 4340 10 2707 2701 2706 2712 # CTT-CAT-CAO-HAT + 4341 11 2708 2702 2703 2709 # HAT-CAO-CAM-HAT + 4342 12 2709 2703 2704 2710 # HAT-CAM-CAP-HAT + 4343 12 2711 2705 2704 2710 # HAT-CAM-CAP-HAT + 4344 11 2712 2706 2705 2711 # HAT-CAO-CAM-HAT + 4345 1 2716 2717 2718 2719 # CAT-CAO-CAM-CAP + 4346 2 2716 2717 2718 2724 # CAT-CAO-CAM-HAT + 4347 1 2716 2721 2720 2719 # CAT-CAO-CAM-CAP + 4348 2 2716 2721 2720 2726 # CAT-CAO-CAM-HAT + 4349 3 2717 2716 2721 2720 # CAO-CAT-CAO-CAM + 4350 4 2717 2716 2721 2727 # CAO-CAT-CAO-HAT + 4351 5 2717 2718 2719 2720 # CAO-CAM-CAP-CAM + 4352 6 2717 2718 2719 2725 # CAO-CAM-CAP-HAT + 4353 7 2722 2716 2717 2718 # CTT-CAT-CAO-CAM + 4354 3 2721 2716 2717 2718 # CAO-CAT-CAO-CAM + 4355 5 2721 2720 2719 2718 # CAO-CAM-CAP-CAM + 4356 8 2718 2719 2720 2726 # CAM-CAP-CAM-HAT + 4357 9 2719 2718 2717 2723 # CAP-CAM-CAO-HAT + 4358 9 2719 2720 2721 2727 # CAP-CAM-CAO-HAT + 4359 8 2720 2719 2718 2724 # CAM-CAP-CAM-HAT + 4360 7 2722 2716 2721 2720 # CTT-CAT-CAO-CAM + 4361 6 2721 2720 2719 2725 # CAO-CAM-CAP-HAT + 4362 4 2721 2716 2717 2723 # CAO-CAT-CAO-HAT + 4363 10 2722 2716 2717 2723 # CTT-CAT-CAO-HAT + 4364 10 2722 2716 2721 2727 # CTT-CAT-CAO-HAT + 4365 11 2723 2717 2718 2724 # HAT-CAO-CAM-HAT + 4366 12 2724 2718 2719 2725 # HAT-CAM-CAP-HAT + 4367 12 2726 2720 2719 2725 # HAT-CAM-CAP-HAT + 4368 11 2727 2721 2720 2726 # HAT-CAO-CAM-HAT + 4369 1 2731 2732 2733 2734 # CAT-CAO-CAM-CAP + 4370 2 2731 2732 2733 2739 # CAT-CAO-CAM-HAT + 4371 1 2731 2736 2735 2734 # CAT-CAO-CAM-CAP + 4372 2 2731 2736 2735 2741 # CAT-CAO-CAM-HAT + 4373 3 2732 2731 2736 2735 # CAO-CAT-CAO-CAM + 4374 4 2732 2731 2736 2742 # CAO-CAT-CAO-HAT + 4375 5 2732 2733 2734 2735 # CAO-CAM-CAP-CAM + 4376 6 2732 2733 2734 2740 # CAO-CAM-CAP-HAT + 4377 7 2737 2731 2732 2733 # CTT-CAT-CAO-CAM + 4378 3 2736 2731 2732 2733 # CAO-CAT-CAO-CAM + 4379 5 2736 2735 2734 2733 # CAO-CAM-CAP-CAM + 4380 8 2733 2734 2735 2741 # CAM-CAP-CAM-HAT + 4381 9 2734 2733 2732 2738 # CAP-CAM-CAO-HAT + 4382 9 2734 2735 2736 2742 # CAP-CAM-CAO-HAT + 4383 8 2735 2734 2733 2739 # CAM-CAP-CAM-HAT + 4384 7 2737 2731 2736 2735 # CTT-CAT-CAO-CAM + 4385 6 2736 2735 2734 2740 # CAO-CAM-CAP-HAT + 4386 4 2736 2731 2732 2738 # CAO-CAT-CAO-HAT + 4387 10 2737 2731 2732 2738 # CTT-CAT-CAO-HAT + 4388 10 2737 2731 2736 2742 # CTT-CAT-CAO-HAT + 4389 11 2738 2732 2733 2739 # HAT-CAO-CAM-HAT + 4390 12 2739 2733 2734 2740 # HAT-CAM-CAP-HAT + 4391 12 2741 2735 2734 2740 # HAT-CAM-CAP-HAT + 4392 11 2742 2736 2735 2741 # HAT-CAO-CAM-HAT + 4393 1 2746 2747 2748 2749 # CAT-CAO-CAM-CAP + 4394 2 2746 2747 2748 2754 # CAT-CAO-CAM-HAT + 4395 1 2746 2751 2750 2749 # CAT-CAO-CAM-CAP + 4396 2 2746 2751 2750 2756 # CAT-CAO-CAM-HAT + 4397 3 2747 2746 2751 2750 # CAO-CAT-CAO-CAM + 4398 4 2747 2746 2751 2757 # CAO-CAT-CAO-HAT + 4399 5 2747 2748 2749 2750 # CAO-CAM-CAP-CAM + 4400 6 2747 2748 2749 2755 # CAO-CAM-CAP-HAT + 4401 7 2752 2746 2747 2748 # CTT-CAT-CAO-CAM + 4402 3 2751 2746 2747 2748 # CAO-CAT-CAO-CAM + 4403 5 2751 2750 2749 2748 # CAO-CAM-CAP-CAM + 4404 8 2748 2749 2750 2756 # CAM-CAP-CAM-HAT + 4405 9 2749 2748 2747 2753 # CAP-CAM-CAO-HAT + 4406 9 2749 2750 2751 2757 # CAP-CAM-CAO-HAT + 4407 8 2750 2749 2748 2754 # CAM-CAP-CAM-HAT + 4408 7 2752 2746 2751 2750 # CTT-CAT-CAO-CAM + 4409 6 2751 2750 2749 2755 # CAO-CAM-CAP-HAT + 4410 4 2751 2746 2747 2753 # CAO-CAT-CAO-HAT + 4411 10 2752 2746 2747 2753 # CTT-CAT-CAO-HAT + 4412 10 2752 2746 2751 2757 # CTT-CAT-CAO-HAT + 4413 11 2753 2747 2748 2754 # HAT-CAO-CAM-HAT + 4414 12 2754 2748 2749 2755 # HAT-CAM-CAP-HAT + 4415 12 2756 2750 2749 2755 # HAT-CAM-CAP-HAT + 4416 11 2757 2751 2750 2756 # HAT-CAO-CAM-HAT + 4417 1 2761 2762 2763 2764 # CAT-CAO-CAM-CAP + 4418 2 2761 2762 2763 2769 # CAT-CAO-CAM-HAT + 4419 1 2761 2766 2765 2764 # CAT-CAO-CAM-CAP + 4420 2 2761 2766 2765 2771 # CAT-CAO-CAM-HAT + 4421 3 2762 2761 2766 2765 # CAO-CAT-CAO-CAM + 4422 4 2762 2761 2766 2772 # CAO-CAT-CAO-HAT + 4423 5 2762 2763 2764 2765 # CAO-CAM-CAP-CAM + 4424 6 2762 2763 2764 2770 # CAO-CAM-CAP-HAT + 4425 7 2767 2761 2762 2763 # CTT-CAT-CAO-CAM + 4426 3 2766 2761 2762 2763 # CAO-CAT-CAO-CAM + 4427 5 2766 2765 2764 2763 # CAO-CAM-CAP-CAM + 4428 8 2763 2764 2765 2771 # CAM-CAP-CAM-HAT + 4429 9 2764 2763 2762 2768 # CAP-CAM-CAO-HAT + 4430 9 2764 2765 2766 2772 # CAP-CAM-CAO-HAT + 4431 8 2765 2764 2763 2769 # CAM-CAP-CAM-HAT + 4432 7 2767 2761 2766 2765 # CTT-CAT-CAO-CAM + 4433 6 2766 2765 2764 2770 # CAO-CAM-CAP-HAT + 4434 4 2766 2761 2762 2768 # CAO-CAT-CAO-HAT + 4435 10 2767 2761 2762 2768 # CTT-CAT-CAO-HAT + 4436 10 2767 2761 2766 2772 # CTT-CAT-CAO-HAT + 4437 11 2768 2762 2763 2769 # HAT-CAO-CAM-HAT + 4438 12 2769 2763 2764 2770 # HAT-CAM-CAP-HAT + 4439 12 2771 2765 2764 2770 # HAT-CAM-CAP-HAT + 4440 11 2772 2766 2765 2771 # HAT-CAO-CAM-HAT + 4441 1 2776 2777 2778 2779 # CAT-CAO-CAM-CAP + 4442 2 2776 2777 2778 2784 # CAT-CAO-CAM-HAT + 4443 1 2776 2781 2780 2779 # CAT-CAO-CAM-CAP + 4444 2 2776 2781 2780 2786 # CAT-CAO-CAM-HAT + 4445 3 2777 2776 2781 2780 # CAO-CAT-CAO-CAM + 4446 4 2777 2776 2781 2787 # CAO-CAT-CAO-HAT + 4447 5 2777 2778 2779 2780 # CAO-CAM-CAP-CAM + 4448 6 2777 2778 2779 2785 # CAO-CAM-CAP-HAT + 4449 7 2782 2776 2777 2778 # CTT-CAT-CAO-CAM + 4450 3 2781 2776 2777 2778 # CAO-CAT-CAO-CAM + 4451 5 2781 2780 2779 2778 # CAO-CAM-CAP-CAM + 4452 8 2778 2779 2780 2786 # CAM-CAP-CAM-HAT + 4453 9 2779 2778 2777 2783 # CAP-CAM-CAO-HAT + 4454 9 2779 2780 2781 2787 # CAP-CAM-CAO-HAT + 4455 8 2780 2779 2778 2784 # CAM-CAP-CAM-HAT + 4456 7 2782 2776 2781 2780 # CTT-CAT-CAO-CAM + 4457 6 2781 2780 2779 2785 # CAO-CAM-CAP-HAT + 4458 4 2781 2776 2777 2783 # CAO-CAT-CAO-HAT + 4459 10 2782 2776 2777 2783 # CTT-CAT-CAO-HAT + 4460 10 2782 2776 2781 2787 # CTT-CAT-CAO-HAT + 4461 11 2783 2777 2778 2784 # HAT-CAO-CAM-HAT + 4462 12 2784 2778 2779 2785 # HAT-CAM-CAP-HAT + 4463 12 2786 2780 2779 2785 # HAT-CAM-CAP-HAT + 4464 11 2787 2781 2780 2786 # HAT-CAO-CAM-HAT + 4465 1 2791 2792 2793 2794 # CAT-CAO-CAM-CAP + 4466 2 2791 2792 2793 2799 # CAT-CAO-CAM-HAT + 4467 1 2791 2796 2795 2794 # CAT-CAO-CAM-CAP + 4468 2 2791 2796 2795 2801 # CAT-CAO-CAM-HAT + 4469 3 2792 2791 2796 2795 # CAO-CAT-CAO-CAM + 4470 4 2792 2791 2796 2802 # CAO-CAT-CAO-HAT + 4471 5 2792 2793 2794 2795 # CAO-CAM-CAP-CAM + 4472 6 2792 2793 2794 2800 # CAO-CAM-CAP-HAT + 4473 7 2797 2791 2792 2793 # CTT-CAT-CAO-CAM + 4474 3 2796 2791 2792 2793 # CAO-CAT-CAO-CAM + 4475 5 2796 2795 2794 2793 # CAO-CAM-CAP-CAM + 4476 8 2793 2794 2795 2801 # CAM-CAP-CAM-HAT + 4477 9 2794 2793 2792 2798 # CAP-CAM-CAO-HAT + 4478 9 2794 2795 2796 2802 # CAP-CAM-CAO-HAT + 4479 8 2795 2794 2793 2799 # CAM-CAP-CAM-HAT + 4480 7 2797 2791 2796 2795 # CTT-CAT-CAO-CAM + 4481 6 2796 2795 2794 2800 # CAO-CAM-CAP-HAT + 4482 4 2796 2791 2792 2798 # CAO-CAT-CAO-HAT + 4483 10 2797 2791 2792 2798 # CTT-CAT-CAO-HAT + 4484 10 2797 2791 2796 2802 # CTT-CAT-CAO-HAT + 4485 11 2798 2792 2793 2799 # HAT-CAO-CAM-HAT + 4486 12 2799 2793 2794 2800 # HAT-CAM-CAP-HAT + 4487 12 2801 2795 2794 2800 # HAT-CAM-CAP-HAT + 4488 11 2802 2796 2795 2801 # HAT-CAO-CAM-HAT + 4489 1 2806 2807 2808 2809 # CAT-CAO-CAM-CAP + 4490 2 2806 2807 2808 2814 # CAT-CAO-CAM-HAT + 4491 1 2806 2811 2810 2809 # CAT-CAO-CAM-CAP + 4492 2 2806 2811 2810 2816 # CAT-CAO-CAM-HAT + 4493 3 2807 2806 2811 2810 # CAO-CAT-CAO-CAM + 4494 4 2807 2806 2811 2817 # CAO-CAT-CAO-HAT + 4495 5 2807 2808 2809 2810 # CAO-CAM-CAP-CAM + 4496 6 2807 2808 2809 2815 # CAO-CAM-CAP-HAT + 4497 7 2812 2806 2807 2808 # CTT-CAT-CAO-CAM + 4498 3 2811 2806 2807 2808 # CAO-CAT-CAO-CAM + 4499 5 2811 2810 2809 2808 # CAO-CAM-CAP-CAM + 4500 8 2808 2809 2810 2816 # CAM-CAP-CAM-HAT + 4501 9 2809 2808 2807 2813 # CAP-CAM-CAO-HAT + 4502 9 2809 2810 2811 2817 # CAP-CAM-CAO-HAT + 4503 8 2810 2809 2808 2814 # CAM-CAP-CAM-HAT + 4504 7 2812 2806 2811 2810 # CTT-CAT-CAO-CAM + 4505 6 2811 2810 2809 2815 # CAO-CAM-CAP-HAT + 4506 4 2811 2806 2807 2813 # CAO-CAT-CAO-HAT + 4507 10 2812 2806 2807 2813 # CTT-CAT-CAO-HAT + 4508 10 2812 2806 2811 2817 # CTT-CAT-CAO-HAT + 4509 11 2813 2807 2808 2814 # HAT-CAO-CAM-HAT + 4510 12 2814 2808 2809 2815 # HAT-CAM-CAP-HAT + 4511 12 2816 2810 2809 2815 # HAT-CAM-CAP-HAT + 4512 11 2817 2811 2810 2816 # HAT-CAO-CAM-HAT + 4513 1 2821 2822 2823 2824 # CAT-CAO-CAM-CAP + 4514 2 2821 2822 2823 2829 # CAT-CAO-CAM-HAT + 4515 1 2821 2826 2825 2824 # CAT-CAO-CAM-CAP + 4516 2 2821 2826 2825 2831 # CAT-CAO-CAM-HAT + 4517 3 2822 2821 2826 2825 # CAO-CAT-CAO-CAM + 4518 4 2822 2821 2826 2832 # CAO-CAT-CAO-HAT + 4519 5 2822 2823 2824 2825 # CAO-CAM-CAP-CAM + 4520 6 2822 2823 2824 2830 # CAO-CAM-CAP-HAT + 4521 7 2827 2821 2822 2823 # CTT-CAT-CAO-CAM + 4522 3 2826 2821 2822 2823 # CAO-CAT-CAO-CAM + 4523 5 2826 2825 2824 2823 # CAO-CAM-CAP-CAM + 4524 8 2823 2824 2825 2831 # CAM-CAP-CAM-HAT + 4525 9 2824 2823 2822 2828 # CAP-CAM-CAO-HAT + 4526 9 2824 2825 2826 2832 # CAP-CAM-CAO-HAT + 4527 8 2825 2824 2823 2829 # CAM-CAP-CAM-HAT + 4528 7 2827 2821 2826 2825 # CTT-CAT-CAO-CAM + 4529 6 2826 2825 2824 2830 # CAO-CAM-CAP-HAT + 4530 4 2826 2821 2822 2828 # CAO-CAT-CAO-HAT + 4531 10 2827 2821 2822 2828 # CTT-CAT-CAO-HAT + 4532 10 2827 2821 2826 2832 # CTT-CAT-CAO-HAT + 4533 11 2828 2822 2823 2829 # HAT-CAO-CAM-HAT + 4534 12 2829 2823 2824 2830 # HAT-CAM-CAP-HAT + 4535 12 2831 2825 2824 2830 # HAT-CAM-CAP-HAT + 4536 11 2832 2826 2825 2831 # HAT-CAO-CAM-HAT + 4537 1 2836 2837 2838 2839 # CAT-CAO-CAM-CAP + 4538 2 2836 2837 2838 2844 # CAT-CAO-CAM-HAT + 4539 1 2836 2841 2840 2839 # CAT-CAO-CAM-CAP + 4540 2 2836 2841 2840 2846 # CAT-CAO-CAM-HAT + 4541 3 2837 2836 2841 2840 # CAO-CAT-CAO-CAM + 4542 4 2837 2836 2841 2847 # CAO-CAT-CAO-HAT + 4543 5 2837 2838 2839 2840 # CAO-CAM-CAP-CAM + 4544 6 2837 2838 2839 2845 # CAO-CAM-CAP-HAT + 4545 7 2842 2836 2837 2838 # CTT-CAT-CAO-CAM + 4546 3 2841 2836 2837 2838 # CAO-CAT-CAO-CAM + 4547 5 2841 2840 2839 2838 # CAO-CAM-CAP-CAM + 4548 8 2838 2839 2840 2846 # CAM-CAP-CAM-HAT + 4549 9 2839 2838 2837 2843 # CAP-CAM-CAO-HAT + 4550 9 2839 2840 2841 2847 # CAP-CAM-CAO-HAT + 4551 8 2840 2839 2838 2844 # CAM-CAP-CAM-HAT + 4552 7 2842 2836 2841 2840 # CTT-CAT-CAO-CAM + 4553 6 2841 2840 2839 2845 # CAO-CAM-CAP-HAT + 4554 4 2841 2836 2837 2843 # CAO-CAT-CAO-HAT + 4555 10 2842 2836 2837 2843 # CTT-CAT-CAO-HAT + 4556 10 2842 2836 2841 2847 # CTT-CAT-CAO-HAT + 4557 11 2843 2837 2838 2844 # HAT-CAO-CAM-HAT + 4558 12 2844 2838 2839 2845 # HAT-CAM-CAP-HAT + 4559 12 2846 2840 2839 2845 # HAT-CAM-CAP-HAT + 4560 11 2847 2841 2840 2846 # HAT-CAO-CAM-HAT + 4561 1 2851 2852 2853 2854 # CAT-CAO-CAM-CAP + 4562 2 2851 2852 2853 2859 # CAT-CAO-CAM-HAT + 4563 1 2851 2856 2855 2854 # CAT-CAO-CAM-CAP + 4564 2 2851 2856 2855 2861 # CAT-CAO-CAM-HAT + 4565 3 2852 2851 2856 2855 # CAO-CAT-CAO-CAM + 4566 4 2852 2851 2856 2862 # CAO-CAT-CAO-HAT + 4567 5 2852 2853 2854 2855 # CAO-CAM-CAP-CAM + 4568 6 2852 2853 2854 2860 # CAO-CAM-CAP-HAT + 4569 7 2857 2851 2852 2853 # CTT-CAT-CAO-CAM + 4570 3 2856 2851 2852 2853 # CAO-CAT-CAO-CAM + 4571 5 2856 2855 2854 2853 # CAO-CAM-CAP-CAM + 4572 8 2853 2854 2855 2861 # CAM-CAP-CAM-HAT + 4573 9 2854 2853 2852 2858 # CAP-CAM-CAO-HAT + 4574 9 2854 2855 2856 2862 # CAP-CAM-CAO-HAT + 4575 8 2855 2854 2853 2859 # CAM-CAP-CAM-HAT + 4576 7 2857 2851 2856 2855 # CTT-CAT-CAO-CAM + 4577 6 2856 2855 2854 2860 # CAO-CAM-CAP-HAT + 4578 4 2856 2851 2852 2858 # CAO-CAT-CAO-HAT + 4579 10 2857 2851 2852 2858 # CTT-CAT-CAO-HAT + 4580 10 2857 2851 2856 2862 # CTT-CAT-CAO-HAT + 4581 11 2858 2852 2853 2859 # HAT-CAO-CAM-HAT + 4582 12 2859 2853 2854 2860 # HAT-CAM-CAP-HAT + 4583 12 2861 2855 2854 2860 # HAT-CAM-CAP-HAT + 4584 11 2862 2856 2855 2861 # HAT-CAO-CAM-HAT + 4585 1 2866 2867 2868 2869 # CAT-CAO-CAM-CAP + 4586 2 2866 2867 2868 2874 # CAT-CAO-CAM-HAT + 4587 1 2866 2871 2870 2869 # CAT-CAO-CAM-CAP + 4588 2 2866 2871 2870 2876 # CAT-CAO-CAM-HAT + 4589 3 2867 2866 2871 2870 # CAO-CAT-CAO-CAM + 4590 4 2867 2866 2871 2877 # CAO-CAT-CAO-HAT + 4591 5 2867 2868 2869 2870 # CAO-CAM-CAP-CAM + 4592 6 2867 2868 2869 2875 # CAO-CAM-CAP-HAT + 4593 7 2872 2866 2867 2868 # CTT-CAT-CAO-CAM + 4594 3 2871 2866 2867 2868 # CAO-CAT-CAO-CAM + 4595 5 2871 2870 2869 2868 # CAO-CAM-CAP-CAM + 4596 8 2868 2869 2870 2876 # CAM-CAP-CAM-HAT + 4597 9 2869 2868 2867 2873 # CAP-CAM-CAO-HAT + 4598 9 2869 2870 2871 2877 # CAP-CAM-CAO-HAT + 4599 8 2870 2869 2868 2874 # CAM-CAP-CAM-HAT + 4600 7 2872 2866 2871 2870 # CTT-CAT-CAO-CAM + 4601 6 2871 2870 2869 2875 # CAO-CAM-CAP-HAT + 4602 4 2871 2866 2867 2873 # CAO-CAT-CAO-HAT + 4603 10 2872 2866 2867 2873 # CTT-CAT-CAO-HAT + 4604 10 2872 2866 2871 2877 # CTT-CAT-CAO-HAT + 4605 11 2873 2867 2868 2874 # HAT-CAO-CAM-HAT + 4606 12 2874 2868 2869 2875 # HAT-CAM-CAP-HAT + 4607 12 2876 2870 2869 2875 # HAT-CAM-CAP-HAT + 4608 11 2877 2871 2870 2876 # HAT-CAO-CAM-HAT + 4609 1 2881 2882 2883 2884 # CAT-CAO-CAM-CAP + 4610 2 2881 2882 2883 2889 # CAT-CAO-CAM-HAT + 4611 1 2881 2886 2885 2884 # CAT-CAO-CAM-CAP + 4612 2 2881 2886 2885 2891 # CAT-CAO-CAM-HAT + 4613 3 2882 2881 2886 2885 # CAO-CAT-CAO-CAM + 4614 4 2882 2881 2886 2892 # CAO-CAT-CAO-HAT + 4615 5 2882 2883 2884 2885 # CAO-CAM-CAP-CAM + 4616 6 2882 2883 2884 2890 # CAO-CAM-CAP-HAT + 4617 7 2887 2881 2882 2883 # CTT-CAT-CAO-CAM + 4618 3 2886 2881 2882 2883 # CAO-CAT-CAO-CAM + 4619 5 2886 2885 2884 2883 # CAO-CAM-CAP-CAM + 4620 8 2883 2884 2885 2891 # CAM-CAP-CAM-HAT + 4621 9 2884 2883 2882 2888 # CAP-CAM-CAO-HAT + 4622 9 2884 2885 2886 2892 # CAP-CAM-CAO-HAT + 4623 8 2885 2884 2883 2889 # CAM-CAP-CAM-HAT + 4624 7 2887 2881 2886 2885 # CTT-CAT-CAO-CAM + 4625 6 2886 2885 2884 2890 # CAO-CAM-CAP-HAT + 4626 4 2886 2881 2882 2888 # CAO-CAT-CAO-HAT + 4627 10 2887 2881 2882 2888 # CTT-CAT-CAO-HAT + 4628 10 2887 2881 2886 2892 # CTT-CAT-CAO-HAT + 4629 11 2888 2882 2883 2889 # HAT-CAO-CAM-HAT + 4630 12 2889 2883 2884 2890 # HAT-CAM-CAP-HAT + 4631 12 2891 2885 2884 2890 # HAT-CAM-CAP-HAT + 4632 11 2892 2886 2885 2891 # HAT-CAO-CAM-HAT + 4633 1 2896 2897 2898 2899 # CAT-CAO-CAM-CAP + 4634 2 2896 2897 2898 2904 # CAT-CAO-CAM-HAT + 4635 1 2896 2901 2900 2899 # CAT-CAO-CAM-CAP + 4636 2 2896 2901 2900 2906 # CAT-CAO-CAM-HAT + 4637 3 2897 2896 2901 2900 # CAO-CAT-CAO-CAM + 4638 4 2897 2896 2901 2907 # CAO-CAT-CAO-HAT + 4639 5 2897 2898 2899 2900 # CAO-CAM-CAP-CAM + 4640 6 2897 2898 2899 2905 # CAO-CAM-CAP-HAT + 4641 7 2902 2896 2897 2898 # CTT-CAT-CAO-CAM + 4642 3 2901 2896 2897 2898 # CAO-CAT-CAO-CAM + 4643 5 2901 2900 2899 2898 # CAO-CAM-CAP-CAM + 4644 8 2898 2899 2900 2906 # CAM-CAP-CAM-HAT + 4645 9 2899 2898 2897 2903 # CAP-CAM-CAO-HAT + 4646 9 2899 2900 2901 2907 # CAP-CAM-CAO-HAT + 4647 8 2900 2899 2898 2904 # CAM-CAP-CAM-HAT + 4648 7 2902 2896 2901 2900 # CTT-CAT-CAO-CAM + 4649 6 2901 2900 2899 2905 # CAO-CAM-CAP-HAT + 4650 4 2901 2896 2897 2903 # CAO-CAT-CAO-HAT + 4651 10 2902 2896 2897 2903 # CTT-CAT-CAO-HAT + 4652 10 2902 2896 2901 2907 # CTT-CAT-CAO-HAT + 4653 11 2903 2897 2898 2904 # HAT-CAO-CAM-HAT + 4654 12 2904 2898 2899 2905 # HAT-CAM-CAP-HAT + 4655 12 2906 2900 2899 2905 # HAT-CAM-CAP-HAT + 4656 11 2907 2901 2900 2906 # HAT-CAO-CAM-HAT + 4657 1 2911 2912 2913 2914 # CAT-CAO-CAM-CAP + 4658 2 2911 2912 2913 2919 # CAT-CAO-CAM-HAT + 4659 1 2911 2916 2915 2914 # CAT-CAO-CAM-CAP + 4660 2 2911 2916 2915 2921 # CAT-CAO-CAM-HAT + 4661 3 2912 2911 2916 2915 # CAO-CAT-CAO-CAM + 4662 4 2912 2911 2916 2922 # CAO-CAT-CAO-HAT + 4663 5 2912 2913 2914 2915 # CAO-CAM-CAP-CAM + 4664 6 2912 2913 2914 2920 # CAO-CAM-CAP-HAT + 4665 7 2917 2911 2912 2913 # CTT-CAT-CAO-CAM + 4666 3 2916 2911 2912 2913 # CAO-CAT-CAO-CAM + 4667 5 2916 2915 2914 2913 # CAO-CAM-CAP-CAM + 4668 8 2913 2914 2915 2921 # CAM-CAP-CAM-HAT + 4669 9 2914 2913 2912 2918 # CAP-CAM-CAO-HAT + 4670 9 2914 2915 2916 2922 # CAP-CAM-CAO-HAT + 4671 8 2915 2914 2913 2919 # CAM-CAP-CAM-HAT + 4672 7 2917 2911 2916 2915 # CTT-CAT-CAO-CAM + 4673 6 2916 2915 2914 2920 # CAO-CAM-CAP-HAT + 4674 4 2916 2911 2912 2918 # CAO-CAT-CAO-HAT + 4675 10 2917 2911 2912 2918 # CTT-CAT-CAO-HAT + 4676 10 2917 2911 2916 2922 # CTT-CAT-CAO-HAT + 4677 11 2918 2912 2913 2919 # HAT-CAO-CAM-HAT + 4678 12 2919 2913 2914 2920 # HAT-CAM-CAP-HAT + 4679 12 2921 2915 2914 2920 # HAT-CAM-CAP-HAT + 4680 11 2922 2916 2915 2921 # HAT-CAO-CAM-HAT + 4681 1 2926 2927 2928 2929 # CAT-CAO-CAM-CAP + 4682 2 2926 2927 2928 2934 # CAT-CAO-CAM-HAT + 4683 1 2926 2931 2930 2929 # CAT-CAO-CAM-CAP + 4684 2 2926 2931 2930 2936 # CAT-CAO-CAM-HAT + 4685 3 2927 2926 2931 2930 # CAO-CAT-CAO-CAM + 4686 4 2927 2926 2931 2937 # CAO-CAT-CAO-HAT + 4687 5 2927 2928 2929 2930 # CAO-CAM-CAP-CAM + 4688 6 2927 2928 2929 2935 # CAO-CAM-CAP-HAT + 4689 7 2932 2926 2927 2928 # CTT-CAT-CAO-CAM + 4690 3 2931 2926 2927 2928 # CAO-CAT-CAO-CAM + 4691 5 2931 2930 2929 2928 # CAO-CAM-CAP-CAM + 4692 8 2928 2929 2930 2936 # CAM-CAP-CAM-HAT + 4693 9 2929 2928 2927 2933 # CAP-CAM-CAO-HAT + 4694 9 2929 2930 2931 2937 # CAP-CAM-CAO-HAT + 4695 8 2930 2929 2928 2934 # CAM-CAP-CAM-HAT + 4696 7 2932 2926 2931 2930 # CTT-CAT-CAO-CAM + 4697 6 2931 2930 2929 2935 # CAO-CAM-CAP-HAT + 4698 4 2931 2926 2927 2933 # CAO-CAT-CAO-HAT + 4699 10 2932 2926 2927 2933 # CTT-CAT-CAO-HAT + 4700 10 2932 2926 2931 2937 # CTT-CAT-CAO-HAT + 4701 11 2933 2927 2928 2934 # HAT-CAO-CAM-HAT + 4702 12 2934 2928 2929 2935 # HAT-CAM-CAP-HAT + 4703 12 2936 2930 2929 2935 # HAT-CAM-CAP-HAT + 4704 11 2937 2931 2930 2936 # HAT-CAO-CAM-HAT + 4705 1 2941 2942 2943 2944 # CAT-CAO-CAM-CAP + 4706 2 2941 2942 2943 2949 # CAT-CAO-CAM-HAT + 4707 1 2941 2946 2945 2944 # CAT-CAO-CAM-CAP + 4708 2 2941 2946 2945 2951 # CAT-CAO-CAM-HAT + 4709 3 2942 2941 2946 2945 # CAO-CAT-CAO-CAM + 4710 4 2942 2941 2946 2952 # CAO-CAT-CAO-HAT + 4711 5 2942 2943 2944 2945 # CAO-CAM-CAP-CAM + 4712 6 2942 2943 2944 2950 # CAO-CAM-CAP-HAT + 4713 7 2947 2941 2942 2943 # CTT-CAT-CAO-CAM + 4714 3 2946 2941 2942 2943 # CAO-CAT-CAO-CAM + 4715 5 2946 2945 2944 2943 # CAO-CAM-CAP-CAM + 4716 8 2943 2944 2945 2951 # CAM-CAP-CAM-HAT + 4717 9 2944 2943 2942 2948 # CAP-CAM-CAO-HAT + 4718 9 2944 2945 2946 2952 # CAP-CAM-CAO-HAT + 4719 8 2945 2944 2943 2949 # CAM-CAP-CAM-HAT + 4720 7 2947 2941 2946 2945 # CTT-CAT-CAO-CAM + 4721 6 2946 2945 2944 2950 # CAO-CAM-CAP-HAT + 4722 4 2946 2941 2942 2948 # CAO-CAT-CAO-HAT + 4723 10 2947 2941 2942 2948 # CTT-CAT-CAO-HAT + 4724 10 2947 2941 2946 2952 # CTT-CAT-CAO-HAT + 4725 11 2948 2942 2943 2949 # HAT-CAO-CAM-HAT + 4726 12 2949 2943 2944 2950 # HAT-CAM-CAP-HAT + 4727 12 2951 2945 2944 2950 # HAT-CAM-CAP-HAT + 4728 11 2952 2946 2945 2951 # HAT-CAO-CAM-HAT + 4729 1 2956 2957 2958 2959 # CAT-CAO-CAM-CAP + 4730 2 2956 2957 2958 2964 # CAT-CAO-CAM-HAT + 4731 1 2956 2961 2960 2959 # CAT-CAO-CAM-CAP + 4732 2 2956 2961 2960 2966 # CAT-CAO-CAM-HAT + 4733 3 2957 2956 2961 2960 # CAO-CAT-CAO-CAM + 4734 4 2957 2956 2961 2967 # CAO-CAT-CAO-HAT + 4735 5 2957 2958 2959 2960 # CAO-CAM-CAP-CAM + 4736 6 2957 2958 2959 2965 # CAO-CAM-CAP-HAT + 4737 7 2962 2956 2957 2958 # CTT-CAT-CAO-CAM + 4738 3 2961 2956 2957 2958 # CAO-CAT-CAO-CAM + 4739 5 2961 2960 2959 2958 # CAO-CAM-CAP-CAM + 4740 8 2958 2959 2960 2966 # CAM-CAP-CAM-HAT + 4741 9 2959 2958 2957 2963 # CAP-CAM-CAO-HAT + 4742 9 2959 2960 2961 2967 # CAP-CAM-CAO-HAT + 4743 8 2960 2959 2958 2964 # CAM-CAP-CAM-HAT + 4744 7 2962 2956 2961 2960 # CTT-CAT-CAO-CAM + 4745 6 2961 2960 2959 2965 # CAO-CAM-CAP-HAT + 4746 4 2961 2956 2957 2963 # CAO-CAT-CAO-HAT + 4747 10 2962 2956 2957 2963 # CTT-CAT-CAO-HAT + 4748 10 2962 2956 2961 2967 # CTT-CAT-CAO-HAT + 4749 11 2963 2957 2958 2964 # HAT-CAO-CAM-HAT + 4750 12 2964 2958 2959 2965 # HAT-CAM-CAP-HAT + 4751 12 2966 2960 2959 2965 # HAT-CAM-CAP-HAT + 4752 11 2967 2961 2960 2966 # HAT-CAO-CAM-HAT + 4753 1 2971 2972 2973 2974 # CAT-CAO-CAM-CAP + 4754 2 2971 2972 2973 2979 # CAT-CAO-CAM-HAT + 4755 1 2971 2976 2975 2974 # CAT-CAO-CAM-CAP + 4756 2 2971 2976 2975 2981 # CAT-CAO-CAM-HAT + 4757 3 2972 2971 2976 2975 # CAO-CAT-CAO-CAM + 4758 4 2972 2971 2976 2982 # CAO-CAT-CAO-HAT + 4759 5 2972 2973 2974 2975 # CAO-CAM-CAP-CAM + 4760 6 2972 2973 2974 2980 # CAO-CAM-CAP-HAT + 4761 7 2977 2971 2972 2973 # CTT-CAT-CAO-CAM + 4762 3 2976 2971 2972 2973 # CAO-CAT-CAO-CAM + 4763 5 2976 2975 2974 2973 # CAO-CAM-CAP-CAM + 4764 8 2973 2974 2975 2981 # CAM-CAP-CAM-HAT + 4765 9 2974 2973 2972 2978 # CAP-CAM-CAO-HAT + 4766 9 2974 2975 2976 2982 # CAP-CAM-CAO-HAT + 4767 8 2975 2974 2973 2979 # CAM-CAP-CAM-HAT + 4768 7 2977 2971 2976 2975 # CTT-CAT-CAO-CAM + 4769 6 2976 2975 2974 2980 # CAO-CAM-CAP-HAT + 4770 4 2976 2971 2972 2978 # CAO-CAT-CAO-HAT + 4771 10 2977 2971 2972 2978 # CTT-CAT-CAO-HAT + 4772 10 2977 2971 2976 2982 # CTT-CAT-CAO-HAT + 4773 11 2978 2972 2973 2979 # HAT-CAO-CAM-HAT + 4774 12 2979 2973 2974 2980 # HAT-CAM-CAP-HAT + 4775 12 2981 2975 2974 2980 # HAT-CAM-CAP-HAT + 4776 11 2982 2976 2975 2981 # HAT-CAO-CAM-HAT + 4777 1 2986 2987 2988 2989 # CAT-CAO-CAM-CAP + 4778 2 2986 2987 2988 2994 # CAT-CAO-CAM-HAT + 4779 1 2986 2991 2990 2989 # CAT-CAO-CAM-CAP + 4780 2 2986 2991 2990 2996 # CAT-CAO-CAM-HAT + 4781 3 2987 2986 2991 2990 # CAO-CAT-CAO-CAM + 4782 4 2987 2986 2991 2997 # CAO-CAT-CAO-HAT + 4783 5 2987 2988 2989 2990 # CAO-CAM-CAP-CAM + 4784 6 2987 2988 2989 2995 # CAO-CAM-CAP-HAT + 4785 7 2992 2986 2987 2988 # CTT-CAT-CAO-CAM + 4786 3 2991 2986 2987 2988 # CAO-CAT-CAO-CAM + 4787 5 2991 2990 2989 2988 # CAO-CAM-CAP-CAM + 4788 8 2988 2989 2990 2996 # CAM-CAP-CAM-HAT + 4789 9 2989 2988 2987 2993 # CAP-CAM-CAO-HAT + 4790 9 2989 2990 2991 2997 # CAP-CAM-CAO-HAT + 4791 8 2990 2989 2988 2994 # CAM-CAP-CAM-HAT + 4792 7 2992 2986 2991 2990 # CTT-CAT-CAO-CAM + 4793 6 2991 2990 2989 2995 # CAO-CAM-CAP-HAT + 4794 4 2991 2986 2987 2993 # CAO-CAT-CAO-HAT + 4795 10 2992 2986 2987 2993 # CTT-CAT-CAO-HAT + 4796 10 2992 2986 2991 2997 # CTT-CAT-CAO-HAT + 4797 11 2993 2987 2988 2994 # HAT-CAO-CAM-HAT + 4798 12 2994 2988 2989 2995 # HAT-CAM-CAP-HAT + 4799 12 2996 2990 2989 2995 # HAT-CAM-CAP-HAT + 4800 11 2997 2991 2990 2996 # HAT-CAO-CAM-HAT + 4801 1 3001 3002 3003 3004 # CAT-CAO-CAM-CAP + 4802 2 3001 3002 3003 3009 # CAT-CAO-CAM-HAT + 4803 1 3001 3006 3005 3004 # CAT-CAO-CAM-CAP + 4804 2 3001 3006 3005 3011 # CAT-CAO-CAM-HAT + 4805 3 3002 3001 3006 3005 # CAO-CAT-CAO-CAM + 4806 4 3002 3001 3006 3012 # CAO-CAT-CAO-HAT + 4807 5 3002 3003 3004 3005 # CAO-CAM-CAP-CAM + 4808 6 3002 3003 3004 3010 # CAO-CAM-CAP-HAT + 4809 7 3007 3001 3002 3003 # CTT-CAT-CAO-CAM + 4810 3 3006 3001 3002 3003 # CAO-CAT-CAO-CAM + 4811 5 3006 3005 3004 3003 # CAO-CAM-CAP-CAM + 4812 8 3003 3004 3005 3011 # CAM-CAP-CAM-HAT + 4813 9 3004 3003 3002 3008 # CAP-CAM-CAO-HAT + 4814 9 3004 3005 3006 3012 # CAP-CAM-CAO-HAT + 4815 8 3005 3004 3003 3009 # CAM-CAP-CAM-HAT + 4816 7 3007 3001 3006 3005 # CTT-CAT-CAO-CAM + 4817 6 3006 3005 3004 3010 # CAO-CAM-CAP-HAT + 4818 4 3006 3001 3002 3008 # CAO-CAT-CAO-HAT + 4819 10 3007 3001 3002 3008 # CTT-CAT-CAO-HAT + 4820 10 3007 3001 3006 3012 # CTT-CAT-CAO-HAT + 4821 11 3008 3002 3003 3009 # HAT-CAO-CAM-HAT + 4822 12 3009 3003 3004 3010 # HAT-CAM-CAP-HAT + 4823 12 3011 3005 3004 3010 # HAT-CAM-CAP-HAT + 4824 11 3012 3006 3005 3011 # HAT-CAO-CAM-HAT + 4825 1 3016 3017 3018 3019 # CAT-CAO-CAM-CAP + 4826 2 3016 3017 3018 3024 # CAT-CAO-CAM-HAT + 4827 1 3016 3021 3020 3019 # CAT-CAO-CAM-CAP + 4828 2 3016 3021 3020 3026 # CAT-CAO-CAM-HAT + 4829 3 3017 3016 3021 3020 # CAO-CAT-CAO-CAM + 4830 4 3017 3016 3021 3027 # CAO-CAT-CAO-HAT + 4831 5 3017 3018 3019 3020 # CAO-CAM-CAP-CAM + 4832 6 3017 3018 3019 3025 # CAO-CAM-CAP-HAT + 4833 7 3022 3016 3017 3018 # CTT-CAT-CAO-CAM + 4834 3 3021 3016 3017 3018 # CAO-CAT-CAO-CAM + 4835 5 3021 3020 3019 3018 # CAO-CAM-CAP-CAM + 4836 8 3018 3019 3020 3026 # CAM-CAP-CAM-HAT + 4837 9 3019 3018 3017 3023 # CAP-CAM-CAO-HAT + 4838 9 3019 3020 3021 3027 # CAP-CAM-CAO-HAT + 4839 8 3020 3019 3018 3024 # CAM-CAP-CAM-HAT + 4840 7 3022 3016 3021 3020 # CTT-CAT-CAO-CAM + 4841 6 3021 3020 3019 3025 # CAO-CAM-CAP-HAT + 4842 4 3021 3016 3017 3023 # CAO-CAT-CAO-HAT + 4843 10 3022 3016 3017 3023 # CTT-CAT-CAO-HAT + 4844 10 3022 3016 3021 3027 # CTT-CAT-CAO-HAT + 4845 11 3023 3017 3018 3024 # HAT-CAO-CAM-HAT + 4846 12 3024 3018 3019 3025 # HAT-CAM-CAP-HAT + 4847 12 3026 3020 3019 3025 # HAT-CAM-CAP-HAT + 4848 11 3027 3021 3020 3026 # HAT-CAO-CAM-HAT + 4849 1 3031 3032 3033 3034 # CAT-CAO-CAM-CAP + 4850 2 3031 3032 3033 3039 # CAT-CAO-CAM-HAT + 4851 1 3031 3036 3035 3034 # CAT-CAO-CAM-CAP + 4852 2 3031 3036 3035 3041 # CAT-CAO-CAM-HAT + 4853 3 3032 3031 3036 3035 # CAO-CAT-CAO-CAM + 4854 4 3032 3031 3036 3042 # CAO-CAT-CAO-HAT + 4855 5 3032 3033 3034 3035 # CAO-CAM-CAP-CAM + 4856 6 3032 3033 3034 3040 # CAO-CAM-CAP-HAT + 4857 7 3037 3031 3032 3033 # CTT-CAT-CAO-CAM + 4858 3 3036 3031 3032 3033 # CAO-CAT-CAO-CAM + 4859 5 3036 3035 3034 3033 # CAO-CAM-CAP-CAM + 4860 8 3033 3034 3035 3041 # CAM-CAP-CAM-HAT + 4861 9 3034 3033 3032 3038 # CAP-CAM-CAO-HAT + 4862 9 3034 3035 3036 3042 # CAP-CAM-CAO-HAT + 4863 8 3035 3034 3033 3039 # CAM-CAP-CAM-HAT + 4864 7 3037 3031 3036 3035 # CTT-CAT-CAO-CAM + 4865 6 3036 3035 3034 3040 # CAO-CAM-CAP-HAT + 4866 4 3036 3031 3032 3038 # CAO-CAT-CAO-HAT + 4867 10 3037 3031 3032 3038 # CTT-CAT-CAO-HAT + 4868 10 3037 3031 3036 3042 # CTT-CAT-CAO-HAT + 4869 11 3038 3032 3033 3039 # HAT-CAO-CAM-HAT + 4870 12 3039 3033 3034 3040 # HAT-CAM-CAP-HAT + 4871 12 3041 3035 3034 3040 # HAT-CAM-CAP-HAT + 4872 11 3042 3036 3035 3041 # HAT-CAO-CAM-HAT + 4873 1 3046 3047 3048 3049 # CAT-CAO-CAM-CAP + 4874 2 3046 3047 3048 3054 # CAT-CAO-CAM-HAT + 4875 1 3046 3051 3050 3049 # CAT-CAO-CAM-CAP + 4876 2 3046 3051 3050 3056 # CAT-CAO-CAM-HAT + 4877 3 3047 3046 3051 3050 # CAO-CAT-CAO-CAM + 4878 4 3047 3046 3051 3057 # CAO-CAT-CAO-HAT + 4879 5 3047 3048 3049 3050 # CAO-CAM-CAP-CAM + 4880 6 3047 3048 3049 3055 # CAO-CAM-CAP-HAT + 4881 7 3052 3046 3047 3048 # CTT-CAT-CAO-CAM + 4882 3 3051 3046 3047 3048 # CAO-CAT-CAO-CAM + 4883 5 3051 3050 3049 3048 # CAO-CAM-CAP-CAM + 4884 8 3048 3049 3050 3056 # CAM-CAP-CAM-HAT + 4885 9 3049 3048 3047 3053 # CAP-CAM-CAO-HAT + 4886 9 3049 3050 3051 3057 # CAP-CAM-CAO-HAT + 4887 8 3050 3049 3048 3054 # CAM-CAP-CAM-HAT + 4888 7 3052 3046 3051 3050 # CTT-CAT-CAO-CAM + 4889 6 3051 3050 3049 3055 # CAO-CAM-CAP-HAT + 4890 4 3051 3046 3047 3053 # CAO-CAT-CAO-HAT + 4891 10 3052 3046 3047 3053 # CTT-CAT-CAO-HAT + 4892 10 3052 3046 3051 3057 # CTT-CAT-CAO-HAT + 4893 11 3053 3047 3048 3054 # HAT-CAO-CAM-HAT + 4894 12 3054 3048 3049 3055 # HAT-CAM-CAP-HAT + 4895 12 3056 3050 3049 3055 # HAT-CAM-CAP-HAT + 4896 11 3057 3051 3050 3056 # HAT-CAO-CAM-HAT + 4897 1 3061 3062 3063 3064 # CAT-CAO-CAM-CAP + 4898 2 3061 3062 3063 3069 # CAT-CAO-CAM-HAT + 4899 1 3061 3066 3065 3064 # CAT-CAO-CAM-CAP + 4900 2 3061 3066 3065 3071 # CAT-CAO-CAM-HAT + 4901 3 3062 3061 3066 3065 # CAO-CAT-CAO-CAM + 4902 4 3062 3061 3066 3072 # CAO-CAT-CAO-HAT + 4903 5 3062 3063 3064 3065 # CAO-CAM-CAP-CAM + 4904 6 3062 3063 3064 3070 # CAO-CAM-CAP-HAT + 4905 7 3067 3061 3062 3063 # CTT-CAT-CAO-CAM + 4906 3 3066 3061 3062 3063 # CAO-CAT-CAO-CAM + 4907 5 3066 3065 3064 3063 # CAO-CAM-CAP-CAM + 4908 8 3063 3064 3065 3071 # CAM-CAP-CAM-HAT + 4909 9 3064 3063 3062 3068 # CAP-CAM-CAO-HAT + 4910 9 3064 3065 3066 3072 # CAP-CAM-CAO-HAT + 4911 8 3065 3064 3063 3069 # CAM-CAP-CAM-HAT + 4912 7 3067 3061 3066 3065 # CTT-CAT-CAO-CAM + 4913 6 3066 3065 3064 3070 # CAO-CAM-CAP-HAT + 4914 4 3066 3061 3062 3068 # CAO-CAT-CAO-HAT + 4915 10 3067 3061 3062 3068 # CTT-CAT-CAO-HAT + 4916 10 3067 3061 3066 3072 # CTT-CAT-CAO-HAT + 4917 11 3068 3062 3063 3069 # HAT-CAO-CAM-HAT + 4918 12 3069 3063 3064 3070 # HAT-CAM-CAP-HAT + 4919 12 3071 3065 3064 3070 # HAT-CAM-CAP-HAT + 4920 11 3072 3066 3065 3071 # HAT-CAO-CAM-HAT + 4921 1 3076 3077 3078 3079 # CAT-CAO-CAM-CAP + 4922 2 3076 3077 3078 3084 # CAT-CAO-CAM-HAT + 4923 1 3076 3081 3080 3079 # CAT-CAO-CAM-CAP + 4924 2 3076 3081 3080 3086 # CAT-CAO-CAM-HAT + 4925 3 3077 3076 3081 3080 # CAO-CAT-CAO-CAM + 4926 4 3077 3076 3081 3087 # CAO-CAT-CAO-HAT + 4927 5 3077 3078 3079 3080 # CAO-CAM-CAP-CAM + 4928 6 3077 3078 3079 3085 # CAO-CAM-CAP-HAT + 4929 7 3082 3076 3077 3078 # CTT-CAT-CAO-CAM + 4930 3 3081 3076 3077 3078 # CAO-CAT-CAO-CAM + 4931 5 3081 3080 3079 3078 # CAO-CAM-CAP-CAM + 4932 8 3078 3079 3080 3086 # CAM-CAP-CAM-HAT + 4933 9 3079 3078 3077 3083 # CAP-CAM-CAO-HAT + 4934 9 3079 3080 3081 3087 # CAP-CAM-CAO-HAT + 4935 8 3080 3079 3078 3084 # CAM-CAP-CAM-HAT + 4936 7 3082 3076 3081 3080 # CTT-CAT-CAO-CAM + 4937 6 3081 3080 3079 3085 # CAO-CAM-CAP-HAT + 4938 4 3081 3076 3077 3083 # CAO-CAT-CAO-HAT + 4939 10 3082 3076 3077 3083 # CTT-CAT-CAO-HAT + 4940 10 3082 3076 3081 3087 # CTT-CAT-CAO-HAT + 4941 11 3083 3077 3078 3084 # HAT-CAO-CAM-HAT + 4942 12 3084 3078 3079 3085 # HAT-CAM-CAP-HAT + 4943 12 3086 3080 3079 3085 # HAT-CAM-CAP-HAT + 4944 11 3087 3081 3080 3086 # HAT-CAO-CAM-HAT + 4945 1 3091 3092 3093 3094 # CAT-CAO-CAM-CAP + 4946 2 3091 3092 3093 3099 # CAT-CAO-CAM-HAT + 4947 1 3091 3096 3095 3094 # CAT-CAO-CAM-CAP + 4948 2 3091 3096 3095 3101 # CAT-CAO-CAM-HAT + 4949 3 3092 3091 3096 3095 # CAO-CAT-CAO-CAM + 4950 4 3092 3091 3096 3102 # CAO-CAT-CAO-HAT + 4951 5 3092 3093 3094 3095 # CAO-CAM-CAP-CAM + 4952 6 3092 3093 3094 3100 # CAO-CAM-CAP-HAT + 4953 7 3097 3091 3092 3093 # CTT-CAT-CAO-CAM + 4954 3 3096 3091 3092 3093 # CAO-CAT-CAO-CAM + 4955 5 3096 3095 3094 3093 # CAO-CAM-CAP-CAM + 4956 8 3093 3094 3095 3101 # CAM-CAP-CAM-HAT + 4957 9 3094 3093 3092 3098 # CAP-CAM-CAO-HAT + 4958 9 3094 3095 3096 3102 # CAP-CAM-CAO-HAT + 4959 8 3095 3094 3093 3099 # CAM-CAP-CAM-HAT + 4960 7 3097 3091 3096 3095 # CTT-CAT-CAO-CAM + 4961 6 3096 3095 3094 3100 # CAO-CAM-CAP-HAT + 4962 4 3096 3091 3092 3098 # CAO-CAT-CAO-HAT + 4963 10 3097 3091 3092 3098 # CTT-CAT-CAO-HAT + 4964 10 3097 3091 3096 3102 # CTT-CAT-CAO-HAT + 4965 11 3098 3092 3093 3099 # HAT-CAO-CAM-HAT + 4966 12 3099 3093 3094 3100 # HAT-CAM-CAP-HAT + 4967 12 3101 3095 3094 3100 # HAT-CAM-CAP-HAT + 4968 11 3102 3096 3095 3101 # HAT-CAO-CAM-HAT + 4969 1 3106 3107 3108 3109 # CAT-CAO-CAM-CAP + 4970 2 3106 3107 3108 3114 # CAT-CAO-CAM-HAT + 4971 1 3106 3111 3110 3109 # CAT-CAO-CAM-CAP + 4972 2 3106 3111 3110 3116 # CAT-CAO-CAM-HAT + 4973 3 3107 3106 3111 3110 # CAO-CAT-CAO-CAM + 4974 4 3107 3106 3111 3117 # CAO-CAT-CAO-HAT + 4975 5 3107 3108 3109 3110 # CAO-CAM-CAP-CAM + 4976 6 3107 3108 3109 3115 # CAO-CAM-CAP-HAT + 4977 7 3112 3106 3107 3108 # CTT-CAT-CAO-CAM + 4978 3 3111 3106 3107 3108 # CAO-CAT-CAO-CAM + 4979 5 3111 3110 3109 3108 # CAO-CAM-CAP-CAM + 4980 8 3108 3109 3110 3116 # CAM-CAP-CAM-HAT + 4981 9 3109 3108 3107 3113 # CAP-CAM-CAO-HAT + 4982 9 3109 3110 3111 3117 # CAP-CAM-CAO-HAT + 4983 8 3110 3109 3108 3114 # CAM-CAP-CAM-HAT + 4984 7 3112 3106 3111 3110 # CTT-CAT-CAO-CAM + 4985 6 3111 3110 3109 3115 # CAO-CAM-CAP-HAT + 4986 4 3111 3106 3107 3113 # CAO-CAT-CAO-HAT + 4987 10 3112 3106 3107 3113 # CTT-CAT-CAO-HAT + 4988 10 3112 3106 3111 3117 # CTT-CAT-CAO-HAT + 4989 11 3113 3107 3108 3114 # HAT-CAO-CAM-HAT + 4990 12 3114 3108 3109 3115 # HAT-CAM-CAP-HAT + 4991 12 3116 3110 3109 3115 # HAT-CAM-CAP-HAT + 4992 11 3117 3111 3110 3116 # HAT-CAO-CAM-HAT + 4993 1 3121 3122 3123 3124 # CAT-CAO-CAM-CAP + 4994 2 3121 3122 3123 3129 # CAT-CAO-CAM-HAT + 4995 1 3121 3126 3125 3124 # CAT-CAO-CAM-CAP + 4996 2 3121 3126 3125 3131 # CAT-CAO-CAM-HAT + 4997 3 3122 3121 3126 3125 # CAO-CAT-CAO-CAM + 4998 4 3122 3121 3126 3132 # CAO-CAT-CAO-HAT + 4999 5 3122 3123 3124 3125 # CAO-CAM-CAP-CAM + 5000 6 3122 3123 3124 3130 # CAO-CAM-CAP-HAT + 5001 7 3127 3121 3122 3123 # CTT-CAT-CAO-CAM + 5002 3 3126 3121 3122 3123 # CAO-CAT-CAO-CAM + 5003 5 3126 3125 3124 3123 # CAO-CAM-CAP-CAM + 5004 8 3123 3124 3125 3131 # CAM-CAP-CAM-HAT + 5005 9 3124 3123 3122 3128 # CAP-CAM-CAO-HAT + 5006 9 3124 3125 3126 3132 # CAP-CAM-CAO-HAT + 5007 8 3125 3124 3123 3129 # CAM-CAP-CAM-HAT + 5008 7 3127 3121 3126 3125 # CTT-CAT-CAO-CAM + 5009 6 3126 3125 3124 3130 # CAO-CAM-CAP-HAT + 5010 4 3126 3121 3122 3128 # CAO-CAT-CAO-HAT + 5011 10 3127 3121 3122 3128 # CTT-CAT-CAO-HAT + 5012 10 3127 3121 3126 3132 # CTT-CAT-CAO-HAT + 5013 11 3128 3122 3123 3129 # HAT-CAO-CAM-HAT + 5014 12 3129 3123 3124 3130 # HAT-CAM-CAP-HAT + 5015 12 3131 3125 3124 3130 # HAT-CAM-CAP-HAT + 5016 11 3132 3126 3125 3131 # HAT-CAO-CAM-HAT + 5017 1 3136 3137 3138 3139 # CAT-CAO-CAM-CAP + 5018 2 3136 3137 3138 3144 # CAT-CAO-CAM-HAT + 5019 1 3136 3141 3140 3139 # CAT-CAO-CAM-CAP + 5020 2 3136 3141 3140 3146 # CAT-CAO-CAM-HAT + 5021 3 3137 3136 3141 3140 # CAO-CAT-CAO-CAM + 5022 4 3137 3136 3141 3147 # CAO-CAT-CAO-HAT + 5023 5 3137 3138 3139 3140 # CAO-CAM-CAP-CAM + 5024 6 3137 3138 3139 3145 # CAO-CAM-CAP-HAT + 5025 7 3142 3136 3137 3138 # CTT-CAT-CAO-CAM + 5026 3 3141 3136 3137 3138 # CAO-CAT-CAO-CAM + 5027 5 3141 3140 3139 3138 # CAO-CAM-CAP-CAM + 5028 8 3138 3139 3140 3146 # CAM-CAP-CAM-HAT + 5029 9 3139 3138 3137 3143 # CAP-CAM-CAO-HAT + 5030 9 3139 3140 3141 3147 # CAP-CAM-CAO-HAT + 5031 8 3140 3139 3138 3144 # CAM-CAP-CAM-HAT + 5032 7 3142 3136 3141 3140 # CTT-CAT-CAO-CAM + 5033 6 3141 3140 3139 3145 # CAO-CAM-CAP-HAT + 5034 4 3141 3136 3137 3143 # CAO-CAT-CAO-HAT + 5035 10 3142 3136 3137 3143 # CTT-CAT-CAO-HAT + 5036 10 3142 3136 3141 3147 # CTT-CAT-CAO-HAT + 5037 11 3143 3137 3138 3144 # HAT-CAO-CAM-HAT + 5038 12 3144 3138 3139 3145 # HAT-CAM-CAP-HAT + 5039 12 3146 3140 3139 3145 # HAT-CAM-CAP-HAT + 5040 11 3147 3141 3140 3146 # HAT-CAO-CAM-HAT + 5041 1 3151 3152 3153 3154 # CAT-CAO-CAM-CAP + 5042 2 3151 3152 3153 3159 # CAT-CAO-CAM-HAT + 5043 1 3151 3156 3155 3154 # CAT-CAO-CAM-CAP + 5044 2 3151 3156 3155 3161 # CAT-CAO-CAM-HAT + 5045 3 3152 3151 3156 3155 # CAO-CAT-CAO-CAM + 5046 4 3152 3151 3156 3162 # CAO-CAT-CAO-HAT + 5047 5 3152 3153 3154 3155 # CAO-CAM-CAP-CAM + 5048 6 3152 3153 3154 3160 # CAO-CAM-CAP-HAT + 5049 7 3157 3151 3152 3153 # CTT-CAT-CAO-CAM + 5050 3 3156 3151 3152 3153 # CAO-CAT-CAO-CAM + 5051 5 3156 3155 3154 3153 # CAO-CAM-CAP-CAM + 5052 8 3153 3154 3155 3161 # CAM-CAP-CAM-HAT + 5053 9 3154 3153 3152 3158 # CAP-CAM-CAO-HAT + 5054 9 3154 3155 3156 3162 # CAP-CAM-CAO-HAT + 5055 8 3155 3154 3153 3159 # CAM-CAP-CAM-HAT + 5056 7 3157 3151 3156 3155 # CTT-CAT-CAO-CAM + 5057 6 3156 3155 3154 3160 # CAO-CAM-CAP-HAT + 5058 4 3156 3151 3152 3158 # CAO-CAT-CAO-HAT + 5059 10 3157 3151 3152 3158 # CTT-CAT-CAO-HAT + 5060 10 3157 3151 3156 3162 # CTT-CAT-CAO-HAT + 5061 11 3158 3152 3153 3159 # HAT-CAO-CAM-HAT + 5062 12 3159 3153 3154 3160 # HAT-CAM-CAP-HAT + 5063 12 3161 3155 3154 3160 # HAT-CAM-CAP-HAT + 5064 11 3162 3156 3155 3161 # HAT-CAO-CAM-HAT + 5065 1 3166 3167 3168 3169 # CAT-CAO-CAM-CAP + 5066 2 3166 3167 3168 3174 # CAT-CAO-CAM-HAT + 5067 1 3166 3171 3170 3169 # CAT-CAO-CAM-CAP + 5068 2 3166 3171 3170 3176 # CAT-CAO-CAM-HAT + 5069 3 3167 3166 3171 3170 # CAO-CAT-CAO-CAM + 5070 4 3167 3166 3171 3177 # CAO-CAT-CAO-HAT + 5071 5 3167 3168 3169 3170 # CAO-CAM-CAP-CAM + 5072 6 3167 3168 3169 3175 # CAO-CAM-CAP-HAT + 5073 7 3172 3166 3167 3168 # CTT-CAT-CAO-CAM + 5074 3 3171 3166 3167 3168 # CAO-CAT-CAO-CAM + 5075 5 3171 3170 3169 3168 # CAO-CAM-CAP-CAM + 5076 8 3168 3169 3170 3176 # CAM-CAP-CAM-HAT + 5077 9 3169 3168 3167 3173 # CAP-CAM-CAO-HAT + 5078 9 3169 3170 3171 3177 # CAP-CAM-CAO-HAT + 5079 8 3170 3169 3168 3174 # CAM-CAP-CAM-HAT + 5080 7 3172 3166 3171 3170 # CTT-CAT-CAO-CAM + 5081 6 3171 3170 3169 3175 # CAO-CAM-CAP-HAT + 5082 4 3171 3166 3167 3173 # CAO-CAT-CAO-HAT + 5083 10 3172 3166 3167 3173 # CTT-CAT-CAO-HAT + 5084 10 3172 3166 3171 3177 # CTT-CAT-CAO-HAT + 5085 11 3173 3167 3168 3174 # HAT-CAO-CAM-HAT + 5086 12 3174 3168 3169 3175 # HAT-CAM-CAP-HAT + 5087 12 3176 3170 3169 3175 # HAT-CAM-CAP-HAT + 5088 11 3177 3171 3170 3176 # HAT-CAO-CAM-HAT + 5089 1 3181 3182 3183 3184 # CAT-CAO-CAM-CAP + 5090 2 3181 3182 3183 3189 # CAT-CAO-CAM-HAT + 5091 1 3181 3186 3185 3184 # CAT-CAO-CAM-CAP + 5092 2 3181 3186 3185 3191 # CAT-CAO-CAM-HAT + 5093 3 3182 3181 3186 3185 # CAO-CAT-CAO-CAM + 5094 4 3182 3181 3186 3192 # CAO-CAT-CAO-HAT + 5095 5 3182 3183 3184 3185 # CAO-CAM-CAP-CAM + 5096 6 3182 3183 3184 3190 # CAO-CAM-CAP-HAT + 5097 7 3187 3181 3182 3183 # CTT-CAT-CAO-CAM + 5098 3 3186 3181 3182 3183 # CAO-CAT-CAO-CAM + 5099 5 3186 3185 3184 3183 # CAO-CAM-CAP-CAM + 5100 8 3183 3184 3185 3191 # CAM-CAP-CAM-HAT + 5101 9 3184 3183 3182 3188 # CAP-CAM-CAO-HAT + 5102 9 3184 3185 3186 3192 # CAP-CAM-CAO-HAT + 5103 8 3185 3184 3183 3189 # CAM-CAP-CAM-HAT + 5104 7 3187 3181 3186 3185 # CTT-CAT-CAO-CAM + 5105 6 3186 3185 3184 3190 # CAO-CAM-CAP-HAT + 5106 4 3186 3181 3182 3188 # CAO-CAT-CAO-HAT + 5107 10 3187 3181 3182 3188 # CTT-CAT-CAO-HAT + 5108 10 3187 3181 3186 3192 # CTT-CAT-CAO-HAT + 5109 11 3188 3182 3183 3189 # HAT-CAO-CAM-HAT + 5110 12 3189 3183 3184 3190 # HAT-CAM-CAP-HAT + 5111 12 3191 3185 3184 3190 # HAT-CAM-CAP-HAT + 5112 11 3192 3186 3185 3191 # HAT-CAO-CAM-HAT + 5113 1 3196 3197 3198 3199 # CAT-CAO-CAM-CAP + 5114 2 3196 3197 3198 3204 # CAT-CAO-CAM-HAT + 5115 1 3196 3201 3200 3199 # CAT-CAO-CAM-CAP + 5116 2 3196 3201 3200 3206 # CAT-CAO-CAM-HAT + 5117 3 3197 3196 3201 3200 # CAO-CAT-CAO-CAM + 5118 4 3197 3196 3201 3207 # CAO-CAT-CAO-HAT + 5119 5 3197 3198 3199 3200 # CAO-CAM-CAP-CAM + 5120 6 3197 3198 3199 3205 # CAO-CAM-CAP-HAT + 5121 7 3202 3196 3197 3198 # CTT-CAT-CAO-CAM + 5122 3 3201 3196 3197 3198 # CAO-CAT-CAO-CAM + 5123 5 3201 3200 3199 3198 # CAO-CAM-CAP-CAM + 5124 8 3198 3199 3200 3206 # CAM-CAP-CAM-HAT + 5125 9 3199 3198 3197 3203 # CAP-CAM-CAO-HAT + 5126 9 3199 3200 3201 3207 # CAP-CAM-CAO-HAT + 5127 8 3200 3199 3198 3204 # CAM-CAP-CAM-HAT + 5128 7 3202 3196 3201 3200 # CTT-CAT-CAO-CAM + 5129 6 3201 3200 3199 3205 # CAO-CAM-CAP-HAT + 5130 4 3201 3196 3197 3203 # CAO-CAT-CAO-HAT + 5131 10 3202 3196 3197 3203 # CTT-CAT-CAO-HAT + 5132 10 3202 3196 3201 3207 # CTT-CAT-CAO-HAT + 5133 11 3203 3197 3198 3204 # HAT-CAO-CAM-HAT + 5134 12 3204 3198 3199 3205 # HAT-CAM-CAP-HAT + 5135 12 3206 3200 3199 3205 # HAT-CAM-CAP-HAT + 5136 11 3207 3201 3200 3206 # HAT-CAO-CAM-HAT + 5137 1 3211 3212 3213 3214 # CAT-CAO-CAM-CAP + 5138 2 3211 3212 3213 3219 # CAT-CAO-CAM-HAT + 5139 1 3211 3216 3215 3214 # CAT-CAO-CAM-CAP + 5140 2 3211 3216 3215 3221 # CAT-CAO-CAM-HAT + 5141 3 3212 3211 3216 3215 # CAO-CAT-CAO-CAM + 5142 4 3212 3211 3216 3222 # CAO-CAT-CAO-HAT + 5143 5 3212 3213 3214 3215 # CAO-CAM-CAP-CAM + 5144 6 3212 3213 3214 3220 # CAO-CAM-CAP-HAT + 5145 7 3217 3211 3212 3213 # CTT-CAT-CAO-CAM + 5146 3 3216 3211 3212 3213 # CAO-CAT-CAO-CAM + 5147 5 3216 3215 3214 3213 # CAO-CAM-CAP-CAM + 5148 8 3213 3214 3215 3221 # CAM-CAP-CAM-HAT + 5149 9 3214 3213 3212 3218 # CAP-CAM-CAO-HAT + 5150 9 3214 3215 3216 3222 # CAP-CAM-CAO-HAT + 5151 8 3215 3214 3213 3219 # CAM-CAP-CAM-HAT + 5152 7 3217 3211 3216 3215 # CTT-CAT-CAO-CAM + 5153 6 3216 3215 3214 3220 # CAO-CAM-CAP-HAT + 5154 4 3216 3211 3212 3218 # CAO-CAT-CAO-HAT + 5155 10 3217 3211 3212 3218 # CTT-CAT-CAO-HAT + 5156 10 3217 3211 3216 3222 # CTT-CAT-CAO-HAT + 5157 11 3218 3212 3213 3219 # HAT-CAO-CAM-HAT + 5158 12 3219 3213 3214 3220 # HAT-CAM-CAP-HAT + 5159 12 3221 3215 3214 3220 # HAT-CAM-CAP-HAT + 5160 11 3222 3216 3215 3221 # HAT-CAO-CAM-HAT + 5161 1 3226 3227 3228 3229 # CAT-CAO-CAM-CAP + 5162 2 3226 3227 3228 3234 # CAT-CAO-CAM-HAT + 5163 1 3226 3231 3230 3229 # CAT-CAO-CAM-CAP + 5164 2 3226 3231 3230 3236 # CAT-CAO-CAM-HAT + 5165 3 3227 3226 3231 3230 # CAO-CAT-CAO-CAM + 5166 4 3227 3226 3231 3237 # CAO-CAT-CAO-HAT + 5167 5 3227 3228 3229 3230 # CAO-CAM-CAP-CAM + 5168 6 3227 3228 3229 3235 # CAO-CAM-CAP-HAT + 5169 7 3232 3226 3227 3228 # CTT-CAT-CAO-CAM + 5170 3 3231 3226 3227 3228 # CAO-CAT-CAO-CAM + 5171 5 3231 3230 3229 3228 # CAO-CAM-CAP-CAM + 5172 8 3228 3229 3230 3236 # CAM-CAP-CAM-HAT + 5173 9 3229 3228 3227 3233 # CAP-CAM-CAO-HAT + 5174 9 3229 3230 3231 3237 # CAP-CAM-CAO-HAT + 5175 8 3230 3229 3228 3234 # CAM-CAP-CAM-HAT + 5176 7 3232 3226 3231 3230 # CTT-CAT-CAO-CAM + 5177 6 3231 3230 3229 3235 # CAO-CAM-CAP-HAT + 5178 4 3231 3226 3227 3233 # CAO-CAT-CAO-HAT + 5179 10 3232 3226 3227 3233 # CTT-CAT-CAO-HAT + 5180 10 3232 3226 3231 3237 # CTT-CAT-CAO-HAT + 5181 11 3233 3227 3228 3234 # HAT-CAO-CAM-HAT + 5182 12 3234 3228 3229 3235 # HAT-CAM-CAP-HAT + 5183 12 3236 3230 3229 3235 # HAT-CAM-CAP-HAT + 5184 11 3237 3231 3230 3236 # HAT-CAO-CAM-HAT + 5185 1 3241 3242 3243 3244 # CAT-CAO-CAM-CAP + 5186 2 3241 3242 3243 3249 # CAT-CAO-CAM-HAT + 5187 1 3241 3246 3245 3244 # CAT-CAO-CAM-CAP + 5188 2 3241 3246 3245 3251 # CAT-CAO-CAM-HAT + 5189 3 3242 3241 3246 3245 # CAO-CAT-CAO-CAM + 5190 4 3242 3241 3246 3252 # CAO-CAT-CAO-HAT + 5191 5 3242 3243 3244 3245 # CAO-CAM-CAP-CAM + 5192 6 3242 3243 3244 3250 # CAO-CAM-CAP-HAT + 5193 7 3247 3241 3242 3243 # CTT-CAT-CAO-CAM + 5194 3 3246 3241 3242 3243 # CAO-CAT-CAO-CAM + 5195 5 3246 3245 3244 3243 # CAO-CAM-CAP-CAM + 5196 8 3243 3244 3245 3251 # CAM-CAP-CAM-HAT + 5197 9 3244 3243 3242 3248 # CAP-CAM-CAO-HAT + 5198 9 3244 3245 3246 3252 # CAP-CAM-CAO-HAT + 5199 8 3245 3244 3243 3249 # CAM-CAP-CAM-HAT + 5200 7 3247 3241 3246 3245 # CTT-CAT-CAO-CAM + 5201 6 3246 3245 3244 3250 # CAO-CAM-CAP-HAT + 5202 4 3246 3241 3242 3248 # CAO-CAT-CAO-HAT + 5203 10 3247 3241 3242 3248 # CTT-CAT-CAO-HAT + 5204 10 3247 3241 3246 3252 # CTT-CAT-CAO-HAT + 5205 11 3248 3242 3243 3249 # HAT-CAO-CAM-HAT + 5206 12 3249 3243 3244 3250 # HAT-CAM-CAP-HAT + 5207 12 3251 3245 3244 3250 # HAT-CAM-CAP-HAT + 5208 11 3252 3246 3245 3251 # HAT-CAO-CAM-HAT + 5209 1 3256 3257 3258 3259 # CAT-CAO-CAM-CAP + 5210 2 3256 3257 3258 3264 # CAT-CAO-CAM-HAT + 5211 1 3256 3261 3260 3259 # CAT-CAO-CAM-CAP + 5212 2 3256 3261 3260 3266 # CAT-CAO-CAM-HAT + 5213 3 3257 3256 3261 3260 # CAO-CAT-CAO-CAM + 5214 4 3257 3256 3261 3267 # CAO-CAT-CAO-HAT + 5215 5 3257 3258 3259 3260 # CAO-CAM-CAP-CAM + 5216 6 3257 3258 3259 3265 # CAO-CAM-CAP-HAT + 5217 7 3262 3256 3257 3258 # CTT-CAT-CAO-CAM + 5218 3 3261 3256 3257 3258 # CAO-CAT-CAO-CAM + 5219 5 3261 3260 3259 3258 # CAO-CAM-CAP-CAM + 5220 8 3258 3259 3260 3266 # CAM-CAP-CAM-HAT + 5221 9 3259 3258 3257 3263 # CAP-CAM-CAO-HAT + 5222 9 3259 3260 3261 3267 # CAP-CAM-CAO-HAT + 5223 8 3260 3259 3258 3264 # CAM-CAP-CAM-HAT + 5224 7 3262 3256 3261 3260 # CTT-CAT-CAO-CAM + 5225 6 3261 3260 3259 3265 # CAO-CAM-CAP-HAT + 5226 4 3261 3256 3257 3263 # CAO-CAT-CAO-HAT + 5227 10 3262 3256 3257 3263 # CTT-CAT-CAO-HAT + 5228 10 3262 3256 3261 3267 # CTT-CAT-CAO-HAT + 5229 11 3263 3257 3258 3264 # HAT-CAO-CAM-HAT + 5230 12 3264 3258 3259 3265 # HAT-CAM-CAP-HAT + 5231 12 3266 3260 3259 3265 # HAT-CAM-CAP-HAT + 5232 11 3267 3261 3260 3266 # HAT-CAO-CAM-HAT + 5233 1 3271 3272 3273 3274 # CAT-CAO-CAM-CAP + 5234 2 3271 3272 3273 3279 # CAT-CAO-CAM-HAT + 5235 1 3271 3276 3275 3274 # CAT-CAO-CAM-CAP + 5236 2 3271 3276 3275 3281 # CAT-CAO-CAM-HAT + 5237 3 3272 3271 3276 3275 # CAO-CAT-CAO-CAM + 5238 4 3272 3271 3276 3282 # CAO-CAT-CAO-HAT + 5239 5 3272 3273 3274 3275 # CAO-CAM-CAP-CAM + 5240 6 3272 3273 3274 3280 # CAO-CAM-CAP-HAT + 5241 7 3277 3271 3272 3273 # CTT-CAT-CAO-CAM + 5242 3 3276 3271 3272 3273 # CAO-CAT-CAO-CAM + 5243 5 3276 3275 3274 3273 # CAO-CAM-CAP-CAM + 5244 8 3273 3274 3275 3281 # CAM-CAP-CAM-HAT + 5245 9 3274 3273 3272 3278 # CAP-CAM-CAO-HAT + 5246 9 3274 3275 3276 3282 # CAP-CAM-CAO-HAT + 5247 8 3275 3274 3273 3279 # CAM-CAP-CAM-HAT + 5248 7 3277 3271 3276 3275 # CTT-CAT-CAO-CAM + 5249 6 3276 3275 3274 3280 # CAO-CAM-CAP-HAT + 5250 4 3276 3271 3272 3278 # CAO-CAT-CAO-HAT + 5251 10 3277 3271 3272 3278 # CTT-CAT-CAO-HAT + 5252 10 3277 3271 3276 3282 # CTT-CAT-CAO-HAT + 5253 11 3278 3272 3273 3279 # HAT-CAO-CAM-HAT + 5254 12 3279 3273 3274 3280 # HAT-CAM-CAP-HAT + 5255 12 3281 3275 3274 3280 # HAT-CAM-CAP-HAT + 5256 11 3282 3276 3275 3281 # HAT-CAO-CAM-HAT + 5257 1 3286 3287 3288 3289 # CAT-CAO-CAM-CAP + 5258 2 3286 3287 3288 3294 # CAT-CAO-CAM-HAT + 5259 1 3286 3291 3290 3289 # CAT-CAO-CAM-CAP + 5260 2 3286 3291 3290 3296 # CAT-CAO-CAM-HAT + 5261 3 3287 3286 3291 3290 # CAO-CAT-CAO-CAM + 5262 4 3287 3286 3291 3297 # CAO-CAT-CAO-HAT + 5263 5 3287 3288 3289 3290 # CAO-CAM-CAP-CAM + 5264 6 3287 3288 3289 3295 # CAO-CAM-CAP-HAT + 5265 7 3292 3286 3287 3288 # CTT-CAT-CAO-CAM + 5266 3 3291 3286 3287 3288 # CAO-CAT-CAO-CAM + 5267 5 3291 3290 3289 3288 # CAO-CAM-CAP-CAM + 5268 8 3288 3289 3290 3296 # CAM-CAP-CAM-HAT + 5269 9 3289 3288 3287 3293 # CAP-CAM-CAO-HAT + 5270 9 3289 3290 3291 3297 # CAP-CAM-CAO-HAT + 5271 8 3290 3289 3288 3294 # CAM-CAP-CAM-HAT + 5272 7 3292 3286 3291 3290 # CTT-CAT-CAO-CAM + 5273 6 3291 3290 3289 3295 # CAO-CAM-CAP-HAT + 5274 4 3291 3286 3287 3293 # CAO-CAT-CAO-HAT + 5275 10 3292 3286 3287 3293 # CTT-CAT-CAO-HAT + 5276 10 3292 3286 3291 3297 # CTT-CAT-CAO-HAT + 5277 11 3293 3287 3288 3294 # HAT-CAO-CAM-HAT + 5278 12 3294 3288 3289 3295 # HAT-CAM-CAP-HAT + 5279 12 3296 3290 3289 3295 # HAT-CAM-CAP-HAT + 5280 11 3297 3291 3290 3296 # HAT-CAO-CAM-HAT + 5281 1 3301 3302 3303 3304 # CAT-CAO-CAM-CAP + 5282 2 3301 3302 3303 3309 # CAT-CAO-CAM-HAT + 5283 1 3301 3306 3305 3304 # CAT-CAO-CAM-CAP + 5284 2 3301 3306 3305 3311 # CAT-CAO-CAM-HAT + 5285 3 3302 3301 3306 3305 # CAO-CAT-CAO-CAM + 5286 4 3302 3301 3306 3312 # CAO-CAT-CAO-HAT + 5287 5 3302 3303 3304 3305 # CAO-CAM-CAP-CAM + 5288 6 3302 3303 3304 3310 # CAO-CAM-CAP-HAT + 5289 7 3307 3301 3302 3303 # CTT-CAT-CAO-CAM + 5290 3 3306 3301 3302 3303 # CAO-CAT-CAO-CAM + 5291 5 3306 3305 3304 3303 # CAO-CAM-CAP-CAM + 5292 8 3303 3304 3305 3311 # CAM-CAP-CAM-HAT + 5293 9 3304 3303 3302 3308 # CAP-CAM-CAO-HAT + 5294 9 3304 3305 3306 3312 # CAP-CAM-CAO-HAT + 5295 8 3305 3304 3303 3309 # CAM-CAP-CAM-HAT + 5296 7 3307 3301 3306 3305 # CTT-CAT-CAO-CAM + 5297 6 3306 3305 3304 3310 # CAO-CAM-CAP-HAT + 5298 4 3306 3301 3302 3308 # CAO-CAT-CAO-HAT + 5299 10 3307 3301 3302 3308 # CTT-CAT-CAO-HAT + 5300 10 3307 3301 3306 3312 # CTT-CAT-CAO-HAT + 5301 11 3308 3302 3303 3309 # HAT-CAO-CAM-HAT + 5302 12 3309 3303 3304 3310 # HAT-CAM-CAP-HAT + 5303 12 3311 3305 3304 3310 # HAT-CAM-CAP-HAT + 5304 11 3312 3306 3305 3311 # HAT-CAO-CAM-HAT + 5305 1 3316 3317 3318 3319 # CAT-CAO-CAM-CAP + 5306 2 3316 3317 3318 3324 # CAT-CAO-CAM-HAT + 5307 1 3316 3321 3320 3319 # CAT-CAO-CAM-CAP + 5308 2 3316 3321 3320 3326 # CAT-CAO-CAM-HAT + 5309 3 3317 3316 3321 3320 # CAO-CAT-CAO-CAM + 5310 4 3317 3316 3321 3327 # CAO-CAT-CAO-HAT + 5311 5 3317 3318 3319 3320 # CAO-CAM-CAP-CAM + 5312 6 3317 3318 3319 3325 # CAO-CAM-CAP-HAT + 5313 7 3322 3316 3317 3318 # CTT-CAT-CAO-CAM + 5314 3 3321 3316 3317 3318 # CAO-CAT-CAO-CAM + 5315 5 3321 3320 3319 3318 # CAO-CAM-CAP-CAM + 5316 8 3318 3319 3320 3326 # CAM-CAP-CAM-HAT + 5317 9 3319 3318 3317 3323 # CAP-CAM-CAO-HAT + 5318 9 3319 3320 3321 3327 # CAP-CAM-CAO-HAT + 5319 8 3320 3319 3318 3324 # CAM-CAP-CAM-HAT + 5320 7 3322 3316 3321 3320 # CTT-CAT-CAO-CAM + 5321 6 3321 3320 3319 3325 # CAO-CAM-CAP-HAT + 5322 4 3321 3316 3317 3323 # CAO-CAT-CAO-HAT + 5323 10 3322 3316 3317 3323 # CTT-CAT-CAO-HAT + 5324 10 3322 3316 3321 3327 # CTT-CAT-CAO-HAT + 5325 11 3323 3317 3318 3324 # HAT-CAO-CAM-HAT + 5326 12 3324 3318 3319 3325 # HAT-CAM-CAP-HAT + 5327 12 3326 3320 3319 3325 # HAT-CAM-CAP-HAT + 5328 11 3327 3321 3320 3326 # HAT-CAO-CAM-HAT + 5329 1 3331 3332 3333 3334 # CAT-CAO-CAM-CAP + 5330 2 3331 3332 3333 3339 # CAT-CAO-CAM-HAT + 5331 1 3331 3336 3335 3334 # CAT-CAO-CAM-CAP + 5332 2 3331 3336 3335 3341 # CAT-CAO-CAM-HAT + 5333 3 3332 3331 3336 3335 # CAO-CAT-CAO-CAM + 5334 4 3332 3331 3336 3342 # CAO-CAT-CAO-HAT + 5335 5 3332 3333 3334 3335 # CAO-CAM-CAP-CAM + 5336 6 3332 3333 3334 3340 # CAO-CAM-CAP-HAT + 5337 7 3337 3331 3332 3333 # CTT-CAT-CAO-CAM + 5338 3 3336 3331 3332 3333 # CAO-CAT-CAO-CAM + 5339 5 3336 3335 3334 3333 # CAO-CAM-CAP-CAM + 5340 8 3333 3334 3335 3341 # CAM-CAP-CAM-HAT + 5341 9 3334 3333 3332 3338 # CAP-CAM-CAO-HAT + 5342 9 3334 3335 3336 3342 # CAP-CAM-CAO-HAT + 5343 8 3335 3334 3333 3339 # CAM-CAP-CAM-HAT + 5344 7 3337 3331 3336 3335 # CTT-CAT-CAO-CAM + 5345 6 3336 3335 3334 3340 # CAO-CAM-CAP-HAT + 5346 4 3336 3331 3332 3338 # CAO-CAT-CAO-HAT + 5347 10 3337 3331 3332 3338 # CTT-CAT-CAO-HAT + 5348 10 3337 3331 3336 3342 # CTT-CAT-CAO-HAT + 5349 11 3338 3332 3333 3339 # HAT-CAO-CAM-HAT + 5350 12 3339 3333 3334 3340 # HAT-CAM-CAP-HAT + 5351 12 3341 3335 3334 3340 # HAT-CAM-CAP-HAT + 5352 11 3342 3336 3335 3341 # HAT-CAO-CAM-HAT + 5353 1 3346 3347 3348 3349 # CAT-CAO-CAM-CAP + 5354 2 3346 3347 3348 3354 # CAT-CAO-CAM-HAT + 5355 1 3346 3351 3350 3349 # CAT-CAO-CAM-CAP + 5356 2 3346 3351 3350 3356 # CAT-CAO-CAM-HAT + 5357 3 3347 3346 3351 3350 # CAO-CAT-CAO-CAM + 5358 4 3347 3346 3351 3357 # CAO-CAT-CAO-HAT + 5359 5 3347 3348 3349 3350 # CAO-CAM-CAP-CAM + 5360 6 3347 3348 3349 3355 # CAO-CAM-CAP-HAT + 5361 7 3352 3346 3347 3348 # CTT-CAT-CAO-CAM + 5362 3 3351 3346 3347 3348 # CAO-CAT-CAO-CAM + 5363 5 3351 3350 3349 3348 # CAO-CAM-CAP-CAM + 5364 8 3348 3349 3350 3356 # CAM-CAP-CAM-HAT + 5365 9 3349 3348 3347 3353 # CAP-CAM-CAO-HAT + 5366 9 3349 3350 3351 3357 # CAP-CAM-CAO-HAT + 5367 8 3350 3349 3348 3354 # CAM-CAP-CAM-HAT + 5368 7 3352 3346 3351 3350 # CTT-CAT-CAO-CAM + 5369 6 3351 3350 3349 3355 # CAO-CAM-CAP-HAT + 5370 4 3351 3346 3347 3353 # CAO-CAT-CAO-HAT + 5371 10 3352 3346 3347 3353 # CTT-CAT-CAO-HAT + 5372 10 3352 3346 3351 3357 # CTT-CAT-CAO-HAT + 5373 11 3353 3347 3348 3354 # HAT-CAO-CAM-HAT + 5374 12 3354 3348 3349 3355 # HAT-CAM-CAP-HAT + 5375 12 3356 3350 3349 3355 # HAT-CAM-CAP-HAT + 5376 11 3357 3351 3350 3356 # HAT-CAO-CAM-HAT + 5377 1 3361 3362 3363 3364 # CAT-CAO-CAM-CAP + 5378 2 3361 3362 3363 3369 # CAT-CAO-CAM-HAT + 5379 1 3361 3366 3365 3364 # CAT-CAO-CAM-CAP + 5380 2 3361 3366 3365 3371 # CAT-CAO-CAM-HAT + 5381 3 3362 3361 3366 3365 # CAO-CAT-CAO-CAM + 5382 4 3362 3361 3366 3372 # CAO-CAT-CAO-HAT + 5383 5 3362 3363 3364 3365 # CAO-CAM-CAP-CAM + 5384 6 3362 3363 3364 3370 # CAO-CAM-CAP-HAT + 5385 7 3367 3361 3362 3363 # CTT-CAT-CAO-CAM + 5386 3 3366 3361 3362 3363 # CAO-CAT-CAO-CAM + 5387 5 3366 3365 3364 3363 # CAO-CAM-CAP-CAM + 5388 8 3363 3364 3365 3371 # CAM-CAP-CAM-HAT + 5389 9 3364 3363 3362 3368 # CAP-CAM-CAO-HAT + 5390 9 3364 3365 3366 3372 # CAP-CAM-CAO-HAT + 5391 8 3365 3364 3363 3369 # CAM-CAP-CAM-HAT + 5392 7 3367 3361 3366 3365 # CTT-CAT-CAO-CAM + 5393 6 3366 3365 3364 3370 # CAO-CAM-CAP-HAT + 5394 4 3366 3361 3362 3368 # CAO-CAT-CAO-HAT + 5395 10 3367 3361 3362 3368 # CTT-CAT-CAO-HAT + 5396 10 3367 3361 3366 3372 # CTT-CAT-CAO-HAT + 5397 11 3368 3362 3363 3369 # HAT-CAO-CAM-HAT + 5398 12 3369 3363 3364 3370 # HAT-CAM-CAP-HAT + 5399 12 3371 3365 3364 3370 # HAT-CAM-CAP-HAT + 5400 11 3372 3366 3365 3371 # HAT-CAO-CAM-HAT + 5401 1 3376 3377 3378 3379 # CAT-CAO-CAM-CAP + 5402 2 3376 3377 3378 3384 # CAT-CAO-CAM-HAT + 5403 1 3376 3381 3380 3379 # CAT-CAO-CAM-CAP + 5404 2 3376 3381 3380 3386 # CAT-CAO-CAM-HAT + 5405 3 3377 3376 3381 3380 # CAO-CAT-CAO-CAM + 5406 4 3377 3376 3381 3387 # CAO-CAT-CAO-HAT + 5407 5 3377 3378 3379 3380 # CAO-CAM-CAP-CAM + 5408 6 3377 3378 3379 3385 # CAO-CAM-CAP-HAT + 5409 7 3382 3376 3377 3378 # CTT-CAT-CAO-CAM + 5410 3 3381 3376 3377 3378 # CAO-CAT-CAO-CAM + 5411 5 3381 3380 3379 3378 # CAO-CAM-CAP-CAM + 5412 8 3378 3379 3380 3386 # CAM-CAP-CAM-HAT + 5413 9 3379 3378 3377 3383 # CAP-CAM-CAO-HAT + 5414 9 3379 3380 3381 3387 # CAP-CAM-CAO-HAT + 5415 8 3380 3379 3378 3384 # CAM-CAP-CAM-HAT + 5416 7 3382 3376 3381 3380 # CTT-CAT-CAO-CAM + 5417 6 3381 3380 3379 3385 # CAO-CAM-CAP-HAT + 5418 4 3381 3376 3377 3383 # CAO-CAT-CAO-HAT + 5419 10 3382 3376 3377 3383 # CTT-CAT-CAO-HAT + 5420 10 3382 3376 3381 3387 # CTT-CAT-CAO-HAT + 5421 11 3383 3377 3378 3384 # HAT-CAO-CAM-HAT + 5422 12 3384 3378 3379 3385 # HAT-CAM-CAP-HAT + 5423 12 3386 3380 3379 3385 # HAT-CAM-CAP-HAT + 5424 11 3387 3381 3380 3386 # HAT-CAO-CAM-HAT + 5425 1 3391 3392 3393 3394 # CAT-CAO-CAM-CAP + 5426 2 3391 3392 3393 3399 # CAT-CAO-CAM-HAT + 5427 1 3391 3396 3395 3394 # CAT-CAO-CAM-CAP + 5428 2 3391 3396 3395 3401 # CAT-CAO-CAM-HAT + 5429 3 3392 3391 3396 3395 # CAO-CAT-CAO-CAM + 5430 4 3392 3391 3396 3402 # CAO-CAT-CAO-HAT + 5431 5 3392 3393 3394 3395 # CAO-CAM-CAP-CAM + 5432 6 3392 3393 3394 3400 # CAO-CAM-CAP-HAT + 5433 7 3397 3391 3392 3393 # CTT-CAT-CAO-CAM + 5434 3 3396 3391 3392 3393 # CAO-CAT-CAO-CAM + 5435 5 3396 3395 3394 3393 # CAO-CAM-CAP-CAM + 5436 8 3393 3394 3395 3401 # CAM-CAP-CAM-HAT + 5437 9 3394 3393 3392 3398 # CAP-CAM-CAO-HAT + 5438 9 3394 3395 3396 3402 # CAP-CAM-CAO-HAT + 5439 8 3395 3394 3393 3399 # CAM-CAP-CAM-HAT + 5440 7 3397 3391 3396 3395 # CTT-CAT-CAO-CAM + 5441 6 3396 3395 3394 3400 # CAO-CAM-CAP-HAT + 5442 4 3396 3391 3392 3398 # CAO-CAT-CAO-HAT + 5443 10 3397 3391 3392 3398 # CTT-CAT-CAO-HAT + 5444 10 3397 3391 3396 3402 # CTT-CAT-CAO-HAT + 5445 11 3398 3392 3393 3399 # HAT-CAO-CAM-HAT + 5446 12 3399 3393 3394 3400 # HAT-CAM-CAP-HAT + 5447 12 3401 3395 3394 3400 # HAT-CAM-CAP-HAT + 5448 11 3402 3396 3395 3401 # HAT-CAO-CAM-HAT + 5449 1 3406 3407 3408 3409 # CAT-CAO-CAM-CAP + 5450 2 3406 3407 3408 3414 # CAT-CAO-CAM-HAT + 5451 1 3406 3411 3410 3409 # CAT-CAO-CAM-CAP + 5452 2 3406 3411 3410 3416 # CAT-CAO-CAM-HAT + 5453 3 3407 3406 3411 3410 # CAO-CAT-CAO-CAM + 5454 4 3407 3406 3411 3417 # CAO-CAT-CAO-HAT + 5455 5 3407 3408 3409 3410 # CAO-CAM-CAP-CAM + 5456 6 3407 3408 3409 3415 # CAO-CAM-CAP-HAT + 5457 7 3412 3406 3407 3408 # CTT-CAT-CAO-CAM + 5458 3 3411 3406 3407 3408 # CAO-CAT-CAO-CAM + 5459 5 3411 3410 3409 3408 # CAO-CAM-CAP-CAM + 5460 8 3408 3409 3410 3416 # CAM-CAP-CAM-HAT + 5461 9 3409 3408 3407 3413 # CAP-CAM-CAO-HAT + 5462 9 3409 3410 3411 3417 # CAP-CAM-CAO-HAT + 5463 8 3410 3409 3408 3414 # CAM-CAP-CAM-HAT + 5464 7 3412 3406 3411 3410 # CTT-CAT-CAO-CAM + 5465 6 3411 3410 3409 3415 # CAO-CAM-CAP-HAT + 5466 4 3411 3406 3407 3413 # CAO-CAT-CAO-HAT + 5467 10 3412 3406 3407 3413 # CTT-CAT-CAO-HAT + 5468 10 3412 3406 3411 3417 # CTT-CAT-CAO-HAT + 5469 11 3413 3407 3408 3414 # HAT-CAO-CAM-HAT + 5470 12 3414 3408 3409 3415 # HAT-CAM-CAP-HAT + 5471 12 3416 3410 3409 3415 # HAT-CAM-CAP-HAT + 5472 11 3417 3411 3410 3416 # HAT-CAO-CAM-HAT + 5473 1 3421 3422 3423 3424 # CAT-CAO-CAM-CAP + 5474 2 3421 3422 3423 3429 # CAT-CAO-CAM-HAT + 5475 1 3421 3426 3425 3424 # CAT-CAO-CAM-CAP + 5476 2 3421 3426 3425 3431 # CAT-CAO-CAM-HAT + 5477 3 3422 3421 3426 3425 # CAO-CAT-CAO-CAM + 5478 4 3422 3421 3426 3432 # CAO-CAT-CAO-HAT + 5479 5 3422 3423 3424 3425 # CAO-CAM-CAP-CAM + 5480 6 3422 3423 3424 3430 # CAO-CAM-CAP-HAT + 5481 7 3427 3421 3422 3423 # CTT-CAT-CAO-CAM + 5482 3 3426 3421 3422 3423 # CAO-CAT-CAO-CAM + 5483 5 3426 3425 3424 3423 # CAO-CAM-CAP-CAM + 5484 8 3423 3424 3425 3431 # CAM-CAP-CAM-HAT + 5485 9 3424 3423 3422 3428 # CAP-CAM-CAO-HAT + 5486 9 3424 3425 3426 3432 # CAP-CAM-CAO-HAT + 5487 8 3425 3424 3423 3429 # CAM-CAP-CAM-HAT + 5488 7 3427 3421 3426 3425 # CTT-CAT-CAO-CAM + 5489 6 3426 3425 3424 3430 # CAO-CAM-CAP-HAT + 5490 4 3426 3421 3422 3428 # CAO-CAT-CAO-HAT + 5491 10 3427 3421 3422 3428 # CTT-CAT-CAO-HAT + 5492 10 3427 3421 3426 3432 # CTT-CAT-CAO-HAT + 5493 11 3428 3422 3423 3429 # HAT-CAO-CAM-HAT + 5494 12 3429 3423 3424 3430 # HAT-CAM-CAP-HAT + 5495 12 3431 3425 3424 3430 # HAT-CAM-CAP-HAT + 5496 11 3432 3426 3425 3431 # HAT-CAO-CAM-HAT + 5497 1 3436 3437 3438 3439 # CAT-CAO-CAM-CAP + 5498 2 3436 3437 3438 3444 # CAT-CAO-CAM-HAT + 5499 1 3436 3441 3440 3439 # CAT-CAO-CAM-CAP + 5500 2 3436 3441 3440 3446 # CAT-CAO-CAM-HAT + 5501 3 3437 3436 3441 3440 # CAO-CAT-CAO-CAM + 5502 4 3437 3436 3441 3447 # CAO-CAT-CAO-HAT + 5503 5 3437 3438 3439 3440 # CAO-CAM-CAP-CAM + 5504 6 3437 3438 3439 3445 # CAO-CAM-CAP-HAT + 5505 7 3442 3436 3437 3438 # CTT-CAT-CAO-CAM + 5506 3 3441 3436 3437 3438 # CAO-CAT-CAO-CAM + 5507 5 3441 3440 3439 3438 # CAO-CAM-CAP-CAM + 5508 8 3438 3439 3440 3446 # CAM-CAP-CAM-HAT + 5509 9 3439 3438 3437 3443 # CAP-CAM-CAO-HAT + 5510 9 3439 3440 3441 3447 # CAP-CAM-CAO-HAT + 5511 8 3440 3439 3438 3444 # CAM-CAP-CAM-HAT + 5512 7 3442 3436 3441 3440 # CTT-CAT-CAO-CAM + 5513 6 3441 3440 3439 3445 # CAO-CAM-CAP-HAT + 5514 4 3441 3436 3437 3443 # CAO-CAT-CAO-HAT + 5515 10 3442 3436 3437 3443 # CTT-CAT-CAO-HAT + 5516 10 3442 3436 3441 3447 # CTT-CAT-CAO-HAT + 5517 11 3443 3437 3438 3444 # HAT-CAO-CAM-HAT + 5518 12 3444 3438 3439 3445 # HAT-CAM-CAP-HAT + 5519 12 3446 3440 3439 3445 # HAT-CAM-CAP-HAT + 5520 11 3447 3441 3440 3446 # HAT-CAO-CAM-HAT + 5521 1 3451 3452 3453 3454 # CAT-CAO-CAM-CAP + 5522 2 3451 3452 3453 3459 # CAT-CAO-CAM-HAT + 5523 1 3451 3456 3455 3454 # CAT-CAO-CAM-CAP + 5524 2 3451 3456 3455 3461 # CAT-CAO-CAM-HAT + 5525 3 3452 3451 3456 3455 # CAO-CAT-CAO-CAM + 5526 4 3452 3451 3456 3462 # CAO-CAT-CAO-HAT + 5527 5 3452 3453 3454 3455 # CAO-CAM-CAP-CAM + 5528 6 3452 3453 3454 3460 # CAO-CAM-CAP-HAT + 5529 7 3457 3451 3452 3453 # CTT-CAT-CAO-CAM + 5530 3 3456 3451 3452 3453 # CAO-CAT-CAO-CAM + 5531 5 3456 3455 3454 3453 # CAO-CAM-CAP-CAM + 5532 8 3453 3454 3455 3461 # CAM-CAP-CAM-HAT + 5533 9 3454 3453 3452 3458 # CAP-CAM-CAO-HAT + 5534 9 3454 3455 3456 3462 # CAP-CAM-CAO-HAT + 5535 8 3455 3454 3453 3459 # CAM-CAP-CAM-HAT + 5536 7 3457 3451 3456 3455 # CTT-CAT-CAO-CAM + 5537 6 3456 3455 3454 3460 # CAO-CAM-CAP-HAT + 5538 4 3456 3451 3452 3458 # CAO-CAT-CAO-HAT + 5539 10 3457 3451 3452 3458 # CTT-CAT-CAO-HAT + 5540 10 3457 3451 3456 3462 # CTT-CAT-CAO-HAT + 5541 11 3458 3452 3453 3459 # HAT-CAO-CAM-HAT + 5542 12 3459 3453 3454 3460 # HAT-CAM-CAP-HAT + 5543 12 3461 3455 3454 3460 # HAT-CAM-CAP-HAT + 5544 11 3462 3456 3455 3461 # HAT-CAO-CAM-HAT + 5545 1 3466 3467 3468 3469 # CAT-CAO-CAM-CAP + 5546 2 3466 3467 3468 3474 # CAT-CAO-CAM-HAT + 5547 1 3466 3471 3470 3469 # CAT-CAO-CAM-CAP + 5548 2 3466 3471 3470 3476 # CAT-CAO-CAM-HAT + 5549 3 3467 3466 3471 3470 # CAO-CAT-CAO-CAM + 5550 4 3467 3466 3471 3477 # CAO-CAT-CAO-HAT + 5551 5 3467 3468 3469 3470 # CAO-CAM-CAP-CAM + 5552 6 3467 3468 3469 3475 # CAO-CAM-CAP-HAT + 5553 7 3472 3466 3467 3468 # CTT-CAT-CAO-CAM + 5554 3 3471 3466 3467 3468 # CAO-CAT-CAO-CAM + 5555 5 3471 3470 3469 3468 # CAO-CAM-CAP-CAM + 5556 8 3468 3469 3470 3476 # CAM-CAP-CAM-HAT + 5557 9 3469 3468 3467 3473 # CAP-CAM-CAO-HAT + 5558 9 3469 3470 3471 3477 # CAP-CAM-CAO-HAT + 5559 8 3470 3469 3468 3474 # CAM-CAP-CAM-HAT + 5560 7 3472 3466 3471 3470 # CTT-CAT-CAO-CAM + 5561 6 3471 3470 3469 3475 # CAO-CAM-CAP-HAT + 5562 4 3471 3466 3467 3473 # CAO-CAT-CAO-HAT + 5563 10 3472 3466 3467 3473 # CTT-CAT-CAO-HAT + 5564 10 3472 3466 3471 3477 # CTT-CAT-CAO-HAT + 5565 11 3473 3467 3468 3474 # HAT-CAO-CAM-HAT + 5566 12 3474 3468 3469 3475 # HAT-CAM-CAP-HAT + 5567 12 3476 3470 3469 3475 # HAT-CAM-CAP-HAT + 5568 11 3477 3471 3470 3476 # HAT-CAO-CAM-HAT + 5569 1 3481 3482 3483 3484 # CAT-CAO-CAM-CAP + 5570 2 3481 3482 3483 3489 # CAT-CAO-CAM-HAT + 5571 1 3481 3486 3485 3484 # CAT-CAO-CAM-CAP + 5572 2 3481 3486 3485 3491 # CAT-CAO-CAM-HAT + 5573 3 3482 3481 3486 3485 # CAO-CAT-CAO-CAM + 5574 4 3482 3481 3486 3492 # CAO-CAT-CAO-HAT + 5575 5 3482 3483 3484 3485 # CAO-CAM-CAP-CAM + 5576 6 3482 3483 3484 3490 # CAO-CAM-CAP-HAT + 5577 7 3487 3481 3482 3483 # CTT-CAT-CAO-CAM + 5578 3 3486 3481 3482 3483 # CAO-CAT-CAO-CAM + 5579 5 3486 3485 3484 3483 # CAO-CAM-CAP-CAM + 5580 8 3483 3484 3485 3491 # CAM-CAP-CAM-HAT + 5581 9 3484 3483 3482 3488 # CAP-CAM-CAO-HAT + 5582 9 3484 3485 3486 3492 # CAP-CAM-CAO-HAT + 5583 8 3485 3484 3483 3489 # CAM-CAP-CAM-HAT + 5584 7 3487 3481 3486 3485 # CTT-CAT-CAO-CAM + 5585 6 3486 3485 3484 3490 # CAO-CAM-CAP-HAT + 5586 4 3486 3481 3482 3488 # CAO-CAT-CAO-HAT + 5587 10 3487 3481 3482 3488 # CTT-CAT-CAO-HAT + 5588 10 3487 3481 3486 3492 # CTT-CAT-CAO-HAT + 5589 11 3488 3482 3483 3489 # HAT-CAO-CAM-HAT + 5590 12 3489 3483 3484 3490 # HAT-CAM-CAP-HAT + 5591 12 3491 3485 3484 3490 # HAT-CAM-CAP-HAT + 5592 11 3492 3486 3485 3491 # HAT-CAO-CAM-HAT + 5593 1 3496 3497 3498 3499 # CAT-CAO-CAM-CAP + 5594 2 3496 3497 3498 3504 # CAT-CAO-CAM-HAT + 5595 1 3496 3501 3500 3499 # CAT-CAO-CAM-CAP + 5596 2 3496 3501 3500 3506 # CAT-CAO-CAM-HAT + 5597 3 3497 3496 3501 3500 # CAO-CAT-CAO-CAM + 5598 4 3497 3496 3501 3507 # CAO-CAT-CAO-HAT + 5599 5 3497 3498 3499 3500 # CAO-CAM-CAP-CAM + 5600 6 3497 3498 3499 3505 # CAO-CAM-CAP-HAT + 5601 7 3502 3496 3497 3498 # CTT-CAT-CAO-CAM + 5602 3 3501 3496 3497 3498 # CAO-CAT-CAO-CAM + 5603 5 3501 3500 3499 3498 # CAO-CAM-CAP-CAM + 5604 8 3498 3499 3500 3506 # CAM-CAP-CAM-HAT + 5605 9 3499 3498 3497 3503 # CAP-CAM-CAO-HAT + 5606 9 3499 3500 3501 3507 # CAP-CAM-CAO-HAT + 5607 8 3500 3499 3498 3504 # CAM-CAP-CAM-HAT + 5608 7 3502 3496 3501 3500 # CTT-CAT-CAO-CAM + 5609 6 3501 3500 3499 3505 # CAO-CAM-CAP-HAT + 5610 4 3501 3496 3497 3503 # CAO-CAT-CAO-HAT + 5611 10 3502 3496 3497 3503 # CTT-CAT-CAO-HAT + 5612 10 3502 3496 3501 3507 # CTT-CAT-CAO-HAT + 5613 11 3503 3497 3498 3504 # HAT-CAO-CAM-HAT + 5614 12 3504 3498 3499 3505 # HAT-CAM-CAP-HAT + 5615 12 3506 3500 3499 3505 # HAT-CAM-CAP-HAT + 5616 11 3507 3501 3500 3506 # HAT-CAO-CAM-HAT + 5617 1 3511 3512 3513 3514 # CAT-CAO-CAM-CAP + 5618 2 3511 3512 3513 3519 # CAT-CAO-CAM-HAT + 5619 1 3511 3516 3515 3514 # CAT-CAO-CAM-CAP + 5620 2 3511 3516 3515 3521 # CAT-CAO-CAM-HAT + 5621 3 3512 3511 3516 3515 # CAO-CAT-CAO-CAM + 5622 4 3512 3511 3516 3522 # CAO-CAT-CAO-HAT + 5623 5 3512 3513 3514 3515 # CAO-CAM-CAP-CAM + 5624 6 3512 3513 3514 3520 # CAO-CAM-CAP-HAT + 5625 7 3517 3511 3512 3513 # CTT-CAT-CAO-CAM + 5626 3 3516 3511 3512 3513 # CAO-CAT-CAO-CAM + 5627 5 3516 3515 3514 3513 # CAO-CAM-CAP-CAM + 5628 8 3513 3514 3515 3521 # CAM-CAP-CAM-HAT + 5629 9 3514 3513 3512 3518 # CAP-CAM-CAO-HAT + 5630 9 3514 3515 3516 3522 # CAP-CAM-CAO-HAT + 5631 8 3515 3514 3513 3519 # CAM-CAP-CAM-HAT + 5632 7 3517 3511 3516 3515 # CTT-CAT-CAO-CAM + 5633 6 3516 3515 3514 3520 # CAO-CAM-CAP-HAT + 5634 4 3516 3511 3512 3518 # CAO-CAT-CAO-HAT + 5635 10 3517 3511 3512 3518 # CTT-CAT-CAO-HAT + 5636 10 3517 3511 3516 3522 # CTT-CAT-CAO-HAT + 5637 11 3518 3512 3513 3519 # HAT-CAO-CAM-HAT + 5638 12 3519 3513 3514 3520 # HAT-CAM-CAP-HAT + 5639 12 3521 3515 3514 3520 # HAT-CAM-CAP-HAT + 5640 11 3522 3516 3515 3521 # HAT-CAO-CAM-HAT + 5641 1 3526 3527 3528 3529 # CAT-CAO-CAM-CAP + 5642 2 3526 3527 3528 3534 # CAT-CAO-CAM-HAT + 5643 1 3526 3531 3530 3529 # CAT-CAO-CAM-CAP + 5644 2 3526 3531 3530 3536 # CAT-CAO-CAM-HAT + 5645 3 3527 3526 3531 3530 # CAO-CAT-CAO-CAM + 5646 4 3527 3526 3531 3537 # CAO-CAT-CAO-HAT + 5647 5 3527 3528 3529 3530 # CAO-CAM-CAP-CAM + 5648 6 3527 3528 3529 3535 # CAO-CAM-CAP-HAT + 5649 7 3532 3526 3527 3528 # CTT-CAT-CAO-CAM + 5650 3 3531 3526 3527 3528 # CAO-CAT-CAO-CAM + 5651 5 3531 3530 3529 3528 # CAO-CAM-CAP-CAM + 5652 8 3528 3529 3530 3536 # CAM-CAP-CAM-HAT + 5653 9 3529 3528 3527 3533 # CAP-CAM-CAO-HAT + 5654 9 3529 3530 3531 3537 # CAP-CAM-CAO-HAT + 5655 8 3530 3529 3528 3534 # CAM-CAP-CAM-HAT + 5656 7 3532 3526 3531 3530 # CTT-CAT-CAO-CAM + 5657 6 3531 3530 3529 3535 # CAO-CAM-CAP-HAT + 5658 4 3531 3526 3527 3533 # CAO-CAT-CAO-HAT + 5659 10 3532 3526 3527 3533 # CTT-CAT-CAO-HAT + 5660 10 3532 3526 3531 3537 # CTT-CAT-CAO-HAT + 5661 11 3533 3527 3528 3534 # HAT-CAO-CAM-HAT + 5662 12 3534 3528 3529 3535 # HAT-CAM-CAP-HAT + 5663 12 3536 3530 3529 3535 # HAT-CAM-CAP-HAT + 5664 11 3537 3531 3530 3536 # HAT-CAO-CAM-HAT + 5665 1 3541 3542 3543 3544 # CAT-CAO-CAM-CAP + 5666 2 3541 3542 3543 3549 # CAT-CAO-CAM-HAT + 5667 1 3541 3546 3545 3544 # CAT-CAO-CAM-CAP + 5668 2 3541 3546 3545 3551 # CAT-CAO-CAM-HAT + 5669 3 3542 3541 3546 3545 # CAO-CAT-CAO-CAM + 5670 4 3542 3541 3546 3552 # CAO-CAT-CAO-HAT + 5671 5 3542 3543 3544 3545 # CAO-CAM-CAP-CAM + 5672 6 3542 3543 3544 3550 # CAO-CAM-CAP-HAT + 5673 7 3547 3541 3542 3543 # CTT-CAT-CAO-CAM + 5674 3 3546 3541 3542 3543 # CAO-CAT-CAO-CAM + 5675 5 3546 3545 3544 3543 # CAO-CAM-CAP-CAM + 5676 8 3543 3544 3545 3551 # CAM-CAP-CAM-HAT + 5677 9 3544 3543 3542 3548 # CAP-CAM-CAO-HAT + 5678 9 3544 3545 3546 3552 # CAP-CAM-CAO-HAT + 5679 8 3545 3544 3543 3549 # CAM-CAP-CAM-HAT + 5680 7 3547 3541 3546 3545 # CTT-CAT-CAO-CAM + 5681 6 3546 3545 3544 3550 # CAO-CAM-CAP-HAT + 5682 4 3546 3541 3542 3548 # CAO-CAT-CAO-HAT + 5683 10 3547 3541 3542 3548 # CTT-CAT-CAO-HAT + 5684 10 3547 3541 3546 3552 # CTT-CAT-CAO-HAT + 5685 11 3548 3542 3543 3549 # HAT-CAO-CAM-HAT + 5686 12 3549 3543 3544 3550 # HAT-CAM-CAP-HAT + 5687 12 3551 3545 3544 3550 # HAT-CAM-CAP-HAT + 5688 11 3552 3546 3545 3551 # HAT-CAO-CAM-HAT + 5689 1 3556 3557 3558 3559 # CAT-CAO-CAM-CAP + 5690 2 3556 3557 3558 3564 # CAT-CAO-CAM-HAT + 5691 1 3556 3561 3560 3559 # CAT-CAO-CAM-CAP + 5692 2 3556 3561 3560 3566 # CAT-CAO-CAM-HAT + 5693 3 3557 3556 3561 3560 # CAO-CAT-CAO-CAM + 5694 4 3557 3556 3561 3567 # CAO-CAT-CAO-HAT + 5695 5 3557 3558 3559 3560 # CAO-CAM-CAP-CAM + 5696 6 3557 3558 3559 3565 # CAO-CAM-CAP-HAT + 5697 7 3562 3556 3557 3558 # CTT-CAT-CAO-CAM + 5698 3 3561 3556 3557 3558 # CAO-CAT-CAO-CAM + 5699 5 3561 3560 3559 3558 # CAO-CAM-CAP-CAM + 5700 8 3558 3559 3560 3566 # CAM-CAP-CAM-HAT + 5701 9 3559 3558 3557 3563 # CAP-CAM-CAO-HAT + 5702 9 3559 3560 3561 3567 # CAP-CAM-CAO-HAT + 5703 8 3560 3559 3558 3564 # CAM-CAP-CAM-HAT + 5704 7 3562 3556 3561 3560 # CTT-CAT-CAO-CAM + 5705 6 3561 3560 3559 3565 # CAO-CAM-CAP-HAT + 5706 4 3561 3556 3557 3563 # CAO-CAT-CAO-HAT + 5707 10 3562 3556 3557 3563 # CTT-CAT-CAO-HAT + 5708 10 3562 3556 3561 3567 # CTT-CAT-CAO-HAT + 5709 11 3563 3557 3558 3564 # HAT-CAO-CAM-HAT + 5710 12 3564 3558 3559 3565 # HAT-CAM-CAP-HAT + 5711 12 3566 3560 3559 3565 # HAT-CAM-CAP-HAT + 5712 11 3567 3561 3560 3566 # HAT-CAO-CAM-HAT + 5713 1 3571 3572 3573 3574 # CAT-CAO-CAM-CAP + 5714 2 3571 3572 3573 3579 # CAT-CAO-CAM-HAT + 5715 1 3571 3576 3575 3574 # CAT-CAO-CAM-CAP + 5716 2 3571 3576 3575 3581 # CAT-CAO-CAM-HAT + 5717 3 3572 3571 3576 3575 # CAO-CAT-CAO-CAM + 5718 4 3572 3571 3576 3582 # CAO-CAT-CAO-HAT + 5719 5 3572 3573 3574 3575 # CAO-CAM-CAP-CAM + 5720 6 3572 3573 3574 3580 # CAO-CAM-CAP-HAT + 5721 7 3577 3571 3572 3573 # CTT-CAT-CAO-CAM + 5722 3 3576 3571 3572 3573 # CAO-CAT-CAO-CAM + 5723 5 3576 3575 3574 3573 # CAO-CAM-CAP-CAM + 5724 8 3573 3574 3575 3581 # CAM-CAP-CAM-HAT + 5725 9 3574 3573 3572 3578 # CAP-CAM-CAO-HAT + 5726 9 3574 3575 3576 3582 # CAP-CAM-CAO-HAT + 5727 8 3575 3574 3573 3579 # CAM-CAP-CAM-HAT + 5728 7 3577 3571 3576 3575 # CTT-CAT-CAO-CAM + 5729 6 3576 3575 3574 3580 # CAO-CAM-CAP-HAT + 5730 4 3576 3571 3572 3578 # CAO-CAT-CAO-HAT + 5731 10 3577 3571 3572 3578 # CTT-CAT-CAO-HAT + 5732 10 3577 3571 3576 3582 # CTT-CAT-CAO-HAT + 5733 11 3578 3572 3573 3579 # HAT-CAO-CAM-HAT + 5734 12 3579 3573 3574 3580 # HAT-CAM-CAP-HAT + 5735 12 3581 3575 3574 3580 # HAT-CAM-CAP-HAT + 5736 11 3582 3576 3575 3581 # HAT-CAO-CAM-HAT + 5737 1 3586 3587 3588 3589 # CAT-CAO-CAM-CAP + 5738 2 3586 3587 3588 3594 # CAT-CAO-CAM-HAT + 5739 1 3586 3591 3590 3589 # CAT-CAO-CAM-CAP + 5740 2 3586 3591 3590 3596 # CAT-CAO-CAM-HAT + 5741 3 3587 3586 3591 3590 # CAO-CAT-CAO-CAM + 5742 4 3587 3586 3591 3597 # CAO-CAT-CAO-HAT + 5743 5 3587 3588 3589 3590 # CAO-CAM-CAP-CAM + 5744 6 3587 3588 3589 3595 # CAO-CAM-CAP-HAT + 5745 7 3592 3586 3587 3588 # CTT-CAT-CAO-CAM + 5746 3 3591 3586 3587 3588 # CAO-CAT-CAO-CAM + 5747 5 3591 3590 3589 3588 # CAO-CAM-CAP-CAM + 5748 8 3588 3589 3590 3596 # CAM-CAP-CAM-HAT + 5749 9 3589 3588 3587 3593 # CAP-CAM-CAO-HAT + 5750 9 3589 3590 3591 3597 # CAP-CAM-CAO-HAT + 5751 8 3590 3589 3588 3594 # CAM-CAP-CAM-HAT + 5752 7 3592 3586 3591 3590 # CTT-CAT-CAO-CAM + 5753 6 3591 3590 3589 3595 # CAO-CAM-CAP-HAT + 5754 4 3591 3586 3587 3593 # CAO-CAT-CAO-HAT + 5755 10 3592 3586 3587 3593 # CTT-CAT-CAO-HAT + 5756 10 3592 3586 3591 3597 # CTT-CAT-CAO-HAT + 5757 11 3593 3587 3588 3594 # HAT-CAO-CAM-HAT + 5758 12 3594 3588 3589 3595 # HAT-CAM-CAP-HAT + 5759 12 3596 3590 3589 3595 # HAT-CAM-CAP-HAT + 5760 11 3597 3591 3590 3596 # HAT-CAO-CAM-HAT + 5761 1 3601 3602 3603 3604 # CAT-CAO-CAM-CAP + 5762 2 3601 3602 3603 3609 # CAT-CAO-CAM-HAT + 5763 1 3601 3606 3605 3604 # CAT-CAO-CAM-CAP + 5764 2 3601 3606 3605 3611 # CAT-CAO-CAM-HAT + 5765 3 3602 3601 3606 3605 # CAO-CAT-CAO-CAM + 5766 4 3602 3601 3606 3612 # CAO-CAT-CAO-HAT + 5767 5 3602 3603 3604 3605 # CAO-CAM-CAP-CAM + 5768 6 3602 3603 3604 3610 # CAO-CAM-CAP-HAT + 5769 7 3607 3601 3602 3603 # CTT-CAT-CAO-CAM + 5770 3 3606 3601 3602 3603 # CAO-CAT-CAO-CAM + 5771 5 3606 3605 3604 3603 # CAO-CAM-CAP-CAM + 5772 8 3603 3604 3605 3611 # CAM-CAP-CAM-HAT + 5773 9 3604 3603 3602 3608 # CAP-CAM-CAO-HAT + 5774 9 3604 3605 3606 3612 # CAP-CAM-CAO-HAT + 5775 8 3605 3604 3603 3609 # CAM-CAP-CAM-HAT + 5776 7 3607 3601 3606 3605 # CTT-CAT-CAO-CAM + 5777 6 3606 3605 3604 3610 # CAO-CAM-CAP-HAT + 5778 4 3606 3601 3602 3608 # CAO-CAT-CAO-HAT + 5779 10 3607 3601 3602 3608 # CTT-CAT-CAO-HAT + 5780 10 3607 3601 3606 3612 # CTT-CAT-CAO-HAT + 5781 11 3608 3602 3603 3609 # HAT-CAO-CAM-HAT + 5782 12 3609 3603 3604 3610 # HAT-CAM-CAP-HAT + 5783 12 3611 3605 3604 3610 # HAT-CAM-CAP-HAT + 5784 11 3612 3606 3605 3611 # HAT-CAO-CAM-HAT + 5785 1 3616 3617 3618 3619 # CAT-CAO-CAM-CAP + 5786 2 3616 3617 3618 3624 # CAT-CAO-CAM-HAT + 5787 1 3616 3621 3620 3619 # CAT-CAO-CAM-CAP + 5788 2 3616 3621 3620 3626 # CAT-CAO-CAM-HAT + 5789 3 3617 3616 3621 3620 # CAO-CAT-CAO-CAM + 5790 4 3617 3616 3621 3627 # CAO-CAT-CAO-HAT + 5791 5 3617 3618 3619 3620 # CAO-CAM-CAP-CAM + 5792 6 3617 3618 3619 3625 # CAO-CAM-CAP-HAT + 5793 7 3622 3616 3617 3618 # CTT-CAT-CAO-CAM + 5794 3 3621 3616 3617 3618 # CAO-CAT-CAO-CAM + 5795 5 3621 3620 3619 3618 # CAO-CAM-CAP-CAM + 5796 8 3618 3619 3620 3626 # CAM-CAP-CAM-HAT + 5797 9 3619 3618 3617 3623 # CAP-CAM-CAO-HAT + 5798 9 3619 3620 3621 3627 # CAP-CAM-CAO-HAT + 5799 8 3620 3619 3618 3624 # CAM-CAP-CAM-HAT + 5800 7 3622 3616 3621 3620 # CTT-CAT-CAO-CAM + 5801 6 3621 3620 3619 3625 # CAO-CAM-CAP-HAT + 5802 4 3621 3616 3617 3623 # CAO-CAT-CAO-HAT + 5803 10 3622 3616 3617 3623 # CTT-CAT-CAO-HAT + 5804 10 3622 3616 3621 3627 # CTT-CAT-CAO-HAT + 5805 11 3623 3617 3618 3624 # HAT-CAO-CAM-HAT + 5806 12 3624 3618 3619 3625 # HAT-CAM-CAP-HAT + 5807 12 3626 3620 3619 3625 # HAT-CAM-CAP-HAT + 5808 11 3627 3621 3620 3626 # HAT-CAO-CAM-HAT + 5809 1 3631 3632 3633 3634 # CAT-CAO-CAM-CAP + 5810 2 3631 3632 3633 3639 # CAT-CAO-CAM-HAT + 5811 1 3631 3636 3635 3634 # CAT-CAO-CAM-CAP + 5812 2 3631 3636 3635 3641 # CAT-CAO-CAM-HAT + 5813 3 3632 3631 3636 3635 # CAO-CAT-CAO-CAM + 5814 4 3632 3631 3636 3642 # CAO-CAT-CAO-HAT + 5815 5 3632 3633 3634 3635 # CAO-CAM-CAP-CAM + 5816 6 3632 3633 3634 3640 # CAO-CAM-CAP-HAT + 5817 7 3637 3631 3632 3633 # CTT-CAT-CAO-CAM + 5818 3 3636 3631 3632 3633 # CAO-CAT-CAO-CAM + 5819 5 3636 3635 3634 3633 # CAO-CAM-CAP-CAM + 5820 8 3633 3634 3635 3641 # CAM-CAP-CAM-HAT + 5821 9 3634 3633 3632 3638 # CAP-CAM-CAO-HAT + 5822 9 3634 3635 3636 3642 # CAP-CAM-CAO-HAT + 5823 8 3635 3634 3633 3639 # CAM-CAP-CAM-HAT + 5824 7 3637 3631 3636 3635 # CTT-CAT-CAO-CAM + 5825 6 3636 3635 3634 3640 # CAO-CAM-CAP-HAT + 5826 4 3636 3631 3632 3638 # CAO-CAT-CAO-HAT + 5827 10 3637 3631 3632 3638 # CTT-CAT-CAO-HAT + 5828 10 3637 3631 3636 3642 # CTT-CAT-CAO-HAT + 5829 11 3638 3632 3633 3639 # HAT-CAO-CAM-HAT + 5830 12 3639 3633 3634 3640 # HAT-CAM-CAP-HAT + 5831 12 3641 3635 3634 3640 # HAT-CAM-CAP-HAT + 5832 11 3642 3636 3635 3641 # HAT-CAO-CAM-HAT + 5833 1 3646 3647 3648 3649 # CAT-CAO-CAM-CAP + 5834 2 3646 3647 3648 3654 # CAT-CAO-CAM-HAT + 5835 1 3646 3651 3650 3649 # CAT-CAO-CAM-CAP + 5836 2 3646 3651 3650 3656 # CAT-CAO-CAM-HAT + 5837 3 3647 3646 3651 3650 # CAO-CAT-CAO-CAM + 5838 4 3647 3646 3651 3657 # CAO-CAT-CAO-HAT + 5839 5 3647 3648 3649 3650 # CAO-CAM-CAP-CAM + 5840 6 3647 3648 3649 3655 # CAO-CAM-CAP-HAT + 5841 7 3652 3646 3647 3648 # CTT-CAT-CAO-CAM + 5842 3 3651 3646 3647 3648 # CAO-CAT-CAO-CAM + 5843 5 3651 3650 3649 3648 # CAO-CAM-CAP-CAM + 5844 8 3648 3649 3650 3656 # CAM-CAP-CAM-HAT + 5845 9 3649 3648 3647 3653 # CAP-CAM-CAO-HAT + 5846 9 3649 3650 3651 3657 # CAP-CAM-CAO-HAT + 5847 8 3650 3649 3648 3654 # CAM-CAP-CAM-HAT + 5848 7 3652 3646 3651 3650 # CTT-CAT-CAO-CAM + 5849 6 3651 3650 3649 3655 # CAO-CAM-CAP-HAT + 5850 4 3651 3646 3647 3653 # CAO-CAT-CAO-HAT + 5851 10 3652 3646 3647 3653 # CTT-CAT-CAO-HAT + 5852 10 3652 3646 3651 3657 # CTT-CAT-CAO-HAT + 5853 11 3653 3647 3648 3654 # HAT-CAO-CAM-HAT + 5854 12 3654 3648 3649 3655 # HAT-CAM-CAP-HAT + 5855 12 3656 3650 3649 3655 # HAT-CAM-CAP-HAT + 5856 11 3657 3651 3650 3656 # HAT-CAO-CAM-HAT + 5857 1 3661 3662 3663 3664 # CAT-CAO-CAM-CAP + 5858 2 3661 3662 3663 3669 # CAT-CAO-CAM-HAT + 5859 1 3661 3666 3665 3664 # CAT-CAO-CAM-CAP + 5860 2 3661 3666 3665 3671 # CAT-CAO-CAM-HAT + 5861 3 3662 3661 3666 3665 # CAO-CAT-CAO-CAM + 5862 4 3662 3661 3666 3672 # CAO-CAT-CAO-HAT + 5863 5 3662 3663 3664 3665 # CAO-CAM-CAP-CAM + 5864 6 3662 3663 3664 3670 # CAO-CAM-CAP-HAT + 5865 7 3667 3661 3662 3663 # CTT-CAT-CAO-CAM + 5866 3 3666 3661 3662 3663 # CAO-CAT-CAO-CAM + 5867 5 3666 3665 3664 3663 # CAO-CAM-CAP-CAM + 5868 8 3663 3664 3665 3671 # CAM-CAP-CAM-HAT + 5869 9 3664 3663 3662 3668 # CAP-CAM-CAO-HAT + 5870 9 3664 3665 3666 3672 # CAP-CAM-CAO-HAT + 5871 8 3665 3664 3663 3669 # CAM-CAP-CAM-HAT + 5872 7 3667 3661 3666 3665 # CTT-CAT-CAO-CAM + 5873 6 3666 3665 3664 3670 # CAO-CAM-CAP-HAT + 5874 4 3666 3661 3662 3668 # CAO-CAT-CAO-HAT + 5875 10 3667 3661 3662 3668 # CTT-CAT-CAO-HAT + 5876 10 3667 3661 3666 3672 # CTT-CAT-CAO-HAT + 5877 11 3668 3662 3663 3669 # HAT-CAO-CAM-HAT + 5878 12 3669 3663 3664 3670 # HAT-CAM-CAP-HAT + 5879 12 3671 3665 3664 3670 # HAT-CAM-CAP-HAT + 5880 11 3672 3666 3665 3671 # HAT-CAO-CAM-HAT + 5881 1 3676 3677 3678 3679 # CAT-CAO-CAM-CAP + 5882 2 3676 3677 3678 3684 # CAT-CAO-CAM-HAT + 5883 1 3676 3681 3680 3679 # CAT-CAO-CAM-CAP + 5884 2 3676 3681 3680 3686 # CAT-CAO-CAM-HAT + 5885 3 3677 3676 3681 3680 # CAO-CAT-CAO-CAM + 5886 4 3677 3676 3681 3687 # CAO-CAT-CAO-HAT + 5887 5 3677 3678 3679 3680 # CAO-CAM-CAP-CAM + 5888 6 3677 3678 3679 3685 # CAO-CAM-CAP-HAT + 5889 7 3682 3676 3677 3678 # CTT-CAT-CAO-CAM + 5890 3 3681 3676 3677 3678 # CAO-CAT-CAO-CAM + 5891 5 3681 3680 3679 3678 # CAO-CAM-CAP-CAM + 5892 8 3678 3679 3680 3686 # CAM-CAP-CAM-HAT + 5893 9 3679 3678 3677 3683 # CAP-CAM-CAO-HAT + 5894 9 3679 3680 3681 3687 # CAP-CAM-CAO-HAT + 5895 8 3680 3679 3678 3684 # CAM-CAP-CAM-HAT + 5896 7 3682 3676 3681 3680 # CTT-CAT-CAO-CAM + 5897 6 3681 3680 3679 3685 # CAO-CAM-CAP-HAT + 5898 4 3681 3676 3677 3683 # CAO-CAT-CAO-HAT + 5899 10 3682 3676 3677 3683 # CTT-CAT-CAO-HAT + 5900 10 3682 3676 3681 3687 # CTT-CAT-CAO-HAT + 5901 11 3683 3677 3678 3684 # HAT-CAO-CAM-HAT + 5902 12 3684 3678 3679 3685 # HAT-CAM-CAP-HAT + 5903 12 3686 3680 3679 3685 # HAT-CAM-CAP-HAT + 5904 11 3687 3681 3680 3686 # HAT-CAO-CAM-HAT + 5905 1 3691 3692 3693 3694 # CAT-CAO-CAM-CAP + 5906 2 3691 3692 3693 3699 # CAT-CAO-CAM-HAT + 5907 1 3691 3696 3695 3694 # CAT-CAO-CAM-CAP + 5908 2 3691 3696 3695 3701 # CAT-CAO-CAM-HAT + 5909 3 3692 3691 3696 3695 # CAO-CAT-CAO-CAM + 5910 4 3692 3691 3696 3702 # CAO-CAT-CAO-HAT + 5911 5 3692 3693 3694 3695 # CAO-CAM-CAP-CAM + 5912 6 3692 3693 3694 3700 # CAO-CAM-CAP-HAT + 5913 7 3697 3691 3692 3693 # CTT-CAT-CAO-CAM + 5914 3 3696 3691 3692 3693 # CAO-CAT-CAO-CAM + 5915 5 3696 3695 3694 3693 # CAO-CAM-CAP-CAM + 5916 8 3693 3694 3695 3701 # CAM-CAP-CAM-HAT + 5917 9 3694 3693 3692 3698 # CAP-CAM-CAO-HAT + 5918 9 3694 3695 3696 3702 # CAP-CAM-CAO-HAT + 5919 8 3695 3694 3693 3699 # CAM-CAP-CAM-HAT + 5920 7 3697 3691 3696 3695 # CTT-CAT-CAO-CAM + 5921 6 3696 3695 3694 3700 # CAO-CAM-CAP-HAT + 5922 4 3696 3691 3692 3698 # CAO-CAT-CAO-HAT + 5923 10 3697 3691 3692 3698 # CTT-CAT-CAO-HAT + 5924 10 3697 3691 3696 3702 # CTT-CAT-CAO-HAT + 5925 11 3698 3692 3693 3699 # HAT-CAO-CAM-HAT + 5926 12 3699 3693 3694 3700 # HAT-CAM-CAP-HAT + 5927 12 3701 3695 3694 3700 # HAT-CAM-CAP-HAT + 5928 11 3702 3696 3695 3701 # HAT-CAO-CAM-HAT + 5929 1 3706 3707 3708 3709 # CAT-CAO-CAM-CAP + 5930 2 3706 3707 3708 3714 # CAT-CAO-CAM-HAT + 5931 1 3706 3711 3710 3709 # CAT-CAO-CAM-CAP + 5932 2 3706 3711 3710 3716 # CAT-CAO-CAM-HAT + 5933 3 3707 3706 3711 3710 # CAO-CAT-CAO-CAM + 5934 4 3707 3706 3711 3717 # CAO-CAT-CAO-HAT + 5935 5 3707 3708 3709 3710 # CAO-CAM-CAP-CAM + 5936 6 3707 3708 3709 3715 # CAO-CAM-CAP-HAT + 5937 7 3712 3706 3707 3708 # CTT-CAT-CAO-CAM + 5938 3 3711 3706 3707 3708 # CAO-CAT-CAO-CAM + 5939 5 3711 3710 3709 3708 # CAO-CAM-CAP-CAM + 5940 8 3708 3709 3710 3716 # CAM-CAP-CAM-HAT + 5941 9 3709 3708 3707 3713 # CAP-CAM-CAO-HAT + 5942 9 3709 3710 3711 3717 # CAP-CAM-CAO-HAT + 5943 8 3710 3709 3708 3714 # CAM-CAP-CAM-HAT + 5944 7 3712 3706 3711 3710 # CTT-CAT-CAO-CAM + 5945 6 3711 3710 3709 3715 # CAO-CAM-CAP-HAT + 5946 4 3711 3706 3707 3713 # CAO-CAT-CAO-HAT + 5947 10 3712 3706 3707 3713 # CTT-CAT-CAO-HAT + 5948 10 3712 3706 3711 3717 # CTT-CAT-CAO-HAT + 5949 11 3713 3707 3708 3714 # HAT-CAO-CAM-HAT + 5950 12 3714 3708 3709 3715 # HAT-CAM-CAP-HAT + 5951 12 3716 3710 3709 3715 # HAT-CAM-CAP-HAT + 5952 11 3717 3711 3710 3716 # HAT-CAO-CAM-HAT + 5953 1 3721 3722 3723 3724 # CAT-CAO-CAM-CAP + 5954 2 3721 3722 3723 3729 # CAT-CAO-CAM-HAT + 5955 1 3721 3726 3725 3724 # CAT-CAO-CAM-CAP + 5956 2 3721 3726 3725 3731 # CAT-CAO-CAM-HAT + 5957 3 3722 3721 3726 3725 # CAO-CAT-CAO-CAM + 5958 4 3722 3721 3726 3732 # CAO-CAT-CAO-HAT + 5959 5 3722 3723 3724 3725 # CAO-CAM-CAP-CAM + 5960 6 3722 3723 3724 3730 # CAO-CAM-CAP-HAT + 5961 7 3727 3721 3722 3723 # CTT-CAT-CAO-CAM + 5962 3 3726 3721 3722 3723 # CAO-CAT-CAO-CAM + 5963 5 3726 3725 3724 3723 # CAO-CAM-CAP-CAM + 5964 8 3723 3724 3725 3731 # CAM-CAP-CAM-HAT + 5965 9 3724 3723 3722 3728 # CAP-CAM-CAO-HAT + 5966 9 3724 3725 3726 3732 # CAP-CAM-CAO-HAT + 5967 8 3725 3724 3723 3729 # CAM-CAP-CAM-HAT + 5968 7 3727 3721 3726 3725 # CTT-CAT-CAO-CAM + 5969 6 3726 3725 3724 3730 # CAO-CAM-CAP-HAT + 5970 4 3726 3721 3722 3728 # CAO-CAT-CAO-HAT + 5971 10 3727 3721 3722 3728 # CTT-CAT-CAO-HAT + 5972 10 3727 3721 3726 3732 # CTT-CAT-CAO-HAT + 5973 11 3728 3722 3723 3729 # HAT-CAO-CAM-HAT + 5974 12 3729 3723 3724 3730 # HAT-CAM-CAP-HAT + 5975 12 3731 3725 3724 3730 # HAT-CAM-CAP-HAT + 5976 11 3732 3726 3725 3731 # HAT-CAO-CAM-HAT + 5977 1 3736 3737 3738 3739 # CAT-CAO-CAM-CAP + 5978 2 3736 3737 3738 3744 # CAT-CAO-CAM-HAT + 5979 1 3736 3741 3740 3739 # CAT-CAO-CAM-CAP + 5980 2 3736 3741 3740 3746 # CAT-CAO-CAM-HAT + 5981 3 3737 3736 3741 3740 # CAO-CAT-CAO-CAM + 5982 4 3737 3736 3741 3747 # CAO-CAT-CAO-HAT + 5983 5 3737 3738 3739 3740 # CAO-CAM-CAP-CAM + 5984 6 3737 3738 3739 3745 # CAO-CAM-CAP-HAT + 5985 7 3742 3736 3737 3738 # CTT-CAT-CAO-CAM + 5986 3 3741 3736 3737 3738 # CAO-CAT-CAO-CAM + 5987 5 3741 3740 3739 3738 # CAO-CAM-CAP-CAM + 5988 8 3738 3739 3740 3746 # CAM-CAP-CAM-HAT + 5989 9 3739 3738 3737 3743 # CAP-CAM-CAO-HAT + 5990 9 3739 3740 3741 3747 # CAP-CAM-CAO-HAT + 5991 8 3740 3739 3738 3744 # CAM-CAP-CAM-HAT + 5992 7 3742 3736 3741 3740 # CTT-CAT-CAO-CAM + 5993 6 3741 3740 3739 3745 # CAO-CAM-CAP-HAT + 5994 4 3741 3736 3737 3743 # CAO-CAT-CAO-HAT + 5995 10 3742 3736 3737 3743 # CTT-CAT-CAO-HAT + 5996 10 3742 3736 3741 3747 # CTT-CAT-CAO-HAT + 5997 11 3743 3737 3738 3744 # HAT-CAO-CAM-HAT + 5998 12 3744 3738 3739 3745 # HAT-CAM-CAP-HAT + 5999 12 3746 3740 3739 3745 # HAT-CAM-CAP-HAT + 6000 11 3747 3741 3740 3746 # HAT-CAO-CAM-HAT + +Impropers + + 1 1 2 6 1 7 # CAO-CAO-CAT-CTT + 2 2 1 3 2 8 # CAT-CAM-CAO-HAT + 3 3 2 4 3 9 # CAO-CAP-CAM-HAT + 4 4 3 5 4 10 # CAM-CAM-CAP-HAT + 5 3 6 4 5 11 # CAO-CAP-CAM-HAT + 6 2 1 5 6 12 # CAT-CAM-CAO-HAT + 7 1 17 21 16 22 # CAO-CAO-CAT-CTT + 8 2 16 18 17 23 # CAT-CAM-CAO-HAT + 9 3 17 19 18 24 # CAO-CAP-CAM-HAT + 10 4 18 20 19 25 # CAM-CAM-CAP-HAT + 11 3 21 19 20 26 # CAO-CAP-CAM-HAT + 12 2 16 20 21 27 # CAT-CAM-CAO-HAT + 13 1 32 36 31 37 # CAO-CAO-CAT-CTT + 14 2 31 33 32 38 # CAT-CAM-CAO-HAT + 15 3 32 34 33 39 # CAO-CAP-CAM-HAT + 16 4 33 35 34 40 # CAM-CAM-CAP-HAT + 17 3 36 34 35 41 # CAO-CAP-CAM-HAT + 18 2 31 35 36 42 # CAT-CAM-CAO-HAT + 19 1 47 51 46 52 # CAO-CAO-CAT-CTT + 20 2 46 48 47 53 # CAT-CAM-CAO-HAT + 21 3 47 49 48 54 # CAO-CAP-CAM-HAT + 22 4 48 50 49 55 # CAM-CAM-CAP-HAT + 23 3 51 49 50 56 # CAO-CAP-CAM-HAT + 24 2 46 50 51 57 # CAT-CAM-CAO-HAT + 25 1 62 66 61 67 # CAO-CAO-CAT-CTT + 26 2 61 63 62 68 # CAT-CAM-CAO-HAT + 27 3 62 64 63 69 # CAO-CAP-CAM-HAT + 28 4 63 65 64 70 # CAM-CAM-CAP-HAT + 29 3 66 64 65 71 # CAO-CAP-CAM-HAT + 30 2 61 65 66 72 # CAT-CAM-CAO-HAT + 31 1 77 81 76 82 # CAO-CAO-CAT-CTT + 32 2 76 78 77 83 # CAT-CAM-CAO-HAT + 33 3 77 79 78 84 # CAO-CAP-CAM-HAT + 34 4 78 80 79 85 # CAM-CAM-CAP-HAT + 35 3 81 79 80 86 # CAO-CAP-CAM-HAT + 36 2 76 80 81 87 # CAT-CAM-CAO-HAT + 37 1 92 96 91 97 # CAO-CAO-CAT-CTT + 38 2 91 93 92 98 # CAT-CAM-CAO-HAT + 39 3 92 94 93 99 # CAO-CAP-CAM-HAT + 40 4 93 95 94 100 # CAM-CAM-CAP-HAT + 41 3 96 94 95 101 # CAO-CAP-CAM-HAT + 42 2 91 95 96 102 # CAT-CAM-CAO-HAT + 43 1 107 111 106 112 # CAO-CAO-CAT-CTT + 44 2 106 108 107 113 # CAT-CAM-CAO-HAT + 45 3 107 109 108 114 # CAO-CAP-CAM-HAT + 46 4 108 110 109 115 # CAM-CAM-CAP-HAT + 47 3 111 109 110 116 # CAO-CAP-CAM-HAT + 48 2 106 110 111 117 # CAT-CAM-CAO-HAT + 49 1 122 126 121 127 # CAO-CAO-CAT-CTT + 50 2 121 123 122 128 # CAT-CAM-CAO-HAT + 51 3 122 124 123 129 # CAO-CAP-CAM-HAT + 52 4 123 125 124 130 # CAM-CAM-CAP-HAT + 53 3 126 124 125 131 # CAO-CAP-CAM-HAT + 54 2 121 125 126 132 # CAT-CAM-CAO-HAT + 55 1 137 141 136 142 # CAO-CAO-CAT-CTT + 56 2 136 138 137 143 # CAT-CAM-CAO-HAT + 57 3 137 139 138 144 # CAO-CAP-CAM-HAT + 58 4 138 140 139 145 # CAM-CAM-CAP-HAT + 59 3 141 139 140 146 # CAO-CAP-CAM-HAT + 60 2 136 140 141 147 # CAT-CAM-CAO-HAT + 61 1 152 156 151 157 # CAO-CAO-CAT-CTT + 62 2 151 153 152 158 # CAT-CAM-CAO-HAT + 63 3 152 154 153 159 # CAO-CAP-CAM-HAT + 64 4 153 155 154 160 # CAM-CAM-CAP-HAT + 65 3 156 154 155 161 # CAO-CAP-CAM-HAT + 66 2 151 155 156 162 # CAT-CAM-CAO-HAT + 67 1 167 171 166 172 # CAO-CAO-CAT-CTT + 68 2 166 168 167 173 # CAT-CAM-CAO-HAT + 69 3 167 169 168 174 # CAO-CAP-CAM-HAT + 70 4 168 170 169 175 # CAM-CAM-CAP-HAT + 71 3 171 169 170 176 # CAO-CAP-CAM-HAT + 72 2 166 170 171 177 # CAT-CAM-CAO-HAT + 73 1 182 186 181 187 # CAO-CAO-CAT-CTT + 74 2 181 183 182 188 # CAT-CAM-CAO-HAT + 75 3 182 184 183 189 # CAO-CAP-CAM-HAT + 76 4 183 185 184 190 # CAM-CAM-CAP-HAT + 77 3 186 184 185 191 # CAO-CAP-CAM-HAT + 78 2 181 185 186 192 # CAT-CAM-CAO-HAT + 79 1 197 201 196 202 # CAO-CAO-CAT-CTT + 80 2 196 198 197 203 # CAT-CAM-CAO-HAT + 81 3 197 199 198 204 # CAO-CAP-CAM-HAT + 82 4 198 200 199 205 # CAM-CAM-CAP-HAT + 83 3 201 199 200 206 # CAO-CAP-CAM-HAT + 84 2 196 200 201 207 # CAT-CAM-CAO-HAT + 85 1 212 216 211 217 # CAO-CAO-CAT-CTT + 86 2 211 213 212 218 # CAT-CAM-CAO-HAT + 87 3 212 214 213 219 # CAO-CAP-CAM-HAT + 88 4 213 215 214 220 # CAM-CAM-CAP-HAT + 89 3 216 214 215 221 # CAO-CAP-CAM-HAT + 90 2 211 215 216 222 # CAT-CAM-CAO-HAT + 91 1 227 231 226 232 # CAO-CAO-CAT-CTT + 92 2 226 228 227 233 # CAT-CAM-CAO-HAT + 93 3 227 229 228 234 # CAO-CAP-CAM-HAT + 94 4 228 230 229 235 # CAM-CAM-CAP-HAT + 95 3 231 229 230 236 # CAO-CAP-CAM-HAT + 96 2 226 230 231 237 # CAT-CAM-CAO-HAT + 97 1 242 246 241 247 # CAO-CAO-CAT-CTT + 98 2 241 243 242 248 # CAT-CAM-CAO-HAT + 99 3 242 244 243 249 # CAO-CAP-CAM-HAT + 100 4 243 245 244 250 # CAM-CAM-CAP-HAT + 101 3 246 244 245 251 # CAO-CAP-CAM-HAT + 102 2 241 245 246 252 # CAT-CAM-CAO-HAT + 103 1 257 261 256 262 # CAO-CAO-CAT-CTT + 104 2 256 258 257 263 # CAT-CAM-CAO-HAT + 105 3 257 259 258 264 # CAO-CAP-CAM-HAT + 106 4 258 260 259 265 # CAM-CAM-CAP-HAT + 107 3 261 259 260 266 # CAO-CAP-CAM-HAT + 108 2 256 260 261 267 # CAT-CAM-CAO-HAT + 109 1 272 276 271 277 # CAO-CAO-CAT-CTT + 110 2 271 273 272 278 # CAT-CAM-CAO-HAT + 111 3 272 274 273 279 # CAO-CAP-CAM-HAT + 112 4 273 275 274 280 # CAM-CAM-CAP-HAT + 113 3 276 274 275 281 # CAO-CAP-CAM-HAT + 114 2 271 275 276 282 # CAT-CAM-CAO-HAT + 115 1 287 291 286 292 # CAO-CAO-CAT-CTT + 116 2 286 288 287 293 # CAT-CAM-CAO-HAT + 117 3 287 289 288 294 # CAO-CAP-CAM-HAT + 118 4 288 290 289 295 # CAM-CAM-CAP-HAT + 119 3 291 289 290 296 # CAO-CAP-CAM-HAT + 120 2 286 290 291 297 # CAT-CAM-CAO-HAT + 121 1 302 306 301 307 # CAO-CAO-CAT-CTT + 122 2 301 303 302 308 # CAT-CAM-CAO-HAT + 123 3 302 304 303 309 # CAO-CAP-CAM-HAT + 124 4 303 305 304 310 # CAM-CAM-CAP-HAT + 125 3 306 304 305 311 # CAO-CAP-CAM-HAT + 126 2 301 305 306 312 # CAT-CAM-CAO-HAT + 127 1 317 321 316 322 # CAO-CAO-CAT-CTT + 128 2 316 318 317 323 # CAT-CAM-CAO-HAT + 129 3 317 319 318 324 # CAO-CAP-CAM-HAT + 130 4 318 320 319 325 # CAM-CAM-CAP-HAT + 131 3 321 319 320 326 # CAO-CAP-CAM-HAT + 132 2 316 320 321 327 # CAT-CAM-CAO-HAT + 133 1 332 336 331 337 # CAO-CAO-CAT-CTT + 134 2 331 333 332 338 # CAT-CAM-CAO-HAT + 135 3 332 334 333 339 # CAO-CAP-CAM-HAT + 136 4 333 335 334 340 # CAM-CAM-CAP-HAT + 137 3 336 334 335 341 # CAO-CAP-CAM-HAT + 138 2 331 335 336 342 # CAT-CAM-CAO-HAT + 139 1 347 351 346 352 # CAO-CAO-CAT-CTT + 140 2 346 348 347 353 # CAT-CAM-CAO-HAT + 141 3 347 349 348 354 # CAO-CAP-CAM-HAT + 142 4 348 350 349 355 # CAM-CAM-CAP-HAT + 143 3 351 349 350 356 # CAO-CAP-CAM-HAT + 144 2 346 350 351 357 # CAT-CAM-CAO-HAT + 145 1 362 366 361 367 # CAO-CAO-CAT-CTT + 146 2 361 363 362 368 # CAT-CAM-CAO-HAT + 147 3 362 364 363 369 # CAO-CAP-CAM-HAT + 148 4 363 365 364 370 # CAM-CAM-CAP-HAT + 149 3 366 364 365 371 # CAO-CAP-CAM-HAT + 150 2 361 365 366 372 # CAT-CAM-CAO-HAT + 151 1 377 381 376 382 # CAO-CAO-CAT-CTT + 152 2 376 378 377 383 # CAT-CAM-CAO-HAT + 153 3 377 379 378 384 # CAO-CAP-CAM-HAT + 154 4 378 380 379 385 # CAM-CAM-CAP-HAT + 155 3 381 379 380 386 # CAO-CAP-CAM-HAT + 156 2 376 380 381 387 # CAT-CAM-CAO-HAT + 157 1 392 396 391 397 # CAO-CAO-CAT-CTT + 158 2 391 393 392 398 # CAT-CAM-CAO-HAT + 159 3 392 394 393 399 # CAO-CAP-CAM-HAT + 160 4 393 395 394 400 # CAM-CAM-CAP-HAT + 161 3 396 394 395 401 # CAO-CAP-CAM-HAT + 162 2 391 395 396 402 # CAT-CAM-CAO-HAT + 163 1 407 411 406 412 # CAO-CAO-CAT-CTT + 164 2 406 408 407 413 # CAT-CAM-CAO-HAT + 165 3 407 409 408 414 # CAO-CAP-CAM-HAT + 166 4 408 410 409 415 # CAM-CAM-CAP-HAT + 167 3 411 409 410 416 # CAO-CAP-CAM-HAT + 168 2 406 410 411 417 # CAT-CAM-CAO-HAT + 169 1 422 426 421 427 # CAO-CAO-CAT-CTT + 170 2 421 423 422 428 # CAT-CAM-CAO-HAT + 171 3 422 424 423 429 # CAO-CAP-CAM-HAT + 172 4 423 425 424 430 # CAM-CAM-CAP-HAT + 173 3 426 424 425 431 # CAO-CAP-CAM-HAT + 174 2 421 425 426 432 # CAT-CAM-CAO-HAT + 175 1 437 441 436 442 # CAO-CAO-CAT-CTT + 176 2 436 438 437 443 # CAT-CAM-CAO-HAT + 177 3 437 439 438 444 # CAO-CAP-CAM-HAT + 178 4 438 440 439 445 # CAM-CAM-CAP-HAT + 179 3 441 439 440 446 # CAO-CAP-CAM-HAT + 180 2 436 440 441 447 # CAT-CAM-CAO-HAT + 181 1 452 456 451 457 # CAO-CAO-CAT-CTT + 182 2 451 453 452 458 # CAT-CAM-CAO-HAT + 183 3 452 454 453 459 # CAO-CAP-CAM-HAT + 184 4 453 455 454 460 # CAM-CAM-CAP-HAT + 185 3 456 454 455 461 # CAO-CAP-CAM-HAT + 186 2 451 455 456 462 # CAT-CAM-CAO-HAT + 187 1 467 471 466 472 # CAO-CAO-CAT-CTT + 188 2 466 468 467 473 # CAT-CAM-CAO-HAT + 189 3 467 469 468 474 # CAO-CAP-CAM-HAT + 190 4 468 470 469 475 # CAM-CAM-CAP-HAT + 191 3 471 469 470 476 # CAO-CAP-CAM-HAT + 192 2 466 470 471 477 # CAT-CAM-CAO-HAT + 193 1 482 486 481 487 # CAO-CAO-CAT-CTT + 194 2 481 483 482 488 # CAT-CAM-CAO-HAT + 195 3 482 484 483 489 # CAO-CAP-CAM-HAT + 196 4 483 485 484 490 # CAM-CAM-CAP-HAT + 197 3 486 484 485 491 # CAO-CAP-CAM-HAT + 198 2 481 485 486 492 # CAT-CAM-CAO-HAT + 199 1 497 501 496 502 # CAO-CAO-CAT-CTT + 200 2 496 498 497 503 # CAT-CAM-CAO-HAT + 201 3 497 499 498 504 # CAO-CAP-CAM-HAT + 202 4 498 500 499 505 # CAM-CAM-CAP-HAT + 203 3 501 499 500 506 # CAO-CAP-CAM-HAT + 204 2 496 500 501 507 # CAT-CAM-CAO-HAT + 205 1 512 516 511 517 # CAO-CAO-CAT-CTT + 206 2 511 513 512 518 # CAT-CAM-CAO-HAT + 207 3 512 514 513 519 # CAO-CAP-CAM-HAT + 208 4 513 515 514 520 # CAM-CAM-CAP-HAT + 209 3 516 514 515 521 # CAO-CAP-CAM-HAT + 210 2 511 515 516 522 # CAT-CAM-CAO-HAT + 211 1 527 531 526 532 # CAO-CAO-CAT-CTT + 212 2 526 528 527 533 # CAT-CAM-CAO-HAT + 213 3 527 529 528 534 # CAO-CAP-CAM-HAT + 214 4 528 530 529 535 # CAM-CAM-CAP-HAT + 215 3 531 529 530 536 # CAO-CAP-CAM-HAT + 216 2 526 530 531 537 # CAT-CAM-CAO-HAT + 217 1 542 546 541 547 # CAO-CAO-CAT-CTT + 218 2 541 543 542 548 # CAT-CAM-CAO-HAT + 219 3 542 544 543 549 # CAO-CAP-CAM-HAT + 220 4 543 545 544 550 # CAM-CAM-CAP-HAT + 221 3 546 544 545 551 # CAO-CAP-CAM-HAT + 222 2 541 545 546 552 # CAT-CAM-CAO-HAT + 223 1 557 561 556 562 # CAO-CAO-CAT-CTT + 224 2 556 558 557 563 # CAT-CAM-CAO-HAT + 225 3 557 559 558 564 # CAO-CAP-CAM-HAT + 226 4 558 560 559 565 # CAM-CAM-CAP-HAT + 227 3 561 559 560 566 # CAO-CAP-CAM-HAT + 228 2 556 560 561 567 # CAT-CAM-CAO-HAT + 229 1 572 576 571 577 # CAO-CAO-CAT-CTT + 230 2 571 573 572 578 # CAT-CAM-CAO-HAT + 231 3 572 574 573 579 # CAO-CAP-CAM-HAT + 232 4 573 575 574 580 # CAM-CAM-CAP-HAT + 233 3 576 574 575 581 # CAO-CAP-CAM-HAT + 234 2 571 575 576 582 # CAT-CAM-CAO-HAT + 235 1 587 591 586 592 # CAO-CAO-CAT-CTT + 236 2 586 588 587 593 # CAT-CAM-CAO-HAT + 237 3 587 589 588 594 # CAO-CAP-CAM-HAT + 238 4 588 590 589 595 # CAM-CAM-CAP-HAT + 239 3 591 589 590 596 # CAO-CAP-CAM-HAT + 240 2 586 590 591 597 # CAT-CAM-CAO-HAT + 241 1 602 606 601 607 # CAO-CAO-CAT-CTT + 242 2 601 603 602 608 # CAT-CAM-CAO-HAT + 243 3 602 604 603 609 # CAO-CAP-CAM-HAT + 244 4 603 605 604 610 # CAM-CAM-CAP-HAT + 245 3 606 604 605 611 # CAO-CAP-CAM-HAT + 246 2 601 605 606 612 # CAT-CAM-CAO-HAT + 247 1 617 621 616 622 # CAO-CAO-CAT-CTT + 248 2 616 618 617 623 # CAT-CAM-CAO-HAT + 249 3 617 619 618 624 # CAO-CAP-CAM-HAT + 250 4 618 620 619 625 # CAM-CAM-CAP-HAT + 251 3 621 619 620 626 # CAO-CAP-CAM-HAT + 252 2 616 620 621 627 # CAT-CAM-CAO-HAT + 253 1 632 636 631 637 # CAO-CAO-CAT-CTT + 254 2 631 633 632 638 # CAT-CAM-CAO-HAT + 255 3 632 634 633 639 # CAO-CAP-CAM-HAT + 256 4 633 635 634 640 # CAM-CAM-CAP-HAT + 257 3 636 634 635 641 # CAO-CAP-CAM-HAT + 258 2 631 635 636 642 # CAT-CAM-CAO-HAT + 259 1 647 651 646 652 # CAO-CAO-CAT-CTT + 260 2 646 648 647 653 # CAT-CAM-CAO-HAT + 261 3 647 649 648 654 # CAO-CAP-CAM-HAT + 262 4 648 650 649 655 # CAM-CAM-CAP-HAT + 263 3 651 649 650 656 # CAO-CAP-CAM-HAT + 264 2 646 650 651 657 # CAT-CAM-CAO-HAT + 265 1 662 666 661 667 # CAO-CAO-CAT-CTT + 266 2 661 663 662 668 # CAT-CAM-CAO-HAT + 267 3 662 664 663 669 # CAO-CAP-CAM-HAT + 268 4 663 665 664 670 # CAM-CAM-CAP-HAT + 269 3 666 664 665 671 # CAO-CAP-CAM-HAT + 270 2 661 665 666 672 # CAT-CAM-CAO-HAT + 271 1 677 681 676 682 # CAO-CAO-CAT-CTT + 272 2 676 678 677 683 # CAT-CAM-CAO-HAT + 273 3 677 679 678 684 # CAO-CAP-CAM-HAT + 274 4 678 680 679 685 # CAM-CAM-CAP-HAT + 275 3 681 679 680 686 # CAO-CAP-CAM-HAT + 276 2 676 680 681 687 # CAT-CAM-CAO-HAT + 277 1 692 696 691 697 # CAO-CAO-CAT-CTT + 278 2 691 693 692 698 # CAT-CAM-CAO-HAT + 279 3 692 694 693 699 # CAO-CAP-CAM-HAT + 280 4 693 695 694 700 # CAM-CAM-CAP-HAT + 281 3 696 694 695 701 # CAO-CAP-CAM-HAT + 282 2 691 695 696 702 # CAT-CAM-CAO-HAT + 283 1 707 711 706 712 # CAO-CAO-CAT-CTT + 284 2 706 708 707 713 # CAT-CAM-CAO-HAT + 285 3 707 709 708 714 # CAO-CAP-CAM-HAT + 286 4 708 710 709 715 # CAM-CAM-CAP-HAT + 287 3 711 709 710 716 # CAO-CAP-CAM-HAT + 288 2 706 710 711 717 # CAT-CAM-CAO-HAT + 289 1 722 726 721 727 # CAO-CAO-CAT-CTT + 290 2 721 723 722 728 # CAT-CAM-CAO-HAT + 291 3 722 724 723 729 # CAO-CAP-CAM-HAT + 292 4 723 725 724 730 # CAM-CAM-CAP-HAT + 293 3 726 724 725 731 # CAO-CAP-CAM-HAT + 294 2 721 725 726 732 # CAT-CAM-CAO-HAT + 295 1 737 741 736 742 # CAO-CAO-CAT-CTT + 296 2 736 738 737 743 # CAT-CAM-CAO-HAT + 297 3 737 739 738 744 # CAO-CAP-CAM-HAT + 298 4 738 740 739 745 # CAM-CAM-CAP-HAT + 299 3 741 739 740 746 # CAO-CAP-CAM-HAT + 300 2 736 740 741 747 # CAT-CAM-CAO-HAT + 301 1 752 756 751 757 # CAO-CAO-CAT-CTT + 302 2 751 753 752 758 # CAT-CAM-CAO-HAT + 303 3 752 754 753 759 # CAO-CAP-CAM-HAT + 304 4 753 755 754 760 # CAM-CAM-CAP-HAT + 305 3 756 754 755 761 # CAO-CAP-CAM-HAT + 306 2 751 755 756 762 # CAT-CAM-CAO-HAT + 307 1 767 771 766 772 # CAO-CAO-CAT-CTT + 308 2 766 768 767 773 # CAT-CAM-CAO-HAT + 309 3 767 769 768 774 # CAO-CAP-CAM-HAT + 310 4 768 770 769 775 # CAM-CAM-CAP-HAT + 311 3 771 769 770 776 # CAO-CAP-CAM-HAT + 312 2 766 770 771 777 # CAT-CAM-CAO-HAT + 313 1 782 786 781 787 # CAO-CAO-CAT-CTT + 314 2 781 783 782 788 # CAT-CAM-CAO-HAT + 315 3 782 784 783 789 # CAO-CAP-CAM-HAT + 316 4 783 785 784 790 # CAM-CAM-CAP-HAT + 317 3 786 784 785 791 # CAO-CAP-CAM-HAT + 318 2 781 785 786 792 # CAT-CAM-CAO-HAT + 319 1 797 801 796 802 # CAO-CAO-CAT-CTT + 320 2 796 798 797 803 # CAT-CAM-CAO-HAT + 321 3 797 799 798 804 # CAO-CAP-CAM-HAT + 322 4 798 800 799 805 # CAM-CAM-CAP-HAT + 323 3 801 799 800 806 # CAO-CAP-CAM-HAT + 324 2 796 800 801 807 # CAT-CAM-CAO-HAT + 325 1 812 816 811 817 # CAO-CAO-CAT-CTT + 326 2 811 813 812 818 # CAT-CAM-CAO-HAT + 327 3 812 814 813 819 # CAO-CAP-CAM-HAT + 328 4 813 815 814 820 # CAM-CAM-CAP-HAT + 329 3 816 814 815 821 # CAO-CAP-CAM-HAT + 330 2 811 815 816 822 # CAT-CAM-CAO-HAT + 331 1 827 831 826 832 # CAO-CAO-CAT-CTT + 332 2 826 828 827 833 # CAT-CAM-CAO-HAT + 333 3 827 829 828 834 # CAO-CAP-CAM-HAT + 334 4 828 830 829 835 # CAM-CAM-CAP-HAT + 335 3 831 829 830 836 # CAO-CAP-CAM-HAT + 336 2 826 830 831 837 # CAT-CAM-CAO-HAT + 337 1 842 846 841 847 # CAO-CAO-CAT-CTT + 338 2 841 843 842 848 # CAT-CAM-CAO-HAT + 339 3 842 844 843 849 # CAO-CAP-CAM-HAT + 340 4 843 845 844 850 # CAM-CAM-CAP-HAT + 341 3 846 844 845 851 # CAO-CAP-CAM-HAT + 342 2 841 845 846 852 # CAT-CAM-CAO-HAT + 343 1 857 861 856 862 # CAO-CAO-CAT-CTT + 344 2 856 858 857 863 # CAT-CAM-CAO-HAT + 345 3 857 859 858 864 # CAO-CAP-CAM-HAT + 346 4 858 860 859 865 # CAM-CAM-CAP-HAT + 347 3 861 859 860 866 # CAO-CAP-CAM-HAT + 348 2 856 860 861 867 # CAT-CAM-CAO-HAT + 349 1 872 876 871 877 # CAO-CAO-CAT-CTT + 350 2 871 873 872 878 # CAT-CAM-CAO-HAT + 351 3 872 874 873 879 # CAO-CAP-CAM-HAT + 352 4 873 875 874 880 # CAM-CAM-CAP-HAT + 353 3 876 874 875 881 # CAO-CAP-CAM-HAT + 354 2 871 875 876 882 # CAT-CAM-CAO-HAT + 355 1 887 891 886 892 # CAO-CAO-CAT-CTT + 356 2 886 888 887 893 # CAT-CAM-CAO-HAT + 357 3 887 889 888 894 # CAO-CAP-CAM-HAT + 358 4 888 890 889 895 # CAM-CAM-CAP-HAT + 359 3 891 889 890 896 # CAO-CAP-CAM-HAT + 360 2 886 890 891 897 # CAT-CAM-CAO-HAT + 361 1 902 906 901 907 # CAO-CAO-CAT-CTT + 362 2 901 903 902 908 # CAT-CAM-CAO-HAT + 363 3 902 904 903 909 # CAO-CAP-CAM-HAT + 364 4 903 905 904 910 # CAM-CAM-CAP-HAT + 365 3 906 904 905 911 # CAO-CAP-CAM-HAT + 366 2 901 905 906 912 # CAT-CAM-CAO-HAT + 367 1 917 921 916 922 # CAO-CAO-CAT-CTT + 368 2 916 918 917 923 # CAT-CAM-CAO-HAT + 369 3 917 919 918 924 # CAO-CAP-CAM-HAT + 370 4 918 920 919 925 # CAM-CAM-CAP-HAT + 371 3 921 919 920 926 # CAO-CAP-CAM-HAT + 372 2 916 920 921 927 # CAT-CAM-CAO-HAT + 373 1 932 936 931 937 # CAO-CAO-CAT-CTT + 374 2 931 933 932 938 # CAT-CAM-CAO-HAT + 375 3 932 934 933 939 # CAO-CAP-CAM-HAT + 376 4 933 935 934 940 # CAM-CAM-CAP-HAT + 377 3 936 934 935 941 # CAO-CAP-CAM-HAT + 378 2 931 935 936 942 # CAT-CAM-CAO-HAT + 379 1 947 951 946 952 # CAO-CAO-CAT-CTT + 380 2 946 948 947 953 # CAT-CAM-CAO-HAT + 381 3 947 949 948 954 # CAO-CAP-CAM-HAT + 382 4 948 950 949 955 # CAM-CAM-CAP-HAT + 383 3 951 949 950 956 # CAO-CAP-CAM-HAT + 384 2 946 950 951 957 # CAT-CAM-CAO-HAT + 385 1 962 966 961 967 # CAO-CAO-CAT-CTT + 386 2 961 963 962 968 # CAT-CAM-CAO-HAT + 387 3 962 964 963 969 # CAO-CAP-CAM-HAT + 388 4 963 965 964 970 # CAM-CAM-CAP-HAT + 389 3 966 964 965 971 # CAO-CAP-CAM-HAT + 390 2 961 965 966 972 # CAT-CAM-CAO-HAT + 391 1 977 981 976 982 # CAO-CAO-CAT-CTT + 392 2 976 978 977 983 # CAT-CAM-CAO-HAT + 393 3 977 979 978 984 # CAO-CAP-CAM-HAT + 394 4 978 980 979 985 # CAM-CAM-CAP-HAT + 395 3 981 979 980 986 # CAO-CAP-CAM-HAT + 396 2 976 980 981 987 # CAT-CAM-CAO-HAT + 397 1 992 996 991 997 # CAO-CAO-CAT-CTT + 398 2 991 993 992 998 # CAT-CAM-CAO-HAT + 399 3 992 994 993 999 # CAO-CAP-CAM-HAT + 400 4 993 995 994 1000 # CAM-CAM-CAP-HAT + 401 3 996 994 995 1001 # CAO-CAP-CAM-HAT + 402 2 991 995 996 1002 # CAT-CAM-CAO-HAT + 403 1 1007 1011 1006 1012 # CAO-CAO-CAT-CTT + 404 2 1006 1008 1007 1013 # CAT-CAM-CAO-HAT + 405 3 1007 1009 1008 1014 # CAO-CAP-CAM-HAT + 406 4 1008 1010 1009 1015 # CAM-CAM-CAP-HAT + 407 3 1011 1009 1010 1016 # CAO-CAP-CAM-HAT + 408 2 1006 1010 1011 1017 # CAT-CAM-CAO-HAT + 409 1 1022 1026 1021 1027 # CAO-CAO-CAT-CTT + 410 2 1021 1023 1022 1028 # CAT-CAM-CAO-HAT + 411 3 1022 1024 1023 1029 # CAO-CAP-CAM-HAT + 412 4 1023 1025 1024 1030 # CAM-CAM-CAP-HAT + 413 3 1026 1024 1025 1031 # CAO-CAP-CAM-HAT + 414 2 1021 1025 1026 1032 # CAT-CAM-CAO-HAT + 415 1 1037 1041 1036 1042 # CAO-CAO-CAT-CTT + 416 2 1036 1038 1037 1043 # CAT-CAM-CAO-HAT + 417 3 1037 1039 1038 1044 # CAO-CAP-CAM-HAT + 418 4 1038 1040 1039 1045 # CAM-CAM-CAP-HAT + 419 3 1041 1039 1040 1046 # CAO-CAP-CAM-HAT + 420 2 1036 1040 1041 1047 # CAT-CAM-CAO-HAT + 421 1 1052 1056 1051 1057 # CAO-CAO-CAT-CTT + 422 2 1051 1053 1052 1058 # CAT-CAM-CAO-HAT + 423 3 1052 1054 1053 1059 # CAO-CAP-CAM-HAT + 424 4 1053 1055 1054 1060 # CAM-CAM-CAP-HAT + 425 3 1056 1054 1055 1061 # CAO-CAP-CAM-HAT + 426 2 1051 1055 1056 1062 # CAT-CAM-CAO-HAT + 427 1 1067 1071 1066 1072 # CAO-CAO-CAT-CTT + 428 2 1066 1068 1067 1073 # CAT-CAM-CAO-HAT + 429 3 1067 1069 1068 1074 # CAO-CAP-CAM-HAT + 430 4 1068 1070 1069 1075 # CAM-CAM-CAP-HAT + 431 3 1071 1069 1070 1076 # CAO-CAP-CAM-HAT + 432 2 1066 1070 1071 1077 # CAT-CAM-CAO-HAT + 433 1 1082 1086 1081 1087 # CAO-CAO-CAT-CTT + 434 2 1081 1083 1082 1088 # CAT-CAM-CAO-HAT + 435 3 1082 1084 1083 1089 # CAO-CAP-CAM-HAT + 436 4 1083 1085 1084 1090 # CAM-CAM-CAP-HAT + 437 3 1086 1084 1085 1091 # CAO-CAP-CAM-HAT + 438 2 1081 1085 1086 1092 # CAT-CAM-CAO-HAT + 439 1 1097 1101 1096 1102 # CAO-CAO-CAT-CTT + 440 2 1096 1098 1097 1103 # CAT-CAM-CAO-HAT + 441 3 1097 1099 1098 1104 # CAO-CAP-CAM-HAT + 442 4 1098 1100 1099 1105 # CAM-CAM-CAP-HAT + 443 3 1101 1099 1100 1106 # CAO-CAP-CAM-HAT + 444 2 1096 1100 1101 1107 # CAT-CAM-CAO-HAT + 445 1 1112 1116 1111 1117 # CAO-CAO-CAT-CTT + 446 2 1111 1113 1112 1118 # CAT-CAM-CAO-HAT + 447 3 1112 1114 1113 1119 # CAO-CAP-CAM-HAT + 448 4 1113 1115 1114 1120 # CAM-CAM-CAP-HAT + 449 3 1116 1114 1115 1121 # CAO-CAP-CAM-HAT + 450 2 1111 1115 1116 1122 # CAT-CAM-CAO-HAT + 451 1 1127 1131 1126 1132 # CAO-CAO-CAT-CTT + 452 2 1126 1128 1127 1133 # CAT-CAM-CAO-HAT + 453 3 1127 1129 1128 1134 # CAO-CAP-CAM-HAT + 454 4 1128 1130 1129 1135 # CAM-CAM-CAP-HAT + 455 3 1131 1129 1130 1136 # CAO-CAP-CAM-HAT + 456 2 1126 1130 1131 1137 # CAT-CAM-CAO-HAT + 457 1 1142 1146 1141 1147 # CAO-CAO-CAT-CTT + 458 2 1141 1143 1142 1148 # CAT-CAM-CAO-HAT + 459 3 1142 1144 1143 1149 # CAO-CAP-CAM-HAT + 460 4 1143 1145 1144 1150 # CAM-CAM-CAP-HAT + 461 3 1146 1144 1145 1151 # CAO-CAP-CAM-HAT + 462 2 1141 1145 1146 1152 # CAT-CAM-CAO-HAT + 463 1 1157 1161 1156 1162 # CAO-CAO-CAT-CTT + 464 2 1156 1158 1157 1163 # CAT-CAM-CAO-HAT + 465 3 1157 1159 1158 1164 # CAO-CAP-CAM-HAT + 466 4 1158 1160 1159 1165 # CAM-CAM-CAP-HAT + 467 3 1161 1159 1160 1166 # CAO-CAP-CAM-HAT + 468 2 1156 1160 1161 1167 # CAT-CAM-CAO-HAT + 469 1 1172 1176 1171 1177 # CAO-CAO-CAT-CTT + 470 2 1171 1173 1172 1178 # CAT-CAM-CAO-HAT + 471 3 1172 1174 1173 1179 # CAO-CAP-CAM-HAT + 472 4 1173 1175 1174 1180 # CAM-CAM-CAP-HAT + 473 3 1176 1174 1175 1181 # CAO-CAP-CAM-HAT + 474 2 1171 1175 1176 1182 # CAT-CAM-CAO-HAT + 475 1 1187 1191 1186 1192 # CAO-CAO-CAT-CTT + 476 2 1186 1188 1187 1193 # CAT-CAM-CAO-HAT + 477 3 1187 1189 1188 1194 # CAO-CAP-CAM-HAT + 478 4 1188 1190 1189 1195 # CAM-CAM-CAP-HAT + 479 3 1191 1189 1190 1196 # CAO-CAP-CAM-HAT + 480 2 1186 1190 1191 1197 # CAT-CAM-CAO-HAT + 481 1 1202 1206 1201 1207 # CAO-CAO-CAT-CTT + 482 2 1201 1203 1202 1208 # CAT-CAM-CAO-HAT + 483 3 1202 1204 1203 1209 # CAO-CAP-CAM-HAT + 484 4 1203 1205 1204 1210 # CAM-CAM-CAP-HAT + 485 3 1206 1204 1205 1211 # CAO-CAP-CAM-HAT + 486 2 1201 1205 1206 1212 # CAT-CAM-CAO-HAT + 487 1 1217 1221 1216 1222 # CAO-CAO-CAT-CTT + 488 2 1216 1218 1217 1223 # CAT-CAM-CAO-HAT + 489 3 1217 1219 1218 1224 # CAO-CAP-CAM-HAT + 490 4 1218 1220 1219 1225 # CAM-CAM-CAP-HAT + 491 3 1221 1219 1220 1226 # CAO-CAP-CAM-HAT + 492 2 1216 1220 1221 1227 # CAT-CAM-CAO-HAT + 493 1 1232 1236 1231 1237 # CAO-CAO-CAT-CTT + 494 2 1231 1233 1232 1238 # CAT-CAM-CAO-HAT + 495 3 1232 1234 1233 1239 # CAO-CAP-CAM-HAT + 496 4 1233 1235 1234 1240 # CAM-CAM-CAP-HAT + 497 3 1236 1234 1235 1241 # CAO-CAP-CAM-HAT + 498 2 1231 1235 1236 1242 # CAT-CAM-CAO-HAT + 499 1 1247 1251 1246 1252 # CAO-CAO-CAT-CTT + 500 2 1246 1248 1247 1253 # CAT-CAM-CAO-HAT + 501 3 1247 1249 1248 1254 # CAO-CAP-CAM-HAT + 502 4 1248 1250 1249 1255 # CAM-CAM-CAP-HAT + 503 3 1251 1249 1250 1256 # CAO-CAP-CAM-HAT + 504 2 1246 1250 1251 1257 # CAT-CAM-CAO-HAT + 505 1 1262 1266 1261 1267 # CAO-CAO-CAT-CTT + 506 2 1261 1263 1262 1268 # CAT-CAM-CAO-HAT + 507 3 1262 1264 1263 1269 # CAO-CAP-CAM-HAT + 508 4 1263 1265 1264 1270 # CAM-CAM-CAP-HAT + 509 3 1266 1264 1265 1271 # CAO-CAP-CAM-HAT + 510 2 1261 1265 1266 1272 # CAT-CAM-CAO-HAT + 511 1 1277 1281 1276 1282 # CAO-CAO-CAT-CTT + 512 2 1276 1278 1277 1283 # CAT-CAM-CAO-HAT + 513 3 1277 1279 1278 1284 # CAO-CAP-CAM-HAT + 514 4 1278 1280 1279 1285 # CAM-CAM-CAP-HAT + 515 3 1281 1279 1280 1286 # CAO-CAP-CAM-HAT + 516 2 1276 1280 1281 1287 # CAT-CAM-CAO-HAT + 517 1 1292 1296 1291 1297 # CAO-CAO-CAT-CTT + 518 2 1291 1293 1292 1298 # CAT-CAM-CAO-HAT + 519 3 1292 1294 1293 1299 # CAO-CAP-CAM-HAT + 520 4 1293 1295 1294 1300 # CAM-CAM-CAP-HAT + 521 3 1296 1294 1295 1301 # CAO-CAP-CAM-HAT + 522 2 1291 1295 1296 1302 # CAT-CAM-CAO-HAT + 523 1 1307 1311 1306 1312 # CAO-CAO-CAT-CTT + 524 2 1306 1308 1307 1313 # CAT-CAM-CAO-HAT + 525 3 1307 1309 1308 1314 # CAO-CAP-CAM-HAT + 526 4 1308 1310 1309 1315 # CAM-CAM-CAP-HAT + 527 3 1311 1309 1310 1316 # CAO-CAP-CAM-HAT + 528 2 1306 1310 1311 1317 # CAT-CAM-CAO-HAT + 529 1 1322 1326 1321 1327 # CAO-CAO-CAT-CTT + 530 2 1321 1323 1322 1328 # CAT-CAM-CAO-HAT + 531 3 1322 1324 1323 1329 # CAO-CAP-CAM-HAT + 532 4 1323 1325 1324 1330 # CAM-CAM-CAP-HAT + 533 3 1326 1324 1325 1331 # CAO-CAP-CAM-HAT + 534 2 1321 1325 1326 1332 # CAT-CAM-CAO-HAT + 535 1 1337 1341 1336 1342 # CAO-CAO-CAT-CTT + 536 2 1336 1338 1337 1343 # CAT-CAM-CAO-HAT + 537 3 1337 1339 1338 1344 # CAO-CAP-CAM-HAT + 538 4 1338 1340 1339 1345 # CAM-CAM-CAP-HAT + 539 3 1341 1339 1340 1346 # CAO-CAP-CAM-HAT + 540 2 1336 1340 1341 1347 # CAT-CAM-CAO-HAT + 541 1 1352 1356 1351 1357 # CAO-CAO-CAT-CTT + 542 2 1351 1353 1352 1358 # CAT-CAM-CAO-HAT + 543 3 1352 1354 1353 1359 # CAO-CAP-CAM-HAT + 544 4 1353 1355 1354 1360 # CAM-CAM-CAP-HAT + 545 3 1356 1354 1355 1361 # CAO-CAP-CAM-HAT + 546 2 1351 1355 1356 1362 # CAT-CAM-CAO-HAT + 547 1 1367 1371 1366 1372 # CAO-CAO-CAT-CTT + 548 2 1366 1368 1367 1373 # CAT-CAM-CAO-HAT + 549 3 1367 1369 1368 1374 # CAO-CAP-CAM-HAT + 550 4 1368 1370 1369 1375 # CAM-CAM-CAP-HAT + 551 3 1371 1369 1370 1376 # CAO-CAP-CAM-HAT + 552 2 1366 1370 1371 1377 # CAT-CAM-CAO-HAT + 553 1 1382 1386 1381 1387 # CAO-CAO-CAT-CTT + 554 2 1381 1383 1382 1388 # CAT-CAM-CAO-HAT + 555 3 1382 1384 1383 1389 # CAO-CAP-CAM-HAT + 556 4 1383 1385 1384 1390 # CAM-CAM-CAP-HAT + 557 3 1386 1384 1385 1391 # CAO-CAP-CAM-HAT + 558 2 1381 1385 1386 1392 # CAT-CAM-CAO-HAT + 559 1 1397 1401 1396 1402 # CAO-CAO-CAT-CTT + 560 2 1396 1398 1397 1403 # CAT-CAM-CAO-HAT + 561 3 1397 1399 1398 1404 # CAO-CAP-CAM-HAT + 562 4 1398 1400 1399 1405 # CAM-CAM-CAP-HAT + 563 3 1401 1399 1400 1406 # CAO-CAP-CAM-HAT + 564 2 1396 1400 1401 1407 # CAT-CAM-CAO-HAT + 565 1 1412 1416 1411 1417 # CAO-CAO-CAT-CTT + 566 2 1411 1413 1412 1418 # CAT-CAM-CAO-HAT + 567 3 1412 1414 1413 1419 # CAO-CAP-CAM-HAT + 568 4 1413 1415 1414 1420 # CAM-CAM-CAP-HAT + 569 3 1416 1414 1415 1421 # CAO-CAP-CAM-HAT + 570 2 1411 1415 1416 1422 # CAT-CAM-CAO-HAT + 571 1 1427 1431 1426 1432 # CAO-CAO-CAT-CTT + 572 2 1426 1428 1427 1433 # CAT-CAM-CAO-HAT + 573 3 1427 1429 1428 1434 # CAO-CAP-CAM-HAT + 574 4 1428 1430 1429 1435 # CAM-CAM-CAP-HAT + 575 3 1431 1429 1430 1436 # CAO-CAP-CAM-HAT + 576 2 1426 1430 1431 1437 # CAT-CAM-CAO-HAT + 577 1 1442 1446 1441 1447 # CAO-CAO-CAT-CTT + 578 2 1441 1443 1442 1448 # CAT-CAM-CAO-HAT + 579 3 1442 1444 1443 1449 # CAO-CAP-CAM-HAT + 580 4 1443 1445 1444 1450 # CAM-CAM-CAP-HAT + 581 3 1446 1444 1445 1451 # CAO-CAP-CAM-HAT + 582 2 1441 1445 1446 1452 # CAT-CAM-CAO-HAT + 583 1 1457 1461 1456 1462 # CAO-CAO-CAT-CTT + 584 2 1456 1458 1457 1463 # CAT-CAM-CAO-HAT + 585 3 1457 1459 1458 1464 # CAO-CAP-CAM-HAT + 586 4 1458 1460 1459 1465 # CAM-CAM-CAP-HAT + 587 3 1461 1459 1460 1466 # CAO-CAP-CAM-HAT + 588 2 1456 1460 1461 1467 # CAT-CAM-CAO-HAT + 589 1 1472 1476 1471 1477 # CAO-CAO-CAT-CTT + 590 2 1471 1473 1472 1478 # CAT-CAM-CAO-HAT + 591 3 1472 1474 1473 1479 # CAO-CAP-CAM-HAT + 592 4 1473 1475 1474 1480 # CAM-CAM-CAP-HAT + 593 3 1476 1474 1475 1481 # CAO-CAP-CAM-HAT + 594 2 1471 1475 1476 1482 # CAT-CAM-CAO-HAT + 595 1 1487 1491 1486 1492 # CAO-CAO-CAT-CTT + 596 2 1486 1488 1487 1493 # CAT-CAM-CAO-HAT + 597 3 1487 1489 1488 1494 # CAO-CAP-CAM-HAT + 598 4 1488 1490 1489 1495 # CAM-CAM-CAP-HAT + 599 3 1491 1489 1490 1496 # CAO-CAP-CAM-HAT + 600 2 1486 1490 1491 1497 # CAT-CAM-CAO-HAT + 601 1 1502 1506 1501 1507 # CAO-CAO-CAT-CTT + 602 2 1501 1503 1502 1508 # CAT-CAM-CAO-HAT + 603 3 1502 1504 1503 1509 # CAO-CAP-CAM-HAT + 604 4 1503 1505 1504 1510 # CAM-CAM-CAP-HAT + 605 3 1506 1504 1505 1511 # CAO-CAP-CAM-HAT + 606 2 1501 1505 1506 1512 # CAT-CAM-CAO-HAT + 607 1 1517 1521 1516 1522 # CAO-CAO-CAT-CTT + 608 2 1516 1518 1517 1523 # CAT-CAM-CAO-HAT + 609 3 1517 1519 1518 1524 # CAO-CAP-CAM-HAT + 610 4 1518 1520 1519 1525 # CAM-CAM-CAP-HAT + 611 3 1521 1519 1520 1526 # CAO-CAP-CAM-HAT + 612 2 1516 1520 1521 1527 # CAT-CAM-CAO-HAT + 613 1 1532 1536 1531 1537 # CAO-CAO-CAT-CTT + 614 2 1531 1533 1532 1538 # CAT-CAM-CAO-HAT + 615 3 1532 1534 1533 1539 # CAO-CAP-CAM-HAT + 616 4 1533 1535 1534 1540 # CAM-CAM-CAP-HAT + 617 3 1536 1534 1535 1541 # CAO-CAP-CAM-HAT + 618 2 1531 1535 1536 1542 # CAT-CAM-CAO-HAT + 619 1 1547 1551 1546 1552 # CAO-CAO-CAT-CTT + 620 2 1546 1548 1547 1553 # CAT-CAM-CAO-HAT + 621 3 1547 1549 1548 1554 # CAO-CAP-CAM-HAT + 622 4 1548 1550 1549 1555 # CAM-CAM-CAP-HAT + 623 3 1551 1549 1550 1556 # CAO-CAP-CAM-HAT + 624 2 1546 1550 1551 1557 # CAT-CAM-CAO-HAT + 625 1 1562 1566 1561 1567 # CAO-CAO-CAT-CTT + 626 2 1561 1563 1562 1568 # CAT-CAM-CAO-HAT + 627 3 1562 1564 1563 1569 # CAO-CAP-CAM-HAT + 628 4 1563 1565 1564 1570 # CAM-CAM-CAP-HAT + 629 3 1566 1564 1565 1571 # CAO-CAP-CAM-HAT + 630 2 1561 1565 1566 1572 # CAT-CAM-CAO-HAT + 631 1 1577 1581 1576 1582 # CAO-CAO-CAT-CTT + 632 2 1576 1578 1577 1583 # CAT-CAM-CAO-HAT + 633 3 1577 1579 1578 1584 # CAO-CAP-CAM-HAT + 634 4 1578 1580 1579 1585 # CAM-CAM-CAP-HAT + 635 3 1581 1579 1580 1586 # CAO-CAP-CAM-HAT + 636 2 1576 1580 1581 1587 # CAT-CAM-CAO-HAT + 637 1 1592 1596 1591 1597 # CAO-CAO-CAT-CTT + 638 2 1591 1593 1592 1598 # CAT-CAM-CAO-HAT + 639 3 1592 1594 1593 1599 # CAO-CAP-CAM-HAT + 640 4 1593 1595 1594 1600 # CAM-CAM-CAP-HAT + 641 3 1596 1594 1595 1601 # CAO-CAP-CAM-HAT + 642 2 1591 1595 1596 1602 # CAT-CAM-CAO-HAT + 643 1 1607 1611 1606 1612 # CAO-CAO-CAT-CTT + 644 2 1606 1608 1607 1613 # CAT-CAM-CAO-HAT + 645 3 1607 1609 1608 1614 # CAO-CAP-CAM-HAT + 646 4 1608 1610 1609 1615 # CAM-CAM-CAP-HAT + 647 3 1611 1609 1610 1616 # CAO-CAP-CAM-HAT + 648 2 1606 1610 1611 1617 # CAT-CAM-CAO-HAT + 649 1 1622 1626 1621 1627 # CAO-CAO-CAT-CTT + 650 2 1621 1623 1622 1628 # CAT-CAM-CAO-HAT + 651 3 1622 1624 1623 1629 # CAO-CAP-CAM-HAT + 652 4 1623 1625 1624 1630 # CAM-CAM-CAP-HAT + 653 3 1626 1624 1625 1631 # CAO-CAP-CAM-HAT + 654 2 1621 1625 1626 1632 # CAT-CAM-CAO-HAT + 655 1 1637 1641 1636 1642 # CAO-CAO-CAT-CTT + 656 2 1636 1638 1637 1643 # CAT-CAM-CAO-HAT + 657 3 1637 1639 1638 1644 # CAO-CAP-CAM-HAT + 658 4 1638 1640 1639 1645 # CAM-CAM-CAP-HAT + 659 3 1641 1639 1640 1646 # CAO-CAP-CAM-HAT + 660 2 1636 1640 1641 1647 # CAT-CAM-CAO-HAT + 661 1 1652 1656 1651 1657 # CAO-CAO-CAT-CTT + 662 2 1651 1653 1652 1658 # CAT-CAM-CAO-HAT + 663 3 1652 1654 1653 1659 # CAO-CAP-CAM-HAT + 664 4 1653 1655 1654 1660 # CAM-CAM-CAP-HAT + 665 3 1656 1654 1655 1661 # CAO-CAP-CAM-HAT + 666 2 1651 1655 1656 1662 # CAT-CAM-CAO-HAT + 667 1 1667 1671 1666 1672 # CAO-CAO-CAT-CTT + 668 2 1666 1668 1667 1673 # CAT-CAM-CAO-HAT + 669 3 1667 1669 1668 1674 # CAO-CAP-CAM-HAT + 670 4 1668 1670 1669 1675 # CAM-CAM-CAP-HAT + 671 3 1671 1669 1670 1676 # CAO-CAP-CAM-HAT + 672 2 1666 1670 1671 1677 # CAT-CAM-CAO-HAT + 673 1 1682 1686 1681 1687 # CAO-CAO-CAT-CTT + 674 2 1681 1683 1682 1688 # CAT-CAM-CAO-HAT + 675 3 1682 1684 1683 1689 # CAO-CAP-CAM-HAT + 676 4 1683 1685 1684 1690 # CAM-CAM-CAP-HAT + 677 3 1686 1684 1685 1691 # CAO-CAP-CAM-HAT + 678 2 1681 1685 1686 1692 # CAT-CAM-CAO-HAT + 679 1 1697 1701 1696 1702 # CAO-CAO-CAT-CTT + 680 2 1696 1698 1697 1703 # CAT-CAM-CAO-HAT + 681 3 1697 1699 1698 1704 # CAO-CAP-CAM-HAT + 682 4 1698 1700 1699 1705 # CAM-CAM-CAP-HAT + 683 3 1701 1699 1700 1706 # CAO-CAP-CAM-HAT + 684 2 1696 1700 1701 1707 # CAT-CAM-CAO-HAT + 685 1 1712 1716 1711 1717 # CAO-CAO-CAT-CTT + 686 2 1711 1713 1712 1718 # CAT-CAM-CAO-HAT + 687 3 1712 1714 1713 1719 # CAO-CAP-CAM-HAT + 688 4 1713 1715 1714 1720 # CAM-CAM-CAP-HAT + 689 3 1716 1714 1715 1721 # CAO-CAP-CAM-HAT + 690 2 1711 1715 1716 1722 # CAT-CAM-CAO-HAT + 691 1 1727 1731 1726 1732 # CAO-CAO-CAT-CTT + 692 2 1726 1728 1727 1733 # CAT-CAM-CAO-HAT + 693 3 1727 1729 1728 1734 # CAO-CAP-CAM-HAT + 694 4 1728 1730 1729 1735 # CAM-CAM-CAP-HAT + 695 3 1731 1729 1730 1736 # CAO-CAP-CAM-HAT + 696 2 1726 1730 1731 1737 # CAT-CAM-CAO-HAT + 697 1 1742 1746 1741 1747 # CAO-CAO-CAT-CTT + 698 2 1741 1743 1742 1748 # CAT-CAM-CAO-HAT + 699 3 1742 1744 1743 1749 # CAO-CAP-CAM-HAT + 700 4 1743 1745 1744 1750 # CAM-CAM-CAP-HAT + 701 3 1746 1744 1745 1751 # CAO-CAP-CAM-HAT + 702 2 1741 1745 1746 1752 # CAT-CAM-CAO-HAT + 703 1 1757 1761 1756 1762 # CAO-CAO-CAT-CTT + 704 2 1756 1758 1757 1763 # CAT-CAM-CAO-HAT + 705 3 1757 1759 1758 1764 # CAO-CAP-CAM-HAT + 706 4 1758 1760 1759 1765 # CAM-CAM-CAP-HAT + 707 3 1761 1759 1760 1766 # CAO-CAP-CAM-HAT + 708 2 1756 1760 1761 1767 # CAT-CAM-CAO-HAT + 709 1 1772 1776 1771 1777 # CAO-CAO-CAT-CTT + 710 2 1771 1773 1772 1778 # CAT-CAM-CAO-HAT + 711 3 1772 1774 1773 1779 # CAO-CAP-CAM-HAT + 712 4 1773 1775 1774 1780 # CAM-CAM-CAP-HAT + 713 3 1776 1774 1775 1781 # CAO-CAP-CAM-HAT + 714 2 1771 1775 1776 1782 # CAT-CAM-CAO-HAT + 715 1 1787 1791 1786 1792 # CAO-CAO-CAT-CTT + 716 2 1786 1788 1787 1793 # CAT-CAM-CAO-HAT + 717 3 1787 1789 1788 1794 # CAO-CAP-CAM-HAT + 718 4 1788 1790 1789 1795 # CAM-CAM-CAP-HAT + 719 3 1791 1789 1790 1796 # CAO-CAP-CAM-HAT + 720 2 1786 1790 1791 1797 # CAT-CAM-CAO-HAT + 721 1 1802 1806 1801 1807 # CAO-CAO-CAT-CTT + 722 2 1801 1803 1802 1808 # CAT-CAM-CAO-HAT + 723 3 1802 1804 1803 1809 # CAO-CAP-CAM-HAT + 724 4 1803 1805 1804 1810 # CAM-CAM-CAP-HAT + 725 3 1806 1804 1805 1811 # CAO-CAP-CAM-HAT + 726 2 1801 1805 1806 1812 # CAT-CAM-CAO-HAT + 727 1 1817 1821 1816 1822 # CAO-CAO-CAT-CTT + 728 2 1816 1818 1817 1823 # CAT-CAM-CAO-HAT + 729 3 1817 1819 1818 1824 # CAO-CAP-CAM-HAT + 730 4 1818 1820 1819 1825 # CAM-CAM-CAP-HAT + 731 3 1821 1819 1820 1826 # CAO-CAP-CAM-HAT + 732 2 1816 1820 1821 1827 # CAT-CAM-CAO-HAT + 733 1 1832 1836 1831 1837 # CAO-CAO-CAT-CTT + 734 2 1831 1833 1832 1838 # CAT-CAM-CAO-HAT + 735 3 1832 1834 1833 1839 # CAO-CAP-CAM-HAT + 736 4 1833 1835 1834 1840 # CAM-CAM-CAP-HAT + 737 3 1836 1834 1835 1841 # CAO-CAP-CAM-HAT + 738 2 1831 1835 1836 1842 # CAT-CAM-CAO-HAT + 739 1 1847 1851 1846 1852 # CAO-CAO-CAT-CTT + 740 2 1846 1848 1847 1853 # CAT-CAM-CAO-HAT + 741 3 1847 1849 1848 1854 # CAO-CAP-CAM-HAT + 742 4 1848 1850 1849 1855 # CAM-CAM-CAP-HAT + 743 3 1851 1849 1850 1856 # CAO-CAP-CAM-HAT + 744 2 1846 1850 1851 1857 # CAT-CAM-CAO-HAT + 745 1 1862 1866 1861 1867 # CAO-CAO-CAT-CTT + 746 2 1861 1863 1862 1868 # CAT-CAM-CAO-HAT + 747 3 1862 1864 1863 1869 # CAO-CAP-CAM-HAT + 748 4 1863 1865 1864 1870 # CAM-CAM-CAP-HAT + 749 3 1866 1864 1865 1871 # CAO-CAP-CAM-HAT + 750 2 1861 1865 1866 1872 # CAT-CAM-CAO-HAT + 751 1 1877 1881 1876 1882 # CAO-CAO-CAT-CTT + 752 2 1876 1878 1877 1883 # CAT-CAM-CAO-HAT + 753 3 1877 1879 1878 1884 # CAO-CAP-CAM-HAT + 754 4 1878 1880 1879 1885 # CAM-CAM-CAP-HAT + 755 3 1881 1879 1880 1886 # CAO-CAP-CAM-HAT + 756 2 1876 1880 1881 1887 # CAT-CAM-CAO-HAT + 757 1 1892 1896 1891 1897 # CAO-CAO-CAT-CTT + 758 2 1891 1893 1892 1898 # CAT-CAM-CAO-HAT + 759 3 1892 1894 1893 1899 # CAO-CAP-CAM-HAT + 760 4 1893 1895 1894 1900 # CAM-CAM-CAP-HAT + 761 3 1896 1894 1895 1901 # CAO-CAP-CAM-HAT + 762 2 1891 1895 1896 1902 # CAT-CAM-CAO-HAT + 763 1 1907 1911 1906 1912 # CAO-CAO-CAT-CTT + 764 2 1906 1908 1907 1913 # CAT-CAM-CAO-HAT + 765 3 1907 1909 1908 1914 # CAO-CAP-CAM-HAT + 766 4 1908 1910 1909 1915 # CAM-CAM-CAP-HAT + 767 3 1911 1909 1910 1916 # CAO-CAP-CAM-HAT + 768 2 1906 1910 1911 1917 # CAT-CAM-CAO-HAT + 769 1 1922 1926 1921 1927 # CAO-CAO-CAT-CTT + 770 2 1921 1923 1922 1928 # CAT-CAM-CAO-HAT + 771 3 1922 1924 1923 1929 # CAO-CAP-CAM-HAT + 772 4 1923 1925 1924 1930 # CAM-CAM-CAP-HAT + 773 3 1926 1924 1925 1931 # CAO-CAP-CAM-HAT + 774 2 1921 1925 1926 1932 # CAT-CAM-CAO-HAT + 775 1 1937 1941 1936 1942 # CAO-CAO-CAT-CTT + 776 2 1936 1938 1937 1943 # CAT-CAM-CAO-HAT + 777 3 1937 1939 1938 1944 # CAO-CAP-CAM-HAT + 778 4 1938 1940 1939 1945 # CAM-CAM-CAP-HAT + 779 3 1941 1939 1940 1946 # CAO-CAP-CAM-HAT + 780 2 1936 1940 1941 1947 # CAT-CAM-CAO-HAT + 781 1 1952 1956 1951 1957 # CAO-CAO-CAT-CTT + 782 2 1951 1953 1952 1958 # CAT-CAM-CAO-HAT + 783 3 1952 1954 1953 1959 # CAO-CAP-CAM-HAT + 784 4 1953 1955 1954 1960 # CAM-CAM-CAP-HAT + 785 3 1956 1954 1955 1961 # CAO-CAP-CAM-HAT + 786 2 1951 1955 1956 1962 # CAT-CAM-CAO-HAT + 787 1 1967 1971 1966 1972 # CAO-CAO-CAT-CTT + 788 2 1966 1968 1967 1973 # CAT-CAM-CAO-HAT + 789 3 1967 1969 1968 1974 # CAO-CAP-CAM-HAT + 790 4 1968 1970 1969 1975 # CAM-CAM-CAP-HAT + 791 3 1971 1969 1970 1976 # CAO-CAP-CAM-HAT + 792 2 1966 1970 1971 1977 # CAT-CAM-CAO-HAT + 793 1 1982 1986 1981 1987 # CAO-CAO-CAT-CTT + 794 2 1981 1983 1982 1988 # CAT-CAM-CAO-HAT + 795 3 1982 1984 1983 1989 # CAO-CAP-CAM-HAT + 796 4 1983 1985 1984 1990 # CAM-CAM-CAP-HAT + 797 3 1986 1984 1985 1991 # CAO-CAP-CAM-HAT + 798 2 1981 1985 1986 1992 # CAT-CAM-CAO-HAT + 799 1 1997 2001 1996 2002 # CAO-CAO-CAT-CTT + 800 2 1996 1998 1997 2003 # CAT-CAM-CAO-HAT + 801 3 1997 1999 1998 2004 # CAO-CAP-CAM-HAT + 802 4 1998 2000 1999 2005 # CAM-CAM-CAP-HAT + 803 3 2001 1999 2000 2006 # CAO-CAP-CAM-HAT + 804 2 1996 2000 2001 2007 # CAT-CAM-CAO-HAT + 805 1 2012 2016 2011 2017 # CAO-CAO-CAT-CTT + 806 2 2011 2013 2012 2018 # CAT-CAM-CAO-HAT + 807 3 2012 2014 2013 2019 # CAO-CAP-CAM-HAT + 808 4 2013 2015 2014 2020 # CAM-CAM-CAP-HAT + 809 3 2016 2014 2015 2021 # CAO-CAP-CAM-HAT + 810 2 2011 2015 2016 2022 # CAT-CAM-CAO-HAT + 811 1 2027 2031 2026 2032 # CAO-CAO-CAT-CTT + 812 2 2026 2028 2027 2033 # CAT-CAM-CAO-HAT + 813 3 2027 2029 2028 2034 # CAO-CAP-CAM-HAT + 814 4 2028 2030 2029 2035 # CAM-CAM-CAP-HAT + 815 3 2031 2029 2030 2036 # CAO-CAP-CAM-HAT + 816 2 2026 2030 2031 2037 # CAT-CAM-CAO-HAT + 817 1 2042 2046 2041 2047 # CAO-CAO-CAT-CTT + 818 2 2041 2043 2042 2048 # CAT-CAM-CAO-HAT + 819 3 2042 2044 2043 2049 # CAO-CAP-CAM-HAT + 820 4 2043 2045 2044 2050 # CAM-CAM-CAP-HAT + 821 3 2046 2044 2045 2051 # CAO-CAP-CAM-HAT + 822 2 2041 2045 2046 2052 # CAT-CAM-CAO-HAT + 823 1 2057 2061 2056 2062 # CAO-CAO-CAT-CTT + 824 2 2056 2058 2057 2063 # CAT-CAM-CAO-HAT + 825 3 2057 2059 2058 2064 # CAO-CAP-CAM-HAT + 826 4 2058 2060 2059 2065 # CAM-CAM-CAP-HAT + 827 3 2061 2059 2060 2066 # CAO-CAP-CAM-HAT + 828 2 2056 2060 2061 2067 # CAT-CAM-CAO-HAT + 829 1 2072 2076 2071 2077 # CAO-CAO-CAT-CTT + 830 2 2071 2073 2072 2078 # CAT-CAM-CAO-HAT + 831 3 2072 2074 2073 2079 # CAO-CAP-CAM-HAT + 832 4 2073 2075 2074 2080 # CAM-CAM-CAP-HAT + 833 3 2076 2074 2075 2081 # CAO-CAP-CAM-HAT + 834 2 2071 2075 2076 2082 # CAT-CAM-CAO-HAT + 835 1 2087 2091 2086 2092 # CAO-CAO-CAT-CTT + 836 2 2086 2088 2087 2093 # CAT-CAM-CAO-HAT + 837 3 2087 2089 2088 2094 # CAO-CAP-CAM-HAT + 838 4 2088 2090 2089 2095 # CAM-CAM-CAP-HAT + 839 3 2091 2089 2090 2096 # CAO-CAP-CAM-HAT + 840 2 2086 2090 2091 2097 # CAT-CAM-CAO-HAT + 841 1 2102 2106 2101 2107 # CAO-CAO-CAT-CTT + 842 2 2101 2103 2102 2108 # CAT-CAM-CAO-HAT + 843 3 2102 2104 2103 2109 # CAO-CAP-CAM-HAT + 844 4 2103 2105 2104 2110 # CAM-CAM-CAP-HAT + 845 3 2106 2104 2105 2111 # CAO-CAP-CAM-HAT + 846 2 2101 2105 2106 2112 # CAT-CAM-CAO-HAT + 847 1 2117 2121 2116 2122 # CAO-CAO-CAT-CTT + 848 2 2116 2118 2117 2123 # CAT-CAM-CAO-HAT + 849 3 2117 2119 2118 2124 # CAO-CAP-CAM-HAT + 850 4 2118 2120 2119 2125 # CAM-CAM-CAP-HAT + 851 3 2121 2119 2120 2126 # CAO-CAP-CAM-HAT + 852 2 2116 2120 2121 2127 # CAT-CAM-CAO-HAT + 853 1 2132 2136 2131 2137 # CAO-CAO-CAT-CTT + 854 2 2131 2133 2132 2138 # CAT-CAM-CAO-HAT + 855 3 2132 2134 2133 2139 # CAO-CAP-CAM-HAT + 856 4 2133 2135 2134 2140 # CAM-CAM-CAP-HAT + 857 3 2136 2134 2135 2141 # CAO-CAP-CAM-HAT + 858 2 2131 2135 2136 2142 # CAT-CAM-CAO-HAT + 859 1 2147 2151 2146 2152 # CAO-CAO-CAT-CTT + 860 2 2146 2148 2147 2153 # CAT-CAM-CAO-HAT + 861 3 2147 2149 2148 2154 # CAO-CAP-CAM-HAT + 862 4 2148 2150 2149 2155 # CAM-CAM-CAP-HAT + 863 3 2151 2149 2150 2156 # CAO-CAP-CAM-HAT + 864 2 2146 2150 2151 2157 # CAT-CAM-CAO-HAT + 865 1 2162 2166 2161 2167 # CAO-CAO-CAT-CTT + 866 2 2161 2163 2162 2168 # CAT-CAM-CAO-HAT + 867 3 2162 2164 2163 2169 # CAO-CAP-CAM-HAT + 868 4 2163 2165 2164 2170 # CAM-CAM-CAP-HAT + 869 3 2166 2164 2165 2171 # CAO-CAP-CAM-HAT + 870 2 2161 2165 2166 2172 # CAT-CAM-CAO-HAT + 871 1 2177 2181 2176 2182 # CAO-CAO-CAT-CTT + 872 2 2176 2178 2177 2183 # CAT-CAM-CAO-HAT + 873 3 2177 2179 2178 2184 # CAO-CAP-CAM-HAT + 874 4 2178 2180 2179 2185 # CAM-CAM-CAP-HAT + 875 3 2181 2179 2180 2186 # CAO-CAP-CAM-HAT + 876 2 2176 2180 2181 2187 # CAT-CAM-CAO-HAT + 877 1 2192 2196 2191 2197 # CAO-CAO-CAT-CTT + 878 2 2191 2193 2192 2198 # CAT-CAM-CAO-HAT + 879 3 2192 2194 2193 2199 # CAO-CAP-CAM-HAT + 880 4 2193 2195 2194 2200 # CAM-CAM-CAP-HAT + 881 3 2196 2194 2195 2201 # CAO-CAP-CAM-HAT + 882 2 2191 2195 2196 2202 # CAT-CAM-CAO-HAT + 883 1 2207 2211 2206 2212 # CAO-CAO-CAT-CTT + 884 2 2206 2208 2207 2213 # CAT-CAM-CAO-HAT + 885 3 2207 2209 2208 2214 # CAO-CAP-CAM-HAT + 886 4 2208 2210 2209 2215 # CAM-CAM-CAP-HAT + 887 3 2211 2209 2210 2216 # CAO-CAP-CAM-HAT + 888 2 2206 2210 2211 2217 # CAT-CAM-CAO-HAT + 889 1 2222 2226 2221 2227 # CAO-CAO-CAT-CTT + 890 2 2221 2223 2222 2228 # CAT-CAM-CAO-HAT + 891 3 2222 2224 2223 2229 # CAO-CAP-CAM-HAT + 892 4 2223 2225 2224 2230 # CAM-CAM-CAP-HAT + 893 3 2226 2224 2225 2231 # CAO-CAP-CAM-HAT + 894 2 2221 2225 2226 2232 # CAT-CAM-CAO-HAT + 895 1 2237 2241 2236 2242 # CAO-CAO-CAT-CTT + 896 2 2236 2238 2237 2243 # CAT-CAM-CAO-HAT + 897 3 2237 2239 2238 2244 # CAO-CAP-CAM-HAT + 898 4 2238 2240 2239 2245 # CAM-CAM-CAP-HAT + 899 3 2241 2239 2240 2246 # CAO-CAP-CAM-HAT + 900 2 2236 2240 2241 2247 # CAT-CAM-CAO-HAT + 901 1 2252 2256 2251 2257 # CAO-CAO-CAT-CTT + 902 2 2251 2253 2252 2258 # CAT-CAM-CAO-HAT + 903 3 2252 2254 2253 2259 # CAO-CAP-CAM-HAT + 904 4 2253 2255 2254 2260 # CAM-CAM-CAP-HAT + 905 3 2256 2254 2255 2261 # CAO-CAP-CAM-HAT + 906 2 2251 2255 2256 2262 # CAT-CAM-CAO-HAT + 907 1 2267 2271 2266 2272 # CAO-CAO-CAT-CTT + 908 2 2266 2268 2267 2273 # CAT-CAM-CAO-HAT + 909 3 2267 2269 2268 2274 # CAO-CAP-CAM-HAT + 910 4 2268 2270 2269 2275 # CAM-CAM-CAP-HAT + 911 3 2271 2269 2270 2276 # CAO-CAP-CAM-HAT + 912 2 2266 2270 2271 2277 # CAT-CAM-CAO-HAT + 913 1 2282 2286 2281 2287 # CAO-CAO-CAT-CTT + 914 2 2281 2283 2282 2288 # CAT-CAM-CAO-HAT + 915 3 2282 2284 2283 2289 # CAO-CAP-CAM-HAT + 916 4 2283 2285 2284 2290 # CAM-CAM-CAP-HAT + 917 3 2286 2284 2285 2291 # CAO-CAP-CAM-HAT + 918 2 2281 2285 2286 2292 # CAT-CAM-CAO-HAT + 919 1 2297 2301 2296 2302 # CAO-CAO-CAT-CTT + 920 2 2296 2298 2297 2303 # CAT-CAM-CAO-HAT + 921 3 2297 2299 2298 2304 # CAO-CAP-CAM-HAT + 922 4 2298 2300 2299 2305 # CAM-CAM-CAP-HAT + 923 3 2301 2299 2300 2306 # CAO-CAP-CAM-HAT + 924 2 2296 2300 2301 2307 # CAT-CAM-CAO-HAT + 925 1 2312 2316 2311 2317 # CAO-CAO-CAT-CTT + 926 2 2311 2313 2312 2318 # CAT-CAM-CAO-HAT + 927 3 2312 2314 2313 2319 # CAO-CAP-CAM-HAT + 928 4 2313 2315 2314 2320 # CAM-CAM-CAP-HAT + 929 3 2316 2314 2315 2321 # CAO-CAP-CAM-HAT + 930 2 2311 2315 2316 2322 # CAT-CAM-CAO-HAT + 931 1 2327 2331 2326 2332 # CAO-CAO-CAT-CTT + 932 2 2326 2328 2327 2333 # CAT-CAM-CAO-HAT + 933 3 2327 2329 2328 2334 # CAO-CAP-CAM-HAT + 934 4 2328 2330 2329 2335 # CAM-CAM-CAP-HAT + 935 3 2331 2329 2330 2336 # CAO-CAP-CAM-HAT + 936 2 2326 2330 2331 2337 # CAT-CAM-CAO-HAT + 937 1 2342 2346 2341 2347 # CAO-CAO-CAT-CTT + 938 2 2341 2343 2342 2348 # CAT-CAM-CAO-HAT + 939 3 2342 2344 2343 2349 # CAO-CAP-CAM-HAT + 940 4 2343 2345 2344 2350 # CAM-CAM-CAP-HAT + 941 3 2346 2344 2345 2351 # CAO-CAP-CAM-HAT + 942 2 2341 2345 2346 2352 # CAT-CAM-CAO-HAT + 943 1 2357 2361 2356 2362 # CAO-CAO-CAT-CTT + 944 2 2356 2358 2357 2363 # CAT-CAM-CAO-HAT + 945 3 2357 2359 2358 2364 # CAO-CAP-CAM-HAT + 946 4 2358 2360 2359 2365 # CAM-CAM-CAP-HAT + 947 3 2361 2359 2360 2366 # CAO-CAP-CAM-HAT + 948 2 2356 2360 2361 2367 # CAT-CAM-CAO-HAT + 949 1 2372 2376 2371 2377 # CAO-CAO-CAT-CTT + 950 2 2371 2373 2372 2378 # CAT-CAM-CAO-HAT + 951 3 2372 2374 2373 2379 # CAO-CAP-CAM-HAT + 952 4 2373 2375 2374 2380 # CAM-CAM-CAP-HAT + 953 3 2376 2374 2375 2381 # CAO-CAP-CAM-HAT + 954 2 2371 2375 2376 2382 # CAT-CAM-CAO-HAT + 955 1 2387 2391 2386 2392 # CAO-CAO-CAT-CTT + 956 2 2386 2388 2387 2393 # CAT-CAM-CAO-HAT + 957 3 2387 2389 2388 2394 # CAO-CAP-CAM-HAT + 958 4 2388 2390 2389 2395 # CAM-CAM-CAP-HAT + 959 3 2391 2389 2390 2396 # CAO-CAP-CAM-HAT + 960 2 2386 2390 2391 2397 # CAT-CAM-CAO-HAT + 961 1 2402 2406 2401 2407 # CAO-CAO-CAT-CTT + 962 2 2401 2403 2402 2408 # CAT-CAM-CAO-HAT + 963 3 2402 2404 2403 2409 # CAO-CAP-CAM-HAT + 964 4 2403 2405 2404 2410 # CAM-CAM-CAP-HAT + 965 3 2406 2404 2405 2411 # CAO-CAP-CAM-HAT + 966 2 2401 2405 2406 2412 # CAT-CAM-CAO-HAT + 967 1 2417 2421 2416 2422 # CAO-CAO-CAT-CTT + 968 2 2416 2418 2417 2423 # CAT-CAM-CAO-HAT + 969 3 2417 2419 2418 2424 # CAO-CAP-CAM-HAT + 970 4 2418 2420 2419 2425 # CAM-CAM-CAP-HAT + 971 3 2421 2419 2420 2426 # CAO-CAP-CAM-HAT + 972 2 2416 2420 2421 2427 # CAT-CAM-CAO-HAT + 973 1 2432 2436 2431 2437 # CAO-CAO-CAT-CTT + 974 2 2431 2433 2432 2438 # CAT-CAM-CAO-HAT + 975 3 2432 2434 2433 2439 # CAO-CAP-CAM-HAT + 976 4 2433 2435 2434 2440 # CAM-CAM-CAP-HAT + 977 3 2436 2434 2435 2441 # CAO-CAP-CAM-HAT + 978 2 2431 2435 2436 2442 # CAT-CAM-CAO-HAT + 979 1 2447 2451 2446 2452 # CAO-CAO-CAT-CTT + 980 2 2446 2448 2447 2453 # CAT-CAM-CAO-HAT + 981 3 2447 2449 2448 2454 # CAO-CAP-CAM-HAT + 982 4 2448 2450 2449 2455 # CAM-CAM-CAP-HAT + 983 3 2451 2449 2450 2456 # CAO-CAP-CAM-HAT + 984 2 2446 2450 2451 2457 # CAT-CAM-CAO-HAT + 985 1 2462 2466 2461 2467 # CAO-CAO-CAT-CTT + 986 2 2461 2463 2462 2468 # CAT-CAM-CAO-HAT + 987 3 2462 2464 2463 2469 # CAO-CAP-CAM-HAT + 988 4 2463 2465 2464 2470 # CAM-CAM-CAP-HAT + 989 3 2466 2464 2465 2471 # CAO-CAP-CAM-HAT + 990 2 2461 2465 2466 2472 # CAT-CAM-CAO-HAT + 991 1 2477 2481 2476 2482 # CAO-CAO-CAT-CTT + 992 2 2476 2478 2477 2483 # CAT-CAM-CAO-HAT + 993 3 2477 2479 2478 2484 # CAO-CAP-CAM-HAT + 994 4 2478 2480 2479 2485 # CAM-CAM-CAP-HAT + 995 3 2481 2479 2480 2486 # CAO-CAP-CAM-HAT + 996 2 2476 2480 2481 2487 # CAT-CAM-CAO-HAT + 997 1 2492 2496 2491 2497 # CAO-CAO-CAT-CTT + 998 2 2491 2493 2492 2498 # CAT-CAM-CAO-HAT + 999 3 2492 2494 2493 2499 # CAO-CAP-CAM-HAT + 1000 4 2493 2495 2494 2500 # CAM-CAM-CAP-HAT + 1001 3 2496 2494 2495 2501 # CAO-CAP-CAM-HAT + 1002 2 2491 2495 2496 2502 # CAT-CAM-CAO-HAT + 1003 1 2507 2511 2506 2512 # CAO-CAO-CAT-CTT + 1004 2 2506 2508 2507 2513 # CAT-CAM-CAO-HAT + 1005 3 2507 2509 2508 2514 # CAO-CAP-CAM-HAT + 1006 4 2508 2510 2509 2515 # CAM-CAM-CAP-HAT + 1007 3 2511 2509 2510 2516 # CAO-CAP-CAM-HAT + 1008 2 2506 2510 2511 2517 # CAT-CAM-CAO-HAT + 1009 1 2522 2526 2521 2527 # CAO-CAO-CAT-CTT + 1010 2 2521 2523 2522 2528 # CAT-CAM-CAO-HAT + 1011 3 2522 2524 2523 2529 # CAO-CAP-CAM-HAT + 1012 4 2523 2525 2524 2530 # CAM-CAM-CAP-HAT + 1013 3 2526 2524 2525 2531 # CAO-CAP-CAM-HAT + 1014 2 2521 2525 2526 2532 # CAT-CAM-CAO-HAT + 1015 1 2537 2541 2536 2542 # CAO-CAO-CAT-CTT + 1016 2 2536 2538 2537 2543 # CAT-CAM-CAO-HAT + 1017 3 2537 2539 2538 2544 # CAO-CAP-CAM-HAT + 1018 4 2538 2540 2539 2545 # CAM-CAM-CAP-HAT + 1019 3 2541 2539 2540 2546 # CAO-CAP-CAM-HAT + 1020 2 2536 2540 2541 2547 # CAT-CAM-CAO-HAT + 1021 1 2552 2556 2551 2557 # CAO-CAO-CAT-CTT + 1022 2 2551 2553 2552 2558 # CAT-CAM-CAO-HAT + 1023 3 2552 2554 2553 2559 # CAO-CAP-CAM-HAT + 1024 4 2553 2555 2554 2560 # CAM-CAM-CAP-HAT + 1025 3 2556 2554 2555 2561 # CAO-CAP-CAM-HAT + 1026 2 2551 2555 2556 2562 # CAT-CAM-CAO-HAT + 1027 1 2567 2571 2566 2572 # CAO-CAO-CAT-CTT + 1028 2 2566 2568 2567 2573 # CAT-CAM-CAO-HAT + 1029 3 2567 2569 2568 2574 # CAO-CAP-CAM-HAT + 1030 4 2568 2570 2569 2575 # CAM-CAM-CAP-HAT + 1031 3 2571 2569 2570 2576 # CAO-CAP-CAM-HAT + 1032 2 2566 2570 2571 2577 # CAT-CAM-CAO-HAT + 1033 1 2582 2586 2581 2587 # CAO-CAO-CAT-CTT + 1034 2 2581 2583 2582 2588 # CAT-CAM-CAO-HAT + 1035 3 2582 2584 2583 2589 # CAO-CAP-CAM-HAT + 1036 4 2583 2585 2584 2590 # CAM-CAM-CAP-HAT + 1037 3 2586 2584 2585 2591 # CAO-CAP-CAM-HAT + 1038 2 2581 2585 2586 2592 # CAT-CAM-CAO-HAT + 1039 1 2597 2601 2596 2602 # CAO-CAO-CAT-CTT + 1040 2 2596 2598 2597 2603 # CAT-CAM-CAO-HAT + 1041 3 2597 2599 2598 2604 # CAO-CAP-CAM-HAT + 1042 4 2598 2600 2599 2605 # CAM-CAM-CAP-HAT + 1043 3 2601 2599 2600 2606 # CAO-CAP-CAM-HAT + 1044 2 2596 2600 2601 2607 # CAT-CAM-CAO-HAT + 1045 1 2612 2616 2611 2617 # CAO-CAO-CAT-CTT + 1046 2 2611 2613 2612 2618 # CAT-CAM-CAO-HAT + 1047 3 2612 2614 2613 2619 # CAO-CAP-CAM-HAT + 1048 4 2613 2615 2614 2620 # CAM-CAM-CAP-HAT + 1049 3 2616 2614 2615 2621 # CAO-CAP-CAM-HAT + 1050 2 2611 2615 2616 2622 # CAT-CAM-CAO-HAT + 1051 1 2627 2631 2626 2632 # CAO-CAO-CAT-CTT + 1052 2 2626 2628 2627 2633 # CAT-CAM-CAO-HAT + 1053 3 2627 2629 2628 2634 # CAO-CAP-CAM-HAT + 1054 4 2628 2630 2629 2635 # CAM-CAM-CAP-HAT + 1055 3 2631 2629 2630 2636 # CAO-CAP-CAM-HAT + 1056 2 2626 2630 2631 2637 # CAT-CAM-CAO-HAT + 1057 1 2642 2646 2641 2647 # CAO-CAO-CAT-CTT + 1058 2 2641 2643 2642 2648 # CAT-CAM-CAO-HAT + 1059 3 2642 2644 2643 2649 # CAO-CAP-CAM-HAT + 1060 4 2643 2645 2644 2650 # CAM-CAM-CAP-HAT + 1061 3 2646 2644 2645 2651 # CAO-CAP-CAM-HAT + 1062 2 2641 2645 2646 2652 # CAT-CAM-CAO-HAT + 1063 1 2657 2661 2656 2662 # CAO-CAO-CAT-CTT + 1064 2 2656 2658 2657 2663 # CAT-CAM-CAO-HAT + 1065 3 2657 2659 2658 2664 # CAO-CAP-CAM-HAT + 1066 4 2658 2660 2659 2665 # CAM-CAM-CAP-HAT + 1067 3 2661 2659 2660 2666 # CAO-CAP-CAM-HAT + 1068 2 2656 2660 2661 2667 # CAT-CAM-CAO-HAT + 1069 1 2672 2676 2671 2677 # CAO-CAO-CAT-CTT + 1070 2 2671 2673 2672 2678 # CAT-CAM-CAO-HAT + 1071 3 2672 2674 2673 2679 # CAO-CAP-CAM-HAT + 1072 4 2673 2675 2674 2680 # CAM-CAM-CAP-HAT + 1073 3 2676 2674 2675 2681 # CAO-CAP-CAM-HAT + 1074 2 2671 2675 2676 2682 # CAT-CAM-CAO-HAT + 1075 1 2687 2691 2686 2692 # CAO-CAO-CAT-CTT + 1076 2 2686 2688 2687 2693 # CAT-CAM-CAO-HAT + 1077 3 2687 2689 2688 2694 # CAO-CAP-CAM-HAT + 1078 4 2688 2690 2689 2695 # CAM-CAM-CAP-HAT + 1079 3 2691 2689 2690 2696 # CAO-CAP-CAM-HAT + 1080 2 2686 2690 2691 2697 # CAT-CAM-CAO-HAT + 1081 1 2702 2706 2701 2707 # CAO-CAO-CAT-CTT + 1082 2 2701 2703 2702 2708 # CAT-CAM-CAO-HAT + 1083 3 2702 2704 2703 2709 # CAO-CAP-CAM-HAT + 1084 4 2703 2705 2704 2710 # CAM-CAM-CAP-HAT + 1085 3 2706 2704 2705 2711 # CAO-CAP-CAM-HAT + 1086 2 2701 2705 2706 2712 # CAT-CAM-CAO-HAT + 1087 1 2717 2721 2716 2722 # CAO-CAO-CAT-CTT + 1088 2 2716 2718 2717 2723 # CAT-CAM-CAO-HAT + 1089 3 2717 2719 2718 2724 # CAO-CAP-CAM-HAT + 1090 4 2718 2720 2719 2725 # CAM-CAM-CAP-HAT + 1091 3 2721 2719 2720 2726 # CAO-CAP-CAM-HAT + 1092 2 2716 2720 2721 2727 # CAT-CAM-CAO-HAT + 1093 1 2732 2736 2731 2737 # CAO-CAO-CAT-CTT + 1094 2 2731 2733 2732 2738 # CAT-CAM-CAO-HAT + 1095 3 2732 2734 2733 2739 # CAO-CAP-CAM-HAT + 1096 4 2733 2735 2734 2740 # CAM-CAM-CAP-HAT + 1097 3 2736 2734 2735 2741 # CAO-CAP-CAM-HAT + 1098 2 2731 2735 2736 2742 # CAT-CAM-CAO-HAT + 1099 1 2747 2751 2746 2752 # CAO-CAO-CAT-CTT + 1100 2 2746 2748 2747 2753 # CAT-CAM-CAO-HAT + 1101 3 2747 2749 2748 2754 # CAO-CAP-CAM-HAT + 1102 4 2748 2750 2749 2755 # CAM-CAM-CAP-HAT + 1103 3 2751 2749 2750 2756 # CAO-CAP-CAM-HAT + 1104 2 2746 2750 2751 2757 # CAT-CAM-CAO-HAT + 1105 1 2762 2766 2761 2767 # CAO-CAO-CAT-CTT + 1106 2 2761 2763 2762 2768 # CAT-CAM-CAO-HAT + 1107 3 2762 2764 2763 2769 # CAO-CAP-CAM-HAT + 1108 4 2763 2765 2764 2770 # CAM-CAM-CAP-HAT + 1109 3 2766 2764 2765 2771 # CAO-CAP-CAM-HAT + 1110 2 2761 2765 2766 2772 # CAT-CAM-CAO-HAT + 1111 1 2777 2781 2776 2782 # CAO-CAO-CAT-CTT + 1112 2 2776 2778 2777 2783 # CAT-CAM-CAO-HAT + 1113 3 2777 2779 2778 2784 # CAO-CAP-CAM-HAT + 1114 4 2778 2780 2779 2785 # CAM-CAM-CAP-HAT + 1115 3 2781 2779 2780 2786 # CAO-CAP-CAM-HAT + 1116 2 2776 2780 2781 2787 # CAT-CAM-CAO-HAT + 1117 1 2792 2796 2791 2797 # CAO-CAO-CAT-CTT + 1118 2 2791 2793 2792 2798 # CAT-CAM-CAO-HAT + 1119 3 2792 2794 2793 2799 # CAO-CAP-CAM-HAT + 1120 4 2793 2795 2794 2800 # CAM-CAM-CAP-HAT + 1121 3 2796 2794 2795 2801 # CAO-CAP-CAM-HAT + 1122 2 2791 2795 2796 2802 # CAT-CAM-CAO-HAT + 1123 1 2807 2811 2806 2812 # CAO-CAO-CAT-CTT + 1124 2 2806 2808 2807 2813 # CAT-CAM-CAO-HAT + 1125 3 2807 2809 2808 2814 # CAO-CAP-CAM-HAT + 1126 4 2808 2810 2809 2815 # CAM-CAM-CAP-HAT + 1127 3 2811 2809 2810 2816 # CAO-CAP-CAM-HAT + 1128 2 2806 2810 2811 2817 # CAT-CAM-CAO-HAT + 1129 1 2822 2826 2821 2827 # CAO-CAO-CAT-CTT + 1130 2 2821 2823 2822 2828 # CAT-CAM-CAO-HAT + 1131 3 2822 2824 2823 2829 # CAO-CAP-CAM-HAT + 1132 4 2823 2825 2824 2830 # CAM-CAM-CAP-HAT + 1133 3 2826 2824 2825 2831 # CAO-CAP-CAM-HAT + 1134 2 2821 2825 2826 2832 # CAT-CAM-CAO-HAT + 1135 1 2837 2841 2836 2842 # CAO-CAO-CAT-CTT + 1136 2 2836 2838 2837 2843 # CAT-CAM-CAO-HAT + 1137 3 2837 2839 2838 2844 # CAO-CAP-CAM-HAT + 1138 4 2838 2840 2839 2845 # CAM-CAM-CAP-HAT + 1139 3 2841 2839 2840 2846 # CAO-CAP-CAM-HAT + 1140 2 2836 2840 2841 2847 # CAT-CAM-CAO-HAT + 1141 1 2852 2856 2851 2857 # CAO-CAO-CAT-CTT + 1142 2 2851 2853 2852 2858 # CAT-CAM-CAO-HAT + 1143 3 2852 2854 2853 2859 # CAO-CAP-CAM-HAT + 1144 4 2853 2855 2854 2860 # CAM-CAM-CAP-HAT + 1145 3 2856 2854 2855 2861 # CAO-CAP-CAM-HAT + 1146 2 2851 2855 2856 2862 # CAT-CAM-CAO-HAT + 1147 1 2867 2871 2866 2872 # CAO-CAO-CAT-CTT + 1148 2 2866 2868 2867 2873 # CAT-CAM-CAO-HAT + 1149 3 2867 2869 2868 2874 # CAO-CAP-CAM-HAT + 1150 4 2868 2870 2869 2875 # CAM-CAM-CAP-HAT + 1151 3 2871 2869 2870 2876 # CAO-CAP-CAM-HAT + 1152 2 2866 2870 2871 2877 # CAT-CAM-CAO-HAT + 1153 1 2882 2886 2881 2887 # CAO-CAO-CAT-CTT + 1154 2 2881 2883 2882 2888 # CAT-CAM-CAO-HAT + 1155 3 2882 2884 2883 2889 # CAO-CAP-CAM-HAT + 1156 4 2883 2885 2884 2890 # CAM-CAM-CAP-HAT + 1157 3 2886 2884 2885 2891 # CAO-CAP-CAM-HAT + 1158 2 2881 2885 2886 2892 # CAT-CAM-CAO-HAT + 1159 1 2897 2901 2896 2902 # CAO-CAO-CAT-CTT + 1160 2 2896 2898 2897 2903 # CAT-CAM-CAO-HAT + 1161 3 2897 2899 2898 2904 # CAO-CAP-CAM-HAT + 1162 4 2898 2900 2899 2905 # CAM-CAM-CAP-HAT + 1163 3 2901 2899 2900 2906 # CAO-CAP-CAM-HAT + 1164 2 2896 2900 2901 2907 # CAT-CAM-CAO-HAT + 1165 1 2912 2916 2911 2917 # CAO-CAO-CAT-CTT + 1166 2 2911 2913 2912 2918 # CAT-CAM-CAO-HAT + 1167 3 2912 2914 2913 2919 # CAO-CAP-CAM-HAT + 1168 4 2913 2915 2914 2920 # CAM-CAM-CAP-HAT + 1169 3 2916 2914 2915 2921 # CAO-CAP-CAM-HAT + 1170 2 2911 2915 2916 2922 # CAT-CAM-CAO-HAT + 1171 1 2927 2931 2926 2932 # CAO-CAO-CAT-CTT + 1172 2 2926 2928 2927 2933 # CAT-CAM-CAO-HAT + 1173 3 2927 2929 2928 2934 # CAO-CAP-CAM-HAT + 1174 4 2928 2930 2929 2935 # CAM-CAM-CAP-HAT + 1175 3 2931 2929 2930 2936 # CAO-CAP-CAM-HAT + 1176 2 2926 2930 2931 2937 # CAT-CAM-CAO-HAT + 1177 1 2942 2946 2941 2947 # CAO-CAO-CAT-CTT + 1178 2 2941 2943 2942 2948 # CAT-CAM-CAO-HAT + 1179 3 2942 2944 2943 2949 # CAO-CAP-CAM-HAT + 1180 4 2943 2945 2944 2950 # CAM-CAM-CAP-HAT + 1181 3 2946 2944 2945 2951 # CAO-CAP-CAM-HAT + 1182 2 2941 2945 2946 2952 # CAT-CAM-CAO-HAT + 1183 1 2957 2961 2956 2962 # CAO-CAO-CAT-CTT + 1184 2 2956 2958 2957 2963 # CAT-CAM-CAO-HAT + 1185 3 2957 2959 2958 2964 # CAO-CAP-CAM-HAT + 1186 4 2958 2960 2959 2965 # CAM-CAM-CAP-HAT + 1187 3 2961 2959 2960 2966 # CAO-CAP-CAM-HAT + 1188 2 2956 2960 2961 2967 # CAT-CAM-CAO-HAT + 1189 1 2972 2976 2971 2977 # CAO-CAO-CAT-CTT + 1190 2 2971 2973 2972 2978 # CAT-CAM-CAO-HAT + 1191 3 2972 2974 2973 2979 # CAO-CAP-CAM-HAT + 1192 4 2973 2975 2974 2980 # CAM-CAM-CAP-HAT + 1193 3 2976 2974 2975 2981 # CAO-CAP-CAM-HAT + 1194 2 2971 2975 2976 2982 # CAT-CAM-CAO-HAT + 1195 1 2987 2991 2986 2992 # CAO-CAO-CAT-CTT + 1196 2 2986 2988 2987 2993 # CAT-CAM-CAO-HAT + 1197 3 2987 2989 2988 2994 # CAO-CAP-CAM-HAT + 1198 4 2988 2990 2989 2995 # CAM-CAM-CAP-HAT + 1199 3 2991 2989 2990 2996 # CAO-CAP-CAM-HAT + 1200 2 2986 2990 2991 2997 # CAT-CAM-CAO-HAT + 1201 1 3002 3006 3001 3007 # CAO-CAO-CAT-CTT + 1202 2 3001 3003 3002 3008 # CAT-CAM-CAO-HAT + 1203 3 3002 3004 3003 3009 # CAO-CAP-CAM-HAT + 1204 4 3003 3005 3004 3010 # CAM-CAM-CAP-HAT + 1205 3 3006 3004 3005 3011 # CAO-CAP-CAM-HAT + 1206 2 3001 3005 3006 3012 # CAT-CAM-CAO-HAT + 1207 1 3017 3021 3016 3022 # CAO-CAO-CAT-CTT + 1208 2 3016 3018 3017 3023 # CAT-CAM-CAO-HAT + 1209 3 3017 3019 3018 3024 # CAO-CAP-CAM-HAT + 1210 4 3018 3020 3019 3025 # CAM-CAM-CAP-HAT + 1211 3 3021 3019 3020 3026 # CAO-CAP-CAM-HAT + 1212 2 3016 3020 3021 3027 # CAT-CAM-CAO-HAT + 1213 1 3032 3036 3031 3037 # CAO-CAO-CAT-CTT + 1214 2 3031 3033 3032 3038 # CAT-CAM-CAO-HAT + 1215 3 3032 3034 3033 3039 # CAO-CAP-CAM-HAT + 1216 4 3033 3035 3034 3040 # CAM-CAM-CAP-HAT + 1217 3 3036 3034 3035 3041 # CAO-CAP-CAM-HAT + 1218 2 3031 3035 3036 3042 # CAT-CAM-CAO-HAT + 1219 1 3047 3051 3046 3052 # CAO-CAO-CAT-CTT + 1220 2 3046 3048 3047 3053 # CAT-CAM-CAO-HAT + 1221 3 3047 3049 3048 3054 # CAO-CAP-CAM-HAT + 1222 4 3048 3050 3049 3055 # CAM-CAM-CAP-HAT + 1223 3 3051 3049 3050 3056 # CAO-CAP-CAM-HAT + 1224 2 3046 3050 3051 3057 # CAT-CAM-CAO-HAT + 1225 1 3062 3066 3061 3067 # CAO-CAO-CAT-CTT + 1226 2 3061 3063 3062 3068 # CAT-CAM-CAO-HAT + 1227 3 3062 3064 3063 3069 # CAO-CAP-CAM-HAT + 1228 4 3063 3065 3064 3070 # CAM-CAM-CAP-HAT + 1229 3 3066 3064 3065 3071 # CAO-CAP-CAM-HAT + 1230 2 3061 3065 3066 3072 # CAT-CAM-CAO-HAT + 1231 1 3077 3081 3076 3082 # CAO-CAO-CAT-CTT + 1232 2 3076 3078 3077 3083 # CAT-CAM-CAO-HAT + 1233 3 3077 3079 3078 3084 # CAO-CAP-CAM-HAT + 1234 4 3078 3080 3079 3085 # CAM-CAM-CAP-HAT + 1235 3 3081 3079 3080 3086 # CAO-CAP-CAM-HAT + 1236 2 3076 3080 3081 3087 # CAT-CAM-CAO-HAT + 1237 1 3092 3096 3091 3097 # CAO-CAO-CAT-CTT + 1238 2 3091 3093 3092 3098 # CAT-CAM-CAO-HAT + 1239 3 3092 3094 3093 3099 # CAO-CAP-CAM-HAT + 1240 4 3093 3095 3094 3100 # CAM-CAM-CAP-HAT + 1241 3 3096 3094 3095 3101 # CAO-CAP-CAM-HAT + 1242 2 3091 3095 3096 3102 # CAT-CAM-CAO-HAT + 1243 1 3107 3111 3106 3112 # CAO-CAO-CAT-CTT + 1244 2 3106 3108 3107 3113 # CAT-CAM-CAO-HAT + 1245 3 3107 3109 3108 3114 # CAO-CAP-CAM-HAT + 1246 4 3108 3110 3109 3115 # CAM-CAM-CAP-HAT + 1247 3 3111 3109 3110 3116 # CAO-CAP-CAM-HAT + 1248 2 3106 3110 3111 3117 # CAT-CAM-CAO-HAT + 1249 1 3122 3126 3121 3127 # CAO-CAO-CAT-CTT + 1250 2 3121 3123 3122 3128 # CAT-CAM-CAO-HAT + 1251 3 3122 3124 3123 3129 # CAO-CAP-CAM-HAT + 1252 4 3123 3125 3124 3130 # CAM-CAM-CAP-HAT + 1253 3 3126 3124 3125 3131 # CAO-CAP-CAM-HAT + 1254 2 3121 3125 3126 3132 # CAT-CAM-CAO-HAT + 1255 1 3137 3141 3136 3142 # CAO-CAO-CAT-CTT + 1256 2 3136 3138 3137 3143 # CAT-CAM-CAO-HAT + 1257 3 3137 3139 3138 3144 # CAO-CAP-CAM-HAT + 1258 4 3138 3140 3139 3145 # CAM-CAM-CAP-HAT + 1259 3 3141 3139 3140 3146 # CAO-CAP-CAM-HAT + 1260 2 3136 3140 3141 3147 # CAT-CAM-CAO-HAT + 1261 1 3152 3156 3151 3157 # CAO-CAO-CAT-CTT + 1262 2 3151 3153 3152 3158 # CAT-CAM-CAO-HAT + 1263 3 3152 3154 3153 3159 # CAO-CAP-CAM-HAT + 1264 4 3153 3155 3154 3160 # CAM-CAM-CAP-HAT + 1265 3 3156 3154 3155 3161 # CAO-CAP-CAM-HAT + 1266 2 3151 3155 3156 3162 # CAT-CAM-CAO-HAT + 1267 1 3167 3171 3166 3172 # CAO-CAO-CAT-CTT + 1268 2 3166 3168 3167 3173 # CAT-CAM-CAO-HAT + 1269 3 3167 3169 3168 3174 # CAO-CAP-CAM-HAT + 1270 4 3168 3170 3169 3175 # CAM-CAM-CAP-HAT + 1271 3 3171 3169 3170 3176 # CAO-CAP-CAM-HAT + 1272 2 3166 3170 3171 3177 # CAT-CAM-CAO-HAT + 1273 1 3182 3186 3181 3187 # CAO-CAO-CAT-CTT + 1274 2 3181 3183 3182 3188 # CAT-CAM-CAO-HAT + 1275 3 3182 3184 3183 3189 # CAO-CAP-CAM-HAT + 1276 4 3183 3185 3184 3190 # CAM-CAM-CAP-HAT + 1277 3 3186 3184 3185 3191 # CAO-CAP-CAM-HAT + 1278 2 3181 3185 3186 3192 # CAT-CAM-CAO-HAT + 1279 1 3197 3201 3196 3202 # CAO-CAO-CAT-CTT + 1280 2 3196 3198 3197 3203 # CAT-CAM-CAO-HAT + 1281 3 3197 3199 3198 3204 # CAO-CAP-CAM-HAT + 1282 4 3198 3200 3199 3205 # CAM-CAM-CAP-HAT + 1283 3 3201 3199 3200 3206 # CAO-CAP-CAM-HAT + 1284 2 3196 3200 3201 3207 # CAT-CAM-CAO-HAT + 1285 1 3212 3216 3211 3217 # CAO-CAO-CAT-CTT + 1286 2 3211 3213 3212 3218 # CAT-CAM-CAO-HAT + 1287 3 3212 3214 3213 3219 # CAO-CAP-CAM-HAT + 1288 4 3213 3215 3214 3220 # CAM-CAM-CAP-HAT + 1289 3 3216 3214 3215 3221 # CAO-CAP-CAM-HAT + 1290 2 3211 3215 3216 3222 # CAT-CAM-CAO-HAT + 1291 1 3227 3231 3226 3232 # CAO-CAO-CAT-CTT + 1292 2 3226 3228 3227 3233 # CAT-CAM-CAO-HAT + 1293 3 3227 3229 3228 3234 # CAO-CAP-CAM-HAT + 1294 4 3228 3230 3229 3235 # CAM-CAM-CAP-HAT + 1295 3 3231 3229 3230 3236 # CAO-CAP-CAM-HAT + 1296 2 3226 3230 3231 3237 # CAT-CAM-CAO-HAT + 1297 1 3242 3246 3241 3247 # CAO-CAO-CAT-CTT + 1298 2 3241 3243 3242 3248 # CAT-CAM-CAO-HAT + 1299 3 3242 3244 3243 3249 # CAO-CAP-CAM-HAT + 1300 4 3243 3245 3244 3250 # CAM-CAM-CAP-HAT + 1301 3 3246 3244 3245 3251 # CAO-CAP-CAM-HAT + 1302 2 3241 3245 3246 3252 # CAT-CAM-CAO-HAT + 1303 1 3257 3261 3256 3262 # CAO-CAO-CAT-CTT + 1304 2 3256 3258 3257 3263 # CAT-CAM-CAO-HAT + 1305 3 3257 3259 3258 3264 # CAO-CAP-CAM-HAT + 1306 4 3258 3260 3259 3265 # CAM-CAM-CAP-HAT + 1307 3 3261 3259 3260 3266 # CAO-CAP-CAM-HAT + 1308 2 3256 3260 3261 3267 # CAT-CAM-CAO-HAT + 1309 1 3272 3276 3271 3277 # CAO-CAO-CAT-CTT + 1310 2 3271 3273 3272 3278 # CAT-CAM-CAO-HAT + 1311 3 3272 3274 3273 3279 # CAO-CAP-CAM-HAT + 1312 4 3273 3275 3274 3280 # CAM-CAM-CAP-HAT + 1313 3 3276 3274 3275 3281 # CAO-CAP-CAM-HAT + 1314 2 3271 3275 3276 3282 # CAT-CAM-CAO-HAT + 1315 1 3287 3291 3286 3292 # CAO-CAO-CAT-CTT + 1316 2 3286 3288 3287 3293 # CAT-CAM-CAO-HAT + 1317 3 3287 3289 3288 3294 # CAO-CAP-CAM-HAT + 1318 4 3288 3290 3289 3295 # CAM-CAM-CAP-HAT + 1319 3 3291 3289 3290 3296 # CAO-CAP-CAM-HAT + 1320 2 3286 3290 3291 3297 # CAT-CAM-CAO-HAT + 1321 1 3302 3306 3301 3307 # CAO-CAO-CAT-CTT + 1322 2 3301 3303 3302 3308 # CAT-CAM-CAO-HAT + 1323 3 3302 3304 3303 3309 # CAO-CAP-CAM-HAT + 1324 4 3303 3305 3304 3310 # CAM-CAM-CAP-HAT + 1325 3 3306 3304 3305 3311 # CAO-CAP-CAM-HAT + 1326 2 3301 3305 3306 3312 # CAT-CAM-CAO-HAT + 1327 1 3317 3321 3316 3322 # CAO-CAO-CAT-CTT + 1328 2 3316 3318 3317 3323 # CAT-CAM-CAO-HAT + 1329 3 3317 3319 3318 3324 # CAO-CAP-CAM-HAT + 1330 4 3318 3320 3319 3325 # CAM-CAM-CAP-HAT + 1331 3 3321 3319 3320 3326 # CAO-CAP-CAM-HAT + 1332 2 3316 3320 3321 3327 # CAT-CAM-CAO-HAT + 1333 1 3332 3336 3331 3337 # CAO-CAO-CAT-CTT + 1334 2 3331 3333 3332 3338 # CAT-CAM-CAO-HAT + 1335 3 3332 3334 3333 3339 # CAO-CAP-CAM-HAT + 1336 4 3333 3335 3334 3340 # CAM-CAM-CAP-HAT + 1337 3 3336 3334 3335 3341 # CAO-CAP-CAM-HAT + 1338 2 3331 3335 3336 3342 # CAT-CAM-CAO-HAT + 1339 1 3347 3351 3346 3352 # CAO-CAO-CAT-CTT + 1340 2 3346 3348 3347 3353 # CAT-CAM-CAO-HAT + 1341 3 3347 3349 3348 3354 # CAO-CAP-CAM-HAT + 1342 4 3348 3350 3349 3355 # CAM-CAM-CAP-HAT + 1343 3 3351 3349 3350 3356 # CAO-CAP-CAM-HAT + 1344 2 3346 3350 3351 3357 # CAT-CAM-CAO-HAT + 1345 1 3362 3366 3361 3367 # CAO-CAO-CAT-CTT + 1346 2 3361 3363 3362 3368 # CAT-CAM-CAO-HAT + 1347 3 3362 3364 3363 3369 # CAO-CAP-CAM-HAT + 1348 4 3363 3365 3364 3370 # CAM-CAM-CAP-HAT + 1349 3 3366 3364 3365 3371 # CAO-CAP-CAM-HAT + 1350 2 3361 3365 3366 3372 # CAT-CAM-CAO-HAT + 1351 1 3377 3381 3376 3382 # CAO-CAO-CAT-CTT + 1352 2 3376 3378 3377 3383 # CAT-CAM-CAO-HAT + 1353 3 3377 3379 3378 3384 # CAO-CAP-CAM-HAT + 1354 4 3378 3380 3379 3385 # CAM-CAM-CAP-HAT + 1355 3 3381 3379 3380 3386 # CAO-CAP-CAM-HAT + 1356 2 3376 3380 3381 3387 # CAT-CAM-CAO-HAT + 1357 1 3392 3396 3391 3397 # CAO-CAO-CAT-CTT + 1358 2 3391 3393 3392 3398 # CAT-CAM-CAO-HAT + 1359 3 3392 3394 3393 3399 # CAO-CAP-CAM-HAT + 1360 4 3393 3395 3394 3400 # CAM-CAM-CAP-HAT + 1361 3 3396 3394 3395 3401 # CAO-CAP-CAM-HAT + 1362 2 3391 3395 3396 3402 # CAT-CAM-CAO-HAT + 1363 1 3407 3411 3406 3412 # CAO-CAO-CAT-CTT + 1364 2 3406 3408 3407 3413 # CAT-CAM-CAO-HAT + 1365 3 3407 3409 3408 3414 # CAO-CAP-CAM-HAT + 1366 4 3408 3410 3409 3415 # CAM-CAM-CAP-HAT + 1367 3 3411 3409 3410 3416 # CAO-CAP-CAM-HAT + 1368 2 3406 3410 3411 3417 # CAT-CAM-CAO-HAT + 1369 1 3422 3426 3421 3427 # CAO-CAO-CAT-CTT + 1370 2 3421 3423 3422 3428 # CAT-CAM-CAO-HAT + 1371 3 3422 3424 3423 3429 # CAO-CAP-CAM-HAT + 1372 4 3423 3425 3424 3430 # CAM-CAM-CAP-HAT + 1373 3 3426 3424 3425 3431 # CAO-CAP-CAM-HAT + 1374 2 3421 3425 3426 3432 # CAT-CAM-CAO-HAT + 1375 1 3437 3441 3436 3442 # CAO-CAO-CAT-CTT + 1376 2 3436 3438 3437 3443 # CAT-CAM-CAO-HAT + 1377 3 3437 3439 3438 3444 # CAO-CAP-CAM-HAT + 1378 4 3438 3440 3439 3445 # CAM-CAM-CAP-HAT + 1379 3 3441 3439 3440 3446 # CAO-CAP-CAM-HAT + 1380 2 3436 3440 3441 3447 # CAT-CAM-CAO-HAT + 1381 1 3452 3456 3451 3457 # CAO-CAO-CAT-CTT + 1382 2 3451 3453 3452 3458 # CAT-CAM-CAO-HAT + 1383 3 3452 3454 3453 3459 # CAO-CAP-CAM-HAT + 1384 4 3453 3455 3454 3460 # CAM-CAM-CAP-HAT + 1385 3 3456 3454 3455 3461 # CAO-CAP-CAM-HAT + 1386 2 3451 3455 3456 3462 # CAT-CAM-CAO-HAT + 1387 1 3467 3471 3466 3472 # CAO-CAO-CAT-CTT + 1388 2 3466 3468 3467 3473 # CAT-CAM-CAO-HAT + 1389 3 3467 3469 3468 3474 # CAO-CAP-CAM-HAT + 1390 4 3468 3470 3469 3475 # CAM-CAM-CAP-HAT + 1391 3 3471 3469 3470 3476 # CAO-CAP-CAM-HAT + 1392 2 3466 3470 3471 3477 # CAT-CAM-CAO-HAT + 1393 1 3482 3486 3481 3487 # CAO-CAO-CAT-CTT + 1394 2 3481 3483 3482 3488 # CAT-CAM-CAO-HAT + 1395 3 3482 3484 3483 3489 # CAO-CAP-CAM-HAT + 1396 4 3483 3485 3484 3490 # CAM-CAM-CAP-HAT + 1397 3 3486 3484 3485 3491 # CAO-CAP-CAM-HAT + 1398 2 3481 3485 3486 3492 # CAT-CAM-CAO-HAT + 1399 1 3497 3501 3496 3502 # CAO-CAO-CAT-CTT + 1400 2 3496 3498 3497 3503 # CAT-CAM-CAO-HAT + 1401 3 3497 3499 3498 3504 # CAO-CAP-CAM-HAT + 1402 4 3498 3500 3499 3505 # CAM-CAM-CAP-HAT + 1403 3 3501 3499 3500 3506 # CAO-CAP-CAM-HAT + 1404 2 3496 3500 3501 3507 # CAT-CAM-CAO-HAT + 1405 1 3512 3516 3511 3517 # CAO-CAO-CAT-CTT + 1406 2 3511 3513 3512 3518 # CAT-CAM-CAO-HAT + 1407 3 3512 3514 3513 3519 # CAO-CAP-CAM-HAT + 1408 4 3513 3515 3514 3520 # CAM-CAM-CAP-HAT + 1409 3 3516 3514 3515 3521 # CAO-CAP-CAM-HAT + 1410 2 3511 3515 3516 3522 # CAT-CAM-CAO-HAT + 1411 1 3527 3531 3526 3532 # CAO-CAO-CAT-CTT + 1412 2 3526 3528 3527 3533 # CAT-CAM-CAO-HAT + 1413 3 3527 3529 3528 3534 # CAO-CAP-CAM-HAT + 1414 4 3528 3530 3529 3535 # CAM-CAM-CAP-HAT + 1415 3 3531 3529 3530 3536 # CAO-CAP-CAM-HAT + 1416 2 3526 3530 3531 3537 # CAT-CAM-CAO-HAT + 1417 1 3542 3546 3541 3547 # CAO-CAO-CAT-CTT + 1418 2 3541 3543 3542 3548 # CAT-CAM-CAO-HAT + 1419 3 3542 3544 3543 3549 # CAO-CAP-CAM-HAT + 1420 4 3543 3545 3544 3550 # CAM-CAM-CAP-HAT + 1421 3 3546 3544 3545 3551 # CAO-CAP-CAM-HAT + 1422 2 3541 3545 3546 3552 # CAT-CAM-CAO-HAT + 1423 1 3557 3561 3556 3562 # CAO-CAO-CAT-CTT + 1424 2 3556 3558 3557 3563 # CAT-CAM-CAO-HAT + 1425 3 3557 3559 3558 3564 # CAO-CAP-CAM-HAT + 1426 4 3558 3560 3559 3565 # CAM-CAM-CAP-HAT + 1427 3 3561 3559 3560 3566 # CAO-CAP-CAM-HAT + 1428 2 3556 3560 3561 3567 # CAT-CAM-CAO-HAT + 1429 1 3572 3576 3571 3577 # CAO-CAO-CAT-CTT + 1430 2 3571 3573 3572 3578 # CAT-CAM-CAO-HAT + 1431 3 3572 3574 3573 3579 # CAO-CAP-CAM-HAT + 1432 4 3573 3575 3574 3580 # CAM-CAM-CAP-HAT + 1433 3 3576 3574 3575 3581 # CAO-CAP-CAM-HAT + 1434 2 3571 3575 3576 3582 # CAT-CAM-CAO-HAT + 1435 1 3587 3591 3586 3592 # CAO-CAO-CAT-CTT + 1436 2 3586 3588 3587 3593 # CAT-CAM-CAO-HAT + 1437 3 3587 3589 3588 3594 # CAO-CAP-CAM-HAT + 1438 4 3588 3590 3589 3595 # CAM-CAM-CAP-HAT + 1439 3 3591 3589 3590 3596 # CAO-CAP-CAM-HAT + 1440 2 3586 3590 3591 3597 # CAT-CAM-CAO-HAT + 1441 1 3602 3606 3601 3607 # CAO-CAO-CAT-CTT + 1442 2 3601 3603 3602 3608 # CAT-CAM-CAO-HAT + 1443 3 3602 3604 3603 3609 # CAO-CAP-CAM-HAT + 1444 4 3603 3605 3604 3610 # CAM-CAM-CAP-HAT + 1445 3 3606 3604 3605 3611 # CAO-CAP-CAM-HAT + 1446 2 3601 3605 3606 3612 # CAT-CAM-CAO-HAT + 1447 1 3617 3621 3616 3622 # CAO-CAO-CAT-CTT + 1448 2 3616 3618 3617 3623 # CAT-CAM-CAO-HAT + 1449 3 3617 3619 3618 3624 # CAO-CAP-CAM-HAT + 1450 4 3618 3620 3619 3625 # CAM-CAM-CAP-HAT + 1451 3 3621 3619 3620 3626 # CAO-CAP-CAM-HAT + 1452 2 3616 3620 3621 3627 # CAT-CAM-CAO-HAT + 1453 1 3632 3636 3631 3637 # CAO-CAO-CAT-CTT + 1454 2 3631 3633 3632 3638 # CAT-CAM-CAO-HAT + 1455 3 3632 3634 3633 3639 # CAO-CAP-CAM-HAT + 1456 4 3633 3635 3634 3640 # CAM-CAM-CAP-HAT + 1457 3 3636 3634 3635 3641 # CAO-CAP-CAM-HAT + 1458 2 3631 3635 3636 3642 # CAT-CAM-CAO-HAT + 1459 1 3647 3651 3646 3652 # CAO-CAO-CAT-CTT + 1460 2 3646 3648 3647 3653 # CAT-CAM-CAO-HAT + 1461 3 3647 3649 3648 3654 # CAO-CAP-CAM-HAT + 1462 4 3648 3650 3649 3655 # CAM-CAM-CAP-HAT + 1463 3 3651 3649 3650 3656 # CAO-CAP-CAM-HAT + 1464 2 3646 3650 3651 3657 # CAT-CAM-CAO-HAT + 1465 1 3662 3666 3661 3667 # CAO-CAO-CAT-CTT + 1466 2 3661 3663 3662 3668 # CAT-CAM-CAO-HAT + 1467 3 3662 3664 3663 3669 # CAO-CAP-CAM-HAT + 1468 4 3663 3665 3664 3670 # CAM-CAM-CAP-HAT + 1469 3 3666 3664 3665 3671 # CAO-CAP-CAM-HAT + 1470 2 3661 3665 3666 3672 # CAT-CAM-CAO-HAT + 1471 1 3677 3681 3676 3682 # CAO-CAO-CAT-CTT + 1472 2 3676 3678 3677 3683 # CAT-CAM-CAO-HAT + 1473 3 3677 3679 3678 3684 # CAO-CAP-CAM-HAT + 1474 4 3678 3680 3679 3685 # CAM-CAM-CAP-HAT + 1475 3 3681 3679 3680 3686 # CAO-CAP-CAM-HAT + 1476 2 3676 3680 3681 3687 # CAT-CAM-CAO-HAT + 1477 1 3692 3696 3691 3697 # CAO-CAO-CAT-CTT + 1478 2 3691 3693 3692 3698 # CAT-CAM-CAO-HAT + 1479 3 3692 3694 3693 3699 # CAO-CAP-CAM-HAT + 1480 4 3693 3695 3694 3700 # CAM-CAM-CAP-HAT + 1481 3 3696 3694 3695 3701 # CAO-CAP-CAM-HAT + 1482 2 3691 3695 3696 3702 # CAT-CAM-CAO-HAT + 1483 1 3707 3711 3706 3712 # CAO-CAO-CAT-CTT + 1484 2 3706 3708 3707 3713 # CAT-CAM-CAO-HAT + 1485 3 3707 3709 3708 3714 # CAO-CAP-CAM-HAT + 1486 4 3708 3710 3709 3715 # CAM-CAM-CAP-HAT + 1487 3 3711 3709 3710 3716 # CAO-CAP-CAM-HAT + 1488 2 3706 3710 3711 3717 # CAT-CAM-CAO-HAT + 1489 1 3722 3726 3721 3727 # CAO-CAO-CAT-CTT + 1490 2 3721 3723 3722 3728 # CAT-CAM-CAO-HAT + 1491 3 3722 3724 3723 3729 # CAO-CAP-CAM-HAT + 1492 4 3723 3725 3724 3730 # CAM-CAM-CAP-HAT + 1493 3 3726 3724 3725 3731 # CAO-CAP-CAM-HAT + 1494 2 3721 3725 3726 3732 # CAT-CAM-CAO-HAT + 1495 1 3737 3741 3736 3742 # CAO-CAO-CAT-CTT + 1496 2 3736 3738 3737 3743 # CAT-CAM-CAO-HAT + 1497 3 3737 3739 3738 3744 # CAO-CAP-CAM-HAT + 1498 4 3738 3740 3739 3745 # CAM-CAM-CAP-HAT + 1499 3 3741 3739 3740 3746 # CAO-CAP-CAM-HAT + 1500 2 3736 3740 3741 3747 # CAT-CAM-CAO-HAT + diff --git a/examples/USER/drude/toluene/in.toluene.lang b/examples/USER/drude/toluene/in.toluene.lang new file mode 100644 index 0000000000..8f00c24a4b --- /dev/null +++ b/examples/USER/drude/toluene/in.toluene.lang @@ -0,0 +1,116 @@ +# 250 toluene system for drude polarizability example (Langevin) + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic +dihedral_style opls +improper_style opls +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/thole/long 2.600 8.0 8.0 +pair_modify mix geometric tail yes +kspace_style pppm 1.0e-4 + +read_data data.toluene extra/special/per/atom 1 + +comm_modify vel yes + +group gTOLUENE molecule 1:250 +group gCORES type 1 2 3 4 5 6 7 +group gDRUDES type 8 9 10 11 12 + +pair_coeff 1 1 0.069998 3.550000 1.620000 # CAT CAT +pair_coeff 1 2 0.069998 3.550000 1.620000 # CAT CAO +pair_coeff 1 3 0.069998 3.550000 1.620000 # CAT CAM +pair_coeff 1 4 0.069998 3.550000 1.620000 # CAT CAP +pair_coeff 1 5 0.067968 3.524911 1.620000 # CAT CTT +pair_coeff 1 6 0.045825 2.931041 0.000000 # CAT HAT +pair_coeff 1 7 0.045825 2.931041 0.000000 # CAT HT +pair_coeff 2 2 0.069998 3.550000 1.620000 # CAO CAO +pair_coeff 2 3 0.069998 3.550000 1.620000 # CAO CAM +pair_coeff 2 4 0.069998 3.550000 1.620000 # CAO CAP +pair_coeff 2 5 0.067968 3.524911 1.620000 # CAO CTT +pair_coeff 2 6 0.045825 2.931041 0.000000 # CAO HAT +pair_coeff 2 7 0.045825 2.931041 0.000000 # CAO HT +pair_coeff 3 3 0.069998 3.550000 1.620000 # CAM CAM +pair_coeff 3 4 0.069998 3.550000 1.620000 # CAM CAP +pair_coeff 3 5 0.067968 3.524911 1.620000 # CAM CTT +pair_coeff 3 6 0.045825 2.931041 0.000000 # CAM HAT +pair_coeff 3 7 0.045825 2.931041 0.000000 # CAM HT +pair_coeff 4 4 0.069998 3.550000 1.620000 # CAP CAP +pair_coeff 4 5 0.067968 3.524911 1.620000 # CAP CTT +pair_coeff 4 6 0.045825 2.931041 0.000000 # CAP HAT +pair_coeff 4 7 0.045825 2.931041 0.000000 # CAP HT +pair_coeff 5 5 0.065997 3.500000 1.620000 # CTT CTT +pair_coeff 5 6 0.044496 2.910326 0.000000 # CTT HAT +pair_coeff 5 7 0.044496 2.910326 0.000000 # CTT HT +pair_coeff 6 6 0.029999 2.420000 0.000000 # HAT HAT +pair_coeff 6 7 0.029999 2.420000 0.000000 # HAT HT +pair_coeff 7 7 0.029999 2.420000 0.000000 # HT HT +pair_coeff 1 8 0.000000 0.000000 1.620000 # CAT D_CAT +pair_coeff 1 9 0.000000 0.000000 1.620000 # CAT D_CAO +pair_coeff 1 10 0.000000 0.000000 1.620000 # CAT D_CAM +pair_coeff 1 11 0.000000 0.000000 1.620000 # CAT D_CAP +pair_coeff 1 12 0.000000 0.000000 1.620000 # CAT D_CTT +pair_coeff 2 8 0.000000 0.000000 1.620000 # CAO D_CAT +pair_coeff 2 9 0.000000 0.000000 1.620000 # CAO D_CAO +pair_coeff 2 10 0.000000 0.000000 1.620000 # CAO D_CAM +pair_coeff 2 11 0.000000 0.000000 1.620000 # CAO D_CAP +pair_coeff 2 12 0.000000 0.000000 1.620000 # CAO D_CTT +pair_coeff 3 8 0.000000 0.000000 1.620000 # CAM D_CAT +pair_coeff 3 9 0.000000 0.000000 1.620000 # CAM D_CAO +pair_coeff 3 10 0.000000 0.000000 1.620000 # CAM D_CAM +pair_coeff 3 11 0.000000 0.000000 1.620000 # CAM D_CAP +pair_coeff 3 12 0.000000 0.000000 1.620000 # CAM D_CTT +pair_coeff 4 8 0.000000 0.000000 1.620000 # CAP D_CAT +pair_coeff 4 9 0.000000 0.000000 1.620000 # CAP D_CAO +pair_coeff 4 10 0.000000 0.000000 1.620000 # CAP D_CAM +pair_coeff 4 11 0.000000 0.000000 1.620000 # CAP D_CAP +pair_coeff 4 12 0.000000 0.000000 1.620000 # CAP D_CTT +pair_coeff 5 8 0.000000 0.000000 1.620000 # CTT D_CAT +pair_coeff 5 9 0.000000 0.000000 1.620000 # CTT D_CAO +pair_coeff 5 10 0.000000 0.000000 1.620000 # CTT D_CAM +pair_coeff 5 11 0.000000 0.000000 1.620000 # CTT D_CAP +pair_coeff 5 12 0.000000 0.000000 1.620000 # CTT D_CTT +pair_coeff 8 8 0.000000 0.000000 1.620000 # D_CAT D_CAT +pair_coeff 8 9 0.000000 0.000000 1.620000 # D_CAT D_CAO +pair_coeff 8 10 0.000000 0.000000 1.620000 # D_CAT D_CAM +pair_coeff 8 11 0.000000 0.000000 1.620000 # D_CAT D_CAP +pair_coeff 8 12 0.000000 0.000000 1.620000 # D_CAT D_CTT +pair_coeff 9 9 0.000000 0.000000 1.620000 # D_CAO D_CAO +pair_coeff 9 10 0.000000 0.000000 1.620000 # D_CAO D_CAM +pair_coeff 9 11 0.000000 0.000000 1.620000 # D_CAO D_CAP +pair_coeff 9 12 0.000000 0.000000 1.620000 # D_CAO D_CTT +pair_coeff 10 10 0.000000 0.000000 1.620000 # D_CAM D_CAM +pair_coeff 10 11 0.000000 0.000000 1.620000 # D_CAM D_CAP +pair_coeff 10 12 0.000000 0.000000 1.620000 # D_CAM D_CTT +pair_coeff 11 11 0.000000 0.000000 1.620000 # D_CAP D_CAP +pair_coeff 11 12 0.000000 0.000000 1.620000 # D_CAP D_CTT +pair_coeff 12 12 0.000000 0.000000 1.620000 # D_CTT D_CTT + +neighbor 2.0 bin + +variable vTEMP equal 260.0 +variable vTEMP_D equal 1.0 +variable vPRESS equal 1.0 + +velocity gCORES create ${vTEMP} 12345 +velocity gDRUDES create ${vTEMP_D} 12345 + +fix fDRUDE all drude C C C C C N N D D D D D + +fix fSHAKE gCORES shake 0.0001 20 0 b 4 6 7 8 + +fix fLANG all langevin/drude ${vTEMP} 100.0 200611 ${vTEMP_D} 20.0 260514 zero yes +fix fNPH all nve + +compute cTEMP all temp/drude + +thermo_style custom step cpu etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press vol c_cTEMP[1] c_cTEMP[2] +thermo 50 + +timestep 0.5 +run 2000 diff --git a/examples/USER/drude/toluene/in.toluene.nh b/examples/USER/drude/toluene/in.toluene.nh new file mode 100644 index 0000000000..05b35ca919 --- /dev/null +++ b/examples/USER/drude/toluene/in.toluene.nh @@ -0,0 +1,122 @@ +# 250 toluene system for drude polarizability example (Nose-Hoover) + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic +dihedral_style opls +improper_style opls +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/thole/long 2.600 8.0 8.0 +pair_modify mix geometric tail yes +kspace_style pppm 1.0e-4 + +read_data data.toluene extra/special/per/atom 1 + +comm_modify vel yes + +group gTOLUENE molecule 1:250 +group gCORES type 1 2 3 4 5 6 7 +group gDRUDES type 8 9 10 11 12 + +pair_coeff 1 1 0.069998 3.550000 1.620000 # CAT CAT +pair_coeff 1 2 0.069998 3.550000 1.620000 # CAT CAO +pair_coeff 1 3 0.069998 3.550000 1.620000 # CAT CAM +pair_coeff 1 4 0.069998 3.550000 1.620000 # CAT CAP +pair_coeff 1 5 0.067968 3.524911 1.620000 # CAT CTT +pair_coeff 1 6 0.045825 2.931041 0.000000 # CAT HAT +pair_coeff 1 7 0.045825 2.931041 0.000000 # CAT HT +pair_coeff 2 2 0.069998 3.550000 1.620000 # CAO CAO +pair_coeff 2 3 0.069998 3.550000 1.620000 # CAO CAM +pair_coeff 2 4 0.069998 3.550000 1.620000 # CAO CAP +pair_coeff 2 5 0.067968 3.524911 1.620000 # CAO CTT +pair_coeff 2 6 0.045825 2.931041 0.000000 # CAO HAT +pair_coeff 2 7 0.045825 2.931041 0.000000 # CAO HT +pair_coeff 3 3 0.069998 3.550000 1.620000 # CAM CAM +pair_coeff 3 4 0.069998 3.550000 1.620000 # CAM CAP +pair_coeff 3 5 0.067968 3.524911 1.620000 # CAM CTT +pair_coeff 3 6 0.045825 2.931041 0.000000 # CAM HAT +pair_coeff 3 7 0.045825 2.931041 0.000000 # CAM HT +pair_coeff 4 4 0.069998 3.550000 1.620000 # CAP CAP +pair_coeff 4 5 0.067968 3.524911 1.620000 # CAP CTT +pair_coeff 4 6 0.045825 2.931041 0.000000 # CAP HAT +pair_coeff 4 7 0.045825 2.931041 0.000000 # CAP HT +pair_coeff 5 5 0.065997 3.500000 1.620000 # CTT CTT +pair_coeff 5 6 0.044496 2.910326 0.000000 # CTT HAT +pair_coeff 5 7 0.044496 2.910326 0.000000 # CTT HT +pair_coeff 6 6 0.029999 2.420000 0.000000 # HAT HAT +pair_coeff 6 7 0.029999 2.420000 0.000000 # HAT HT +pair_coeff 7 7 0.029999 2.420000 0.000000 # HT HT +pair_coeff 1 8 0.000000 0.000000 1.620000 # CAT D_CAT +pair_coeff 1 9 0.000000 0.000000 1.620000 # CAT D_CAO +pair_coeff 1 10 0.000000 0.000000 1.620000 # CAT D_CAM +pair_coeff 1 11 0.000000 0.000000 1.620000 # CAT D_CAP +pair_coeff 1 12 0.000000 0.000000 1.620000 # CAT D_CTT +pair_coeff 2 8 0.000000 0.000000 1.620000 # CAO D_CAT +pair_coeff 2 9 0.000000 0.000000 1.620000 # CAO D_CAO +pair_coeff 2 10 0.000000 0.000000 1.620000 # CAO D_CAM +pair_coeff 2 11 0.000000 0.000000 1.620000 # CAO D_CAP +pair_coeff 2 12 0.000000 0.000000 1.620000 # CAO D_CTT +pair_coeff 3 8 0.000000 0.000000 1.620000 # CAM D_CAT +pair_coeff 3 9 0.000000 0.000000 1.620000 # CAM D_CAO +pair_coeff 3 10 0.000000 0.000000 1.620000 # CAM D_CAM +pair_coeff 3 11 0.000000 0.000000 1.620000 # CAM D_CAP +pair_coeff 3 12 0.000000 0.000000 1.620000 # CAM D_CTT +pair_coeff 4 8 0.000000 0.000000 1.620000 # CAP D_CAT +pair_coeff 4 9 0.000000 0.000000 1.620000 # CAP D_CAO +pair_coeff 4 10 0.000000 0.000000 1.620000 # CAP D_CAM +pair_coeff 4 11 0.000000 0.000000 1.620000 # CAP D_CAP +pair_coeff 4 12 0.000000 0.000000 1.620000 # CAP D_CTT +pair_coeff 5 8 0.000000 0.000000 1.620000 # CTT D_CAT +pair_coeff 5 9 0.000000 0.000000 1.620000 # CTT D_CAO +pair_coeff 5 10 0.000000 0.000000 1.620000 # CTT D_CAM +pair_coeff 5 11 0.000000 0.000000 1.620000 # CTT D_CAP +pair_coeff 5 12 0.000000 0.000000 1.620000 # CTT D_CTT +pair_coeff 8 8 0.000000 0.000000 1.620000 # D_CAT D_CAT +pair_coeff 8 9 0.000000 0.000000 1.620000 # D_CAT D_CAO +pair_coeff 8 10 0.000000 0.000000 1.620000 # D_CAT D_CAM +pair_coeff 8 11 0.000000 0.000000 1.620000 # D_CAT D_CAP +pair_coeff 8 12 0.000000 0.000000 1.620000 # D_CAT D_CTT +pair_coeff 9 9 0.000000 0.000000 1.620000 # D_CAO D_CAO +pair_coeff 9 10 0.000000 0.000000 1.620000 # D_CAO D_CAM +pair_coeff 9 11 0.000000 0.000000 1.620000 # D_CAO D_CAP +pair_coeff 9 12 0.000000 0.000000 1.620000 # D_CAO D_CTT +pair_coeff 10 10 0.000000 0.000000 1.620000 # D_CAM D_CAM +pair_coeff 10 11 0.000000 0.000000 1.620000 # D_CAM D_CAP +pair_coeff 10 12 0.000000 0.000000 1.620000 # D_CAM D_CTT +pair_coeff 11 11 0.000000 0.000000 1.620000 # D_CAP D_CAP +pair_coeff 11 12 0.000000 0.000000 1.620000 # D_CAP D_CTT +pair_coeff 12 12 0.000000 0.000000 1.620000 # D_CTT D_CTT + + +neighbor 2.0 bin + +variable vTEMP equal 260.0 +variable vTEMP_D equal 1.0 +variable vPRESS equal 1.0 + +velocity gCORES create ${vTEMP} 12345 +velocity gDRUDES create ${vTEMP_D} 12345 + +fix fDRUDE all drude C C C C C N N D D D D D + +fix fSHAKE gCORES shake 0.0001 20 0 b 4 6 7 8 + +compute cTEMP_CORE gCORES temp/com +compute cTEMP all temp/drude + +fix fDIRECT all drude/transform/direct +fix fNVT1 gCORES nvt temp ${vTEMP} ${vTEMP} 100.0 +fix fNVT2 gDRUDES nvt temp ${vTEMP_D} ${vTEMP_D} 20.0 +fix fINVERSE all drude/transform/inverse + +fix fMOMENTUM all momentum 100 linear 1 1 1 + +thermo_style custom step cpu etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press vol c_cTEMP[1] c_cTEMP[2] +thermo 50 + +timestep 0.5 +run 2000 diff --git a/examples/USER/drude/toluene/log.toluene.lang.11Aug17.linux.1 b/examples/USER/drude/toluene/log.toluene.lang.11Aug17.linux.1 new file mode 100644 index 0000000000..bc51063341 --- /dev/null +++ b/examples/USER/drude/toluene/log.toluene.lang.11Aug17.linux.1 @@ -0,0 +1,251 @@ +LAMMPS (11 Aug 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 250 toluene system for drude polarizability example (Langevin) + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic +dihedral_style opls +improper_style opls +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/thole/long 2.600 8.0 8.0 +pair_modify mix geometric tail yes +kspace_style pppm 1.0e-4 + +read_data data.toluene extra/special/per/atom 1 + orthogonal box = (-18.2908 -18.1636 -18.223) to (18.3357 18.1621 18.3287) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 5500 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 8 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 5500 bonds + reading angles ... + 6000 angles + reading dihedrals ... + 6000 dihedrals + reading impropers ... + 1500 impropers + 5 = max # of 1-2 neighbors + 10 = max # of 1-3 neighbors + 16 = max # of 1-4 neighbors + 20 = max # of special neighbors + +comm_modify vel yes + +group gTOLUENE molecule 1:250 +5500 atoms in group gTOLUENE +group gCORES type 1 2 3 4 5 6 7 +3750 atoms in group gCORES +group gDRUDES type 8 9 10 11 12 +1750 atoms in group gDRUDES + +pair_coeff 1 1 0.069998 3.550000 1.620000 # CAT CAT +pair_coeff 1 2 0.069998 3.550000 1.620000 # CAT CAO +pair_coeff 1 3 0.069998 3.550000 1.620000 # CAT CAM +pair_coeff 1 4 0.069998 3.550000 1.620000 # CAT CAP +pair_coeff 1 5 0.067968 3.524911 1.620000 # CAT CTT +pair_coeff 1 6 0.045825 2.931041 0.000000 # CAT HAT +pair_coeff 1 7 0.045825 2.931041 0.000000 # CAT HT +pair_coeff 2 2 0.069998 3.550000 1.620000 # CAO CAO +pair_coeff 2 3 0.069998 3.550000 1.620000 # CAO CAM +pair_coeff 2 4 0.069998 3.550000 1.620000 # CAO CAP +pair_coeff 2 5 0.067968 3.524911 1.620000 # CAO CTT +pair_coeff 2 6 0.045825 2.931041 0.000000 # CAO HAT +pair_coeff 2 7 0.045825 2.931041 0.000000 # CAO HT +pair_coeff 3 3 0.069998 3.550000 1.620000 # CAM CAM +pair_coeff 3 4 0.069998 3.550000 1.620000 # CAM CAP +pair_coeff 3 5 0.067968 3.524911 1.620000 # CAM CTT +pair_coeff 3 6 0.045825 2.931041 0.000000 # CAM HAT +pair_coeff 3 7 0.045825 2.931041 0.000000 # CAM HT +pair_coeff 4 4 0.069998 3.550000 1.620000 # CAP CAP +pair_coeff 4 5 0.067968 3.524911 1.620000 # CAP CTT +pair_coeff 4 6 0.045825 2.931041 0.000000 # CAP HAT +pair_coeff 4 7 0.045825 2.931041 0.000000 # CAP HT +pair_coeff 5 5 0.065997 3.500000 1.620000 # CTT CTT +pair_coeff 5 6 0.044496 2.910326 0.000000 # CTT HAT +pair_coeff 5 7 0.044496 2.910326 0.000000 # CTT HT +pair_coeff 6 6 0.029999 2.420000 0.000000 # HAT HAT +pair_coeff 6 7 0.029999 2.420000 0.000000 # HAT HT +pair_coeff 7 7 0.029999 2.420000 0.000000 # HT HT +pair_coeff 1 8 0.000000 0.000000 1.620000 # CAT D_CAT +pair_coeff 1 9 0.000000 0.000000 1.620000 # CAT D_CAO +pair_coeff 1 10 0.000000 0.000000 1.620000 # CAT D_CAM +pair_coeff 1 11 0.000000 0.000000 1.620000 # CAT D_CAP +pair_coeff 1 12 0.000000 0.000000 1.620000 # CAT D_CTT +pair_coeff 2 8 0.000000 0.000000 1.620000 # CAO D_CAT +pair_coeff 2 9 0.000000 0.000000 1.620000 # CAO D_CAO +pair_coeff 2 10 0.000000 0.000000 1.620000 # CAO D_CAM +pair_coeff 2 11 0.000000 0.000000 1.620000 # CAO D_CAP +pair_coeff 2 12 0.000000 0.000000 1.620000 # CAO D_CTT +pair_coeff 3 8 0.000000 0.000000 1.620000 # CAM D_CAT +pair_coeff 3 9 0.000000 0.000000 1.620000 # CAM D_CAO +pair_coeff 3 10 0.000000 0.000000 1.620000 # CAM D_CAM +pair_coeff 3 11 0.000000 0.000000 1.620000 # CAM D_CAP +pair_coeff 3 12 0.000000 0.000000 1.620000 # CAM D_CTT +pair_coeff 4 8 0.000000 0.000000 1.620000 # CAP D_CAT +pair_coeff 4 9 0.000000 0.000000 1.620000 # CAP D_CAO +pair_coeff 4 10 0.000000 0.000000 1.620000 # CAP D_CAM +pair_coeff 4 11 0.000000 0.000000 1.620000 # CAP D_CAP +pair_coeff 4 12 0.000000 0.000000 1.620000 # CAP D_CTT +pair_coeff 5 8 0.000000 0.000000 1.620000 # CTT D_CAT +pair_coeff 5 9 0.000000 0.000000 1.620000 # CTT D_CAO +pair_coeff 5 10 0.000000 0.000000 1.620000 # CTT D_CAM +pair_coeff 5 11 0.000000 0.000000 1.620000 # CTT D_CAP +pair_coeff 5 12 0.000000 0.000000 1.620000 # CTT D_CTT +pair_coeff 8 8 0.000000 0.000000 1.620000 # D_CAT D_CAT +pair_coeff 8 9 0.000000 0.000000 1.620000 # D_CAT D_CAO +pair_coeff 8 10 0.000000 0.000000 1.620000 # D_CAT D_CAM +pair_coeff 8 11 0.000000 0.000000 1.620000 # D_CAT D_CAP +pair_coeff 8 12 0.000000 0.000000 1.620000 # D_CAT D_CTT +pair_coeff 9 9 0.000000 0.000000 1.620000 # D_CAO D_CAO +pair_coeff 9 10 0.000000 0.000000 1.620000 # D_CAO D_CAM +pair_coeff 9 11 0.000000 0.000000 1.620000 # D_CAO D_CAP +pair_coeff 9 12 0.000000 0.000000 1.620000 # D_CAO D_CTT +pair_coeff 10 10 0.000000 0.000000 1.620000 # D_CAM D_CAM +pair_coeff 10 11 0.000000 0.000000 1.620000 # D_CAM D_CAP +pair_coeff 10 12 0.000000 0.000000 1.620000 # D_CAM D_CTT +pair_coeff 11 11 0.000000 0.000000 1.620000 # D_CAP D_CAP +pair_coeff 11 12 0.000000 0.000000 1.620000 # D_CAP D_CTT +pair_coeff 12 12 0.000000 0.000000 1.620000 # D_CTT D_CTT + +neighbor 2.0 bin + +variable vTEMP equal 260.0 +variable vTEMP_D equal 1.0 +variable vPRESS equal 1.0 + +velocity gCORES create ${vTEMP} 12345 +velocity gCORES create 260 12345 +velocity gDRUDES create ${vTEMP_D} 12345 +velocity gDRUDES create 1 12345 + +fix fDRUDE all drude C C C C C N N D D D D D + +fix fSHAKE gCORES shake 0.0001 20 0 b 4 6 7 8 + 1250 = # of size 2 clusters + 0 = # of size 3 clusters + 250 = # of size 4 clusters + 0 = # of frozen angles + +fix fLANG all langevin/drude ${vTEMP} 100.0 200611 ${vTEMP_D} 20.0 260514 zero yes +fix fLANG all langevin/drude 260 100.0 200611 ${vTEMP_D} 20.0 260514 zero yes +fix fLANG all langevin/drude 260 100.0 200611 1 20.0 260514 zero yes +fix fNPH all nve + +compute cTEMP all temp/drude + +thermo_style custom step cpu etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press vol c_cTEMP[1] c_cTEMP[2] +thermo 50 + +timestep 0.5 +run 2000 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.382011 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0325934 + estimated relative force accuracy = 9.8154e-05 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Rebuild special list taking Drude particles into account +Old max number of 1-2 to 1-4 neighbors: 19 +New max number of 1-2 to 1-4 neighbors: 20 (+1) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 8 8 8 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut/thole/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 42.06 | 42.06 | 42.06 Mbytes +Step CPU TotEng KinEng Temp PotEng E_bond E_angle E_dihed E_impro E_vdwl E_coul E_long Press Volume c_cTEMP[1] c_cTEMP[2] + 0 0 14386.197 2910.7282 202.07402 11475.469 6565.4851 20.333365 1.0706727e-06 1.3894617e-07 4972.8631 1306116.6 -1306199.8 40273.68 48631.318 314.89553 3.1777821 + 50 4.311986 8083.3901 4729.9995 328.37487 3353.3906 1812.5186 685.40417 646.10358 50.083281 804.80656 1305984.8 -1306630.3 16960.287 48631.318 448.67988 116.22125 + 100 8.756623 6206.7865 3683.944 255.75365 2522.8425 977.52675 777.45439 838.58809 68.086914 471.97862 1306097.1 -1306707.9 15657.142 48631.318 380.53159 35.760643 + 150 13.134938 5386.0219 3582.482 248.70976 1803.5399 752.25928 803.04832 643.43249 49.76684 131.97853 1306139.2 -1306716.2 15140.102 48631.318 383.61303 10.880935 + 200 17.508189 4846.4097 3254.3932 225.93257 1592.0166 700.43329 812.26722 657.52279 51.044716 -64.045174 1306160.5 -1306725.7 13844.277 48631.318 351.90677 3.8489009 + 250 21.871676 4473.215 3091.5333 214.6262 1381.6817 688.24707 842.63267 590.45999 48.22798 -214.02425 1306156.6 -1306730.5 8808.7402 48631.318 335.32872 1.8372171 + 300 26.226064 4191.8834 2883.8468 200.2078 1308.0367 734.36657 856.15482 584.87904 47.590787 -343.44615 1306163.4 -1306734.9 3389.3777 48631.318 313.03581 1.3011826 + 350 30.568716 3972.0739 2756.8392 191.39044 1215.2347 664.4688 866.06348 580.13632 48.515297 -378.8729 1306173.3 -1306738.3 8458.1149 48631.318 299.31146 1.1345329 + 400 34.845648 3838.3528 2731.3975 189.62419 1106.9552 684.0318 870.67752 548.93014 44.038787 -460.1537 1306160.4 -1306741 6697.9188 48631.318 296.54405 1.1332149 + 450 39.17477 3731.18 2607.8585 181.04762 1123.3216 719.57572 894.99915 571.99504 47.625227 -537.60494 1306171.9 -1306745.2 2450.4224 48631.318 283.13713 1.0721818 + 500 43.497489 3607.0055 2565.9469 178.13796 1041.0586 717.36452 841.34375 551.39834 45.985413 -542.47313 1306170.9 -1306743.4 3077.1849 48631.318 278.59462 1.0410963 + 550 47.812038 3513.8132 2548.7259 176.94241 965.08736 673.81272 852.38161 522.99297 44.276434 -552.27379 1306171.2 -1306747.4 4659.7275 48631.318 276.70124 1.0757459 + 600 52.124423 3386.9627 2471.0692 171.55118 915.89348 689.99732 833.61298 517.49343 43.023588 -594.96363 1306170.6 -1306743.8 2159.7328 48631.318 268.27854 1.0287605 + 650 56.370068 3374.3191 2413.6719 167.56644 960.64717 703.32428 874.12028 535.41271 43.256032 -617.25815 1306168.6 -1306746.8 1262.4757 48631.318 261.99584 1.0950976 + 700 60.667476 3342.9467 2412.9563 167.51676 929.99042 683.70355 882.22521 527.03932 43.661355 -616.70117 1306161 -1306751 2950.9009 48631.318 261.92814 1.0771869 + 750 64.964696 3327.7938 2414.3547 167.61385 913.43902 695.12778 863.48248 542.99202 46.408369 -639.60076 1306160.7 -1306755.6 1583.0277 48631.318 262.09771 1.0464936 + 800 69.256916 3391.689 2452.2049 170.24155 939.48407 694.2176 892.61592 557.53726 45.495129 -654.56675 1306155.2 -1306751 1232.1671 48631.318 266.20601 1.0640309 + 850 73.527972 3386.8618 2486.6928 172.63584 900.16902 696.7684 880.27643 545.11446 46.474227 -665.90464 1306154.7 -1306757.3 1129.2062 48631.318 269.97945 1.027015 + 900 77.775993 3368.0724 2416.7145 167.77767 951.35789 718.66654 893.18396 537.79136 46.404626 -641.29596 1306152.9 -1306756.3 1673.0743 48631.318 262.34697 1.0597091 + 950 82.028341 3300.4793 2409.5613 167.28107 890.918 728.06888 890.51193 515.08456 44.36547 -671.13741 1306142.3 -1306758.2 1038.6579 48631.318 261.57036 1.0567234 + 1000 86.189789 3333.2955 2452.2486 170.24458 881.04692 699.8414 915.33862 506.83261 41.77374 -665.68264 1306141.6 -1306758.7 467.42142 48631.318 266.19104 1.0987814 + 1050 90.384168 3303.87 2376.9713 165.01854 926.89875 706.12941 930.65844 524.73304 42.644613 -657.19573 1306139.3 -1306759.4 1737.6624 48631.318 258.00246 1.0954432 + 1100 94.549452 3367.668 2454.9154 170.42973 912.75259 715.68494 935.8363 516.52205 43.261761 -671.86101 1306137.9 -1306764.6 961.79199 48631.318 266.492 1.0797548 + 1150 98.65493 3350.0898 2485.3993 172.54604 864.69051 699.23072 933.76405 510.60424 42.381362 -684.53513 1306127.1 -1306763.8 -272.48178 48631.318 269.82496 1.0512421 + 1200 102.82045 3309.6871 2398.9577 166.54492 910.72944 705.58979 934.53183 531.90967 45.872142 -664.58495 1306126.9 -1306769.5 627.31931 48631.318 260.41866 1.0531639 + 1250 106.9899 3304.504 2491.6998 172.98344 812.80426 710.83366 881.33764 494.90045 41.71618 -672.49264 1306123.8 -1306767.3 136.11723 48631.318 270.51026 1.0516137 + 1300 111.16224 3318.9543 2462.0621 170.92588 856.89219 709.17314 932.87209 503.80373 43.426006 -680.2474 1306121.2 -1306773.3 1276.2503 48631.318 267.28591 1.0510113 + 1350 115.27184 3314.8515 2434.8483 169.03659 880.00316 710.91641 922.28347 540.40795 44.753548 -686.09335 1306124.5 -1306776.7 -438.87694 48631.318 264.31236 1.0731666 + 1400 119.44228 3349.0785 2457.7697 170.62788 891.30875 711.28064 936.58607 516.63511 42.396287 -653.09763 1306113.8 -1306776.3 350.79618 48631.318 266.80555 1.0745043 + 1450 123.61267 3364.1486 2459.8741 170.77397 904.27455 696.57265 946.32098 538.55368 44.69075 -652.75091 1306111 -1306780.1 502.47466 48631.318 267.03201 1.0789056 + 1500 127.72962 3341.9369 2454.3302 170.3891 887.60672 726.46979 903.40815 557.73064 47.536125 -667.65025 1306100.7 -1306780.6 -248.0975 48631.318 266.44821 1.044725 + 1550 131.91041 3270.4282 2437.7916 169.24093 832.63655 691.49462 910.83807 523.17366 44.83093 -654.48655 1306100.5 -1306783.7 490.32965 48631.318 264.63652 1.0662604 + 1600 136.0834 3252.0725 2429.6805 168.67782 822.39196 689.68155 898.22828 535.31963 43.84399 -660.93277 1306100.1 -1306783.9 1729.5956 48631.318 263.74523 1.0817172 + 1650 140.26444 3239.748 2442.6258 169.57653 797.12222 671.1832 907.1659 507.03947 43.048028 -648.14001 1306103.3 -1306786.5 970.43988 48631.318 265.15987 1.0708872 + 1700 144.3855 3202.9157 2410.267 167.33006 792.64869 686.40974 882.40791 527.02899 43.819792 -656.82001 1306096 -1306786.2 -107.50166 48631.318 261.64368 1.062837 + 1750 148.56592 3214.6107 2366.3264 164.27953 848.28434 696.38228 915.58636 538.2236 47.852688 -652.7697 1306093.6 -1306790.6 -164.14366 48631.318 256.84519 1.0937744 + 1800 152.74611 3209.5771 2421.4089 168.10357 788.16819 683.61816 869.45802 532.77927 45.708374 -658.39221 1306103.1 -1306788.1 277.61781 48631.318 262.83282 1.1036154 + 1850 156.86567 3146.3973 2362.3333 164.00232 784.064 697.87032 875.8451 523.54452 43.851379 -665.83106 1306101.5 -1306792.7 497.88657 48631.318 256.42683 1.0654271 + 1900 161.0419 3141.5496 2367.1077 164.33378 774.44186 693.39945 878.97447 515.65653 44.619392 -668.11692 1306103.8 -1306793.9 -1427.3998 48631.318 256.94212 1.0727903 + 1950 165.22235 3134.6473 2295.577 159.36784 839.07025 699.62719 905.76937 519.32307 46.109334 -645.08933 1306104.9 -1306791.6 1744.2846 48631.318 249.19694 1.0064565 + 2000 169.4 3146.866 2361.3821 163.93628 785.48386 682.24124 889.6864 534.94877 46.855983 -678.1614 1306104 -1306794.1 699.8735 48631.318 256.32873 1.0559143 +Loop time of 169.4 on 1 procs for 2000 steps with 5500 atoms + +Performance: 0.510 ns/day, 47.056 hours/ns, 11.806 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 | 107.93 | 107.93 | 107.93 | 0.0 | 63.71 +Bond | 19.76 | 19.76 | 19.76 | 0.0 | 11.66 +Kspace | 34.926 | 34.926 | 34.926 | 0.0 | 20.62 +Neigh | 1.9932 | 1.9932 | 1.9932 | 0.0 | 1.18 +Comm | 0.73555 | 0.73555 | 0.73555 | 0.0 | 0.43 +Output | 0.0065863 | 0.0065863 | 0.0065863 | 0.0 | 0.00 +Modify | 3.9135 | 3.9135 | 3.9135 | 0.0 | 2.31 +Other | | 0.133 | | | 0.08 + +Nlocal: 5500 ave 5500 max 5500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 13219 ave 13219 max 13219 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1.33739e+06 ave 1.33739e+06 max 1.33739e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1337388 +Ave neighs/atom = 243.161 +Ave special neighs/atom = 15.6364 +Neighbor list builds = 32 +Dangerous builds = 0 +Total wall time: 0:02:49 diff --git a/examples/USER/drude/toluene/log.toluene.lang.11Aug17.linux.4 b/examples/USER/drude/toluene/log.toluene.lang.11Aug17.linux.4 new file mode 100644 index 0000000000..cebe687c11 --- /dev/null +++ b/examples/USER/drude/toluene/log.toluene.lang.11Aug17.linux.4 @@ -0,0 +1,251 @@ +LAMMPS (11 Aug 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 250 toluene system for drude polarizability example (Langevin) + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic +dihedral_style opls +improper_style opls +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/thole/long 2.600 8.0 8.0 +pair_modify mix geometric tail yes +kspace_style pppm 1.0e-4 + +read_data data.toluene extra/special/per/atom 1 + orthogonal box = (-18.2908 -18.1636 -18.223) to (18.3357 18.1621 18.3287) + 2 by 1 by 2 MPI processor grid + reading atoms ... + 5500 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 8 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 5500 bonds + reading angles ... + 6000 angles + reading dihedrals ... + 6000 dihedrals + reading impropers ... + 1500 impropers + 5 = max # of 1-2 neighbors + 10 = max # of 1-3 neighbors + 16 = max # of 1-4 neighbors + 20 = max # of special neighbors + +comm_modify vel yes + +group gTOLUENE molecule 1:250 +5500 atoms in group gTOLUENE +group gCORES type 1 2 3 4 5 6 7 +3750 atoms in group gCORES +group gDRUDES type 8 9 10 11 12 +1750 atoms in group gDRUDES + +pair_coeff 1 1 0.069998 3.550000 1.620000 # CAT CAT +pair_coeff 1 2 0.069998 3.550000 1.620000 # CAT CAO +pair_coeff 1 3 0.069998 3.550000 1.620000 # CAT CAM +pair_coeff 1 4 0.069998 3.550000 1.620000 # CAT CAP +pair_coeff 1 5 0.067968 3.524911 1.620000 # CAT CTT +pair_coeff 1 6 0.045825 2.931041 0.000000 # CAT HAT +pair_coeff 1 7 0.045825 2.931041 0.000000 # CAT HT +pair_coeff 2 2 0.069998 3.550000 1.620000 # CAO CAO +pair_coeff 2 3 0.069998 3.550000 1.620000 # CAO CAM +pair_coeff 2 4 0.069998 3.550000 1.620000 # CAO CAP +pair_coeff 2 5 0.067968 3.524911 1.620000 # CAO CTT +pair_coeff 2 6 0.045825 2.931041 0.000000 # CAO HAT +pair_coeff 2 7 0.045825 2.931041 0.000000 # CAO HT +pair_coeff 3 3 0.069998 3.550000 1.620000 # CAM CAM +pair_coeff 3 4 0.069998 3.550000 1.620000 # CAM CAP +pair_coeff 3 5 0.067968 3.524911 1.620000 # CAM CTT +pair_coeff 3 6 0.045825 2.931041 0.000000 # CAM HAT +pair_coeff 3 7 0.045825 2.931041 0.000000 # CAM HT +pair_coeff 4 4 0.069998 3.550000 1.620000 # CAP CAP +pair_coeff 4 5 0.067968 3.524911 1.620000 # CAP CTT +pair_coeff 4 6 0.045825 2.931041 0.000000 # CAP HAT +pair_coeff 4 7 0.045825 2.931041 0.000000 # CAP HT +pair_coeff 5 5 0.065997 3.500000 1.620000 # CTT CTT +pair_coeff 5 6 0.044496 2.910326 0.000000 # CTT HAT +pair_coeff 5 7 0.044496 2.910326 0.000000 # CTT HT +pair_coeff 6 6 0.029999 2.420000 0.000000 # HAT HAT +pair_coeff 6 7 0.029999 2.420000 0.000000 # HAT HT +pair_coeff 7 7 0.029999 2.420000 0.000000 # HT HT +pair_coeff 1 8 0.000000 0.000000 1.620000 # CAT D_CAT +pair_coeff 1 9 0.000000 0.000000 1.620000 # CAT D_CAO +pair_coeff 1 10 0.000000 0.000000 1.620000 # CAT D_CAM +pair_coeff 1 11 0.000000 0.000000 1.620000 # CAT D_CAP +pair_coeff 1 12 0.000000 0.000000 1.620000 # CAT D_CTT +pair_coeff 2 8 0.000000 0.000000 1.620000 # CAO D_CAT +pair_coeff 2 9 0.000000 0.000000 1.620000 # CAO D_CAO +pair_coeff 2 10 0.000000 0.000000 1.620000 # CAO D_CAM +pair_coeff 2 11 0.000000 0.000000 1.620000 # CAO D_CAP +pair_coeff 2 12 0.000000 0.000000 1.620000 # CAO D_CTT +pair_coeff 3 8 0.000000 0.000000 1.620000 # CAM D_CAT +pair_coeff 3 9 0.000000 0.000000 1.620000 # CAM D_CAO +pair_coeff 3 10 0.000000 0.000000 1.620000 # CAM D_CAM +pair_coeff 3 11 0.000000 0.000000 1.620000 # CAM D_CAP +pair_coeff 3 12 0.000000 0.000000 1.620000 # CAM D_CTT +pair_coeff 4 8 0.000000 0.000000 1.620000 # CAP D_CAT +pair_coeff 4 9 0.000000 0.000000 1.620000 # CAP D_CAO +pair_coeff 4 10 0.000000 0.000000 1.620000 # CAP D_CAM +pair_coeff 4 11 0.000000 0.000000 1.620000 # CAP D_CAP +pair_coeff 4 12 0.000000 0.000000 1.620000 # CAP D_CTT +pair_coeff 5 8 0.000000 0.000000 1.620000 # CTT D_CAT +pair_coeff 5 9 0.000000 0.000000 1.620000 # CTT D_CAO +pair_coeff 5 10 0.000000 0.000000 1.620000 # CTT D_CAM +pair_coeff 5 11 0.000000 0.000000 1.620000 # CTT D_CAP +pair_coeff 5 12 0.000000 0.000000 1.620000 # CTT D_CTT +pair_coeff 8 8 0.000000 0.000000 1.620000 # D_CAT D_CAT +pair_coeff 8 9 0.000000 0.000000 1.620000 # D_CAT D_CAO +pair_coeff 8 10 0.000000 0.000000 1.620000 # D_CAT D_CAM +pair_coeff 8 11 0.000000 0.000000 1.620000 # D_CAT D_CAP +pair_coeff 8 12 0.000000 0.000000 1.620000 # D_CAT D_CTT +pair_coeff 9 9 0.000000 0.000000 1.620000 # D_CAO D_CAO +pair_coeff 9 10 0.000000 0.000000 1.620000 # D_CAO D_CAM +pair_coeff 9 11 0.000000 0.000000 1.620000 # D_CAO D_CAP +pair_coeff 9 12 0.000000 0.000000 1.620000 # D_CAO D_CTT +pair_coeff 10 10 0.000000 0.000000 1.620000 # D_CAM D_CAM +pair_coeff 10 11 0.000000 0.000000 1.620000 # D_CAM D_CAP +pair_coeff 10 12 0.000000 0.000000 1.620000 # D_CAM D_CTT +pair_coeff 11 11 0.000000 0.000000 1.620000 # D_CAP D_CAP +pair_coeff 11 12 0.000000 0.000000 1.620000 # D_CAP D_CTT +pair_coeff 12 12 0.000000 0.000000 1.620000 # D_CTT D_CTT + +neighbor 2.0 bin + +variable vTEMP equal 260.0 +variable vTEMP_D equal 1.0 +variable vPRESS equal 1.0 + +velocity gCORES create ${vTEMP} 12345 +velocity gCORES create 260 12345 +velocity gDRUDES create ${vTEMP_D} 12345 +velocity gDRUDES create 1 12345 + +fix fDRUDE all drude C C C C C N N D D D D D + +fix fSHAKE gCORES shake 0.0001 20 0 b 4 6 7 8 + 1250 = # of size 2 clusters + 0 = # of size 3 clusters + 250 = # of size 4 clusters + 0 = # of frozen angles + +fix fLANG all langevin/drude ${vTEMP} 100.0 200611 ${vTEMP_D} 20.0 260514 zero yes +fix fLANG all langevin/drude 260 100.0 200611 ${vTEMP_D} 20.0 260514 zero yes +fix fLANG all langevin/drude 260 100.0 200611 1 20.0 260514 zero yes +fix fNPH all nve + +compute cTEMP all temp/drude + +thermo_style custom step cpu etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press vol c_cTEMP[1] c_cTEMP[2] +thermo 50 + +timestep 0.5 +run 2000 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.382011 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0325934 + estimated relative force accuracy = 9.8154e-05 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +Rebuild special list taking Drude particles into account +Old max number of 1-2 to 1-4 neighbors: 19 +New max number of 1-2 to 1-4 neighbors: 20 (+1) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 8 8 8 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut/thole/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 18 | 18 | 18 Mbytes +Step CPU TotEng KinEng Temp PotEng E_bond E_angle E_dihed E_impro E_vdwl E_coul E_long Press Volume c_cTEMP[1] c_cTEMP[2] + 0 0 14386.197 2910.7282 202.07402 11475.469 6565.4851 20.333365 1.0706727e-06 1.3894617e-07 4972.8631 1306116.6 -1306199.8 40273.68 48631.318 314.89553 3.1777821 + 50 1.0658228 8014.6879 4671.7498 324.33095 3342.9381 1798.7991 670.22837 651.99307 50.352024 819.34616 1305984.9 -1306632.7 17255.952 48631.318 442.52888 116.12397 + 100 2.136163 6185.5007 3697.0414 256.66292 2488.4593 974.42931 774.88353 840.46625 66.896007 427.27085 1306105.5 -1306701 15044.739 48631.318 381.93582 35.802658 + 150 3.202647 5418.0644 3628.2714 251.88864 1789.7929 764.02696 804.61034 641.14915 47.995428 108.05084 1306138.9 -1306714.9 15258.194 48631.318 388.65363 10.777816 + 200 4.2728949 4838.4235 3303.8964 229.36927 1534.5271 702.10438 772.85348 625.99718 52.299187 -63.792745 1306166.5 -1306721.4 13487.722 48631.318 357.35337 3.7423617 + 250 5.3275268 4461.2438 3084.8973 214.16551 1376.3465 693.85145 823.23815 599.85313 48.280277 -230.56822 1306167.8 -1306726.1 8779.0061 48631.318 334.59262 1.8620294 + 300 6.3794398 4179.6462 2885.0738 200.29299 1294.5724 739.337 868.84011 555.04912 44.838819 -354.73738 1306171.3 -1306730 4410.8735 48631.318 313.17473 1.2892347 + 350 7.427706 3934.3968 2756.2421 191.34899 1178.1546 666.16877 877.32996 548.99846 45.087026 -404.32209 1306179 -1306734.1 8477.8828 48631.318 299.22663 1.1698531 + 400 8.4820418 3800.4769 2674.8317 185.69716 1125.6452 693.29433 841.29833 579.61438 48.325361 -470.18802 1306170.5 -1306737.2 6265.7532 48631.318 290.39105 1.1303952 + 450 9.528651 3685.28 2616.9074 181.67583 1068.3726 702.68328 886.66644 555.74511 46.160811 -557.70651 1306176.6 -1306741.7 2701.7737 48631.318 284.11064 1.091646 + 500 10.579133 3582.6591 2517.6443 174.78461 1065.0148 701.82101 894.9429 554.06012 46.074357 -570.49878 1306181.8 -1306743.2 3643.7426 48631.318 273.31525 1.0831346 + 550 11.629649 3542.0402 2527.0386 175.4368 1015.0016 688.73877 916.2381 521.69932 44.014375 -580.05437 1306171 -1306746.6 2928.6632 48631.318 274.34257 1.0740018 + 600 12.684143 3507.0443 2519.9749 174.94641 987.06936 711.58734 894.63276 525.57884 42.944226 -603.24423 1306161.2 -1306745.7 2082.9907 48631.318 273.57124 1.0784841 + 650 13.737965 3416.2001 2445.9361 169.80635 970.26394 706.95207 891.76446 540.90369 45.970985 -626.32832 1306160.2 -1306749.2 1912.8783 48631.318 265.5023 1.1021764 + 700 14.777375 3419.7572 2446.117 169.81891 973.64019 664.17579 936.51992 551.67148 45.696531 -634.70926 1306159.6 -1306749.4 2215.7085 48631.318 265.53614 1.0774684 + 750 15.795347 3418.6537 2449.343 170.04287 969.31069 706.12432 899.61553 553.21874 45.793213 -642.75298 1306158.1 -1306750.8 1022.2516 48631.318 265.89304 1.0681488 + 800 16.835794 3385.2449 2465.4963 171.16429 919.74864 692.34918 888.91243 530.24204 45.132243 -638.54787 1306154.6 -1306753 1601.1391 48631.318 267.64361 1.0797553 + 850 17.87536 3397.1124 2426.3129 168.44403 970.79951 717.48898 878.71057 580.26487 46.675101 -646.96926 1306150.9 -1306756.3 1048.7905 48631.318 263.38063 1.0785255 + 900 18.899639 3324.2064 2447.5004 169.91495 876.70599 683.62339 881.77789 531.98758 43.646731 -648.59248 1306144.4 -1306760.2 2221.5859 48631.318 265.69596 1.0608373 + 950 19.938468 3316.6329 2398.6988 166.52695 917.93405 702.84237 885.96473 540.35376 45.671318 -638.80334 1306144.4 -1306762.5 1955.2237 48631.318 260.38167 1.0687233 + 1000 20.973543 3287.4205 2384.191 165.51976 903.22949 705.56988 889.96387 535.23674 44.902139 -661.28175 1306150.4 -1306761.6 90.200683 48631.318 258.81506 1.0477545 + 1050 21.990961 3297.7806 2392.0372 166.06448 905.74339 697.33157 889.75086 537.2395 46.319713 -636.03286 1306135.9 -1306764.8 1893.8234 48631.318 259.67633 1.0344207 + 1100 23.006456 3240.651 2370.2217 164.54996 870.42931 693.87289 897.0846 526.89184 43.778979 -657.83716 1306132.1 -1306765.5 799.62979 48631.318 257.28711 1.0618941 + 1150 24.014558 3232.457 2377.9797 165.08855 854.47728 692.51558 897.77048 520.3269 43.903959 -657.38369 1306126.9 -1306769.6 178.21408 48631.318 258.13876 1.0479172 + 1200 25.010178 3238.4266 2392.0623 166.06622 846.36427 695.98996 887.237 522.01974 42.355716 -660.92843 1306124.7 -1306765 1006.1877 48631.318 259.66037 1.0698925 + 1250 26.01949 3198.3364 2332.7551 161.94888 865.58134 690.81786 897.35028 524.47996 44.421121 -640.92419 1306116.3 -1306766.8 2073.9672 48631.318 253.227 1.0326937 + 1300 27.026911 3237.6809 2386.3739 165.67131 851.30706 672.11785 901.04813 530.2964 44.020263 -655.33033 1306125.7 -1306766.5 579.46013 48631.318 259.05838 1.0374113 + 1350 28.033721 3285.9536 2371.155 164.61476 914.79862 718.12968 928.41764 524.02349 43.89896 -657.10221 1306127.3 -1306769.9 518.88041 48631.318 257.36737 1.0993197 + 1400 29.026742 3272.2173 2391.4158 166.02134 880.80147 712.59883 896.13616 532.95785 45.989768 -658.37495 1306125.6 -1306774.1 961.2067 48631.318 259.5968 1.0557033 + 1450 30.032566 3244.2627 2356.0955 163.56926 888.16727 714.72692 901.18382 534.59787 45.517573 -655.58258 1306124.5 -1306776.8 596.10558 48631.318 255.75173 1.058657 + 1500 31.03878 3244.8598 2408.5382 167.21004 836.32161 695.63105 867.27743 527.37333 44.496971 -648.96393 1306125.2 -1306774.7 443.71088 48631.318 261.45495 1.0648973 + 1550 32.041435 3239.3658 2367.1336 164.33557 872.23223 704.16965 884.5938 544.41685 46.110791 -654.61963 1306124.1 -1306776.5 -446.5562 48631.318 256.96289 1.0409003 + 1600 33.058977 3221.4258 2334.2656 162.05375 887.1602 713.8296 885.80472 533.86753 45.413663 -633.58824 1306119.6 -1306777.8 1527.9489 48631.318 253.36367 1.0817678 + 1650 34.080875 3224.4472 2385.9055 165.63879 838.54168 681.01628 879.88017 536.75983 43.884394 -643.24788 1306114 -1306773.8 1314.2208 48631.318 258.97106 1.1033457 + 1700 35.095047 3178.6575 2352.4294 163.31475 826.2281 700.79494 854.06687 549.39826 46.155483 -662.57181 1306115.2 -1306776.9 -187.36898 48631.318 255.35015 1.0638209 + 1750 36.093828 3219.473 2371.9421 164.6694 847.53093 699.44953 891.26068 541.91687 45.714235 -679.13432 1306120.3 -1306771.9 -618.32924 48631.318 257.48034 1.0512601 + 1800 37.110101 3202.0094 2371.8909 164.66585 830.11842 698.44522 858.38216 550.82008 46.315893 -667.77838 1306119.2 -1306775.3 -9.4963278 48631.318 257.46873 1.0619052 + 1850 38.121337 3202.0111 2366.6984 164.30536 835.31277 714.69988 849.6778 553.24258 46.502994 -667.44162 1306114.9 -1306776.3 131.11108 48631.318 256.90165 1.0656162 + 1900 39.132607 3228.7805 2365.934 164.25229 862.84648 720.68418 890.65533 554.75943 45.736726 -685.52803 1306115.1 -1306778.5 -82.525994 48631.318 256.81451 1.0726218 + 1950 40.127507 3218.4068 2443.0023 169.60267 775.40452 673.40001 874.63022 529.69964 43.166847 -680.57322 1306115.4 -1306780.3 622.76654 48631.318 265.20173 1.0693092 + 2000 41.138176 3257.463 2375.6246 164.92505 881.83842 677.60747 933.47776 547.01076 46.507189 -665.56273 1306123.7 -1306780.9 1829.3477 48631.318 257.88171 1.0500311 +Loop time of 41.1383 on 4 procs for 2000 steps with 5500 atoms + +Performance: 2.100 ns/day, 11.427 hours/ns, 48.617 timesteps/s +99.8% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 21.082 | 22.483 | 24.145 | 26.6 | 54.65 +Bond | 4.9992 | 5.0781 | 5.1544 | 2.7 | 12.34 +Kspace | 9.1202 | 10.806 | 12.272 | 39.7 | 26.27 +Neigh | 0.45045 | 0.45076 | 0.45094 | 0.0 | 1.10 +Comm | 0.85982 | 0.87287 | 0.88725 | 1.2 | 2.12 +Output | 0.0036495 | 0.004005 | 0.0049655 | 0.9 | 0.01 +Modify | 1.4009 | 1.401 | 1.4013 | 0.0 | 3.41 +Other | | 0.04245 | | | 0.10 + +Nlocal: 1375 ave 1398 max 1361 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +Nghost: 7745.75 ave 7788 max 7697 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Neighs: 334374 ave 348629 max 319495 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 1337494 +Ave neighs/atom = 243.181 +Ave special neighs/atom = 15.6364 +Neighbor list builds = 31 +Dangerous builds = 0 +Total wall time: 0:00:41 diff --git a/examples/USER/drude/toluene/log.toluene.nh.11Aug17.linux.1 b/examples/USER/drude/toluene/log.toluene.nh.11Aug17.linux.1 new file mode 100644 index 0000000000..6070b858be --- /dev/null +++ b/examples/USER/drude/toluene/log.toluene.nh.11Aug17.linux.1 @@ -0,0 +1,259 @@ +LAMMPS (11 Aug 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 250 toluene system for drude polarizability example (Nose-Hoover) + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic +dihedral_style opls +improper_style opls +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/thole/long 2.600 8.0 8.0 +pair_modify mix geometric tail yes +kspace_style pppm 1.0e-4 + +read_data data.toluene extra/special/per/atom 1 + orthogonal box = (-18.2908 -18.1636 -18.223) to (18.3357 18.1621 18.3287) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 5500 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 8 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 5500 bonds + reading angles ... + 6000 angles + reading dihedrals ... + 6000 dihedrals + reading impropers ... + 1500 impropers + 5 = max # of 1-2 neighbors + 10 = max # of 1-3 neighbors + 16 = max # of 1-4 neighbors + 20 = max # of special neighbors + +comm_modify vel yes + +group gTOLUENE molecule 1:250 +5500 atoms in group gTOLUENE +group gCORES type 1 2 3 4 5 6 7 +3750 atoms in group gCORES +group gDRUDES type 8 9 10 11 12 +1750 atoms in group gDRUDES + +pair_coeff 1 1 0.069998 3.550000 1.620000 # CAT CAT +pair_coeff 1 2 0.069998 3.550000 1.620000 # CAT CAO +pair_coeff 1 3 0.069998 3.550000 1.620000 # CAT CAM +pair_coeff 1 4 0.069998 3.550000 1.620000 # CAT CAP +pair_coeff 1 5 0.067968 3.524911 1.620000 # CAT CTT +pair_coeff 1 6 0.045825 2.931041 0.000000 # CAT HAT +pair_coeff 1 7 0.045825 2.931041 0.000000 # CAT HT +pair_coeff 2 2 0.069998 3.550000 1.620000 # CAO CAO +pair_coeff 2 3 0.069998 3.550000 1.620000 # CAO CAM +pair_coeff 2 4 0.069998 3.550000 1.620000 # CAO CAP +pair_coeff 2 5 0.067968 3.524911 1.620000 # CAO CTT +pair_coeff 2 6 0.045825 2.931041 0.000000 # CAO HAT +pair_coeff 2 7 0.045825 2.931041 0.000000 # CAO HT +pair_coeff 3 3 0.069998 3.550000 1.620000 # CAM CAM +pair_coeff 3 4 0.069998 3.550000 1.620000 # CAM CAP +pair_coeff 3 5 0.067968 3.524911 1.620000 # CAM CTT +pair_coeff 3 6 0.045825 2.931041 0.000000 # CAM HAT +pair_coeff 3 7 0.045825 2.931041 0.000000 # CAM HT +pair_coeff 4 4 0.069998 3.550000 1.620000 # CAP CAP +pair_coeff 4 5 0.067968 3.524911 1.620000 # CAP CTT +pair_coeff 4 6 0.045825 2.931041 0.000000 # CAP HAT +pair_coeff 4 7 0.045825 2.931041 0.000000 # CAP HT +pair_coeff 5 5 0.065997 3.500000 1.620000 # CTT CTT +pair_coeff 5 6 0.044496 2.910326 0.000000 # CTT HAT +pair_coeff 5 7 0.044496 2.910326 0.000000 # CTT HT +pair_coeff 6 6 0.029999 2.420000 0.000000 # HAT HAT +pair_coeff 6 7 0.029999 2.420000 0.000000 # HAT HT +pair_coeff 7 7 0.029999 2.420000 0.000000 # HT HT +pair_coeff 1 8 0.000000 0.000000 1.620000 # CAT D_CAT +pair_coeff 1 9 0.000000 0.000000 1.620000 # CAT D_CAO +pair_coeff 1 10 0.000000 0.000000 1.620000 # CAT D_CAM +pair_coeff 1 11 0.000000 0.000000 1.620000 # CAT D_CAP +pair_coeff 1 12 0.000000 0.000000 1.620000 # CAT D_CTT +pair_coeff 2 8 0.000000 0.000000 1.620000 # CAO D_CAT +pair_coeff 2 9 0.000000 0.000000 1.620000 # CAO D_CAO +pair_coeff 2 10 0.000000 0.000000 1.620000 # CAO D_CAM +pair_coeff 2 11 0.000000 0.000000 1.620000 # CAO D_CAP +pair_coeff 2 12 0.000000 0.000000 1.620000 # CAO D_CTT +pair_coeff 3 8 0.000000 0.000000 1.620000 # CAM D_CAT +pair_coeff 3 9 0.000000 0.000000 1.620000 # CAM D_CAO +pair_coeff 3 10 0.000000 0.000000 1.620000 # CAM D_CAM +pair_coeff 3 11 0.000000 0.000000 1.620000 # CAM D_CAP +pair_coeff 3 12 0.000000 0.000000 1.620000 # CAM D_CTT +pair_coeff 4 8 0.000000 0.000000 1.620000 # CAP D_CAT +pair_coeff 4 9 0.000000 0.000000 1.620000 # CAP D_CAO +pair_coeff 4 10 0.000000 0.000000 1.620000 # CAP D_CAM +pair_coeff 4 11 0.000000 0.000000 1.620000 # CAP D_CAP +pair_coeff 4 12 0.000000 0.000000 1.620000 # CAP D_CTT +pair_coeff 5 8 0.000000 0.000000 1.620000 # CTT D_CAT +pair_coeff 5 9 0.000000 0.000000 1.620000 # CTT D_CAO +pair_coeff 5 10 0.000000 0.000000 1.620000 # CTT D_CAM +pair_coeff 5 11 0.000000 0.000000 1.620000 # CTT D_CAP +pair_coeff 5 12 0.000000 0.000000 1.620000 # CTT D_CTT +pair_coeff 8 8 0.000000 0.000000 1.620000 # D_CAT D_CAT +pair_coeff 8 9 0.000000 0.000000 1.620000 # D_CAT D_CAO +pair_coeff 8 10 0.000000 0.000000 1.620000 # D_CAT D_CAM +pair_coeff 8 11 0.000000 0.000000 1.620000 # D_CAT D_CAP +pair_coeff 8 12 0.000000 0.000000 1.620000 # D_CAT D_CTT +pair_coeff 9 9 0.000000 0.000000 1.620000 # D_CAO D_CAO +pair_coeff 9 10 0.000000 0.000000 1.620000 # D_CAO D_CAM +pair_coeff 9 11 0.000000 0.000000 1.620000 # D_CAO D_CAP +pair_coeff 9 12 0.000000 0.000000 1.620000 # D_CAO D_CTT +pair_coeff 10 10 0.000000 0.000000 1.620000 # D_CAM D_CAM +pair_coeff 10 11 0.000000 0.000000 1.620000 # D_CAM D_CAP +pair_coeff 10 12 0.000000 0.000000 1.620000 # D_CAM D_CTT +pair_coeff 11 11 0.000000 0.000000 1.620000 # D_CAP D_CAP +pair_coeff 11 12 0.000000 0.000000 1.620000 # D_CAP D_CTT +pair_coeff 12 12 0.000000 0.000000 1.620000 # D_CTT D_CTT + + +neighbor 2.0 bin + +variable vTEMP equal 260.0 +variable vTEMP_D equal 1.0 +variable vPRESS equal 1.0 + +velocity gCORES create ${vTEMP} 12345 +velocity gCORES create 260 12345 +velocity gDRUDES create ${vTEMP_D} 12345 +velocity gDRUDES create 1 12345 + +fix fDRUDE all drude C C C C C N N D D D D D + +fix fSHAKE gCORES shake 0.0001 20 0 b 4 6 7 8 + 1250 = # of size 2 clusters + 0 = # of size 3 clusters + 250 = # of size 4 clusters + 0 = # of frozen angles + +compute cTEMP_CORE gCORES temp/com +compute cTEMP all temp/drude + +fix fDIRECT all drude/transform/direct +fix fNVT1 gCORES nvt temp ${vTEMP} ${vTEMP} 100.0 +fix fNVT1 gCORES nvt temp 260 ${vTEMP} 100.0 +fix fNVT1 gCORES nvt temp 260 260 100.0 +fix fNVT2 gDRUDES nvt temp ${vTEMP_D} ${vTEMP_D} 20.0 +fix fNVT2 gDRUDES nvt temp 1 ${vTEMP_D} 20.0 +fix fNVT2 gDRUDES nvt temp 1 1 20.0 +fix fINVERSE all drude/transform/inverse + +fix fMOMENTUM all momentum 100 linear 1 1 1 + +thermo_style custom step cpu etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press vol c_cTEMP[1] c_cTEMP[2] +thermo 50 + +timestep 0.5 +run 2000 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.382011 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0325934 + estimated relative force accuracy = 9.8154e-05 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Rebuild special list taking Drude particles into account +Old max number of 1-2 to 1-4 neighbors: 19 +New max number of 1-2 to 1-4 neighbors: 20 (+1) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 8 8 8 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut/thole/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 42.06 | 42.06 | 42.06 Mbytes +Step CPU TotEng KinEng Temp PotEng E_bond E_angle E_dihed E_impro E_vdwl E_coul E_long Press Volume c_cTEMP[1] c_cTEMP[2] + 0 0 14386.197 2910.7282 202.07402 11475.469 6565.4851 20.333365 1.0706727e-06 1.3894617e-07 4972.8631 1306116.6 -1306199.8 40273.68 48631.318 314.89553 3.1777821 + 50 4.462481 6863.642 4633.9267 321.70512 2229.7153 735.2547 604.6946 648.35773 49.039129 824.06033 1306091.3 -1306722.9 17914.827 48631.318 504.18525 0.0086839843 + 100 8.8666639 6628.0722 4376.1868 303.81182 2251.8853 598.11249 651.43051 919.41359 74.216826 589.6504 1306135.1 -1306716 17450.721 48631.318 476.14276 0.0075129702 + 150 13.323556 6336.1884 4726.0692 328.10201 1610.1192 560.01225 621.30109 640.32475 45.531175 288.99128 1306173.9 -1306720 18303.624 48631.318 514.21215 0.0061921467 + 200 17.710109 5997.6194 4565.6288 316.96362 1431.9906 524.2765 591.79843 718.11015 56.374558 88.660843 1306183 -1306730.3 17986.182 48631.318 496.75522 0.00681205 + 250 22.154451 5648.1758 4433.1558 307.76682 1215.02 502.13687 578.85369 665.27326 49.096119 -19.019967 1306179.2 -1306740.5 11771.328 48631.318 482.34141 0.0071619539 + 300 26.524393 5317.8584 4075.2077 282.91669 1242.6506 602.55113 637.40817 647.27074 44.769726 -123.22347 1306183.3 -1306749.5 3571.1867 48631.318 443.3952 0.0071733829 + 350 30.881443 4996.709 3935.7988 273.23838 1060.9102 455.75196 634.36552 638.77826 45.831053 -157.6304 1306198.1 -1306754.3 13525.264 48631.318 428.22739 0.0063722044 + 400 35.218285 4695.9297 3742.6585 259.82983 953.27122 457.49584 620.73047 591.94411 42.495713 -183.91838 1306186.7 -1306762.2 10901.217 48631.318 407.21326 0.005787501 + 450 39.545502 4417.8027 3513.6374 243.9303 904.16528 519.61263 580.76003 624.06933 45.631271 -286.60025 1306184.3 -1306763.6 2956.9012 48631.318 382.29486 0.0057536613 + 500 43.868895 4165.0012 3333.7203 231.43976 831.28089 465.5234 579.36085 580.60005 42.34515 -254.82269 1306183.9 -1306765.6 5818.5565 48631.318 362.71904 0.0059224891 + 550 48.242395 3934.5209 3211.9362 222.98504 722.58462 431.14864 581.46511 517.2025 39.188196 -265.47041 1306182.7 -1306763.6 8537.9404 48631.318 349.46863 0.0055762504 + 600 52.542171 3714.8655 3121.0494 216.67532 593.81611 425.12998 539.89496 490.30508 34.564566 -305.82069 1306175.2 -1306765.5 7402.7677 48631.318 339.57967 0.0057486673 + 650 56.830079 3516.2452 2930.7498 203.46399 585.49537 511.91461 512.48859 521.40636 37.766801 -391.65392 1306163.5 -1306770 381.72879 48631.318 318.87447 0.0054629243 + 700 61.119511 3342.7694 2864.1576 198.8409 478.6118 451.54683 498.82407 489.17207 35.23127 -375.78886 1306153.8 -1306774.2 3691.2716 48631.318 311.62801 0.0071278731 + 750 65.401576 3181.7673 2786.7104 193.46422 395.05691 409.83192 508.19542 454.56182 32.890716 -379.80692 1306149 -1306779.6 7428.3698 48631.318 303.20195 0.006233194 + 800 69.680899 3032.4158 2699.8707 187.43547 332.54509 453.40673 486.16575 441.1235 32.847786 -437.39338 1306144.4 -1306788 1701.7652 48631.318 293.75377 0.0056528223 + 850 73.96463 2898.4928 2563.6959 177.98169 334.7969 463.66637 486.19929 453.38803 34.062233 -455.86062 1306144.2 -1306790.9 -285.03665 48631.318 278.9376 0.0052777781 + 900 78.229548 2780.3555 2528.3241 175.52604 252.03136 396.92692 451.76463 435.59744 33.035257 -413.46176 1306142.9 -1306794.7 3836.4341 48631.318 275.08801 0.0070306435 + 950 82.482848 2679.3417 2456.8817 170.56624 222.45998 385.66656 434.6516 418.37977 32.156722 -387.2201 1306136.9 -1306798.1 5510.2309 48631.318 267.31515 0.0064042654 + 1000 86.722726 2593.4365 2367.4477 164.35738 225.98882 427.8524 453.27435 415.48809 31.097577 -436.62051 1306131.8 -1306796.9 1166.3909 48631.318 257.58464 0.0059160543 + 1050 90.888482 2524.7788 2305.0253 160.02377 219.75349 432.90807 438.86657 412.79356 30.892593 -414.29436 1306119.4 -1306800.8 1698.2687 48631.318 250.79245 0.0065593259 + 1100 95.024656 2471.8176 2311.0953 160.44518 160.72227 378.43572 453.3435 392.48525 29.012472 -409.64374 1306119.6 -1306802.5 4190.91 48631.318 251.45323 0.0059713432 + 1150 99.165724 2433.9279 2279.0766 158.22231 154.8513 395.30434 436.87933 414.39389 31.118973 -428.90902 1306110.2 -1306804.2 3274.8924 48631.318 247.96893 0.0069039065 + 1200 103.31062 2411.3777 2238.4638 155.40282 172.91381 453.61551 460.27693 408.59237 31.237062 -482.78549 1306110.2 -1306808.2 -523.10179 48631.318 243.55012 0.0068754631 + 1250 107.40149 2402.1932 2286.0576 158.70696 116.13565 416.44979 462.75875 391.75373 29.446705 -477.67214 1306102.2 -1306808.8 484.04837 48631.318 248.72579 0.011679749 + 1300 111.55448 2406.5029 2261.2729 156.98631 145.23005 408.68043 437.74725 400.4567 30.448106 -418.44274 1306096.8 -1306810.5 4490.4165 48631.318 245.99228 0.076574936 + 1350 115.71244 2459.1398 2317.5855 160.89575 141.55434 651.84862 447.40877 400.66793 29.060967 -461.45124 1305884.3 -1306810.3 693.59782 48631.318 250.14098 3.5622064 + 1400 119.88515 2479.5991 2285.6701 158.68006 193.929 582.54021 457.54475 430.29254 30.183876 -449.49979 1305955.6 -1306812.8 930.31169 48631.318 247.21826 2.5935077 + 1450 124.05689 2498.3537 2286.4924 158.73715 211.86128 434.79588 477.9598 402.79356 31.070492 -406.60813 1306086.4 -1306814.5 2933.4418 48631.318 248.74646 0.058608522 + 1500 128.29115 2546.66 2423.6257 168.25747 123.03432 392.07474 456.01536 385.97457 29.255586 -417.92459 1306089.9 -1306812.3 3333.3497 48631.318 263.694 0.011243575 + 1550 132.46344 2596.5481 2325.2227 161.42596 271.32542 462.52464 469.53612 461.20308 34.616094 -423.51186 1306080.4 -1306813.4 2155.0566 48631.318 252.98739 0.011191115 + 1600 136.64497 2646.7844 2387.8797 165.77585 258.90469 424.6071 484.95314 449.56642 33.318144 -395.67454 1306077 -1306814.8 1291.5449 48631.318 259.80403 0.012426122 + 1650 140.83234 2700.2847 2387.3033 165.73584 312.98138 431.00741 496.39504 455.52303 32.724808 -357.63815 1306070.3 -1306815.3 5007.2365 48631.318 259.70198 0.081729799 + 1700 145.02103 2777.9556 2386.7756 165.6992 391.18003 636.61544 523.12627 482.84847 35.186128 -391.10505 1305919.7 -1306815.2 2192.7076 48631.318 258.14043 2.7318649 + 1750 149.22218 2829.5998 2559.2796 177.67509 270.32019 684.587 479.93609 446.30457 31.888933 -385.84966 1305832.5 -1306819.1 1683.1471 48631.318 276.95798 2.6465587 + 1800 153.41978 2835.768 2465.6959 171.17815 370.07208 470.05934 508.38934 479.71489 37.826868 -369.0767 1306062.8 -1306819.6 3023.0762 48631.318 268.22249 0.097440318 + 1850 157.62632 2857.7601 2504.3893 173.86439 353.37083 436.06841 516.10132 487.71301 36.514956 -385.43181 1306078.9 -1306816.5 2950.5189 48631.318 272.47825 0.016816883 + 1900 161.8372 2867.791 2528.8957 175.56572 338.89527 446.38065 509.27013 485.03036 37.283587 -402.68445 1306076.6 -1306812.9 3161.5045 48631.318 275.1476 0.011615474 + 1950 166.10858 2861.34 2513.9103 174.52538 347.4297 470.9855 536.84666 467.9604 36.049051 -430.05716 1306079.3 -1306813.6 738.77866 48631.318 273.51233 0.020075246 + 2000 170.32286 2838.0367 2530.4481 175.6735 307.58858 423.18694 516.91384 454.72628 35.048394 -387.67176 1306074.6 -1306809.3 4321.7103 48631.318 275.24492 0.13775419 +Loop time of 170.323 on 1 procs for 2000 steps with 5500 atoms + +Performance: 0.507 ns/day, 47.312 hours/ns, 11.742 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 | 105.66 | 105.66 | 105.66 | 0.0 | 62.04 +Bond | 19.802 | 19.802 | 19.802 | 0.0 | 11.63 +Kspace | 35.029 | 35.029 | 35.029 | 0.0 | 20.57 +Neigh | 2.7502 | 2.7502 | 2.7502 | 0.0 | 1.61 +Comm | 0.62654 | 0.62654 | 0.62654 | 0.0 | 0.37 +Output | 0.006705 | 0.006705 | 0.006705 | 0.0 | 0.00 +Modify | 6.3072 | 6.3072 | 6.3072 | 0.0 | 3.70 +Other | | 0.1366 | | | 0.08 + +Nlocal: 5500 ave 5500 max 5500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 15407 ave 15407 max 15407 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1.30509e+06 ave 1.30509e+06 max 1.30509e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1305088 +Ave neighs/atom = 237.289 +Ave special neighs/atom = 15.6364 +Neighbor list builds = 44 +Dangerous builds = 0 +Total wall time: 0:02:50 diff --git a/examples/USER/drude/toluene/log.toluene.nh.11Aug17.linux.4 b/examples/USER/drude/toluene/log.toluene.nh.11Aug17.linux.4 new file mode 100644 index 0000000000..673f867ab4 --- /dev/null +++ b/examples/USER/drude/toluene/log.toluene.nh.11Aug17.linux.4 @@ -0,0 +1,259 @@ +LAMMPS (11 Aug 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 250 toluene system for drude polarizability example (Nose-Hoover) + +units real +boundary p p p + +atom_style full +bond_style harmonic +angle_style harmonic +dihedral_style opls +improper_style opls +special_bonds lj/coul 0.0 0.0 0.5 + +pair_style lj/cut/thole/long 2.600 8.0 8.0 +pair_modify mix geometric tail yes +kspace_style pppm 1.0e-4 + +read_data data.toluene extra/special/per/atom 1 + orthogonal box = (-18.2908 -18.1636 -18.223) to (18.3357 18.1621 18.3287) + 2 by 1 by 2 MPI processor grid + reading atoms ... + 5500 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 8 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 5500 bonds + reading angles ... + 6000 angles + reading dihedrals ... + 6000 dihedrals + reading impropers ... + 1500 impropers + 5 = max # of 1-2 neighbors + 10 = max # of 1-3 neighbors + 16 = max # of 1-4 neighbors + 20 = max # of special neighbors + +comm_modify vel yes + +group gTOLUENE molecule 1:250 +5500 atoms in group gTOLUENE +group gCORES type 1 2 3 4 5 6 7 +3750 atoms in group gCORES +group gDRUDES type 8 9 10 11 12 +1750 atoms in group gDRUDES + +pair_coeff 1 1 0.069998 3.550000 1.620000 # CAT CAT +pair_coeff 1 2 0.069998 3.550000 1.620000 # CAT CAO +pair_coeff 1 3 0.069998 3.550000 1.620000 # CAT CAM +pair_coeff 1 4 0.069998 3.550000 1.620000 # CAT CAP +pair_coeff 1 5 0.067968 3.524911 1.620000 # CAT CTT +pair_coeff 1 6 0.045825 2.931041 0.000000 # CAT HAT +pair_coeff 1 7 0.045825 2.931041 0.000000 # CAT HT +pair_coeff 2 2 0.069998 3.550000 1.620000 # CAO CAO +pair_coeff 2 3 0.069998 3.550000 1.620000 # CAO CAM +pair_coeff 2 4 0.069998 3.550000 1.620000 # CAO CAP +pair_coeff 2 5 0.067968 3.524911 1.620000 # CAO CTT +pair_coeff 2 6 0.045825 2.931041 0.000000 # CAO HAT +pair_coeff 2 7 0.045825 2.931041 0.000000 # CAO HT +pair_coeff 3 3 0.069998 3.550000 1.620000 # CAM CAM +pair_coeff 3 4 0.069998 3.550000 1.620000 # CAM CAP +pair_coeff 3 5 0.067968 3.524911 1.620000 # CAM CTT +pair_coeff 3 6 0.045825 2.931041 0.000000 # CAM HAT +pair_coeff 3 7 0.045825 2.931041 0.000000 # CAM HT +pair_coeff 4 4 0.069998 3.550000 1.620000 # CAP CAP +pair_coeff 4 5 0.067968 3.524911 1.620000 # CAP CTT +pair_coeff 4 6 0.045825 2.931041 0.000000 # CAP HAT +pair_coeff 4 7 0.045825 2.931041 0.000000 # CAP HT +pair_coeff 5 5 0.065997 3.500000 1.620000 # CTT CTT +pair_coeff 5 6 0.044496 2.910326 0.000000 # CTT HAT +pair_coeff 5 7 0.044496 2.910326 0.000000 # CTT HT +pair_coeff 6 6 0.029999 2.420000 0.000000 # HAT HAT +pair_coeff 6 7 0.029999 2.420000 0.000000 # HAT HT +pair_coeff 7 7 0.029999 2.420000 0.000000 # HT HT +pair_coeff 1 8 0.000000 0.000000 1.620000 # CAT D_CAT +pair_coeff 1 9 0.000000 0.000000 1.620000 # CAT D_CAO +pair_coeff 1 10 0.000000 0.000000 1.620000 # CAT D_CAM +pair_coeff 1 11 0.000000 0.000000 1.620000 # CAT D_CAP +pair_coeff 1 12 0.000000 0.000000 1.620000 # CAT D_CTT +pair_coeff 2 8 0.000000 0.000000 1.620000 # CAO D_CAT +pair_coeff 2 9 0.000000 0.000000 1.620000 # CAO D_CAO +pair_coeff 2 10 0.000000 0.000000 1.620000 # CAO D_CAM +pair_coeff 2 11 0.000000 0.000000 1.620000 # CAO D_CAP +pair_coeff 2 12 0.000000 0.000000 1.620000 # CAO D_CTT +pair_coeff 3 8 0.000000 0.000000 1.620000 # CAM D_CAT +pair_coeff 3 9 0.000000 0.000000 1.620000 # CAM D_CAO +pair_coeff 3 10 0.000000 0.000000 1.620000 # CAM D_CAM +pair_coeff 3 11 0.000000 0.000000 1.620000 # CAM D_CAP +pair_coeff 3 12 0.000000 0.000000 1.620000 # CAM D_CTT +pair_coeff 4 8 0.000000 0.000000 1.620000 # CAP D_CAT +pair_coeff 4 9 0.000000 0.000000 1.620000 # CAP D_CAO +pair_coeff 4 10 0.000000 0.000000 1.620000 # CAP D_CAM +pair_coeff 4 11 0.000000 0.000000 1.620000 # CAP D_CAP +pair_coeff 4 12 0.000000 0.000000 1.620000 # CAP D_CTT +pair_coeff 5 8 0.000000 0.000000 1.620000 # CTT D_CAT +pair_coeff 5 9 0.000000 0.000000 1.620000 # CTT D_CAO +pair_coeff 5 10 0.000000 0.000000 1.620000 # CTT D_CAM +pair_coeff 5 11 0.000000 0.000000 1.620000 # CTT D_CAP +pair_coeff 5 12 0.000000 0.000000 1.620000 # CTT D_CTT +pair_coeff 8 8 0.000000 0.000000 1.620000 # D_CAT D_CAT +pair_coeff 8 9 0.000000 0.000000 1.620000 # D_CAT D_CAO +pair_coeff 8 10 0.000000 0.000000 1.620000 # D_CAT D_CAM +pair_coeff 8 11 0.000000 0.000000 1.620000 # D_CAT D_CAP +pair_coeff 8 12 0.000000 0.000000 1.620000 # D_CAT D_CTT +pair_coeff 9 9 0.000000 0.000000 1.620000 # D_CAO D_CAO +pair_coeff 9 10 0.000000 0.000000 1.620000 # D_CAO D_CAM +pair_coeff 9 11 0.000000 0.000000 1.620000 # D_CAO D_CAP +pair_coeff 9 12 0.000000 0.000000 1.620000 # D_CAO D_CTT +pair_coeff 10 10 0.000000 0.000000 1.620000 # D_CAM D_CAM +pair_coeff 10 11 0.000000 0.000000 1.620000 # D_CAM D_CAP +pair_coeff 10 12 0.000000 0.000000 1.620000 # D_CAM D_CTT +pair_coeff 11 11 0.000000 0.000000 1.620000 # D_CAP D_CAP +pair_coeff 11 12 0.000000 0.000000 1.620000 # D_CAP D_CTT +pair_coeff 12 12 0.000000 0.000000 1.620000 # D_CTT D_CTT + + +neighbor 2.0 bin + +variable vTEMP equal 260.0 +variable vTEMP_D equal 1.0 +variable vPRESS equal 1.0 + +velocity gCORES create ${vTEMP} 12345 +velocity gCORES create 260 12345 +velocity gDRUDES create ${vTEMP_D} 12345 +velocity gDRUDES create 1 12345 + +fix fDRUDE all drude C C C C C N N D D D D D + +fix fSHAKE gCORES shake 0.0001 20 0 b 4 6 7 8 + 1250 = # of size 2 clusters + 0 = # of size 3 clusters + 250 = # of size 4 clusters + 0 = # of frozen angles + +compute cTEMP_CORE gCORES temp/com +compute cTEMP all temp/drude + +fix fDIRECT all drude/transform/direct +fix fNVT1 gCORES nvt temp ${vTEMP} ${vTEMP} 100.0 +fix fNVT1 gCORES nvt temp 260 ${vTEMP} 100.0 +fix fNVT1 gCORES nvt temp 260 260 100.0 +fix fNVT2 gDRUDES nvt temp ${vTEMP_D} ${vTEMP_D} 20.0 +fix fNVT2 gDRUDES nvt temp 1 ${vTEMP_D} 20.0 +fix fNVT2 gDRUDES nvt temp 1 1 20.0 +fix fINVERSE all drude/transform/inverse + +fix fMOMENTUM all momentum 100 linear 1 1 1 + +thermo_style custom step cpu etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press vol c_cTEMP[1] c_cTEMP[2] +thermo 50 + +timestep 0.5 +run 2000 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.382011 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0325934 + estimated relative force accuracy = 9.8154e-05 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +Rebuild special list taking Drude particles into account +Old max number of 1-2 to 1-4 neighbors: 19 +New max number of 1-2 to 1-4 neighbors: 20 (+1) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 8 8 8 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut/thole/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 18 | 18 | 18 Mbytes +Step CPU TotEng KinEng Temp PotEng E_bond E_angle E_dihed E_impro E_vdwl E_coul E_long Press Volume c_cTEMP[1] c_cTEMP[2] + 0 0 14386.197 2910.7282 202.07402 11475.469 6565.4851 20.333365 1.0706727e-06 1.3894617e-07 4972.8631 1306116.6 -1306199.8 40273.68 48631.318 314.89553 3.1777821 + 50 1.1419601 6863.6417 4633.9267 321.70512 2229.715 735.2547 604.69459 648.35773 49.039129 824.06033 1306091.3 -1306722.9 17914.827 48631.318 504.18525 0.0086839775 + 100 2.3001912 6628.0719 4376.1868 303.81182 2251.8851 598.11248 651.43051 919.41359 74.216825 589.6504 1306135.1 -1306716 17450.721 48631.318 476.14276 0.0075129701 + 150 3.473469 6336.1884 4726.0692 328.10201 1610.1192 560.01225 621.30109 640.32474 45.531174 288.99129 1306173.9 -1306720 18303.624 48631.318 514.21215 0.006192153 + 200 4.6296241 5997.6192 4565.6288 316.96362 1431.9903 524.27651 591.79844 718.11014 56.374557 88.66084 1306183 -1306730.3 17986.183 48631.318 496.75522 0.0068120542 + 250 5.7982912 5648.1756 4433.1557 307.76682 1215.0199 502.13686 578.8537 665.27326 49.096119 -19.019961 1306179.2 -1306740.5 11771.328 48631.318 482.34141 0.0071619522 + 300 6.9468622 5317.8583 4075.2077 282.91669 1242.6505 602.55113 637.40818 647.27073 44.769725 -123.22347 1306183.3 -1306749.5 3571.1872 48631.318 443.3952 0.0071733908 + 350 8.0925181 4996.7094 3935.7988 273.23838 1060.9106 455.75195 634.3655 638.77824 45.831051 -157.63039 1306198.1 -1306754.3 13525.265 48631.318 428.22739 0.0063722017 + 400 9.2309761 4695.9294 3742.6584 259.82983 953.27093 457.49585 620.73048 591.94413 42.495714 -183.91838 1306186.7 -1306762.2 10901.217 48631.318 407.21326 0.0057875 + 450 10.363872 4417.8018 3513.6374 243.9303 904.1644 519.61261 580.76003 624.06933 45.631272 -286.60025 1306184.3 -1306763.6 2956.9021 48631.318 382.29485 0.0057536673 + 500 11.493601 4165.0005 3333.7203 231.43976 831.28022 465.52341 579.36085 580.60004 42.345149 -254.82269 1306183.9 -1306765.6 5818.5549 48631.318 362.71904 0.0059224858 + 550 12.636785 3934.5207 3211.9362 222.98504 722.58446 431.14864 581.46511 517.20249 39.188194 -265.4704 1306182.7 -1306763.6 8537.9415 48631.318 349.46863 0.0055762027 + 600 13.759642 3714.8658 3121.0493 216.67532 593.81649 425.12998 539.89497 490.30506 34.564567 -305.82067 1306175.2 -1306765.5 7402.7688 48631.318 339.57967 0.005748668 + 650 14.880794 3516.2453 2930.7499 203.464 585.49542 511.91457 512.48857 521.40634 37.766798 -391.65394 1306163.5 -1306770 381.72898 48631.318 318.87448 0.0054629381 + 700 15.99791 3342.7693 2864.1576 198.8409 478.61174 451.54685 498.82406 489.17206 35.231269 -375.78888 1306153.8 -1306774.2 3691.2706 48631.318 311.62801 0.0071278792 + 750 17.111346 3181.7665 2786.7104 193.46422 395.05608 409.83191 508.19537 454.56183 32.890719 -379.80694 1306149 -1306779.6 7428.3698 48631.318 303.20196 0.0062331873 + 800 18.219225 3032.4162 2699.8707 187.43547 332.54543 453.40674 486.16573 441.12346 32.847783 -437.39291 1306144.4 -1306788 1701.7675 48631.318 293.75377 0.0056528077 + 850 19.320825 2898.4936 2563.6961 177.9817 334.79757 463.66634 486.19928 453.38802 34.062236 -455.86081 1306144.2 -1306790.9 -285.04073 48631.318 278.93762 0.0052778244 + 900 20.41979 2780.3551 2528.3241 175.52604 252.03099 396.92693 451.7645 435.59756 33.035261 -413.46181 1306142.9 -1306794.7 3836.4347 48631.318 275.08801 0.0070307677 + 950 21.517533 2679.3418 2456.8821 170.56626 222.45967 385.66649 434.6516 418.37957 32.156706 -387.22039 1306136.9 -1306798.1 5510.2277 48631.318 267.31518 0.0064041284 + 1000 22.614275 2593.435 2367.4471 164.35734 225.98798 427.85237 453.27432 415.48822 31.097611 -436.61808 1306131.8 -1306796.9 1166.3709 48631.318 257.58457 0.0059160188 + 1050 23.688642 2524.7784 2305.0257 160.0238 219.75264 432.90797 438.8666 412.79338 30.892595 -414.29467 1306119.4 -1306800.8 1698.2602 48631.318 250.7925 0.0065595368 + 1100 24.750163 2471.818 2311.095 160.44516 160.72297 378.43554 453.3434 392.485 29.012487 -409.64322 1306119.6 -1306802.5 4190.9174 48631.318 251.4532 0.0059713928 + 1150 25.813605 2433.9311 2279.0768 158.22233 154.85433 395.30409 436.87935 414.39367 31.118959 -428.90913 1306110.2 -1306804.2 3274.9237 48631.318 247.96895 0.0069037916 + 1200 26.876952 2411.3772 2238.4639 155.40283 172.91329 453.61525 460.27658 408.59192 31.237007 -482.78468 1306110.2 -1306808.2 -523.10237 48631.318 243.55013 0.0068752641 + 1250 27.929701 2402.1937 2286.0559 158.70685 116.13778 416.44884 462.75935 391.75448 29.446777 -477.6718 1306102.2 -1306808.8 484.0561 48631.318 248.72561 0.011679662 + 1300 29.000999 2406.5014 2261.274 156.98639 145.22737 408.678 437.74824 400.45662 30.448139 -418.44472 1306096.8 -1306810.5 4490.4105 48631.318 245.9924 0.076575975 + 1350 30.07322 2459.141 2317.5852 160.89573 141.55579 651.85736 447.40791 400.66662 29.060882 -461.45016 1305884.3 -1306810.3 693.5247 48631.318 250.14112 3.5619231 + 1400 31.14859 2479.6103 2285.6714 158.68015 193.93893 582.54135 457.54445 430.29301 30.184026 -449.49877 1305955.6 -1306812.8 930.44669 48631.318 247.21806 2.5941109 + 1450 32.226914 2498.357 2286.4857 158.73668 211.87137 434.79636 477.95951 402.79572 31.070593 -406.60139 1306086.4 -1306814.5 2933.5045 48631.318 248.74572 0.058613153 + 1500 33.410717 2546.6608 2423.6247 168.25741 123.03609 392.07322 456.01243 385.97344 29.255562 -417.91413 1306089.9 -1306812.3 3333.391 48631.318 263.6939 0.011242005 + 1550 34.466176 2596.5534 2325.2208 161.42583 271.33259 462.52172 469.54241 461.20405 34.616224 -423.51068 1306080.4 -1306813.4 2155.1194 48631.318 252.98718 0.011190963 + 1600 35.524206 2646.7837 2387.8846 165.77619 258.8991 424.60563 484.95051 449.57767 33.318683 -395.68293 1306077 -1306814.8 1291.42 48631.318 259.80456 0.01242131 + 1650 36.582854 2700.2921 2387.3119 165.73643 312.98026 431.01369 496.39909 455.52591 32.725057 -357.65832 1306070.3 -1306815.3 5006.9348 48631.318 259.70291 0.081728845 + 1700 37.641527 2777.9572 2386.7777 165.69934 391.1795 636.55763 523.11512 482.8483 35.185863 -391.0955 1305919.8 -1306815.2 2192.6733 48631.318 258.1403 2.7324891 + 1750 38.722299 2829.6167 2559.2488 177.67295 270.36793 684.60746 479.95058 446.29664 31.887359 -385.83616 1305832.5 -1306819 1683.6061 48631.318 276.955 2.6459088 + 1800 39.800548 2835.7772 2465.7031 171.17865 370.07414 470.05306 508.38361 479.70121 37.826988 -369.0694 1306062.8 -1306819.6 3022.9801 48631.318 268.22328 0.097437593 + 1850 40.878327 2857.76 2504.4099 173.86582 353.35016 436.05857 516.10495 487.70907 36.514477 -385.43957 1306078.9 -1306816.5 2950.6415 48631.318 272.48049 0.016822774 + 1900 41.9583 2867.7843 2528.8424 175.56202 338.94193 446.38058 509.30719 485.04661 37.284135 -402.67104 1306076.5 -1306812.9 3161.5835 48631.318 275.1418 0.011620333 + 1950 43.058281 2861.3388 2513.8846 174.5236 347.45414 470.99292 536.81741 467.97736 36.047648 -430.00695 1306079.3 -1306813.6 739.25154 48631.318 273.50953 0.020089235 + 2000 44.142059 2838.068 2530.3189 175.66453 307.74914 423.19157 516.85371 454.76945 35.048253 -387.49234 1306074.6 -1306809.3 4324.0966 48631.318 275.23081 0.13784772 +Loop time of 44.1421 on 4 procs for 2000 steps with 5500 atoms + +Performance: 1.957 ns/day, 12.262 hours/ns, 45.308 timesteps/s +99.7% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 21.008 | 22.592 | 23.892 | 21.7 | 51.18 +Bond | 4.8951 | 5.1338 | 5.2542 | 6.4 | 11.63 +Kspace | 9.1158 | 10.514 | 12.296 | 35.3 | 23.82 +Neigh | 0.63826 | 0.63849 | 0.63875 | 0.0 | 1.45 +Comm | 0.78008 | 0.80146 | 0.84186 | 2.7 | 1.82 +Output | 0.0036852 | 0.0040929 | 0.0052037 | 1.0 | 0.01 +Modify | 4.3966 | 4.4074 | 4.4147 | 0.3 | 9.98 +Other | | 0.05088 | | | 0.12 + +Nlocal: 1375 ave 1415 max 1340 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Nghost: 8101 ave 8147 max 8056 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 326274 ave 342552 max 306832 min +Histogram: 1 0 0 0 1 0 1 0 0 1 + +Total # of neighbors = 1305095 +Ave neighs/atom = 237.29 +Ave special neighs/atom = 15.6364 +Neighbor list builds = 44 +Dangerous builds = 0 +Total wall time: 0:00:44 diff --git a/examples/USER/lb/polymer/data.polymer b/examples/USER/lb/polymer/data.polymer old mode 100755 new mode 100644 diff --git a/examples/USER/lb/polymer/in.polymer_default_gamma b/examples/USER/lb/polymer/in.polymer_default_gamma old mode 100755 new mode 100644 diff --git a/examples/USER/lb/polymer/in.polymer_setgamma b/examples/USER/lb/polymer/in.polymer_setgamma old mode 100755 new mode 100644 diff --git a/examples/USER/meso/README b/examples/USER/meso/README new file mode 100644 index 0000000000..4accc7ba01 --- /dev/null +++ b/examples/USER/meso/README @@ -0,0 +1,40 @@ +This directory contains input scripts for performing +simulations with these models: + +eDPD - energy-conserving dissipative particle dynamics +mDPD - many-body dissipative particle dynamics +tDPD - transport dissipative particle dynamics + +1) eDPD: The input script in.mdpd is an example simulation of +measuring the thermal conductivity by heat conduction analog of +periodic Poiseuille flow. The initial eDPD system is randomly filled +by many eDPD particles, and a set command "edpd/temp" gives the +initial temperature and a set command "edpd/cv" gives the heat +capacity of eDPD particles. A non-contact heat source/sink term is +applied by a fix command "edpd/source". A compute command +"edpd/temp/atom" obtain the temperature on each eDPD particle. The +simulation will generate a file named "temp.profile" showing the +temperature profile. For details please see online LAMMPS +documentation and Fig.12 in the paper Z. Li, et al. J Comput Phys, +2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 + +2) mDPD: The input script "in.mdpd" is an example simulation of +oscillations of a free liquid droplet. The initial configuration is a +liquid film whose particles are in a fcc lattice created by the +command "create atoms". Then the liquid film has a tendency to form a +spherical droplet under the effect of surface tension. For details +please see online LAMMPS documentation and the paper Z. Li, et +al. Phys Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 + +3) tDPD: The input script in.tdpd is an example simulation of +computing the effective diffusion coefficient of a tDPD system using a +method analogous to the periodic Poiseuille flow. Command "atom_style +tdpd 2" specifies the tDPD system with two chemical species. The +initial tDPD system is randomly filled by many tDPD particles, and a +set "cc" command gives initial concentration for each chemical +species. Fix commands "tdpd/source" add source terms and compute +commands "tdpd/cc/atom" obtain the chemical concentration on each tDPD +particle. The simulation will generate a file named "cc.profile" +showing the concentration profiles of the two chemical species. For +details please see online LAMMPS documentation and Fig.1 in the paper +Z. Li, et al. J Chem Phys, 2015, 143: 014101. DOI: 10.1063/1.4923254 diff --git a/examples/USER/meso/edpd/in.edpd b/examples/USER/meso/edpd/in.edpd new file mode 100644 index 0000000000..af1a79d73d --- /dev/null +++ b/examples/USER/meso/edpd/in.edpd @@ -0,0 +1,54 @@ +######################################################################## +### Heat conduction analog of periodic Poiseuille flow problem ### +### using energy-conserving DPD (eDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### mDPD system setup follows Fig.12 in the publication: ### +### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ### +### "Energy-conserving dissipative particle dynamics with ### +### temperature-dependent properties". J. Comput. Phys., ### +### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style edpd + +region edpd block -10 10 -10 10 -5 5 units box +create_box 1 edpd +create_atoms 1 random 16000 276438 NULL +mass 1 1.0 +set atom * edpd/temp 1.0 +set atom * edpd/cv 1.0E5 + +pair_style edpd 1.58 9872598 +#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 & + power 10.54 -3.66 3.44 -4.10 & + kappa -0.44 -3.21 5.04 0.00 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/edpd 0.5 +fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 + +timestep 0.01 +run 500 +reset_timestep 0 + +compute temp all edpd/temp/atom +compute ccT all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile + +run 500 diff --git a/examples/USER/meso/edpd/log.16Aug17.edpd.g++.1 b/examples/USER/meso/edpd/log.16Aug17.edpd.g++.1 new file mode 100644 index 0000000000..af975f877c --- /dev/null +++ b/examples/USER/meso/edpd/log.16Aug17.edpd.g++.1 @@ -0,0 +1,142 @@ +LAMMPS (11 Aug 2017) +######################################################################## +### Heat conduction analog of periodic Poiseuille flow problem ### +### using energy-conserving DPD (eDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### mDPD system setup follows Fig.12 in the publication: ### +### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ### +### "Energy-conserving dissipative particle dynamics with ### +### temperature-dependent properties". J. Comput. Phys., ### +### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style edpd + +region edpd block -10 10 -10 10 -5 5 units box +create_box 1 edpd +Created orthogonal box = (-10 -10 -5) to (10 10 5) + 1 by 1 by 1 MPI processor grid +create_atoms 1 random 16000 276438 NULL +Created 16000 atoms +mass 1 1.0 +set atom * edpd/temp 1.0 + 16000 settings made for edpd/temp +set atom * edpd/cv 1.0E5 + 16000 settings made for edpd/cv + +pair_style edpd 1.58 9872598 +#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 kappa -0.44 -3.21 5.04 0.00 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/edpd 0.5 +fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 + +timestep 0.01 +run 500 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.78 + ghost atom cutoff = 1.78 + binsize = 0.89, bins = 23 23 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edpd, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.64 | 11.64 | 11.64 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1 48.948932 0 50.448838 201.73366 + 100 1.0069712 43.754293 0 45.264656 199.5369 + 200 0.98667561 43.716052 0 45.195973 196.72854 + 300 1.0036944 43.706299 0 45.211746 195.35714 + 400 1.0024228 43.697014 0 45.200554 197.0062 + 500 0.99968161 43.687445 0 45.186873 193.80596 +Loop time of 80.7995 on 1 procs for 500 steps with 16000 atoms + +Performance: 5346.567 tau/day, 6.188 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 75.106 | 75.106 | 75.106 | 0.0 | 92.95 +Neigh | 4.9836 | 4.9836 | 4.9836 | 0.0 | 6.17 +Comm | 0.31199 | 0.31199 | 0.31199 | 0.0 | 0.39 +Output | 0.00048232 | 0.00048232 | 0.00048232 | 0.0 | 0.00 +Modify | 0.29985 | 0.29985 | 0.29985 | 0.0 | 0.37 +Other | | 0.09751 | | | 0.12 + +Nlocal: 16000 ave 16000 max 16000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 14091 ave 14091 max 14091 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 749111 ave 749111 max 749111 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 749111 +Ave neighs/atom = 46.8194 +Neighbor list builds = 181 +Dangerous builds = 0 +reset_timestep 0 + +compute temp all edpd/temp/atom +compute ccT all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile + +run 500 +Per MPI rank memory allocation (min/avg/max) = 12.14 | 12.14 | 12.14 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0.99968161 43.687397 0 45.186825 196.38426 + 100 1.0041443 43.668196 0 45.174318 195.38066 + 200 0.99628392 43.666173 0 45.160505 197.84675 + 300 1.0029116 43.66224 0 45.166513 199.67414 + 400 0.99922193 43.64406 0 45.142799 196.94404 + 500 0.99355431 43.623266 0 45.113505 195.94136 +Loop time of 80.7742 on 1 procs for 500 steps with 16000 atoms + +Performance: 5348.242 tau/day, 6.190 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 75.073 | 75.073 | 75.073 | 0.0 | 92.94 +Neigh | 4.8786 | 4.8786 | 4.8786 | 0.0 | 6.04 +Comm | 0.31086 | 0.31086 | 0.31086 | 0.0 | 0.38 +Output | 0.00045919 | 0.00045919 | 0.00045919 | 0.0 | 0.00 +Modify | 0.4139 | 0.4139 | 0.4139 | 0.0 | 0.51 +Other | | 0.09731 | | | 0.12 + +Nlocal: 16000 ave 16000 max 16000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 14091 ave 14091 max 14091 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 749667 ave 749667 max 749667 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 749667 +Ave neighs/atom = 46.8542 +Neighbor list builds = 178 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:02:41 diff --git a/examples/USER/meso/edpd/log.16Aug17.edpd.g++.4 b/examples/USER/meso/edpd/log.16Aug17.edpd.g++.4 new file mode 100644 index 0000000000..21206d38c6 --- /dev/null +++ b/examples/USER/meso/edpd/log.16Aug17.edpd.g++.4 @@ -0,0 +1,142 @@ +LAMMPS (11 Aug 2017) +######################################################################## +### Heat conduction analog of periodic Poiseuille flow problem ### +### using energy-conserving DPD (eDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### mDPD system setup follows Fig.12 in the publication: ### +### Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. ### +### "Energy-conserving dissipative particle dynamics with ### +### temperature-dependent properties". J. Comput. Phys., ### +### 2014, 265: 113-127. DOI: 10.1016/j.jcp.2014.02.003 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style edpd + +region edpd block -10 10 -10 10 -5 5 units box +create_box 1 edpd +Created orthogonal box = (-10 -10 -5) to (10 10 5) + 2 by 2 by 1 MPI processor grid +create_atoms 1 random 16000 276438 NULL +Created 16000 atoms +mass 1 1.0 +set atom * edpd/temp 1.0 + 16000 settings made for edpd/temp +set atom * edpd/cv 1.0E5 + 16000 settings made for edpd/cv + +pair_style edpd 1.58 9872598 +#pair_coeff 1 1 18.75 4.5 0.41 1.58 1.45E-5 2.0 1.58 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.41E-5 2.0 1.58 power 10.54 -3.66 3.44 -4.10 kappa -0.44 -3.21 5.04 0.00 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/edpd 0.5 +fix upper all edpd/source cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower all edpd/source cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 + +timestep 0.01 +run 500 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.78 + ghost atom cutoff = 1.78 + binsize = 0.89, bins = 23 23 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edpd, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.969 | 4.979 | 4.985 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1 48.948932 0 50.448838 199.51547 + 100 1.0106415 43.744371 0 45.260239 196.39598 + 200 1.0053215 43.714413 0 45.222301 195.35298 + 300 0.99886399 43.713356 0 45.211559 196.74821 + 400 1.0035264 43.699086 0 45.204282 195.47446 + 500 1.0025285 43.698051 0 45.20175 197.27042 +Loop time of 21.165 on 4 procs for 500 steps with 16000 atoms + +Performance: 20411.046 tau/day, 23.624 timesteps/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 18.713 | 19.101 | 19.41 | 6.0 | 90.25 +Neigh | 1.2687 | 1.2925 | 1.3177 | 1.5 | 6.11 +Comm | 0.33013 | 0.66337 | 1.0747 | 34.3 | 3.13 +Output | 0.00023484 | 0.00028092 | 0.00036526 | 0.0 | 0.00 +Modify | 0.073931 | 0.075277 | 0.076306 | 0.3 | 0.36 +Other | | 0.03227 | | | 0.15 + +Nlocal: 4000 ave 4067 max 3930 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Nghost: 5997.5 ave 6052 max 5943 min +Histogram: 1 0 1 0 0 0 0 1 0 1 +Neighs: 187388 ave 193157 max 181221 min +Histogram: 1 1 0 0 0 0 0 0 0 2 + +Total # of neighbors = 749552 +Ave neighs/atom = 46.847 +Neighbor list builds = 181 +Dangerous builds = 0 +reset_timestep 0 + +compute temp all edpd/temp/atom +compute ccT all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 500 500 ccT c_temp density/number norm sample file temp.profile + +run 500 +Per MPI rank memory allocation (min/avg/max) = 5.221 | 5.23 | 5.236 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.0025285 43.69801 0 45.201708 194.00452 + 100 0.9885969 43.679927 0 45.16273 196.28442 + 200 1.0028463 43.663067 0 45.167242 198.25592 + 300 1.0027516 43.648817 0 45.152851 198.82226 + 400 0.99695312 43.641469 0 45.136805 197.97499 + 500 0.98202292 43.627163 0 45.100105 199.16319 +Loop time of 21.576 on 4 procs for 500 steps with 16000 atoms + +Performance: 20022.203 tau/day, 23.174 timesteps/s +99.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 | 18.438 | 19.121 | 19.812 | 14.1 | 88.62 +Neigh | 1.2568 | 1.2885 | 1.325 | 2.5 | 5.97 +Comm | 0.29482 | 1.0219 | 1.7352 | 63.9 | 4.74 +Output | 0.00027728 | 0.00029719 | 0.0003531 | 0.0 | 0.00 +Modify | 0.11153 | 0.11265 | 0.1135 | 0.2 | 0.52 +Other | | 0.03194 | | | 0.15 + +Nlocal: 4000 ave 4092 max 3899 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 5974 ave 6019 max 5915 min +Histogram: 1 0 0 1 0 0 0 0 0 2 +Neighs: 187414 ave 196149 max 178418 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 749658 +Ave neighs/atom = 46.8536 +Neighbor list builds = 181 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:42 diff --git a/examples/USER/meso/edpd/temp.profile.16Aug17.edpd.g++.1 b/examples/USER/meso/edpd/temp.profile.16Aug17.edpd.g++.1 new file mode 100644 index 0000000000..469b550258 --- /dev/null +++ b/examples/USER/meso/edpd/temp.profile.16Aug17.edpd.g++.1 @@ -0,0 +1,24 @@ +# Chunk-averaged data for fix stat and group density/number +# Timestep Number-of-chunks Total-count +# Chunk Coord1 Ncount c_temp density/number +500 20 16000 + 1 -9.5 801.636 0.986368 4.00818 + 2 -8.5 809.788 0.966281 4.04894 + 3 -7.5 819.754 0.952764 4.09877 + 4 -6.5 820.364 0.944592 4.10182 + 5 -5.5 826.146 0.940968 4.13073 + 6 -4.5 819.52 0.941415 4.0976 + 7 -3.5 815.182 0.945887 4.07591 + 8 -2.5 817.168 0.95487 4.08584 + 9 -1.5 817.282 0.969225 4.08641 + 10 -0.5 804.204 0.989552 4.02102 + 11 0.5 793.266 1.01015 3.96633 + 12 1.5 789.056 1.0308 3.94528 + 13 2.5 784.344 1.04568 3.92172 + 14 3.5 780.592 1.05508 3.90296 + 15 4.5 772.218 1.05968 3.86109 + 16 5.5 776.968 1.06003 3.88484 + 17 6.5 780.858 1.05612 3.90429 + 18 7.5 786.174 1.04752 3.93087 + 19 8.5 788.922 1.03347 3.94461 + 20 9.5 796.558 1.01278 3.98279 diff --git a/examples/USER/meso/edpd/temp.profile.16Aug17.edpd.g++.4 b/examples/USER/meso/edpd/temp.profile.16Aug17.edpd.g++.4 new file mode 100644 index 0000000000..1c50a9b6e5 --- /dev/null +++ b/examples/USER/meso/edpd/temp.profile.16Aug17.edpd.g++.4 @@ -0,0 +1,24 @@ +# Chunk-averaged data for fix stat and group density/number +# Timestep Number-of-chunks Total-count +# Chunk Coord1 Ncount c_temp density/number +500 20 16000 + 1 -9.5 801.642 0.986089 4.00821 + 2 -8.5 819.168 0.966072 4.09584 + 3 -7.5 817.382 0.952718 4.08691 + 4 -6.5 818 0.944633 4.09 + 5 -5.5 817.806 0.941105 4.08903 + 6 -4.5 826.11 0.941499 4.13055 + 7 -3.5 821.946 0.945922 4.10973 + 8 -2.5 816.202 0.954889 4.08101 + 9 -1.5 813.202 0.969281 4.06601 + 10 -0.5 798.904 0.989463 3.99452 + 11 0.5 798.056 1.01005 3.99028 + 12 1.5 793.114 1.03073 3.96557 + 13 2.5 782.812 1.04569 3.91406 + 14 3.5 775.69 1.05498 3.87845 + 15 4.5 778.094 1.05965 3.89047 + 16 5.5 778.856 1.06002 3.89428 + 17 6.5 780.51 1.05621 3.90255 + 18 7.5 780.518 1.04782 3.90259 + 19 8.5 789.698 1.03348 3.94849 + 20 9.5 792.29 1.01261 3.96145 diff --git a/examples/USER/meso/mdpd/in.mdpd b/examples/USER/meso/mdpd/in.mdpd new file mode 100644 index 0000000000..b0740c8227 --- /dev/null +++ b/examples/USER/meso/mdpd/in.mdpd @@ -0,0 +1,52 @@ +######################################################################## +#### 3D droplet oscilation using many-body DPD simulation ### +#### ### +#### Created : Zhen Li (zhen_li@brown.edu) ### +#### Division of Applied Mathematics, Brown University. ### +#### ### +#### mDPD parameters follow the choice of the publication: ### +#### Z. Li et al. "Three dimensional flow structures in a moving ### +#### droplet on substrate: a dissipative particle dynamics study" ### +#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + +atom_style mdpd + +region mdpd block -25 25 -10 10 -10 10 units box +create_box 1 mdpd + +lattice fcc 6 +region film block -20 20 -7.5 7.5 -2.0 2.0 units box +create_atoms 1 region film + +pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598 +pair_coeff 1 1 mdpd/rhosum 0.75 +pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75 +mass 1 1.0 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 38497 loop local dist gaussian + +fix mvv all mvv/dpd + +#dump mydump all atom 100 atom.lammpstrj + +#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 & +# view 90 90 box no 0 size 600 200 +#dump_modify jpg pad 4 + +#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 & +# view 90 90 box no 0 size 600 200 +#dump_modify avi pad 4 + +timestep 0.01 +run 4000 diff --git a/examples/USER/meso/mdpd/log.16Aug17.mdpd.g++.1 b/examples/USER/meso/mdpd/log.16Aug17.mdpd.g++.1 new file mode 100644 index 0000000000..c3c14da559 --- /dev/null +++ b/examples/USER/meso/mdpd/log.16Aug17.mdpd.g++.1 @@ -0,0 +1,147 @@ +LAMMPS (11 Aug 2017) +######################################################################## +#### 3D droplet oscilation using many-body DPD simulation ### +#### ### +#### Created : Zhen Li (zhen_li@brown.edu) ### +#### Division of Applied Mathematics, Brown University. ### +#### ### +#### mDPD parameters follow the choice of the publication: ### +#### Z. Li et al. "Three dimensional flow structures in a moving ### +#### droplet on substrate: a dissipative particle dynamics study" ### +#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + +atom_style mdpd + +region mdpd block -25 25 -10 10 -10 10 units box +create_box 1 mdpd +Created orthogonal box = (-25 -10 -10) to (25 10 10) + 1 by 1 by 1 MPI processor grid + +lattice fcc 6 +Lattice spacing in x,y,z = 0.87358 0.87358 0.87358 +region film block -20 20 -7.5 7.5 -2.0 2.0 units box +create_atoms 1 region film +Created 14333 atoms + +pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598 +pair_coeff 1 1 mdpd/rhosum 0.75 +pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75 +mass 1 1.0 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 38497 loop local dist gaussian + +fix mvv all mvv/dpd + +dump mydump all atom 100 atom.lammpstrj + +#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200 +#dump_modify jpg pad 4 + +#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200 +#dump_modify avi pad 4 + +timestep 0.01 +run 4000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 1.3 + binsize = 0.65, bins = 77 31 31 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair mdpd/rhosum, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (2) pair mdpd, perpetual, half/full from (1) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 9.931 | 9.931 | 9.931 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1 -13.346542 0 -11.846647 -6.8495478 + 100 1.0321029 -7.2846779 0 -5.7366316 -0.77640205 + 200 1.042287 -6.9534532 0 -5.3901317 -0.27750815 + 300 1.0583027 -6.8483105 0 -5.2609672 -0.30347708 + 400 1.0493719 -6.8648608 0 -5.2909127 -0.15312495 + 500 1.0723786 -6.8341085 0 -5.2256528 0.017227511 + 600 1.0545695 -6.8152957 0 -5.2335517 -0.024362439 + 700 1.0507193 -6.8076033 0 -5.2316344 -0.07101536 + 800 1.0531856 -6.9378568 0 -5.3581886 -0.053943939 + 900 1.0442995 -6.8501126 0 -5.2837726 -0.13347942 + 1000 1.0335049 -6.8883554 0 -5.3382062 -0.18420426 + 1100 1.0287276 -6.8298226 0 -5.2868389 -0.12081558 + 1200 1.0322527 -6.9462828 0 -5.3980117 -0.18047625 + 1300 1.0599443 -6.9449975 0 -5.355192 -0.011763589 + 1400 1.0560932 -6.845479 0 -5.2614498 0.032130055 + 1500 1.0432786 -6.9035877 0 -5.338779 -0.10268662 + 1600 1.064183 -6.9116836 0 -5.3155205 -0.060722129 + 1700 1.0586249 -6.8768278 0 -5.2890013 0.037005566 + 1800 1.0576064 -7.0060193 0 -5.4197204 -0.036211254 + 1900 1.0595141 -6.838741 0 -5.2495807 -0.12395681 + 2000 1.0650509 -6.897976 0 -5.3005111 0.003594807 + 2100 1.0768273 -6.8874245 0 -5.2722962 0.033283489 + 2200 1.0511606 -6.9823162 0 -5.4056854 0.015008427 + 2300 1.0461138 -6.8820601 0 -5.3129988 0.064646933 + 2400 1.0485369 -6.9437148 0 -5.3710191 -0.16534939 + 2500 1.0507221 -6.9394786 0 -5.3635054 -0.098289859 + 2600 1.0518352 -6.8947578 0 -5.3171152 -0.011666785 + 2700 1.0402369 -6.9273377 0 -5.3670913 0.035267073 + 2800 1.0426109 -6.912024 0 -5.3482168 0.049597305 + 2900 1.0358928 -6.9574778 0 -5.4037471 -0.063216561 + 3000 1.0351023 -6.9844192 0 -5.4318742 -0.10323465 + 3100 1.0255005 -6.9382486 0 -5.4001052 -0.073954735 + 3200 1.0150616 -6.9843183 0 -5.4618321 -0.095136405 + 3300 1.0118112 -6.9522082 0 -5.4345973 -0.12686179 + 3400 1.0071522 -6.970158 0 -5.4595351 -0.012487475 + 3500 1.0041758 -6.9773019 0 -5.4711433 -0.098027653 + 3600 1.0189298 -6.9393039 0 -5.4110158 0.061631719 + 3700 1.012442 -6.9341423 0 -5.4155852 0.10442772 + 3800 1.0021246 -6.9594374 0 -5.4563553 -0.081535223 + 3900 1.0165002 -6.9045321 0 -5.3798882 -0.0088283303 + 4000 1.0077099 -6.9145511 0 -5.4030918 0.048349691 +Loop time of 135.409 on 1 procs for 4000 steps with 14333 atoms + +Performance: 25522.736 tau/day, 29.540 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 93.074 | 93.074 | 93.074 | 0.0 | 68.74 +Neigh | 40.192 | 40.192 | 40.192 | 0.0 | 29.68 +Comm | 0.19625 | 0.19625 | 0.19625 | 0.0 | 0.14 +Output | 0.41756 | 0.41756 | 0.41756 | 0.0 | 0.31 +Modify | 1.0706 | 1.0706 | 1.0706 | 0.0 | 0.79 +Other | | 0.4581 | | | 0.34 + +Nlocal: 14333 ave 14333 max 14333 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 11 ave 11 max 11 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 401803 ave 401803 max 401803 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 803606 ave 803606 max 803606 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 803606 +Ave neighs/atom = 56.0668 +Neighbor list builds = 1050 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:02:15 diff --git a/examples/USER/meso/mdpd/log.16Aug17.mdpd.g++.4 b/examples/USER/meso/mdpd/log.16Aug17.mdpd.g++.4 new file mode 100644 index 0000000000..ec3d8fbddc --- /dev/null +++ b/examples/USER/meso/mdpd/log.16Aug17.mdpd.g++.4 @@ -0,0 +1,147 @@ +LAMMPS (11 Aug 2017) +######################################################################## +#### 3D droplet oscilation using many-body DPD simulation ### +#### ### +#### Created : Zhen Li (zhen_li@brown.edu) ### +#### Division of Applied Mathematics, Brown University. ### +#### ### +#### mDPD parameters follow the choice of the publication: ### +#### Z. Li et al. "Three dimensional flow structures in a moving ### +#### droplet on substrate: a dissipative particle dynamics study" ### +#### Physics of Fluids, 2013, 25: 072103. DOI: 10.1063/1.4812366 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + +atom_style mdpd + +region mdpd block -25 25 -10 10 -10 10 units box +create_box 1 mdpd +Created orthogonal box = (-25 -10 -10) to (25 10 10) + 4 by 1 by 1 MPI processor grid + +lattice fcc 6 +Lattice spacing in x,y,z = 0.87358 0.87358 0.87358 +region film block -20 20 -7.5 7.5 -2.0 2.0 units box +create_atoms 1 region film +Created 14333 atoms + +pair_style hybrid/overlay mdpd/rhosum mdpd 1.0 1.0 9872598 +pair_coeff 1 1 mdpd/rhosum 0.75 +pair_coeff 1 1 mdpd -40 25 18.0 1.0 0.75 +mass 1 1.0 + +compute mythermo all temp +thermo 100 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 38497 loop local dist gaussian + +fix mvv all mvv/dpd + +dump mydump all atom 100 atom.lammpstrj + +#dump jpg all image 200 image.*.jpg type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200 +#dump_modify jpg pad 4 + +#dump avi all movie 200 movie.avi type type zoom 5 adiam 0.5 # view 90 90 box no 0 size 600 200 +#dump_modify avi pad 4 + +timestep 0.01 +run 4000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 1.3 + binsize = 0.65, bins = 77 31 31 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair mdpd/rhosum, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (2) pair mdpd, perpetual, half/full from (1) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 6.265 | 6.655 | 7.045 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1 -13.346542 0 -11.846647 -6.9757225 + 100 1.0406108 -7.2500697 0 -5.6892624 -0.80306477 + 200 1.0535506 -6.9452928 0 -5.3650772 -0.39911584 + 300 1.0644295 -6.8599907 0 -5.2634577 -0.2997968 + 400 1.0780123 -6.9471342 0 -5.3302286 -0.06274869 + 500 1.0672153 -6.8269984 0 -5.2262872 0.021251762 + 600 1.0634304 -6.8366569 0 -5.2416226 -0.021863333 + 700 1.0544807 -6.8272074 0 -5.2455967 -0.0064688066 + 800 1.0556172 -6.8859788 0 -5.3026634 0.023983333 + 900 1.0436201 -6.9246523 0 -5.3593313 -0.12409618 + 1000 1.0617016 -6.8632331 0 -5.2707919 -0.1145505 + 1100 1.0323831 -6.951554 0 -5.4030874 -0.030031884 + 1200 1.0407785 -6.931048 0 -5.3699892 -0.018362136 + 1300 1.0380953 -6.8785296 0 -5.3214953 -0.099308737 + 1400 1.0418898 -6.8998 0 -5.3370743 -0.14199421 + 1500 1.0487254 -6.9671212 0 -5.3941429 -0.12132644 + 1600 1.0561042 -6.8948881 0 -5.3108424 -0.09627292 + 1700 1.0524479 -6.9531441 0 -5.3745823 -0.11959782 + 1800 1.0541197 -6.9219819 0 -5.3409126 0.032964029 + 1900 1.0531221 -6.8805815 0 -5.3010085 0.030124685 + 2000 1.0531819 -6.8612868 0 -5.2816242 -0.076876781 + 2100 1.0757791 -6.919875 0 -5.3063189 -0.04060439 + 2200 1.069423 -6.9005754 0 -5.2965527 0.015347467 + 2300 1.0403109 -6.9015402 0 -5.3411827 0.0034687897 + 2400 1.0547448 -6.9325539 0 -5.3505471 -0.021202325 + 2500 1.0404195 -6.8494675 0 -5.2889472 0.086947847 + 2600 1.0499828 -6.9861392 0 -5.4112749 -0.018079308 + 2700 1.0294278 -6.8525151 0 -5.3084811 0.16911472 + 2800 1.0220652 -6.8993978 0 -5.366407 0.064820531 + 2900 1.0347904 -6.9322703 0 -5.3801929 -0.11384964 + 3000 1.0391372 -6.9519088 0 -5.3933117 0.003050577 + 3100 1.0335828 -7.0090074 0 -5.4587413 -0.17366664 + 3200 1.0211896 -6.9421289 0 -5.4104513 0.025299853 + 3300 1.0019232 -6.9426488 0 -5.4398688 -0.098334724 + 3400 1.0203541 -6.9310981 0 -5.4006737 -0.0015544982 + 3500 1.0076794 -6.9519932 0 -5.4405796 -0.056956902 + 3600 1.0086525 -6.9620979 0 -5.4492247 0.020014884 + 3700 1.0046112 -7.0011625 0 -5.4943508 -0.083936527 + 3800 1.0096867 -6.9470382 0 -5.4326138 -0.089521759 + 3900 1.0074482 -6.9959414 0 -5.4848745 -0.11873698 + 4000 1.01222 -6.9535694 0 -5.4353454 0.042191466 +Loop time of 63.0327 on 4 procs for 4000 steps with 14333 atoms + +Performance: 54828.695 tau/day, 63.459 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 | 16.591 | 29.795 | 42.814 | 236.6 | 47.27 +Neigh | 2.0347 | 10.239 | 18.555 | 255.6 | 16.24 +Comm | 0.70099 | 6.0601 | 11.386 | 207.4 | 9.61 +Output | 0.20713 | 0.40902 | 0.61087 | 31.5 | 0.65 +Modify | 0.058089 | 0.27033 | 0.4851 | 40.7 | 0.43 +Other | | 16.26 | | | 25.79 + +Nlocal: 3583.25 ave 7207 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 1055.75 ave 2131 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 100549 ave 202192 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +FullNghs: 201098 ave 404372 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 804390 +Ave neighs/atom = 56.1215 +Neighbor list builds = 1049 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:01:03 diff --git a/examples/USER/meso/tdpd/cc.profile.16Aug17.tdpd.g++.1 b/examples/USER/meso/tdpd/cc.profile.16Aug17.tdpd.g++.1 new file mode 100644 index 0000000000..a872600504 --- /dev/null +++ b/examples/USER/meso/tdpd/cc.profile.16Aug17.tdpd.g++.1 @@ -0,0 +1,24 @@ +# Chunk-averaged data for fix stat and group c_cc2 +# Timestep Number-of-chunks Total-count +# Chunk Coord1 Ncount c_cc1 c_cc2 +100 20 16000 + 1 -9.5 797.17 0.986661 1.0077 + 2 -8.5 802.61 0.967974 1.02003 + 3 -7.5 795.46 0.957045 1.02873 + 4 -6.5 806.46 0.951271 1.03428 + 5 -5.5 802.34 0.94898 1.03692 + 6 -4.5 799.84 0.949378 1.03673 + 7 -3.5 798.4 0.952505 1.03374 + 8 -2.5 800.36 0.959322 1.02778 + 9 -1.5 797.65 0.971516 1.01867 + 10 -0.5 808.88 0.990644 1.00626 + 11 0.5 786.29 1.00924 0.993828 + 12 1.5 807.16 1.02831 0.981436 + 13 2.5 797.54 1.04071 0.972184 + 14 3.5 799.67 1.04749 0.966258 + 15 4.5 799.61 1.05063 0.963256 + 16 5.5 806.11 1.05105 0.963052 + 17 6.5 803.67 1.04877 0.965688 + 18 7.5 797.39 1.04305 0.971187 + 19 8.5 801.85 1.03208 0.97993 + 20 9.5 791.54 1.01351 0.992209 diff --git a/examples/USER/meso/tdpd/cc.profile.16Aug17.tdpd.g++.4 b/examples/USER/meso/tdpd/cc.profile.16Aug17.tdpd.g++.4 new file mode 100644 index 0000000000..de34ef26c3 --- /dev/null +++ b/examples/USER/meso/tdpd/cc.profile.16Aug17.tdpd.g++.4 @@ -0,0 +1,24 @@ +# Chunk-averaged data for fix stat and group c_cc2 +# Timestep Number-of-chunks Total-count +# Chunk Coord1 Ncount c_cc1 c_cc2 +100 20 16000 + 1 -9.5 806.92 0.986675 1.00766 + 2 -8.5 798.01 0.96792 1.02003 + 3 -7.5 805.43 0.956909 1.02883 + 4 -6.5 800.54 0.951207 1.03432 + 5 -5.5 794.14 0.948967 1.03691 + 6 -4.5 799.75 0.949379 1.03672 + 7 -3.5 799.65 0.952492 1.03374 + 8 -2.5 799.94 0.959331 1.02778 + 9 -1.5 800.96 0.971664 1.01861 + 10 -0.5 803.97 0.99074 1.00622 + 11 0.5 800.66 1.00949 0.993673 + 12 1.5 779.22 1.02824 0.981461 + 13 2.5 809.13 1.04056 0.972274 + 14 3.5 805.23 1.04747 0.966272 + 15 4.5 795.95 1.05061 0.96327 + 16 5.5 796.4 1.05105 0.963035 + 17 6.5 806.1 1.04883 0.965621 + 18 7.5 806.41 1.04305 0.971224 + 19 8.5 792.2 1.03211 0.979955 + 20 9.5 799.39 1.01362 0.992156 diff --git a/examples/USER/meso/tdpd/in.tdpd b/examples/USER/meso/tdpd/in.tdpd new file mode 100644 index 0000000000..5107e7a454 --- /dev/null +++ b/examples/USER/meso/tdpd/in.tdpd @@ -0,0 +1,54 @@ +######################################################################## +### Pure diffusion with a reaction source term analog of a periodic ### +### Poiseuille flow problem using transport DPD (tDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### tDPD system setup follows Fig.1 in the publication: ### +### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ### +### "Transport dissipative particle dynamics model for mesoscopic ### +### advection-diffusion-reaction problems. J. Chem. Phys., ### +### 2015, 143: 014101. DOI: 10.1063/1.4923254 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style tdpd 2 + +region tdpd block -10 10 -10 10 -5 5 units box +create_box 1 tdpd +create_atoms 1 random 16000 276438 NULL +mass 1 1.0 +set atom * cc 1 1.0 +set atom * cc 2 1.0 + +pair_style tdpd 1.0 1.58 9872598 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 + +compute mythermo all temp +thermo 50 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/tdpd 0.5 +fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 +fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01 +fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01 + +timestep 0.01 +run 500 +reset_timestep 0 + +compute cc1 all tdpd/cc/atom 1 +compute cc2 all tdpd/cc/atom 2 +compute bin all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile + +run 100 diff --git a/examples/USER/meso/tdpd/log.16Aug17.tdpd.g++.1 b/examples/USER/meso/tdpd/log.16Aug17.tdpd.g++.1 new file mode 100644 index 0000000000..21b618148c --- /dev/null +++ b/examples/USER/meso/tdpd/log.16Aug17.tdpd.g++.1 @@ -0,0 +1,146 @@ +LAMMPS (11 Aug 2017) +######################################################################## +### Pure diffusion with a reaction source term analog of a periodic ### +### Poiseuille flow problem using transport DPD (tDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### tDPD system setup follows Fig.1 in the publication: ### +### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ### +### "Transport dissipative particle dynamics model for mesoscopic ### +### advection-diffusion-reaction problems. J. Chem. Phys., ### +### 2015, 143: 014101. DOI: 10.1063/1.4923254 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style tdpd 2 + +region tdpd block -10 10 -10 10 -5 5 units box +create_box 1 tdpd +Created orthogonal box = (-10 -10 -5) to (10 10 5) + 1 by 1 by 1 MPI processor grid +create_atoms 1 random 16000 276438 NULL +Created 16000 atoms +mass 1 1.0 +set atom * cc 1 1.0 + 16000 settings made for cc index 1 +set atom * cc 2 1.0 + 16000 settings made for cc index 2 + +pair_style tdpd 1.0 1.58 9872598 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 + +compute mythermo all temp +thermo 50 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/tdpd 0.5 +fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 +fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01 +fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01 + +timestep 0.01 +run 500 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.78 + ghost atom cutoff = 1.78 + binsize = 0.89, bins = 23 23 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair tdpd, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.3 | 11.3 | 11.3 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1 48.948932 0 50.448838 202.19166 + 50 0.99837766 43.949877 0 45.447349 195.80936 + 100 0.99846831 43.756995 0 45.254604 198.22348 + 150 1.0026903 43.72408 0 45.228021 196.61676 + 200 1.0063144 43.722388 0 45.231765 194.17954 + 250 1.0032304 43.721864 0 45.226615 197.85829 + 300 0.9932656 43.703526 0 45.193331 196.57406 + 350 1.0002916 43.720498 0 45.220841 193.55346 + 400 0.99475486 43.722965 0 45.215004 196.81546 + 450 1.0011803 43.712447 0 45.214124 200.46118 + 500 1.0009006 43.708984 0 45.210241 197.38953 +Loop time of 96.0326 on 1 procs for 500 steps with 16000 atoms + +Performance: 4498.474 tau/day, 5.207 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 90.083 | 90.083 | 90.083 | 0.0 | 93.80 +Neigh | 5.049 | 5.049 | 5.049 | 0.0 | 5.26 +Comm | 0.34141 | 0.34141 | 0.34141 | 0.0 | 0.36 +Output | 0.00092816 | 0.00092816 | 0.00092816 | 0.0 | 0.00 +Modify | 0.45991 | 0.45991 | 0.45991 | 0.0 | 0.48 +Other | | 0.09865 | | | 0.10 + +Nlocal: 16000 ave 16000 max 16000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 14091 ave 14091 max 14091 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 749379 ave 749379 max 749379 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 749379 +Ave neighs/atom = 46.8362 +Neighbor list builds = 183 +Dangerous builds = 0 +reset_timestep 0 + +compute cc1 all tdpd/cc/atom 1 +compute cc2 all tdpd/cc/atom 2 +compute bin all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile + +run 100 +Per MPI rank memory allocation (min/avg/max) = 11.8 | 11.8 | 11.8 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.0009006 43.708984 0 45.210241 199.3205 + 50 1.0007276 43.704844 0 45.205842 197.77053 + 100 1.0039032 43.714201 0 45.219961 197.31118 +Loop time of 19.0326 on 1 procs for 100 steps with 16000 atoms + +Performance: 4539.577 tau/day, 5.254 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 17.842 | 17.842 | 17.842 | 0.0 | 93.74 +Neigh | 0.98674 | 0.98674 | 0.98674 | 0.0 | 5.18 +Comm | 0.066013 | 0.066013 | 0.066013 | 0.0 | 0.35 +Output | 0.00016284 | 0.00016284 | 0.00016284 | 0.0 | 0.00 +Modify | 0.11795 | 0.11795 | 0.11795 | 0.0 | 0.62 +Other | | 0.02012 | | | 0.11 + +Nlocal: 16000 ave 16000 max 16000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 14126 ave 14126 max 14126 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 748927 ave 748927 max 748927 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 748927 +Ave neighs/atom = 46.8079 +Neighbor list builds = 37 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:01:55 diff --git a/examples/USER/meso/tdpd/log.16Aug17.tdpd.g++.4 b/examples/USER/meso/tdpd/log.16Aug17.tdpd.g++.4 new file mode 100644 index 0000000000..6cd99168f4 --- /dev/null +++ b/examples/USER/meso/tdpd/log.16Aug17.tdpd.g++.4 @@ -0,0 +1,146 @@ +LAMMPS (11 Aug 2017) +######################################################################## +### Pure diffusion with a reaction source term analog of a periodic ### +### Poiseuille flow problem using transport DPD (tDPD) simulation ### +### ### +### Created : Zhen Li (zhen_li@brown.edu) ### +### Division of Applied Mathematics, Brown University. ### +### ### +### tDPD system setup follows Fig.1 in the publication: ### +### Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. ### +### "Transport dissipative particle dynamics model for mesoscopic ### +### advection-diffusion-reaction problems. J. Chem. Phys., ### +### 2015, 143: 014101. DOI: 10.1063/1.4923254 ### +######################################################################## +units lj +dimension 3 +boundary p p p +neighbor 0.2 bin +neigh_modify every 1 delay 0 check yes + +atom_style tdpd 2 + +region tdpd block -10 10 -10 10 -5 5 units box +create_box 1 tdpd +Created orthogonal box = (-10 -10 -5) to (10 10 5) + 2 by 2 by 1 MPI processor grid +create_atoms 1 random 16000 276438 NULL +Created 16000 atoms +mass 1 1.0 +set atom * cc 1 1.0 + 16000 settings made for cc index 1 +set atom * cc 2 1.0 + 16000 settings made for cc index 2 + +pair_style tdpd 1.0 1.58 9872598 +pair_coeff 1 1 18.75 4.5 0.41 1.58 1.58 1.0 1.0E-5 2.0 3.0 1.0E-5 2.0 + +compute mythermo all temp +thermo 50 +thermo_modify temp mythermo +thermo_modify flush yes + +velocity all create 1.0 432982 loop local dist gaussian + +fix mvv all mvv/tdpd 0.5 +fix upper1 all tdpd/source 1 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 0.01 +fix lower1 all tdpd/source 1 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 -0.01 +fix upper2 all tdpd/source 2 cuboid 0.0 5.0 0.0 20.0 10.0 10.0 -0.01 +fix lower2 all tdpd/source 2 cuboid 0.0 -5.0 0.0 20.0 10.0 10.0 0.01 + +timestep 0.01 +run 500 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.78 + ghost atom cutoff = 1.78 + binsize = 0.89, bins = 23 23 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair tdpd, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.814 | 4.823 | 4.829 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1 48.948932 0 50.448838 199.65978 + 50 1.0153476 43.948796 0 45.471722 198.3346 + 100 1.0064284 43.754875 0 45.264424 197.5308 + 150 0.99609985 43.726751 0 45.220807 197.50623 + 200 1.0016604 43.720283 0 45.22268 197.81129 + 250 1.0054979 43.718568 0 45.22672 195.79405 + 300 0.9997618 43.716617 0 45.216166 197.84788 + 350 0.99170101 43.72093 0 45.208389 196.07711 + 400 1.0043692 43.71648 0 45.22294 199.55247 + 450 1.0086263 43.709988 0 45.222833 198.20516 + 500 1.0029076 43.717879 0 45.222146 197.26281 +Loop time of 24.5533 on 4 procs for 500 steps with 16000 atoms + +Performance: 17594.412 tau/day, 20.364 timesteps/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 22.236 | 22.418 | 22.736 | 4.0 | 91.30 +Neigh | 1.2759 | 1.2883 | 1.3077 | 1.1 | 5.25 +Comm | 0.35749 | 0.69526 | 0.88462 | 24.1 | 2.83 +Output | 0.00043321 | 0.00050318 | 0.00070691 | 0.0 | 0.00 +Modify | 0.11555 | 0.11648 | 0.11888 | 0.4 | 0.47 +Other | | 0.03473 | | | 0.14 + +Nlocal: 4000 ave 4012 max 3982 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 5986.25 ave 6016 max 5956 min +Histogram: 1 0 0 0 1 0 1 0 0 1 +Neighs: 187309 ave 188264 max 186087 min +Histogram: 1 0 0 0 1 0 0 1 0 1 + +Total # of neighbors = 749235 +Ave neighs/atom = 46.8272 +Neighbor list builds = 180 +Dangerous builds = 0 +reset_timestep 0 + +compute cc1 all tdpd/cc/atom 1 +compute cc2 all tdpd/cc/atom 2 +compute bin all chunk/atom bin/1d y 0.0 1.0 +fix stat all ave/chunk 1 100 100 bin c_cc1 c_cc2 norm sample file cc.profile + +run 100 +Per MPI rank memory allocation (min/avg/max) = 5.065 | 5.074 | 5.082 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.0029076 43.717879 0 45.222146 198.45789 + 50 1.0077982 43.713264 0 45.224867 196.56183 + 100 1.0036823 43.708022 0 45.213451 196.00815 +Loop time of 4.79577 on 4 procs for 100 steps with 16000 atoms + +Performance: 18015.870 tau/day, 20.852 timesteps/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.3481 | 4.39 | 4.4398 | 1.7 | 91.54 +Neigh | 0.25477 | 0.25675 | 0.25963 | 0.4 | 5.35 +Comm | 0.059327 | 0.11194 | 0.15608 | 11.0 | 2.33 +Output | 0.00011206 | 0.00011748 | 0.00011992 | 0.0 | 0.00 +Modify | 0.030417 | 0.030622 | 0.030739 | 0.1 | 0.64 +Other | | 0.006301 | | | 0.13 + +Nlocal: 4000 ave 4010 max 3987 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Nghost: 5985.25 ave 6025 max 5959 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 187304 ave 188092 max 186449 min +Histogram: 1 0 0 0 0 2 0 0 0 1 + +Total # of neighbors = 749216 +Ave neighs/atom = 46.826 +Neighbor list builds = 38 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:29 diff --git a/examples/USER/mgpt/log.lammps b/examples/USER/mgpt/log.lammps deleted file mode 100644 index 9485c36e47..0000000000 --- a/examples/USER/mgpt/log.lammps +++ /dev/null @@ -1,78 +0,0 @@ -LAMMPS (23 Oct 2015) -# script for mgpt t=0 eos with relaxed vacancy in bcc structure: -# input for relaxed vacancy formation energy at constant pressure - -echo screen -Lattice spacing in x,y,z = 6.23812 6.23812 6.23812 -Created orthogonal box = (0 0 0) to (31.1906 31.1906 31.1906) - 1 by 1 by 1 MPI processor grid -Created 250 atoms -Deleted 1 atoms, new total = 249 -Reading potential file Ta6.8x.mgpt.potin with DATE: 2015-07-30 -Neighbor list info ... - 2 neighbor list requests - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 13.1712 - ghost atom cutoff = 13.1712 - binsize = 6.58562 -> bins = 5 5 5 -Memory usage per processor = 4.66978 Mbytes -Step Volume Temp PotEng TotEng Press - 0 30343.887 0 -73.994511 -73.994511 -1.0504398e+09 - 10 30343.887 0 -74.002332 -74.002332 -1.107516e+09 - 20 30343.887 0 -74.00485 -74.00485 -1.1316373e+09 - 30 30343.887 0 -74.005762 -74.005762 -1.143304e+09 - 40 30343.887 0 -74.006116 -74.006116 -1.149395e+09 - 50 30343.887 0 -74.006262 -74.006262 -1.1527914e+09 - 60 30343.887 0 -74.006323 -74.006323 -1.1547677e+09 - 70 30343.887 0 -74.00635 -74.00635 -1.1559529e+09 - 80 30343.887 0 -74.006361 -74.006361 -1.1566763e+09 - 90 30343.887 0 -74.006366 -74.006366 -1.1571256e+09 - 100 30343.887 0 -74.006369 -74.006369 -1.1574093e+09 - 110 30343.887 0 -74.00637 -74.00637 -1.1575908e+09 - 120 30343.887 0 -74.00637 -74.00637 -1.1577083e+09 - 130 30343.887 0 -74.00637 -74.00637 -1.1577849e+09 - 139 30343.887 0 -74.006371 -74.006371 -1.1578311e+09 -Loop time of 4.33109 on 1 procs for 139 steps with 249 atoms - -92.4% CPU use with 1 MPI tasks x no OpenMP threads - -Minimization stats: - Stopping criterion = energy tolerance - Energy initial, next-to-last, final = - -73.9945109564 -74.0063705487 -74.0063705557 - Force two-norm initial, final = 0.0366227 8.09081e-05 - Force max component initial, final = 0.00730948 8.05242e-06 - Final line search alpha, max atom move = 1 8.05242e-06 - Iterations, force evaluations = 139 139 - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 4.3064 | 4.3064 | 4.3064 | 0.0 | 99.43 -Neigh | 0.019113 | 0.019113 | 0.019113 | 0.0 | 0.44 -Comm | 0.0017624 | 0.0017624 | 0.0017624 | 0.0 | 0.04 -Output | 0.00084376 | 0.00084376 | 0.00084376 | 0.0 | 0.02 -Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 0.00297 | | | 0.07 - -Nlocal: 249 ave 249 max 249 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1479 ave 1479 max 1479 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 7936 ave 7936 max 7936 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -FullNghs: 15872 ave 15872 max 15872 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 15872 -Ave neighs/atom = 63.743 -Neighbor list builds = 4 -Dangerous builds = 0 -number of atoms = 249 -atomic volume (a.u.) = 121.863 -total energy (ry/atom) = -0.594428679162064 -pressure (gpa) = -1.15783109519801 -249 121.863 -148.012741111354 -1.15783109519801 -121.863 -0.594428679162064 -1.15783109519801 -Total wall time: 0:00:04 diff --git a/examples/USER/misc/extep/BN.data b/examples/USER/misc/extep/BN.data new file mode 100644 index 0000000000..3f51bdff61 --- /dev/null +++ b/examples/USER/misc/extep/BN.data @@ -0,0 +1,116 @@ +info: BN sample with r_BN=1.45 + +100 atoms +2 atom types + +0.0 21.75000000 xlo xhi +0.0 12.55736835 ylo yhi +0.0 50.00000000 zlo zhi + +Masses + +1 10.811 +2 14.0067 + +Atoms + + 1 1 0.00000000 0.00000000 0.00000000 + 2 2 1.45000000 0.00000000 0.00000000 + 3 1 2.17500000 1.25573684 0.00000000 + 4 2 3.62500000 1.25573684 0.00000000 + 5 1 0.00000000 2.51147367 0.00000000 + 6 2 1.45000000 2.51147367 0.00000000 + 7 1 2.17500000 3.76721051 0.00000000 + 8 2 3.62500000 3.76721051 0.00000000 + 9 1 0.00000000 5.02294734 0.00000000 + 10 2 1.45000000 5.02294734 0.00000000 + 11 1 2.17500000 6.27868418 0.00000000 + 12 2 3.62500000 6.27868418 0.00000000 + 13 1 0.00000000 7.53442101 0.00000000 + 14 2 1.45000000 7.53442101 0.00000000 + 15 1 2.17500000 8.79015785 0.00000000 + 16 2 3.62500000 8.79015785 0.00000000 + 17 1 0.00000000 10.04589468 0.00000000 + 18 2 1.45000000 10.04589468 0.00000000 + 19 1 2.17500000 11.30163152 0.00000000 + 20 2 3.62500000 11.30163152 0.00000000 + 21 1 4.35000000 0.00000000 0.00000000 + 22 2 5.80000000 0.00000000 0.00000000 + 23 1 6.52500000 1.25573684 0.00000000 + 24 2 7.97500000 1.25573684 0.00000000 + 25 1 4.35000000 2.51147367 0.00000000 + 26 2 5.80000000 2.51147367 0.00000000 + 27 1 6.52500000 3.76721051 0.00000000 + 28 2 7.97500000 3.76721051 0.00000000 + 29 1 4.35000000 5.02294734 0.00000000 + 30 2 5.80000000 5.02294734 0.00000000 + 31 1 6.52500000 6.27868418 0.00000000 + 32 2 7.97500000 6.27868418 0.00000000 + 33 1 4.35000000 7.53442101 0.00000000 + 34 2 5.80000000 7.53442101 0.00000000 + 35 1 6.52500000 8.79015785 0.00000000 + 36 2 7.97500000 8.79015785 0.00000000 + 37 1 4.35000000 10.04589468 0.00000000 + 38 2 5.80000000 10.04589468 0.00000000 + 39 1 6.52500000 11.30163152 0.00000000 + 40 2 7.97500000 11.30163152 0.00000000 + 41 1 8.70000000 0.00000000 0.00000000 + 42 2 10.15000000 0.00000000 0.00000000 + 43 1 10.87500000 1.25573684 0.00000000 + 44 2 12.32500000 1.25573684 0.00000000 + 45 1 8.70000000 2.51147367 0.00000000 + 46 2 10.15000000 2.51147367 0.00000000 + 47 1 10.87500000 3.76721051 0.00000000 + 48 2 12.32500000 3.76721051 0.00000000 + 49 1 8.70000000 5.02294734 0.00000000 + 50 2 10.15000000 5.02294734 0.00000000 + 51 1 10.87500000 6.27868418 0.00000000 + 52 2 12.32500000 6.27868418 0.00000000 + 53 1 8.70000000 7.53442101 0.00000000 + 54 2 10.15000000 7.53442101 0.00000000 + 55 1 10.87500000 8.79015785 0.00000000 + 56 2 12.32500000 8.79015785 0.00000000 + 57 1 8.70000000 10.04589468 0.00000000 + 58 2 10.15000000 10.04589468 0.00000000 + 59 1 10.87500000 11.30163152 0.00000000 + 60 2 12.32500000 11.30163152 0.00000000 + 61 1 13.05000000 0.00000000 0.00000000 + 62 2 14.50000000 0.00000000 0.00000000 + 63 1 15.22500000 1.25573684 0.00000000 + 64 2 16.67500000 1.25573684 0.00000000 + 65 1 13.05000000 2.51147367 0.00000000 + 66 2 14.50000000 2.51147367 0.00000000 + 67 1 15.22500000 3.76721051 0.00000000 + 68 2 16.67500000 3.76721051 0.00000000 + 69 1 13.05000000 5.02294734 0.00000000 + 70 2 14.50000000 5.02294734 0.00000000 + 71 1 15.22500000 6.27868418 0.00000000 + 72 2 16.67500000 6.27868418 0.00000000 + 73 1 13.05000000 7.53442101 0.00000000 + 74 2 14.50000000 7.53442101 0.00000000 + 75 1 15.22500000 8.79015785 0.00000000 + 76 2 16.67500000 8.79015785 0.00000000 + 77 1 13.05000000 10.04589468 0.00000000 + 78 2 14.50000000 10.04589468 0.00000000 + 79 1 15.22500000 11.30163152 0.00000000 + 80 2 16.67500000 11.30163152 0.00000000 + 81 1 17.40000000 0.00000000 0.00000000 + 82 2 18.85000000 0.00000000 0.00000000 + 83 1 19.57500000 1.25573684 0.00000000 + 84 2 21.02500000 1.25573684 0.00000000 + 85 1 17.40000000 2.51147367 0.00000000 + 86 2 18.85000000 2.51147367 0.00000000 + 87 1 19.57500000 3.76721051 0.00000000 + 88 2 21.02500000 3.76721051 0.00000000 + 89 1 17.40000000 5.02294734 0.00000000 + 90 2 18.85000000 5.02294734 0.00000000 + 91 1 19.57500000 6.27868418 0.00000000 + 92 2 21.02500000 6.27868418 0.00000000 + 93 1 17.40000000 7.53442101 0.00000000 + 94 2 18.85000000 7.53442101 0.00000000 + 95 1 19.57500000 8.79015785 0.00000000 + 96 2 21.02500000 8.79015785 0.00000000 + 97 1 17.40000000 10.04589468 0.00000000 + 98 2 18.85000000 10.04589468 0.00000000 + 99 1 19.57500000 11.30163152 0.00000000 +100 2 21.02500000 11.30163152 0.00000000 diff --git a/examples/USER/misc/extep/in.extep-bn b/examples/USER/misc/extep/in.extep-bn new file mode 100644 index 0000000000..bb7ed0ea28 --- /dev/null +++ b/examples/USER/misc/extep/in.extep-bn @@ -0,0 +1,29 @@ +# Initialization +units metal +boundary p p p +atom_style atomic +processors * * 1 + +# System and atom definition +read_data BN.data # read lammps data file + +# Neighbor update settings +neighbor 2.0 bin +neigh_modify every 1 +neigh_modify delay 0 +neigh_modify check yes + +# Potential +pair_style extep +pair_coeff * * ../../../../potentials/BN.extep B N + +# Output +thermo 10 +thermo_style custom step time etotal pe temp lx ly lz pxx pyy pzz +thermo_modify line one format float %14.8g + +# Setup NPT MD run +timestep 0.0001 # ps +velocity all create 300.0 12345 +fix thermos all npt temp 300 300 1.0 x 0 0 1.0 y 0 0 1.0 +run 1000 diff --git a/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.1 b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.1 new file mode 100644 index 0000000000..392e5c4f0e --- /dev/null +++ b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.1 @@ -0,0 +1,180 @@ +LAMMPS (23 Oct 2017) + using 1 OpenMP thread(s) per MPI task +# Initialization +units metal +boundary p p p +atom_style atomic +processors * * 1 + +# System and atom definition +read_data BN.data # read lammps data file + orthogonal box = (0 0 0) to (21.75 12.5574 50) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 100 atoms + +# Neighbor update settings +neighbor 2.0 bin +neigh_modify every 1 +neigh_modify delay 0 +neigh_modify check yes + +# Potential +pair_style extep +pair_coeff * * ../../../../potentials/BN.extep B N +Reading potential file ../../../../potentials/BN.extep with DATE: 2017-11-28 + +# Output +thermo 10 +thermo_style custom step time etotal pe temp lx ly lz pxx pyy pzz +thermo_modify line one format float %14.8g + +# Setup NPT MD run +timestep 0.0001 # ps +velocity all create 300.0 12345 +fix thermos all npt temp 300 300 1.0 x 0 0 1.0 y 0 0 1.0 +run 1000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.2 + ghost atom cutoff = 4.2 + binsize = 2.1, bins = 11 6 24 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair extep, perpetual + attributes: full, newton on, ghost + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.97 | 2.97 | 2.97 Mbytes +Step Time TotEng PotEng Temp Lx Ly Lz Pxx Pyy Pzz + 0 0 -665.11189 -668.95092 300 21.75 12.557368 50 -1638.8315 -1636.7368 321.73163 + 10 0.001 -665.11194 -668.81065 289.03491 21.749944 12.557333 50 -1391.3771 -1841.1723 316.66669 + 20 0.002 -665.1121 -668.4273 259.06599 21.749789 12.557222 50 -1137.0171 -1980.5977 301.79466 + 30 0.003 -665.11237 -667.90117 217.93027 21.749552 12.557029 50 -912.51949 -2055.822 278.00774 + 40 0.004 -665.11278 -667.36471 175.97662 21.74925 12.556752 50 -755.38643 -2078.0669 246.62816 + 50 0.005 -665.11333 -666.94254 142.94321 21.748894 12.556389 50 -694.93153 -2062.1349 209.26356 + 60 0.006 -665.11405 -666.71476 125.08741 21.748487 12.55594 50 -744.6962 -2019.9093 167.70563 + 70 0.007 -665.11494 -666.69555 123.51632 21.748026 12.555408 50 -898.67863 -1956.2845 123.88845 + 80 0.008 -665.116 -666.83408 134.25892 21.7475 12.554796 50 -1132.5952 -1868.738 79.87581 + 90 0.009 -665.1172 -667.03647 149.98053 21.746893 12.554106 50 -1409.6896 -1750.4875 37.821017 + 100 0.01 -665.11853 -667.20002 162.65705 21.746185 12.553344 50 -1689.1599 -1595.9411 -0.14399002 + 110 0.011 -665.11997 -667.24752 166.25742 21.745356 12.552516 50 -1934.6334 -1406.3665 -32.091026 + 120 0.012 -665.12148 -667.15088 158.58671 21.744389 12.55163 50 -2120.4014 -1193.6117 -56.50543 + 130 0.013 -665.12306 -666.93754 141.7922 21.743271 12.550694 50 -2234.0841 -980.32815 -72.45885 + 140 0.014 -665.1247 -666.67903 121.4631 21.741993 12.549719 50 -2275.5656 -796.26701 -79.693692 + 150 0.015 -665.1264 -666.46562 104.65306 21.740553 12.54871 50 -2253.08 -671.5409 -78.603431 + 160 0.016 -665.1282 -666.37541 97.462619 21.738952 12.547674 50 -2178.0108 -628.83531 -70.130423 + 170 0.017 -665.13011 -666.44775 102.96665 21.737195 12.546611 50 -2060.2073 -677.02227 -55.623931 + 180 0.018 -665.13215 -666.67004 120.17784 21.735292 12.54552 50 -1905.36 -808.22824 -36.699042 + 190 0.019 -665.13431 -666.98201 144.38814 21.733253 12.544396 50 -1715.2526 -999.2481 -15.117617 + 200 0.02 -665.13656 -667.29591 168.74214 21.731091 12.543231 50 -1490.6934 -1216.735 7.3107732 + 210 0.021 -665.13885 -667.52511 186.47391 21.728823 12.542015 50 -1235.9283 -1424.4324 28.822782 + 220 0.022 -665.14112 -667.61153 193.0492 21.726467 12.540741 50 -962.70697 -1590.2885 47.801678 + 230 0.023 -665.14332 -667.54317 187.53534 21.724043 12.539402 50 -692.12856 -1691.6537 62.881768 + 240 0.024 -665.1454 -667.35665 172.79772 21.72157 12.537993 50 -453.02755 -1717.6064 73.041858 + 250 0.025 -665.14735 -667.12424 154.48373 21.719064 12.536514 50 -276.81709 -1668.3598 77.670868 + 260 0.026 -665.14918 -666.92939 139.11409 21.716539 12.534967 50 -190.03656 -1552.4049 76.59734 + 270 0.027 -665.15091 -666.83859 131.88391 21.714 12.533357 50 -206.85537 -1382.4915 70.085105 + 280 0.028 -665.15258 -666.87889 134.90214 21.711446 12.53169 50 -324.01795 -1171.7578 58.801327 + 290 0.029 -665.15421 -667.02881 146.49028 21.708869 12.529975 50 -520.0146 -931.26466 43.758636 + 300 0.03 -665.1558 -667.22646 161.81084 21.706255 12.528222 50 -758.87113 -669.74523 26.225956 + 310 0.031 -665.15734 -667.39183 174.61368 21.703587 12.526442 50 -997.42782 -395.56111 7.601897 + 320 0.032 -665.15878 -667.45546 179.47345 21.700849 12.524646 50 -1193.9402 -119.86797 -10.744258 + 330 0.033 -665.16008 -667.38312 173.71901 21.698026 12.522846 50 -1315.6446 140.7451 -27.638433 + 340 0.034 -665.16118 -667.18792 158.37888 21.695112 12.521051 50 -1343.5396 363.95099 -42.231049 + 350 0.035 -665.16207 -666.92571 137.81938 21.692103 12.519271 50 -1273.6625 524.73453 -54.046178 + 360 0.036 -665.16274 -666.67543 118.20885 21.689004 12.517514 50 -1115.1514 601.37143 -62.932702 + 370 0.037 -665.1632 -666.5115 105.36258 21.685827 12.515781 50 -886.11568 582.42087 -68.942158 + 380 0.038 -665.16348 -666.47849 102.76116 21.682589 12.514072 50 -608.71321 472.04732 -72.193259 + 390 0.039 -665.1636 -666.57728 110.47178 21.679308 12.512382 50 -304.85697 291.41908 -72.787214 + 400 0.04 -665.16356 -666.76741 125.33244 21.676006 12.510704 50 6.3732307 75.407852 -70.806087 + 410 0.041 -665.16336 -666.98363 142.24457 21.672705 12.50903 50 309.23046 -134.40319 -66.378966 + 420 0.042 -665.16298 -667.15939 156.00935 21.669426 12.507351 50 590.16982 -298.16702 -59.767469 + 430 0.043 -665.16239 -667.24843 163.01313 21.66619 12.50566 50 836.19535 -385.22443 -51.420249 + 440 0.044 -665.16157 -667.23746 162.2204 21.663014 12.503955 50 1033.943 -378.7816 -41.969885 + 450 0.045 -665.1605 -667.14707 155.24066 21.659911 12.502234 50 1170.3399 -277.11556 -32.175503 + 460 0.046 -665.15917 -667.0218 145.55489 21.656891 12.500503 50 1234.9026 -91.620499 -22.833423 + 470 0.047 -665.15761 -666.91366 137.22578 21.65396 12.498768 50 1222.9519 157.31306 -14.680548 + 480 0.048 -665.15585 -666.86462 133.53159 21.651114 12.497041 50 1138.5551 445.2926 -8.3071781 + 490 0.049 -665.15393 -666.89359 135.9458 21.64835 12.495333 50 996.00682 748.51842 -4.0872169 + 500 0.05 -665.15188 -666.99142 143.75058 21.645657 12.493655 50 819.08561 1046.9785 -2.1306918 + 510 0.051 -665.14975 -667.12519 154.36991 21.643022 12.49202 50 637.99022 1325.7112 -2.2650822 + 520 0.052 -665.14756 -667.25 164.29491 21.640432 12.49044 50 484.54509 1574.1916 -4.0528391 + 530 0.053 -665.14531 -667.32459 170.29969 21.637878 12.488923 50 386.77357 1784.4858 -6.8479114 + 540 0.054 -665.143 -667.32552 170.55254 21.635352 12.48748 50 364.14599 1949.2189 -9.8841824 + 550 0.055 -665.14064 -667.25527 165.24765 21.632853 12.486117 50 424.6565 2060.4607 -12.37851 + 560 0.056 -665.13822 -667.14127 156.52756 21.630385 12.484837 50 564.3912 2110.2547 -13.62742 + 570 0.057 -665.13576 -667.0259 147.70502 21.627958 12.483643 50 769.54354 2092.8157 -13.082914 + 580 0.058 -665.13327 -666.95107 142.05154 21.625586 12.482535 50 1020.1218 2007.6508 -10.405617 + 590 0.059 -665.13079 -666.94279 141.59877 21.623287 12.481508 50 1294.1274 1862.3568 -5.5031153 + 600 0.06 -665.12832 -667.00189 146.40928 21.621079 12.480557 50 1570.9478 1673.8456 1.4410957 + 610 0.061 -665.12591 -667.10417 154.59072 21.618982 12.479674 50 1833.1388 1467.2639 9.9561573 + 620 0.062 -665.12355 -667.20973 163.02368 21.617015 12.478851 50 2066.4951 1272.6732 19.310607 + 630 0.063 -665.12128 -667.27744 168.49239 21.615193 12.47808 50 2259.0193 1120.2758 28.59477 + 640 0.064 -665.11911 -667.27898 168.7823 21.613531 12.477355 50 2399.792 1035.3525 36.8539 + 650 0.065 -665.11707 -667.20773 163.37438 21.612037 12.476673 50 2478.6675 1034.0481 43.239368 + 660 0.066 -665.11518 -667.0802 153.55598 21.610718 12.476033 50 2487.2505 1120.8274 47.131883 + 670 0.067 -665.11345 -666.93026 141.97434 21.609573 12.475439 50 2420.9786 1288.0136 48.201717 + 680 0.068 -665.11191 -666.79864 131.80955 21.608598 12.474897 50 2281.6131 1517.4002 46.399066 + 690 0.069 -665.11056 -666.72065 125.82027 21.607784 12.474418 50 2079.2055 1783.5346 41.895586 + 700 0.07 -665.10941 -666.71578 125.5291 21.607116 12.474011 50 1832.7039 2057.9076 35.011051 + 710 0.071 -665.10848 -666.78203 130.77932 21.606577 12.473687 50 1568.7275 2313.0601 26.153491 + 720 0.072 -665.10776 -666.89681 139.80468 21.606148 12.473458 50 1318.5189 2525.6808 15.783637 + 730 0.073 -665.10727 -667.0243 149.80574 21.605812 12.47333 50 1113.5537 2678.1859 4.3967762 + 740 0.074 -665.10701 -667.12698 157.85016 21.605555 12.473311 50 980.633 2758.9123 -7.4930622 + 750 0.075 -665.10697 -667.17729 161.78497 21.605368 12.473404 50 937.45086 2761.5936 -19.376492 + 760 0.076 -665.10714 -667.1654 160.84249 21.605247 12.473609 50 989.5724 2684.9256 -30.776106 + 770 0.077 -665.1075 -667.10061 155.75086 21.605196 12.473922 50 1129.4775 2532.7048 -41.263677 + 780 0.078 -665.10803 -667.00654 148.35835 21.605226 12.474338 50 1337.8663 2314.4556 -50.455407 + 790 0.079 -665.10869 -666.91242 140.9515 21.605349 12.474848 50 1586.9099 2045.9808 -57.988114 + 800 0.08 -665.10946 -666.84375 135.52533 21.605585 12.475441 50 1844.7038 1749.1281 -63.495405 + 810 0.081 -665.11032 -666.81538 133.24173 21.60595 12.476105 50 2079.9601 1450.3113 -66.60795 + 820 0.082 -665.11127 -666.82877 134.21424 21.606461 12.476828 50 2266.0059 1177.7937 -66.990929 + 830 0.083 -665.1123 -666.87353 137.6312 21.607131 12.477599 50 2383.4351 958.19752 -64.411861 + 840 0.084 -665.11343 -666.93214 142.12323 21.607968 12.478409 50 2421.1969 812.91475 -58.816538 + 850 0.085 -665.11467 -666.98597 146.2321 21.608975 12.479253 50 2376.3483 755.06052 -50.389393 + 860 0.086 -665.11603 -667.02075 148.84448 21.610149 12.480128 50 2252.9811 787.43069 -39.585062 + 870 0.087 -665.1175 -667.03045 149.48743 21.611481 12.481034 50 2060.884 901.76342 -27.129117 + 880 0.088 -665.11907 -667.01838 148.42091 21.612958 12.481978 50 1814.3354 1079.4855 -13.988401 + 890 0.089 -665.12073 -666.99552 146.50471 21.614562 12.482966 50 1531.1565 1293.9709 -1.305884 + 900 0.09 -665.12247 -666.97639 144.87389 21.616275 12.484007 50 1231.9005 1514.0741 9.7083525 + 910 0.091 -665.12426 -666.97371 144.52455 21.618074 12.485109 50 938.90089 1708.364 17.929974 + 920 0.092 -665.12609 -666.99389 145.95889 21.61994 12.486281 50 674.90767 1849.2415 22.497207 + 930 0.093 -665.12794 -667.03498 149.02559 21.621853 12.487528 50 461.18604 1916.1468 22.971745 + 940 0.094 -665.12977 -667.08777 153.00718 21.6238 12.488852 50 315.19601 1897.3867 19.43758 + 950 0.095 -665.13156 -667.13925 156.8903 21.62577 12.490254 50 248.20946 1790.5667 12.504818 + 960 0.096 -665.13326 -667.17668 159.68273 21.627757 12.491728 50 263.35912 1601.9528 3.2123256 + 970 0.097 -665.13485 -667.19079 160.6611 21.629764 12.493267 50 354.58496 1345.1489 -7.1487162 + 980 0.098 -665.13628 -667.17758 159.5175 21.631796 12.494862 50 506.7626 1039.346 -17.249179 + 990 0.099 -665.13753 -667.13942 156.43758 21.633864 12.496499 50 697.06054 707.26671 -25.92737 + 1000 0.1 -665.13859 -667.0853 152.12472 21.635982 12.498164 50 897.38498 372.94791 -32.344697 +Loop time of 0.463574 on 1 procs for 1000 steps with 100 atoms + +Performance: 18.638 ns/day, 1.288 hours/ns, 2157.152 timesteps/s +99.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.44776 | 0.44776 | 0.44776 | 0.0 | 96.59 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.0023057 | 0.0023057 | 0.0023057 | 0.0 | 0.50 +Output | 0.0015752 | 0.0015752 | 0.0015752 | 0.0 | 0.34 +Modify | 0.010602 | 0.010602 | 0.010602 | 0.0 | 2.29 +Other | | 0.001331 | | | 0.29 + +Nlocal: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 360 ave 360 max 360 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: 1800 ave 1800 max 1800 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1800 +Ave neighs/atom = 18 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.4 b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.4 new file mode 100644 index 0000000000..c5c9236649 --- /dev/null +++ b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.4 @@ -0,0 +1,180 @@ +LAMMPS (23 Oct 2017) + using 1 OpenMP thread(s) per MPI task +# Initialization +units metal +boundary p p p +atom_style atomic +processors * * 1 + +# System and atom definition +read_data BN.data # read lammps data file + orthogonal box = (0 0 0) to (21.75 12.5574 50) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 100 atoms + +# Neighbor update settings +neighbor 2.0 bin +neigh_modify every 1 +neigh_modify delay 0 +neigh_modify check yes + +# Potential +pair_style extep +pair_coeff * * ../../../../potentials/BN.extep B N +Reading potential file ../../../../potentials/BN.extep with DATE: 2017-11-28 + +# Output +thermo 10 +thermo_style custom step time etotal pe temp lx ly lz pxx pyy pzz +thermo_modify line one format float %14.8g + +# Setup NPT MD run +timestep 0.0001 # ps +velocity all create 300.0 12345 +fix thermos all npt temp 300 300 1.0 x 0 0 1.0 y 0 0 1.0 +run 1000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.2 + ghost atom cutoff = 4.2 + binsize = 2.1, bins = 11 6 24 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair extep, perpetual + attributes: full, newton on, ghost + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.943 | 2.943 | 2.943 Mbytes +Step Time TotEng PotEng Temp Lx Ly Lz Pxx Pyy Pzz + 0 0 -665.11189 -668.95092 300 21.75 12.557368 50 -1638.8315 -1636.7368 321.73163 + 10 0.001 -665.11194 -668.81065 289.03491 21.749944 12.557333 50 -1391.3771 -1841.1723 316.66669 + 20 0.002 -665.1121 -668.4273 259.06599 21.749789 12.557222 50 -1137.0171 -1980.5977 301.79466 + 30 0.003 -665.11237 -667.90117 217.93027 21.749552 12.557029 50 -912.51949 -2055.822 278.00774 + 40 0.004 -665.11278 -667.36471 175.97662 21.74925 12.556752 50 -755.38643 -2078.0669 246.62816 + 50 0.005 -665.11333 -666.94254 142.94321 21.748894 12.556389 50 -694.93153 -2062.1349 209.26356 + 60 0.006 -665.11405 -666.71476 125.08741 21.748487 12.55594 50 -744.6962 -2019.9093 167.70563 + 70 0.007 -665.11494 -666.69555 123.51632 21.748026 12.555408 50 -898.67863 -1956.2845 123.88845 + 80 0.008 -665.116 -666.83408 134.25892 21.7475 12.554796 50 -1132.5952 -1868.738 79.87581 + 90 0.009 -665.1172 -667.03647 149.98053 21.746893 12.554106 50 -1409.6896 -1750.4875 37.821017 + 100 0.01 -665.11853 -667.20002 162.65705 21.746185 12.553344 50 -1689.1599 -1595.9411 -0.14399002 + 110 0.011 -665.11997 -667.24752 166.25742 21.745356 12.552516 50 -1934.6334 -1406.3665 -32.091026 + 120 0.012 -665.12148 -667.15088 158.58671 21.744389 12.55163 50 -2120.4014 -1193.6117 -56.50543 + 130 0.013 -665.12306 -666.93754 141.7922 21.743271 12.550694 50 -2234.0841 -980.32815 -72.45885 + 140 0.014 -665.1247 -666.67903 121.4631 21.741993 12.549719 50 -2275.5656 -796.26701 -79.693692 + 150 0.015 -665.1264 -666.46562 104.65306 21.740553 12.54871 50 -2253.08 -671.5409 -78.603431 + 160 0.016 -665.1282 -666.37541 97.462619 21.738952 12.547674 50 -2178.0108 -628.83531 -70.130423 + 170 0.017 -665.13011 -666.44775 102.96665 21.737195 12.546611 50 -2060.2073 -677.02227 -55.623931 + 180 0.018 -665.13215 -666.67004 120.17784 21.735292 12.54552 50 -1905.36 -808.22824 -36.699042 + 190 0.019 -665.13431 -666.98201 144.38814 21.733253 12.544396 50 -1715.2526 -999.2481 -15.117617 + 200 0.02 -665.13656 -667.29591 168.74214 21.731091 12.543231 50 -1490.6934 -1216.735 7.3107732 + 210 0.021 -665.13885 -667.52511 186.47391 21.728823 12.542015 50 -1235.9283 -1424.4324 28.822782 + 220 0.022 -665.14112 -667.61153 193.0492 21.726467 12.540741 50 -962.70697 -1590.2885 47.801678 + 230 0.023 -665.14332 -667.54317 187.53534 21.724043 12.539402 50 -692.12856 -1691.6537 62.881768 + 240 0.024 -665.1454 -667.35665 172.79772 21.72157 12.537993 50 -453.02755 -1717.6064 73.041858 + 250 0.025 -665.14735 -667.12424 154.48373 21.719064 12.536514 50 -276.81709 -1668.3598 77.670868 + 260 0.026 -665.14918 -666.92939 139.11409 21.716539 12.534967 50 -190.03656 -1552.4049 76.59734 + 270 0.027 -665.15091 -666.83859 131.88391 21.714 12.533357 50 -206.85537 -1382.4915 70.085105 + 280 0.028 -665.15258 -666.87889 134.90214 21.711446 12.53169 50 -324.01795 -1171.7578 58.801327 + 290 0.029 -665.15421 -667.02881 146.49028 21.708869 12.529975 50 -520.0146 -931.26466 43.758636 + 300 0.03 -665.1558 -667.22646 161.81084 21.706255 12.528222 50 -758.87113 -669.74523 26.225956 + 310 0.031 -665.15734 -667.39183 174.61368 21.703587 12.526442 50 -997.42782 -395.56111 7.601897 + 320 0.032 -665.15878 -667.45546 179.47345 21.700849 12.524646 50 -1193.9402 -119.86797 -10.744258 + 330 0.033 -665.16008 -667.38312 173.71901 21.698026 12.522846 50 -1315.6446 140.7451 -27.638433 + 340 0.034 -665.16118 -667.18792 158.37888 21.695112 12.521051 50 -1343.5396 363.95099 -42.231049 + 350 0.035 -665.16207 -666.92571 137.81938 21.692103 12.519271 50 -1273.6625 524.73453 -54.046178 + 360 0.036 -665.16274 -666.67543 118.20885 21.689004 12.517514 50 -1115.1514 601.37143 -62.932702 + 370 0.037 -665.1632 -666.5115 105.36258 21.685827 12.515781 50 -886.11568 582.42087 -68.942158 + 380 0.038 -665.16348 -666.47849 102.76116 21.682589 12.514072 50 -608.71321 472.04732 -72.193259 + 390 0.039 -665.1636 -666.57728 110.47178 21.679308 12.512382 50 -304.85697 291.41908 -72.787214 + 400 0.04 -665.16356 -666.76741 125.33244 21.676006 12.510704 50 6.3732307 75.407852 -70.806087 + 410 0.041 -665.16336 -666.98363 142.24457 21.672705 12.50903 50 309.23046 -134.40319 -66.378966 + 420 0.042 -665.16298 -667.15939 156.00935 21.669426 12.507351 50 590.16982 -298.16702 -59.767469 + 430 0.043 -665.16239 -667.24843 163.01313 21.66619 12.50566 50 836.19535 -385.22443 -51.420249 + 440 0.044 -665.16157 -667.23746 162.2204 21.663014 12.503955 50 1033.943 -378.7816 -41.969885 + 450 0.045 -665.1605 -667.14707 155.24066 21.659911 12.502234 50 1170.3399 -277.11556 -32.175503 + 460 0.046 -665.15917 -667.0218 145.55489 21.656891 12.500503 50 1234.9026 -91.620499 -22.833423 + 470 0.047 -665.15761 -666.91366 137.22578 21.65396 12.498768 50 1222.9519 157.31306 -14.680548 + 480 0.048 -665.15585 -666.86462 133.53159 21.651114 12.497041 50 1138.5551 445.2926 -8.3071781 + 490 0.049 -665.15393 -666.89359 135.9458 21.64835 12.495333 50 996.00682 748.51842 -4.0872169 + 500 0.05 -665.15188 -666.99142 143.75058 21.645657 12.493655 50 819.08561 1046.9785 -2.1306918 + 510 0.051 -665.14975 -667.12519 154.36991 21.643022 12.49202 50 637.99022 1325.7112 -2.2650822 + 520 0.052 -665.14756 -667.25 164.29491 21.640432 12.49044 50 484.54509 1574.1916 -4.0528391 + 530 0.053 -665.14531 -667.32459 170.29969 21.637878 12.488923 50 386.77357 1784.4858 -6.8479114 + 540 0.054 -665.143 -667.32552 170.55254 21.635352 12.48748 50 364.14599 1949.2189 -9.8841824 + 550 0.055 -665.14064 -667.25527 165.24765 21.632853 12.486117 50 424.6565 2060.4607 -12.37851 + 560 0.056 -665.13822 -667.14127 156.52756 21.630385 12.484837 50 564.3912 2110.2547 -13.62742 + 570 0.057 -665.13576 -667.0259 147.70502 21.627958 12.483643 50 769.54354 2092.8157 -13.082914 + 580 0.058 -665.13327 -666.95107 142.05154 21.625586 12.482535 50 1020.1218 2007.6508 -10.405617 + 590 0.059 -665.13079 -666.94279 141.59877 21.623287 12.481508 50 1294.1274 1862.3568 -5.5031153 + 600 0.06 -665.12832 -667.00189 146.40928 21.621079 12.480557 50 1570.9478 1673.8456 1.4410957 + 610 0.061 -665.12591 -667.10417 154.59072 21.618982 12.479674 50 1833.1388 1467.2639 9.9561573 + 620 0.062 -665.12355 -667.20973 163.02368 21.617015 12.478851 50 2066.4951 1272.6732 19.310607 + 630 0.063 -665.12128 -667.27744 168.49239 21.615193 12.47808 50 2259.0193 1120.2758 28.59477 + 640 0.064 -665.11911 -667.27898 168.7823 21.613531 12.477355 50 2399.792 1035.3525 36.8539 + 650 0.065 -665.11707 -667.20773 163.37438 21.612037 12.476673 50 2478.6675 1034.0481 43.239368 + 660 0.066 -665.11518 -667.0802 153.55598 21.610718 12.476033 50 2487.2505 1120.8274 47.131883 + 670 0.067 -665.11345 -666.93026 141.97434 21.609573 12.475439 50 2420.9786 1288.0136 48.201717 + 680 0.068 -665.11191 -666.79864 131.80955 21.608598 12.474897 50 2281.6131 1517.4002 46.399066 + 690 0.069 -665.11056 -666.72065 125.82027 21.607784 12.474418 50 2079.2055 1783.5346 41.895586 + 700 0.07 -665.10941 -666.71578 125.5291 21.607116 12.474011 50 1832.7039 2057.9076 35.011051 + 710 0.071 -665.10848 -666.78203 130.77932 21.606577 12.473687 50 1568.7275 2313.0601 26.153491 + 720 0.072 -665.10776 -666.89681 139.80468 21.606148 12.473458 50 1318.5189 2525.6808 15.783637 + 730 0.073 -665.10727 -667.0243 149.80574 21.605812 12.47333 50 1113.5537 2678.1859 4.3967762 + 740 0.074 -665.10701 -667.12698 157.85016 21.605555 12.473311 50 980.633 2758.9123 -7.4930622 + 750 0.075 -665.10697 -667.17729 161.78497 21.605368 12.473404 50 937.45086 2761.5936 -19.376492 + 760 0.076 -665.10714 -667.1654 160.84249 21.605247 12.473609 50 989.5724 2684.9256 -30.776106 + 770 0.077 -665.1075 -667.10061 155.75086 21.605196 12.473922 50 1129.4775 2532.7048 -41.263677 + 780 0.078 -665.10803 -667.00654 148.35835 21.605226 12.474338 50 1337.8663 2314.4556 -50.455407 + 790 0.079 -665.10869 -666.91242 140.9515 21.605349 12.474848 50 1586.9099 2045.9808 -57.988114 + 800 0.08 -665.10946 -666.84375 135.52533 21.605585 12.475441 50 1844.7038 1749.1281 -63.495405 + 810 0.081 -665.11032 -666.81538 133.24173 21.60595 12.476105 50 2079.9601 1450.3113 -66.60795 + 820 0.082 -665.11127 -666.82877 134.21424 21.606461 12.476828 50 2266.0059 1177.7937 -66.990929 + 830 0.083 -665.1123 -666.87353 137.6312 21.607131 12.477599 50 2383.4351 958.19752 -64.411861 + 840 0.084 -665.11343 -666.93214 142.12323 21.607968 12.478409 50 2421.1969 812.91475 -58.816538 + 850 0.085 -665.11467 -666.98597 146.2321 21.608975 12.479253 50 2376.3483 755.06052 -50.389393 + 860 0.086 -665.11603 -667.02075 148.84448 21.610149 12.480128 50 2252.9811 787.43069 -39.585062 + 870 0.087 -665.1175 -667.03045 149.48743 21.611481 12.481034 50 2060.884 901.76342 -27.129117 + 880 0.088 -665.11907 -667.01838 148.42091 21.612958 12.481978 50 1814.3354 1079.4855 -13.988401 + 890 0.089 -665.12073 -666.99552 146.50471 21.614562 12.482966 50 1531.1565 1293.9709 -1.305884 + 900 0.09 -665.12247 -666.97639 144.87389 21.616275 12.484007 50 1231.9005 1514.0741 9.7083525 + 910 0.091 -665.12426 -666.97371 144.52455 21.618074 12.485109 50 938.90089 1708.364 17.929974 + 920 0.092 -665.12609 -666.99389 145.95889 21.61994 12.486281 50 674.90767 1849.2415 22.497207 + 930 0.093 -665.12794 -667.03498 149.02559 21.621853 12.487528 50 461.18604 1916.1468 22.971745 + 940 0.094 -665.12977 -667.08777 153.00718 21.6238 12.488852 50 315.19601 1897.3867 19.43758 + 950 0.095 -665.13156 -667.13925 156.8903 21.62577 12.490254 50 248.20946 1790.5667 12.504818 + 960 0.096 -665.13326 -667.17668 159.68273 21.627757 12.491728 50 263.35912 1601.9528 3.2123256 + 970 0.097 -665.13485 -667.19079 160.6611 21.629764 12.493267 50 354.58496 1345.1489 -7.1487162 + 980 0.098 -665.13628 -667.17758 159.5175 21.631796 12.494862 50 506.7626 1039.346 -17.249179 + 990 0.099 -665.13753 -667.13942 156.43758 21.633864 12.496499 50 697.06054 707.26671 -25.92737 + 1000 0.1 -665.13859 -667.0853 152.12472 21.635982 12.498164 50 897.38498 372.94791 -32.344697 +Loop time of 0.174508 on 4 procs for 1000 steps with 100 atoms + +Performance: 49.511 ns/day, 0.485 hours/ns, 5730.393 timesteps/s +98.8% 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.12409 | 0.12834 | 0.13408 | 1.1 | 73.54 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.016369 | 0.021358 | 0.025324 | 2.7 | 12.24 +Output | 0.0023892 | 0.0025101 | 0.0028272 | 0.4 | 1.44 +Modify | 0.01733 | 0.018302 | 0.018958 | 0.5 | 10.49 +Other | | 0.003995 | | | 2.29 + +Nlocal: 25 ave 26 max 24 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 179 ave 180 max 178 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 450 ave 468 max 432 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 1800 +Ave neighs/atom = 18 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/misc/rhok/README.md b/examples/USER/misc/rhok/README.md new file mode 100644 index 0000000000..4e011255fc --- /dev/null +++ b/examples/USER/misc/rhok/README.md @@ -0,0 +1,74 @@ +# The Interface Pinning method for studying solid-liquid transitions + +In this example we will use the interface pinnig method to study a solid-liquid transition. +This is done by adding a harmonic potential to the Hamiltonian +that bias the system towards two-phase configurations: + + U_bias = 0.5*K*(Q-a)^2 + +The bias field couple to an order-parameter of crystallinity Q. The implementation use long-range order: + + Q=|rho_k|, + +where rho_k is the collective density field of the wave-vector k. +For future reference we note that the structure factor S(k) is given by the variance of the collective density field: + + S(k)=|rho_k|^2. + +### About the method + +It is recommended to get familiar with the interface pinning method by reading: + + [Ulf R. Pedersen, JCP 139, 104102 (2013)](http://dx.doi.org/10.1063/1.4818747) + +A detailed bibliography is provided at + + + +and a brief introduction can be found at YouTube: + + [![Interface Pinning](http://img.youtube.com/vi/F_79JZNdyoQ/0.jpg)](http://www.youtube.com/watch?v=F_79JZNdyoQ) + +### Implimentation in LAMMPS + +For this example we will be using the rhok fix. + + fix [name] [groupID] rhok [nx] [ny] [nz] [K] [a] + +This fix include a harmonic bias potential U_bias=0.5*K*(|rho_k|-a)^2 to the force calculation. +The elements of the wave-vector k is given by the nx, ny and nz input: + + k_x = (2 pi / L_x) * n_x, k_y = (2 pi / L_y) * n_y and k_z = (2 pi / L_z) * n_z. + +We will use a k vector that correspond to a Bragg peak. + +## Example: the Lennard-Jones (LJ) model + +We will use the interface pinning method to study melting of the LJ model +at temperature 0.8 and pressure 2.185. This is a coexistence state-point, and the method +can be used to show this. The present directory contains the input files that we will use: + + in.crystal + in.setup + in.pinning + +1. First we will determine the density of the crystal with the LAMMPS input file in.crystal. + From the output we get that the average density after equilibration is 0.9731. + We need this density to ensure hydrostatic pressure when in a two-phase simulation. + +2. Next, we setup a two-phase configuration using in.setup. + +3. Finally, we run a two-phase simulation with the bias-field applied using in.pinning. + The last column in the output show |rho_k|. We note that after a equilibration period + the value fluctuates around the anchor point (a) -- showing that this is indeed a coexistence + state point. + +The reference [JCP 139, 104102 (2013)](http://dx.doi.org/10.1063/1.4818747) gives details on using the method to find coexistence state points, +and the reference [JCP 142, 044104 (2015)](http://dx.doi.org/10.1063/1.4818747) show how the crystal growth rate can be computed from fluctuations. +That method have been experienced to be most effective in the slightly super-heated regime above the melting temperature. + +## Contact + + Ulf R. Pedersen; + ; + ulf AT urp.dk diff --git a/examples/USER/misc/rhok/in.crystal b/examples/USER/misc/rhok/in.crystal new file mode 100644 index 0000000000..55e9e59a06 --- /dev/null +++ b/examples/USER/misc/rhok/in.crystal @@ -0,0 +1,36 @@ +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes +lattice fcc 0.9731 +region my_box block 0 8.0 0 8.0 0 20.0 +create_box 1 my_box +region particles block 0 8.0 0 8.0 0 20.0 +create_atoms 1 region particles +pair_coeff 1 1 1.0 1.0 2.5 +pair_modify tail no +pair_modify shift yes +mass 1 1.0 +velocity all create 1.6 1 mom yes rot yes + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet +fix ensemble all npt temp 0.8 0.8 4.0 aniso 2.185 2.185 8.0 pchain 32 + +# computing long-range order (no bias is added since k=0) +fix bias all rhok 16 0 0 0.0 0.0 + +# output +thermo 50 +thermo_style custom step temp press density f_bias[3] +# dump dumpXYZ all xyz 2000 traj.xyz + +# NOTE: this is cut short to 5000 steps for demonstration purposes +# run 100000 +run 5000 diff --git a/examples/USER/misc/rhok/in.pinning b/examples/USER/misc/rhok/in.pinning new file mode 100644 index 0000000000..0c220f480b --- /dev/null +++ b/examples/USER/misc/rhok/in.pinning @@ -0,0 +1,33 @@ +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes +read_data data.halfhalf +pair_coeff 1 1 1.0 1.0 2.5 +mass 1 1.0 + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet + +velocity all create 0.8 1 mom yes rot yes +fix ensemble all npt temp 0.8 0.8 4.0 z 2.185 2.185 8.0 +fix 100 all momentum 100 linear 1 1 1 + +# harmonic rho_k bias-field +# nx ny nz K a +fix bias all rhok 16 0 0 4.0 26.00 + +# output U_bias rho_k_RE rho_k_IM |rho_k| +thermo_style custom step temp pzz pe lz f_bias f_bias[1] f_bias[2] f_bias[3] +thermo 50 +# dump dumpXYZ all xyz 500 traj.xyz + +# NOTE: run reduced for demonstration purposes +# run 50000 +run 5000 diff --git a/examples/USER/misc/rhok/in.setup b/examples/USER/misc/rhok/in.setup new file mode 100644 index 0000000000..649b0f534c --- /dev/null +++ b/examples/USER/misc/rhok/in.setup @@ -0,0 +1,41 @@ +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes + +# fcc lattice +lattice fcc 0.9731 +region my_box block 0 8.0 0 8.0 0 20.0 +create_box 1 my_box +region particles block 0 8.0 0 8.0 0 20.0 +create_atoms 1 region particles +pair_coeff 1 1 1.0 1.0 2.5 +mass 1 1.0 +change_box all z final 0.0 34 remap units box + +# select particles in one side of the elongated box +region left plane 0 0 10 0 0 1 +group left region left + +velocity left create 6.0 1 mom yes rot yes + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet +fix ensemble left nve # Note: only move particle in left-hand side +fix langevin left langevin 3.0 0.8 100.0 2017 + +# outout +thermo_style custom step temp pzz pe lz +thermo 100 +# dump dumpXYZ all xyz 100 traj.xyz + +# run reduced for demonstration purposes +# run 10000 +run 5000 +write_data data.halfhalf diff --git a/examples/USER/misc/rhok/log.22Sep2017.crystal.g++.1 b/examples/USER/misc/rhok/log.22Sep2017.crystal.g++.1 new file mode 100644 index 0000000000..05fadb5c03 --- /dev/null +++ b/examples/USER/misc/rhok/log.22Sep2017.crystal.g++.1 @@ -0,0 +1,187 @@ +LAMMPS (22 Sep 2017) + using 1 OpenMP thread(s) per MPI task +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes +lattice fcc 0.9731 +Lattice spacing in x,y,z = 1.6019 1.6019 1.6019 +region my_box block 0 8.0 0 8.0 0 20.0 +create_box 1 my_box +Created orthogonal box = (0 0 0) to (12.8152 12.8152 32.0379) + 1 by 1 by 1 MPI processor grid +region particles block 0 8.0 0 8.0 0 20.0 +create_atoms 1 region particles +Created 5120 atoms +pair_coeff 1 1 1.0 1.0 2.5 +pair_modify tail no +pair_modify shift yes +mass 1 1.0 +velocity all create 1.6 1 mom yes rot yes + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet +fix ensemble all npt temp 0.8 0.8 4.0 aniso 2.185 2.185 8.0 pchain 32 + +# computing long-range order (no bias is added since k=0) +fix bias all rhok 16 0 0 0.0 0.0 + +# output +thermo 50 +thermo_style custom step temp press density f_bias[3] +# dump dumpXYZ all xyz 2000 traj.xyz + +# NOTE: this is cut short to 5000 steps for demonstration purposes +# run 100000 +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.1 + ghost atom cutoff = 3.1 + binsize = 1.55, bins = 9 9 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.523 | 4.523 | 4.523 Mbytes +Step Temp Press Density f_bias[3] + 0 1.6 -2.7568106 0.9731 71.554175 + 50 0.78457786 3.1029192 0.97362639 54.327705 + 100 0.85528971 2.4670259 0.97213457 55.189308 + 150 0.85241818 2.3210306 0.9698027 56.138125 + 200 0.82301385 2.3448692 0.96708227 55.735326 + 250 0.83076383 2.0890816 0.96425763 55.320625 + 300 0.81602823 2.0118796 0.96173925 54.095736 + 350 0.81084006 1.9122192 0.95979392 54.526429 + 400 0.80776593 1.8502174 0.95869117 54.434901 + 450 0.80694697 1.8435873 0.95851085 53.20809 + 500 0.81384248 1.8111331 0.95917305 53.419395 + 550 0.81027072 1.9222272 0.96056019 54.36723 + 600 0.81199582 2.0291945 0.96248486 54.888582 + 650 0.82507964 2.0706462 0.96467227 55.807137 + 700 0.832562 2.1471442 0.9668913 56.721267 + 750 0.83358138 2.2674672 0.968984 56.723838 + 800 0.83477542 2.3658275 0.97072603 56.234689 + 850 0.84722921 2.3506233 0.97189674 56.262424 + 900 0.83526965 2.4532068 0.97248856 56.219103 + 950 0.83174583 2.4763958 0.97249527 56.409813 + 1000 0.83022557 2.4334341 0.97194093 55.890858 + 1050 0.83208978 2.3478416 0.97092452 54.934691 + 1100 0.82789545 2.272404 0.9696152 54.90894 + 1150 0.82678617 2.1798046 0.96819776 54.927782 + 1200 0.8088841 2.1960256 0.96687735 54.914327 + 1250 0.81512784 2.0736261 0.96579008 53.927291 + 1300 0.81271067 2.0297138 0.96504188 54.289698 + 1350 0.8201767 1.9493976 0.96464115 55.342131 + 1400 0.80880489 2.0016987 0.96468463 55.757758 + 1450 0.8114196 2.0282699 0.96514115 55.865676 + 1500 0.81085664 2.0838361 0.96591869 56.553425 + 1550 0.81257075 2.1283157 0.96694549 56.921544 + 1600 0.82617645 2.1017986 0.96817075 56.858808 + 1650 0.82616141 2.1885582 0.96941073 56.717917 + 1700 0.81634174 2.2996967 0.97047447 56.453745 + 1750 0.82447573 2.2924266 0.97128663 56.916813 + 1800 0.83610432 2.236456 0.97178453 56.400752 + 1850 0.82479203 2.3103493 0.97197318 55.891368 + 1900 0.82298992 2.3059289 0.97181084 55.680563 + 1950 0.82098556 2.2801003 0.97138609 55.754406 + 2000 0.8181203 2.2480175 0.97078591 55.801363 + 2050 0.82822293 2.1208884 0.97004107 55.687 + 2100 0.7976818 2.2711199 0.96930169 55.459844 + 2150 0.81817848 2.0680351 0.96860201 56.514731 + 2200 0.80707457 2.1112141 0.96810519 55.504308 + 2250 0.81651111 2.0077603 0.96781161 55.635702 + 2300 0.80634534 2.0662241 0.96777177 56.051086 + 2350 0.80892831 2.0619333 0.96799037 56.548711 + 2400 0.82454203 1.9585394 0.9684672 56.695235 + 2450 0.81517178 2.075283 0.96921622 56.613082 + 2500 0.80969595 2.1624581 0.97010528 56.57516 + 2550 0.80862964 2.2088622 0.97100774 57.072594 + 2600 0.81468816 2.2293973 0.97192868 56.879212 + 2650 0.82063107 2.2244887 0.97269715 55.454502 + 2700 0.81691618 2.2789954 0.97319841 54.421943 + 2750 0.8141787 2.2981247 0.97340453 54.469921 + 2800 0.81973871 2.2422136 0.9733278 55.959235 + 2850 0.82037399 2.201016 0.97302727 56.685826 + 2900 0.80650164 2.2672955 0.9726128 56.574395 + 2950 0.81752783 2.1317541 0.97207545 56.809412 + 3000 0.80836945 2.1461483 0.97151192 57.205206 + 3050 0.80785109 2.1189056 0.97103049 57.418763 + 3100 0.79835058 2.146416 0.97069705 57.329383 + 3150 0.79792089 2.1388267 0.97051679 57.279852 + 3200 0.79934603 2.1049562 0.97046851 56.351494 + 3250 0.79523232 2.1549779 0.97063956 56.00356 + 3300 0.8004458 2.1145975 0.97096375 55.725509 + 3350 0.79772742 2.166292 0.97143785 55.558075 + 3400 0.80621087 2.1309217 0.97198456 55.816704 + 3450 0.80540626 2.1727557 0.97263267 55.671283 + 3500 0.80867606 2.1905129 0.97321538 55.390086 + 3550 0.80917896 2.2144872 0.97370472 55.742085 + 3600 0.80930722 2.2288938 0.974093 56.23064 + 3650 0.80390523 2.2777327 0.97431886 56.084731 + 3700 0.79620093 2.3143541 0.97435103 55.942797 + 3750 0.80252393 2.2564638 0.9741875 56.042055 + 3800 0.78981264 2.3156481 0.9739121 55.971352 + 3850 0.80391951 2.1804938 0.97351088 55.855858 + 3900 0.81268129 2.0855818 0.97308521 56.288315 + 3950 0.7958182 2.175259 0.97273088 56.140141 + 4000 0.80054484 2.1163279 0.97243129 56.366818 + 4050 0.79760187 2.105362 0.97225308 56.684619 + 4100 0.79283424 2.1357603 0.972206 56.203341 + 4150 0.79543088 2.1036951 0.97227608 56.606315 + 4200 0.79410999 2.1402049 0.97253758 56.277478 + 4250 0.7985469 2.1285154 0.97293622 56.356076 + 4300 0.79700387 2.1470614 0.97337091 56.722298 + 4350 0.80479321 2.1403244 0.97384674 57.212574 + 4400 0.79505512 2.224463 0.97434415 56.561877 + 4450 0.78346648 2.3347865 0.97478611 56.681362 + 4500 0.79811284 2.259123 0.97510069 57.365929 + 4550 0.80015561 2.2345254 0.97523653 57.34799 + 4600 0.79648318 2.2651869 0.97525975 57.502318 + 4650 0.80524865 2.1943025 0.97507638 57.702488 + 4700 0.80397778 2.1758629 0.97478268 57.162107 + 4750 0.78914913 2.2470191 0.9744625 56.849565 + 4800 0.79324889 2.2028993 0.97408817 57.572344 + 4850 0.78993209 2.181763 0.97373372 57.683552 + 4900 0.79041263 2.1604768 0.97348692 56.922312 + 4950 0.79741332 2.1105901 0.97332545 57.488932 + 5000 0.7891178 2.163416 0.97328963 57.365252 +Loop time of 33.6467 on 1 procs for 5000 steps with 5120 atoms + +Performance: 51357.258 tau/day, 148.603 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 24.699 | 24.699 | 24.699 | 0.0 | 73.41 +Neigh | 2.8894 | 2.8894 | 2.8894 | 0.0 | 8.59 +Comm | 0.34907 | 0.34907 | 0.34907 | 0.0 | 1.04 +Output | 0.0056 | 0.0056 | 0.0056 | 0.0 | 0.02 +Modify | 5.5718 | 5.5718 | 5.5718 | 0.0 | 16.56 +Other | | 0.1319 | | | 0.39 + +Nlocal: 5120 ave 5120 max 5120 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 7594 ave 7594 max 7594 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 323081 ave 323081 max 323081 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 323081 +Ave neighs/atom = 63.1018 +Neighbor list builds = 248 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:33 diff --git a/examples/USER/misc/rhok/log.22Sep2017.crystal.g++.4 b/examples/USER/misc/rhok/log.22Sep2017.crystal.g++.4 new file mode 100644 index 0000000000..cec9c69aff --- /dev/null +++ b/examples/USER/misc/rhok/log.22Sep2017.crystal.g++.4 @@ -0,0 +1,187 @@ +LAMMPS (22 Sep 2017) + using 1 OpenMP thread(s) per MPI task +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes +lattice fcc 0.9731 +Lattice spacing in x,y,z = 1.6019 1.6019 1.6019 +region my_box block 0 8.0 0 8.0 0 20.0 +create_box 1 my_box +Created orthogonal box = (0 0 0) to (12.8152 12.8152 32.0379) + 1 by 1 by 4 MPI processor grid +region particles block 0 8.0 0 8.0 0 20.0 +create_atoms 1 region particles +Created 5120 atoms +pair_coeff 1 1 1.0 1.0 2.5 +pair_modify tail no +pair_modify shift yes +mass 1 1.0 +velocity all create 1.6 1 mom yes rot yes + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet +fix ensemble all npt temp 0.8 0.8 4.0 aniso 2.185 2.185 8.0 pchain 32 + +# computing long-range order (no bias is added since k=0) +fix bias all rhok 16 0 0 0.0 0.0 + +# output +thermo 50 +thermo_style custom step temp press density f_bias[3] +# dump dumpXYZ all xyz 2000 traj.xyz + +# NOTE: this is cut short to 5000 steps for demonstration purposes +# run 100000 +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.1 + ghost atom cutoff = 3.1 + binsize = 1.55, bins = 9 9 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.23 | 3.23 | 3.23 Mbytes +Step Temp Press Density f_bias[3] + 0 1.6 -2.7568106 0.9731 71.554175 + 50 0.78457786 3.1029192 0.97362639 54.327705 + 100 0.85528971 2.4670259 0.97213457 55.189308 + 150 0.85241818 2.3210306 0.9698027 56.138125 + 200 0.82301385 2.3448692 0.96708227 55.735326 + 250 0.83076383 2.0890816 0.96425763 55.320625 + 300 0.81602823 2.0118796 0.96173925 54.095736 + 350 0.81084006 1.9122192 0.95979392 54.526429 + 400 0.80776593 1.8502174 0.95869117 54.434901 + 450 0.80694697 1.8435873 0.95851085 53.20809 + 500 0.81384248 1.8111331 0.95917305 53.419395 + 550 0.81027072 1.9222272 0.96056019 54.36723 + 600 0.81199582 2.0291945 0.96248486 54.888582 + 650 0.82507964 2.0706462 0.96467227 55.807137 + 700 0.832562 2.1471442 0.9668913 56.721267 + 750 0.83358138 2.2674672 0.968984 56.723838 + 800 0.83477542 2.3658275 0.97072603 56.234689 + 850 0.84722921 2.3506233 0.97189674 56.262424 + 900 0.83526965 2.4532068 0.97248856 56.219103 + 950 0.83174583 2.4763958 0.97249527 56.409813 + 1000 0.83022557 2.4334341 0.97194093 55.890858 + 1050 0.83208978 2.3478416 0.97092452 54.934691 + 1100 0.82789545 2.272404 0.9696152 54.90894 + 1150 0.82678617 2.1798046 0.96819776 54.927782 + 1200 0.8088841 2.1960256 0.96687735 54.914327 + 1250 0.81512784 2.0736261 0.96579008 53.927291 + 1300 0.81271067 2.0297138 0.96504188 54.289698 + 1350 0.8201767 1.9493976 0.96464115 55.342131 + 1400 0.80880489 2.0016987 0.96468463 55.757758 + 1450 0.8114196 2.0282699 0.96514115 55.865676 + 1500 0.81085664 2.0838361 0.96591869 56.553425 + 1550 0.81257075 2.1283157 0.96694549 56.921544 + 1600 0.82617645 2.1017986 0.96817075 56.858808 + 1650 0.82616141 2.1885582 0.96941073 56.717917 + 1700 0.81634174 2.2996967 0.97047447 56.453745 + 1750 0.82447573 2.2924266 0.97128663 56.916813 + 1800 0.83610432 2.236456 0.97178453 56.400752 + 1850 0.824792 2.3103491 0.97197318 55.891368 + 1900 0.82298989 2.3059287 0.97181084 55.680562 + 1950 0.82098545 2.2801009 0.97138609 55.754404 + 2000 0.81812031 2.2480166 0.97078591 55.801371 + 2050 0.82822262 2.1208887 0.97004108 55.687001 + 2100 0.79768162 2.2711186 0.9693017 55.459852 + 2150 0.81817874 2.0680317 0.96860202 56.514744 + 2200 0.80707412 2.1112032 0.96810521 55.504308 + 2250 0.81650921 2.0077757 0.96781164 55.635717 + 2300 0.80634656 2.066186 0.96777181 56.051088 + 2350 0.80893174 2.0619084 0.96799042 56.548711 + 2400 0.82453783 1.9585503 0.96846727 56.695111 + 2450 0.81517275 2.0752617 0.96921631 56.614046 + 2500 0.80969622 2.1624476 0.9701054 56.574846 + 2550 0.80861922 2.2089505 0.97100787 57.072334 + 2600 0.81468888 2.2293754 0.97192875 56.879416 + 2650 0.82061239 2.2245462 0.97269723 55.442015 + 2700 0.81687473 2.2792015 0.97319852 54.420301 + 2750 0.81416567 2.2982988 0.97340467 54.469427 + 2800 0.81978563 2.2418723 0.97332803 55.965451 + 2850 0.82069759 2.1988948 0.97302752 56.686807 + 2900 0.80631184 2.2684466 0.97261407 56.585682 + 2950 0.81759744 2.1312328 0.97207888 56.812431 + 3000 0.80748056 2.152676 0.97151807 57.178849 + 3050 0.80789237 2.118162 0.97103728 57.433724 + 3100 0.79882523 2.1414744 0.97070338 57.34686 + 3150 0.79803949 2.1359043 0.97052875 57.382544 + 3200 0.79170386 2.1548392 0.97049349 56.465806 + 3250 0.78848813 2.1990144 0.97067557 55.929088 + 3300 0.79820555 2.1304609 0.97101444 55.624487 + 3350 0.79250565 2.1971235 0.97149233 55.933615 + 3400 0.80584844 2.1417239 0.97206083 55.85922 + 3450 0.80685744 2.1640501 0.97266047 55.135963 + 3500 0.80751888 2.1858277 0.97318703 55.407581 + 3550 0.79882754 2.2796452 0.97363149 55.392366 + 3600 0.80219171 2.2715765 0.97392571 55.867887 + 3650 0.79061794 2.3492866 0.97410985 56.0192 + 3700 0.8058483 2.2327904 0.97411924 56.491303 + 3750 0.79460746 2.2941868 0.97397764 55.929912 + 3800 0.80447478 2.2018009 0.97367627 55.663208 + 3850 0.80355335 2.17638 0.97333164 55.637261 + 3900 0.80388417 2.1531434 0.9729647 56.03794 + 3950 0.79557409 2.1853318 0.9726503 56.132348 + 4000 0.79547396 2.1457051 0.97235244 55.552675 + 4050 0.8058384 2.0637678 0.97213346 56.185416 + 4100 0.7976931 2.1028246 0.97208255 56.050347 + 4150 0.79555522 2.115473 0.97216375 56.868136 + 4200 0.79324134 2.1510383 0.97246129 56.462635 + 4250 0.80788167 2.0534887 0.97287821 55.650788 + 4300 0.79389865 2.2019815 0.97337765 55.596846 + 4350 0.79786309 2.1851119 0.97389825 57.000921 + 4400 0.79986518 2.1997541 0.97443778 57.551564 + 4450 0.8063901 2.1893874 0.97493151 57.236138 + 4500 0.80005802 2.250364 0.97533075 57.341358 + 4550 0.79707443 2.2995576 0.97557554 57.338713 + 4600 0.79869949 2.2807889 0.97563277 57.084504 + 4650 0.79694427 2.2673215 0.97544638 57.025663 + 4700 0.79023986 2.2884131 0.97511483 57.131188 + 4750 0.79566823 2.2215519 0.97464304 57.045676 + 4800 0.78936986 2.2268037 0.97410626 57.384178 + 4850 0.79025913 2.1836718 0.973616 57.78438 + 4900 0.80138424 2.0657609 0.9732124 57.888266 + 4950 0.77853735 2.207944 0.97296347 57.312213 + 5000 0.79115984 2.1035893 0.97285578 57.109472 +Loop time of 9.53489 on 4 procs for 5000 steps with 5120 atoms + +Performance: 181229.223 tau/day, 524.390 timesteps/s +99.1% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 6.312 | 6.4238 | 6.5139 | 3.1 | 67.37 +Neigh | 0.72062 | 0.73538 | 0.74531 | 1.1 | 7.71 +Comm | 0.52697 | 0.64152 | 0.78688 | 14.1 | 6.73 +Output | 0.0028393 | 0.0029888 | 0.0033851 | 0.4 | 0.03 +Modify | 1.6249 | 1.669 | 1.7253 | 2.9 | 17.50 +Other | | 0.06221 | | | 0.65 + +Nlocal: 1280 ave 1289 max 1266 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Nghost: 3346.25 ave 3379 max 3331 min +Histogram: 1 2 0 0 0 0 0 0 0 1 +Neighs: 80701.8 ave 81534 max 79755 min +Histogram: 1 0 1 0 0 0 0 0 1 1 + +Total # of neighbors = 322807 +Ave neighs/atom = 63.0482 +Neighbor list builds = 248 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:09 diff --git a/examples/USER/misc/rhok/log.22Sep2017.pinning.g++.1 b/examples/USER/misc/rhok/log.22Sep2017.pinning.g++.1 new file mode 100644 index 0000000000..c2aaa9a581 --- /dev/null +++ b/examples/USER/misc/rhok/log.22Sep2017.pinning.g++.1 @@ -0,0 +1,186 @@ +LAMMPS (22 Sep 2017) + using 1 OpenMP thread(s) per MPI task +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes +read_data data.halfhalf + orthogonal box = (0 0 0) to (12.8152 12.8152 34) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 5120 atoms + reading velocities ... + 5120 velocities +pair_coeff 1 1 1.0 1.0 2.5 +mass 1 1.0 + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet + +velocity all create 0.8 1 mom yes rot yes +fix ensemble all npt temp 0.8 0.8 4.0 z 2.185 2.185 8.0 +fix 100 all momentum 100 linear 1 1 1 + +# harmonic rho_k bias-field +# nx ny nz k a +fix bias all rhok 16 0 0 4.0 26.00 + +# output U_bias rho_k_RE rho_k_IM |rho_k| +thermo_style custom step temp pzz pe lz f_bias f_bias[1] f_bias[2] f_bias[3] +thermo 50 +dump dumpXYZ all xyz 500 traj.xyz + +# NOTE: run reduced for demonstration purposes +# run 50000 +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.1 + ghost atom cutoff = 3.1 + binsize = 1.55, bins = 9 9 22 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.723 | 5.723 | 5.723 Mbytes +Step Temp Pzz PotEng Lz f_bias f_bias[1] f_bias[2] f_bias[3] + 0 0.8 5.1566801 -4.8556711 34 179.52419 35.473155 -0.2832763 35.474286 + 50 1.072533 3.8158392 -5.2704532 34.024206 0.010596224 25.927135 -0.063106738 25.927212 + 100 1.1093231 3.6703116 -5.3380965 34.094814 1.8552612 26.958236 -0.51403326 26.963136 + 150 1.1080721 3.8202601 -5.3568368 34.207473 0.39188605 26.420755 -1.0759575 26.442655 + 200 1.1435287 3.3445987 -5.4365298 34.354119 3.0758718 27.239465 -0.19115251 27.240135 + 250 1.1203046 3.4669456 -5.4293867 34.511473 0.8543814 26.652785 -0.20818214 26.653598 + 300 1.1012709 3.4583154 -5.4281803 34.664509 2.4837156 27.097674 0.9518628 27.114387 + 350 1.0439632 3.8953869 -5.368619 34.810399 0.55385719 26.518391 0.64525272 26.52624 + 400 1.0083878 4.0523864 -5.3418278 34.957669 0.34806057 26.404011 0.83368604 26.417169 + 450 0.9675244 4.310087 -5.3089468 35.114208 0.7921285 26.607512 1.077889 26.629336 + 500 0.94605476 4.1050097 -5.3062273 35.284018 0.87757754 26.639125 1.1140858 26.662411 + 550 0.92662323 3.9299063 -5.3062927 35.458565 1.3746441 26.773494 1.7256603 26.829049 + 600 0.89723165 3.7683555 -5.289725 35.629881 0.46692943 26.372973 2.4135502 26.483182 + 650 0.90612566 3.1098837 -5.3267851 35.788537 0.032662126 25.918784 3.2982102 26.127793 + 700 0.9152508 2.6527976 -5.3597799 35.923343 0.014621588 25.834591 3.6093492 26.085503 + 750 0.90156356 2.3474851 -5.3545938 36.031813 0.75225637 26.307204 4.0247215 26.613293 + 800 0.89748513 1.9825103 -5.3610202 36.113888 0.33402511 26.261326 2.7858039 26.408672 + 850 0.89496343 1.8906342 -5.3673514 36.169424 0.85431557 26.534648 2.5150347 26.653573 + 900 0.89463983 1.5654217 -5.3753283 36.20181 1.5689239 26.764737 2.5474794 26.885699 + 950 0.88663832 1.4399476 -5.3703322 36.209971 0.044436903 25.818418 1.2963356 25.850941 + 1000 0.87407208 1.485718 -5.3572665 36.195386 1.4405611 26.828072 1.0520795 26.848693 + 1050 0.87580489 1.163155 -5.3647269 36.160279 0.15319559 26.234791 1.4845964 26.276763 + 1100 0.86978111 1.3743181 -5.3594907 36.104958 1.1313537 25.19895 1.5711793 25.247885 + 1150 0.86987861 1.3212927 -5.3628503 36.035486 0.039865678 25.841762 0.93898962 25.858816 + 1200 0.87142486 1.3293818 -5.3676854 35.954411 0.16827389 25.70952 -0.14639427 25.709936 + 1250 0.87582265 1.3203803 -5.3764058 35.86575 0.25946652 25.639682 0.082696867 25.639815 + 1300 0.87371627 1.4680294 -5.375151 35.772824 0.17697069 25.701417 0.2397926 25.702535 + 1350 0.88617453 1.5923057 -5.3954912 35.681046 0.00049155526 25.973634 -0.74521794 25.984323 + 1400 0.87809636 1.5821707 -5.3850722 35.594706 0.024050814 26.107395 -0.34393685 26.10966 + 1450 0.87912192 1.7820174 -5.3885842 35.514722 0.20999914 25.667238 -0.66933655 25.675964 + 1500 0.88293618 2.0295275 -5.3963602 35.443445 0.60232374 25.376395 -1.9501461 25.451218 + 1550 0.90012542 1.9476472 -5.4249456 35.382791 0.4488038 26.448928 -1.1452474 26.473711 + 1600 0.89155063 2.2462603 -5.4153432 35.332095 0.039621687 26.138157 -0.36825239 26.140751 + 1650 0.8942624 2.343747 -5.4233433 35.294954 0.0089980332 26.064277 0.38189192 26.067075 + 1700 0.90047841 2.451289 -5.4376312 35.27234 0.86985171 26.646438 0.83408084 26.659489 + 1750 0.87586052 2.6381221 -5.4067182 35.264564 6.346204 27.652722 2.6699692 27.78132 + 1800 0.87392582 2.6338176 -5.4109056 35.270073 0.046414129 26.016188 2.6651053 26.152339 + 1850 0.86540415 2.5434301 -5.4058587 35.285902 0.054615472 26.074279 2.1799787 26.165251 + 1900 0.87043082 2.5776772 -5.4216997 35.309062 0.68978148 26.38648 3.2614091 26.587274 + 1950 0.86281992 2.3107762 -5.4188978 35.338501 0.0072672577 25.736893 3.2375012 25.93972 + 2000 0.85905576 2.2894047 -5.4215995 35.36787 0.095633435 26.072085 2.7685848 26.21867 + 2050 0.85793751 2.2382039 -5.4279351 35.395213 0.13602344 25.598457 2.6881027 25.739209 + 2100 0.85585253 2.0765811 -5.4324511 35.418877 0.0059888115 25.754128 3.1436222 25.945279 + 2150 0.86701057 1.8449875 -5.4562208 35.436124 0.097328618 25.413697 4.3268293 25.7794 + 2200 0.85168154 1.9024923 -5.4395776 35.44246 0.20764576 25.094788 5.4406104 25.677784 + 2250 0.8429719 1.870335 -5.4320586 35.438363 0.34419961 24.998478 5.4475709 25.585151 + 2300 0.84176891 1.7100228 -5.4351472 35.422863 0.76036958 24.697018 5.8629967 25.383409 + 2350 0.84601588 1.8539039 -5.4456629 35.395979 0.38437531 25.647986 6.4163366 26.438392 + 2400 0.84637647 1.6299091 -5.4498948 35.36125 0.074236719 24.995872 7.8269968 26.192661 + 2450 0.85650449 1.6828907 -5.4683101 35.316669 0.3671827 25.280669 7.7040329 26.428476 + 2500 0.84963707 1.7305222 -5.4605394 35.265508 0.1406965 25.236741 7.2780025 26.265232 + 2550 0.84084365 1.8758368 -5.4497083 35.208725 0.33937687 24.544376 7.2334512 25.588067 + 2600 0.85317342 1.7781674 -5.4702734 35.149747 0.60378248 24.046307 8.3370138 25.450554 + 2650 0.85487644 2.0065374 -5.4747643 35.090431 0.22483651 24.937101 8.4669004 26.335288 + 2700 0.84550083 1.9363031 -5.4628401 35.034349 0.43442577 24.250196 7.9943738 25.533939 + 2750 0.85843419 2.0473138 -5.484528 34.980671 0.45959294 24.17438 8.179356 25.520629 + 2800 0.86047607 2.0754522 -5.4899966 34.932466 0.00038123477 24.619856 8.3153434 25.986194 + 2850 0.86375793 2.2751324 -5.4977459 34.892337 0.0016455263 24.927259 7.289789 25.971316 + 2900 0.84438986 2.3790377 -5.4721407 34.863512 1.2372354 25.819445 7.132603 26.786523 + 2950 0.8551438 2.2721926 -5.4925958 34.84473 1.5405388 25.956466 6.976385 26.87765 + 3000 0.83737707 2.4009609 -5.4707188 34.834171 0.28507766 25.643879 6.1778846 26.377543 + 3050 0.84923235 2.4187994 -5.4938573 34.830836 0.036512025 25.139252 7.1457857 26.135115 + 3100 0.83872396 2.3811576 -5.4838787 34.833673 0.246984 24.21358 8.4588719 25.648586 + 3150 0.83957817 2.3901421 -5.4913118 34.84163 0.20477984 24.309852 10.088243 26.319984 + 3200 0.84283033 2.17292 -5.5025459 34.853975 1.3367154 24.581685 10.72011 26.817531 + 3250 0.84002379 2.1247709 -5.5044955 34.866106 0.11434509 24.463842 9.4874246 26.239108 + 3300 0.83311101 2.1492058 -5.5000847 34.875625 0.0053284993 23.815298 10.560222 26.051616 + 3350 0.83216701 1.9587594 -5.5043446 34.881623 0.58985562 23.934253 11.475462 26.543073 + 3400 0.82396039 2.1914951 -5.4971506 34.881199 0.098206955 23.393402 10.82936 25.778407 + 3450 0.83483253 1.9783612 -5.5182844 34.877327 7.6571212e-05 23.675355 10.761012 26.006188 + 3500 0.82712062 1.9718522 -5.5111818 34.869214 0.014836125 23.314122 11.312845 25.913872 + 3550 0.8342927 1.9114357 -5.5259968 34.855179 1.4050442 22.442758 11.377192 25.161834 + 3600 0.82631637 1.9836457 -5.5176244 34.835738 0.084637609 23.413286 10.824194 25.794285 + 3650 0.82425697 1.9218541 -5.5178548 34.811901 0.11000071 22.788707 12.022258 25.765478 + 3700 0.82491437 1.9624493 -5.521738 34.782417 0.034984027 23.011433 12.384217 26.132257 + 3750 0.82758167 2.0856442 -5.5283493 34.748872 0.001362163 23.030662 12.122144 26.026098 + 3800 0.81891108 1.9858824 -5.5177774 34.714618 0.17075993 23.21344 12.345683 26.292199 + 3850 0.83392227 2.1631514 -5.5426333 34.681146 0.82106473 22.510204 11.678329 25.359272 + 3900 0.82230654 2.0017132 -5.5276756 34.650221 0.48735732 23.444809 12.339117 26.493638 + 3950 0.81929288 2.1749936 -5.5256673 34.61976 0.089219805 23.540062 11.527925 26.211211 + 4000 0.83415169 2.0446791 -5.5506187 34.591266 0.15593937 23.742282 11.26508 26.279231 + 4050 0.82362522 2.1998083 -5.5375157 34.563164 0.25405351 23.913834 11.081011 26.356408 + 4100 0.82589505 2.3074345 -5.543718 34.537763 0.080213125 24.03253 10.435108 26.200266 + 4150 0.83855297 2.2424199 -5.5658171 34.517758 0.62913338 23.974257 8.5079223 25.439138 + 4200 0.82522111 2.2622619 -5.5493275 34.502472 1.8756517 25.754617 7.9996898 26.968414 + 4250 0.82083124 2.4135193 -5.5464932 34.4919 1.1217436 25.8944 6.7070444 26.748914 + 4300 0.83059704 2.1375109 -5.5653245 34.487366 0.53623038 26.05979 4.9072346 26.517798 + 4350 0.82755047 2.1159821 -5.5650889 34.484506 0.10017723 25.405936 4.3532342 25.776195 + 4400 0.83192877 2.180851 -5.5759565 34.480909 0.053664012 25.993034 2.9844338 26.163805 + 4450 0.81860572 2.2333381 -5.5602138 34.477183 0.037864077 25.792233 1.9038859 25.862406 + 4500 0.82821762 2.1142023 -5.5788682 34.474784 0.088221344 26.20329 0.59417897 26.210025 + 4550 0.8205154 2.0896984 -5.5715531 34.472405 0.016076192 26.083166 -0.58187024 26.089655 + 4600 0.81294948 2.2274108 -5.5642678 34.469014 0.033774986 25.869616 0.14951307 25.870048 + 4650 0.80890532 2.1556346 -5.5622407 34.465277 0.67402048 25.413229 -0.56341819 25.419474 + 4700 0.82070227 1.9852605 -5.583747 34.460206 0.052623237 26.158394 -0.44673492 26.162209 + 4750 0.81451857 2.1097726 -5.5779782 34.451438 0.12221733 25.733718 -0.9911436 25.752798 + 4800 0.81300453 2.0211325 -5.5790076 34.439504 0.34536082 26.358606 -1.7335167 26.415548 + 4850 0.82035497 1.9489595 -5.5929886 34.424097 0.70899626 26.575865 -1.0191012 26.595397 + 4900 0.8127066 2.1312269 -5.584271 34.405998 0.087959314 26.185217 -1.1329105 26.209713 + 4950 0.81252621 2.1094866 -5.5866296 34.387869 0.79067667 26.564722 -1.8456354 26.628759 + 5000 0.80575936 2.1875995 -5.579054 34.370679 0.031787364 26.027557 -2.2666774 26.12607 +Loop time of 32.2397 on 1 procs for 5000 steps with 5120 atoms + +Performance: 53598.557 tau/day, 155.088 timesteps/s +99.4% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 22.967 | 22.967 | 22.967 | 0.0 | 71.24 +Neigh | 2.9914 | 2.9914 | 2.9914 | 0.0 | 9.28 +Comm | 0.37485 | 0.37485 | 0.37485 | 0.0 | 1.16 +Output | 0.064337 | 0.064337 | 0.064337 | 0.0 | 0.20 +Modify | 5.7143 | 5.7143 | 5.7143 | 0.0 | 17.72 +Other | | 0.1281 | | | 0.40 + +Nlocal: 5120 ave 5120 max 5120 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 7962 ave 7962 max 7962 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 296101 ave 296101 max 296101 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 296101 +Ave neighs/atom = 57.8322 +Neighbor list builds = 283 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:32 diff --git a/examples/USER/misc/rhok/log.22Sep2017.pinning.g++.4 b/examples/USER/misc/rhok/log.22Sep2017.pinning.g++.4 new file mode 100644 index 0000000000..c7a77fb9cc --- /dev/null +++ b/examples/USER/misc/rhok/log.22Sep2017.pinning.g++.4 @@ -0,0 +1,186 @@ +LAMMPS (22 Sep 2017) + using 1 OpenMP thread(s) per MPI task +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes +read_data data.halfhalf + orthogonal box = (0 0 0) to (12.8152 12.8152 34) + 1 by 1 by 4 MPI processor grid + reading atoms ... + 5120 atoms + reading velocities ... + 5120 velocities +pair_coeff 1 1 1.0 1.0 2.5 +mass 1 1.0 + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet + +velocity all create 0.8 1 mom yes rot yes +fix ensemble all npt temp 0.8 0.8 4.0 z 2.185 2.185 8.0 +fix 100 all momentum 100 linear 1 1 1 + +# harmonic rho_k bias-field +# nx ny nz k a +fix bias all rhok 16 0 0 4.0 26.00 + +# output U_bias rho_k_RE rho_k_IM |rho_k| +thermo_style custom step temp pzz pe lz f_bias f_bias[1] f_bias[2] f_bias[3] +thermo 50 +dump dumpXYZ all xyz 500 traj.xyz + +# NOTE: run reduced for demonstration purposes +# run 50000 +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.1 + ghost atom cutoff = 3.1 + binsize = 1.55, bins = 9 9 22 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.023 | 4.027 | 4.03 Mbytes +Step Temp Pzz PotEng Lz f_bias f_bias[1] f_bias[2] f_bias[3] + 0 0.8 5.1872229 -4.8361269 34 152.02869 34.711006 -0.72709593 34.71862 + 50 1.0819371 3.9250728 -5.2655842 34.02563 0.51385908 26.505979 0.2187864 26.506882 + 100 1.1182271 3.5397251 -5.3331401 34.100753 2.1059904 27.025883 -0.12127124 27.026156 + 150 1.1121434 3.7845571 -5.3440494 34.213993 1.7206575 26.894862 -1.3261751 26.927539 + 200 1.1446439 3.4114364 -5.4199119 34.358914 2.383615 27.054401 -1.4211151 27.091699 + 250 1.1115073 3.5603047 -5.3988013 34.517397 0.60819391 26.51404 -1.4089688 26.55145 + 300 1.0828478 3.7411116 -5.3842818 34.673948 0.73987465 26.528178 -2.062382 26.608225 + 350 1.0342597 3.9206217 -5.3384367 34.825105 0.99965014 26.657737 -1.6211152 26.706983 + 400 1.0064356 3.9929044 -5.324003 34.97579 0.41927007 26.402623 -1.7087432 26.457859 + 450 0.96799277 4.2764255 -5.2947175 35.133839 0.77739461 26.503753 -2.5217998 26.623456 + 500 0.94691076 4.1007962 -5.2922124 35.301893 0.17015805 26.212252 -2.0421698 26.291683 + 550 0.93675297 3.7404088 -5.3056917 35.474301 0.56247039 26.335926 -3.205722 26.530316 + 600 0.92707577 3.5439822 -5.3176094 35.641282 0.04054693 25.679461 -3.0301039 25.857615 + 650 0.91828226 3.1833648 -5.3278237 35.794766 0.8427054 26.4003 -3.6331211 26.649117 + 700 0.9084826 2.8374306 -5.3327944 35.928138 1.5635222 26.605971 -3.8575939 26.884173 + 750 0.91219559 2.46172 -5.3548299 36.039156 6.3772911 27.350725 -4.8971146 27.785678 + 800 0.90000337 2.2187716 -5.3499181 36.126451 4.9080838 27.085156 -5.1291678 27.566538 + 850 0.9003432 1.8634244 -5.3614648 36.189019 0.0081092188 25.497333 -5.4038153 26.063676 + 900 0.89741573 1.5697398 -5.3660799 36.226074 0.011155479 25.312724 -6.2574069 26.074684 + 950 0.88871454 1.4427205 -5.3604669 36.237407 0.3287078 25.659237 -6.232896 26.405406 + 1000 0.88606353 1.3088636 -5.3626576 36.226015 0.30068168 24.554896 -7.2832017 25.612262 + 1050 0.88527541 1.3194263 -5.3666773 36.19311 0.10646314 24.514921 -7.9419424 25.76928 + 1100 0.87522001 1.2852124 -5.3556811 36.143056 0.13675329 24.865981 -8.446822 26.261489 + 1150 0.8805978 1.246973 -5.3671716 36.0781 0.00043275463 24.187039 -9.4985495 25.98529 + 1200 0.85711495 1.376588 -5.3346243 36.002427 0.47623639 23.691349 -9.4648541 25.512026 + 1250 0.88116805 1.3562001 -5.3731036 35.919289 0.32797055 23.322103 -10.54448 25.595049 + 1300 0.87178482 1.5046564 -5.3610798 35.831278 0.17704849 24.190231 -10.314689 26.29753 + 1350 0.87022621 1.6830825 -5.3603618 35.743318 0.0052854997 23.731157 -10.747465 26.051408 + 1400 0.89019669 1.6144812 -5.3921986 35.659687 1.4152796 22.8393 -10.551347 25.158787 + 1450 0.88852819 1.7587964 -5.3918592 35.580319 0.63560961 23.599033 -12.195 26.563742 + 1500 0.89029085 1.8772498 -5.3966098 35.509232 0.20895386 23.055083 -12.703366 26.323229 + 1550 0.88639722 2.2284824 -5.3933288 35.449043 0.44413965 22.448774 -12.156068 25.528757 + 1600 0.88816451 2.2167704 -5.3994757 35.401661 0.12210235 23.108351 -12.44643 26.247085 + 1650 0.89154791 2.3397824 -5.4086923 35.365815 0.4820208 23.090699 -12.984179 26.490928 + 1700 0.88518032 2.5351236 -5.4041601 35.343757 0.080806002 22.749825 -12.99762 26.201005 + 1750 0.86848721 2.5527491 -5.3851928 35.336433 0.045102165 22.357111 -13.564328 26.15017 + 1800 0.88501061 2.5215825 -5.4169341 35.340849 0.27488483 22.086584 -14.408273 26.370732 + 1850 0.8716061 2.5809558 -5.4045854 35.355038 0.042909785 21.270956 -14.695278 25.853525 + 1900 0.85672517 2.4836326 -5.3902797 35.375469 0.72877764 21.639909 -15.474764 26.603646 + 1950 0.85133731 2.3141629 -5.3902573 35.398523 0.0016908803 21.106617 -15.132733 25.970924 + 2000 0.86152109 2.1562002 -5.4132601 35.419851 0.371016 21.325237 -15.614625 26.430706 + 2050 0.86243551 2.019931 -5.4220349 35.436069 0.017935421 20.4131 -16.255418 26.094698 + 2100 0.87417672 1.8083823 -5.4464117 35.445091 0.18429432 19.75625 -17.365705 26.303558 + 2150 0.85872128 1.7608768 -5.4293103 35.44341 0.91209166 20.149648 -17.480387 26.675312 + 2200 0.86615373 1.8372778 -5.4458315 35.430616 0.10151993 18.559234 -17.885469 25.7747 + 2250 0.85053605 1.7198437 -5.4272104 35.408688 0.96154548 17.200861 -18.562206 25.306622 + 2300 0.85400281 1.7939644 -5.4364682 35.377708 0.12283263 18.759325 -18.358539 26.247823 + 2350 0.85495278 1.5856029 -5.4417321 35.337987 0.20564329 18.967923 -18.248149 26.320658 + 2400 0.84606771 1.7782708 -5.4315646 35.287411 0.10063977 19.185527 -17.878215 26.224321 + 2450 0.85210051 1.8190391 -5.4432116 35.232321 0.69988647 19.268861 -18.325448 26.59156 + 2500 0.85304715 1.7466204 -5.4470889 35.175245 0.0048314937 18.09176 -18.74157 26.04915 + 2550 0.85401123 1.8601945 -5.4509309 35.115748 0.99467901 17.170045 -18.574587 25.294777 + 2600 0.85778606 1.974012 -5.4586742 35.058013 0.0026599702 17.438966 -19.333395 26.036469 + 2650 0.8521239 2.0606329 -5.4526006 35.003616 0.091056354 17.16363 -19.244738 25.786627 + 2700 0.85918482 2.0766792 -5.4658947 34.954171 0.89590606 15.77108 -19.822153 25.330707 + 2750 0.85786577 2.225549 -5.4667773 34.911468 0.26577575 15.769018 -21.128817 26.364538 + 2800 0.86764664 2.2325018 -5.4849414 34.877604 0.47167555 14.950515 -20.675229 25.514369 + 2850 0.85209564 2.3434319 -5.465734 34.852715 2.7350296 13.51553 -20.829996 24.830592 + 2900 0.85757283 2.3512971 -5.4786051 34.836138 0.14816492 14.06033 -21.545946 25.727819 + 2950 0.86098926 2.3480431 -5.4890615 34.826408 0.26401534 13.381395 -22.714827 26.363329 + 3000 0.85413421 2.3243973 -5.4844129 34.823242 0.024244334 12.739486 -22.538687 25.889899 + 3050 0.85015323 2.5479266 -5.4844303 34.825228 0.4463147 12.990582 -21.975063 25.527605 + 3100 0.8530523 2.3643505 -5.495343 34.834883 0.12144265 12.844293 -22.321989 25.753583 + 3150 0.85098478 2.2521299 -5.4990526 34.848419 0.33194916 12.747856 -23.126671 26.4074 + 3200 0.84391449 2.2650057 -5.495222 34.862626 0.031888328 12.788845 -22.782174 26.12627 + 3250 0.84807155 2.1715388 -5.5080873 34.877548 0.082426694 13.316219 -22.09441 25.796989 + 3300 0.83028242 2.242889 -5.4878846 34.89175 1.1334975 14.326678 -22.593363 26.752827 + 3350 0.82924001 2.0324002 -5.4924558 34.903232 0.35473989 14.354166 -22.181868 26.421153 + 3400 0.83032841 2.0003371 -5.4997142 34.908733 0.041677437 14.528378 -21.735998 26.144356 + 3450 0.82908891 1.8683902 -5.5029185 34.907936 0.02365857 15.069507 -21.053887 25.891237 + 3500 0.82842914 1.9165344 -5.5064218 34.898681 0.17663531 15.27043 -20.674834 25.702817 + 3550 0.82735822 1.98221 -5.5088197 34.88272 1.5607134 14.915228 -20.208431 25.116622 + 3600 0.82642915 1.8422766 -5.5110752 34.8611 1.1861112 15.312314 -20.051953 25.229899 + 3650 0.82556781 1.9351408 -5.5130349 34.833406 1.018872 16.152478 -19.454871 25.286252 + 3700 0.82360651 1.9791184 -5.5128431 34.802021 0.14080727 16.907104 -19.401616 25.734663 + 3750 0.83017793 1.9855734 -5.5253254 34.768644 0.15311334 16.969506 -19.331958 25.723311 + 3800 0.82362926 2.1029656 -5.5179624 34.734178 0.10807487 17.892584 -18.542426 25.76754 + 3850 0.82313508 2.0781681 -5.5196175 34.70093 0.13343085 19.072706 -17.28778 25.741707 + 3900 0.83643385 2.0570262 -5.5421224 34.669761 0.00022792038 19.551677 -17.1548 26.010675 + 3950 0.82346174 2.0842322 -5.5252757 34.640849 0.0093759386 20.892792 -15.590263 26.068469 + 4000 0.83485868 2.1196669 -5.5451736 34.612396 0.31198053 21.630258 -15.126984 26.394956 + 4050 0.82729429 2.2033274 -5.5365945 34.585721 0.53752252 21.283533 -14.011497 25.481578 + 4100 0.82040242 2.1757309 -5.5292269 34.562271 0.36031984 22.047609 -12.961927 25.575548 + 4150 0.81932521 2.285666 -5.5307807 34.542102 0.84343149 22.486289 -11.70555 25.350604 + 4200 0.83819319 2.231174 -5.5625532 34.526447 0.47190752 23.311855 -12.57189 26.485751 + 4250 0.82542274 2.1874789 -5.5472057 34.513795 0.70518398 23.411553 -12.614639 26.593795 + 4300 0.81971158 2.241167 -5.5424504 34.503969 0.26707612 23.089805 -12.727793 26.365429 + 4350 0.83255377 2.1295532 -5.5657895 34.496326 0.072548591 23.003138 -12.52181 26.190458 + 4400 0.8128474 2.3327845 -5.5402264 34.490126 0.0013023434 23.020811 -12.029795 25.974482 + 4450 0.82013491 2.3069915 -5.5554953 34.488039 0.041123896 23.632908 -11.178674 26.143394 + 4500 0.81411544 2.2247193 -5.5509183 34.488014 0.54440601 23.010678 -10.938506 25.478269 + 4550 0.82814624 2.1142779 -5.5763482 34.487885 0.1518945 23.696817 -11.351972 26.275585 + 4600 0.82929492 2.090881 -5.5823492 34.486698 0.0045520899 23.538527 -10.929741 25.952292 + 4650 0.81061417 1.9818043 -5.5584018 34.484038 0.012526806 23.993543 -10.219174 26.079142 + 4700 0.81816105 1.9605811 -5.5735005 34.476764 1.2079835 25.151166 -9.1888856 26.777169 + 4750 0.81657042 2.0064313 -5.5744795 34.465784 1.2045017 25.487486 -8.2063886 26.776048 + 4800 0.81789335 2.0838696 -5.5796632 34.451996 0.27642542 24.647157 -7.023095 25.62823 + 4850 0.80649339 1.9892413 -5.5654796 34.436067 0.024697945 25.09823 -6.3492244 25.888874 + 4900 0.81673441 2.0125635 -5.5835037 34.416236 0.0011188576 25.446818 -5.2182483 25.976348 + 4950 0.82250033 1.9770391 -5.5946082 34.394723 0.72696707 26.37002 -3.5122842 26.602896 + 5000 0.80762758 2.075517 -5.5746076 34.371696 0.12796344 26.102184 -2.8094827 26.252946 +Loop time of 10.3394 on 4 procs for 5000 steps with 5120 atoms + +Performance: 167127.370 tau/day, 483.586 timesteps/s +99.0% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.029 | 6.0128 | 7.1918 | 35.0 | 58.15 +Neigh | 0.65673 | 0.75825 | 0.88597 | 10.3 | 7.33 +Comm | 0.43982 | 1.5284 | 2.4112 | 60.5 | 14.78 +Output | 0.022835 | 0.023039 | 0.023453 | 0.2 | 0.22 +Modify | 1.7294 | 1.9472 | 2.5687 | 25.7 | 18.83 +Other | | 0.06978 | | | 0.67 + +Nlocal: 1280 ave 1404 max 1214 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Nghost: 3521.25 ave 3581 max 3426 min +Histogram: 1 0 0 0 0 0 1 1 0 1 +Neighs: 73872.2 ave 87973 max 64161 min +Histogram: 1 1 0 0 1 0 0 0 0 1 + +Total # of neighbors = 295489 +Ave neighs/atom = 57.7127 +Neighbor list builds = 278 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:10 diff --git a/examples/USER/misc/rhok/log.22Sep2017.setup.g++.1 b/examples/USER/misc/rhok/log.22Sep2017.setup.g++.1 new file mode 100644 index 0000000000..8606d4ed94 --- /dev/null +++ b/examples/USER/misc/rhok/log.22Sep2017.setup.g++.1 @@ -0,0 +1,141 @@ +LAMMPS (22 Sep 2017) + using 1 OpenMP thread(s) per MPI task +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes + +# fcc lattice +lattice fcc 0.9731 +Lattice spacing in x,y,z = 1.6019 1.6019 1.6019 +region my_box block 0 8.0 0 8.0 0 20.0 +create_box 1 my_box +Created orthogonal box = (0 0 0) to (12.8152 12.8152 32.0379) + 1 by 1 by 1 MPI processor grid +region particles block 0 8.0 0 8.0 0 20.0 +create_atoms 1 region particles +Created 5120 atoms +pair_coeff 1 1 1.0 1.0 2.5 +mass 1 1.0 +change_box all z final 0.0 34 remap units box + orthogonal box = (0 0 0) to (12.8152 12.8152 34) + +# select particles in one side of the elongated box +region left plane 0 0 10 0 0 1 +group left region left +2688 atoms in group left + +velocity left create 6.0 1 mom yes rot yes + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet +fix ensemble left nve # Note: only move particle in left-hand side +fix langevin left langevin 3.0 0.8 100.0 2017 + +# outout +thermo_style custom step temp pzz pe lz +thermo 100 +# dump dumpXYZ all xyz 100 traj.xyz + +# run reduced for demonstration purposes +# run 10000 +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.1 + ghost atom cutoff = 3.1 + binsize = 1.55, bins = 9 9 22 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.524 | 4.524 | 4.524 Mbytes +Step Temp Pzz PotEng Lz + 0 3.1494433 -3.4735106 -6.8707307 34 + 100 1.7727555 6.5330255 -4.8035477 34 + 200 1.7462368 7.0070325 -4.7646426 34 + 300 1.7564888 6.6190123 -4.7894637 34 + 400 1.7641186 6.609684 -4.8064772 34 + 500 1.7383511 6.7304936 -4.7708095 34 + 600 1.731708 6.8574656 -4.7612918 34 + 700 1.7332167 6.6530919 -4.7670014 34 + 800 1.7487537 6.5644963 -4.7907458 34 + 900 1.7353648 6.7115188 -4.7772149 34 + 1000 1.728878 6.4175719 -4.7797216 34 + 1100 1.7471488 6.5346083 -4.813376 34 + 1200 1.7188149 6.2502104 -4.7822235 34 + 1300 1.7151194 6.792534 -4.7781701 34 + 1400 1.7406603 6.6639592 -4.8170174 34 + 1500 1.7090537 6.4677579 -4.770701 34 + 1600 1.7014954 6.2853535 -4.7679742 34 + 1700 1.7064354 6.4352857 -4.7812978 34 + 1800 1.7169971 6.5808758 -4.799426 34 + 1900 1.6822712 6.3746758 -4.7522464 34 + 2000 1.7126546 6.534969 -4.8091595 34 + 2100 1.7086108 6.4679932 -4.8146664 34 + 2200 1.6974952 6.3802129 -4.8052505 34 + 2300 1.6868035 6.4009243 -4.7935769 34 + 2400 1.7107125 6.2318869 -4.8358765 34 + 2500 1.660241 6.4891487 -4.7661183 34 + 2600 1.6801816 6.1988356 -4.8024291 34 + 2700 1.6940298 6.1328187 -4.8290053 34 + 2800 1.6755061 6.4150693 -4.8145473 34 + 2900 1.6749928 6.4248792 -4.8213509 34 + 3000 1.6310737 6.6491291 -4.7673027 34 + 3100 1.6559915 6.2726719 -4.8109181 34 + 3200 1.6574579 5.7132029 -4.8189484 34 + 3300 1.6816136 5.7697439 -4.8652811 34 + 3400 1.6489483 6.4463349 -4.8247812 34 + 3500 1.6557974 5.9763333 -4.8383712 34 + 3600 1.6215459 6.2806534 -4.7954657 34 + 3700 1.6484987 6.0671609 -4.8470777 34 + 3800 1.6473922 5.8688108 -4.8555351 34 + 3900 1.6435957 5.930425 -4.8562076 34 + 4000 1.6514434 6.1962122 -4.872998 34 + 4100 1.6138337 6.4808124 -4.8219373 34 + 4200 1.6215239 5.9467966 -4.8412146 34 + 4300 1.6129295 5.9377323 -4.8414596 34 + 4400 1.6020549 6.1104301 -4.8395939 34 + 4500 1.6047738 6.0816222 -4.8538151 34 + 4600 1.6053565 6.183466 -4.8686817 34 + 4700 1.6088152 5.7416542 -4.894114 34 + 4800 1.5954309 5.694319 -4.8840198 34 + 4900 1.5582564 6.1199614 -4.8429998 34 + 5000 1.5786672 5.8813574 -4.8907344 34 +Loop time of 28.3867 on 1 procs for 5000 steps with 5120 atoms + +Performance: 60873.483 tau/day, 176.139 timesteps/s +99.4% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 22.269 | 22.269 | 22.269 | 0.0 | 78.45 +Neigh | 4.7222 | 4.7222 | 4.7222 | 0.0 | 16.64 +Comm | 0.40821 | 0.40821 | 0.40821 | 0.0 | 1.44 +Output | 0.0042329 | 0.0042329 | 0.0042329 | 0.0 | 0.01 +Modify | 0.88231 | 0.88231 | 0.88231 | 0.0 | 3.11 +Other | | 0.1005 | | | 0.35 + +Nlocal: 5120 ave 5120 max 5120 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 7768 ave 7768 max 7768 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 297167 ave 297167 max 297167 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 297167 +Ave neighs/atom = 58.0404 +Neighbor list builds = 474 +Dangerous builds = 246 +write_data data.halfhalf +Total wall time: 0:00:28 diff --git a/examples/USER/misc/rhok/log.22Sep2017.setup.g++.4 b/examples/USER/misc/rhok/log.22Sep2017.setup.g++.4 new file mode 100644 index 0000000000..14088f7c95 --- /dev/null +++ b/examples/USER/misc/rhok/log.22Sep2017.setup.g++.4 @@ -0,0 +1,141 @@ +LAMMPS (22 Sep 2017) + using 1 OpenMP thread(s) per MPI task +units lj +dimension 3 +boundary p p p +atom_style atomic + +# truncated and shifted LJ potential +pair_style lj/cut 2.5 +pair_modify shift yes + +# fcc lattice +lattice fcc 0.9731 +Lattice spacing in x,y,z = 1.6019 1.6019 1.6019 +region my_box block 0 8.0 0 8.0 0 20.0 +create_box 1 my_box +Created orthogonal box = (0 0 0) to (12.8152 12.8152 32.0379) + 1 by 1 by 4 MPI processor grid +region particles block 0 8.0 0 8.0 0 20.0 +create_atoms 1 region particles +Created 5120 atoms +pair_coeff 1 1 1.0 1.0 2.5 +mass 1 1.0 +change_box all z final 0.0 34 remap units box + orthogonal box = (0 0 0) to (12.8152 12.8152 34) + +# select particles in one side of the elongated box +region left plane 0 0 10 0 0 1 +group left region left +2688 atoms in group left + +velocity left create 6.0 1 mom yes rot yes + +# simulation parameters +neighbor 0.6 bin +timestep 0.004 +run_style verlet +fix ensemble left nve # Note: only move particle in left-hand side +fix langevin left langevin 3.0 0.8 100.0 2017 + +# outout +thermo_style custom step temp pzz pe lz +thermo 100 +# dump dumpXYZ all xyz 100 traj.xyz + +# run reduced for demonstration purposes +# run 10000 +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.1 + ghost atom cutoff = 3.1 + binsize = 1.55, bins = 9 9 22 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.23 | 3.23 | 3.23 Mbytes +Step Temp Pzz PotEng Lz + 0 3.1494433 -3.4735106 -6.8707307 34 + 100 1.7914373 6.4805818 -4.8420353 34 + 200 1.740256 6.6108149 -4.7672571 34 + 300 1.7663827 6.5188941 -4.8103672 34 + 400 1.7440644 6.5156543 -4.7769467 34 + 500 1.7471724 6.5208992 -4.7843928 34 + 600 1.7320106 6.6557835 -4.7654637 34 + 700 1.6839043 6.7689759 -4.7045352 34 + 800 1.7216746 6.66436 -4.7601673 34 + 900 1.7342542 6.3242367 -4.7790803 34 + 1000 1.7338566 6.5803438 -4.7854529 34 + 1100 1.7328856 6.3846366 -4.7902625 34 + 1200 1.7546906 6.5048137 -4.8213443 34 + 1300 1.7163891 6.3903221 -4.7665145 34 + 1400 1.7011627 6.5782672 -4.7517875 34 + 1500 1.7105234 6.5811813 -4.7677748 34 + 1600 1.7334403 6.5032837 -4.8067749 34 + 1700 1.7252102 6.5443871 -4.8058994 34 + 1800 1.721958 6.3378188 -4.8150073 34 + 1900 1.6797892 6.6780506 -4.7538618 34 + 2000 1.7001774 6.3578192 -4.7894018 34 + 2100 1.7127784 6.3219105 -4.8161059 34 + 2200 1.696825 6.536793 -4.7946902 34 + 2300 1.6704578 6.7186933 -4.7609628 34 + 2400 1.6772498 6.3432817 -4.7778471 34 + 2500 1.7073862 6.2153226 -4.8299181 34 + 2600 1.6951557 6.4397257 -4.8156787 34 + 2700 1.6845984 6.0123544 -4.8136864 34 + 2800 1.6550565 6.2489392 -4.7829639 34 + 2900 1.6892315 6.158499 -4.8423004 34 + 3000 1.6814436 6.07976 -4.8400696 34 + 3100 1.6387025 6.330166 -4.7878978 34 + 3200 1.6747855 6.0767043 -4.8481995 34 + 3300 1.6508768 6.2749233 -4.8181888 34 + 3400 1.6426364 6.3934935 -4.8223824 34 + 3500 1.6576512 6.0638185 -4.8559078 34 + 3600 1.6444173 6.1376573 -4.8463113 34 + 3700 1.6480039 5.9943705 -4.8601776 34 + 3800 1.6467212 6.0556591 -4.8722719 34 + 3900 1.6271804 6.116738 -4.8547278 34 + 4000 1.6158134 5.9089534 -4.8477829 34 + 4100 1.6388157 5.9890465 -4.8920284 34 + 4200 1.6182368 6.0639887 -4.8724963 34 + 4300 1.647633 5.6333906 -4.9267536 34 + 4400 1.5856411 6.2675475 -4.8471239 34 + 4500 1.5773417 6.1789163 -4.8469057 34 + 4600 1.6181445 5.7988068 -4.922419 34 + 4700 1.5876712 5.7398111 -4.8853849 34 + 4800 1.5708353 6.2204997 -4.8718872 34 + 4900 1.5514708 5.9782256 -4.8523812 34 + 5000 1.553347 5.9286523 -4.86582 34 +Loop time of 8.10259 on 4 procs for 5000 steps with 5120 atoms + +Performance: 213265.164 tau/day, 617.087 timesteps/s +99.2% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.2964 | 5.6236 | 5.8982 | 9.0 | 69.40 +Neigh | 1.0562 | 1.1907 | 1.3257 | 8.7 | 14.70 +Comm | 0.43963 | 0.98786 | 1.5968 | 42.5 | 12.19 +Output | 0.0023124 | 0.004741 | 0.0090873 | 4.0 | 0.06 +Modify | 0.018652 | 0.22213 | 0.39884 | 36.4 | 2.74 +Other | | 0.07357 | | | 0.91 + +Nlocal: 1280 ave 1337 max 1211 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Nghost: 3416.25 ave 3549 max 3297 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 74269.8 ave 77932 max 69612 min +Histogram: 1 0 0 0 0 1 0 1 0 1 + +Total # of neighbors = 297079 +Ave neighs/atom = 58.0232 +Neighbor list builds = 474 +Dangerous builds = 247 +write_data data.halfhalf +Total wall time: 0:00:08 diff --git a/examples/USER/misc/temper_npt/data.peptide b/examples/USER/misc/temper_npt/data.peptide new file mode 100644 index 0000000000..f9dfb6e485 --- /dev/null +++ b/examples/USER/misc/temper_npt/data.peptide @@ -0,0 +1,6531 @@ +LAMMPS Description + + 2004 atoms + 1365 bonds + 786 angles + 207 dihedrals + 12 impropers + + 14 atom types + 18 bond types + 31 angle types + 21 dihedral types + 2 improper types + + 36.840194 64.211560 xlo xhi + 41.013691 68.385058 ylo yhi + 29.768095 57.139462 zlo zhi + +Masses + + 1 12.0110 + 2 12.0110 + 3 15.9990 + 4 1.0080 + 5 14.0070 + 6 12.0110 + 7 12.0110 + 8 12.0110 + 9 15.9990 + 10 1.0080 + 11 1.0080 + 12 32.0660 + 13 16.0000 + 14 1.0100 + +Pair Coeffs + + 1 0.110000 3.563595 0.110000 3.563595 + 2 0.080000 3.670503 0.010000 3.385415 + 3 0.120000 3.029056 0.120000 2.494516 + 4 0.022000 2.351973 0.022000 2.351973 + 5 0.200000 3.296325 0.200000 2.761786 + 6 0.020000 4.053589 0.010000 3.385415 + 7 0.055000 3.875410 0.010000 3.385415 + 8 0.070000 3.550053 0.070000 3.550053 + 9 0.152100 3.153782 0.152100 3.153782 + 10 0.046000 0.400014 0.046000 0.400014 + 11 0.030000 2.420037 0.030000 2.420037 + 12 0.450000 3.563595 0.450000 3.563595 + 13 0.152100 3.150570 0.152100 3.150570 + 14 0.046000 0.400014 0.046000 0.400014 + +Bond Coeffs + + 1 249.999999 1.490000 + 2 620.000001 1.230000 + 3 370.000000 1.345000 + 4 322.000001 1.111000 + 5 319.999999 1.430000 + 6 440.000000 0.997000 + 7 222.500001 1.538000 + 8 330.000001 1.080000 + 9 230.000000 1.490000 + 10 309.000001 1.111000 + 11 305.000000 1.375000 + 12 340.000001 1.080000 + 13 334.300000 1.411000 + 14 545.000001 0.960000 + 15 222.500001 1.530000 + 16 198.000000 1.818000 + 17 239.999999 1.816000 + 18 450.000000 0.957200 + +Angle Coeffs + + 1 33.000000 109.500000 30.000000 2.163000 + 2 50.000000 120.000000 0.000000 0.000000 + 3 34.000000 123.000000 0.000000 0.000000 + 4 80.000000 121.000000 0.000000 0.000000 + 5 80.000000 116.500000 0.000000 0.000000 + 6 80.000000 122.500000 0.000000 0.000000 + 7 35.500000 108.400000 5.400000 1.802000 + 8 50.000000 107.000000 0.000000 0.000000 + 9 70.000000 113.500000 0.000000 0.000000 + 10 48.000000 108.000000 0.000000 0.000000 + 11 35.000000 117.000000 0.000000 0.000000 + 12 51.800000 107.500000 0.000000 0.000000 + 13 33.430000 110.100000 22.530000 2.179000 + 14 52.000000 108.000000 0.000000 0.000000 + 15 50.000000 109.500000 0.000000 0.000000 + 16 35.000000 111.000000 0.000000 0.000000 + 17 45.800000 122.300000 0.000000 0.000000 + 18 49.300000 107.500000 0.000000 0.000000 + 19 40.000000 120.000000 35.000000 2.416200 + 20 30.000000 120.000000 22.000000 2.152500 + 21 45.200000 120.000000 0.000000 0.000000 + 22 65.000000 108.000000 0.000000 0.000000 + 23 35.500000 109.000000 5.400000 1.802000 + 24 36.000000 115.000000 0.000000 0.000000 + 25 58.350000 113.500000 11.160000 2.561000 + 26 58.000000 114.500000 0.000000 0.000000 + 27 26.500000 110.100000 22.530000 2.179000 + 28 34.000000 95.000000 0.000000 0.000000 + 29 46.100000 111.300000 0.000000 0.000000 + 30 51.500000 109.500000 0.000000 0.000000 + 31 55.000000 104.520000 0.000000 0.000000 + +Dihedral Coeffs + + 1 0.200000 1 180 1.000000 + 2 1.800000 1 0 1.000000 + 3 0.000000 1 0 1.000000 + 4 1.600000 1 0 0.500000 + 5 2.500000 2 180 0.500000 + 6 2.500000 2 180 1.000000 + 7 0.600000 1 0 1.000000 + 8 0.200000 3 0 1.000000 + 9 0.230000 2 180 1.000000 + 10 0.040000 3 0 1.000000 + 11 1.400000 1 0 1.000000 + 12 3.100000 2 180 1.000000 + 13 4.200000 2 180 1.000000 + 14 3.100000 2 180 0.500000 + 15 0.990000 2 180 1.000000 + 16 2.400000 2 180 1.000000 + 17 0.195000 3 0 1.000000 + 18 0.240000 1 180 0.500000 + 19 0.370000 3 0 0.500000 + 20 0.280000 3 0 1.000000 + 21 0.010000 3 0 1.000000 + +Improper Coeffs + + 1 120.000000 0.000000 + 2 20.000000 0.000000 + +Atoms + + 1 1 1 0.510 43.99993 58.52678 36.78550 0 0 0 + 2 1 2 -0.270 45.10395 58.23499 35.86693 0 0 0 + 3 1 3 -0.510 43.81519 59.54928 37.43995 0 0 0 + 4 1 4 0.090 45.71714 57.34797 36.13434 0 0 0 + 5 1 4 0.090 45.72261 59.13657 35.67007 0 0 0 + 6 1 4 0.090 44.66624 58.09539 34.85538 0 0 0 + 7 1 5 -0.470 43.28193 57.47427 36.91953 0 0 0 + 8 1 6 0.070 42.07157 57.45486 37.62418 0 0 0 + 9 1 1 0.510 42.19985 57.57789 39.12163 0 0 0 + 10 1 3 -0.510 41.88641 58.62251 39.70398 0 0 0 + 11 1 7 -0.180 41.25052 56.15304 37.41811 0 0 0 + 12 1 8 0.000 40.88511 55.94638 35.97460 0 0 0 + 13 1 8 -0.115 41.48305 54.96372 35.11223 0 0 0 + 14 1 8 -0.115 39.74003 56.60996 35.46443 0 0 0 + 15 1 8 -0.115 41.02111 54.75715 33.80764 0 0 0 + 16 1 8 -0.115 39.26180 56.39194 34.12024 0 0 0 + 17 1 8 0.110 39.92330 55.46092 33.27135 0 0 0 + 18 1 9 -0.540 39.48164 55.22919 31.91865 0 0 0 + 19 1 10 0.310 43.60633 56.61693 36.52744 0 0 0 + 20 1 4 0.090 41.49619 58.31145 37.30543 0 0 0 + 21 1 4 0.090 41.88498 55.29476 37.72657 0 0 0 + 22 1 4 0.090 40.30899 56.19690 38.00627 0 0 0 + 23 1 11 0.115 42.31528 54.36176 35.44606 0 0 0 + 24 1 11 0.115 39.26330 57.31216 36.13230 0 0 0 + 25 1 11 0.115 41.62695 54.10606 33.19490 0 0 0 + 26 1 11 0.115 38.42147 56.98236 33.78612 0 0 0 + 27 1 10 0.430 38.78233 55.86217 31.74004 0 0 0 + 28 1 5 -0.470 42.79933 56.56370 39.79000 0 0 0 + 29 1 7 -0.020 42.96709 56.75379 41.28116 0 0 0 + 30 1 1 0.510 43.83019 55.68988 41.92255 0 0 0 + 31 1 3 -0.510 44.98521 55.93104 42.21713 0 0 0 + 32 1 10 0.310 43.13466 55.75696 39.30966 0 0 0 + 33 1 4 0.090 42.04692 56.86721 41.83507 0 0 0 + 34 1 4 0.090 43.52938 57.66324 41.43329 0 0 0 + 35 1 5 -0.470 43.26792 54.43342 42.07043 0 0 0 + 36 1 7 -0.020 43.92411 53.28930 42.63327 0 0 0 + 37 1 1 0.510 43.51012 53.02289 44.10510 0 0 0 + 38 1 3 -0.510 42.35086 53.07863 44.50806 0 0 0 + 39 1 10 0.310 42.28859 54.34993 41.90323 0 0 0 + 40 1 4 0.090 44.98464 53.47473 42.54797 0 0 0 + 41 1 4 0.090 43.49715 52.54787 41.97419 0 0 0 + 42 1 5 -0.470 44.51925 52.64535 44.88133 0 0 0 + 43 1 6 0.070 44.47588 52.35054 46.24397 0 0 0 + 44 1 1 0.510 45.40218 53.34579 46.94730 0 0 0 + 45 1 3 -0.510 45.23520 54.55893 46.92038 0 0 0 + 46 1 7 -0.180 44.77960 50.82831 46.50232 0 0 0 + 47 1 8 0.000 43.72184 49.84551 45.98093 0 0 0 + 48 1 8 -0.115 44.14810 49.00477 44.97195 0 0 0 + 49 1 8 -0.115 42.43499 49.66652 46.53541 0 0 0 + 50 1 8 -0.115 43.26154 48.00434 44.46769 0 0 0 + 51 1 8 -0.115 41.54732 48.79670 45.95416 0 0 0 + 52 1 8 -0.115 41.98220 47.90746 44.95574 0 0 0 + 53 1 10 0.310 45.39510 52.50937 44.42482 0 0 0 + 54 1 4 0.090 43.51312 52.58974 46.67092 0 0 0 + 55 1 4 0.090 44.89709 50.54313 47.56965 0 0 0 + 56 1 4 0.090 45.72096 50.49337 46.01654 0 0 0 + 57 1 11 0.115 45.13573 49.07933 44.54134 0 0 0 + 58 1 11 0.115 42.07869 50.34816 47.29358 0 0 0 + 59 1 11 0.115 43.47793 47.29281 43.68456 0 0 0 + 60 1 11 0.115 40.52625 48.76134 46.30425 0 0 0 + 61 1 11 0.115 41.35446 47.13287 44.54059 0 0 0 + 62 1 5 -0.470 46.41448 52.86278 47.68291 0 0 0 + 63 1 6 0.070 47.25136 53.68184 48.51163 0 0 0 + 64 1 1 0.510 48.33905 54.40097 47.73886 0 0 0 + 65 1 3 -0.510 49.27132 53.85220 47.16549 0 0 0 + 66 1 7 -0.180 47.88329 52.75681 49.60227 0 0 0 + 67 1 7 -0.140 48.82515 53.51102 50.61578 0 0 0 + 68 1 12 -0.090 48.12492 55.00373 51.43039 0 0 0 + 69 1 2 -0.220 47.70783 54.12980 53.04072 0 0 0 + 70 1 10 0.310 46.67199 51.90088 47.73231 0 0 0 + 71 1 4 0.090 46.64593 54.43552 48.99310 0 0 0 + 72 1 4 0.090 48.41361 51.90817 49.11968 0 0 0 + 73 1 4 0.090 47.08748 52.35196 50.26341 0 0 0 + 74 1 4 0.090 49.16067 52.81305 51.41238 0 0 0 + 75 1 4 0.090 49.73705 53.67062 50.00155 0 0 0 + 76 1 4 0.090 47.18593 54.84215 53.71488 0 0 0 + 77 1 4 0.090 48.69939 53.91624 53.49408 0 0 0 + 78 1 4 0.090 47.19749 53.18294 52.76264 0 0 0 + 79 1 5 -0.470 48.34472 55.71775 47.80498 0 0 0 + 80 1 2 -0.110 49.37792 56.51754 47.29492 0 0 0 + 81 1 10 0.310 47.51777 56.11617 48.19410 0 0 0 + 82 1 4 0.090 50.41495 56.13038 47.38980 0 0 0 + 83 1 4 0.090 49.23515 57.51193 47.76940 0 0 0 + 84 1 4 0.090 49.28612 56.52094 46.18773 0 0 0 + 85 2 13 -0.834 52.28049 45.72878 41.48140 -1 0 1 + 86 2 14 0.417 51.97210 46.07066 40.64218 -1 0 1 + 87 2 14 0.417 52.43689 44.79855 41.31868 -1 0 1 + 88 3 13 -0.834 43.84472 45.66062 47.17660 -2 -1 -1 + 89 3 14 0.417 43.42120 44.88337 46.81226 -2 -1 -1 + 90 3 14 0.417 44.31099 46.04907 46.43636 -2 -1 -1 + 91 4 13 -0.834 51.27805 50.25403 54.67397 0 0 -1 + 92 4 14 0.417 50.81295 50.23728 53.83753 0 0 -1 + 93 4 14 0.417 52.00273 49.63953 54.55795 0 0 -1 + 94 5 13 -0.834 44.71976 53.72011 56.43834 -1 0 -1 + 95 5 14 0.417 44.56050 53.84218 55.50241 -1 0 -1 + 96 5 14 0.417 44.91937 52.78829 56.52828 -1 0 -1 + 97 6 13 -0.834 37.07074 62.07204 53.35752 -1 -1 -1 + 98 6 14 0.417 64.17057 61.77089 52.49043 -2 -1 -1 + 99 6 14 0.417 37.90147 62.52273 53.20573 -1 -1 -1 + 100 7 13 -0.834 38.31817 66.10834 49.17406 0 -1 0 + 101 7 14 0.417 37.39300 65.93985 48.99534 0 -1 0 + 102 7 14 0.417 38.36506 66.20528 50.12520 0 -1 0 + 103 8 13 -0.834 60.90915 45.97690 35.53863 -1 -1 1 + 104 8 14 0.417 61.19898 46.87819 35.39745 -1 -1 1 + 105 8 14 0.417 59.98680 45.97855 35.28269 -1 -1 1 + 106 9 13 -0.834 54.33913 64.47210 51.00391 -1 -2 0 + 107 9 14 0.417 54.43191 63.71377 50.42724 -1 -2 0 + 108 9 14 0.417 55.16289 64.94980 50.90662 -1 -2 0 + 109 10 13 -0.834 44.58017 54.03749 53.84708 1 0 -1 + 110 10 14 0.417 43.87040 54.43768 53.34476 1 0 -1 + 111 10 14 0.417 45.02999 53.47261 53.21873 1 0 -1 + 112 11 13 -0.834 45.48693 52.12363 34.38241 0 -1 1 + 113 11 14 0.417 45.46898 52.67450 33.59981 0 -1 1 + 114 11 14 0.417 44.61476 52.22113 34.76457 0 -1 1 + 115 12 13 -0.834 60.15770 61.68799 54.74753 1 0 -2 + 116 12 14 0.417 59.23977 61.46439 54.59378 1 0 -2 + 117 12 14 0.417 60.43785 61.08922 55.43980 1 0 -2 + 118 13 13 -0.834 60.74732 66.72156 42.80906 1 -2 0 + 119 13 14 0.417 60.34713 66.21969 42.09898 1 -2 0 + 120 13 14 0.417 60.92444 66.07344 43.49082 1 -2 0 + 121 14 13 -0.834 60.82245 64.17281 50.54212 0 0 0 + 122 14 14 0.417 61.43571 64.88448 50.35863 0 0 0 + 123 14 14 0.417 60.87804 64.04633 51.48930 0 0 0 + 124 15 13 -0.834 36.92704 63.01353 56.05215 0 -1 0 + 125 15 14 0.417 37.10744 62.17054 56.46815 0 -1 0 + 126 15 14 0.417 64.06237 62.79109 55.15157 -1 -1 0 + 127 16 13 -0.834 48.35559 58.70568 56.14001 1 0 0 + 128 16 14 0.417 48.11655 59.48087 55.63191 1 0 0 + 129 16 14 0.417 47.93212 58.83502 56.98865 1 0 0 + 130 17 13 -0.834 58.14651 57.18542 51.08241 0 -1 -1 + 131 17 14 0.417 57.88523 56.72609 51.88052 0 -1 -1 + 132 17 14 0.417 57.35121 57.63116 50.79076 0 -1 -1 + 133 18 13 -0.834 58.09837 59.68005 36.16995 -1 0 0 + 134 18 14 0.417 58.25901 58.76822 36.41283 -1 0 0 + 135 18 14 0.417 58.56239 60.19049 36.83355 -1 0 0 + 136 19 13 -0.834 52.29019 60.51169 50.55611 0 -2 1 + 137 19 14 0.417 52.61972 60.01708 51.30645 0 -2 1 + 138 19 14 0.417 52.55621 59.99722 49.79401 0 -2 1 + 139 20 13 -0.834 41.36642 50.33705 42.98530 0 -1 -1 + 140 20 14 0.417 41.27846 50.09969 43.90844 0 -1 -1 + 141 20 14 0.417 40.99321 51.21659 42.92708 0 -1 -1 + 142 21 13 -0.834 53.76920 67.02645 32.18667 -1 0 1 + 143 21 14 0.417 53.59447 67.18509 31.25901 -1 0 1 + 144 21 14 0.417 54.65308 67.36647 32.32596 -1 0 1 + 145 22 13 -0.834 57.83691 45.33663 46.94671 0 0 -2 + 146 22 14 0.417 57.36287 45.59552 46.15647 0 0 -2 + 147 22 14 0.417 58.62995 44.91017 46.62197 0 0 -2 + 148 23 13 -0.834 60.34518 45.83000 45.57964 -1 0 0 + 149 23 14 0.417 60.61871 44.93757 45.79176 -1 0 0 + 150 23 14 0.417 61.09971 46.21212 45.13141 -1 0 0 + 151 24 13 -0.834 55.97902 46.85046 56.80163 0 1 1 + 152 24 14 0.417 56.57528 46.69952 30.16370 0 1 2 + 153 24 14 0.417 55.81156 47.79276 56.81850 0 1 1 + 154 25 13 -0.834 57.54668 45.52135 31.46139 -1 0 1 + 155 25 14 0.417 58.36291 46.00311 31.32743 -1 0 1 + 156 25 14 0.417 57.54151 45.31312 32.39566 -1 0 1 + 157 26 13 -0.834 58.03029 52.86783 46.33564 -1 -1 0 + 158 26 14 0.417 58.13662 52.56730 47.23820 -1 -1 0 + 159 26 14 0.417 58.81317 52.55269 45.88396 -1 -1 0 + 160 27 13 -0.834 62.89253 60.86549 46.75131 -2 -1 0 + 161 27 14 0.417 63.83924 60.74010 46.81653 -2 -1 0 + 162 27 14 0.417 62.51896 60.12788 47.23361 -2 -1 0 + 163 28 13 -0.834 43.29171 48.58106 31.82206 -1 0 2 + 164 28 14 0.417 43.07532 49.46362 32.12290 -1 0 2 + 165 28 14 0.417 43.82286 48.21072 32.52701 -1 0 2 + 166 29 13 -0.834 64.19867 44.17673 45.81391 -1 1 -1 + 167 29 14 0.417 63.72986 44.44010 45.02202 -1 1 -1 + 168 29 14 0.417 37.02069 43.24876 45.68087 0 1 -1 + 169 30 13 -0.834 50.42749 42.01163 53.60484 0 2 0 + 170 30 14 0.417 51.03177 41.90084 52.87081 0 2 0 + 171 30 14 0.417 50.77279 42.76181 54.08882 0 2 0 + 172 31 13 -0.834 38.63739 61.71113 49.95150 1 0 0 + 173 31 14 0.417 38.55432 62.15607 49.10808 1 0 0 + 174 31 14 0.417 37.81718 61.22751 50.04950 1 0 0 + 175 32 13 -0.834 61.47262 53.02922 33.08309 -1 -1 0 + 176 32 14 0.417 61.21894 52.67931 33.93717 -1 -1 0 + 177 32 14 0.417 61.89351 53.86564 33.28182 -1 -1 0 + 178 33 13 -0.834 54.44545 60.06011 48.63522 -1 0 1 + 179 33 14 0.417 54.80032 60.94424 48.72810 -1 0 1 + 180 33 14 0.417 54.09041 60.03614 47.74662 -1 0 1 + 181 34 13 -0.834 56.34364 60.90201 52.60838 -1 -1 0 + 182 34 14 0.417 56.48857 60.19161 53.23333 -1 -1 0 + 183 34 14 0.417 56.17362 61.67024 53.15351 -1 -1 0 + 184 35 13 -0.834 56.05881 51.84328 55.76103 -1 0 0 + 185 35 14 0.417 55.59060 51.75146 54.93121 -1 0 0 + 186 35 14 0.417 55.46974 52.35732 56.31335 -1 0 0 + 187 36 13 -0.834 39.00621 42.74743 30.97845 0 0 1 + 188 36 14 0.417 39.67620 42.11390 30.72152 0 0 1 + 189 36 14 0.417 39.43456 43.29673 31.63499 0 0 1 + 190 37 13 -0.834 46.77585 55.39774 30.24026 0 1 0 + 191 37 14 0.417 46.10274 54.90237 29.77360 0 1 0 + 192 37 14 0.417 46.39626 56.26890 30.35527 0 1 0 + 193 38 13 -0.834 45.10722 57.60431 31.54688 -1 0 0 + 194 38 14 0.417 44.80783 58.50032 31.70105 -1 0 0 + 195 38 14 0.417 44.44237 57.22463 30.97238 -1 0 0 + 196 39 13 -0.834 43.94230 46.99244 34.45668 -2 1 1 + 197 39 14 0.417 44.62010 46.49140 34.00306 -2 1 1 + 198 39 14 0.417 44.38150 47.79794 34.72964 -2 1 1 + 199 40 13 -0.834 51.39443 50.96507 34.69072 -1 1 0 + 200 40 14 0.417 51.18729 50.42829 35.45570 -1 1 0 + 201 40 14 0.417 51.33198 51.86665 35.00616 -1 1 0 + 202 41 13 -0.834 58.96398 48.19727 42.98856 -2 1 0 + 203 41 14 0.417 58.42587 48.90112 42.62618 -2 1 0 + 204 41 14 0.417 58.82383 48.25054 43.93397 -2 1 0 + 205 42 13 -0.834 62.89335 41.94260 37.40820 0 0 0 + 206 42 14 0.417 62.48690 41.07818 37.46980 0 0 0 + 207 42 14 0.417 63.01802 42.08284 36.46957 0 0 0 + 208 43 13 -0.834 54.19388 47.88689 36.24110 -1 0 1 + 209 43 14 0.417 54.32054 48.63090 35.65235 -1 0 1 + 210 43 14 0.417 53.24370 47.78935 36.30358 -1 0 1 + 211 44 13 -0.834 39.19734 57.40342 41.28495 0 0 -2 + 212 44 14 0.417 39.05428 57.72940 40.39641 0 0 -2 + 213 44 14 0.417 39.30846 56.45861 41.17895 0 0 -2 + 214 45 13 -0.834 52.85483 61.73749 54.63897 0 0 0 + 215 45 14 0.417 53.34938 62.52765 54.42147 0 0 0 + 216 45 14 0.417 53.01046 61.14656 53.90221 0 0 0 + 217 46 13 -0.834 47.09467 62.01384 35.02302 1 0 1 + 218 46 14 0.417 47.54527 61.47644 35.67448 1 0 1 + 219 46 14 0.417 47.10116 62.89626 35.39385 1 0 1 + 220 47 13 -0.834 46.80497 49.60334 37.05700 0 0 1 + 221 47 14 0.417 46.70216 49.79770 36.12540 0 0 1 + 222 47 14 0.417 45.91311 49.45393 37.37084 0 0 1 + 223 48 13 -0.834 63.21969 59.12311 54.43455 -1 -1 -1 + 224 48 14 0.417 63.94585 59.72833 54.28405 -1 -1 -1 + 225 48 14 0.417 63.63016 58.34481 54.81141 -1 -1 -1 + 226 49 13 -0.834 59.88416 59.64215 44.04914 -2 1 0 + 227 49 14 0.417 59.74255 59.14412 44.85422 -2 1 0 + 228 49 14 0.417 59.02635 60.01323 43.84248 -2 1 0 + 229 50 13 -0.834 40.50825 42.85328 50.81112 -1 1 0 + 230 50 14 0.417 40.34650 43.39801 51.58141 -1 1 0 + 231 50 14 0.417 39.63964 42.69867 50.43985 -1 1 0 + 232 51 13 -0.834 63.77522 64.97067 44.83010 -2 0 0 + 233 51 14 0.417 37.00507 65.56132 45.28388 -1 0 0 + 234 51 14 0.417 64.14243 64.88383 43.95041 -2 0 0 + 235 52 13 -0.834 62.47161 67.86189 47.38235 -1 0 -1 + 236 52 14 0.417 61.58819 67.64608 47.08360 -1 0 -1 + 237 52 14 0.417 62.79136 67.05596 47.78790 -1 0 -1 + 238 53 13 -0.834 43.90800 54.16107 50.35199 0 0 0 + 239 53 14 0.417 43.96769 53.24711 50.07388 0 0 0 + 240 53 14 0.417 43.72593 54.64554 49.54677 0 0 0 + 241 54 13 -0.834 63.46829 44.63390 34.73615 -1 1 1 + 242 54 14 0.417 62.63731 45.04623 34.97217 -1 1 1 + 243 54 14 0.417 64.11050 45.03645 35.32075 -1 1 1 + 244 55 13 -0.834 37.30679 58.22047 51.04345 0 0 0 + 245 55 14 0.417 38.18596 58.37862 50.69950 0 0 0 + 246 55 14 0.417 36.85723 59.06017 50.94824 0 0 0 + 247 56 13 -0.834 58.72649 42.45768 31.23820 -1 1 -1 + 248 56 14 0.417 59.43634 42.77561 30.68028 -1 1 -1 + 249 56 14 0.417 58.76581 41.50474 31.15690 -1 1 -1 + 250 57 13 -0.834 52.47101 42.85691 41.60986 0 1 -1 + 251 57 14 0.417 51.62289 42.91562 41.16997 0 1 -1 + 252 57 14 0.417 52.53109 41.94497 41.89448 0 1 -1 + 253 58 13 -0.834 60.63476 59.78356 56.53663 -2 -1 -1 + 254 58 14 0.417 60.87428 58.86269 56.43247 -2 -1 -1 + 255 58 14 0.417 59.72615 59.76269 56.83705 -2 -1 -1 + 256 59 13 -0.834 52.78127 57.47386 30.66786 -1 -1 0 + 257 59 14 0.417 52.55495 58.26092 30.17228 -1 -1 0 + 258 59 14 0.417 53.05203 56.84104 30.00267 -1 -1 0 + 259 60 13 -0.834 46.04848 57.65321 54.89998 0 3 -1 + 260 60 14 0.417 46.96883 57.71336 55.15607 0 3 -1 + 261 60 14 0.417 46.02768 57.98076 54.00081 0 3 -1 + 262 61 13 -0.834 60.39356 51.43705 35.66109 -1 1 -1 + 263 61 14 0.417 60.57739 52.08235 36.34376 -1 1 -1 + 264 61 14 0.417 59.59475 50.99860 35.95414 -1 1 -1 + 265 62 13 -0.834 50.32338 62.46972 35.65752 -1 0 2 + 266 62 14 0.417 51.24156 62.23287 35.52678 -1 0 2 + 267 62 14 0.417 49.89601 61.64851 35.90085 -1 0 2 + 268 63 13 -0.834 38.23983 45.11908 50.02773 0 1 0 + 269 63 14 0.417 38.61336 45.27494 50.89515 0 1 0 + 270 63 14 0.417 38.91224 45.42406 49.41856 0 1 0 + 271 64 13 -0.834 58.93720 57.36605 46.08362 -3 0 0 + 272 64 14 0.417 58.65753 56.63297 46.63190 -3 0 0 + 273 64 14 0.417 58.29914 58.05674 46.26268 -3 0 0 + 274 65 13 -0.834 47.99806 43.44789 47.43046 -1 0 0 + 275 65 14 0.417 48.39580 43.78289 46.62684 -1 0 0 + 276 65 14 0.417 47.85848 44.22523 47.97128 -1 0 0 + 277 66 13 -0.834 51.26744 52.05593 47.09995 -1 0 0 + 278 66 14 0.417 51.36736 52.09873 46.14894 -1 0 0 + 279 66 14 0.417 50.33779 52.22629 47.25149 -1 0 0 + 280 67 13 -0.834 39.06132 52.11517 46.39010 0 0 -1 + 281 67 14 0.417 38.53402 51.36282 46.65876 0 0 -1 + 282 67 14 0.417 39.47133 52.42190 47.19884 0 0 -1 + 283 68 13 -0.834 60.17907 58.95174 50.22759 -1 1 0 + 284 68 14 0.417 60.34080 59.56538 50.94420 -1 1 0 + 285 68 14 0.417 59.41497 58.44908 50.50992 -1 1 0 + 286 69 13 -0.834 40.47698 59.65154 34.92537 0 -1 1 + 287 69 14 0.417 40.89044 60.49055 35.12877 0 -1 1 + 288 69 14 0.417 41.17964 59.12336 34.54648 0 -1 1 + 289 70 13 -0.834 60.12998 66.51474 47.03971 -1 0 -1 + 290 70 14 0.417 59.26620 66.39701 47.43506 -1 0 -1 + 291 70 14 0.417 60.21358 65.78625 46.42443 -1 0 -1 + 292 71 13 -0.834 49.25986 47.27506 43.03372 -1 0 1 + 293 71 14 0.417 49.11810 48.15331 42.68041 -1 0 1 + 294 71 14 0.417 49.86162 47.40550 43.76662 -1 0 1 + 295 72 13 -0.834 41.48105 63.65699 31.84433 0 0 1 + 296 72 14 0.417 41.11022 64.48589 32.14713 0 0 1 + 297 72 14 0.417 40.89461 63.37379 31.14281 0 0 1 + 298 73 13 -0.834 47.82875 47.97039 54.56720 0 2 0 + 299 73 14 0.417 46.99167 47.50633 54.55352 0 2 0 + 300 73 14 0.417 47.60488 48.87558 54.35102 0 2 0 + 301 74 13 -0.834 62.36735 58.64445 48.35778 -2 1 0 + 302 74 14 0.417 62.88767 57.90867 48.68045 -2 1 0 + 303 74 14 0.417 61.65918 58.73544 48.99531 -2 1 0 + 304 75 13 -0.834 52.09508 65.08907 32.87560 0 0 0 + 305 75 14 0.417 52.67402 65.75058 32.49683 0 0 0 + 306 75 14 0.417 52.41855 64.97003 33.76859 0 0 0 + 307 76 13 -0.834 39.06932 41.62988 40.69498 1 1 0 + 308 76 14 0.417 39.51114 41.04433 40.08003 1 1 0 + 309 76 14 0.417 38.93584 42.43936 40.20186 1 1 0 + 310 77 13 -0.834 37.68325 49.50718 46.00750 0 2 0 + 311 77 14 0.417 64.11601 49.67107 45.91568 -1 2 0 + 312 77 14 0.417 37.90845 48.96991 45.24796 0 2 0 + 313 78 13 -0.834 53.00757 59.49351 52.98404 -2 1 -1 + 314 78 14 0.417 52.16721 59.28329 53.39127 -2 1 -1 + 315 78 14 0.417 53.61000 58.83023 53.32076 -2 1 -1 + 316 79 13 -0.834 51.89369 64.75001 56.68467 1 0 0 + 317 79 14 0.417 51.88079 65.63682 56.32462 1 0 0 + 318 79 14 0.417 52.40589 64.82531 30.11841 1 0 1 + 319 80 13 -0.834 48.43261 63.10155 32.63566 0 0 1 + 320 80 14 0.417 47.68021 63.01753 32.04993 0 0 1 + 321 80 14 0.417 48.13916 62.71424 33.46035 0 0 1 + 322 81 13 -0.834 62.41171 68.18251 30.67168 0 -1 2 + 323 81 14 0.417 61.79235 41.16145 30.03143 0 0 2 + 324 81 14 0.417 63.18314 67.94790 30.15584 0 -1 2 + 325 82 13 -0.834 42.57575 41.32197 37.66791 0 0 1 + 326 82 14 0.417 42.98116 41.36016 36.80164 0 0 1 + 327 82 14 0.417 42.32522 42.22654 37.85569 0 0 1 + 328 83 13 -0.834 50.17315 67.44398 36.91606 0 -2 0 + 329 83 14 0.417 50.08765 67.03449 37.77701 0 -2 0 + 330 83 14 0.417 50.35347 66.71621 36.32101 0 -2 0 + 331 84 13 -0.834 39.70163 60.45247 40.03790 0 -2 -1 + 332 84 14 0.417 38.85282 60.01540 40.10676 0 -2 -1 + 333 84 14 0.417 40.20579 60.11563 40.77858 0 -2 -1 + 334 85 13 -0.834 51.74323 42.80814 51.33239 0 0 -1 + 335 85 14 0.417 52.44810 43.22892 51.82466 0 0 -1 + 336 85 14 0.417 51.80961 43.17998 50.45286 0 0 -1 + 337 86 13 -0.834 51.34695 47.68316 36.38089 0 0 1 + 338 86 14 0.417 50.77701 46.92707 36.52138 0 0 1 + 339 86 14 0.417 51.27109 47.87031 35.44523 0 0 1 + 340 87 13 -0.834 62.66950 50.66085 43.15883 -2 0 0 + 341 87 14 0.417 63.57796 50.36318 43.11051 -2 0 0 + 342 87 14 0.417 62.24654 50.26548 42.39659 -2 0 0 + 343 88 13 -0.834 46.37996 60.13914 31.06428 -2 -1 1 + 344 88 14 0.417 46.89125 59.89673 31.83632 -2 -1 1 + 345 88 14 0.417 45.51811 60.37092 31.41028 -2 -1 1 + 346 89 13 -0.834 50.23251 41.17559 46.18435 0 1 2 + 347 89 14 0.417 49.40509 68.16142 45.89628 0 0 2 + 348 89 14 0.417 50.55747 67.94506 46.85395 0 0 2 + 349 90 13 -0.834 56.10446 66.70018 42.60390 0 -2 1 + 350 90 14 0.417 56.27454 67.42915 42.00732 0 -2 1 + 351 90 14 0.417 56.27819 67.05729 43.47483 0 -2 1 + 352 91 13 -0.834 55.53824 48.43866 51.97225 -1 0 1 + 353 91 14 0.417 56.26440 48.96682 52.30388 -1 0 1 + 354 91 14 0.417 55.26306 48.88494 51.17140 -1 0 1 + 355 92 13 -0.834 37.88016 52.62502 33.55552 0 -1 0 + 356 92 14 0.417 37.58757 51.72397 33.41859 0 -1 0 + 357 92 14 0.417 38.51960 52.77804 32.85986 0 -1 0 + 358 93 13 -0.834 50.40592 66.14455 39.40035 -1 -2 -1 + 359 93 14 0.417 49.74974 66.37168 40.05920 -1 -2 -1 + 360 93 14 0.417 50.22642 65.22843 39.18876 -1 -2 -1 + 361 94 13 -0.834 59.56315 43.63477 50.02876 -1 0 0 + 362 94 14 0.417 60.08533 44.36640 50.35782 -1 0 0 + 363 94 14 0.417 60.10101 42.86112 50.19730 -1 0 0 + 364 95 13 -0.834 57.16125 61.75981 55.17964 0 0 -1 + 365 95 14 0.417 56.45534 61.68609 55.82189 0 0 -1 + 366 95 14 0.417 57.38335 62.69087 55.17297 0 0 -1 + 367 96 13 -0.834 54.81274 43.48714 43.13392 -1 2 1 + 368 96 14 0.417 53.88771 43.40698 42.90124 -1 2 1 + 369 96 14 0.417 54.97915 42.74512 43.71525 -1 2 1 + 370 97 13 -0.834 41.23040 49.49766 49.75568 0 -2 0 + 371 97 14 0.417 40.54278 49.43865 49.09241 0 -2 0 + 372 97 14 0.417 41.81904 48.76959 49.55653 0 -2 0 + 373 98 13 -0.834 54.20957 45.39084 54.97428 -1 0 0 + 374 98 14 0.417 54.66721 46.06623 55.47493 -1 0 0 + 375 98 14 0.417 53.74016 44.87996 55.63374 -1 0 0 + 376 99 13 -0.834 61.27515 64.38553 39.98716 -1 0 1 + 377 99 14 0.417 61.56153 64.23410 40.88787 -1 0 1 + 378 99 14 0.417 60.44736 63.91029 39.91542 -1 0 1 + 379 100 13 -0.834 55.67284 58.14856 42.21767 -1 1 2 + 380 100 14 0.417 55.46369 57.24253 42.44485 -1 1 2 + 381 100 14 0.417 56.62771 58.19397 42.26677 -1 1 2 + 382 101 13 -0.834 43.66528 51.07118 53.71174 0 0 0 + 383 101 14 0.417 42.87715 50.89079 53.19934 0 0 0 + 384 101 14 0.417 43.37793 51.68815 54.38481 0 0 0 + 385 102 13 -0.834 39.90899 44.53973 36.42818 0 2 0 + 386 102 14 0.417 39.84006 43.65427 36.07118 0 2 0 + 387 102 14 0.417 40.52179 44.98683 35.84438 0 2 0 + 388 103 13 -0.834 51.24695 66.96031 48.71611 -1 -1 1 + 389 103 14 0.417 50.88275 67.26607 49.54684 -1 -1 1 + 390 103 14 0.417 52.19366 66.95318 48.85726 -1 -1 1 + 391 104 13 -0.834 55.15911 56.17347 57.08906 -1 0 0 + 392 104 14 0.417 55.86241 55.65189 56.70232 -1 0 0 + 393 104 14 0.417 54.93977 55.71619 30.52949 -1 0 1 + 394 105 13 -0.834 37.33282 54.30424 56.96734 0 0 0 + 395 105 14 0.417 64.15558 54.97773 29.99806 -1 0 1 + 396 105 14 0.417 64.13467 53.88397 56.32293 -1 0 0 + 397 106 13 -0.834 53.07827 51.20543 32.31512 -1 0 1 + 398 106 14 0.417 52.39494 50.78813 31.79057 -1 0 1 + 399 106 14 0.417 52.65819 51.38698 33.15584 -1 0 1 + 400 107 13 -0.834 43.06086 51.65229 35.75926 1 1 1 + 401 107 14 0.417 42.70958 52.01746 36.57135 1 1 1 + 402 107 14 0.417 43.42908 50.80682 36.01586 1 1 1 + 403 108 13 -0.834 53.92253 56.24460 34.48089 0 0 1 + 404 108 14 0.417 53.22007 56.39276 35.11401 0 0 1 + 405 108 14 0.417 54.59075 55.76600 34.97147 0 0 1 + 406 109 13 -0.834 61.71524 66.84153 38.60005 -1 -1 0 + 407 109 14 0.417 61.25397 66.04877 38.87388 -1 -1 0 + 408 109 14 0.417 62.23260 67.09437 39.36467 -1 -1 0 + 409 110 13 -0.834 43.52824 62.78695 41.49939 0 -1 -1 + 410 110 14 0.417 43.61050 61.97218 41.00379 0 -1 -1 + 411 110 14 0.417 43.53140 63.47437 40.83330 0 -1 -1 + 412 111 13 -0.834 51.13822 55.54090 53.50461 0 1 -2 + 413 111 14 0.417 50.69587 56.38179 53.62064 0 1 -2 + 414 111 14 0.417 51.43262 55.54828 52.59383 0 1 -2 + 415 112 13 -0.834 46.94709 50.11761 31.92599 0 0 0 + 416 112 14 0.417 47.19652 51.02564 31.75423 0 0 0 + 417 112 14 0.417 46.57462 49.81059 31.09941 0 0 0 + 418 113 13 -0.834 47.96666 45.13049 44.46108 -1 2 -1 + 419 113 14 0.417 47.01871 45.24108 44.53489 -1 2 -1 + 420 113 14 0.417 48.26343 45.91034 43.99202 -1 2 -1 + 421 114 13 -0.834 44.43868 43.44849 32.90814 -1 -1 1 + 422 114 14 0.417 43.86055 43.24165 33.64245 -1 -1 1 + 423 114 14 0.417 45.31670 43.24154 33.22828 -1 -1 1 + 424 115 13 -0.834 61.07172 47.80130 53.14504 -1 1 -1 + 425 115 14 0.417 61.34864 48.71600 53.19864 -1 1 -1 + 426 115 14 0.417 60.72118 47.60538 54.01394 -1 1 -1 + 427 116 13 -0.834 51.38727 44.10864 54.92855 -1 0 -1 + 428 116 14 0.417 50.77962 44.80360 55.18160 -1 0 -1 + 429 116 14 0.417 52.05111 44.10744 55.61815 -1 0 -1 + 430 117 13 -0.834 41.05585 60.12319 49.44785 1 -1 0 + 431 117 14 0.417 41.72702 60.76812 49.67116 1 -1 0 + 432 117 14 0.417 40.24373 60.62784 49.40265 1 -1 0 + 433 118 13 -0.834 50.88548 68.33364 33.37284 -1 0 -1 + 434 118 14 0.417 50.48275 67.46671 33.32310 -1 0 -1 + 435 118 14 0.417 51.82702 68.16119 33.37343 -1 0 -1 + 436 119 13 -0.834 38.79644 59.29061 55.22446 1 1 -1 + 437 119 14 0.417 38.82887 59.83550 56.01077 1 1 -1 + 438 119 14 0.417 39.26097 59.79985 54.56028 1 1 -1 + 439 120 13 -0.834 56.31813 41.68729 51.11871 -2 0 -1 + 440 120 14 0.417 55.45155 41.35580 51.35412 -2 0 -1 + 441 120 14 0.417 56.14879 42.34135 50.44062 -2 0 -1 + 442 121 13 -0.834 45.53697 59.28154 47.22033 -1 0 -1 + 443 121 14 0.417 45.45062 59.55577 46.30733 -1 0 -1 + 444 121 14 0.417 46.00774 59.99977 47.64313 -1 0 -1 + 445 122 13 -0.834 60.47636 43.28130 46.20944 -1 0 -1 + 446 122 14 0.417 60.97762 42.59184 45.77396 -1 0 -1 + 447 122 14 0.417 59.72992 42.82584 46.59884 -1 0 -1 + 448 123 13 -0.834 58.49080 48.18289 45.77215 0 0 -1 + 449 123 14 0.417 58.74342 47.25991 45.74879 0 0 -1 + 450 123 14 0.417 58.17926 48.32386 46.66621 0 0 -1 + 451 124 13 -0.834 50.93473 56.12663 41.58575 -1 0 0 + 452 124 14 0.417 50.36171 56.05214 42.34885 -1 0 0 + 453 124 14 0.417 50.40135 56.57242 40.92771 -1 0 0 + 454 125 13 -0.834 60.55008 41.95542 56.22749 -1 0 -1 + 455 125 14 0.417 59.65163 41.78987 55.94175 -1 0 -1 + 456 125 14 0.417 61.09463 41.59967 55.52524 -1 0 -1 + 457 126 13 -0.834 58.58373 51.69338 48.78985 -1 1 0 + 458 126 14 0.417 58.38773 52.01803 49.66874 -1 1 0 + 459 126 14 0.417 58.66973 50.74614 48.89756 -1 1 0 + 460 127 13 -0.834 37.82769 45.69808 30.85100 0 1 3 + 461 127 14 0.417 38.37007 45.10637 31.37248 0 1 3 + 462 127 14 0.417 37.14646 45.99401 31.45481 0 1 3 + 463 128 13 -0.834 50.96455 60.06361 33.68049 0 0 0 + 464 128 14 0.417 51.72055 60.15430 34.26055 0 0 0 + 465 128 14 0.417 51.05673 60.77997 33.05234 0 0 0 + 466 129 13 -0.834 46.43413 68.11245 51.48833 -1 0 -1 + 467 129 14 0.417 46.82151 41.36005 50.86943 -1 1 -1 + 468 129 14 0.417 47.09847 67.43153 51.59433 -1 0 -1 + 469 130 13 -0.834 61.79997 47.41648 57.05141 -1 -1 0 + 470 130 14 0.417 62.68713 47.23872 56.73898 -1 -1 0 + 471 130 14 0.417 61.48917 46.57417 30.01195 -1 -1 1 + 472 131 13 -0.834 45.30689 46.58119 54.43763 0 1 -1 + 473 131 14 0.417 45.67282 45.73922 54.70859 0 1 -1 + 474 131 14 0.417 44.46622 46.35973 54.03705 0 1 -1 + 475 132 13 -0.834 62.60829 48.56385 49.02640 -1 1 0 + 476 132 14 0.417 62.44761 48.65968 48.08766 -1 1 0 + 477 132 14 0.417 62.98242 47.68753 49.11762 -1 1 0 + 478 133 13 -0.834 63.49107 56.77075 38.74961 -1 0 2 + 479 133 14 0.417 63.12281 56.39554 39.54952 -1 0 2 + 480 133 14 0.417 62.84612 57.42058 38.47033 -1 0 2 + 481 134 13 -0.834 50.74846 48.34849 33.46075 0 0 1 + 482 134 14 0.417 50.75342 49.30521 33.43086 0 0 1 + 483 134 14 0.417 50.91203 48.07929 32.55686 0 0 1 + 484 135 13 -0.834 44.40923 67.37148 56.42156 0 0 0 + 485 135 14 0.417 43.93400 67.78902 29.76856 0 0 1 + 486 135 14 0.417 44.94884 66.70468 56.84633 0 0 0 + 487 136 13 -0.834 44.25343 64.95349 43.22104 0 0 0 + 488 136 14 0.417 44.13229 64.08173 42.84472 0 0 0 + 489 136 14 0.417 44.01188 65.55470 42.51643 0 0 0 + 490 137 13 -0.834 46.68300 67.52863 32.69859 -1 -1 0 + 491 137 14 0.417 46.68369 68.22637 33.35389 -1 -1 0 + 492 137 14 0.417 47.60248 67.43099 32.45106 -1 -1 0 + 493 138 13 -0.834 57.25376 61.01737 33.86507 -2 1 1 + 494 138 14 0.417 57.40827 60.52366 34.67043 -2 1 1 + 495 138 14 0.417 57.35792 60.37307 33.16488 -2 1 1 + 496 139 13 -0.834 57.39946 54.16835 56.70699 0 -1 -1 + 497 139 14 0.417 57.31939 53.23092 56.53080 0 -1 -1 + 498 139 14 0.417 57.32300 54.24112 30.28699 0 -1 0 + 499 140 13 -0.834 52.36697 48.69246 41.49227 -1 1 0 + 500 140 14 0.417 51.78735 47.93629 41.40021 -1 1 0 + 501 140 14 0.417 53.21603 48.31702 41.72547 -1 1 0 + 502 141 13 -0.834 54.69200 49.57915 45.55048 0 0 -1 + 503 141 14 0.417 54.95958 48.66911 45.42211 0 0 -1 + 504 141 14 0.417 55.28513 50.08439 44.99446 0 0 -1 + 505 142 13 -0.834 37.26724 53.17896 42.50469 1 -1 -1 + 506 142 14 0.417 63.93194 53.34801 43.12782 0 -1 -1 + 507 142 14 0.417 36.94831 52.45044 41.97199 1 -1 -1 + 508 143 13 -0.834 42.56283 66.92379 33.49577 -1 0 1 + 509 143 14 0.417 41.71356 66.58931 33.20750 -1 0 1 + 510 143 14 0.417 43.03645 66.14842 33.79697 -1 0 1 + 511 144 13 -0.834 61.43331 45.62855 38.97695 0 1 1 + 512 144 14 0.417 61.20190 45.98514 39.83458 0 1 1 + 513 144 14 0.417 62.31351 45.96414 38.80708 0 1 1 + 514 145 13 -0.834 49.37935 56.26031 56.72879 1 1 0 + 515 145 14 0.417 49.03977 57.11146 56.45221 1 1 0 + 516 145 14 0.417 48.60052 55.75658 56.96530 1 1 0 + 517 146 13 -0.834 63.13959 56.23999 49.92079 -1 0 -1 + 518 146 14 0.417 63.72474 55.58123 50.29478 -1 0 -1 + 519 146 14 0.417 63.40966 57.06154 50.33112 -1 0 -1 + 520 147 13 -0.834 58.55937 66.56287 54.17345 -1 0 0 + 521 147 14 0.417 59.28260 66.81524 53.59945 -1 0 0 + 522 147 14 0.417 58.28559 67.38088 54.58834 -1 0 0 + 523 148 13 -0.834 55.49901 62.14366 46.01274 -1 0 -1 + 524 148 14 0.417 55.08057 61.57956 45.36238 -1 0 -1 + 525 148 14 0.417 55.53371 63.00495 45.59652 -1 0 -1 + 526 149 13 -0.834 48.09589 47.38106 38.97384 0 1 0 + 527 149 14 0.417 47.94178 48.02346 38.28116 0 1 0 + 528 149 14 0.417 47.26125 47.32494 39.43910 0 1 0 + 529 150 13 -0.834 40.27661 53.03711 48.83757 0 0 0 + 530 150 14 0.417 40.32476 53.91333 49.21992 0 0 0 + 531 150 14 0.417 41.18363 52.81848 48.62365 0 0 0 + 532 151 13 -0.834 36.85277 41.68065 44.81488 1 2 0 + 533 151 14 0.417 36.95709 68.34807 45.45504 1 1 0 + 534 151 14 0.417 37.14062 41.29651 43.98673 1 2 0 + 535 152 13 -0.834 37.74881 65.81650 33.58759 -1 0 1 + 536 152 14 0.417 37.69052 65.99217 34.52673 -1 0 1 + 537 152 14 0.417 37.02193 65.21970 33.40951 -1 0 1 + 538 153 13 -0.834 63.01838 46.13766 43.99274 -2 0 0 + 539 153 14 0.417 62.72780 46.33504 43.10232 -2 0 0 + 540 153 14 0.417 63.75125 46.73459 44.14387 -2 0 0 + 541 154 13 -0.834 43.83288 53.92104 38.64974 0 2 1 + 542 154 14 0.417 44.46072 53.30394 39.02556 0 2 1 + 543 154 14 0.417 44.17373 54.10726 37.77488 0 2 1 + 544 155 13 -0.834 54.48021 41.30441 45.39416 1 1 -2 + 545 155 14 0.417 54.42996 67.86451 44.88861 1 0 -2 + 546 155 14 0.417 54.84291 41.03852 46.23914 1 1 -2 + 547 156 13 -0.834 51.26407 63.10699 50.73012 0 0 -2 + 548 156 14 0.417 51.64016 62.23294 50.83411 0 0 -2 + 549 156 14 0.417 51.56733 63.39797 49.87011 0 0 -2 + 550 157 13 -0.834 54.61161 63.67709 53.56970 0 1 1 + 551 157 14 0.417 55.55339 63.81655 53.47054 0 1 1 + 552 157 14 0.417 54.24805 63.87070 52.70565 0 1 1 + 553 158 13 -0.834 46.57444 42.69363 30.13287 -1 0 1 + 554 158 14 0.417 45.93025 42.28051 30.70783 -1 0 1 + 555 158 14 0.417 47.27305 42.04459 30.04973 -1 0 1 + 556 159 13 -0.834 37.92811 50.36816 42.31352 1 1 0 + 557 159 14 0.417 38.62401 50.90050 42.69899 1 1 0 + 558 159 14 0.417 38.11553 50.37135 41.37484 1 1 0 + 559 160 13 -0.834 40.53318 48.69302 33.52502 -1 0 0 + 560 160 14 0.417 40.10720 48.55075 32.67972 -1 0 0 + 561 160 14 0.417 41.22323 49.33057 33.34173 -1 0 0 + 562 161 13 -0.834 58.20095 45.48345 42.83426 1 0 -1 + 563 161 14 0.417 58.76156 46.25356 42.92849 1 0 -1 + 564 161 14 0.417 58.80813 44.74348 42.83158 1 0 -1 + 565 162 13 -0.834 59.85909 67.06752 31.43173 -1 1 0 + 566 162 14 0.417 59.95062 66.12180 31.54782 -1 1 0 + 567 162 14 0.417 60.75672 67.38534 31.33437 -1 1 0 + 568 163 13 -0.834 48.48808 51.17807 55.92072 -2 0 0 + 569 163 14 0.417 49.24951 51.62602 55.55219 -2 0 0 + 570 163 14 0.417 48.81105 50.30745 56.15303 -2 0 0 + 571 164 13 -0.834 47.51169 45.69616 48.99410 0 0 -1 + 572 164 14 0.417 48.36822 46.03425 48.73281 0 0 -1 + 573 164 14 0.417 47.56201 45.62598 49.94740 0 0 -1 + 574 165 13 -0.834 51.10678 64.23082 47.99167 0 -2 -1 + 575 165 14 0.417 51.33188 65.16116 47.98611 0 -2 -1 + 576 165 14 0.417 50.15837 64.21415 48.12002 0 -2 -1 + 577 166 13 -0.834 42.97263 56.29674 30.18230 0 0 0 + 578 166 14 0.417 42.45756 55.50818 30.01170 0 0 0 + 579 166 14 0.417 42.79675 56.86516 56.80386 0 0 -1 + 580 167 13 -0.834 44.45917 53.64338 31.85015 -1 0 0 + 581 167 14 0.417 44.64093 54.17218 31.07325 -1 0 0 + 582 167 14 0.417 43.66299 53.15965 31.63030 -1 0 0 + 583 168 13 -0.834 52.20677 49.92062 48.65330 1 0 0 + 584 168 14 0.417 52.24176 50.63538 49.28902 1 0 0 + 585 168 14 0.417 52.01918 50.35058 47.81890 1 0 0 + 586 169 13 -0.834 45.94013 51.43638 56.49888 0 0 0 + 587 169 14 0.417 46.89200 51.34153 56.53372 0 0 0 + 588 169 14 0.417 45.60504 50.66051 56.94833 0 0 0 + 589 170 13 -0.834 45.61845 41.38709 48.05698 1 0 0 + 590 170 14 0.417 46.42604 41.83441 47.80406 1 0 0 + 591 170 14 0.417 45.31743 41.85685 48.83477 1 0 0 + 592 171 13 -0.834 47.68232 42.84819 52.92728 0 1 0 + 593 171 14 0.417 47.61830 42.41414 52.07654 0 1 0 + 594 171 14 0.417 48.39202 42.39011 53.37758 0 1 0 + 595 172 13 -0.834 37.01774 65.84057 36.39542 1 -1 0 + 596 172 14 0.417 36.84918 65.13561 37.02061 1 -1 0 + 597 172 14 0.417 63.52368 66.19949 36.19938 0 -1 0 + 598 173 13 -0.834 51.52891 58.65207 39.31760 -1 -3 -1 + 599 173 14 0.417 51.57384 59.35596 39.96472 -1 -3 -1 + 600 173 14 0.417 51.00435 59.01522 38.60403 -1 -3 -1 + 601 174 13 -0.834 49.06578 54.25781 44.33488 0 -1 -1 + 602 174 14 0.417 48.81980 55.18018 44.26437 0 -1 -1 + 603 174 14 0.417 49.41695 54.17018 45.22104 0 -1 -1 + 604 175 13 -0.834 47.03819 42.38557 34.31948 -1 -1 0 + 605 175 14 0.417 47.39035 41.82883 35.01393 -1 -1 0 + 606 175 14 0.417 47.47024 43.23019 34.44673 -1 -1 0 + 607 176 13 -0.834 41.64025 43.65472 38.33192 0 1 0 + 608 176 14 0.417 41.17224 44.02383 37.58295 0 1 0 + 609 176 14 0.417 41.46027 44.26142 39.05008 0 1 0 + 610 177 13 -0.834 61.41261 58.14241 37.49312 -2 0 0 + 611 177 14 0.417 61.24368 59.06676 37.67551 -2 0 0 + 612 177 14 0.417 60.57871 57.80631 37.16465 -2 0 0 + 613 178 13 -0.834 48.58355 55.60536 32.34542 0 -2 -2 + 614 178 14 0.417 48.05292 55.64371 31.54969 0 -2 -2 + 615 178 14 0.417 49.00004 56.46561 32.39784 0 -2 -2 + 616 179 13 -0.834 51.18618 52.33768 44.26866 0 -1 0 + 617 179 14 0.417 50.47419 52.97535 44.21659 0 -1 0 + 618 179 14 0.417 51.18053 51.90159 43.41657 0 -1 0 + 619 180 13 -0.834 63.77008 46.64985 53.45124 -2 0 -1 + 620 180 14 0.417 37.25943 46.94040 53.14955 -1 0 -1 + 621 180 14 0.417 63.15834 47.28506 53.07904 -2 0 -1 + 622 181 13 -0.834 37.28071 56.79400 31.30862 1 1 0 + 623 181 14 0.417 37.34297 57.68998 31.63963 1 1 0 + 624 181 14 0.417 36.99543 56.89301 30.40030 1 1 0 + 625 182 13 -0.834 38.98742 57.66608 44.07685 1 0 1 + 626 182 14 0.417 39.04152 57.61214 43.12270 1 0 1 + 627 182 14 0.417 39.46043 56.89430 44.38805 1 0 1 + 628 183 13 -0.834 64.13749 51.25767 48.28997 0 -1 0 + 629 183 14 0.417 64.05120 52.19840 48.13566 0 -1 0 + 630 183 14 0.417 63.26932 50.90255 48.09918 0 -1 0 + 631 184 13 -0.834 41.02949 42.14202 43.02064 0 0 -1 + 632 184 14 0.417 40.60130 42.82178 43.54104 0 0 -1 + 633 184 14 0.417 40.43829 41.99723 42.28189 0 0 -1 + 634 185 13 -0.834 49.87332 48.21836 52.83028 0 1 0 + 635 185 14 0.417 49.13733 48.15035 53.43849 0 1 0 + 636 185 14 0.417 50.32176 47.37567 52.90100 0 1 0 + 637 186 13 -0.834 56.06860 48.51217 38.12813 -1 1 0 + 638 186 14 0.417 56.55702 47.73454 38.39826 -1 1 0 + 639 186 14 0.417 55.52690 48.21357 37.39762 -1 1 0 + 640 187 13 -0.834 54.22718 59.47740 40.22374 -1 0 1 + 641 187 14 0.417 53.93839 59.03820 39.42377 -1 0 1 + 642 187 14 0.417 54.74005 58.81629 40.68868 -1 0 1 + 643 188 13 -0.834 60.09461 46.88146 32.04739 -1 0 -1 + 644 188 14 0.417 60.91535 46.43611 31.83683 -1 0 -1 + 645 188 14 0.417 60.13630 47.02716 32.99253 -1 0 -1 + 646 189 13 -0.834 45.18646 44.57845 41.54076 0 0 0 + 647 189 14 0.417 44.28239 44.89208 41.51774 0 0 0 + 648 189 14 0.417 45.34481 44.23786 40.66033 0 0 0 + 649 190 13 -0.834 42.47099 45.68692 31.56356 1 0 1 + 650 190 14 0.417 43.26152 45.18821 31.76995 1 0 1 + 651 190 14 0.417 42.78187 46.58070 31.41951 1 0 1 + 652 191 13 -0.834 41.23413 47.67043 41.85221 0 1 0 + 653 191 14 0.417 41.04508 48.58329 42.06946 0 1 0 + 654 191 14 0.417 40.84394 47.54379 40.98737 0 1 0 + 655 192 13 -0.834 48.84750 60.39708 36.57115 0 0 0 + 656 192 14 0.417 48.57626 59.48478 36.46920 0 0 0 + 657 192 14 0.417 48.59448 60.62409 37.46597 0 0 0 + 658 193 13 -0.834 56.78263 43.55464 49.12966 -1 0 -1 + 659 193 14 0.417 56.56851 44.25428 48.51250 -1 0 -1 + 660 193 14 0.417 57.66563 43.76469 49.43365 -1 0 -1 + 661 194 13 -0.834 59.52236 53.66894 43.24587 -1 2 0 + 662 194 14 0.417 59.44365 54.61174 43.10041 -1 2 0 + 663 194 14 0.417 59.73284 53.58637 44.17598 -1 2 0 + 664 195 13 -0.834 63.61393 61.54696 40.57053 -1 -1 1 + 665 195 14 0.417 36.90989 60.94398 40.24291 0 -1 1 + 666 195 14 0.417 63.74510 61.55794 41.51864 -1 -1 1 + 667 196 13 -0.834 54.91742 43.16160 33.69639 0 0 -1 + 668 196 14 0.417 55.84062 43.16106 33.94925 0 0 -1 + 669 196 14 0.417 54.73416 44.07060 33.45898 0 0 -1 + 670 197 13 -0.834 41.09699 64.92982 48.38401 0 -1 -1 + 671 197 14 0.417 40.19042 64.83711 48.67687 0 -1 -1 + 672 197 14 0.417 41.27055 64.13206 47.88433 0 -1 -1 + 673 198 13 -0.834 49.09688 60.43369 49.80048 0 0 -1 + 674 198 14 0.417 49.75346 61.03633 50.14971 0 0 -1 + 675 198 14 0.417 49.51718 59.57440 49.83534 0 0 -1 + 676 199 13 -0.834 45.06873 45.25146 44.50830 0 1 0 + 677 199 14 0.417 45.08807 45.11881 43.56053 0 1 0 + 678 199 14 0.417 44.41198 44.63084 44.82413 0 1 0 + 679 200 13 -0.834 37.63886 45.88962 36.45768 0 0 2 + 680 200 14 0.417 38.32892 45.23766 36.58017 0 0 2 + 681 200 14 0.417 37.24627 45.98938 37.32495 0 0 2 + 682 201 13 -0.834 45.25770 47.01692 51.04211 -1 0 -2 + 683 201 14 0.417 45.49830 47.82868 50.59555 -1 0 -2 + 684 201 14 0.417 46.08295 46.68269 51.39354 -1 0 -2 + 685 202 13 -0.834 63.44567 60.77839 50.98507 -2 0 0 + 686 202 14 0.417 62.95029 60.46072 51.74001 -2 0 0 + 687 202 14 0.417 62.77774 61.08133 50.36998 -2 0 0 + 688 203 13 -0.834 48.00038 59.99003 33.31045 0 1 1 + 689 203 14 0.417 48.92391 59.89924 33.54518 0 1 1 + 690 203 14 0.417 47.68314 60.70831 33.85788 0 1 1 + 691 204 13 -0.834 51.29617 53.45952 36.10138 -1 -1 1 + 692 204 14 0.417 50.79623 53.20605 36.87731 -1 -1 1 + 693 204 14 0.417 51.41983 54.40421 36.19363 -1 -1 1 + 694 205 13 -0.834 48.55343 45.13540 34.47517 0 0 0 + 695 205 14 0.417 48.10547 45.97105 34.34382 0 0 0 + 696 205 14 0.417 49.13373 45.28879 35.22081 0 0 0 + 697 206 13 -0.834 48.34844 61.02741 54.77908 1 -1 -1 + 698 206 14 0.417 47.77364 61.75290 55.02301 1 -1 -1 + 699 206 14 0.417 49.14675 61.17253 55.28690 1 -1 -1 + 700 207 13 -0.834 38.97661 48.73541 31.27301 2 -1 0 + 701 207 14 0.417 38.86774 47.99634 30.67453 2 -1 0 + 702 207 14 0.417 38.60214 49.48112 30.80404 2 -1 0 + 703 208 13 -0.834 56.37687 61.69299 40.12439 0 -1 -1 + 704 208 14 0.417 56.35009 61.71409 39.16778 0 -1 -1 + 705 208 14 0.417 55.62486 61.15580 40.37371 0 -1 -1 + 706 209 13 -0.834 47.86700 41.38854 36.76722 -1 0 0 + 707 209 14 0.417 48.79854 41.26117 36.94678 -1 0 0 + 708 209 14 0.417 47.57553 42.00602 37.43804 -1 0 0 + 709 210 13 -0.834 43.22089 60.92576 39.48904 -1 -1 0 + 710 210 14 0.417 42.70029 60.20976 39.85311 -1 -1 0 + 711 210 14 0.417 43.25319 60.74538 38.54954 -1 -1 0 + 712 211 13 -0.834 56.26248 49.03317 34.29585 -1 0 0 + 713 211 14 0.417 56.69244 49.86416 34.09381 -1 0 0 + 714 211 14 0.417 55.61194 48.92467 33.60212 -1 0 0 + 715 212 13 -0.834 47.52063 49.37901 51.21673 1 0 0 + 716 212 14 0.417 48.35964 48.95385 51.03909 1 0 0 + 717 212 14 0.417 47.47856 49.43746 52.17122 1 0 0 + 718 213 13 -0.834 62.35532 56.31018 41.33556 0 0 0 + 719 213 14 0.417 62.07506 57.22150 41.42032 0 0 0 + 720 213 14 0.417 62.92184 56.16192 42.09274 0 0 0 + 721 214 13 -0.834 61.09797 64.53756 45.11003 -1 0 1 + 722 214 14 0.417 61.11801 63.59600 44.93887 -1 0 1 + 723 214 14 0.417 61.95676 64.85132 44.82670 -1 0 1 + 724 215 13 -0.834 51.22661 62.08872 31.93454 0 0 0 + 725 215 14 0.417 51.98994 62.65586 32.04369 0 0 0 + 726 215 14 0.417 50.47877 62.65171 32.13456 0 0 0 + 727 216 13 -0.834 40.65443 48.64853 54.43476 0 0 -1 + 728 216 14 0.417 40.25608 47.97845 54.99023 0 0 -1 + 729 216 14 0.417 41.58025 48.64240 54.67776 0 0 -1 + 730 217 13 -0.834 39.34873 63.07587 52.07209 1 1 -1 + 731 217 14 0.417 39.17266 63.98076 51.81438 1 1 -1 + 732 217 14 0.417 39.29792 62.57948 51.25523 1 1 -1 + 733 218 13 -0.834 45.66307 65.90840 47.75613 -1 0 0 + 734 218 14 0.417 44.99427 65.52542 48.32381 -1 0 0 + 735 218 14 0.417 45.75913 66.80721 48.07102 -1 0 0 + 736 219 13 -0.834 45.83158 51.91442 38.93974 0 0 0 + 737 219 14 0.417 46.07939 51.87422 39.86344 0 0 0 + 738 219 14 0.417 45.49928 51.03877 38.74210 0 0 0 + 739 220 13 -0.834 58.03934 67.88594 44.36036 -1 1 -1 + 740 220 14 0.417 58.69084 68.22520 43.74661 -1 1 -1 + 741 220 14 0.417 58.24719 68.31309 45.19138 -1 1 -1 + 742 221 13 -0.834 57.23319 66.95459 30.42832 0 0 0 + 743 221 14 0.417 56.95316 66.93560 31.34345 0 0 0 + 744 221 14 0.417 58.18154 66.82998 30.46491 0 0 0 + 745 222 13 -0.834 60.87005 44.72970 53.74755 -1 0 -1 + 746 222 14 0.417 60.02694 44.42275 53.41412 -1 0 -1 + 747 222 14 0.417 61.31963 45.07903 52.97808 -1 0 -1 + 748 223 13 -0.834 50.61352 50.44308 31.66369 0 -1 0 + 749 223 14 0.417 50.38691 49.95555 30.87173 0 -1 0 + 750 223 14 0.417 50.16704 51.28387 31.56391 0 -1 0 + 751 224 13 -0.834 42.70363 42.07925 34.73823 0 1 0 + 752 224 14 0.417 42.74630 41.15512 34.49249 0 1 0 + 753 224 14 0.417 41.77538 42.23983 34.90796 0 1 0 + 754 225 13 -0.834 50.34157 43.80796 44.49841 -1 1 0 + 755 225 14 0.417 49.44649 44.14718 44.50119 -1 1 0 + 756 225 14 0.417 50.24323 42.86994 44.66171 -1 1 0 + 757 226 13 -0.834 62.39528 64.92163 33.72829 -3 -1 1 + 758 226 14 0.417 61.94679 64.42233 34.41078 -3 -1 1 + 759 226 14 0.417 61.94061 64.68505 32.91986 -3 -1 1 + 760 227 13 -0.834 46.62188 47.13429 41.79430 0 1 1 + 761 227 14 0.417 46.21721 46.28415 41.62178 0 1 1 + 762 227 14 0.417 47.40198 46.92861 42.30946 0 1 1 + 763 228 13 -0.834 41.35469 54.31275 56.45453 0 0 -1 + 764 228 14 0.417 41.79769 53.47653 56.31055 0 0 -1 + 765 228 14 0.417 40.57273 54.26794 55.90425 0 0 -1 + 766 229 13 -0.834 48.43878 42.20000 49.94999 0 0 0 + 767 229 14 0.417 49.34431 42.29756 50.24447 0 0 0 + 768 229 14 0.417 48.41583 42.63350 49.09688 0 0 0 + 769 230 13 -0.834 37.29829 50.04209 33.34795 0 1 0 + 770 230 14 0.417 36.96213 49.51969 34.07619 0 1 0 + 771 230 14 0.417 37.98470 49.49933 32.96002 0 1 0 + 772 231 13 -0.834 58.91995 56.17895 33.02333 -1 0 0 + 773 231 14 0.417 59.83980 56.43785 32.96791 -1 0 0 + 774 231 14 0.417 58.89269 55.54120 33.73661 -1 0 0 + 775 232 13 -0.834 39.86900 65.81481 43.81866 0 0 -1 + 776 232 14 0.417 40.31483 64.99515 43.60502 0 0 -1 + 777 232 14 0.417 40.41298 66.21397 44.49762 0 0 -1 + 778 233 13 -0.834 62.71324 65.93556 51.55400 -1 0 0 + 779 233 14 0.417 62.38032 66.39597 52.32436 -1 0 0 + 780 233 14 0.417 63.52336 65.52245 51.85285 -1 0 0 + 781 234 13 -0.834 59.23324 49.58642 31.35843 0 0 0 + 782 234 14 0.417 59.28102 48.68976 31.69001 0 0 0 + 783 234 14 0.417 59.95115 50.04304 31.79700 0 0 0 + 784 235 13 -0.834 41.02310 67.21389 51.60243 0 0 0 + 785 235 14 0.417 41.77450 67.79064 51.74021 0 0 0 + 786 235 14 0.417 40.36922 67.76899 51.17753 0 0 0 + 787 236 13 -0.834 41.38918 62.43794 34.42449 0 0 1 + 788 236 14 0.417 41.26665 63.14612 33.79227 0 0 1 + 789 236 14 0.417 42.30454 62.51275 34.69423 0 0 1 + 790 237 13 -0.834 52.28796 56.01034 50.59905 0 -1 -1 + 791 237 14 0.417 53.14113 56.07317 51.02851 0 -1 -1 + 792 237 14 0.417 52.14509 55.07070 50.48548 0 -1 -1 + 793 238 13 -0.834 53.25204 66.52198 39.76351 0 -1 0 + 794 238 14 0.417 52.30774 66.44732 39.62571 0 -1 0 + 795 238 14 0.417 53.47725 67.38617 39.41895 0 -1 0 + 796 239 13 -0.834 59.77604 60.82055 48.12264 -1 -1 -1 + 797 239 14 0.417 59.80699 60.05926 48.70205 -1 -1 -1 + 798 239 14 0.417 58.96049 60.71611 47.63253 -1 -1 -1 + 799 240 13 -0.834 48.99693 51.07559 36.89084 0 -1 1 + 800 240 14 0.417 48.22315 50.55308 37.10175 0 -1 1 + 801 240 14 0.417 48.88824 51.30348 35.96753 0 -1 1 + 802 241 13 -0.834 50.67863 62.63916 55.60559 1 0 -2 + 803 241 14 0.417 51.43406 62.16856 55.25331 1 0 -2 + 804 241 14 0.417 51.05760 63.36945 56.09477 1 0 -2 + 805 242 13 -0.834 41.05301 64.77947 55.72335 1 -1 -1 + 806 242 14 0.417 41.95836 64.58666 55.96711 1 -1 -1 + 807 242 14 0.417 41.07998 65.67647 55.39035 1 -1 -1 + 808 243 13 -0.834 59.16096 63.30207 34.55147 0 -1 2 + 809 243 14 0.417 58.62636 62.51316 34.64131 0 -1 2 + 810 243 14 0.417 59.80830 63.23451 35.25333 0 -1 2 + 811 244 13 -0.834 59.86542 53.52546 55.50419 0 -1 -1 + 812 244 14 0.417 60.26921 53.79963 56.32761 0 -1 -1 + 813 244 14 0.417 58.96256 53.83773 55.56399 0 -1 -1 + 814 245 13 -0.834 56.48528 44.99075 44.65443 1 0 0 + 815 245 14 0.417 55.84854 44.49932 44.13551 1 0 0 + 816 245 14 0.417 57.18258 45.20803 44.03571 1 0 0 + 817 246 13 -0.834 37.25407 54.85866 36.86076 0 -1 -1 + 818 246 14 0.417 37.37951 55.31820 36.03050 0 -1 -1 + 819 246 14 0.417 36.91899 55.52805 37.45731 0 -1 -1 + 820 247 13 -0.834 54.42875 47.21339 48.23883 -1 -1 -1 + 821 247 14 0.417 54.60966 48.13349 48.43097 -1 -1 -1 + 822 247 14 0.417 54.44092 47.16092 47.28312 -1 -1 -1 + 823 248 13 -0.834 42.61226 41.78391 40.84493 1 0 1 + 824 248 14 0.417 41.98531 41.90233 41.55849 1 0 1 + 825 248 14 0.417 42.35866 42.43623 40.19194 1 0 1 + 826 249 13 -0.834 37.83522 41.95649 50.31377 0 0 -2 + 827 249 14 0.417 37.42231 42.81133 50.19124 0 0 -2 + 828 249 14 0.417 37.46684 41.41031 49.61934 0 0 -2 + 829 250 13 -0.834 44.80898 44.15062 49.20688 0 -1 0 + 830 250 14 0.417 44.80289 44.55594 48.33975 0 -1 0 + 831 250 14 0.417 45.29722 44.76463 49.75537 0 -1 0 + 832 251 13 -0.834 37.44321 44.03405 38.75076 1 0 1 + 833 251 14 0.417 37.12277 44.06014 39.65235 1 0 1 + 834 251 14 0.417 64.13547 43.56266 38.26824 0 0 1 + 835 252 13 -0.834 38.82113 46.15070 46.12915 1 0 0 + 836 252 14 0.417 38.96657 46.44867 47.02709 1 0 0 + 837 252 14 0.417 38.09796 45.52731 46.19733 1 0 0 + 838 253 13 -0.834 43.08482 60.65520 45.34135 -1 0 1 + 839 253 14 0.417 42.82882 59.73347 45.30784 -1 0 1 + 840 253 14 0.417 44.00885 60.65685 45.09147 -1 0 1 + 841 254 13 -0.834 45.72190 46.51173 32.51384 1 0 0 + 842 254 14 0.417 46.00925 45.78294 31.96381 1 0 0 + 843 254 14 0.417 46.53186 46.95248 32.77064 1 0 0 + 844 255 13 -0.834 63.64359 44.33728 41.24417 -1 0 0 + 845 255 14 0.417 63.60411 43.61794 41.87443 -1 0 0 + 846 255 14 0.417 62.76926 44.36407 40.85550 -1 0 0 + 847 256 13 -0.834 48.53353 66.27879 51.60437 0 0 -1 + 848 256 14 0.417 49.21611 66.24938 50.93396 0 0 -1 + 849 256 14 0.417 48.67507 65.48862 52.12577 0 0 -1 + 850 257 13 -0.834 54.11962 54.32751 39.83526 -1 1 1 + 851 257 14 0.417 53.37975 54.47391 39.24585 -1 1 1 + 852 257 14 0.417 53.95747 53.46346 40.21391 -1 1 1 + 853 258 13 -0.834 53.72785 66.08707 44.78384 -1 -1 0 + 854 258 14 0.417 54.65423 65.85662 44.85413 -1 -1 0 + 855 258 14 0.417 53.26300 65.26936 44.96130 -1 -1 0 + 856 259 13 -0.834 39.06287 51.40870 53.96063 0 0 -1 + 857 259 14 0.417 39.12854 51.34243 53.00796 0 0 -1 + 858 259 14 0.417 38.38057 52.06341 54.10916 0 0 -1 + 859 260 13 -0.834 58.77064 49.77012 37.45292 0 0 0 + 860 260 14 0.417 59.49652 49.20688 37.72142 0 0 0 + 861 260 14 0.417 57.98575 49.25379 37.63621 0 0 0 + 862 261 13 -0.834 37.94204 48.36591 35.22049 -1 0 0 + 863 261 14 0.417 37.94000 47.48368 35.59187 -1 0 0 + 864 261 14 0.417 38.86901 48.59216 35.14453 -1 0 0 + 865 262 13 -0.834 47.05754 54.06564 40.63628 0 -2 1 + 866 262 14 0.417 47.01965 53.22193 41.08679 0 -2 1 + 867 262 14 0.417 46.68660 54.68838 41.26145 0 -2 1 + 868 263 13 -0.834 46.01283 65.88108 53.59469 0 0 0 + 869 263 14 0.417 45.30729 66.50296 53.77277 0 0 0 + 870 263 14 0.417 46.76378 66.42902 53.36650 0 0 0 + 871 264 13 -0.834 45.32546 67.91008 39.11365 -1 -1 0 + 872 264 14 0.417 44.38981 67.96233 38.91853 -1 -1 0 + 873 264 14 0.417 45.70517 67.47097 38.35257 -1 -1 0 + 874 265 13 -0.834 55.39761 51.53823 53.16553 -1 1 -1 + 875 265 14 0.417 54.64975 52.10179 53.36389 -1 1 -1 + 876 265 14 0.417 55.78119 51.91789 52.37499 -1 1 -1 + 877 266 13 -0.834 57.06415 51.22923 32.75117 -1 -1 0 + 878 266 14 0.417 56.79908 52.11139 32.49079 -1 -1 0 + 879 266 14 0.417 57.98399 51.16910 32.49322 -1 -1 0 + 880 267 13 -0.834 50.05222 47.30342 45.67457 0 0 -2 + 881 267 14 0.417 49.85957 46.82324 46.47990 0 0 -2 + 882 267 14 0.417 50.60617 46.70964 45.16781 0 0 -2 + 883 268 13 -0.834 50.46819 45.47822 52.51129 0 1 -1 + 884 268 14 0.417 50.78823 45.07196 53.31677 0 1 -1 + 885 268 14 0.417 51.03886 45.13243 51.82499 0 1 -1 + 886 269 13 -0.834 47.44130 61.30175 47.80124 0 0 0 + 887 269 14 0.417 48.02715 60.89314 48.43850 0 0 0 + 888 269 14 0.417 47.98636 61.43626 47.02595 0 0 0 + 889 270 13 -0.834 41.31630 52.47434 39.71677 1 0 0 + 890 270 14 0.417 41.07609 52.94514 40.51485 1 0 0 + 891 270 14 0.417 42.05418 52.96849 39.35955 1 0 0 + 892 271 13 -0.834 55.90762 58.63213 50.47814 0 1 0 + 893 271 14 0.417 55.80273 59.37784 51.06903 0 1 0 + 894 271 14 0.417 55.41449 58.87554 49.69468 0 1 0 + 895 272 13 -0.834 42.23424 55.62725 53.35280 0 1 -1 + 896 272 14 0.417 41.62946 55.10926 53.88399 0 1 -1 + 897 272 14 0.417 41.75761 56.43615 53.16647 0 1 -1 + 898 273 13 -0.834 62.31754 63.97065 42.48774 0 0 1 + 899 273 14 0.417 63.27023 64.05391 42.44669 0 0 1 + 900 273 14 0.417 62.16851 63.13573 42.93152 0 0 1 + 901 274 13 -0.834 60.93154 49.79182 56.13812 0 -1 0 + 902 274 14 0.417 61.38991 48.97402 56.33134 0 -1 0 + 903 274 14 0.417 60.29808 49.88575 56.84955 0 -1 0 + 904 275 13 -0.834 50.39572 45.11274 36.60756 0 1 -1 + 905 275 14 0.417 50.88541 44.33834 36.33051 0 1 -1 + 906 275 14 0.417 50.38352 45.05976 37.56322 0 1 -1 + 907 276 13 -0.834 46.57204 43.12189 39.29488 -1 2 -1 + 908 276 14 0.417 46.48449 42.17951 39.43813 -1 2 -1 + 909 276 14 0.417 47.49357 43.30747 39.47547 -1 2 -1 + 910 277 13 -0.834 54.39979 41.37518 38.62483 0 0 1 + 911 277 14 0.417 54.27469 42.27221 38.31511 0 0 1 + 912 277 14 0.417 54.57135 68.24024 37.83080 0 -1 1 + 913 278 13 -0.834 60.57638 52.40343 41.12327 -1 1 -1 + 914 278 14 0.417 60.40196 53.27982 40.78010 -1 1 -1 + 915 278 14 0.417 60.37657 52.46726 42.05721 -1 1 -1 + 916 279 13 -0.834 61.77806 59.06524 41.98029 0 0 0 + 917 279 14 0.417 62.58317 59.36537 42.40214 0 0 0 + 918 279 14 0.417 61.10430 59.16112 42.65342 0 0 0 + 919 280 13 -0.834 43.46789 48.64833 54.88223 0 1 -2 + 920 280 14 0.417 43.60676 49.48200 54.43286 0 1 -2 + 921 280 14 0.417 43.74339 47.98554 54.24895 0 1 -2 + 922 281 13 -0.834 51.98628 58.37454 48.60562 -1 0 0 + 923 281 14 0.417 51.81372 57.54909 49.05852 -1 0 0 + 924 281 14 0.417 52.67545 58.16319 47.97583 -1 0 0 + 925 282 13 -0.834 55.00551 65.64176 56.63926 0 -1 -1 + 926 282 14 0.417 55.59134 66.11131 29.86167 0 -1 0 + 927 282 14 0.417 54.80211 66.27584 55.95165 0 -1 -1 + 928 283 13 -0.834 55.02996 52.59142 50.59986 -1 1 0 + 929 283 14 0.417 54.13615 52.66743 50.26585 -1 1 0 + 930 283 14 0.417 55.48513 53.35419 50.24316 -1 1 0 + 931 284 13 -0.834 37.39245 67.88600 56.81733 0 -1 -1 + 932 284 14 0.417 38.13326 41.09044 56.62787 0 0 -1 + 933 284 14 0.417 37.74351 67.00148 56.71419 0 -1 -1 + 934 285 13 -0.834 42.83234 60.22766 53.36959 0 0 0 + 935 285 14 0.417 43.51497 59.86233 52.80672 0 0 0 + 936 285 14 0.417 43.27782 60.90528 53.87815 0 0 0 + 937 286 13 -0.834 59.24806 43.81265 38.44265 1 0 0 + 938 286 14 0.417 59.12140 43.55748 39.35647 1 0 0 + 939 286 14 0.417 60.07673 44.29174 38.43991 1 0 0 + 940 287 13 -0.834 61.29263 60.52642 52.74164 -1 1 -1 + 941 287 14 0.417 61.73918 60.02180 53.42149 -1 1 -1 + 942 287 14 0.417 60.93759 61.28711 53.20156 -1 1 -1 + 943 288 13 -0.834 63.43980 43.30119 30.90384 -1 1 0 + 944 288 14 0.417 63.34979 42.36405 30.73085 -1 1 0 + 945 288 14 0.417 64.20504 43.56693 30.39393 -1 1 0 + 946 289 13 -0.834 57.11924 59.06522 54.48909 -1 0 0 + 947 289 14 0.417 57.40605 59.83488 54.98062 -1 0 0 + 948 289 14 0.417 57.59698 58.33614 54.88463 -1 0 0 + 949 290 13 -0.834 51.89759 59.82680 44.82923 1 1 -1 + 950 290 14 0.417 51.33588 59.94068 44.06258 1 1 -1 + 951 290 14 0.417 51.32846 60.01914 45.57443 1 1 -1 + 952 291 13 -0.834 57.64696 65.49112 47.86068 -1 0 0 + 953 291 14 0.417 57.31105 65.98457 48.60895 -1 0 0 + 954 291 14 0.417 57.73765 64.59519 48.18521 -1 0 0 + 955 292 13 -0.834 50.35232 57.73892 32.55459 0 1 0 + 956 292 14 0.417 51.07441 57.69034 31.92813 0 1 0 + 957 292 14 0.417 50.48339 58.57180 33.00777 0 1 0 + 958 293 13 -0.834 46.20166 60.82812 38.38269 0 1 1 + 959 293 14 0.417 46.12191 61.76977 38.53504 0 1 1 + 960 293 14 0.417 45.30555 60.53505 38.21735 0 1 1 + 961 294 13 -0.834 41.42660 51.46433 55.94150 1 0 -1 + 962 294 14 0.417 40.58025 51.71240 55.56944 1 0 -1 + 963 294 14 0.417 41.63094 50.62307 55.53311 1 0 -1 + 964 295 13 -0.834 56.72642 53.95840 32.00323 0 -1 0 + 965 295 14 0.417 57.12177 54.49254 32.69216 0 -1 0 + 966 295 14 0.417 55.80349 54.21231 32.00259 0 -1 0 + 967 296 13 -0.834 43.25852 41.40642 31.27656 0 1 0 + 968 296 14 0.417 43.58058 42.21308 31.67880 0 1 0 + 969 296 14 0.417 43.16985 68.16459 32.00619 0 0 0 + 970 297 13 -0.834 54.50477 52.62435 30.30235 -2 1 0 + 971 297 14 0.417 54.04985 52.22243 31.04245 -2 1 0 + 972 297 14 0.417 54.36900 53.56465 30.41915 -2 1 0 + 973 298 13 -0.834 38.11258 59.33341 36.21749 1 0 0 + 974 298 14 0.417 38.95754 58.91929 36.04205 1 0 0 + 975 298 14 0.417 38.14750 60.16192 35.73940 1 0 0 + 976 299 13 -0.834 39.65020 64.70254 40.48616 -1 0 1 + 977 299 14 0.417 39.87581 65.58596 40.19474 -1 0 1 + 978 299 14 0.417 39.66086 64.17611 39.68676 -1 0 1 + 979 300 13 -0.834 63.26661 53.84973 48.10281 -1 1 1 + 980 300 14 0.417 63.38261 54.75210 48.40032 -1 1 1 + 981 300 14 0.417 62.32830 53.68505 48.19603 -1 1 1 + 982 301 13 -0.834 43.65966 61.04202 50.03088 0 0 0 + 983 301 14 0.417 44.11377 60.35973 50.52538 0 0 0 + 984 301 14 0.417 44.30508 61.74317 49.94108 0 0 0 + 985 302 13 -0.834 61.75204 50.20037 32.39414 0 0 0 + 986 302 14 0.417 62.04749 51.09027 32.58663 0 0 0 + 987 302 14 0.417 62.55370 49.67736 32.38826 0 0 0 + 988 303 13 -0.834 53.79071 58.98335 36.25336 -1 -2 -1 + 989 303 14 0.417 53.17711 58.26833 36.42220 -1 -2 -1 + 990 303 14 0.417 54.65389 58.60140 36.41235 -1 -2 -1 + 991 304 13 -0.834 50.47963 50.13918 42.58243 1 -1 -2 + 992 304 14 0.417 51.28111 49.63880 42.42915 1 -1 -2 + 993 304 14 0.417 50.33279 50.61369 41.76419 1 -1 -2 + 994 305 13 -0.834 50.28770 49.02182 56.79391 1 -1 -2 + 995 305 14 0.417 50.66164 48.14920 56.91622 1 -1 -2 + 996 305 14 0.417 50.60501 49.30063 55.93493 1 -1 -2 + 997 306 13 -0.834 41.36930 46.36343 34.87469 1 1 0 + 998 306 14 0.417 42.25704 46.59841 34.60463 1 1 0 + 999 306 14 0.417 40.85961 47.16333 34.74582 1 1 0 + 1000 307 13 -0.834 61.15349 47.47016 41.71779 0 1 0 + 1001 307 14 0.417 61.50139 48.29469 41.37818 0 1 0 + 1002 307 14 0.417 60.28203 47.69385 42.04454 0 1 0 + 1003 308 13 -0.834 58.35337 46.83622 34.81712 0 0 1 + 1004 308 14 0.417 57.63221 46.22391 34.67141 0 0 1 + 1005 308 14 0.417 57.97297 47.69883 34.65146 0 0 1 + 1006 309 13 -0.834 38.79812 57.92803 48.26323 1 -2 -1 + 1007 309 14 0.417 38.67444 56.98130 48.33141 1 -2 -1 + 1008 309 14 0.417 39.70990 58.06987 48.51776 1 -2 -1 + 1009 310 13 -0.834 42.15963 57.96891 45.03230 1 0 0 + 1010 310 14 0.417 42.11698 57.98663 45.98839 1 0 0 + 1011 310 14 0.417 41.83611 57.10021 44.79371 1 0 0 + 1012 311 13 -0.834 55.17551 54.72671 36.49400 0 -1 0 + 1013 311 14 0.417 55.26386 53.77738 36.57890 0 -1 0 + 1014 311 14 0.417 55.36463 55.06457 37.36939 0 -1 0 + 1015 312 13 -0.834 58.64573 63.28550 41.10609 -1 -2 -1 + 1016 312 14 0.417 58.98147 62.66636 41.75429 -1 -2 -1 + 1017 312 14 0.417 57.90273 62.83419 40.70545 -1 -2 -1 + 1018 313 13 -0.834 49.96498 59.98797 42.54359 0 -1 0 + 1019 313 14 0.417 50.57886 60.48612 42.00390 0 -1 0 + 1020 313 14 0.417 49.10600 60.17526 42.16501 0 -1 0 + 1021 314 13 -0.834 57.54750 44.35075 52.12722 -1 -1 -1 + 1022 314 14 0.417 57.86221 43.84739 51.37633 -1 -1 -1 + 1023 314 14 0.417 56.76423 44.79718 51.80558 -1 -1 -1 + 1024 315 13 -0.834 58.07892 59.46258 41.31930 1 -1 0 + 1025 315 14 0.417 58.27344 60.10968 41.99729 1 -1 0 + 1026 315 14 0.417 57.80524 59.98199 40.56328 1 -1 0 + 1027 316 13 -0.834 42.21869 44.49848 55.65511 2 1 0 + 1028 316 14 0.417 42.77458 44.78017 56.38166 2 1 0 + 1029 316 14 0.417 42.83052 44.15513 55.00395 2 1 0 + 1030 317 13 -0.834 56.38334 63.45614 43.52622 -1 -1 0 + 1031 317 14 0.417 55.66283 63.62998 42.92052 -1 -1 0 + 1032 317 14 0.417 56.48976 64.27319 44.01338 -1 -1 0 + 1033 318 13 -0.834 43.21354 46.04700 52.52965 1 1 0 + 1034 318 14 0.417 43.24360 45.09879 52.40226 1 1 0 + 1035 318 14 0.417 43.99839 46.37328 52.08943 1 1 0 + 1036 319 13 -0.834 55.96174 45.94863 35.39660 -1 0 1 + 1037 319 14 0.417 55.64687 46.44680 36.15088 -1 0 1 + 1038 319 14 0.417 55.28305 46.06527 34.73174 -1 0 1 + 1039 320 13 -0.834 47.36406 54.82690 34.84439 -1 -1 2 + 1040 320 14 0.417 47.90093 54.86776 34.05295 -1 -1 2 + 1041 320 14 0.417 47.23152 53.89118 34.99640 -1 -1 2 + 1042 321 13 -0.834 49.62685 50.00229 45.27362 1 0 -2 + 1043 321 14 0.417 49.70876 49.05477 45.38192 1 0 -2 + 1044 321 14 0.417 49.82566 50.15634 44.35005 1 0 -2 + 1045 322 13 -0.834 49.58249 46.02940 55.43310 -1 0 -2 + 1046 322 14 0.417 49.10378 46.80060 55.12924 -1 0 -2 + 1047 322 14 0.417 49.31802 45.92761 56.34739 -1 0 -2 + 1048 323 13 -0.834 51.72150 51.53491 51.55558 0 -1 -1 + 1049 323 14 0.417 51.50292 52.17946 50.88251 0 -1 -1 + 1050 323 14 0.417 52.14568 52.04382 52.24646 0 -1 -1 + 1051 324 13 -0.834 37.98107 56.66338 52.98024 0 1 0 + 1052 324 14 0.417 37.64467 57.53823 52.78607 0 1 0 + 1053 324 14 0.417 38.15999 56.27913 52.12200 0 1 0 + 1054 325 13 -0.834 59.20226 51.55233 53.16877 -1 1 0 + 1055 325 14 0.417 59.68851 51.88535 53.92302 -1 1 0 + 1056 325 14 0.417 58.63621 50.87031 53.53025 -1 1 0 + 1057 326 13 -0.834 45.75783 63.62117 39.24032 1 1 -1 + 1058 326 14 0.417 46.25179 64.38626 39.53508 1 1 -1 + 1059 326 14 0.417 44.85376 63.80686 39.49409 1 1 -1 + 1060 327 13 -0.834 58.00953 52.38584 37.67148 -1 1 1 + 1061 327 14 0.417 58.24242 51.47235 37.50553 -1 1 1 + 1062 327 14 0.417 57.26453 52.33853 38.27062 -1 1 1 + 1063 328 13 -0.834 50.62838 66.20855 42.36072 0 0 -1 + 1064 328 14 0.417 51.45434 66.68250 42.45770 0 0 -1 + 1065 328 14 0.417 49.99531 66.87945 42.10506 0 0 -1 + 1066 329 13 -0.834 53.69444 52.39171 45.41982 1 0 0 + 1067 329 14 0.417 53.84961 51.45739 45.55855 1 0 0 + 1068 329 14 0.417 52.75879 52.45359 45.22750 1 0 0 + 1069 330 13 -0.834 38.34038 60.92162 30.12773 2 0 0 + 1070 330 14 0.417 39.08908 61.47644 29.90887 2 0 0 + 1071 330 14 0.417 38.64185 60.39196 30.86585 2 0 0 + 1072 331 13 -0.834 48.03336 64.84935 43.13262 -1 0 -2 + 1073 331 14 0.417 48.90813 65.00919 43.48682 -1 0 -2 + 1074 331 14 0.417 47.46214 65.43367 43.63114 -1 0 -2 + 1075 332 13 -0.834 39.68760 66.88962 36.60665 2 0 0 + 1076 332 14 0.417 38.74743 66.72116 36.66944 2 0 0 + 1077 332 14 0.417 40.05009 66.08888 36.22764 2 0 0 + 1078 333 13 -0.834 51.94118 65.49897 51.83197 0 -1 -2 + 1079 333 14 0.417 52.71282 65.06165 51.47204 0 -1 -2 + 1080 333 14 0.417 51.22446 64.88225 51.68297 0 -1 -2 + 1081 334 13 -0.834 43.33066 57.53264 55.09930 -1 0 -2 + 1082 334 14 0.417 43.05496 56.76932 54.59178 -1 0 -2 + 1083 334 14 0.417 44.28179 57.55937 54.99503 -1 0 -2 + 1084 335 13 -0.834 47.70128 45.69178 52.17773 -1 3 -1 + 1085 335 14 0.417 47.54566 44.86273 52.63016 -1 3 -1 + 1086 335 14 0.417 48.58530 45.94693 52.44163 -1 3 -1 + 1087 336 13 -0.834 58.71603 41.81571 40.73899 -1 0 0 + 1088 336 14 0.417 57.77048 41.84330 40.88539 -1 0 0 + 1089 336 14 0.417 58.81275 41.43332 39.86682 -1 0 0 + 1090 337 13 -0.834 57.56034 60.98533 43.60766 0 -1 0 + 1091 337 14 0.417 56.67639 60.61816 43.59917 0 -1 0 + 1092 337 14 0.417 57.42830 61.92611 43.72486 0 -1 0 + 1093 338 13 -0.834 44.68088 65.08579 34.27880 -1 0 2 + 1094 338 14 0.417 45.54678 65.09564 34.68668 -1 0 2 + 1095 338 14 0.417 44.45037 64.15818 34.22739 -1 0 2 + 1096 339 13 -0.834 54.98236 48.04093 42.26075 0 0 0 + 1097 339 14 0.417 55.16505 47.86552 43.18384 0 0 0 + 1098 339 14 0.417 55.70493 48.59999 41.97513 0 0 0 + 1099 340 13 -0.834 60.57099 56.88773 56.53671 0 0 1 + 1100 340 14 0.417 60.67151 56.21616 29.83998 0 0 2 + 1101 340 14 0.417 61.34465 56.78824 55.98192 0 0 1 + 1102 341 13 -0.834 48.05045 49.69974 47.93542 -1 0 0 + 1103 341 14 0.417 48.70922 49.23613 48.45249 -1 0 0 + 1104 341 14 0.417 48.26410 49.48583 47.02721 -1 0 0 + 1105 342 13 -0.834 40.63207 55.77589 49.21695 1 0 -1 + 1106 342 14 0.417 40.84917 56.26844 50.00847 1 0 -1 + 1107 342 14 0.417 41.40772 55.85904 48.66226 1 0 -1 + 1108 343 13 -0.834 61.66015 42.71355 39.91223 0 0 0 + 1109 343 14 0.417 61.87748 41.86774 40.30419 0 0 0 + 1110 343 14 0.417 61.98864 42.65380 39.01514 0 0 0 + 1111 344 13 -0.834 38.52157 65.12766 57.04010 0 -1 -1 + 1112 344 14 0.417 38.04157 64.32142 56.85084 0 -1 -1 + 1113 344 14 0.417 39.36310 65.01535 56.59799 0 -1 -1 + 1114 345 13 -0.834 54.26556 44.72348 38.61852 -1 0 0 + 1115 345 14 0.417 54.65781 45.53245 38.94708 -1 0 0 + 1116 345 14 0.417 54.97105 44.29396 38.13473 -1 0 0 + 1117 346 13 -0.834 55.38993 55.61246 43.96322 -1 0 1 + 1118 346 14 0.417 54.74535 54.99107 43.62461 -1 0 1 + 1119 346 14 0.417 55.11835 55.77119 44.86726 -1 0 1 + 1120 347 13 -0.834 56.42023 55.00369 50.06211 -1 -1 0 + 1121 347 14 0.417 55.77599 55.59187 50.45611 -1 -1 0 + 1122 347 14 0.417 56.93756 54.68448 50.80151 -1 -1 0 + 1123 348 13 -0.834 45.79495 66.88952 36.56670 1 1 -1 + 1124 348 14 0.417 45.28578 66.71904 35.77429 1 1 -1 + 1125 348 14 0.417 46.57709 67.34552 36.25591 1 1 -1 + 1126 349 13 -0.834 62.75278 45.54084 32.23733 0 0 0 + 1127 349 14 0.417 62.61586 44.79986 31.64705 0 0 0 + 1128 349 14 0.417 62.96974 45.14017 33.07913 0 0 0 + 1129 350 13 -0.834 57.50625 65.62986 39.74454 0 0 0 + 1130 350 14 0.417 57.73342 64.85584 40.25983 0 0 0 + 1131 350 14 0.417 57.07082 66.21286 40.36642 0 0 0 + 1132 351 13 -0.834 55.96293 62.10636 50.17062 0 1 -1 + 1133 351 14 0.417 56.24333 61.70901 50.99507 0 1 -1 + 1134 351 14 0.417 56.67888 62.69531 49.93234 0 1 -1 + 1135 352 13 -0.834 37.45010 41.11856 53.00894 0 0 0 + 1136 352 14 0.417 37.99062 41.49514 53.70339 0 0 0 + 1137 352 14 0.417 37.83337 41.45341 52.19826 0 0 0 + 1138 353 13 -0.834 40.59344 47.85232 38.52244 1 0 1 + 1139 353 14 0.417 41.31256 47.71502 37.90580 1 0 1 + 1140 353 14 0.417 40.21612 48.69426 38.26747 1 0 1 + 1141 354 13 -0.834 60.77214 62.31711 30.33695 0 2 -1 + 1142 354 14 0.417 59.83662 62.43212 30.17023 0 2 -1 + 1143 354 14 0.417 60.97856 61.45964 29.96496 0 2 -1 + 1144 355 13 -0.834 47.83829 64.26042 48.43592 0 1 -1 + 1145 355 14 0.417 47.12209 64.85952 48.22523 0 1 -1 + 1146 355 14 0.417 47.44823 63.38856 48.37295 0 1 -1 + 1147 356 13 -0.834 38.69679 45.31108 42.13672 1 1 0 + 1148 356 14 0.417 39.20464 45.52138 41.35308 1 1 0 + 1149 356 14 0.417 37.90440 44.89009 41.80335 1 1 0 + 1150 357 13 -0.834 38.90832 47.67164 52.69089 0 1 0 + 1151 357 14 0.417 39.51269 48.14149 53.26554 0 1 0 + 1152 357 14 0.417 38.42834 48.36117 52.23218 0 1 0 + 1153 358 13 -0.834 45.13879 48.98199 29.96256 0 2 1 + 1154 358 14 0.417 44.63649 48.48457 30.60794 0 2 1 + 1155 358 14 0.417 44.70163 48.80464 56.50106 0 2 0 + 1156 359 13 -0.834 54.78460 57.58368 54.24956 1 1 -1 + 1157 359 14 0.417 54.71436 57.34891 55.17486 1 1 -1 + 1158 359 14 0.417 55.60599 58.07122 54.18735 1 1 -1 + 1159 360 13 -0.834 40.77006 67.09387 46.34204 0 0 1 + 1160 360 14 0.417 40.91087 66.51539 47.09156 0 0 1 + 1161 360 14 0.417 41.47386 67.73986 46.40192 0 0 1 + 1162 361 13 -0.834 53.75960 49.21723 54.03526 1 0 -1 + 1163 361 14 0.417 54.17778 50.07537 53.96484 1 0 -1 + 1164 361 14 0.417 54.18187 48.68822 53.35846 1 0 -1 + 1165 362 13 -0.834 46.41755 62.84035 30.52059 0 0 1 + 1166 362 14 0.417 46.37357 61.90548 30.72136 0 0 1 + 1167 362 14 0.417 46.76359 62.87829 57.00030 0 0 0 + 1168 363 13 -0.834 51.27491 42.28113 30.83818 0 -1 0 + 1169 363 14 0.417 51.18814 42.11416 31.77671 0 -1 0 + 1170 363 14 0.417 50.41560 42.60836 30.57220 0 -1 0 + 1171 364 13 -0.834 52.36258 42.54738 46.83477 0 -1 -1 + 1172 364 14 0.417 51.62853 42.02025 46.51928 0 -1 -1 + 1173 364 14 0.417 53.11771 42.22680 46.34158 0 -1 -1 + 1174 365 13 -0.834 40.11442 46.69570 48.71466 3 -2 1 + 1175 365 14 0.417 39.89820 47.61495 48.55824 3 -2 1 + 1176 365 14 0.417 40.87520 46.72352 49.29493 3 -2 1 + 1177 366 13 -0.834 56.56957 65.78976 45.32589 0 -2 -1 + 1178 366 14 0.417 56.86196 65.56407 46.20896 0 -2 -1 + 1179 366 14 0.417 57.34222 66.16870 44.90678 0 -2 -1 + 1180 367 13 -0.834 38.37373 47.63723 43.98242 2 0 0 + 1181 367 14 0.417 38.78516 47.21384 44.73589 2 0 0 + 1182 367 14 0.417 38.73588 47.18051 43.22315 2 0 0 + 1183 368 13 -0.834 45.69445 49.36872 40.50736 -1 0 -2 + 1184 368 14 0.417 44.73771 49.39892 40.51002 -1 0 -2 + 1185 368 14 0.417 45.90701 48.47357 40.77155 -1 0 -2 + 1186 369 13 -0.834 53.93830 54.76570 31.99728 0 -1 0 + 1187 369 14 0.417 53.94849 55.50033 32.61083 0 -1 0 + 1188 369 14 0.417 53.13070 54.29402 32.20107 0 -1 0 + 1189 370 13 -0.834 58.79125 64.07093 37.97498 -1 -1 -2 + 1190 370 14 0.417 58.48296 64.72380 38.60343 -1 -1 -2 + 1191 370 14 0.417 58.20942 64.16977 37.22136 -1 -1 -2 + 1192 371 13 -0.834 51.76123 61.42281 40.82794 0 -1 0 + 1193 371 14 0.417 52.69114 61.24136 40.69160 0 -1 0 + 1194 371 14 0.417 51.74755 62.21395 41.36660 0 -1 0 + 1195 372 13 -0.834 44.28377 63.70509 53.71234 -1 -2 -1 + 1196 372 14 0.417 44.98211 64.35001 53.59994 -1 -2 -1 + 1197 372 14 0.417 43.75271 63.78587 52.92008 -1 -2 -1 + 1198 373 13 -0.834 61.50835 48.76378 34.91047 0 0 -1 + 1199 373 14 0.417 61.23254 49.09753 34.05678 0 0 -1 + 1200 373 14 0.417 61.51672 49.53447 35.47812 0 0 -1 + 1201 374 13 -0.834 61.51337 41.63477 44.26291 -1 -1 0 + 1202 374 14 0.417 62.42662 41.58544 44.54543 -1 -1 0 + 1203 374 14 0.417 61.34749 68.16405 43.83907 -1 -2 0 + 1204 375 13 -0.834 57.73267 43.39213 33.64792 0 -1 0 + 1205 375 14 0.417 58.46456 43.28438 34.25535 0 -1 0 + 1206 375 14 0.417 58.09278 43.15396 32.79362 0 -1 0 + 1207 376 13 -0.834 63.51473 49.31549 51.59705 -1 1 -1 + 1208 376 14 0.417 63.13045 49.03534 50.76631 -1 1 -1 + 1209 376 14 0.417 62.84038 49.86142 52.00137 -1 1 -1 + 1210 377 13 -0.834 58.21462 44.79010 54.73553 -1 -1 -1 + 1211 377 14 0.417 58.08068 43.94884 55.17209 -1 -1 -1 + 1212 377 14 0.417 57.81645 44.67856 53.87224 -1 -1 -1 + 1213 378 13 -0.834 57.08090 55.14561 52.86183 0 -2 1 + 1214 378 14 0.417 57.05215 55.46811 53.76261 0 -2 1 + 1215 378 14 0.417 57.69965 54.41575 52.88786 0 -2 1 + 1216 379 13 -0.834 60.83502 54.45436 45.82182 1 0 -1 + 1217 379 14 0.417 61.05342 55.38616 45.83857 1 0 -1 + 1218 379 14 0.417 60.79443 54.20077 46.74392 1 0 -1 + 1219 380 13 -0.834 60.86442 48.23162 37.95658 0 0 2 + 1220 380 14 0.417 61.77710 48.43881 37.75572 0 0 2 + 1221 380 14 0.417 60.87611 47.30540 38.19788 0 0 2 + 1222 381 13 -0.834 43.21478 43.26953 44.97859 2 1 -1 + 1223 381 14 0.417 42.50778 42.78849 44.54850 2 1 -1 + 1224 381 14 0.417 43.42173 42.74895 45.75474 2 1 -1 + 1225 382 13 -0.834 39.01904 49.57571 48.28198 1 -1 -1 + 1226 382 14 0.417 38.68877 49.32064 47.42052 1 -1 -1 + 1227 382 14 0.417 38.42357 50.26661 48.57234 1 -1 -1 + 1228 383 13 -0.834 47.20253 45.34580 30.26781 0 0 1 + 1229 383 14 0.417 47.05738 44.40526 30.16508 0 0 1 + 1230 383 14 0.417 46.80592 45.73631 56.86044 0 0 0 + 1231 384 13 -0.834 44.57742 55.88746 33.53830 0 -1 0 + 1232 384 14 0.417 45.13093 56.49768 33.05096 0 -1 0 + 1233 384 14 0.417 44.41092 55.17196 32.92464 0 -1 0 + 1234 385 13 -0.834 42.17091 64.36626 51.74369 1 0 0 + 1235 385 14 0.417 41.78583 65.24128 51.69570 1 0 0 + 1236 385 14 0.417 41.41926 63.77568 51.79343 1 0 0 + 1237 386 13 -0.834 43.82615 43.47821 52.97551 0 0 0 + 1238 386 14 0.417 43.64099 42.56407 52.76025 0 0 0 + 1239 386 14 0.417 44.58924 43.43914 53.55207 0 0 0 + 1240 387 13 -0.834 63.58286 63.91035 38.47173 0 -1 -1 + 1241 387 14 0.417 64.14591 63.71296 39.22023 0 -1 -1 + 1242 387 14 0.417 62.70901 64.01191 38.84896 0 -1 -1 + 1243 388 13 -0.834 57.85225 42.19019 46.82252 1 1 -2 + 1244 388 14 0.417 57.61712 42.29475 47.74450 1 1 -2 + 1245 388 14 0.417 57.29406 42.81537 46.36013 1 1 -2 + 1246 389 13 -0.834 57.90802 64.30101 52.26362 1 0 1 + 1247 389 14 0.417 58.43907 64.81717 52.87010 1 0 1 + 1248 389 14 0.417 58.54387 63.78888 51.76396 1 0 1 + 1249 390 13 -0.834 53.18379 66.68791 54.05156 1 -2 0 + 1250 390 14 0.417 52.23394 66.79510 54.00115 1 -2 0 + 1251 390 14 0.417 53.33447 65.77140 53.82015 1 -2 0 + 1252 391 13 -0.834 56.95394 68.26036 36.42711 -1 1 1 + 1253 391 14 0.417 56.91362 41.83232 36.58445 -1 2 1 + 1254 391 14 0.417 57.79173 67.98998 36.80292 -1 1 1 + 1255 392 13 -0.834 64.19252 44.20158 54.88143 0 0 0 + 1256 392 14 0.417 64.09322 45.07899 54.51194 0 0 0 + 1257 392 14 0.417 63.39239 43.74201 54.62684 0 0 0 + 1258 393 13 -0.834 63.10536 65.42626 48.53464 0 0 0 + 1259 393 14 0.417 62.79665 64.63036 48.10166 0 0 0 + 1260 393 14 0.417 62.77768 65.35429 49.43112 0 0 0 + 1261 394 13 -0.834 49.28836 66.20367 32.27628 1 -1 0 + 1262 394 14 0.417 49.46858 65.88738 33.16155 1 -1 0 + 1263 394 14 0.417 49.29197 65.41476 31.73420 1 -1 0 + 1264 395 13 -0.834 46.11216 66.09570 44.77896 0 -1 0 + 1265 395 14 0.417 45.90309 66.07762 45.71287 0 -1 0 + 1266 395 14 0.417 45.36137 65.67813 44.35683 0 -1 0 + 1267 396 13 -0.834 41.43943 50.30026 52.32584 1 0 0 + 1268 396 14 0.417 41.39866 49.93140 51.44351 1 0 0 + 1269 396 14 0.417 40.92759 49.69528 52.86275 1 0 0 + 1270 397 13 -0.834 54.69177 57.80859 32.50623 0 -1 -1 + 1271 397 14 0.417 53.99890 57.66594 31.86139 0 -1 -1 + 1272 397 14 0.417 54.37599 57.37325 33.29806 0 -1 -1 + 1273 398 13 -0.834 43.56781 46.79065 37.17838 0 1 0 + 1274 398 14 0.417 43.18325 46.24795 36.49004 0 1 0 + 1275 398 14 0.417 44.03819 46.17194 37.73711 0 1 0 + 1276 399 13 -0.834 55.33436 45.90772 50.69068 -1 0 0 + 1277 399 14 0.417 55.55455 46.77982 51.01809 -1 0 0 + 1278 399 14 0.417 55.09425 46.04877 49.77488 -1 0 0 + 1279 400 13 -0.834 56.15383 51.87018 43.92178 -1 0 1 + 1280 400 14 0.417 55.25073 52.12373 44.11256 -1 0 1 + 1281 400 14 0.417 56.65027 52.68628 43.98319 -1 0 1 + 1282 401 13 -0.834 62.38946 50.01240 45.94802 0 1 -2 + 1283 401 14 0.417 62.43815 50.07607 44.99418 0 1 -2 + 1284 401 14 0.417 61.47369 50.19932 46.15457 0 1 -2 + 1285 402 13 -0.834 53.60920 58.35575 46.37412 0 0 1 + 1286 402 14 0.417 53.25556 59.03071 45.79481 0 0 1 + 1287 402 14 0.417 53.24753 57.53627 46.03666 0 0 1 + 1288 403 13 -0.834 43.13375 42.07203 50.04429 1 0 0 + 1289 403 14 0.417 43.76099 42.76922 49.85267 1 0 0 + 1290 403 14 0.417 42.35437 42.53016 50.35879 1 0 0 + 1291 404 13 -0.834 47.41498 59.41146 52.77687 -1 -1 0 + 1292 404 14 0.417 47.81303 59.83868 53.53534 -1 -1 0 + 1293 404 14 0.417 48.01011 59.60512 52.05261 -1 -1 0 + 1294 405 13 -0.834 63.75607 47.28104 38.80571 0 2 -1 + 1295 405 14 0.417 63.78573 48.20840 38.57042 0 2 -1 + 1296 405 14 0.417 37.08655 47.17376 39.44769 1 2 -1 + 1297 406 13 -0.834 46.67594 56.20863 44.42866 1 1 0 + 1298 406 14 0.417 45.82140 56.15280 44.00100 1 1 0 + 1299 406 14 0.417 46.48292 56.12468 45.36243 1 1 0 + 1300 407 13 -0.834 62.54251 68.21194 54.20445 0 -1 1 + 1301 407 14 0.417 63.31640 41.15490 53.73696 0 0 1 + 1302 407 14 0.417 62.78865 67.34176 54.51819 0 -1 1 + 1303 408 13 -0.834 60.27010 54.96049 39.87633 0 0 0 + 1304 408 14 0.417 59.62959 55.67175 39.88547 0 0 0 + 1305 408 14 0.417 61.04761 55.33233 40.29281 0 0 0 + 1306 409 13 -0.834 40.02595 44.30132 44.29580 0 -2 0 + 1307 409 14 0.417 39.70595 44.75009 45.07839 0 -2 0 + 1308 409 14 0.417 39.56836 44.72725 43.57092 0 -2 0 + 1309 410 13 -0.834 54.20011 41.08252 35.61017 0 1 0 + 1310 410 14 0.417 55.10396 68.23613 35.83794 0 0 0 + 1311 410 14 0.417 54.27044 41.57221 34.79072 0 1 0 + 1312 411 13 -0.834 60.64478 45.93023 50.84376 1 1 -1 + 1313 411 14 0.417 60.80088 46.54647 51.55941 1 1 -1 + 1314 411 14 0.417 61.20574 46.24077 50.13303 1 1 -1 + 1315 412 13 -0.834 44.55137 44.47403 38.16771 1 0 -1 + 1316 412 14 0.417 45.28189 43.86333 38.26597 1 0 -1 + 1317 412 14 0.417 43.77025 43.93754 38.30281 1 0 -1 + 1318 413 13 -0.834 58.08933 62.76987 30.45191 1 -1 0 + 1319 413 14 0.417 57.64138 63.31997 29.80927 1 -1 0 + 1320 413 14 0.417 57.43674 62.11708 30.70545 1 -1 0 + 1321 414 13 -0.834 55.65273 56.71117 38.74877 1 0 1 + 1322 414 14 0.417 56.53260 56.59636 39.10779 1 0 1 + 1323 414 14 0.417 55.14964 55.98047 39.10825 1 0 1 + 1324 415 13 -0.834 55.50009 51.16952 38.77962 0 0 0 + 1325 415 14 0.417 54.95350 51.23711 37.99672 0 0 0 + 1326 415 14 0.417 55.53220 50.23190 38.96963 0 0 0 + 1327 416 13 -0.834 47.64702 52.79911 31.71446 0 -1 0 + 1328 416 14 0.417 48.52504 53.09556 31.47481 0 -1 0 + 1329 416 14 0.417 47.06032 53.44853 31.32681 0 -1 0 + 1330 417 13 -0.834 49.26727 42.35880 39.18566 1 1 -2 + 1331 417 14 0.417 50.02784 42.93912 39.15429 1 1 -2 + 1332 417 14 0.417 49.46495 41.74196 39.89040 1 1 -2 + 1333 418 13 -0.834 47.22542 64.65021 35.82232 1 -1 0 + 1334 418 14 0.417 46.76114 65.20346 36.45050 1 -1 0 + 1335 418 14 0.417 47.98585 65.16966 35.56120 1 -1 0 + 1336 419 13 -0.834 58.53686 56.85468 40.78587 1 1 0 + 1337 419 14 0.417 58.45283 56.63469 41.71365 1 1 0 + 1338 419 14 0.417 58.36285 57.79507 40.74550 1 1 0 + 1339 420 13 -0.834 50.09436 46.17981 48.16619 -1 -1 -2 + 1340 420 14 0.417 50.67249 45.42897 48.30138 -1 -1 -2 + 1341 420 14 0.417 50.49629 46.88624 48.67183 -1 -1 -2 + 1342 421 13 -0.834 42.30297 57.95379 33.48633 0 -1 1 + 1343 421 14 0.417 41.56921 57.39445 33.23136 0 -1 1 + 1344 421 14 0.417 43.00718 57.34235 33.70193 0 -1 1 + 1345 422 13 -0.834 45.76518 43.79811 54.82490 0 -1 0 + 1346 422 14 0.417 46.45133 43.55343 54.20397 0 -1 0 + 1347 422 14 0.417 45.87205 43.18693 55.55379 0 -1 0 + 1348 423 13 -0.834 59.33326 61.34125 37.96927 -1 -1 1 + 1349 423 14 0.417 59.29007 62.29004 38.08827 -1 -1 1 + 1350 423 14 0.417 59.90006 61.03609 38.67769 -1 -1 1 + 1351 424 13 -0.834 40.95662 63.48104 42.72192 1 -1 0 + 1352 424 14 0.417 40.33618 63.69074 42.02383 1 -1 0 + 1353 424 14 0.417 41.73946 63.17568 42.26346 1 -1 0 + 1354 425 13 -0.834 38.13662 59.25720 46.08402 1 -1 -1 + 1355 425 14 0.417 38.31499 59.03616 46.99811 1 -1 -1 + 1356 425 14 0.417 38.55502 58.55783 45.58196 1 -1 -1 + 1357 426 13 -0.834 48.88681 66.85051 54.82298 1 -2 0 + 1358 426 14 0.417 49.16879 67.45078 54.13275 1 -2 0 + 1359 426 14 0.417 49.42353 66.06836 54.69484 1 -2 0 + 1360 427 13 -0.834 45.88049 57.05477 48.46508 0 0 -1 + 1361 427 14 0.417 45.73709 57.90911 48.05793 0 0 -1 + 1362 427 14 0.417 45.83791 57.22701 49.40569 0 0 -1 + 1363 428 13 -0.834 39.37333 50.31613 37.93447 0 1 0 + 1364 428 14 0.417 39.11456 50.97624 37.29140 0 1 0 + 1365 428 14 0.417 38.97424 50.60960 38.75352 0 1 0 + 1366 429 13 -0.834 37.89753 62.82745 47.39297 0 -1 0 + 1367 429 14 0.417 38.39122 62.78202 46.57414 0 -1 0 + 1368 429 14 0.417 37.01605 63.08963 47.12747 0 -1 0 + 1369 430 13 -0.834 43.16514 41.31420 47.01379 0 1 0 + 1370 430 14 0.417 42.71409 41.22965 47.85382 0 1 0 + 1371 430 14 0.417 44.05112 68.36565 47.18386 0 0 0 + 1372 431 13 -0.834 47.03179 42.44477 42.46475 1 0 0 + 1373 431 14 0.417 46.12350 42.65285 42.24573 1 0 0 + 1374 431 14 0.417 47.53228 43.19970 42.15516 1 0 0 + 1375 432 13 -0.834 55.35894 54.15040 46.85340 0 -1 0 + 1376 432 14 0.417 54.76544 53.43667 46.61975 0 -1 0 + 1377 432 14 0.417 56.17133 53.71318 47.10853 0 -1 0 + 1378 433 13 -0.834 47.00663 55.28313 38.22800 -1 -2 1 + 1379 433 14 0.417 46.53490 56.00706 38.63987 -1 -2 1 + 1380 433 14 0.417 47.07459 54.61953 38.91449 -1 -2 1 + 1381 434 13 -0.834 57.16336 58.62297 32.33349 -1 0 2 + 1382 434 14 0.417 57.63330 57.80350 32.48798 -1 0 2 + 1383 434 14 0.417 56.24209 58.36680 32.29014 -1 0 2 + 1384 435 13 -0.834 37.23245 47.62479 56.34765 0 1 -1 + 1385 435 14 0.417 37.24274 47.21497 55.48268 0 1 -1 + 1386 435 14 0.417 37.36000 46.89905 56.95860 0 1 -1 + 1387 436 13 -0.834 48.77030 41.06015 29.86683 2 1 0 + 1388 436 14 0.417 48.81141 67.97117 56.39997 2 0 -1 + 1389 436 14 0.417 49.05230 67.78232 30.51123 2 0 0 + 1390 437 13 -0.834 49.10149 56.15638 36.66346 0 0 1 + 1391 437 14 0.417 48.50786 55.61659 36.14146 0 0 1 + 1392 437 14 0.417 48.61812 56.33305 37.47053 0 0 1 + 1393 438 13 -0.834 58.15731 59.39698 29.96092 0 -1 1 + 1394 438 14 0.417 58.20240 59.10993 30.87296 0 -1 1 + 1395 438 14 0.417 57.30076 59.81721 29.88367 0 -1 1 + 1396 439 13 -0.834 59.37068 41.03089 37.87324 1 0 0 + 1397 439 14 0.417 59.56889 41.95335 37.71194 1 0 0 + 1398 439 14 0.417 60.22643 67.97433 37.90167 1 -1 0 + 1399 440 13 -0.834 38.32241 55.03397 50.58952 1 0 0 + 1400 440 14 0.417 38.22793 54.19584 50.13692 1 0 0 + 1401 440 14 0.417 39.21785 55.31153 50.39614 1 0 0 + 1402 441 13 -0.834 36.94673 59.01778 33.00159 1 -1 2 + 1403 441 14 0.417 36.95260 59.97305 32.94091 1 -1 2 + 1404 441 14 0.417 63.71798 58.82680 33.72245 0 -1 2 + 1405 442 13 -0.834 62.50746 54.84239 54.03343 0 -1 0 + 1406 442 14 0.417 61.69710 54.35984 54.19681 0 -1 0 + 1407 442 14 0.417 63.09119 54.20097 53.62833 0 -1 0 + 1408 443 13 -0.834 40.59690 62.80012 38.69405 1 -1 1 + 1409 443 14 0.417 41.53881 62.90970 38.82458 1 -1 1 + 1410 443 14 0.417 40.36980 62.03187 39.21794 1 -1 1 + 1411 444 13 -0.834 37.67477 67.71471 42.59127 0 -1 -1 + 1412 444 14 0.417 38.12213 68.13627 41.85751 0 -1 -1 + 1413 444 14 0.417 38.28279 67.03643 42.88534 0 -1 -1 + 1414 445 13 -0.834 42.73681 50.65782 33.30839 1 1 0 + 1415 445 14 0.417 42.84587 51.15085 34.12157 1 1 0 + 1416 445 14 0.417 42.32631 51.27747 32.70527 1 1 0 + 1417 446 13 -0.834 37.13349 57.05842 55.81927 0 0 0 + 1418 446 14 0.417 37.95375 57.53453 55.68979 0 0 0 + 1419 446 14 0.417 36.99014 56.59807 54.99236 0 0 0 + 1420 447 13 -0.834 61.08039 63.50929 36.52096 -1 0 0 + 1421 447 14 0.417 60.44389 63.87414 37.13579 -1 0 0 + 1422 447 14 0.417 61.70642 63.04107 37.07331 -1 0 0 + 1423 448 13 -0.834 57.12289 46.04019 38.75954 0 0 0 + 1424 448 14 0.417 56.81351 45.55997 39.52760 0 0 0 + 1425 448 14 0.417 57.99543 45.68504 38.58988 0 0 0 + 1426 449 13 -0.834 45.45003 49.45347 49.54397 0 0 -1 + 1427 449 14 0.417 45.96611 49.34591 48.74502 0 0 -1 + 1428 449 14 0.417 46.09930 49.60861 50.22999 0 0 -1 + 1429 450 13 -0.834 37.77009 64.51990 42.66941 1 0 0 + 1430 450 14 0.417 38.49339 64.80040 43.23011 1 0 0 + 1431 450 14 0.417 38.14071 64.50928 41.78694 1 0 0 + 1432 451 13 -0.834 45.78323 57.65378 39.37062 1 0 0 + 1433 451 14 0.417 46.03758 58.03295 40.21190 1 0 0 + 1434 451 14 0.417 44.96217 58.09258 39.14803 1 0 0 + 1435 452 13 -0.834 56.96672 60.41636 47.59314 0 -1 1 + 1436 452 14 0.417 56.18373 60.11455 48.05365 0 -1 1 + 1437 452 14 0.417 56.65889 61.13663 47.04297 0 -1 1 + 1438 453 13 -0.834 52.44356 65.82746 35.82081 -1 -1 0 + 1439 453 14 0.417 53.10567 65.14225 35.91211 -1 -1 0 + 1440 453 14 0.417 52.93741 66.64611 35.86748 -1 -1 0 + 1441 454 13 -0.834 50.70912 51.42252 40.30021 0 0 -1 + 1442 454 14 0.417 50.97387 50.70177 39.72866 0 0 -1 + 1443 454 14 0.417 50.17774 51.98938 39.74116 0 0 -1 + 1444 455 13 -0.834 39.22290 45.94023 39.69239 2 1 -1 + 1445 455 14 0.417 39.63836 46.66722 39.22859 2 1 -1 + 1446 455 14 0.417 38.97218 45.32685 39.00164 2 1 -1 + 1447 456 13 -0.834 43.73041 61.86387 55.46954 2 0 0 + 1448 456 14 0.417 43.61274 62.32163 56.30192 2 0 0 + 1449 456 14 0.417 43.90401 62.55964 54.83549 2 0 0 + 1450 457 13 -0.834 61.51877 56.42039 33.84869 0 0 1 + 1451 457 14 0.417 62.17805 55.74211 33.70200 0 0 1 + 1452 457 14 0.417 62.00943 57.15723 34.21276 0 0 1 + 1453 458 13 -0.834 51.72050 63.63199 42.34406 1 0 1 + 1454 458 14 0.417 51.24482 64.43296 42.56407 1 0 1 + 1455 458 14 0.417 52.62118 63.92057 42.19669 1 0 1 + 1456 459 13 -0.834 54.73666 56.51839 51.73687 0 0 -1 + 1457 459 14 0.417 54.77503 56.56844 52.69200 0 0 -1 + 1458 459 14 0.417 54.91702 57.41111 51.44234 0 0 -1 + 1459 460 13 -0.834 50.97984 54.35591 33.27919 0 1 0 + 1460 460 14 0.417 50.47200 55.12727 33.02747 0 1 0 + 1461 460 14 0.417 50.36917 53.82187 33.78725 0 1 0 + 1462 461 13 -0.834 44.82656 54.45280 36.09973 1 0 2 + 1463 461 14 0.417 45.75766 54.23599 36.14740 1 0 2 + 1464 461 14 0.417 44.76968 55.11700 35.41283 1 0 2 + 1465 462 13 -0.834 58.05791 56.64716 55.29041 1 1 0 + 1466 462 14 0.417 58.98499 56.81997 55.45441 1 1 0 + 1467 462 14 0.417 57.82639 55.96338 55.91897 1 1 0 + 1468 463 13 -0.834 55.95112 61.02029 30.79757 1 0 1 + 1469 463 14 0.417 55.28483 61.63344 30.48711 1 0 1 + 1470 463 14 0.417 55.45357 60.27206 31.12748 1 0 1 + 1471 464 13 -0.834 54.80996 46.88659 45.41700 -1 0 0 + 1472 464 14 0.417 55.42348 46.16300 45.28950 -1 0 0 + 1473 464 14 0.417 54.08129 46.68997 44.82826 -1 0 0 + 1474 465 13 -0.834 60.19361 64.43268 31.92053 0 -1 2 + 1475 465 14 0.417 60.05792 63.85315 32.67017 0 -1 2 + 1476 465 14 0.417 60.47170 63.84993 31.21392 0 -1 2 + 1477 466 13 -0.834 45.55496 65.56032 30.88251 0 -1 1 + 1478 466 14 0.417 45.97644 64.70102 30.89691 0 -1 1 + 1479 466 14 0.417 45.82502 65.97384 31.70248 0 -1 1 + 1480 467 13 -0.834 52.92714 44.06759 29.88429 0 1 0 + 1481 467 14 0.417 52.39641 43.38446 30.29405 0 1 0 + 1482 467 14 0.417 53.79372 43.96686 30.27818 0 1 0 + 1483 468 13 -0.834 40.71534 55.31247 44.93070 1 0 0 + 1484 468 14 0.417 39.81994 55.07165 45.16841 1 0 0 + 1485 468 14 0.417 41.16802 54.47609 44.82218 1 0 0 + 1486 469 13 -0.834 64.04777 59.80626 42.91634 0 -1 -1 + 1487 469 14 0.417 37.09051 60.51146 43.41377 1 -1 -1 + 1488 469 14 0.417 37.01609 59.00291 43.31068 1 -1 -1 + 1489 470 13 -0.834 57.05030 49.72625 41.88829 -1 1 1 + 1490 470 14 0.417 56.75150 50.53290 42.30818 -1 1 1 + 1491 470 14 0.417 57.52176 50.02159 41.10935 -1 1 1 + 1492 471 13 -0.834 62.59447 67.67898 41.14714 -2 -2 1 + 1493 471 14 0.417 63.45155 67.57764 41.56112 -2 -2 1 + 1494 471 14 0.417 61.96974 67.40478 41.81854 -2 -2 1 + 1495 472 13 -0.834 62.98029 58.34420 35.34278 0 0 1 + 1496 472 14 0.417 62.45371 58.26151 36.13783 0 0 1 + 1497 472 14 0.417 63.83636 58.64077 35.65169 0 0 1 + 1498 473 13 -0.834 63.44584 56.74146 44.14484 0 1 -2 + 1499 473 14 0.417 64.13590 56.53036 44.77371 0 1 -2 + 1500 473 14 0.417 62.70665 57.02149 44.68470 0 1 -2 + 1501 474 13 -0.834 44.05905 56.56929 51.60681 1 0 -1 + 1502 474 14 0.417 43.57850 56.15764 52.32504 1 0 -1 + 1503 474 14 0.417 43.90344 55.99747 50.85512 1 0 -1 + 1504 475 13 -0.834 37.49588 59.31379 39.05252 0 0 0 + 1505 475 14 0.417 37.07904 58.45297 39.09112 0 0 0 + 1506 475 14 0.417 37.58867 59.49374 38.11696 0 0 0 + 1507 476 13 -0.834 54.75747 41.52122 56.48609 -1 1 0 + 1508 476 14 0.417 54.79987 42.39714 56.86981 -1 1 0 + 1509 476 14 0.417 54.80582 41.67034 55.54179 -1 1 0 + 1510 477 13 -0.834 42.91665 58.39379 47.91495 1 0 0 + 1511 477 14 0.417 43.70923 58.91951 47.80683 1 0 0 + 1512 477 14 0.417 42.28811 58.98861 48.32409 1 0 0 + 1513 478 13 -0.834 60.63731 64.78822 56.03697 -2 1 -1 + 1514 478 14 0.417 60.86485 63.91302 56.35082 -2 1 -1 + 1515 478 14 0.417 60.50973 65.30321 56.83369 -2 1 -1 + 1516 479 13 -0.834 52.85180 54.69512 43.09842 0 0 1 + 1517 479 14 0.417 52.31485 55.13373 42.43846 0 0 1 + 1518 479 14 0.417 53.08000 53.85428 42.70200 0 0 1 + 1519 480 13 -0.834 51.49497 54.97356 38.95012 -2 1 -1 + 1520 480 14 0.417 50.77717 54.34090 38.97811 -2 1 -1 + 1521 480 14 0.417 51.51597 55.35169 39.82923 -2 1 -1 + 1522 481 13 -0.834 40.46924 62.02458 56.36341 1 0 -1 + 1523 481 14 0.417 40.45814 61.65439 55.48076 1 0 -1 + 1524 481 14 0.417 40.81799 62.90856 56.24853 1 0 -1 + 1525 482 13 -0.834 52.26692 56.29032 45.24820 0 2 1 + 1526 482 14 0.417 51.65227 56.79794 44.71834 0 2 1 + 1527 482 14 0.417 52.43092 55.49973 44.73408 0 2 1 + 1528 483 13 -0.834 53.46372 44.63556 52.39623 -1 1 1 + 1529 483 14 0.417 53.51664 45.03502 53.26448 -1 1 1 + 1530 483 14 0.417 54.08491 45.13343 51.86474 -1 1 1 + 1531 484 13 -0.834 42.90202 49.87822 40.32919 0 2 1 + 1532 484 14 0.417 42.40392 49.63281 41.10889 0 2 1 + 1533 484 14 0.417 42.31302 50.45172 39.83885 0 2 1 + 1534 485 13 -0.834 43.07357 64.57931 39.44006 2 1 1 + 1535 485 14 0.417 42.79300 64.80186 38.55237 2 1 1 + 1536 485 14 0.417 43.26869 65.42268 39.84860 2 1 1 + 1537 486 13 -0.834 38.86691 42.35197 55.12826 1 1 -1 + 1538 486 14 0.417 38.06621 42.87541 55.16185 1 1 -1 + 1539 486 14 0.417 39.52681 42.89488 55.55954 1 1 -1 + 1540 487 13 -0.834 59.15412 47.19863 55.46904 0 -1 0 + 1541 487 14 0.417 59.83963 46.99833 56.10636 0 -1 0 + 1542 487 14 0.417 58.74433 46.35364 55.28381 0 -1 0 + 1543 488 13 -0.834 52.12071 45.94110 44.23903 1 1 0 + 1544 488 14 0.417 51.89927 45.05144 44.51416 1 1 0 + 1545 488 14 0.417 52.26697 45.87115 43.29566 1 1 0 + 1546 489 13 -0.834 41.73140 52.23741 31.27732 0 0 1 + 1547 489 14 0.417 40.84403 52.55314 31.44796 0 0 1 + 1548 489 14 0.417 41.81503 52.26011 30.32405 0 0 1 + 1549 490 13 -0.834 38.46034 66.01701 52.27886 1 0 -1 + 1550 490 14 0.417 39.39276 66.02392 52.49517 1 0 -1 + 1551 490 14 0.417 38.11246 66.80769 52.69121 1 0 -1 + 1552 491 13 -0.834 42.13838 67.12262 54.88509 0 0 -3 + 1553 491 14 0.417 42.22460 67.38235 53.96784 0 0 -3 + 1554 491 14 0.417 42.96673 67.38388 55.28736 0 0 -3 + 1555 492 13 -0.834 37.89607 66.86351 46.16867 -1 -1 -1 + 1556 492 14 0.417 38.03129 66.98073 47.10899 -1 -1 -1 + 1557 492 14 0.417 38.75367 66.60168 45.83369 -1 -1 -1 + 1558 493 13 -0.834 40.37538 58.21424 30.88318 0 -1 0 + 1559 493 14 0.417 41.23010 58.63566 30.79307 0 -1 0 + 1560 493 14 0.417 40.45502 57.40101 30.38463 0 -1 0 + 1561 494 13 -0.834 54.56531 48.85249 32.17940 1 -2 2 + 1562 494 14 0.417 54.90082 48.98086 31.29216 1 -2 2 + 1563 494 14 0.417 54.03604 49.63141 32.35086 1 -2 2 + 1564 495 13 -0.834 63.56488 49.70113 37.88594 0 -1 1 + 1565 495 14 0.417 63.93261 49.40780 37.05228 0 -1 1 + 1566 495 14 0.417 63.98151 50.54765 38.04739 0 -1 1 + 1567 496 13 -0.834 39.26126 54.76920 54.71493 2 -1 2 + 1568 496 14 0.417 38.75402 55.21237 54.03483 2 -1 2 + 1569 496 14 0.417 38.67139 54.73109 55.46781 2 -1 2 + 1570 497 13 -0.834 42.78607 47.20625 49.30057 2 -1 0 + 1571 497 14 0.417 42.93670 46.34815 48.90404 2 -1 0 + 1572 497 14 0.417 43.53800 47.33917 49.87780 2 -1 0 + 1573 498 13 -0.834 59.99490 55.30114 50.55687 0 1 -1 + 1574 498 14 0.417 60.84158 55.66821 50.81111 0 1 -1 + 1575 498 14 0.417 59.38335 56.03363 50.63237 0 1 -1 + 1576 499 13 -0.834 57.95276 49.30660 54.37087 1 -1 -1 + 1577 499 14 0.417 57.34184 49.29544 55.10769 1 -1 -1 + 1578 499 14 0.417 58.55272 48.58151 54.54557 1 -1 -1 + 1579 500 13 -0.834 43.43041 64.04345 57.10111 1 -1 -1 + 1580 500 14 0.417 43.03742 64.07155 30.60210 1 -1 0 + 1581 500 14 0.417 44.26016 64.51104 29.82515 1 -1 0 + 1582 501 13 -0.834 40.71066 57.82778 50.85579 1 -1 -1 + 1583 501 14 0.417 41.04411 57.83612 51.75299 1 -1 -1 + 1584 501 14 0.417 40.96886 58.67633 50.49590 1 -1 -1 + 1585 502 13 -0.834 61.21331 60.53661 39.63578 1 -1 0 + 1586 502 14 0.417 61.87151 61.23113 39.61011 1 -1 0 + 1587 502 14 0.417 61.32085 60.13583 40.49837 1 -1 0 + 1588 503 13 -0.834 43.54081 65.33296 49.47114 1 -1 -1 + 1589 503 14 0.417 42.67637 65.41138 49.06762 1 -1 -1 + 1590 503 14 0.417 43.36562 64.99829 50.35065 1 -1 -1 + 1591 504 13 -0.834 50.27329 53.06087 30.87109 -1 0 1 + 1592 504 14 0.417 50.38769 53.42204 29.99204 -1 0 1 + 1593 504 14 0.417 50.86354 53.57620 31.42092 -1 0 1 + 1594 505 13 -0.834 40.29157 66.01889 32.67757 0 -1 0 + 1595 505 14 0.417 40.18198 66.27998 31.76320 0 -1 0 + 1596 505 14 0.417 39.39873 65.90460 33.00317 0 -1 0 + 1597 506 13 -0.834 48.15372 67.97019 44.25255 1 -1 1 + 1598 506 14 0.417 47.34263 67.52534 44.49854 1 -1 1 + 1599 506 14 0.417 47.87159 41.31478 43.68328 1 0 1 + 1600 507 13 -0.834 53.38019 63.98437 38.13827 0 0 -1 + 1601 507 14 0.417 54.19463 63.69976 37.72362 0 0 -1 + 1602 507 14 0.417 53.59582 64.82739 38.53711 0 0 -1 + 1603 508 13 -0.834 40.87597 58.12305 53.50808 0 0 0 + 1604 508 14 0.417 40.17916 58.26636 54.14852 0 0 0 + 1605 508 14 0.417 41.66044 58.48234 53.92256 0 0 0 + 1606 509 13 -0.834 38.19887 52.28056 36.30714 2 0 -1 + 1607 509 14 0.417 38.20463 53.19038 36.60452 2 0 -1 + 1608 509 14 0.417 38.09924 52.33929 35.35695 2 0 -1 + 1609 510 13 -0.834 49.63883 57.32410 43.72359 0 -1 0 + 1610 510 14 0.417 49.72446 58.17232 43.28833 0 -1 0 + 1611 510 14 0.417 48.76183 57.33851 44.10688 0 -1 0 + 1612 511 13 -0.834 42.58791 59.61362 29.86455 1 0 0 + 1613 511 14 0.417 43.07246 58.91969 56.78877 1 0 -1 + 1614 511 14 0.417 42.69535 60.38141 56.67447 1 0 -1 + 1615 512 13 -0.834 50.76111 60.95449 46.98165 -1 0 -1 + 1616 512 14 0.417 50.90477 61.15450 47.90663 -1 0 -1 + 1617 512 14 0.417 50.20825 61.66875 46.66473 -1 0 -1 + 1618 513 13 -0.834 43.18406 55.61939 48.08539 1 0 0 + 1619 513 14 0.417 43.11229 56.55752 47.90932 1 0 0 + 1620 513 14 0.417 44.01330 55.36231 47.68228 1 0 0 + 1621 514 13 -0.834 54.67377 64.76817 41.62522 1 0 1 + 1622 514 14 0.417 54.39407 65.19031 40.81294 1 0 1 + 1623 514 14 0.417 55.29742 65.38243 42.01250 1 0 1 + 1624 515 13 -0.834 53.87383 68.12810 51.72031 0 -1 0 + 1625 515 14 0.417 53.06918 41.24938 51.55887 0 0 0 + 1626 515 14 0.417 53.74278 67.72971 52.58074 0 -1 0 + 1627 516 13 -0.834 38.24785 41.26767 33.50598 2 0 0 + 1628 516 14 0.417 38.16490 67.75301 33.15337 2 -1 0 + 1629 516 14 0.417 37.95757 41.83753 32.79377 2 0 0 + 1630 517 13 -0.834 47.35008 61.96125 42.94580 2 -2 0 + 1631 517 14 0.417 47.46077 62.90828 43.03015 2 -2 0 + 1632 517 14 0.417 47.09087 61.83022 42.03373 2 -2 0 + 1633 518 13 -0.834 40.55210 54.00820 41.89137 1 -1 1 + 1634 518 14 0.417 39.80099 54.24986 41.34946 1 -1 1 + 1635 518 14 0.417 40.19429 53.40377 42.54166 1 -1 1 + 1636 519 13 -0.834 57.17705 64.40362 55.44286 1 -1 -1 + 1637 519 14 0.417 56.34510 64.78670 55.72097 1 -1 -1 + 1638 519 14 0.417 57.64987 65.12814 55.03330 1 -1 -1 + 1639 520 13 -0.834 41.86955 59.84132 42.65268 0 -1 1 + 1640 520 14 0.417 41.72011 59.11980 43.26367 0 -1 1 + 1641 520 14 0.417 42.24995 60.53605 43.19017 0 -1 1 + 1642 521 13 -0.834 61.62566 57.26645 46.18447 0 -1 -1 + 1643 521 14 0.417 60.68119 57.41642 46.22577 0 -1 -1 + 1644 521 14 0.417 61.98987 57.84356 46.85569 0 -1 -1 + 1645 522 13 -0.834 46.82701 65.68647 41.03579 0 0 0 + 1646 522 14 0.417 46.01385 65.85266 41.51264 0 0 0 + 1647 522 14 0.417 47.44009 65.38297 41.70531 0 0 0 + 1648 523 13 -0.834 54.12960 45.94549 32.81485 0 0 1 + 1649 523 14 0.417 53.25962 45.65636 32.53955 0 0 1 + 1650 523 14 0.417 54.18942 46.85072 32.50950 0 0 1 + 1651 524 13 -0.834 43.71268 59.97805 32.34985 1 1 0 + 1652 524 14 0.417 43.46300 59.27568 32.95033 1 1 0 + 1653 524 14 0.417 42.94131 60.10757 31.79808 1 1 0 + 1654 525 13 -0.834 50.10604 48.47250 49.62054 1 0 -2 + 1655 525 14 0.417 50.96037 48.77303 49.31064 1 0 -2 + 1656 525 14 0.417 50.19320 48.44287 50.57331 1 0 -2 + 1657 526 13 -0.834 54.68660 60.38920 43.62499 0 0 0 + 1658 526 14 0.417 54.62862 59.85089 42.83561 0 0 0 + 1659 526 14 0.417 53.78667 60.44045 43.94712 0 0 0 + 1660 527 13 -0.834 56.35115 44.75736 40.87552 0 -1 -1 + 1661 527 14 0.417 56.99705 44.99197 41.54186 0 -1 -1 + 1662 527 14 0.417 55.55387 44.56808 41.37024 0 -1 -1 + 1663 528 13 -0.834 48.77009 62.36934 40.44473 0 -1 0 + 1664 528 14 0.417 49.30266 62.60520 41.20432 0 -1 0 + 1665 528 14 0.417 49.04689 62.97756 39.75939 0 -1 0 + 1666 529 13 -0.834 45.88757 58.55209 41.94547 0 1 0 + 1667 529 14 0.417 46.76719 58.27665 42.20365 0 1 0 + 1668 529 14 0.417 45.35604 57.75963 42.02128 0 1 0 + 1669 530 13 -0.834 39.44116 52.22097 43.65725 1 0 2 + 1670 530 14 0.417 39.30570 52.06689 44.59221 1 0 2 + 1671 530 14 0.417 38.61744 52.60378 43.35530 1 0 2 + 1672 531 13 -0.834 43.95976 66.73852 41.23250 1 0 1 + 1673 531 14 0.417 44.64454 67.13772 40.69588 1 0 1 + 1674 531 14 0.417 43.40678 67.47232 41.50081 1 0 1 + 1675 532 13 -0.834 62.99634 65.50241 54.70446 0 -1 -1 + 1676 532 14 0.417 63.58398 64.98613 55.25617 0 -1 -1 + 1677 532 14 0.417 62.12519 65.14960 54.88585 0 -1 -1 + 1678 533 13 -0.834 62.92898 53.27582 44.77167 0 0 0 + 1679 533 14 0.417 62.08998 53.60880 45.09018 0 0 0 + 1680 533 14 0.417 62.85751 52.32504 44.85618 0 0 0 + 1681 534 13 -0.834 63.31201 43.08081 48.29805 -1 0 -1 + 1682 534 14 0.417 63.01276 42.23705 47.95930 -1 0 -1 + 1683 534 14 0.417 63.67142 43.53221 47.53431 -1 0 -1 + 1684 535 13 -0.834 47.11867 63.34781 55.06249 0 0 -1 + 1685 535 14 0.417 47.19267 64.30022 55.00160 0 0 -1 + 1686 535 14 0.417 46.22495 63.15783 54.77716 0 0 -1 + 1687 536 13 -0.834 60.37216 67.91341 52.27568 -1 0 0 + 1688 536 14 0.417 61.05051 68.14950 52.90839 -1 0 0 + 1689 536 14 0.417 60.81546 67.93922 51.42771 -1 0 0 + 1690 537 13 -0.834 60.04315 43.26291 35.25445 -1 1 1 + 1691 537 14 0.417 60.42501 44.05815 35.62593 -1 1 1 + 1692 537 14 0.417 60.79709 42.72574 35.01102 -1 1 1 + 1693 538 13 -0.834 53.03851 55.52589 47.75769 0 0 -1 + 1694 538 14 0.417 53.93635 55.46537 47.43136 0 0 -1 + 1695 538 14 0.417 52.51527 55.73342 46.98347 0 0 -1 + 1696 539 13 -0.834 37.91895 50.43697 56.37325 0 0 0 + 1697 539 14 0.417 37.51622 49.56884 56.35299 0 0 0 + 1698 539 14 0.417 38.37591 50.50915 55.53527 0 0 0 + 1699 540 13 -0.834 50.50006 63.56852 38.27177 1 1 0 + 1700 540 14 0.417 50.22462 63.18436 37.43944 1 1 0 + 1701 540 14 0.417 51.44083 63.71275 38.16986 1 1 0 + 1702 541 13 -0.834 49.44600 43.95446 42.01861 0 0 1 + 1703 541 14 0.417 49.59639 44.80378 41.60354 0 0 1 + 1704 541 14 0.417 49.73882 44.07372 42.92211 0 0 1 + 1705 542 13 -0.834 50.98365 47.23031 39.51901 1 0 1 + 1706 542 14 0.417 51.18743 48.09631 39.16579 1 0 1 + 1707 542 14 0.417 50.03928 47.13635 39.39410 1 0 1 + 1708 543 13 -0.834 45.54625 60.20130 44.30493 0 0 2 + 1709 543 14 0.417 46.27140 60.62480 43.84553 0 0 2 + 1710 543 14 0.417 45.09838 59.69256 43.62904 0 0 2 + 1711 544 13 -0.834 60.48207 53.69772 48.42686 0 0 1 + 1712 544 14 0.417 60.03677 54.31581 49.00644 0 0 1 + 1713 544 14 0.417 59.89364 52.94407 48.38216 0 0 1 + 1714 545 13 -0.834 63.04952 45.83903 48.97963 -1 1 1 + 1715 545 14 0.417 63.88202 45.63831 49.40729 -1 1 1 + 1716 545 14 0.417 62.76408 45.00498 48.60667 -1 1 1 + 1717 546 13 -0.834 40.62890 44.95273 52.60003 2 -1 -2 + 1718 546 14 0.417 41.29110 45.55853 52.26721 2 -1 -2 + 1719 546 14 0.417 40.33885 45.34348 53.42431 2 -1 -2 + 1720 547 13 -0.834 39.91743 46.12102 55.72693 -1 1 -1 + 1721 547 14 0.417 40.70381 45.68274 56.05216 -1 1 -1 + 1722 547 14 0.417 39.19323 45.65943 56.14967 -1 1 -1 + 1723 548 13 -0.834 42.06829 45.07566 41.79962 0 0 -1 + 1724 548 14 0.417 41.61985 45.91039 41.93531 0 0 -1 + 1725 548 14 0.417 41.86481 44.56390 42.58253 0 0 -1 + 1726 549 13 -0.834 44.17588 49.40877 37.86902 1 1 0 + 1727 549 14 0.417 43.85185 49.35470 38.76808 1 1 0 + 1728 549 14 0.417 43.95346 48.56183 37.48242 1 1 0 + 1729 550 13 -0.834 52.64793 63.92130 45.68237 0 1 0 + 1730 550 14 0.417 52.63502 62.96908 45.58561 0 1 0 + 1731 550 14 0.417 52.43571 64.07178 46.60356 0 1 0 + 1732 551 13 -0.834 51.57615 43.64864 38.83377 1 1 0 + 1733 551 14 0.417 51.74260 43.03820 38.11551 1 1 0 + 1734 551 14 0.417 52.20192 44.35945 38.69449 1 1 0 + 1735 552 13 -0.834 62.02099 63.12241 47.73587 0 1 0 + 1736 552 14 0.417 61.17806 62.75352 47.99973 0 1 0 + 1737 552 14 0.417 62.48263 62.39363 47.32116 0 1 0 + 1738 553 13 -0.834 38.41497 51.40373 50.93034 1 1 0 + 1739 553 14 0.417 37.60807 51.12879 50.49494 1 1 0 + 1740 553 14 0.417 38.99796 51.65996 50.21571 1 1 0 + 1741 554 13 -0.834 51.96339 44.25313 49.02477 0 0 0 + 1742 554 14 0.417 52.81680 44.60151 49.28274 0 0 0 + 1743 554 14 0.417 52.16570 43.57682 48.37831 0 0 0 + 1744 555 13 -0.834 43.58422 51.42052 49.88959 0 1 -1 + 1745 555 14 0.417 42.74054 51.00549 50.06897 0 1 -1 + 1746 555 14 0.417 44.20160 50.69175 49.82657 0 1 -1 + 1747 556 13 -0.834 52.39836 53.43568 49.29165 1 0 -1 + 1748 556 14 0.417 51.88756 52.90169 48.68323 1 0 -1 + 1749 556 14 0.417 52.64451 54.20889 48.78391 1 0 -1 + 1750 557 13 -0.834 57.76885 46.61656 49.32842 0 1 0 + 1751 557 14 0.417 57.83718 46.26991 48.43879 0 1 0 + 1752 557 14 0.417 58.65246 46.53329 49.68694 0 1 0 + 1753 558 13 -0.834 59.20868 56.75211 36.79427 0 1 -1 + 1754 558 14 0.417 59.74268 56.20033 36.22276 0 1 -1 + 1755 558 14 0.417 58.75094 56.13459 37.36470 0 1 -1 + 1756 559 13 -0.834 51.74055 42.45875 36.24184 0 1 1 + 1757 559 14 0.417 51.04879 41.79745 36.22260 0 1 1 + 1758 559 14 0.417 52.52794 41.99055 35.96429 0 1 1 + 1759 560 13 -0.834 56.37631 67.32150 33.05439 -1 0 1 + 1760 560 14 0.417 56.52797 66.39716 33.25152 -1 0 1 + 1761 560 14 0.417 56.88845 67.79399 33.71068 -1 0 1 + 1762 561 13 -0.834 54.61713 62.99597 56.69158 0 1 -1 + 1763 561 14 0.417 54.59393 63.94258 56.83172 0 1 -1 + 1764 561 14 0.417 54.12883 62.86158 55.87934 0 1 -1 + 1765 562 13 -0.834 59.12420 67.78462 34.49420 0 -1 1 + 1766 562 14 0.417 59.61921 67.94665 33.69111 0 -1 1 + 1767 562 14 0.417 59.22686 41.21594 35.00547 0 0 1 + 1768 563 13 -0.834 63.35827 53.14027 38.43168 -1 0 0 + 1769 563 14 0.417 62.48186 53.05933 38.05538 -1 0 0 + 1770 563 14 0.417 63.87715 53.55740 37.74392 -1 0 0 + 1771 564 13 -0.834 50.05518 64.80335 44.94078 1 0 -2 + 1772 564 14 0.417 50.16173 65.71408 44.66608 1 0 -2 + 1773 564 14 0.417 50.94818 64.48993 45.08424 1 0 -2 + 1774 565 13 -0.834 61.91076 61.67486 44.00650 0 -3 0 + 1775 565 14 0.417 61.40514 60.86646 44.09077 0 -3 0 + 1776 565 14 0.417 62.58390 61.60857 44.68380 0 -3 0 + 1777 566 13 -0.834 61.53884 41.33016 50.02212 -1 0 -1 + 1778 566 14 0.417 61.75835 68.35836 49.15591 -1 -1 -1 + 1779 566 14 0.417 62.19075 42.01255 50.18215 -1 0 -1 + 1780 567 13 -0.834 54.81641 49.94673 49.66324 0 -1 -1 + 1781 567 14 0.417 54.81533 50.72359 50.22249 0 -1 -1 + 1782 567 14 0.417 53.94410 49.93341 49.26932 0 -1 -1 + 1783 568 13 -0.834 60.68933 64.00249 53.56679 -1 -1 -1 + 1784 568 14 0.417 60.72666 63.10922 53.90872 -1 -1 -1 + 1785 568 14 0.417 60.37485 64.52808 54.30238 -1 -1 -1 + 1786 569 13 -0.834 55.51605 42.60469 53.96890 0 -1 0 + 1787 569 14 0.417 55.82084 42.66633 53.06360 0 -1 0 + 1788 569 14 0.417 54.99565 43.39708 54.10137 0 -1 0 + 1789 570 13 -0.834 43.79008 68.23755 52.31171 2 -1 1 + 1790 570 14 0.417 43.47705 41.06627 51.42954 2 0 1 + 1791 570 14 0.417 44.72624 68.07073 52.20206 2 -1 1 + 1792 571 13 -0.834 40.19615 44.94623 32.57234 0 0 1 + 1793 571 14 0.417 40.90940 45.49825 32.25173 0 0 1 + 1794 571 14 0.417 40.42796 44.75889 33.48196 0 0 1 + 1795 572 13 -0.834 51.93921 56.60019 36.60262 -1 0 1 + 1796 572 14 0.417 51.78399 56.35099 37.51368 -1 0 1 + 1797 572 14 0.417 51.06469 56.74242 36.24039 -1 0 1 + 1798 573 13 -0.834 61.66916 50.48338 53.29865 -1 0 -2 + 1799 573 14 0.417 61.63036 50.41309 54.25248 -1 0 -2 + 1800 573 14 0.417 60.77283 50.69388 53.03687 -1 0 -2 + 1801 574 13 -0.834 51.74160 54.87485 56.16871 0 -1 0 + 1802 574 14 0.417 50.91429 55.26706 56.44795 0 -1 0 + 1803 574 14 0.417 51.91124 55.25931 55.30869 0 -1 0 + 1804 575 13 -0.834 40.85698 68.18248 30.13155 1 -1 0 + 1805 575 14 0.417 41.30492 67.87357 56.71541 1 -1 -1 + 1806 575 14 0.417 41.55175 41.19073 30.66952 1 0 0 + 1807 576 13 -0.834 50.89809 58.89690 54.50288 -1 0 0 + 1808 576 14 0.417 50.06229 58.64352 54.89466 -1 0 0 + 1809 576 14 0.417 51.37024 59.33797 55.20914 -1 0 0 + 1810 577 13 -0.834 58.37524 67.95427 49.91095 0 1 0 + 1811 577 14 0.417 57.83519 41.29391 50.25604 0 2 0 + 1812 577 14 0.417 59.26942 68.19076 50.15744 0 1 0 + 1813 578 13 -0.834 51.40785 46.48357 30.68744 1 0 1 + 1814 578 14 0.417 52.21871 45.99275 30.55389 1 0 1 + 1815 578 14 0.417 50.76683 45.82189 30.94725 1 0 1 + 1816 579 13 -0.834 57.04032 43.52295 36.91237 0 0 0 + 1817 579 14 0.417 56.97310 44.35969 36.45239 0 0 0 + 1818 579 14 0.417 57.91622 43.53095 37.29833 0 0 0 + 1819 580 13 -0.834 48.05479 47.92450 33.11226 0 0 1 + 1820 580 14 0.417 47.68291 48.79527 32.97186 0 0 1 + 1821 580 14 0.417 48.92592 48.09081 33.47242 0 0 1 + 1822 581 13 -0.834 52.31083 59.89064 56.95945 1 -2 -1 + 1823 581 14 0.417 51.77727 60.32576 30.25310 1 -2 0 + 1824 581 14 0.417 52.84806 60.59010 56.58744 1 -2 -1 + 1825 582 13 -0.834 49.28190 53.14534 38.62511 0 0 1 + 1826 582 14 0.417 48.56647 53.70668 38.92395 0 0 1 + 1827 582 14 0.417 48.86634 52.52585 38.02526 0 0 1 + 1828 583 13 -0.834 48.15214 51.90611 34.43290 2 0 0 + 1829 583 14 0.417 48.57405 51.97443 33.57642 2 0 0 + 1830 583 14 0.417 47.22654 51.76503 34.23389 2 0 0 + 1831 584 13 -0.834 61.27546 54.09168 30.34511 0 1 1 + 1832 584 14 0.417 61.26898 53.84689 31.27046 0 1 1 + 1833 584 14 0.417 62.02427 53.62196 29.97785 0 1 1 + 1834 585 13 -0.834 47.15916 50.47662 53.78471 0 -1 0 + 1835 585 14 0.417 47.32648 50.93912 54.60588 0 -1 0 + 1836 585 14 0.417 46.29671 50.78520 53.50690 0 -1 0 + 1837 586 13 -0.834 58.58091 63.09753 49.23949 0 -1 1 + 1838 586 14 0.417 59.43607 63.50227 49.38484 0 -1 1 + 1839 586 14 0.417 58.76326 62.34843 48.67219 0 -1 1 + 1840 587 13 -0.834 55.82082 49.65937 30.11648 0 1 1 + 1841 587 14 0.417 56.52757 49.92139 30.70647 0 1 1 + 1842 587 14 0.417 55.68213 50.42183 56.92602 0 1 0 + 1843 588 13 -0.834 63.79581 52.53565 53.17702 0 -2 1 + 1844 588 14 0.417 36.89869 52.41207 52.35479 1 -2 1 + 1845 588 14 0.417 63.12882 51.84908 53.17487 0 -2 1 + 1846 589 13 -0.834 58.30874 56.36537 43.52715 0 0 3 + 1847 589 14 0.417 58.58025 56.80205 44.33452 0 0 3 + 1848 589 14 0.417 57.40732 56.09029 43.69457 0 0 3 + 1849 590 13 -0.834 38.42652 61.06904 33.48425 0 -2 -1 + 1850 590 14 0.417 39.08604 61.75763 33.56856 0 -2 -1 + 1851 590 14 0.417 38.90648 60.25628 33.64334 0 -2 -1 + 1852 591 13 -0.834 46.61439 51.58566 41.81121 1 -1 0 + 1853 591 14 0.417 46.97646 51.37067 42.67082 1 -1 0 + 1854 591 14 0.417 46.41089 50.73724 41.41750 1 -1 0 + 1855 592 13 -0.834 60.01555 43.31814 42.71405 1 0 1 + 1856 592 14 0.417 60.52150 42.79903 43.33920 1 0 1 + 1857 592 14 0.417 59.90024 42.74003 41.95989 1 0 1 + 1858 593 13 -0.834 44.88246 59.34852 51.75271 1 0 -1 + 1859 593 14 0.417 45.75263 59.37400 52.15069 1 0 -1 + 1860 593 14 0.417 44.67274 58.41644 51.69374 1 0 -1 + 1861 594 13 -0.834 58.22051 53.10280 51.15729 0 -1 0 + 1862 594 14 0.417 58.53381 52.60654 51.91346 0 -1 0 + 1863 594 14 0.417 58.92607 53.72100 50.96688 0 -1 0 + 1864 595 13 -0.834 52.85332 67.67658 42.66705 0 -1 0 + 1865 595 14 0.417 53.29462 67.40699 41.86157 0 -1 0 + 1866 595 14 0.417 53.28090 67.16860 43.35652 0 -1 0 + 1867 596 13 -0.834 60.42773 53.38162 37.56585 0 0 1 + 1868 596 14 0.417 60.55482 53.97513 38.30601 0 0 1 + 1869 596 14 0.417 59.53313 53.05721 37.66924 0 0 1 + 1870 597 13 -0.834 56.52028 65.87791 50.38146 0 0 1 + 1871 597 14 0.417 56.94337 66.73645 50.39389 0 0 1 + 1872 597 14 0.417 57.02985 65.35034 50.99649 0 0 1 + 1873 598 13 -0.834 54.80064 62.49993 33.68680 1 0 1 + 1874 598 14 0.417 55.58425 61.96146 33.79744 1 0 1 + 1875 598 14 0.417 55.10591 63.27334 33.21259 1 0 1 + 1876 599 13 -0.834 44.11783 61.90196 34.52932 1 1 -1 + 1877 599 14 0.417 44.98641 61.86349 34.92975 1 1 -1 + 1878 599 14 0.417 44.21923 61.44892 33.69223 1 1 -1 + 1879 600 13 -0.834 47.64060 51.80694 44.33090 -1 -1 0 + 1880 600 14 0.417 48.33775 51.24158 44.66345 -1 -1 0 + 1881 600 14 0.417 47.96940 52.69619 44.46262 -1 -1 0 + 1882 601 13 -0.834 56.93644 64.17109 32.73010 0 -2 0 + 1883 601 14 0.417 57.35484 63.79547 31.95543 0 -2 0 + 1884 601 14 0.417 57.46604 63.85913 33.46389 0 -2 0 + 1885 602 13 -0.834 40.19928 60.95715 53.68963 1 0 -1 + 1886 602 14 0.417 41.08822 60.76154 53.39341 1 0 -1 + 1887 602 14 0.417 39.80336 61.43545 52.96114 1 0 -1 + 1888 603 13 -0.834 56.02366 41.52320 41.07986 0 1 0 + 1889 603 14 0.417 55.42766 41.48842 40.33165 0 1 0 + 1890 603 14 0.417 55.93467 42.41489 41.41631 0 1 0 + 1891 604 13 -0.834 52.35261 67.43639 29.83633 -1 0 0 + 1892 604 14 0.417 53.08703 67.77971 56.69878 -1 0 -1 + 1893 604 14 0.417 51.97673 68.20568 30.26426 -1 0 0 + 1894 605 13 -0.834 51.14102 49.90060 37.90539 1 0 1 + 1895 605 14 0.417 51.41236 49.08269 37.48865 1 0 1 + 1896 605 14 0.417 50.32915 50.13989 37.45830 1 0 1 + 1897 606 13 -0.834 48.40753 57.18555 40.43062 0 0 0 + 1898 606 14 0.417 47.74030 57.19949 39.74445 0 0 0 + 1899 606 14 0.417 48.68357 58.09814 40.51553 0 0 0 + 1900 607 13 -0.834 38.43185 54.52830 40.23522 1 -2 1 + 1901 607 14 0.417 37.76601 54.24704 40.86274 1 -2 1 + 1902 607 14 0.417 37.95756 54.62565 39.40951 1 -2 1 + 1903 608 13 -0.834 52.97765 52.38562 41.57118 0 0 0 + 1904 608 14 0.417 52.16773 52.00413 41.23247 0 0 0 + 1905 608 14 0.417 53.62059 51.67937 41.50742 0 0 0 + 1906 609 13 -0.834 52.82978 61.35779 35.40768 0 1 -2 + 1907 609 14 0.417 53.63682 61.71145 35.03372 0 1 -2 + 1908 609 14 0.417 53.10766 60.57217 35.87865 0 1 -2 + 1909 610 13 -0.834 55.37636 43.79165 30.66790 0 0 0 + 1910 610 14 0.417 55.82860 43.25432 31.31827 0 0 0 + 1911 610 14 0.417 55.97415 44.52040 30.50110 0 0 0 + 1912 611 13 -0.834 37.90570 54.55715 45.50029 1 -2 -1 + 1913 611 14 0.417 37.12871 54.09851 45.18066 1 -2 -1 + 1914 611 14 0.417 38.24821 53.99402 46.19441 1 -2 -1 + 1915 612 13 -0.834 60.01324 50.96528 45.16358 1 1 0 + 1916 612 14 0.417 59.85669 51.13906 44.23539 1 1 0 + 1917 612 14 0.417 59.48415 50.19096 45.35532 1 1 0 + 1918 613 13 -0.834 38.84394 52.32942 30.93040 2 1 0 + 1919 613 14 0.417 38.51878 51.61086 30.38802 2 1 0 + 1920 613 14 0.417 38.41000 53.10831 30.58218 2 1 0 + 1921 614 13 -0.834 38.99542 61.66171 44.80992 1 0 2 + 1922 614 14 0.417 38.78488 60.74588 44.99207 1 0 2 + 1923 614 14 0.417 39.68427 61.62223 44.14648 1 0 2 + 1924 615 13 -0.834 57.70791 41.72720 55.47643 0 1 -2 + 1925 615 14 0.417 57.25844 41.36846 56.24163 0 1 -2 + 1926 615 14 0.417 57.00496 41.93588 54.86116 0 1 -2 + 1927 616 13 -0.834 58.08999 54.20225 35.53764 0 -1 0 + 1928 616 14 0.417 58.28608 53.46338 36.11372 0 -1 0 + 1929 616 14 0.417 57.15628 54.11553 35.34551 0 -1 0 + 1930 617 13 -0.834 53.05217 52.71850 54.07873 0 0 -1 + 1931 617 14 0.417 52.72353 53.45661 54.59199 0 0 -1 + 1932 617 14 0.417 52.69237 51.94509 54.51306 0 0 -1 + 1933 618 13 -0.834 49.92059 65.13477 35.13462 0 1 1 + 1934 618 14 0.417 50.86780 65.25694 35.19866 0 1 1 + 1935 618 14 0.417 49.79534 64.18846 35.20565 0 1 1 + 1936 619 13 -0.834 41.32410 62.50943 46.98364 1 -1 0 + 1937 619 14 0.417 40.63048 62.20572 46.39807 1 -1 0 + 1938 619 14 0.417 41.96090 61.79482 46.99226 1 -1 0 + 1939 620 13 -0.834 53.94559 67.39201 49.11860 0 0 0 + 1940 620 14 0.417 54.46912 66.60137 48.98810 0 0 0 + 1941 620 14 0.417 54.03461 67.58755 50.05138 0 0 0 + 1942 621 13 -0.834 62.73724 52.28919 56.37358 -2 0 0 + 1943 621 14 0.417 61.94239 51.76764 56.26203 -2 0 0 + 1944 621 14 0.417 63.44036 51.64333 56.44233 -2 0 0 + 1945 622 13 -0.834 40.38118 67.16060 39.18721 2 1 1 + 1946 622 14 0.417 41.33280 67.21360 39.09858 2 1 1 + 1947 622 14 0.417 40.05780 67.12713 38.28691 2 1 1 + 1948 623 13 -0.834 62.86517 42.00727 34.57539 -1 0 -1 + 1949 623 14 0.417 63.37239 42.81882 34.59420 -1 0 -1 + 1950 623 14 0.417 63.40838 41.39624 34.07760 -1 0 -1 + 1951 624 13 -0.834 45.52270 49.32960 34.34348 1 -1 1 + 1952 624 14 0.417 45.92383 49.19413 33.48500 1 -1 1 + 1953 624 14 0.417 45.24004 50.24407 34.33468 1 -1 1 + 1954 625 13 -0.834 61.03811 44.77668 56.49913 1 1 0 + 1955 625 14 0.417 60.72892 43.87199 56.45248 1 1 0 + 1956 625 14 0.417 60.93423 45.11202 55.60864 1 1 0 + 1957 626 13 -0.834 37.82896 51.65548 39.75440 0 1 1 + 1958 626 14 0.417 37.05574 52.05171 39.35268 0 1 1 + 1959 626 14 0.417 38.46628 52.36806 39.80236 0 1 1 + 1960 627 13 -0.834 57.87448 65.36125 35.56679 -1 -1 0 + 1961 627 14 0.417 58.45940 64.84211 35.01489 -1 -1 0 + 1962 627 14 0.417 58.01580 66.26448 35.28319 -1 -1 0 + 1963 628 13 -0.834 41.02352 64.37669 36.41484 0 0 1 + 1964 628 14 0.417 40.85775 63.95254 37.25679 0 0 1 + 1965 628 14 0.417 41.32667 63.66948 35.84545 0 0 1 + 1966 629 13 -0.834 48.62923 67.86173 41.06030 1 0 1 + 1967 629 14 0.417 48.15680 41.13844 41.58283 1 1 1 + 1968 629 14 0.417 47.94185 67.35115 40.63246 1 0 1 + 1969 630 13 -0.834 57.99331 55.69311 47.88478 1 2 0 + 1970 630 14 0.417 57.70999 55.65425 48.79826 1 2 0 + 1971 630 14 0.417 57.37284 55.13407 47.41709 1 2 0 + 1972 631 13 -0.834 48.67013 62.47689 45.75332 -1 -1 0 + 1973 631 14 0.417 49.00300 63.35392 45.56291 -1 -1 0 + 1974 631 14 0.417 48.17776 62.23177 44.96992 -1 -1 0 + 1975 632 13 -0.834 63.70160 54.96100 33.30497 -1 0 0 + 1976 632 14 0.417 64.21034 55.41699 32.63452 -1 0 0 + 1977 632 14 0.417 36.84822 54.18301 33.51151 0 0 0 + 1978 633 13 -0.834 61.71933 50.02843 40.52579 1 0 -1 + 1979 633 14 0.417 61.89605 49.89083 39.59516 1 0 -1 + 1980 633 14 0.417 61.20325 50.83404 40.55551 1 0 -1 + 1981 634 13 -0.834 49.51254 64.46386 53.41539 0 -1 -1 + 1982 634 14 0.417 48.93704 63.81647 53.00803 0 -1 -1 + 1983 634 14 0.417 49.96102 63.98252 54.11066 0 -1 -1 + 1984 635 13 -0.834 49.54405 44.64373 31.53722 1 2 1 + 1985 635 14 0.417 49.17415 44.45447 32.39954 1 2 1 + 1986 635 14 0.417 48.78808 44.87386 30.99705 1 2 1 + 1987 636 13 -0.834 55.54392 65.92737 37.61921 0 -1 -1 + 1988 636 14 0.417 56.11408 65.75233 38.36791 0 -1 -1 + 1989 636 14 0.417 56.12096 66.32174 36.96519 0 -1 -1 + 1990 637 13 -0.834 55.12269 51.83986 35.86341 1 0 1 + 1991 637 14 0.417 55.56426 51.26412 35.23910 1 0 1 + 1992 637 14 0.417 54.23658 51.93728 35.51477 1 0 1 + 1993 638 13 -0.834 55.63681 62.23759 37.50835 1 -1 0 + 1994 638 14 0.417 55.30920 61.35525 37.33403 1 -1 0 + 1995 638 14 0.417 56.23965 62.41667 36.78672 1 -1 0 + 1996 639 13 -0.834 39.91450 42.04260 35.59226 0 0 0 + 1997 639 14 0.417 39.72903 41.27571 36.13422 0 0 0 + 1998 639 14 0.417 39.23583 42.02933 34.91737 0 0 0 + 1999 640 13 -0.834 48.26433 59.84813 40.16126 0 1 0 + 2000 640 14 0.417 48.74870 60.67004 40.23938 0 1 0 + 2001 640 14 0.417 47.50743 60.06639 39.61748 0 1 0 + 2002 641 13 -0.834 57.35097 49.28414 48.37687 1 1 1 + 2003 641 14 0.417 57.35715 48.51028 48.94022 1 1 1 + 2004 641 14 0.417 56.55074 49.75049 48.61854 1 1 1 + +Velocities + + 1 -0.000671 -0.002823 0.003832 + 2 -0.001597 0.002405 -0.003777 + 3 0.005494 0.003807 -0.002300 + 4 -0.000077 0.004524 -0.000287 + 5 0.003116 -0.007135 -0.034325 + 6 -0.006676 0.004889 -0.001939 + 7 0.003499 -0.004774 0.000159 + 8 -0.003460 0.000694 0.000994 + 9 -0.000065 -0.001353 -0.002848 + 10 -0.001260 -0.002649 0.000699 + 11 -0.002820 -0.002457 -0.005671 + 12 0.005156 -0.005914 0.000984 + 13 -0.002342 -0.001592 0.004306 + 14 0.004397 -0.000231 0.003308 + 15 -0.003258 -0.000006 0.001838 + 16 -0.001637 -0.004429 0.003154 + 17 0.007073 -0.000472 -0.003331 + 18 -0.003380 -0.001390 0.005013 + 19 -0.011019 -0.005332 -0.010451 + 20 -0.005433 0.000844 0.004938 + 21 0.002988 0.000244 -0.009941 + 22 -0.003695 0.006546 -0.007678 + 23 0.009473 0.023276 0.019457 + 24 -0.010016 -0.024193 0.018017 + 25 0.004015 0.008726 -0.000397 + 26 -0.001741 -0.001861 0.007862 + 27 -0.009771 -0.011577 -0.005703 + 28 0.003573 0.006265 -0.005932 + 29 0.004789 0.001987 -0.004620 + 30 0.008858 -0.001064 -0.001455 + 31 -0.001403 0.000613 0.002330 + 32 -0.005808 -0.001620 0.000816 + 33 -0.004160 0.001188 -0.019638 + 34 -0.006899 0.006285 0.013256 + 35 0.000717 -0.000432 -0.006883 + 36 0.002110 0.002628 -0.004683 + 37 0.000765 -0.007298 0.000289 + 38 -0.000128 -0.002893 0.004065 + 39 -0.000411 -0.021741 0.010968 + 40 0.002858 0.000302 0.000042 + 41 0.014233 -0.004599 -0.004060 + 42 -0.001473 -0.003572 -0.006228 + 43 0.009129 -0.002755 0.001456 + 44 0.003931 0.000151 0.003472 + 45 0.001621 0.005391 -0.006087 + 46 -0.004269 -0.001973 0.002735 + 47 -0.006898 -0.001187 -0.003394 + 48 -0.008556 -0.000163 -0.001387 + 49 -0.000633 -0.001754 0.011460 + 50 0.004854 -0.002902 -0.005057 + 51 0.000678 0.003272 0.006218 + 52 0.006502 0.006365 -0.000215 + 53 0.005708 0.012368 0.002955 + 54 0.008627 -0.007839 0.003177 + 55 0.004394 0.000132 0.002346 + 56 -0.004641 0.009426 -0.005548 + 57 -0.004801 -0.024766 0.002851 + 58 -0.002703 0.001589 0.007521 + 59 0.023718 -0.006559 0.003743 + 60 -0.010013 -0.042894 -0.029745 + 61 0.016140 -0.000721 -0.001747 + 62 -0.004871 0.002439 0.001990 + 63 0.009632 0.007144 0.001203 + 64 -0.001150 0.001648 -0.003018 + 65 0.006658 -0.002268 0.006874 + 66 -0.002617 0.003321 0.002230 + 67 -0.000803 0.002802 0.003258 + 68 -0.000984 -0.001579 -0.001813 + 69 0.001316 0.000607 0.003431 + 70 -0.010901 0.000580 -0.004134 + 71 0.005370 -0.003909 0.013130 + 72 -0.012282 0.007114 -0.015100 + 73 0.004641 -0.007554 0.004302 + 74 0.017455 0.013344 0.004896 + 75 0.006200 0.026885 0.020665 + 76 -0.010372 0.000470 -0.005601 + 77 -0.003368 -0.004484 0.010962 + 78 0.012416 -0.004728 0.000719 + 79 -0.005789 0.005198 -0.007541 + 80 0.005480 -0.004049 0.003455 + 81 -0.004935 0.005839 -0.006405 + 82 0.001157 -0.011200 0.018491 + 83 -0.029013 -0.016935 0.021131 + 84 -0.020335 0.020972 0.006071 + 85 0.003304 0.007374 -0.005056 + 86 0.029227 0.010776 -0.013183 + 87 0.001651 0.006570 -0.002085 + 88 0.001533 -0.009172 0.007562 + 89 0.018153 -0.022223 0.015786 + 90 -0.010012 -0.004911 0.002561 + 91 0.000435 0.003941 -0.005468 + 92 0.003301 0.001183 -0.006999 + 93 0.006788 0.011331 -0.004427 + 94 0.001392 0.005663 -0.002907 + 95 -0.001849 -0.002229 -0.003422 + 96 -0.000820 0.005872 0.004561 + 97 -0.003264 0.002461 -0.009257 + 98 0.000160 0.016954 -0.015355 + 99 -0.006597 0.011858 0.000426 + 100 0.001816 -0.005854 -0.001317 + 101 -0.001936 -0.006103 0.018111 + 102 0.024621 -0.022735 -0.000704 + 103 -0.001102 0.008384 -0.003086 + 104 0.012559 0.004375 -0.000361 + 105 0.008377 0.014814 -0.037755 + 106 -0.002851 -0.000200 -0.000722 + 107 0.010701 0.006888 -0.007831 + 108 -0.008490 0.011514 0.009399 + 109 -0.001181 0.001853 0.002176 + 110 -0.018912 -0.023868 0.006706 + 111 -0.000415 -0.001525 0.005751 + 112 -0.001172 0.001329 -0.001270 + 113 -0.006700 -0.006243 -0.006459 + 114 0.000018 0.001429 0.001376 + 115 0.001269 0.002521 0.005249 + 116 -0.002179 0.015666 0.006861 + 117 -0.007158 0.000981 0.007353 + 118 0.001047 0.000840 -0.004404 + 119 0.000974 -0.012527 0.005053 + 120 0.026729 0.008884 -0.003350 + 121 0.001181 -0.004040 -0.002037 + 122 0.006556 -0.007438 0.002656 + 123 0.005056 -0.015002 -0.003727 + 124 -0.002704 -0.003683 -0.001021 + 125 0.025048 0.007258 0.008873 + 126 0.019645 -0.020824 -0.002539 + 127 0.000061 0.001072 0.002612 + 128 0.005132 0.013203 0.018763 + 129 0.033473 0.004804 0.018651 + 130 -0.003459 -0.000309 -0.001348 + 131 -0.008088 0.023660 0.011047 + 132 0.010962 0.031994 0.008711 + 133 0.000181 -0.002894 -0.001677 + 134 0.024049 -0.000711 -0.009405 + 135 0.018702 0.003422 -0.019522 + 136 -0.000836 -0.003270 -0.005700 + 137 0.012246 0.016524 0.001525 + 138 0.006270 -0.011288 0.002224 + 139 -0.005169 0.005097 -0.000688 + 140 -0.006982 0.003044 -0.001383 + 141 0.012227 0.012767 0.004047 + 142 -0.001169 0.006070 -0.007989 + 143 0.005451 0.002569 -0.009841 + 144 0.001825 -0.002822 -0.005341 + 145 0.000911 0.004242 -0.002026 + 146 0.012072 -0.001187 -0.010498 + 147 0.007366 0.005541 0.012099 + 148 0.009820 0.000588 0.001087 + 149 0.013758 0.005140 0.015262 + 150 0.015580 0.003311 0.013079 + 151 0.002031 0.000411 0.003403 + 152 -0.001996 0.003750 0.007387 + 153 0.000790 0.000281 -0.000919 + 154 -0.004168 0.001886 -0.004993 + 155 -0.011049 0.015294 0.001052 + 156 -0.012308 0.010348 -0.003128 + 157 -0.001609 -0.004040 -0.002294 + 158 -0.005715 -0.015529 -0.005700 + 159 0.014489 0.026653 0.004024 + 160 0.004070 0.000866 0.003373 + 161 0.004691 0.005062 0.002569 + 162 0.007082 -0.019961 -0.026174 + 163 0.005501 0.000902 -0.001325 + 164 0.007503 0.001448 -0.001472 + 165 0.013628 0.003649 -0.005952 + 166 -0.000639 0.003162 -0.007271 + 167 0.007342 -0.011001 -0.016849 + 168 -0.018400 -0.004772 0.020839 + 169 0.000214 -0.000386 0.002706 + 170 -0.005862 0.010449 -0.003793 + 171 -0.013612 0.011870 -0.006417 + 172 -0.005485 0.006465 0.005343 + 173 0.001788 0.008428 0.005641 + 174 -0.018354 0.029579 0.010717 + 175 0.002627 -0.000754 0.000071 + 176 -0.018080 0.018546 0.001794 + 177 0.006754 -0.000962 -0.007786 + 178 0.002343 0.002166 0.004945 + 179 -0.001724 0.003155 0.010761 + 180 0.010728 0.003441 0.001544 + 181 -0.000849 -0.002856 0.001461 + 182 0.009366 -0.003672 -0.001935 + 183 0.016615 -0.001746 0.005238 + 184 -0.002730 -0.000316 -0.004583 + 185 -0.014755 -0.011310 0.003338 + 186 0.005862 0.008235 -0.003200 + 187 -0.003189 -0.006285 0.009536 + 188 -0.005114 -0.007060 0.006450 + 189 -0.000516 -0.008757 0.009854 + 190 -0.000859 0.005266 0.001864 + 191 0.003108 -0.007021 0.009190 + 192 -0.015949 -0.002050 0.007021 + 193 -0.007008 0.002608 -0.004583 + 194 -0.020431 -0.004004 0.008047 + 195 -0.000364 0.001236 -0.011425 + 196 0.002420 0.006931 0.002031 + 197 0.007178 0.006129 0.009924 + 198 -0.005981 0.016623 -0.013067 + 199 0.003142 -0.001394 -0.001846 + 200 0.011374 -0.002895 -0.000674 + 201 0.032698 -0.002552 0.007288 + 202 -0.005709 0.000071 0.005037 + 203 -0.013193 -0.012592 -0.008102 + 204 -0.008194 0.014723 0.003840 + 205 -0.003270 -0.006146 0.004301 + 206 0.004399 -0.010132 -0.001197 + 207 -0.030308 0.012803 0.003540 + 208 0.002110 0.002374 0.006075 + 209 -0.000845 -0.004182 -0.002795 + 210 0.002582 -0.004671 0.002224 + 211 -0.003768 0.002130 0.001339 + 212 0.022509 0.017397 0.002782 + 213 0.020609 0.006682 -0.014082 + 214 0.003956 0.004282 -0.005023 + 215 0.007499 0.004128 0.002237 + 216 0.034882 -0.005096 0.008948 + 217 -0.002552 -0.000287 -0.001907 + 218 0.025445 0.005560 -0.016526 + 219 0.002741 0.000814 -0.004654 + 220 0.002162 -0.001203 0.000936 + 221 0.004071 0.004725 0.001938 + 222 0.002393 -0.013063 -0.003950 + 223 -0.001609 -0.003218 -0.004310 + 224 -0.012550 0.009033 -0.007868 + 225 0.014344 0.000886 -0.013005 + 226 0.005863 0.010335 -0.003424 + 227 0.011104 -0.005602 -0.012415 + 228 0.001222 0.002408 0.001546 + 229 -0.002038 0.001858 0.002991 + 230 -0.017517 -0.020932 0.016099 + 231 0.005257 0.011588 -0.018236 + 232 -0.002660 -0.006193 0.003186 + 233 -0.021995 0.012375 0.004372 + 234 -0.013906 0.028004 -0.004997 + 235 0.002339 -0.001255 -0.003548 + 236 0.001689 0.005243 -0.006337 + 237 0.000498 -0.007782 -0.015260 + 238 0.001142 0.002234 0.003408 + 239 0.007521 0.004622 -0.003272 + 240 -0.001154 0.006952 0.006739 + 241 -0.000938 -0.004609 0.002499 + 242 0.004903 0.001117 0.013021 + 243 0.008126 -0.013873 -0.001075 + 244 -0.004097 0.002491 -0.002459 + 245 0.002093 -0.002989 0.010881 + 246 0.008552 0.010436 0.008330 + 247 -0.000211 0.002295 0.001935 + 248 0.004346 0.003486 0.008405 + 249 -0.006182 0.002873 -0.007955 + 250 0.002466 0.001439 -0.002302 + 251 -0.003246 0.007233 0.009469 + 252 -0.002606 0.002646 0.002563 + 253 0.000833 -0.001794 -0.003483 + 254 -0.001066 -0.001277 -0.012569 + 255 -0.003354 -0.002604 -0.016130 + 256 0.007379 0.006324 -0.003535 + 257 0.025411 0.006788 -0.010928 + 258 0.011648 0.000201 0.004051 + 259 -0.000385 -0.000823 -0.000593 + 260 -0.001070 -0.019569 0.006235 + 261 0.011350 0.009136 0.002805 + 262 -0.001688 0.002178 0.004704 + 263 -0.011748 0.007674 0.002198 + 264 -0.005358 0.003728 -0.002879 + 265 -0.004209 0.000686 -0.004990 + 266 0.000586 0.011928 0.008080 + 267 0.004512 -0.002493 -0.000297 + 268 -0.000130 0.007801 -0.005732 + 269 -0.006259 -0.000991 -0.001515 + 270 0.015560 -0.011483 0.001826 + 271 -0.003544 0.003178 0.000326 + 272 0.006639 0.005731 0.008812 + 273 -0.009361 -0.001371 -0.002830 + 274 -0.000226 0.001739 0.001787 + 275 -0.001846 -0.005637 -0.002071 + 276 0.009461 0.005629 -0.001253 + 277 0.003294 -0.005377 -0.000680 + 278 0.027740 0.013288 0.002669 + 279 0.003403 0.012169 -0.019874 + 280 -0.001383 0.000386 -0.006636 + 281 -0.005910 0.003429 -0.006992 + 282 0.002649 -0.004178 -0.006969 + 283 0.004768 -0.001680 0.000104 + 284 -0.012916 0.017467 -0.012201 + 285 0.010278 -0.007970 0.003734 + 286 0.000005 0.000300 0.006224 + 287 0.003150 -0.001535 0.007443 + 288 -0.000547 -0.003737 0.010794 + 289 0.003054 0.005656 0.000426 + 290 0.006673 0.002252 0.007300 + 291 0.004185 0.001696 0.005292 + 292 -0.001277 -0.005156 -0.001765 + 293 0.005969 -0.004326 -0.002540 + 294 -0.026915 -0.005145 0.019233 + 295 -0.003352 -0.000356 -0.001610 + 296 -0.023375 -0.003718 -0.017075 + 297 0.006387 -0.025086 0.000315 + 298 -0.005064 0.001395 0.004436 + 299 -0.004111 0.000853 -0.032909 + 300 0.000933 0.005949 0.017391 + 301 0.000607 0.002490 -0.002786 + 302 0.002638 0.008857 0.008537 + 303 0.001294 0.011357 -0.003275 + 304 -0.001798 -0.003127 -0.000795 + 305 -0.003320 0.000996 0.004122 + 306 -0.008728 -0.000634 0.002033 + 307 -0.003535 -0.002662 -0.002777 + 308 -0.005954 -0.002781 -0.004403 + 309 -0.002147 -0.001477 -0.001223 + 310 -0.002595 -0.001397 0.002359 + 311 -0.003605 -0.000224 0.015269 + 312 -0.014002 -0.002828 0.000027 + 313 0.001583 -0.005357 0.002380 + 314 -0.002955 -0.014106 -0.011581 + 315 0.000151 -0.006411 0.002865 + 316 0.004278 -0.004088 0.000114 + 317 -0.019291 0.001584 0.015204 + 318 -0.013439 -0.000674 0.010987 + 319 0.000024 0.000995 0.005326 + 320 -0.009041 0.020464 0.014139 + 321 0.004208 -0.003482 0.004723 + 322 0.001489 -0.003292 0.000500 + 323 0.000364 0.006211 0.006844 + 324 0.007467 0.021162 -0.001636 + 325 0.009527 -0.000863 -0.005483 + 326 -0.009936 0.006496 -0.014136 + 327 -0.007595 -0.006469 -0.002090 + 328 -0.002856 -0.010388 -0.000678 + 329 -0.026693 -0.007624 -0.001572 + 330 0.029582 -0.010319 0.009090 + 331 -0.009062 0.000913 0.000368 + 332 -0.019327 0.020501 -0.000560 + 333 -0.018764 -0.008632 0.002570 + 334 0.004502 0.001200 -0.008087 + 335 0.008714 -0.005091 -0.008624 + 336 0.004610 0.003623 -0.007048 + 337 0.002461 -0.000759 0.003913 + 338 0.021591 -0.013925 0.009416 + 339 -0.017190 0.002325 0.006138 + 340 0.003361 0.004027 0.006986 + 341 0.006850 0.012752 0.018496 + 342 0.019589 0.009932 -0.004987 + 343 0.000463 0.005037 -0.000723 + 344 0.008333 0.006382 -0.005532 + 345 0.004288 0.006565 0.007800 + 346 -0.001505 -0.001295 0.001190 + 347 -0.015747 0.011253 0.025149 + 348 0.014871 -0.012646 -0.016815 + 349 -0.000186 0.002115 -0.002539 + 350 0.001936 0.000958 -0.003366 + 351 -0.014299 0.007078 -0.001653 + 352 -0.000876 -0.001637 -0.002032 + 353 -0.001168 0.005556 -0.012749 + 354 -0.003162 -0.016318 -0.009468 + 355 -0.000674 -0.001888 -0.003265 + 356 0.017652 -0.009515 0.007889 + 357 0.015313 -0.006079 0.010454 + 358 -0.000964 -0.004354 0.000067 + 359 0.004137 -0.002540 0.004500 + 360 -0.011376 -0.000921 -0.006123 + 361 0.002023 0.003210 -0.000511 + 362 0.012560 -0.011698 0.016109 + 363 -0.013295 -0.009379 -0.009014 + 364 0.003315 0.003249 0.007620 + 365 -0.010739 0.000915 -0.008118 + 366 -0.015293 0.007564 -0.004343 + 367 0.000192 0.002269 -0.000485 + 368 0.002520 -0.012494 -0.004632 + 369 0.010222 0.003093 -0.002247 + 370 0.003953 0.000628 0.004147 + 371 0.001165 -0.005271 0.007550 + 372 -0.013412 -0.019696 0.026961 + 373 0.001883 0.002252 -0.003560 + 374 0.005482 -0.004609 0.002380 + 375 -0.008048 0.004473 -0.008866 + 376 -0.002663 0.001073 0.001951 + 377 0.010178 0.018964 0.000820 + 378 0.007583 -0.018984 0.016464 + 379 0.001136 0.007646 0.002719 + 380 0.006251 0.008125 0.009187 + 381 0.001284 0.011634 -0.004097 + 382 -0.000767 0.000265 -0.000818 + 383 -0.000089 0.001579 -0.002300 + 384 -0.004565 -0.011251 0.008186 + 385 0.004778 -0.000871 0.002405 + 386 0.006618 -0.002801 0.006849 + 387 0.029884 -0.012377 0.019662 + 388 -0.002799 -0.005785 0.000693 + 389 -0.006988 0.014716 -0.008738 + 390 -0.003130 0.004832 0.002982 + 391 0.000036 -0.002467 0.000498 + 392 -0.001382 -0.006847 0.003863 + 393 -0.003623 0.001391 0.001664 + 394 0.004431 0.000182 0.002043 + 395 0.007177 -0.001675 0.008884 + 396 0.000324 0.003728 0.003379 + 397 0.004107 -0.000618 0.000098 + 398 0.019272 -0.008832 -0.013192 + 399 -0.025041 0.027976 -0.020594 + 400 0.002982 -0.002889 -0.005826 + 401 0.010564 -0.003899 -0.002078 + 402 0.005218 -0.003308 -0.010357 + 403 0.002304 -0.003833 -0.008812 + 404 -0.013421 -0.017603 -0.023172 + 405 -0.003134 -0.000582 0.001712 + 406 -0.003398 -0.002176 0.001635 + 407 -0.015813 0.008046 0.010515 + 408 0.003940 -0.004144 -0.002666 + 409 0.008428 -0.002203 -0.004077 + 410 -0.004859 0.004207 -0.016803 + 411 -0.022714 0.005614 0.004119 + 412 -0.000677 -0.000486 0.001019 + 413 0.004137 0.001524 0.004810 + 414 -0.011495 -0.003293 -0.002498 + 415 -0.004277 -0.004620 -0.002973 + 416 0.005727 -0.002611 0.021922 + 417 0.009759 0.016284 -0.017136 + 418 0.001140 -0.003169 0.001021 + 419 0.002072 0.019101 -0.019824 + 420 0.029356 -0.011686 0.004675 + 421 0.001175 0.002540 0.001846 + 422 0.009479 -0.017538 0.002696 + 423 0.008327 0.028039 -0.001246 + 424 0.002971 -0.004730 0.000069 + 425 0.010168 -0.005904 -0.016535 + 426 0.009223 0.011295 0.006248 + 427 -0.003323 0.000861 0.005020 + 428 -0.005244 0.001685 -0.001864 + 429 0.000994 0.014826 0.000976 + 430 -0.002795 0.003958 -0.004848 + 431 0.010698 -0.011688 -0.000537 + 432 0.008158 0.021591 -0.003259 + 433 0.000363 0.002223 0.004053 + 434 -0.002225 0.004315 -0.010042 + 435 -0.000151 -0.000572 0.000675 + 436 0.006996 -0.000559 0.003307 + 437 -0.011410 -0.004708 0.006782 + 438 -0.015909 0.022113 0.004877 + 439 -0.002401 -0.002279 0.002655 + 440 -0.002478 0.000164 0.005849 + 441 -0.003545 0.002314 0.007358 + 442 0.002189 0.006935 -0.001251 + 443 -0.007190 0.031224 0.006804 + 444 0.004661 -0.003296 0.013412 + 445 0.003709 0.001514 -0.003921 + 446 0.015678 0.007604 0.000133 + 447 -0.004648 -0.004474 -0.027064 + 448 0.001807 -0.004146 0.004203 + 449 0.029598 0.003434 0.012408 + 450 -0.004603 -0.006201 0.002287 + 451 -0.003031 -0.004136 -0.006564 + 452 0.009003 0.019264 0.004529 + 453 -0.000188 0.010449 0.001077 + 454 0.003891 0.002752 0.005629 + 455 0.001092 0.012776 0.008682 + 456 -0.002762 0.015371 -0.005857 + 457 0.002697 -0.003406 -0.002865 + 458 0.007823 -0.013511 0.002023 + 459 -0.030492 -0.008107 -0.020624 + 460 0.000483 0.001162 0.002651 + 461 0.002571 -0.007508 -0.009384 + 462 -0.010774 -0.027329 0.003619 + 463 0.005791 0.000086 0.004298 + 464 0.008820 0.016257 -0.002226 + 465 0.000317 -0.014932 -0.013621 + 466 0.003540 0.001551 -0.001349 + 467 0.008241 0.020014 0.019807 + 468 -0.004258 -0.010227 -0.029599 + 469 0.007640 0.001287 -0.003128 + 470 0.004600 -0.001555 -0.010230 + 471 0.007870 0.002461 0.000094 + 472 0.001001 0.005160 -0.001529 + 473 0.006073 0.015127 0.022819 + 474 0.006356 -0.012345 -0.003131 + 475 -0.005549 -0.000151 0.001312 + 476 -0.015747 0.009610 0.004075 + 477 0.009345 0.004620 -0.013632 + 478 -0.005694 -0.004777 0.002781 + 479 -0.015785 0.018249 0.008919 + 480 0.007264 0.001342 -0.012954 + 481 -0.002601 -0.003124 -0.001775 + 482 -0.010924 -0.002942 0.001676 + 483 0.020644 0.001519 0.001050 + 484 -0.003829 -0.001681 0.001973 + 485 -0.009248 -0.008096 0.002166 + 486 -0.004627 -0.003317 0.000426 + 487 0.004750 0.008629 -0.001691 + 488 -0.009177 0.001481 0.019567 + 489 -0.000748 -0.004703 -0.011184 + 490 -0.000930 -0.004032 -0.001796 + 491 -0.007051 -0.001375 -0.004647 + 492 -0.000505 0.005436 -0.004029 + 493 -0.000767 -0.000313 -0.004426 + 494 0.007019 0.022441 0.008035 + 495 0.002030 -0.018016 0.012244 + 496 -0.000430 -0.004092 0.001186 + 497 0.012447 -0.008156 0.016405 + 498 -0.008008 0.011043 -0.000527 + 499 0.001752 0.001451 -0.008850 + 500 -0.001696 0.002950 -0.000035 + 501 0.006054 -0.001180 -0.028952 + 502 0.001434 -0.008124 -0.001958 + 503 0.001762 -0.007034 -0.009244 + 504 -0.008796 -0.004759 -0.009928 + 505 0.000249 0.001170 0.006380 + 506 -0.005081 0.014461 -0.003259 + 507 -0.002522 0.001324 0.007841 + 508 0.003441 0.001538 0.006742 + 509 0.007735 -0.006583 0.003492 + 510 0.009681 0.006088 0.008608 + 511 -0.006695 -0.001970 0.000807 + 512 0.004268 0.004052 0.001263 + 513 -0.004129 -0.012886 -0.007489 + 514 -0.002878 0.001158 0.006535 + 515 -0.007680 -0.001896 0.002953 + 516 -0.000917 -0.006257 -0.002762 + 517 -0.001401 -0.003523 -0.005778 + 518 -0.001854 0.007834 0.015061 + 519 -0.010095 0.007049 -0.021128 + 520 -0.000766 -0.000153 0.007009 + 521 0.009064 -0.003223 0.017921 + 522 0.000864 -0.000043 0.007876 + 523 -0.001025 0.001319 -0.006573 + 524 -0.006395 0.000755 -0.002686 + 525 -0.032670 0.007943 0.004175 + 526 0.002953 0.006520 0.004065 + 527 0.009139 -0.008077 -0.010889 + 528 -0.002820 0.012454 -0.005504 + 529 -0.008727 0.003418 0.002451 + 530 -0.007112 -0.005703 0.023446 + 531 -0.011285 0.014165 -0.019563 + 532 -0.002562 0.003192 -0.002295 + 533 -0.003618 0.007211 0.002298 + 534 0.010325 0.001834 0.002853 + 535 0.002563 0.000345 -0.002878 + 536 0.002396 0.022293 -0.006961 + 537 0.001693 -0.002677 0.010576 + 538 -0.001561 0.000734 0.001793 + 539 -0.008542 0.015338 0.007321 + 540 -0.015880 0.015140 0.014642 + 541 0.001092 0.000090 0.000997 + 542 -0.004522 -0.004004 0.003687 + 543 0.003258 -0.006156 0.000500 + 544 -0.001608 0.002026 0.003790 + 545 -0.010430 -0.004583 0.015482 + 546 0.002628 0.011416 0.004923 + 547 -0.002068 0.005845 0.001850 + 548 0.001194 0.007931 0.007672 + 549 -0.020261 -0.007195 -0.008896 + 550 0.005399 0.001999 0.000211 + 551 0.004420 0.012603 0.006214 + 552 0.007790 0.005534 0.000006 + 553 -0.004249 0.001186 -0.000260 + 554 0.006385 -0.014925 0.000020 + 555 0.009902 0.016988 -0.004080 + 556 0.006637 -0.003469 0.000450 + 557 -0.002010 0.011423 -0.004361 + 558 -0.009074 0.013716 -0.002539 + 559 0.003243 -0.003710 -0.002565 + 560 -0.000480 -0.009433 0.000267 + 561 0.002981 -0.005587 -0.010088 + 562 0.002665 0.008169 0.002667 + 563 -0.001817 0.009035 0.022525 + 564 0.005689 0.010678 0.000603 + 565 0.003217 0.002617 0.001072 + 566 0.025108 0.001061 -0.027288 + 567 -0.003091 0.028727 0.028529 + 568 0.003991 -0.002246 0.002528 + 569 0.011195 -0.007917 0.010511 + 570 -0.006686 -0.007088 -0.000640 + 571 0.005302 0.003751 0.001484 + 572 0.001250 0.007658 -0.006666 + 573 0.018145 -0.005375 0.000139 + 574 -0.003857 0.003583 0.000238 + 575 0.006752 0.001063 0.004538 + 576 -0.006479 0.014326 -0.017669 + 577 0.001793 0.003661 0.002509 + 578 0.010186 -0.003147 0.008687 + 579 -0.001160 -0.005645 -0.003812 + 580 -0.002296 0.006997 0.000837 + 581 -0.031138 0.017223 0.000984 + 582 0.002587 -0.007480 0.015277 + 583 0.000288 -0.000668 0.001548 + 584 0.016041 -0.004051 0.004629 + 585 -0.025116 0.003224 0.009356 + 586 -0.000853 0.003188 0.004014 + 587 -0.001700 -0.004491 0.006716 + 588 -0.008947 -0.009004 -0.023328 + 589 0.005432 -0.003893 -0.001000 + 590 -0.019524 0.021049 -0.035976 + 591 0.009404 0.004475 -0.004525 + 592 -0.006508 -0.002709 0.000481 + 593 0.010852 -0.015643 0.005754 + 594 0.006526 0.026156 0.009018 + 595 -0.004611 -0.001841 0.002205 + 596 -0.013411 -0.011893 -0.011510 + 597 -0.002150 -0.000804 -0.006730 + 598 -0.002593 -0.000356 0.003104 + 599 0.009483 0.002951 -0.001362 + 600 -0.015523 -0.003843 0.010828 + 601 -0.001229 0.003953 0.000471 + 602 -0.017788 0.002114 0.033354 + 603 0.015187 -0.017947 -0.007994 + 604 -0.001335 -0.000196 0.007281 + 605 0.015188 0.007448 0.005030 + 606 -0.001538 0.002386 -0.009662 + 607 -0.001172 0.004261 0.002894 + 608 -0.002229 0.015661 0.009134 + 609 0.017428 0.004976 0.006974 + 610 -0.001490 0.003604 0.004586 + 611 -0.017720 0.006222 -0.023144 + 612 0.010016 -0.015847 -0.004678 + 613 -0.002648 0.000934 0.000698 + 614 -0.011832 0.016782 0.007626 + 615 -0.005427 0.001385 0.015386 + 616 0.003669 -0.001949 0.003946 + 617 0.005164 0.000243 0.009975 + 618 -0.000161 0.003111 0.001353 + 619 0.002976 -0.004733 0.001868 + 620 -0.002832 -0.014197 -0.023534 + 621 -0.003347 -0.011551 0.000693 + 622 0.004912 0.001701 -0.000793 + 623 0.013809 0.007164 -0.016905 + 624 0.024958 -0.010962 -0.008428 + 625 0.007422 -0.002948 -0.001308 + 626 -0.016590 -0.032000 -0.001025 + 627 0.011367 0.004098 0.010259 + 628 -0.002045 -0.000742 0.000577 + 629 -0.030845 0.001448 0.030396 + 630 0.001781 -0.017639 0.014980 + 631 0.002233 -0.004427 -0.002429 + 632 0.018586 -0.001402 0.006993 + 633 -0.012356 0.003736 0.007796 + 634 -0.004338 0.007766 0.000310 + 635 0.001990 0.000209 0.007107 + 636 -0.006343 0.005190 -0.018263 + 637 -0.005455 0.000492 -0.002847 + 638 0.000522 0.006495 0.003755 + 639 -0.001841 -0.009429 -0.001507 + 640 -0.002314 -0.002516 -0.005613 + 641 0.018652 0.002237 -0.015930 + 642 -0.002326 -0.000776 -0.003132 + 643 -0.005512 -0.000623 -0.000619 + 644 -0.001015 0.005882 0.003225 + 645 0.000586 0.023218 -0.004529 + 646 -0.001138 0.000800 0.002687 + 647 0.003627 0.013371 -0.016172 + 648 0.018968 0.017228 -0.000038 + 649 -0.002086 -0.000112 -0.007393 + 650 0.016103 0.035588 0.008775 + 651 -0.038516 0.012158 -0.009536 + 652 0.002958 0.004862 -0.007554 + 653 0.024333 0.013052 -0.023133 + 654 0.002379 -0.000049 -0.006601 + 655 0.003804 -0.003076 -0.001112 + 656 -0.004763 0.002283 -0.025897 + 657 -0.036538 -0.010672 -0.010599 + 658 -0.000713 0.003957 0.002151 + 659 -0.016531 0.001472 0.004862 + 660 -0.009287 0.028134 0.010480 + 661 0.004192 -0.003835 0.000568 + 662 0.011523 0.002433 0.036479 + 663 -0.009197 -0.041577 0.000393 + 664 0.000280 -0.002373 -0.004460 + 665 0.002206 -0.003211 0.000957 + 666 0.006211 0.013469 -0.005353 + 667 -0.000522 0.001664 -0.004748 + 668 0.004459 -0.024042 -0.023029 + 669 0.011377 0.013403 0.030836 + 670 0.003382 -0.002813 0.000451 + 671 0.000766 0.000074 -0.006820 + 672 0.013252 -0.015598 0.024274 + 673 -0.003243 0.006406 -0.002570 + 674 0.019962 -0.008888 -0.019769 + 675 -0.027628 -0.005508 -0.000297 + 676 -0.007770 -0.003882 0.002155 + 677 -0.001777 0.012358 0.000036 + 678 -0.024978 0.005564 -0.015024 + 679 0.000188 0.001017 0.004117 + 680 -0.006440 -0.003105 0.019733 + 681 -0.016780 0.005575 -0.004078 + 682 0.000151 0.001697 -0.001387 + 683 -0.002925 0.000955 -0.004378 + 684 0.000826 0.008069 0.003052 + 685 -0.003543 -0.000321 -0.000587 + 686 -0.012205 0.000432 -0.005990 + 687 0.004010 0.009678 -0.003793 + 688 0.001940 -0.000340 0.003900 + 689 0.005837 0.014815 -0.005621 + 690 -0.008710 -0.017653 0.020395 + 691 -0.001931 -0.003975 -0.002577 + 692 -0.003368 -0.014386 -0.006878 + 693 -0.013782 -0.002984 0.003522 + 694 0.004968 -0.000283 -0.003322 + 695 0.019160 0.006665 -0.007077 + 696 0.022604 -0.000847 -0.016983 + 697 0.002571 0.000550 -0.007379 + 698 -0.001443 -0.002487 -0.007727 + 699 -0.011487 -0.013883 0.019460 + 700 0.001096 -0.004750 0.003965 + 701 -0.016603 -0.010473 0.014272 + 702 0.023559 -0.001392 -0.008500 + 703 -0.002022 -0.005262 -0.004485 + 704 0.002332 -0.014942 -0.004917 + 705 -0.009402 0.006267 -0.002020 + 706 -0.000288 0.003264 -0.003564 + 707 0.004565 0.033122 -0.006655 + 708 -0.018922 -0.009521 0.000208 + 709 -0.003485 0.003285 -0.000556 + 710 0.004587 -0.002798 -0.000984 + 711 -0.006054 0.007231 -0.001425 + 712 0.004718 0.000201 -0.003948 + 713 -0.014114 0.009800 -0.004955 + 714 -0.008099 -0.004168 0.008689 + 715 0.000410 -0.000654 0.009605 + 716 0.008711 0.018707 0.002740 + 717 0.003459 -0.008185 0.010239 + 718 0.003479 0.000757 0.004467 + 719 0.000433 -0.000495 0.007710 + 720 0.012945 0.003286 -0.002052 + 721 -0.010010 -0.003567 0.006956 + 722 0.005307 -0.001615 -0.002198 + 723 -0.012515 0.011984 0.016669 + 724 0.001378 -0.002186 -0.001614 + 725 0.012587 -0.019891 0.012237 + 726 0.012601 0.007024 0.014776 + 727 -0.002983 -0.001722 -0.004228 + 728 0.015268 -0.011359 -0.002815 + 729 -0.003967 0.028638 0.000653 + 730 -0.000313 -0.000495 0.001546 + 731 -0.030938 -0.009463 -0.008649 + 732 -0.033474 -0.019299 0.015331 + 733 0.000845 -0.003919 -0.003202 + 734 -0.027178 0.011071 -0.026350 + 735 -0.007741 0.001470 -0.016184 + 736 -0.001239 0.001989 -0.002789 + 737 0.011285 0.001382 -0.006222 + 738 0.022813 -0.006205 -0.006536 + 739 0.003987 -0.004190 -0.005010 + 740 -0.007915 0.002670 -0.013878 + 741 0.004194 0.006086 -0.010350 + 742 0.006539 -0.005074 0.002196 + 743 0.015306 0.008181 0.005081 + 744 0.007865 0.003022 -0.004716 + 745 -0.001784 -0.010062 0.004309 + 746 -0.002378 -0.011275 0.006933 + 747 -0.008336 -0.001053 0.004620 + 748 -0.002979 0.004768 -0.002497 + 749 -0.000959 0.004004 -0.002600 + 750 -0.019512 -0.002978 0.005044 + 751 -0.004903 -0.000550 0.000659 + 752 -0.005086 0.005639 -0.022167 + 753 -0.008131 0.001631 -0.018889 + 754 -0.001761 -0.001628 0.000503 + 755 -0.003957 -0.007199 -0.006609 + 756 0.003155 -0.001306 0.005143 + 757 0.000937 0.008247 -0.008723 + 758 0.028994 0.004889 0.007225 + 759 -0.000469 -0.025903 0.001925 + 760 -0.001834 -0.000370 -0.001605 + 761 0.007234 -0.001225 -0.019036 + 762 -0.003442 -0.001966 0.000209 + 763 0.000445 0.007510 0.001158 + 764 -0.008348 0.004439 -0.007776 + 765 -0.012793 0.011539 0.019680 + 766 0.000065 -0.000962 -0.004032 + 767 -0.002013 -0.005477 0.003901 + 768 0.003529 0.021570 0.007224 + 769 -0.002661 0.002604 -0.003268 + 770 0.005668 -0.003962 -0.004196 + 771 -0.003633 0.008263 -0.012842 + 772 0.001811 0.001915 0.002764 + 773 0.007995 -0.017893 0.012738 + 774 -0.018466 -0.002519 -0.001997 + 775 -0.002231 0.000080 0.000338 + 776 -0.020092 -0.012422 0.010443 + 777 0.017610 0.006562 -0.019411 + 778 -0.001733 0.005494 0.004582 + 779 0.013495 0.017522 0.004058 + 780 0.014733 0.026971 -0.010419 + 781 0.001950 0.000577 -0.000870 + 782 -0.025830 0.001269 0.005271 + 783 0.007534 -0.015453 0.006553 + 784 0.004959 0.000931 -0.005022 + 785 -0.008754 0.005835 0.049441 + 786 0.010447 0.012462 0.001546 + 787 -0.001107 0.002522 0.000433 + 788 0.009871 0.011686 0.008446 + 789 -0.006988 0.002247 0.021211 + 790 0.004245 0.001822 -0.000253 + 791 0.000153 -0.002603 0.008675 + 792 0.006252 0.003177 -0.013109 + 793 -0.002534 0.003863 0.000617 + 794 -0.000057 0.004391 -0.016346 + 795 0.005974 -0.000584 -0.004834 + 796 0.001827 -0.002339 -0.002010 + 797 -0.023150 0.007693 0.012507 + 798 0.012203 0.000464 -0.020004 + 799 -0.000293 -0.001883 -0.002470 + 800 -0.004248 0.006084 0.002613 + 801 -0.013517 0.015693 0.003574 + 802 -0.009450 0.005229 -0.003400 + 803 -0.015058 -0.007700 0.001796 + 804 -0.000196 -0.003546 0.002537 + 805 0.008758 -0.003257 0.005431 + 806 0.012998 -0.011952 -0.017276 + 807 0.008558 -0.002765 0.006723 + 808 -0.001470 -0.000539 0.002965 + 809 0.024028 -0.019423 -0.012788 + 810 0.003892 0.003966 -0.001573 + 811 0.000254 0.001510 0.000089 + 812 0.024395 0.007424 -0.013783 + 813 0.006830 0.017138 0.017010 + 814 -0.001535 -0.003749 -0.001708 + 815 0.013748 -0.018314 -0.006646 + 816 0.003900 0.002047 0.006451 + 817 0.006585 0.003832 -0.000629 + 818 0.021540 0.003252 0.001280 + 819 0.007897 0.007247 -0.003727 + 820 -0.002115 -0.002434 -0.005025 + 821 -0.016735 0.003360 -0.019137 + 822 0.003237 -0.017804 -0.004111 + 823 -0.003907 0.002878 -0.003988 + 824 -0.005419 -0.002010 -0.004476 + 825 -0.006449 0.003104 -0.002766 + 826 -0.013638 -0.002258 -0.002448 + 827 -0.007838 0.000023 -0.005866 + 828 -0.006633 0.001312 -0.008943 + 829 0.001696 0.003761 -0.002125 + 830 -0.001113 -0.010288 -0.008692 + 831 0.010380 0.008838 -0.015548 + 832 -0.003164 0.004544 -0.002070 + 833 -0.001495 -0.013094 -0.000890 + 834 0.011945 -0.015741 -0.003378 + 835 -0.008802 -0.001939 -0.005442 + 836 -0.002949 -0.007279 -0.004665 + 837 0.008414 -0.021459 -0.000948 + 838 0.001330 0.000622 0.000916 + 839 -0.001965 0.001331 0.006138 + 840 0.003081 -0.004825 0.007272 + 841 0.001557 -0.005770 -0.001563 + 842 0.014285 0.020628 -0.029634 + 843 -0.006815 0.003616 0.008747 + 844 0.001116 -0.003881 -0.003556 + 845 0.008316 -0.005783 -0.005256 + 846 -0.011615 0.015346 0.026431 + 847 0.004309 0.003546 -0.004311 + 848 0.007868 -0.013572 0.000073 + 849 -0.011699 0.005875 0.003604 + 850 0.000505 -0.004069 -0.002113 + 851 0.001211 -0.005770 -0.003436 + 852 -0.004651 0.001028 0.007154 + 853 -0.003913 -0.006795 -0.004733 + 854 -0.004339 -0.014527 -0.023555 + 855 -0.006756 -0.006056 -0.008714 + 856 0.007493 0.001588 -0.006408 + 857 0.020526 0.022065 -0.006921 + 858 0.010862 0.004031 -0.001655 + 859 0.003459 -0.001125 -0.001494 + 860 -0.000710 0.004855 0.022662 + 861 -0.000022 0.009082 0.012428 + 862 -0.000591 0.002648 0.002517 + 863 0.017910 0.003993 0.005847 + 864 -0.004999 0.014284 -0.016199 + 865 -0.001700 -0.002300 0.001206 + 866 -0.016994 -0.008747 -0.012103 + 867 -0.008118 -0.008616 0.003715 + 868 -0.002056 -0.003732 -0.006667 + 869 -0.002586 -0.005666 -0.002032 + 870 -0.002179 -0.001361 -0.001378 + 871 0.001952 0.000747 -0.004175 + 872 -0.000006 -0.004573 0.003592 + 873 -0.004377 -0.012174 0.000091 + 874 -0.006945 -0.004708 0.004295 + 875 -0.011724 -0.010397 0.002368 + 876 0.006805 0.012734 0.019238 + 877 0.004959 0.005871 -0.001277 + 878 -0.012228 -0.000867 -0.006672 + 879 0.014516 0.032640 0.025985 + 880 0.000767 -0.000179 0.004816 + 881 0.006242 0.002132 0.007465 + 882 0.006812 0.003103 0.007707 + 883 0.005120 -0.003059 -0.001062 + 884 -0.008255 -0.016076 -0.002362 + 885 -0.001789 -0.014152 -0.001194 + 886 -0.009000 0.001340 0.001690 + 887 -0.020559 -0.017599 0.000329 + 888 -0.003544 -0.006539 0.004087 + 889 -0.000933 0.000538 -0.001999 + 890 0.032797 0.013397 0.000525 + 891 -0.012354 -0.008526 -0.038077 + 892 0.002953 -0.002317 -0.004454 + 893 -0.029479 -0.014864 0.005868 + 894 0.019223 0.000709 -0.013773 + 895 0.002346 -0.003694 -0.004486 + 896 -0.005275 -0.001221 -0.010755 + 897 0.010883 0.001918 -0.002099 + 898 -0.000263 -0.000830 0.005518 + 899 0.000399 -0.005578 0.011643 + 900 -0.007207 -0.006080 -0.006632 + 901 -0.000868 0.002637 -0.000416 + 902 -0.003601 0.001456 0.001019 + 903 0.003465 0.009000 0.002627 + 904 -0.005492 0.001153 0.005034 + 905 0.008501 0.009963 0.005133 + 906 0.002740 0.005510 0.005387 + 907 0.001230 0.003701 -0.010904 + 908 0.005640 0.000943 -0.026378 + 909 -0.001655 0.006661 0.001080 + 910 0.000417 -0.004485 0.000899 + 911 0.004051 -0.003590 0.002016 + 912 0.010109 -0.002124 0.001500 + 913 0.002439 0.006335 0.003103 + 914 -0.006325 0.005901 0.006397 + 915 0.008058 0.002545 0.004591 + 916 -0.001774 -0.003954 -0.005522 + 917 -0.001697 -0.002110 -0.006988 + 918 0.000641 -0.012660 -0.001878 + 919 0.000840 0.002158 -0.002127 + 920 -0.006972 -0.005865 -0.019536 + 921 -0.009078 -0.009093 0.005319 + 922 -0.002466 0.001612 -0.002348 + 923 -0.007997 0.000173 -0.007016 + 924 -0.005167 0.000122 -0.004809 + 925 0.000182 0.007626 -0.005820 + 926 -0.000187 0.006758 -0.004766 + 927 -0.005146 0.010941 -0.001145 + 928 -0.001035 0.003329 -0.000156 + 929 -0.002925 0.005286 0.005381 + 930 -0.007353 0.014383 0.015446 + 931 0.001566 0.003779 -0.001844 + 932 0.014111 -0.006162 0.016836 + 933 -0.008051 -0.000942 0.006114 + 934 0.000472 0.000581 0.003898 + 935 0.010438 -0.015336 0.026259 + 936 -0.009803 0.018803 -0.011113 + 937 -0.002622 0.001845 -0.004649 + 938 0.000192 0.006195 -0.003034 + 939 -0.004379 0.004856 -0.008876 + 940 0.005312 -0.005320 -0.000644 + 941 0.004197 0.002434 0.005873 + 942 0.001054 -0.002144 -0.009156 + 943 0.001818 0.002764 0.000410 + 944 0.002489 0.005354 -0.014128 + 945 0.003819 0.010472 0.007403 + 946 0.005262 -0.000699 0.001191 + 947 -0.002052 -0.008290 0.017377 + 948 -0.012921 -0.009037 0.007720 + 949 0.002875 -0.000206 -0.005514 + 950 0.004620 -0.003924 -0.007344 + 951 0.004396 0.015332 -0.008395 + 952 -0.001773 -0.005567 0.004807 + 953 0.014650 -0.004337 0.011316 + 954 0.007355 -0.004603 0.004796 + 955 0.001050 0.002663 -0.000049 + 956 -0.000422 0.019759 -0.003121 + 957 -0.011736 0.001700 0.005445 + 958 0.002314 -0.007359 0.001422 + 959 0.000226 -0.009157 0.011161 + 960 0.002971 -0.007641 -0.001658 + 961 0.002025 0.003310 0.000085 + 962 0.003783 0.005544 -0.002440 + 963 -0.003390 -0.001680 0.007759 + 964 -0.000259 -0.001517 -0.001671 + 965 -0.009891 -0.000275 0.002930 + 966 -0.004798 -0.018121 0.000493 + 967 0.002742 0.002196 0.002639 + 968 -0.032110 0.008681 0.017593 + 969 -0.005767 -0.003804 -0.003447 + 970 -0.001025 -0.001901 0.007377 + 971 -0.025416 -0.005633 -0.009650 + 972 -0.002448 -0.002342 0.009184 + 973 0.000510 -0.004313 0.003297 + 974 -0.004244 -0.006185 -0.015114 + 975 0.002817 0.008222 0.025232 + 976 -0.005979 0.000432 0.003264 + 977 0.000348 0.000126 0.007237 + 978 -0.031461 0.008376 -0.002490 + 979 -0.003066 -0.005264 0.001528 + 980 0.000500 -0.005194 -0.000082 + 981 -0.006145 0.003915 -0.013465 + 982 -0.002081 -0.001596 0.001268 + 983 0.004918 -0.004802 -0.009499 + 984 -0.008729 0.005751 0.010881 + 985 0.002456 -0.001947 -0.001558 + 986 -0.006566 -0.000024 0.003315 + 987 0.007532 0.005898 -0.002575 + 988 -0.004247 -0.003264 -0.000409 + 989 0.002165 -0.007499 0.004990 + 990 -0.000419 0.003692 -0.004472 + 991 -0.001571 -0.000159 -0.000431 + 992 0.005413 0.009517 0.004397 + 993 -0.002643 -0.002292 -0.001478 + 994 -0.003884 0.005066 -0.000457 + 995 0.006816 0.009263 -0.003376 + 996 -0.007273 0.011919 0.000514 + 997 0.000030 0.001409 0.005477 + 998 0.005334 -0.020033 0.004464 + 999 0.016228 0.009598 -0.007106 + 1000 -0.002283 -0.004481 0.001317 + 1001 -0.002631 -0.006631 -0.004233 + 1002 0.004184 0.000805 0.014756 + 1003 0.000408 -0.003693 0.003308 + 1004 0.004530 -0.006410 -0.006453 + 1005 -0.004928 -0.003846 0.015168 + 1006 0.003101 -0.001511 0.005308 + 1007 0.014081 -0.002443 0.012313 + 1008 0.002846 0.010440 -0.000376 + 1009 0.003569 -0.002175 -0.006662 + 1010 -0.008368 -0.011644 -0.006989 + 1011 0.019824 -0.004949 -0.018661 + 1012 0.003202 -0.011850 0.003160 + 1013 0.014918 -0.009378 0.018579 + 1014 -0.002594 0.004575 -0.001959 + 1015 -0.002298 0.000413 -0.003910 + 1016 0.012837 -0.003799 -0.015681 + 1017 -0.005955 -0.000660 0.004171 + 1018 0.001582 0.000975 0.000146 + 1019 0.006776 -0.014144 -0.007821 + 1020 0.004234 -0.001693 -0.007198 + 1021 -0.001802 -0.002656 0.003257 + 1022 0.028537 0.012512 0.005966 + 1023 -0.000026 -0.011732 -0.013572 + 1024 0.006685 0.008417 -0.002619 + 1025 -0.018380 0.006240 0.006444 + 1026 0.014195 0.009753 -0.004447 + 1027 -0.000769 -0.006799 -0.003510 + 1028 -0.003532 0.013774 -0.009337 + 1029 0.005263 0.018084 -0.010946 + 1030 0.004102 0.004262 -0.002426 + 1031 -0.003256 -0.005354 0.003498 + 1032 -0.021894 -0.003478 0.016467 + 1033 0.001456 -0.004355 -0.002070 + 1034 -0.005859 -0.004113 -0.005871 + 1035 -0.005758 -0.006886 -0.016585 + 1036 0.001562 0.006459 -0.000209 + 1037 0.001331 0.004667 0.000892 + 1038 0.012898 0.027063 -0.008125 + 1039 0.002117 0.007131 0.002457 + 1040 0.026605 0.010046 0.019045 + 1041 -0.017364 0.007077 -0.014953 + 1042 -0.000452 0.009291 0.004625 + 1043 -0.011059 0.009571 0.015357 + 1044 0.027928 -0.000208 0.009437 + 1045 0.003475 -0.004274 -0.000546 + 1046 0.012160 -0.001385 -0.006922 + 1047 -0.016274 -0.008100 -0.006675 + 1048 -0.003853 -0.003278 -0.001388 + 1049 0.014697 -0.003341 -0.007454 + 1050 0.011346 -0.009086 -0.006461 + 1051 -0.001161 -0.003940 -0.002833 + 1052 0.011182 0.001281 -0.000803 + 1053 -0.001345 -0.002375 -0.003580 + 1054 0.004028 0.002256 0.000990 + 1055 0.013302 0.008212 -0.007566 + 1056 0.029179 -0.014499 0.008878 + 1057 0.000706 0.001652 0.001826 + 1058 0.000498 -0.007266 0.024956 + 1059 0.001324 -0.008155 0.011295 + 1060 0.000971 -0.006253 -0.004688 + 1061 -0.004746 -0.005680 -0.016047 + 1062 -0.000356 -0.009050 -0.006561 + 1063 -0.000866 0.005460 0.000045 + 1064 -0.006882 0.011747 0.020163 + 1065 -0.000733 0.001409 -0.010900 + 1066 -0.003804 0.003558 0.001444 + 1067 0.004513 0.002071 -0.017536 + 1068 -0.000869 -0.002704 -0.014336 + 1069 -0.003015 0.003241 -0.002075 + 1070 0.003734 -0.005456 -0.000879 + 1071 -0.006686 -0.008010 -0.008654 + 1072 -0.000541 -0.003669 -0.004373 + 1073 0.003151 -0.002513 -0.013951 + 1074 0.003979 -0.005557 0.002931 + 1075 -0.005175 -0.004387 0.000228 + 1076 -0.005613 -0.012392 -0.029351 + 1077 0.009704 0.009953 -0.015680 + 1078 -0.000915 0.003660 -0.003078 + 1079 0.002529 0.001465 0.006987 + 1080 0.000880 0.001866 -0.004217 + 1081 0.000835 -0.000410 0.000029 + 1082 0.003324 -0.009356 0.012151 + 1083 -0.000797 0.009753 -0.012613 + 1084 0.004557 -0.006851 0.000257 + 1085 0.014378 -0.010986 -0.004036 + 1086 0.001889 0.001865 0.000904 + 1087 0.003881 0.000306 -0.000266 + 1088 0.006043 -0.030376 0.018797 + 1089 -0.001012 -0.002296 0.000324 + 1090 0.007042 0.008682 0.007323 + 1091 0.010016 0.002442 -0.028255 + 1092 -0.004827 0.009414 -0.012200 + 1093 0.002178 0.003272 0.000190 + 1094 0.003486 0.001815 -0.002585 + 1095 0.006020 0.002953 -0.010998 + 1096 0.002573 -0.000704 0.002051 + 1097 -0.010233 0.004335 0.005568 + 1098 0.003397 0.002649 0.010631 + 1099 -0.000367 -0.008657 0.004003 + 1100 0.006810 -0.008282 0.003316 + 1101 -0.008301 -0.011638 -0.006525 + 1102 -0.001900 -0.008810 0.001531 + 1103 0.003628 0.008111 0.009571 + 1104 0.017147 0.000173 0.003988 + 1105 0.006161 0.005444 0.001389 + 1106 -0.033784 0.028714 -0.002486 + 1107 0.022179 0.015181 0.025221 + 1108 0.002935 0.001125 -0.009560 + 1109 0.013392 0.009490 0.002655 + 1110 0.015380 -0.002935 -0.004728 + 1111 0.002760 -0.001052 0.002516 + 1112 -0.006737 0.002302 0.012384 + 1113 -0.004649 -0.009652 -0.009326 + 1114 -0.003333 0.004385 -0.006004 + 1115 -0.014175 0.007089 0.000199 + 1116 0.009875 0.004925 0.012791 + 1117 -0.004828 0.000366 0.001718 + 1118 0.009618 -0.007069 -0.012330 + 1119 -0.021489 -0.009155 -0.001603 + 1120 -0.001360 0.002089 -0.003585 + 1121 0.003530 -0.001847 0.010254 + 1122 0.016468 0.005240 -0.014692 + 1123 0.001989 -0.000949 0.003286 + 1124 0.022107 -0.012110 -0.007316 + 1125 0.012518 -0.010337 0.015891 + 1126 0.000850 -0.001413 -0.001737 + 1127 -0.014943 0.000360 -0.000490 + 1128 -0.027983 -0.005206 0.004037 + 1129 0.011232 0.000349 -0.006679 + 1130 -0.005484 -0.003095 -0.004430 + 1131 -0.005050 -0.002005 -0.015837 + 1132 -0.000470 0.001924 0.001131 + 1133 -0.016506 0.005240 0.008171 + 1134 0.011977 -0.012388 0.003671 + 1135 -0.000818 0.001081 0.001571 + 1136 0.009956 -0.006601 -0.002667 + 1137 -0.013344 0.009962 -0.000602 + 1138 -0.004379 0.004681 0.005655 + 1139 -0.022717 0.009805 -0.016911 + 1140 -0.017223 0.002867 0.018671 + 1141 -0.000339 -0.000149 -0.001276 + 1142 0.002292 0.016872 -0.004987 + 1143 -0.012964 -0.000693 -0.007140 + 1144 -0.002149 0.004008 -0.001355 + 1145 0.012575 0.018012 -0.011467 + 1146 -0.018572 0.011663 -0.005755 + 1147 0.000951 -0.000232 0.005705 + 1148 0.001030 -0.002411 0.005162 + 1149 -0.004871 0.010528 0.006213 + 1150 -0.003431 0.005236 0.003321 + 1151 -0.006083 0.008172 0.003730 + 1152 0.021201 0.002738 -0.026021 + 1153 -0.000559 -0.001274 0.002074 + 1154 -0.000342 -0.008595 -0.003314 + 1155 -0.004563 0.013150 0.001114 + 1156 0.002547 -0.003346 0.000793 + 1157 -0.004000 0.002915 0.001908 + 1158 0.008526 -0.013385 0.001263 + 1159 0.003331 -0.001629 -0.001592 + 1160 0.012216 0.004263 0.001290 + 1161 -0.024729 0.027722 0.012828 + 1162 -0.004556 0.005331 -0.000790 + 1163 -0.001260 0.004809 0.012624 + 1164 0.009151 0.007740 0.005908 + 1165 0.006739 -0.002486 0.000962 + 1166 0.002801 -0.001010 0.007063 + 1167 0.006266 -0.009780 0.000447 + 1168 -0.001756 -0.006121 -0.000399 + 1169 0.002128 0.011752 0.003187 + 1170 -0.000744 -0.004455 -0.001624 + 1171 -0.003120 -0.007987 0.008768 + 1172 -0.001279 -0.014309 0.014916 + 1173 -0.003496 -0.005392 0.006518 + 1174 -0.005252 -0.000094 0.002610 + 1175 -0.004319 0.000327 0.003799 + 1176 0.014469 -0.001407 -0.023557 + 1177 -0.001733 0.011173 0.001097 + 1178 0.019607 0.000729 -0.008577 + 1179 -0.013430 0.021297 -0.011104 + 1180 0.005550 -0.002953 -0.004489 + 1181 -0.021164 -0.004283 0.009224 + 1182 0.020762 -0.011806 0.008058 + 1183 -0.003934 -0.006346 0.000789 + 1184 -0.004154 -0.012917 -0.000804 + 1185 0.001834 -0.003234 0.006486 + 1186 -0.003359 -0.000166 0.000482 + 1187 -0.010938 -0.009570 0.011838 + 1188 -0.006339 -0.002743 -0.017319 + 1189 -0.002008 -0.000238 -0.002842 + 1190 0.009730 0.002797 -0.000255 + 1191 0.004802 0.018470 -0.005529 + 1192 0.002978 0.003254 0.000406 + 1193 0.001762 -0.016118 0.017481 + 1194 0.009625 0.005549 -0.002833 + 1195 -0.005277 -0.000015 -0.004247 + 1196 0.008535 -0.018189 -0.023760 + 1197 -0.020839 0.008581 0.007193 + 1198 0.001976 -0.001531 0.001386 + 1199 -0.012488 -0.005613 0.004418 + 1200 0.012387 0.001324 -0.002579 + 1201 0.004612 0.001574 0.002430 + 1202 0.004011 0.024078 0.008286 + 1203 0.028635 -0.001749 -0.000378 + 1204 -0.001292 -0.004163 0.001688 + 1205 0.018917 -0.005327 -0.022863 + 1206 -0.021498 0.026796 -0.015481 + 1207 -0.004360 -0.003023 -0.007483 + 1208 0.015222 -0.007834 -0.014901 + 1209 -0.015487 -0.004003 -0.024684 + 1210 0.000162 -0.000232 -0.002511 + 1211 0.005663 0.001759 0.003041 + 1212 -0.026577 0.001752 0.009499 + 1213 -0.002118 -0.004800 0.002106 + 1214 0.012772 0.013880 -0.004149 + 1215 0.008831 0.004495 0.004278 + 1216 -0.001002 0.000396 0.000450 + 1217 0.001493 -0.000300 0.006615 + 1218 0.022789 -0.011336 -0.001626 + 1219 -0.002165 0.002305 -0.004399 + 1220 -0.001727 0.010653 0.006150 + 1221 0.001799 -0.000399 -0.015101 + 1222 -0.002535 -0.001664 0.000167 + 1223 -0.007939 0.009699 -0.003581 + 1224 -0.009214 -0.009452 -0.003331 + 1225 -0.002745 0.003249 0.011490 + 1226 0.010727 -0.015563 0.011870 + 1227 -0.003771 0.013856 -0.015486 + 1228 -0.000932 0.001513 0.000721 + 1229 -0.002528 0.000192 0.015301 + 1230 -0.027023 -0.007231 0.009659 + 1231 -0.005525 0.001099 -0.001369 + 1232 -0.002318 -0.008510 -0.009719 + 1233 -0.005945 -0.008347 0.009845 + 1234 -0.000817 -0.006097 -0.001394 + 1235 0.026844 0.005400 -0.013998 + 1236 -0.019837 0.017329 -0.010038 + 1237 -0.002691 -0.005371 -0.000786 + 1238 -0.007304 -0.006372 0.007409 + 1239 -0.014066 -0.005252 0.014237 + 1240 -0.000660 -0.004157 -0.007445 + 1241 -0.015343 -0.015681 0.000525 + 1242 -0.004856 0.008296 -0.020506 + 1243 -0.000451 -0.006253 0.005274 + 1244 -0.016626 -0.024128 0.003146 + 1245 0.003430 -0.001516 0.006995 + 1246 0.002369 0.000761 -0.000692 + 1247 -0.011034 0.017913 -0.003576 + 1248 0.014886 0.005052 0.010870 + 1249 0.000976 0.003044 0.004043 + 1250 0.002084 0.009119 -0.003484 + 1251 -0.004682 -0.003095 0.024419 + 1252 -0.001872 0.005519 -0.003878 + 1253 0.014045 0.004474 0.006660 + 1254 -0.006683 -0.012923 -0.006357 + 1255 -0.007125 -0.002296 0.002894 + 1256 -0.009126 -0.000293 0.008175 + 1257 -0.005668 -0.002902 -0.000640 + 1258 -0.009805 0.000500 -0.001546 + 1259 -0.007254 -0.007274 0.010849 + 1260 0.005786 0.004719 0.004479 + 1261 0.000767 -0.007091 -0.002809 + 1262 -0.010861 -0.024470 -0.006678 + 1263 0.010352 0.003874 -0.018616 + 1264 -0.001332 -0.000776 -0.001533 + 1265 0.005055 -0.002761 -0.000154 + 1266 0.001293 -0.010766 0.003695 + 1267 0.004101 0.005423 0.004161 + 1268 -0.006495 -0.001645 0.007645 + 1269 0.024277 0.000761 0.018148 + 1270 0.000384 -0.004677 0.001777 + 1271 -0.000305 -0.022286 0.006378 + 1272 0.014900 -0.009298 0.005029 + 1273 -0.002201 -0.002422 -0.001266 + 1274 0.002419 0.000621 -0.006170 + 1275 0.002242 -0.003567 -0.006329 + 1276 0.001155 0.006214 -0.002164 + 1277 -0.025679 0.011598 0.001775 + 1278 -0.016652 0.005061 0.002255 + 1279 -0.000163 0.000193 -0.001041 + 1280 -0.002822 -0.004131 -0.007696 + 1281 -0.007029 0.005316 -0.012422 + 1282 -0.001259 -0.001443 0.001295 + 1283 -0.000992 -0.027820 -0.000474 + 1284 -0.012190 -0.043729 -0.008054 + 1285 -0.001840 -0.001572 0.001104 + 1286 0.008311 0.001263 -0.001841 + 1287 0.001277 0.000429 -0.007113 + 1288 -0.005029 -0.002280 -0.002761 + 1289 -0.024723 0.012515 -0.012864 + 1290 -0.013845 -0.020399 0.001674 + 1291 -0.000161 0.002303 0.004199 + 1292 -0.010956 -0.010528 0.017163 + 1293 0.023554 -0.006815 0.021159 + 1294 0.000772 -0.000829 0.004462 + 1295 0.024106 -0.007189 -0.017980 + 1296 -0.011795 0.000225 0.018351 + 1297 -0.002503 0.000288 -0.000931 + 1298 -0.001901 -0.006775 -0.001166 + 1299 -0.002626 0.004209 -0.000596 + 1300 -0.003248 -0.009856 0.001496 + 1301 -0.008616 0.000206 -0.000660 + 1302 0.012991 -0.001944 0.010735 + 1303 0.000183 0.003767 -0.002207 + 1304 0.002875 0.006021 0.006091 + 1305 -0.003343 -0.008883 0.015455 + 1306 -0.003761 0.009400 -0.007147 + 1307 -0.002601 -0.012510 0.005900 + 1308 -0.013464 0.021935 0.006364 + 1309 0.007717 -0.006568 -0.004280 + 1310 0.004551 -0.013432 0.001741 + 1311 0.016676 -0.009730 -0.005415 + 1312 -0.003518 -0.000115 0.000120 + 1313 -0.018566 -0.004441 0.007076 + 1314 0.011422 0.004168 0.013848 + 1315 -0.002232 0.003004 -0.005210 + 1316 -0.004985 -0.000655 -0.007286 + 1317 -0.004756 0.005461 -0.010032 + 1318 0.003296 -0.000345 0.003797 + 1319 0.000013 0.003387 0.009258 + 1320 -0.001175 0.009021 0.016554 + 1321 0.004610 0.000563 0.001890 + 1322 0.001511 0.004957 0.010795 + 1323 -0.000517 0.009529 0.012695 + 1324 0.003561 -0.002127 -0.002139 + 1325 -0.016355 -0.004573 0.011414 + 1326 0.002437 -0.000969 0.003958 + 1327 -0.003191 0.002772 0.003706 + 1328 0.002188 0.004078 0.024902 + 1329 0.005804 0.008997 0.000514 + 1330 0.000169 -0.001823 0.006601 + 1331 -0.012837 0.016738 0.032499 + 1332 -0.003787 -0.003993 0.005792 + 1333 -0.006500 -0.001952 -0.005568 + 1334 0.004632 0.002607 -0.001417 + 1335 0.007826 -0.018417 0.003893 + 1336 0.001400 0.000629 -0.002329 + 1337 -0.026090 -0.010827 -0.007428 + 1338 0.014757 0.003359 0.005866 + 1339 0.005344 0.002452 0.000637 + 1340 0.002304 0.001516 0.008371 + 1341 0.003116 0.003502 0.000920 + 1342 0.000219 0.006872 -0.006361 + 1343 0.004872 0.004948 -0.015461 + 1344 0.002293 0.008990 -0.007103 + 1345 -0.000248 -0.001405 -0.000404 + 1346 0.016050 0.005473 0.014883 + 1347 0.000661 0.010958 0.009762 + 1348 0.002507 0.004854 0.004016 + 1349 -0.000026 0.005865 -0.004933 + 1350 -0.003541 0.012071 0.011984 + 1351 -0.000388 -0.001662 -0.002624 + 1352 -0.008781 0.002236 0.005933 + 1353 -0.002303 0.010321 -0.013971 + 1354 0.000266 0.005381 0.006218 + 1355 -0.030793 -0.017551 0.006520 + 1356 -0.001710 0.006198 0.003481 + 1357 -0.000575 0.000387 0.003498 + 1358 0.011844 0.006387 0.013823 + 1359 -0.004149 -0.001630 0.001064 + 1360 0.002966 -0.001211 -0.000529 + 1361 0.011026 0.001160 0.001568 + 1362 0.015143 -0.001234 0.000065 + 1363 0.000976 0.001952 -0.002769 + 1364 0.013527 0.011152 0.001594 + 1365 -0.000179 -0.000211 -0.002554 + 1366 -0.005351 -0.004969 -0.002979 + 1367 -0.006889 0.021662 -0.005435 + 1368 -0.002462 0.016113 0.008657 + 1369 -0.000975 0.000751 -0.000755 + 1370 -0.003243 0.006738 -0.001393 + 1371 -0.002267 -0.000779 0.003167 + 1372 0.001566 -0.003190 -0.000583 + 1373 -0.002018 -0.005136 0.012563 + 1374 -0.006828 0.007134 0.011132 + 1375 0.005244 -0.004715 -0.003319 + 1376 -0.010064 -0.001392 0.024842 + 1377 -0.003331 -0.012180 0.011450 + 1378 0.005044 -0.003538 0.000197 + 1379 0.014932 -0.005316 0.014871 + 1380 0.002959 -0.015155 -0.010790 + 1381 0.004288 0.003508 0.003045 + 1382 0.010516 0.006731 0.001181 + 1383 0.003157 0.002004 0.039661 + 1384 -0.003464 -0.000341 -0.002519 + 1385 0.000767 -0.010574 0.002375 + 1386 0.012132 0.009405 0.005728 + 1387 -0.002537 0.005096 -0.000141 + 1388 0.008455 -0.000335 0.003398 + 1389 0.000567 0.012932 0.006368 + 1390 0.007440 -0.002304 0.001444 + 1391 0.003946 0.007849 -0.005030 + 1392 0.012038 -0.016280 0.007159 + 1393 -0.001061 -0.002610 -0.000083 + 1394 0.010905 -0.006613 -0.001941 + 1395 -0.013885 -0.027620 0.005494 + 1396 0.013746 0.003525 0.007163 + 1397 0.003586 0.002644 -0.010792 + 1398 0.018544 0.013850 0.017322 + 1399 0.004571 0.000027 -0.001760 + 1400 0.012220 0.001858 -0.006751 + 1401 0.009850 -0.002003 0.019339 + 1402 -0.001383 0.002281 -0.007042 + 1403 -0.003363 0.001654 -0.017801 + 1404 0.011330 0.009635 0.005470 + 1405 0.000650 -0.001098 -0.005942 + 1406 0.005198 -0.008028 -0.003832 + 1407 0.017668 -0.005738 0.026099 + 1408 -0.001891 0.001162 0.003476 + 1409 -0.003537 0.018838 0.000972 + 1410 0.007980 0.016250 0.030292 + 1411 -0.001348 0.000197 0.004181 + 1412 -0.002255 -0.008393 -0.001355 + 1413 -0.008567 -0.008184 -0.000151 + 1414 -0.001145 0.001777 -0.004250 + 1415 -0.002565 -0.000609 -0.002622 + 1416 0.017182 0.009342 -0.008899 + 1417 -0.000336 -0.000833 -0.006619 + 1418 0.006594 -0.014023 -0.011705 + 1419 -0.010047 -0.002912 -0.003804 + 1420 0.005759 0.000406 0.005233 + 1421 -0.013174 -0.018780 -0.002966 + 1422 -0.003551 -0.005212 0.011087 + 1423 -0.001811 -0.005836 -0.002120 + 1424 -0.008296 0.022099 0.012646 + 1425 0.010130 0.006059 0.033707 + 1426 0.001039 -0.001025 -0.000459 + 1427 0.004468 0.000527 0.001539 + 1428 -0.001728 -0.005304 0.003140 + 1429 -0.000141 -0.003112 0.003400 + 1430 0.007530 -0.026022 0.005020 + 1431 -0.011982 0.032142 -0.001998 + 1432 -0.001642 0.003923 -0.003350 + 1433 0.016086 -0.002664 -0.005695 + 1434 -0.010354 0.000136 0.021071 + 1435 0.001502 -0.001507 0.005856 + 1436 -0.003359 -0.017617 -0.013060 + 1437 -0.001621 -0.013764 -0.008355 + 1438 -0.006074 0.001165 0.001910 + 1439 -0.004946 0.003618 0.011324 + 1440 -0.007761 0.002697 -0.006763 + 1441 -0.009332 0.000898 0.000750 + 1442 -0.017083 -0.010335 0.011191 + 1443 0.020780 0.013466 -0.015083 + 1444 -0.008140 -0.008032 -0.000180 + 1445 -0.001836 -0.008988 0.003973 + 1446 -0.008280 -0.004548 -0.003224 + 1447 0.000996 -0.002062 -0.001184 + 1448 -0.001863 -0.012096 0.003957 + 1449 -0.027050 0.007989 0.002157 + 1450 -0.001321 -0.000325 0.001355 + 1451 -0.006885 -0.000536 -0.022446 + 1452 0.008792 -0.007975 0.003329 + 1453 -0.003682 -0.004782 -0.002567 + 1454 -0.001180 -0.009011 0.018662 + 1455 -0.000958 -0.004899 0.013723 + 1456 0.000545 0.011919 -0.001753 + 1457 0.023799 0.010298 -0.002649 + 1458 0.014717 0.007757 -0.005400 + 1459 -0.004576 -0.007691 0.001365 + 1460 -0.006577 -0.016846 -0.022862 + 1461 -0.005206 0.003687 0.012428 + 1462 0.001923 -0.004758 -0.001993 + 1463 0.006600 0.017503 0.006935 + 1464 -0.006747 -0.003482 -0.000067 + 1465 0.000613 0.004580 0.004038 + 1466 -0.001945 0.022605 -0.000652 + 1467 0.017624 -0.001392 0.003829 + 1468 -0.003065 -0.003003 -0.000747 + 1469 -0.012664 -0.016566 -0.007030 + 1470 0.008660 -0.008358 0.004763 + 1471 -0.004008 0.000421 -0.006040 + 1472 0.003555 0.008566 -0.015842 + 1473 -0.001032 0.001700 -0.010204 + 1474 -0.000556 0.000599 0.003074 + 1475 0.001542 0.002939 0.005269 + 1476 -0.005281 -0.001944 0.003338 + 1477 -0.000195 -0.000293 -0.001004 + 1478 -0.009991 -0.005354 -0.013386 + 1479 -0.000476 -0.017594 0.007900 + 1480 0.000550 -0.000431 0.001422 + 1481 0.018094 -0.005183 0.016234 + 1482 0.010706 0.011668 -0.017772 + 1483 0.001291 0.006499 0.000951 + 1484 0.009985 -0.016962 0.009714 + 1485 0.020849 0.018365 -0.008351 + 1486 0.006940 0.004692 -0.002409 + 1487 0.022308 0.010182 -0.022897 + 1488 0.000269 0.008847 0.011834 + 1489 0.002051 0.007334 -0.000125 + 1490 -0.023048 0.013759 -0.030276 + 1491 0.023523 -0.005817 0.007754 + 1492 -0.001269 0.002979 0.001311 + 1493 -0.005596 0.006174 0.011007 + 1494 -0.009061 0.022719 0.002133 + 1495 -0.001128 0.004307 -0.002381 + 1496 -0.004340 0.013891 -0.003505 + 1497 0.001822 -0.005505 -0.001135 + 1498 -0.000910 0.001437 0.000165 + 1499 0.004510 -0.000360 -0.006425 + 1500 0.003993 0.000498 0.007321 + 1501 -0.002868 -0.000316 -0.000509 + 1502 0.000620 0.011286 0.008461 + 1503 -0.013079 -0.008157 0.007561 + 1504 -0.003002 0.003413 0.004968 + 1505 0.015262 -0.005133 0.012052 + 1506 -0.003968 -0.003643 0.003514 + 1507 0.005087 -0.001882 -0.000518 + 1508 0.000932 -0.002238 0.000800 + 1509 -0.008149 0.000695 -0.000827 + 1510 -0.001261 -0.003375 0.000333 + 1511 -0.001224 -0.004135 -0.003080 + 1512 0.009246 -0.010372 0.026354 + 1513 0.000697 -0.003200 0.001222 + 1514 -0.002319 0.003800 0.022860 + 1515 -0.018205 0.011600 -0.011416 + 1516 -0.001731 -0.001076 0.002612 + 1517 -0.004661 -0.010783 -0.001505 + 1518 0.016208 0.002810 0.004482 + 1519 0.003508 -0.001750 0.002537 + 1520 0.024576 -0.026041 -0.004083 + 1521 -0.019140 0.000844 0.001909 + 1522 -0.000341 0.001152 0.001967 + 1523 -0.020076 0.003364 0.001315 + 1524 -0.000942 0.000692 -0.003283 + 1525 -0.006519 -0.000419 0.000991 + 1526 -0.004033 0.006531 0.004791 + 1527 0.005626 0.012187 -0.014266 + 1528 0.001113 -0.004253 0.011930 + 1529 -0.010144 0.003567 0.009059 + 1530 -0.003464 0.001115 0.011591 + 1531 0.000006 0.000074 0.005751 + 1532 0.003604 0.008464 0.010627 + 1533 -0.004351 -0.009621 -0.000453 + 1534 -0.000196 -0.001160 0.002795 + 1535 -0.006855 0.001414 0.005552 + 1536 -0.000894 -0.002102 0.005053 + 1537 -0.002040 -0.005887 -0.003590 + 1538 -0.006852 -0.011947 -0.023080 + 1539 -0.016070 0.000160 0.010390 + 1540 0.004712 0.002848 -0.002998 + 1541 -0.004259 0.007840 0.008142 + 1542 -0.004861 0.004263 0.011728 + 1543 0.006968 -0.004871 0.004119 + 1544 -0.016558 -0.002046 -0.006090 + 1545 -0.006229 0.004475 0.001436 + 1546 -0.002341 -0.004733 -0.003946 + 1547 0.003563 0.004733 0.009615 + 1548 -0.013018 0.004747 -0.004733 + 1549 0.001703 -0.000331 0.003605 + 1550 0.005459 -0.002653 -0.012447 + 1551 0.013689 0.008625 -0.003301 + 1552 0.003195 0.001205 -0.000779 + 1553 -0.003336 -0.011439 -0.004979 + 1554 0.001015 0.018568 -0.007361 + 1555 -0.001647 -0.003759 0.001214 + 1556 0.015583 -0.016961 0.000384 + 1557 -0.011138 -0.013161 -0.015913 + 1558 0.005848 -0.002193 -0.007682 + 1559 0.009577 -0.005765 0.010025 + 1560 0.006984 0.005858 -0.020668 + 1561 -0.005040 0.001396 0.001932 + 1562 0.007071 0.009231 0.007700 + 1563 0.001743 0.005137 0.005850 + 1564 0.001857 0.002145 -0.004455 + 1565 -0.007462 0.014047 -0.012730 + 1566 0.013730 -0.006385 0.009586 + 1567 -0.002000 0.003453 -0.001882 + 1568 -0.009622 -0.007424 -0.003371 + 1569 -0.006993 -0.018224 -0.006858 + 1570 0.001461 0.001281 -0.002568 + 1571 0.018901 0.002357 0.001811 + 1572 -0.001592 0.019333 -0.002732 + 1573 -0.001308 -0.005730 -0.002519 + 1574 -0.014074 0.007287 0.021518 + 1575 -0.017324 -0.018775 -0.005647 + 1576 0.002340 -0.001593 0.004994 + 1577 -0.000516 0.003608 0.002676 + 1578 -0.014840 -0.017283 -0.001508 + 1579 -0.001557 -0.002471 -0.002555 + 1580 0.016654 -0.033672 0.006595 + 1581 0.013351 -0.030070 0.003443 + 1582 0.003752 0.001449 0.001862 + 1583 -0.011257 -0.002704 0.007355 + 1584 0.002139 0.006577 0.012771 + 1585 0.002251 0.002492 -0.002180 + 1586 0.010691 -0.005615 -0.001517 + 1587 -0.018738 0.016070 0.006914 + 1588 -0.001600 0.000180 0.001378 + 1589 0.004891 -0.007732 -0.013906 + 1590 -0.015149 0.011285 0.002913 + 1591 0.003944 -0.001162 -0.002407 + 1592 -0.013220 -0.006427 -0.006873 + 1593 -0.008388 0.022805 -0.011588 + 1594 0.000621 -0.004836 0.005509 + 1595 0.006148 -0.013451 0.002326 + 1596 -0.001161 -0.012639 -0.002024 + 1597 -0.005042 0.000613 0.003072 + 1598 -0.002560 -0.009516 -0.007164 + 1599 -0.007736 0.003315 0.007824 + 1600 -0.002409 -0.002549 -0.003082 + 1601 -0.002839 0.004415 -0.008830 + 1602 -0.006633 -0.001003 -0.004060 + 1603 -0.004810 -0.007495 -0.004047 + 1604 0.005200 -0.017270 0.009101 + 1605 0.000670 -0.009280 -0.012848 + 1606 -0.003830 0.001924 -0.002728 + 1607 -0.035525 0.007821 -0.020602 + 1608 0.016575 -0.019547 -0.006176 + 1609 0.003828 0.000099 -0.002605 + 1610 0.017387 0.007652 0.014875 + 1611 0.012190 0.014852 0.016071 + 1612 -0.003436 0.002187 -0.001035 + 1613 -0.005586 -0.003901 0.006033 + 1614 -0.005884 -0.005331 -0.011796 + 1615 -0.001799 -0.005019 0.004011 + 1616 0.002094 -0.028579 0.008471 + 1617 0.023334 0.020189 0.016696 + 1618 -0.000653 -0.003079 -0.001689 + 1619 -0.005925 -0.004542 -0.007489 + 1620 0.003980 0.000361 0.005598 + 1621 -0.000999 0.004025 -0.003724 + 1622 0.000058 0.024442 0.006515 + 1623 0.011473 -0.013431 0.004073 + 1624 0.002923 -0.003314 0.001931 + 1625 0.003377 -0.006029 -0.008704 + 1626 0.002413 0.015094 0.010447 + 1627 0.003654 -0.000619 -0.001261 + 1628 -0.004232 -0.000930 0.001384 + 1629 0.019160 0.000313 -0.006734 + 1630 0.003534 0.002394 -0.000501 + 1631 -0.008068 0.002953 0.008451 + 1632 0.014612 0.006975 -0.004278 + 1633 0.001620 0.003004 0.003226 + 1634 -0.007605 -0.007788 0.011245 + 1635 0.020296 -0.014907 -0.003043 + 1636 -0.002678 -0.006261 0.001869 + 1637 -0.007968 -0.013586 -0.003793 + 1638 -0.015202 -0.007224 -0.014352 + 1639 -0.005816 -0.003019 0.006480 + 1640 -0.001607 -0.004084 0.006246 + 1641 0.008520 -0.008049 0.002824 + 1642 -0.000658 -0.004008 -0.000300 + 1643 -0.000444 0.000650 -0.012168 + 1644 -0.006399 -0.006883 0.005254 + 1645 -0.001317 0.006093 0.001522 + 1646 -0.010770 -0.004270 -0.010989 + 1647 -0.005520 0.020979 0.012203 + 1648 -0.004763 0.001957 0.003649 + 1649 -0.010531 0.001095 0.022741 + 1650 0.001695 -0.009764 -0.029750 + 1651 0.000561 0.003660 0.004562 + 1652 0.004814 -0.011887 -0.011791 + 1653 0.015151 -0.017660 -0.020515 + 1654 -0.003720 -0.008154 0.002101 + 1655 -0.006836 0.005342 0.006830 + 1656 -0.008891 -0.005752 0.002656 + 1657 -0.004211 -0.006534 0.001470 + 1658 0.024344 -0.009232 0.001415 + 1659 -0.010793 -0.032076 -0.013330 + 1660 -0.000393 0.010082 -0.000260 + 1661 -0.003386 0.024037 -0.002341 + 1662 0.005231 -0.007154 0.002310 + 1663 0.004778 0.000685 -0.001247 + 1664 0.006845 -0.000146 -0.002439 + 1665 0.002831 0.001509 -0.001312 + 1666 -0.004575 0.002015 0.002231 + 1667 -0.008714 0.004773 0.019310 + 1668 -0.009036 0.006437 0.017025 + 1669 -0.001102 -0.003004 0.003294 + 1670 0.004690 0.016121 0.007181 + 1671 -0.000881 -0.003815 0.001639 + 1672 -0.000053 -0.001708 0.002633 + 1673 -0.004620 0.003536 0.000715 + 1674 -0.002636 -0.005429 0.007498 + 1675 0.002307 0.001406 0.002665 + 1676 -0.005270 -0.001969 0.007587 + 1677 0.001417 -0.009022 -0.021912 + 1678 0.000203 0.002930 -0.002177 + 1679 0.003819 0.012652 -0.002939 + 1680 -0.001040 0.005171 0.022221 + 1681 -0.001765 0.004140 -0.001020 + 1682 0.015888 -0.002384 -0.000464 + 1683 -0.019573 0.014814 -0.003047 + 1684 -0.002840 -0.000626 0.000097 + 1685 0.019011 -0.004434 -0.031132 + 1686 -0.011722 0.011711 0.019623 + 1687 -0.000720 0.008278 0.001232 + 1688 -0.000014 -0.005707 0.005722 + 1689 0.006445 -0.004607 0.004541 + 1690 -0.008451 -0.005406 -0.003097 + 1691 -0.025859 -0.004092 0.011942 + 1692 0.003198 0.017013 -0.015979 + 1693 0.001237 0.005482 0.001012 + 1694 -0.003233 0.012773 -0.012817 + 1695 -0.013658 -0.008102 0.007350 + 1696 0.004867 0.002547 -0.001769 + 1697 0.019074 -0.004173 0.005165 + 1698 0.008487 0.001064 0.000080 + 1699 0.002766 -0.001251 -0.001561 + 1700 -0.019200 0.027169 -0.007481 + 1701 0.006036 -0.028485 -0.009388 + 1702 -0.005460 0.002563 0.001784 + 1703 -0.017462 0.006398 0.005231 + 1704 -0.014453 0.005484 0.004388 + 1705 0.002956 -0.001348 0.006512 + 1706 0.009654 0.004653 0.025184 + 1707 0.006226 -0.001478 -0.018062 + 1708 0.003757 -0.000921 -0.000401 + 1709 0.004307 -0.009700 -0.007768 + 1710 0.003780 -0.012914 0.008582 + 1711 0.004846 -0.002032 -0.000808 + 1712 -0.000823 -0.002500 -0.004619 + 1713 0.014769 -0.010350 0.008970 + 1714 -0.001580 -0.000837 0.000021 + 1715 -0.002003 -0.002972 -0.000158 + 1716 -0.004469 -0.000404 0.001257 + 1717 -0.001782 0.001231 -0.003624 + 1718 -0.009550 0.008477 -0.006010 + 1719 -0.003240 -0.001801 -0.002707 + 1720 -0.003131 -0.002749 -0.002782 + 1721 -0.003319 -0.008008 -0.009572 + 1722 -0.003280 -0.008289 -0.009069 + 1723 -0.006776 0.001807 0.000809 + 1724 0.000630 0.005359 0.003033 + 1725 0.016012 0.013546 0.014364 + 1726 -0.005383 0.003683 -0.001052 + 1727 -0.000343 -0.021814 -0.000655 + 1728 0.015975 0.004809 -0.015863 + 1729 -0.002843 0.002136 0.000031 + 1730 0.008511 0.002265 -0.002748 + 1731 -0.026285 -0.002274 -0.004757 + 1732 0.005294 -0.003565 0.004694 + 1733 -0.002668 0.001103 -0.001112 + 1734 -0.009429 0.006969 -0.008965 + 1735 -0.001634 0.000110 0.001819 + 1736 -0.004942 0.001203 -0.007254 + 1737 -0.002655 0.002573 -0.003610 + 1738 -0.004831 0.005860 0.001407 + 1739 -0.014232 0.009476 0.016389 + 1740 -0.017895 0.005674 -0.009379 + 1741 0.003013 -0.002508 -0.001228 + 1742 0.000746 0.006449 -0.005992 + 1743 0.006650 -0.002762 0.000152 + 1744 0.002550 -0.008457 0.001324 + 1745 -0.001868 -0.010233 -0.023525 + 1746 0.003968 -0.007880 0.008439 + 1747 -0.000591 0.004322 -0.003592 + 1748 -0.014424 0.009132 0.003708 + 1749 0.012052 -0.004950 -0.011581 + 1750 0.001849 0.003842 -0.009164 + 1751 0.009453 -0.005684 -0.004817 + 1752 0.001564 0.018776 -0.004831 + 1753 0.000794 0.000968 -0.001710 + 1754 -0.003816 -0.004723 -0.000498 + 1755 -0.011972 0.005633 -0.006975 + 1756 -0.004635 0.005064 -0.004764 + 1757 -0.010722 0.012077 -0.027297 + 1758 -0.003376 0.000707 0.006078 + 1759 0.001092 0.005159 -0.000557 + 1760 0.014326 0.002844 -0.021424 + 1761 0.019579 -0.002405 -0.009532 + 1762 -0.000565 0.006632 0.002294 + 1763 -0.025047 0.006219 0.001583 + 1764 -0.004637 -0.007484 0.007079 + 1765 0.002563 -0.001616 -0.003316 + 1766 -0.001239 0.014897 -0.002355 + 1767 -0.001256 -0.009226 0.009450 + 1768 0.001056 0.005329 -0.003831 + 1769 -0.012555 0.037676 0.021233 + 1770 -0.005969 -0.003116 -0.014248 + 1771 0.000691 0.001302 0.002405 + 1772 -0.015733 0.001224 -0.004288 + 1773 0.006783 0.015986 -0.003342 + 1774 0.002355 0.002897 -0.002965 + 1775 -0.000435 0.005789 0.007980 + 1776 0.014211 0.000855 -0.014841 + 1777 -0.004596 -0.002169 0.000774 + 1778 0.002630 -0.027237 0.012553 + 1779 -0.000727 -0.003394 -0.009924 + 1780 0.001821 -0.001310 0.000540 + 1781 0.005476 -0.002057 0.001588 + 1782 0.008060 0.013457 -0.013767 + 1783 0.003078 -0.007047 0.009501 + 1784 -0.004392 -0.004982 0.015684 + 1785 -0.021173 -0.003917 -0.003013 + 1786 0.001492 -0.007162 -0.003460 + 1787 0.020179 0.025050 0.005018 + 1788 -0.018378 -0.021938 0.007656 + 1789 -0.000363 0.004076 -0.003991 + 1790 0.012179 0.023942 -0.003853 + 1791 0.002207 0.011773 0.006443 + 1792 0.001993 0.000538 0.002365 + 1793 0.008602 -0.013779 -0.007218 + 1794 0.007374 0.001122 0.001108 + 1795 0.003207 -0.011319 -0.004081 + 1796 0.010332 -0.007827 -0.001929 + 1797 0.001869 0.022609 0.012256 + 1798 0.001101 0.003835 0.002357 + 1799 -0.003624 0.011759 0.002745 + 1800 0.001557 -0.002337 -0.004179 + 1801 0.003327 -0.001910 -0.005250 + 1802 0.011996 0.003017 0.013309 + 1803 -0.013682 -0.002775 -0.008939 + 1804 -0.002064 -0.000934 0.000427 + 1805 -0.012146 0.024406 -0.015171 + 1806 0.005030 -0.019570 0.004311 + 1807 0.003003 0.004365 0.002257 + 1808 0.000823 0.000086 -0.005161 + 1809 -0.003001 0.001206 0.008241 + 1810 0.005602 -0.001423 0.002945 + 1811 0.000330 0.001483 -0.011075 + 1812 0.003652 0.009252 -0.000166 + 1813 0.004531 -0.000860 -0.000170 + 1814 0.018728 0.013621 0.031510 + 1815 0.011579 -0.009257 -0.004100 + 1816 0.002862 0.000330 -0.002342 + 1817 -0.003456 -0.001426 -0.004566 + 1818 -0.006589 0.018593 0.018322 + 1819 -0.001663 0.002113 0.003120 + 1820 0.002523 0.005185 0.010725 + 1821 -0.006456 -0.005159 0.018366 + 1822 -0.000677 -0.000638 0.005530 + 1823 0.006499 0.011396 0.003392 + 1824 0.000945 -0.008826 -0.007441 + 1825 -0.002582 0.001006 0.000170 + 1826 -0.000739 0.010378 -0.012944 + 1827 -0.004082 -0.009693 0.012271 + 1828 -0.002259 -0.002179 0.001812 + 1829 0.004365 0.028602 0.007523 + 1830 -0.001047 0.006781 -0.010318 + 1831 0.003053 0.002227 0.004523 + 1832 -0.004297 -0.007295 0.001900 + 1833 0.002925 0.002066 0.004473 + 1834 0.003171 0.000025 0.002189 + 1835 0.001188 0.002838 0.001014 + 1836 0.006142 0.003073 -0.003689 + 1837 0.009818 0.005253 0.006222 + 1838 0.013907 -0.003607 0.006764 + 1839 -0.000327 0.015573 -0.010930 + 1840 -0.003110 -0.005538 0.000400 + 1841 0.006244 -0.021206 -0.003853 + 1842 -0.010299 0.008474 0.021147 + 1843 -0.001053 -0.000598 0.004581 + 1844 -0.013621 0.002557 -0.003175 + 1845 -0.002495 0.000789 0.011106 + 1846 -0.000137 -0.004006 -0.000014 + 1847 -0.017819 -0.013981 0.011316 + 1848 -0.005844 -0.000863 -0.025248 + 1849 -0.002799 0.002996 -0.002499 + 1850 -0.012455 0.012490 -0.004469 + 1851 0.010514 0.009490 -0.009495 + 1852 -0.000560 -0.004144 -0.000656 + 1853 -0.007255 0.002559 0.003817 + 1854 0.004602 -0.007276 0.003469 + 1855 0.000128 0.001144 -0.008402 + 1856 0.008157 0.001721 -0.014464 + 1857 -0.004034 0.002739 -0.008982 + 1858 0.002856 0.004731 -0.003812 + 1859 0.008481 -0.004184 -0.015612 + 1860 -0.004966 0.006658 -0.006541 + 1861 0.005415 -0.007185 0.002622 + 1862 -0.000791 0.004294 0.012806 + 1863 0.006266 -0.008943 0.000048 + 1864 -0.004891 -0.000259 0.002435 + 1865 0.000775 -0.012600 0.009738 + 1866 -0.000239 0.020688 0.014963 + 1867 0.007752 0.006605 0.003522 + 1868 0.005559 0.005449 0.004823 + 1869 0.001382 0.020031 -0.009484 + 1870 0.000269 -0.000837 -0.001948 + 1871 -0.015324 0.006379 0.032972 + 1872 -0.010895 -0.006739 0.002233 + 1873 0.002406 -0.005817 -0.007929 + 1874 0.011974 0.013774 0.020789 + 1875 -0.005616 -0.012309 -0.023698 + 1876 -0.002712 -0.000118 0.000894 + 1877 -0.000559 -0.018665 -0.005699 + 1878 -0.022904 -0.016730 0.007620 + 1879 -0.006235 -0.000119 -0.005440 + 1880 -0.008616 0.001720 0.002602 + 1881 -0.019263 0.001295 0.018377 + 1882 -0.002493 0.002824 -0.002915 + 1883 0.007384 0.000692 0.003462 + 1884 -0.019228 -0.005451 0.005676 + 1885 0.002956 0.004628 -0.002177 + 1886 0.005617 0.021792 -0.005623 + 1887 -0.010771 -0.007154 -0.002600 + 1888 -0.006932 -0.006388 0.001795 + 1889 -0.026638 0.002211 0.017012 + 1890 -0.006429 -0.013703 0.021233 + 1891 0.004179 0.001508 -0.002942 + 1892 -0.015358 0.009799 -0.025507 + 1893 -0.009827 0.001263 -0.015038 + 1894 0.002515 0.004808 -0.006083 + 1895 -0.001395 -0.005178 0.010798 + 1896 0.005498 0.001296 -0.013456 + 1897 -0.006679 0.000004 0.000833 + 1898 -0.006339 0.003210 0.000555 + 1899 -0.007815 -0.000155 0.006317 + 1900 -0.003334 -0.000730 -0.000139 + 1901 -0.003197 -0.021225 -0.009098 + 1902 0.003310 -0.008203 -0.004863 + 1903 -0.007379 0.001152 -0.003847 + 1904 -0.008175 0.003836 -0.004939 + 1905 -0.007216 0.002039 -0.012076 + 1906 -0.002751 -0.006050 -0.001404 + 1907 -0.005827 0.008129 0.005351 + 1908 0.010377 0.010628 0.018761 + 1909 -0.002571 -0.007065 0.006215 + 1910 -0.004848 -0.014622 0.001577 + 1911 -0.004351 -0.002361 0.020679 + 1912 0.006139 0.001291 0.002464 + 1913 0.004939 0.003608 0.002097 + 1914 0.004274 0.000152 0.002451 + 1915 0.002989 0.000832 -0.000352 + 1916 -0.014159 -0.000914 0.002187 + 1917 0.012237 -0.003167 0.009134 + 1918 -0.004575 -0.001662 0.000082 + 1919 -0.007883 -0.002056 0.002571 + 1920 -0.003336 -0.001305 -0.000658 + 1921 0.004366 0.000439 0.001158 + 1922 -0.000155 0.003368 0.010592 + 1923 -0.014972 -0.009424 -0.018312 + 1924 -0.000613 -0.002374 0.000797 + 1925 0.007460 -0.016336 -0.000977 + 1926 -0.006787 0.004573 0.010255 + 1927 -0.002452 -0.000122 0.000124 + 1928 -0.015584 -0.009431 -0.007285 + 1929 -0.000101 0.008080 -0.015191 + 1930 0.002197 0.002310 -0.001612 + 1931 0.016237 -0.005090 0.018070 + 1932 0.001709 -0.003220 -0.011865 + 1933 -0.001150 0.000898 0.004173 + 1934 0.000323 -0.000312 -0.014495 + 1935 0.000516 -0.000491 -0.011422 + 1936 -0.005815 -0.002965 0.000187 + 1937 0.008195 0.018425 -0.027236 + 1938 -0.010921 -0.007575 -0.002217 + 1939 -0.004740 0.002745 0.006330 + 1940 0.002035 0.006523 0.010880 + 1941 -0.012191 0.004818 0.006605 + 1942 -0.003197 -0.004418 -0.003375 + 1943 0.003590 -0.017196 0.008070 + 1944 0.004548 0.006106 0.016045 + 1945 0.005444 0.002200 0.004561 + 1946 0.004448 0.009092 -0.001577 + 1947 -0.000522 0.006033 0.006559 + 1948 0.005450 0.001267 0.002269 + 1949 0.027952 -0.012604 0.001935 + 1950 -0.004826 -0.018174 0.014813 + 1951 0.005498 -0.000626 0.001156 + 1952 0.001428 -0.010472 0.000805 + 1953 -0.010198 -0.005573 -0.014564 + 1954 0.001605 -0.006572 0.005587 + 1955 -0.002403 -0.004981 0.000460 + 1956 0.010287 -0.003414 0.005774 + 1957 -0.005679 0.003540 -0.003175 + 1958 -0.005054 0.005203 -0.002733 + 1959 -0.006462 0.003843 0.002657 + 1960 -0.006606 -0.002499 -0.001538 + 1961 0.027567 -0.002565 0.034908 + 1962 0.001905 -0.003739 -0.001134 + 1963 -0.000871 0.002779 0.006534 + 1964 -0.013473 -0.002631 0.001200 + 1965 -0.008136 0.003625 0.001725 + 1966 0.002375 -0.002767 -0.000214 + 1967 0.015603 0.001192 0.006785 + 1968 -0.008229 0.002751 0.010337 + 1969 -0.002111 -0.006139 0.006236 + 1970 0.025783 -0.003684 0.015052 + 1971 -0.008026 -0.018580 0.028847 + 1972 -0.001966 -0.005103 0.002533 + 1973 0.025504 -0.012928 0.014439 + 1974 0.015919 0.008653 -0.013047 + 1975 -0.002145 -0.003853 -0.002353 + 1976 0.020573 0.023626 0.033600 + 1977 0.002418 -0.000127 0.000258 + 1978 -0.000168 -0.002747 0.002505 + 1979 0.011847 0.007945 0.003222 + 1980 0.002222 -0.001343 0.005437 + 1981 -0.004734 0.003071 -0.000955 + 1982 0.003752 -0.001882 -0.005052 + 1983 -0.008195 0.007844 0.004577 + 1984 0.007575 0.002209 -0.000466 + 1985 -0.005510 0.009650 -0.004399 + 1986 0.018263 0.019292 -0.008157 + 1987 -0.005098 -0.001581 -0.000328 + 1988 -0.004522 -0.021884 -0.005509 + 1989 -0.001598 -0.001668 0.002704 + 1990 -0.000494 0.002205 0.012458 + 1991 0.003153 0.001522 0.015672 + 1992 -0.000092 -0.002603 0.010098 + 1993 0.001919 -0.007389 0.001539 + 1994 -0.002690 -0.003376 -0.009963 + 1995 -0.005006 0.002932 -0.001670 + 1996 -0.003089 -0.005736 0.003689 + 1997 0.010713 -0.027613 -0.023000 + 1998 -0.006878 0.009457 0.006998 + 1999 -0.001817 0.000266 -0.004238 + 2000 -0.010974 0.005190 0.000117 + 2001 -0.008937 -0.003277 0.004337 + 2002 -0.000987 -0.001334 -0.004265 + 2003 -0.022280 -0.011677 -0.018343 + 2004 -0.010076 -0.005729 -0.026032 + +Bonds + + 1 3 1 7 + 2 2 1 3 + 3 1 1 2 + 4 4 2 5 + 5 4 2 6 + 6 4 2 4 + 7 6 7 19 + 8 5 7 8 + 9 1 8 9 + 10 7 8 11 + 11 8 8 20 + 12 3 9 28 + 13 2 9 10 + 14 10 11 21 + 15 9 11 12 + 16 10 11 22 + 17 11 12 14 + 18 11 12 13 + 19 12 13 23 + 20 11 13 15 + 21 12 14 24 + 22 11 14 16 + 23 11 15 17 + 24 12 15 25 + 25 11 16 17 + 26 12 16 26 + 27 13 17 18 + 28 14 18 27 + 29 5 28 29 + 30 6 28 32 + 31 1 29 30 + 32 8 29 33 + 33 8 29 34 + 34 3 30 35 + 35 2 30 31 + 36 5 35 36 + 37 6 35 39 + 38 1 36 37 + 39 8 36 40 + 40 8 36 41 + 41 2 37 38 + 42 3 37 42 + 43 6 42 53 + 44 5 42 43 + 45 1 43 44 + 46 7 43 46 + 47 8 43 54 + 48 3 44 62 + 49 2 44 45 + 50 10 46 56 + 51 10 46 55 + 52 9 46 47 + 53 11 47 48 + 54 11 47 49 + 55 11 48 50 + 56 12 48 57 + 57 11 49 51 + 58 12 49 58 + 59 11 50 52 + 60 12 50 59 + 61 11 51 52 + 62 12 51 60 + 63 12 52 61 + 64 6 62 70 + 65 5 62 63 + 66 7 63 66 + 67 1 63 64 + 68 8 63 71 + 69 2 64 65 + 70 3 64 79 + 71 15 66 67 + 72 10 66 73 + 73 10 66 72 + 74 10 67 75 + 75 10 67 74 + 76 16 67 68 + 77 17 68 69 + 78 4 69 76 + 79 4 69 78 + 80 4 69 77 + 81 5 79 80 + 82 6 79 81 + 83 4 80 84 + 84 4 80 83 + 85 4 80 82 + 86 18 85 86 + 87 18 85 87 + 88 18 88 90 + 89 18 88 89 + 90 18 91 93 + 91 18 91 92 + 92 18 94 96 + 93 18 94 95 + 94 18 97 98 + 95 18 97 99 + 96 18 100 101 + 97 18 100 102 + 98 18 103 104 + 99 18 103 105 + 100 18 106 107 + 101 18 106 108 + 102 18 109 111 + 103 18 109 110 + 104 18 112 114 + 105 18 112 113 + 106 18 115 116 + 107 18 115 117 + 108 18 118 120 + 109 18 118 119 + 110 18 121 123 + 111 18 121 122 + 112 18 124 126 + 113 18 124 125 + 114 18 127 128 + 115 18 127 129 + 116 18 130 132 + 117 18 130 131 + 118 18 133 134 + 119 18 133 135 + 120 18 136 137 + 121 18 136 138 + 122 18 139 140 + 123 18 139 141 + 124 18 142 144 + 125 18 142 143 + 126 18 145 147 + 127 18 145 146 + 128 18 148 150 + 129 18 148 149 + 130 18 151 152 + 131 18 151 153 + 132 18 154 156 + 133 18 154 155 + 134 18 157 159 + 135 18 157 158 + 136 18 160 162 + 137 18 160 161 + 138 18 163 164 + 139 18 163 165 + 140 18 166 168 + 141 18 166 167 + 142 18 169 171 + 143 18 169 170 + 144 18 172 174 + 145 18 172 173 + 146 18 175 177 + 147 18 175 176 + 148 18 178 180 + 149 18 178 179 + 150 18 181 182 + 151 18 181 183 + 152 18 184 186 + 153 18 184 185 + 154 18 187 188 + 155 18 187 189 + 156 18 190 191 + 157 18 190 192 + 158 18 193 194 + 159 18 193 195 + 160 18 196 197 + 161 18 196 198 + 162 18 199 201 + 163 18 199 200 + 164 18 202 204 + 165 18 202 203 + 166 18 205 206 + 167 18 205 207 + 168 18 208 210 + 169 18 208 209 + 170 18 211 212 + 171 18 211 213 + 172 18 214 215 + 173 18 214 216 + 174 18 217 219 + 175 18 217 218 + 176 18 220 222 + 177 18 220 221 + 178 18 223 224 + 179 18 223 225 + 180 18 226 228 + 181 18 226 227 + 182 18 229 231 + 183 18 229 230 + 184 18 232 233 + 185 18 232 234 + 186 18 235 236 + 187 18 235 237 + 188 18 238 240 + 189 18 238 239 + 190 18 241 242 + 191 18 241 243 + 192 18 244 246 + 193 18 244 245 + 194 18 247 248 + 195 18 247 249 + 196 18 250 251 + 197 18 250 252 + 198 18 253 254 + 199 18 253 255 + 200 18 256 257 + 201 18 256 258 + 202 18 259 261 + 203 18 259 260 + 204 18 262 264 + 205 18 262 263 + 206 18 265 266 + 207 18 265 267 + 208 18 268 269 + 209 18 268 270 + 210 18 271 272 + 211 18 271 273 + 212 18 274 275 + 213 18 274 276 + 214 18 277 279 + 215 18 277 278 + 216 18 280 282 + 217 18 280 281 + 218 18 283 284 + 219 18 283 285 + 220 18 286 287 + 221 18 286 288 + 222 18 289 290 + 223 18 289 291 + 224 18 292 294 + 225 18 292 293 + 226 18 295 296 + 227 18 295 297 + 228 18 298 299 + 229 18 298 300 + 230 18 301 303 + 231 18 301 302 + 232 18 304 305 + 233 18 304 306 + 234 18 307 309 + 235 18 307 308 + 236 18 310 311 + 237 18 310 312 + 238 18 313 314 + 239 18 313 315 + 240 18 316 317 + 241 18 316 318 + 242 18 319 321 + 243 18 319 320 + 244 18 322 323 + 245 18 322 324 + 246 18 325 327 + 247 18 325 326 + 248 18 328 329 + 249 18 328 330 + 250 18 331 332 + 251 18 331 333 + 252 18 334 335 + 253 18 334 336 + 254 18 337 339 + 255 18 337 338 + 256 18 340 341 + 257 18 340 342 + 258 18 343 344 + 259 18 343 345 + 260 18 346 347 + 261 18 346 348 + 262 18 349 350 + 263 18 349 351 + 264 18 352 353 + 265 18 352 354 + 266 18 355 356 + 267 18 355 357 + 268 18 358 359 + 269 18 358 360 + 270 18 361 362 + 271 18 361 363 + 272 18 364 365 + 273 18 364 366 + 274 18 367 369 + 275 18 367 368 + 276 18 370 372 + 277 18 370 371 + 278 18 373 374 + 279 18 373 375 + 280 18 376 378 + 281 18 376 377 + 282 18 379 381 + 283 18 379 380 + 284 18 382 383 + 285 18 382 384 + 286 18 385 386 + 287 18 385 387 + 288 18 388 390 + 289 18 388 389 + 290 18 391 393 + 291 18 391 392 + 292 18 394 395 + 293 18 394 396 + 294 18 397 399 + 295 18 397 398 + 296 18 400 402 + 297 18 400 401 + 298 18 403 405 + 299 18 403 404 + 300 18 406 407 + 301 18 406 408 + 302 18 409 411 + 303 18 409 410 + 304 18 412 413 + 305 18 412 414 + 306 18 415 417 + 307 18 415 416 + 308 18 418 420 + 309 18 418 419 + 310 18 421 422 + 311 18 421 423 + 312 18 424 425 + 313 18 424 426 + 314 18 427 428 + 315 18 427 429 + 316 18 430 432 + 317 18 430 431 + 318 18 433 435 + 319 18 433 434 + 320 18 436 437 + 321 18 436 438 + 322 18 439 440 + 323 18 439 441 + 324 18 442 443 + 325 18 442 444 + 326 18 445 447 + 327 18 445 446 + 328 18 448 449 + 329 18 448 450 + 330 18 451 453 + 331 18 451 452 + 332 18 454 456 + 333 18 454 455 + 334 18 457 458 + 335 18 457 459 + 336 18 460 462 + 337 18 460 461 + 338 18 463 465 + 339 18 463 464 + 340 18 466 467 + 341 18 466 468 + 342 18 469 470 + 343 18 469 471 + 344 18 472 473 + 345 18 472 474 + 346 18 475 476 + 347 18 475 477 + 348 18 478 479 + 349 18 478 480 + 350 18 481 482 + 351 18 481 483 + 352 18 484 485 + 353 18 484 486 + 354 18 487 489 + 355 18 487 488 + 356 18 490 492 + 357 18 490 491 + 358 18 493 495 + 359 18 493 494 + 360 18 496 497 + 361 18 496 498 + 362 18 499 501 + 363 18 499 500 + 364 18 502 503 + 365 18 502 504 + 366 18 505 507 + 367 18 505 506 + 368 18 508 509 + 369 18 508 510 + 370 18 511 513 + 371 18 511 512 + 372 18 514 516 + 373 18 514 515 + 374 18 517 518 + 375 18 517 519 + 376 18 520 521 + 377 18 520 522 + 378 18 523 525 + 379 18 523 524 + 380 18 526 528 + 381 18 526 527 + 382 18 529 530 + 383 18 529 531 + 384 18 532 533 + 385 18 532 534 + 386 18 535 536 + 387 18 535 537 + 388 18 538 540 + 389 18 538 539 + 390 18 541 542 + 391 18 541 543 + 392 18 544 546 + 393 18 544 545 + 394 18 547 549 + 395 18 547 548 + 396 18 550 551 + 397 18 550 552 + 398 18 553 555 + 399 18 553 554 + 400 18 556 557 + 401 18 556 558 + 402 18 559 561 + 403 18 559 560 + 404 18 562 563 + 405 18 562 564 + 406 18 565 567 + 407 18 565 566 + 408 18 568 570 + 409 18 568 569 + 410 18 571 573 + 411 18 571 572 + 412 18 574 575 + 413 18 574 576 + 414 18 577 579 + 415 18 577 578 + 416 18 580 581 + 417 18 580 582 + 418 18 583 585 + 419 18 583 584 + 420 18 586 588 + 421 18 586 587 + 422 18 589 590 + 423 18 589 591 + 424 18 592 594 + 425 18 592 593 + 426 18 595 597 + 427 18 595 596 + 428 18 598 600 + 429 18 598 599 + 430 18 601 602 + 431 18 601 603 + 432 18 604 606 + 433 18 604 605 + 434 18 607 609 + 435 18 607 608 + 436 18 610 611 + 437 18 610 612 + 438 18 613 615 + 439 18 613 614 + 440 18 616 618 + 441 18 616 617 + 442 18 619 620 + 443 18 619 621 + 444 18 622 623 + 445 18 622 624 + 446 18 625 627 + 447 18 625 626 + 448 18 628 629 + 449 18 628 630 + 450 18 631 632 + 451 18 631 633 + 452 18 634 635 + 453 18 634 636 + 454 18 637 639 + 455 18 637 638 + 456 18 640 642 + 457 18 640 641 + 458 18 643 644 + 459 18 643 645 + 460 18 646 647 + 461 18 646 648 + 462 18 649 650 + 463 18 649 651 + 464 18 652 653 + 465 18 652 654 + 466 18 655 657 + 467 18 655 656 + 468 18 658 660 + 469 18 658 659 + 470 18 661 663 + 471 18 661 662 + 472 18 664 665 + 473 18 664 666 + 474 18 667 669 + 475 18 667 668 + 476 18 670 672 + 477 18 670 671 + 478 18 673 674 + 479 18 673 675 + 480 18 676 677 + 481 18 676 678 + 482 18 679 681 + 483 18 679 680 + 484 18 682 684 + 485 18 682 683 + 486 18 685 686 + 487 18 685 687 + 488 18 688 690 + 489 18 688 689 + 490 18 691 693 + 491 18 691 692 + 492 18 694 695 + 493 18 694 696 + 494 18 697 698 + 495 18 697 699 + 496 18 700 701 + 497 18 700 702 + 498 18 703 704 + 499 18 703 705 + 500 18 706 707 + 501 18 706 708 + 502 18 709 710 + 503 18 709 711 + 504 18 712 714 + 505 18 712 713 + 506 18 715 716 + 507 18 715 717 + 508 18 718 719 + 509 18 718 720 + 510 18 721 722 + 511 18 721 723 + 512 18 724 726 + 513 18 724 725 + 514 18 727 728 + 515 18 727 729 + 516 18 730 731 + 517 18 730 732 + 518 18 733 735 + 519 18 733 734 + 520 18 736 737 + 521 18 736 738 + 522 18 739 741 + 523 18 739 740 + 524 18 742 743 + 525 18 742 744 + 526 18 745 746 + 527 18 745 747 + 528 18 748 750 + 529 18 748 749 + 530 18 751 753 + 531 18 751 752 + 532 18 754 756 + 533 18 754 755 + 534 18 757 758 + 535 18 757 759 + 536 18 760 762 + 537 18 760 761 + 538 18 763 764 + 539 18 763 765 + 540 18 766 767 + 541 18 766 768 + 542 18 769 770 + 543 18 769 771 + 544 18 772 774 + 545 18 772 773 + 546 18 775 777 + 547 18 775 776 + 548 18 778 780 + 549 18 778 779 + 550 18 781 783 + 551 18 781 782 + 552 18 784 786 + 553 18 784 785 + 554 18 787 789 + 555 18 787 788 + 556 18 790 791 + 557 18 790 792 + 558 18 793 795 + 559 18 793 794 + 560 18 796 797 + 561 18 796 798 + 562 18 799 801 + 563 18 799 800 + 564 18 802 803 + 565 18 802 804 + 566 18 805 806 + 567 18 805 807 + 568 18 808 809 + 569 18 808 810 + 570 18 811 813 + 571 18 811 812 + 572 18 814 815 + 573 18 814 816 + 574 18 817 818 + 575 18 817 819 + 576 18 820 821 + 577 18 820 822 + 578 18 823 824 + 579 18 823 825 + 580 18 826 828 + 581 18 826 827 + 582 18 829 830 + 583 18 829 831 + 584 18 832 834 + 585 18 832 833 + 586 18 835 837 + 587 18 835 836 + 588 18 838 839 + 589 18 838 840 + 590 18 841 842 + 591 18 841 843 + 592 18 844 845 + 593 18 844 846 + 594 18 847 848 + 595 18 847 849 + 596 18 850 852 + 597 18 850 851 + 598 18 853 854 + 599 18 853 855 + 600 18 856 858 + 601 18 856 857 + 602 18 859 861 + 603 18 859 860 + 604 18 862 863 + 605 18 862 864 + 606 18 865 866 + 607 18 865 867 + 608 18 868 869 + 609 18 868 870 + 610 18 871 873 + 611 18 871 872 + 612 18 874 875 + 613 18 874 876 + 614 18 877 878 + 615 18 877 879 + 616 18 880 882 + 617 18 880 881 + 618 18 883 884 + 619 18 883 885 + 620 18 886 887 + 621 18 886 888 + 622 18 889 891 + 623 18 889 890 + 624 18 892 894 + 625 18 892 893 + 626 18 895 896 + 627 18 895 897 + 628 18 898 899 + 629 18 898 900 + 630 18 901 903 + 631 18 901 902 + 632 18 904 905 + 633 18 904 906 + 634 18 907 908 + 635 18 907 909 + 636 18 910 911 + 637 18 910 912 + 638 18 913 915 + 639 18 913 914 + 640 18 916 917 + 641 18 916 918 + 642 18 919 920 + 643 18 919 921 + 644 18 922 924 + 645 18 922 923 + 646 18 925 927 + 647 18 925 926 + 648 18 928 930 + 649 18 928 929 + 650 18 931 932 + 651 18 931 933 + 652 18 934 935 + 653 18 934 936 + 654 18 937 939 + 655 18 937 938 + 656 18 940 942 + 657 18 940 941 + 658 18 943 945 + 659 18 943 944 + 660 18 946 948 + 661 18 946 947 + 662 18 949 950 + 663 18 949 951 + 664 18 952 953 + 665 18 952 954 + 666 18 955 956 + 667 18 955 957 + 668 18 958 960 + 669 18 958 959 + 670 18 961 963 + 671 18 961 962 + 672 18 964 965 + 673 18 964 966 + 674 18 967 969 + 675 18 967 968 + 676 18 970 972 + 677 18 970 971 + 678 18 973 975 + 679 18 973 974 + 680 18 976 978 + 681 18 976 977 + 682 18 979 981 + 683 18 979 980 + 684 18 982 983 + 685 18 982 984 + 686 18 985 987 + 687 18 985 986 + 688 18 988 989 + 689 18 988 990 + 690 18 991 993 + 691 18 991 992 + 692 18 994 996 + 693 18 994 995 + 694 18 997 998 + 695 18 997 999 + 696 18 1000 1001 + 697 18 1000 1002 + 698 18 1003 1005 + 699 18 1003 1004 + 700 18 1006 1007 + 701 18 1006 1008 + 702 18 1009 1011 + 703 18 1009 1010 + 704 18 1012 1013 + 705 18 1012 1014 + 706 18 1015 1017 + 707 18 1015 1016 + 708 18 1018 1020 + 709 18 1018 1019 + 710 18 1021 1023 + 711 18 1021 1022 + 712 18 1024 1025 + 713 18 1024 1026 + 714 18 1027 1028 + 715 18 1027 1029 + 716 18 1030 1032 + 717 18 1030 1031 + 718 18 1033 1034 + 719 18 1033 1035 + 720 18 1036 1037 + 721 18 1036 1038 + 722 18 1039 1041 + 723 18 1039 1040 + 724 18 1042 1043 + 725 18 1042 1044 + 726 18 1045 1046 + 727 18 1045 1047 + 728 18 1048 1050 + 729 18 1048 1049 + 730 18 1051 1053 + 731 18 1051 1052 + 732 18 1054 1056 + 733 18 1054 1055 + 734 18 1057 1058 + 735 18 1057 1059 + 736 18 1060 1062 + 737 18 1060 1061 + 738 18 1063 1064 + 739 18 1063 1065 + 740 18 1066 1068 + 741 18 1066 1067 + 742 18 1069 1071 + 743 18 1069 1070 + 744 18 1072 1074 + 745 18 1072 1073 + 746 18 1075 1077 + 747 18 1075 1076 + 748 18 1078 1079 + 749 18 1078 1080 + 750 18 1081 1082 + 751 18 1081 1083 + 752 18 1084 1085 + 753 18 1084 1086 + 754 18 1087 1089 + 755 18 1087 1088 + 756 18 1090 1092 + 757 18 1090 1091 + 758 18 1093 1095 + 759 18 1093 1094 + 760 18 1096 1097 + 761 18 1096 1098 + 762 18 1099 1100 + 763 18 1099 1101 + 764 18 1102 1103 + 765 18 1102 1104 + 766 18 1105 1107 + 767 18 1105 1106 + 768 18 1108 1110 + 769 18 1108 1109 + 770 18 1111 1112 + 771 18 1111 1113 + 772 18 1114 1116 + 773 18 1114 1115 + 774 18 1117 1119 + 775 18 1117 1118 + 776 18 1120 1121 + 777 18 1120 1122 + 778 18 1123 1124 + 779 18 1123 1125 + 780 18 1126 1128 + 781 18 1126 1127 + 782 18 1129 1130 + 783 18 1129 1131 + 784 18 1132 1133 + 785 18 1132 1134 + 786 18 1135 1137 + 787 18 1135 1136 + 788 18 1138 1140 + 789 18 1138 1139 + 790 18 1141 1142 + 791 18 1141 1143 + 792 18 1144 1146 + 793 18 1144 1145 + 794 18 1147 1149 + 795 18 1147 1148 + 796 18 1150 1152 + 797 18 1150 1151 + 798 18 1153 1155 + 799 18 1153 1154 + 800 18 1156 1158 + 801 18 1156 1157 + 802 18 1159 1160 + 803 18 1159 1161 + 804 18 1162 1164 + 805 18 1162 1163 + 806 18 1165 1166 + 807 18 1165 1167 + 808 18 1168 1170 + 809 18 1168 1169 + 810 18 1171 1172 + 811 18 1171 1173 + 812 18 1174 1175 + 813 18 1174 1176 + 814 18 1177 1179 + 815 18 1177 1178 + 816 18 1180 1182 + 817 18 1180 1181 + 818 18 1183 1185 + 819 18 1183 1184 + 820 18 1186 1187 + 821 18 1186 1188 + 822 18 1189 1190 + 823 18 1189 1191 + 824 18 1192 1194 + 825 18 1192 1193 + 826 18 1195 1196 + 827 18 1195 1197 + 828 18 1198 1199 + 829 18 1198 1200 + 830 18 1201 1202 + 831 18 1201 1203 + 832 18 1204 1205 + 833 18 1204 1206 + 834 18 1207 1209 + 835 18 1207 1208 + 836 18 1210 1212 + 837 18 1210 1211 + 838 18 1213 1214 + 839 18 1213 1215 + 840 18 1216 1218 + 841 18 1216 1217 + 842 18 1219 1221 + 843 18 1219 1220 + 844 18 1222 1224 + 845 18 1222 1223 + 846 18 1225 1226 + 847 18 1225 1227 + 848 18 1228 1229 + 849 18 1228 1230 + 850 18 1231 1232 + 851 18 1231 1233 + 852 18 1234 1236 + 853 18 1234 1235 + 854 18 1237 1239 + 855 18 1237 1238 + 856 18 1240 1242 + 857 18 1240 1241 + 858 18 1243 1244 + 859 18 1243 1245 + 860 18 1246 1248 + 861 18 1246 1247 + 862 18 1249 1250 + 863 18 1249 1251 + 864 18 1252 1254 + 865 18 1252 1253 + 866 18 1255 1256 + 867 18 1255 1257 + 868 18 1258 1259 + 869 18 1258 1260 + 870 18 1261 1263 + 871 18 1261 1262 + 872 18 1264 1265 + 873 18 1264 1266 + 874 18 1267 1268 + 875 18 1267 1269 + 876 18 1270 1271 + 877 18 1270 1272 + 878 18 1273 1274 + 879 18 1273 1275 + 880 18 1276 1277 + 881 18 1276 1278 + 882 18 1279 1280 + 883 18 1279 1281 + 884 18 1282 1283 + 885 18 1282 1284 + 886 18 1285 1286 + 887 18 1285 1287 + 888 18 1288 1289 + 889 18 1288 1290 + 890 18 1291 1293 + 891 18 1291 1292 + 892 18 1294 1295 + 893 18 1294 1296 + 894 18 1297 1299 + 895 18 1297 1298 + 896 18 1300 1302 + 897 18 1300 1301 + 898 18 1303 1304 + 899 18 1303 1305 + 900 18 1306 1308 + 901 18 1306 1307 + 902 18 1309 1311 + 903 18 1309 1310 + 904 18 1312 1314 + 905 18 1312 1313 + 906 18 1315 1317 + 907 18 1315 1316 + 908 18 1318 1320 + 909 18 1318 1319 + 910 18 1321 1323 + 911 18 1321 1322 + 912 18 1324 1325 + 913 18 1324 1326 + 914 18 1327 1329 + 915 18 1327 1328 + 916 18 1330 1332 + 917 18 1330 1331 + 918 18 1333 1334 + 919 18 1333 1335 + 920 18 1336 1337 + 921 18 1336 1338 + 922 18 1339 1340 + 923 18 1339 1341 + 924 18 1342 1344 + 925 18 1342 1343 + 926 18 1345 1347 + 927 18 1345 1346 + 928 18 1348 1350 + 929 18 1348 1349 + 930 18 1351 1352 + 931 18 1351 1353 + 932 18 1354 1355 + 933 18 1354 1356 + 934 18 1357 1358 + 935 18 1357 1359 + 936 18 1360 1362 + 937 18 1360 1361 + 938 18 1363 1365 + 939 18 1363 1364 + 940 18 1366 1368 + 941 18 1366 1367 + 942 18 1369 1370 + 943 18 1369 1371 + 944 18 1372 1373 + 945 18 1372 1374 + 946 18 1375 1377 + 947 18 1375 1376 + 948 18 1378 1379 + 949 18 1378 1380 + 950 18 1381 1382 + 951 18 1381 1383 + 952 18 1384 1385 + 953 18 1384 1386 + 954 18 1387 1388 + 955 18 1387 1389 + 956 18 1390 1392 + 957 18 1390 1391 + 958 18 1393 1395 + 959 18 1393 1394 + 960 18 1396 1397 + 961 18 1396 1398 + 962 18 1399 1401 + 963 18 1399 1400 + 964 18 1402 1403 + 965 18 1402 1404 + 966 18 1405 1406 + 967 18 1405 1407 + 968 18 1408 1409 + 969 18 1408 1410 + 970 18 1411 1412 + 971 18 1411 1413 + 972 18 1414 1416 + 973 18 1414 1415 + 974 18 1417 1419 + 975 18 1417 1418 + 976 18 1420 1422 + 977 18 1420 1421 + 978 18 1423 1425 + 979 18 1423 1424 + 980 18 1426 1428 + 981 18 1426 1427 + 982 18 1429 1430 + 983 18 1429 1431 + 984 18 1432 1434 + 985 18 1432 1433 + 986 18 1435 1436 + 987 18 1435 1437 + 988 18 1438 1439 + 989 18 1438 1440 + 990 18 1441 1442 + 991 18 1441 1443 + 992 18 1444 1445 + 993 18 1444 1446 + 994 18 1447 1448 + 995 18 1447 1449 + 996 18 1450 1451 + 997 18 1450 1452 + 998 18 1453 1455 + 999 18 1453 1454 + 1000 18 1456 1457 + 1001 18 1456 1458 + 1002 18 1459 1461 + 1003 18 1459 1460 + 1004 18 1462 1463 + 1005 18 1462 1464 + 1006 18 1465 1466 + 1007 18 1465 1467 + 1008 18 1468 1470 + 1009 18 1468 1469 + 1010 18 1471 1472 + 1011 18 1471 1473 + 1012 18 1474 1476 + 1013 18 1474 1475 + 1014 18 1477 1478 + 1015 18 1477 1479 + 1016 18 1480 1482 + 1017 18 1480 1481 + 1018 18 1483 1485 + 1019 18 1483 1484 + 1020 18 1486 1488 + 1021 18 1486 1487 + 1022 18 1489 1491 + 1023 18 1489 1490 + 1024 18 1492 1493 + 1025 18 1492 1494 + 1026 18 1495 1496 + 1027 18 1495 1497 + 1028 18 1498 1499 + 1029 18 1498 1500 + 1030 18 1501 1502 + 1031 18 1501 1503 + 1032 18 1504 1505 + 1033 18 1504 1506 + 1034 18 1507 1509 + 1035 18 1507 1508 + 1036 18 1510 1512 + 1037 18 1510 1511 + 1038 18 1513 1515 + 1039 18 1513 1514 + 1040 18 1516 1518 + 1041 18 1516 1517 + 1042 18 1519 1520 + 1043 18 1519 1521 + 1044 18 1522 1524 + 1045 18 1522 1523 + 1046 18 1525 1526 + 1047 18 1525 1527 + 1048 18 1528 1529 + 1049 18 1528 1530 + 1050 18 1531 1533 + 1051 18 1531 1532 + 1052 18 1534 1536 + 1053 18 1534 1535 + 1054 18 1537 1539 + 1055 18 1537 1538 + 1056 18 1540 1541 + 1057 18 1540 1542 + 1058 18 1543 1545 + 1059 18 1543 1544 + 1060 18 1546 1547 + 1061 18 1546 1548 + 1062 18 1549 1551 + 1063 18 1549 1550 + 1064 18 1552 1553 + 1065 18 1552 1554 + 1066 18 1555 1557 + 1067 18 1555 1556 + 1068 18 1558 1559 + 1069 18 1558 1560 + 1070 18 1561 1562 + 1071 18 1561 1563 + 1072 18 1564 1565 + 1073 18 1564 1566 + 1074 18 1567 1569 + 1075 18 1567 1568 + 1076 18 1570 1571 + 1077 18 1570 1572 + 1078 18 1573 1575 + 1079 18 1573 1574 + 1080 18 1576 1578 + 1081 18 1576 1577 + 1082 18 1579 1581 + 1083 18 1579 1580 + 1084 18 1582 1584 + 1085 18 1582 1583 + 1086 18 1585 1586 + 1087 18 1585 1587 + 1088 18 1588 1590 + 1089 18 1588 1589 + 1090 18 1591 1592 + 1091 18 1591 1593 + 1092 18 1594 1596 + 1093 18 1594 1595 + 1094 18 1597 1598 + 1095 18 1597 1599 + 1096 18 1600 1602 + 1097 18 1600 1601 + 1098 18 1603 1605 + 1099 18 1603 1604 + 1100 18 1606 1608 + 1101 18 1606 1607 + 1102 18 1609 1610 + 1103 18 1609 1611 + 1104 18 1612 1614 + 1105 18 1612 1613 + 1106 18 1615 1617 + 1107 18 1615 1616 + 1108 18 1618 1620 + 1109 18 1618 1619 + 1110 18 1621 1623 + 1111 18 1621 1622 + 1112 18 1624 1625 + 1113 18 1624 1626 + 1114 18 1627 1629 + 1115 18 1627 1628 + 1116 18 1630 1631 + 1117 18 1630 1632 + 1118 18 1633 1635 + 1119 18 1633 1634 + 1120 18 1636 1637 + 1121 18 1636 1638 + 1122 18 1639 1641 + 1123 18 1639 1640 + 1124 18 1642 1643 + 1125 18 1642 1644 + 1126 18 1645 1646 + 1127 18 1645 1647 + 1128 18 1648 1650 + 1129 18 1648 1649 + 1130 18 1651 1653 + 1131 18 1651 1652 + 1132 18 1654 1656 + 1133 18 1654 1655 + 1134 18 1657 1658 + 1135 18 1657 1659 + 1136 18 1660 1661 + 1137 18 1660 1662 + 1138 18 1663 1664 + 1139 18 1663 1665 + 1140 18 1666 1668 + 1141 18 1666 1667 + 1142 18 1669 1670 + 1143 18 1669 1671 + 1144 18 1672 1674 + 1145 18 1672 1673 + 1146 18 1675 1676 + 1147 18 1675 1677 + 1148 18 1678 1680 + 1149 18 1678 1679 + 1150 18 1681 1683 + 1151 18 1681 1682 + 1152 18 1684 1685 + 1153 18 1684 1686 + 1154 18 1687 1688 + 1155 18 1687 1689 + 1156 18 1690 1691 + 1157 18 1690 1692 + 1158 18 1693 1695 + 1159 18 1693 1694 + 1160 18 1696 1697 + 1161 18 1696 1698 + 1162 18 1699 1701 + 1163 18 1699 1700 + 1164 18 1702 1703 + 1165 18 1702 1704 + 1166 18 1705 1707 + 1167 18 1705 1706 + 1168 18 1708 1709 + 1169 18 1708 1710 + 1170 18 1711 1712 + 1171 18 1711 1713 + 1172 18 1714 1716 + 1173 18 1714 1715 + 1174 18 1717 1718 + 1175 18 1717 1719 + 1176 18 1720 1721 + 1177 18 1720 1722 + 1178 18 1723 1724 + 1179 18 1723 1725 + 1180 18 1726 1727 + 1181 18 1726 1728 + 1182 18 1729 1730 + 1183 18 1729 1731 + 1184 18 1732 1734 + 1185 18 1732 1733 + 1186 18 1735 1737 + 1187 18 1735 1736 + 1188 18 1738 1740 + 1189 18 1738 1739 + 1190 18 1741 1743 + 1191 18 1741 1742 + 1192 18 1744 1745 + 1193 18 1744 1746 + 1194 18 1747 1749 + 1195 18 1747 1748 + 1196 18 1750 1751 + 1197 18 1750 1752 + 1198 18 1753 1755 + 1199 18 1753 1754 + 1200 18 1756 1758 + 1201 18 1756 1757 + 1202 18 1759 1760 + 1203 18 1759 1761 + 1204 18 1762 1764 + 1205 18 1762 1763 + 1206 18 1765 1767 + 1207 18 1765 1766 + 1208 18 1768 1769 + 1209 18 1768 1770 + 1210 18 1771 1773 + 1211 18 1771 1772 + 1212 18 1774 1776 + 1213 18 1774 1775 + 1214 18 1777 1779 + 1215 18 1777 1778 + 1216 18 1780 1781 + 1217 18 1780 1782 + 1218 18 1783 1784 + 1219 18 1783 1785 + 1220 18 1786 1787 + 1221 18 1786 1788 + 1222 18 1789 1790 + 1223 18 1789 1791 + 1224 18 1792 1793 + 1225 18 1792 1794 + 1226 18 1795 1796 + 1227 18 1795 1797 + 1228 18 1798 1799 + 1229 18 1798 1800 + 1230 18 1801 1803 + 1231 18 1801 1802 + 1232 18 1804 1806 + 1233 18 1804 1805 + 1234 18 1807 1809 + 1235 18 1807 1808 + 1236 18 1810 1812 + 1237 18 1810 1811 + 1238 18 1813 1815 + 1239 18 1813 1814 + 1240 18 1816 1818 + 1241 18 1816 1817 + 1242 18 1819 1821 + 1243 18 1819 1820 + 1244 18 1822 1823 + 1245 18 1822 1824 + 1246 18 1825 1827 + 1247 18 1825 1826 + 1248 18 1828 1830 + 1249 18 1828 1829 + 1250 18 1831 1832 + 1251 18 1831 1833 + 1252 18 1834 1835 + 1253 18 1834 1836 + 1254 18 1837 1838 + 1255 18 1837 1839 + 1256 18 1840 1842 + 1257 18 1840 1841 + 1258 18 1843 1845 + 1259 18 1843 1844 + 1260 18 1846 1848 + 1261 18 1846 1847 + 1262 18 1849 1851 + 1263 18 1849 1850 + 1264 18 1852 1854 + 1265 18 1852 1853 + 1266 18 1855 1856 + 1267 18 1855 1857 + 1268 18 1858 1859 + 1269 18 1858 1860 + 1270 18 1861 1862 + 1271 18 1861 1863 + 1272 18 1864 1866 + 1273 18 1864 1865 + 1274 18 1867 1869 + 1275 18 1867 1868 + 1276 18 1870 1871 + 1277 18 1870 1872 + 1278 18 1873 1874 + 1279 18 1873 1875 + 1280 18 1876 1877 + 1281 18 1876 1878 + 1282 18 1879 1881 + 1283 18 1879 1880 + 1284 18 1882 1883 + 1285 18 1882 1884 + 1286 18 1885 1886 + 1287 18 1885 1887 + 1288 18 1888 1890 + 1289 18 1888 1889 + 1290 18 1891 1892 + 1291 18 1891 1893 + 1292 18 1894 1896 + 1293 18 1894 1895 + 1294 18 1897 1898 + 1295 18 1897 1899 + 1296 18 1900 1902 + 1297 18 1900 1901 + 1298 18 1903 1905 + 1299 18 1903 1904 + 1300 18 1906 1908 + 1301 18 1906 1907 + 1302 18 1909 1911 + 1303 18 1909 1910 + 1304 18 1912 1913 + 1305 18 1912 1914 + 1306 18 1915 1916 + 1307 18 1915 1917 + 1308 18 1918 1920 + 1309 18 1918 1919 + 1310 18 1921 1923 + 1311 18 1921 1922 + 1312 18 1924 1926 + 1313 18 1924 1925 + 1314 18 1927 1929 + 1315 18 1927 1928 + 1316 18 1930 1932 + 1317 18 1930 1931 + 1318 18 1933 1935 + 1319 18 1933 1934 + 1320 18 1936 1937 + 1321 18 1936 1938 + 1322 18 1939 1940 + 1323 18 1939 1941 + 1324 18 1942 1944 + 1325 18 1942 1943 + 1326 18 1945 1947 + 1327 18 1945 1946 + 1328 18 1948 1950 + 1329 18 1948 1949 + 1330 18 1951 1953 + 1331 18 1951 1952 + 1332 18 1954 1955 + 1333 18 1954 1956 + 1334 18 1957 1959 + 1335 18 1957 1958 + 1336 18 1960 1961 + 1337 18 1960 1962 + 1338 18 1963 1965 + 1339 18 1963 1964 + 1340 18 1966 1967 + 1341 18 1966 1968 + 1342 18 1969 1970 + 1343 18 1969 1971 + 1344 18 1972 1974 + 1345 18 1972 1973 + 1346 18 1975 1977 + 1347 18 1975 1976 + 1348 18 1978 1979 + 1349 18 1978 1980 + 1350 18 1981 1982 + 1351 18 1981 1983 + 1352 18 1984 1986 + 1353 18 1984 1985 + 1354 18 1987 1988 + 1355 18 1987 1989 + 1356 18 1990 1992 + 1357 18 1990 1991 + 1358 18 1993 1995 + 1359 18 1993 1994 + 1360 18 1996 1998 + 1361 18 1996 1997 + 1362 18 1999 2000 + 1363 18 1999 2001 + 1364 18 2002 2004 + 1365 18 2002 2003 + +Angles + + 1 5 2 1 7 + 2 4 2 1 3 + 3 6 3 1 7 + 4 7 4 2 5 + 5 7 5 2 6 + 6 1 1 2 5 + 7 1 1 2 6 + 8 1 1 2 4 + 9 7 4 2 6 + 10 2 1 7 8 + 11 3 1 7 19 + 12 11 8 7 19 + 13 9 7 8 11 + 14 8 7 8 9 + 15 16 11 8 20 + 16 15 9 8 20 + 17 14 9 8 11 + 18 10 7 8 20 + 19 5 8 9 28 + 20 4 8 9 10 + 21 6 10 9 28 + 22 18 12 11 22 + 23 23 21 11 22 + 24 12 8 11 12 + 25 13 8 11 21 + 26 18 12 11 21 + 27 13 8 11 22 + 28 19 13 12 14 + 29 17 11 12 14 + 30 17 11 12 13 + 31 20 15 13 23 + 32 20 12 13 23 + 33 19 12 13 15 + 34 20 12 14 24 + 35 20 16 14 24 + 36 19 12 14 16 + 37 20 13 15 25 + 38 20 17 15 25 + 39 19 13 15 17 + 40 20 14 16 26 + 41 19 14 16 17 + 42 20 17 16 26 + 43 21 15 17 18 + 44 19 15 17 16 + 45 21 16 17 18 + 46 22 17 18 27 + 47 2 9 28 29 + 48 3 9 28 32 + 49 11 29 28 32 + 50 15 30 29 34 + 51 10 28 29 33 + 52 10 28 29 34 + 53 15 30 29 33 + 54 24 33 29 34 + 55 8 28 29 30 + 56 6 31 30 35 + 57 5 29 30 35 + 58 4 29 30 31 + 59 2 30 35 36 + 60 3 30 35 39 + 61 11 36 35 39 + 62 8 35 36 37 + 63 10 35 36 41 + 64 10 35 36 40 + 65 24 40 36 41 + 66 15 37 36 40 + 67 15 37 36 41 + 68 6 38 37 42 + 69 5 36 37 42 + 70 4 36 37 38 + 71 11 43 42 53 + 72 2 37 42 43 + 73 3 37 42 53 + 74 10 42 43 54 + 75 16 46 43 54 + 76 14 44 43 46 + 77 9 42 43 46 + 78 8 42 43 44 + 79 15 44 43 54 + 80 5 43 44 62 + 81 6 45 44 62 + 82 4 43 44 45 + 83 13 43 46 55 + 84 13 43 46 56 + 85 12 43 46 47 + 86 23 55 46 56 + 87 18 47 46 56 + 88 18 47 46 55 + 89 17 46 47 49 + 90 17 46 47 48 + 91 19 48 47 49 + 92 20 50 48 57 + 93 19 47 48 50 + 94 20 47 48 57 + 95 20 51 49 58 + 96 19 47 49 51 + 97 20 47 49 58 + 98 20 48 50 59 + 99 19 48 50 52 + 100 20 52 50 59 + 101 20 52 51 60 + 102 20 49 51 60 + 103 19 49 51 52 + 104 20 50 52 61 + 105 19 50 52 51 + 106 20 51 52 61 + 107 2 44 62 63 + 108 3 44 62 70 + 109 11 63 62 70 + 110 16 66 63 71 + 111 15 64 63 71 + 112 14 64 63 66 + 113 10 62 63 71 + 114 9 62 63 66 + 115 8 62 63 64 + 116 4 63 64 65 + 117 6 65 64 79 + 118 5 63 64 79 + 119 23 72 66 73 + 120 27 67 66 73 + 121 27 67 66 72 + 122 25 63 66 67 + 123 13 63 66 73 + 124 13 63 66 72 + 125 29 68 67 75 + 126 23 74 67 75 + 127 29 68 67 74 + 128 26 66 67 68 + 129 27 66 67 74 + 130 27 66 67 75 + 131 28 67 68 69 + 132 29 68 69 76 + 133 29 68 69 77 + 134 29 68 69 78 + 135 7 76 69 78 + 136 7 76 69 77 + 137 7 77 69 78 + 138 3 64 79 81 + 139 2 64 79 80 + 140 11 80 79 81 + 141 7 83 80 84 + 142 30 79 80 84 + 143 7 82 80 83 + 144 30 79 80 83 + 145 30 79 80 82 + 146 7 82 80 84 + 147 31 86 85 87 + 148 31 89 88 90 + 149 31 92 91 93 + 150 31 95 94 96 + 151 31 98 97 99 + 152 31 101 100 102 + 153 31 104 103 105 + 154 31 107 106 108 + 155 31 110 109 111 + 156 31 113 112 114 + 157 31 116 115 117 + 158 31 119 118 120 + 159 31 122 121 123 + 160 31 125 124 126 + 161 31 128 127 129 + 162 31 131 130 132 + 163 31 134 133 135 + 164 31 137 136 138 + 165 31 140 139 141 + 166 31 143 142 144 + 167 31 146 145 147 + 168 31 149 148 150 + 169 31 152 151 153 + 170 31 155 154 156 + 171 31 158 157 159 + 172 31 161 160 162 + 173 31 164 163 165 + 174 31 167 166 168 + 175 31 170 169 171 + 176 31 173 172 174 + 177 31 176 175 177 + 178 31 179 178 180 + 179 31 182 181 183 + 180 31 185 184 186 + 181 31 188 187 189 + 182 31 191 190 192 + 183 31 194 193 195 + 184 31 197 196 198 + 185 31 200 199 201 + 186 31 203 202 204 + 187 31 206 205 207 + 188 31 209 208 210 + 189 31 212 211 213 + 190 31 215 214 216 + 191 31 218 217 219 + 192 31 221 220 222 + 193 31 224 223 225 + 194 31 227 226 228 + 195 31 230 229 231 + 196 31 233 232 234 + 197 31 236 235 237 + 198 31 239 238 240 + 199 31 242 241 243 + 200 31 245 244 246 + 201 31 248 247 249 + 202 31 251 250 252 + 203 31 254 253 255 + 204 31 257 256 258 + 205 31 260 259 261 + 206 31 263 262 264 + 207 31 266 265 267 + 208 31 269 268 270 + 209 31 272 271 273 + 210 31 275 274 276 + 211 31 278 277 279 + 212 31 281 280 282 + 213 31 284 283 285 + 214 31 287 286 288 + 215 31 290 289 291 + 216 31 293 292 294 + 217 31 296 295 297 + 218 31 299 298 300 + 219 31 302 301 303 + 220 31 305 304 306 + 221 31 308 307 309 + 222 31 311 310 312 + 223 31 314 313 315 + 224 31 317 316 318 + 225 31 320 319 321 + 226 31 323 322 324 + 227 31 326 325 327 + 228 31 329 328 330 + 229 31 332 331 333 + 230 31 335 334 336 + 231 31 338 337 339 + 232 31 341 340 342 + 233 31 344 343 345 + 234 31 347 346 348 + 235 31 350 349 351 + 236 31 353 352 354 + 237 31 356 355 357 + 238 31 359 358 360 + 239 31 362 361 363 + 240 31 365 364 366 + 241 31 368 367 369 + 242 31 371 370 372 + 243 31 374 373 375 + 244 31 377 376 378 + 245 31 380 379 381 + 246 31 383 382 384 + 247 31 386 385 387 + 248 31 389 388 390 + 249 31 392 391 393 + 250 31 395 394 396 + 251 31 398 397 399 + 252 31 401 400 402 + 253 31 404 403 405 + 254 31 407 406 408 + 255 31 410 409 411 + 256 31 413 412 414 + 257 31 416 415 417 + 258 31 419 418 420 + 259 31 422 421 423 + 260 31 425 424 426 + 261 31 428 427 429 + 262 31 431 430 432 + 263 31 434 433 435 + 264 31 437 436 438 + 265 31 440 439 441 + 266 31 443 442 444 + 267 31 446 445 447 + 268 31 449 448 450 + 269 31 452 451 453 + 270 31 455 454 456 + 271 31 458 457 459 + 272 31 461 460 462 + 273 31 464 463 465 + 274 31 467 466 468 + 275 31 470 469 471 + 276 31 473 472 474 + 277 31 476 475 477 + 278 31 479 478 480 + 279 31 482 481 483 + 280 31 485 484 486 + 281 31 488 487 489 + 282 31 491 490 492 + 283 31 494 493 495 + 284 31 497 496 498 + 285 31 500 499 501 + 286 31 503 502 504 + 287 31 506 505 507 + 288 31 509 508 510 + 289 31 512 511 513 + 290 31 515 514 516 + 291 31 518 517 519 + 292 31 521 520 522 + 293 31 524 523 525 + 294 31 527 526 528 + 295 31 530 529 531 + 296 31 533 532 534 + 297 31 536 535 537 + 298 31 539 538 540 + 299 31 542 541 543 + 300 31 545 544 546 + 301 31 548 547 549 + 302 31 551 550 552 + 303 31 554 553 555 + 304 31 557 556 558 + 305 31 560 559 561 + 306 31 563 562 564 + 307 31 566 565 567 + 308 31 569 568 570 + 309 31 572 571 573 + 310 31 575 574 576 + 311 31 578 577 579 + 312 31 581 580 582 + 313 31 584 583 585 + 314 31 587 586 588 + 315 31 590 589 591 + 316 31 593 592 594 + 317 31 596 595 597 + 318 31 599 598 600 + 319 31 602 601 603 + 320 31 605 604 606 + 321 31 608 607 609 + 322 31 611 610 612 + 323 31 614 613 615 + 324 31 617 616 618 + 325 31 620 619 621 + 326 31 623 622 624 + 327 31 626 625 627 + 328 31 629 628 630 + 329 31 632 631 633 + 330 31 635 634 636 + 331 31 638 637 639 + 332 31 641 640 642 + 333 31 644 643 645 + 334 31 647 646 648 + 335 31 650 649 651 + 336 31 653 652 654 + 337 31 656 655 657 + 338 31 659 658 660 + 339 31 662 661 663 + 340 31 665 664 666 + 341 31 668 667 669 + 342 31 671 670 672 + 343 31 674 673 675 + 344 31 677 676 678 + 345 31 680 679 681 + 346 31 683 682 684 + 347 31 686 685 687 + 348 31 689 688 690 + 349 31 692 691 693 + 350 31 695 694 696 + 351 31 698 697 699 + 352 31 701 700 702 + 353 31 704 703 705 + 354 31 707 706 708 + 355 31 710 709 711 + 356 31 713 712 714 + 357 31 716 715 717 + 358 31 719 718 720 + 359 31 722 721 723 + 360 31 725 724 726 + 361 31 728 727 729 + 362 31 731 730 732 + 363 31 734 733 735 + 364 31 737 736 738 + 365 31 740 739 741 + 366 31 743 742 744 + 367 31 746 745 747 + 368 31 749 748 750 + 369 31 752 751 753 + 370 31 755 754 756 + 371 31 758 757 759 + 372 31 761 760 762 + 373 31 764 763 765 + 374 31 767 766 768 + 375 31 770 769 771 + 376 31 773 772 774 + 377 31 776 775 777 + 378 31 779 778 780 + 379 31 782 781 783 + 380 31 785 784 786 + 381 31 788 787 789 + 382 31 791 790 792 + 383 31 794 793 795 + 384 31 797 796 798 + 385 31 800 799 801 + 386 31 803 802 804 + 387 31 806 805 807 + 388 31 809 808 810 + 389 31 812 811 813 + 390 31 815 814 816 + 391 31 818 817 819 + 392 31 821 820 822 + 393 31 824 823 825 + 394 31 827 826 828 + 395 31 830 829 831 + 396 31 833 832 834 + 397 31 836 835 837 + 398 31 839 838 840 + 399 31 842 841 843 + 400 31 845 844 846 + 401 31 848 847 849 + 402 31 851 850 852 + 403 31 854 853 855 + 404 31 857 856 858 + 405 31 860 859 861 + 406 31 863 862 864 + 407 31 866 865 867 + 408 31 869 868 870 + 409 31 872 871 873 + 410 31 875 874 876 + 411 31 878 877 879 + 412 31 881 880 882 + 413 31 884 883 885 + 414 31 887 886 888 + 415 31 890 889 891 + 416 31 893 892 894 + 417 31 896 895 897 + 418 31 899 898 900 + 419 31 902 901 903 + 420 31 905 904 906 + 421 31 908 907 909 + 422 31 911 910 912 + 423 31 914 913 915 + 424 31 917 916 918 + 425 31 920 919 921 + 426 31 923 922 924 + 427 31 926 925 927 + 428 31 929 928 930 + 429 31 932 931 933 + 430 31 935 934 936 + 431 31 938 937 939 + 432 31 941 940 942 + 433 31 944 943 945 + 434 31 947 946 948 + 435 31 950 949 951 + 436 31 953 952 954 + 437 31 956 955 957 + 438 31 959 958 960 + 439 31 962 961 963 + 440 31 965 964 966 + 441 31 968 967 969 + 442 31 971 970 972 + 443 31 974 973 975 + 444 31 977 976 978 + 445 31 980 979 981 + 446 31 983 982 984 + 447 31 986 985 987 + 448 31 989 988 990 + 449 31 992 991 993 + 450 31 995 994 996 + 451 31 998 997 999 + 452 31 1001 1000 1002 + 453 31 1004 1003 1005 + 454 31 1007 1006 1008 + 455 31 1010 1009 1011 + 456 31 1013 1012 1014 + 457 31 1016 1015 1017 + 458 31 1019 1018 1020 + 459 31 1022 1021 1023 + 460 31 1025 1024 1026 + 461 31 1028 1027 1029 + 462 31 1031 1030 1032 + 463 31 1034 1033 1035 + 464 31 1037 1036 1038 + 465 31 1040 1039 1041 + 466 31 1043 1042 1044 + 467 31 1046 1045 1047 + 468 31 1049 1048 1050 + 469 31 1052 1051 1053 + 470 31 1055 1054 1056 + 471 31 1058 1057 1059 + 472 31 1061 1060 1062 + 473 31 1064 1063 1065 + 474 31 1067 1066 1068 + 475 31 1070 1069 1071 + 476 31 1073 1072 1074 + 477 31 1076 1075 1077 + 478 31 1079 1078 1080 + 479 31 1082 1081 1083 + 480 31 1085 1084 1086 + 481 31 1088 1087 1089 + 482 31 1091 1090 1092 + 483 31 1094 1093 1095 + 484 31 1097 1096 1098 + 485 31 1100 1099 1101 + 486 31 1103 1102 1104 + 487 31 1106 1105 1107 + 488 31 1109 1108 1110 + 489 31 1112 1111 1113 + 490 31 1115 1114 1116 + 491 31 1118 1117 1119 + 492 31 1121 1120 1122 + 493 31 1124 1123 1125 + 494 31 1127 1126 1128 + 495 31 1130 1129 1131 + 496 31 1133 1132 1134 + 497 31 1136 1135 1137 + 498 31 1139 1138 1140 + 499 31 1142 1141 1143 + 500 31 1145 1144 1146 + 501 31 1148 1147 1149 + 502 31 1151 1150 1152 + 503 31 1154 1153 1155 + 504 31 1157 1156 1158 + 505 31 1160 1159 1161 + 506 31 1163 1162 1164 + 507 31 1166 1165 1167 + 508 31 1169 1168 1170 + 509 31 1172 1171 1173 + 510 31 1175 1174 1176 + 511 31 1178 1177 1179 + 512 31 1181 1180 1182 + 513 31 1184 1183 1185 + 514 31 1187 1186 1188 + 515 31 1190 1189 1191 + 516 31 1193 1192 1194 + 517 31 1196 1195 1197 + 518 31 1199 1198 1200 + 519 31 1202 1201 1203 + 520 31 1205 1204 1206 + 521 31 1208 1207 1209 + 522 31 1211 1210 1212 + 523 31 1214 1213 1215 + 524 31 1217 1216 1218 + 525 31 1220 1219 1221 + 526 31 1223 1222 1224 + 527 31 1226 1225 1227 + 528 31 1229 1228 1230 + 529 31 1232 1231 1233 + 530 31 1235 1234 1236 + 531 31 1238 1237 1239 + 532 31 1241 1240 1242 + 533 31 1244 1243 1245 + 534 31 1247 1246 1248 + 535 31 1250 1249 1251 + 536 31 1253 1252 1254 + 537 31 1256 1255 1257 + 538 31 1259 1258 1260 + 539 31 1262 1261 1263 + 540 31 1265 1264 1266 + 541 31 1268 1267 1269 + 542 31 1271 1270 1272 + 543 31 1274 1273 1275 + 544 31 1277 1276 1278 + 545 31 1280 1279 1281 + 546 31 1283 1282 1284 + 547 31 1286 1285 1287 + 548 31 1289 1288 1290 + 549 31 1292 1291 1293 + 550 31 1295 1294 1296 + 551 31 1298 1297 1299 + 552 31 1301 1300 1302 + 553 31 1304 1303 1305 + 554 31 1307 1306 1308 + 555 31 1310 1309 1311 + 556 31 1313 1312 1314 + 557 31 1316 1315 1317 + 558 31 1319 1318 1320 + 559 31 1322 1321 1323 + 560 31 1325 1324 1326 + 561 31 1328 1327 1329 + 562 31 1331 1330 1332 + 563 31 1334 1333 1335 + 564 31 1337 1336 1338 + 565 31 1340 1339 1341 + 566 31 1343 1342 1344 + 567 31 1346 1345 1347 + 568 31 1349 1348 1350 + 569 31 1352 1351 1353 + 570 31 1355 1354 1356 + 571 31 1358 1357 1359 + 572 31 1361 1360 1362 + 573 31 1364 1363 1365 + 574 31 1367 1366 1368 + 575 31 1370 1369 1371 + 576 31 1373 1372 1374 + 577 31 1376 1375 1377 + 578 31 1379 1378 1380 + 579 31 1382 1381 1383 + 580 31 1385 1384 1386 + 581 31 1388 1387 1389 + 582 31 1391 1390 1392 + 583 31 1394 1393 1395 + 584 31 1397 1396 1398 + 585 31 1400 1399 1401 + 586 31 1403 1402 1404 + 587 31 1406 1405 1407 + 588 31 1409 1408 1410 + 589 31 1412 1411 1413 + 590 31 1415 1414 1416 + 591 31 1418 1417 1419 + 592 31 1421 1420 1422 + 593 31 1424 1423 1425 + 594 31 1427 1426 1428 + 595 31 1430 1429 1431 + 596 31 1433 1432 1434 + 597 31 1436 1435 1437 + 598 31 1439 1438 1440 + 599 31 1442 1441 1443 + 600 31 1445 1444 1446 + 601 31 1448 1447 1449 + 602 31 1451 1450 1452 + 603 31 1454 1453 1455 + 604 31 1457 1456 1458 + 605 31 1460 1459 1461 + 606 31 1463 1462 1464 + 607 31 1466 1465 1467 + 608 31 1469 1468 1470 + 609 31 1472 1471 1473 + 610 31 1475 1474 1476 + 611 31 1478 1477 1479 + 612 31 1481 1480 1482 + 613 31 1484 1483 1485 + 614 31 1487 1486 1488 + 615 31 1490 1489 1491 + 616 31 1493 1492 1494 + 617 31 1496 1495 1497 + 618 31 1499 1498 1500 + 619 31 1502 1501 1503 + 620 31 1505 1504 1506 + 621 31 1508 1507 1509 + 622 31 1511 1510 1512 + 623 31 1514 1513 1515 + 624 31 1517 1516 1518 + 625 31 1520 1519 1521 + 626 31 1523 1522 1524 + 627 31 1526 1525 1527 + 628 31 1529 1528 1530 + 629 31 1532 1531 1533 + 630 31 1535 1534 1536 + 631 31 1538 1537 1539 + 632 31 1541 1540 1542 + 633 31 1544 1543 1545 + 634 31 1547 1546 1548 + 635 31 1550 1549 1551 + 636 31 1553 1552 1554 + 637 31 1556 1555 1557 + 638 31 1559 1558 1560 + 639 31 1562 1561 1563 + 640 31 1565 1564 1566 + 641 31 1568 1567 1569 + 642 31 1571 1570 1572 + 643 31 1574 1573 1575 + 644 31 1577 1576 1578 + 645 31 1580 1579 1581 + 646 31 1583 1582 1584 + 647 31 1586 1585 1587 + 648 31 1589 1588 1590 + 649 31 1592 1591 1593 + 650 31 1595 1594 1596 + 651 31 1598 1597 1599 + 652 31 1601 1600 1602 + 653 31 1604 1603 1605 + 654 31 1607 1606 1608 + 655 31 1610 1609 1611 + 656 31 1613 1612 1614 + 657 31 1616 1615 1617 + 658 31 1619 1618 1620 + 659 31 1622 1621 1623 + 660 31 1625 1624 1626 + 661 31 1628 1627 1629 + 662 31 1631 1630 1632 + 663 31 1634 1633 1635 + 664 31 1637 1636 1638 + 665 31 1640 1639 1641 + 666 31 1643 1642 1644 + 667 31 1646 1645 1647 + 668 31 1649 1648 1650 + 669 31 1652 1651 1653 + 670 31 1655 1654 1656 + 671 31 1658 1657 1659 + 672 31 1661 1660 1662 + 673 31 1664 1663 1665 + 674 31 1667 1666 1668 + 675 31 1670 1669 1671 + 676 31 1673 1672 1674 + 677 31 1676 1675 1677 + 678 31 1679 1678 1680 + 679 31 1682 1681 1683 + 680 31 1685 1684 1686 + 681 31 1688 1687 1689 + 682 31 1691 1690 1692 + 683 31 1694 1693 1695 + 684 31 1697 1696 1698 + 685 31 1700 1699 1701 + 686 31 1703 1702 1704 + 687 31 1706 1705 1707 + 688 31 1709 1708 1710 + 689 31 1712 1711 1713 + 690 31 1715 1714 1716 + 691 31 1718 1717 1719 + 692 31 1721 1720 1722 + 693 31 1724 1723 1725 + 694 31 1727 1726 1728 + 695 31 1730 1729 1731 + 696 31 1733 1732 1734 + 697 31 1736 1735 1737 + 698 31 1739 1738 1740 + 699 31 1742 1741 1743 + 700 31 1745 1744 1746 + 701 31 1748 1747 1749 + 702 31 1751 1750 1752 + 703 31 1754 1753 1755 + 704 31 1757 1756 1758 + 705 31 1760 1759 1761 + 706 31 1763 1762 1764 + 707 31 1766 1765 1767 + 708 31 1769 1768 1770 + 709 31 1772 1771 1773 + 710 31 1775 1774 1776 + 711 31 1778 1777 1779 + 712 31 1781 1780 1782 + 713 31 1784 1783 1785 + 714 31 1787 1786 1788 + 715 31 1790 1789 1791 + 716 31 1793 1792 1794 + 717 31 1796 1795 1797 + 718 31 1799 1798 1800 + 719 31 1802 1801 1803 + 720 31 1805 1804 1806 + 721 31 1808 1807 1809 + 722 31 1811 1810 1812 + 723 31 1814 1813 1815 + 724 31 1817 1816 1818 + 725 31 1820 1819 1821 + 726 31 1823 1822 1824 + 727 31 1826 1825 1827 + 728 31 1829 1828 1830 + 729 31 1832 1831 1833 + 730 31 1835 1834 1836 + 731 31 1838 1837 1839 + 732 31 1841 1840 1842 + 733 31 1844 1843 1845 + 734 31 1847 1846 1848 + 735 31 1850 1849 1851 + 736 31 1853 1852 1854 + 737 31 1856 1855 1857 + 738 31 1859 1858 1860 + 739 31 1862 1861 1863 + 740 31 1865 1864 1866 + 741 31 1868 1867 1869 + 742 31 1871 1870 1872 + 743 31 1874 1873 1875 + 744 31 1877 1876 1878 + 745 31 1880 1879 1881 + 746 31 1883 1882 1884 + 747 31 1886 1885 1887 + 748 31 1889 1888 1890 + 749 31 1892 1891 1893 + 750 31 1895 1894 1896 + 751 31 1898 1897 1899 + 752 31 1901 1900 1902 + 753 31 1904 1903 1905 + 754 31 1907 1906 1908 + 755 31 1910 1909 1911 + 756 31 1913 1912 1914 + 757 31 1916 1915 1917 + 758 31 1919 1918 1920 + 759 31 1922 1921 1923 + 760 31 1925 1924 1926 + 761 31 1928 1927 1929 + 762 31 1931 1930 1932 + 763 31 1934 1933 1935 + 764 31 1937 1936 1938 + 765 31 1940 1939 1941 + 766 31 1943 1942 1944 + 767 31 1946 1945 1947 + 768 31 1949 1948 1950 + 769 31 1952 1951 1953 + 770 31 1955 1954 1956 + 771 31 1958 1957 1959 + 772 31 1961 1960 1962 + 773 31 1964 1963 1965 + 774 31 1967 1966 1968 + 775 31 1970 1969 1971 + 776 31 1973 1972 1974 + 777 31 1976 1975 1977 + 778 31 1979 1978 1980 + 779 31 1982 1981 1983 + 780 31 1985 1984 1986 + 781 31 1988 1987 1989 + 782 31 1991 1990 1992 + 783 31 1994 1993 1995 + 784 31 1997 1996 1998 + 785 31 2000 1999 2001 + 786 31 2003 2002 2004 + +Dihedrals + + 1 6 3 1 7 8 + 2 6 2 1 7 19 + 3 4 2 1 7 8 + 4 5 2 1 7 8 + 5 6 3 1 7 19 + 6 3 3 1 2 4 + 7 3 3 1 2 6 + 8 3 3 1 2 5 + 9 3 5 2 1 7 + 10 3 4 2 1 7 + 11 3 6 2 1 7 + 12 3 19 7 8 20 + 13 1 1 7 8 9 + 14 3 1 7 8 20 + 15 2 1 7 8 11 + 16 8 9 8 11 22 + 17 3 7 8 9 10 + 18 7 7 8 9 28 + 19 8 7 8 11 21 + 20 8 7 8 11 12 + 21 3 9 8 7 19 + 22 3 11 8 9 28 + 23 8 7 8 11 22 + 24 3 11 8 7 19 + 25 10 9 8 11 12 + 26 3 20 8 9 28 + 27 8 9 8 11 21 + 28 8 20 8 11 22 + 29 8 20 8 11 21 + 30 4 8 9 28 29 + 31 5 8 9 28 29 + 32 6 10 9 28 29 + 33 11 10 9 8 11 + 34 6 10 9 28 32 + 35 3 10 9 8 20 + 36 6 8 9 28 32 + 37 9 8 11 12 13 + 38 8 12 11 8 20 + 39 9 8 11 12 14 + 40 14 14 12 13 15 + 41 13 13 12 14 24 + 42 3 13 12 11 22 + 43 14 13 12 14 16 + 44 3 14 12 11 22 + 45 3 13 12 11 21 + 46 13 11 12 14 24 + 47 12 11 12 14 16 + 48 3 14 12 11 21 + 49 13 11 12 13 23 + 50 13 14 12 13 23 + 51 12 11 12 13 15 + 52 16 23 13 15 25 + 53 13 12 13 15 25 + 54 14 12 13 15 17 + 55 14 12 14 16 17 + 56 13 12 14 16 26 + 57 16 24 14 16 26 + 58 12 13 15 17 18 + 59 13 17 15 13 23 + 60 14 13 15 17 16 + 61 12 14 16 17 18 + 62 13 17 16 14 24 + 63 14 14 16 17 15 + 64 15 16 17 18 27 + 65 13 15 17 16 26 + 66 13 18 17 15 25 + 67 15 15 17 18 27 + 68 13 16 17 15 25 + 69 13 18 17 16 26 + 70 1 9 28 29 30 + 71 3 32 28 29 33 + 72 3 9 28 29 33 + 73 3 9 28 29 34 + 74 3 32 28 29 34 + 75 3 33 29 30 35 + 76 3 30 29 28 32 + 77 3 34 29 30 35 + 78 7 28 29 30 35 + 79 3 28 29 30 31 + 80 6 29 30 35 39 + 81 4 29 30 35 36 + 82 5 29 30 35 36 + 83 3 31 30 29 34 + 84 3 31 30 29 33 + 85 6 31 30 35 39 + 86 6 31 30 35 36 + 87 1 30 35 36 37 + 88 3 39 35 36 41 + 89 3 30 35 36 40 + 90 3 30 35 36 41 + 91 3 39 35 36 40 + 92 3 40 36 37 42 + 93 3 41 36 37 42 + 94 7 35 36 37 42 + 95 3 35 36 37 38 + 96 3 37 36 35 39 + 97 6 38 37 42 53 + 98 3 38 37 36 40 + 99 6 38 37 42 43 + 100 4 36 37 42 43 + 101 6 36 37 42 53 + 102 5 36 37 42 43 + 103 3 38 37 36 41 + 104 3 37 42 43 54 + 105 1 37 42 43 44 + 106 3 53 42 43 54 + 107 2 37 42 43 46 + 108 10 44 43 46 47 + 109 3 44 43 42 53 + 110 8 42 43 46 56 + 111 8 42 43 46 55 + 112 8 42 43 46 47 + 113 3 46 43 42 53 + 114 8 44 43 46 55 + 115 8 54 43 46 56 + 116 7 42 43 44 62 + 117 3 42 43 44 45 + 118 3 46 43 44 62 + 119 3 54 43 44 62 + 120 8 54 43 46 55 + 121 8 44 43 46 56 + 122 5 43 44 62 63 + 123 6 45 44 62 70 + 124 6 43 44 62 70 + 125 4 43 44 62 63 + 126 11 45 44 43 46 + 127 3 45 44 43 54 + 128 6 45 44 62 63 + 129 9 43 46 47 48 + 130 8 47 46 43 54 + 131 9 43 46 47 49 + 132 3 49 47 46 55 + 133 13 46 47 48 57 + 134 14 49 47 48 50 + 135 3 49 47 46 56 + 136 12 46 47 48 50 + 137 12 46 47 49 51 + 138 14 48 47 49 51 + 139 13 46 47 49 58 + 140 3 48 47 46 55 + 141 3 48 47 46 56 + 142 13 48 47 49 58 + 143 13 49 47 48 57 + 144 14 47 48 50 52 + 145 16 57 48 50 59 + 146 13 47 48 50 59 + 147 16 58 49 51 60 + 148 13 47 49 51 60 + 149 14 47 49 51 52 + 150 13 48 50 52 61 + 151 14 48 50 52 51 + 152 16 59 50 52 61 + 153 13 52 50 48 57 + 154 14 49 51 52 50 + 155 13 49 51 52 61 + 156 13 52 51 49 58 + 157 16 60 51 52 61 + 158 13 51 52 50 59 + 159 13 50 52 51 60 + 160 3 70 62 63 71 + 161 2 44 62 63 66 + 162 1 44 62 63 64 + 163 3 44 62 63 71 + 164 8 62 63 66 72 + 165 8 62 63 66 67 + 166 3 71 63 64 79 + 167 3 62 63 64 65 + 168 3 64 63 62 70 + 169 8 62 63 66 73 + 170 7 62 63 64 79 + 171 8 64 63 66 67 + 172 3 66 63 64 79 + 173 8 64 63 66 72 + 174 3 66 63 62 70 + 175 8 71 63 66 73 + 176 8 64 63 66 73 + 177 8 71 63 66 72 + 178 6 63 64 79 81 + 179 6 65 64 79 80 + 180 3 65 64 63 71 + 181 4 63 64 79 80 + 182 6 65 64 79 81 + 183 5 63 64 79 80 + 184 11 65 64 63 66 + 185 8 67 66 63 71 + 186 17 63 66 67 74 + 187 17 72 66 67 75 + 188 17 63 66 67 75 + 189 17 63 66 67 68 + 190 17 73 66 67 74 + 191 17 73 66 67 75 + 192 17 72 66 67 74 + 193 19 66 67 68 69 + 194 21 68 67 66 72 + 195 18 66 67 68 69 + 196 21 68 67 66 73 + 197 20 69 68 67 74 + 198 20 69 68 67 75 + 199 20 67 68 69 77 + 200 20 67 68 69 76 + 201 20 67 68 69 78 + 202 3 81 79 80 83 + 203 3 81 79 80 84 + 204 3 64 79 80 84 + 205 3 81 79 80 82 + 206 3 64 79 80 83 + 207 3 64 79 80 82 + +Impropers + + 1 2 7 1 8 19 + 2 1 1 2 7 3 + 3 1 9 8 28 10 + 4 2 28 9 29 32 + 5 1 30 29 35 31 + 6 2 35 30 36 39 + 7 1 37 36 42 38 + 8 2 42 37 43 53 + 9 1 44 43 62 45 + 10 2 62 44 63 70 + 11 1 64 63 79 65 + 12 2 79 64 80 81 diff --git a/examples/USER/misc/temper_npt/in.temper_npt b/examples/USER/misc/temper_npt/in.temper_npt new file mode 100644 index 0000000000..81f818b66d --- /dev/null +++ b/examples/USER/misc/temper_npt/in.temper_npt @@ -0,0 +1,29 @@ +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +run 500 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 +group peptide type <= 12 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8 new file mode 100644 index 0000000000..66c290c292 --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8 @@ -0,0 +1,24 @@ +LAMMPS (17 Aug 2017) +Running on 8 partitions of processors +Step T0 T1 T2 T3 T4 T5 T6 T7 +500 0 1 2 3 4 5 6 7 +600 0 1 2 3 5 4 7 6 +700 0 2 1 4 6 3 7 5 +800 0 2 1 4 6 3 7 5 +900 0 2 1 3 6 4 7 5 +1000 0 2 1 3 7 4 6 5 +1100 0 1 2 3 7 4 6 5 +1200 0 1 2 3 7 4 6 5 +1300 0 1 2 4 7 3 5 6 +1400 0 1 2 4 7 3 5 6 +1500 0 2 1 4 7 3 5 6 +1600 1 3 0 4 6 2 5 7 +1700 1 3 0 4 5 2 6 7 +1800 0 3 1 4 5 2 6 7 +1900 0 3 2 4 5 1 6 7 +2000 1 2 3 5 4 0 6 7 +2100 2 1 3 5 4 0 6 7 +2200 2 1 3 4 5 0 7 6 +2300 1 2 4 3 5 0 7 6 +2400 1 2 4 3 5 0 6 7 +2500 2 1 3 4 5 0 6 7 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.0 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.0 new file mode 100644 index 0000000000..15fbef885d --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.0 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 0 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 275 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 275 275 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 221.73889 -7683.7524 1219.961 -5139.8856 -23756.591 0.996067 + 100 253.40719 -6992.3405 479.6715 -4999.6856 12620.614 1.0124851 + 150 273.60252 -6943.8714 474.24744 -4836.0631 6691.4146 1.0213937 + 200 265.37126 -7274.7854 1059.7586 -4630.6111 -17765.088 1.0221471 + 250 263.1769 -6503.9902 470.29014 -4462.3859 21936.742 1.0159924 + 300 274.03852 -7026.6057 1021.3683 -4369.0734 -14847.42 1.0095778 + 350 283.20032 -6715.3608 688.9769 -4335.5187 3430.7111 1.0045615 + 400 282.2987 -6645.6692 598.6786 -4361.5086 6318.9525 1.0001513 + 450 265.89091 -6977.5705 985.58718 -4404.465 -13261.32 0.99833097 + 500 270.30038 -6683.7902 650.5748 -4419.37 10014.277 1.000501 +Loop time of 11.0158 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.843 ns/day, 3.060 hours/ns, 45.389 timesteps/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.6893 | 7.8012 | 7.9131 | 4.0 | 70.82 +Bond | 0.085948 | 0.089635 | 0.093322 | 1.2 | 0.81 +Kspace | 1.1113 | 1.2333 | 1.3552 | 11.0 | 11.20 +Neigh | 1.2316 | 1.2336 | 1.2356 | 0.2 | 11.20 +Comm | 0.24281 | 0.24305 | 0.2433 | 0.0 | 2.21 +Output | 0.00052857 | 0.00053537 | 0.00054216 | 0.0 | 0.00 +Modify | 0.35968 | 0.38071 | 0.40175 | 3.4 | 3.46 +Other | | 0.03378 | | | 0.31 + +Nlocal: 1002 ave 1012 max 992 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8737.5 ave 8747 max 8728 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 359463 ave 359931 max 358995 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 718926 +Ave neighs/atom = 358.746 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 50 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 275 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.269166 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0224625 + estimated relative force accuracy = 6.76451e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 270.30038 -6683.7883 650.5748 -4419.3682 10014.295 1.000501 + 550 270.02511 -6875.5939 861.97452 -4401.4176 -7136.4285 1.005266 + 600 278.94444 -6786.546 772.05516 -4349.0356 1262.4902 1.0110761 + 650 283.8929 -6763.9691 734.90211 -4334.0667 3664.1311 1.0138933 + 700 276.67406 -6889.5452 847.87041 -4389.775 -4754.9929 1.0145005 + 750 266.09032 -6720.4921 700.27463 -4431.5085 5654.8094 1.013756 + 800 277.69948 -6917.9358 860.12186 -4399.7918 -4729.7009 1.0124281 + 850 278.00722 -6808.1267 798.69768 -4349.5695 1468.5155 1.0139727 + 900 276.49266 -6784.5965 818.01248 -4315.7673 2510.6047 1.0158115 + 950 270.36225 -6847.6403 901.97122 -4331.4544 -3448.3968 1.0175668 + 1000 276.75533 -6809.4075 781.83481 -4375.1877 3379.8584 1.0173101 + 1050 271.67172 -6913.3268 847.97269 -4443.3211 -2045.5605 1.016761 + 1100 265.73149 -6867.7958 840.08439 -4441.1449 -323.23893 1.0170333 + 1150 274.51451 -6834.9841 792.48751 -4403.4906 2604.0644 1.0175885 + 1200 274.22914 -6919.9496 890.14423 -4392.5032 -3454.4418 1.0167016 + 1250 274.13019 -6817.7256 825.11317 -4355.901 2067.3849 1.0181714 + 1300 287.36094 -6906.5403 854.11016 -4336.7237 -438.01206 1.0180794 + 1350 275.51763 -6911.8172 855.25923 -4411.5627 -742.96412 1.0180086 + 1400 269.90457 -6919.4028 855.55485 -4452.3659 311.08918 1.0213368 + 1450 276.99478 -6980.8317 913.69108 -4413.326 -1810.1051 1.0265437 + 1500 282.20313 -6926.698 863.56525 -4378.2213 932.7594 1.0301769 + 1550 276.82056 -6917.141 910.22058 -4354.146 -899.64097 1.0361201 + 1600 278.2946 -6903.7351 893.14524 -4349.0145 1399.9679 1.0421849 + 1650 270.12097 -6863.0844 879.81355 -4370.4967 1132.9864 1.0410741 + 1700 274.02565 -6912.4818 893.37432 -4383.0202 -1359.393 1.0366624 + 1750 276.77322 -6866.3214 899.18224 -4314.6474 887.47588 1.0332821 + 1800 287.02945 -6961.9217 950.89476 -4297.2996 -1298.0904 1.0313542 + 1850 279.37232 -6930.51 898.78906 -4363.711 397.74804 1.0309206 + 1900 277.14727 -6978.8634 915.53145 -4408.6069 636.36898 1.0285813 + 1950 275.14272 -7010.256 927.28727 -4440.212 -2352.6961 1.0241747 + 2000 270.84972 -6967.52 913.42253 -4436.9722 1669.9637 1.0251906 + 2050 276.70108 -6992.4582 993.37473 -4347.0223 -500.38379 1.0325714 + 2100 278.49569 -6922.9266 939.43518 -4320.7155 700.24515 1.0385166 + 2150 279.69822 -6896.5008 923.58805 -4302.9571 702.22759 1.0415681 + 2200 284.136 -6951.6694 974.70903 -4280.5086 352.95043 1.0452009 + 2250 292.01941 -6960.5848 964.01635 -4253.0483 2680.7007 1.0430517 + 2300 277.58812 -6995.5006 1010.8176 -4327.3258 -1508.9961 1.0328658 + 2350 270.61616 -6978.93 966.12478 -4397.0745 -1636.7434 1.0267664 + 2400 279.36012 -6991.4739 957.43125 -4366.1056 432.00482 1.0260429 + 2450 286.38546 -7074.807 1004.3206 -4360.6042 160.9109 1.0251585 + 2500 269.98622 -6932.0456 957.35208 -4362.724 1748.1568 1.0186556 +Loop time of 46.7361 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.395 ns/day, 3.246 hours/ns, 42.793 timesteps/s +99.2% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 32.381 | 32.617 | 32.854 | 4.1 | 69.79 +Bond | 0.3601 | 0.36578 | 0.37147 | 0.9 | 0.78 +Kspace | 4.6658 | 4.933 | 5.2002 | 12.0 | 10.56 +Neigh | 4.9833 | 4.9921 | 5.0009 | 0.4 | 10.68 +Comm | 0.96477 | 0.96532 | 0.96587 | 0.1 | 2.07 +Output | 0.0021896 | 0.0022331 | 0.0022767 | 0.1 | 0.00 +Modify | 1.4424 | 1.5379 | 1.6334 | 7.7 | 3.29 +Other | | 1.322 | | | 2.83 + +Nlocal: 1002 ave 1011 max 993 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8835 ave 8847 max 8823 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 366395 ave 367166 max 365624 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 732790 +Ave neighs/atom = 365.664 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 195 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.1 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.1 new file mode 100644 index 0000000000..ebdb7b7f30 --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.1 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 1 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 280 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 280 280 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 222.19861 -7681.6246 1220.9355 -5134.0385 -23782.584 0.99586813 + 100 254.66243 -6984.8813 480.32613 -4984.0772 12653.925 1.0120499 + 150 275.28565 -6924.9875 473.42216 -4807.9551 6796.8759 1.0208676 + 200 266.52981 -7245.4283 1066.0809 -4588.0144 -17643.106 1.0213699 + 250 265.06051 -6458.7243 468.97999 -4407.1839 22476.585 1.0143215 + 300 276.91573 -6986.8723 1020.9402 -4312.5895 -14559.244 1.005554 + 350 284.26789 -6635.8191 681.27092 -4257.3089 2625.7849 0.99664411 + 400 284.48799 -6543.0099 637.61352 -4206.8431 7901.0269 0.99079237 + 450 271.30029 -6770.4441 1003.5624 -4147.0663 -13046.51 0.9856127 + 500 292.02418 -6514.8219 628.56367 -4142.7096 9871.7492 0.98625432 +Loop time of 11.1841 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.725 ns/day, 3.107 hours/ns, 44.706 timesteps/s +98.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.8072 | 7.9267 | 8.0463 | 4.2 | 70.88 +Bond | 0.08858 | 0.091102 | 0.093624 | 0.8 | 0.81 +Kspace | 1.1403 | 1.2665 | 1.3927 | 11.2 | 11.32 +Neigh | 1.2478 | 1.2496 | 1.2514 | 0.2 | 11.17 +Comm | 0.21574 | 0.23191 | 0.24809 | 3.4 | 2.07 +Output | 0.00054431 | 0.00054872 | 0.00055313 | 0.0 | 0.00 +Modify | 0.36159 | 0.38512 | 0.40864 | 3.8 | 3.44 +Other | | 0.03255 | | | 0.29 + +Nlocal: 1002 ave 1026 max 978 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8640.5 ave 8690 max 8591 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 354518 ave 367457 max 341580 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 709037 +Ave neighs/atom = 353.811 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 49 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 280 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268766 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0227872 + estimated relative force accuracy = 6.8623e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 292.02418 -6514.8215 628.56367 -4142.7092 9871.7534 0.98625432 + 550 282.55729 -6813.6685 882.47773 -4244.1648 -5377.4053 0.98629839 + 600 274.41644 -6737.0424 793.45027 -4305.1716 -306.54594 0.98725369 + 650 274.38967 -6664.1973 722.25014 -4303.6865 4628.1283 0.99175575 + 700 282.07693 -6819.1345 897.72476 -4237.2518 -7210.1942 0.99693402 + 750 281.80476 -6580.3192 776.69527 -4121.091 5466.9616 1.0060075 + 800 288.76507 -6726.7205 885.07773 -4117.5529 -2623.0756 1.0132495 + 850 289.21519 -6755.4289 847.00353 -4181.648 776.75991 1.0160602 + 900 280.679 -6694.3766 777.91069 -4240.6544 2272.2098 1.0170439 + 950 280.93616 -6813.8865 910.52053 -4226.0191 -3872.8603 1.0202606 + 1000 289.91762 -6710.0317 786.39268 -4192.6678 4456.0575 1.0222223 + 1050 292.7318 -6830.313 882.85834 -4199.6812 -2434.3412 1.0214856 + 1100 280.61029 -6789.3828 846.07872 -4267.9028 580.25027 1.0202095 + 1150 277.27283 -6806.9599 852.2013 -4299.2838 18.428929 1.0180062 + 1200 284.68488 -6849.8644 877.54803 -4272.5875 -1041.3591 1.0171686 + 1250 290.47153 -6864.5918 827.15634 -4303.1571 2658.2245 1.0175104 + 1300 279.84219 -6892.8497 884.4759 -4337.5586 -1800.8783 1.0176916 + 1350 275.59818 -6848.0359 848.53171 -4354.028 1599.2311 1.0197901 + 1400 276.67929 -6893.565 900.40614 -4341.2278 295.46659 1.0221449 + 1450 281.18148 -6902.3901 931.40362 -4292.1748 -1585.1315 1.0243322 + 1500 282.82339 -6846.4364 887.9988 -4269.8228 2142.9076 1.0291373 + 1550 291.40537 -6898.3742 920.23257 -4238.2876 -355.99408 1.0308242 + 1600 279.9548 -6863.2068 923.64788 -4268.0713 233.83555 1.0259922 + 1650 282.90611 -6848.3952 903.97971 -4255.3069 369.65523 1.0200083 + 1700 292.24099 -6884.346 965.54265 -4173.9603 -971.39092 1.0155909 + 1750 285.95609 -6805.2486 955.25719 -4142.6727 646.23287 1.012031 + 1800 293.50173 -6823.8152 919.24584 -4152.199 530.19678 1.0078324 + 1850 300.737 -6918.3747 942.10944 -4180.6963 -949.67639 1.0061029 + 1900 284.98969 -6913.5357 956.78373 -4255.2032 -163.02524 1.0095568 + 1950 282.78589 -6905.1978 951.94384 -4264.8631 -891.31043 1.0177223 + 2000 289.82463 -6977.0203 1022.9525 -4223.6518 -540.73403 1.0269481 + 2050 292.13474 -6900.8375 924.54552 -4232.0833 2656.3028 1.0310097 + 2100 284.54116 -6958.82 968.35681 -4291.5924 -286.70605 1.0264636 + 2150 268.14376 -6966.2184 973.69354 -4391.5558 -1446.0052 1.0190957 + 2200 275.09872 -6957.02 982.37472 -4332.1512 -1449.1984 1.0199163 + 2250 285.69237 -7002.4814 1014.3438 -4282.3934 -1530.0347 1.0264012 + 2300 282.59746 -6922.8242 980.57612 -4254.9822 381.8231 1.0332785 + 2350 290.98138 -6993.8628 1022.527 -4234.0132 -559.9386 1.0396092 + 2400 281.29903 -6963.5226 967.13898 -4316.8702 1438.7922 1.0452404 + 2450 278.44605 -6968.5134 945.32295 -4360.7108 1102.9302 1.0498791 + 2500 278.65789 -7034.3651 1032.8711 -4337.7496 -923.32414 1.0527955 +Loop time of 46.7418 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.394 ns/day, 3.246 hours/ns, 42.788 timesteps/s +98.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 33.141 | 33.146 | 33.152 | 0.1 | 70.91 +Bond | 0.36441 | 0.36647 | 0.36853 | 0.3 | 0.78 +Kspace | 4.9269 | 4.9539 | 4.9808 | 1.2 | 10.60 +Neigh | 5.2154 | 5.223 | 5.2306 | 0.3 | 11.17 +Comm | 0.90923 | 0.97305 | 1.0369 | 6.5 | 2.08 +Output | 0.0021682 | 0.0027286 | 0.003289 | 1.1 | 0.01 +Modify | 1.454 | 1.5534 | 1.6528 | 8.0 | 3.32 +Other | | 0.5229 | | | 1.12 + +Nlocal: 1002 ave 1005 max 999 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 9059.5 ave 9084 max 9035 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 378277 ave 380641 max 375913 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 756554 +Ave neighs/atom = 377.522 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 197 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.2 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.2 new file mode 100644 index 0000000000..42d42381c7 --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.2 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 2 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 285 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 285 285 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 222.63643 -7679.59 1221.8685 -5128.4568 -23807.78 0.99567623 + 100 255.85049 -6977.7653 480.95894 -4969.235 12685.571 1.0116281 + 150 276.83083 -6906.8603 472.9485 -4781.076 6899.3786 1.0203576 + 200 267.19755 -7210.264 1068.2756 -4546.6687 -17521.505 1.0207097 + 250 263.8837 -6392.2545 463.0506 -4353.6698 22886.964 1.0130132 + 300 280.88953 -6919.81 1005.9833 -4236.7581 -14774.964 1.0024942 + 350 289.59472 -6621.8351 734.60058 -4158.1911 2409.0738 0.99451628 + 400 288.29076 -6495.283 634.61137 -4139.4136 6594.965 0.98796525 + 450 281.92055 -6838.8449 1025.3043 -4130.3164 -12795.112 0.98591519 + 500 298.25519 -6578.7232 652.75467 -4145.2172 10282.835 0.98902709 +Loop time of 11.0965 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.786 ns/day, 3.082 hours/ns, 45.059 timesteps/s +99.1% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.9379 | 7.9449 | 7.952 | 0.2 | 71.60 +Bond | 0.090588 | 0.090927 | 0.091265 | 0.1 | 0.82 +Kspace | 1.1684 | 1.176 | 1.1837 | 0.7 | 10.60 +Neigh | 1.2553 | 1.2556 | 1.256 | 0.0 | 11.32 +Comm | 0.20599 | 0.21536 | 0.22474 | 2.0 | 1.94 +Output | 0.00049877 | 0.00050557 | 0.00051236 | 0.0 | 0.00 +Modify | 0.35224 | 0.37667 | 0.40111 | 4.0 | 3.39 +Other | | 0.03635 | | | 0.33 + +Nlocal: 1002 ave 1007 max 997 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8699.5 ave 8735 max 8664 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 355600 ave 363554 max 347647 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 711201 +Ave neighs/atom = 354.891 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 50 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 285 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268844 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0227233 + estimated relative force accuracy = 6.84305e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 298.25519 -6578.7239 652.75467 -4145.218 10282.81 0.98902709 + 550 280.55812 -6800.9339 904.37474 -4221.4693 -6284.3677 0.99138729 + 600 282.54117 -6736.9067 793.64464 -4256.3323 379.51956 0.99544144 + 650 289.246 -6695.3988 727.43292 -4241.0045 3741.9292 1.0004679 + 700 298.37935 -6898.8951 912.35329 -4205.0492 -5179.2622 1.0029455 + 750 276.21453 -6657.3814 738.83164 -4269.3936 6422.8684 1.003042 + 800 273.34049 -6770.7481 842.34057 -4296.411 -2699.1945 1.0011122 + 850 279.30106 -6766.7842 807.51048 -4291.6893 -583.46522 1.0039015 + 900 286.09076 -6808.4366 807.15205 -4293.1617 1405.0223 1.0062162 + 950 283.04021 -6838.8107 869.45604 -4279.4454 -2826.6403 1.008228 + 1000 278.36762 -6776.1595 827.04427 -4287.104 2510.6216 1.0123638 + 1050 276.46194 -6858.6173 893.69758 -4314.2864 -1818.0617 1.0153108 + 1100 270.91883 -6818.5634 864.2518 -4336.7738 1021.1432 1.0153455 + 1150 274.70844 -6747.0957 849.98378 -4256.948 1453.2165 1.0141005 + 1200 292.66211 -6864.4907 917.17522 -4199.958 -2889.5663 1.0130738 + 1250 288.1024 -6814.0744 887.46443 -4206.4766 2384.4467 1.0139599 + 1300 286.54446 -6864.9998 900.886 -4253.2821 -2397.0043 1.0140796 + 1350 274.86169 -6804.6738 866.75191 -4296.843 1112.3802 1.0143892 + 1400 275.30771 -6837.4182 904.04812 -4289.6282 136.99961 1.0170328 + 1450 296.09129 -6868.8691 910.61078 -4190.4268 -1076.0085 1.0204782 + 1500 292.50596 -6812.8248 889.10378 -4177.2959 1069.9919 1.0198406 + 1550 284.3886 -6876.901 909.58572 -4269.3554 -1153.6899 1.0177539 + 1600 276.41187 -6876.8574 907.69862 -4318.8244 114.8894 1.0158964 + 1650 275.68967 -6919.4356 902.04604 -4371.3672 -1493.2092 1.0141832 + 1700 271.20923 -6893.2373 912.27766 -4361.688 -563.23529 1.0157743 + 1750 279.40649 -6842.0743 892.63677 -4281.2237 944.83039 1.0207184 + 1800 282.84659 -6889.8537 934.73963 -4266.3608 -895.12942 1.0238833 + 1850 279.58052 -6900.6624 951.17313 -4280.2364 648.68857 1.024366 + 1900 276.44092 -6841.9805 881.15423 -4310.3185 1052.7352 1.0229576 + 1950 289.89625 -6960.295 949.2514 -4280.2 -2500.9996 1.0210089 + 2000 283.75058 -6908.6985 930.56698 -4283.9809 1529.221 1.0211902 + 2050 284.00141 -6837.2348 943.57188 -4198.0147 -710.45695 1.0190262 + 2100 294.53504 -6879.4583 983.431 -4137.4874 -496.16699 1.0172736 + 2150 296.46029 -6854.8307 926.58211 -4158.2139 757.20038 1.017548 + 2200 284.26196 -6896.5957 989.5222 -4209.8697 -1953.1733 1.0187998 + 2250 284.51713 -6852.3924 938.51853 -4215.1465 210.72971 1.0208918 + 2300 289.88921 -6867.2253 969.05163 -4167.372 -80.492209 1.0240397 + 2350 296.17997 -6836.2421 954.2497 -4113.6314 -389.76698 1.0272081 + 2400 309.56546 -6833.5714 970.44217 -4014.8493 610.57346 1.0294586 + 2450 300.61402 -6827.9964 1025.4417 -4007.7199 1121.4824 1.0284326 + 2500 298.82336 -6815.7862 945.53298 -4086.1097 -726.1131 1.0224541 +Loop time of 46.7423 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.394 ns/day, 3.246 hours/ns, 42.788 timesteps/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 32.492 | 32.625 | 32.758 | 2.3 | 69.80 +Bond | 0.3584 | 0.36552 | 0.37265 | 1.2 | 0.78 +Kspace | 4.7476 | 4.8898 | 5.0319 | 6.4 | 10.46 +Neigh | 5.1461 | 5.1463 | 5.1464 | 0.0 | 11.01 +Comm | 0.86246 | 0.89403 | 0.92559 | 3.3 | 1.91 +Output | 0.0020437 | 0.0020902 | 0.0021367 | 0.1 | 0.00 +Modify | 1.4279 | 1.5187 | 1.6095 | 7.4 | 3.25 +Other | | 1.301 | | | 2.78 + +Nlocal: 1002 ave 1010 max 994 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8922 ave 9009 max 8835 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 367689 ave 371637 max 363741 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 735378 +Ave neighs/atom = 366.955 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 200 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.3 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.3 new file mode 100644 index 0000000000..b97559765d --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.3 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 3 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 290 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 290 290 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 223.053 -7677.6519 1222.7567 -5123.1433 -23832.135 0.99549097 + 100 256.97829 -6970.9352 481.56411 -4955.0662 12716.194 1.0112202 + 150 278.44824 -6890.5623 472.60764 -4755.4621 6994.6533 1.0198648 + 200 271.15638 -7198.8095 1073.0275 -4506.826 -17647.735 1.020128 + 250 271.19291 -6398.4699 477.07511 -4302.2206 23076.406 1.0123626 + 300 295.5039 -6953.4923 1007.5309 -4181.6369 -15039.211 1.0007168 + 350 297.29537 -6594.1646 707.50773 -4111.6362 1990.9893 0.99116796 + 400 294.93533 -6450.921 630.83559 -4059.1555 6431.7427 0.98805162 + 450 295.23265 -6781.3296 1002.9096 -4015.715 -12070.145 0.98722232 + 500 284.70036 -6389.6524 668.83647 -4020.9946 10958.208 0.98502274 +Loop time of 11.0942 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.788 ns/day, 3.082 hours/ns, 45.069 timesteps/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.7626 | 7.8378 | 7.913 | 2.7 | 70.65 +Bond | 0.086271 | 0.08859 | 0.090909 | 0.8 | 0.80 +Kspace | 1.1309 | 1.2146 | 1.2982 | 7.6 | 10.95 +Neigh | 1.2958 | 1.2978 | 1.2999 | 0.2 | 11.70 +Comm | 0.24052 | 0.24249 | 0.24445 | 0.4 | 2.19 +Output | 0.00055242 | 0.00056267 | 0.00057292 | 0.0 | 0.01 +Modify | 0.35597 | 0.3786 | 0.40124 | 3.7 | 3.41 +Other | | 0.03375 | | | 0.30 + +Nlocal: 1002 ave 1015 max 989 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8686.5 ave 8717 max 8656 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 354166 ave 365049 max 343283 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 708332 +Ave neighs/atom = 353.459 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 52 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 290 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268731 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228157 + estimated relative force accuracy = 6.87089e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 284.70036 -6389.6523 668.83647 -4020.9946 10958.208 0.98502274 + 550 290.90514 -6715.0579 911.30009 -4066.8904 -6474.803 0.98383517 + 600 283.07652 -6555.4875 766.62589 -4098.7355 261.44315 0.98334866 + 650 293.39943 -6543.5525 727.38701 -4064.4058 5298.0746 0.98688936 + 700 295.77284 -6702.0803 912.68434 -4023.4658 -6806.6079 0.98957885 + 750 302.19503 -6545.9025 745.53299 -3996.0952 4624.9549 0.9931176 + 800 292.89947 -6664.6734 861.73293 -4054.1658 -1569.2753 0.99667377 + 850 288.96376 -6637.9753 841.33585 -4071.3632 -864.6336 1.0003373 + 900 291.22538 -6602.7272 806.80566 -4057.1422 2231.0477 1.0028411 + 950 290.78982 -6720.7893 893.26995 -4091.3406 -3898.6743 1.0021058 + 1000 285.74827 -6640.6252 810.15614 -4124.3911 558.53066 1.0051325 + 1050 288.3183 -6717.0357 867.9383 -4127.675 355.99916 1.0122228 + 1100 291.39421 -6746.7014 879.64717 -4127.2669 -736.99584 1.011619 + 1150 290.47863 -6710.1637 836.85441 -4138.9885 1105.9666 1.0069336 + 1200 288.94451 -6726.3595 867.56238 -4133.6359 -901.95525 1.0026837 + 1250 290.75557 -6716.8398 867.19843 -4113.6671 1376.8368 1.0000807 + 1300 289.52654 -6715.6758 904.46364 -4082.5758 -1400.2433 0.99935875 + 1350 292.30663 -6661.0526 904.32661 -4011.491 196.73374 0.99704618 + 1400 301.41479 -6661.807 880.88881 -3981.3023 1079.6673 0.99635503 + 1450 301.10415 -6704.7089 950.31941 -3956.6283 -1083.4574 0.99740883 + 1500 303.52341 -6687.1744 886.70817 -3988.2608 901.20455 0.99756877 + 1550 290.70908 -6738.4941 931.37971 -4071.4177 -56.269366 0.99843015 + 1600 289.8778 -6709.348 888.89193 -4089.7225 506.51952 1.0003118 + 1650 288.12183 -6724.4008 896.24971 -4107.9017 -1229.6117 1.004563 + 1700 297.81604 -6743.9356 906.62851 -4059.1778 1032.1913 1.0116813 + 1750 304.22415 -6761.8681 932.14203 -4013.3368 1825.359 1.015764 + 1800 286.62853 -6698.3527 911.17615 -4075.843 -1160.6136 1.0169905 + 1850 292.7719 -6787.8009 918.61838 -4121.1696 1455.4151 1.0203418 + 1900 290.87293 -6806.1448 960.43892 -4109.0309 -829.39096 1.022593 + 1950 304.5232 -6848.8518 954.93165 -4075.7453 915.93096 1.0221703 + 2000 286.15289 -6721.328 941.83273 -4071.0015 194.2717 1.0167052 + 2050 305.2696 -6720.8244 968.69939 -3929.4938 -1154.2389 1.0114409 + 2100 298.14935 -6678.8136 975.17824 -3923.516 794.1643 1.0070072 + 2150 301.51333 -6734.6863 950.33572 -3984.1464 -537.44292 1.0048337 + 2200 298.25074 -6736.277 945.4083 -4010.144 211.60185 1.0060101 + 2250 297.20864 -6820.7924 941.75394 -4104.5356 772.05119 1.0087884 + 2300 286.08552 -6853.0967 990.41746 -4154.5877 -760.47968 1.0110651 + 2350 295.49972 -6888.1433 937.27703 -4186.5667 966.37988 1.0150101 + 2400 289.60528 -6888.0768 967.74071 -4191.2297 1140.8847 1.0176507 + 2450 290.7003 -6906.443 998.89141 -4171.9073 -363.47638 1.0151765 + 2500 291.05855 -6817.2894 972.06896 -4107.4372 415.89846 1.0117849 +Loop time of 46.7412 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.394 ns/day, 3.246 hours/ns, 42.789 timesteps/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 31.884 | 32.272 | 32.659 | 6.8 | 69.04 +Bond | 0.34239 | 0.35991 | 0.37742 | 2.9 | 0.77 +Kspace | 4.6486 | 5.0781 | 5.5076 | 19.1 | 10.86 +Neigh | 5.1657 | 5.1742 | 5.1828 | 0.4 | 11.07 +Comm | 0.96743 | 0.96831 | 0.96918 | 0.1 | 2.07 +Output | 0.0021966 | 0.0022568 | 0.002317 | 0.1 | 0.00 +Modify | 1.4428 | 1.5251 | 1.6074 | 6.7 | 3.26 +Other | | 1.362 | | | 2.91 + +Nlocal: 1002 ave 1004 max 1000 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8824 ave 8848 max 8800 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 363564 ave 364653 max 362474 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 727127 +Ave neighs/atom = 362.838 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 201 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.4 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.4 new file mode 100644 index 0000000000..ad7e1fdb52 --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.4 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 4 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 295 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 295 295 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 223.44965 -7675.7636 1223.6082 -5118.0353 -23854.901 0.99531214 + 100 258.05368 -6964.3986 482.14839 -4941.5246 12745.624 1.010825 + 150 279.95689 -6874.6176 472.25664 -4730.8609 7091.9355 1.0193879 + 200 275.57578 -7193.9232 1079.6288 -4468.952 -17877.542 1.0195441 + 250 279.43717 -6402.2754 479.97988 -4253.8984 23273.809 1.0116181 + 300 292.20824 -6863.5426 998.78846 -4120.1066 -14524.477 0.99985013 + 350 297.83477 -6520.8204 705.46814 -4037.1112 1640.5321 0.99100268 + 400 300.71476 -6441.8834 652.50284 -3993.9443 7052.2304 0.98787311 + 450 298.04546 -6757.2898 986.07239 -3991.7184 -11211.612 0.98470906 + 500 290.54704 -6432.0836 676.82263 -4020.5317 9503.0303 0.98022653 +Loop time of 11.0411 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.825 ns/day, 3.067 hours/ns, 45.286 timesteps/s +99.2% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.7513 | 7.8142 | 7.8771 | 2.3 | 70.77 +Bond | 0.087844 | 0.089858 | 0.091872 | 0.7 | 0.81 +Kspace | 1.1507 | 1.2078 | 1.2649 | 5.2 | 10.94 +Neigh | 1.2777 | 1.2798 | 1.282 | 0.2 | 11.59 +Comm | 0.21883 | 0.2369 | 0.25497 | 3.7 | 2.15 +Output | 0.00052476 | 0.00053084 | 0.00053692 | 0.0 | 0.00 +Modify | 0.35187 | 0.38007 | 0.40828 | 4.6 | 3.44 +Other | | 0.03188 | | | 0.29 + +Nlocal: 1002 ave 1018 max 986 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8685.5 ave 8713 max 8658 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 352674 ave 363841 max 341507 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 705348 +Ave neighs/atom = 351.97 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 51 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 295 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268595 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0229274 + estimated relative force accuracy = 6.90452e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 290.54704 -6432.0826 676.82263 -4020.5307 9503.0509 0.98022653 + 550 299.80307 -6732.1631 858.08424 -4084.0858 -5804.5234 0.97922483 + 600 282.09517 -6605.4814 819.96587 -4101.2486 -819.40251 0.98081741 + 650 294.53657 -6522.7525 767.04478 -3997.1588 4596.0585 0.98382352 + 700 305.841 -6619.4153 905.5064 -3887.8662 -5973.5686 0.98622017 + 750 307.23206 -6438.653 789.70387 -3814.6009 6681.8219 0.98950206 + 800 307.87505 -6564.5918 887.75178 -3838.6527 -1917.6181 0.98688326 + 850 298.61627 -6528.5749 847.91654 -3897.7513 -3785.6609 0.9806677 + 900 300.37107 -6492.7964 828.13288 -3871.2792 3123.0873 0.97992098 + 950 313.50832 -6648.6955 936.69562 -3840.1788 -3465.5075 0.97832705 + 1000 300.79594 -6452.6853 828.10459 -3828.6598 2639.7489 0.9724972 + 1050 316.04685 -6570.6422 935.04399 -3748.6208 -2434.9525 0.96835974 + 1100 311.0203 -6489.14 897.50532 -3734.6686 -1557.8625 0.97044387 + 1150 311.75575 -6489.2845 888.02191 -3739.9054 1954.7864 0.97411485 + 1200 304.34674 -6521.7138 905.22814 -3799.3644 -1699.1298 0.98025305 + 1250 305.82 -6594.6645 927.05285 -3841.6942 1061.9124 0.98818343 + 1300 300.78043 -6566.1931 942.90743 -3827.4574 -864.10057 0.99107957 + 1350 314.72676 -6545.9508 912.22446 -3754.6305 606.75529 0.9929135 + 1400 315.913 -6551.4197 960.628 -3704.6134 1064.6728 0.99029667 + 1450 309.18966 -6497.0696 918.08358 -3732.9498 -1325.2759 0.98343775 + 1500 312.58526 -6494.4875 891.16465 -3737.013 1380.3782 0.98291945 + 1550 317.55684 -6590.3216 970.14576 -3724.1828 -1866.6608 0.9847875 + 1600 307.38151 -6552.4153 940.826 -3776.3487 -390.22458 0.98596757 + 1650 295.78641 -6508.499 880.69089 -3861.7969 -1368.3717 0.98931642 + 1700 306.06415 -6655.9157 976.17248 -3852.3681 -1599.4137 0.99512042 + 1750 303.02767 -6625.01 920.50823 -3895.2561 2274.9319 1.0015941 + 1800 295.63701 -6674.2337 928.57382 -3980.5406 -290.52041 1.0049878 + 1850 302.04323 -6768.1711 959.29198 -4005.5112 -688.59334 1.0096755 + 1900 299.41653 -6746.3896 940.56717 -4018.1373 1011.075 1.0170047 + 1950 298.83395 -6766.5655 950.11421 -4032.2445 -187.97792 1.0202189 + 2000 299.45823 -6824.2159 958.18625 -4078.0956 -715.67202 1.0223031 + 2050 290.49349 -6835.2073 950.68063 -4150.1172 -345.43177 1.0232367 + 2100 283.23103 -6798.203 936.42547 -4170.729 300.36081 1.0201704 + 2150 295.58133 -6797.5304 933.21906 -4099.5245 -293.26979 1.0191458 + 2200 287.12783 -6693.6112 942.32795 -4036.9686 -1430.1972 1.0191149 + 2250 301.19592 -6762.0204 998.15337 -3965.5579 -956.39215 1.0207659 + 2300 303.62433 -6716.6297 960.83467 -3942.987 77.237938 1.0202529 + 2350 292.95455 -6741.789 993.45295 -3999.2326 1009.5683 1.0189011 + 2400 295.01475 -6781.545 966.72586 -4053.4151 109.26284 1.0174852 + 2450 300.36482 -6827.3015 978.76759 -4055.187 -395.9959 1.0168907 + 2500 303.77029 -6833.9094 987.05071 -4033.1791 259.58796 1.0139892 +Loop time of 46.7422 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.394 ns/day, 3.246 hours/ns, 42.788 timesteps/s +99.3% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 31.75 | 32.061 | 32.372 | 5.5 | 68.59 +Bond | 0.36191 | 0.36261 | 0.36331 | 0.1 | 0.78 +Kspace | 4.6321 | 4.925 | 5.2179 | 13.2 | 10.54 +Neigh | 5.3267 | 5.3348 | 5.3429 | 0.3 | 11.41 +Comm | 0.88959 | 0.96174 | 1.0339 | 7.4 | 2.06 +Output | 0.0022326 | 0.0022967 | 0.0023608 | 0.1 | 0.00 +Modify | 1.4187 | 1.5349 | 1.6512 | 9.4 | 3.28 +Other | | 1.56 | | | 3.34 + +Nlocal: 1002 ave 1009 max 995 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8864 ave 8880 max 8848 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 364886 ave 365536 max 364236 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 729772 +Ave neighs/atom = 364.158 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 206 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.5 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.5 new file mode 100644 index 0000000000..078ab383b8 --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.5 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 5 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 300 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 300 300 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 223.82864 -7673.9648 1224.4256 -5113.1564 -23877.062 0.99513919 + 100 259.08234 -6958.1555 482.71038 -4928.5779 12773.331 1.010442 + 150 281.33296 -6859.1832 472.14676 -4707.3204 7185.467 1.0189247 + 200 278.97145 -7183.3765 1085.5768 -4432.1832 -18068.845 1.0189951 + 250 279.03591 -6351.7829 479.41881 -4206.3627 23082.567 1.0112758 + 300 300.6326 -6884.9027 1026.5309 -4063.426 -13809.886 0.99975981 + 350 305.9627 -6542.2739 749.87415 -3965.6303 1365.919 0.98893682 + 400 300.95813 -6356.16 664.78738 -3894.4833 7945.2634 0.98104761 + 450 305.74067 -6698.3004 1016.1128 -3856.7437 -11928.509 0.97692928 + 500 295.19123 -6343.4664 707.06763 -3873.9411 9895.6164 0.97622451 +Loop time of 11.1232 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.768 ns/day, 3.090 hours/ns, 44.951 timesteps/s +99.0% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.8133 | 7.8368 | 7.8603 | 0.8 | 70.45 +Bond | 0.088746 | 0.089125 | 0.089505 | 0.1 | 0.80 +Kspace | 1.2047 | 1.2319 | 1.2591 | 2.5 | 11.07 +Neigh | 1.3081 | 1.31 | 1.3119 | 0.2 | 11.78 +Comm | 0.21978 | 0.23832 | 0.25687 | 3.8 | 2.14 +Output | 0.00053644 | 0.00054514 | 0.00055385 | 0.0 | 0.00 +Modify | 0.35216 | 0.38209 | 0.41202 | 4.8 | 3.44 +Other | | 0.03448 | | | 0.31 + +Nlocal: 1002 ave 1003 max 1001 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8664.5 ave 8679 max 8650 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 350634 ave 352508 max 348761 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 701269 +Ave neighs/atom = 349.935 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 52 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 300 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.26848 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0230214 + estimated relative force accuracy = 6.93284e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 295.19123 -6343.4702 707.06763 -3873.9449 9895.5638 0.97622451 + 550 302.94979 -6642.4394 911.36179 -3922.2969 -5410.8109 0.97461641 + 600 297.33068 -6551.2919 805.26047 -3970.8 -646.78096 0.97348192 + 650 294.80947 -6578.9544 780.59748 -4038.1786 3293.0695 0.97423526 + 700 286.5511 -6718.4475 944.64841 -4062.9279 -5230.2518 0.97771554 + 750 294.49463 -6602.2482 777.88337 -4066.0662 4142.887 0.9831379 + 800 291.06018 -6664.3537 858.09465 -4068.466 -2624.3753 0.98991103 + 850 293.82285 -6689.8325 860.75951 -4074.7853 -435.3378 0.99623629 + 900 287.38111 -6671.9376 837.28605 -4118.8247 2185.0063 0.99906496 + 950 288.54911 -6783.7293 916.92837 -4144.0005 -2644.9104 0.99578685 + 1000 293.00277 -6687.2173 803.00518 -4134.8207 2220.968 0.98936787 + 1050 301.16902 -6760.9066 892.18697 -4070.5711 -2974.6886 0.98583275 + 1100 309.08554 -6738.1202 875.08899 -4017.6166 921.61791 0.98892607 + 1150 298.58252 -6674.1083 871.86516 -4019.5376 944.64401 0.98978942 + 1200 298.47184 -6760.3869 925.22004 -4053.1221 -798.3384 0.98947798 + 1250 291.12935 -6703.3237 856.27457 -4108.8431 544.44438 0.98937896 + 1300 293.02206 -6830.1194 917.90705 -4162.7058 432.93648 0.98837688 + 1350 282.12152 -6775.1505 898.35169 -4192.3746 -968.85129 0.98738197 + 1400 284.13008 -6684.782 848.15892 -4140.2066 -909.72792 0.98855422 + 1450 283.07781 -6640.5698 889.19504 -4061.241 120.67624 0.99460963 + 1500 299.32129 -6744.9956 896.07755 -4061.8016 -500.39827 1.002166 + 1550 290.06547 -6763.7114 921.50981 -4110.3475 1970.1344 1.0045278 + 1600 294.31127 -6824.5224 885.60385 -4181.7147 -1450.5522 1.0021664 + 1650 289.14351 -6837.8321 902.7679 -4208.7148 -36.719886 1.0010127 + 1700 284.10327 -6855.1076 903.75736 -4255.0939 984.04625 1.0006878 + 1750 280.04385 -6904.9119 918.67229 -4314.2203 -1431.4015 1.0004286 + 1800 281.68654 -6818.1122 846.72598 -4289.5591 520.17793 1.0021784 + 1850 286.93593 -6902.5226 934.50057 -4254.8531 -793.77873 1.0057534 + 1900 292.37295 -6876.9829 886.20947 -4245.1425 1563.8149 1.0119959 + 1950 278.61219 -6897.2099 935.36125 -4298.3772 -498.09374 1.0139668 + 2000 278.03754 -6936.4809 912.07762 -4364.3628 -475.0812 1.0140553 + 2050 280.17142 -6999.6889 907.21584 -4419.692 -483.15119 1.0159549 + 2100 275.01317 -7045.1909 966.49463 -4436.7129 516.29126 1.0192102 + 2150 275.36286 -6985.3989 879.47784 -4461.8499 -33.602001 1.0183533 + 2200 276.11062 -7026.4293 936.6898 -4441.2038 -1270.9384 1.0213402 + 2250 283.79417 -7011.4884 977.04948 -4340.0281 -178.52826 1.0266779 + 2300 276.26548 -6911.7259 909.12359 -4353.142 1380.5761 1.0284968 + 2350 279.5692 -7056.2521 960.48747 -4426.5792 202.29669 1.0282733 + 2400 270.18994 -6995.9308 932.57134 -4450.1735 -1921.755 1.0261097 + 2450 273.41894 -6999.2367 955.71826 -4411.0536 -376.50236 1.0265598 + 2500 279.53567 -6995.6096 941.2382 -4385.3862 300.84721 1.0300527 +Loop time of 46.7426 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.394 ns/day, 3.246 hours/ns, 42.788 timesteps/s +98.6% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 32.111 | 32.533 | 32.954 | 7.4 | 69.60 +Bond | 0.36551 | 0.36836 | 0.3712 | 0.5 | 0.79 +Kspace | 4.9203 | 5.3226 | 5.7249 | 17.4 | 11.39 +Neigh | 5.2618 | 5.2695 | 5.2772 | 0.3 | 11.27 +Comm | 0.89292 | 0.96319 | 1.0335 | 7.2 | 2.06 +Output | 0.0021534 | 0.0022 | 0.0022466 | 0.1 | 0.00 +Modify | 1.4108 | 1.5304 | 1.65 | 9.7 | 3.27 +Other | | 0.7537 | | | 1.61 + +Nlocal: 1002 ave 1023 max 981 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8955 ave 9060 max 8850 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 370398 ave 378514 max 362281 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 740795 +Ave neighs/atom = 369.658 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 200 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.6 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.6 new file mode 100644 index 0000000000..7dbd6f6128 --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.6 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 6 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 305 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 305 305 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 224.19041 -7672.2342 1225.2069 -5108.4844 -23898.427 0.9949719 + 100 260.06304 -6952.1103 483.25334 -4916.1343 12800.907 1.01007 + 150 282.69922 -6844.8106 472.2939 -4684.6433 7274.1665 1.0184736 + 200 283.07925 -7183.2915 1096.3999 -4396.7493 -18428.465 1.0184431 + 250 283.61722 -6327.2943 475.82271 -4158.1172 23020.286 1.0107938 + 300 301.71789 -6811.4188 1004.2807 -4005.7126 -14017.258 0.99889097 + 350 311.03337 -6506.7477 765.85039 -3883.8531 763.04925 0.98860598 + 400 317.775 -6392.1118 666.55754 -3828.2587 7828.8386 0.98148763 + 450 303.51186 -6657.5211 1017.7742 -3827.6103 -12704.511 0.97662555 + 500 296.45297 -6312.4144 719.53961 -3822.8838 8469.2935 0.97646495 +Loop time of 10.8893 on 2 procs for 500 steps with 2004 atoms + +Performance: 7.934 ns/day, 3.025 hours/ns, 45.917 timesteps/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.7295 | 7.7574 | 7.7852 | 1.0 | 71.24 +Bond | 0.088436 | 0.089395 | 0.090353 | 0.3 | 0.82 +Kspace | 1.1269 | 1.16 | 1.1931 | 3.1 | 10.65 +Neigh | 1.2353 | 1.2377 | 1.2402 | 0.2 | 11.37 +Comm | 0.21436 | 0.23339 | 0.25242 | 3.9 | 2.14 +Output | 0.00055766 | 0.00056684 | 0.00057602 | 0.0 | 0.01 +Modify | 0.34907 | 0.37832 | 0.40758 | 4.8 | 3.47 +Other | | 0.03245 | | | 0.30 + +Nlocal: 1002 ave 1007 max 997 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8685.5 ave 8750 max 8621 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 350698 ave 351936 max 349459 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 701395 +Ave neighs/atom = 349.998 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 50 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 305 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268487 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0230158 + estimated relative force accuracy = 6.93113e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 296.45297 -6312.4159 719.53961 -3822.8853 8469.2763 0.97646495 + 550 303.89646 -6501.1353 863.14038 -3823.5621 -2928.2904 0.98030197 + 600 309.76597 -6524.1714 843.08835 -3831.606 -871.10399 0.98376234 + 650 299.00298 -6442.6354 805.96883 -3851.4506 3266.5866 0.98567102 + 700 309.92953 -6599.5125 902.18135 -3846.8775 -4895.7743 0.9877618 + 750 310.03453 -6432.9154 800.77648 -3781.0583 4312.9432 0.98939465 + 800 313.79353 -6482.8645 876.10518 -3733.2354 459.73904 0.9883653 + 850 308.0727 -6473.4666 891.51665 -3742.5826 -1645.1499 0.9829221 + 900 312.68166 -6456.773 820.7786 -3769.109 2194.8957 0.97822936 + 950 305.94065 -6546.0017 902.97469 -3816.3892 -2693.7918 0.97584317 + 1000 298.40902 -6464.4155 886.05639 -3796.6893 592.46618 0.9764313 + 1050 308.71394 -6480.6485 854.83864 -3782.6139 843.67793 0.97834087 + 1100 309.34645 -6526.4283 897.66923 -3781.7868 -297.6956 0.98046791 + 1150 303.65216 -6540.534 858.53216 -3869.0276 623.45838 0.98196819 + 1200 298.33689 -6610.5403 897.10898 -3932.1923 -1107.1097 0.98263413 + 1250 302.10596 -6587.4254 875.62056 -3908.0623 1244.7382 0.98273784 + 1300 316.19456 -6618.7414 894.33747 -3836.5445 -1399.1921 0.98252654 + 1350 302.28789 -6625.1555 938.19878 -3882.1279 -57.818071 0.98275084 + 1400 301.42717 -6602.0706 858.72022 -3943.6606 1462.1175 0.97898596 + 1450 299.43442 -6655.6584 893.68574 -3974.1807 383.13882 0.97462948 + 1500 301.76848 -6653.4568 896.33172 -3955.3975 -756.22375 0.96978565 + 1550 310.10887 -6664.8547 953.35222 -3859.9781 -1305.0786 0.96689812 + 1600 297.16621 -6510.7805 907.3012 -3829.2299 992.41943 0.96413868 + 1650 295.71413 -6598.1621 990.18935 -3842.3931 -2049.7934 0.96131396 + 1700 303.88264 -6629.5417 931.13321 -3884.0582 -630.7683 0.96321179 + 1750 300.85941 -6666.8007 941.42895 -3929.0719 357.85887 0.96822524 + 1800 299.34518 -6674.9694 932.15075 -3955.5595 -914.97614 0.97074982 + 1850 298.12166 -6610.2338 910.63353 -3919.6462 1390.5062 0.97402953 + 1900 307.86527 -6647.8711 931.49082 -3878.2514 -1629.6931 0.97542316 + 1950 305.04604 -6616.6069 937.35845 -3857.952 858.37861 0.97770539 + 2000 305.41215 -6597.2293 916.75863 -3856.9883 763.6265 0.98001111 + 2050 294.66502 -6632.9068 1035.729 -3837.8618 -2248.1496 0.98430681 + 2100 300.5948 -6569.1213 956.22884 -3818.1724 291.3677 0.99188971 + 2150 305.73836 -6623.7387 1021.1569 -3777.1519 -603.41468 1.0003649 + 2200 316.63308 -6681.0402 972.23429 -3818.3283 948.97143 1.0073383 + 2250 306.36381 -6653.5361 947.42424 -3876.9476 900.19264 1.010245 + 2300 301.9961 -6699.2583 1022.4799 -3873.6918 -499.39887 1.0119712 + 2350 307.25098 -6642.8345 970.32723 -3838.0461 366.40507 1.0118686 + 2400 311.79941 -6675.2645 1030.8811 -3782.7656 -1083.5459 1.0113601 + 2450 309.31064 -6630.1585 958.35981 -3825.0401 471.39091 1.0099697 + 2500 301.87691 -6689.2603 967.59935 -3919.2859 -854.45149 1.0097679 +Loop time of 46.7431 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.394 ns/day, 3.246 hours/ns, 42.787 timesteps/s +99.4% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 31.029 | 31.472 | 31.916 | 7.9 | 67.33 +Bond | 0.36154 | 0.36249 | 0.36343 | 0.2 | 0.78 +Kspace | 4.7001 | 5.1269 | 5.5536 | 18.8 | 10.97 +Neigh | 5.311 | 5.3205 | 5.33 | 0.4 | 11.38 +Comm | 0.86766 | 0.94238 | 1.0171 | 7.7 | 2.02 +Output | 0.0022194 | 0.0022837 | 0.0023479 | 0.1 | 0.00 +Modify | 1.4059 | 1.5219 | 1.638 | 9.4 | 3.26 +Other | | 1.994 | | | 4.27 + +Nlocal: 1002 ave 1012 max 992 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8807.5 ave 8818 max 8797 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 363096 ave 369482 max 356711 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 726193 +Ave neighs/atom = 362.372 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 207 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.7 b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.7 new file mode 100644 index 0000000000..b6757e1f1b --- /dev/null +++ b/examples/USER/misc/temper_npt/log.temper_npt-17Aug17.g++.8.7 @@ -0,0 +1,211 @@ +LAMMPS (17 Aug 2017) +Processor partition = 7 + using 1 OpenMP thread(s) per MPI task +# Solvated 5-mer peptide +# Demonstrating temper/npt +units real +atom_style full + +pair_style lj/charmm/coul/long 8.0 10.0 10.0 +bond_style harmonic +angle_style charmm +dihedral_style charmm +improper_style harmonic +kspace_style pppm 0.0001 + +read_data data.peptide + orthogonal box = (36.8402 41.0137 29.7681) to (64.2116 68.3851 57.1395) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 2004 atoms + reading velocities ... + 2004 velocities + scanning bonds ... + 3 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 14 = max dihedrals/atom + scanning impropers ... + 1 = max impropers/atom + reading bonds ... + 1365 bonds + reading angles ... + 786 angles + reading dihedrals ... + 207 dihedrals + reading impropers ... + 12 impropers + 4 = max # of 1-2 neighbors + 7 = max # of 1-3 neighbors + 14 = max # of 1-4 neighbors + 18 = max # of special neighbors + +neighbor 2.0 bin +neigh_modify delay 5 + +timestep 2.0 + +thermo_style custom step temp epair emol etotal press density +thermo 50 + +variable temper_T world 275 280 285 290 295 300 305 310 +variable rep world 0 1 2 3 4 5 6 7 +fix myfix all npt temp ${temper_T} ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 310 ${temper_T} 100.0 iso 1 1 1000 +fix myfix all npt temp 310 310 100.0 iso 1 1 1000 +run 500 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268725 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0228209 + estimated relative force accuracy = 6.87243e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 0 190.0857 -6442.768 70.391457 -5237.4579 20361.998 0.98480122 + 50 224.5362 -7670.5503 1225.9519 -5103.9909 -23918.514 0.99480995 + 100 261.00419 -6946.2961 483.78483 -4904.1694 12827.309 1.0097087 + 150 284.14624 -6832.0094 472.66187 -4662.8346 7354.8252 1.0180355 + 200 284.05862 -7160.8537 1102.3553 -4362.5087 -18524.276 1.0178951 + 250 290.82577 -6319.5357 471.77841 -4111.3638 22989.86 1.0099523 + 300 306.50487 -6809.5465 1015.3715 -3964.1684 -13215.763 0.99625687 + 350 319.20654 -6502.4307 761.98704 -3834.601 -965.94424 0.98284646 + 400 316.81299 -6295.1539 646.79195 -3756.8102 8469.8917 0.97675631 + 450 312.90373 -6639.6427 1048.7063 -3722.7251 -13014.646 0.97486033 + 500 319.55848 -6335.5865 712.00927 -3715.6334 9980.2286 0.97468964 +Loop time of 10.7877 on 2 procs for 500 steps with 2004 atoms + +Performance: 8.009 ns/day, 2.997 hours/ns, 46.349 timesteps/s +99.1% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.6698 | 7.7211 | 7.7724 | 1.8 | 71.57 +Bond | 0.085352 | 0.086755 | 0.088159 | 0.5 | 0.80 +Kspace | 1.089 | 1.1417 | 1.1944 | 4.9 | 10.58 +Neigh | 1.2554 | 1.2554 | 1.2554 | 0.0 | 11.64 +Comm | 0.16438 | 0.17539 | 0.1864 | 2.6 | 1.63 +Output | 0.00045967 | 0.0004642 | 0.00046873 | 0.0 | 0.00 +Modify | 0.35006 | 0.37517 | 0.40028 | 4.1 | 3.48 +Other | | 0.0317 | | | 0.29 + +Nlocal: 1002 ave 1004 max 1000 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8709.5 ave 8714 max 8705 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 350398 ave 352725 max 348070 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 700795 +Ave neighs/atom = 349.698 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 51 +Dangerous builds = 0 +temper/npt 2000 100 ${temper_T} myfix 0 58728 1 +temper/npt 2000 100 310 myfix 0 58728 1 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.268436 + grid = 15 15 15 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0230577 + estimated relative force accuracy = 6.94376e-05 + using double precision FFTs + 3d grid and FFT values/proc = 6776 1800 +Per MPI rank memory allocation (min/avg/max) = 15.94 | 15.95 | 15.96 Mbytes +Step Temp E_pair E_mol TotEng Press Density + 500 319.55848 -6335.5878 712.00927 -3715.6347 9980.2224 0.97468964 + 550 312.3068 -6517.9692 882.51888 -3770.8031 -4737.1103 0.97368346 + 600 306.74828 -6500.9408 860.97959 -3808.5014 -1687.6369 0.97333001 + 650 309.25363 -6453.3615 753.23233 -3853.711 4484.0534 0.97330212 + 700 305.22336 -6644.7434 922.38867 -3899.9996 -5823.8028 0.97262421 + 750 297.24363 -6480.4086 771.41874 -3934.2782 5025.8889 0.97337406 + 800 300.89643 -6587.4079 835.06282 -3955.8242 -1517.9426 0.97460241 + 850 305.43206 -6685.1173 846.71999 -4014.7961 -1788.398 0.97836973 + 900 289.95008 -6574.8681 806.12799 -4037.575 2604.847 0.98232784 + 950 299.22424 -6671.7556 898.72395 -3986.4946 -2702.719 0.98919804 + 1000 305.3932 -6576.089 826.21317 -3926.5066 2254.7456 0.99471125 + 1050 304.62574 -6619.698 893.18161 -3907.7293 -1010.7916 0.99551385 + 1100 304.13778 -6603.0961 846.91376 -3940.3087 -211.63132 0.99359493 + 1150 285.80722 -6557.1116 859.12907 -3991.5526 1777.6534 0.99165538 + 1200 295.20871 -6612.8101 855.05738 -3995.1906 -389.55216 0.98957199 + 1250 301.4547 -6623.3355 907.78288 -3915.6984 1193.6428 0.98887879 + 1300 302.29836 -6545.5769 862.86619 -3877.8194 443.76145 0.9853829 + 1350 309.29624 -6539.3158 878.22476 -3814.4185 -769.46378 0.98002173 + 1400 311.28962 -6582.4295 939.53596 -3784.3195 -239.11773 0.97952655 + 1450 307.46833 -6597.7591 922.88062 -3839.1196 453.60414 0.98288752 + 1500 308.8234 -6660.3138 910.39719 -3906.0672 356.0472 0.98507945 + 1550 297.42322 -6596.3955 938.61921 -3881.9924 -883.10576 0.98730686 + 1600 309.492 -6649.4174 963.57197 -3838.0041 470.91335 0.99194955 + 1650 309.46921 -6602.6445 958.19972 -3796.7395 1417.6814 0.99437216 + 1700 308.27043 -6575.0156 941.02926 -3793.4384 -445.78985 0.99171728 + 1750 306.31262 -6515.703 929.60371 -3757.2406 944.20045 0.98661702 + 1800 308.63008 -6484.7465 959.53268 -3682.5186 333.02755 0.98504191 + 1850 316.69569 -6520.4677 975.02618 -3654.5901 -835.64735 0.98329409 + 1900 316.03266 -6531.6456 948.03331 -3696.7196 -745.03047 0.98236945 + 1950 308.97313 -6562.2733 955.48033 -3762.0496 -1147.5825 0.983921 + 2000 305.67836 -6611.4675 991.3364 -3795.0594 -2361.1127 0.98852677 + 2050 312.66709 -6687.3067 980.96042 -3839.5479 -244.80211 0.99714887 + 2100 307.23751 -6664.4853 963.74125 -3866.3633 268.84485 1.0050595 + 2150 296.36081 -6633.5455 966.74219 -3897.3626 -741.15958 1.0135557 + 2200 306.79331 -6709.7668 989.09713 -3888.9411 -108.31295 1.0211476 + 2250 310.62715 -6713.5021 973.14019 -3885.7431 1576.0539 1.0235204 + 2300 304.34901 -6675.1811 1001.4509 -3856.5955 -481.96378 1.0180933 + 2350 300.55584 -6592.7909 993.96783 -3804.3356 114.74351 1.0116595 + 2400 307.16641 -6626.7049 984.70783 -3808.0408 620.2875 1.0087872 + 2450 301.62279 -6643.7063 978.76012 -3864.0884 72.614095 1.0085247 + 2500 307.17634 -6691.4794 975.63125 -3881.8326 495.45555 1.0099428 +Loop time of 46.7465 on 2 procs for 2000 steps with 2004 atoms + +Performance: 7.393 ns/day, 3.246 hours/ns, 42.784 timesteps/s +99.1% CPU use with 2 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 31.19 | 31.703 | 32.216 | 9.1 | 67.82 +Bond | 0.35397 | 0.35463 | 0.35528 | 0.1 | 0.76 +Kspace | 4.3783 | 4.8922 | 5.4062 | 23.2 | 10.47 +Neigh | 5.2885 | 5.2889 | 5.2893 | 0.0 | 11.31 +Comm | 0.67571 | 0.71687 | 0.75803 | 4.9 | 1.53 +Output | 0.0019109 | 0.0019529 | 0.0019948 | 0.1 | 0.00 +Modify | 1.4216 | 1.5185 | 1.6154 | 7.9 | 3.25 +Other | | 2.271 | | | 4.86 + +Nlocal: 1002 ave 1010 max 994 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 8811.5 ave 8832 max 8791 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Neighs: 363080 ave 367967 max 358193 min +Histogram: 1 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 726160 +Ave neighs/atom = 362.355 +Ave special neighs/atom = 2.34032 +Neighbor list builds = 207 +Dangerous builds = 0 +fix 2 all shake 0.0001 10 100 b 4 6 8 10 12 14 18 a 31 + 19 = # of size 2 clusters + 6 = # of size 3 clusters + 3 = # of size 4 clusters + 640 = # of frozen angles +group peptide type <= 12 +84 atoms in group peptide +Total wall time: 0:00:58 diff --git a/examples/USER/mofff/hkust1.data b/examples/USER/mofff/hkust1.data new file mode 100644 index 0000000000..34d2a0fdbf --- /dev/null +++ b/examples/USER/mofff/hkust1.data @@ -0,0 +1,5970 @@ +LAMMPS data file for mol object with MOF-FF params from www.mofplus.org + + 624 atoms + 792 bonds + 1536 angles + 2688 dihedrals + 288 impropers + 6 atom types + 6 bond types + 8 angle types + 10 dihedral types + 3 improper types + + 0.000000 26.440800 xlo xhi + 0.000000 26.440800 ylo yhi + 0.000000 26.440800 zlo zhi +0.0 0.0 0.0 xy xz yz + +Masses + + 1 12.0107 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW + 2 12.0107 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene + 3 1.0079 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene + 4 63.5460 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW + 5 15.9994 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW + 6 12.0107 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +Atoms + + 1 1 1 0.15000 8.511363 10.227518 8.511602 # buck6d->(c3_c2h1@ph)|benzene + 2 1 2 -0.12000 9.663229 9.663426 7.945909 # buck6d->(c3_c2h1@ph)|benzene + 3 1 1 0.15000 10.227441 8.511503 8.511368 # buck6d->(c3_c2h1@ph)|benzene + 4 1 2 -0.12000 9.663300 7.945929 9.663330 # buck6d->(c3_c2h1@ph)|benzene + 5 1 1 0.15000 8.511325 8.511388 10.227535 # buck6d->(c3_c2h1@ph)|benzene + 6 1 2 -0.12000 7.945739 9.663310 9.663470 # buck6d->(c3_c2h1@ph)|benzene + 7 1 3 0.12000 10.109919 10.110287 7.050035 # buck6d->(h1_c1@ph)|benzene + 8 1 3 0.12000 10.110158 7.050114 10.110112 # buck6d->(h1_c1@ph)|benzene + 9 1 3 0.12000 7.049841 10.110023 10.110259 # buck6d->(h1_c1@ph)|benzene + 10 1 4 1.06000 7.499041 0.000097 7.499090 # buck6d->(cu5_cu1o4@cu2)|CuPW + 11 1 4 1.06000 5.721043 0.000123 5.721760 # buck6d->(cu5_cu1o4@cu2)|CuPW + 12 1 5 -0.65000 4.840530 -1.387225 6.780507 # buck6d->(o2_c1cu1@co2)|CuPW + 13 1 6 0.62000 5.372812 -1.829110 7.847543 # buck6d->(c3_c1o2@co2)|CuPW + 14 1 5 -0.65000 6.440249 -1.387650 8.379219 # buck6d->(o2_c1cu1@co2)|CuPW + 15 1 5 -0.65000 4.841104 1.387548 6.780755 # buck6d->(o2_c1cu1@co2)|CuPW + 16 1 6 0.62000 5.373309 1.829329 7.847836 # buck6d->(c3_c1o2@co2)|CuPW + 17 1 5 -0.65000 6.440724 1.387871 8.379592 # buck6d->(o2_c1cu1@co2)|CuPW + 18 1 5 -0.65000 6.779575 -1.388074 4.841738 # buck6d->(o2_c1cu1@co2)|CuPW + 19 1 6 0.62000 7.847131 -1.829545 5.373362 # buck6d->(c3_c1o2@co2)|CuPW + 20 1 5 -0.65000 8.379258 -1.387691 6.440418 # buck6d->(o2_c1cu1@co2)|CuPW + 21 1 5 -0.65000 6.779295 1.388308 4.841441 # buck6d->(o2_c1cu1@co2)|CuPW + 22 1 6 0.62000 7.846839 1.829774 5.373125 # buck6d->(c3_c1o2@co2)|CuPW + 23 1 5 -0.65000 8.378904 1.387962 6.440208 # buck6d->(o2_c1cu1@co2)|CuPW + 24 1 1 0.15000 8.511270 -2.993007 -4.708908 # buck6d->(c3_c2h1@ph)|benzene + 25 1 2 -0.12000 9.663288 -3.557042 -5.274424 # buck6d->(c3_c2h1@ph)|benzene + 26 1 1 0.15000 10.227456 -4.709002 -4.708971 # buck6d->(c3_c2h1@ph)|benzene + 27 1 2 -0.12000 9.663390 -5.274613 -3.557016 # buck6d->(c3_c2h1@ph)|benzene + 28 1 1 0.15000 8.511535 -4.709026 -2.992754 # buck6d->(c3_c2h1@ph)|benzene + 29 1 2 -0.12000 7.945844 -3.557174 -3.556922 # buck6d->(c3_c2h1@ph)|benzene + 30 1 3 0.12000 10.110196 -3.110041 -6.170110 # buck6d->(h1_c1@ph)|benzene + 31 1 3 0.12000 10.110157 -6.170515 -3.110298 # buck6d->(h1_c1@ph)|benzene + 32 1 3 0.12000 7.049967 -3.110477 -3.110076 # buck6d->(h1_c1@ph)|benzene + 33 1 4 1.06000 7.498974 13.220478 -5.721375 # buck6d->(cu5_cu1o4@cu2)|CuPW + 34 1 4 1.06000 5.721723 -13.220289 -7.499457 # buck6d->(cu5_cu1o4@cu2)|CuPW + 35 1 5 -0.65000 6.780497 -11.832922 -8.379807 # buck6d->(o2_c1cu1@co2)|CuPW + 36 1 6 0.62000 7.847466 -11.391090 -7.847518 # buck6d->(c3_c1o2@co2)|CuPW + 37 1 5 -0.65000 8.379136 -11.832518 -6.779997 # buck6d->(o2_c1cu1@co2)|CuPW + 38 1 5 -0.65000 6.780824 11.833153 -8.379478 # buck6d->(o2_c1cu1@co2)|CuPW + 39 1 6 0.62000 7.847799 11.391293 -7.847244 # buck6d->(c3_c1o2@co2)|CuPW + 40 1 5 -0.65000 8.379519 11.832732 -6.779737 # buck6d->(o2_c1cu1@co2)|CuPW + 41 1 5 -0.65000 4.841857 -11.832064 -6.440915 # buck6d->(o2_c1cu1@co2)|CuPW + 42 1 6 0.62000 5.373386 -11.390666 -5.373363 # buck6d->(c3_c1o2@co2)|CuPW + 43 1 5 -0.65000 6.440464 -11.832509 -4.841135 # buck6d->(o2_c1cu1@co2)|CuPW + 44 1 5 -0.65000 4.841241 11.832334 -6.441203 # buck6d->(o2_c1cu1@co2)|CuPW + 45 1 6 0.62000 5.372825 11.390858 -5.373695 # buck6d->(c3_c1o2@co2)|CuPW + 46 1 5 -0.65000 6.439927 11.832729 -4.841529 # buck6d->(o2_c1cu1@co2)|CuPW + 47 1 1 0.15000 -2.992911 8.511494 -4.708848 # buck6d->(c3_c2h1@ph)|benzene + 48 1 2 -0.12000 -3.557058 9.663335 -5.274575 # buck6d->(c3_c2h1@ph)|benzene + 49 1 1 0.15000 -4.708922 10.227604 -4.709070 # buck6d->(c3_c2h1@ph)|benzene + 50 1 2 -0.12000 -5.274608 9.663473 -3.557176 # buck6d->(c3_c2h1@ph)|benzene + 51 1 1 0.15000 -4.709132 8.511529 -2.992979 # buck6d->(c3_c2h1@ph)|benzene + 52 1 2 -0.12000 -3.557187 7.945925 -3.556994 # buck6d->(c3_c2h1@ph)|benzene + 53 1 3 0.12000 -3.110356 10.109923 -6.170583 # buck6d->(h1_c1@ph)|benzene + 54 1 3 0.12000 -6.170511 10.110286 -3.110515 # buck6d->(h1_c1@ph)|benzene + 55 1 3 0.12000 -3.110480 7.050049 -3.110170 # buck6d->(h1_c1@ph)|benzene + 56 1 4 1.06000 -7.499259 -0.000141 -7.498795 # buck6d->(cu5_cu1o4@cu2)|CuPW + 57 1 4 1.06000 -5.721249 -0.000151 -5.721463 # buck6d->(cu5_cu1o4@cu2)|CuPW + 58 1 5 -0.65000 -4.841384 -1.387826 -6.780384 # buck6d->(o2_c1cu1@co2)|CuPW + 59 1 6 0.62000 -5.373470 -1.829621 -7.847437 # buck6d->(c3_c1o2@co2)|CuPW + 60 1 5 -0.65000 -6.441010 -1.388185 -8.379170 # buck6d->(o2_c1cu1@co2)|CuPW + 61 1 5 -0.65000 -4.841019 1.387474 -6.780240 # buck6d->(o2_c1cu1@co2)|CuPW + 62 1 6 0.62000 -5.373147 1.829327 -7.847262 # buck6d->(c3_c1o2@co2)|CuPW + 63 1 5 -0.65000 -6.440701 1.387868 -8.378943 # buck6d->(o2_c1cu1@co2)|CuPW + 64 1 5 -0.65000 -6.779589 -1.388034 -4.841127 # buck6d->(o2_c1cu1@co2)|CuPW + 65 1 6 0.62000 -7.847015 -1.829455 -5.372819 # buck6d->(c3_c1o2@co2)|CuPW + 66 1 5 -0.65000 -8.379225 -1.387675 -6.439938 # buck6d->(o2_c1cu1@co2)|CuPW + 67 1 5 -0.65000 -6.779875 1.387669 -4.841177 # buck6d->(o2_c1cu1@co2)|CuPW + 68 1 6 0.62000 -7.847291 1.829136 -5.372820 # buck6d->(c3_c1o2@co2)|CuPW + 69 1 5 -0.65000 -8.379551 1.387268 -6.439913 # buck6d->(o2_c1cu1@co2)|CuPW + 70 1 1 0.15000 -2.992840 -4.709207 8.511555 # buck6d->(c3_c2h1@ph)|benzene + 71 1 2 -0.12000 -3.556778 -3.557266 7.945804 # buck6d->(c3_c2h1@ph)|benzene + 72 1 1 0.15000 -4.708723 -2.992906 8.511175 # buck6d->(c3_c2h1@ph)|benzene + 73 1 2 -0.12000 -5.274412 -3.556902 9.663096 # buck6d->(c3_c2h1@ph)|benzene + 74 1 1 0.15000 -4.709052 -4.708822 10.227435 # buck6d->(c3_c2h1@ph)|benzene + 75 1 2 -0.12000 -3.557127 -5.274597 9.663476 # buck6d->(c3_c2h1@ph)|benzene + 76 1 3 0.12000 -3.109808 -3.110623 7.049972 # buck6d->(h1_c1@ph)|benzene + 77 1 3 0.12000 -6.170267 -3.109948 10.109738 # buck6d->(h1_c1@ph)|benzene + 78 1 3 0.12000 -3.110474 -6.170423 10.110455 # buck6d->(h1_c1@ph)|benzene + 79 1 4 1.06000 -7.499097 13.220344 5.721412 # buck6d->(cu5_cu1o4@cu2)|CuPW + 80 1 4 1.06000 -5.721189 -13.220461 7.498841 # buck6d->(cu5_cu1o4@cu2)|CuPW + 81 1 5 -0.65000 -4.841336 11.832778 6.439781 # buck6d->(o2_c1cu1@co2)|CuPW + 82 1 6 0.62000 -5.373437 11.391033 5.372626 # buck6d->(c3_c1o2@co2)|CuPW + 83 1 5 -0.65000 -6.440805 11.832560 4.840820 # buck6d->(o2_c1cu1@co2)|CuPW + 84 1 5 -0.65000 -4.840683 -11.832921 6.440310 # buck6d->(o2_c1cu1@co2)|CuPW + 85 1 6 0.62000 -5.372868 -11.391140 5.373201 # buck6d->(c3_c1o2@co2)|CuPW + 86 1 5 -0.65000 -6.440282 -11.832640 4.841484 # buck6d->(o2_c1cu1@co2)|CuPW + 87 1 5 -0.65000 -6.779436 11.832347 8.379275 # buck6d->(o2_c1cu1@co2)|CuPW + 88 1 6 0.62000 -7.846868 11.390837 7.847497 # buck6d->(c3_c1o2@co2)|CuPW + 89 1 5 -0.65000 -8.378901 11.832576 6.780336 # buck6d->(o2_c1cu1@co2)|CuPW + 90 1 5 -0.65000 -6.779945 -11.832475 8.378790 # buck6d->(o2_c1cu1@co2)|CuPW + 91 1 6 0.62000 -7.847394 -11.390970 7.847101 # buck6d->(c3_c1o2@co2)|CuPW + 92 1 5 -0.65000 -8.379521 -11.832777 6.779978 # buck6d->(o2_c1cu1@co2)|CuPW + 93 1 4 1.06000 7.498935 7.499097 -0.000096 # buck6d->(cu5_cu1o4@cu2)|CuPW + 94 1 4 1.06000 5.721634 5.721055 -0.000027 # buck6d->(cu5_cu1o4@cu2)|CuPW + 95 1 5 -0.65000 6.780060 4.840449 -1.387512 # buck6d->(o2_c1cu1@co2)|CuPW + 96 1 6 0.62000 7.847107 5.372757 -1.829320 # buck6d->(c3_c1o2@co2)|CuPW + 97 1 5 -0.65000 8.378716 6.440237 -1.387898 # buck6d->(o2_c1cu1@co2)|CuPW + 98 1 5 -0.65000 6.780809 4.841177 1.387428 # buck6d->(o2_c1cu1@co2)|CuPW + 99 1 6 0.62000 7.847879 5.373372 1.829219 # buck6d->(c3_c1o2@co2)|CuPW + 100 1 5 -0.65000 8.379591 6.440817 1.387706 # buck6d->(o2_c1cu1@co2)|CuPW + 101 1 5 -0.65000 4.841688 6.779724 -1.388098 # buck6d->(o2_c1cu1@co2)|CuPW + 102 1 6 0.62000 5.373262 7.847219 -1.829573 # buck6d->(c3_c1o2@co2)|CuPW + 103 1 5 -0.65000 6.440362 8.379445 -1.387779 # buck6d->(o2_c1cu1@co2)|CuPW + 104 1 5 -0.65000 4.841333 6.779413 1.387965 # buck6d->(o2_c1cu1@co2)|CuPW + 105 1 6 0.62000 5.372968 7.846900 1.829427 # buck6d->(c3_c1o2@co2)|CuPW + 106 1 5 -0.65000 6.440067 8.379074 1.387611 # buck6d->(o2_c1cu1@co2)|CuPW + 107 1 4 1.06000 -0.000100 5.721669 5.721032 # buck6d->(cu5_cu1o4@cu2)|CuPW + 108 1 4 1.06000 -0.000003 7.498948 7.499090 # buck6d->(cu5_cu1o4@cu2)|CuPW + 109 1 5 -0.65000 -1.387770 6.440216 8.379026 # buck6d->(o2_c1cu1@co2)|CuPW + 110 1 6 0.62000 -1.829603 5.373135 7.846857 # buck6d->(c3_c1o2@co2)|CuPW + 111 1 5 -0.65000 -1.388227 4.841508 6.779327 # buck6d->(o2_c1cu1@co2)|CuPW + 112 1 5 -0.65000 1.387578 6.439913 8.379094 # buck6d->(o2_c1cu1@co2)|CuPW + 113 1 6 0.62000 1.829462 5.372843 7.846910 # buck6d->(c3_c1o2@co2)|CuPW + 114 1 5 -0.65000 1.387989 4.841219 6.779413 # buck6d->(o2_c1cu1@co2)|CuPW + 115 1 5 -0.65000 -1.387839 8.379652 6.440817 # buck6d->(o2_c1cu1@co2)|CuPW + 116 1 6 0.62000 -1.829317 7.847910 5.373340 # buck6d->(c3_c1o2@co2)|CuPW + 117 1 5 -0.65000 -1.387482 6.780886 4.841157 # buck6d->(o2_c1cu1@co2)|CuPW + 118 1 5 -0.65000 1.387882 8.379065 6.440566 # buck6d->(o2_c1cu1@co2)|CuPW + 119 1 6 0.62000 1.829245 7.847386 5.373025 # buck6d->(c3_c1o2@co2)|CuPW + 120 1 5 -0.65000 1.387369 6.780401 4.840793 # buck6d->(o2_c1cu1@co2)|CuPW + 121 1 4 1.06000 -5.721500 7.499153 13.220484 # buck6d->(cu5_cu1o4@cu2)|CuPW + 122 1 4 1.06000 -7.498868 5.721192 -13.220262 # buck6d->(cu5_cu1o4@cu2)|CuPW + 123 1 5 -0.65000 -6.439922 4.841089 11.832946 # buck6d->(o2_c1cu1@co2)|CuPW + 124 1 6 0.62000 -5.372793 5.373245 11.391120 # buck6d->(c3_c1o2@co2)|CuPW + 125 1 5 -0.65000 -4.841096 6.440660 11.832631 # buck6d->(o2_c1cu1@co2)|CuPW + 126 1 5 -0.65000 -6.440187 4.840996 -11.832629 # buck6d->(o2_c1cu1@co2)|CuPW + 127 1 6 0.62000 -5.373059 5.373161 -11.390863 # buck6d->(c3_c1o2@co2)|CuPW + 128 1 5 -0.65000 -4.841384 6.440612 -11.832335 # buck6d->(o2_c1cu1@co2)|CuPW + 129 1 5 -0.65000 -8.379426 6.779471 11.832581 # buck6d->(o2_c1cu1@co2)|CuPW + 130 1 6 0.62000 -7.847682 7.846929 11.391067 # buck6d->(c3_c1o2@co2)|CuPW + 131 1 5 -0.65000 -6.780577 8.379017 11.832865 # buck6d->(o2_c1cu1@co2)|CuPW + 132 1 5 -0.65000 -8.378810 6.779928 -11.832332 # buck6d->(o2_c1cu1@co2)|CuPW + 133 1 6 0.62000 -7.847144 7.847392 -11.390870 # buck6d->(c3_c1o2@co2)|CuPW + 134 1 5 -0.65000 -6.780036 8.379568 -11.832670 # buck6d->(o2_c1cu1@co2)|CuPW + 135 1 4 1.06000 -13.220418 -7.499243 5.721546 # buck6d->(cu5_cu1o4@cu2)|CuPW + 136 1 4 1.06000 13.220417 -5.721179 7.498824 # buck6d->(cu5_cu1o4@cu2)|CuPW + 137 1 5 -0.65000 -11.832889 -4.841212 6.439769 # buck6d->(o2_c1cu1@co2)|CuPW + 138 1 6 0.62000 -11.391005 -5.373398 5.372742 # buck6d->(c3_c1o2@co2)|CuPW + 139 1 5 -0.65000 -11.832425 -6.440917 4.841067 # buck6d->(o2_c1cu1@co2)|CuPW + 140 1 5 -0.65000 11.832850 -4.841033 6.440096 # buck6d->(o2_c1cu1@co2)|CuPW + 141 1 6 0.62000 11.391015 -5.373241 5.373065 # buck6d->(c3_c1o2@co2)|CuPW + 142 1 5 -0.65000 11.832418 -6.440767 4.841407 # buck6d->(o2_c1cu1@co2)|CuPW + 143 1 5 -0.65000 -11.832415 -6.779606 8.379007 # buck6d->(o2_c1cu1@co2)|CuPW + 144 1 6 0.62000 -11.391012 -7.847121 7.847366 # buck6d->(c3_c1o2@co2)|CuPW + 145 1 5 -0.65000 -11.832851 -8.379345 6.780323 # buck6d->(o2_c1cu1@co2)|CuPW + 146 1 5 -0.65000 11.832446 -6.779531 8.379277 # buck6d->(o2_c1cu1@co2)|CuPW + 147 1 6 0.62000 11.391002 -7.847026 7.847626 # buck6d->(c3_c1o2@co2)|CuPW + 148 1 5 -0.65000 11.832863 -8.379236 6.780574 # buck6d->(o2_c1cu1@co2)|CuPW + 149 1 4 1.06000 -5.721201 -5.721523 0.000071 # buck6d->(cu5_cu1o4@cu2)|CuPW + 150 1 4 1.06000 -7.499230 -7.498822 0.000120 # buck6d->(cu5_cu1o4@cu2)|CuPW + 151 1 5 -0.65000 -8.379037 -6.439774 1.387713 # buck6d->(o2_c1cu1@co2)|CuPW + 152 1 6 0.62000 -7.846871 -5.372683 1.829509 # buck6d->(c3_c1o2@co2)|CuPW + 153 1 5 -0.65000 -6.779414 -4.840980 1.388036 # buck6d->(o2_c1cu1@co2)|CuPW + 154 1 5 -0.65000 -8.379706 -6.440235 -1.387483 # buck6d->(o2_c1cu1@co2)|CuPW + 155 1 6 0.62000 -7.847468 -5.373190 -1.829340 # buck6d->(c3_c1o2@co2)|CuPW + 156 1 5 -0.65000 -6.779967 -4.841576 -1.387880 # buck6d->(o2_c1cu1@co2)|CuPW + 157 1 5 -0.65000 -6.440907 -8.379136 1.388117 # buck6d->(o2_c1cu1@co2)|CuPW + 158 1 6 0.62000 -5.373424 -7.847461 1.829569 # buck6d->(c3_c1o2@co2)|CuPW + 159 1 5 -0.65000 -4.841254 -6.780374 1.387773 # buck6d->(o2_c1cu1@co2)|CuPW + 160 1 5 -0.65000 -6.440605 -8.378984 -1.387845 # buck6d->(o2_c1cu1@co2)|CuPW + 161 1 6 0.62000 -5.373138 -7.847371 -1.829336 # buck6d->(c3_c1o2@co2)|CuPW + 162 1 5 -0.65000 -4.840896 -6.780300 -1.387486 # buck6d->(o2_c1cu1@co2)|CuPW + 163 1 4 1.06000 0.000023 -7.498980 -7.499117 # buck6d->(cu5_cu1o4@cu2)|CuPW + 164 1 4 1.06000 0.000084 -5.721700 -5.721060 # buck6d->(cu5_cu1o4@cu2)|CuPW + 165 1 5 -0.65000 -1.387329 -6.780659 -4.840773 # buck6d->(o2_c1cu1@co2)|CuPW + 166 1 6 0.62000 -1.829224 -7.847682 -5.373024 # buck6d->(c3_c1o2@co2)|CuPW + 167 1 5 -0.65000 -1.387763 -8.379347 -6.440498 # buck6d->(o2_c1cu1@co2)|CuPW + 168 1 5 -0.65000 1.387524 -6.780535 -4.841045 # buck6d->(o2_c1cu1@co2)|CuPW + 169 1 6 0.62000 1.829335 -7.847578 -5.373295 # buck6d->(c3_c1o2@co2)|CuPW + 170 1 5 -0.65000 1.387948 -8.379247 -6.440785 # buck6d->(o2_c1cu1@co2)|CuPW + 171 1 5 -0.65000 -1.388059 -4.841323 -6.779208 # buck6d->(o2_c1cu1@co2)|CuPW + 172 1 6 0.62000 -1.829480 -5.372976 -7.846749 # buck6d->(c3_c1o2@co2)|CuPW + 173 1 5 -0.65000 -1.387659 -6.440033 -8.378897 # buck6d->(o2_c1cu1@co2)|CuPW + 174 1 5 -0.65000 1.388158 -4.841621 -6.779683 # buck6d->(o2_c1cu1@co2)|CuPW + 175 1 6 0.62000 1.829588 -5.373232 -7.847238 # buck6d->(c3_c1o2@co2)|CuPW + 176 1 5 -0.65000 1.387697 -6.440257 -8.379429 # buck6d->(o2_c1cu1@co2)|CuPW + 177 1 4 1.06000 5.721101 -7.498732 -13.220510 # buck6d->(cu5_cu1o4@cu2)|CuPW + 178 1 4 1.06000 7.499124 -5.721413 13.220216 # buck6d->(cu5_cu1o4@cu2)|CuPW + 179 1 5 -0.65000 8.379506 -6.780087 -11.832904 # buck6d->(o2_c1cu1@co2)|CuPW + 180 1 6 0.62000 7.847282 -7.847173 -11.391015 # buck6d->(c3_c1o2@co2)|CuPW + 181 1 5 -0.65000 6.779800 -8.378757 -11.832483 # buck6d->(o2_c1cu1@co2)|CuPW + 182 1 5 -0.65000 8.378897 -6.780279 11.832493 # buck6d->(o2_c1cu1@co2)|CuPW + 183 1 6 0.62000 7.846732 -7.847418 11.390732 # buck6d->(c3_c1o2@co2)|CuPW + 184 1 5 -0.65000 6.779278 -8.379076 11.832184 # buck6d->(o2_c1cu1@co2)|CuPW + 185 1 5 -0.65000 6.440596 -4.841116 -11.832759 # buck6d->(o2_c1cu1@co2)|CuPW + 186 1 6 0.62000 5.373106 -5.372836 -11.391273 # buck6d->(c3_c1o2@co2)|CuPW + 187 1 5 -0.65000 4.840898 -6.439842 -11.833101 # buck6d->(o2_c1cu1@co2)|CuPW + 188 1 5 -0.65000 6.440669 -4.841149 11.832379 # buck6d->(o2_c1cu1@co2)|CuPW + 189 1 6 0.62000 5.373163 -5.372900 11.390944 # buck6d->(c3_c1o2@co2)|CuPW + 190 1 5 -0.65000 4.840989 -6.439912 11.832746 # buck6d->(o2_c1cu1@co2)|CuPW + 191 1 4 1.06000 13.220340 5.721208 -7.498793 # buck6d->(cu5_cu1o4@cu2)|CuPW + 192 1 4 1.06000 -13.220340 7.499268 -5.721521 # buck6d->(cu5_cu1o4@cu2)|CuPW + 193 1 5 -0.65000 -11.832779 8.379301 -6.780392 # buck6d->(o2_c1cu1@co2)|CuPW + 194 1 6 0.62000 -11.390960 7.847121 -7.847394 # buck6d->(c3_c1o2@co2)|CuPW + 195 1 5 -0.65000 -11.832399 6.779562 -8.379065 # buck6d->(o2_c1cu1@co2)|CuPW + 196 1 5 -0.65000 11.832877 8.379317 -6.780505 # buck6d->(o2_c1cu1@co2)|CuPW + 197 1 6 0.62000 11.390986 7.847146 -7.847504 # buck6d->(c3_c1o2@co2)|CuPW + 198 1 5 -0.65000 11.832409 6.779601 -8.379192 # buck6d->(o2_c1cu1@co2)|CuPW + 199 1 5 -0.65000 -11.832370 6.440538 -4.841524 # buck6d->(o2_c1cu1@co2)|CuPW + 200 1 6 0.62000 -11.390986 5.373029 -5.373112 # buck6d->(c3_c1o2@co2)|CuPW + 201 1 5 -0.65000 -11.832919 4.840757 -6.440147 # buck6d->(o2_c1cu1@co2)|CuPW + 202 1 5 -0.65000 11.832417 6.441155 -4.840907 # buck6d->(o2_c1cu1@co2)|CuPW + 203 1 6 0.62000 11.390962 5.373697 -5.372577 # buck6d->(c3_c1o2@co2)|CuPW + 204 1 5 -0.65000 11.832768 4.841515 -6.439680 # buck6d->(o2_c1cu1@co2)|CuPW + 205 1 1 0.15000 10.227460 8.511311 -8.511565 # buck6d->(c3_c2h1@ph)|benzene + 206 1 2 -0.12000 9.663493 9.663225 -7.945786 # buck6d->(c3_c2h1@ph)|benzene + 207 1 1 0.15000 8.511666 10.227623 -8.511244 # buck6d->(c3_c2h1@ph)|benzene + 208 1 2 -0.12000 7.945801 9.663629 -9.663104 # buck6d->(c3_c2h1@ph)|benzene + 209 1 1 0.15000 8.511115 8.511679 -10.227423 # buck6d->(c3_c2h1@ph)|benzene + 210 1 2 -0.12000 9.663095 7.945977 -9.663492 # buck6d->(c3_c2h1@ph)|benzene + 211 1 3 0.12000 10.110332 10.109755 -7.049822 # buck6d->(h1_c1@ph)|benzene + 212 1 3 0.12000 7.049903 10.110573 -10.109653 # buck6d->(h1_c1@ph)|benzene + 213 1 3 0.12000 10.109766 7.050179 -10.110507 # buck6d->(h1_c1@ph)|benzene + 214 1 4 1.06000 7.498802 -0.000109 -7.499331 # buck6d->(cu5_cu1o4@cu2)|CuPW + 215 1 4 1.06000 5.721290 -0.000080 -5.721511 # buck6d->(cu5_cu1o4@cu2)|CuPW + 216 1 5 -0.65000 6.779695 -1.387998 -4.841239 # buck6d->(o2_c1cu1@co2)|CuPW + 217 1 6 0.62000 7.846913 -1.829736 -5.373269 # buck6d->(c3_c1o2@co2)|CuPW + 218 1 5 -0.65000 8.378637 -1.388230 -6.440685 # buck6d->(o2_c1cu1@co2)|CuPW + 219 1 5 -0.65000 6.780240 1.387762 -4.841626 # buck6d->(o2_c1cu1@co2)|CuPW + 220 1 6 0.62000 7.847478 1.829541 -5.373610 # buck6d->(c3_c1o2@co2)|CuPW + 221 1 5 -0.65000 8.379241 1.387975 -6.440983 # buck6d->(o2_c1cu1@co2)|CuPW + 222 1 5 -0.65000 4.841159 -1.387774 -6.780242 # buck6d->(o2_c1cu1@co2)|CuPW + 223 1 6 0.62000 5.373009 -1.829308 -7.847604 # buck6d->(c3_c1o2@co2)|CuPW + 224 1 5 -0.65000 6.440140 -1.387579 -8.379712 # buck6d->(o2_c1cu1@co2)|CuPW + 225 1 5 -0.65000 4.840791 1.387572 -6.779979 # buck6d->(o2_c1cu1@co2)|CuPW + 226 1 6 0.62000 5.372677 1.829102 -7.847333 # buck6d->(c3_c1o2@co2)|CuPW + 227 1 5 -0.65000 6.439804 1.387330 -8.379403 # buck6d->(o2_c1cu1@co2)|CuPW + 228 1 1 0.15000 10.227566 -4.709048 4.708958 # buck6d->(c3_c2h1@ph)|benzene + 229 1 2 -0.12000 9.663406 -3.557113 5.274545 # buck6d->(c3_c2h1@ph)|benzene + 230 1 1 0.15000 8.511418 -2.992944 4.709068 # buck6d->(c3_c2h1@ph)|benzene + 231 1 2 -0.12000 7.945965 -3.557087 3.557099 # buck6d->(c3_c2h1@ph)|benzene + 232 1 1 0.15000 8.511576 -4.708996 2.992933 # buck6d->(c3_c2h1@ph)|benzene + 233 1 2 -0.12000 9.663454 -5.274625 3.557061 # buck6d->(c3_c2h1@ph)|benzene + 234 1 3 0.12000 10.110260 -3.110333 6.170363 # buck6d->(h1_c1@ph)|benzene + 235 1 3 0.12000 7.050152 -3.110280 3.110247 # buck6d->(h1_c1@ph)|benzene + 236 1 3 0.12000 10.110221 -6.170504 3.110276 # buck6d->(h1_c1@ph)|benzene + 237 1 4 1.06000 7.499068 -13.220525 5.721472 # buck6d->(cu5_cu1o4@cu2)|CuPW + 238 1 4 1.06000 5.721639 13.220300 7.499368 # buck6d->(cu5_cu1o4@cu2)|CuPW + 239 1 5 -0.65000 6.780240 11.832821 8.379797 # buck6d->(o2_c1cu1@co2)|CuPW + 240 1 6 0.62000 7.847294 11.391067 7.847652 # buck6d->(c3_c1o2@co2)|CuPW + 241 1 5 -0.65000 8.379096 11.832548 6.780199 # buck6d->(o2_c1cu1@co2)|CuPW + 242 1 5 -0.65000 6.780742 -11.833071 8.379438 # buck6d->(o2_c1cu1@co2)|CuPW + 243 1 6 0.62000 7.847802 -11.391294 7.847352 # buck6d->(c3_c1o2@co2)|CuPW + 244 1 5 -0.65000 8.379662 -11.832856 6.779934 # buck6d->(o2_c1cu1@co2)|CuPW + 245 1 5 -0.65000 4.841679 11.832140 6.440746 # buck6d->(o2_c1cu1@co2)|CuPW + 246 1 6 0.62000 5.373318 11.390629 5.373325 # buck6d->(c3_c1o2@co2)|CuPW + 247 1 5 -0.65000 6.440532 11.832394 4.841224 # buck6d->(o2_c1cu1@co2)|CuPW + 248 1 5 -0.65000 4.841360 -11.832387 6.440958 # buck6d->(o2_c1cu1@co2)|CuPW + 249 1 6 0.62000 5.373028 -11.390862 5.373563 # buck6d->(c3_c1o2@co2)|CuPW + 250 1 5 -0.65000 6.440253 -11.832658 4.841490 # buck6d->(o2_c1cu1@co2)|CuPW + 251 1 1 0.15000 -2.992926 8.511771 4.709197 # buck6d->(c3_c2h1@ph)|benzene + 252 1 2 -0.12000 -3.556843 7.945883 3.557300 # buck6d->(c3_c2h1@ph)|benzene + 253 1 1 0.15000 -4.708766 8.511148 2.992869 # buck6d->(c3_c2h1@ph)|benzene + 254 1 2 -0.12000 -5.274594 9.663071 3.556765 # buck6d->(c3_c2h1@ph)|benzene + 255 1 1 0.15000 -4.709267 10.227500 4.708672 # buck6d->(c3_c2h1@ph)|benzene + 256 1 2 -0.12000 -3.557372 9.663629 5.274532 # buck6d->(c3_c2h1@ph)|benzene + 257 1 3 0.12000 -3.109849 7.049988 3.110802 # buck6d->(h1_c1@ph)|benzene + 258 1 3 0.12000 -6.170479 10.109610 3.109791 # buck6d->(h1_c1@ph)|benzene + 259 1 3 0.12000 -3.110888 10.110587 6.170464 # buck6d->(h1_c1@ph)|benzene + 260 1 4 1.06000 -7.498966 0.000065 7.499083 # buck6d->(cu5_cu1o4@cu2)|CuPW + 261 1 4 1.06000 -5.721540 0.000055 5.721171 # buck6d->(cu5_cu1o4@cu2)|CuPW + 262 1 5 -0.65000 -6.780596 -1.387504 4.841296 # buck6d->(o2_c1cu1@co2)|CuPW + 263 1 6 0.62000 -7.847683 -1.829257 5.373354 # buck6d->(c3_c1o2@co2)|CuPW + 264 1 5 -0.65000 -8.379528 -1.387726 6.440789 # buck6d->(o2_c1cu1@co2)|CuPW + 265 1 5 -0.65000 -6.780057 1.387605 4.840649 # buck6d->(o2_c1cu1@co2)|CuPW + 266 1 6 0.62000 -7.847115 1.829369 5.372787 # buck6d->(c3_c1o2@co2)|CuPW + 267 1 5 -0.65000 -8.378881 1.387864 6.440254 # buck6d->(o2_c1cu1@co2)|CuPW + 268 1 5 -0.65000 -4.841088 -1.387887 6.779536 # buck6d->(o2_c1cu1@co2)|CuPW + 269 1 6 0.62000 -5.372790 -1.829430 7.846886 # buck6d->(c3_c1o2@co2)|CuPW + 270 1 5 -0.65000 -6.440014 -1.387659 8.379000 # buck6d->(o2_c1cu1@co2)|CuPW + 271 1 5 -0.65000 -4.841684 1.388065 6.779901 # buck6d->(o2_c1cu1@co2)|CuPW + 272 1 6 0.62000 -5.373317 1.829558 7.847292 # buck6d->(c3_c1o2@co2)|CuPW + 273 1 5 -0.65000 -6.440519 1.387801 8.379470 # buck6d->(o2_c1cu1@co2)|CuPW + 274 1 1 0.15000 -4.709142 -2.992974 -8.511608 # buck6d->(c3_c2h1@ph)|benzene + 275 1 2 -0.12000 -3.557176 -3.556874 -7.945827 # buck6d->(c3_c2h1@ph)|benzene + 276 1 1 0.15000 -2.992848 -4.708824 -8.511121 # buck6d->(c3_c2h1@ph)|benzene + 277 1 2 -0.12000 -3.556757 -5.274582 -9.663088 # buck6d->(c3_c2h1@ph)|benzene + 278 1 1 0.15000 -4.708656 -4.709208 -10.227517 # buck6d->(c3_c2h1@ph)|benzene + 279 1 2 -0.12000 -5.274438 -3.557307 -9.663551 # buck6d->(c3_c2h1@ph)|benzene + 280 1 3 0.12000 -3.110505 -3.109812 -7.050050 # buck6d->(h1_c1@ph)|benzene + 281 1 3 0.12000 -3.109781 -6.170435 -10.109684 # buck6d->(h1_c1@ph)|benzene + 282 1 3 0.12000 -6.170273 -3.110669 -10.110545 # buck6d->(h1_c1@ph)|benzene + 283 1 4 1.06000 -5.721424 -13.220256 -7.499080 # buck6d->(cu5_cu1o4@cu2)|CuPW + 284 1 4 1.06000 -7.498863 13.220549 -5.721174 # buck6d->(cu5_cu1o4@cu2)|CuPW + 285 1 5 -0.65000 -6.439959 11.833056 -4.840957 # buck6d->(o2_c1cu1@co2)|CuPW + 286 1 6 0.62000 -5.372908 11.391258 -5.373051 # buck6d->(c3_c1o2@co2)|CuPW + 287 1 5 -0.65000 -4.841086 11.832798 -6.440498 # buck6d->(o2_c1cu1@co2)|CuPW + 288 1 5 -0.65000 -6.440255 -11.832657 -4.840937 # buck6d->(o2_c1cu1@co2)|CuPW + 289 1 6 0.62000 -5.373196 -11.390940 -5.373036 # buck6d->(c3_c1o2@co2)|CuPW + 290 1 5 -0.65000 -4.841379 -11.832425 -6.440510 # buck6d->(o2_c1cu1@co2)|CuPW + 291 1 5 -0.65000 -8.379137 11.832590 -6.779659 # buck6d->(o2_c1cu1@co2)|CuPW + 292 1 6 0.62000 -7.847460 11.391067 -7.847019 # buck6d->(c3_c1o2@co2)|CuPW + 293 1 5 -0.65000 -6.780252 11.832858 -8.379163 # buck6d->(o2_c1cu1@co2)|CuPW + 294 1 5 -0.65000 -8.378797 -11.832267 -6.779822 # buck6d->(o2_c1cu1@co2)|CuPW + 295 1 6 0.62000 -7.847134 -11.390772 -7.847196 # buck6d->(c3_c1o2@co2)|CuPW + 296 1 5 -0.65000 -6.779924 -11.832507 -8.379363 # buck6d->(o2_c1cu1@co2)|CuPW + 297 1 4 1.06000 -0.000010 7.499438 -7.498626 # buck6d->(cu5_cu1o4@cu2)|CuPW + 298 1 4 1.06000 0.000010 5.721381 -5.721351 # buck6d->(cu5_cu1o4@cu2)|CuPW + 299 1 5 -0.65000 -1.387801 4.841250 -6.779912 # buck6d->(o2_c1cu1@co2)|CuPW + 300 1 6 0.62000 -1.829646 5.373411 -7.846952 # buck6d->(c3_c1o2@co2)|CuPW + 301 1 5 -0.65000 -1.388259 6.441006 -8.378542 # buck6d->(o2_c1cu1@co2)|CuPW + 302 1 5 -0.65000 1.387788 4.841580 -6.780471 # buck6d->(o2_c1cu1@co2)|CuPW + 303 1 6 0.62000 1.829665 5.373674 -7.847533 # buck6d->(c3_c1o2@co2)|CuPW + 304 1 5 -0.65000 1.388188 6.441224 -8.379182 # buck6d->(o2_c1cu1@co2)|CuPW + 305 1 5 -0.65000 -1.387766 6.780039 -4.841004 # buck6d->(o2_c1cu1@co2)|CuPW + 306 1 6 0.62000 -1.829202 7.847504 -5.372670 # buck6d->(c3_c1o2@co2)|CuPW + 307 1 5 -0.65000 -1.387295 8.379799 -6.439675 # buck6d->(o2_c1cu1@co2)|CuPW + 308 1 5 -0.65000 1.387775 6.779674 -4.840895 # buck6d->(o2_c1cu1@co2)|CuPW + 309 1 6 0.62000 1.829182 7.847134 -5.372619 # buck6d->(c3_c1o2@co2)|CuPW + 310 1 5 -0.65000 1.387369 8.379378 -6.439651 # buck6d->(o2_c1cu1@co2)|CuPW + 311 1 4 1.06000 -13.220410 -7.498949 -5.721227 # buck6d->(cu5_cu1o4@cu2)|CuPW + 312 1 4 1.06000 13.220309 -5.721668 -7.499283 # buck6d->(cu5_cu1o4@cu2)|CuPW + 313 1 5 -0.65000 -11.833003 -6.780528 -8.379427 # buck6d->(o2_c1cu1@co2)|CuPW + 314 1 6 0.62000 -11.391125 -7.847567 -7.847181 # buck6d->(c3_c1o2@co2)|CuPW + 315 1 5 -0.65000 -11.832518 -8.379221 -6.779694 # buck6d->(o2_c1cu1@co2)|CuPW + 316 1 5 -0.65000 11.832909 -6.780553 -8.379442 # buck6d->(o2_c1cu1@co2)|CuPW + 317 1 6 0.62000 11.391063 -7.847628 -7.847167 # buck6d->(c3_c1o2@co2)|CuPW + 318 1 5 -0.65000 11.832501 -8.379270 -6.779728 # buck6d->(o2_c1cu1@co2)|CuPW + 319 1 5 -0.65000 -11.832449 -4.841200 -6.440983 # buck6d->(o2_c1cu1@co2)|CuPW + 320 1 6 0.62000 -11.390961 -5.372861 -5.373458 # buck6d->(c3_c1o2@co2)|CuPW + 321 1 5 -0.65000 -11.832801 -6.439904 -4.841301 # buck6d->(o2_c1cu1@co2)|CuPW + 322 1 5 -0.65000 11.832196 -4.841640 -6.440822 # buck6d->(o2_c1cu1@co2)|CuPW + 323 1 6 0.62000 11.390813 -5.373270 -5.373232 # buck6d->(c3_c1o2@co2)|CuPW + 324 1 5 -0.65000 11.832670 -6.440280 -4.841060 # buck6d->(o2_c1cu1@co2)|CuPW + 325 1 4 1.06000 0.000030 -7.499270 7.498800 # buck6d->(cu5_cu1o4@cu2)|CuPW + 326 1 4 1.06000 -0.000028 -5.721208 5.721520 # buck6d->(cu5_cu1o4@cu2)|CuPW + 327 1 5 -0.65000 -1.387619 -4.841330 6.780412 # buck6d->(o2_c1cu1@co2)|CuPW + 328 1 6 0.62000 -1.829436 -5.373528 7.847480 # buck6d->(c3_c1o2@co2)|CuPW + 329 1 5 -0.65000 -1.388035 -6.441034 8.379128 # buck6d->(o2_c1cu1@co2)|CuPW + 330 1 5 -0.65000 1.387492 -4.840985 6.780379 # buck6d->(o2_c1cu1@co2)|CuPW + 331 1 6 0.62000 1.829389 -5.373244 7.847456 # buck6d->(c3_c1o2@co2)|CuPW + 332 1 5 -0.65000 1.387963 -6.440704 8.379062 # buck6d->(o2_c1cu1@co2)|CuPW + 333 1 5 -0.65000 -1.387919 -6.779725 4.841184 # buck6d->(o2_c1cu1@co2)|CuPW + 334 1 6 0.62000 -1.829339 -7.847253 5.372857 # buck6d->(c3_c1o2@co2)|CuPW + 335 1 5 -0.65000 -1.387437 -8.379461 6.439857 # buck6d->(o2_c1cu1@co2)|CuPW + 336 1 5 -0.65000 1.387970 -6.779478 4.841197 # buck6d->(o2_c1cu1@co2)|CuPW + 337 1 6 0.62000 1.829392 -7.847032 5.372900 # buck6d->(c3_c1o2@co2)|CuPW + 338 1 5 -0.65000 1.387598 -8.379192 6.439910 # buck6d->(o2_c1cu1@co2)|CuPW + 339 1 4 1.06000 13.220449 5.721503 7.499118 # buck6d->(cu5_cu1o4@cu2)|CuPW + 340 1 4 1.06000 -13.220348 7.498781 5.721059 # buck6d->(cu5_cu1o4@cu2)|CuPW + 341 1 5 -0.65000 -11.832864 6.439763 4.841039 # buck6d->(o2_c1cu1@co2)|CuPW + 342 1 6 0.62000 -11.391025 5.372737 5.373238 # buck6d->(c3_c1o2@co2)|CuPW + 343 1 5 -0.65000 -11.832477 4.841034 6.440735 # buck6d->(o2_c1cu1@co2)|CuPW + 344 1 5 -0.65000 11.833025 6.439854 4.840996 # buck6d->(o2_c1cu1@co2)|CuPW + 345 1 6 0.62000 11.391159 5.372844 5.373227 # buck6d->(c3_c1o2@co2)|CuPW + 346 1 5 -0.65000 11.832558 4.841161 6.440735 # buck6d->(o2_c1cu1@co2)|CuPW + 347 1 5 -0.65000 -11.832247 8.379174 6.779233 # buck6d->(o2_c1cu1@co2)|CuPW + 348 1 6 0.62000 -11.390851 7.847509 7.846762 # buck6d->(c3_c1o2@co2)|CuPW + 349 1 5 -0.65000 -11.832690 6.780445 8.378912 # buck6d->(o2_c1cu1@co2)|CuPW + 350 1 5 -0.65000 11.832371 8.379020 6.779574 # buck6d->(o2_c1cu1@co2)|CuPW + 351 1 6 0.62000 11.390927 7.847385 7.847114 # buck6d->(c3_c1o2@co2)|CuPW + 352 1 5 -0.65000 11.832813 6.780349 8.379283 # buck6d->(o2_c1cu1@co2)|CuPW + 353 1 1 0.15000 -10.227492 8.511619 8.511151 # buck6d->(c3_c2h1@ph)|benzene + 354 1 2 -0.12000 -9.663604 7.945829 9.663108 # buck6d->(c3_c2h1@ph)|benzene + 355 1 1 0.15000 -8.511709 8.511159 10.227540 # buck6d->(c3_c2h1@ph)|benzene + 356 1 2 -0.12000 -7.945900 9.663082 9.663594 # buck6d->(c3_c2h1@ph)|benzene + 357 1 1 0.15000 -8.511196 10.227457 8.511650 # buck6d->(c3_c2h1@ph)|benzene + 358 1 2 -0.12000 -9.663148 9.663574 7.945871 # buck6d->(c3_c2h1@ph)|benzene + 359 1 3 0.12000 -10.110612 7.049979 10.109690 # buck6d->(h1_c1@ph)|benzene + 360 1 3 0.12000 -7.050060 10.109680 10.110600 # buck6d->(h1_c1@ph)|benzene + 361 1 3 0.12000 -10.109816 10.110647 7.050096 # buck6d->(h1_c1@ph)|benzene + 362 1 1 0.15000 -10.227474 -4.708764 -4.709211 # buck6d->(c3_c2h1@ph)|benzene + 363 1 2 -0.12000 -9.663153 -3.556847 -5.274570 # buck6d->(c3_c2h1@ph)|benzene + 364 1 1 0.15000 -8.511250 -2.992887 -4.708810 # buck6d->(c3_c2h1@ph)|benzene + 365 1 2 -0.12000 -7.945794 -3.557149 -3.556888 # buck6d->(c3_c2h1@ph)|benzene + 366 1 1 0.15000 -8.511532 -4.709040 -2.992888 # buck6d->(c3_c2h1@ph)|benzene + 367 1 2 -0.12000 -9.663448 -5.274443 -3.557247 # buck6d->(c3_c2h1@ph)|benzene + 368 1 3 0.12000 -10.109784 -3.109891 -6.170431 # buck6d->(h1_c1@ph)|benzene + 369 1 3 0.12000 -7.049932 -3.110483 -3.109989 # buck6d->(h1_c1@ph)|benzene + 370 1 3 0.12000 -10.110364 -6.170308 -3.110621 # buck6d->(h1_c1@ph)|benzene + 371 1 1 0.15000 2.992750 8.511225 -4.708744 # buck6d->(c3_c2h1@ph)|benzene + 372 1 2 -0.12000 3.556734 9.663083 -5.274610 # buck6d->(c3_c2h1@ph)|benzene + 373 1 1 0.15000 4.708687 10.227423 -4.709301 # buck6d->(c3_c2h1@ph)|benzene + 374 1 2 -0.12000 5.274315 9.663417 -3.557309 # buck6d->(c3_c2h1@ph)|benzene + 375 1 1 0.15000 4.708996 8.511436 -2.992969 # buck6d->(c3_c2h1@ph)|benzene + 376 1 2 -0.12000 3.557062 7.945717 -3.556901 # buck6d->(c3_c2h1@ph)|benzene + 377 1 3 0.12000 3.109773 10.109633 -6.170499 # buck6d->(h1_c1@ph)|benzene + 378 1 3 0.12000 6.170080 10.110434 -3.110583 # buck6d->(h1_c1@ph)|benzene + 379 1 3 0.12000 3.110427 7.049830 -3.110006 # buck6d->(h1_c1@ph)|benzene + 380 1 1 0.15000 4.708882 -2.992819 8.511422 # buck6d->(c3_c2h1@ph)|benzene + 381 1 2 -0.12000 5.274592 -3.556944 9.663275 # buck6d->(c3_c2h1@ph)|benzene + 382 1 1 0.15000 4.709074 -4.708832 10.227451 # buck6d->(c3_c2h1@ph)|benzene + 383 1 2 -0.12000 3.557154 -5.274516 9.663398 # buck6d->(c3_c2h1@ph)|benzene + 384 1 1 0.15000 2.992933 -4.709046 8.511459 # buck6d->(c3_c2h1@ph)|benzene + 385 1 2 -0.12000 3.557040 -3.557138 7.945853 # buck6d->(c3_c2h1@ph)|benzene + 386 1 3 0.12000 6.170521 -3.110156 10.109929 # buck6d->(h1_c1@ph)|benzene + 387 1 3 0.12000 3.110442 -6.170369 10.110252 # buck6d->(h1_c1@ph)|benzene + 388 1 3 0.12000 3.110320 -3.110521 7.049872 # buck6d->(h1_c1@ph)|benzene + 389 1 4 1.06000 -5.721514 5.721203 -0.000136 # buck6d->(cu5_cu1o4@cu2)|CuPW + 390 1 4 1.06000 -7.498914 7.499138 -0.000087 # buck6d->(cu5_cu1o4@cu2)|CuPW + 391 1 5 -0.65000 -6.439861 8.378982 1.387531 # buck6d->(o2_c1cu1@co2)|CuPW + 392 1 6 0.62000 -5.372746 7.846892 1.829340 # buck6d->(c3_c1o2@co2)|CuPW + 393 1 5 -0.65000 -4.840981 6.779463 1.387834 # buck6d->(o2_c1cu1@co2)|CuPW + 394 1 5 -0.65000 -6.440386 8.379527 -1.387728 # buck6d->(o2_c1cu1@co2)|CuPW + 395 1 6 0.62000 -5.373303 7.847372 -1.829536 # buck6d->(c3_c1o2@co2)|CuPW + 396 1 5 -0.65000 -4.841590 6.779905 -1.388084 # buck6d->(o2_c1cu1@co2)|CuPW + 397 1 5 -0.65000 -8.379308 6.440683 1.387776 # buck6d->(o2_c1cu1@co2)|CuPW + 398 1 6 0.62000 -7.847549 5.373250 1.829282 # buck6d->(c3_c1o2@co2)|CuPW + 399 1 5 -0.65000 -6.780459 4.841131 1.387452 # buck6d->(o2_c1cu1@co2)|CuPW + 400 1 5 -0.65000 -8.379017 6.440635 -1.388074 # buck6d->(o2_c1cu1@co2)|CuPW + 401 1 6 0.62000 -7.847280 5.373165 -1.829540 # buck6d->(c3_c1o2@co2)|CuPW + 402 1 5 -0.65000 -6.780193 4.841036 -1.387769 # buck6d->(o2_c1cu1@co2)|CuPW + 403 1 4 1.06000 7.499192 5.721480 13.220423 # buck6d->(cu5_cu1o4@cu2)|CuPW + 404 1 4 1.06000 5.721037 7.498670 -13.220306 # buck6d->(cu5_cu1o4@cu2)|CuPW + 405 1 5 -0.65000 4.840494 6.440026 11.833091 # buck6d->(o2_c1cu1@co2)|CuPW + 406 1 6 0.62000 5.372850 5.373077 11.391171 # buck6d->(c3_c1o2@co2)|CuPW + 407 1 5 -0.65000 6.440405 4.841512 11.832556 # buck6d->(o2_c1cu1@co2)|CuPW + 408 1 5 -0.65000 4.841373 6.439463 -11.832893 # buck6d->(o2_c1cu1@co2)|CuPW + 409 1 6 0.62000 5.373628 5.372448 -11.391076 # buck6d->(c3_c1o2@co2)|CuPW + 410 1 5 -0.65000 6.441132 4.840775 -11.832494 # buck6d->(o2_c1cu1@co2)|CuPW + 411 1 5 -0.65000 6.779525 8.378728 11.832372 # buck6d->(o2_c1cu1@co2)|CuPW + 412 1 6 0.62000 7.847104 7.847192 11.390964 # buck6d->(c3_c1o2@co2)|CuPW + 413 1 5 -0.65000 8.379390 6.780194 11.832833 # buck6d->(o2_c1cu1@co2)|CuPW + 414 1 5 -0.65000 6.779236 8.379127 -11.832228 # buck6d->(o2_c1cu1@co2)|CuPW + 415 1 6 0.62000 7.846796 7.847532 -11.390822 # buck6d->(c3_c1o2@co2)|CuPW + 416 1 5 -0.65000 8.379012 6.780505 -11.832691 # buck6d->(o2_c1cu1@co2)|CuPW + 417 1 4 1.06000 5.721629 -5.721062 0.000180 # buck6d->(cu5_cu1o4@cu2)|CuPW + 418 1 4 1.06000 7.498938 -7.499088 0.000113 # buck6d->(cu5_cu1o4@cu2)|CuPW + 419 1 5 -0.65000 6.440437 -8.379354 1.387863 # buck6d->(o2_c1cu1@co2)|CuPW + 420 1 6 0.62000 5.373345 -7.847165 1.829657 # buck6d->(c3_c1o2@co2)|CuPW + 421 1 5 -0.65000 4.841735 -6.779644 1.388239 # buck6d->(o2_c1cu1@co2)|CuPW + 422 1 5 -0.65000 6.439901 -8.379075 -1.387532 # buck6d->(o2_c1cu1@co2)|CuPW + 423 1 6 0.62000 5.372808 -7.846935 -1.829371 # buck6d->(c3_c1o2@co2)|CuPW + 424 1 5 -0.65000 4.841162 -6.779443 -1.387859 # buck6d->(o2_c1cu1@co2)|CuPW + 425 1 5 -0.65000 8.379182 -6.440576 1.387981 # buck6d->(o2_c1cu1@co2)|CuPW + 426 1 6 0.62000 7.847505 -5.373107 1.829449 # buck6d->(c3_c1o2@co2)|CuPW + 427 1 5 -0.65000 6.780434 -4.840886 1.387680 # buck6d->(o2_c1cu1@co2)|CuPW + 428 1 5 -0.65000 8.379239 -6.440518 -1.387662 # buck6d->(o2_c1cu1@co2)|CuPW + 429 1 6 0.62000 7.847566 -5.373053 -1.829119 # buck6d->(c3_c1o2@co2)|CuPW + 430 1 5 -0.65000 6.780517 -4.840822 -1.387267 # buck6d->(o2_c1cu1@co2)|CuPW + 431 1 4 1.06000 -5.721481 -7.499133 -13.220518 # buck6d->(cu5_cu1o4@cu2)|CuPW + 432 1 4 1.06000 -7.498886 -5.721212 13.220327 # buck6d->(cu5_cu1o4@cu2)|CuPW + 433 1 5 -0.65000 -6.439843 -4.841307 -11.832829 # buck6d->(o2_c1cu1@co2)|CuPW + 434 1 6 0.62000 -5.372675 -5.373411 -11.391061 # buck6d->(c3_c1o2@co2)|CuPW + 435 1 5 -0.65000 -4.840940 -6.440799 -11.832612 # buck6d->(o2_c1cu1@co2)|CuPW + 436 1 5 -0.65000 -6.440426 -4.840729 11.832648 # buck6d->(o2_c1cu1@co2)|CuPW + 437 1 6 0.62000 -5.373254 -5.372925 11.390891 # buck6d->(c3_c1o2@co2)|CuPW + 438 1 5 -0.65000 -4.841595 -6.440313 11.832402 # buck6d->(o2_c1cu1@co2)|CuPW + 439 1 5 -0.65000 -8.379253 -6.779733 -11.832607 # buck6d->(o2_c1cu1@co2)|CuPW + 440 1 6 0.62000 -7.847514 -7.847150 -11.391064 # buck6d->(c3_c1o2@co2)|CuPW + 441 1 5 -0.65000 -6.780381 -8.379252 -11.832864 # buck6d->(o2_c1cu1@co2)|CuPW + 442 1 5 -0.65000 -8.378933 -6.779810 11.832354 # buck6d->(o2_c1cu1@co2)|CuPW + 443 1 6 0.62000 -7.847208 -7.847261 11.390834 # buck6d->(c3_c1o2@co2)|CuPW + 444 1 5 -0.65000 -6.780081 -8.379371 11.832560 # buck6d->(o2_c1cu1@co2)|CuPW + 445 1 1 0.15000 -10.227503 8.511331 -8.511515 # buck6d->(c3_c2h1@ph)|benzene + 446 1 2 -0.12000 -9.663471 9.663281 -7.945823 # buck6d->(c3_c2h1@ph)|benzene + 447 1 1 0.15000 -8.511527 10.227561 -8.511273 # buck6d->(c3_c2h1@ph)|benzene + 448 1 2 -0.12000 -7.945893 9.663485 -9.663176 # buck6d->(c3_c2h1@ph)|benzene + 449 1 1 0.15000 -8.511335 8.511544 -10.227437 # buck6d->(c3_c2h1@ph)|benzene + 450 1 2 -0.12000 -9.663267 7.945873 -9.663410 # buck6d->(c3_c2h1@ph)|benzene + 451 1 3 0.12000 -10.110353 10.109983 -7.049983 # buck6d->(h1_c1@ph)|benzene + 452 1 3 0.12000 -7.050025 10.110354 -10.109875 # buck6d->(h1_c1@ph)|benzene + 453 1 3 0.12000 -10.109984 7.050043 -10.110331 # buck6d->(h1_c1@ph)|benzene + 454 1 1 0.15000 -8.511137 -4.708656 2.992972 # buck6d->(c3_c2h1@ph)|benzene + 455 1 2 -0.12000 -9.663076 -5.274450 3.556858 # buck6d->(c3_c2h1@ph)|benzene + 456 1 1 0.15000 -10.227483 -4.709149 4.708774 # buck6d->(c3_c2h1@ph)|benzene + 457 1 2 -0.12000 -9.663548 -3.557234 5.274594 # buck6d->(c3_c2h1@ph)|benzene + 458 1 1 0.15000 -8.511671 -2.992819 4.709247 # buck6d->(c3_c2h1@ph)|benzene + 459 1 2 -0.12000 -7.945812 -3.556742 3.557346 # buck6d->(c3_c2h1@ph)|benzene + 460 1 3 0.12000 -10.109672 -6.170289 3.109845 # buck6d->(h1_c1@ph)|benzene + 461 1 3 0.12000 -10.110479 -3.110700 6.170510 # buck6d->(h1_c1@ph)|benzene + 462 1 3 0.12000 -7.049927 -3.109766 3.110806 # buck6d->(h1_c1@ph)|benzene + 463 1 1 0.15000 4.708798 8.511155 2.992854 # buck6d->(c3_c2h1@ph)|benzene + 464 1 2 -0.12000 3.556867 7.945676 3.557062 # buck6d->(c3_c2h1@ph)|benzene + 465 1 1 0.15000 2.992773 8.511412 4.708931 # buck6d->(c3_c2h1@ph)|benzene + 466 1 2 -0.12000 3.556995 9.663287 5.274489 # buck6d->(c3_c2h1@ph)|benzene + 467 1 1 0.15000 4.708997 10.227321 4.708944 # buck6d->(c3_c2h1@ph)|benzene + 468 1 2 -0.12000 5.274382 9.663112 3.556953 # buck6d->(c3_c2h1@ph)|benzene + 469 1 3 0.12000 3.110053 7.049770 3.110391 # buck6d->(h1_c1@ph)|benzene + 470 1 3 0.12000 3.110176 10.110166 6.170281 # buck6d->(h1_c1@ph)|benzene + 471 1 3 0.12000 6.170147 10.109901 3.109987 # buck6d->(h1_c1@ph)|benzene + 472 1 1 0.15000 4.709029 -2.992893 -8.511585 # buck6d->(c3_c2h1@ph)|benzene + 473 1 2 -0.12000 5.274703 -3.557035 -9.663444 # buck6d->(c3_c2h1@ph)|benzene + 474 1 1 0.15000 4.709105 -4.708875 -10.227633 # buck6d->(c3_c2h1@ph)|benzene + 475 1 2 -0.12000 3.557209 -5.274508 -9.663436 # buck6d->(c3_c2h1@ph)|benzene + 476 1 1 0.15000 2.993037 -4.709024 -8.511464 # buck6d->(c3_c2h1@ph)|benzene + 477 1 2 -0.12000 3.557149 -3.557068 -7.945966 # buck6d->(c3_c2h1@ph)|benzene + 478 1 3 0.12000 6.170693 -3.110358 -10.110101 # buck6d->(h1_c1@ph)|benzene + 479 1 3 0.12000 3.110500 -6.170392 -10.110228 # buck6d->(h1_c1@ph)|benzene + 480 1 3 0.12000 3.110370 -3.110237 -7.050128 # buck6d->(h1_c1@ph)|benzene + 481 1 1 0.15000 8.511679 -10.227580 8.511305 # buck6d->(c3_c2h1@ph)|benzene + 482 1 2 -0.12000 9.663502 -9.663155 7.945863 # buck6d->(c3_c2h1@ph)|benzene + 483 1 1 0.15000 10.227484 -8.511244 8.511629 # buck6d->(c3_c2h1@ph)|benzene + 484 1 2 -0.12000 9.663120 -7.945893 9.663552 # buck6d->(c3_c2h1@ph)|benzene + 485 1 1 0.15000 8.511133 -8.511584 10.227426 # buck6d->(c3_c2h1@ph)|benzene + 486 1 2 -0.12000 7.945810 -9.663557 9.663154 # buck6d->(c3_c2h1@ph)|benzene + 487 1 3 0.12000 10.110339 -10.109672 7.049889 # buck6d->(h1_c1@ph)|benzene + 488 1 3 0.12000 10.109816 -7.050112 10.110583 # buck6d->(h1_c1@ph)|benzene + 489 1 3 0.12000 7.049929 -10.110490 10.109737 # buck6d->(h1_c1@ph)|benzene + 490 1 1 0.15000 -4.709023 -8.511450 -2.992905 # buck6d->(c3_c2h1@ph)|benzene + 491 1 2 -0.12000 -5.274614 -9.663359 -3.557037 # buck6d->(c3_c2h1@ph)|benzene + 492 1 1 0.15000 -4.709029 -10.227503 -4.708971 # buck6d->(c3_c2h1@ph)|benzene + 493 1 2 -0.12000 -3.557127 -9.663456 -5.274583 # buck6d->(c3_c2h1@ph)|benzene + 494 1 1 0.15000 -2.992894 -8.511596 -4.709006 # buck6d->(c3_c2h1@ph)|benzene + 495 1 2 -0.12000 -3.557102 -7.945954 -3.557130 # buck6d->(c3_c2h1@ph)|benzene + 496 1 3 0.12000 -6.170479 -10.110118 -3.110248 # buck6d->(h1_c1@ph)|benzene + 497 1 3 0.12000 -3.110423 -10.110257 -6.170486 # buck6d->(h1_c1@ph)|benzene + 498 1 3 0.12000 -3.110358 -7.050008 -3.110481 # buck6d->(h1_c1@ph)|benzene + 499 1 1 0.15000 8.511258 4.708780 -2.992828 # buck6d->(c3_c2h1@ph)|benzene + 500 1 2 -0.12000 7.945892 3.556890 -3.557243 # buck6d->(c3_c2h1@ph)|benzene + 501 1 1 0.15000 8.511611 2.992972 -4.709205 # buck6d->(c3_c2h1@ph)|benzene + 502 1 2 -0.12000 9.663599 3.557404 -5.274419 # buck6d->(c3_c2h1@ph)|benzene + 503 1 1 0.15000 10.227505 4.709346 -4.708605 # buck6d->(c3_c2h1@ph)|benzene + 504 1 2 -0.12000 9.663136 5.274681 -3.556702 # buck6d->(c3_c2h1@ph)|benzene + 505 1 3 0.12000 7.050026 3.109925 -3.110642 # buck6d->(h1_c1@ph)|benzene + 506 1 3 0.12000 10.110685 3.110798 -6.170207 # buck6d->(h1_c1@ph)|benzene + 507 1 3 0.12000 10.109649 6.170567 -3.109688 # buck6d->(h1_c1@ph)|benzene + 508 1 1 0.15000 -2.992911 4.708913 8.511240 # buck6d->(c3_c2h1@ph)|benzene + 509 1 2 -0.12000 -3.556887 5.274570 9.663205 # buck6d->(c3_c2h1@ph)|benzene + 510 1 1 0.15000 -4.708782 4.709099 10.227544 # buck6d->(c3_c2h1@ph)|benzene + 511 1 2 -0.12000 -5.274472 3.557208 9.663457 # buck6d->(c3_c2h1@ph)|benzene + 512 1 1 0.15000 -4.709077 2.992940 8.511525 # buck6d->(c3_c2h1@ph)|benzene + 513 1 2 -0.12000 -3.557111 3.556937 7.945847 # buck6d->(c3_c2h1@ph)|benzene + 514 1 3 0.12000 -3.109988 6.170416 10.109898 # buck6d->(h1_c1@ph)|benzene + 515 1 3 0.12000 -6.170356 3.110557 10.110346 # buck6d->(h1_c1@ph)|benzene + 516 1 3 0.12000 -3.110329 3.109915 7.050112 # buck6d->(h1_c1@ph)|benzene + 517 1 1 0.15000 8.511448 -8.511329 -10.227492 # buck6d->(c3_c2h1@ph)|benzene + 518 1 2 -0.12000 9.663386 -7.945898 -9.663234 # buck6d->(c3_c2h1@ph)|benzene + 519 1 1 0.15000 10.227507 -8.511542 -8.511330 # buck6d->(c3_c2h1@ph)|benzene + 520 1 2 -0.12000 9.663309 -9.663427 -7.945774 # buck6d->(c3_c2h1@ph)|benzene + 521 1 1 0.15000 8.511470 -10.227501 -8.511487 # buck6d->(c3_c2h1@ph)|benzene + 522 1 2 -0.12000 7.945881 -9.663279 -9.663377 # buck6d->(c3_c2h1@ph)|benzene + 523 1 3 0.12000 10.110223 -7.050007 -10.109909 # buck6d->(h1_c1@ph)|benzene + 524 1 3 0.12000 10.109967 -10.110199 -7.049837 # buck6d->(h1_c1@ph)|benzene + 525 1 3 0.12000 7.049998 -10.110001 -10.110164 # buck6d->(h1_c1@ph)|benzene + 526 1 1 0.15000 -2.992912 -8.511380 4.708857 # buck6d->(c3_c2h1@ph)|benzene + 527 1 2 -0.12000 -3.556975 -9.663276 5.274577 # buck6d->(c3_c2h1@ph)|benzene + 528 1 1 0.15000 -4.708863 -10.227580 4.709107 # buck6d->(c3_c2h1@ph)|benzene + 529 1 2 -0.12000 -5.274601 -9.663549 3.557218 # buck6d->(c3_c2h1@ph)|benzene + 530 1 1 0.15000 -4.709178 -8.511611 2.992973 # buck6d->(c3_c2h1@ph)|benzene + 531 1 2 -0.12000 -3.557220 -7.945949 3.556960 # buck6d->(c3_c2h1@ph)|benzene + 532 1 3 0.12000 -3.110165 -10.109862 6.170526 # buck6d->(h1_c1@ph)|benzene + 533 1 3 0.12000 -6.170449 -10.110475 3.110554 # buck6d->(h1_c1@ph)|benzene + 534 1 3 0.12000 -3.110519 -7.050112 3.110049 # buck6d->(h1_c1@ph)|benzene + 535 1 1 0.15000 10.227608 4.708889 4.709090 # buck6d->(c3_c2h1@ph)|benzene + 536 1 2 -0.12000 9.663249 3.556998 5.274500 # buck6d->(c3_c2h1@ph)|benzene + 537 1 1 0.15000 8.511239 2.993082 4.708831 # buck6d->(c3_c2h1@ph)|benzene + 538 1 2 -0.12000 7.946003 3.557382 3.556831 # buck6d->(c3_c2h1@ph)|benzene + 539 1 1 0.15000 8.511804 4.709277 2.992826 # buck6d->(c3_c2h1@ph)|benzene + 540 1 2 -0.12000 9.663650 5.274722 3.557217 # buck6d->(c3_c2h1@ph)|benzene + 541 1 3 0.12000 10.109958 3.110026 6.170297 # buck6d->(h1_c1@ph)|benzene + 542 1 3 0.12000 7.050200 3.110743 3.109790 # buck6d->(h1_c1@ph)|benzene + 543 1 3 0.12000 10.110488 6.170709 3.110720 # buck6d->(h1_c1@ph)|benzene + 544 1 1 0.15000 -4.708901 4.708949 -10.227450 # buck6d->(c3_c2h1@ph)|benzene + 545 1 2 -0.12000 -3.556979 5.274522 -9.663292 # buck6d->(c3_c2h1@ph)|benzene + 546 1 1 0.15000 -2.992919 4.709034 -8.511308 # buck6d->(c3_c2h1@ph)|benzene + 547 1 2 -0.12000 -3.557045 3.557023 -7.945834 # buck6d->(c3_c2h1@ph)|benzene + 548 1 1 0.15000 -4.708978 2.992831 -8.511424 # buck6d->(c3_c2h1@ph)|benzene + 549 1 2 -0.12000 -5.274494 3.557022 -9.663325 # buck6d->(c3_c2h1@ph)|benzene + 550 1 3 0.12000 -3.110088 6.170273 -10.110190 # buck6d->(h1_c1@ph)|benzene + 551 1 3 0.12000 -3.110234 3.110172 -7.050031 # buck6d->(h1_c1@ph)|benzene + 552 1 3 0.12000 -6.170354 3.110243 -10.110132 # buck6d->(h1_c1@ph)|benzene + 553 1 1 0.15000 -8.511582 -8.511282 -10.227503 # buck6d->(c3_c2h1@ph)|benzene + 554 1 2 -0.12000 -7.945951 -9.663204 -9.663400 # buck6d->(c3_c2h1@ph)|benzene + 555 1 1 0.15000 -8.511367 -10.227417 -8.511453 # buck6d->(c3_c2h1@ph)|benzene + 556 1 2 -0.12000 -9.663341 -9.663429 -7.945813 # buck6d->(c3_c2h1@ph)|benzene + 557 1 1 0.15000 -10.227575 -8.511535 -8.511330 # buck6d->(c3_c2h1@ph)|benzene + 558 1 2 -0.12000 -9.663487 -7.945814 -9.663204 # buck6d->(c3_c2h1@ph)|benzene + 559 1 3 0.12000 -7.050112 -10.109934 -10.110289 # buck6d->(h1_c1@ph)|benzene + 560 1 3 0.12000 -10.110082 -10.110336 -7.049997 # buck6d->(h1_c1@ph)|benzene + 561 1 3 0.12000 -10.110290 -7.049881 -10.109826 # buck6d->(h1_c1@ph)|benzene + 562 1 1 0.15000 -8.511552 4.709117 2.992867 # buck6d->(c3_c2h1@ph)|benzene + 563 1 2 -0.12000 -9.663456 5.274515 3.557199 # buck6d->(c3_c2h1@ph)|benzene + 564 1 1 0.15000 -10.227472 4.708760 4.709113 # buck6d->(c3_c2h1@ph)|benzene + 565 1 2 -0.12000 -9.663159 3.556876 5.274549 # buck6d->(c3_c2h1@ph)|benzene + 566 1 1 0.15000 -8.511271 2.992898 4.708810 # buck6d->(c3_c2h1@ph)|benzene + 567 1 2 -0.12000 -7.945824 3.557215 3.556894 # buck6d->(c3_c2h1@ph)|benzene + 568 1 3 0.12000 -10.110344 6.170412 3.110599 # buck6d->(h1_c1@ph)|benzene + 569 1 3 0.12000 -10.109768 3.109969 6.170443 # buck6d->(h1_c1@ph)|benzene + 570 1 3 0.12000 -7.049905 3.110624 3.110041 # buck6d->(h1_c1@ph)|benzene + 571 1 1 0.15000 2.992821 -8.511249 4.708791 # buck6d->(c3_c2h1@ph)|benzene + 572 1 2 -0.12000 3.557063 -7.945779 3.556914 # buck6d->(c3_c2h1@ph)|benzene + 573 1 1 0.15000 4.709026 -8.511430 2.992956 # buck6d->(c3_c2h1@ph)|benzene + 574 1 2 -0.12000 5.274426 -9.663408 3.557214 # buck6d->(c3_c2h1@ph)|benzene + 575 1 1 0.15000 4.708832 -10.227459 4.709167 # buck6d->(c3_c2h1@ph)|benzene + 576 1 2 -0.12000 3.556850 -9.663183 5.274534 # buck6d->(c3_c2h1@ph)|benzene + 577 1 3 0.12000 3.110318 -7.049975 3.109954 # buck6d->(h1_c1@ph)|benzene + 578 1 3 0.12000 6.170202 -10.110358 3.110429 # buck6d->(h1_c1@ph)|benzene + 579 1 3 0.12000 3.109890 -10.109872 6.170342 # buck6d->(h1_c1@ph)|benzene + 580 1 1 0.15000 4.709421 4.708545 -10.227566 # buck6d->(c3_c2h1@ph)|benzene + 581 1 2 -0.12000 3.557498 5.274423 -9.663687 # buck6d->(c3_c2h1@ph)|benzene + 582 1 1 0.15000 2.993081 4.709264 -8.511704 # buck6d->(c3_c2h1@ph)|benzene + 583 1 2 -0.12000 3.556971 3.557262 -7.945974 # buck6d->(c3_c2h1@ph)|benzene + 584 1 1 0.15000 4.708834 2.992776 -8.511350 # buck6d->(c3_c2h1@ph)|benzene + 585 1 2 -0.12000 5.274785 3.556684 -9.663172 # buck6d->(c3_c2h1@ph)|benzene + 586 1 3 0.12000 3.110945 6.170220 -10.110820 # buck6d->(h1_c1@ph)|benzene + 587 1 3 0.12000 3.110012 3.110676 -7.050112 # buck6d->(h1_c1@ph)|benzene + 588 1 3 0.12000 6.170787 3.109798 -10.109598 # buck6d->(h1_c1@ph)|benzene + 589 1 1 0.15000 -8.511446 -8.511431 10.227428 # buck6d->(c3_c2h1@ph)|benzene + 590 1 2 -0.12000 -7.945961 -9.663387 9.663227 # buck6d->(c3_c2h1@ph)|benzene + 591 1 1 0.15000 -8.511558 -10.227488 8.511293 # buck6d->(c3_c2h1@ph)|benzene + 592 1 2 -0.12000 -9.663484 -9.663246 7.945824 # buck6d->(c3_c2h1@ph)|benzene + 593 1 1 0.15000 -10.227567 -8.511318 8.511466 # buck6d->(c3_c2h1@ph)|benzene + 594 1 2 -0.12000 -9.663367 -7.945805 9.663378 # buck6d->(c3_c2h1@ph)|benzene + 595 1 3 0.12000 -7.050151 -10.110286 10.109983 # buck6d->(h1_c1@ph)|benzene + 596 1 3 0.12000 -10.110344 -10.109936 7.049952 # buck6d->(h1_c1@ph)|benzene + 597 1 3 0.12000 -10.110136 -7.049977 10.110250 # buck6d->(h1_c1@ph)|benzene + 598 1 1 0.15000 -10.227461 4.708876 -4.709049 # buck6d->(c3_c2h1@ph)|benzene + 599 1 2 -0.12000 -9.663222 3.556970 -5.274564 # buck6d->(c3_c2h1@ph)|benzene + 600 1 1 0.15000 -8.511366 2.992789 -4.708915 # buck6d->(c3_c2h1@ph)|benzene + 601 1 2 -0.12000 -7.945800 3.557031 -3.557029 # buck6d->(c3_c2h1@ph)|benzene + 602 1 1 0.15000 -8.511428 4.708966 -2.992963 # buck6d->(c3_c2h1@ph)|benzene + 603 1 2 -0.12000 -9.663360 5.274470 -3.557110 # buck6d->(c3_c2h1@ph)|benzene + 604 1 3 0.12000 -10.109855 3.110235 -6.170533 # buck6d->(h1_c1@ph)|benzene + 605 1 3 0.12000 -7.049905 3.110310 -3.110259 # buck6d->(h1_c1@ph)|benzene + 606 1 3 0.12000 -10.110239 6.170270 -3.110307 # buck6d->(h1_c1@ph)|benzene + 607 1 1 0.15000 4.708720 -8.511190 -2.992896 # buck6d->(c3_c2h1@ph)|benzene + 608 1 2 -0.12000 5.274366 -9.663136 -3.556992 # buck6d->(c3_c2h1@ph)|benzene + 609 1 1 0.15000 4.709030 -10.227389 -4.709003 # buck6d->(c3_c2h1@ph)|benzene + 610 1 2 -0.12000 3.557043 -9.663451 -5.274617 # buck6d->(c3_c2h1@ph)|benzene + 611 1 1 0.15000 2.992800 -8.511566 -4.709105 # buck6d->(c3_c2h1@ph)|benzene + 612 1 2 -0.12000 3.556811 -7.945789 -3.557218 # buck6d->(c3_c2h1@ph)|benzene + 613 1 3 0.12000 6.170145 -10.109882 -3.110023 # buck6d->(h1_c1@ph)|benzene + 614 1 3 0.12000 3.110259 -10.110395 -6.170399 # buck6d->(h1_c1@ph)|benzene + 615 1 3 0.12000 3.109923 -7.049884 -3.110617 # buck6d->(h1_c1@ph)|benzene + 616 1 1 0.15000 2.992974 4.708806 8.511215 # buck6d->(c3_c2h1@ph)|benzene + 617 1 2 -0.12000 3.557316 3.556866 7.945895 # buck6d->(c3_c2h1@ph)|benzene + 618 1 1 0.15000 4.709193 2.992885 8.511718 # buck6d->(c3_c2h1@ph)|benzene + 619 1 2 -0.12000 5.274668 3.557179 9.663585 # buck6d->(c3_c2h1@ph)|benzene + 620 1 1 0.15000 4.708875 4.709040 10.227563 # buck6d->(c3_c2h1@ph)|benzene + 621 1 2 -0.12000 3.556982 5.274471 9.663177 # buck6d->(c3_c2h1@ph)|benzene + 622 1 3 0.12000 3.110737 3.109918 7.050015 # buck6d->(h1_c1@ph)|benzene + 623 1 3 0.12000 6.170608 3.110615 10.110446 # buck6d->(h1_c1@ph)|benzene + 624 1 3 0.12000 3.110106 6.170366 10.109792 # buck6d->(h1_c1@ph)|benzene + +Bonds + + 1 1 1 2 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2 1 1 6 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 3 2 1 240 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 4 1 2 3 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 5 3 2 7 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 6 1 3 4 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 7 2 3 351 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 8 1 4 5 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 9 3 4 8 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 10 1 5 6 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 11 2 5 412 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 12 3 6 9 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 13 4 10 11 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 14 5 10 14 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 15 5 10 17 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 16 5 10 20 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 17 5 10 23 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 18 5 11 12 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 19 5 11 15 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 20 5 11 18 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 21 5 11 21 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 22 6 12 13 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 23 6 13 14 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 24 2 13 380 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 25 6 15 16 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 26 6 16 17 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 27 2 16 618 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 28 6 18 19 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 29 6 19 20 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 30 2 19 230 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 31 6 21 22 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 32 6 22 23 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 33 2 22 537 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 34 1 24 25 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 35 1 24 29 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 36 2 24 217 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 37 1 25 26 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 38 3 25 30 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 39 1 26 27 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 40 2 26 323 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 41 1 27 28 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 42 3 27 31 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 43 1 28 29 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 44 2 28 429 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 45 3 29 32 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 46 4 33 34 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 47 5 33 37 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 48 5 33 40 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 49 5 33 43 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 50 5 33 46 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 51 5 34 35 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 52 5 34 38 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 53 5 34 41 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 54 5 34 44 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 55 6 35 36 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 56 6 36 37 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 57 2 36 521 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 58 6 38 39 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 59 6 39 40 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 60 2 39 207 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 61 6 41 42 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 62 6 42 43 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 63 2 42 609 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 64 6 44 45 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 65 6 45 46 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 66 2 45 373 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 67 1 47 48 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 68 1 47 52 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 69 2 47 306 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 70 1 48 49 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 71 3 48 53 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 72 1 49 50 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 73 2 49 286 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 74 1 50 51 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 75 3 50 54 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 76 1 51 52 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 77 2 51 395 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 78 3 52 55 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 79 4 56 57 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 80 5 56 60 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 81 5 56 63 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 82 5 56 66 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 83 5 56 69 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 84 5 57 58 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 85 5 57 61 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 86 5 57 64 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 87 5 57 67 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 88 6 58 59 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 89 6 59 60 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 90 2 59 274 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 91 6 61 62 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 92 6 62 63 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 93 2 62 548 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 94 6 64 65 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 95 6 65 66 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 96 2 65 364 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 97 6 67 68 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 98 6 68 69 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 99 2 68 600 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 100 1 70 71 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 101 1 70 75 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 102 2 70 328 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 103 1 71 72 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 104 3 71 76 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 105 1 72 73 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 106 2 72 269 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 107 1 73 74 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 108 3 73 77 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 109 1 74 75 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 110 2 74 437 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 111 3 75 78 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 112 4 79 80 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 113 5 79 83 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 114 5 79 86 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 115 5 79 89 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 116 5 79 92 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 117 5 80 81 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 118 5 80 84 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 119 5 80 87 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 120 5 80 90 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 121 6 81 82 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 122 6 82 83 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 123 2 82 255 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 124 6 84 85 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 125 6 85 86 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 126 2 85 528 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 127 6 87 88 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 128 6 88 89 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 129 2 88 357 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 130 6 90 91 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 131 6 91 92 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 132 2 91 591 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 133 4 93 94 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 134 5 93 97 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 135 5 93 100 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 136 5 93 103 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 137 5 93 106 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 138 5 94 95 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 139 5 94 98 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 140 5 94 101 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 141 5 94 104 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 142 6 95 96 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 143 6 96 97 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 144 2 96 499 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 145 6 98 99 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 146 6 99 100 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 147 2 99 539 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 148 6 101 102 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 149 6 102 103 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 150 2 102 375 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 151 6 104 105 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 152 6 105 106 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 153 2 105 463 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 154 4 107 108 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 155 5 107 111 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 156 5 107 114 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 157 5 107 117 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 158 5 107 120 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 159 5 108 109 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 160 5 108 112 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 161 5 108 115 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 162 5 108 118 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 163 6 109 110 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 164 6 110 111 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 165 2 110 508 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 166 6 112 113 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 167 6 113 114 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 168 2 113 616 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 169 6 115 116 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 170 6 116 117 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 171 2 116 251 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 172 6 118 119 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 173 6 119 120 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 174 2 119 465 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 175 4 121 122 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 176 5 121 125 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 177 5 121 128 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 178 5 121 131 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 179 5 121 134 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 180 5 122 123 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 181 5 122 126 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 182 5 122 129 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 183 5 122 132 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 184 6 123 124 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 185 6 124 125 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 186 2 124 510 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 187 6 126 127 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 188 6 127 128 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 189 2 127 544 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 190 6 129 130 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 191 6 130 131 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 192 2 130 355 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 193 6 132 133 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 194 6 133 134 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 195 2 133 449 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 196 4 135 136 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 197 5 135 139 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 198 5 135 142 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 199 5 135 145 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 200 5 135 148 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 201 5 136 137 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 202 5 136 140 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 203 5 136 143 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 204 5 136 146 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 205 6 137 138 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 206 6 138 139 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 207 2 138 456 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 208 6 140 141 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 209 6 141 142 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 210 2 141 228 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 211 6 143 144 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 212 6 144 145 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 213 2 144 593 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 214 6 146 147 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 215 6 147 148 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 216 2 147 483 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 217 4 149 150 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 218 5 149 153 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 219 5 149 156 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 220 5 149 159 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 221 5 149 162 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 222 5 150 151 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 223 5 150 154 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 224 5 150 157 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 225 5 150 160 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 226 6 151 152 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 227 6 152 153 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 228 2 152 454 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 229 6 154 155 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 230 6 155 156 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 231 2 155 366 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 232 6 157 158 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 233 6 158 159 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 234 2 158 530 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 235 6 160 161 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 236 6 161 162 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 237 2 161 490 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 238 4 163 164 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 239 5 163 167 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 240 5 163 170 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 241 5 163 173 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 242 5 163 176 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 243 5 164 165 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 244 5 164 168 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 245 5 164 171 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 246 5 164 174 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 247 6 165 166 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 248 6 166 167 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 249 2 166 494 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 250 6 168 169 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 251 6 169 170 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 252 2 169 611 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 253 6 171 172 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 254 6 172 173 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 255 2 172 276 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 256 6 174 175 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 257 6 175 176 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 258 2 175 476 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 259 4 177 178 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 260 5 177 181 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 261 5 177 184 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 262 5 177 187 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 263 5 177 190 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 264 5 178 179 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 265 5 178 182 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 266 5 178 185 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 267 5 178 188 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 268 6 179 180 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 269 6 180 181 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 270 2 180 517 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 271 6 182 183 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 272 6 183 184 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 273 2 183 485 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 274 6 185 186 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 275 6 186 187 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 276 2 186 474 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 277 6 188 189 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 278 6 189 190 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 279 2 189 382 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 280 4 191 192 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 281 5 191 195 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 282 5 191 198 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 283 5 191 201 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 284 5 191 204 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 285 5 192 193 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 286 5 192 196 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 287 5 192 199 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 288 5 192 202 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 289 6 193 194 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 290 6 194 195 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 291 2 194 445 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 292 6 196 197 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 293 6 197 198 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 294 2 197 205 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 295 6 199 200 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 296 6 200 201 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 297 2 200 598 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 298 6 202 203 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 299 6 203 204 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 300 2 203 503 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 301 1 205 206 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 302 1 205 210 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 303 1 206 207 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 304 3 206 211 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 305 1 207 208 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 306 1 208 209 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 307 3 208 212 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 308 1 209 210 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 309 2 209 415 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 310 3 210 213 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 311 4 214 215 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 312 5 214 218 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 313 5 214 221 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 314 5 214 224 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 315 5 214 227 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 316 5 215 216 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 317 5 215 219 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 318 5 215 222 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 319 5 215 225 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 320 6 216 217 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 321 6 217 218 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 322 6 219 220 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 323 6 220 221 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 324 2 220 501 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 325 6 222 223 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 326 6 223 224 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 327 2 223 472 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 328 6 225 226 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 329 6 226 227 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 330 2 226 584 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 331 1 228 229 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 332 1 228 233 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 333 1 229 230 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 334 3 229 234 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 335 1 230 231 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 336 1 231 232 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 337 3 231 235 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 338 1 232 233 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 339 2 232 426 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 340 3 233 236 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 341 4 237 238 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 342 5 237 241 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 343 5 237 244 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 344 5 237 247 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 345 5 237 250 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 346 5 238 239 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 347 5 238 242 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 348 5 238 245 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 349 5 238 248 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 350 6 239 240 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 351 6 240 241 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 352 6 242 243 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 353 6 243 244 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 354 2 243 481 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 355 6 245 246 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 356 6 246 247 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 357 2 246 467 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 358 6 248 249 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 359 6 249 250 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 360 2 249 575 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 361 1 251 252 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 362 1 251 256 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 363 1 252 253 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 364 3 252 257 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 365 1 253 254 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 366 2 253 392 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 367 1 254 255 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 368 3 254 258 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 369 1 255 256 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 370 3 256 259 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 371 4 260 261 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 372 5 260 264 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 373 5 260 267 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 374 5 260 270 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 375 5 260 273 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 376 5 261 262 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 377 5 261 265 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 378 5 261 268 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 379 5 261 271 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 380 6 262 263 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 381 6 263 264 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 382 2 263 458 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 383 6 265 266 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 384 6 266 267 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 385 2 266 566 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 386 6 268 269 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 387 6 269 270 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 388 6 271 272 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 389 6 272 273 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 390 2 272 512 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 391 1 274 275 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 392 1 274 279 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 393 1 275 276 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 394 3 275 280 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 395 1 276 277 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 396 1 277 278 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 397 3 277 281 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 398 1 278 279 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 399 2 278 434 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 400 3 279 282 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 401 4 283 284 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 402 5 283 287 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 403 5 283 290 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 404 5 283 293 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 405 5 283 296 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 406 5 284 285 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 407 5 284 288 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 408 5 284 291 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 409 5 284 294 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 410 6 285 286 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 411 6 286 287 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 412 6 288 289 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 413 6 289 290 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 414 2 289 492 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 415 6 291 292 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 416 6 292 293 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 417 2 292 447 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 418 6 294 295 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 419 6 295 296 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 420 2 295 555 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 421 4 297 298 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 422 5 297 301 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 423 5 297 304 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 424 5 297 307 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 425 5 297 310 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 426 5 298 299 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 427 5 298 302 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 428 5 298 305 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 429 5 298 308 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 430 6 299 300 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 431 6 300 301 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 432 2 300 546 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 433 6 302 303 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 434 6 303 304 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 435 2 303 582 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 436 6 305 306 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 437 6 306 307 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 438 6 308 309 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 439 6 309 310 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 440 2 309 371 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 441 4 311 312 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 442 5 311 315 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 443 5 311 318 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 444 5 311 321 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 445 5 311 324 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 446 5 312 313 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 447 5 312 316 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 448 5 312 319 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 449 5 312 322 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 450 6 313 314 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 451 6 314 315 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 452 2 314 557 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 453 6 316 317 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 454 6 317 318 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 455 2 317 519 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 456 6 319 320 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 457 6 320 321 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 458 2 320 362 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 459 6 322 323 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 460 6 323 324 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 461 4 325 326 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 462 5 325 329 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 463 5 325 332 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 464 5 325 335 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 465 5 325 338 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 466 5 326 327 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 467 5 326 330 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 468 5 326 333 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 469 5 326 336 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 470 6 327 328 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 471 6 328 329 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 472 6 330 331 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 473 6 331 332 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 474 2 331 384 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 475 6 333 334 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 476 6 334 335 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 477 2 334 526 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 478 6 336 337 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 479 6 337 338 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 480 2 337 571 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 481 4 339 340 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 482 5 339 343 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 483 5 339 346 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 484 5 339 349 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 485 5 339 352 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 486 5 340 341 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 487 5 340 344 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 488 5 340 347 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 489 5 340 350 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 490 6 341 342 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 491 6 342 343 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 492 2 342 564 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 493 6 344 345 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 494 6 345 346 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 495 2 345 535 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 496 6 347 348 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 497 6 348 349 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 498 2 348 353 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 499 6 350 351 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 500 6 351 352 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 501 1 353 354 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 502 1 353 358 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 503 1 354 355 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 504 3 354 359 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 505 1 355 356 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 506 1 356 357 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 507 3 356 360 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 508 1 357 358 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 509 3 358 361 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 510 1 362 363 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 511 1 362 367 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 512 1 363 364 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 513 3 363 368 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 514 1 364 365 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 515 1 365 366 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 516 3 365 369 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 517 1 366 367 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 518 3 367 370 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 519 1 371 372 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 520 1 371 376 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 521 1 372 373 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 522 3 372 377 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 523 1 373 374 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 524 1 374 375 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 525 3 374 378 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 526 1 375 376 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 527 3 376 379 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 528 1 380 381 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 529 1 380 385 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 530 1 381 382 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 531 3 381 386 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 532 1 382 383 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 533 1 383 384 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 534 3 383 387 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 535 1 384 385 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 536 3 385 388 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 537 4 389 390 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 538 5 389 393 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 539 5 389 396 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 540 5 389 399 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 541 5 389 402 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 542 5 390 391 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 543 5 390 394 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 544 5 390 397 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 545 5 390 400 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 546 6 391 392 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 547 6 392 393 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 548 6 394 395 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 549 6 395 396 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 550 6 397 398 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 551 6 398 399 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 552 2 398 562 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 553 6 400 401 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 554 6 401 402 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 555 2 401 602 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 556 4 403 404 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 557 5 403 407 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 558 5 403 410 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 559 5 403 413 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 560 5 403 416 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 561 5 404 405 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 562 5 404 408 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 563 5 404 411 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 564 5 404 414 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 565 6 405 406 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 566 6 406 407 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 567 2 406 620 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 568 6 408 409 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 569 6 409 410 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 570 2 409 580 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 571 6 411 412 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 572 6 412 413 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 573 6 414 415 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 574 6 415 416 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 575 4 417 418 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 576 5 417 421 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 577 5 417 424 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 578 5 417 427 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 579 5 417 430 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 580 5 418 419 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 581 5 418 422 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 582 5 418 425 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 583 5 418 428 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 584 6 419 420 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 585 6 420 421 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 586 2 420 573 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 587 6 422 423 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 588 6 423 424 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 589 2 423 607 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 590 6 425 426 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 591 6 426 427 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 592 6 428 429 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 593 6 429 430 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 594 4 431 432 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW',) + 595 5 431 435 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 596 5 431 438 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 597 5 431 441 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 598 5 431 444 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 599 5 432 433 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 600 5 432 436 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 601 5 432 439 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 602 5 432 442 # ('morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 603 6 433 434 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 604 6 434 435 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 605 6 436 437 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 606 6 437 438 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 607 6 439 440 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 608 6 440 441 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 609 2 440 553 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 610 6 442 443 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 611 6 443 444 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 612 2 443 589 # ('mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW',) + 613 1 445 446 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 614 1 445 450 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 615 1 446 447 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 616 3 446 451 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 617 1 447 448 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 618 1 448 449 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 619 3 448 452 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 620 1 449 450 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 621 3 450 453 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 622 1 454 455 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 623 1 454 459 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 624 1 455 456 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 625 3 455 460 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 626 1 456 457 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 627 1 457 458 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 628 3 457 461 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 629 1 458 459 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 630 3 459 462 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 631 1 463 464 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 632 1 463 468 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 633 1 464 465 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 634 3 464 469 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 635 1 465 466 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 636 1 466 467 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 637 3 466 470 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 638 1 467 468 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 639 3 468 471 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 640 1 472 473 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 641 1 472 477 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 642 1 473 474 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 643 3 473 478 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 644 1 474 475 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 645 1 475 476 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 646 3 475 479 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 647 1 476 477 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 648 3 477 480 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 649 1 481 482 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 650 1 481 486 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 651 1 482 483 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 652 3 482 487 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 653 1 483 484 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 654 1 484 485 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 655 3 484 488 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 656 1 485 486 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 657 3 486 489 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 658 1 490 491 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 659 1 490 495 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 660 1 491 492 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 661 3 491 496 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 662 1 492 493 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 663 1 493 494 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 664 3 493 497 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 665 1 494 495 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 666 3 495 498 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 667 1 499 500 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 668 1 499 504 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 669 1 500 501 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 670 3 500 505 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 671 1 501 502 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 672 1 502 503 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 673 3 502 506 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 674 1 503 504 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 675 3 504 507 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 676 1 508 509 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 677 1 508 513 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 678 1 509 510 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 679 3 509 514 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 680 1 510 511 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 681 1 511 512 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 682 3 511 515 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 683 1 512 513 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 684 3 513 516 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 685 1 517 518 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 686 1 517 522 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 687 1 518 519 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 688 3 518 523 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 689 1 519 520 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 690 1 520 521 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 691 3 520 524 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 692 1 521 522 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 693 3 522 525 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 694 1 526 527 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 695 1 526 531 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 696 1 527 528 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 697 3 527 532 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 698 1 528 529 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 699 1 529 530 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 700 3 529 533 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 701 1 530 531 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 702 3 531 534 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 703 1 535 536 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 704 1 535 540 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 705 1 536 537 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 706 3 536 541 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 707 1 537 538 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 708 1 538 539 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 709 3 538 542 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 710 1 539 540 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 711 3 540 543 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 712 1 544 545 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 713 1 544 549 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 714 1 545 546 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 715 3 545 550 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 716 1 546 547 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 717 1 547 548 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 718 3 547 551 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 719 1 548 549 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 720 3 549 552 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 721 1 553 554 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 722 1 553 558 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 723 1 554 555 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 724 3 554 559 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 725 1 555 556 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 726 1 556 557 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 727 3 556 560 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 728 1 557 558 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 729 3 558 561 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 730 1 562 563 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 731 1 562 567 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 732 1 563 564 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 733 3 563 568 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 734 1 564 565 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 735 1 565 566 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 736 3 565 569 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 737 1 566 567 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 738 3 567 570 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 739 1 571 572 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 740 1 571 576 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 741 1 572 573 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 742 3 572 577 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 743 1 573 574 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 744 1 574 575 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 745 3 574 578 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 746 1 575 576 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 747 3 576 579 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 748 1 580 581 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 749 1 580 585 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 750 1 581 582 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 751 3 581 586 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 752 1 582 583 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 753 1 583 584 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 754 3 583 587 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 755 1 584 585 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 756 3 585 588 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 757 1 589 590 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 758 1 589 594 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 759 1 590 591 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 760 3 590 595 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 761 1 591 592 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 762 1 592 593 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 763 3 592 596 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 764 1 593 594 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 765 3 594 597 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 766 1 598 599 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 767 1 598 603 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 768 1 599 600 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 769 3 599 604 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 770 1 600 601 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 771 1 601 602 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 772 3 601 605 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 773 1 602 603 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 774 3 603 606 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 775 1 607 608 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 776 1 607 612 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 777 1 608 609 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 778 3 608 613 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 779 1 609 610 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 780 1 610 611 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 781 3 610 614 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 782 1 611 612 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 783 3 612 615 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 784 1 616 617 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 785 1 616 621 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 786 1 617 618 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 787 3 617 622 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 788 1 618 619 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 789 1 619 620 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 790 3 619 623 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + 791 1 620 621 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 792 3 621 624 # ('mm3->(c3_c2h1@ph,h1_c1@ph)|benzene',) + +Angles + + 1 1 2 1 6 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 2 2 240 1 2 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 3 2 240 1 6 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 4 1 1 2 3 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 5 3 1 2 7 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 6 3 3 2 7 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 7 1 2 3 4 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 8 2 351 3 2 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 9 2 351 3 4 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 10 1 3 4 5 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 11 3 3 4 8 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 12 3 5 4 8 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 13 1 4 5 6 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 14 2 412 5 4 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 15 2 412 5 6 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 16 1 1 6 5 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 17 3 1 6 9 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 18 3 5 6 9 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 19 4 11 10 14 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 20 4 11 10 17 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 21 4 11 10 20 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 22 4 11 10 23 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 23 5 14 10 17 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 24 5 14 10 20 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 25 5 14 10 23 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 26 5 17 10 20 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 27 5 17 10 23 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 28 5 20 10 23 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 29 4 10 11 12 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 30 4 10 11 15 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 31 4 10 11 18 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 32 4 10 11 21 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 33 5 12 11 15 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 34 5 12 11 18 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 35 5 12 11 21 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 36 5 15 11 18 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 37 5 15 11 21 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 38 5 18 11 21 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 39 6 13 12 11 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 40 7 12 13 14 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 41 8 380 13 12 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 42 8 380 13 14 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 43 6 13 14 10 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 44 6 16 15 11 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 45 7 15 16 17 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 46 8 618 16 15 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 47 8 618 16 17 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 48 6 16 17 10 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 49 6 19 18 11 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 50 7 18 19 20 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 51 8 230 19 18 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 52 8 230 19 20 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 53 6 19 20 10 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 54 6 22 21 11 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 55 7 21 22 23 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 56 8 537 22 21 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 57 8 537 22 23 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 58 6 22 23 10 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 59 1 25 24 29 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 60 2 217 24 25 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 61 2 217 24 29 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 62 1 24 25 26 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 63 3 24 25 30 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 64 3 26 25 30 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 65 1 25 26 27 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 66 2 323 26 25 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 67 2 323 26 27 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 68 1 26 27 28 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 69 3 26 27 31 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 70 3 28 27 31 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 71 1 27 28 29 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 72 2 429 28 27 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 73 2 429 28 29 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 74 1 24 29 28 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 75 3 24 29 32 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 76 3 28 29 32 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 77 4 34 33 37 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 78 4 34 33 40 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 79 4 34 33 43 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 80 4 34 33 46 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 81 5 37 33 40 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 82 5 37 33 43 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 83 5 37 33 46 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 84 5 40 33 43 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 85 5 40 33 46 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 86 5 43 33 46 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 87 4 33 34 35 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 88 4 33 34 38 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 89 4 33 34 41 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 90 4 33 34 44 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 91 5 35 34 38 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 92 5 35 34 41 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 93 5 35 34 44 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 94 5 38 34 41 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 95 5 38 34 44 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 96 5 41 34 44 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 97 6 36 35 34 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 98 7 35 36 37 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 99 8 521 36 35 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 100 8 521 36 37 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 101 6 36 37 33 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 102 6 39 38 34 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 103 7 38 39 40 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 104 8 207 39 38 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 105 8 207 39 40 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 106 6 39 40 33 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 107 6 42 41 34 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 108 7 41 42 43 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 109 8 609 42 41 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 110 8 609 42 43 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 111 6 42 43 33 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 112 6 45 44 34 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 113 7 44 45 46 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 114 8 373 45 44 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 115 8 373 45 46 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 116 6 45 46 33 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 117 1 48 47 52 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 118 2 306 47 48 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 119 2 306 47 52 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 120 1 47 48 49 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 121 3 47 48 53 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 122 3 49 48 53 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 123 1 48 49 50 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 124 2 286 49 48 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 125 2 286 49 50 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 126 1 49 50 51 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 127 3 49 50 54 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 128 3 51 50 54 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 129 1 50 51 52 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 130 2 395 51 50 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 131 2 395 51 52 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 132 1 47 52 51 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 133 3 47 52 55 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 134 3 51 52 55 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 135 4 57 56 60 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 136 4 57 56 63 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 137 4 57 56 66 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 138 4 57 56 69 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 139 5 60 56 63 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 140 5 60 56 66 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 141 5 60 56 69 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 142 5 63 56 66 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 143 5 63 56 69 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 144 5 66 56 69 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 145 4 56 57 58 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 146 4 56 57 61 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 147 4 56 57 64 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 148 4 56 57 67 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 149 5 58 57 61 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 150 5 58 57 64 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 151 5 58 57 67 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 152 5 61 57 64 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 153 5 61 57 67 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 154 5 64 57 67 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 155 6 59 58 57 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 156 7 58 59 60 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 157 8 274 59 58 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 158 8 274 59 60 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 159 6 59 60 56 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 160 6 62 61 57 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 161 7 61 62 63 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 162 8 548 62 61 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 163 8 548 62 63 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 164 6 62 63 56 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 165 6 65 64 57 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 166 7 64 65 66 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 167 8 364 65 64 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 168 8 364 65 66 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 169 6 65 66 56 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 170 6 68 67 57 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 171 7 67 68 69 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 172 8 600 68 67 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 173 8 600 68 69 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 174 6 68 69 56 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 175 1 71 70 75 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 176 2 328 70 71 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 177 2 328 70 75 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 178 1 70 71 72 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 179 3 70 71 76 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 180 3 72 71 76 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 181 1 71 72 73 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 182 2 269 72 71 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 183 2 269 72 73 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 184 1 72 73 74 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 185 3 72 73 77 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 186 3 74 73 77 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 187 1 73 74 75 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 188 2 437 74 73 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 189 2 437 74 75 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 190 1 70 75 74 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 191 3 70 75 78 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 192 3 74 75 78 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 193 4 80 79 83 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 194 4 80 79 86 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 195 4 80 79 89 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 196 4 80 79 92 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 197 5 83 79 86 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 198 5 83 79 89 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 199 5 83 79 92 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 200 5 86 79 89 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 201 5 86 79 92 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 202 5 89 79 92 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 203 4 79 80 81 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 204 4 79 80 84 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 205 4 79 80 87 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 206 4 79 80 90 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 207 5 81 80 84 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 208 5 81 80 87 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 209 5 81 80 90 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 210 5 84 80 87 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 211 5 84 80 90 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 212 5 87 80 90 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 213 6 82 81 80 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 214 7 81 82 83 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 215 8 255 82 81 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 216 8 255 82 83 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 217 6 82 83 79 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 218 6 85 84 80 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 219 7 84 85 86 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 220 8 528 85 84 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 221 8 528 85 86 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 222 6 85 86 79 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 223 6 88 87 80 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 224 7 87 88 89 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 225 8 357 88 87 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 226 8 357 88 89 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 227 6 88 89 79 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 228 6 91 90 80 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 229 7 90 91 92 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 230 8 591 91 90 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 231 8 591 91 92 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 232 6 91 92 79 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 233 4 94 93 97 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 234 4 94 93 100 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 235 4 94 93 103 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 236 4 94 93 106 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 237 5 97 93 100 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 238 5 97 93 103 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 239 5 97 93 106 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 240 5 100 93 103 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 241 5 100 93 106 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 242 5 103 93 106 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 243 4 93 94 95 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 244 4 93 94 98 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 245 4 93 94 101 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 246 4 93 94 104 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 247 5 95 94 98 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 248 5 95 94 101 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 249 5 95 94 104 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 250 5 98 94 101 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 251 5 98 94 104 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 252 5 101 94 104 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 253 6 96 95 94 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 254 7 95 96 97 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 255 8 499 96 95 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 256 8 499 96 97 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 257 6 96 97 93 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 258 6 99 98 94 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 259 7 98 99 100 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 260 8 539 99 98 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 261 8 539 99 100 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 262 6 99 100 93 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 263 6 102 101 94 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 264 7 101 102 103 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 265 8 375 102 101 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 266 8 375 102 103 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 267 6 102 103 93 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 268 6 105 104 94 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 269 7 104 105 106 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 270 8 463 105 104 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 271 8 463 105 106 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 272 6 105 106 93 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 273 4 108 107 111 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 274 4 108 107 114 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 275 4 108 107 117 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 276 4 108 107 120 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 277 5 111 107 114 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 278 5 111 107 117 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 279 5 111 107 120 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 280 5 114 107 117 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 281 5 114 107 120 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 282 5 117 107 120 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 283 4 107 108 109 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 284 4 107 108 112 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 285 4 107 108 115 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 286 4 107 108 118 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 287 5 109 108 112 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 288 5 109 108 115 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 289 5 109 108 118 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 290 5 112 108 115 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 291 5 112 108 118 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 292 5 115 108 118 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 293 6 110 109 108 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 294 7 109 110 111 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 295 8 508 110 109 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 296 8 508 110 111 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 297 6 110 111 107 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 298 6 113 112 108 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 299 7 112 113 114 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 300 8 616 113 112 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 301 8 616 113 114 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 302 6 113 114 107 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 303 6 116 115 108 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 304 7 115 116 117 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 305 8 251 116 115 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 306 8 251 116 117 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 307 6 116 117 107 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 308 6 119 118 108 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 309 7 118 119 120 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 310 8 465 119 118 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 311 8 465 119 120 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 312 6 119 120 107 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 313 4 122 121 125 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 314 4 122 121 128 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 315 4 122 121 131 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 316 4 122 121 134 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 317 5 125 121 128 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 318 5 125 121 131 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 319 5 125 121 134 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 320 5 128 121 131 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 321 5 128 121 134 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 322 5 131 121 134 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 323 4 121 122 123 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 324 4 121 122 126 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 325 4 121 122 129 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 326 4 121 122 132 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 327 5 123 122 126 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 328 5 123 122 129 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 329 5 123 122 132 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 330 5 126 122 129 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 331 5 126 122 132 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 332 5 129 122 132 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 333 6 124 123 122 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 334 7 123 124 125 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 335 8 510 124 123 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 336 8 510 124 125 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 337 6 124 125 121 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 338 6 127 126 122 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 339 7 126 127 128 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 340 8 544 127 126 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 341 8 544 127 128 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 342 6 127 128 121 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 343 6 130 129 122 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 344 7 129 130 131 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 345 8 355 130 129 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 346 8 355 130 131 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 347 6 130 131 121 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 348 6 133 132 122 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 349 7 132 133 134 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 350 8 449 133 132 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 351 8 449 133 134 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 352 6 133 134 121 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 353 4 136 135 139 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 354 4 136 135 142 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 355 4 136 135 145 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 356 4 136 135 148 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 357 5 139 135 142 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 358 5 139 135 145 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 359 5 139 135 148 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 360 5 142 135 145 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 361 5 142 135 148 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 362 5 145 135 148 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 363 4 135 136 137 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 364 4 135 136 140 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 365 4 135 136 143 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 366 4 135 136 146 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 367 5 137 136 140 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 368 5 137 136 143 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 369 5 137 136 146 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 370 5 140 136 143 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 371 5 140 136 146 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 372 5 143 136 146 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 373 6 138 137 136 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 374 7 137 138 139 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 375 8 456 138 137 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 376 8 456 138 139 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 377 6 138 139 135 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 378 6 141 140 136 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 379 7 140 141 142 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 380 8 228 141 140 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 381 8 228 141 142 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 382 6 141 142 135 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 383 6 144 143 136 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 384 7 143 144 145 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 385 8 593 144 143 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 386 8 593 144 145 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 387 6 144 145 135 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 388 6 147 146 136 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 389 7 146 147 148 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 390 8 483 147 146 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 391 8 483 147 148 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 392 6 147 148 135 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 393 4 150 149 153 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 394 4 150 149 156 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 395 4 150 149 159 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 396 4 150 149 162 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 397 5 153 149 156 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 398 5 153 149 159 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 399 5 153 149 162 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 400 5 156 149 159 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 401 5 156 149 162 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 402 5 159 149 162 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 403 4 149 150 151 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 404 4 149 150 154 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 405 4 149 150 157 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 406 4 149 150 160 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 407 5 151 150 154 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 408 5 151 150 157 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 409 5 151 150 160 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 410 5 154 150 157 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 411 5 154 150 160 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 412 5 157 150 160 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 413 6 152 151 150 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 414 7 151 152 153 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 415 8 454 152 151 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 416 8 454 152 153 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 417 6 152 153 149 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 418 6 155 154 150 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 419 7 154 155 156 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 420 8 366 155 154 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 421 8 366 155 156 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 422 6 155 156 149 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 423 6 158 157 150 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 424 7 157 158 159 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 425 8 530 158 157 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 426 8 530 158 159 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 427 6 158 159 149 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 428 6 161 160 150 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 429 7 160 161 162 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 430 8 490 161 160 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 431 8 490 161 162 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 432 6 161 162 149 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 433 4 164 163 167 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 434 4 164 163 170 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 435 4 164 163 173 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 436 4 164 163 176 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 437 5 167 163 170 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 438 5 167 163 173 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 439 5 167 163 176 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 440 5 170 163 173 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 441 5 170 163 176 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 442 5 173 163 176 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 443 4 163 164 165 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 444 4 163 164 168 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 445 4 163 164 171 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 446 4 163 164 174 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 447 5 165 164 168 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 448 5 165 164 171 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 449 5 165 164 174 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 450 5 168 164 171 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 451 5 168 164 174 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 452 5 171 164 174 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 453 6 166 165 164 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 454 7 165 166 167 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 455 8 494 166 165 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 456 8 494 166 167 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 457 6 166 167 163 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 458 6 169 168 164 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 459 7 168 169 170 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 460 8 611 169 168 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 461 8 611 169 170 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 462 6 169 170 163 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 463 6 172 171 164 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 464 7 171 172 173 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 465 8 276 172 171 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 466 8 276 172 173 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 467 6 172 173 163 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 468 6 175 174 164 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 469 7 174 175 176 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 470 8 476 175 174 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 471 8 476 175 176 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 472 6 175 176 163 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 473 4 178 177 181 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 474 4 178 177 184 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 475 4 178 177 187 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 476 4 178 177 190 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 477 5 181 177 184 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 478 5 181 177 187 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 479 5 181 177 190 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 480 5 184 177 187 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 481 5 184 177 190 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 482 5 187 177 190 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 483 4 177 178 179 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 484 4 177 178 182 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 485 4 177 178 185 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 486 4 177 178 188 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 487 5 179 178 182 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 488 5 179 178 185 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 489 5 179 178 188 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 490 5 182 178 185 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 491 5 182 178 188 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 492 5 185 178 188 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 493 6 180 179 178 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 494 7 179 180 181 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 495 8 517 180 179 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 496 8 517 180 181 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 497 6 180 181 177 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 498 6 183 182 178 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 499 7 182 183 184 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 500 8 485 183 182 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 501 8 485 183 184 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 502 6 183 184 177 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 503 6 186 185 178 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 504 7 185 186 187 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 505 8 474 186 185 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 506 8 474 186 187 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 507 6 186 187 177 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 508 6 189 188 178 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 509 7 188 189 190 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 510 8 382 189 188 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 511 8 382 189 190 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 512 6 189 190 177 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 513 4 192 191 195 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 514 4 192 191 198 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 515 4 192 191 201 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 516 4 192 191 204 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 517 5 195 191 198 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 518 5 195 191 201 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 519 5 195 191 204 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 520 5 198 191 201 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 521 5 198 191 204 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 522 5 201 191 204 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 523 4 191 192 193 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 524 4 191 192 196 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 525 4 191 192 199 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 526 4 191 192 202 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 527 5 193 192 196 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 528 5 193 192 199 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 529 5 193 192 202 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 530 5 196 192 199 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 531 5 196 192 202 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 532 5 199 192 202 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 533 6 194 193 192 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 534 7 193 194 195 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 535 8 445 194 193 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 536 8 445 194 195 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 537 6 194 195 191 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 538 6 197 196 192 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 539 7 196 197 198 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 540 8 205 197 196 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 541 8 205 197 198 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 542 6 197 198 191 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 543 6 200 199 192 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 544 7 199 200 201 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 545 8 598 200 199 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 546 8 598 200 201 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 547 6 200 201 191 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 548 6 203 202 192 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 549 7 202 203 204 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 550 8 503 203 202 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 551 8 503 203 204 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 552 6 203 204 191 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 553 1 206 205 210 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 554 2 197 205 206 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 555 2 197 205 210 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 556 1 205 206 207 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 557 3 205 206 211 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 558 3 207 206 211 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 559 1 206 207 208 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 560 2 39 207 206 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 561 2 39 207 208 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 562 1 207 208 209 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 563 3 207 208 212 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 564 3 209 208 212 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 565 1 208 209 210 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 566 2 415 209 208 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 567 2 415 209 210 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 568 1 205 210 209 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 569 3 205 210 213 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 570 3 209 210 213 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 571 4 215 214 218 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 572 4 215 214 221 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 573 4 215 214 224 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 574 4 215 214 227 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 575 5 218 214 221 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 576 5 218 214 224 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 577 5 218 214 227 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 578 5 221 214 224 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 579 5 221 214 227 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 580 5 224 214 227 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 581 4 214 215 216 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 582 4 214 215 219 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 583 4 214 215 222 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 584 4 214 215 225 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 585 5 216 215 219 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 586 5 216 215 222 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 587 5 216 215 225 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 588 5 219 215 222 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 589 5 219 215 225 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 590 5 222 215 225 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 591 6 217 216 215 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 592 7 216 217 218 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 593 8 24 217 216 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 594 8 24 217 218 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 595 6 217 218 214 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 596 6 220 219 215 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 597 7 219 220 221 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 598 8 501 220 219 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 599 8 501 220 221 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 600 6 220 221 214 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 601 6 223 222 215 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 602 7 222 223 224 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 603 8 472 223 222 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 604 8 472 223 224 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 605 6 223 224 214 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 606 6 226 225 215 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 607 7 225 226 227 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 608 8 584 226 225 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 609 8 584 226 227 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 610 6 226 227 214 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 611 1 229 228 233 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 612 2 141 228 229 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 613 2 141 228 233 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 614 1 228 229 230 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 615 3 228 229 234 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 616 3 230 229 234 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 617 1 229 230 231 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 618 2 19 230 229 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 619 2 19 230 231 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 620 1 230 231 232 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 621 3 230 231 235 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 622 3 232 231 235 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 623 1 231 232 233 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 624 2 426 232 231 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 625 2 426 232 233 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 626 1 228 233 232 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 627 3 228 233 236 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 628 3 232 233 236 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 629 4 238 237 241 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 630 4 238 237 244 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 631 4 238 237 247 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 632 4 238 237 250 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 633 5 241 237 244 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 634 5 241 237 247 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 635 5 241 237 250 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 636 5 244 237 247 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 637 5 244 237 250 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 638 5 247 237 250 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 639 4 237 238 239 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 640 4 237 238 242 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 641 4 237 238 245 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 642 4 237 238 248 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 643 5 239 238 242 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 644 5 239 238 245 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 645 5 239 238 248 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 646 5 242 238 245 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 647 5 242 238 248 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 648 5 245 238 248 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 649 6 240 239 238 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 650 7 239 240 241 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 651 8 1 240 239 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 652 8 1 240 241 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 653 6 240 241 237 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 654 6 243 242 238 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 655 7 242 243 244 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 656 8 481 243 242 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 657 8 481 243 244 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 658 6 243 244 237 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 659 6 246 245 238 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 660 7 245 246 247 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 661 8 467 246 245 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 662 8 467 246 247 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 663 6 246 247 237 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 664 6 249 248 238 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 665 7 248 249 250 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 666 8 575 249 248 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 667 8 575 249 250 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 668 6 249 250 237 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 669 1 252 251 256 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 670 2 116 251 252 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 671 2 116 251 256 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 672 1 251 252 253 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 673 3 251 252 257 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 674 3 253 252 257 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 675 1 252 253 254 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 676 2 392 253 252 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 677 2 392 253 254 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 678 1 253 254 255 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 679 3 253 254 258 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 680 3 255 254 258 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 681 1 254 255 256 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 682 2 82 255 254 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 683 2 82 255 256 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 684 1 251 256 255 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 685 3 251 256 259 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 686 3 255 256 259 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 687 4 261 260 264 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 688 4 261 260 267 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 689 4 261 260 270 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 690 4 261 260 273 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 691 5 264 260 267 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 692 5 264 260 270 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 693 5 264 260 273 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 694 5 267 260 270 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 695 5 267 260 273 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 696 5 270 260 273 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 697 4 260 261 262 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 698 4 260 261 265 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 699 4 260 261 268 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 700 4 260 261 271 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 701 5 262 261 265 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 702 5 262 261 268 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 703 5 262 261 271 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 704 5 265 261 268 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 705 5 265 261 271 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 706 5 268 261 271 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 707 6 263 262 261 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 708 7 262 263 264 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 709 8 458 263 262 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 710 8 458 263 264 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 711 6 263 264 260 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 712 6 266 265 261 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 713 7 265 266 267 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 714 8 566 266 265 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 715 8 566 266 267 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 716 6 266 267 260 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 717 6 269 268 261 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 718 7 268 269 270 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 719 8 72 269 268 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 720 8 72 269 270 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 721 6 269 270 260 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 722 6 272 271 261 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 723 7 271 272 273 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 724 8 512 272 271 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 725 8 512 272 273 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 726 6 272 273 260 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 727 1 275 274 279 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 728 2 59 274 275 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 729 2 59 274 279 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 730 1 274 275 276 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 731 3 274 275 280 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 732 3 276 275 280 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 733 1 275 276 277 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 734 2 172 276 275 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 735 2 172 276 277 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 736 1 276 277 278 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 737 3 276 277 281 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 738 3 278 277 281 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 739 1 277 278 279 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 740 2 434 278 277 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 741 2 434 278 279 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 742 1 274 279 278 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 743 3 274 279 282 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 744 3 278 279 282 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 745 4 284 283 287 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 746 4 284 283 290 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 747 4 284 283 293 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 748 4 284 283 296 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 749 5 287 283 290 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 750 5 287 283 293 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 751 5 287 283 296 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 752 5 290 283 293 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 753 5 290 283 296 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 754 5 293 283 296 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 755 4 283 284 285 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 756 4 283 284 288 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 757 4 283 284 291 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 758 4 283 284 294 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 759 5 285 284 288 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 760 5 285 284 291 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 761 5 285 284 294 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 762 5 288 284 291 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 763 5 288 284 294 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 764 5 291 284 294 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 765 6 286 285 284 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 766 7 285 286 287 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 767 8 49 286 285 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 768 8 49 286 287 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 769 6 286 287 283 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 770 6 289 288 284 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 771 7 288 289 290 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 772 8 492 289 288 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 773 8 492 289 290 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 774 6 289 290 283 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 775 6 292 291 284 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 776 7 291 292 293 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 777 8 447 292 291 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 778 8 447 292 293 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 779 6 292 293 283 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 780 6 295 294 284 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 781 7 294 295 296 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 782 8 555 295 294 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 783 8 555 295 296 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 784 6 295 296 283 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 785 4 298 297 301 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 786 4 298 297 304 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 787 4 298 297 307 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 788 4 298 297 310 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 789 5 301 297 304 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 790 5 301 297 307 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 791 5 301 297 310 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 792 5 304 297 307 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 793 5 304 297 310 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 794 5 307 297 310 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 795 4 297 298 299 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 796 4 297 298 302 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 797 4 297 298 305 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 798 4 297 298 308 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 799 5 299 298 302 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 800 5 299 298 305 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 801 5 299 298 308 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 802 5 302 298 305 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 803 5 302 298 308 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 804 5 305 298 308 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 805 6 300 299 298 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 806 7 299 300 301 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 807 8 546 300 299 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 808 8 546 300 301 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 809 6 300 301 297 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 810 6 303 302 298 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 811 7 302 303 304 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 812 8 582 303 302 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 813 8 582 303 304 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 814 6 303 304 297 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 815 6 306 305 298 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 816 7 305 306 307 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 817 8 47 306 305 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 818 8 47 306 307 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 819 6 306 307 297 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 820 6 309 308 298 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 821 7 308 309 310 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 822 8 371 309 308 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 823 8 371 309 310 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 824 6 309 310 297 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 825 4 312 311 315 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 826 4 312 311 318 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 827 4 312 311 321 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 828 4 312 311 324 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 829 5 315 311 318 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 830 5 315 311 321 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 831 5 315 311 324 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 832 5 318 311 321 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 833 5 318 311 324 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 834 5 321 311 324 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 835 4 311 312 313 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 836 4 311 312 316 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 837 4 311 312 319 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 838 4 311 312 322 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 839 5 313 312 316 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 840 5 313 312 319 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 841 5 313 312 322 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 842 5 316 312 319 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 843 5 316 312 322 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 844 5 319 312 322 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 845 6 314 313 312 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 846 7 313 314 315 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 847 8 557 314 313 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 848 8 557 314 315 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 849 6 314 315 311 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 850 6 317 316 312 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 851 7 316 317 318 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 852 8 519 317 316 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 853 8 519 317 318 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 854 6 317 318 311 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 855 6 320 319 312 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 856 7 319 320 321 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 857 8 362 320 319 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 858 8 362 320 321 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 859 6 320 321 311 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 860 6 323 322 312 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 861 7 322 323 324 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 862 8 26 323 322 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 863 8 26 323 324 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 864 6 323 324 311 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 865 4 326 325 329 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 866 4 326 325 332 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 867 4 326 325 335 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 868 4 326 325 338 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 869 5 329 325 332 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 870 5 329 325 335 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 871 5 329 325 338 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 872 5 332 325 335 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 873 5 332 325 338 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 874 5 335 325 338 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 875 4 325 326 327 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 876 4 325 326 330 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 877 4 325 326 333 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 878 4 325 326 336 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 879 5 327 326 330 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 880 5 327 326 333 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 881 5 327 326 336 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 882 5 330 326 333 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 883 5 330 326 336 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 884 5 333 326 336 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 885 6 328 327 326 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 886 7 327 328 329 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 887 8 70 328 327 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 888 8 70 328 329 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 889 6 328 329 325 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 890 6 331 330 326 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 891 7 330 331 332 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 892 8 384 331 330 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 893 8 384 331 332 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 894 6 331 332 325 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 895 6 334 333 326 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 896 7 333 334 335 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 897 8 526 334 333 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 898 8 526 334 335 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 899 6 334 335 325 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 900 6 337 336 326 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 901 7 336 337 338 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 902 8 571 337 336 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 903 8 571 337 338 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 904 6 337 338 325 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 905 4 340 339 343 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 906 4 340 339 346 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 907 4 340 339 349 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 908 4 340 339 352 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 909 5 343 339 346 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 910 5 343 339 349 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 911 5 343 339 352 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 912 5 346 339 349 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 913 5 346 339 352 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 914 5 349 339 352 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 915 4 339 340 341 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 916 4 339 340 344 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 917 4 339 340 347 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 918 4 339 340 350 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 919 5 341 340 344 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 920 5 341 340 347 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 921 5 341 340 350 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 922 5 344 340 347 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 923 5 344 340 350 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 924 5 347 340 350 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 925 6 342 341 340 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 926 7 341 342 343 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 927 8 564 342 341 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 928 8 564 342 343 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 929 6 342 343 339 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 930 6 345 344 340 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 931 7 344 345 346 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 932 8 535 345 344 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 933 8 535 345 346 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 934 6 345 346 339 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 935 6 348 347 340 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 936 7 347 348 349 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 937 8 353 348 347 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 938 8 353 348 349 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 939 6 348 349 339 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 940 6 351 350 340 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 941 7 350 351 352 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 942 8 3 351 350 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 943 8 3 351 352 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 944 6 351 352 339 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 945 1 354 353 358 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 946 2 348 353 354 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 947 2 348 353 358 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 948 1 353 354 355 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 949 3 353 354 359 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 950 3 355 354 359 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 951 1 354 355 356 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 952 2 130 355 354 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 953 2 130 355 356 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 954 1 355 356 357 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 955 3 355 356 360 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 956 3 357 356 360 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 957 1 356 357 358 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 958 2 88 357 356 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 959 2 88 357 358 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 960 1 353 358 357 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 961 3 353 358 361 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 962 3 357 358 361 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 963 1 363 362 367 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 964 2 320 362 363 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 965 2 320 362 367 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 966 1 362 363 364 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 967 3 362 363 368 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 968 3 364 363 368 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 969 1 363 364 365 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 970 2 65 364 363 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 971 2 65 364 365 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 972 1 364 365 366 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 973 3 364 365 369 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 974 3 366 365 369 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 975 1 365 366 367 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 976 2 155 366 365 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 977 2 155 366 367 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 978 1 362 367 366 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 979 3 362 367 370 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 980 3 366 367 370 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 981 1 372 371 376 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 982 2 309 371 372 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 983 2 309 371 376 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 984 1 371 372 373 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 985 3 371 372 377 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 986 3 373 372 377 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 987 1 372 373 374 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 988 2 45 373 372 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 989 2 45 373 374 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 990 1 373 374 375 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 991 3 373 374 378 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 992 3 375 374 378 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 993 1 374 375 376 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 994 2 102 375 374 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 995 2 102 375 376 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 996 1 371 376 375 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 997 3 371 376 379 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 998 3 375 376 379 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 999 1 381 380 385 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1000 2 13 380 381 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1001 2 13 380 385 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1002 1 380 381 382 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1003 3 380 381 386 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1004 3 382 381 386 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1005 1 381 382 383 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1006 2 189 382 381 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1007 2 189 382 383 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1008 1 382 383 384 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1009 3 382 383 387 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1010 3 384 383 387 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1011 1 383 384 385 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1012 2 331 384 383 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1013 2 331 384 385 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1014 1 380 385 384 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1015 3 380 385 388 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1016 3 384 385 388 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1017 4 390 389 393 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1018 4 390 389 396 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1019 4 390 389 399 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1020 4 390 389 402 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1021 5 393 389 396 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1022 5 393 389 399 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1023 5 393 389 402 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1024 5 396 389 399 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1025 5 396 389 402 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1026 5 399 389 402 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1027 4 389 390 391 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1028 4 389 390 394 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1029 4 389 390 397 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1030 4 389 390 400 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1031 5 391 390 394 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1032 5 391 390 397 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1033 5 391 390 400 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1034 5 394 390 397 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1035 5 394 390 400 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1036 5 397 390 400 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1037 6 392 391 390 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1038 7 391 392 393 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1039 8 253 392 391 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1040 8 253 392 393 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1041 6 392 393 389 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1042 6 395 394 390 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1043 7 394 395 396 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1044 8 51 395 394 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1045 8 51 395 396 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1046 6 395 396 389 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1047 6 398 397 390 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1048 7 397 398 399 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1049 8 562 398 397 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1050 8 562 398 399 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1051 6 398 399 389 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1052 6 401 400 390 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1053 7 400 401 402 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1054 8 602 401 400 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1055 8 602 401 402 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1056 6 401 402 389 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1057 4 404 403 407 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1058 4 404 403 410 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1059 4 404 403 413 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1060 4 404 403 416 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1061 5 407 403 410 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1062 5 407 403 413 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1063 5 407 403 416 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1064 5 410 403 413 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1065 5 410 403 416 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1066 5 413 403 416 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1067 4 403 404 405 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1068 4 403 404 408 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1069 4 403 404 411 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1070 4 403 404 414 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1071 5 405 404 408 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1072 5 405 404 411 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1073 5 405 404 414 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1074 5 408 404 411 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1075 5 408 404 414 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1076 5 411 404 414 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1077 6 406 405 404 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1078 7 405 406 407 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1079 8 620 406 405 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1080 8 620 406 407 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1081 6 406 407 403 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1082 6 409 408 404 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1083 7 408 409 410 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1084 8 580 409 408 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1085 8 580 409 410 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1086 6 409 410 403 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1087 6 412 411 404 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1088 7 411 412 413 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1089 8 5 412 411 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1090 8 5 412 413 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1091 6 412 413 403 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1092 6 415 414 404 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1093 7 414 415 416 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1094 8 209 415 414 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1095 8 209 415 416 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1096 6 415 416 403 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1097 4 418 417 421 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1098 4 418 417 424 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1099 4 418 417 427 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1100 4 418 417 430 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1101 5 421 417 424 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1102 5 421 417 427 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1103 5 421 417 430 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1104 5 424 417 427 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1105 5 424 417 430 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1106 5 427 417 430 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1107 4 417 418 419 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1108 4 417 418 422 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1109 4 417 418 425 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1110 4 417 418 428 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1111 5 419 418 422 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1112 5 419 418 425 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1113 5 419 418 428 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1114 5 422 418 425 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1115 5 422 418 428 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1116 5 425 418 428 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1117 6 420 419 418 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1118 7 419 420 421 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1119 8 573 420 419 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1120 8 573 420 421 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1121 6 420 421 417 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1122 6 423 422 418 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1123 7 422 423 424 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1124 8 607 423 422 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1125 8 607 423 424 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1126 6 423 424 417 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1127 6 426 425 418 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1128 7 425 426 427 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1129 8 232 426 425 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1130 8 232 426 427 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1131 6 426 427 417 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1132 6 429 428 418 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1133 7 428 429 430 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1134 8 28 429 428 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1135 8 28 429 430 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1136 6 429 430 417 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1137 4 432 431 435 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1138 4 432 431 438 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1139 4 432 431 441 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1140 4 432 431 444 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1141 5 435 431 438 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1142 5 435 431 441 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1143 5 435 431 444 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1144 5 438 431 441 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1145 5 438 431 444 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1146 5 441 431 444 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1147 4 431 432 433 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1148 4 431 432 436 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1149 4 431 432 439 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1150 4 431 432 442 # ('mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1151 5 433 432 436 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1152 5 433 432 439 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1153 5 433 432 442 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1154 5 436 432 439 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1155 5 436 432 442 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1156 5 439 432 442 # ('fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1157 6 434 433 432 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1158 7 433 434 435 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1159 8 278 434 433 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1160 8 278 434 435 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1161 6 434 435 431 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1162 6 437 436 432 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1163 7 436 437 438 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1164 8 74 437 436 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1165 8 74 437 438 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1166 6 437 438 431 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1167 6 440 439 432 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1168 7 439 440 441 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1169 8 553 440 439 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1170 8 553 440 441 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1171 6 440 441 431 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1172 6 443 442 432 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1173 7 442 443 444 # ('mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW', 'strbnd->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW') + 1174 8 589 443 442 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1175 8 589 443 444 # ('mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW',) + 1176 6 443 444 431 # ('mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1177 1 446 445 450 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1178 2 194 445 446 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1179 2 194 445 450 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1180 1 445 446 447 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1181 3 445 446 451 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1182 3 447 446 451 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1183 1 446 447 448 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1184 2 292 447 446 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1185 2 292 447 448 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1186 1 447 448 449 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1187 3 447 448 452 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1188 3 449 448 452 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1189 1 448 449 450 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1190 2 133 449 448 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1191 2 133 449 450 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1192 1 445 450 449 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1193 3 445 450 453 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1194 3 449 450 453 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1195 1 455 454 459 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1196 2 152 454 455 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1197 2 152 454 459 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1198 1 454 455 456 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1199 3 454 455 460 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1200 3 456 455 460 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1201 1 455 456 457 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1202 2 138 456 455 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1203 2 138 456 457 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1204 1 456 457 458 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1205 3 456 457 461 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1206 3 458 457 461 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1207 1 457 458 459 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1208 2 263 458 457 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1209 2 263 458 459 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1210 1 454 459 458 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1211 3 454 459 462 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1212 3 458 459 462 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1213 1 464 463 468 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1214 2 105 463 464 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1215 2 105 463 468 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1216 1 463 464 465 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1217 3 463 464 469 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1218 3 465 464 469 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1219 1 464 465 466 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1220 2 119 465 464 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1221 2 119 465 466 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1222 1 465 466 467 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1223 3 465 466 470 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1224 3 467 466 470 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1225 1 466 467 468 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1226 2 246 467 466 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1227 2 246 467 468 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1228 1 463 468 467 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1229 3 463 468 471 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1230 3 467 468 471 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1231 1 473 472 477 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1232 2 223 472 473 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1233 2 223 472 477 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1234 1 472 473 474 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1235 3 472 473 478 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1236 3 474 473 478 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1237 1 473 474 475 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1238 2 186 474 473 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1239 2 186 474 475 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1240 1 474 475 476 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1241 3 474 475 479 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1242 3 476 475 479 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1243 1 475 476 477 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1244 2 175 476 475 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1245 2 175 476 477 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1246 1 472 477 476 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1247 3 472 477 480 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1248 3 476 477 480 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1249 1 482 481 486 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1250 2 243 481 482 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1251 2 243 481 486 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1252 1 481 482 483 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1253 3 481 482 487 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1254 3 483 482 487 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1255 1 482 483 484 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1256 2 147 483 482 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1257 2 147 483 484 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1258 1 483 484 485 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1259 3 483 484 488 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1260 3 485 484 488 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1261 1 484 485 486 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1262 2 183 485 484 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1263 2 183 485 486 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1264 1 481 486 485 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1265 3 481 486 489 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1266 3 485 486 489 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1267 1 491 490 495 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1268 2 161 490 491 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1269 2 161 490 495 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1270 1 490 491 492 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1271 3 490 491 496 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1272 3 492 491 496 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1273 1 491 492 493 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1274 2 289 492 491 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1275 2 289 492 493 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1276 1 492 493 494 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1277 3 492 493 497 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1278 3 494 493 497 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1279 1 493 494 495 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1280 2 166 494 493 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1281 2 166 494 495 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1282 1 490 495 494 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1283 3 490 495 498 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1284 3 494 495 498 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1285 1 500 499 504 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1286 2 96 499 500 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1287 2 96 499 504 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1288 1 499 500 501 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1289 3 499 500 505 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1290 3 501 500 505 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1291 1 500 501 502 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1292 2 220 501 500 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1293 2 220 501 502 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1294 1 501 502 503 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1295 3 501 502 506 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1296 3 503 502 506 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1297 1 502 503 504 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1298 2 203 503 502 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1299 2 203 503 504 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1300 1 499 504 503 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1301 3 499 504 507 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1302 3 503 504 507 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1303 1 509 508 513 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1304 2 110 508 509 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1305 2 110 508 513 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1306 1 508 509 510 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1307 3 508 509 514 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1308 3 510 509 514 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1309 1 509 510 511 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1310 2 124 510 509 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1311 2 124 510 511 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1312 1 510 511 512 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1313 3 510 511 515 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1314 3 512 511 515 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1315 1 511 512 513 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1316 2 272 512 511 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1317 2 272 512 513 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1318 1 508 513 512 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1319 3 508 513 516 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1320 3 512 513 516 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1321 1 518 517 522 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1322 2 180 517 518 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1323 2 180 517 522 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1324 1 517 518 519 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1325 3 517 518 523 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1326 3 519 518 523 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1327 1 518 519 520 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1328 2 317 519 518 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1329 2 317 519 520 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1330 1 519 520 521 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1331 3 519 520 524 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1332 3 521 520 524 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1333 1 520 521 522 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1334 2 36 521 520 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1335 2 36 521 522 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1336 1 517 522 521 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1337 3 517 522 525 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1338 3 521 522 525 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1339 1 527 526 531 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1340 2 334 526 527 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1341 2 334 526 531 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1342 1 526 527 528 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1343 3 526 527 532 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1344 3 528 527 532 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1345 1 527 528 529 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1346 2 85 528 527 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1347 2 85 528 529 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1348 1 528 529 530 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1349 3 528 529 533 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1350 3 530 529 533 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1351 1 529 530 531 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1352 2 158 530 529 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1353 2 158 530 531 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1354 1 526 531 530 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1355 3 526 531 534 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1356 3 530 531 534 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1357 1 536 535 540 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1358 2 345 535 536 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1359 2 345 535 540 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1360 1 535 536 537 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1361 3 535 536 541 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1362 3 537 536 541 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1363 1 536 537 538 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1364 2 22 537 536 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1365 2 22 537 538 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1366 1 537 538 539 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1367 3 537 538 542 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1368 3 539 538 542 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1369 1 538 539 540 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1370 2 99 539 538 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1371 2 99 539 540 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1372 1 535 540 539 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1373 3 535 540 543 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1374 3 539 540 543 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1375 1 545 544 549 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1376 2 127 544 545 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1377 2 127 544 549 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1378 1 544 545 546 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1379 3 544 545 550 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1380 3 546 545 550 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1381 1 545 546 547 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1382 2 300 546 545 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1383 2 300 546 547 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1384 1 546 547 548 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1385 3 546 547 551 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1386 3 548 547 551 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1387 1 547 548 549 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1388 2 62 548 547 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1389 2 62 548 549 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1390 1 544 549 548 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1391 3 544 549 552 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1392 3 548 549 552 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1393 1 554 553 558 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1394 2 440 553 554 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1395 2 440 553 558 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1396 1 553 554 555 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1397 3 553 554 559 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1398 3 555 554 559 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1399 1 554 555 556 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1400 2 295 555 554 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1401 2 295 555 556 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1402 1 555 556 557 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1403 3 555 556 560 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1404 3 557 556 560 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1405 1 556 557 558 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1406 2 314 557 556 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1407 2 314 557 558 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1408 1 553 558 557 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1409 3 553 558 561 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1410 3 557 558 561 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1411 1 563 562 567 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1412 2 398 562 563 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1413 2 398 562 567 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1414 1 562 563 564 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1415 3 562 563 568 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1416 3 564 563 568 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1417 1 563 564 565 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1418 2 342 564 563 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1419 2 342 564 565 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1420 1 564 565 566 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1421 3 564 565 569 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1422 3 566 565 569 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1423 1 565 566 567 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1424 2 266 566 565 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1425 2 266 566 567 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1426 1 562 567 566 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1427 3 562 567 570 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1428 3 566 567 570 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1429 1 572 571 576 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1430 2 337 571 572 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1431 2 337 571 576 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1432 1 571 572 573 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1433 3 571 572 577 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1434 3 573 572 577 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1435 1 572 573 574 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1436 2 420 573 572 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1437 2 420 573 574 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1438 1 573 574 575 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1439 3 573 574 578 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1440 3 575 574 578 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1441 1 574 575 576 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1442 2 249 575 574 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1443 2 249 575 576 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1444 1 571 576 575 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1445 3 571 576 579 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1446 3 575 576 579 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1447 1 581 580 585 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1448 2 409 580 581 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1449 2 409 580 585 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1450 1 580 581 582 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1451 3 580 581 586 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1452 3 582 581 586 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1453 1 581 582 583 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1454 2 303 582 581 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1455 2 303 582 583 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1456 1 582 583 584 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1457 3 582 583 587 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1458 3 584 583 587 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1459 1 583 584 585 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1460 2 226 584 583 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1461 2 226 584 585 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1462 1 580 585 584 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1463 3 580 585 588 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1464 3 584 585 588 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1465 1 590 589 594 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1466 2 443 589 590 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1467 2 443 589 594 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1468 1 589 590 591 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1469 3 589 590 595 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1470 3 591 590 595 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1471 1 590 591 592 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1472 2 91 591 590 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1473 2 91 591 592 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1474 1 591 592 593 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1475 3 591 592 596 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1476 3 593 592 596 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1477 1 592 593 594 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1478 2 144 593 592 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1479 2 144 593 594 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1480 1 589 594 593 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1481 3 589 594 597 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1482 3 593 594 597 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1483 1 599 598 603 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1484 2 200 598 599 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1485 2 200 598 603 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1486 1 598 599 600 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1487 3 598 599 604 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1488 3 600 599 604 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1489 1 599 600 601 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1490 2 68 600 599 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1491 2 68 600 601 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1492 1 600 601 602 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1493 3 600 601 605 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1494 3 602 601 605 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1495 1 601 602 603 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1496 2 401 602 601 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1497 2 401 602 603 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1498 1 598 603 602 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1499 3 598 603 606 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1500 3 602 603 606 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1501 1 608 607 612 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1502 2 423 607 608 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1503 2 423 607 612 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1504 1 607 608 609 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1505 3 607 608 613 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1506 3 609 608 613 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1507 1 608 609 610 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1508 2 42 609 608 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1509 2 42 609 610 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1510 1 609 610 611 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1511 3 609 610 614 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1512 3 611 610 614 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1513 1 610 611 612 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1514 2 169 611 610 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1515 2 169 611 612 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1516 1 607 612 611 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1517 3 607 612 615 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1518 3 611 612 615 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1519 1 617 616 621 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1520 2 113 616 617 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1521 2 113 616 621 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1522 1 616 617 618 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1523 3 616 617 622 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1524 3 618 617 622 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1525 1 617 618 619 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1526 2 16 618 617 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1527 2 16 618 619 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1528 1 618 619 620 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1529 3 618 619 623 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1530 3 620 619 623 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1531 1 619 620 621 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1532 2 406 620 619 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1533 2 406 620 621 # ('mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1534 1 616 621 620 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene') + 1535 3 616 621 624 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + 1536 3 620 621 624 # ('mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene', 'strbnd->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene') + +Dihedrals + + 1 1 6 1 2 3 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2 2 6 1 2 7 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 3 3 240 1 2 3 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 4 4 240 1 2 7 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 5 1 2 1 6 5 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 6 2 2 1 6 9 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 7 3 240 1 6 5 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 8 4 240 1 6 9 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 9 5 2 1 240 239 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 10 5 2 1 240 241 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 11 5 6 1 240 239 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 12 5 6 1 240 241 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 13 1 1 2 3 4 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 14 3 1 2 3 351 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 15 2 7 2 3 4 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 16 4 7 2 3 351 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 17 1 2 3 4 5 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 18 2 2 3 4 8 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 19 3 351 3 4 5 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 20 4 351 3 4 8 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 21 5 2 3 351 350 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 22 5 2 3 351 352 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 23 5 4 3 351 350 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 24 5 4 3 351 352 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 25 1 3 4 5 6 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 26 3 3 4 5 412 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 27 2 8 4 5 6 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 28 4 8 4 5 412 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 29 1 4 5 6 1 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 30 2 4 5 6 9 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 31 3 412 5 6 1 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 32 4 412 5 6 9 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 33 5 4 5 412 411 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 34 5 4 5 412 413 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 35 5 6 5 412 411 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 36 5 6 5 412 413 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 37 6 14 10 11 12 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 38 6 14 10 11 15 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 39 6 14 10 11 18 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 40 6 14 10 11 21 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 41 6 17 10 11 12 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 42 6 17 10 11 15 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 43 6 17 10 11 18 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 44 6 17 10 11 21 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 45 6 20 10 11 12 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 46 6 20 10 11 15 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 47 6 20 10 11 18 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 48 6 20 10 11 21 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 49 6 23 10 11 12 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 50 6 23 10 11 15 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 51 6 23 10 11 18 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 52 6 23 10 11 21 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 53 7 11 10 14 13 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 54 8 17 10 14 13 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 55 8 20 10 14 13 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 56 8 23 10 14 13 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 57 7 11 10 17 16 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 58 8 14 10 17 16 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 59 8 20 10 17 16 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 60 8 23 10 17 16 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 61 7 11 10 20 19 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 62 8 14 10 20 19 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 63 8 17 10 20 19 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 64 8 23 10 20 19 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 65 7 11 10 23 22 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 66 8 14 10 23 22 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 67 8 17 10 23 22 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 68 8 20 10 23 22 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 69 7 10 11 12 13 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 70 8 15 11 12 13 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 71 8 18 11 12 13 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 72 8 21 11 12 13 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 73 7 10 11 15 16 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 74 8 12 11 15 16 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 75 8 18 11 15 16 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 76 8 21 11 15 16 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 77 7 10 11 18 19 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 78 8 12 11 18 19 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 79 8 15 11 18 19 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 80 8 21 11 18 19 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 81 7 10 11 21 22 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 82 8 12 11 21 22 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 83 8 15 11 21 22 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 84 8 18 11 21 22 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 85 9 11 12 13 14 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 86 10 11 12 13 380 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 87 9 12 13 14 10 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 88 10 380 13 14 10 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 89 5 12 13 380 381 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 90 5 12 13 380 385 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 91 5 14 13 380 381 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 92 5 14 13 380 385 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 93 9 11 15 16 17 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 94 10 11 15 16 618 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 95 9 15 16 17 10 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 96 10 618 16 17 10 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 97 5 15 16 618 617 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 98 5 15 16 618 619 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 99 5 17 16 618 617 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 100 5 17 16 618 619 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 101 9 11 18 19 20 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 102 10 11 18 19 230 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 103 9 18 19 20 10 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 104 10 230 19 20 10 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 105 5 18 19 230 229 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 106 5 18 19 230 231 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 107 5 20 19 230 229 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 108 5 20 19 230 231 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 109 9 11 21 22 23 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 110 10 11 21 22 537 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 111 9 21 22 23 10 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 112 10 537 22 23 10 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 113 5 21 22 537 536 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 114 5 21 22 537 538 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 115 5 23 22 537 536 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 116 5 23 22 537 538 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 117 1 29 24 25 26 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 118 2 29 24 25 30 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 119 3 217 24 25 26 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 120 4 217 24 25 30 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 121 1 25 24 29 28 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 122 2 25 24 29 32 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 123 3 217 24 29 28 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 124 4 217 24 29 32 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 125 5 25 24 217 216 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 126 5 25 24 217 218 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 127 5 29 24 217 216 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 128 5 29 24 217 218 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 129 1 24 25 26 27 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 130 3 24 25 26 323 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 131 2 30 25 26 27 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 132 4 30 25 26 323 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 133 1 25 26 27 28 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 134 2 25 26 27 31 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 135 3 323 26 27 28 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 136 4 323 26 27 31 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 137 5 25 26 323 322 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 138 5 25 26 323 324 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 139 5 27 26 323 322 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 140 5 27 26 323 324 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 141 1 26 27 28 29 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 142 3 26 27 28 429 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 143 2 31 27 28 29 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 144 4 31 27 28 429 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 145 1 27 28 29 24 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 146 2 27 28 29 32 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 147 3 429 28 29 24 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 148 4 429 28 29 32 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 149 5 27 28 429 428 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 150 5 27 28 429 430 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 151 5 29 28 429 428 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 152 5 29 28 429 430 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 153 6 37 33 34 35 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 154 6 37 33 34 38 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 155 6 37 33 34 41 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 156 6 37 33 34 44 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 157 6 40 33 34 35 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 158 6 40 33 34 38 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 159 6 40 33 34 41 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 160 6 40 33 34 44 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 161 6 43 33 34 35 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 162 6 43 33 34 38 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 163 6 43 33 34 41 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 164 6 43 33 34 44 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 165 6 46 33 34 35 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 166 6 46 33 34 38 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 167 6 46 33 34 41 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 168 6 46 33 34 44 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 169 7 34 33 37 36 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 170 8 40 33 37 36 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 171 8 43 33 37 36 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 172 8 46 33 37 36 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 173 7 34 33 40 39 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 174 8 37 33 40 39 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 175 8 43 33 40 39 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 176 8 46 33 40 39 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 177 7 34 33 43 42 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 178 8 37 33 43 42 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 179 8 40 33 43 42 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 180 8 46 33 43 42 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 181 7 34 33 46 45 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 182 8 37 33 46 45 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 183 8 40 33 46 45 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 184 8 43 33 46 45 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 185 7 33 34 35 36 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 186 8 38 34 35 36 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 187 8 41 34 35 36 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 188 8 44 34 35 36 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 189 7 33 34 38 39 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 190 8 35 34 38 39 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 191 8 41 34 38 39 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 192 8 44 34 38 39 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 193 7 33 34 41 42 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 194 8 35 34 41 42 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 195 8 38 34 41 42 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 196 8 44 34 41 42 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 197 7 33 34 44 45 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 198 8 35 34 44 45 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 199 8 38 34 44 45 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 200 8 41 34 44 45 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 201 9 34 35 36 37 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 202 10 34 35 36 521 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 203 9 35 36 37 33 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 204 10 521 36 37 33 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 205 5 35 36 521 520 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 206 5 35 36 521 522 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 207 5 37 36 521 520 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 208 5 37 36 521 522 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 209 9 34 38 39 40 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 210 10 34 38 39 207 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 211 9 38 39 40 33 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 212 10 207 39 40 33 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 213 5 38 39 207 206 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 214 5 38 39 207 208 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 215 5 40 39 207 206 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 216 5 40 39 207 208 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 217 9 34 41 42 43 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 218 10 34 41 42 609 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 219 9 41 42 43 33 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 220 10 609 42 43 33 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 221 5 41 42 609 608 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 222 5 41 42 609 610 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 223 5 43 42 609 608 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 224 5 43 42 609 610 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 225 9 34 44 45 46 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 226 10 34 44 45 373 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 227 9 44 45 46 33 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 228 10 373 45 46 33 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 229 5 44 45 373 372 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 230 5 44 45 373 374 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 231 5 46 45 373 372 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 232 5 46 45 373 374 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 233 1 52 47 48 49 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 234 2 52 47 48 53 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 235 3 306 47 48 49 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 236 4 306 47 48 53 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 237 1 48 47 52 51 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 238 2 48 47 52 55 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 239 3 306 47 52 51 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 240 4 306 47 52 55 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 241 5 48 47 306 305 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 242 5 48 47 306 307 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 243 5 52 47 306 305 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 244 5 52 47 306 307 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 245 1 47 48 49 50 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 246 3 47 48 49 286 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 247 2 53 48 49 50 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 248 4 53 48 49 286 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 249 1 48 49 50 51 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 250 2 48 49 50 54 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 251 3 286 49 50 51 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 252 4 286 49 50 54 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 253 5 48 49 286 285 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 254 5 48 49 286 287 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 255 5 50 49 286 285 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 256 5 50 49 286 287 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 257 1 49 50 51 52 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 258 3 49 50 51 395 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 259 2 54 50 51 52 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 260 4 54 50 51 395 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 261 1 50 51 52 47 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 262 2 50 51 52 55 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 263 3 395 51 52 47 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 264 4 395 51 52 55 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 265 5 50 51 395 394 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 266 5 50 51 395 396 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 267 5 52 51 395 394 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 268 5 52 51 395 396 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 269 6 60 56 57 58 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 270 6 60 56 57 61 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 271 6 60 56 57 64 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 272 6 60 56 57 67 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 273 6 63 56 57 58 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 274 6 63 56 57 61 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 275 6 63 56 57 64 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 276 6 63 56 57 67 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 277 6 66 56 57 58 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 278 6 66 56 57 61 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 279 6 66 56 57 64 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 280 6 66 56 57 67 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 281 6 69 56 57 58 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 282 6 69 56 57 61 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 283 6 69 56 57 64 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 284 6 69 56 57 67 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 285 7 57 56 60 59 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 286 8 63 56 60 59 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 287 8 66 56 60 59 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 288 8 69 56 60 59 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 289 7 57 56 63 62 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 290 8 60 56 63 62 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 291 8 66 56 63 62 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 292 8 69 56 63 62 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 293 7 57 56 66 65 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 294 8 60 56 66 65 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 295 8 63 56 66 65 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 296 8 69 56 66 65 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 297 7 57 56 69 68 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 298 8 60 56 69 68 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 299 8 63 56 69 68 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 300 8 66 56 69 68 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 301 7 56 57 58 59 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 302 8 61 57 58 59 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 303 8 64 57 58 59 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 304 8 67 57 58 59 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 305 7 56 57 61 62 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 306 8 58 57 61 62 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 307 8 64 57 61 62 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 308 8 67 57 61 62 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 309 7 56 57 64 65 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 310 8 58 57 64 65 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 311 8 61 57 64 65 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 312 8 67 57 64 65 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 313 7 56 57 67 68 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 314 8 58 57 67 68 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 315 8 61 57 67 68 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 316 8 64 57 67 68 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 317 9 57 58 59 60 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 318 10 57 58 59 274 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 319 9 58 59 60 56 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 320 10 274 59 60 56 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 321 5 58 59 274 275 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 322 5 58 59 274 279 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 323 5 60 59 274 275 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 324 5 60 59 274 279 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 325 9 57 61 62 63 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 326 10 57 61 62 548 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 327 9 61 62 63 56 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 328 10 548 62 63 56 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 329 5 61 62 548 547 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 330 5 61 62 548 549 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 331 5 63 62 548 547 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 332 5 63 62 548 549 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 333 9 57 64 65 66 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 334 10 57 64 65 364 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 335 9 64 65 66 56 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 336 10 364 65 66 56 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 337 5 64 65 364 363 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 338 5 64 65 364 365 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 339 5 66 65 364 363 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 340 5 66 65 364 365 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 341 9 57 67 68 69 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 342 10 57 67 68 600 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 343 9 67 68 69 56 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 344 10 600 68 69 56 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 345 5 67 68 600 599 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 346 5 67 68 600 601 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 347 5 69 68 600 599 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 348 5 69 68 600 601 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 349 1 75 70 71 72 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 350 2 75 70 71 76 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 351 3 328 70 71 72 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 352 4 328 70 71 76 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 353 1 71 70 75 74 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 354 2 71 70 75 78 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 355 3 328 70 75 74 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 356 4 328 70 75 78 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 357 5 71 70 328 327 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 358 5 71 70 328 329 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 359 5 75 70 328 327 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 360 5 75 70 328 329 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 361 1 70 71 72 73 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 362 3 70 71 72 269 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 363 2 76 71 72 73 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 364 4 76 71 72 269 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 365 1 71 72 73 74 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 366 2 71 72 73 77 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 367 3 269 72 73 74 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 368 4 269 72 73 77 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 369 5 71 72 269 268 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 370 5 71 72 269 270 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 371 5 73 72 269 268 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 372 5 73 72 269 270 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 373 1 72 73 74 75 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 374 3 72 73 74 437 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 375 2 77 73 74 75 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 376 4 77 73 74 437 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 377 1 73 74 75 70 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 378 2 73 74 75 78 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 379 3 437 74 75 70 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 380 4 437 74 75 78 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 381 5 73 74 437 436 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 382 5 73 74 437 438 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 383 5 75 74 437 436 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 384 5 75 74 437 438 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 385 6 83 79 80 81 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 386 6 83 79 80 84 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 387 6 83 79 80 87 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 388 6 83 79 80 90 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 389 6 86 79 80 81 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 390 6 86 79 80 84 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 391 6 86 79 80 87 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 392 6 86 79 80 90 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 393 6 89 79 80 81 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 394 6 89 79 80 84 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 395 6 89 79 80 87 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 396 6 89 79 80 90 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 397 6 92 79 80 81 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 398 6 92 79 80 84 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 399 6 92 79 80 87 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 400 6 92 79 80 90 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 401 7 80 79 83 82 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 402 8 86 79 83 82 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 403 8 89 79 83 82 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 404 8 92 79 83 82 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 405 7 80 79 86 85 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 406 8 83 79 86 85 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 407 8 89 79 86 85 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 408 8 92 79 86 85 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 409 7 80 79 89 88 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 410 8 83 79 89 88 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 411 8 86 79 89 88 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 412 8 92 79 89 88 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 413 7 80 79 92 91 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 414 8 83 79 92 91 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 415 8 86 79 92 91 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 416 8 89 79 92 91 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 417 7 79 80 81 82 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 418 8 84 80 81 82 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 419 8 87 80 81 82 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 420 8 90 80 81 82 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 421 7 79 80 84 85 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 422 8 81 80 84 85 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 423 8 87 80 84 85 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 424 8 90 80 84 85 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 425 7 79 80 87 88 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 426 8 81 80 87 88 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 427 8 84 80 87 88 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 428 8 90 80 87 88 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 429 7 79 80 90 91 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 430 8 81 80 90 91 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 431 8 84 80 90 91 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 432 8 87 80 90 91 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 433 9 80 81 82 83 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 434 10 80 81 82 255 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 435 9 81 82 83 79 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 436 10 255 82 83 79 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 437 5 81 82 255 254 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 438 5 81 82 255 256 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 439 5 83 82 255 254 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 440 5 83 82 255 256 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 441 9 80 84 85 86 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 442 10 80 84 85 528 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 443 9 84 85 86 79 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 444 10 528 85 86 79 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 445 5 84 85 528 527 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 446 5 84 85 528 529 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 447 5 86 85 528 527 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 448 5 86 85 528 529 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 449 9 80 87 88 89 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 450 10 80 87 88 357 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 451 9 87 88 89 79 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 452 10 357 88 89 79 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 453 5 87 88 357 356 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 454 5 87 88 357 358 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 455 5 89 88 357 356 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 456 5 89 88 357 358 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 457 9 80 90 91 92 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 458 10 80 90 91 591 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 459 9 90 91 92 79 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 460 10 591 91 92 79 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 461 5 90 91 591 590 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 462 5 90 91 591 592 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 463 5 92 91 591 590 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 464 5 92 91 591 592 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 465 6 97 93 94 95 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 466 6 97 93 94 98 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 467 6 97 93 94 101 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 468 6 97 93 94 104 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 469 6 100 93 94 95 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 470 6 100 93 94 98 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 471 6 100 93 94 101 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 472 6 100 93 94 104 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 473 6 103 93 94 95 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 474 6 103 93 94 98 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 475 6 103 93 94 101 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 476 6 103 93 94 104 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 477 6 106 93 94 95 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 478 6 106 93 94 98 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 479 6 106 93 94 101 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 480 6 106 93 94 104 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 481 7 94 93 97 96 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 482 8 100 93 97 96 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 483 8 103 93 97 96 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 484 8 106 93 97 96 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 485 7 94 93 100 99 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 486 8 97 93 100 99 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 487 8 103 93 100 99 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 488 8 106 93 100 99 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 489 7 94 93 103 102 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 490 8 97 93 103 102 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 491 8 100 93 103 102 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 492 8 106 93 103 102 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 493 7 94 93 106 105 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 494 8 97 93 106 105 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 495 8 100 93 106 105 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 496 8 103 93 106 105 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 497 7 93 94 95 96 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 498 8 98 94 95 96 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 499 8 101 94 95 96 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 500 8 104 94 95 96 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 501 7 93 94 98 99 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 502 8 95 94 98 99 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 503 8 101 94 98 99 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 504 8 104 94 98 99 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 505 7 93 94 101 102 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 506 8 95 94 101 102 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 507 8 98 94 101 102 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 508 8 104 94 101 102 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 509 7 93 94 104 105 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 510 8 95 94 104 105 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 511 8 98 94 104 105 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 512 8 101 94 104 105 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 513 9 94 95 96 97 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 514 10 94 95 96 499 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 515 9 95 96 97 93 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 516 10 499 96 97 93 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 517 5 95 96 499 500 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 518 5 95 96 499 504 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 519 5 97 96 499 500 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 520 5 97 96 499 504 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 521 9 94 98 99 100 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 522 10 94 98 99 539 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 523 9 98 99 100 93 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 524 10 539 99 100 93 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 525 5 98 99 539 538 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 526 5 98 99 539 540 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 527 5 100 99 539 538 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 528 5 100 99 539 540 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 529 9 94 101 102 103 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 530 10 94 101 102 375 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 531 9 101 102 103 93 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 532 10 375 102 103 93 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 533 5 101 102 375 374 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 534 5 101 102 375 376 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 535 5 103 102 375 374 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 536 5 103 102 375 376 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 537 9 94 104 105 106 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 538 10 94 104 105 463 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 539 9 104 105 106 93 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 540 10 463 105 106 93 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 541 5 104 105 463 464 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 542 5 104 105 463 468 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 543 5 106 105 463 464 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 544 5 106 105 463 468 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 545 6 111 107 108 109 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 546 6 111 107 108 112 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 547 6 111 107 108 115 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 548 6 111 107 108 118 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 549 6 114 107 108 109 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 550 6 114 107 108 112 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 551 6 114 107 108 115 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 552 6 114 107 108 118 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 553 6 117 107 108 109 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 554 6 117 107 108 112 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 555 6 117 107 108 115 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 556 6 117 107 108 118 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 557 6 120 107 108 109 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 558 6 120 107 108 112 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 559 6 120 107 108 115 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 560 6 120 107 108 118 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 561 7 108 107 111 110 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 562 8 114 107 111 110 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 563 8 117 107 111 110 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 564 8 120 107 111 110 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 565 7 108 107 114 113 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 566 8 111 107 114 113 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 567 8 117 107 114 113 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 568 8 120 107 114 113 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 569 7 108 107 117 116 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 570 8 111 107 117 116 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 571 8 114 107 117 116 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 572 8 120 107 117 116 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 573 7 108 107 120 119 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 574 8 111 107 120 119 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 575 8 114 107 120 119 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 576 8 117 107 120 119 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 577 7 107 108 109 110 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 578 8 112 108 109 110 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 579 8 115 108 109 110 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 580 8 118 108 109 110 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 581 7 107 108 112 113 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 582 8 109 108 112 113 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 583 8 115 108 112 113 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 584 8 118 108 112 113 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 585 7 107 108 115 116 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 586 8 109 108 115 116 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 587 8 112 108 115 116 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 588 8 118 108 115 116 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 589 7 107 108 118 119 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 590 8 109 108 118 119 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 591 8 112 108 118 119 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 592 8 115 108 118 119 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 593 9 108 109 110 111 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 594 10 108 109 110 508 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 595 9 109 110 111 107 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 596 10 508 110 111 107 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 597 5 109 110 508 509 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 598 5 109 110 508 513 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 599 5 111 110 508 509 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 600 5 111 110 508 513 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 601 9 108 112 113 114 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 602 10 108 112 113 616 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 603 9 112 113 114 107 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 604 10 616 113 114 107 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 605 5 112 113 616 617 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 606 5 112 113 616 621 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 607 5 114 113 616 617 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 608 5 114 113 616 621 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 609 9 108 115 116 117 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 610 10 108 115 116 251 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 611 9 115 116 117 107 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 612 10 251 116 117 107 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 613 5 115 116 251 252 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 614 5 115 116 251 256 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 615 5 117 116 251 252 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 616 5 117 116 251 256 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 617 9 108 118 119 120 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 618 10 108 118 119 465 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 619 9 118 119 120 107 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 620 10 465 119 120 107 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 621 5 118 119 465 464 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 622 5 118 119 465 466 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 623 5 120 119 465 464 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 624 5 120 119 465 466 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 625 6 125 121 122 123 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 626 6 125 121 122 126 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 627 6 125 121 122 129 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 628 6 125 121 122 132 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 629 6 128 121 122 123 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 630 6 128 121 122 126 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 631 6 128 121 122 129 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 632 6 128 121 122 132 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 633 6 131 121 122 123 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 634 6 131 121 122 126 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 635 6 131 121 122 129 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 636 6 131 121 122 132 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 637 6 134 121 122 123 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 638 6 134 121 122 126 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 639 6 134 121 122 129 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 640 6 134 121 122 132 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 641 7 122 121 125 124 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 642 8 128 121 125 124 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 643 8 131 121 125 124 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 644 8 134 121 125 124 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 645 7 122 121 128 127 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 646 8 125 121 128 127 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 647 8 131 121 128 127 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 648 8 134 121 128 127 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 649 7 122 121 131 130 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 650 8 125 121 131 130 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 651 8 128 121 131 130 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 652 8 134 121 131 130 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 653 7 122 121 134 133 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 654 8 125 121 134 133 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 655 8 128 121 134 133 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 656 8 131 121 134 133 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 657 7 121 122 123 124 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 658 8 126 122 123 124 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 659 8 129 122 123 124 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 660 8 132 122 123 124 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 661 7 121 122 126 127 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 662 8 123 122 126 127 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 663 8 129 122 126 127 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 664 8 132 122 126 127 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 665 7 121 122 129 130 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 666 8 123 122 129 130 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 667 8 126 122 129 130 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 668 8 132 122 129 130 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 669 7 121 122 132 133 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 670 8 123 122 132 133 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 671 8 126 122 132 133 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 672 8 129 122 132 133 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 673 9 122 123 124 125 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 674 10 122 123 124 510 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 675 9 123 124 125 121 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 676 10 510 124 125 121 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 677 5 123 124 510 509 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 678 5 123 124 510 511 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 679 5 125 124 510 509 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 680 5 125 124 510 511 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 681 9 122 126 127 128 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 682 10 122 126 127 544 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 683 9 126 127 128 121 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 684 10 544 127 128 121 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 685 5 126 127 544 545 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 686 5 126 127 544 549 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 687 5 128 127 544 545 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 688 5 128 127 544 549 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 689 9 122 129 130 131 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 690 10 122 129 130 355 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 691 9 129 130 131 121 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 692 10 355 130 131 121 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 693 5 129 130 355 354 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 694 5 129 130 355 356 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 695 5 131 130 355 354 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 696 5 131 130 355 356 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 697 9 122 132 133 134 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 698 10 122 132 133 449 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 699 9 132 133 134 121 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 700 10 449 133 134 121 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 701 5 132 133 449 448 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 702 5 132 133 449 450 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 703 5 134 133 449 448 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 704 5 134 133 449 450 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 705 6 139 135 136 137 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 706 6 139 135 136 140 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 707 6 139 135 136 143 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 708 6 139 135 136 146 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 709 6 142 135 136 137 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 710 6 142 135 136 140 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 711 6 142 135 136 143 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 712 6 142 135 136 146 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 713 6 145 135 136 137 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 714 6 145 135 136 140 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 715 6 145 135 136 143 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 716 6 145 135 136 146 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 717 6 148 135 136 137 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 718 6 148 135 136 140 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 719 6 148 135 136 143 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 720 6 148 135 136 146 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 721 7 136 135 139 138 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 722 8 142 135 139 138 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 723 8 145 135 139 138 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 724 8 148 135 139 138 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 725 7 136 135 142 141 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 726 8 139 135 142 141 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 727 8 145 135 142 141 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 728 8 148 135 142 141 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 729 7 136 135 145 144 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 730 8 139 135 145 144 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 731 8 142 135 145 144 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 732 8 148 135 145 144 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 733 7 136 135 148 147 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 734 8 139 135 148 147 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 735 8 142 135 148 147 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 736 8 145 135 148 147 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 737 7 135 136 137 138 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 738 8 140 136 137 138 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 739 8 143 136 137 138 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 740 8 146 136 137 138 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 741 7 135 136 140 141 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 742 8 137 136 140 141 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 743 8 143 136 140 141 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 744 8 146 136 140 141 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 745 7 135 136 143 144 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 746 8 137 136 143 144 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 747 8 140 136 143 144 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 748 8 146 136 143 144 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 749 7 135 136 146 147 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 750 8 137 136 146 147 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 751 8 140 136 146 147 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 752 8 143 136 146 147 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 753 9 136 137 138 139 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 754 10 136 137 138 456 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 755 9 137 138 139 135 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 756 10 456 138 139 135 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 757 5 137 138 456 455 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 758 5 137 138 456 457 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 759 5 139 138 456 455 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 760 5 139 138 456 457 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 761 9 136 140 141 142 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 762 10 136 140 141 228 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 763 9 140 141 142 135 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 764 10 228 141 142 135 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 765 5 140 141 228 229 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 766 5 140 141 228 233 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 767 5 142 141 228 229 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 768 5 142 141 228 233 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 769 9 136 143 144 145 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 770 10 136 143 144 593 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 771 9 143 144 145 135 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 772 10 593 144 145 135 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 773 5 143 144 593 592 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 774 5 143 144 593 594 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 775 5 145 144 593 592 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 776 5 145 144 593 594 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 777 9 136 146 147 148 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 778 10 136 146 147 483 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 779 9 146 147 148 135 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 780 10 483 147 148 135 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 781 5 146 147 483 482 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 782 5 146 147 483 484 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 783 5 148 147 483 482 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 784 5 148 147 483 484 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 785 6 153 149 150 151 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 786 6 153 149 150 154 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 787 6 153 149 150 157 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 788 6 153 149 150 160 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 789 6 156 149 150 151 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 790 6 156 149 150 154 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 791 6 156 149 150 157 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 792 6 156 149 150 160 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 793 6 159 149 150 151 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 794 6 159 149 150 154 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 795 6 159 149 150 157 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 796 6 159 149 150 160 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 797 6 162 149 150 151 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 798 6 162 149 150 154 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 799 6 162 149 150 157 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 800 6 162 149 150 160 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 801 7 150 149 153 152 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 802 8 156 149 153 152 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 803 8 159 149 153 152 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 804 8 162 149 153 152 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 805 7 150 149 156 155 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 806 8 153 149 156 155 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 807 8 159 149 156 155 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 808 8 162 149 156 155 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 809 7 150 149 159 158 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 810 8 153 149 159 158 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 811 8 156 149 159 158 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 812 8 162 149 159 158 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 813 7 150 149 162 161 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 814 8 153 149 162 161 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 815 8 156 149 162 161 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 816 8 159 149 162 161 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 817 7 149 150 151 152 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 818 8 154 150 151 152 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 819 8 157 150 151 152 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 820 8 160 150 151 152 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 821 7 149 150 154 155 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 822 8 151 150 154 155 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 823 8 157 150 154 155 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 824 8 160 150 154 155 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 825 7 149 150 157 158 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 826 8 151 150 157 158 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 827 8 154 150 157 158 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 828 8 160 150 157 158 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 829 7 149 150 160 161 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 830 8 151 150 160 161 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 831 8 154 150 160 161 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 832 8 157 150 160 161 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 833 9 150 151 152 153 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 834 10 150 151 152 454 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 835 9 151 152 153 149 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 836 10 454 152 153 149 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 837 5 151 152 454 455 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 838 5 151 152 454 459 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 839 5 153 152 454 455 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 840 5 153 152 454 459 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 841 9 150 154 155 156 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 842 10 150 154 155 366 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 843 9 154 155 156 149 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 844 10 366 155 156 149 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 845 5 154 155 366 365 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 846 5 154 155 366 367 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 847 5 156 155 366 365 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 848 5 156 155 366 367 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 849 9 150 157 158 159 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 850 10 150 157 158 530 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 851 9 157 158 159 149 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 852 10 530 158 159 149 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 853 5 157 158 530 529 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 854 5 157 158 530 531 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 855 5 159 158 530 529 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 856 5 159 158 530 531 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 857 9 150 160 161 162 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 858 10 150 160 161 490 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 859 9 160 161 162 149 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 860 10 490 161 162 149 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 861 5 160 161 490 491 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 862 5 160 161 490 495 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 863 5 162 161 490 491 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 864 5 162 161 490 495 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 865 6 167 163 164 165 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 866 6 167 163 164 168 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 867 6 167 163 164 171 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 868 6 167 163 164 174 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 869 6 170 163 164 165 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 870 6 170 163 164 168 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 871 6 170 163 164 171 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 872 6 170 163 164 174 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 873 6 173 163 164 165 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 874 6 173 163 164 168 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 875 6 173 163 164 171 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 876 6 173 163 164 174 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 877 6 176 163 164 165 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 878 6 176 163 164 168 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 879 6 176 163 164 171 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 880 6 176 163 164 174 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 881 7 164 163 167 166 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 882 8 170 163 167 166 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 883 8 173 163 167 166 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 884 8 176 163 167 166 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 885 7 164 163 170 169 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 886 8 167 163 170 169 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 887 8 173 163 170 169 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 888 8 176 163 170 169 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 889 7 164 163 173 172 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 890 8 167 163 173 172 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 891 8 170 163 173 172 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 892 8 176 163 173 172 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 893 7 164 163 176 175 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 894 8 167 163 176 175 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 895 8 170 163 176 175 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 896 8 173 163 176 175 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 897 7 163 164 165 166 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 898 8 168 164 165 166 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 899 8 171 164 165 166 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 900 8 174 164 165 166 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 901 7 163 164 168 169 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 902 8 165 164 168 169 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 903 8 171 164 168 169 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 904 8 174 164 168 169 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 905 7 163 164 171 172 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 906 8 165 164 171 172 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 907 8 168 164 171 172 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 908 8 174 164 171 172 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 909 7 163 164 174 175 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 910 8 165 164 174 175 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 911 8 168 164 174 175 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 912 8 171 164 174 175 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 913 9 164 165 166 167 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 914 10 164 165 166 494 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 915 9 165 166 167 163 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 916 10 494 166 167 163 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 917 5 165 166 494 493 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 918 5 165 166 494 495 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 919 5 167 166 494 493 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 920 5 167 166 494 495 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 921 9 164 168 169 170 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 922 10 164 168 169 611 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 923 9 168 169 170 163 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 924 10 611 169 170 163 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 925 5 168 169 611 610 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 926 5 168 169 611 612 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 927 5 170 169 611 610 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 928 5 170 169 611 612 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 929 9 164 171 172 173 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 930 10 164 171 172 276 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 931 9 171 172 173 163 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 932 10 276 172 173 163 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 933 5 171 172 276 275 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 934 5 171 172 276 277 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 935 5 173 172 276 275 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 936 5 173 172 276 277 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 937 9 164 174 175 176 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 938 10 164 174 175 476 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 939 9 174 175 176 163 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 940 10 476 175 176 163 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 941 5 174 175 476 475 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 942 5 174 175 476 477 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 943 5 176 175 476 475 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 944 5 176 175 476 477 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 945 6 181 177 178 179 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 946 6 181 177 178 182 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 947 6 181 177 178 185 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 948 6 181 177 178 188 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 949 6 184 177 178 179 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 950 6 184 177 178 182 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 951 6 184 177 178 185 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 952 6 184 177 178 188 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 953 6 187 177 178 179 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 954 6 187 177 178 182 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 955 6 187 177 178 185 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 956 6 187 177 178 188 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 957 6 190 177 178 179 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 958 6 190 177 178 182 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 959 6 190 177 178 185 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 960 6 190 177 178 188 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 961 7 178 177 181 180 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 962 8 184 177 181 180 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 963 8 187 177 181 180 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 964 8 190 177 181 180 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 965 7 178 177 184 183 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 966 8 181 177 184 183 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 967 8 187 177 184 183 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 968 8 190 177 184 183 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 969 7 178 177 187 186 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 970 8 181 177 187 186 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 971 8 184 177 187 186 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 972 8 190 177 187 186 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 973 7 178 177 190 189 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 974 8 181 177 190 189 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 975 8 184 177 190 189 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 976 8 187 177 190 189 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 977 7 177 178 179 180 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 978 8 182 178 179 180 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 979 8 185 178 179 180 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 980 8 188 178 179 180 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 981 7 177 178 182 183 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 982 8 179 178 182 183 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 983 8 185 178 182 183 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 984 8 188 178 182 183 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 985 7 177 178 185 186 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 986 8 179 178 185 186 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 987 8 182 178 185 186 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 988 8 188 178 185 186 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 989 7 177 178 188 189 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 990 8 179 178 188 189 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 991 8 182 178 188 189 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 992 8 185 178 188 189 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 993 9 178 179 180 181 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 994 10 178 179 180 517 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 995 9 179 180 181 177 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 996 10 517 180 181 177 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 997 5 179 180 517 518 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 998 5 179 180 517 522 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 999 5 181 180 517 518 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1000 5 181 180 517 522 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1001 9 178 182 183 184 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1002 10 178 182 183 485 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1003 9 182 183 184 177 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1004 10 485 183 184 177 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1005 5 182 183 485 484 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1006 5 182 183 485 486 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1007 5 184 183 485 484 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1008 5 184 183 485 486 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1009 9 178 185 186 187 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1010 10 178 185 186 474 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1011 9 185 186 187 177 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1012 10 474 186 187 177 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1013 5 185 186 474 473 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1014 5 185 186 474 475 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1015 5 187 186 474 473 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1016 5 187 186 474 475 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1017 9 178 188 189 190 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1018 10 178 188 189 382 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1019 9 188 189 190 177 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1020 10 382 189 190 177 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1021 5 188 189 382 381 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1022 5 188 189 382 383 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1023 5 190 189 382 381 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1024 5 190 189 382 383 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1025 6 195 191 192 193 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1026 6 195 191 192 196 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1027 6 195 191 192 199 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1028 6 195 191 192 202 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1029 6 198 191 192 193 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1030 6 198 191 192 196 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1031 6 198 191 192 199 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1032 6 198 191 192 202 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1033 6 201 191 192 193 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1034 6 201 191 192 196 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1035 6 201 191 192 199 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1036 6 201 191 192 202 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1037 6 204 191 192 193 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1038 6 204 191 192 196 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1039 6 204 191 192 199 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1040 6 204 191 192 202 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1041 7 192 191 195 194 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1042 8 198 191 195 194 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1043 8 201 191 195 194 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1044 8 204 191 195 194 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1045 7 192 191 198 197 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1046 8 195 191 198 197 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1047 8 201 191 198 197 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1048 8 204 191 198 197 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1049 7 192 191 201 200 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1050 8 195 191 201 200 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1051 8 198 191 201 200 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1052 8 204 191 201 200 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1053 7 192 191 204 203 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1054 8 195 191 204 203 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1055 8 198 191 204 203 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1056 8 201 191 204 203 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1057 7 191 192 193 194 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1058 8 196 192 193 194 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1059 8 199 192 193 194 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1060 8 202 192 193 194 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1061 7 191 192 196 197 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1062 8 193 192 196 197 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1063 8 199 192 196 197 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1064 8 202 192 196 197 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1065 7 191 192 199 200 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1066 8 193 192 199 200 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1067 8 196 192 199 200 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1068 8 202 192 199 200 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1069 7 191 192 202 203 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1070 8 193 192 202 203 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1071 8 196 192 202 203 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1072 8 199 192 202 203 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1073 9 192 193 194 195 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1074 10 192 193 194 445 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1075 9 193 194 195 191 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1076 10 445 194 195 191 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1077 5 193 194 445 446 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1078 5 193 194 445 450 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1079 5 195 194 445 446 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1080 5 195 194 445 450 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1081 9 192 196 197 198 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1082 10 192 196 197 205 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1083 9 196 197 198 191 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1084 10 205 197 198 191 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1085 5 196 197 205 206 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1086 5 196 197 205 210 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1087 5 198 197 205 206 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1088 5 198 197 205 210 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1089 9 192 199 200 201 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1090 10 192 199 200 598 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1091 9 199 200 201 191 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1092 10 598 200 201 191 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1093 5 199 200 598 599 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1094 5 199 200 598 603 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1095 5 201 200 598 599 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1096 5 201 200 598 603 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1097 9 192 202 203 204 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1098 10 192 202 203 503 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1099 9 202 203 204 191 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1100 10 503 203 204 191 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1101 5 202 203 503 502 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1102 5 202 203 503 504 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1103 5 204 203 503 502 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1104 5 204 203 503 504 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1105 1 210 205 206 207 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1106 2 210 205 206 211 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1107 3 197 205 206 207 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1108 4 197 205 206 211 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1109 1 206 205 210 209 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1110 2 206 205 210 213 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1111 3 197 205 210 209 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1112 4 197 205 210 213 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1113 1 205 206 207 208 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1114 3 205 206 207 39 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1115 2 211 206 207 208 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1116 4 211 206 207 39 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1117 1 206 207 208 209 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1118 2 206 207 208 212 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1119 3 39 207 208 209 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1120 4 39 207 208 212 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1121 1 207 208 209 210 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1122 3 207 208 209 415 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1123 2 212 208 209 210 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1124 4 212 208 209 415 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1125 1 208 209 210 205 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1126 2 208 209 210 213 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1127 3 415 209 210 205 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1128 4 415 209 210 213 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1129 5 208 209 415 414 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1130 5 208 209 415 416 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1131 5 210 209 415 414 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1132 5 210 209 415 416 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1133 6 218 214 215 216 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1134 6 218 214 215 219 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1135 6 218 214 215 222 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1136 6 218 214 215 225 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1137 6 221 214 215 216 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1138 6 221 214 215 219 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1139 6 221 214 215 222 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1140 6 221 214 215 225 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1141 6 224 214 215 216 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1142 6 224 214 215 219 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1143 6 224 214 215 222 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1144 6 224 214 215 225 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1145 6 227 214 215 216 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1146 6 227 214 215 219 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1147 6 227 214 215 222 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1148 6 227 214 215 225 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1149 7 215 214 218 217 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1150 8 221 214 218 217 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1151 8 224 214 218 217 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1152 8 227 214 218 217 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1153 7 215 214 221 220 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1154 8 218 214 221 220 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1155 8 224 214 221 220 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1156 8 227 214 221 220 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1157 7 215 214 224 223 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1158 8 218 214 224 223 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1159 8 221 214 224 223 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1160 8 227 214 224 223 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1161 7 215 214 227 226 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1162 8 218 214 227 226 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1163 8 221 214 227 226 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1164 8 224 214 227 226 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1165 7 214 215 216 217 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1166 8 219 215 216 217 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1167 8 222 215 216 217 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1168 8 225 215 216 217 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1169 7 214 215 219 220 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1170 8 216 215 219 220 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1171 8 222 215 219 220 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1172 8 225 215 219 220 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1173 7 214 215 222 223 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1174 8 216 215 222 223 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1175 8 219 215 222 223 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1176 8 225 215 222 223 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1177 7 214 215 225 226 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1178 8 216 215 225 226 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1179 8 219 215 225 226 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1180 8 222 215 225 226 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1181 9 215 216 217 218 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1182 10 215 216 217 24 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1183 9 216 217 218 214 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1184 10 24 217 218 214 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1185 9 215 219 220 221 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1186 10 215 219 220 501 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1187 9 219 220 221 214 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1188 10 501 220 221 214 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1189 5 219 220 501 500 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1190 5 219 220 501 502 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1191 5 221 220 501 500 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1192 5 221 220 501 502 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1193 9 215 222 223 224 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1194 10 215 222 223 472 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1195 9 222 223 224 214 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1196 10 472 223 224 214 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1197 5 222 223 472 473 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1198 5 222 223 472 477 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1199 5 224 223 472 473 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1200 5 224 223 472 477 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1201 9 215 225 226 227 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1202 10 215 225 226 584 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1203 9 225 226 227 214 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1204 10 584 226 227 214 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1205 5 225 226 584 583 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1206 5 225 226 584 585 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1207 5 227 226 584 583 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1208 5 227 226 584 585 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1209 1 233 228 229 230 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1210 2 233 228 229 234 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1211 3 141 228 229 230 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1212 4 141 228 229 234 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1213 1 229 228 233 232 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1214 2 229 228 233 236 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1215 3 141 228 233 232 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1216 4 141 228 233 236 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1217 1 228 229 230 231 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1218 3 228 229 230 19 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1219 2 234 229 230 231 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1220 4 234 229 230 19 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1221 1 229 230 231 232 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1222 2 229 230 231 235 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1223 3 19 230 231 232 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1224 4 19 230 231 235 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1225 1 230 231 232 233 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1226 3 230 231 232 426 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1227 2 235 231 232 233 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1228 4 235 231 232 426 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1229 1 231 232 233 228 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1230 2 231 232 233 236 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1231 3 426 232 233 228 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1232 4 426 232 233 236 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1233 5 231 232 426 425 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1234 5 231 232 426 427 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1235 5 233 232 426 425 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1236 5 233 232 426 427 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1237 6 241 237 238 239 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1238 6 241 237 238 242 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1239 6 241 237 238 245 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1240 6 241 237 238 248 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1241 6 244 237 238 239 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1242 6 244 237 238 242 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1243 6 244 237 238 245 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1244 6 244 237 238 248 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1245 6 247 237 238 239 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1246 6 247 237 238 242 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1247 6 247 237 238 245 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1248 6 247 237 238 248 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1249 6 250 237 238 239 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1250 6 250 237 238 242 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1251 6 250 237 238 245 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1252 6 250 237 238 248 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1253 7 238 237 241 240 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1254 8 244 237 241 240 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1255 8 247 237 241 240 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1256 8 250 237 241 240 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1257 7 238 237 244 243 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1258 8 241 237 244 243 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1259 8 247 237 244 243 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1260 8 250 237 244 243 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1261 7 238 237 247 246 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1262 8 241 237 247 246 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1263 8 244 237 247 246 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1264 8 250 237 247 246 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1265 7 238 237 250 249 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1266 8 241 237 250 249 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1267 8 244 237 250 249 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1268 8 247 237 250 249 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1269 7 237 238 239 240 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1270 8 242 238 239 240 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1271 8 245 238 239 240 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1272 8 248 238 239 240 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1273 7 237 238 242 243 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1274 8 239 238 242 243 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1275 8 245 238 242 243 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1276 8 248 238 242 243 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1277 7 237 238 245 246 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1278 8 239 238 245 246 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1279 8 242 238 245 246 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1280 8 248 238 245 246 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1281 7 237 238 248 249 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1282 8 239 238 248 249 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1283 8 242 238 248 249 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1284 8 245 238 248 249 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1285 9 238 239 240 241 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1286 10 238 239 240 1 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1287 9 239 240 241 237 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1288 10 1 240 241 237 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1289 9 238 242 243 244 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1290 10 238 242 243 481 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1291 9 242 243 244 237 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1292 10 481 243 244 237 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1293 5 242 243 481 482 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1294 5 242 243 481 486 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1295 5 244 243 481 482 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1296 5 244 243 481 486 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1297 9 238 245 246 247 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1298 10 238 245 246 467 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1299 9 245 246 247 237 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1300 10 467 246 247 237 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1301 5 245 246 467 466 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1302 5 245 246 467 468 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1303 5 247 246 467 466 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1304 5 247 246 467 468 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1305 9 238 248 249 250 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1306 10 238 248 249 575 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1307 9 248 249 250 237 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1308 10 575 249 250 237 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1309 5 248 249 575 574 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1310 5 248 249 575 576 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1311 5 250 249 575 574 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1312 5 250 249 575 576 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1313 1 256 251 252 253 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1314 2 256 251 252 257 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1315 3 116 251 252 253 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1316 4 116 251 252 257 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1317 1 252 251 256 255 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1318 2 252 251 256 259 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1319 3 116 251 256 255 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1320 4 116 251 256 259 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1321 1 251 252 253 254 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1322 3 251 252 253 392 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1323 2 257 252 253 254 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1324 4 257 252 253 392 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1325 1 252 253 254 255 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1326 2 252 253 254 258 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1327 3 392 253 254 255 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1328 4 392 253 254 258 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1329 5 252 253 392 391 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1330 5 252 253 392 393 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1331 5 254 253 392 391 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1332 5 254 253 392 393 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1333 1 253 254 255 256 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1334 3 253 254 255 82 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1335 2 258 254 255 256 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1336 4 258 254 255 82 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1337 1 254 255 256 251 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1338 2 254 255 256 259 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1339 3 82 255 256 251 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1340 4 82 255 256 259 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1341 6 264 260 261 262 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1342 6 264 260 261 265 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1343 6 264 260 261 268 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1344 6 264 260 261 271 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1345 6 267 260 261 262 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1346 6 267 260 261 265 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1347 6 267 260 261 268 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1348 6 267 260 261 271 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1349 6 270 260 261 262 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1350 6 270 260 261 265 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1351 6 270 260 261 268 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1352 6 270 260 261 271 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1353 6 273 260 261 262 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1354 6 273 260 261 265 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1355 6 273 260 261 268 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1356 6 273 260 261 271 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1357 7 261 260 264 263 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1358 8 267 260 264 263 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1359 8 270 260 264 263 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1360 8 273 260 264 263 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1361 7 261 260 267 266 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1362 8 264 260 267 266 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1363 8 270 260 267 266 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1364 8 273 260 267 266 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1365 7 261 260 270 269 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1366 8 264 260 270 269 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1367 8 267 260 270 269 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1368 8 273 260 270 269 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1369 7 261 260 273 272 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1370 8 264 260 273 272 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1371 8 267 260 273 272 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1372 8 270 260 273 272 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1373 7 260 261 262 263 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1374 8 265 261 262 263 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1375 8 268 261 262 263 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1376 8 271 261 262 263 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1377 7 260 261 265 266 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1378 8 262 261 265 266 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1379 8 268 261 265 266 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1380 8 271 261 265 266 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1381 7 260 261 268 269 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1382 8 262 261 268 269 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1383 8 265 261 268 269 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1384 8 271 261 268 269 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1385 7 260 261 271 272 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1386 8 262 261 271 272 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1387 8 265 261 271 272 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1388 8 268 261 271 272 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1389 9 261 262 263 264 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1390 10 261 262 263 458 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1391 9 262 263 264 260 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1392 10 458 263 264 260 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1393 5 262 263 458 457 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1394 5 262 263 458 459 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1395 5 264 263 458 457 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1396 5 264 263 458 459 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1397 9 261 265 266 267 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1398 10 261 265 266 566 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1399 9 265 266 267 260 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1400 10 566 266 267 260 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1401 5 265 266 566 565 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1402 5 265 266 566 567 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1403 5 267 266 566 565 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1404 5 267 266 566 567 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1405 9 261 268 269 270 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1406 10 261 268 269 72 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1407 9 268 269 270 260 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1408 10 72 269 270 260 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1409 9 261 271 272 273 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1410 10 261 271 272 512 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1411 9 271 272 273 260 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1412 10 512 272 273 260 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1413 5 271 272 512 511 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1414 5 271 272 512 513 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1415 5 273 272 512 511 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1416 5 273 272 512 513 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1417 1 279 274 275 276 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1418 2 279 274 275 280 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1419 3 59 274 275 276 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1420 4 59 274 275 280 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1421 1 275 274 279 278 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1422 2 275 274 279 282 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1423 3 59 274 279 278 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1424 4 59 274 279 282 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1425 1 274 275 276 277 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1426 3 274 275 276 172 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1427 2 280 275 276 277 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1428 4 280 275 276 172 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1429 1 275 276 277 278 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1430 2 275 276 277 281 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1431 3 172 276 277 278 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1432 4 172 276 277 281 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1433 1 276 277 278 279 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1434 3 276 277 278 434 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1435 2 281 277 278 279 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1436 4 281 277 278 434 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1437 1 277 278 279 274 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1438 2 277 278 279 282 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1439 3 434 278 279 274 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1440 4 434 278 279 282 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1441 5 277 278 434 433 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1442 5 277 278 434 435 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1443 5 279 278 434 433 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1444 5 279 278 434 435 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1445 6 287 283 284 285 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1446 6 287 283 284 288 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1447 6 287 283 284 291 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1448 6 287 283 284 294 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1449 6 290 283 284 285 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1450 6 290 283 284 288 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1451 6 290 283 284 291 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1452 6 290 283 284 294 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1453 6 293 283 284 285 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1454 6 293 283 284 288 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1455 6 293 283 284 291 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1456 6 293 283 284 294 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1457 6 296 283 284 285 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1458 6 296 283 284 288 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1459 6 296 283 284 291 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1460 6 296 283 284 294 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1461 7 284 283 287 286 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1462 8 290 283 287 286 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1463 8 293 283 287 286 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1464 8 296 283 287 286 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1465 7 284 283 290 289 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1466 8 287 283 290 289 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1467 8 293 283 290 289 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1468 8 296 283 290 289 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1469 7 284 283 293 292 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1470 8 287 283 293 292 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1471 8 290 283 293 292 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1472 8 296 283 293 292 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1473 7 284 283 296 295 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1474 8 287 283 296 295 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1475 8 290 283 296 295 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1476 8 293 283 296 295 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1477 7 283 284 285 286 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1478 8 288 284 285 286 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1479 8 291 284 285 286 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1480 8 294 284 285 286 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1481 7 283 284 288 289 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1482 8 285 284 288 289 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1483 8 291 284 288 289 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1484 8 294 284 288 289 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1485 7 283 284 291 292 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1486 8 285 284 291 292 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1487 8 288 284 291 292 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1488 8 294 284 291 292 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1489 7 283 284 294 295 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1490 8 285 284 294 295 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1491 8 288 284 294 295 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1492 8 291 284 294 295 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1493 9 284 285 286 287 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1494 10 284 285 286 49 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1495 9 285 286 287 283 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1496 10 49 286 287 283 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1497 9 284 288 289 290 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1498 10 284 288 289 492 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1499 9 288 289 290 283 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1500 10 492 289 290 283 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1501 5 288 289 492 491 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1502 5 288 289 492 493 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1503 5 290 289 492 491 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1504 5 290 289 492 493 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1505 9 284 291 292 293 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1506 10 284 291 292 447 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1507 9 291 292 293 283 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1508 10 447 292 293 283 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1509 5 291 292 447 446 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1510 5 291 292 447 448 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1511 5 293 292 447 446 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1512 5 293 292 447 448 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1513 9 284 294 295 296 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1514 10 284 294 295 555 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1515 9 294 295 296 283 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1516 10 555 295 296 283 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1517 5 294 295 555 554 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1518 5 294 295 555 556 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1519 5 296 295 555 554 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1520 5 296 295 555 556 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1521 6 301 297 298 299 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1522 6 301 297 298 302 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1523 6 301 297 298 305 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1524 6 301 297 298 308 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1525 6 304 297 298 299 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1526 6 304 297 298 302 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1527 6 304 297 298 305 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1528 6 304 297 298 308 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1529 6 307 297 298 299 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1530 6 307 297 298 302 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1531 6 307 297 298 305 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1532 6 307 297 298 308 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1533 6 310 297 298 299 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1534 6 310 297 298 302 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1535 6 310 297 298 305 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1536 6 310 297 298 308 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1537 7 298 297 301 300 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1538 8 304 297 301 300 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1539 8 307 297 301 300 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1540 8 310 297 301 300 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1541 7 298 297 304 303 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1542 8 301 297 304 303 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1543 8 307 297 304 303 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1544 8 310 297 304 303 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1545 7 298 297 307 306 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1546 8 301 297 307 306 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1547 8 304 297 307 306 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1548 8 310 297 307 306 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1549 7 298 297 310 309 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1550 8 301 297 310 309 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1551 8 304 297 310 309 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1552 8 307 297 310 309 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1553 7 297 298 299 300 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1554 8 302 298 299 300 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1555 8 305 298 299 300 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1556 8 308 298 299 300 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1557 7 297 298 302 303 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1558 8 299 298 302 303 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1559 8 305 298 302 303 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1560 8 308 298 302 303 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1561 7 297 298 305 306 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1562 8 299 298 305 306 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1563 8 302 298 305 306 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1564 8 308 298 305 306 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1565 7 297 298 308 309 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1566 8 299 298 308 309 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1567 8 302 298 308 309 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1568 8 305 298 308 309 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1569 9 298 299 300 301 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1570 10 298 299 300 546 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1571 9 299 300 301 297 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1572 10 546 300 301 297 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1573 5 299 300 546 545 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1574 5 299 300 546 547 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1575 5 301 300 546 545 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1576 5 301 300 546 547 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1577 9 298 302 303 304 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1578 10 298 302 303 582 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1579 9 302 303 304 297 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1580 10 582 303 304 297 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1581 5 302 303 582 581 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1582 5 302 303 582 583 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1583 5 304 303 582 581 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1584 5 304 303 582 583 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1585 9 298 305 306 307 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1586 10 298 305 306 47 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1587 9 305 306 307 297 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1588 10 47 306 307 297 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1589 9 298 308 309 310 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1590 10 298 308 309 371 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1591 9 308 309 310 297 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1592 10 371 309 310 297 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1593 5 308 309 371 372 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1594 5 308 309 371 376 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1595 5 310 309 371 372 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1596 5 310 309 371 376 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1597 6 315 311 312 313 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1598 6 315 311 312 316 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1599 6 315 311 312 319 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1600 6 315 311 312 322 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1601 6 318 311 312 313 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1602 6 318 311 312 316 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1603 6 318 311 312 319 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1604 6 318 311 312 322 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1605 6 321 311 312 313 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1606 6 321 311 312 316 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1607 6 321 311 312 319 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1608 6 321 311 312 322 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1609 6 324 311 312 313 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1610 6 324 311 312 316 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1611 6 324 311 312 319 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1612 6 324 311 312 322 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1613 7 312 311 315 314 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1614 8 318 311 315 314 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1615 8 321 311 315 314 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1616 8 324 311 315 314 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1617 7 312 311 318 317 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1618 8 315 311 318 317 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1619 8 321 311 318 317 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1620 8 324 311 318 317 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1621 7 312 311 321 320 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1622 8 315 311 321 320 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1623 8 318 311 321 320 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1624 8 324 311 321 320 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1625 7 312 311 324 323 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1626 8 315 311 324 323 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1627 8 318 311 324 323 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1628 8 321 311 324 323 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1629 7 311 312 313 314 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1630 8 316 312 313 314 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1631 8 319 312 313 314 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1632 8 322 312 313 314 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1633 7 311 312 316 317 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1634 8 313 312 316 317 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1635 8 319 312 316 317 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1636 8 322 312 316 317 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1637 7 311 312 319 320 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1638 8 313 312 319 320 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1639 8 316 312 319 320 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1640 8 322 312 319 320 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1641 7 311 312 322 323 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1642 8 313 312 322 323 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1643 8 316 312 322 323 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1644 8 319 312 322 323 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1645 9 312 313 314 315 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1646 10 312 313 314 557 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1647 9 313 314 315 311 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1648 10 557 314 315 311 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1649 5 313 314 557 556 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1650 5 313 314 557 558 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1651 5 315 314 557 556 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1652 5 315 314 557 558 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1653 9 312 316 317 318 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1654 10 312 316 317 519 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1655 9 316 317 318 311 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1656 10 519 317 318 311 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1657 5 316 317 519 518 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1658 5 316 317 519 520 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1659 5 318 317 519 518 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1660 5 318 317 519 520 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1661 9 312 319 320 321 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1662 10 312 319 320 362 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1663 9 319 320 321 311 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1664 10 362 320 321 311 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1665 5 319 320 362 363 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1666 5 319 320 362 367 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1667 5 321 320 362 363 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1668 5 321 320 362 367 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1669 9 312 322 323 324 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1670 10 312 322 323 26 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1671 9 322 323 324 311 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1672 10 26 323 324 311 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1673 6 329 325 326 327 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1674 6 329 325 326 330 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1675 6 329 325 326 333 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1676 6 329 325 326 336 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1677 6 332 325 326 327 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1678 6 332 325 326 330 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1679 6 332 325 326 333 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1680 6 332 325 326 336 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1681 6 335 325 326 327 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1682 6 335 325 326 330 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1683 6 335 325 326 333 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1684 6 335 325 326 336 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1685 6 338 325 326 327 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1686 6 338 325 326 330 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1687 6 338 325 326 333 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1688 6 338 325 326 336 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1689 7 326 325 329 328 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1690 8 332 325 329 328 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1691 8 335 325 329 328 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1692 8 338 325 329 328 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1693 7 326 325 332 331 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1694 8 329 325 332 331 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1695 8 335 325 332 331 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1696 8 338 325 332 331 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1697 7 326 325 335 334 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1698 8 329 325 335 334 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1699 8 332 325 335 334 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1700 8 338 325 335 334 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1701 7 326 325 338 337 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1702 8 329 325 338 337 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1703 8 332 325 338 337 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1704 8 335 325 338 337 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1705 7 325 326 327 328 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1706 8 330 326 327 328 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1707 8 333 326 327 328 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1708 8 336 326 327 328 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1709 7 325 326 330 331 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1710 8 327 326 330 331 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1711 8 333 326 330 331 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1712 8 336 326 330 331 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1713 7 325 326 333 334 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1714 8 327 326 333 334 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1715 8 330 326 333 334 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1716 8 336 326 333 334 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1717 7 325 326 336 337 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1718 8 327 326 336 337 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1719 8 330 326 336 337 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1720 8 333 326 336 337 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1721 9 326 327 328 329 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1722 10 326 327 328 70 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1723 9 327 328 329 325 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1724 10 70 328 329 325 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1725 9 326 330 331 332 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1726 10 326 330 331 384 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1727 9 330 331 332 325 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1728 10 384 331 332 325 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1729 5 330 331 384 383 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1730 5 330 331 384 385 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1731 5 332 331 384 383 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1732 5 332 331 384 385 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1733 9 326 333 334 335 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1734 10 326 333 334 526 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1735 9 333 334 335 325 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1736 10 526 334 335 325 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1737 5 333 334 526 527 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1738 5 333 334 526 531 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1739 5 335 334 526 527 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1740 5 335 334 526 531 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1741 9 326 336 337 338 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1742 10 326 336 337 571 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1743 9 336 337 338 325 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1744 10 571 337 338 325 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1745 5 336 337 571 572 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1746 5 336 337 571 576 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1747 5 338 337 571 572 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1748 5 338 337 571 576 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1749 6 343 339 340 341 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1750 6 343 339 340 344 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1751 6 343 339 340 347 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1752 6 343 339 340 350 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1753 6 346 339 340 341 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1754 6 346 339 340 344 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1755 6 346 339 340 347 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1756 6 346 339 340 350 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1757 6 349 339 340 341 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1758 6 349 339 340 344 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1759 6 349 339 340 347 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1760 6 349 339 340 350 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1761 6 352 339 340 341 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1762 6 352 339 340 344 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1763 6 352 339 340 347 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1764 6 352 339 340 350 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1765 7 340 339 343 342 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1766 8 346 339 343 342 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1767 8 349 339 343 342 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1768 8 352 339 343 342 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1769 7 340 339 346 345 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1770 8 343 339 346 345 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1771 8 349 339 346 345 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1772 8 352 339 346 345 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1773 7 340 339 349 348 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1774 8 343 339 349 348 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1775 8 346 339 349 348 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1776 8 352 339 349 348 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1777 7 340 339 352 351 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1778 8 343 339 352 351 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1779 8 346 339 352 351 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1780 8 349 339 352 351 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1781 7 339 340 341 342 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1782 8 344 340 341 342 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1783 8 347 340 341 342 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1784 8 350 340 341 342 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1785 7 339 340 344 345 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1786 8 341 340 344 345 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1787 8 347 340 344 345 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1788 8 350 340 344 345 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1789 7 339 340 347 348 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1790 8 341 340 347 348 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1791 8 344 340 347 348 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1792 8 350 340 347 348 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1793 7 339 340 350 351 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1794 8 341 340 350 351 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1795 8 344 340 350 351 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1796 8 347 340 350 351 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1797 9 340 341 342 343 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1798 10 340 341 342 564 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1799 9 341 342 343 339 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1800 10 564 342 343 339 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1801 5 341 342 564 563 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1802 5 341 342 564 565 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1803 5 343 342 564 563 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1804 5 343 342 564 565 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1805 9 340 344 345 346 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1806 10 340 344 345 535 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1807 9 344 345 346 339 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1808 10 535 345 346 339 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1809 5 344 345 535 536 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1810 5 344 345 535 540 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1811 5 346 345 535 536 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1812 5 346 345 535 540 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1813 9 340 347 348 349 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1814 10 340 347 348 353 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1815 9 347 348 349 339 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1816 10 353 348 349 339 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1817 5 347 348 353 354 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1818 5 347 348 353 358 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1819 5 349 348 353 354 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1820 5 349 348 353 358 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1821 9 340 350 351 352 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1822 10 340 350 351 3 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1823 9 350 351 352 339 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1824 10 3 351 352 339 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1825 1 358 353 354 355 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1826 2 358 353 354 359 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1827 3 348 353 354 355 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1828 4 348 353 354 359 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1829 1 354 353 358 357 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1830 2 354 353 358 361 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1831 3 348 353 358 357 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1832 4 348 353 358 361 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1833 1 353 354 355 356 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1834 3 353 354 355 130 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1835 2 359 354 355 356 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1836 4 359 354 355 130 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1837 1 354 355 356 357 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1838 2 354 355 356 360 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1839 3 130 355 356 357 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1840 4 130 355 356 360 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1841 1 355 356 357 358 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1842 3 355 356 357 88 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1843 2 360 356 357 358 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1844 4 360 356 357 88 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1845 1 356 357 358 353 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1846 2 356 357 358 361 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1847 3 88 357 358 353 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1848 4 88 357 358 361 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1849 1 367 362 363 364 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1850 2 367 362 363 368 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1851 3 320 362 363 364 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1852 4 320 362 363 368 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1853 1 363 362 367 366 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1854 2 363 362 367 370 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1855 3 320 362 367 366 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1856 4 320 362 367 370 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1857 1 362 363 364 365 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1858 3 362 363 364 65 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1859 2 368 363 364 365 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1860 4 368 363 364 65 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1861 1 363 364 365 366 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1862 2 363 364 365 369 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1863 3 65 364 365 366 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1864 4 65 364 365 369 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1865 1 364 365 366 367 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1866 3 364 365 366 155 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1867 2 369 365 366 367 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1868 4 369 365 366 155 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1869 1 365 366 367 362 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1870 2 365 366 367 370 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1871 3 155 366 367 362 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1872 4 155 366 367 370 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1873 1 376 371 372 373 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1874 2 376 371 372 377 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1875 3 309 371 372 373 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1876 4 309 371 372 377 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1877 1 372 371 376 375 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1878 2 372 371 376 379 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1879 3 309 371 376 375 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1880 4 309 371 376 379 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1881 1 371 372 373 374 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1882 3 371 372 373 45 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1883 2 377 372 373 374 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1884 4 377 372 373 45 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1885 1 372 373 374 375 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1886 2 372 373 374 378 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1887 3 45 373 374 375 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1888 4 45 373 374 378 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1889 1 373 374 375 376 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1890 3 373 374 375 102 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1891 2 378 374 375 376 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1892 4 378 374 375 102 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1893 1 374 375 376 371 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1894 2 374 375 376 379 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1895 3 102 375 376 371 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1896 4 102 375 376 379 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1897 1 385 380 381 382 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1898 2 385 380 381 386 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1899 3 13 380 381 382 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1900 4 13 380 381 386 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1901 1 381 380 385 384 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1902 2 381 380 385 388 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1903 3 13 380 385 384 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1904 4 13 380 385 388 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1905 1 380 381 382 383 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1906 3 380 381 382 189 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1907 2 386 381 382 383 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1908 4 386 381 382 189 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1909 1 381 382 383 384 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1910 2 381 382 383 387 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1911 3 189 382 383 384 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1912 4 189 382 383 387 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1913 1 382 383 384 385 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1914 3 382 383 384 331 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1915 2 387 383 384 385 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1916 4 387 383 384 331 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1917 1 383 384 385 380 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 1918 2 383 384 385 388 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 1919 3 331 384 385 380 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1920 4 331 384 385 388 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 1921 6 393 389 390 391 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1922 6 393 389 390 394 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1923 6 393 389 390 397 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1924 6 393 389 390 400 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1925 6 396 389 390 391 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1926 6 396 389 390 394 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1927 6 396 389 390 397 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1928 6 396 389 390 400 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1929 6 399 389 390 391 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1930 6 399 389 390 394 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1931 6 399 389 390 397 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1932 6 399 389 390 400 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1933 6 402 389 390 391 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1934 6 402 389 390 394 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1935 6 402 389 390 397 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1936 6 402 389 390 400 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1937 7 390 389 393 392 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1938 8 396 389 393 392 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1939 8 399 389 393 392 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1940 8 402 389 393 392 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1941 7 390 389 396 395 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1942 8 393 389 396 395 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1943 8 399 389 396 395 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1944 8 402 389 396 395 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1945 7 390 389 399 398 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1946 8 393 389 399 398 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1947 8 396 389 399 398 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1948 8 402 389 399 398 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1949 7 390 389 402 401 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1950 8 393 389 402 401 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1951 8 396 389 402 401 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1952 8 399 389 402 401 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1953 7 389 390 391 392 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1954 8 394 390 391 392 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1955 8 397 390 391 392 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1956 8 400 390 391 392 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1957 7 389 390 394 395 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1958 8 391 390 394 395 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1959 8 397 390 394 395 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1960 8 400 390 394 395 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1961 7 389 390 397 398 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1962 8 391 390 397 398 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1963 8 394 390 397 398 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1964 8 400 390 397 398 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1965 7 389 390 400 401 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1966 8 391 390 400 401 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1967 8 394 390 400 401 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1968 8 397 390 400 401 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 1969 9 390 391 392 393 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1970 10 390 391 392 253 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1971 9 391 392 393 389 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1972 10 253 392 393 389 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1973 9 390 394 395 396 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1974 10 390 394 395 51 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1975 9 394 395 396 389 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1976 10 51 395 396 389 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1977 9 390 397 398 399 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1978 10 390 397 398 562 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1979 9 397 398 399 389 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1980 10 562 398 399 389 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1981 5 397 398 562 563 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1982 5 397 398 562 567 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1983 5 399 398 562 563 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1984 5 399 398 562 567 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1985 9 390 400 401 402 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1986 10 390 400 401 602 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1987 9 400 401 402 389 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1988 10 602 401 402 389 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 1989 5 400 401 602 601 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1990 5 400 401 602 603 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1991 5 402 401 602 601 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1992 5 402 401 602 603 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 1993 6 407 403 404 405 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1994 6 407 403 404 408 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1995 6 407 403 404 411 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1996 6 407 403 404 414 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1997 6 410 403 404 405 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1998 6 410 403 404 408 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 1999 6 410 403 404 411 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2000 6 410 403 404 414 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2001 6 413 403 404 405 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2002 6 413 403 404 408 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2003 6 413 403 404 411 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2004 6 413 403 404 414 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2005 6 416 403 404 405 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2006 6 416 403 404 408 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2007 6 416 403 404 411 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2008 6 416 403 404 414 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2009 7 404 403 407 406 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2010 8 410 403 407 406 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2011 8 413 403 407 406 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2012 8 416 403 407 406 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2013 7 404 403 410 409 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2014 8 407 403 410 409 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2015 8 413 403 410 409 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2016 8 416 403 410 409 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2017 7 404 403 413 412 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2018 8 407 403 413 412 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2019 8 410 403 413 412 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2020 8 416 403 413 412 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2021 7 404 403 416 415 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2022 8 407 403 416 415 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2023 8 410 403 416 415 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2024 8 413 403 416 415 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2025 7 403 404 405 406 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2026 8 408 404 405 406 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2027 8 411 404 405 406 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2028 8 414 404 405 406 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2029 7 403 404 408 409 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2030 8 405 404 408 409 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2031 8 411 404 408 409 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2032 8 414 404 408 409 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2033 7 403 404 411 412 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2034 8 405 404 411 412 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2035 8 408 404 411 412 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2036 8 414 404 411 412 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2037 7 403 404 414 415 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2038 8 405 404 414 415 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2039 8 408 404 414 415 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2040 8 411 404 414 415 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2041 9 404 405 406 407 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2042 10 404 405 406 620 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2043 9 405 406 407 403 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2044 10 620 406 407 403 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2045 5 405 406 620 619 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2046 5 405 406 620 621 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2047 5 407 406 620 619 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2048 5 407 406 620 621 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2049 9 404 408 409 410 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2050 10 404 408 409 580 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2051 9 408 409 410 403 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2052 10 580 409 410 403 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2053 5 408 409 580 581 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2054 5 408 409 580 585 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2055 5 410 409 580 581 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2056 5 410 409 580 585 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2057 9 404 411 412 413 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2058 10 404 411 412 5 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2059 9 411 412 413 403 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2060 10 5 412 413 403 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2061 9 404 414 415 416 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2062 10 404 414 415 209 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2063 9 414 415 416 403 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2064 10 209 415 416 403 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2065 6 421 417 418 419 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2066 6 421 417 418 422 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2067 6 421 417 418 425 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2068 6 421 417 418 428 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2069 6 424 417 418 419 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2070 6 424 417 418 422 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2071 6 424 417 418 425 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2072 6 424 417 418 428 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2073 6 427 417 418 419 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2074 6 427 417 418 422 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2075 6 427 417 418 425 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2076 6 427 417 418 428 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2077 6 430 417 418 419 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2078 6 430 417 418 422 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2079 6 430 417 418 425 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2080 6 430 417 418 428 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2081 7 418 417 421 420 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2082 8 424 417 421 420 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2083 8 427 417 421 420 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2084 8 430 417 421 420 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2085 7 418 417 424 423 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2086 8 421 417 424 423 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2087 8 427 417 424 423 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2088 8 430 417 424 423 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2089 7 418 417 427 426 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2090 8 421 417 427 426 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2091 8 424 417 427 426 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2092 8 430 417 427 426 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2093 7 418 417 430 429 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2094 8 421 417 430 429 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2095 8 424 417 430 429 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2096 8 427 417 430 429 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2097 7 417 418 419 420 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2098 8 422 418 419 420 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2099 8 425 418 419 420 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2100 8 428 418 419 420 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2101 7 417 418 422 423 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2102 8 419 418 422 423 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2103 8 425 418 422 423 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2104 8 428 418 422 423 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2105 7 417 418 425 426 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2106 8 419 418 425 426 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2107 8 422 418 425 426 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2108 8 428 418 425 426 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2109 7 417 418 428 429 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2110 8 419 418 428 429 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2111 8 422 418 428 429 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2112 8 425 418 428 429 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2113 9 418 419 420 421 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2114 10 418 419 420 573 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2115 9 419 420 421 417 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2116 10 573 420 421 417 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2117 5 419 420 573 572 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2118 5 419 420 573 574 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2119 5 421 420 573 572 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2120 5 421 420 573 574 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2121 9 418 422 423 424 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2122 10 418 422 423 607 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2123 9 422 423 424 417 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2124 10 607 423 424 417 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2125 5 422 423 607 608 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2126 5 422 423 607 612 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2127 5 424 423 607 608 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2128 5 424 423 607 612 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2129 9 418 425 426 427 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2130 10 418 425 426 232 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2131 9 425 426 427 417 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2132 10 232 426 427 417 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2133 9 418 428 429 430 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2134 10 418 428 429 28 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2135 9 428 429 430 417 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2136 10 28 429 430 417 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2137 6 435 431 432 433 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2138 6 435 431 432 436 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2139 6 435 431 432 439 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2140 6 435 431 432 442 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2141 6 438 431 432 433 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2142 6 438 431 432 436 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2143 6 438 431 432 439 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2144 6 438 431 432 442 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2145 6 441 431 432 433 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2146 6 441 431 432 436 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2147 6 441 431 432 439 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2148 6 441 431 432 442 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2149 6 444 431 432 433 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2150 6 444 431 432 436 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2151 6 444 431 432 439 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2152 6 444 431 432 442 # ('cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW',) + 2153 7 432 431 435 434 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2154 8 438 431 435 434 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2155 8 441 431 435 434 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2156 8 444 431 435 434 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2157 7 432 431 438 437 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2158 8 435 431 438 437 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2159 8 441 431 438 437 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2160 8 444 431 438 437 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2161 7 432 431 441 440 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2162 8 435 431 441 440 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2163 8 438 431 441 440 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2164 8 444 431 441 440 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2165 7 432 431 444 443 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2166 8 435 431 444 443 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2167 8 438 431 444 443 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2168 8 441 431 444 443 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2169 7 431 432 433 434 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2170 8 436 432 433 434 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2171 8 439 432 433 434 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2172 8 442 432 433 434 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2173 7 431 432 436 437 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2174 8 433 432 436 437 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2175 8 439 432 436 437 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2176 8 442 432 436 437 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2177 7 431 432 439 440 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2178 8 433 432 439 440 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2179 8 436 432 439 440 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2180 8 442 432 439 440 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2181 7 431 432 442 443 # ('cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2182 8 433 432 442 443 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2183 8 436 432 442 443 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2184 8 439 432 442 443 # ('cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW',) + 2185 9 432 433 434 435 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2186 10 432 433 434 278 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2187 9 433 434 435 431 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2188 10 278 434 435 431 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2189 9 432 436 437 438 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2190 10 432 436 437 74 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2191 9 436 437 438 431 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2192 10 74 437 438 431 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2193 9 432 439 440 441 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2194 10 432 439 440 553 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2195 9 439 440 441 431 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2196 10 553 440 441 431 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2197 5 439 440 553 554 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2198 5 439 440 553 558 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2199 5 441 440 553 554 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2200 5 441 440 553 558 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2201 9 432 442 443 444 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2202 10 432 442 443 589 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2203 9 442 443 444 431 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2204 10 589 443 444 431 # ('cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW',) + 2205 5 442 443 589 590 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2206 5 442 443 589 594 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2207 5 444 443 589 590 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2208 5 444 443 589 594 # ('cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW',) + 2209 1 450 445 446 447 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2210 2 450 445 446 451 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2211 3 194 445 446 447 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2212 4 194 445 446 451 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2213 1 446 445 450 449 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2214 2 446 445 450 453 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2215 3 194 445 450 449 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2216 4 194 445 450 453 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2217 1 445 446 447 448 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2218 3 445 446 447 292 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2219 2 451 446 447 448 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2220 4 451 446 447 292 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2221 1 446 447 448 449 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2222 2 446 447 448 452 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2223 3 292 447 448 449 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2224 4 292 447 448 452 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2225 1 447 448 449 450 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2226 3 447 448 449 133 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2227 2 452 448 449 450 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2228 4 452 448 449 133 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2229 1 448 449 450 445 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2230 2 448 449 450 453 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2231 3 133 449 450 445 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2232 4 133 449 450 453 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2233 1 459 454 455 456 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2234 2 459 454 455 460 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2235 3 152 454 455 456 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2236 4 152 454 455 460 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2237 1 455 454 459 458 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2238 2 455 454 459 462 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2239 3 152 454 459 458 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2240 4 152 454 459 462 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2241 1 454 455 456 457 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2242 3 454 455 456 138 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2243 2 460 455 456 457 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2244 4 460 455 456 138 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2245 1 455 456 457 458 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2246 2 455 456 457 461 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2247 3 138 456 457 458 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2248 4 138 456 457 461 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2249 1 456 457 458 459 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2250 3 456 457 458 263 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2251 2 461 457 458 459 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2252 4 461 457 458 263 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2253 1 457 458 459 454 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2254 2 457 458 459 462 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2255 3 263 458 459 454 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2256 4 263 458 459 462 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2257 1 468 463 464 465 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2258 2 468 463 464 469 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2259 3 105 463 464 465 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2260 4 105 463 464 469 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2261 1 464 463 468 467 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2262 2 464 463 468 471 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2263 3 105 463 468 467 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2264 4 105 463 468 471 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2265 1 463 464 465 466 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2266 3 463 464 465 119 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2267 2 469 464 465 466 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2268 4 469 464 465 119 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2269 1 464 465 466 467 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2270 2 464 465 466 470 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2271 3 119 465 466 467 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2272 4 119 465 466 470 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2273 1 465 466 467 468 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2274 3 465 466 467 246 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2275 2 470 466 467 468 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2276 4 470 466 467 246 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2277 1 466 467 468 463 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2278 2 466 467 468 471 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2279 3 246 467 468 463 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2280 4 246 467 468 471 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2281 1 477 472 473 474 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2282 2 477 472 473 478 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2283 3 223 472 473 474 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2284 4 223 472 473 478 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2285 1 473 472 477 476 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2286 2 473 472 477 480 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2287 3 223 472 477 476 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2288 4 223 472 477 480 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2289 1 472 473 474 475 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2290 3 472 473 474 186 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2291 2 478 473 474 475 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2292 4 478 473 474 186 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2293 1 473 474 475 476 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2294 2 473 474 475 479 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2295 3 186 474 475 476 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2296 4 186 474 475 479 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2297 1 474 475 476 477 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2298 3 474 475 476 175 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2299 2 479 475 476 477 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2300 4 479 475 476 175 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2301 1 475 476 477 472 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2302 2 475 476 477 480 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2303 3 175 476 477 472 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2304 4 175 476 477 480 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2305 1 486 481 482 483 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2306 2 486 481 482 487 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2307 3 243 481 482 483 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2308 4 243 481 482 487 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2309 1 482 481 486 485 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2310 2 482 481 486 489 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2311 3 243 481 486 485 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2312 4 243 481 486 489 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2313 1 481 482 483 484 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2314 3 481 482 483 147 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2315 2 487 482 483 484 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2316 4 487 482 483 147 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2317 1 482 483 484 485 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2318 2 482 483 484 488 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2319 3 147 483 484 485 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2320 4 147 483 484 488 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2321 1 483 484 485 486 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2322 3 483 484 485 183 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2323 2 488 484 485 486 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2324 4 488 484 485 183 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2325 1 484 485 486 481 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2326 2 484 485 486 489 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2327 3 183 485 486 481 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2328 4 183 485 486 489 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2329 1 495 490 491 492 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2330 2 495 490 491 496 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2331 3 161 490 491 492 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2332 4 161 490 491 496 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2333 1 491 490 495 494 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2334 2 491 490 495 498 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2335 3 161 490 495 494 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2336 4 161 490 495 498 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2337 1 490 491 492 493 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2338 3 490 491 492 289 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2339 2 496 491 492 493 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2340 4 496 491 492 289 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2341 1 491 492 493 494 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2342 2 491 492 493 497 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2343 3 289 492 493 494 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2344 4 289 492 493 497 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2345 1 492 493 494 495 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2346 3 492 493 494 166 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2347 2 497 493 494 495 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2348 4 497 493 494 166 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2349 1 493 494 495 490 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2350 2 493 494 495 498 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2351 3 166 494 495 490 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2352 4 166 494 495 498 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2353 1 504 499 500 501 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2354 2 504 499 500 505 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2355 3 96 499 500 501 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2356 4 96 499 500 505 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2357 1 500 499 504 503 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2358 2 500 499 504 507 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2359 3 96 499 504 503 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2360 4 96 499 504 507 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2361 1 499 500 501 502 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2362 3 499 500 501 220 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2363 2 505 500 501 502 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2364 4 505 500 501 220 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2365 1 500 501 502 503 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2366 2 500 501 502 506 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2367 3 220 501 502 503 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2368 4 220 501 502 506 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2369 1 501 502 503 504 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2370 3 501 502 503 203 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2371 2 506 502 503 504 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2372 4 506 502 503 203 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2373 1 502 503 504 499 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2374 2 502 503 504 507 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2375 3 203 503 504 499 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2376 4 203 503 504 507 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2377 1 513 508 509 510 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2378 2 513 508 509 514 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2379 3 110 508 509 510 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2380 4 110 508 509 514 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2381 1 509 508 513 512 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2382 2 509 508 513 516 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2383 3 110 508 513 512 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2384 4 110 508 513 516 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2385 1 508 509 510 511 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2386 3 508 509 510 124 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2387 2 514 509 510 511 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2388 4 514 509 510 124 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2389 1 509 510 511 512 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2390 2 509 510 511 515 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2391 3 124 510 511 512 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2392 4 124 510 511 515 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2393 1 510 511 512 513 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2394 3 510 511 512 272 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2395 2 515 511 512 513 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2396 4 515 511 512 272 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2397 1 511 512 513 508 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2398 2 511 512 513 516 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2399 3 272 512 513 508 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2400 4 272 512 513 516 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2401 1 522 517 518 519 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2402 2 522 517 518 523 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2403 3 180 517 518 519 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2404 4 180 517 518 523 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2405 1 518 517 522 521 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2406 2 518 517 522 525 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2407 3 180 517 522 521 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2408 4 180 517 522 525 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2409 1 517 518 519 520 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2410 3 517 518 519 317 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2411 2 523 518 519 520 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2412 4 523 518 519 317 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2413 1 518 519 520 521 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2414 2 518 519 520 524 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2415 3 317 519 520 521 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2416 4 317 519 520 524 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2417 1 519 520 521 522 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2418 3 519 520 521 36 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2419 2 524 520 521 522 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2420 4 524 520 521 36 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2421 1 520 521 522 517 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2422 2 520 521 522 525 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2423 3 36 521 522 517 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2424 4 36 521 522 525 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2425 1 531 526 527 528 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2426 2 531 526 527 532 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2427 3 334 526 527 528 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2428 4 334 526 527 532 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2429 1 527 526 531 530 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2430 2 527 526 531 534 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2431 3 334 526 531 530 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2432 4 334 526 531 534 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2433 1 526 527 528 529 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2434 3 526 527 528 85 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2435 2 532 527 528 529 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2436 4 532 527 528 85 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2437 1 527 528 529 530 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2438 2 527 528 529 533 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2439 3 85 528 529 530 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2440 4 85 528 529 533 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2441 1 528 529 530 531 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2442 3 528 529 530 158 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2443 2 533 529 530 531 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2444 4 533 529 530 158 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2445 1 529 530 531 526 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2446 2 529 530 531 534 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2447 3 158 530 531 526 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2448 4 158 530 531 534 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2449 1 540 535 536 537 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2450 2 540 535 536 541 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2451 3 345 535 536 537 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2452 4 345 535 536 541 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2453 1 536 535 540 539 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2454 2 536 535 540 543 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2455 3 345 535 540 539 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2456 4 345 535 540 543 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2457 1 535 536 537 538 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2458 3 535 536 537 22 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2459 2 541 536 537 538 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2460 4 541 536 537 22 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2461 1 536 537 538 539 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2462 2 536 537 538 542 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2463 3 22 537 538 539 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2464 4 22 537 538 542 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2465 1 537 538 539 540 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2466 3 537 538 539 99 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2467 2 542 538 539 540 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2468 4 542 538 539 99 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2469 1 538 539 540 535 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2470 2 538 539 540 543 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2471 3 99 539 540 535 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2472 4 99 539 540 543 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2473 1 549 544 545 546 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2474 2 549 544 545 550 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2475 3 127 544 545 546 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2476 4 127 544 545 550 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2477 1 545 544 549 548 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2478 2 545 544 549 552 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2479 3 127 544 549 548 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2480 4 127 544 549 552 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2481 1 544 545 546 547 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2482 3 544 545 546 300 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2483 2 550 545 546 547 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2484 4 550 545 546 300 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2485 1 545 546 547 548 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2486 2 545 546 547 551 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2487 3 300 546 547 548 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2488 4 300 546 547 551 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2489 1 546 547 548 549 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2490 3 546 547 548 62 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2491 2 551 547 548 549 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2492 4 551 547 548 62 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2493 1 547 548 549 544 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2494 2 547 548 549 552 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2495 3 62 548 549 544 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2496 4 62 548 549 552 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2497 1 558 553 554 555 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2498 2 558 553 554 559 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2499 3 440 553 554 555 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2500 4 440 553 554 559 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2501 1 554 553 558 557 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2502 2 554 553 558 561 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2503 3 440 553 558 557 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2504 4 440 553 558 561 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2505 1 553 554 555 556 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2506 3 553 554 555 295 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2507 2 559 554 555 556 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2508 4 559 554 555 295 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2509 1 554 555 556 557 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2510 2 554 555 556 560 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2511 3 295 555 556 557 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2512 4 295 555 556 560 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2513 1 555 556 557 558 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2514 3 555 556 557 314 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2515 2 560 556 557 558 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2516 4 560 556 557 314 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2517 1 556 557 558 553 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2518 2 556 557 558 561 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2519 3 314 557 558 553 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2520 4 314 557 558 561 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2521 1 567 562 563 564 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2522 2 567 562 563 568 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2523 3 398 562 563 564 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2524 4 398 562 563 568 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2525 1 563 562 567 566 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2526 2 563 562 567 570 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2527 3 398 562 567 566 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2528 4 398 562 567 570 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2529 1 562 563 564 565 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2530 3 562 563 564 342 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2531 2 568 563 564 565 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2532 4 568 563 564 342 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2533 1 563 564 565 566 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2534 2 563 564 565 569 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2535 3 342 564 565 566 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2536 4 342 564 565 569 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2537 1 564 565 566 567 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2538 3 564 565 566 266 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2539 2 569 565 566 567 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2540 4 569 565 566 266 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2541 1 565 566 567 562 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2542 2 565 566 567 570 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2543 3 266 566 567 562 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2544 4 266 566 567 570 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2545 1 576 571 572 573 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2546 2 576 571 572 577 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2547 3 337 571 572 573 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2548 4 337 571 572 577 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2549 1 572 571 576 575 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2550 2 572 571 576 579 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2551 3 337 571 576 575 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2552 4 337 571 576 579 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2553 1 571 572 573 574 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2554 3 571 572 573 420 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2555 2 577 572 573 574 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2556 4 577 572 573 420 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2557 1 572 573 574 575 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2558 2 572 573 574 578 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2559 3 420 573 574 575 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2560 4 420 573 574 578 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2561 1 573 574 575 576 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2562 3 573 574 575 249 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2563 2 578 574 575 576 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2564 4 578 574 575 249 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2565 1 574 575 576 571 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2566 2 574 575 576 579 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2567 3 249 575 576 571 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2568 4 249 575 576 579 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2569 1 585 580 581 582 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2570 2 585 580 581 586 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2571 3 409 580 581 582 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2572 4 409 580 581 586 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2573 1 581 580 585 584 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2574 2 581 580 585 588 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2575 3 409 580 585 584 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2576 4 409 580 585 588 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2577 1 580 581 582 583 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2578 3 580 581 582 303 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2579 2 586 581 582 583 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2580 4 586 581 582 303 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2581 1 581 582 583 584 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2582 2 581 582 583 587 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2583 3 303 582 583 584 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2584 4 303 582 583 587 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2585 1 582 583 584 585 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2586 3 582 583 584 226 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2587 2 587 583 584 585 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2588 4 587 583 584 226 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2589 1 583 584 585 580 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2590 2 583 584 585 588 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2591 3 226 584 585 580 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2592 4 226 584 585 588 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2593 1 594 589 590 591 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2594 2 594 589 590 595 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2595 3 443 589 590 591 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2596 4 443 589 590 595 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2597 1 590 589 594 593 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2598 2 590 589 594 597 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2599 3 443 589 594 593 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2600 4 443 589 594 597 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2601 1 589 590 591 592 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2602 3 589 590 591 91 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2603 2 595 590 591 592 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2604 4 595 590 591 91 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2605 1 590 591 592 593 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2606 2 590 591 592 596 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2607 3 91 591 592 593 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2608 4 91 591 592 596 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2609 1 591 592 593 594 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2610 3 591 592 593 144 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2611 2 596 592 593 594 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2612 4 596 592 593 144 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2613 1 592 593 594 589 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2614 2 592 593 594 597 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2615 3 144 593 594 589 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2616 4 144 593 594 597 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2617 1 603 598 599 600 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2618 2 603 598 599 604 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2619 3 200 598 599 600 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2620 4 200 598 599 604 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2621 1 599 598 603 602 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2622 2 599 598 603 606 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2623 3 200 598 603 602 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2624 4 200 598 603 606 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2625 1 598 599 600 601 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2626 3 598 599 600 68 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2627 2 604 599 600 601 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2628 4 604 599 600 68 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2629 1 599 600 601 602 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2630 2 599 600 601 605 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2631 3 68 600 601 602 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2632 4 68 600 601 605 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2633 1 600 601 602 603 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2634 3 600 601 602 401 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2635 2 605 601 602 603 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2636 4 605 601 602 401 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2637 1 601 602 603 598 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2638 2 601 602 603 606 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2639 3 401 602 603 598 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2640 4 401 602 603 606 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2641 1 612 607 608 609 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2642 2 612 607 608 613 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2643 3 423 607 608 609 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2644 4 423 607 608 613 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2645 1 608 607 612 611 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2646 2 608 607 612 615 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2647 3 423 607 612 611 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2648 4 423 607 612 615 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2649 1 607 608 609 610 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2650 3 607 608 609 42 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2651 2 613 608 609 610 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2652 4 613 608 609 42 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2653 1 608 609 610 611 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2654 2 608 609 610 614 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2655 3 42 609 610 611 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2656 4 42 609 610 614 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2657 1 609 610 611 612 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2658 3 609 610 611 169 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2659 2 614 610 611 612 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2660 4 614 610 611 169 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2661 1 610 611 612 607 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2662 2 610 611 612 615 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2663 3 169 611 612 607 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2664 4 169 611 612 615 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2665 1 621 616 617 618 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2666 2 621 616 617 622 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2667 3 113 616 617 618 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2668 4 113 616 617 622 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2669 1 617 616 621 620 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2670 2 617 616 621 624 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2671 3 113 616 621 620 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2672 4 113 616 621 624 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2673 1 616 617 618 619 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2674 3 616 617 618 16 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2675 2 622 617 618 619 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2676 4 622 617 618 16 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2677 1 617 618 619 620 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2678 2 617 618 619 623 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2679 3 16 618 619 620 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2680 4 16 618 619 623 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2681 1 618 619 620 621 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2682 3 618 619 620 406 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2683 2 623 619 620 621 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2684 4 623 619 620 406 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2685 1 619 620 621 616 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene',) + 2686 2 619 620 621 624 # ('cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene',) + 2687 3 406 620 621 616 # ('cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + 2688 4 406 620 621 624 # ('cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW',) + +Impropers + + 1 1 1 2 6 240 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 2 2 2 1 3 7 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 3 1 3 2 4 351 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 4 2 4 3 5 8 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 5 1 5 4 6 412 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 6 2 6 1 5 9 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 7 3 13 12 14 380 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 8 3 16 15 17 618 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 9 3 19 18 20 230 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 10 3 22 21 23 537 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 11 1 24 25 29 217 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 12 2 25 24 26 30 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 13 1 26 25 27 323 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 14 2 27 26 28 31 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 15 1 28 27 29 429 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 16 2 29 24 28 32 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 17 3 36 35 37 521 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 18 3 39 38 40 207 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 19 3 42 41 43 609 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 20 3 45 44 46 373 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 21 1 47 48 52 306 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 22 2 48 47 49 53 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 23 1 49 48 50 286 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 24 2 50 49 51 54 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 25 1 51 50 52 395 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 26 2 52 47 51 55 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 27 3 59 58 60 274 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 28 3 62 61 63 548 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 29 3 65 64 66 364 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 30 3 68 67 69 600 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 31 1 70 71 75 328 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 32 2 71 70 72 76 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 33 1 72 71 73 269 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 34 2 73 72 74 77 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 35 1 74 73 75 437 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 36 2 75 70 74 78 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 37 3 82 81 83 255 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 38 3 85 84 86 528 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 39 3 88 87 89 357 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 40 3 91 90 92 591 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 41 3 96 95 97 499 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 42 3 99 98 100 539 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 43 3 102 101 103 375 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 44 3 105 104 106 463 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 45 3 110 109 111 508 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 46 3 113 112 114 616 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 47 3 116 115 117 251 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 48 3 119 118 120 465 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 49 3 124 123 125 510 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 50 3 127 126 128 544 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 51 3 130 129 131 355 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 52 3 133 132 134 449 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 53 3 138 137 139 456 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 54 3 141 140 142 228 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 55 3 144 143 145 593 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 56 3 147 146 148 483 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 57 3 152 151 153 454 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 58 3 155 154 156 366 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 59 3 158 157 159 530 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 60 3 161 160 162 490 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 61 3 166 165 167 494 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 62 3 169 168 170 611 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 63 3 172 171 173 276 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 64 3 175 174 176 476 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 65 3 180 179 181 517 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 66 3 183 182 184 485 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 67 3 186 185 187 474 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 68 3 189 188 190 382 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 69 3 194 193 195 445 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 70 3 197 196 198 205 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 71 3 200 199 201 598 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 72 3 203 202 204 503 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 73 1 205 206 210 197 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 74 2 206 205 207 211 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 75 1 207 206 208 39 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 76 2 208 207 209 212 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 77 1 209 208 210 415 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 78 2 210 205 209 213 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 79 3 217 216 218 24 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 80 3 220 219 221 501 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 81 3 223 222 224 472 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 82 3 226 225 227 584 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 83 1 228 229 233 141 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 84 2 229 228 230 234 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 85 1 230 229 231 19 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 86 2 231 230 232 235 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 87 1 232 231 233 426 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 88 2 233 228 232 236 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 89 3 240 239 241 1 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 90 3 243 242 244 481 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 91 3 246 245 247 467 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 92 3 249 248 250 575 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 93 1 251 252 256 116 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 94 2 252 251 253 257 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 95 1 253 252 254 392 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 96 2 254 253 255 258 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 97 1 255 254 256 82 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 98 2 256 251 255 259 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 99 3 263 262 264 458 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 100 3 266 265 267 566 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 101 3 269 268 270 72 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 102 3 272 271 273 512 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 103 1 274 275 279 59 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 104 2 275 274 276 280 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 105 1 276 275 277 172 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 106 2 277 276 278 281 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 107 1 278 277 279 434 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 108 2 279 274 278 282 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 109 3 286 285 287 49 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 110 3 289 288 290 492 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 111 3 292 291 293 447 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 112 3 295 294 296 555 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 113 3 300 299 301 546 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 114 3 303 302 304 582 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 115 3 306 305 307 47 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 116 3 309 308 310 371 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 117 3 314 313 315 557 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 118 3 317 316 318 519 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 119 3 320 319 321 362 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 120 3 323 322 324 26 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 121 3 328 327 329 70 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 122 3 331 330 332 384 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 123 3 334 333 335 526 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 124 3 337 336 338 571 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 125 3 342 341 343 564 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 126 3 345 344 346 535 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 127 3 348 347 349 353 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 128 3 351 350 352 3 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 129 1 353 354 358 348 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 130 2 354 353 355 359 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 131 1 355 354 356 130 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 132 2 356 355 357 360 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 133 1 357 356 358 88 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 134 2 358 353 357 361 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 135 1 362 363 367 320 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 136 2 363 362 364 368 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 137 1 364 363 365 65 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 138 2 365 364 366 369 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 139 1 366 365 367 155 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 140 2 367 362 366 370 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 141 1 371 372 376 309 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 142 2 372 371 373 377 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 143 1 373 372 374 45 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 144 2 374 373 375 378 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 145 1 375 374 376 102 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 146 2 376 371 375 379 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 147 1 380 381 385 13 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 148 2 381 380 382 386 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 149 1 382 381 383 189 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 150 2 383 382 384 387 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 151 1 384 383 385 331 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 152 2 385 380 384 388 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 153 3 392 391 393 253 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 154 3 395 394 396 51 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 155 3 398 397 399 562 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 156 3 401 400 402 602 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 157 3 406 405 407 620 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 158 3 409 408 410 580 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 159 3 412 411 413 5 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 160 3 415 414 416 209 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 161 3 420 419 421 573 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 162 3 423 422 424 607 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 163 3 426 425 427 232 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 164 3 429 428 430 28 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 165 3 434 433 435 278 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 166 3 437 436 438 74 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 167 3 440 439 441 553 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 168 3 443 442 444 589 # ['harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW'] + 169 1 445 446 450 194 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 170 2 446 445 447 451 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 171 1 447 446 448 292 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 172 2 448 447 449 452 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 173 1 449 448 450 133 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 174 2 450 445 449 453 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 175 1 454 455 459 152 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 176 2 455 454 456 460 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 177 1 456 455 457 138 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 178 2 457 456 458 461 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 179 1 458 457 459 263 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 180 2 459 454 458 462 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 181 1 463 464 468 105 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 182 2 464 463 465 469 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 183 1 465 464 466 119 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 184 2 466 465 467 470 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 185 1 467 466 468 246 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 186 2 468 463 467 471 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 187 1 472 473 477 223 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 188 2 473 472 474 478 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 189 1 474 473 475 186 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 190 2 475 474 476 479 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 191 1 476 475 477 175 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 192 2 477 472 476 480 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 193 1 481 482 486 243 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 194 2 482 481 483 487 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 195 1 483 482 484 147 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 196 2 484 483 485 488 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 197 1 485 484 486 183 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 198 2 486 481 485 489 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 199 1 490 491 495 161 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 200 2 491 490 492 496 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 201 1 492 491 493 289 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 202 2 493 492 494 497 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 203 1 494 493 495 166 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 204 2 495 490 494 498 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 205 1 499 500 504 96 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 206 2 500 499 501 505 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 207 1 501 500 502 220 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 208 2 502 501 503 506 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 209 1 503 502 504 203 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 210 2 504 499 503 507 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 211 1 508 509 513 110 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 212 2 509 508 510 514 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 213 1 510 509 511 124 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 214 2 511 510 512 515 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 215 1 512 511 513 272 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 216 2 513 508 512 516 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 217 1 517 518 522 180 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 218 2 518 517 519 523 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 219 1 519 518 520 317 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 220 2 520 519 521 524 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 221 1 521 520 522 36 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 222 2 522 517 521 525 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 223 1 526 527 531 334 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 224 2 527 526 528 532 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 225 1 528 527 529 85 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 226 2 529 528 530 533 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 227 1 530 529 531 158 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 228 2 531 526 530 534 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 229 1 535 536 540 345 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 230 2 536 535 537 541 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 231 1 537 536 538 22 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 232 2 538 537 539 542 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 233 1 539 538 540 99 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 234 2 540 535 539 543 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 235 1 544 545 549 127 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 236 2 545 544 546 550 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 237 1 546 545 547 300 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 238 2 547 546 548 551 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 239 1 548 547 549 62 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 240 2 549 544 548 552 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 241 1 553 554 558 440 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 242 2 554 553 555 559 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 243 1 555 554 556 295 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 244 2 556 555 557 560 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 245 1 557 556 558 314 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 246 2 558 553 557 561 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 247 1 562 563 567 398 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 248 2 563 562 564 568 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 249 1 564 563 565 342 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 250 2 565 564 566 569 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 251 1 566 565 567 266 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 252 2 567 562 566 570 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 253 1 571 572 576 337 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 254 2 572 571 573 577 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 255 1 573 572 574 420 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 256 2 574 573 575 578 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 257 1 575 574 576 249 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 258 2 576 571 575 579 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 259 1 580 581 585 409 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 260 2 581 580 582 586 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 261 1 582 581 583 303 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 262 2 583 582 584 587 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 263 1 584 583 585 226 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 264 2 585 580 584 588 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 265 1 589 590 594 443 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 266 2 590 589 591 595 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 267 1 591 590 592 91 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 268 2 592 591 593 596 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 269 1 593 592 594 144 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 270 2 594 589 593 597 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 271 1 598 599 603 200 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 272 2 599 598 600 604 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 273 1 600 599 601 68 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 274 2 601 600 602 605 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 275 1 602 601 603 401 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 276 2 603 598 602 606 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 277 1 607 608 612 423 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 278 2 608 607 609 613 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 279 1 609 608 610 42 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 280 2 610 609 611 614 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 281 1 611 610 612 169 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 282 2 612 607 611 615 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 283 1 616 617 621 113 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 284 2 617 616 618 622 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 285 1 618 617 619 16 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 286 2 619 618 620 623 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + 287 1 620 619 621 406 # ['harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW'] + 288 2 621 616 620 624 # ['harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene'] + diff --git a/examples/USER/mofff/in.hkust1 b/examples/USER/mofff/in.hkust1 new file mode 100644 index 0000000000..cd37cbeb89 --- /dev/null +++ b/examples/USER/mofff/in.hkust1 @@ -0,0 +1,93 @@ +clear +units real +boundary p p p +atom_style full +read_data hkust1.data + +neighbor 2.0 bin + + +# ------------------------ MOF-FF FORCE FIELD ------------------------------ + +pair_style buck6d/coul/gauss/dsf 0.9000 12.0000 + +pair_coeff 1 1 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW +pair_coeff 1 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 1 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 1 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 1 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 1 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 2 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 2 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 2 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 2 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 2 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 3 3 3680 4 32.805 0.10690769 0.9771554 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 3 4 14157.243 3.1914894 489.18197 2.5231391 0.45538909 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 3 5 6320.6076 3.6144578 103.50278 0.44181916 0.75109952 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 3 6 6157.8178 3.4883721 124.7792 0.72632262 0.73006542 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 4 4 54464 2.6548673 5679.4311 33.208515 0.34105936 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 4 5 24315.863 2.9411765 1371.5617 7.9168726 0.42457748 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 4 6 23689.598 2.8571429 1590.0769 11.87959 0.42066711 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 5 5 10856 3.2967033 308.7755 1.6022517 0.63272774 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 5 6 10576.399 3.1914894 365.45138 2.5231391 0.61999948 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 6 6 10304 3.0927835 429.89352 3.9170177 0.60800971 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +bond_style hybrid class2 morse + +bond_coeff 5 morse 50.000000 1.451345 1.914000 # morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +bond_coeff 4 class2 2.536000 75.465060 -192.435903 286.248406 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW +bond_coeff 3 class2 1.094000 390.634200 -996.117210 1481.724350 # mm3->(c3_c2h1@ph,h1_c1@ph)|benzene +bond_coeff 6 class2 1.278000 585.591600 -1493.258580 2221.222138 # mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW +bond_coeff 1 class2 1.394000 509.335200 -1298.804760 1931.972080 # mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene +bond_coeff 2 class2 1.485000 360.635220 -919.619811 1367.934469 # mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW + +angle_style hybrid class2/p6 cosine/buck6d + +angle_coeff 2 class2/p6 117.711000 57.408120 -46.049402 10.553745 -7.558563 13.610890 # mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +angle_coeff 2 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 2 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 6 class2/p6 126.814000 13.740540 -11.021849 2.526022 -1.809130 3.257744 # mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +angle_coeff 6 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 6 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 7 class2/p6 123.490000 111.075360 -89.098091 20.419778 -14.624589 26.334856 # mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 7 class2/p6 bb 14.244120 1.278000 1.278000 +angle_coeff 7 class2/p6 ba 3.309240 3.309240 1.278000 1.278000 +angle_coeff 1 class2/p6 127.050000 53.307540 -42.760159 9.799907 -7.018666 12.638684 # mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +angle_coeff 1 class2/p6 bb 71.796120 1.394000 1.394000 +angle_coeff 1 class2/p6 ba 6.762360 6.762360 1.394000 1.394000 +angle_coeff 4 class2/p6 84.336000 29.351520 -23.544055 5.395900 -3.864529 6.958951 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +angle_coeff 4 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 4 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 3 class2/p6 120.350000 36.185820 -29.026127 6.652298 -4.764358 8.579296 # mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +angle_coeff 3 class2/p6 bb 93.378120 1.394000 1.094000 +angle_coeff 3 class2/p6 ba -25.179000 53.523360 1.394000 1.094000 +angle_coeff 8 class2/p6 115.098000 79.493700 -63.765149 14.613896 -10.466432 18.847160 # mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 8 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 8 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 5 cosine/buck6d 1.978350 4 180.000000 # fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW + +dihedral_style opls + +dihedral_coeff 3 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 9 0.000000 4.528000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 8 0.000000 0.000000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW +dihedral_coeff 5 0.000000 1.741000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +dihedral_coeff 2 0.000000 6.316000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +dihedral_coeff 1 0.000000 4.379000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +dihedral_coeff 6 0.000000 0.000000 0.000000 0.609000 # cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +dihedral_coeff 4 0.000000 0.000000 0.000000 0.000000 # cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 10 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 7 0.000000 0.000000 0.000000 0.000000 # cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW + +improper_style inversion/harmonic + +improper_coeff 1 18.776340 0.000000 # harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW +improper_coeff 3 41.005800 0.000000 # harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW +improper_coeff 2 4.100580 0.000000 # harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene + +special_bonds lj 0.0 0.0 1.0 coul 1.0 1.0 1.0 + +# ------------------------ MOF-FF FORCE FIELD END -------------------------- + +run 0 diff --git a/examples/USER/mofff/in.hkust1_long b/examples/USER/mofff/in.hkust1_long new file mode 100644 index 0000000000..5c1c7426ff --- /dev/null +++ b/examples/USER/mofff/in.hkust1_long @@ -0,0 +1,94 @@ +clear +units real +boundary p p p +atom_style full +read_data hkust1.data + +neighbor 2.0 bin + + +# ------------------------ MOF-FF FORCE FIELD ------------------------------ +kspace_style ewald 1.0e-6 + +pair_style buck6d/coul/gauss/long 0.9 0.9 12.0000 + +pair_coeff 1 1 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW +pair_coeff 1 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 1 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 1 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 1 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 1 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 2 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 2 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 2 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 2 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 2 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 3 3 3680 4 32.805 0.10690769 0.9771554 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 3 4 14157.243 3.1914894 489.18197 2.5231391 0.45538909 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 3 5 6320.6076 3.6144578 103.50278 0.44181916 0.75109952 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 3 6 6157.8178 3.4883721 124.7792 0.72632262 0.73006542 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 4 4 54464 2.6548673 5679.4311 33.208515 0.34105936 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 4 5 24315.863 2.9411765 1371.5617 7.9168726 0.42457748 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 4 6 23689.598 2.8571429 1590.0769 11.87959 0.42066711 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 5 5 10856 3.2967033 308.7755 1.6022517 0.63272774 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 5 6 10576.399 3.1914894 365.45138 2.5231391 0.61999948 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 6 6 10304 3.0927835 429.89352 3.9170177 0.60800971 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +bond_style hybrid class2 morse + +bond_coeff 5 morse 50.000000 1.451345 1.914000 # morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +bond_coeff 4 class2 2.536000 75.465060 -192.435903 286.248406 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW +bond_coeff 3 class2 1.094000 390.634200 -996.117210 1481.724350 # mm3->(c3_c2h1@ph,h1_c1@ph)|benzene +bond_coeff 6 class2 1.278000 585.591600 -1493.258580 2221.222138 # mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW +bond_coeff 1 class2 1.394000 509.335200 -1298.804760 1931.972080 # mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene +bond_coeff 2 class2 1.485000 360.635220 -919.619811 1367.934469 # mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW + +angle_style hybrid class2/p6 cosine/buck6d + +angle_coeff 2 class2/p6 117.711000 57.408120 -46.049402 10.553745 -7.558563 13.610890 # mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +angle_coeff 2 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 2 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 6 class2/p6 126.814000 13.740540 -11.021849 2.526022 -1.809130 3.257744 # mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +angle_coeff 6 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 6 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 7 class2/p6 123.490000 111.075360 -89.098091 20.419778 -14.624589 26.334856 # mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 7 class2/p6 bb 14.244120 1.278000 1.278000 +angle_coeff 7 class2/p6 ba 3.309240 3.309240 1.278000 1.278000 +angle_coeff 1 class2/p6 127.050000 53.307540 -42.760159 9.799907 -7.018666 12.638684 # mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +angle_coeff 1 class2/p6 bb 71.796120 1.394000 1.394000 +angle_coeff 1 class2/p6 ba 6.762360 6.762360 1.394000 1.394000 +angle_coeff 4 class2/p6 84.336000 29.351520 -23.544055 5.395900 -3.864529 6.958951 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +angle_coeff 4 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 4 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 3 class2/p6 120.350000 36.185820 -29.026127 6.652298 -4.764358 8.579296 # mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +angle_coeff 3 class2/p6 bb 93.378120 1.394000 1.094000 +angle_coeff 3 class2/p6 ba -25.179000 53.523360 1.394000 1.094000 +angle_coeff 8 class2/p6 115.098000 79.493700 -63.765149 14.613896 -10.466432 18.847160 # mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 8 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 8 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 5 cosine/buck6d 1.978350 4 180.000000 #1.0 # fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW + +dihedral_style opls + +dihedral_coeff 3 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 9 0.000000 4.528000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 8 0.000000 0.000000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW +dihedral_coeff 5 0.000000 1.741000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +dihedral_coeff 2 0.000000 6.316000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +dihedral_coeff 1 0.000000 4.379000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +dihedral_coeff 6 0.000000 0.000000 0.000000 0.609000 # cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +dihedral_coeff 4 0.000000 0.000000 0.000000 0.000000 # cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 10 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 7 0.000000 0.000000 0.000000 0.000000 # cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW + +improper_style inversion/harmonic + +improper_coeff 1 18.776340 0.000000 # harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW +improper_coeff 3 41.005800 0.000000 # harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW +improper_coeff 2 4.100580 0.000000 # harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene + +special_bonds lj 0.0 0.0 1.0 coul 1.0 1.0 1.0 + +# ------------------------ MOF-FF FORCE FIELD END -------------------------- + +run 0 diff --git a/examples/USER/mofff/log.17Jan18.hkust1.g++.1 b/examples/USER/mofff/log.17Jan18.hkust1.g++.1 new file mode 100644 index 0000000000..13074b5054 --- /dev/null +++ b/examples/USER/mofff/log.17Jan18.hkust1.g++.1 @@ -0,0 +1,166 @@ +LAMMPS (17 Jan 2018) +clear +units real +boundary p p p +atom_style full +read_data hkust1.data + triclinic box = (0 0 0) to (26.4408 26.4408 26.4408) with tilt (0 0 0) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 624 atoms + scanning bonds ... + 5 = max bonds/atom + scanning angles ... + 10 = max angles/atom + scanning dihedrals ... + 32 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 792 bonds + reading angles ... + 1536 angles + reading dihedrals ... + 2688 dihedrals + reading impropers ... + 288 impropers + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 20 = max # of 1-4 neighbors + 17 = max # of special neighbors + +neighbor 2.0 bin + + +# ------------------------ MOF-FF FORCE FIELD ------------------------------ + +pair_style buck6d/coul/gauss/dsf 0.9000 12.0000 + +pair_coeff 1 1 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW +pair_coeff 1 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 1 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 1 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 1 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 1 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 2 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 2 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 2 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 2 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 2 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 3 3 3680 4 32.805 0.10690769 0.9771554 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 3 4 14157.243 3.1914894 489.18197 2.5231391 0.45538909 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 3 5 6320.6076 3.6144578 103.50278 0.44181916 0.75109952 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 3 6 6157.8178 3.4883721 124.7792 0.72632262 0.73006542 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 4 4 54464 2.6548673 5679.4311 33.208515 0.34105936 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 4 5 24315.863 2.9411765 1371.5617 7.9168726 0.42457748 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 4 6 23689.598 2.8571429 1590.0769 11.87959 0.42066711 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 5 5 10856 3.2967033 308.7755 1.6022517 0.63272774 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 5 6 10576.399 3.1914894 365.45138 2.5231391 0.61999948 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 6 6 10304 3.0927835 429.89352 3.9170177 0.60800971 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +bond_style hybrid class2 morse + +bond_coeff 5 morse 50.000000 1.451345 1.914000 # morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +bond_coeff 4 class2 2.536000 75.465060 -192.435903 286.248406 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW +bond_coeff 3 class2 1.094000 390.634200 -996.117210 1481.724350 # mm3->(c3_c2h1@ph,h1_c1@ph)|benzene +bond_coeff 6 class2 1.278000 585.591600 -1493.258580 2221.222138 # mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW +bond_coeff 1 class2 1.394000 509.335200 -1298.804760 1931.972080 # mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene +bond_coeff 2 class2 1.485000 360.635220 -919.619811 1367.934469 # mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW + +angle_style hybrid class2/p6 cosine/buck6d + +angle_coeff 2 class2/p6 117.711000 57.408120 -46.049402 10.553745 -7.558563 13.610890 # mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +angle_coeff 2 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 2 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 6 class2/p6 126.814000 13.740540 -11.021849 2.526022 -1.809130 3.257744 # mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +angle_coeff 6 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 6 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 7 class2/p6 123.490000 111.075360 -89.098091 20.419778 -14.624589 26.334856 # mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 7 class2/p6 bb 14.244120 1.278000 1.278000 +angle_coeff 7 class2/p6 ba 3.309240 3.309240 1.278000 1.278000 +angle_coeff 1 class2/p6 127.050000 53.307540 -42.760159 9.799907 -7.018666 12.638684 # mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +angle_coeff 1 class2/p6 bb 71.796120 1.394000 1.394000 +angle_coeff 1 class2/p6 ba 6.762360 6.762360 1.394000 1.394000 +angle_coeff 4 class2/p6 84.336000 29.351520 -23.544055 5.395900 -3.864529 6.958951 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +angle_coeff 4 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 4 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 3 class2/p6 120.350000 36.185820 -29.026127 6.652298 -4.764358 8.579296 # mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +angle_coeff 3 class2/p6 bb 93.378120 1.394000 1.094000 +angle_coeff 3 class2/p6 ba -25.179000 53.523360 1.394000 1.094000 +angle_coeff 8 class2/p6 115.098000 79.493700 -63.765149 14.613896 -10.466432 18.847160 # mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 8 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 8 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 5 cosine/buck6d 1.978350 4 180.000000 # fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW + +dihedral_style opls + +dihedral_coeff 3 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 9 0.000000 4.528000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 8 0.000000 0.000000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW +dihedral_coeff 5 0.000000 1.741000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +dihedral_coeff 2 0.000000 6.316000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +dihedral_coeff 1 0.000000 4.379000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +dihedral_coeff 6 0.000000 0.000000 0.000000 0.609000 # cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +dihedral_coeff 4 0.000000 0.000000 0.000000 0.000000 # cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 10 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 7 0.000000 0.000000 0.000000 0.000000 # cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW + +improper_style inversion/harmonic + +improper_coeff 1 18.776340 0.000000 # harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW +improper_coeff 3 41.005800 0.000000 # harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW +improper_coeff 2 4.100580 0.000000 # harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene + +special_bonds lj 0.0 0.0 1.0 coul 1.0 1.0 1.0 + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 17 = max # of special neighbors + +# ------------------------ MOF-FF FORCE FIELD END -------------------------- + +run 0 +WARNING: No fixes defined, atoms won't move (../verlet.cpp:55) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair buck6d/coul/gauss/dsf, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +WARNING: Inconsistent image flags (../domain.cpp:786) +Per MPI rank memory allocation (min/avg/max) = 21.23 | 21.23 | 21.23 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -11833.81 343.7619 -11490.048 -5.8508834 +Loop time of 9.53674e-07 on 1 procs for 0 steps with 624 atoms + +0.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Bond | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 9.537e-07 | | |100.00 + +Nlocal: 624 ave 624 max 624 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 4464 ave 4464 max 4464 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 115368 ave 115368 max 115368 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 115368 +Ave neighs/atom = 184.885 +Ave special neighs/atom = 7.46154 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/mofff/log.17Jan18.hkust1.g++.4 b/examples/USER/mofff/log.17Jan18.hkust1.g++.4 new file mode 100644 index 0000000000..bba6ff5c2e --- /dev/null +++ b/examples/USER/mofff/log.17Jan18.hkust1.g++.4 @@ -0,0 +1,166 @@ +LAMMPS (17 Jan 2018) +clear +units real +boundary p p p +atom_style full +read_data hkust1.data + triclinic box = (0 0 0) to (26.4408 26.4408 26.4408) with tilt (0 0 0) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 624 atoms + scanning bonds ... + 5 = max bonds/atom + scanning angles ... + 10 = max angles/atom + scanning dihedrals ... + 32 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 792 bonds + reading angles ... + 1536 angles + reading dihedrals ... + 2688 dihedrals + reading impropers ... + 288 impropers + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 20 = max # of 1-4 neighbors + 17 = max # of special neighbors + +neighbor 2.0 bin + + +# ------------------------ MOF-FF FORCE FIELD ------------------------------ + +pair_style buck6d/coul/gauss/dsf 0.9000 12.0000 + +pair_coeff 1 1 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW +pair_coeff 1 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 1 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 1 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 1 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 1 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 2 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 2 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 2 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 2 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 2 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 3 3 3680 4 32.805 0.10690769 0.9771554 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 3 4 14157.243 3.1914894 489.18197 2.5231391 0.45538909 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 3 5 6320.6076 3.6144578 103.50278 0.44181916 0.75109952 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 3 6 6157.8178 3.4883721 124.7792 0.72632262 0.73006542 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 4 4 54464 2.6548673 5679.4311 33.208515 0.34105936 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 4 5 24315.863 2.9411765 1371.5617 7.9168726 0.42457748 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 4 6 23689.598 2.8571429 1590.0769 11.87959 0.42066711 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 5 5 10856 3.2967033 308.7755 1.6022517 0.63272774 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 5 6 10576.399 3.1914894 365.45138 2.5231391 0.61999948 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 6 6 10304 3.0927835 429.89352 3.9170177 0.60800971 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +bond_style hybrid class2 morse + +bond_coeff 5 morse 50.000000 1.451345 1.914000 # morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +bond_coeff 4 class2 2.536000 75.465060 -192.435903 286.248406 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW +bond_coeff 3 class2 1.094000 390.634200 -996.117210 1481.724350 # mm3->(c3_c2h1@ph,h1_c1@ph)|benzene +bond_coeff 6 class2 1.278000 585.591600 -1493.258580 2221.222138 # mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW +bond_coeff 1 class2 1.394000 509.335200 -1298.804760 1931.972080 # mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene +bond_coeff 2 class2 1.485000 360.635220 -919.619811 1367.934469 # mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW + +angle_style hybrid class2/p6 cosine/buck6d + +angle_coeff 2 class2/p6 117.711000 57.408120 -46.049402 10.553745 -7.558563 13.610890 # mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +angle_coeff 2 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 2 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 6 class2/p6 126.814000 13.740540 -11.021849 2.526022 -1.809130 3.257744 # mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +angle_coeff 6 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 6 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 7 class2/p6 123.490000 111.075360 -89.098091 20.419778 -14.624589 26.334856 # mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 7 class2/p6 bb 14.244120 1.278000 1.278000 +angle_coeff 7 class2/p6 ba 3.309240 3.309240 1.278000 1.278000 +angle_coeff 1 class2/p6 127.050000 53.307540 -42.760159 9.799907 -7.018666 12.638684 # mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +angle_coeff 1 class2/p6 bb 71.796120 1.394000 1.394000 +angle_coeff 1 class2/p6 ba 6.762360 6.762360 1.394000 1.394000 +angle_coeff 4 class2/p6 84.336000 29.351520 -23.544055 5.395900 -3.864529 6.958951 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +angle_coeff 4 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 4 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 3 class2/p6 120.350000 36.185820 -29.026127 6.652298 -4.764358 8.579296 # mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +angle_coeff 3 class2/p6 bb 93.378120 1.394000 1.094000 +angle_coeff 3 class2/p6 ba -25.179000 53.523360 1.394000 1.094000 +angle_coeff 8 class2/p6 115.098000 79.493700 -63.765149 14.613896 -10.466432 18.847160 # mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 8 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 8 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 5 cosine/buck6d 1.978350 4 180.000000 # fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW + +dihedral_style opls + +dihedral_coeff 3 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 9 0.000000 4.528000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 8 0.000000 0.000000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW +dihedral_coeff 5 0.000000 1.741000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +dihedral_coeff 2 0.000000 6.316000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +dihedral_coeff 1 0.000000 4.379000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +dihedral_coeff 6 0.000000 0.000000 0.000000 0.609000 # cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +dihedral_coeff 4 0.000000 0.000000 0.000000 0.000000 # cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 10 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 7 0.000000 0.000000 0.000000 0.000000 # cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW + +improper_style inversion/harmonic + +improper_coeff 1 18.776340 0.000000 # harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW +improper_coeff 3 41.005800 0.000000 # harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW +improper_coeff 2 4.100580 0.000000 # harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene + +special_bonds lj 0.0 0.0 1.0 coul 1.0 1.0 1.0 + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 17 = max # of special neighbors + +# ------------------------ MOF-FF FORCE FIELD END -------------------------- + +run 0 +WARNING: No fixes defined, atoms won't move (../verlet.cpp:55) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair buck6d/coul/gauss/dsf, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +WARNING: Inconsistent image flags (../domain.cpp:786) +Per MPI rank memory allocation (min/avg/max) = 20.68 | 20.68 | 20.68 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -11833.81 343.7619 -11490.048 -5.8508834 +Loop time of 2.20537e-06 on 4 procs for 0 steps with 624 atoms + +0.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Bond | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 2.205e-06 | | |100.00 + +Nlocal: 156 ave 156 max 156 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 2718 ave 2718 max 2718 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 28842 ave 28870 max 28814 min +Histogram: 1 1 0 0 0 0 0 0 1 1 + +Total # of neighbors = 115368 +Ave neighs/atom = 184.885 +Ave special neighs/atom = 7.46154 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/mofff/log.17Jan18.hkust1_long.g++.1 b/examples/USER/mofff/log.17Jan18.hkust1_long.g++.1 new file mode 100644 index 0000000000..8f5d33c067 --- /dev/null +++ b/examples/USER/mofff/log.17Jan18.hkust1_long.g++.1 @@ -0,0 +1,175 @@ +LAMMPS (17 Jan 2018) +clear +units real +boundary p p p +atom_style full +read_data hkust1.data + triclinic box = (0 0 0) to (26.4408 26.4408 26.4408) with tilt (0 0 0) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 624 atoms + scanning bonds ... + 5 = max bonds/atom + scanning angles ... + 10 = max angles/atom + scanning dihedrals ... + 32 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 792 bonds + reading angles ... + 1536 angles + reading dihedrals ... + 2688 dihedrals + reading impropers ... + 288 impropers + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 20 = max # of 1-4 neighbors + 17 = max # of special neighbors + +neighbor 2.0 bin + + +# ------------------------ MOF-FF FORCE FIELD ------------------------------ +kspace_style ewald 1.0e-6 + +pair_style buck6d/coul/gauss/long 0.9 0.9 12.0000 + +pair_coeff 1 1 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW +pair_coeff 1 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 1 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 1 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 1 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 1 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 2 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 2 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 2 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 2 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 2 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 3 3 3680 4 32.805 0.10690769 0.9771554 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 3 4 14157.243 3.1914894 489.18197 2.5231391 0.45538909 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 3 5 6320.6076 3.6144578 103.50278 0.44181916 0.75109952 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 3 6 6157.8178 3.4883721 124.7792 0.72632262 0.73006542 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 4 4 54464 2.6548673 5679.4311 33.208515 0.34105936 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 4 5 24315.863 2.9411765 1371.5617 7.9168726 0.42457748 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 4 6 23689.598 2.8571429 1590.0769 11.87959 0.42066711 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 5 5 10856 3.2967033 308.7755 1.6022517 0.63272774 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 5 6 10576.399 3.1914894 365.45138 2.5231391 0.61999948 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 6 6 10304 3.0927835 429.89352 3.9170177 0.60800971 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +bond_style hybrid class2 morse + +bond_coeff 5 morse 50.000000 1.451345 1.914000 # morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +bond_coeff 4 class2 2.536000 75.465060 -192.435903 286.248406 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW +bond_coeff 3 class2 1.094000 390.634200 -996.117210 1481.724350 # mm3->(c3_c2h1@ph,h1_c1@ph)|benzene +bond_coeff 6 class2 1.278000 585.591600 -1493.258580 2221.222138 # mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW +bond_coeff 1 class2 1.394000 509.335200 -1298.804760 1931.972080 # mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene +bond_coeff 2 class2 1.485000 360.635220 -919.619811 1367.934469 # mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW + +angle_style hybrid class2/p6 cosine/buck6d + +angle_coeff 2 class2/p6 117.711000 57.408120 -46.049402 10.553745 -7.558563 13.610890 # mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +angle_coeff 2 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 2 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 6 class2/p6 126.814000 13.740540 -11.021849 2.526022 -1.809130 3.257744 # mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +angle_coeff 6 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 6 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 7 class2/p6 123.490000 111.075360 -89.098091 20.419778 -14.624589 26.334856 # mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 7 class2/p6 bb 14.244120 1.278000 1.278000 +angle_coeff 7 class2/p6 ba 3.309240 3.309240 1.278000 1.278000 +angle_coeff 1 class2/p6 127.050000 53.307540 -42.760159 9.799907 -7.018666 12.638684 # mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +angle_coeff 1 class2/p6 bb 71.796120 1.394000 1.394000 +angle_coeff 1 class2/p6 ba 6.762360 6.762360 1.394000 1.394000 +angle_coeff 4 class2/p6 84.336000 29.351520 -23.544055 5.395900 -3.864529 6.958951 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +angle_coeff 4 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 4 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 3 class2/p6 120.350000 36.185820 -29.026127 6.652298 -4.764358 8.579296 # mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +angle_coeff 3 class2/p6 bb 93.378120 1.394000 1.094000 +angle_coeff 3 class2/p6 ba -25.179000 53.523360 1.394000 1.094000 +angle_coeff 8 class2/p6 115.098000 79.493700 -63.765149 14.613896 -10.466432 18.847160 # mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 8 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 8 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 5 cosine/buck6d 1.978350 4 180.000000 #1.0 # fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW + +dihedral_style opls + +dihedral_coeff 3 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 9 0.000000 4.528000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 8 0.000000 0.000000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW +dihedral_coeff 5 0.000000 1.741000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +dihedral_coeff 2 0.000000 6.316000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +dihedral_coeff 1 0.000000 4.379000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +dihedral_coeff 6 0.000000 0.000000 0.000000 0.609000 # cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +dihedral_coeff 4 0.000000 0.000000 0.000000 0.000000 # cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 10 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 7 0.000000 0.000000 0.000000 0.000000 # cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW + +improper_style inversion/harmonic + +improper_coeff 1 18.776340 0.000000 # harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW +improper_coeff 3 41.005800 0.000000 # harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW +improper_coeff 2 4.100580 0.000000 # harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene + +special_bonds lj 0.0 0.0 1.0 coul 1.0 1.0 1.0 + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 17 = max # of special neighbors + +# ------------------------ MOF-FF FORCE FIELD END -------------------------- + +run 0 +WARNING: No fixes defined, atoms won't move (../verlet.cpp:55) +Ewald initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.267593 + estimated absolute RMS force accuracy = 0.000333665 + estimated relative force accuracy = 1.00482e-06 + KSpace vectors: actual max1d max3d = 1054 8 2456 + kxmax kymax kzmax = 8 8 8 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair buck6d/coul/gauss/long, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +WARNING: Inconsistent image flags (../domain.cpp:786) +Per MPI rank memory allocation (min/avg/max) = 34.64 | 34.64 | 34.64 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -16541.109 343.7619 -16197.347 -629.64956 +Loop time of 9.53674e-07 on 1 procs for 0 steps with 624 atoms + +0.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Bond | 0 | 0 | 0 | 0.0 | 0.00 +Kspace | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 9.537e-07 | | |100.00 + +Nlocal: 624 ave 624 max 624 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 4464 ave 4464 max 4464 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 115368 ave 115368 max 115368 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 115368 +Ave neighs/atom = 184.885 +Ave special neighs/atom = 7.46154 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/mofff/log.17Jan18.hkust1_long.g++.4 b/examples/USER/mofff/log.17Jan18.hkust1_long.g++.4 new file mode 100644 index 0000000000..8201f7da00 --- /dev/null +++ b/examples/USER/mofff/log.17Jan18.hkust1_long.g++.4 @@ -0,0 +1,175 @@ +LAMMPS (17 Jan 2018) +clear +units real +boundary p p p +atom_style full +read_data hkust1.data + triclinic box = (0 0 0) to (26.4408 26.4408 26.4408) with tilt (0 0 0) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 624 atoms + scanning bonds ... + 5 = max bonds/atom + scanning angles ... + 10 = max angles/atom + scanning dihedrals ... + 32 = max dihedrals/atom + scanning impropers ... + 2 = max impropers/atom + reading bonds ... + 792 bonds + reading angles ... + 1536 angles + reading dihedrals ... + 2688 dihedrals + reading impropers ... + 288 impropers + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 20 = max # of 1-4 neighbors + 17 = max # of special neighbors + +neighbor 2.0 bin + + +# ------------------------ MOF-FF FORCE FIELD ------------------------------ +kspace_style ewald 1.0e-6 + +pair_style buck6d/coul/gauss/long 0.9 0.9 12.0000 + +pair_coeff 1 1 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW +pair_coeff 1 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 1 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 1 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 1 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 1 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c3@ph)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 2 2 10304 3.0612245 457.17971 4.5218516 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene +pair_coeff 2 3 6157.8178 3.4682081 129.19572 0.78772886 0.73006542 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 2 4 23689.598 2.8436019 1636.052 12.696549 0.42066711 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 2 5 10576.399 3.1746032 377.27092 2.7176691 0.61999948 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 2 6 10304 3.0769231 443.36171 4.2093581 0.60800971 # buck6d->(c3_c2h1@ph)|benzene/gaussian->(c3_c2h1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 3 3 3680 4 32.805 0.10690769 0.9771554 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene +pair_coeff 3 4 14157.243 3.1914894 489.18197 2.5231391 0.45538909 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 3 5 6320.6076 3.6144578 103.50278 0.44181916 0.75109952 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 3 6 6157.8178 3.4883721 124.7792 0.72632262 0.73006542 # buck6d->(h1_c1@ph)|benzene/gaussian->(h1_c1@ph)|benzene <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 4 4 54464 2.6548673 5679.4311 33.208515 0.34105936 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW +pair_coeff 4 5 24315.863 2.9411765 1371.5617 7.9168726 0.42457748 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 4 6 23689.598 2.8571429 1590.0769 11.87959 0.42066711 # buck6d->(cu5_cu1o4@cu2)|CuPW/gaussian->(cu5_cu1o4@cu2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 5 5 10856 3.2967033 308.7755 1.6022517 0.63272774 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW +pair_coeff 5 6 10576.399 3.1914894 365.45138 2.5231391 0.61999948 # buck6d->(o2_c1cu1@co2)|CuPW/gaussian->(o2_c1cu1@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW +pair_coeff 6 6 10304 3.0927835 429.89352 3.9170177 0.60800971 # buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW <--> buck6d->(c3_c1o2@co2)|CuPW/gaussian->(c3_c1o2@co2)|CuPW + +bond_style hybrid class2 morse + +bond_coeff 5 morse 50.000000 1.451345 1.914000 # morse->(cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +bond_coeff 4 class2 2.536000 75.465060 -192.435903 286.248406 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2)|CuPW +bond_coeff 3 class2 1.094000 390.634200 -996.117210 1481.724350 # mm3->(c3_c2h1@ph,h1_c1@ph)|benzene +bond_coeff 6 class2 1.278000 585.591600 -1493.258580 2221.222138 # mm3->(c3_c1o2@co2,o2_c1cu1@co2)|CuPW +bond_coeff 1 class2 1.394000 509.335200 -1298.804760 1931.972080 # mm3->(c3_c2h1@ph,c3_c2h1@ph)|benzene +bond_coeff 2 class2 1.485000 360.635220 -919.619811 1367.934469 # mm3->(c3_c1o2@co2,c3_c3@ph)|CuPW + +angle_style hybrid class2/p6 cosine/buck6d + +angle_coeff 2 class2/p6 117.711000 57.408120 -46.049402 10.553745 -7.558563 13.610890 # mm3->(c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +angle_coeff 2 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 2 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 6 class2/p6 126.814000 13.740540 -11.021849 2.526022 -1.809130 3.257744 # mm3->(c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +angle_coeff 6 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 6 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 7 class2/p6 123.490000 111.075360 -89.098091 20.419778 -14.624589 26.334856 # mm3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 7 class2/p6 bb 14.244120 1.278000 1.278000 +angle_coeff 7 class2/p6 ba 3.309240 3.309240 1.278000 1.278000 +angle_coeff 1 class2/p6 127.050000 53.307540 -42.760159 9.799907 -7.018666 12.638684 # mm3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +angle_coeff 1 class2/p6 bb 71.796120 1.394000 1.394000 +angle_coeff 1 class2/p6 ba 6.762360 6.762360 1.394000 1.394000 +angle_coeff 4 class2/p6 84.336000 29.351520 -23.544055 5.395900 -3.864529 6.958951 # mm3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +angle_coeff 4 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 4 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 3 class2/p6 120.350000 36.185820 -29.026127 6.652298 -4.764358 8.579296 # mm3->(c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +angle_coeff 3 class2/p6 bb 93.378120 1.394000 1.094000 +angle_coeff 3 class2/p6 ba -25.179000 53.523360 1.394000 1.094000 +angle_coeff 8 class2/p6 115.098000 79.493700 -63.765149 14.613896 -10.466432 18.847160 # mm3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2)|CuPW +angle_coeff 8 class2/p6 bb 0.0 1.0 1.0 +angle_coeff 8 class2/p6 ba 0.0 0.0 1.0 1.0 +angle_coeff 5 cosine/buck6d 1.978350 4 180.000000 #1.0 # fourier->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW + +dihedral_style opls + +dihedral_coeff 3 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 9 0.000000 4.528000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 8 0.000000 0.000000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW +dihedral_coeff 5 0.000000 1.741000 0.000000 0.000000 # cos3->(o2_c1cu1@co2,c3_c1o2@co2,c3_c3@ph,c3_c2h1@ph)|CuPW +dihedral_coeff 2 0.000000 6.316000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene +dihedral_coeff 1 0.000000 4.379000 0.000000 0.000000 # cos3->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph)|benzene +dihedral_coeff 6 0.000000 0.000000 0.000000 0.609000 # cos4->(o2_c1cu1@co2,cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2)|CuPW +dihedral_coeff 4 0.000000 0.000000 0.000000 0.000000 # cos3->(h1_c1@ph,c3_c2h1@ph,c3_c3@ph,c3_c1o2@co2)|CuPW +dihedral_coeff 10 0.000000 0.000000 0.000000 0.000000 # cos3->(c3_c3@ph,c3_c1o2@co2,o2_c1cu1@co2,cu5_cu1o4@cu2)|CuPW +dihedral_coeff 7 0.000000 0.000000 0.000000 0.000000 # cos3->(cu5_cu1o4@cu2,cu5_cu1o4@cu2,o2_c1cu1@co2,c3_c1o2@co2)|CuPW + +improper_style inversion/harmonic + +improper_coeff 1 18.776340 0.000000 # harm->(c3_c3@ph,c3_c2h1@ph,c3_c2h1@ph,c3_c1o2@co2)|CuPW +improper_coeff 3 41.005800 0.000000 # harm->(c3_c1o2@co2,c3_c3@ph,o2_c1cu1@co2,o2_c1cu1@co2)|CuPW +improper_coeff 2 4.100580 0.000000 # harm->(c3_c2h1@ph,c3_c2h1@ph,c3_c2h1@ph,h1_c1@ph)|benzene + +special_bonds lj 0.0 0.0 1.0 coul 1.0 1.0 1.0 + 5 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 17 = max # of special neighbors + +# ------------------------ MOF-FF FORCE FIELD END -------------------------- + +run 0 +WARNING: No fixes defined, atoms won't move (../verlet.cpp:55) +Ewald initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.267593 + estimated absolute RMS force accuracy = 0.000333665 + estimated relative force accuracy = 1.00482e-06 + KSpace vectors: actual max1d max3d = 1054 8 2456 + kxmax kymax kzmax = 8 8 8 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair buck6d/coul/gauss/long, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +WARNING: Inconsistent image flags (../domain.cpp:786) +Per MPI rank memory allocation (min/avg/max) = 34.1 | 34.1 | 34.1 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -16541.109 343.7619 -16197.347 -629.64956 +Loop time of 6.13928e-06 on 4 procs for 0 steps with 624 atoms + +0.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Bond | 0 | 0 | 0 | 0.0 | 0.00 +Kspace | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 6.139e-06 | | |100.00 + +Nlocal: 156 ave 156 max 156 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 2718 ave 2718 max 2718 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 28842 ave 28870 max 28814 min +Histogram: 1 1 0 0 0 0 0 0 1 1 + +Total # of neighbors = 115368 +Ave neighs/atom = 184.885 +Ave special neighs/atom = 7.46154 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/quip/in.gap b/examples/USER/quip/in.gap index 37667e39b9..dd049a4737 100644 --- a/examples/USER/quip/in.gap +++ b/examples/USER/quip/in.gap @@ -17,6 +17,6 @@ fix 1 all nve thermo 10 timestep 0.001 -dump 1 all custom 10 dump.gap id fx fy fz +#dump 1 all custom 10 dump.gap id fx fy fz run 40 diff --git a/examples/USER/quip/in.molecular b/examples/USER/quip/in.molecular index 24d21d6762..4253399d7c 100644 --- a/examples/USER/quip/in.molecular +++ b/examples/USER/quip/in.molecular @@ -1,7 +1,6 @@ units metal atom_style full boundary p p p -processors 1 1 1 timestep 0.0001 # 0.1 fs read_data methane-box-8.data @@ -28,7 +27,7 @@ pair_modify pair lj/cut special lj/coul 0.0 0.0 0.0 # Intramolecular # Tell QUIP to pretend this is silane (which is covered by the parameter file) -pair_coeff * * quip ip.parms.SW.xml "IP SW" 14 1 +pair_coeff * * quip sw_example.xml "IP SW" 14 1 bond_style none angle_style none diff --git a/examples/USER/quip/in.sw b/examples/USER/quip/in.sw index c1367ac805..aaa4217b2f 100644 --- a/examples/USER/quip/in.sw +++ b/examples/USER/quip/in.sw @@ -10,6 +10,7 @@ read_data data_sw pair_style quip pair_coeff * * sw_example.xml "IP SW" 14 +velocity all create 10.0 355311 neighbor 0.3 bin neigh_modify delay 10 @@ -17,6 +18,6 @@ fix 1 all nve thermo 10 timestep 0.001 -dump 1 all custom 10 dump.sw id fx fy fz +#dump 1 all custom 10 dump.sw id fx fy fz -run 1 +run 100 diff --git a/examples/USER/quip/log.24Jul17.gap.g++.1 b/examples/USER/quip/log.24Jul17.gap.g++.1 new file mode 100644 index 0000000000..348f2ae0cc --- /dev/null +++ b/examples/USER/quip/log.24Jul17.gap.g++.1 @@ -0,0 +1,76 @@ +LAMMPS (24 Jul 2017) + using 1 OpenMP thread(s) per MPI task +# Test of GAP potential for Si system + +units metal +boundary p p p + +atom_style atomic + +read_data data_gap + orthogonal box = (0 0 0) to (10.9685 10.9685 10.9685) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 64 atoms + +pair_style quip +pair_coeff * * gap_example.xml "Potential xml_label=GAP_2015_2_20_0_10_54_35_765" 14 + +neighbor 0.3 bin +neigh_modify delay 10 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all custom 10 dump.gap id fx fy fz + +run 40 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.3 + ghost atom cutoff = 4.3 + binsize = 2.15, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair quip, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.689 | 2.689 | 2.689 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -10412.677 0 -10412.677 -107490.01 + 10 173.98393 -10414.096 0 -10412.679 -91270.969 + 20 417.38493 -10416.08 0 -10412.681 -42816.133 + 30 434.34789 -10416.217 0 -10412.68 2459.83 + 40 423.05899 -10416.124 0 -10412.679 22936.209 +Loop time of 1.83555 on 1 procs for 40 steps with 64 atoms + +Performance: 1.883 ns/day, 12.747 hours/ns, 21.792 timesteps/s +98.1% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.8349 | 1.8349 | 1.8349 | 0.0 | 99.96 +Neigh | 0.00022817 | 0.00022817 | 0.00022817 | 0.0 | 0.01 +Comm | 0.00013709 | 0.00013709 | 0.00013709 | 0.0 | 0.01 +Output | 9.8228e-05 | 9.8228e-05 | 9.8228e-05 | 0.0 | 0.01 +Modify | 8.6308e-05 | 8.6308e-05 | 8.6308e-05 | 0.0 | 0.00 +Other | | 0.0001223 | | | 0.01 + +Nlocal: 64 ave 64 max 64 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 303 ave 303 max 303 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: 1080 ave 1080 max 1080 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1080 +Ave neighs/atom = 16.875 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/USER/quip/log.24Jul17.gap.g++.4 b/examples/USER/quip/log.24Jul17.gap.g++.4 new file mode 100644 index 0000000000..a8127148b5 --- /dev/null +++ b/examples/USER/quip/log.24Jul17.gap.g++.4 @@ -0,0 +1,76 @@ +LAMMPS (24 Jul 2017) + using 1 OpenMP thread(s) per MPI task +# Test of GAP potential for Si system + +units metal +boundary p p p + +atom_style atomic + +read_data data_gap + orthogonal box = (0 0 0) to (10.9685 10.9685 10.9685) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 64 atoms + +pair_style quip +pair_coeff * * gap_example.xml "Potential xml_label=GAP_2015_2_20_0_10_54_35_765" 14 + +neighbor 0.3 bin +neigh_modify delay 10 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all custom 10 dump.gap id fx fy fz + +run 40 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.3 + ghost atom cutoff = 4.3 + binsize = 2.15, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair quip, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.685 | 2.779 | 3.06 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -10412.677 0 -10412.677 -107490.01 + 10 173.98393 -10414.096 0 -10412.679 -91270.969 + 20 417.38493 -10416.08 0 -10412.681 -42816.133 + 30 434.34789 -10416.217 0 -10412.68 2459.83 + 40 423.05899 -10416.124 0 -10412.679 22936.209 +Loop time of 0.837345 on 4 procs for 40 steps with 64 atoms + +Performance: 4.127 ns/day, 5.815 hours/ns, 47.770 timesteps/s +96.0% 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.73144 | 0.79214 | 0.83586 | 4.3 | 94.60 +Neigh | 5.7936e-05 | 6.5327e-05 | 7.1049e-05 | 0.0 | 0.01 +Comm | 0.00085807 | 0.044631 | 0.10532 | 18.0 | 5.33 +Output | 0.00013208 | 0.00013494 | 0.00013733 | 0.0 | 0.02 +Modify | 6.0558e-05 | 7.8678e-05 | 9.5129e-05 | 0.0 | 0.01 +Other | | 0.0002971 | | | 0.04 + +Nlocal: 16 ave 18 max 14 min +Histogram: 1 0 1 0 0 0 0 1 0 1 +Nghost: 174 ave 182 max 167 min +Histogram: 1 0 0 0 2 0 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 270 ave 294 max 237 min +Histogram: 1 0 0 0 1 0 0 0 1 1 + +Total # of neighbors = 1080 +Ave neighs/atom = 16.875 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/quip/log.24Jul17.molecular.g++.1 b/examples/USER/quip/log.24Jul17.molecular.g++.1 new file mode 100644 index 0000000000..28fc63579b --- /dev/null +++ b/examples/USER/quip/log.24Jul17.molecular.g++.1 @@ -0,0 +1,130 @@ +LAMMPS (24 Jul 2017) + using 1 OpenMP thread(s) per MPI task +units metal +atom_style full +boundary p p p +timestep 0.0001 # 0.1 fs + +read_data methane-box-8.data + orthogonal box = (-0.499095 -0.270629 0.131683) to (8.4109 8.63937 9.04168) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 40 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + reading bonds ... + 32 bonds + reading angles ... + 48 angles + 4 = max # of 1-2 neighbors + 3 = max # of 1-3 neighbors + 3 = max # of 1-4 neighbors + 4 = max # of special neighbors + +# DISCLAIMER: This potential mixes parameters from methane and silane +# potentials and is NOT intended to be a realistic representation of either +# system. It is meant to demonstrate the use of hybrid QUIP/LAMMPS potentials, +# including the use of separate 'special_bonds' settings. + +pair_style hybrid/overlay lj/cut 8.0 quip + +# exclusion setting for quip; cannot be exactly 1.0 1.0 1.0, +# since that would not flag 1-2, 1-3, and 1-4 pairs in lj/cut +special_bonds lj/coul 0.999999999 0.999999999 0.999999999 + 4 = max # of 1-2 neighbors + 3 = max # of 1-3 neighbors + 3 = max # of 1-4 neighbors + 4 = max # of special neighbors + +# Intermolecular: OPLS (JACS 118 (45), p. 11225 (1996)) +# Coulomb interactions ommitted for simplicity +pair_coeff 1 1 lj/cut 0.0028619844 3.5 # CT +pair_coeff 2 2 lj/cut 0.0013009018 2.5 # HC +pair_coeff 1 2 lj/cut 0.0019295487 2.95 +pair_modify shift no +# change exclusion settings for lj/cut only: exclude bonded pairs +pair_modify pair lj/cut special lj/coul 0.0 0.0 0.0 + +# Intramolecular +# Tell QUIP to pretend this is silane (which is covered by the parameter file) +pair_coeff * * quip sw_example.xml "IP SW" 14 1 +bond_style none +angle_style none + +fix 1 all nve + +# Include diagnostics that allow us to compare to a pure QUIP run +compute equip all pair quip +compute evdw all pair lj/cut +compute vir all pressure NULL virial + +thermo_style custom step epair ke etotal temp press c_vir c_evdw c_equip +thermo 1 + +# dump 1 all custom 1 dump.molecular id type x y z fx fy fz +# dump_modify 1 sort id + +run 10 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 2 2 2 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair lj/cut, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) pair quip, perpetual + attributes: full, newton on + pair build: full/bin + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 8.288 | 8.288 | 8.288 Mbytes +Step E_pair KinEng TotEng Temp Press c_vir c_evdw c_equip + 0 -5.3530213 0 -5.3530213 0 518847.56 518847.56 -0.10904079 -5.2439805 + 1 -5.9384459 0.58384822 -5.3545977 115.81657 517370.5 516488.87 -0.10783656 -5.8306093 + 2 -7.669616 2.3104051 -5.3592109 458.30954 512986.36 509497.58 -0.10422283 -7.5653932 + 3 -10.473314 5.1069211 -5.3663924 1013.0477 505833.04 498121.43 -0.098049469 -10.375264 + 4 -14.234705 8.859182 -5.3755227 1757.3747 496127.44 482749.79 -0.089147485 -14.145557 + 5 -18.806851 13.420941 -5.3859098 2662.28 484148.76 463882.72 -0.077305196 -18.729546 + 6 -24.021727 18.625147 -5.3965797 3694.6259 470219.95 442095.39 -0.06194509 -23.959782 + 7 -29.702647 24.295529 -5.4071176 4819.446 454683.57 417996.56 -0.042859727 -29.659787 + 8 -35.67405 30.257258 -5.4167913 6002.0599 437887.03 392197.62 -0.019248651 -35.654801 + 9 -41.771047 36.345757 -5.4252893 7209.8209 420163.51 365280.27 0.0096063065 -41.780653 + 10 -47.845522 42.413161 -5.4323614 8413.3973 401821.91 337776.7 0.044743702 -47.890266 +Loop time of 0.0537777 on 1 procs for 10 steps with 40 atoms + +Performance: 1.607 ns/day, 14.938 hours/ns, 185.951 timesteps/s +90.3% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.053478 | 0.053478 | 0.053478 | 0.0 | 99.44 +Bond | 1.9073e-06 | 1.9073e-06 | 1.9073e-06 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 7.7724e-05 | 7.7724e-05 | 7.7724e-05 | 0.0 | 0.14 +Output | 0.00018263 | 0.00018263 | 0.00018263 | 0.0 | 0.34 +Modify | 1.5974e-05 | 1.5974e-05 | 1.5974e-05 | 0.0 | 0.03 +Other | | 2.122e-05 | | | 0.04 + +Nlocal: 40 ave 40 max 40 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1175 ave 1175 max 1175 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 4768 ave 4768 max 4768 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 9536 ave 9536 max 9536 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9536 +Ave neighs/atom = 238.4 +Ave special neighs/atom = 4 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/quip/log.24Jul17.molecular.g++.4 b/examples/USER/quip/log.24Jul17.molecular.g++.4 new file mode 100644 index 0000000000..a8be8e77bb --- /dev/null +++ b/examples/USER/quip/log.24Jul17.molecular.g++.4 @@ -0,0 +1,130 @@ +LAMMPS (24 Jul 2017) + using 1 OpenMP thread(s) per MPI task +units metal +atom_style full +boundary p p p +timestep 0.0001 # 0.1 fs + +read_data methane-box-8.data + orthogonal box = (-0.499095 -0.270629 0.131683) to (8.4109 8.63937 9.04168) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 40 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + reading bonds ... + 32 bonds + reading angles ... + 48 angles + 4 = max # of 1-2 neighbors + 3 = max # of 1-3 neighbors + 3 = max # of 1-4 neighbors + 4 = max # of special neighbors + +# DISCLAIMER: This potential mixes parameters from methane and silane +# potentials and is NOT intended to be a realistic representation of either +# system. It is meant to demonstrate the use of hybrid QUIP/LAMMPS potentials, +# including the use of separate 'special_bonds' settings. + +pair_style hybrid/overlay lj/cut 8.0 quip + +# exclusion setting for quip; cannot be exactly 1.0 1.0 1.0, +# since that would not flag 1-2, 1-3, and 1-4 pairs in lj/cut +special_bonds lj/coul 0.999999999 0.999999999 0.999999999 + 4 = max # of 1-2 neighbors + 3 = max # of 1-3 neighbors + 3 = max # of 1-4 neighbors + 4 = max # of special neighbors + +# Intermolecular: OPLS (JACS 118 (45), p. 11225 (1996)) +# Coulomb interactions ommitted for simplicity +pair_coeff 1 1 lj/cut 0.0028619844 3.5 # CT +pair_coeff 2 2 lj/cut 0.0013009018 2.5 # HC +pair_coeff 1 2 lj/cut 0.0019295487 2.95 +pair_modify shift no +# change exclusion settings for lj/cut only: exclude bonded pairs +pair_modify pair lj/cut special lj/coul 0.0 0.0 0.0 + +# Intramolecular +# Tell QUIP to pretend this is silane (which is covered by the parameter file) +pair_coeff * * quip sw_example.xml "IP SW" 14 1 +bond_style none +angle_style none + +fix 1 all nve + +# Include diagnostics that allow us to compare to a pure QUIP run +compute equip all pair quip +compute evdw all pair lj/cut +compute vir all pressure NULL virial + +thermo_style custom step epair ke etotal temp press c_vir c_evdw c_equip +thermo 1 + +# dump 1 all custom 1 dump.molecular id type x y z fx fy fz +# dump_modify 1 sort id + +run 10 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 2 2 2 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair lj/cut, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) pair quip, perpetual + attributes: full, newton on + pair build: full/bin + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 8.26 | 8.386 | 8.762 Mbytes +Step E_pair KinEng TotEng Temp Press c_vir c_evdw c_equip + 0 -5.3530213 0 -5.3530213 0 518847.56 518847.56 -0.10904079 -5.2439805 + 1 -5.9384459 0.58384822 -5.3545977 115.81657 517370.5 516488.87 -0.10783656 -5.8306093 + 2 -7.669616 2.3104051 -5.3592109 458.30954 512986.36 509497.58 -0.10422283 -7.5653932 + 3 -10.473314 5.1069211 -5.3663924 1013.0477 505833.04 498121.43 -0.098049469 -10.375264 + 4 -14.234705 8.859182 -5.3755227 1757.3747 496127.44 482749.79 -0.089147485 -14.145557 + 5 -18.806851 13.420941 -5.3859098 2662.28 484148.76 463882.72 -0.077305196 -18.729546 + 6 -24.021727 18.625147 -5.3965797 3694.6259 470219.95 442095.39 -0.06194509 -23.959782 + 7 -29.702647 24.295529 -5.4071176 4819.446 454683.57 417996.56 -0.042859727 -29.659787 + 8 -35.67405 30.257258 -5.4167913 6002.0599 437887.03 392197.62 -0.019248651 -35.654801 + 9 -41.771047 36.345757 -5.4252893 7209.8209 420163.51 365280.27 0.0096063065 -41.780653 + 10 -47.845522 42.413161 -5.4323614 8413.3973 401821.91 337776.7 0.044743702 -47.890266 +Loop time of 0.0506847 on 4 procs for 10 steps with 40 atoms + +Performance: 1.705 ns/day, 14.079 hours/ns, 197.298 timesteps/s +94.4% 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.04216 | 0.045656 | 0.049349 | 1.2 | 90.08 +Bond | 1.9073e-06 | 2.4438e-06 | 2.861e-06 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.00068545 | 0.004438 | 0.0079191 | 3.9 | 8.76 +Output | 0.00048304 | 0.00053334 | 0.00060964 | 0.0 | 1.05 +Modify | 1.1444e-05 | 1.4424e-05 | 1.9312e-05 | 0.0 | 0.03 +Other | | 4.047e-05 | | | 0.08 + +Nlocal: 10 ave 15 max 6 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +Nghost: 878 ave 948 max 812 min +Histogram: 1 0 1 0 0 0 1 0 0 1 +Neighs: 1192 ave 1764 max 731 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +FullNghs: 2384 ave 3527 max 1439 min +Histogram: 1 0 0 1 1 0 0 0 0 1 + +Total # of neighbors = 9536 +Ave neighs/atom = 238.4 +Ave special neighs/atom = 4 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/quip/log.24Jul17.sw.g++.1 b/examples/USER/quip/log.24Jul17.sw.g++.1 new file mode 100644 index 0000000000..c8115f4cfc --- /dev/null +++ b/examples/USER/quip/log.24Jul17.sw.g++.1 @@ -0,0 +1,83 @@ +LAMMPS (24 Jul 2017) + using 1 OpenMP thread(s) per MPI task +# Test of SW potential for Si system + +units metal +boundary p p p + +atom_style atomic + +read_data data_sw + orthogonal box = (0 0 0) to (5.431 5.431 5.431) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 8 atoms + +pair_style quip +pair_coeff * * sw_example.xml "IP SW" 14 + +velocity all create 10.0 355311 +neighbor 0.3 bin +neigh_modify delay 10 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all custom 10 dump.sw id fx fy fz + +run 100 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.2258 + ghost atom cutoff = 4.2258 + binsize = 2.1129, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair quip, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.684 | 2.684 | 2.684 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 10 -34.68 0 -34.670952 32.206289 + 10 4.5659178 -34.675073 0 -34.670942 46.253731 + 20 1.606683 -34.672391 0 -34.670937 44.736892 + 30 6.7007748 -34.677011 0 -34.670948 16.403049 + 40 5.682757 -34.676087 0 -34.670945 18.696408 + 50 2.2140716 -34.672942 0 -34.670939 37.592282 + 60 5.0475382 -34.675512 0 -34.670944 37.331666 + 70 7.0990979 -34.677369 0 -34.670946 40.533757 + 80 5.7306189 -34.676128 0 -34.670943 47.748813 + 90 5.0895648 -34.675549 0 -34.670944 38.092721 + 100 4.1070919 -34.674659 0 -34.670943 28.737864 +Loop time of 0.384233 on 1 procs for 100 steps with 8 atoms + +Performance: 22.486 ns/day, 1.067 hours/ns, 260.259 timesteps/s +94.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.38365 | 0.38365 | 0.38365 | 0.0 | 99.85 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.00017333 | 0.00017333 | 0.00017333 | 0.0 | 0.05 +Output | 0.00014162 | 0.00014162 | 0.00014162 | 0.0 | 0.04 +Modify | 7.081e-05 | 7.081e-05 | 7.081e-05 | 0.0 | 0.02 +Other | | 0.0001957 | | | 0.05 + +Nlocal: 8 ave 8 max 8 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 162 ave 162 max 162 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: 128 ave 128 max 128 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 128 +Ave neighs/atom = 16 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/quip/log.24Jul17.sw.g++.4 b/examples/USER/quip/log.24Jul17.sw.g++.4 new file mode 100644 index 0000000000..d7306c7055 --- /dev/null +++ b/examples/USER/quip/log.24Jul17.sw.g++.4 @@ -0,0 +1,83 @@ +LAMMPS (24 Jul 2017) + using 1 OpenMP thread(s) per MPI task +# Test of SW potential for Si system + +units metal +boundary p p p + +atom_style atomic + +read_data data_sw + orthogonal box = (0 0 0) to (5.431 5.431 5.431) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 8 atoms + +pair_style quip +pair_coeff * * sw_example.xml "IP SW" 14 + +velocity all create 10.0 355311 +neighbor 0.3 bin +neigh_modify delay 10 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all custom 10 dump.sw id fx fy fz + +run 100 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.2258 + ghost atom cutoff = 4.2258 + binsize = 2.1129, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair quip, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.698 | 2.698 | 2.698 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 10 -34.68 0 -34.670952 32.206289 + 10 4.5659178 -34.675073 0 -34.670942 46.253731 + 20 1.606683 -34.672391 0 -34.670937 44.736892 + 30 6.7007748 -34.677011 0 -34.670948 16.403049 + 40 5.682757 -34.676087 0 -34.670945 18.696408 + 50 2.2140716 -34.672942 0 -34.670939 37.592282 + 60 5.0475382 -34.675512 0 -34.670944 37.331666 + 70 7.0990979 -34.677369 0 -34.670946 40.533757 + 80 5.7306189 -34.676128 0 -34.670943 47.748813 + 90 5.0895648 -34.675549 0 -34.670944 38.092721 + 100 4.1070919 -34.674659 0 -34.670943 28.737864 +Loop time of 0.423803 on 4 procs for 100 steps with 8 atoms + +Performance: 20.387 ns/day, 1.177 hours/ns, 235.959 timesteps/s +90.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.39332 | 0.40011 | 0.40704 | 0.8 | 94.41 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.015632 | 0.022605 | 0.029425 | 3.3 | 5.33 +Output | 0.00025702 | 0.00028491 | 0.00035429 | 0.0 | 0.07 +Modify | 7.3671e-05 | 8.1897e-05 | 8.9884e-05 | 0.0 | 0.02 +Other | | 0.0007259 | | | 0.17 + +Nlocal: 2 ave 2 max 2 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 113 ave 113 max 113 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 32 ave 32 max 32 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 128 +Ave neighs/atom = 16 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/uef/README b/examples/USER/uef/README new file mode 100644 index 0000000000..aaf53fa2a1 --- /dev/null +++ b/examples/USER/uef/README @@ -0,0 +1,19 @@ +This directory contains two short example scripts for the USER-UEF +package. + + +nvt_uniaxial: + A simulation of a WCA fluid under constant volume uniaxial strain + with stretching in the z direction, compression in the x and y + directions.The xx, yy and zz components of the pressure tensor are + written to the log file. The simulation conditions are the same + used in the paper by Thomas Hunt [http://arxiv.org/abs/1310.3905] + and should yield an zz pressure near 5 and xx/yy pressures near 10. + +npt_biaxial: + A simulation of a WCA fluid under stress-controlled biaxial strain + with stretching in the x and y directions, compression in the z + direction. The zz stress is controlled using the ext keyword in fix + npt/uef. The xx yy and zz components of the pressure tensor are + written to the log file. The simulations conditions should yield + xx/yy pressures near 5 and zz pressure near 10 diff --git a/examples/USER/uef/npt_biaxial/data.wca b/examples/USER/uef/npt_biaxial/data.wca new file mode 100644 index 0000000000..889ba4d2f2 --- /dev/null +++ b/examples/USER/uef/npt_biaxial/data.wca @@ -0,0 +1,1022 @@ +LAMMPS data file via write_data, version 14 May 2016, timestep = 400000 + +500 atoms +1 atom types + +0.0000000000000000e+00 8.3979809569125372e+00 xlo xhi +0.0000000000000000e+00 8.3979809569125372e+00 ylo yhi +0.0000000000000000e+00 8.3979809569125372e+00 zlo zhi + +Masses + +1 1 + +Pair Coeffs # lj/cut + +1 1 1 + +Atoms # atomic + +7 1 2.4137737201272674e-01 2.0017433398687118e-01 3.6157393311703534e-02 2 1 2 +398 1 1.6739594898193126e+00 3.0313452824803544e-01 5.7986723161362197e-01 -3 0 1 +173 1 6.1370793327804556e+00 4.4978954867119525e-01 3.6568951377817088e-01 -4 1 0 +462 1 7.8754716784931862e+00 5.2908038473333074e-01 7.9185633743762940e-01 1 1 -2 +383 1 6.5373096080170212e-01 1.5337525983981986e+00 6.3208419126059423e-01 2 0 1 +288 1 1.9354124990672374e+00 1.3318105136786291e+00 3.6211635210084403e-01 -1 1 0 +303 1 2.9661308460819318e+00 1.1444058564802859e+00 6.5604777151148241e-01 -2 2 1 +491 1 7.1514675802966758e+00 1.3588685826107376e+00 1.2875068928885325e-01 -1 0 0 +187 1 3.0670386025081497e-01 2.4850915964494620e+00 7.0944157374329464e-02 0 -1 0 +163 1 1.2805212773629451e+00 2.4034621328433090e+00 2.0184086197146742e-01 0 1 -1 +345 1 2.5952244948945173e+00 2.3405536448220743e+00 3.0019149048630317e-01 -3 2 1 +447 1 3.9059163101716741e+00 1.6849179478858272e+00 6.0306488750926446e-01 -2 3 -4 +108 1 4.9215629854759335e+00 2.5174843149522088e+00 6.2779912940916158e-02 1 0 -1 +427 1 6.3978861821382305e+00 1.9201774263431104e+00 4.3981049730412797e-01 -1 -2 -3 +96 1 7.4061541304605534e+00 2.4828308207907996e+00 2.4705543772216432e-01 0 -3 2 +494 1 8.0759482343563711e+00 1.6914241739458744e+00 6.8482420189075921e-01 -3 1 2 +360 1 3.1886448226656765e+00 3.1126224743956139e+00 5.4052217066940123e-01 1 1 -2 +179 1 4.2399500260508116e+00 2.8640916432630559e+00 7.5278462735962870e-01 -1 1 1 +136 1 6.2603021059339365e+00 3.2638426060411403e+00 9.9163685662983045e-02 -2 0 3 +311 1 8.0699058291845773e+00 3.1228722160017734e+00 7.5458759573094458e-01 -3 -3 3 +242 1 8.1363443818268044e-02 3.8061968817045986e+00 5.4644298839992535e-02 1 1 1 +451 1 1.9291602479953753e+00 3.5896469823727863e+00 2.3008537852985023e-01 -1 0 0 +118 1 5.3566912079946780e+00 3.5234509548370374e+00 6.7801317822012042e-01 1 -3 -1 +200 1 6.7588369512940338e-01 6.1719413314115790e-01 9.9275606042642373e-01 -1 2 3 +23 1 2.1873327028525060e+00 4.2754803645009956e-02 1.4143560341384132e+00 -3 -1 0 +30 1 3.9592898204338112e+00 6.8093268022015185e-01 1.2987004742604558e+00 -1 -2 -2 +26 1 5.1175076813830467e+00 5.1869033157649591e-01 9.5797839381311178e-01 0 1 2 +452 1 6.5582763761917411e+00 3.4514602671261341e-01 1.2368598815410630e+00 -2 0 -2 +439 1 8.3865135868155445e+00 1.4825845267600596e-01 1.6737363681796917e+00 -2 3 1 +492 1 1.6645816560197648e+00 9.7557398318995125e-01 1.3973497820249918e+00 -2 3 1 +287 1 2.8845951500519784e+00 9.2974386224238703e-01 1.6104516406361071e+00 2 -1 2 +87 1 5.9282888423658395e+00 1.2716232081523247e+00 1.1744299163086194e+00 -1 2 -1 +191 1 7.0465887128985001e+00 1.3447129135151838e+00 1.1378718594147066e+00 -1 2 0 +316 1 6.6785856436835267e-01 2.4243200282222617e+00 1.1253836626025919e+00 0 1 0 +176 1 1.8165460632802826e+00 2.1437252128100086e+00 1.0868234266569741e+00 1 1 1 +244 1 3.5041229236927576e+00 2.3924032537771125e+00 1.3551249499971583e+00 -3 1 4 +463 1 4.9238071200835165e+00 1.7488964460038467e+00 8.7393010597649756e-01 -2 2 1 +101 1 4.7502017837518187e+00 2.5070270251466997e+00 1.6042073679153410e+00 -3 0 -2 +456 1 6.7262574842655534e+00 2.1937608587635533e+00 1.5819520420856528e+00 0 2 3 +90 1 7.8106680805872131e+00 2.3465270292028992e+00 1.4066520475037838e+00 0 -4 1 +457 1 2.2543678933961773e+00 3.1652213402916889e+00 1.1451988834668292e+00 -1 0 0 +344 1 5.9751963550424136e+00 2.8740523385222234e+00 1.2530570351392452e+00 0 1 -1 +399 1 8.2525481582297566e-01 3.4796551803028120e+00 1.0452539946382762e+00 1 -1 -1 +472 1 2.5500022667255768e+00 4.1144011701979659e+00 1.1937493716055980e+00 0 1 2 +364 1 3.2074279852156709e+00 3.3909867375667604e+00 1.5492265188845586e+00 -1 0 0 +333 1 4.2063776055408209e+00 3.7436012461483292e+00 1.2983951160694676e+00 -1 1 1 +223 1 6.0720407506223024e+00 3.9437056464141231e+00 1.5634726007362729e+00 0 0 1 +277 1 6.8850289844945918e+00 3.5744109988378070e+00 1.1843729982426427e+00 2 0 0 +487 1 8.0236797280148657e+00 4.0759691449476652e+00 1.1816920447826709e+00 -1 0 5 +202 1 1.1425010515906946e+00 1.1629395296284512e-02 2.5086432758529211e+00 -1 -2 0 +139 1 2.3147555111337756e+00 1.8665688332261610e-01 2.4220734387693037e+00 -5 0 1 +218 1 3.5367098631556342e+00 6.2760250051756761e-01 2.4478818232869410e+00 1 0 -2 +10 1 4.3729774450168737e+00 1.6632191047636544e-01 2.1079853667170236e+00 -2 -1 -2 +64 1 5.7303792911825742e+00 2.9006680684615282e-01 1.9605629224377070e+00 -2 1 2 +40 1 6.5824557178778531e-01 8.5028950299011019e-01 2.1496168105059708e+00 2 1 1 +328 1 1.5589817713112594e-01 1.6225523918451032e+00 1.7310231111691350e+00 3 0 0 +292 1 2.1314993621742819e+00 1.2260233186264009e+00 2.3652294967955245e+00 0 0 -1 +245 1 4.6666032401598603e+00 1.5042368206958292e+00 1.9142905720694421e+00 -3 1 -1 +148 1 6.7720428171922631e+00 8.7008110148972428e-01 2.0934267451930806e+00 0 0 1 +435 1 7.7341388550057273e+00 9.1983544373491155e-01 1.8223856537522831e+00 -2 -1 1 +301 1 2.9295611364078922e-01 2.4942786265027763e+00 2.2355337509297120e+00 -2 -3 -2 +476 1 1.3648021789963285e+00 1.8605609454926342e+00 2.0851101905225424e+00 1 0 -1 +310 1 2.6428836469132526e+00 2.1636738846129742e+00 1.7827293416008847e+00 3 2 0 +137 1 3.6368685754799719e+00 1.7198335009724290e+00 2.1014306554853008e+00 1 -1 1 +434 1 5.6400362255303138e+00 2.0264029757942144e+00 1.7648993119896872e+00 0 -1 0 +184 1 7.6228520959849160e+00 2.1704001606029473e+00 2.4690779972373509e+00 0 1 -1 +5 1 1.5547914352159820e+00 3.0246432147284117e+00 1.9341058666944422e+00 5 1 -2 +41 1 3.5394530649909939e+00 2.8672493763709368e+00 2.3721754433370239e+00 0 0 0 +410 1 5.2622202291807252e+00 3.3532222678989076e+00 2.0249715425869179e+00 2 1 1 +418 1 6.2986243250817040e+00 2.9042203242504363e+00 2.3450580832445986e+00 -1 2 0 +34 1 6.5845359986575269e-01 3.5330771386953552e+00 2.1708302646106170e+00 -2 3 1 +67 1 2.2321109286615104e+00 3.8391986294826608e+00 2.3598318070524229e+00 1 -1 0 +390 1 4.4001972293445766e+00 3.7784400898230768e+00 2.3530190506208175e+00 1 2 -1 +125 1 6.8584035481270371e+00 3.7859398002695177e+00 2.2262509649550242e+00 -3 1 3 +105 1 8.0142836210079444e+00 3.4253500628703644e+00 1.9822510084209746e+00 1 0 -2 +274 1 4.5713678557713822e-01 5.4244335571632307e-01 3.0849174937154351e+00 1 -2 1 +314 1 1.8447059547300777e+00 1.1692544876557610e-01 3.3199499683474132e+00 2 0 -1 +408 1 3.1814603728989130e+00 7.4387930556111925e-02 3.3119410401147560e+00 -1 1 1 +142 1 5.0629800765951494e+00 4.5529434814892644e-01 2.8994044435235393e+00 2 -1 -3 +25 1 6.1307890615815195e+00 4.8707110399724851e-01 2.9156227033318936e+00 0 2 -4 +458 1 7.5149810474983081e+00 4.9072663758191898e-01 2.7754564040841219e+00 2 -4 0 +165 1 1.3117326379233891e+00 1.1343392736952256e+00 3.1076574691841947e+00 -2 2 2 +421 1 2.7633861789985827e+00 9.5478806243591052e-01 3.1957876340691875e+00 -1 -3 1 +151 1 4.7220243778881930e+00 1.4282004346636548e+00 3.2642378377455432e+00 0 0 -1 +162 1 5.6468847674841811e+00 1.3364063405496600e+00 2.5903751818453160e+00 4 -4 -2 +120 1 8.2129099591176686e+00 1.3575499019485984e+00 2.6634845511723606e+00 0 0 0 +448 1 8.8805142887530297e-01 2.2694079305496020e+00 3.1897834611367313e+00 -1 1 3 +50 1 2.9687835700409062e+00 1.9135157390691884e+00 2.8548074734572992e+00 -3 0 1 +443 1 4.0462687470728396e+00 2.3330394967344139e+00 3.1667340148022216e+00 0 1 -2 +482 1 4.9427462157614270e+00 2.1611442624383619e+00 2.6370759110090005e+00 0 3 3 +407 1 5.7753726348779013e+00 2.4435329312939671e+00 3.1756094964019836e+00 0 1 -1 +100 1 6.6610073695947598e+00 1.9476592422501362e+00 2.6046914024931409e+00 -2 -2 1 +99 1 3.5098260053604374e-01 3.2489377905726768e+00 3.1253385231740438e+00 -1 1 -1 +107 1 1.3942178307183000e+00 3.1914627339242005e+00 2.9813408440396350e+00 2 0 1 +480 1 2.3066257454835091e+00 2.6794898513136354e+00 2.7495660819550110e+00 -1 -2 -1 +115 1 3.1214377398204638e+00 2.9223083977660864e+00 3.3233156913824242e+00 1 2 1 +278 1 5.0520729931158854e+00 3.1424127338010743e+00 3.1175324674801042e+00 0 0 -1 +206 1 7.7081484276756580e+00 3.0580419350207482e+00 3.0362913717240096e+00 0 -1 -4 +4 1 1.3000434256419220e+00 4.1733384323360649e+00 2.6659576195319934e+00 1 0 2 +214 1 3.2669228431804429e+00 3.8002115979716740e+00 2.6408106015701289e+00 0 0 0 +65 1 4.0280349657536760e+00 3.3861374196314542e+00 3.2331032594455227e+00 2 1 2 +490 1 5.8571557116011554e+00 3.8735942685941813e+00 2.8613897619661586e+00 -1 -2 0 +230 1 2.4828380364158602e+00 5.5335473677805791e-01 4.1950137944148906e+00 2 -1 3 +234 1 4.2752320357614213e+00 1.4212800762204394e-01 3.7635975156407624e+00 -2 1 -4 +92 1 5.6957646578006917e+00 2.5374658514218495e-02 3.8304068113906884e+00 0 -1 0 +103 1 7.0230616578295741e+00 4.6755655210711161e-01 3.8662999072020967e+00 1 -2 1 +129 1 8.1671299320274162e+00 5.7067862198193264e-01 4.0702212708530077e+00 -1 -2 0 +483 1 3.2862260723228903e-01 1.4557716141563948e+00 3.6577409481728278e+00 -3 4 -1 +110 1 1.5047240722693447e+00 1.0396158231062973e+00 4.0843832165787424e+00 -2 -1 0 +126 1 3.7388270640303456e+00 1.1962750537841655e+00 3.4335639532998909e+00 3 0 0 +276 1 5.6087889039130960e+00 1.1358153696317190e+00 3.7428282467743927e+00 0 2 1 +294 1 6.5127919732673050e+00 1.4345197299837358e+00 3.4448769173070444e+00 -2 0 2 +417 1 7.5734653423068021e+00 1.3756634588591667e+00 3.5078056411981438e+00 -1 1 0 +102 1 1.1107713360470239e+00 2.0167473232388695e+00 4.1576658165713738e+00 -2 0 0 +228 1 2.0072330566273600e+00 1.8105875233272237e+00 3.4619908126078429e+00 2 0 -1 +2 1 3.2101113937010530e+00 2.0183489554560774e+00 3.8822820800419566e+00 0 1 -1 +222 1 4.2730523271288350e+00 1.9092752363315002e+00 4.1553216684001049e+00 1 -1 0 +332 1 6.5042309397343736e+00 2.2214607151080448e+00 4.1057034120156182e+00 0 1 3 +275 1 7.5099659540449100e+00 2.2790896507455778e+00 4.1566328430638730e+00 -1 0 -1 +243 1 8.2736142057938107e+00 2.3393256795577462e+00 3.4990413844829384e+00 0 0 -2 +394 1 5.8512440497757878e-01 2.8807282965119669e+00 3.9612614891397042e+00 1 3 1 +325 1 2.1875714466797338e+00 2.8726101452768167e+00 3.8147636089102748e+00 0 2 -1 +468 1 5.6059790271973755e+00 2.9975764588671621e+00 3.9816014902843078e+00 0 1 0 +113 1 6.5849924400139104e+00 3.1808065990344776e+00 3.4367361163256929e+00 0 0 1 +47 1 1.0081753047752569e+00 3.9556172416934308e+00 3.8502376136806813e+00 1 -1 0 +474 1 1.9694475511677239e+00 3.9381337754040748e+00 3.4201230948176762e+00 4 1 -1 +343 1 3.0370114219017328e+00 3.9465351732349148e+00 3.7436387890882474e+00 0 -2 3 +257 1 6.0639634839200358e+00 3.9545122043987475e+00 3.7922755780058259e+00 1 3 -3 +422 1 7.3939236737263112e+00 3.9358351587357783e+00 3.4932390476416106e+00 -2 -1 -3 +317 1 3.5159353631335000e+00 5.3479576975233323e-01 4.4869163379906354e+00 -1 -2 -4 +322 1 5.5733359556605757e+00 4.8698103039818835e-01 4.7704783768556309e+00 1 6 -1 +453 1 7.3567123647601029e+00 8.3432787155128474e-02 4.8780449077720851e+00 -2 3 2 +82 1 5.8224871123849942e-01 1.1896491837492689e+00 4.7267276175254507e+00 3 0 -1 +402 1 2.4848673528490579e+00 1.6438582837634208e+00 4.4663750233867230e+00 0 2 3 +201 1 3.5370299676438193e+00 1.4874347892452509e+00 4.7752714735806165e+00 0 -2 -1 +159 1 4.7745775925936407e+00 9.0511891230699659e-01 4.2787903105333260e+00 0 -2 2 +239 1 6.3670232447984816e+00 1.2120460051587267e+00 4.4601763672019308e+00 0 1 -1 +340 1 7.6240687426290750e+00 1.3432987598476136e+00 4.6741720105351368e+00 -2 1 1 +246 1 6.4819140516389595e-02 2.1918155429312383e+00 4.6033031341679633e+00 0 2 1 +268 1 5.2454607296226170e+00 2.0016193334579642e+00 4.2366338410742728e+00 -2 2 0 +238 1 1.7670560071066166e+00 3.0774892421151585e+00 4.7759677543328642e+00 0 0 0 +183 1 2.7500175098986750e+00 2.8066272725663279e+00 4.6976729622871014e+00 -2 0 0 +393 1 3.6570205199594930e+00 3.1994600133365143e+00 4.2220986255821451e+00 1 2 -1 +177 1 4.6077861627416805e+00 2.8922144055644265e+00 4.5492372075807843e+00 0 -1 0 +97 1 2.5306051464072796e+00 3.9363146816844674e+00 4.9489842130852137e+00 2 0 1 +16 1 5.1924745493168265e+00 3.7357318418579575e+00 4.8717896643693246e+00 0 -2 -1 +15 1 6.1086100243278070e+00 4.1952083415168335e+00 4.9407045230806066e+00 -1 0 -4 +467 1 6.6872865628091098e+00 3.3657369472951393e+00 4.6943068780100674e+00 1 2 2 +404 1 8.0052336596808171e+00 3.5358005023997046e+00 4.5274309747477952e+00 2 2 -1 +190 1 9.4380374464947103e-01 4.4583992222855645e-01 5.4653306453144710e+00 1 0 1 +429 1 1.8525920421435695e+00 3.5762708549602490e-01 5.0946475568663319e+00 3 0 2 +356 1 3.9097878727975877e+00 6.1716052733039095e-01 5.4734744838905147e+00 -3 1 -1 +459 1 5.0297951477539122e+00 6.4682655744305417e-01 5.6718176557063691e+00 0 1 1 +140 1 6.3845220800541655e+00 6.6200714540119532e-01 5.4418985717149972e+00 2 -1 -2 +121 1 6.3608122327251349e-01 1.6422337064097718e+00 5.7379184381145940e+00 -2 -1 -1 +76 1 2.6863089369401427e+00 9.2826845731889596e-01 5.1620994403726908e+00 -1 -1 -1 +24 1 4.4731219011860990e+00 1.5605471103773427e+00 5.2523372789875760e+00 0 -1 -1 +215 1 5.5638567276602870e+00 1.5540980050800413e+00 5.2788517723209116e+00 2 1 0 +406 1 7.1965017439495353e+00 1.2927814031197866e+00 5.6667263284723859e+00 0 2 -2 +495 1 8.1400977173034548e+00 9.1998286287268760e-01 5.5427200454151757e+00 6 1 0 +256 1 1.5858394354874155e+00 1.8927406862702940e+00 5.2157829401895270e+00 4 0 1 +348 1 2.8144079358075680e+00 2.0457885486401644e+00 5.4765038200952452e+00 1 -1 2 +18 1 3.7959072614405218e+00 2.4151932066273840e+00 5.1090004037855792e+00 0 -2 -3 +259 1 4.8058181463022738e+00 2.5068639859502841e+00 5.5173228168937900e+00 0 0 1 +261 1 5.9067727879570278e+00 2.4818772803689844e+00 5.0470051254431221e+00 0 0 -3 +433 1 6.6238775496086628e+00 2.4655070126810084e+00 5.8390299036823690e+00 -4 1 0 +119 1 7.4961811313748150e+00 2.2560858298720374e+00 5.2761246161627531e+00 0 -2 0 +181 1 8.7803165796510541e-01 2.5368621724963174e+00 5.1009676967579534e+00 3 -4 -2 +392 1 1.3563447389359846e+00 3.2004762283973394e+00 5.8237816659365569e+00 0 1 -1 +436 1 2.3946011665804514e+00 3.0278168308484168e+00 5.6997814720410966e+00 1 1 2 +210 1 5.9632298308600022e+00 3.3253508577291475e+00 5.7908436280268685e+00 0 -1 -2 +409 1 8.2954742717592467e+00 2.8784369153928258e+00 5.3508660402584347e+00 0 0 0 +437 1 7.8285811502936531e-01 3.5972247646914322e+00 5.1173576054548029e+00 -1 2 1 +114 1 3.5350435499222215e+00 3.3621891050940294e+00 5.4926280066777995e+00 0 -1 1 +431 1 7.2810459589983303e+00 4.1806346853520422e+00 5.1699487852752508e+00 0 -1 2 +296 1 2.7493301442805773e-01 9.8739001637521445e-02 6.5256735912844297e+00 2 0 -1 +477 1 2.7650505314326872e+00 5.9323041848923519e-01 6.1880566096904213e+00 -1 0 -2 +199 1 3.8449072993955937e+00 6.8021783868606100e-01 6.5252139926754094e+00 1 0 -1 +31 1 6.8196091485194961e+00 6.5962784856610523e-01 6.6694400071986637e+00 0 -2 -1 +149 1 7.6325509159351759e+00 1.3582393886225264e-01 5.8995743775761014e+00 0 1 -2 +216 1 9.7752025904362638e-01 1.4078822836813889e+00 6.6728311339234487e+00 2 0 1 +425 1 1.7005586383875275e+00 1.1280428057946255e+00 5.8993957526091192e+00 -2 5 2 +224 1 2.8675797989920913e+00 1.6348520503423174e+00 6.4743030869420952e+00 1 0 0 +352 1 3.7461129077349202e+00 1.6467836683144792e+00 5.9711819974315681e+00 0 2 1 +289 1 5.0071286046398447e+00 1.3773263732616476e+00 6.4710057868740503e+00 2 -1 2 +455 1 6.2266605172975309e+00 1.4566180649712972e+00 6.2025029141131824e+00 0 1 2 +298 1 7.2166245583854813e+00 1.5995071342823830e+00 6.6916596114412981e+00 -2 2 -2 +42 1 8.3616236989495309e+00 1.1193553859054726e+00 6.6834990220304640e+00 1 -1 -1 +80 1 1.7994758316879240e+00 2.0602535563487749e+00 6.2756102858385763e+00 1 -1 -2 +127 1 4.3098326176630284e+00 2.3959981453352577e+00 6.4129162374884245e+00 -3 2 -4 +232 1 5.4258898148163945e+00 2.3715461809208245e+00 6.2879862147301759e+00 1 1 -4 +368 1 8.2199446060636472e+00 2.1052670796140989e+00 6.3974575157449376e+00 -1 -1 -2 +486 1 6.9787179588597281e-01 2.5321347977480562e+00 6.5634477651369929e+00 1 -2 1 +209 1 1.7697882729109665e-01 3.3153947644324067e+00 6.2408024968147000e+00 -1 0 -2 +152 1 3.1591516689848946e+00 2.6297173021869003e+00 6.2970081587154914e+00 -1 3 2 +353 1 3.7775468094107074e+00 3.3545010039524996e+00 6.5652719772105916e+00 0 -2 1 +361 1 7.1568303860427589e+00 3.3402954049017803e+00 6.0487812936573579e+00 1 1 0 +391 1 1.8477885811255761e+00 3.9829271272845177e+00 6.5960694610186286e+00 2 0 -1 +464 1 2.8125899145281190e+00 3.9218837233739201e+00 6.1411786897515759e+00 -2 2 1 +497 1 4.5524588331963729e+00 3.4967999912980696e+00 5.9321819433594642e+00 1 -2 2 +498 1 2.0830532473234906e+00 1.1220036849985102e-01 7.1674325217309276e+00 3 3 -1 +264 1 3.1008573853993013e+00 7.6076625369238260e-01 7.2316131354301971e+00 1 1 2 +265 1 4.6342157774659736e+00 7.4471207241976944e-01 7.1556952519725225e+00 0 -1 1 +350 1 5.7838647346068255e+00 5.9645078928256690e-01 6.9763870948006925e+00 2 -2 0 +144 1 1.9122165150526358e+00 1.1329756208528616e+00 6.9185463020768152e+00 0 1 1 +17 1 3.7256587791934250e+00 1.6333740129131904e+00 7.1341698423474043e+00 0 0 0 +441 1 3.6115685474483350e-01 1.9101453221098965e+00 7.5303824824165133e+00 0 1 2 +266 1 1.4762191689510862e+00 2.4662450761248356e+00 7.5398542897976331e+00 -3 -2 -2 +375 1 2.3309589830172550e+00 2.0436669163885055e+00 7.1892097709618481e+00 0 1 0 +351 1 4.7143585284219309e+00 1.8434829864646978e+00 7.2780594229535307e+00 1 0 1 +254 1 5.9170265466448875e+00 1.9140788620193201e+00 7.1554204752492074e+00 0 1 0 +29 1 1.5191420610560982e-01 2.9876711650320327e+00 7.5404622831951533e+00 1 -2 0 +198 1 1.9302038195524280e+00 2.9894398797282253e+00 6.7310853131736357e+00 2 -1 -2 +197 1 3.3083005500744571e+00 2.6144599213348498e+00 7.4059907643060248e+00 1 0 2 +192 1 4.3810729888763209e+00 2.8557380429470860e+00 7.4007735378272006e+00 1 0 1 +220 1 5.1223945377780948e+00 3.3376038243952149e+00 6.7920010375935584e+00 0 0 1 +432 1 6.2458841824934863e+00 2.9482647398415351e+00 6.8353911959966540e+00 0 2 -1 +20 1 7.5153792083913968e+00 2.5459516140888447e+00 6.9548679851000408e+00 3 -1 -2 +63 1 1.0659006163620912e+00 3.4796280956085210e+00 7.1592343773906313e+00 0 1 -2 +446 1 7.1139268453604680e+00 4.0629892995134789e+00 7.0800362551664415e+00 1 -3 -2 +172 1 8.3244437231535144e+00 4.0795393733923691e+00 7.1857426258997332e+00 2 0 -1 +405 1 2.0158180111850474e-01 7.3000938410316307e-01 7.6191994505829879e+00 0 -3 0 +323 1 1.4017230037752237e+00 4.6050949606146502e-01 7.9006469000953414e+00 2 1 -1 +428 1 2.4287753885012338e+00 4.6438480937363963e-01 8.3560508824421493e+00 3 0 2 +280 1 3.6502596381287908e+00 7.8205464112991063e-01 8.2256571665042131e+00 3 1 -1 +54 1 5.2270258856938900e+00 5.3851997974995880e-01 8.1047016704593808e+00 -1 0 -5 +397 1 7.4044521194737944e+00 1.4880482327788007e-02 8.2278445496777337e+00 1 0 2 +279 1 1.2356833818326960e+00 1.5625251472088779e+00 7.9109615213928013e+00 0 4 -2 +134 1 2.5628613498785486e+00 1.5781156241932268e+00 7.9994516338459301e+00 0 1 -1 +236 1 4.5573192582583912e+00 1.4401963680745278e+00 8.1580516205465621e+00 0 3 -3 +493 1 6.1321864263285528e+00 9.9745261592364498e-01 7.9044637123188437e+00 0 3 -3 +346 1 7.4631508711766701e+00 8.7980227698742530e-01 7.6161632460447608e+00 2 -1 -1 +295 1 3.6674081936683844e+00 2.3602153939048316e+00 8.3119852957626765e+00 0 1 -2 +164 1 5.5460188609614756e+00 1.8259166833804881e+00 8.1712445391317772e+00 -2 -2 -1 +354 1 6.6872220974400829e+00 2.0300640265600358e+00 7.8561422683464270e+00 1 2 0 +449 1 7.9034553200360103e+00 1.8534144914629234e+00 8.0299472682703943e+00 -1 -3 0 +185 1 9.5448193278219684e-01 3.3578879558028460e+00 8.1917731250955708e+00 1 1 -1 +229 1 2.5099351180061946e+00 3.0097254013180406e+00 7.8296711975898541e+00 -2 2 -1 +135 1 5.5895093348111047e+00 2.7786209311728598e+00 7.5930433616327404e+00 -1 0 -2 +211 1 7.0529928021063730e+00 3.1919477500830000e+00 7.6370125321552074e+00 -2 2 1 +81 1 1.8872269150105381e+00 3.9351057043865243e+00 7.6163648141042426e+00 0 -1 1 +37 1 3.6614705509244851e+00 3.4915765263742262e+00 7.7267865376074960e+00 2 0 1 +355 1 4.5831332879360058e+00 3.8667909487066860e+00 8.3349240075214972e+00 1 -2 0 +141 1 5.4975686789962985e+00 3.7534665361901731e+00 7.8536976598839008e+00 1 3 1 +122 1 7.2999342247943373e+00 3.9738648524411286e+00 8.3865006440763370e+00 0 -1 -2 +327 1 3.2503689184711210e-01 4.6592524224991747e+00 8.2659471361477532e-01 0 -2 2 +386 1 1.1858359917362140e+00 4.2742921253409367e+00 2.8183822072239956e-01 -1 -2 5 +59 1 1.8702404230468521e+00 4.9717730076471947e+00 7.6874981917086671e-01 0 2 -3 +57 1 2.8167286953460633e+00 4.2569068178507328e+00 1.1953882254793591e-01 1 -1 1 +489 1 3.6302378764516323e+00 4.4521177967574310e+00 6.6729235313037527e-01 1 1 5 +326 1 4.9856357064009993e+00 4.5330987087989216e+00 5.2454407858907726e-01 -1 2 2 +359 1 5.9913033298564331e+00 4.3362327743167306e+00 3.7835915829420080e-01 2 -1 -1 +349 1 7.2426723526689933e+00 4.7181533524380885e+00 7.2707643667494415e-01 0 1 -2 +247 1 8.6433343008963215e-01 5.6823007167579762e+00 6.5224250416194052e-01 1 -3 2 +365 1 3.8233209759419231e+00 5.6939269324333672e+00 5.9607489711922135e-01 -1 -1 0 +382 1 5.1137068164970731e+00 5.5805604939667059e+00 1.8276059551769425e-01 -1 -2 1 +130 1 8.2482820181805554e+00 5.5968590423898927e+00 4.4653409437071251e-01 -1 -1 2 +471 1 1.7119665678072469e+00 5.8953695416344436e+00 4.5930053740843135e-02 -2 0 1 +21 1 2.5641267140454049e+00 6.3080369711057624e+00 5.3936073769936865e-01 1 -2 0 +499 1 4.7164689695839286e+00 6.6465500795405017e+00 1.6611623106065540e-01 -1 -1 1 +253 1 5.9043290983731245e+00 6.1331552003521068e+00 7.5404520106110218e-01 3 -1 0 +302 1 6.9564884663410282e+00 6.1640675729464434e+00 5.7033134187391044e-01 0 -1 -1 +324 1 8.1992983060509594e+00 6.5972265856779417e+00 7.7494747996129210e-01 1 -3 2 +154 1 1.8996589089571863e+00 7.1193783454022102e+00 5.1404963792269565e-01 -3 -1 -1 +284 1 3.0007790559640597e+00 7.2198187648711993e+00 2.3642486802169203e-02 0 0 0 +161 1 3.8133207311484072e+00 7.3201299304675667e+00 5.0202507839899535e-01 -2 -4 -2 +112 1 5.6724794675417822e+00 7.1979165692397187e+00 7.3233205047939343e-01 -1 -3 -2 +39 1 6.4178033104766934e+00 6.8891409921259603e+00 1.5315709015991064e-01 0 0 2 +269 1 7.4906317471214443e+00 6.7375050108085421e+00 4.8287801879068511e-02 3 1 0 +470 1 2.2822847309207428e-01 7.8917014242385868e+00 7.7675485207454809e-01 0 0 1 +84 1 1.3672512040847244e+00 7.9379711016796204e+00 1.6230344562139010e-02 1 0 -3 +381 1 2.6740213254054948e+00 8.0161072175846630e+00 5.8246256296805565e-01 -1 -1 1 +416 1 3.6213693754100857e+00 8.3576521057616233e+00 6.2331560400527297e-01 2 2 -1 +182 1 5.1660049409085866e+00 8.0423641799361949e+00 3.0675573970032322e-01 -2 0 -1 +347 1 6.5429973279348026e+00 7.8912499362162034e+00 4.9818784876300565e-01 -1 1 -2 +380 1 7.4990421428201417e+00 7.6756533739549013e+00 7.5184655726615468e-01 -3 0 0 +19 1 1.4643514526638863e+00 4.2228380130315317e+00 1.3843336624933156e+00 0 3 -1 +430 1 4.3057981012626918e+00 5.0291601875436083e+00 1.2152759600723888e+00 1 1 -2 +212 1 5.0477378389079224e+00 4.2727344176247888e+00 1.5457805058503180e+00 -2 -1 2 +479 1 7.9063585867776194e+00 4.9679041912501303e+00 1.6188677256489217e+00 1 3 -1 +217 1 2.5218672599222897e-01 5.8414577361250837e+00 1.5087288813722908e+00 2 1 2 +147 1 1.1545026869668784e+00 5.3345315151941692e+00 1.5114087897016817e+00 1 2 -1 +13 1 2.8751716646412713e+00 5.2058560720828826e+00 1.0454367061984737e+00 -2 1 -1 +170 1 5.1473087472466297e+00 5.7979187654554183e+00 1.4646868436401976e+00 1 2 0 +204 1 6.2817592200581442e+00 5.1972845711964553e+00 8.9956483663207842e-01 -1 -1 -1 +306 1 8.3865328816009488e-01 6.6369969836196416e+00 9.5403861420405511e-01 1 -1 3 +414 1 1.6815920771923107e+00 6.1626367729687450e+00 1.1744973520180511e+00 0 2 0 +79 1 3.3223472300560521e+00 6.2059256452802716e+00 1.3962300133956274e+00 0 0 0 +116 1 7.6213827835593815e+00 5.9109006810695996e+00 1.2032264335528675e+00 -2 -1 3 +231 1 2.7502476364406934e+00 7.3933926752228123e+00 1.4247539952768773e+00 3 -1 1 +171 1 4.7071880050572981e+00 6.8064285791523735e+00 1.2807974821888473e+00 0 -2 1 +273 1 7.0329000376929018e+00 6.8584131720717227e+00 1.6693583798609657e+00 -2 1 -1 +260 1 8.0496857982994889e+00 7.4547112671714686e+00 1.6374112984134654e+00 3 -1 -2 +43 1 1.0723712760276345e+00 8.0330657119523838e+00 1.4245919245059160e+00 -2 1 0 +208 1 4.3910624755767662e+00 7.9590156044378260e+00 1.1638330407357564e+00 -2 -2 -1 +226 1 5.5077902922207063e+00 8.0548948337249193e+00 1.2764179622713128e+00 0 0 2 +370 1 6.4142184578798505e+00 7.6748965104033502e+00 1.5118878610721513e+00 1 1 1 +85 1 4.9493682223295465e-01 4.4925581352788218e+00 1.7962077237252332e+00 2 0 0 +213 1 2.1575495906041722e+00 4.9142597626853277e+00 1.8811900528366003e+00 0 3 0 +299 1 3.3659976969419567e+00 4.3662606017243588e+00 1.7255850309353928e+00 3 -1 -2 +249 1 4.7082373488231886e+00 4.9470082900514569e+00 2.3877787475724284e+00 0 0 1 +258 1 5.7775488222451887e+00 4.8696821219175135e+00 2.2927307255193869e+00 -1 0 -1 +388 1 6.8398302583746604e+00 4.7642336931962808e+00 1.8670074890749995e+00 1 -4 -3 +91 1 7.7108281252011066e+00 4.3462922152329373e+00 2.4115614404022634e+00 2 -2 1 +415 1 1.3354264256961873e-01 5.2683808667768846e+00 2.4940378524658144e+00 0 3 0 +27 1 2.0564207334277329e+00 5.6999752852325889e+00 2.4901436865643838e+00 0 -2 -1 +465 1 3.6077777180133985e+00 5.3106225786683270e+00 2.2984375934854913e+00 1 4 2 +72 1 1.2115862831734683e+00 6.3271145377400213e+00 2.3088380865765914e+00 -1 -2 -1 +58 1 2.4730215910430200e+00 6.4108021967014599e+00 1.8872921058165837e+00 2 -2 2 +88 1 4.2468496124355051e+00 6.0000736368680991e+00 1.9689248186008255e+00 1 0 -1 +6 1 5.2824888171486872e+00 6.1177755165021708e+00 2.4648490036232666e+00 0 -3 1 +75 1 6.5540148621238368e+00 5.8837981825070473e+00 1.8049347572360399e+00 -3 0 4 +22 1 7.8390642986715990e+00 6.6390504342942007e+00 2.2941937725662940e+00 0 1 0 +128 1 5.0900588055916374e-01 6.9175984002222233e+00 1.8531623061329514e+00 -1 0 1 +193 1 1.7616411201473283e+00 7.3777929885216569e+00 1.8819221158557660e+00 -2 0 0 +389 1 3.8054852300865960e+00 7.1908689074118346e+00 1.6897648139570383e+00 1 -1 -1 +241 1 3.3304867419800805e+00 6.7201719117843943e+00 2.3881392654044515e+00 0 1 0 +14 1 5.6091745306383807e+00 6.8869789388403264e+00 1.7385824045568810e+00 0 -1 0 +307 1 2.6028552221612093e+00 7.5983757451277896e+00 2.5134014261731092e+00 -1 1 0 +401 1 3.3924470446908370e+00 8.2185878004411617e+00 1.7224400376656741e+00 -3 -2 2 +248 1 4.8372436612670020e+00 7.6440956091999794e+00 2.0947200376368853e+00 2 -3 0 +335 1 7.0823280457514208e+00 7.5905134700352388e+00 2.4694687185743178e+00 -1 0 0 +281 1 7.4000691269637358e+00 8.3890728034516613e+00 1.8965880690997261e+00 -1 -1 0 +33 1 2.6215904333511340e+00 4.6944190932346643e+00 2.8031190571610427e+00 1 1 1 +221 1 3.7745777664099962e+00 4.5666560881588492e+00 3.0592511133135365e+00 0 -1 1 +251 1 6.7715334943605834e+00 4.6401458096684580e+00 2.8510683358464712e+00 1 -2 -2 +138 1 1.1922779528936784e+00 5.1973855619084013e+00 2.5689556972218521e+00 0 1 0 +73 1 4.3331751132449305e+00 5.7904710852531096e+00 2.9618985356431899e+00 0 -2 2 +237 1 6.2300560736724488e+00 5.7475979505901522e+00 2.7248929404434143e+00 3 0 0 +77 1 7.3913602469000059e+00 5.6780386160747609e+00 2.6234944353061729e+00 -1 -1 3 +339 1 2.9546703425028309e-01 6.2132195219954411e+00 2.7867557714215443e+00 0 0 2 +69 1 1.3562182919504069e+00 6.0134582221288868e+00 3.2785943115156346e+00 0 -2 1 +150 1 2.9668876558472732e+00 5.9472670316673391e+00 2.8936146954206632e+00 3 -2 -1 +219 1 1.1608118939764323e+00 7.3228681938207032e+00 2.7126116817865631e+00 0 -3 -1 +9 1 2.0627854045350777e+00 6.7454186793237145e+00 2.9360002216641958e+00 0 -2 -2 +3 1 2.9445094497077151e+00 7.1384526732484925e+00 3.3587771406211751e+00 2 -1 -2 +93 1 3.8294061315771235e+00 7.5378392781893275e+00 2.8380550678413003e+00 -1 2 0 +68 1 4.5306997862577427e+00 6.7390306077267583e+00 2.7235217150491495e+00 1 1 3 +35 1 5.4701910601523354e+00 6.9880160912814793e+00 3.3190052755169512e+00 0 0 -2 +174 1 6.2873908725084267e+00 6.7805871501360224e+00 2.7219816088319484e+00 -1 0 2 +369 1 1.7965435829527715e-01 8.0388194202620209e+00 2.5940286664394834e+00 -3 -2 1 +469 1 4.9516921171039039e+00 7.8826764349301754e+00 3.0530014528334970e+00 0 -2 -1 +270 1 5.8608285132223106e+00 7.6946678024150144e+00 2.6778659829007898e+00 0 -1 -2 +196 1 7.6768577919393455e-01 4.8792664640921366e+00 3.5903070116215088e+00 3 -1 1 +235 1 4.2285310787746502e+00 4.2638690385284841e+00 4.1560966227762339e+00 1 1 1 +104 1 4.9767847616154004e+00 4.2048445393860883e+00 3.3962447019771562e+00 -1 -2 4 +363 1 5.8883238331527643e+00 4.9482373301020921e+00 3.4294316309792547e+00 0 0 3 +440 1 8.3695482926311691e+00 4.2129368246316421e+00 3.4018022112738615e+00 -1 2 1 +271 1 1.8521235523587734e+00 5.0753345126075313e+00 3.3807703470063983e+00 0 2 1 +385 1 3.2904276665596646e+00 5.1796485809465160e+00 3.7980367644038786e+00 -3 -1 0 +367 1 4.4116421156217953e+00 5.2602223360914149e+00 3.9453911592241386e+00 1 1 0 +8 1 5.3112651984610038e+00 5.7540585999932050e+00 3.4831459566385630e+00 3 1 0 +445 1 6.8973470747727381e+00 5.7304789961834581e+00 3.7043310817118127e+00 -2 -1 2 +95 1 8.3390772303693836e+00 5.5440620917552232e+00 3.7707087770664116e+00 -2 1 -3 +227 1 2.6907357337748437e+00 5.9773212885609901e+00 3.9377639031978284e+00 -1 -2 0 +45 1 3.9484717591019058e+00 6.4426795460159951e+00 3.6915638730283460e+00 0 1 -1 +62 1 6.2921228111843934e+00 6.5338531152740655e+00 3.8634903896998787e+00 1 0 -3 +309 1 7.4708902093515182e+00 6.5908652825436720e+00 3.6007172393059794e+00 0 -2 0 +70 1 1.1631280783050528e-01 7.0230287218135894e+00 3.4578008409773004e+00 -1 -2 2 +285 1 1.4425208756199777e+00 7.4192404188139784e+00 3.7903676842933867e+00 0 1 -1 +387 1 2.1212416378368082e+00 6.7926691438538640e+00 4.1965603113934069e+00 1 -2 -1 +484 1 4.6356188966878253e+00 7.3783035166039177e+00 4.0565969174155132e+00 0 -1 -1 +98 1 6.8865210518165370e+00 7.3140090488700187e+00 4.1918733358514384e+00 0 -2 -2 +282 1 6.6401301602074470e-01 7.9757076330778913e+00 3.4568068256572881e+00 0 0 2 +203 1 2.5721741898113022e+00 7.9369081377447577e+00 4.0156309667060688e+00 0 3 0 +189 1 3.6912207664687133e+00 7.6806375475121094e+00 3.9059717431750585e+00 0 -1 0 +267 1 6.5713653654298607e+00 7.8128923355065503e+00 3.4078724648171090e+00 -3 -3 2 +155 1 7.9603563078893247e+00 8.1399268391964696e+00 3.4070072411074963e+00 -2 -3 -1 +313 1 1.7289301235151016e+00 4.3022360027322257e+00 4.5514630316827649e+00 0 1 -2 +250 1 3.3811553057719541e+00 4.4820133651244189e+00 4.8062617116575304e+00 1 1 1 +49 1 5.2294045670482578e+00 4.6507731504297771e+00 4.3588420415784839e+00 -1 2 -1 +111 1 6.9650608689197728e+00 4.6666276346705935e+00 4.3879356756979719e+00 1 1 -1 +124 1 8.0933085752880096e+00 4.6382186065764790e+00 4.3125441053619298e+00 1 1 -1 +488 1 5.0933114935797996e-01 5.1359886989747769e+00 4.5948583401263194e+00 -3 1 -2 +48 1 1.5851307073885004e+00 5.5767207395220701e+00 4.2311661806996650e+00 2 -2 1 +123 1 2.5153837170534041e+00 5.0458650845269890e+00 4.5131929409242613e+00 -1 -1 -1 +423 1 5.8208012531410862e+00 5.4948336589690365e+00 4.5916227902397422e+00 2 1 2 +329 1 7.4993364070942770e+00 5.4866100873090584e+00 4.5194723854672301e+00 -2 -2 -2 +334 1 7.1205767430238509e-01 6.1834005542640256e+00 4.2284519502384050e+00 0 1 -1 +146 1 1.3925739327604780e+00 6.6428737862846399e+00 4.8806888882719424e+00 0 1 -2 +500 1 2.2236367185474757e+00 6.0145074663436873e+00 4.9428276989368829e+00 0 1 1 +46 1 3.3290620592760245e+00 5.9295614805296450e+00 4.9789176350871935e+00 1 -1 -3 +374 1 4.7036984817853460e+00 6.2326093994181564e+00 4.3534332596232463e+00 -2 3 2 +52 1 6.8604388860085521e+00 6.3207993870641257e+00 4.9959828655023273e+00 0 -1 -1 +466 1 8.0663702260053096e+00 6.4797694103942982e+00 4.3885769098322607e+00 0 -1 -1 +272 1 6.3857634591010626e-01 7.4306626388140797e+00 4.4685908728843007e+00 -1 0 -1 +331 1 3.1923815943971330e+00 6.8406621847783482e+00 4.3673687027144910e+00 -1 -2 0 +12 1 5.5841339297795631e+00 7.2882403606371549e+00 4.4466343965097535e+00 4 3 0 +178 1 7.5912726284672463e+00 7.0457277620611389e+00 5.0302483408547527e+00 1 -2 0 +376 1 3.5187241629329796e-01 8.3977706803073371e+00 4.6278412560289910e+00 1 -5 2 +117 1 1.3379826357324891e+00 8.3239351364630743e+00 4.2945291322530599e+00 3 0 1 +419 1 1.8896223988418746e+00 7.6393579746671740e+00 4.8168734901107717e+00 0 1 2 +379 1 3.9801436864751545e+00 7.7556819889833708e+00 4.9922836416209275e+00 -1 -2 0 +53 1 4.7488025467298804e+00 8.2113497019933241e+00 4.7088252949914393e+00 -3 0 -1 +28 1 6.4645893658779787e+00 8.2802587137451660e+00 4.5908064174413035e+00 -1 0 -2 +300 1 8.0497419370896441e+00 7.6196002867575432e+00 4.2909429383935933e+00 0 3 0 +83 1 1.5533997706565803e+00 4.2394383012204173e+00 5.5726999917011435e+00 0 0 -1 +304 1 2.5788446900543724e+00 5.0166498820006939e+00 5.6119573167673691e+00 0 -1 0 +51 1 4.2443804124641717e+00 4.2352637746580450e+00 5.1927633388220640e+00 -2 -3 1 +180 1 8.3861058182094546e+00 4.2682396578102644e+00 5.2739914655295381e+00 2 -2 0 +60 1 1.6015559581031933e+00 5.1463292330916399e+00 5.1677022459932900e+00 3 -3 0 +255 1 3.9377408204864559e+00 5.5446289337866919e+00 5.6880007643189954e+00 -1 1 -1 +336 1 4.8593163697287496e+00 5.2245778091909907e+00 5.0488368666183758e+00 0 -1 0 +74 1 5.8562368106306470e+00 5.1343487602136690e+00 5.4844996621256241e+00 -1 -1 -1 +11 1 6.8757956599703460e+00 5.1962144116573894e+00 5.2833696751528123e+00 1 -1 1 +106 1 7.8813740148695439e+00 5.1326569274050362e+00 5.5073989898629776e+00 -2 0 1 +342 1 6.9861903942379322e-01 6.2397324279420259e+00 5.5554818983126264e+00 1 2 1 +366 1 1.5648860489287066e+00 5.8898927909510999e+00 5.8373116466465662e+00 -2 1 1 +153 1 2.7314006683241487e+00 6.0747252624615822e+00 5.8658792109688322e+00 2 0 0 +384 1 3.7649825100367740e+00 6.6140228235604797e+00 5.7068894568556274e+00 3 0 -1 +444 1 5.5919895424131791e+00 6.4007885907393334e+00 5.0609268438363237e+00 0 0 1 +169 1 8.1101285040334883e+00 6.0263607659074259e+00 5.3262646023669920e+00 2 -3 2 +312 1 1.5049751572049341e-01 7.0899457593186419e+00 5.3993285616214672e+00 -4 -1 2 +131 1 2.1405833530478784e+00 6.8932472731161107e+00 5.7016479425245992e+00 -1 -2 -5 +290 1 2.9965099079972810e+00 7.1703954961127128e+00 5.3705836189910157e+00 3 2 0 +240 1 4.7341951239220323e+00 7.1100411829110195e+00 5.1242936547927025e+00 -1 -4 5 +403 1 1.1346681749692125e+00 7.6627110490212882e+00 5.5800616996766177e+00 -3 2 3 +438 1 2.6845809734218404e+00 8.2016169024289791e+00 5.0687325841194584e+00 0 1 1 +420 1 4.5890023008209200e+00 8.1137042645946345e+00 5.6817522441295134e+00 -1 -3 -3 +175 1 5.5503185230040479e+00 7.9962207684468503e+00 5.3390442156703726e+00 -1 -2 1 +305 1 6.7862386693055941e+00 7.6108734242812508e+00 5.4748415197806564e+00 -1 0 0 +341 1 7.4912815420537060e-01 4.3291768420078673e+00 6.1635194432999105e+00 -3 0 0 +291 1 3.3895079643780628e+00 4.7034241504608403e+00 6.1615817441829774e+00 -1 0 1 +372 1 4.6184126650372983e+00 4.6292373343220516e+00 6.3125880555070495e+00 1 -1 -2 +293 1 5.5228203863122962e+00 4.2760181362826257e+00 5.8887719440294752e+00 2 2 2 +461 1 6.6292898049431850e+00 4.3535966489510214e+00 5.9130834363303126e+00 0 -1 -1 +263 1 7.7259268091094802e+00 4.4631499768470926e+00 6.3337285974251110e+00 -3 0 0 +473 1 5.8703225638324330e-01 5.3945075957215893e+00 6.1889975824903258e+00 1 -2 0 +166 1 1.6857123760309740e+00 5.0889285259544463e+00 6.6009674185523135e+00 2 2 2 +132 1 6.2122393744706681e+00 5.4126385838431412e+00 6.6911128610756689e+00 -1 2 1 +32 1 7.1447545314606753e+00 5.2817185569927805e+00 6.2574893275776935e+00 -1 1 0 +475 1 3.1727782520787395e-01 6.3991068893590928e+00 6.5410008153956287e+00 -1 2 0 +283 1 3.2886765713157047e+00 6.4577609617474216e+00 6.6450211825759427e+00 -2 5 -3 +205 1 4.9096514414971573e+00 6.2573093659948649e+00 5.9509143564095108e+00 1 1 0 +158 1 6.0709604726562620e+00 6.0618280221451721e+00 5.9241072976562341e+00 2 -3 1 +1 1 6.8533858129590133e+00 6.5562074315723597e+00 6.5648993855676077e+00 -2 -1 -2 +485 1 3.8125590702509465e-01 7.4616693598979804e+00 6.3609885403345947e+00 0 0 1 +378 1 1.3081995382782592e+00 6.9194359283210023e+00 6.2966360730695206e+00 -1 1 2 +71 1 4.2456384497919455e+00 6.8188407430282236e+00 6.6601493363974615e+00 -1 -4 -4 +320 1 5.9836892193800049e+00 7.1597807912498039e+00 5.9293654675383980e+00 -1 -1 -4 +481 1 7.6691355446374123e+00 7.2329848679784536e+00 6.1548343866270958e+00 2 0 -4 +318 1 1.3774303149915195e+00 8.3818831122591373e+00 6.3319633954681702e+00 -1 3 3 +496 1 2.5904412000483283e+00 7.6460489519926949e+00 6.2257027413180230e+00 0 1 0 +319 1 3.7413059213345305e+00 7.5724262762451815e+00 6.0123092822785358e+00 -2 0 0 +338 1 5.3628717868866635e+00 8.0629328638364353e+00 6.4489666989888104e+00 0 0 2 +358 1 6.2532288322758314e+00 8.3160028104100370e+00 6.1106737733333700e+00 1 1 3 +225 1 7.1188694406828850e+00 8.0966599202958953e+00 6.7037213079900431e+00 0 0 1 +55 1 1.0372861368831470e+00 4.4696141893250934e+00 7.4049774120079697e+00 -1 2 -1 +362 1 2.7501402171762614e+00 4.4083355662417896e+00 7.3996418874276850e+00 1 -1 0 +36 1 3.7396318187704796e+00 4.4801126663955504e+00 7.1074085083223073e+00 2 0 -2 +133 1 4.7860445539287522e+00 4.2902205437459102e+00 7.3711360387569274e+00 -1 -3 -2 +412 1 5.8687821857033606e+00 4.2035753083199188e+00 6.8227572622514323e+00 -4 3 0 +89 1 9.1212528791654535e-02 5.3554487915969240e+00 7.1088625783964092e+00 0 -2 0 +38 1 1.2571311964388701e+00 5.7525434192639207e+00 7.3210178579367868e+00 -1 -5 -2 +337 1 2.7511266822038212e+00 5.4161467707559394e+00 6.9980055112843935e+00 1 -2 -1 +233 1 3.8756258886529467e+00 5.7508116329978627e+00 7.0533607828281815e+00 0 0 -1 +442 1 4.9084237493694953e+00 5.5326539633780083e+00 6.7666717819135362e+00 -4 -4 1 +143 1 5.5776680237268401e+00 5.1621486864820874e+00 7.4635021710959082e+00 1 2 -2 +194 1 7.1453664245542576e+00 5.0984438205910134e+00 7.3333812213368574e+00 0 2 0 +308 1 7.5489760640996861e+00 5.8433222820659871e+00 6.9295207313931844e+00 0 0 0 +286 1 2.1326326019163346e+00 6.2556170719743678e+00 6.7379074391662934e+00 2 0 -2 +61 1 5.6654689088882648e+00 6.2935208603774795e+00 6.9534505775907345e+00 -2 1 -1 +426 1 7.2244687144599562e-01 7.0806885112202815e+00 7.2261712082790313e+00 -1 1 -2 +450 1 1.7213783340257280e+00 7.5184636193370302e+00 6.9767252413839369e+00 4 1 1 +188 1 2.8213470931093725e+00 7.2342621084044723e+00 7.1806231926796817e+00 0 -2 -1 +94 1 3.8026924767351562e+00 7.3932541518378949e+00 7.4596688811177305e+00 -1 2 -2 +252 1 5.1481924139065534e+00 7.2239227196376481e+00 7.0808756518162852e+00 -2 1 -1 +321 1 6.2155610611385042e+00 7.5199920009866501e+00 7.0964075868161212e+00 1 -1 -3 +156 1 7.9944514874782193e+00 7.0252703915440122e+00 7.2541499279788821e+00 -2 1 0 +167 1 5.6917482122629082e-01 8.1417190335213725e+00 7.4962901784513347e+00 2 -2 -1 +330 1 3.3138446283251373e+00 8.2146300363312132e+00 6.8886408760800295e+00 1 -2 0 +195 1 4.3712446295554876e+00 7.8995454090647614e+00 6.7366600234979277e+00 -3 -1 -1 +78 1 5.1856313345157918e+00 8.2127013524100576e+00 7.4620544007464273e+00 0 -1 1 +157 1 7.9011697675935482e+00 8.1764884669087454e+00 7.4266272279794077e+00 -1 0 -1 +373 1 6.7132530681439118e-01 5.0292807223694753e+00 8.1874843860841438e+00 1 2 -2 +56 1 1.7078519119356448e+00 4.9344764637762015e+00 8.1280520422148399e+00 0 2 0 +315 1 3.6234275175752244e+00 4.9451657793378052e+00 8.0476764469560074e+00 -1 -2 0 +478 1 6.4485922344872577e+00 4.3096951707056732e+00 7.7984645181472576e+00 -3 -1 1 +109 1 8.0579925616842267e+00 4.7034410927383776e+00 8.0870676538969590e+00 -1 -2 0 +357 1 2.6884169416542560e+00 5.4427652520296803e+00 8.2033924998655703e+00 0 3 1 +454 1 4.5709826050185614e+00 5.3780110248528246e+00 7.7764192595368709e+00 1 -1 2 +86 1 6.2280039286639228e+00 5.4780735688869227e+00 8.2809905303020894e+00 -1 1 0 +262 1 7.2349855745224341e+00 5.4460551342647063e+00 8.3066978094955939e+00 0 -2 2 +160 1 6.0572932237795518e-01 6.1031638741150802e+00 8.0606222325454144e+00 2 -1 1 +168 1 2.6926304594044645e+00 6.3106981827881823e+00 7.6217004925278191e+00 -1 -3 0 +145 1 3.6817206885980216e+00 6.4794531849637744e+00 8.1206460236595284e+00 -1 -1 -2 +400 1 4.6165015313151514e+00 6.4768264075412638e+00 7.5742703650137084e+00 1 -2 -2 +395 1 5.5951136272170219e+00 6.3298964082146654e+00 7.9312370644766386e+00 0 0 -1 +297 1 6.6597873155694378e+00 6.3692836044578955e+00 7.6364845321455510e+00 1 -4 0 +207 1 8.0115395128671594e+00 5.9375044868831406e+00 7.8466324008781454e+00 -1 1 3 +460 1 6.6754980612335257e-01 7.0521823363262239e+00 8.3451452216672077e+00 -2 1 -3 +44 1 1.5985553198249884e+00 6.8250382119954756e+00 7.7469635466673052e+00 0 1 0 +377 1 4.7397084186898368e+00 7.4631435688157008e+00 8.0338331164055763e+00 0 -1 0 +411 1 5.8132963527118724e+00 7.4646663474419555e+00 8.0261071780587709e+00 2 -1 1 +396 1 7.0242838781762282e+00 7.3479893628886632e+00 7.6603703429086574e+00 2 3 0 +424 1 8.1516255787718581e+00 7.5530513248894016e+00 8.2349155971796755e+00 -2 0 0 +66 1 2.2362583327280716e+00 7.7449451931440727e+00 7.8847519662235594e+00 -1 -2 0 +371 1 3.1656541571472099e+00 8.2451918974189500e+00 8.0415029551628514e+00 1 -1 1 +186 1 4.1675976318493086e+00 8.3247658596031009e+00 7.8802494669419030e+00 1 -1 -1 +413 1 6.4945159878598346e+00 8.3677431053238660e+00 7.6981134933049891e+00 -2 -1 -2 + +Velocities + +7 -1.5197672199477208e+00 -7.1031250708487148e-01 -4.0950627961412567e-01 +398 9.4644999179644840e-01 -8.0422358764146151e-01 -1.1023964746841350e+00 +173 4.8084218242595870e-03 -1.9383808513915850e+00 9.3439099328992314e-01 +462 -1.6390116924948674e+00 -1.2080683544699562e+00 7.6685759600965364e-01 +383 1.2945118204202577e+00 -1.8370931432093225e+00 1.1758972656982776e-01 +288 1.2113220352829337e+00 4.8786819623543370e-01 7.1439798712590263e-01 +303 3.6232856211831610e-01 -3.7927260062054236e-01 -3.0467891118546553e-01 +491 1.6817821327211264e+00 6.3153250223994289e-02 -5.4827183875981267e-01 +187 5.6164532616475686e-02 1.3250338697636479e+00 1.6291294556417517e+00 +163 1.3950518510134631e+00 -1.7090097072259662e+00 -6.0029200570353536e-01 +345 -8.4635427449528189e-01 1.3013642733988193e-01 -3.7582537476409439e-01 +447 -5.5306523194731427e-01 -1.4583063079290524e+00 4.8086237208854654e-01 +108 -3.1879632824306825e-01 -4.9387838912491844e-01 -3.1046215530949173e-01 +427 2.4456665882970424e-01 1.3737057789182878e+00 -1.7474218101951866e-01 +96 -2.8217287015277487e-01 3.9138367367476778e-01 -4.6114700958040086e-02 +494 3.0303709765292064e-01 -9.2861341821366045e-02 -3.6692009603190118e-01 +360 -4.2709052063514102e-01 -1.5167804301477015e+00 -2.6902074926466563e-01 +179 -1.2403873183879999e+00 1.1368400311662936e+00 5.6653449328883521e-01 +136 -1.5859168963178476e+00 1.0728794555657983e+00 5.0876417522892092e-01 +311 -1.4232560247874224e-01 -8.2802934475265932e-01 1.0289469027582252e+00 +242 -1.3753994053365912e+00 3.0823812109914095e-01 1.2519475129774249e-01 +451 1.0684545083916284e-01 -1.3647250068831975e+00 1.2292458701523420e-01 +118 6.5344809858683794e-01 -6.0529931820910909e-01 -6.6821572295625731e-01 +200 -9.1497459004230530e-01 -7.2783581485393822e-01 -8.5265666689286446e-01 +23 1.0121027757280427e+00 -5.8690115135784995e-02 -1.4283745590726701e-01 +30 -1.2406061152582815e+00 3.7490020292637088e-01 -1.4457935973251330e+00 +26 -9.9581994312158117e-01 -1.2441026541932486e-01 -3.6541440712112250e-01 +452 -9.8588039362152369e-01 1.0706468502992672e+00 1.6282162085617651e+00 +439 -1.2386761163593085e+00 4.3106305328993799e-01 5.0410115305724934e-01 +492 2.7094066326642935e-01 6.6318883302565457e-01 1.5999014287193769e-01 +287 -1.7254693201510321e-01 1.1189096817152451e-01 4.1489954379924110e-01 +87 -1.1416496451717975e+00 -7.8732701356097490e-01 -5.1553483379997289e-01 +191 1.2771897324335735e+00 -1.7496443253093807e+00 5.0507874089360993e-01 +316 9.1440987552186193e-01 5.4700363415289210e-01 9.8622452705158947e-01 +176 1.8575029150961730e+00 4.1139607157872565e-01 -7.4590595351664335e-01 +244 -4.6943526746297531e-01 -4.0598167955478592e-01 1.2148844546685273e+00 +463 -6.0334643189530614e-02 9.0710610807033173e-02 -1.1159129056326442e+00 +101 -4.6185710842519001e-01 -1.0745733134156132e+00 -8.4095960640252343e-01 +456 7.3559492687866046e-01 8.4585098605759870e-02 9.9419285892741016e-02 +90 -6.9201778873218364e-02 4.2798282427303436e-01 4.4566581747153294e-01 +457 -2.4132420839469965e-01 8.4836564798364844e-01 1.0955942184355154e+00 +344 6.5538410556645377e-01 1.0527852545027427e+00 6.8154568558028386e-02 +399 -8.3144103937947644e-01 1.9062875610231711e-01 -5.6419101062513155e-01 +472 7.2667243545881360e-02 4.9535613585667015e-01 8.3691870718219108e-01 +364 -2.9526170592863293e-01 -8.7862728527604539e-01 8.2689159018968139e-01 +333 1.7241045239522232e-01 1.0435495829586168e-01 -4.6109306717747689e-01 +223 3.7919285550573256e-01 -1.0672385659469772e+00 3.6984147519214111e-01 +277 -8.8028901289995187e-01 5.8075379122029680e-01 -5.0555689035944396e-01 +487 1.5229361655153211e+00 -4.3334638823410909e-01 -5.2025315373818937e-01 +202 1.1890248672755632e+00 -1.3103428543183313e+00 1.3877359082264291e+00 +139 -3.8593619396281981e-01 -4.1419081865118412e-01 4.8341157555249414e-01 +218 -1.2190042149414249e+00 8.6603581070857749e-01 5.3180226853912571e-01 +10 4.0346230429792890e-01 8.8022045895227152e-01 3.0611723210999553e-01 +64 1.0687583963535543e+00 -2.5590555538042992e-01 8.2852453062456832e-01 +40 -1.0543471069223134e+00 -7.9810717548135568e-01 1.4389073785681245e-01 +328 3.2979243925573831e-02 3.1076559402174242e-01 -1.6410904905031269e+00 +292 -6.3224783054646483e-01 -4.3704038413109603e-01 -2.2759444134328080e+00 +245 -4.7869651996764956e-01 1.4231085014444791e-01 -1.0109564296885869e+00 +148 -7.1011989912373741e-01 -6.8437374624235792e-01 -4.7084060341785217e-01 +435 -2.3710180935788738e-01 7.3150957873543554e-01 1.9569288343148944e-01 +301 -7.3626400316656140e-02 -1.2518892197053937e+00 6.4938262930099341e-02 +476 4.4522311443074564e-01 8.4413304640745324e-01 6.9180275295562699e-01 +310 -4.4579106235383259e-01 -1.4870237388818175e-01 -1.7519046471808755e+00 +137 1.0191269790481958e+00 -1.1871217736355175e+00 6.0687187776921336e-01 +434 -8.0977924479936902e-01 8.2445677967490594e-01 -7.2982619204505017e-01 +184 9.3329968718567657e-01 -7.8960961760367476e-01 -3.2387020805541877e-01 +5 -7.6591643318776403e-01 4.4567507028100856e-01 -5.1504861374485367e-01 +41 -6.0827814801341495e-01 1.0335818250945215e+00 -1.4262577781586459e+00 +410 5.1617643329833041e-01 -1.2505433325731774e-01 6.5548767709779598e-01 +418 7.4452116863445517e-01 5.5176595694257291e-01 4.8433486134467341e-01 +34 -1.0960797951083094e+00 -9.5559899011366922e-01 4.1467430632337771e-01 +67 -1.4762168791195980e+00 7.3902009632630203e-02 -9.8563314451155759e-01 +390 1.1040922756330935e+00 -1.0608530270906485e-01 -8.5480860400114822e-01 +125 1.1001683944330445e+00 2.5213959563273414e-01 -7.0907876564322847e-01 +105 9.3642884637919491e-02 3.2241122070134182e-01 3.4267503174724429e-01 +274 1.4805711826308454e+00 1.9591264275732104e-01 4.6208005550476272e-01 +314 3.3724005635036658e-01 -4.9228354871213487e-01 -5.9105855919176131e-01 +408 4.1789097671328662e-01 2.2054753884758851e-01 9.9409268338014201e-01 +142 1.3529751978153088e+00 8.8819247946851643e-01 -2.9699787225611667e-02 +25 -3.6747378202427655e-01 -1.6653943785151797e+00 2.1594786196965424e-01 +458 -7.3004682150577682e-01 -2.5761460079892318e-01 -7.5492049253862104e-01 +165 -2.6776300065898789e-01 -3.1428309412647404e-02 7.6464836175889062e-01 +421 -2.2112566002008222e-01 -8.0033416193571816e-01 7.4057822704117926e-01 +151 1.6510010513742961e+00 6.2880202489514836e-01 1.3109463507573997e+00 +162 8.6466591751463506e-01 1.2003096922919751e+00 1.6720745976940152e+00 +120 7.1544273833415639e-01 7.8605685992147967e-01 1.5756692842267452e+00 +448 9.4818399052933544e-01 2.0373333697562079e-01 1.1821449360296239e-01 +50 -7.4255028295716818e-01 3.2131856627302258e-01 7.0344624031236247e-01 +443 5.1965861871733798e-01 -1.0469002555669342e+00 4.3373559100868195e-02 +482 1.9661775056161916e+00 1.8911734358361203e+00 7.2949567046678088e-01 +407 1.8582263860937767e-01 -1.3051257268383373e-01 5.0987931207045945e-01 +100 -3.7775697318477114e-01 6.0919017017007682e-01 7.1809182324625254e-01 +99 -1.2684617496938173e+00 7.3671717137305515e-01 -8.1216571664258830e-01 +107 -2.8776644836089277e-01 5.0874100972210130e-02 -4.8277793530428115e-01 +480 -1.8051331679926971e-01 8.6563042329278228e-01 -5.8352716569019136e-01 +115 -1.0589943552297505e+00 -5.2550981762149152e-01 -1.7244688387853080e-01 +278 1.5768829958501078e+00 1.4428098110470169e+00 8.8216722790329116e-01 +206 -1.3653407453215169e+00 5.7341428096126357e-01 2.2629859809279146e-01 +4 4.2054817038258185e-01 -2.9390858515089308e-01 -1.7875237254421117e+00 +214 -1.0426854223671351e+00 -9.9898728143962490e-01 -1.9850479848636837e-01 +65 4.1792586017239108e-01 8.0186431881714215e-01 -2.0107060384389590e+00 +490 6.7355251805377303e-01 -2.0698786089395388e-01 -3.1564646838967253e-01 +230 -1.3855973935201399e-01 1.6134941051796734e+00 2.3723214232474421e-01 +234 1.9442134326447673e+00 -1.3805634063343805e-01 -9.8210270774821284e-01 +92 1.8063255781217027e-01 9.3716955232457000e-01 -1.9187798219061411e-01 +103 3.9559605419305116e-01 -8.7523159162324915e-01 -8.6993815784441930e-01 +129 1.2253789920819727e+00 2.8171983713246046e-01 -1.2180024131333584e+00 +483 9.6349992375661320e-01 -1.6348662648160852e+00 8.3712630375667085e-01 +110 8.0468512955471783e-01 -1.2623668571621947e+00 1.4617362498240638e+00 +126 -2.5741602043303030e-01 -2.5870568275485217e-01 -1.0282926023825125e+00 +276 7.0448925295125497e-01 -1.4486777483518087e-01 4.0589927727544634e-01 +294 4.9277474123671205e-01 1.0788251906341033e+00 1.0720476037391911e+00 +417 1.2134126298835348e+00 6.9341902173441838e-01 -6.5915650495314448e-01 +102 -9.4530772564542864e-01 3.5633646308084904e-01 2.1645216652503570e-02 +228 -3.1477177829390662e-01 -7.3015136189998553e-02 -1.3550661516185267e+00 +2 -1.5167590438599203e+00 3.2942906513575698e-01 -3.9430403043809092e-01 +222 -3.4853423639550507e-01 4.3402827204271471e-01 -8.9055344775375656e-01 +332 7.6671266929186610e-01 -4.2789189576138797e-01 2.2589706911206284e-01 +275 1.0091776783462640e+00 -2.3875723103898955e-01 9.0625273137588058e-01 +243 -2.4008164703199580e-01 2.4602229249214927e-01 -9.2542387373274426e-01 +394 -1.5496683613302659e-01 -1.4731622236607285e+00 4.3712483588631723e-02 +325 -9.9716991278750156e-01 9.0079916710328489e-01 6.1656781470423368e-02 +468 1.1367478364774437e+00 3.7268550263787792e-01 -1.9334998928228118e+00 +113 -6.1637943298580211e-01 -1.4259739417714792e-01 8.5880390205968704e-01 +47 1.4522907038923785e+00 -3.8138661441744320e-01 8.8902241399148096e-01 +474 -6.5326939744671464e-01 -2.9584216080544323e-01 -1.6703076347144621e-01 +343 -2.0865957540293453e-01 4.2320136734663144e-01 -5.2417372636564219e-01 +257 -1.6598412047016537e+00 3.9614126419385248e-01 6.2190463287430520e-01 +422 9.8621254947118736e-02 -4.5653326655140536e-01 -1.6959752095102018e-01 +317 8.1554926779727022e-01 -9.3952932101149422e-01 4.1213701483558629e-01 +322 9.7692194337623842e-02 7.2221211185210599e-03 1.4983319825497168e+00 +453 1.0112117753398511e+00 -1.6043121320019077e-01 -1.5109389287188097e+00 +82 -1.8245270960375951e-01 -1.7227940931260219e-01 9.4914460423273084e-01 +402 -1.3974163926710530e+00 1.0238276956317611e+00 -2.7116721725643461e-01 +201 3.8154565319070316e-01 6.1162789639306392e-01 5.3616806651343329e-01 +159 -5.5623509138788352e-01 -7.3506001159846490e-01 2.9669217335717424e-01 +239 -1.1703971851987414e+00 -2.5624748584715568e-01 1.9987978519039629e-01 +340 -1.1651635328367398e+00 1.4923285973929103e+00 -5.0638764373602618e-01 +246 4.6916366638116123e-02 3.7471219463751682e-01 -8.5595777185358435e-01 +268 3.9776335718715750e-01 -4.1326407010466332e-01 6.4132644428253849e-01 +238 -1.0102989663900468e+00 2.5145560602393102e-01 1.6537809300909093e-01 +183 9.6649446422314420e-02 -3.1320299584600791e-01 8.9787784698607254e-01 +393 -8.1709715097020719e-01 6.5173585509788723e-01 1.3340272254613436e-01 +177 9.2862946550951486e-01 -7.4734865012317631e-01 2.6370187436425798e-02 +97 4.0324698775550633e-01 -6.5060630846020162e-01 4.3381661619662121e-01 +16 9.2225588537666714e-01 5.0761227093429218e-01 2.8224038915514177e-01 +15 7.4631799122735776e-01 -5.1735298399747642e-01 1.0267699639319139e+00 +467 2.9233724948217432e-01 -1.7768548355681282e-01 9.7602334864839035e-01 +404 -1.5591392530118275e+00 6.9331308976828065e-01 -1.9156738913640683e-02 +190 -2.3293475783192552e-01 1.9804103372721136e+00 1.4400561196029799e-01 +429 -3.1240905856412571e-01 5.3399975662794008e-01 -8.3672459106253427e-01 +356 1.1813499076138427e-03 4.5712322524667531e-01 7.2569550209608535e-02 +459 -8.2536401218028255e-01 -5.1587534016495484e-01 -3.2429633054579987e-01 +140 1.4169132709847332e+00 -1.6948863471126016e-01 -5.4590188862129563e-01 +121 -8.0623019357608017e-02 4.3956025735145637e-01 -4.1230464603429395e-01 +76 1.2149513180720075e+00 3.0664283974167705e-01 -6.2206166881984115e-01 +24 -9.0953792569391767e-01 2.7208504534230199e-01 -5.7968255809907288e-01 +215 -3.6635366137979941e-01 4.9083544993599626e-01 5.4540399677247620e-01 +406 -2.8711421371139068e-01 9.8028410382686626e-01 -1.5688211456737056e+00 +495 -2.6064405757207798e-01 1.0014422650657693e+00 1.2195244915445839e-01 +256 5.1502433217852350e-01 2.1618101498582329e+00 -5.5671498574760148e-01 +348 1.5303758850601952e+00 1.3538700733088898e+00 -1.0404602147830582e+00 +18 8.7092721144608365e-01 8.8296303804909981e-01 4.7076145062566271e-01 +259 1.2579194534410862e+00 1.1275351076124240e+00 1.3255628670657002e-01 +261 -1.9457509303164215e+00 -5.7013962206489510e-01 6.5787967104563000e-02 +433 9.5143226323949670e-01 -1.9787864106930605e-01 2.1852616176467912e+00 +119 5.2387728877999162e-01 -7.5008900728698324e-01 1.0156553043596699e+00 +181 3.6547537534957092e-01 4.4856602347738611e-01 1.9502787843157898e-02 +392 1.8883706922750969e+00 1.0836617564317459e+00 6.8587165903540392e-01 +436 -7.5639783907079583e-01 -6.1811736982444421e-01 -2.2826839230281426e-01 +210 -4.5965909404278121e-01 -3.3285948977797364e-01 -2.8815683118847368e-01 +409 -8.9630394160430427e-01 1.2498156320615575e-01 -5.9486610361558201e-01 +437 -1.3458244785393264e-01 1.1611540390359226e-01 3.6707571520967769e-01 +114 -1.1780626363780731e+00 1.1424256338126497e+00 8.1898562672334474e-01 +431 3.9295632541408759e-01 -5.0466339464883803e-01 7.4701651109545830e-01 +296 -2.9562979314792992e-01 9.3794387166245374e-01 4.3821394647736267e-01 +477 -1.0332993738194893e+00 5.9732959339716152e-01 -1.6990304505644747e+00 +199 -1.0627414724922077e+00 3.6527741326574337e-01 -5.0076911469807539e-01 +31 1.1836258822972918e+00 -1.1805527709262840e+00 -1.0148440310730218e-01 +149 -9.7152762187442065e-01 -8.2689424175864179e-01 -9.8308725322137946e-01 +216 -2.6635793686817422e-01 -1.1249304826477751e+00 5.2675272099922754e-01 +425 -2.8287490221194594e-01 4.1086346332975782e-01 -5.6774387340250076e-01 +224 -6.3636066584070272e-01 3.8927738472590379e-01 -1.2043299828812322e+00 +352 -6.1634031766701480e-01 1.9344774717790295e-01 7.8374630494614250e-01 +289 -9.8440193523267117e-01 1.4471012647779624e+00 4.3922631035860088e-01 +455 -1.1942412759322272e+00 1.1300600257912083e+00 -4.7958784865825908e-02 +298 -8.4955866984285322e-01 1.8131854984076790e-01 -1.9010434504555735e+00 +42 1.1523609145851870e+00 1.3198909771653919e+00 -1.1943568765046571e+00 +80 2.0928302112510155e+00 -1.9281727715628849e-01 3.5879525261694012e-01 +127 1.0275071129063864e+00 -7.8560029105042173e-01 8.4680312545585235e-01 +232 3.2836195573764693e-01 1.5921754951459595e+00 -1.4889040346123832e+00 +368 -1.0143580013676627e+00 -6.3286772474382025e-01 5.9003271203631313e-01 +486 3.0052735920053437e-02 -7.5917073216074904e-01 -4.0707609210832352e-01 +209 8.3084043466989521e-01 -1.2819860426930157e-01 9.8450910112172252e-01 +152 1.4018503697498572e+00 -1.3364969077798206e+00 5.1589841760235022e-01 +353 5.3822763779176630e-01 -4.8322987719532096e-01 3.5634065895494110e-01 +361 6.8264929410893807e-02 -1.3682995245096907e+00 -4.9273501999153174e-01 +391 6.7065636846264776e-01 -2.7904582963633018e-01 -6.5303896626046076e-01 +464 7.4567031841775322e-01 1.8046977002555891e+00 -3.9159771733015164e-01 +497 -1.3856699033357778e+00 -9.3599081481125368e-01 1.8204759707532270e-01 +498 1.0568629143757213e+00 -6.8137997517450560e-02 -3.7037143049187105e-01 +264 -7.7894167957263005e-01 2.7383401106980504e-01 7.5098074183721675e-01 +265 1.9614235016832940e-01 -4.2322665725562197e-01 -1.6236881765469688e-01 +350 -6.3256317352651559e-01 -5.9660876051471468e-02 5.2317095757618959e-01 +144 -2.0800773378554721e-01 -1.5156540919629388e-01 -1.8814379829548375e-01 +17 8.2103760580927843e-01 -1.1053143150308307e+00 1.1843881143235824e-01 +441 9.9191589104231870e-01 -1.9479579195707514e-01 1.8130903870970541e+00 +266 -9.4957121369000017e-02 8.6997989048119007e-02 -1.5903074475142429e-01 +375 8.1973242957273296e-01 1.0075441532082390e+00 6.6277118207442265e-01 +351 -1.0694047025049973e+00 1.2185457298237026e-01 7.2731979237547140e-01 +254 -1.4178061472233576e+00 1.0044925984667965e+00 5.9999609355847139e-01 +29 4.7548776272319854e-01 1.5001558567759110e-01 7.4645778473548241e-01 +198 5.7218364285113010e-01 2.9196622753924861e-01 -1.2231490460337893e+00 +197 -1.4204377171882598e-01 2.1322055429678972e+00 3.5360172437812271e-01 +192 -4.3230000337254881e-01 8.1753260459826260e-01 -1.3961239427992276e+00 +220 9.2338173032465304e-02 7.2444278115958327e-01 4.3240465996750244e-02 +432 3.3837153168712325e-01 1.9757543957217949e-01 -3.2138599665961831e-01 +20 7.2972771576502227e-01 -7.1923547937920451e-01 3.8462300862783037e-02 +63 7.3459759072459618e-01 -2.1393390343408181e-01 1.4606085672716668e-01 +446 9.5489174587921177e-01 -2.2284752482645742e-01 -7.3147917056258960e-01 +172 -2.3233356067616504e+00 5.9696639792861073e-01 1.0311292046090428e+00 +405 -1.1779705391325133e+00 2.7846640825986735e-01 9.6440591359561623e-01 +323 1.2758508066094825e+00 1.1576865878083721e-02 1.3415986450967126e+00 +428 4.8021126796596170e-01 4.8003440312842205e-01 -4.1979524804611819e-02 +280 1.1723141734791545e+00 8.4290272518839332e-02 1.1240738308596074e+00 +54 8.2234236592018339e-02 6.9377897211693754e-02 4.6415665343815465e-01 +397 -2.4516753222359439e-01 -3.8647076314136586e-01 -3.1938187998240442e-01 +279 4.7475740365710301e-01 4.2033019401821775e-02 1.0791025172609856e+00 +134 4.6986570792330234e-01 7.5759398359663410e-01 1.3748348906115773e+00 +236 -1.4338534270949166e+00 6.5242359063738475e-01 -4.6879001422000049e-01 +493 -9.5795155221589912e-01 -9.3131490174346532e-01 5.2848598027407112e-01 +346 9.4017276609564226e-01 -1.4423054432512394e+00 -3.4883627652283825e-02 +295 -1.0211326704350645e+00 -1.5688283678435537e+00 2.2737881805456114e-01 +164 4.2933435120637192e-01 1.2908919636558716e+00 -1.8559649323965055e-01 +354 3.1232180266110654e-01 -3.3884174823706786e-01 2.0012570054806617e-01 +449 -4.1956545717722271e-01 8.5033185910749320e-01 -1.6923286514167504e+00 +185 -1.9847768794898153e-02 1.6093024328157031e+00 -3.4278049008935008e-01 +229 3.3354615877618454e-01 -2.1967770508754222e-01 -6.8288738508757751e-01 +135 -3.8598562184690355e-01 2.3459455181853697e-01 1.4591795655915993e-01 +211 -1.1858788850370010e+00 1.3960363241794649e+00 1.1390210005059993e+00 +81 1.3604301094625607e-02 1.2711357052370638e+00 1.3840699383718491e+00 +37 3.5025606454523878e-01 -1.0316562604143946e+00 2.4944393037279400e+00 +355 -4.2713554752038259e-02 1.6441819966987897e-01 -8.2550044716409909e-01 +141 8.1569462514471880e-01 -6.8558748209733145e-01 7.0575287639668483e-01 +122 3.6274405429300222e-01 -4.1985688325391463e-01 2.5223429679090231e-01 +327 5.2689568302324030e-01 -7.1530570005039407e-01 8.1591540939993761e-03 +386 5.2540176252260506e-01 -8.0891002493580211e-01 -2.1080798818740659e-01 +59 3.8008676468324715e-01 1.2302042558959829e+00 -1.2893140123247515e+00 +57 -1.2756375464672689e+00 7.7885421584605408e-01 9.3218921154320622e-01 +489 -4.8772350194378145e-02 1.1774319824237183e+00 -1.3413963962772402e+00 +326 -8.2073133946066312e-01 -1.2685275916429064e+00 -1.0253535003668284e+00 +359 -1.8991447869255085e+00 -1.2154594584519982e+00 -1.7832247863578221e-01 +349 6.4100123949028309e-02 -3.2723074072385872e-01 -1.5565659217165477e+00 +247 4.5734576435732799e-01 4.9511064545143885e-01 -1.5945768728559153e+00 +365 -5.7917383718454207e-01 -2.3494837692508375e+00 -1.5004840205862926e+00 +382 -1.0813649655944142e+00 4.1831946020927230e-01 2.9306887264755938e-01 +130 -5.7488571729114812e-01 -9.6638702807104448e-01 -1.0278487271582966e+00 +471 1.1085411185196428e+00 -5.2404573748396321e-01 9.9734211160337760e-01 +21 -2.3901903994255250e-01 9.3578484419611557e-02 -7.3719660959071831e-01 +499 -4.9906801820206043e-02 4.0499214176262377e-01 -2.9371307883695258e-01 +253 -7.8928864460108283e-01 3.3838305995790624e-01 7.1275694444227405e-02 +302 1.5254343639867396e-01 -2.7881674166920268e-02 9.3627888140226589e-01 +324 -1.1159492478288651e+00 7.0632546920242867e-01 2.5394407536700253e-01 +154 4.8736880051344117e-01 -1.3177717741071062e+00 -7.9660620460177323e-01 +284 1.7716036485389025e-01 -3.6539348914929748e-01 -4.6941135291661629e-01 +161 -2.7479275242316997e-01 7.6982156884799513e-01 -5.7088165723862649e-01 +112 2.7023059482372042e-01 2.0487127767495705e-01 -4.9350658197380731e-01 +39 -1.6840134362063963e-01 -2.0596641915022665e-01 1.2622422574022685e+00 +269 -1.4448376822412348e-01 4.2047192520573229e-01 -1.5751711248887881e+00 +470 -9.0198936075875380e-01 -1.0035762705605118e-01 1.1469701649179411e+00 +84 -3.7165102348228596e-01 1.5718083932531206e+00 1.8715295090631173e-01 +381 6.6740577340943863e-01 -1.9432536761932276e-01 -1.2757754863002870e+00 +416 7.2118119300841677e-01 8.6813375765446710e-01 -8.2350198387929519e-01 +182 3.3694648494832763e-01 -6.5830649973844163e-02 7.0076361524788766e-01 +347 -2.4949061953800500e-01 -1.1432286442922379e+00 -4.5757988288631407e-01 +380 -4.7143472726668367e-01 -2.9180051952103941e-01 6.0581680882348110e-01 +19 7.3007216948068054e-02 9.4947888518620716e-01 3.4627576178512598e-01 +430 -2.2320112834958328e-01 -3.8559102989803251e-01 1.0427665572858709e+00 +212 2.0170777345036919e-01 -9.9332505765821755e-01 1.0550787824425254e+00 +479 -7.7910620356048310e-01 -3.4759422268929079e-02 -5.8756871125828891e-01 +217 -7.0999315500035393e-04 -1.4874035841198494e-01 -1.1389898361525996e+00 +147 3.3953282916732841e-01 1.0503362153417393e+00 8.8554338624429496e-01 +13 1.4952012032076418e+00 -1.3492024227588162e-01 8.6834761707295621e-02 +170 -7.5230462228731629e-02 1.9875829136564169e-01 3.8512887113920530e-01 +204 -3.1459152727076800e-01 -7.2066080044499392e-01 -7.5277710665622377e-01 +306 8.0529112138128323e-01 5.8633344712571456e-01 -1.8256367575393391e+00 +414 -1.7678147014996259e+00 -7.1706970804552028e-01 6.0614094017430153e-01 +79 1.6303375369704216e+00 -9.6446702691566244e-01 1.7014099837302679e+00 +116 -1.7231587507489068e+00 -2.2374070614774770e+00 1.0442058418221465e+00 +231 -9.2546402309298947e-01 3.2157716287919585e-01 -6.2797312032694141e-01 +171 1.4243635122212095e+00 -3.4034411127116748e-01 2.1060050313379719e+00 +273 1.0777993506600285e+00 -1.7160435918146213e+00 1.0194335249558832e+00 +260 1.4544392536719453e+00 9.3765863648494707e-01 1.9642995061847701e+00 +43 -1.1326443879098980e+00 1.4846909715454837e-01 1.6874301063514463e+00 +208 -1.1234489793683757e+00 -1.0408587064067447e-01 -4.8386417041968832e-01 +226 6.0458834484750512e-01 -4.5998597100022531e-01 -4.1420588246526679e-01 +370 -2.5264443636161833e-02 2.2888129565845829e-02 -7.5123334633027034e-02 +85 8.9124431006375637e-01 1.2150234901900336e+00 -1.3794080039677503e+00 +213 6.8750004752856542e-01 1.7643443473184617e-01 -7.6039731517372366e-01 +299 1.1166507011383160e+00 -6.9342398354435130e-03 4.0031150060326554e-01 +249 1.6676259701674601e+00 -1.2916011404415280e+00 8.3081388251616040e-02 +258 -3.3338543070706111e-01 -5.9677208925291603e-01 1.5474505568531705e-01 +388 3.3338877926510010e-02 3.6534261356710357e-01 -9.3163626937108668e-01 +91 -1.0436539497197659e+00 -3.6206368573074071e-01 -3.9406149981573330e-01 +415 1.8022253921012549e-01 -2.5361248238828202e+00 7.8761564433010600e-01 +27 1.6681493439613866e+00 -6.3832374162264238e-01 5.5825898158707521e-01 +465 -3.3883292906124979e-01 -1.9199928938047977e+00 -1.8916637827626086e-02 +72 -7.0256791239588934e-01 -1.3631374858756479e-01 1.1539466869530803e+00 +58 -9.7431680335045678e-02 -1.0635351953490649e-01 -4.5168665276313896e-01 +88 5.2937320884954953e-01 -1.1749454649084838e+00 1.2744645330784524e-01 +6 -1.1593774469007843e+00 5.1413980407296589e-01 1.2944389470552302e+00 +75 5.7374690805841033e-01 7.8433587872715163e-02 -3.9368611836917572e-01 +22 -9.6996881290452630e-01 1.2965746977075312e+00 -1.5394575986278033e-01 +128 -6.4070276272082638e-01 2.2708380115440285e-01 -1.6142126045669323e+00 +193 5.7443781554989515e-01 -1.2458447329459237e+00 -9.3796775534017041e-01 +389 6.7276417854677451e-01 -2.9571653479618748e-01 -2.4423872850138906e-01 +241 -1.4102001294916395e-02 -9.9059498112109945e-01 -8.4827835518272399e-01 +14 1.0515231184651945e+00 4.5617222115757200e-01 -5.2911246318135385e-01 +307 5.0028759749137040e-03 -5.0699437336696396e-01 -2.5790615969461578e-01 +401 3.9207473498457289e-02 -9.2058641117610335e-02 -1.3689269955592848e-01 +248 1.5980225324156891e-01 -4.1600725109692227e-01 4.1253240562945254e-01 +335 5.6526042010051392e-01 -1.0563866873458263e+00 2.2963431232103770e-01 +281 4.7335967523683825e-01 -9.8764893385752195e-01 1.3275577965292436e+00 +33 9.5713349527393091e-02 -6.7578402785937589e-02 1.2308478723868863e+00 +221 -1.2080117435798665e+00 -2.2142477880517361e-01 -7.4060132361069042e-01 +251 5.1352069062594478e-02 -4.7173153686079722e-01 1.3645828375870801e+00 +138 -9.8931419992230929e-01 -5.6403083699472267e-01 4.8437720371021081e-01 +73 -8.7238230525929461e-01 2.2619668651197614e-01 -3.2904255863286136e-01 +237 1.5966476021876643e+00 -1.0734521639966819e+00 -5.7008225474518526e-01 +77 -6.5731386120913948e-01 -1.3672574981662913e-01 3.4397972232069346e-01 +339 6.8164227902965080e-01 -8.7654828372118265e-01 -9.2289632523091991e-01 +69 -1.0710495228647499e+00 -2.2798359247984892e-01 -1.4017813863798740e+00 +150 1.4728554201464288e+00 1.6873571351133543e-01 -4.9418642333439719e-02 +219 3.5347912349947574e-01 1.9808724875609746e-01 -5.0625815831733678e-01 +9 6.3426493841071574e-01 2.5658018877632760e-01 4.7953937763858034e-01 +3 -1.2144659411870629e+00 8.8297859772359033e-01 -2.6732917639533704e-01 +93 3.3822789154655764e-01 8.1143107440094409e-01 -2.7263548606070248e-01 +68 1.6351351046383883e-01 5.8445604848527588e-01 1.2062643207337951e+00 +35 1.6550671586466750e-02 1.6790869037398232e-01 2.5947900830558479e-02 +174 1.4403688502275100e+00 1.4476094634256031e+00 -1.0038411182890872e+00 +369 -7.9303772394565375e-01 -1.1303432398125628e+00 -1.5457440975201582e+00 +469 -5.5239153419630294e-01 -4.7075634498045837e-01 5.0539291079888571e-01 +270 5.0351525849727374e-01 1.3716919044917866e+00 2.8157430421583601e-01 +196 -2.2101193763774998e-01 9.4257812877032954e-01 -1.2881024224381614e+00 +235 -3.7410168233289759e-01 1.9712488864630789e-01 4.3505985658493368e-01 +104 1.0770774810232915e+00 -7.7420116923795979e-01 6.4885799952777634e-01 +363 6.7513909705285891e-01 2.0186757605257277e-01 6.2260156794788402e-01 +440 -2.7563401138205812e-01 4.0196589304635166e-01 6.8696509786942431e-02 +271 3.5486339796858996e-01 -1.0482634846478769e+00 1.0693870635001128e+00 +385 2.0653637543135839e-01 1.6251902525248125e+00 -1.0240800582063148e+00 +367 1.2090890730479817e+00 7.7304993739281713e-01 -9.1196492155951403e-01 +8 1.5650406952874099e-01 1.4761853226272020e-01 7.1667065222651671e-01 +445 -8.1712119890107360e-01 5.0169175756271378e-01 6.3236875667481124e-02 +95 7.1388432342661989e-01 -2.6058252368101411e-02 -1.0159428151424379e+00 +227 -2.1897046900910261e-01 2.4492515107534649e-01 2.2679621024062299e-01 +45 5.0120245022687604e-01 -1.1380921868404339e+00 7.8232214243213327e-01 +62 5.7973338245234629e-01 -7.9117819757367913e-01 -5.4327640325878901e-01 +309 5.3715909018265540e-01 -1.7844975395461696e-01 -1.5521878040430610e+00 +70 -1.3649193486754410e-03 -1.5242800010205164e+00 1.6225001176581824e+00 +285 -1.5639729724408871e+00 1.4626366106935738e+00 -1.2286649953661322e+00 +387 -1.3226131489884976e+00 -1.0695489941103238e+00 -1.4911056977700106e+00 +484 -1.5087954881419843e+00 -2.3407968100714568e-01 8.9471716161806181e-01 +98 3.0624993702155973e-01 -1.5934008419723134e-01 -1.0700290072035785e+00 +282 -1.1678279208732874e+00 8.8816716100523774e-01 -3.7594379985472404e-01 +203 -1.2339287833422024e+00 -1.0851718286318821e+00 -3.5581216293468138e-02 +189 -2.5647410293058537e-01 -3.6970804452537526e-01 -2.7009745024499721e-01 +267 -2.3687566231483211e-02 5.4572876490146272e-01 1.2664988400691950e+00 +155 1.7966821085178111e-01 -1.4254017034472058e-01 -1.0614594824352175e+00 +313 -4.0833555690731410e-02 -4.8193546027639250e-01 -4.9602679807507655e-02 +250 4.3395781720710452e-01 9.1543705256636054e-01 -6.1780594432179192e-01 +49 -5.8496932778818223e-01 2.0845066341835794e-01 -4.5660091846264866e-01 +111 -4.5577164923909808e-01 6.7687347516731056e-01 1.6901306317755600e+00 +124 2.3017035971304120e-01 1.2116381200880159e-02 -1.0715278739263430e+00 +488 1.1047027896127255e+00 -1.2726762145955062e+00 7.7913777050672761e-01 +48 -4.0669146183799126e-01 -1.0181831306551499e+00 6.3005463620771884e-01 +123 -1.2387342693749222e-01 -4.5460712390743935e-01 -5.6241811130968811e-01 +423 1.5051226831159246e+00 -1.0959205280256621e+00 3.5512567969767117e-01 +329 1.5695087401093555e-01 -4.0810545929224507e-01 1.5430948869435961e+00 +334 -1.0908322951892016e+00 -5.4577269465148259e-01 -6.7521769754195848e-01 +146 4.4361993166914260e-01 4.1962079818012665e-01 -3.9049661615798353e-01 +500 -3.0319085884539942e-01 7.6039240701443311e-01 2.0836797720615632e+00 +46 -3.9431430053902639e-01 3.7259615958614579e-02 -1.6080049457594121e+00 +374 9.2250275913940816e-01 -5.4107808677407720e-01 6.5542912197165987e-02 +52 7.3216124676172201e-01 9.4572980131871298e-01 -1.2696251833719743e+00 +466 1.5044833940669236e+00 -1.8483350803538756e+00 9.5057050040256286e-01 +272 -4.0011978947412463e-01 2.0429884556820119e-01 5.4991808303431688e-01 +331 5.7814259377466726e-01 1.7044411336854475e+00 -7.2986308719737536e-01 +12 6.8240059668147224e-01 8.7756006768431916e-01 -1.7546792723746987e+00 +178 -1.1529369201979585e+00 -3.9576843637993819e-01 4.1654001054549866e-01 +376 -1.3678465511836193e+00 -1.5404423718061540e+00 -8.9187926122069050e-01 +117 -1.3804354656475164e+00 -7.9075263667417661e-01 -3.6776627245391275e-01 +419 1.9706999335859632e-01 -1.1815264434314889e+00 1.6458873301525292e-01 +379 2.6784097653047051e-01 3.8806722276897926e-01 4.0603233211791162e-01 +53 1.0521966172519035e+00 5.1164934479578683e-01 9.8577725800730365e-01 +28 1.0129347774638686e+00 1.1058165761432928e+00 -3.9034581257989903e-01 +300 -1.4876024382598509e+00 -6.2467982655378396e-01 1.3535210035045362e+00 +83 9.7907832581926901e-01 1.4855763621624507e+00 4.1007013403839504e-01 +304 -1.8963384707907098e+00 5.2731582964002444e-01 1.0962854464287259e+00 +51 8.5928138726119452e-01 -1.6162178311396377e-01 3.2746315986045632e-01 +180 -3.4136546641226267e-01 1.2771151944969144e+00 -3.9578085701206223e-01 +60 -1.7295103304379962e+00 -9.9492157200179920e-01 1.2224650147307308e+00 +255 5.0740556300071860e-01 -6.6892801585963790e-01 -4.4506165343889975e-01 +336 3.8821455708543523e-01 7.4853146108739210e-01 1.0393955338521590e+00 +74 -8.5185557539809709e-01 5.0099005012093123e-01 6.1187012870886726e-01 +11 -4.8598509694234203e-02 -9.7638648911006976e-01 3.6444261502684167e-01 +106 -8.3362253193144206e-02 -9.2846276284357510e-01 -2.0625632391587234e-01 +342 -1.1850581603543699e+00 -4.6587013939418070e-01 -2.5534356631266192e-01 +366 1.8044603030107276e-01 1.2857436498573065e+00 -4.9002876775305132e-01 +153 5.9355527141792742e-02 8.5309993046714749e-01 1.2601655126485285e+00 +384 -3.3199740732000493e-02 -1.1586262754841152e+00 2.7022536481319620e-01 +444 1.4366137360637837e-01 7.4777392856310121e-01 -1.3874143079892032e-01 +169 -2.2106828869911426e-02 4.3869453276997300e-01 -8.6050040149769946e-01 +312 -9.5175409360636343e-01 -7.9143766981298624e-01 -8.3109524929616485e-01 +131 -1.2661930440833327e-01 4.9560114120296378e-01 1.2481373975929652e-01 +290 4.7988720115251880e-03 4.3307801179133432e-01 7.2537453656012302e-02 +240 -1.4417217340859769e+00 1.4357683004122099e+00 1.4379544254488796e-01 +403 9.8034468727423985e-01 -2.0429774540476020e-01 -1.4454160823908524e-01 +438 1.1944593880989134e+00 2.3483551676455661e+00 1.9984542691081373e+00 +420 1.3486549938776343e-01 -1.0783938772052266e+00 2.4823645088293936e-01 +175 1.6188020186225376e+00 -1.2786027961604105e+00 1.5779664705358573e-01 +305 7.6304434006850930e-01 -1.0609104653684724e+00 -1.3992599279449225e+00 +341 -5.0986549858189378e-01 9.7345649143358179e-02 -5.4583627317992767e-01 +291 1.4937985447982780e+00 1.1345276617898410e-01 1.4735185581275405e+00 +372 2.7438262099508215e-01 2.3642499432513167e-01 2.0103126185436837e-01 +293 -2.0812456222423235e+00 1.2585017395884830e+00 -1.9872753884412903e-01 +461 -1.7366155414350635e+00 6.7563297134023181e-01 -3.0241597324899727e-01 +263 -9.9912758612453856e-01 -1.4606803538340738e+00 -4.8347668759554979e-01 +473 1.5452042518079840e+00 1.3194414166855677e+00 -1.4200655529990689e+00 +166 -1.4143951087621034e-01 -1.1527398628151918e-01 -2.0324403247706951e-01 +132 1.6628716981291343e+00 -2.6751309910688231e-02 -1.1291183234894089e+00 +32 -2.3270952903472897e-01 2.1018074582476372e+00 1.1203402946623044e+00 +475 -1.2604994295453433e+00 -9.5339439518226154e-01 3.3662881048301792e-02 +283 1.2749816341052314e+00 4.7341406662300863e-02 8.5345288522412766e-01 +205 9.6825352209774937e-02 -1.0389613158303228e+00 -5.4505460161674724e-01 +158 8.8743698904591217e-01 1.0689060843560156e+00 6.1104406355038210e-01 +1 5.8273461256327774e-01 4.6658417699512433e-01 7.3964607391058224e-01 +485 4.4170048227791719e-01 -2.8581555293721217e-01 -1.0141724005249320e+00 +378 6.6654429040499424e-02 -1.8224880226392848e+00 1.2128685020610477e+00 +71 -9.1996605782626056e-02 -2.2291664206826806e-01 -1.2402752353304469e+00 +320 -9.5597854323421563e-02 -8.6852053155856812e-01 3.5066557017928385e-01 +481 7.9532304801009490e-01 -9.4180364698072971e-01 1.2495155405965916e-02 +318 -4.1450336396091869e-01 3.4120074122917260e-01 7.3720013366972947e-01 +496 -6.2393347120986375e-01 1.0494054390993381e+00 -1.0590359239552802e+00 +319 -9.5320962685676391e-01 9.2021659866276262e-01 5.5763202369068265e-01 +338 9.5180850251473562e-02 7.4581412234581979e-02 1.6562396473566801e+00 +358 -1.2039319191565336e+00 9.9635011716776112e-01 3.7776599320072252e-01 +225 -2.2878377680357529e-02 5.9393376646738183e-01 -1.7855655501046659e+00 +55 -1.2658412487783444e+00 8.3827650617277571e-01 3.7229167676011687e-01 +362 -1.1190412417889151e+00 -4.1093870066191052e-01 -5.5943417408569930e-02 +36 -1.1944064170110538e+00 5.2834231151049005e-01 -2.5661926163189262e-02 +133 -3.4046853819783990e-01 8.7037698795660379e-01 2.6480748394474063e-01 +412 -8.2433971673189854e-01 -2.4364204997081215e-01 3.2182546651866395e-01 +89 1.2836300411162869e+00 -1.0534639266932924e+00 1.7273414295686953e+00 +38 -5.4018176537409834e-01 1.1189891674084445e+00 -5.4949279328730405e-01 +337 2.0680174457636453e+00 6.8756290663232345e-01 -5.3885707707990127e-01 +233 -1.1580426595635346e-01 1.5352867360847791e+00 1.8920809100075830e-02 +442 -5.2273629379374242e-01 -4.7573534425197805e-01 3.3349171376798270e-01 +143 -6.4456717536444386e-01 -8.2221860127843815e-01 -3.1619033462829965e-01 +194 4.6000888686458724e-01 2.4868203858229221e-01 -1.0844456124091726e+00 +308 7.0412401782623568e-01 1.4705120558853640e-01 -1.6984333842169479e+00 +286 -7.4825969157579242e-01 1.7277684761952672e+00 -4.8658995664543186e-01 +61 -1.4087152482721139e+00 -1.9786675343505181e-01 -8.3049863139435698e-01 +426 -5.9317510584759559e-01 -3.1176204329742879e-01 9.7102624547089234e-01 +450 2.9660411649227686e-01 -1.0106432265344207e+00 -8.0608626908093450e-01 +188 -4.5857896465809017e-01 8.3781782180488956e-02 1.6679261825519407e+00 +94 -2.5105865768429703e-01 -1.0277678550758340e+00 2.0110948522283595e-01 +252 -2.6250057461969262e-01 -8.3779492646801812e-01 -1.2443616941843418e+00 +321 -1.3849227082743394e+00 -7.9961814140752485e-01 -5.2758719721869440e-01 +156 9.7248559724229044e-01 1.4856613149426096e-01 -1.0762319296143268e+00 +167 4.8758255885458768e-01 3.7938735168685944e-01 -8.2720329905212353e-01 +330 4.8147102008722625e-01 -2.9945144880586022e-01 -7.3225876236181275e-01 +195 1.6483881807209144e+00 -1.9598861592898009e-01 -6.2914422221089158e-02 +78 2.3726384124165131e-01 2.7514362192855252e-01 1.7571172900747967e-01 +157 -2.1865090243933563e+00 3.7632441115528098e-01 7.7333806476534650e-01 +373 9.8884980347773899e-01 3.4121263358683873e-01 -3.3626353210018556e-01 +56 -5.1874451216553419e-01 5.0889073330236878e-01 -7.4130187216438104e-01 +315 1.5052362221906064e+00 -6.9840962964633502e-01 -1.5488907100876634e-01 +478 1.1082301092586995e+00 2.9770971389874379e-01 -5.4580262091212584e-01 +109 9.4396405787734605e-01 4.9318782477478235e-01 1.2284569230572757e+00 +357 -1.2371693160029509e+00 4.1376978558912775e-01 3.3529522630256764e-01 +454 -4.4342104600414733e-01 -3.5633346291025164e-01 -2.1131375082322554e-01 +86 -2.6274074185542590e-01 -2.7912975828127135e-01 -3.4564526880694488e-02 +262 -2.0457328043953218e-01 -1.0549970010682790e+00 -8.7569945910877856e-02 +160 1.2508565962389259e-01 -1.1049367732134203e+00 -4.1414673901133031e-01 +168 -5.4833844765552298e-01 9.1122623641564449e-01 -8.1466354261018392e-01 +145 1.9424847461468013e+00 2.4717259671440775e-01 -8.1993106446423478e-02 +400 -7.3927429735196926e-01 9.6278828542903949e-01 9.8355595468926471e-01 +395 -1.7616642510587566e+00 -4.3839255400156163e-01 -4.3538389834393521e-01 +297 -8.1651466743971568e-01 1.9480772762641770e-02 -2.5090574319554337e-01 +207 9.9594630394692474e-01 -5.5333584932915503e-01 -8.1672262386449701e-02 +460 3.8863838706865678e-01 -1.9332061145329088e-01 7.5599739666291188e-01 +44 4.9322334356812642e-01 5.4097595609480897e-01 1.2096517945019982e+00 +377 -2.3588544095100208e-02 4.2843373407529362e-01 -8.1372583759538197e-01 +411 -7.0187880935114388e-01 -8.8403807864596529e-01 3.6139298123719504e-01 +396 -6.1324863673452068e-01 -5.8579142070009704e-01 -1.6980414017487730e+00 +424 -1.4405372913769463e+00 -1.2161267905238037e-01 -7.1275775203655271e-03 +66 -2.2455608800065441e-01 -5.5194985983545303e-02 -2.9031971555487707e-01 +371 2.8693892522161785e-01 -1.3942754264578394e-01 4.1638095135795372e-01 +186 -2.5542578648985415e-01 -2.7435394726950046e-01 1.6931522427410683e+00 +413 5.6007135922818607e-01 1.2189064363493711e-01 -7.5271223366515216e-01 diff --git a/examples/USER/uef/npt_biaxial/in.npt_biaxial b/examples/USER/uef/npt_biaxial/in.npt_biaxial new file mode 100644 index 0000000000..152054fce6 --- /dev/null +++ b/examples/USER/uef/npt_biaxial/in.npt_biaxial @@ -0,0 +1,31 @@ +# biaxial NPT deformation of WCA fluid + +units lj +atom_style atomic + + +pair_style lj/cut 1.122562 +read_data data.wca +pair_coeff 1 1 1.0 1.0 +pair_modify shift yes + +neighbor 0.5 bin +neigh_modify delay 0 + +change_box all triclinic + +# these commads show the different methods that may be used to impose +# a constant stress through isotropic or anisotropic coupling +fix 1 all npt/uef temp 0.722 0.722 0.5 iso 10 10 5 erate 0.5 0.5 ext z +#fix 1 all npt/uef temp 0.722 0.722 0.5 z 10 10 5 erate 0.5 0.5 ext xyz + +fix 2 all momentum 100 linear 1 1 1 + +#dump 1 all atom 25 dump.lammpstrj + +#dump 2 all cfg/uef 25 dump.*.cfg mass type xs ys zs + +thermo_style custom step c_1_press[1] c_1_press[2] c_1_press[3] + +thermo 50 +run 10000 diff --git a/examples/USER/uef/npt_biaxial/log.22Sep17.npt_biaxial.g++.1 b/examples/USER/uef/npt_biaxial/log.22Sep17.npt_biaxial.g++.1 new file mode 100644 index 0000000000..e6d3b30cdb --- /dev/null +++ b/examples/USER/uef/npt_biaxial/log.22Sep17.npt_biaxial.g++.1 @@ -0,0 +1,284 @@ +LAMMPS (22 Sep 2017) +# biaxial NPT deformation of WCA fluid + +units lj +atom_style atomic + + +pair_style lj/cut 1.122562 +read_data data.wca + orthogonal box = (0 0 0) to (8.39798 8.39798 8.39798) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 500 atoms + reading velocities ... + 500 velocities +pair_coeff 1 1 1.0 1.0 +pair_modify shift yes + +neighbor 0.5 bin +neigh_modify delay 0 + +change_box all triclinic + triclinic box = (0 0 0) to (8.39798 8.39798 8.39798) with tilt (0 0 0) + +# these commads show the different methods that may be used to impose +# a constant stress through isotropic or anisotropic coupling +fix 1 all npt/uef temp 0.722 0.722 0.5 iso 10 10 5 erate 0.5 0.5 ext z +#fix 1 all npt/uef temp 0.722 0.722 0.5 z 10 10 5 erate 0.5 0.5 ext xyz + +fix 2 all momentum 100 linear 1 1 1 + +#dump 1 all atom 25 dump.lammpstrj + +#dump 2 all cfg/uef 25 dump.*.cfg mass type xs ys zs + +thermo_style custom step c_1_press[1] c_1_press[2] c_1_press[3] + +thermo 50 +run 10000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.62256 + ghost atom cutoff = 1.62256 + binsize = 0.811281, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.742 | 2.742 | 2.742 Mbytes +Step c_1_press[1] c_1_press[2] c_1_press[3] + 0 6.3937851 7.0436438 6.4461087 + 50 7.9020345 7.303289 14.733929 + 100 8.3214325 8.385843 13.166247 + 150 5.7168419 5.6083988 9.7224198 + 200 3.8875348 4.0840705 7.9912973 + 250 4.2933724 4.2410519 7.7200953 + 300 4.5452314 4.2434949 8.6709832 + 350 5.446489 5.6166962 11.300536 + 400 6.0682558 5.7787878 12.106852 + 450 5.3884296 5.5066688 9.9100012 + 500 4.8046418 4.7115986 9.9769201 + 550 4.9043933 4.6240966 9.319336 + 600 4.6843238 4.9571246 9.5325487 + 650 5.1952989 5.195648 9.6187047 + 700 5.4163364 5.2938289 10.136655 + 750 5.6723178 5.0670261 11.415221 + 800 5.9379901 5.6402916 10.815209 + 850 5.0695389 5.3021432 10.742859 + 900 4.6498962 4.7111912 9.8453523 + 950 4.4811641 5.170132 9.421765 + 1000 4.7501483 4.2420772 9.3510803 + 1050 4.5973379 5.2046799 9.8632975 + 1100 4.7879562 4.9051316 9.8658626 + 1150 5.0528771 5.5048545 10.110913 + 1200 4.9926563 5.2482081 9.9610863 + 1250 4.8476232 4.8498859 9.5752989 + 1300 5.2932038 5.0594534 10.869545 + 1350 5.4720421 5.0830442 10.69386 + 1400 4.8175566 4.9863651 10.041898 + 1450 4.6307145 4.5615459 9.231299 + 1500 5.0296259 4.5433558 8.7180513 + 1550 4.8708444 5.1601014 10.256791 + 1600 5.5098593 5.316773 10.224386 + 1650 5.5055907 5.0516814 10.272037 + 1700 4.6965552 5.2436628 9.8272905 + 1750 5.0212307 4.740601 8.9738802 + 1800 4.7756351 5.199734 9.9929449 + 1850 4.7107092 5.177203 10.580427 + 1900 5.0935608 4.5286844 9.3036832 + 1950 4.8035855 4.894359 9.4423987 + 2000 4.5643937 4.7480477 9.4384251 + 2050 4.9314701 4.990414 10.151815 + 2100 5.9828824 5.8188026 12.262691 + 2150 5.5337303 5.4598468 10.136112 + 2200 4.892172 4.8699674 9.1629905 + 2250 4.5680591 4.5740533 9.5633545 + 2300 5.0023535 4.3948659 8.9645774 + 2350 5.2533056 4.9803884 10.255653 + 2400 5.3330196 5.3888322 10.021617 + 2450 5.2095527 4.8765336 10.135381 + 2500 5.221153 5.2974568 10.2493 + 2550 5.385331 5.0801192 10.490479 + 2600 5.3274988 5.0253548 10.147587 + 2650 4.718677 5.2710337 9.7549521 + 2700 4.5811521 4.6083971 8.1923164 + 2750 4.4743752 4.3319737 8.8690805 + 2800 5.0215013 5.2262961 9.8627954 + 2850 6.1005107 5.5994942 11.170661 + 2900 5.9673524 5.362124 10.401699 + 2950 5.5400849 5.7523993 10.292536 + 3000 4.9202636 5.1210431 10.125839 + 3050 4.5286487 5.3586164 9.8634322 + 3100 4.5719961 5.1615414 9.8027972 + 3150 5.4091919 4.8581943 9.96938 + 3200 5.522125 5.3564838 9.7638407 + 3250 4.9019062 5.2514758 9.2993079 + 3300 5.2375918 5.1439012 9.4313575 + 3350 4.750235 4.8692016 10.54193 + 3400 5.5793211 5.4184157 11.021389 + 3450 4.9022614 5.3166498 9.4629659 + 3500 4.6348617 4.4650979 9.0665548 + 3550 4.7922405 4.8961269 10.255446 + 3600 4.8914457 5.1158894 9.4736084 + 3650 5.062771 4.6725475 10.263484 + 3700 5.4842823 5.7793971 10.342915 + 3750 5.3136012 5.063065 10.398307 + 3800 4.9372149 4.9270414 9.5304748 + 3850 5.2144752 5.1716455 9.7575725 + 3900 5.0892665 5.1697057 9.918052 + 3950 5.1124507 5.354702 9.791366 + 4000 5.1255084 5.1143653 10.913101 + 4050 5.1891698 4.9913681 9.6871728 + 4100 4.7663368 4.2435014 8.3815668 + 4150 4.8060033 4.3415868 9.6553386 + 4200 4.8548303 4.8006768 9.5995801 + 4250 5.0976366 5.2683175 10.386444 + 4300 5.8921937 5.5134696 10.788143 + 4350 5.8323871 5.5255869 11.199128 + 4400 5.2464655 5.0005905 10.311055 + 4450 4.9264849 5.2499854 10.26702 + 4500 4.4431895 4.536981 8.7489096 + 4550 4.5180914 4.2080277 8.6525529 + 4600 5.1782188 5.1224059 10.683341 + 4650 5.4156233 4.8714464 10.473939 + 4700 5.3107669 5.224614 10.569391 + 4750 4.9538022 5.2509475 10.288918 + 4800 4.6976945 4.8107142 9.8299772 + 4850 5.1227936 5.0737571 10.440452 + 4900 4.7580514 4.6375995 9.1971008 + 4950 5.0647601 4.6470735 9.583131 + 5000 5.196231 5.7531491 10.409807 + 5050 5.6691323 5.7163652 12.335701 + 5100 5.3603738 5.4887106 10.961712 + 5150 4.455028 4.6494465 9.8096968 + 5200 4.7596912 4.4804896 9.3762885 + 5250 5.3144927 5.0113772 9.553101 + 5300 5.3445266 4.8262035 9.1220802 + 5350 5.1540657 5.5982676 10.765178 + 5400 5.1773418 5.2684381 10.452351 + 5450 4.8946859 5.3283747 9.8015564 + 5500 5.2009608 4.7183522 9.4558009 + 5550 5.4158589 5.5005458 10.539505 + 5600 4.7196831 5.4181991 9.6439249 + 5650 4.8333571 4.8601728 8.9350189 + 5700 5.4395698 4.9730096 10.669681 + 5750 5.2947443 5.6973259 10.020539 + 5800 5.4391993 5.5255143 10.264969 + 5850 4.9921388 5.2643827 10.217028 + 5900 5.0048643 4.7952641 8.9718929 + 5950 5.1843818 4.5987295 9.6858944 + 6000 5.0343993 4.946933 9.7436708 + 6050 4.6202714 5.3502658 10.752915 + 6100 5.6914422 5.3621964 10.281827 + 6150 5.1928763 5.9652686 10.923881 + 6200 5.0030409 5.2013891 10.056308 + 6250 4.9699876 5.2363753 9.9964211 + 6300 4.9129606 4.4558458 9.0419952 + 6350 4.6623958 4.4078264 8.528649 + 6400 4.9811441 5.1183207 10.261751 + 6450 5.3644017 5.5153937 10.401295 + 6500 5.6674981 5.7427566 11.928777 + 6550 5.1622364 5.3212928 10.067198 + 6600 4.5954278 5.1645397 10.16724 + 6650 4.9192712 5.0413326 9.95656 + 6700 4.6179845 4.5656214 9.3798952 + 6750 4.7287495 4.5071148 8.7890116 + 6800 4.8600442 4.8083512 10.245595 + 6850 5.0515531 5.1609272 10.553855 + 6900 5.1159742 5.1359869 10.594699 + 6950 4.8908884 5.0592418 9.5698704 + 7000 4.7654136 4.7530776 8.9439321 + 7050 4.779293 4.7534957 9.7244349 + 7100 5.2265831 5.6869073 10.32717 + 7150 5.4019177 5.15174 10.457567 + 7200 4.9817102 5.0596098 10.337574 + 7250 5.1836654 5.6065238 10.723108 + 7300 4.2916569 4.457143 8.5419099 + 7350 4.3906104 4.5439294 9.0805415 + 7400 4.998572 5.3386063 10.491418 + 7450 5.1109022 5.0506801 10.636116 + 7500 5.0248381 5.019932 10.217023 + 7550 5.0109265 5.1438717 9.9032426 + 7600 4.6628614 4.6204146 8.9459669 + 7650 4.8930717 5.0650009 10.049331 + 7700 4.9373454 5.6265835 10.210644 + 7750 5.5001067 5.3133253 10.667995 + 7800 5.0816102 5.0125753 10.591986 + 7850 4.9638046 5.1969015 9.9728333 + 7900 4.8438207 4.9217213 8.9978809 + 7950 4.7318805 4.6248537 8.6806596 + 8000 5.2808543 5.2892613 10.932535 + 8050 5.9609722 5.87087 10.47602 + 8100 5.2190231 5.6693244 11.244536 + 8150 5.3481127 5.2849903 10.222845 + 8200 4.7833053 4.7404657 9.2034474 + 8250 4.5461994 4.510467 10.294452 + 8300 4.6025175 4.8332817 8.7967546 + 8350 5.0389897 5.6642908 10.243402 + 8400 4.8414338 4.8925143 9.3653631 + 8450 5.5087429 4.7830361 10.831666 + 8500 5.2678146 5.1697789 9.9105782 + 8550 5.1211843 4.9097801 9.4165956 + 8600 5.8239149 5.0821022 10.803261 + 8650 5.3620154 5.5831747 11.16202 + 8700 5.1625813 4.8791404 10.537681 + 8750 4.5622461 5.0157549 10.013227 + 8800 4.4051517 5.0224553 9.6364273 + 8850 4.1711629 4.635617 8.5470244 + 8900 4.7049907 5.2458435 10.100728 + 8950 4.8568883 5.2360772 9.2306469 + 9000 5.0091899 5.2203574 10.718541 + 9050 5.1037824 4.9022451 10.24271 + 9100 5.0789015 4.9331454 9.173614 + 9150 5.3865455 5.3427553 11.40199 + 9200 5.5089482 5.9423232 10.976063 + 9250 5.1353552 5.0650262 10.040607 + 9300 4.6761948 4.9155175 9.6413722 + 9350 4.4780834 4.3934708 8.7049819 + 9400 4.2561799 4.7906324 9.046134 + 9450 5.6162819 5.2881846 9.9040868 + 9500 5.7554547 5.6111262 10.23849 + 9550 5.4230462 5.5656045 10.908006 + 9600 5.5045685 4.9818892 9.8929535 + 9650 5.0541481 5.0183351 9.5226021 + 9700 4.9712829 5.2395398 9.9996693 + 9750 5.0960017 5.4419775 10.914719 + 9800 5.0790688 5.6378474 10.00789 + 9850 4.9661747 5.114502 9.4585052 + 9900 5.0133498 4.7456254 9.4572653 + 9950 5.3318846 4.6643122 10.096292 + 10000 5.2227687 4.8924305 9.5894615 +Loop time of 4.78247 on 1 procs for 10000 steps with 500 atoms + +Performance: 903298.340 tau/day, 2090.968 timesteps/s +99.2% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.73894 | 0.73894 | 0.73894 | 0.0 | 15.45 +Neigh | 2.9092 | 2.9092 | 2.9092 | 0.0 | 60.83 +Comm | 0.32306 | 0.32306 | 0.32306 | 0.0 | 6.76 +Output | 0.003392 | 0.003392 | 0.003392 | 0.0 | 0.07 +Modify | 0.6959 | 0.6959 | 0.6959 | 0.0 | 14.55 +Other | | 0.112 | | | 2.34 + +Nlocal: 500 ave 500 max 500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 905 ave 905 max 905 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3340 ave 3340 max 3340 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3340 +Ave neighs/atom = 6.68 +Neighbor list builds = 4580 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:04 diff --git a/examples/USER/uef/npt_biaxial/log.22Sep17.npt_biaxial.g++.4 b/examples/USER/uef/npt_biaxial/log.22Sep17.npt_biaxial.g++.4 new file mode 100644 index 0000000000..9be4413a96 --- /dev/null +++ b/examples/USER/uef/npt_biaxial/log.22Sep17.npt_biaxial.g++.4 @@ -0,0 +1,284 @@ +LAMMPS (22 Sep 2017) +# biaxial NPT deformation of WCA fluid + +units lj +atom_style atomic + + +pair_style lj/cut 1.122562 +read_data data.wca + orthogonal box = (0 0 0) to (8.39798 8.39798 8.39798) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 500 atoms + reading velocities ... + 500 velocities +pair_coeff 1 1 1.0 1.0 +pair_modify shift yes + +neighbor 0.5 bin +neigh_modify delay 0 + +change_box all triclinic + triclinic box = (0 0 0) to (8.39798 8.39798 8.39798) with tilt (0 0 0) + +# these commads show the different methods that may be used to impose +# a constant stress through isotropic or anisotropic coupling +fix 1 all npt/uef temp 0.722 0.722 0.5 iso 10 10 5 erate 0.5 0.5 ext z +#fix 1 all npt/uef temp 0.722 0.722 0.5 z 10 10 5 erate 0.5 0.5 ext xyz + +fix 2 all momentum 100 linear 1 1 1 + +#dump 1 all atom 25 dump.lammpstrj + +#dump 2 all cfg/uef 25 dump.*.cfg mass type xs ys zs + +thermo_style custom step c_1_press[1] c_1_press[2] c_1_press[3] + +thermo 50 +run 10000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.62256 + ghost atom cutoff = 1.62256 + binsize = 0.811281, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.71 | 2.71 | 2.71 Mbytes +Step c_1_press[1] c_1_press[2] c_1_press[3] + 0 6.3937851 7.0436438 6.4461087 + 50 7.9020345 7.303289 14.733929 + 100 8.3214325 8.385843 13.166247 + 150 5.7168419 5.6083988 9.7224198 + 200 3.8875348 4.0840705 7.9912973 + 250 4.2933724 4.2410519 7.7200953 + 300 4.5452314 4.2434949 8.6709832 + 350 5.446489 5.6166962 11.300536 + 400 6.0682558 5.7787878 12.106852 + 450 5.3884296 5.5066688 9.9100012 + 500 4.8046418 4.7115986 9.9769201 + 550 4.9043933 4.6240966 9.319336 + 600 4.6843238 4.9571246 9.5325487 + 650 5.1952989 5.195648 9.6187047 + 700 5.4163364 5.2938289 10.136655 + 750 5.6723178 5.0670261 11.415221 + 800 5.9379901 5.6402916 10.815209 + 850 5.0695389 5.3021432 10.742859 + 900 4.6498961 4.7111912 9.8453524 + 950 4.4811637 5.1701321 9.4217645 + 1000 4.750149 4.2420768 9.3510788 + 1050 4.5973376 5.2046787 9.8633025 + 1100 4.7879517 4.9051339 9.8658578 + 1150 5.0528775 5.5048671 10.110905 + 1200 4.9926841 5.2482049 9.9610519 + 1250 4.8475836 4.8499116 9.5753651 + 1300 5.2930219 5.0593566 10.869335 + 1350 5.4722342 5.0830411 10.693439 + 1400 4.8165803 4.9851498 10.04213 + 1450 4.6276458 4.5642988 9.2306141 + 1500 5.0196773 4.5470773 8.7204145 + 1550 4.878246 5.1583406 10.263895 + 1600 5.4921049 5.3126759 10.274755 + 1650 5.4363266 5.1708866 9.9880665 + 1700 4.9186005 5.2841155 9.5911223 + 1750 4.9105668 4.7112031 8.9221295 + 1800 4.9833291 4.886821 9.6573393 + 1850 5.0729703 4.8331712 10.094971 + 1900 5.7220173 5.9330299 10.580261 + 1950 5.3176022 5.7140521 11.11604 + 2000 5.3247727 5.5172893 10.622834 + 2050 5.2055235 4.8768078 9.9819356 + 2100 4.4604981 4.1427844 7.8106592 + 2150 4.4406592 4.8264893 9.6662695 + 2200 5.2350836 5.1039145 10.36006 + 2250 5.3777857 5.3274609 11.357157 + 2300 5.4888334 5.9555482 10.76346 + 2350 4.6122564 4.7356468 9.0833059 + 2400 4.6670237 4.4895588 9.0619648 + 2450 4.2201177 4.2558397 9.4898835 + 2500 5.452448 5.4336384 10.50224 + 2550 5.012581 5.316158 10.324517 + 2600 5.0880279 5.1264772 10.085103 + 2650 4.8885834 5.2368982 9.6002032 + 2700 5.1549266 5.3419678 11.335447 + 2750 5.497105 5.3643445 9.9990393 + 2800 4.8826744 4.9875712 10.125435 + 2850 4.8617121 5.1282348 9.5629401 + 2900 4.7883446 4.6187804 9.0562496 + 2950 4.7656266 5.1293592 10.693811 + 3000 5.2676745 5.110172 9.3512146 + 3050 4.5749222 4.8413907 10.311305 + 3100 5.0794819 5.265009 9.1598496 + 3150 5.2078869 5.1879882 10.412548 + 3200 5.0187616 4.6226213 9.7266174 + 3250 5.1541897 4.5157063 9.8355764 + 3300 5.0721396 5.3545282 10.174356 + 3350 5.3984495 5.3222207 10.008886 + 3400 5.1263226 5.1189192 10.361534 + 3450 5.1251845 4.8312752 9.6546597 + 3500 5.1133696 5.2646289 10.320765 + 3550 4.9884235 5.3861707 9.1944042 + 3600 5.196909 5.203186 10.085965 + 3650 5.4717592 5.2205442 10.251283 + 3700 5.4429771 5.3027898 11.385714 + 3750 5.5688484 5.5980199 10.558193 + 3800 4.5239453 4.7021545 8.952588 + 3850 4.6438079 4.6409958 9.3890154 + 3900 5.1108473 4.8787691 10.665694 + 3950 5.6398426 5.4386578 10.668189 + 4000 5.063697 4.9663173 10.513266 + 4050 4.8770847 4.4603573 9.8101845 + 4100 4.3950768 4.3579384 8.3402845 + 4150 4.3355402 5.0429352 10.323111 + 4200 4.7688478 5.051487 9.0632339 + 4250 4.9879366 5.3367146 10.409554 + 4300 5.4578199 5.4889206 10.418789 + 4350 5.6598068 5.4538572 10.842349 + 4400 5.3705312 5.3796871 10.430547 + 4450 4.663804 5.058851 9.2705923 + 4500 4.3439039 4.3523422 8.1747925 + 4550 4.5414802 4.3750772 9.2702452 + 4600 4.9216199 5.2897069 10.747727 + 4650 5.5154852 5.9628437 10.5168 + 4700 5.45199 5.382787 10.654544 + 4750 4.7525419 5.4701385 9.3189378 + 4800 5.3696365 4.6134207 9.4455676 + 4850 5.2444123 5.035993 9.4148435 + 4900 5.6006507 4.8536828 10.283579 + 4950 5.155711 4.978634 10.58973 + 5000 5.0854607 4.9853307 9.2414296 + 5050 5.1098462 4.7349164 9.8739001 + 5100 5.1989395 5.0217416 9.8780949 + 5150 5.612116 5.2165007 10.338464 + 5200 5.0571356 5.3109846 10.685262 + 5250 5.4832657 5.0371665 8.9420853 + 5300 4.5312549 4.9629392 8.2478064 + 5350 5.1617038 5.0533699 10.452218 + 5400 5.7873394 5.6776926 11.926526 + 5450 5.7002516 5.243239 10.940265 + 5500 4.7896799 4.898544 10.163856 + 5550 4.9155627 4.9567495 9.4445476 + 5600 4.2447343 4.5045912 8.7732992 + 5650 5.070197 4.7343938 9.9908239 + 5700 4.9609446 5.0901934 10.812786 + 5750 5.4001631 5.5552888 10.085896 + 5800 5.4209837 4.7153245 9.6865245 + 5850 4.9801041 5.180338 9.8930439 + 5900 5.3423595 5.2341361 10.294159 + 5950 5.683047 5.6830131 10.24313 + 6000 5.0618789 5.4533644 10.713412 + 6050 5.4034888 4.6341621 10.031976 + 6100 5.1934299 4.7525347 9.1287151 + 6150 5.0092398 4.806931 10.024305 + 6200 5.3046516 5.3083532 9.6396223 + 6250 5.2824046 4.7957557 10.305279 + 6300 5.3007029 5.0071874 11.175322 + 6350 5.1128883 4.990408 9.3439118 + 6400 5.0543602 4.9971378 9.8259954 + 6450 4.8843692 4.9116343 10.08132 + 6500 4.5966453 4.8042861 9.160272 + 6550 4.8510961 4.7096646 9.8009968 + 6600 5.658307 5.2330511 10.739519 + 6650 5.2374409 5.3241249 10.291779 + 6700 4.9006975 5.0036186 9.9872029 + 6750 5.2209104 5.1826025 9.5671875 + 6800 4.5238727 4.3070529 8.6072303 + 6850 4.2617247 4.7551571 9.7302077 + 6900 5.6499354 4.8714257 10.723511 + 6950 5.6881769 5.1800721 10.18134 + 7000 5.588834 5.0104896 10.304105 + 7050 4.9404045 4.8589121 9.7096741 + 7100 5.2208179 4.9339808 9.7737491 + 7150 5.4507842 5.046485 10.734783 + 7200 4.9737171 5.5760486 9.1627431 + 7250 4.5967409 4.750471 9.315832 + 7300 5.5147308 5.3202861 10.542679 + 7350 5.7730418 5.5363574 10.384376 + 7400 4.9879586 5.2837443 9.4485798 + 7450 5.1862431 4.8357842 10.017598 + 7500 5.4528245 5.1864957 10.941774 + 7550 5.4202434 5.1089468 10.128264 + 7600 4.8063537 4.8723653 9.0364984 + 7650 4.3144701 4.6148377 9.4939315 + 7700 4.9033831 5.5327473 9.9054613 + 7750 5.0693093 5.0768222 10.473081 + 7800 5.0591805 5.6009473 10.006225 + 7850 5.15269 5.468248 10.404619 + 7900 5.1971759 5.0615117 9.9614488 + 7950 4.9771238 4.886213 9.4730722 + 8000 4.7731123 5.1111433 9.9550597 + 8050 5.1655183 5.4432364 9.6649669 + 8100 5.4597006 5.4026039 11.631184 + 8150 5.3229643 5.4394219 9.9830611 + 8200 4.5420712 4.9359646 9.0121988 + 8250 4.5455108 4.3883996 10.304568 + 8300 5.219721 5.1571958 10.305462 + 8350 4.7291561 4.7391636 9.0768372 + 8400 5.3262934 5.8221591 11.065466 + 8450 4.7583026 5.2282086 10.291955 + 8500 4.9174536 4.5701979 10.140444 + 8550 4.459922 4.8293188 9.4438719 + 8600 4.7962584 4.5811071 9.5158666 + 8650 4.6097275 4.431952 9.4350505 + 8700 5.166554 5.2000584 11.162202 + 8750 5.2353596 5.1668944 10.829751 + 8800 5.3150111 4.9983333 9.8402224 + 8850 4.9571197 4.9196589 9.4880549 + 8900 4.902223 4.7539187 10.002425 + 8950 4.9531983 5.0517321 9.7838444 + 9000 5.4003802 4.9900303 10.550808 + 9050 4.9254643 5.0678701 10.24321 + 9100 4.9902263 4.9056928 9.0326566 + 9150 5.1003677 5.1555374 10.049056 + 9200 5.2358131 5.5834504 10.354698 + 9250 5.5781649 5.1188429 10.361369 + 9300 5.2100192 5.0737267 10.074694 + 9350 5.1462976 4.8010759 9.0279769 + 9400 5.0177693 5.4890092 10.03612 + 9450 5.2507957 5.541141 10.639854 + 9500 5.836784 4.9498236 10.288015 + 9550 5.4698183 5.8761209 10.979924 + 9600 5.0534023 5.0043428 10.436057 + 9650 4.3619773 4.5413125 9.047513 + 9700 4.3777508 4.7902251 8.9501908 + 9750 4.6851974 4.3152085 8.825764 + 9800 5.7312665 4.850913 10.247637 + 9850 6.2290614 5.5480801 10.934907 + 9900 6.0316892 6.1098926 11.562223 + 9950 5.6370814 5.3933342 11.148805 + 10000 4.6429923 5.0853156 9.4267693 +Loop time of 3.06414 on 4 procs for 10000 steps with 500 atoms + +Performance: 1409858.531 tau/day, 3263.561 timesteps/s +99.4% 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.27954 | 0.30916 | 0.3866 | 8.1 | 10.09 +Neigh | 1.0657 | 1.129 | 1.2853 | 8.5 | 36.85 +Comm | 0.56334 | 0.80526 | 0.89816 | 15.6 | 26.28 +Output | 0.0032749 | 0.0041527 | 0.006541 | 2.1 | 0.14 +Modify | 0.6522 | 0.67016 | 0.69843 | 2.1 | 21.87 +Other | | 0.1464 | | | 4.78 + +Nlocal: 125 ave 130 max 122 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Nghost: 459.75 ave 470 max 448 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 837 ave 867 max 811 min +Histogram: 2 0 0 0 0 0 0 0 1 1 + +Total # of neighbors = 3348 +Ave neighs/atom = 6.696 +Neighbor list builds = 4589 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:03 diff --git a/examples/USER/uef/nvt_uniaxial/data.wca b/examples/USER/uef/nvt_uniaxial/data.wca new file mode 100644 index 0000000000..889ba4d2f2 --- /dev/null +++ b/examples/USER/uef/nvt_uniaxial/data.wca @@ -0,0 +1,1022 @@ +LAMMPS data file via write_data, version 14 May 2016, timestep = 400000 + +500 atoms +1 atom types + +0.0000000000000000e+00 8.3979809569125372e+00 xlo xhi +0.0000000000000000e+00 8.3979809569125372e+00 ylo yhi +0.0000000000000000e+00 8.3979809569125372e+00 zlo zhi + +Masses + +1 1 + +Pair Coeffs # lj/cut + +1 1 1 + +Atoms # atomic + +7 1 2.4137737201272674e-01 2.0017433398687118e-01 3.6157393311703534e-02 2 1 2 +398 1 1.6739594898193126e+00 3.0313452824803544e-01 5.7986723161362197e-01 -3 0 1 +173 1 6.1370793327804556e+00 4.4978954867119525e-01 3.6568951377817088e-01 -4 1 0 +462 1 7.8754716784931862e+00 5.2908038473333074e-01 7.9185633743762940e-01 1 1 -2 +383 1 6.5373096080170212e-01 1.5337525983981986e+00 6.3208419126059423e-01 2 0 1 +288 1 1.9354124990672374e+00 1.3318105136786291e+00 3.6211635210084403e-01 -1 1 0 +303 1 2.9661308460819318e+00 1.1444058564802859e+00 6.5604777151148241e-01 -2 2 1 +491 1 7.1514675802966758e+00 1.3588685826107376e+00 1.2875068928885325e-01 -1 0 0 +187 1 3.0670386025081497e-01 2.4850915964494620e+00 7.0944157374329464e-02 0 -1 0 +163 1 1.2805212773629451e+00 2.4034621328433090e+00 2.0184086197146742e-01 0 1 -1 +345 1 2.5952244948945173e+00 2.3405536448220743e+00 3.0019149048630317e-01 -3 2 1 +447 1 3.9059163101716741e+00 1.6849179478858272e+00 6.0306488750926446e-01 -2 3 -4 +108 1 4.9215629854759335e+00 2.5174843149522088e+00 6.2779912940916158e-02 1 0 -1 +427 1 6.3978861821382305e+00 1.9201774263431104e+00 4.3981049730412797e-01 -1 -2 -3 +96 1 7.4061541304605534e+00 2.4828308207907996e+00 2.4705543772216432e-01 0 -3 2 +494 1 8.0759482343563711e+00 1.6914241739458744e+00 6.8482420189075921e-01 -3 1 2 +360 1 3.1886448226656765e+00 3.1126224743956139e+00 5.4052217066940123e-01 1 1 -2 +179 1 4.2399500260508116e+00 2.8640916432630559e+00 7.5278462735962870e-01 -1 1 1 +136 1 6.2603021059339365e+00 3.2638426060411403e+00 9.9163685662983045e-02 -2 0 3 +311 1 8.0699058291845773e+00 3.1228722160017734e+00 7.5458759573094458e-01 -3 -3 3 +242 1 8.1363443818268044e-02 3.8061968817045986e+00 5.4644298839992535e-02 1 1 1 +451 1 1.9291602479953753e+00 3.5896469823727863e+00 2.3008537852985023e-01 -1 0 0 +118 1 5.3566912079946780e+00 3.5234509548370374e+00 6.7801317822012042e-01 1 -3 -1 +200 1 6.7588369512940338e-01 6.1719413314115790e-01 9.9275606042642373e-01 -1 2 3 +23 1 2.1873327028525060e+00 4.2754803645009956e-02 1.4143560341384132e+00 -3 -1 0 +30 1 3.9592898204338112e+00 6.8093268022015185e-01 1.2987004742604558e+00 -1 -2 -2 +26 1 5.1175076813830467e+00 5.1869033157649591e-01 9.5797839381311178e-01 0 1 2 +452 1 6.5582763761917411e+00 3.4514602671261341e-01 1.2368598815410630e+00 -2 0 -2 +439 1 8.3865135868155445e+00 1.4825845267600596e-01 1.6737363681796917e+00 -2 3 1 +492 1 1.6645816560197648e+00 9.7557398318995125e-01 1.3973497820249918e+00 -2 3 1 +287 1 2.8845951500519784e+00 9.2974386224238703e-01 1.6104516406361071e+00 2 -1 2 +87 1 5.9282888423658395e+00 1.2716232081523247e+00 1.1744299163086194e+00 -1 2 -1 +191 1 7.0465887128985001e+00 1.3447129135151838e+00 1.1378718594147066e+00 -1 2 0 +316 1 6.6785856436835267e-01 2.4243200282222617e+00 1.1253836626025919e+00 0 1 0 +176 1 1.8165460632802826e+00 2.1437252128100086e+00 1.0868234266569741e+00 1 1 1 +244 1 3.5041229236927576e+00 2.3924032537771125e+00 1.3551249499971583e+00 -3 1 4 +463 1 4.9238071200835165e+00 1.7488964460038467e+00 8.7393010597649756e-01 -2 2 1 +101 1 4.7502017837518187e+00 2.5070270251466997e+00 1.6042073679153410e+00 -3 0 -2 +456 1 6.7262574842655534e+00 2.1937608587635533e+00 1.5819520420856528e+00 0 2 3 +90 1 7.8106680805872131e+00 2.3465270292028992e+00 1.4066520475037838e+00 0 -4 1 +457 1 2.2543678933961773e+00 3.1652213402916889e+00 1.1451988834668292e+00 -1 0 0 +344 1 5.9751963550424136e+00 2.8740523385222234e+00 1.2530570351392452e+00 0 1 -1 +399 1 8.2525481582297566e-01 3.4796551803028120e+00 1.0452539946382762e+00 1 -1 -1 +472 1 2.5500022667255768e+00 4.1144011701979659e+00 1.1937493716055980e+00 0 1 2 +364 1 3.2074279852156709e+00 3.3909867375667604e+00 1.5492265188845586e+00 -1 0 0 +333 1 4.2063776055408209e+00 3.7436012461483292e+00 1.2983951160694676e+00 -1 1 1 +223 1 6.0720407506223024e+00 3.9437056464141231e+00 1.5634726007362729e+00 0 0 1 +277 1 6.8850289844945918e+00 3.5744109988378070e+00 1.1843729982426427e+00 2 0 0 +487 1 8.0236797280148657e+00 4.0759691449476652e+00 1.1816920447826709e+00 -1 0 5 +202 1 1.1425010515906946e+00 1.1629395296284512e-02 2.5086432758529211e+00 -1 -2 0 +139 1 2.3147555111337756e+00 1.8665688332261610e-01 2.4220734387693037e+00 -5 0 1 +218 1 3.5367098631556342e+00 6.2760250051756761e-01 2.4478818232869410e+00 1 0 -2 +10 1 4.3729774450168737e+00 1.6632191047636544e-01 2.1079853667170236e+00 -2 -1 -2 +64 1 5.7303792911825742e+00 2.9006680684615282e-01 1.9605629224377070e+00 -2 1 2 +40 1 6.5824557178778531e-01 8.5028950299011019e-01 2.1496168105059708e+00 2 1 1 +328 1 1.5589817713112594e-01 1.6225523918451032e+00 1.7310231111691350e+00 3 0 0 +292 1 2.1314993621742819e+00 1.2260233186264009e+00 2.3652294967955245e+00 0 0 -1 +245 1 4.6666032401598603e+00 1.5042368206958292e+00 1.9142905720694421e+00 -3 1 -1 +148 1 6.7720428171922631e+00 8.7008110148972428e-01 2.0934267451930806e+00 0 0 1 +435 1 7.7341388550057273e+00 9.1983544373491155e-01 1.8223856537522831e+00 -2 -1 1 +301 1 2.9295611364078922e-01 2.4942786265027763e+00 2.2355337509297120e+00 -2 -3 -2 +476 1 1.3648021789963285e+00 1.8605609454926342e+00 2.0851101905225424e+00 1 0 -1 +310 1 2.6428836469132526e+00 2.1636738846129742e+00 1.7827293416008847e+00 3 2 0 +137 1 3.6368685754799719e+00 1.7198335009724290e+00 2.1014306554853008e+00 1 -1 1 +434 1 5.6400362255303138e+00 2.0264029757942144e+00 1.7648993119896872e+00 0 -1 0 +184 1 7.6228520959849160e+00 2.1704001606029473e+00 2.4690779972373509e+00 0 1 -1 +5 1 1.5547914352159820e+00 3.0246432147284117e+00 1.9341058666944422e+00 5 1 -2 +41 1 3.5394530649909939e+00 2.8672493763709368e+00 2.3721754433370239e+00 0 0 0 +410 1 5.2622202291807252e+00 3.3532222678989076e+00 2.0249715425869179e+00 2 1 1 +418 1 6.2986243250817040e+00 2.9042203242504363e+00 2.3450580832445986e+00 -1 2 0 +34 1 6.5845359986575269e-01 3.5330771386953552e+00 2.1708302646106170e+00 -2 3 1 +67 1 2.2321109286615104e+00 3.8391986294826608e+00 2.3598318070524229e+00 1 -1 0 +390 1 4.4001972293445766e+00 3.7784400898230768e+00 2.3530190506208175e+00 1 2 -1 +125 1 6.8584035481270371e+00 3.7859398002695177e+00 2.2262509649550242e+00 -3 1 3 +105 1 8.0142836210079444e+00 3.4253500628703644e+00 1.9822510084209746e+00 1 0 -2 +274 1 4.5713678557713822e-01 5.4244335571632307e-01 3.0849174937154351e+00 1 -2 1 +314 1 1.8447059547300777e+00 1.1692544876557610e-01 3.3199499683474132e+00 2 0 -1 +408 1 3.1814603728989130e+00 7.4387930556111925e-02 3.3119410401147560e+00 -1 1 1 +142 1 5.0629800765951494e+00 4.5529434814892644e-01 2.8994044435235393e+00 2 -1 -3 +25 1 6.1307890615815195e+00 4.8707110399724851e-01 2.9156227033318936e+00 0 2 -4 +458 1 7.5149810474983081e+00 4.9072663758191898e-01 2.7754564040841219e+00 2 -4 0 +165 1 1.3117326379233891e+00 1.1343392736952256e+00 3.1076574691841947e+00 -2 2 2 +421 1 2.7633861789985827e+00 9.5478806243591052e-01 3.1957876340691875e+00 -1 -3 1 +151 1 4.7220243778881930e+00 1.4282004346636548e+00 3.2642378377455432e+00 0 0 -1 +162 1 5.6468847674841811e+00 1.3364063405496600e+00 2.5903751818453160e+00 4 -4 -2 +120 1 8.2129099591176686e+00 1.3575499019485984e+00 2.6634845511723606e+00 0 0 0 +448 1 8.8805142887530297e-01 2.2694079305496020e+00 3.1897834611367313e+00 -1 1 3 +50 1 2.9687835700409062e+00 1.9135157390691884e+00 2.8548074734572992e+00 -3 0 1 +443 1 4.0462687470728396e+00 2.3330394967344139e+00 3.1667340148022216e+00 0 1 -2 +482 1 4.9427462157614270e+00 2.1611442624383619e+00 2.6370759110090005e+00 0 3 3 +407 1 5.7753726348779013e+00 2.4435329312939671e+00 3.1756094964019836e+00 0 1 -1 +100 1 6.6610073695947598e+00 1.9476592422501362e+00 2.6046914024931409e+00 -2 -2 1 +99 1 3.5098260053604374e-01 3.2489377905726768e+00 3.1253385231740438e+00 -1 1 -1 +107 1 1.3942178307183000e+00 3.1914627339242005e+00 2.9813408440396350e+00 2 0 1 +480 1 2.3066257454835091e+00 2.6794898513136354e+00 2.7495660819550110e+00 -1 -2 -1 +115 1 3.1214377398204638e+00 2.9223083977660864e+00 3.3233156913824242e+00 1 2 1 +278 1 5.0520729931158854e+00 3.1424127338010743e+00 3.1175324674801042e+00 0 0 -1 +206 1 7.7081484276756580e+00 3.0580419350207482e+00 3.0362913717240096e+00 0 -1 -4 +4 1 1.3000434256419220e+00 4.1733384323360649e+00 2.6659576195319934e+00 1 0 2 +214 1 3.2669228431804429e+00 3.8002115979716740e+00 2.6408106015701289e+00 0 0 0 +65 1 4.0280349657536760e+00 3.3861374196314542e+00 3.2331032594455227e+00 2 1 2 +490 1 5.8571557116011554e+00 3.8735942685941813e+00 2.8613897619661586e+00 -1 -2 0 +230 1 2.4828380364158602e+00 5.5335473677805791e-01 4.1950137944148906e+00 2 -1 3 +234 1 4.2752320357614213e+00 1.4212800762204394e-01 3.7635975156407624e+00 -2 1 -4 +92 1 5.6957646578006917e+00 2.5374658514218495e-02 3.8304068113906884e+00 0 -1 0 +103 1 7.0230616578295741e+00 4.6755655210711161e-01 3.8662999072020967e+00 1 -2 1 +129 1 8.1671299320274162e+00 5.7067862198193264e-01 4.0702212708530077e+00 -1 -2 0 +483 1 3.2862260723228903e-01 1.4557716141563948e+00 3.6577409481728278e+00 -3 4 -1 +110 1 1.5047240722693447e+00 1.0396158231062973e+00 4.0843832165787424e+00 -2 -1 0 +126 1 3.7388270640303456e+00 1.1962750537841655e+00 3.4335639532998909e+00 3 0 0 +276 1 5.6087889039130960e+00 1.1358153696317190e+00 3.7428282467743927e+00 0 2 1 +294 1 6.5127919732673050e+00 1.4345197299837358e+00 3.4448769173070444e+00 -2 0 2 +417 1 7.5734653423068021e+00 1.3756634588591667e+00 3.5078056411981438e+00 -1 1 0 +102 1 1.1107713360470239e+00 2.0167473232388695e+00 4.1576658165713738e+00 -2 0 0 +228 1 2.0072330566273600e+00 1.8105875233272237e+00 3.4619908126078429e+00 2 0 -1 +2 1 3.2101113937010530e+00 2.0183489554560774e+00 3.8822820800419566e+00 0 1 -1 +222 1 4.2730523271288350e+00 1.9092752363315002e+00 4.1553216684001049e+00 1 -1 0 +332 1 6.5042309397343736e+00 2.2214607151080448e+00 4.1057034120156182e+00 0 1 3 +275 1 7.5099659540449100e+00 2.2790896507455778e+00 4.1566328430638730e+00 -1 0 -1 +243 1 8.2736142057938107e+00 2.3393256795577462e+00 3.4990413844829384e+00 0 0 -2 +394 1 5.8512440497757878e-01 2.8807282965119669e+00 3.9612614891397042e+00 1 3 1 +325 1 2.1875714466797338e+00 2.8726101452768167e+00 3.8147636089102748e+00 0 2 -1 +468 1 5.6059790271973755e+00 2.9975764588671621e+00 3.9816014902843078e+00 0 1 0 +113 1 6.5849924400139104e+00 3.1808065990344776e+00 3.4367361163256929e+00 0 0 1 +47 1 1.0081753047752569e+00 3.9556172416934308e+00 3.8502376136806813e+00 1 -1 0 +474 1 1.9694475511677239e+00 3.9381337754040748e+00 3.4201230948176762e+00 4 1 -1 +343 1 3.0370114219017328e+00 3.9465351732349148e+00 3.7436387890882474e+00 0 -2 3 +257 1 6.0639634839200358e+00 3.9545122043987475e+00 3.7922755780058259e+00 1 3 -3 +422 1 7.3939236737263112e+00 3.9358351587357783e+00 3.4932390476416106e+00 -2 -1 -3 +317 1 3.5159353631335000e+00 5.3479576975233323e-01 4.4869163379906354e+00 -1 -2 -4 +322 1 5.5733359556605757e+00 4.8698103039818835e-01 4.7704783768556309e+00 1 6 -1 +453 1 7.3567123647601029e+00 8.3432787155128474e-02 4.8780449077720851e+00 -2 3 2 +82 1 5.8224871123849942e-01 1.1896491837492689e+00 4.7267276175254507e+00 3 0 -1 +402 1 2.4848673528490579e+00 1.6438582837634208e+00 4.4663750233867230e+00 0 2 3 +201 1 3.5370299676438193e+00 1.4874347892452509e+00 4.7752714735806165e+00 0 -2 -1 +159 1 4.7745775925936407e+00 9.0511891230699659e-01 4.2787903105333260e+00 0 -2 2 +239 1 6.3670232447984816e+00 1.2120460051587267e+00 4.4601763672019308e+00 0 1 -1 +340 1 7.6240687426290750e+00 1.3432987598476136e+00 4.6741720105351368e+00 -2 1 1 +246 1 6.4819140516389595e-02 2.1918155429312383e+00 4.6033031341679633e+00 0 2 1 +268 1 5.2454607296226170e+00 2.0016193334579642e+00 4.2366338410742728e+00 -2 2 0 +238 1 1.7670560071066166e+00 3.0774892421151585e+00 4.7759677543328642e+00 0 0 0 +183 1 2.7500175098986750e+00 2.8066272725663279e+00 4.6976729622871014e+00 -2 0 0 +393 1 3.6570205199594930e+00 3.1994600133365143e+00 4.2220986255821451e+00 1 2 -1 +177 1 4.6077861627416805e+00 2.8922144055644265e+00 4.5492372075807843e+00 0 -1 0 +97 1 2.5306051464072796e+00 3.9363146816844674e+00 4.9489842130852137e+00 2 0 1 +16 1 5.1924745493168265e+00 3.7357318418579575e+00 4.8717896643693246e+00 0 -2 -1 +15 1 6.1086100243278070e+00 4.1952083415168335e+00 4.9407045230806066e+00 -1 0 -4 +467 1 6.6872865628091098e+00 3.3657369472951393e+00 4.6943068780100674e+00 1 2 2 +404 1 8.0052336596808171e+00 3.5358005023997046e+00 4.5274309747477952e+00 2 2 -1 +190 1 9.4380374464947103e-01 4.4583992222855645e-01 5.4653306453144710e+00 1 0 1 +429 1 1.8525920421435695e+00 3.5762708549602490e-01 5.0946475568663319e+00 3 0 2 +356 1 3.9097878727975877e+00 6.1716052733039095e-01 5.4734744838905147e+00 -3 1 -1 +459 1 5.0297951477539122e+00 6.4682655744305417e-01 5.6718176557063691e+00 0 1 1 +140 1 6.3845220800541655e+00 6.6200714540119532e-01 5.4418985717149972e+00 2 -1 -2 +121 1 6.3608122327251349e-01 1.6422337064097718e+00 5.7379184381145940e+00 -2 -1 -1 +76 1 2.6863089369401427e+00 9.2826845731889596e-01 5.1620994403726908e+00 -1 -1 -1 +24 1 4.4731219011860990e+00 1.5605471103773427e+00 5.2523372789875760e+00 0 -1 -1 +215 1 5.5638567276602870e+00 1.5540980050800413e+00 5.2788517723209116e+00 2 1 0 +406 1 7.1965017439495353e+00 1.2927814031197866e+00 5.6667263284723859e+00 0 2 -2 +495 1 8.1400977173034548e+00 9.1998286287268760e-01 5.5427200454151757e+00 6 1 0 +256 1 1.5858394354874155e+00 1.8927406862702940e+00 5.2157829401895270e+00 4 0 1 +348 1 2.8144079358075680e+00 2.0457885486401644e+00 5.4765038200952452e+00 1 -1 2 +18 1 3.7959072614405218e+00 2.4151932066273840e+00 5.1090004037855792e+00 0 -2 -3 +259 1 4.8058181463022738e+00 2.5068639859502841e+00 5.5173228168937900e+00 0 0 1 +261 1 5.9067727879570278e+00 2.4818772803689844e+00 5.0470051254431221e+00 0 0 -3 +433 1 6.6238775496086628e+00 2.4655070126810084e+00 5.8390299036823690e+00 -4 1 0 +119 1 7.4961811313748150e+00 2.2560858298720374e+00 5.2761246161627531e+00 0 -2 0 +181 1 8.7803165796510541e-01 2.5368621724963174e+00 5.1009676967579534e+00 3 -4 -2 +392 1 1.3563447389359846e+00 3.2004762283973394e+00 5.8237816659365569e+00 0 1 -1 +436 1 2.3946011665804514e+00 3.0278168308484168e+00 5.6997814720410966e+00 1 1 2 +210 1 5.9632298308600022e+00 3.3253508577291475e+00 5.7908436280268685e+00 0 -1 -2 +409 1 8.2954742717592467e+00 2.8784369153928258e+00 5.3508660402584347e+00 0 0 0 +437 1 7.8285811502936531e-01 3.5972247646914322e+00 5.1173576054548029e+00 -1 2 1 +114 1 3.5350435499222215e+00 3.3621891050940294e+00 5.4926280066777995e+00 0 -1 1 +431 1 7.2810459589983303e+00 4.1806346853520422e+00 5.1699487852752508e+00 0 -1 2 +296 1 2.7493301442805773e-01 9.8739001637521445e-02 6.5256735912844297e+00 2 0 -1 +477 1 2.7650505314326872e+00 5.9323041848923519e-01 6.1880566096904213e+00 -1 0 -2 +199 1 3.8449072993955937e+00 6.8021783868606100e-01 6.5252139926754094e+00 1 0 -1 +31 1 6.8196091485194961e+00 6.5962784856610523e-01 6.6694400071986637e+00 0 -2 -1 +149 1 7.6325509159351759e+00 1.3582393886225264e-01 5.8995743775761014e+00 0 1 -2 +216 1 9.7752025904362638e-01 1.4078822836813889e+00 6.6728311339234487e+00 2 0 1 +425 1 1.7005586383875275e+00 1.1280428057946255e+00 5.8993957526091192e+00 -2 5 2 +224 1 2.8675797989920913e+00 1.6348520503423174e+00 6.4743030869420952e+00 1 0 0 +352 1 3.7461129077349202e+00 1.6467836683144792e+00 5.9711819974315681e+00 0 2 1 +289 1 5.0071286046398447e+00 1.3773263732616476e+00 6.4710057868740503e+00 2 -1 2 +455 1 6.2266605172975309e+00 1.4566180649712972e+00 6.2025029141131824e+00 0 1 2 +298 1 7.2166245583854813e+00 1.5995071342823830e+00 6.6916596114412981e+00 -2 2 -2 +42 1 8.3616236989495309e+00 1.1193553859054726e+00 6.6834990220304640e+00 1 -1 -1 +80 1 1.7994758316879240e+00 2.0602535563487749e+00 6.2756102858385763e+00 1 -1 -2 +127 1 4.3098326176630284e+00 2.3959981453352577e+00 6.4129162374884245e+00 -3 2 -4 +232 1 5.4258898148163945e+00 2.3715461809208245e+00 6.2879862147301759e+00 1 1 -4 +368 1 8.2199446060636472e+00 2.1052670796140989e+00 6.3974575157449376e+00 -1 -1 -2 +486 1 6.9787179588597281e-01 2.5321347977480562e+00 6.5634477651369929e+00 1 -2 1 +209 1 1.7697882729109665e-01 3.3153947644324067e+00 6.2408024968147000e+00 -1 0 -2 +152 1 3.1591516689848946e+00 2.6297173021869003e+00 6.2970081587154914e+00 -1 3 2 +353 1 3.7775468094107074e+00 3.3545010039524996e+00 6.5652719772105916e+00 0 -2 1 +361 1 7.1568303860427589e+00 3.3402954049017803e+00 6.0487812936573579e+00 1 1 0 +391 1 1.8477885811255761e+00 3.9829271272845177e+00 6.5960694610186286e+00 2 0 -1 +464 1 2.8125899145281190e+00 3.9218837233739201e+00 6.1411786897515759e+00 -2 2 1 +497 1 4.5524588331963729e+00 3.4967999912980696e+00 5.9321819433594642e+00 1 -2 2 +498 1 2.0830532473234906e+00 1.1220036849985102e-01 7.1674325217309276e+00 3 3 -1 +264 1 3.1008573853993013e+00 7.6076625369238260e-01 7.2316131354301971e+00 1 1 2 +265 1 4.6342157774659736e+00 7.4471207241976944e-01 7.1556952519725225e+00 0 -1 1 +350 1 5.7838647346068255e+00 5.9645078928256690e-01 6.9763870948006925e+00 2 -2 0 +144 1 1.9122165150526358e+00 1.1329756208528616e+00 6.9185463020768152e+00 0 1 1 +17 1 3.7256587791934250e+00 1.6333740129131904e+00 7.1341698423474043e+00 0 0 0 +441 1 3.6115685474483350e-01 1.9101453221098965e+00 7.5303824824165133e+00 0 1 2 +266 1 1.4762191689510862e+00 2.4662450761248356e+00 7.5398542897976331e+00 -3 -2 -2 +375 1 2.3309589830172550e+00 2.0436669163885055e+00 7.1892097709618481e+00 0 1 0 +351 1 4.7143585284219309e+00 1.8434829864646978e+00 7.2780594229535307e+00 1 0 1 +254 1 5.9170265466448875e+00 1.9140788620193201e+00 7.1554204752492074e+00 0 1 0 +29 1 1.5191420610560982e-01 2.9876711650320327e+00 7.5404622831951533e+00 1 -2 0 +198 1 1.9302038195524280e+00 2.9894398797282253e+00 6.7310853131736357e+00 2 -1 -2 +197 1 3.3083005500744571e+00 2.6144599213348498e+00 7.4059907643060248e+00 1 0 2 +192 1 4.3810729888763209e+00 2.8557380429470860e+00 7.4007735378272006e+00 1 0 1 +220 1 5.1223945377780948e+00 3.3376038243952149e+00 6.7920010375935584e+00 0 0 1 +432 1 6.2458841824934863e+00 2.9482647398415351e+00 6.8353911959966540e+00 0 2 -1 +20 1 7.5153792083913968e+00 2.5459516140888447e+00 6.9548679851000408e+00 3 -1 -2 +63 1 1.0659006163620912e+00 3.4796280956085210e+00 7.1592343773906313e+00 0 1 -2 +446 1 7.1139268453604680e+00 4.0629892995134789e+00 7.0800362551664415e+00 1 -3 -2 +172 1 8.3244437231535144e+00 4.0795393733923691e+00 7.1857426258997332e+00 2 0 -1 +405 1 2.0158180111850474e-01 7.3000938410316307e-01 7.6191994505829879e+00 0 -3 0 +323 1 1.4017230037752237e+00 4.6050949606146502e-01 7.9006469000953414e+00 2 1 -1 +428 1 2.4287753885012338e+00 4.6438480937363963e-01 8.3560508824421493e+00 3 0 2 +280 1 3.6502596381287908e+00 7.8205464112991063e-01 8.2256571665042131e+00 3 1 -1 +54 1 5.2270258856938900e+00 5.3851997974995880e-01 8.1047016704593808e+00 -1 0 -5 +397 1 7.4044521194737944e+00 1.4880482327788007e-02 8.2278445496777337e+00 1 0 2 +279 1 1.2356833818326960e+00 1.5625251472088779e+00 7.9109615213928013e+00 0 4 -2 +134 1 2.5628613498785486e+00 1.5781156241932268e+00 7.9994516338459301e+00 0 1 -1 +236 1 4.5573192582583912e+00 1.4401963680745278e+00 8.1580516205465621e+00 0 3 -3 +493 1 6.1321864263285528e+00 9.9745261592364498e-01 7.9044637123188437e+00 0 3 -3 +346 1 7.4631508711766701e+00 8.7980227698742530e-01 7.6161632460447608e+00 2 -1 -1 +295 1 3.6674081936683844e+00 2.3602153939048316e+00 8.3119852957626765e+00 0 1 -2 +164 1 5.5460188609614756e+00 1.8259166833804881e+00 8.1712445391317772e+00 -2 -2 -1 +354 1 6.6872220974400829e+00 2.0300640265600358e+00 7.8561422683464270e+00 1 2 0 +449 1 7.9034553200360103e+00 1.8534144914629234e+00 8.0299472682703943e+00 -1 -3 0 +185 1 9.5448193278219684e-01 3.3578879558028460e+00 8.1917731250955708e+00 1 1 -1 +229 1 2.5099351180061946e+00 3.0097254013180406e+00 7.8296711975898541e+00 -2 2 -1 +135 1 5.5895093348111047e+00 2.7786209311728598e+00 7.5930433616327404e+00 -1 0 -2 +211 1 7.0529928021063730e+00 3.1919477500830000e+00 7.6370125321552074e+00 -2 2 1 +81 1 1.8872269150105381e+00 3.9351057043865243e+00 7.6163648141042426e+00 0 -1 1 +37 1 3.6614705509244851e+00 3.4915765263742262e+00 7.7267865376074960e+00 2 0 1 +355 1 4.5831332879360058e+00 3.8667909487066860e+00 8.3349240075214972e+00 1 -2 0 +141 1 5.4975686789962985e+00 3.7534665361901731e+00 7.8536976598839008e+00 1 3 1 +122 1 7.2999342247943373e+00 3.9738648524411286e+00 8.3865006440763370e+00 0 -1 -2 +327 1 3.2503689184711210e-01 4.6592524224991747e+00 8.2659471361477532e-01 0 -2 2 +386 1 1.1858359917362140e+00 4.2742921253409367e+00 2.8183822072239956e-01 -1 -2 5 +59 1 1.8702404230468521e+00 4.9717730076471947e+00 7.6874981917086671e-01 0 2 -3 +57 1 2.8167286953460633e+00 4.2569068178507328e+00 1.1953882254793591e-01 1 -1 1 +489 1 3.6302378764516323e+00 4.4521177967574310e+00 6.6729235313037527e-01 1 1 5 +326 1 4.9856357064009993e+00 4.5330987087989216e+00 5.2454407858907726e-01 -1 2 2 +359 1 5.9913033298564331e+00 4.3362327743167306e+00 3.7835915829420080e-01 2 -1 -1 +349 1 7.2426723526689933e+00 4.7181533524380885e+00 7.2707643667494415e-01 0 1 -2 +247 1 8.6433343008963215e-01 5.6823007167579762e+00 6.5224250416194052e-01 1 -3 2 +365 1 3.8233209759419231e+00 5.6939269324333672e+00 5.9607489711922135e-01 -1 -1 0 +382 1 5.1137068164970731e+00 5.5805604939667059e+00 1.8276059551769425e-01 -1 -2 1 +130 1 8.2482820181805554e+00 5.5968590423898927e+00 4.4653409437071251e-01 -1 -1 2 +471 1 1.7119665678072469e+00 5.8953695416344436e+00 4.5930053740843135e-02 -2 0 1 +21 1 2.5641267140454049e+00 6.3080369711057624e+00 5.3936073769936865e-01 1 -2 0 +499 1 4.7164689695839286e+00 6.6465500795405017e+00 1.6611623106065540e-01 -1 -1 1 +253 1 5.9043290983731245e+00 6.1331552003521068e+00 7.5404520106110218e-01 3 -1 0 +302 1 6.9564884663410282e+00 6.1640675729464434e+00 5.7033134187391044e-01 0 -1 -1 +324 1 8.1992983060509594e+00 6.5972265856779417e+00 7.7494747996129210e-01 1 -3 2 +154 1 1.8996589089571863e+00 7.1193783454022102e+00 5.1404963792269565e-01 -3 -1 -1 +284 1 3.0007790559640597e+00 7.2198187648711993e+00 2.3642486802169203e-02 0 0 0 +161 1 3.8133207311484072e+00 7.3201299304675667e+00 5.0202507839899535e-01 -2 -4 -2 +112 1 5.6724794675417822e+00 7.1979165692397187e+00 7.3233205047939343e-01 -1 -3 -2 +39 1 6.4178033104766934e+00 6.8891409921259603e+00 1.5315709015991064e-01 0 0 2 +269 1 7.4906317471214443e+00 6.7375050108085421e+00 4.8287801879068511e-02 3 1 0 +470 1 2.2822847309207428e-01 7.8917014242385868e+00 7.7675485207454809e-01 0 0 1 +84 1 1.3672512040847244e+00 7.9379711016796204e+00 1.6230344562139010e-02 1 0 -3 +381 1 2.6740213254054948e+00 8.0161072175846630e+00 5.8246256296805565e-01 -1 -1 1 +416 1 3.6213693754100857e+00 8.3576521057616233e+00 6.2331560400527297e-01 2 2 -1 +182 1 5.1660049409085866e+00 8.0423641799361949e+00 3.0675573970032322e-01 -2 0 -1 +347 1 6.5429973279348026e+00 7.8912499362162034e+00 4.9818784876300565e-01 -1 1 -2 +380 1 7.4990421428201417e+00 7.6756533739549013e+00 7.5184655726615468e-01 -3 0 0 +19 1 1.4643514526638863e+00 4.2228380130315317e+00 1.3843336624933156e+00 0 3 -1 +430 1 4.3057981012626918e+00 5.0291601875436083e+00 1.2152759600723888e+00 1 1 -2 +212 1 5.0477378389079224e+00 4.2727344176247888e+00 1.5457805058503180e+00 -2 -1 2 +479 1 7.9063585867776194e+00 4.9679041912501303e+00 1.6188677256489217e+00 1 3 -1 +217 1 2.5218672599222897e-01 5.8414577361250837e+00 1.5087288813722908e+00 2 1 2 +147 1 1.1545026869668784e+00 5.3345315151941692e+00 1.5114087897016817e+00 1 2 -1 +13 1 2.8751716646412713e+00 5.2058560720828826e+00 1.0454367061984737e+00 -2 1 -1 +170 1 5.1473087472466297e+00 5.7979187654554183e+00 1.4646868436401976e+00 1 2 0 +204 1 6.2817592200581442e+00 5.1972845711964553e+00 8.9956483663207842e-01 -1 -1 -1 +306 1 8.3865328816009488e-01 6.6369969836196416e+00 9.5403861420405511e-01 1 -1 3 +414 1 1.6815920771923107e+00 6.1626367729687450e+00 1.1744973520180511e+00 0 2 0 +79 1 3.3223472300560521e+00 6.2059256452802716e+00 1.3962300133956274e+00 0 0 0 +116 1 7.6213827835593815e+00 5.9109006810695996e+00 1.2032264335528675e+00 -2 -1 3 +231 1 2.7502476364406934e+00 7.3933926752228123e+00 1.4247539952768773e+00 3 -1 1 +171 1 4.7071880050572981e+00 6.8064285791523735e+00 1.2807974821888473e+00 0 -2 1 +273 1 7.0329000376929018e+00 6.8584131720717227e+00 1.6693583798609657e+00 -2 1 -1 +260 1 8.0496857982994889e+00 7.4547112671714686e+00 1.6374112984134654e+00 3 -1 -2 +43 1 1.0723712760276345e+00 8.0330657119523838e+00 1.4245919245059160e+00 -2 1 0 +208 1 4.3910624755767662e+00 7.9590156044378260e+00 1.1638330407357564e+00 -2 -2 -1 +226 1 5.5077902922207063e+00 8.0548948337249193e+00 1.2764179622713128e+00 0 0 2 +370 1 6.4142184578798505e+00 7.6748965104033502e+00 1.5118878610721513e+00 1 1 1 +85 1 4.9493682223295465e-01 4.4925581352788218e+00 1.7962077237252332e+00 2 0 0 +213 1 2.1575495906041722e+00 4.9142597626853277e+00 1.8811900528366003e+00 0 3 0 +299 1 3.3659976969419567e+00 4.3662606017243588e+00 1.7255850309353928e+00 3 -1 -2 +249 1 4.7082373488231886e+00 4.9470082900514569e+00 2.3877787475724284e+00 0 0 1 +258 1 5.7775488222451887e+00 4.8696821219175135e+00 2.2927307255193869e+00 -1 0 -1 +388 1 6.8398302583746604e+00 4.7642336931962808e+00 1.8670074890749995e+00 1 -4 -3 +91 1 7.7108281252011066e+00 4.3462922152329373e+00 2.4115614404022634e+00 2 -2 1 +415 1 1.3354264256961873e-01 5.2683808667768846e+00 2.4940378524658144e+00 0 3 0 +27 1 2.0564207334277329e+00 5.6999752852325889e+00 2.4901436865643838e+00 0 -2 -1 +465 1 3.6077777180133985e+00 5.3106225786683270e+00 2.2984375934854913e+00 1 4 2 +72 1 1.2115862831734683e+00 6.3271145377400213e+00 2.3088380865765914e+00 -1 -2 -1 +58 1 2.4730215910430200e+00 6.4108021967014599e+00 1.8872921058165837e+00 2 -2 2 +88 1 4.2468496124355051e+00 6.0000736368680991e+00 1.9689248186008255e+00 1 0 -1 +6 1 5.2824888171486872e+00 6.1177755165021708e+00 2.4648490036232666e+00 0 -3 1 +75 1 6.5540148621238368e+00 5.8837981825070473e+00 1.8049347572360399e+00 -3 0 4 +22 1 7.8390642986715990e+00 6.6390504342942007e+00 2.2941937725662940e+00 0 1 0 +128 1 5.0900588055916374e-01 6.9175984002222233e+00 1.8531623061329514e+00 -1 0 1 +193 1 1.7616411201473283e+00 7.3777929885216569e+00 1.8819221158557660e+00 -2 0 0 +389 1 3.8054852300865960e+00 7.1908689074118346e+00 1.6897648139570383e+00 1 -1 -1 +241 1 3.3304867419800805e+00 6.7201719117843943e+00 2.3881392654044515e+00 0 1 0 +14 1 5.6091745306383807e+00 6.8869789388403264e+00 1.7385824045568810e+00 0 -1 0 +307 1 2.6028552221612093e+00 7.5983757451277896e+00 2.5134014261731092e+00 -1 1 0 +401 1 3.3924470446908370e+00 8.2185878004411617e+00 1.7224400376656741e+00 -3 -2 2 +248 1 4.8372436612670020e+00 7.6440956091999794e+00 2.0947200376368853e+00 2 -3 0 +335 1 7.0823280457514208e+00 7.5905134700352388e+00 2.4694687185743178e+00 -1 0 0 +281 1 7.4000691269637358e+00 8.3890728034516613e+00 1.8965880690997261e+00 -1 -1 0 +33 1 2.6215904333511340e+00 4.6944190932346643e+00 2.8031190571610427e+00 1 1 1 +221 1 3.7745777664099962e+00 4.5666560881588492e+00 3.0592511133135365e+00 0 -1 1 +251 1 6.7715334943605834e+00 4.6401458096684580e+00 2.8510683358464712e+00 1 -2 -2 +138 1 1.1922779528936784e+00 5.1973855619084013e+00 2.5689556972218521e+00 0 1 0 +73 1 4.3331751132449305e+00 5.7904710852531096e+00 2.9618985356431899e+00 0 -2 2 +237 1 6.2300560736724488e+00 5.7475979505901522e+00 2.7248929404434143e+00 3 0 0 +77 1 7.3913602469000059e+00 5.6780386160747609e+00 2.6234944353061729e+00 -1 -1 3 +339 1 2.9546703425028309e-01 6.2132195219954411e+00 2.7867557714215443e+00 0 0 2 +69 1 1.3562182919504069e+00 6.0134582221288868e+00 3.2785943115156346e+00 0 -2 1 +150 1 2.9668876558472732e+00 5.9472670316673391e+00 2.8936146954206632e+00 3 -2 -1 +219 1 1.1608118939764323e+00 7.3228681938207032e+00 2.7126116817865631e+00 0 -3 -1 +9 1 2.0627854045350777e+00 6.7454186793237145e+00 2.9360002216641958e+00 0 -2 -2 +3 1 2.9445094497077151e+00 7.1384526732484925e+00 3.3587771406211751e+00 2 -1 -2 +93 1 3.8294061315771235e+00 7.5378392781893275e+00 2.8380550678413003e+00 -1 2 0 +68 1 4.5306997862577427e+00 6.7390306077267583e+00 2.7235217150491495e+00 1 1 3 +35 1 5.4701910601523354e+00 6.9880160912814793e+00 3.3190052755169512e+00 0 0 -2 +174 1 6.2873908725084267e+00 6.7805871501360224e+00 2.7219816088319484e+00 -1 0 2 +369 1 1.7965435829527715e-01 8.0388194202620209e+00 2.5940286664394834e+00 -3 -2 1 +469 1 4.9516921171039039e+00 7.8826764349301754e+00 3.0530014528334970e+00 0 -2 -1 +270 1 5.8608285132223106e+00 7.6946678024150144e+00 2.6778659829007898e+00 0 -1 -2 +196 1 7.6768577919393455e-01 4.8792664640921366e+00 3.5903070116215088e+00 3 -1 1 +235 1 4.2285310787746502e+00 4.2638690385284841e+00 4.1560966227762339e+00 1 1 1 +104 1 4.9767847616154004e+00 4.2048445393860883e+00 3.3962447019771562e+00 -1 -2 4 +363 1 5.8883238331527643e+00 4.9482373301020921e+00 3.4294316309792547e+00 0 0 3 +440 1 8.3695482926311691e+00 4.2129368246316421e+00 3.4018022112738615e+00 -1 2 1 +271 1 1.8521235523587734e+00 5.0753345126075313e+00 3.3807703470063983e+00 0 2 1 +385 1 3.2904276665596646e+00 5.1796485809465160e+00 3.7980367644038786e+00 -3 -1 0 +367 1 4.4116421156217953e+00 5.2602223360914149e+00 3.9453911592241386e+00 1 1 0 +8 1 5.3112651984610038e+00 5.7540585999932050e+00 3.4831459566385630e+00 3 1 0 +445 1 6.8973470747727381e+00 5.7304789961834581e+00 3.7043310817118127e+00 -2 -1 2 +95 1 8.3390772303693836e+00 5.5440620917552232e+00 3.7707087770664116e+00 -2 1 -3 +227 1 2.6907357337748437e+00 5.9773212885609901e+00 3.9377639031978284e+00 -1 -2 0 +45 1 3.9484717591019058e+00 6.4426795460159951e+00 3.6915638730283460e+00 0 1 -1 +62 1 6.2921228111843934e+00 6.5338531152740655e+00 3.8634903896998787e+00 1 0 -3 +309 1 7.4708902093515182e+00 6.5908652825436720e+00 3.6007172393059794e+00 0 -2 0 +70 1 1.1631280783050528e-01 7.0230287218135894e+00 3.4578008409773004e+00 -1 -2 2 +285 1 1.4425208756199777e+00 7.4192404188139784e+00 3.7903676842933867e+00 0 1 -1 +387 1 2.1212416378368082e+00 6.7926691438538640e+00 4.1965603113934069e+00 1 -2 -1 +484 1 4.6356188966878253e+00 7.3783035166039177e+00 4.0565969174155132e+00 0 -1 -1 +98 1 6.8865210518165370e+00 7.3140090488700187e+00 4.1918733358514384e+00 0 -2 -2 +282 1 6.6401301602074470e-01 7.9757076330778913e+00 3.4568068256572881e+00 0 0 2 +203 1 2.5721741898113022e+00 7.9369081377447577e+00 4.0156309667060688e+00 0 3 0 +189 1 3.6912207664687133e+00 7.6806375475121094e+00 3.9059717431750585e+00 0 -1 0 +267 1 6.5713653654298607e+00 7.8128923355065503e+00 3.4078724648171090e+00 -3 -3 2 +155 1 7.9603563078893247e+00 8.1399268391964696e+00 3.4070072411074963e+00 -2 -3 -1 +313 1 1.7289301235151016e+00 4.3022360027322257e+00 4.5514630316827649e+00 0 1 -2 +250 1 3.3811553057719541e+00 4.4820133651244189e+00 4.8062617116575304e+00 1 1 1 +49 1 5.2294045670482578e+00 4.6507731504297771e+00 4.3588420415784839e+00 -1 2 -1 +111 1 6.9650608689197728e+00 4.6666276346705935e+00 4.3879356756979719e+00 1 1 -1 +124 1 8.0933085752880096e+00 4.6382186065764790e+00 4.3125441053619298e+00 1 1 -1 +488 1 5.0933114935797996e-01 5.1359886989747769e+00 4.5948583401263194e+00 -3 1 -2 +48 1 1.5851307073885004e+00 5.5767207395220701e+00 4.2311661806996650e+00 2 -2 1 +123 1 2.5153837170534041e+00 5.0458650845269890e+00 4.5131929409242613e+00 -1 -1 -1 +423 1 5.8208012531410862e+00 5.4948336589690365e+00 4.5916227902397422e+00 2 1 2 +329 1 7.4993364070942770e+00 5.4866100873090584e+00 4.5194723854672301e+00 -2 -2 -2 +334 1 7.1205767430238509e-01 6.1834005542640256e+00 4.2284519502384050e+00 0 1 -1 +146 1 1.3925739327604780e+00 6.6428737862846399e+00 4.8806888882719424e+00 0 1 -2 +500 1 2.2236367185474757e+00 6.0145074663436873e+00 4.9428276989368829e+00 0 1 1 +46 1 3.3290620592760245e+00 5.9295614805296450e+00 4.9789176350871935e+00 1 -1 -3 +374 1 4.7036984817853460e+00 6.2326093994181564e+00 4.3534332596232463e+00 -2 3 2 +52 1 6.8604388860085521e+00 6.3207993870641257e+00 4.9959828655023273e+00 0 -1 -1 +466 1 8.0663702260053096e+00 6.4797694103942982e+00 4.3885769098322607e+00 0 -1 -1 +272 1 6.3857634591010626e-01 7.4306626388140797e+00 4.4685908728843007e+00 -1 0 -1 +331 1 3.1923815943971330e+00 6.8406621847783482e+00 4.3673687027144910e+00 -1 -2 0 +12 1 5.5841339297795631e+00 7.2882403606371549e+00 4.4466343965097535e+00 4 3 0 +178 1 7.5912726284672463e+00 7.0457277620611389e+00 5.0302483408547527e+00 1 -2 0 +376 1 3.5187241629329796e-01 8.3977706803073371e+00 4.6278412560289910e+00 1 -5 2 +117 1 1.3379826357324891e+00 8.3239351364630743e+00 4.2945291322530599e+00 3 0 1 +419 1 1.8896223988418746e+00 7.6393579746671740e+00 4.8168734901107717e+00 0 1 2 +379 1 3.9801436864751545e+00 7.7556819889833708e+00 4.9922836416209275e+00 -1 -2 0 +53 1 4.7488025467298804e+00 8.2113497019933241e+00 4.7088252949914393e+00 -3 0 -1 +28 1 6.4645893658779787e+00 8.2802587137451660e+00 4.5908064174413035e+00 -1 0 -2 +300 1 8.0497419370896441e+00 7.6196002867575432e+00 4.2909429383935933e+00 0 3 0 +83 1 1.5533997706565803e+00 4.2394383012204173e+00 5.5726999917011435e+00 0 0 -1 +304 1 2.5788446900543724e+00 5.0166498820006939e+00 5.6119573167673691e+00 0 -1 0 +51 1 4.2443804124641717e+00 4.2352637746580450e+00 5.1927633388220640e+00 -2 -3 1 +180 1 8.3861058182094546e+00 4.2682396578102644e+00 5.2739914655295381e+00 2 -2 0 +60 1 1.6015559581031933e+00 5.1463292330916399e+00 5.1677022459932900e+00 3 -3 0 +255 1 3.9377408204864559e+00 5.5446289337866919e+00 5.6880007643189954e+00 -1 1 -1 +336 1 4.8593163697287496e+00 5.2245778091909907e+00 5.0488368666183758e+00 0 -1 0 +74 1 5.8562368106306470e+00 5.1343487602136690e+00 5.4844996621256241e+00 -1 -1 -1 +11 1 6.8757956599703460e+00 5.1962144116573894e+00 5.2833696751528123e+00 1 -1 1 +106 1 7.8813740148695439e+00 5.1326569274050362e+00 5.5073989898629776e+00 -2 0 1 +342 1 6.9861903942379322e-01 6.2397324279420259e+00 5.5554818983126264e+00 1 2 1 +366 1 1.5648860489287066e+00 5.8898927909510999e+00 5.8373116466465662e+00 -2 1 1 +153 1 2.7314006683241487e+00 6.0747252624615822e+00 5.8658792109688322e+00 2 0 0 +384 1 3.7649825100367740e+00 6.6140228235604797e+00 5.7068894568556274e+00 3 0 -1 +444 1 5.5919895424131791e+00 6.4007885907393334e+00 5.0609268438363237e+00 0 0 1 +169 1 8.1101285040334883e+00 6.0263607659074259e+00 5.3262646023669920e+00 2 -3 2 +312 1 1.5049751572049341e-01 7.0899457593186419e+00 5.3993285616214672e+00 -4 -1 2 +131 1 2.1405833530478784e+00 6.8932472731161107e+00 5.7016479425245992e+00 -1 -2 -5 +290 1 2.9965099079972810e+00 7.1703954961127128e+00 5.3705836189910157e+00 3 2 0 +240 1 4.7341951239220323e+00 7.1100411829110195e+00 5.1242936547927025e+00 -1 -4 5 +403 1 1.1346681749692125e+00 7.6627110490212882e+00 5.5800616996766177e+00 -3 2 3 +438 1 2.6845809734218404e+00 8.2016169024289791e+00 5.0687325841194584e+00 0 1 1 +420 1 4.5890023008209200e+00 8.1137042645946345e+00 5.6817522441295134e+00 -1 -3 -3 +175 1 5.5503185230040479e+00 7.9962207684468503e+00 5.3390442156703726e+00 -1 -2 1 +305 1 6.7862386693055941e+00 7.6108734242812508e+00 5.4748415197806564e+00 -1 0 0 +341 1 7.4912815420537060e-01 4.3291768420078673e+00 6.1635194432999105e+00 -3 0 0 +291 1 3.3895079643780628e+00 4.7034241504608403e+00 6.1615817441829774e+00 -1 0 1 +372 1 4.6184126650372983e+00 4.6292373343220516e+00 6.3125880555070495e+00 1 -1 -2 +293 1 5.5228203863122962e+00 4.2760181362826257e+00 5.8887719440294752e+00 2 2 2 +461 1 6.6292898049431850e+00 4.3535966489510214e+00 5.9130834363303126e+00 0 -1 -1 +263 1 7.7259268091094802e+00 4.4631499768470926e+00 6.3337285974251110e+00 -3 0 0 +473 1 5.8703225638324330e-01 5.3945075957215893e+00 6.1889975824903258e+00 1 -2 0 +166 1 1.6857123760309740e+00 5.0889285259544463e+00 6.6009674185523135e+00 2 2 2 +132 1 6.2122393744706681e+00 5.4126385838431412e+00 6.6911128610756689e+00 -1 2 1 +32 1 7.1447545314606753e+00 5.2817185569927805e+00 6.2574893275776935e+00 -1 1 0 +475 1 3.1727782520787395e-01 6.3991068893590928e+00 6.5410008153956287e+00 -1 2 0 +283 1 3.2886765713157047e+00 6.4577609617474216e+00 6.6450211825759427e+00 -2 5 -3 +205 1 4.9096514414971573e+00 6.2573093659948649e+00 5.9509143564095108e+00 1 1 0 +158 1 6.0709604726562620e+00 6.0618280221451721e+00 5.9241072976562341e+00 2 -3 1 +1 1 6.8533858129590133e+00 6.5562074315723597e+00 6.5648993855676077e+00 -2 -1 -2 +485 1 3.8125590702509465e-01 7.4616693598979804e+00 6.3609885403345947e+00 0 0 1 +378 1 1.3081995382782592e+00 6.9194359283210023e+00 6.2966360730695206e+00 -1 1 2 +71 1 4.2456384497919455e+00 6.8188407430282236e+00 6.6601493363974615e+00 -1 -4 -4 +320 1 5.9836892193800049e+00 7.1597807912498039e+00 5.9293654675383980e+00 -1 -1 -4 +481 1 7.6691355446374123e+00 7.2329848679784536e+00 6.1548343866270958e+00 2 0 -4 +318 1 1.3774303149915195e+00 8.3818831122591373e+00 6.3319633954681702e+00 -1 3 3 +496 1 2.5904412000483283e+00 7.6460489519926949e+00 6.2257027413180230e+00 0 1 0 +319 1 3.7413059213345305e+00 7.5724262762451815e+00 6.0123092822785358e+00 -2 0 0 +338 1 5.3628717868866635e+00 8.0629328638364353e+00 6.4489666989888104e+00 0 0 2 +358 1 6.2532288322758314e+00 8.3160028104100370e+00 6.1106737733333700e+00 1 1 3 +225 1 7.1188694406828850e+00 8.0966599202958953e+00 6.7037213079900431e+00 0 0 1 +55 1 1.0372861368831470e+00 4.4696141893250934e+00 7.4049774120079697e+00 -1 2 -1 +362 1 2.7501402171762614e+00 4.4083355662417896e+00 7.3996418874276850e+00 1 -1 0 +36 1 3.7396318187704796e+00 4.4801126663955504e+00 7.1074085083223073e+00 2 0 -2 +133 1 4.7860445539287522e+00 4.2902205437459102e+00 7.3711360387569274e+00 -1 -3 -2 +412 1 5.8687821857033606e+00 4.2035753083199188e+00 6.8227572622514323e+00 -4 3 0 +89 1 9.1212528791654535e-02 5.3554487915969240e+00 7.1088625783964092e+00 0 -2 0 +38 1 1.2571311964388701e+00 5.7525434192639207e+00 7.3210178579367868e+00 -1 -5 -2 +337 1 2.7511266822038212e+00 5.4161467707559394e+00 6.9980055112843935e+00 1 -2 -1 +233 1 3.8756258886529467e+00 5.7508116329978627e+00 7.0533607828281815e+00 0 0 -1 +442 1 4.9084237493694953e+00 5.5326539633780083e+00 6.7666717819135362e+00 -4 -4 1 +143 1 5.5776680237268401e+00 5.1621486864820874e+00 7.4635021710959082e+00 1 2 -2 +194 1 7.1453664245542576e+00 5.0984438205910134e+00 7.3333812213368574e+00 0 2 0 +308 1 7.5489760640996861e+00 5.8433222820659871e+00 6.9295207313931844e+00 0 0 0 +286 1 2.1326326019163346e+00 6.2556170719743678e+00 6.7379074391662934e+00 2 0 -2 +61 1 5.6654689088882648e+00 6.2935208603774795e+00 6.9534505775907345e+00 -2 1 -1 +426 1 7.2244687144599562e-01 7.0806885112202815e+00 7.2261712082790313e+00 -1 1 -2 +450 1 1.7213783340257280e+00 7.5184636193370302e+00 6.9767252413839369e+00 4 1 1 +188 1 2.8213470931093725e+00 7.2342621084044723e+00 7.1806231926796817e+00 0 -2 -1 +94 1 3.8026924767351562e+00 7.3932541518378949e+00 7.4596688811177305e+00 -1 2 -2 +252 1 5.1481924139065534e+00 7.2239227196376481e+00 7.0808756518162852e+00 -2 1 -1 +321 1 6.2155610611385042e+00 7.5199920009866501e+00 7.0964075868161212e+00 1 -1 -3 +156 1 7.9944514874782193e+00 7.0252703915440122e+00 7.2541499279788821e+00 -2 1 0 +167 1 5.6917482122629082e-01 8.1417190335213725e+00 7.4962901784513347e+00 2 -2 -1 +330 1 3.3138446283251373e+00 8.2146300363312132e+00 6.8886408760800295e+00 1 -2 0 +195 1 4.3712446295554876e+00 7.8995454090647614e+00 6.7366600234979277e+00 -3 -1 -1 +78 1 5.1856313345157918e+00 8.2127013524100576e+00 7.4620544007464273e+00 0 -1 1 +157 1 7.9011697675935482e+00 8.1764884669087454e+00 7.4266272279794077e+00 -1 0 -1 +373 1 6.7132530681439118e-01 5.0292807223694753e+00 8.1874843860841438e+00 1 2 -2 +56 1 1.7078519119356448e+00 4.9344764637762015e+00 8.1280520422148399e+00 0 2 0 +315 1 3.6234275175752244e+00 4.9451657793378052e+00 8.0476764469560074e+00 -1 -2 0 +478 1 6.4485922344872577e+00 4.3096951707056732e+00 7.7984645181472576e+00 -3 -1 1 +109 1 8.0579925616842267e+00 4.7034410927383776e+00 8.0870676538969590e+00 -1 -2 0 +357 1 2.6884169416542560e+00 5.4427652520296803e+00 8.2033924998655703e+00 0 3 1 +454 1 4.5709826050185614e+00 5.3780110248528246e+00 7.7764192595368709e+00 1 -1 2 +86 1 6.2280039286639228e+00 5.4780735688869227e+00 8.2809905303020894e+00 -1 1 0 +262 1 7.2349855745224341e+00 5.4460551342647063e+00 8.3066978094955939e+00 0 -2 2 +160 1 6.0572932237795518e-01 6.1031638741150802e+00 8.0606222325454144e+00 2 -1 1 +168 1 2.6926304594044645e+00 6.3106981827881823e+00 7.6217004925278191e+00 -1 -3 0 +145 1 3.6817206885980216e+00 6.4794531849637744e+00 8.1206460236595284e+00 -1 -1 -2 +400 1 4.6165015313151514e+00 6.4768264075412638e+00 7.5742703650137084e+00 1 -2 -2 +395 1 5.5951136272170219e+00 6.3298964082146654e+00 7.9312370644766386e+00 0 0 -1 +297 1 6.6597873155694378e+00 6.3692836044578955e+00 7.6364845321455510e+00 1 -4 0 +207 1 8.0115395128671594e+00 5.9375044868831406e+00 7.8466324008781454e+00 -1 1 3 +460 1 6.6754980612335257e-01 7.0521823363262239e+00 8.3451452216672077e+00 -2 1 -3 +44 1 1.5985553198249884e+00 6.8250382119954756e+00 7.7469635466673052e+00 0 1 0 +377 1 4.7397084186898368e+00 7.4631435688157008e+00 8.0338331164055763e+00 0 -1 0 +411 1 5.8132963527118724e+00 7.4646663474419555e+00 8.0261071780587709e+00 2 -1 1 +396 1 7.0242838781762282e+00 7.3479893628886632e+00 7.6603703429086574e+00 2 3 0 +424 1 8.1516255787718581e+00 7.5530513248894016e+00 8.2349155971796755e+00 -2 0 0 +66 1 2.2362583327280716e+00 7.7449451931440727e+00 7.8847519662235594e+00 -1 -2 0 +371 1 3.1656541571472099e+00 8.2451918974189500e+00 8.0415029551628514e+00 1 -1 1 +186 1 4.1675976318493086e+00 8.3247658596031009e+00 7.8802494669419030e+00 1 -1 -1 +413 1 6.4945159878598346e+00 8.3677431053238660e+00 7.6981134933049891e+00 -2 -1 -2 + +Velocities + +7 -1.5197672199477208e+00 -7.1031250708487148e-01 -4.0950627961412567e-01 +398 9.4644999179644840e-01 -8.0422358764146151e-01 -1.1023964746841350e+00 +173 4.8084218242595870e-03 -1.9383808513915850e+00 9.3439099328992314e-01 +462 -1.6390116924948674e+00 -1.2080683544699562e+00 7.6685759600965364e-01 +383 1.2945118204202577e+00 -1.8370931432093225e+00 1.1758972656982776e-01 +288 1.2113220352829337e+00 4.8786819623543370e-01 7.1439798712590263e-01 +303 3.6232856211831610e-01 -3.7927260062054236e-01 -3.0467891118546553e-01 +491 1.6817821327211264e+00 6.3153250223994289e-02 -5.4827183875981267e-01 +187 5.6164532616475686e-02 1.3250338697636479e+00 1.6291294556417517e+00 +163 1.3950518510134631e+00 -1.7090097072259662e+00 -6.0029200570353536e-01 +345 -8.4635427449528189e-01 1.3013642733988193e-01 -3.7582537476409439e-01 +447 -5.5306523194731427e-01 -1.4583063079290524e+00 4.8086237208854654e-01 +108 -3.1879632824306825e-01 -4.9387838912491844e-01 -3.1046215530949173e-01 +427 2.4456665882970424e-01 1.3737057789182878e+00 -1.7474218101951866e-01 +96 -2.8217287015277487e-01 3.9138367367476778e-01 -4.6114700958040086e-02 +494 3.0303709765292064e-01 -9.2861341821366045e-02 -3.6692009603190118e-01 +360 -4.2709052063514102e-01 -1.5167804301477015e+00 -2.6902074926466563e-01 +179 -1.2403873183879999e+00 1.1368400311662936e+00 5.6653449328883521e-01 +136 -1.5859168963178476e+00 1.0728794555657983e+00 5.0876417522892092e-01 +311 -1.4232560247874224e-01 -8.2802934475265932e-01 1.0289469027582252e+00 +242 -1.3753994053365912e+00 3.0823812109914095e-01 1.2519475129774249e-01 +451 1.0684545083916284e-01 -1.3647250068831975e+00 1.2292458701523420e-01 +118 6.5344809858683794e-01 -6.0529931820910909e-01 -6.6821572295625731e-01 +200 -9.1497459004230530e-01 -7.2783581485393822e-01 -8.5265666689286446e-01 +23 1.0121027757280427e+00 -5.8690115135784995e-02 -1.4283745590726701e-01 +30 -1.2406061152582815e+00 3.7490020292637088e-01 -1.4457935973251330e+00 +26 -9.9581994312158117e-01 -1.2441026541932486e-01 -3.6541440712112250e-01 +452 -9.8588039362152369e-01 1.0706468502992672e+00 1.6282162085617651e+00 +439 -1.2386761163593085e+00 4.3106305328993799e-01 5.0410115305724934e-01 +492 2.7094066326642935e-01 6.6318883302565457e-01 1.5999014287193769e-01 +287 -1.7254693201510321e-01 1.1189096817152451e-01 4.1489954379924110e-01 +87 -1.1416496451717975e+00 -7.8732701356097490e-01 -5.1553483379997289e-01 +191 1.2771897324335735e+00 -1.7496443253093807e+00 5.0507874089360993e-01 +316 9.1440987552186193e-01 5.4700363415289210e-01 9.8622452705158947e-01 +176 1.8575029150961730e+00 4.1139607157872565e-01 -7.4590595351664335e-01 +244 -4.6943526746297531e-01 -4.0598167955478592e-01 1.2148844546685273e+00 +463 -6.0334643189530614e-02 9.0710610807033173e-02 -1.1159129056326442e+00 +101 -4.6185710842519001e-01 -1.0745733134156132e+00 -8.4095960640252343e-01 +456 7.3559492687866046e-01 8.4585098605759870e-02 9.9419285892741016e-02 +90 -6.9201778873218364e-02 4.2798282427303436e-01 4.4566581747153294e-01 +457 -2.4132420839469965e-01 8.4836564798364844e-01 1.0955942184355154e+00 +344 6.5538410556645377e-01 1.0527852545027427e+00 6.8154568558028386e-02 +399 -8.3144103937947644e-01 1.9062875610231711e-01 -5.6419101062513155e-01 +472 7.2667243545881360e-02 4.9535613585667015e-01 8.3691870718219108e-01 +364 -2.9526170592863293e-01 -8.7862728527604539e-01 8.2689159018968139e-01 +333 1.7241045239522232e-01 1.0435495829586168e-01 -4.6109306717747689e-01 +223 3.7919285550573256e-01 -1.0672385659469772e+00 3.6984147519214111e-01 +277 -8.8028901289995187e-01 5.8075379122029680e-01 -5.0555689035944396e-01 +487 1.5229361655153211e+00 -4.3334638823410909e-01 -5.2025315373818937e-01 +202 1.1890248672755632e+00 -1.3103428543183313e+00 1.3877359082264291e+00 +139 -3.8593619396281981e-01 -4.1419081865118412e-01 4.8341157555249414e-01 +218 -1.2190042149414249e+00 8.6603581070857749e-01 5.3180226853912571e-01 +10 4.0346230429792890e-01 8.8022045895227152e-01 3.0611723210999553e-01 +64 1.0687583963535543e+00 -2.5590555538042992e-01 8.2852453062456832e-01 +40 -1.0543471069223134e+00 -7.9810717548135568e-01 1.4389073785681245e-01 +328 3.2979243925573831e-02 3.1076559402174242e-01 -1.6410904905031269e+00 +292 -6.3224783054646483e-01 -4.3704038413109603e-01 -2.2759444134328080e+00 +245 -4.7869651996764956e-01 1.4231085014444791e-01 -1.0109564296885869e+00 +148 -7.1011989912373741e-01 -6.8437374624235792e-01 -4.7084060341785217e-01 +435 -2.3710180935788738e-01 7.3150957873543554e-01 1.9569288343148944e-01 +301 -7.3626400316656140e-02 -1.2518892197053937e+00 6.4938262930099341e-02 +476 4.4522311443074564e-01 8.4413304640745324e-01 6.9180275295562699e-01 +310 -4.4579106235383259e-01 -1.4870237388818175e-01 -1.7519046471808755e+00 +137 1.0191269790481958e+00 -1.1871217736355175e+00 6.0687187776921336e-01 +434 -8.0977924479936902e-01 8.2445677967490594e-01 -7.2982619204505017e-01 +184 9.3329968718567657e-01 -7.8960961760367476e-01 -3.2387020805541877e-01 +5 -7.6591643318776403e-01 4.4567507028100856e-01 -5.1504861374485367e-01 +41 -6.0827814801341495e-01 1.0335818250945215e+00 -1.4262577781586459e+00 +410 5.1617643329833041e-01 -1.2505433325731774e-01 6.5548767709779598e-01 +418 7.4452116863445517e-01 5.5176595694257291e-01 4.8433486134467341e-01 +34 -1.0960797951083094e+00 -9.5559899011366922e-01 4.1467430632337771e-01 +67 -1.4762168791195980e+00 7.3902009632630203e-02 -9.8563314451155759e-01 +390 1.1040922756330935e+00 -1.0608530270906485e-01 -8.5480860400114822e-01 +125 1.1001683944330445e+00 2.5213959563273414e-01 -7.0907876564322847e-01 +105 9.3642884637919491e-02 3.2241122070134182e-01 3.4267503174724429e-01 +274 1.4805711826308454e+00 1.9591264275732104e-01 4.6208005550476272e-01 +314 3.3724005635036658e-01 -4.9228354871213487e-01 -5.9105855919176131e-01 +408 4.1789097671328662e-01 2.2054753884758851e-01 9.9409268338014201e-01 +142 1.3529751978153088e+00 8.8819247946851643e-01 -2.9699787225611667e-02 +25 -3.6747378202427655e-01 -1.6653943785151797e+00 2.1594786196965424e-01 +458 -7.3004682150577682e-01 -2.5761460079892318e-01 -7.5492049253862104e-01 +165 -2.6776300065898789e-01 -3.1428309412647404e-02 7.6464836175889062e-01 +421 -2.2112566002008222e-01 -8.0033416193571816e-01 7.4057822704117926e-01 +151 1.6510010513742961e+00 6.2880202489514836e-01 1.3109463507573997e+00 +162 8.6466591751463506e-01 1.2003096922919751e+00 1.6720745976940152e+00 +120 7.1544273833415639e-01 7.8605685992147967e-01 1.5756692842267452e+00 +448 9.4818399052933544e-01 2.0373333697562079e-01 1.1821449360296239e-01 +50 -7.4255028295716818e-01 3.2131856627302258e-01 7.0344624031236247e-01 +443 5.1965861871733798e-01 -1.0469002555669342e+00 4.3373559100868195e-02 +482 1.9661775056161916e+00 1.8911734358361203e+00 7.2949567046678088e-01 +407 1.8582263860937767e-01 -1.3051257268383373e-01 5.0987931207045945e-01 +100 -3.7775697318477114e-01 6.0919017017007682e-01 7.1809182324625254e-01 +99 -1.2684617496938173e+00 7.3671717137305515e-01 -8.1216571664258830e-01 +107 -2.8776644836089277e-01 5.0874100972210130e-02 -4.8277793530428115e-01 +480 -1.8051331679926971e-01 8.6563042329278228e-01 -5.8352716569019136e-01 +115 -1.0589943552297505e+00 -5.2550981762149152e-01 -1.7244688387853080e-01 +278 1.5768829958501078e+00 1.4428098110470169e+00 8.8216722790329116e-01 +206 -1.3653407453215169e+00 5.7341428096126357e-01 2.2629859809279146e-01 +4 4.2054817038258185e-01 -2.9390858515089308e-01 -1.7875237254421117e+00 +214 -1.0426854223671351e+00 -9.9898728143962490e-01 -1.9850479848636837e-01 +65 4.1792586017239108e-01 8.0186431881714215e-01 -2.0107060384389590e+00 +490 6.7355251805377303e-01 -2.0698786089395388e-01 -3.1564646838967253e-01 +230 -1.3855973935201399e-01 1.6134941051796734e+00 2.3723214232474421e-01 +234 1.9442134326447673e+00 -1.3805634063343805e-01 -9.8210270774821284e-01 +92 1.8063255781217027e-01 9.3716955232457000e-01 -1.9187798219061411e-01 +103 3.9559605419305116e-01 -8.7523159162324915e-01 -8.6993815784441930e-01 +129 1.2253789920819727e+00 2.8171983713246046e-01 -1.2180024131333584e+00 +483 9.6349992375661320e-01 -1.6348662648160852e+00 8.3712630375667085e-01 +110 8.0468512955471783e-01 -1.2623668571621947e+00 1.4617362498240638e+00 +126 -2.5741602043303030e-01 -2.5870568275485217e-01 -1.0282926023825125e+00 +276 7.0448925295125497e-01 -1.4486777483518087e-01 4.0589927727544634e-01 +294 4.9277474123671205e-01 1.0788251906341033e+00 1.0720476037391911e+00 +417 1.2134126298835348e+00 6.9341902173441838e-01 -6.5915650495314448e-01 +102 -9.4530772564542864e-01 3.5633646308084904e-01 2.1645216652503570e-02 +228 -3.1477177829390662e-01 -7.3015136189998553e-02 -1.3550661516185267e+00 +2 -1.5167590438599203e+00 3.2942906513575698e-01 -3.9430403043809092e-01 +222 -3.4853423639550507e-01 4.3402827204271471e-01 -8.9055344775375656e-01 +332 7.6671266929186610e-01 -4.2789189576138797e-01 2.2589706911206284e-01 +275 1.0091776783462640e+00 -2.3875723103898955e-01 9.0625273137588058e-01 +243 -2.4008164703199580e-01 2.4602229249214927e-01 -9.2542387373274426e-01 +394 -1.5496683613302659e-01 -1.4731622236607285e+00 4.3712483588631723e-02 +325 -9.9716991278750156e-01 9.0079916710328489e-01 6.1656781470423368e-02 +468 1.1367478364774437e+00 3.7268550263787792e-01 -1.9334998928228118e+00 +113 -6.1637943298580211e-01 -1.4259739417714792e-01 8.5880390205968704e-01 +47 1.4522907038923785e+00 -3.8138661441744320e-01 8.8902241399148096e-01 +474 -6.5326939744671464e-01 -2.9584216080544323e-01 -1.6703076347144621e-01 +343 -2.0865957540293453e-01 4.2320136734663144e-01 -5.2417372636564219e-01 +257 -1.6598412047016537e+00 3.9614126419385248e-01 6.2190463287430520e-01 +422 9.8621254947118736e-02 -4.5653326655140536e-01 -1.6959752095102018e-01 +317 8.1554926779727022e-01 -9.3952932101149422e-01 4.1213701483558629e-01 +322 9.7692194337623842e-02 7.2221211185210599e-03 1.4983319825497168e+00 +453 1.0112117753398511e+00 -1.6043121320019077e-01 -1.5109389287188097e+00 +82 -1.8245270960375951e-01 -1.7227940931260219e-01 9.4914460423273084e-01 +402 -1.3974163926710530e+00 1.0238276956317611e+00 -2.7116721725643461e-01 +201 3.8154565319070316e-01 6.1162789639306392e-01 5.3616806651343329e-01 +159 -5.5623509138788352e-01 -7.3506001159846490e-01 2.9669217335717424e-01 +239 -1.1703971851987414e+00 -2.5624748584715568e-01 1.9987978519039629e-01 +340 -1.1651635328367398e+00 1.4923285973929103e+00 -5.0638764373602618e-01 +246 4.6916366638116123e-02 3.7471219463751682e-01 -8.5595777185358435e-01 +268 3.9776335718715750e-01 -4.1326407010466332e-01 6.4132644428253849e-01 +238 -1.0102989663900468e+00 2.5145560602393102e-01 1.6537809300909093e-01 +183 9.6649446422314420e-02 -3.1320299584600791e-01 8.9787784698607254e-01 +393 -8.1709715097020719e-01 6.5173585509788723e-01 1.3340272254613436e-01 +177 9.2862946550951486e-01 -7.4734865012317631e-01 2.6370187436425798e-02 +97 4.0324698775550633e-01 -6.5060630846020162e-01 4.3381661619662121e-01 +16 9.2225588537666714e-01 5.0761227093429218e-01 2.8224038915514177e-01 +15 7.4631799122735776e-01 -5.1735298399747642e-01 1.0267699639319139e+00 +467 2.9233724948217432e-01 -1.7768548355681282e-01 9.7602334864839035e-01 +404 -1.5591392530118275e+00 6.9331308976828065e-01 -1.9156738913640683e-02 +190 -2.3293475783192552e-01 1.9804103372721136e+00 1.4400561196029799e-01 +429 -3.1240905856412571e-01 5.3399975662794008e-01 -8.3672459106253427e-01 +356 1.1813499076138427e-03 4.5712322524667531e-01 7.2569550209608535e-02 +459 -8.2536401218028255e-01 -5.1587534016495484e-01 -3.2429633054579987e-01 +140 1.4169132709847332e+00 -1.6948863471126016e-01 -5.4590188862129563e-01 +121 -8.0623019357608017e-02 4.3956025735145637e-01 -4.1230464603429395e-01 +76 1.2149513180720075e+00 3.0664283974167705e-01 -6.2206166881984115e-01 +24 -9.0953792569391767e-01 2.7208504534230199e-01 -5.7968255809907288e-01 +215 -3.6635366137979941e-01 4.9083544993599626e-01 5.4540399677247620e-01 +406 -2.8711421371139068e-01 9.8028410382686626e-01 -1.5688211456737056e+00 +495 -2.6064405757207798e-01 1.0014422650657693e+00 1.2195244915445839e-01 +256 5.1502433217852350e-01 2.1618101498582329e+00 -5.5671498574760148e-01 +348 1.5303758850601952e+00 1.3538700733088898e+00 -1.0404602147830582e+00 +18 8.7092721144608365e-01 8.8296303804909981e-01 4.7076145062566271e-01 +259 1.2579194534410862e+00 1.1275351076124240e+00 1.3255628670657002e-01 +261 -1.9457509303164215e+00 -5.7013962206489510e-01 6.5787967104563000e-02 +433 9.5143226323949670e-01 -1.9787864106930605e-01 2.1852616176467912e+00 +119 5.2387728877999162e-01 -7.5008900728698324e-01 1.0156553043596699e+00 +181 3.6547537534957092e-01 4.4856602347738611e-01 1.9502787843157898e-02 +392 1.8883706922750969e+00 1.0836617564317459e+00 6.8587165903540392e-01 +436 -7.5639783907079583e-01 -6.1811736982444421e-01 -2.2826839230281426e-01 +210 -4.5965909404278121e-01 -3.3285948977797364e-01 -2.8815683118847368e-01 +409 -8.9630394160430427e-01 1.2498156320615575e-01 -5.9486610361558201e-01 +437 -1.3458244785393264e-01 1.1611540390359226e-01 3.6707571520967769e-01 +114 -1.1780626363780731e+00 1.1424256338126497e+00 8.1898562672334474e-01 +431 3.9295632541408759e-01 -5.0466339464883803e-01 7.4701651109545830e-01 +296 -2.9562979314792992e-01 9.3794387166245374e-01 4.3821394647736267e-01 +477 -1.0332993738194893e+00 5.9732959339716152e-01 -1.6990304505644747e+00 +199 -1.0627414724922077e+00 3.6527741326574337e-01 -5.0076911469807539e-01 +31 1.1836258822972918e+00 -1.1805527709262840e+00 -1.0148440310730218e-01 +149 -9.7152762187442065e-01 -8.2689424175864179e-01 -9.8308725322137946e-01 +216 -2.6635793686817422e-01 -1.1249304826477751e+00 5.2675272099922754e-01 +425 -2.8287490221194594e-01 4.1086346332975782e-01 -5.6774387340250076e-01 +224 -6.3636066584070272e-01 3.8927738472590379e-01 -1.2043299828812322e+00 +352 -6.1634031766701480e-01 1.9344774717790295e-01 7.8374630494614250e-01 +289 -9.8440193523267117e-01 1.4471012647779624e+00 4.3922631035860088e-01 +455 -1.1942412759322272e+00 1.1300600257912083e+00 -4.7958784865825908e-02 +298 -8.4955866984285322e-01 1.8131854984076790e-01 -1.9010434504555735e+00 +42 1.1523609145851870e+00 1.3198909771653919e+00 -1.1943568765046571e+00 +80 2.0928302112510155e+00 -1.9281727715628849e-01 3.5879525261694012e-01 +127 1.0275071129063864e+00 -7.8560029105042173e-01 8.4680312545585235e-01 +232 3.2836195573764693e-01 1.5921754951459595e+00 -1.4889040346123832e+00 +368 -1.0143580013676627e+00 -6.3286772474382025e-01 5.9003271203631313e-01 +486 3.0052735920053437e-02 -7.5917073216074904e-01 -4.0707609210832352e-01 +209 8.3084043466989521e-01 -1.2819860426930157e-01 9.8450910112172252e-01 +152 1.4018503697498572e+00 -1.3364969077798206e+00 5.1589841760235022e-01 +353 5.3822763779176630e-01 -4.8322987719532096e-01 3.5634065895494110e-01 +361 6.8264929410893807e-02 -1.3682995245096907e+00 -4.9273501999153174e-01 +391 6.7065636846264776e-01 -2.7904582963633018e-01 -6.5303896626046076e-01 +464 7.4567031841775322e-01 1.8046977002555891e+00 -3.9159771733015164e-01 +497 -1.3856699033357778e+00 -9.3599081481125368e-01 1.8204759707532270e-01 +498 1.0568629143757213e+00 -6.8137997517450560e-02 -3.7037143049187105e-01 +264 -7.7894167957263005e-01 2.7383401106980504e-01 7.5098074183721675e-01 +265 1.9614235016832940e-01 -4.2322665725562197e-01 -1.6236881765469688e-01 +350 -6.3256317352651559e-01 -5.9660876051471468e-02 5.2317095757618959e-01 +144 -2.0800773378554721e-01 -1.5156540919629388e-01 -1.8814379829548375e-01 +17 8.2103760580927843e-01 -1.1053143150308307e+00 1.1843881143235824e-01 +441 9.9191589104231870e-01 -1.9479579195707514e-01 1.8130903870970541e+00 +266 -9.4957121369000017e-02 8.6997989048119007e-02 -1.5903074475142429e-01 +375 8.1973242957273296e-01 1.0075441532082390e+00 6.6277118207442265e-01 +351 -1.0694047025049973e+00 1.2185457298237026e-01 7.2731979237547140e-01 +254 -1.4178061472233576e+00 1.0044925984667965e+00 5.9999609355847139e-01 +29 4.7548776272319854e-01 1.5001558567759110e-01 7.4645778473548241e-01 +198 5.7218364285113010e-01 2.9196622753924861e-01 -1.2231490460337893e+00 +197 -1.4204377171882598e-01 2.1322055429678972e+00 3.5360172437812271e-01 +192 -4.3230000337254881e-01 8.1753260459826260e-01 -1.3961239427992276e+00 +220 9.2338173032465304e-02 7.2444278115958327e-01 4.3240465996750244e-02 +432 3.3837153168712325e-01 1.9757543957217949e-01 -3.2138599665961831e-01 +20 7.2972771576502227e-01 -7.1923547937920451e-01 3.8462300862783037e-02 +63 7.3459759072459618e-01 -2.1393390343408181e-01 1.4606085672716668e-01 +446 9.5489174587921177e-01 -2.2284752482645742e-01 -7.3147917056258960e-01 +172 -2.3233356067616504e+00 5.9696639792861073e-01 1.0311292046090428e+00 +405 -1.1779705391325133e+00 2.7846640825986735e-01 9.6440591359561623e-01 +323 1.2758508066094825e+00 1.1576865878083721e-02 1.3415986450967126e+00 +428 4.8021126796596170e-01 4.8003440312842205e-01 -4.1979524804611819e-02 +280 1.1723141734791545e+00 8.4290272518839332e-02 1.1240738308596074e+00 +54 8.2234236592018339e-02 6.9377897211693754e-02 4.6415665343815465e-01 +397 -2.4516753222359439e-01 -3.8647076314136586e-01 -3.1938187998240442e-01 +279 4.7475740365710301e-01 4.2033019401821775e-02 1.0791025172609856e+00 +134 4.6986570792330234e-01 7.5759398359663410e-01 1.3748348906115773e+00 +236 -1.4338534270949166e+00 6.5242359063738475e-01 -4.6879001422000049e-01 +493 -9.5795155221589912e-01 -9.3131490174346532e-01 5.2848598027407112e-01 +346 9.4017276609564226e-01 -1.4423054432512394e+00 -3.4883627652283825e-02 +295 -1.0211326704350645e+00 -1.5688283678435537e+00 2.2737881805456114e-01 +164 4.2933435120637192e-01 1.2908919636558716e+00 -1.8559649323965055e-01 +354 3.1232180266110654e-01 -3.3884174823706786e-01 2.0012570054806617e-01 +449 -4.1956545717722271e-01 8.5033185910749320e-01 -1.6923286514167504e+00 +185 -1.9847768794898153e-02 1.6093024328157031e+00 -3.4278049008935008e-01 +229 3.3354615877618454e-01 -2.1967770508754222e-01 -6.8288738508757751e-01 +135 -3.8598562184690355e-01 2.3459455181853697e-01 1.4591795655915993e-01 +211 -1.1858788850370010e+00 1.3960363241794649e+00 1.1390210005059993e+00 +81 1.3604301094625607e-02 1.2711357052370638e+00 1.3840699383718491e+00 +37 3.5025606454523878e-01 -1.0316562604143946e+00 2.4944393037279400e+00 +355 -4.2713554752038259e-02 1.6441819966987897e-01 -8.2550044716409909e-01 +141 8.1569462514471880e-01 -6.8558748209733145e-01 7.0575287639668483e-01 +122 3.6274405429300222e-01 -4.1985688325391463e-01 2.5223429679090231e-01 +327 5.2689568302324030e-01 -7.1530570005039407e-01 8.1591540939993761e-03 +386 5.2540176252260506e-01 -8.0891002493580211e-01 -2.1080798818740659e-01 +59 3.8008676468324715e-01 1.2302042558959829e+00 -1.2893140123247515e+00 +57 -1.2756375464672689e+00 7.7885421584605408e-01 9.3218921154320622e-01 +489 -4.8772350194378145e-02 1.1774319824237183e+00 -1.3413963962772402e+00 +326 -8.2073133946066312e-01 -1.2685275916429064e+00 -1.0253535003668284e+00 +359 -1.8991447869255085e+00 -1.2154594584519982e+00 -1.7832247863578221e-01 +349 6.4100123949028309e-02 -3.2723074072385872e-01 -1.5565659217165477e+00 +247 4.5734576435732799e-01 4.9511064545143885e-01 -1.5945768728559153e+00 +365 -5.7917383718454207e-01 -2.3494837692508375e+00 -1.5004840205862926e+00 +382 -1.0813649655944142e+00 4.1831946020927230e-01 2.9306887264755938e-01 +130 -5.7488571729114812e-01 -9.6638702807104448e-01 -1.0278487271582966e+00 +471 1.1085411185196428e+00 -5.2404573748396321e-01 9.9734211160337760e-01 +21 -2.3901903994255250e-01 9.3578484419611557e-02 -7.3719660959071831e-01 +499 -4.9906801820206043e-02 4.0499214176262377e-01 -2.9371307883695258e-01 +253 -7.8928864460108283e-01 3.3838305995790624e-01 7.1275694444227405e-02 +302 1.5254343639867396e-01 -2.7881674166920268e-02 9.3627888140226589e-01 +324 -1.1159492478288651e+00 7.0632546920242867e-01 2.5394407536700253e-01 +154 4.8736880051344117e-01 -1.3177717741071062e+00 -7.9660620460177323e-01 +284 1.7716036485389025e-01 -3.6539348914929748e-01 -4.6941135291661629e-01 +161 -2.7479275242316997e-01 7.6982156884799513e-01 -5.7088165723862649e-01 +112 2.7023059482372042e-01 2.0487127767495705e-01 -4.9350658197380731e-01 +39 -1.6840134362063963e-01 -2.0596641915022665e-01 1.2622422574022685e+00 +269 -1.4448376822412348e-01 4.2047192520573229e-01 -1.5751711248887881e+00 +470 -9.0198936075875380e-01 -1.0035762705605118e-01 1.1469701649179411e+00 +84 -3.7165102348228596e-01 1.5718083932531206e+00 1.8715295090631173e-01 +381 6.6740577340943863e-01 -1.9432536761932276e-01 -1.2757754863002870e+00 +416 7.2118119300841677e-01 8.6813375765446710e-01 -8.2350198387929519e-01 +182 3.3694648494832763e-01 -6.5830649973844163e-02 7.0076361524788766e-01 +347 -2.4949061953800500e-01 -1.1432286442922379e+00 -4.5757988288631407e-01 +380 -4.7143472726668367e-01 -2.9180051952103941e-01 6.0581680882348110e-01 +19 7.3007216948068054e-02 9.4947888518620716e-01 3.4627576178512598e-01 +430 -2.2320112834958328e-01 -3.8559102989803251e-01 1.0427665572858709e+00 +212 2.0170777345036919e-01 -9.9332505765821755e-01 1.0550787824425254e+00 +479 -7.7910620356048310e-01 -3.4759422268929079e-02 -5.8756871125828891e-01 +217 -7.0999315500035393e-04 -1.4874035841198494e-01 -1.1389898361525996e+00 +147 3.3953282916732841e-01 1.0503362153417393e+00 8.8554338624429496e-01 +13 1.4952012032076418e+00 -1.3492024227588162e-01 8.6834761707295621e-02 +170 -7.5230462228731629e-02 1.9875829136564169e-01 3.8512887113920530e-01 +204 -3.1459152727076800e-01 -7.2066080044499392e-01 -7.5277710665622377e-01 +306 8.0529112138128323e-01 5.8633344712571456e-01 -1.8256367575393391e+00 +414 -1.7678147014996259e+00 -7.1706970804552028e-01 6.0614094017430153e-01 +79 1.6303375369704216e+00 -9.6446702691566244e-01 1.7014099837302679e+00 +116 -1.7231587507489068e+00 -2.2374070614774770e+00 1.0442058418221465e+00 +231 -9.2546402309298947e-01 3.2157716287919585e-01 -6.2797312032694141e-01 +171 1.4243635122212095e+00 -3.4034411127116748e-01 2.1060050313379719e+00 +273 1.0777993506600285e+00 -1.7160435918146213e+00 1.0194335249558832e+00 +260 1.4544392536719453e+00 9.3765863648494707e-01 1.9642995061847701e+00 +43 -1.1326443879098980e+00 1.4846909715454837e-01 1.6874301063514463e+00 +208 -1.1234489793683757e+00 -1.0408587064067447e-01 -4.8386417041968832e-01 +226 6.0458834484750512e-01 -4.5998597100022531e-01 -4.1420588246526679e-01 +370 -2.5264443636161833e-02 2.2888129565845829e-02 -7.5123334633027034e-02 +85 8.9124431006375637e-01 1.2150234901900336e+00 -1.3794080039677503e+00 +213 6.8750004752856542e-01 1.7643443473184617e-01 -7.6039731517372366e-01 +299 1.1166507011383160e+00 -6.9342398354435130e-03 4.0031150060326554e-01 +249 1.6676259701674601e+00 -1.2916011404415280e+00 8.3081388251616040e-02 +258 -3.3338543070706111e-01 -5.9677208925291603e-01 1.5474505568531705e-01 +388 3.3338877926510010e-02 3.6534261356710357e-01 -9.3163626937108668e-01 +91 -1.0436539497197659e+00 -3.6206368573074071e-01 -3.9406149981573330e-01 +415 1.8022253921012549e-01 -2.5361248238828202e+00 7.8761564433010600e-01 +27 1.6681493439613866e+00 -6.3832374162264238e-01 5.5825898158707521e-01 +465 -3.3883292906124979e-01 -1.9199928938047977e+00 -1.8916637827626086e-02 +72 -7.0256791239588934e-01 -1.3631374858756479e-01 1.1539466869530803e+00 +58 -9.7431680335045678e-02 -1.0635351953490649e-01 -4.5168665276313896e-01 +88 5.2937320884954953e-01 -1.1749454649084838e+00 1.2744645330784524e-01 +6 -1.1593774469007843e+00 5.1413980407296589e-01 1.2944389470552302e+00 +75 5.7374690805841033e-01 7.8433587872715163e-02 -3.9368611836917572e-01 +22 -9.6996881290452630e-01 1.2965746977075312e+00 -1.5394575986278033e-01 +128 -6.4070276272082638e-01 2.2708380115440285e-01 -1.6142126045669323e+00 +193 5.7443781554989515e-01 -1.2458447329459237e+00 -9.3796775534017041e-01 +389 6.7276417854677451e-01 -2.9571653479618748e-01 -2.4423872850138906e-01 +241 -1.4102001294916395e-02 -9.9059498112109945e-01 -8.4827835518272399e-01 +14 1.0515231184651945e+00 4.5617222115757200e-01 -5.2911246318135385e-01 +307 5.0028759749137040e-03 -5.0699437336696396e-01 -2.5790615969461578e-01 +401 3.9207473498457289e-02 -9.2058641117610335e-02 -1.3689269955592848e-01 +248 1.5980225324156891e-01 -4.1600725109692227e-01 4.1253240562945254e-01 +335 5.6526042010051392e-01 -1.0563866873458263e+00 2.2963431232103770e-01 +281 4.7335967523683825e-01 -9.8764893385752195e-01 1.3275577965292436e+00 +33 9.5713349527393091e-02 -6.7578402785937589e-02 1.2308478723868863e+00 +221 -1.2080117435798665e+00 -2.2142477880517361e-01 -7.4060132361069042e-01 +251 5.1352069062594478e-02 -4.7173153686079722e-01 1.3645828375870801e+00 +138 -9.8931419992230929e-01 -5.6403083699472267e-01 4.8437720371021081e-01 +73 -8.7238230525929461e-01 2.2619668651197614e-01 -3.2904255863286136e-01 +237 1.5966476021876643e+00 -1.0734521639966819e+00 -5.7008225474518526e-01 +77 -6.5731386120913948e-01 -1.3672574981662913e-01 3.4397972232069346e-01 +339 6.8164227902965080e-01 -8.7654828372118265e-01 -9.2289632523091991e-01 +69 -1.0710495228647499e+00 -2.2798359247984892e-01 -1.4017813863798740e+00 +150 1.4728554201464288e+00 1.6873571351133543e-01 -4.9418642333439719e-02 +219 3.5347912349947574e-01 1.9808724875609746e-01 -5.0625815831733678e-01 +9 6.3426493841071574e-01 2.5658018877632760e-01 4.7953937763858034e-01 +3 -1.2144659411870629e+00 8.8297859772359033e-01 -2.6732917639533704e-01 +93 3.3822789154655764e-01 8.1143107440094409e-01 -2.7263548606070248e-01 +68 1.6351351046383883e-01 5.8445604848527588e-01 1.2062643207337951e+00 +35 1.6550671586466750e-02 1.6790869037398232e-01 2.5947900830558479e-02 +174 1.4403688502275100e+00 1.4476094634256031e+00 -1.0038411182890872e+00 +369 -7.9303772394565375e-01 -1.1303432398125628e+00 -1.5457440975201582e+00 +469 -5.5239153419630294e-01 -4.7075634498045837e-01 5.0539291079888571e-01 +270 5.0351525849727374e-01 1.3716919044917866e+00 2.8157430421583601e-01 +196 -2.2101193763774998e-01 9.4257812877032954e-01 -1.2881024224381614e+00 +235 -3.7410168233289759e-01 1.9712488864630789e-01 4.3505985658493368e-01 +104 1.0770774810232915e+00 -7.7420116923795979e-01 6.4885799952777634e-01 +363 6.7513909705285891e-01 2.0186757605257277e-01 6.2260156794788402e-01 +440 -2.7563401138205812e-01 4.0196589304635166e-01 6.8696509786942431e-02 +271 3.5486339796858996e-01 -1.0482634846478769e+00 1.0693870635001128e+00 +385 2.0653637543135839e-01 1.6251902525248125e+00 -1.0240800582063148e+00 +367 1.2090890730479817e+00 7.7304993739281713e-01 -9.1196492155951403e-01 +8 1.5650406952874099e-01 1.4761853226272020e-01 7.1667065222651671e-01 +445 -8.1712119890107360e-01 5.0169175756271378e-01 6.3236875667481124e-02 +95 7.1388432342661989e-01 -2.6058252368101411e-02 -1.0159428151424379e+00 +227 -2.1897046900910261e-01 2.4492515107534649e-01 2.2679621024062299e-01 +45 5.0120245022687604e-01 -1.1380921868404339e+00 7.8232214243213327e-01 +62 5.7973338245234629e-01 -7.9117819757367913e-01 -5.4327640325878901e-01 +309 5.3715909018265540e-01 -1.7844975395461696e-01 -1.5521878040430610e+00 +70 -1.3649193486754410e-03 -1.5242800010205164e+00 1.6225001176581824e+00 +285 -1.5639729724408871e+00 1.4626366106935738e+00 -1.2286649953661322e+00 +387 -1.3226131489884976e+00 -1.0695489941103238e+00 -1.4911056977700106e+00 +484 -1.5087954881419843e+00 -2.3407968100714568e-01 8.9471716161806181e-01 +98 3.0624993702155973e-01 -1.5934008419723134e-01 -1.0700290072035785e+00 +282 -1.1678279208732874e+00 8.8816716100523774e-01 -3.7594379985472404e-01 +203 -1.2339287833422024e+00 -1.0851718286318821e+00 -3.5581216293468138e-02 +189 -2.5647410293058537e-01 -3.6970804452537526e-01 -2.7009745024499721e-01 +267 -2.3687566231483211e-02 5.4572876490146272e-01 1.2664988400691950e+00 +155 1.7966821085178111e-01 -1.4254017034472058e-01 -1.0614594824352175e+00 +313 -4.0833555690731410e-02 -4.8193546027639250e-01 -4.9602679807507655e-02 +250 4.3395781720710452e-01 9.1543705256636054e-01 -6.1780594432179192e-01 +49 -5.8496932778818223e-01 2.0845066341835794e-01 -4.5660091846264866e-01 +111 -4.5577164923909808e-01 6.7687347516731056e-01 1.6901306317755600e+00 +124 2.3017035971304120e-01 1.2116381200880159e-02 -1.0715278739263430e+00 +488 1.1047027896127255e+00 -1.2726762145955062e+00 7.7913777050672761e-01 +48 -4.0669146183799126e-01 -1.0181831306551499e+00 6.3005463620771884e-01 +123 -1.2387342693749222e-01 -4.5460712390743935e-01 -5.6241811130968811e-01 +423 1.5051226831159246e+00 -1.0959205280256621e+00 3.5512567969767117e-01 +329 1.5695087401093555e-01 -4.0810545929224507e-01 1.5430948869435961e+00 +334 -1.0908322951892016e+00 -5.4577269465148259e-01 -6.7521769754195848e-01 +146 4.4361993166914260e-01 4.1962079818012665e-01 -3.9049661615798353e-01 +500 -3.0319085884539942e-01 7.6039240701443311e-01 2.0836797720615632e+00 +46 -3.9431430053902639e-01 3.7259615958614579e-02 -1.6080049457594121e+00 +374 9.2250275913940816e-01 -5.4107808677407720e-01 6.5542912197165987e-02 +52 7.3216124676172201e-01 9.4572980131871298e-01 -1.2696251833719743e+00 +466 1.5044833940669236e+00 -1.8483350803538756e+00 9.5057050040256286e-01 +272 -4.0011978947412463e-01 2.0429884556820119e-01 5.4991808303431688e-01 +331 5.7814259377466726e-01 1.7044411336854475e+00 -7.2986308719737536e-01 +12 6.8240059668147224e-01 8.7756006768431916e-01 -1.7546792723746987e+00 +178 -1.1529369201979585e+00 -3.9576843637993819e-01 4.1654001054549866e-01 +376 -1.3678465511836193e+00 -1.5404423718061540e+00 -8.9187926122069050e-01 +117 -1.3804354656475164e+00 -7.9075263667417661e-01 -3.6776627245391275e-01 +419 1.9706999335859632e-01 -1.1815264434314889e+00 1.6458873301525292e-01 +379 2.6784097653047051e-01 3.8806722276897926e-01 4.0603233211791162e-01 +53 1.0521966172519035e+00 5.1164934479578683e-01 9.8577725800730365e-01 +28 1.0129347774638686e+00 1.1058165761432928e+00 -3.9034581257989903e-01 +300 -1.4876024382598509e+00 -6.2467982655378396e-01 1.3535210035045362e+00 +83 9.7907832581926901e-01 1.4855763621624507e+00 4.1007013403839504e-01 +304 -1.8963384707907098e+00 5.2731582964002444e-01 1.0962854464287259e+00 +51 8.5928138726119452e-01 -1.6162178311396377e-01 3.2746315986045632e-01 +180 -3.4136546641226267e-01 1.2771151944969144e+00 -3.9578085701206223e-01 +60 -1.7295103304379962e+00 -9.9492157200179920e-01 1.2224650147307308e+00 +255 5.0740556300071860e-01 -6.6892801585963790e-01 -4.4506165343889975e-01 +336 3.8821455708543523e-01 7.4853146108739210e-01 1.0393955338521590e+00 +74 -8.5185557539809709e-01 5.0099005012093123e-01 6.1187012870886726e-01 +11 -4.8598509694234203e-02 -9.7638648911006976e-01 3.6444261502684167e-01 +106 -8.3362253193144206e-02 -9.2846276284357510e-01 -2.0625632391587234e-01 +342 -1.1850581603543699e+00 -4.6587013939418070e-01 -2.5534356631266192e-01 +366 1.8044603030107276e-01 1.2857436498573065e+00 -4.9002876775305132e-01 +153 5.9355527141792742e-02 8.5309993046714749e-01 1.2601655126485285e+00 +384 -3.3199740732000493e-02 -1.1586262754841152e+00 2.7022536481319620e-01 +444 1.4366137360637837e-01 7.4777392856310121e-01 -1.3874143079892032e-01 +169 -2.2106828869911426e-02 4.3869453276997300e-01 -8.6050040149769946e-01 +312 -9.5175409360636343e-01 -7.9143766981298624e-01 -8.3109524929616485e-01 +131 -1.2661930440833327e-01 4.9560114120296378e-01 1.2481373975929652e-01 +290 4.7988720115251880e-03 4.3307801179133432e-01 7.2537453656012302e-02 +240 -1.4417217340859769e+00 1.4357683004122099e+00 1.4379544254488796e-01 +403 9.8034468727423985e-01 -2.0429774540476020e-01 -1.4454160823908524e-01 +438 1.1944593880989134e+00 2.3483551676455661e+00 1.9984542691081373e+00 +420 1.3486549938776343e-01 -1.0783938772052266e+00 2.4823645088293936e-01 +175 1.6188020186225376e+00 -1.2786027961604105e+00 1.5779664705358573e-01 +305 7.6304434006850930e-01 -1.0609104653684724e+00 -1.3992599279449225e+00 +341 -5.0986549858189378e-01 9.7345649143358179e-02 -5.4583627317992767e-01 +291 1.4937985447982780e+00 1.1345276617898410e-01 1.4735185581275405e+00 +372 2.7438262099508215e-01 2.3642499432513167e-01 2.0103126185436837e-01 +293 -2.0812456222423235e+00 1.2585017395884830e+00 -1.9872753884412903e-01 +461 -1.7366155414350635e+00 6.7563297134023181e-01 -3.0241597324899727e-01 +263 -9.9912758612453856e-01 -1.4606803538340738e+00 -4.8347668759554979e-01 +473 1.5452042518079840e+00 1.3194414166855677e+00 -1.4200655529990689e+00 +166 -1.4143951087621034e-01 -1.1527398628151918e-01 -2.0324403247706951e-01 +132 1.6628716981291343e+00 -2.6751309910688231e-02 -1.1291183234894089e+00 +32 -2.3270952903472897e-01 2.1018074582476372e+00 1.1203402946623044e+00 +475 -1.2604994295453433e+00 -9.5339439518226154e-01 3.3662881048301792e-02 +283 1.2749816341052314e+00 4.7341406662300863e-02 8.5345288522412766e-01 +205 9.6825352209774937e-02 -1.0389613158303228e+00 -5.4505460161674724e-01 +158 8.8743698904591217e-01 1.0689060843560156e+00 6.1104406355038210e-01 +1 5.8273461256327774e-01 4.6658417699512433e-01 7.3964607391058224e-01 +485 4.4170048227791719e-01 -2.8581555293721217e-01 -1.0141724005249320e+00 +378 6.6654429040499424e-02 -1.8224880226392848e+00 1.2128685020610477e+00 +71 -9.1996605782626056e-02 -2.2291664206826806e-01 -1.2402752353304469e+00 +320 -9.5597854323421563e-02 -8.6852053155856812e-01 3.5066557017928385e-01 +481 7.9532304801009490e-01 -9.4180364698072971e-01 1.2495155405965916e-02 +318 -4.1450336396091869e-01 3.4120074122917260e-01 7.3720013366972947e-01 +496 -6.2393347120986375e-01 1.0494054390993381e+00 -1.0590359239552802e+00 +319 -9.5320962685676391e-01 9.2021659866276262e-01 5.5763202369068265e-01 +338 9.5180850251473562e-02 7.4581412234581979e-02 1.6562396473566801e+00 +358 -1.2039319191565336e+00 9.9635011716776112e-01 3.7776599320072252e-01 +225 -2.2878377680357529e-02 5.9393376646738183e-01 -1.7855655501046659e+00 +55 -1.2658412487783444e+00 8.3827650617277571e-01 3.7229167676011687e-01 +362 -1.1190412417889151e+00 -4.1093870066191052e-01 -5.5943417408569930e-02 +36 -1.1944064170110538e+00 5.2834231151049005e-01 -2.5661926163189262e-02 +133 -3.4046853819783990e-01 8.7037698795660379e-01 2.6480748394474063e-01 +412 -8.2433971673189854e-01 -2.4364204997081215e-01 3.2182546651866395e-01 +89 1.2836300411162869e+00 -1.0534639266932924e+00 1.7273414295686953e+00 +38 -5.4018176537409834e-01 1.1189891674084445e+00 -5.4949279328730405e-01 +337 2.0680174457636453e+00 6.8756290663232345e-01 -5.3885707707990127e-01 +233 -1.1580426595635346e-01 1.5352867360847791e+00 1.8920809100075830e-02 +442 -5.2273629379374242e-01 -4.7573534425197805e-01 3.3349171376798270e-01 +143 -6.4456717536444386e-01 -8.2221860127843815e-01 -3.1619033462829965e-01 +194 4.6000888686458724e-01 2.4868203858229221e-01 -1.0844456124091726e+00 +308 7.0412401782623568e-01 1.4705120558853640e-01 -1.6984333842169479e+00 +286 -7.4825969157579242e-01 1.7277684761952672e+00 -4.8658995664543186e-01 +61 -1.4087152482721139e+00 -1.9786675343505181e-01 -8.3049863139435698e-01 +426 -5.9317510584759559e-01 -3.1176204329742879e-01 9.7102624547089234e-01 +450 2.9660411649227686e-01 -1.0106432265344207e+00 -8.0608626908093450e-01 +188 -4.5857896465809017e-01 8.3781782180488956e-02 1.6679261825519407e+00 +94 -2.5105865768429703e-01 -1.0277678550758340e+00 2.0110948522283595e-01 +252 -2.6250057461969262e-01 -8.3779492646801812e-01 -1.2443616941843418e+00 +321 -1.3849227082743394e+00 -7.9961814140752485e-01 -5.2758719721869440e-01 +156 9.7248559724229044e-01 1.4856613149426096e-01 -1.0762319296143268e+00 +167 4.8758255885458768e-01 3.7938735168685944e-01 -8.2720329905212353e-01 +330 4.8147102008722625e-01 -2.9945144880586022e-01 -7.3225876236181275e-01 +195 1.6483881807209144e+00 -1.9598861592898009e-01 -6.2914422221089158e-02 +78 2.3726384124165131e-01 2.7514362192855252e-01 1.7571172900747967e-01 +157 -2.1865090243933563e+00 3.7632441115528098e-01 7.7333806476534650e-01 +373 9.8884980347773899e-01 3.4121263358683873e-01 -3.3626353210018556e-01 +56 -5.1874451216553419e-01 5.0889073330236878e-01 -7.4130187216438104e-01 +315 1.5052362221906064e+00 -6.9840962964633502e-01 -1.5488907100876634e-01 +478 1.1082301092586995e+00 2.9770971389874379e-01 -5.4580262091212584e-01 +109 9.4396405787734605e-01 4.9318782477478235e-01 1.2284569230572757e+00 +357 -1.2371693160029509e+00 4.1376978558912775e-01 3.3529522630256764e-01 +454 -4.4342104600414733e-01 -3.5633346291025164e-01 -2.1131375082322554e-01 +86 -2.6274074185542590e-01 -2.7912975828127135e-01 -3.4564526880694488e-02 +262 -2.0457328043953218e-01 -1.0549970010682790e+00 -8.7569945910877856e-02 +160 1.2508565962389259e-01 -1.1049367732134203e+00 -4.1414673901133031e-01 +168 -5.4833844765552298e-01 9.1122623641564449e-01 -8.1466354261018392e-01 +145 1.9424847461468013e+00 2.4717259671440775e-01 -8.1993106446423478e-02 +400 -7.3927429735196926e-01 9.6278828542903949e-01 9.8355595468926471e-01 +395 -1.7616642510587566e+00 -4.3839255400156163e-01 -4.3538389834393521e-01 +297 -8.1651466743971568e-01 1.9480772762641770e-02 -2.5090574319554337e-01 +207 9.9594630394692474e-01 -5.5333584932915503e-01 -8.1672262386449701e-02 +460 3.8863838706865678e-01 -1.9332061145329088e-01 7.5599739666291188e-01 +44 4.9322334356812642e-01 5.4097595609480897e-01 1.2096517945019982e+00 +377 -2.3588544095100208e-02 4.2843373407529362e-01 -8.1372583759538197e-01 +411 -7.0187880935114388e-01 -8.8403807864596529e-01 3.6139298123719504e-01 +396 -6.1324863673452068e-01 -5.8579142070009704e-01 -1.6980414017487730e+00 +424 -1.4405372913769463e+00 -1.2161267905238037e-01 -7.1275775203655271e-03 +66 -2.2455608800065441e-01 -5.5194985983545303e-02 -2.9031971555487707e-01 +371 2.8693892522161785e-01 -1.3942754264578394e-01 4.1638095135795372e-01 +186 -2.5542578648985415e-01 -2.7435394726950046e-01 1.6931522427410683e+00 +413 5.6007135922818607e-01 1.2189064363493711e-01 -7.5271223366515216e-01 diff --git a/examples/USER/uef/nvt_uniaxial/in.nvt_uniaxial b/examples/USER/uef/nvt_uniaxial/in.nvt_uniaxial new file mode 100644 index 0000000000..613f46935c --- /dev/null +++ b/examples/USER/uef/nvt_uniaxial/in.nvt_uniaxial @@ -0,0 +1,28 @@ +# uniaxial NVT deformation of WCA fluid + +units lj +atom_style atomic + + +pair_style lj/cut 1.122562 +read_data data.wca +pair_coeff 1 1 1.0 1.0 +pair_modify shift yes + +neighbor 0.5 bin +neigh_modify delay 0 + +change_box all triclinic + +fix 1 all nvt/uef temp 0.722 0.722 0.5 erate -0.5 -0.5 + +fix 2 all momentum 100 linear 1 1 1 + +#dump 1 all atom 25 dump.lammpstrj + +#dump 2 all cfg/uef 25 dump.*.cfg mass type xs ys zs + +thermo_style custom step c_1_press[1] c_1_press[2] c_1_press[3] + +thermo 50 +run 10000 diff --git a/examples/USER/uef/nvt_uniaxial/log.22Sep17.npt_uniaxial.g++.1 b/examples/USER/uef/nvt_uniaxial/log.22Sep17.npt_uniaxial.g++.1 new file mode 100644 index 0000000000..2c13448192 --- /dev/null +++ b/examples/USER/uef/nvt_uniaxial/log.22Sep17.npt_uniaxial.g++.1 @@ -0,0 +1,281 @@ +LAMMPS (22 Sep 2017) +# uniaxial NVT deformation of WCA fluid + +units lj +atom_style atomic + + +pair_style lj/cut 1.122562 +read_data data.wca + orthogonal box = (0 0 0) to (8.39798 8.39798 8.39798) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 500 atoms + reading velocities ... + 500 velocities +pair_coeff 1 1 1.0 1.0 +pair_modify shift yes + +neighbor 0.5 bin +neigh_modify delay 0 + +change_box all triclinic + triclinic box = (0 0 0) to (8.39798 8.39798 8.39798) with tilt (0 0 0) + +fix 1 all nvt/uef temp 0.722 0.722 0.5 erate -0.5 -0.5 + +fix 2 all momentum 100 linear 1 1 1 + +#dump 1 all atom 25 dump.lammpstrj + +#dump 2 all cfg/uef 25 dump.*.cfg mass type xs ys zs + +thermo_style custom step c_1_press[1] c_1_press[2] c_1_press[3] + +thermo 50 +run 10000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.62256 + ghost atom cutoff = 1.62256 + binsize = 0.811281, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.742 | 2.742 | 2.742 Mbytes +Step c_1_press[1] c_1_press[2] c_1_press[3] + 0 6.3937851 7.0436438 6.4461087 + 50 10.369902 10.999889 6.5437384 + 100 12.411384 13.145871 7.8892802 + 150 12.88182 12.114068 7.5155182 + 200 10.375571 10.979773 6.5624056 + 250 10.158901 10.251273 5.4525068 + 300 10.011314 9.8371382 5.4031393 + 350 9.4890008 9.7992108 5.054963 + 400 9.1715116 9.2647886 4.9600208 + 450 9.8495961 9.3353483 4.986786 + 500 9.5903809 8.576173 4.8252116 + 550 8.8057509 9.7152078 4.9089022 + 600 8.9743682 10.031277 4.8924072 + 650 10.233852 9.3059527 5.1977058 + 700 9.2361906 9.6439971 5.0923763 + 750 10.449751 9.5911465 5.2548714 + 800 9.8366857 9.9873885 4.9456956 + 850 10.266351 9.9620134 5.0602713 + 900 9.6325813 9.3910946 5.1466624 + 950 9.1911919 9.1519006 4.8275345 + 1000 9.2871712 9.8508501 5.2674099 + 1050 9.7052035 10.291793 5.160359 + 1100 9.9425552 10.361827 5.5520484 + 1150 10.377563 10.26588 5.5997436 + 1200 9.6368269 10.354413 5.4137873 + 1250 9.2071055 9.1706334 4.9800411 + 1300 9.7140516 8.7257777 4.8536943 + 1350 10.145983 9.8247797 4.8921813 + 1400 9.1998975 9.6935675 5.2269871 + 1450 9.4838136 8.9035726 4.6867121 + 1500 9.066389 9.811658 4.8875316 + 1550 10.007083 9.8946118 5.204609 + 1600 9.722137 9.9291588 5.326712 + 1650 9.7424614 9.6995966 5.3577819 + 1700 9.7185135 9.5922931 5.385856 + 1750 9.6368481 8.1414594 5.0046079 + 1800 9.8065782 9.6798036 4.92473 + 1850 9.0463737 10.024205 5.6495695 + 1900 9.0774484 10.527582 5.0363426 + 1950 9.1691461 10.049703 4.8517514 + 2000 9.7619602 10.049532 5.2088038 + 2050 9.9203348 9.8056395 5.7699852 + 2100 9.1455665 9.5864018 5.1410542 + 2150 8.8501135 9.7917307 5.141824 + 2200 9.1433685 9.8168548 5.1742441 + 2250 9.3248968 10.454532 5.5456356 + 2300 10.210505 9.361499 5.0935226 + 2350 9.5041186 9.598986 5.2451005 + 2400 8.968896 9.2811921 4.7799868 + 2450 9.8201159 10.133892 4.9981817 + 2500 9.4421084 9.7875766 5.4124809 + 2550 9.6410643 9.9148309 5.0603288 + 2600 9.3810676 9.5346849 5.3233836 + 2650 9.2340337 8.7233538 5.0361302 + 2700 9.405597 9.7848488 4.7537042 + 2750 9.9447412 9.2366502 4.9736459 + 2800 10.189443 9.452684 5.624362 + 2850 9.6680124 9.0941543 5.0101469 + 2900 8.4350889 9.1595018 4.7706866 + 2950 9.0056117 9.3498593 4.7655963 + 3000 9.4795416 9.7400747 5.4705868 + 3050 9.6605264 9.4558374 5.1240166 + 3100 9.681451 9.7966554 5.3174458 + 3150 9.7887528 9.7371194 4.9349103 + 3200 9.9720054 9.5592538 5.2306417 + 3250 10.185023 9.9436037 5.4127312 + 3300 9.9670676 9.6069307 5.026261 + 3350 9.0090411 9.5975249 4.8881019 + 3400 9.6535707 9.748683 4.9933873 + 3450 9.7774977 9.7570511 4.8512619 + 3500 9.7250053 10.36386 5.4057249 + 3550 9.567788 9.773413 5.3936671 + 3600 9.2094148 9.0211247 5.2328675 + 3650 9.3512098 9.73407 4.576624 + 3700 9.159074 9.2611591 5.2996448 + 3750 9.4772798 8.9792211 5.1007079 + 3800 9.3898357 9.1150609 5.2126508 + 3850 9.2466312 9.1460651 4.867472 + 3900 9.9316993 9.3061137 5.1219265 + 3950 9.2550913 9.780254 5.371885 + 4000 10.005356 9.7328972 5.2535791 + 4050 9.5228242 9.5134113 5.4181393 + 4100 9.576808 10.082425 5.1272491 + 4150 10.20265 9.6667058 5.529118 + 4200 9.9443671 10.09427 5.6163734 + 4250 9.4956875 9.9462818 5.0820085 + 4300 10.350144 10.003702 5.1621505 + 4350 10.119486 9.8691507 5.4913457 + 4400 9.4991604 10.516185 5.2512264 + 4450 9.0812854 9.2835603 5.1695714 + 4500 9.7538478 8.5298834 4.5954607 + 4550 9.8920394 9.3581299 5.202587 + 4600 9.2694921 9.3338291 5.201958 + 4650 10.925818 9.5062049 4.8694531 + 4700 11.020014 10.130224 5.582409 + 4750 9.5005142 9.3571561 5.456739 + 4800 9.6670147 9.6628702 5.0451252 + 4850 9.134147 9.1308788 4.7950594 + 4900 9.7466206 8.6171443 4.8716275 + 4950 9.0397505 9.1996036 5.2010502 + 5000 9.6898652 9.8914655 5.3959279 + 5050 10.06771 9.7523891 5.3690408 + 5100 10.000963 9.6279379 5.4077384 + 5150 9.8686159 10.179702 5.0686824 + 5200 9.8866247 9.725152 5.4350049 + 5250 9.2068346 10.214424 5.3187713 + 5300 9.713992 9.8069045 5.496359 + 5350 9.423852 9.364085 5.2144606 + 5400 9.4350241 9.5584633 5.0339001 + 5450 10.555124 10.784922 5.1938072 + 5500 9.4147344 10.33187 5.4360602 + 5550 9.8514653 9.6575827 5.4959779 + 5600 9.3138107 9.6592624 4.941387 + 5650 9.1224809 8.7112257 5.0435936 + 5700 8.8289158 10.749686 4.8916132 + 5750 9.7200279 10.030606 5.2033161 + 5800 9.8439873 9.6289015 5.5131934 + 5850 9.6257294 9.4128988 4.9196038 + 5900 9.7490214 9.5776313 5.0301815 + 5950 9.1430855 10.108944 5.1406243 + 6000 9.3358644 9.5633737 4.9787073 + 6050 9.4432774 8.9464304 5.1466052 + 6100 8.8878373 9.5048946 4.9190238 + 6150 9.6451898 9.2419823 5.0159841 + 6200 9.5042173 8.9414307 5.2634247 + 6250 9.0896505 9.7230651 5.3340322 + 6300 8.8100599 8.8781352 5.4117914 + 6350 9.3104601 9.0233294 5.3136432 + 6400 9.368101 9.6387362 4.7833216 + 6450 10.334343 9.8384149 5.3606204 + 6500 9.8824036 10.022627 6.0857086 + 6550 9.7034443 10.026765 5.17604 + 6600 9.3757845 9.899268 5.2301359 + 6650 10.540821 10.4343 5.5287065 + 6700 9.6317649 9.8923579 5.6045768 + 6750 9.5982772 10.07897 5.1221451 + 6800 10.239883 10.189967 5.3167447 + 6850 10.017271 9.7680902 5.229621 + 6900 9.6200416 10.129301 5.1998759 + 6950 9.0361417 8.923798 5.1652612 + 7000 9.3153521 9.063054 4.6860773 + 7050 8.6434091 9.0363436 4.7811975 + 7100 9.4955395 9.3830541 5.022538 + 7150 9.3392402 9.1847119 5.1544622 + 7200 9.4676321 9.8370036 4.8854442 + 7250 9.5115882 10.350324 4.9780525 + 7300 9.6025583 9.6247917 5.473794 + 7350 9.8919524 10.049446 4.9816931 + 7400 9.6814319 9.9410894 5.265078 + 7450 9.4130955 10.191436 5.2531256 + 7500 9.8114668 8.8461635 5.0562894 + 7550 10.321567 9.4730124 5.2043655 + 7600 9.5059024 9.8330367 5.0749721 + 7650 10.067084 10.606423 5.5598818 + 7700 10.896159 10.084281 5.5159718 + 7750 9.754306 10.162301 5.2475876 + 7800 9.7278145 9.801009 5.0685504 + 7850 9.8639905 10.323104 5.2458864 + 7900 9.7246799 9.1377357 5.1841319 + 7950 10.381792 9.6977533 5.0977386 + 8000 9.7265224 9.2999829 4.7925571 + 8050 9.5203288 9.3144956 4.7539211 + 8100 9.6900973 9.6614063 5.304712 + 8150 9.713677 9.9154149 4.8178575 + 8200 9.4733597 9.8948632 5.036112 + 8250 9.7783036 9.9554334 5.3355682 + 8300 9.4034783 9.9156801 5.5539279 + 8350 9.2984025 9.2013949 5.0753991 + 8400 9.9299078 9.6166801 5.115776 + 8450 9.526737 9.3312125 4.7800587 + 8500 9.581956 10.065906 4.9756092 + 8550 9.2767953 9.326006 5.3024978 + 8600 9.799968 8.4660845 5.0199109 + 8650 9.8985354 10.127852 4.9098064 + 8700 8.7952691 10.521133 5.6840528 + 8750 9.8299997 9.5588553 5.3085734 + 8800 9.0811776 9.5704532 5.1684993 + 8850 9.8303571 9.7618932 5.1251259 + 8900 9.9238794 9.9654863 5.2999683 + 8950 10.851304 9.9682289 5.4133763 + 9000 9.5523794 9.1890766 5.1469144 + 9050 9.7461948 8.9611236 4.9490826 + 9100 10.138917 9.6757567 5.0473544 + 9150 9.4869835 9.4786575 5.0142464 + 9200 10.263518 10.079135 5.1493398 + 9250 9.8691684 9.0908275 5.3221203 + 9300 9.8586707 9.4177643 5.1525265 + 9350 9.3375816 9.9167208 5.4846207 + 9400 9.5603903 9.4813199 4.6237495 + 9450 10.30892 9.5217736 5.6163214 + 9500 9.327949 9.9831649 4.8923915 + 9550 9.8421656 9.3202702 5.3352046 + 9600 8.8543704 9.4556702 4.6430041 + 9650 10.103399 9.2161072 4.8658062 + 9700 9.507811 9.9647378 5.227369 + 9750 9.4988096 8.9942893 5.2491418 + 9800 9.8007958 9.234452 5.1740203 + 9850 9.6029685 10.076042 5.023107 + 9900 9.4035691 10.13782 5.2775777 + 9950 9.6517135 10.355994 5.3035779 + 10000 9.9157616 9.7741952 5.5269431 +Loop time of 3.47119 on 1 procs for 10000 steps with 500 atoms + +Performance: 1244529.812 tau/day, 2880.856 timesteps/s +99.5% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.53077 | 0.53077 | 0.53077 | 0.0 | 15.29 +Neigh | 2.219 | 2.219 | 2.219 | 0.0 | 63.93 +Comm | 0.21866 | 0.21866 | 0.21866 | 0.0 | 6.30 +Output | 0.0027909 | 0.0027909 | 0.0027909 | 0.0 | 0.08 +Modify | 0.41956 | 0.41956 | 0.41956 | 0.0 | 12.09 +Other | | 0.08042 | | | 2.32 + +Nlocal: 500 ave 500 max 500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 908 ave 908 max 908 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3489 ave 3489 max 3489 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3489 +Ave neighs/atom = 6.978 +Neighbor list builds = 4567 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:03 diff --git a/examples/USER/uef/nvt_uniaxial/log.22Sep17.npt_uniaxial.g++.4 b/examples/USER/uef/nvt_uniaxial/log.22Sep17.npt_uniaxial.g++.4 new file mode 100644 index 0000000000..276eb2f443 --- /dev/null +++ b/examples/USER/uef/nvt_uniaxial/log.22Sep17.npt_uniaxial.g++.4 @@ -0,0 +1,281 @@ +LAMMPS (22 Sep 2017) +# uniaxial NVT deformation of WCA fluid + +units lj +atom_style atomic + + +pair_style lj/cut 1.122562 +read_data data.wca + orthogonal box = (0 0 0) to (8.39798 8.39798 8.39798) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 500 atoms + reading velocities ... + 500 velocities +pair_coeff 1 1 1.0 1.0 +pair_modify shift yes + +neighbor 0.5 bin +neigh_modify delay 0 + +change_box all triclinic + triclinic box = (0 0 0) to (8.39798 8.39798 8.39798) with tilt (0 0 0) + +fix 1 all nvt/uef temp 0.722 0.722 0.5 erate -0.5 -0.5 + +fix 2 all momentum 100 linear 1 1 1 + +#dump 1 all atom 25 dump.lammpstrj + +#dump 2 all cfg/uef 25 dump.*.cfg mass type xs ys zs + +thermo_style custom step c_1_press[1] c_1_press[2] c_1_press[3] + +thermo 50 +run 10000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.62256 + ghost atom cutoff = 1.62256 + binsize = 0.811281, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.71 | 2.71 | 2.71 Mbytes +Step c_1_press[1] c_1_press[2] c_1_press[3] + 0 6.3937851 7.0436438 6.4461087 + 50 10.369902 10.999889 6.5437384 + 100 12.411384 13.145871 7.8892802 + 150 12.88182 12.114068 7.5155182 + 200 10.375571 10.979773 6.5624056 + 250 10.158901 10.251273 5.4525068 + 300 10.011314 9.8371382 5.4031393 + 350 9.4890008 9.7992108 5.054963 + 400 9.1715116 9.2647886 4.9600208 + 450 9.8495961 9.3353483 4.986786 + 500 9.5903809 8.576173 4.8252116 + 550 8.8057509 9.7152078 4.9089022 + 600 8.9743682 10.031277 4.8924072 + 650 10.233852 9.3059527 5.1977058 + 700 9.2361906 9.6439971 5.0923762 + 750 10.449751 9.5911465 5.2548714 + 800 9.8366858 9.9873885 4.9456956 + 850 10.266351 9.9620134 5.0602713 + 900 9.6325811 9.3910947 5.1466627 + 950 9.1911906 9.1518996 4.8275336 + 1000 9.2871726 9.8508561 5.2674079 + 1050 9.7052019 10.291782 5.1603609 + 1100 9.9425827 10.361848 5.5520588 + 1150 10.37757 10.265891 5.5997246 + 1200 9.6367069 10.354451 5.4138749 + 1250 9.2075006 9.1705136 4.9806417 + 1300 9.7126123 8.7247301 4.8528533 + 1350 10.146034 9.8319205 4.8958266 + 1400 9.19638 9.7052094 5.2332913 + 1450 9.4667073 8.9014702 4.7073387 + 1500 9.0949401 9.8381729 4.8904182 + 1550 10.068959 9.8096692 5.1613658 + 1600 10.131443 9.7086921 5.0913546 + 1650 9.9557572 9.9183989 5.2635245 + 1700 9.3820418 8.6135867 4.9395498 + 1750 8.9486365 9.3433293 5.2674469 + 1800 10.352322 10.354432 5.3335153 + 1850 8.9629784 9.6172224 5.0824828 + 1900 8.5429652 9.749815 5.1577895 + 1950 8.9828002 8.9631646 5.0948426 + 2000 9.4171989 9.7122117 5.1386251 + 2050 9.767299 9.6146113 4.8965319 + 2100 10.049399 10.02243 5.3856622 + 2150 9.2639644 10.09669 5.3020322 + 2200 9.1916162 10.841127 5.0271109 + 2250 9.9859708 8.519568 5.24568 + 2300 9.9462279 9.5850706 5.0632906 + 2350 9.8043011 9.7605126 5.3148323 + 2400 9.089818 9.6474522 5.0012486 + 2450 9.655874 9.3255636 4.8291262 + 2500 9.0259445 9.3074827 5.1593031 + 2550 9.1610478 9.7356492 5.0741161 + 2600 9.3153881 9.3936949 5.4830363 + 2650 9.6212696 9.598252 4.7172875 + 2700 9.318906 9.665656 5.1917527 + 2750 9.6613838 9.7106796 5.1843146 + 2800 10.231844 9.9407641 4.6940455 + 2850 10.008093 9.2781076 5.2624957 + 2900 10.464168 9.808666 5.1457978 + 2950 9.7080601 9.6972304 5.406456 + 3000 9.6851209 10.050737 5.1198394 + 3050 8.9093581 9.213428 5.233108 + 3100 8.8098921 9.6607476 4.9625331 + 3150 8.6608386 9.7503441 5.0737533 + 3200 9.7004403 9.6748778 5.0734462 + 3250 10.077054 10.318711 5.3233841 + 3300 10.63887 9.4901739 5.516542 + 3350 10.232909 9.3407073 5.4989967 + 3400 9.8854134 9.9542625 5.1982468 + 3450 9.9388203 9.3394716 4.8135833 + 3500 9.2514026 9.5857527 5.4605449 + 3550 8.3940282 9.0549836 4.6951548 + 3600 8.7696659 9.6262816 4.6302087 + 3650 9.0695173 8.8520895 5.0814723 + 3700 9.4700744 9.2777557 4.6825004 + 3750 9.0221844 9.3407486 5.3984156 + 3800 9.1478369 9.1420043 5.3024474 + 3850 9.2652818 9.700053 5.3355364 + 3900 10.248456 9.2480211 5.2375956 + 3950 9.8259922 9.6130415 5.5978761 + 4000 9.404877 9.7931698 5.3767927 + 4050 10.131713 9.7047295 5.2964594 + 4100 9.8128638 9.4253237 5.5308166 + 4150 10.25183 9.1333595 5.1957555 + 4200 10.449736 9.295762 4.7863033 + 4250 9.7304858 9.4482515 5.356439 + 4300 9.2773777 9.4110855 4.9879246 + 4350 8.9325082 9.3429549 5.0410132 + 4400 9.2603855 9.7905381 4.7436126 + 4450 8.7600443 9.9160722 5.196316 + 4500 9.0824514 10.036035 4.873051 + 4550 9.3884333 9.6644343 5.1154951 + 4600 9.8181676 9.6385118 5.3639835 + 4650 9.1574799 9.5386974 4.7487094 + 4700 10.275911 9.5383553 5.1084297 + 4750 9.2476854 9.3353591 5.4773008 + 4800 9.3422407 9.1931821 4.9210291 + 4850 9.9033126 9.6443642 5.1334553 + 4900 9.8469467 9.6836455 5.5101146 + 4950 10.211229 9.760253 5.0151668 + 5000 9.3256273 10.109873 5.4129479 + 5050 9.9704879 9.8504809 5.2191163 + 5100 9.4820718 9.711504 4.9633504 + 5150 9.2952171 9.6955742 5.3214246 + 5200 9.8400791 9.4763906 4.9149518 + 5250 10.080112 9.5634741 5.1701348 + 5300 9.4221014 9.8149742 5.3605931 + 5350 8.8228402 10.121343 5.3192212 + 5400 9.7318719 10.508763 5.0044083 + 5450 8.7429847 9.6583774 5.033313 + 5500 9.9243256 10.239521 5.2956506 + 5550 9.6088558 9.8555986 5.359257 + 5600 10.904352 10.72033 5.7874034 + 5650 9.4774477 9.7246962 5.596949 + 5700 9.8527139 9.2188245 4.6518586 + 5750 9.7932375 9.2763721 4.6663307 + 5800 9.5630073 9.1704583 5.4784197 + 5850 10.159996 9.5206168 5.0012706 + 5900 9.1667978 9.6891715 5.1959301 + 5950 9.2194131 9.2170699 5.1653264 + 6000 9.5917124 9.2038051 5.1004966 + 6050 9.4141124 9.9166471 5.0535712 + 6100 10.231166 9.7746591 5.2399634 + 6150 9.6054192 9.34446 5.0711646 + 6200 9.9279645 8.9546561 5.4698039 + 6250 9.1581437 8.95439 4.9336111 + 6300 8.9257232 9.0665473 5.188718 + 6350 9.7685695 9.0822789 4.8454457 + 6400 9.5140226 9.5073414 5.3420644 + 6450 9.5379198 9.3316002 5.1940338 + 6500 10.216584 9.8982859 5.2790157 + 6550 10.221286 10.913585 5.4521496 + 6600 10.925166 10.088055 5.2079758 + 6650 10.012501 9.3870455 5.1740433 + 6700 10.176139 9.4869588 5.3783369 + 6750 9.2819415 8.1431975 4.8256476 + 6800 9.790723 9.7932943 5.3602927 + 6850 9.1327199 9.8354267 5.1356642 + 6900 9.240909 9.3854618 5.1767268 + 6950 10.652806 9.4355671 5.1314851 + 7000 9.1676917 10.055501 5.2824651 + 7050 9.6486488 9.1063089 4.9596976 + 7100 9.3733678 9.5875095 5.0882285 + 7150 9.282243 9.354934 4.6752644 + 7200 8.7370777 10.1445 5.0217245 + 7250 9.563419 9.929442 5.1720916 + 7300 9.9128346 9.2426863 5.3595023 + 7350 9.9319949 9.9479477 5.4844629 + 7400 9.4671739 9.2380048 5.3274217 + 7450 9.7531193 9.4075641 4.9426738 + 7500 10.331422 9.4704554 5.3036636 + 7550 8.7724434 9.663179 4.9492563 + 7600 10.222748 9.1674852 4.8135992 + 7650 9.5288583 8.5866929 5.0342955 + 7700 8.8832847 8.8035037 4.6184473 + 7750 9.4847076 9.7969656 5.0035855 + 7800 9.2782486 9.1283641 5.3151299 + 7850 8.962989 8.7729872 5.0374817 + 7900 9.6336556 9.4975426 4.9832641 + 7950 10.125279 10.044247 5.2740873 + 8000 9.9705097 9.6925988 5.2344188 + 8050 9.7836318 9.5794261 4.9174534 + 8100 10.79561 10.04809 5.1604639 + 8150 9.7261726 10.372878 5.3083843 + 8200 10.338569 10.08189 5.6555172 + 8250 9.7833315 9.9834209 5.3790753 + 8300 9.5857944 9.6052323 5.0689289 + 8350 9.6706688 9.6189242 4.7725678 + 8400 10.570423 9.5786093 5.1894242 + 8450 9.6514599 10.168359 5.0733592 + 8500 10.273682 9.9179284 5.4014563 + 8550 9.3120287 10.146837 4.9895115 + 8600 9.511943 9.644112 5.462624 + 8650 10.380674 9.1117114 5.156727 + 8700 10.068596 8.7687113 5.1440814 + 8750 9.2484971 9.2477678 4.9318794 + 8800 9.7298469 8.9480303 5.1151321 + 8850 9.7299502 10.415138 4.7902908 + 8900 10.966912 10.732962 5.4793574 + 8950 10.328384 9.9501313 5.6238396 + 9000 9.7385041 9.8319224 5.1926497 + 9050 9.7971055 9.5740203 5.1111302 + 9100 9.7789727 9.9281901 5.1786549 + 9150 9.9306964 9.3360599 4.9524547 + 9200 9.8798841 10.240752 5.1691344 + 9250 10.185445 9.4934917 4.9188964 + 9300 8.9184663 8.9349408 4.8079511 + 9350 9.6552187 9.9846949 4.9619969 + 9400 10.304306 9.2298208 5.2822855 + 9450 9.8379613 10.041703 5.4186514 + 9500 10.221443 9.5342818 4.8929802 + 9550 9.9723047 10.072856 5.4169676 + 9600 9.3923879 9.2984387 5.4452785 + 9650 8.9072589 9.7482374 4.7835208 + 9700 9.8370121 10.205922 5.0385145 + 9750 9.4274542 9.4653248 5.6340681 + 9800 9.7668106 9.3265705 5.3154126 + 9850 10.422549 10.362922 5.361592 + 9900 9.6264407 9.9790162 5.6381052 + 9950 10.35018 9.8853593 5.2639184 + 10000 9.6190853 9.7903758 5.1583115 +Loop time of 1.32471 on 4 procs for 10000 steps with 500 atoms + +Performance: 3261084.476 tau/day, 7548.807 timesteps/s +98.4% 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.1301 | 0.13489 | 0.13886 | 0.9 | 10.18 +Neigh | 0.5654 | 0.575 | 0.5883 | 1.3 | 43.41 +Comm | 0.35135 | 0.37147 | 0.38856 | 2.4 | 28.04 +Output | 0.0028336 | 0.0032777 | 0.004292 | 1.0 | 0.25 +Modify | 0.16328 | 0.16711 | 0.17231 | 0.8 | 12.61 +Other | | 0.07297 | | | 5.51 + +Nlocal: 125 ave 128 max 122 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Nghost: 477 ave 489 max 469 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 861 ave 877 max 848 min +Histogram: 1 0 1 0 0 1 0 0 0 1 + +Total # of neighbors = 3444 +Ave neighs/atom = 6.888 +Neighbor list builds = 4560 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:01 diff --git a/examples/coreshell/in.coreshell.wolf b/examples/coreshell/in.coreshell.wolf new file mode 100644 index 0000000000..337057d0c8 --- /dev/null +++ b/examples/coreshell/in.coreshell.wolf @@ -0,0 +1,71 @@ +# Testsystem for core-shell model compared to Mitchel and Finchham +# Shamelessly copied from in.coreshell.dsf but this script uses Wolf summation. + +# ------------------------ INITIALIZATION ---------------------------- + +units metal +dimension 3 +boundary p p p +atom_style full + +# ----------------------- ATOM DEFINITION ---------------------------- + +fix csinfo all property/atom i_CSID +read_data data.coreshell fix csinfo NULL CS-Info + +group cores type 1 2 +group shells type 3 4 + +neighbor 2.0 bin +comm_modify vel yes + +# ------------------------ FORCE FIELDS ------------------------------ + +pair_style born/coul/wolf/cs 0.1 20.0 20.0 # A, rho, sigma=0, C, D +pair_coeff * * 0.0 1.000 0.00 0.00 0.00 +pair_coeff 3 3 487.0 0.23768 0.00 1.05 0.50 #Na-Na +pair_coeff 3 4 145134.0 0.23768 0.00 6.99 8.70 #Na-Cl +pair_coeff 4 4 405774.0 0.23768 0.00 72.40 145.40 #Cl-Cl + +bond_style harmonic +bond_coeff 1 63.014 0.0 +bond_coeff 2 25.724 0.0 + +# ------------------------ Equilibration Run ------------------------------- + +reset_timestep 0 + +thermo 50 +thermo_style custom step etotal pe ke temp press & + epair evdwl ecoul elong ebond fnorm fmax vol + +compute CSequ all temp/cs cores shells + +# output via chunk method + +#compute prop all property/atom i_CSID +#compute cs_chunk all chunk/atom c_prop +#compute cstherm all temp/chunk cs_chunk temp internal com yes cdof 3.0 +#fix ave_chunk all ave/time 100 1 100 c_cstherm file chunk.dump mode vector + +thermo_modify temp CSequ + +# velocity bias option + +velocity all create 1427 134 dist gaussian mom yes rot no bias yes temp CSequ +velocity all scale 1427 temp CSequ + +fix thermoberendsen all temp/berendsen 1427 1427 0.4 +fix nve all nve +fix_modify thermoberendsen temp CSequ + +# 2 fmsec timestep + +timestep 0.002 +run 500 + +unfix thermoberendsen + +# ------------------------ Dynamic Run ------------------------------- + +run 1000 diff --git a/examples/coreshell/log.22Sep17.coreshell.wolf.g++.1 b/examples/coreshell/log.22Sep17.coreshell.wolf.g++.1 new file mode 100644 index 0000000000..35c30913fc --- /dev/null +++ b/examples/coreshell/log.22Sep17.coreshell.wolf.g++.1 @@ -0,0 +1,190 @@ +LAMMPS (22 Sep 2017) +# Testsystem for core-shell model compared to Mitchel and Finchham +# Shamelessly copied from in.coreshell.dsf but this script uses Wolf summation. + +# ------------------------ INITIALIZATION ---------------------------- + +units metal +dimension 3 +boundary p p p +atom_style full + +# ----------------------- ATOM DEFINITION ---------------------------- + +fix csinfo all property/atom i_CSID +read_data data.coreshell fix csinfo NULL CS-Info + orthogonal box = (0 0 0) to (24.096 24.096 24.096) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 432 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 216 bonds + 1 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + +group cores type 1 2 +216 atoms in group cores +group shells type 3 4 +216 atoms in group shells + +neighbor 2.0 bin +comm_modify vel yes + +# ------------------------ FORCE FIELDS ------------------------------ + +pair_style born/coul/wolf/cs 0.1 20.0 20.0 # A, rho, sigma=0, C, D +pair_coeff * * 0.0 1.000 0.00 0.00 0.00 +pair_coeff 3 3 487.0 0.23768 0.00 1.05 0.50 #Na-Na +pair_coeff 3 4 145134.0 0.23768 0.00 6.99 8.70 #Na-Cl +pair_coeff 4 4 405774.0 0.23768 0.00 72.40 145.40 #Cl-Cl + +bond_style harmonic +bond_coeff 1 63.014 0.0 +bond_coeff 2 25.724 0.0 + +# ------------------------ Equilibration Run ------------------------------- + +reset_timestep 0 + +thermo 50 +thermo_style custom step etotal pe ke temp press epair evdwl ecoul elong ebond fnorm fmax vol + +compute CSequ all temp/cs cores shells + +# output via chunk method + +#compute prop all property/atom i_CSID +#compute cs_chunk all chunk/atom c_prop +#compute cstherm all temp/chunk cs_chunk temp internal com yes cdof 3.0 +#fix ave_chunk all ave/time 100 1 100 c_cstherm file chunk.dump mode vector + +thermo_modify temp CSequ + +# velocity bias option + +velocity all create 1427 134 dist gaussian mom yes rot no bias yes temp CSequ +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 22 + ghost atom cutoff = 22 + binsize = 11, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair born/coul/wolf/cs, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +velocity all scale 1427 temp CSequ + +fix thermoberendsen all temp/berendsen 1427 1427 0.4 +fix nve all nve +fix_modify thermoberendsen temp CSequ + +# 2 fmsec timestep + +timestep 0.002 +run 500 +Per MPI rank memory allocation (min/avg/max) = 8.59 | 8.59 | 8.59 Mbytes +Step TotEng PotEng KinEng Temp Press E_pair E_vdwl E_coul E_long E_bond Fnorm Fmax Volume + 0 -637.41039 -677.06805 39.657659 1427 -21302.622 -677.06805 1.6320365 -678.70009 0 0 1.2935454e-14 3.3306691e-15 13990.5 + 50 -635.62711 -667.67134 32.044236 1153.0465 -4533.0717 -669.45724 37.76997 -707.22721 0 1.7858939 9.6844521 2.2001656 13990.5 + 100 -632.76337 -662.83035 30.066977 1081.8989 -3492.8736 -664.98454 39.197093 -704.18164 0 2.1541967 11.063962 2.1543406 13990.5 + 150 -630.82538 -663.70056 32.875182 1182.9464 -74.330324 -666.12202 46.263665 -712.38569 0 2.4214607 11.739683 2.7558416 13990.5 + 200 -629.1541 -664.54637 35.39227 1273.5187 -1707.5508 -666.87772 41.796197 -708.67391 0 2.3313445 10.594804 3.0025376 13990.5 + 250 -627.86587 -662.60879 34.742918 1250.1531 -1258.7537 -665.21416 43.017024 -708.23118 0 2.6053655 10.576999 1.8400986 13990.5 + 300 -627.10755 -664.12897 37.021419 1332.1403 -1891.3466 -666.39618 40.769593 -707.16577 0 2.2672094 9.412943 1.2434258 13990.5 + 350 -626.27558 -665.04303 38.767448 1394.9676 -1436.8514 -667.47081 41.854746 -709.32556 0 2.4277827 10.304721 1.977594 13990.5 + 400 -625.55098 -661.86388 36.312896 1306.6455 -331.92076 -664.4632 44.426542 -708.88975 0 2.599325 11.081635 2.1734468 13990.5 + 450 -624.88626 -661.07359 36.187328 1302.1272 -2325.834 -663.6031 39.662697 -703.26579 0 2.5295037 9.9810051 1.3068929 13990.5 + 500 -623.87093 -660.24145 36.370525 1308.7192 410.85324 -662.86944 45.869201 -708.73864 0 2.6279856 10.592785 1.8162326 13990.5 +Loop time of 11.7065 on 1 procs for 500 steps with 432 atoms + +Performance: 7.381 ns/day, 3.252 hours/ns, 42.711 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 11.535 | 11.535 | 11.535 | 0.0 | 98.54 +Bond | 0.001443 | 0.001443 | 0.001443 | 0.0 | 0.01 +Neigh | 0.10952 | 0.10952 | 0.10952 | 0.0 | 0.94 +Comm | 0.048796 | 0.048796 | 0.048796 | 0.0 | 0.42 +Output | 0.00038695 | 0.00038695 | 0.00038695 | 0.0 | 0.00 +Modify | 0.0067511 | 0.0067511 | 0.0067511 | 0.0 | 0.06 +Other | | 0.004243 | | | 0.04 + +Nlocal: 432 ave 432 max 432 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 9328 ave 9328 max 9328 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 297280 ave 297280 max 297280 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 297280 +Ave neighs/atom = 688.148 +Ave special neighs/atom = 1 +Neighbor list builds = 21 +Dangerous builds = 0 + +unfix thermoberendsen + +# ------------------------ Dynamic Run ------------------------------- + +run 1000 +Per MPI rank memory allocation (min/avg/max) = 8.59 | 8.59 | 8.59 Mbytes +Step TotEng PotEng KinEng Temp Press E_pair E_vdwl E_coul E_long E_bond Fnorm Fmax Volume + 500 -623.87093 -660.24145 36.370525 1308.7192 410.85324 -662.86944 45.869201 -708.73864 0 2.6279856 10.592785 1.8162326 13990.5 + 550 -623.95762 -659.99899 36.041371 1296.8752 -442.62446 -662.68699 44.004419 -706.69141 0 2.6879934 10.936057 1.7358509 13990.5 + 600 -624.04214 -661.21748 37.175332 1337.6785 47.615854 -663.76133 45.009742 -708.77107 0 2.5438549 11.431366 2.1185464 13990.5 + 650 -623.98279 -661.85255 37.86976 1362.6661 -1708.3823 -664.31138 40.933446 -705.24482 0 2.4588298 9.7960191 1.4159904 13990.5 + 700 -624.02941 -661.57484 37.54543 1350.9958 -124.09512 -663.95322 44.666402 -708.61962 0 2.3783801 10.518712 2.0854584 13990.5 + 750 -624.03935 -661.11619 37.076837 1334.1344 -1163.2721 -663.82553 42.1219 -705.94743 0 2.7093404 10.634859 1.9381654 13990.5 + 800 -623.98709 -659.43647 35.44938 1275.5737 -285.65702 -662.23782 44.650233 -706.88805 0 2.8013482 11.83459 3.4506407 13990.5 + 850 -623.96081 -661.77923 37.818422 1360.8188 -814.33212 -664.38161 42.860208 -707.24181 0 2.6023728 10.766451 2.9211132 13990.5 + 900 -623.96136 -662.98419 39.022831 1404.157 308.13105 -665.65877 45.053188 -710.71195 0 2.6745786 11.028799 1.8494322 13990.5 + 950 -623.91048 -660.63828 36.7278 1321.575 -445.31526 -663.79806 43.94833 -707.74639 0 3.1597729 11.852051 1.8238458 13990.5 + 1000 -623.90541 -661.03474 37.129332 1336.0233 522.57958 -663.50212 45.863261 -709.36538 0 2.4673781 10.949291 1.8614095 13990.5 + 1050 -624.01134 -660.99076 36.979422 1330.6291 -1710.2829 -663.67762 41.056102 -704.73372 0 2.6868521 10.86533 2.2154165 13990.5 + 1100 -624.02639 -660.86661 36.840225 1325.6204 1151.0236 -663.5066 47.207185 -710.71378 0 2.6399847 11.298044 1.8900703 13990.5 + 1150 -624.04418 -661.29819 37.254006 1340.5094 161.09847 -663.73735 45.222561 -708.95991 0 2.4391651 11.261119 2.2245673 13990.5 + 1200 -624.08628 -662.39932 38.313043 1378.6168 -1405.0927 -664.93121 41.728112 -706.65933 0 2.5318927 10.458041 2.1153159 13990.5 + 1250 -624.03036 -661.25661 37.226248 1339.5106 63.407721 -663.72719 45.086961 -708.81415 0 2.4705832 11.766021 2.2297809 13990.5 + 1300 -623.97475 -661.55998 37.585229 1352.4278 -763.66781 -663.80645 42.870244 -706.6767 0 2.2464703 10.098322 1.7614596 13990.5 + 1350 -623.93123 -660.30786 36.376631 1308.9389 -2389.8052 -663.04725 39.749029 -702.79628 0 2.7393936 10.879364 2.6622521 13990.5 + 1400 -623.86468 -658.44644 34.581765 1244.3543 2262.7586 -660.95368 50.10608 -711.05976 0 2.5072434 11.528291 1.7861906 13990.5 + 1450 -623.85494 -661.47216 37.617217 1353.5789 -1435.0174 -664.13587 41.701767 -705.83764 0 2.6637191 11.297444 2.0038345 13990.5 + 1500 -623.79928 -659.70124 35.901959 1291.8588 -198.39562 -662.57415 44.358482 -706.93263 0 2.872907 11.075746 2.2821286 13990.5 +Loop time of 23.4119 on 1 procs for 1000 steps with 432 atoms + +Performance: 7.381 ns/day, 3.252 hours/ns, 42.713 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 23.069 | 23.069 | 23.069 | 0.0 | 98.54 +Bond | 0.0029275 | 0.0029275 | 0.0029275 | 0.0 | 0.01 +Neigh | 0.22821 | 0.22821 | 0.22821 | 0.0 | 0.97 +Comm | 0.097941 | 0.097941 | 0.097941 | 0.0 | 0.42 +Output | 0.00074033 | 0.00074033 | 0.00074033 | 0.0 | 0.00 +Modify | 0.0042015 | 0.0042015 | 0.0042015 | 0.0 | 0.02 +Other | | 0.00865 | | | 0.04 + +Nlocal: 432 ave 432 max 432 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 9388 ave 9388 max 9388 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 297212 ave 297212 max 297212 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 297212 +Ave neighs/atom = 687.991 +Ave special neighs/atom = 1 +Neighbor list builds = 45 +Dangerous builds = 0 +Total wall time: 0:00:35 diff --git a/examples/coreshell/log.22Sep17.coreshell.wolf.g++.4 b/examples/coreshell/log.22Sep17.coreshell.wolf.g++.4 new file mode 100644 index 0000000000..84f854cf67 --- /dev/null +++ b/examples/coreshell/log.22Sep17.coreshell.wolf.g++.4 @@ -0,0 +1,190 @@ +LAMMPS (22 Sep 2017) +# Testsystem for core-shell model compared to Mitchel and Finchham +# Shamelessly copied from in.coreshell.dsf but this script uses Wolf summation. + +# ------------------------ INITIALIZATION ---------------------------- + +units metal +dimension 3 +boundary p p p +atom_style full + +# ----------------------- ATOM DEFINITION ---------------------------- + +fix csinfo all property/atom i_CSID +read_data data.coreshell fix csinfo NULL CS-Info + orthogonal box = (0 0 0) to (24.096 24.096 24.096) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 432 atoms + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 216 bonds + 1 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + +group cores type 1 2 +216 atoms in group cores +group shells type 3 4 +216 atoms in group shells + +neighbor 2.0 bin +comm_modify vel yes + +# ------------------------ FORCE FIELDS ------------------------------ + +pair_style born/coul/wolf/cs 0.1 20.0 20.0 # A, rho, sigma=0, C, D +pair_coeff * * 0.0 1.000 0.00 0.00 0.00 +pair_coeff 3 3 487.0 0.23768 0.00 1.05 0.50 #Na-Na +pair_coeff 3 4 145134.0 0.23768 0.00 6.99 8.70 #Na-Cl +pair_coeff 4 4 405774.0 0.23768 0.00 72.40 145.40 #Cl-Cl + +bond_style harmonic +bond_coeff 1 63.014 0.0 +bond_coeff 2 25.724 0.0 + +# ------------------------ Equilibration Run ------------------------------- + +reset_timestep 0 + +thermo 50 +thermo_style custom step etotal pe ke temp press epair evdwl ecoul elong ebond fnorm fmax vol + +compute CSequ all temp/cs cores shells + +# output via chunk method + +#compute prop all property/atom i_CSID +#compute cs_chunk all chunk/atom c_prop +#compute cstherm all temp/chunk cs_chunk temp internal com yes cdof 3.0 +#fix ave_chunk all ave/time 100 1 100 c_cstherm file chunk.dump mode vector + +thermo_modify temp CSequ + +# velocity bias option + +velocity all create 1427 134 dist gaussian mom yes rot no bias yes temp CSequ +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 22 + ghost atom cutoff = 22 + binsize = 11, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair born/coul/wolf/cs, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +velocity all scale 1427 temp CSequ + +fix thermoberendsen all temp/berendsen 1427 1427 0.4 +fix nve all nve +fix_modify thermoberendsen temp CSequ + +# 2 fmsec timestep + +timestep 0.002 +run 500 +Per MPI rank memory allocation (min/avg/max) = 6.881 | 6.881 | 6.881 Mbytes +Step TotEng PotEng KinEng Temp Press E_pair E_vdwl E_coul E_long E_bond Fnorm Fmax Volume + 0 -637.41039 -677.06805 39.657659 1427 -21302.622 -677.06805 1.6320365 -678.70009 0 0 1.3530839e-14 3.6429193e-15 13990.5 + 50 -635.62704 -667.67108 32.044047 1153.0397 -4532.6842 -669.45828 37.771018 -707.2293 0 1.787201 9.6848095 2.2028349 13990.5 + 100 -632.76343 -662.83014 30.066711 1081.8893 -3493.0827 -664.98212 39.195967 -704.17809 0 2.151977 11.060773 2.1578583 13990.5 + 150 -630.82533 -663.70172 32.876385 1182.9897 -75.706974 -666.12608 46.261038 -712.38712 0 2.4243598 11.746728 2.7663319 13990.5 + 200 -629.15463 -664.55009 35.395466 1273.6337 -1707.9185 -666.88117 41.794868 -708.67604 0 2.331082 10.596229 3.0031523 13990.5 + 250 -627.86625 -662.60876 34.742511 1250.1384 -1263.5726 -665.214 43.005742 -708.21974 0 2.6052329 10.572641 1.841604 13990.5 + 300 -627.10829 -664.12159 37.013298 1331.8481 -1884.8587 -666.39136 40.786141 -707.1775 0 2.2697693 9.4160685 1.2472271 13990.5 + 350 -626.2729 -665.01858 38.745682 1394.1844 -1433.1302 -667.44315 41.864785 -709.30793 0 2.4245625 10.312641 1.9815612 13990.5 + 400 -625.54274 -661.84438 36.301638 1306.2404 -355.45544 -664.4483 44.370671 -708.81897 0 2.6039276 11.076154 2.1819703 13990.5 + 450 -624.88802 -661.12299 36.234964 1303.8413 -2356.6101 -663.6463 39.57847 -703.22477 0 2.523314 9.8995886 1.3113549 13990.5 + 500 -623.86344 -660.20235 36.338906 1307.5814 462.72862 -662.8515 45.983055 -708.83455 0 2.6491489 10.523732 1.6709561 13990.5 +Loop time of 4.63313 on 4 procs for 500 steps with 432 atoms + +Performance: 18.648 ns/day, 1.287 hours/ns, 107.919 timesteps/s +99.4% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.8133 | 3.5934 | 4.4255 | 36.3 | 77.56 +Bond | 0.00042245 | 0.00050305 | 0.00059825 | 0.0 | 0.01 +Neigh | 0.0411 | 0.041561 | 0.04202 | 0.2 | 0.90 +Comm | 0.15622 | 0.9884 | 1.7686 | 69.2 | 21.33 +Output | 0.00028311 | 0.00031345 | 0.00040011 | 0.0 | 0.01 +Modify | 0.0039899 | 0.00403 | 0.0040654 | 0.0 | 0.09 +Other | | 0.004911 | | | 0.11 + +Nlocal: 108 ave 112 max 106 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Nghost: 6531.75 ave 6611 max 6460 min +Histogram: 1 0 0 1 0 1 0 0 0 1 +Neighs: 74316.2 ave 75641 max 72780 min +Histogram: 1 0 0 1 0 0 0 0 1 1 + +Total # of neighbors = 297265 +Ave neighs/atom = 688.113 +Ave special neighs/atom = 1 +Neighbor list builds = 21 +Dangerous builds = 0 + +unfix thermoberendsen + +# ------------------------ Dynamic Run ------------------------------- + +run 1000 +Per MPI rank memory allocation (min/avg/max) = 6.884 | 7.01 | 7.138 Mbytes +Step TotEng PotEng KinEng Temp Press E_pair E_vdwl E_coul E_long E_bond Fnorm Fmax Volume + 500 -623.86344 -660.20235 36.338906 1307.5814 462.72862 -662.8515 45.983055 -708.83455 0 2.6491489 10.523732 1.6709561 13990.5 + 550 -623.95339 -660.07946 36.126069 1299.9229 -362.67288 -662.8047 44.180832 -706.98553 0 2.725239 11.07199 2.0461377 13990.5 + 600 -624.04508 -661.27298 37.227902 1339.5701 110.39823 -663.90927 45.166569 -709.07584 0 2.6362911 11.747923 2.1846828 13990.5 + 650 -623.9608 -661.50573 37.544934 1350.9779 -1594.4701 -663.91531 41.226571 -705.14188 0 2.4095736 10.022027 1.6264014 13990.5 + 700 -624.00658 -663.55636 39.549777 1423.1181 -588.9804 -665.88666 43.124023 -709.01068 0 2.3302979 9.924587 2.1027837 13990.5 + 750 -623.99813 -659.97695 35.978816 1294.6243 -364.1415 -662.75959 43.973556 -706.73315 0 2.782646 11.487832 1.8799695 13990.5 + 800 -624.01235 -661.04908 37.036728 1332.6911 -85.655852 -663.49204 44.570117 -708.06215 0 2.4429547 11.213149 1.6792926 13990.5 + 850 -624.02581 -659.39933 35.373519 1272.844 -1090.9179 -662.11969 42.375064 -704.49476 0 2.7203673 11.214629 2.2907474 13990.5 + 900 -624.09244 -663.33386 39.241421 1412.0225 303.76207 -666.00593 45.332458 -711.33839 0 2.6720667 11.897188 2.0599033 13990.5 + 950 -624.04544 -661.11578 37.070341 1333.9007 1637.6438 -663.61305 48.65892 -712.27197 0 2.49727 12.343774 2.429225 13990.5 + 1000 -623.95457 -661.51816 37.563586 1351.6491 -851.77182 -663.83594 42.813468 -706.64941 0 2.317782 10.251422 1.6922864 13990.5 + 1050 -623.98731 -662.01988 38.032562 1368.5242 -2123.9075 -664.72609 39.917382 -704.64348 0 2.706218 9.600838 1.7365559 13990.5 + 1100 -623.9653 -659.32023 35.354929 1272.1751 -436.90576 -662.14454 44.057776 -706.20232 0 2.8243167 11.267546 2.6807602 13990.5 + 1150 -624.02273 -665.13902 41.116293 1479.486 -128.13268 -667.4769 44.013761 -711.49066 0 2.3378768 10.406604 1.5102324 13990.5 + 1200 -623.97328 -663.08042 39.107135 1407.1905 -539.63284 -665.67946 43.319308 -708.99877 0 2.599042 10.632657 1.4608707 13990.5 + 1250 -623.92529 -661.81902 37.893723 1363.5284 1708.0621 -664.63624 48.396874 -713.03311 0 2.8172251 11.369352 1.8836979 13990.5 + 1300 -623.99283 -662.19734 38.204509 1374.7114 -820.77291 -664.34556 42.656202 -707.00176 0 2.1482151 10.186898 1.7081329 13990.5 + 1350 -623.99798 -658.70752 34.709535 1248.9519 776.28486 -662.01647 46.925412 -708.94188 0 3.3089536 12.457581 2.5027978 13990.5 + 1400 -623.96941 -662.15959 38.190183 1374.1959 880.21756 -664.90452 46.628183 -711.5327 0 2.7449282 11.918894 3.0466188 13990.5 + 1450 -623.95068 -662.25435 38.303671 1378.2795 -391.56711 -664.7631 43.644066 -708.40716 0 2.5087493 10.465803 1.8744864 13990.5 + 1500 -624.00637 -661.48756 37.481185 1348.684 430.69453 -664.32151 45.704366 -710.02587 0 2.8339501 11.650821 2.0752813 13990.5 +Loop time of 6.7003 on 4 procs for 1000 steps with 432 atoms + +Performance: 25.790 ns/day, 0.931 hours/ns, 149.247 timesteps/s +99.1% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.9613 | 6.0752 | 6.2064 | 4.1 | 90.67 +Bond | 0.00087095 | 0.00088993 | 0.00091671 | 0.0 | 0.01 +Neigh | 0.06494 | 0.064964 | 0.064987 | 0.0 | 0.97 +Comm | 0.41743 | 0.54863 | 0.6626 | 13.8 | 8.19 +Output | 0.00053867 | 0.00059268 | 0.00074867 | 0.0 | 0.01 +Modify | 0.0013288 | 0.0013592 | 0.0013841 | 0.1 | 0.02 +Other | | 0.008613 | | | 0.13 + +Nlocal: 108 ave 116 max 102 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 6504.5 ave 6624 max 6380 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Neighs: 74267 ave 79230 max 70993 min +Histogram: 2 0 0 0 0 1 0 0 0 1 + +Total # of neighbors = 297068 +Ave neighs/atom = 687.657 +Ave special neighs/atom = 1 +Neighbor list builds = 45 +Dangerous builds = 0 +Total wall time: 0:00:11 diff --git a/examples/gcmc/in.gcmc.co2 b/examples/gcmc/in.gcmc.co2 index d11ef72fdd..bb6916fc48 100644 --- a/examples/gcmc/in.gcmc.co2 +++ b/examples/gcmc/in.gcmc.co2 @@ -58,15 +58,24 @@ timestep 1.0 # rigid constraints with thermostat -fix myrigidnvt all rigid/nvt/small molecule temp ${temp} ${temp} 100 mol co2mol +fix myrigidnvt co2 rigid/nvt/small molecule temp ${temp} ${temp} 100 mol co2mol fix_modify myrigidnvt dynamic/dof no # gcmc variable tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans) -fix mygcmc all gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol & +fix mygcmc co2 gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol & co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt +# atom counts + +variable carbon atom "type==1" +variable oxygen atom "type==2" +group carbon dynamic co2 var carbon +group oxygen dynamic co2 var oxygen +variable nC equal count(carbon) +variable nO equal count(oxygen) + # output variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1) @@ -74,7 +83,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1) variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1) compute_modify thermo_temp dynamic/dof yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO thermo 1000 # run diff --git a/examples/gcmc/in.gcmc.h2o b/examples/gcmc/in.gcmc.h2o index 7ffaafa975..2c03b1ab78 100644 --- a/examples/gcmc/in.gcmc.h2o +++ b/examples/gcmc/in.gcmc.h2o @@ -72,6 +72,15 @@ variable tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans) fix mygcmc all gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol & h2omol tfac_insert ${tfac} group h2o shake wshake +# atom counts + +variable oxygen atom "type==1" +variable hydrogen atom "type==2" +group oxygen dynamic all var oxygen +group hydrogen dynamic all var hydrogen +variable nO equal count(oxygen) +variable nH equal count(hydrogen) + # output variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1) @@ -79,7 +88,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1) variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1) compute_modify thermo_temp dynamic/dof yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH thermo 1000 # run diff --git a/examples/gcmc/in.gcmc.lj b/examples/gcmc/in.gcmc.lj index fc9afdb7f8..a1c7c6eb10 100644 --- a/examples/gcmc/in.gcmc.lj +++ b/examples/gcmc/in.gcmc.lj @@ -29,9 +29,19 @@ create_box 1 box pair_coeff * * 1.0 1.0 mass * 1.0 +# we recommend setting up a dedicated group for gcmc + +group gcmcgroup type 1 + # gcmc -fix mygcmc all gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp} +fix mygcmc gcmcgroup gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp} + +# atom count + +variable type1 atom "type==1" +group type1 dynamic gcmcgroup var type1 +variable n1 equal count(type1) # averaging @@ -40,10 +50,11 @@ variable p equal press variable nugget equal 1.0e-8 variable lambda equal 1.0 variable muex equal ${mu}-${temp}*ln(density*${lambda}+${nugget}) -fix ave all ave/time 10 100 1000 v_rho v_p v_muex ave one file rho_vs_p.dat +fix ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat variable rhoav equal f_ave[1] variable pav equal f_ave[2] variable muexav equal f_ave[3] +variable n1av equal f_ave[4] # output @@ -51,7 +62,7 @@ variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+${nugget}) variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+${nugget}) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget}) compute_modify thermo_temp dynamic yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av thermo 1000 # run diff --git a/examples/gcmc/log.6Jul17.gcmc.co2.g++.1 b/examples/gcmc/log.23Oct17.gcmc.co2.g++.1 similarity index 81% rename from examples/gcmc/log.6Jul17.gcmc.co2.g++.1 rename to examples/gcmc/log.23Oct17.gcmc.co2.g++.1 index f9e494c43f..e7b7c6afda 100644 --- a/examples/gcmc/log.6Jul17.gcmc.co2.g++.1 +++ b/examples/gcmc/log.23Oct17.gcmc.co2.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (6 Jul 2017) +LAMMPS (23 Oct 2017) using 1 OpenMP thread(s) per MPI task # GCMC for CO2 molecular fluid, rigid/small/nvt dynamics # Rigid CO2 TraPPE model @@ -46,6 +46,7 @@ Read molecule co2mol: 0 impropers with 0 types create_atoms 0 box mol co2mol 464563 units box Created 24 atoms + Time spent = 0.00196958 secs # rigid CO2 TraPPE model @@ -87,6 +88,17 @@ fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol co2mol tfac_insert 1.66666666666667 group co2 rigid myrigidnvt +# atom counts + +variable carbon atom "type==1" +variable oxygen atom "type==2" +group carbon dynamic all var carbon +dynamic group carbon defined +group oxygen dynamic all var oxygen +dynamic group oxygen defined +variable nC equal count(carbon) +variable nO equal count(oxygen) + # output variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1) @@ -94,7 +106,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1) variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1) compute_modify thermo_temp dynamic/dof yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO thermo 1000 # run @@ -124,45 +136,45 @@ Neighbor list info ... stencil: half/bin/3d/newton bin: standard Per MPI rank memory allocation (min/avg/max) = 15.62 | 15.62 | 15.62 Mbytes -Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc - 0 364.27579 4238.8631 -9.6809388 13.391989 0.5846359 24 0 0 0 0 +Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO + 0 364.27579 4238.8631 -9.6809388 13.391989 0.5846359 24 0 0 0 0 8 16 WARNING: Using kspace solver on system with no charge (../kspace.cpp:289) - 1000 420.43475 1722.4052 -9.6956123 15.456579 0.5846359 24 0.20879341 0.20713005 0 0 - 2000 302.29516 -547.83641 -22.017674 14.11699 0.73079488 30 0.1742478 0.1678018 0 0 - 3000 316.6934 -1080.2672 -8.2218891 10.069364 0.51155641 21 0.13544917 0.13720634 0 0 - 4000 246.81618 -679.83642 -14.577244 10.29997 0.65771539 27 0.1568939 0.15860229 0 0 - 5000 260.22849 -896.29914 -16.097593 10.859684 0.65771539 27 0.13138744 0.13547049 0 0 - 6000 291.70796 -1521.99 -22.303136 13.622574 0.73079488 30 0.12615476 0.12717694 0 0 - 7000 236.02638 -599.92186 -27.580831 13.367447 0.87695385 36 0.119703 0.12145398 0 0 - 8000 321.45341 688.10577 -10.09204 11.817696 0.5846359 24 0.10917411 0.11032646 0 0 - 9000 502.85382 -302.31056 -0.22330142 0.99927447 0.073079488 3 0.1254105 0.12905828 0 0 - 10000 249.98239 -510.0091 -32.815145 15.399767 0.95003334 39 0.1274504 0.12875623 0 0 - 11000 247.59424 -1129.0274 -25.320205 12.792544 0.80387436 33 0.11739076 0.11916784 0 0 - 12000 0 -20.39554 -0.14872889 -0 0 0 0.1254933 0.12920375 0 0 - 13000 1272.2738 -474.79484 -0.29450485 8.8489483 0.14615898 6 0.13767133 0.14112496 0 0 - 14000 516.54246 -36.296516 -5.0012009 11.291243 0.36539744 15 0.15632744 0.15955377 0 0 - 15000 307.09233 1951.9301 -14.820362 12.815375 0.65771539 27 0.15393544 0.15716192 0 0 - 16000 198.31989 -559.48443 -30.459487 11.231925 0.87695385 36 0.1482565 0.15025652 0 0 - 17000 246.99311 657.85683 -18.579206 11.53442 0.73079488 30 0.14143958 0.14375423 0 0 - 18000 467.13468 167.03738 -1.0945268 5.569759 0.21923846 9 0.13847359 0.14098533 0 0 - 19000 359.54027 -1413.5407 -12.156233 13.217895 0.5846359 24 0.15169146 0.15294205 0 0 - 20000 227.79597 -1204.5652 -23.24144 10.637925 0.73079488 30 0.14917199 0.15022946 0 0 -Loop time of 20.153 on 1 procs for 20000 steps with 30 atoms + 1000 420.43475 1722.4052 -9.6956123 15.456579 0.5846359 24 0.20879341 0.20713005 0 0 8 16 + 2000 302.29516 -547.83641 -22.017674 14.11699 0.73079488 30 0.1742478 0.1678018 0 0 10 20 + 3000 316.6934 -1080.2672 -8.2218891 10.069364 0.51155641 21 0.13544917 0.13720634 0 0 7 14 + 4000 246.81618 -679.83642 -14.577244 10.29997 0.65771539 27 0.1568939 0.15860229 0 0 9 18 + 5000 260.22849 -896.29914 -16.097593 10.859684 0.65771539 27 0.13138744 0.13547049 0 0 9 18 + 6000 291.70796 -1521.99 -22.303136 13.622574 0.73079488 30 0.12615476 0.12717694 0 0 10 20 + 7000 236.02638 -599.92186 -27.580831 13.367447 0.87695385 36 0.119703 0.12145398 0 0 12 24 + 8000 321.45341 688.10577 -10.09204 11.817696 0.5846359 24 0.10917411 0.11032646 0 0 8 16 + 9000 502.85382 -302.31056 -0.22330142 0.99927447 0.073079488 3 0.1254105 0.12905828 0 0 1 2 + 10000 249.98239 -510.0091 -32.815145 15.399767 0.95003334 39 0.1274504 0.12875623 0 0 13 26 + 11000 247.59424 -1129.0274 -25.320205 12.792544 0.80387436 33 0.11739076 0.11916784 0 0 11 22 + 12000 0 -20.39554 -0.14872889 -0 0 0 0.1254933 0.12920375 0 0 0 0 + 13000 1272.2738 -474.79484 -0.29450485 8.8489483 0.14615898 6 0.13767133 0.14112496 0 0 2 4 + 14000 516.54246 -36.296516 -5.0012009 11.291243 0.36539744 15 0.15632744 0.15955377 0 0 5 10 + 15000 307.09233 1951.9301 -14.820362 12.815375 0.65771539 27 0.15393544 0.15716192 0 0 9 18 + 16000 198.31989 -559.48443 -30.459487 11.231925 0.87695385 36 0.1482565 0.15025652 0 0 12 24 + 17000 246.99311 657.85683 -18.579206 11.53442 0.73079488 30 0.14143958 0.14375423 0 0 10 20 + 18000 467.13468 167.03738 -1.0945268 5.569759 0.21923846 9 0.13847359 0.14098533 0 0 3 6 + 19000 359.54027 -1413.5407 -12.156233 13.217895 0.5846359 24 0.15169146 0.15294205 0 0 8 16 + 20000 227.79597 -1204.5652 -23.24144 10.637925 0.73079488 30 0.14917199 0.15022946 0 0 10 20 +Loop time of 20.6928 on 1 procs for 20000 steps with 30 atoms -Performance: 85.744 ns/day, 0.280 hours/ns, 992.408 timesteps/s -99.3% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 83.507 ns/day, 0.287 hours/ns, 966.519 timesteps/s +99.2% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.5352 | 2.5352 | 2.5352 | 0.0 | 12.58 -Bond | 0.026112 | 0.026112 | 0.026112 | 0.0 | 0.13 -Kspace | 0.25 | 0.25 | 0.25 | 0.0 | 1.24 -Neigh | 0.10364 | 0.10364 | 0.10364 | 0.0 | 0.51 -Comm | 0.22907 | 0.22907 | 0.22907 | 0.0 | 1.14 -Output | 0.0013065 | 0.0013065 | 0.0013065 | 0.0 | 0.01 -Modify | 16.957 | 16.957 | 16.957 | 0.0 | 84.14 -Other | | 0.05061 | | | 0.25 +Pair | 2.5462 | 2.5462 | 2.5462 | 0.0 | 12.30 +Bond | 0.029783 | 0.029783 | 0.029783 | 0.0 | 0.14 +Kspace | 0.26167 | 0.26167 | 0.26167 | 0.0 | 1.26 +Neigh | 0.10705 | 0.10705 | 0.10705 | 0.0 | 0.52 +Comm | 0.23409 | 0.23409 | 0.23409 | 0.0 | 1.13 +Output | 0.0013416 | 0.0013416 | 0.0013416 | 0.0 | 0.01 +Modify | 17.458 | 17.458 | 17.458 | 0.0 | 84.37 +Other | | 0.05433 | | | 0.26 Nlocal: 30 ave 30 max 30 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gcmc/log.6Jul17.gcmc.co2.g++.4 b/examples/gcmc/log.23Oct17.gcmc.co2.g++.4 similarity index 81% rename from examples/gcmc/log.6Jul17.gcmc.co2.g++.4 rename to examples/gcmc/log.23Oct17.gcmc.co2.g++.4 index 0df25430d2..b344c7b068 100644 --- a/examples/gcmc/log.6Jul17.gcmc.co2.g++.4 +++ b/examples/gcmc/log.23Oct17.gcmc.co2.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (6 Jul 2017) +LAMMPS (23 Oct 2017) using 1 OpenMP thread(s) per MPI task # GCMC for CO2 molecular fluid, rigid/small/nvt dynamics # Rigid CO2 TraPPE model @@ -46,6 +46,7 @@ Read molecule co2mol: 0 impropers with 0 types create_atoms 0 box mol co2mol 464563 units box Created 24 atoms + Time spent = 0.00261331 secs # rigid CO2 TraPPE model @@ -87,6 +88,17 @@ fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol co2mol tfac_insert 1.66666666666667 group co2 rigid myrigidnvt +# atom counts + +variable carbon atom "type==1" +variable oxygen atom "type==2" +group carbon dynamic all var carbon +dynamic group carbon defined +group oxygen dynamic all var oxygen +dynamic group oxygen defined +variable nC equal count(carbon) +variable nO equal count(oxygen) + # output variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1) @@ -94,7 +106,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1) variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1) compute_modify thermo_temp dynamic/dof yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO thermo 1000 # run @@ -124,45 +136,45 @@ Neighbor list info ... stencil: half/bin/3d/newton bin: standard Per MPI rank memory allocation (min/avg/max) = 15.41 | 15.41 | 15.41 Mbytes -Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc - 0 386.52184 23582.465 -3.2433417 14.209828 0.5846359 24 0 0 0 0 +Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO + 0 386.52184 23582.465 -3.2433417 14.209828 0.5846359 24 0 0 0 0 8 16 WARNING: Using kspace solver on system with no charge (../kspace.cpp:289) - 1000 335.66829 -3.7743052 -4.6268612 7.3374649 0.36539744 15 0.20601899 0.20787963 0 0 - 2000 459.73529 238.91592 -0.42937831 5.4815343 0.21923846 9 0.30392058 0.30105616 0 0 - 3000 255.47773 -479.67802 -36.850434 15.738299 0.95003334 39 0.22220744 0.2197582 0 0 - 4000 182.70803 -1059.2262 -43.044833 12.163134 1.0231128 42 0.16781689 0.16716177 0 0 - 5000 234.00907 -1821.0444 -46.04795 15.578317 1.0231128 42 0.13498091 0.13704201 0 0 - 6000 163.42759 -774.67294 -49.686261 11.691518 1.0961923 45 0.11401677 0.11296973 0 0 - 7000 171.64616 -355.23516 -49.323434 12.27947 1.0961923 45 0.098302308 0.098552065 0 0 - 8000 251.29791 -905.47863 -37.841209 15.480807 0.95003334 39 0.086856972 0.08638658 0 0 - 9000 143.69498 -849.95393 -49.073188 10.279858 1.0961923 45 0.078261061 0.077955243 0 0 - 10000 239.35727 -1158.1879 -43.562047 15.934355 1.0231128 42 0.070789792 0.070807529 0 0 - 11000 169.51213 -1574.7885 -51.125228 12.126803 1.0961923 45 0.065008734 0.06498871 0 0 - 12000 181.39739 160.11631 -46.850937 12.977068 1.0961923 45 0.059648717 0.059514803 0 0 - 13000 164.14601 -1107.7629 -50.726722 11.742914 1.0961923 45 0.055207333 0.055097701 0 0 - 14000 287.26285 418.51463 -41.664766 19.123497 1.0231128 42 0.051346789 0.051222285 0 0 - 15000 256.94593 -532.36615 -41.651618 17.105257 1.0231128 42 0.047870301 0.047861685 0 0 - 16000 166.92132 151.15933 -39.957018 11.11219 1.0231128 42 0.045205599 0.045042211 0 0 - 17000 163.22452 -1299.8119 -42.677558 10.866089 1.0231128 42 0.043122086 0.042993687 0 0 - 18000 158.01154 475.77329 -48.803162 11.304057 1.0961923 45 0.041016683 0.040647229 0 0 - 19000 138.49297 -1585.1508 -47.517099 9.9077098 1.0961923 45 0.038929287 0.038436764 0 0 - 20000 173.84439 -1362.6301 -53.002743 12.436731 1.0961923 45 0.036973919 0.036523816 0 0 -Loop time of 31.8386 on 4 procs for 20000 steps with 45 atoms + 1000 335.66829 -3.7743052 -4.6268612 7.3374649 0.36539744 15 0.20601899 0.20787963 0 0 5 10 + 2000 459.73529 238.91592 -0.42937831 5.4815343 0.21923846 9 0.30392058 0.30105616 0 0 3 6 + 3000 255.47773 -479.67802 -36.850434 15.738299 0.95003334 39 0.22220744 0.2197582 0 0 13 26 + 4000 182.70803 -1059.2262 -43.044833 12.163134 1.0231128 42 0.16781689 0.16716177 0 0 14 28 + 5000 234.00907 -1821.0444 -46.04795 15.578317 1.0231128 42 0.13498091 0.13704201 0 0 14 28 + 6000 163.42759 -774.67294 -49.686261 11.691518 1.0961923 45 0.11401677 0.11296973 0 0 15 30 + 7000 171.64616 -355.23516 -49.323434 12.27947 1.0961923 45 0.098302308 0.098552065 0 0 15 30 + 8000 251.29791 -905.47863 -37.841209 15.480807 0.95003334 39 0.086856972 0.08638658 0 0 13 26 + 9000 143.69498 -849.95393 -49.073188 10.279858 1.0961923 45 0.078261061 0.077955243 0 0 15 30 + 10000 239.35727 -1158.1879 -43.562047 15.934355 1.0231128 42 0.070789792 0.070807529 0 0 14 28 + 11000 169.51213 -1574.7885 -51.125228 12.126803 1.0961923 45 0.065008734 0.06498871 0 0 15 30 + 12000 181.39739 160.11631 -46.850937 12.977068 1.0961923 45 0.059648717 0.059514803 0 0 15 30 + 13000 164.14601 -1107.7629 -50.726722 11.742914 1.0961923 45 0.055207333 0.055097701 0 0 15 30 + 14000 287.26285 418.51463 -41.664766 19.123497 1.0231128 42 0.051346789 0.051222285 0 0 14 28 + 15000 256.94593 -532.36615 -41.651618 17.105257 1.0231128 42 0.047870301 0.047861685 0 0 14 28 + 16000 166.92132 151.15933 -39.957018 11.11219 1.0231128 42 0.045205599 0.045042211 0 0 14 28 + 17000 163.22452 -1299.8119 -42.677558 10.866089 1.0231128 42 0.043122086 0.042993687 0 0 14 28 + 18000 158.01154 475.77329 -48.803162 11.304057 1.0961923 45 0.041016683 0.040647229 0 0 15 30 + 19000 138.49297 -1585.1508 -47.517099 9.9077098 1.0961923 45 0.038929287 0.038436764 0 0 15 30 + 20000 173.84439 -1362.6301 -53.002743 12.436731 1.0961923 45 0.036973919 0.036523816 0 0 15 30 +Loop time of 32.4481 on 4 procs for 20000 steps with 45 atoms -Performance: 54.274 ns/day, 0.442 hours/ns, 628.168 timesteps/s -98.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 53.254 ns/day, 0.451 hours/ns, 616.369 timesteps/s +98.4% 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.1546 | 1.6687 | 2.1338 | 29.5 | 5.24 -Bond | 0.019769 | 0.020369 | 0.02132 | 0.4 | 0.06 -Kspace | 0.53392 | 0.99911 | 1.5116 | 37.8 | 3.14 -Neigh | 0.06737 | 0.067842 | 0.068412 | 0.2 | 0.21 -Comm | 1.9408 | 1.9582 | 1.9733 | 1.1 | 6.15 -Output | 0.0019503 | 0.0020472 | 0.0022476 | 0.3 | 0.01 -Modify | 26.974 | 26.99 | 27.001 | 0.2 | 84.77 -Other | | 0.1322 | | | 0.42 +Pair | 1.1687 | 1.6702 | 2.1864 | 30.8 | 5.15 +Bond | 0.018828 | 0.020035 | 0.020975 | 0.6 | 0.06 +Kspace | 0.57506 | 1.0931 | 1.5898 | 37.7 | 3.37 +Neigh | 0.068863 | 0.069524 | 0.070128 | 0.2 | 0.21 +Comm | 2.0735 | 2.0865 | 2.0979 | 0.7 | 6.43 +Output | 0.0025017 | 0.0025966 | 0.0027781 | 0.2 | 0.01 +Modify | 27.335 | 27.344 | 27.363 | 0.2 | 84.27 +Other | | 0.1621 | | | 0.50 Nlocal: 11.25 ave 14 max 8 min Histogram: 1 0 0 0 0 1 1 0 0 1 @@ -177,4 +189,4 @@ Ave special neighs/atom = 2 Neighbor list builds = 20394 Dangerous builds = 0 -Total wall time: 0:00:31 +Total wall time: 0:00:32 diff --git a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.1 b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.1 similarity index 77% rename from examples/gcmc/log.6Jul17.gcmc.h2o.g++.1 rename to examples/gcmc/log.23Oct17.gcmc.h2o.g++.1 index 3b1606e65d..bc7c3af454 100644 --- a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.1 +++ b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (6 Jul 2017) +LAMMPS (23 Oct 2017) using 1 OpenMP thread(s) per MPI task # fix gcmc example with fix shake @@ -51,6 +51,7 @@ Read molecule h2omol: 0 impropers with 0 types create_atoms 0 box mol h2omol 464563 units box Created 24 atoms + Time spent = 0.00201297 secs # rigid SPC/E water model @@ -100,9 +101,9 @@ Per MPI rank memory allocation (min/avg/max) = 11.88 | 11.88 | 11.88 Mbytes Step Temp E_pair E_mol TotEng Press 0 338 -4.1890564 9.2628112e-06 18.98377 739.06991 100 338 -30.182886 0.85607237 -6.1539961 -2535.3207 -Loop time of 0.0525794 on 1 procs for 100 steps with 24 atoms +Loop time of 0.0507543 on 1 procs for 100 steps with 24 atoms -99.4% CPU use with 1 MPI tasks x 1 OpenMP threads +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads Minimization stats: Stopping criterion = max iterations @@ -116,14 +117,14 @@ Minimization stats: MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.044199 | 0.044199 | 0.044199 | 0.0 | 84.06 -Bond | 0.00049019 | 0.00049019 | 0.00049019 | 0.0 | 0.93 -Kspace | 0.0031631 | 0.0031631 | 0.0031631 | 0.0 | 6.02 -Neigh | 0.00046444 | 0.00046444 | 0.00046444 | 0.0 | 0.88 -Comm | 0.0034101 | 0.0034101 | 0.0034101 | 0.0 | 6.49 -Output | 1.9073e-05 | 1.9073e-05 | 1.9073e-05 | 0.0 | 0.04 +Pair | 0.042597 | 0.042597 | 0.042597 | 0.0 | 83.93 +Bond | 0.00047708 | 0.00047708 | 0.00047708 | 0.0 | 0.94 +Kspace | 0.0031135 | 0.0031135 | 0.0031135 | 0.0 | 6.13 +Neigh | 0.00045919 | 0.00045919 | 0.00045919 | 0.0 | 0.90 +Comm | 0.0032997 | 0.0032997 | 0.0032997 | 0.0 | 6.50 +Output | 1.359e-05 | 1.359e-05 | 1.359e-05 | 0.0 | 0.03 Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 0.0008333 | | | 1.58 +Other | | 0.0007946 | | | 1.57 Nlocal: 24 ave 24 max 24 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -164,22 +165,22 @@ Per MPI rank memory allocation (min/avg/max) = 11.63 | 11.63 | 11.63 Mbytes Step Temp E_pair E_mol TotEng Press 0 518.26667 -30.182886 0 -7.0100684 993.1985 1000 326.9865 -62.258445 0 -47.638175 -5.3440813 -Loop time of 0.14263 on 1 procs for 1000 steps with 24 atoms +Loop time of 0.141449 on 1 procs for 1000 steps with 24 atoms -Performance: 605.764 ns/day, 0.040 hours/ns, 7011.155 timesteps/s -99.5% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 610.819 ns/day, 0.039 hours/ns, 7069.663 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.10849 | 0.10849 | 0.10849 | 0.0 | 76.07 -Bond | 0.00015426 | 0.00015426 | 0.00015426 | 0.0 | 0.11 -Kspace | 0.01205 | 0.01205 | 0.01205 | 0.0 | 8.45 -Neigh | 0.0046577 | 0.0046577 | 0.0046577 | 0.0 | 3.27 -Comm | 0.011531 | 0.011531 | 0.011531 | 0.0 | 8.08 -Output | 1.6212e-05 | 1.6212e-05 | 1.6212e-05 | 0.0 | 0.01 -Modify | 0.0037699 | 0.0037699 | 0.0037699 | 0.0 | 2.64 -Other | | 0.001957 | | | 1.37 +Pair | 0.10788 | 0.10788 | 0.10788 | 0.0 | 76.27 +Bond | 0.00018954 | 0.00018954 | 0.00018954 | 0.0 | 0.13 +Kspace | 0.011867 | 0.011867 | 0.011867 | 0.0 | 8.39 +Neigh | 0.0045254 | 0.0045254 | 0.0045254 | 0.0 | 3.20 +Comm | 0.011277 | 0.011277 | 0.011277 | 0.0 | 7.97 +Output | 1.5497e-05 | 1.5497e-05 | 1.5497e-05 | 0.0 | 0.01 +Modify | 0.00383 | 0.00383 | 0.00383 | 0.0 | 2.71 +Other | | 0.001868 | | | 1.32 Nlocal: 24 ave 24 max 24 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -201,6 +202,17 @@ fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol h2omol tfac_insert ${tfac} group h2o shake wshake fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol h2omol tfac_insert 1.66666666666667 group h2o shake wshake +# atom counts + +variable oxygen atom "type==1" +variable hydrogen atom "type==2" +group oxygen dynamic all var oxygen +dynamic group oxygen defined +group hydrogen dynamic all var hydrogen +dynamic group hydrogen defined +variable nO equal count(oxygen) +variable nH equal count(hydrogen) + # output variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1) @@ -208,7 +220,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1) variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1) compute_modify thermo_temp dynamic/dof yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH thermo 1000 # run @@ -226,44 +238,44 @@ WARNING: Fix gcmc using full_energy option (../fix_gcmc.cpp:445) 0 atoms in group FixGCMC:rotation_gas_atoms:mygcmc WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (../neighbor.cpp:472) Per MPI rank memory allocation (min/avg/max) = 11.63 | 11.63 | 11.63 Mbytes -Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc - 1000 326.9865 -4.3509713 -62.258445 14.62027 0.23910963 24 0 0 0 0 - 2000 116.99793 -5344.1527 -286.61595 17.088682 0.74721761 75 0.048183096 0.013941446 0 0 - 3000 106.86746 -3920.4926 -361.60598 18.794545 0.89666113 90 0.035637919 0.012768883 0 0 - 4000 75.002668 540.46846 -414.8511 14.531966 0.98632724 99 0.025963651 0.0093451705 0 0 - 5000 79.924788 -2131.1173 -437.21216 15.962121 1.0162159 102 0.019879728 0.0070418993 0 0 - 6000 95.552773 -3647.0233 -438.24276 19.083253 1.0162159 102 0.015753613 0.0056885133 0 0 - 7000 79.501736 -2071.5369 -440.77351 15.877631 1.0162159 102 0.01326216 0.0046915318 0 0 - 8000 62.567091 -3102.9616 -442.21884 12.495541 1.0162159 102 0.011305503 0.0040437885 0 0 - 9000 68.324047 -3812.7866 -440.46835 13.645287 1.0162159 102 0.0099549538 0.0035157329 0 0 - 10000 83.857631 -2158.2659 -444.8183 16.747566 1.0162159 102 0.0088200922 0.0031354281 0 0 - 11000 68.350984 -2084.0789 -440.14081 13.650667 1.0162159 102 0.0081331455 0.0030247424 0 0 - 12000 76.867315 -1585.6723 -443.36199 15.3515 1.0162159 102 0.0073845932 0.0027532534 0 0 - 13000 59.74266 -2211.0211 -446.07791 11.931462 1.0162159 102 0.0067756276 0.0025213898 0 0 - 14000 81.154979 -907.0176 -441.53368 16.207808 1.0162159 102 0.0062527642 0.0023280719 0 0 - 15000 66.814346 -2804.5134 -455.80704 13.7421 1.0461046 105 0.0059590528 0.0021576214 0 0 - 16000 71.42983 -3930.4004 -458.43218 14.691394 1.0461046 105 0.0055547473 0.0020163729 0 0 - 17000 89.624855 -3569.8136 -455.18164 18.433672 1.0461046 105 0.0052173265 0.0018867687 0 0 - 18000 63.519962 -1882.8157 -456.58939 13.064525 1.0461046 105 0.0049082049 0.0017765986 0 0 - 19000 71.872698 -2243.5046 -454.93359 14.782481 1.0461046 105 0.0046439115 0.0016748361 0 0 - 20000 73.660765 -2285.3173 -476.35473 15.589381 1.0759934 108 0.0045124933 0.0015837653 0 0 - 21000 95.675868 987.92089 -475.46736 20.248603 1.0759934 108 0.004285814 0.0015049513 0 0 -Loop time of 226.155 on 1 procs for 20000 steps with 108 atoms +Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH + 1000 326.9865 -4.3509713 -62.258445 14.62027 0.23910963 24 0 0 0 0 8 16 + 2000 116.99793 -5344.1527 -286.61595 17.088682 0.74721761 75 0.048183096 0.013941446 0 0 25 50 + 3000 106.86746 -3920.4926 -361.60598 18.794545 0.89666113 90 0.035637919 0.012768883 0 0 30 60 + 4000 75.002668 540.46846 -414.8511 14.531966 0.98632724 99 0.025963651 0.0093451705 0 0 33 66 + 5000 79.924788 -2131.1173 -437.21216 15.962121 1.0162159 102 0.019879728 0.0070418993 0 0 34 68 + 6000 95.552773 -3647.0233 -438.24276 19.083253 1.0162159 102 0.015753613 0.0056885133 0 0 34 68 + 7000 79.501736 -2071.5369 -440.77351 15.877631 1.0162159 102 0.01326216 0.0046915318 0 0 34 68 + 8000 62.567091 -3102.9616 -442.21884 12.495541 1.0162159 102 0.011305503 0.0040437885 0 0 34 68 + 9000 68.324047 -3812.7866 -440.46835 13.645287 1.0162159 102 0.0099549538 0.0035157329 0 0 34 68 + 10000 83.857631 -2158.2659 -444.8183 16.747566 1.0162159 102 0.0088200922 0.0031354281 0 0 34 68 + 11000 68.350984 -2084.0789 -440.14081 13.650667 1.0162159 102 0.0081331455 0.0030247424 0 0 34 68 + 12000 76.867315 -1585.6723 -443.36199 15.3515 1.0162159 102 0.0073845932 0.0027532534 0 0 34 68 + 13000 59.74266 -2211.0211 -446.07791 11.931462 1.0162159 102 0.0067756276 0.0025213898 0 0 34 68 + 14000 81.154979 -907.0176 -441.53368 16.207808 1.0162159 102 0.0062527642 0.0023280719 0 0 34 68 + 15000 66.814346 -2804.5134 -455.80704 13.7421 1.0461046 105 0.0059590528 0.0021576214 0 0 35 70 + 16000 71.42983 -3930.4004 -458.43218 14.691394 1.0461046 105 0.0055547473 0.0020163729 0 0 35 70 + 17000 89.624855 -3569.8136 -455.18164 18.433672 1.0461046 105 0.0052173265 0.0018867687 0 0 35 70 + 18000 63.519962 -1882.8157 -456.58939 13.064525 1.0461046 105 0.0049082049 0.0017765986 0 0 35 70 + 19000 71.872698 -2243.5046 -454.93359 14.782481 1.0461046 105 0.0046439115 0.0016748361 0 0 35 70 + 20000 73.660765 -2285.3173 -476.35473 15.589381 1.0759934 108 0.0045124933 0.0015837653 0 0 36 72 + 21000 95.675868 987.92089 -475.46736 20.248603 1.0759934 108 0.004285814 0.0015049513 0 0 36 72 +Loop time of 220.662 on 1 procs for 20000 steps with 108 atoms -Performance: 7.641 ns/day, 3.141 hours/ns, 88.435 timesteps/s -99.2% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 7.831 ns/day, 3.065 hours/ns, 90.637 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 38.053 | 38.053 | 38.053 | 0.0 | 16.83 -Bond | 0.089673 | 0.089673 | 0.089673 | 0.0 | 0.04 -Kspace | 0.92778 | 0.92778 | 0.92778 | 0.0 | 0.41 -Neigh | 1.2619 | 1.2619 | 1.2619 | 0.0 | 0.56 -Comm | 0.97483 | 0.97483 | 0.97483 | 0.0 | 0.43 -Output | 0.0013306 | 0.0013306 | 0.0013306 | 0.0 | 0.00 -Modify | 184.68 | 184.68 | 184.68 | 0.0 | 81.66 -Other | | 0.171 | | | 0.08 +Pair | 37.459 | 37.459 | 37.459 | 0.0 | 16.98 +Bond | 0.087067 | 0.087067 | 0.087067 | 0.0 | 0.04 +Kspace | 0.90234 | 0.90234 | 0.90234 | 0.0 | 0.41 +Neigh | 1.2299 | 1.2299 | 1.2299 | 0.0 | 0.56 +Comm | 0.95437 | 0.95437 | 0.95437 | 0.0 | 0.43 +Output | 0.0010636 | 0.0010636 | 0.0010636 | 0.0 | 0.00 +Modify | 179.85 | 179.85 | 179.85 | 0.0 | 81.51 +Other | | 0.1754 | | | 0.08 Nlocal: 108 ave 108 max 108 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -278,4 +290,4 @@ Ave special neighs/atom = 2 Neighbor list builds = 20439 Dangerous builds = 0 -Total wall time: 0:03:46 +Total wall time: 0:03:40 diff --git a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.4 b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.4 similarity index 78% rename from examples/gcmc/log.6Jul17.gcmc.h2o.g++.4 rename to examples/gcmc/log.23Oct17.gcmc.h2o.g++.4 index c04b25f45e..4eeab969dd 100644 --- a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.4 +++ b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (6 Jul 2017) +LAMMPS (23 Oct 2017) using 1 OpenMP thread(s) per MPI task # fix gcmc example with fix shake @@ -51,6 +51,7 @@ Read molecule h2omol: 0 impropers with 0 types create_atoms 0 box mol h2omol 464563 units box Created 24 atoms + Time spent = 0.00174451 secs # rigid SPC/E water model @@ -100,9 +101,9 @@ Per MPI rank memory allocation (min/avg/max) = 11.85 | 11.85 | 11.85 Mbytes Step Temp E_pair E_mol TotEng Press 0 338 -4.9610706 9.2628112e-06 18.211756 730.90791 100 338 -15.742442 0.14954269 7.579918 -637.49568 -Loop time of 0.0828406 on 4 procs for 100 steps with 24 atoms +Loop time of 0.0566185 on 4 procs for 100 steps with 24 atoms -98.7% CPU use with 4 MPI tasks x 1 OpenMP threads +98.8% CPU use with 4 MPI tasks x 1 OpenMP threads Minimization stats: Stopping criterion = max iterations @@ -116,14 +117,14 @@ Minimization stats: MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.012844 | 0.025471 | 0.047008 | 8.1 | 30.75 -Bond | 0.00038934 | 0.00046468 | 0.00054336 | 0.0 | 0.56 -Kspace | 0.0061138 | 0.027556 | 0.04014 | 7.8 | 33.26 +Pair | 0.0085177 | 0.016083 | 0.026787 | 5.3 | 28.41 +Bond | 0.00022459 | 0.00031394 | 0.00037575 | 0.0 | 0.55 +Kspace | 0.0049062 | 0.014122 | 0.02044 | 5.0 | 24.94 Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.023276 | 0.023636 | 0.023804 | 0.1 | 28.53 -Output | 3.171e-05 | 3.3557e-05 | 3.8147e-05 | 0.0 | 0.04 +Comm | 0.018515 | 0.02086 | 0.023246 | 1.2 | 36.84 +Output | 2.4796e-05 | 2.6047e-05 | 2.9802e-05 | 0.0 | 0.05 Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 0.00568 | | | 6.86 +Other | | 0.005213 | | | 9.21 Nlocal: 6 ave 8 max 3 min Histogram: 1 0 0 0 1 0 0 0 0 2 @@ -164,22 +165,22 @@ Per MPI rank memory allocation (min/avg/max) = 11.6 | 11.6 | 11.6 Mbytes Step Temp E_pair E_mol TotEng Press 0 518.26667 -15.742442 0 7.4303753 -613.0781 1000 369.81793 -54.202686 0 -37.667331 294.98823 -Loop time of 0.199641 on 4 procs for 1000 steps with 24 atoms +Loop time of 0.154891 on 4 procs for 1000 steps with 24 atoms -Performance: 432.777 ns/day, 0.055 hours/ns, 5008.996 timesteps/s -98.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 557.810 ns/day, 0.043 hours/ns, 6456.135 timesteps/s +98.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 | 0.017161 | 0.034988 | 0.05833 | 8.0 | 17.53 -Bond | 0.00017357 | 0.00021374 | 0.00027347 | 0.0 | 0.11 -Kspace | 0.018025 | 0.044624 | 0.065613 | 8.4 | 22.35 -Neigh | 0.0029755 | 0.0033154 | 0.0036366 | 0.6 | 1.66 -Comm | 0.059933 | 0.06537 | 0.070709 | 1.5 | 32.74 -Output | 3.4571e-05 | 3.6657e-05 | 4.22e-05 | 0.0 | 0.02 -Modify | 0.043458 | 0.045628 | 0.04767 | 0.9 | 22.86 -Other | | 0.005465 | | | 2.74 +Pair | 0.0154 | 0.028993 | 0.040525 | 5.5 | 18.72 +Bond | 0.00016999 | 0.0001902 | 0.00023293 | 0.0 | 0.12 +Kspace | 0.019093 | 0.028112 | 0.038976 | 4.3 | 18.15 +Neigh | 0.0020263 | 0.0022184 | 0.002408 | 0.4 | 1.43 +Comm | 0.04947 | 0.053627 | 0.058009 | 1.4 | 34.62 +Output | 2.5749e-05 | 2.7537e-05 | 3.2187e-05 | 0.0 | 0.02 +Modify | 0.035275 | 0.036815 | 0.038425 | 0.7 | 23.77 +Other | | 0.004909 | | | 3.17 Nlocal: 6 ave 8 max 3 min Histogram: 1 0 0 0 0 0 1 0 1 1 @@ -201,6 +202,17 @@ fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol h2omol tfac_insert ${tfac} group h2o shake wshake fix mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol h2omol tfac_insert 1.66666666666667 group h2o shake wshake +# atom counts + +variable oxygen atom "type==1" +variable hydrogen atom "type==2" +group oxygen dynamic all var oxygen +dynamic group oxygen defined +group hydrogen dynamic all var hydrogen +dynamic group hydrogen defined +variable nO equal count(oxygen) +variable nH equal count(hydrogen) + # output variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1) @@ -208,7 +220,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1) variable racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1) compute_modify thermo_temp dynamic/dof yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH thermo 1000 # run @@ -226,44 +238,44 @@ WARNING: Fix gcmc using full_energy option (../fix_gcmc.cpp:445) 0 atoms in group FixGCMC:rotation_gas_atoms:mygcmc WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (../neighbor.cpp:472) Per MPI rank memory allocation (min/avg/max) = 11.6 | 11.6 | 11.6 Mbytes -Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc - 1000 369.81793 295.32434 -54.202686 16.535355 0.23910963 24 0 0 0 0 - 2000 84.544466 -2810.9047 -344.81664 14.364627 0.86677242 87 0.052198354 0.0099581757 0 0 - 3000 75.188527 -3688.256 -425.02228 14.567977 0.98632724 99 0.030546787 0.0049111089 0 0 - 4000 75.019396 -5669.3063 -427.69454 14.535207 0.98632724 99 0.019972039 0.0033375609 0 0 - 5000 90.415371 -2141.7596 -434.65925 17.518218 0.98632724 99 0.014909796 0.002514964 0 0 - 6000 78.212628 -943.75125 -428.80584 15.153904 0.98632724 99 0.01181521 0.0020316119 0 0 - 7000 71.754139 -2028.5122 -435.2139 13.902555 0.98632724 99 0.0099466198 0.0016755471 0 0 - 8000 84.446231 -1969.1657 -428.27313 16.361681 0.98632724 99 0.0084791272 0.0014442102 0 0 - 9000 70.952348 -2476.9812 -446.33824 14.170197 1.0162159 102 0.0077150892 0.0012556189 0 0 - 10000 71.418543 -1875.7083 -443.7214 14.263302 1.0162159 102 0.0068355714 0.0011197957 0 0 - 11000 86.094994 -4508.7581 -444.82687 17.194399 1.0162159 102 0.0061494515 0.0010082475 0 0 - 12000 81.906091 -1547.8105 -442.36719 16.357815 1.0162159 102 0.0055834729 0.00091775114 0 0 - 13000 57.221548 -4607.6222 -448.30939 11.42796 1.0162159 102 0.0051230355 0.00084046326 0 0 - 14000 61.288344 -2518.1779 -445.70636 12.240157 1.0162159 102 0.0047276997 0.00077602396 0 0 - 15000 85.787669 -2407.7111 -443.3834 17.133022 1.0162159 102 0.0043983485 0.00071920715 0 0 - 16000 74.845939 -3288.3403 -445.8247 14.947802 1.0162159 102 0.0042321884 0.00080654918 0 0 - 17000 73.835431 -1926.9566 -445.67476 14.745989 1.0162159 102 0.0039751059 0.00075470749 0 0 - 18000 72.634985 -3997.552 -447.2351 14.506243 1.0162159 102 0.0037395847 0.00071063946 0 0 - 19000 96.776472 -714.44132 -453.65552 19.904587 1.0461046 105 0.0036487876 0.00066993446 0 0 - 20000 75.470786 183.16972 -464.04688 15.522521 1.0461046 105 0.0034630763 0.00063350614 0 0 - 21000 65.658309 -773.41266 -466.27068 13.504331 1.0461046 105 0.003289113 0.00060198052 0 0 -Loop time of 93.8859 on 4 procs for 20000 steps with 105 atoms +Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH + 1000 369.81793 295.32434 -54.202686 16.535355 0.23910963 24 0 0 0 0 8 16 + 2000 84.544466 -2810.9047 -344.81664 14.364627 0.86677242 87 0.052198354 0.0099581757 0 0 29 58 + 3000 75.188527 -3688.256 -425.02228 14.567977 0.98632724 99 0.030546787 0.0049111089 0 0 33 66 + 4000 75.019396 -5669.3063 -427.69454 14.535207 0.98632724 99 0.019972039 0.0033375609 0 0 33 66 + 5000 90.415371 -2141.7596 -434.65925 17.518218 0.98632724 99 0.014909796 0.002514964 0 0 33 66 + 6000 78.212628 -943.75125 -428.80584 15.153904 0.98632724 99 0.01181521 0.0020316119 0 0 33 66 + 7000 71.754139 -2028.5122 -435.2139 13.902555 0.98632724 99 0.0099466198 0.0016755471 0 0 33 66 + 8000 84.446231 -1969.1657 -428.27313 16.361681 0.98632724 99 0.0084791272 0.0014442102 0 0 33 66 + 9000 70.952348 -2476.9812 -446.33824 14.170197 1.0162159 102 0.0077150892 0.0012556189 0 0 34 68 + 10000 71.418543 -1875.7083 -443.7214 14.263302 1.0162159 102 0.0068355714 0.0011197957 0 0 34 68 + 11000 86.094994 -4508.7581 -444.82687 17.194399 1.0162159 102 0.0061494515 0.0010082475 0 0 34 68 + 12000 81.906091 -1547.8105 -442.36719 16.357815 1.0162159 102 0.0055834729 0.00091775114 0 0 34 68 + 13000 57.221548 -4607.6222 -448.30939 11.42796 1.0162159 102 0.0051230355 0.00084046326 0 0 34 68 + 14000 61.288344 -2518.1779 -445.70636 12.240157 1.0162159 102 0.0047276997 0.00077602396 0 0 34 68 + 15000 85.787669 -2407.7111 -443.3834 17.133022 1.0162159 102 0.0043983485 0.00071920715 0 0 34 68 + 16000 74.845939 -3288.3403 -445.8247 14.947802 1.0162159 102 0.0042321884 0.00080654918 0 0 34 68 + 17000 73.835431 -1926.9566 -445.67476 14.745989 1.0162159 102 0.0039751059 0.00075470749 0 0 34 68 + 18000 72.634985 -3997.552 -447.2351 14.506243 1.0162159 102 0.0037395847 0.00071063946 0 0 34 68 + 19000 96.776472 -714.44132 -453.65552 19.904587 1.0461046 105 0.0036487876 0.00066993446 0 0 35 70 + 20000 75.470786 183.16972 -464.04688 15.522521 1.0461046 105 0.0034630763 0.00063350614 0 0 35 70 + 21000 65.658309 -773.41266 -466.27068 13.504331 1.0461046 105 0.003289113 0.00060198052 0 0 35 70 +Loop time of 84.4085 on 4 procs for 20000 steps with 105 atoms -Performance: 18.405 ns/day, 1.304 hours/ns, 213.024 timesteps/s +Performance: 20.472 ns/day, 1.172 hours/ns, 236.943 timesteps/s 98.8% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 6.7882 | 10.264 | 14.758 | 93.2 | 10.93 -Bond | 0.028286 | 0.034218 | 0.039038 | 2.5 | 0.04 -Kspace | 0.57255 | 5.2227 | 8.8493 | 133.8 | 5.56 -Neigh | 0.3635 | 0.36915 | 0.37473 | 0.9 | 0.39 -Comm | 2.9961 | 3.2542 | 3.509 | 11.4 | 3.47 -Output | 0.0011675 | 0.0012342 | 0.001375 | 0.2 | 0.00 -Modify | 74.428 | 74.499 | 74.571 | 0.7 | 79.35 -Other | | 0.2411 | | | 0.26 +Pair | 6.3571 | 9.7574 | 13.984 | 90.7 | 11.56 +Bond | 0.026374 | 0.031321 | 0.035482 | 2.1 | 0.04 +Kspace | 0.57402 | 4.7894 | 8.1754 | 129.0 | 5.67 +Neigh | 0.34952 | 0.34987 | 0.35021 | 0.1 | 0.41 +Comm | 2.4028 | 2.4228 | 2.4372 | 0.9 | 2.87 +Output | 0.0012269 | 0.0012826 | 0.0014355 | 0.2 | 0.00 +Modify | 66.819 | 66.828 | 66.837 | 0.1 | 79.17 +Other | | 0.2281 | | | 0.27 Nlocal: 26.25 ave 31 max 22 min Histogram: 1 0 1 0 0 0 1 0 0 1 @@ -278,4 +290,4 @@ Ave special neighs/atom = 2 Neighbor list builds = 20428 Dangerous builds = 0 -Total wall time: 0:01:34 +Total wall time: 0:01:24 diff --git a/examples/gcmc/log.6Jul17.gcmc.lj.g++.1 b/examples/gcmc/log.23Oct17.gcmc.lj.g++.1 similarity index 76% rename from examples/gcmc/log.6Jul17.gcmc.lj.g++.1 rename to examples/gcmc/log.23Oct17.gcmc.lj.g++.1 index 69fc2ede1c..a38dfeee77 100644 --- a/examples/gcmc/log.6Jul17.gcmc.lj.g++.1 +++ b/examples/gcmc/log.23Oct17.gcmc.lj.g++.1 @@ -1,4 +1,4 @@ -LAMMPS (6 Jul 2017) +LAMMPS (23 Oct 2017) using 1 OpenMP thread(s) per MPI task # GCMC for LJ simple fluid, no dynamics # T = 2.0 @@ -43,6 +43,13 @@ fix mygcmc all gcmc 1 100 100 1 29494 2.0 ${mu} ${disp} fix mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 ${disp} fix mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 1.0 +# atom count + +variable type1 atom "type==1" +group type1 dynamic all var type1 +dynamic group type1 defined +variable n1 equal count(type1) + # averaging variable rho equal density @@ -54,10 +61,11 @@ variable muex equal -1.25-${temp}*ln(density*${lambda}+${nugget}) variable muex equal -1.25-2.0*ln(density*${lambda}+${nugget}) variable muex equal -1.25-2.0*ln(density*1+${nugget}) variable muex equal -1.25-2.0*ln(density*1+1e-08) -fix ave all ave/time 10 100 1000 v_rho v_p v_muex ave one file rho_vs_p.dat +fix ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat variable rhoav equal f_ave[1] variable pav equal f_ave[2] variable muexav equal f_ave[3] +variable n1av equal f_ave[4] # output @@ -68,7 +76,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+1e-08) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget}) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+1e-08) compute_modify thermo_temp dynamic yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av thermo 1000 # run @@ -87,32 +95,32 @@ Neighbor list info ... stencil: half/bin/3d/newton bin: standard Per MPI rank memory allocation (min/avg/max) = 0.433 | 0.433 | 0.433 Mbytes -Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav - 0 0 0 0 -0 0 0 0 0 0 0 0 0 - 1000 2.4038954 2.1735585 -2.7041368 3.5476844 0.496 62 0.064790036 0.06313096 0.1081294 0.54304 1.4513524 -0.025479219 - 2000 2.0461168 1.1913842 -2.9880181 3.0212194 0.512 64 0.067416408 0.066335853 0.11306166 0.52736 1.3274665 0.034690004 - 3000 1.7930436 1.3788681 -3.2212667 2.6505861 0.552 69 0.067733191 0.066877836 0.1133516 0.5344 1.3834744 0.0070582537 - 4000 1.981449 1.2541054 -2.8222868 2.9217977 0.472 59 0.068546991 0.067856412 0.11442807 0.52504 1.3815629 0.043309657 - 5000 2.0946818 1.0701629 -3.5213291 3.0977688 0.568 71 0.06813743 0.067567891 0.11342906 0.53824 1.4049567 -0.0054539777 - 6000 1.9793484 0.68224187 -3.410211 2.9247088 0.536 67 0.067797628 0.067420108 0.11295333 0.5384 1.401683 -0.0066894359 - 7000 2.1885798 1.6745012 -3.185499 3.2345922 0.544 68 0.068630201 0.068261832 0.11403705 0.5244 1.449239 0.045987399 - 8000 2.2175324 1.5897263 -3.078898 3.2759002 0.528 66 0.068180395 0.067899629 0.11332691 0.53928 1.5488388 -0.01075766 - 9000 1.8610779 1.0396231 -2.923262 2.7465908 0.496 62 0.068346453 0.068028117 0.1134132 0.52912 1.4352871 0.027082544 - 10000 2.1079271 1.1746643 -2.9112062 3.1091925 0.48 60 0.068352878 0.068054948 0.11335434 0.5316 1.4462327 0.018503094 -Loop time of 20.6892 on 1 procs for 10000 steps with 60 atoms +Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av + 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 + 1000 2.4038954 2.1735585 -2.7041368 3.5476844 0.496 62 0.064790036 0.06313096 0.1081294 0.54304 1.4513524 -0.025479219 64.98 + 2000 2.0461168 1.1913842 -2.9880181 3.0212194 0.512 64 0.067416408 0.066335853 0.11306166 0.52736 1.3274665 0.034690004 62.97 + 3000 1.7930436 1.3788681 -3.2212667 2.6505861 0.552 69 0.067733191 0.066877836 0.1133516 0.5344 1.3834744 0.0070582537 63.5 + 4000 1.981449 1.2541054 -2.8222868 2.9217977 0.472 59 0.068546991 0.067856412 0.11442807 0.52504 1.3815629 0.043309657 62.17 + 5000 2.0946818 1.0701629 -3.5213291 3.0977688 0.568 71 0.06813743 0.067567891 0.11342906 0.53824 1.4049567 -0.0054539777 64.15 + 6000 1.9793484 0.68224187 -3.410211 2.9247088 0.536 67 0.067797628 0.067420108 0.11295333 0.5384 1.401683 -0.0066894359 64.37 + 7000 2.1885798 1.6745012 -3.185499 3.2345922 0.544 68 0.068630201 0.068261832 0.11403705 0.5244 1.449239 0.045987399 62.33 + 8000 2.2175324 1.5897263 -3.078898 3.2759002 0.528 66 0.068180395 0.067899629 0.11332691 0.53928 1.5488388 -0.01075766 64.29 + 9000 1.8610779 1.0396231 -2.923262 2.7465908 0.496 62 0.068346453 0.068028117 0.1134132 0.52912 1.4352871 0.027082544 62.87 + 10000 2.1079271 1.1746643 -2.9112062 3.1091925 0.48 60 0.068352878 0.068054948 0.11335434 0.5316 1.4462327 0.018503094 63.2 +Loop time of 20.4081 on 1 procs for 10000 steps with 60 atoms -Performance: 208804.611 tau/day, 483.344 timesteps/s -99.4% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 211680.375 tau/day, 490.001 timesteps/s +98.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 | 0.47227 | 0.47227 | 0.47227 | 0.0 | 2.28 -Neigh | 1.1729 | 1.1729 | 1.1729 | 0.0 | 5.67 -Comm | 0.17133 | 0.17133 | 0.17133 | 0.0 | 0.83 -Output | 0.00028253 | 0.00028253 | 0.00028253 | 0.0 | 0.00 -Modify | 18.852 | 18.852 | 18.852 | 0.0 | 91.12 -Other | | 0.02063 | | | 0.10 +Pair | 0.46484 | 0.46484 | 0.46484 | 0.0 | 2.28 +Neigh | 1.1447 | 1.1447 | 1.1447 | 0.0 | 5.61 +Comm | 0.1696 | 0.1696 | 0.1696 | 0.0 | 0.83 +Output | 0.000319 | 0.000319 | 0.000319 | 0.0 | 0.00 +Modify | 18.607 | 18.607 | 18.607 | 0.0 | 91.17 +Other | | 0.02194 | | | 0.11 Nlocal: 60 ave 60 max 60 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/gcmc/log.6Jul17.gcmc.lj.g++.4 b/examples/gcmc/log.23Oct17.gcmc.lj.g++.4 similarity index 76% rename from examples/gcmc/log.6Jul17.gcmc.lj.g++.4 rename to examples/gcmc/log.23Oct17.gcmc.lj.g++.4 index 6bd3b3189c..ea7dc8116f 100644 --- a/examples/gcmc/log.6Jul17.gcmc.lj.g++.4 +++ b/examples/gcmc/log.23Oct17.gcmc.lj.g++.4 @@ -1,4 +1,4 @@ -LAMMPS (6 Jul 2017) +LAMMPS (23 Oct 2017) using 1 OpenMP thread(s) per MPI task # GCMC for LJ simple fluid, no dynamics # T = 2.0 @@ -43,6 +43,13 @@ fix mygcmc all gcmc 1 100 100 1 29494 2.0 ${mu} ${disp} fix mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 ${disp} fix mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 1.0 +# atom count + +variable type1 atom "type==1" +group type1 dynamic all var type1 +dynamic group type1 defined +variable n1 equal count(type1) + # averaging variable rho equal density @@ -54,10 +61,11 @@ variable muex equal -1.25-${temp}*ln(density*${lambda}+${nugget}) variable muex equal -1.25-2.0*ln(density*${lambda}+${nugget}) variable muex equal -1.25-2.0*ln(density*1+${nugget}) variable muex equal -1.25-2.0*ln(density*1+1e-08) -fix ave all ave/time 10 100 1000 v_rho v_p v_muex ave one file rho_vs_p.dat +fix ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat variable rhoav equal f_ave[1] variable pav equal f_ave[2] variable muexav equal f_ave[3] +variable n1av equal f_ave[4] # output @@ -68,7 +76,7 @@ variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+1e-08) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget}) variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+1e-08) compute_modify thermo_temp dynamic yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av thermo 1000 # run @@ -87,32 +95,32 @@ Neighbor list info ... stencil: half/bin/3d/newton bin: standard Per MPI rank memory allocation (min/avg/max) = 0.4477 | 0.4477 | 0.4477 Mbytes -Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav - 0 0 0 0 -0 0 0 0 0 0 0 0 0 - 1000 1.956397 1.7699101 -2.7889468 2.8864874 0.488 61 0.068894746 0.067229075 0.1141726 0.53288 1.3832798 0.013392866 - 2000 2.040943 0.56060899 -2.8001647 3.0077055 0.456 57 0.069858594 0.068831934 0.11629114 0.5232 1.3587174 0.049995794 - 3000 2.0004866 1.5736515 -3.3098044 2.9572411 0.552 69 0.069594029 0.068727791 0.11592543 0.53096 1.4129434 0.020022578 - 4000 2.1127942 2.642809 -2.8865084 3.1211733 0.528 66 0.070268697 0.069533235 0.11693806 0.52424 1.3444615 0.046884078 - 5000 2.3663648 1.354269 -3.1917346 3.4957662 0.528 66 0.070519633 0.069960064 0.11710321 0.52688 1.3595814 0.036270867 - 6000 1.9224136 0.82756699 -3.1965 2.839257 0.52 65 0.06985018 0.069474645 0.11628632 0.536 1.47062 0.00141549 - 7000 2.0266192 1.5593811 -2.9972341 2.9931606 0.52 65 0.070244693 0.069880791 0.11666541 0.52528 1.3246332 0.040754793 - 8000 1.7790467 1.8680568 -2.8028819 2.6275151 0.52 65 0.070454494 0.070172368 0.11736806 0.524 1.4213649 0.047985191 - 9000 1.7968847 1.3195587 -3.261001 2.6550983 0.536 67 0.069952011 0.069618327 0.11650087 0.53904 1.4624201 -0.01069837 - 10000 2.1566109 1.1015729 -3.4999837 3.1880335 0.552 69 0.069603309 0.069284134 0.11625548 0.53128 1.3587249 0.02075238 -Loop time of 24.9916 on 4 procs for 10000 steps with 69 atoms +Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av + 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 + 1000 1.956397 1.7699101 -2.7889468 2.8864874 0.488 61 0.068894746 0.067229075 0.1141726 0.53288 1.3832798 0.013392866 63.44 + 2000 2.040943 0.56060899 -2.8001647 3.0077055 0.456 57 0.069858594 0.068831934 0.11629114 0.5232 1.3587174 0.049995794 62.19 + 3000 2.0004866 1.5736515 -3.3098044 2.9572411 0.552 69 0.069594029 0.068727791 0.11592543 0.53096 1.4129434 0.020022578 63.23 + 4000 2.1127942 2.642809 -2.8865084 3.1211733 0.528 66 0.070268697 0.069533235 0.11693806 0.52424 1.3444615 0.046884078 62.57 + 5000 2.3663648 1.354269 -3.1917346 3.4957662 0.528 66 0.070519633 0.069960064 0.11710321 0.52688 1.3595814 0.036270867 62.56 + 6000 1.9224136 0.82756699 -3.1965 2.839257 0.52 65 0.06985018 0.069474645 0.11628632 0.536 1.47062 0.00141549 63.76 + 7000 2.0266192 1.5593811 -2.9972341 2.9931606 0.52 65 0.070244693 0.069880791 0.11666541 0.52528 1.3246332 0.040754793 62.2 + 8000 1.7790467 1.8680568 -2.8028819 2.6275151 0.52 65 0.070454494 0.070172368 0.11736806 0.524 1.4213649 0.047985191 62.03 + 9000 1.7968847 1.3195587 -3.261001 2.6550983 0.536 67 0.069952011 0.069618327 0.11650087 0.53904 1.4624201 -0.01069837 64.36 + 10000 2.1566109 1.1015729 -3.4999837 3.1880335 0.552 69 0.069603309 0.069284134 0.11625548 0.53128 1.3587249 0.02075238 63.24 +Loop time of 23.8213 on 4 procs for 10000 steps with 69 atoms -Performance: 172857.936 tau/day, 400.134 timesteps/s -98.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 181350.388 tau/day, 419.793 timesteps/s +97.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.11696 | 0.12516 | 0.1321 | 1.7 | 0.50 -Neigh | 0.34874 | 0.35644 | 0.36545 | 1.2 | 1.43 -Comm | 0.48531 | 0.51366 | 0.54755 | 3.8 | 2.06 -Output | 0.0005362 | 0.00069767 | 0.00076008 | 0.0 | 0.00 -Modify | 23.956 | 23.972 | 23.988 | 0.3 | 95.92 -Other | | 0.02376 | | | 0.10 +Pair | 0.10935 | 0.11844 | 0.12741 | 2.1 | 0.50 +Neigh | 0.33 | 0.33945 | 0.35091 | 1.6 | 1.42 +Comm | 0.49249 | 0.51745 | 0.53856 | 2.7 | 2.17 +Output | 0.00053334 | 0.0007208 | 0.0007906 | 0.0 | 0.00 +Modify | 22.82 | 22.822 | 22.825 | 0.0 | 95.81 +Other | | 0.02289 | | | 0.10 Nlocal: 17.25 ave 23 max 10 min Histogram: 1 0 0 0 0 0 2 0 0 1 @@ -125,4 +133,4 @@ Total # of neighbors = 2823 Ave neighs/atom = 40.913 Neighbor list builds = 10000 Dangerous builds = 0 -Total wall time: 0:00:24 +Total wall time: 0:00:23 diff --git a/examples/latte/TBparam/bondints.nonortho b/examples/latte/TBparam/bondints.nonortho new file mode 100644 index 0000000000..8c1eee76b5 --- /dev/null +++ b/examples/latte/TBparam/bondints.nonortho @@ -0,0 +1,36 @@ +Noints= 34 +Element1 Element2 Kind H0 B1 B2 B3 B4 B5 R1 Rcut H0 B1 B2 B3 B4 B5 R1 Rcut +N O sss -11.430028 -2.257346 -1.152844 0.000000 0.000000 1.200000 3.500000 4.000000 0.340064 -1.703613 -0.622348 0.036738 -0.040158 1.200000 3.500000 4.000000 +N O sps 11.597479 -1.382001 -0.765170 0.000000 0.000000 1.200000 3.500000 4.000000 -0.370946 -1.040947 -0.931097 0.252441 -0.115450 1.200000 3.500000 4.000000 +O N sps 12.143744 -0.822913 -0.676127 0.000000 0.000000 1.200000 3.500000 4.000000 -0.420014 -1.107918 -0.905594 0.188424 -0.088365 1.200000 3.500000 4.000000 +N O pps 9.465191 -1.082032 -0.769214 0.000000 0.000000 1.200000 3.500000 4.000000 -0.314073 0.499050 -2.914288 2.067657 -0.738439 1.200000 3.500000 4.000000 +N O ppp -4.676789 -2.171480 -0.288002 0.000000 0.000000 1.200000 3.500000 4.000000 0.223937 -1.991867 -0.537630 -0.081270 -0.004130 1.200000 3.500000 4.000000 +C O sss -14.369472 -2.077439 -0.875471 0.000000 0.000000 1.200000 3.500000 4.000000 0.375339 -1.547372 -0.642492 0.020614 -0.026699 1.200000 3.500000 4.000000 +C O sps 9.576296 -1.156217 -0.494803 0.000000 0.000000 1.200000 3.500000 4.000000 -0.373027 -0.776043 -1.019920 0.257539 -0.102838 1.200000 3.500000 4.000000 +O C sps 14.037374 -1.192632 -0.654572 0.000000 0.000000 1.200000 3.500000 4.000000 -0.458068 -1.035067 -0.937868 0.190562 -0.077841 1.200000 3.500000 4.000000 +C O pps 9.331152 -0.718120 -0.822100 0.000000 0.000000 1.200000 3.500000 4.000000 -0.322293 0.795473 -3.476601 2.589965 -0.897800 1.200000 3.500000 4.000000 +C O ppp -5.334367 -2.263939 -0.204910 0.000000 0.000000 1.200000 3.500000 4.000000 0.244570 -1.922717 -0.573671 -0.057280 -0.004108 1.200000 3.500000 4.000000 +C N sss -7.010061 -1.730597 -0.575559 0.000000 0.000000 1.500000 3.500000 4.000000 0.263438 -1.754525 -0.584215 -0.007801 -0.021729 1.500000 3.500000 4.000000 +C N sps 7.543283 -1.293768 -0.624363 0.000000 0.000000 1.500000 3.500000 4.000000 -0.326609 -1.197485 -0.807786 0.134891 -0.084373 1.500000 3.500000 4.000000 +N C sps 9.090970 -1.494255 -0.616711 0.000000 0.000000 1.500000 3.500000 4.000000 -0.337943 -1.335442 -0.769693 0.119373 -0.079493 1.500000 3.500000 4.000000 +C N pps 6.892240 -0.931920 -0.769164 0.000000 0.000000 1.500000 3.500000 4.000000 -0.350240 -0.467439 -1.849316 1.854403 -0.988471 1.500000 3.500000 4.000000 +C N ppp -2.903346 -2.149349 -0.253006 0.000000 0.000000 1.500000 3.500000 4.000000 0.158424 -2.114409 -0.582346 -0.051076 -0.006183 1.500000 3.500000 4.000000 +C C sss -9.404207 -1.363297 -0.507128 0.000000 0.000000 1.400000 3.500000 4.000000 0.346977 -1.519820 -0.570812 -0.013518 -0.015829 1.400000 3.500000 4.000000 +C C sps 8.662429 -1.047410 -0.661999 0.000000 0.000000 1.400000 3.500000 4.000000 -0.400467 -0.984048 -0.853949 0.157178 -0.073381 1.400000 3.500000 4.000000 +C C pps 6.811512 -0.552299 -0.776890 0.000000 0.000000 1.400000 3.500000 4.000000 -0.382417 0.102889 -2.786680 2.646356 -1.134320 1.400000 3.500000 4.000000 +C C ppp -3.550127 -1.925572 -0.132715 0.000000 0.000000 1.400000 3.500000 4.000000 0.214357 -1.948923 -0.578323 -0.034356 -0.007257 1.400000 3.500000 4.000000 +H C sss -9.072577 -1.393093 -0.430611 0.000000 0.000000 1.100000 3.500000 4.000000 0.416003 -1.459596 -0.654874 0.009140 -0.012658 1.100000 3.500000 4.000000 +H C sps 8.176008 -0.985177 -0.427403 0.000000 0.000000 1.100000 3.500000 4.000000 -0.495695 -0.901626 -1.007214 0.189808 -0.057087 1.100000 3.500000 4.000000 +H H sss -9.340000 -1.145903 -0.391777 0.000000 0.000000 0.750000 3.500000 4.000000 0.575007 -1.391261 -0.778831 0.080209 -0.017759 0.750000 3.500000 4.000000 +O O sss -12.737687 -1.851608 -0.666621 0.000000 0.000000 1.200000 3.500000 4.000000 0.296445 -1.911896 -0.663451 0.038054 -0.046608 1.200000 3.500000 4.000000 +O O sps 13.683050 -1.684554 -0.468349 0.000000 0.000000 1.200000 3.500000 4.000000 -0.362143 -1.285274 -0.939591 0.204641 -0.106438 1.200000 3.500000 4.000000 +O O pps 9.460772 -1.211748 -0.581016 0.000000 0.000000 1.200000 3.500000 4.000000 -0.312044 0.121814 -2.519352 1.681266 -0.644566 1.200000 3.500000 4.000000 +O O ppp -4.494595 -2.709223 -0.284124 0.000000 0.000000 1.200000 3.500000 4.000000 0.193010 -2.168462 -0.580629 -0.105104 0.004891 1.200000 3.500000 4.000000 +H O sss -12.230931 -1.808632 -0.421164 0.000000 0.000000 1.000000 3.500000 4.000000 0.404725 -1.702546 -0.707938 0.074904 -0.039922 1.000000 3.500000 4.000000 +H O sps 9.466088 -1.321262 -0.386336 0.000000 0.000000 1.000000 3.500000 4.000000 -0.447660 -0.952979 -1.163537 0.400616 -0.156965 1.000000 3.500000 4.000000 +N N sss -7.710330 -2.365312 -0.525527 0.000000 0.000000 1.500000 3.500000 4.000000 0.231654 -1.879002 -0.572765 -0.004579 -0.031106 1.500000 3.500000 4.000000 +N N sps 8.222314 -1.612118 -0.690081 0.000000 0.000000 1.500000 3.500000 4.000000 -0.305271 -1.385158 -0.751032 0.114531 -0.090839 1.500000 3.500000 4.000000 +N N pps 7.178570 -1.176467 -0.571049 0.000000 0.000000 1.500000 3.500000 4.000000 -0.324668 -0.547805 -1.638658 1.495168 -0.827868 1.500000 3.500000 4.000000 +N N ppp -2.829344 -2.408049 -0.387709 0.000000 0.000000 1.500000 3.500000 4.000000 0.142909 -2.162036 -0.571942 -0.071640 -0.004682 1.500000 3.500000 4.000000 +H N sss -12.095890 -1.519057 -0.277247 0.000000 0.000000 1.000000 3.500000 4.000000 0.446693 -1.500463 -0.657448 0.065741 -0.037004 1.000000 3.500000 4.000000 +H N sps 9.851338 -1.231616 -0.370836 0.000000 0.000000 1.000000 3.500000 4.000000 -0.501530 -0.785734 -1.123232 0.394878 -0.148501 1.000000 3.500000 4.000000 diff --git a/examples/latte/TBparam/electrons.dat b/examples/latte/TBparam/electrons.dat new file mode 100644 index 0000000000..c38fd23ce2 --- /dev/null +++ b/examples/latte/TBparam/electrons.dat @@ -0,0 +1,7 @@ +Noelem= 5 +Element basis Numel Es Ep Ed Ef Mass HubbardU Wss Wpp Wdd Wff +N sp 5.0 -18.58 -7.09 0.0 0.0 14.0067 15.93 0.0 -0.6950 0.0 0.0 +O sp 6.0 -23.96 -9.02 0.0 0.0 15.9994 12.15 0.0 -0.7577 0.0 0.0 +H s 1.0 -6.35 0.0 0.0 0.0 1.0079 12.85 -1.7937 0.0 0.0 0.0 +C sp 4.0 -13.75 -5.28 0.0 0.0 12.01 10.0 0.0 -0.621 0.0 0.0 +Ti sd 4.0 -5.5 0.0 -3.0 0.0 47.867 10.0 0.0 0.0 0.0 0.0 \ No newline at end of file diff --git a/examples/latte/TBparam/ppots.nonortho b/examples/latte/TBparam/ppots.nonortho new file mode 100644 index 0000000000..1b9b66c0a1 --- /dev/null +++ b/examples/latte/TBparam/ppots.nonortho @@ -0,0 +1,12 @@ +Nopps= 10 +Ele1 Ele2 A0 A1 A2 A3 A4 A5 A6 C R1 Rcut +N O 13.182426 20.050322 -46.806321 38.206953 -12.319656 0.000000 0.000000 0.000000 1.600000 1.700000 +C N 88.953762 10.294988 -27.706877 22.101434 -6.836438 0.000000 0.000000 0.000000 1.600000 1.700000 +C O 0.944093 30.116337 -59.608215 45.107654 -13.178839 0.000000 0.000000 0.000000 1.600000 1.700000 +C H 104.889589 3.971095 -23.823043 26.408093 -11.317522 0.000000 0.000000 0.000000 1.200000 1.300000 +C C 3.962931 24.467772 -51.156024 39.031644 -11.342979 0.000000 0.000000 0.000000 1.600000 1.700000 +H H 38.512100 3.887860 -37.769100 57.083500 -34.512200 0.000000 0.000000 0.000000 0.900000 1.000000 +N N 43.228899 15.004605 -36.621777 29.234888 -8.912743 0.000000 0.000000 0.000000 1.600000 1.700000 +N H 0.625470 28.081241 -63.414297 53.286361 -17.352234 0.000000 0.000000 0.000000 1.300000 1.400000 +O O 10.999870 19.303033 -45.747853 37.946431 -11.935755 0.000000 0.000000 0.000000 1.500000 1.600000 +O H 0.481176 33.175383 -81.158683 74.935408 -26.792315 0.000000 0.000000 0.000000 1.200000 1.300000 diff --git a/examples/latte/data.sucrose b/examples/latte/data.sucrose new file mode 100644 index 0000000000..aae490cd19 --- /dev/null +++ b/examples/latte/data.sucrose @@ -0,0 +1,63 @@ + LAMMPS Description + + 45 atoms + + 3 atom types + + 0.0000000000000000 17.202999999999999 xlo xhi + 0.0000000000000000 18.009000000000000 ylo yhi + 0.0000000000000000 21.643000000000001 zlo zhi + + Masses + + 1 15.9994 + 2 12.01 + 3 1.0079 + + Atoms + + 1 1 1 0.0 8.62700 8.66700 12.48600 + 2 1 1 0.0 9.11200 9.11800 10.27300 + 3 1 1 0.0 8.45700 11.33100 10.49000 + 4 1 1 0.0 11.72600 8.36500 10.66700 + 5 1 1 0.0 8.06500 8.99400 7.93600 + 6 1 2 0.0 9.62800 9.07200 11.59100 + 7 1 3 0.0 9.90900 10.08300 11.89200 + 8 1 2 0.0 9.07000 10.40400 9.64000 + 9 1 1 0.0 6.14600 11.61000 8.00500 + 10 1 1 0.0 11.07200 10.13000 8.37600 + 11 1 1 0.0 6.10200 10.00900 11.62100 + 12 1 2 0.0 8.14000 10.29100 8.45100 + 13 1 3 0.0 8.49000 10.91200 7.62300 + 14 1 1 0.0 7.41500 7.08400 14.43400 + 15 1 2 0.0 10.75100 8.07000 11.65100 + 16 1 3 0.0 11.24000 8.11800 12.63400 + 17 1 2 0.0 7.09000 11.63400 10.17000 + 18 1 3 0.0 7.06900 12.69800 9.91100 + 19 1 2 0.0 7.97200 7.44200 12.14000 + 20 1 3 0.0 7.54700 7.58300 11.13800 + 21 1 1 0.0 11.24900 5.73000 11.78600 + 22 1 2 0.0 10.26800 6.65900 11.37300 + 23 1 3 0.0 10.12300 6.53400 10.29200 + 24 1 2 0.0 6.78400 10.79500 8.95500 + 25 1 3 0.0 6.12100 9.95500 9.19600 + 26 1 2 0.0 10.47500 10.88300 9.39800 + 27 1 3 0.0 10.49500 11.92100 9.06900 + 28 1 3 0.0 11.09100 10.82000 10.30900 + 29 1 2 0.0 8.99100 6.32000 12.11700 + 30 1 3 0.0 9.23100 6.01100 13.14400 + 31 1 2 0.0 6.86600 7.25300 13.14500 + 32 1 3 0.0 6.17700 8.10100 13.15700 + 33 1 3 0.0 6.28900 6.35300 12.94300 + 34 1 2 0.0 6.24000 11.39400 11.39300 + 35 1 3 0.0 6.66500 11.86500 12.28300 + 36 1 3 0.0 5.23100 11.78100 11.26000 + 37 1 1 0.0 8.34300 5.24100 11.48000 + 38 1 3 0.0 12.00100 9.28600 10.78200 + 39 1 3 0.0 12.06300 5.97500 11.33000 + 40 1 3 0.0 6.99600 9.67600 11.79700 + 41 1 3 0.0 7.93700 7.87600 14.60900 + 42 1 3 0.0 10.95500 9.19800 8.60700 + 43 1 3 0.0 5.94400 11.05900 7.24100 + 44 1 3 0.0 7.94900 8.39500 8.68400 + 45 1 3 0.0 8.96400 4.50300 11.48800 diff --git a/examples/latte/data.water b/examples/latte/data.water new file mode 100644 index 0000000000..1a1e4d9e0b --- /dev/null +++ b/examples/latte/data.water @@ -0,0 +1,41 @@ + LAMMPS Description + + 24 atoms + + 2 atom types + + 0.0000000000000000 6.2670000000000003 xlo xhi + 0.0000000000000000 6.2670000000000003 ylo yhi + 0.0000000000000000 6.2670000000000003 zlo zhi + + Masses + + 1 15.994915008544922 + 2 1.0078250169754028 + + Atoms + + 1 1 1 0.0 3.08800 3.70000 3.12400 + 2 1 2 0.0 4.05800 3.70000 3.12400 + 3 1 2 0.0 2.76400 3.13200 3.84100 + 4 1 1 0.0 2.47000 0.39000 1.36000 + 5 1 2 0.0 1.54000 0.37000 1.73000 + 6 1 2 0.0 2.48000 0.00000 0.44000 + 7 1 1 0.0 1.99300 0.41700 5.25000 + 8 1 2 0.0 2.39300 1.32700 5.16000 + 9 1 2 0.0 0.99300 0.49700 5.31000 + 10 1 1 0.0 2.05300 6.09700 3.48000 + 11 1 2 0.0 2.12300 5.20700 3.02000 + 12 1 2 0.0 1.11300 0.17000 3.40000 + 13 1 1 0.0 4.90000 5.37700 2.14000 + 14 1 2 0.0 5.51000 6.17700 2.18000 + 15 1 2 0.0 3.95000 5.68700 2.21000 + 16 1 1 0.0 0.92000 3.82700 0.56000 + 17 1 2 0.0 0.00000 3.54700 0.27000 + 18 1 2 0.0 1.23000 4.59700 0.00000 + 19 1 1 0.0 0.89000 2.03700 3.41000 + 20 1 2 0.0 0.72000 2.86700 2.87000 + 21 1 2 0.0 1.79000 1.66700 3.19000 + 22 1 1 0.0 4.45000 4.61700 5.43000 + 23 1 2 0.0 4.75000 3.89700 4.81000 + 24 1 2 0.0 4.06000 4.21700 6.26000 diff --git a/examples/latte/in.latte.sucrose b/examples/latte/in.latte.sucrose new file mode 100644 index 0000000000..a10dae5c5e --- /dev/null +++ b/examples/latte/in.latte.sucrose @@ -0,0 +1,40 @@ +# simple sucrose model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.sucrose + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte NULL +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# dynamics + +thermo 10 +run 100 diff --git a/examples/latte/in.latte.water b/examples/latte/in.latte.water new file mode 100644 index 0000000000..e1185602b4 --- /dev/null +++ b/examples/latte/in.latte.water @@ -0,0 +1,40 @@ +# simple water model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.water + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte NULL +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# dynamics + +thermo 10 +run 100 diff --git a/examples/latte/in.latte.water.min b/examples/latte/in.latte.water.min new file mode 100644 index 0000000000..503e45a300 --- /dev/null +++ b/examples/latte/in.latte.water.min @@ -0,0 +1,41 @@ +# simple water model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.water + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte NULL +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# minimization + +thermo 10 +min_style fire +minimize 1.0e-9 1.0e-9 500 500 diff --git a/examples/latte/latte.in b/examples/latte/latte.in new file mode 100644 index 0000000000..b8b214b78b --- /dev/null +++ b/examples/latte/latte.in @@ -0,0 +1,40 @@ +LATTE INPUT FILE +================ +#This input file resumes the content of MDcontroller and TBparam/control.in +#The parser will only read it is present inside the running folder. +#In case this file is not present Latte will read the two files as original. +#The order of the keywords is not important in this file. +#To get a full description of these keywords please see: +## https://github.com/lanl/LATTE/blob/master/Manual/LATTE_manual.pdf + +#General controls +CONTROL{ + xControl= 1 + BASISTYPE= NONORTHO + COORDSFILE= "./coords.dat" + PARAMPATH= "./TBparam" + KBT= 0.0 + ENTROPYKIND= 1 + PPOTON= 1 + SPINON= 0 SPINTOL= 1.0e-4 + ELECTRO= 1 ELECMETH= 0 ELEC_QTOL= 1.0e-8 + MAXSCF= 450 + BREAKTOL= 1.0E-6 MINSP2ITER= 22 SP2CONV= REL + FULLQCONV= 1 QITER= 3 + QMIX= 0.25 SPINMIX= 0.25 MDMIX= 0.25 + SPARSEON= 1 THRESHOLDON= 1 NUMTHRESH= 1.0e-6 FILLINSTOP= 100 BLKSZ= 4 + MSPARSE= 1500 + RELAX= 0 RELAXTYPE= SD MAXITER= 100000 RLXFTOL= 0.0000001 + SKIN= 1.0 + CHARGE= 0 + XBO= 1 + XBODISON= 1 + XBODISORDER= 5 + KON= 0 +} + +#Controls for QMD (if using lammps MAXITER must be set to -1) +MDCONTROL{ + MAXITER= -1 +} + diff --git a/examples/latte/log.19Sep17.latte.sucrose.g++.1 b/examples/latte/log.19Sep17.latte.sucrose.g++.1 new file mode 100644 index 0000000000..bc8843ef7f --- /dev/null +++ b/examples/latte/log.19Sep17.latte.sucrose.g++.1 @@ -0,0 +1,406 @@ + The log file for latte_lib + + CONTROL{ } + + WARNING: variable JobName= is missing. I will use a default value instead ... + WARNING: variable PARAMPATH= is missing. I will use a default value instead ... + WARNING: variable DEBUGON= is missing. I will use a default value instead ... + WARNING: variable FERMIM= is missing. I will use a default value instead ... + WARNING: variable CGORLIB= is missing. I will use a default value instead ... + WARNING: variable NORECS= is missing. I will use a default value instead ... + WARNING: variable VDWON= is missing. I will use a default value instead ... + WARNING: variable ORDERNMOL= is missing. I will use a default value instead ... + WARNING: variable LCNON= is missing. I will use a default value instead ... + WARNING: variable LCNITER= is missing. I will use a default value instead ... + WARNING: variable MDON= is missing. I will use a default value instead ... + WARNING: variable PBCON= is missing. I will use a default value instead ... + WARNING: variable RESTART= is missing. I will use a default value instead ... + WARNING: variable NGPU= is missing. I will use a default value instead ... + WARNING: variable COMPFORCE= is missing. I will use a default value instead ... + WARNING: variable DOSFIT= is missing. I will use a default value instead ... + WARNING: variable INTS2FIT= is missing. I will use a default value instead ... + WARNING: variable NFITSTEP= is missing. I will use a default value instead ... + WARNING: variable QFIT= is missing. I will use a default value instead ... + WARNING: variable PPFITON= is missing. I will use a default value instead ... + WARNING: variable ALLFITON= is missing. I will use a default value instead ... + WARNING: variable PPSTEP= is missing. I will use a default value instead ... + WARNING: variable BISTEP= is missing. I will use a default value instead ... + WARNING: variable PP2FIT= is missing. I will use a default value instead ... + WARNING: variable BINT2FIT= is missing. I will use a default value instead ... + WARNING: variable PPNMOL= is missing. I will use a default value instead ... + WARNING: variable PPNGEOM= is missing. I will use a default value instead ... + WARNING: variable PARREP= is missing. I will use a default value instead ... + WARNING: variable VERBOSE= is missing. I will use a default value instead ... + WARNING: variable MIXER= is missing. I will use a default value instead ... + WARNING: variable RESTARTLIB= is missing. I will use a default value instead ... + WARNING: variable CGTOL= is missing. I will use a default value instead ... + WARNING: variable ELEC_ETOL= is missing. I will use a default value instead ... + WARNING: variable COULACC= is missing. I will use a default value instead ... + WARNING: variable COULCUT= is missing. I will use a default value instead ... + WARNING: variable COULR1= is missing. I will use a default value instead ... + WARNING: variable CHTOL= is missing. I will use a default value instead ... + WARNING: variable BETA= is missing. I will use a default value instead ... + WARNING: variable MCSIGMA= is missing. I will use a default value instead ... + WARNING: variable PPBETA= is missing. I will use a default value instead ... + WARNING: variable PPSIGMA= is missing. I will use a default value instead ... + WARNING: variable ER= is missing. I will use a default value instead ... + WARNING: variable INITIALIZED= is missing. I will use a default value instead ... + + + ############### Parameters used for this run ################ + CONTROL{ + xControl= 1 + DEBUGON= 0 + FERMIM= 6 + CGORLIB= 1 + NORECS= 1 + ENTROPYKIND= 1 + PPOTON= 1 + VDWON= 0 + SPINON= 0 + ELECTRO= 1 + ELECMETH= 0 + MAXSCF= 450 + MINSP2ITER= 22 + FULLQCONV= 1 + QITER= 3 + ORDERNMOL= 0 + SPARSEON= 1 + THRESHOLDON= 1 + FILLINSTOP= 100 + BLKSZ= 4 + MSPARSE= 1500 + LCNON= 0 + LCNITER= 4 + RELAX= 0 + MAXITER= 100000 + MDON= 1 + PBCON= 1 + RESTART= 0 + CHARGE= 0 + XBO= 1 + XBODISON= 1 + XBODISORDER= 5 + NGPU= 2 + KON= 0 + COMPFORCE= 1 + DOSFIT= 0 + INTS2FIT= 1 + NFITSTEP= 5000 + QFIT= 0 + PPFITON= 0 + ALLFITON= 0 + PPSTEP= 500 + BISTEP= 500 + PP2FIT= 2 + BINT2FIT= 6 + PPNMOL= 10 + PPNGEOM= 200 + PARREP= 0 + VERBOSE= 0 + MIXER= 0 + RESTARTLIB= 0 + CGTOL= 9.9999999747524271E-007 + KBT= 0.0000000000000000 + SPINTOL= 1.0000000000000000E-004 + ELEC_ETOL= 1.0000000474974513E-003 + ELEC_QTOL= 1.0000000000000000E-008 + COULACC= 9.9999999747524271E-007 + COULCUT= -500.00000000000000 + COULR1= 500.00000000000000 + BREAKTOL= 9.9999999999999995E-007 + QMIX= 0.25000000000000000 + SPINMIX= 0.25000000000000000 + MDMIX= 0.25000000000000000 + NUMTHRESH= 9.9999999999999995E-007 + CHTOL= 9.9999997764825821E-003 + SKIN= 1.0000000000000000 + RLXFTOL= 9.9999999999999995E-008 + BETA= 1000.0000000000000 + MCSIGMA= 0.20000000298023224 + PPBETA= 1000.0000000000000 + PPSIGMA= 9.9999997764825821E-003 + ER= 1.0000000000000000 + JobName=MyJob + BASISTYPE=NONORTHO + SP2CONV=REL + RELAXTYPE=SD + PARAMPATH=./TBparam + COORDSFILE=./coords.dat + INITIALIZED= F + } + + ./TBparam/electrons.dat + MDCONTROL{ } + + WARNING: variable RNDIST= is missing. I will use a default value instead ... + WARNING: variable SEEDINIT= is missing. I will use a default value instead ... + WARNING: variable NPTTYPE= is missing. I will use a default value instead ... + WARNING: variable UDNEIGH= is missing. I will use a default value instead ... + WARNING: variable DUMPFREQ= is missing. I will use a default value instead ... + WARNING: variable RSFREQ= is missing. I will use a default value instead ... + WARNING: variable WRTFREQ= is missing. I will use a default value instead ... + WARNING: variable TOINITTEMP5= is missing. I will use a default value instead ... + WARNING: variable THERMPER= is missing. I will use a default value instead ... + WARNING: variable THERMRUN= is missing. I will use a default value instead ... + WARNING: variable NVTON= is missing. I will use a default value instead ... + WARNING: variable NPTON= is missing. I will use a default value instead ... + WARNING: variable AVEPER= is missing. I will use a default value instead ... + WARNING: variable SEED= is missing. I will use a default value instead ... + WARNING: variable SHOCKON= is missing. I will use a default value instead ... + WARNING: variable SHOCKSTART= is missing. I will use a default value instead ... + WARNING: variable SHOCKDIR= is missing. I will use a default value instead ... + WARNING: variable MDADAPT= is missing. I will use a default value instead ... + WARNING: variable GETHUG= is missing. I will use a default value instead ... + WARNING: variable RSLEVEL= is missing. I will use a default value instead ... + WARNING: variable DT= is missing. I will use a default value instead ... + WARNING: variable TEMPERATURE= is missing. I will use a default value instead ... + WARNING: variable FRICTION= is missing. I will use a default value instead ... + WARNING: variable PTARGET= is missing. I will use a default value instead ... + WARNING: variable UPARTICLE= is missing. I will use a default value instead ... + WARNING: variable USHOCK= is missing. I will use a default value instead ... + WARNING: variable C0= is missing. I will use a default value instead ... + WARNING: variable E0= is missing. I will use a default value instead ... + WARNING: variable V0= is missing. I will use a default value instead ... + WARNING: variable P0= is missing. I will use a default value instead ... + WARNING: variable DUMMY= is missing. I will use a default value instead ... + + + ############### Parameters used for this run ################ + MDCONTROL{ + MAXITER= -1 + UDNEIGH= 1 + DUMPFREQ= 250 + RSFREQ= 500 + WRTFREQ= 25 + TOINITTEMP5= 1 + THERMPER= 500 + THERMRUN= 50000 + NVTON= 0 + NPTON= 0 + AVEPER= 1000 + SEED= 54 + SHOCKON= 0 + SHOCKSTART= 100000 + SHOCKDIR= 1 + MDADAPT= 0 + GETHUG= 0 + RSLEVEL= 0 + DT= 0.25000000000000000 + TEMPERATURE= 300.00000000000000 + FRICTION= 1000.0000000000000 + PTARGET= 0.0000000000000000 + UPARTICLE= 500.00000000000000 + USHOCK= -4590.0000000000000 + C0= 1300.0000000000000 + E0= -795.72497558593750 + V0= 896.98486328125000 + P0= 8.3149001002311707E-002 + RNDIST=GAUSSIAN + SEEDINIT=UNIFORM + NPTTYPE=ISO + DUMMY= F + } + + LIBCALLS 0 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15165627147849 13.850829743067372 0.0000000000000000 3.9653384620309846 + LIBCALLS 1 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15142147081917 13.850596160685321 0.0000000000000000 3.9653428217526296 + LIBCALLS 2 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15072431717670 13.849902902335046 0.0000000000000000 3.9653556077235628 + LIBCALLS 3 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14958682134301 13.848772166382796 0.0000000000000000 3.9653762812719782 + LIBCALLS 4 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14804481054080 13.847240065975685 0.0000000000000000 3.9654039257311324 + LIBCALLS 5 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14614669298459 13.845355347298943 0.0000000000000000 3.9654372593625880 + LIBCALLS 6 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14395200541782 13.843177681164811 0.0000000000000000 3.9654747563744728 + LIBCALLS 7 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14152950027858 13.840775605612510 0.0000000000000000 3.9655146828204026 + LIBCALLS 8 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13895477239572 13.838224210058369 0.0000000000000000 3.9655551214573213 + LIBCALLS 9 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13630808318862 13.835602658269416 0.0000000000000000 3.9655940696401335 + LIBCALLS 10 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13367156672246 13.832991646694552 0.0000000000000000 3.9656294961085377 + LIBCALLS 11 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13112695791978 13.830470890853416 0.0000000000000000 3.9656594331001127 + LIBCALLS 12 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12875304084571 13.828116721514562 0.0000000000000000 3.9656820468287637 + LIBCALLS 13 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12662314462005 13.825999860613845 0.0000000000000000 3.9656956633599689 + LIBCALLS 14 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12480303363179 13.824183432931337 0.0000000000000000 3.9656988576578489 + LIBCALLS 15 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12334906554690 13.822721254684298 0.0000000000000000 3.9656905013961525 + LIBCALLS 16 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12230649281338 13.821656427050725 0.0000000000000000 3.9656697961568699 + LIBCALLS 17 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12170820445976 13.821020251989051 0.0000000000000000 3.9656362957330207 + LIBCALLS 18 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12157378544725 13.820831478957400 0.0000000000000000 3.9655899465557289 + LIBCALLS 19 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12190902409918 13.821095885466233 0.0000000000000000 3.9655310732858191 + LIBCALLS 20 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12270578464654 13.821806190548854 0.0000000000000000 3.9654603894825375 + LIBCALLS 21 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12394226924755 13.822942298269552 0.0000000000000000 3.9653789701528157 + LIBCALLS 22 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12558369933174 13.824471866833779 0.0000000000000000 3.9652882392864672 + LIBCALLS 23 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12758334335854 13.826351196916939 0.0000000000000000 3.9651899208403507 + LIBCALLS 24 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12988392857540 13.828526429544008 0.0000000000000000 3.9650859962581815 + LIBCALLS 25 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13241933900565 13.830935038404082 0.0000000000000000 3.9649786471076300 + LIBCALLS 26 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13511663668885 13.833507593821677 0.0000000000000000 3.9648702062183578 + LIBCALLS 27 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13789821166085 13.836169765592846 0.0000000000000000 3.9647630647732250 + LIBCALLS 28 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14068416314257 13.838844520440762 0.0000000000000000 3.9646596094056243 + LIBCALLS 29 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14339478125902 13.841454456993119 0.0000000000000000 3.9645621614306648 + LIBCALLS 30 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14595299166797 13.843924209084781 0.0000000000000000 3.9644728862209537 + LIBCALLS 31 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14828672908391 13.846182838096166 0.0000000000000000 3.9643937231592781 + LIBCALLS 32 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15033121417270 13.848166127650318 0.0000000000000000 3.9643263326484774 + LIBCALLS 33 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15203097820654 13.849818691045462 0.0000000000000000 3.9642720350529470 + LIBCALLS 34 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15334158494318 13.851095804201121 0.0000000000000000 3.9642317563508436 + LIBCALLS 35 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15423101277941 13.851964884709183 0.0000000000000000 3.9642060118064197 + LIBCALLS 36 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15468060067406 13.852406550643760 0.0000000000000000 3.9641948735126151 + LIBCALLS 37 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15468556770435 13.852415210893483 0.0000000000000000 3.9641979705462513 + LIBCALLS 38 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15425506702360 13.851999160128511 0.0000000000000000 3.9642145018322728 + LIBCALLS 39 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15341177086162 13.851180175004831 0.0000000000000000 3.9642432622019754 + LIBCALLS 40 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15219100341108 13.849992631968849 0.0000000000000000 3.9642826797086155 + LIBCALLS 41 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15063948253476 13.848482189284203 0.0000000000000000 3.9643308764467280 + LIBCALLS 42 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14881366363778 13.846704095034502 0.0000000000000000 3.9643857194231229 + LIBCALLS 43 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14677783841711 13.844721197666447 0.0000000000000000 3.9644449063996254 + LIBCALLS 44 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14460195130079 13.842601745208173 0.0000000000000000 3.9645060327113080 + LIBCALLS 45 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14235930197236 13.840417063344470 0.0000000000000000 3.9645666751650537 + LIBCALLS 46 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14012416839108 13.838239201362184 0.0000000000000000 3.9646244709241216 + LIBCALLS 47 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13796944534135 13.836138629087953 0.0000000000000000 3.9646771958199687 + LIBCALLS 48 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13596436459642 13.834182058508610 0.0000000000000000 3.9647228360374207 + LIBCALLS 49 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13417236277201 13.832430452024822 0.0000000000000000 3.9647596471475066 + LIBCALLS 50 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13264918465853 13.830937266579358 0.0000000000000000 3.9647862263274365 + LIBCALLS 51 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13144121811348 13.829746970164395 0.0000000000000000 3.9648015300858930 + LIBCALLS 52 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13058418584075 13.828893856279002 0.0000000000000000 3.9648049379175174 + LIBCALLS 53 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13010212355317 13.828401171909800 0.0000000000000000 3.9647962482159476 + LIBCALLS 54 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13000675986638 13.828280567696357 0.0000000000000000 3.9647757005033171 + LIBCALLS 55 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13029725443062 13.828531873218640 0.0000000000000000 3.9647439679967813 + LIBCALLS 56 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13096031859556 13.829143196581525 0.0000000000000000 3.9647021412055241 + LIBCALLS 57 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13197071275096 13.830091344339912 0.0000000000000000 3.9646517009757813 + LIBCALLS 58 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13329208290526 13.831342554670950 0.0000000000000000 3.9645944691057076 + LIBCALLS 59 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13487817952188 13.832853532802908 0.0000000000000000 3.9645325717081379 + LIBCALLS 60 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13667431785007 13.834572772174083 0.0000000000000000 3.9644683636269380 + LIBCALLS 61 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13861917436014 13.836442137716100 0.0000000000000000 3.9644043716683206 + LIBCALLS 62 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14064674344610 13.838398678492441 0.0000000000000000 3.9643432117931376 + LIBCALLS 63 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14268847880851 13.840376626541268 0.0000000000000000 3.9642875107994442 + LIBCALLS 64 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14467552446979 13.842309527587247 0.0000000000000000 3.9642398279114381 + LIBCALLS 65 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14654097615647 13.844132438475109 0.0000000000000000 3.9642025589783412 + LIBCALLS 66 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14822207995957 13.845784117078871 0.0000000000000000 3.9641778771678413 + LIBCALLS 67 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14966231911774 13.847209123749478 0.0000000000000000 3.9641676470155103 + LIBCALLS 68 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15081329445576 13.848359751049152 0.0000000000000000 3.9641733618391299 + LIBCALLS 69 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15163634076458 13.849197700537186 0.0000000000000000 3.9641960937768981 + LIBCALLS 70 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15210380659516 13.849695432596437 0.0000000000000000 3.9642364336978391 + LIBCALLS 71 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15219997215792 13.849837127658775 0.0000000000000000 3.9642944914660605 + LIBCALLS 72 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15192153900722 13.849619213627008 0.0000000000000000 3.9643698667021590 + LIBCALLS 73 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15127769530471 13.849050434626310 0.0000000000000000 3.9644616585289247 + LIBCALLS 74 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15028974592457 13.848151458176057 0.0000000000000000 3.9645684873567908 + LIBCALLS 75 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14899032381624 13.846954040343237 0.0000000000000000 3.9646885325372980 + LIBCALLS 76 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14742221364327 13.845499789571511 0.0000000000000000 3.9648195821504211 + LIBCALLS 77 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14563684020112 13.843838588134755 0.0000000000000000 3.9649591055666282 + LIBCALLS 78 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14369246883172 13.842026744273829 0.0000000000000000 3.9651043223068876 + LIBCALLS 79 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14165219754119 13.840124957235691 0.0000000000000000 3.9652522794782556 + LIBCALLS 80 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13958181195608 13.838196181062383 0.0000000000000000 3.9653999492835532 + LIBCALLS 81 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13754757713065 13.836303471774007 0.0000000000000000 3.9655443071963385 + LIBCALLS 82 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13561405478509 13.834507896249461 0.0000000000000000 3.9656824354232736 + LIBCALLS 83 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13384198639028 13.832866571528193 0.0000000000000000 3.9658115908515681 + LIBCALLS 84 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13228634940748 13.831430891696755 0.0000000000000000 3.9659292903699495 + LIBCALLS 85 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13099461122306 13.830244986101496 0.0000000000000000 3.9660333724384569 + LIBCALLS 86 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13000526350720 13.829344440260281 0.0000000000000000 3.9661220782532145 + LIBCALLS 87 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12934661713206 13.828755299191645 0.0000000000000000 3.9661940662588862 + LIBCALLS 88 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12903595764971 13.828493364127572 0.0000000000000000 3.9662484623936765 + LIBCALLS 89 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12907904533250 13.828563786156602 0.0000000000000000 3.9662848954537067 + LIBCALLS 90 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12946994320248 13.828960955791626 0.0000000000000000 3.9663034756730777 + LIBCALLS 91 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13019123489619 13.829668684955367 0.0000000000000000 3.9663048073711558 + LIBCALLS 92 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13121457766835 13.830660675785223 0.0000000000000000 3.9662899643566578 + LIBCALLS 93 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13250159637499 13.831901269302985 0.0000000000000000 3.9662604605307470 + LIBCALLS 94 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13400508153813 13.833346464674193 0.0000000000000000 3.9662181906403653 + LIBCALLS 95 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13567049003717 13.834945196074795 0.0000000000000000 3.9661653991148187 + LIBCALLS 96 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13743766487022 13.836640848231452 0.0000000000000000 3.9661045863001441 + LIBCALLS 97 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13924277096038 13.838372983906890 0.0000000000000000 3.9660384593805307 + LIBCALLS 98 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14102036682124 13.840079246589914 0.0000000000000000 3.9659698320311318 + LIBCALLS 99 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14270555407057 13.841697390518378 0.0000000000000000 3.9659015537535014 + LIBCALLS 100 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14423615166146 13.843167378892108 0.0000000000000000 3.9658364191978137 diff --git a/examples/latte/log.19Sep17.latte.water.g++.1 b/examples/latte/log.19Sep17.latte.water.g++.1 new file mode 100644 index 0000000000..f4603f5963 --- /dev/null +++ b/examples/latte/log.19Sep17.latte.water.g++.1 @@ -0,0 +1,406 @@ + The log file for latte_lib + + CONTROL{ } + + WARNING: variable JobName= is missing. I will use a default value instead ... + WARNING: variable PARAMPATH= is missing. I will use a default value instead ... + WARNING: variable DEBUGON= is missing. I will use a default value instead ... + WARNING: variable FERMIM= is missing. I will use a default value instead ... + WARNING: variable CGORLIB= is missing. I will use a default value instead ... + WARNING: variable NORECS= is missing. I will use a default value instead ... + WARNING: variable VDWON= is missing. I will use a default value instead ... + WARNING: variable ORDERNMOL= is missing. I will use a default value instead ... + WARNING: variable LCNON= is missing. I will use a default value instead ... + WARNING: variable LCNITER= is missing. I will use a default value instead ... + WARNING: variable MDON= is missing. I will use a default value instead ... + WARNING: variable PBCON= is missing. I will use a default value instead ... + WARNING: variable RESTART= is missing. I will use a default value instead ... + WARNING: variable NGPU= is missing. I will use a default value instead ... + WARNING: variable COMPFORCE= is missing. I will use a default value instead ... + WARNING: variable DOSFIT= is missing. I will use a default value instead ... + WARNING: variable INTS2FIT= is missing. I will use a default value instead ... + WARNING: variable NFITSTEP= is missing. I will use a default value instead ... + WARNING: variable QFIT= is missing. I will use a default value instead ... + WARNING: variable PPFITON= is missing. I will use a default value instead ... + WARNING: variable ALLFITON= is missing. I will use a default value instead ... + WARNING: variable PPSTEP= is missing. I will use a default value instead ... + WARNING: variable BISTEP= is missing. I will use a default value instead ... + WARNING: variable PP2FIT= is missing. I will use a default value instead ... + WARNING: variable BINT2FIT= is missing. I will use a default value instead ... + WARNING: variable PPNMOL= is missing. I will use a default value instead ... + WARNING: variable PPNGEOM= is missing. I will use a default value instead ... + WARNING: variable PARREP= is missing. I will use a default value instead ... + WARNING: variable VERBOSE= is missing. I will use a default value instead ... + WARNING: variable MIXER= is missing. I will use a default value instead ... + WARNING: variable RESTARTLIB= is missing. I will use a default value instead ... + WARNING: variable CGTOL= is missing. I will use a default value instead ... + WARNING: variable ELEC_ETOL= is missing. I will use a default value instead ... + WARNING: variable COULACC= is missing. I will use a default value instead ... + WARNING: variable COULCUT= is missing. I will use a default value instead ... + WARNING: variable COULR1= is missing. I will use a default value instead ... + WARNING: variable CHTOL= is missing. I will use a default value instead ... + WARNING: variable BETA= is missing. I will use a default value instead ... + WARNING: variable MCSIGMA= is missing. I will use a default value instead ... + WARNING: variable PPBETA= is missing. I will use a default value instead ... + WARNING: variable PPSIGMA= is missing. I will use a default value instead ... + WARNING: variable ER= is missing. I will use a default value instead ... + WARNING: variable INITIALIZED= is missing. I will use a default value instead ... + + + ############### Parameters used for this run ################ + CONTROL{ + xControl= 1 + DEBUGON= 0 + FERMIM= 6 + CGORLIB= 1 + NORECS= 1 + ENTROPYKIND= 1 + PPOTON= 1 + VDWON= 0 + SPINON= 0 + ELECTRO= 1 + ELECMETH= 0 + MAXSCF= 450 + MINSP2ITER= 22 + FULLQCONV= 1 + QITER= 3 + ORDERNMOL= 0 + SPARSEON= 1 + THRESHOLDON= 1 + FILLINSTOP= 100 + BLKSZ= 4 + MSPARSE= 1500 + LCNON= 0 + LCNITER= 4 + RELAX= 0 + MAXITER= 100000 + MDON= 1 + PBCON= 1 + RESTART= 0 + CHARGE= 0 + XBO= 1 + XBODISON= 1 + XBODISORDER= 5 + NGPU= 2 + KON= 0 + COMPFORCE= 1 + DOSFIT= 0 + INTS2FIT= 1 + NFITSTEP= 5000 + QFIT= 0 + PPFITON= 0 + ALLFITON= 0 + PPSTEP= 500 + BISTEP= 500 + PP2FIT= 2 + BINT2FIT= 6 + PPNMOL= 10 + PPNGEOM= 200 + PARREP= 0 + VERBOSE= 0 + MIXER= 0 + RESTARTLIB= 0 + CGTOL= 9.9999999747524271E-007 + KBT= 0.0000000000000000 + SPINTOL= 1.0000000000000000E-004 + ELEC_ETOL= 1.0000000474974513E-003 + ELEC_QTOL= 1.0000000000000000E-008 + COULACC= 9.9999999747524271E-007 + COULCUT= -500.00000000000000 + COULR1= 500.00000000000000 + BREAKTOL= 9.9999999999999995E-007 + QMIX= 0.25000000000000000 + SPINMIX= 0.25000000000000000 + MDMIX= 0.25000000000000000 + NUMTHRESH= 9.9999999999999995E-007 + CHTOL= 9.9999997764825821E-003 + SKIN= 1.0000000000000000 + RLXFTOL= 9.9999999999999995E-008 + BETA= 1000.0000000000000 + MCSIGMA= 0.20000000298023224 + PPBETA= 1000.0000000000000 + PPSIGMA= 9.9999997764825821E-003 + ER= 1.0000000000000000 + JobName=MyJob + BASISTYPE=NONORTHO + SP2CONV=REL + RELAXTYPE=SD + PARAMPATH=./TBparam + COORDSFILE=./coords.dat + INITIALIZED= F + } + + ./TBparam/electrons.dat + MDCONTROL{ } + + WARNING: variable RNDIST= is missing. I will use a default value instead ... + WARNING: variable SEEDINIT= is missing. I will use a default value instead ... + WARNING: variable NPTTYPE= is missing. I will use a default value instead ... + WARNING: variable UDNEIGH= is missing. I will use a default value instead ... + WARNING: variable DUMPFREQ= is missing. I will use a default value instead ... + WARNING: variable RSFREQ= is missing. I will use a default value instead ... + WARNING: variable WRTFREQ= is missing. I will use a default value instead ... + WARNING: variable TOINITTEMP5= is missing. I will use a default value instead ... + WARNING: variable THERMPER= is missing. I will use a default value instead ... + WARNING: variable THERMRUN= is missing. I will use a default value instead ... + WARNING: variable NVTON= is missing. I will use a default value instead ... + WARNING: variable NPTON= is missing. I will use a default value instead ... + WARNING: variable AVEPER= is missing. I will use a default value instead ... + WARNING: variable SEED= is missing. I will use a default value instead ... + WARNING: variable SHOCKON= is missing. I will use a default value instead ... + WARNING: variable SHOCKSTART= is missing. I will use a default value instead ... + WARNING: variable SHOCKDIR= is missing. I will use a default value instead ... + WARNING: variable MDADAPT= is missing. I will use a default value instead ... + WARNING: variable GETHUG= is missing. I will use a default value instead ... + WARNING: variable RSLEVEL= is missing. I will use a default value instead ... + WARNING: variable DT= is missing. I will use a default value instead ... + WARNING: variable TEMPERATURE= is missing. I will use a default value instead ... + WARNING: variable FRICTION= is missing. I will use a default value instead ... + WARNING: variable PTARGET= is missing. I will use a default value instead ... + WARNING: variable UPARTICLE= is missing. I will use a default value instead ... + WARNING: variable USHOCK= is missing. I will use a default value instead ... + WARNING: variable C0= is missing. I will use a default value instead ... + WARNING: variable E0= is missing. I will use a default value instead ... + WARNING: variable V0= is missing. I will use a default value instead ... + WARNING: variable P0= is missing. I will use a default value instead ... + WARNING: variable DUMMY= is missing. I will use a default value instead ... + + + ############### Parameters used for this run ################ + MDCONTROL{ + MAXITER= -1 + UDNEIGH= 1 + DUMPFREQ= 250 + RSFREQ= 500 + WRTFREQ= 25 + TOINITTEMP5= 1 + THERMPER= 500 + THERMRUN= 50000 + NVTON= 0 + NPTON= 0 + AVEPER= 1000 + SEED= 54 + SHOCKON= 0 + SHOCKSTART= 100000 + SHOCKDIR= 1 + MDADAPT= 0 + GETHUG= 0 + RSLEVEL= 0 + DT= 0.25000000000000000 + TEMPERATURE= 300.00000000000000 + FRICTION= 1000.0000000000000 + PTARGET= 0.0000000000000000 + UPARTICLE= 500.00000000000000 + USHOCK= -4590.0000000000000 + C0= 1300.0000000000000 + E0= -795.72497558593750 + V0= 896.98486328125000 + P0= 8.3149001002311707E-002 + RNDIST=GAUSSIAN + SEEDINIT=UNIFORM + NPTTYPE=ISO + DUMMY= F + } + + LIBCALLS 0 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -110.94281402417451 9.3197859655447317 0.0000000000000000 3.3331152608769714 + LIBCALLS 1 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.00875524736128 9.3653691493930946 0.0000000000000000 3.3307590218500454 + LIBCALLS 2 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.20542679804305 9.5022104076319209 0.0000000000000000 3.3237269236958826 + LIBCALLS 3 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.52938059528239 9.7304811436977623 0.0000000000000000 3.3121168872278743 + LIBCALLS 4 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.97463249071366 10.050121693432235 0.0000000000000000 3.2961492065207088 + LIBCALLS 5 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.53270518796754 10.460328095449432 0.0000000000000000 3.2761112890303719 + LIBCALLS 6 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.19233973551384 10.958848347453728 0.0000000000000000 3.2524094948032394 + LIBCALLS 7 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.93936061504219 11.541120618354967 0.0000000000000000 3.2255715906285793 + LIBCALLS 8 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.75657630591589 12.199315594286325 0.0000000000000000 3.1962412869596100 + LIBCALLS 9 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.62363727592754 12.921383532128770 0.0000000000000000 3.1652236023838971 + LIBCALLS 10 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.51738028417616 13.690253224922545 0.0000000000000000 3.1333864449223818 + LIBCALLS 11 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.41167836078414 14.483370804317431 0.0000000000000000 3.1018474945925432 + LIBCALLS 12 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.27888830961329 15.272791625586624 0.0000000000000000 3.0716022180609772 + LIBCALLS 13 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.09006809777934 16.026020995592610 0.0000000000000000 3.0437832241644842 + LIBCALLS 14 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.81665859965702 16.707725410478066 0.0000000000000000 3.0194382402972129 + LIBCALLS 15 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.43171665196000 17.282293509806884 0.0000000000000000 2.9995944159949395 + LIBCALLS 16 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.91202932933264 17.717025741135480 0.0000000000000000 2.9850159611897484 + LIBCALLS 17 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.23935305628714 17.985521384886379 0.0000000000000000 2.9763132734231292 + LIBCALLS 18 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.40195013006486 18.070687763205626 0.0000000000000000 2.9738279411203812 + LIBCALLS 19 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.39540873020161 17.966785565900089 0.0000000000000000 2.9776410698341418 + LIBCALLS 20 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.22299732491055 17.680085363043698 0.0000000000000000 2.9875419962840417 + LIBCALLS 21 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.89520311723561 17.228004261852682 0.0000000000000000 3.0030824758482719 + LIBCALLS 22 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.42892991839108 16.636927104987372 0.0000000000000000 3.0235548851138652 + LIBCALLS 23 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.84603562384113 15.939176953031323 0.0000000000000000 3.0480682132279808 + LIBCALLS 24 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.17151378155378 15.169713318754383 0.0000000000000000 3.0757033760823562 + LIBCALLS 25 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.43237009319661 14.363090728730079 0.0000000000000000 3.1053593079625457 + LIBCALLS 26 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.65587959220025 13.551051330611342 0.0000000000000000 3.1359367589132958 + LIBCALLS 27 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.86794783202731 12.760928656005802 0.0000000000000000 3.1665525874091585 + LIBCALLS 28 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.09314111752745 12.014864684105008 0.0000000000000000 3.1962157162544820 + LIBCALLS 29 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.35329645548983 11.329720850249741 0.0000000000000000 3.2241713466126849 + LIBCALLS 30 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.66766945168203 10.717501941208962 0.0000000000000000 3.2497326120829619 + LIBCALLS 31 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.05267853351812 10.186102377105355 0.0000000000000000 3.2723439005172468 + LIBCALLS 32 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.52195471723405 9.7402032028335377 0.0000000000000000 3.2915777178346559 + LIBCALLS 33 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.08654808143162 9.3821857555240076 0.0000000000000000 3.3070881064986164 + LIBCALLS 34 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.75494140290169 9.1129669843369658 0.0000000000000000 3.3186769594405297 + LIBCALLS 35 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.53346080566452 8.9326971516334606 0.0000000000000000 3.3261797960311763 + LIBCALLS 36 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.42631053676025 8.8412887543407273 0.0000000000000000 3.3295101207595583 + LIBCALLS 37 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.43567911088179 8.8387604511711384 0.0000000000000000 3.3286360397306387 + LIBCALLS 38 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.56180874683180 8.9253908783870841 0.0000000000000000 3.3235794828927934 + LIBCALLS 39 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.80290981416660 9.1016780459478674 0.0000000000000000 3.3144303393175201 + LIBCALLS 40 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.15529209572232 9.3681021116147463 0.0000000000000000 3.3012719922659173 + LIBCALLS 41 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.61284717182851 9.7246892073080176 0.0000000000000000 3.2843276907821406 + LIBCALLS 42 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.16711238367500 10.170382433756300 0.0000000000000000 3.2638758866524444 + LIBCALLS 43 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.80697882175535 10.702240750749448 0.0000000000000000 3.2402928278295451 + LIBCALLS 44 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.51862249254057 11.314512276989859 0.0000000000000000 3.2140189987358694 + LIBCALLS 45 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.28534475502829 11.997664972113199 0.0000000000000000 3.1855791836729437 + LIBCALLS 46 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.08723294353808 12.737504349188432 0.0000000000000000 3.1557205936583181 + LIBCALLS 47 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.90172272355942 13.514542609912253 0.0000000000000000 3.1252466759266087 + LIBCALLS 48 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.70392627447073 14.303827027310493 0.0000000000000000 3.0950533786893732 + LIBCALLS 49 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.46728361372288 15.075425279261220 0.0000000000000000 3.0661202668284480 + LIBCALLS 50 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.16480071670361 15.795723720235596 0.0000000000000000 3.0394030522382605 + LIBCALLS 51 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.77012122199473 16.429579578207949 0.0000000000000000 3.0158910566711334 + LIBCALLS 52 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.25943485841766 16.943195338409559 0.0000000000000000 2.9964108616830281 + LIBCALLS 53 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.61275582007269 17.307379355481601 0.0000000000000000 2.9817016064731785 + LIBCALLS 54 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.81557415209883 17.500688554193868 0.0000000000000000 2.9722905637821611 + LIBCALLS 55 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.85979389563140 17.511877645177901 0.0000000000000000 2.9685356305551474 + LIBCALLS 56 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.74454585055143 17.341170281709367 0.0000000000000000 2.9705149057151141 + LIBCALLS 57 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.47625724150488 17.000096879575938 0.0000000000000000 2.9780008785307088 + LIBCALLS 58 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.06771474420596 16.509959464438374 0.0000000000000000 2.9906138266349656 + LIBCALLS 59 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.53702830874704 15.899266098308772 0.0000000000000000 3.0078351734174715 + LIBCALLS 60 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.90667912574422 15.200652842845301 0.0000000000000000 3.0288733658622142 + LIBCALLS 61 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.20142467775943 14.447825469624703 0.0000000000000000 3.0529481020908245 + LIBCALLS 62 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.44747494197328 13.672949108115853 0.0000000000000000 3.0790791220573088 + LIBCALLS 63 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.67063237406208 12.904741667499017 0.0000000000000000 3.1063745183559131 + LIBCALLS 64 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.89550228683500 12.167344616151606 0.0000000000000000 3.1339818740985033 + LIBCALLS 65 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.14487351718614 11.479908971904207 0.0000000000000000 3.1610748652786995 + LIBCALLS 66 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.43917601644073 10.856755674815151 0.0000000000000000 3.1869042214936911 + LIBCALLS 67 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.79630542914917 10.307930318909381 0.0000000000000000 3.2107896540741994 + LIBCALLS 68 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.23118520942130 9.8399835349372715 0.0000000000000000 3.2322754400486997 + LIBCALLS 69 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.75645667348935 9.4568320682906393 0.0000000000000000 3.2508686207040949 + LIBCALLS 70 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.38220191758144 9.1605931457952803 0.0000000000000000 3.2662052636761625 + LIBCALLS 71 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.11651461323785 8.9523172650382463 0.0000000000000000 3.2778578161416640 + LIBCALLS 72 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.96490300473705 8.8325758589074610 0.0000000000000000 3.2856373346184280 + LIBCALLS 73 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.93101384064629 8.8018792766284140 0.0000000000000000 3.2893376450243901 + LIBCALLS 74 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.01657988020818 8.8609123616606951 0.0000000000000000 3.2887786713823335 + LIBCALLS 75 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.22122702505257 9.0105808374276855 0.0000000000000000 3.2838806809960044 + LIBCALLS 76 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.54255812607462 9.2518619694254909 0.0000000000000000 3.2746170980725564 + LIBCALLS 77 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.97595003796289 9.5854566564348804 0.0000000000000000 3.2610495238703536 + LIBCALLS 78 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.51445216471619 10.011242264155852 0.0000000000000000 3.2433103887056101 + LIBCALLS 79 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.14835871057100 10.527538366743359 0.0000000000000000 3.2217018278255036 + LIBCALLS 80 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.86512618816471 11.130220642932718 0.0000000000000000 3.1966546818138903 + LIBCALLS 81 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.64916580084807 11.811746817430592 0.0000000000000000 3.1687509169099037 + LIBCALLS 82 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.48162972769103 12.560201275368994 0.0000000000000000 3.1387793445426220 + LIBCALLS 83 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.34080112521505 13.358507776606700 0.0000000000000000 3.1076005013428842 + LIBCALLS 84 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.20206255799097 14.183999576696523 0.0000000000000000 3.0762625451098367 + LIBCALLS 85 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.03875955947012 15.008549885925623 0.0000000000000000 3.0458557745855401 + LIBCALLS 86 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.82281065648482 15.799445052997022 0.0000000000000000 3.0175902569508040 + LIBCALLS 87 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.52638053902615 16.521105731022047 0.0000000000000000 2.9925661691795984 + LIBCALLS 88 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.12297505178334 17.137613862262167 0.0000000000000000 2.9718740800190462 + LIBCALLS 89 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.58954501498538 17.615819283155187 0.0000000000000000 2.9563457612376758 + LIBCALLS 90 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.90768650775293 17.928615619513138 0.0000000000000000 2.9466637669908935 + LIBCALLS 91 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -123.06510359278838 18.057846294334183 0.0000000000000000 2.9432773288779130 + LIBCALLS 92 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -123.05653995529889 17.996310208253615 0.0000000000000000 2.9463730237128352 + LIBCALLS 93 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.88443709725219 17.748486968230267 0.0000000000000000 2.9557418006906766 + LIBCALLS 94 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.55804625906457 17.329857520510558 0.0000000000000000 2.9710497340098647 + LIBCALLS 95 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.09316916859144 16.764989519228550 0.0000000000000000 2.9916333369114647 + LIBCALLS 96 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.51050736457847 16.084787212290774 0.0000000000000000 3.0167038701280053 + LIBCALLS 97 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.83475656442954 15.323405512114466 0.0000000000000000 3.0451593241515909 + LIBCALLS 98 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.09218577985371 14.515310319889227 0.0000000000000000 3.0759929793994090 + LIBCALLS 99 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.30969482099719 13.692843612811791 0.0000000000000000 3.1081426979179545 + LIBCALLS 100 + Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.51358261827596 12.884492109393644 0.0000000000000000 3.1405428597121636 diff --git a/examples/latte/log.19Sep17.latte.water.min.g++.1 b/examples/latte/log.19Sep17.latte.water.min.g++.1 new file mode 100644 index 0000000000..4b96bd2668 --- /dev/null +++ b/examples/latte/log.19Sep17.latte.water.min.g++.1 @@ -0,0 +1,152 @@ +LAMMPS (1 Sep 2017) +# simple water model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.water + orthogonal box = (0 0 0) to (6.267 6.267 6.267) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 24 atoms + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte NULL +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# minimization + +thermo 10 +min_style fire +minimize 1.0e-9 1.0e-9 500 500 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.629 | 5.629 | 5.629 Mbytes +Step Temp PotEng TotEng Press + 0 0 -104.95614 -104.95614 48229.712 + 10 349.44219 -105.50971 -104.47083 62149.591 + 20 1253.6752 -107.00898 -103.28182 116444.44 + 30 134.63588 -107.56184 -107.16157 59854.143 + 40 2.4043703 -108.15301 -108.14586 32685.77 + 50 162.13426 -108.40551 -107.92349 62104.273 + 60 134.03149 -108.70118 -108.30271 49400.525 + 70 64.159014 -108.78034 -108.5896 37243.303 + 80 240.49926 -109.10766 -108.39266 42158.884 + 90 0.60467192 -109.61818 -109.61639 14107.515 + 100 1.4691163 -109.65556 -109.65119 21596.775 + 110 30.500628 -109.69267 -109.602 16104.639 + 120 120.62379 -109.83749 -109.47888 9474.971 + 130 8.4742975 -109.99986 -109.97467 10104.102 + 140 3.4732679 -110.01209 -110.00176 11990.442 + 150 24.749482 -110.04313 -109.96955 10851.569 + 160 4.1106505 -110.13288 -110.12066 8257.3969 + 170 0.0065628716 -110.18061 -110.18059 7876.8748 + 180 2.0542078 -110.1837 -110.17759 7996.0533 + 190 20.134782 -110.21071 -110.15085 7556.1811 + 200 2.3397267 -110.3244 -110.31745 3767.062 + 210 4.3544709 -110.34438 -110.33143 4889.145 + 220 1.1872367 -110.37457 -110.37104 4162.6543 + 230 2.2798399 -110.38081 -110.37403 4321.0943 + 240 11.835907 -110.39611 -110.36092 4187.5757 + 250 0.13741849 -110.41453 -110.41412 3720.7527 + 260 4.2283185 -110.42036 -110.40779 3743.3494 + 270 0.47243724 -110.44349 -110.44208 3172.1866 + 280 0.06090137 -110.45428 -110.4541 3065.9348 + 290 5.3413962 -110.46285 -110.44697 3121.2924 + 300 8.2032986 -110.48519 -110.4608 2705.5001 + 310 2.0783529 -110.48807 -110.48189 2740.7989 + 320 16.629185 -110.51002 -110.46058 2581.7434 + 330 0.19723065 -110.53444 -110.53385 1942.0228 + 340 6.2758334 -110.54361 -110.52495 1924.0965 + 350 1.4539052 -110.59108 -110.58676 -449.41056 + 360 0.0514233 -110.60143 -110.60128 1284.8259 + 370 1.7240145 -110.60394 -110.59881 1468.0004 + 380 13.28516 -110.62337 -110.58387 1573.4714 + 390 1.2247432 -110.63525 -110.63161 1113.4557 + 400 0.3946985 -110.63694 -110.63576 1083.0801 + 410 2.9831433 -110.641 -110.63213 1112.419 + 420 0.068550589 -110.66029 -110.66009 897.09211 + 430 0.83976182 -110.66259 -110.66009 918.69832 + 440 4.4760907 -110.66844 -110.65513 915.24435 + 450 1.2841241 -110.67482 -110.671 953.30422 + 460 2.5707455 -110.68509 -110.67745 775.21273 + 470 0.99721544 -110.68646 -110.6835 812.74984 + 480 6.8379261 -110.69468 -110.67435 787.9705 + 490 0.18134438 -110.69628 -110.69574 675.52792 + 500 2.0946523 -110.69918 -110.69295 696.82065 +Loop time of 31.775 on 1 procs for 500 steps with 24 atoms + +884.8% CPU use with 1 MPI tasks x no OpenMP threads + +Minimization stats: + Stopping criterion = max iterations + Energy initial, next-to-last, final = + -104.95614332 -110.698546127 -110.699182193 + Force two-norm initial, final = 19.119 0.234621 + Force max component initial, final = 11.7759 0.0903198 + Final line search alpha, max atom move = 0 0 + Iterations, force evaluations = 500 500 + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.00016952 | 0.00016952 | 0.00016952 | 0.0 | 0.00 +Bond | 2.8372e-05 | 2.8372e-05 | 2.8372e-05 | 0.0 | 0.00 +Neigh | 3.0994e-05 | 3.0994e-05 | 3.0994e-05 | 0.0 | 0.00 +Comm | 0.00060034 | 0.00060034 | 0.00060034 | 0.0 | 0.00 +Output | 0.00057817 | 0.00057817 | 0.00057817 | 0.0 | 0.00 +Modify | 31.771 | 31.771 | 31.771 | 0.0 | 99.99 +Other | | 0.002469 | | | 0.01 + +Nlocal: 24 ave 24 max 24 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 71 ave 71 max 71 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 27 ave 27 max 27 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 27 +Ave neighs/atom = 1.125 +Ave special neighs/atom = 0 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:31 diff --git a/examples/python/README.fix_python_move b/examples/python/README.fix_python_move new file mode 100644 index 0000000000..95730d327c --- /dev/null +++ b/examples/python/README.fix_python_move @@ -0,0 +1,16 @@ +This folder contains several LAMMPS input scripts and a python module +file py_nve.py to demonstrate the use of the fix style python/move +to reimplement NVE using Python. + +in.fix_python_move_nve_melt: +This is a version of the melt example which replaces the default NVE integrator +with a Python implementation. Fix python/move is used to create an +instance of the py_nve.NVE class which implements the required interface. +It demonstrates how to access LAMMPS data as numpy arrays. This gives direct +access to memory owned by the C++ code, allows easy manipulation through numpy +operations and avoids unnecessary copies. + +in.fix_python_move_nve_melt_opt: +This version of melt example uses NVE_Opt instead of NVE. While this Python +implementation is still much slower than the native version, it shows that +simple code transformations can lead to speedups. diff --git a/examples/python/funcs.py b/examples/python/funcs.py index f38aca53f2..71865f62f4 100644 --- a/examples/python/funcs.py +++ b/examples/python/funcs.py @@ -8,17 +8,21 @@ def loop(N,cut0,thresh,lmpptr): from lammps import lammps lmp = lammps(ptr=lmpptr) natoms = lmp.get_natoms() - - for i in range(N): - cut = cut0 + i*0.1 - lmp.set_variable("cut",cut) # set a variable in LAMMPS + try: + for i in range(N): + cut = cut0 + i*0.1 - lmp.command("pair_style lj/cut ${cut}") # LAMMPS command - #lmp.command("pair_style lj/cut %d" % cut) # LAMMPS command option + lmp.set_variable("cut",cut) # set a variable in LAMMPS + + lmp.command("pair_style lj/cut ${cut}") # LAMMPS command + #lmp.command("pair_style lj/cut %d" % cut) # LAMMPS command option + + lmp.command("pair_coeff * * 1.0 1.0") # ditto + lmp.command("run 10") # ditto + pe = lmp.extract_compute("thermo_pe",0,0) # extract total PE from LAMMPS + print("PE",pe/natoms,thresh) + if pe/natoms < thresh: return + except Exception as e: + print("LOOP error:", e) - lmp.command("pair_coeff * * 1.0 1.0") # ditto - lmp.command("run 10") # ditto - pe = lmp.extract_compute("thermo_pe",0,0) # extract total PE from LAMMPS - print("PE",pe/natoms,thresh) - if pe/natoms < thresh: return diff --git a/examples/python/in.fix_python b/examples/python/in.fix_python_invoke similarity index 88% rename from examples/python/in.fix_python rename to examples/python/in.fix_python_invoke index c98029a63b..f77cc15c90 100644 --- a/examples/python/in.fix_python +++ b/examples/python/in.fix_python_invoke @@ -33,8 +33,8 @@ def post_force_callback(lmp, v): """ fix 1 all nve -fix 2 all python 50 end_of_step end_of_step_callback -fix 3 all python 50 post_force post_force_callback +fix 2 all python/invoke 50 end_of_step end_of_step_callback +fix 3 all python/invoke 50 post_force post_force_callback #dump id all atom 50 dump.melt diff --git a/examples/python/in.fix_python_move_nve_melt b/examples/python/in.fix_python_move_nve_melt new file mode 100644 index 0000000000..24828d7445 --- /dev/null +++ b/examples/python/in.fix_python_move_nve_melt @@ -0,0 +1,23 @@ +# 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.0 + +velocity all create 3.0 87287 + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all python/move py_nve.NVE + +thermo 50 +run 250 diff --git a/examples/python/in.fix_python_move_nve_melt_opt b/examples/python/in.fix_python_move_nve_melt_opt new file mode 100644 index 0000000000..9564ffa02e --- /dev/null +++ b/examples/python/in.fix_python_move_nve_melt_opt @@ -0,0 +1,23 @@ +# 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.0 + +velocity all create 3.0 87287 + +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all python/move py_nve.NVE_Opt + +thermo 50 +run 250 diff --git a/examples/python/in.python b/examples/python/in.python index c5aa504d43..9372c684d6 100644 --- a/examples/python/in.python +++ b/examples/python/in.python @@ -28,6 +28,7 @@ python simple here """ from __future__ import print_function def simple(): + foo = 0 print("Inside simple function") try: foo += 1 diff --git a/examples/python/py_nve.py b/examples/python/py_nve.py new file mode 100644 index 0000000000..79331528b1 --- /dev/null +++ b/examples/python/py_nve.py @@ -0,0 +1,118 @@ +from __future__ import print_function +import lammps +import ctypes +import traceback +import numpy as np + +class LAMMPSFix(object): + def __init__(self, ptr, group_name="all"): + self.lmp = lammps.lammps(ptr=ptr) + self.group_name = group_name + +class LAMMPSFixMove(LAMMPSFix): + def __init__(self, ptr, group_name="all"): + super(LAMMPSFixMove, self).__init__(ptr, group_name) + + def init(self): + pass + + def initial_integrate(self, vflag): + pass + + def final_integrate(self): + pass + + def initial_integrate_respa(self, vflag, ilevel, iloop): + pass + + def final_integrate_respa(self, ilevel, iloop): + pass + + def reset_dt(self): + pass + + +class NVE(LAMMPSFixMove): + """ Python implementation of fix/nve """ + def __init__(self, ptr, group_name="all"): + super(NVE, self).__init__(ptr) + assert(self.group_name == "all") + + def init(self): + dt = self.lmp.extract_global("dt", 1) + ftm2v = self.lmp.extract_global("ftm2v", 1) + self.ntypes = self.lmp.extract_global("ntypes", 0) + self.dtv = dt + self.dtf = 0.5 * dt * ftm2v + + def initial_integrate(self, vflag): + nlocal = self.lmp.extract_global("nlocal", 0) + mass = self.lmp.numpy.extract_atom_darray("mass", self.ntypes+1) + atype = self.lmp.numpy.extract_atom_iarray("type", nlocal) + x = self.lmp.numpy.extract_atom_darray("x", nlocal, dim=3) + v = self.lmp.numpy.extract_atom_darray("v", nlocal, dim=3) + f = self.lmp.numpy.extract_atom_darray("f", nlocal, dim=3) + + for i in range(x.shape[0]): + dtfm = self.dtf / mass[int(atype[i])] + v[i,:]+= dtfm * f[i,:] + x[i,:] += self.dtv * v[i,:] + + def final_integrate(self): + nlocal = self.lmp.extract_global("nlocal", 0) + mass = self.lmp.numpy.extract_atom_darray("mass", self.ntypes+1) + atype = self.lmp.numpy.extract_atom_iarray("type", nlocal) + v = self.lmp.numpy.extract_atom_darray("v", nlocal, dim=3) + f = self.lmp.numpy.extract_atom_darray("f", nlocal, dim=3) + + for i in range(v.shape[0]): + dtfm = self.dtf / mass[int(atype[i])] + v[i,:] += dtfm * f[i,:] + + +class NVE_Opt(LAMMPSFixMove): + """ Performance-optimized Python implementation of fix/nve """ + def __init__(self, ptr, group_name="all"): + super(NVE_Opt, self).__init__(ptr) + assert(self.group_name == "all") + + def init(self): + dt = self.lmp.extract_global("dt", 1) + ftm2v = self.lmp.extract_global("ftm2v", 1) + self.ntypes = self.lmp.extract_global("ntypes", 0) + self.dtv = dt + self.dtf = 0.5 * dt * ftm2v + self.mass = self.lmp.numpy.extract_atom_darray("mass", self.ntypes+1) + + def initial_integrate(self, vflag): + nlocal = self.lmp.extract_global("nlocal", 0) + atype = self.lmp.numpy.extract_atom_iarray("type", nlocal) + x = self.lmp.numpy.extract_atom_darray("x", nlocal, dim=3) + v = self.lmp.numpy.extract_atom_darray("v", nlocal, dim=3) + f = self.lmp.numpy.extract_atom_darray("f", nlocal, dim=3) + dtf = self.dtf + dtv = self.dtv + mass = self.mass + + dtfm = dtf / np.take(mass, atype) + dtfm.reshape((nlocal, 1)) + + for d in range(x.shape[1]): + v[:,d] += dtfm[:,0] * f[:,d] + x[:,d] += dtv * v[:,d] + + def final_integrate(self): + nlocal = self.lmp.extract_global("nlocal", 0) + mass = self.lmp.numpy.extract_atom_darray("mass", self.ntypes+1) + atype = self.lmp.numpy.extract_atom_iarray("type", nlocal) + v = self.lmp.numpy.extract_atom_darray("v", nlocal, dim=3) + f = self.lmp.numpy.extract_atom_darray("f", nlocal, dim=3) + dtf = self.dtf + dtv = self.dtv + mass = self.mass + + dtfm = dtf / np.take(mass, atype) + dtfm.reshape((nlocal, 1)) + + for d in range(v.shape[1]): + v[:,d] += dtfm[:,0] * f[:,d] diff --git a/examples/reax/AB/log.5Oct16.AB.g++.4 b/examples/reax/AB/log.5Oct16.AB.g++.4 deleted file mode 100644 index cfc4476ef5..0000000000 --- a/examples/reax/AB/log.5Oct16.AB.g++.4 +++ /dev/null @@ -1,70 +0,0 @@ -LAMMPS (5 Oct 2016) -# REAX potential for Nitroamines system -# ..... - -units real - -atom_style charge -read_data data.AB - orthogonal box = (0 0 0) to (25 25 25) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 104 atoms - -pair_style reax/c lmp_control -pair_coeff * * ffield.reax.AB H B N -Reading potential file ffield.reax.AB with DATE: 2011-02-18 - -neighbor 2 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1e-6 param.qeq -fix 3 all temp/berendsen 500.0 500.0 100.0 - -timestep 0.25 - -#dump 1 all atom 30 dump.reax.ab - -run 3000 -Neighbor list info ... - 2 neighbor list requests - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12 - ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 12.622 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0 -8505.1816 0 -8505.1816 -673.36566 - 3000 496.56561 -8405.3755 0 -8252.9182 472.58916 -Loop time of 7.23109 on 4 procs for 3000 steps with 104 atoms - -Performance: 8.961 ns/day, 2.678 hours/ns, 414.875 timesteps/s -99.4% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 5.705 | 5.7262 | 5.7504 | 0.7 | 79.19 -Neigh | 0.14367 | 0.15976 | 0.16805 | 2.4 | 2.21 -Comm | 0.053353 | 0.077311 | 0.097821 | 5.7 | 1.07 -Output | 1.812e-05 | 1.9848e-05 | 2.408e-05 | 0.1 | 0.00 -Modify | 1.2559 | 1.2647 | 1.2818 | 0.9 | 17.49 -Other | | 0.003126 | | | 0.04 - -Nlocal: 26 ave 35 max 13 min -Histogram: 1 0 0 0 0 1 0 0 1 1 -Nghost: 421 ave 450 max 377 min -Histogram: 1 0 0 0 0 1 0 0 1 1 -Neighs: 847.25 ave 1149 max 444 min -Histogram: 1 0 0 0 1 0 0 0 1 1 - -Total # of neighbors = 3389 -Ave neighs/atom = 32.5865 -Neighbor list builds = 300 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:07 diff --git a/examples/reax/AB/log.5Oct16.AB.g++.1 b/examples/reax/AB/log.8Mar18.AB.g++.1 similarity index 50% rename from examples/reax/AB/log.5Oct16.AB.g++.1 rename to examples/reax/AB/log.8Mar18.AB.g++.1 index df7d20d8bc..065b1a1e67 100644 --- a/examples/reax/AB/log.5Oct16.AB.g++.1 +++ b/examples/reax/AB/log.8Mar18.AB.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for Nitroamines system # ..... @@ -28,43 +29,53 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 18.4119 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 19.3 | 19.3 | 19.3 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -8505.1816 0 -8505.1816 -673.36566 - 3000 499.30579 -8405.1387 0 -8251.8401 -94.844317 -Loop time of 12.5114 on 1 procs for 3000 steps with 104 atoms + 3000 478.18595 -8398.4168 0 -8251.6025 1452.6935 +Loop time of 14.3573 on 1 procs for 3000 steps with 104 atoms -Performance: 5.179 ns/day, 4.634 hours/ns, 239.782 timesteps/s -99.3% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 4.513 ns/day, 5.318 hours/ns, 208.952 timesteps/s +96.6% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.137 | 11.137 | 11.137 | 0.0 | 89.01 -Neigh | 0.29816 | 0.29816 | 0.29816 | 0.0 | 2.38 -Comm | 0.016993 | 0.016993 | 0.016993 | 0.0 | 0.14 -Output | 1.1921e-05 | 1.1921e-05 | 1.1921e-05 | 0.0 | 0.00 -Modify | 1.0552 | 1.0552 | 1.0552 | 0.0 | 8.43 -Other | | 0.004142 | | | 0.03 +Pair | 12.709 | 12.709 | 12.709 | 0.0 | 88.52 +Neigh | 0.36804 | 0.36804 | 0.36804 | 0.0 | 2.56 +Comm | 0.022419 | 0.022419 | 0.022419 | 0.0 | 0.16 +Output | 2.8133e-05 | 2.8133e-05 | 2.8133e-05 | 0.0 | 0.00 +Modify | 1.2513 | 1.2513 | 1.2513 | 0.0 | 8.72 +Other | | 0.006263 | | | 0.04 Nlocal: 104 ave 104 max 104 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 694 ave 694 max 694 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2927 ave 2927 max 2927 min +Neighs: 2866 ave 2866 max 2866 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 2927 -Ave neighs/atom = 28.1442 +Total # of neighbors = 2866 +Ave neighs/atom = 27.5577 Neighbor list builds = 300 Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:12 +Total wall time: 0:00:14 diff --git a/examples/reax/AB/log.8Mar18.AB.g++.4 b/examples/reax/AB/log.8Mar18.AB.g++.4 new file mode 100644 index 0000000000..1e02ec5725 --- /dev/null +++ b/examples/reax/AB/log.8Mar18.AB.g++.4 @@ -0,0 +1,81 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# REAX potential for Nitroamines system +# ..... + +units real + +atom_style charge +read_data data.AB + orthogonal box = (0 0 0) to (25 25 25) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 104 atoms + +pair_style reax/c lmp_control +pair_coeff * * ffield.reax.AB H B N +Reading potential file ffield.reax.AB with DATE: 2011-02-18 + +neighbor 2 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1e-6 param.qeq +fix 3 all temp/berendsen 500.0 500.0 100.0 + +timestep 0.25 + +#dump 1 all atom 30 dump.reax.ab + +run 3000 +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 12.38 | 13.22 | 13.64 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -8505.1816 0 -8505.1816 -673.36566 + 3000 555.17702 -8426.5541 0 -8256.1017 219.26856 +Loop time of 9.03521 on 4 procs for 3000 steps with 104 atoms + +Performance: 7.172 ns/day, 3.346 hours/ns, 332.034 timesteps/s +94.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 | 7.0347 | 7.0652 | 7.1049 | 1.0 | 78.20 +Neigh | 0.18481 | 0.20727 | 0.22108 | 3.0 | 2.29 +Comm | 0.075175 | 0.11496 | 0.14517 | 7.4 | 1.27 +Output | 2.2888e-05 | 2.569e-05 | 3.1948e-05 | 0.0 | 0.00 +Modify | 1.6286 | 1.6421 | 1.6649 | 1.1 | 18.17 +Other | | 0.005646 | | | 0.06 + +Nlocal: 26 ave 35 max 13 min +Histogram: 1 0 0 0 0 1 0 0 1 1 +Nghost: 420.25 ave 454 max 370 min +Histogram: 1 0 0 0 0 1 0 0 1 1 +Neighs: 862.5 ave 1178 max 444 min +Histogram: 1 0 0 0 1 0 0 0 1 1 + +Total # of neighbors = 3450 +Ave neighs/atom = 33.1731 +Neighbor list builds = 300 +Dangerous builds not checked + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:09 diff --git a/examples/reax/AuO/log.5Oct16.AuO.g++.1 b/examples/reax/AuO/log.8Mar18.AuO.g++.1 similarity index 52% rename from examples/reax/AuO/log.5Oct16.AuO.g++.1 rename to examples/reax/AuO/log.8Mar18.AuO.g++.1 index 7ae86b9d60..3c609ac023 100644 --- a/examples/reax/AuO/log.5Oct16.AuO.g++.1 +++ b/examples/reax/AuO/log.8Mar18.AuO.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for AuO system # ..... @@ -28,30 +29,40 @@ timestep 0.25 run 100 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 4 5 -Memory usage per processor = 144.382 Mbytes + binsize = 6, bins = 5 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 157.6 | 157.6 | 157.6 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0 -72201.743 0 -72201.743 -166.1947 - 100 69.043346 -72076.31 0 -71878.943 22702.308 -Loop time of 17.7559 on 1 procs for 100 steps with 960 atoms + 0 0 -72201.743 0 -72201.743 -166.19482 + 100 69.043331 -72076.309 0 -71878.942 22702.89 +Loop time of 18.4369 on 1 procs for 100 steps with 960 atoms -Performance: 0.122 ns/day, 197.288 hours/ns, 5.632 timesteps/s -99.8% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 0.117 ns/day, 204.854 hours/ns, 5.424 timesteps/s +98.7% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 15.102 | 15.102 | 15.102 | 0.0 | 85.05 -Neigh | 0.49358 | 0.49358 | 0.49358 | 0.0 | 2.78 -Comm | 0.0067561 | 0.0067561 | 0.0067561 | 0.0 | 0.04 -Output | 1.502e-05 | 1.502e-05 | 1.502e-05 | 0.0 | 0.00 -Modify | 2.1525 | 2.1525 | 2.1525 | 0.0 | 12.12 -Other | | 0.001267 | | | 0.01 +Pair | 15.373 | 15.373 | 15.373 | 0.0 | 83.38 +Neigh | 0.58774 | 0.58774 | 0.58774 | 0.0 | 3.19 +Comm | 0.0079026 | 0.0079026 | 0.0079026 | 0.0 | 0.04 +Output | 3.171e-05 | 3.171e-05 | 3.171e-05 | 0.0 | 0.00 +Modify | 2.4665 | 2.4665 | 2.4665 | 0.0 | 13.38 +Other | | 0.001366 | | | 0.01 Nlocal: 960 ave 960 max 960 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/reax/AuO/log.5Oct16.AuO.g++.4 b/examples/reax/AuO/log.8Mar18.AuO.g++.4 similarity index 51% rename from examples/reax/AuO/log.5Oct16.AuO.g++.4 rename to examples/reax/AuO/log.8Mar18.AuO.g++.4 index 01f29738f2..ed98e1f2f4 100644 --- a/examples/reax/AuO/log.5Oct16.AuO.g++.4 +++ b/examples/reax/AuO/log.8Mar18.AuO.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for AuO system # ..... @@ -28,30 +29,40 @@ timestep 0.25 run 100 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 4 5 -Memory usage per processor = 80.1039 Mbytes + binsize = 6, bins = 5 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 87.17 | 87.17 | 87.17 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0 -72201.743 0 -72201.743 -166.20356 - 100 69.043372 -72076.31 0 -71878.943 22701.855 -Loop time of 7.66838 on 4 procs for 100 steps with 960 atoms + 0 0 -72201.743 0 -72201.743 -166.2027 + 100 69.043379 -72076.31 0 -71878.943 22701.771 +Loop time of 8.44797 on 4 procs for 100 steps with 960 atoms -Performance: 0.282 ns/day, 85.204 hours/ns, 13.041 timesteps/s -99.7% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 0.256 ns/day, 93.866 hours/ns, 11.837 timesteps/s +96.5% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 6.7833 | 6.7864 | 6.7951 | 0.2 | 88.50 -Neigh | 0.2412 | 0.24206 | 0.24396 | 0.2 | 3.16 -Comm | 0.010402 | 0.019419 | 0.022561 | 3.7 | 0.25 -Output | 2.0981e-05 | 2.3007e-05 | 2.9087e-05 | 0.1 | 0.00 -Modify | 0.61733 | 0.61964 | 0.62064 | 0.2 | 8.08 -Other | | 0.0007888 | | | 0.01 +Pair | 7.3702 | 7.3757 | 7.3879 | 0.3 | 87.31 +Neigh | 0.28875 | 0.29449 | 0.29747 | 0.6 | 3.49 +Comm | 0.015008 | 0.027055 | 0.032681 | 4.3 | 0.32 +Output | 2.4319e-05 | 2.8551e-05 | 3.8624e-05 | 0.0 | 0.00 +Modify | 0.74721 | 0.74985 | 0.75539 | 0.4 | 8.88 +Other | | 0.0008975 | | | 0.01 Nlocal: 240 ave 240 max 240 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -67,4 +78,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:07 +Total wall time: 0:00:08 diff --git a/examples/reax/CHO/log.5Oct16.CHO.g++.1 b/examples/reax/CHO/log.8Mar18.CHO.g++.1 similarity index 53% rename from examples/reax/CHO/log.5Oct16.CHO.g++.1 rename to examples/reax/CHO/log.8Mar18.CHO.g++.1 index 2e346f7585..305ccbf3a0 100644 --- a/examples/reax/CHO/log.5Oct16.CHO.g++.1 +++ b/examples/reax/CHO/log.8Mar18.CHO.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for CHO system # ..... @@ -28,30 +29,40 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 17.7936 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 18.68 | 18.68 | 18.68 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0 -10226.557 0 -10226.557 -106.09789 - 3000 548.72503 -10170.457 0 -10000.349 34.314945 -Loop time of 11.5678 on 1 procs for 3000 steps with 105 atoms + 0 0 -10226.557 0 -10226.557 -106.09755 + 3000 548.5116 -10170.389 0 -10000.348 40.372297 +Loop time of 12.6046 on 1 procs for 3000 steps with 105 atoms -Performance: 5.602 ns/day, 4.284 hours/ns, 259.340 timesteps/s -99.3% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 5.141 ns/day, 4.668 hours/ns, 238.008 timesteps/s +98.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 | 10.111 | 10.111 | 10.111 | 0.0 | 87.41 -Neigh | 0.27992 | 0.27992 | 0.27992 | 0.0 | 2.42 -Comm | 0.01603 | 0.01603 | 0.01603 | 0.0 | 0.14 -Output | 1.2159e-05 | 1.2159e-05 | 1.2159e-05 | 0.0 | 0.00 -Modify | 1.1563 | 1.1563 | 1.1563 | 0.0 | 10.00 -Other | | 0.004084 | | | 0.04 +Pair | 10.931 | 10.931 | 10.931 | 0.0 | 86.72 +Neigh | 0.33107 | 0.33107 | 0.33107 | 0.0 | 2.63 +Comm | 0.017975 | 0.017975 | 0.017975 | 0.0 | 0.14 +Output | 2.0742e-05 | 2.0742e-05 | 2.0742e-05 | 0.0 | 0.00 +Modify | 1.3197 | 1.3197 | 1.3197 | 0.0 | 10.47 +Other | | 0.005059 | | | 0.04 Nlocal: 105 ave 105 max 105 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -67,4 +78,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:11 +Total wall time: 0:00:12 diff --git a/examples/reax/CHO/log.5Oct16.CHO.g++.4 b/examples/reax/CHO/log.8Mar18.CHO.g++.4 similarity index 51% rename from examples/reax/CHO/log.5Oct16.CHO.g++.4 rename to examples/reax/CHO/log.8Mar18.CHO.g++.4 index 3536b91228..2bc19dc789 100644 --- a/examples/reax/CHO/log.5Oct16.CHO.g++.4 +++ b/examples/reax/CHO/log.8Mar18.CHO.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for CHO system # ..... @@ -28,30 +29,40 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 12.9938 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 11.75 | 12.85 | 13.81 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0 -10226.557 0 -10226.557 -106.0974 - 3000 547.91377 -10170.194 0 -10000.338 61.118402 -Loop time of 6.51546 on 4 procs for 3000 steps with 105 atoms + 0 0 -10226.557 0 -10226.557 -106.09745 + 3000 548.30567 -10170.323 0 -10000.346 47.794514 +Loop time of 7.42367 on 4 procs for 3000 steps with 105 atoms -Performance: 9.946 ns/day, 2.413 hours/ns, 460.443 timesteps/s -99.1% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 8.729 ns/day, 2.750 hours/ns, 404.113 timesteps/s +97.7% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 4.9869 | 5.0615 | 5.1246 | 2.3 | 77.68 -Neigh | 0.12213 | 0.14723 | 0.17304 | 5.5 | 2.26 -Comm | 0.05189 | 0.11582 | 0.18932 | 15.4 | 1.78 -Output | 1.812e-05 | 2.0564e-05 | 2.5988e-05 | 0.1 | 0.00 -Modify | 1.1626 | 1.1878 | 1.2122 | 1.9 | 18.23 -Other | | 0.003059 | | | 0.05 +Pair | 5.3058 | 5.4086 | 5.4922 | 3.1 | 72.86 +Neigh | 0.14791 | 0.17866 | 0.2106 | 6.5 | 2.41 +Comm | 0.080185 | 0.16666 | 0.26933 | 17.7 | 2.24 +Output | 2.5988e-05 | 2.8491e-05 | 3.4571e-05 | 0.0 | 0.00 +Modify | 1.6364 | 1.6658 | 1.6941 | 2.0 | 22.44 +Other | | 0.003964 | | | 0.05 Nlocal: 26.25 ave 45 max 6 min Histogram: 1 0 1 0 0 0 0 0 1 1 @@ -67,4 +78,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:06 +Total wall time: 0:00:07 diff --git a/examples/reax/FC/log.5Oct16.FC.g++.1 b/examples/reax/FC/log.8Mar18.FC.g++.1 similarity index 67% rename from examples/reax/FC/log.5Oct16.FC.g++.1 rename to examples/reax/FC/log.8Mar18.FC.g++.1 index e669c39169..1e2f723966 100644 --- a/examples/reax/FC/log.5Oct16.FC.g++.1 +++ b/examples/reax/FC/log.8Mar18.FC.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for Nitroamines system # ..... @@ -29,13 +30,23 @@ thermo 1 dump 4 all xyz 5000 dumpnpt.xyz run 10 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 28 27 17 -Memory usage per processor = 440.212 Mbytes + binsize = 6, bins = 28 27 17 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 470 | 470 | 470 Mbytes Step Temp E_pair TotEng Press 0 0 -808525.04 -808525.04 58194.694 1 4.9935726 -808803.89 -808546.69 58205.825 @@ -48,20 +59,20 @@ Step Temp E_pair TotEng Press 8 320.17692 -826387.27 -809896.43 58886.877 9 404.17073 -831129.48 -810312.5 59064.551 10 497.02486 -836425.19 -810825.72 59260.714 -Loop time of 20.3094 on 1 procs for 10 steps with 17280 atoms +Loop time of 21.5054 on 1 procs for 10 steps with 17280 atoms -Performance: 0.009 ns/day, 2820.746 hours/ns, 0.492 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 0.008 ns/day, 2986.857 hours/ns, 0.465 timesteps/s +98.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 | 18.124 | 18.124 | 18.124 | 0.0 | 89.24 -Neigh | 0.072459 | 0.072459 | 0.072459 | 0.0 | 0.36 -Comm | 0.00077629 | 0.00077629 | 0.00077629 | 0.0 | 0.00 -Output | 0.00075412 | 0.00075412 | 0.00075412 | 0.0 | 0.00 -Modify | 2.1109 | 2.1109 | 2.1109 | 0.0 | 10.39 -Other | | 0.0005426 | | | 0.00 +Pair | 19.008 | 19.008 | 19.008 | 0.0 | 88.39 +Neigh | 0.084401 | 0.084401 | 0.084401 | 0.0 | 0.39 +Comm | 0.00080419 | 0.00080419 | 0.00080419 | 0.0 | 0.00 +Output | 0.00095367 | 0.00095367 | 0.00095367 | 0.0 | 0.00 +Modify | 2.4109 | 2.4109 | 2.4109 | 0.0 | 11.21 +Other | | 0.0004592 | | | 0.00 Nlocal: 17280 ave 17280 max 17280 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -85,7 +96,7 @@ timestep 0.2 #dump 6 all custom 5000 dumpidtype.dat id type x y z run 10 -Memory usage per processor = 440.212 Mbytes +Per MPI rank memory allocation (min/avg/max) = 470 | 470 | 470 Mbytes Step Temp E_pair TotEng Press 10 497.02486 -836425.19 -810825.72 59260.714 11 601.65141 -841814.22 -810825.91 59489.422 @@ -98,20 +109,20 @@ Step Temp E_pair TotEng Press 18 1623.072 -894534.04 -810937.04 61739.541 19 1812.1865 -904337.99 -811000.57 62200.561 20 2011.5899 -915379.19 -811771.41 63361.151 -Loop time of 20.3051 on 1 procs for 10 steps with 17280 atoms +Loop time of 21.362 on 1 procs for 10 steps with 17280 atoms -Performance: 0.009 ns/day, 2820.155 hours/ns, 0.492 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 0.008 ns/day, 2966.945 hours/ns, 0.468 timesteps/s +98.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 | 18.008 | 18.008 | 18.008 | 0.0 | 88.69 -Neigh | 0.069963 | 0.069963 | 0.069963 | 0.0 | 0.34 -Comm | 0.00077033 | 0.00077033 | 0.00077033 | 0.0 | 0.00 -Output | 0.00077224 | 0.00077224 | 0.00077224 | 0.0 | 0.00 -Modify | 2.225 | 2.225 | 2.225 | 0.0 | 10.96 -Other | | 0.0005276 | | | 0.00 +Pair | 18.793 | 18.793 | 18.793 | 0.0 | 87.97 +Neigh | 0.077047 | 0.077047 | 0.077047 | 0.0 | 0.36 +Comm | 0.00080276 | 0.00080276 | 0.00080276 | 0.0 | 0.00 +Output | 0.0010097 | 0.0010097 | 0.0010097 | 0.0 | 0.00 +Modify | 2.4897 | 2.4897 | 2.4897 | 0.0 | 11.65 +Other | | 0.0004568 | | | 0.00 Nlocal: 17280 ave 17280 max 17280 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -127,4 +138,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:45 +Total wall time: 0:00:47 diff --git a/examples/reax/FC/log.5Oct16.FC.g++.4 b/examples/reax/FC/log.8Mar18.FC.g++.4 similarity index 67% rename from examples/reax/FC/log.5Oct16.FC.g++.4 rename to examples/reax/FC/log.8Mar18.FC.g++.4 index f231107270..76dcadfb0f 100644 --- a/examples/reax/FC/log.5Oct16.FC.g++.4 +++ b/examples/reax/FC/log.8Mar18.FC.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for Nitroamines system # ..... @@ -29,13 +30,23 @@ thermo 1 dump 4 all xyz 5000 dumpnpt.xyz run 10 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 28 27 17 -Memory usage per processor = 140.018 Mbytes + binsize = 6, bins = 28 27 17 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 149.3 | 149.3 | 149.3 Mbytes Step Temp E_pair TotEng Press 0 0 -808525.04 -808525.04 58194.694 1 4.9935726 -808803.89 -808546.69 58205.825 @@ -48,20 +59,20 @@ Step Temp E_pair TotEng Press 8 320.17692 -826387.27 -809896.43 58886.877 9 404.17073 -831129.48 -810312.5 59064.551 10 497.02486 -836425.19 -810825.72 59260.714 -Loop time of 5.47494 on 4 procs for 10 steps with 17280 atoms +Loop time of 6.02109 on 4 procs for 10 steps with 17280 atoms -Performance: 0.032 ns/day, 760.408 hours/ns, 1.827 timesteps/s -99.9% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 0.029 ns/day, 836.262 hours/ns, 1.661 timesteps/s +99.0% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 4.5958 | 4.7748 | 4.8852 | 5.4 | 87.21 -Neigh | 0.021961 | 0.022104 | 0.022431 | 0.1 | 0.40 -Comm | 0.0077388 | 0.11804 | 0.29694 | 34.2 | 2.16 -Output | 0.00047708 | 0.00051123 | 0.0005939 | 0.2 | 0.01 -Modify | 0.55906 | 0.55927 | 0.55946 | 0.0 | 10.22 -Other | | 0.0002034 | | | 0.00 +Pair | 4.9482 | 5.1186 | 5.3113 | 7.4 | 85.01 +Neigh | 0.024811 | 0.025702 | 0.027556 | 0.7 | 0.43 +Comm | 0.0027421 | 0.19541 | 0.36565 | 38.1 | 3.25 +Output | 0.00053239 | 0.00057119 | 0.00067186 | 0.0 | 0.01 +Modify | 0.67876 | 0.68059 | 0.68165 | 0.1 | 11.30 +Other | | 0.0001779 | | | 0.00 Nlocal: 4320 ave 4320 max 4320 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -85,7 +96,7 @@ timestep 0.2 #dump 6 all custom 5000 dumpidtype.dat id type x y z run 10 -Memory usage per processor = 140.018 Mbytes +Per MPI rank memory allocation (min/avg/max) = 149.3 | 149.3 | 149.3 Mbytes Step Temp E_pair TotEng Press 10 497.02486 -836425.19 -810825.72 59260.714 11 601.65141 -841814.22 -810825.91 59489.422 @@ -98,20 +109,20 @@ Step Temp E_pair TotEng Press 18 1623.072 -894534.04 -810937.04 61739.541 19 1812.1865 -904337.99 -811000.57 62200.561 20 2011.5899 -915379.19 -811771.41 63361.151 -Loop time of 5.49026 on 4 procs for 10 steps with 17280 atoms +Loop time of 6.08805 on 4 procs for 10 steps with 17280 atoms -Performance: 0.031 ns/day, 762.536 hours/ns, 1.821 timesteps/s -99.9% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 0.028 ns/day, 845.563 hours/ns, 1.643 timesteps/s +99.2% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 4.5657 | 4.7603 | 4.8596 | 5.4 | 86.70 -Neigh | 0.021023 | 0.021468 | 0.022176 | 0.3 | 0.39 -Comm | 0.016467 | 0.1157 | 0.31031 | 34.7 | 2.11 -Output | 0.00047684 | 0.00050694 | 0.00059295 | 0.2 | 0.01 -Modify | 0.59135 | 0.59207 | 0.59251 | 0.1 | 10.78 -Other | | 0.0001938 | | | 0.00 +Pair | 4.9124 | 5.1008 | 5.3405 | 8.3 | 83.78 +Neigh | 0.023652 | 0.024473 | 0.025996 | 0.6 | 0.40 +Comm | 0.0020971 | 0.24171 | 0.43023 | 38.0 | 3.97 +Output | 0.00056076 | 0.00060701 | 0.00072312 | 0.0 | 0.01 +Modify | 0.71869 | 0.72023 | 0.72107 | 0.1 | 11.83 +Other | | 0.0001827 | | | 0.00 Nlocal: 4320 ave 4320 max 4320 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -127,4 +138,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:12 +Total wall time: 0:00:13 diff --git a/examples/reax/HNS/README.txt b/examples/reax/HNS/README.txt new file mode 100644 index 0000000000..465d64d171 --- /dev/null +++ b/examples/reax/HNS/README.txt @@ -0,0 +1,49 @@ +# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS + +Authors: Mitchell Wood, Stan Moore, and Aidan Thompson, Sandia National Labs +Date: 2017-10-17 +Questions: Mitchell Wood, mitwood@sandia.gov + +---------ReaxFF Benchmark Files--------- +1) in.reaxc.hns +2) data.hns-equil +3) ffield.reax.hns + +---------File Description--------- + +1) LAMMPS input file for this test. + The file is read line by line looking for keywords to set up this run. + It will read in the configuration given by the argument of the read_data command, which is supplied in this distribution. + The type of simulation is set by the 'fix' commands, dynamic charges are controlled with 'fix qeq' and the integration style is given as 'fix nve' here. + More information about each of the individual commands can be found online at lammps.sandia.gov in the user manual section. + + *There are four free varaibles in this file, three of which control the size of the simulation and the last will dictate how many MD time steps are taken. + *The size of the system is controlled by the 'replicate' command given the values of $x, $y and $z. + *The number of timesteps taken is controlled by the 'run' command given the value of $t + + It is worth noting that these four free variables can be set at the command line when the simulation is invoked rather than editing the file by hand prior to each run. + + Example syntax: + lmp_serial -in in.reaxc.hns -v x 2 -v y 2 -v z 2 -v t 100 + +2) LAMMPS Data file for crystalline HNS + This file matches the LAMMPS data format, more information about this data structure can be found at lammps.sandia.gov + + This particular data file is of the energetic material Hexanitrostilbene (HNS) with atom_style charge (id type q x y z). + The file contains eight molecules (2 unit cells). + + Chemical Name: Hexanitrostilbene + Molecule Composition: C14H6N6O12 + IUPAC Name: 1,3,5-Trinitro-2-[2-(2,4,6-trinitrophenyl)ethenyl]benzene + + Phyical Properties (Gerard F., Hardy A. Acta Cryst. (1988) 1283-1287) + Density: 1.741 g/cc + Crystal Structure: Monoclinic P2(1)/c + Molecules per Unit Cell: 4 + Lattice Constants: a=22.326 + b=5.5706 + c=14.667 + beta=110.04 deg + +3) ReaxFF force field file. + Details about this particular parameterization can be found in T.-R. Shan, R. R. Wixom, A. P. Thompson, "Atomistic Simulation of Nanoscale Void-Enhanced Initiation in Hexanitrostilbene", Proc. 15th International Detonation Symposium, pp. 962-969, SAND Number: SAND2014-15518J diff --git a/examples/reax/HNS/data.hns-equil b/examples/reax/HNS/data.hns-equil new file mode 100644 index 0000000000..5adda8822a --- /dev/null +++ b/examples/reax/HNS/data.hns-equil @@ -0,0 +1,631 @@ +# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS +# See README for more info + +304 atoms +4 atom types + +0.0000000000000000e+00 2.2326000000000001e+01 xlo xhi +0.0000000000000000e+00 1.1141200000000000e+01 ylo yhi +0.0000000000000000e+00 1.3778966000000000e+01 zlo zhi +0.0000000000000000e+00 -5.0260300000000004e+00 0.0000000000000000e+00 xy xz yz + +Masses + +1 12 +2 1.008 +3 15.999 +4 14 + +Atoms + +30 1 -1.5978703752096285e-03 1.2032863869865822e+00 2.8256400602546141e+00 1.6550970119417108e+00 0 0 0 +34 1 1.4609342964817035e-01 1.9907567656339498e+00 4.0380967812225812e+00 1.6037009557414807e+00 0 0 0 +38 1 -1.1313442904350110e-01 2.3735208752501014e+00 4.6358508212064597e+00 2.8207166456035706e+00 0 0 0 +42 1 1.6137623866269668e-01 2.2068159183466545e+00 3.9155626912486312e+00 4.0393199600260017e+00 0 0 0 +46 1 -1.3231732350799086e-01 1.6723546283637456e+00 2.6490843099361769e+00 4.0718695650174555e+00 0 0 0 +50 1 1.3924326618460361e-01 1.0432796609680879e+00 2.1377763017045028e+00 2.8779760001142254e+00 0 0 0 +2 1 1.0355454307915037e-02 9.2365304282304432e+00 3.0315922757175588e+00 5.8645178945136656e-01 0 0 0 +83 3 -1.1387168269097275e-01 -2.8903688091767799e-01 4.4353520665316273e+00 5.8542082062284990e+00 0 0 0 +151 2 2.4137857976817839e-01 -1.2098303319415862e+00 6.2642360580370904e-01 6.3751534971040620e+00 0 0 0 +90 3 -1.4867175259103951e-01 2.7301832997028690e+00 4.2208910046400874e+00 6.4748944299312052e+00 0 0 0 +62 3 -1.4102407432432201e-01 9.4127387076516271e+00 5.0642928548941315e+00 3.6732353442096048e+00 0 0 0 +98 3 -1.4663622654196759e-01 -3.6147625406370998e-01 6.2032706772140034e-01 4.2927916563248019e+00 0 0 0 +54 1 -4.5611437629532792e-02 4.5789128567777315e-01 2.3037414864278984e+00 4.4853180490390432e-01 0 0 0 +87 3 -1.8118678506945068e-01 3.4239328769587729e-01 2.4978291763591067e+00 6.8433313861644862e+00 0 0 0 +122 4 -1.3816556601478763e-03 2.7347000852858909e+00 4.7780564701856187e+00 5.2860122928435764e+00 0 0 0 +126 4 3.6742909094152829e-03 2.4236147574090339e-01 8.2881803614262350e-01 3.1300069722778523e+00 0 0 0 +106 4 5.0380311643663904e-03 9.5333959154754595e+00 4.9409481826854691e+00 2.4063719536640074e+00 0 0 0 +146 2 2.5678858551879979e-01 1.6690771913639459e+00 2.1486485750781656e+00 4.9718402573987817e+00 0 0 0 +110 4 1.6289496724444380e-03 5.3102382664427816e+00 1.9205393567101749e+00 2.1572449075775788e+00 0 0 0 +150 2 2.1173170721002404e-01 7.5386951474057873e-01 1.3549807632892001e+00 9.3638420990104679e-02 0 0 1 +6 1 1.1953236006118220e-01 8.7624714685569316e+00 3.7188181320106537e+00 1.7053122151642655e+00 0 0 0 +10 1 -1.2241319991927709e-01 7.5639831402718549e+00 3.2619209383245216e+00 2.2783314043500087e+00 0 0 0 +14 1 1.6332523038636718e-01 6.7064629894786840e+00 2.3225374933384266e+00 1.5993053103840011e+00 0 0 0 +18 1 -1.2740222789777322e-01 7.1960583589051836e+00 1.7158122662355066e+00 4.4569871516692844e-01 0 0 0 +27 1 -5.3470339611564929e-02 8.2035551240691014e+00 5.2145834528427404e+00 6.7535330772512978e+00 0 0 0 +130 2 2.6175533983311156e-01 7.2291088343383372e+00 3.7463444170136344e+00 3.1894666598585886e+00 0 0 0 +115 4 -1.0266178820511205e-02 6.5003245602926247e+00 1.9837100341352589e+00 5.4205438257015626e+00 0 0 0 +70 3 -1.9659495203039720e-01 4.8736785299263445e+00 6.8433015433575883e-01 2.0399570769464188e+00 0 0 0 +66 3 -1.4139946566263059e-01 4.6669037558628865e+00 2.7410416721294739e+00 2.9336061027665226e+00 0 0 0 +79 3 -1.4677703049809945e-01 7.3812392124196062e+00 1.4179852894043470e+00 4.6640710482179113e+00 0 0 0 +75 3 -1.6908670824429517e-01 6.1211322589023460e+00 3.2420945874253642e+00 5.3132771020098115e+00 0 0 0 +139 2 2.5448108175084960e-01 8.4566882159339229e+00 4.3172025545808355e+00 6.2369390618225014e+00 0 0 0 +23 1 1.3477422750843063e-01 6.0540050656644713e+00 1.1700924054581945e+00 6.6706585187016119e+00 0 0 0 +118 4 -1.5835790692106114e-02 2.4504894190711446e+00 4.5478624528845764e+00 2.3408689744414402e-01 0 0 0 +26 1 -5.8799784794887205e-02 1.0677497585216404e+01 3.3270395487987150e+00 2.1937163062090195e-01 0 0 1 +135 2 2.2667543991902223e-01 4.2303516292691130e+00 2.3680991399220881e+00 6.7600909900965371e+00 0 0 0 +134 2 2.6603700384712170e-01 1.5553791693879147e+00 9.2759126357203769e-01 1.3751336880718977e+01 0 0 -1 +35 1 1.3619576950915824e-01 -6.1123259368930594e-01 4.2744050950379879e+00 8.2689176641591953e+00 0 0 0 +39 1 -1.3619776752057167e-01 2.1174961291658523e-02 3.7911192964937714e+00 9.4031145771372433e+00 0 0 0 +43 1 1.7616533882120664e-01 -2.4082821430091039e-01 4.3921540571785220e+00 1.0667961368752986e+01 0 0 0 +55 1 -4.7675633308455131e-02 -1.8255087561703223e+00 2.3531147144749784e-02 7.0185294659074930e+00 0 0 0 +51 1 1.4229302277810482e-01 -1.4696286889225143e+00 2.4331344403165978e-01 9.4912358273027095e+00 0 0 0 +67 3 -1.3320855668594128e-01 2.2563624634551185e+00 6.4796712999277428e-01 9.7945933875844204e+00 0 0 0 +82 3 -1.2277895342641043e-01 -2.4283488967409923e+00 3.7198642287090697e+00 1.2995930949473768e+01 0 0 0 +111 4 -1.5140995980939403e-03 3.0250993995224067e+00 1.4943316767321402e+00 9.1744364446145408e+00 0 0 0 +91 3 -1.4025506634127735e-01 1.7753588712423607e-01 4.4153781344920002e+00 1.3115706743542738e+01 0 0 0 +95 3 -1.3868856763412177e-01 1.2309740323323872e+00 2.8163901938840534e+00 1.1864853104907548e+01 0 0 0 +99 3 -1.3250332187377967e-01 -2.4235387111074864e+00 2.2927169952708413e+00 1.0531038226936827e+01 0 0 0 +103 3 -1.5214067005316109e-01 -2.5943266041046478e+00 2.0130134130925272e+00 8.2928000156291564e+00 0 0 0 +11 1 -1.2064832278125080e-01 4.9238352739840066e+00 5.1583157878512989e+00 8.7390613510373552e+00 0 0 0 +123 4 -1.8374834914142782e-03 4.6335581596415221e-01 3.8350456476487684e+00 1.1969089243285413e+01 0 0 0 +127 4 -4.5958705273757214e-03 -2.3340640092443685e+00 1.5285367626179718e+00 9.4882316286490980e+00 0 0 0 +143 2 2.8164020999934403e-01 8.1801006001560150e-01 3.0833734683476477e+00 9.2359390877007783e+00 0 0 0 +226 3 -1.3797612921025582e-01 3.0686575977270270e+00 5.3454897967899155e+00 1.2182598966837521e+01 0 0 0 +74 3 -1.4848161091470552e-01 3.6465792627245133e+00 4.2615086181930439e-02 1.2180659758160441e+01 0 0 0 +107 4 -1.4162558249806764e-02 6.9041986670066819e+00 3.4945477378354388e+00 8.8118463563242155e+00 0 0 0 +7 1 1.3874647498773149e-01 6.1777705393650866e+00 4.7275638247590814e+00 8.2546633769247251e+00 0 0 0 +59 3 -1.4867036170029541e-01 7.9924230788486739e+00 3.0224192820538822e+00 8.2251400208652061e+00 0 0 0 +15 1 1.5783636416316224e-01 4.3575954701770536e+00 9.7856621771074259e-01 8.4167269066637989e+00 0 0 0 +19 1 -1.2015824785960097e-01 4.8284895573299593e+00 1.5629079717902468e+00 7.2532253050378577e+00 0 0 0 +147 2 2.8239828117589366e-01 -9.3165419330122523e-01 4.2118942787062214e-01 1.1512337330019069e+01 0 0 0 +114 4 -1.4785079641223244e-02 3.8503739478102448e+00 1.3491416192259467e+00 1.2373804865591053e+01 0 0 0 +3 1 1.3350861714137560e-02 6.8114774504878302e+00 5.5447953386683206e+00 7.2580722690515636e+00 0 0 0 +63 3 -1.2277076639947315e-01 6.4897117194665608e+00 2.8986172068480283e+00 9.9060820538034609e+00 0 0 0 +78 3 -1.1723116541459006e-01 4.4127311301931043e+00 2.1084084419897180e+00 1.1535065556985785e+01 0 0 0 +71 3 -1.7152044820786300e-01 2.8873531342706946e+00 2.7797489684906393e+00 9.3163860457066789e+00 0 0 0 +131 2 2.7834313014819689e-01 4.3817210322557489e+00 4.5528948096328836e+00 9.5379421136925018e+00 0 0 0 +31 1 9.4935956929876678e-03 -1.4954352092350376e+00 5.3645298943245292e+00 8.3142675828162034e+00 0 0 0 +86 3 -1.6350292182104242e-01 -1.8311649351050598e+00 2.0802600512349903e-01 1.3629050043036029e+01 0 0 -1 +60 3 -1.7749808073059342e-01 6.6696465438141646e+00 1.5936122406953454e-01 1.1815497920409818e+01 0 0 0 +155 1 7.9312977244249613e-03 6.8120544939431360e+00 1.0199834144196412e-01 7.2127972853813258e+00 0 1 0 +22 1 1.4407031044516649e-01 3.4096950234688004e+00 2.0679954049404619e+00 1.3690619069119307e+01 0 0 -1 +140 2 2.5769600911651236e-01 6.0687404141669434e+00 1.3241144290919518e+00 1.3462978005934200e+01 0 0 -1 +199 1 -1.3944547646247771e-01 -1.1362038789337188e+00 5.4530148366485571e+00 1.0742524104946057e+01 0 0 0 +119 4 -1.2299043862974497e-02 -2.3446859456688562e-01 3.6495764565964248e+00 6.8964694682143248e+00 0 0 0 +182 1 6.7658225708544725e-03 1.4169424463071361e+00 8.3763330460636727e+00 1.4012109232974952e+00 0 0 0 +186 1 1.2980507892816731e-01 2.2797704925844604e+00 9.5291291369621636e+00 1.3666006980904655e+00 0 0 0 +190 1 -1.5071175365705503e-01 2.7699144439458436e+00 1.0081261276817276e+01 2.5544135724485146e+00 0 0 0 +194 1 1.7547903565045994e-01 2.3921031079123969e+00 9.5103250107764765e+00 3.8009524053675627e+00 0 0 0 +198 1 -1.3144018623170101e-01 1.4977753357515831e+00 8.3987685531196199e+00 3.8549410858411388e+00 0 0 0 +202 1 1.3849820878754834e-01 1.0150476921735834e+00 7.8483962991977574e+00 2.6673948664405547e+00 0 0 0 +206 1 -6.3927688649410647e-02 6.6270841666167679e-01 7.9494021125481424e+00 1.4197887405827284e-01 0 0 0 +235 3 -1.3761341595728172e-01 -2.8837295421316522e-01 9.2189872838153608e+00 5.8372696110592788e+00 0 0 0 +142 2 2.6479443554012794e-01 2.9320229108693479e+00 5.5858386406215974e+00 2.8822394959582591e+00 0 0 0 +242 3 -1.4112562564538583e-01 2.5388308202795757e+00 9.7663385818562389e+00 6.3230546934248055e+00 0 0 0 +291 2 2.3831756420052311e-01 8.3394602256848422e+00 1.0597218595134976e+01 5.6327293542472532e+00 0 0 0 +250 3 -1.0987475178029475e-01 -5.0622879855012592e-01 6.2591257947415606e+00 3.8940086364947737e+00 0 0 0 +258 4 6.9512359773382104e-03 9.4664816115561496e+00 1.0405510702076073e+01 1.9702849156142326e+00 0 0 0 +262 4 -8.0100924398892291e-03 5.3017951547661228e+00 7.1947421307917523e+00 2.2008872174147442e+00 0 0 0 +274 4 -2.8801715867946998e-02 2.8217805545648877e+00 1.0198911718869871e+01 5.0989203211129208e+00 0 0 0 +278 4 -8.3382269572114982e-03 1.9022473073729729e-01 6.5306916972236531e+00 2.7977581783283543e+00 0 0 0 +222 3 -1.5735096896248177e-01 5.0460780570651043e+00 5.9652600638197084e+00 1.9688452086847921e+00 0 0 0 +298 2 2.8845912568524801e-01 1.2259584803396069e+00 7.9975091793540463e+00 4.8377168239797355e+00 0 0 0 +267 4 -8.1543222370399418e-04 6.7515502316853571e+00 7.3530236371224733e+00 5.3783512877798509e+00 0 0 0 +154 1 7.1908069858682630e-03 9.1240531784682535e+00 8.3732699807014779e+00 4.1677219242496333e-01 0 0 0 +158 1 1.3448308907124562e-01 8.6487938120238645e+00 9.1661211028768115e+00 1.5116534817235705e+00 0 0 0 +162 1 -1.1355360785260224e-01 7.3973813587135364e+00 8.8118392837386903e+00 2.0442619468259688e+00 0 0 0 +166 1 1.5711265427818599e-01 6.6193754339762592e+00 7.7216957118390352e+00 1.5125332287756803e+00 0 0 0 +170 1 -1.2245433545215903e-01 7.2334953478137844e+00 6.9135079041535876e+00 5.1425051872838257e-01 0 0 0 +175 1 1.3581278243177822e-01 6.1399576319422247e+00 6.6351336822606477e+00 6.6388959270812675e+00 0 0 0 +282 2 2.3480529560852545e-01 6.8780657238569551e+00 9.4266263098711551e+00 2.8083989170176249e+00 0 0 0 +179 1 -3.9098442124970913e-02 8.1921382670269995e+00 1.1015911501599872e+01 6.6154483416940151e+00 0 0 0 +231 3 -1.2568742237480407e-01 7.4708728388631442e+00 6.7304833314035504e+00 4.5334798740490836e+00 0 0 0 +218 3 -1.4344893238707335e-01 4.7091494226840656e+00 7.8204929202859752e+00 3.1719768839537057e+00 0 0 0 +294 2 2.9175211722940220e-01 3.4302436656544328e+00 1.0911761593148093e+01 2.4580124801797307e+00 0 0 0 +227 3 -1.5716251537215054e-01 6.3710113945660511e+00 8.6140075062272228e+00 5.1189294887372707e+00 0 0 0 +254 3 -1.6304878692327615e-01 1.1369152465923738e-02 5.8040125934093432e+00 1.7344736606349882e+00 0 0 0 +94 3 -1.6001482691396210e-01 3.4226797144178276e+00 5.8324891118411557e+00 5.0673816802761040e+00 0 0 0 +214 3 -1.3095404512866216e-01 9.2822478837309497e+00 1.0944567563926054e+01 3.1520938926115289e+00 0 0 0 +210 3 -1.6656061802004779e-01 1.0125927049661630e+01 1.0968553134904163e+01 1.0306564425404838e+00 0 0 0 +58 3 -1.8302344471552118e-01 1.0213161644629823e+01 5.8090021306247959e+00 1.7225024677054026e+00 0 0 0 +246 3 -1.6180800736237624e-01 3.7271744208235593e+00 1.1136471158690993e+01 4.9690967792530811e+00 0 0 0 +102 3 -1.6531840940386305e-01 3.3511101143416933e-01 1.1054539855366549e+01 2.2157686745942939e+00 0 -1 0 +238 3 -1.6856155817812890e-01 2.9083086152708901e+00 5.7681194020610480e+00 1.7191101722965371e-01 0 0 0 +287 2 2.4377790046642306e-01 4.4026866149631791e+00 7.9897646117591492e+00 6.8189677819979027e+00 0 0 0 +286 2 2.6154505839152942e-01 6.7181127902312507e+00 5.9804318863208010e+00 2.1530836987465235e-01 0 0 0 +171 1 -1.1187852832153318e-01 4.9158733746689869e+00 7.0613244573777925e+00 7.1285394473597972e+00 0 0 0 +187 1 1.3804049779409072e-01 -4.7081814568988589e-01 9.4447023070407337e+00 8.2867903808074814e+00 0 0 0 +191 1 -1.2971955344725286e-01 1.0532858911262055e-01 9.0301089070007023e+00 9.5194948333957843e+00 0 0 0 +195 1 1.7237826722593086e-01 -3.2979026063385319e-02 9.7887682538998035e+00 1.0706940452275044e+01 0 0 0 +270 4 -1.3464043531568919e-02 -2.2543639852501798e+00 1.0142966260197174e+01 1.3730567035196929e+01 0 0 -1 +203 1 1.3427963268281090e-01 -1.8024111493992248e+00 5.9588781753908151e+00 9.5912321727716829e+00 0 0 0 +302 2 2.4793795803104607e-01 -4.0813465149326733e+00 7.0098028171254363e+00 1.3582140525668459e+01 0 0 0 +234 3 -1.2298530438399083e-01 -2.0999175503602907e+00 9.3334349911585850e+00 1.2713070387329807e+01 0 0 0 +183 1 -1.3480580351704630e-03 -1.2524425039534379e+00 1.0603399634220155e+01 8.3052270038890796e+00 0 0 0 +243 3 -1.6074098714307544e-01 1.0092944188786444e+00 1.0218279224693790e+01 1.2861379846486365e+01 0 0 0 +247 3 -1.5387578069009830e-01 8.5439915136228706e-01 8.0170106581812881e+00 1.2211169111299865e+01 0 0 0 +251 3 -1.3983948146137931e-01 -2.9738796938163725e+00 7.5122263482065499e+00 1.1030823813483353e+01 0 0 0 +255 3 -1.6423936253041480e-01 -3.0284913258585524e+00 7.9088522479385679e+00 8.7407850365314399e+00 0 0 0 +259 4 8.0410558983729646e-04 6.7961292001636444e+00 9.1867860735672711e+00 8.8636424740217947e+00 0 0 0 +275 4 -4.3259974176743099e-05 6.9707283465202874e-01 9.3227186018980994e+00 1.1981108937286187e+01 0 0 0 +279 4 -5.4226204814747658e-03 -2.7183814077004502e+00 7.1633679386102083e+00 9.7555594565405492e+00 0 0 0 +295 2 2.6218133810847499e-01 6.0410847381122412e-01 8.0421997981783182e+00 9.5648500938018834e+00 0 0 0 +230 3 -1.2018011636818954e-01 4.6317864784420824e+00 6.8176590020738042e+00 1.1516620570461674e+01 0 0 0 +271 4 -2.8439562879540532e-02 -2.3352025232358109e-01 8.6009765210205842e+00 7.0174876202960812e+00 0 0 0 +219 3 -1.4441576113611607e-01 2.1139860757598838e+00 5.9566809343395395e+00 9.2739736659519139e+00 0 0 0 +159 1 1.3413754194495167e-01 6.2381774846970295e+00 1.0512869843000209e+01 8.2998411286674898e+00 0 0 0 +207 1 -4.5275085907843307e-02 -2.2313374155847714e+00 5.9531808015124978e+00 7.1401084416064693e+00 0 0 0 +167 1 1.7086332099009921e-01 4.3308992321162805e+00 6.2978761471859119e+00 8.1848912823747266e+00 0 0 0 +299 2 2.8374116457714360e-01 -1.3476728927796344e+00 5.8584256959679699e+00 1.1723539811442672e+01 0 0 0 +163 1 -1.2189457501468513e-01 5.0935078513079350e+00 1.1062258678023431e+01 9.0012683062525820e+00 0 0 0 +263 4 -7.2701194644572698e-04 2.9434843653848728e+00 6.8044753722388700e+00 8.7310546416994494e+00 0 0 0 +283 2 2.7264339681755889e-01 4.8359812206870174e+00 1.0640435156903745e+01 9.9608335270238513e+00 0 0 0 +215 3 -1.4288902954841964e-01 6.2383981494412399e+00 8.7703889714141425e+00 9.9908196032513992e+00 0 0 0 +266 4 -8.3036691590210043e-03 3.8552898694615410e+00 6.3532834866457213e+00 1.2405163389905894e+01 0 0 0 +223 3 -1.5495221688355837e-01 2.7688702181241505e+00 8.0788864563930165e+00 8.7961622886575483e+00 0 0 0 +47 1 -1.4240292392311604e-01 -8.0585282619207854e-01 1.1001203580909479e+01 1.0640184120123211e+01 0 -1 0 +239 3 -1.5918937290882762e-01 1.2364626954722713e-01 7.3735979096052837e+00 7.1236548585242829e+00 0 0 0 +211 3 -1.5314927771899267e-01 7.7651972221628771e+00 8.5829452424035306e+00 8.2735478967570266e+00 0 0 0 +174 1 1.3567196175621835e-01 3.3561575756156685e+00 7.2839028683362592e+00 1.3611594287463081e+01 0 0 -1 +178 1 -4.2521883951091258e-02 5.4615345784574156e+00 8.6476231458927373e+00 1.3600443195015076e+01 0 0 0 +290 2 2.1442656366253354e-01 5.5274039219990954e+00 9.2255865950855895e+00 1.2687705291121766e+01 0 0 0 +303 2 2.5353570250225943e-01 -2.2348717930687036e+00 7.0298204354936624e+00 6.9132532076613566e+00 0 0 0 +24 1 1.2162850983145865e-01 1.3570458894241060e+01 3.7277652770944414e+00 9.8918074854908070e-02 0 0 1 +5 1 1.3914102385590588e-01 1.1213395000571410e+01 8.0472724282855101e-01 5.7408880705229404e+00 0 0 0 +197 1 -1.3041827238141993e-01 1.8473286069241315e+01 1.0985097812596707e-01 3.0075353107267451e+00 0 1 0 +13 1 1.7283275995574809e-01 1.2875160453890059e+01 4.7996107330851263e+00 5.2087316096641079e+00 0 0 0 +17 1 -1.1881087407702678e-01 1.2355470079281316e+01 4.1155201213165631e+00 6.3297886650294171e+00 0 0 0 +125 4 3.7413972756181225e-03 1.9792607892607982e+01 3.8314384983826288e+00 3.7758070374204347e+00 0 0 0 +65 3 -1.5036712947298864e-01 1.5121389160787066e+01 4.9829628898301168e+00 4.1493419461259045e+00 0 0 0 +117 4 -2.8172670419954578e-02 1.7196064275775313e+01 2.0768392879531876e+00 6.6413862436815210e+00 0 0 0 +61 3 -1.2308569749478299e-01 1.0809273741496686e+01 2.5226209794106560e+00 4.0850632510091458e+00 0 0 0 +85 3 -1.6137869003688254e-01 1.6596173548046423e+01 3.2483998401081635e+00 6.6279770720028131e+00 0 0 0 +69 3 -1.6211349992745419e-01 1.4316483787038429e+01 2.8679518868321781e+00 4.4855442842711772e+00 0 0 0 +9 1 -1.3074969844225212e-01 1.2401631549383206e+01 3.6248247848246284e-01 5.0973483639088109e+00 0 0 0 +80 3 -1.2136120739760561e-01 1.2414408244527392e+01 3.7798480870141100e+00 2.3049497332865676e+00 0 0 0 +105 4 -8.7639699558985304e-03 1.0400914317139788e+01 1.9934211504476644e+00 5.2185528134499632e+00 0 0 0 +109 4 3.6355423208319151e-03 1.4153445124920722e+01 4.1606747163691100e+00 4.5151554719853308e+00 0 0 0 +116 4 -2.0040355754916923e-02 1.3085160543744017e+01 4.4594714321443236e+00 1.4538603237969565e+00 0 0 0 +129 2 2.8405512757711698e-01 1.2820832866494431e+01 8.9357547891832556e-01 4.2332198666407352e+00 0 0 0 +152 2 2.4669130813086726e-01 2.1677578157490025e+01 4.0323646146544609e+00 3.5638857460123857e-01 0 0 0 +29 1 5.8620817499049974e-03 1.8561052170019028e+01 2.8191467769292960e-01 5.3975919601693825e+00 0 0 0 +141 2 2.6074912497584113e-01 1.6683115099591326e+01 2.8811346832734976e+00 4.1932142387762292e+00 0 0 0 +33 1 1.3809754803072044e-01 1.7700292673901394e+01 1.4462902229581946e+00 5.3613784374191082e+00 0 0 0 +37 1 -1.2506428679034834e-01 1.7292724764729162e+01 1.9577791424971711e+00 4.1365222417858645e+00 0 0 0 +41 1 1.5574606725144832e-01 1.7684017799240962e+01 1.2568437218671011e+00 2.9834398674586708e+00 0 0 0 +121 4 3.1035256692961075e-03 1.7254091420272236e+01 1.9749573648856620e+00 1.5939503050368518e+00 0 0 0 +49 1 1.3615547301261535e-01 1.8863927091248083e+01 5.0961048964131059e+00 3.9285863191137240e+00 0 0 0 +149 2 2.2703718115742552e-01 1.9254758140895767e+01 4.0931544733063738e+00 6.6148594449325175e+00 0 0 0 +84 3 -1.3924471002607569e-01 2.0413070700633931e+01 1.2047548927515181e+00 1.0936978108224675e+00 0 0 0 +53 1 -4.8376182763242251e-02 1.9296848129360342e+01 5.1351935135474474e+00 6.3529637885031054e+00 0 0 0 +89 3 -1.4492596391523513e-01 1.7151071776065425e+01 1.2918686591231159e+00 5.0291711308277665e-01 0 0 0 +93 3 -1.7423814775149760e-01 1.6893419100350471e+01 3.2111750510659807e+00 1.6437292442546174e+00 0 0 0 +97 3 -1.3408621635364737e-01 2.0252553978161927e+01 3.6033112624663475e+00 2.6319164884537698e+00 0 0 0 +101 3 -1.5647560242362671e-01 1.9966818329962706e+01 2.9803252235704702e+00 4.7704681555938286e+00 0 0 0 +145 2 2.9710717883828969e-01 1.8342396226420870e+01 5.0375210273389071e+00 1.8399466526232027e+00 0 0 0 +228 3 -1.4751575154425844e-01 1.3620322518195461e+01 4.8592688087461144e-01 1.7071338271502052e+00 0 1 0 +57 3 -1.6234942986621856e-01 9.5573034514145281e+00 2.5713316687631611e+00 6.0309294315367872e+00 0 0 0 +133 2 2.5213413889296182e-01 1.2870471176495373e+01 3.1816472789094496e+00 6.6131200188746284e+00 0 0 0 +136 2 2.5352888813788832e-01 1.5309707786810065e+01 4.9333975554866214e+00 8.8529787370636895e-02 0 0 1 +138 2 2.4757969448062320e-01 1.1088418315051889e+01 4.2920333787949172e+00 3.0106028235732774e-01 0 0 1 +1 1 1.4746669082761749e-02 1.0642281893540970e+01 6.8544269556010395e-02 6.8142401227780320e+00 0 0 0 +88 3 -1.6483993868322799e-01 1.9581081903169775e+01 5.2703115059623826e+00 2.1488086883709036e-02 0 0 1 +64 3 -1.5561028561723289e-01 8.1514538556249523e+00 3.6877081373514281e-01 1.0190861669963537e+01 0 0 0 +8 1 1.2742104870686943e-01 8.4817612503248814e+00 1.9386649635257653e+00 1.2088673448348180e+01 0 0 0 +12 1 -1.3287822675261260e-01 9.7374245849040690e+00 2.3614292305863063e+00 1.1668887530828931e+01 0 0 0 +16 1 1.7038148918615603e-01 1.0385610834546672e+01 3.4830285077629948e+00 1.2258282947730743e+01 0 0 0 +20 1 -1.2612831428267482e-01 9.7652115043624903e+00 4.1264217871858486e+00 1.3381826333553166e+01 0 0 0 +25 1 -4.9580879905770883e-02 9.2720365942599763e+00 3.2092695107275732e-01 7.3585562419532167e+00 0 0 0 +148 2 2.8255405335750933e-01 1.6024837696238595e+01 3.2479443163306607e+00 8.9410550895656549e+00 0 0 0 +137 2 2.4211278788929905e-01 9.1875734209445099e+00 7.8297873360776893e-01 8.2956507179333450e+00 0 0 0 +104 3 -1.6303797587445271e-01 1.7571928078007303e+01 5.3161697109543047e+00 1.2072204347282128e+01 0 0 0 +68 3 -1.3950884940126265e-01 1.2726252049625897e+01 3.2949351425978031e+00 1.1414834763137264e+01 0 0 0 +128 4 -1.1637074791112794e-02 1.7184554793649326e+01 4.6282393562250501e+00 1.1015460865140042e+01 0 0 0 +73 3 -1.5872839596893912e-01 1.1181520064577594e+01 2.5784441672869147e+00 8.5109267793241798e+00 0 0 0 +77 3 -1.2443355673803388e-01 1.0091806544554002e+01 4.3646337275773526e+00 9.2688186113011550e+00 0 0 0 +108 4 -3.6175483988508603e-03 7.8242079841413910e+00 6.6722303677879913e-01 1.1399732511932291e+01 0 0 0 +112 4 -1.1575150065119208e-03 1.1761455742350400e+01 4.0719181606614256e+00 1.1776879794815027e+01 0 0 0 +113 4 2.4550599269124868e-04 1.0795250821397342e+01 3.7987066995239132e+00 8.3505753502250588e+00 0 0 0 +132 2 2.4842899099174726e-01 1.0210124897784075e+01 1.8788605874908142e+00 1.0866322237260500e+01 0 0 0 +56 1 -5.7548729418621672e-02 1.6817150692583052e+01 3.1182828489110217e+00 1.3647345422902928e+01 0 0 0 +21 1 1.3924700036304882e-01 1.1320578571569595e+01 4.6135876874421253e+00 7.0983485573687055e+00 0 0 0 +32 1 1.0844185182340992e-02 1.6170921360774656e+01 2.7042197293152741e+00 1.2379322306625614e+01 0 0 0 +36 1 1.3503387619781887e-01 1.5341369407103103e+01 1.5518718147435990e+00 1.2428854940060008e+01 0 0 0 +40 1 -1.3597771280707957e-01 1.4740075360614529e+01 1.0465774988630860e+00 1.1294731238516940e+01 0 0 0 +44 1 1.6880045598426557e-01 1.5001353192585187e+01 1.6411551197426020e+00 1.0010620303523039e+01 0 0 0 +48 1 -1.2558996845974929e-01 1.5808101597792366e+01 2.7755379813359049e+00 9.9372975636831917e+00 0 0 0 +52 1 1.3281216321759565e-01 1.6322309187162340e+01 3.3644510045114564e+00 1.1112513564301416e+01 0 0 0 +28 1 -6.5294980841562170e-02 6.4211323147196655e+00 2.3017586164015249e+00 1.3490316072051021e+01 0 0 -1 +81 3 -1.2843492532541184e-01 1.7151825848192740e+01 1.3120341070283221e+00 7.7174295144219229e+00 0 0 0 +124 4 -1.4764597579941991e-02 1.4185236897374100e+01 1.0228517938755142e+00 8.8729039133495515e+00 0 0 0 +92 3 -1.4190415481562765e-01 1.4204698596670227e+01 1.5016257934556176e+00 7.6321699049346643e+00 0 0 0 +248 3 -1.5638430087805932e-01 1.4020886714186110e+01 5.0947360067557721e+00 8.6627100663371710e+00 0 0 0 +100 3 -1.3133130869891860e-01 1.7310522047850426e+01 5.1918304994019406e+00 9.8392866690657019e+00 0 0 0 +4 1 1.5734719075794559e-02 7.8639113856106908e+00 2.6785305061792619e+00 1.3189765412864087e+01 0 0 0 +72 3 -1.5426752144049144e-01 1.1969567014622319e+01 5.3270782247615420e+00 1.2064966387155430e+01 0 0 0 +120 4 -2.0660475242344017e-02 1.5113088125709915e+01 6.8136976964891294e-01 1.3734925518848485e+01 0 0 0 +144 2 2.8606673499984137e-01 1.4148562456194458e+01 1.2935293435874679e-01 1.1341925553730979e+01 0 0 0 +169 1 -1.2507437749398062e-01 1.2589350193664469e+01 9.6660641865322336e+00 6.6820816309750768e+00 0 0 0 +157 1 1.3101766309728599e-01 1.1145831453245778e+01 6.5322364284476038e+00 5.4897532104231015e+00 0 0 0 +237 3 -1.8127406245080599e-01 1.6806111047670463e+01 8.6400093722835205e+00 6.6759262988075010e+00 0 0 0 +165 1 1.6995487109137958e-01 1.3103500332034736e+01 1.0384335954455226e+01 5.5271785715298618e+00 0 0 0 +176 1 1.2882442652127868e-01 1.3671797000328342e+01 9.6038663738548795e+00 2.6168928776903760e-01 0 0 1 +205 1 -4.8207815225547582e-02 1.9224825955952788e+01 1.0874213403116096e+01 6.6574893131046124e+00 0 0 0 +277 4 1.4930286360253821e-03 1.9651416561184572e+01 9.2489608770003588e+00 4.1784091141788453e+00 0 0 0 +209 3 -1.6275120538245183e-01 9.5554489015501503e+00 8.3795120288952756e+00 5.8743003066822324e+00 0 0 0 +213 3 -1.3485169792328811e-01 1.0943788927101483e+01 8.6431449393778390e+00 4.0928003727842803e+00 0 0 0 +161 1 -1.3273743374911376e-01 1.2280736566108812e+01 6.0290419636079431e+00 4.8556228573471660e+00 0 0 0 +221 3 -1.7679581574343128e-01 1.4393585749017504e+01 8.4899193891902520e+00 4.5825079042836760e+00 0 0 0 +253 3 -1.6035745761620385e-01 1.9781445944064224e+01 8.6485767448586675e+00 5.3040041753399327e+00 0 0 0 +232 3 -1.2799358810754613e-01 1.2364918612601592e+01 9.7758010551044840e+00 2.2401917199098085e+00 0 0 0 +257 4 -1.9913799867289986e-04 1.0451479233722360e+01 7.9379519522033899e+00 5.0504514859089920e+00 0 0 0 +261 4 -3.4555361126691019e-03 1.4320242842210837e+01 9.7749018361670981e+00 4.7062260598906827e+00 0 0 0 +268 4 -1.5055288888581174e-02 1.3124484360209099e+01 1.0442001174009329e+01 1.4325865653416883e+00 0 0 0 +281 2 2.5703834979854812e-01 1.2682557129077104e+01 6.5903281288690403e+00 4.0666020770935871e+00 0 0 0 +76 3 -1.6586999266455632e-01 1.3327490136711706e+01 5.7131554828911719e+00 1.6697801246823667e+00 0 0 0 +269 4 -2.1171000778044357e-02 1.7283160130632815e+01 7.4411692063792323e+00 6.6447469455156956e+00 0 0 0 +293 2 2.7290480959393421e-01 1.6390117340052175e+01 8.1427871754464327e+00 4.1453778817030393e+00 0 0 0 +185 1 1.4251888962968337e-01 1.7646301360095702e+01 6.8060051363141278e+00 5.2762360485359965e+00 0 0 0 +189 1 -1.3737458776787198e-01 1.7106287939262291e+01 7.3151885688533937e+00 4.0829606247112133e+00 0 0 0 +193 1 1.6541485059377861e-01 1.7474745511598268e+01 6.7395321126450396e+00 2.8386528663930264e+00 0 0 0 +249 3 -1.1843584216878646e-01 2.0295681305936338e+01 8.9442689135060611e+00 3.0850044490980602e+00 0 0 0 +201 1 1.3485899621277553e-01 1.8900452250802715e+01 1.0643913043619367e+01 4.2326691162612606e+00 0 0 0 +273 4 -1.6714023259828865e-02 1.6938996933016462e+01 7.3387870122823786e+00 1.5363988784299578e+00 0 0 0 +236 3 -1.2355410366085848e-01 2.0177433851291724e+01 7.3270773757376118e+00 8.0727851108673909e-01 0 0 0 +297 2 2.7365008989235995e-01 1.8678094529668360e+01 1.0829042176024551e+01 2.0264646843938703e+00 0 0 0 +241 3 -1.3242507487597038e-01 1.7150677421619047e+01 6.6859112973428427e+00 4.3318022894633185e-01 0 0 0 +245 3 -1.5323252835912843e-01 1.6103166872797594e+01 8.3462901340103492e+00 1.5133752076252216e+00 0 0 0 +217 3 -1.4629220392561476e-01 1.5067188206352801e+01 1.0618680859452411e+01 4.0492352246916967e+00 0 0 0 +181 1 5.0965121162264149e-03 1.8587182516354687e+01 5.7170737089830137e+00 5.1565413815669334e+00 0 0 0 +292 2 2.2874358541976608e-01 1.1552525108380831e+01 7.6259286510297697e+00 1.3384679985379644e+00 0 0 0 +180 1 -5.1746461189359383e-02 1.1625165190185328e+01 8.1444186576450406e+00 4.0762536869394300e-01 0 0 0 +153 1 8.8208209649980433e-03 1.0600258034032093e+01 5.7454307198841628e+00 6.5451775261429477e+00 0 0 0 +288 2 2.4927582339981319e-01 1.5463637315305929e+01 1.0699099426447392e+01 1.0486275946296693e-01 0 0 1 +45 1 -1.3517946310057191e-01 1.8301477956473473e+01 5.5717679472161583e+00 2.7664633054482839e+00 0 0 0 +304 2 2.2486586845500126e-01 2.1617085806614373e+01 9.5310367098813202e+00 5.5239430577664519e-02 0 0 0 +301 2 2.3470421113143294e-01 1.8703111761640312e+01 1.0141321746893691e+01 7.2037351056071399e+00 0 0 0 +160 1 1.3364542254657649e-01 8.4346293600260474e+00 7.6851716017603682e+00 1.2467023336907147e+01 0 0 0 +164 1 -1.2487089796822108e-01 9.6666468779246557e+00 8.0468240032658169e+00 1.1943669747243241e+01 0 0 0 +168 1 1.6701349494391496e-01 1.0439803295885056e+01 9.1127840899256274e+00 1.2381177087258184e+01 0 0 0 +172 1 -1.3020759405372742e-01 9.8932371684989029e+00 9.8913871779883049e+00 1.3447195727693076e+01 0 0 0 +212 3 -1.5125403187103914e-01 6.9624281408518947e+00 5.6571610609985141e+00 1.2453261174476992e+01 0 0 0 +300 2 2.7611769610997067e-01 1.6017471570020845e+01 8.6259558338967963e+00 8.7191276546742404e+00 0 0 0 +173 1 1.3743470947361397e-01 1.1427208127509154e+01 1.0070249006720299e+01 7.3012666328220623e+00 0 0 0 +252 3 -1.3985099857863706e-01 1.7703283623898365e+01 1.0471689159899555e+01 9.4960946630226921e+00 0 0 0 +220 3 -1.3314684995454354e-01 1.2640391702818302e+01 8.7278098710881640e+00 1.1171691575716721e+01 0 0 0 +224 3 -1.6236151179485753e-01 1.2195126308387401e+01 1.0782788030472828e+01 1.1930418819765878e+01 0 0 0 +225 3 -1.6039635575996958e-01 1.1353998720161787e+01 8.0440397714963083e+00 8.6550334837763891e+00 0 0 0 +229 3 -1.3323753060864349e-01 9.9301103297282758e+00 9.5821150336327268e+00 9.3285752178239303e+00 0 0 0 +260 4 -7.2882218470804692e-03 7.7661613649657051e+00 6.4638379478392016e+00 1.1828846332357456e+01 0 0 0 +264 4 -4.4812040282032721e-03 1.1811851783049329e+01 9.5492369552617848e+00 1.1798537690204709e+01 0 0 0 +265 4 -1.1490593454960719e-02 1.0900624858965966e+01 9.2549569808961660e+00 8.5265278740098260e+00 0 0 0 +284 2 2.6169361381127387e-01 1.0136530252720341e+01 7.4934987247178269e+00 1.1092226812526848e+01 0 0 0 +156 1 3.7379196017244612e-03 7.9392347778451446e+00 8.4560411860777513e+00 1.3578276661002105e+01 0 0 0 +296 2 2.6498019774798365e-01 1.4043644232829966e+01 5.7233288173678014e+00 1.1072881863137523e+01 0 0 0 +184 1 6.4957634629475743e-03 1.6305180909519947e+01 8.0991512260634924e+00 1.2086442524820042e+01 0 0 0 +188 1 1.4843357901885965e-01 1.5406855890108130e+01 7.0068766343707436e+00 1.2240334144353453e+01 0 0 0 +192 1 -1.2516789083526150e-01 1.4818668347533144e+01 6.5268485695570471e+00 1.1067589711981087e+01 0 0 0 +196 1 1.6508881872184145e-01 1.5069466191418311e+01 7.0262259913129794e+00 9.7805102402414406e+00 0 0 0 +200 1 -1.3083913251494941e-01 1.5877770724233319e+01 8.1909563622810566e+00 9.6849283497158432e+00 0 0 0 +204 1 1.4328415910864176e-01 1.6517454767413131e+01 8.7153370164695936e+00 1.0835341568135473e+01 0 0 0 +208 1 -3.8003030991159703e-02 1.6991575004843000e+01 8.6944401555232247e+00 1.3313277441939094e+01 0 0 0 +233 3 -1.2326769386570821e-01 1.7156065036742135e+01 6.6639053499866350e+00 7.7079787843959817e+00 0 0 0 +276 4 -5.2986617880064930e-03 1.4413639513006760e+01 6.3307747767611460e+00 8.5405715830585791e+00 0 0 0 +244 3 -1.5332334147379001e-01 1.4369625482518934e+01 6.9679841418869541e+00 7.4021901341817147e+00 0 0 0 +280 4 -1.0402553151618275e-03 1.7407378472673361e+01 9.9643766158767004e+00 1.0667658376032438e+01 0 0 0 +256 3 -1.5333876696855078e-01 1.7730538655474327e+01 1.0586091087689283e+01 1.1752671734713664e+01 0 0 0 +216 3 -1.2878785467194953e-01 8.1639102845009042e+00 6.0881555837219636e+00 1.0601035151948000e+01 0 0 0 +272 4 -1.1454730376138519e-02 1.5121809213972451e+01 6.4239863410326965e+00 1.3638484698105245e+01 0 0 0 +240 3 -1.7440955102646941e-01 1.4541899399377094e+01 1.0692525508455294e+01 1.3580894402760997e+01 0 0 0 +289 2 2.5518604784481402e-01 9.0866514971259225e+00 6.9566208908866489e+00 7.6825247899372453e+00 0 0 0 +177 1 -5.5916134966486265e-02 9.2532862740598993e+00 6.0521578915699488e+00 7.1173031955497548e+00 0 0 0 +96 3 -1.5202035991426149e-01 1.3493699232041106e+01 1.1085823288281921e+01 9.0487676573379119e+00 0 -1 0 +285 2 2.4589286761119938e-01 1.3000363019268956e+01 8.7257850399635615e+00 7.0132894052156329e+00 0 0 0 + +Velocities + +30 -2.4174866102998649e-05 -5.8400589693352791e-03 3.6955846688862632e-03 +34 -1.3368307218153295e-03 7.0584278791678914e-04 -3.0271317908999555e-03 +38 8.6171069789500506e-03 -1.0386254798008827e-02 -2.3314367537503582e-03 +42 4.8899848626993876e-03 3.9658933682618922e-03 -1.3834629869053450e-03 +46 -5.1759547107459820e-03 -1.6591730900438351e-03 1.3562788235339125e-03 +50 3.2654372821856043e-04 -2.6116773352929845e-03 3.0838446698027021e-03 +2 5.1894432194761312e-04 -3.6417701641676351e-03 -6.0338161946400983e-03 +83 6.4151200155796147e-03 1.1229419196344197e-03 5.8686926636185061e-04 +151 -2.8796970286988421e-02 -1.9548040511881571e-02 -6.7147938124706083e-03 +90 6.2870412345627461e-04 -3.1855217036112515e-03 -2.4627865498249857e-03 +62 -4.4936223386147171e-03 2.5073159143134635e-03 5.0810575404568363e-03 +98 -2.6875273259438230e-03 -2.4115478804683705e-03 -4.4288138402231482e-03 +54 -5.1467385322100587e-03 2.3510009029855091e-03 -5.7599904123623999e-03 +87 -2.6684214311491952e-03 -2.8674576614179329e-03 -2.4648328610147843e-03 +122 -1.1105639887986528e-04 3.7635425105536613e-03 6.5468310425097244e-03 +126 1.7828516731701188e-03 2.8588181283881898e-03 -2.1514694876793162e-03 +106 -7.7358290604802099e-03 -4.3326415268508372e-03 2.1962581331009981e-03 +146 -1.9223843131665190e-02 -1.5532877349572517e-02 -1.1613923723158268e-02 +110 -8.2566212285788074e-03 4.2234253378360346e-03 3.6785470951886073e-03 +150 -1.2647024341794211e-02 1.8221509465505117e-02 -5.0128424122487351e-03 +6 -6.8768919890731146e-03 9.6678308905083585e-03 -1.3917811305885867e-03 +10 3.3168337478153122e-03 3.3619712471675725e-03 1.0650876474592522e-03 +14 -1.6475678689132532e-03 -6.7698081292684271e-03 -7.9364870861734881e-04 +18 1.0422096740317807e-04 -4.8696249119766313e-04 -4.3921928339088817e-03 +27 -6.9682265925353234e-04 5.5558986359258728e-03 -2.7945120615473170e-03 +130 7.3436853366040510e-03 -1.5615310112063635e-02 -9.7973567669173128e-03 +115 -4.9493176729646319e-03 2.2805811912743512e-03 -4.9676425031934309e-03 +70 4.0695789639428725e-03 2.2086802832277375e-03 3.2576668769327293e-03 +66 -8.5702414719068636e-04 1.8464043867736203e-03 -9.9555929207937981e-04 +79 1.1070783496162258e-03 6.1862400561743238e-03 -4.4051680685139050e-04 +75 1.9178089415144753e-03 3.1463732884630131e-04 -1.7217916675468907e-03 +139 2.8517079207620144e-02 -1.9905991206418231e-02 3.0264652754780935e-02 +23 4.3797306852474890e-03 7.4086737657933421e-03 -2.8926828277232282e-03 +118 -4.2147982046991687e-03 -8.2984567965974573e-03 -1.7977706716132648e-03 +26 3.4699369555654721e-03 -5.3268668174097636e-03 1.8533436395768656e-03 +135 5.0870099813551360e-03 2.0031409187880080e-02 2.2279936704878493e-02 +134 -3.4718997783717287e-02 -2.9046322574695655e-02 -6.7290107414706181e-03 +35 -1.2742938214048215e-03 -5.4677769759628484e-03 4.7166914319580477e-03 +39 -3.5171031039312260e-05 -1.1036949335105606e-03 -1.7799449964092009e-03 +43 4.8250906268874363e-04 -3.8354099752335269e-03 -5.0163266920790258e-03 +55 3.9772466070045580e-03 -3.5583777510197752e-03 -2.7896235341660572e-04 +51 1.5321458062959898e-03 -2.5209486954065438e-03 -2.9415253251844297e-03 +67 5.2768727282876873e-03 3.3637779239677082e-04 -5.3077524292974064e-03 +82 -4.6010418478961692e-03 2.1304975260813871e-03 1.1013307930023183e-03 +111 -4.0141402813814028e-03 1.2793755351396241e-02 -1.1323015089853242e-03 +91 -9.6347063458754171e-04 -3.5925228782824701e-03 3.7468788450416997e-03 +95 5.2641923860850424e-03 -1.1996066942874387e-03 -3.8583046662080682e-03 +99 2.3310479302716311e-03 2.2048601264337848e-03 1.9775025948164386e-03 +103 6.3269083153676174e-03 6.1569760098524693e-03 -1.3850043247383714e-03 +11 -8.2028729433133388e-04 8.2443337191164673e-03 6.9902706057217599e-03 +123 2.8650904196624318e-03 -6.0257734224878484e-03 -1.2614564384462788e-02 +127 -1.3550684527947047e-04 -2.6284774608511655e-03 2.8069949466735810e-04 +143 -1.8419932991845429e-03 -2.6883069832929719e-03 -8.1392982989522298e-04 +226 3.4261189824281555e-03 -3.2522996094829560e-03 2.8225670673923528e-03 +74 -1.5628901433170131e-03 2.5608703622864438e-04 -1.3280001953940086e-04 +107 1.5589530299060254e-03 -2.4852894833352420e-03 8.3108677637003976e-03 +7 4.2438551230323320e-04 -5.7307909930981258e-03 -2.7893810245450206e-03 +59 2.2690384886148115e-03 -9.0468087925548706e-03 -5.1781998228276976e-04 +15 -3.9577231821540616e-03 -2.1847885018534147e-03 -8.4371976597557574e-03 +19 7.1229587205270907e-03 -2.1206916186471624e-04 -5.8627889621317396e-03 +147 1.6390240343441092e-02 -8.7176501390591708e-03 -2.8178922194092536e-03 +114 4.7515421240825620e-03 6.7642492576560622e-03 1.7473395470475074e-03 +3 4.2551631139686498e-03 1.9437904991404275e-03 1.7935525179072753e-03 +63 3.8697842475399176e-03 -8.4765436511819187e-03 -2.0491881784184133e-03 +78 -5.3846747219525202e-03 -6.8961963835257167e-03 -3.7349089410657235e-03 +71 2.9873740104239097e-03 8.1549198198451985e-04 -1.2934279359320738e-03 +131 -5.0390794739495932e-03 -4.6131525347064785e-03 -4.9175135351588175e-03 +31 -5.2605889050595231e-03 5.7430101599048719e-04 -7.0682843661158861e-03 +86 3.1844979209605865e-03 4.0950803059798075e-03 -3.0587604667680749e-03 +60 8.1133523195327998e-04 -7.6704816714192525e-03 -2.2818047599636416e-03 +155 -8.0144518574578917e-03 -5.1005256982490348e-03 6.2037281719425292e-03 +22 4.1797836257974454e-03 1.6568806164942351e-03 8.7670139729851895e-05 +140 -2.3324839515429668e-02 -1.2437810613019238e-02 3.6287188915814311e-02 +199 -1.0790097311952464e-03 -2.9869062426129372e-03 -4.0112108465879112e-03 +119 -1.1755627465417481e-03 -8.2100780073601515e-03 2.6479374681998786e-03 +182 1.8734201874040408e-03 -2.6689908635035755e-03 1.0860930707006422e-02 +186 -2.5675279605953606e-03 -2.4756375850000737e-03 1.0395482737196491e-03 +190 2.2910971675434619e-03 -1.3145289380748972e-03 -5.2985364488092098e-03 +194 6.8186760409634419e-03 8.3840465649670081e-04 5.3074104269872037e-03 +198 -5.0859955599489521e-03 4.2087962673814959e-04 4.6023185972026296e-03 +202 2.1012410907117738e-03 -6.7507745063792000e-03 -1.1128219310673163e-03 +206 -6.5209450456218789e-03 -1.0339535444774403e-03 -1.4501279837400901e-03 +235 3.3388911239315496e-03 2.1065220517720367e-03 7.9991895755700954e-03 +142 9.8475835271551841e-03 -9.5028518218655076e-03 -1.8276565508549877e-03 +242 1.0217457780939720e-03 -1.5197673217320828e-03 4.7406923875269085e-03 +291 -3.0930387698493111e-02 7.8445304030849618e-03 1.6310030568432197e-02 +250 -6.8489632875769993e-04 4.6565160745170404e-03 3.3886136702525487e-03 +258 -1.4004182588445049e-03 2.2806177132263595e-03 -1.0347843260651223e-03 +262 -1.2881324206774447e-03 6.9434393825884946e-04 -5.8956964621466827e-03 +274 -1.8944352259530324e-03 3.2192357927930009e-04 -1.7082790058223906e-03 +278 1.5288401707297728e-03 3.6217814543088645e-03 -2.0316883110052923e-04 +222 7.7331045584829068e-03 1.2362023936040929e-03 8.2907874575483369e-03 +298 2.5328078728893279e-03 -6.2165377525673126e-03 1.5784008908580539e-02 +267 7.0018357704332811e-03 -4.5522884959513024e-03 7.6649882914402567e-03 +154 -3.6287490712629171e-03 -1.2740874221828388e-02 3.8314063886802823e-03 +158 -7.6208895283387092e-03 1.1878194435768373e-02 -3.5971056387286322e-03 +162 -6.4746300934775817e-04 5.5506749212761494e-04 6.0756597279294430e-03 +166 1.1989320501678076e-03 -5.0577544194060501e-03 6.3998146927604317e-03 +170 -3.8035317060563859e-03 7.5841699707098983e-04 6.5780084783308920e-03 +175 -3.8974609142492406e-04 6.1926230615375706e-04 -2.3335031290293434e-04 +282 9.3600641903433621e-03 3.6118288335866035e-02 -6.6071709116293925e-03 +179 3.4096307972593799e-03 -3.4658785452165147e-03 -3.1253185076433169e-03 +231 -2.9608872194030354e-03 1.7079627030041283e-04 3.4641088880785907e-03 +218 5.3586543913679188e-04 2.9233881729537371e-03 3.5123582767227724e-03 +294 5.5955227959160669e-03 -1.0367898439140481e-02 2.0848408079255427e-02 +227 5.9077764223686036e-03 -2.1490305761074865e-03 -1.1498913753977054e-03 +254 1.0207662040460023e-03 -2.8373729468057305e-03 -4.2228149347897145e-03 +94 7.0053050017033342e-04 -3.4205728973730012e-03 5.5901075709640308e-03 +214 -2.1438652636591813e-03 -7.5896096294795689e-03 -8.6309429242904783e-03 +210 -1.0137192662770177e-03 1.7866741192566335e-03 -2.8780339165619612e-03 +58 3.6776824844257320e-03 5.0588406301632300e-03 -7.3087049943876834e-03 +246 -4.7447451326206687e-03 2.9334768545539193e-03 -3.7175562945460888e-03 +102 -7.7688822748834601e-03 -3.3809459073935026e-03 -1.9803049579750244e-03 +238 -2.2703027353564169e-03 2.3821770671317356e-03 -2.3098026900021324e-03 +287 6.1455392512188714e-03 -6.1103362577766343e-03 2.6693189746480363e-03 +286 -1.3231867204732992e-02 9.6718744859041784e-03 5.2001428560543668e-03 +171 -3.2795522829800667e-03 2.3198896576538167e-03 -8.7584561749707406e-03 +187 -7.1723088512307930e-03 -1.4024816229882265e-03 2.4036881855671209e-03 +191 -1.1265816553933752e-03 -1.6943105339333627e-03 2.1934152683983758e-03 +195 -3.0355768625237203e-03 -1.4270597862987302e-03 -4.4764275782047036e-03 +270 4.9452386193567094e-03 3.4248768308214380e-03 -2.7114518030588778e-03 +203 -3.6586732242194263e-03 -6.3045607688845878e-03 1.2589365192845096e-02 +302 -3.0967008143875647e-03 -1.4504530673619854e-02 -2.5558490469790678e-02 +234 5.8312510510702895e-03 -2.7109492663016086e-03 2.7864231473259892e-03 +183 1.9611113402573451e-03 -4.6399229602014196e-03 -4.5484397980495861e-03 +243 -1.7989222282919558e-03 -8.3773945133634839e-04 -8.9721100811624658e-03 +247 5.3124635291446163e-04 -6.0116601385645152e-03 5.1900240478296765e-03 +251 -6.8565419117596312e-03 -1.1124755685907217e-03 5.6599142152711874e-03 +255 -1.4205420643149062e-03 4.8031833242560776e-03 -3.4229862352147741e-03 +259 -1.1678626131811894e-03 -7.6285944329823087e-03 4.4278412712106946e-03 +275 4.1647945349179862e-04 -6.5900329798053903e-04 -5.8751124096330177e-03 +279 1.3825195837119980e-03 -1.3491169538852154e-03 2.8955034735846019e-03 +295 -2.7825193434958737e-02 3.7188963726747116e-03 1.4241395330423495e-02 +230 3.9381149513646446e-03 -8.3657637033183324e-04 2.4205795188033744e-03 +271 -5.5957344548436894e-03 4.3979467178565422e-03 2.6593393575132305e-03 +219 1.8686514417658123e-03 -3.5626313146927386e-03 5.5554970146296989e-03 +159 1.0526790106853650e-02 3.0132509030908776e-03 -5.9349539991849767e-03 +207 7.6888508831103432e-03 1.9814068662144511e-03 5.8024603926956310e-03 +167 7.3873940493462574e-03 5.0561160614476441e-03 -9.5138068359663409e-03 +299 1.1389090343270231e-02 1.2335222052153004e-02 5.1854247830508448e-03 +163 3.7514806422877323e-03 6.0021848224389458e-04 7.3984182635305855e-04 +263 -1.3311416384275030e-03 -8.3947102292534256e-04 -1.6587363346947726e-03 +283 -1.0620025504881845e-02 2.7452983956948855e-03 -8.6416056884697917e-03 +215 -1.3673571899212099e-03 -4.9165406371302806e-06 -5.4353669866533106e-04 +266 -1.5207241133139229e-03 -3.0455538066024301e-03 -4.9898142041270308e-03 +223 7.5910823419502059e-03 2.1726507130216993e-03 2.7886767580300427e-03 +47 1.7101589232864246e-03 6.5504844423619577e-04 -3.8918976101025146e-03 +239 5.3972599702514796e-03 -3.2074197692656811e-03 -2.8617030304009731e-03 +211 3.8857543898680621e-04 2.1756300867946709e-03 3.0390581737593124e-03 +174 3.0622057715666486e-04 -3.5442317884825654e-03 6.8549731131780913e-03 +178 1.0100086235516800e-02 -2.1135991151899139e-03 -3.9716759635449574e-03 +290 4.6165685682473881e-03 1.1431875282555784e-02 -9.5929415658242510e-03 +303 3.4375944882452270e-02 1.2663150202869896e-02 5.0191122447531662e-02 +24 2.7722040270529322e-04 9.3045183484613270e-03 -5.4696809618402084e-03 +5 1.4530732421377847e-03 8.4407096360853799e-03 6.9996566944709208e-03 +197 1.2180196447747885e-04 1.9057884749376704e-03 2.5203716257742922e-03 +13 2.9580325020781683e-03 -7.2598114036915157e-03 2.4953271033417565e-03 +17 -2.5691329217609050e-03 9.4706315563068708e-06 1.9944514378249611e-03 +125 6.0633500715407871e-04 6.0911401225465130e-03 2.0083752286464618e-03 +65 -3.6413892234086150e-03 8.4183871082086866e-04 -9.5673812168976177e-03 +117 -2.4135897728023823e-03 5.8854918825421406e-03 -9.7691183765619746e-04 +61 4.6973997015394816e-03 1.1808478803322716e-02 -1.6550999664335026e-03 +85 -8.2406395830183915e-03 -1.5500026972734928e-03 -3.1459961335715596e-04 +69 -2.8622735200865383e-03 2.0014502794053028e-03 -5.7101986761900507e-03 +9 -1.0407713436376988e-03 -5.4188685232808183e-03 9.7397563007423766e-04 +80 4.1821094389522294e-03 -1.4661786050517277e-03 -6.6021963934954691e-03 +105 -2.2592350958062024e-03 2.9575142392665385e-03 -3.4456168045163224e-03 +109 -4.4630310484392944e-03 8.3843196556275083e-03 -1.7785718826200719e-03 +116 -3.7261596410293608e-03 3.3180847030642203e-03 -3.6946196242010175e-04 +129 9.0700019604887097e-04 -3.6265074779059637e-03 -4.4372949358870211e-03 +152 1.1700981066970786e-02 -1.5474385127547048e-02 4.5469649055726834e-03 +29 -7.6273392485150498e-04 -5.2638028956206217e-03 1.5055014077169275e-03 +141 -3.7118829597102436e-02 6.5148473098852189e-03 4.3511847061281370e-03 +33 -3.9470728901237319e-03 4.5498742407082057e-03 -5.5393392769089384e-03 +37 8.8145907550448016e-03 -5.6012684363408336e-03 2.7301067646077464e-03 +41 4.1486225497212514e-03 -1.8362733044464384e-03 -1.7013548165352639e-03 +121 2.1700813079443522e-03 5.4557303436680955e-03 -4.4782699909277088e-03 +49 4.6413606571955217e-03 -1.9124228477447340e-03 -2.3388241246549385e-03 +149 -1.9995983634128758e-02 -5.0606377461450049e-03 2.0255946982863860e-02 +84 3.3713805726191702e-03 -2.9297704191600440e-04 9.1670737511324657e-04 +53 7.6804037541409907e-03 5.3546368402172320e-03 -3.2086851687728036e-03 +89 -3.5239071966877531e-03 -1.0591472119567920e-03 -3.0112741584284752e-03 +93 3.0220138249750666e-03 -1.7671027489704343e-03 3.3436379217387634e-03 +97 2.9633387608442546e-03 2.1027128795329643e-03 -1.4424462438033939e-03 +101 -1.7277449363560275e-03 -3.7883930305986006e-03 -1.2778141319349334e-03 +145 1.3754301880493217e-02 -2.9464527569243112e-02 -1.8827157517875556e-02 +228 2.4060656531958990e-03 -3.0156919087798470e-03 2.7324065007439283e-03 +57 7.0375169402002663e-04 -2.8537039994158140e-03 -1.5277803933876235e-03 +133 -7.1051720384830604e-03 -1.3677602407398261e-03 3.6026752123927572e-02 +136 -2.5544385010401623e-02 -1.4078454458823419e-03 4.0579684781210344e-03 +138 -4.0187647722179178e-02 -2.1571801243316192e-02 -7.1604231565876022e-03 +1 -3.4095272641180428e-03 6.1537481095595712e-03 7.9045267349075663e-04 +88 4.4116705299466841e-03 2.7993870615652876e-03 5.1164335644218956e-03 +64 -1.8742297825381788e-03 2.6827591735599583e-03 -5.1722459872697744e-03 +8 3.1885844258643008e-03 4.2903678434358713e-03 5.1786330955596359e-03 +12 -5.2210336672334420e-03 3.9495414273393922e-03 2.2335713352698550e-03 +16 9.9422742059577423e-04 1.7521404301466441e-03 8.7590953970051986e-04 +20 6.0854312947614614e-03 5.4983631623741992e-03 5.4593745160439952e-03 +25 -5.4309141612719491e-03 -1.7666866720226777e-03 4.7703338575602657e-03 +148 1.1086815383338491e-02 2.6022863618603707e-02 2.0087587552315819e-02 +137 1.5690832964233584e-02 -2.5293009109084732e-03 -1.1883375678028274e-02 +104 -5.0640494124431987e-03 2.3370245336442447e-03 -2.2986534425586274e-04 +68 -1.0867367865646591e-03 2.3623004024366013e-03 2.4942168922851425e-03 +128 -8.2438351816644800e-03 1.0571196268724028e-03 -8.4815808051728534e-04 +73 -5.7362573079004020e-03 -3.0043343214873099e-03 1.5237919791527093e-03 +77 -3.4255948914421685e-03 5.4760208931593666e-03 6.6618412238336061e-04 +108 5.2795029127425666e-03 6.5415836813069569e-04 6.1298969724376466e-04 +112 -1.6078046478582991e-03 4.0606635002996610e-03 9.1026530262352373e-04 +113 6.4915058150423399e-03 5.1629533163456854e-03 -6.3755775127421538e-03 +132 -4.0774627249993917e-03 -1.5399070432691127e-02 -7.4691887109230096e-03 +56 -5.2003817997179165e-03 -9.7620641513053094e-03 -4.3950880281533765e-03 +21 -7.0691445197789441e-03 7.6955670100957842e-04 -5.4105853611055871e-03 +32 -2.9169110825653880e-03 -1.1073349638571425e-03 -5.4851932971711724e-03 +36 -2.4396685252407470e-03 1.4819068238334156e-03 -3.0805515593447705e-03 +40 -7.0666779614816802e-03 -1.3430215710235145e-03 -4.4139313396336999e-03 +44 -5.1539163988777083e-03 -1.9320778456829594e-03 2.9052648833327553e-03 +48 -8.0370531818583901e-03 -4.9164082712983724e-03 1.0053385697820794e-02 +52 4.6673277069024383e-03 2.4732486926647718e-03 -3.0437092822526947e-03 +28 9.5059021626105167e-04 6.6703881368338760e-03 1.2183723942516731e-03 +81 -1.7766957322548395e-03 -8.0571519569416382e-04 -4.2657655144627132e-03 +124 -2.5737399426471086e-03 4.8932142374913043e-03 -3.0826221822277021e-04 +92 -2.7210332800526667e-03 -4.3522625573974967e-06 5.0313762934084396e-03 +248 -2.1428984033524610e-04 3.5920620300439283e-03 -1.2394812885684373e-03 +100 6.9480047945285808e-03 -2.0720536878365910e-03 6.0976223682410527e-04 +4 3.0533858921656435e-03 1.3749371297301436e-03 2.6879157400351203e-03 +72 6.9563359253365785e-04 -3.3839307816438810e-03 -5.2966447925867051e-04 +120 4.3628381698379657e-04 3.3989272988654736e-04 -4.7418586471331681e-03 +144 -1.9399828512073235e-02 2.8784276306305957e-03 -4.9015707840947172e-03 +169 3.6286101890929310e-04 1.3804030749833694e-03 3.8772039152943243e-03 +157 -9.7104751271310137e-03 -2.5432779712195779e-03 4.9920473407863593e-04 +237 -5.6836990991889925e-03 4.3828035612363779e-03 -4.9564216578871206e-03 +165 6.9095280546444867e-03 1.0729454663071183e-04 -2.8377808824037773e-04 +176 -3.5726796462146955e-03 -6.9803617017510314e-04 6.5737720026882414e-03 +205 -4.7897558884080942e-03 -9.7012031638177235e-03 1.6149422322463858e-03 +277 2.3932341723865618e-03 -1.2799481485681208e-03 -9.5088871626072000e-04 +209 1.5940196133829015e-03 3.4125147840405141e-03 -1.9185849366575963e-04 +213 5.0359888288056447e-03 -3.2459317567451623e-03 -6.0422204701546540e-03 +161 3.1496494652942433e-03 -5.4032811877358826e-03 -1.8404083591310836e-03 +221 -7.0837711227610673e-05 3.5642763354140797e-03 7.1267387665626429e-03 +253 -1.1552964427254658e-03 8.1061938945047457e-03 6.8560275135920814e-04 +232 7.1516069443152200e-04 6.9884991537049641e-03 1.9456377945585132e-03 +257 9.7287812908641580e-03 5.6802362058564610e-04 -1.9896602364413026e-03 +261 3.5641606450239399e-03 1.1263657016134332e-03 -4.9800485874682988e-03 +268 -2.4182201566053767e-03 5.6517425572549286e-04 -4.7968007270599378e-03 +281 1.8023451989382603e-02 -2.0011466408538753e-02 2.6788628047223523e-03 +76 3.6833438514848591e-03 -7.5314593270302587e-03 2.3036184377253134e-03 +269 5.4766103896972693e-04 1.0714454448212749e-04 -2.9150182080626727e-03 +293 -1.5803838932239959e-02 4.4565921908284638e-03 6.0777345016507587e-03 +185 -4.2480671256378598e-03 -7.4956530350122502e-04 8.8480321154379964e-03 +189 -2.1548899566118220e-03 1.5465752986606573e-03 -1.2754684317658836e-03 +193 -3.2970116016428075e-03 -5.5091314245397441e-03 4.6300273271534225e-03 +249 2.0185063121804770e-03 -3.3503108367265821e-03 6.4889425299302387e-03 +201 4.9894242342005612e-04 2.0554328851371461e-03 -2.2943565378546371e-03 +273 7.2763997976980747e-04 -1.0896643067098042e-03 7.1256273183209901e-03 +236 2.0690907685087471e-03 6.8363977716210979e-03 4.1459649884454768e-03 +297 1.3621128083419113e-02 1.6046581101408330e-02 4.8457931367957398e-03 +241 -2.5291016298909096e-03 1.4215869718728002e-03 -1.9884597198944918e-03 +245 -5.2221318448004168e-03 -1.7800664058218062e-04 4.4010035123521704e-04 +217 -1.7843053411821738e-03 -1.6528038759970564e-03 -2.3128643778518122e-04 +181 1.2770006041816402e-03 9.0821236224940469e-03 -6.7109253232624253e-04 +292 4.6641003179734592e-03 -1.5497869295909884e-02 9.9209229002761717e-03 +180 -2.3945351490970031e-03 2.1740953931129073e-04 6.0240486612073230e-03 +153 9.1376359130041884e-04 1.2619379366518707e-03 -1.1019889044123631e-03 +288 9.1870458102437658e-03 1.2778922312094822e-02 -2.1072238127411075e-02 +45 -7.7724575331532535e-04 -1.7141020628976028e-03 5.6759226356627775e-03 +304 -2.5582451057078827e-02 -2.2645536121991501e-02 -1.4290517463409140e-02 +301 -5.9841500766453981e-03 -1.5684175634367186e-03 -2.4956264538292219e-02 +160 3.9339801689694557e-03 -3.6126921625193411e-03 -2.4443523541620845e-03 +164 8.1230468881143946e-03 -9.3521431341237662e-03 -3.5308117479258393e-04 +168 4.9446040375734903e-03 -8.2154773760103651e-04 -1.0492769229361480e-02 +172 2.6148305794376089e-03 2.6504247099737371e-03 -2.7694367959707113e-03 +212 4.4593645697807213e-03 -1.4573503711062438e-05 -1.3782207140241650e-03 +300 -1.8679506789017677e-03 -2.0469993534843488e-02 -3.8301874388749933e-03 +173 -1.6137581443588121e-03 2.0965695130792921e-03 -4.0201255392549005e-03 +252 1.9637421273734318e-03 -4.1845350440895444e-04 9.1914352340609893e-04 +220 4.8425364408329402e-03 4.1558131563977632e-03 -4.5732135892261249e-03 +224 -5.0106731049793761e-03 6.3056084400456101e-03 -2.5402324427869867e-03 +225 2.3074874398853491e-03 -8.2581204918229945e-03 5.7223482227764808e-03 +229 -3.1949429657485212e-03 1.2470862731982931e-03 1.6206842413737377e-03 +260 -1.7356077348708357e-03 -6.6380421726333931e-04 4.9344441008672127e-03 +264 -1.4170245024577935e-03 2.5892297874871607e-03 6.1212726394288964e-04 +265 -2.0491154530031591e-03 -4.6743453933109679e-03 2.6620072482574646e-03 +284 1.0822583460626851e-02 1.1993987876701846e-02 3.7723405443682773e-02 +156 3.2121442419044783e-03 7.5002892289370033e-03 1.9824119709575898e-03 +296 -2.5491930009982500e-02 -2.3854508590914567e-02 -7.4606589514458746e-03 +184 -1.9223239057771181e-03 -4.9053534641709537e-04 1.2211379250644705e-03 +188 1.2636857357410621e-03 -4.9864683204641908e-03 -1.3531293825327969e-03 +192 -7.7727559158047056e-03 3.7612632558858211e-03 4.7003948322159681e-03 +196 -2.8825133856888118e-03 3.9250757025840674e-03 5.0909854172008495e-04 +200 -7.4421531526066200e-03 -1.5108146428348063e-03 4.2441546002170358e-03 +204 -4.5541880771186351e-03 2.2282891439829376e-03 9.6246255590907315e-03 +208 5.5460189242739375e-04 -8.5643343980268936e-04 4.6961691086096109e-03 +233 -9.7408104129497115e-04 2.0917875306183170e-03 1.6045486422407123e-03 +276 -1.0986838142969923e-03 5.4315792533420901e-03 5.0077081054951244e-03 +244 -1.2183665223623778e-03 -4.2193410981771198e-03 -2.7354288515525696e-03 +280 1.3552010403368481e-03 6.3132429381080192e-04 1.7031901341229926e-04 +256 -2.2077829342060304e-03 1.6772588023449473e-03 2.2350654447874461e-04 +216 1.2254364422878230e-03 2.0994512158283556e-03 -2.0172376558553222e-03 +272 2.1464441432257797e-03 -1.8486660410473694e-04 1.9014747511050384e-03 +240 3.1573950446869229e-04 -3.7605367960744638e-04 2.3191303881599541e-04 +289 -1.2039974662100633e-02 2.6395586163545951e-03 -2.8478645629107940e-02 +177 6.1157082891864691e-03 6.9161818478923455e-04 -3.0081137643864736e-03 +96 -3.1669072586457290e-03 -6.3737086224948253e-03 1.5172924185041878e-03 +285 -1.2188701008670824e-02 -1.7123376677445068e-02 2.0830072814090890e-02 diff --git a/examples/reax/HNS/ffield.reax.hns b/examples/reax/HNS/ffield.reax.hns new file mode 100644 index 0000000000..ccf7ab71a0 --- /dev/null +++ b/examples/reax/HNS/ffield.reax.hns @@ -0,0 +1,168 @@ +Reactive MD-force field: c/h/o/s/f/cl Jan30_2012 + 39 ! Number of general parameters + 50.0000 !p(boc1) + 9.5469 !p(boc2) + 26.5405 !p(coa2) + 1.5105 !p(trip4) + 6.6630 !p(trip3) + 70.0000 !kc2 + 1.0588 !p(ovun6) + 4.6000 !p(trip2) + 12.1176 !p(ovun7) + 13.3056 !p(ovun8) + -60.1292 !p(trip1) + 0.0000 !Lower Taper-radius (swa) + 10.0000 !Upper Taper-radius (swb) + 0.0000 !not used + 33.8667 !p(val7) + 6.0891 !p(lp1) + 1.0563 !p(val9) + 2.0384 !p(val10) + 6.1431 !not used + 6.9290 !p(pen2) + 0.3989 !p(pen3) + 3.9954 !p(pen4) + 0.0000 !not used + 5.7796 !p(tor2) + 10.0000 !p(tor3) + 1.9487 !p(tor4) + 0.0000 !not used + 2.1645 !p(cot2) + 1.5591 !p(vdW1) + 0.1000 !Cutoff for bond order*100 (cutoff) + 2.1365 !p(coa4) + 0.6991 !p(ovun4) + 50.0000 !p(ovun3) + 1.8512 !p(val8) + 0.0000 !not used + 0.0000 !not used + 0.0000 !not used + 0.0000 !not used + 2.6962 !p(coa3) + 4 ! Nr of atoms; atomID;ro(sigma); Val;atom mass;Rvdw;Dij;gamma + alfa;gamma(w);Val(angle);p(ovun5);n.u.;chiEEM;etaEEM;n.u. + ro(pipi);p(lp2);Heat increment;p(boc4);p(boc3);p(boc5),n.u.;n.u. + p(ovun2);p(val3);n.u.;Val(boc);p(val5);n.u.;n.u.;n.u. + C 1.3825 4.0000 12.0000 1.9133 0.1853 0.9000 1.1359 4.0000 + 9.7602 2.1346 4.0000 33.2433 79.5548 5.8678 7.0000 0.0000 + 1.2104 0.0000 199.0303 8.6991 34.7289 13.3894 0.8563 0.0000 + -2.8983 2.5000 1.0564 4.0000 2.9663 0.0000 0.0000 0.0000 + H 0.7853 1.0000 1.0080 1.5904 0.0419 1.0206 -0.1000 1.0000 + 9.3557 5.0518 1.0000 0.0000 121.1250 5.3200 7.4366 1.0000 + -0.1000 0.0000 55.0000 1.9771 3.3517 0.7571 1.0698 0.0000 + -15.7683 2.1488 1.0338 1.0000 2.8793 0.0000 0.0000 0.0000 + O 1.2477 2.0000 15.9990 1.9236 0.0904 1.0503 1.0863 6.0000 + 10.2127 7.7719 4.0000 36.9573 116.0768 8.5000 8.9989 2.0000 + 0.9088 1.0003 60.8726 20.4140 3.3754 0.2702 0.9745 0.0000 + -3.6141 2.7025 1.0493 4.0000 2.9225 0.0000 0.0000 0.0000 + N 1.6157 3.0000 14.0000 1.9376 0.1203 1.0000 1.2558 5.0000 + 9.4267 26.8500 4.0000 8.6294 100.0000 7.6099 7.7500 2.0000 + 1.0439 0.1000 119.9837 1.7640 2.7409 2.3814 0.9745 0.0000 + -6.5798 4.4843 1.0183 4.0000 2.8793 0.0000 0.0000 0.0000 + 10 ! Nr of bonds; at1;at2;De(sigma);De(pi);De(pipi);p(be1);p(b + p(be2);p(bo3);p(bo4);n.u.;p(bo1);p(bo2) + 1 1 156.5953 100.0397 80.0000 -0.8157 -0.4591 1.0000 37.7369 0.4235 + 0.4527 -0.1000 9.2605 1.0000 -0.0750 6.8316 1.0000 0.0000 + 1 2 170.2316 0.0000 0.0000 -0.5931 0.0000 1.0000 6.0000 0.7140 + 5.2267 1.0000 0.0000 1.0000 -0.0500 6.8315 0.0000 0.0000 + 2 2 156.0973 0.0000 0.0000 -0.1377 0.0000 1.0000 6.0000 0.8240 + 2.9907 1.0000 0.0000 1.0000 -0.0593 4.8358 0.0000 0.0000 + 1 3 160.4802 105.1693 23.3059 -0.3873 -0.1613 1.0000 10.8851 1.0000 + 0.5341 -0.3174 7.0303 1.0000 -0.1463 5.2913 0.0000 0.0000 + 3 3 60.1463 176.6202 51.1430 -0.2802 -0.1244 1.0000 29.6439 0.9114 + 0.2441 -0.1239 7.6487 1.0000 -0.1302 6.2919 1.0000 0.0000 + 2 3 180.4373 0.0000 0.0000 -0.8074 0.0000 1.0000 6.0000 0.5514 + 1.2490 1.0000 0.0000 1.0000 -0.0657 5.0451 0.0000 0.0000 + 1 4 175.7446 131.3190 132.3859 -0.5827 -0.2709 1.0000 29.9009 0.8400 + 1.9511 -0.2103 7.4487 1.0000 -0.1150 5.8717 1.0000 0.0000 + 2 4 161.1063 0.0000 0.0000 -0.1387 0.0000 1.0000 6.0000 0.7276 + 0.6127 1.0000 0.0000 1.0000 -0.0395 7.2218 0.0000 0.0000 + 3 4 86.0536 180.5864 40.0000 1.0000 -0.4462 1.0000 34.9336 0.2000 + 0.8154 -0.2175 7.0255 1.0000 -0.1937 5.2140 1.0000 0.0000 + 4 4 134.6492 66.2329 149.2707 -0.7228 -0.1000 1.0000 19.0850 1.0000 + 0.6060 -0.2050 9.7308 1.0000 -0.1791 5.8008 1.0000 0.0000 + 6 ! Nr of off-diagonal terms. at1;at2;Dij;RvdW;alfa;ro(sigma);r + 1 2 0.1219 1.4000 9.8442 1.1203 -1.0000 -1.0000 + 2 3 0.0344 1.6800 10.3247 0.9013 -1.0000 -1.0000 + 1 3 0.1131 1.8523 9.8442 1.2775 1.1342 1.0621 + 1 4 0.1398 1.9263 10.1847 1.4778 1.1446 1.1216 + 2 4 0.0480 2.3000 9.0050 1.0156 -1.0000 -1.0000 + 3 4 0.0942 1.9531 10.3265 1.3018 1.0984 1.0125 + 40 ! Nr of angles. at1;at2;at3;Thetao,o;p(val1);p(val2);p(coa1); + 1 1 1 67.2326 22.0695 1.6286 0.0000 1.7959 15.4141 1.8089 + 1 1 2 65.2527 14.3185 6.2977 0.0000 0.5645 0.0000 1.1530 + 2 1 2 70.0840 25.3540 3.4508 0.0000 0.0050 0.0000 3.0000 + 1 2 2 0.0000 0.0000 6.0000 0.0000 0.0000 0.0000 1.0400 + 1 2 1 0.0000 3.4110 7.7350 0.0000 0.0000 0.0000 1.0400 + 2 2 2 0.0000 27.9213 5.8635 0.0000 0.0000 0.0000 1.0400 + 1 1 3 49.5561 7.3771 4.9568 0.0000 0.7533 15.9906 1.0010 + 3 1 3 77.1171 39.8746 2.5403 -24.3902 1.7740 -42.9758 2.1240 + 2 1 3 65.0000 14.2057 4.8649 0.0000 0.3504 0.0000 1.7185 + 1 3 1 74.3994 44.7500 0.7982 0.0000 3.0000 0.0000 1.0528 + 1 3 3 77.9854 36.6201 2.0201 0.0000 0.7434 67.0264 3.0000 + 3 3 3 80.7324 30.4554 0.9953 0.0000 1.6310 50.0000 1.0783 + 1 3 2 71.5018 21.7062 0.4735 0.0000 0.5186 0.0000 1.1793 + 2 3 3 84.9468 23.3540 1.5057 0.0000 2.6374 0.0000 1.3023 + 2 3 2 77.0645 10.4737 1.2895 0.0000 0.9924 0.0000 1.1043 + 1 2 3 0.0000 25.0000 3.0000 0.0000 1.0000 0.0000 1.0400 + 3 2 3 0.0000 0.0148 6.0000 0.0000 0.0000 0.0000 1.0400 + 2 2 3 0.0000 9.7025 6.0000 0.0000 0.0000 0.0000 1.0400 + 1 1 4 61.6894 9.9742 3.5920 0.0000 5.0000 50.0000 2.2098 + 3 1 4 67.5853 29.6915 1.8611 0.0000 3.0000 0.0000 1.5926 + 4 1 4 53.0437 35.9280 1.7824 0.0000 5.0000 0.0000 4.0000 + 2 1 4 66.9313 25.8025 3.5718 0.0000 0.0600 0.0000 1.0946 + 1 3 4 71.7246 38.5022 1.1738 0.0000 1.6310 0.0000 1.2782 + 3 3 4 83.0764 35.5413 1.4072 0.0000 1.6310 0.0000 1.1439 + 4 3 4 79.3317 40.0000 2.3424 0.0000 1.6310 0.0000 1.0061 + 2 3 4 81.0695 40.0000 2.0285 0.0000 0.1218 0.0000 1.4477 + 1 4 1 68.9764 14.3404 1.9702 0.0000 1.3606 0.0000 1.0000 + 1 4 3 76.1086 35.0355 1.0724 0.0000 1.6777 0.0000 1.6071 + 1 4 4 81.8917 25.7475 0.7287 0.0000 2.0100 0.0000 1.9350 + 3 4 3 80.1274 24.7547 1.7946 -10.0963 1.6777 0.0000 3.2815 + 3 4 4 83.6527 36.3627 1.0967 -0.9193 1.6777 0.0000 1.0000 + 4 4 4 90.0000 44.3028 1.6659 0.0000 0.7529 0.0000 1.2398 + 1 4 2 76.9847 29.2262 0.9407 0.0000 0.0300 0.0000 2.6196 + 2 4 3 85.4080 40.0000 1.7549 0.0000 0.0222 0.0000 1.0774 + 2 4 4 83.5658 40.0000 1.3540 0.0000 0.0222 0.0000 2.6397 + 2 4 2 58.0387 1.1862 3.9770 0.0000 0.0222 0.0000 1.0000 + 1 2 4 0.0000 0.0019 6.3000 0.0000 0.0000 0.0000 1.0400 + 2 2 4 0.0000 0.0019 6.0000 0.0000 0.0000 0.0000 1.0400 + 3 2 4 0.0000 0.0019 6.0000 0.0000 0.0000 0.0000 1.0400 + 4 2 4 0.0000 0.0019 6.0000 0.0000 0.0000 0.0000 1.0400 + 31 ! Nr of torsions. at1;at2;at3;at4;;V1;V2;V3;p(tor1);p(cot1);n + 1 1 1 1 -0.2500 11.5822 0.1879 -4.7057 -2.2047 0.0000 0.0000 + 1 1 1 2 -0.2500 31.2596 0.1709 -4.6391 -1.9002 0.0000 0.0000 + 2 1 1 2 -0.1770 30.0252 0.4340 -5.0019 -2.0697 0.0000 0.0000 + 1 1 1 3 -0.7098 22.2951 0.0060 -2.5000 -2.1688 0.0000 0.0000 + 2 1 1 3 -0.3568 22.6472 0.6045 -4.0088 -1.0000 0.0000 0.0000 + 3 1 1 3 -0.0528 6.8150 0.7498 -5.0913 -1.0000 0.0000 0.0000 + 1 1 3 1 2.0007 25.5641 -0.0608 -2.6456 -1.1766 0.0000 0.0000 + 1 1 3 2 -1.1953 42.1545 -1.0000 -8.0821 -1.0000 0.0000 0.0000 + 2 1 3 1 -0.9284 34.3952 0.7285 -2.5440 -2.4641 0.0000 0.0000 + 2 1 3 2 -2.5000 79.6980 1.0000 -3.5697 -2.7501 0.0000 0.0000 + 1 1 3 3 -0.0179 5.0603 -0.1894 -2.5000 -2.0399 0.0000 0.0000 + 2 1 3 3 -0.5583 80.0000 1.0000 -4.4000 -3.0000 0.0000 0.0000 + 3 1 3 1 -2.5000 76.0427 -0.0141 -3.7586 -2.9000 0.0000 0.0000 + 3 1 3 2 0.0345 78.9586 -0.6810 -4.1777 -3.0000 0.0000 0.0000 + 3 1 3 3 -2.5000 66.3525 0.3986 -3.0293 -3.0000 0.0000 0.0000 + 1 3 3 1 2.5000 -0.5332 1.0000 -3.5096 -2.9000 0.0000 0.0000 + 1 3 3 2 -2.5000 3.3219 0.7180 -5.2021 -2.9330 0.0000 0.0000 + 2 3 3 2 2.2500 -6.2288 1.0000 -2.6189 -1.0000 0.0000 0.0000 + 1 3 3 3 0.0531 -17.3983 1.0000 -2.5000 -2.1584 0.0000 0.0000 + 2 3 3 3 0.4723 -12.4144 -1.0000 -2.5000 -1.0000 0.0000 0.0000 + 3 3 3 3 -2.5000 -25.0000 1.0000 -2.5000 -1.0000 0.0000 0.0000 + 0 1 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 2 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 2 3 0 0.0000 0.1000 0.0200 -2.5415 0.0000 0.0000 0.0000 + 0 1 1 0 0.0000 50.0000 0.3000 -4.0000 -2.0000 0.0000 0.0000 + 0 3 3 0 0.5511 25.4150 1.1330 -5.1903 -1.0000 0.0000 0.0000 + 0 1 4 0 -0.5473 25.3808 0.9931 -4.3407 -3.0000 0.0000 0.0000 + 0 2 4 0 0.0000 0.1000 0.0200 -2.5415 0.0000 0.0000 0.0000 + 0 3 4 0 2.0000 71.9948 -0.8805 -6.1274 -2.7831 0.0000 0.0000 + 0 4 4 0 2.0000 90.0000 -0.7837 -9.0000 -2.0000 0.0000 0.0000 + 4 1 4 4 -2.0000 90.0000 -0.0279 -7.5866 -0.1000 0.0000 0.0000 + 4 ! Nr of hydrogen bonds. at1;at2;at3;r(hb);p(hb1);p(hb2);p(hb3 + 3 2 3 2.0000 -2.0000 1.5000 19.5000 + 3 2 4 1.9000 -2.0000 1.7976 19.0000 + 4 2 3 1.9000 -2.0000 1.7976 19.0000 + 4 2 4 1.9000 -2.0000 1.7976 19.0000 diff --git a/examples/reax/HNS/in.reaxc.hns b/examples/reax/HNS/in.reaxc.hns new file mode 100644 index 0000000000..775a389eca --- /dev/null +++ b/examples/reax/HNS/in.reaxc.hns @@ -0,0 +1,40 @@ +# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS +# See README for more info + +variable x index 2 +variable y index 2 +variable z index 2 +variable t index 100 + + +units real +atom_style charge +atom_modify sort 100 0.0 # optional +dimension 3 +boundary p p p +box tilt large + +read_data data.hns-equil +replicate $x $y $z bbox + + +pair_style reax/c NULL +pair_coeff * * ffield.reax.hns C H O N + +compute reax all pair reax/c + +neighbor 1.0 bin +neigh_modify every 20 delay 0 check no + +timestep 0.1 + +thermo_style custom step temp pe press evdwl ecoul vol +thermo_modify norm yes +thermo 10 + +velocity all create 300.0 41279 loop geom + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1e-6 reax/c + +run 100 diff --git a/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.1 b/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.1 new file mode 100644 index 0000000000..d418d287b1 --- /dev/null +++ b/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.1 @@ -0,0 +1,115 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS +# See README for more info + +variable x index 2 +variable y index 2 +variable z index 2 +variable t index 100 + + +units real +atom_style charge +atom_modify sort 100 0.0 # optional +dimension 3 +boundary p p p +box tilt large + +read_data data.hns-equil + triclinic box = (0 0 0) to (22.326 11.1412 13.779) with tilt (0 -5.02603 0) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 304 atoms + reading velocities ... + 304 velocities +replicate $x $y $z bbox +replicate 2 $y $z bbox +replicate 2 2 $z bbox +replicate 2 2 2 bbox + triclinic box = (0 0 0) to (44.652 22.2824 27.5579) with tilt (0 -10.0521 0) + 1 by 1 by 1 MPI processor grid + 2432 atoms + Time spent = 0.000789404 secs + + +pair_style reax/c NULL +pair_coeff * * ffield.reax.hns C H O N + +compute reax all pair reax/c + +neighbor 1.0 bin +neigh_modify every 20 delay 0 check no + +timestep 0.1 + +thermo_style custom step temp pe press evdwl ecoul vol +thermo_modify norm yes +thermo 10 + +velocity all create 300.0 41279 loop geom + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1e-6 reax/c + +run 100 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 11 + ghost atom cutoff = 11 + binsize = 5.5, bins = 10 5 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 262.4 | 262.4 | 262.4 Mbytes +Step Temp PotEng Press E_vdwl E_coul Volume + 0 300 -113.27833 437.52103 -111.57687 -1.7014647 27418.867 + 10 299.87174 -113.27778 2033.6337 -111.57645 -1.7013325 27418.867 + 20 300.81718 -113.28046 4817.5889 -111.57931 -1.7011463 27418.867 + 30 301.8622 -113.28323 8303.0039 -111.58237 -1.7008608 27418.867 + 40 302.4646 -113.28493 10519.459 -111.58446 -1.700467 27418.867 + 50 300.79064 -113.27989 10402.291 -111.57987 -1.7000218 27418.867 + 60 296.11534 -113.26599 7929.1348 -111.5664 -1.6995929 27418.867 + 70 291.73354 -113.25289 5071.5459 -111.5537 -1.6991916 27418.867 + 80 292.189 -113.25399 5667.0962 -111.55519 -1.6987993 27418.867 + 90 298.40792 -113.27253 7513.3806 -111.57409 -1.6984403 27418.867 + 100 303.58246 -113.28809 10017.879 -111.58991 -1.698177 27418.867 +Loop time of 59.5461 on 1 procs for 100 steps with 2432 atoms + +Performance: 0.015 ns/day, 1654.060 hours/ns, 1.679 timesteps/s +97.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 49.922 | 49.922 | 49.922 | 0.0 | 83.84 +Neigh | 0.53154 | 0.53154 | 0.53154 | 0.0 | 0.89 +Comm | 0.011399 | 0.011399 | 0.011399 | 0.0 | 0.02 +Output | 0.00064397 | 0.00064397 | 0.00064397 | 0.0 | 0.00 +Modify | 9.0782 | 9.0782 | 9.0782 | 0.0 | 15.25 +Other | | 0.002116 | | | 0.00 + +Nlocal: 2432 ave 2432 max 2432 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 10687 ave 10687 max 10687 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 823977 ave 823977 max 823977 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 823977 +Ave neighs/atom = 338.806 +Neighbor list builds = 5 +Dangerous builds not checked + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:01:00 diff --git a/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.4 b/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.4 new file mode 100644 index 0000000000..aef07f80eb --- /dev/null +++ b/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.4 @@ -0,0 +1,115 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS +# See README for more info + +variable x index 2 +variable y index 2 +variable z index 2 +variable t index 100 + + +units real +atom_style charge +atom_modify sort 100 0.0 # optional +dimension 3 +boundary p p p +box tilt large + +read_data data.hns-equil + triclinic box = (0 0 0) to (22.326 11.1412 13.779) with tilt (0 -5.02603 0) + 2 by 1 by 2 MPI processor grid + reading atoms ... + 304 atoms + reading velocities ... + 304 velocities +replicate $x $y $z bbox +replicate 2 $y $z bbox +replicate 2 2 $z bbox +replicate 2 2 2 bbox + triclinic box = (0 0 0) to (44.652 22.2824 27.5579) with tilt (0 -10.0521 0) + 2 by 1 by 2 MPI processor grid + 2432 atoms + Time spent = 0.000398397 secs + + +pair_style reax/c NULL +pair_coeff * * ffield.reax.hns C H O N + +compute reax all pair reax/c + +neighbor 1.0 bin +neigh_modify every 20 delay 0 check no + +timestep 0.1 + +thermo_style custom step temp pe press evdwl ecoul vol +thermo_modify norm yes +thermo 10 + +velocity all create 300.0 41279 loop geom + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1e-6 reax/c + +run 100 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 11 + ghost atom cutoff = 11 + binsize = 5.5, bins = 10 5 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 126.6 | 126.6 | 126.6 Mbytes +Step Temp PotEng Press E_vdwl E_coul Volume + 0 300 -113.27833 437.52112 -111.57687 -1.7014647 27418.867 + 10 299.87174 -113.27778 2033.632 -111.57645 -1.7013325 27418.867 + 20 300.81719 -113.28046 4817.5761 -111.57931 -1.7011463 27418.867 + 30 301.8622 -113.28323 8302.9767 -111.58237 -1.7008609 27418.867 + 40 302.4646 -113.28493 10519.481 -111.58446 -1.700467 27418.867 + 50 300.79064 -113.27989 10402.312 -111.57987 -1.7000217 27418.867 + 60 296.11534 -113.26599 7929.1393 -111.5664 -1.6995929 27418.867 + 70 291.73354 -113.25289 5071.5368 -111.5537 -1.6991916 27418.867 + 80 292.18901 -113.25399 5667.1118 -111.55519 -1.6987993 27418.867 + 90 298.40793 -113.27253 7513.4029 -111.57409 -1.6984403 27418.867 + 100 303.58247 -113.28809 10017.892 -111.58991 -1.698177 27418.867 +Loop time of 21.3933 on 4 procs for 100 steps with 2432 atoms + +Performance: 0.040 ns/day, 594.257 hours/ns, 4.674 timesteps/s +97.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 | 14.863 | 16.367 | 18.027 | 28.6 | 76.51 +Neigh | 0.23943 | 0.2422 | 0.24658 | 0.6 | 1.13 +Comm | 0.024331 | 1.6845 | 3.189 | 89.2 | 7.87 +Output | 0.00051165 | 0.00056899 | 0.00068665 | 0.0 | 0.00 +Modify | 3.0933 | 3.0969 | 3.0999 | 0.1 | 14.48 +Other | | 0.001784 | | | 0.01 + +Nlocal: 608 ave 608 max 608 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 5738.25 ave 5742 max 5734 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Neighs: 231544 ave 231625 max 231466 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 926176 +Ave neighs/atom = 380.829 +Neighbor list builds = 5 +Dangerous builds not checked + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:21 diff --git a/examples/reax/RDX/log.5Oct16.RDX.g++.1 b/examples/reax/RDX/log.8Mar18.RDX.g++.1 similarity index 51% rename from examples/reax/RDX/log.5Oct16.RDX.g++.1 rename to examples/reax/RDX/log.8Mar18.RDX.g++.1 index 92bb048d43..d0765a97a5 100644 --- a/examples/reax/RDX/log.5Oct16.RDX.g++.1 +++ b/examples/reax/RDX/log.8Mar18.RDX.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for high energy CHON systems # ..... @@ -28,43 +29,53 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 18.1116 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 19 | 19 | 19 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -10197.932 0 -10197.932 38.347492 - 3000 510.85923 -10091.694 0 -9933.3253 1668.5084 -Loop time of 18.9088 on 1 procs for 3000 steps with 105 atoms + 3000 510.63767 -10091.537 0 -9933.2374 1144.545 +Loop time of 21.2931 on 1 procs for 3000 steps with 105 atoms -Performance: 3.427 ns/day, 7.003 hours/ns, 158.657 timesteps/s -99.5% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.043 ns/day, 7.886 hours/ns, 140.891 timesteps/s +97.6% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 17.724 | 17.724 | 17.724 | 0.0 | 93.73 -Neigh | 0.27457 | 0.27457 | 0.27457 | 0.0 | 1.45 -Comm | 0.015814 | 0.015814 | 0.015814 | 0.0 | 0.08 -Output | 1.1921e-05 | 1.1921e-05 | 1.1921e-05 | 0.0 | 0.00 -Modify | 0.89014 | 0.89014 | 0.89014 | 0.0 | 4.71 -Other | | 0.004246 | | | 0.02 +Pair | 19.887 | 19.887 | 19.887 | 0.0 | 93.40 +Neigh | 0.33143 | 0.33143 | 0.33143 | 0.0 | 1.56 +Comm | 0.02079 | 0.02079 | 0.02079 | 0.0 | 0.10 +Output | 2.5272e-05 | 2.5272e-05 | 2.5272e-05 | 0.0 | 0.00 +Modify | 1.0478 | 1.0478 | 1.0478 | 0.0 | 4.92 +Other | | 0.006125 | | | 0.03 Nlocal: 105 ave 105 max 105 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 645 ave 645 max 645 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3061 ave 3061 max 3061 min +Neighs: 3063 ave 3063 max 3063 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3061 -Ave neighs/atom = 29.1524 +Total # of neighbors = 3063 +Ave neighs/atom = 29.1714 Neighbor list builds = 300 Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:19 +Total wall time: 0:00:21 diff --git a/examples/reax/RDX/log.5Oct16.RDX.g++.4 b/examples/reax/RDX/log.8Mar18.RDX.g++.4 similarity index 50% rename from examples/reax/RDX/log.5Oct16.RDX.g++.4 rename to examples/reax/RDX/log.8Mar18.RDX.g++.4 index bcffe8f813..7082d30636 100644 --- a/examples/reax/RDX/log.5Oct16.RDX.g++.4 +++ b/examples/reax/RDX/log.8Mar18.RDX.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for high energy CHON systems # ..... @@ -28,43 +29,53 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 12.2102 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 12.14 | 13.04 | 13.9 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -10197.932 0 -10197.932 38.347492 - 3000 504.05354 -10089.494 0 -9933.2351 868.32505 -Loop time of 9.70759 on 4 procs for 3000 steps with 105 atoms + 3000 509.89257 -10091.36 0 -9933.2916 1406.1215 +Loop time of 10.8858 on 4 procs for 3000 steps with 105 atoms -Performance: 6.675 ns/day, 3.595 hours/ns, 309.037 timesteps/s -99.2% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 5.953 ns/day, 4.032 hours/ns, 275.588 timesteps/s +98.1% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 8.4621 | 8.5307 | 8.6001 | 1.9 | 87.88 -Neigh | 0.12583 | 0.14931 | 0.17341 | 4.5 | 1.54 -Comm | 0.053017 | 0.12311 | 0.19244 | 16.2 | 1.27 -Output | 1.9073e-05 | 2.0802e-05 | 2.408e-05 | 0.0 | 0.00 -Modify | 0.87638 | 0.9012 | 0.92557 | 1.9 | 9.28 -Other | | 0.003213 | | | 0.03 +Pair | 9.3081 | 9.4054 | 9.4994 | 2.6 | 86.40 +Neigh | 0.15541 | 0.18258 | 0.2099 | 4.7 | 1.68 +Comm | 0.070516 | 0.16621 | 0.26541 | 19.7 | 1.53 +Output | 2.2173e-05 | 2.5153e-05 | 3.3855e-05 | 0.0 | 0.00 +Modify | 1.0979 | 1.1272 | 1.1568 | 2.1 | 10.35 +Other | | 0.004379 | | | 0.04 Nlocal: 26.25 ave 46 max 8 min Histogram: 1 0 0 1 0 1 0 0 0 1 Nghost: 399.5 ave 512 max 288 min Histogram: 1 0 0 1 0 0 1 0 0 1 -Neighs: 1010.75 ave 1818 max 420 min +Neighs: 1011.25 ave 1819 max 420 min Histogram: 1 0 1 1 0 0 0 0 0 1 -Total # of neighbors = 4043 -Ave neighs/atom = 38.5048 +Total # of neighbors = 4045 +Ave neighs/atom = 38.5238 Neighbor list builds = 300 Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:10 +Total wall time: 0:00:11 diff --git a/examples/reax/VOH/log.5Oct16.VOH.g++.4 b/examples/reax/VOH/log.5Oct16.VOH.g++.4 deleted file mode 100644 index 8afe957732..0000000000 --- a/examples/reax/VOH/log.5Oct16.VOH.g++.4 +++ /dev/null @@ -1,70 +0,0 @@ -LAMMPS (5 Oct 2016) -# REAX potential for VOH system -# ..... - -units real - -atom_style charge -read_data data.VOH - orthogonal box = (0 0 0) to (25 25 25) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 100 atoms - -pair_style reax/c lmp_control -pair_coeff * * ffield.reax.V_O_C_H H C O V -Reading potential file ffield.reax.V_O_C_H with DATE: 2011-02-18 - -neighbor 2 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1e-6 param.qeq -fix 3 all temp/berendsen 500.0 500.0 100.0 - -timestep 0.25 - -#dump 1 all atom 30 dump.reax.voh - -run 3000 -Neighbor list info ... - 2 neighbor list requests - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12 - ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 12.1769 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 0 -10246.825 0 -10246.825 42.256092 - 3000 518.1493 -10196.234 0 -10043.328 -334.5971 -Loop time of 5.59178 on 4 procs for 3000 steps with 100 atoms - -Performance: 11.588 ns/day, 2.071 hours/ns, 536.502 timesteps/s -99.1% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 4.2807 | 4.3532 | 4.398 | 2.1 | 77.85 -Neigh | 0.12328 | 0.14561 | 0.16815 | 4.2 | 2.60 -Comm | 0.051619 | 0.097282 | 0.1697 | 14.1 | 1.74 -Output | 1.7881e-05 | 1.9372e-05 | 2.3842e-05 | 0.1 | 0.00 -Modify | 0.9701 | 0.99258 | 1.0148 | 1.6 | 17.75 -Other | | 0.003097 | | | 0.06 - -Nlocal: 25 ave 38 max 11 min -Histogram: 1 0 0 0 1 0 1 0 0 1 -Nghost: 368.25 ave 449 max 283 min -Histogram: 1 0 0 0 1 0 1 0 0 1 -Neighs: 1084.5 ave 1793 max 418 min -Histogram: 1 0 0 1 0 0 1 0 0 1 - -Total # of neighbors = 4338 -Ave neighs/atom = 43.38 -Neighbor list builds = 300 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:05 diff --git a/examples/reax/VOH/log.5Oct16.VOH.g++.1 b/examples/reax/VOH/log.8Mar18.VOH.g++.1 similarity index 50% rename from examples/reax/VOH/log.5Oct16.VOH.g++.1 rename to examples/reax/VOH/log.8Mar18.VOH.g++.1 index 9a7a6a59c7..924769e570 100644 --- a/examples/reax/VOH/log.5Oct16.VOH.g++.1 +++ b/examples/reax/VOH/log.8Mar18.VOH.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for VOH system # ..... @@ -28,43 +29,53 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 16.9211 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 17.79 | 17.79 | 17.79 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -10246.825 0 -10246.825 42.256089 - 3000 479.39686 -10186.225 0 -10044.755 -454.82798 -Loop time of 10.4348 on 1 procs for 3000 steps with 100 atoms + 3000 476.73301 -10185.256 0 -10044.572 -694.70737 +Loop time of 11.0577 on 1 procs for 3000 steps with 100 atoms -Performance: 6.210 ns/day, 3.865 hours/ns, 287.499 timesteps/s -99.2% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 5.860 ns/day, 4.095 hours/ns, 271.304 timesteps/s +98.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 | 9.2216 | 9.2216 | 9.2216 | 0.0 | 88.37 -Neigh | 0.2757 | 0.2757 | 0.2757 | 0.0 | 2.64 -Comm | 0.015626 | 0.015626 | 0.015626 | 0.0 | 0.15 -Output | 1.1921e-05 | 1.1921e-05 | 1.1921e-05 | 0.0 | 0.00 -Modify | 0.91782 | 0.91782 | 0.91782 | 0.0 | 8.80 -Other | | 0.004039 | | | 0.04 +Pair | 9.6785 | 9.6785 | 9.6785 | 0.0 | 87.53 +Neigh | 0.32599 | 0.32599 | 0.32599 | 0.0 | 2.95 +Comm | 0.017231 | 0.017231 | 0.017231 | 0.0 | 0.16 +Output | 2.5511e-05 | 2.5511e-05 | 2.5511e-05 | 0.0 | 0.00 +Modify | 1.0311 | 1.0311 | 1.0311 | 0.0 | 9.32 +Other | | 0.004857 | | | 0.04 Nlocal: 100 ave 100 max 100 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 598 ave 598 max 598 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3384 ave 3384 max 3384 min +Neighs: 3390 ave 3390 max 3390 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3384 -Ave neighs/atom = 33.84 +Total # of neighbors = 3390 +Ave neighs/atom = 33.9 Neighbor list builds = 300 Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:10 +Total wall time: 0:00:11 diff --git a/examples/reax/VOH/log.8Mar18.VOH.g++.4 b/examples/reax/VOH/log.8Mar18.VOH.g++.4 new file mode 100644 index 0000000000..0395af6671 --- /dev/null +++ b/examples/reax/VOH/log.8Mar18.VOH.g++.4 @@ -0,0 +1,81 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# REAX potential for VOH system +# ..... + +units real + +atom_style charge +read_data data.VOH + orthogonal box = (0 0 0) to (25 25 25) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 100 atoms + +pair_style reax/c lmp_control +pair_coeff * * ffield.reax.V_O_C_H H C O V +Reading potential file ffield.reax.V_O_C_H with DATE: 2011-02-18 + +neighbor 2 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1e-6 param.qeq +fix 3 all temp/berendsen 500.0 500.0 100.0 + +timestep 0.25 + +#dump 1 all atom 30 dump.reax.voh + +run 3000 +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12 + ghost atom cutoff = 12 + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 11.21 | 12.52 | 13.64 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -10246.825 0 -10246.825 42.256092 + 3000 489.67803 -10188.866 0 -10044.362 -553.7513 +Loop time of 6.49847 on 4 procs for 3000 steps with 100 atoms + +Performance: 9.972 ns/day, 2.407 hours/ns, 461.647 timesteps/s +97.7% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.7412 | 4.8453 | 4.9104 | 2.9 | 74.56 +Neigh | 0.1468 | 0.17834 | 0.20151 | 4.7 | 2.74 +Comm | 0.071841 | 0.14037 | 0.24502 | 17.2 | 2.16 +Output | 2.1219e-05 | 2.408e-05 | 3.1948e-05 | 0.0 | 0.00 +Modify | 1.3072 | 1.3308 | 1.3627 | 1.7 | 20.48 +Other | | 0.003713 | | | 0.06 + +Nlocal: 25 ave 38 max 11 min +Histogram: 1 0 0 0 1 0 1 0 0 1 +Nghost: 369.75 ave 453 max 283 min +Histogram: 1 0 0 0 1 1 0 0 0 1 +Neighs: 1082.25 ave 1788 max 417 min +Histogram: 1 0 1 0 0 0 1 0 0 1 + +Total # of neighbors = 4329 +Ave neighs/atom = 43.29 +Neighbor list builds = 300 +Dangerous builds not checked + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:06 diff --git a/examples/reax/ZnOH2/log.5Oct16.ZnOH2.g++.1 b/examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.1 similarity index 50% rename from examples/reax/ZnOH2/log.5Oct16.ZnOH2.g++.1 rename to examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.1 index 8fcc86dd17..58b1a36719 100644 --- a/examples/reax/ZnOH2/log.5Oct16.ZnOH2.g++.1 +++ b/examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for ZnOH2 system # ..... @@ -28,43 +29,53 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 17.485 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 18.36 | 18.36 | 18.36 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -7900.2668 0 -7900.2668 60.076093 - 3000 522.42599 -7928.9641 0 -7767.0098 -755.28778 -Loop time of 6.38119 on 1 procs for 3000 steps with 105 atoms + 3000 535.58577 -7934.7287 0 -7768.6948 -475.46237 +Loop time of 7.29784 on 1 procs for 3000 steps with 105 atoms -Performance: 10.155 ns/day, 2.363 hours/ns, 470.132 timesteps/s -99.0% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 8.879 ns/day, 2.703 hours/ns, 411.081 timesteps/s +97.3% 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.2711 | 5.2711 | 5.2711 | 0.0 | 82.60 -Neigh | 0.30669 | 0.30669 | 0.30669 | 0.0 | 4.81 -Comm | 0.015599 | 0.015599 | 0.015599 | 0.0 | 0.24 -Output | 1.0967e-05 | 1.0967e-05 | 1.0967e-05 | 0.0 | 0.00 -Modify | 0.78376 | 0.78376 | 0.78376 | 0.0 | 12.28 -Other | | 0.004036 | | | 0.06 +Pair | 5.9988 | 5.9988 | 5.9988 | 0.0 | 82.20 +Neigh | 0.37455 | 0.37455 | 0.37455 | 0.0 | 5.13 +Comm | 0.019186 | 0.019186 | 0.019186 | 0.0 | 0.26 +Output | 2.4557e-05 | 2.4557e-05 | 2.4557e-05 | 0.0 | 0.00 +Modify | 0.89915 | 0.89915 | 0.89915 | 0.0 | 12.32 +Other | | 0.006108 | | | 0.08 Nlocal: 105 ave 105 max 105 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 649 ave 649 max 649 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 3956 ave 3956 max 3956 min +Neighs: 3971 ave 3971 max 3971 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 3956 -Ave neighs/atom = 37.6762 +Total # of neighbors = 3971 +Ave neighs/atom = 37.819 Neighbor list builds = 300 Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:06 +Total wall time: 0:00:07 diff --git a/examples/reax/ZnOH2/log.5Oct16.ZnOH2.g++.4 b/examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.4 similarity index 51% rename from examples/reax/ZnOH2/log.5Oct16.ZnOH2.g++.4 rename to examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.4 index 104d806c33..77c5cbe1b7 100644 --- a/examples/reax/ZnOH2/log.5Oct16.ZnOH2.g++.4 +++ b/examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # REAX potential for ZnOH2 system # ..... @@ -28,40 +29,50 @@ timestep 0.25 run 3000 Neighbor list info ... - 2 neighbor list requests update every 10 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12 ghost atom cutoff = 12 - binsize = 6 -> bins = 5 5 5 -Memory usage per processor = 12.0066 Mbytes + binsize = 6, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 11.28 | 12.77 | 14.21 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -7900.2668 0 -7900.2668 60.076093 - 3000 536.8256 -7935.1437 0 -7768.7255 -479.27959 -Loop time of 3.77632 on 4 procs for 3000 steps with 105 atoms + 3000 538.25796 -7935.6159 0 -7768.7536 -525.47078 +Loop time of 4.48824 on 4 procs for 3000 steps with 105 atoms -Performance: 17.160 ns/day, 1.399 hours/ns, 794.423 timesteps/s -99.0% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 14.438 ns/day, 1.662 hours/ns, 668.414 timesteps/s +97.2% 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.7337 | 2.7808 | 2.8316 | 2.5 | 73.64 -Neigh | 0.13455 | 0.16558 | 0.19493 | 5.3 | 4.38 -Comm | 0.046741 | 0.099375 | 0.14663 | 13.6 | 2.63 -Output | 1.7881e-05 | 2.0027e-05 | 2.408e-05 | 0.1 | 0.00 -Modify | 0.69792 | 0.7275 | 0.75887 | 2.5 | 19.26 -Other | | 0.003084 | | | 0.08 +Pair | 3.1031 | 3.1698 | 3.2378 | 3.3 | 70.62 +Neigh | 0.16642 | 0.20502 | 0.25003 | 6.6 | 4.57 +Comm | 0.074932 | 0.14224 | 0.21025 | 15.6 | 3.17 +Output | 0.00011349 | 0.00011736 | 0.00012231 | 0.0 | 0.00 +Modify | 0.92089 | 0.96736 | 1.0083 | 3.2 | 21.55 +Other | | 0.003731 | | | 0.08 Nlocal: 26.25 ave 45 max 15 min Histogram: 1 0 2 0 0 0 0 0 0 1 Nghost: 399 ave 509 max 295 min Histogram: 1 0 0 0 2 0 0 0 0 1 -Neighs: 1150 ave 2061 max 701 min +Neighs: 1151.5 ave 2066 max 701 min Histogram: 1 2 0 0 0 0 0 0 0 1 -Total # of neighbors = 4600 -Ave neighs/atom = 43.8095 +Total # of neighbors = 4606 +Ave neighs/atom = 43.8667 Neighbor list builds = 300 Dangerous builds not checked diff --git a/examples/reax/ci-reaxFF/CH4.dat b/examples/reax/ci-reaxFF/CH4.dat new file mode 100644 index 0000000000..0e6b95c76d --- /dev/null +++ b/examples/reax/ci-reaxFF/CH4.dat @@ -0,0 +1,649 @@ +LAMMPS data file via write_data, version 23 Oct 2017, timestep = 100000 + +315 atoms +2 atom types + +0.0000000000000000e+00 2.0000000000000000e+01 xlo xhi +0.0000000000000000e+00 2.0000000000000000e+01 ylo yhi +0.0000000000000000e+00 2.0000000000000000e+01 zlo zhi + +Masses + +1 12.011 +2 1.008 + +Atoms # charge + +175 2 0.0000000000000000e+00 5.3453687209469996e+00 5.5862726787962940e+00 4.0849785930715354e+00 1 0 0 +103 2 0.0000000000000000e+00 1.3073645814185417e+00 3.7206017715158937e+00 3.8524713056132751e+00 0 0 -1 +275 2 0.0000000000000000e+00 4.5600071648073301e+00 3.2329990023327824e+00 1.4821360978767673e+00 1 0 0 +271 1 0.0000000000000000e+00 4.5843986967581722e+00 3.9176387402395871e+00 5.8099831361575494e-01 1 0 0 +272 2 0.0000000000000000e+00 5.4182317432033766e+00 3.6898398009502156e+00 1.9965991602287605e+01 1 0 -1 +273 2 0.0000000000000000e+00 3.6051023956156447e+00 3.8873287655431406e+00 1.9973105836472126e+01 1 0 -1 +274 2 0.0000000000000000e+00 4.7919672477150748e+00 4.9286774621912297e+00 9.6215228549394083e-01 1 0 0 +1 1 0.0000000000000000e+00 1.0949422771872639e+01 1.1263564251882920e+00 4.5818433826058058e+00 2 -1 0 +4 2 0.0000000000000000e+00 1.1062078869518452e+01 1.8180370241226866e+00 3.7056441784637810e+00 2 -1 0 +2 2 0.0000000000000000e+00 1.0128614847702552e+01 4.0521961508372545e-01 4.3443871852431215e+00 2 -1 0 +49 2 0.0000000000000000e+00 9.5420250978384704e+00 3.6748811076174732e+00 6.9923624106878846e-01 0 -3 -1 +5 2 0.0000000000000000e+00 1.1895921213727425e+01 5.9644887079656606e-01 4.8275121519683699e+00 2 -1 0 +156 1 0.0000000000000000e+00 1.5350436635040626e+01 3.4944682618464196e+00 1.7820227892005359e+01 0 0 -1 +158 2 0.0000000000000000e+00 1.6234885135644735e+01 4.1073565210303551e+00 1.8057804919138462e+01 0 0 -1 +3 2 0.0000000000000000e+00 1.0638740127309621e+01 1.8737956827951723e+00 5.3939971205730135e+00 2 -1 0 +54 2 0.0000000000000000e+00 1.7052455149295493e+01 6.1908001655126670e+00 3.8576008358326090e+00 -3 2 -3 +159 2 0.0000000000000000e+00 1.4499107646573572e+01 3.7948767230433833e+00 1.8431013979305458e+01 0 0 -1 +174 2 0.0000000000000000e+00 4.2023079102565521e+00 6.1554910639166103e+00 5.3707953997810565e+00 1 0 0 +110 2 0.0000000000000000e+00 5.9228298978270466e+00 7.2826855552171832e+00 1.7589830768160732e+00 1 1 0 +106 1 0.0000000000000000e+00 4.9244475610856240e+00 7.6927459153302671e+00 2.2297553862451567e+00 1 1 0 +107 2 0.0000000000000000e+00 5.2386028337056265e+00 8.3909640111237671e+00 3.0345818656938097e+00 1 1 0 +171 1 0.0000000000000000e+00 4.3023638963145299e+00 5.7330041668123508e+00 4.3363925456334522e+00 1 0 0 +109 2 0.0000000000000000e+00 4.4004149695192085e+00 6.7821801577700214e+00 2.5893710659081899e+00 1 1 0 +108 2 0.0000000000000000e+00 4.2740420890161115e+00 8.3254657494564768e+00 1.6027901460949956e+00 1 1 0 +10 2 0.0000000000000000e+00 1.3257411832459456e+00 6.3889318368318131e+00 3.9757317160978789e+00 -1 -1 1 +119 2 0.0000000000000000e+00 4.3148717130789356e+00 1.0019671440740531e+01 5.4848497820819606e+00 0 2 -1 +173 2 0.0000000000000000e+00 3.9177557626872619e+00 4.6422301624828259e+00 4.2645502823043184e+00 1 0 0 +194 2 0.0000000000000000e+00 7.4225277460058336e+00 1.0727964288898299e+01 1.9970692827027928e+01 -1 1 0 +43 2 0.0000000000000000e+00 5.9784651534992816e+00 5.3197439887593001e+00 7.1371708543065617e+00 4 -1 2 +157 2 0.0000000000000000e+00 1.5630281098459180e+01 2.4573206825593084e+00 1.7942836225216134e+01 0 0 -1 +314 2 0.0000000000000000e+00 1.1566403476316767e+01 6.3954502587012092e+00 4.0672680727332047e+00 -1 1 4 +315 2 0.0000000000000000e+00 9.7793024070031294e+00 6.1182231058810617e+00 4.0434157467946887e+00 -1 1 4 +311 1 0.0000000000000000e+00 1.0740266656657713e+01 5.8829003129841775e+00 4.5248285330926601e+00 -1 1 4 +38 2 0.0000000000000000e+00 1.1310542077155715e+01 7.6861907560603608e+00 2.2477789643954775e+00 3 0 -1 +30 2 0.0000000000000000e+00 1.8394466800629068e+00 1.4015648787525809e+01 2.3327147732453954e+00 0 0 1 +27 2 0.0000000000000000e+00 3.4470472115340434e-01 1.4323294078018423e+01 1.4005089285060470e+00 0 0 1 +26 1 0.0000000000000000e+00 1.1391339740095721e+00 1.3546595729631424e+01 1.5750152498370000e+00 0 0 1 +264 2 0.0000000000000000e+00 4.5759617782254436e+00 1.3310762309539912e+01 1.3694648644547793e+00 0 -2 -1 +22 2 0.0000000000000000e+00 3.5566791269374578e+00 1.3042406572426589e+01 3.3457202536360047e+00 -1 -1 -3 +28 2 0.0000000000000000e+00 1.6751480492594251e+00 1.3195934622963932e+01 6.6391237805201164e-01 0 0 1 +265 2 0.0000000000000000e+00 4.9415867256590840e+00 1.2867983414679109e+01 3.0727806009800673e+00 0 -2 -1 +263 2 0.0000000000000000e+00 5.8817011053762869e+00 1.2119709768149235e+01 1.7793045823911147e+00 0 -2 -1 +262 2 0.0000000000000000e+00 6.1095938668574137e+00 1.3902206467158273e+01 2.1388931002679508e+00 0 -2 -1 +261 1 0.0000000000000000e+00 5.3947224158640239e+00 1.3100746459646325e+01 2.0932355695561347e+00 0 -2 -1 +313 2 0.0000000000000000e+00 1.0979550983153096e+01 4.8560939627722464e+00 4.4254843377639501e+00 -1 1 4 +177 2 0.0000000000000000e+00 1.3347275647031404e+01 1.4644873344365251e+01 4.5810675707070976e+00 -1 -3 2 +176 1 0.0000000000000000e+00 1.2478259350945532e+01 1.4052376743162130e+01 4.9762894864207432e+00 -1 -3 2 +179 2 0.0000000000000000e+00 1.2230938255194133e+01 1.4380976370539551e+01 6.0312061277807976e+00 -1 -3 2 +40 2 0.0000000000000000e+00 1.0431833398647282e+01 9.1411338734452094e+00 2.8471053043472137e+00 3 0 -1 +36 1 0.0000000000000000e+00 1.0503315378230882e+01 8.4066629279942564e+00 2.0127518389019068e+00 3 0 -1 +29 2 0.0000000000000000e+00 7.0673779636710043e-01 1.2591245277054831e+01 1.9359578543553047e+00 0 0 1 +127 2 0.0000000000000000e+00 1.7723696726944713e+01 1.3010375587964814e+01 2.6470618456388411e+00 -1 -3 1 +129 2 0.0000000000000000e+00 1.8188055467648180e+01 1.1406617858229632e+01 3.3902034809353969e+00 -1 -3 1 +130 2 0.0000000000000000e+00 1.6848414717419999e+01 1.1505319162512432e+01 2.0872826283712915e+00 -1 -3 1 +126 1 0.0000000000000000e+00 1.7301073825980328e+01 1.2007765411015372e+01 2.9467714070656283e+00 -1 -3 1 +128 2 0.0000000000000000e+00 1.6574394742225149e+01 1.2189854921616117e+01 3.7269195214454198e+00 -1 -3 1 +33 2 0.0000000000000000e+00 2.6267666961725569e+00 1.6236765067453096e+01 2.7937314778270403e+00 -1 -1 1 +32 2 0.0000000000000000e+00 3.9749621673026572e+00 1.5659072228430459e+01 3.6940538226953370e+00 -1 -1 1 +31 1 0.0000000000000000e+00 3.6938357182189896e+00 1.6249578011374791e+01 2.8148426204327741e+00 -1 -1 1 +35 2 0.0000000000000000e+00 4.1287966368149016e+00 1.7251553996961885e+01 2.9953023328457644e+00 -1 -1 1 +34 2 0.0000000000000000e+00 4.0585629928716473e+00 1.5757695872678383e+01 1.8816582074916917e+00 -1 -1 1 +178 2 0.0000000000000000e+00 1.1527947446441607e+01 1.4164691665589434e+01 4.4186758818086451e+00 -1 -3 2 +168 2 0.0000000000000000e+00 1.3886070288358210e+01 1.9241865108699020e+01 2.7615200182631998e+00 -2 0 -2 +169 2 0.0000000000000000e+00 1.5169311533990372e+01 4.0935588752029484e-01 2.9529412982245971e+00 -2 1 -2 +166 1 0.0000000000000000e+00 1.4996980435922133e+01 1.9376559201388517e+01 2.5874411251380196e+00 -2 0 -2 +167 2 0.0000000000000000e+00 1.5081058857648586e+01 1.9390798420028442e+01 1.4935461670872499e+00 -2 0 -2 +170 2 0.0000000000000000e+00 1.5603353196950756e+01 1.8579645452991596e+01 2.9503695393715708e+00 -2 0 -2 +69 2 0.0000000000000000e+00 1.8758544337699696e+01 8.0682885401828830e-01 4.0879936203640135e+00 -1 2 -1 +66 1 0.0000000000000000e+00 1.8728681423823147e+01 3.2607262639736723e-01 5.0220297297310834e+00 -1 2 -1 +67 2 0.0000000000000000e+00 1.7738442288151585e+01 1.9723891336445096e+01 5.1301857817645793e+00 -1 1 -1 +102 2 0.0000000000000000e+00 1.6397331916684568e+00 4.2735189141803769e+00 5.5547563500055608e+00 0 0 -1 +287 2 0.0000000000000000e+00 9.7063141877155201e-01 1.8893163756804203e+01 1.0592555242850027e+01 -1 1 0 +104 2 0.0000000000000000e+00 9.2783744998535456e-01 2.4688594106605768e+00 5.1061293315307577e+00 0 0 -1 +101 1 0.0000000000000000e+00 1.5626066882835914e+00 3.3406098702183078e+00 4.8829903089668800e+00 0 0 -1 +138 2 0.0000000000000000e+00 1.1233891471855765e+01 4.7118328900038478e+00 8.1024533118790369e+00 -1 1 -1 +140 2 0.0000000000000000e+00 9.4993906793291814e+00 3.9779488927269675e+00 7.9849211909785502e+00 -1 1 -1 +139 2 0.0000000000000000e+00 1.0361323563448300e+01 4.6477207890595578e+00 6.5026295609496181e+00 -1 1 -1 +136 1 0.0000000000000000e+00 1.0234850421539512e+01 4.7515227402999765e+00 7.6031473650818020e+00 -1 1 -1 +137 2 0.0000000000000000e+00 9.8305233632577984e+00 5.7732717311844901e+00 7.7781284405940667e+00 -1 1 -1 +52 2 0.0000000000000000e+00 1.6264080737765717e+01 4.9271529286515880e+00 4.7997361189522447e+00 -3 2 -3 +8 2 0.0000000000000000e+00 8.8130781237956290e-01 6.7320609519861199e+00 5.5863715061393258e+00 -1 -1 1 +9 2 0.0000000000000000e+00 1.9701039861983109e+01 7.0998400413085081e+00 4.3169555689171943e+00 -2 -1 1 +6 1 0.0000000000000000e+00 4.6472757720188973e-01 6.3682968920462963e+00 4.6602881128892779e+00 -1 -1 1 +116 1 0.0000000000000000e+00 3.8547184855603880e+00 9.1159275782702700e+00 5.9646899406628924e+00 0 2 -1 +120 2 0.0000000000000000e+00 4.6203595927842969e+00 8.3064000427694538e+00 5.9044796738179972e+00 0 2 -1 +172 2 0.0000000000000000e+00 3.7643081737622248e+00 6.5842662904559290e+00 3.7526658961498804e+00 1 0 0 +105 2 0.0000000000000000e+00 2.5500747223710460e+00 2.8573575074147608e+00 4.9266451015001875e+00 0 0 -1 +117 2 0.0000000000000000e+00 3.0485420676485941e+00 8.7803026905746204e+00 5.3103555898437262e+00 0 2 -1 +269 2 0.0000000000000000e+00 9.5660888231682439e-01 7.3717872199595860e+00 8.8853506691579458e+00 1 0 -2 +268 2 0.0000000000000000e+00 3.6788466359860728e-01 8.9391338256263246e+00 9.5130736478938047e+00 1 0 -2 +42 2 0.0000000000000000e+00 6.4616448519089236e+00 6.3639894529073384e+00 5.6893667627725417e+00 4 -1 2 +41 1 0.0000000000000000e+00 6.7987726108979576e+00 5.6654154373514620e+00 6.4965068188827750e+00 4 -1 2 +45 2 0.0000000000000000e+00 7.1983037970390455e+00 4.8866456555398345e+00 5.8524716325749511e+00 4 -1 2 +239 2 0.0000000000000000e+00 4.1744612934093217e+00 4.6767924061042647e+00 8.1816836209132884e+00 -3 0 -1 +238 2 0.0000000000000000e+00 2.5063120427706775e+00 5.4704685101464658e+00 8.3322865585278265e+00 -3 0 -1 +236 1 0.0000000000000000e+00 3.1791520644670266e+00 4.6701385409838991e+00 8.5904151317914330e+00 -3 0 -1 +237 2 0.0000000000000000e+00 2.6783998531481017e+00 3.6900000593640203e+00 8.3286072561945090e+00 -3 0 -1 +240 2 0.0000000000000000e+00 3.2307552749017643e+00 4.7836685041543001e+00 9.7286291300497822e+00 -3 0 -1 +44 2 0.0000000000000000e+00 7.7613800497790253e+00 6.0835041450783356e+00 6.9672137397351817e+00 4 -1 2 +217 2 0.0000000000000000e+00 6.0391059227521060e+00 8.6397110720464436e+00 8.6182846561994229e+00 1 1 1 +220 2 0.0000000000000000e+00 5.4998781143363971e+00 9.3186253126624781e+00 7.1416751280722925e+00 1 1 1 +216 1 0.0000000000000000e+00 6.4555438260032059e+00 9.0115377099063085e+00 7.6598196907829150e+00 1 1 1 +218 2 0.0000000000000000e+00 6.9768512222373076e+00 8.1763100294420497e+00 7.1716575285358815e+00 1 1 1 +235 2 0.0000000000000000e+00 1.3568865842854780e+01 8.9821400965715252e+00 6.1428226913244908e+00 1 0 1 +231 1 0.0000000000000000e+00 1.2801675604064105e+01 9.4085793662665349e+00 6.8770035356892230e+00 1 0 1 +232 2 0.0000000000000000e+00 1.2473538938945829e+01 8.4940148217050968e+00 7.5384076156507192e+00 1 0 1 +234 2 0.0000000000000000e+00 1.1910516297511959e+01 9.7723550362398122e+00 6.3027721375720267e+00 1 0 1 +233 2 0.0000000000000000e+00 1.3259194205011816e+01 1.0269594331903395e+01 7.3597853009384586e+00 1 0 1 +312 2 0.0000000000000000e+00 1.0706341922683754e+01 6.0799956118488261e+00 5.6265345461298697e+00 -1 1 4 +7 2 0.0000000000000000e+00 1.9986039095597040e+01 5.4245711137798969e+00 4.8022962770143582e+00 -2 -1 1 +53 2 0.0000000000000000e+00 1.7589164605527355e+01 5.9866181972270782e+00 5.5077800075692886e+00 -3 2 -3 +51 1 0.0000000000000000e+00 1.7208754223741021e+01 5.4098961246487924e+00 4.5853991258056421e+00 -3 2 -3 +55 2 0.0000000000000000e+00 1.7817722950189776e+01 4.6494939458595113e+00 4.1111771485064574e+00 -3 2 -3 +255 2 0.0000000000000000e+00 1.7436848272923868e+01 8.5946503202644671e+00 6.6280074583192645e+00 0 -1 1 +252 2 0.0000000000000000e+00 1.7415280419154954e+01 9.7627185499346805e+00 7.8893385298576888e+00 0 -1 1 +254 2 0.0000000000000000e+00 1.6744136777312374e+01 8.1839767990475885e+00 8.2020232422763666e+00 0 -1 1 +251 1 0.0000000000000000e+00 1.6820300636902360e+01 8.9619688421895134e+00 7.4376621549392263e+00 0 -1 1 +253 2 0.0000000000000000e+00 1.5858437132215775e+01 9.4859350359688186e+00 7.2477886775086606e+00 0 -1 1 +229 2 0.0000000000000000e+00 1.5428798058645260e+01 1.1123768673829543e+01 1.0931445913865913e+01 -2 0 -2 +304 2 0.0000000000000000e+00 1.6037380564551316e+00 3.4989161504021475e+00 9.6585020949954448e+00 0 -1 3 +118 2 0.0000000000000000e+00 3.4891599835251261e+00 9.3834445474090380e+00 7.0079795687446973e+00 0 2 -1 +19 2 0.0000000000000000e+00 3.6149300444498267e+00 1.0245155347232496e+01 8.3968272048764447e+00 -1 -1 -1 +16 1 0.0000000000000000e+00 4.0390453513729163e+00 1.0369013955447025e+01 9.3883431698435675e+00 -1 -1 -1 +24 2 0.0000000000000000e+00 4.4820830670049947e+00 1.3844990064198186e+01 4.7312097042504524e+00 -1 -1 -3 +17 2 0.0000000000000000e+00 3.4729824020032112e+00 1.1115118897824294e+01 9.9586605395694843e+00 -1 -1 -1 +25 2 0.0000000000000000e+00 3.2273804169089688e+00 1.2438314155064660e+01 5.0839995886867930e+00 -1 -1 -3 +23 2 0.0000000000000000e+00 2.7228248747482393e+00 1.4082829837146207e+01 4.6898076175012084e+00 -1 -1 -3 +21 1 0.0000000000000000e+00 3.5063748800680430e+00 1.3332834323871053e+01 4.4416853100663252e+00 -1 -1 -3 +18 2 0.0000000000000000e+00 5.0656581347322795e+00 1.0658942601282646e+01 9.3701424245492415e+00 -1 -1 -1 +219 2 0.0000000000000000e+00 7.2154987711014407e+00 9.7989122036949947e+00 7.9111233571859580e+00 1 1 1 +73 2 0.0000000000000000e+00 9.2319564267200978e+00 1.4549063604646022e+01 7.3597837169824567e+00 0 -2 -2 +180 2 0.0000000000000000e+00 1.2848403217726370e+01 1.2988043864240506e+01 5.0281280463352926e+00 -1 -3 2 +75 2 0.0000000000000000e+00 1.0636938701409910e+01 1.4863153610572125e+01 8.6036757256308061e+00 0 -2 -2 +71 1 0.0000000000000000e+00 9.5821477697935382e+00 1.4578909999450094e+01 8.4461476949756342e+00 0 -2 -2 +74 2 0.0000000000000000e+00 9.4502425784536079e+00 1.3528390587907406e+01 8.7818251345854179e+00 0 -2 -2 +72 2 0.0000000000000000e+00 8.8640965998408063e+00 1.5138567920252855e+01 9.0454757473036356e+00 0 -2 -2 +260 2 0.0000000000000000e+00 1.6632929271555874e+01 1.5821953469446921e+01 6.9130860245906849e+00 -2 -2 1 +256 1 0.0000000000000000e+00 1.7085713586812151e+01 1.5251779026489970e+01 6.0885855634961485e+00 -2 -2 1 +258 2 0.0000000000000000e+00 1.6347857415135714e+01 1.5214313486494301e+01 5.3391949822345373e+00 -2 -2 1 +85 2 0.0000000000000000e+00 1.9167326328035077e+01 1.1769864106961979e+01 9.1516388629661574e+00 -4 -1 0 +187 2 0.0000000000000000e+00 1.5748986771186981e+00 1.6797100804635754e+01 5.9604917536174726e+00 0 -4 2 +190 2 0.0000000000000000e+00 2.5409115049466313e-01 1.6219512507876022e+01 4.8416231070614346e+00 0 -4 2 +186 1 0.0000000000000000e+00 9.4296912064607286e-01 1.5953412822834983e+01 5.6008590784002319e+00 0 -4 2 +188 2 0.0000000000000000e+00 4.3127694608414890e-01 1.5342835924650281e+01 6.3921128351767580e+00 0 -4 2 +189 2 0.0000000000000000e+00 1.6277194566655657e+00 1.5297848066687743e+01 5.1339626785021730e+00 0 -4 2 +133 2 0.0000000000000000e+00 1.1636454179819162e+00 1.5350149245152526e+01 1.2830627042378454e+01 0 1 -1 +94 2 0.0000000000000000e+00 1.0592738861583992e+01 1.7732750083134125e+01 5.7772046341668206e+00 0 1 0 +142 2 0.0000000000000000e+00 1.6256539716856604e+01 1.9749098610677549e+01 6.5318377065570568e+00 0 1 -1 +92 2 0.0000000000000000e+00 9.7847287411240025e+00 1.8843682004651004e+01 7.0372273748777996e+00 0 1 0 +93 2 0.0000000000000000e+00 1.0433757074223312e+01 1.7092717093537495e+01 7.4602881391142226e+00 0 1 0 +91 1 0.0000000000000000e+00 1.0022458193794600e+01 1.7813733343021976e+01 6.7342441922081004e+00 0 1 0 +95 2 0.0000000000000000e+00 9.0707847285700840e+00 1.7437511967602120e+01 6.4019094089154178e+00 0 1 0 +145 2 0.0000000000000000e+00 1.6647960553474118e+01 1.8764970443696402e+01 7.8738305743942627e+00 0 1 -1 +141 1 0.0000000000000000e+00 1.5864831758896935e+01 1.8890474038479184e+01 7.0828183623273162e+00 0 1 -1 +144 2 0.0000000000000000e+00 1.4889881493525582e+01 1.9039981127760086e+01 7.6012774831328347e+00 0 1 -1 +143 2 0.0000000000000000e+00 1.5854773748227343e+01 1.7952725095472243e+01 6.5270943374070436e+00 0 1 -1 +70 2 0.0000000000000000e+00 1.9627676113051439e+01 1.9684011340627997e+01 5.2597192469574079e+00 -1 1 -1 +259 2 0.0000000000000000e+00 1.7974236951843885e+01 1.5714248731538277e+01 5.6878741749044410e+00 -2 -2 1 +257 2 0.0000000000000000e+00 1.7325187482971099e+01 1.4206794248402689e+01 6.3767852211946252e+00 -2 -2 1 +68 2 0.0000000000000000e+00 1.8638856832648528e+01 1.0955709147544939e+00 5.8261037015770762e+00 -1 2 -1 +288 2 0.0000000000000000e+00 1.6474892912428287e+00 5.8017352205231243e-01 1.0571181228055464e+01 -1 2 0 +286 1 0.0000000000000000e+00 7.1123670895625890e-01 1.9918430824567974e+01 1.0748501687703365e+01 -1 1 0 +278 2 0.0000000000000000e+00 7.2798646730446706e+00 3.5748463446657421e+00 1.1085765932361522e+01 0 1 -1 +276 1 0.0000000000000000e+00 6.8050173847218414e+00 2.5671954190725876e+00 1.1293726004982144e+01 0 1 -1 +280 2 0.0000000000000000e+00 7.4751028807192572e+00 1.6695384065643097e+00 1.1353309143135288e+01 0 1 -1 +277 2 0.0000000000000000e+00 6.2736611689350203e+00 2.6543244261291745e+00 1.2223424751567363e+01 0 1 -1 +279 2 0.0000000000000000e+00 6.0072634330889851e+00 2.3258985121139601e+00 1.0568779981294913e+01 0 1 -1 +245 2 0.0000000000000000e+00 1.3028732147408457e+01 3.4469223880747153e+00 9.1049871261920892e+00 1 0 1 +243 2 0.0000000000000000e+00 1.2940287992920529e+01 1.9097563512303122e+00 9.7741927700801963e+00 1 0 1 +241 1 0.0000000000000000e+00 1.3451473764465414e+01 2.8700780207674410e+00 9.9633262493283627e+00 1 0 1 +242 2 0.0000000000000000e+00 1.3217049225368687e+01 3.3091833836728597e+00 1.0949602685733648e+01 1 0 1 +303 2 0.0000000000000000e+00 3.1191252644927953e-01 2.1730731336728124e+00 9.4004825906570364e+00 0 -1 3 +290 2 0.0000000000000000e+00 3.8428943531377824e-02 1.5102741619080107e-01 9.8543166681516485e+00 -1 2 0 +244 2 0.0000000000000000e+00 1.4487115690064725e+01 2.7256270784347056e+00 1.0100669572350684e+01 1 0 1 +298 2 0.0000000000000000e+00 1.9000581501316233e+01 4.1040138821960905e+00 1.6084524934226057e+01 -1 0 1 +300 2 0.0000000000000000e+00 1.7157023619010925e+01 3.6875057652326904e+00 1.6208541223111283e+01 -1 0 1 +80 2 0.0000000000000000e+00 1.6272492854913420e+01 1.7694925955900604e+00 1.2727722934632629e+01 1 1 -3 +77 2 0.0000000000000000e+00 1.7852675042833575e+01 2.5266033114166899e+00 1.3283594102758114e+01 1 1 -3 +76 1 0.0000000000000000e+00 1.7208586947862813e+01 2.2635586203636375e+00 1.2399267294872022e+01 1 1 -3 +79 2 0.0000000000000000e+00 1.6991485512895991e+01 3.1849043138940130e+00 1.1866260725568040e+01 1 1 -3 +78 2 0.0000000000000000e+00 1.7757533425041085e+01 1.5285735084063925e+00 1.1801445510350518e+01 1 1 -3 +302 2 0.0000000000000000e+00 7.9367314300036185e-03 3.9838389784018657e+00 9.6192987176552940e+00 0 -1 3 +267 2 0.0000000000000000e+00 2.0674360144183956e+00 8.5776641218665119e+00 9.5989584659764660e+00 1 0 -2 +266 1 0.0000000000000000e+00 1.1980024596167258e+00 8.4519906495339292e+00 8.9736168618903154e+00 1 0 -2 +270 2 0.0000000000000000e+00 1.3227836782791205e+00 8.9961791811375615e+00 7.9710737357599886e+00 1 0 -2 +310 2 0.0000000000000000e+00 2.6761759786773864e+00 7.2731318704994576e+00 1.4271185330896181e+01 0 2 1 +306 1 0.0000000000000000e+00 3.1757086622046411e+00 7.8843945690420600e+00 1.3518191121353995e+01 0 2 1 +307 2 0.0000000000000000e+00 2.5125476286007351e+00 8.5260395735708023e+00 1.2893579375366818e+01 0 2 1 +309 2 0.0000000000000000e+00 3.6418042222481697e+00 7.1035520395111682e+00 1.2921536051921271e+01 0 2 1 +90 2 0.0000000000000000e+00 9.5356314893739267e+00 8.5484613153173648e+00 1.4087331998822318e+01 -1 0 1 +87 2 0.0000000000000000e+00 9.0072657330587962e+00 8.7013079613201914e+00 1.2460178869272461e+01 -1 0 1 +249 2 0.0000000000000000e+00 1.2384853075083686e+01 8.2720107522952144e+00 1.1640005780365739e+01 -2 0 3 +250 2 0.0000000000000000e+00 1.3909740696186651e+01 7.4603244147289312e+00 1.1975483113188702e+01 -2 0 3 +248 2 0.0000000000000000e+00 1.2400053655447357e+01 6.4776398085266766e+00 1.2100324568950599e+01 -2 0 3 +246 1 0.0000000000000000e+00 1.2887603983327981e+01 7.3209748924566629e+00 1.1512833319280736e+01 -2 0 3 +113 2 0.0000000000000000e+00 9.9889703288316483e+00 1.0026728229965448e+01 1.0252244584414809e+01 -2 -1 -1 +247 2 0.0000000000000000e+00 1.3043870390204599e+01 7.0415391203083502e+00 1.0449977038959226e+01 -2 0 3 +99 2 0.0000000000000000e+00 1.5746220384960795e+01 1.1936677235977722e+01 1.4074436522758678e+01 0 2 0 +305 2 0.0000000000000000e+00 9.1563297729149229e-01 3.2993069524922425e+00 8.0869430381809835e+00 0 -1 3 +301 1 0.0000000000000000e+00 6.7956495025930175e-01 3.1992098996695879e+00 9.1919706580507619e+00 0 -1 3 +228 2 0.0000000000000000e+00 1.5093349765760419e+01 9.6511109733770581e+00 1.1973364584432678e+01 -2 0 -2 +227 2 0.0000000000000000e+00 1.4324285051482850e+01 9.7140330079488049e+00 1.0450998206170086e+01 -2 0 -2 +296 1 0.0000000000000000e+00 1.7933631624918764e+01 4.4386107687201317e+00 1.5892195587304197e+01 -1 0 1 +297 2 0.0000000000000000e+00 1.7845215303357907e+01 5.3436697357782714e+00 1.6511114150158441e+01 -1 0 1 +299 2 0.0000000000000000e+00 1.7826173326549991e+01 4.7011258972400993e+00 1.4787316916066922e+01 -1 0 1 +209 2 0.0000000000000000e+00 1.7792658424620985e+01 1.1207169715678084e+01 1.2954587162051725e+01 -1 1 0 +230 2 0.0000000000000000e+00 1.6093397436975664e+01 9.4804078821206748e+00 1.0490556990732042e+01 -2 0 -2 +226 1 0.0000000000000000e+00 1.5236708780494391e+01 1.0032915852901922e+01 1.0966906777896606e+01 -2 0 -2 +20 2 0.0000000000000000e+00 4.0069853025640922e+00 9.4133540775905260e+00 1.0030142151196140e+01 -1 -1 -1 +83 2 0.0000000000000000e+00 8.5001478950175646e-01 1.2505784824816704e+01 8.9356458679388897e+00 -3 -1 0 +207 2 0.0000000000000000e+00 1.9584585172210637e+01 1.0872014510559106e+01 1.3003817968550416e+01 -1 1 0 +308 2 0.0000000000000000e+00 3.9565192455190252e+00 8.5905916272941170e+00 1.3940034039983082e+01 0 2 1 +162 2 0.0000000000000000e+00 5.2019171030512315e+00 1.4911387230883586e+01 1.3650281511126655e+01 -1 -2 -1 +163 2 0.0000000000000000e+00 6.7099817143883502e+00 1.5836023810809861e+01 1.4296045952123722e+01 -1 -2 -1 +164 2 0.0000000000000000e+00 5.4733950469561625e+00 1.5157983477774172e+01 1.5385431599293677e+01 -1 -2 -1 +89 2 0.0000000000000000e+00 9.6683499722095281e+00 1.0157530252137828e+01 1.3277220275170791e+01 -1 0 1 +115 2 0.0000000000000000e+00 1.0963981787078335e+01 1.0238015582003770e+01 1.1669685302879071e+01 -2 -1 -1 +149 2 0.0000000000000000e+00 9.5679791323898584e+00 1.6236225524313834e+01 1.3021460590584111e+01 0 1 0 +88 2 0.0000000000000000e+00 8.0855212361023305e+00 9.4909831421040867e+00 1.3862452839100875e+01 -1 0 1 +86 1 0.0000000000000000e+00 9.0817775661206213e+00 9.2260799410188525e+00 1.3405039740437894e+01 -1 0 1 +97 2 0.0000000000000000e+00 1.4850474205646920e+01 1.1876609624108585e+01 1.5586695318932938e+01 0 2 0 +96 1 0.0000000000000000e+00 1.5567837216991146e+01 1.2542666834877332e+01 1.4993031756891178e+01 0 2 0 +112 2 0.0000000000000000e+00 1.1819398510444287e+01 1.0253415508963975e+01 1.0083860977217819e+01 -2 -1 -1 +111 1 0.0000000000000000e+00 1.0870319514076888e+01 1.0507411987324220e+01 1.0653795550220012e+01 -2 -1 -1 +114 2 0.0000000000000000e+00 1.0670798134660316e+01 1.1563526859154297e+01 1.0636507006156691e+01 -2 -1 -1 +147 2 0.0000000000000000e+00 1.0030091785964611e+01 1.5559753907228664e+01 1.1359170333580273e+01 0 1 0 +148 2 0.0000000000000000e+00 1.0363562855853885e+01 1.4630007513271455e+01 1.2834538364352577e+01 0 1 0 +146 1 0.0000000000000000e+00 1.0264614950421247e+01 1.5658819492955097e+01 1.2375158233053595e+01 0 1 0 +84 2 0.0000000000000000e+00 6.4855204126238608e-01 1.0879429838952138e+01 9.5960369391299079e+00 -3 -1 0 +98 2 0.0000000000000000e+00 1.5195765671511536e+01 1.3530581931459675e+01 1.4941942918621361e+01 0 2 0 +100 2 0.0000000000000000e+00 1.6509499312978438e+01 1.2521039286941511e+01 1.5514933162064928e+01 0 2 0 +210 2 0.0000000000000000e+00 1.9010953245303803e+01 1.2588036023419427e+01 1.2501350536398311e+01 -1 1 0 +206 1 0.0000000000000000e+00 1.8796128416664754e+01 1.1695878369608607e+01 1.3126446226197251e+01 -1 1 0 +124 2 0.0000000000000000e+00 1.8851055609611649e+01 1.6189394720348130e+01 1.3569746871645213e+01 1 4 1 +208 2 0.0000000000000000e+00 1.8955895999478880e+01 1.2068713530832138e+01 1.4196704599549090e+01 -1 1 0 +121 1 0.0000000000000000e+00 1.8218527032071076e+01 1.6265890183971752e+01 1.4429165502215785e+01 1 4 1 +82 2 0.0000000000000000e+00 2.7105040024561955e-01 1.1133233366906710e+01 7.8747052899409287e+00 -3 -1 0 +81 1 0.0000000000000000e+00 2.1191140377158973e-01 1.1587897923751379e+01 8.8521512268483846e+00 -3 -1 0 +123 2 0.0000000000000000e+00 1.7220664898760585e+01 1.5756652784697179e+01 1.4389309681514048e+01 1 4 1 +131 1 0.0000000000000000e+00 6.5965522012960465e-01 1.4471789471229318e+01 1.2368752811895776e+01 0 1 -1 +135 2 0.0000000000000000e+00 8.9510772505030556e-01 1.3511535394863298e+01 1.2825862461561147e+01 0 1 -1 +134 2 0.0000000000000000e+00 8.8118384091726409e-01 1.4460319056017974e+01 1.1245977596612807e+01 0 1 -1 +132 2 0.0000000000000000e+00 1.9597638703087135e+01 1.4522359508092684e+01 1.2548339306930385e+01 -1 1 -1 +289 2 0.0000000000000000e+00 3.0702167454193430e-01 1.3225192402863420e-01 1.1764312683149074e+01 -1 2 0 +185 2 0.0000000000000000e+00 5.4358122902511816e+00 1.9933621431653336e+01 9.5166115370656286e+00 -2 -1 -2 +161 1 0.0000000000000000e+00 5.6192878126483636e+00 1.5599658591819033e+01 1.4423138766205485e+01 -1 -2 -1 +165 2 0.0000000000000000e+00 5.1118417294714780e+00 1.6538073826005178e+01 1.4438012515220892e+01 -1 -2 -1 +57 2 0.0000000000000000e+00 9.5068361984935361e+00 6.0816680751827601e-01 1.0961727024613694e+01 2 0 -1 +181 1 0.0000000000000000e+00 6.0135031088454580e+00 1.9345895608831871e+01 1.0334973170151127e+01 -2 -1 -2 +183 2 0.0000000000000000e+00 5.7779933995792963e+00 1.9995130130085741e+01 1.1232169397470580e+01 -2 -1 -2 +182 2 0.0000000000000000e+00 7.1138820563582126e+00 1.9412321646338448e+01 1.0364762073596417e+01 -2 -1 -2 +59 2 0.0000000000000000e+00 9.6220942075791438e+00 1.9896931995375738e+01 1.2662882300112981e+01 2 -1 -1 +184 2 0.0000000000000000e+00 5.4952901130338221e+00 1.8316039126568185e+01 1.0485729735596614e+01 -2 -1 -2 +282 2 0.0000000000000000e+00 8.4373648127082781e+00 1.6656216910232182e+01 1.6009990046113856e+01 1 1 1 +285 2 0.0000000000000000e+00 7.8179595848169461e+00 1.8122309920561523e+01 1.6904563064513709e+01 1 1 1 +150 2 0.0000000000000000e+00 1.1311687885575235e+01 1.6064075980207793e+01 1.2471941174377442e+01 0 1 0 +60 2 0.0000000000000000e+00 9.5863882520853760e+00 1.7375408363551990e+00 1.2299265419469311e+01 2 0 -1 +58 2 0.0000000000000000e+00 1.1051086876583636e+01 8.9207793137264080e-01 1.1889099779371454e+01 2 0 -1 +56 1 0.0000000000000000e+00 9.9392583568421262e+00 7.8546641770808190e-01 1.1968639452421639e+01 2 0 -1 +125 2 0.0000000000000000e+00 1.8000989139567306e+01 1.7296274771938553e+01 1.4721873479302953e+01 1 4 1 +13 2 0.0000000000000000e+00 1.6189702206251684e+00 1.8646775005931687e+01 1.6455886224379253e+01 1 -1 0 +12 2 0.0000000000000000e+00 1.1501703316680048e+00 1.9792649682474195e+01 1.7748820124444485e+01 1 -1 0 +14 2 0.0000000000000000e+00 2.1564808293124225e+00 4.3839306846282616e-01 1.6391944590352452e+01 1 0 0 +11 1 0.0000000000000000e+00 1.3567089412249069e+00 1.9710496905494129e+01 1.6721737946985549e+01 1 -1 0 +15 2 0.0000000000000000e+00 4.7891531490894912e-01 6.3148495004174521e-02 1.6181544018682885e+01 1 0 0 +47 2 0.0000000000000000e+00 9.0271969090193611e+00 3.1737009243899692e+00 2.3269000801034752e+00 0 -3 -1 +46 1 0.0000000000000000e+00 9.5184417744724037e+00 3.9851211232763224e+00 1.6994391857151094e+00 0 -3 -1 +50 2 0.0000000000000000e+00 1.0521777102475017e+01 4.2963334757299370e+00 2.0231028177358961e+00 0 -3 -1 +154 2 0.0000000000000000e+00 6.7952243452702090e+00 2.1448352724116551e+00 1.7505872922635302e+01 2 1 1 +151 1 0.0000000000000000e+00 6.5299092353945323e+00 1.5255788348748884e+00 1.8352222992803402e+01 2 1 1 +155 2 0.0000000000000000e+00 6.8168852775865663e+00 4.5058226223199377e-01 1.8364576028692024e+01 2 1 1 +160 2 0.0000000000000000e+00 1.5118330965778773e+01 3.4868149689777925e+00 1.6732304135943068e+01 0 0 -1 +205 2 0.0000000000000000e+00 1.6858430561726600e+01 8.5488396593281202e-01 1.9603680187289093e+01 2 0 0 +201 1 0.0000000000000000e+00 1.7375575203241429e+01 1.9832656234949663e+01 1.9562671733831710e+01 2 -1 0 +202 2 0.0000000000000000e+00 1.7440820395599918e+01 1.9520412413914453e+01 1.8463824353280238e+01 2 -1 0 +203 2 0.0000000000000000e+00 1.8342598029999994e+01 1.9834220314801851e+01 9.1699650061570992e-02 2 -1 1 +212 2 0.0000000000000000e+00 3.4498460378284856e-01 6.5284870792135914e+00 1.9626356025996795e+01 2 1 2 +211 1 0.0000000000000000e+00 2.9760010819141552e-01 6.5805924237908853e+00 1.8538349501024726e+01 2 1 2 +214 2 0.0000000000000000e+00 1.9234179785084343e+01 6.8966842448219552e+00 1.8273971391654737e+01 1 1 2 +213 2 0.0000000000000000e+00 9.4479007636097256e-01 7.4215365008163721e+00 1.8240048511571356e+01 2 1 2 +48 2 0.0000000000000000e+00 8.8441549305166873e+00 4.8761263256453917e+00 1.7706538770564662e+00 0 -3 -1 +195 2 0.0000000000000000e+00 6.9403200134848211e+00 9.1425852563475107e+00 6.6435233215693668e-01 -1 1 1 +191 1 0.0000000000000000e+00 6.6029444860411504e+00 1.0171538460224131e+01 5.1908221452796721e-01 -1 1 1 +192 2 0.0000000000000000e+00 5.7450744569807259e+00 1.0073475983370438e+01 1.9912648711557651e+01 -1 1 0 +37 2 0.0000000000000000e+00 1.0756862700009142e+01 9.0191291384125432e+00 1.1207218204430782e+00 3 0 -1 +215 2 0.0000000000000000e+00 7.0706237271719330e-01 5.5977448904573031e+00 1.8113877770586388e+01 2 1 2 +200 2 0.0000000000000000e+00 3.1425905026608048e+00 1.3045684099342436e+01 1.8670316410810546e+01 0 -1 -4 +198 2 0.0000000000000000e+00 4.8269930294372001e+00 1.3265277164734856e+01 1.9313338739393551e+01 0 -1 -4 +196 1 0.0000000000000000e+00 4.1166540055393064e+00 1.2519371126466199e+01 1.8892023987056067e+01 0 -1 -4 +197 2 0.0000000000000000e+00 4.3847180122220992e+00 1.2247157678351046e+01 1.7863588629818835e+01 0 -1 -4 +199 2 0.0000000000000000e+00 3.9576966994170535e+00 1.1733721906350182e+01 1.9610655971980137e+01 0 -1 -4 +292 2 0.0000000000000000e+00 1.9675674895103640e+01 1.5782524522398687e+01 1.8989726588163212e+01 4 -2 0 +193 2 0.0000000000000000e+00 6.2963773493789983e+00 1.0734056217963904e+01 1.4319368243099124e+00 -1 1 1 +222 2 0.0000000000000000e+00 8.2786319875478185e+00 1.3201479047951652e+01 1.5063627784041008e+01 0 1 1 +225 2 0.0000000000000000e+00 7.6696975922089994e+00 1.3473587294729841e+01 1.6692477007837454e+01 0 1 1 +221 1 0.0000000000000000e+00 8.2156420833644770e+00 1.3923639108283185e+01 1.5872709731411131e+01 0 1 1 +223 2 0.0000000000000000e+00 7.5855122693612120e+00 1.4805895263916909e+01 1.5564322441046409e+01 0 1 1 +224 2 0.0000000000000000e+00 9.1681978684693526e+00 1.4299634810045507e+01 1.6322644585423220e+01 0 1 1 +39 2 0.0000000000000000e+00 9.4987968719730311e+00 7.9843140093930769e+00 1.8490393092806989e+00 3 0 -1 +122 2 0.0000000000000000e+00 1.8747855543184116e+01 1.5879898544955875e+01 1.5328750515364884e+01 1 4 1 +291 1 0.0000000000000000e+00 5.4323749174873204e-01 1.5566898025370776e+01 1.8346807023484160e+01 5 -2 0 +295 2 0.0000000000000000e+00 1.0119263588126288e+00 1.4667126471619692e+01 1.8743522226781391e+01 5 -2 0 +294 2 0.0000000000000000e+00 2.3088129680602246e-01 1.5392388874703020e+01 1.7332378376616454e+01 5 -2 0 +153 2 0.0000000000000000e+00 6.8084620975946715e+00 2.0178595375593598e+00 1.9368986187214727e+01 2 1 1 +152 2 0.0000000000000000e+00 5.4178570675723199e+00 1.4199223510245125e+00 1.8286638215954397e+01 2 1 1 +283 2 0.0000000000000000e+00 7.1698835047579834e+00 1.7681183484294465e+01 1.5302545021292589e+01 1 1 1 +281 1 0.0000000000000000e+00 8.1201530527127641e+00 1.7697240581541340e+01 1.5889308627763242e+01 1 1 1 +284 2 0.0000000000000000e+00 8.8735032632712620e+00 1.8459143077051447e+01 1.5496269781359343e+01 1 1 1 +64 2 0.0000000000000000e+00 1.0332560918701450e+01 1.7663868104577137e+01 1.7752043347153101e+01 1 -1 0 +62 2 0.0000000000000000e+00 1.1758727085987680e+01 1.7282382125472257e+01 1.6757265243608312e+01 1 -1 0 +63 2 0.0000000000000000e+00 1.1992971983701571e+01 1.8315723598997362e+01 1.8277128129317244e+01 1 -1 0 +61 1 0.0000000000000000e+00 1.1327027880825648e+01 1.8020737941213067e+01 1.7445093051465371e+01 1 -1 0 +65 2 0.0000000000000000e+00 1.1108190265562886e+01 1.8917784385400331e+01 1.6783158230629301e+01 1 -1 0 +204 2 0.0000000000000000e+00 1.6696133259270116e+01 1.9227937926937326e+01 1.7665040573529225e-01 2 -1 1 +293 2 0.0000000000000000e+00 1.2428903058180443e+00 1.6400936594837656e+01 1.8352614597098761e+01 5 -2 0 + +Velocities + +175 -2.1358259165668528e-02 -1.7339816448672610e-02 1.5664884602676614e-02 +103 2.2136788480931514e-02 1.3791380676591778e-03 4.7417555587605495e-04 +275 -3.3748111352892682e-03 1.3555049481064976e-02 2.0558202857799288e-02 +271 -9.0906247974434379e-03 4.6578038455500200e-03 -2.9540387935631002e-03 +272 -6.7353608908594107e-03 2.3429221164303016e-02 -1.4200737876190785e-03 +273 -3.5229765885167810e-02 8.1635368195765116e-03 -1.7498854107057496e-02 +274 -1.4391781427507411e-02 5.1152450057436686e-04 -2.1474316344183491e-02 +1 2.8549987730996343e-03 -1.1424149405044636e-02 3.0879757962828185e-03 +4 1.8337961364842888e-02 -1.0717011238057654e-02 -1.2072948689306140e-02 +2 2.4068947326967557e-02 7.9729634135825723e-03 -3.7414367470498386e-03 +49 4.2352380796642469e-02 1.7250840658900445e-03 -1.7390908725286074e-02 +5 -2.1858286327952281e-02 -2.7004466166471463e-02 4.3300200889093247e-02 +156 2.0304778777162778e-03 -7.3690927924099456e-03 -1.2854611268247522e-02 +158 3.3620112485522831e-02 5.9712961025144727e-03 -8.4513320887959070e-03 +3 1.9009921019910420e-02 2.6552525811790847e-02 -2.4210305660493921e-02 +54 2.3499491820316867e-02 -2.5156080161610053e-02 -5.6197443957496900e-04 +159 1.5968265724446044e-02 1.4068639935722630e-02 -2.1376578453391779e-02 +174 -1.2352728632106782e-02 1.4073475655077088e-02 -1.5401830818404121e-03 +110 -2.1720758963629454e-02 1.4410328279069552e-02 1.6986490382604204e-03 +106 2.9190560792996373e-03 -4.2698273511984543e-03 2.8794767741132312e-03 +107 7.4213992872985760e-03 1.0720876414390337e-02 -4.4295266125072789e-03 +171 4.1905700447088558e-03 -1.0956830302507676e-02 8.8843838338574458e-03 +109 1.8219836284214277e-02 -6.5022585198554802e-03 -6.5284694534882507e-03 +108 -1.8056028840372405e-02 -9.7629002674145069e-03 -1.7506955814616133e-02 +10 -1.3542918530869563e-02 -1.8397508666858148e-02 -6.8792538288556977e-03 +119 1.1157637573771799e-02 -9.7459459128669060e-03 6.5562617050118378e-03 +173 -6.8136384037513851e-03 -8.9860770729900449e-03 -3.6013120849660317e-02 +194 -5.5924267279926600e-04 -2.0456144423234412e-02 -5.6086903612861993e-04 +43 -5.2082189441791646e-02 -4.1648216586539551e-03 -3.2952235352484031e-02 +157 2.1328646257018816e-04 -2.4264990795243219e-02 1.5606707228739086e-04 +314 -3.2625907310169042e-03 -3.1770878160917843e-03 1.4016477509629069e-02 +315 -4.6483008990176974e-04 -3.0415793935735305e-03 2.1918053923409828e-02 +311 -4.3754084027487787e-03 -1.8285667342924309e-02 3.1236274438242581e-03 +38 -5.0133523842299368e-02 5.5086789563759710e-03 -1.7388017194988552e-02 +30 1.2694204474430587e-02 1.4483577243556018e-02 2.6679433087676140e-02 +27 -2.7042829736552237e-02 1.2854217956889017e-02 -2.5132368298341479e-02 +26 5.8254907338675952e-03 5.9696513226330742e-03 -4.4472222458134345e-03 +264 -1.8834530860499805e-02 2.4602293266228648e-02 -9.5550198704043438e-03 +22 2.4156558631746733e-03 1.8146866370697994e-02 -8.5395882158565486e-03 +28 5.5919912088353965e-02 -2.2856212665838191e-02 -2.3109504853120744e-02 +265 -7.3778672548913517e-03 -5.3047723640206653e-03 1.8158224548633247e-02 +263 1.3784851386139642e-02 1.5665509018552577e-03 -1.6737932724647096e-02 +262 -6.5098283262917918e-04 9.9409024712909383e-03 -1.0212431287587337e-02 +261 7.9673984078064831e-04 8.4400774340785169e-03 -3.0016899980537782e-03 +313 1.2399529450119821e-02 -3.8148314942350159e-02 3.1153989217802023e-02 +177 1.8753394156560649e-02 -1.7179251685926988e-02 -2.5189617943691353e-03 +176 -5.1448779033722450e-03 2.9753446552111744e-04 2.2546478257789550e-03 +179 2.4813732525894534e-02 5.0890248880097726e-03 3.5289780507974731e-02 +40 7.9377852950771599e-03 -4.9484347984021975e-03 -3.9845347703874240e-02 +36 -4.1376033628292026e-03 -7.8792503425939384e-03 7.6626232377946541e-03 +29 -8.7246954139641886e-03 -1.5552220764669844e-03 2.1080552891556224e-02 +127 1.4224664834616065e-03 -9.7600449613677951e-03 4.6757240160358440e-02 +129 -4.8302084907600358e-03 -3.5909554531948405e-02 -1.0808233628427503e-02 +130 8.4743706485674580e-05 1.1062617494156411e-02 -5.1762272585835566e-02 +126 -3.6948389643019571e-03 2.0119573567856357e-03 4.8279968661582816e-03 +128 9.1998093143287791e-04 -1.7592502656793921e-02 -1.2108726587265398e-02 +33 3.0228121634122803e-02 2.3372853048996882e-02 1.8123915036330412e-02 +32 -2.2339524503340782e-02 -2.7694609076392589e-02 7.6397440200546042e-03 +31 -2.9683213524512755e-03 5.6598119573995356e-04 4.4738888026158424e-03 +35 -2.3264489494799475e-02 -1.9071640664055704e-02 9.0690264016809723e-03 +34 -8.9126153133044974e-03 8.9753524163035218e-03 -5.5696004238540778e-03 +178 -4.0628806164661732e-02 -1.5910538984815255e-02 -2.1635512103215650e-02 +168 2.9487755356416238e-03 -2.3588865201902582e-03 -3.7222383743421988e-03 +169 1.9901270039060313e-02 1.4953414769741744e-02 3.6886613057867938e-02 +166 6.5184706543446099e-03 1.2937989631760692e-03 4.7918289652051985e-03 +167 -1.1005457870082605e-02 5.6214978339947158e-03 -5.2637535620151145e-03 +170 -1.3169538365702539e-02 6.6645904890090188e-03 -1.4438144632164451e-02 +69 -1.4723565997107800e-02 1.3961543539499806e-02 -7.9298975227918330e-04 +66 -6.1124829111106310e-04 8.4959685929401722e-03 4.0060920153148745e-03 +67 2.6347881612626991e-02 2.6758622280420235e-02 -3.9219523752856778e-03 +102 4.9037991333892022e-04 1.1367344719689809e-02 -1.0351734553865392e-02 +287 6.1693115595047344e-03 -3.4071087047206697e-02 -4.8770139462771828e-03 +104 -2.9001977263992814e-04 -4.8018835703595712e-02 8.2522964236864272e-03 +101 -2.1595952290281179e-03 -9.1220727133040792e-03 -2.2663185790479804e-03 +138 1.0825951870682032e-02 4.4674631047191972e-02 8.0582031557165403e-03 +140 1.3937407259050127e-02 7.7652599552271353e-03 -4.7764076107801418e-04 +139 9.4298133531529136e-03 7.2815123954151472e-03 -3.0607866689871342e-02 +136 -3.6795359771187924e-03 5.6332301741221962e-03 1.0092915611641797e-02 +137 6.8504972548676310e-03 2.5611569064970630e-02 6.6776699788254866e-03 +52 1.1359154476080498e-02 -2.5327638792936584e-02 1.2178875548498414e-02 +8 -3.9626848476712754e-03 -3.6737428507923439e-03 2.4141165005800491e-02 +9 -2.3798105545486791e-02 -1.2814988723424309e-02 -6.9456796429333383e-03 +6 1.1310367257926861e-03 -8.4072097312314232e-03 -4.3052877724726506e-03 +116 -1.1470593840488378e-03 9.6625519642938053e-04 -2.5347503526291057e-03 +120 -1.0187489349735014e-02 2.3097208609209035e-02 -7.2482634874155407e-03 +172 -1.0722167890992916e-02 3.7560534285731081e-03 -1.9982485617725192e-02 +105 3.9459324193027258e-02 1.2939762635455671e-02 1.8967257917585127e-02 +117 -1.8912076849099263e-02 -3.0134235929470628e-02 2.2701381321846612e-02 +269 6.5054575935996270e-03 5.4764171851472886e-02 -2.2714830957583351e-02 +268 3.3553631076333232e-02 -1.5258192277360165e-02 1.9456059994011519e-03 +42 1.2793261579624944e-02 -5.9809744261386313e-03 1.5933981143433779e-02 +41 -5.5312691609400930e-03 -4.6806920829193972e-03 8.0255188051923648e-03 +45 1.3355622802626336e-02 3.1569239150258583e-03 -1.6147717177448735e-02 +239 -5.3574479481910416e-02 -1.2280670834038398e-02 4.2709448520367056e-03 +238 -9.5470183269182173e-03 -4.8728851124632813e-03 -1.0190410936220636e-02 +236 -7.2676551671173482e-03 -8.7096078439981694e-03 -1.7170787707938152e-03 +237 -2.7706663797771310e-02 -1.3553159590112687e-02 -6.0758403284216500e-03 +240 4.9459946600579480e-03 2.2366418999792519e-02 7.6085503920892816e-03 +44 -5.0565289159678530e-03 -4.2509806593751618e-03 -2.7205700928180730e-02 +217 2.5949104664788069e-02 -1.2598465982642764e-02 -1.7383641503112498e-02 +220 4.1616575526147231e-03 -1.2996555820820929e-02 6.5696020000117527e-03 +216 -3.0676967695959100e-03 -6.0717454033072952e-04 3.6286805985173026e-03 +218 2.1242153342005948e-02 2.1875134517590909e-02 -1.0538261006934925e-02 +235 8.0959031953158466e-03 -1.0239484277770857e-02 -6.4310847172104673e-03 +231 1.2671621140115370e-03 6.3158614142774204e-03 -1.1085856162065821e-02 +232 -1.1758303815420494e-02 -2.7970762408061674e-02 -2.0464901443964810e-02 +234 4.6316736568213356e-02 1.0421900141170738e-02 3.2083877994475388e-02 +233 4.3204113773632974e-03 3.1994052895021191e-02 -1.3585879010803632e-03 +312 -3.4432066558224131e-02 -1.8650143991113137e-02 -2.3207068005894060e-02 +7 -2.8923340164120532e-02 -3.2020568040503775e-03 1.0582756584885671e-03 +53 1.0482425718249033e-02 3.2543453880761498e-02 1.3407256525175167e-02 +51 -2.7647533777472727e-03 2.5548523596445015e-03 -3.8314800349883082e-03 +55 3.3236802337012268e-02 9.4347261581858646e-03 -1.7422887431011909e-03 +255 -3.8033887588970541e-03 1.5111053012280886e-02 6.1052184577517522e-03 +252 -2.2754194534112870e-02 -1.3048319305039045e-02 -5.2292603306668423e-03 +254 -2.3497794598520992e-02 2.6646578737585529e-03 -4.2271418589709614e-03 +251 -4.3025525889904314e-03 5.6881565171769161e-04 -1.6880757141276750e-03 +253 -3.0955550384966484e-02 1.9507221364510122e-02 -9.7722906629039378e-03 +229 -3.9033434902631739e-02 2.0629761875466807e-02 -1.1837798161945664e-02 +304 2.9437800824210422e-02 2.6107957321874993e-02 -1.6740135853592950e-02 +118 2.3011807217750289e-02 2.7785502926397788e-02 -1.2177708311130060e-02 +19 3.7339656731536726e-02 2.2905715093559511e-02 -2.1700916079518000e-02 +16 7.0236094397028133e-03 -4.7383694592073736e-03 -5.1553916909904320e-03 +24 9.6932353019205351e-03 6.1358953105182254e-03 4.6415863037600029e-02 +17 -4.3820185712162563e-03 -9.8539460400027638e-03 -1.7360296615953144e-03 +25 3.2526720252576691e-02 3.7712602791264613e-03 -1.0507908334884056e-02 +23 3.7984577421594778e-02 1.6458894333801568e-02 -3.4365092676544765e-02 +21 8.3897738188323939e-03 -8.2257359573751005e-05 2.4827917834231764e-03 +18 -8.4001368273699598e-03 -2.0249415910385479e-02 1.0265868933456320e-02 +219 8.1052928489206734e-03 3.1857479056790455e-02 1.7855298331918613e-02 +73 9.6086293199115942e-03 5.7379739571472048e-03 -6.1128839904473617e-03 +180 -1.0249434695619914e-02 8.9777650823829377e-04 1.5754517200971634e-02 +75 -5.9117254300791386e-03 -1.0846836955636218e-02 7.2249891741041402e-03 +71 -8.4274919361257555e-03 -5.6170551299936252e-04 8.4929611421829185e-03 +74 1.6513496610706405e-02 9.2757315958908841e-03 -1.7018639949664096e-02 +72 2.0754316208721587e-02 2.7822065358966058e-02 -2.9444419262681480e-02 +260 -8.3501193603264367e-03 1.6163580735183383e-02 -9.2852005238208048e-03 +256 -5.4551977968227911e-03 2.2196477445326776e-03 -5.9199537282658117e-03 +258 -1.1626739619121070e-03 -7.8869903991642287e-02 1.3570382952778974e-02 +85 -1.6872016478677147e-02 -2.6617697307707890e-03 -6.4825174008867840e-03 +187 -1.1684109415569568e-02 2.1424923928213692e-02 3.2549082369782045e-02 +190 -1.2017846236407883e-02 -1.9182599320503455e-02 -5.0763103475547780e-03 +186 2.3345014273100954e-03 4.1707834750349133e-03 -1.4635431051747208e-03 +188 4.1864138776088102e-03 -3.3264788688655449e-02 -2.0197126863968001e-02 +189 -1.1565498783955550e-02 -2.7279811981350429e-02 -3.5810705532770576e-02 +133 5.6029251820623963e-03 -3.9145362590881534e-02 1.2056515945646178e-02 +94 1.5768247894093864e-02 6.8488542794511408e-03 -2.3736898332246549e-02 +142 1.5134004579094303e-02 2.9546393998533614e-02 -1.6934432187161196e-02 +92 1.7848579811078357e-02 1.9892663253460357e-04 9.4148163144030846e-03 +93 -1.2874559632345208e-02 2.2414899564782591e-02 4.3878393977867948e-02 +91 -9.1547760126469459e-03 -1.8538206289866343e-04 1.2677942555750700e-03 +95 2.3402804208381141e-02 1.2225320000275659e-02 2.4779098078086793e-03 +145 3.4765766696524300e-02 -1.2125666660258534e-02 -2.6196983827827845e-02 +141 9.3336622046283433e-03 6.2939830247705315e-03 -5.7676554543720851e-03 +144 -8.4693059766912330e-03 2.4860358738424258e-02 -7.2295338322114289e-03 +143 -1.7132493555106140e-02 3.6314580278784876e-02 9.0762052685957710e-03 +70 1.9977136460416507e-02 -9.9022520381668246e-04 -2.3137025791127266e-02 +259 -1.1172404123583597e-02 3.4244120962861092e-02 1.2962914422362384e-02 +257 1.6652722868238202e-02 6.1721154763261380e-03 2.7671207031943673e-02 +68 3.4586405717963682e-02 -2.7561113557514134e-02 -3.0565775841035541e-03 +288 2.5388375590062254e-02 2.8328224057453402e-02 -6.1787792959406493e-03 +286 2.3234037142831746e-03 -1.1226641675492451e-02 -2.1447915323990329e-03 +278 -1.9130448204099371e-02 4.8646072119671785e-02 -4.6706303426248010e-04 +276 3.7675302248714750e-03 -1.8689616237481028e-03 -9.1013593099764679e-03 +280 2.8707353049327927e-03 -8.4248249009652443e-03 3.5952826174438714e-02 +277 3.2107813910012287e-02 -2.3841378083620014e-02 -1.7742665932139697e-02 +279 9.0075175593076658e-03 -2.1258929548520499e-02 -2.1715169832854410e-03 +245 -5.0313229197691219e-02 3.3271966416683146e-02 1.2401615646457365e-02 +243 1.7267349858530970e-02 -3.6841453968021798e-02 3.7272920912929823e-02 +241 -4.9492257397324079e-03 -2.0998948108103288e-03 -1.0255608548678305e-02 +242 1.8259402736451026e-02 -3.0535677432313342e-02 1.0708085285966671e-02 +303 4.1969706829175620e-02 7.8468499855047467e-03 -3.6323782136604317e-03 +290 -1.0435129132176806e-02 -1.6376585872179182e-04 1.1066181875303569e-02 +244 -1.3283924693128354e-02 4.3332389180037567e-02 -3.0638798879290961e-02 +298 1.3490442992857867e-02 1.2297070941691995e-02 6.5389583697673262e-03 +300 2.3558560003651592e-02 -1.1926874750582550e-02 2.9393046004653815e-02 +80 -1.7900468470216136e-02 -4.2049416785584243e-02 -1.4101121912901604e-02 +77 -7.9268839529721465e-03 -1.7469411591776320e-02 5.8217056624264409e-03 +76 -2.4210568116434434e-03 3.3868658073454459e-03 4.5354029503036847e-03 +79 -1.6096578801573367e-02 3.1222092847788999e-02 1.5568812352192860e-02 +78 -2.0263128757657980e-02 1.1508920664235657e-02 1.6321517830321527e-02 +302 1.2314047539147572e-02 4.1171994964629727e-02 3.6447122033045461e-02 +267 -3.6147913817369546e-03 -4.1085473263630039e-02 -4.5410871713561764e-02 +266 3.7445261937045383e-03 -5.4725372325958518e-03 -4.8775210666052263e-04 +270 -4.6974660506398862e-02 2.9267623042361132e-02 1.7103952781988223e-02 +310 3.4854336679752802e-02 -3.1366922981492892e-02 1.6189830916228855e-02 +306 -3.6016124719612749e-03 -5.2557143604632364e-03 5.3325463143380567e-04 +307 3.1190836365127834e-03 -5.5522575999682562e-03 -2.4671958196097098e-02 +309 -2.1875607768396785e-02 -1.0035223603883895e-02 -1.8454932967526018e-02 +90 1.1117284478472534e-02 6.3697104510559589e-03 3.3586475941409432e-03 +87 3.1005528436641321e-02 -2.8210274987486361e-02 5.8682566854995292e-03 +249 2.2431164831851593e-03 -2.6137696924876438e-03 3.2304453135570059e-02 +250 -6.4676008093018482e-03 1.5878557794467268e-03 1.2589745128345168e-03 +248 2.1928734973793870e-02 6.6077423871927301e-04 -1.2068308513715100e-02 +246 4.0159104432842263e-03 -8.7580577658897358e-04 -1.9737824019506840e-03 +113 -4.9120548246117841e-03 2.7752860272721360e-03 -1.1690794230788762e-02 +247 3.0901829095757751e-02 3.2359456874850187e-02 3.4429537716439501e-02 +99 7.5908355428783332e-03 3.1304139773755728e-02 3.8184796416412911e-02 +305 1.8543810772398722e-02 -7.9041606296751613e-03 -1.5297737138143325e-02 +301 -2.4810295775261733e-04 -6.7011870106087603e-03 -1.1559116639630334e-02 +228 -1.7121787855787697e-02 -2.3249966000486698e-02 -3.3429000525125867e-02 +227 -2.1267884320958164e-02 9.1843773148680696e-03 -2.8843934482704794e-02 +296 2.3313146555151844e-03 -1.7270636372176851e-03 1.6527383996871998e-02 +297 1.7997947494105805e-02 2.8485402946313340e-02 -1.0974452816118896e-02 +299 -2.0319723308253261e-02 -1.4460895194683248e-02 1.8557062125962007e-02 +209 -2.7768492127216059e-02 -2.2698692264974452e-02 -1.7149835276886495e-02 +230 3.1263631601567900e-02 4.5953566007161896e-03 5.1600647444336616e-02 +226 -4.1405149320012423e-03 4.5893146988926058e-03 3.8154988525427916e-03 +20 3.6760423988065630e-02 -7.9027964434010070e-03 2.4370630138556604e-02 +83 3.8603753018902364e-03 7.6421678484970453e-03 -9.7283197820310866e-03 +207 -6.6489555174408617e-03 3.8170230305340927e-03 -6.9541555635654218e-03 +308 1.4283678411508453e-02 1.2229248663592006e-02 1.2473340979326836e-02 +162 1.0487003046928456e-02 -4.7468274308368500e-03 2.0824582077700162e-03 +163 -1.5005016357924034e-02 1.2852657923415811e-02 7.6219162377470394e-03 +164 1.4085108040369495e-02 -9.3523335404762462e-03 3.0898533848526585e-02 +89 5.9190480573058724e-03 -4.8603896888878310e-03 -9.2083105539892268e-03 +115 9.7014371108413138e-03 3.8013007617140764e-02 1.7073702560803313e-02 +149 -5.8474296202959460e-03 -2.3915794277479089e-02 7.9882935654177409e-03 +88 -1.5056693199160690e-03 -1.7664163133312653e-02 -9.8223687394585132e-03 +86 5.0885364342055060e-03 -2.9313288175883342e-03 4.7396304951062233e-03 +97 1.9137488547409001e-02 2.4588568627398728e-02 1.3414096981888399e-02 +96 -7.0742593681085396e-03 8.7006536719423620e-03 4.4871413036072167e-03 +112 3.0010043492168679e-03 3.0591952539986175e-03 2.2360610040808526e-02 +111 3.7577762900863529e-03 2.5003648740067326e-03 -1.4057511717916422e-02 +114 2.7312666867727656e-02 -1.1920280167032768e-02 -1.7387119902433697e-02 +147 -3.8879127400143210e-02 -1.7129311418715289e-02 2.4192109203791806e-03 +148 -1.3452206791610929e-03 -3.0270671619149125e-03 -2.3939713343365844e-02 +146 7.1079301753818012e-03 3.3476940057194007e-03 -2.4484883724454590e-03 +84 -1.0523255908106955e-02 1.1358838355792252e-03 -5.5886053747902136e-03 +98 -6.9627315060902294e-03 -9.2985254061051272e-03 2.9339980709438520e-02 +100 -3.0996423229817881e-03 3.3684875182858442e-03 1.4282565233278265e-02 +210 3.0840842329267405e-02 -1.7128902730992421e-02 3.6407535299811929e-04 +206 9.9568292545452065e-03 3.3132081221284777e-03 6.2104306206865073e-04 +124 4.8424064813425002e-03 1.1730751333850020e-02 4.8105704672306189e-03 +208 -2.2728187973369181e-02 6.0115329019679434e-02 -1.2019704685936080e-02 +121 -1.5080667765130217e-04 9.2998434596676047e-03 1.8317727137131629e-04 +82 1.6597974663202342e-02 -5.8997746253312191e-03 -5.4336043325623118e-03 +81 -6.8466496450103574e-03 -7.3051990306069294e-03 -7.5653557218425729e-03 +123 -1.5186327838636339e-02 1.8665094281866492e-02 -1.2754929005457135e-02 +131 -2.6794272631216827e-03 -3.2207145440640477e-03 8.0766912989446056e-03 +135 -1.5166457718118911e-02 3.6178362024540042e-03 3.3428732380209311e-02 +134 3.4615784319165445e-03 2.4206167062317270e-02 -5.4085787239608381e-04 +132 -8.8306846443526391e-03 2.6284158395506211e-03 -2.5178975920791598e-03 +289 3.2127443073114013e-02 -1.7355239524971016e-02 4.1587535403978831e-02 +185 1.4099955606904845e-02 8.5790310513041441e-03 -3.0242058322479837e-02 +161 -1.2922467751511341e-02 2.3900357195990153e-03 1.4302825676046681e-03 +165 -2.1284226244503445e-02 5.4803829750110066e-03 -1.0696351403461363e-02 +57 -2.9042456936939399e-02 6.2743816133522274e-03 1.1686513268136620e-02 +181 6.4816730951958697e-03 8.5302277278989976e-03 -6.5668897682387541e-03 +183 -9.3016918743662486e-03 -1.2353994891164007e-03 -9.5528626512009114e-03 +182 -1.6184453236803169e-02 -6.0874566154141751e-03 3.4238846885758852e-02 +59 -1.4735179682311909e-02 5.8493180656782407e-03 1.0016512990042959e-02 +184 -2.9532770683098120e-02 2.5942031703098743e-02 1.8941514145600781e-02 +282 -2.4093260160961895e-02 3.3591909133166183e-02 -2.2600766499410660e-02 +285 1.5329038522555370e-02 -3.7123709092502240e-02 -1.7252102044418349e-02 +150 -1.2023262083111609e-02 1.2775249595154581e-02 -4.0634835881225795e-02 +60 1.7557898280791597e-02 2.4376215248477891e-02 1.1758538347152450e-02 +58 1.8144992057570124e-02 -7.5702843234868675e-03 -1.4923629995870002e-02 +56 -1.1761403211490219e-03 6.8857907039573561e-03 -2.2603540119110633e-03 +125 1.2205974441697203e-02 -1.7279014634579159e-02 4.2530645966695202e-02 +13 1.9137045428760239e-03 8.9875474076530435e-03 -9.6156675976183999e-04 +12 -1.7227019616086664e-02 -1.2548485558094287e-03 -1.7605743351882273e-02 +14 -6.5469806850148235e-03 1.5603731904149499e-02 1.9379213254520373e-02 +11 3.4021735315404480e-03 -1.4732629503099006e-02 -1.8387894210675133e-03 +15 6.6797251992020462e-04 3.0865198998886196e-02 2.3887987113380628e-03 +47 -9.5048600550045759e-03 -2.3464057334906328e-02 1.3777084230302550e-03 +46 3.2157418933077791e-03 3.9493646679240263e-03 1.3047481022319314e-02 +50 1.1645344227592129e-03 3.0412923736907820e-03 4.2707643455573305e-02 +154 3.4168366668140590e-02 -1.9036765580252253e-02 1.8131624915819520e-02 +151 -3.3072286903951718e-03 8.7648710297958570e-04 -6.5782652677157721e-03 +155 -6.1680563882888602e-03 -1.0497735177604228e-02 1.9450379799624801e-02 +160 -1.7349898337797182e-03 2.1359907178594897e-02 -2.2464567848825313e-02 +205 -1.5623743135857664e-02 -1.7620923464120024e-02 1.3038901242119249e-02 +201 3.4115069176382067e-03 3.1389139355505473e-03 1.4288076224225500e-02 +202 2.4222754326574891e-02 -1.3489556718246623e-02 2.1163756388853386e-02 +203 -1.1595039481442856e-03 -7.4102913106757014e-04 4.5462822628578540e-03 +212 7.3935859008519662e-03 4.8226922649550735e-03 1.8869381529652517e-02 +211 -4.3960341535625161e-03 -6.0861360973294535e-05 -1.4952919349255620e-03 +214 4.3428210510383222e-03 -5.7906399923477537e-03 3.0942525621017947e-02 +213 1.5215939043494105e-02 -2.7902659887590931e-02 1.5816722811721345e-02 +48 -3.5077816781627887e-03 -3.2333124504558386e-02 -2.0454521813995038e-02 +195 -7.4689898202003622e-03 -3.4393994553156719e-02 9.5646117774240130e-03 +191 7.7439226193524377e-03 -1.6749714198483069e-03 -6.6151343864332502e-06 +192 2.4463864491014845e-02 2.2614803437104033e-02 3.3890821685470522e-02 +37 -8.9568894218416961e-03 1.2792918581938388e-03 -1.5471001358254778e-02 +215 1.9578246142917431e-04 3.0762244364193399e-02 -1.6498990559322031e-02 +200 2.2542526933536308e-02 4.2199096064752445e-02 2.2077373881583519e-02 +198 3.5778288054771831e-03 5.0482035751054396e-04 -6.5716247893242291e-03 +196 -9.8419792498795743e-03 2.7419078925250018e-03 -2.6038068222809106e-03 +197 -1.5089375859679781e-02 2.2046092191812455e-02 -2.7059575962908280e-02 +199 -2.1714227606551884e-02 6.4731847272046870e-03 -2.7308574260460093e-02 +292 5.2200250189205532e-03 -3.5583672736965023e-03 -3.8669973002571710e-02 +193 -2.7565971198342479e-02 3.3670688856475457e-02 -8.5250838280123281e-03 +222 3.7605718668314823e-02 -2.4346327009190323e-02 1.7456599656632692e-02 +225 -9.9510518223425142e-03 -8.7062067334547737e-03 -1.9168305625664527e-02 +221 -1.8762639766564139e-03 -2.2718227061860651e-03 -4.2361460647047490e-03 +223 6.3985564466709950e-03 4.0948349441623205e-02 -2.0062674414098799e-03 +224 -9.4998995917320757e-03 -4.1774686424660918e-03 -2.5519386468900784e-02 +39 8.4596247618711779e-03 1.0616795164921563e-02 2.3657858473230930e-02 +122 -1.4968464286657639e-02 -1.0871390032076086e-02 -1.8167519395605201e-02 +291 1.3883634609707012e-03 4.0790427863098642e-03 -2.1697404837098112e-03 +295 2.0264615856771768e-02 5.3307640197827492e-03 -1.3852908987409937e-02 +294 7.1603455916708150e-03 5.0285897843204619e-03 7.3241166431432738e-04 +153 3.0076738303306889e-02 2.4298999351012863e-02 -1.2607136131303244e-02 +152 4.8236632932468042e-03 5.2217071221687963e-02 5.9123414621807264e-04 +283 -5.8039400887170125e-03 5.0704532701600765e-03 -1.4112642821927698e-02 +281 -9.8195026779512255e-03 2.6380048577205636e-03 9.0530689248384671e-03 +284 3.3924632555861422e-03 4.2116137610867660e-03 2.2206053317133925e-03 +64 6.9103638123651535e-03 1.4460305245499955e-02 -1.1337529684205920e-02 +62 -1.5026973746144957e-02 -1.4229612681198415e-02 2.9749430352746346e-02 +63 1.3416625499363493e-02 -1.3681352134066847e-02 -2.7443459813718808e-02 +61 3.3033012398804508e-03 1.6556859169437473e-03 -7.8539529573181839e-03 +65 -2.5121974420729800e-02 -2.3099061980316700e-02 5.2735737931542709e-02 +204 1.4575953419115398e-02 -3.8575307452158376e-02 -1.5289570845150143e-02 +293 1.1695533411766636e-02 3.1524287197995153e-02 1.2872141480690781e-02 diff --git a/examples/reax/ci-reaxFF/ci-reaxFF_ZBL.dat b/examples/reax/ci-reaxFF/ci-reaxFF_ZBL.dat new file mode 100644 index 0000000000..27dcb26353 --- /dev/null +++ b/examples/reax/ci-reaxFF/ci-reaxFF_ZBL.dat @@ -0,0 +1,27016 @@ +#DATE: 2017-11-20 CONTRIBUTOR: Michal Kanski michal.kanski@uj.edu.pl CITATION: Michal Kanski, Dawid Maciazek, Zbigniew Postawa, Adri C.T. van Duin, Chowdhury Ashraf, and Barbara J. Garrison Development of a Charge-Implicit ReaxFF Potential for Hydrocarbon Systems, J. Phys. Chem. Lett., 2018, 9, pp 359–363 DOI: 10.1021/acs.jpclett.7b03155 +#Correcting potential for cireaxFF CC + +CC_cireaxFF +N 10000 R 0.0001 1.0 + +1 0.0001 136733542.9751030206680298 1195428517883.147460937500 +2 0.0002 62019291.9954997226595879 298856501708.918518066406 +3 0.0003 40435234.5333681330084801 132824647533.713272094727 +4 0.0004 30058327.2013075463473797 74713499107.498413085938 +5 0.0005 23931835.2749199047684669 47816339420.254402160645 +6 0.0006 19880741.4538086317479610 33205537001.971019744873 +7 0.0007 17000680.3891085945069790 24395684292.029701232910 +8 0.0008 14847008.6080189552158117 18677751329.763092041016 +9 0.0009 13175243.2629336398094893 14757555571.943220138550 +10 0.0010 11839692.3424190990626812 11953462838.347606658936 +11 0.0011 10748081.6230340171605349 9878751549.354024887085 +12 0.0012 9839105.8625555727630854 8300763660.214876174927 +13 0.0013 9070431.7690561469644308 7072718209.773627281189 +14 0.0014 8411880.7633069269359112 6098301905.210776329041 +15 0.0015 7841356.0325410198420286 5312192710.107365608215 +16 0.0016 7342305.3928770115599036 4668820083.172800064087 +17 0.0017 6902083.9522572997957468 4135608729.221432685852 +18 0.0018 6510864.8878811988979578 3688772558.300591945648 +19 0.0019 6160895.4975742120295763 3310615247.839136600494 +20 0.0020 5845977.1959049208089709 2987750785.546697139740 +21 0.0021 5561094.5383900227025151 2709902364.751267433167 +22 0.0022 5302145.7016517221927643 2469074370.014742851257 +23 0.0023 5065743.4504847163334489 2258970653.325372219086 +24 0.0024 4849065.9777920646592975 2074578800.527655124664 +25 0.0025 4649743.6185463266447186 1911868384.387100934982 +26 0.0026 4465771.7574866404756904 1767568836.806629180908 +27 0.0027 4295443.1253810226917267 1639003805.305733680725 +28 0.0028 4137294.6273328629322350 1523966155.657470941544 +29 0.0029 3990065.1890978142619133 1420622609.043505668640 +30 0.0030 3852662.0462463209405541 1327440247.986360788345 +31 0.0031 3724133.5667513096705079 1243129341.913863420486 +32 0.0032 3603647.1757315262220800 1166598478.481804847717 +33 0.0033 3490471.2985971784219146 1096919064.205148696899 +34 0.0034 3383960.4942189888097346 1033297023.358639001846 +35 0.0035 3283543.1393463956192136 975050074.093221902847 +36 0.0036 3188711.1676347297616303 921589360.140090346336 +37 0.0037 3099011.4741543838754296 872404509.466831564903 +38 0.0038 3014038.6782713006250560 827051408.194830298424 +39 0.0039 2933429.0008542295545340 785142140.146594524384 +40 0.0040 2856855.0606238106265664 746336664.461784839630 +41 0.0041 2784021.4325809990987182 710335896.394444227219 +42 0.0042 2714660.8413970507681370 676875927.284519672394 +43 0.0043 2648530.8863182244822383 645723174.292006373405 +44 0.0044 2585411.2129628695547581 616670292.815091490746 +45 0.0045 2525101.0624447474256158 589532717.547348499298 +46 0.0046 2467417.1403642711229622 564145724.062177419662 +47 0.0047 2412191.7579967323690653 540361923.288598895073 +48 0.0048 2359271.2059573763981462 518049117.498517572880 +49 0.0049 2308514.3271125094033778 497088459.398825407028 +50 0.0050 2259791.2608262123540044 477372866.327112913132 +51 0.0051 2212982.3350130864419043 458805649.935401201248 +52 0.0052 2167977.0860895505174994 441299328.535312891006 +53 0.0053 2124673.3899228563532233 424774594.798573791981 +54 0.0054 2082976.6893821978010237 409159416.014601945877 +55 0.0055 2042799.3061913230922073 394388247.802890300751 +56 0.0056 2004059.8265401863027364 380401345.219845533371 +57 0.0057 1966682.5513935508206487 367144157.712863326073 +58 0.0058 1930597.0036850054748356 354566796.458043813705 +59 0.0059 1895737.4856445277109742 342623564.351513803005 +60 0.0060 1862042.6804083823226392 331272540.371394515038 +61 0.0061 1829455.2928278464823961 320475211.239321410656 +62 0.0062 1797921.7250494603067636 310196144.328400433064 +63 0.0063 1767391.7830019276589155 300402696.622253715992 +64 0.0064 1737818.4104080882389098 291064755.254535496235 +65 0.0065 1709157.4473567360546440 282154505.772510051727 +66 0.0066 1681367.4108286083210260 273646224.790042877197 +67 0.0067 1654409.2948821100872010 265516094.139922231436 +68 0.0068 1628246.3884743598755449 257742034.015083491802 +69 0.0069 1602844.1091279410757124 250303552.913291782141 +70 0.0070 1578169.8508583344519138 243181612.478841125965 +71 0.0071 1554192.8449556564446539 236358505.574718356133 +72 0.0072 1530884.0323706436902285 229817746.125537037849 +73 0.0073 1508215.9465918538626283 223543969.450260490179 +74 0.0074 1486162.6060214177705348 217522841.958459645510 +75 0.0075 1464699.4149625913705677 211740979.218068152666 +76 0.0076 1443803.0724257221445441 206185871.519318282604 +77 0.0077 1423451.4880416989326477 200845816.161146849394 +78 0.0078 1403623.7044448878150433 195709855.775073289871 +79 0.0079 1384299.8255521801766008 190767722.079080611467 +80 0.0080 1365460.9502221292350441 186009784.521940171719 +81 0.0081 1347089.1108291330747306 181427003.337982028723 +82 0.0082 1329167.2163329988252372 177010886.584700584412 +83 0.0083 1311678.9994646823033690 172753450.781627774239 +84 0.0084 1294608.9676851218100637 168647184.809579849243 +85 0.0085 1277942.3576063807122409 164685016.765241563320 +86 0.0086 1261665.0925932293757796 160860283.497783064842 +87 0.0087 1245763.7432892236392945 157166702.582330852747 +88 0.0088 1230225.4908346056472510 153598346.510029822588 +89 0.0089 1215038.0925642750225961 150149618.896581172943 +90 0.0090 1200189.8499929031822830 146815232.530853450298 +91 0.0091 1185669.5789112260099500 143590189.102691560984 +92 0.0092 1171466.5814328556880355 140469760.464712649584 +93 0.0093 1157570.6198447772767395 137449471.296856224537 +94 0.0094 1143971.8921271876897663 134525083.054936051369 +95 0.0095 1130661.0090196582023054 131692579.095653131604 +96 0.0096 1117628.9725208485033363 128948150.880538776517 +97 0.0097 1104867.1557183056138456 126288185.170320540667 +98 0.0098 1092367.2838533269241452 123709252.129252225161 +99 0.0099 1080121.4165335500147194 121208094.266286805272 +100 0.0100 1068121.9310129133518785 118781616.146445572376 +101 0.0101 1056361.5064650054555386 116426874.811711952090 +102 0.0102 1044833.1091816168045625 114141070.856061652303 +103 0.0103 1033529.9786336101824418 111921540.104070499539 +104 0.0104 1022445.6143360610585660 109765745.846911579370 +105 0.0105 1011573.7634640428004786 107671271.593453109264 +106 0.0106 1000908.4091694803209975 105635814.297796532512 +107 0.0107 990443.7595532018458471 103657178.027772441506 +108 0.0108 980174.2372497179312631 101733268.041906595230 +109 0.0109 970094.4695853726007044 99862085.244998902082 +110 0.0110 960199.2792733768001199 98041720.994917616248 +111 0.0111 950483.6756118608172983 96270352.235401079059 +112 0.0112 940942.8461535058449954 94546236.931697666645 +113 0.0113 931572.1488175365375355 92867709.787687748671 +114 0.0114 922367.1044169106753543 91233178.224828958511 +115 0.0115 913323.3895754297263920 89641118.604789152741 +116 0.0116 904436.8300112385768443 88090072.679034829140 +117 0.0117 895703.3941647907486185 86578644.249921590090 +118 0.0118 887119.1871508441399783 85105496.029011249542 +119 0.0119 878680.4450154229998589 83669346.679410919547 +120 0.0120 870383.5292799564776942 82268968.029918745160 +121 0.0121 862224.9217559773242101 80903182.449664056301 +122 0.0122 854201.2196148560615256 79570860.372761189938 +123 0.0123 846309.1306980550289154 78270917.963259682059 +124 0.0124 838545.4690543231554329 77002314.911377072334 +125 0.0125 830907.1506911220494658 75764052.352645143867 +126 0.0126 823391.1895283799385652 74555170.902198210359 +127 0.0127 815994.6935434212209657 73374748.796976760030 +128 0.0128 808714.8610966157866642 72221900.139131650329 +129 0.0129 801548.9774279404664412 71095773.234373733401 +130 0.0130 794494.4113152491627261 69995549.019452005625 +131 0.0131 787548.6118856098037213 68920439.573335886002 +132 0.0132 780709.1055715904803947 67869686.707049682736 +133 0.0133 773973.4932048657210544 66842560.627444788814 +134 0.0134 767339.4472399678779766 65838358.670513130724 +135 0.0135 760804.7091014353791252 64856404.100135907531 +136 0.0136 754367.0866480069234967 63896044.968432106078 +137 0.0137 748024.4517478790367022 62956653.034124605358 +138 0.0138 741774.7379593942314386 62037622.735570535064 +139 0.0139 735615.9383118494879454 61138370.215323373675 +140 0.0140 729546.1031814187299460 60258332.393290862441 +141 0.0141 723563.3382574670249596 59396966.085742965341 +142 0.0142 717665.8025948001304641 58553747.167594641447 +143 0.0143 711851.7067476428346708 57728169.775551363826 +144 0.0144 706119.3109813724877313 56919745.549856245518 +145 0.0145 700466.9235582539113238 56128002.912514261901 +146 0.0146 694892.8990936279296875 55352486.380004324019 +147 0.0147 689395.6369791973847896 54592755.908605583012 +148 0.0148 683973.5798702378524467 53848386.270585127175 +149 0.0149 678625.2122337290784344 53118966.459591180086 +150 0.0150 673349.0589545643888414 52404099.123703107238 +151 0.0151 668143.6839971455046907 51703400.024675302207 +152 0.0152 663007.6891198116354644 51016497.522002995014 +153 0.0153 657939.7126396857202053 50343032.080514550209 +154 0.0154 652938.4282456464134157 49682655.800272755325 +155 0.0155 648002.5438572508282959 49035031.967638544738 +156 0.0156 643130.8005275483010337 48399834.626412853599 +157 0.0157 638321.9713878256734461 47776748.168039754033 +158 0.0158 633574.8606324283173308 47165466.939906477928 +159 0.0159 628888.3025418913457543 46565694.870834015310 +160 0.0160 624261.1605427046306431 45977145.112900443375 +161 0.0161 619692.3263021201128140 45399539.698789633811 +162 0.0162 615180.7188564856769517 44832609.213898874819 +163 0.0163 610725.2837716664653271 44276092.482484482229 +164 0.0164 606324.9923341841204092 43729736.267163299024 +165 0.0165 601978.8407717697555199 43193294.981123179197 +166 0.0166 597685.8495020919945091 42666530.412432491779 +167 0.0167 593445.0624084768351167 42149211.459870830178 +168 0.0168 589255.5461414966266602 41641113.879733696580 +169 0.0169 585116.3894453552784398 41142020.043094031513 +170 0.0170 581026.7025080492021516 40651718.703028045595 +171 0.0171 576985.6163343306398019 40170004.771343305707 +172 0.0172 572992.2821405451977625 39696679.104365877807 +173 0.0173 569045.8707704583648592 39231548.297369919717 +174 0.0174 565145.5721312271198258 38774424.487254247069 +175 0.0175 561290.5946487099863589 38325125.163088224828 +176 0.0176 557480.1647413469618186 37883472.984172195196 +177 0.0177 553713.5263118747388944 37449295.605271562934 +178 0.0178 549989.9402561758179218 37022425.508706055582 +179 0.0179 546308.6839885913068429 36602699.842984899879 +180 0.0180 542669.0509830570081249 36189960.267701454461 +181 0.0181 539070.3503294514957815 35784052.804408960044 +182 0.0182 535511.9063045702641830 35384827.693216085434 +183 0.0183 531993.0579571668058634 34992139.254852578044 +184 0.0184 528513.1587065256899223 34605845.757969021797 +185 0.0185 525071.5759540550643578 34225809.291442871094 +186 0.0186 521667.6907074090559036 33851895.641478024423 +187 0.0187 518300.8972166705643758 33483974.173292048275 +188 0.0188 514970.6026221460779198 33121917.717197436839 +189 0.0189 511676.2266133416560479 32765602.458890669048 +190 0.0190 508417.2010987084941007 32414907.833772044629 +191 0.0191 505192.9698857634211890 32069716.425129342824 +192 0.0192 502002.9883712058071978 31729913.866022869945 +193 0.0193 498846.7232406685943715 31395388.744720906019 +194 0.0194 495723.6521777556627057 31066032.513537451625 +195 0.0195 492633.2635820320574567 30741739.400934405625 +196 0.0196 489575.0562956475769170 30422406.326755054295 +197 0.0197 486548.5393382867332548 30107932.820461794734 +198 0.0198 483553.2316501507884823 29798220.942257214338 +199 0.0199 480588.6618426893255673 29493175.206972211599 +200 0.0200 477654.3679568101069890 29192702.510612268001 +201 0.0201 474749.8972283067414537 28896712.059454869479 +202 0.0202 471874.8058602540986612 28605115.301597803831 +203 0.0203 469028.6588021310744807 28317825.860862147063 +204 0.0204 466211.0295354400877841 28034759.472957979888 +205 0.0205 463421.4998656010138802 27755833.923823870718 +206 0.0206 460659.6597199069801718 27480968.990057088435 +207 0.0207 457925.1069513364927843 27210086.381352901459 +208 0.0208 455217.4471480249776505 26943109.684876874089 +209 0.0209 452536.2934482063865289 26679964.311495050788 +210 0.0210 449881.2663604419794865 26420577.443793386221 +211 0.0211 447251.9935889615444466 26164877.985815625638 +212 0.0212 444648.1098639477859251 25912796.514459405094 +213 0.0213 442069.2567766016582027 25664265.232463356107 +214 0.0214 439515.0826188319479115 25419217.922930303961 +215 0.0215 436985.2422274191048928 25177589.905326664448 +216 0.0216 434479.3968325075693429 24939317.992904558778 +217 0.0217 431997.2139102875953540 24704340.451494581997 +218 0.0218 429538.3670397319365293 24472596.959618736058 +219 0.0219 427102.5357632572413422 24244028.569874707609 +220 0.0220 424689.4054511861759238 24018577.671546678990 +221 0.0221 422298.6671698889695108 23796187.954397317022 +222 0.0222 419930.0175534891313873 23576804.373599492013 +223 0.0223 417583.1586790208821185 23360373.115765564144 +224 0.0224 415257.7979449307895266 23146841.566036168486 +225 0.0225 412953.6479528194759041 22936158.276190649718 +226 0.0226 410670.4263923227554187 22728272.933743335307 +227 0.0227 408407.8559290361008607 22523136.331989940256 +228 0.0228 406165.6640953879687004 22320700.340972378850 +229 0.0229 403943.5831843729247339 22120917.879328645766 +230 0.0230 401741.3501460566185415 21923742.886997830123 +231 0.0231 399558.7064867692533880 21729130.298750009388 +232 0.0232 397395.3981709060608409 21537036.018513951451 +233 0.0233 395251.1755252566654235 21347416.894473515451 +234 0.0234 393125.7931457876111381 21160230.694908045232 +235 0.0235 391019.0098068047082052 20975436.084750473499 +236 0.0236 388930.5883724252344109 20792992.602839525789 +237 0.0237 386860.2957102911313996 20612860.639842413366 +238 0.0238 384807.9026074577705003 20435001.416824940592 +239 0.0239 382773.1836883940850385 20259376.964448984712 +240 0.0240 380755.9173350328928791 20085950.102774336934 +241 0.0241 378755.8856088118627667 19914684.421646654606 +242 0.0242 376772.8741746469750069 19745544.261651482433 +243 0.0243 374806.6722267836448736 19578494.695615377277 +244 0.0244 372857.0724164710263722 19413501.510637447238 +245 0.0245 370923.8707814075751230 19250531.190632022917 +246 0.0246 369006.8666769075789489 19089550.899368293583 +247 0.0247 367105.8627087397035211 18930528.463988956064 +248 0.0248 365220.6646675905794837 18773432.358993183821 +249 0.0249 363351.0814651074470021 18618231.690669137985 +250 0.0250 361496.9250714759109542 18464896.181961365044 +251 0.0251 359658.0104544898495078 18313396.157759305090 +252 0.0252 357834.1555200722068548 18163702.530593875796 +253 0.0253 356025.1810542060411535 18015786.786728885025 +254 0.0254 354230.9106662378180772 17869620.972635030746 +255 0.0255 352451.1707335143582895 17725177.681834086776 +256 0.0256 350685.7903473175247200 17582430.042103126645 +257 0.0257 348934.6012600610847585 17441351.703025192022 +258 0.0258 347197.4378337159287184 17301916.823878325522 +259 0.0259 345474.1369894294766709 17164100.061850748956 +260 0.0260 343764.5381583083071746 17027876.560572274029 +261 0.0261 342068.4832333319936879 16893221.938953686506 +262 0.0262 340385.8165223681717180 16760112.280323171988 +263 0.0263 338716.3847022594418377 16628524.121851090342 +264 0.0264 337060.0367739541106857 16498434.444255290553 +265 0.0265 335416.6240186524810269 16369820.661777207628 +266 0.0266 333785.9999549425556324 16242660.612421756610 +267 0.0267 332168.0202968988451175 16116932.548452043906 +268 0.0268 330562.5429131195996888 15992615.127132756636 +269 0.0269 328969.4277866773190908 15869687.401713062078 +270 0.0270 327388.5369759594905190 15748128.812643324956 +271 0.0271 325819.7345763763878495 15627919.179018380120 +272 0.0272 324262.8866829134640284 15509038.690240252763 +273 0.0273 322717.8613535067415796 15391467.897894557565 +274 0.0274 321184.5285732203046791 15275187.707833781838 +275 0.0275 319662.7602192055201158 15160179.372462106869 +276 0.0276 318152.4300264216726646 15046424.483215091750 +277 0.0277 316653.4135540994466282 14933904.963229581714 +278 0.0278 315165.5881529281032272 14822603.060197308660 +279 0.0279 313688.8329329483676702 14712501.339397784323 +280 0.0280 312223.0287321332143620 14603582.676904901862 +281 0.0281 310768.0580856398446485 14495830.252962842584 +282 0.0282 309323.8051957153948024 14389227.545525571331 +283 0.0283 307890.1559022412984632 14283758.323956133798 +284 0.0284 306466.9976538994233124 14179406.642881162465 +285 0.0285 305054.2194799456046894 14076156.836195666343 +286 0.0286 303651.7119625750929117 13973993.511214442551 +287 0.0287 302259.3672098660608754 13872901.542966175824 +288 0.0288 300877.0788292865036055 13772866.068625522777 +289 0.0289 299504.7419017512584105 13673872.482079930604 +290 0.0290 298142.2529562158742920 13575906.428628131747 +291 0.0291 296789.5099447942338884 13478953.799804234877 +292 0.0292 295446.4122183876461349 13383000.728327834979 +293 0.0293 294112.8605028126039542 13288033.583172608167 +294 0.0294 292788.7568754162639380 13194038.964753715321 +295 0.0295 291474.0047421671915799 13101003.700227901340 +296 0.0296 290168.5088152105454355 13008914.838905386627 +297 0.0297 288872.1750908768153749 12917759.647769382223 +298 0.0298 287584.9108281332883053 12827525.607101077214 +299 0.0299 286306.6245274679386057 12738200.406205844134 +300 0.0300 285037.2259101956151426 12649771.939240539446 +301 0.0301 283776.6258981767459773 12562228.301136301830 +302 0.0302 282524.7365939391311258 12475557.783616345376 +303 0.0303 281281.4712611930444837 12389748.871305577457 +304 0.0304 280046.7443057312630117 12304790.237929681316 +305 0.0305 278820.4712567047099583 12220670.742600921541 +306 0.0306 277602.5687482652137987 12137379.426189245656 +307 0.0307 276392.9545015670009889 12054905.507775587961 +308 0.0308 275191.5473071188898757 11973238.381186157465 +309 0.0309 273998.2670074793277308 11892367.611604552716 +310 0.0310 272813.0344802860636264 11812282.932260446250 +311 0.0311 271635.7716216134140268 11732974.241192895919 +312 0.0312 270466.4013296494958922 11654431.598086046055 +313 0.0313 269304.8474886864423752 11576645.221175214276 +314 0.0314 268151.0349534165579826 11499605.484222205356 +315 0.0315 267004.8895335275446996 11423302.913557609543 +316 0.0316 265866.3379785902216099 11347728.185188286006 +317 0.0317 264735.3079632323351689 11272872.121969090775 +318 0.0318 263611.7280725920572877 11198725.690836351365 +319 0.0319 262495.5277880451176316 11125280.000102177262 +320 0.0320 261386.6374731996038463 11052526.296807663515 +321 0.0321 260284.9883601525216363 10980455.964133888483 +322 0.0322 259190.5125360023812391 10909060.518869204447 +323 0.0323 258103.1429296123678796 10838331.608931053430 +324 0.0324 257022.8132986187411007 10768261.010941350833 +325 0.0325 255949.4582166789623443 10698840.627854099497 +326 0.0326 254883.0130609545740299 10630062.486633783206 +327 0.0327 253823.4139998237078544 10561918.735983561724 +328 0.0328 252770.5979808184492867 10494401.644121481106 +329 0.0329 251724.5027187821688130 10427503.596604170278 +330 0.0330 250685.0666842421051115 10361217.094196930528 +331 0.0331 249652.2290919928636868 10295534.750788057223 +332 0.0332 248625.9298898860579357 10230449.291348015890 +333 0.0333 247606.1097478221345227 10165953.549930257723 +334 0.0334 246592.7100469398428686 10102040.467715313658 +335 0.0335 245585.6728689993615262 10038703.091094499454 +336 0.0336 244584.9409859549487010 9975934.569794008508 +337 0.0337 243590.4578497133625206 9913728.155037814751 +338 0.0338 242602.1675820740347262 9852077.197748674080 +339 0.0339 241620.0149648473015986 9790975.146786075085 +340 0.0340 240643.9454301469668280 9730415.547220334411 +341 0.0341 239673.9050508538202848 9670392.038642469794 +342 0.0342 238709.8405312463000882 9610898.353508125991 +343 0.0343 237751.6991977951256558 9551928.315515581518 +344 0.0344 236799.4289901185256895 9493475.838016536087 +345 0.0345 235852.9784520947432611 9435534.922459183261 +346 0.0346 234912.2967231286456808 9378099.656862746924 +347 0.0347 233977.3335295693832450 9321164.214322661981 +348 0.0348 233048.0391762759536505 9264722.851545842364 +349 0.0349 232124.3645383279072121 9208769.907415295020 +350 0.0350 231206.2610528779623564 9153299.801583385095 +351 0.0351 230293.6807111441448797 9098307.033093061298 +352 0.0352 229386.5760505381622352 9043786.179026553407 +353 0.0353 228484.9001469278009608 8989731.893180772662 +354 0.0354 227588.6066070303204469 8936138.904768906534 +355 0.0355 226697.6495609345147386 8883002.017147472128 +356 0.0356 225811.9836547487066127 8830316.106568528339 +357 0.0357 224931.5640433724620380 8778076.120956219733 +358 0.0358 224056.3463833892892580 8726277.078707177192 +359 0.0359 223186.2868260781979188 8674914.067514412105 +360 0.0360 222321.3420105417899322 8623982.243213858455 +361 0.0361 221461.4690569484373555 8573476.828653439879 +362 0.0362 220606.6255598865682259 8523393.112583830953 +363 0.0363 219756.7695818288484588 8473726.448570698500 +364 0.0364 218911.8596467039315030 8424472.253927672282 +365 0.0365 218071.8547335740586277 8375626.008669952862 +366 0.0366 217236.7142704161815345 8327183.254487744533 +367 0.0367 216406.3981280048319604 8279139.593739313073 +368 0.0368 215580.8666138947010040 8231490.688463139348 +369 0.0369 214760.0804665010946337 8184232.259408850223 +370 0.0370 213944.0008492763445247 8137360.085086370818 +371 0.0371 213132.5893449803697877 8090870.000833030790 +372 0.0372 212325.8079500438179821 8044757.897898260504 +373 0.0373 211523.6190690216317307 7999019.722545329481 +374 0.0374 210725.9855091358767822 7953651.475169957615 +375 0.0375 209932.8704749056196306 7908649.209435313009 +376 0.0376 209144.2375628626905382 7864009.031423158012 +377 0.0377 208360.0507563514984213 7819727.098800633103 +378 0.0378 207580.2744204113259912 7775799.620002530515 +379 0.0379 206804.8732967397663742 7732222.853428640403 +380 0.0380 206033.8124987355549820 7688993.106655824929 +381 0.0381 205267.0575066195451654 7646106.735664557666 +382 0.0382 204504.5741626323433593 7603560.144079709426 +383 0.0383 203746.3286663071194198 7561349.782425034791 +384 0.0384 202992.2875698163115885 7519472.147391326725 +385 0.0385 202242.4177733908582013 7477923.781117897481 +386 0.0386 201496.6865208106173668 7436701.270486981608 +387 0.0387 200755.0613949647231493 7395801.246430922300 +388 0.0388 200017.5103134805976879 7355220.383251846768 +389 0.0389 199284.0015244203386828 7314955.397953567095 +390 0.0390 198554.5036020433763042 7275003.049585497938 +391 0.0391 197828.9854426342062652 7235360.138598185033 +392 0.0392 197107.4162603937729727 7196023.506210444495 +393 0.0393 196389.7655833938624710 7156990.033787740394 +394 0.0394 195676.0032495929044671 7118256.642231527716 +395 0.0395 194966.0994029123394284 7079820.291379486211 +396 0.0396 194260.0244893725612201 7041677.979416278191 +397 0.0397 193557.7492532870091964 7003826.742294752039 +398 0.0398 192859.2447335139149800 6966263.653167183511 +399 0.0399 192164.4822597642196342 6928985.821826678701 +400 0.0400 191473.4334489649918396 6891990.394158147275 +401 0.0401 190786.0702016771247145 6855274.551598954014 +402 0.0402 190102.3646985667292029 6818835.510608957149 +403 0.0403 189422.2893969287979417 6782670.522149682976 +404 0.0404 188745.8170272626739461 6746776.871172529645 +405 0.0405 188072.9205898982472718 6711151.876115866937 +406 0.0406 187403.5733516719192266 6675792.888410670683 +407 0.0407 186737.7488426516356412 6640697.291994819418 +408 0.0408 186075.4208529101160821 6605862.502835530788 +409 0.0409 185416.5634293453476857 6571285.968460116535 +410 0.0410 184761.1508725476160180 6536965.167494639754 +411 0.0411 184109.1577337123744655 6502897.609210464172 +412 0.0412 183460.5588115979335271 6469080.833078474738 +413 0.0413 182815.3291495274752378 6435512.408330894075 +414 0.0414 182173.4440324344031978 6402189.933530419134 +415 0.0415 181534.8789839505334385 6369111.036146689206 +416 0.0416 180899.6097635361948051 6336273.372139813378 +417 0.0417 180267.6123636516567785 6303674.625550972298 +418 0.0418 179638.8630069691280369 6271312.508099725470 +419 0.0419 179013.3381436247436795 6239184.758788173087 +420 0.0420 178391.0144485097553115 6207289.143511652946 +421 0.0421 177771.8688186003710143 6175623.454675846733 +422 0.0422 177155.8783703255467117 6144185.510820384137 +423 0.0423 176543.0204369721177500 6112973.156248455867 +424 0.0424 175933.2725661265430972 6081984.260662759654 +425 0.0425 175326.6125171530293301 6051216.718807229772 +426 0.0426 174723.0182587069284637 6020668.450114805251 +427 0.0427 174122.4679662831476890 5990337.398360865191 +428 0.0428 173524.9400197989889421 5960221.531322392635 +429 0.0429 172930.4130012107489165 5930318.840442646295 +430 0.0430 172338.8656921635556500 5900627.340501287952 +431 0.0431 171750.2770716740051284 5871145.069289900362 +432 0.0432 171164.6263138448703103 5841870.087292721495 +433 0.0433 170581.8927856116206385 5812800.477372545749 +434 0.0434 170002.0560445199080277 5783934.344461663626 +435 0.0435 169425.0958365339320153 5755269.815257835202 +436 0.0436 168850.9920938747818582 5726805.037925051525 +437 0.0437 168279.7249328885809518 5698538.181799128652 +438 0.0438 167711.2746519437350798 5670467.437098023482 +439 0.0439 167145.6217293569934554 5642591.014636720531 +440 0.0440 166582.7468213478277903 5614907.145546681248 +441 0.0441 166022.6307600205182098 5587414.080999678001 +442 0.0442 165465.2545513737422880 5560110.091936131939 +443 0.0443 164910.5993733370560221 5532993.468797597103 +444 0.0444 164358.6465738340048119 5506062.521263504401 +445 0.0445 163809.3776688712241594 5479315.577992068604 +446 0.0446 163262.7743406533554662 5452750.986365268938 +447 0.0447 162718.8184357231948525 5426367.112237730063 +448 0.0448 162177.4919631268130615 5400162.339689624496 +449 0.0449 161638.7770926031516865 5374135.070783387870 +450 0.0450 161102.6561527977755759 5348283.725324149244 +451 0.0451 160569.1116295003739651 5322606.740624014288 +452 0.0452 160038.1261639056901913 5297102.571269845590 +453 0.0453 159509.6825508974725381 5271769.688894728199 +454 0.0454 158983.7637373550969642 5246606.581952922046 +455 0.0455 158460.3528204825415742 5221611.755498275161 +456 0.0456 157939.4330461593344808 5196783.730966017582 +457 0.0457 157420.9878073131258134 5172121.045957907103 +458 0.0458 156905.0006423137092497 5147622.254030704498 +459 0.0459 156391.4552333877945784 5123285.924487766810 +460 0.0460 155880.3354050547059160 5099110.642173876986 +461 0.0461 155371.6251225823652931 5075095.007273220457 +462 0.0462 154865.3084904631832615 5051237.635110300034 +463 0.0463 154361.3697509099729359 5027537.155954011716 +464 0.0464 153859.7932823710434604 5003992.214824530296 +465 0.0465 153360.5635980646475218 4980601.471303174272 +466 0.0466 152863.6653445322299376 4957363.599345142953 +467 0.0467 152369.0833002102153841 4934277.287094967440 +468 0.0468 151876.8023740202188492 4911341.236704847775 +469 0.0469 151386.8076039771840442 4888554.164155574515 +470 0.0470 150899.0841558153915685 4865914.799080181867 +471 0.0471 150413.6173216318711638 4843421.884590195492 +472 0.0472 149930.3925185471307486 4821074.177104503848 +473 0.0473 149449.3952873828820884 4798870.446180671453 +474 0.0474 148970.6112913564138580 4776809.474348803982 +475 0.0475 148494.0263147915829904 4754890.056947860867 +476 0.0476 148019.6262618459586520 4733111.001964338124 +477 0.0477 147547.3971552540606353 4711471.129873333499 +478 0.0478 147077.3251350862847175 4689969.273481942713 +479 0.0479 146609.3964575234276708 4668604.277774934657 +480 0.0480 146143.5974936465499923 4647374.999762667343 +481 0.0481 145679.9147282418562099 4626280.308331250213 +482 0.0482 145218.3347586205636617 4605319.084094828926 +483 0.0483 144758.8442934533231892 4584490.219250014052 +484 0.0484 144301.4301516191917472 4563792.617432483472 +485 0.0485 143846.0792610687785782 4543225.193575555459 +486 0.0486 143392.7786577014485374 4522786.873770900071 +487 0.0487 142941.5154842563497368 4502476.595131097361 +488 0.0488 142492.2769892170617823 4482293.305654374883 +489 0.0489 142045.0505257297772914 4462235.964091056027 +490 0.0490 141599.8235505346092395 4442303.539812127128 +491 0.0491 141156.5836229100241326 4422495.012679481879 +492 0.0492 140715.3184036301390734 4402809.372918158770 +493 0.0493 140276.0156539347080979 4383245.620990309864 +494 0.0494 139838.6632345116522629 4363802.767470985651 +495 0.0495 139403.2491044918133412 4344479.832925658673 +496 0.0496 138969.7613204560475424 4325275.847789490595 +497 0.0497 138538.1880354541644920 4306189.852248271927 +498 0.0498 138108.5174980356823653 4287220.896121088415 +499 0.0499 137680.7380512923991773 4268368.038744527847 +500 0.0500 137254.8381319122272544 4249630.348858638667 +501 0.0501 136830.8062692445819266 4231006.904494369403 +502 0.0502 136408.6310843767423648 4212496.792862656526 +503 0.0503 135988.3012892213591840 4194099.110244992189 +504 0.0504 135569.8056856148468796 4175812.961885531899 +505 0.0505 135153.1331644263409544 4157637.461884729564 +506 0.0506 134738.2727046773943584 4139571.733094390482 +507 0.0507 134325.2133726719766855 4121614.907014190219 +508 0.0508 133913.9443211367761251 4103766.123689664528 +509 0.0509 133504.4547883717168588 4086024.531611518003 +510 0.0510 133096.7340974103135522 4068389.287616347428 +511 0.0511 132690.7716551900666673 4050859.556788770016 +512 0.0512 132286.5569517323747277 4033434.512364832219 +513 0.0513 131884.0795593322836794 4016113.335636750795 +514 0.0514 131483.3291317574912682 3998895.215858955868 +515 0.0515 131084.2954034567810595 3981779.350155374035 +516 0.0516 130686.9681887775950599 3964764.943428073078 +517 0.0517 130291.3373811928468058 3947851.208266993985 +518 0.0518 129897.3929525364510482 3931037.364861014299 +519 0.0519 129505.1249522478901781 3914322.640910173766 +520 0.0520 129114.5235066254244884 3897706.271539064124 +521 0.0521 128725.5788180879026186 3881187.499211404007 +522 0.0522 128338.2811644450412132 3864765.573645757046 +523 0.0523 127952.6208981761301402 3848439.751732352190 +524 0.0524 127568.5884457169595407 3832209.297451062594 +525 0.0525 127186.1743067548813997 3816073.481790409889 +526 0.0526 126805.3690535319765331 3800031.582667718176 +527 0.0527 126426.1633301560796099 3784082.884850270115 +528 0.0528 126048.5478519196913112 3768226.679877527989 +529 0.0529 125672.5134046265884535 3752462.265984409023 +530 0.0530 125298.0508439260884188 3736788.948025525082 +531 0.0531 124925.1510946547932690 3721206.037400431931 +532 0.0532 124553.8051501857698895 3705712.851979916915 +533 0.0533 124184.0040717851225054 3690308.716033163946 +534 0.0534 123815.7389879756665323 3674992.960155951791 +535 0.0535 123449.0010939078783849 3659764.921199737117 +536 0.0536 123083.7816507378011011 3644623.942201695871 +537 0.0537 122720.0719850119348848 3629569.372315638233 +538 0.0538 122357.8634880589524982 3614600.566743873060 +539 0.0539 121997.1476153882686049 3599716.886669937987 +540 0.0540 121637.9158860951574752 3584917.699192154221 +541 0.0541 121280.1598822726518847 3570202.377258101944 +542 0.0542 120923.8712484297429910 3555570.299599932041 +543 0.0543 120569.0416909162304364 3541020.850670445710 +544 0.0544 120215.6629773536988068 3526553.420580124948 +545 0.0545 119863.7269360729551408 3512167.405034823809 +546 0.0546 119513.2254555574909318 3497862.205274344888 +547 0.0547 119164.1504838931869017 3483637.228011821862 +548 0.0548 118816.4940282239113003 3469491.885373768862 +549 0.0549 118470.2481542131718015 3455425.594841030892 +550 0.0550 118125.4049855116027175 3441437.779190366156 +551 0.0551 117781.9567032302438747 3427527.866436836775 +552 0.0552 117439.8955454195529455 3413695.289776933845 +553 0.0553 117099.2138065540930256 3399939.487532343250 +554 0.0554 116759.9038370227499399 3386259.903094561771 +555 0.0555 116421.9580426245229319 3372655.984870031010 +556 0.0556 116085.3688840697141131 3359127.186226147693 +557 0.0557 115750.1288764865166740 3345672.965437815990 +558 0.0558 115416.2305889328854391 3332292.785634693224 +559 0.0559 115083.6666439136897679 3318986.114749182016 +560 0.0560 114752.4297169029887300 3305752.425464965869 +561 0.0561 114422.5125358714285539 3292591.195166236721 +562 0.0562 114093.9078808187332470 3279501.905887547880 +563 0.0563 113766.6085833111428656 3266484.044264285825 +564 0.0564 113440.6075260237412294 3253537.101483763196 +565 0.0565 113115.8976422877021832 3240660.573236916680 +566 0.0566 112792.4719156423234381 3227853.959670593962 +567 0.0567 112470.3233793917752337 3215116.765340421814 +568 0.0568 112149.4451161665347172 3202448.499164298177 +569 0.0569 111829.8302574895060388 3189848.674376392271 +570 0.0570 111511.4719833465933334 3177316.808481732849 +571 0.0571 111194.3635217619303148 3164852.423211421352 +572 0.0572 110878.4981483774463413 3152455.044478238095 +573 0.0573 110563.8691860368853668 3140124.202332985587 +574 0.0574 110250.4700043741759146 3127859.430921176914 +575 0.0575 109938.2940194060938666 3115660.268440396059 +576 0.0576 109627.3346931291744113 3103526.257098075002 +577 0.0577 109317.5855331207712879 3091456.943069862667 +578 0.0578 109009.0400921443506377 3079451.876458412036 +579 0.0579 108701.6919677587866317 3067510.611252752133 +580 0.0580 108395.5348019317461876 3055632.705288087949 +581 0.0581 108090.5622806570318062 3043817.720206141006 +582 0.0582 107786.7681335759261856 3032065.221415860113 +583 0.0583 107484.1461336023930926 3020374.778054755181 +584 0.0584 107182.6900965521199396 3008745.962950566784 +585 0.0585 106882.3938807754166191 2997178.352583447937 +586 0.0586 106583.2513867938105250 2985671.527048591059 +587 0.0587 106285.2565569404105190 2974225.070019331295 +588 0.0588 105988.4033750039088773 2962838.568710591178 +589 0.0589 105692.6858658762357663 2951511.613842889201 +590 0.0590 105398.0980952037498355 2940243.799606688786 +591 0.0591 105104.6341690420522355 2929034.723627181258 +592 0.0592 104812.2882335142203374 2917883.986929481849 +593 0.0593 104521.0544744725339115 2906791.193904312328 +594 0.0594 104230.9271171636210056 2895755.952273962088 +595 0.0595 103941.9004258969798684 2884777.873058722354 +596 0.0596 103653.9687037168623647 2873856.570543735754 +597 0.0597 103367.1262920773733640 2862991.662246165797 +598 0.0598 103081.3675705209170701 2852182.768882826902 +599 0.0599 102796.6869563598738750 2841429.514338104054 +600 0.0600 102513.0789043613476679 2830731.525632334407 +601 0.0601 102230.5379064352018759 2820088.432890503667 +602 0.0602 101949.0584913251077523 2809499.869311322924 +603 0.0603 101668.6352243027067743 2798965.471136649139 +604 0.0604 101389.2627068648143904 2788484.877621303778 +605 0.0605 101110.9355764335923595 2778057.731003179215 +606 0.0606 100833.6485060597478878 2767683.676473695319 +607 0.0607 100557.3962041286285967 2757362.362148708664 +608 0.0608 100282.1734140692133224 2747093.439039573073 +609 0.0609 100007.9749140659987461 2736876.561024673283 +610 0.0610 99734.7955167737090960 2726711.384821256623 +611 0.0611 99462.6300690347707132 2716597.569957532920 +612 0.0612 99191.4734515996387927 2706534.778745140415 +613 0.0613 98921.3205788497871254 2696522.676251916680 +614 0.0614 98652.1663985234335996 2686560.930275016930 +615 0.0615 98384.0058914439723594 2676649.211314231157 +616 0.0616 98116.8340712509670993 2666787.192545733415 +617 0.0617 97850.6459841338801198 2656974.549796028994 +618 0.0618 97585.4367085682606557 2647210.961516254116 +619 0.0619 97321.2013550546107581 2637496.108756755013 +620 0.0620 97057.9350658596813446 2627829.675141920801 +621 0.0621 96795.6330147603148362 2618211.346845369786 +622 0.0622 96534.2904067897761706 2608640.812565323897 +623 0.0623 96273.9024779864994343 2599117.763500323985 +624 0.0624 96014.4644951452210080 2589641.893325224053 +625 0.0625 95755.9717555705865379 2580212.898167368025 +626 0.0626 95498.4195868330571102 2570830.476583180949 +627 0.0627 95241.8033465271582827 2561494.329534859862 +628 0.0628 94986.1184220320428722 2552204.160367432982 +629 0.0629 94731.3602302743674954 2542959.674786048941 +630 0.0630 94477.5242174933955539 2533760.580833489075 +631 0.0631 94224.6058590083266608 2524606.588867954910 +632 0.0632 93972.6006589878670638 2515497.411541108973 +633 0.0633 93721.5041502219974063 2506432.763776316773 +634 0.0634 93471.3118938958214130 2497412.362747202162 +635 0.0635 93222.0194793656410184 2488435.927856354043 +636 0.0636 92973.6225239371124189 2479503.180714318994 +637 0.0637 92726.1166726454539457 2470613.845118837897 +638 0.0638 92479.4975980377930682 2461767.647034241352 +639 0.0639 92233.7609999575215625 2452964.314571151044 +640 0.0640 91988.9026053306442918 2444203.577966340818 +641 0.0641 91744.9181679541798076 2435485.169562886935 +642 0.0642 91501.8034682865109062 2426808.823790412862 +643 0.0643 91259.5543132396996953 2418174.277145739179 +644 0.0644 91018.1665359737380641 2409581.268173493911 +645 0.0645 90777.6359956927044550 2401029.537447206676 +646 0.0646 90537.9585774428269360 2392518.827550380956 +647 0.0647 90299.1301919124089181 2384048.883057888132 +648 0.0648 90061.1467752336320700 2375619.450517554767 +649 0.0649 89824.0042887861636700 2367230.278431896120 +650 0.0650 89587.6987190025683958 2358881.117240109947 +651 0.0651 89352.2260771755536553 2350571.719300235156 +652 0.0652 89117.5823992669756990 2342301.838871441782 +653 0.0653 88883.7637457185774110 2334071.232096662745 +654 0.0654 88650.7662012644868810 2325879.656985240988 +655 0.0655 88418.5858747454331024 2317726.873395881616 +656 0.0656 88187.2188989246496931 2309612.643019710202 +657 0.0657 87956.6614303054811899 2301536.729363576043 +658 0.0658 87726.9096489506337093 2293498.897733487189 +659 0.0659 87497.9597583030408714 2285498.915218234994 +660 0.0660 87269.8079850084759528 2277536.550673202146 +661 0.0661 87042.4505787396046799 2269611.574704292230 +662 0.0662 86815.8838120217842516 2261723.759652150795 +663 0.0663 86590.1039800603612093 2253872.879576376174 +664 0.0664 86365.1074005695409141 2246058.710240065120 +665 0.0665 86140.8904136028140783 2238281.029094408266 +666 0.0666 85917.4493813849258004 2230539.615263488144 +667 0.0667 85694.7806881452852394 2222834.249529276974 +668 0.0668 85472.8807399529905524 2215164.714316701051 +669 0.0669 85251.7459645532071590 2207530.793678916059 +670 0.0670 85031.3728112051176140 2199932.273282770999 +671 0.0671 84811.7577505212684628 2192368.940394323785 +672 0.0672 84592.8972743083286332 2184840.583864617627 +673 0.0673 84374.7878954093175707 2177346.994115536101 +674 0.0674 84157.4261475472449092 2169887.963125823066 +675 0.0675 83940.8085851700889179 2162463.284417212941 +676 0.0676 83724.9317832971864846 2155072.753040826879 +677 0.0677 83509.7923373669764260 2147716.165563513059 +678 0.0678 83295.3868630860670237 2140393.320054554380 +679 0.0679 83081.7119962797296466 2133104.016072260682 +680 0.0680 82868.7643927435710793 2125848.054650980048 +681 0.0681 82656.5407280966173857 2118625.238287957851 +682 0.0682 82445.0376976356928935 2111435.370930572040 +683 0.0683 82234.2520161909924354 2104278.257963562850 +684 0.0684 82024.1804179829923669 2097153.706196411978 +685 0.0685 81814.8196564806276001 2090061.523850882892 +686 0.0686 81606.1665042606473435 2083001.520548672182 +687 0.0687 81398.2177528682514094 2075973.507299164077 +688 0.0688 81190.9702126789197791 2068977.296487379121 +689 0.0689 80984.4207127614499768 2062012.701861926820 +690 0.0690 80778.5661007421877002 2055079.538523242110 +691 0.0691 80573.4032426704361569 2048177.622911756160 +692 0.0692 80368.9290228850295534 2041306.772796346107 +693 0.0693 80165.1403438820707379 2034466.807262790157 +694 0.0694 79962.0341261838038918 2027657.546702427091 +695 0.0695 79759.6073082086368231 2020878.812800869113 +696 0.0696 79557.8568461422546534 2014130.428526828764 +697 0.0697 79356.7797138098540017 2007412.218121102080 +698 0.0698 79156.3729025495122187 2000724.007085616002 +699 0.0699 78956.6334210866043577 1994065.622172628064 +700 0.0700 78757.5582954092678847 1987436.891373981023 +701 0.0701 78559.1445686450460926 1980837.643910526996 +702 0.0702 78361.3893009384337347 1974267.710221600020 +703 0.0703 78164.2895693296159152 1967726.921954615740 +704 0.0704 77967.8424676341383019 1961215.111954805208 +705 0.0705 77772.0451063236541813 1954732.114255007124 +706 0.0706 77576.8946124076319393 1948277.764065563679 +707 0.0707 77382.3881293161393842 1941851.897764329799 +708 0.0708 77188.5228167835884960 1935454.352886810899 +709 0.0709 76995.2958507334260503 1929084.968116336036 +710 0.0710 76802.7044231638865313 1922743.583274375182 +711 0.0711 76610.7457420346181607 1916430.039310909109 +712 0.0712 76419.4170311543275602 1910144.178294973914 +713 0.0713 76228.7155300693266327 1903885.843405185034 +714 0.0714 76038.6384939530398697 1897654.878920459887 +715 0.0715 75849.1831934964866377 1891451.130210749805 +716 0.0716 75660.3469147995492676 1885274.443727936130 +717 0.0717 75472.1269592633179855 1879124.666996743996 +718 0.0718 75284.5206434831925435 1873001.648605788127 +719 0.0719 75097.5252991429733811 1866905.238198698964 +720 0.0720 74911.1382729097676929 1860835.286465344951 +721 0.0721 74725.3569263298413716 1854791.645133090205 +722 0.0722 74540.1786357252713060 1848774.166958209127 +723 0.0723 74355.6007920914998977 1842782.705717317061 +724 0.0724 74171.6208009956899332 1836817.116198963951 +725 0.0725 73988.2360824759816751 1830877.254195200047 +726 0.0726 73805.4440709415503079 1824962.976493319031 +727 0.0727 73623.2422150735073956 1819074.140867645154 +728 0.0728 73441.6279777265590383 1813210.606071356917 +729 0.0729 73260.5988358315662481 1807372.231828523101 +730 0.0730 73080.1522802988329204 1801558.878826004919 +731 0.0731 72900.2858159222523682 1795770.408705636859 +732 0.0732 72720.9969612841523485 1790006.684056395199 +733 0.0733 72542.2832486609986518 1784267.568406587001 +734 0.0734 72364.1422239298553905 1778552.926216223044 +735 0.0735 72186.5714464755728841 1772862.622869415907 +736 0.0736 72009.5684890987613471 1767196.524666810874 +737 0.0737 71833.1309379245067248 1761554.498818153981 +738 0.0738 71657.2563923118577804 1755936.413434864953 +739 0.0739 71481.9424647639825707 1750342.137522774981 +740 0.0740 71307.1867808390961727 1744771.540974817937 +741 0.0741 71132.9869790621596621 1739224.494563881075 +742 0.0742 70959.3407108371757204 1733700.869935660157 +743 0.0743 70786.2456403603137005 1728200.539601657074 +744 0.0744 70613.6994445336313220 1722723.376932133920 +745 0.0745 70441.6998128795676166 1717269.256149256835 +746 0.0746 70270.2444474560907111 1711838.052320202813 +747 0.0747 70099.3310627725586528 1706429.641350412043 +748 0.0748 69928.9573857061914168 1701043.899976806017 +749 0.0749 69759.1211554192850599 1695680.705761178862 +750 0.0750 69589.8201232770516071 1690339.937083567027 +751 0.0751 69421.0520527660846710 1685021.473135730950 +752 0.0752 69252.8147194135672180 1679725.193914671196 +753 0.0753 69085.1059107070177561 1674450.980216201162 +754 0.0754 68917.9234260147786699 1669198.713628606871 +755 0.0755 68751.2650765070284251 1663968.276526329108 +756 0.0756 68585.1286850775213679 1658759.552063735900 +757 0.0757 68419.5120862658804981 1653572.424168952974 +758 0.0758 68254.4131261805450777 1648406.777537713991 +759 0.0759 68089.8296624223003164 1643262.497627299977 +760 0.0760 67925.7595640084036859 1638139.470650517847 +761 0.0761 67762.2007112973951735 1633037.583569784882 +762 0.0762 67599.1509959143440938 1627956.724091162905 +763 0.0763 67436.6083206768525997 1622896.780658543110 +764 0.0764 67274.5705995215394069 1617857.642447864171 +765 0.0765 67113.0357574310764903 1612839.199361337814 +766 0.0766 66952.0017303619242739 1607841.342021773104 +767 0.0767 66791.4664651724888245 1602863.961766964989 +768 0.0768 66631.4279195519338828 1597906.950644044206 +769 0.0769 66471.8840619495313149 1592970.201404015068 +770 0.0770 66312.8328715045208810 1588053.607496201992 +771 0.0771 66154.2723379765666323 1583157.063062875066 +772 0.0772 65996.2004616767371772 1578280.462933810893 +773 0.0773 65838.6152533989952644 1573423.702621007105 +774 0.0774 65681.5147343522839947 1568586.678313335869 +775 0.0775 65524.8969360930495895 1563769.286871347111 +776 0.0776 65368.7599004583826172 1558971.425822052173 +777 0.0777 65213.1016794995884993 1554192.993353782920 +778 0.0778 65057.9203354163473705 1549433.888311086921 +779 0.0779 64903.2139404913104954 1544694.010189681780 +780 0.0780 64748.9805770252569346 1539973.259131439961 +781 0.0781 64595.2183372727158712 1535271.535919404123 +782 0.0782 64441.9253233780982555 1530588.741972892080 +783 0.0783 64289.0996473123232136 1525924.779342620866 +784 0.0784 64136.7394308099028422 1521279.550705844071 +785 0.0785 63984.8428053065290442 1516652.959361606976 +786 0.0786 63833.4079118771551293 1512044.909225943964 +787 0.0787 63682.4329011744994204 1507455.304827217944 +788 0.0788 63531.9159333680654527 1502884.051301439991 +789 0.0789 63381.8551780836132821 1498331.054387644865 +790 0.0790 63232.2488143430673517 1493796.220423321938 +791 0.0791 63083.0950305049118469 1489279.456339850090 +792 0.0792 62934.3920242050153320 1484780.669658025028 +793 0.0793 62786.1380022979355999 1480299.768483560998 +794 0.0794 62638.3311807986247004 1475836.661502727075 +795 0.0795 62490.9697848245923524 1471391.257977915928 +796 0.0796 62344.0520485385350185 1466963.467743301066 +797 0.0797 62197.5762150913433288 1462553.201200571144 +798 0.0798 62051.5405365655824426 1458160.369314593961 +799 0.0799 61905.9432739193871384 1453784.883609284181 +800 0.0800 61760.7826969307570835 1449426.656163285952 +801 0.0801 61616.0570841422959347 1445085.599605927942 +802 0.0802 61471.7647228063506191 1440761.627113043098 +803 0.0803 61327.9039088305580663 1436454.652402872918 +804 0.0804 61184.4729467238139478 1432164.589732075809 +805 0.0805 61041.4701495426270412 1427891.353891650913 +806 0.0806 60898.8938388378956006 1423634.860203002114 +807 0.0807 60756.7423446020475239 1419395.024513952900 +808 0.0808 60615.0140052166025271 1415171.763194891857 +809 0.0809 60473.7071674001199426 1410964.993134832010 +810 0.0810 60332.8201861564957653 1406774.631737606134 +811 0.0811 60192.3514247237108066 1402600.596918050200 +812 0.0812 60052.2992545228989911 1398442.807098225923 +813 0.0813 59912.6620551078012795 1394301.181203675922 +814 0.0814 59773.4382141146343201 1390175.638659684919 +815 0.0815 59634.6261272122646915 1386066.099387662020 +816 0.0816 59496.2241980528124259 1381972.483801399823 +817 0.0817 59358.2308382225673995 1377894.712803561939 +818 0.0818 59220.6444671932913479 1373832.707781995879 +819 0.0819 59083.4635122738764039 1369786.390606242931 +820 0.0820 58946.6864085623674328 1365755.683624005876 +821 0.0821 58810.3115988982899580 1361740.509657592047 +822 0.0822 58674.3375338153855409 1357740.792000550078 +823 0.0823 58538.7626714946527500 1353756.454414122971 +824 0.0824 58403.5854777177519281 1349787.421123935841 +825 0.0825 58268.8044258207301027 1345833.616816549096 +826 0.0826 58134.4179966480951407 1341894.966636141995 +827 0.0827 58000.4246785072318744 1337971.396181180142 +828 0.0828 57866.8229671231165412 1334062.831501122098 +829 0.0829 57733.6113655934022972 1330169.199093156029 +830 0.0830 57600.7883843437957694 1326290.425898970105 +831 0.0831 57468.3525410837683012 1322426.439301527105 +832 0.0832 57336.3023607626018929 1318577.167121869978 +833 0.0833 57204.6363755257116281 1314742.537616000045 +834 0.0834 57073.3531246713246219 1310922.479471714934 +835 0.0835 56942.4511546074645594 1307116.921805503080 +836 0.0836 56811.9290188092127210 1303325.794159517158 +837 0.0837 56681.7852777763182530 1299549.026498423889 +838 0.0838 56552.0184989910703734 1295786.549206481082 +839 0.0839 56422.6272568765198230 1292038.293084460078 +840 0.0840 56293.6101327549622511 1288304.189346707892 +841 0.0841 56164.9657148067199159 1284584.169618171174 +842 0.0842 56036.6925980292362510 1280878.165931493044 +843 0.0843 55908.7893841964541934 1277186.110724085942 +844 0.0844 55781.2546818184855510 1273507.936835279921 +845 0.0845 55654.0871061015495798 1269843.577503425069 +846 0.0846 55527.2852789082244271 1266192.966363095911 +847 0.0847 55400.8478287179532344 1262556.037442269968 +848 0.0848 55274.7733905878631049 1258932.725159547990 +849 0.0849 55149.0606061138169025 1255322.964321393985 +850 0.0850 55023.7081233917779173 1251726.690119356150 +851 0.0851 54898.7145969794364646 1248143.838127413997 +852 0.0852 54774.0786878581056953 1244574.344299242133 +853 0.0853 54649.7990633948647883 1241018.144965545973 +854 0.0854 54525.8743973050150089 1237475.176831399091 +855 0.0855 54402.3033696147613227 1233945.376973642036 +856 0.0856 54279.0846666241632192 1230428.682838253910 +857 0.0857 54156.2169808703620220 1226925.032237773994 +858 0.0858 54033.6990110910337535 1223434.363348727114 +859 0.0859 53911.5294621881403145 1219956.614709089976 +860 0.0860 53789.7070451918989420 1216491.725215751911 +861 0.0861 53668.2304772250063252 1213039.634122058051 +862 0.0862 53547.0984814671392087 1209600.281035233987 +863 0.0863 53426.3097871196732740 1206173.605914032087 +864 0.0864 53305.8631293706639553 1202759.549066213891 +865 0.0865 53185.7572493600455346 1199358.051146148937 +866 0.0866 53065.9908941451139981 1195969.053152418230 +867 0.0867 52946.5628166662208969 1192592.496425422840 +868 0.0868 52827.4717757127000368 1189228.322645022999 +869 0.0869 52708.7165358890415519 1185876.473828187911 +870 0.0870 52590.2958675812988076 1182536.892326653004 +871 0.0871 52472.2085469237354118 1179209.520824675914 +872 0.0872 52354.4533557656686753 1175894.302336648107 +873 0.0873 52237.0290816385895596 1172591.180204904173 +874 0.0874 52119.9345177234717994 1169300.098097451963 +875 0.0875 52003.1684628183138557 1166021.000005693873 +876 0.0876 51886.7297213059136993 1162753.830242255004 +877 0.0877 51770.6171031218618737 1159498.533438783139 +878 0.0878 51654.8294237227382837 1156255.054543741979 +879 0.0879 51539.3655040545418160 1153023.338820255129 +880 0.0880 51424.2241705213309615 1149803.331843974069 +881 0.0881 51309.4042549540827167 1146594.979500931222 +882 0.0882 51194.9045945797624881 1143398.227985410951 +883 0.0883 51080.7240319905977231 1140213.023797904840 +884 0.0884 50966.8614151135552675 1137039.313742977101 +885 0.0885 50853.3155971800442785 1133877.044927243143 +886 0.0886 50740.0854366958155879 1130726.164757274091 +887 0.0887 50627.1697974110720679 1127586.620937614003 +888 0.0888 50514.5675482907536207 1124458.361468741903 +889 0.0889 50402.2775634850622737 1121341.334645078052 +890 0.0890 50290.2987223001618986 1118235.489052976947 +891 0.0891 50178.6299091690743808 1115140.773568818811 +892 0.0892 50067.2700136227867915 1112057.137356976047 +893 0.0893 49956.2179302615404595 1108984.529867933132 +894 0.0894 49845.4725587263237685 1105922.900836369954 +895 0.0895 49735.0328036705468548 1102872.200279189972 +896 0.0896 49624.8975747318982030 1099832.378493720898 +897 0.0897 49515.0657865044267965 1096803.386055743089 +898 0.0898 49405.5363585107552353 1093785.173817700008 +899 0.0899 49296.3082151745256851 1090777.692906829994 +900 0.0900 49187.3802857930204482 1087780.894723285921 +901 0.0901 49078.7515045099353301 1084794.730938391993 +902 0.0902 48970.4208102883785614 1081819.153492776910 +903 0.0903 48862.3871468840079615 1078854.114594605984 +904 0.0904 48754.6494628183863824 1075899.566717823036 +905 0.0905 48647.2067113524753950 1072955.462600349914 +906 0.0906 48540.0578504603399779 1070021.755242340965 +907 0.0907 48433.2018428029987263 1067098.397904494079 +908 0.0908 48326.6376557024632348 1064185.344106249977 +909 0.0909 48220.3642611159448279 1061282.547624144936 +910 0.0910 48114.3806356102359132 1058389.962490087841 +911 0.0911 48008.6857603362441296 1055507.542989682872 +912 0.0912 47903.2786210037302226 1052635.243660546141 +913 0.0913 47798.1582078561696107 1049773.019290677970 +914 0.0914 47693.3235156457958510 1046920.824916763930 +915 0.0915 47588.7735436088260030 1044078.615822601132 +916 0.0916 47484.5072954408242367 1041246.347537442925 +917 0.0917 47380.5237792722327868 1038423.975834406097 +918 0.0918 47276.8220076440702542 1035611.456728849094 +919 0.0919 47173.4009974837899790 1032808.746476817061 +920 0.0920 47070.2597700812766561 1030015.801573466044 +921 0.0921 46967.3973510650321259 1027232.578751489054 +922 0.0922 46864.8127703784775804 1024459.034979591961 +923 0.0923 46762.5050622564522200 1021695.127460914082 +924 0.0924 46660.4732652018283261 1018940.813631556928 +925 0.0925 46558.7164219623009558 1016196.051159041119 +926 0.0926 46457.2335795073086047 1013460.797940794844 +927 0.0927 46356.0237890051357681 1010735.012102694949 +928 0.0928 46255.0861058001246420 1008018.651997560053 +929 0.0929 46154.4195893900614465 1005311.676203713985 +930 0.0930 46054.0233034037009929 1002614.043523492990 +931 0.0931 45953.8963155784367700 999925.712981808931 +932 0.0932 45854.0376977381092729 997246.643824737053 +933 0.0933 45754.4465257709671278 994576.795518076047 +934 0.0934 45655.1218796077664592 991916.127745938022 +935 0.0935 45556.0628432000012253 989264.600409322069 +936 0.0936 45457.2685044982936233 986622.173624766991 +937 0.0937 45358.7379554309081868 983988.807722919853 +938 0.0938 45260.4702918824041262 981364.463247230044 +939 0.0939 45162.4646136724186363 978749.100952500012 +940 0.0940 45064.7200245346102747 976142.681803605985 +941 0.0941 44967.2356320957260323 973545.166974131949 +942 0.0942 44870.0105478547702660 970956.517845022026 +943 0.0943 44773.0438871623555315 968376.696003305959 +944 0.0944 44676.3347692001552787 965805.663240736816 +945 0.0945 44579.8823169604947907 963243.381552493898 +946 0.0946 44483.6856572260730900 960689.813135927077 +947 0.0947 44387.7439205498158117 958144.920389245031 +948 0.0948 44292.0562412348372163 955608.665910264943 +949 0.0949 44196.6217573145695496 953081.012495103991 +950 0.0950 44101.4396105329651618 950561.923136977945 +951 0.0951 44006.5089463248732500 948051.361024921993 +952 0.0952 43911.8289137964966358 945549.289542560931 +953 0.0953 43817.3986657060231664 943055.672266887035 +954 0.0954 43723.2173584443225991 940570.472967054928 +955 0.0955 43629.2841520158108324 938093.655603144085 +956 0.0956 43535.5982100194014492 935625.184324977919 +957 0.0957 43442.1586996296100551 933165.023470914923 +958 0.0958 43348.9647915777313756 930713.137566696154 +959 0.0959 43256.0156601331837010 928269.491324236966 +960 0.0960 43163.3104830849479185 925834.049640491023 +961 0.0961 43070.8484417231084080 923406.777596260072 +962 0.0962 42978.6287208205394563 920987.640455093933 +963 0.0963 42886.6505086146789836 918576.603662086069 +964 0.0964 42794.9129967894332367 916173.632842814084 +965 0.0965 42703.4153804571833462 913778.693802139023 +966 0.0966 42612.1568581409155740 911391.752523149131 +967 0.0967 42521.1366317564534256 909012.775166041101 +968 0.0968 42430.3539065947989002 906641.728066982934 +969 0.0969 42339.8078913045974332 904278.577737092040 +970 0.0970 42249.4977978746828740 901923.290861252928 +971 0.0971 42159.4228416167607065 899575.834297162015 +972 0.0972 42069.5822411481931340 897236.175074130995 +973 0.0973 41979.9752183748787502 894904.280392158078 +974 0.0974 41890.6009984742340748 892580.117620742996 +975 0.0975 41801.4588098782987799 890263.654297949979 +976 0.0976 41712.5478842569355038 887954.858129310072 +977 0.0977 41623.8674565011315281 885653.696986805997 +978 0.0978 41535.4167647063950426 883360.138907867018 +979 0.0979 41447.1950501562896534 881074.152094305027 +980 0.0980 41359.2015573060052702 878795.704911367036 +981 0.0981 41271.4355337661036174 876524.765886684065 +982 0.0982 41183.8962302863001241 874261.303709313972 +983 0.0983 41096.5829007393986103 872005.287228715024 +984 0.0984 41009.4948021052696276 869756.685453813057 +985 0.0985 40922.6311944549815962 867515.467551996931 +986 0.0986 40835.9913409349755966 865281.602848140988 +987 0.0987 40749.5745077513856813 863055.060823683045 +988 0.0988 40663.3799641544173937 860835.811115645920 +989 0.0989 40577.4069824228499783 858623.823515707045 +990 0.0990 40491.6548378486040747 856419.067969243042 +991 0.0991 40406.1228087214185507 854221.514574397006 +992 0.0992 40320.8101763136437512 852031.133581170114 +993 0.0993 40235.7162248650638503 849847.895390497055 +994 0.0994 40150.8402415678719990 847671.770553320996 +995 0.0995 40066.1815165517182322 845502.729769697995 +996 0.0996 39981.7393428688374115 843340.743887895020 +997 0.0997 39897.5130164792717551 841185.783903490985 +998 0.0998 39813.5018362361734034 839037.820958502009 +999 0.0999 39729.7051038712234003 836896.826340481057 +1000 0.1000 39646.1221239801161573 834762.771481661010 +1001 0.1001 39562.7522040081312298 832635.627958073979 +1002 0.1002 39479.5946542357924045 830515.367488696938 +1003 0.1003 39396.6487877646286506 828401.961934586056 +1004 0.1004 39313.9139205030005542 826295.383298031986 +1005 0.1005 39231.3893711520140641 824195.603721715044 +1006 0.1006 39149.0744611915361020 822102.595487860963 +1007 0.1007 39066.9685148662756546 820016.331017413060 +1008 0.1008 38985.0708591719449032 817936.782869201037 +1009 0.1009 38903.3808238415294909 815863.923739121994 +1010 0.1010 38821.8977413316097227 813797.726459324011 +1011 0.1011 38740.6209468087763526 811738.163997394033 +1012 0.1012 38659.5497781361264060 809685.209455553908 +1013 0.1013 38578.6835758598535904 807638.836069860961 +1014 0.1014 38498.0216831958896364 805599.017209416023 +1015 0.1015 38417.5634460166402278 803565.726375574013 +1016 0.1016 38337.3082128378009656 801538.937201158958 +1017 0.1017 38257.2553348052606452 799518.623449692037 +1018 0.1018 38177.4041656820481876 797504.759014612064 +1019 0.1019 38097.7540618353887112 795497.317918518092 +1020 0.1020 38018.3043822238396388 793496.274312397931 +1021 0.1021 37939.0544883844777360 791501.602474879008 +1022 0.1022 37860.0037444201589096 789513.276811475982 +1023 0.1023 37781.1515169868944213 787531.271853839979 +1024 0.1024 37702.4971752812489285 785555.562259025988 +1025 0.1025 37624.0400910278622177 783586.122808751883 +1026 0.1026 37545.7796384669927647 781622.928408669075 +1027 0.1027 37467.7151943421777105 779665.954087630962 +1028 0.1028 37389.8461378879437689 777715.174996984075 +1029 0.1029 37312.1718508176054456 775770.566409841878 +1030 0.1030 37234.6917173110923613 773832.103720379993 +1031 0.1031 37157.4051240029148175 771899.762443123036 +1032 0.1032 37080.3114599701439147 769973.518212251947 +1033 0.1033 37003.4101167204862577 768053.346780902008 +1034 0.1034 36926.7004881804168690 766139.224020467023 +1035 0.1035 36850.1819706833994132 764231.125919924118 +1036 0.1036 36773.8539629581428017 762329.028585137101 +1037 0.1037 36697.7158661169742118 760432.908238191041 +1038 0.1038 36621.7670836442266591 758542.741216707975 +1039 0.1039 36546.0070213847284322 756658.503973186016 +1040 0.1040 36470.4350875323507353 754780.173074329970 +1041 0.1041 36395.0506926186135388 752907.725200394983 +1042 0.1042 36319.8532495013641892 751041.137144527980 +1043 0.1043 36244.8421733535287785 749180.385812119115 +1044 0.1044 36170.0168816519144457 747325.448220152990 +1045 0.1045 36095.3767941660771612 745476.301496566972 +1046 0.1046 36020.9213329472695477 743632.922879616031 +1047 0.1047 35946.6499223174250801 741795.289717230946 +1048 0.1048 35872.5619888582441490 739963.379466400016 +1049 0.1049 35798.6569614002946764 738137.169692534022 +1050 0.1050 35724.9342710122291464 736316.638068848057 +1051 0.1051 35651.3933509900016361 734501.762375747086 +1052 0.1052 35578.0336368462012615 732692.520500209997 +1053 0.1053 35504.8545662994292798 730888.890435184003 +1054 0.1054 35431.8555792637198465 729090.850278971018 +1055 0.1055 35359.0361178380408091 727298.378234641976 +1056 0.1056 35286.3956262958381558 725511.452609422966 +1057 0.1057 35213.9335510746604996 723730.051814117935 +1058 0.1058 35141.6493407658272190 721954.154362506000 +1059 0.1059 35069.5424461041620816 720183.738870769041 +1060 0.1060 34997.6123199577777996 718418.784056897974 +1061 0.1061 34925.8584173179260688 716659.268740127911 +1062 0.1062 34854.2801952888985397 714905.171840352006 +1063 0.1063 34782.8771130780005478 713156.472377564060 +1064 0.1064 34711.6486319855612237 711413.149471282028 +1065 0.1065 34640.5942153949945350 709675.182339992025 +1066 0.1066 34569.7133287629621918 707942.550300588948 +1067 0.1067 34499.0054396095438278 706215.232767818030 +1068 0.1068 34428.4700175084653893 704493.209253728040 +1069 0.1069 34358.1065340774221113 702776.459367119940 +1070 0.1070 34287.9144629684160464 701064.962813004968 +1071 0.1071 34217.8932798581590760 699358.699392064940 +1072 0.1072 34148.0424624385486823 697657.649000109988 +1073 0.1073 34078.3614904071655474 695961.791627552011 +1074 0.1074 34008.8498454578439123 694271.107358871028 +1075 0.1075 33939.5070112712928676 692585.576372088050 +1076 0.1076 33870.3324735057758517 690905.178938243072 +1077 0.1077 33801.3257197878192528 689229.895420877030 +1078 0.1078 33732.4862397030010470 687559.706275508972 +1079 0.1079 33663.8135247867685393 685894.592049133033 +1080 0.1080 33595.3070685153288650 684234.533379697939 +1081 0.1081 33526.9663662965613184 682579.510995612014 +1082 0.1082 33458.7909154610169935 680929.505715228966 +1083 0.1083 33390.7802152529402520 679284.498446353944 +1084 0.1084 33322.9337668213338475 677644.470185749000 +1085 0.1085 33255.2510732111113612 676009.402018634020 +1086 0.1086 33187.7316393542714650 674379.275118198944 +1087 0.1087 33120.3749720611085650 672754.070745119010 +1088 0.1088 33053.1805800114962040 671133.770247064997 +1089 0.1089 32986.1479737462286721 669518.355058233021 +1090 0.1090 32919.2766656583771692 667907.806698851055 +1091 0.1091 32852.5661699846968986 666302.106774720014 +1092 0.1092 32786.0160027971214731 664701.236976730055 +1093 0.1093 32719.6256819942645961 663105.179080402944 +1094 0.1094 32653.3947272929726751 661513.914945414988 +1095 0.1095 32587.3226602199465560 659927.426515143015 +1096 0.1096 32521.4090041033778107 658345.695816199994 +1097 0.1097 32455.6532840646686964 656768.704957982060 +1098 0.1098 32390.0550270101593924 655196.436132211005 +1099 0.1099 32324.6137616229243577 653628.871612485033 +1100 0.1100 32259.3290183546087064 652065.993753831950 +1101 0.1101 32194.2003294173046015 650507.784992261091 +1102 0.1102 32129.2272287754749414 648954.227844321984 +1103 0.1103 32064.4092521379243408 647405.304906668025 +1104 0.1104 31999.7459369498101296 645860.998855615035 +1105 0.1105 31935.2368223846933688 644321.292446707957 +1106 0.1106 31870.8814493366444367 642786.168514293968 +1107 0.1107 31806.6793604123740806 641255.609971089056 +1108 0.1108 31742.6300999234335904 639729.599807751016 +1109 0.1109 31678.7332138784222479 638208.121092465008 +1110 0.1110 31614.9882499752748117 636691.156970513985 +1111 0.1111 31551.3947575935562782 635178.690663862973 +1112 0.1112 31487.9522877868257638 633670.705470746965 +1113 0.1113 31424.6603932750258537 632167.184765257989 +1114 0.1114 31361.5186284369156056 630668.111996929976 +1115 0.1115 31298.5265493025508476 629173.470690336078 +1116 0.1116 31235.6837135458008561 627683.244444686919 +1117 0.1117 31172.9896804768941365 626197.416933416040 +1118 0.1118 31110.4440110350333271 624715.971903795958 +1119 0.1119 31048.0462677810173773 623238.893176528974 +1120 0.1120 30985.7960148899219348 621766.164645357989 +1121 0.1121 30923.6928181438197498 620297.770276671974 +1122 0.1122 30861.7362449245301832 618833.694109119009 +1123 0.1123 30799.9258642064123705 617373.920253211982 +1124 0.1124 30738.2612465492056799 615918.432890953962 +1125 0.1125 30676.7419640908847214 614467.216275444953 +1126 0.1126 30615.3675905405871163 613020.254730510060 +1127 0.1127 30554.1377011715449044 611577.532650317065 +1128 0.1128 30493.0518728140777966 610139.034498998895 +1129 0.1129 30432.1096838486118941 608704.744810289936 +1130 0.1130 30371.3107141987384239 607274.648187143030 +1131 0.1131 30310.6545453243124939 605848.729301369051 +1132 0.1132 30250.1407602145809506 604426.972893266007 +1133 0.1133 30189.7689433813538926 603009.363771257922 +1134 0.1134 30129.5386808522125648 601595.886811536970 +1135 0.1135 30069.4495601637499931 600186.526957690017 +1136 0.1136 30009.5011703548480000 598781.269220357062 +1137 0.1137 29949.6931019599869614 597380.098676864058 +1138 0.1138 29890.0249470025992196 595983.000470884028 +1139 0.1139 29830.4962989884515991 594589.959812068031 +1140 0.1140 29771.1067528990643041 593200.961975710001 +1141 0.1141 29711.8559051851589174 591815.992302397965 +1142 0.1142 29652.7433537601573335 590435.036197663983 +1143 0.1143 29593.7686979936916032 589058.079131648992 +1144 0.1144 29534.9315387051719881 587685.106638756930 +1145 0.1145 29476.2314781573695655 586316.104317321908 +1146 0.1146 29417.6681200500388513 584951.057829267927 +1147 0.1147 29359.2410695135877177 583589.952899776981 +1148 0.1148 29300.9499331027509470 582232.775316956919 +1149 0.1149 29242.7943187903292710 580879.510931511060 +1150 0.1150 29184.7738359609320469 579530.145656408975 +1151 0.1151 29126.8880954047817795 578184.665466565988 +1152 0.1152 29069.1367093115295575 576843.056398511049 +1153 0.1153 29011.5192912640995928 575505.304550070083 +1154 0.1154 28954.0354562325919687 574171.396080048988 +1155 0.1155 28896.6848205681926629 572841.317207906977 +1156 0.1156 28839.4670019971235888 571515.054213448078 +1157 0.1157 28782.3816196146253787 570192.593436502037 +1158 0.1158 28725.4282938789692707 568873.921276616049 +1159 0.1159 28668.6066466055017372 567559.024192741956 +1160 0.1160 28611.9163009607182175 566247.888702925993 +1161 0.1161 28555.3568814563732303 564940.501384005998 +1162 0.1162 28498.9280139436086756 563636.848871304072 +1163 0.1163 28442.6293256071257929 562336.917858326109 +1164 0.1164 28386.4604449593862228 561040.695096455049 +1165 0.1165 28330.4210018348312587 559748.167394660064 +1166 0.1166 28274.5106273841374787 558459.321619190043 +1167 0.1167 28218.7289540685123939 557174.144693284994 +1168 0.1168 28163.0756156540046504 555892.623596877092 +1169 0.1169 28107.5502472058469721 554614.745366301038 +1170 0.1170 28052.1524850828318449 553340.497094004997 +1171 0.1171 27996.8819669317199441 552069.865928255022 +1172 0.1172 27941.7383316816631122 550802.839072859031 +1173 0.1173 27886.7212195386782696 549539.403786869021 +1174 0.1174 27831.8302719801176863 548279.547384307953 +1175 0.1175 27777.0651317492083763 547023.257233883021 +1176 0.1176 27722.4254428495805769 545770.520758708008 +1177 0.1177 27667.9108505398435227 544521.325436015031 +1178 0.1178 27613.5210013281975989 543275.658796895063 +1179 0.1179 27559.2555429670537706 542033.508426008048 +1180 0.1180 27505.1141244476893917 540794.861961313058 +1181 0.1181 27451.0963959949331183 539559.707093801931 +1182 0.1182 27397.2020090618825634 538328.031567219994 +1183 0.1183 27343.4306163246328651 537099.823177805054 +1184 0.1184 27289.7818716770416358 535875.069774013944 +1185 0.1185 27236.2554302255266521 534653.759256264078 +1186 0.1186 27182.8509482838817348 533435.879576659063 +1187 0.1187 27129.5680833681108197 532221.418738738983 +1188 0.1188 27076.4064941913129587 531010.364797209040 +1189 0.1189 27023.3658406585673220 529802.705857682042 +1190 0.1190 26970.4457838618618553 528598.430076428922 +1191 0.1191 26917.6459860750364896 527397.525660109008 +1192 0.1192 26864.9661107487554546 526199.980865526013 +1193 0.1193 26812.4058225055123330 525005.783999370993 +1194 0.1194 26759.9647871346460306 523814.923417967046 +1195 0.1195 26707.6426715873967623 522627.387527025014 +1196 0.1196 26655.4391439719765913 521443.164781393018 +1197 0.1197 26603.3538735486654332 520262.243684803019 +1198 0.1198 26551.3865307249434409 519084.612789632054 +1199 0.1199 26499.5367870506306645 517910.260696655023 +1200 0.1200 26447.8043152130594535 516739.176054804004 +1201 0.1201 26396.1887890322723251 515571.347560920985 +1202 0.1202 26344.6898834562489355 514406.763959519041 +1203 0.1203 26293.3072745561439660 513245.414042550023 +1204 0.1204 26242.0406395215577504 512087.286649158050 +1205 0.1205 26190.8896566558287304 510932.370665450988 +1206 0.1206 26139.8540053713441011 509780.655024259002 +1207 0.1207 26088.9333661848868360 508632.128704904986 +1208 0.1208 26038.1274207129936258 507486.780732974003 +1209 0.1209 25987.4358516673419217 506344.600180075970 +1210 0.1210 25936.8583428501551680 505205.576163625985 +1211 0.1211 25886.3945791496444144 504069.697846606025 +1212 0.1212 25836.0442465354462911 502936.954437347944 +1213 0.1213 25785.8070320541155525 501807.335189298028 +1214 0.1214 25735.6826238246103458 500680.829400803021 +1215 0.1215 25685.6707110338247730 499557.426414882066 +1216 0.1216 25635.7709839321323670 498437.115618998010 +1217 0.1217 25585.9831338289404812 497319.886444858043 +1218 0.1218 25536.3068530882883351 496205.728368169046 +1219 0.1219 25486.7418351244596124 495094.630908440042 +1220 0.1220 25437.2877743975986959 493986.583628752036 +1221 0.1221 25387.9443664093851112 492881.576135555049 +1222 0.1222 25338.7113076986861415 491779.598078440002 +1223 0.1223 25289.5882958372676512 490680.639149940980 +1224 0.1224 25240.5750294255049084 489584.689085314050 +1225 0.1225 25191.6712080881225120 488491.737662323983 +1226 0.1226 25142.8765324699525081 487401.774701049027 +1227 0.1227 25094.1907042317179730 486314.790063656983 +1228 0.1228 25045.6134260458238714 485230.773654210032 +1229 0.1229 24997.1444015921915707 484149.715418452048 +1230 0.1230 24948.7833355540897173 483071.605343610980 +1231 0.1231 24900.5299336140014930 481996.433458185056 +1232 0.1232 24852.3839024495027843 480924.189831754018 +1233 0.1233 24804.3449497291767329 479854.864574767998 +1234 0.1234 24756.4127841085210093 478788.447838351014 +1235 0.1235 24708.5871152258987422 477724.929814103991 +1236 0.1236 24660.8676536984967242 476664.300733903947 +1237 0.1237 24613.2541111183163594 475606.550869711034 +1238 0.1238 24565.7462000481609721 474551.670533370052 +1239 0.1239 24518.3436340176704107 473499.650076418009 +1240 0.1240 24471.0461275193556503 472450.479889890063 +1241 0.1241 24423.8533960046552238 471404.150404132030 +1242 0.1242 24376.7651558800171188 470360.652088598057 +1243 0.1243 24329.7811245030025020 469319.975451678038 +1244 0.1244 24282.9010201783930825 468282.111040490039 +1245 0.1245 24236.1245621543348534 467247.049440708011 +1246 0.1246 24189.4514706184818351 466214.781276364054 +1247 0.1247 24142.8814666941798350 465185.297209671000 +1248 0.1248 24096.4142724366538459 464158.587940833066 +1249 0.1249 24050.0496108292172721 463134.644207864010 +1250 0.1250 24003.7872057795029832 462113.456786404015 +1251 0.1251 23957.6267821157052822 461095.016489536967 +1252 0.1252 23911.5680655828473391 460079.314167614037 +1253 0.1253 23865.6107828390631767 459066.340708071017 +1254 0.1254 23819.7546614518978458 458056.087035248987 +1255 0.1255 23773.9994298946257913 457048.544110219984 +1256 0.1256 23728.3448175425837690 456043.702930607018 +1257 0.1257 23682.7905546695328667 455041.554530414927 +1258 0.1258 23637.3363724440205260 454042.089979845041 +1259 0.1259 23591.9820029257716669 453045.300385135051 +1260 0.1260 23546.7271790620980028 452051.176888371992 +1261 0.1261 23501.5716346843109932 451059.710667336010 +1262 0.1262 23456.5151045041784528 450070.892935316078 +1263 0.1263 23411.5573241103666078 449084.714940948004 +1264 0.1264 23366.6980299649185326 448101.167968044057 +1265 0.1265 23321.9369593997435004 447120.243335424922 +1266 0.1266 23277.2738506131354370 446141.932396751072 +1267 0.1267 23232.7084426662804617 445166.226540360949 +1268 0.1268 23188.2404754798080830 444193.117189103039 +1269 0.1269 23143.8696898303460330 443222.595800167997 +1270 0.1270 23099.5958273470896529 442254.653864936030 +1271 0.1271 23055.4186305084040214 441289.282908802968 +1272 0.1272 23011.3378426384115301 440326.474491027999 +1273 0.1273 22967.3532079036303912 439366.220204562997 +1274 0.1274 22923.4644713096058695 438408.511675905029 +1275 0.1275 22879.6713786975633411 437453.340564931044 +1276 0.1276 22835.9736767410795437 436500.698564734950 +1277 0.1277 22792.3711129427683773 435550.577401480055 +1278 0.1278 22748.8634356309812574 434602.968834241037 +1279 0.1279 22705.4503939565256587 433657.864654839970 +1280 0.1280 22662.1317378893982095 432715.256687703950 +1281 0.1281 22618.9072182155287010 431775.136789702985 +1282 0.1282 22575.7765865335422859 430837.496850000985 +1283 0.1283 22532.7395952515471436 429902.328789903026 +1284 0.1284 22489.7959975839185063 428969.624562703015 +1285 0.1285 22446.9455475481081521 428039.376153534977 +1286 0.1286 22404.1879999614720873 427111.575579222001 +1287 0.1287 22361.5231104381055047 426186.214888131013 +1288 0.1288 22318.9506353856995702 425263.286160019925 +1289 0.1289 22276.4703320024054847 424342.781505895953 +1290 0.1290 22234.0819582737167366 423424.693067861954 +1291 0.1291 22191.7852729693731817 422509.013018981030 +1292 0.1292 22149.5800356402687612 421595.733563123038 +1293 0.1293 22107.4660066153701337 420684.846934824018 +1294 0.1294 22065.4429469986716867 419776.345399144979 +1295 0.1295 22023.5106186661396350 418870.221251526033 +1296 0.1296 21981.6687842626815836 417966.466817646055 +1297 0.1297 21939.9172071991342818 417065.074453286012 +1298 0.1298 21898.2556516492622904 416166.036544181989 +1299 0.1299 21856.6838825467602874 415269.345505887992 +1300 0.1300 21815.2016655822844768 414374.993783643993 +1301 0.1301 21773.8087672004912747 413482.973852225987 +1302 0.1302 21732.5049545970905456 412593.278215822997 +1303 0.1303 21691.2899957159061159 411705.899407887016 +1304 0.1304 21650.1636592459617532 410820.829991008970 +1305 0.1305 21609.1257146185707825 409938.062556774996 +1306 0.1306 21568.1759320044511696 409057.589725638041 +1307 0.1307 21527.3140823108296900 408179.404146785033 +1308 0.1308 21486.5399371785897529 407303.498497997003 +1309 0.1309 21445.8532689794119506 406429.865485524992 +1310 0.1310 21405.2538508129364345 405558.497843955993 +1311 0.1311 21364.7414565039362060 404689.388336081989 +1312 0.1312 21324.3158605994940444 403822.529752767994 +1313 0.1313 21283.9768383662158158 402957.914912828011 +1314 0.1314 21243.7241657874292287 402095.536662893021 +1315 0.1315 21203.5576195604189707 401235.387877283036 +1316 0.1316 21163.4769770936618443 400377.461457880971 +1317 0.1317 21123.4820165040691791 399521.750334005046 +1318 0.1318 21083.5725166142547096 398668.247462289990 +1319 0.1319 21043.7482569498133671 397816.945826548035 +1320 0.1320 21004.0090177366037096 396967.838437656057 +1321 0.1321 20964.3545798980485415 396120.918333431007 +1322 0.1322 20924.7847250524537230 395276.178578498017 +1323 0.1323 20885.2992355103197042 394433.612264180963 +1324 0.1324 20845.8978942716930760 393593.212508365978 +1325 0.1325 20806.5804850235035701 392754.972455394978 +1326 0.1326 20767.3467921369374380 391918.885275935056 +1327 0.1327 20728.1966006647962786 391084.944166861009 +1328 0.1328 20689.1296963388958829 390253.142351138988 +1329 0.1329 20650.1458655674541660 389423.473077703035 +1330 0.1330 20611.2448954325009254 388595.929621341988 +1331 0.1331 20572.4265736873057904 387770.505282581027 +1332 0.1332 20533.6906887537988950 386947.193387559033 +1333 0.1333 20495.0370297200242931 386125.987287920958 +1334 0.1334 20456.4653863375933724 385306.880360698968 +1335 0.1335 20417.9755490191491845 384489.866008194978 +1336 0.1336 20379.5673088358453242 383674.937657869013 +1337 0.1337 20341.2404575148393633 382862.088762225001 +1338 0.1338 20302.9947874367935583 382051.312798699015 +1339 0.1339 20264.8300916333828354 381242.603269541985 +1340 0.1340 20226.7461637848209648 380435.953701717022 +1341 0.1341 20188.7427982173976488 379631.357646775024 +1342 0.1342 20150.8197899010228866 378828.808680755959 +1343 0.1343 20112.9769344467822521 378028.300404071982 +1344 0.1344 20075.2140281045103620 377229.826441398996 +1345 0.1345 20037.5308677603607066 376433.380441571004 +1346 0.1346 19999.9272509344082209 375638.956077466020 +1347 0.1347 19962.4029757782409433 374846.547045902000 +1348 0.1348 19924.9578410725698632 374056.147067527985 +1349 0.1349 19887.5916462248569587 373267.749886717007 +1350 0.1350 19850.3041912669468729 372481.349271464976 +1351 0.1351 19813.0952768527095031 371696.939013275027 +1352 0.1352 19775.9647042556935048 370914.512927061005 +1353 0.1353 19738.9122753667870711 370134.064851039962 +1354 0.1354 19701.9377926919041784 369355.588646628021 +1355 0.1355 19665.0410593496562797 368579.078198335017 +1356 0.1356 19628.2218790690567403 367804.527413666015 +1357 0.1357 19591.4800561872216349 367031.930223015021 +1358 0.1358 19554.8153956470923731 366261.280579564977 +1359 0.1359 19518.2277029951546865 365492.572459184041 +1360 0.1360 19481.7167843791794439 364725.799860329018 +1361 0.1361 19445.2824465459671046 363960.956803938956 +1362 0.1362 19408.9244968391030852 363198.037333342945 +1363 0.1363 19372.6427431967276789 362437.035514154995 +1364 0.1364 19336.4369941493096121 361677.945434172987 +1365 0.1365 19300.3070588174377917 360920.761203292001 +1366 0.1366 19264.2527469096021377 360165.476953392965 +1367 0.1367 19228.2738687200217100 359412.086838252028 +1368 0.1368 19192.3702351264364552 358660.585033445037 +1369 0.1369 19156.5416575879535230 357910.965736248007 +1370 0.1370 19120.7879481428644795 357163.223165542004 +1371 0.1371 19085.1089194065025367 356417.351561720017 +1372 0.1372 19049.5043845690888702 355673.345186588995 +1373 0.1373 19013.9741573935971246 354931.198323277000 +1374 0.1374 18978.5180522136251966 354190.905276139965 +1375 0.1375 18943.1358839312852069 353452.460370667977 +1376 0.1376 18907.8274680150825588 352715.857953391969 +1377 0.1377 18872.5926204978241003 351981.092391790007 +1378 0.1378 18837.4311579745262861 351248.158074200968 +1379 0.1379 18802.3428976003306161 350517.049409724015 +1380 0.1380 18767.3276570884372632 349787.760828134022 +1381 0.1381 18732.3852547080423392 349060.286779791000 +1382 0.1382 18697.5155092822751612 348334.621735547029 +1383 0.1383 18662.7182401861646213 347610.760186658998 +1384 0.1384 18627.9932673445982800 346888.696644698037 +1385 0.1385 18593.3404112302887370 346168.425641460984 +1386 0.1386 18558.7594928617727419 345449.941728882026 +1387 0.1387 18524.2503338013812026 344733.239478947013 +1388 0.1388 18489.8127561532528489 344018.313483600970 +1389 0.1389 18455.4465825613406196 343305.158354668994 +1390 0.1390 18421.1516362074180506 342593.768723762012 +1391 0.1391 18386.9277408091220423 341884.139242194011 +1392 0.1392 18352.7747206179665227 341176.264580897987 +1393 0.1393 18318.6924004174034053 340470.139430337003 +1394 0.1394 18284.6806055208653561 339765.758500422991 +1395 0.1395 18250.7391617698231130 339063.116520430020 +1396 0.1396 18216.8678955318573571 338362.208238911990 +1397 0.1397 18183.0666336987305840 337663.028423618060 +1398 0.1398 18149.3352036844808026 336965.571861409000 +1399 0.1399 18115.6734334235006827 336269.833358176984 +1400 0.1400 18082.0811513686530816 335575.807738761010 +1401 0.1401 18048.5581864893720194 334883.489846865996 +1402 0.1402 18015.1043682697782060 334192.874544978957 +1403 0.1403 17981.7195267068127578 333503.956714294967 +1404 0.1404 17948.4034923083672766 332816.731254626997 +1405 0.1405 17915.1560960914175666 332131.193084332976 +1406 0.1406 17881.9771695801900933 331447.337140234013 +1407 0.1407 17848.8665448043029755 330765.158377530985 +1408 0.1408 17815.8240542969397211 330084.651769732009 +1409 0.1409 17782.8495310930229607 329405.812308572000 +1410 0.1410 17749.9428087273990968 328728.635003929026 +1411 0.1411 17717.1037212330156763 328053.114883755043 +1412 0.1412 17684.3321031391278666 327379.246993991022 +1413 0.1413 17651.6277894695049326 326707.026398491987 +1414 0.1414 17618.9906157406330749 326036.448178955994 +1415 0.1415 17586.4204179599437339 325367.507434838975 +1416 0.1416 17553.9170326240382565 324700.199283284019 +1417 0.1417 17521.4802967169234762 324034.518859043950 +1418 0.1418 17489.1100477082509315 323370.461314409971 +1419 0.1419 17456.8061235515742737 322708.021819129994 +1420 0.1420 17424.5683626825993997 322047.195560340013 +1421 0.1421 17392.3966040174564114 321387.977742488030 +1422 0.1422 17360.2906869509679382 320730.363587258034 +1423 0.1423 17328.2504513549283729 320074.348333503003 +1424 0.1424 17296.2757375763940217 319419.927237165975 +1425 0.1425 17264.3663864359768922 318767.095571206999 +1426 0.1426 17232.5222392261384812 318115.848625535960 +1427 0.1427 17200.7431377095163043 317466.181706939009 +1428 0.1428 17169.0289241172176844 316818.090139002015 +1429 0.1429 17137.3794411471644707 316171.569262047997 +1430 0.1430 17105.7945319624086551 315526.614433057024 +1431 0.1431 17074.2740401894770912 314883.221025603008 +1432 0.1432 17042.8178099167089385 314241.384429780010 +1433 0.1433 17011.4256856926149339 313601.100052133959 +1434 0.1434 16980.0975125242293871 312962.363315591007 +1435 0.1435 16948.8331358754803659 312325.169659390987 +1436 0.1436 16917.6324016655598825 311689.514539016993 +1437 0.1437 16886.4951562673013541 311055.393426127965 +1438 0.1438 16855.4212465055716166 310422.801808487973 +1439 0.1439 16824.4105196556520241 309791.735189903993 +1440 0.1440 16793.4628234416486521 309162.189090151980 +1441 0.1441 16762.5780060348952247 308534.159044914006 +1442 0.1442 16731.7559160523633182 307907.640605709981 +1443 0.1443 16700.9964025550871156 307282.629339828971 +1444 0.1444 16670.2993150465808867 306659.120830268948 +1445 0.1445 16639.6645034712855704 306037.110675667005 +1446 0.1446 16609.0918182129898923 305416.594490231946 +1447 0.1447 16578.5811100932951376 304797.567903682997 +1448 0.1448 16548.1322303700508201 304180.026561181992 +1449 0.1449 16517.7450307358267310 303563.966123271035 +1450 0.1450 16487.4193633163740742 302949.382265808992 +1451 0.1451 16457.1550806690902391 302336.270679901994 +1452 0.1452 16426.9520357815017633 301724.627071848023 +1453 0.1453 16396.8100820697545714 301114.447163064964 +1454 0.1454 16366.7290733770987572 300505.726690036012 +1455 0.1455 16336.7088639723842789 299898.461404239992 +1456 0.1456 16306.7493085485675692 299292.647072092979 +1457 0.1457 16276.8502622212181450 298688.279474884970 +1458 0.1458 16247.0115805270379497 298085.354408718005 +1459 0.1459 16217.2331194223806961 297483.867684443947 +1460 0.1460 16187.5147352817784849 296883.815127606038 +1461 0.1461 16157.8562848964793375 296285.192578374001 +1462 0.1462 16128.2576254729865468 295687.995891486993 +1463 0.1463 16098.7186146316034865 295092.220936189988 +1464 0.1464 16069.2391104049856949 294497.863596178009 +1465 0.1465 16039.8189712367002357 293904.919769530999 +1466 0.1466 16010.4580559797905153 293313.385368657997 +1467 0.1467 15981.1562238953465567 292723.256320238987 +1468 0.1468 15951.9133346510770934 292134.528565162967 +1469 0.1469 15922.7292483198962145 291547.198058468988 +1470 0.1470 15893.6038253785081906 290961.260769291024 +1471 0.1471 15864.5369267060032143 290376.712680797034 +1472 0.1472 15835.5284135824567784 289793.549790133955 +1473 0.1473 15806.5781476875308726 289211.768108367978 +1474 0.1474 15777.6859910990915523 288631.363660425995 +1475 0.1475 15748.8518062918174110 288052.332485044026 +1476 0.1476 15720.0754561358298815 287474.670634704002 +1477 0.1477 15691.3568038953162613 286898.374175579986 +1478 0.1478 15662.6957132271636510 286323.439187486016 +1479 0.1479 15634.0920481795983505 285749.861763812951 +1480 0.1480 15605.5456731908343500 285177.638011481031 +1481 0.1481 15577.0564530877163634 284606.764050871949 +1482 0.1482 15548.6242530843828717 284037.236015790957 +1483 0.1483 15520.2489387809237087 283469.050053396961 +1484 0.1484 15491.9303761620467412 282902.202324156999 +1485 0.1485 15463.6684315957500075 282336.689001785009 +1486 0.1486 15435.4629718320011307 281772.506273195031 +1487 0.1487 15407.3138640014185512 281209.650338443986 +1488 0.1488 15379.2209756139618548 280648.117410675040 +1489 0.1489 15351.1841745576239191 280087.903716070985 +1490 0.1490 15323.2033290971303359 279529.005493793986 +1491 0.1491 15295.2783078726442909 278971.418995938031 +1492 0.1492 15267.4089798984732624 278415.140487474971 +1493 0.1493 15239.5952145617902715 277860.166246202018 +1494 0.1494 15211.8368816213460377 277306.492562689004 +1495 0.1495 15184.1338512062011432 276754.115740226989 +1496 0.1496 15156.4859938144509215 276203.032094775990 +1497 0.1497 15128.8931803119667165 275653.237954917946 +1498 0.1498 15101.3552819311316853 275104.729661797988 +1499 0.1499 15073.8721702695875138 274557.503569082008 +1500 0.1500 15046.4437172889884096 274011.556042896991 +1501 0.1501 15019.0697953137532750 273466.883461789985 +1502 0.1502 14991.7502770298306132 272923.482216670993 +1503 0.1503 14964.4850354834579775 272381.348710766993 +1504 0.1504 14937.2739440799414297 271840.479359567980 +1505 0.1505 14910.1168765824240836 271300.870590784994 +1506 0.1506 14883.0137071106710209 270762.518844294013 +1507 0.1507 14855.9643101398523868 270225.420572086994 +1508 0.1508 14828.9685604993374000 269689.572238230030 +1509 0.1509 14802.0263333714847249 269154.970318806008 +1510 0.1510 14775.1375042904510337 268621.611301874975 +1511 0.1511 14748.3019491409868351 268089.491687415983 +1512 0.1512 14721.5195441572523123 267558.607987290015 +1513 0.1513 14694.7901659216277039 267028.956725184980 +1514 0.1514 14668.1136913635400560 266500.534436571004 +1515 0.1515 14641.4899977582790598 265973.337668652006 +1516 0.1516 14614.9189627258310793 265447.362980321981 +1517 0.1517 14588.4004642297095415 264922.606942113023 +1518 0.1518 14561.9343805757962400 264399.066136152949 +1519 0.1519 14535.5205904111826385 263876.737156116986 +1520 0.1520 14509.1589727230166318 263355.616607184988 +1521 0.1521 14482.8494068373584014 262835.701105988992 +1522 0.1522 14456.5917724180308142 262316.987280572008 +1523 0.1523 14430.3859494654843729 261799.471770346980 +1524 0.1524 14404.2318183156658051 261283.151226039976 +1525 0.1525 14378.1292596388811944 260768.022309655003 +1526 0.1526 14352.0781544386773021 260254.081694427005 +1527 0.1527 14326.0783840507174318 259741.326064772991 +1528 0.1528 14300.1298301416663890 259229.752116253978 +1529 0.1529 14274.2323747080772591 258719.356555524981 +1530 0.1530 14248.3859000752854627 258210.136100295000 +1531 0.1531 14222.5902888963064470 257702.087479281996 +1532 0.1532 14196.8454241507333791 257195.207432166993 +1533 0.1533 14171.1511891436475707 256689.492709556012 +1534 0.1534 14145.5074675045234471 256184.940072931000 +1535 0.1535 14119.9141431861462479 255681.546294608037 +1536 0.1536 14094.3711004635315476 255179.308157702966 +1537 0.1537 14068.8782239328429569 254678.222456071991 +1538 0.1538 14043.4353985103243758 254178.285994283971 +1539 0.1539 14018.0425094312322472 253679.495587576006 +1540 0.1540 13992.6994422487623524 253181.848061803961 +1541 0.1541 13967.4060828330020740 252685.340253403992 +1542 0.1542 13942.1623173698644678 252189.969009358028 +1543 0.1543 13916.9680323600387055 251695.731187142024 +1544 0.1544 13891.8231146179477946 251202.623654689989 +1545 0.1545 13866.7274512706953828 250710.643290349981 +1546 0.1546 13841.6809297570362105 250219.786982849997 +1547 0.1547 13816.6834378263320104 249730.051631247974 +1548 0.1548 13791.7348635375255981 249241.434144897969 +1549 0.1549 13766.8350952581113233 248753.931443405017 +1550 0.1550 13741.9840216631109797 248267.540456590999 +1551 0.1551 13717.1815317340588081 247782.258124449989 +1552 0.1552 13692.4275147579810437 247298.081397106987 +1553 0.1553 13667.7218603263863770 246815.007234783028 +1554 0.1554 13643.0644583342600527 246333.032607754983 +1555 0.1555 13618.4551989790561493 245852.154496311996 +1556 0.1556 13593.8939727597044111 245372.369890721020 +1557 0.1557 13569.3806704756098043 244893.675791187037 +1558 0.1558 13544.9151832256593480 244416.069207810971 +1559 0.1559 13520.4974024072416796 243939.547160556016 +1560 0.1560 13496.1272197152538865 243464.106679205986 +1561 0.1561 13471.8045271411265276 242989.744803326030 +1562 0.1562 13447.5292169718486548 242516.458582230960 +1563 0.1563 13423.3011817889910162 242044.245074938022 +1564 0.1564 13399.1203144677365344 241573.101350138983 +1565 0.1565 13374.9865081759216991 241103.024486153998 +1566 0.1566 13350.8996563730688649 240634.011570900999 +1567 0.1567 13326.8596528094312816 240166.059701850987 +1568 0.1568 13302.8663915250381251 239699.165986002015 +1569 0.1569 13278.9197668487468036 239233.327539830003 +1570 0.1570 13255.0196733972916263 238768.541489262017 +1571 0.1571 13231.1660060743470240 238304.804969632009 +1572 0.1572 13207.3586600695834932 237842.115125651006 +1573 0.1573 13183.5975308577326359 237380.469111365965 +1574 0.1574 13159.8825141976576560 236919.864090127987 +1575 0.1575 13136.2135061314238555 236460.297234553029 +1576 0.1576 13112.5904029833727691 236001.765726484999 +1577 0.1577 13089.0131013591999363 235544.266756964964 +1578 0.1578 13065.4814981450417690 235087.797526195034 +1579 0.1579 13041.9954905065569619 234632.355243497004 +1580 0.1580 13018.5549758880169975 234177.937127284997 +1581 0.1581 12995.1598520114021085 233724.540405025997 +1582 0.1582 12971.8100168754899641 233272.162313206005 +1583 0.1583 12948.5053687549643655 232820.800097297004 +1584 0.1584 12925.2458061995130265 232370.451011719008 +1585 0.1585 12902.0312280329362693 231921.112319809035 +1586 0.1586 12878.8615333522557194 231472.781293786014 +1587 0.1587 12855.7366215268302767 231025.455214715970 +1588 0.1588 12832.6563921974702680 230579.131372478994 +1589 0.1589 12809.6207452755588747 230133.807065736997 +1590 0.1590 12786.6295809421771992 229689.479601894971 +1591 0.1591 12763.6827996472293307 229246.146297072992 +1592 0.1592 12740.7803021085728687 228803.804476070014 +1593 0.1593 12717.9219893111530837 228362.451472334011 +1594 0.1594 12695.1077625061407161 227922.084627925011 +1595 0.1595 12672.3375232100697758 227482.701293484017 +1596 0.1596 12649.6111732039862545 227044.298828199971 +1597 0.1597 12626.9286145325877442 226606.874599777977 +1598 0.1598 12604.2897495033776067 226170.425984406960 +1599 0.1599 12581.6944806858209631 225734.950366726029 +1600 0.1600 12559.1427109104952251 225300.445139793999 +1601 0.1601 12536.6343432682533603 224866.907705056015 +1602 0.1602 12514.1692811093853379 224434.335472312989 +1603 0.1603 12491.7474280427850317 224002.725859687984 +1604 0.1604 12469.3686879351207608 223572.076293597987 +1605 0.1605 12447.0329649100040115 223142.384208720003 +1606 0.1606 12424.7401633471708919 222713.647047957988 +1607 0.1607 12402.4901878816526732 222285.862262415991 +1608 0.1608 12380.2829434029627009 221859.027311365993 +1609 0.1609 12358.1183350542833068 221433.139662213973 +1610 0.1610 12335.9962682316490827 221008.196790474001 +1611 0.1611 12313.9166485831392492 220584.196179731021 +1612 0.1612 12291.8793820080718433 220161.135321618989 +1613 0.1613 12269.8843746562015440 219739.011715782981 +1614 0.1614 12247.9315329269193171 219317.822869853029 +1615 0.1615 12226.0207634684556979 218897.566299413040 +1616 0.1616 12204.1519731770858925 218478.239527969970 +1617 0.1617 12182.3250691963403369 218059.840086926532 +1618 0.1618 12160.5399589162170741 217642.365515548503 +1619 0.1619 12138.7965499723923131 217225.813360935979 +1620 0.1620 12117.0947502454455389 216810.181177995924 +1621 0.1621 12095.4344678600755287 216395.466529411293 +1622 0.1622 12073.8156111843236431 215981.666985612013 +1623 0.1623 12052.2380888288062124 215568.780124744575 +1624 0.1624 12030.7018096459360095 215156.803532646736 +1625 0.1625 12009.2066827291637310 214745.734802814317 +1626 0.1626 11987.7526174122049269 214335.571536375966 +1627 0.1627 11966.3395232682833011 213926.311342064786 +1628 0.1628 11944.9673101093703735 213517.951836185326 +1629 0.1629 11923.6358879854324186 213110.490642591089 +1630 0.1630 11902.3451671836701280 212703.925392653095 +1631 0.1631 11881.0950582277764624 212298.253725232120 +1632 0.1632 11859.8854718771817716 211893.473286651017 +1633 0.1633 11838.7163191263152839 211489.581730667793 +1634 0.1634 11817.5875112038593215 211086.576718447905 +1635 0.1635 11796.4989595720107900 210684.455918533728 +1636 0.1636 11775.4505759257426689 210283.217006821185 +1637 0.1637 11754.4422721920745971 209882.857666529191 +1638 0.1638 11733.4739605293398199 209483.375588175171 +1639 0.1639 11712.5455533264539554 209084.768469546107 +1640 0.1640 11691.6569632021928555 208687.034015673271 +1641 0.1641 11670.8081030044686486 208290.169938802486 +1642 0.1642 11649.9988858096094191 207894.173958368599 +1643 0.1643 11629.2292249216425262 207499.043800973042 +1644 0.1644 11608.4990338715761027 207104.777200348122 +1645 0.1645 11587.8082264166914683 206711.371897339908 +1646 0.1646 11567.1567165398300858 206318.825639878807 +1647 0.1647 11546.5444184486877930 205927.136182948831 +1648 0.1648 11525.9712465751126729 205536.301288570510 +1649 0.1649 11505.4371155743956479 205146.318725764286 +1650 0.1650 11484.9419403245810827 204757.186270534410 +1651 0.1651 11464.4856359257628355 204368.901705837168 +1652 0.1652 11444.0681176993930421 203981.462821557187 +1653 0.1653 11423.6893011875908996 203594.867414484004 +1654 0.1654 11403.3491021524532698 203209.113288281253 +1655 0.1655 11383.0474365753652819 202824.198253465758 +1656 0.1656 11362.7842206563236687 202440.120127381873 +1657 0.1657 11342.5593708132455504 202056.876734175894 +1658 0.1658 11322.3728036812990467 201674.465904769080 +1659 0.1659 11302.2244361122193368 201292.885476837517 +1660 0.1660 11282.1141851736392709 200912.133294781379 +1661 0.1661 11262.0419681484145258 200532.207209704095 +1662 0.1662 11242.0077025339596730 200153.105079390458 +1663 0.1663 11222.0113060415769723 199774.824768273218 +1664 0.1664 11202.0526965957924403 199397.364147418004 +1665 0.1665 11182.1317923336973763 199020.721094493521 +1666 0.1666 11162.2485116042844311 198644.893493751995 +1667 0.1667 11142.4027729677964089 198269.879235997680 +1668 0.1668 11122.5944951950677932 197895.676218572189 +1669 0.1669 11102.8235972668735485 197522.282345322659 +1670 0.1670 11083.0899983732779219 197149.695526583819 +1671 0.1671 11063.3936179129905213 196777.913679151738 +1672 0.1672 11043.7343754927205737 196406.934726257896 +1673 0.1673 11024.1121909265293652 196036.756597550382 +1674 0.1674 11004.5269842351990519 195667.377229068807 +1675 0.1675 10984.9786756455850991 195298.794563220115 +1676 0.1676 10965.4671855899869115 194931.006548756617 +1677 0.1677 10945.9924347055111866 194564.011140752002 +1678 0.1678 10926.5543438334443636 194197.806300578028 +1679 0.1679 10907.1528340186214336 193832.389995884383 +1680 0.1680 10887.7878265087983891 193467.760200571327 +1681 0.1681 10868.4592427540319477 193103.914894771908 +1682 0.1682 10849.1670044060520013 192740.852064826002 +1683 0.1683 10829.9110333176486165 192378.569703259622 +1684 0.1684 10810.6912515420481213 192017.065808762476 +1685 0.1685 10791.5075813323019247 191656.338386162999 +1686 0.1686 10772.3599451406735170 191296.385446411034 +1687 0.1687 10753.2482656180254708 190937.205006550706 +1688 0.1688 10734.1724656132137170 190578.795089702297 +1689 0.1689 10715.1324681724763650 190221.153725036216 +1690 0.1690 10696.1281965388370736 189864.278947758401 +1691 0.1691 10677.1595741514956899 189508.168799078092 +1692 0.1692 10658.2265246452316205 189152.821326196106 +1693 0.1693 10639.3289718498072034 188798.234582278819 +1694 0.1694 10620.4668397893710790 188444.406626433978 +1695 0.1695 10601.6400526818651997 188091.335523696500 +1696 0.1696 10582.8485349384300207 187739.019344999921 +1697 0.1697 10564.0922111628224229 187387.456167159369 +1698 0.1698 10545.3710061508227227 187036.644072850060 +1699 0.1699 10526.6848448896507762 186686.581150584709 +1700 0.1700 10508.0336525573875406 186337.265494693420 +1701 0.1701 10489.4173545223875408 185988.695205305063 +1702 0.1702 10470.8358763427058875 185640.868388321367 +1703 0.1703 10452.2891437655198388 185293.783155401587 +1704 0.1704 10433.7770827265521802 184947.437623937381 +1705 0.1705 10415.2996193495037005 184601.829917037801 +1706 0.1706 10396.8566799454765714 184256.958163501520 +1707 0.1707 10378.4481910124104616 183912.820497804991 +1708 0.1708 10360.0740792345168302 183569.415060073428 +1709 0.1709 10341.7342714817095839 183226.739996068383 +1710 0.1710 10323.4286948090484657 182884.793457162828 +1711 0.1711 10305.1572764561733493 182543.573600322474 +1712 0.1712 10286.9199438467530854 182203.078588086821 +1713 0.1713 10268.7166245879216149 181863.306588546897 +1714 0.1714 10250.5472464697286341 181524.255775328580 +1715 0.1715 10232.4117374645829841 181185.924327570916 +1716 0.1716 10214.3100257267087727 180848.310429907404 +1717 0.1717 10196.2420395915905829 180511.412272445101 +1718 0.1718 10178.2077075754314137 180175.228050747886 +1719 0.1719 10160.2069583746033459 179839.755965813296 +1720 0.1720 10142.2397208651091205 179504.994224057824 +1721 0.1721 10124.3059241020418995 179170.941037292127 +1722 0.1722 10106.4054973190413875 178837.594622707897 +1723 0.1723 10088.5383699277626874 178504.953202855890 +1724 0.1724 10070.7044715173378790 178173.015005624387 +1725 0.1725 10052.9037318538448744 177841.778264224908 +1726 0.1726 10035.1360808797744539 177511.241217173054 +1727 0.1727 10017.4014487135027593 177181.402108264097 +1728 0.1728 9999.6997656487619679 176852.259186562296 +1729 0.1729 9982.0309621541146043 176523.810706377495 +1730 0.1730 9964.3949688724333100 176196.054927245481 +1731 0.1731 9946.7917166203751549 175868.990113913896 +1732 0.1732 9929.2211363878632255 175542.614536320092 +1733 0.1733 9911.6831593375682132 175216.926469577302 +1734 0.1734 9894.1777168043918209 174891.924193950661 +1735 0.1735 9876.7047402949519892 174567.605994843005 +1736 0.1736 9859.2641614870717603 174243.970162774494 +1737 0.1737 9841.8559122292645043 173921.014993368211 +1738 0.1738 9824.4799245402300585 173598.738787329203 +1739 0.1739 9807.1361306083417730 173277.139850426523 +1740 0.1740 9789.8244627911462885 172956.216493477579 +1741 0.1741 9772.5448536148560379 172635.967032327404 +1742 0.1742 9755.2972357738472056 172316.389787834283 +1743 0.1743 9738.0815421301631432 171997.483085851709 +1744 0.1744 9720.8977057130105095 171679.245257206989 +1745 0.1745 9703.7456597182663245 171361.674637690419 +1746 0.1746 9686.6253375079795660 171044.769568030781 +1747 0.1747 9669.5366726098836807 170728.528393884917 +1748 0.1748 9652.4795987168981810 170412.949465814017 +1749 0.1749 9635.4540496866429748 170098.031139273284 +1750 0.1750 9618.4599595409490576 169783.771774589666 +1751 0.1751 9601.4972624653728417 169470.169736944896 +1752 0.1752 9584.5658928087068489 169157.223396362591 +1753 0.1753 9567.6657850825049536 168844.931127687509 +1754 0.1754 9550.7968739605912560 168533.291310572298 +1755 0.1755 9533.9590942785889638 168222.302329455502 +1756 0.1756 9517.1523810334383597 167911.962573551602 +1757 0.1757 9500.3766693829184078 167602.270436829305 +1758 0.1758 9483.6318946451774536 167293.224317996006 +1759 0.1759 9466.9179922982530115 166984.822620483086 +1760 0.1760 9450.2348979796079220 166677.063752429589 +1761 0.1761 9433.5825474856537767 166369.946126661293 +1762 0.1762 9416.9608767712870758 166063.468160682096 +1763 0.1763 9400.3698219494199293 165757.628276651492 +1764 0.1764 9383.8093192905180331 165452.424901370890 +1765 0.1765 9367.2793052221368271 165147.856466266909 +1766 0.1766 9350.7797163284540147 164843.921407376096 +1767 0.1767 9334.3104893498184538 164540.618165329914 +1768 0.1768 9317.8715611822844949 164237.945185337216 +1769 0.1769 9301.4628688771590532 163935.900917166378 +1770 0.1770 9285.0843496405432234 163634.483815136424 +1771 0.1771 9268.7359408328811696 163333.692338091903 +1772 0.1772 9252.4175799685071979 163033.524949396786 +1773 0.1773 9236.1292047151910083 162733.980116912688 +1774 0.1774 9219.8707528936956805 162435.056312985311 +1775 0.1775 9203.6421624773247459 162136.752014427679 +1776 0.1776 9187.4433715914783534 161839.065702508902 +1777 0.1777 9171.2743185132057988 161541.995862932410 +1778 0.1778 9155.1349416707671480 161245.540985827101 +1779 0.1779 9139.0251796431894036 160949.699565727904 +1780 0.1780 9122.9449711598244903 160654.470101561688 +1781 0.1781 9106.8942550999145169 160359.851096633909 +1782 0.1782 9090.8729704921515804 160065.841058611404 +1783 0.1783 9074.8810565142448468 159772.438499507989 +1784 0.1784 9058.9184524924858124 159479.641935670690 +1785 0.1785 9042.9850979013135657 159187.449887762603 +1786 0.1786 9027.0809323628873244 158895.860880750988 +1787 0.1787 9011.2058956466553354 158604.873443892080 +1788 0.1788 8995.3599276689255930 158314.486110712984 +1789 0.1789 8979.5429684924401954 158024.697419000702 +1790 0.1790 8963.7549583259515202 157735.505910786800 +1791 0.1791 8947.9958375237947621 157446.910132332589 +1792 0.1792 8932.2655465854732029 157158.908634116000 +1793 0.1793 8916.5640261552271113 156871.499970812991 +1794 0.1794 8900.8912170216226514 156584.682701288402 +1795 0.1795 8885.2470601171298767 156298.455388578790 +1796 0.1796 8869.6314965177061822 156012.816599879181 +1797 0.1797 8854.0444674423852121 155727.764906529686 +1798 0.1798 8838.4859142528584925 155443.298883998010 +1799 0.1799 8822.9557784530643403 155159.417111869203 +1800 0.1800 8807.4540016887785896 154876.118173831695 +1801 0.1801 8791.9805257472035009 154593.400657659920 +1802 0.1802 8776.5352925565603073 154311.263155203604 +1803 0.1803 8761.1182441856817604 154029.704262371699 +1804 0.1804 8745.7293228436064965 153748.722579121502 +1805 0.1805 8730.3684708791788580 153468.316709441715 +1806 0.1806 8715.0356307806396217 153188.485261341615 +1807 0.1807 8699.7307451752312772 152909.226846834703 +1808 0.1808 8684.4537568287923932 152630.540081928601 +1809 0.1809 8669.2046086453665339 152352.423586606485 +1810 0.1810 8653.9832436667948059 152074.875984821585 +1811 0.1811 8638.7896050723302324 151797.895904473611 +1812 0.1812 8623.6236361782357562 151521.481977404095 +1813 0.1813 8608.4852804373967956 151245.632839378290 +1814 0.1814 8593.3744814389247040 150970.347130074981 +1815 0.1815 8578.2911829077675065 150695.623493069288 +1816 0.1816 8563.2353287043224555 150421.460575826000 +1817 0.1817 8548.2068628240467660 150147.857029676787 +1818 0.1818 8533.2057293970719911 149874.811509818770 +1819 0.1819 8518.2318726878165762 149602.322675291914 +1820 0.1820 8503.2852370946038718 149330.389188970323 +1821 0.1821 8488.3657671492783265 149059.009717549779 +1822 0.1822 8473.4734075168234995 148788.182931534393 +1823 0.1823 8458.6081029949855292 148517.907505221374 +1824 0.1824 8443.7697985138893273 148248.182116692478 +1825 0.1825 8428.9584391356638662 147979.005447798903 +1826 0.1826 8414.1739700540656486 147710.376184147783 +1827 0.1827 8399.4163365941039956 147442.293015091214 +1828 0.1828 8384.6854842116645159 147174.754633715085 +1829 0.1829 8369.9813584931380319 146907.759736821987 +1830 0.1830 8355.3039051550513250 146641.307024925307 +1831 0.1831 8340.6530700436942425 146375.395202228596 +1832 0.1832 8326.0287991347522620 146110.022976621200 +1833 0.1833 8311.4310385329390556 145845.189059660886 +1834 0.1834 8296.8597344716272346 145580.892166565405 +1835 0.1835 8282.3148333124900091 145317.131016195606 +1836 0.1836 8267.7962815451282950 145053.904331046710 +1837 0.1837 8253.3040257867141918 144791.210837236606 +1838 0.1838 8238.8380127816271852 144529.049264490604 +1839 0.1839 8224.3981894010958058 144267.418346132094 +1840 0.1840 8209.9845026428356505 144006.316819071304 +1841 0.1841 8195.5968996306928602 143745.743423789798 +1842 0.1842 8181.2353276142866889 143485.696904330282 +1843 0.1843 8166.8997339686557098 143226.176008289709 +1844 0.1844 8152.5900661939012934 142967.179486796318 +1845 0.1845 8138.3062719148356337 142708.706094510097 +1846 0.1846 8124.0482988806297726 142450.754589603312 +1847 0.1847 8109.8160949644616267 142193.323733751604 +1848 0.1848 8095.6096081631676498 141936.412292120804 +1849 0.1849 8081.4287865968935876 141680.019033357908 +1850 0.1850 8067.2735785087470504 141424.142729577899 +1851 0.1851 8053.1439322644509957 141168.782156352012 +1852 0.1852 8039.0397963519981204 140913.936092698015 +1853 0.1853 8024.9611193813097998 140659.603321065195 +1854 0.1854 8010.9078500838904802 140405.782627327309 +1855 0.1855 7996.8799373124857084 140152.472800768708 +1856 0.1856 7982.8773300407438001 139899.672634076094 +1857 0.1857 7968.8999773628738694 139647.380923321296 +1858 0.1858 7954.9478284933102259 139395.596467955591 +1859 0.1859 7941.0208327663722230 139144.318070799200 +1860 0.1860 7927.1189396359313832 138893.544538022310 +1861 0.1861 7913.2420986750730663 138643.274679145194 +1862 0.1862 7899.3902595757645031 138393.507307017397 +1863 0.1863 7885.5633721485228307 138144.241237813985 +1864 0.1864 7871.7613863220813073 137895.475291020208 +1865 0.1865 7857.9842521430591660 137647.208289421804 +1866 0.1866 7844.2319197756332869 137399.439059095108 +1867 0.1867 7830.5043395012089604 137152.166429393226 +1868 0.1868 7816.8014617180924688 136905.389232942718 +1869 0.1869 7803.1232369411645777 136659.106305621681 +1870 0.1870 7789.4696158015558467 136413.316486559983 +1871 0.1871 7775.8405490463219394 136168.018618120288 +1872 0.1872 7762.2359875381216625 135923.211545893108 +1873 0.1873 7748.6558822548931857 135678.894118684519 +1874 0.1874 7735.1001842895338996 135435.065188503300 +1875 0.1875 7721.5688448495811826 135191.723610552901 +1876 0.1876 7708.0618152568922596 134948.868243222183 +1877 0.1877 7694.5790469473276971 134706.497948072909 +1878 0.1878 7681.1204914704330804 134464.611589827691 +1879 0.1879 7667.6861004891234188 134223.208036363823 +1880 0.1880 7654.2758257793702796 133982.286158700474 +1881 0.1881 7640.8896192298852839 133741.844830990478 +1882 0.1882 7627.5274328418108780 133501.882930506370 +1883 0.1883 7614.1892187284038300 133262.399337633105 +1884 0.1884 7600.8749291147296390 133023.392935858312 +1885 0.1885 7587.5845163373487594 132784.862611760909 +1886 0.1886 7574.3179328440110112 132546.807255001506 +1887 0.1887 7561.0751311933454417 132309.225758311397 +1888 0.1888 7547.8560640545556453 132072.117017484998 +1889 0.1889 7534.6606842071132633 131835.479931367619 +1890 0.1890 7521.4889445404523940 131599.313401844993 +1891 0.1891 7508.3407980536685500 131363.616333837097 +1892 0.1892 7495.2161978552121582 131128.387635285093 +1893 0.1893 7482.1150971625911552 130893.626217143115 +1894 0.1894 7469.0374493020653972 130659.330993366195 +1895 0.1895 7455.9832077083519835 130425.500880902808 +1896 0.1896 7442.9523259243223947 130192.134799687206 +1897 0.1897 7429.9447576007069074 129959.231672622700 +1898 0.1898 7416.9604564957971888 129726.790425580693 +1899 0.1899 7403.9993764751488925 129494.809987384389 +1900 0.1900 7391.0614715112897102 129263.289289803506 +1901 0.1901 7378.1466956834228768 129032.227267541602 +1902 0.1902 7365.2550031771343129 128801.622858229399 +1903 0.1903 7352.3863482841024961 128571.475002412597 +1904 0.1904 7339.5406854018046943 128341.782643545608 +1905 0.1905 7326.7179690332286555 128112.544727980698 +1906 0.1906 7313.9181537865815699 127883.760204956998 +1907 0.1907 7301.1411943750044884 127655.428026592082 +1908 0.1908 7288.3870456162812843 127427.547147876787 +1909 0.1909 7275.6556624325539815 127200.116526660582 +1910 0.1910 7262.9469998500389920 126973.135123643704 +1911 0.1911 7250.2610129987388063 126746.601902369104 +1912 0.1912 7237.5976571121600500 126520.515829213793 +1913 0.1913 7224.9568875270306307 126294.875873379598 +1914 0.1914 7212.3386596830177950 126069.681006879793 +1915 0.1915 7199.7429291224470944 125844.930204537202 +1916 0.1916 7187.1696514900213515 125620.622443970817 +1917 0.1917 7174.6187825325432641 125396.756705587904 +1918 0.1918 7162.0902780986352809 125173.331972574291 +1919 0.1919 7149.5840941384622056 124950.347230886007 +1920 0.1920 7137.1001867034556199 124727.801469241604 +1921 0.1921 7124.6385119460383066 124505.693679110700 +1922 0.1922 7112.1990261193477636 124284.022854708688 +1923 0.1923 7099.7816855769633548 124062.787992985104 +1924 0.1924 7087.3864467726334624 123841.988093614913 +1925 0.1925 7075.0132662600026379 123621.622158993399 +1926 0.1926 7062.6621006923414825 123401.689194221603 +1927 0.1927 7050.3329068222756177 123182.188207104293 +1928 0.1928 7038.0256415015137463 122963.118208135493 +1929 0.1929 7025.7402616805820799 122744.478210493689 +1930 0.1930 7013.4767244085560378 122526.267230031110 +1931 0.1931 7001.2349868327910372 122308.484285268612 +1932 0.1932 6989.0150061986587389 122091.128397381210 +1933 0.1933 6976.8167398492796565 121874.198590197208 +1934 0.1934 6964.6401452252603121 121657.693890183102 +1935 0.1935 6952.4851798644294831 121441.613326438091 +1936 0.1936 6940.3518014015735389 121225.955930687604 +1937 0.1937 6928.2399675681754161 121010.720737270807 +1938 0.1938 6916.1496361921554126 120795.906783134895 +1939 0.1939 6904.0807651976074339 120581.513107827093 +1940 0.1940 6892.0333126045416066 120367.538753485802 +1941 0.1941 6880.0072365286259810 120153.982764831584 +1942 0.1942 6868.0024951809264167 119940.844189161187 +1943 0.1943 6856.0190468676519231 119728.122076336193 +1944 0.1944 6844.0568499898963637 119515.815478777193 +1945 0.1945 6832.1158630433847065 119303.923451456605 +1946 0.1946 6820.1960446182174564 119092.445051888091 +1947 0.1947 6808.2973533986169059 118881.379340119587 +1948 0.1948 6796.4197481626742956 118670.725378726216 +1949 0.1949 6784.5631877820978843 118460.482232800088 +1950 0.1950 6772.7276312219601095 118250.648969946415 +1951 0.1951 6760.9130375404492952 118041.224660271284 +1952 0.1952 6749.1193658886168123 117832.208376374881 +1953 0.1953 6737.3465755101306058 117623.599193345493 +1954 0.1954 6725.5946257410259932 117415.396188750688 +1955 0.1955 6713.8634760094573721 117207.598442628296 +1956 0.1956 6702.1530858354517477 117000.205037481399 +1957 0.1957 6690.4634148306640782 116793.215058267786 +1958 0.1958 6678.7944226981308020 116586.627592391495 +1959 0.1959 6667.1460692320260932 116380.441729700688 +1960 0.1960 6655.5183143174172073 116174.656562474396 +1961 0.1961 6643.9111179300225558 115969.271185417194 +1962 0.1962 6632.3244401359688709 115764.284695650014 +1963 0.1963 6620.7582410915510991 115559.696192705684 +1964 0.1964 6609.2124810429895660 115355.504778519389 +1965 0.1965 6597.6871203261925984 115151.709557418988 +1966 0.1966 6586.1821193665155079 114948.309636122984 +1967 0.1967 6574.6974386785232127 114745.304123728405 +1968 0.1968 6563.2330388657519507 114542.692131704098 +1969 0.1969 6551.7888806204728098 114340.472773886213 +1970 0.1970 6540.3649247234552604 114138.645166465896 +1971 0.1971 6528.9611320437325048 113937.208427987498 +1972 0.1972 6517.5774635383659188 113736.161679337616 +1973 0.1973 6506.2138802522122205 113535.504043737601 +1974 0.1974 6494.8703433176888211 113335.234646739205 +1975 0.1975 6483.5468139545409940 113135.352616214688 +1976 0.1976 6472.2432534696126822 112935.857082350718 +1977 0.1977 6460.9596232566127583 112736.747177639889 +1978 0.1978 6449.6958847958867409 112538.022036876209 +1979 0.1979 6438.4519996541857836 112339.680797144596 +1980 0.1980 6427.2279294844374817 112141.722597817410 +1981 0.1981 6416.0236360255194086 111944.146580543806 +1982 0.1982 6404.8390811020299225 111746.951889245916 +1983 0.1983 6393.6742266240626122 111550.137670106895 +1984 0.1984 6382.5290345869789235 111353.703071572294 +1985 0.1985 6371.4034670711835133 111157.647244334003 +1986 0.1986 6360.2974862419005149 110961.969341328600 +1987 0.1987 6349.2110543489479824 110766.668517729500 +1988 0.1988 6338.1441337265141556 110571.743930938595 +1989 0.1989 6327.0966867929382715 110377.194740582097 +1990 0.1990 6316.0686760504841004 110183.020108500103 +1991 0.1991 6305.0600640851216667 109989.219198742096 +1992 0.1992 6294.0708135663062421 109795.791177560008 +1993 0.1993 6283.1008872467582478 109602.735213402688 +1994 0.1994 6272.1502479622431565 109410.050476904406 +1995 0.1995 6261.2188586313541236 109217.736140882698 +1996 0.1996 6250.3066822552937083 109025.791380331197 +1997 0.1997 6239.4136819176565041 108834.215372410006 +1998 0.1998 6228.5398207842135889 108643.007296442287 +1999 0.1999 6217.6850621026960653 108452.166333906804 +2000 0.2000 6206.8493692025795099 108261.691668428204 +2001 0.2001 6196.0327054948693331 108071.582485775594 +2002 0.2002 6185.2350344718879569 107881.837973852496 +2003 0.2003 6174.4563197070610840 107692.457322690607 +2004 0.2004 6163.6965248547039664 107503.439724444688 +2005 0.2005 6152.9556136498122214 107314.784373383183 +2006 0.2006 6142.2335499078490102 107126.490465887618 +2007 0.2007 6131.5302975245331254 106938.557200437906 +2008 0.2008 6120.8458204756307168 106750.983777612404 +2009 0.2009 6110.1800828167461077 106563.769400080404 +2010 0.2010 6099.5330486831126109 106376.913272592006 +2011 0.2011 6088.9046822893842545 106190.414601975310 +2012 0.2012 6078.2949479294293269 106004.272597130592 +2013 0.2013 6067.7038099761221019 105818.486469022406 +2014 0.2014 6057.1312328811372936 105633.055430670312 +2015 0.2015 6046.5771811747463289 105447.978697150204 +2016 0.2016 6036.0416194656099833 105263.255485578891 +2017 0.2017 6025.5245124405755632 105078.885015116917 +2018 0.2018 6015.0258248644722698 104894.866506954597 +2019 0.2019 6004.5455215799092912 104711.199184311190 +2020 0.2020 5994.0835675070720754 104527.882272426097 +2021 0.2021 5983.6399276435231513 104344.914998553009 +2022 0.2022 5973.2145670639974924 104162.296591953200 +2023 0.2023 5962.8074509202051559 103980.026283893094 +2024 0.2024 5952.4185444406284660 103798.103307632686 +2025 0.2025 5942.0478129303255628 103616.526898422715 +2026 0.2026 5931.6952217707294039 103435.296293499312 +2027 0.2027 5921.3607364194504044 103254.410732076300 +2028 0.2028 5911.0443224100799853 103073.869455337684 +2029 0.2029 5900.7459453519913950 102893.671706435998 +2030 0.2030 5890.4655709301450770 102713.816730483391 +2031 0.2031 5880.2031649048940380 102534.303774545886 +2032 0.2032 5869.9586931117846689 102355.132087637699 +2033 0.2033 5859.7321214613666598 102176.300920716705 +2034 0.2034 5849.5234159389974593 101997.809526674901 +2035 0.2035 5839.3325426046467328 101819.657160337112 +2036 0.2036 5829.1594675927071876 101641.843078452192 +2037 0.2037 5819.0041571117999410 101464.366539688199 +2038 0.2038 5808.8665774445844363 101287.226804627600 +2039 0.2039 5798.7466949475656293 101110.423135757403 +2040 0.2040 5788.6444760509039043 100933.954797468017 +2041 0.2041 5778.5598872582277181 100757.821056047600 +2042 0.2042 5768.4928951464416969 100582.021179672302 +2043 0.2043 5758.4434663655383702 100406.554438402207 +2044 0.2044 5748.4115676384089966 100231.420104178920 +2045 0.2045 5738.3971657606589361 100056.617450814898 +2046 0.2046 5728.4002276004184750 99882.145753991193 +2047 0.2047 5718.4207200981563801 99708.004291252000 +2048 0.2048 5708.4586102664943610 99534.192341994509 +2049 0.2049 5698.5138651900206241 99360.709187471104 +2050 0.2050 5688.5864520251079739 99187.554110775600 +2051 0.2051 5678.6763379997273660 99014.726396843893 +2052 0.2052 5668.7834904132632801 98842.225332444606 +2053 0.2053 5658.9078766363318209 98670.050206176806 +2054 0.2054 5649.0494641105997289 98498.200308459986 +2055 0.2055 5639.2082203485997525 98326.674931534595 +2056 0.2056 5629.3841129335505684 98155.473369450192 +2057 0.2057 5619.5771095191748827 97984.594918067000 +2058 0.2058 5609.7871778295193508 97814.038875042097 +2059 0.2059 5600.0142856587754068 97643.804539832709 +2060 0.2060 5590.2584008710991839 97473.891213683994 +2061 0.2061 5580.5194914004332531 97304.298199628291 +2062 0.2062 5570.7975252503283627 97135.024802477114 +2063 0.2063 5561.0924704937633578 96966.070328815709 +2064 0.2064 5551.4042952729723766 96797.434087000904 +2065 0.2065 5541.7329677992647703 96629.115387151207 +2066 0.2066 5532.0784563528495710 96461.113541146391 +2067 0.2067 5522.4407292826608682 96293.427862618599 +2068 0.2068 5512.8197550061822767 96126.057666947498 +2069 0.2069 5503.2155020092723134 95959.002271257297 +2070 0.2070 5493.6279388459888651 95792.260994410404 +2071 0.2071 5484.0570341384182029 95625.833157000816 +2072 0.2072 5474.5027565765003601 95459.718081351501 +2073 0.2073 5464.9650749178572369 95293.915091505609 +2074 0.2074 5455.4439579876207063 95128.423513226109 +2075 0.2075 5445.9393746782598100 94963.242673988891 +2076 0.2076 5436.4512939494115926 94798.371902974090 +2077 0.2077 5426.9796848277092067 94633.810531065697 +2078 0.2078 5417.5245164066136567 94469.557890846292 +2079 0.2079 5408.0857578462419042 94305.613316587187 +2080 0.2080 5398.6633783732004304 94141.976144248300 +2081 0.2081 5389.2573472804142511 93978.645711474208 +2082 0.2082 5379.8676339269613891 93815.621357582291 +2083 0.2083 5370.4942077379037073 93652.902423563588 +2084 0.2084 5361.1370382041213816 93490.488252078590 +2085 0.2085 5351.7960948821446436 93328.378187447888 +2086 0.2086 5342.4713473939900723 93166.571575648311 +2087 0.2087 5333.1627654269923369 93005.067764311709 +2088 0.2088 5323.8703187336413976 92843.866102715503 +2089 0.2089 5314.5939771314169775 92682.965941781804 +2090 0.2090 5305.3337105026248537 92522.366634068690 +2091 0.2091 5296.0894887942331479 92362.067533768713 +2092 0.2092 5286.8612820177095273 92202.067996700018 +2093 0.2093 5277.6490602488593140 92042.367380308890 +2094 0.2094 5268.4527936276608671 91882.965043655000 +2095 0.2095 5259.2724523581073299 91723.860347415801 +2096 0.2096 5250.1080067080429217 91565.052653876002 +2097 0.2097 5240.9594270090028658 91406.541326925100 +2098 0.2098 5231.8266836560542288 91248.325732052312 +2099 0.2099 5222.7097471076349393 91090.405236341816 +2100 0.2100 5213.6085878853946269 90932.779208468113 +2101 0.2101 5204.5231765740363699 90775.447018691309 +2102 0.2102 5195.4534838211593524 90618.408038852212 +2103 0.2103 5186.3994803370978843 90461.661642369407 +2104 0.2104 5177.3611368947676965 90305.207204230304 +2105 0.2105 5168.3384243295067790 90149.044100992091 +2106 0.2106 5159.3313135389180388 89993.171710773895 +2107 0.2107 5150.3397754827165045 89837.589413251189 +2108 0.2108 5141.3637811825710742 89682.296589655904 +2109 0.2109 5132.4033017219499015 89527.292622765090 +2110 0.2110 5123.4583082459666912 89372.576896902392 +2111 0.2111 5114.5287719612251749 89218.148797932285 +2112 0.2112 5105.6146641356663167 89064.007713251005 +2113 0.2113 5096.7159560984146083 88910.153031790120 +2114 0.2114 5087.8326192396252736 88756.584144002903 +2115 0.2115 5078.9646250103314742 88603.300441868007 +2116 0.2116 5070.1119449222942421 88450.301318879283 +2117 0.2117 5061.2745505478478663 88297.586170046896 +2118 0.2118 5052.4524135197516443 88145.154391884716 +2119 0.2119 5043.6455055310370881 87993.005382415184 +2120 0.2120 5034.8537983348587659 87841.138541158405 +2121 0.2121 5026.0772637443442363 87689.553269130192 +2122 0.2122 5017.3158736324458005 87538.248968838307 +2123 0.2123 5008.5695999317904352 87387.225044276493 +2124 0.2124 4999.8384146345306362 87236.480900922194 +2125 0.2125 4991.1222897921979893 87086.015945728912 +2126 0.2126 4982.4211975155549226 86935.829587125685 +2127 0.2127 4973.7351099744482781 86785.921235011192 +2128 0.2128 4965.0639993976601545 86636.290300748995 +2129 0.2129 4956.4078380727642070 86486.936197163595 +2130 0.2130 4947.7665983459792187 86337.858338536287 +2131 0.2131 4939.1402526220226719 86189.056140602494 +2132 0.2132 4930.5287733639652288 86040.529020543399 +2133 0.2133 4921.9321330930888507 85892.276396985806 +2134 0.2134 4913.3503043887394597 85744.297689998406 +2135 0.2135 4904.7832598881850572 85596.592321082499 +2136 0.2136 4896.2309722864720243 85449.159713173591 +2137 0.2137 4887.6934143362814211 85301.999290633903 +2138 0.2138 4879.1705588477871061 85155.110479248804 +2139 0.2139 4870.6623786885138543 85008.492706223507 +2140 0.2140 4862.1688467831936578 84862.145400178109 +2141 0.2141 4853.6899361136274820 84716.067991144999 +2142 0.2142 4845.2256197185424753 84570.259910562803 +2143 0.2143 4836.7758706934509974 84424.720591274105 +2144 0.2144 4828.3406621905114662 84279.449467517494 +2145 0.2145 4819.9199674183892057 84134.445974931397 +2146 0.2146 4811.5137596421154740 83989.709550541214 +2147 0.2147 4803.1220121829501295 83845.239632761601 +2148 0.2148 4794.7446984182424785 83701.035661388800 +2149 0.2149 4786.3817917812930318 83557.097077599188 +2150 0.2150 4778.0332657612161711 83413.423323943396 +2151 0.2151 4769.6990939028019056 83270.013844344809 +2152 0.2152 4761.3792498063803578 83126.868084091897 +2153 0.2153 4753.0737071276835195 82983.985489838000 +2154 0.2154 4744.7824395777115569 82841.365509593612 +2155 0.2155 4736.5054209225954764 82699.007592727212 +2156 0.2156 4728.2426249834616101 82556.911189958410 +2157 0.2157 4719.9940256362961009 82415.075753352488 +2158 0.2158 4711.7595968118121164 82273.500736320202 +2159 0.2159 4703.5393124953152437 82132.185593613118 +2160 0.2160 4695.3331467265688843 81991.129781317912 +2161 0.2161 4687.1410735996605581 81850.332756852193 +2162 0.2162 4678.9630672628700268 81709.793978965710 +2163 0.2163 4670.7991019185355981 81569.512907728305 +2164 0.2164 4662.6491518229222493 81429.489004535601 +2165 0.2165 4654.5131912860906596 81289.721732097110 +2166 0.2166 4646.3911946717644241 81150.210554436082 +2167 0.2167 4638.2831363971981773 81010.954936887094 +2168 0.2168 4630.1889909330493538 80871.954346090104 +2169 0.2169 4622.1087328032454025 80733.208249985299 +2170 0.2170 4614.0423365848555477 80594.716117814110 +2171 0.2171 4605.9897769079589125 80456.477420111900 +2172 0.2172 4597.9510284555180988 80318.491628705087 +2173 0.2173 4589.9260659632473107 80180.758216705290 +2174 0.2174 4581.9148642194859349 80043.276658513292 +2175 0.2175 4573.9173980650703015 79906.046429803799 +2176 0.2176 4565.9336423932036269 79769.067007532896 +2177 0.2177 4557.9635721493305027 79632.337869926516 +2178 0.2178 4550.0071623310104769 79495.858496482600 +2179 0.2179 4542.0643879877879954 79359.628367962097 +2180 0.2180 4534.1352242210705299 79223.646966388711 +2181 0.2181 4526.2196461839985204 79087.913775046589 +2182 0.2182 4518.3176290813225933 78952.428278471998 +2183 0.2183 4510.4291481692762318 78817.189962454213 +2184 0.2184 4502.5541787554520852 78682.198314030786 +2185 0.2185 4494.6926961986764582 78547.452821483195 +2186 0.2186 4486.8446759088856197 78412.952974331696 +2187 0.2187 4479.0100933470021118 78278.698263336817 +2188 0.2188 4471.1889240248110582 78144.688180491095 +2189 0.2189 4463.3811435048355634 78010.922219018408 +2190 0.2190 4455.5867274002166596 77877.399873368704 +2191 0.2191 4447.8056513745877965 77744.120639215398 +2192 0.2192 4440.0378911419547876 77611.084013451487 +2193 0.2193 4432.2834224665730289 77478.289494188110 +2194 0.2194 4424.5422211628265359 77345.736580747282 +2195 0.2195 4416.8142630951060710 77213.424773662511 +2196 0.2196 4409.0995241776890907 77081.353574671899 +2197 0.2197 4401.3979803746196922 76949.522486716596 +2198 0.2198 4393.7096076995867406 76817.931013939407 +2199 0.2199 4386.0343822158056355 76686.578661676103 +2200 0.2200 4378.3722800358991663 76555.464936456483 +2201 0.2201 4370.7232773217765498 76424.589346001099 +2202 0.2202 4363.0873502845161056 76293.951399213198 +2203 0.2203 4355.4644751842461119 76163.550606182791 +2204 0.2204 4347.8546283300283903 76033.386478175598 +2205 0.2205 4340.2577860797382527 75903.458527634910 +2206 0.2206 4332.6739248399480857 75773.766268177103 +2207 0.2207 4325.1030210658100259 75644.309214589099 +2208 0.2208 4317.5450512609395446 75515.086882820498 +2209 0.2209 4309.9999919772990324 75386.098789985903 +2210 0.2210 4302.4678198150813841 75257.344454361606 +2211 0.2211 4294.9485114225944926 75128.823395376385 +2212 0.2212 4287.4420434961448336 75000.535133614379 +2213 0.2213 4279.9483927799237790 74872.479190809900 +2214 0.2214 4272.4675360658911814 74744.655089843407 +2215 0.2215 4264.9994501936616871 74617.062354738999 +2216 0.2216 4257.5441120503919592 74489.700510659706 +2217 0.2217 4250.1014985706633524 74362.569083909097 +2218 0.2218 4242.6715867363718644 74235.667601921799 +2219 0.2219 4235.2543535766126297 74108.995593264306 +2220 0.2220 4227.8497761675680522 73982.552587629500 +2221 0.2221 4220.4578316323950276 73856.338115837600 +2222 0.2222 4213.0784971411121660 73730.351709828188 +2223 0.2223 4205.7117499104879244 73604.592902658085 +2224 0.2224 4198.3575672039296478 73479.061228502702 +2225 0.2225 4191.0159263313726115 73353.756222645112 +2226 0.2226 4183.6868046491663335 73228.677421480694 +2227 0.2227 4176.3701795599663456 73103.824362511194 +2228 0.2228 4169.0660285126241433 72979.196584336605 +2229 0.2229 4161.7743290020744098 72854.793626662387 +2230 0.2230 4154.4950585692267850 72730.615030286295 +2231 0.2231 4147.2281948008576364 72606.660337101508 +2232 0.2232 4139.9737153294981908 72482.929090092308 +2233 0.2233 4132.7315978333272142 72359.420833329597 +2234 0.2234 4125.5018200360618721 72236.135111968790 +2235 0.2235 4118.2843597068513191 72113.071472248397 +2236 0.2236 4111.0791946601648306 71990.229461483308 +2237 0.2237 4103.8863027556872112 71867.608628065107 +2238 0.2238 4096.7056618982114742 71745.208521458291 +2239 0.2239 4089.5372500375292475 71623.028692195192 +2240 0.2240 4082.3810451683257270 71501.068691878187 +2241 0.2241 4075.2370253300732656 71379.328073170400 +2242 0.2242 4068.1051686069249627 71257.806389797202 +2243 0.2243 4060.9854531276082525 71136.503196540216 +2244 0.2244 4053.8778570653194038 71015.418049238811 +2245 0.2245 4046.7823586376184721 70894.550504780418 +2246 0.2246 4039.6989361063242541 70773.900121106213 +2247 0.2247 4032.6275677774087853 70653.466457199393 +2248 0.2248 4025.5682320008945680 70533.249073089391 +2249 0.2249 4018.5209071707477051 70413.247529845001 +2250 0.2250 4011.4855717247769462 70293.461389572403 +2251 0.2251 4004.4622041445277318 70173.890215412510 +2252 0.2252 3997.4507829551803297 70054.533571539083 +2253 0.2253 3990.4512867254456978 69935.391023154385 +2254 0.2254 3983.4636940674636207 69816.462136485992 +2255 0.2255 3976.4879836366999371 69697.746478786794 +2256 0.2256 3969.5241341318442210 69579.243618327499 +2257 0.2257 3962.5721242947079190 69460.953124400898 +2258 0.2258 3955.6319329101224866 69342.874567309686 +2259 0.2259 3948.7035388058384342 69225.007518373706 +2260 0.2260 3941.7869208524239184 69107.351549917410 +2261 0.2261 3934.8820579631642431 68989.906235275499 +2262 0.2262 3927.9889290939609054 68872.671148786991 +2263 0.2263 3921.1075132432320061 68755.645865788101 +2264 0.2264 3914.2377894518117500 68638.829962616917 +2265 0.2265 3907.3797368028504025 68522.223016605712 +2266 0.2266 3900.5333344217160629 68405.824606081587 +2267 0.2267 3893.6985614758941665 68289.634310359892 +2268 0.2268 3886.8753971748888034 68173.651709743484 +2269 0.2269 3880.0638207701254032 68057.876385521289 +2270 0.2270 3873.2638115548511450 67942.307919963903 +2271 0.2271 3866.4753488640367323 67826.945896321195 +2272 0.2272 3859.6984120742795312 67711.789898819916 +2273 0.2273 3852.9329806037053459 67596.839512660998 +2274 0.2274 3846.1790339118715565 67482.094324018588 +2275 0.2275 3839.4365514996688944 67367.553920031409 +2276 0.2276 3832.7055129092268544 67253.217888808795 +2277 0.2277 3825.9858977238154694 67139.085819420405 +2278 0.2278 3819.2776855677493586 67025.157301899715 +2279 0.2279 3812.5808561062926856 66911.431927236117 +2280 0.2280 3805.8953890455622968 66797.909287375413 +2281 0.2281 3799.2212641324326796 66684.588975217499 +2282 0.2282 3792.5584611544413747 66571.470584611307 +2283 0.2283 3785.9069599396930244 66458.553710356005 +2284 0.2284 3779.2667403567656947 66345.837948192609 +2285 0.2285 3772.6377823146158335 66233.322894808196 +2286 0.2286 3766.0200657624841369 66121.008147828587 +2287 0.2287 3759.4135706898018725 66008.893305817503 +2288 0.2288 3752.8182771260972004 65896.977968274208 +2289 0.2289 3746.2341651409019505 65785.261735629596 +2290 0.2290 3739.6612148436583993 65673.744209245095 +2291 0.2291 3733.0994063836255918 65562.424991409993 +2292 0.2292 3726.5487199497879374 65451.303685339706 +2293 0.2293 3720.0091357707624411 65340.379895170103 +2294 0.2294 3713.4806341147059356 65229.653225958697 +2295 0.2295 3706.9631952892241316 65119.123283679510 +2296 0.2296 3700.4567996412793036 65008.789675221313 +2297 0.2297 3693.9614275570988866 64898.652008387595 +2298 0.2298 3687.4770594620849806 64788.709891889404 +2299 0.2299 3681.0036758207229468 64678.962935348507 +2300 0.2300 3674.5412571364909127 64569.410749289105 +2301 0.2301 3668.0897839517692773 64460.052945139396 +2302 0.2302 3661.6492368477511263 64350.889135226898 +2303 0.2303 3655.2195964443508274 64241.918932780085 +2304 0.2304 3648.8008434001158093 64133.141951920203 +2305 0.2305 3642.3929584121365224 64024.557807661506 +2306 0.2306 3635.9959222159577621 63916.166115910703 +2307 0.2307 3629.6097155854890843 63807.966493460801 +2308 0.2308 3623.2343193329165842 63699.958557993596 +2309 0.2309 3616.8697143086133110 63592.141928071593 +2310 0.2310 3610.5158814010528658 63484.516223138795 +2311 0.2311 3604.1728015367198168 63377.081063520105 +2312 0.2312 3597.8404556800228420 63269.836070416204 +2313 0.2313 3591.5188248332069634 63162.780865899302 +2314 0.2314 3585.2078900362662353 63055.915072916396 +2315 0.2315 3578.9076323668564328 62949.238315282200 +2316 0.2316 3572.6180329402081952 62842.750217679000 +2317 0.2317 3566.3390729090415334 62736.450405655400 +2318 0.2318 3560.0707334634776089 62630.338505618711 +2319 0.2319 3553.8129958309546055 62524.414144841008 +2320 0.2320 3547.5658412761399632 62418.676951447502 +2321 0.2321 3541.3292511008462498 62313.126554423303 +2322 0.2322 3535.1032066439447590 62207.762583603297 +2323 0.2323 3528.8876892812809274 62102.584669675096 +2324 0.2324 3522.6826804255883872 61997.592444175098 +2325 0.2325 3516.4881615264052925 61892.785539484394 +2326 0.2326 3510.3041140699897369 61788.163588830896 +2327 0.2327 3504.1305195792342602 61683.726226282204 +2328 0.2328 3497.9673596135826301 61579.473086747807 +2329 0.2329 3491.8146157689466236 61475.403805971000 +2330 0.2330 3485.6722696776214434 61371.518020534597 +2331 0.2331 3479.5403030082020450 61267.815367850810 +2332 0.2332 3473.4186974655012818 61164.295486164498 +2333 0.2333 3467.3074347904657770 61060.958014548800 +2334 0.2334 3461.2064967600931595 60957.802592902211 +2335 0.2335 3455.1158651873506642 60854.828861949092 +2336 0.2336 3449.0355219210914584 60752.036463235199 +2337 0.2337 3442.9654488459736967 60649.425039123904 +2338 0.2338 3436.9056278823777575 60546.994232798897 +2339 0.2339 3430.8560409863248424 60444.743688258095 +2340 0.2340 3424.8166701493964865 60342.673050312791 +2341 0.2341 3418.7874973986513396 60240.781964585694 +2342 0.2342 3412.7685047965464946 60139.070077507597 +2343 0.2343 3406.7596744408551785 60037.537036316906 +2344 0.2344 3400.7609884645867169 59936.182489056009 +2345 0.2345 3394.7724290359055885 59835.006084569395 +2346 0.2346 3388.7939783580518451 59734.007472504600 +2347 0.2347 3382.8256186692615302 59633.186303303199 +2348 0.2348 3376.8673322426861887 59532.542228207298 +2349 0.2349 3370.9191013863132866 59432.074899249099 +2350 0.2350 3364.9809084428879942 59331.783969255499 +2351 0.2351 3359.0527357898331502 59231.669091843505 +2352 0.2352 3353.1345658391701363 59131.729921413804 +2353 0.2353 3347.2263810374415698 59031.966113157905 +2354 0.2354 3341.3281638656312680 58932.377323047491 +2355 0.2355 3335.4398968390869413 58832.963207837704 +2356 0.2356 3329.5615625074419768 58733.723425062104 +2357 0.2357 3323.6931434545372213 58634.657633032395 +2358 0.2358 3317.8346222983436746 58535.765490834005 +2359 0.2359 3311.9859816908856374 58437.046658327796 +2360 0.2360 3306.1472043181620393 58338.500796144595 +2361 0.2361 3300.3182729000704967 58240.127565685994 +2362 0.2362 3294.4991701903304602 58141.926629118207 +2363 0.2363 3288.6898789764059075 58043.897649375198 +2364 0.2364 3282.8903820794294006 57946.040290151803 +2365 0.2365 3277.1006623541265981 57848.354215907202 +2366 0.2366 3271.3207026887384927 57750.839091856302 +2367 0.2367 3265.5504860049468334 57653.494583973807 +2368 0.2368 3259.7899952577986369 57556.320358987403 +2369 0.2369 3254.0392134356302449 57459.316084380807 +2370 0.2370 3248.2981235599918364 57362.481428385807 +2371 0.2371 3242.5667086855733032 57265.816059985707 +2372 0.2372 3236.8449519001283079 57169.319648910998 +2373 0.2373 3231.1328363244010689 57072.991865635704 +2374 0.2374 3225.4303451120504178 56976.832381379492 +2375 0.2375 3219.7374614495761307 56880.840868102401 +2376 0.2376 3214.0541685562457133 56785.016998503597 +2377 0.2377 3208.3804496840193679 56689.360446021303 +2378 0.2378 3202.7162881174767790 56593.870884825992 +2379 0.2379 3197.0616671737443539 56498.547989827006 +2380 0.2380 3191.4165702024201892 56403.391436660597 +2381 0.2381 3185.7809805855022205 56308.400901696994 +2382 0.2382 3180.1548817373159181 56213.576062030501 +2383 0.2383 3174.5382571044401629 56118.916595484501 +2384 0.2384 3168.9310901656358510 56024.422180605092 +2385 0.2385 3163.3333644317726794 55930.092496660807 +2386 0.2386 3157.7450634457577507 55835.927223641607 +2387 0.2387 3152.1661707824628138 55741.926042255203 +2388 0.2388 3146.5966700486537775 55648.088633925494 +2389 0.2389 3141.0365448829179513 55554.414680791204 +2390 0.2390 3135.4857789555931049 55460.903865704502 +2391 0.2391 3129.9443559686965273 55367.555872229903 +2392 0.2392 3124.4122596558531768 55274.370384638802 +2393 0.2393 3118.8894737822256502 55181.347087911607 +2394 0.2394 3113.3759821444432419 55088.485667732901 +2395 0.2395 3107.8717685705319127 54995.785810491194 +2396 0.2396 3102.3768169198433498 54903.247203279301 +2397 0.2397 3096.8911110829849349 54810.869533886595 +2398 0.2398 3091.4146349817506234 54718.652490801906 +2399 0.2399 3085.9473725690500032 54626.595763213008 +2400 0.2400 3080.4893078288396282 54534.699040998094 +2401 0.2401 3075.0404247760529870 54442.962014731602 +2402 0.2402 3069.6007074565327457 54351.384375676702 +2403 0.2403 3064.1701399469598073 54259.965815786403 +2404 0.2404 3058.7487063547855541 54168.706027703003 +2405 0.2405 3053.3363908181627266 54077.604704751699 +2406 0.2406 3047.9331775058781204 53986.661540943802 +2407 0.2407 3042.5390506172825553 53895.876230969705 +2408 0.2408 3037.1539943822240275 53805.248470205006 +2409 0.2409 3031.7779930609790426 53714.777954699202 +2410 0.2410 3026.4110309441848585 53624.464381181097 +2411 0.2411 3021.0530923527730920 53534.307447053601 +2412 0.2412 3015.7041616379005973 53444.306850394503 +2413 0.2413 3010.3642231808835277 53354.462289950905 +2414 0.2414 3005.0332613931291235 53264.773465141203 +2415 0.2415 2999.7112607160693187 53175.240076053502 +2416 0.2416 2994.3982056210948031 53085.861823438296 +2417 0.2417 2989.0940806094872642 52996.638408712999 +2418 0.2418 2983.7988702123534495 52907.569533960697 +2419 0.2419 2978.5125589905592278 52818.654901920796 +2420 0.2420 2973.2351315346631964 52729.894215995701 +2421 0.2421 2967.9665724648511969 52641.287180244297 +2422 0.2422 2962.7068664308699226 52552.833499381995 +2423 0.2423 2957.4559981119618897 52464.532878779304 +2424 0.2424 2952.2139522167999530 52376.385024458694 +2425 0.2425 2946.9807134834222779 52288.389643094008 +2426 0.2426 2941.7562666791673109 52200.546442009203 +2427 0.2427 2936.5405966006082963 52112.855129175194 +2428 0.2428 2931.3336880734891565 52025.315413209799 +2429 0.2429 2926.1355259526599184 51937.927003374003 +2430 0.2430 2920.9460951220125935 51850.689609573805 +2431 0.2431 2915.7653804944161493 51763.602942354606 +2432 0.2432 2910.5933670116532994 51676.666712901999 +2433 0.2433 2905.4300396443563841 51589.880633038709 +2434 0.2434 2900.2753833919432509 51503.244415225607 +2435 0.2435 2895.1293832825540449 51416.757772556099 +2436 0.2436 2889.9920243729884533 51330.420418757996 +2437 0.2437 2884.8632917486411316 51244.232068190409 +2438 0.2438 2879.7431705234394030 51158.192435841898 +2439 0.2439 2874.6316458397809583 51072.301237328495 +2440 0.2440 2869.5287028684697361 50986.558188893199 +2441 0.2441 2864.4343268086549870 50900.963007405691 +2442 0.2442 2859.3485028877666991 50815.515410357591 +2443 0.2443 2854.2712163614555720 50730.215115860905 +2444 0.2444 2849.2024525135298063 50645.061842650393 +2445 0.2445 2844.1421966558932581 50560.055310078096 +2446 0.2446 2839.0904341284835937 50475.195238114095 +2447 0.2447 2834.0471502992108981 50390.481347342393 +2448 0.2448 2829.0123305638958300 50305.913358961196 +2449 0.2449 2823.9859603462086852 50221.490994783097 +2450 0.2450 2818.9680250976080060 50137.213977229301 +2451 0.2451 2813.9585102972800996 50053.082029330297 +2452 0.2452 2808.9574014520771925 49969.094874724695 +2453 0.2453 2803.9646840964578587 49885.252237659493 +2454 0.2454 2798.9803437924256286 49801.553842982008 +2455 0.2455 2794.0043661294694175 49717.999416145503 +2456 0.2456 2789.0367367245021342 49634.588683204303 +2457 0.2457 2784.0774412218011094 49551.321370811900 +2458 0.2458 2779.1264652929494332 49468.197206221193 +2459 0.2459 2774.1837946367741097 49385.215917281603 +2460 0.2460 2769.2494149792878488 49302.377232439292 +2461 0.2461 2764.3233120736294950 49219.680880731205 +2462 0.2462 2759.4054717000035453 49137.126591790395 +2463 0.2463 2754.4958796656219420 49054.714095837509 +2464 0.2464 2749.5945218046458649 48972.443123684905 +2465 0.2465 2744.7013839781247952 48890.313406732996 +2466 0.2466 2739.8164520739396721 48808.324676966702 +2467 0.2467 2734.9397120067433207 48726.476666958304 +2468 0.2468 2730.0711497179022444 48644.769109860303 +2469 0.2469 2725.2107511754384177 48563.201739412500 +2470 0.2470 2720.3585023739715325 48481.774289928202 +2471 0.2471 2715.5143893346598816 48400.486496306803 +2472 0.2472 2710.6783981051435148 48319.338094020408 +2473 0.2473 2705.8505147594864866 48238.328819120099 +2474 0.2474 2701.0307253981191025 48157.458408229504 +2475 0.2475 2696.2190161477801666 48076.726598546695 +2476 0.2476 2691.4153731614605931 47996.133127842899 +2477 0.2477 2686.6197826183456527 47915.677734455705 +2478 0.2478 2681.8322307237581299 47835.360157296396 +2479 0.2479 2677.0527037091014790 47755.180135840208 +2480 0.2480 2672.2811878318029812 47675.137410130999 +2481 0.2481 2667.5176693752578103 47595.231720775002 +2482 0.2482 2662.7621346487717346 47515.462808942604 +2483 0.2483 2658.0145699875060927 47435.830416367091 +2484 0.2484 2653.2749617524204950 47356.334285341603 +2485 0.2485 2648.5432963302177996 47276.974158715799 +2486 0.2486 2643.8195601332868137 47197.749779900900 +2487 0.2487 2639.1037395996486339 47118.660892861495 +2488 0.2488 2634.3958211928998026 47039.707242118697 +2489 0.2489 2629.6957914021563738 46960.888572745607 +2490 0.2490 2625.0036367420007082 46882.204630368098 +2491 0.2491 2620.3193437524241745 46803.655161162395 +2492 0.2492 2615.6428989987734894 46725.239911855104 +2493 0.2493 2610.9742890716947841 46646.958629718196 +2494 0.2494 2606.3135005870803980 46568.811062572298 +2495 0.2495 2601.6605201860124907 46490.796958782208 +2496 0.2496 2597.0153345347102913 46412.916067258309 +2497 0.2497 2592.3779303244750736 46335.168137450499 +2498 0.2498 2587.7482942716351317 46257.552919351801 +2499 0.2499 2583.1264131174930299 46180.070163493096 +2500 0.2500 2578.5122736282710321 46102.719620946293 +2501 0.2501 2573.9058625950578971 46025.501043318305 +2502 0.2502 2569.3071668337543088 45948.414182752800 +2503 0.2503 2564.7161731850205797 45871.458791925696 +2504 0.2504 2560.1328685142216273 45794.634624049708 +2505 0.2505 2555.5572397113760417 45717.941432865307 +2506 0.2506 2550.9892736911006068 45641.378972644598 +2507 0.2507 2546.4289573925589139 45564.946998190797 +2508 0.2508 2541.8762777794077010 45488.645264830899 +2509 0.2509 2537.3312218397450124 45412.473528423296 +2510 0.2510 2532.7937765860565378 45336.431545345607 +2511 0.2511 2528.2639290551642262 45260.519072504707 +2512 0.2512 2523.7416663081726256 45184.735867326002 +2513 0.2513 2519.2269754304184062 45109.081687759004 +2514 0.2514 2514.7198435314171547 45033.556292270499 +2515 0.2515 2510.2202577448110787 44958.159439847099 +2516 0.2516 2505.7282052283189842 44882.890889992304 +2517 0.2517 2501.2436731636830700 44807.750402727906 +2518 0.2518 2496.7666487566175419 44732.737738586598 +2519 0.2519 2492.2971192367572257 44657.852658616903 +2520 0.2520 2487.8350718576075451 44583.094924379795 +2521 0.2521 2483.3804938964913163 44508.464297944804 +2522 0.2522 2478.9333726544991805 44433.960541894907 +2523 0.2523 2474.4936954564386724 44359.583419316696 +2524 0.2524 2470.0614496507823787 44285.332693808101 +2525 0.2525 2465.6366226096183709 44211.208129472303 +2526 0.2526 2461.2192017285992733 44137.209490913890 +2527 0.2527 2456.8091744268913317 44063.336543244193 +2528 0.2528 2452.4065281471253002 43989.589052074101 +2529 0.2529 2448.0112503553455099 43915.966783518801 +2530 0.2530 2443.6233285409598466 43842.469504190398 +2531 0.2531 2439.2427502166901832 43769.096981199298 +2532 0.2532 2434.8695029185223575 43695.848982154908 +2533 0.2533 2430.5035742056566050 43622.725275160294 +2534 0.2534 2426.1449516604579912 43549.725628815402 +2535 0.2535 2421.7936228884063894 43476.849812213404 +2536 0.2536 2417.4495755180487322 43404.097594938306 +2537 0.2537 2413.1127972009485347 43331.468747065606 +2538 0.2538 2408.7832756116372366 43258.963039161194 +2539 0.2539 2404.4609984475650890 43186.580242281205 +2540 0.2540 2400.1459534290529518 43114.320127965395 +2541 0.2541 2395.8381282992427259 43042.182468243103 +2542 0.2542 2391.5375108240491500 42970.167035627703 +2543 0.2543 2387.2440887921120520 42898.273603115304 +2544 0.2544 2382.9578500147467821 42826.501944186399 +2545 0.2545 2378.6787823258973731 42754.851832802698 +2546 0.2546 2374.4068735820869733 42683.323043403994 +2547 0.2547 2370.1421116623710077 42611.915350912997 +2548 0.2548 2365.8844844682889743 42540.628530727903 +2549 0.2549 2361.6339799238162414 42469.462358722500 +2550 0.2550 2357.3905859753176628 42398.416611250410 +2551 0.2551 2353.1542905914984658 42327.491065134702 +2552 0.2552 2348.9250817633578663 42256.685497675295 +2553 0.2553 2344.7029475041417754 42185.999686643503 +2554 0.2554 2340.4878758492955058 42115.433410280406 +2555 0.2555 2336.2798548564164776 42044.986447297691 +2556 0.2556 2332.0788726052078346 41974.658576875998 +2557 0.2557 2327.8849171974306955 41904.449578663502 +2558 0.2558 2323.6979767568586794 41834.359232773393 +2559 0.2559 2319.5180394292306119 41764.387319785608 +2560 0.2560 2315.3450933822041407 41694.533620743801 +2561 0.2561 2311.1791268053093518 41624.797917154108 +2562 0.2562 2307.0201279099023850 41555.179990984892 +2563 0.2563 2302.8680849291199593 41485.679624665296 +2564 0.2564 2298.7229861178325336 41416.296601083704 +2565 0.2565 2294.5848197525988326 41347.030703587108 +2566 0.2566 2290.4535741316203712 41277.881715980198 +2567 0.2567 2286.3292375746950711 41208.849422523002 +2568 0.2568 2282.2117984231722403 41139.933607931496 +2569 0.2569 2278.1012450399070985 41071.134057375304 +2570 0.2570 2273.9975658092143931 41002.450556476993 +2571 0.2571 2269.9007491368251976 40933.882891310590 +2572 0.2572 2265.8107834498396187 40865.430848401702 +2573 0.2573 2261.7276571966831398 40797.094214724399 +2574 0.2574 2257.6513588470616014 40728.872777702003 +2575 0.2575 2253.5818768919161812 40660.766325205201 +2576 0.2576 2249.5191998433783738 40592.774645550504 +2577 0.2577 2245.4633162347258803 40524.897527500296 +2578 0.2578 2241.4142146203380435 40457.134760260400 +2579 0.2579 2237.3718835756508270 40389.486133480394 +2580 0.2580 2233.3363116971140698 40321.951437251795 +2581 0.2581 2229.3074876021460113 40254.530462106304 +2582 0.2582 2225.2853999290900902 40187.222999016405 +2583 0.2583 2221.2700373371694695 40120.028839392602 +2584 0.2584 2217.2613885064456554 40052.947775084096 +2585 0.2585 2213.2594421377725666 39985.979598375292 +2586 0.2586 2209.2641869527542440 39919.124101987894 +2587 0.2587 2205.2756116937011939 39852.381079076695 +2588 0.2588 2201.2937051235858235 39785.750323231201 +2589 0.2589 2197.3184560260006037 39719.231628472306 +2590 0.2590 2193.3498532051144139 39652.824789253107 +2591 0.2591 2189.3878854856288854 39586.529600456597 +2592 0.2592 2185.4325417127361106 39520.345857395303 +2593 0.2593 2181.4838107520758967 39454.273355809702 +2594 0.2594 2177.5416814896921096 39388.311891868507 +2595 0.2595 2173.6061428319903825 39322.461262165401 +2596 0.2596 2169.6771837056962795 39256.721263719905 +2597 0.2597 2165.7547930578116393 39191.091693975497 +2598 0.2598 2161.8389598555727389 39125.572350799390 +2599 0.2599 2157.9296730864089113 39060.163032479802 +2600 0.2600 2154.0269217578984353 38994.863537727193 +2601 0.2601 2150.1306948977285174 38929.673665671195 +2602 0.2602 2146.2409815536520910 38864.593215861401 +2603 0.2603 2142.3577707934459795 38799.621988264706 +2604 0.2604 2138.4810517048695147 38734.759783265603 +2605 0.2605 2134.6108133956231541 38670.006401663995 +2606 0.2606 2130.7470449933061900 38605.361644675795 +2607 0.2607 2126.8897356453758221 38540.825313929905 +2608 0.2608 2123.0388745191057751 38476.397211469397 +2609 0.2609 2119.1944508015449173 38412.077139748406 +2610 0.2610 2115.3564536994758782 38347.864901632805 +2611 0.2611 2111.5248724393741213 38283.760300398208 +2612 0.2612 2107.6996962673679263 38219.763139729796 +2613 0.2613 2103.8809144491956431 38155.873223720395 +2614 0.2614 2100.0685162701661284 38092.090356869907 +2615 0.2615 2096.2624910351182734 38028.414344085097 +2616 0.2616 2092.4628280683800767 37964.844990677302 +2617 0.2617 2088.6695167137281715 37901.382102362200 +2618 0.2618 2084.8825463343468982 37838.025485259095 +2619 0.2619 2081.1019063127896516 37774.774945889003 +2620 0.2620 2077.3275860509365884 37711.630291174704 +2621 0.2621 2073.5595749699559747 37648.591328439499 +2622 0.2622 2069.7978625102637125 37585.657865405294 +2623 0.2623 2066.0424381314837774 37522.829710193393 +2624 0.2624 2062.2932913124082006 37460.106671322195 +2625 0.2625 2058.5504115509565963 37397.488557706703 +2626 0.2626 2054.8137883641384178 37334.975178657405 +2627 0.2627 2051.0834112880115754 37272.566343879604 +2628 0.2628 2047.3592698776440102 37210.261863472399 +2629 0.2629 2043.6413537070741313 37148.061547927195 +2630 0.2630 2039.9296523692712526 37085.965208128306 +2631 0.2631 2036.2241554760973941 37023.972655349600 +2632 0.2632 2032.5248526582670365 36962.083701255899 +2633 0.2633 2028.8317335653091504 36900.298157900899 +2634 0.2634 2025.1447878655278600 36838.615837726109 +2635 0.2635 2021.4640052459635626 36777.036553560596 +2636 0.2636 2017.7893754123545023 36715.560118619498 +2637 0.2637 2014.1208880890983437 36654.186346503200 +2638 0.2638 2010.4585330192132915 36592.915051196891 +2639 0.2639 2006.8022999642998911 36531.746047069195 +2640 0.2640 2003.1521787045028304 36470.679148871197 +2641 0.2641 1999.5081590384725132 36409.714171735599 +2642 0.2642 1995.8702307833268605 36348.850931176305 +2643 0.2643 1992.2383837746137942 36288.089243086899 +2644 0.2644 1988.6126078662723557 36227.428923739797 +2645 0.2645 1984.9928929305960992 36166.869789785793 +2646 0.2646 1981.3792288581942103 36106.411658252597 +2647 0.2647 1977.7716055579544445 36046.054346544697 +2648 0.2648 1974.1700129570051558 35985.797672441404 +2649 0.2649 1970.5744410006782346 35925.641454097000 +2650 0.2650 1966.9848796524713634 35865.585510039295 +2651 0.2651 1963.4013188940109558 35805.629659168699 +2652 0.2652 1959.8237487250146387 35745.773720757599 +2653 0.2653 1956.2521591632541913 35686.017514449697 +2654 0.2654 1952.6865402445187101 35626.360860258006 +2655 0.2655 1949.1268820225775471 35566.803578565705 +2656 0.2656 1945.5731745691430206 35507.345490123706 +2657 0.2657 1942.0254079738342625 35447.986416050597 +2658 0.2658 1938.4835723441401569 35388.726177831704 +2659 0.2659 1934.9476578053827325 35329.564597318094 +2660 0.2660 1931.4176545006805554 35270.501496725505 +2661 0.2661 1927.8935525909125772 35211.536698634103 +2662 0.2662 1924.3753422546815273 35152.670025986605 +2663 0.2663 1920.8630136882777606 35093.901302088903 +2664 0.2664 1917.3565571056428780 35035.230350607693 +2665 0.2665 1913.8559627383340285 34976.656995570600 +2666 0.2666 1910.3612208354873019 34918.181061364696 +2667 0.2667 1906.8723216637822588 34859.802372736594 +2668 0.2668 1903.3892555074060056 34801.520754790101 +2669 0.2669 1899.9120126680170415 34743.336032987201 +2670 0.2670 1896.4405834647104712 34685.248033145595 +2671 0.2671 1892.9749582339811695 34627.256581438902 +2672 0.2672 1889.5151273296894487 34569.361504395092 +2673 0.2673 1886.0610811230249055 34511.562628896398 +2674 0.2674 1882.6128100024711784 34453.859782177904 +2675 0.2675 1879.1703043737709322 34396.252791827101 +2676 0.2676 1875.7335546598903875 34338.741485782499 +2677 0.2677 1872.3025513009845326 34281.325692333601 +2678 0.2678 1868.8772847543618809 34224.005240119601 +2679 0.2679 1865.4577454944494548 34166.779958128100 +2680 0.2680 1862.0439240127582252 34109.649675695502 +2681 0.2681 1858.6358108178480961 34052.614222505399 +2682 0.2682 1855.2333964352935709 33995.673428587303 +2683 0.2683 1851.8366714076482822 33938.827124317009 +2684 0.2684 1848.4456262944117952 33882.075140414905 +2685 0.2685 1845.0602516719936830 33825.417307945499 +2686 0.2686 1841.6805381336805567 33768.853458316502 +2687 0.2687 1838.3064762896008233 33712.383423278196 +2688 0.2688 1834.9380567666908064 33656.007034922201 +2689 0.2689 1831.5752702086606405 33599.724125681394 +2690 0.2690 1828.2181072759601648 33543.534528328295 +2691 0.2691 1824.8665586457450445 33487.438075975100 +2692 0.2692 1821.5206150118426649 33431.434602072099 +2693 0.2693 1818.1802670847187073 33375.523940407598 +2694 0.2694 1814.8455055914430432 33319.705925106296 +2695 0.2695 1811.5163212756563098 33263.980390629797 +2696 0.2696 1808.1927048975360321 33208.347171774003 +2697 0.2697 1804.8746472337638806 33152.806103670009 +2698 0.2698 1801.5621390774913380 33097.357021782802 +2699 0.2699 1798.2551712383067297 33041.999761909894 +2700 0.2700 1794.9537345422022554 32986.734160181099 +2701 0.2701 1791.6578198315403370 32931.560053057903 +2702 0.2702 1788.3674179650208771 32876.477277332109 +2703 0.2703 1785.0825198176480626 32821.485670125803 +2704 0.2704 1781.8031162806973953 32766.585068889704 +2705 0.2705 1778.5291982616827227 32711.775311403500 +2706 0.2706 1775.2607566843239510 32657.056235773802 +2707 0.2707 1771.9977824885136215 32602.427680434710 +2708 0.2708 1768.7402666302846228 32547.889484145904 +2709 0.2709 1765.4882000817776770 32493.441485992706 +2710 0.2710 1762.2415738312088251 32439.083525384500 +2711 0.2711 1759.0003788828369125 32384.815442054991 +2712 0.2712 1755.7646062569310743 32330.637076061001 +2713 0.2713 1752.5342469897389037 32276.548267781101 +2714 0.2714 1749.3092921334539369 32222.548857916001 +2715 0.2715 1746.0897327561838210 32168.638687486804 +2716 0.2716 1742.8755599419177997 32114.817597834997 +2717 0.2717 1739.6667647904948808 32061.085430621199 +2718 0.2718 1736.4633384175726860 32007.442027824596 +2719 0.2719 1733.2652719545942546 31953.887231742607 +2720 0.2720 1730.0725565487575750 31900.420884989202 +2721 0.2721 1726.8851833629832981 31847.042830494902 +2722 0.2722 1723.7031435758831321 31793.752911506497 +2723 0.2723 1720.5264283817284650 31740.550971584897 +2724 0.2724 1717.3550289904189867 31687.436854605403 +2725 0.2725 1714.1889366274508575 31634.410404757298 +2726 0.2726 1711.0281425338857844 31581.471466541901 +2727 0.2727 1707.8726379663200987 31528.619884772808 +2728 0.2728 1704.7224141968526965 31475.855504575404 +2729 0.2729 1701.5774625130545701 31423.178171384890 +2730 0.2730 1698.4377742179378856 31370.587730946798 +2731 0.2731 1695.3033406299248327 31318.084029315905 +2732 0.2732 1692.1741530828162468 31265.666912854998 +2733 0.2733 1689.0502029257618233 31213.336228235101 +2734 0.2734 1685.9314815232282854 31161.091822433904 +2735 0.2735 1682.8179802549698252 31108.933542735402 +2736 0.2736 1679.7096905159964990 31056.861236729805 +2737 0.2737 1676.6066037165444413 31004.874752311101 +2738 0.2738 1673.5087112820449420 30952.973937678697 +2739 0.2739 1670.4160046530942054 30901.158641334994 +2740 0.2740 1667.3284752854231101 30849.428712085006 +2741 0.2741 1664.2461146498669677 30797.783999036103 +2742 0.2742 1661.1689142323352826 30746.224351597004 +2743 0.2743 1658.0968655337815107 30694.749619477298 +2744 0.2744 1655.0299600701732743 30643.359652686609 +2745 0.2745 1651.9681893724623478 30592.054301533499 +2746 0.2746 1648.9115449865544178 30540.833416626003 +2747 0.2747 1645.8600184732797516 30489.696848869105 +2748 0.2748 1642.8136014083629561 30438.644449466206 +2749 0.2749 1639.7722853823938749 30387.676069916401 +2750 0.2750 1636.7360620007973466 30336.791562015409 +2751 0.2751 1633.7049228838038744 30285.990777853694 +2752 0.2752 1630.6788596664202942 30235.273569816600 +2753 0.2753 1627.6578639984002166 30184.639790583307 +2754 0.2754 1624.6419275442146954 30134.089293126301 +2755 0.2755 1621.6310419830228966 30083.621930710397 +2756 0.2756 1618.6251990086427668 30033.237556892796 +2757 0.2757 1615.6243903295221571 29982.936025521398 +2758 0.2758 1612.6286076687092645 29932.717190735006 +2759 0.2759 1609.6378427638244375 29882.580906962205 +2760 0.2760 1606.6520873670303899 29832.527028920900 +2761 0.2761 1603.6713332450035523 29782.555411617497 +2762 0.2762 1600.6955721789054223 29732.665910346608 +2763 0.2763 1597.7247959643536888 29682.858380689300 +2764 0.2764 1594.7589964113935821 29633.132678514601 +2765 0.2765 1591.7981653444689982 29583.488659976094 +2766 0.2766 1588.8422946023945315 29533.926181513598 +2767 0.2767 1585.8913760383263707 29484.445099851604 +2768 0.2768 1582.9454015197338776 29435.045271997697 +2769 0.2769 1580.0043629283718474 29385.726555244000 +2770 0.2770 1577.0682521602514043 29336.488807164395 +2771 0.2771 1574.1370611256124903 29287.331885615604 +2772 0.2772 1571.2107817488949877 29238.255648735394 +2773 0.2773 1568.2894059687112076 29189.259954942099 +2774 0.2774 1565.3729257378174680 29140.344662934898 +2775 0.2775 1562.4613330230861266 29091.509631691704 +2776 0.2776 1559.5546198054780689 29042.754720470206 +2777 0.2777 1556.6527780800142864 28994.079788805400 +2778 0.2778 1553.7557998557485917 28945.484696510495 +2779 0.2779 1550.8636771557391967 28896.969303675505 +2780 0.2780 1547.9764020170221102 28848.533470667106 +2781 0.2781 1545.0939664905824884 28800.177058127301 +2782 0.2782 1542.2163626413273505 28751.899926973398 +2783 0.2783 1539.3435825480587482 28703.701938397004 +2784 0.2784 1536.4756183034457990 28655.582953864105 +2785 0.2785 1533.6124620139969466 28607.542835113403 +2786 0.2786 1530.7541058000333578 28559.581444156400 +2787 0.2787 1527.9005417956616384 28511.698643276803 +2788 0.2788 1525.0517621487463202 28463.894295029502 +2789 0.2789 1522.2077590208828042 28416.168262239895 +2790 0.2790 1519.3685245873705298 28368.520408004595 +2791 0.2791 1516.5340510371859182 28320.950595688206 +2792 0.2792 1513.7043305729553140 28273.458688925908 +2793 0.2793 1510.8793554109279285 28226.044551620100 +2794 0.2794 1508.0591177809499186 28178.708047941400 +2795 0.2795 1505.2436099264364202 28131.449042327404 +2796 0.2796 1502.4328241043458547 28084.267399482298 +2797 0.2797 1499.6267525851528717 28037.162984376104 +2798 0.2798 1496.8253876528217461 27990.135662244596 +2799 0.2799 1494.0287216047802303 27943.185298587494 +2800 0.2800 1491.2367467518922695 27896.311759169599 +2801 0.2801 1488.4494554184327626 27849.514910018399 +2802 0.2802 1485.6668399420605056 27802.794617424806 +2803 0.2803 1482.8888926737922702 27756.150747942091 +2804 0.2804 1480.1156059779759744 27709.583168385092 +2805 0.2805 1477.3469722322652160 27663.091745830199 +2806 0.2806 1474.5829838275931252 27616.676347613706 +2807 0.2807 1471.8236331681457614 27570.336841332704 +2808 0.2808 1469.0689126713368751 27524.073094842999 +2809 0.2809 1466.3188147677817597 27477.884976259804 +2810 0.2810 1463.5733319012708762 27431.772353956403 +2811 0.2811 1460.8324565287448422 27385.735096563498 +2812 0.2812 1458.0961811202682838 27339.773072969401 +2813 0.2813 1455.3644981590039151 27293.886152318293 +2814 0.2814 1452.6374001411875270 27248.074204010998 +2815 0.2815 1449.9148795761018391 27202.337097703108 +2816 0.2816 1447.1969289860514891 27156.674703305493 +2817 0.2817 1444.4835409063371117 27111.086890982901 +2818 0.2818 1441.7747078852303275 27065.573531153896 +2819 0.2819 1439.0704224839480503 27020.134494490194 +2820 0.2820 1436.3706772766277027 26974.769651915805 +2821 0.2821 1433.6754648503015233 26929.478874607303 +2822 0.2822 1430.9847778048715554 26884.262033991698 +2823 0.2823 1428.2986087530846362 26839.119001747691 +2824 0.2824 1425.6169503205071578 26794.049649803594 +2825 0.2825 1422.9397951455000566 26749.053850337994 +2826 0.2826 1420.2671358791942566 26704.131475778406 +2827 0.2827 1417.5989651854652038 26659.282398800991 +2828 0.2828 1414.9352757409087644 26614.506492329507 +2829 0.2829 1412.2760602348155317 26569.803629536196 +2830 0.2830 1409.6213113691467242 26525.173683839203 +2831 0.2831 1406.9710218585096300 26480.616528903600 +2832 0.2832 1404.3251844301323672 26436.132038640295 +2833 0.2833 1401.6837918238400107 26391.720087205293 +2834 0.2834 1399.0468367920298078 26347.380548999397 +2835 0.2835 1396.4143120996463949 26303.113298667806 +2836 0.2836 1393.7862105241581503 26258.918211099000 +2837 0.2837 1391.1625248555319558 26214.795161425005 +2838 0.2838 1388.5432478962097775 26170.744025020103 +2839 0.2839 1385.9283724610836543 26126.764677500600 +2840 0.2840 1383.3178913774725061 26082.856994724592 +2841 0.2841 1380.7117974850966675 26039.020852790898 +2842 0.2842 1378.1100836360551511 25995.256128038607 +2843 0.2843 1375.5127426948008633 25951.562697047200 +2844 0.2844 1372.9197675381167301 25907.940436634897 +2845 0.2845 1370.3311510550920502 25864.389223859303 +2846 0.2846 1367.7468861470983938 25820.908936015694 +2847 0.2847 1365.1669657277657279 25777.499450637893 +2848 0.2848 1362.5913827229589970 25734.160645496100 +2849 0.2849 1360.0201300707542487 25690.892398598000 +2850 0.2850 1357.4532007214149871 25647.694588186896 +2851 0.2851 1354.8905876373685260 25604.567092741992 +2852 0.2852 1352.3322837931825688 25561.509790977805 +2853 0.2853 1349.7782821755415625 25518.522561842998 +2854 0.2854 1347.2285757832232775 25475.605284520709 +2855 0.2855 1344.6831576270758433 25432.757838427591 +2856 0.2856 1342.1420207299938738 25389.980103213304 +2857 0.2857 1339.6051581268952759 25347.271958760008 +2858 0.2858 1337.0725628646982841 25304.633285181801 +2859 0.2859 1334.5442280022980412 25262.063962824795 +2860 0.2860 1332.0201466105436339 25219.563872265600 +2861 0.2861 1329.5003117722146726 25177.132894311595 +2862 0.2862 1326.9847165819990096 25134.770909999694 +2863 0.2863 1324.4733541464690916 25092.477800597000 +2864 0.2864 1321.9662175840592226 25050.253447598996 +2865 0.2865 1319.4633000250428267 25008.097732730093 +2866 0.2866 1316.9645946115092556 24966.010537942209 +2867 0.2867 1314.4700944973415062 24923.991745414991 +2868 0.2868 1311.9797928481930285 24882.041237555197 +2869 0.2869 1309.4936828414654428 24840.158896995599 +2870 0.2870 1307.0117576662858028 24798.344606595303 +2871 0.2871 1304.5340105234840848 24756.598249438706 +2872 0.2872 1302.0604346255704513 24714.919708835201 +2873 0.2873 1299.5910231967127402 24673.308868318702 +2874 0.2874 1297.1257694727144099 24631.765611647097 +2875 0.2875 1294.6646667009920293 24590.289822801802 +2876 0.2876 1292.2077081405525405 24548.881385986904 +2877 0.2877 1289.7548870619716581 24507.540185629397 +2878 0.2878 1287.3061967473713594 24466.266106378105 +2879 0.2879 1284.8616304903973742 24425.059033103396 +2880 0.2880 1282.4211815961973571 24383.918850896800 +2881 0.2881 1279.9848433813990596 24342.845445070001 +2882 0.2882 1277.5526091740878201 24301.838701155204 +2883 0.2883 1275.1244723137849633 24260.898504904195 +2884 0.2884 1272.7004261514252903 24220.024742287307 +2885 0.2885 1270.2804640493361603 24179.217299494296 +2886 0.2886 1267.8645793812147531 24138.476062932394 +2887 0.2887 1265.4527655321066959 24097.800919226698 +2888 0.2888 1263.0450158983844631 24057.191755219901 +2889 0.2889 1260.6413238877248659 24016.648457970492 +2890 0.2890 1258.2416829190885892 23976.170914754504 +2891 0.2891 1255.8460864226976810 23935.759013062299 +2892 0.2892 1253.4545278400146344 23895.412640600603 +2893 0.2893 1251.0670006237201051 23855.131685290798 +2894 0.2894 1248.6834982376922198 23814.916035267910 +2895 0.2895 1246.3040141569847492 23774.765578881699 +2896 0.2896 1243.9285418678059614 23734.680204694800 +2897 0.2897 1241.5570748674970218 23694.659801483103 +2898 0.2898 1239.1896066645110750 23654.704258234997 +2899 0.2899 1236.8261307783918710 23614.813464150502 +2900 0.2900 1234.4666407397521652 23574.987308641605 +2901 0.2901 1232.1111300902534822 23535.225681331307 +2902 0.2902 1229.7595923825842874 23495.528472053098 +2903 0.2903 1227.4120211804390692 23455.895570850800 +2904 0.2904 1225.0684100584976477 23416.326867977696 +2905 0.2905 1222.7287526024040289 23376.822253896797 +2906 0.2906 1220.3930424087452593 23337.381619279600 +2907 0.2907 1218.0612730850309617 23298.004855005696 +2908 0.2908 1215.7334382496724174 23258.691852163196 +2909 0.2909 1213.4095315319618749 23219.442502047197 +2910 0.2910 1211.0895465720514039 23180.256696160010 +2911 0.2911 1208.7734770209328872 23141.134326210304 +2912 0.2912 1206.4613165404166466 23102.075284112900 +2913 0.2913 1204.1530588031116622 23063.079461988404 +2914 0.2914 1201.8486974924041988 23024.146752162495 +2915 0.2915 1199.5482263024377971 22985.277047165495 +2916 0.2916 1197.2516389380928103 22946.470239732495 +2917 0.2917 1194.9589291149661676 22907.726222801699 +2918 0.2918 1192.6700905593502284 22869.044889515302 +2919 0.2919 1190.3851170082134558 22830.426133218600 +2920 0.2920 1188.1040022091794981 22791.869847458904 +2921 0.2921 1185.8267399205071797 22753.375925985907 +2922 0.2922 1183.5533239110702652 22714.944262750796 +2923 0.2923 1181.2837479603374504 22676.574751906410 +2924 0.2924 1179.0180058583518985 22638.267287805895 +2925 0.2925 1176.7560914057114587 22600.021765002995 +2926 0.2926 1174.4979984135486575 22561.838078251400 +2927 0.2927 1172.2437207035109168 22523.716122504004 +2928 0.2928 1169.9932521077400907 22485.655792913094 +2929 0.2929 1167.7465864688529109 22447.656984829497 +2930 0.2930 1165.5037176399214331 22409.719593802198 +2931 0.2931 1163.2646394844523456 22371.843515577697 +2932 0.2932 1161.0293458763685521 22334.028646100400 +2933 0.2933 1158.7978306999880260 22296.274881510893 +2934 0.2934 1156.5700878500051658 22258.582118147198 +2935 0.2935 1154.3461112314707862 22220.950252542396 +2936 0.2936 1152.1258947597723363 22183.379181425895 +2937 0.2937 1149.9094323606150283 22145.868801722107 +2938 0.2938 1147.6967179700013730 22108.419010550104 +2939 0.2939 1145.4877455342127632 22071.029705223402 +2940 0.2940 1143.2825090097890097 22033.700783249689 +2941 0.2941 1141.0810023635099242 21996.432142329904 +2942 0.2942 1138.8832195723755376 21959.223680358395 +2943 0.2943 1136.6891546235865462 21922.075295421906 +2944 0.2944 1134.4988015145254394 21884.986885799706 +2945 0.2945 1132.3121542527374004 21847.958349962697 +2946 0.2946 1130.1292068559105246 21810.989586573698 +2947 0.2947 1127.9499533518576300 21774.080494485999 +2948 0.2948 1125.7743877784960205 21737.230972744001 +2949 0.2949 1123.6025041838297511 21700.440920581997 +2950 0.2950 1121.4342966259293917 21663.710237424202 +2951 0.2951 1119.2697591729140640 21627.038822884606 +2952 0.2952 1117.1088859029316609 21590.426576765603 +2953 0.2953 1114.9516709041404283 21553.873399058597 +2954 0.2954 1112.7981082746903212 21517.379189943109 +2955 0.2955 1110.6481921227039038 21480.943849786192 +2956 0.2956 1108.5019165662574778 21444.567279142808 +2957 0.2957 1106.3592757333626651 21408.249378754495 +2958 0.2958 1104.2202637619475354 21371.990049549408 +2959 0.2959 1102.0848747998379622 21335.789192641801 +2960 0.2960 1099.9531030047392051 21299.646709332294 +2961 0.2961 1097.8249425442172651 21263.562501106295 +2962 0.2962 1095.7003875956802403 21227.536469634397 +2963 0.2963 1093.5794323463599085 21191.568516771702 +2964 0.2964 1091.4620709932935370 21155.658544557708 +2965 0.2965 1089.3482977433047836 21119.806455215505 +2966 0.2966 1087.2381068129864161 21084.012151151801 +2967 0.2967 1085.1314924286809855 21048.275534956098 +2968 0.2968 1083.0284488264630909 21012.596509400799 +2969 0.2969 1080.9289702521209620 20976.974977440201 +2970 0.2970 1078.8330509611384969 20941.410842210797 +2971 0.2971 1076.7406852186763899 20905.904007030193 +2972 0.2972 1074.6518672995550787 20870.454375397603 +2973 0.2973 1072.5665914882356446 20835.061850992402 +2974 0.2974 1070.4848520788023052 20799.726337674198 +2975 0.2975 1068.4066433749444514 20764.447739483301 +2976 0.2976 1066.3319596899384578 20729.225960638396 +2977 0.2977 1064.2607953466297204 20694.060905538397 +2978 0.2978 1062.1931446774146934 20658.952478760504 +2979 0.2979 1060.1290020242236096 20623.900585060299 +2980 0.2980 1058.0683617385020625 20588.905129371196 +2981 0.2981 1056.0112181811932714 20553.966016804603 +2982 0.2982 1053.9575657227205738 20519.083152649095 +2983 0.2983 1051.9073987429696899 20484.256442369908 +2984 0.2984 1049.8607116312707603 20449.485791608902 +2985 0.2985 1047.8174987863810657 20414.771106184300 +2986 0.2986 1045.7777546164672913 20380.112292089398 +2987 0.2987 1043.7414735390882470 20345.509255493700 +2988 0.2988 1041.7086499811764497 20310.961902741205 +2989 0.2989 1039.6792783790217527 20276.470140350699 +2990 0.2990 1037.6533531782533828 20242.033875014895 +2991 0.2991 1035.6308688338226602 20207.653013600895 +2992 0.2992 1033.6118198099852634 20173.327463149100 +2993 0.2993 1031.5962005802841759 20139.057130873094 +2994 0.2994 1029.5840056275326333 20104.841924159002 +2995 0.2995 1027.5752294437963883 20070.681750566000 +2996 0.2996 1025.5698665303768848 20036.576517824404 +2997 0.2997 1023.5679113977937504 20002.526133836800 +2998 0.2998 1021.5693585657680842 19968.530506677002 +2999 0.2999 1019.5742025632047216 19934.589544590097 +3000 0.3000 1017.5824379281756364 19900.703155990996 +3001 0.3001 1015.5940592079027738 19866.871249465505 +3002 0.3002 1013.6090609587409972 19833.093733768997 +3003 0.3003 1011.6274377461612630 19799.370517826697 +3004 0.3004 1009.6491841447333400 19765.701510732397 +3005 0.3005 1007.6742947381092108 19732.086621749200 +3006 0.3006 1005.7027641190063605 19698.525760308701 +3007 0.3007 1003.7345868891903820 19665.018836009905 +3008 0.3008 1001.7697576594588327 19631.565758620403 +3009 0.3009 999.8082710496240679 19598.166438074702 +3010 0.3010 997.8501216884966425 19564.820784474199 +3011 0.3011 995.8953042138685987 19531.528708087404 +3012 0.3012 993.9438132724967545 19498.290119348705 +3013 0.3013 991.9956435200863325 19465.104928858804 +3014 0.3014 990.0507896212742480 19431.973047383901 +3015 0.3015 988.1092462496122835 19398.894385855405 +3016 0.3016 986.1710080875510585 19365.868855369699 +3017 0.3017 984.2360698264232042 19332.896367187699 +3018 0.3018 982.3044261664271062 19299.976832734603 +3019 0.3019 980.3760718166104198 19267.110163599398 +3020 0.3020 978.4510014948536991 19234.296271534702 +3021 0.3021 976.5292099278541400 19201.535068456295 +3022 0.3022 974.6106918511092090 19168.826466442901 +3023 0.3023 972.6954420089002724 19136.170377735602 +3024 0.3024 970.7834551542765666 19103.566714737703 +3025 0.3025 968.8747260490389408 19071.015390014101 +3026 0.3026 966.9692494637235995 19038.516316291898 +3027 0.3027 965.0670201775860733 19006.069406458402 +3028 0.3028 963.1680329785850745 18973.674573562297 +3029 0.3029 961.2722826633663544 18941.331730812701 +3030 0.3030 959.3797640372467868 18909.040791578598 +3031 0.3031 957.4904719141984515 18876.801669389199 +3032 0.3032 955.6044011168323777 18844.614277932604 +3033 0.3033 953.7215464763829686 18812.478531056702 +3034 0.3034 951.8419028326917442 18780.394342767504 +3035 0.3035 949.9654650341918796 18748.361627229802 +3036 0.3036 948.0922279378920621 18716.380298766904 +3037 0.3037 946.2221864093608019 18684.450271859001 +3038 0.3038 944.3553353227106300 18652.571461144697 +3039 0.3039 942.4916695605824088 18620.743781418896 +3040 0.3040 940.6311840141297580 18588.967147634197 +3041 0.3041 938.7738735830031374 18557.241474898801 +3042 0.3042 936.9197331753342723 18525.566678477706 +3043 0.3043 935.0687577077208061 18493.942673791098 +3044 0.3044 933.2209421052104972 18462.369376415496 +3045 0.3045 931.3762813012856441 18430.846702082199 +3046 0.3046 929.5347702378477379 18399.374566676801 +3047 0.3047 927.6964038652018871 18367.952886240295 +3048 0.3048 925.8611771420414698 18336.581576967401 +3049 0.3049 924.0290850354327858 18305.260555206805 +3050 0.3050 922.2001225207993684 18273.989737461001 +3051 0.3051 920.3742845819070908 18242.769040385203 +3052 0.3052 918.5515662108484776 18211.598380788004 +3053 0.3053 916.7319624080275844 18180.477675630202 +3054 0.3054 914.9154681821447639 18149.406842025499 +3055 0.3055 913.1020785501815453 18118.385797238996 +3056 0.3056 911.2917885373851732 18087.414458687497 +3057 0.3057 909.4845931772538279 18056.492743939401 +3058 0.3058 907.6804875115211644 18025.620570713996 +3059 0.3059 905.8794665901414191 17994.797856881196 +3060 0.3060 904.0815254712742899 17964.024520461600 +3061 0.3061 902.2866592212699288 17933.300479625403 +3062 0.3062 900.4948629146540497 17902.625652693001 +3063 0.3063 898.7061316341126940 17871.999958133900 +3064 0.3064 896.9204604704776784 17841.423314567197 +3065 0.3065 895.1378445227112479 17810.895640760398 +3066 0.3066 893.3582788978917506 17780.416855629599 +3067 0.3067 891.5817587111982903 17749.986878239302 +3068 0.3068 889.8082790858961744 17719.605627801902 +3069 0.3069 888.0378351533222485 17689.273023677102 +3070 0.3070 886.2704220528697761 17658.988985372300 +3071 0.3071 884.5060349319741135 17628.753432541700 +3072 0.3072 882.7446689460977041 17598.566284986104 +3073 0.3073 880.9863192587157528 17568.427462652595 +3074 0.3074 879.2309810413013338 17538.336885634999 +3075 0.3075 877.4786494733109521 17508.294474172006 +3076 0.3076 875.7293197421698778 17478.300148648399 +3077 0.3077 873.9829870432577081 17448.353829593907 +3078 0.3078 872.2396465798938152 17418.455437683297 +3079 0.3079 870.4992935633229081 17388.604893735603 +3080 0.3080 868.7619232127003670 17358.802118714200 +3081 0.3081 867.0275307550783737 17329.047033726798 +3082 0.3082 865.2961114253907908 17299.339560024498 +3083 0.3083 863.5676604664395200 17269.679619001705 +3084 0.3084 861.8421731288796082 17240.067132196098 +3085 0.3085 860.1196446712053785 17210.502021288004 +3086 0.3086 858.4000703597359916 17180.984208100497 +3087 0.3087 856.6834454686010076 17151.513614598298 +3088 0.3088 854.9697652797266301 17122.090162888700 +3089 0.3089 853.2590250828211538 17092.713775220196 +3090 0.3090 851.5512201753609816 17063.384373982699 +3091 0.3091 849.8463458625765270 17034.101881707196 +3092 0.3092 848.1443974574378899 17004.866221065298 +3093 0.3093 846.4453702806412139 16975.677314869201 +3094 0.3094 844.7492596605942481 16946.535086071097 +3095 0.3095 843.0560609334024775 16917.439457763197 +3096 0.3096 841.3657694428554805 16888.390353177398 +3097 0.3097 839.6783805404123768 16859.387695684498 +3098 0.3098 837.9938895851884126 16830.431408794699 +3099 0.3099 836.3122919439408633 16801.521416156800 +3100 0.3100 834.6335829910551638 16772.657641557904 +3101 0.3101 832.9577581085311522 16743.840008923398 +3102 0.3102 831.2848126859692002 16715.068442316500 +3103 0.3103 829.6147421205564569 16686.342865937906 +3104 0.3104 827.9475418170532066 16657.663204126002 +3105 0.3105 826.2832071877791122 16629.029381355700 +3106 0.3106 824.6217336525993460 16600.441322238999 +3107 0.3107 822.9631166389111741 16571.898951523995 +3108 0.3108 821.3073515816302006 16543.402194095601 +3109 0.3109 819.6544339231767253 16514.950974973806 +3110 0.3110 818.0043591134623284 16486.545219314903 +3111 0.3111 816.3571226098761144 16458.184852410101 +3112 0.3112 814.7127198772712973 16429.869799685897 +3113 0.3113 813.0711463879517851 16401.599986703499 +3114 0.3114 811.4323976216586516 16373.375339158702 +3115 0.3115 809.7964690655566073 16345.195782881303 +3116 0.3116 808.1633562142208120 16317.061243835298 +3117 0.3117 806.5330545696231184 16288.971648118495 +3118 0.3118 804.9055596411191118 16260.926921961596 +3119 0.3119 803.2808669454345818 16232.926991728898 +3120 0.3120 801.6589720066522204 16204.971783917499 +3121 0.3121 800.0398703561985485 16177.061225156896 +3122 0.3122 798.4235575328302730 16149.195242209200 +3123 0.3123 796.8100290826214405 16121.373761968302 +3124 0.3124 795.1992805589500222 16093.596711459897 +3125 0.3125 793.5913075224849536 16065.864017841603 +3126 0.3126 791.9861055411728330 16038.175608401500 +3127 0.3127 790.3836701902247341 16010.531410559503 +3128 0.3128 788.7839970521034729 15982.931351865795 +3129 0.3129 787.1870817165100789 15955.375360001002 +3130 0.3130 785.5929197803712896 15927.863362775897 +3131 0.3131 784.0015068478259082 15900.395288131404 +3132 0.3132 782.4128385302124116 15872.971064138001 +3133 0.3133 780.8269104460557628 15845.590618995302 +3134 0.3134 779.2437182210543369 15818.253881032397 +3135 0.3135 777.6632574880674156 15790.960778706998 +3136 0.3136 776.0855238871017718 15763.711240605502 +3137 0.3137 774.5105130652993921 15736.505195442704 +3138 0.3138 772.9382206769241748 15709.342572061199 +3139 0.3139 771.3686423833495382 15682.223299431804 +3140 0.3140 769.8017738530453471 15655.147306652594 +3141 0.3141 768.2376107615652927 15628.114522949094 +3142 0.3142 766.6761487915341604 15601.124877673596 +3143 0.3143 765.1173836326352102 15574.178300305502 +3144 0.3144 763.5613109815974440 15547.274720450601 +3145 0.3145 762.0079265421828723 15520.414067840895 +3146 0.3146 760.4572260251741227 15493.596272334398 +3147 0.3147 758.9092051483615933 15466.821263915102 +3148 0.3148 757.3638596365312878 15440.088972692000 +3149 0.3149 755.8211852214517421 15413.399328899599 +3150 0.3150 754.2811776418618592 15386.752262897702 +3151 0.3151 752.7438326434584042 15360.147705170501 +3152 0.3152 751.2091459788834982 15333.585586326502 +3153 0.3153 749.6771134077122269 15307.065837098802 +3154 0.3154 748.1477306964400213 15280.588388344295 +3155 0.3155 746.6209936184706066 15254.153171043698 +3156 0.3156 745.0968979541033832 15227.760116300902 +3157 0.3157 743.5754394905211484 15201.409155343601 +3158 0.3158 742.0566140217779321 15175.100219521795 +3159 0.3159 740.5404173487863773 15148.833240308799 +3160 0.3160 739.0268452793059168 15122.608149300002 +3161 0.3161 737.5158936279302679 15096.424878212994 +3162 0.3162 736.0075582160752674 15070.283358887900 +3163 0.3163 734.5018348719665937 15044.183523285901 +3164 0.3164 732.9987194306278298 15018.125303489898 +3165 0.3165 731.4982077338680710 14992.108631704301 +3166 0.3166 730.0002956302701023 14966.133440254300 +3167 0.3167 728.5049789751781191 14940.199661585801 +3168 0.3168 727.0122536306855636 14914.307228265097 +3169 0.3169 725.5221154656233011 14888.456072979301 +3170 0.3170 724.0345603555475691 14862.646128534601 +3171 0.3171 722.5495841827279264 14836.877327858405 +3172 0.3172 721.0671828361352027 14811.149603996004 +3173 0.3173 719.5873522114297884 14785.462890113296 +3174 0.3174 718.1100882109493568 14759.817119494503 +3175 0.3175 716.6353867436974951 14734.212225542899 +3176 0.3176 715.1632437253313128 14708.648141780497 +3177 0.3177 713.6936550781499591 14683.124801847400 +3178 0.3178 712.2266167310824585 14657.642139501804 +3179 0.3179 710.7621246196763423 14632.200088620200 +3180 0.3180 709.3001746860854837 14606.798583196098 +3181 0.3181 707.8407628790586159 14581.437557340803 +3182 0.3182 706.3838851539273946 14556.116945282796 +3183 0.3183 704.9295374725949159 14530.836681367298 +3184 0.3184 703.4777158035237790 14505.596700055998 +3185 0.3185 702.0284161217246037 14480.396935927703 +3186 0.3186 700.5816344087443213 14455.237323676898 +3187 0.3187 699.1373666526548050 14430.117798114195 +3188 0.3188 697.6956088480408198 14405.038294165999 +3189 0.3189 696.2563569959887673 14379.998746874400 +3190 0.3190 694.8196071040752031 14354.999091396297 +3191 0.3191 693.3853551863551274 14330.039263004197 +3192 0.3192 691.9535972633506162 14305.119197084896 +3193 0.3193 690.5243293620393388 14280.238829140304 +3194 0.3194 689.0975475158429617 14255.398094786404 +3195 0.3195 687.6732477646160078 14230.596929753301 +3196 0.3196 686.2514261546340322 14205.835269885298 +3197 0.3197 684.8320787385828226 14181.113051139997 +3198 0.3198 683.4152015755463481 14156.430209588601 +3199 0.3199 682.0007907309960729 14131.786681415804 +3200 0.3200 680.5888422767793600 14107.182402918901 +3201 0.3201 679.1793522911079890 14082.617310508002 +3202 0.3202 677.7723168585472422 14058.091340706203 +3203 0.3203 676.3677320700045357 14033.604430148298 +3204 0.3204 674.9655940227180508 14009.156515581803 +3205 0.3205 673.5658988202457067 13984.747533865600 +3206 0.3206 672.1686425724539049 13960.377421970399 +3207 0.3207 670.7738213955065021 13936.046116978599 +3208 0.3208 669.3814314118534412 13911.753556083298 +3209 0.3209 667.9914687502198376 13887.499676589097 +3210 0.3210 666.6039295455948377 13863.284415911097 +3211 0.3211 665.2188099392205913 13839.107711574798 +3212 0.3212 663.8361060785809968 13814.969501216401 +3213 0.3213 662.4558141173911281 13790.869722581694 +3214 0.3214 661.0779302155856385 13766.808313527101 +3215 0.3215 659.7024505393084155 13742.785212017996 +3216 0.3216 658.3293712609009845 13718.800356129505 +3217 0.3217 656.9586885588921632 13694.853684046000 +3218 0.3218 655.5903986179868070 13670.945134060799 +3219 0.3219 654.2244976290550085 13647.074644575900 +3220 0.3220 652.8609817891210696 13623.242154102300 +3221 0.3221 651.4998473013530429 13599.447601258602 +3222 0.3222 650.1410903750514763 13575.690924772600 +3223 0.3223 648.7847072256389538 13551.972063478905 +3224 0.3224 647.4306940746489545 13528.290956320794 +3225 0.3225 646.0790471497155067 13504.647542348401 +3226 0.3226 644.7297626845621608 13481.041760719396 +3227 0.3227 643.3828369189913019 13457.473550698604 +3228 0.3228 642.0382660988734642 13433.942851657601 +3229 0.3229 640.6960464761368712 13410.449603074303 +3230 0.3230 639.3561743087564082 13386.993744533902 +3231 0.3231 638.0186458607433906 13363.575215727004 +3232 0.3232 636.6834574021345361 13340.193956450799 +3233 0.3233 635.3506052089816194 13316.849906607604 +3234 0.3234 634.0200855633408992 13293.543006206099 +3235 0.3235 632.6918947532625452 13270.273195359900 +3236 0.3236 631.3660290727801794 13247.040414288000 +3237 0.3237 630.0424848219000751 13223.844603314101 +3238 0.3238 628.7212583065910394 13200.685702866998 +3239 0.3239 627.4023458387737264 13177.563653479701 +3240 0.3240 626.0857437363102918 13154.478395790000 +3241 0.3241 624.7714483229938196 13131.429870539403 +3242 0.3242 623.4594559285382047 13108.418018573699 +3243 0.3243 622.1497628885674658 13085.442780842102 +3244 0.3244 620.8423655446055136 13062.504098397498 +3245 0.3245 619.5372602440658056 13039.601912396203 +3246 0.3246 618.2344433402411141 13016.736164097601 +3247 0.3247 616.9339111922930670 12993.906794863600 +3248 0.3248 615.6356601652419158 12971.113746159703 +3249 0.3249 614.3396866299563044 12948.356959552701 +3250 0.3250 613.0459869631430365 12925.636376713002 +3251 0.3251 611.7545575473368444 12902.951939411898 +3252 0.3252 610.4653947708900432 12880.303589523704 +3253 0.3253 609.1784950279626401 12857.691269023300 +3254 0.3254 607.8938547185121024 12835.114919988300 +3255 0.3255 606.6114702482828989 12812.574484596604 +3256 0.3256 605.3313380287967220 12790.069905127704 +3257 0.3257 604.0534544773422567 12767.601123961904 +3258 0.3258 602.7778160169651755 12745.168083580102 +3259 0.3259 601.5044190764580208 12722.770726563700 +3260 0.3260 600.2332600903500861 12700.408995594800 +3261 0.3261 598.9643354988976398 12678.082833455097 +3262 0.3262 597.6976417480735790 12655.792183026395 +3263 0.3263 596.4331752895577665 12633.536987290405 +3264 0.3264 595.1709325807267987 12611.317189328001 +3265 0.3265 593.9109100846444562 12589.132732319595 +3266 0.3266 592.6531042700512444 12566.983559544999 +3267 0.3267 591.3975116113548438 12544.869614382304 +3268 0.3268 590.1441285886203332 12522.790840308997 +3269 0.3269 588.8929516875598438 12500.747180900500 +3270 0.3270 587.6439773995232372 12478.738579831101 +3271 0.3271 586.3972022214879871 12456.764980873100 +3272 0.3272 585.1526226560495161 12434.826327896597 +3273 0.3273 583.9102352114111909 12412.922564869703 +3274 0.3274 582.6700364013747730 12391.053635857905 +3275 0.3275 581.4320227453306416 12369.219485024303 +3276 0.3276 580.1961907682480160 12347.420056629002 +3277 0.3277 578.9625370006650655 12325.655295029101 +3278 0.3278 577.7310579786797007 12303.925144678702 +3279 0.3279 576.5017502439393411 12282.229550128599 +3280 0.3280 575.2746103436315934 12260.568456025598 +3281 0.3281 574.0496348304747016 12238.941807113297 +3282 0.3282 572.8268202627075425 12217.349548231003 +3283 0.3283 571.6061632040803033 12195.791624313999 +3284 0.3284 570.3876602238449323 12174.267980393197 +3285 0.3285 569.1713078967454749 12152.778561595194 +3286 0.3286 567.9571028030086381 12131.323313141598 +3287 0.3287 566.7450415283341272 12109.902180349600 +3288 0.3288 565.5351206638850954 12088.515108631000 +3289 0.3289 564.3273368062789359 12067.162043492201 +3290 0.3290 563.1216865575776183 12045.842930534702 +3291 0.3291 561.9181665252781386 12024.557715453899 +3292 0.3292 560.7167733223034247 12003.306344039600 +3293 0.3293 559.5175035669926729 11982.088762175801 +3294 0.3294 558.3203538830919115 11960.904915840001 +3295 0.3295 557.1253208997446791 11939.754751103697 +3296 0.3296 555.9324012514829292 11918.638214131199 +3297 0.3297 554.7415915782172533 11897.555251181198 +3298 0.3298 553.5528885252280133 11876.505808604503 +3299 0.3299 552.3662887431555646 11855.489832845298 +3300 0.3300 551.1817888879912744 11834.507270440401 +3301 0.3301 549.9993856210683134 11813.558068019294 +3302 0.3302 548.8190756090521063 11792.642172303902 +3303 0.3303 547.6408555239314637 11771.759530108000 +3304 0.3304 546.4647220430091465 11750.910088337798 +3305 0.3305 545.2906718488926572 11730.093793991102 +3306 0.3306 544.1187016294852583 11709.310594157199 +3307 0.3307 542.9488080779765369 11688.560436017804 +3308 0.3308 541.7809878928334228 11667.843266844604 +3309 0.3309 540.6152377777910942 11647.159034001597 +3310 0.3310 539.4515544418438822 11626.507684942801 +3311 0.3311 538.2899345992360622 11605.889167213696 +3312 0.3312 537.1303749694528733 11585.303428450199 +3313 0.3313 535.9728722772114224 11564.750416378301 +3314 0.3314 534.8174232524518175 11544.230078814697 +3315 0.3315 533.6640246303278445 11523.742363665900 +3316 0.3316 532.5126731511981006 11503.287218928403 +3317 0.3317 531.3633655606172397 11482.864592688602 +3318 0.3318 530.2160986093266501 11462.474433122195 +3319 0.3319 529.0708690532458149 11442.116688494199 +3320 0.3320 527.9276736534631027 11421.791307159096 +3321 0.3321 526.7865091762271277 11401.498237560496 +3322 0.3322 525.6473723929375410 11381.237428230299 +3323 0.3323 524.5102600801365043 11361.008827789694 +3324 0.3324 523.3751690194995945 11340.812384948200 +3325 0.3325 522.2420959978270503 11320.648048503506 +3326 0.3326 521.1110378070347906 11300.515767341800 +3327 0.3327 519.9819912441458882 11280.415490437001 +3328 0.3328 518.8549531112814748 11260.347166851097 +3329 0.3329 517.7299202156522142 11240.310745733295 +3330 0.3330 516.6068893695495490 11220.306176320897 +3331 0.3331 515.4858573903366050 11200.333407938298 +3332 0.3332 514.3668211004398927 11180.392389996799 +3333 0.3333 513.2497773273403254 11160.483071995106 +3334 0.3334 512.1347229035646933 11140.605403518399 +3335 0.3335 511.0216546666768522 11120.759334238704 +3336 0.3336 509.9105694592691975 11100.944813914597 +3337 0.3337 508.8014641289539099 11081.161792390703 +3338 0.3338 507.6943355283544861 11061.410219598103 +3339 0.3339 506.5891805150969276 11041.690045553602 +3340 0.3340 505.4859959518012147 11022.001220360195 +3341 0.3341 504.3847787060728933 11002.343694206196 +3342 0.3342 503.2855256504943213 10982.717417365500 +3343 0.3343 502.1882336626161987 10963.122340197406 +3344 0.3344 501.0928996249490410 10943.558413146195 +3345 0.3345 499.9995204249546532 10924.025586741504 +3346 0.3346 498.9080929550377164 10904.523811597399 +3347 0.3347 497.8186141125372046 10885.053038412800 +3348 0.3348 496.7310807997179722 10865.613217971397 +3349 0.3349 495.6454899237623408 10846.204301140802 +3350 0.3350 494.5618383967616865 10826.826238872804 +3351 0.3351 493.4801231357078564 10807.478982203698 +3352 0.3352 492.4003410624849835 10788.162482253298 +3353 0.3353 491.3224891038610735 10768.876690225094 +3354 0.3354 490.2465641914795356 10749.621557406201 +3355 0.3355 489.1725632618508826 10730.397035167094 +3356 0.3356 488.1004832563444324 10711.203074961493 +3357 0.3357 487.0303211211800658 10692.039628326202 +3358 0.3358 485.9620738074196993 10672.906646880903 +3359 0.3359 484.8957382709592707 10653.804082327901 +3360 0.3360 483.8313114725202695 10634.731886452304 +3361 0.3361 482.7687903776416078 10615.690011121405 +3362 0.3362 481.7081719566712650 10596.678408285203 +3363 0.3363 480.6494531847582721 10577.697029975199 +3364 0.3364 479.5926310418442426 10558.745828305095 +3365 0.3365 478.5377025126554713 10539.824755470698 +3366 0.3366 477.4846645866944641 10520.933763749199 +3367 0.3367 476.4335142582320373 10502.072805498996 +3368 0.3368 475.3842485262990749 10483.241833160399 +3369 0.3369 474.3368643946783436 10464.440799254298 +3370 0.3370 473.2913588718964775 10445.669656383099 +3371 0.3371 472.2477289712158495 10426.928357229801 +3372 0.3372 471.2059717106264429 10408.216854558195 +3373 0.3373 470.1660841128378934 10389.535101212299 +3374 0.3374 469.1280632052714168 10370.883050117402 +3375 0.3375 468.0919060200516810 10352.260654277794 +3376 0.3376 467.0576095939988477 10333.667866779200 +3377 0.3377 466.0251709686206141 10315.104640785903 +3378 0.3378 464.9945871901041414 10296.570929543304 +3379 0.3379 463.9658553093082105 10278.066686375401 +3380 0.3380 462.9389723817550930 10259.591864686394 +3381 0.3381 461.9139354676228209 10241.146417959098 +3382 0.3382 460.8907416317370576 10222.730299756200 +3383 0.3383 459.8693879435633107 10204.343463719102 +3384 0.3384 458.8498714771989171 10185.985863568203 +3385 0.3385 457.8321893113654255 10167.657453102198 +3386 0.3386 456.8163385294003547 10149.358186198995 +3387 0.3387 455.8023162192496898 10131.088016814596 +3388 0.3388 454.7901194734598107 10112.846898983196 +3389 0.3389 453.7797453891697614 10094.634786817303 +3390 0.3390 452.7711910681035192 10076.451634507401 +3391 0.3391 451.7644536165620366 10058.297396321701 +3392 0.3392 450.7595301454156242 10040.172026606197 +3393 0.3393 449.7564177700961068 10022.075479784304 +3394 0.3394 448.7551136105890350 10004.007710357000 +3395 0.3395 447.7556147914260691 9985.968672902105 +3396 0.3396 446.7579184416771909 9967.958322075101 +3397 0.3397 445.7620216949430301 9949.976612608305 +3398 0.3398 444.7679216893470766 9932.023499310199 +3399 0.3399 443.7756155675282344 9914.098937066599 +3400 0.3400 442.7851004766329197 9896.202880839905 +3401 0.3401 441.7963735683075015 9878.335285668196 +3402 0.3402 440.8094319986907408 9860.496106666702 +3403 0.3403 439.8242729284061170 9842.685299025499 +3404 0.3404 438.8408935225542677 9824.902818012000 +3405 0.3405 437.8592909507052582 9807.148618968400 +3406 0.3406 436.8794623868911913 9789.422657312803 +3407 0.3407 435.9014050095985908 9771.724888539000 +3408 0.3408 434.9251160017608413 9754.055268216005 +3409 0.3409 433.9505925507506277 9736.413751988097 +3410 0.3410 432.9778318483724888 9718.800295574394 +3411 0.3411 432.0068310908553144 9701.214854769300 +3412 0.3412 431.0375874788447845 9683.657385441802 +3413 0.3413 430.0700982173959233 9666.127843535600 +3414 0.3414 429.1043605159657091 9648.626185068795 +3415 0.3415 428.1403715884055714 9631.152366133902 +3416 0.3416 427.1781286529540012 9613.706342898004 +3417 0.3417 426.2176289322290472 9596.288071601601 +3418 0.3418 425.2588696532209838 9578.897508559807 +3419 0.3419 424.3018480472849205 9561.534610160903 +3420 0.3420 423.3465613501335270 9544.199332867502 +3421 0.3421 422.3930068018294151 9526.891633215200 +3422 0.3422 421.4411816467779772 9509.611467813200 +3423 0.3423 420.4910831337201103 9492.358793344101 +3424 0.3424 419.5427085157247689 9475.133566563200 +3425 0.3425 418.5960550501816329 9457.935744299204 +3426 0.3426 417.6511199987940017 9440.765283453402 +3427 0.3427 416.7079006275713482 9423.622141000000 +3428 0.3428 415.7663942068220990 9406.506273985404 +3429 0.3429 414.8265980111463591 9389.417639528896 +3430 0.3430 413.8885093194288061 9372.356194821601 +3431 0.3431 412.9521254148313574 9355.321897127105 +3432 0.3432 412.0174435847859513 9338.314703780903 +3433 0.3433 411.0844611209873847 9321.334572190397 +3434 0.3434 410.1531753193861505 9304.381459834600 +3435 0.3435 409.2235834801812189 9287.455324264294 +3436 0.3436 408.2956829078129317 9270.556123101902 +3437 0.3437 407.3694709109557834 9253.683814040705 +3438 0.3438 406.4449448025114862 9236.838354845706 +3439 0.3439 405.5221018996015800 9220.019703352504 +3440 0.3440 404.6009395235605552 9203.227817468098 +3441 0.3441 403.6814549999286328 9186.462655169897 +3442 0.3442 402.7636456584448297 9169.724174506198 +3443 0.3443 401.8475088330397398 9153.012333595900 +3444 0.3444 400.9330418618285421 9136.327090627994 +3445 0.3445 400.0202420871040090 9119.668403862102 +3446 0.3446 399.1091068553295145 9103.036231628001 +3447 0.3447 398.1996335171318719 9086.430532325001 +3448 0.3448 397.2918194272944561 9069.851264422905 +3449 0.3449 396.3856619447502680 9053.298386460599 +3450 0.3450 395.4811584325748868 9036.771857047504 +3451 0.3451 394.5783062579794205 9020.271634861601 +3452 0.3452 393.6771027923037991 9003.797678650895 +3453 0.3453 392.7775454110096689 8987.349947231902 +3454 0.3454 391.8796314936735143 8970.928399491204 +3455 0.3455 390.9833584239797801 8954.532994383502 +3456 0.3456 390.0887235897139931 8938.163690932794 +3457 0.3457 389.1957243827557704 8921.820448231701 +3458 0.3458 388.3043581990721123 8905.503225441098 +3459 0.3459 387.4146224387105235 8889.211981791101 +3460 0.3460 386.5265145057920222 8872.946676579202 +3461 0.3461 385.6400318085044887 8856.707269171799 +3462 0.3462 384.7551717590957310 8840.493719002996 +3463 0.3463 383.8719317738668337 8824.305985574996 +3464 0.3464 382.9903092731651668 8808.144028457806 +3465 0.3465 382.1103016813778481 8792.007807289097 +3466 0.3466 381.2319064269246951 8775.897281774000 +3467 0.3467 380.3551209422517445 8759.812411685394 +3468 0.3468 379.4799426638243176 8743.753156862898 +3469 0.3469 378.6063690321204831 8727.719477214196 +3470 0.3470 377.7343974916241223 8711.711332713101 +3471 0.3471 376.8640254908184488 8695.728683400797 +3472 0.3472 375.9952504821791308 8679.771489385399 +3473 0.3473 375.1280699221677537 8663.839710841698 +3474 0.3474 374.2624812712251128 8647.933308010797 +3475 0.3475 373.3984819937645625 8632.052241200305 +3476 0.3476 372.5360695581653658 8616.196470784002 +3477 0.3477 371.6752414367660435 8600.365957202703 +3478 0.3478 370.8159951058578372 8584.560660961899 +3479 0.3479 369.9583280456780017 8568.780542634304 +3480 0.3480 369.1022377404033818 8553.025562857605 +3481 0.3481 368.2477216781437050 8537.295682335702 +3482 0.3482 367.3947773509350441 8521.590861837802 +3483 0.3483 366.5434022547332233 8505.911062198800 +3484 0.3484 365.6935938894073388 8490.256244318400 +3485 0.3485 364.8453497587333345 8474.626369162201 +3486 0.3486 363.9986673703871816 8459.021397760502 +3487 0.3487 363.1535442359387389 8443.441291208699 +3488 0.3488 362.3099778708449321 8427.886010666902 +3489 0.3489 361.4679657944435576 8412.355517360105 +3490 0.3490 360.6275055299466885 8396.849772577705 +3491 0.3491 359.7885946044340812 8381.368737673896 +3492 0.3492 358.9512305488470361 8365.912374066902 +3493 0.3493 358.1154108979816897 8350.480643239498 +3494 0.3494 357.2811331904827625 8335.073506738503 +3495 0.3495 356.4483949688371354 8319.690926174597 +3496 0.3496 355.6171937793673123 8304.332863222400 +3497 0.3497 354.7875271722251682 8288.999279620402 +3498 0.3498 353.9593927013855819 8273.690137170801 +3499 0.3499 353.1327879246400698 8258.405397739203 +3500 0.3500 352.3077104035903631 8243.145023254605 +3501 0.3501 351.4841577036421540 8227.908975709601 +3502 0.3502 350.6621273939987304 8212.697217159402 +3503 0.3503 349.8416170476546085 8197.509709722894 +3504 0.3504 349.0226242413893942 8182.346415581604 +3505 0.3505 348.2051465557613028 8167.207296979897 +3506 0.3506 347.3891815751010768 8152.092316224996 +3507 0.3507 346.5747268875055056 8137.001435686499 +3508 0.3508 345.7617800848313436 8121.934617796702 +3509 0.3509 344.9503387626890003 8106.891825050196 +3510 0.3510 344.1404005204362875 8091.873020004001 +3511 0.3511 343.3319629611722235 8076.878165276794 +3512 0.3512 342.5250236917308939 8061.907223549897 +3513 0.3513 341.7195803226750854 8046.960157566100 +3514 0.3514 340.9156304682902601 8032.036930130300 +3515 0.3515 340.1131717465783026 8017.137504108599 +3516 0.3516 339.3122017792514384 8002.261842429194 +3517 0.3517 338.5127181917258667 7987.409908081696 +3518 0.3518 337.7147186131159629 7972.581664116595 +3519 0.3519 336.9182006762277979 7957.777073646197 +3520 0.3520 336.1231620175533408 7942.996099843396 +3521 0.3521 335.3296002772640350 7928.238705942502 +3522 0.3522 334.5375130992050003 7913.504855238498 +3523 0.3523 333.7468981308887237 7898.794511087304 +3524 0.3524 332.9577530234890901 7884.107636905195 +3525 0.3525 332.1700754318353574 7869.444196169396 +3526 0.3526 331.3838630144060176 7854.804152417499 +3527 0.3527 330.5991134333227706 7840.187469247103 +3528 0.3528 329.8158243543446133 7825.594110316400 +3529 0.3529 329.0339934468616434 7811.024039343400 +3530 0.3530 328.2536183838891475 7796.477220106601 +3531 0.3531 327.4746968420616327 7781.953616443701 +3532 0.3532 326.6972265016268011 7767.453192252797 +3533 0.3533 325.9212050464395816 7752.975911491201 +3534 0.3534 325.1466301639562175 7738.521738176096 +3535 0.3535 324.3734995452281851 7724.090636383997 +3536 0.3536 323.6018108848964516 7709.682570250894 +3537 0.3537 322.8315618811853369 7695.297503971800 +3538 0.3538 322.0627502358967149 7680.935401800802 +3539 0.3539 321.2953736544041021 7666.596228051400 +3540 0.3540 320.5294298456467459 7652.279947095602 +3541 0.3541 319.7649165221237695 7637.986523364300 +3542 0.3542 319.0018313998882036 7623.715921347495 +3543 0.3543 318.2401721985411882 7609.468105593005 +3544 0.3544 317.4799366412261747 7595.243040707697 +3545 0.3545 316.7211224546229573 7581.040691356902 +3546 0.3546 315.9637273689419317 7566.861022263605 +3547 0.3547 315.2077491179182971 7552.703998209501 +3548 0.3548 314.4531854388060879 7538.569584034201 +3549 0.3549 313.7000340723726026 7524.457744635198 +3550 0.3550 312.9482927628924358 7510.368444967600 +3551 0.3551 312.1979592581417933 7496.301650044894 +3552 0.3552 311.4490313093926943 7482.257324937404 +3553 0.3553 310.7015066714071168 7468.235434773604 +3554 0.3554 309.9553831024314832 7454.235944739004 +3555 0.3555 309.2106583641906923 7440.258820076699 +3556 0.3556 308.4673302218825484 7426.304026086698 +3557 0.3557 307.7253964441719063 7412.371528126307 +3558 0.3558 306.9848548031851010 7398.461291609798 +3559 0.3559 306.2457030745042061 7384.573282008503 +3560 0.3560 305.5079390371612931 7370.707464850202 +3561 0.3561 304.7715604736328032 7356.863805719404 +3562 0.3562 304.0365651698339775 7343.042270257502 +3563 0.3563 303.3029509151130014 7329.242824162196 +3564 0.3564 302.5707155022454913 7315.465433187499 +3565 0.3565 301.8398567274289235 7301.710063143804 +3566 0.3566 301.1103723902768365 7287.976679897598 +3567 0.3567 300.3822602938133741 7274.265249371401 +3568 0.3568 299.6555182444676007 7260.575737543903 +3569 0.3569 298.9301440520679307 7246.908110449502 +3570 0.3570 298.2061355298365584 7233.262334178398 +3571 0.3571 297.4834904943838296 7219.638374876198 +3572 0.3572 296.7622067657027856 7206.036198744401 +3573 0.3573 296.0422821671635347 7192.455772040201 +3574 0.3574 295.3237145255077394 7178.897061075397 +3575 0.3575 294.6065016708431017 7165.360032217697 +3576 0.3576 293.8906414366377362 7151.844651889598 +3577 0.3577 293.1761316597148266 7138.350886569002 +3578 0.3578 292.4629701802469413 7124.878702788297 +3579 0.3579 291.7511548417507470 7111.428067135097 +3580 0.3580 291.0406834910813814 7097.998946251701 +3581 0.3581 290.3315539784270527 7084.591306834998 +3582 0.3582 289.6237641573034693 7071.205115636396 +3583 0.3583 288.9173118845485533 7057.840339461698 +3584 0.3584 288.2121950203168694 7044.496945171602 +3585 0.3585 287.5084114280742824 7031.174899680398 +3586 0.3586 286.8059589745924427 7017.874169956700 +3587 0.3587 286.1048355299434434 7004.594723023602 +3588 0.3588 285.4050389674943631 6991.336525957497 +3589 0.3589 284.7065671639020366 6978.099545889199 +3590 0.3590 284.0094179991074270 6964.883750003097 +3591 0.3591 283.3135893563303966 6951.689105537196 +3592 0.3592 282.6190791220643632 6938.515579783001 +3593 0.3593 281.9258851860709001 6925.363140085999 +3594 0.3594 281.2340054413743928 6912.231753844204 +3595 0.3595 280.5434377842566960 6899.121388509800 +3596 0.3596 279.8541801142518466 6886.032011587402 +3597 0.3597 279.1662303341407210 6872.963590635401 +3598 0.3598 278.4795863499456914 6859.916093264699 +3599 0.3599 277.7942460709255101 6846.889487139098 +3600 0.3600 277.1102074095697958 6833.883739975699 +3601 0.3601 276.4274682815938036 6820.898819543603 +3602 0.3602 275.7460266059333662 6807.934693665298 +3603 0.3603 275.0658803047393235 6794.991330214998 +3604 0.3604 274.3870273033725766 6782.068697119899 +3605 0.3605 273.7094655303986315 6769.166762359400 +3606 0.3606 273.0331929175824257 6756.285493965002 +3607 0.3607 272.3582073998831561 6743.424860020499 +3608 0.3608 271.6845069154490488 6730.584828661598 +3609 0.3609 271.0120894056121870 6717.765368076096 +3610 0.3610 270.3409528148832237 6704.966446503502 +3611 0.3611 269.6710950909462667 6692.188032235197 +3612 0.3612 269.0025141846538190 6679.430093614297 +3613 0.3613 268.3352080500213219 6666.692599035297 +3614 0.3614 267.6691746442223234 6653.975516944196 +3615 0.3615 267.0044119275831918 6641.278815838701 +3616 0.3616 266.3409178635778858 6628.602464267402 +3617 0.3617 265.6786904188230096 6615.946430830401 +3618 0.3618 265.0177275630725262 6603.310684178701 +3619 0.3619 264.3580272692128688 6590.695193014501 +3620 0.3620 263.6995875132575975 6578.099926090697 +3621 0.3621 263.0424062743425111 6565.524852211398 +3622 0.3622 262.3864815347203603 6552.969940231098 +3623 0.3623 261.7318112797560730 6540.435159055098 +3624 0.3624 261.0783934979213541 6527.920477639400 +3625 0.3625 260.4262261807898540 6515.425864990098 +3626 0.3626 259.7753073230321661 6502.951290164099 +3627 0.3627 259.1256349224105406 6490.496722268399 +3628 0.3628 258.4772069797741096 6478.062130460003 +3629 0.3629 257.8300214990537711 6465.647483946701 +3630 0.3630 257.1840764872571867 6453.252751985201 +3631 0.3631 256.5393699544637798 6440.877903883302 +3632 0.3632 255.8958999138197328 6428.522908997900 +3633 0.3633 255.2536643815330422 6416.187736735901 +3634 0.3634 254.6126613768685445 6403.872356553802 +3635 0.3635 253.9728889221429711 6391.576737957897 +3636 0.3636 253.3343450427198889 6379.300850503500 +3637 0.3637 252.6970277670049256 6367.044663795899 +3638 0.3638 252.0609351264406826 6354.808147489097 +3639 0.3639 251.4260651555018740 6342.591271286903 +3640 0.3640 250.7924158916904389 6330.394004941703 +3641 0.3641 250.1599853755305674 6318.216318255498 +3642 0.3642 249.5287716505638400 6306.058181078803 +3643 0.3643 248.8987727633443399 6293.919563310999 +3644 0.3644 248.2699867634337636 6281.800434900604 +3645 0.3645 247.6424117033965047 6269.700765844398 +3646 0.3646 247.0160456387948784 6257.620526188199 +3647 0.3647 246.3908866281841767 6245.559686025998 +3648 0.3648 245.7669327331078648 6233.518215500397 +3649 0.3649 245.1441820180927209 6221.496084802300 +3650 0.3650 244.5226325506440617 6209.493264170804 +3651 0.3651 243.9022824012408535 6197.509723893305 +3652 0.3652 243.2831296433309376 6185.545434305099 +3653 0.3653 242.6651723533261986 6173.600365789902 +3654 0.3654 242.0484086105977610 6161.674488778601 +3655 0.3655 241.4328364974712997 6149.767773750802 +3656 0.3656 240.8184540992221230 6137.880191232998 +3657 0.3657 240.2052595040704546 6126.011711800198 +3658 0.3658 239.5932508031767441 6114.162306074002 +3659 0.3659 238.9824260906368067 6102.331944724501 +3660 0.3660 238.3727834634771625 6090.520598468600 +3661 0.3661 237.7643210216502041 6078.728238070598 +3662 0.3662 237.1570368680295644 6066.954834341996 +3663 0.3663 236.5509291084053984 6055.200358141501 +3664 0.3664 235.9459958514795801 6043.464780375100 +3665 0.3665 235.3422352088610410 6031.748071995604 +3666 0.3666 234.7396452950611376 6020.050204002400 +3667 0.3667 234.1382242274889052 6008.371147442198 +3668 0.3668 233.5379701264463961 5996.710873408199 +3669 0.3669 232.9388811151239622 5985.069353040199 +3670 0.3670 232.3409553195957074 5973.446557524701 +3671 0.3671 231.7441908688147407 5961.842458094703 +3672 0.3672 231.1485858946085443 5950.257026029401 +3673 0.3673 230.5541385316743401 5938.690232654499 +3674 0.3674 229.9608469175745142 5927.142049341797 +3675 0.3675 229.3687091927319557 5915.612447509404 +3676 0.3676 228.7777235004254237 5904.101398621300 +3677 0.3677 228.1878879867849719 5892.608874187797 +3678 0.3678 227.5992008007873437 5881.134845764696 +3679 0.3679 227.0116600942514253 5869.679284953800 +3680 0.3680 226.4252640218336126 5858.242163402698 +3681 0.3681 225.8400107410232351 5846.823452804696 +3682 0.3682 225.2558984121380661 5835.423124898596 +3683 0.3683 224.6729251983197173 5824.041151468504 +3684 0.3684 224.0910892655290638 5812.677504344403 +3685 0.3685 223.5103887825417814 5801.332155401302 +3686 0.3686 222.9308219209437425 5790.005076559297 +3687 0.3687 222.3523868551265537 5778.696239784200 +3688 0.3688 221.7750817622830368 5767.405617086399 +3689 0.3689 221.1989048224026249 5756.133180521600 +3690 0.3690 220.6238542182670415 5744.878902190303 +3691 0.3691 220.0499281354456400 5733.642754237804 +3692 0.3692 219.4771247622910266 5722.424708854698 +3693 0.3693 218.9054422899345127 5711.224738275403 +3694 0.3694 218.3348789122817664 5700.042814779699 +3695 0.3695 217.7654328260082082 5688.878910691496 +3696 0.3696 217.1971022305546626 5677.732998379499 +3697 0.3697 216.6298853281228673 5666.605050256603 +3698 0.3698 216.0637803236710397 5655.495038779802 +3699 0.3699 215.4987854249095278 5644.402936450602 +3700 0.3700 214.9348988422962634 5633.328715814598 +3701 0.3701 214.3721187890324416 5622.272349461597 +3702 0.3702 213.8104434810581154 5611.233810025198 +3703 0.3703 213.2498711370477338 5600.213070182705 +3704 0.3704 212.6903999784058215 5589.210102655696 +3705 0.3705 212.1320282292625734 5578.224880209298 +3706 0.3706 211.5747541164694780 5567.257375652498 +3707 0.3707 211.0185758695949687 5556.307561837501 +3708 0.3708 210.4634917209200751 5545.375411660498 +3709 0.3709 209.9094999054340178 5534.460898060803 +3710 0.3710 209.3565986608299170 5523.563994021202 +3711 0.3711 208.8047862275004718 5512.684672567899 +3712 0.3712 208.2540608485335838 5501.822906770001 +3713 0.3713 207.7044207697080651 5490.978669740205 +3714 0.3714 207.1558642394893468 5480.151934633901 +3715 0.3715 206.6083895090251588 5469.342674649699 +3716 0.3716 206.0619948321412096 5458.550863029097 +3717 0.3717 205.5166784653369518 5447.776473056198 +3718 0.3718 204.9724386677812333 5437.019478058301 +3719 0.3719 204.4292737013080625 5426.279851404903 +3720 0.3720 203.8871818304124020 5415.557566508502 +3721 0.3721 203.3461613222457629 5404.852596823999 +3722 0.3722 202.8062104466121127 5394.164915848804 +3723 0.3723 202.2673274759635547 5383.494497122498 +3724 0.3724 201.7295106853960647 5372.841314227502 +3725 0.3725 201.1927583526453134 5362.205340787805 +3726 0.3726 200.6570687580824313 5351.586550470100 +3727 0.3727 200.1224401847097738 5340.984916982798 +3728 0.3728 199.5888709181568004 5330.400414076699 +3729 0.3729 199.0563592466757541 5319.833015544198 +3730 0.3730 198.5249034611375407 5309.282695219801 +3731 0.3731 197.9945018550275506 5298.749426979801 +3732 0.3732 197.4651527244414524 5288.233184741897 +3733 0.3733 196.9368543680810433 5277.733942466002 +3734 0.3734 196.4096050872500996 5267.251674153002 +3735 0.3735 195.8834031858501703 5256.786353845699 +3736 0.3736 195.3582469703764559 5246.337955628303 +3737 0.3737 194.8341347499137441 5235.906453626198 +3738 0.3738 194.3110648361321182 5225.491822006101 +3739 0.3739 193.7890355432830063 5215.094034976202 +3740 0.3740 193.2680451881949182 5204.713066785396 +3741 0.3741 192.7480920902694379 5194.348891724003 +3742 0.3742 192.2291745714770741 5184.001484123200 +3743 0.3743 191.7112909563531673 5173.670818355000 +3744 0.3744 191.1944395719937972 5163.356868832496 +3745 0.3745 190.6786187480516901 5153.059610009397 +3746 0.3746 190.1638268167322110 5142.779016380202 +3747 0.3747 189.6500621127891861 5132.515062480103 +3748 0.3748 189.1373229735209520 5122.267722884601 +3749 0.3749 188.6256077387662344 5112.036972209997 +3750 0.3750 188.1149147509000841 5101.822785112901 +3751 0.3751 187.6052423548299259 5091.625136290302 +3752 0.3752 187.0965888979914382 5081.444000479300 +3753 0.3753 186.5889527303446016 5071.279352457499 +3754 0.3754 186.0823322043696066 5061.131167042597 +3755 0.3755 185.5767256750628746 5050.999419092102 +3756 0.3756 185.0721314999330787 5040.884083503795 +3757 0.3757 184.5685480389971360 5030.785135215196 +3758 0.3758 184.0659736547761725 5020.702549204103 +3759 0.3759 183.5644067122915999 5010.636300487604 +3760 0.3760 183.0638455790610806 5000.586364122602 +3761 0.3761 182.5642886250946617 4990.552715206002 +3762 0.3762 182.0657342228906543 4980.535328874103 +3763 0.3763 181.5681807474318248 4970.534180302300 +3764 0.3764 181.0716265761813872 4960.549244706297 +3765 0.3765 180.5760700890790531 4950.580497340496 +3766 0.3766 180.0815096685370804 4940.627913498800 +3767 0.3767 179.5879436994364085 4930.691468514498 +3768 0.3768 179.0953705691227071 4920.771137759799 +3769 0.3769 178.6037886674023980 4910.866896646297 +3770 0.3770 178.1131963865388457 4900.978720624502 +3771 0.3771 177.6235921212484357 4891.106585183799 +3772 0.3772 177.1349742686966238 4881.250465852598 +3773 0.3773 176.6473412284940991 4871.410338198104 +3774 0.3774 176.1606914026928905 4861.586177826197 +3775 0.3775 175.6750231957825008 4851.777960381802 +3776 0.3776 175.1903350146860134 4841.985661547798 +3777 0.3777 174.7066252687562837 4832.209257046703 +3778 0.3778 174.2238923697720452 4822.448722638303 +3779 0.3779 173.7421347319340441 4812.704034121703 +3780 0.3780 173.2613507718612595 4802.975167333901 +3781 0.3781 172.7815389085870379 4793.262098150601 +3782 0.3782 172.3026975635552560 4783.564802485198 +3783 0.3783 171.8248251606164843 4773.883256290002 +3784 0.3784 171.3479201260242633 4764.217435554496 +3785 0.3785 170.8719808884311817 4754.567316306897 +3786 0.3786 170.3970058788851532 4744.932874613398 +3787 0.3787 169.9229935308256074 4735.314086577502 +3788 0.3788 169.4499422800796822 4725.710928341097 +3789 0.3789 168.9778505648584428 4716.123376083600 +3790 0.3790 168.5067168257531591 4706.551406022201 +3791 0.3791 168.0365395057314686 4696.994994411798 +3792 0.3792 167.5673170501336529 4687.454117544599 +3793 0.3793 167.0990479066688863 4677.928751750696 +3794 0.3794 166.6317305254114842 4668.418873397302 +3795 0.3795 166.1653633587971512 4658.924458889298 +3796 0.3796 165.6999448616192581 4649.445484668398 +3797 0.3797 165.2354734910251466 4639.981927214099 +3798 0.3798 164.7719477065122931 4630.533763042898 +3799 0.3799 164.3093659699247269 4621.100968708397 +3800 0.3800 163.8477267454492505 4611.683520801100 +3801 0.3801 163.3870284996117732 4602.281395948699 +3802 0.3802 162.9272697012735591 4592.894570815803 +3803 0.3803 162.4684488216275895 4583.523022103702 +3804 0.3804 162.0105643341948678 4574.166726550797 +3805 0.3805 161.5536147148207249 4564.825660932001 +3806 0.3806 161.0975984416711810 4555.499802058697 +3807 0.3807 160.6425139952292795 4546.189126779598 +3808 0.3808 160.1883598582913635 4536.893611978998 +3809 0.3809 159.7351345159634946 4527.613234578497 +3810 0.3810 159.2828364556577867 4518.347971535601 +3811 0.3811 158.8314641670887966 4509.097799844400 +3812 0.3812 158.3810161422698002 4499.862696535303 +3813 0.3813 157.9314908755092972 4490.642638674799 +3814 0.3814 157.4828868634072592 4481.437603365703 +3815 0.3815 157.0352026048516336 4472.247567746799 +3816 0.3816 156.5884366010146493 4463.072508992998 +3817 0.3817 156.1425873553492352 4453.912404315102 +3818 0.3818 155.6976533735854673 4444.767230960097 +3819 0.3819 155.2536331637269313 4435.636966210401 +3820 0.3820 154.8105252360471980 4426.521587384399 +3821 0.3821 154.3683281030861565 4417.421071836598 +3822 0.3822 153.9270402796464907 4408.335396956598 +3823 0.3823 153.4866602827901545 4399.264540169999 +3824 0.3824 153.0471866318347622 4390.208478937602 +3825 0.3825 152.6086178483500646 4381.167190756201 +3826 0.3826 152.1709524561543958 4372.140653157399 +3827 0.3827 151.7341889813110924 4363.128843708699 +3828 0.3828 151.2983259521250261 4354.131740012701 +3829 0.3829 150.8633618991390222 4345.149319707099 +3830 0.3830 150.4292953551304208 4336.181560465000 +3831 0.3831 149.9961248551074391 4327.228439994600 +3832 0.3832 149.5638489363057602 4318.289936039098 +3833 0.3833 149.1324661381849808 4309.366026376600 +3834 0.3834 148.7019750024251152 4300.456688820501 +3835 0.3835 148.2723740729231565 4291.561901218502 +3836 0.3836 147.8436618957895519 4282.681641453601 +3837 0.3837 147.4158370193446785 4273.815887443703 +3838 0.3838 146.9888979941154616 4264.964617140700 +3839 0.3839 146.5628433728318214 4256.127808531899 +3840 0.3840 146.1376717104232910 4247.305439638698 +3841 0.3841 145.7133815640154921 4238.497488517201 +3842 0.3842 145.2899714929267247 4229.703933257897 +3843 0.3843 144.8674400586645277 4220.924751985800 +3844 0.3844 144.4457858249222397 4212.159922860203 +3845 0.3845 144.0250073575755039 4203.409424074602 +3846 0.3846 143.6051032246789134 4194.673233857000 +3847 0.3847 143.1860719964626014 4185.951330469299 +3848 0.3848 142.7679122453287732 4177.243692207503 +3849 0.3849 142.3506225458482959 4168.550297401802 +3850 0.3850 141.9342014747573728 4159.871124416401 +3851 0.3851 141.5186476109540763 4151.206151649298 +3852 0.3852 141.1039595354949654 4142.555357532699 +3853 0.3853 140.6901358315917321 4133.918720531998 +3854 0.3854 140.2771750846077907 4125.296219147000 +3855 0.3855 139.8650758820548958 4116.687831910898 +3856 0.3856 139.4538368135898168 4108.093537390600 +3857 0.3857 139.0434564710109555 4099.513314186599 +3858 0.3858 138.6339334482549930 4090.947140932800 +3859 0.3859 138.2252663413935068 4082.394996296898 +3860 0.3860 137.8174537486296742 4073.856858979601 +3861 0.3861 137.4104942702949188 4065.332707715301 +3862 0.3862 137.0043865088455846 4056.822521271602 +3863 0.3863 136.5991290688595541 4048.326278449200 +3864 0.3864 136.1947205570329800 4039.843958082201 +3865 0.3865 135.7911595821769879 4031.375539037599 +3866 0.3866 135.3884447552143229 4022.921000215902 +3867 0.3867 134.9865746891760239 4014.480320550199 +3868 0.3868 134.5855479991981838 4006.053479006699 +3869 0.3869 134.1853633025186241 3997.640454584402 +3870 0.3870 133.7860192184736263 3989.241226315302 +3871 0.3871 133.3875143684946352 3980.855773264400 +3872 0.3872 132.9898473761049615 3972.484074528900 +3873 0.3873 132.5930168669165710 3964.126109239100 +3874 0.3874 132.1970214686267298 3955.781856558002 +3875 0.3875 131.8018598110147934 3947.451295680603 +3876 0.3876 131.4075305259390234 3939.134405834899 +3877 0.3877 131.0140322473332049 3930.831166281499 +3878 0.3878 130.6213636112034919 3922.541556312899 +3879 0.3879 130.2295232556251392 3914.265555254300 +3880 0.3880 129.8385098207392616 3906.003142463200 +3881 0.3881 129.4483219487496513 3897.754297329098 +3882 0.3882 129.0589582839195089 3889.518999273998 +3883 0.3883 128.6704174725682321 3881.297227751602 +3884 0.3884 128.2826981630682610 3873.088962248101 +3885 0.3885 127.8957990058417664 3864.894182281700 +3886 0.3886 127.5097186533575666 3856.712867402199 +3887 0.3887 127.1244557601278871 3848.544997191500 +3888 0.3888 126.7400089827051204 3840.390551263801 +3889 0.3889 126.3563769796787142 3832.249509264202 +3890 0.3890 125.9735584116719878 3824.121850870401 +3891 0.3891 125.5915519413389063 3816.007555791199 +3892 0.3892 125.2103562333609688 3807.906603767598 +3893 0.3893 124.8299699544440244 3799.818974571401 +3894 0.3894 124.4503917733151042 3791.744648006901 +3895 0.3895 124.0716203607193080 3783.683603909099 +3896 0.3896 123.6936543894166078 3775.635822144897 +3897 0.3897 123.3164925341787495 3767.601282612297 +3898 0.3898 122.9401334717860976 3759.579965240700 +3899 0.3899 122.5645758810245241 3751.571849990800 +3900 0.3900 122.1898184426822525 3743.576916854498 +3901 0.3901 121.8158598395467891 3735.595145854899 +3902 0.3902 121.4426987564017395 3727.626517045999 +3903 0.3903 121.0703338800237674 3719.671010513302 +3904 0.3904 120.6987638991794682 3711.728606372799 +3905 0.3905 120.3279875046222429 3703.799284771798 +3906 0.3906 119.9580033890892281 3695.883025888499 +3907 0.3907 119.5888102472982268 3687.979809931501 +3908 0.3908 119.2204067759446104 3680.089617140700 +3909 0.3909 118.8527916736982490 3672.212427786599 +3910 0.3910 118.4859636412003994 3664.348222170302 +3911 0.3911 118.1199213810607063 3656.496980623597 +3912 0.3912 117.7546635978540905 3648.658683508802 +3913 0.3913 117.3901889981177078 3640.833311218899 +3914 0.3914 117.0264962903478931 3633.020844177299 +3915 0.3915 116.6635841849971342 3625.221262837800 +3916 0.3916 116.3014513944710302 3617.434547684399 +3917 0.3917 115.9400966331252079 3609.660679232100 +3918 0.3918 115.5795186172623374 3601.899638025199 +3919 0.3919 115.2197160651291199 3594.151404639098 +3920 0.3920 114.8606876969132315 3586.415959678699 +3921 0.3921 114.5024322347403114 3578.693283779601 +3922 0.3922 114.1449484026709769 3570.983357607100 +3923 0.3923 113.7882349266977968 3563.286161856602 +3924 0.3924 113.4322905347422932 3555.601677253399 +3925 0.3925 113.0771139566519707 3547.929884553101 +3926 0.3926 112.7227039241972761 3540.270764540699 +3927 0.3927 112.3690591710686846 3532.624298031100 +3928 0.3928 112.0161784328736587 3524.990465869301 +3929 0.3929 111.6640604471337070 3517.369248929699 +3930 0.3930 111.3127039532813995 3509.760628116401 +3931 0.3931 110.9621076926574261 3502.164584363200 +3932 0.3932 110.6122704085075981 3494.581098633498 +3933 0.3933 110.2631908459799064 3487.010151920200 +3934 0.3934 109.9148677521216229 3479.451725245599 +3935 0.3935 109.5672998758762589 3471.905799661603 +3936 0.3936 109.2204859680807374 3464.372356248899 +3937 0.3937 108.8744247814623662 3456.851376118502 +3938 0.3938 108.5291150706359531 3449.342840409699 +3939 0.3939 108.1845555921008781 3441.846730291800 +3940 0.3940 107.8407451042381666 3434.363026962503 +3941 0.3941 107.4976823673075756 3426.891711649401 +3942 0.3942 107.1553661434446809 3419.432765608599 +3943 0.3943 106.8137951966579635 3411.986170125700 +3944 0.3944 106.4729682928259535 3404.551906514600 +3945 0.3945 106.1328841996942742 3397.129956118999 +3946 0.3946 105.7935416868727856 3389.720300310699 +3947 0.3947 105.4549395258327138 3382.322920490798 +3948 0.3948 105.1170764899037238 3374.937798089100 +3949 0.3949 104.7799513542710628 3367.564914564002 +3950 0.3950 104.4435628959727325 3360.204251402603 +3951 0.3951 104.1079098938965615 3352.855790120801 +3952 0.3952 103.7729911287773774 3345.519512262799 +3953 0.3953 103.4388053831941363 3338.195399401899 +3954 0.3954 103.1053514415670804 3330.883433139101 +3955 0.3955 102.7726280901548961 3323.583595104599 +3956 0.3956 102.4406341170518431 3316.295866956400 +3957 0.3957 102.1093683121849409 3309.020230381502 +3958 0.3958 101.7788294673111409 3301.756667094403 +3959 0.3959 101.4490163760144981 3294.505158838499 +3960 0.3960 101.1199278337033149 3287.265687385101 +3961 0.3961 100.7915626376073703 3280.038234533902 +3962 0.3962 100.4639195867750487 3272.822782112402 +3963 0.3963 100.1369974820706119 3265.619311976399 +3964 0.3964 99.8107951261713140 3258.427806009699 +3965 0.3965 99.4853113235646447 3251.248246123800 +3966 0.3966 99.1605448805455296 3244.080614258601 +3967 0.3967 98.8364946052135309 3236.924892381499 +3968 0.3968 98.5131593074700618 3229.781062487902 +3969 0.3969 98.1905377990156296 3222.649106600802 +3970 0.3970 97.8686288933470223 3215.529006771299 +3971 0.3971 97.5474314057545513 3208.420745077998 +3972 0.3972 97.2269441533193088 3201.324303626800 +3973 0.3973 96.9071659549103686 3194.239664551900 +3974 0.3974 96.5880956311820569 3187.166810014300 +3975 0.3975 96.2697320045711820 3180.105722203298 +3976 0.3976 95.9520738992942768 3173.056383334802 +3977 0.3977 95.6351201413448848 3166.018775652898 +3978 0.3978 95.3188695584908032 3158.992881428698 +3979 0.3979 95.0033209802713543 3151.978682960398 +3980 0.3980 94.6884732379946286 3144.976162574101 +3981 0.3981 94.3743251647347989 3137.985302622499 +3982 0.3982 94.0608755953293780 3131.006085485802 +3983 0.3983 93.7481233663765181 3124.038493571399 +3984 0.3984 93.4360673162322684 3117.082509313503 +3985 0.3985 93.1247062850079033 3110.138115173901 +3986 0.3986 92.8140391145671799 3103.205293640702 +3987 0.3987 92.5040646485236664 3096.284027229500 +3988 0.3988 92.1947817322380558 3089.374298482602 +3989 0.3989 91.8861892128154665 3082.476089969099 +3990 0.3990 91.5782859391027557 3075.589384285202 +3991 0.3991 91.2710707616858059 3068.714164053701 +3992 0.3992 90.9645425328869095 3061.850411924101 +3993 0.3993 90.6587001067620690 3054.998110572600 +3994 0.3994 90.3535423390983254 3048.157242702197 +3995 0.3995 90.0490680874111007 3041.327791042298 +3996 0.3996 89.7452762109415403 3034.509738349003 +3997 0.3997 89.4421655706538417 3027.703067404902 +3998 0.3998 89.1397350292326536 3020.907761019000 +3999 0.3999 88.8379834510803619 3014.123802026799 +4000 0.4000 88.5369097023145173 3007.351173290197 +4001 0.4001 88.2365126507651496 3000.589857697298 +4002 0.4002 87.9367911659721386 2993.839838162799 +4003 0.4003 87.6377441191826421 2987.101097627197 +4004 0.4004 87.3393703833484096 2980.373619057500 +4005 0.4005 87.0416688331231967 2973.657385446899 +4006 0.4006 86.7446383448601210 2966.952379814702 +4007 0.4007 86.4482777966090765 2960.258585206102 +4008 0.4008 86.1525860681141467 2953.575984692401 +4009 0.4009 85.8575620408109614 2946.904561371201 +4010 0.4010 85.5632045978241251 2940.244298365600 +4011 0.4011 85.2695126239646015 2933.595178824798 +4012 0.4012 84.9764850057271701 2926.957185923799 +4013 0.4013 84.6841206312877972 2920.330302863800 +4014 0.4014 84.3924183905010494 2913.714512871098 +4015 0.4015 84.1013771748975785 2907.109799198199 +4016 0.4016 83.8109958776815063 2900.516145123202 +4017 0.4017 83.5212733937278529 2893.933533949901 +4018 0.4018 83.2322086195799784 2887.361949007598 +4019 0.4019 82.9438004534470394 2880.801373651102 +4020 0.4020 82.6560477952014310 2874.251791261100 +4021 0.4021 82.3689495463762285 2867.713185243003 +4022 0.4022 82.0825046101626441 2861.185539028600 +4023 0.4023 81.7967118914074831 2854.668836074499 +4024 0.4024 81.5115702966106284 2848.163059862698 +4025 0.4025 81.2270787339224682 2841.668193900598 +4026 0.4026 80.9432361131413955 2835.184221720898 +4027 0.4027 80.6600413457112779 2828.711126881499 +4028 0.4028 80.3774933447189284 2822.248892965497 +4029 0.4029 80.0955910248916041 2815.797503581001 +4030 0.4030 79.8143333025944770 2809.356942361599 +4031 0.4031 79.5337190958281326 2802.927192965202 +4032 0.4032 79.2537473242260972 2796.508239075600 +4033 0.4033 78.9744169090522661 2790.100064401002 +4034 0.4034 78.6957267731984729 2783.702652674798 +4035 0.4035 78.4176758411819748 2777.315987655100 +4036 0.4036 78.1402630391429653 2770.940053124999 +4037 0.4037 77.8634872948421020 2764.574832892398 +4038 0.4038 77.5873475376579904 2758.220310789900 +4039 0.4039 77.3118426985847549 2751.876470674903 +4040 0.4040 77.0369717102295368 2745.543296429500 +4041 0.4041 76.7627335068100507 2739.220771960201 +4042 0.4042 76.4891270241521113 2732.908881198600 +4043 0.4043 76.2161511996871610 2726.607608100298 +4044 0.4044 75.9438049724498399 2720.316936646002 +4045 0.4045 75.6720872830755127 2714.036850840399 +4046 0.4046 75.4009970737978534 2707.767334712902 +4047 0.4047 75.1305332884463439 2701.508372317301 +4048 0.4048 74.8606948724439007 2695.259947731698 +4049 0.4049 74.5914807728044025 2689.022045058398 +4050 0.4050 74.3228899381302739 2682.794648424198 +4051 0.4051 74.0549213186100559 2676.577741980200 +4052 0.4052 73.7875738660159755 2670.371309901398 +4053 0.4053 73.5208465337015440 2664.175336387299 +4054 0.4054 73.2547382765991131 2657.989805661200 +4055 0.4055 72.9892480512175155 2651.814701970699 +4056 0.4056 72.7243748156396066 2645.650009587600 +4057 0.4057 72.4601175295198630 2639.495712807202 +4058 0.4058 72.1964751540820373 2633.351795949300 +4059 0.4059 71.9334466521167144 2627.218243357202 +4060 0.4060 71.6710309879789236 2621.095039398500 +4061 0.4061 71.4092271275857939 2614.982168464201 +4062 0.4062 71.1480340384141101 2608.879614969599 +4063 0.4063 70.8874506894979532 2602.787363353400 +4064 0.4064 70.6274760514263846 2596.705398078098 +4065 0.4065 70.3681090963409730 2590.633703629999 +4066 0.4066 70.1093487979335350 2584.572264518800 +4067 0.4067 69.8511941314436768 2578.521065278299 +4068 0.4068 69.5936440736564776 2572.480090465597 +4069 0.4069 69.3366976029001449 2566.449324661000 +4070 0.4070 69.0803536990436555 2560.428752468899 +4071 0.4071 68.8246113434943823 2554.418358516701 +4072 0.4072 68.5694695191957635 2548.418127455599 +4073 0.4073 68.3149272106250010 2542.428043959702 +4074 0.4074 68.0609834037906722 2536.448092727001 +4075 0.4075 67.8076370862304003 2530.478258478401 +4076 0.4076 67.5548872470085655 2524.518525958203 +4077 0.4077 67.3027328767139608 2518.568879934002 +4078 0.4078 67.0511729674574468 2512.629305196402 +4079 0.4079 66.8002065128696501 2506.699786559398 +4080 0.4080 66.5498325080986746 2500.780308860001 +4081 0.4081 66.3000499498077716 2494.870856958103 +4082 0.4082 66.0508578361730230 2488.971415737000 +4083 0.4083 65.8022551668810394 2483.081970102699 +4084 0.4084 65.5542409431266861 2477.202504984300 +4085 0.4085 65.3068141676107814 2471.333005333701 +4086 0.4086 65.0599738445377938 2465.473456126103 +4087 0.4087 64.8137189796135402 2459.623842358898 +4088 0.4088 64.5680485800429551 2453.784149052699 +4089 0.4089 64.3229616545277594 2447.954361251101 +4090 0.4090 64.0784572132642154 2442.134464019902 +4091 0.4091 63.8345342679408105 2436.324442448102 +4092 0.4092 63.5911918317360616 2430.524281646900 +4093 0.4093 63.3484289193161914 2424.733966750500 +4094 0.4094 63.1062445468328832 2418.953482915600 +4095 0.4095 62.8646377319210359 2413.182815321299 +4096 0.4096 62.6236074936964968 2407.421949169500 +4097 0.4097 62.3831528527538097 2401.670869684200 +4098 0.4098 62.1432728311639977 2395.929562112098 +4099 0.4099 61.9039664524722610 2390.198011722601 +4100 0.4100 61.6652327416958030 2384.476203806600 +4101 0.4101 61.4270707253215562 2378.764123678302 +4102 0.4102 61.1894794313039725 2373.061756673400 +4103 0.4103 60.9524578890627708 2367.369088150601 +4104 0.4104 60.7160051294807346 2361.686103490098 +4105 0.4105 60.4801201849014802 2356.012788095002 +4106 0.4106 60.2448020891272336 2350.349127390000 +4107 0.4107 60.0100498774166340 2344.695106821997 +4108 0.4108 59.7758625864825177 2339.050711860302 +4109 0.4109 59.5422392544897150 2333.415927995800 +4110 0.4110 59.3091789210528333 2327.790740741897 +4111 0.4111 59.0766806272340617 2322.175135633603 +4112 0.4112 58.8447434155409894 2316.569098227901 +4113 0.4113 58.6133663299243963 2310.972614103899 +4114 0.4114 58.3825484157760926 2305.385668862200 +4115 0.4115 58.1522887199266947 2299.808248125697 +4116 0.4116 57.9225862906434870 2294.240337538500 +4117 0.4117 57.6934401776282044 2288.681922767097 +4118 0.4118 57.4648494320148870 2283.132989499201 +4119 0.4119 57.2368131063676913 2277.593523444699 +4120 0.4120 57.0093302546787299 2272.063510334498 +4121 0.4121 56.7823999323659123 2266.542935921800 +4122 0.4122 56.5560211962707697 2261.031785980998 +4123 0.4123 56.3301931046563311 2255.530046307798 +4124 0.4124 56.1049147172049416 2250.037702720001 +4125 0.4125 55.8801850950161096 2244.554741056600 +4126 0.4126 55.6560033006043895 2239.081147177800 +4127 0.4127 55.4323683978972070 2233.616906965799 +4128 0.4128 55.2092794522327424 2228.162006323499 +4129 0.4129 54.9867355303577838 2222.716431175602 +4130 0.4130 54.7647357004256037 2217.280167467998 +4131 0.4131 54.5432790319938263 2211.853201167600 +4132 0.4132 54.3223645960222967 2206.435518263002 +4133 0.4133 54.1019914648709701 2201.027104763598 +4134 0.4134 53.8821587122977803 2195.627946700202 +4135 0.4135 53.6628654134565437 2190.238030124601 +4136 0.4136 53.4441106448948275 2184.857341109699 +4137 0.4137 53.2258934845518610 2179.485865749699 +4138 0.4138 53.0082130117564034 2174.123590159397 +4139 0.4139 52.7910683072246911 2168.770500474900 +4140 0.4140 52.5744584530582841 2163.426582853303 +4141 0.4141 52.3583825327419987 2158.091823472398 +4142 0.4142 52.1428396311418254 2152.766208531000 +4143 0.4143 51.9278288345028329 2147.449724248800 +4144 0.4144 51.7133492304470792 2142.142356866298 +4145 0.4145 51.4993999079715294 2136.844092644700 +4146 0.4146 51.2859799574459885 2131.554917866099 +4147 0.4147 51.0730884706110260 2126.274818833201 +4148 0.4148 50.8607245405758945 2121.003781869400 +4149 0.4149 50.6488872618164763 2115.741793319001 +4150 0.4150 50.4375757301732008 2110.488839546502 +4151 0.4151 50.2267890428490134 2105.244906937300 +4152 0.4152 50.0165262984072854 2100.009981897198 +4153 0.4153 49.8067865967697969 2094.784050852602 +4154 0.4154 49.5975690392146333 2089.567100250602 +4155 0.4155 49.3888727283741957 2084.359116558102 +4156 0.4156 49.1806967682331262 2079.160086263302 +4157 0.4157 48.9730402641262685 2073.969995873900 +4158 0.4158 48.7659023227366362 2068.788831918697 +4159 0.4159 48.5592820520933728 2063.616580946600 +4160 0.4160 48.3531785615697203 2058.453229526400 +4161 0.4161 48.1475909618810149 2053.298764247698 +4162 0.4162 47.9425183650826341 2048.153171719900 +4163 0.4163 47.7379598845679922 2043.016438572999 +4164 0.4164 47.5339146350664947 2037.888551456897 +4165 0.4165 47.3303817326415768 2032.769497041500 +4166 0.4166 47.1273602946886427 2027.659262017198 +4167 0.4167 46.9248494399330767 2022.557833094103 +4168 0.4168 46.7228482884282457 2017.465197002501 +4169 0.4169 46.5213559615534891 2012.381340492600 +4170 0.4170 46.3203715820121147 2007.306250334903 +4171 0.4171 46.1198942738294164 2002.239913319099 +4172 0.4172 45.9199231623506847 1997.182316255603 +4173 0.4173 45.7204573742391958 1992.133445974199 +4174 0.4174 45.5214960374742432 1987.093289324799 +4175 0.4175 45.3230382813491701 1982.061833176700 +4176 0.4176 45.1250832364693579 1977.039064419499 +4177 0.4177 44.9276300347502655 1972.024969962302 +4178 0.4178 44.7306778094154680 1967.019536733602 +4179 0.4179 44.5342256949946744 1962.022751682198 +4180 0.4180 44.3382728273217595 1957.034601776100 +4181 0.4181 44.1428183435328165 1952.055074002797 +4182 0.4182 43.9478613820641684 1947.084155370103 +4183 0.4183 43.7534010826504414 1942.121832904402 +4184 0.4184 43.5594365863226045 1937.168093652399 +4185 0.4185 43.3659670354060012 1932.222924679700 +4186 0.4186 43.1729915735184164 1927.286313072000 +4187 0.4187 42.9805093455681302 1922.358245933698 +4188 0.4188 42.7885194977519987 1917.438710389000 +4189 0.4189 42.5970211775534651 1912.527693581698 +4190 0.4190 42.4060135337406621 1907.625182674397 +4191 0.4191 42.2154957163644795 1902.731164849301 +4192 0.4192 42.0254668767566244 1897.845627307797 +4193 0.4193 41.8359261675277097 1892.968557270498 +4194 0.4194 41.6468727425653071 1888.099941977500 +4195 0.4195 41.4583057570320577 1883.239768687501 +4196 0.4196 41.2702243673637312 1878.388024678999 +4197 0.4197 41.0826277312673298 1873.544697248999 +4198 0.4198 40.8955150077191760 1868.709773714098 +4199 0.4199 40.7088853569629805 1863.883241409800 +4200 0.4200 40.5227379405079660 1859.065087690498 +4201 0.4201 40.3370719211269702 1854.255299929402 +4202 0.4202 40.1518864628545344 1849.453865519299 +4203 0.4203 39.9671807309850067 1844.660771871298 +4204 0.4204 39.7829538920706582 1839.876006415700 +4205 0.4205 39.5992051139197869 1835.099556601701 +4206 0.4206 39.4159335655948340 1830.331409897299 +4207 0.4207 39.2331384174105153 1825.571553789101 +4208 0.4208 39.0508188409319175 1820.819975782902 +4209 0.4209 38.8689740089726357 1816.076663402702 +4210 0.4210 38.6876030955929124 1811.341604191799 +4211 0.4211 38.5067052760977404 1806.614785711699 +4212 0.4212 38.3262797270349935 1801.896195543199 +4213 0.4213 38.1463256261936010 1797.185821284700 +4214 0.4214 37.9668421526016431 1792.483650554401 +4215 0.4215 37.7878284865245249 1787.789670988001 +4216 0.4216 37.6092838094631006 1783.103870240499 +4217 0.4217 37.4312073041518190 1778.426235985102 +4218 0.4218 37.2535981545568902 1773.756755913502 +4219 0.4219 37.0764555458744240 1769.095417735800 +4220 0.4220 36.8997786645285970 1764.442209180801 +4221 0.4221 36.7235666981697975 1759.797117995200 +4222 0.4222 36.5478188356728069 1755.160131944602 +4223 0.4223 36.3725342671349523 1750.531238812498 +4224 0.4224 36.1977121838742733 1745.910426401100 +4225 0.4225 36.0233517784276955 1741.297682530399 +4226 0.4226 35.8494522445492194 1736.692995039099 +4227 0.4227 35.6760127772080722 1732.096351783901 +4228 0.4228 35.5030325725868892 1727.507740639699 +4229 0.4229 35.3305108280799161 1722.927149499701 +4230 0.4230 35.1584467422911828 1718.354566274898 +4231 0.4231 34.9868395150327061 1713.789978894700 +4232 0.4232 34.8156883473226415 1709.233375306601 +4233 0.4233 34.6449924413835220 1704.684743475798 +4234 0.4234 34.4747510006404312 1700.144071385999 +4235 0.4235 34.3049632297192062 1695.611347038503 +4236 0.4236 34.1356283344446467 1691.086558452698 +4237 0.4237 33.9667455218387246 1686.569693665802 +4238 0.4238 33.7983140001187721 1682.060740733301 +4239 0.4239 33.6303329786957050 1677.559687728000 +4240 0.4240 33.4628016681722542 1673.066522740999 +4241 0.4241 33.2957192803411530 1668.581233880999 +4242 0.4242 33.1290850281833755 1664.103809274500 +4243 0.4243 32.9628981258663600 1659.634237065802 +4244 0.4244 32.7971577887422114 1655.172505417100 +4245 0.4245 32.6318632333459675 1650.718602507801 +4246 0.4246 32.4670136773937941 1646.272516535599 +4247 0.4247 32.3026083397812513 1641.834235715298 +4248 0.4248 32.1386464405815033 1637.403748279703 +4249 0.4249 31.9751272010435628 1632.981042479099 +4250 0.4250 31.8120498435905539 1628.566106581100 +4251 0.4251 31.6494135918179325 1624.158928871300 +4252 0.4252 31.4872176704917521 1619.759497652303 +4253 0.4253 31.3254613055469129 1615.367801244502 +4254 0.4254 31.1641437240853989 1610.983827985798 +4255 0.4255 31.0032641543745449 1606.607566231301 +4256 0.4256 30.8428218258453057 1602.239004353502 +4257 0.4257 30.6828159690905018 1597.878130742600 +4258 0.4258 30.5232458158630884 1593.524933805700 +4259 0.4259 30.3641105990744329 1589.179401967402 +4260 0.4260 30.2054095527925810 1584.841523669602 +4261 0.4261 30.0471419122405194 1580.511287371599 +4262 0.4262 29.8893069137944636 1576.188681549498 +4263 0.4263 29.7319037949821343 1571.873694697100 +4264 0.4264 29.5749317944810244 1567.566315325101 +4265 0.4265 29.4183901521167002 1563.266531961399 +4266 0.4266 29.2622781088610786 1558.974333151000 +4267 0.4267 29.1065949068307397 1554.689707455800 +4268 0.4268 28.9513397892851856 1550.412643455300 +4269 0.4269 28.7965120006251389 1546.143129745600 +4270 0.4270 28.6421107863908624 1541.881154939903 +4271 0.4271 28.4881353932604533 1537.626707668300 +4272 0.4272 28.3345850690481278 1533.379776578200 +4273 0.4273 28.1814590627025439 1529.140350333499 +4274 0.4274 28.0287566243051103 1524.908417615203 +4275 0.4275 27.8764770050682813 1520.683967121400 +4276 0.4276 27.7246194573338869 1516.466987566502 +4277 0.4277 27.5731832345714523 1512.257467682201 +4278 0.4278 27.4221675913765033 1508.055396216798 +4279 0.4279 27.2715717834688824 1503.860761935597 +4280 0.4280 27.1213950676910933 1499.673553620200 +4281 0.4281 26.9716367020066130 1495.493760069403 +4282 0.4282 26.8222959454982330 1491.321370098201 +4283 0.4283 26.6733720583663896 1487.156372538699 +4284 0.4284 26.5248643019274830 1482.998756239402 +4285 0.4285 26.3767719386122330 1478.848510065600 +4286 0.4286 26.2290942319640088 1474.705622898902 +4287 0.4287 26.0818304466371771 1470.570083637700 +4288 0.4288 25.9349798483954537 1466.441881196799 +4289 0.4289 25.7885417041102301 1462.321004507699 +4290 0.4290 25.6425152817589463 1458.207442518000 +4291 0.4291 25.4968998504234357 1454.101184192201 +4292 0.4292 25.3516946802882863 1450.002218510799 +4293 0.4293 25.2068990426391863 1445.910534471201 +4294 0.4294 25.0625122098612927 1441.826121086699 +4295 0.4295 24.9185334554375970 1437.748967387201 +4296 0.4296 24.7749620539472986 1433.679062418800 +4297 0.4297 24.6317972810641521 1429.616395244098 +4298 0.4298 24.4890384135548516 1425.560954941899 +4299 0.4299 24.3466847292774133 1421.512730606901 +4300 0.4300 24.2047355071795387 1417.471711350601 +4301 0.4301 24.0631900272970043 1413.437886300100 +4302 0.4302 23.9220475707520350 1409.411244599301 +4303 0.4303 23.7813074197516805 1405.391775407799 +4304 0.4304 23.6409688575862162 1401.379467901501 +4305 0.4305 23.5010311686275344 1397.374311272102 +4306 0.4306 23.3614936383275342 1393.376294727899 +4307 0.4307 23.2223555532165058 1389.385407492700 +4308 0.4308 23.0836162009015311 1385.401638806798 +4309 0.4309 22.9452748700648925 1381.424977925999 +4310 0.4310 22.8073308504624670 1377.455414122498 +4311 0.4311 22.6697834329221237 1373.492936684401 +4312 0.4312 22.5326319093421432 1369.537534915202 +4313 0.4313 22.3958755726896399 1365.589198134898 +4314 0.4314 22.2595137169989385 1361.647915679099 +4315 0.4315 22.1235456373700146 1357.713676899399 +4316 0.4316 21.9879706299668953 1353.786471162999 +4317 0.4317 21.8527879920160970 1349.866287853001 +4318 0.4318 21.7179970218050364 1345.953116368200 +4319 0.4319 21.5835970186804573 1342.046946123402 +4320 0.4320 21.4495872830468528 1338.147766548700 +4321 0.4321 21.3159671163649094 1334.255567090200 +4322 0.4322 21.1827358211499259 1330.370337209501 +4323 0.4323 21.0498927009702470 1326.492066384097 +4324 0.4324 20.9174370604457032 1322.620744106800 +4325 0.4325 20.7853682052460584 1318.756359886098 +4326 0.4326 20.6536854420894400 1314.898903246300 +4327 0.4327 20.5223880787407786 1311.048363726899 +4328 0.4328 20.3914754240102738 1307.204730883201 +4329 0.4329 20.2609467877518306 1303.367994285698 +4330 0.4330 20.1308014808615141 1299.538143520600 +4331 0.4331 20.0010388152760150 1295.715168189403 +4332 0.4332 19.8716581039710753 1291.899057909402 +4333 0.4333 19.7426586609599646 1288.089802312799 +4334 0.4334 19.6140398012919555 1284.287391047397 +4335 0.4335 19.4858008410507715 1280.491813776302 +4336 0.4336 19.3579410973530521 1276.703060178101 +4337 0.4337 19.2304598883468323 1272.921119946302 +4338 0.4338 19.1033565332099968 1269.145982790400 +4339 0.4339 18.9766303521487671 1265.377638434198 +4340 0.4340 18.8502806663961806 1261.616076617498 +4341 0.4341 18.7243067982105522 1257.861287095100 +4342 0.4342 18.5987080708739576 1254.113259636801 +4343 0.4343 18.4734838086907374 1250.371984027599 +4344 0.4344 18.3486333369859658 1246.637450067799 +4345 0.4345 18.2241559821039374 1242.909647572800 +4346 0.4346 18.1000510714066465 1239.188566372999 +4347 0.4347 17.9763179332723126 1235.474196313698 +4348 0.4348 17.8529558970938425 1231.766527255702 +4349 0.4349 17.7299642932773409 1228.065549074301 +4350 0.4350 17.6073424532406193 1224.371251660101 +4351 0.4351 17.4850897094116853 1220.683624918602 +4352 0.4352 17.3632053952272365 1217.002658770398 +4353 0.4353 17.2416888451311863 1213.328343150599 +4354 0.4354 17.1205393945731750 1209.660668009597 +4355 0.4355 16.9997563800070637 1205.999623312600 +4356 0.4356 16.8793391388894527 1202.345199039599 +4357 0.4357 16.7592870096782143 1198.697385185202 +4358 0.4358 16.6395993318309827 1195.056171759403 +4359 0.4359 16.5202754458036978 1191.421548786300 +4360 0.4360 16.4013146930491232 1187.793506305199 +4361 0.4361 16.2827164160153579 1184.172034370102 +4362 0.4362 16.1644799581443728 1180.557123049599 +4363 0.4363 16.0466046638705464 1176.948762426899 +4364 0.4364 15.9290898786191981 1173.346942600099 +4365 0.4365 15.8119349488050975 1169.751653681902 +4366 0.4366 15.6951392218310328 1166.162885799396 +4367 0.4367 15.5787020460863381 1162.580629094500 +4368 0.4368 15.4626227709454280 1159.004873723701 +4369 0.4369 15.3469007467663427 1155.435609858003 +4370 0.4370 15.2315353248893022 1151.872827682801 +4371 0.4371 15.1165258576352475 1148.316517398300 +4372 0.4372 15.0018716983043827 1144.766669219000 +4373 0.4373 14.8875722011747520 1141.223273373598 +4374 0.4374 14.7736267215007775 1137.686320105899 +4375 0.4375 14.6600346155118082 1134.155799673499 +4376 0.4376 14.5467952404106988 1130.631702348699 +4377 0.4377 14.4339079543723585 1127.114018418099 +4378 0.4378 14.3213721165423191 1123.602738182697 +4379 0.4379 14.2091870870352945 1120.097851957798 +4380 0.4380 14.0973522269337597 1116.599350072902 +4381 0.4381 13.9858668982865204 1113.107222871899 +4382 0.4382 13.8747304641072713 1109.621460713097 +4383 0.4383 13.7639422883731868 1106.142053968601 +4384 0.4384 13.6535017360234967 1102.668993025200 +4385 0.4385 13.5434081729580562 1099.202268283600 +4386 0.4386 13.4336609660359354 1095.741870158799 +4387 0.4387 13.3242594830739947 1092.287789080001 +4388 0.4388 13.2152030928454849 1088.840015490201 +4389 0.4389 13.1064911650786247 1085.398539846999 +4390 0.4390 12.9981230704551898 1081.963352621700 +4391 0.4391 12.8900981806091153 1078.534444299799 +4392 0.4392 12.7824158681250797 1075.111805380900 +4393 0.4393 12.6750755065371088 1071.695426378501 +4394 0.4394 12.5680764703271741 1068.285297820203 +4395 0.4395 12.4614181349237896 1064.881410247497 +4396 0.4396 12.3550998767006206 1061.483754215900 +4397 0.4397 12.2491210729750861 1058.092320294800 +4398 0.4398 12.1434811020069713 1054.707099067498 +4399 0.4399 12.0381793429970312 1051.328081131302 +4400 0.4400 11.9332151760856107 1047.955257097099 +4401 0.4401 11.8285879823512499 1044.588617590100 +4402 0.4402 11.7242971438093004 1041.228153248900 +4403 0.4403 11.6203420434105560 1037.873854726000 +4404 0.4404 11.5167220650398665 1034.525712687799 +4405 0.4405 11.4134365935147564 1031.183717814398 +4406 0.4406 11.3104850145840619 1027.847860799502 +4407 0.4407 11.2078667149265474 1024.518132350800 +4408 0.4408 11.1055810821495271 1021.194523189599 +4409 0.4409 11.0036275047875129 1017.877024050700 +4410 0.4410 10.9020053723008488 1014.565625682601 +4411 0.4411 10.8007140750743336 1011.260318847701 +4412 0.4412 10.6997530044158626 1007.961094321701 +4413 0.4413 10.5991215525550722 1004.667942894099 +4414 0.4414 10.4988191126419874 1001.380855367603 +4415 0.4415 10.3988450787456568 998.099822559001 +4416 0.4416 10.2991988458527874 994.824835298401 +4417 0.4417 10.1998798098664132 991.555884429101 +4418 0.4418 10.1008873676045425 988.292960808303 +4419 0.4419 10.0022209167988123 985.036055306300 +4420 0.4420 9.9038798560931323 981.785158807299 +4421 0.4421 9.8058635850423368 978.540262208600 +4422 0.4422 9.7081715041108669 975.301356420801 +4423 0.4423 9.6108030146714114 972.068432368298 +4424 0.4424 9.5137575190035708 968.841480988500 +4425 0.4425 9.4170344202925413 965.620493232098 +4426 0.4426 9.3206331226277612 962.405460063503 +4427 0.4427 9.2245530310015909 959.196372459901 +4428 0.4428 9.1287935513079805 955.993221412300 +4429 0.4429 9.0333540903411311 952.795997924699 +4430 0.4430 8.9382340557941955 949.604693014000 +4431 0.4431 8.8434328562579463 946.419297711000 +4432 0.4432 8.7489499012194418 943.239803059099 +4433 0.4433 8.6547846010607277 940.066200115201 +4434 0.4434 8.5609363670574972 936.898479949403 +4435 0.4435 8.4674046113777965 933.736633644599 +4436 0.4436 8.3741887470807121 930.580652297100 +4437 0.4437 8.2812881881150417 927.430527016302 +4438 0.4438 8.1887023493180067 924.286248924400 +4439 0.4439 8.0964306464139320 921.147809157101 +4440 0.4440 8.0044724960129479 918.015198862598 +4441 0.4441 7.9128273156096922 914.888409202500 +4442 0.4442 7.8214945235820075 911.767431351200 +4443 0.4443 7.7304735391896271 908.652256496400 +4444 0.4444 7.6397637825729019 905.542875838102 +4445 0.4445 7.5493646747515015 902.439280589901 +4446 0.4446 7.4592756376231062 899.341461978001 +4447 0.4447 7.3694960939621259 896.249411241599 +4448 0.4448 7.2800254674184206 893.163119632500 +4449 0.4449 7.1908631825160052 890.082578415801 +4450 0.4450 7.1020086646517706 887.007778868898 +4451 0.4451 7.0134613400941959 883.938712282601 +4452 0.4452 6.9252206359820558 880.875369960198 +4453 0.4453 6.8372859803231707 877.817743217500 +4454 0.4454 6.7496568019931154 874.765823383601 +4455 0.4455 6.6623325307339405 871.719601799898 +4456 0.4456 6.5753125971529105 868.679069820697 +4457 0.4457 6.4885964327212253 865.644218812999 +4458 0.4458 6.4021834697727549 862.615040156401 +4459 0.4459 6.3160731415027698 859.591525243301 +4460 0.4460 6.2302648819666802 856.573665478500 +4461 0.4461 6.1447581260787700 853.561452279697 +4462 0.4462 6.0595523096109352 850.554877077000 +4463 0.4463 5.9746468691914298 847.553931313101 +4464 0.4464 5.8900412423036199 844.558606443101 +4465 0.4465 5.8057348672847047 841.568893935200 +4466 0.4466 5.7217271833244645 838.584785269599 +4467 0.4467 5.6380176304640344 835.606271938999 +4468 0.4468 5.5546056495946399 832.633345448899 +4469 0.4469 5.4714906824563396 829.665997317101 +4470 0.4470 5.3886721716367996 826.704219073697 +4471 0.4471 5.3061495605700451 823.748002261400 +4472 0.4472 5.2239222935352103 820.797338435303 +4473 0.4473 5.1419898156553048 817.852219162800 +4474 0.4474 5.0603515728959749 814.912636023801 +4475 0.4475 4.9790070120642644 811.978580610401 +4476 0.4476 4.8979555808073947 809.050044526997 +4477 0.4477 4.8171967276115151 806.127019390602 +4478 0.4478 4.7367299018004800 803.209496830103 +4479 0.4479 4.6565545535346295 800.297468486900 +4480 0.4480 4.5766701338095501 797.390926014697 +4481 0.4481 4.4970760944548456 794.489861079401 +4482 0.4482 4.4177718881329309 791.594265358901 +4483 0.4483 4.3387569683378109 788.704130543501 +4484 0.4484 4.2600307893938512 785.819448335700 +4485 0.4485 4.1815928064545611 782.940210450099 +4486 0.4486 4.1034424755013861 780.066408613402 +4487 0.4487 4.0255792533424959 777.198034564401 +4488 0.4488 3.9480025976115711 774.335080054097 +4489 0.4489 3.8707119667665912 771.477536845498 +4490 0.4490 3.7937068200886213 768.625396713898 +4491 0.4491 3.7169866176806114 765.778651446301 +4492 0.4492 3.6405508204661965 762.937292842002 +4493 0.4493 3.5643988901884964 760.101312711999 +4494 0.4494 3.4885302894089114 757.270702879701 +4495 0.4495 3.4129444815059213 754.445455180099 +4496 0.4496 3.3376409306738912 751.625561460500 +4497 0.4497 3.2626191019218762 748.811013579798 +4498 0.4498 3.1878784610724362 746.001803409003 +4499 0.4499 3.1134184747604312 743.197922831099 +4500 0.4500 3.0392386104318363 740.399363740802 +4501 0.4501 2.9653383363425663 737.606118044601 +4502 0.4502 2.8917171215572814 734.818177661098 +4503 0.4503 2.8183744359482015 732.035534520503 +4504 0.4504 2.7453097501939214 729.258180565099 +4505 0.4505 2.6725225357782465 726.486107748402 +4506 0.4506 2.6000122649889965 723.719308036601 +4507 0.4507 2.5277784109168313 720.957773406699 +4508 0.4508 2.4558204474540863 718.201495848200 +4509 0.4509 2.3841378492935963 715.450467361599 +4510 0.4510 2.3127300919275262 712.704679959799 +4511 0.4511 2.2415966516461912 709.964125666898 +4512 0.4512 2.1707370055368962 707.228796519001 +4513 0.4513 2.1001506314827760 704.498684563401 +4514 0.4514 2.0298370081616208 701.773781859702 +4515 0.4515 1.9597956150447156 699.054080478400 +4516 0.4516 1.8900259323956905 696.339572502100 +4517 0.4517 1.8205274412693555 693.630250024602 +4518 0.4518 1.7512996235105454 690.926105151600 +4519 0.4519 1.6823419617529554 688.227130000199 +4520 0.4520 1.6136539394179954 685.533316698999 +4521 0.4521 1.5452350407136406 682.844657388097 +4522 0.4522 1.4770847506332756 680.161144219201 +4523 0.4523 1.4092025549545504 677.482769355302 +4524 0.4524 1.3415879402382402 674.809524970900 +4525 0.4525 1.2742403938270903 672.141403252099 +4526 0.4526 1.2071594038446753 669.478396396200 +4527 0.4527 1.1403444591942602 666.820496612101 +4528 0.4528 1.0737950495576700 664.167696119701 +4529 0.4529 1.0075106653941399 661.519987150899 +4530 0.4530 0.9414907979391700 658.877361948500 +4531 0.4531 0.8757349392034199 656.239812766500 +4532 0.4532 0.8102425819715550 653.607331870800 +4533 0.4533 0.7450132198011200 650.979911537899 +4534 0.4534 0.6800463470214201 648.357544056100 +4535 0.4535 0.6153414587323752 645.740221724798 +4536 0.4536 0.5508980508034153 643.127936854402 +4537 0.4537 0.4867156198723400 640.520681767102 +4538 0.4538 0.4227936633441998 637.918448795703 +4539 0.4539 0.3591316793901846 635.321230284600 +4540 0.4540 0.2957291669464996 632.729018589100 +4541 0.4541 0.2325856257132497 630.141806075899 +4542 0.4542 0.1697005561533197 627.559585122701 +4543 0.4543 0.1070734594912645 624.982348118403 +4544 0.4544 0.0447038377121944 622.410087462998 +4545 0.4545 -0.0174088064393305 619.842795567500 +4546 0.4546 -0.0792649694604106 617.280464854102 +4547 0.4547 -0.1408651470909106 614.723087755898 +4548 0.4548 -0.2022098343145706 612.170656717302 +4549 0.4549 -0.2632995253601056 609.623164193399 +4550 0.4550 -0.3241347137023056 607.080602650600 +4551 0.4551 -0.3847158920631406 604.542964566099 +4552 0.4552 -0.4450435524128505 602.010242428099 +4553 0.4553 -0.5051181859710505 599.482428735901 +4554 0.4554 -0.5649402832078304 596.959515999697 +4555 0.4555 -0.6245103338448305 594.441496740303 +4556 0.4556 -0.6838288268563406 591.928363489900 +4557 0.4557 -0.7428962504704056 589.420108791401 +4558 0.4558 -0.8017130921698908 586.916725198302 +4559 0.4559 -0.8602798386935759 584.418205275400 +4560 0.4560 -0.9185969760372460 581.924541598000 +4561 0.4561 -0.9766649894547760 579.435726752599 +4562 0.4562 -1.0344843634592058 576.951753335998 +4563 0.4563 -1.0920555818238158 574.472613956201 +4564 0.4564 -1.1493791275832210 571.998301231903 +4565 0.4565 -1.2064554830344314 569.528807792303 +4566 0.4566 -1.2632851297379366 567.064126277801 +4567 0.4567 -1.3198685485187767 564.604249339001 +4568 0.4568 -1.3762062194676119 562.149169637702 +4569 0.4569 -1.4322986219418019 559.698879846099 +4570 0.4570 -1.4881462345664669 557.253372647199 +4571 0.4571 -1.5437495352355568 554.812640734599 +4572 0.4572 -1.5991090011129068 552.376676812401 +4573 0.4573 -1.6542251086333168 549.945473595802 +4574 0.4574 -1.7090983335036070 547.519023810000 +4575 0.4575 -1.7637291507036719 545.097320191300 +4576 0.4576 -1.8181180344875518 542.680355486300 +4577 0.4577 -1.8722654583844818 540.268122452300 +4578 0.4578 -1.9261718951999516 537.860613857098 +4579 0.4579 -1.9798378170167514 535.457822478900 +4580 0.4580 -2.0332636951960366 533.059741106801 +4581 0.4581 -2.0864500003783717 530.666362539901 +4582 0.4582 -2.1393972024847816 528.277679588300 +4583 0.4583 -2.1921057707178018 525.893685072100 +4584 0.4584 -2.2445761735625118 523.514371822101 +4585 0.4585 -2.2968088787875920 521.139732679501 +4586 0.4586 -2.3488043534463618 518.769760495899 +4587 0.4587 -2.4005630638778319 516.404448133500 +4588 0.4588 -2.4520854757077317 514.043788464500 +4589 0.4589 -2.5033720538495516 511.687774371901 +4590 0.4590 -2.5544232625055767 509.336398748601 +4591 0.4591 -2.6052395651679219 506.989654498298 +4592 0.4592 -2.6558214246195719 504.647534534703 +4593 0.4593 -2.7061693029354119 502.310031782101 +4594 0.4594 -2.7562836614832520 499.977139174698 +4595 0.4595 -2.8061649609248569 497.648849657402 +4596 0.4596 -2.8558136612169820 495.325156185099 +4597 0.4597 -2.9052302216123866 493.006051722998 +4598 0.4598 -2.9544151006608668 490.691529246600 +4599 0.4599 -3.0033687562102820 488.381581741702 +4600 0.4600 -3.0520916454075673 486.076202204000 +4601 0.4601 -3.1005842246997526 483.775383639702 +4602 0.4602 -3.1488469498349829 481.479119064901 +4603 0.4603 -3.1968802758635428 479.187401506300 +4604 0.4604 -3.2446846571388579 476.900224000001 +4605 0.4605 -3.2922605473185178 474.617579593199 +4606 0.4606 -3.3396083993652828 472.339461342101 +4607 0.4607 -3.3867286655480879 470.065862314001 +4608 0.4608 -3.4336217974430832 467.796775585903 +4609 0.4609 -3.4802882459345983 465.532194244399 +4610 0.4610 -3.5267284612161731 463.272111387101 +4611 0.4611 -3.5729428927915681 461.016520120800 +4612 0.4612 -3.6189319894757328 458.765413562498 +4613 0.4613 -3.6646961993958427 456.518784839700 +4614 0.4614 -3.7102359699922927 454.276627089301 +4615 0.4615 -3.7555517480196827 452.038933458502 +4616 0.4616 -3.8006439795478277 449.805697104402 +4617 0.4617 -3.8455131099627380 447.576911193799 +4618 0.4618 -3.8901595839676180 445.352568903803 +4619 0.4619 -3.9345838455838633 443.132663421100 +4620 0.4620 -3.9787863381520583 440.917187942800 +4621 0.4621 -4.0227675043329532 438.706135675100 +4622 0.4622 -4.0665277861084483 436.499499834801 +4623 0.4623 -4.1100676247825980 434.297273648201 +4624 0.4624 -4.1533874609825778 432.099450351398 +4625 0.4625 -4.1964877346596730 429.906023190499 +4626 0.4626 -4.2393688850902675 427.716985421401 +4627 0.4627 -4.2820313508768129 425.532330309503 +4628 0.4628 -4.3244755699488175 423.352051130598 +4629 0.4629 -4.3667019795638229 421.176141169501 +4630 0.4630 -4.4087110163083629 419.004593721300 +4631 0.4631 -4.4505031160989628 416.837402090699 +4632 0.4632 -4.4920787141830978 414.674559592000 +4633 0.4633 -4.5334382451401680 412.516059549398 +4634 0.4634 -4.5745821428824680 410.361895296603 +4635 0.4635 -4.6155108406561531 408.212060177102 +4636 0.4636 -4.6562247710422131 406.066547544098 +4637 0.4637 -4.6967243659574383 403.925350760397 +4638 0.4638 -4.7370100566553628 401.788463198100 +4639 0.4639 -4.7770822737272525 399.655878239701 +4640 0.4640 -4.8169414471030674 397.527589276600 +4641 0.4641 -4.8565880060523927 395.403589709902 +4642 0.4642 -4.8960223791854283 393.283872950800 +4643 0.4643 -4.9352449944539378 391.168432419399 +4644 0.4644 -4.9742562791521880 389.057261545600 +4645 0.4645 -5.0130566599179183 386.950353769000 +4646 0.4646 -5.0516465627332883 384.847702538402 +4647 0.4647 -5.0900264129258330 382.749301312499 +4648 0.4648 -5.1281966351694175 380.655143559197 +4649 0.4649 -5.1661576534851728 378.565222755900 +4650 0.4650 -5.2039098912424429 376.479532389501 +4651 0.4651 -5.2414537711597324 374.398065956299 +4652 0.4652 -5.2787897153056624 372.320816962299 +4653 0.4653 -5.3159181450999071 370.247778922600 +4654 0.4654 -5.3528394813141320 368.178945361902 +4655 0.4655 -5.3895541440729273 366.114309814002 +4656 0.4656 -5.4260625528547521 364.053865822498 +4657 0.4657 -5.4623651264928821 361.997606940098 +4658 0.4658 -5.4984622831763321 359.945526728898 +4659 0.4659 -5.5343544404507865 357.897618760198 +4660 0.4660 -5.5700420152195464 355.853876614998 +4661 0.4661 -5.6055254237444565 353.814293883202 +4662 0.4662 -5.6408050816468265 351.778864164200 +4663 0.4663 -5.6758814039083765 349.747581066800 +4664 0.4664 -5.7107548048721410 347.720438208500 +4665 0.4665 -5.7454256982434115 345.697429216903 +4666 0.4666 -5.7798944970906714 343.678547728301 +4667 0.4667 -5.8141616138464913 341.663787388101 +4668 0.4668 -5.8482274603084567 339.653141851199 +4669 0.4669 -5.8820924476401064 337.646604781803 +4670 0.4670 -5.9157569863718411 335.644169852898 +4671 0.4671 -5.9492214864018411 333.645830747100 +4672 0.4672 -5.9824863569969766 331.651581155602 +4673 0.4673 -6.0155520067937314 329.661414779501 +4674 0.4674 -6.0484188437991211 327.675325328299 +4675 0.4675 -6.0810872753915861 325.693306521003 +4676 0.4676 -6.1135577083219212 323.715352085699 +4677 0.4677 -6.1458305487141711 321.741455759300 +4678 0.4678 -6.1779062020665414 319.771611288099 +4679 0.4679 -6.2097850732523163 317.805812427399 +4680 0.4680 -6.2414675665207566 315.844052941400 +4681 0.4681 -6.2729540854979966 313.886326603402 +4682 0.4682 -6.3042450331879563 311.932627195798 +4683 0.4683 -6.3353408119732357 309.982948509798 +4684 0.4684 -6.3662418236160203 308.037284345901 +4685 0.4685 -6.3969484692589855 306.095628513398 +4686 0.4686 -6.4274611494261755 304.157974830399 +4687 0.4687 -6.4577802640239108 302.224317124299 +4688 0.4688 -6.4879062123416960 300.294649231400 +4689 0.4689 -6.5178393930530811 298.368964996298 +4690 0.4690 -6.5475802042165663 296.447258273398 +4691 0.4691 -6.5771290432765159 294.529522925601 +4692 0.4692 -6.6064863070640207 292.615752824498 +4693 0.4693 -6.6356523917977910 290.705941850902 +4694 0.4694 -6.6646276930850465 288.800083894203 +4695 0.4695 -6.6934126059223962 286.898172852798 +4696 0.4696 -6.7220075246967363 285.000202634001 +4697 0.4697 -6.7504128431861163 283.106167153597 +4698 0.4698 -6.7786289545606309 281.216060336701 +4699 0.4699 -6.8066562513832958 279.329876116597 +4700 0.4700 -6.8344951256109203 277.447608435898 +4701 0.4701 -6.8621459685950006 275.569251245703 +4702 0.4702 -6.8896091710825811 273.694798505901 +4703 0.4703 -6.9168851232171367 271.824244185202 +4704 0.4704 -6.9439742145394421 269.957582260900 +4705 0.4705 -6.9708768339884468 268.094806719200 +4706 0.4706 -6.9975933699021420 266.235911554701 +4707 0.4707 -7.0241242100184271 264.380890771001 +4708 0.4708 -7.0504697414759923 262.529738380301 +4709 0.4709 -7.0766303508151820 260.682448403499 +4710 0.4710 -7.1026064239788420 258.839014869700 +4711 0.4711 -7.1283983463131975 256.999431817403 +4712 0.4712 -7.1540065025687225 255.163693293100 +4713 0.4713 -7.1794312769009876 253.331793352201 +4714 0.4714 -7.2046730528715379 251.503726058800 +4715 0.4715 -7.2297322134487327 249.679485485100 +4716 0.4716 -7.2546091410086078 247.859065712400 +4717 0.4717 -7.2793042173357430 246.042460830300 +4718 0.4718 -7.3038178236241080 244.229664937000 +4719 0.4719 -7.3281503404779231 242.420672139302 +4720 0.4720 -7.3523021479125035 240.615476552302 +4721 0.4721 -7.3762736253551182 238.814072300000 +4722 0.4722 -7.4000651516458387 237.016453514403 +4723 0.4723 -7.4236771050383838 235.222614336497 +4724 0.4724 -7.4471098632009740 233.432548915302 +4725 0.4725 -7.4703638032171638 231.646251408500 +4726 0.4726 -7.4934393015867133 229.863715982498 +4727 0.4727 -7.5163367342264085 228.084936811400 +4728 0.4728 -7.5390564764708987 226.309908078398 +4729 0.4729 -7.5615989030735689 224.538623974997 +4730 0.4730 -7.5839643882073586 222.771078700800 +4731 0.4731 -7.6061533054655941 221.007266463901 +4732 0.4732 -7.6281660278628438 219.247181481100 +4733 0.4733 -7.6500029278357538 217.490817977101 +4734 0.4734 -7.6716643772438635 215.738170185101 +4735 0.4735 -7.6931507473704537 213.989232346699 +4736 0.4736 -7.7144624089233833 212.243998711900 +4737 0.4737 -7.7355997320359133 210.502463538698 +4738 0.4738 -7.7565630862675334 208.764621093698 +4739 0.4739 -7.7773528406048085 207.030465651802 +4740 0.4740 -7.7979693634621832 205.299991495700 +4741 0.4741 -7.8184130226828179 203.573192917000 +4742 0.4742 -7.8386841855394280 201.850064215199 +4743 0.4743 -7.8587832187350930 200.130599698103 +4744 0.4744 -7.8787104884040735 198.414793681502 +4745 0.4745 -7.8984663601126437 196.702640489901 +4746 0.4746 -7.9180511988599189 194.994134455599 +4747 0.4747 -7.9374653690786587 193.289269919202 +4748 0.4748 -7.9567092346360884 191.588041229399 +4749 0.4749 -7.9757831588347230 189.890442743301 +4750 0.4750 -7.9946875044131831 188.196468825903 +4751 0.4751 -8.0134226335469982 186.506113850402 +4752 0.4752 -8.0319889078494242 184.819372198101 +4753 0.4753 -8.0503866883722637 183.136238258699 +4754 0.4754 -8.0686163356066736 181.456706429497 +4755 0.4755 -8.0866782094839635 179.780771116300 +4756 0.4756 -8.1045726693764184 178.108426732801 +4757 0.4757 -8.1223000740980975 176.439667700797 +4758 0.4758 -8.1398607819056465 174.774488450199 +4759 0.4759 -8.1572551504990969 173.112883418802 +4760 0.4760 -8.1744835370226578 171.454847052402 +4761 0.4761 -8.1915462980655427 169.800373805301 +4762 0.4762 -8.2084437896627680 168.149458139200 +4763 0.4763 -8.2251763672959282 166.502094523999 +4764 0.4764 -8.2417443858940125 164.858277437699 +4765 0.4765 -8.2581481998342081 163.218001366200 +4766 0.4766 -8.2743881629426834 161.581260803297 +4767 0.4767 -8.2904646284953980 159.948050251001 +4768 0.4768 -8.3063779492188825 158.318364218700 +4769 0.4769 -8.3221284772910273 156.692197224198 +4770 0.4770 -8.3377165643419016 155.069543793299 +4771 0.4771 -8.3531425614545167 153.450398458997 +4772 0.4772 -8.3684068191656173 151.834755763000 +4773 0.4773 -8.3835096874664874 150.222610254397 +4774 0.4774 -8.3984515158037230 148.613956490299 +4775 0.4775 -8.4132326530800228 147.008789035699 +4776 0.4776 -8.4278534476549734 145.407102463301 +4777 0.4777 -8.4423142473458288 143.808891353801 +4778 0.4778 -8.4566153994282995 142.214150295602 +4779 0.4779 -8.4707572506373197 140.622873884800 +4780 0.4780 -8.4847401471678499 139.035056725801 +4781 0.4781 -8.4985644346756448 137.450693430101 +4782 0.4782 -8.5122304582780153 135.869778617300 +4783 0.4783 -8.5257385625546309 134.292306915000 +4784 0.4784 -8.5390890915482860 132.718272958098 +4785 0.4785 -8.5522823887656667 131.147671389499 +4786 0.4786 -8.5653187971781275 129.580496859699 +4787 0.4787 -8.5781986592224673 128.016744027098 +4788 0.4788 -8.5909223168016968 126.456407557502 +4789 0.4789 -8.6034901112858115 124.899482124800 +4790 0.4790 -8.6159023835125623 123.345962410202 +4791 0.4791 -8.6281594737882124 121.795843102800 +4792 0.4792 -8.6402617218883115 120.249118899201 +4793 0.4793 -8.6522094670584622 118.705784503800 +4794 0.4794 -8.6640030480150827 117.165834628600 +4795 0.4795 -8.6756428029461681 115.629263993100 +4796 0.4796 -8.6871290695120535 114.096067324601 +4797 0.4797 -8.6984621848461732 112.566239357800 +4798 0.4798 -8.7096424855558183 111.039774835101 +4799 0.4799 -8.7206703077229086 109.516668506700 +4800 0.4800 -8.7315459869047327 107.996915129799 +4801 0.4801 -8.7422698581347120 106.480509469800 +4802 0.4802 -8.7528422559231522 104.967446299001 +4803 0.4803 -8.7632635142580018 103.457720398001 +4804 0.4804 -8.7735339666056120 101.951326554201 +4805 0.4805 -8.7836539459114675 100.448259562900 +4806 0.4806 -8.7936237846009533 98.948514226800 +4807 0.4807 -8.8034438145800991 97.452085356101 +4808 0.4808 -8.8131143672363343 95.958967768600 +4809 0.4809 -8.8226357734392344 94.469156289400 +4810 0.4810 -8.8320083635412541 92.982645750999 +4811 0.4811 -8.8412324673784788 91.499430993499 +4812 0.4812 -8.8503084142713835 90.019506864599 +4813 0.4813 -8.8592365330255589 88.542868218899 +4814 0.4814 -8.8680171519324489 87.069509918900 +4815 0.4815 -8.8766505987701088 85.599426834300 +4816 0.4816 -8.8851372008039391 84.132613842299 +4817 0.4817 -8.8934772847874193 82.669065827300 +4818 0.4818 -8.9016711769628447 81.208777681199 +4819 0.4819 -8.9097192030620693 79.751744303299 +4820 0.4820 -8.9176216883072392 78.297960600099 +4821 0.4821 -8.9253789574115245 76.847421485600 +4822 0.4822 -8.9329913345798495 75.400121880899 +4823 0.4823 -8.9404591435096297 73.956056714700 +4824 0.4824 -8.9477827073915090 72.515220922900 +4825 0.4825 -8.9549623489100796 71.077609448501 +4826 0.4826 -8.9619983902446148 69.643217242199 +4827 0.4827 -8.9688911530697943 68.212039261400 +4828 0.4828 -8.9756409585564239 66.784070471200 +4829 0.4829 -8.9822481273721788 65.359305843900 +4830 0.4830 -8.9887129796823189 63.937740358901 +4831 0.4831 -8.9950358351504143 62.519369003001 +4832 0.4832 -9.0012170129390690 61.104186770101 +4833 0.4833 -9.0072568317106345 59.692188661200 +4834 0.4834 -9.0131556096279297 58.283369684701 +4835 0.4835 -9.0189136643549705 56.877724856100 +4836 0.4836 -9.0245313130576861 55.475249198200 +4837 0.4837 -9.0300088724046308 54.075937740699 +4838 0.4838 -9.0353466585677058 52.679785520801 +4839 0.4839 -9.0405449872228711 51.286787582501 +4840 0.4840 -9.0456041735508510 49.896938977101 +4841 0.4841 -9.0505245322378602 48.510234763100 +4842 0.4842 -9.0553063774763149 47.126670006000 +4843 0.4843 -9.0599500229655447 45.746239778600 +4844 0.4844 -9.0644557819124891 44.368939160300 +4845 0.4845 -9.0688239670324098 42.994763238101 +4846 0.4846 -9.0730548905496100 41.623707105900 +4847 0.4847 -9.0771488641981399 40.255765864700 +4848 0.4848 -9.0811061992224893 38.890934622301 +4849 0.4849 -9.0849272063782998 37.529208493901 +4850 0.4850 -9.0886121959330755 36.170582601600 +4851 0.4851 -9.0921614776668704 34.815052074300 +4852 0.4852 -9.0955753608730063 33.462612048401 +4853 0.4853 -9.0988541543587669 32.113257666801 +4854 0.4854 -9.1019981664460872 30.766984079599 +4855 0.4855 -9.1050077049722677 29.423786443998 +4856 0.4856 -9.1078830772906620 28.083659923899 +4857 0.4857 -9.1106245902713727 26.746599690299 +4858 0.4858 -9.1132325503019533 25.412600921300 +4859 0.4859 -9.1157072632880940 24.081658801500 +4860 0.4860 -9.1180490346543284 22.753768523200 +4861 0.4861 -9.1202581693447229 21.428925284701 +4862 0.4862 -9.1223349718235482 20.107124291801 +4863 0.4863 -9.1242797460759881 18.788360757000 +4864 0.4864 -9.1260927956088285 17.472629899799 +4865 0.4865 -9.1277744234511431 16.159926946500 +4866 0.4866 -9.1293249321549830 14.850247130300 +4867 0.4867 -9.1307446237960530 13.543585691101 +4868 0.4868 -9.1320337999744083 12.239937876000 +4869 0.4869 -9.1331927618151330 10.939298938501 +4870 0.4870 -9.1342218099690236 9.641664139299 +4871 0.4871 -9.1351212446132735 8.347028745700 +4872 0.4872 -9.1358913654521476 7.055388031800 +4873 0.4873 -9.1365324717176772 5.766737278800 +4874 0.4874 -9.1370448621703275 4.481071774200 +4875 0.4875 -9.1374288350996729 3.198386812699 +4876 0.4876 -9.1376846883250931 1.918677695699 +4877 0.4877 -9.1378127191964236 0.641939730900 +4878 0.4878 -9.1378132245946428 -0.631831766499 +4879 0.4879 -9.1376865009325581 -1.902641475199 +4880 0.4880 -9.1374328441554589 -3.170494066799 +4881 0.4881 -9.1370525497418047 -4.435394206299 +4882 0.4882 -9.1365459127038946 -5.697346551900 +4883 0.4883 -9.1359132275885244 -6.956355755501 +4884 0.4884 -9.1351547884776600 -8.212426461800 +4885 0.4885 -9.1342708889891195 -9.465563308999 +4886 0.4886 -9.1332618222772339 -10.715770928700 +4887 0.4887 -9.1321278810335080 -11.963053945801 +4888 0.4888 -9.1308693574872937 -13.207416978499 +4889 0.4889 -9.1294865434064434 -14.448864638500 +4890 0.4890 -9.1279797300979784 -15.687401530800 +4891 0.4891 -9.1263492084087634 -16.923032253500 +4892 0.4892 -9.1245952687261589 -18.155761398599 +4893 0.4893 -9.1227182009786745 -19.385593551100 +4894 0.4894 -9.1207182946366387 -20.612533289599 +4895 0.4895 -9.1185958387128530 -21.836585186100 +4896 0.4896 -9.1163511217632482 -23.057753806001 +4897 0.4897 -9.1139844318875483 -24.276043708000 +4898 0.4898 -9.1114960567299281 -25.491459444400 +4899 0.4899 -9.1088862834796576 -26.704005561000 +4900 0.4900 -9.1061553988717581 -27.913686596999 +4901 0.4901 -9.1033036891876584 -29.120507085001 +4902 0.4902 -9.1003314402558484 -30.324471551201 +4903 0.4903 -9.0972389374525182 -31.525584515401 +4904 0.4904 -9.0940264657022283 -32.723850490400 +4905 0.4905 -9.0906943094785486 -33.919273983200 +4906 0.4906 -9.0872427528046984 -35.111859493800 +4907 0.4907 -9.0836720792542138 -36.301611515901 +4908 0.4908 -9.0799825719515734 -37.488534536900 +4909 0.4909 -9.0761745135728589 -38.672633037400 +4910 0.4910 -9.0722481863463891 -39.853911492000 +4911 0.4911 -9.0682038720533598 -41.032374368600 +4912 0.4912 -9.0640418520285042 -42.208026128501 +4913 0.4913 -9.0597624071607239 -43.380871227100 +4914 0.4914 -9.0553658178937244 -44.550914112899 +4915 0.4915 -9.0508523642266638 -45.718159228300 +4916 0.4916 -9.0462223257147887 -46.882611009200 +4917 0.4917 -9.0414759814700734 -48.044273885102 +4918 0.4918 -9.0366136101618526 -49.203152279300 +4919 0.4919 -9.0316354900174627 -50.359250608501 +4920 0.4920 -9.0265418988228685 -51.512573283400 +4921 0.4921 -9.0213331139233084 -52.663124707798 +4922 0.4922 -9.0160094122239283 -53.810909279799 +4923 0.4923 -9.0105710701903980 -54.955931390799 +4924 0.4924 -9.0050183638495582 -56.098195425999 +4925 0.4925 -8.9993515687900381 -57.237705764399 +4926 0.4926 -8.9935709601628986 -58.374466778399 +4927 0.4927 -8.9876768126822579 -59.508482834399 +4928 0.4928 -8.9816694006259183 -60.639758292398 +4929 0.4929 -8.9755489978359932 -61.768297506100 +4930 0.4930 -8.9693158777195237 -62.894104823299 +4931 0.4931 -8.9629703132491034 -64.017184585100 +4932 0.4932 -8.9565125769635241 -65.137541126500 +4933 0.4933 -8.9499429409683842 -66.255178776300 +4934 0.4934 -8.9432616769367037 -67.370101857299 +4935 0.4935 -8.9364690561095532 -68.482314685700 +4936 0.4936 -8.9295653492966878 -69.591821571599 +4937 0.4937 -8.9225508268771527 -70.698626819099 +4938 0.4938 -8.9154257587998931 -71.802734726100 +4939 0.4939 -8.9081904145843875 -72.904149584001 +4940 0.4940 -8.9008450633212668 -74.002875678401 +4941 0.4941 -8.8933899736729067 -75.098917288800 +4942 0.4942 -8.8858254138740662 -76.192278688000 +4943 0.4943 -8.8781516517325016 -77.282964143300 +4944 0.4944 -8.8703689546295621 -78.370977915500 +4945 0.4945 -8.8624775895208163 -79.456324259399 +4946 0.4946 -8.8544778229366621 -80.539007423700 +4947 0.4947 -8.8463699209829425 -81.619031650700 +4948 0.4948 -8.8381541493415430 -82.696401177300 +4949 0.4949 -8.8298307732709933 -83.771120233700 +4950 0.4950 -8.8214000576071037 -84.843193044100 +4951 0.4951 -8.8128622667635543 -85.912623826900 +4952 0.4952 -8.8042176647325050 -86.979416794100 +4953 0.4953 -8.7954665150852005 -88.043576152000 +4954 0.4954 -8.7866090809725605 -89.105106100800 +4955 0.4955 -8.7776456251258104 -90.164010834200 +4956 0.4956 -8.7685764098570704 -91.220294540599 +4957 0.4957 -8.7594016970599498 -92.273961401801 +4958 0.4958 -8.7501217482101605 -93.325015594000 +4959 0.4959 -8.7407368243661061 -94.373461287099 +4960 0.4960 -8.7312471861694956 -95.419302645101 +4961 0.4961 -8.7216530938459300 -96.462543826199 +4962 0.4962 -8.7119548072054993 -97.503188982400 +4963 0.4963 -8.7021525856433843 -98.541242259900 +4964 0.4964 -8.6922466881404485 -99.576707798800 +4965 0.4965 -8.6822373732638436 -100.609589733300 +4966 0.4966 -8.6721248991675939 -101.639892191701 +4967 0.4967 -8.6619095235931880 -102.667619296399 +4968 0.4968 -8.6515915038701774 -103.692775163800 +4969 0.4969 -8.6411710969167572 -104.715363904599 +4970 0.4970 -8.6306485592403721 -105.735389623100 +4971 0.4971 -8.6200241469383023 -106.752856418299 +4972 0.4972 -8.6092981156982376 -107.767768383001 +4973 0.4973 -8.5984707207988773 -108.780129604200 +4974 0.4974 -8.5875422171105171 -109.789944163000 +4975 0.4975 -8.5765128590956419 -110.797216134501 +4976 0.4976 -8.5653829008095066 -111.801949588200 +4977 0.4977 -8.5541525959007068 -112.804148587800 +4978 0.4978 -8.5428221976117769 -113.803817190799 +4979 0.4979 -8.5313919587797766 -114.800959449200 +4980 0.4980 -8.5198621318368666 -115.795579408999 +4981 0.4981 -8.5082329688108871 -116.787681110600 +4982 0.4982 -8.4965047213259375 -117.777268588401 +4983 0.4983 -8.4846776406029623 -118.764345871101 +4984 0.4984 -8.4727519774603319 -119.748916981502 +4985 0.4985 -8.4607279823144115 -120.730985936900 +4986 0.4986 -8.4486059051801412 -121.710556748500 +4987 0.4987 -8.4363859956716158 -122.687633422000 +4988 0.4988 -8.4240685030026601 -123.662219957099 +4989 0.4989 -8.4116536759874059 -124.634320348001 +4990 0.4990 -8.3991417630408467 -125.603938583199 +4991 0.4991 -8.3865330121794326 -126.571078645100 +4992 0.4992 -8.3738276710216422 -127.535744510700 +4993 0.4993 -8.3610259867885421 -128.497940151301 +4994 0.4994 -8.3481282063043629 -129.457669532299 +4995 0.4995 -8.3351345759970634 -130.414936613701 +4996 0.4996 -8.3220453418989031 -131.369745349501 +4997 0.4997 -8.3088607496470175 -132.322099688199 +4998 0.4998 -8.2955810444839724 -133.272003572700 +4999 0.4999 -8.2822064712583323 -134.219460940099 +5000 0.5000 -8.2687372744252468 -135.164475721600 +5001 0.5001 -8.2551736980469919 -136.107051843501 +5002 0.5002 -8.2415159857935318 -137.047193225701 +5003 0.5003 -8.2277643809431016 -137.984903782899 +5004 0.5004 -8.2139191263827520 -138.920187424101 +5005 0.5005 -8.1999804646089220 -139.853048052501 +5006 0.5006 -8.1859486377279964 -140.783489566000 +5007 0.5007 -8.1718238874568616 -141.711515856699 +5008 0.5008 -8.1576064551234673 -142.637130811201 +5009 0.5009 -8.1432965816673821 -143.560338310501 +5010 0.5010 -8.1288945076403518 -144.481142230099 +5011 0.5011 -8.1144004732068620 -145.399546439699 +5012 0.5012 -8.0998147181446924 -146.315554803699 +5013 0.5013 -8.0851374818454627 -147.229171180899 +5014 0.5014 -8.0703690033152036 -148.140399424299 +5015 0.5015 -8.0555095211748942 -149.049243381900 +5016 0.5016 -8.0405592736610139 -149.955706895700 +5017 0.5017 -8.0255184986261092 -150.859793802400 +5018 0.5018 -8.0103874335393286 -151.761507933201 +5019 0.5019 -7.9951663154869834 -152.660853113699 +5020 0.5020 -7.9798553811730883 -153.557833164199 +5021 0.5021 -7.9644548669199233 -154.452451899098 +5022 0.5022 -7.9489650086685781 -155.344713127801 +5023 0.5023 -7.9333860419794879 -156.234620654001 +5024 0.5024 -7.9177182020329875 -157.122178276000 +5025 0.5025 -7.9019617236298521 -158.007389786701 +5026 0.5026 -7.8861168411918472 -158.890258973401 +5027 0.5027 -7.8701837887622768 -159.770789618000 +5028 0.5028 -7.8541628000065220 -160.648985497099 +5029 0.5029 -7.8380541082125772 -161.524850381800 +5030 0.5030 -7.8218579462915923 -162.398388037900 +5031 0.5031 -7.8055745467784226 -163.269602225500 +5032 0.5032 -7.7892041418321627 -164.138496699701 +5033 0.5033 -7.7727469632366830 -165.005075209900 +5034 0.5034 -7.7562032424011882 -165.869341500000 +5035 0.5035 -7.7395732103607235 -166.731299309300 +5036 0.5036 -7.7228570977767284 -167.590952370601 +5037 0.5037 -7.7060551349375785 -168.448304412401 +5038 0.5038 -7.6891675517591036 -169.303359157100 +5039 0.5039 -7.6721945777851337 -170.156120322299 +5040 0.5040 -7.6551364421880335 -171.006591619700 +5041 0.5041 -7.6379933737692385 -171.854776756199 +5042 0.5042 -7.6207656009597837 -172.700679432899 +5043 0.5043 -7.6034533518208285 -173.544303346200 +5044 0.5044 -7.5860568540441884 -174.385652186600 +5045 0.5045 -7.5685763349528736 -175.224729639700 +5046 0.5046 -7.5510120215016086 -176.061539385601 +5047 0.5047 -7.5333641402773681 -176.896085099201 +5048 0.5048 -7.5156329174999081 -177.728370449999 +5049 0.5049 -7.4978185790222778 -178.558399102601 +5050 0.5050 -7.4799213503313577 -179.386174715801 +5051 0.5051 -7.4619414565483924 -180.211700943501 +5052 0.5052 -7.4438791224294922 -181.034981434499 +5053 0.5053 -7.4257345723661672 -181.856019831999 +5054 0.5054 -7.4075080303858618 -182.674819774100 +5055 0.5055 -7.3891997201524715 -183.491384893701 +5056 0.5056 -7.3708098649668568 -184.305718818599 +5057 0.5057 -7.3523386877673671 -185.117825171201 +5058 0.5058 -7.3337864111303617 -185.927707568901 +5059 0.5059 -7.3151532572707367 -186.735369623600 +5060 0.5060 -7.2964394480424364 -187.540814942400 +5061 0.5061 -7.2776452049389615 -188.344047127101 +5062 0.5062 -7.2587707490939017 -189.145069774098 +5063 0.5063 -7.2398163012814472 -189.943886474999 +5064 0.5064 -7.2207820819169024 -190.740500815898 +5065 0.5065 -7.2016683110572126 -191.534916377899 +5066 0.5066 -7.1824752084014625 -192.327136737100 +5067 0.5067 -7.1632029932913879 -193.117165464400 +5068 0.5068 -7.1438518847119026 -193.905006125300 +5069 0.5069 -7.1244221012916027 -194.690662280700 +5070 0.5070 -7.1049138613032774 -195.474137485800 +5071 0.5071 -7.0853273826644276 -196.255435291199 +5072 0.5072 -7.0656628829377572 -197.034559242200 +5073 0.5073 -7.0459205793317023 -197.811512878900 +5074 0.5074 -7.0261006887009376 -198.586299736400 +5075 0.5075 -7.0062034275468630 -199.358923345100 +5076 0.5076 -6.9862290120181276 -200.129387229599 +5077 0.5077 -6.9661776579111478 -200.897694910000 +5078 0.5078 -6.9460495806705875 -201.663849901199 +5079 0.5079 -6.9258449953898724 -202.427855713100 +5080 0.5080 -6.9055641168116972 -203.189715850400 +5081 0.5081 -6.8852071593285222 -203.949433813101 +5082 0.5082 -6.8647743369830874 -204.707013095600 +5083 0.5083 -6.8442658634689071 -205.462457187999 +5084 0.5084 -6.8236819521307668 -206.215769574799 +5085 0.5085 -6.8030228159652317 -206.966953735900 +5086 0.5086 -6.7822886676211418 -207.716013145899 +5087 0.5087 -6.7614797194001115 -208.462951274701 +5088 0.5088 -6.7405961832570211 -209.207771587100 +5089 0.5089 -6.7196382708005258 -209.950477542801 +5090 0.5090 -6.6986061932935561 -210.691072596601 +5091 0.5091 -6.6775001616537963 -211.429560198600 +5092 0.5092 -6.6563203864541913 -212.165943793501 +5093 0.5093 -6.6350670779234413 -212.900226821501 +5094 0.5094 -6.6137404459464912 -213.632412717499 +5095 0.5095 -6.5923407000650309 -214.362504911700 +5096 0.5096 -6.5708680494779808 -215.090506829300 +5097 0.5097 -6.5493227030419812 -215.816421890700 +5098 0.5098 -6.5277048692718909 -216.540253511101 +5099 0.5099 -6.5060147563412762 -217.262005101200 +5100 0.5100 -6.4842525720828963 -217.981680066399 +5101 0.5101 -6.4624185239892062 -218.699281807400 +5102 0.5102 -6.4405128192128265 -219.414813720199 +5103 0.5103 -6.4185356645670364 -220.128279195600 +5104 0.5104 -6.3964872665262664 -220.839681619800 +5105 0.5105 -6.3743678312265768 -221.549024374001 +5106 0.5106 -6.3521775644661469 -222.256310834600 +5107 0.5107 -6.3299166717057673 -222.961544373000 +5108 0.5108 -6.3075853580693177 -223.664728356000 +5109 0.5109 -6.2851838283442429 -224.365866145499 +5110 0.5110 -6.2627122869820484 -225.064961098400 +5111 0.5111 -6.2401709380987738 -225.762016567100 +5112 0.5112 -6.2175599854754786 -226.457035898798 +5113 0.5113 -6.1948796325587185 -227.150022436401 +5114 0.5114 -6.1721300824610283 -227.840979517399 +5115 0.5115 -6.1493115379614087 -228.529910474999 +5116 0.5116 -6.1264242015057890 -229.216818637400 +5117 0.5117 -6.1034682752075140 -229.901707328099 +5118 0.5118 -6.0804439608478242 -230.584579865701 +5119 0.5119 -6.0573514598763296 -231.265439564200 +5120 0.5120 -6.0341909734114845 -231.944289732701 +5121 0.5121 -6.0109627022410592 -232.621133675801 +5122 0.5122 -5.9876668468226146 -233.295974693099 +5123 0.5123 -5.9643036072839895 -233.968816079399 +5124 0.5124 -5.9408731834237596 -234.639661125200 +5125 0.5125 -5.9173757747117142 -235.308513115700 +5126 0.5126 -5.8938115802893343 -235.975375331900 +5127 0.5127 -5.8701807989702495 -236.640251049801 +5128 0.5128 -5.8464836292407192 -237.303143540799 +5129 0.5129 -5.8227202692601043 -237.964056071500 +5130 0.5130 -5.7988909168613292 -238.622991904002 +5131 0.5131 -5.7749957695513494 -239.279954295600 +5132 0.5132 -5.7510350245116291 -239.934946498801 +5133 0.5133 -5.7270088785986042 -240.587971761701 +5134 0.5134 -5.7029175283441393 -241.239033327600 +5135 0.5135 -5.6787611699560046 -241.888134435099 +5136 0.5136 -5.6545399993183398 -242.535278318199 +5137 0.5137 -5.6302542119921144 -243.180468206301 +5138 0.5138 -5.6059040032155947 -243.823707324100 +5139 0.5139 -5.5814895679048000 -244.464998891801 +5140 0.5140 -5.5570111006539751 -245.104346124699 +5141 0.5141 -5.5324687957360554 -245.741752233700 +5142 0.5142 -5.5078628471031106 -246.377220425200 +5143 0.5143 -5.4831934483868103 -247.010753900800 +5144 0.5144 -5.4584607928989000 -247.642355857401 +5145 0.5145 -5.4336650736316496 -248.272029487600 +5146 0.5146 -5.4088064832583100 -248.899777979199 +5147 0.5147 -5.3838852141335654 -249.525604515700 +5148 0.5148 -5.3589014582939951 -250.149512275699 +5149 0.5149 -5.3338554074585405 -250.771504433400 +5150 0.5150 -5.3087472530289554 -251.391584158300 +5151 0.5151 -5.2835771860902554 -252.009754615699 +5152 0.5152 -5.2583453974111753 -252.626018965901 +5153 0.5153 -5.2330520774446203 -253.240380365200 +5154 0.5154 -5.2076974163281307 -253.852841964601 +5155 0.5155 -5.1822816038843253 -254.463406911500 +5156 0.5156 -5.1568048296213451 -255.072078348099 +5157 0.5157 -5.1312672827333250 -255.678859412301 +5158 0.5158 -5.1056691521008348 -256.283753237500 +5159 0.5159 -5.0800106262913296 -256.886762952599 +5160 0.5160 -5.0542918935595900 -257.487891682200 +5161 0.5161 -5.0285131418481797 -258.087142546001 +5162 0.5162 -5.0026745587878994 -258.684518659600 +5163 0.5163 -4.9767763316982192 -259.280023133999 +5164 0.5164 -4.9508186475877389 -259.873659075600 +5165 0.5165 -4.9248016931546390 -260.465429586400 +5166 0.5166 -4.8987256547871194 -261.055337763999 +5167 0.5167 -4.8725907185638295 -261.643386701800 +5168 0.5168 -4.8463970702543246 -262.229579488299 +5169 0.5169 -4.8201448953195145 -262.813919207902 +5170 0.5170 -4.7938343789120994 -263.396408940400 +5171 0.5171 -4.7674657058770293 -263.977051761000 +5172 0.5172 -4.7410390607519242 -264.555850741101 +5173 0.5173 -4.7145546277675141 -265.132808947099 +5174 0.5174 -4.6880125908480990 -265.707929441200 +5175 0.5175 -4.6614131336119788 -266.281215281200 +5176 0.5176 -4.6347564393718885 -266.852669520600 +5177 0.5177 -4.6080426911354433 -267.422295208300 +5178 0.5178 -4.5812720716055733 -267.990095389101 +5179 0.5179 -4.5544447631809630 -268.556073103100 +5180 0.5180 -4.5275609479564878 -269.120231386400 +5181 0.5181 -4.5006208077236476 -269.682573270400 +5182 0.5182 -4.4736245239710080 -270.243101782400 +5183 0.5183 -4.4465722778846279 -270.801819945202 +5184 0.5184 -4.4194642503484980 -271.358730777400 +5185 0.5185 -4.3923006219449832 -271.913837292899 +5186 0.5186 -4.3650815729552432 -272.467142501899 +5187 0.5187 -4.3378072833596537 -273.018649409900 +5188 0.5188 -4.3104779328382641 -273.568361017900 +5189 0.5189 -4.2830937007712286 -274.116280322800 +5190 0.5190 -4.2556547662392132 -274.662410317500 +5191 0.5191 -4.2281613080238429 -275.206753989900 +5192 0.5192 -4.2006135046081283 -275.749314324399 +5193 0.5193 -4.1730115341768883 -276.290094300401 +5194 0.5194 -4.1453555746171880 -276.829096893602 +5195 0.5195 -4.1176458035187631 -277.366325074900 +5196 0.5196 -4.0898823981744430 -277.901781811501 +5197 0.5197 -4.0620655355805830 -278.435470065700 +5198 0.5198 -4.0341953924374883 -278.967392796199 +5199 0.5199 -4.0062721451498282 -279.497552957000 +5200 0.5200 -3.9782959698270783 -280.025953498000 +5201 0.5201 -3.9502670422839286 -280.552597365000 +5202 0.5202 -3.9221855380407233 -281.077487499100 +5203 0.5203 -3.8940516323238783 -281.600626837801 +5204 0.5204 -3.8658655000662883 -282.122018313999 +5205 0.5205 -3.8376273159077683 -282.641664856399 +5206 0.5206 -3.8093372541954684 -283.159569389600 +5207 0.5207 -3.7809954889842885 -283.675734834000 +5208 0.5208 -3.7526021940373036 -284.190164105699 +5209 0.5209 -3.7241575428261786 -284.702860116799 +5210 0.5210 -3.6956617085315937 -285.213825774901 +5211 0.5211 -3.6671148640436586 -285.723063983800 +5212 0.5212 -3.6385171819623285 -286.230577642800 +5213 0.5213 -3.6098688345978287 -286.736369647200 +5214 0.5214 -3.5811699939710535 -287.240442888300 +5215 0.5215 -3.5524208318139987 -287.742800252799 +5216 0.5216 -3.5236215195701637 -288.243444623900 +5217 0.5217 -3.4947722283949787 -288.742378879799 +5218 0.5218 -3.4658731291562286 -289.239605895200 +5219 0.5219 -3.4369243924344337 -289.735128540700 +5220 0.5220 -3.4079261885232786 -290.228949682401 +5221 0.5221 -3.3788786874300287 -290.721072182600 +5222 0.5222 -3.3497820588759386 -291.211498899200 +5223 0.5223 -3.3206364722966635 -291.700232686300 +5224 0.5224 -3.2914420968426685 -292.187276393599 +5225 0.5225 -3.2621991013796383 -292.672632867001 +5226 0.5226 -3.2329076544888884 -293.156304948001 +5227 0.5227 -3.2035679244677682 -293.638295474400 +5228 0.5228 -3.1741800793300783 -294.118607279399 +5229 0.5229 -3.1447442868064783 -294.597243192598 +5230 0.5230 -3.1152607143448736 -295.074206039500 +5231 0.5231 -3.0857295291108437 -295.549498641099 +5232 0.5232 -3.0561508979880387 -296.023123814999 +5233 0.5233 -3.0265249875785889 -296.495084373999 +5234 0.5234 -2.9968519642035139 -296.965383127499 +5235 0.5235 -2.9671319939031089 -297.434022880601 +5236 0.5236 -2.9373652424373589 -297.901006434400 +5237 0.5237 -2.9075518752863441 -298.366336585899 +5238 0.5238 -2.8776920576506440 -298.830016128100 +5239 0.5239 -2.8477859544517341 -299.292047850100 +5240 0.5240 -2.8178337303323842 -299.752434536900 +5241 0.5241 -2.7878355496570593 -300.211178969599 +5242 0.5242 -2.7577915765123295 -300.668283924999 +5243 0.5243 -2.7277019747072644 -301.123752176300 +5244 0.5244 -2.6975669077738296 -301.577586492400 +5245 0.5245 -2.6673865389672846 -302.029789638500 +5246 0.5246 -2.6371610312665745 -302.480364375700 +5247 0.5247 -2.6068905473747446 -302.929313460902 +5248 0.5248 -2.5765752497193346 -303.376639647300 +5249 0.5249 -2.5462153004527543 -303.822345684301 +5250 0.5250 -2.5158108614526893 -304.266434317000 +5251 0.5251 -2.4853620943225092 -304.708908286600 +5252 0.5252 -2.4548691603916493 -305.149770330599 +5253 0.5253 -2.4243322207160043 -305.589023182300 +5254 0.5254 -2.3937514360783294 -306.026669571200 +5255 0.5255 -2.3631269669886295 -306.462712222801 +5256 0.5256 -2.3324589736845445 -306.897153858899 +5257 0.5257 -2.3017476161317445 -307.329997197099 +5258 0.5258 -2.2709930540243244 -307.761244951300 +5259 0.5259 -2.2401954467851946 -308.190899831299 +5260 0.5260 -2.2093549535664647 -308.618964543299 +5261 0.5261 -2.1784717332498396 -309.045441789200 +5262 0.5262 -2.1475459444470144 -309.470334267300 +5263 0.5263 -2.1165777455000496 -309.893644672000 +5264 0.5264 -2.0855672944817596 -310.315375693801 +5265 0.5265 -2.0545147491961093 -310.735530019201 +5266 0.5266 -2.0234202671785941 -311.154110331099 +5267 0.5267 -1.9922840056966191 -311.571119308401 +5268 0.5268 -1.9611061217499040 -311.986559625901 +5269 0.5269 -1.9298867720708539 -312.400433955099 +5270 0.5270 -1.8986261131249440 -312.812744963101 +5271 0.5271 -1.8673243011111138 -313.223495313501 +5272 0.5272 -1.8359814919621438 -313.632687665900 +5273 0.5273 -1.8045978413450339 -314.040324676300 +5274 0.5274 -1.7731735046613839 -314.446408996699 +5275 0.5275 -1.7417086370477939 -314.850943275100 +5276 0.5276 -1.7102033933762288 -315.253930156199 +5277 0.5277 -1.6786579282543990 -315.655372280400 +5278 0.5278 -1.6470723960261489 -316.055272284601 +5279 0.5279 -1.6154469507718339 -316.453632801700 +5280 0.5280 -1.5837817463086938 -316.850456461099 +5281 0.5281 -1.5520769361912339 -317.245745888100 +5282 0.5282 -1.5203326737116138 -317.639503704300 +5283 0.5283 -1.4885491119000138 -318.031732527701 +5284 0.5284 -1.4567264035250087 -318.422434972401 +5285 0.5285 -1.4248647010939488 -318.811613648799 +5286 0.5286 -1.3929641568533440 -319.199271163299 +5287 0.5287 -1.3610249227892290 -319.585410119000 +5288 0.5288 -1.3290471506275390 -319.970033114800 +5289 0.5289 -1.2970309918344940 -320.353142746100 +5290 0.5290 -1.2649765976169540 -320.734741604701 +5291 0.5291 -1.2328841189228039 -321.114832278301 +5292 0.5292 -1.2007537064413289 -321.493417351199 +5293 0.5293 -1.1685855106035841 -321.870499403700 +5294 0.5294 -1.1363796815827640 -322.246081012701 +5295 0.5295 -1.1041363692945740 -322.620164751099 +5296 0.5296 -1.0718557233976040 -322.992753188300 +5297 0.5297 -1.0395378932936941 -323.363848889900 +5298 0.5298 -1.0071830281283141 -323.733454417699 +5299 0.5299 -0.9747912767909140 -324.101572330301 +5300 0.5300 -0.9423627879153090 -324.468205181800 +5301 0.5301 -0.9098977098800440 -324.833355523499 +5302 0.5302 -0.8773961908087541 -325.197025902300 +5303 0.5303 -0.8448583785705440 -325.559218861901 +5304 0.5304 -0.8122844207803440 -325.919936942100 +5305 0.5305 -0.7796744647992740 -326.279182679300 +5306 0.5306 -0.7470286577350190 -326.636958605801 +5307 0.5307 -0.7143471464421940 -326.993267250700 +5308 0.5308 -0.6816300775226940 -327.348111139299 +5309 0.5309 -0.6488775973260741 -327.701492793100 +5310 0.5310 -0.6160898519499091 -328.053414730201 +5311 0.5311 -0.5832669872401489 -328.403879465001 +5312 0.5312 -0.5504091487914838 -328.752889508300 +5313 0.5313 -0.5175164819477088 -329.100447367200 +5314 0.5314 -0.4845891318020939 -329.446555545099 +5315 0.5315 -0.4516272431977290 -329.791216542200 +5316 0.5316 -0.4186309607278890 -330.134432854600 +5317 0.5317 -0.3856004287363940 -330.476206975300 +5318 0.5318 -0.3525357913179740 -330.816541393100 +5319 0.5319 -0.3194371923186290 -331.155438593800 +5320 0.5320 -0.2863047753359740 -331.492901059300 +5321 0.5321 -0.2531386837196040 -331.828931268099 +5322 0.5322 -0.2199390605714541 -332.163531694900 +5323 0.5323 -0.1867060487461542 -332.496704811099 +5324 0.5324 -0.1534397908513891 -332.828453084201 +5325 0.5325 -0.1201404292482541 -333.158778978499 +5326 0.5326 -0.0868081060515992 -333.487684954600 +5327 0.5327 -0.0534429631303942 -333.815173469500 +5328 0.5328 -0.0200451421080843 -334.141246976698 +5329 0.5329 0.0133852156370656 -334.465907926300 +5330 0.5330 0.0468479689716156 -334.789158764699 +5331 0.5331 0.0803429770065855 -335.111001934700 +5332 0.5332 0.1138700990971105 -335.431439875800 +5333 0.5333 0.1474291948420955 -335.750475023899 +5334 0.5334 0.1810201240838604 -336.068109811400 +5335 0.5335 0.2146427469077805 -336.384346667001 +5336 0.5336 0.2482969236419405 -336.699188016200 +5337 0.5337 0.2819825148567905 -337.012636280799 +5338 0.5338 0.3156993813648005 -337.324693879400 +5339 0.5339 0.3494473842201055 -337.635363226700 +5340 0.5340 0.3832263847181405 -337.944646734000 +5341 0.5341 0.4170362443953155 -338.252546809501 +5342 0.5342 0.4508768250286705 -338.559065857600 +5343 0.5343 0.4847479886355056 -338.864206279100 +5344 0.5344 0.5186495974730406 -339.167970471601 +5345 0.5345 0.5525815140380906 -339.470360829400 +5346 0.5346 0.5865436010667107 -339.771379743001 +5347 0.5347 0.6205357215338407 -340.071029599601 +5348 0.5348 0.6545577386529559 -340.369312782701 +5349 0.5349 0.6886095158757409 -340.666231673000 +5350 0.5350 0.7226909168917460 -340.961788647101 +5351 0.5351 0.7568018056280261 -341.255986078500 +5352 0.5352 0.7909420462488110 -341.548826337199 +5353 0.5353 0.8251115031551660 -341.840311789900 +5354 0.5354 0.8593100409846460 -342.130444799701 +5355 0.5355 0.8935375246109460 -342.419227726299 +5356 0.5356 0.9277938191435711 -342.706662926201 +5357 0.5357 0.9620787899274962 -342.992752752301 +5358 0.5358 0.9963923025428212 -343.277499554200 +5359 0.5359 1.0307342228044412 -343.560905678200 +5360 0.5360 1.0651044167617012 -343.842973466999 +5361 0.5361 1.0995027506980510 -344.123705259999 +5362 0.5362 1.1339290911307109 -344.403103393201 +5363 0.5363 1.1683833048103411 -344.681170199401 +5364 0.5364 1.2028652587207063 -344.957908007900 +5365 0.5365 1.2373748200783363 -345.233319144700 +5366 0.5366 1.2719118563321763 -345.507405932100 +5367 0.5367 1.3064762351632662 -345.780170689699 +5368 0.5368 1.3410678244844161 -346.051615733300 +5369 0.5369 1.3756864924398462 -346.321743375300 +5370 0.5370 1.4103321074048663 -346.590555925100 +5371 0.5371 1.4450045379855514 -346.858055688601 +5372 0.5372 1.4797036530183865 -347.124244968099 +5373 0.5373 1.5144293215699414 -347.389126062999 +5374 0.5374 1.5491814129365564 -347.652701269300 +5375 0.5375 1.5839597966440013 -347.914972879600 +5376 0.5376 1.6187643424471314 -348.175943183001 +5377 0.5377 1.6535949203295566 -348.435614465501 +5378 0.5378 1.6884514005033366 -348.693989010100 +5379 0.5379 1.7233336534086265 -348.951069095699 +5380 0.5380 1.7582415497133566 -349.206856998901 +5381 0.5381 1.7931749603129066 -349.461354992100 +5382 0.5382 1.8281337563297666 -349.714565345101 +5383 0.5383 1.8631178091132217 -349.966490323999 +5384 0.5384 1.8981269902390117 -350.217132191801 +5385 0.5385 1.9331611715090167 -350.466493208300 +5386 0.5386 1.9682202249509266 -350.714575629900 +5387 0.5387 2.0033040228179115 -350.961381709800 +5388 0.5388 2.0384124375882915 -351.206913697801 +5389 0.5389 2.0735453419652163 -351.451173840700 +5390 0.5390 2.1087026088763565 -351.694164382101 +5391 0.5391 2.1438841114735565 -351.935887561900 +5392 0.5392 2.1790897231325164 -352.176345617299 +5393 0.5393 2.2143193174524765 -352.415540781900 +5394 0.5394 2.2495727682558764 -352.653475286101 +5395 0.5395 2.2848499495880565 -352.890151357500 +5396 0.5396 2.3201507357169215 -353.125571219800 +5397 0.5397 2.3554750011326218 -353.359737094201 +5398 0.5398 2.3908226205472318 -353.592651198000 +5399 0.5399 2.4261934688944269 -353.824315745900 +5400 0.5400 2.4615874213291771 -354.054732949100 +5401 0.5401 2.4970043532274069 -354.283905015500 +5402 0.5402 2.5324441401856870 -354.511834150100 +5403 0.5403 2.5679066580209171 -354.738522554500 +5404 0.5404 2.6033917827699922 -354.963972427000 +5405 0.5405 2.6388993906895020 -355.188185963199 +5406 0.5406 2.6744293582554217 -355.411165355199 +5407 0.5407 2.7099815621627665 -355.632912791700 +5408 0.5408 2.7455558793252863 -355.853430458699 +5409 0.5409 2.7811521868751665 -356.072720538901 +5410 0.5410 2.8167703621626914 -356.290785211600 +5411 0.5411 2.8524102827559363 -356.507626653300 +5412 0.5412 2.8880718264404512 -356.723247037000 +5413 0.5413 2.9237548712189412 -356.937648532799 +5414 0.5414 2.9594592953109662 -357.150833307700 +5415 0.5415 2.9951849771526211 -357.362803525401 +5416 0.5416 3.0309317953962212 -357.573561346600 +5417 0.5417 3.0666996289099862 -357.783108928701 +5418 0.5418 3.1024883567777310 -357.991448426199 +5419 0.5419 3.1382978582985559 -358.198581990300 +5420 0.5420 3.1741280129865359 -358.404511769300 +5421 0.5421 3.2099787005704061 -358.609239908101 +5422 0.5422 3.2458498009932462 -358.812768548700 +5423 0.5423 3.2817411944121813 -359.015099830001 +5424 0.5424 3.3176527611980715 -359.216235887801 +5425 0.5425 3.3535843819351916 -359.416178854601 +5426 0.5426 3.3895359374209315 -359.614930860200 +5427 0.5427 3.4255073086654866 -359.812494030901 +5428 0.5428 3.4614983768915515 -360.008870490399 +5429 0.5429 3.4975090235340116 -360.204062358800 +5430 0.5430 3.5335391302396317 -360.398071753600 +5431 0.5431 3.5695885788667518 -360.590900788799 +5432 0.5432 3.6056572514849767 -360.782551575699 +5433 0.5433 3.6417450303748815 -360.973026222400 +5434 0.5434 3.6778517980277017 -361.162326834001 +5435 0.5435 3.7139774371450267 -361.350455512500 +5436 0.5436 3.7501218306384869 -361.537414356701 +5437 0.5437 3.7862848616294618 -361.723205462800 +5438 0.5438 3.8224664134487720 -361.907830923401 +5439 0.5439 3.8586663696363721 -362.091292828600 +5440 0.5440 3.8948846139410622 -362.273593265199 +5441 0.5441 3.9311210303201674 -362.454734316900 +5442 0.5442 3.9673755029392423 -362.634718064601 +5443 0.5443 4.0036479161717775 -362.813546586101 +5444 0.5444 4.0399381545988877 -362.991221956101 +5445 0.5445 4.0762461030090131 -363.167746246399 +5446 0.5446 4.1125716463976278 -363.343121525899 +5447 0.5447 4.1489146699669330 -363.517349860200 +5448 0.5448 4.1852750591255532 -363.690433312200 +5449 0.5449 4.2216526994882431 -363.862373941600 +5450 0.5450 4.2580474768755883 -364.033173805301 +5451 0.5451 4.2944592773137034 -364.202834956999 +5452 0.5452 4.3308879870339378 -364.371359447699 +5453 0.5453 4.3673334924725875 -364.538749325300 +5454 0.5454 4.4037956802705871 -364.705006634700 +5455 0.5455 4.4402744372732075 -364.870133417700 +5456 0.5456 4.4767696505297678 -365.034131713501 +5457 0.5457 4.5132812072933381 -365.197003557900 +5458 0.5458 4.5498089950204479 -365.358750984300 +5459 0.5459 4.5863529013707982 -365.519376022701 +5460 0.5460 4.6229128142069431 -365.678880700199 +5461 0.5461 4.6594886215940177 -365.837267041299 +5462 0.5462 4.6960802117994378 -365.994537067099 +5463 0.5463 4.7326874732925974 -366.150692796100 +5464 0.5464 4.7693102947445878 -366.305736243699 +5465 0.5465 4.8059485650279079 -366.459669422700 +5466 0.5466 4.8426021732161626 -366.612494342400 +5467 0.5467 4.8792710085837729 -366.764213009799 +5468 0.5468 4.9159549606056876 -366.914827428500 +5469 0.5469 4.9526539189570924 -367.064339599599 +5470 0.5470 4.9893677735131119 -367.212751520799 +5471 0.5471 5.0260964143485269 -367.360065187500 +5472 0.5472 5.0628397317374967 -367.506282591901 +5473 0.5473 5.0995976161532468 -367.651405723102 +5474 0.5474 5.1363699582677871 -367.795436567700 +5475 0.5475 5.1731566489516370 -367.938377109300 +5476 0.5476 5.2099575792735271 -368.080229328500 +5477 0.5477 5.2467726405001018 -368.220995203001 +5478 0.5478 5.2836017240956519 -368.360676708000 +5479 0.5479 5.3204447217218220 -368.499275815400 +5480 0.5480 5.3573015252373120 -368.636794494400 +5481 0.5481 5.3941720266976017 -368.773234711402 +5482 0.5482 5.4310561183546664 -368.908598429900 +5483 0.5483 5.4679536926566810 -369.042887610400 +5484 0.5484 5.5048646422477461 -369.176104210899 +5485 0.5485 5.5417888599676060 -369.308250186301 +5486 0.5486 5.5787262388513614 -369.439327488801 +5487 0.5487 5.6156766721291715 -369.569338067400 +5488 0.5488 5.6526400532259915 -369.698283869000 +5489 0.5489 5.6896162757612867 -369.826166836900 +5490 0.5490 5.7266052335487316 -369.952988912000 +5491 0.5491 5.7636068205959514 -370.078752032401 +5492 0.5492 5.8006209311042269 -370.203458133101 +5493 0.5493 5.8376474594682115 -370.327109146599 +5494 0.5494 5.8746863002756617 -370.449707002401 +5495 0.5495 5.9117373483071516 -370.571253627399 +5496 0.5496 5.9488004985357916 -370.691750945400 +5497 0.5497 5.9858756461269413 -370.811200877601 +5498 0.5498 6.0229626864379417 -370.929605342399 +5499 0.5499 6.0600615150178365 -371.046966255501 +5500 0.5500 6.0971720276070869 -371.163285529499 +5501 0.5501 6.1342941201372865 -371.278565074501 +5502 0.5502 6.1714276887309119 -371.392806798000 +5503 0.5503 6.2085726297010222 -371.506012604201 +5504 0.5504 6.2457288395509769 -371.618184394900 +5505 0.5505 6.2828962149741718 -371.729324069000 +5506 0.5506 6.3200746528537621 -371.839433522800 +5507 0.5507 6.3572640502623923 -371.948514649799 +5508 0.5508 6.3944643044619021 -372.056569340399 +5509 0.5509 6.4316753129030673 -372.163599482901 +5510 0.5510 6.4688969732253225 -372.269606962200 +5511 0.5511 6.5061291832564825 -372.374593661001 +5512 0.5512 6.5433718410124726 -372.478561458800 +5513 0.5513 6.5806248446970477 -372.581512232700 +5514 0.5514 6.6178880927015280 -372.683447856900 +5515 0.5515 6.6551614836045232 -372.784370203000 +5516 0.5516 6.6924449161716630 -372.884281139801 +5517 0.5517 6.7297382893553230 -372.983182533399 +5518 0.5518 6.7670415022943482 -373.081076247099 +5519 0.5519 6.8043544543137831 -373.177964141600 +5520 0.5520 6.8416770449246131 -373.273848074999 +5521 0.5521 6.8790091738234835 -373.368729902400 +5522 0.5522 6.9163507408924190 -373.462611476300 +5523 0.5523 6.9537016461985743 -373.555494646800 +5524 0.5524 6.9910617899939593 -373.647381260900 +5525 0.5525 7.0284310727151595 -373.738273163101 +5526 0.5526 7.0658093949830798 -373.828172195299 +5527 0.5527 7.1031966576026697 -373.917080196499 +5528 0.5528 7.1405927615626545 -374.004999003200 +5529 0.5529 7.1779976080352794 -374.091930449300 +5530 0.5530 7.2154110983760340 -374.177876365799 +5531 0.5531 7.2528331341233736 -374.262838581000 +5532 0.5532 7.2902636169984687 -374.346818920900 +5533 0.5533 7.3277024489049385 -374.429819208499 +5534 0.5534 7.3651495319285836 -374.511841264401 +5535 0.5535 7.4026047683371132 -374.592886906201 +5536 0.5536 7.4400680605798835 -374.672957949200 +5537 0.5537 7.4775393112876385 -374.752056205900 +5538 0.5538 7.5150184232722488 -374.830183486301 +5539 0.5539 7.5525052995264392 -374.907341597500 +5540 0.5540 7.5899998432235245 -374.983532344200 +5541 0.5541 7.6275019577171497 -375.058757528299 +5542 0.5542 7.6650115465410300 -375.133018949300 +5543 0.5543 7.7025285134086898 -375.206318403900 +5544 0.5544 7.7400527622131996 -375.278657686300 +5545 0.5545 7.7775841970268997 -375.350038587700 +5546 0.5546 7.8151227221011546 -375.420462897400 +5547 0.5547 7.8526682418660991 -375.489932401500 +5548 0.5548 7.8902206609303640 -375.558448883799 +5549 0.5549 7.9277798840808140 -375.626014125201 +5550 0.5550 7.9653458162822943 -375.692629904399 +5551 0.5551 8.0029183626773790 -375.758297997299 +5552 0.5552 8.0404974285860984 -375.823020177100 +5553 0.5553 8.0780829195056842 -375.886798214600 +5554 0.5554 8.1156747411103147 -375.949633878001 +5555 0.5555 8.1532727992508498 -376.011528932699 +5556 0.5556 8.1908769999545790 -376.072485141900 +5557 0.5557 8.2284872494249690 -376.132504265899 +5558 0.5558 8.2661034540414047 -376.191588062800 +5559 0.5559 8.3037255203589240 -376.249738287601 +5560 0.5560 8.3413533551079642 -376.306956693199 +5561 0.5561 8.3789868651941095 -376.363245029701 +5562 0.5562 8.4166259576978391 -376.418605044899 +5563 0.5563 8.4542705398742690 -376.473038483700 +5564 0.5564 8.4919205191528935 -376.526547088801 +5565 0.5565 8.5295758031373339 -376.579132600000 +5566 0.5566 8.5672362996050797 -376.630796754900 +5567 0.5567 8.6049019165072451 -376.681541288401 +5568 0.5568 8.6425725619683060 -376.731367932800 +5569 0.5569 8.6802481442858568 -376.780278418200 +5570 0.5570 8.7179285719303525 -376.828274471700 +5571 0.5571 8.7556137535448517 -376.875357818300 +5572 0.5572 8.7933035979447709 -376.921530180101 +5573 0.5573 8.8309980141176254 -376.966793277001 +5574 0.5574 8.8686969112227896 -377.011148826299 +5575 0.5575 8.9064001985912391 -377.054598542700 +5576 0.5576 8.9441077857252935 -377.097144138399 +5577 0.5577 8.9818195822983888 -377.138787323500 +5578 0.5578 9.0195354981547986 -377.179529804700 +5579 0.5579 9.0572554433094030 -377.219373287389 +5580 0.5580 9.0949793279474473 -377.258319473482 +5581 0.5581 9.1327070624242648 -377.296370062870 +5582 0.5582 9.1704385572650491 -377.333526752820 +5583 0.5583 9.2081737231646024 -377.369791238230 +5584 0.5584 9.2459124709870864 -377.405165211461 +5585 0.5585 9.2836547117657808 -377.439650362439 +5586 0.5586 9.3214003567028261 -377.473248378470 +5587 0.5587 9.3591493171689759 -377.505960944529 +5588 0.5588 9.3969015047033650 -377.537789743270 +5589 0.5589 9.4346568310132533 -377.568736454490 +5590 0.5590 9.4724152079737749 -377.598802755951 +5591 0.5591 9.5101765476277045 -377.627990322631 +5592 0.5592 9.5479407621852026 -377.656300827341 +5593 0.5593 9.5857077640235833 -377.683735940269 +5594 0.5594 9.6234774656870581 -377.710297329231 +5595 0.5595 9.6612497798864947 -377.735986659500 +5596 0.5596 9.6990246194991716 -377.760805594040 +5597 0.5597 9.7368018975685349 -377.784755793240 +5598 0.5598 9.7745815273039653 -377.807838915369 +5599 0.5599 9.8123634220805283 -377.830056615880 +5600 0.5600 9.8501474954387263 -377.851410548079 +5601 0.5601 9.8879336610842650 -377.871902362691 +5602 0.5602 9.9257218328878078 -377.891533708171 +5603 0.5603 9.9635119248847364 -377.910306230409 +5604 0.5604 10.0013038512749048 -377.928221572960 +5605 0.5605 10.0390975264224060 -377.945281377069 +5606 0.5606 10.0768928648553260 -377.961487281331 +5607 0.5607 10.1146897812655059 -377.976840922271 +5608 0.5608 10.1524881905083078 -377.991343933780 +5609 0.5609 10.1902880076023674 -378.004997947419 +5610 0.5610 10.2280891477293547 -378.017804592320 +5611 0.5611 10.2658915262337391 -378.029765495370 +5612 0.5612 10.3036950586225533 -378.040882280911 +5613 0.5613 10.3414996605651552 -378.051156571131 +5614 0.5614 10.3793052478929813 -378.060589985380 +5615 0.5615 10.4171117365993133 -378.069184141250 +5616 0.5616 10.4549190428390499 -378.076940653480 +5617 0.5617 10.4927270829284573 -378.083861134679 +5618 0.5618 10.5305357733449441 -378.089947195040 +5619 0.5619 10.5683450307268174 -378.095200442440 +5620 0.5620 10.6061547718730527 -378.099622482270 +5621 0.5621 10.6439649137430532 -378.103214917750 +5622 0.5622 10.6817753734564196 -378.105979349571 +5623 0.5623 10.7195860682927080 -378.107917376190 +5624 0.5624 10.7573969156912082 -378.109030593811 +5625 0.5625 10.7952078332506964 -378.109320595950 +5626 0.5626 10.8330187387292085 -378.108788974299 +5627 0.5627 10.8708295500438084 -378.107437317691 +5628 0.5628 10.9086401852703467 -378.105267213081 +5629 0.5629 10.9464505626432356 -378.102280244701 +5630 0.5630 10.9842606005552099 -378.098477994779 +5631 0.5631 11.0220702175571059 -378.093862043141 +5632 0.5632 11.0598793323576192 -378.088433967121 +5633 0.5633 11.0976878638230776 -378.082195342029 +5634 0.5634 11.1354957309772047 -378.075147740510 +5635 0.5635 11.1733028530008962 -378.067292733329 +5636 0.5636 11.2111091492319908 -378.058631888551 +5637 0.5637 11.2489145391650300 -378.049166772240 +5638 0.5638 11.2867189424510332 -378.038898947831 +5639 0.5639 11.3245222788972679 -378.027829976860 +5640 0.5640 11.3623244684670262 -378.015961418290 +5641 0.5641 11.4001254312793936 -378.003294829041 +5642 0.5642 11.4379250876090133 -377.989831763349 +5643 0.5643 11.4757233578858546 -377.975573773490 +5644 0.5644 11.5135201626950021 -377.960522409450 +5645 0.5645 11.5513154227764154 -377.944679218830 +5646 0.5646 11.5891090590247092 -377.928045747030 +5647 0.5647 11.6269009924889168 -377.910623537120 +5648 0.5648 11.6646911443722701 -377.892414129959 +5649 0.5649 11.7024794360319735 -377.873419064110 +5650 0.5650 11.7402657889789737 -377.853639875901 +5651 0.5651 11.7780501248777369 -377.833078099371 +5652 0.5652 11.8158323655460222 -377.811735266348 +5653 0.5653 11.8536124329546588 -377.789612906379 +5654 0.5654 11.8913902492273174 -377.766712546781 +5655 0.5655 11.9291657366402877 -377.743035712630 +5656 0.5656 11.9669388176222533 -377.718583926689 +5657 0.5657 12.0047094147540676 -377.693358709610 +5658 0.5658 12.0424774507685335 -377.667361579710 +5659 0.5659 12.0802428485501760 -377.640594053149 +5660 0.5660 12.1180055311350223 -377.613057643770 +5661 0.5661 12.1557654217103757 -377.584753863290 +5662 0.5662 12.1935224436145973 -377.555684221130 +5663 0.5663 12.2312765203368770 -377.525850224480 +5664 0.5664 12.2690275755170219 -377.495253378420 +5665 0.5665 12.3067755329452293 -377.463895185721 +5666 0.5666 12.3445203165618622 -377.431777146920 +5667 0.5667 12.3822618504572297 -377.398900760441 +5668 0.5668 12.4200000588713753 -377.365267522480 +5669 0.5669 12.4577348661938494 -377.330878926990 +5670 0.5670 12.4954661969634859 -377.295736465740 +5671 0.5671 12.5331939758681887 -377.259841628320 +5672 0.5672 12.5709181277447115 -377.223195902148 +5673 0.5673 12.6086385775784358 -377.185800772349 +5674 0.5674 12.6463552505031540 -377.147657722020 +5675 0.5675 12.6840680718008549 -377.108768231990 +5676 0.5676 12.7217769669014977 -377.069133780869 +5677 0.5677 12.7594818613827989 -377.028755845140 +5678 0.5678 12.7971826809700122 -376.987635899141 +5679 0.5679 12.8348793515357187 -376.945775414999 +5680 0.5680 12.8725717990996014 -376.903175862672 +5681 0.5681 12.9102599498282320 -376.859838709950 +5682 0.5682 12.9479437300348543 -376.815765422500 +5683 0.5683 12.9856230661791692 -376.770957463781 +5684 0.5684 13.0232978848671141 -376.725416295119 +5685 0.5685 13.0609681128506558 -376.679143375721 +5686 0.5686 13.0986336770275695 -376.632140162570 +5687 0.5687 13.1362945044412260 -376.584408110552 +5688 0.5688 13.1739505222803750 -376.535948672430 +5689 0.5689 13.2116016578789335 -376.486763298750 +5690 0.5690 13.2492478387157711 -376.436853438001 +5691 0.5691 13.2868889924144948 -376.386220536489 +5692 0.5692 13.3245250467432399 -376.334866038420 +5693 0.5693 13.3621559296144525 -376.282791385820 +5694 0.5694 13.3997815690846771 -376.229998018660 +5695 0.5695 13.4374018933543464 -376.176487374740 +5696 0.5696 13.4750168307675704 -376.122260889731 +5697 0.5697 13.5126263098119175 -376.067319997219 +5698 0.5698 13.5502302591182104 -376.011666128650 +5699 0.5699 13.5878286074603132 -375.955300713411 +5700 0.5700 13.6254212837549176 -375.898225178689 +5701 0.5701 13.6630082170613338 -375.840440949651 +5702 0.5702 13.7005893365812810 -375.781949449291 +5703 0.5703 13.7381645716586753 -375.722752098611 +5704 0.5704 13.7757338517794246 -375.662850316381 +5705 0.5705 13.8132971065712109 -375.602245519351 +5706 0.5706 13.8508542658032887 -375.540939122191 +5707 0.5707 13.8884052593862712 -375.478932537450 +5708 0.5708 13.9259500173719246 -375.416227175610 +5709 0.5709 13.9634884699529565 -375.352824445039 +5710 0.5710 14.0010205474628133 -375.288725752091 +5711 0.5711 14.0385461803754676 -375.223932500981 +5712 0.5712 14.0760652993052098 -375.158446093870 +5713 0.5713 14.1135778350064456 -375.092267930859 +5714 0.5714 14.1510837183734868 -375.025399409960 +5715 0.5715 14.1885828804403431 -374.957841927151 +5716 0.5716 14.2260752523805163 -374.889596876301 +5717 0.5717 14.2635607655067957 -374.820665649280 +5718 0.5718 14.3010393512710525 -374.751049635841 +5719 0.5719 14.3385109412640315 -374.680750223721 +5720 0.5720 14.3759754672151487 -374.609768798611 +5721 0.5721 14.4134328609922857 -374.538106744121 +5722 0.5722 14.4508830546015830 -374.465765441841 +5723 0.5723 14.4883259801872395 -374.392746271291 +5724 0.5724 14.5257615700313050 -374.319050610020 +5725 0.5725 14.5631897565534771 -374.244679833431 +5726 0.5726 14.6006104723108976 -374.169635314991 +5727 0.5727 14.6380236499979528 -374.093918426111 +5728 0.5728 14.6754292224460627 -374.017530536090 +5729 0.5729 14.7128271226234837 -373.940473012341 +5730 0.5730 14.7502172836351093 -373.862747220170 +5731 0.5731 14.7875996387222610 -373.784354522879 +5732 0.5732 14.8249741212624908 -373.705296281729 +5733 0.5733 14.8623406647693770 -373.625573856008 +5734 0.5734 14.8996992028923270 -373.545188603000 +5735 0.5735 14.9370496694163712 -373.464141877881 +5736 0.5736 14.9743919982619627 -373.382435033940 +5737 0.5737 15.0117261234847810 -373.300069422441 +5738 0.5738 15.0490519792755322 -373.217046392580 +5739 0.5739 15.0863694999597406 -373.133367291601 +5740 0.5740 15.1236786199975590 -373.049033464760 +5741 0.5741 15.1609792739835623 -372.964046255320 +5742 0.5742 15.1982713966465539 -372.878407004529 +5743 0.5743 15.2355549228493636 -372.792117051649 +5744 0.5744 15.2728297875886483 -372.705177734029 +5745 0.5745 15.3100959259946947 -372.617590386910 +5746 0.5746 15.3473532733312243 -372.529356343670 +5747 0.5747 15.3846017649951907 -372.440476935659 +5748 0.5748 15.4218413365165858 -372.350953492240 +5749 0.5749 15.4590719235582394 -372.260787340840 +5750 0.5750 15.4962934619156254 -372.169979806891 +5751 0.5751 15.5335058875166645 -372.078532213900 +5752 0.5752 15.5707091364215273 -371.986445883360 +5753 0.5753 15.6079031448224370 -371.893722134839 +5754 0.5754 15.6450878490434757 -371.800362285940 +5755 0.5755 15.6822631855403873 -371.706367652301 +5756 0.5756 15.7194290909003822 -371.611739547599 +5757 0.5757 15.7565855018419434 -371.516479283620 +5758 0.5758 15.7937323552146331 -371.420588170160 +5759 0.5759 15.8308695879988939 -371.324067515039 +5760 0.5760 15.8679971373058564 -371.226918624201 +5761 0.5761 15.9051149403771461 -371.129142801610 +5762 0.5762 15.9422229345846933 -371.030741349339 +5763 0.5763 15.9793210574305320 -370.931715567451 +5764 0.5764 16.0164092465466119 -370.832066754139 +5765 0.5765 16.0534874396946030 -370.731796205670 +5766 0.5766 16.0905555747657054 -370.630905216391 +5767 0.5767 16.1276135897804558 -370.529395078640 +5768 0.5768 16.1646614228885355 -370.427267082969 +5769 0.5769 16.2016990123685787 -370.324522517889 +5770 0.5770 16.2387262966279771 -370.221162670110 +5771 0.5771 16.2757432142026985 -370.117188824332 +5772 0.5772 16.3127497037570848 -370.012602263410 +5773 0.5773 16.3497457040836700 -369.907404268281 +5774 0.5774 16.3867311541029785 -369.801596117919 +5775 0.5775 16.4237059928633506 -369.695179089509 +5776 0.5776 16.4606701595407365 -369.588154458239 +5777 0.5777 16.4976235934385187 -369.480523497428 +5778 0.5778 16.5345662339873165 -369.372287478540 +5779 0.5779 16.5714980207447979 -369.263447671090 +5780 0.5780 16.6084188933954913 -369.154005342780 +5781 0.5781 16.6453287917505968 -369.043961759309 +5782 0.5782 16.6822276557477949 -368.933318184640 +5783 0.5783 16.7191154254510650 -368.822075880729 +5784 0.5784 16.7559920410504866 -368.710236107729 +5785 0.5785 16.7928574428620685 -368.597800123889 +5786 0.5786 16.8297115713275431 -368.484769185610 +5787 0.5787 16.8665543670141922 -368.371144547371 +5788 0.5788 16.9033857706146513 -368.256927461829 +5789 0.5789 16.9402057229467324 -368.142119179780 +5790 0.5790 16.9770141649532285 -368.026720950129 +5791 0.5791 17.0138110377017320 -367.910734019930 +5792 0.5792 17.0505962823844470 -367.794159634390 +5793 0.5793 17.0873698403180114 -367.676999036888 +5794 0.5794 17.1241316529432979 -367.559253468860 +5795 0.5795 17.1608816618252398 -367.440924169990 +5796 0.5796 17.1976198086526431 -367.322012378081 +5797 0.5797 17.2343460352380013 -367.202519329070 +5798 0.5798 17.2710602835173077 -367.082446257080 +5799 0.5799 17.3077624955498806 -366.961794394370 +5800 0.5800 17.3444526135181682 -366.840564971411 +5801 0.5801 17.3811305797275750 -366.718759216759 +5802 0.5802 17.4177963366062762 -366.596378357241 +5803 0.5803 17.4544498267050265 -366.473423617750 +5804 0.5804 17.4910909926969858 -366.349896221429 +5805 0.5805 17.5277197773775342 -366.225797389561 +5806 0.5806 17.5643361236640949 -366.101128341619 +5807 0.5807 17.6009399745959385 -365.975890295269 +5808 0.5808 17.6375312733340159 -365.850084466301 +5809 0.5809 17.6741099631607703 -365.723712068781 +5810 0.5810 17.7106759874799558 -365.596774314901 +5811 0.5811 17.7472292898164525 -365.469272415061 +5812 0.5812 17.7837698138160967 -365.341207577851 +5813 0.5813 17.8202975032454916 -365.212581010081 +5814 0.5814 17.8568123019918303 -365.083393916721 +5815 0.5815 17.8933141540627147 -364.953647500939 +5816 0.5816 17.9298030035859703 -364.823342964199 +5817 0.5817 17.9662787948094831 -364.692481506021 +5818 0.5818 18.0027414721009968 -364.561064324229 +5819 0.5819 18.0391909799479500 -364.429092614850 +5820 0.5820 18.0756272629572976 -364.296567572130 +5821 0.5821 18.1120502658553306 -364.163490388521 +5822 0.5822 18.1484599334874872 -364.029862254642 +5823 0.5823 18.1848562108181895 -363.895684359410 +5824 0.5824 18.2212390429306588 -363.760957889950 +5825 0.5825 18.2576083750267344 -363.625684031540 +5826 0.5826 18.2939641524266996 -363.489863967781 +5827 0.5827 18.3303063205691110 -363.353498880460 +5828 0.5828 18.3666348250106140 -363.216589949621 +5829 0.5829 18.4029496114257682 -363.079138353480 +5830 0.5830 18.4392506256068707 -362.941145268551 +5831 0.5831 18.4755378134637773 -362.802611869600 +5832 0.5832 18.5118111210237366 -362.663539329591 +5833 0.5833 18.5480704944312009 -362.523928819710 +5834 0.5834 18.5843158799476598 -362.383781509490 +5835 0.5835 18.6205472239514656 -362.243098566649 +5836 0.5836 18.6567644729376525 -362.101881157101 +5837 0.5837 18.6929675735177625 -361.960130445119 +5838 0.5838 18.7291564724196782 -361.817847593189 +5839 0.5839 18.7653311164874417 -361.675033762062 +5840 0.5840 18.8014914526810806 -361.531690110711 +5841 0.5841 18.8376374280764374 -361.387817796451 +5842 0.5842 18.8737689898649990 -361.243417974809 +5843 0.5843 18.9098860853537190 -361.098491799570 +5844 0.5844 18.9459886619648401 -360.953040422841 +5845 0.5845 18.9820766672357308 -360.807064994950 +5846 0.5846 19.0181500488187041 -360.660566664541 +5847 0.5847 19.0542087544808574 -360.513546578490 +5848 0.5848 19.0902527321038846 -360.366005882050 +5849 0.5849 19.1262819296839197 -360.217945718639 +5850 0.5850 19.1622962953313518 -360.069367229991 +5851 0.5851 19.1982957772706619 -359.920271556201 +5852 0.5852 19.2342803238402524 -359.770659835629 +5853 0.5853 19.2702498834922764 -359.620533204830 +5854 0.5854 19.3062044047924566 -359.469892798741 +5855 0.5855 19.3421438364199254 -359.318739750630 +5856 0.5856 19.3780681271670545 -359.167075191981 +5857 0.5857 19.4139772259392842 -359.014900252589 +5858 0.5858 19.4498710817549458 -358.862216060639 +5859 0.5859 19.4857496437451019 -358.709023742511 +5860 0.5860 19.5216128611533755 -358.555324422980 +5861 0.5861 19.5574606833357763 -358.401119225069 +5862 0.5862 19.5932930597605406 -358.246409270190 +5863 0.5863 19.6291099400079503 -358.091195677980 +5864 0.5864 19.6649112737701728 -357.935479566460 +5865 0.5865 19.7006970108510941 -357.779262051970 +5866 0.5866 19.7364671011661486 -357.622544249090 +5867 0.5867 19.7722214947421442 -357.465327270851 +5868 0.5868 19.8079601417171141 -357.307612228531 +5869 0.5869 19.8436829923401277 -357.149400231760 +5870 0.5870 19.8793899969711383 -356.990692388479 +5871 0.5871 19.9150811060808124 -356.831489804988 +5872 0.5872 19.9507562702503591 -356.671793585931 +5873 0.5873 19.9864154401713705 -356.511604834279 +5874 0.5874 20.0220585666456508 -356.350924651320 +5875 0.5875 20.0576856005850530 -356.189754136720 +5876 0.5876 20.0932964930113123 -356.028094388481 +5877 0.5877 20.1288911950558820 -355.865946502929 +5878 0.5878 20.1644696579597671 -355.703311574800 +5879 0.5879 20.2000318330733641 -355.540190697120 +5880 0.5880 20.2355776718562836 -355.376584961290 +5881 0.5881 20.2711071258772009 -355.212495457081 +5882 0.5882 20.3066201468136853 -355.047923272619 +5883 0.5883 20.3421166864520373 -354.882869494390 +5884 0.5884 20.3775966966871174 -354.717335207220 +5885 0.5885 20.4130601295221972 -354.551321494360 +5886 0.5886 20.4485069370687818 -354.384829437340 +5887 0.5887 20.4839370715464568 -354.217860116170 +5888 0.5888 20.5193504852827218 -354.050414609132 +5889 0.5889 20.5547471307128262 -353.882493992949 +5890 0.5890 20.5901269603796102 -353.714099342700 +5891 0.5891 20.6254899269333372 -353.545231731830 +5892 0.5892 20.6608359831315376 -353.375892232199 +5893 0.5893 20.6961650818388492 -353.206081914010 +5894 0.5894 20.7314771760268464 -353.035801845899 +5895 0.5895 20.7667722187738804 -352.865053094800 +5896 0.5896 20.8020501632649299 -352.693836726199 +5897 0.5897 20.8373109627914310 -352.522153803811 +5898 0.5898 20.8725545707511131 -352.350005389839 +5899 0.5899 20.9077809406478465 -352.177392544862 +5900 0.5900 20.9429900260914792 -352.004316327811 +5901 0.5901 20.9781817807976765 -351.830777796120 +5902 0.5902 21.0133561585877580 -351.656778005530 +5903 0.5903 21.0485131133885481 -351.482318010259 +5904 0.5904 21.0836525992322059 -351.307398862878 +5905 0.5905 21.1187745702560683 -351.132021614389 +5906 0.5906 21.1538789807024976 -350.956187314221 +5907 0.5907 21.1889657849187216 -350.779897010250 +5908 0.5908 21.2240349373566666 -350.603151748630 +5909 0.5909 21.2590863925728044 -350.425952574100 +5910 0.5910 21.2941201052279965 -350.248300529709 +5911 0.5911 21.3291360300873336 -350.070196657029 +5912 0.5912 21.3641341220199834 -349.891641995961 +5913 0.5913 21.3991143359990232 -349.712637584860 +5914 0.5914 21.4340766271012946 -349.533184460570 +5915 0.5915 21.4690209505072360 -349.353283658280 +5916 0.5916 21.5039472615007341 -349.172936211649 +5917 0.5917 21.5388555154689598 -348.992143152840 +5918 0.5918 21.5737456679022195 -348.810905512320 +5919 0.5919 21.6086176743937912 -348.629224319091 +5920 0.5920 21.6434714906397758 -348.447100600610 +5921 0.5921 21.6783070724389404 -348.264535382710 +5922 0.5922 21.7131243756925620 -348.081529689721 +5923 0.5923 21.7479233564042680 -347.898084544409 +5924 0.5924 21.7827039706798864 -347.714200967990 +5925 0.5925 21.8174661747272935 -347.529879980129 +5926 0.5926 21.8522099248562469 -347.345122598959 +5927 0.5927 21.8869351774782501 -347.159929841071 +5928 0.5928 21.9216418891063789 -346.974302721491 +5929 0.5929 21.9563300163551389 -346.788242253730 +5930 0.5930 21.9909995159403131 -346.601749449770 +5931 0.5931 22.0256503446788052 -346.414825320039 +5932 0.5932 22.0602824594884801 -346.227470873460 +5933 0.5933 22.0948958173880214 -346.039687117380 +5934 0.5934 22.1294903754967756 -345.851475057671 +5935 0.5935 22.1640660910345915 -345.662835698640 +5936 0.5936 22.1986229213216788 -345.473770043111 +5937 0.5937 22.2331608237784515 -345.284279092341 +5938 0.5938 22.2676797559253750 -345.094363846099 +5939 0.5939 22.3021796753828099 -344.904025302621 +5940 0.5940 22.3366605398708735 -344.713264458659 +5941 0.5941 22.3711223072092764 -344.522082309390 +5942 0.5942 22.4055649353171731 -344.330479848569 +5943 0.5943 22.4399883822130199 -344.138458068370 +5944 0.5944 22.4743926060144119 -343.946017959460 +5945 0.5945 22.5087775649379367 -343.753160511061 +5946 0.5946 22.5431432172990327 -343.559886710830 +5947 0.5947 22.5774895215118221 -343.366197544980 +5948 0.5948 22.6118164360889793 -343.172093998160 +5949 0.5949 22.6461239196415676 -342.977577053589 +5950 0.5950 22.6804119308788934 -342.782647692950 +5951 0.5951 22.7146804286083643 -342.587306896450 +5952 0.5952 22.7489293717353256 -342.391555642800 +5953 0.5953 22.7831587192629250 -342.195394909220 +5954 0.5954 22.8173684302919568 -341.998825671450 +5955 0.5955 22.8515584640207159 -341.801848903760 +5956 0.5956 22.8857287797448485 -341.604465578921 +5957 0.5957 22.9198793368572069 -341.406676668220 +5958 0.5958 22.9540100948476891 -341.208483141450 +5959 0.5959 22.9881210133031111 -341.009885967000 +5960 0.5960 23.0222120519070472 -340.810886111690 +5961 0.5961 23.0562831704396807 -340.611484540949 +5962 0.5962 23.0903343287776615 -340.411682218690 +5963 0.5963 23.1243654868939643 -340.211480107370 +5964 0.5964 23.1583766048577324 -340.010879167970 +5965 0.5965 23.1923676428341317 -339.809880360050 +5966 0.5966 23.2263385610842157 -339.608484641650 +5967 0.5967 23.2602893199647660 -339.406692969380 +5968 0.5968 23.2942198799281535 -339.204506298380 +5969 0.5969 23.3281302015221925 -339.001925582399 +5970 0.5970 23.3620202453899921 -338.798951773621 +5971 0.5971 23.3958899722698135 -338.595585822830 +5972 0.5972 23.4297393429949246 -338.391828679390 +5973 0.5973 23.4635683184934543 -338.187681291220 +5974 0.5974 23.4973768597882504 -337.983144604710 +5975 0.5975 23.5311649279967305 -337.778219564890 +5976 0.5976 23.5649324843307433 -337.572907115340 +5977 0.5977 23.5986794900964192 -337.367208198150 +5978 0.5978 23.6324059066940286 -337.161123754009 +5979 0.5979 23.6661116956178397 -336.954654722190 +5980 0.5980 23.6997968184559724 -336.747802040491 +5981 0.5981 23.7334612368902604 -336.540566645270 +5982 0.5982 23.7671049126960980 -336.332949471499 +5983 0.5983 23.8007278077423088 -336.124951452730 +5984 0.5984 23.8343298839909963 -335.916573521039 +5985 0.5985 23.8679111034974021 -335.707816607090 +5986 0.5986 23.9014714284097636 -335.498681640160 +5987 0.5987 23.9350108209691754 -335.289169548049 +5988 0.5988 23.9685292435094368 -335.079281257200 +5989 0.5989 24.0020266584569271 -334.869017692619 +5990 0.5990 24.0355030283304529 -334.658379777871 +5991 0.5991 24.0689583157411029 -334.447368435121 +5992 0.5992 24.1023924833921157 -334.235984585160 +5993 0.5993 24.1358054940787383 -334.024229147320 +5994 0.5994 24.1691973106880837 -333.812103039560 +5995 0.5995 24.2025678961989819 -333.599607178410 +5996 0.5996 24.2359172136818550 -333.386742479030 +5997 0.5997 24.2692452262985654 -333.173509855160 +5998 0.5998 24.3025518973022798 -332.959910219120 +5999 0.5999 24.3358371900373278 -332.745944481860 +6000 0.6000 24.3691010679390700 -332.531613552960 +6001 0.6001 24.4023434945337456 -332.316918340540 +6002 0.6002 24.4355644334383406 -332.101859751370 +6003 0.6003 24.4687638483604495 -331.886438690830 +6004 0.6004 24.5019417030981366 -331.670656062940 +6005 0.6005 24.5350979615397975 -331.454512770270 +6006 0.6006 24.5682325876640135 -331.238009714039 +6007 0.6007 24.6013455455394201 -331.021147794110 +6008 0.6008 24.6344367993245719 -330.803927908930 +6009 0.6009 24.6675063132677970 -330.586350955580 +6010 0.6010 24.7005540517070656 -330.368417829770 +6011 0.6011 24.7335799790698445 -330.150129425810 +6012 0.6012 24.7665840598729687 -329.931486636710 +6013 0.6013 24.7995662587225034 -329.712490354010 +6014 0.6014 24.8325265403136015 -329.493141467970 +6015 0.6015 24.8654648694303724 -329.273440867420 +6016 0.6016 24.8983812109457361 -329.053389439850 +6017 0.6017 24.9312755298212991 -328.832988071420 +6018 0.6018 24.9641477911072123 -328.612237646859 +6019 0.6019 24.9969979599420355 -328.391139049590 +6020 0.6020 25.0298260015525997 -328.169693161670 +6021 0.6021 25.0626318812538713 -327.947900863780 +6022 0.6022 25.0954155644488246 -327.725763035290 +6023 0.6023 25.1281770166282961 -327.503280554170 +6024 0.6024 25.1609162033708564 -327.280454297070 +6025 0.6025 25.1936330903426757 -327.057285139291 +6026 0.6026 25.2263276432973775 -326.833773954750 +6027 0.6027 25.2589998280759183 -326.609921616090 +6028 0.6028 25.2916496106064521 -326.385728994580 +6029 0.6029 25.3242769569041855 -326.161196960080 +6030 0.6030 25.3568818330712524 -325.936326381230 +6031 0.6031 25.3894642052965764 -325.711118125249 +6032 0.6032 25.4220240398557422 -325.485573058080 +6033 0.6033 25.4545613031108608 -325.259692044279 +6034 0.6034 25.4870759615104276 -325.033475947080 +6035 0.6035 25.5195679815892014 -324.806925628430 +6036 0.6036 25.5520373299680692 -324.580041948900 +6037 0.6037 25.5844839733539011 -324.352825767770 +6038 0.6038 25.6169078785394397 -324.125277942970 +6039 0.6039 25.6493090124031440 -323.897399331130 +6040 0.6040 25.6816873419090754 -323.669190787530 +6041 0.6041 25.7140428341067597 -323.440653166160 +6042 0.6042 25.7463754561310516 -323.211787319710 +6043 0.6043 25.7786851752020105 -322.982594099490 +6044 0.6044 25.8109719586247621 -322.753074355550 +6045 0.6045 25.8432357737893703 -322.523228936620 +6046 0.6046 25.8754765881707058 -322.293058690120 +6047 0.6047 25.9076943693283184 -322.062564462120 +6048 0.6048 25.9398890849062980 -321.831747097490 +6049 0.6049 25.9720607026331578 -321.600607439680 +6050 0.6050 26.0042091903216850 -321.369146330871 +6051 0.6051 26.0363345158688269 -321.137364612000 +6052 0.6052 26.0684366472555595 -320.905263122660 +6053 0.6053 26.1005155525467494 -320.672842701120 +6054 0.6054 26.1325711998910251 -320.440104184399 +6055 0.6055 26.1646035575206568 -320.207048408240 +6056 0.6056 26.1966125937514214 -319.973676207020 +6057 0.6057 26.2285982769824670 -319.739988413880 +6058 0.6058 26.2605605756961928 -319.505985860670 +6059 0.6059 26.2924994584581242 -319.271669377949 +6060 0.6060 26.3244148939167708 -319.037039794970 +6061 0.6061 26.3563068508035059 -318.802097939730 +6062 0.6062 26.3881752979324418 -318.566844638960 +6063 0.6063 26.4200202042002950 -318.331280718079 +6064 0.6064 26.4518415385862582 -318.095407001210 +6065 0.6065 26.4836392701518797 -317.859224311240 +6066 0.6066 26.5154133680409316 -317.622733469800 +6067 0.6067 26.5471638014792823 -317.385935297200 +6068 0.6068 26.5788905397747648 -317.148830612479 +6069 0.6069 26.6105935523170629 -316.911420233469 +6070 0.6070 26.6422728085775695 -316.673704976660 +6071 0.6071 26.6739282781092690 -316.435685657329 +6072 0.6072 26.7055599305466096 -316.197363089450 +6073 0.6073 26.7371677356053716 -315.958738085790 +6074 0.6074 26.7687516630825506 -315.719811457810 +6075 0.6075 26.8003116828562256 -315.480584015690 +6076 0.6076 26.8318477648854312 -315.241056568439 +6077 0.6077 26.8633598792100408 -315.001229923740 +6078 0.6078 26.8948479959506308 -314.761104888040 +6079 0.6079 26.9263120853083606 -314.520682266550 +6080 0.6080 26.9577521175648478 -314.279962863200 +6081 0.6081 26.9891680630820439 -314.038947480710 +6082 0.6082 27.0205598923021064 -313.797636920520 +6083 0.6083 27.0519275757472748 -313.556031982860 +6084 0.6084 27.0832710840197528 -313.314133466690 +6085 0.6085 27.1145903878015737 -313.071942169730 +6086 0.6086 27.1458854578544830 -312.829458888480 +6087 0.6087 27.1771562650198177 -312.586684418209 +6088 0.6088 27.2084027802183712 -312.343619552880 +6089 0.6089 27.2396249744502796 -312.100265085300 +6090 0.6090 27.2708228187948976 -311.856621807050 +6091 0.6091 27.3019962844106701 -311.612690508390 +6092 0.6092 27.3331453425350119 -311.368471978440 +6093 0.6093 27.3642699644841869 -311.123967005040 +6094 0.6094 27.3953701216531833 -310.879176374860 +6095 0.6095 27.4264457855155896 -310.634100873281 +6096 0.6096 27.4574969276234775 -310.388741284491 +6097 0.6097 27.4885235196072770 -310.143098391480 +6098 0.6098 27.5195255331756492 -309.897172975970 +6099 0.6099 27.5505029401153720 -309.650965818500 +6100 0.6100 27.5814557122912163 -309.404477698400 +6101 0.6101 27.6123838216458246 -309.157709393749 +6102 0.6102 27.6432872401995837 -308.910661681440 +6103 0.6103 27.6741659400505142 -308.663335337150 +6104 0.6104 27.7050198933741392 -308.415731135369 +6105 0.6105 27.7358490724233739 -308.167849849330 +6106 0.6106 27.7666534495283948 -307.919692251090 +6107 0.6107 27.7974329970965250 -307.671259111529 +6108 0.6108 27.8281876876121146 -307.422551200270 +6109 0.6109 27.8589174936364152 -307.173569285770 +6110 0.6110 27.8896223878074672 -306.924314135280 +6111 0.6111 27.9203023428399710 -306.674786514830 +6112 0.6112 27.9509573315251778 -306.424987189310 +6113 0.6113 27.9815873267307609 -306.174916922340 +6114 0.6114 28.0121923014006988 -305.924576476440 +6115 0.6115 28.0427722285551617 -305.673966612851 +6116 0.6116 28.0733270812903868 -305.423088091670 +6117 0.6117 28.1038568327785612 -305.171941671811 +6118 0.6118 28.1343614562677011 -304.920528110970 +6119 0.6119 28.1648409250815348 -304.668848165680 +6120 0.6120 28.1952952126193850 -304.416902591310 +6121 0.6121 28.2257242923560483 -304.164692141990 +6122 0.6122 28.2561281378416851 -303.912217570750 +6123 0.6123 28.2865067227016915 -303.659479629359 +6124 0.6124 28.3168600206365824 -303.406479068480 +6125 0.6125 28.3471880054218843 -303.153216637550 +6126 0.6126 28.3774906509080047 -302.899693084870 +6127 0.6127 28.4077679310201248 -302.645909157560 +6128 0.6128 28.4380198197580789 -302.391865601519 +6129 0.6129 28.4682462911962340 -302.137563161580 +6130 0.6130 28.4984473194833789 -301.883002581319 +6131 0.6131 28.5286228788426044 -301.628184603200 +6132 0.6132 28.5587729435711886 -301.373109968470 +6133 0.6133 28.5888974880404767 -301.117779417290 +6134 0.6134 28.6189964866957709 -300.862193688590 +6135 0.6135 28.6490699140562093 -300.606353520170 +6136 0.6136 28.6791177447146524 -300.350259648711 +6137 0.6137 28.7091399533375693 -300.093912809640 +6138 0.6138 28.7391365146649171 -299.837313737330 +6139 0.6139 28.7691074035100307 -299.580463164970 +6140 0.6140 28.7990525947595053 -299.323361824550 +6141 0.6141 28.8289720633730830 -299.066010447000 +6142 0.6142 28.8588657843835321 -298.808409762010 +6143 0.6143 28.8887337328965437 -298.550560498210 +6144 0.6144 28.9185758840906040 -298.292463383010 +6145 0.6145 28.9483922132168914 -298.034119142741 +6146 0.6146 28.9781826955991555 -297.775528502530 +6147 0.6147 29.0079473066336035 -297.516692186410 +6148 0.6148 29.0376860217887867 -297.257610917261 +6149 0.6149 29.0673988166054933 -296.998285416850 +6150 0.6150 29.0970856666966249 -296.738716405770 +6151 0.6151 29.1267465477470857 -296.478904603480 +6152 0.6152 29.1563814355136763 -296.218850728360 +6153 0.6153 29.1859903058249763 -295.958555497620 +6154 0.6154 29.2155731345812235 -295.698019627320 +6155 0.6155 29.2451298977542109 -295.437243832420 +6156 0.6156 29.2746605713871730 -295.176228826800 +6157 0.6157 29.3041651315946687 -294.914975323110 +6158 0.6158 29.3336435545624710 -294.653484032970 +6159 0.6159 29.3630958165474603 -294.391755666850 +6160 0.6160 29.3925218938775075 -294.129790934099 +6161 0.6161 29.4219217629513565 -293.867590542890 +6162 0.6162 29.4512954002385214 -293.605155200400 +6163 0.6163 29.4806427822791726 -293.342485612600 +6164 0.6164 29.5099638856840230 -293.079582484390 +6165 0.6165 29.5392586871342182 -292.816446519500 +6166 0.6166 29.5685271633812263 -292.553078420659 +6167 0.6167 29.5977692912467276 -292.289478889340 +6168 0.6168 29.6269850476224974 -292.025648626050 +6169 0.6169 29.6561744094703066 -291.761588330121 +6170 0.6170 29.6853373538218008 -291.497298699760 +6171 0.6171 29.7144738577783940 -291.232780432110 +6172 0.6172 29.7435838985111616 -290.968034223220 +6173 0.6173 29.7726674532607234 -290.703060768011 +6174 0.6174 29.8017244993371406 -290.437860760310 +6175 0.6175 29.8307550141197986 -290.172434892870 +6176 0.6176 29.8597589750573071 -289.906783857320 +6177 0.6177 29.8887363596673836 -289.640908344240 +6178 0.6178 29.9176871455367497 -289.374809043050 +6179 0.6179 29.9466113103210070 -289.108486642111 +6180 0.6180 29.9755088317445484 -288.841941828730 +6181 0.6181 30.0043796876004407 -288.575175289089 +6182 0.6182 30.0332238557503075 -288.308187708280 +6183 0.6183 30.0620413141242366 -288.040979770320 +6184 0.6184 30.0908320407206631 -287.773552158180 +6185 0.6185 30.1195960136062553 -287.505905553669 +6186 0.6186 30.1483332109158191 -287.238040637580 +6187 0.6187 30.1770436108521771 -286.969958089610 +6188 0.6188 30.2057271916860763 -286.701658588380 +6189 0.6189 30.2343839317560672 -286.433142811420 +6190 0.6190 30.2630138094683971 -286.164411435210 +6191 0.6191 30.2916168032969146 -285.895465135140 +6192 0.6192 30.3201928917829484 -285.626304585540 +6193 0.6193 30.3487420535352079 -285.356930459660 +6194 0.6194 30.3772642672296733 -285.087343429680 +6195 0.6195 30.4057595116094959 -284.817544166740 +6196 0.6196 30.4342277654848772 -284.547533340859 +6197 0.6197 30.4626690077329734 -284.277311621060 +6198 0.6198 30.4910832172977884 -284.006879675260 +6199 0.6199 30.5194703731900674 -283.736238170321 +6200 0.6200 30.5478304544871868 -283.465387772040 +6201 0.6201 30.5761634403330476 -283.194329145200 +6202 0.6202 30.6044693099379828 -282.923062953470 +6203 0.6203 30.6327480425786298 -282.651589859480 +6204 0.6204 30.6609996175978452 -282.379910524830 +6205 0.6205 30.6892240144045871 -282.108025610040 +6206 0.6206 30.7174212124738197 -281.835935774589 +6207 0.6207 30.7455911913463957 -281.563641676920 +6208 0.6208 30.7737339306289641 -281.291143974430 +6209 0.6209 30.8018494099938565 -281.018443323420 +6210 0.6210 30.8299376091789874 -280.745540379190 +6211 0.6211 30.8579985079877481 -280.472435796000 +6212 0.6212 30.8860320862889033 -280.199130227070 +6213 0.6213 30.9140383240164844 -279.925624324520 +6214 0.6214 30.9420172011696870 -279.651918739510 +6215 0.6215 30.9699686978127673 -279.378014122120 +6216 0.6216 30.9978927940749429 -279.103911121420 +6217 0.6217 31.0257894701502828 -278.829610385380 +6218 0.6218 31.0536587062976039 -278.555112561030 +6219 0.6219 31.0815004828403723 -278.280418294310 +6220 0.6220 31.1093147801665921 -278.005528230100 +6221 0.6221 31.1371015787287142 -277.730443012350 +6222 0.6222 31.1648608590435252 -277.455163283890 +6223 0.6223 31.1925926016920485 -277.179689686550 +6224 0.6224 31.2202967873194339 -276.904022861150 +6225 0.6225 31.2479733966348654 -276.628163447490 +6226 0.6226 31.2756224104114544 -276.352112084320 +6227 0.6227 31.3032438094861405 -276.075869409380 +6228 0.6228 31.3308375747595811 -275.799436059429 +6229 0.6229 31.3584036871960592 -275.522812670140 +6230 0.6230 31.3859421278233768 -275.245999876191 +6231 0.6231 31.4134528777327517 -274.968998311300 +6232 0.6232 31.4409359180787220 -274.691808608090 +6233 0.6233 31.4683912300790354 -274.414431398210 +6234 0.6234 31.4958187950145607 -274.136867312320 +6235 0.6235 31.5232185942291778 -273.859116980040 +6236 0.6236 31.5505906091296815 -273.581181029999 +6237 0.6237 31.5779348211856714 -273.303060089790 +6238 0.6238 31.6052512119294633 -273.024754786020 +6239 0.6239 31.6325397629559788 -272.746265744320 +6240 0.6240 31.6598004559226567 -272.467593589260 +6241 0.6241 31.6870332725493427 -272.188738944440 +6242 0.6242 31.7142381946181864 -271.909702432470 +6243 0.6243 31.7414152039735562 -271.630484674960 +6244 0.6244 31.7685642825219290 -271.351086292480 +6245 0.6245 31.7956854122317871 -271.071507904650 +6246 0.6246 31.8227785751335261 -270.791750130110 +6247 0.6247 31.8498437533193552 -270.511813586450 +6248 0.6248 31.8768809289431942 -270.231698890299 +6249 0.6249 31.9038900842205742 -269.951406657309 +6250 0.6250 31.9308712014285447 -269.670937502110 +6251 0.6251 31.9578242629055680 -269.390292038380 +6252 0.6252 31.9847492510514257 -269.109470878790 +6253 0.6253 32.0116461483271166 -268.828474635000 +6254 0.6254 32.0385149372547531 -268.547303917750 +6255 0.6255 32.0653556004174760 -268.265959336750 +6256 0.6256 32.0921681204593483 -267.984441500750 +6257 0.6257 32.1189524800852624 -267.702751017499 +6258 0.6258 32.1457086620608266 -267.420888493800 +6259 0.6259 32.1724366492122869 -267.138854535429 +6260 0.6260 32.1991364244264204 -266.856649747249 +6261 0.6261 32.2258079706504361 -266.574274733110 +6262 0.6262 32.2524512708918891 -266.291730095880 +6263 0.6263 32.2790663082185603 -266.009016437491 +6264 0.6264 32.3056530657583778 -265.726134358900 +6265 0.6265 32.3322115266993251 -265.443084460040 +6266 0.6266 32.3587416742893268 -265.159867339950 +6267 0.6267 32.3852434918361567 -264.876483596689 +6268 0.6268 32.4117169627073523 -264.592933827260 +6269 0.6269 32.4381620703301081 -264.309218627850 +6270 0.6270 32.4645787981911766 -264.025338593579 +6271 0.6271 32.4909671298367897 -263.741294318640 +6272 0.6272 32.5173270488725379 -263.457086396260 +6273 0.6273 32.5436585389632853 -263.172715418710 +6274 0.6274 32.5699615838330843 -262.888181977320 +6275 0.6275 32.5962361672650687 -262.603486662430 +6276 0.6276 32.6224822731013617 -262.318630063470 +6277 0.6277 32.6486998852429764 -262.033612768860 +6278 0.6278 32.6748889876497230 -261.748435366119 +6279 0.6279 32.7010495643401171 -261.463098441790 +6280 0.6280 32.7271815993912796 -261.177602581490 +6281 0.6281 32.7532850769388446 -260.891948369870 +6282 0.6282 32.7793599811768672 -260.606136390610 +6283 0.6283 32.8054062963577238 -260.320167226500 +6284 0.6284 32.8314240067920196 -260.034041459349 +6285 0.6285 32.8574130968484894 -259.747759670050 +6286 0.6286 32.8833735509539196 -259.461322438510 +6287 0.6287 32.9093053535930338 -259.174730343741 +6288 0.6288 32.9352084893084083 -258.887983963800 +6289 0.6289 32.9610829427003864 -258.601083875790 +6290 0.6290 32.9869286984269721 -258.314030655920 +6291 0.6291 33.0127457412037373 -258.026824879430 +6292 0.6292 33.0385340558037370 -257.739467120599 +6293 0.6293 33.0642936270574097 -257.451957952861 +6294 0.6294 33.0900244398524848 -257.164297948651 +6295 0.6295 33.1157264791338903 -256.876487679490 +6296 0.6296 33.1413997299036609 -256.588527715950 +6297 0.6297 33.1670441772208449 -256.300418627739 +6298 0.6298 33.1926598062014122 -256.012160983570 +6299 0.6299 33.2182466020181550 -255.723755351270 +6300 0.6300 33.2438045499006023 -255.435202297730 +6301 0.6301 33.2693336351349345 -255.146502388930 +6302 0.6302 33.2948338430638771 -254.857656189910 +6303 0.6303 33.3203051590866153 -254.568664264800 +6304 0.6304 33.3457475686586946 -254.279527176830 +6305 0.6305 33.3711610572919497 -253.990245488279 +6306 0.6306 33.3965456105543907 -253.700819760540 +6307 0.6307 33.4219012140701182 -253.411250554071 +6308 0.6308 33.4472278535192444 -253.121538428440 +6309 0.6309 33.4725255146377805 -252.831683942300 +6310 0.6310 33.4977941832175645 -252.541687653340 +6311 0.6311 33.5230338451061485 -252.251550118410 +6312 0.6312 33.5482444862067410 -251.961271893420 +6313 0.6313 33.5734260924780799 -251.670853533390 +6314 0.6314 33.5985786499343675 -251.380295592390 +6315 0.6315 33.6237021446451720 -251.089598623670 +6316 0.6316 33.6487965627353276 -250.798763179480 +6317 0.6317 33.6738618903848632 -250.507789811219 +6318 0.6318 33.6988981138288963 -250.216679069390 +6319 0.6319 33.7239052193575475 -249.925431503591 +6320 0.6320 33.7488831933158551 -249.634047662510 +6321 0.6321 33.7738320221036759 -249.342528093930 +6322 0.6322 33.7987516921756139 -249.050873344800 +6323 0.6323 33.8236421900409070 -248.759083961089 +6324 0.6324 33.8485035022633554 -248.467160487900 +6325 0.6325 33.8733356154612224 -248.175103469490 +6326 0.6326 33.8981385163071565 -247.882913449201 +6327 0.6327 33.9229121915280913 -247.590590969440 +6328 0.6328 33.9476566279051539 -247.298136571771 +6329 0.6329 33.9723718122735860 -247.005550796890 +6330 0.6330 33.9970577315226592 -246.712834184540 +6331 0.6331 34.0217143725955680 -246.419987273630 +6332 0.6332 34.0463417224893590 -246.127010602210 +6333 0.6333 34.0709397682548385 -245.833904707360 +6334 0.6334 34.0955084969964730 -245.540670125390 +6335 0.6335 34.1200478958723252 -245.247307391610 +6336 0.6336 34.1445579520939333 -244.953817040560 +6337 0.6337 34.1690386529262540 -244.660199605841 +6338 0.6338 34.1934899856875560 -244.366455620170 +6339 0.6339 34.2179119377493350 -244.072585615460 +6340 0.6340 34.2423044965362422 -243.778590122670 +6341 0.6341 34.2666676495259708 -243.484469671930 +6342 0.6342 34.2910013842491921 -243.190224792480 +6343 0.6343 34.3153056882894489 -242.895856012720 +6344 0.6344 34.3395805492830917 -242.601363860130 +6345 0.6345 34.3638259549191645 -242.306748861371 +6346 0.6346 34.3880418929393414 -242.012011542221 +6347 0.6347 34.4122283511378342 -241.717152427580 +6348 0.6348 34.4363853173612853 -241.422172041500 +6349 0.6349 34.4605127795087185 -241.127070907170 +6350 0.6350 34.4846107255314251 -240.831849546910 +6351 0.6351 34.5086791434328788 -240.536508482150 +6352 0.6352 34.5327180212686642 -240.241048233540 +6353 0.6353 34.5567273471463849 -239.945469320820 +6354 0.6354 34.5807071092255711 -239.649772262840 +6355 0.6355 34.6046572957175940 -239.353957577650 +6356 0.6356 34.6285778948856020 -239.058025782450 +6357 0.6357 34.6524688950444002 -238.761977393549 +6358 0.6358 34.6763302845604002 -238.465812926400 +6359 0.6359 34.7001620518514997 -238.169532895659 +6360 0.6360 34.7239641853870324 -237.873137815060 +6361 0.6361 34.7477366736876618 -237.576628197560 +6362 0.6362 34.7714795053253027 -237.280004555209 +6363 0.6363 34.7951926689230291 -236.983267399250 +6364 0.6364 34.8188761531549957 -236.686417240050 +6365 0.6365 34.8425299467463603 -236.389454587170 +6366 0.6366 34.8661540384731836 -236.092379949299 +6367 0.6367 34.8897484171623660 -235.795193834280 +6368 0.6368 34.9133130716915403 -235.497896749151 +6369 0.6369 34.9368479909890013 -235.200489200080 +6370 0.6370 34.9603531640336271 -234.902971692391 +6371 0.6371 34.9838285798547801 -234.605344730600 +6372 0.6372 35.0072742275322284 -234.307608818360 +6373 0.6373 35.0306900961960750 -234.009764458519 +6374 0.6374 35.0540761750266512 -233.711812153050 +6375 0.6375 35.0774324532544597 -233.413752403130 +6376 0.6376 35.1007589201600680 -233.115585709090 +6377 0.6377 35.1240555650740447 -232.817312570441 +6378 0.6378 35.1473223773768595 -232.518933485850 +6379 0.6379 35.1705593464988127 -232.220448953160 +6380 0.6380 35.1937664619199424 -231.921859469400 +6381 0.6381 35.2169437131699539 -231.623165530760 +6382 0.6382 35.2400910898281197 -231.324367632600 +6383 0.6383 35.2632085815232230 -231.025466269460 +6384 0.6384 35.2862961779334512 -230.726461935100 +6385 0.6385 35.3093538687863244 -230.427355122421 +6386 0.6386 35.3323816438586178 -230.128146323460 +6387 0.6387 35.3553794929762688 -229.828836029520 +6388 0.6388 35.3783474060142993 -229.529424731040 +6389 0.6389 35.4012853728967372 -229.229912917670 +6390 0.6390 35.4241933835965312 -228.930301078180 +6391 0.6391 35.4470714281354731 -228.630589700610 +6392 0.6392 35.4699194965841116 -228.330779272160 +6393 0.6393 35.4927375790616750 -228.030870279161 +6394 0.6394 35.5155256657359928 -227.730863207210 +6395 0.6395 35.5382837468234101 -227.430758541071 +6396 0.6396 35.5610118125886956 -227.130556764670 +6397 0.6397 35.5837098533449847 -226.830258361150 +6398 0.6398 35.6063778594536871 -226.529863812880 +6399 0.6399 35.6290158213244013 -226.229373601340 +6400 0.6400 35.6516237294148297 -225.928788207280 +6401 0.6401 35.6742015742307217 -225.628108110610 +6402 0.6402 35.6967493463257739 -225.327333790490 +6403 0.6403 35.7192670363015594 -225.026465725180 +6404 0.6404 35.7417546348074282 -224.725504392241 +6405 0.6405 35.7642121325404574 -224.424450268380 +6406 0.6406 35.7866395202453518 -224.123303829540 +6407 0.6407 35.8090367887143728 -223.822065550819 +6408 0.6408 35.8314039287872390 -223.520735906571 +6409 0.6409 35.8537409313510835 -223.219315370320 +6410 0.6410 35.8760477873403403 -222.917804414819 +6411 0.6411 35.8983244877366801 -222.616203512030 +6412 0.6412 35.9205710235689395 -222.314513133110 +6413 0.6413 35.9427873859130145 -222.012733748420 +6414 0.6414 35.9649735658918104 -221.710865827539 +6415 0.6415 35.9871295546751497 -221.408909839300 +6416 0.6416 36.0092553434797011 -221.106866251700 +6417 0.6417 36.0313509235688798 -220.804735531940 +6418 0.6418 36.0534162862527978 -220.502518146481 +6419 0.6419 36.0754514228881717 -220.200214560979 +6420 0.6420 36.0974563248782374 -219.897825240300 +6421 0.6421 36.1194309836726788 -219.595350648560 +6422 0.6422 36.1413753907675570 -219.292791249060 +6423 0.6423 36.1632895377052250 -218.990147504320 +6424 0.6424 36.1851734160742495 -218.687419876120 +6425 0.6425 36.2070270175093256 -218.384608825439 +6426 0.6426 36.2288503336912200 -218.081714812490 +6427 0.6427 36.2506433563466786 -217.778738296670 +6428 0.6428 36.2724060772483483 -217.475679736670 +6429 0.6429 36.2941384882146991 -217.172539590360 +6430 0.6430 36.3158405811099598 -216.869318314860 +6431 0.6431 36.3375123478440258 -216.566016366521 +6432 0.6432 36.3591537803723952 -216.262634200881 +6433 0.6433 36.3807648706960762 -215.959172272790 +6434 0.6434 36.4023456108615306 -215.655631036270 +6435 0.6435 36.4238959929605741 -215.352010944590 +6436 0.6436 36.4454160091303194 -215.048312450260 +6437 0.6437 36.4669056515530841 -214.744536005040 +6438 0.6438 36.4883649124563334 -214.440682059881 +6439 0.6439 36.5097937841125812 -214.136751065030 +6440 0.6440 36.5311922588393259 -213.832743469930 +6441 0.6441 36.5525603289989860 -213.528659723290 +6442 0.6442 36.5738979869988015 -213.224500273030 +6443 0.6443 36.5952052252907691 -212.920265566370 +6444 0.6444 36.6164820363715720 -212.615956049700 +6445 0.6445 36.6377284127824936 -212.311572168720 +6446 0.6446 36.6589443471093475 -212.007114368320 +6447 0.6447 36.6801298319823985 -211.702583092700 +6448 0.6448 36.7012848600762922 -211.397978785210 +6449 0.6449 36.7224094241099834 -211.093301888570 +6450 0.6450 36.7435035168466442 -210.788552844660 +6451 0.6451 36.7645671310936066 -210.483732094660 +6452 0.6452 36.7856002597022851 -210.178840078950 +6453 0.6453 36.8066028955680906 -209.873877237220 +6454 0.6454 36.8275750316303743 -209.568844008390 +6455 0.6455 36.8485166608723276 -209.263740830620 +6456 0.6456 36.8694277763209257 -208.958568141340 +6457 0.6457 36.8903083710468565 -208.653326377241 +6458 0.6458 36.9111584381644349 -208.348015974270 +6459 0.6459 36.9319779708315323 -208.042637367630 +6460 0.6460 36.9527669622495054 -207.737190991790 +6461 0.6461 36.9735254056631177 -207.431677280470 +6462 0.6462 36.9942532943604760 -207.126096666640 +6463 0.6463 37.0149506216729378 -206.820449582580 +6464 0.6464 37.0356173809750544 -206.514736459790 +6465 0.6465 37.0562535656844929 -206.208957729041 +6466 0.6466 37.0768591692619651 -205.903113820380 +6467 0.6467 37.0974341852111422 -205.597205163151 +6468 0.6468 37.1179786070785980 -205.291232185900 +6469 0.6469 37.1384924284537163 -204.985195316490 +6470 0.6470 37.1589756429686418 -204.679094982050 +6471 0.6471 37.1794282442981938 -204.372931608949 +6472 0.6472 37.1998502261597821 -204.066705622859 +6473 0.6473 37.2202415823133634 -203.760417448740 +6474 0.6474 37.2406023065613425 -203.454067510790 +6475 0.6475 37.2609323927485079 -203.147656232491 +6476 0.6476 37.2812318347619609 -202.841184036600 +6477 0.6477 37.3015006265310518 -202.534651345180 +6478 0.6478 37.3217387620272874 -202.228058579540 +6479 0.6479 37.3419462352642810 -201.921406160280 +6480 0.6480 37.3621230402976607 -201.614694507280 +6481 0.6481 37.3822691712250119 -201.307924039690 +6482 0.6482 37.4023846221857923 -201.001095175960 +6483 0.6483 37.4224693873612821 -200.694208333811 +6484 0.6484 37.4425234609744848 -200.387263930280 +6485 0.6485 37.4625468372900770 -200.080262381611 +6486 0.6486 37.4825395106143304 -199.773204103441 +6487 0.6487 37.5025014752950341 -199.466089510600 +6488 0.6488 37.5224327257214298 -199.158919017270 +6489 0.6489 37.5423332563241345 -198.851693036891 +6490 0.6490 37.5622030615750901 -198.544411982190 +6491 0.6491 37.5820421359874572 -198.237076265210 +6492 0.6492 37.6018504741155795 -197.929686297250 +6493 0.6493 37.6216280705548911 -197.622242488960 +6494 0.6494 37.6413749199418461 -197.314745250210 +6495 0.6495 37.6610910169538684 -197.007194990230 +6496 0.6496 37.6807763563092522 -196.699592117500 +6497 0.6497 37.7004309327671194 -196.391937039850 +6498 0.6498 37.7200547411273277 -196.084230164341 +6499 0.6499 37.7396477762304130 -195.776471897370 +6500 0.6500 37.7592100329575118 -195.468662644640 +6501 0.6501 37.7787415062303040 -195.160802811140 +6502 0.6502 37.7982421910109210 -194.852892801190 +6503 0.6503 37.8177120823018953 -194.544933018360 +6504 0.6504 37.8371511751460901 -194.236923865560 +6505 0.6505 37.8565594646266206 -193.928865745000 +6506 0.6506 37.8759369458667834 -193.620759058220 +6507 0.6507 37.8952836140299922 -193.312604206010 +6508 0.6508 37.9145994643197213 -193.004401588500 +6509 0.6509 37.9338844919794056 -192.696151605151 +6510 0.6510 37.9531386922923986 -192.387854654690 +6511 0.6511 37.9723620605818937 -192.079511135190 +6512 0.6512 37.9915545922108535 -191.771121444011 +6513 0.6513 38.0107162825819458 -191.462685977850 +6514 0.6514 38.0298471271374723 -191.154205132681 +6515 0.6515 38.0489471213592978 -190.845679303820 +6516 0.6516 38.0680162607687862 -190.537108885920 +6517 0.6517 38.0870545409267294 -190.228494272890 +6518 0.6518 38.1060619574332762 -189.919835858010 +6519 0.6519 38.1250385059278685 -189.611134033859 +6520 0.6520 38.1439841820891772 -189.302389192320 +6521 0.6521 38.1628989816350241 -188.993601724620 +6522 0.6522 38.1817829003223181 -188.684772021300 +6523 0.6523 38.2006359339469981 -188.375900472230 +6524 0.6524 38.2194580783439406 -188.066987466560 +6525 0.6525 38.2382493293869103 -187.758033392840 +6526 0.6526 38.2570096829884960 -187.449038638870 +6527 0.6527 38.2757391351000322 -187.140003591850 +6528 0.6528 38.2944376817115355 -186.830928638210 +6529 0.6529 38.3131053188516333 -186.521814163811 +6530 0.6530 38.3317420425875142 -186.212660553790 +6531 0.6531 38.3503478490248355 -185.903468192580 +6532 0.6532 38.3689227343076666 -185.594237464020 +6533 0.6533 38.3874666946184320 -185.284968751250 +6534 0.6534 38.4059797261778328 -184.975662436700 +6535 0.6535 38.4244618252447765 -184.666318902190 +6536 0.6536 38.4429129881163263 -184.356938528870 +6537 0.6537 38.4613332111276307 -184.047521697200 +6538 0.6538 38.4797224906518380 -183.738068786960 +6539 0.6539 38.4980808231000537 -183.428580177320 +6540 0.6540 38.5164082049212553 -183.119056246750 +6541 0.6541 38.5347046326022493 -182.809497373079 +6542 0.6542 38.5529701026675724 -182.499903933441 +6543 0.6543 38.5712046116794625 -182.190276304380 +6544 0.6544 38.5894081562377664 -181.880614861700 +6545 0.6545 38.6075807329798835 -181.570919980581 +6546 0.6546 38.6257223385806938 -181.261192035580 +6547 0.6547 38.6438329697525020 -180.951431400550 +6548 0.6548 38.6619126232449659 -180.641638448720 +6549 0.6549 38.6799612958450325 -180.331813552630 +6550 0.6550 38.6979789843768742 -180.021957084220 +6551 0.6551 38.7159656857018248 -179.712069414730 +6552 0.6552 38.7339213967183014 -179.402150914781 +6553 0.6553 38.7518461143617543 -179.092201954310 +6554 0.6554 38.7697398356046037 -178.782222902630 +6555 0.6555 38.7876025574561538 -178.472214128430 +6556 0.6556 38.8054342769625578 -178.162175999680 +6557 0.6557 38.8232349912067320 -177.852108883781 +6558 0.6558 38.8410046973082927 -177.542013147430 +6559 0.6559 38.8587433924234986 -177.231889156710 +6560 0.6560 38.8764510737451872 -176.921737277050 +6561 0.6561 38.8941277385027036 -176.611557873250 +6562 0.6562 38.9117733839618367 -176.301351309449 +6563 0.6563 38.9293880074247625 -175.991117949130 +6564 0.6564 38.9469716062299796 -175.680858155200 +6565 0.6565 38.9645241777522315 -175.370572289869 +6566 0.6566 38.9820457194024641 -175.060260714720 +6567 0.6567 38.9995362286277327 -174.749923790680 +6568 0.6568 39.0169957029111742 -174.439561878110 +6569 0.6569 39.0344241397719145 -174.129175336670 +6570 0.6570 39.0518215367650185 -173.818764525380 +6571 0.6571 39.0691878914814197 -173.508329802660 +6572 0.6572 39.0865232015478696 -173.197871526310 +6573 0.6573 39.1038274646268604 -172.887390053440 +6574 0.6574 39.1211006784165605 -172.576885740560 +6575 0.6575 39.1383428406507647 -172.266358943580 +6576 0.6576 39.1555539490988309 -171.955810017750 +6577 0.6577 39.1727340015656011 -171.645239317660 +6578 0.6578 39.1898829958913524 -171.334647197340 +6579 0.6579 39.2070009299517253 -171.024034010130 +6580 0.6580 39.2240878016576744 -170.713400108800 +6581 0.6581 39.2411436089553831 -170.402745845440 +6582 0.6582 39.2581683498262350 -170.092071571570 +6583 0.6583 39.2751620222867146 -169.781377638021 +6584 0.6584 39.2921246243883715 -169.470664395070 +6585 0.6585 39.3090561542177426 -169.159932192330 +6586 0.6586 39.3259566098963020 -168.849181378830 +6587 0.6587 39.3428259895803905 -168.538412302901 +6588 0.6588 39.3596642914611508 -168.227625312360 +6589 0.6589 39.3764715137644856 -167.916820754310 +6590 0.6590 39.3932476547509651 -167.605998975310 +6591 0.6591 39.4099927127157912 -167.295160321270 +6592 0.6592 39.4267066859887265 -166.984305137480 +6593 0.6593 39.4433895729340307 -166.673433768600 +6594 0.6594 39.4600413719503962 -166.362546558740 +6595 0.6595 39.4766620814708986 -166.051643851310 +6596 0.6596 39.4932516999629257 -165.740725989210 +6597 0.6597 39.5098102259281134 -165.429793314610 +6598 0.6598 39.5263376579023031 -165.118846169170 +6599 0.6599 39.5428339944554565 -164.807884893880 +6600 0.6600 39.5592992341916059 -164.496909829150 +6601 0.6601 39.5757333757488041 -164.185921314780 +6602 0.6602 39.5921364177990398 -163.874919689940 +6603 0.6603 39.6085083590482014 -163.563905293230 +6604 0.6604 39.6248491982359923 -163.252878462599 +6605 0.6605 39.6411589341358948 -162.941839535450 +6606 0.6606 39.6574375655550924 -162.630788848520 +6607 0.6607 39.6736850913344199 -162.319726737990 +6608 0.6608 39.6899015103482924 -162.008653539420 +6609 0.6609 39.7060868215046554 -161.697569587770 +6610 0.6610 39.7222410237449139 -161.386475217390 +6611 0.6611 39.7383641160438827 -161.075370762050 +6612 0.6612 39.7544560974097294 -160.764256554909 +6613 0.6613 39.7705169668839034 -160.453132928530 +6614 0.6614 39.7865467235410719 -160.142000214881 +6615 0.6615 39.8025453664890847 -159.830858745330 +6616 0.6616 39.8185128948688813 -159.519708850640 +6617 0.6617 39.8344493078544630 -159.208550861030 +6618 0.6618 39.8503546046528143 -158.897385106050 +6619 0.6619 39.8662287845038534 -158.586211914710 +6620 0.6620 39.8820718466803612 -158.275031615410 +6621 0.6621 39.8978837904879313 -157.963844535951 +6622 0.6622 39.9136646152649064 -157.652651003560 +6623 0.6623 39.9294143203823282 -157.341451344900 +6624 0.6624 39.9451329052438737 -157.030245885951 +6625 0.6625 39.9608203692857842 -156.719034952210 +6626 0.6626 39.9764767119768223 -156.407818868520 +6627 0.6627 39.9921019328182084 -156.096597959199 +6628 0.6628 40.0076960313435634 -155.785372547890 +6629 0.6629 40.0232590071188454 -155.474142957740 +6630 0.6630 40.0387908597422992 -155.162909511280 +6631 0.6631 40.0542915888443858 -154.851672530440 +6632 0.6632 40.0697611940877394 -154.540432336570 +6633 0.6633 40.0851996751670896 -154.229189250470 +6634 0.6634 40.1006070318092327 -153.917943592350 +6635 0.6635 40.1159832637729394 -153.606695681779 +6636 0.6636 40.1313283708489195 -153.295445837840 +6637 0.6637 40.1466423528597645 -152.984194379010 +6638 0.6638 40.1619252096598700 -152.672941623140 +6639 0.6639 40.1771769411354072 -152.361687887550 +6640 0.6640 40.1923975472042372 -152.050433488990 +6641 0.6641 40.2075870278158689 -151.739178743600 +6642 0.6642 40.2227453829513948 -151.427923966950 +6643 0.6643 40.2378726126234483 -151.116669474100 +6644 0.6644 40.2529687168761257 -150.805415579450 +6645 0.6645 40.2680336957849434 -150.494162596860 +6646 0.6646 40.2830675494567672 -150.182910839650 +6647 0.6647 40.2980702780297761 -149.871660620551 +6648 0.6648 40.3130418816733922 -149.560412251700 +6649 0.6649 40.3279823605882086 -149.249166044680 +6650 0.6650 40.3428917150059689 -148.937922310550 +6651 0.6651 40.3577699451894816 -148.626681359729 +6652 0.6652 40.3726170514325773 -148.315443502120 +6653 0.6653 40.3874330340600380 -148.004209047030 +6654 0.6654 40.4022178934275544 -147.692978303250 +6655 0.6655 40.4169716299216617 -147.381751578930 +6656 0.6656 40.4316942439596971 -147.070529181729 +6657 0.6657 40.4463857359897219 -146.759311418720 +6658 0.6658 40.4610461064904783 -146.448098596410 +6659 0.6659 40.4756753559713331 -146.136891020720 +6660 0.6660 40.4902734849722208 -145.825688997060 +6661 0.6661 40.5048404940635862 -145.514492830270 +6662 0.6662 40.5193763838463283 -145.203302824591 +6663 0.6663 40.5338811549517430 -144.892119283770 +6664 0.6664 40.5483548080414806 -144.580942510930 +6665 0.6665 40.5627973438074605 -144.269772808701 +6666 0.6666 40.5772087629718499 -143.958610479100 +6667 0.6667 40.5915890662869856 -143.647455823640 +6668 0.6668 40.6059382545353316 -143.336309143259 +6669 0.6669 40.6202563285294076 -143.025170738330 +6670 0.6670 40.6345432891117611 -142.714040908700 +6671 0.6671 40.6487991371548745 -142.402919953621 +6672 0.6672 40.6630238735611513 -142.091808171870 +6673 0.6673 40.6772174992628237 -141.780705861600 +6674 0.6674 40.6913800152219238 -141.469613320450 +6675 0.6675 40.7055114224302201 -141.158530845500 +6676 0.6676 40.7196117219091605 -140.847458733289 +6677 0.6677 40.7336809147098151 -140.536397279820 +6678 0.6678 40.7477190019128344 -140.225346780530 +6679 0.6679 40.7617259846283773 -139.914307530320 +6680 0.6680 40.7757018639960691 -139.603279823549 +6681 0.6681 40.7896466411849445 -139.292263954020 +6682 0.6682 40.8035603173933978 -138.981260215040 +6683 0.6683 40.8174428938491118 -138.670268899269 +6684 0.6684 40.8312943718090224 -138.359290298950 +6685 0.6685 40.8451147525592546 -138.048324705710 +6686 0.6686 40.8589040374150727 -137.737372410660 +6687 0.6687 40.8726622277208236 -137.426433704360 +6688 0.6688 40.8863893248498869 -137.115508876840 +6689 0.6689 40.9000853302046110 -136.804598217610 +6690 0.6690 40.9137502452162707 -136.493702015610 +6691 0.6691 40.9273840713450170 -136.182820559270 +6692 0.6692 40.9409868100798064 -135.871954136450 +6693 0.6693 40.9545584629383583 -135.561103034540 +6694 0.6694 40.9680990314670979 -135.250267540320 +6695 0.6695 40.9816085172411206 -134.939447940100 +6696 0.6696 40.9950869218641074 -134.628644519610 +6697 0.6697 41.0085342469682885 -134.317857564080 +6698 0.6698 41.0219504942144013 -134.007087358200 +6699 0.6699 41.0353356652916190 -133.696334186150 +6700 0.6700 41.0486897619175011 -133.385598331530 +6701 0.6701 41.0620127858379504 -133.074880077430 +6702 0.6702 41.0753047388271426 -132.764179706480 +6703 0.6703 41.0885656226875042 -132.453497500690 +6704 0.6704 41.1017954392496137 -132.142833741560 +6705 0.6705 41.1149941903722009 -131.832188710140 +6706 0.6706 41.1281618779420484 -131.521562686860 +6707 0.6707 41.1412985038739762 -131.210955951699 +6708 0.6708 41.1544040701107647 -130.900368784050 +6709 0.6709 41.1674785786231112 -130.589801462830 +6710 0.6710 41.1805220314095735 -130.279254266420 +6711 0.6711 41.1935344304965270 -129.968727472680 +6712 0.6712 41.2065157779381082 -129.658221358930 +6713 0.6713 41.2194660758161575 -129.347736202030 +6714 0.6714 41.2323853262401698 -129.037272278240 +6715 0.6715 41.2452735313472516 -128.726829863350 +6716 0.6716 41.2581306933020500 -128.416409232650 +6717 0.6717 41.2709568142967242 -128.106010660880 +6718 0.6718 41.2837518965508821 -127.795634422239 +6719 0.6719 41.2965159423115153 -127.485280790470 +6720 0.6720 41.3092489538529790 -127.174950038790 +6721 0.6721 41.3219509334769128 -126.864642439870 +6722 0.6722 41.3346218835121988 -126.554358265880 +6723 0.6723 41.3472618063149184 -126.244097788500 +6724 0.6724 41.3598707042682889 -125.933861278890 +6725 0.6725 41.3724485797826134 -125.623649007650 +6726 0.6726 41.3849954352952452 -125.313461244949 +6727 0.6727 41.3975112732705099 -125.003298260400 +6728 0.6728 41.4099960961996842 -124.693160323120 +6729 0.6729 41.4224499066009244 -124.383047701710 +6730 0.6730 41.4348727070192240 -124.072960664271 +6731 0.6731 41.4472645000263569 -123.762899478380 +6732 0.6732 41.4596252882208347 -123.452864411151 +6733 0.6733 41.4719550742278500 -123.142855729140 +6734 0.6734 41.4842538606992264 -122.832873698439 +6735 0.6735 41.4965216503133760 -122.522918584620 +6736 0.6736 41.5087584457752428 -122.212990652730 +6737 0.6737 41.5209642498162452 -121.903090167370 +6738 0.6738 41.5331390651942414 -121.593217392590 +6739 0.6739 41.5452828946934645 -121.283372591940 +6740 0.6740 41.5573957411244876 -120.973556028520 +6741 0.6741 41.5694776073241599 -120.663767964870 +6742 0.6742 41.5815284961555562 -120.354008663070 +6743 0.6743 41.5935484105079425 -120.044278384679 +6744 0.6744 41.6055373532967181 -119.734577390780 +6745 0.6745 41.6174953274633523 -119.424905941950 +6746 0.6746 41.6294223359753630 -119.115264298251 +6747 0.6747 41.6413183818262382 -118.805652719270 +6748 0.6748 41.6531834680354081 -118.496071464110 +6749 0.6749 41.6650175976481805 -118.186520791370 +6750 0.6750 41.6768207737357059 -117.877000959131 +6751 0.6751 41.6885929993949134 -117.567512225020 +6752 0.6752 41.7003342777484747 -117.258054846170 +6753 0.6753 41.7120446119447408 -116.948629079170 +6754 0.6754 41.7237240051577061 -116.639235180180 +6755 0.6755 41.7353724605869587 -116.329873404860 +6756 0.6756 41.7469899814576166 -116.020544008340 +6757 0.6757 41.7585765710202992 -115.711247245310 +6758 0.6758 41.7701322325510631 -115.401983369959 +6759 0.6759 41.7816569693513600 -115.092752635979 +6760 0.6760 41.7931507847479864 -114.783555296560 +6761 0.6761 41.8046136820930343 -114.474391604450 +6762 0.6762 41.8160456647638483 -114.165261811881 +6763 0.6763 41.8274467361629689 -113.856166170600 +6764 0.6764 41.8388168997180969 -113.547104931890 +6765 0.6765 41.8501561588820223 -113.238078346561 +6766 0.6766 41.8614645171325961 -112.929086664870 +6767 0.6767 41.8727419779726731 -112.620130136690 +6768 0.6768 41.8839885449300766 -112.311209011340 +6769 0.6769 41.8952042215575275 -112.002323537690 +6770 0.6770 41.9063890114326156 -111.693473964130 +6771 0.6771 41.9175429181577499 -111.384660538580 +6772 0.6772 41.9286659453601018 -111.075883508461 +6773 0.6773 41.9397580966915626 -110.767143120700 +6774 0.6774 41.9508193758286865 -110.458439621801 +6775 0.6775 41.9618497864726621 -110.149773257770 +6776 0.6776 41.9728493323492557 -109.841144274120 +6777 0.6777 41.9838180172087547 -109.532552915880 +6778 0.6778 41.9947558448259315 -109.223999427650 +6779 0.6779 42.0056628189999941 -108.915484053550 +6780 0.6780 42.0165389435545293 -108.607007037171 +6781 0.6781 42.0273842223374743 -108.298568621690 +6782 0.6782 42.0381986592210453 -107.990169049800 +6783 0.6783 42.0489822581017236 -107.681808563710 +6784 0.6784 42.0597350229001634 -107.373487405151 +6785 0.6785 42.0704569575611913 -107.065205815440 +6786 0.6786 42.0811480660537285 -106.756964035350 +6787 0.6787 42.0918083523707551 -106.448762305230 +6788 0.6788 42.1024378205292678 -106.140600864960 +6789 0.6789 42.1130364745702153 -105.832479953940 +6790 0.6790 42.1236043185584705 -105.524399811120 +6791 0.6791 42.1341413565827736 -105.216360674970 +6792 0.6792 42.1446475927556961 -104.908362783510 +6793 0.6793 42.1551230312135843 -104.600406374269 +6794 0.6794 42.1655676761165168 -104.292491684350 +6795 0.6795 42.1759815316482545 -103.984618950360 +6796 0.6796 42.1863646020161980 -103.676788408460 +6797 0.6797 42.1967168914513380 -103.369000294359 +6798 0.6798 42.2070384042082196 -103.061254843280 +6799 0.6799 42.2173291445648857 -102.753552290020 +6800 0.6800 42.2275891168228341 -102.445892868880 +6801 0.6801 42.2378183253069608 -102.138276813710 +6802 0.6802 42.2480167743655457 -101.830704357930 +6803 0.6803 42.2581844683701675 -101.523175734500 +6804 0.6804 42.2683214117156894 -101.215691175870 +6805 0.6805 42.2784276088201878 -100.908250914081 +6806 0.6806 42.2885030641249244 -100.600855180720 +6807 0.6807 42.2985477820943032 -100.293504206909 +6808 0.6808 42.3085617672158136 -99.986198223300 +6809 0.6809 42.3185450239999881 -99.678937460119 +6810 0.6810 42.3284975569803521 -99.371722147120 +6811 0.6811 42.3384193707133889 -99.064552513610 +6812 0.6812 42.3483104697784896 -98.757428788450 +6813 0.6813 42.3581708587779104 -98.450351200030 +6814 0.6814 42.3680005423367305 -98.143319976330 +6815 0.6815 42.3777995251027875 -97.836335344849 +6816 0.6816 42.3875678117466634 -97.529397532620 +6817 0.6817 42.3973054069616069 -97.222506766290 +6818 0.6818 42.4070123154635183 -96.915663271990 +6819 0.6819 42.4166885419908866 -96.608867275420 +6820 0.6820 42.4263340913047529 -96.302119001890 +6821 0.6821 42.4359489681886544 -95.995418676201 +6822 0.6822 42.4455331774486027 -95.688766522710 +6823 0.6823 42.4550867239130056 -95.382162765380 +6824 0.6824 42.4646096124326604 -95.075607627670 +6825 0.6825 42.4741018478806751 -94.769101332639 +6826 0.6826 42.4835634351524547 -94.462644102889 +6827 0.6827 42.4929943791656299 -94.156236160580 +6828 0.6828 42.5023946848600289 -93.849877727411 +6829 0.6829 42.5117643571976345 -93.543569024680 +6830 0.6830 42.5211034011625273 -93.237310273210 +6831 0.6831 42.5304118217608575 -92.931101693420 +6832 0.6832 42.5396896240207880 -92.624943505240 +6833 0.6833 42.5489368129924586 -92.318835928199 +6834 0.6834 42.5581533937479364 -92.012779181399 +6835 0.6835 42.5673393713811805 -91.706773483450 +6836 0.6836 42.5764947510079850 -91.400819052590 +6837 0.6837 42.5856195377659432 -91.094916106580 +6838 0.6838 42.5947137368144126 -90.789064862760 +6839 0.6839 42.6037773533344506 -90.483265538040 +6840 0.6840 42.6128103925287931 -90.177518348870 +6841 0.6841 42.6218128596218051 -89.871823511309 +6842 0.6842 42.6307847598594165 -89.566181240951 +6843 0.6843 42.6397260985091151 -89.260591752970 +6844 0.6844 42.6486368808598684 -88.955055262079 +6845 0.6845 42.6575171122221022 -88.649571982640 +6846 0.6846 42.6663667979276582 -88.344142128480 +6847 0.6847 42.6751859433297369 -88.038765913070 +6848 0.6848 42.6839745538028623 -87.733443549440 +6849 0.6849 42.6927326347428462 -87.428175250170 +6850 0.6850 42.7014601915667242 -87.122961227420 +6851 0.6851 42.7101572297127419 -86.817801692941 +6852 0.6852 42.7188237546402902 -86.512696858030 +6853 0.6853 42.7274597718298708 -86.207646933580 +6854 0.6854 42.7360652867830524 -85.902652130039 +6855 0.6855 42.7446403050224291 -85.597712657450 +6856 0.6856 42.7531848320915699 -85.292828725420 +6857 0.6857 42.7616988735549981 -84.988000543121 +6858 0.6858 42.7701824349981194 -84.683228319360 +6859 0.6859 42.7786355220272085 -84.378512262440 +6860 0.6860 42.7870581402693446 -84.073852580280 +6861 0.6861 42.7954502953723761 -83.769249480380 +6862 0.6862 42.8038119930048850 -83.464703169860 +6863 0.6863 42.8121432388561445 -83.160213855310 +6864 0.6864 42.8204440386360616 -82.855781743020 +6865 0.6865 42.8287143980751495 -82.551407038780 +6866 0.6866 42.8369543229244911 -82.247089948019 +6867 0.6867 42.8451638189556760 -81.942830675700 +6868 0.6868 42.8533428919607786 -81.638629426399 +6869 0.6869 42.8614915477523084 -81.334486404250 +6870 0.6870 42.8696097921631747 -81.030401813020 +6871 0.6871 42.8776976310466225 -80.726375856000 +6872 0.6872 42.8857550702762254 -80.422408736120 +6873 0.6873 42.8937821157458217 -80.118500655860 +6874 0.6874 42.9017787733694789 -79.814651817280 +6875 0.6875 42.9097450490814438 -79.510862422080 +6876 0.6876 42.9176809488361215 -79.207132671490 +6877 0.6877 42.9255864786080110 -78.903462766350 +6878 0.6878 42.9334616443916843 -78.599852907099 +6879 0.6879 42.9413064522017294 -78.296303293761 +6880 0.6880 42.9491209080727145 -77.992814125950 +6881 0.6881 42.9569050180591532 -77.689385602840 +6882 0.6882 42.9646587882354609 -77.386017923251 +6883 0.6883 42.9723822246958989 -77.082711285570 +6884 0.6884 42.9800753335545664 -76.779465887750 +6885 0.6885 42.9877381209453233 -76.476281927379 +6886 0.6886 42.9953705930217751 -76.173159601610 +6887 0.6887 43.0029727559572166 -75.870099107209 +6888 0.6888 43.0105446159446032 -75.567100640530 +6889 0.6889 43.0180861791965086 -75.264164397509 +6890 0.6890 43.0255974519450675 -74.961290573710 +6891 0.6891 43.0330784404419688 -74.658479364261 +6892 0.6892 43.0405291509583776 -74.355730963890 +6893 0.6893 43.0479495897849205 -74.053045566960 +6894 0.6894 43.0553397632316361 -73.750423367390 +6895 0.6895 43.0626996776279398 -73.447864558690 +6896 0.6896 43.0700293393225735 -73.145369334040 +6897 0.6897 43.0773287546835846 -72.842937886130 +6898 0.6898 43.0845979300982549 -72.540570407330 +6899 0.6899 43.0918368719731006 -72.238267089529 +6900 0.6900 43.0990455867337943 -71.936028124310 +6901 0.6901 43.1062240808251502 -71.633853702780 +6902 0.6902 43.1133723607110753 -71.331744015691 +6903 0.6903 43.1204904328745258 -71.029699253379 +6904 0.6904 43.1275783038174865 -70.727719605819 +6905 0.6905 43.1346359800609065 -70.425805262540 +6906 0.6906 43.1416634681446709 -70.123956412690 +6907 0.6907 43.1486607746275581 -69.822173245069 +6908 0.6908 43.1556279060872114 -69.520455948011 +6909 0.6909 43.1625648691200894 -69.218804709520 +6910 0.6910 43.1694716703414230 -68.917219717170 +6911 0.6911 43.1763483163851873 -68.615701158150 +6912 0.6912 43.1831948139040591 -68.314249219280 +6913 0.6913 43.1900111695693667 -68.012864086940 +6914 0.6914 43.1967973900710689 -67.711545947170 +6915 0.6915 43.2035534821177052 -67.410294985601 +6916 0.6916 43.2102794524363603 -67.109111387470 +6917 0.6917 43.2169753077726142 -66.807995337640 +6918 0.6918 43.2236410548905212 -66.506947020550 +6919 0.6919 43.2302767005725599 -66.205966620289 +6920 0.6920 43.2368822516196047 -65.905054320560 +6921 0.6921 43.2434577148508623 -65.604210304660 +6922 0.6922 43.2500030971038711 -65.303434755500 +6923 0.6923 43.2565184052344236 -65.002727855610 +6924 0.6924 43.2630036461165588 -64.702089787150 +6925 0.6925 43.2694588266425129 -64.401520731880 +6926 0.6926 43.2758839537226621 -64.101020871170 +6927 0.6927 43.2822790342855228 -63.800590386030 +6928 0.6928 43.2886440752776807 -63.500229457060 +6929 0.6929 43.2949790836637618 -63.199938264510 +6930 0.6930 43.3012840664263976 -62.899716988210 +6931 0.6931 43.3075590305661891 -62.599565807650 +6932 0.6932 43.3138039831016641 -62.299484901921 +6933 0.6933 43.3200189310692423 -61.999474449700 +6934 0.6934 43.3262038815231918 -61.699534629340 +6935 0.6935 43.3323588415356014 -61.399665618820 +6936 0.6936 43.3384838181963232 -61.099867595661 +6937 0.6937 43.3445788186129590 -60.800140737090 +6938 0.6938 43.3506438499108100 -60.500485219920 +6939 0.6939 43.3566789192328343 -60.200901220600 +6940 0.6940 43.3626840337396260 -59.901388915180 +6941 0.6941 43.3686592006093505 -59.601948479370 +6942 0.6942 43.3746044270377453 -59.302580088480 +6943 0.6943 43.3805197202380413 -59.003283917440 +6944 0.6944 43.3864050874409557 -58.704060140830 +6945 0.6945 43.3922605358946427 -58.404908932850 +6946 0.6946 43.3980860728646505 -58.105830467300 +6947 0.6947 43.4038817056338999 -57.806824917649 +6948 0.6948 43.4096474415026279 -57.507892456980 +6949 0.6949 43.4153832877883730 -57.209033257980 +6950 0.6950 43.4210892518259186 -56.910247492990 +6951 0.6951 43.4267653409672647 -56.611535333980 +6952 0.6952 43.4324115625815921 -56.312896952570 +6953 0.6953 43.4380279240552198 -56.014332519940 +6954 0.6954 43.4436144327915628 -55.715842206980 +6955 0.6955 43.4491710962111242 -55.417426184190 +6956 0.6956 43.4546979217514178 -55.119084621670 +6957 0.6957 43.4601949168669606 -54.820817689190 +6958 0.6958 43.4656620890292231 -54.522625556129 +6959 0.6959 43.4710994457266082 -54.224508391530 +6960 0.6960 43.4765069944643869 -53.926466364051 +6961 0.6961 43.4818847427646915 -53.628499641970 +6962 0.6962 43.4872326981664514 -53.330608393230 +6963 0.6963 43.4925508682253792 -53.032792785390 +6964 0.6964 43.4978392605139348 -52.735052985660 +6965 0.6965 43.5030978826212618 -52.437389160889 +6966 0.6966 43.5083267421531801 -52.139801477540 +6967 0.6967 43.5135258467321435 -51.842290101740 +6968 0.6968 43.5186952039971899 -51.544855199230 +6969 0.6969 43.5238348216039270 -51.247496935450 +6970 0.6970 43.5289447072244684 -50.950215475380 +6971 0.6971 43.5340248685474265 -50.653010983719 +6972 0.6972 43.5390753132778485 -50.355883624789 +6973 0.6973 43.5440960491372167 -50.058833562551 +6974 0.6974 43.5490870838633768 -49.761860960600 +6975 0.6975 43.5540484252105173 -49.464965982170 +6976 0.6976 43.5589800809491337 -49.168148790160 +6977 0.6977 43.5638820588659996 -48.871409547100 +6978 0.6978 43.5687543667641108 -48.574748415160 +6979 0.6979 43.5735970124626775 -48.278165556149 +6980 0.6980 43.5784100037970603 -47.981661131560 +6981 0.6981 43.5831933486187637 -47.685235302470 +6982 0.6982 43.5879470547953716 -47.388888229640 +6983 0.6983 43.5926711302105261 -47.092620073500 +6984 0.6984 43.5973655827639064 -46.796430994070 +6985 0.6985 43.6020304203711646 -46.500321151050 +6986 0.6986 43.6066656509639046 -46.204290703810 +6987 0.6987 43.6112712824896605 -45.908339811310 +6988 0.6988 43.6158473229118400 -45.612468632210 +6989 0.6989 43.6203937802096888 -45.316677324800 +6990 0.6990 43.6249106623782836 -45.020966047030 +6991 0.6991 43.6293979774284608 -44.725334956500 +6992 0.6992 43.6338557333868096 -44.429784210440 +6993 0.6993 43.6382839382956220 -44.134313965750 +6994 0.6994 43.6426826002128578 -43.838924378990 +6995 0.6995 43.6470517272121228 -43.543615606330 +6996 0.6996 43.6513913273826191 -43.248387803660 +6997 0.6997 43.6557014088291240 -42.953241126490 +6998 0.6998 43.6599819796719473 -42.658175729960 +6999 0.6999 43.6642330480468885 -42.363191768900 +7000 0.7000 43.6684546221052230 -42.068289397780 +7001 0.7001 43.6726467100136517 -41.773468770740 +7002 0.7002 43.6768093199542662 -41.478730041540 +7003 0.7003 43.6809424601245269 -41.184073363650 +7004 0.7004 43.6850461387372206 -40.889498890170 +7005 0.7005 43.6891203640204182 -40.595006773840 +7006 0.7006 43.6931651442174669 -40.300597167070 +7007 0.7007 43.6971804875869196 -40.006270221959 +7008 0.7008 43.7011664024025279 -39.712026090220 +7009 0.7009 43.7051228969531991 -39.417864923250 +7010 0.7010 43.7090499795429679 -39.123786872120 +7011 0.7011 43.7129476584909469 -38.829792087530 +7012 0.7012 43.7168159421313121 -38.535880719840 +7013 0.7013 43.7206548388132603 -38.242052919120 +7014 0.7014 43.7244643569009668 -37.948308835051 +7015 0.7015 43.7282445047735706 -37.654648616990 +7016 0.7016 43.7319952908251182 -37.361072413980 +7017 0.7017 43.7357167234645487 -37.067580374700 +7018 0.7018 43.7394088111156591 -36.774172647500 +7019 0.7019 43.7430715622170538 -36.480849380399 +7020 0.7020 43.7467049852221308 -36.187610721080 +7021 0.7021 43.7503090885990318 -35.894456816900 +7022 0.7022 43.7538838808306210 -35.601387814871 +7023 0.7023 43.7574293704144495 -35.308403861670 +7024 0.7024 43.7609455658627127 -35.015505103640 +7025 0.7025 43.7644324757022360 -34.722691686820 +7026 0.7026 43.7678901084744183 -34.429963756860 +7027 0.7027 43.7713184727352171 -34.137321459149 +7028 0.7028 43.7747175770551067 -33.844764938680 +7029 0.7029 43.7780874300190490 -33.552294340160 +7030 0.7030 43.7814280402264515 -33.259909807950 +7031 0.7031 43.7847394162911527 -32.967611486069 +7032 0.7032 43.7880215668413655 -32.675399518240 +7033 0.7033 43.7912745005196697 -32.383274047820 +7034 0.7034 43.7944982259829558 -32.091235217870 +7035 0.7035 43.7976927519024031 -31.799283171090 +7036 0.7036 43.8008580869634514 -31.507418049880 +7037 0.7037 43.8039942398657587 -31.215639996311 +7038 0.7038 43.8071012193231795 -30.923949152120 +7039 0.7039 43.8101790340637223 -30.632345658710 +7040 0.7040 43.8132276928295141 -30.340829657180 +7041 0.7041 43.8162472043767863 -30.049401288290 +7042 0.7042 43.8192375774758247 -29.758060692480 +7043 0.7043 43.8221988209109412 -29.466808009870 +7044 0.7044 43.8251309434804455 -29.175643380230 +7045 0.7045 43.8280339539966093 -28.884566943039 +7046 0.7046 43.8309078612856382 -28.593578837470 +7047 0.7047 43.8337526741876289 -28.302679202300 +7048 0.7048 43.8365684015565478 -28.011868176060 +7049 0.7049 43.8393550522601956 -27.721145896940 +7050 0.7050 43.8421126351801789 -27.430512502789 +7051 0.7051 43.8448411592118745 -27.139968131140 +7052 0.7052 43.8475406332643942 -26.849512919230 +7053 0.7053 43.8502110662605560 -26.559147003960 +7054 0.7054 43.8528524671368487 -26.268870521910 +7055 0.7055 43.8554648448434108 -25.978683609340 +7056 0.7056 43.8580482083439875 -25.688586402211 +7057 0.7057 43.8606025666159027 -25.398579036140 +7058 0.7058 43.8631279286500302 -25.108661646450 +7059 0.7059 43.8656243034507582 -24.818834368140 +7060 0.7060 43.8680917000359614 -24.529097335901 +7061 0.7061 43.8705301274369575 -24.239450684080 +7062 0.7062 43.8729395946985008 -23.949894546730 +7063 0.7063 43.8753201108787181 -23.660429057610 +7064 0.7064 43.8776716850491013 -23.371054350120 +7065 0.7065 43.8799943262944723 -23.081770557370 +7066 0.7066 43.8822880437129470 -22.792577812181 +7067 0.7067 43.8845528464159074 -22.503476247010 +7068 0.7068 43.8867887435279584 -22.214465994050 +7069 0.7069 43.8889957441869214 -21.925547185140 +7070 0.7070 43.8911738575437695 -21.636719951870 +7071 0.7071 43.8933230927626354 -21.347984425420 +7072 0.7072 43.8954434590207470 -21.059340736750 +7073 0.7073 43.8975349655084059 -20.770789016479 +7074 0.7074 43.8995976214289740 -20.482329394910 +7075 0.7075 43.9016314359988229 -20.193962002040 +7076 0.7076 43.9036364184473058 -19.905686967561 +7077 0.7077 43.9056125780167292 -19.617504420870 +7078 0.7078 43.9075599239623244 -19.329414491010 +7079 0.7079 43.9094784655522119 -19.041417306790 +7080 0.7080 43.9113682120673801 -18.753512996640 +7081 0.7081 43.9132291728016497 -18.465701688729 +7082 0.7082 43.9150613570616315 -18.177983510890 +7083 0.7083 43.9168647741667115 -17.890358590690 +7084 0.7084 43.9186394334490160 -17.602827055351 +7085 0.7085 43.9203853442533756 -17.315389031830 +7086 0.7086 43.9221025159373042 -17.028044646720 +7087 0.7087 43.9237909578709562 -16.740794026379 +7088 0.7088 43.9254506794371196 -16.453637296820 +7089 0.7089 43.9270816900311516 -16.166574583750 +7090 0.7090 43.9286839990609721 -15.879606012610 +7091 0.7091 43.9302576159470277 -15.592731708520 +7092 0.7092 43.9318025501222635 -15.305951796260 +7093 0.7093 43.9333188110320947 -15.019266400400 +7094 0.7094 43.9348064081343708 -14.732675645090 +7095 0.7095 43.9362653508993404 -14.446179654300 +7096 0.7096 43.9376956488096369 -14.159778551600 +7097 0.7097 43.9390973113602357 -13.873472460350 +7098 0.7098 43.9404703480584331 -13.587261503530 +7099 0.7099 43.9418147684238036 -13.301145803860 +7100 0.7100 43.9431305819881857 -13.015125483780 +7101 0.7101 43.9444177982956461 -12.729200665420 +7102 0.7102 43.9456764269024447 -12.443371470569 +7103 0.7103 43.9469064773770128 -12.157638020790 +7104 0.7104 43.9481079592999180 -11.872000437300 +7105 0.7105 43.9492808822638352 -11.586458841050 +7106 0.7106 43.9504252558735189 -11.301013352650 +7107 0.7107 43.9515410897457741 -11.015664092491 +7108 0.7108 43.9526283935094284 -10.730411180611 +7109 0.7109 43.9536871768052961 -10.445254736740 +7110 0.7110 43.9547174492861501 -10.160194880390 +7111 0.7111 43.9557192206167073 -9.875231730701 +7112 0.7112 43.9566925004735722 -9.590365406590 +7113 0.7113 43.9576372985452295 -9.305596026589 +7114 0.7114 43.9585536245320085 -9.020923709050 +7115 0.7115 43.9594414881460551 -8.736348571950 +7116 0.7116 43.9603008991113029 -8.451870732990 +7117 0.7117 43.9611318671634308 -8.167490309630 +7118 0.7118 43.9619344020498630 -7.883207418980 +7119 0.7119 43.9627085135297051 -7.599022177880 +7120 0.7120 43.9634542113737439 -7.314934702890 +7121 0.7121 43.9641715053644049 -7.030945110300 +7122 0.7122 43.9648604052957239 -6.747053516060 +7123 0.7123 43.9655209209733187 -6.463260035860 +7124 0.7124 43.9661530622143673 -6.179564785110 +7125 0.7125 43.9667568388475658 -5.895967878930 +7126 0.7126 43.9673322607131212 -5.612469432140 +7127 0.7127 43.9678793376626942 -5.329069559270 +7128 0.7128 43.9683980795593854 -5.045768374620 +7129 0.7129 43.9688884962777209 -4.762565992120 +7130 0.7130 43.9693505977036025 -4.479462525470 +7131 0.7131 43.9697843937342796 -4.196458088069 +7132 0.7132 43.9701898942783345 -3.913552793050 +7133 0.7133 43.9705671092556472 -3.630746753221 +7134 0.7134 43.9709160485973669 -3.348040081150 +7135 0.7135 43.9712367222458766 -3.065432889111 +7136 0.7136 43.9715291401547859 -2.782925289061 +7137 0.7137 43.9717933122888738 -2.500517392730 +7138 0.7138 43.9720292486240893 -2.218209311541 +7139 0.7139 43.9722369591474944 -1.936001156620 +7140 0.7140 43.9724164538572637 -1.653893038821 +7141 0.7141 43.9725677427626422 -1.371885068750 +7142 0.7142 43.9726908358839168 -1.089977356690 +7143 0.7143 43.9727857432523876 -0.808170012660 +7144 0.7144 43.9728524749103400 -0.526463146401 +7145 0.7145 43.9728910409110298 -0.244856867370 +7146 0.7146 43.9729014513186343 0.036648715231 +7147 0.7147 43.9728837162082442 0.318053492500 +7148 0.7148 43.9728378456658291 0.599357355820 +7149 0.7149 43.9727638497881941 0.880560196830 +7150 0.7150 43.9726617386829801 1.161661907470 +7151 0.7151 43.9725315224686071 1.442662379920 +7152 0.7152 43.9723732112742809 1.723561506669 +7153 0.7153 43.9721868152399225 2.004359180461 +7154 0.7154 43.9719723445161819 2.285055294330 +7155 0.7155 43.9717298092643887 2.565649741590 +7156 0.7156 43.9714592196565235 2.846142415780 +7157 0.7157 43.9711605858751966 3.126533210800 +7158 0.7158 43.9708339181136196 3.406822020730 +7159 0.7159 43.9704792265755842 3.687008739980 +7160 0.7160 43.9700965214754262 3.967093263241 +7161 0.7161 43.9696858130379908 4.247075485430 +7162 0.7162 43.9692471114986319 4.526955301750 +7163 0.7163 43.9687804271031553 4.806732607711 +7164 0.7164 43.9682857701078191 5.086407299050 +7165 0.7165 43.9677631507792768 5.365979271810 +7166 0.7166 43.9672125793945696 5.645448422270 +7167 0.7167 43.9666340662411059 5.924814647001 +7168 0.7168 43.9660276216166110 6.204077842840 +7169 0.7169 43.9653932558291274 6.483237906899 +7170 0.7170 43.9647309791969576 6.762294736530 +7171 0.7171 43.9640408020486646 7.041248229370 +7172 0.7172 43.9633227347230289 7.320098283360 +7173 0.7173 43.9625767875690272 7.598844796640 +7174 0.7174 43.9618029709458114 7.877487667681 +7175 0.7175 43.9610012952226654 8.156026795170 +7176 0.7176 43.9601717707789987 8.434462078099 +7177 0.7177 43.9593144080043103 8.712793415680 +7178 0.7178 43.9584292172981534 8.991020707470 +7179 0.7179 43.9575162090701212 9.269143853190 +7180 0.7180 43.9565753937398185 9.547162752910 +7181 0.7181 43.9556067817368259 9.825077306899 +7182 0.7182 43.9546103835006932 10.102887415740 +7183 0.7183 43.9535862094808962 10.380592980260 +7184 0.7184 43.9525342701368089 10.658193901540 +7185 0.7185 43.9514545759376816 10.935690080950 +7186 0.7186 43.9503471373626269 11.213081420090 +7187 0.7187 43.9492119649005843 11.490367820820 +7188 0.7188 43.9480490690502776 11.767549185320 +7189 0.7189 43.9468584603202146 12.044625415960 +7190 0.7190 43.9456401492286446 12.321596415410 +7191 0.7191 43.9443941463035443 12.598462086580 +7192 0.7192 43.9431204620825824 12.875222332650 +7193 0.7193 43.9418191071130977 13.151877057080 +7194 0.7194 43.9404900919520642 13.428426163549 +7195 0.7195 43.9391334271660838 13.704869556011 +7196 0.7196 43.9377491233313506 13.981207138690 +7197 0.7197 43.9363371910336156 14.257438816060 +7198 0.7198 43.9348976408681722 14.533564492840 +7199 0.7199 43.9334304834398282 14.809584074050 +7200 0.7200 43.9319357293628769 15.085497464910 +7201 0.7201 43.9304133892610835 15.361304570920 +7202 0.7202 43.9288634737676489 15.637005297830 +7203 0.7203 43.9272859935251745 15.912599551681 +7204 0.7204 43.9256809591856552 16.188087238720 +7205 0.7205 43.9240483814104437 16.463468265460 +7206 0.7206 43.9223882708702362 16.738742538710 +7207 0.7207 43.9207006382450302 17.013909965480 +7208 0.7208 43.9189854942241027 17.288970453061 +7209 0.7209 43.9172428495060032 17.563923908991 +7210 0.7210 43.9154727147984971 17.838770241070 +7211 0.7211 43.9136751008185797 18.113509357319 +7212 0.7212 43.9118500182924123 18.388141166060 +7213 0.7213 43.9099974779553150 18.662665575820 +7214 0.7214 43.9081174905517528 18.937082495410 +7215 0.7215 43.9062100668352855 19.211391833890 +7216 0.7216 43.9042752175685607 19.485593500540 +7217 0.7217 43.9023129535232854 19.759687404940 +7218 0.7218 43.9003232854801979 20.033673456860 +7219 0.7219 43.8983062242290387 20.307551566370 +7220 0.7220 43.8962617805685298 20.581321643770 +7221 0.7221 43.8941899653063601 20.854983599610 +7222 0.7222 43.8920907892591430 21.128537344680 +7223 0.7223 43.8899642632524092 21.401982790030 +7224 0.7224 43.8878103981205570 21.675319846951 +7225 0.7225 43.8856292047068592 21.948548426990 +7226 0.7226 43.8834206938634139 22.221668441930 +7227 0.7227 43.8811848764511296 22.494679803810 +7228 0.7228 43.8789217633396902 22.767582424910 +7229 0.7229 43.8766313654075546 23.040376217750 +7230 0.7230 43.8743136935419145 23.313061095110 +7231 0.7231 43.8719687586386584 23.585636970010 +7232 0.7232 43.8695965716023721 23.858103755700 +7233 0.7233 43.8671971433463028 24.130461365690 +7234 0.7234 43.8647704847923308 24.402709713740 +7235 0.7235 43.8623166068709551 24.674848713830 +7236 0.7236 43.8598355205212513 24.946878280210 +7237 0.7237 43.8573272366908711 25.218798327360 +7238 0.7238 43.8547917663360067 25.490608769990 +7239 0.7239 43.8522291204213559 25.762309523080 +7240 0.7240 43.8496393099201143 26.033900501820 +7241 0.7241 43.8470223458139401 26.305381621680 +7242 0.7242 43.8443782390929400 26.576752798340 +7243 0.7243 43.8417070007556404 26.848013947710 +7244 0.7244 43.8390086418089524 27.119164985990 +7245 0.7245 43.8362831732681713 27.390205829570 +7246 0.7246 43.8335306061569341 27.661136395110 +7247 0.7247 43.8307509515072056 27.931956599510 +7248 0.7248 43.8279442203592353 28.202666359890 +7249 0.7249 43.8251104237615579 28.473265593600 +7250 0.7250 43.8222495727709642 28.743754218260 +7251 0.7251 43.8193616784524664 29.014132151710 +7252 0.7252 43.8164467518792762 29.284399312050 +7253 0.7253 43.8135048041327977 29.554555617560 +7254 0.7254 43.8105358463025780 29.824600986820 +7255 0.7255 43.8075398894863071 30.094535338630 +7256 0.7256 43.8045169447897749 30.364358591980 +7257 0.7257 43.8014670233268646 30.634070666160 +7258 0.7258 43.7983901362195240 30.903671480680 +7259 0.7259 43.7952862945977301 31.173160955240 +7260 0.7260 43.7921555095994748 31.442539009820 +7261 0.7261 43.7889977923707505 31.711805564640 +7262 0.7262 43.7858131540655151 31.980960540110 +7263 0.7263 43.7826016058456631 32.250003856910 +7264 0.7264 43.7793631588810186 32.518935435940 +7265 0.7265 43.7760978243493071 32.787755198350 +7266 0.7266 43.7728056134361125 33.056463065490 +7267 0.7267 43.7694865373348918 33.325058958960 +7268 0.7268 43.7661406072469106 33.593542800620 +7269 0.7269 43.7627678343812576 33.861914512480 +7270 0.7270 43.7593682299547879 34.130174016890 +7271 0.7271 43.7559418051921227 34.398321236350 +7272 0.7272 43.7524885713256211 34.666356093620 +7273 0.7273 43.7490085395953585 34.934278511670 +7274 0.7274 43.7455017212490915 35.202088413740 +7275 0.7275 43.7419681275422434 35.469785723260 +7276 0.7276 43.7384077697378828 35.737370363910 +7277 0.7277 43.7348206591067097 36.004842259580 +7278 0.7278 43.7312068069270126 36.272201334420 +7279 0.7279 43.7275662244846544 36.539447512790 +7280 0.7280 43.7238989230730510 36.806580719250 +7281 0.7281 43.7202049139931574 37.073600878630 +7282 0.7282 43.7164842085534247 37.340507915980 +7283 0.7283 43.7127368180697999 37.607301756560 +7284 0.7284 43.7089627538656771 37.873982325850 +7285 0.7285 43.7051620272719035 38.140549549590 +7286 0.7286 43.7013346496267374 38.407003353730 +7287 0.7287 43.6974806322758269 38.673343664410 +7288 0.7288 43.6935999865722025 38.939570408060 +7289 0.7289 43.6896927238762345 39.205683511270 +7290 0.7290 43.6857588555556262 39.471682900900 +7291 0.7291 43.6817983929853781 39.737568504020 +7292 0.7292 43.6778113475477809 40.003340247920 +7293 0.7293 43.6737977306323799 40.268998060100 +7294 0.7294 43.6697575536359608 40.534541868310 +7295 0.7295 43.6656908279625213 40.799971600520 +7296 0.7296 43.6615975650232500 41.065287184890 +7297 0.7297 43.6574777762365116 41.330488549840 +7298 0.7298 43.6533314730278192 41.595575623990 +7299 0.7299 43.6491586668298126 41.860548336190 +7300 0.7300 43.6449593690822297 42.125406615500 +7301 0.7301 43.6407335912318928 42.390150391220 +7302 0.7302 43.6364813447326867 42.654779592840 +7303 0.7303 43.6322026410455379 42.919294150110 +7304 0.7304 43.6278974916383859 43.183693992980 +7305 0.7305 43.6235659079861549 43.447979051580 +7306 0.7306 43.6192079015707606 43.712149256330 +7307 0.7307 43.6148234838810538 43.976204537820 +7308 0.7308 43.6104126664128202 44.240144826870 +7309 0.7309 43.6059754606687520 44.503970054540 +7310 0.7310 43.6015118781584192 44.767680152060 +7311 0.7311 43.5970219303982702 45.031275050920 +7312 0.7312 43.5925056289115815 45.294754682810 +7313 0.7313 43.5879629852284580 45.558118979650 +7314 0.7314 43.5833940108857973 45.821367873530 +7315 0.7315 43.5787987174272828 46.084501296820 +7316 0.7316 43.5741771164033409 46.347519182060 +7317 0.7317 43.5695292193711339 46.610421462040 +7318 0.7318 43.5648550378945458 46.873208069720 +7319 0.7319 43.5601545835441470 47.135878938320 +7320 0.7320 43.5554278678971656 47.398434001250 +7321 0.7321 43.5506749025374944 47.660873192120 +7322 0.7322 43.5458956990556487 47.923196444800 +7323 0.7323 43.5410902690487447 48.185403693330 +7324 0.7324 43.5362586241204781 48.447494871970 +7325 0.7325 43.5314007758811172 48.709469915210 +7326 0.7326 43.5265167359474674 48.971328757740 +7327 0.7327 43.5216065159428567 49.233071334480 +7328 0.7328 43.5166701274971075 49.494697580520 +7329 0.7329 43.5117075822465225 49.756207431200 +7330 0.7330 43.5067188918338630 50.017600822060 +7331 0.7331 43.5017040679083209 50.278877688850 +7332 0.7332 43.4966631221255042 50.540037967520 +7333 0.7333 43.4915960661474159 50.801081594240 +7334 0.7334 43.4865029116424324 51.062008505400 +7335 0.7335 43.4813836702852825 51.322818637580 +7336 0.7336 43.4762383537570258 51.583511927570 +7337 0.7337 43.4710669737450246 51.844088312390 +7338 0.7338 43.4658695419429435 52.104547729260 +7339 0.7339 43.4606460700507000 52.364890115580 +7340 0.7340 43.4553965697744715 52.625115408990 +7341 0.7341 43.4501210528266526 52.885223547330 +7342 0.7342 43.4448195309258551 53.145214468640 +7343 0.7343 43.4394920157968656 53.405088111180 +7344 0.7344 43.4341385191706379 53.664844413390 +7345 0.7345 43.4287590527842724 53.924483313950 +7346 0.7346 43.4233536283809869 54.184004751730 +7347 0.7347 43.4179222577101100 54.443408665790 +7348 0.7348 43.4124649525270456 54.702694995430 +7349 0.7349 43.4069817245932654 54.961863680120 +7350 0.7350 43.4014725856762809 55.220914659550 +7351 0.7351 43.3959375475496216 55.479847873630 +7352 0.7352 43.3903766219928144 55.738663262450 +7353 0.7353 43.3847898207913758 55.997360766300 +7354 0.7354 43.3791771557367767 56.255940325690 +7355 0.7355 43.3735386386264281 56.514401881350 +7356 0.7356 43.3678742812636528 56.772745374160 +7357 0.7357 43.3621840954576854 57.030970745240 +7358 0.7358 43.3564680930236293 57.289077935930 +7359 0.7359 43.3507262857824500 57.547066887710 +7360 0.7360 43.3449586855609468 57.804937542320 +7361 0.7361 43.3391653041917451 58.062689841680 +7362 0.7362 43.3333461535132685 58.320323727910 +7363 0.7363 43.3275012453697101 58.577839143320 +7364 0.7364 43.3216305916110187 58.835236030440 +7365 0.7365 43.3157342040928981 59.092514331990 +7366 0.7366 43.3098120946767509 59.349673990890 +7367 0.7367 43.3038642752296923 59.606714950250 +7368 0.7368 43.2978907576245078 59.863637153400 +7369 0.7369 43.2918915537396458 60.120440543860 +7370 0.7370 43.2858666754591823 60.377125065340 +7371 0.7371 43.2798161346728278 60.633690661750 +7372 0.7372 43.2737399432758778 60.890137277210 +7373 0.7373 43.2676381131692125 61.146464856030 +7374 0.7374 43.2615106562592757 61.402673342700 +7375 0.7375 43.2553575844580465 61.658762681940 +7376 0.7376 43.2491789096830175 61.914732818650 +7377 0.7377 43.2429746438571883 62.170583697910 +7378 0.7378 43.2367447989090437 62.426315265020 +7379 0.7379 43.2304893867725184 62.681927465480 +7380 0.7380 43.2242084193869971 62.937420244950 +7381 0.7381 43.2179019086972858 63.192793549320 +7382 0.7382 43.2115698666535835 63.448047324670 +7383 0.7383 43.2052123052114894 63.703181517260 +7384 0.7384 43.1988292363319530 63.958196073520 +7385 0.7385 43.1924206719812673 64.213090940160 +7386 0.7386 43.1859866241310613 64.467866064000 +7387 0.7387 43.1795271047582574 64.722521392070 +7388 0.7388 43.1730421258450718 64.977056871630 +7389 0.7389 43.1665316993789858 65.231472450100 +7390 0.7390 43.1599958373527244 65.485768075080 +7391 0.7391 43.1534345517642492 65.739943694390 +7392 0.7392 43.1468478546167304 65.993999256050 +7393 0.7393 43.1402357579185178 66.247934708240 +7394 0.7394 43.1335982736831411 66.501749999350 +7395 0.7395 43.1269354139292744 66.755445077950 +7396 0.7396 43.1202471906807361 67.009019892810 +7397 0.7397 43.1135336159664533 67.262474392890 +7398 0.7398 43.1067947018204407 67.515808527340 +7399 0.7399 43.1000304602818005 67.769022245490 +7400 0.7400 43.0932409033946797 68.022115496860 +7401 0.7401 43.0864260432082773 68.275088231190 +7402 0.7402 43.0795858917768015 68.527940398360 +7403 0.7403 43.0727204611594630 68.780671948460 +7404 0.7404 43.0658297634204530 69.033282831800 +7405 0.7405 43.0589138106289226 69.285772998810 +7406 0.7406 43.0519726148589754 69.538142400170 +7407 0.7407 43.0450061881896318 69.790390986730 +7408 0.7408 43.0380145427048220 70.042518709500 +7409 0.7409 43.0309976904933649 70.294525519710 +7410 0.7410 43.0239556436489394 70.546411368750 +7411 0.7411 43.0168884142700918 70.798176208230 +7412 0.7412 43.0097960144601856 71.049819989920 +7413 0.7413 43.0026784563274020 71.301342665760 +7414 0.7414 42.9955357519847183 71.552744187930 +7415 0.7415 42.9883679135498866 71.804024508740 +7416 0.7416 42.9811749531454126 72.055183580710 +7417 0.7417 42.9739568828985483 72.306221356530 +7418 0.7418 42.9667137149412639 72.557137789110 +7419 0.7419 42.9594454614102332 72.807932831490 +7420 0.7420 42.9521521344468127 73.058606436950 +7421 0.7421 42.9448337461970198 73.309158558910 +7422 0.7422 42.9374903088115261 73.559589150990 +7423 0.7423 42.9301218344456288 73.809898166990 +7424 0.7424 42.9227283352592366 74.060085560890 +7425 0.7425 42.9153098234168482 74.310151286860 +7426 0.7426 42.9078663110875453 74.560095299250 +7427 0.7427 42.9003978104449502 74.809917552590 +7428 0.7428 42.8929043336672393 75.059618001580 +7429 0.7429 42.8853858929371015 75.309196601110 +7430 0.7430 42.8778425004417301 75.558653306270 +7431 0.7431 42.8702741683728021 75.807988072300 +7432 0.7432 42.8626809089264569 76.057200854640 +7433 0.7433 42.8550627343032815 76.306291608890 +7434 0.7434 42.8474196567082970 76.555260290840 +7435 0.7435 42.8397516883509297 76.804106856490 +7436 0.7436 42.8320588414450043 77.052831261960 +7437 0.7437 42.8243411282087294 77.301433463570 +7438 0.7438 42.8165985608646551 77.549913417870 +7439 0.7439 42.8088311516396871 77.798271081520 +7440 0.7440 42.8010389127650441 78.046506411380 +7441 0.7441 42.7932218564762508 78.294619364500 +7442 0.7442 42.7853799950131233 78.542609898080 +7443 0.7443 42.7775133406197412 78.790477969540 +7444 0.7444 42.7696219055444402 79.038223536450 +7445 0.7445 42.7617057020397908 79.285846556550 +7446 0.7446 42.7537647423625771 79.533346987760 +7447 0.7447 42.7457990387737823 79.780724788190 +7448 0.7448 42.7378086035385678 80.027979916110 +7449 0.7449 42.7297934489262659 80.275112329980 +7450 0.7450 42.7217535872103440 80.522121988420 +7451 0.7451 42.7136890306684123 80.769008850230 +7452 0.7452 42.7055997915821806 81.015772874410 +7453 0.7453 42.6974858822374586 81.262414020080 +7454 0.7454 42.6893473149241274 81.508932246580 +7455 0.7455 42.6811841019361253 81.755327513400 +7456 0.7456 42.6729962555714408 82.001599780240 +7457 0.7457 42.6647837881320839 82.247749006900 +7458 0.7458 42.6565467119240651 82.493775153430 +7459 0.7459 42.6482850392573951 82.739678180020 +7460 0.7460 42.6399987824460425 82.985458047030 +7461 0.7461 42.6316879538079405 83.231114714980 +7462 0.7462 42.6233525656649590 83.476648144590 +7463 0.7463 42.6149926303428899 83.722058296760 +7464 0.7464 42.6066081601714259 83.967345132500 +7465 0.7465 42.5981991674841467 84.212508613050 +7466 0.7466 42.5897656646185041 84.457548699810 +7467 0.7467 42.5813076639157941 84.702465354330 +7468 0.7468 42.5728251777211568 84.947258538350 +7469 0.7469 42.5643182183835478 85.191928213780 +7470 0.7470 42.5557867982557241 85.436474342670 +7471 0.7471 42.5472309296942299 85.680896887280 +7472 0.7472 42.5386506250593683 85.925195810020 +7473 0.7473 42.5300458967151940 86.169371073470 +7474 0.7474 42.5214167570294990 86.413422640370 +7475 0.7475 42.5127632183737987 86.657350473640 +7476 0.7476 42.5040852931232962 86.901154536370 +7477 0.7477 42.4953829936568894 87.144834791810 +7478 0.7478 42.4866563323571285 87.388391203380 +7479 0.7479 42.4779053216102227 87.631823734680 +7480 0.7480 42.4691299738060195 87.875132349440 +7481 0.7481 42.4603303013379687 88.118317011600 +7482 0.7482 42.4515063166031297 88.361377685250 +7483 0.7483 42.4426580320021358 88.604314334630 +7484 0.7484 42.4337854599391946 88.847126924170 +7485 0.7485 42.4248886128220661 89.089815418440 +7486 0.7486 42.4159675030620349 89.332379782230 +7487 0.7487 42.4070221430739025 89.574819980410 +7488 0.7488 42.3980525452759736 89.817135978110 +7489 0.7489 42.3890587220900414 90.059327740520 +7490 0.7490 42.3800406859413599 90.301395233120 +7491 0.7491 42.3709984492586358 90.543338421410 +7492 0.7492 42.3619320244740081 90.785157271180 +7493 0.7493 42.3528414240230333 91.026851748310 +7494 0.7494 42.3437266603446716 91.268421818890 +7495 0.7495 42.3345877458812723 91.509867449120 +7496 0.7496 42.3254246930785456 91.751188605400 +7497 0.7497 42.3162375143855627 91.992385254300 +7498 0.7498 42.3070262222547200 92.233457362510 +7499 0.7499 42.2977908291417464 92.474404896930 +7500 0.7500 42.2885313475056677 92.715227824610 +7501 0.7501 42.2792477898087995 92.955926112720 +7502 0.7502 42.2699401685167331 93.196499728650 +7503 0.7503 42.2606084960983068 93.436948639900 +7504 0.7504 42.2512527850255992 93.677272814190 +7505 0.7505 42.2418730477739217 93.917472219330 +7506 0.7506 42.2324692968217903 94.157546823340 +7507 0.7507 42.2230415446509042 94.397496594410 +7508 0.7508 42.2135898037461459 94.637321500820 +7509 0.7509 42.2041140865955526 94.877021511090 +7510 0.7510 42.1946144056903023 95.116596593850 +7511 0.7511 42.1850907735247134 95.356046717920 +7512 0.7512 42.1755432025962023 95.595371852240 +7513 0.7513 42.1659717054052905 95.834571965950 +7514 0.7514 42.1563762944555762 96.073647028310 +7515 0.7515 42.1467569822537200 96.312597008790 +7516 0.7516 42.1371137813094307 96.551421876930 +7517 0.7517 42.1274467041354583 96.790121602540 +7518 0.7518 42.1177557632475583 97.028696155510 +7519 0.7519 42.1080409711644919 97.267145505890 +7520 0.7520 42.0983023404080043 97.505469623920 +7521 0.7521 42.0885398835028113 97.743668479980 +7522 0.7522 42.0787536129765840 97.981742044600 +7523 0.7523 42.0689435413599284 98.219690288470 +7524 0.7524 42.0591096811863849 98.457513182440 +7525 0.7525 42.0492520449923859 98.695210697530 +7526 0.7526 42.0393706453172626 98.932782804870 +7527 0.7527 42.0294654947032313 99.170229475800 +7528 0.7528 42.0195366056953503 99.407550681770 +7529 0.7529 42.0095839908415414 99.644746394410 +7530 0.7530 41.9996076626925472 99.881816585510 +7531 0.7531 41.9896076338019242 100.118761226980 +7532 0.7532 41.9795839167260283 100.355580290910 +7533 0.7533 41.9695365240240079 100.592273749550 +7534 0.7534 41.9594654682577684 100.828841575280 +7535 0.7535 41.9493707619919718 101.065283740650 +7536 0.7536 41.9392524177940231 101.301600218350 +7537 0.7537 41.9291104482340415 101.537790981260 +7538 0.7538 41.9189448658848605 101.773856002340 +7539 0.7539 41.9087556833220063 102.009795254760 +7540 0.7540 41.8985429131236771 102.245608711850 +7541 0.7541 41.8883065678707354 102.481296347030 +7542 0.7542 41.8780466601466870 102.716858133940 +7543 0.7543 41.8677632025376738 102.952294046310 +7544 0.7544 41.8574562076324526 103.187604058080 +7545 0.7545 41.8471256880223805 103.422788143300 +7546 0.7546 41.8367716563014085 103.657846276200 +7547 0.7547 41.8263941250660451 103.892778431100 +7548 0.7548 41.8159931069153643 104.127584582540 +7549 0.7549 41.8055686144509764 104.362264705190 +7550 0.7550 41.7951206602770284 104.596818773840 +7551 0.7551 41.7846492570001615 104.831246763460 +7552 0.7552 41.7741544172295320 105.065548649160 +7553 0.7553 41.7636361535767620 105.299724406200 +7554 0.7554 41.7530944786559530 105.533774009980 +7555 0.7555 41.7425294050836513 105.767697436050 +7556 0.7556 41.7319409454788399 106.001494660130 +7557 0.7557 41.7213291124629322 106.235165658050 +7558 0.7558 41.7106939186597359 106.468710405820 +7559 0.7559 41.7000353766954674 106.702128879570 +7560 0.7560 41.6893534991987096 106.935421055610 +7561 0.7561 41.6786482988004110 107.168586910380 +7562 0.7562 41.6679197881338723 107.401626420450 +7563 0.7563 41.6571679798347247 107.634539562550 +7564 0.7564 41.6463928865409159 107.867326313570 +7565 0.7565 41.6355945208927096 108.099986650530 +7566 0.7566 41.6247728955326508 108.332520550590 +7567 0.7567 41.6139280231055650 108.564927991080 +7568 0.7568 41.6030599162585375 108.797208949430 +7569 0.7569 41.5921685876409057 109.029363403270 +7570 0.7570 41.5812540499042242 109.261391330350 +7571 0.7571 41.5703163157022786 109.493292708550 +7572 0.7572 41.5593553976910570 109.725067515910 +7573 0.7573 41.5483713085287292 109.956715730620 +7574 0.7574 41.5373640608756460 110.188237330980 +7575 0.7575 41.5263336673943257 110.419632295480 +7576 0.7576 41.5152801407494181 110.650900602740 +7577 0.7577 41.5042034936077044 110.882042231500 +7578 0.7578 41.4931037386380979 111.113057160640 +7579 0.7579 41.4819808885116075 111.343945369230 +7580 0.7580 41.4708349559013243 111.574706836440 +7581 0.7581 41.4596659534824212 111.805341541600 +7582 0.7582 41.4484738939321318 112.035849464150 +7583 0.7583 41.4372587899297358 112.266230583740 +7584 0.7584 41.4260206541565452 112.496484880090 +7585 0.7585 41.4147594992958830 112.726612333100 +7586 0.7586 41.4034753380330898 112.956612922790 +7587 0.7587 41.3921681830554817 113.186486629360 +7588 0.7588 41.3808380470523574 113.416233433080 +7589 0.7589 41.3694849427149833 113.645853314430 +7590 0.7590 41.3581088827365591 113.875346254010 +7591 0.7591 41.3467098798122308 114.104712232520 +7592 0.7592 41.3352879466390633 114.333951230870 +7593 0.7593 41.3238430959160183 114.563063230040 +7594 0.7594 41.3123753403439551 114.792048211200 +7595 0.7595 41.3008846926256155 115.020906155620 +7596 0.7596 41.2893711654655959 115.249637044750 +7597 0.7597 41.2778347715703475 115.478240860160 +7598 0.7598 41.2662755236481615 115.706717583510 +7599 0.7599 41.2546934344091483 115.935067196690 +7600 0.7600 41.2430885165652299 116.163289681660 +7601 0.7601 41.2314607828301192 116.391385020550 +7602 0.7602 41.2198102459193123 116.619353195590 +7603 0.7603 41.2081369185500748 116.847194189210 +7604 0.7604 41.1964408134414199 117.074907983900 +7605 0.7605 41.1847219433141092 117.302494562350 +7606 0.7606 41.1729803208906233 117.529953907340 +7607 0.7607 41.1612159588951627 117.757286001830 +7608 0.7608 41.1494288700536259 117.984490828900 +7609 0.7609 41.1376190670935955 118.211568371730 +7610 0.7610 41.1257865627443238 118.438518613680 +7611 0.7611 41.1139313697367257 118.665341538250 +7612 0.7612 41.1020535008033647 118.892037129020 +7613 0.7613 41.0901529686784244 119.118605369770 +7614 0.7614 41.0782297860977152 119.345046244370 +7615 0.7615 41.0662839657986538 119.571359736850 +7616 0.7616 41.0543155205202410 119.797545831350 +7617 0.7617 41.0423244630030624 120.023604512160 +7618 0.7618 41.0303108059892665 120.249535763720 +7619 0.7619 41.0182745622225511 120.475339570560 +7620 0.7620 41.0062157444481556 120.701015917380 +7621 0.7621 40.9941343654128332 120.926564789010 +7622 0.7622 40.9820304378648643 121.151986170390 +7623 0.7623 40.9699039745540148 121.377280046610 +7624 0.7624 40.9577549882315424 121.602446402890 +7625 0.7625 40.9455834916501686 121.827485224590 +7626 0.7626 40.9333894975640789 122.052396497190 +7627 0.7627 40.9211730187289078 122.277180206290 +7628 0.7628 40.9089340679017113 122.501836337670 +7629 0.7629 40.8966726578409663 122.726364877170 +7630 0.7630 40.8843888013065637 122.950765810830 +7631 0.7631 40.8720825110597801 123.175039124780 +7632 0.7632 40.8597537998632774 123.399184805270 +7633 0.7633 40.8474026804810748 123.623202838740 +7634 0.7634 40.8350291656785558 123.847093211700 +7635 0.7635 40.8226332682224324 124.070855910810 +7636 0.7636 40.8102150008807456 124.294490922860 +7637 0.7637 40.7977743764228649 124.517998234780 +7638 0.7638 40.7853114076194458 124.741377833630 +7639 0.7639 40.7728261072424374 124.964629706580 +7640 0.7640 40.7603184880650602 125.187753840920 +7641 0.7641 40.7477885628618068 125.410750224110 +7642 0.7642 40.7352363444084133 125.633618843730 +7643 0.7643 40.7226618454818521 125.856359687450 +7644 0.7644 40.7100650788603247 126.078972743090 +7645 0.7645 40.6974460573232406 126.301457998610 +7646 0.7646 40.6848047936512032 126.523815442100 +7647 0.7647 40.6721413006260093 126.746045061750 +7648 0.7648 40.6594555910306283 126.968146845900 +7649 0.7649 40.6467476776491807 127.190120783010 +7650 0.7650 40.6340175732669451 127.411966861660 +7651 0.7651 40.6212652906703369 127.633685070570 +7652 0.7652 40.6084908426468800 127.855275398600 +7653 0.7653 40.5956942419852140 128.076737834680 +7654 0.7654 40.5828755014750868 128.298072367930 +7655 0.7655 40.5700346339073121 128.519278987550 +7656 0.7656 40.5571716520737908 128.740357682900 +7657 0.7657 40.5442865687674754 128.961308443440 +7658 0.7658 40.5313793967823628 129.182131258760 +7659 0.7659 40.5184501489134945 129.402826118610 +7660 0.7660 40.5054988379569210 129.623393012800 +7661 0.7661 40.4925254767097158 129.843831931300 +7662 0.7662 40.4795300779699403 130.064142864230 +7663 0.7663 40.4665126545366363 130.284325801780 +7664 0.7664 40.4534732192098332 130.504380734320 +7665 0.7665 40.4404117847905056 130.724307652280 +7666 0.7666 40.4273283640805801 130.944106546290 +7667 0.7667 40.4142229698829141 131.163777407030 +7668 0.7668 40.4010956150012959 131.383320225350 +7669 0.7669 40.3879463122404161 131.602734992200 +7670 0.7670 40.3747750744058749 131.822021698670 +7671 0.7671 40.3615819143041463 132.041180335960 +7672 0.7672 40.3483668447425785 132.260210895400 +7673 0.7673 40.3351298785293864 132.479113368440 +7674 0.7674 40.3218710284736304 132.697887746640 +7675 0.7675 40.3085903073852165 132.916534021680 +7676 0.7676 40.2952877280748609 133.135052185400 +7677 0.7677 40.2819633033541038 133.353442229730 +7678 0.7678 40.2686170460352812 133.571704146710 +7679 0.7679 40.2552489689315180 133.789837928520 +7680 0.7680 40.2418590848567206 134.007843567490 +7681 0.7681 40.2284474066255484 134.225721055990 +7682 0.7682 40.2150139470534214 134.443470386580 +7683 0.7683 40.2015587189564982 134.661091551930 +7684 0.7684 40.1880817351516626 134.878584544810 +7685 0.7685 40.1745830084565156 135.095949358090 +7686 0.7686 40.1610625516893691 135.313185984830 +7687 0.7687 40.1475203776692240 135.530294418140 +7688 0.7688 40.1339564992157491 135.747274651290 +7689 0.7689 40.1203709291493027 135.964126677640 +7690 0.7690 40.1067636802908822 136.180850490700 +7691 0.7691 40.0931347654621462 136.397446084060 +7692 0.7692 40.0794841974853711 136.613913451470 +7693 0.7693 40.0658119891834588 136.830252586770 +7694 0.7694 40.0521181533799222 137.046463483930 +7695 0.7695 40.0384027028988712 137.262546137030 +7696 0.7696 40.0246656505650051 137.478500540260 +7697 0.7697 40.0109070092035921 137.694326687970 +7698 0.7698 39.9971267916404685 137.910024574560 +7699 0.7699 39.9833250107020106 138.125594194610 +7700 0.7700 39.9695016792151421 138.341035542770 +7701 0.7701 39.9556568100073122 138.556348613840 +7702 0.7702 39.9417904159064818 138.771533402710 +7703 0.7703 39.9279025097411235 138.986589904410 +7704 0.7704 39.9139931043402001 139.201518114060 +7705 0.7705 39.9000622125331503 139.416318026940 +7706 0.7706 39.8861098471498821 139.630989638380 +7707 0.7707 39.8721360210207720 139.845532943880 +7708 0.7708 39.8581407469766233 140.059947939030 +7709 0.7709 39.8441240378486938 140.274234619540 +7710 0.7710 39.8300859064686534 140.488392981240 +7711 0.7711 39.8160263656685913 140.702423020060 +7712 0.7712 39.8019454282809875 140.916324732080 +7713 0.7713 39.7878431071387126 141.130098113440 +7714 0.7714 39.7737194150750213 141.343743160440 +7715 0.7715 39.7595743649235231 141.557259869470 +7716 0.7716 39.7454079695181974 141.770648237040 +7717 0.7717 39.7312202416933573 141.983908259780 +7718 0.7718 39.7170111942836499 142.197039934430 +7719 0.7719 39.7027808401240350 142.410043257830 +7720 0.7720 39.6885291920497991 142.622918226930 +7721 0.7721 39.6742562628965132 142.835664838830 +7722 0.7722 39.6599620655000322 143.048283090720 +7723 0.7723 39.6456466126965026 143.260772979870 +7724 0.7724 39.6313099173223193 143.473134503730 +7725 0.7725 39.6169519922141404 143.685367659810 +7726 0.7726 39.6025728502088654 143.897472445730 +7727 0.7727 39.5881725041436141 144.109448859250 +7728 0.7728 39.5737509668557408 144.321296898230 +7729 0.7729 39.5593082511827987 144.533016560640 +7730 0.7730 39.5448443699625400 144.744607844560 +7731 0.7731 39.5303593360329018 144.956070748170 +7732 0.7732 39.5158531622320055 145.167405269800 +7733 0.7733 39.5013258613981222 145.378611407840 +7734 0.7734 39.4867774463696861 145.589689160820 +7735 0.7735 39.4722079299852737 145.800638527380 +7736 0.7736 39.4576173250835893 146.011459506250 +7737 0.7737 39.4430056445034651 146.222152096280 +7738 0.7738 39.4283729010838329 146.432716296430 +7739 0.7739 39.4137191076637237 146.643152105790 +7740 0.7740 39.3990442770822611 146.853459523530 +7741 0.7741 39.3843484221786397 147.063638548930 +7742 0.7742 39.3696315557921253 147.273689181410 +7743 0.7743 39.3548936907620330 147.483611420450 +7744 0.7744 39.3401348399277282 147.693405265680 +7745 0.7745 39.3253550161286043 147.903070716820 +7746 0.7746 39.3105542322040762 148.112607773710 +7747 0.7747 39.2957325009935801 148.322016436260 +7748 0.7748 39.2808898353365379 148.531296704540 +7749 0.7749 39.2660262480723787 148.740448578710 +7750 0.7750 39.2511417520404962 148.949472059000 +7751 0.7751 39.2362363600802553 149.158367145800 +7752 0.7752 39.2213100850309857 149.367133839600 +7753 0.7753 39.2063629397319602 149.575772140940 +7754 0.7754 39.1913949370223875 149.784282050540 +7755 0.7755 39.1764060897413984 149.992663569180 +7756 0.7756 39.1613964107280523 150.200916697770 +7757 0.7757 39.1463659128212953 150.409041437310 +7758 0.7758 39.1313146088599879 150.617037788900 +7759 0.7759 39.1162425116828558 150.824905753780 +7760 0.7760 39.1011496341285039 151.032645333260 +7761 0.7761 39.0860359890354019 151.240256528770 +7762 0.7762 39.0709015892418705 151.447739341840 +7763 0.7763 39.0557464475860741 151.655093774120 +7764 0.7764 39.0405705769059992 151.862319827340 +7765 0.7765 39.0253739900394621 152.069417503350 +7766 0.7766 39.0101566998240870 152.276386804110 +7767 0.7767 38.9949187190972992 152.483227731660 +7768 0.7768 38.9796600606963111 152.689940288170 +7769 0.7769 38.9643807374581073 152.896524475910 +7770 0.7770 38.9490807622194524 153.102980297250 +7771 0.7771 38.9337601478168551 153.309307754630 +7772 0.7772 38.9184189070865898 153.515506850640 +7773 0.7773 38.9030570528646606 153.721577587980 +7774 0.7774 38.8876745979867948 153.927519969400 +7775 0.7775 38.8722715552884353 154.133333997800 +7776 0.7776 38.8568479376047407 154.339019676150 +7777 0.7777 38.8414037577705571 154.544577007550 +7778 0.7778 38.8259390286204180 154.750005995190 +7779 0.7779 38.8104537629885442 154.955306642350 +7780 0.7780 38.7949479737088012 155.160478952440 +7781 0.7781 38.7794216736147348 155.365522928940 +7782 0.7782 38.7638748755395142 155.570438575440 +7783 0.7783 38.7483075923159603 155.775225895670 +7784 0.7784 38.7327198367765035 155.979884893400 +7785 0.7785 38.7171116217532045 156.184415572540 +7786 0.7786 38.7014829600777261 156.388817937080 +7787 0.7787 38.6858338645813120 156.593091991140 +7788 0.7788 38.6701643480948078 156.797237738920 +7789 0.7789 38.6544744234486259 157.001255184720 +7790 0.7790 38.6387641034727451 157.205144332920 +7791 0.7791 38.6230334009966967 157.408905188050 +7792 0.7792 38.6072823288495570 157.612537754700 +7793 0.7793 38.5915108998599408 157.816042037580 +7794 0.7794 38.5757191268559865 158.019418041480 +7795 0.7795 38.5599070226653495 158.222665771300 +7796 0.7796 38.5440746001151808 158.425785232050 +7797 0.7797 38.5282218720321339 158.628776428820 +7798 0.7798 38.5123488512423506 158.831639366810 +7799 0.7799 38.4964555505714472 159.034374051310 +7800 0.7800 38.4805419828444926 159.236980487720 +7801 0.7801 38.4646081608860300 159.439458681540 +7802 0.7802 38.4486540975200342 159.641808638330 +7803 0.7803 38.4326798055699257 159.844030363800 +7804 0.7804 38.4166852978585496 160.046123863750 +7805 0.7805 38.4006705872081611 160.248089144030 +7806 0.7806 38.3846356864404257 160.449926210650 +7807 0.7807 38.3685806083764120 160.651635069660 +7808 0.7808 38.3525053658365636 160.853215727260 +7809 0.7809 38.3364099716407125 161.054668189700 +7810 0.7810 38.3202944386080588 161.255992463360 +7811 0.7811 38.3041587795571559 161.457188554710 +7812 0.7812 38.2880030073059032 161.658256470290 +7813 0.7813 38.2718271346715468 161.859196216770 +7814 0.7814 38.2556311744706647 162.060007800910 +7815 0.7815 38.2394151395191386 162.260691229550 +7816 0.7816 38.2231790426321822 162.461246509640 +7817 0.7817 38.2069228966242918 162.661673648220 +7818 0.7818 38.1906467143092598 162.861972652410 +7819 0.7819 38.1743505085001686 163.062143529450 +7820 0.7820 38.1580342920093614 163.262186286680 +7821 0.7821 38.1416980776484493 163.462100931490 +7822 0.7822 38.1253418782283049 163.661887471430 +7823 0.7823 38.1089657065590259 163.861545914080 +7824 0.7824 38.0925695754499642 164.061076267170 +7825 0.7825 38.0761534977096829 164.260478538470 +7826 0.7826 38.0597174861459635 164.459752735890 +7827 0.7827 38.0432615535657987 164.658898867410 +7828 0.7828 38.0267857127753715 164.857916941110 +7829 0.7829 38.0102899765800544 165.056806965170 +7830 0.7830 37.9937743577844032 165.255568947840 +7831 0.7831 37.9772388691921350 165.454202897500 +7832 0.7832 37.9606835236061286 165.652708822590 +7833 0.7833 37.9441083338284173 165.851086731660 +7834 0.7834 37.9275133126601673 166.049336633340 +7835 0.7835 37.9108984729016854 166.247458536360 +7836 0.7836 37.8942638273523897 166.445452449560 +7837 0.7837 37.8776093888108178 166.643318381830 +7838 0.7838 37.8609351700746188 166.841056342210 +7839 0.7839 37.8442411839405182 167.038666339760 +7840 0.7840 37.8275274432043460 167.236148383710 +7841 0.7841 37.8107939606609946 167.433502483300 +7842 0.7842 37.7940407491044326 167.630728647940 +7843 0.7843 37.7772678213276834 167.827826887080 +7844 0.7844 37.7604751901228184 168.024797210270 +7845 0.7845 37.7436628682809499 168.221639627170 +7846 0.7846 37.7268308685922165 168.418354147510 +7847 0.7847 37.7099792038457835 168.614940781110 +7848 0.7848 37.6931078868298357 168.811399537900 +7849 0.7849 37.6762169303315488 169.007730427890 +7850 0.7850 37.6593063471370968 169.203933461180 +7851 0.7851 37.6423761500316374 169.400008647940 +7852 0.7852 37.6254263517993195 169.595955998470 +7853 0.7853 37.6084569652232403 169.791775523130 +7854 0.7854 37.5914680030854669 169.987467232380 +7855 0.7855 37.5744594781670074 170.183031136770 +7856 0.7856 37.5574314032478256 170.378467246920 +7857 0.7857 37.5403837911067981 170.573775573580 +7858 0.7858 37.5233166545217429 170.768956127530 +7859 0.7859 37.5062300062693836 170.964008919700 +7860 0.7860 37.4891238591253426 171.158933961070 +7861 0.7861 37.4719982258641551 171.353731262740 +7862 0.7862 37.4548531192592264 171.548400835840 +7863 0.7863 37.4376885520828537 171.742942691660 +7864 0.7864 37.4205045371061971 171.937356841520 +7865 0.7865 37.4033010870992797 172.131643296860 +7866 0.7866 37.3860782148309738 172.325802069210 +7867 0.7867 37.3688359330690076 172.519833170170 +7868 0.7868 37.3515742545799299 172.713736611410 +7869 0.7869 37.3342931921291239 172.907512404740 +7870 0.7870 37.3169927584807866 173.101160562020 +7871 0.7871 37.2996729663979281 173.294681095200 +7872 0.7872 37.2823338286423507 173.488074016320 +7873 0.7873 37.2649753579746630 173.681339337500 +7874 0.7874 37.2475975671542372 173.874477070990 +7875 0.7875 37.2302004689392376 174.067487229050 +7876 0.7876 37.2127840760865851 174.260369824070 +7877 0.7877 37.1953484013519571 174.453124868540 +7878 0.7878 37.1778934574897804 174.645752375010 +7879 0.7879 37.1604192572532241 174.838252356120 +7880 0.7880 37.1429258133941858 175.030624824590 +7881 0.7881 37.1254131386632906 175.222869793270 +7882 0.7882 37.1078812458098781 175.414987275010 +7883 0.7883 37.0903301475819873 175.606977282830 +7884 0.7884 37.0727598567263570 175.798839829770 +7885 0.7885 37.0551703859884185 175.990574929010 +7886 0.7886 37.0375617481122816 176.182182593770 +7887 0.7887 37.0199339558407274 176.373662837380 +7888 0.7888 37.0022870219151940 176.565015673250 +7889 0.7889 36.9846209590757908 176.756241114860 +7890 0.7890 36.9669357800612559 176.947339175780 +7891 0.7891 36.9492314976089844 177.138309869690 +7892 0.7892 36.9315081244549859 177.329153210320 +7893 0.7893 36.9137656733338986 177.519869211470 +7894 0.7894 36.8960041569789681 177.710457887090 +7895 0.7895 36.8782235881220544 177.900919251150 +7896 0.7896 36.8604239794936106 178.091253317710 +7897 0.7897 36.8426053438226759 178.281460100950 +7898 0.7898 36.8247676938368755 178.471539615120 +7899 0.7899 36.8069110422623922 178.661491874500 +7900 0.7900 36.7890354018239876 178.851316893530 +7901 0.7901 36.7711407852449739 179.041014686680 +7902 0.7902 36.7532272052472138 179.230585268540 +7903 0.7903 36.7352946745510991 179.420028653730 +7904 0.7904 36.7173432058755651 179.609344857010 +7905 0.7905 36.6993728119380549 179.798533893170 +7906 0.7906 36.6813835054545407 179.987595777130 +7907 0.7907 36.6633752991394957 180.176530523840 +7908 0.7908 36.6453482057058864 180.365338148380 +7909 0.7909 36.6273022378651731 180.554018665900 +7910 0.7910 36.6092374083273029 180.742572091570 +7911 0.7911 36.5911537298006877 180.930998440750 +7912 0.7912 36.5730512149922120 181.119297728780 +7913 0.7913 36.5549298766072184 181.307469971150 +7914 0.7914 36.5367897273494933 181.495515183380 +7915 0.7915 36.5186307799212670 181.683433381110 +7916 0.7916 36.5004530470232069 181.871224580030 +7917 0.7917 36.4822565413544098 182.058888795920 +7918 0.7918 36.4640412756123808 182.246426044660 +7919 0.7919 36.4458072624930409 182.433836342170 +7920 0.7920 36.4275545146907049 182.621119704490 +7921 0.7921 36.4092830448980962 182.808276147710 +7922 0.7922 36.3909928658063109 182.995305688010 +7923 0.7923 36.3726839901048251 183.182208341650 +7924 0.7924 36.3543564304814950 183.368984124960 +7925 0.7925 36.3360101996225282 183.555633054370 +7926 0.7926 36.3176453102124910 183.742155146380 +7927 0.7927 36.2992617749342941 183.928550417530 +7928 0.7928 36.2808596064691926 184.114818884510 +7929 0.7929 36.2624388174967649 184.300960564030 +7930 0.7930 36.2439994206949194 184.486975472890 +7931 0.7931 36.2255414287398736 184.672863627980 +7932 0.7932 36.2070648543061608 184.858625046280 +7933 0.7933 36.1885697100666093 185.044259744820 +7934 0.7934 36.1700560086923346 185.229767740710 +7935 0.7935 36.1515237628527402 185.415149051160 +7936 0.7936 36.1329729852155097 185.600403693430 +7937 0.7937 36.1144036884465933 185.785531684870 +7938 0.7938 36.0958158852102073 185.970533042910 +7939 0.7939 36.0772095881688060 186.155407785060 +7940 0.7940 36.0585848099831097 186.340155928890 +7941 0.7941 36.0399415633120626 186.524777492060 +7942 0.7942 36.0212798608128466 186.709272492300 +7943 0.7943 36.0025997151408603 186.893640947420 +7944 0.7944 35.9839011389497259 187.077882875300 +7945 0.7945 35.9651841448912677 187.261998293910 +7946 0.7946 35.9464487456155055 187.445987221290 +7947 0.7947 35.9276949537706614 187.629849675530 +7948 0.7948 35.9089227820031454 187.813585674830 +7949 0.7949 35.8901322429575345 187.997195237450 +7950 0.7950 35.8713233492765724 188.180678381740 +7951 0.7951 35.8524961136011839 188.364035126100 +7952 0.7952 35.8336505485704251 188.547265489020 +7953 0.7953 35.8147866668215187 188.730369489060 +7954 0.7954 35.7959044809898188 188.913347144870 +7955 0.7955 35.7770040037088179 189.096198475140 +7956 0.7956 35.7580852476101256 189.278923498660 +7957 0.7957 35.7391482253234756 189.461522234310 +7958 0.7958 35.7201929494767114 189.643994701010 +7959 0.7959 35.7012194326957726 189.826340917760 +7960 0.7960 35.6822276876047013 190.008560903670 +7961 0.7961 35.6632177268256214 190.190654677860 +7962 0.7962 35.6441895629787524 190.372622259580 +7963 0.7963 35.6251432086823669 190.554463668120 +7964 0.7964 35.6060786765528192 190.736178922870 +7965 0.7965 35.5869959792045094 190.917768043280 +7966 0.7966 35.5678951292499050 191.099231048850 +7967 0.7967 35.5487761392995054 191.280567959200 +7968 0.7968 35.5296390219618488 191.461778793980 +7969 0.7969 35.5104837898435051 191.642863572940 +7970 0.7970 35.4913104555490619 191.823822315880 +7971 0.7971 35.4721190316811317 192.004655042690 +7972 0.7972 35.4529095308403299 192.185361773330 +7973 0.7973 35.4336819656252686 192.365942527830 +7974 0.7974 35.4144363486325631 192.546397326300 +7975 0.7975 35.3951726924568035 192.726726188880 +7976 0.7976 35.3758910096905694 192.906929135850 +7977 0.7977 35.3565913129244009 193.087006187500 +7978 0.7978 35.3372736147468132 193.266957364230 +7979 0.7979 35.3179379277442749 193.446782686500 +7980 0.7980 35.2985842645012085 193.626482174830 +7981 0.7981 35.2792126375999757 193.806055849830 +7982 0.7982 35.2598230596208779 193.985503732160 +7983 0.7983 35.2404155431421415 194.164825842560 +7984 0.7984 35.2209901007399182 194.344022201870 +7985 0.7985 35.2015467449882777 194.523092830930 +7986 0.7986 35.1820854884591938 194.702037750720 +7987 0.7987 35.1626063437225440 194.880856982270 +7988 0.7988 35.1431093233460956 195.059550546650 +7989 0.7989 35.1235944398955127 195.238118465040 +7990 0.7990 35.1040617059343276 195.416560758650 +7991 0.7991 35.0845111340239555 195.594877448820 +7992 0.7992 35.0649427367236726 195.773068556890 +7993 0.7993 35.0453565265906093 195.951134104320 +7994 0.7994 35.0257525161797645 196.129074112600 +7995 0.7995 35.0061307180439698 196.306888603340 +7996 0.7996 34.9864911447338969 196.484577598160 +7997 0.7997 34.9668338087980501 196.662141118780 +7998 0.7998 34.9471587227827598 196.839579187010 +7999 0.7999 34.9274658992321747 197.016891824680 +8000 0.8000 34.9077553506882552 197.194079053720 +8001 0.8001 34.8880270896907660 197.371140896130 +8002 0.8002 34.8682811287772623 197.548077373970 +8003 0.8003 34.8485174804830962 197.724888509350 +8004 0.8004 34.8287361573414032 197.901574324480 +8005 0.8005 34.8089371718830947 198.078134841620 +8006 0.8006 34.7891205366368581 198.254570083110 +8007 0.8007 34.7692862641291356 198.430880071340 +8008 0.8008 34.7494343668841310 198.607064828780 +8009 0.8009 34.7295648574237958 198.783124377960 +8010 0.8010 34.7096777482678220 198.959058741470 +8011 0.8011 34.6897730519336491 199.134867942000 +8012 0.8012 34.6698507809364358 199.310552002270 +8013 0.8013 34.6499109477890670 199.486110945090 +8014 0.8014 34.6299535650021468 199.661544793320 +8015 0.8015 34.6099786450839844 199.836853569900 +8016 0.8016 34.5899862005406007 200.012037297830 +8017 0.8017 34.5699762438757006 200.187096000180 +8018 0.8018 34.5499487875906865 200.362029700080 +8019 0.8019 34.5299038441846449 200.536838420730 +8020 0.8020 34.5098414261543383 200.711522185400 +8021 0.8021 34.4897615459941989 200.886081017400 +8022 0.8022 34.4696642161963211 201.060514940160 +8023 0.8023 34.4495494492504548 201.234823977120 +8024 0.8024 34.4294172576440047 201.409008151820 +8025 0.8025 34.4092676538620239 201.583067487830 +8026 0.8026 34.3891006503871921 201.757002008840 +8027 0.8027 34.3689162596998230 201.930811738560 +8028 0.8028 34.3487144942778571 202.104496700780 +8029 0.8029 34.3284953665968544 202.278056919340 +8030 0.8030 34.3082588891299807 202.451492418170 +8031 0.8031 34.2880050743480069 202.624803221250 +8032 0.8032 34.2677339347193097 202.797989352630 +8033 0.8033 34.2474454827098569 202.971050836410 +8034 0.8034 34.2271397307832004 203.143987696780 +8035 0.8035 34.2068166914004621 203.316799957970 +8036 0.8036 34.1864763770203481 203.489487644270 +8037 0.8037 34.1661188000991274 203.662050780080 +8038 0.8038 34.1457439730906316 203.834489389800 +8039 0.8039 34.1253519084462411 204.006803497940 +8040 0.8040 34.1049426186148921 204.178993129050 +8041 0.8041 34.0845161160430550 204.351058307750 +8042 0.8042 34.0640724131747277 204.522999058730 +8043 0.8043 34.0436115224514566 204.694815406740 +8044 0.8044 34.0231334563122942 204.866507376570 +8045 0.8045 34.0026382271938132 205.038074993100 +8046 0.8046 33.9821258475300922 205.209518281300 +8047 0.8047 33.9615963297527230 205.380837266120 +8048 0.8048 33.9410496862907820 205.552031972640 +8049 0.8049 33.9204859295708516 205.723102425980 +8050 0.8050 33.8999050720169848 205.894048651330 +8051 0.8051 33.8793071260507190 206.064870673940 +8052 0.8052 33.8586921040910696 206.235568519100 +8053 0.8053 33.8380600185545006 206.406142212210 +8054 0.8054 33.8174108818549541 206.576591778670 +8055 0.8055 33.7967447064038211 206.746917243990 +8056 0.8056 33.7760615046099346 206.917118633730 +8057 0.8057 33.7553612888795698 207.087195973510 +8058 0.8058 33.7346440716164437 207.257149288990 +8059 0.8059 33.7139098652216944 207.426978605930 +8060 0.8060 33.6931586820938946 207.596683950100 +8061 0.8061 33.6723905346290167 207.766265347390 +8062 0.8062 33.6516054352204605 207.935722823720 +8063 0.8063 33.6308033962590187 208.105056405050 +8064 0.8064 33.6099844301328901 208.274266117460 +8065 0.8065 33.5891485492276658 208.443351987010 +8066 0.8066 33.5682957659263224 208.612314039890 +8067 0.8067 33.5474260926092143 208.781152302330 +8068 0.8068 33.5265395416540670 208.949866800590 +8069 0.8069 33.5056361254359842 209.118457561040 +8070 0.8070 33.4847158563274263 209.286924610060 +8071 0.8071 33.4637787466982175 209.455267974130 +8072 0.8072 33.4428248089155247 209.623487679760 +8073 0.8073 33.4218540553438572 209.791583753550 +8074 0.8074 33.4008664983450743 209.959556222130 +8075 0.8075 33.3798621502783561 210.127405112200 +8076 0.8076 33.3588410235002186 210.295130450520 +8077 0.8077 33.3378031303644988 210.462732263920 +8078 0.8078 33.3167484832223408 210.630210579260 +8079 0.8079 33.2956770944222029 210.797565423490 +8080 0.8080 33.2745889763098504 210.964796823600 +8081 0.8081 33.2534841412283413 211.131904806650 +8082 0.8082 33.2323626015180196 211.298889399760 +8083 0.8083 33.2112243695165290 211.465750630070 +8084 0.8084 33.1900694575587849 211.632488524830 +8085 0.8085 33.1688978779769741 211.799103111340 +8086 0.8086 33.1477096431005620 211.965594416920 +8087 0.8087 33.1265047652562643 212.131962468990 +8088 0.8088 33.1052832567680682 212.298207295000 +8089 0.8089 33.0840451299571967 212.464328922480 +8090 0.8090 33.0627903971421233 212.630327378980 +8091 0.8091 33.0415190706385644 212.796202692160 +8092 0.8092 33.0202311627594725 212.961954889710 +8093 0.8093 32.9989266858150216 213.127583999360 +8094 0.8094 32.9776056521126080 213.293090048920 +8095 0.8095 32.9562680739568492 213.458473066270 +8096 0.8096 32.9349139636495707 213.623733079300 +8097 0.8097 32.9135433334898053 213.788870116010 +8098 0.8098 32.8921561957737865 213.953884204410 +8099 0.8099 32.8707525627949337 214.118775372600 +8100 0.8100 32.8493324468438672 214.283543648720 +8101 0.8101 32.8278958602083790 214.448189060980 +8102 0.8102 32.8064428151734475 214.612711637630 +8103 0.8103 32.7849733240212160 214.777111406980 +8104 0.8104 32.7634873990309998 214.941388397410 +8105 0.8105 32.7419850524792651 215.105542637330 +8106 0.8106 32.7204662966396356 215.269574155230 +8107 0.8107 32.6989311437828931 215.433482979640 +8108 0.8108 32.6773796061769559 215.597269139160 +8109 0.8109 32.6558116960868787 215.760932662430 +8110 0.8110 32.6342274257748528 215.924473578150 +8111 0.8111 32.6126268075001917 216.087891915090 +8112 0.8112 32.5910098535193384 216.251187702040 +8113 0.8113 32.5693765760858440 216.414360967900 +8114 0.8114 32.5477269874503676 216.577411741560 +8115 0.8115 32.5260610998606907 216.740340052010 +8116 0.8116 32.5043789255616744 216.903145928270 +8117 0.8117 32.4826804767952879 217.065829399450 +8118 0.8118 32.4609657658005801 217.228390494670 +8119 0.8119 32.4392348048136867 217.390829243140 +8120 0.8120 32.4174876060678230 217.553145674090 +8121 0.8121 32.3957241817932768 217.715339816830 +8122 0.8122 32.3739445442174016 217.877411700720 +8123 0.8123 32.3521487055646091 218.039361355170 +8124 0.8124 32.3303366780563692 218.201188809640 +8125 0.8125 32.3085084739112034 218.362894093660 +8126 0.8126 32.2866641053446841 218.524477236780 +8127 0.8127 32.2648035845694139 218.685938268640 +8128 0.8128 32.2429269237950393 218.847277218920 +8129 0.8129 32.2210341352282228 219.008494117340 +8130 0.8130 32.1991252310726708 219.169588993690 +8131 0.8131 32.1772002235290984 219.330561877810 +8132 0.8132 32.1552591247952293 219.491412799580 +8133 0.8133 32.1333019470658030 219.652141788950 +8134 0.8134 32.1113287025325604 219.812748875920 +8135 0.8135 32.0893394033842370 219.973234090520 +8136 0.8136 32.0673340618065694 220.133597462880 +8137 0.8137 32.0453126899822678 220.293839023120 +8138 0.8138 32.0232753000910364 220.453958801460 +8139 0.8139 32.0012219043095527 220.613956828170 +8140 0.8140 31.9791525148114637 220.773833133540 +8141 0.8141 31.9570671437673894 220.933587747920 +8142 0.8142 31.9349658033449053 221.093220701760 +8143 0.8143 31.9128485057085420 221.252732025490 +8144 0.8144 31.8907152630197857 221.412121749640 +8145 0.8145 31.8685660874370633 221.571389904790 +8146 0.8146 31.8464009911157468 221.730536521520 +8147 0.8147 31.8242199862081421 221.889561630550 +8148 0.8148 31.8020230848634853 222.048465262560 +8149 0.8149 31.7798102992279397 222.207247448340 +8150 0.8150 31.7575816414445882 222.365908218710 +8151 0.8151 31.7353371236534230 222.524447604560 +8152 0.8152 31.7130767579913559 222.682865636780 +8153 0.8153 31.6908005565921975 222.841162346370 +8154 0.8154 31.6685085315866601 222.999337764360 +8155 0.8155 31.6462006951023511 223.157391921820 +8156 0.8156 31.6238770592637657 223.315324849860 +8157 0.8157 31.6015376361922904 223.473136579670 +8158 0.8158 31.5791824380061819 223.630827142480 +8159 0.8159 31.5568114768205810 223.788396569570 +8160 0.8160 31.5344247647474916 223.945844892250 +8161 0.8161 31.5120223138957840 224.103172141910 +8162 0.8162 31.4896041363711880 224.260378349980 +8163 0.8163 31.4671702442762928 224.417463547930 +8164 0.8164 31.4447206497105327 224.574427767280 +8165 0.8165 31.4222553647701872 224.731271039600 +8166 0.8166 31.3997744015483811 224.887993396530 +8167 0.8167 31.3772777721350664 225.044594869750 +8168 0.8168 31.3547654886170299 225.201075490960 +8169 0.8169 31.3322375630778858 225.357435291940 +8170 0.8170 31.3096940075980648 225.513674304500 +8171 0.8171 31.2871348342548146 225.669792560530 +8172 0.8172 31.2645600551221925 225.825790091940 +8173 0.8173 31.2419696822710620 225.981666930690 +8174 0.8174 31.2193637277690890 226.137423108790 +8175 0.8175 31.1967422036807349 226.293058658310 +8176 0.8176 31.1741051220672496 226.448573611370 +8177 0.8177 31.1514524949866747 226.603968000120 +8178 0.8178 31.1287843344938295 226.759241856770 +8179 0.8179 31.1061006526403112 226.914395213570 +8180 0.8180 31.0834014614744909 227.069428102840 +8181 0.8181 31.0606867730415033 227.224340556910 +8182 0.8182 31.0379565993832500 227.379132608180 +8183 0.8183 31.0152109525383857 227.533804289110 +8184 0.8184 30.9924498445423211 227.688355632200 +8185 0.8185 30.9696732874272129 227.842786669960 +8186 0.8186 30.9468812932219635 227.997097435010 +8187 0.8187 30.9240738739522136 228.151287959970 +8188 0.8188 30.9012510416403394 228.305358277530 +8189 0.8189 30.8784128083054412 228.459308420420 +8190 0.8190 30.8555591859633509 228.613138421400 +8191 0.8191 30.8326901866266141 228.766848313310 +8192 0.8192 30.8098058223044973 228.920438129020 +8193 0.8193 30.7869061050029735 229.073907901440 +8194 0.8194 30.7639910467247262 229.227257663540 +8195 0.8195 30.7410606594691309 229.380487448330 +8196 0.8196 30.7181149552322736 229.533597288840 +8197 0.8197 30.6951539460069220 229.686587218200 +8198 0.8198 30.6721776437825326 229.839457269570 +8199 0.8199 30.6491860605452473 229.992207476110 +8200 0.8200 30.6261792082778861 230.144837871080 +8201 0.8201 30.6031570989599437 230.297348487750 +8202 0.8202 30.5801197445675825 230.449739359470 +8203 0.8203 30.5570671570736287 230.602010519610 +8204 0.8204 30.5339993484475691 230.754162001590 +8205 0.8205 30.5109163306555473 230.906193838870 +8206 0.8206 30.4878181156603532 231.058106064990 +8207 0.8207 30.4647047154214299 231.209898713480 +8208 0.8208 30.4415761418948598 231.361571817950 +8209 0.8209 30.4184324070333609 231.513125412060 +8210 0.8210 30.3952735227862831 231.664559529500 +8211 0.8211 30.3720995010996084 231.815874204000 +8212 0.8212 30.3489103539159402 231.967069469340 +8213 0.8213 30.3257060931745031 232.118145359370 +8214 0.8214 30.3024867308111361 232.269101907940 +8215 0.8215 30.2792522787582890 232.419939148980 +8216 0.8216 30.2560027489450185 232.570657116450 +8217 0.8217 30.2327381532969781 232.721255844340 +8218 0.8218 30.2094585037364247 232.871735366710 +8219 0.8219 30.1861638121822047 233.022095717660 +8220 0.8220 30.1628540905497573 233.172336931320 +8221 0.8221 30.1395293507510971 233.322459041860 +8222 0.8222 30.1161896046948279 233.472462083540 +8223 0.8223 30.0928348642861216 233.622346090600 +8224 0.8224 30.0694651414267256 233.772111097350 +8225 0.8225 30.0460804480149513 233.921757138150 +8226 0.8226 30.0226807959456714 234.071284247430 +8227 0.8227 29.9992661971103196 234.220692459590 +8228 0.8228 29.9758366633968834 234.369981809140 +8229 0.8229 29.9523922066898969 234.519152330590 +8230 0.8230 29.9289328388704412 234.668204058530 +8231 0.8231 29.9054585718161370 234.817137027570 +8232 0.8232 29.8819694174011410 234.965951272370 +8233 0.8233 29.8584653874961425 235.114646827620 +8234 0.8234 29.8349464939683564 235.263223728080 +8235 0.8235 29.8114127486815264 235.411682008520 +8236 0.8236 29.7878641634959109 235.560021703770 +8237 0.8237 29.7643007502682870 235.708242848710 +8238 0.8238 29.7407225208519392 235.856345478250 +8239 0.8239 29.7171294870966598 236.004329627350 +8240 0.8240 29.6935216608487416 236.152195330990 +8241 0.8241 29.6698990539509815 236.299942624230 +8242 0.8242 29.6462616782426629 236.447571542130 +8243 0.8243 29.6226095455595662 236.595082119830 +8244 0.8244 29.5989426677339509 236.742474392490 +8245 0.8245 29.5752610565945595 236.889748395310 +8246 0.8246 29.5515647239666173 237.036904163550 +8247 0.8247 29.5278536816718145 237.183941732480 +8248 0.8248 29.5041279415283171 237.330861137450 +8249 0.8249 29.4803875153507526 237.477662413830 +8250 0.8250 29.4566324149502101 237.624345597030 +8251 0.8251 29.4328626521342329 237.770910722490 +8252 0.8252 29.4090782387068224 237.917357825730 +8253 0.8253 29.3852791864684235 238.063686942270 +8254 0.8254 29.3614655072159252 238.209898107690 +8255 0.8255 29.3376372127426599 238.355991357630 +8256 0.8256 29.3137943148383933 238.501966727700 +8257 0.8257 29.2899368252893275 238.647824253650 +8258 0.8258 29.2660647558780838 238.793563971190 +8259 0.8259 29.2421781183837197 238.939185916100 +8260 0.8260 29.2182769245817049 239.084690124210 +8261 0.8261 29.1943611862439241 239.230076631380 +8262 0.8262 29.1704309151386774 239.375345473520 +8263 0.8263 29.1464861230306731 239.520496686530 +8264 0.8264 29.1225268216810242 239.665530306440 +8265 0.8265 29.0985530228472413 239.810446369250 +8266 0.8266 29.0745647382832288 239.955244911020 +8267 0.8267 29.0505619797392853 240.099925967840 +8268 0.8268 29.0265447589620997 240.244489575870 +8269 0.8269 29.0025130876947408 240.388935771280 +8270 0.8270 28.9784669776766641 240.533264590280 +8271 0.8271 28.9544064406436945 240.677476069130 +8272 0.8272 28.9303314883280329 240.821570244130 +8273 0.8273 28.9062421324582459 240.965547151630 +8274 0.8274 28.8821383847592656 241.109406827990 +8275 0.8275 28.8580202569523863 241.253149309620 +8276 0.8276 28.8338877607552568 241.396774632980 +8277 0.8277 28.8097409078818814 241.540282834560 +8278 0.8278 28.7855797100426081 241.683673950900 +8279 0.8279 28.7614041789441366 241.826948018550 +8280 0.8280 28.7372143262895037 241.970105074130 +8281 0.8281 28.7130101637780832 242.113145154290 +8282 0.8282 28.6887917031055828 242.256068295700 +8283 0.8283 28.6645589559640435 242.398874535100 +8284 0.8284 28.6403119340418257 242.541563909230 +8285 0.8285 28.6160506490236166 242.684136454920 +8286 0.8286 28.5917751125904225 242.826592208970 +8287 0.8287 28.5674853364195620 242.968931208270 +8288 0.8288 28.5431813321846626 243.111153489750 +8289 0.8289 28.5188631115556568 243.253259090350 +8290 0.8290 28.4945306861987859 243.395248047040 +8291 0.8291 28.4701840677765894 243.537120396860 +8292 0.8292 28.4458232679479011 243.678876176880 +8293 0.8293 28.4214482983678458 243.820515424190 +8294 0.8294 28.3970591706878395 243.962038175940 +8295 0.8295 28.3726558965555782 244.103444469290 +8296 0.8296 28.3482384876150419 244.244734341460 +8297 0.8297 28.3238069555064840 244.385907829700 +8298 0.8298 28.2993613118664342 244.526964971290 +8299 0.8299 28.2749015683276923 244.667905803570 +8300 0.8300 28.2504277365193204 244.808730363890 +8301 0.8301 28.2259398280666431 244.949438689640 +8302 0.8302 28.2014378545912479 245.090030818250 +8303 0.8303 28.1769218277109736 245.230506787220 +8304 0.8304 28.1523917590399115 245.370866634020 +8305 0.8305 28.1278476601884009 245.511110396220 +8306 0.8306 28.1032895427630187 245.651238111400 +8307 0.8307 28.0787174183665904 245.791249817150 +8308 0.8308 28.0541312985981754 245.931145551150 +8309 0.8309 28.0295311950530639 246.070925351060 +8310 0.8310 28.0049171193227799 246.210589254630 +8311 0.8311 27.9802890829950677 246.350137299600 +8312 0.8312 27.9556470976538982 246.489569523780 +8313 0.8313 27.9309911748794590 246.628885965000 +8314 0.8314 27.9063213262481540 246.768086661120 +8315 0.8315 27.8816375633325961 246.907171650030 +8316 0.8316 27.8569398977016078 247.046140969710 +8317 0.8317 27.8322283409202171 247.184994658090 +8318 0.8318 27.8075029045496507 247.323732753210 +8319 0.8319 27.7827636001473373 247.462355293080 +8320 0.8320 27.7580104392668936 247.600862315810 +8321 0.8321 27.7332434334581279 247.739253859510 +8322 0.8322 27.7084625942670364 247.877529962320 +8323 0.8323 27.6836679332357996 248.015690662420 +8324 0.8324 27.6588594619027752 248.153735998040 +8325 0.8325 27.6340371918025021 248.291666007440 +8326 0.8326 27.6092011344656854 248.429480728890 +8327 0.8327 27.5843513014192041 248.567180200730 +8328 0.8328 27.5594877041861039 248.704764461300 +8329 0.8329 27.5346103542855900 248.842233549000 +8330 0.8330 27.5097192632330270 248.979587502270 +8331 0.8331 27.4848144425399354 249.116826359560 +8332 0.8332 27.4598959037139885 249.253950159360 +8333 0.8333 27.4349636582590115 249.390958940200 +8334 0.8334 27.4100177176749682 249.527852740650 +8335 0.8335 27.3850580934579710 249.664631599300 +8336 0.8336 27.3600847971002672 249.801295554790 +8337 0.8337 27.3350978400902385 249.937844645770 +8338 0.8338 27.3100972339124013 250.074278910960 +8339 0.8339 27.2850829900473997 250.210598389070 +8340 0.8340 27.2600551199720016 250.346803118880 +8341 0.8341 27.2350136351590990 250.482893139180 +8342 0.8342 27.2099585470776972 250.618868488820 +8343 0.8343 27.1848898671929255 250.754729206640 +8344 0.8344 27.1598076069660159 250.890475331550 +8345 0.8345 27.1347117778543137 251.026106902490 +8346 0.8346 27.1096023913112667 251.161623958420 +8347 0.8347 27.0844794587864293 251.297026538330 +8348 0.8348 27.0593429917254475 251.432314681270 +8349 0.8349 27.0341930015700704 251.567488426290 +8350 0.8350 27.0090294997581317 251.702547812480 +8351 0.8351 26.9838524977235572 251.837492878990 +8352 0.8352 26.9586620068963576 251.972323664970 +8353 0.8353 26.9334580387026286 252.107040209610 +8354 0.8354 26.9082406045645399 252.241642552160 +8355 0.8355 26.8830097159003394 252.376130731840 +8356 0.8356 26.8577653841243489 252.510504787980 +8357 0.8357 26.8325076206469575 252.644764759880 +8358 0.8358 26.8072364368746179 252.778910686910 +8359 0.8359 26.7819518442098499 252.912942608450 +8360 0.8360 26.7566538540512298 253.046860563920 +8361 0.8361 26.7313424777933939 253.180664592790 +8362 0.8362 26.7060177268270280 253.314354734510 +8363 0.8363 26.6806796125388708 253.447931028640 +8364 0.8364 26.6553281463117031 253.581393514680 +8365 0.8365 26.6299633395243553 253.714742232240 +8366 0.8366 26.6045852035516965 253.847977220930 +8367 0.8367 26.5791937497646309 253.981098520370 +8368 0.8368 26.5537889895300978 254.114106170260 +8369 0.8369 26.5283709342110718 254.247000210290 +8370 0.8370 26.5029395951665485 254.379780680190 +8371 0.8371 26.4774949837515514 254.512447619740 +8372 0.8372 26.4520371113171286 254.645001068740 +8373 0.8373 26.4265659892103422 254.777441067020 +8374 0.8374 26.4010816287742713 254.909767654410 +8375 0.8375 26.3755840413480094 255.041980870840 +8376 0.8376 26.3500732382666563 255.174080756220 +8377 0.8377 26.3245492308613223 255.306067350480 +8378 0.8378 26.2990120304591173 255.437940693630 +8379 0.8379 26.2734616483831509 255.569700825690 +8380 0.8380 26.2478980959525323 255.701347786670 +8381 0.8381 26.2223213844823668 255.832881616670 +8382 0.8382 26.1967315252837452 255.964302355780 +8383 0.8383 26.1711285296637470 256.095610044160 +8384 0.8384 26.1455124089254412 256.226804721950 +8385 0.8385 26.1198831743678745 256.357886429350 +8386 0.8386 26.0942408372860761 256.488855206600 +8387 0.8387 26.0685854089710496 256.619711093930 +8388 0.8388 26.0429169007097698 256.750454131650 +8389 0.8389 26.0172353237851830 256.881084360070 +8390 0.8390 25.9915406894762029 257.011601819520 +8391 0.8391 25.9658330090577074 257.142006550390 +8392 0.8392 25.9401122938005351 257.272298593070 +8393 0.8393 25.9143785549714813 257.402477988010 +8394 0.8394 25.8886318038332988 257.532544775650 +8395 0.8395 25.8628720516446897 257.662498996510 +8396 0.8396 25.8370993096603101 257.792340691100 +8397 0.8397 25.8113135891307550 257.922069899970 +8398 0.8398 25.7855149013025731 258.051686663680 +8399 0.8399 25.7597032574182450 258.181191022880 +8400 0.8400 25.7338786687161942 258.310583018170 +8401 0.8401 25.7080411464307730 258.439862690250 +8402 0.8402 25.6821907017922726 258.569030079780 +8403 0.8403 25.6563273460269059 258.698085227520 +8404 0.8404 25.6304510903568215 258.827028174200 +8405 0.8405 25.6045619460000822 258.955858960600 +8406 0.8406 25.5786599241706760 259.084577627550 +8407 0.8407 25.5527450360785053 259.213184215870 +8408 0.8408 25.5268172929293904 259.341678766440 +8409 0.8409 25.5008767059250623 259.470061320140 +8410 0.8410 25.4749232862631594 259.598331917930 +8411 0.8411 25.4489570451372273 259.726490600720 +8412 0.8412 25.4229779937367155 259.854537409510 +8413 0.8413 25.3969861432469735 259.982472385300 +8414 0.8414 25.3709815048492509 260.110295569150 +8415 0.8415 25.3449640897206905 260.238007002090 +8416 0.8416 25.3189339090343246 260.365606725240 +8417 0.8417 25.2928909739590786 260.493094779700 +8418 0.8418 25.2668352956597637 260.620471206630 +8419 0.8419 25.2407668852970701 260.747736047210 +8420 0.8420 25.2146857540275775 260.874889342630 +8421 0.8421 25.1885919130037408 261.001931134130 +8422 0.8422 25.1624853733738867 261.128861462950 +8423 0.8423 25.1363661462822208 261.255680370400 +8424 0.8424 25.1102342428688097 261.382387897790 +8425 0.8425 25.0840896742695989 261.508984086430 +8426 0.8426 25.0579324516163915 261.635468977720 +8427 0.8427 25.0317625860368551 261.761842613040 +8428 0.8428 25.0055800886545114 261.888105033810 +8429 0.8429 24.9793849705887467 262.014256281480 +8430 0.8430 24.9531772429547942 262.140296397540 +8431 0.8431 24.9269569168637446 262.266225423460 +8432 0.8432 24.9007240034225319 262.392043400800 +8433 0.8433 24.8744785137339370 262.517750371080 +8434 0.8434 24.8482204588965878 262.643346375920 +8435 0.8435 24.8219498500049482 262.768831456900 +8436 0.8436 24.7956666981493186 262.894205655670 +8437 0.8437 24.7693710144158423 263.019469013880 +8438 0.8438 24.7430628098864851 263.144621573230 +8439 0.8439 24.7167420956390522 263.269663375430 +8440 0.8440 24.6904088827471710 263.394594462210 +8441 0.8441 24.6640631822802945 263.519414875330 +8442 0.8442 24.6377050053036974 263.644124656610 +8443 0.8443 24.6113343628784733 263.768723847840 +8444 0.8444 24.5849512660615375 263.893212490880 +8445 0.8445 24.5585557259056131 264.017590627600 +8446 0.8446 24.5321477534592383 264.141858299880 +8447 0.8447 24.5057273597667624 264.266015549650 +8448 0.8448 24.4792945558683357 264.390062418870 +8449 0.8449 24.4528493527999160 264.513998949490 +8450 0.8450 24.4263917615932655 264.637825183520 +8451 0.8451 24.3999217932759400 264.761541162990 +8452 0.8452 24.3734394588712924 264.885146929930 +8453 0.8453 24.3469447693984762 265.008642526420 +8454 0.8454 24.3204377358724280 265.132027994560 +8455 0.8455 24.2939183693038743 265.255303376490 +8456 0.8456 24.2673866806993317 265.378468714330 +8457 0.8457 24.2408426810610997 265.501524050280 +8458 0.8458 24.2142863813872573 265.624469426540 +8459 0.8459 24.1877177926716662 265.747304885310 +8460 0.8460 24.1611369259039570 265.870030468850 +8461 0.8461 24.1345437920695431 265.992646219440 +8462 0.8462 24.1079384021496033 266.115152179380 +8463 0.8463 24.0813207671210847 266.237548390990 +8464 0.8464 24.0546908979567036 266.359834896600 +8465 0.8465 24.0280488056249446 266.482011738610 +8466 0.8466 24.0013945010900436 266.604078959410 +8467 0.8467 23.9747279953120014 266.726036601410 +8468 0.8468 23.9480492992465770 266.847884707070 +8469 0.8469 23.9213584238452803 266.969623318850 +8470 0.8470 23.8946553800553758 267.091252479230 +8471 0.8471 23.8679401788198753 267.212772230750 +8472 0.8472 23.8412128310775415 267.334182615950 +8473 0.8473 23.8144733477628741 267.455483677390 +8474 0.8474 23.7877217398061198 267.576675457670 +8475 0.8475 23.7609580181332660 267.697757999380 +8476 0.8476 23.7341821936660402 267.818731345170 +8477 0.8477 23.7073942773218960 267.939595537710 +8478 0.8478 23.6805942800140272 268.060350619680 +8479 0.8479 23.6537822126513539 268.180996633780 +8480 0.8480 23.6269580861385258 268.301533622760 +8481 0.8481 23.6001219113759220 268.421961629350 +8482 0.8482 23.5732736992596372 268.542280696350 +8483 0.8483 23.5464134606814923 268.662490866560 +8484 0.8484 23.5195412065290235 268.782592182790 +8485 0.8485 23.4926569476854894 268.902584687900 +8486 0.8486 23.4657606950298572 269.022468424760 +8487 0.8487 23.4388524594368057 269.142243436280 +8488 0.8488 23.4119322517767259 269.261909765350 +8489 0.8489 23.3850000829157132 269.381467454920 +8490 0.8490 23.3580559637155680 269.500916547980 +8491 0.8491 23.3310999050337955 269.620257087470 +8492 0.8492 23.3041319177236019 269.739489116430 +8493 0.8493 23.2771520126338842 269.858612677890 +8494 0.8494 23.2501602006092440 269.977627814900 +8495 0.8495 23.2231564924899736 270.096534570540 +8496 0.8496 23.1961408991120521 270.215332987900 +8497 0.8497 23.1691134313071494 270.334023110120 +8498 0.8498 23.1420740999026258 270.452604980320 +8499 0.8499 23.1150229157215250 270.571078641690 +8500 0.8500 23.0879598895825708 270.689444137410 +8501 0.8501 23.0608850323002592 270.807701508821 +8502 0.8502 23.0337983546860734 270.925850774897 +8503 0.8503 23.0066998675517382 271.043891911833 +8504 0.8504 22.9795895817135722 271.161824851482 +8505 0.8505 22.9524675079969178 271.279649481576 +8506 0.8506 22.9253336572405395 271.397365645986 +8507 0.8507 22.8981880403009903 271.514973145028 +8508 0.8508 22.8710306680569566 271.632471735667 +8509 0.8509 22.8438615514135819 271.749861131803 +8510 0.8510 22.8166807013067654 271.867141004540 +8511 0.8511 22.7894881287074149 271.984310982441 +8512 0.8512 22.7622838446257028 272.101370651793 +8513 0.8513 22.7350678601152723 272.218319556841 +8514 0.8514 22.7078401862774264 272.335157200091 +8515 0.8515 22.6806008342652952 272.451883042538 +8516 0.8516 22.6533498152879709 272.568496503946 +8517 0.8517 22.6260871406146187 272.684996963124 +8518 0.8518 22.5988128215785586 272.801383758101 +8519 0.8519 22.5715268695813265 272.917656186509 +8520 0.8520 22.5442292960967130 273.033813505774 +8521 0.8521 22.5169201126747573 273.149854933367 +8522 0.8522 22.4895993309457332 273.265779647092 +8523 0.8523 22.4622669626241098 273.381586785360 +8524 0.8524 22.4349230195124711 273.497275447394 +8525 0.8525 22.4075675135054233 273.612844693546 +8526 0.8526 22.3802004565934709 273.728293545531 +8527 0.8527 22.3528218608668610 273.843620986670 +8528 0.8528 22.3254317385194163 273.958825962208 +8529 0.8529 22.2980301018523299 274.073907379509 +8530 0.8530 22.2706169632779378 274.188864108335 +8531 0.8531 22.2431923353234637 274.303694981147 +8532 0.8532 22.2157562306347423 274.418398793279 +8533 0.8533 22.1883086619799137 274.532974303284 +8534 0.8534 22.1608496422530905 274.647420233160 +8535 0.8535 22.1333791844780023 274.761735268585 +8536 0.8536 22.1058973018116127 274.875918059204 +8537 0.8537 22.0784040075477073 274.989967218872 +8538 0.8538 22.0508993151204642 275.103881325958 +8539 0.8539 22.0233832381079893 275.217658923509 +8540 0.8540 21.9958557902358329 275.331298519603 +8541 0.8541 21.9683169853804756 275.444798587557 +8542 0.8542 21.9407668375727880 275.558157566188 +8543 0.8543 21.9132053610014736 275.671373860089 +8544 0.8544 21.8856325700164760 275.784445839886 +8545 0.8545 21.8580484791323570 275.897371842465 +8546 0.8546 21.8304531030316724 276.010150171250 +8547 0.8547 21.8028464565682860 276.122779096490 +8548 0.8548 21.7752285547706919 276.235256855425 +8549 0.8549 21.7475994128452861 276.347581652670 +8550 0.8550 21.7199590461796355 276.459751660346 +8551 0.8551 21.6923074703456962 276.571765018423 +8552 0.8552 21.6646447011030290 276.683619834945 +8553 0.8553 21.6369707544019683 276.795314186268 +8554 0.8554 21.6092856463867875 276.906846117334 +8555 0.8555 21.5815893933988221 277.018213641975 +8556 0.8556 21.5538820119795709 277.129414743060 +8557 0.8557 21.5261635188737763 277.240447372798 +8558 0.8558 21.4984339310324835 277.351309453062 +8559 0.8559 21.4706932656160525 277.461998875526 +8560 0.8560 21.4429415399971752 277.572513502033 +8561 0.8561 21.4151787717638378 277.682851164715 +8562 0.8562 21.3874049787222837 277.793009666385 +8563 0.8563 21.3596201788999274 277.902986780722 +8564 0.8564 21.3318243905482667 278.012780252468 +8565 0.8565 21.3040176321457508 278.122387797818 +8566 0.8566 21.2761999224006324 278.231807104557 +8567 0.8567 21.2483712802537852 278.341035832354 +8568 0.8568 21.2205317248815177 278.450071613010 +8569 0.8569 21.1926812756983338 278.558912050700 +8570 0.8570 21.1648199523596858 278.667554722267 +8571 0.8571 21.1369477747647032 278.775997177398 +8572 0.8572 21.1090647630588890 278.884236938919 +8573 0.8573 21.0811709376367880 278.992271503081 +8574 0.8574 21.0532663191446474 279.100098339723 +8575 0.8575 21.0253509284830322 279.207714892591 +8576 0.8576 20.9974247868094253 279.315118579566 +8577 0.8577 20.9694879155408032 279.422306792902 +8578 0.8578 20.9415403363561836 279.529276899478 +8579 0.8579 20.9135820711991549 279.636026241072 +8580 0.8580 20.8856131422803735 279.742552134583 +8581 0.8581 20.8576335720800330 279.848851872254 +8582 0.8582 20.8296433833503194 279.954922721994 +8583 0.8583 20.8016425991178409 280.060761927551 +8584 0.8584 20.7736312426860223 280.166366708811 +8585 0.8585 20.7456093376374824 280.271734261961 +8586 0.8586 20.7175769078363885 280.376861759889 +8587 0.8587 20.6895339774307807 280.481746352256 +8588 0.8588 20.6614805708548772 280.586385165833 +8589 0.8589 20.6334167128313481 280.690775304774 +8590 0.8590 20.6053424283735716 280.794913850782 +8591 0.8591 20.5772577427878645 280.898797863393 +8592 0.8592 20.5491626816756856 281.002424380207 +8593 0.8593 20.5210572709358168 281.105790417164 +8594 0.8594 20.4929415367665193 281.208892968754 +8595 0.8595 20.4648155056676693 281.311729008255 +8596 0.8596 20.4366792044428571 281.414295488006 +8597 0.8597 20.4085326602014767 281.516589339618 +8598 0.8598 20.3803759003607858 281.618607474230 +8599 0.8599 20.3522089526479384 281.720346782738 +8600 0.8600 20.3240318451019988 281.821804136061 +8601 0.8601 20.2958446060759279 281.922976385379 +8602 0.8602 20.2676472642385441 282.023860362307 +8603 0.8603 20.2394398485764668 282.124452879235 +8604 0.8604 20.2112223883960311 282.224750729486 +8605 0.8605 20.1829949133251745 282.324750687613 +8606 0.8606 20.1547574533153160 282.424449509567 +8607 0.8607 20.1265100386431861 282.523843933027 +8608 0.8608 20.0982526999126563 282.622930677546 +8609 0.8609 20.0699854680565366 282.721706444844 +8610 0.8610 20.0417083743383415 282.820167919032 +8611 0.8611 20.0134214503540484 282.918311766856 +8612 0.8612 19.9851247280338136 283.016134637867 +8613 0.8613 19.9568182396436811 283.113633164782 +8614 0.8614 19.9285020177872632 283.210803963589 +8615 0.8615 19.9001760954073923 283.307643633851 +8616 0.8616 19.8718405057877519 283.404148758942 +8617 0.8617 19.8434952825544926 283.500315906254 +8618 0.8618 19.8151404596778065 283.596141627437 +8619 0.8619 19.7867760714735041 283.691622458625 +8620 0.8620 19.7584021526045390 283.786754920683 +8621 0.8621 19.7300187380825314 283.881535519453 +8622 0.8622 19.7016258632692640 283.975960745916 +8623 0.8623 19.6732235638781425 284.070027076496 +8624 0.8624 19.6448118759756554 284.163730973253 +8625 0.8625 19.6163908359827843 284.257068884151 +8626 0.8626 19.5879604806764149 284.350037243218 +8627 0.8627 19.5595208471907149 284.442632470817 +8628 0.8628 19.5310719730184807 284.534850973900 +8629 0.8629 19.5026138960124769 284.626689146174 +8630 0.8630 19.4741466543867503 284.718143368368 +8631 0.8631 19.4456702867179096 284.809210008454 +8632 0.8632 19.4171848319463933 284.899885421882 +8633 0.8633 19.3886903293777095 284.990165951759 +8634 0.8634 19.3601868186836654 285.080047929121 +8635 0.8635 19.3316743399035502 285.169527673158 +8636 0.8636 19.3031529334453218 285.258601491398 +8637 0.8637 19.2746226400867542 285.347265679970 +8638 0.8638 19.2460835009765638 285.435516523817 +8639 0.8639 19.2175355576355287 285.523350296886 +8640 0.8640 19.1889788519575646 285.610763262402 +8641 0.8641 19.1604134262107912 285.697751673041 +8642 0.8642 19.1318393230385801 285.784311771204 +8643 0.8643 19.1032565854605600 285.870439789174 +8644 0.8644 19.0746652568736330 285.956131949370 +8645 0.8645 19.0460653810529337 286.041384464582 +8646 0.8646 19.0174570021527956 286.126193538153 +8647 0.8647 18.9888401647076783 286.210555364221 +8648 0.8648 18.9602149136330702 286.294466127934 +8649 0.8649 18.9315812942263904 286.377922005640 +8650 0.8650 18.9029393521678521 286.460919165159 +8651 0.8651 18.8742891335212981 286.543453765922 +8652 0.8652 18.8456306847350383 286.625521959274 +8653 0.8653 18.8169640526426427 286.707119888611 +8654 0.8654 18.7882892844637297 286.788243689641 +8655 0.8655 18.7596064278047194 286.868889490558 +8656 0.8656 18.7309155306595763 286.949053412340 +8657 0.8657 18.7022166414105193 287.028731568832 +8658 0.8658 18.6735098088287259 287.107920067055 +8659 0.8659 18.6447950820750030 287.186615007395 +8660 0.8660 18.6160725107004446 287.264812483794 +8661 0.8661 18.5873421446470566 287.342508583999 +8662 0.8662 18.5586040342483720 287.419699389691 +8663 0.8663 18.5298582302300474 287.496380976796 +8664 0.8664 18.5011047837104243 287.572549415632 +8665 0.8665 18.4723437462010871 287.648200771135 +8666 0.8666 18.4435751696073780 287.723331103050 +8667 0.8667 18.4147991062289194 287.797936466145 +8668 0.8668 18.3860156087600899 287.872012910436 +8669 0.8669 18.3572247302905005 287.945556481362 +8670 0.8670 18.3284265243054314 288.018563220016 +8671 0.8671 18.2996210446862619 288.091029163339 +8672 0.8672 18.2708083457108792 288.162950344294 +8673 0.8673 18.2419884820540581 288.234322792117 +8674 0.8674 18.2131615087878274 288.305142532523 +8675 0.8675 18.1843274813818105 288.375405587835 +8676 0.8676 18.1554864557035565 288.445107977264 +8677 0.8677 18.1266384880188376 288.514245717085 +8678 0.8678 18.0977836349919450 288.582814820779 +8679 0.8679 18.0689219536859369 288.650811299369 +8680 0.8680 18.0400535015628947 288.718231161443 +8681 0.8681 18.0111783364841465 288.785070413509 +8682 0.8682 17.9822965167104662 288.851325060092 +8683 0.8683 17.9534081009022621 288.916991103975 +8684 0.8684 17.9245131481197433 288.982064546390 +8685 0.8685 17.8956117178230656 289.046541387194 +8686 0.8686 17.8667038698724525 289.110417625080 +8687 0.8687 17.8377896645283087 289.173689257771 +8688 0.8688 17.8088691624513089 289.236352282223 +8689 0.8689 17.7799424247024582 289.298402694794 +8690 0.8690 17.7510095127431455 289.359836491446 +8691 0.8691 17.7220704884351754 289.420649667955 +8692 0.8692 17.6931254140407752 289.480838220047 +8693 0.8693 17.6641743522225880 289.540398143676 +8694 0.8694 17.6352173660436478 289.599325435141 +8695 0.8695 17.6062545189673259 289.657616091308 +8696 0.8696 17.5772858748572709 289.715266109770 +8697 0.8697 17.5483114979773305 289.772271489071 +8698 0.8698 17.5193314529914339 289.828628228884 +8699 0.8699 17.4903458049634821 289.884332330172 +8700 0.8700 17.4613546193572020 289.939379795405 +8701 0.8701 17.4323579620359972 289.993766628716 +8702 0.8702 17.4033558992627562 290.047488836116 +8703 0.8703 17.3743484976996676 290.100542425664 +8704 0.8704 17.3453358244080036 290.152923407628 +8705 0.8705 17.3163179468478852 290.204627794725 +8706 0.8706 17.2872949328780372 290.255651602239 +8707 0.8707 17.2582668507555148 290.305990848237 +8708 0.8708 17.2292337691354156 290.355641553741 +8709 0.8709 17.2001957570705848 290.404599742910 +8710 0.8710 17.1711528840112777 290.452861443215 +8711 0.8711 17.1421052198048365 290.500422685642 +8712 0.8712 17.1130528346953135 290.547279504825 +8713 0.8713 17.0839957993231124 290.593427939231 +8714 0.8714 17.0549341847245799 290.638864031416 +8715 0.8715 17.0258680623316074 290.683583828059 +8716 0.8716 16.9967975039711909 290.727583380274 +8717 0.8717 16.9677225818649902 290.770858743707 +8718 0.8718 16.9386433686288704 290.813405978703 +8719 0.8719 16.9095599372724088 290.855221150549 +8720 0.8720 16.8804723611984038 290.896300329568 +8721 0.8721 16.8513807142023602 290.936639591336 +8722 0.8722 16.8222850704719527 290.976235016849 +8723 0.8723 16.7931855045864751 291.015082692686 +8724 0.8724 16.7640820915162827 291.053178711151 +8725 0.8725 16.7349749066221989 291.090519170494 +8726 0.8726 16.7058640256549218 291.127100175059 +8727 0.8727 16.6767495247543991 291.162917835424 +8728 0.8728 16.6476314804491956 291.197968268632 +8729 0.8729 16.6185099696558503 291.232247598266 +8730 0.8730 16.5893850696782010 291.265751954693 +8731 0.8731 16.5602568582067065 291.298477475193 +8732 0.8732 16.5311254133177385 291.330420304139 +8733 0.8733 16.5019908134728723 291.361576593150 +8734 0.8734 16.4728531375181539 291.391942501230 +8735 0.8735 16.4437124646833439 291.421514194990 +8736 0.8736 16.4145688745811569 291.450287848768 +8737 0.8737 16.3854224472064800 291.478259644777 +8738 0.8738 16.3562732629355772 291.505425773302 +8739 0.8739 16.3271214025252718 291.531782432822 +8740 0.8740 16.2979669471121191 291.557325830228 +8741 0.8741 16.2688099782115643 291.582052180871 +8742 0.8742 16.2396505777170788 291.605957708867 +8743 0.8743 16.2104888278992796 291.629038647126 +8744 0.8744 16.1813248114050445 291.651291237557 +8745 0.8745 16.1521586112566062 291.672711731241 +8746 0.8746 16.1229903108506178 291.693296388547 +8747 0.8747 16.0938199939572257 291.713041479315 +8748 0.8748 16.0646477447191103 291.731943283009 +8749 0.8749 16.0354736476505195 291.749998088836 +8750 0.8750 16.0062977876362815 291.767202195914 +8751 0.8751 15.9771202499308114 291.783551913467 +8752 0.8752 15.9479411201570933 291.799043560903 +8753 0.8753 15.9187604843056487 291.813673467982 +8754 0.8754 15.8895784287334969 291.827437975045 +8755 0.8755 15.8603950401630946 291.840333432988 +8756 0.8756 15.8312104056812650 291.852356203622 +8757 0.8757 15.8020246127381014 291.863502659659 +8758 0.8758 15.7728377491458733 291.873769184900 +8759 0.8759 15.7436499030779071 291.883152174421 +8760 0.8760 15.7144611630674529 291.891648034678 +8761 0.8761 15.6852716180065368 291.899253183653 +8762 0.8762 15.6560813571448048 291.905964051000 +8763 0.8763 15.6268904700883446 291.911777078203 +8764 0.8764 15.5976990467984997 291.916688718685 +8765 0.8765 15.5685071775906660 291.920695437976 +8766 0.8766 15.5393149531330739 291.923793713857 +8767 0.8767 15.5101224644455584 291.925980036466 +8768 0.8768 15.4809298028983111 291.927250908465 +8769 0.8769 15.4517370602106308 291.927602845152 +8770 0.8770 15.4225443284496411 291.927032374645 +8771 0.8771 15.3933517000290117 291.925536037945 +8772 0.8772 15.3641592677076577 291.923110389137 +8773 0.8773 15.3349671245884256 291.919751995519 +8774 0.8774 15.3057753641167658 291.915457437682 +8775 0.8775 15.2765840800793971 291.910223309677 +8776 0.8776 15.2473933666029549 291.904046219169 +8777 0.8777 15.2182033181526197 291.896922787550 +8778 0.8778 15.1890140295307390 291.888849650060 +8779 0.8779 15.1598255958754411 291.879823455895 +8780 0.8780 15.1306381126592253 291.869840868407 +8781 0.8781 15.1014516756875476 291.858898565163 +8782 0.8782 15.0722663810973820 291.846993238132 +8783 0.8783 15.0430823253557886 291.834121593745 +8784 0.8784 15.0138996052584481 291.820280353066 +8785 0.8785 14.9847183179281984 291.805466251922 +8786 0.8786 14.9555385608135509 291.789676041017 +8787 0.8787 14.9263604316871987 291.772906486024 +8788 0.8788 14.8971840286445101 291.755154367762 +8789 0.8789 14.8680094501020079 291.736416482292 +8790 0.8790 14.8388367947958422 291.716689641029 +8791 0.8791 14.8096661617802461 291.695970670892 +8792 0.8792 14.7804976504259820 291.674256414384 +8793 0.8793 14.7513313604187744 291.651543729753 +8794 0.8794 14.7221673917577327 291.627829491089 +8795 0.8795 14.6930058447537562 291.603110588454 +8796 0.8796 14.6638468200279348 291.577383927958 +8797 0.8797 14.6346904185099387 291.550646431948 +8798 0.8798 14.6055367414363886 291.522895039056 +8799 0.8799 14.5763858903492167 291.494126704369 +8800 0.8800 14.5472379670940253 291.464338399465 +8801 0.8801 14.5180930738184202 291.433527112653 +8802 0.8802 14.4889513129703396 291.401689848963 +8803 0.8803 14.4598127872963769 291.368823630290 +8804 0.8804 14.4306775998400845 291.334925495552 +8805 0.8805 14.4015458539402683 291.299992500785 +8806 0.8806 14.3724176532292702 291.264021719187 +8807 0.8807 14.3432931016312448 291.227010241324 +8808 0.8808 14.3141723033604205 291.188955175164 +8809 0.8809 14.2850553629193513 291.149853646233 +8810 0.8810 14.2559423850971569 291.109702797657 +8811 0.8811 14.2268334749677567 291.068499790364 +8812 0.8812 14.1977287378880828 291.026241803130 +8813 0.8813 14.1686282794962928 290.982926032665 +8814 0.8814 14.1395322057099726 290.938549693735 +8815 0.8815 14.1104406227243206 290.893110019316 +8816 0.8816 14.0813536370103236 290.846604260616 +8817 0.8817 14.0522713553129321 290.799029687226 +8818 0.8818 14.0231938846492099 290.750383587224 +8819 0.8819 13.9941213323064879 290.700663267218 +8820 0.8820 13.9650538058405012 290.649866052522 +8821 0.8821 13.9359914130735145 290.597989287204 +8822 0.8822 13.9069342620924452 290.545030334187 +8823 0.8823 13.8778824612469656 290.490986575394 +8824 0.8824 13.8488361191476077 290.435855411771 +8825 0.8825 13.8197953446638486 290.379634263421 +8826 0.8826 13.7907602469221917 290.322320569721 +8827 0.8827 13.7617309353042376 290.263911789364 +8828 0.8828 13.7327075194447445 290.204405400504 +8829 0.8829 13.7036901092296795 290.143798900790 +8830 0.8830 13.6746788147942624 290.082089807540 +8831 0.8831 13.6456737465209983 290.019275657732 +8832 0.8832 13.6166750150377034 289.955354008177 +8833 0.8833 13.5876827312155157 289.890322435563 +8834 0.8834 13.5586970061669092 289.824178536559 +8835 0.8835 13.5297179512436845 289.756919927927 +8836 0.8836 13.5007456780349617 289.688544246537 +8837 0.8837 13.4717802983651573 289.619049149544 +8838 0.8838 13.4428219242919607 289.548432314383 +8839 0.8839 13.4138706681042930 289.476691438957 +8840 0.8840 13.3849266423202646 289.403824241596 +8841 0.8841 13.3559899596851217 289.329828461272 +8842 0.8842 13.3270607331691782 289.254701857586 +8843 0.8843 13.2981390759657536 289.178442210894 +8844 0.8844 13.2692251014890914 289.101047322360 +8845 0.8845 13.2403189233722713 289.022515014051 +8846 0.8846 13.2114206554651172 288.942843129046 +8847 0.8847 13.1825304118320918 288.862029531467 +8848 0.8848 13.1536483067501901 288.780072106577 +8849 0.8849 13.1247744547068184 288.696968760855 +8850 0.8850 13.0959089703976730 288.612717422068 +8851 0.8851 13.0670519687246003 288.527316039378 +8852 0.8852 13.0382035647934629 288.440762583377 +8853 0.8853 13.0093638739119850 288.353055046173 +8854 0.8854 12.9805330115876032 288.264191441469 +8855 0.8855 12.9517110935252990 288.174169804632 +8856 0.8856 12.9228982356254285 288.082988192789 +8857 0.8857 12.8940945539815477 287.990644684835 +8858 0.8858 12.8653001648782261 287.897137381587 +8859 0.8859 12.8365151847888583 287.802464405776 +8860 0.8860 12.8077397303734610 287.706623902180 +8861 0.8861 12.7789739184764706 287.609614037636 +8862 0.8862 12.7502178661245296 287.511433001171 +8863 0.8863 12.7214716905242717 287.412079003999 +8864 0.8864 12.6927355090600891 287.311550279637 +8865 0.8865 12.6640094392919096 287.209845083948 +8866 0.8866 12.6352935989529502 287.106961695238 +8867 0.8867 12.6065881059474769 287.002898414241 +8868 0.8868 12.5778930783485503 286.897653564277 +8869 0.8869 12.5492086343957734 286.791225491261 +8870 0.8870 12.5205348924930213 286.683612563786 +8871 0.8871 12.4918719712061748 286.574813173144 +8872 0.8872 12.4632199892608444 286.464825733448 +8873 0.8873 12.4345790655400901 286.353648681626 +8874 0.8874 12.4059493190821311 286.241280477547 +8875 0.8875 12.3773308690780528 286.127719604020 +8876 0.8876 12.3487238348695083 286.012964566881 +8877 0.8877 12.3201283359464107 285.897013895057 +8878 0.8878 12.2915444919446291 285.779866140579 +8879 0.8879 12.2629724226436654 285.661519878696 +8880 0.8880 12.2344122479643360 285.541973707879 +8881 0.8881 12.2058640879664466 285.421226249899 +8882 0.8882 12.1773280628464580 285.299276149869 +8883 0.8883 12.1488042929351483 285.176122076340 +8884 0.8884 12.1202928986952685 285.051762721251 +8885 0.8885 12.0917940007192009 284.926196800094 +8886 0.8886 12.0633077197266019 284.799423051875 +8887 0.8887 12.0348341765620468 284.671440239230 +8888 0.8888 12.0063734921926635 284.542247148431 +8889 0.8889 11.9779257877057699 284.411842589453 +8890 0.8890 11.9494911843064973 284.280225395989 +8891 0.8891 11.9210698033154205 284.147394425548 +8892 0.8892 11.8926617661661709 284.013348559455 +8893 0.8893 11.8642671944030518 283.878086702923 +8894 0.8894 11.8358862096786517 283.741607785092 +8895 0.8895 11.8075189337514441 283.603910759044 +8896 0.8896 11.7791654884833985 283.464994601884 +8897 0.8897 11.7508259958375660 283.324858314773 +8898 0.8898 11.7225005778756799 283.183500922947 +8899 0.8899 11.6941893567557429 283.040921475788 +8900 0.8900 11.6658924547296134 282.897119046818 +8901 0.8901 11.6376099941405826 282.752092733808 +8902 0.8902 11.6093420974209547 282.605841658736 +8903 0.8903 11.5810888870896243 282.458364967886 +8904 0.8904 11.5528504857496372 282.309661831860 +8905 0.8905 11.5246270160857645 282.159731445595 +8906 0.8906 11.4964186008620626 282.008573028449 +8907 0.8907 11.4682253629194317 281.856185824177 +8908 0.8908 11.4400474251731712 281.702569101025 +8909 0.8909 11.4118849106105351 281.547722151683 +8910 0.8910 11.3837379422882812 281.391644293413 +8911 0.8911 11.3556066433302103 281.234334868006 +8912 0.8912 11.3274911369247189 281.075793241832 +8913 0.8913 11.2993915463223331 280.916018805885 +8914 0.8914 11.2713079948332471 280.755010975827 +8915 0.8915 11.2432406058248588 280.592769191948 +8916 0.8916 11.2151895027192978 280.429292919279 +8917 0.8917 11.1871548089909556 280.264581647551 +8918 0.8918 11.1591366481640151 280.098634891274 +8919 0.8919 11.1311351438099653 279.931452189718 +8920 0.8920 11.1031504195451305 279.763033106965 +8921 0.8921 11.0751825990281851 279.593377231933 +8922 0.8922 11.0472318059576686 279.422484178391 +8923 0.8923 11.0192981640695002 279.250353584974 +8924 0.8924 10.9913817971344905 279.076985115230 +8925 0.8925 10.9634828289558488 278.902378457615 +8926 0.8926 10.9356013833666914 278.726533325525 +8927 0.8927 10.9077375842275472 278.549449457347 +8928 0.8928 10.8798915554238604 278.371126616396 +8929 0.8929 10.8520634208634910 278.191564591008 +8930 0.8930 10.8242533044742117 278.010763194568 +8931 0.8931 10.7964613302012111 277.828722265442 +8932 0.8932 10.7686876220045846 277.645441667085 +8933 0.8933 10.7409323038568303 277.460921287994 +8934 0.8934 10.7131954997403440 277.275161041749 +8935 0.8935 10.6854773336449043 277.088160867046 +8936 0.8936 10.6577779295651673 276.899920727676 +8937 0.8937 10.6300974114981557 276.710440612551 +8938 0.8938 10.6024359034407425 276.519720535718 +8939 0.8939 10.5747935293871382 276.327760536367 +8940 0.8940 10.5471704133263771 276.134560678869 +8941 0.8941 10.5195666792397979 275.940121052718 +8942 0.8942 10.4919824510985293 275.744441772638 +8943 0.8943 10.4644178528609721 275.547522978488 +8944 0.8944 10.4368730084702790 275.349364835361 +8945 0.8945 10.4093480418518354 275.149967533528 +8946 0.8946 10.3818430769107355 274.949331288487 +8947 0.8947 10.3543582375292651 274.747456340920 +8948 0.8948 10.3268936475643809 274.544342956767 +8949 0.8949 10.2994494308451845 274.339991427161 +8950 0.8950 10.2720257111704019 274.134402068491 +8951 0.8951 10.2446226123058590 273.927575222368 +8952 0.8952 10.2172402579819597 273.719511255619 +8953 0.8953 10.1898787718911610 273.510210560340 +8954 0.8954 10.1625382776854529 273.299673553833 +8955 0.8955 10.1352188989738270 273.087900678671 +8956 0.8956 10.1079207593197609 272.874892402646 +8957 0.8957 10.0806439822386888 272.660649218799 +8958 0.8958 10.0533886911954795 272.445171645388 +8959 0.8959 10.0261550096019132 272.228460225948 +8960 0.8960 9.9989430608141561 272.010515529206 +8961 0.8961 9.9717529681302395 271.791338149129 +8962 0.8962 9.9445848547875375 271.570928704912 +8963 0.8963 9.9174388439602428 271.349287840988 +8964 0.8964 9.8903150587568440 271.126416226983 +8965 0.8965 9.8632136222176090 270.902314557726 +8966 0.8966 9.8361346573120585 270.676983553281 +8967 0.8967 9.8090782869364510 270.450423958875 +8968 0.8968 9.7820446339112603 270.222636544942 +8969 0.8969 9.7550338209786585 269.993622107082 +8970 0.8970 9.7280459708000002 269.763381466087 +8971 0.8971 9.7010812059533027 269.531915467874 +8972 0.8972 9.6741396489307316 269.299224983534 +8973 0.8973 9.6472214221360897 269.065310909314 +8974 0.8974 9.6203266478822975 268.830174166532 +8975 0.8975 9.5934554483888874 268.593815701663 +8976 0.8976 9.5666079457794915 268.356236486266 +8977 0.8977 9.5397842620793281 268.117437516991 +8978 0.8978 9.5129845192126989 267.877419815581 +8979 0.8979 9.4862088390004811 267.636184428779 +8980 0.8980 9.4594573431576201 267.393732428423 +8981 0.8981 9.4327301532906311 267.150064911357 +8982 0.8982 9.4060273908950904 266.905182999441 +8983 0.8983 9.3793491773531432 266.659087839492 +8984 0.8984 9.3526956339310008 266.411780603345 +8985 0.8985 9.3260668817764447 266.163262487766 +8986 0.8986 9.2994630419163347 265.913534714443 +8987 0.8987 9.2728842352541125 265.662598529993 +8988 0.8988 9.2463305825673174 265.410455205919 +8989 0.8989 9.2198022045050916 265.157106038590 +8990 0.8990 9.1932992215857006 264.902552349236 +8991 0.8991 9.1668217541940429 264.646795483909 +8992 0.8992 9.1403699225791755 264.389836813455 +8993 0.8993 9.1139438468518286 264.131677733492 +8994 0.8994 9.0875436469819331 263.872319664430 +8995 0.8995 9.0611694427961442 263.611764051343 +8996 0.8996 9.0348213539753743 263.350012364064 +8997 0.8997 9.0084995000523165 263.087066097087 +8998 0.8998 8.9822040004089843 262.822926769546 +8999 0.8999 8.9559349742742480 262.557595925194 +9000 0.9000 8.9296925407213692 262.291075132388 +9001 0.9001 8.9034768186655473 262.023365984047 +9002 0.9002 8.8772879268614648 261.754470097610 +9003 0.9003 8.8511259839008325 261.484389115035 +9004 0.9004 8.8249911082099430 261.213124702761 +9005 0.9005 8.7988834180472235 260.940678551647 +9006 0.9006 8.7728030315007928 260.667052376985 +9007 0.9007 8.7467500664860225 260.392247918421 +9008 0.9008 8.7207246407431036 260.116266939953 +9009 0.9009 8.6947268718346109 259.839111229897 +9010 0.9010 8.6687568771430730 259.560782600848 +9011 0.9011 8.6428147738685492 259.281282889632 +9012 0.9012 8.6169006790262035 259.000613957290 +9013 0.9013 8.5910147094438880 258.718777689007 +9014 0.9014 8.5651569817597313 258.435775994144 +9015 0.9015 8.5393276124197186 258.151610806113 +9016 0.9016 8.5135267176752922 257.866284082405 +9017 0.9017 8.4877544135809444 257.579797804549 +9018 0.9018 8.4620108159918175 257.292153978003 +9019 0.9019 8.4362960405613059 257.003354632217 +9020 0.9020 8.4106102027386687 256.713401820512 +9021 0.9021 8.3849534177666403 256.422297620058 +9022 0.9022 8.3593258006790432 256.130044131877 +9023 0.9023 8.3337274662984129 255.836643480742 +9024 0.9024 8.3081585292336175 255.542097815166 +9025 0.9025 8.2826191038774919 255.246409307346 +9026 0.9026 8.2571093044044677 254.949580153124 +9027 0.9027 8.2316292447682144 254.651612571945 +9028 0.9028 8.2061790386992755 254.352508806818 +9029 0.9029 8.1807587997027209 254.052271124264 +9030 0.9030 8.1553686410557944 253.750901814263 +9031 0.9031 8.1300086758055716 253.448403190189 +9032 0.9032 8.1046790167666209 253.144777588836 +9033 0.9033 8.0793797765186639 252.840027370299 +9034 0.9034 8.0541110674042518 252.534154917932 +9035 0.9035 8.0288730015264385 252.227162638318 +9036 0.9036 8.0036656907464589 251.919052961263 +9037 0.9037 7.9784892466814146 251.609828339633 +9038 0.9038 7.9533437807019620 251.299491249423 +9039 0.9039 7.9282294039300103 250.988044189619 +9040 0.9040 7.9031462272364195 250.675489682202 +9041 0.9041 7.8780943612387055 250.361830272078 +9042 0.9042 7.8530739162987517 250.047068526992 +9043 0.9043 7.8280850025205249 249.731207037541 +9044 0.9044 7.8031277297477946 249.414248417060 +9045 0.9045 7.7782022075618622 249.096195301596 +9046 0.9046 7.7533085452792898 248.777050349860 +9047 0.9047 7.7284468519496388 248.456816243160 +9048 0.9048 7.7036172363532147 248.135495685317 +9049 0.9049 7.6788198069988152 247.813091402670 +9050 0.9050 7.6540546721214824 247.489606143985 +9051 0.9051 7.6293219396802643 247.165042680370 +9052 0.9052 7.6046217173559816 246.839403805278 +9053 0.9053 7.5799541125489984 246.512692334387 +9054 0.9054 7.5553192323769984 246.184911105608 +9055 0.9055 7.5307171836727713 245.856062978935 +9056 0.9056 7.5061480729819996 245.526150836495 +9057 0.9057 7.4816120065610558 245.195177582380 +9058 0.9058 7.4571090903748045 244.863146142655 +9059 0.9059 7.4326394300944072 244.530059465295 +9060 0.9060 7.4082031310951395 244.195920520063 +9061 0.9061 7.3838002984542097 243.860732298539 +9062 0.9062 7.3594310369485854 243.524497813953 +9063 0.9063 7.3350954510528270 243.187220101217 +9064 0.9064 7.3107936449369264 242.848902216801 +9065 0.9065 7.2865257224641518 242.509547238691 +9066 0.9066 7.2622917871889028 242.169158266293 +9067 0.9067 7.2380919423545658 241.827738420443 +9068 0.9068 7.2139262908913810 241.485290843254 +9069 0.9069 7.1897949354143140 241.141818698079 +9070 0.9070 7.1656979782209360 240.797325169482 +9071 0.9071 7.1416355212893059 240.451813463126 +9072 0.9072 7.1176076662758652 240.105286805689 +9073 0.9073 7.0936145145133374 239.757748444872 +9074 0.9074 7.0696561670086311 239.409201649249 +9075 0.9075 7.0457327244407564 239.059649708246 +9076 0.9076 7.0218442871587428 238.709095932035 +9077 0.9077 6.9979909551795654 238.357543651505 +9078 0.9078 6.9741728281860818 238.004996218160 +9079 0.9079 6.9503900055249703 237.651457004060 +9080 0.9080 6.9266425862046805 237.296929401733 +9081 0.9081 6.9029306688933874 236.941416824137 +9082 0.9082 6.8792543519169538 236.584922704538 +9083 0.9083 6.8556137332569023 236.227450496490 +9084 0.9084 6.8320089105483923 235.869003673716 +9085 0.9085 6.8084399810782035 235.509585730060 +9086 0.9086 6.7849070417827306 235.149200179395 +9087 0.9087 6.7614101892459821 234.787850555567 +9088 0.9088 6.7379495196975876 234.425540412319 +9089 0.9089 6.7145251290108128 234.062273323177 +9090 0.9090 6.6911371127005825 233.698052881424 +9091 0.9091 6.6677855659215126 233.332882699983 +9092 0.9092 6.6444705834659450 232.966766411370 +9093 0.9093 6.6211922597619965 232.599707667591 +9094 0.9094 6.5979506888716122 232.231710140098 +9095 0.9095 6.5747459644886250 231.862777519647 +9096 0.9096 6.5515781799368273 231.492913516308 +9097 0.9097 6.5284474281680476 231.122121859283 +9098 0.9098 6.5053538017602381 230.750406296908 +9099 0.9099 6.4822973929155658 230.377770596545 +9100 0.9100 6.4592782934585138 230.004218544500 +9101 0.9101 6.4362965948339932 229.629753945913 +9102 0.9102 6.4133523881054604 229.254380624743 +9103 0.9103 6.3904457639530436 228.878102423595 +9104 0.9104 6.3675768126716772 228.500923203734 +9105 0.9105 6.3447456241692439 228.122846844935 +9106 0.9106 6.3219522879647263 227.743877245424 +9107 0.9107 6.2991968931863660 227.364018321781 +9108 0.9108 6.2764795285698334 226.983274008869 +9109 0.9109 6.2538002824564023 226.601648259753 +9110 0.9110 6.2311592427911355 226.219145045577 +9111 0.9111 6.2085564971210792 225.835768355548 +9112 0.9112 6.1859921325934630 225.451522196780 +9113 0.9113 6.1634662359539121 225.066410594238 +9114 0.9114 6.1409788935446672 224.680437590652 +9115 0.9115 6.1185301913028134 224.293607246430 +9116 0.9116 6.0961202147585132 223.905923639574 +9117 0.9117 6.0737490490332569 223.517390865559 +9118 0.9118 6.0514167788381146 223.128013037281 +9119 0.9119 6.0291234884720017 222.737794284977 +9120 0.9120 6.0068692618199480 222.346738756092 +9121 0.9121 5.9846541823513828 221.954850615208 +9122 0.9122 5.9624783331184235 221.562134043987 +9123 0.9123 5.9403417967541730 221.168593241015 +9124 0.9124 5.9182446554710335 220.774232421776 +9125 0.9125 5.8961869910590190 220.379055818513 +9126 0.9126 5.8741688848840843 219.983067680176 +9127 0.9127 5.8521904178864599 219.586272272308 +9128 0.9128 5.8302516705789991 219.188673876911 +9129 0.9129 5.8083527230455312 218.790276792452 +9130 0.9130 5.7864936549392239 218.391085333690 +9131 0.9131 5.7646745454809594 217.991103831603 +9132 0.9132 5.7428954734577147 217.590336633298 +9133 0.9133 5.7211565172209538 217.188788101920 +9134 0.9134 5.6994577546850298 216.786462616563 +9135 0.9135 5.6777992633255945 216.383364572139 +9136 0.9136 5.6561811201780214 215.979498379327 +9137 0.9137 5.6346034018358315 215.574868464468 +9138 0.9138 5.6130661844491367 215.169479269429 +9139 0.9139 5.5915695437230859 214.763335251579 +9140 0.9140 5.5701135549163263 214.356440883608 +9141 0.9141 5.5486982928394708 213.948800653496 +9142 0.9142 5.5273238318535762 213.540419064393 +9143 0.9143 5.5059902458686310 213.131300634509 +9144 0.9144 5.4846976083420538 212.721449897038 +9145 0.9145 5.4634459922772001 212.310871400038 +9146 0.9146 5.4422354702218811 211.899569706342 +9147 0.9147 5.4210661142668899 211.487549393479 +9148 0.9148 5.3999379960445397 211.074815053517 +9149 0.9149 5.3788511867272124 210.661371293034 +9150 0.9150 5.3578057570259121 210.247222732976 +9151 0.9151 5.3368017771888354 209.832374008562 +9152 0.9152 5.3158393169999485 209.416829769180 +9153 0.9153 5.2949184457775749 209.000594678292 +9154 0.9154 5.2740392323729930 208.583673413345 +9155 0.9155 5.2532017451690427 208.166070665654 +9156 0.9156 5.2324060520787459 207.747791140286 +9157 0.9157 5.2116522205439324 207.328839555990 +9158 0.9158 5.1909403175338795 206.909220645068 +9159 0.9159 5.1702704095439609 206.488939153298 +9160 0.9160 5.1496425625943063 206.067999839792 +9161 0.9161 5.1290568422284704 205.646407476931 +9162 0.9162 5.1085133135121117 205.224166850248 +9163 0.9163 5.0880120410316847 204.801282758298 +9164 0.9164 5.0675530888931402 204.377760012593 +9165 0.9165 5.0471365207206356 203.953603437495 +9166 0.9166 5.0267623996552580 203.528817870055 +9167 0.9167 5.0064307883537555 203.103408159990 +9168 0.9168 4.9861417489872801 202.677379169515 +9169 0.9169 4.9658953432401409 202.250735773265 +9170 0.9170 4.9456916323085691 201.823482858168 +9171 0.9171 4.9255306768994931 201.395625323360 +9172 0.9172 4.9054125372293207 200.967168080092 +9173 0.9173 4.8853372730227385 200.538116051557 +9174 0.9174 4.8653049435115170 200.108474172869 +9175 0.9175 4.8453156074333297 199.678247390883 +9176 0.9176 4.8253693230305785 199.247440664136 +9177 0.9177 4.8054661480492369 198.816058962699 +9178 0.9178 4.7856061397376957 198.384107268117 +9179 0.9179 4.7657893548456274 197.951590573245 +9180 0.9180 4.7460158496228555 197.518513882184 +9181 0.9181 4.7262856798182389 197.084882210147 +9182 0.9182 4.7065989006785633 196.650700583364 +9183 0.9183 4.6869555669474474 196.215974038948 +9184 0.9184 4.6673557328642596 195.780707624816 +9185 0.9185 4.6477994521630404 195.344906399571 +9186 0.9186 4.6282867780714438 194.908575432357 +9187 0.9187 4.6088177633096858 194.471719802808 +9188 0.9188 4.5893924600895009 194.034344600886 +9189 0.9189 4.5700109201131172 193.596454926792 +9190 0.9190 4.5506731945722345 193.158055890855 +9191 0.9191 4.5313793341470205 192.719152613427 +9192 0.9192 4.5121293890051124 192.279750224733 +9193 0.9193 4.4929234088006353 191.839853864807 +9194 0.9194 4.4737614426732275 191.399468683355 +9195 0.9195 4.4546435392470771 190.958599839644 +9196 0.9196 4.4355697466299748 190.517252502401 +9197 0.9197 4.4165401124123713 190.075431849678 +9198 0.9198 4.3975546836664492 189.633143068757 +9199 0.9199 4.3786135069452099 189.190391356028 +9200 0.9200 4.3597166282815643 188.747181916886 +9201 0.9201 4.3408640931874398 188.303519965598 +9202 0.9202 4.3220559466528989 187.859410725213 +9203 0.9203 4.3032922331452674 187.414859427411 +9204 0.9204 4.2845729966082748 186.969871312446 +9205 0.9205 4.2658982804612036 186.524451628972 +9206 0.9206 4.2472681275980566 186.078605633959 +9207 0.9207 4.2286825803867298 185.632338592577 +9208 0.9208 4.2101416806681975 185.185655778067 +9209 0.9209 4.1916454697557120 184.738562471646 +9210 0.9210 4.1731939884340115 184.291063962368 +9211 0.9211 4.1547872769585412 183.843165547033 +9212 0.9212 4.1364253750546878 183.394872530042 +9213 0.9213 4.1181083219170205 182.946190223305 +9214 0.9214 4.0998361562085490 182.497123946126 +9215 0.9215 4.0816089160599907 182.047679025047 +9216 0.9216 4.0634266390690490 181.597860793784 +9217 0.9217 4.0452893622997053 181.147674593087 +9218 0.9218 4.0271971222815202 180.697125770614 +9219 0.9219 4.0091499550089482 180.246219680818 +9220 0.9220 3.9911478959406654 179.794961684846 +9221 0.9221 3.9731909799989036 179.343357150393 +9222 0.9222 3.9552792415688032 178.891411451617 +9223 0.9223 3.9374127144977731 178.439129968988 +9224 0.9224 3.9195914320948639 177.986518089197 +9225 0.9225 3.9018154271301526 177.533581205026 +9226 0.9226 3.8840847318341400 177.080324715226 +9227 0.9227 3.8663993778971593 176.626754024392 +9228 0.9228 3.8487593964687954 176.172874542883 +9229 0.9229 3.8311648181573186 175.718691686649 +9230 0.9230 3.8136156730291288 175.264210877144 +9231 0.9231 3.7961119906082108 174.809437541213 +9232 0.9232 3.7786537998756033 174.354377110936 +9233 0.9233 3.7612411292688783 173.899035023564 +9234 0.9234 3.7438740066816329 173.443416721343 +9235 0.9235 3.7265524594629937 172.987527651438 +9236 0.9236 3.7092765144171334 172.531373265769 +9237 0.9237 3.6920461978027972 172.074959020956 +9238 0.9238 3.6748615353328433 171.618290378123 +9239 0.9239 3.6577225521737957 171.161372802827 +9240 0.9240 3.6406292729454068 170.704211764948 +9241 0.9241 3.6235817217202340 170.246812738509 +9242 0.9242 3.6065799220232280 169.789181201613 +9243 0.9243 3.5896238968313323 169.331322636297 +9244 0.9244 3.5727136685730962 168.873242528426 +9245 0.9245 3.5558492591282973 168.414946367550 +9246 0.9246 3.5390306898275798 167.956439646797 +9247 0.9247 3.5222579814521020 167.497727862759 +9248 0.9248 3.5055311542331968 167.038816515345 +9249 0.9249 3.4888502278520446 166.579711107701 +9250 0.9250 3.4722152214393569 166.120417146050 +9251 0.9251 3.4556261535750754 165.660940139576 +9252 0.9252 3.4390830422880798 165.201285600339 +9253 0.9253 3.4225859050559082 164.741459043091 +9254 0.9254 3.4061347588044923 164.281465985222 +9255 0.9255 3.3897296199079014 163.821311946593 +9256 0.9256 3.3733705041881010 163.361002449414 +9257 0.9257 3.3570574269147224 162.900543018156 +9258 0.9258 3.3407904028048447 162.439939179397 +9259 0.9259 3.3245694460227893 161.979196461709 +9260 0.9260 3.3083945701799271 161.518320395536 +9261 0.9261 3.2922657883344955 161.057316513099 +9262 0.9262 3.2761831129914305 160.596190348201 +9263 0.9263 3.2601465561022103 160.134947436200 +9264 0.9264 3.2441561290647098 159.673593313808 +9265 0.9265 3.2282118427230690 159.212133519011 +9266 0.9266 3.2123137073675720 158.750573590930 +9267 0.9267 3.1964617327345399 158.288919069711 +9268 0.9268 3.1806559280062348 157.827175496391 +9269 0.9269 3.1648963018107770 157.365348412766 +9270 0.9270 3.1491828622220734 156.903443361301 +9271 0.9271 3.1335156167597593 156.441465884978 +9272 0.9272 3.1178945723891509 155.979421527189 +9273 0.9273 3.1023197355212120 155.517315831591 +9274 0.9274 3.0867911120125311 155.055154342023 +9275 0.9275 3.0713087071653131 154.592942602339 +9276 0.9276 3.0558725257273802 154.130686156319 +9277 0.9277 3.0404825718921882 153.668390547519 +9278 0.9278 3.0251388492988531 153.206061319184 +9279 0.9279 3.0098413610321901 152.743704014077 +9280 0.9280 2.9945901096227661 152.281324174403 +9281 0.9281 2.9793850970469635 151.818927341647 +9282 0.9282 2.9642263247270568 151.356519056489 +9283 0.9283 2.9491137935313008 150.894104858636 +9284 0.9284 2.9340475037740315 150.431690286749 +9285 0.9285 2.9190274552157800 149.969280878277 +9286 0.9286 2.9040536470633982 149.506882169361 +9287 0.9287 2.8891260779701948 149.044499694704 +9288 0.9288 2.8742447460360876 148.582138987438 +9289 0.9289 2.8594096488077656 148.119805579005 +9290 0.9290 2.8446207832788626 147.657504999055 +9291 0.9291 2.8298781458901452 147.195242775292 +9292 0.9292 2.8151817325297119 146.733024433369 +9293 0.9293 2.8005315385332055 146.270855496761 +9294 0.9294 2.7859275586840351 145.808741486644 +9295 0.9295 2.7713697872136147 145.346687921759 +9296 0.9296 2.7568582178016108 144.884700318323 +9297 0.9297 2.7423928435762019 144.422784189856 +9298 0.9298 2.7279736571143536 143.960945047109 +9299 0.9299 2.7136006504421033 143.499188397898 +9300 0.9300 2.6992738150348572 143.037519747021 +9301 0.9301 2.6849931418177015 142.575944596092 +9302 0.9302 2.6707586211657239 142.114468443457 +9303 0.9303 2.6565702429043481 141.653096784061 +9304 0.9304 2.6424279963096802 141.191835109298 +9305 0.9305 2.6283318701088692 140.730688906926 +9306 0.9306 2.6142818524804761 140.269663660935 +9307 0.9307 2.6002779310548592 139.808764851404 +9308 0.9308 2.5863200929145695 139.347997954392 +9309 0.9309 2.5724083245947584 138.887368441829 +9310 0.9310 2.5585426120835981 138.426881781378 +9311 0.9311 2.5447229408227137 137.966543436308 +9312 0.9312 2.5309492957076292 137.506358865384 +9313 0.9313 2.5172216610882225 137.046333522748 +9314 0.9314 2.5035400207691967 136.586472857772 +9315 0.9315 2.4899043580105595 136.126782314974 +9316 0.9316 2.4763146555281179 135.667267333857 +9317 0.9317 2.4627708954939842 135.207933348816 +9318 0.9318 2.4492730595370928 134.748785789008 +9319 0.9319 2.4358211287437315 134.289830078218 +9320 0.9320 2.4224150836580827 133.831071634762 +9321 0.9321 2.4090549042827778 133.372515871339 +9322 0.9322 2.3957405700794649 132.914168194921 +9323 0.9323 2.3824720599693872 132.456034006634 +9324 0.9324 2.3692493523339730 131.998118701645 +9325 0.9325 2.3560724250154399 131.540427669019 +9326 0.9326 2.3429412553174083 131.082966291614 +9327 0.9327 2.3298558200055299 130.625739945956 +9328 0.9328 2.3168160953081265 130.168754002112 +9329 0.9329 2.3038220569168417 129.712013823582 +9330 0.9330 2.2908736799873042 129.255524767173 +9331 0.9331 2.2779709391398022 128.799292182869 +9332 0.9332 2.2651138084599727 128.343321413725 +9333 0.9333 2.2523022614994996 127.887617795734 +9334 0.9334 2.2395362712768270 127.432186657715 +9335 0.9335 2.2268158102778810 126.977033321204 +9336 0.9336 2.2141408504568059 126.522163100295 +9337 0.9337 2.2015113632367131 126.067581301560 +9338 0.9338 2.1889273195104391 125.613293223922 +9339 0.9339 2.1763886896413167 125.159304158521 +9340 0.9340 2.1638954434639608 124.705619388601 +9341 0.9341 2.1514475502850612 124.252244189394 +9342 0.9342 2.1390449788841917 123.799183827996 +9343 0.9343 2.1266876975146287 123.346443563260 +9344 0.9344 2.1143756739041826 122.894028645659 +9345 0.9345 2.1021088752560413 122.441944317168 +9346 0.9346 2.0898872682496239 121.990195811183 +9347 0.9347 2.0777108190414482 121.538788352335 +9348 0.9348 2.0655794932660094 121.087727156442 +9349 0.9349 2.0534932560366705 120.637017430337 +9350 0.9350 2.0414520719465643 120.186664371786 +9351 0.9351 2.0294559050695073 119.736673169350 +9352 0.9352 2.0175047189609265 119.287049002269 +9353 0.9353 2.0055984766587951 118.837797040360 +9354 0.9354 1.9937371406845834 118.388922443870 +9355 0.9355 1.9819206730442198 117.940430363401 +9356 0.9356 1.9701490352290623 117.492325939748 +9357 0.9357 1.9584221882168837 117.044614303821 +9358 0.9358 1.9467400924728679 116.597300576497 +9359 0.9359 1.9351027079506165 116.150389868531 +9360 0.9360 1.9235099940931697 115.703887280404 +9361 0.9361 1.9119619098340368 115.257797902255 +9362 0.9362 1.9004584135982376 114.812126813730 +9363 0.9363 1.8889994633033580 114.366879083865 +9364 0.9364 1.8775850163606151 113.922059770994 +9365 0.9365 1.8662150296759343 113.477673922621 +9366 0.9366 1.8548894596510386 113.033726575295 +9367 0.9367 1.8436082621845484 112.590222754509 +9368 0.9368 1.8323713926730933 112.147167474592 +9369 0.9369 1.8211788060124354 111.704565738568 +9370 0.9370 1.8100304565986038 111.262422538064 +9371 0.9371 1.7989262983290408 110.820742853195 +9372 0.9372 1.7878662846037592 110.379531652436 +9373 0.9373 1.7768503683265116 109.938793892515 +9374 0.9374 1.7658785019059702 109.498534518313 +9375 0.9375 1.7549506372569177 109.058758462738 +9376 0.9376 1.7440667258014508 108.619470646598 +9377 0.9377 1.7332267184701948 108.180675978522 +9378 0.9378 1.7224305657035277 107.742379354819 +9379 0.9379 1.7116782174528180 107.304585659375 +9380 0.9380 1.7009696231816716 106.867299763554 +9381 0.9381 1.6903047318671907 106.430526526062 +9382 0.9382 1.6796834920012451 105.994270792849 +9383 0.9383 1.6691058515917525 105.558537397002 +9384 0.9384 1.6585717581639712 105.123331158624 +9385 0.9385 1.6480811587618036 104.688656884727 +9386 0.9386 1.6376339999491110 104.254519369126 +9387 0.9387 1.6272302278110387 103.820923392319 +9388 0.9388 1.6168697879553533 103.387873721386 +9389 0.9389 1.6065526255137903 102.955375109876 +9390 0.9390 1.5962786851434119 102.523432297691 +9391 0.9391 1.5860479110279775 102.092050010997 +9392 0.9392 1.5758602468793237 101.661232962079 +9393 0.9393 1.5657156359387558 101.230985849279 +9394 0.9394 1.5556140209784497 100.801313356843 +9395 0.9395 1.5455553443028656 100.372220154841 +9396 0.9396 1.5355395477501712 99.943710899047 +9397 0.9397 1.5255665726936769 99.515790230840 +9398 0.9398 1.5156363600432805 99.088462777089 +9399 0.9399 1.5057488502469238 98.661733150044 +9400 0.9400 1.4959039832920598 98.235605947237 +9401 0.9401 1.4861016987071289 97.810085751379 +9402 0.9402 1.4763419355630485 97.385177130232 +9403 0.9403 1.4666246324747103 96.960884636533 +9404 0.9404 1.4569497276024908 96.537212807859 +9405 0.9405 1.4473171586537705 96.114166166546 +9406 0.9406 1.4377268628844648 95.691749219570 +9407 0.9407 1.4281787771005638 95.269966458451 +9408 0.9408 1.4186728376596844 94.848822359136 +9409 0.9409 1.4092089804726322 94.428321381907 +9410 0.9410 1.3997871410049731 94.008467971275 +9411 0.9411 1.3904072542786163 93.589266555863 +9412 0.9412 1.3810692548734067 93.170721548331 +9413 0.9413 1.3717730769287277 92.752837345250 +9414 0.9414 1.3625186541451155 92.335618326995 +9415 0.9415 1.3533059197858823 91.919068857669 +9416 0.9416 1.3441348066787502 91.503193284975 +9417 0.9417 1.3350052472174949 91.087995940131 +9418 0.9418 1.3259171733636004 90.673481137760 +9419 0.9419 1.3168705166479227 90.259653175794 +9420 0.9420 1.3078652081723647 89.846516335364 +9421 0.9421 1.2989011786115605 89.434074880721 +9422 0.9422 1.2899783582145687 89.022333059115 +9423 0.9423 1.2810966768065781 88.611295100697 +9424 0.9424 1.2722560637906215 88.200965218434 +9425 0.9425 1.2634564481493000 87.791347607994 +9426 0.9426 1.2546977584465169 87.382446447668 +9427 0.9427 1.2459799228292212 86.974265898247 +9428 0.9428 1.2373028690291619 86.566810102941 +9429 0.9429 1.2286665243646513 86.160083187272 +9430 0.9430 1.2200708157423379 85.754089258996 +9431 0.9431 1.2115156696589895 85.348832407973 +9432 0.9432 1.2030010122032855 84.944316706105 +9433 0.9433 1.1945267690576196 84.540546207215 +9434 0.9434 1.1860928654999106 84.137524946967 +9435 0.9435 1.1776992264054240 83.735256942765 +9436 0.9436 1.1693457762486028 83.333746193659 +9437 0.9437 1.1610324391049076 82.932996680245 +9438 0.9438 1.1527591386526665 82.533012364574 +9439 0.9439 1.1445257981749344 82.133797190071 +9440 0.9440 1.1363323405613597 81.735355081424 +9441 0.9441 1.1281786883100637 81.337689944493 +9442 0.9442 1.1200647635295276 80.940805666230 +9443 0.9443 1.1119904879404872 80.544706114578 +9444 0.9444 1.1039557828778392 80.149395138379 +9445 0.9445 1.0959605692925560 79.754876567284 +9446 0.9446 1.0880047677536089 79.361154211659 +9447 0.9447 1.0800882984499007 78.968231862505 +9448 0.9448 1.0722110811922079 78.576113291351 +9449 0.9449 1.0643730354151311 78.184802250186 +9450 0.9450 1.0565740801790546 77.794302471344 +9451 0.9451 1.0488141341721153 77.404617667441 +9452 0.9452 1.0410931157121801 77.015751531265 +9453 0.9453 1.0334109427488316 76.627707735704 +9454 0.9454 1.0257675328653642 76.240489933645 +9455 0.9455 1.0181628032807870 75.854101757896 +9456 0.9456 1.0105966708518372 75.468546821100 +9457 0.9457 1.0030690520750003 75.083828715640 +9458 0.9458 0.9955798630885403 74.699951013559 +9459 0.9459 0.9881290196745385 74.316917266478 +9460 0.9460 0.9807164372609395 73.934731005502 +9461 0.9461 0.9733420309236073 73.553395741143 +9462 0.9462 0.9660057153883885 73.172914963232 +9463 0.9463 0.9587074050331853 72.793292140833 +9464 0.9464 0.9514470138900353 72.414530722168 +9465 0.9465 0.9442244556472005 72.036634134527 +9466 0.9466 0.9370396436512648 71.659605784186 +9467 0.9467 0.9298924909092389 71.283449056332 +9468 0.9468 0.9227829100906737 70.908167314971 +9469 0.9469 0.9157108135297825 70.533763902855 +9470 0.9470 0.9086761132275699 70.160242141395 +9471 0.9471 0.9016787208539707 69.787605330590 +9472 0.9472 0.8947185477499942 69.415856748942 +9473 0.9473 0.8877955049298785 69.044999653372 +9474 0.9474 0.8809095030832524 68.675037279148 +9475 0.9475 0.8740604525773047 68.305972839808 +9476 0.9476 0.8672482634589602 67.937809527082 +9477 0.9477 0.8604728454570659 67.570550510803 +9478 0.9478 0.8537341079845838 67.204198938840 +9479 0.9479 0.8470319601407901 66.838757937035 +9480 0.9480 0.8403663107134833 66.474230609100 +9481 0.9481 0.8337370681812006 66.110620036553 +9482 0.9482 0.8271441407154402 65.747929278656 +9483 0.9483 0.8205874361828912 65.386161372324 +9484 0.9484 0.8140668621476721 65.025319332058 +9485 0.9485 0.8075823258735757 64.665406149870 +9486 0.9486 0.8011337343263215 64.306424795213 +9487 0.9487 0.7947209941758158 63.948378214902 +9488 0.9488 0.7883440117984181 63.591269333052 +9489 0.9489 0.7820026932792156 63.235101050998 +9490 0.9490 0.7756969444143043 62.879876247229 +9491 0.9491 0.7694266707130770 62.525597777316 +9492 0.9492 0.7631917774005189 62.172268473846 +9493 0.9493 0.7569921694195094 61.819891146344 +9494 0.9494 0.7508277514331316 61.468468581212 +9495 0.9495 0.7446984278269883 61.118003541656 +9496 0.9496 0.7386041027115240 60.768498767629 +9497 0.9497 0.7325446799243551 60.419956975748 +9498 0.9498 0.7265200630326059 60.072380859237 +9499 0.9499 0.7205301553352511 59.725773087859 +9500 0.9500 0.7145748598654657 59.380136307850 +9501 0.9501 0.7086540793929804 59.035473141855 +9502 0.9502 0.7027677164264444 58.691786188864 +9503 0.9503 0.6969156732157941 58.349078024143 +9504 0.9504 0.6910978517546278 58.007351199182 +9505 0.9505 0.6853141537825876 57.666608241620 +9506 0.9506 0.6795644807877473 57.326851655187 +9507 0.9507 0.6738487340090060 56.988083919640 +9508 0.9508 0.6681668144384885 56.650307490712 +9509 0.9509 0.6625186228239507 56.313524800043 +9510 0.9510 0.6569040596711929 55.977738255112 +9511 0.9511 0.6513230252464774 55.642950239198 +9512 0.9512 0.6457754195789523 55.309163111303 +9513 0.9513 0.6402611424630822 54.976379206100 +9514 0.9514 0.6347800934610831 54.644600833882 +9515 0.9515 0.6293321719053647 54.313830280486 +9516 0.9516 0.6239172769009773 53.984069807262 +9517 0.9517 0.6185353073280646 53.655321650993 +9518 0.9518 0.6131861618443221 53.327588023857 +9519 0.9519 0.6078697388874612 53.000871113360 +9520 0.9520 0.6025859366776787 52.675173082290 +9521 0.9521 0.5973346532201311 52.350496068660 +9522 0.9522 0.5921157863074156 52.026842185652 +9523 0.9523 0.5869292335220545 51.704213521570 +9524 0.9524 0.5817748922389867 51.382612139785 +9525 0.9525 0.5766526596280633 51.062040078683 +9526 0.9526 0.5715624326565484 50.742499351616 +9527 0.9527 0.5665041080916250 50.423991946852 +9528 0.9528 0.5614775825029065 50.106519827519 +9529 0.9529 0.5564827522649520 49.790084931570 +9530 0.9530 0.5515195135597873 49.474689171723 +9531 0.9531 0.5465877623794307 49.160334435410 +9532 0.9532 0.5416873945284227 48.847022584749 +9533 0.9533 0.5368183056263616 48.534755456475 +9534 0.9534 0.5319803911104426 48.223534861905 +9535 0.9535 0.5271735462380026 47.913362586895 +9536 0.9536 0.5223976660890685 47.604240391789 +9537 0.9537 0.5176526455689099 47.296170011383 +9538 0.9538 0.5129383794105973 46.989153154870 +9539 0.9539 0.5082547621775634 46.683191505809 +9540 0.9540 0.5036016882661692 46.378286722073 +9541 0.9541 0.4989790519082746 46.074440435819 +9542 0.9542 0.4943867471738119 45.771654253435 +9543 0.9543 0.4898246679733649 45.469929755506 +9544 0.9544 0.4852927080607508 45.169268496776 +9545 0.9545 0.4807907610356067 44.869672006105 +9546 0.9546 0.4763187203459799 44.571141786431 +9547 0.9547 0.4718764792909215 44.273679314736 +9548 0.9548 0.4674639310230844 43.977286042007 +9549 0.9549 0.4630809685513241 43.681963393199 +9550 0.9550 0.4587274847433043 43.387712767197 +9551 0.9551 0.4544033723281050 43.094535536789 +9552 0.9552 0.4501085238988345 42.802433048620 +9553 0.9553 0.4458428319152447 42.511406623176 +9554 0.9554 0.4416061887063497 42.221457554724 +9555 0.9555 0.4373984864730481 41.932587111308 +9556 0.9556 0.4332196172907477 41.644796534700 +9557 0.9557 0.4290694731119942 41.358087040371 +9558 0.9558 0.4249479457691019 41.072459817473 +9559 0.9559 0.4208549269767889 40.787916028787 +9560 0.9560 0.4167903083348138 40.504456810716 +9561 0.9561 0.4127539813306159 40.222083273243 +9562 0.9562 0.4087458373419582 39.940796499911 +9563 0.9563 0.4047657676395731 39.660597547791 +9564 0.9564 0.4008136633898107 39.381487447457 +9565 0.9565 0.3968894156572898 39.103467202960 +9566 0.9566 0.3929929154075513 38.826537791809 +9567 0.9567 0.3891240535097139 38.550700164940 +9568 0.9568 0.3852827207391321 38.275955246695 +9569 0.9569 0.3814688077800575 38.002303934796 +9570 0.9570 0.3776822052283014 37.729747100326 +9571 0.9571 0.3739228035938993 37.458285587716 +9572 0.9572 0.3701904933037783 37.187920214705 +9573 0.9573 0.3664851647044262 36.918651772338 +9574 0.9574 0.3628067080645624 36.650481024937 +9575 0.9575 0.3591550135778112 36.383408710087 +9576 0.9576 0.3555299713653763 36.117435538612 +9577 0.9577 0.3519314714787171 35.852562194571 +9578 0.9578 0.3483594039022272 35.588789335226 +9579 0.9579 0.3448136585559141 35.326117591038 +9580 0.9580 0.3412941252980800 35.064547565643 +9581 0.9581 0.3378006939280058 34.804079835842 +9582 0.9582 0.3343332541886336 34.544714951601 +9583 0.9583 0.3308916957692531 34.286453436010 +9584 0.9584 0.3274759083081881 34.029295785291 +9585 0.9585 0.3240857813954841 33.773242468788 +9586 0.9586 0.3207212045755974 33.518293928945 +9587 0.9587 0.3173820673500851 33.264450581302 +9588 0.9588 0.3140682591802955 33.011712814491 +9589 0.9589 0.3107796694900600 32.760080990218 +9590 0.9590 0.3075161876683860 32.509555443264 +9591 0.9591 0.3042777030721491 32.260136481472 +9592 0.9592 0.3010641050287883 32.011824385745 +9593 0.9593 0.2978752828389990 31.764619410040 +9594 0.9594 0.2947111257794289 31.518521781361 +9595 0.9595 0.2915715231053727 31.273531699764 +9596 0.9596 0.2884563640534676 31.029649338337 +9597 0.9597 0.2853655378443899 30.786874843216 +9598 0.9598 0.2822989336855505 30.545208333573 +9599 0.9599 0.2792564407737907 30.304649901622 +9600 0.9600 0.2762379482980791 30.065199612611 +9601 0.9601 0.2732433454422071 29.826857504828 +9602 0.9602 0.2702725213874857 29.589623589601 +9603 0.9603 0.2673253653154400 29.353497851312 +9604 0.9604 0.2644017664105058 29.118480247372 +9605 0.9605 0.2615016138627244 28.884570708257 +9606 0.9606 0.2586247968704367 28.651769137496 +9607 0.9607 0.2557712046429781 28.420075411676 +9608 0.9608 0.2529407264033717 28.189489380452 +9609 0.9609 0.2501332513910212 27.960010866558 +9610 0.9610 0.2473486688644029 27.731639665807 +9611 0.9611 0.2445868681037572 27.504375547107 +9612 0.9612 0.2418477384137786 27.278218252466 +9613 0.9613 0.2391311691263052 27.053167497001 +9614 0.9614 0.2364370496030073 26.829222968958 +9615 0.9615 0.2337652692380737 26.606384329714 +9616 0.9616 0.2311157174608982 26.384651213795 +9617 0.9617 0.2284882837387640 26.164023228890 +9618 0.9618 0.2258828575795263 25.944499955863 +9619 0.9619 0.2232993285342949 25.726080948766 +9620 0.9620 0.2207375862001134 25.508765734864 +9621 0.9621 0.2181975202226379 25.292553814645 +9622 0.9622 0.2156790202988138 25.077444661837 +9623 0.9623 0.2131819761795504 24.863437723431 +9624 0.9624 0.2107062776723941 24.650532419696 +9625 0.9625 0.2082518146441991 24.438728144203 +9626 0.9626 0.2058184770237967 24.228024263845 +9627 0.9627 0.2034061548046617 24.018420118855 +9628 0.9628 0.2010147380475772 23.809915022836 +9629 0.9629 0.1986441168832964 23.602508262779 +9630 0.9630 0.1962941815152031 23.396199099088 +9631 0.9631 0.1939648222219683 23.190986765608 +9632 0.9632 0.1916559293602055 22.986870469648 +9633 0.9633 0.1893673933671225 22.783849392011 +9634 0.9634 0.1870991047631711 22.581922687018 +9635 0.9635 0.1848509541546932 22.381089482540 +9636 0.9636 0.1826228322365648 22.181348880028 +9637 0.9637 0.1804146297948364 21.982699954538 +9638 0.9638 0.1782262377093710 21.785141754770 +9639 0.9639 0.1760575469564779 21.588673303092 +9640 0.9640 0.1739084486115443 21.393293595580 +9641 0.9641 0.1717788338516630 21.199001602046 +9642 0.9642 0.1696685939582567 21.005796266081 +9643 0.9643 0.1675776203196989 20.813676505075 +9644 0.9644 0.1655058044339313 20.622641210276 +9645 0.9645 0.1634530379110773 20.432689246805 +9646 0.9646 0.1614192124760516 20.243819453709 +9647 0.9647 0.1594042199711666 20.056030643990 +9648 0.9648 0.1574079523587342 19.869321604658 +9649 0.9649 0.1554303017236635 19.683691096756 +9650 0.9650 0.1534711602760550 19.499137855415 +9651 0.9651 0.1515304203537901 19.315660589883 +9652 0.9652 0.1496079744251164 19.133257983589 +9653 0.9653 0.1477037150912288 18.951928694164 +9654 0.9654 0.1458175350888455 18.771671353502 +9655 0.9655 0.1439493272927803 18.592484567802 +9656 0.9656 0.1420989847185095 18.414366917614 +9657 0.9657 0.1402664005247347 18.237316957882 +9658 0.9658 0.1384514680159401 18.061333218010 +9659 0.9659 0.1366540806449453 17.886414201886 +9660 0.9660 0.1348741320154529 17.712558387961 +9661 0.9661 0.1331115158845913 17.539764229272 +9662 0.9662 0.1313661261654515 17.368030153523 +9663 0.9663 0.1296378569296198 17.197354563111 +9664 0.9664 0.1279266024097039 17.027735835208 +9665 0.9665 0.1262322570018540 16.859172321789 +9666 0.9666 0.1245547152682791 16.691662349709 +9667 0.9667 0.1228938719397564 16.525204220746 +9668 0.9668 0.1212496219181355 16.359796211672 +9669 0.9669 0.1196218602788368 16.195436574302 +9670 0.9670 0.1180104822733438 16.032123535558 +9671 0.9671 0.1164153833316896 15.869855297526 +9672 0.9672 0.1148364590649370 15.708630037526 +9673 0.9673 0.1132736052676525 15.548445908163 +9674 0.9674 0.1117267179203743 15.389301037401 +9675 0.9675 0.1101956931920730 15.231193528625 +9676 0.9676 0.1086804274426067 15.074121460702 +9677 0.9677 0.1071808172251691 14.918082888050 +9678 0.9678 0.1056967592887310 14.763075840712 +9679 0.9679 0.1042281505804749 14.609098324409 +9680 0.9680 0.1027748882482233 14.456148320624 +9681 0.9681 0.1013368696428586 14.304223786670 +9682 0.9682 0.0999139923207376 14.153322655749 +9683 0.9683 0.0985061540460979 14.003442837045 +9684 0.9684 0.0971132527934569 13.854582215775 +9685 0.9685 0.0957351867500044 13.706738653275 +9686 0.9686 0.0943718543179866 13.559909987082 +9687 0.9687 0.0930231541170829 13.414094030992 +9688 0.9688 0.0916889849867757 13.269288575151 +9689 0.9689 0.0903692459887119 13.125491386126 +9690 0.9690 0.0890638364090562 12.982700206988 +9691 0.9691 0.0877726557608372 12.840912757391 +9692 0.9692 0.0864956037862851 12.700126733652 +9693 0.9693 0.0852325804591609 12.560339808832 +9694 0.9694 0.0839834859870784 12.421549632817 +9695 0.9695 0.0827482208138169 12.283753832413 +9696 0.9696 0.0815266856216256 12.146950011413 +9697 0.9697 0.0803187813335201 12.011135750698 +9698 0.9698 0.0791244091155692 11.876308608320 +9699 0.9699 0.0779434703791743 11.742466119578 +9700 0.9700 0.0767758667833389 11.609605797130 +9701 0.9701 0.0756215002369294 11.477725131059 +9702 0.9702 0.0744802729009276 11.346821588978 +9703 0.9703 0.0733520871906727 11.216892616119 +9704 0.9704 0.0722368457780957 11.087935635422 +9705 0.9705 0.0711344515939431 10.959948047630 +9706 0.9706 0.0700448078299920 10.832927231391 +9707 0.9707 0.0689678179412551 10.706870543347 +9708 0.9708 0.0679033856481765 10.581775318225 +9709 0.9709 0.0668514149388178 10.457638868950 +9710 0.9710 0.0658118100710338 10.334458486730 +9711 0.9711 0.0647844755746393 10.212231441160 +9712 0.9712 0.0637693162535648 10.090954980329 +9713 0.9713 0.0627662371880025 9.970626330918 +9714 0.9714 0.0617751437365419 9.851242698293 +9715 0.9715 0.0607959415382960 9.732801266625 +9716 0.9716 0.0598285365150153 9.615299198989 +9717 0.9717 0.0588728348731928 9.498733637462 +9718 0.9718 0.0579287431061577 9.383101703240 +9719 0.9719 0.0569961679961585 9.268400496743 +9720 0.9720 0.0560750166164350 9.154627097727 +9721 0.9721 0.0551651963332795 9.041778565383 +9722 0.9722 0.0542666148080871 8.929851938466 +9723 0.9723 0.0533791799993944 8.818844235387 +9724 0.9724 0.0525028001649079 8.708752454343 +9725 0.9725 0.0516373838635198 8.599573573419 +9726 0.9726 0.0507828399573130 8.491304550717 +9727 0.9727 0.0499390776135541 8.383942324462 +9728 0.9728 0.0491060063066753 8.277483813114 +9729 0.9729 0.0482835358202444 8.171925915504 +9730 0.9730 0.0474715762489221 8.067265510941 +9731 0.9731 0.0466700380004085 7.963499459332 +9732 0.9732 0.0458788317973763 7.860624601311 +9733 0.9733 0.0450978686793931 7.758637758354 +9734 0.9734 0.0443270600048298 7.657535732912 +9735 0.9735 0.0435663174527578 7.557315308527 +9736 0.9736 0.0428155530248335 7.457973249960 +9737 0.9737 0.0420746790471696 7.359506303317 +9738 0.9738 0.0413436081721943 7.261911196190 +9739 0.9739 0.0406222533804967 7.165184637762 +9740 0.9740 0.0399105279826605 7.069323318961 +9741 0.9741 0.0392083456210835 6.974323912579 +9742 0.9742 0.0385156202717846 6.880183073400 +9743 0.9743 0.0378322662461973 6.786897438346 +9744 0.9744 0.0371581981929502 6.694463626596 +9745 0.9745 0.0364933310996330 6.602878239747 +9746 0.9746 0.0358375802945495 6.512137861923 +9747 0.9747 0.0351908614484574 6.422239059920 +9748 0.9748 0.0345530905762931 6.333178383365 +9749 0.9749 0.0339241840388839 6.244952364820 +9750 0.9750 0.0333040585446449 6.157557519959 +9751 0.9751 0.0326926311512623 6.070990347694 +9752 0.9752 0.0320898192673623 5.985247330305 +9753 0.9753 0.0314955406541667 5.900324933607 +9754 0.9754 0.0309097134271320 5.816219607088 +9755 0.9755 0.0303322560575750 5.732927784052 +9756 0.9756 0.0297630873742839 5.650445881770 +9757 0.9757 0.0292021265651144 5.568770301619 +9758 0.9758 0.0286492931785710 5.487897429249 +9759 0.9759 0.0281045071253721 5.407823634729 +9760 0.9760 0.0275676886800018 5.328545272677 +9761 0.9761 0.0270387584822453 5.250058682454 +9762 0.9762 0.0265176375387084 5.172360188283 +9763 0.9763 0.0260042472243232 5.095446099421 +9764 0.9764 0.0254985092838368 5.019312710308 +9765 0.9765 0.0250003458332846 4.943956300736 +9766 0.9766 0.0245096793614482 4.869373135991 +9767 0.9767 0.0240264327312968 4.795559467037 +9768 0.9768 0.0235505291814127 4.722511530645 +9769 0.9769 0.0230818923274012 4.650225549585 +9770 0.9770 0.0226204461632834 4.578697732772 +9771 0.9771 0.0221661150628725 4.507924275446 +9772 0.9772 0.0217188237811347 4.437901359310 +9773 0.9773 0.0212784974555328 4.368625152727 +9774 0.9774 0.0208450616073529 4.300091810872 +9775 0.9775 0.0204184421430140 4.232297475906 +9776 0.9776 0.0199985653553617 4.165238277139 +9777 0.9777 0.0195853579249440 4.098910331215 +9778 0.9778 0.0191787469212699 4.033309742267 +9779 0.9779 0.0187786598040510 3.968432602111 +9780 0.9780 0.0183850244244256 3.904274990398 +9781 0.9781 0.0179977690261652 3.840832974810 +9782 0.9782 0.0176168222468633 3.778102611228 +9783 0.9783 0.0172421131191065 3.716079943908 +9784 0.9784 0.0168735710716275 3.654761005672 +9785 0.9785 0.0165111259304407 3.594141818063 +9786 0.9786 0.0161547079199592 3.534218391567 +9787 0.9787 0.0158042476640931 3.474986725756 +9788 0.9788 0.0154596761873304 3.416442809497 +9789 0.9789 0.0151209249157993 3.358582621126 +9790 0.9790 0.0147879256783107 3.301402128645 +9791 0.9791 0.0144606107073841 3.244897289888 +9792 0.9792 0.0141389126402525 3.189064052743 +9793 0.9793 0.0138227645198497 3.133898355314 +9794 0.9794 0.0135120997957782 3.079396126116 +9795 0.9795 0.0132068523252582 3.025553284283 +9796 0.9796 0.0129069563740563 2.972365739755 +9797 0.9797 0.0126123466173960 2.919829393452 +9798 0.9798 0.0123229581408483 2.867940137501 +9799 0.9799 0.0120387264412023 2.816693855420 +9800 0.9800 0.0117595874273158 2.766086422310 +9801 0.9801 0.0114854774209473 2.716113705060 +9802 0.9802 0.0112163331575666 2.666771562553 +9803 0.9803 0.0109520917871459 2.618055845862 +9804 0.9804 0.0106926908749305 2.569962398445 +9805 0.9805 0.0104380684021898 2.522487056370 +9806 0.9806 0.0101881627669461 2.475625648503 +9807 0.9807 0.0099429127846849 2.429373996721 +9808 0.9808 0.0097022576890428 2.383727916122 +9809 0.9809 0.0094661371324754 2.338683215226 +9810 0.9810 0.0092344911869044 2.294235696193 +9811 0.9811 0.0090072603443432 2.250381155031 +9812 0.9812 0.0087843855175007 2.207115381819 +9813 0.9813 0.0085658080403649 2.164434160897 +9814 0.9814 0.0083514696687645 2.122333271111 +9815 0.9815 0.0081413125809089 2.080808486001 +9816 0.9816 0.0079352793779068 2.039855574042 +9817 0.9817 0.0077333130842621 1.999470298852 +9818 0.9818 0.0075353571483490 1.959648419409 +9819 0.9819 0.0073413554428648 1.920385690275 +9820 0.9820 0.0071512522652599 1.881677861823 +9821 0.9821 0.0069649923381456 1.843520680463 +9822 0.9822 0.0067825208096798 1.805909888853 +9823 0.9823 0.0066037832539302 1.768841226140 +9824 0.9824 0.0064287256712143 1.732310428177 +9825 0.9825 0.0062572944884176 1.696313227758 +9826 0.9826 0.0060894365592875 1.660845354844 +9827 0.9827 0.0059250991647052 1.625902536802 +9828 0.9828 0.0057642300129340 1.591480498622 +9829 0.9829 0.0056067772398442 1.557574963174 +9830 0.9830 0.0054526894091150 1.524181651411 +9831 0.9831 0.0053019155124126 1.491296282637 +9832 0.9832 0.0051544049695444 1.458914574727 +9833 0.9833 0.0050101076285894 1.427032244372 +9834 0.9834 0.0048689737660052 1.395645007313 +9835 0.9835 0.0047309540867103 1.364748578584 +9836 0.9836 0.0045959997241432 1.334338672759 +9837 0.9837 0.0044640622402956 1.304411004193 +9838 0.9838 0.0043350936257231 1.274961287256 +9839 0.9839 0.0042090462995297 1.245985236613 +9840 0.9840 0.0040858731093279 1.217478567422 +9841 0.9841 0.0039655273311753 1.189436995630 +9842 0.9842 0.0038479626694844 1.161856238188 +9843 0.9843 0.0037331332569091 1.134732013319 +9844 0.9844 0.0036209936542043 1.108060040776 +9845 0.9845 0.0035114988500616 1.081836042078 +9846 0.9846 0.0034046042609189 1.056055740776 +9847 0.9847 0.0033002657307443 1.030714862717 +9848 0.9848 0.0031984395307944 1.005809136281 +9849 0.9849 0.0030990823593472 0.981334292663 +9850 0.9850 0.0030021513414088 0.957286066105 +9851 0.9851 0.0029076040283939 0.933660194193 +9852 0.9852 0.0028153983977799 0.910452418087 +9853 0.9853 0.0027254928527345 0.887658482820 +9854 0.9854 0.0026378462217182 0.865274137507 +9855 0.9855 0.0025524177580587 0.843295135682 +9856 0.9856 0.0024691671394987 0.821717235518 +9857 0.9857 0.0023880544677176 0.800536200104 +9858 0.9858 0.0023090402678260 0.779747797728 +9859 0.9859 0.0022320854878327 0.759347802139 +9860 0.9860 0.0021571514980844 0.739331992827 +9861 0.9861 0.0020842000906788 0.719696155285 +9862 0.9862 0.0020131934788496 0.700436081298 +9863 0.9863 0.0019440942963234 0.681547569226 +9864 0.9864 0.0018768655966499 0.663026424244 +9865 0.9865 0.0018114708525038 0.644868458679 +9866 0.9866 0.0017478739549579 0.627069492239 +9867 0.9867 0.0016860392127290 0.609625352338 +9868 0.9868 0.0016259313513951 0.592531874341 +9869 0.9869 0.0015675155125847 0.575784901867 +9870 0.9870 0.0015107572531370 0.559380287086 +9871 0.9871 0.0014556225442327 0.543313891001 +9872 0.9872 0.0014020777704974 0.527581583705 +9873 0.9873 0.0013500897290759 0.512179244724 +9874 0.9874 0.0012996256286765 0.497102763264 +9875 0.9875 0.0012506530885863 0.482348038540 +9876 0.9876 0.0012031401376574 0.467910980038 +9877 0.9877 0.0011570552132644 0.453787507822 +9878 0.9878 0.0011123671602307 0.439973552853 +9879 0.9879 0.0010690452297255 0.426465057250 +9880 0.9880 0.0010270590781328 0.413257974605 +9881 0.9881 0.0009863787658876 0.400348270299 +9882 0.9882 0.0009469747562834 0.387731921785 +9883 0.9883 0.0009088179142494 0.375404918894 +9884 0.9884 0.0008718795050975 0.363363264145 +9885 0.9885 0.0008361311932378 0.351602973049 +9886 0.9886 0.0008015450408639 0.340120074429 +9887 0.9887 0.0007680935066077 0.328910610695 +9888 0.9888 0.0007357494441632 0.317970638194 +9889 0.9889 0.0007044861008789 0.307296227493 +9890 0.9890 0.0006742771163189 0.296883463706 +9891 0.9891 0.0006450965207929 0.286728446814 +9892 0.9892 0.0006169187338550 0.276827291945 +9893 0.9893 0.0005897185627703 0.267176129748 +9894 0.9894 0.0005634712009500 0.257771106659 +9895 0.9895 0.0005381522263542 0.248608385257 +9896 0.9896 0.0005137375998637 0.239684144553 +9897 0.9897 0.0004902036636182 0.230994580356 +9898 0.9898 0.0004675271393236 0.222535905536 +9899 0.9899 0.0004456851265260 0.214304350415 +9900 0.9900 0.0004246551008535 0.206296163036 +9901 0.9901 0.0004044149122242 0.198507609550 +9902 0.9902 0.0003849427830235 0.190934974464 +9903 0.9903 0.0003662173062468 0.183574561070 +9904 0.9904 0.0003482174436089 0.176422691688 +9905 0.9905 0.0003309225236213 0.169475708063 +9906 0.9906 0.0003143122396353 0.162729971658 +9907 0.9907 0.0002983666478514 0.156181864019 +9908 0.9908 0.0002830661652962 0.149827787085 +9909 0.9909 0.0002683915677636 0.143664163567 +9910 0.9910 0.0002543239877238 0.137687437229 +9911 0.9911 0.0002408449121972 0.131894073303 +9912 0.9912 0.0002279361805940 0.126280558761 +9913 0.9913 0.0002155799825210 0.120843402699 +9914 0.9914 0.0002037588555519 0.115579136683 +9915 0.9915 0.0001924556829634 0.110484315088 +9916 0.9916 0.0001816536914373 0.105555515433 +9917 0.9917 0.0001713364487277 0.100789338760 +9918 0.9918 0.0001614878612914 0.096182409967 +9919 0.9919 0.0001520921718853 0.091731378155 +9920 0.9920 0.0001431339571278 0.087432916993 +9921 0.9921 0.0001345981250243 0.083283725077 +9922 0.9922 0.0001264699124563 0.079280526284 +9923 0.9923 0.0001187348826360 0.075420070122 +9924 0.9924 0.0001113789225259 0.071699132080 +9925 0.9925 0.0001043882402198 0.068114514042 +9926 0.9926 0.0000977493622886 0.064663044582 +9927 0.9927 0.0000914491310918 0.061341579353 +9928 0.9928 0.0000854747020498 0.058147001488 +9929 0.9929 0.0000798135408796 0.055076221917 +9930 0.9930 0.0000744534207963 0.052126179747 +9931 0.9931 0.0000693824196764 0.049293842651 +9932 0.9932 0.0000645889171825 0.046576207228 +9933 0.9933 0.0000600615918528 0.043970299366 +9934 0.9934 0.0000557894181535 0.041473174620 +9935 0.9935 0.0000517616634915 0.039081918619 +9936 0.9936 0.0000479678851917 0.036793647378 +9937 0.9937 0.0000443979274358 0.034605507740 +9938 0.9938 0.0000410419181630 0.032514677717 +9939 0.9939 0.0000378902659329 0.030518366884 +9940 0.9940 0.0000349336567502 0.028613816770 +9941 0.9941 0.0000321630508513 0.026798301208 +9942 0.9942 0.0000295696794518 0.025069126783 +9943 0.9943 0.0000271450414556 0.023423633141 +9944 0.9944 0.0000248809001268 0.021859193434 +9945 0.9945 0.0000227692797206 0.020373214690 +9946 0.9946 0.0000208024620754 0.018963138215 +9947 0.9947 0.0000189729831670 0.017626439953 +9948 0.9948 0.0000172736296227 0.016360630932 +9949 0.9949 0.0000156974351959 0.015163257604 +9950 0.9950 0.0000142376772015 0.014031902284 +9951 0.9951 0.0000128878729113 0.012964183520 +9952 0.9952 0.0000116417759091 0.011957756525 +9953 0.9953 0.0000104933724057 0.011010313542 +9954 0.9954 0.0000094368775155 0.010119584263 +9955 0.9955 0.0000084667314907 0.009283336232 +9956 0.9956 0.0000075775959158 0.008499375266 +9957 0.9957 0.0000067643498613 0.007765545825 +9958 0.9958 0.0000060220859969 0.007079731463 +9959 0.9959 0.0000053461066640 0.006439855194 +9960 0.9960 0.0000047319199066 0.005843879955 +9961 0.9961 0.0000041752354607 0.005289808962 +9962 0.9962 0.0000036719607039 0.004775686173 +9963 0.9963 0.0000032181965615 0.004299596676 +9964 0.9964 0.0000028102333724 0.003859667105 +9965 0.9965 0.0000024445467136 0.003454066072 +9966 0.9966 0.0000021177931802 0.003081004596 +9967 0.9967 0.0000018268061264 0.002738736479 +9968 0.9968 0.0000015685913626 0.002425558798 +9969 0.9969 0.0000013403228094 0.002139812266 +9970 0.9970 0.0000011393381119 0.001879881684 +9971 0.9971 0.0000009631342090 0.001644196375 +9972 0.9972 0.0000008093628600 0.001431230605 +9973 0.9973 0.0000006758261288 0.001239504018 +9974 0.9974 0.0000005604718253 0.001067582053 +9975 0.9975 0.0000004613889024 0.000914076405 +9976 0.9976 0.0000003768028111 0.000777645421 +9977 0.9977 0.0000003050708110 0.000656994580 +9978 0.9978 0.0000002446772376 0.000550876888 +9979 0.9979 0.0000001942287250 0.000458093365 +9980 0.9980 0.0000001524493857 0.000377493421 +9981 0.9981 0.0000001181759455 0.000307975382 +9982 0.9982 0.0000000903528342 0.000248486845 +9983 0.9983 0.0000000680272320 0.000198025199 +9984 0.9984 0.0000000503440708 0.000155638024 +9985 0.9985 0.0000000365409926 0.000120423540 +9986 0.9986 0.0000000259432605 0.000091531102 +9987 0.9987 0.0000000179586256 0.000068161597 +9988 0.9988 0.0000000120721492 0.000049567931 +9989 0.9989 0.0000000078409804 0.000035055444 +9990 0.9990 0.0000000048890860 0.000023982445 +9991 0.9991 0.0000000029019359 0.000015760555 +9992 0.9992 0.0000000016211434 0.000009855295 +9993 0.9993 0.0000000008390583 0.000005786407 +9994 0.9994 0.0000000003933154 0.000003128451 +9995 0.9995 0.0000000001613347 0.000001511164 +9996 0.9996 0.0000000000547778 0.000000619975 +9997 0.9997 0.0000000000139549 0.000000196483 +9998 0.9998 0.0000000000021871 0.000000038872 +9999 0.9999 0.0000000000001218 0.000000002435 +10000 1.0000 0.0000000000000000 0.000000000000 +#Correcting potential for cireaxFF CH + +CH_cireaxFF +N 11000 R 0.0001 1.1 + +1 0.0001 22788987.6637434661388397 199238099992.029479980469 +2 0.0002 10336611.1345401313155890 49809430592.037185668945 +3 0.0003 6739266.8620063066482544 22137454858.639308929443 +4 0.0004 5009780.9482329245656729 12452263416.828327178955 +5 0.0005 3988697.6058115381747484 7969403431.599391937256 +6 0.0006 3313513.9513340918347239 5534269657.949536323547 +7 0.0007 2833502.4266478852368891 4065960835.774597644806 +8 0.0008 2474555.7862776964902878 3112971971.629174709320 +9 0.0009 2195926.8889475101605058 2459605974.974547863007 +10 0.0010 1973333.7327434658072889 1992257149.106339931488 +11 0.0011 1791397.2804171298630536 1646471897.420378446579 +12 0.0012 1639899.9915898663457483 1383473879.124892950058 +13 0.0013 1511786.3175989524461329 1178799600.693382978439 +14 0.0014 1402026.4952315052505583 1016396846.655561327934 +15 0.0015 1306937.7223516637459397 885378610.941268205643 +16 0.0016 1223761.3016378467436880 778149803.335073471069 +17 0.0017 1150389.7510724726598710 689281207.972409963608 +18 0.0018 1085185.2668474747333676 614808476.527548670769 +19 0.0019 1026855.7319258453790098 551782221.905036926270 +20 0.0020 974368.0487277822103351 497971442.056226730347 +21 0.0021 926886.3098315270617604 451663335.868877112865 +22 0.0022 883726.8779995965305716 411525300.769733726978 +23 0.0023 844325.2140232791425660 376507978.756615102291 +24 0.0024 808211.0167119457619265 345775967.470053136349 +25 0.0025 774989.3418865720741451 318657529.037420809269 +26 0.0026 744326.0869959178380668 294607568.775664985180 +27 0.0027 715936.7071602429496124 273180027.937833368778 +28 0.0028 689577.3532223893562332 254007050.819239288568 +29 0.0029 665037.8461339290952310 236783090.949965804815 +30 0.0030 642136.0584822519449517 221252662.083577007055 +31 0.0031 620713.3849218469113111 207200809.124524354935 +32 0.0032 600631.0629648580215871 194445630.015254348516 +33 0.0033 581767.1635053578065708 182832359.174749493599 +34 0.0034 564014.1130141892936081 172228650.648620545864 +35 0.0035 547276.6409419992705807 162520790.795180559158 +36 0.0036 531470.0695571007672697 153610636.902788937092 +37 0.0037 516518.8813636678969488 145413126.965869009495 +38 0.0038 502355.5129151503788307 137854242.004481703043 +39 0.0039 488919.3343488158425316 130869329.322209432721 +40 0.0040 476155.7821105973562226 124401715.442160859704 +41 0.0041 464015.6186931638512760 118401552.906509667635 +42 0.0042 452454.2982009176630527 112824856.938414454460 +43 0.0043 441431.4205007779528387 107632697.064379543066 +44 0.0044 430910.2598550287657417 102790515.850603893399 +45 0.0045 420857.3564418723690324 98267552.412524193525 +46 0.0046 411242.1611873022629879 94036352.678877964616 +47 0.0047 402036.7259631411870942 90072351.804343208671 +48 0.0048 393215.4325312200817280 86353516.834078595042 +49 0.0049 384754.7546952290576883 82860039.885741680861 +50 0.0050 376633.0490085032652132 79574073.848774015903 +51 0.0051 368830.3701161467470229 76479503.998356267810 +52 0.0052 361328.3074135820497759 73561750.052937105298 +53 0.0053 354109.8402047193958424 70807594.124316170812 +54 0.0054 347159.2089604748180136 68205030.760575905442 +55 0.0055 340461.8006275387597270 65743135.898145407438 +56 0.0056 334004.0462303177919239 63411952.046273477376 +57 0.0057 327773.3292557020904496 61202387.446040719748 +58 0.0058 321757.9035187344416045 59106127.293312758207 +59 0.0059 315946.8193838708102703 57115555.403960004449 +60 0.0060 310329.8573666301672347 55223684.940852820873 +61 0.0061 304897.4682683818391524 53424097.024114072323 +62 0.0062 299640.7191063871723600 51710886.215779535472 +63 0.0063 294551.2441949496278539 50078612.012970924377 +64 0.0064 289621.2008140769321471 48522255.604483112693 +65 0.0065 284843.2289714504731819 47037181.248045973480 +66 0.0066 280210.4148234236636199 45619101.712490074337 +67 0.0067 275716.2573726424598135 44264047.303134165704 +68 0.0068 271354.6381048863404430 42968338.051987938583 +69 0.0069 267119.7932668602443300 41728558.708533637226 +70 0.0070 263006.2885207664803602 40541536.213342189789 +71 0.0071 259008.9957412610237952 39404319.376766681671 +72 0.0072 255123.0717464510817081 38314160.519431941211 +73 0.0073 251343.9387774284114130 37268498.861021690071 +74 0.0074 247667.2665608946117572 36264945.469654418528 +75 0.0075 244088.9558070864004549 35301269.606509663165 +76 0.0076 240605.1230107700685039 34375386.319817088544 +77 0.0077 237212.0864368163456675 33485345.159257300198 +78 0.0078 233906.3531840230280068 32629319.896608810872 +79 0.0079 230684.6072316228819545 31805599.151394251734 +80 0.0080 227543.6983824731141794 31012577.831601154059 +81 0.0081 224480.6320254191814456 30248749.309477727860 +82 0.0082 221492.5596468886651564 29512698.261132575572 +83 0.0083 218576.7700285146420356 28803094.106348071247 +84 0.0084 215730.6810736078477930 28118684.991787753999 +85 0.0085 212951.8322106804698706 27458292.266759824008 +86 0.0086 210237.8773270430974662 26820805.405987534672 +87 0.0087 207586.5781898176937830 26205177.338520292193 +88 0.0088 204995.7983155878027901 25610420.146077439189 +89 0.0089 202463.4972533936670516 25035601.097805149853 +90 0.0090 199987.7252489178790711 24479838.991710845381 +91 0.0091 197566.6182605341018643 23942300.775964848697 +92 0.0092 195198.3933004425198305 23422198.425867021084 +93 0.0093 192881.3440764189581387 22918786.054604131728 +94 0.0094 190613.8369117882684804 22431357.238009363413 +95 0.0095 188394.3069231179542840 21959242.535397209227 +96 0.0096 186221.2544368370436132 21501807.190220955759 +97 0.0097 184093.2416275359864812 21058448.995799891651 +98 0.0098 182008.8893621105526108 20628596.312708813697 +99 0.0099 179966.8742351931869052 20211706.225638397038 +100 0.0100 177965.9257824800151866 19807262.828625004739 +101 0.0101 176004.8238596221490297 19414775.628532290459 +102 0.0102 174082.3961753177572973 19033778.057555798441 +103 0.0103 172197.5159681237128098 18663826.086325231940 +104 0.0104 170349.0998173122934531 18304496.929903090000 +105 0.0105 168536.1055788353842217 17955387.839635033160 +106 0.0106 166757.5304381333407946 17616114.974405597895 +107 0.0107 165012.4090721436368767 17286312.345388192683 +108 0.0108 163299.8119134306325577 16965630.828871779144 +109 0.0109 161618.8435098774498329 16653737.242192005739 +110 0.0110 159968.6409738580696285 16350313.478195458651 +111 0.0111 158348.3725152462429833 16055055.694041298702 +112 0.0112 156757.2360530204896349 15767673.550473842770 +113 0.0113 155194.4579005963169038 15487889.498009558767 +114 0.0114 153659.2915203577722423 15215438.106761369854 +115 0.0115 152151.0163431758119259 14950065.436877654865 +116 0.0116 150668.9366489915992133 14691528.446806840599 +117 0.0117 149212.3805048106296454 14439594.436812501401 +118 0.0118 147780.6987567020405550 14194040.525359258056 +119 0.0119 146373.2640726255776826 13954653.156169982627 +120 0.0120 144989.4700331212661695 13721227.633915985003 +121 0.0121 143628.7302670925855637 13493567.686657618731 +122 0.0122 142290.4776300953817554 13271485.053286185488 +123 0.0123 140974.1634227136091795 13054799.094349212945 +124 0.0124 139679.2566467583528720 12843336.424755681306 +125 0.0125 138405.2432971721864305 12636930.566967403516 +126 0.0126 137151.6256876547995489 12435421.623380124569 +127 0.0127 135917.9218081512372009 12238655.966691028327 +128 0.0128 134703.6647124600713141 12046485.947132334113 +129 0.0129 133508.4019343269465026 11858769.615529989824 +130 0.0130 132331.6949304896115791 11675370.461216779426 +131 0.0131 131173.1185492340009660 11496157.163895610720 +132 0.0132 130032.2605231086199638 11321003.358612034470 +133 0.0133 128908.7209845255274558 11149787.413049913943 +134 0.0134 127802.1120030521997251 10982392.216416653246 +135 0.0135 126712.0571432696160628 10818704.979234978557 +136 0.0136 125638.1910421378415776 10658617.043400641531 +137 0.0137 124580.1590048722864594 10502023.701910419390 +138 0.0138 123537.6166183917521266 10348824.027700318024 +139 0.0139 122510.2293814531003591 10198920.711072660983 +140 0.0140 121497.6723506383423228 10052219.905222501606 +141 0.0141 120499.6298014069470810 9908631.079405346885 +142 0.0142 119515.7949034707853571 9768066.879317935556 +143 0.0143 118545.8694097904372029 9630442.994288949296 +144 0.0144 117589.5633585308096372 9495678.030903607607 +145 0.0145 116646.5947873502445873 9363693.392707681283 +146 0.0146 115716.6894594318873715 9234413.165659498423 +147 0.0147 114799.5806006980274105 9107764.009017735720 +148 0.0148 113895.0086476785072591 8983675.051372559741 +149 0.0149 113002.7210055326431757 8862077.791544625536 +150 0.0150 112122.4718157507450087 8742906.004093339667 +151 0.0151 111254.0217330865416443 8626095.649190869182 +152 0.0152 110397.1377112953487085 8511584.786633092910 +153 0.0153 109551.5927972751087509 8399313.493771657348 +154 0.0154 108717.1659332283161348 8289223.787164182402 +155 0.0155 107893.6417664825276006 8181259.547751543112 +156 0.0156 107080.8104666258732323 8075366.449381573126 +157 0.0157 106278.4675496313138865 7971491.890509480610 +158 0.0158 105486.4137086601112969 7869584.928914608434 +159 0.0159 104704.4546512502711266 7769596.219282128848 +160 0.0160 103932.4009426108095795 7671477.953507028520 +161 0.0161 103170.0678547561838059 7575183.803585435264 +162 0.0162 102417.2752212286141003 7480668.866965977475 +163 0.0163 101673.8472971682786010 7387889.614240696654 +164 0.0164 100939.6126245031482540 7296803.839061981067 +165 0.0165 100214.4039020411728416 7207370.610177553259 +166 0.0166 99498.0578602581808809 7119550.225482173264 +167 0.0167 98790.4151405846059788 7033304.167989372276 +168 0.0168 98091.3201790035236627 6948595.063632249832 +169 0.0169 97400.6210937815631041 6865386.640806972980 +170 0.0170 96718.1695771623490145 6783643.691577250138 +171 0.0171 96043.8207908603799297 6703332.034462166019 +172 0.0172 95377.4332652005687123 6624418.478734144010 +173 0.0173 94718.8688017560052685 6546870.790157235228 +174 0.0174 94067.9923793431516970 6470657.658099768683 +175 0.0175 93424.6720632402284537 6395748.663958749734 +176 0.0176 92788.7789175004581921 6322114.250836570747 +177 0.0177 92160.1869202379602939 6249725.694413391873 +178 0.0178 91538.7728817691968288 6178555.074961925857 +179 0.0179 90924.4163654984295135 6108575.250453427434 +180 0.0180 90316.9996114404202672 6039759.830706712790 +181 0.0181 89716.4074622783809900 5972083.152534125373 +182 0.0182 89122.5272918596310774 5905520.255840793252 +183 0.0183 88535.2489360358158592 5840046.860635651276 +184 0.0184 87954.4646257583081024 5775639.344914568588 +185 0.0185 87380.0689223436784232 5712274.723378166556 +186 0.0186 86811.9586548273509834 5649930.626948376186 +187 0.0187 86250.0328593274462037 5588585.283049616963 +188 0.0188 85694.1927203438535798 5528217.496622358449 +189 0.0189 85144.3415139208373148 5468806.631837919354 +190 0.0190 84600.3845526046789018 5410332.594485185109 +191 0.0191 84062.2291321303637233 5352775.815001153387 +192 0.0192 83529.7844797743746312 5296117.232118505053 +193 0.0193 83002.9617043132166145 5240338.277104726993 +194 0.0194 82481.6737475295522017 5185420.858568533324 +195 0.0195 81965.8353372106212191 5131347.347810166888 +196 0.0196 81455.3629415854375111 5078100.564693652093 +197 0.0197 80950.1747251497727120 5025663.764019752853 +198 0.0198 80450.1905058298143558 4974020.622379438020 +199 0.0199 79955.3317134374083253 4923155.225468670018 +200 0.0200 79465.5213493716728408 4873052.055846039206 +201 0.0201 78980.6839475235901773 4823695.981115681119 +202 0.0202 78500.7455363418703200 4775072.242518653162 +203 0.0203 78025.6336020200978965 4727166.443916803226 +204 0.0204 77555.2770527665707050 4679964.541153670289 +205 0.0205 77089.6061841199989431 4633452.831777757034 +206 0.0206 76628.5526452753983904 4587617.945114245638 +207 0.0207 76172.0494063861115137 4542446.832671517506 +208 0.0208 75720.0307268090400612 4497926.758869871497 +209 0.0209 75272.4321242615551455 4454045.292079949751 +210 0.0210 74829.1903448595985537 4410790.295959160663 +211 0.0211 74390.2433340079005575 4368149.921074891463 +212 0.0212 73955.5302081139816437 4326112.596803579479 +213 0.0213 73524.9912270990316756 4284667.023495471105 +214 0.0214 73098.5677676795021398 4243802.164895007387 +215 0.0215 72676.2022973943821853 4203507.240807446651 +216 0.0216 72257.8383493538858602 4163771.720002557151 +217 0.0217 71843.4204976864275523 4124585.313346728217 +218 0.0218 71432.8943336613301653 4085937.967155077960 +219 0.0219 71026.2064424658019561 4047819.856755586807 +220 0.0220 70623.3043806151399622 4010221.380257511046 +221 0.0221 70224.1366539764276240 3973133.152516770642 +222 0.0222 69828.6526963860378601 3936545.999291122425 +223 0.0223 69436.8028488425625255 3900450.951578463893 +224 0.0224 69048.5383392570511205 3864839.240131650586 +225 0.0225 68663.8112627433001762 3829702.290143489838 +226 0.0226 68282.5745624313130975 3795031.716096154880 +227 0.0227 67904.7820107880543219 3760819.316768941469 +228 0.0228 67530.3881914296507603 3727057.070399051066 +229 0.0229 67159.3484814101975644 3693737.129989877343 +230 0.0230 66791.6190339726163074 3660851.818761860486 +231 0.0231 66427.1567617474793224 3628393.625740860589 +232 0.0232 66065.9193203864706447 3596355.201479325537 +233 0.0233 65707.8650926172122126 3564729.353905783035 +234 0.0234 65352.9531727070134366 3533509.044298208784 +235 0.0235 65001.1433513232477708 3502687.383377046790 +236 0.0236 64652.3961007787002018 3472257.627513889689 +237 0.0237 64306.6725606504114694 3442213.175051939208 +238 0.0238 63963.9345237610905315 3412547.562734413892 +239 0.0239 63624.1444225125014782 3383254.462237342261 +240 0.0240 63287.2653155604712083 3354327.676803309005 +241 0.0241 62953.2608748216662207 3325761.137972739059 +242 0.0242 62622.0953728025488090 3297548.902409553062 +243 0.0243 62293.7336702411703300 3269685.148818052839 +244 0.0244 61968.1412040528593934 3242164.174948144704 +245 0.0245 61645.2839755711611360 3214980.394685824867 +246 0.0246 61325.1285390755510889 3188128.335226407740 +247 0.0247 61007.6419905978473253 3161602.634327672888 +248 0.0248 60692.7919569994483027 3135398.037640320603 +249 0.0249 60380.5465853117639199 3109509.396113428287 +250 0.0250 60070.8745323324765195 3083931.663472308312 +251 0.0251 59763.7449544705305016 3058659.893766653724 +252 0.0252 59459.1274978328729048 3033689.238986563403 +253 0.0253 59156.9922885463165585 3009014.946744495071 +254 0.0254 58857.3099233080502017 2984632.358020891901 +255 0.0255 58560.0514601584218326 2960536.904971605632 +256 0.0256 58265.1884094700799324 2936724.108795195352 +257 0.0257 57972.6927251474189688 2913189.577658087015 +258 0.0258 57682.5367960307121393 2889929.004676083568 +259 0.0259 57394.6934374994016252 2866938.165950146504 +260 0.0260 57109.1358832691403222 2844212.918655102141 +261 0.0261 56825.8377773774118396 2821749.199179425836 +262 0.0262 56544.7731663527083583 2799543.021314680111 +263 0.0263 56265.9164915623259731 2777590.474492982496 +264 0.0264 55989.2425817341136280 2755887.722071218770 +265 0.0265 55714.7266456475335872 2734430.999660402071 +266 0.0266 55442.3442649895659997 2713216.613498961087 +267 0.0267 55172.0713873711865745 2692240.938868572935 +268 0.0268 54903.8843195001900312 2671500.418551350944 +269 0.0269 54637.7597205062702415 2650991.561327003408 +270 0.0270 54373.6745954144716961 2630710.940508958418 +271 0.0271 54111.6062887631123886 2610655.192518258933 +272 0.0272 53851.5324783625037526 2590821.015493964776 +273 0.0273 53593.4311691908442299 2571205.167939272244 +274 0.0274 53337.2806874237794545 2551804.467402064707 +275 0.0275 53083.0596745942239068 2532615.789188981988 +276 0.0276 52830.7470818791698548 2513636.065112130716 +277 0.0277 52580.3221645102021284 2494862.282267282717 +278 0.0278 52331.7644763046919252 2476291.481842917856 +279 0.0279 52085.0538643145991955 2457920.757958980743 +280 0.0280 51840.1704635899150162 2439747.256534695625 +281 0.0281 51597.0946920539572602 2421768.174184448086 +282 0.0282 51355.8072454876746633 2403980.757141174749 +283 0.0283 51116.2890926203108393 2386382.300206145737 +284 0.0284 50878.5214703237652429 2368970.145724718459 +285 0.0285 50642.4858789081699797 2351741.682587187272 +286 0.0286 50408.1640775161140482 2334694.345254000742 +287 0.0287 50175.5380796131794341 2317825.612804746255 +288 0.0288 49944.5901485724316444 2301133.008010194171 +289 0.0289 49715.3027933505800320 2284614.096426784992 +290 0.0290 49487.6587642535960185 2268266.485512940679 +291 0.0291 49261.6410487896209816 2252087.823766603600 +292 0.0292 49037.2328676071192604 2236075.799883380067 +293 0.0293 48814.4176705162099097 2220228.141934811603 +294 0.0294 48593.1791325911617605 2204542.616566108074 +295 0.0295 48373.5011503522036946 2189017.028212983627 +296 0.0296 48155.3678380247074529 2173649.218336909078 +297 0.0297 47938.7635238739458146 2158437.064678370953 +298 0.0298 47723.6727466136435396 2143378.480527611449 +299 0.0299 47510.0802518866330502 2128471.414012539666 +300 0.0300 47297.9709888158540707 2113713.847403059248 +301 0.0301 47087.3301066241183435 2099103.796431661118 +302 0.0302 46878.1429513210532605 2084639.309629680589 +303 0.0303 46670.3950624556237017 2070318.467678939691 +304 0.0304 46464.0721699327696115 2056139.382778186584 +305 0.0305 46259.1601908926531905 2042100.198024144163 +306 0.0306 46055.6452266511114431 2028199.086806621868 +307 0.0307 45853.5135596999025438 2014434.252217484638 +308 0.0308 45652.7516507653854205 2000803.926472923253 +309 0.0309 45453.3461359242937760 1987306.370348884026 +310 0.0310 45255.2838237753894646 1973939.872629199177 +311 0.0311 45058.5516926656273426 1960702.749566066545 +312 0.0312 44863.1368879696892691 1947593.344352709129 +313 0.0313 44669.0267194216648932 1934610.026607716689 +314 0.0314 44476.2086584977296297 1921751.191870953422 +315 0.0315 44284.6703358486556681 1909015.261110539781 +316 0.0316 44094.3995387810864486 1896400.680240851827 +317 0.0317 43905.3842087864904897 1883905.919651091099 +318 0.0318 43717.6124391167249996 1871529.473744204501 +319 0.0319 43531.0724724052197416 1859269.860485924641 +320 0.0320 43345.7526983327406924 1847125.620963659603 +321 0.0321 43161.6416513368094456 1835095.318955012830 +322 0.0322 42978.7280083637815551 1823177.540505573852 +323 0.0323 42797.0005866627034266 1811370.893515997333 +324 0.0324 42616.4483416200091597 1799674.007337833289 +325 0.0325 42437.0603646342060529 1788085.532378156669 +326 0.0326 42258.8258810296683805 1776604.139712609351 +327 0.0327 42081.7342480086954311 1765228.520706777228 +328 0.0328 41905.7749526410771068 1753957.386645572493 +329 0.0329 41730.9376098902721424 1742789.468370502349 +330 0.0330 41557.2119606755150016 1731723.515924669104 +331 0.0331 41384.5878699690219946 1720758.298205191037 +332 0.0332 41213.0553249276126735 1709892.602623021696 +333 0.0333 41042.6044330579679809 1699125.234769819537 +334 0.0334 40873.2254204148848657 1688455.018091898877 +335 0.0335 40704.9086298317488399 1677880.793570828624 +336 0.0336 40537.6445191826642258 1667401.419410884148 +337 0.0337 40371.4236596754853963 1657015.770732765319 +338 0.0338 40206.2367341751596541 1646722.739273797721 +339 0.0339 40042.0745355567560182 1636521.233094271272 +340 0.0340 39878.9279650875541847 1626410.176289772615 +341 0.0341 39716.7880308375897584 1616388.508709492395 +342 0.0342 39555.6458461181027815 1606455.185680247610 +343 0.0343 39395.4926279472856550 1596609.177736069309 +344 0.0344 39236.3196955428065849 1586849.470353444805 +345 0.0345 39078.1184688405483030 1577175.063691735966 +346 0.0346 38920.8804670390163665 1567584.972338960273 +347 0.0347 38764.5973071689295466 1558078.225062710466 +348 0.0348 38609.2607026874975418 1548653.864565934287 +349 0.0349 38454.8624620968112140 1539310.947247793898 +350 0.0350 38301.3944875859669992 1530048.542969138594 +351 0.0351 38148.8487736963725183 1520865.734822760569 +352 0.0352 37997.2174060098259361 1511761.618908138946 +353 0.0353 37846.4925598588815774 1502735.304110727506 +354 0.0354 37696.6664990590725210 1493785.911885474110 +355 0.0355 37547.7315746625608881 1484912.576044723159 +356 0.0356 37399.6802237328156480 1476114.442550244043 +357 0.0357 37252.5049681398377288 1467390.669309289893 +358 0.0358 37106.1984133756341180 1458740.425974710844 +359 0.0359 36960.7532473894534633 1450162.893748871051 +360 0.0360 36816.1622394424339291 1441657.265191489598 +361 0.0361 36672.4182389813067857 1433222.744031080976 +362 0.0362 36529.5141745307482779 1424858.544980105013 +363 0.0363 36387.4430526040596305 1416563.893553666538 +364 0.0364 36246.1979566317895660 1408338.025891725207 +365 0.0365 36105.7720459079719149 1400180.188584615244 +366 0.0366 35966.1585545536436257 1392089.638502017595 +367 0.0367 35827.3507904972866527 1384065.642625086010 +368 0.0368 35689.3421344719390618 1376107.477881861152 +369 0.0369 35552.1260390285606263 1368214.430985697545 +370 0.0370 35415.6960275654346333 1360385.798276845599 +371 0.0371 35280.0456933732493781 1352620.885566920275 +372 0.0372 35145.1686986955828615 1344919.007986381184 +373 0.0373 35011.0587738045214792 1337279.489834823878 +374 0.0374 34877.7097160910780076 1329701.664434047882 +375 0.0375 34745.1153891701760585 1322184.873983938713 +376 0.0376 34613.2697219999317895 1314728.469420936424 +377 0.0377 34482.1667080149272806 1307331.810279215686 +378 0.0378 34351.8004042732500238 1299994.264554376481 +379 0.0379 34222.1649306170511409 1292715.208569654031 +380 0.0380 34093.2544688463385683 1285494.026844628388 +381 0.0381 33965.0632619057942065 1278330.111966294236 +382 0.0382 33837.5856130843530991 1271222.864462511614 +383 0.0383 33710.8158852273409138 1264171.692677784944 +384 0.0384 33584.7484999608859653 1257176.012651284458 +385 0.0385 33459.3779369284675340 1250235.247997065075 +386 0.0386 33334.6987330392876174 1243348.829786475748 +387 0.0387 33210.7054817283278680 1236516.196432731580 +388 0.0388 33087.3928322278152336 1229736.793577451957 +389 0.0389 32964.7554888499726076 1223010.073979381472 +390 0.0390 32842.7882102807561751 1216335.497404999333 +391 0.0391 32721.4858088844484882 1209712.530521129956 +392 0.0392 32600.8431500189217331 1203140.646789432270 +393 0.0393 32480.8551513613092538 1196619.326362841064 +394 0.0394 32361.5167822439798329 1190148.055983764818 +395 0.0395 32242.8230630005855346 1183726.328884127783 +396 0.0396 32124.7690643220230413 1177353.644687158521 +397 0.0397 32007.3499066221193061 1171029.509310931200 +398 0.0398 31890.5607594128960045 1164753.434873563936 +399 0.0399 31774.3968406892090570 1158524.939600150799 +400 0.0400 31658.8534163226431701 1152343.547731189756 +401 0.0401 31543.9257994644467544 1146208.789432754274 +402 0.0402 31429.6093499574017187 1140120.200708152493 +403 0.0403 31315.8994737564389652 1134077.323311087443 +404 0.0404 31202.7916223578649806 1128079.704660407268 +405 0.0405 31090.2812922370321758 1122126.897756264312 +406 0.0406 30978.3640242943329213 1116218.461097696563 +407 0.0407 30867.0354033093608450 1110353.958601726685 +408 0.0408 30756.2910574030865973 1104532.959523731610 +409 0.0409 30646.1266575079389440 1098755.038379254052 +410 0.0410 30536.5379168456202024 1093019.774867100641 +411 0.0411 30427.5205904125796224 1087326.753793743672 +412 0.0412 30319.0704744729373488 1081675.564999099821 +413 0.0413 30211.1834060588116699 1076065.803283400368 +414 0.0414 30103.8552624778676545 1070497.068335452816 +415 0.0415 29997.0819608279925887 1064968.964662037324 +416 0.0416 29890.8594575189672469 1059481.101518460782 +417 0.0417 29785.1837478010238556 1054033.092840373982 +418 0.0418 29680.0508653001743369 1048624.557176602772 +419 0.0419 29575.4568815601815004 1043255.117623237660 +420 0.0420 29471.3979055910858733 1037924.401758664753 +421 0.0421 29367.8700834241608391 1032632.041579853743 +422 0.0422 29264.8695976731905830 1027377.673439529957 +423 0.0423 29162.3926671019908099 1022160.937984493678 +424 0.0424 29060.4355461980194377 1016981.480094949249 +425 0.0425 28958.9945247520336125 1011838.948824766441 +426 0.0426 28858.0659274436584383 1006732.997342770104 +427 0.0427 28757.6461134327691980 1001663.282875029370 +428 0.0428 28657.7314759566179418 996629.466647997964 +429 0.0429 28558.3184419325880299 991631.213832634850 +430 0.0430 28459.4034715664856776 986668.193489444093 +431 0.0431 28360.9830579662921082 981740.078514403896 +432 0.0432 28263.0537267612853611 976846.545585717889 +433 0.0433 28165.6120357264262566 971987.275111473980 +434 0.0434 28068.6545744119430310 967161.951178175281 +435 0.0435 27972.1779637780346093 962370.261500009452 +436 0.0436 27876.1788558345833735 957611.897369018989 +437 0.0437 27780.6539332858301350 952886.553606024245 +438 0.0438 27685.5999091799130838 948193.928512311657 +439 0.0439 27591.0135265631906805 943533.723822160042 +440 0.0440 27496.8915581392793683 938905.644656051998 +441 0.0441 27403.2308059327442606 934309.399474662379 +442 0.0442 27310.0281009573336632 929744.700033567264 +443 0.0443 27217.2803028887210530 925211.261338664917 +444 0.0444 27124.9842997416744765 920708.801602299674 +445 0.0445 27033.1370075515551434 916237.042200081632 +446 0.0446 26941.7353700601306628 911795.707628374686 +447 0.0447 26850.7763584055901447 907384.525462453137 +448 0.0448 26760.2569708167029603 903003.226315311156 +449 0.0449 26670.1742323110811412 898651.543797116727 +450 0.0450 26580.5251943974617461 894329.214475290384 +451 0.0451 26491.3069347819364339 890035.977835204685 +452 0.0452 26402.5165570781027782 885771.576241493807 +453 0.0453 26314.1511905210318218 881535.754899958265 +454 0.0454 26226.2079896850300429 877328.261820055544 +455 0.0455 26138.6841342051302490 873148.847777971299 +456 0.0456 26051.5768285022204509 868997.266280252137 +457 0.0457 25964.8833015118070762 864873.273527997080 +458 0.0458 25878.6008064163288509 860776.628381594317 +459 0.0459 25792.7266203809485887 856707.092325998936 +460 0.0460 25707.2580442928228877 852664.429436530918 +461 0.0461 25622.1924025037369574 848648.406345203868 +462 0.0462 25537.5270425761009392 844658.792207548162 +463 0.0463 25453.2593350322276819 840695.358669949695 +464 0.0464 25369.3866731068555964 836757.879837470944 +465 0.0465 25285.9064725028729299 832846.132242159569 +466 0.0466 25202.8161711501743412 828959.894811835024 +467 0.0467 25120.1132289676170330 825098.948839333141 +468 0.0468 25037.7951276280400634 821263.077952224878 +469 0.0469 24955.8593703262813506 817452.068082977086 +470 0.0470 24874.3034815501559933 813665.707439549849 +471 0.0471 24793.1250068543558882 809903.786476453766 +472 0.0472 24712.3215126372233499 806166.097866207361 +473 0.0473 24631.8905859203514410 802452.436471241061 +474 0.0474 24551.8298341309782700 798762.599316198844 +475 0.0475 24472.1368848871352384 795096.385560656316 +476 0.0476 24392.8093857854910311 791453.596472238773 +477 0.0477 24313.8450041918731586 787834.035400127992 +478 0.0478 24235.2414270344197575 784237.507748960634 +479 0.0479 24156.9963605993143574 780663.820953115355 +480 0.0480 24079.1075303290926968 777112.784451352200 +481 0.0481 24001.5726806234342803 773584.209661848377 +482 0.0482 23924.3895746424641402 770077.909957577940 +483 0.0483 23847.5559941124811303 766593.700642047217 +484 0.0484 23771.0697391341091134 763131.398925399873 +485 0.0485 23694.9286279927982832 759690.823900838965 +486 0.0486 23619.1304969716875348 756271.796521409531 +487 0.0487 23543.6732001667623990 752874.139577108435 +488 0.0488 23468.5546093042903522 749497.677672316320 +489 0.0489 23393.7726135604971205 746142.237203563447 +490 0.0490 23319.3251193834403239 742807.646337598097 +491 0.0491 23245.2100503170695447 739493.734989784891 +492 0.0492 23171.4253468274400802 736200.334802794969 +493 0.0493 23097.9689661310185329 732927.279125606758 +494 0.0494 23024.8388820250984281 729674.402992800577 +495 0.0495 22952.0330847202494624 726441.543104148353 +496 0.0496 22879.5495806748185714 723228.537804489373 +497 0.0497 22807.3863924313991447 720035.227063887054 +498 0.0498 22735.5415584553011286 716861.452458070824 +499 0.0499 22664.0131329749419820 713707.057149145519 +500 0.0500 22592.7991858241548471 710571.885866570519 +501 0.0501 22521.8978022864066588 707455.784888415248 +502 0.0502 22451.3070829408425197 704358.602022858337 +503 0.0503 22381.0251435101999959 701280.186589956167 +504 0.0504 22311.0501147105205746 698220.389403666952 +505 0.0505 22241.3801421026328171 695179.062754108803 +506 0.0506 22172.0133859454217600 692156.060390078579 +507 0.0507 22102.9480210508263553 689151.237501805183 +508 0.0508 22034.1822366405394860 686164.450703937095 +509 0.0509 21965.7142362044032780 683195.558018772514 +510 0.0510 21897.5422373604778841 680244.418859708589 +511 0.0511 21829.6644717167473573 677310.894014926860 +512 0.0512 21762.0791847344371490 674394.845631298609 +513 0.0513 21694.7846355929468700 671496.137198502198 +514 0.0514 21627.7790970563546580 668614.633533367771 +515 0.0515 21561.0608553414640483 665750.200764430803 +516 0.0516 21494.6282099874078995 662902.706316687749 +517 0.0517 21428.4794737267438904 660072.018896569032 +518 0.0518 21362.6129723580597783 657258.008477108669 +519 0.0519 21297.0270446200374863 654460.546283312258 +520 0.0520 21231.7200420669869345 651679.504777727183 +521 0.0521 21166.6903289457914070 648914.757646204205 +522 0.0522 21101.9362820742899203 646166.179783845320 +523 0.0523 21037.4562907210420235 643433.647281146143 +524 0.0524 20973.2487564864677552 640717.037410320365 +525 0.0525 20909.3120931853627553 638016.228611805825 +526 0.0526 20845.6447267307230504 635331.100480952067 +527 0.0527 20782.2450950189304422 632661.533754881937 +528 0.0528 20719.1116478162111889 630007.410299527110 +529 0.0529 20656.2428466463934456 627368.613096838235 +530 0.0530 20593.6371646799416339 624745.026232163887 +531 0.0531 20531.2930866242422780 622136.534881787142 +532 0.0532 20469.2091086151194759 619543.025300641311 +533 0.0533 20407.3837381095800083 616964.384810169926 +534 0.0534 20345.8154937797517050 614400.501786360168 +535 0.0535 20284.5029054080368951 611851.265647925436 +536 0.0536 20223.4445137834081834 609316.566844638088 +537 0.0537 20162.6388705988865695 606796.296845825505 +538 0.0538 20102.0845383501437027 604290.348129005637 +539 0.0539 20041.7800902352610137 601798.614168678876 +540 0.0540 19981.7241100555656885 599320.989425250213 +541 0.0541 19921.9151921175980533 596857.369334115996 +542 0.0542 19862.3519411361485254 594407.650294870371 +543 0.0543 19803.0329721383714059 591971.729660666431 +544 0.0544 19743.9569103689536860 589549.505727704964 +545 0.0545 19685.1223911963243154 587140.877724863472 +546 0.0546 19626.5280600199075707 584745.745803450933 +547 0.0547 19568.1725721783805056 582364.011027104105 +548 0.0548 19510.0545928589344840 579995.575361803407 +549 0.0549 19452.1727970075444318 577640.341666020569 +550 0.0550 19394.5258692401948792 575298.213680989342 +551 0.0551 19337.1125037550918933 572969.096021102509 +552 0.0552 19279.9314042458136100 570652.894164429512 +553 0.0553 19222.9812838154248311 568349.514443350490 +554 0.0554 19166.2608648914902005 566058.864035314065 +555 0.0555 19109.7688791420405323 563780.850953705958 +556 0.0556 19053.5040673924122530 561515.384038841235 +557 0.0557 18997.4651795430181664 559262.372949057724 +558 0.0558 18941.6509744879695063 557021.728151931078 +559 0.0559 18886.0602200345929305 554793.360915594618 +560 0.0560 18830.6916928238060791 552577.183300168370 +561 0.0561 18775.5441782513335056 550373.108149297070 +562 0.0562 18720.6164703897775325 548181.049081790145 +563 0.0563 18665.9073719115185668 546000.920483369497 +564 0.0564 18611.4156940124230459 543832.637498514028 +565 0.0565 18557.1402563363772060 541676.116022413713 +566 0.0566 18503.0798869006066525 539531.272693011328 +567 0.0567 18449.2334220217999246 537398.024883154896 +568 0.0568 18395.5997062429996731 535276.290692836745 +569 0.0569 18342.1775922612796421 533165.988941535237 +570 0.0570 18288.9659408561710734 531067.039160642307 +571 0.0571 18235.9636208188385353 528979.361585994717 +572 0.0572 18183.1695088820160890 526902.877150487155 +573 0.0573 18130.5824896506528603 524837.507476778352 +574 0.0574 18078.2014555333080352 522783.174870089337 +575 0.0575 18026.0253066742479859 520739.802311081847 +576 0.0576 17974.0529508862528019 518707.313448835164 +577 0.0577 17922.2833035841176752 516685.632593894145 +578 0.0578 17870.7152877188527782 514674.684711412119 +579 0.0579 17819.3478337125634425 512674.395414368541 +580 0.0580 17768.1798793939997267 510684.690956880106 +581 0.0581 17717.2103699347753718 508705.498227574455 +582 0.0582 17666.4382577862452308 506736.744743063522 +583 0.0583 17615.8625026170193451 504778.358641478291 +584 0.0584 17565.4820712511391321 502830.268676092383 +585 0.0585 17515.2959376068829442 500892.404209016124 +586 0.0586 17465.3030826361828076 498964.695204968448 +587 0.0587 17415.5024942646778072 497047.072225118638 +588 0.0588 17365.8931673323713767 495139.466421009914 +589 0.0589 17316.4741035348924925 493241.809528544953 +590 0.0590 17267.2443113653644104 491354.033862052893 +591 0.0591 17218.2028060568409273 489476.072308415314 +592 0.0592 17169.3486095253574604 487607.858321272361 +593 0.0593 17120.6807503135278239 485749.325915290276 +594 0.0594 17072.1982635347376345 483900.409660498961 +595 0.0595 17023.9001908178761369 482061.044676696009 +596 0.0596 16975.7855802526464686 480231.166627917555 +597 0.0597 16927.8534863354034314 478410.711716968566 +598 0.0598 16880.1029699155551498 476599.616680025007 +599 0.0599 16832.5330981424885977 474797.818781294394 +600 0.0600 16785.1429444130371849 473005.255807736889 +601 0.0601 16737.9315883194576600 471221.866063852911 +602 0.0602 16690.8981155979381583 469447.588366526295 +603 0.0603 16644.0416180776155670 467682.362039934378 +604 0.0604 16597.3611936300949310 465926.126910504303 +605 0.0605 16550.8559461194709002 464178.823301943892 +606 0.0606 16504.5249853528584936 462440.392030313262 +607 0.0607 16458.3674270313858869 460710.774399170303 +608 0.0608 16412.3823927016892412 458989.912194756907 +609 0.0609 16366.5690097078877443 457277.747681248002 +610 0.0610 16320.9264111440224951 455574.223596055293 +611 0.0611 16275.4537358069610491 453879.283145183872 +612 0.0612 16230.1501281497694436 452192.869998638169 +613 0.0613 16185.0147382355426089 450514.928285885311 +614 0.0614 16140.0467216916804318 448845.402591369580 +615 0.0615 16095.2452396646076522 447184.237950076000 +616 0.0616 16050.6094587749466882 445531.379843141185 +617 0.0617 16006.1385510731124668 443886.774193525605 +618 0.0618 15961.8316939953510882 442250.367361720128 +619 0.0619 15917.6880703201895813 440622.106141507335 +620 0.0620 15873.7068681253258546 439001.937755778723 +621 0.0621 15829.8872807449170068 437389.809852382925 +622 0.0622 15786.2285067272969172 435785.670500035631 +623 0.0623 15742.7297497930812824 434189.468184264319 +624 0.0624 15699.3902187936982955 432601.151803405723 +625 0.0625 15656.2091276702958567 431020.670664646081 +626 0.0626 15613.1856954130580561 429447.974480102421 +627 0.0627 15570.3191460209054640 427883.013362951111 +628 0.0628 15527.6087084615774074 426325.737823600648 +629 0.0629 15485.0536166321016935 424776.098765901639 +630 0.0630 15442.6531093196372240 423234.047483405797 +631 0.0631 15400.4064301626840461 421699.535655658576 +632 0.0632 15358.3128276126735727 420172.515344541811 +633 0.0633 15316.3715548959135049 418652.938990647905 +634 0.0634 15274.5818699758965522 417140.759409699764 +635 0.0635 15232.9430355159602186 415635.929789009911 +636 0.0636 15191.4543188423103857 414138.403683971905 +637 0.0637 15150.1149919073814090 412648.135014603729 +638 0.0638 15108.9243312535454606 411165.078062114888 +639 0.0639 15067.8816179771638417 409689.187465517316 +640 0.0640 15026.9861376929748076 408220.418218276813 +641 0.0641 14986.2371804988106305 406758.725664992118 +642 0.0642 14945.6340409406548133 405304.065498120151 +643 0.0643 14905.1760179780121689 403856.393754729652 +644 0.0644 14864.8624149496117752 402415.666813291900 +645 0.0645 14824.6925395394209772 400981.841390508635 +646 0.0646 14784.6657037429868069 399554.874538172910 +647 0.0647 14744.7812238340757176 398134.723640057782 +648 0.0648 14705.0384203316298226 396721.346408853598 +649 0.0649 14665.4366179670305428 395314.700883121230 +650 0.0650 14625.9751456516605685 393914.745424289955 +651 0.0651 14586.6533364447623171 392521.438713681302 +652 0.0652 14547.4705275216001610 391134.739749570261 +653 0.0653 14508.4260601419082377 389754.607844268496 +654 0.0654 14469.5192796186329360 388381.002621252381 +655 0.0655 14430.7495352869555063 387013.884012309252 +656 0.0656 14392.1161804736038903 385653.212254721962 +657 0.0657 14353.6185724664446752 384298.947888476076 +658 0.0658 14315.2560724843460775 382951.051753508276 +659 0.0659 14277.0280456473228696 381609.484986972413 +660 0.0660 14238.9338609469468793 380274.209020538314 +661 0.0661 14200.9728912170339754 378945.185577722965 +662 0.0662 14163.1445131045857124 377622.376671245438 +663 0.0663 14125.4481070410038228 376305.744600409584 +664 0.0664 14087.8830572135575494 374995.251948518970 +665 0.0665 14050.4487515371165500 373690.861580314697 +666 0.0666 14013.1445816261293658 372392.536639441154 +667 0.0667 13975.9699427668601857 371100.240545935696 +668 0.0668 13938.9242338898748130 369813.936993754120 +669 0.0669 13902.0068575427721953 368533.589948308829 +670 0.0670 13865.2172198631542415 367259.163644042797 +671 0.0671 13828.5547305518502981 365990.622582023731 +672 0.0672 13792.0188028463708179 364727.931527564593 +673 0.0673 13755.6088534945993160 363471.055507873418 +674 0.0674 13719.3243027287189761 362219.959809715394 +675 0.0675 13683.1645742393775436 360974.609977113025 +676 0.0676 13647.1290951500686788 359734.971809061302 +677 0.0677 13611.2172959917515982 358501.011357269890 +678 0.0678 13575.4286106776908127 357272.694923929463 +679 0.0679 13539.7624764785196021 356049.989059495798 +680 0.0680 13504.2183339975199488 354832.860560504661 +681 0.0681 13468.7956271461243887 353621.276467400079 +682 0.0682 13433.4938031196343218 352415.204062394216 +683 0.0683 13398.3123123731475062 351214.610867342097 +684 0.0684 13363.2506085976983741 350019.464641641185 +685 0.0685 13328.3081486966093507 348829.733380150166 +686 0.0686 13293.4843927620458999 347645.385311134509 +687 0.0687 13258.7788040517771151 346466.388894224947 +688 0.0688 13224.1908489661454951 345292.712818403495 +689 0.0689 13189.7199970252258936 344124.326000004075 +690 0.0690 13155.3657208461881964 342961.197580740089 +691 0.0691 13121.1274961208637251 341803.296925746836 +692 0.0692 13087.0048015934935393 340650.593621645647 +693 0.0693 13052.9971190386804665 339503.057474625297 +694 0.0694 13019.1039332395212114 338360.658508546650 +695 0.0695 12985.3247319659403729 337223.366963064473 +696 0.0696 12951.6590059531990846 336091.153291768162 +697 0.0697 12918.1062488805946487 334963.988160338718 +698 0.0698 12884.6659573503420688 333841.842444729700 +699 0.0699 12851.3376308666374825 332724.687229358940 +700 0.0700 12818.1207718149034918 331612.493805327802 +701 0.0701 12785.0148854412054789 330505.233668650500 +702 0.0702 12752.0194798318480025 329402.878518501064 +703 0.0703 12719.1340658931494545 328305.400255482935 +704 0.0704 12686.3581573313804256 327212.770979914465 +705 0.0705 12653.6912706328785134 326124.962990125292 +706 0.0706 12621.1329250443322962 325041.948780781298 +707 0.0707 12588.6826425532326539 323963.701041210501 +708 0.0708 12556.3399478684841597 322890.192653760198 +709 0.0709 12524.1043684011874575 321821.396692163660 +710 0.0710 12491.9754342455835285 320757.286419920740 +711 0.0711 12459.9526781601525727 319697.835288698901 +712 0.0712 12428.0356355488802365 318643.016936751315 +713 0.0713 12396.2238444426748174 317592.805187339021 +714 0.0714 12364.5168454809481773 316547.174047186680 +715 0.0715 12332.9141818933421746 315506.097704936634 +716 0.0716 12301.4153994816133491 314469.550529628759 +717 0.0717 12270.0200466016722203 313437.507069190266 +718 0.0718 12238.7276741457662865 312409.942048940109 +719 0.0719 12207.5378355248139997 311386.830370113719 +720 0.0720 12176.4500866508878971 310368.147108390986 +721 0.0721 12145.4639859198450722 309353.867512451601 +722 0.0722 12114.5790941940958874 308343.967002533725 +723 0.0723 12083.7949747855182068 307338.421169013716 +724 0.0724 12053.1111934385171480 306337.205770994013 +725 0.0725 12022.5273183132212580 305340.296734908479 +726 0.0726 11992.0429199688187509 304347.670153140964 +727 0.0727 11961.6575713470283517 303359.302282656019 +728 0.0728 11931.3708477557138394 302375.169543640804 +729 0.0729 11901.1823268526241009 301395.248518165201 +730 0.0730 11871.0915886292732466 300419.515948850196 +731 0.0731 11841.0982153949535132 299447.948737549828 +732 0.0732 11811.2017917608736752 298480.523944049608 +733 0.0733 11781.4019046244320634 297517.218784769299 +734 0.0734 11751.6981431536187301 296558.010631488753 +735 0.0735 11722.0900987715413066 295602.877010075259 +736 0.0736 11692.5773651410763705 294651.795599230332 +737 0.0737 11663.1595381496517803 293704.744229245291 +738 0.0738 11633.8362158941508824 292761.700880771503 +739 0.0739 11604.6069986659331335 291822.643683594069 +740 0.0740 11575.4714889359820518 290887.550915429601 +741 0.0741 11546.4292913401750411 289956.401000726619 +742 0.0742 11517.4800126646641729 289029.172509476310 +743 0.0743 11488.6232618313879357 288105.844156041974 +744 0.0744 11459.8586498836866667 287186.394797994173 +745 0.0745 11431.1857899720398564 286270.803434956819 +746 0.0746 11402.6042973399180482 285359.049207463046 +747 0.0747 11374.1137893097529741 284451.111395828077 +748 0.0748 11345.7138852690095518 283546.969419026806 +749 0.0749 11317.4042066563797562 282646.602833581273 +750 0.0750 11289.1843769480783521 281749.991332462698 +751 0.0751 11261.0540216442550445 280857.114744001592 +752 0.0752 11233.0127682555139472 279967.953030808887 +753 0.0753 11205.0602462895385543 279082.486288701766 +754 0.0754 11177.1960872378203931 278200.694745651679 +755 0.0755 11149.4199245625022741 277322.558760726301 +756 0.0756 11121.7313936833124899 276448.058823056810 +757 0.0757 11094.1301319646190677 275577.175550801679 +758 0.0758 11066.6157787025731523 274709.889690127398 +759 0.0759 11039.1879751123560709 273846.182114197989 +760 0.0760 11011.8463643155373575 272986.033822171856 +761 0.0761 10984.5905913275182684 272129.425938210567 +762 0.0762 10957.4203030450826191 271276.339710489206 +763 0.0763 10930.3351482340476650 270426.756510227977 +764 0.0764 10903.3347775170004752 269580.657830723329 +765 0.0765 10876.4188433611452638 268738.025286389282 +766 0.0766 10849.5870000662343955 267898.840611813124 +767 0.0767 10822.8389037526030734 267063.085660810408 +768 0.0768 10796.1742123492876999 266230.742405498109 +769 0.0769 10769.5925855822442827 265401.792935370351 +770 0.0770 10743.0936849626559706 264576.219456381921 +771 0.0771 10716.6771737753351772 263754.004290045472 +772 0.0772 10690.3427170672057400 262935.129872531630 +773 0.0773 10664.0899816358905809 262119.578753780690 +774 0.0774 10637.9186360183703073 261307.333596619719 +775 0.0775 10611.8283504797454952 260498.377175887232 +776 0.0776 10585.8187970020717330 259692.692377572588 +777 0.0777 10559.8896492732947081 258890.262197952077 +778 0.0778 10534.0405826762598736 258091.069742742868 +779 0.0779 10508.2712742778094253 257295.098226255010 +780 0.0780 10482.5814028179684101 256502.330970564275 +781 0.0781 10456.9706486992072314 255712.751404675510 +782 0.0782 10431.4386939757878281 254926.343063711218 +783 0.0783 10405.9852223431971652 254143.089588089788 +784 0.0784 10380.6099191276571219 253362.974722727726 +785 0.0785 10355.3124712757089583 252585.982316235197 +786 0.0786 10330.0925673438905505 251812.096320127370 +787 0.0787 10304.9498974884827476 251041.300788040884 +788 0.0788 10279.8841534553339443 250273.579874953110 +789 0.0789 10254.8950285697646905 249508.917836416396 +790 0.0790 10229.9822177265541541 248747.299027789588 +791 0.0791 10205.1454173799902492 247988.707903484115 +792 0.0792 10180.3843255340052565 247233.129016213410 +793 0.0793 10155.6986417323823844 246480.547016245691 +794 0.0794 10131.0880670490369084 245730.946650674479 +795 0.0795 10106.5523040783700708 244984.312762680463 +796 0.0796 10082.0910569256957388 244240.630290810019 +797 0.0797 10057.7040311977416422 243499.884268259804 +798 0.0798 10033.3909339932197327 242762.059822161886 +799 0.0799 10009.1514738934674824 242027.142172878695 +800 0.0800 9984.9853609531583061 241295.116633306316 +801 0.0801 9960.8923066910847410 240565.968608179770 +802 0.0802 9936.8720240810071118 239839.683593385096 +803 0.0803 9912.9242275425731350 239116.247175282217 +804 0.0804 9889.0486329323084647 238395.645030023821 +805 0.0805 9865.2449575346618076 237677.862922892906 +806 0.0806 9841.5129200531355309 236962.886707632832 +807 0.0807 9817.8522406014635635 236250.702325795399 +808 0.0808 9794.2626406948693329 235541.295806086186 +809 0.0809 9770.7438432413800911 234834.653263716609 +810 0.0810 9747.2955725332067232 234130.760899768007 +811 0.0811 9723.9175542381908599 233429.605000549869 +812 0.0812 9700.6095153913138347 232731.171936976520 +813 0.0813 9677.3711843862674868 232035.448163939989 +814 0.0814 9654.2022909670868103 231342.420219690597 +815 0.0815 9631.1025662198408099 230652.074725222541 +816 0.0816 9608.0717425643961178 229964.398383668711 +817 0.0817 9585.1095537462279026 229279.377979695273 +818 0.0818 9562.2157348282980820 228597.000378905301 +819 0.0819 9539.3900221829899237 227917.252527241770 +820 0.0820 9516.6321534841081302 227240.121450404404 +821 0.0821 9493.9418676989243977 226565.594253266376 +822 0.0822 9471.3189050802957354 225893.658119293104 +823 0.0823 9448.7630071588318970 225224.300309971994 +824 0.0824 9426.2739167351210199 224557.508164244296 +825 0.0825 9403.8513778720116534 223893.269097942102 +826 0.0826 9381.4951358869529940 223231.570603227097 +827 0.0827 9359.2049373443896911 222572.400248041027 +828 0.0828 9336.9805300482094026 221915.745675551385 +829 0.0829 9314.8216630342503777 221261.594603612320 +830 0.0830 9292.7280865628581523 220609.934824222990 +831 0.0831 9270.6995521114968142 219960.754202990589 +832 0.0832 9248.7358123674166563 219314.040678599296 +833 0.0833 9226.8366212203727628 218669.782262287103 +834 0.0834 9205.0017337553927064 218027.967037321388 +835 0.0835 9183.2309062456024549 217388.583158483088 +836 0.0836 9161.5238961451013893 216751.618851550622 +837 0.0837 9139.8804620818846161 216117.062412792817 +838 0.0838 9118.3003638508216682 215484.902208465210 +839 0.0839 9096.7833624066824996 214855.126674307598 +840 0.0840 9075.3292198572144116 214227.724315050611 +841 0.0841 9053.9376994562662730 213602.683703916991 +842 0.0842 9032.6085655969636719 212979.993482142308 +843 0.0843 9011.3415838049331796 212359.642358484416 +844 0.0844 8990.1365207315720909 211741.619108746003 +845 0.0845 8968.9931441473690938 211125.912575298978 +846 0.0846 8947.9112229352740542 210512.511666610109 +847 0.0847 8926.8905270841041784 209901.405356775096 +848 0.0848 8905.9308276820120227 209292.582685051893 +849 0.0849 8885.0318969099898823 208686.032755403488 +850 0.0850 8864.1935080354178353 208081.744736038730 +851 0.0851 8843.4154354056681768 207479.707858958485 +852 0.0852 8822.6974544417444122 206879.911419509008 +853 0.0853 8802.0393416319730022 206282.344775935286 +854 0.0854 8781.4408745257296687 205686.997348938196 +855 0.0855 8760.9018317272202694 205093.858621237276 +856 0.0856 8740.4219928893016913 204502.918137134286 +857 0.0857 8720.0011387073409423 203914.165502085903 +858 0.0858 8699.6390509131233557 203327.590382271213 +859 0.0859 8679.3355122688008123 202743.182504170691 +860 0.0860 8659.0903065608854376 202160.931654145621 +861 0.0861 8638.9032185942778597 201580.827678017813 +862 0.0862 8618.7740341863445792 201002.860480659292 +863 0.0863 8598.7025401610335393 200427.020025578298 +864 0.0864 8578.6885243430278933 199853.296334517101 +865 0.0865 8558.7317755519507045 199281.679487039713 +866 0.0866 8538.8320835965914739 198712.159620139806 +867 0.0867 8518.9892392691926943 198144.726927840617 +868 0.0868 8499.2030343397600518 197579.371660796576 +869 0.0869 8479.4732615504253772 197016.084125906491 +870 0.0870 8459.7997146098332450 196454.854685926897 +871 0.0871 8440.1821881875821418 195895.673759081605 +872 0.0872 8420.6204779086929193 195338.531818685471 +873 0.0873 8401.1143803481209034 194783.419392761483 +874 0.0874 8381.6636930252989259 194230.327063670702 +875 0.0875 8362.2682143987294694 193679.245467731991 +876 0.0876 8342.9277438606004580 193130.165294857899 +877 0.0877 8323.6420817314483429 192583.077288189699 +878 0.0878 8304.4110292548521102 192037.972243724798 +879 0.0879 8285.2343885921673063 191494.841009966796 +880 0.0880 8266.1119628172909870 190953.674487558310 +881 0.0881 8247.0435559114666830 190414.463628931087 +882 0.0882 8228.0289727581221086 189877.199437953299 +883 0.0883 8209.0680191377450683 189341.872969577496 +884 0.0884 8190.1605017227911958 188808.475329495210 +885 0.0885 8171.3062280726271638 188276.997673793288 +886 0.0886 8152.5050066285066350 187747.431208612572 +887 0.0887 8133.7566467085853219 187219.767189808306 +888 0.0888 8115.0609585029642403 186693.996922614198 +889 0.0889 8096.4177530687684339 186170.111761310778 +890 0.0890 8077.8268423252584398 185648.103108893381 +891 0.0891 8059.2880390489763158 185127.962416743714 +892 0.0892 8040.8011568689244086 184609.681184303103 +893 0.0893 8022.3660102617714074 184093.250958753604 +894 0.0894 8003.9824145470993244 183578.663334695098 +895 0.0895 7985.6501858826732132 183065.909953825903 +896 0.0896 7967.3691412597509043 182554.982504627900 +897 0.0897 7949.1390984984163879 182045.872722057800 +898 0.0898 7930.9598762429523049 181538.572387229098 +899 0.0899 7912.8312939572351752 181033.073327111400 +900 0.0900 7894.7531719201688247 180529.367414218723 +901 0.0901 7876.7253312211423690 180027.446566310100 +902 0.0902 7858.7475937555227574 179527.302746084490 +903 0.0903 7840.8197822201736926 179028.927960888715 +904 0.0904 7822.9417201090082017 178532.314262413798 +905 0.0905 7805.1132317085675822 178037.453746403917 +906 0.0906 7787.3341420936294526 177544.338552367612 +907 0.0907 7769.6042771228467245 177052.960863281187 +908 0.0908 7751.9234634344174992 176563.312905309693 +909 0.0909 7734.2915284417758812 176075.386947514722 +910 0.0910 7716.7083003293209913 175589.175301574491 +911 0.0911 7699.1736080481668978 175104.670321505400 +912 0.0912 7681.6872813119225611 174621.864403376792 +913 0.0913 7664.2491505925017918 174140.749985042377 +914 0.0914 7646.8590471159568551 173661.319545859093 +915 0.0915 7629.5168028583429987 173183.565606421791 +916 0.0916 7612.2222505416075364 172707.480728284921 +917 0.0917 7594.9752236295080365 172233.057513700798 +918 0.0918 7577.7755563235550653 171760.288605351176 +919 0.0919 7560.6230835589831258 171289.166686083772 +920 0.0920 7543.5176410007461527 170819.684478647920 +921 0.0921 7526.4590650395421108 170351.834745438595 +922 0.0922 7509.4471927878585120 169885.610288235592 +923 0.0923 7492.4818620760497652 169421.003947947203 +924 0.0924 7475.5629114484345337 168958.008604357805 +925 0.0925 7458.6901801594231074 168496.617175872991 +926 0.0926 7441.8635081696656925 168036.822619273706 +927 0.0927 7425.0827361422288959 167578.617929462198 +928 0.0928 7408.3477054387949465 167121.996139218390 +929 0.0929 7391.6582581158863832 166666.950318957213 +930 0.0930 7375.0142369211143887 166213.473576481105 +931 0.0931 7358.4154852894534997 165761.559056742291 +932 0.0932 7341.8618473395363253 165311.199941602012 +933 0.0933 7325.3531678699764598 164862.389449594601 +934 0.0934 7308.8892923557123140 164415.120835688896 +935 0.0935 7292.4700669443745937 163969.387391057884 +936 0.0936 7276.0953384526792433 163525.182442843710 +937 0.0937 7259.7649543628403990 163082.499353929918 +938 0.0938 7243.4787628190088071 162641.331522708089 +939 0.0939 7227.2366126237302524 162201.672382858407 +940 0.0940 7211.0383532344312698 161763.515403115802 +941 0.0941 7194.8838347599230474 161326.854087053012 +942 0.0942 7178.7729079569280657 160891.681972854509 +943 0.0943 7162.7054242266303845 160457.992633097689 +944 0.0944 7146.6812356112486668 160025.779674534395 +945 0.0945 7130.7001947906283021 159595.036737874500 +946 0.0946 7114.7621550788562672 159165.757497568615 +947 0.0947 7098.8669704208978146 158737.935661592899 +948 0.0948 7083.0144953892558988 158311.564971243701 +949 0.0949 7067.2045851806478822 157886.639200917707 +950 0.0950 7051.4370956127067984 157463.152157908713 +951 0.0951 7035.7118831207017138 157041.097682199004 +952 0.0952 7020.0288047542790082 156620.469646250887 +953 0.0953 7004.3877181742263929 156201.261954806396 +954 0.0954 6988.7884816492523896 155783.468544678413 +955 0.0955 6973.2309540527903664 155367.083384553320 +956 0.0956 6957.7149948598234914 154952.100474790815 +957 0.0957 6942.2404641437224200 154538.513847223803 +958 0.0958 6926.8072225731129947 154126.317564959405 +959 0.0959 6911.4151314087557694 153715.505722189409 +960 0.0960 6896.0640525004473602 153306.072443986312 +961 0.0961 6880.7538482839418066 152898.011886121705 +962 0.0962 6865.4843817778928496 152491.318234863604 +963 0.0963 6850.2555165808098536 152085.985706794221 +964 0.0964 6835.0671168680391929 151682.008548619226 +965 0.0965 6819.9190473887592816 151279.381036977196 +966 0.0966 6804.8111734629974308 150878.097478257783 +967 0.0967 6789.7433609786639863 150478.152208416286 +968 0.0968 6774.7154763886037472 150079.539592784597 +969 0.0969 6759.7273867076692113 149682.254025899922 +970 0.0970 6744.7789595098083737 149286.289931312902 +971 0.0971 6729.8700629251716236 148891.641761416977 +972 0.0972 6715.0005656372377416 148498.303997263894 +973 0.0973 6700.1703368799553573 148106.271148389613 +974 0.0974 6685.3792464349035072 147715.537752641278 +975 0.0975 6670.6271646284712915 147326.098375996109 +976 0.0976 6655.9139623290520831 146937.947612396500 +977 0.0977 6641.2395109442541070 146551.080083571404 +978 0.0978 6626.6036824181319389 146165.490438869019 +979 0.0979 6612.0063492284343738 145781.173355086794 +980 0.0980 6597.4473843838650282 145398.123536305007 +981 0.0981 6582.9266614213638604 145016.335713715409 +982 0.0982 6568.4440544034050617 144635.804645460215 +983 0.0983 6553.9994379153085902 144256.525116462901 +984 0.0984 6539.5926870625717129 143878.491938271094 +985 0.0985 6525.2236774682141913 143501.699948886322 +986 0.0986 6510.8922852701389274 143126.144012611010 +987 0.0987 6496.5983871185144380 142751.819019882183 +988 0.0988 6482.3418601731646049 142378.719887114014 +989 0.0989 6468.1225821009820720 142006.841556544416 +990 0.0990 6453.9404310733516468 141636.178996072180 +991 0.0991 6439.7952857635928012 141266.727199105080 +992 0.0992 6425.6870253444176342 140898.481184406584 +993 0.0993 6411.6155294854006570 140531.435995938198 +994 0.0994 6397.5806783504685882 140165.586702711298 +995 0.0995 6383.5823525954010620 139800.928398634016 +996 0.0996 6369.6204333653513459 139437.456202362606 +997 0.0997 6355.6948022923761528 139075.165257149987 +998 0.0998 6341.8053414929836435 138714.050730699993 +999 0.0999 6327.9519335656978001 138354.107815018622 +1000 0.1000 6314.1344615886337124 137995.331726269418 +1001 0.1001 6300.3528091170883272 137637.717704629991 +1002 0.1002 6286.6068601811493863 137281.261014143878 +1003 0.1003 6272.8964992833134602 136925.956942580524 +1004 0.1004 6259.2216113961194424 136571.800801293197 +1005 0.1005 6245.5820819598011440 136218.787925079087 +1006 0.1006 6231.9777968799453447 135866.913672036404 +1007 0.1007 6218.4086425251716719 135516.173423428292 +1008 0.1008 6204.8745057248233934 135166.562583542516 +1009 0.1009 6191.3752737666682151 134818.076579555112 +1010 0.1010 6177.9108343946209061 134470.710861396801 +1011 0.1011 6164.4810758064704714 134124.460901614395 +1012 0.1012 6151.0858866516282433 133779.322195237590 +1013 0.1013 6137.7251560288841574 133435.290259647794 +1014 0.1014 6124.3987734841794008 133092.360634442797 +1015 0.1015 6111.1066290083917920 132750.528881306003 +1016 0.1016 6097.8486130351329848 132409.790583876602 +1017 0.1017 6084.6246164385584052 132070.141347621189 +1018 0.1018 6071.4345305311926495 131731.576799701987 +1019 0.1019 6058.2782470617648869 131394.092588852101 +1020 0.1020 6045.1556582130597235 131057.684385244793 +1021 0.1021 6032.0666565997789803 130722.347880371090 +1022 0.1022 6019.0111352664143851 130388.078786912200 +1023 0.1023 6005.9889876851375448 130054.872838616997 +1024 0.1024 5993.0001077536981029 129722.725790176599 +1025 0.1025 5980.0443897933346307 129391.633417101897 +1026 0.1026 5967.1217285466991598 129061.591515602719 +1027 0.1027 5954.2320191757953580 128732.595902466914 +1028 0.1028 5941.3751572599248902 128404.642414937392 +1029 0.1029 5928.5510387936483312 128077.726910596801 +1030 0.1030 5915.7595601847560829 127751.845267247088 +1031 0.1031 5903.0006182522538438 127426.993382788802 +1032 0.1032 5890.2741102243589921 127103.167175111812 +1033 0.1033 5877.5799337365051542 126780.362581967594 +1034 0.1034 5864.9179868293631444 126458.575560866899 +1035 0.1035 5852.2881679468719085 126137.802088954413 +1036 0.1036 5839.6903759342794729 125818.038162900804 +1037 0.1037 5827.1245100361948062 125499.279798786389 +1038 0.1038 5814.5904698946560529 125181.523031993114 +1039 0.1039 5802.0881555472024047 124864.763917087388 +1040 0.1040 5789.6174674249623422 124548.998527714706 +1041 0.1041 5777.1783063507527913 124234.222956483805 +1042 0.1042 5764.7705735371855553 123920.433314864087 +1043 0.1043 5752.3941705847882986 123607.625733072215 +1044 0.1044 5740.0489994801364446 123295.796359962813 +1045 0.1045 5727.7349625939914404 122984.941362928308 +1046 0.1046 5715.4519626794553915 122675.056927784404 +1047 0.1047 5703.1999028701329735 122366.139258672702 +1048 0.1048 5690.9786866783024379 122058.184577945503 +1049 0.1049 5678.7882179931011706 121751.189126070822 +1050 0.1050 5666.6284010787212537 121445.149161525012 +1051 0.1051 5654.4991405726104858 121140.060960688803 +1052 0.1052 5642.4003414836888624 120835.920817746912 +1053 0.1053 5630.3319091905723326 120532.725044584891 +1054 0.1054 5618.2937494398083800 120230.469970690610 +1055 0.1055 5606.2857683441216068 119929.151943049612 +1056 0.1056 5594.3078723806665948 119628.767326051806 +1057 0.1057 5582.3599683892944086 119329.312501389009 +1058 0.1058 5570.4419635708272835 119030.783867952909 +1059 0.1059 5558.5537654853424101 118733.177841746510 +1060 0.1060 5546.6952820504657211 118436.490855779703 +1061 0.1061 5534.8664215396775035 118140.719359976312 +1062 0.1062 5523.0670925806252853 117845.859821076388 +1063 0.1063 5511.2972041534439995 117551.908722542983 +1064 0.1064 5499.5566655890934271 117258.862564467301 +1065 0.1065 5487.8453865676965506 116966.717863474289 +1066 0.1066 5476.1632771168915497 116675.471152631202 +1067 0.1067 5464.5102476101919819 116385.118981351203 +1068 0.1068 5452.8862087653587878 116095.657915306801 +1069 0.1069 5441.2910716427768421 115807.084536333088 +1070 0.1070 5429.7247476438433296 115519.395442341585 +1071 0.1071 5418.1871485093652154 115232.587247224903 +1072 0.1072 5406.6781863179649008 114946.656580773299 +1073 0.1073 5395.1977734844967927 114661.600088582694 +1074 0.1074 5383.7458227584693304 114377.414431962607 +1075 0.1075 5372.3222472224779267 114094.096287856810 +1076 0.1076 5360.9269602906479122 113811.642348746202 +1077 0.1077 5349.5598757070820284 113530.049322570499 +1078 0.1078 5338.2209075443215625 113249.313932638019 +1079 0.1079 5326.9099702018129392 112969.432917540515 +1080 0.1080 5315.6269784043824984 112690.403031066206 +1081 0.1081 5304.3718472007230957 112412.221042120596 +1082 0.1082 5293.1444919618852509 112134.883734637609 +1083 0.1083 5281.9448283797783006 111858.387907499986 +1084 0.1084 5270.7727724656806458 111582.730374451086 +1085 0.1085 5259.6282405487572760 111307.907964019585 +1086 0.1086 5248.5111492745845680 111033.917519430193 +1087 0.1087 5237.4214156036869099 110760.755898530711 +1088 0.1088 5226.3589568100751421 110488.419973702985 +1089 0.1089 5215.3236904798004616 110216.906631788093 +1090 0.1090 5204.3155345095110533 109946.212774005107 +1091 0.1091 5193.3344071050169077 109676.335315872304 +1092 0.1092 5182.3802267798664616 109407.271187128004 +1093 0.1093 5171.4529123539277862 109139.017331651718 +1094 0.1094 5160.5523829519761421 108871.570707386898 +1095 0.1095 5149.6785580022933573 108604.928286266397 +1096 0.1096 5138.8313572352735719 108339.087054129908 +1097 0.1097 5128.0107006820344395 108074.044010655402 +1098 0.1098 5117.2165086730383337 107809.796169275811 +1099 0.1099 5106.4487018367190103 107546.340557109594 +1100 0.1100 5095.7072010981191852 107283.674214882805 +1101 0.1101 5084.9919276775326580 107021.794196856092 +1102 0.1102 5074.3028030891528033 106760.697570749806 +1103 0.1103 5063.6397491397319754 106500.381417672907 +1104 0.1104 5053.0026879272463702 106240.842832046110 +1105 0.1105 5042.3915418395672532 105982.078921536406 +1106 0.1106 5031.8062335531412828 105724.086806975014 +1107 0.1107 5021.2466860316781094 105466.863622296194 +1108 0.1108 5010.7128225248407034 105210.406514458286 +1109 0.1109 5000.2045665669484151 104954.712643380015 +1110 0.1110 4989.7218419756864023 104699.779181863007 +1111 0.1111 4979.2645728508168759 104445.603315527114 +1112 0.1112 4968.8326835729030790 104192.182242740484 +1113 0.1113 4958.4260988020387231 103939.513174550404 +1114 0.1114 4948.0447434765801518 103687.593334613019 +1115 0.1115 4937.6885428118930577 103436.419959128893 +1116 0.1116 4927.3574222990982889 103185.990296770906 +1117 0.1117 4917.0513077038285701 102936.301608621696 +1118 0.1118 4906.7701250649924987 102687.351168105510 +1119 0.1119 4896.5138006935412704 102439.136260918312 +1120 0.1120 4886.2822611712472280 102191.654184968691 +1121 0.1121 4876.0754333494833190 101944.902250307088 +1122 0.1122 4865.8932443480152870 101698.877779061178 +1123 0.1123 4855.7356215537938624 101453.578105374007 +1124 0.1124 4845.6024926197578679 101209.000575337603 +1125 0.1125 4835.4937854636445991 100965.142546930205 +1126 0.1126 4825.4094282668002052 100722.001389951402 +1127 0.1127 4815.3493494730046223 100479.574485961697 +1128 0.1128 4805.3134777872955965 100237.859228215093 +1129 0.1129 4795.3017421748045308 99996.853021602597 +1130 0.1130 4785.3140718595950602 99756.553282587411 +1131 0.1131 4775.3503963235089032 99516.957439140897 +1132 0.1132 4765.4106453050171694 99278.062930688902 +1133 0.1133 4755.4947487980807637 99039.867208042109 +1134 0.1134 4745.6026370510116976 98802.367733341598 +1135 0.1135 4735.7342405653444075 98565.561979996710 +1136 0.1136 4725.8894900947134374 98329.447432625806 +1137 0.1137 4716.0683166437320324 98094.021586997595 +1138 0.1138 4706.2706514668834643 97859.281949972006 +1139 0.1139 4696.4964260674132674 97625.226039439091 +1140 0.1140 4686.7455721962278403 97391.851384266309 +1141 0.1141 4677.0180218508030521 97159.155524233996 +1142 0.1142 4667.3137072740919393 96927.136009984199 +1143 0.1143 4657.6325609534451360 96695.790402959698 +1144 0.1144 4647.9745156195294840 96465.116275348788 +1145 0.1145 4638.3395042452602866 96235.111210027011 +1146 0.1146 4628.7274600447335615 96005.772800503895 +1147 0.1147 4619.1383164721646608 95777.098650865504 +1148 0.1148 4609.5720072208350757 95549.086375718893 +1149 0.1149 4600.0284662220419705 95321.733600137508 +1150 0.1150 4590.5076276440549918 95095.037959606998 +1151 0.1151 4581.0094258910758072 94868.997099970205 +1152 0.1152 4571.5337956022085564 94643.608677372307 +1153 0.1153 4562.0806716504293945 94418.870358209591 +1154 0.1154 4552.6499891415651291 94194.779819073796 +1155 0.1155 4543.2416834132764052 93971.334746698805 +1156 0.1156 4533.8556900340463471 93748.532837909705 +1157 0.1157 4524.4919448021719290 93526.371799569810 +1158 0.1158 4515.1503837447671685 93304.849348526797 +1159 0.1159 4505.8309431167626826 93083.963211564595 +1160 0.1160 4496.5335593999170669 92863.711125346395 +1161 0.1161 4487.2581693018310034 92644.090836370699 +1162 0.1162 4478.0047097549668251 92425.100100912008 +1163 0.1163 4468.7731179156726284 92206.736684978401 +1164 0.1164 4459.5633311632109326 91988.998364256200 +1165 0.1165 4450.3752870987955248 91771.882924059799 +1166 0.1166 4441.2089235446283055 91555.388159287002 +1167 0.1167 4432.0641785429461379 91339.511874362899 +1168 0.1168 4422.9409903550686067 91124.251883195902 +1169 0.1169 4413.8392974604521442 90909.606009126612 +1170 0.1170 4404.7590385557514310 90695.572084881802 +1171 0.1171 4395.7001525538817077 90482.147952520798 +1172 0.1172 4386.6625785830856330 90269.331463394105 +1173 0.1173 4377.6462559860110559 90057.120478092489 +1174 0.1174 4368.6511243187860600 89845.512866399004 +1175 0.1175 4359.6771233501040115 89634.506507243088 +1176 0.1176 4350.7241930603095170 89424.099288654295 +1177 0.1177 4341.7922736404907482 89214.289107714692 +1178 0.1178 4332.8813054915790417 89005.073870514490 +1179 0.1179 4323.9912292234484994 88796.451492102293 +1180 0.1180 4315.1219856540210458 88588.419896444000 +1181 0.1181 4306.2735158083796705 88380.977016374702 +1182 0.1182 4297.4457609178834900 88174.120793552996 +1183 0.1183 4288.6386624192846284 87967.849178418706 +1184 0.1184 4279.8521619538560117 87762.160130146905 +1185 0.1185 4271.0862013665182531 87557.051616603101 +1186 0.1186 4262.3407227049729045 87352.521614298894 +1187 0.1187 4253.6156682188402556 87148.568108349602 +1188 0.1188 4244.9109803588007708 86945.189092431508 +1189 0.1189 4236.2266017757428926 86742.382568734291 +1190 0.1190 4227.5624753199099359 86540.146547921206 +1191 0.1191 4218.9185440400597145 86338.479049088404 +1192 0.1192 4210.2947511826196205 86137.378099717695 +1193 0.1193 4201.6910401908517088 85936.841735636292 +1194 0.1194 4193.1073547040214180 85736.868000975403 +1195 0.1195 4184.5436385565662931 85537.454948128812 +1196 0.1196 4175.9998357772747113 85338.600637708601 +1197 0.1197 4167.4758905884636988 85140.303138507297 +1198 0.1198 4158.9717474051658428 84942.560527454494 +1199 0.1199 4150.4873508343143840 84745.370889577287 +1200 0.1200 4142.0226456739374044 84548.732317958304 +1201 0.1201 4133.5775769123547434 84352.642913696298 +1202 0.1202 4125.1520897273767332 84157.100785867398 +1203 0.1203 4116.7461294855093001 83962.104051481088 +1204 0.1204 4108.3596417411627044 83767.650835446402 +1205 0.1205 4099.9925722358639177 83573.739270527294 +1206 0.1206 4091.6448668974721841 83380.367497306695 +1207 0.1207 4083.3164718393995827 83187.533664144299 +1208 0.1208 4075.0073333598352292 82995.235927141694 +1209 0.1209 4066.7173979409731146 82803.472450102301 +1210 0.1210 4058.4466122482435821 82612.241404492393 +1211 0.1211 4050.1949231295488971 82421.540969403402 +1212 0.1212 4041.9622776145029093 82231.369331513095 +1213 0.1213 4033.7486229136748079 82041.724685050605 +1214 0.1214 4025.5539064178342414 81852.605231756606 +1215 0.1215 4017.3780756972041672 81664.009180848007 +1216 0.1216 4009.2210785007127924 81475.934748978209 +1217 0.1217 4001.0828627552537000 81288.380160202898 +1218 0.1218 3992.9633765649464294 81101.343645944100 +1219 0.1219 3984.8625682104016050 80914.823444948503 +1220 0.1220 3976.7803861479910665 80728.817803259793 +1221 0.1221 3968.7167790091193638 80543.324974174408 +1222 0.1222 3960.6716955995002536 80358.343218212103 +1223 0.1223 3952.6450848984359254 80173.870803075697 +1224 0.1224 3944.6368960581012288 79989.906003619995 +1225 0.1225 3936.6470784028297203 79806.447101812606 +1226 0.1226 3928.6755814284038024 79623.492386703001 +1227 0.1227 3920.7223548013494110 79441.040154383809 +1228 0.1228 3912.7873483582320659 79259.088707959105 +1229 0.1229 3904.8705121049583795 79077.636357510404 +1230 0.1230 3896.9717962160798379 78896.681420060893 +1231 0.1231 3889.0911510340997665 78716.222219539501 +1232 0.1232 3881.2285270687852972 78536.257086754311 +1233 0.1233 3873.3838749964802446 78356.784359349404 +1234 0.1234 3865.5571456594238953 78177.802381780290 +1235 0.1235 3857.7482900650711599 77999.309505275305 +1236 0.1236 3849.9572593854172737 77821.304087804499 +1237 0.1237 3842.1840049563247703 77643.784494046995 +1238 0.1238 3834.4284782768545483 77466.749095357096 +1239 0.1239 3826.6906310086001213 77290.196269733497 +1240 0.1240 3818.9704149750241413 77114.124401786408 +1241 0.1241 3811.2677821607994701 76938.531882704498 +1242 0.1242 3803.5826847111529787 76763.417110225593 +1243 0.1243 3795.9150749312116204 76588.778488602504 +1244 0.1244 3788.2649052853530520 76414.614428569999 +1245 0.1245 3780.6321283965585280 76240.923347320393 +1246 0.1246 3773.0166970457694333 76067.703668463801 +1247 0.1247 3765.4185641712460892 75894.953822003095 +1248 0.1248 3757.8376828679306527 75722.672244301299 +1249 0.1249 3750.2740063868131983 75550.857378048502 +1250 0.1250 3742.7274881342991648 75379.507672236301 +1251 0.1251 3735.1980816715813489 75208.621582123989 +1252 0.1252 3727.6857407140146279 75038.197569208904 +1253 0.1253 3720.1904191304943197 74868.234101196111 +1254 0.1254 3712.7120709428359078 74698.729651972099 +1255 0.1255 3705.2506503251588583 74529.682701568803 +1256 0.1256 3697.8061116032731661 74361.091736140690 +1257 0.1257 3690.3784092540695383 74192.955247930600 +1258 0.1258 3682.9674979049109425 74025.271735243907 +1259 0.1259 3675.5733323330277926 73858.039702416398 +1260 0.1260 3668.1958674649176828 73691.257659789509 +1261 0.1261 3660.8350583757442109 73524.924123677803 +1262 0.1262 3653.4908602887430789 73359.037616342699 +1263 0.1263 3646.1632285746277375 73193.596665961901 +1264 0.1264 3638.8521187509995798 73028.599806604587 +1265 0.1265 3631.5574864817590424 72864.045578202611 +1266 0.1266 3624.2792875765230747 72699.932526517994 +1267 0.1267 3617.0174779900412432 72536.259203122609 +1268 0.1268 3609.7720138216168380 72373.024165363793 +1269 0.1269 3602.5428513145316174 72210.225976342699 +1270 0.1270 3595.3299468554705527 72047.863204882611 +1271 0.1271 3588.1332569739511200 71885.934425503990 +1272 0.1272 3580.9527383417562305 71724.438218397190 +1273 0.1273 3573.7883477723667056 71563.373169395403 +1274 0.1274 3566.6400422203996641 71402.737869948192 +1275 0.1275 3559.5077787810473637 71242.530917095093 +1276 0.1276 3552.3915146895205908 71082.750913438998 +1277 0.1277 3545.2912073204925036 70923.396467119892 +1278 0.1278 3538.2068141875470246 70764.466191788815 +1279 0.1279 3531.1382929426285955 70605.958706582285 +1280 0.1280 3524.0856013754946616 70447.872636096101 +1281 0.1281 3517.0486974131717943 70290.206610359790 +1282 0.1282 3510.0275391194131771 70132.959264810896 +1283 0.1283 3503.0220846941592754 69976.129240270093 +1284 0.1284 3496.0322924729998704 69819.715182915606 +1285 0.1285 3489.0581209266410951 69663.715744258196 +1286 0.1286 3482.0995286603724708 69508.129581115907 +1287 0.1287 3475.1564744135371257 69352.955355589685 +1288 0.1288 3468.2289170590056528 69198.191735038592 +1289 0.1289 3461.3168156026508768 69043.837392055008 +1290 0.1290 3454.4201291828262583 68889.891004440404 +1291 0.1291 3447.5388170698452086 68736.351255181100 +1292 0.1292 3440.6728386654649512 68583.216832423612 +1293 0.1293 3433.8221535023712931 68430.486429451601 +1294 0.1294 3426.9867212436656700 68278.158744660701 +1295 0.1295 3420.1665016823558290 68126.232481536194 +1296 0.1296 3413.3614547408474209 67974.706348627893 +1297 0.1297 3406.5715404704396860 67823.579059527794 +1298 0.1298 3399.7967190508211388 67672.849332846105 +1299 0.1299 3393.0369507895693459 67522.515892188007 +1300 0.1300 3386.2921961216534328 67372.577466130606 +1301 0.1301 3379.5624156089370445 67223.032788200100 +1302 0.1302 3372.8475699396844902 67073.880596848903 +1303 0.1303 3366.1476199280705259 66925.119635431998 +1304 0.1304 3359.4625265136896815 66776.748652185910 +1305 0.1305 3352.7922507610701359 66628.766400204491 +1306 0.1306 3346.1367538591889570 66481.171637417705 +1307 0.1307 3339.4959971209896139 66333.963126569201 +1308 0.1308 3332.8699419829013095 66187.139635193103 +1309 0.1309 3326.2585500043619504 66040.699935593395 +1310 0.1310 3319.6617828673411168 65894.642804821502 +1311 0.1311 3313.0796023758675801 65748.967024653510 +1312 0.1312 3306.5119704555563658 65603.671381570297 +1313 0.1313 3299.9588491531412728 65458.754666734501 +1314 0.1314 3293.4202006360060295 65314.215675969404 +1315 0.1315 3286.8959871917204509 65170.053209737707 +1316 0.1316 3280.3861712275775062 65026.266073120889 +1317 0.1317 3273.8907152701317500 64882.853075796796 +1318 0.1318 3267.4095819647409371 64739.813032019607 +1319 0.1319 3260.9427340751099109 64597.144760598705 +1320 0.1320 3254.4901344828358560 64454.847084878100 +1321 0.1321 3248.0517461869562794 64312.918832715106 +1322 0.1322 3241.6275323034974463 64171.358836460196 +1323 0.1323 3235.2174560650278181 64030.165932936798 +1324 0.1324 3228.8214808202101267 63889.338963420596 +1325 0.1325 3222.4395700333579953 63748.876773619406 +1326 0.1326 3216.0716872839943790 63608.778213652804 +1327 0.1327 3209.7177962664100050 63469.042138032593 +1328 0.1328 3203.3778607892263608 63329.667405642598 +1329 0.1329 3197.0518447749582265 63190.652879718400 +1330 0.1330 3190.7397122595807559 63051.997427828792 +1331 0.1331 3184.4414273920965570 62913.699921854903 +1332 0.1332 3178.1569544341050459 62775.759237971492 +1333 0.1333 3171.8862577593749847 62638.174256627295 +1334 0.1334 3165.6293018534174735 62500.943862525601 +1335 0.1335 3159.3860513130607615 62364.066944605205 +1336 0.1336 3153.1564708460296060 62227.542396021396 +1337 0.1337 3146.9405252705223575 62091.369114126901 +1338 0.1338 3140.7381795147935009 61955.546000452698 +1339 0.1339 3134.5493986167361982 61820.071960689696 +1340 0.1340 3128.3741477234680133 61684.945904669701 +1341 0.1341 3122.2123920909170920 61550.166746346906 +1342 0.1342 3116.0640970834106156 61415.733403779297 +1343 0.1343 3109.9292281732659831 61281.644799110392 +1344 0.1344 3103.8077509403829026 61147.899858550998 +1345 0.1345 3097.6996310718373024 61014.497512360700 +1346 0.1346 3091.6048343614779697 60881.436694829899 +1347 0.1347 3085.5233267095231895 60748.716344261891 +1348 0.1348 3079.4550741221623866 60616.335402954603 +1349 0.1349 3073.4000427111554927 60484.292817183094 +1350 0.1350 3067.3581986934373163 60352.587537181898 +1351 0.1351 3061.3295083907219123 60221.218517126690 +1352 0.1352 3055.3139382291096808 60090.184715117706 +1353 0.1353 3049.3114547386958293 59959.485093161100 +1354 0.1354 3043.3220245531801993 59829.118617152802 +1355 0.1355 3037.3456144094793672 59699.084256860297 +1356 0.1356 3031.3821911473410182 59569.380985905605 +1357 0.1357 3025.4317217089583210 59440.007781748696 +1358 0.1358 3019.4941731385874846 59310.963625669800 +1359 0.1359 3013.5695125821662259 59182.247502752798 +1360 0.1360 3007.6577072869349649 59053.858401868201 +1361 0.1361 3001.7587246010589297 58925.795315656695 +1362 0.1362 2995.8725319732507160 58798.057240511902 +1363 0.1363 2989.9990969523969397 58670.643176564699 +1364 0.1364 2984.1383871871853444 58543.552127665404 +1365 0.1365 2978.2903704257337267 58416.783101368499 +1366 0.1366 2972.4550145152193181 58290.335108916101 +1367 0.1367 2966.6322874015122579 58164.207165221102 +1368 0.1368 2960.8221571288086125 58038.398288851298 +1369 0.1369 2955.0245918392652129 57912.907502013695 +1370 0.1370 2949.2395597726376764 57787.733830538200 +1371 0.1371 2943.4670292659175175 57662.876303861296 +1372 0.1372 2937.7069687529738076 57538.333955010894 +1373 0.1373 2931.9593467641939242 57414.105820590310 +1374 0.1374 2926.2241319261261197 57290.190940762106 +1375 0.1375 2920.5012929611261825 57166.588359233392 +1376 0.1376 2914.7907986870027344 57043.297123239507 +1377 0.1377 2909.0926180166643462 56920.316283528802 +1378 0.1378 2903.4067199577707470 56797.644894347701 +1379 0.1379 2897.7330736123822135 56675.282013425007 +1380 0.1380 2892.0716481766130528 56553.226701956199 +1381 0.1381 2886.4224129402859944 56431.478024589509 +1382 0.1382 2880.7853372865861274 56310.035049409897 +1383 0.1383 2875.1603906917193854 56188.896847924392 +1384 0.1384 2869.5475427245710307 56068.062495047197 +1385 0.1385 2863.9467630463645946 55947.531069084594 +1386 0.1386 2858.3580214103244543 55827.301651720896 +1387 0.1387 2852.7812876613384105 55707.373328003006 +1388 0.1388 2847.2165317356220839 55587.745186326007 +1389 0.1389 2841.6637236603846759 55468.416318418997 +1390 0.1390 2836.1228335534970029 55349.385819329997 +1391 0.1391 2830.5938316231599856 55230.652787412400 +1392 0.1392 2825.0766881675740478 55112.216324309702 +1393 0.1393 2819.5713735746112434 54994.075534941992 +1394 0.1394 2814.0778583214896571 54876.229527491596 +1395 0.1395 2808.5961129744455320 54758.677413388505 +1396 0.1396 2803.1261081884113082 54641.418307297296 +1397 0.1397 2797.6678147066913880 54524.451327102302 +1398 0.1398 2792.2212033606415389 54407.775593893995 +1399 0.1399 2786.7862450693492065 54291.390231955607 +1400 0.1400 2781.3629108393138267 54175.294368748502 +1401 0.1401 2775.9511717641312316 54059.487134899297 +1402 0.1402 2770.5509990241771447 53943.967664186101 +1403 0.1403 2765.1623638862915868 53828.735093524301 +1404 0.1404 2759.7852377034678284 53713.788562953894 +1405 0.1405 2754.4195919145386142 53599.127215625995 +1406 0.1406 2749.0653980438678445 53484.750197788904 +1407 0.1407 2743.7226277010395279 53370.656658775406 +1408 0.1408 2738.3912525805512814 53256.845750989291 +1409 0.1409 2733.0712444615073764 53143.316629892593 +1410 0.1410 2727.7625752073131480 53030.068453991604 +1411 0.1411 2722.4652167653721335 52917.100384825098 +1412 0.1412 2717.1791411667832108 52804.411586950097 +1413 0.1413 2711.9043205260391005 52692.001227930101 +1414 0.1414 2706.6407270407266878 52579.868478321892 +1415 0.1415 2701.3883329912273439 52468.012511662098 +1416 0.1416 2696.1471107404213399 52356.432504455894 +1417 0.1417 2690.9170327333904424 52245.127636162601 +1418 0.1418 2685.6980714971232374 52134.097089184899 +1419 0.1419 2680.4901996402213626 52023.340048855105 +1420 0.1420 2675.2933898526075609 51912.855703423309 +1421 0.1421 2670.1076149052341862 51802.643244044390 +1422 0.1422 2664.9328476497935299 51692.701864766699 +1423 0.1423 2659.7690610184290563 51583.030762518792 +1424 0.1424 2654.6162280234480022 51473.629137097894 +1425 0.1425 2649.4743217570353409 51364.496191157101 +1426 0.1426 2644.3433153909677458 51255.631130194102 +1427 0.1427 2639.2231821763311927 51147.033162538602 +1428 0.1428 2634.1138954432371975 51038.701499340496 +1429 0.1429 2629.0154286005422364 50930.635354557991 +1430 0.1430 2623.9277551355671676 50822.833944945800 +1431 0.1431 2618.8508486138175613 50715.296490043103 +1432 0.1432 2613.7846826787072132 50608.022212162308 +1433 0.1433 2608.7292310512802942 50501.010336376901 +1434 0.1434 2603.6844675299357732 50394.260090510099 +1435 0.1435 2598.6503659901541141 50287.770705122894 +1436 0.1436 2593.6269003842226084 50181.541413503401 +1437 0.1437 2588.6140447409648004 50075.571451654396 +1438 0.1438 2583.6117731654680938 49969.860058282502 +1439 0.1439 2578.6200598388145409 49864.406474787000 +1440 0.1440 2573.6388790178129966 49759.209945248098 +1441 0.1441 2568.6682050347299082 49654.269716415802 +1442 0.1442 2563.7080122970241973 49549.585037698998 +1443 0.1443 2558.7582752870816876 49445.155161154195 +1444 0.1444 2553.8189685619504417 49340.979341474194 +1445 0.1445 2548.8900667530779174 49237.056835978001 +1446 0.1446 2543.9715445660490332 49133.386904598105 +1447 0.1447 2539.0633767803255978 49029.968809871891 +1448 0.1448 2534.1655382489857402 48926.801816928491 +1449 0.1449 2529.2780038984651583 48823.885193480004 +1450 0.1450 2524.4007487283006412 48721.218209809107 +1451 0.1451 2519.5337478108722280 48618.800138759601 +1452 0.1452 2514.6769762911480939 48516.630255724594 +1453 0.1453 2509.8304093864298920 48414.707838637303 +1454 0.1454 2504.9940223860999140 48313.032167959100 +1455 0.1455 2500.1677906513682501 48211.602526670409 +1456 0.1456 2495.3516896150217690 48110.418200258704 +1457 0.1457 2490.5456947811735517 48009.478476709701 +1458 0.1458 2485.7497817250132357 47908.782646495907 +1459 0.1459 2480.9639260925600865 47808.330002566800 +1460 0.1460 2476.1881036004147063 47708.119840338302 +1461 0.1461 2471.4222900355134698 47608.151457683205 +1462 0.1462 2466.6664612548834157 47508.424154920402 +1463 0.1463 2461.9205931853971379 47408.937234804791 +1464 0.1464 2457.1846618235308597 47309.690002517804 +1465 0.1465 2452.4586432351220537 47210.681765656802 +1466 0.1466 2447.7425135551279709 47111.911834225502 +1467 0.1467 2443.0362489873855338 47013.379520623908 +1468 0.1468 2438.3398258043725946 46915.084139638595 +1469 0.1469 2433.6532203469691922 46817.025008432705 +1470 0.1470 2428.9764090242206294 46719.201446536201 +1471 0.1471 2424.3093683131019134 46621.612775836591 +1472 0.1472 2419.6520747582817421 46524.258320568500 +1473 0.1473 2415.0045049718878545 46427.137407304705 +1474 0.1474 2410.3666356332751093 46330.249364946299 +1475 0.1475 2405.7384434887921998 46233.593524713200 +1476 0.1476 2401.1199053515497326 46137.169220134507 +1477 0.1477 2396.5109981011910349 46040.975787039497 +1478 0.1478 2391.9116986836615979 45945.012563547498 +1479 0.1479 2387.3219841109812478 45849.278890059402 +1480 0.1480 2382.7418314610158632 45753.774109247795 +1481 0.1481 2378.1712178772509105 45658.497566047794 +1482 0.1482 2373.6101205685663444 45563.448607647799 +1483 0.1483 2369.0585168090101433 45468.626583480698 +1484 0.1484 2364.5163839375754833 45374.030845214103 +1485 0.1485 2359.9836993579779119 45279.660746741793 +1486 0.1486 2355.4604405384320671 45185.515644174200 +1487 0.1487 2350.9465850114320347 45091.594895830203 +1488 0.1488 2346.4421103735289762 44997.897862227197 +1489 0.1489 2341.9469942851137603 44904.423906072596 +1490 0.1490 2337.4612144701973193 44811.172392255205 +1491 0.1491 2332.9847487161928257 44718.142687836298 +1492 0.1492 2328.5175748736987771 44625.334162040192 +1493 0.1493 2324.0596708562843560 44532.746186246397 +1494 0.1494 2319.6110146402729697 44440.378133980397 +1495 0.1495 2315.1715842645285193 44348.229380905206 +1496 0.1496 2310.7413578302425776 44256.299304812295 +1497 0.1497 2306.3203135007211131 44164.587285613699 +1498 0.1498 2301.9084295011739414 44073.092705332994 +1499 0.1499 2297.5056841185023586 43981.814948096697 +1500 0.1500 2293.1120557010913217 43890.753400126399 +1501 0.1501 2288.7275226585984456 43799.907449729493 +1502 0.1502 2284.3520634617475480 43709.276487291609 +1503 0.1503 2279.9856566421194657 43618.859905267505 +1504 0.1504 2275.6282807919474180 43528.657098173499 +1505 0.1505 2271.2799145639096423 43438.667462578800 +1506 0.1506 2266.9405366709256668 43348.890397097093 +1507 0.1507 2262.6101258859516747 43259.325302378405 +1508 0.1508 2258.2886610417776865 43169.971581101796 +1509 0.1509 2253.9761210308242880 43080.828637965998 +1510 0.1510 2249.6724848049420871 42991.895879681892 +1511 0.1511 2245.3777313752098053 42903.172714964603 +1512 0.1512 2241.0918398117350989 42814.658554525304 +1513 0.1513 2236.8147892434558344 42726.352811063407 +1514 0.1514 2232.5465588579395444 42638.254899258303 +1515 0.1515 2228.2871279011883416 42550.364235761808 +1516 0.1516 2224.0364756774406487 42462.680239190100 +1517 0.1517 2219.7945815489752022 42375.202330116095 +1518 0.1518 2215.5614249359164205 42287.929931061299 +1519 0.1519 2211.3369853160388629 42200.862466488601 +1520 0.1520 2207.1212422245748712 42113.999362793998 +1521 0.1521 2202.9141752540203925 42027.340048299098 +1522 0.1522 2198.7157640539430759 41940.883953243996 +1523 0.1523 2194.5259883307917335 41854.630509778603 +1524 0.1524 2190.3448278477048916 41768.579151956197 +1525 0.1525 2186.1722624243207065 41682.729315724995 +1526 0.1526 2182.0082719365882440 41597.080438921403 +1527 0.1527 2177.8528363165792143 41511.631961261701 +1528 0.1528 2173.7059355522992519 41426.383324335504 +1529 0.1529 2169.5675496875023782 41341.333971597502 +1530 0.1530 2165.4376588215045558 41256.483348360896 +1531 0.1531 2161.3162431089972415 41171.830901789595 +1532 0.1532 2157.2032827598632139 41087.376080890899 +1533 0.1533 2153.0987580389933100 41003.118336508400 +1534 0.1534 2149.0026492661022530 40919.057121314596 +1535 0.1535 2144.9149368155462980 40835.191889804002 +1536 0.1536 2140.8356011161417882 40751.522098285495 +1537 0.1537 2136.7646226509837106 40668.047204875700 +1538 0.1538 2132.7019819572651613 40584.766669491495 +1539 0.1539 2128.6476596260986298 40501.679953842999 +1540 0.1540 2124.6016363023350095 40418.786521426700 +1541 0.1541 2120.5638926843876106 40336.085837518593 +1542 0.1542 2116.5344095240534443 40253.577369166596 +1543 0.1543 2112.5131676263358713 40171.260585184202 +1544 0.1544 2108.5001478492695242 40089.134956143302 +1545 0.1545 2104.4953311037438652 40007.199954367505 +1546 0.1546 2100.4986983533294733 39925.455053924699 +1547 0.1547 2096.5102306141020563 39843.899730621299 +1548 0.1548 2092.5299089544714661 39762.533461994397 +1549 0.1549 2088.5577144950066213 39681.355727305694 +1550 0.1550 2084.5936284082645216 39600.366007534205 +1551 0.1551 2080.6376319186192632 39519.563785370396 +1552 0.1552 2076.6897063020901442 39438.948545208499 +1553 0.1553 2072.7498328861724985 39358.519773140702 +1554 0.1554 2068.8179930496680754 39278.276956950402 +1555 0.1555 2064.8941682225154182 39198.219586104802 +1556 0.1556 2060.9783398856225176 39118.347151749796 +1557 0.1557 2057.0704895706999196 39038.659146702194 +1558 0.1558 2053.1705988600924684 38959.155065443905 +1559 0.1559 2049.2786493866146884 38879.834404115500 +1560 0.1560 2045.3946228333836643 38800.696660508998 +1561 0.1561 2041.5185009336551047 38721.741334062797 +1562 0.1562 2037.6502654706591784 38642.967925854100 +1563 0.1563 2033.7898982774368051 38564.375938593003 +1564 0.1564 2029.9373812366764014 38485.964876616505 +1565 0.1565 2026.0926962805515359 38407.734245882006 +1566 0.1566 2022.2558253905594938 38329.683553960407 +1567 0.1567 2018.4267505973598418 38251.812310031193 +1568 0.1568 2014.6054539806145840 38174.120024874908 +1569 0.1569 2010.7919176688274092 38096.606210867802 +1570 0.1570 2006.9861238391852112 38019.270381975599 +1571 0.1571 2003.1880547173991545 37942.112053746896 +1572 0.1572 1999.3976925775464224 37865.130743307804 +1573 0.1573 1995.6150197419133292 37788.325969355297 +1574 0.1574 1991.8400185808379774 37711.697252151200 +1575 0.1575 1988.0726715125545070 37635.244113516601 +1576 0.1576 1984.3129610030373442 37558.966076825702 +1577 0.1577 1980.5608695658461329 37482.862666999303 +1578 0.1578 1976.8163797619711204 37406.933410500096 +1579 0.1579 1973.0794741996799075 37331.177835325201 +1580 0.1580 1969.3501355343635169 37255.595471001499 +1581 0.1581 1965.6283464683845068 37180.185848579698 +1582 0.1582 1961.9140897509241768 37104.948500627601 +1583 0.1583 1958.2073481778315909 37029.882961225303 +1584 0.1584 1954.5081045914723745 36954.988765958697 +1585 0.1585 1950.8163418805786478 36880.265451914398 +1586 0.1586 1947.1320429800991860 36805.712557673498 +1587 0.1587 1943.4551908710502630 36731.329623305995 +1588 0.1588 1939.7857685803667209 36657.116190365203 +1589 0.1589 1936.1237591807544050 36583.071801882201 +1590 0.1590 1932.4691457905423704 36509.196002359706 +1591 0.1591 1928.8219115735359992 36435.488337767194 +1592 0.1592 1925.1820397388707988 36361.948355535096 +1593 0.1593 1921.5495135408666556 36288.575604548605 +1594 0.1594 1917.9243162788820882 36215.369635143201 +1595 0.1595 1914.3064312971700929 36142.329999098300 +1596 0.1596 1910.6958419847335335 36069.456249632298 +1597 0.1597 1907.0925317751821240 35996.747941396898 +1598 0.1598 1903.4964841465887275 35924.204630471606 +1599 0.1599 1899.9076826213472486 35851.825874358605 +1600 0.1600 1896.3261107660305242 35779.611231977200 +1601 0.1601 1892.7517521912486700 35707.560263658299 +1602 0.1602 1889.1845905515087907 35635.672531139397 +1603 0.1603 1885.6246095450737812 35563.947597559105 +1604 0.1604 1882.0717929138231739 35492.385027451804 +1605 0.1605 1878.5261244431135310 35420.984386742697 +1606 0.1606 1874.9875879616392922 35349.745242742007 +1607 0.1607 1871.4561673412952132 35278.667164140301 +1608 0.1608 1867.9318464970381228 35207.749721003202 +1609 0.1609 1864.4146093867495892 35136.992484765702 +1610 0.1610 1860.9044400110999504 35066.395028227700 +1611 0.1611 1857.4013224134112079 34995.956925548497 +1612 0.1612 1853.9052406795217394 34925.677752241900 +1613 0.1613 1850.4161789376510114 34855.557085170905 +1614 0.1614 1846.9341213582654291 34785.594502542699 +1615 0.1615 1843.4590521539430483 34715.789583903897 +1616 0.1616 1839.9909555792410174 34646.141910134902 +1617 0.1617 1836.5298159305618810 34576.651063445795 +1618 0.1618 1833.0756175460210216 34507.316627370703 +1619 0.1619 1829.6283448053143275 34438.138186762801 +1620 0.1620 1826.1879821295867714 34369.115327789899 +1621 0.1621 1822.7545139813007609 34300.247637929104 +1622 0.1622 1819.3279248641063077 34231.534705962098 +1623 0.1623 1815.9081993227096063 34162.976121970205 +1624 0.1624 1812.4953219427445674 34094.571477329693 +1625 0.1625 1809.0892773506427602 34026.320364706800 +1626 0.1626 1805.6900502135047191 33958.222378053004 +1627 0.1627 1802.2976252389721594 33890.277112600001 +1628 0.1628 1798.9119871750992843 33822.484164855501 +1629 0.1629 1795.5331208102265919 33754.843132597802 +1630 0.1630 1792.1610109728530915 33687.353614871608 +1631 0.1631 1788.7956425315103388 33620.015211983198 +1632 0.1632 1785.4370003946364704 33552.827525495595 +1633 0.1633 1782.0850695104504666 33485.790158223797 +1634 0.1634 1778.7398348668277777 33418.902714230600 +1635 0.1635 1775.4012814911752685 33352.164798821599 +1636 0.1636 1772.0693944503070725 33285.576018540596 +1637 0.1637 1768.7441588503218100 33219.135981165397 +1638 0.1638 1765.4255598364784419 33152.844295702700 +1639 0.1639 1762.1135825930741703 33086.700572383808 +1640 0.1640 1758.8082123433218840 33020.704422660499 +1641 0.1641 1755.5094343492289681 32954.855459199694 +1642 0.1642 1752.2172339114749775 32889.153295879696 +1643 0.1643 1748.9315963692918103 32823.597547785401 +1644 0.1644 1745.6525071003422909 32758.187831203802 +1645 0.1645 1742.3799515206010255 32692.923763620001 +1646 0.1646 1739.1139150842343497 32627.804963711900 +1647 0.1647 1735.8543832834814111 32562.831051346999 +1648 0.1648 1732.6013416485352536 32498.001647577101 +1649 0.1649 1729.3547757474245827 32433.316374634396 +1650 0.1650 1726.1146711858964409 32368.774855926597 +1651 0.1651 1722.8810136072984278 32304.376716033799 +1652 0.1652 1719.6537886924616032 32240.121580702598 +1653 0.1653 1716.4329821595842986 32176.009076843300 +1654 0.1654 1713.2185797641159297 32112.038832524497 +1655 0.1655 1710.0105672986412628 32048.210476969802 +1656 0.1656 1706.8089305927651367 31984.523640552699 +1657 0.1657 1703.6136555129978660 31920.977954793001 +1658 0.1658 1700.4247279626406453 31857.573052352400 +1659 0.1659 1697.2421338816714069 31794.308567030504 +1660 0.1660 1694.0658592466318169 31731.184133760100 +1661 0.1661 1690.8958900705135875 31668.199388604102 +1662 0.1662 1687.7322124026459278 31605.353968750296 +1663 0.1663 1684.5748123285829934 31542.647512507803 +1664 0.1664 1681.4236759699924733 31480.079659302701 +1665 0.1665 1678.2787894845434948 31417.650049674801 +1666 0.1666 1675.1401390657961201 31355.358325272500 +1667 0.1667 1672.0077109430899327 31293.204128849196 +1668 0.1668 1668.8814913814344436 31231.187104259399 +1669 0.1669 1665.7614666813988151 31169.306896454800 +1670 0.1670 1662.6476231790020393 31107.563151480001 +1671 0.1671 1659.5399472456047079 31045.955516468297 +1672 0.1672 1656.4384252877994186 30984.483639638802 +1673 0.1673 1653.3430437473029997 30923.147170291399 +1674 0.1674 1650.2537891008482802 30861.945758803300 +1675 0.1675 1647.1706478600767696 30800.879056624999 +1676 0.1676 1644.0936065714315646 30739.946716276900 +1677 0.1677 1641.0226518160504838 30679.148391344497 +1678 0.1678 1637.9577702096594294 30618.483736475398 +1679 0.1679 1634.8989484024668855 30557.952407375196 +1680 0.1680 1631.8461730790579622 30497.554060803403 +1681 0.1681 1628.7994309582893493 30437.288354570002 +1682 0.1682 1625.7587087931842689 30377.154947531599 +1683 0.1683 1622.7239933708283388 30317.153499587301 +1684 0.1684 1619.6952715122652080 30257.283671675603 +1685 0.1685 1616.6725300723928740 30197.545125770095 +1686 0.1686 1613.6557559398604553 30137.937524876001 +1687 0.1687 1610.6449360369654187 30078.460533026202 +1688 0.1688 1607.6400573195501238 30019.113815278000 +1689 0.1689 1604.6411067769008696 29959.897037709099 +1690 0.1690 1601.6480714316446665 29900.809867414202 +1691 0.1691 1598.6609383396489648 29841.851972500801 +1692 0.1692 1595.6796945899195634 29783.023022086298 +1693 0.1693 1592.7043273045005662 29724.322686293901 +1694 0.1694 1589.7348236383734275 29665.750636249300 +1695 0.1695 1586.7711707793571350 29607.306544076600 +1696 0.1696 1583.8133559480086205 29548.990082895398 +1697 0.1697 1580.8613663975229429 29490.800926817097 +1698 0.1698 1577.9151894136350620 29432.738750940698 +1699 0.1699 1574.9748123145204772 29374.803231350001 +1700 0.1700 1572.0402224506974562 29316.994045109997 +1701 0.1701 1569.1114072049288097 29259.310870262900 +1702 0.1702 1566.1883539921243482 29201.753385825305 +1703 0.1703 1563.2710502592437933 29144.321271784498 +1704 0.1704 1560.3594834851999167 29087.014209094501 +1705 0.1705 1557.4536411807614513 29029.831879673202 +1706 0.1706 1554.5535108884578221 28972.773966399000 +1707 0.1707 1551.6590801824825121 28915.840153107099 +1708 0.1708 1548.7703366685977926 28859.030124585697 +1709 0.1709 1545.8872679840399087 28802.343566573800 +1710 0.1710 1543.0098617974233548 28745.780165756700 +1711 0.1711 1540.1381058086474241 28689.339609763301 +1712 0.1712 1537.2719877488011662 28633.021587162100 +1713 0.1713 1534.4114953800701642 28576.825787458703 +1714 0.1714 1531.5566164956426292 28520.751901092004 +1715 0.1715 1528.7073389196164044 28464.799619431000 +1716 0.1716 1525.8636505069061968 28408.968634771401 +1717 0.1717 1523.0255391431510361 28353.258640332395 +1718 0.1718 1520.1929927446217334 28297.669330253502 +1719 0.1719 1517.3659992581294773 28242.200399591104 +1720 0.1720 1514.5445466609342020 28186.851544315803 +1721 0.1721 1511.7286229606529560 28131.622461308103 +1722 0.1722 1508.9182161951696344 28076.512848356495 +1723 0.1723 1506.1133144325442572 28021.522404153104 +1724 0.1724 1503.3139057709220197 27966.650828291400 +1725 0.1725 1500.5199783384443890 27911.897821262399 +1726 0.1726 1497.7315202931586100 27857.263084451803 +1727 0.1727 1494.9485198229292564 27802.746320136903 +1728 0.1728 1492.1709651453481911 27748.347231483498 +1729 0.1729 1489.3988445076467997 27694.065522542100 +1730 0.1730 1486.6321461866073150 27639.900898246098 +1731 0.1731 1483.8708584884745960 27585.853064407402 +1732 0.1732 1481.1149697488685888 27531.921727714100 +1733 0.1733 1478.3644683326965605 27478.106595727299 +1734 0.1734 1475.6193426340662427 27424.407376877600 +1735 0.1735 1472.8795810761992016 27370.823780462699 +1736 0.1736 1470.1451721113437543 27317.355516644002 +1737 0.1737 1467.4161042206892489 27264.002296443901 +1738 0.1738 1464.6923659142798897 27210.763831742202 +1739 0.1739 1461.9739457309290174 27157.639835273498 +1740 0.1740 1459.2608322381340713 27104.630020624401 +1741 0.1741 1456.5530140319913244 27051.734102230199 +1742 0.1742 1453.8504797371113000 26998.951795372002 +1743 0.1743 1451.1532180065339617 26946.282816173902 +1744 0.1744 1448.4612175216452670 26893.726881600101 +1745 0.1745 1445.7744669920925844 26841.283709451502 +1746 0.1746 1443.0929551557019295 26788.953018363500 +1747 0.1747 1440.4166707783936090 26736.734527802400 +1748 0.1748 1437.7456026541003666 26684.627958063204 +1749 0.1749 1435.0797396046839367 26632.633030266301 +1750 0.1750 1432.4190704798529623 26580.749466354599 +1751 0.1751 1429.7635841570806861 26528.976989090599 +1752 0.1752 1427.1132695415233229 26477.315322054495 +1753 0.1753 1424.4681155659386604 26425.764189639602 +1754 0.1754 1421.8281111906042042 26374.323317051203 +1755 0.1755 1419.1932454032364603 26322.992430302602 +1756 0.1756 1416.5635072189106722 26271.771256213200 +1757 0.1757 1413.9388856799796486 26220.659522404996 +1758 0.1758 1411.3193698559944096 26169.656957300198 +1759 0.1759 1408.7049488436234697 26118.763290118499 +1760 0.1760 1406.0956117665739384 26067.978250874003 +1761 0.1761 1403.4913477755114855 26017.301570372802 +1762 0.1762 1400.8921460479823509 25966.732980210105 +1763 0.1763 1398.2979957883335373 25916.272212767399 +1764 0.1764 1395.7088862276345935 25865.919001210401 +1765 0.1765 1393.1248066235998522 25815.673079485001 +1766 0.1766 1390.5457462605097589 25765.534182316202 +1767 0.1767 1387.9716944491337927 25715.502045204299 +1768 0.1768 1385.4026405266524762 25665.576404422503 +1769 0.1769 1382.8385738565805241 25615.756997014698 +1770 0.1770 1380.2794838286902177 25566.043560792103 +1771 0.1771 1377.7253598589340982 25516.435834331300 +1772 0.1772 1375.1761913893690235 25466.933556971097 +1773 0.1773 1372.6319678880799984 25417.536468810198 +1774 0.1774 1370.0926788491042316 25368.244310704598 +1775 0.1775 1367.5583137923556478 25319.056824265004 +1776 0.1776 1365.0288622635496267 25269.973751853802 +1777 0.1777 1362.5043138341277427 25220.994836583202 +1778 0.1778 1359.9846581011829585 25172.119822312303 +1779 0.1779 1357.4698846873850471 25123.348453644503 +1780 0.1780 1354.9599832409064675 25074.680475924997 +1781 0.1781 1352.4549434353482411 25026.115635238501 +1782 0.1782 1349.9547549696660553 24977.653678406103 +1783 0.1783 1347.4594075680965943 24929.294352983597 +1784 0.1784 1344.9688909800845522 24881.037407258304 +1785 0.1785 1342.4831949802091913 24832.882590246900 +1786 0.1786 1340.0023093681122646 24784.829651692802 +1787 0.1787 1337.5262239684243468 24736.878342063803 +1788 0.1788 1335.0549286306936665 24689.028412549702 +1789 0.1789 1332.5884132293131188 24641.279615059200 +1790 0.1790 1330.1266676634493251 24593.631702218700 +1791 0.1791 1327.6696818569698735 24546.084427368598 +1792 0.1792 1325.2174457583732874 24498.637544561698 +1793 0.1793 1322.7699493407171758 24451.290808560301 +1794 0.1794 1320.3271826015475199 24404.043974833996 +1795 0.1795 1317.8891355628279598 24356.896799557500 +1796 0.1796 1315.4557982708697637 24309.849039607998 +1797 0.1797 1313.0271607962613416 24262.900452562699 +1798 0.1798 1310.6032132337984422 24216.050796696596 +1799 0.1799 1308.1839457024145759 24169.299830980101 +1800 0.1800 1305.7693483451116663 24122.647315076800 +1801 0.1801 1303.3594113288907010 24076.093009340901 +1802 0.1802 1300.9541248446828376 24029.636674815105 +1803 0.1803 1298.5534791072807366 23983.278073228204 +1804 0.1804 1296.1574643552696671 23937.016966992600 +1805 0.1805 1293.7660708509599772 23890.853119202202 +1806 0.1806 1291.3792888803184269 23844.786293630397 +1807 0.1807 1288.9971087529006581 23798.816254726902 +1808 0.1808 1286.6195208017834375 23752.942767616598 +1809 0.1809 1284.2465153834978082 23707.165598096301 +1810 0.1810 1281.8780828779613330 23661.484512633204 +1811 0.1811 1279.5142136884114734 23615.899278362100 +1812 0.1812 1277.1548982413391968 23570.409663083599 +1813 0.1813 1274.8001269864219012 23525.015435261499 +1814 0.1814 1272.4498903964577039 23479.716364020802 +1815 0.1815 1270.1041789672992763 23434.512219145603 +1816 0.1816 1267.7629832177881326 23389.402771076198 +1817 0.1817 1265.4262936896889187 23344.387790908004 +1818 0.1818 1263.0941009476241561 23299.467050388499 +1819 0.1819 1260.7663955790089858 23254.640321915202 +1820 0.1820 1258.4431681939865939 23209.907378533902 +1821 0.1821 1256.1244094253631829 23165.267993935995 +1822 0.1822 1253.8101099285436248 23120.721942456505 +1823 0.1823 1251.5002603814671147 23076.268999072199 +1824 0.1824 1249.1948514845435056 23031.908939398902 +1825 0.1825 1246.8938739605889623 22987.641539689801 +1826 0.1826 1244.5973185547627509 22943.466576833398 +1827 0.1827 1242.3051760345035746 22899.383828351100 +1828 0.1828 1240.0174371894663636 22855.393072394800 +1829 0.1829 1237.7340928314592929 22811.494087745898 +1830 0.1830 1235.4551337943814815 22767.686653812099 +1831 0.1831 1233.1805509341595553 22723.970550625701 +1832 0.1832 1230.9103351286862562 22680.345558841596 +1833 0.1833 1228.6444772777574599 22636.811459735403 +1834 0.1834 1226.3829683030105571 22593.368035200700 +1835 0.1835 1224.1257991478630629 22550.015067748096 +1836 0.1836 1221.8729607774505439 22506.752340501796 +1837 0.1837 1219.6244441785654544 22463.579637198902 +1838 0.1838 1217.3802403595962005 22420.496742186504 +1839 0.1839 1215.1403403504659764 22377.503440420001 +1840 0.1840 1212.9047352025718283 22334.599517461098 +1841 0.1841 1210.6734159887250826 22291.784759475704 +1842 0.1842 1208.4463738030897275 22249.058953231903 +1843 0.1843 1206.2235997611232960 22206.421886098200 +1844 0.1844 1204.0050849995163844 22163.873346041000 +1845 0.1845 1201.7908206761330803 22121.413121623700 +1846 0.1846 1199.5807979699516181 22079.041002003298 +1847 0.1847 1197.3750080810050349 22036.756776929600 +1848 0.1848 1195.1734422303213705 21994.560236742800 +1849 0.1849 1192.9760916598656877 21952.451172371500 +1850 0.1850 1190.7829476324805000 21910.429375330696 +1851 0.1851 1188.5940014318280191 21868.494637720403 +1852 0.1852 1186.4092443623308100 21826.646752222900 +1853 0.1853 1184.2286677491144928 21784.885512101602 +1854 0.1854 1182.0522629379495356 21743.210711198597 +1855 0.1855 1179.8800212951930462 21701.622143933102 +1856 0.1856 1177.7119342077314741 21660.119605299300 +1857 0.1857 1175.5479930829233126 21618.702890864603 +1858 0.1858 1173.3881893485418004 21577.371796767697 +1859 0.1859 1171.2325144527176235 21536.126119716802 +1860 0.1860 1169.0809598638822990 21494.965656987799 +1861 0.1861 1166.9335170707117868 21453.890206422100 +1862 0.1862 1164.7901775820694183 21412.899566425102 +1863 0.1863 1162.6509329269499631 21371.993535964302 +1864 0.1864 1160.5157746544234669 21331.171914567396 +1865 0.1865 1158.3846943335790911 21290.434502320400 +1866 0.1866 1156.2576835534698603 21249.781099865802 +1867 0.1867 1154.1347339230565012 21209.211508401102 +1868 0.1868 1152.0158370711526459 21168.725529676300 +1869 0.1869 1149.9009846463691247 21128.322965992800 +1870 0.1870 1147.7901683170593969 21088.003620201704 +1871 0.1871 1145.6833797712642991 21047.767295700898 +1872 0.1872 1143.5806107166574748 21007.613796434500 +1873 0.1873 1141.4818528804912603 20967.542926890495 +1874 0.1874 1139.3870980095416598 20927.554492099302 +1875 0.1875 1137.2963378700551402 20887.648297631597 +1876 0.1876 1135.2095642476938337 20847.824149596505 +1877 0.1877 1133.1267689474818781 20808.081854640699 +1878 0.1878 1131.0479437937526654 20768.421219945700 +1879 0.1879 1128.9730806300940458 20728.842053226497 +1880 0.1880 1126.9021713192962579 20689.344162730100 +1881 0.1881 1124.8352077432980423 20649.927357233300 +1882 0.1882 1122.7721818031343446 20610.591446041100 +1883 0.1883 1120.7130854188831108 20571.336238985601 +1884 0.1884 1118.6579105296127636 20532.161546423300 +1885 0.1885 1116.6066490933299065 20493.067179234098 +1886 0.1886 1114.5592930869272550 20454.052948819699 +1887 0.1887 1112.5158345061311138 20415.118667101000 +1888 0.1888 1110.4762653654502174 20376.264146517700 +1889 0.1889 1108.4405776981229792 20337.489200025604 +1890 0.1890 1106.4087635560670151 20298.793641095399 +1891 0.1891 1104.3808150098266196 20260.177283711200 +1892 0.1892 1102.3567241485227441 20221.639942368001 +1893 0.1893 1100.3364830798007006 20183.181432071600 +1894 0.1894 1098.3200839297803668 20144.801568335199 +1895 0.1895 1096.3075188430045728 20106.500167178798 +1896 0.1896 1094.2987799823893056 20068.277045127801 +1897 0.1897 1092.2938595291723232 20030.132019210301 +1898 0.1898 1090.2927496828640415 19992.064906956504 +1899 0.1899 1088.2954426611963754 19954.075526396598 +1900 0.1900 1086.3019307000736262 19916.163696059597 +1901 0.1901 1084.3122060535220044 19878.329234970795 +1902 0.1902 1082.3262609936409717 19840.571962651396 +1903 0.1903 1080.3440878105525371 19802.891699115997 +1904 0.1904 1078.3656788123530532 19765.288264871597 +1905 0.1905 1076.3910263250636490 19727.761480915502 +1906 0.1906 1074.4201226925811170 19690.311168734301 +1907 0.1907 1072.4529602766292555 19652.937150301805 +1908 0.1908 1070.4895314567102105 19615.639248077703 +1909 0.1909 1068.5298286300560449 19578.417285006202 +1910 0.1910 1066.5738442115800808 19541.271084514501 +1911 0.1911 1064.6215706338289237 19504.200470510299 +1912 0.1912 1062.6730003469342591 19467.205267381800 +1913 0.1913 1060.7281258185653314 19430.285299994903 +1914 0.1914 1058.7869395338809682 19393.440393692497 +1915 0.1915 1056.8494339954818315 19356.670374292404 +1916 0.1916 1054.9156017233628972 19319.975068086103 +1917 0.1917 1052.9854352548666157 19283.354301837397 +1918 0.1918 1051.0589271446356179 19246.807902780300 +1919 0.1919 1049.1360699645656496 19210.335698618499 +1920 0.1920 1047.2168563037585045 19173.937517522998 +1921 0.1921 1045.3012787684758678 19137.613188130901 +1922 0.1922 1043.3893299820920220 19101.362539544203 +1923 0.1923 1041.4810025850483726 19065.185401328097 +1924 0.1924 1039.5762892348066089 19029.081603509101 +1925 0.1925 1037.6751826058023198 18993.050976574697 +1926 0.1926 1035.7776753893999739 18957.093351470601 +1927 0.1927 1033.8837602938465352 18921.208559600302 +1928 0.1928 1031.9934300442253061 18885.396432822799 +1929 0.1929 1030.1066773824115899 18849.656803452002 +1930 0.1930 1028.2234950670263061 18813.989504254401 +1931 0.1931 1026.3438758733911982 18778.394368448600 +1932 0.1932 1024.4678125934835862 18742.871229702898 +1933 0.1933 1022.5952980358916875 18707.419922134799 +1934 0.1934 1020.7263250257694835 18672.040280308902 +1935 0.1935 1018.8608864047922680 18636.732139235795 +1936 0.1936 1016.9989750311119678 18601.495334370600 +1937 0.1937 1015.1405837793129194 18566.329701611397 +1938 0.1938 1013.2857055403674167 18531.235077298399 +1939 0.1939 1011.4343332215919418 18496.211298211900 +1940 0.1940 1009.5864597466028272 18461.258201571003 +1941 0.1941 1007.7420780552726001 18426.375625032899 +1942 0.1942 1005.9011811036864401 18391.563406690402 +1943 0.1943 1004.0637618640982964 18356.821385071598 +1944 0.1944 1002.2298133248878003 18322.149399137805 +1945 0.1945 1000.3993284905167229 18287.547288282698 +1946 0.1946 998.5723003814861158 18253.014892330302 +1947 0.1947 996.7487220342928822 18218.552051534498 +1948 0.1948 994.9285865013872581 18184.158606577003 +1949 0.1949 993.1118868511300661 18149.834398566200 +1950 0.1950 991.2986161677499695 18115.579269035901 +1951 0.1951 989.4887675513009526 18081.393059944297 +1952 0.1952 987.6823341176201438 18047.275613671802 +1953 0.1953 985.8793089982855236 18013.226773020502 +1954 0.1954 984.0796853405738602 17979.246381212601 +1955 0.1955 982.2834563074187599 17945.334281888998 +1956 0.1956 980.4906150773689433 17911.490319108001 +1957 0.1957 978.7011548445462950 17877.714337344500 +1958 0.1958 976.9150688186047091 17844.006181487501 +1959 0.1959 975.1323502246883663 17810.365696840399 +1960 0.1960 973.3529923033904652 17776.792729118402 +1961 0.1961 971.5769883107121814 17743.287124447899 +1962 0.1962 969.8043315180215131 17709.848729364800 +1963 0.1963 968.0350152120125813 17676.477390813900 +1964 0.1964 966.2690326946645882 17643.172956146700 +1965 0.1965 964.5063772832012319 17609.935273120900 +1966 0.1966 962.7470423100502330 17576.764189898902 +1967 0.1967 960.9910211228029766 17543.659555046303 +1968 0.1968 959.2383070841741528 17510.621217531101 +1969 0.1969 957.4888935719615120 17477.649026721901 +1970 0.1970 955.7427739790060741 17444.742832387201 +1971 0.1971 953.9999417131519976 17411.902484693899 +1972 0.1972 952.2603901972070162 17379.127834206200 +1973 0.1973 950.5241128689025345 17346.418731883798 +1974 0.1974 948.7911031808542930 17313.775029081702 +1975 0.1975 947.0613546005228045 17281.196577548097 +1976 0.1976 945.3348606101742462 17248.683229423597 +1977 0.1977 943.6116147068411237 17216.234837239903 +1978 0.1978 941.8916104022831632 17183.851253918299 +1979 0.1979 940.1748412229487712 17151.532332769500 +1980 0.1980 938.4613007099358128 17119.277927490701 +1981 0.1981 936.7509824189529581 17087.087892166201 +1982 0.1982 935.0438799202813698 17054.962081264999 +1983 0.1983 933.3399867987361631 17022.900349640102 +1984 0.1984 931.6392966536277527 16990.902552527205 +1985 0.1985 929.9418030987242219 16958.968545543597 +1986 0.1986 928.2474997622126693 16927.098184687002 +1987 0.1987 926.5563802866615788 16895.291326334001 +1988 0.1988 924.8684383289828475 16863.547827239599 +1989 0.1989 923.1836675603940421 16831.867544535598 +1990 0.1990 921.5020616663807687 16800.250335729601 +1991 0.1991 919.8236143466591557 16768.696058703397 +1992 0.1992 918.1483193151383375 16737.204571712704 +1993 0.1993 916.4761702998833925 16705.775733385100 +1994 0.1994 914.8071610430781675 16674.409402719302 +1995 0.1995 913.1412853009879882 16643.105439084600 +1996 0.1996 911.4785368439228250 16611.863702218296 +1997 0.1997 909.8189094562005721 16580.684052226101 +1998 0.1998 908.1623969361102127 16549.566349580000 +1999 0.1999 906.5089930958753257 16518.510455117499 +2000 0.2000 904.8586917616173650 16487.516230040703 +2001 0.2001 903.2114867733196206 16456.583535914604 +2002 0.2002 901.5673719847906114 16425.712234666600 +2003 0.2003 899.9263412636280464 16394.902188585202 +2004 0.2004 898.2883884911829000 16364.153260318602 +2005 0.2005 896.6535075625232594 16333.465312873999 +2006 0.2006 895.0216923863987404 16302.838209616300 +2007 0.2007 893.3929368852045627 16272.271814267100 +2008 0.2008 891.7672349949460795 16241.765990903699 +2009 0.2009 890.1445806652030797 16211.320603957400 +2010 0.2010 888.5249678590945450 16180.935518213602 +2011 0.2011 886.9083905532434073 16150.610598809602 +2012 0.2012 885.2948427377411917 16120.345711234095 +2013 0.2013 883.6843184161132285 16090.140721325999 +2014 0.2014 882.0768116052832966 16059.995495273401 +2015 0.2015 880.4723163355390625 16029.909899612201 +2016 0.2016 878.8708266504971789 15999.883801225602 +2017 0.2017 877.2723366070687234 15969.917067342896 +2018 0.2018 875.6768402754246381 15940.009565537799 +2019 0.2019 874.0843317389612821 15910.161163728695 +2020 0.2020 872.4948050942660984 15880.371730175797 +2021 0.2021 870.9082544510831667 15850.641133482102 +2022 0.2022 869.3246739322795520 15820.969242590600 +2023 0.2023 867.7440576738107438 15791.355926784599 +2024 0.2024 866.1663998246872325 15761.801055685701 +2025 0.2025 864.5916945469402890 15732.304499253500 +2026 0.2026 863.0199360155884278 15702.866127783902 +2027 0.2027 861.4511184186037553 15673.485811908999 +2028 0.2028 859.8852359568785459 15644.163422594898 +2029 0.2029 858.3222828441917045 15614.898831141800 +2030 0.2030 856.7622533071754560 15585.691909182398 +2031 0.2031 855.2051415852822629 15556.542528681002 +2032 0.2032 853.6509419307516282 15527.450561932503 +2033 0.2033 852.0996486085768993 15498.415881561403 +2034 0.2034 850.5512558964727532 15469.438360521002 +2035 0.2035 849.0057580848421139 15440.517872091903 +2036 0.2036 847.4631494767434106 15411.654289881899 +2037 0.2037 845.9234243878580628 15382.847487824001 +2038 0.2038 844.3865771464580803 15354.097340176100 +2039 0.2039 842.8526020933733207 15325.403721520001 +2040 0.2040 841.3214935819593165 15296.766506759901 +2041 0.2041 839.7932459780652152 15268.185571122198 +2042 0.2042 838.2678536600013786 15239.660790153601 +2043 0.2043 836.7453110185076639 15211.192039721202 +2044 0.2044 835.2256124567210236 15182.779196010801 +2045 0.2045 833.7087523901441273 15154.422135526002 +2046 0.2046 832.1947252466134159 15126.120735087701 +2047 0.2047 830.6835254662673833 15097.874871832602 +2048 0.2048 829.1751475015150845 15069.684423212700 +2049 0.2049 827.6695858170047586 15041.549266994003 +2050 0.2050 826.1668348895922236 15013.469281255802 +2051 0.2051 824.6668892083099536 14985.444344389998 +2052 0.2052 823.1697432743354739 14957.474335099101 +2053 0.2053 821.6753916009606655 14929.559132397000 +2054 0.2054 820.1838287135605015 14901.698615606299 +2055 0.2055 818.6950491495622373 14873.892664358700 +2056 0.2056 817.2090474584146023 14846.141158593400 +2057 0.2057 815.7258182015571037 14818.443978556101 +2058 0.2058 814.2453559523893318 14790.801004798901 +2059 0.2059 812.7676552962404912 14763.212118178300 +2060 0.2060 811.2927108303388195 14735.677199855199 +2061 0.2061 809.8205171637813464 14708.196131293502 +2062 0.2062 808.3510689175037669 14680.768794259202 +2063 0.2063 806.8843607242498592 14653.395070819701 +2064 0.2064 805.4203872285416992 14626.074843342900 +2065 0.2065 803.9591430866497603 14598.807994496099 +2066 0.2066 802.5006229665626734 14571.594407245600 +2067 0.2067 801.0448215479576675 14544.433964854899 +2068 0.2068 799.5917335221706708 14517.326550884900 +2069 0.2069 798.1413535921667517 14490.272049192397 +2070 0.2070 796.6936764725106741 14463.270343928900 +2071 0.2071 795.2486968893372250 14436.321319540897 +2072 0.2072 793.8064095803217697 14409.424860767598 +2073 0.2073 792.3668092946513752 14382.580852641000 +2074 0.2074 790.9298907929950246 14355.789180484899 +2075 0.2075 789.4956488474750813 14329.049729913801 +2076 0.2076 788.0640782416378443 14302.362386832003 +2077 0.2077 786.6351737704245579 14275.727037433000 +2078 0.2078 785.2089302401429904 14249.143568198499 +2079 0.2079 783.7853424684382162 14222.611865897699 +2080 0.2080 782.3644052842640804 14196.131817586000 +2081 0.2081 780.9461135278545498 14169.703310605000 +2082 0.2082 779.5304620506952915 14143.326232580603 +2083 0.2083 778.1174457154951369 14117.000471423100 +2084 0.2084 776.7070593961576606 14090.725915326002 +2085 0.2085 775.2992979777530991 14064.502452764798 +2086 0.2086 773.8941563564900434 14038.329972496798 +2087 0.2087 772.4916294396872445 14012.208363559803 +2088 0.2088 771.0917121457456460 13986.137515271701 +2089 0.2089 769.6943994041206452 13960.117317229400 +2090 0.2090 768.2996861552937844 13934.147659307699 +2091 0.2091 766.9075673507454667 13908.228431659099 +2092 0.2092 765.5180379529268748 13882.359524712800 +2093 0.2093 764.1310929352325729 13856.540829173602 +2094 0.2094 762.7467272819728805 13830.772236020999 +2095 0.2095 761.3649359883463603 13805.053636509401 +2096 0.2096 759.9857140604125334 13779.384922166100 +2097 0.2097 758.6090565150647080 13753.765984790600 +2098 0.2098 757.2349583800024675 13728.196716455102 +2099 0.2099 755.8634146937046125 13702.677009502098 +2100 0.2100 754.4944205054023314 13677.206756544500 +2101 0.2101 753.1279708750519148 13651.785850464599 +2102 0.2102 751.7640608733080398 13626.414184413199 +2103 0.2103 750.4026855814969394 13601.091651809100 +2104 0.2104 749.0438400915895727 13575.818146338199 +2105 0.2105 747.6875195061750219 13550.593561952399 +2106 0.2106 746.3337189384338899 13525.417792869397 +2107 0.2107 744.9824335121118111 13500.290733571401 +2108 0.2108 743.6336583614929623 13475.212278804600 +2109 0.2109 742.2873886313738012 13450.182323578600 +2110 0.2110 740.9436194770365773 13425.200763165198 +2111 0.2111 739.6023460642234113 13400.267493097901 +2112 0.2112 738.2635635691099196 13375.382409171198 +2113 0.2113 736.9272671782794077 13350.545407439600 +2114 0.2114 735.5934520886966084 13325.756384217100 +2115 0.2115 734.2621135076819883 13301.015236076200 +2116 0.2116 732.9332466528858276 13276.321859847503 +2117 0.2117 731.6068467522625269 13251.676152618700 +2118 0.2118 730.2829090440449136 13227.078011733698 +2119 0.2119 728.9614287767186624 13202.527334792299 +2120 0.2120 727.6424012089966027 13178.024019648899 +2121 0.2121 726.3258216097935929 13153.567964412399 +2122 0.2122 725.0116852582007141 13129.159067445100 +2123 0.2123 723.6999874434603726 13104.797227361800 +2124 0.2124 722.3907234649408338 13080.482343029300 +2125 0.2125 721.0838886321110976 13056.214313566099 +2126 0.2126 719.7794782645157738 13031.993038340501 +2127 0.2127 718.4774876917501842 13007.818416971197 +2128 0.2128 717.1779122534353519 12983.690349325600 +2129 0.2129 715.8807472991931036 12959.608735519898 +2130 0.2130 714.5859881886212861 12935.573475917401 +2131 0.2131 713.2936302912689825 12911.584471128699 +2132 0.2132 712.0036689866120696 12887.641622010698 +2133 0.2133 710.7160996640283201 12863.744829665298 +2134 0.2134 709.4309177227730743 12839.893995439899 +2135 0.2135 708.1481185719547966 12816.089020925603 +2136 0.2136 706.8676976305106336 12792.329807956901 +2137 0.2137 705.5896503271821985 12768.616258611000 +2138 0.2138 704.3139721004912417 12744.948275207302 +2139 0.2139 703.0406583987155500 12721.325760306499 +2140 0.2140 701.7697046798647307 12697.748616709599 +2141 0.2141 700.5011064116563375 12674.216747457998 +2142 0.2142 699.2348590714918828 12650.730055832000 +2143 0.2143 697.9709581464327357 12627.288445350401 +2144 0.2144 696.7093991331767029 12603.891819770301 +2145 0.2145 695.4501775380339268 12580.540083085501 +2146 0.2146 694.1932888769033525 12557.233139526799 +2147 0.2147 692.9387286752489672 12533.970893560299 +2148 0.2148 691.6864924680766080 12510.753249887803 +2149 0.2149 690.4365757999099742 12487.580113445201 +2150 0.2150 689.1889742247675485 12464.451389402400 +2151 0.2151 687.9436833061392917 12441.366983162299 +2152 0.2152 686.7006986169631091 12418.326800360699 +2153 0.2153 685.4600157396018858 12395.330746864702 +2154 0.2154 684.2216302658199538 12372.378728772899 +2155 0.2155 682.9855377967605818 12349.470652414200 +2156 0.2156 681.7517339429224421 12326.606424347599 +2157 0.2157 680.5202143241369868 12303.785951361100 +2158 0.2158 679.2909745695453694 12281.009140471300 +2159 0.2159 678.0640103175757076 12258.275898922702 +2160 0.2160 676.8393172159202322 12235.586134187000 +2161 0.2161 675.6168909215127769 12212.939753962501 +2162 0.2162 674.3967271005059274 12190.336666173700 +2163 0.2163 673.1788214282487388 12167.776778970001 +2164 0.2164 671.9631695892639982 12145.260000725701 +2165 0.2165 670.7497672772257147 12122.786240039100 +2166 0.2166 669.5386101949371778 12100.355405731900 +2167 0.2167 668.3296940543081064 12077.967406848700 +2168 0.2168 667.1230145763328210 12055.622152656102 +2169 0.2169 665.9185674910679609 12033.319552642000 +2170 0.2170 664.7163485376100880 12011.059516515701 +2171 0.2171 663.5163534640739726 11988.841954206100 +2172 0.2172 662.3185780275705383 11966.666775862499 +2173 0.2173 661.1230179941848064 11944.533891852399 +2174 0.2174 659.9296691389540683 11922.443212762300 +2175 0.2175 658.7385272458461714 11900.394649396101 +2176 0.2176 657.5495881077375770 11878.388112774999 +2177 0.2177 656.3628475263919881 11856.423514137001 +2178 0.2178 655.1783013124384070 11834.500764935499 +2179 0.2179 653.9959452853496487 11812.619776839601 +2180 0.2180 652.8157752734209680 11790.780461733000 +2181 0.2181 651.6377871137486864 11768.982731713499 +2182 0.2182 650.4619766522083637 11747.226499092500 +2183 0.2183 649.2883397434339940 11725.511676394299 +2184 0.2184 648.1168722507965185 11703.838176355301 +2185 0.2185 646.9475700463825660 11682.205911923800 +2186 0.2186 645.7804290109734211 11660.614796259199 +2187 0.2187 644.6154450340238782 11639.064742731400 +2188 0.2188 643.4526140136413233 11617.555664920201 +2189 0.2189 642.2919318565645881 11596.087476614701 +2190 0.2190 641.1333944781432592 11574.660091813003 +2191 0.2191 639.9769978023165322 11553.273424720901 +2192 0.2192 638.8227377615928617 11531.927389752298 +2193 0.2193 637.6706102970288157 11510.621901527598 +2194 0.2194 636.5206113582087255 11489.356874874200 +2195 0.2195 635.3727369032237675 11468.132224824598 +2196 0.2196 634.2269828986517268 11446.947866617298 +2197 0.2197 633.0833453195360789 11425.803715695101 +2198 0.2198 631.9418201493660945 11404.699687704902 +2199 0.2199 630.8024033800560346 11383.635698497203 +2200 0.2200 629.6650910119249147 11362.611664125599 +2201 0.2201 628.5298790536763818 11341.627500845898 +2202 0.2202 627.3967635223782509 11320.683125115998 +2203 0.2203 626.2657404434427235 11299.778453594599 +2204 0.2204 625.1368058506059242 11278.913403141800 +2205 0.2205 624.0099557859080051 11258.087890817400 +2206 0.2206 622.8851862996731370 11237.301833880900 +2207 0.2207 621.7624934504896146 11216.555149790602 +2208 0.2208 620.6418733051898471 11195.847756203901 +2209 0.2209 619.5233219388309180 11175.179570975499 +2210 0.2210 618.4068354346742353 11154.550512157799 +2211 0.2211 617.2924098841663181 11133.960498000000 +2212 0.2212 616.1800413869189015 11113.409446947600 +2213 0.2213 615.0697260506893826 11092.897277641801 +2214 0.2214 613.9614599913613802 11072.423908918900 +2215 0.2215 612.8552393329249526 11051.989259810000 +2216 0.2216 611.7510602074573853 11031.593249540301 +2217 0.2217 610.6489187551039777 11011.235797528598 +2218 0.2218 609.5488111240582612 10990.916823386402 +2219 0.2219 608.4507334705430139 10970.636246918299 +2220 0.2220 607.3546819587910477 10950.393988120299 +2221 0.2221 606.2606527610259946 10930.189967180300 +2222 0.2222 605.1686420574430940 10910.024104476601 +2223 0.2223 604.0786460361903210 10889.896320578402 +2224 0.2224 602.9906608933491725 10869.806536244301 +2225 0.2225 601.9046828329157961 10849.754672422698 +2226 0.2226 600.8207080667821174 10829.740650250198 +2227 0.2227 599.7387328147169683 10809.764391052200 +2228 0.2228 598.6587533043473286 10789.825816341699 +2229 0.2229 597.5807657711393404 10769.924847818802 +2230 0.2230 596.5047664583798905 10750.061407370400 +2231 0.2231 595.4307516171578527 10730.235417069700 +2232 0.2232 594.3587175063455561 10710.446799175501 +2233 0.2233 593.2886603925801410 10690.695476131801 +2234 0.2234 592.2205765502451413 10670.981370567100 +2235 0.2235 591.1544622614520677 10651.304405294599 +2236 0.2236 590.0903138160218759 10631.664503310300 +2237 0.2237 589.0281275114666641 10612.061587794202 +2238 0.2238 587.9678996529714823 10592.495582108402 +2239 0.2239 586.9096265533761425 10572.966409797500 +2240 0.2240 585.8533045331569156 10553.473994587199 +2241 0.2241 584.7989299204083409 10534.018260384999 +2242 0.2242 583.7464990508251503 10514.599131278599 +2243 0.2243 582.6960082676844195 10495.216531535900 +2244 0.2244 581.6474539218273776 10475.870385604700 +2245 0.2245 580.6008323716415589 10456.560618111702 +2246 0.2246 579.5561399830428400 10437.287153862200 +2247 0.2247 578.5133731294577046 10418.049917840201 +2248 0.2248 577.4725281918053952 10398.848835206702 +2249 0.2249 576.4336015584800634 10379.683831300299 +2250 0.2250 575.3965896253332630 10360.554831636200 +2251 0.2251 574.3614887956561006 10341.461761905999 +2252 0.2252 573.3282954801619553 10322.404547976799 +2253 0.2253 572.2970060969685164 10303.383115891000 +2254 0.2254 571.2676170715806165 10284.397391866099 +2255 0.2255 570.2401248368726101 10265.447302293498 +2256 0.2256 569.2145258330709794 10246.532773738700 +2257 0.2257 568.1908165077370541 10227.653732940500 +2258 0.2258 567.1689933157495034 10208.810106810499 +2259 0.2259 566.1490527192872833 10190.001822432798 +2260 0.2260 565.1309911878124694 10171.228807063399 +2261 0.2261 564.1148051980527498 10152.490988129999 +2262 0.2262 563.1004912339847124 10133.788293230900 +2263 0.2263 562.0880457868164513 10115.120650135101 +2264 0.2264 561.0774653549706272 10096.487986781902 +2265 0.2265 560.0687464440675285 10077.890231280100 +2266 0.2266 559.0618855669081313 10059.327311907400 +2267 0.2267 558.0568792434572742 10040.799157110501 +2268 0.2268 557.0537240008264916 10022.305695504199 +2269 0.2269 556.0524163732577563 10003.846855871299 +2270 0.2270 555.0529529021060853 9985.422567161499 +2271 0.2271 554.0553301358233966 9967.032758491599 +2272 0.2272 553.0595446299415698 9948.677359144998 +2273 0.2273 552.0655929470557339 9930.356298570598 +2274 0.2274 551.0734716568080103 9912.069506383299 +2275 0.2275 550.0831773358706869 9893.816912362900 +2276 0.2276 549.0947065679298476 9875.598446453499 +2277 0.2277 548.1080559436690010 9857.414038764002 +2278 0.2278 547.1232220607524823 9839.263619566400 +2279 0.2279 546.1402015238093099 9821.147119296302 +2280 0.2280 545.1589909444169280 9803.064468552000 +2281 0.2281 544.1795869410846080 9785.015598094498 +2282 0.2282 543.2019861392375333 9767.000438846399 +2283 0.2283 542.2261851712006546 9749.018921891999 +2284 0.2284 541.2521806761822063 9731.070978476599 +2285 0.2285 540.2799693002580170 9713.156540006299 +2286 0.2286 539.3095476963553665 9695.275538047399 +2287 0.2287 538.3409125242367281 9677.427904325601 +2288 0.2288 537.3740604504840803 9659.613570726598 +2289 0.2289 536.4089881484829903 9641.832469294601 +2290 0.2290 535.4456922984066978 9624.084532232300 +2291 0.2291 534.4841695872000855 9606.369691900600 +2292 0.2292 533.5244167085641038 9588.687880818099 +2293 0.2293 532.5664303629401957 9571.039031660299 +2294 0.2294 531.6102072574941531 9553.423077259902 +2295 0.2295 530.6557441061008831 9535.839950605799 +2296 0.2296 529.7030376293284917 9518.289584842802 +2297 0.2297 528.7520845544228223 9500.771913271201 +2298 0.2298 527.8028816152918807 9483.286869346599 +2299 0.2299 526.8554255524906011 9465.834386679198 +2300 0.2300 525.9097131132049299 9448.414399033400 +2301 0.2301 524.9657410512368187 9431.026840327799 +2302 0.2302 524.0235061269887638 9413.671644633900 +2303 0.2303 523.0830051074482299 9396.348746176700 +2304 0.2304 522.1442347661727581 9379.058079333601 +2305 0.2305 521.2071918832743904 9361.799578634398 +2306 0.2306 520.2718732454046631 9344.573178760900 +2307 0.2307 519.3382756457393725 9327.378814545602 +2308 0.2308 518.4063958839634552 9310.216420972798 +2309 0.2309 517.4762307662559806 9293.085933176901 +2310 0.2310 516.5477771052750313 9275.987286442802 +2311 0.2311 515.6210317201426960 9258.920416205001 +2312 0.2312 514.6959914364300630 9241.885258047501 +2313 0.2313 513.7726530861425545 9224.881747703101 +2314 0.2314 512.8510135077046925 9207.909821053701 +2315 0.2315 511.9310695459456042 9190.969414129000 +2316 0.2316 511.0128180520838441 9174.060463106398 +2317 0.2317 510.0962558837129563 9157.182904311001 +2318 0.2318 509.1813799047866382 9140.336674215001 +2319 0.2319 508.2681869856040748 9123.521709436802 +2320 0.2320 507.3566740027951596 9106.737946741601 +2321 0.2321 506.4468378393060561 9089.985323040100 +2322 0.2322 505.5386753843846463 9073.263775388301 +2323 0.2323 504.6321835335658648 9056.573240987798 +2324 0.2324 503.7273591886572603 9039.913657184299 +2325 0.2325 502.8241992577246151 9023.284961468402 +2326 0.2326 501.9227006550775059 9006.687091474101 +2327 0.2327 501.0228603012548092 8990.119984979399 +2328 0.2328 500.1246751230106042 8973.583579905102 +2329 0.2329 499.2281420532996208 8957.077814314798 +2330 0.2330 498.3332580312631421 8940.602626414800 +2331 0.2331 497.4400200022147374 8924.157954553100 +2332 0.2332 496.5484249176261073 8907.743737219600 +2333 0.2333 495.6584697351128739 8891.359913045299 +2334 0.2334 494.7701514184204825 8875.006420802201 +2335 0.2335 493.8834669374102191 8858.683199402702 +2336 0.2336 492.9984132680451125 8842.390187899500 +2337 0.2337 492.1149873923758946 8826.127325484900 +2338 0.2338 491.2331862985270732 8809.894551490999 +2339 0.2339 490.3530069806831193 8793.691805388300 +2340 0.2340 489.4744464390743701 8777.519026786500 +2341 0.2341 488.5975016799633863 8761.376155433600 +2342 0.2342 487.7221697156309688 8745.263131215199 +2343 0.2343 486.8484475643624592 8729.179894154700 +2344 0.2344 485.9763322504340977 8713.126384412799 +2345 0.2345 485.1058208040990962 8697.102542286901 +2346 0.2346 484.2369102615742236 8681.108308210898 +2347 0.2347 483.3695976650259354 8665.143622755000 +2348 0.2348 482.5038800625569593 8649.208426625002 +2349 0.2349 481.6397545081925955 8633.302660662099 +2350 0.2350 480.7772180618673588 8617.426265842701 +2351 0.2351 479.9162677894113358 8601.579183278000 +2352 0.2352 479.0569007625367703 8585.761354213002 +2353 0.2353 478.1991140588247617 8569.972720027501 +2354 0.2354 477.3429047617116794 8554.213222234301 +2355 0.2355 476.4882699604759750 8538.482802479799 +2356 0.2356 475.6352067502248246 8522.781402543500 +2357 0.2357 474.7837122318808269 8507.108964336900 +2358 0.2358 473.9337835121687590 8491.465429904500 +2359 0.2359 473.0854177036024453 8475.850741422000 +2360 0.2360 472.2386119244714564 8460.264841197300 +2361 0.2361 471.3933632988281488 8444.707671668901 +2362 0.2362 470.5496689564743633 8429.179175406700 +2363 0.2363 469.7075260329484649 8413.679295110800 +2364 0.2364 468.8669316695123257 8398.207973611601 +2365 0.2365 468.0278830131383074 8382.765153869299 +2366 0.2366 467.1903772164961310 8367.350778973700 +2367 0.2367 466.3544114379402572 8351.964792143401 +2368 0.2368 465.5199828414967556 8336.607136726499 +2369 0.2369 464.6870885968504581 8321.277756198901 +2370 0.2370 463.8557258793322262 8305.976594165200 +2371 0.2371 463.0258918699061041 8290.703594357299 +2372 0.2372 462.1975837551564723 8275.458700635001 +2373 0.2373 461.3707987272754849 8260.241856985100 +2374 0.2374 460.5455339840501665 8245.053007521201 +2375 0.2375 459.7217867288499065 8229.892096483602 +2376 0.2376 458.8995541706137828 8214.759068238302 +2377 0.2377 458.0788335238380000 8199.653867277499 +2378 0.2378 457.2596220085631558 8184.576438218901 +2379 0.2379 456.4419168503619630 8169.526725805299 +2380 0.2380 455.6257152803264603 8154.504674904201 +2381 0.2381 454.8110145350558469 8139.510230507898 +2382 0.2382 453.9978118566438070 8124.543337732801 +2383 0.2383 453.1861044926662316 8109.603941819101 +2384 0.2384 452.3758896961687697 8094.691988130502 +2385 0.2385 451.5671647256545498 8079.807422154301 +2386 0.2386 450.7599268450718455 8064.950189500301 +2387 0.2387 449.9541733238017969 8050.120235901100 +2388 0.2388 449.1499014366461893 8035.317507211599 +2389 0.2389 448.3471084638151751 8020.541949408500 +2390 0.2390 447.5457916909152232 8005.793508590301 +2391 0.2391 446.7459484089368402 7991.072130976898 +2392 0.2392 445.9475759142425204 7976.377762909000 +2393 0.2393 445.1506715085546375 7961.710350848101 +2394 0.2394 444.3552324989433941 7947.069841376198 +2395 0.2395 443.5612561978148278 7932.456181195099 +2396 0.2396 442.7687399228987601 7917.869317126801 +2397 0.2397 441.9776809972368028 7903.309196112399 +2398 0.2398 441.1880767491705910 7888.775765212200 +2399 0.2399 440.3999245123296760 7874.268971605601 +2400 0.2400 439.6132216256198717 7859.788762590200 +2401 0.2401 438.8279654332112614 7845.335085581901 +2402 0.2402 438.0441532845264305 7830.907888114598 +2403 0.2403 437.2617825342287006 7816.507117840099 +2404 0.2404 436.4808505422103622 7802.132722527002 +2405 0.2405 435.7013546735809655 7787.784650061201 +2406 0.2406 434.9232922986556673 7773.462848445201 +2407 0.2407 434.1466607929435213 7759.167265798198 +2408 0.2408 433.3714575371358819 7744.897850355001 +2409 0.2409 432.5976799170948084 7730.654550466801 +2410 0.2410 431.8253253238414686 7716.437314599800 +2411 0.2411 431.0543911535446568 7702.246091335899 +2412 0.2412 430.2848748075093113 7688.080829371302 +2413 0.2413 429.5167736921648611 7673.941477517501 +2414 0.2414 428.7500852190539717 7659.827984699799 +2415 0.2415 427.9848068048210621 7645.740299958001 +2416 0.2416 427.2209358712008793 7631.678372445302 +2417 0.2417 426.4584698450071869 7617.642151428399 +2418 0.2418 425.6974061581213959 7603.631586287400 +2419 0.2419 424.9377422474812533 7589.646626514899 +2420 0.2420 424.1794755550697005 7575.687221716600 +2421 0.2421 423.4226035279033908 7561.753321609800 +2422 0.2422 422.6671236180216624 7547.844876024499 +2423 0.2423 421.9130332824753395 7533.961834902002 +2424 0.2424 421.1603299833154779 7520.104148295201 +2425 0.2425 420.4090111875823368 7506.271766368000 +2426 0.2426 419.6590743672941812 7492.464639395301 +2427 0.2427 418.9105169994363109 7478.682717762600 +2428 0.2428 418.1633365659499191 7464.925951965699 +2429 0.2429 417.4175305537211216 7451.194292610200 +2430 0.2430 416.6730964545700431 7437.487690411799 +2431 0.2431 415.9300317652396757 7423.806096195400 +2432 0.2432 415.1883339873851355 7410.149460895000 +2433 0.2433 414.4480006275626920 7396.517735553798 +2434 0.2434 413.7090291972188538 7382.910871323400 +2435 0.2435 412.9714172126795120 7369.328819463801 +2436 0.2436 412.2351621951391394 7355.771531343200 +2437 0.2437 411.5002616706501044 7342.238958437199 +2438 0.2438 410.7667131701117569 7328.731052329598 +2439 0.2439 410.0345142292597416 7315.247764710599 +2440 0.2440 409.3036623886553116 7301.789047377899 +2441 0.2441 408.5741551936746419 7288.354852236002 +2442 0.2442 407.8459901944980857 7274.945131295501 +2443 0.2443 407.1191649460996587 7261.559836673201 +2444 0.2444 406.3936770082364092 7248.198920592100 +2445 0.2445 405.6695239454377884 7234.862335380500 +2446 0.2446 404.9467033269951344 7221.550033472100 +2447 0.2447 404.2252127269512130 7208.261967405799 +2448 0.2448 403.5050497240896448 7194.998089825200 +2449 0.2449 402.7862119019244460 7181.758353478399 +2450 0.2450 402.0686968486896262 7168.542711218002 +2451 0.2451 401.3525021573286722 7155.351116000600 +2452 0.2452 400.6376254254843161 7142.183520886399 +2453 0.2453 399.9240642554880196 7129.039879039101 +2454 0.2454 399.2118162543497988 7115.920143725800 +2455 0.2455 398.5008790337477080 7102.824268316301 +2456 0.2456 397.7912502100177221 7089.752206283500 +2457 0.2457 397.0829274041434473 7076.703911202500 +2458 0.2458 396.3759082417457762 7063.679336750398 +2459 0.2459 395.6701903530729396 7050.678436706801 +2460 0.2460 394.9657713729899911 7037.701164952399 +2461 0.2461 394.2626489409688588 7024.747475469701 +2462 0.2462 393.5608207010782849 7011.817322342100 +2463 0.2463 392.8602843019734792 6998.910659754200 +2464 0.2464 392.1610373968862291 6986.027441990898 +2465 0.2465 391.4630776436147812 6973.167623438001 +2466 0.2466 390.7664027045138369 6960.331158580801 +2467 0.2467 390.0710102464845477 6947.518002004899 +2468 0.2468 389.3768979409645112 6934.728108395799 +2469 0.2469 388.6840634639178234 6921.961432537801 +2470 0.2470 387.9925044958251874 6909.217929314600 +2471 0.2471 387.3022187216740235 6896.497553708998 +2472 0.2472 386.6132038309484642 6883.800260802100 +2473 0.2473 385.9254575176196909 6871.126005773600 +2474 0.2474 385.2389774801359295 6858.474743901499 +2475 0.2475 384.5537614214127871 6845.846430561198 +2476 0.2476 383.8698070488234180 6833.241021226298 +2477 0.2477 383.1871120741887466 6820.658471467501 +2478 0.2478 382.5056742137677475 6808.098736952699 +2479 0.2479 381.8254911882477813 6795.561773446901 +2480 0.2480 381.1465607227348755 6783.047536811699 +2481 0.2481 380.4688805467440602 6770.555983004901 +2482 0.2482 379.7924483941897620 6758.087068080800 +2483 0.2483 379.1172620033762541 6745.640748189600 +2484 0.2484 378.4433191169879365 6733.216979577099 +2485 0.2485 377.7706174820798424 6720.815718584699 +2486 0.2486 377.0991548500681461 6708.436921648899 +2487 0.2487 376.4289289767206128 6696.080545301300 +2488 0.2488 375.7599376221471061 6683.746546168299 +2489 0.2489 375.0921785507901518 6671.434880970801 +2490 0.2490 374.4256495314154449 6659.145506523901 +2491 0.2491 373.7603483371024140 6646.878379736800 +2492 0.2492 373.0962727452349554 6634.633457612501 +2493 0.2493 372.4334205374919406 6622.410697247698 +2494 0.2494 371.7717894998379506 6610.210055832398 +2495 0.2495 371.1113774225138400 6598.031490649499 +2496 0.2496 370.4521821000275850 6585.874959075200 +2497 0.2497 369.7942013311449045 6573.740418577898 +2498 0.2498 369.1374329188800516 6561.627826718799 +2499 0.2499 368.4818746704865475 6549.537141151202 +2500 0.2500 367.8275243974479736 6537.468319620000 +2501 0.2501 367.1743799154688190 6525.421319962601 +2502 0.2502 366.5224390444653295 6513.396100106902 +2503 0.2503 365.8716996085563551 6501.392618073100 +2504 0.2504 365.2221594360540848 6489.410831971900 +2505 0.2505 364.5738163594552361 6477.450700004600 +2506 0.2506 363.9266682154318460 6465.512180463700 +2507 0.2507 363.2807128448220624 6453.595231731701 +2508 0.2508 362.6359480926213905 6441.699812281200 +2509 0.2509 361.9923718079735977 6429.825880675102 +2510 0.2510 361.3499818441615616 6417.973395565701 +2511 0.2511 360.7087760585985166 6406.142315694698 +2512 0.2512 360.0687523128191287 6394.332599893301 +2513 0.2513 359.4299084724704016 6382.544207081699 +2514 0.2514 358.7922424073028651 6370.777096268699 +2515 0.2515 358.1557519911618215 6359.031226552099 +2516 0.2516 357.5204351019783644 6347.306557117501 +2517 0.2517 356.8862896217605112 6335.603047239401 +2518 0.2518 356.2533134365845626 6323.920656279599 +2519 0.2519 355.6215044365861786 6312.259343687900 +2520 0.2520 354.9908605159516810 6300.619069001499 +2521 0.2521 354.3613795729093567 6288.999791845199 +2522 0.2522 353.7330595097205901 6277.401471930300 +2523 0.2523 353.1058982326712794 6265.824069055701 +2524 0.2524 352.4798936520631969 6254.267543106298 +2525 0.2525 351.8550436822051779 6242.731854053602 +2526 0.2526 351.2313462414047081 6231.216961955601 +2527 0.2527 350.6087992519591126 6219.722826956102 +2528 0.2528 349.9874006401470865 6208.249409284599 +2529 0.2529 349.3671483362200547 6196.796669256300 +2530 0.2530 348.7480402743936452 6185.364567271901 +2531 0.2531 348.1300743928392194 6173.953063816800 +2532 0.2532 347.5132486336752891 6162.562119462002 +2533 0.2533 346.8975609429590463 6151.191694862800 +2534 0.2534 346.2830092706779510 6139.841750759200 +2535 0.2535 345.6695915707412041 6128.512247975401 +2536 0.2536 345.0573058009714487 6117.203147419899 +2537 0.2537 344.4461499230961863 6105.914410084803 +2538 0.2538 343.8361219027396487 6094.645997046398 +2539 0.2539 343.2272197094141006 6083.397869464099 +2540 0.2540 342.6194413165118817 6072.169988580701 +2541 0.2541 342.0127847012967663 6060.962315722099 +2542 0.2542 341.4072478448957781 6049.774812297201 +2543 0.2543 340.8028287322910614 6038.607439797401 +2544 0.2544 340.1995253523113547 6027.460159796701 +2545 0.2545 339.5973356976239756 6016.332933951400 +2546 0.2546 338.9962577647264084 6005.225723999700 +2547 0.2547 338.3962895539383453 5994.138491761902 +2548 0.2548 337.7974290693932744 5983.071199139998 +2549 0.2549 337.1996743190304073 5972.023808116999 +2550 0.2550 336.6030233145866646 5960.996280758000 +2551 0.2551 336.0074740715883195 5949.988579208399 +2552 0.2552 335.4130246093431538 5939.000665695001 +2553 0.2553 334.8196729509321585 5928.032502524899 +2554 0.2554 334.2274171232016329 5917.084052085900 +2555 0.2555 333.6362551567549986 5906.155276846299 +2556 0.2556 333.0461850859449555 5895.246139354002 +2557 0.2557 332.4572049488654102 5884.356602237200 +2558 0.2558 331.8693127873433468 5873.486628203600 +2559 0.2559 331.2825066469311537 5862.636180040399 +2560 0.2560 330.6967845768984375 5851.805220614402 +2561 0.2561 330.1121446302241793 5840.993712871199 +2562 0.2562 329.5285848635888328 5830.201619835301 +2563 0.2563 328.9461033373665373 5819.428904610300 +2564 0.2564 328.3646981156171023 5808.675530378099 +2565 0.2565 327.7843672660782772 5797.941460398701 +2566 0.2566 327.2051088601577931 5787.226658010901 +2567 0.2567 326.6269209729256886 5776.531086630901 +2568 0.2568 326.0498016831064660 5765.854709753101 +2569 0.2569 325.4737490730713603 5755.197490949000 +2570 0.2570 324.8987612288304945 5744.559393868098 +2571 0.2571 324.3248362400252631 5733.940382236698 +2572 0.2572 323.7519721999204876 5723.340419858301 +2573 0.2573 323.1801672053969128 5712.759470612998 +2574 0.2574 322.6094193569433628 5702.197498458099 +2575 0.2575 322.0397267586491239 5691.654467426799 +2576 0.2576 321.4710875181963274 5681.130341628801 +2577 0.2577 320.9034997468523898 5670.625085250002 +2578 0.2578 320.3369615594622815 5660.138662552299 +2579 0.2579 319.7714710744410240 5649.671037872798 +2580 0.2580 319.2070264137661297 5639.222175624898 +2581 0.2581 318.6436257029700414 5628.792040296699 +2582 0.2582 318.0812670711326291 5618.380596452000 +2583 0.2583 317.5199486508735731 5607.987808729200 +2584 0.2584 316.9596685783450312 5597.613641841899 +2585 0.2585 316.4004249932240214 5587.258060578002 +2586 0.2586 315.8422160387051463 5576.921029800000 +2587 0.2587 315.2850398614929190 5566.602514444799 +2588 0.2588 314.7288946117945443 5556.302479523198 +2589 0.2589 314.1737784433123579 5546.020890120102 +2590 0.2590 313.6196895132366649 5535.757711393999 +2591 0.2591 313.0666259822381221 5525.512908576900 +2592 0.2592 312.5145860144605194 5515.286446974602 +2593 0.2593 311.9635677775135036 5505.078291965601 +2594 0.2594 311.4135694424651319 5494.888409001698 +2595 0.2595 310.8645891838346529 5484.716763607701 +2596 0.2596 310.3166251795852304 5474.563321380800 +2597 0.2597 309.7696756111166678 5464.428047990699 +2598 0.2598 309.2237386632581320 5454.310909179700 +2599 0.2599 308.6788125242610477 5444.211870762101 +2600 0.2600 308.1348953857917081 5434.130898624200 +2601 0.2601 307.5919854429242832 5424.067958724199 +2602 0.2602 307.0500808941334867 5414.023017091700 +2603 0.2603 306.5091799412875275 5403.996039827998 +2604 0.2604 305.9692807896408340 5393.986993105702 +2605 0.2605 305.4303816478271187 5383.995843168501 +2606 0.2606 304.8924807278521598 5374.022556330801 +2607 0.2607 304.3555762450866951 5364.067098978399 +2608 0.2608 303.8196664182594304 5354.129437567000 +2609 0.2609 303.2847494694499346 5344.209538623101 +2610 0.2610 302.7508236240815904 5334.307368743499 +2611 0.2611 302.2178871109146598 5324.422894595100 +2612 0.2612 301.6859381620391787 5314.556082914798 +2613 0.2613 301.1549750128679648 5304.706900509000 +2614 0.2614 300.6249959021297968 5294.875314254001 +2615 0.2615 300.0959990718623089 5285.061291095401 +2616 0.2616 299.5679827674051126 5275.264798048100 +2617 0.2617 299.0409452373929184 5265.485802196299 +2618 0.2618 298.5148847337484881 5255.724270692599 +2619 0.2619 297.9897995116759262 5245.980170759100 +2620 0.2620 297.4656878296536888 5236.253469686002 +2621 0.2621 296.9425479494277624 5226.544134832002 +2622 0.2622 296.4203781360049561 5216.852133624601 +2623 0.2623 295.8991766576457962 5207.177433558601 +2624 0.2624 295.3789417858579895 5197.520002197502 +2625 0.2625 294.8596717953894881 5187.879807172099 +2626 0.2626 294.3413649642218388 5178.256816181098 +2627 0.2627 293.8240195735632483 5168.650996990802 +2628 0.2628 293.3076339078419892 5159.062317434400 +2629 0.2629 292.7922062546996358 5149.490745412500 +2630 0.2630 292.2777349049843565 5139.936248892900 +2631 0.2631 291.7642181527442062 5130.398795909799 +2632 0.2632 291.2516542952204759 5120.878354564402 +2633 0.2633 290.7400416328410415 5111.374893024402 +2634 0.2634 290.2293784692136569 5101.888379523702 +2635 0.2635 289.7196631111193597 5092.418782362500 +2636 0.2636 289.2108938685058774 5082.966069907301 +2637 0.2637 288.7030690544810341 5073.530210589801 +2638 0.2638 288.1961869853061557 5064.111172908299 +2639 0.2639 287.6902459803894203 5054.708925426001 +2640 0.2640 287.1852443622795477 5045.323436771800 +2641 0.2641 286.6811804566589785 5035.954675640000 +2642 0.2642 286.1780525923375080 5026.602610789700 +2643 0.2643 285.6758591012457487 5017.267211045200 +2644 0.2644 285.1745983184287070 5007.948445295602 +2645 0.2645 284.6742685820391898 4998.646282494299 +2646 0.2646 284.1748682333314946 4989.360691659802 +2647 0.2647 283.6763956166547587 4980.091641874498 +2648 0.2648 283.1788490794467634 4970.839102285101 +2649 0.2649 282.6822269722273973 4961.603042102299 +2650 0.2650 282.1865276485922323 4952.383430600998 +2651 0.2651 281.6917494652062146 4943.180237119299 +2652 0.2652 281.1978907817972981 4933.993431059300 +2653 0.2653 280.7049499611500210 4924.822981886498 +2654 0.2654 280.2129253690992527 4915.668859129401 +2655 0.2655 279.7218153745237714 4906.531032380000 +2656 0.2656 279.2316183493401240 4897.409471293200 +2657 0.2657 278.7423326684961467 4888.304145586599 +2658 0.2658 278.2539567099647684 4879.215025040599 +2659 0.2659 277.7664888547378155 4870.142079497899 +2660 0.2660 277.2799274868197017 4861.085278864299 +2661 0.2661 276.7942709932211187 4852.044593106901 +2662 0.2662 276.3095177639530107 4843.019992255600 +2663 0.2663 275.8256661920201509 4834.011446402101 +2664 0.2664 275.3427146734150597 4825.018925699702 +2665 0.2665 274.8606616071119220 4816.042400363602 +2666 0.2666 274.3795053950602210 4807.081840670400 +2667 0.2667 273.8992444421787695 4798.137216958201 +2668 0.2668 273.4198771563495711 4789.208499626100 +2669 0.2669 272.9414019484115101 4780.295659134601 +2670 0.2670 272.4638172321545539 4771.398666005001 +2671 0.2671 271.9871214243133295 4762.517490819298 +2672 0.2672 271.5113129445613254 4753.652104220300 +2673 0.2673 271.0363902155047526 4744.802476911298 +2674 0.2674 270.5623516626764058 4735.968579655701 +2675 0.2675 270.0891957145297511 4727.150383277800 +2676 0.2676 269.6169208024327872 4718.347858661402 +2677 0.2677 269.1455253606621909 4709.560976750301 +2678 0.2678 268.6750078263972341 4700.789708548400 +2679 0.2679 268.2053666397138727 4692.034025119101 +2680 0.2680 267.7366002435786640 4683.293897585299 +2681 0.2681 267.2687070838429122 4674.569297129501 +2682 0.2682 266.8016856092368130 4665.860194993000 +2683 0.2683 266.3355342713633149 4657.166562476699 +2684 0.2684 265.8702515246924918 4648.488370940300 +2685 0.2685 265.4058358265553466 4639.825591802399 +2686 0.2686 264.9422856371382409 4631.178196540101 +2687 0.2687 264.4795994194767559 4622.546156689199 +2688 0.2688 264.0177756394501216 4613.929443844001 +2689 0.2689 263.5568127657750779 4605.328029657001 +2690 0.2690 263.0967092700003036 4596.741885838701 +2691 0.2691 262.6374636265004483 4588.170984158201 +2692 0.2692 262.1790743124704477 4579.615296441702 +2693 0.2693 261.7215398079196689 4571.074794573800 +2694 0.2694 261.2648585956661691 4562.549450496301 +2695 0.2695 260.8090291613309546 4554.039236208500 +2696 0.2696 260.3540499933321257 4545.544123767599 +2697 0.2697 259.8999195828793631 4537.064085287100 +2698 0.2698 259.4466364239680729 4528.599092938301 +2699 0.2699 258.9941990133737022 4520.149118949399 +2700 0.2700 258.5426058506459981 4511.714135605000 +2701 0.2701 258.0918554381034369 4503.294115246599 +2702 0.2702 257.6419462808274830 4494.889030272301 +2703 0.2703 257.1928768866570181 4486.498853136600 +2704 0.2704 256.7446457661826571 4478.123556350500 +2705 0.2705 256.2972514327411204 4469.763112480599 +2706 0.2706 255.8506924024095781 4461.417494150101 +2707 0.2707 255.4049671940001929 4453.086674037801 +2708 0.2708 254.9600743290543789 4444.770624878200 +2709 0.2709 254.5160123318373735 4436.469319461801 +2710 0.2710 254.0727797293325807 4428.182730634200 +2711 0.2711 253.6303750512360295 4419.910831296700 +2712 0.2712 253.1887968299509168 4411.653594405700 +2713 0.2713 252.7480436005820081 4403.410992972500 +2714 0.2714 252.3081139009301808 4395.183000064100 +2715 0.2715 251.8690062714869100 4386.969588801499 +2716 0.2716 251.4307192554287838 4378.770732360999 +2717 0.2717 250.9932513986120455 4370.586403973501 +2718 0.2718 250.5566012495671657 4362.416576924001 +2719 0.2719 250.1207673594933567 4354.261224552301 +2720 0.2720 249.6857482822531153 4346.120320252299 +2721 0.2721 249.2515425743669084 4337.993837471999 +2722 0.2722 248.8181487950076587 4329.881749713100 +2723 0.2723 248.3855655059954302 4321.784030531700 +2724 0.2724 247.9537912717919710 4313.700653537200 +2725 0.2725 247.5228246594954555 4305.631592393100 +2726 0.2726 247.0926642388350274 4297.576820815601 +2727 0.2727 246.6633085821654845 4289.536312575101 +2728 0.2728 246.2347562644619927 4281.510041494701 +2729 0.2729 245.8070058633147141 4273.497981451101 +2730 0.2730 245.3800559589234922 4265.500106373300 +2731 0.2731 244.9539051340926221 4257.516390244000 +2732 0.2732 244.5285519742255360 4249.546807098000 +2733 0.2733 244.1039950673194880 4241.591331023101 +2734 0.2734 243.6802330039603817 4233.649936159300 +2735 0.2735 243.2572643773174548 4225.722596699499 +2736 0.2736 242.8350877831380501 4217.809286888400 +2737 0.2737 242.4137018197424709 4209.909981023000 +2738 0.2738 241.9931050880186945 4202.024653452301 +2739 0.2739 241.5732961914171995 4194.153278577500 +2740 0.2740 241.1542737359457647 4186.295830851201 +2741 0.2741 240.7360363301643247 4178.452284777801 +2742 0.2742 240.3185825851797688 4170.622614913500 +2743 0.2743 239.9019111146408250 4162.806795865399 +2744 0.2744 239.4860205347329156 4155.004802292598 +2745 0.2745 239.0709094641730417 4147.216608904700 +2746 0.2746 238.6565765242046666 4139.442190463000 +2747 0.2747 238.2430203385925438 4131.681521779501 +2748 0.2748 237.8302395336177142 4123.934577717000 +2749 0.2749 237.4182327380724189 4116.201333188999 +2750 0.2750 237.0069985832549833 4108.481763159900 +2751 0.2751 236.5965357029647862 4100.775842644300 +2752 0.2752 236.1868427334972012 4093.083546707399 +2753 0.2753 235.7779183136385939 4085.404850464500 +2754 0.2754 235.3697610846613202 4077.739729081199 +2755 0.2755 234.9623696903186101 4070.088157772900 +2756 0.2756 234.5557427768397076 4062.450111805299 +2757 0.2757 234.1498789929247550 4054.825566493699 +2758 0.2758 233.7447769897399041 4047.214497203100 +2759 0.2759 233.3404354209123426 4039.616879347999 +2760 0.2760 232.9368529425252916 4032.032688392799 +2761 0.2761 232.5340282131131175 4024.461899850599 +2762 0.2762 232.1319598936563864 4016.904489284199 +2763 0.2763 231.7306466475768900 4009.360432305601 +2764 0.2764 231.3300871407328430 4001.829704575501 +2765 0.2765 230.9302800414138801 3994.312281803601 +2766 0.2766 230.5312240203362535 3986.808139748699 +2767 0.2767 230.1329177506379153 3979.317254217900 +2768 0.2768 229.7353599078736579 3971.839601067099 +2769 0.2769 229.3385491700102818 3964.375156200600 +2770 0.2770 228.9424842174217076 3956.923895571001 +2771 0.2771 228.5471637328842007 3949.485795179300 +2772 0.2772 228.1525864015715115 3942.060831074599 +2773 0.2773 227.7587509110501003 3934.648979353900 +2774 0.2774 227.3656559512743058 3927.250216162100 +2775 0.2775 226.9733002145815703 3919.864517692400 +2776 0.2776 226.5816823956876931 3912.491860185000 +2777 0.2777 226.1908011916820556 3905.132219927998 +2778 0.2778 225.8006553020227898 3897.785573257301 +2779 0.2779 225.4112434285321456 3890.451896555600 +2780 0.2780 225.0225642753916873 3883.131166253299 +2781 0.2781 224.6346165491376325 3875.823358827700 +2782 0.2782 224.2473989586560776 3868.528450803400 +2783 0.2783 223.8609102151783077 3861.246418751802 +2784 0.2784 223.4751490322761640 3853.977239291200 +2785 0.2785 223.0901141258572693 3846.720889086600 +2786 0.2786 222.7058042141604517 3839.477344849600 +2787 0.2787 222.3222180177510552 3832.246583338399 +2788 0.2788 221.9393542595162501 3825.028581357699 +2789 0.2789 221.5572116646604570 3817.823315758200 +2790 0.2790 221.1757889607006859 3810.630763437201 +2791 0.2791 220.7950848774619317 3803.450901337899 +2792 0.2792 220.4150981470725696 3796.283706449502 +2793 0.2793 220.0358275039597231 3789.129155807301 +2794 0.2794 219.6572716848447726 3781.987226491899 +2795 0.2795 219.2794294287386663 3774.857895630301 +2796 0.2796 218.9022994769374293 3767.741140394499 +2797 0.2797 218.5258805730175879 3760.636938002301 +2798 0.2798 218.1501714628316222 3753.545265716801 +2799 0.2799 217.7751708945034750 3746.466100846201 +2800 0.2800 217.4008776184239480 3739.399420744301 +2801 0.2801 217.0272903872462393 3732.345202809600 +2802 0.2802 216.6544079558814815 3725.303424485699 +2803 0.2803 216.2822290814941368 3718.274063261200 +2804 0.2804 215.9107525234976208 3711.257096669100 +2805 0.2805 215.5399770435497828 3704.252502287700 +2806 0.2806 215.1699014055484440 3697.260257739199 +2807 0.2807 214.8005243756269351 3690.280340690701 +2808 0.2808 214.4318447221497195 3683.312728853602 +2809 0.2809 214.0638612157078740 3676.357399983399 +2810 0.2810 213.6965726291147121 3669.414331880100 +2811 0.2811 213.3299777374013502 3662.483502387400 +2812 0.2812 212.9640753178123305 3655.564889393199 +2813 0.2813 212.5988641498012157 3648.658470829299 +2814 0.2814 212.2343430150261838 3641.764224671100 +2815 0.2815 211.8705106973457362 3634.882128937799 +2816 0.2816 211.5073659828142354 3628.012161692301 +2817 0.2817 211.1449076596775853 3621.154301040700 +2818 0.2818 210.7831345183689109 3614.308525132701 +2819 0.2819 210.4220453515042095 3607.474812161199 +2820 0.2820 210.0616389538780311 3600.653140362401 +2821 0.2821 209.7019141224591294 3593.843488015500 +2822 0.2822 209.3428696563862275 3587.045833442600 +2823 0.2823 208.9845043569636402 3580.260155009100 +2824 0.2824 208.6268170276570402 3573.486431122701 +2825 0.2825 208.2698064740891937 3566.724640234001 +2826 0.2826 207.9134715040356696 3559.974760836400 +2827 0.2827 207.5578109274205474 3553.236771465799 +2828 0.2828 207.2028235563122394 3546.510650700100 +2829 0.2829 206.8485082049192272 3539.796377160101 +2830 0.2830 206.4948636895857987 3533.093929508399 +2831 0.2831 206.1418888287878701 3526.403286450099 +2832 0.2832 205.7895824431287508 3519.724426732100 +2833 0.2833 205.4379433553349941 3513.057329143199 +2834 0.2834 205.0869703902521053 3506.401972514401 +2835 0.2835 204.7366623748404777 3499.758335718001 +2836 0.2836 204.3870181381711575 3493.126397668400 +2837 0.2837 204.0380365114216659 3486.506137321399 +2838 0.2838 203.6897163278718779 3479.897533674301 +2839 0.2839 203.3420564228998728 3473.300565765701 +2840 0.2840 202.9950556339778132 3466.715212675699 +2841 0.2841 202.6487128006677381 3460.141453525601 +2842 0.2842 202.3030267646175844 3453.579267477500 +2843 0.2843 201.9579963695569518 3447.028633734901 +2844 0.2844 201.6136204612930953 3440.489531542100 +2845 0.2845 201.2698978877067759 3433.961940184199 +2846 0.2846 200.9268274987482243 3427.445838987100 +2847 0.2847 200.5844081464329918 3420.941207317501 +2848 0.2848 200.2426386848379991 3414.448024582400 +2849 0.2849 199.9015179700973874 3407.966270229599 +2850 0.2850 199.5610448603985674 3401.495923746899 +2851 0.2851 199.2212182159780696 3395.036964662799 +2852 0.2852 198.8820368991176224 3388.589372545901 +2853 0.2853 198.5434997741400878 3382.153127004800 +2854 0.2854 198.2056057074054536 3375.728207688100 +2855 0.2855 197.8683535673068263 3369.314594284700 +2856 0.2856 197.5317422242664520 3362.912266522999 +2857 0.2857 197.1957705507317371 3356.521204171200 +2858 0.2858 196.8604374211712980 3350.141387037500 +2859 0.2859 196.5257417120709533 3343.772794969400 +2860 0.2860 196.1916823019297738 3337.415407854000 +2861 0.2861 195.8582580712561878 3331.069205617701 +2862 0.2862 195.5254679025639746 3324.734168226600 +2863 0.2863 195.1933106803683700 3318.410275685601 +2864 0.2864 194.8617852911821444 3312.097508039000 +2865 0.2865 194.5308906235116808 3305.795845370101 +2866 0.2866 194.2006255678531090 3299.505267801400 +2867 0.2867 193.8709890166883554 3293.225755493901 +2868 0.2868 193.5419798644812772 3286.957288647800 +2869 0.2869 193.2135970076737976 3280.699847501899 +2870 0.2870 192.8858393446820401 3274.453412333402 +2871 0.2871 192.5587057758924345 3268.217963458499 +2872 0.2872 192.2321952036579376 3261.993481231601 +2873 0.2873 191.9063065322940815 3255.779946045501 +2874 0.2874 191.5810386680752515 3249.577338331299 +2875 0.2875 191.2563905192307629 3243.385638558500 +2876 0.2876 190.9323609959411101 3237.204827234500 +2877 0.2877 190.6089490103341291 3231.034884905001 +2878 0.2878 190.2861534764812177 3224.875792153300 +2879 0.2879 189.9639733103934987 3218.727529601001 +2880 0.2880 189.6424074300180678 3212.590077907400 +2881 0.2881 189.3214547552342424 3206.463417769099 +2882 0.2882 189.0011142078497244 3200.347529921100 +2883 0.2883 188.6813847115969054 3194.242395135099 +2884 0.2884 188.3622651921290867 3188.147994220999 +2885 0.2885 188.0437545770167560 3182.064308025700 +2886 0.2886 187.7258517957438073 3175.991317433500 +2887 0.2887 187.4085557797038462 3169.929003365800 +2888 0.2888 187.0918654621964947 3163.877346781499 +2889 0.2889 186.7757797784236118 3157.836328676101 +2890 0.2890 186.4602976654856832 3151.805930082401 +2891 0.2891 186.1454180623780701 3145.786132070099 +2892 0.2892 185.8311399099872858 3139.776915745400 +2893 0.2893 185.5174621510874431 3133.778262251601 +2894 0.2894 185.2043837303364455 3127.790152768501 +2895 0.2895 184.8919035942724065 3121.812568512400 +2896 0.2896 184.5800206913099828 3115.845490736299 +2897 0.2897 184.2687339717366797 3109.888900729600 +2898 0.2898 183.9580423877093267 3103.942779817700 +2899 0.2899 183.6479448932502976 3098.007109362599 +2900 0.2900 183.3384404442440427 3092.081870762500 +2901 0.2901 183.0295279984333376 3086.167045451401 +2902 0.2902 182.7212065154157870 3080.262614899599 +2903 0.2903 182.4134749566401581 3074.368560613200 +2904 0.2904 182.1063322854028002 3068.484864134200 +2905 0.2905 181.7997774668440627 3062.611507040501 +2906 0.2906 181.4938094679447715 3056.748470945398 +2907 0.2907 181.1884272575225907 3050.895737498100 +2908 0.2908 180.8836298062285266 3045.053288383300 +2909 0.2909 180.5794160865432900 3039.221105321300 +2910 0.2910 180.2757850727738571 3033.399170067300 +2911 0.2911 179.9727357410498598 3027.587464412500 +2912 0.2912 179.6702670693200901 3021.785970182800 +2913 0.2913 179.3683780373489753 3015.994669239499 +2914 0.2914 179.0670676267130546 3010.213543479000 +2915 0.2915 178.7663348207974821 3004.442574832699 +2916 0.2916 178.4661786047925034 2998.681745266900 +2917 0.2917 178.1665979656900163 2992.931036782600 +2918 0.2918 177.8675918922800747 2987.190431416000 +2919 0.2919 177.5691593751473931 2981.459911237600 +2920 0.2920 177.2712994066678789 2975.739458352800 +2921 0.2921 176.9740109810051649 2970.029054901299 +2922 0.2922 176.6772930941072275 2964.328683057700 +2923 0.2923 176.3811447437028050 2958.638325030499 +2924 0.2924 176.0855649292981582 2952.957963062699 +2925 0.2925 175.7905526521734316 2947.287579432001 +2926 0.2926 175.4961069153793574 2941.627156449500 +2927 0.2927 175.2022267237338156 2935.976676461200 +2928 0.2928 174.9089110838184240 2930.336121846400 +2929 0.2929 174.6161590039751559 2924.705475019100 +2930 0.2930 174.3239694943028724 2919.084718426599 +2931 0.2931 174.0323415666540257 2913.473834550199 +2932 0.2932 173.7412742346312768 2907.872805905001 +2933 0.2933 173.4507665135840284 2902.281615039801 +2934 0.2934 173.1608174206051842 2896.700244536900 +2935 0.2935 172.8714259745277104 2891.128677012301 +2936 0.2936 172.5825911959213386 2885.566895115100 +2937 0.2937 172.2943121070891834 2880.014881528001 +2938 0.2938 172.0065877320644177 2874.472618967100 +2939 0.2939 171.7194170966069748 2868.940090181601 +2940 0.2940 171.4327992282001958 2863.417277953900 +2941 0.2941 171.1467331560475316 2857.904165099400 +2942 0.2942 170.8612179110692182 2852.400734466601 +2943 0.2943 170.5762525258990365 2846.906968937199 +2944 0.2944 170.2918360348809301 2841.422851425199 +2945 0.2945 170.0079674740657651 2835.948364877901 +2946 0.2946 169.7246458812081187 2830.483492275000 +2947 0.2947 169.4418702957628966 2825.028216629300 +2948 0.2948 169.1596397588821503 2819.582520985801 +2949 0.2949 168.8779533134117514 2814.146388422001 +2950 0.2950 168.5968100038882369 2808.719802048201 +2951 0.2951 168.3162088765354838 2803.302745006800 +2952 0.2952 168.0361489792615259 2797.895200472500 +2953 0.2953 167.7566293616552855 2792.497151652500 +2954 0.2954 167.4776490749833613 2787.108581786000 +2955 0.2955 167.1992071721868456 2781.729474144300 +2956 0.2956 166.9213027078781124 2776.359812030600 +2957 0.2957 166.6439347383375491 2770.999578780400 +2958 0.2958 166.3671023215104867 2765.648757760899 +2959 0.2959 166.0908045170038747 2760.307332371100 +2960 0.2960 165.8150403860832398 2754.975286041799 +2961 0.2961 165.5398089916693607 2749.652602235699 +2962 0.2962 165.2651093983352268 2744.339264446699 +2963 0.2963 164.9909406723028837 2739.035256200401 +2964 0.2964 164.7173018814401360 2733.740561054388 +2965 0.2965 164.4441920952575629 2728.455162596971 +2966 0.2966 164.1716103849053070 2723.179044448028 +2967 0.2967 163.8995558231699476 2717.912190259070 +2968 0.2968 163.6280274844713745 2712.654583712381 +2969 0.2969 163.3570244448596611 2707.406208521630 +2970 0.2970 163.0865457820119957 2702.167048431491 +2971 0.2971 162.8165905752295259 2696.937087217719 +2972 0.2972 162.5471579054342897 2691.716308687010 +2973 0.2973 162.2782468551660884 2686.504696676880 +2974 0.2974 162.0098565085794462 2681.302235055760 +2975 0.2975 161.7419859514405118 2676.108907722770 +2976 0.2976 161.4746342711239890 2670.924698607680 +2977 0.2977 161.2078005566100671 2665.749591670979 +2978 0.2978 160.9414838984813230 2660.583570903820 +2979 0.2979 160.6756833889197651 2655.426620327440 +2980 0.2980 160.4103981217036790 2650.278723993999 +2981 0.2981 160.1456271922046994 2645.139865985610 +2982 0.2982 159.8813696973846561 2640.010030415069 +2983 0.2983 159.6176247357926457 2634.889201425111 +2984 0.2984 159.3543914075619625 2629.777363188559 +2985 0.2985 159.0916688144070861 2624.674499908870 +2986 0.2986 158.8294560596206964 2619.580595818879 +2987 0.2987 158.5677522480706614 2614.495635181751 +2988 0.2988 158.3065564861970529 2609.419602290560 +2989 0.2989 158.0458678820091052 2604.352481468259 +2990 0.2990 157.7856855450823161 2599.294257067349 +2991 0.2991 157.5260085865554345 2594.244913470349 +2992 0.2992 157.2668361191274471 2589.204435089221 +2993 0.2993 157.0081672570547084 2584.172806365650 +2994 0.2994 156.7500011161478994 2579.150011770771 +2995 0.2995 156.4923368137691000 2574.136035805101 +2996 0.2996 156.2351734688288900 2569.130862998840 +2997 0.2997 155.9785102017833651 2564.134477911390 +2998 0.2998 155.7223461346312376 2559.146865131199 +2999 0.2999 155.4666803909108523 2554.168009276380 +3000 0.3000 155.2115120956973442 2549.197894993911 +3001 0.3001 154.9568403755996542 2544.236506959851 +3002 0.3002 154.7026643587576871 2539.283829879440 +3003 0.3003 154.4489831748393840 2534.339848486719 +3004 0.3004 154.1957959550377950 2529.404547544831 +3005 0.3005 153.9431018320682654 2524.477911845679 +3006 0.3006 153.6908999401654796 2519.559926209951 +3007 0.3007 153.4391894150806195 2514.650575486990 +3008 0.3008 153.1879693940785216 2509.749844554819 +3009 0.3009 152.9372390159347788 2504.857718320280 +3010 0.3010 152.6869974209328404 2499.974181718530 +3011 0.3011 152.4372437508612563 2495.099219713280 +3012 0.3012 152.1879771490107487 2490.232817296659 +3013 0.3013 151.9391967601714555 2485.374959489089 +3014 0.3014 151.6909017306300314 2480.525631339411 +3015 0.3015 151.4430912081668339 2475.684817924821 +3016 0.3016 151.1957643420530815 2470.852504350240 +3017 0.3017 150.9489202830480963 2466.028675749269 +3018 0.3018 150.7025581833964623 2461.213317283209 +3019 0.3019 150.4566771968252397 2456.406414141480 +3020 0.3020 150.2112764785410945 2451.607951541420 +3021 0.3021 149.9663551852275987 2446.817914728370 +3022 0.3022 149.7219124750424157 2442.036288975291 +3023 0.3023 149.4779475076144877 2437.263059583220 +3024 0.3024 149.2344594440413061 2432.498211880420 +3025 0.3025 148.9914474468861272 2427.741731223330 +3026 0.3026 148.7489106801751859 2422.993602995610 +3027 0.3027 148.5068483093949681 2418.253812608731 +3028 0.3028 148.2652595014894530 2413.522345501389 +3029 0.3029 148.0241434248573853 2408.799187139921 +3030 0.3030 147.7834992493494894 2404.084323017720 +3031 0.3031 147.5433261462657981 2399.377738655920 +3032 0.3032 147.3036232883528669 2394.679419602549 +3033 0.3033 147.0643898498011026 2389.989351432891 +3034 0.3034 146.8256250062419781 2385.307519749571 +3035 0.3035 146.5873279347453888 2380.633910181959 +3036 0.3036 146.3494978138169529 2375.968508386670 +3037 0.3037 146.1121338233952542 2371.311300047260 +3038 0.3038 145.8752351448491993 2366.662270874040 +3039 0.3039 145.6388009609752885 2362.021406604459 +3040 0.3040 145.4028304559949447 2357.388693002400 +3041 0.3041 145.1673228155518984 2352.764115858781 +3042 0.3042 144.9322772267094024 2348.147660991061 +3043 0.3043 144.6976928779477021 2343.539314243151 +3044 0.3044 144.4635689591612504 2338.939061485931 +3045 0.3045 144.2299046616561213 2334.346888616519 +3046 0.3046 143.9966991781473666 2329.762781558509 +3047 0.3047 143.7639517027563443 2325.186726262020 +3048 0.3048 143.5316614310080752 2320.618708703210 +3049 0.3049 143.2998275598286568 2316.058714884970 +3050 0.3050 143.0684492875425917 2311.506730836049 +3051 0.3051 142.8375258138702009 2306.962742611591 +3052 0.3052 142.6070563399249806 2302.426736292759 +3053 0.3053 142.3770400682109880 2297.898697986850 +3054 0.3054 142.1474762026202825 2293.378613827110 +3055 0.3055 141.9183639484302830 2288.866469972860 +3056 0.3056 141.6897025123011815 2284.362252609099 +3057 0.3057 141.4614911022733850 2279.865947947021 +3058 0.3058 141.2337289277648722 2275.377542223239 +3059 0.3059 141.0064151995686927 2270.897021700430 +3060 0.3060 140.7795491298503237 2266.424372666819 +3061 0.3061 140.5531299321451684 2261.959581436140 +3062 0.3062 140.3271568213559704 2257.502634348009 +3063 0.3063 140.1016290137501983 2253.053517767330 +3064 0.3064 139.8765457269576018 2248.612218084520 +3065 0.3065 139.6519061799675967 2244.178721715631 +3066 0.3066 139.4277095931267354 2239.753015101711 +3067 0.3067 139.2039551881361774 2235.335084709410 +3068 0.3068 138.9806421880491882 2230.924917030579 +3069 0.3069 138.7577698172685530 2226.522498582150 +3070 0.3070 138.5353373015441321 2222.127815906550 +3071 0.3071 138.3133438679702749 2217.740855570861 +3072 0.3072 138.0917887449833472 2213.361604167561 +3073 0.3073 137.8706711623592582 2208.990048313979 +3074 0.3074 137.6499903512109313 2204.626174652431 +3075 0.3075 137.4297455439858027 2200.269969850109 +3076 0.3076 137.2099359744633489 2195.921420599079 +3077 0.3077 136.9905608777525856 2191.580513616240 +3078 0.3078 136.7716194902896234 2187.247235643161 +3079 0.3079 136.5531110498351666 2182.921573446170 +3080 0.3080 136.3350347954720405 2178.603513816130 +3081 0.3081 136.1173899676028043 2174.293043568550 +3082 0.3082 135.9001758079471927 2169.990149543470 +3083 0.3083 135.6833915595397571 2165.694818605420 +3084 0.3084 135.4670364667273077 2161.407037643521 +3085 0.3085 135.2511097751665829 2157.126793570980 +3086 0.3086 135.0356107318217482 2152.854073325519 +3087 0.3087 134.8205385849620086 2148.588863869150 +3088 0.3088 134.6058925841591360 2144.331152188090 +3089 0.3089 134.3916719802851105 2140.080925292679 +3090 0.3090 134.1778760255095904 2135.838170217479 +3091 0.3091 133.9645039732976670 2131.602874021150 +3092 0.3092 133.7515550784073071 2127.375023786220 +3093 0.3093 133.5390285968870216 2123.154606619451 +3094 0.3094 133.3269237860734791 2118.941609651230 +3095 0.3095 133.1152399045891173 2114.736020036280 +3096 0.3096 132.9039762123396713 2110.537824952600 +3097 0.3097 132.6931319705119279 2106.347011602369 +3098 0.3098 132.4827064415712528 2102.163567211359 +3099 0.3099 132.2726988892592317 2097.987479029141 +3100 0.3100 132.0631085785913399 2093.818734328761 +3101 0.3101 131.8539347758545546 2089.657320406941 +3102 0.3102 131.6451767486049960 2085.503224583981 +3103 0.3103 131.4368337656656252 2081.356434203590 +3104 0.3104 131.2289050971237998 2077.216936632960 +3105 0.3105 131.0213900143290005 2073.084719262790 +3106 0.3106 130.8142877898905283 2068.959769506831 +3107 0.3107 130.6075976976750610 2064.842074802400 +3108 0.3108 130.4013190128044357 2060.731622609970 +3109 0.3109 130.1954510116532902 2056.628400413179 +3110 0.3110 129.9899929718466751 2052.532395718970 +3111 0.3111 129.7849441722578661 2048.443596057261 +3112 0.3112 129.5803038930059472 2044.361988980920 +3113 0.3113 129.3760714154535947 2040.287562066169 +3114 0.3114 129.1722460222046891 2036.220302911850 +3115 0.3115 128.9688269971020986 2032.160199139829 +3116 0.3116 128.7658136252253485 2028.107238394930 +3117 0.3117 128.5632051928883470 2024.061408344880 +3118 0.3118 128.3610009876371123 2020.022696679800 +3119 0.3119 128.1592002982474696 2015.991091112881 +3120 0.3120 127.9578024147228348 2011.966579379890 +3121 0.3121 127.7568066282918835 2007.949149239270 +3122 0.3122 127.5562122314063203 2003.938788472011 +3123 0.3123 127.3560185177386330 1999.935484881611 +3124 0.3124 127.1562247821798479 1995.939226294209 +3125 0.3125 126.9568303208372271 1991.950000558150 +3126 0.3126 126.7578344310320944 1987.967795544369 +3127 0.3127 126.5592364112975758 1983.992599146111 +3128 0.3128 126.3610355613763261 1980.024399278940 +3129 0.3129 126.1632311822183397 1976.063183880751 +3130 0.3130 125.9658225759787342 1972.108940911481 +3131 0.3131 125.7688090460154910 1968.161658353391 +3132 0.3132 125.5721898968872807 1964.221324210859 +3133 0.3133 125.3759644343512178 1960.287926510331 +3134 0.3134 125.1801319653607010 1956.361453300140 +3135 0.3135 124.9846917980631531 1952.441892650850 +3136 0.3136 124.7896432417978616 1948.529232654899 +3137 0.3137 124.5949856070937898 1944.623461426570 +3138 0.3138 124.4007182056673599 1940.724567101970 +3139 0.3139 124.2068403504203076 1936.832537839189 +3140 0.3140 124.0133513554374503 1932.947361817980 +3141 0.3141 123.8202505359845702 1929.069027239759 +3142 0.3142 123.6275372085061974 1925.197522327649 +3143 0.3143 123.4352106906234923 1921.332835326579 +3144 0.3144 123.2432703011320285 1917.474954502830 +3145 0.3145 123.0517153599996618 1913.623868144388 +3146 0.3146 122.8605451883644122 1909.779564560660 +3147 0.3147 122.6697591085322472 1905.942032082570 +3148 0.3148 122.4793564439749929 1902.111259062391 +3149 0.3149 122.2893365193281880 1898.287233873771 +3150 0.3150 122.0996986603889098 1894.469944911891 +3151 0.3151 121.9104421941136707 1890.659380592930 +3152 0.3152 121.7215664486163007 1886.855529354450 +3153 0.3153 121.5330707531658163 1883.058379655171 +3154 0.3154 121.3449544381843026 1879.267919975020 +3155 0.3155 121.1572168352448102 1875.484138814902 +3156 0.3156 120.9698572770692238 1871.707024696960 +3157 0.3157 120.7828750975261585 1867.936566164350 +3158 0.3158 120.5962696316288856 1864.172751781140 +3159 0.3159 120.4100402155332148 1860.415570132202 +3160 0.3160 120.2241861865354196 1856.665009823630 +3161 0.3161 120.0387068830701338 1852.921059482089 +3162 0.3162 119.8536016447082631 1849.183707755259 +3163 0.3163 119.6688698121549237 1845.452943311409 +3164 0.3164 119.4845107272473683 1841.728754839609 +3165 0.3165 119.3005237329528967 1838.011131049749 +3166 0.3166 119.1169081733668094 1834.300060672042 +3167 0.3167 118.9336633937103187 1830.595532457730 +3168 0.3168 118.7507887403285167 1826.897535178321 +3169 0.3169 118.5682835606883145 1823.206057625750 +3170 0.3170 118.3861472033763960 1819.521088612761 +3171 0.3171 118.2043790180971428 1815.842616972299 +3172 0.3172 118.0229783556706309 1812.170631557821 +3173 0.3173 117.8419445680305842 1808.505121242979 +3174 0.3174 117.6612770082223420 1804.846074921881 +3175 0.3175 117.4809750304007991 1801.193481508850 +3176 0.3176 117.3010379898284299 1797.547329938510 +3177 0.3177 117.1214652428732279 1793.907609165481 +3178 0.3178 116.9422561470067166 1790.274308164719 +3179 0.3179 116.7634100608019168 1786.647415931198 +3180 0.3180 116.5849263439313575 1783.026921480059 +3181 0.3181 116.4068043571650435 1779.412813846311 +3182 0.3182 116.2290434623684803 1775.805082085039 +3183 0.3183 116.0516430225006701 1772.203715271269 +3184 0.3184 115.8746024016121083 1768.608702499921 +3185 0.3185 115.6979209648428224 1765.020032885781 +3186 0.3186 115.5215980784203680 1761.437695563440 +3187 0.3187 115.3456331096578396 1757.861679687239 +3188 0.3188 115.1700254269519093 1754.291974431480 +3189 0.3189 114.9947743997808516 1750.728568989711 +3190 0.3190 114.8198793987025823 1747.171452575731 +3191 0.3191 114.6453397953526689 1743.620614422420 +3192 0.3192 114.4711549624424123 1740.076043782579 +3193 0.3193 114.2973242737568569 1736.537729928390 +3194 0.3194 114.1238471041528442 1733.005662151751 +3195 0.3195 113.9507228295570798 1729.479829763650 +3196 0.3196 113.7779508269641440 1725.960222094940 +3197 0.3197 113.6055304744346159 1722.446828495569 +3198 0.3198 113.4334611510930984 1718.939638334870 +3199 0.3199 113.2617422371262847 1715.438641001470 +3200 0.3200 113.0903731137810411 1711.943825903480 +3201 0.3201 112.9193531633624588 1708.455182468060 +3202 0.3202 112.7486817692319789 1704.972700141461 +3203 0.3203 112.5783583158054455 1701.496368389320 +3204 0.3204 112.4083821885511725 1698.026176696219 +3205 0.3205 112.2387527739880682 1694.562114565879 +3206 0.3206 112.0694694596837167 1691.104171521070 +3207 0.3207 111.9005316342524878 1687.652337103611 +3208 0.3208 111.7319386873536047 1684.206600874131 +3209 0.3209 111.5636900096892816 1680.766952412290 +3210 0.3210 111.3957849930028345 1677.333381316710 +3211 0.3211 111.2282230300767623 1673.905877204630 +3212 0.3212 111.0610035147309134 1670.484429712309 +3213 0.3213 110.8941258418205678 1667.069028494660 +3214 0.3214 110.7275894072345608 1663.659663225450 +3215 0.3215 110.5613936078934358 1660.256323596990 +3216 0.3216 110.3955378417475686 1656.858999320370 +3217 0.3217 110.2300215077752910 1653.467680125221 +3218 0.3218 110.0648440059810440 1650.082355759780 +3219 0.3219 109.9000047373935018 1646.703015990930 +3220 0.3220 109.7355031040637670 1643.329650603861 +3221 0.3221 109.5713385090634517 1639.962249402530 +3222 0.3222 109.4075103564828737 1636.600802208899 +3223 0.3223 109.2440180514292365 1633.245298863789 +3224 0.3224 109.0808610000247398 1629.895729226178 +3225 0.3225 108.9180386094047748 1626.552083173210 +3226 0.3226 108.7555502877160762 1623.214350600660 +3227 0.3227 108.5933954441149325 1619.882521422200 +3228 0.3228 108.4315734887653235 1616.556585569930 +3229 0.3229 108.2700838328371162 1613.236532994129 +3230 0.3230 108.1089258885042454 1609.922353663280 +3231 0.3231 107.9480990689428950 1606.614037563639 +3232 0.3232 107.7876027883297212 1603.311574699879 +3233 0.3233 107.6274364618400057 1600.014955094561 +3234 0.3234 107.4675995056458646 1596.724168788360 +3235 0.3235 107.3080913369144582 1593.439205839652 +3236 0.3236 107.1489113738062287 1590.160056325061 +3237 0.3237 106.9900590354730383 1586.886710338871 +3238 0.3238 106.8315337420564362 1583.619157993289 +3239 0.3239 106.6733349146858529 1580.357389418399 +3240 0.3240 106.5154619754768390 1577.101394761950 +3241 0.3241 106.3579143475292597 1573.851164189589 +3242 0.3242 106.2006914549255470 1570.606687884581 +3243 0.3243 106.0437927227289236 1567.367956047910 +3244 0.3244 105.8872175769816266 1564.134958897990 +3245 0.3245 105.7309654447031591 1560.907686671251 +3246 0.3246 105.5750357538885282 1557.686129621370 +3247 0.3247 105.4194279335064692 1554.470278019680 +3248 0.3248 105.2641414134977396 1551.260122154968 +3249 0.3249 105.1091756247733144 1548.055652333520 +3250 0.3250 104.9545299992126814 1544.856858879060 +3251 0.3251 104.8002039696620926 1541.663732132680 +3252 0.3252 104.6461969699328165 1538.476262452868 +3253 0.3253 104.4925084347994044 1535.294440215430 +3254 0.3254 104.3391377999979568 1532.118255813441 +3255 0.3255 104.1860845022244177 1528.947699657281 +3256 0.3256 104.0333479791328273 1525.782762174500 +3257 0.3257 103.8809276693336017 1522.623433809891 +3258 0.3258 103.7288230123918424 1519.469705025369 +3259 0.3259 103.5770334488255742 1516.321566299970 +3260 0.3260 103.4255584201040818 1513.179008129840 +3261 0.3261 103.2743973686461771 1510.042021028190 +3262 0.3262 103.1235497378185073 1506.910595525220 +3263 0.3263 102.9730149719338357 1503.784722168130 +3264 0.3264 102.8227925162493790 1500.664391521070 +3265 0.3265 102.6728818169650737 1497.549594165090 +3266 0.3266 102.5232823212219131 1494.440320698199 +3267 0.3267 102.3739934771002424 1491.336561735179 +3268 0.3268 102.2250147336180959 1488.238307907670 +3269 0.3269 102.0763455407295055 1485.145549864081 +3270 0.3270 101.9279853493228245 1482.058278269589 +3271 0.3271 101.7799336112190360 1478.976483806100 +3272 0.3272 101.6321897791701190 1475.900157172140 +3273 0.3273 101.4847533068573568 1472.829289083011 +3274 0.3274 101.3376236488896893 1469.763870270481 +3275 0.3275 101.1908002608020070 1466.703891483061 +3276 0.3276 101.0442825990535738 1463.649343485709 +3277 0.3277 100.8980701210262936 1460.600217059951 +3278 0.3278 100.7521622850231040 1457.556503003791 +3279 0.3279 100.6065585502663282 1454.518192131662 +3280 0.3280 100.4612583768960263 1451.485275274490 +3281 0.3281 100.3162612259683186 1448.457743279549 +3282 0.3282 100.1715665594538223 1445.435587010450 +3283 0.3283 100.0271738402359460 1442.418797347169 +3284 0.3284 99.8830825321092846 1439.407365185989 +3285 0.3285 99.7392920997780124 1436.401281439401 +3286 0.3286 99.5958020088542355 1433.400537036170 +3287 0.3287 99.4526117258563573 1430.405122921260 +3288 0.3288 99.3097207182075010 1427.415030055759 +3289 0.3289 99.1671284542338611 1424.430249416961 +3290 0.3290 99.0248344031630978 1421.450771998201 +3291 0.3291 98.8828380351227452 1418.476588808919 +3292 0.3292 98.7411388211385770 1415.507690874560 +3293 0.3293 98.5997362331330152 1412.544069236619 +3294 0.3294 98.4586297439235523 1409.585714952531 +3295 0.3295 98.3178188272211457 1406.632619095721 +3296 0.3296 98.1773029576285836 1403.684772755500 +3297 0.3297 98.0370816106389498 1400.742167037060 +3298 0.3298 97.8971542626340323 1397.804793061419 +3299 0.3299 97.7575203908826893 1394.872641965470 +3300 0.3300 97.6181794735393282 1391.945704901869 +3301 0.3301 97.4791309896422860 1389.023973039019 +3302 0.3302 97.3403744191122797 1386.107437561080 +3303 0.3303 97.2019092427508298 1383.196089667860 +3304 0.3304 97.0637349422386961 1380.289920574870 +3305 0.3305 96.9258510001342870 1377.388921513240 +3306 0.3306 96.7882568998721382 1374.493083729731 +3307 0.3307 96.6509521257613216 1371.602398486660 +3308 0.3308 96.5139361629838959 1368.716857061851 +3309 0.3309 96.3772084975933723 1365.836450748699 +3310 0.3310 96.2407686165131366 1362.961170856021 +3311 0.3311 96.1046160075349292 1360.091008708149 +3312 0.3312 95.9687501593172811 1357.225955644820 +3313 0.3313 95.8331705613839802 1354.366003021089 +3314 0.3314 95.6978767041225495 1351.511142207481 +3315 0.3315 95.5628680787826852 1348.661364589781 +3316 0.3316 95.4281441774747350 1345.816661569081 +3317 0.3317 95.2937044931681925 1342.977024561800 +3318 0.3318 95.1595485196901336 1340.142444999500 +3319 0.3319 95.0256757517237105 1337.312914329030 +3320 0.3320 94.8920856848066450 1334.488424012400 +3321 0.3321 94.7587778153296796 1331.668965526770 +3322 0.3322 94.6257516405351140 1328.854530364410 +3323 0.3323 94.4930066585152559 1326.045110032699 +3324 0.3324 94.3605423682109148 1323.240696054079 +3325 0.3325 94.2283582694099096 1320.441279966020 +3326 0.3326 94.0964538627455624 1317.646853321001 +3327 0.3327 93.9648286496951926 1314.857407686450 +3328 0.3328 93.8334821325786379 1312.072934644740 +3329 0.3329 93.7024138145567349 1309.293425793229 +3330 0.3330 93.5716231996298689 1306.518872744090 +3331 0.3331 93.4411097926364391 1303.749267124369 +3332 0.3332 93.3108730992514239 1300.984600575961 +3333 0.3333 93.1809126259848455 1298.224864755541 +3334 0.3334 93.0512278801803348 1295.470051334559 +3335 0.3335 92.9218183700136393 1292.720151999220 +3336 0.3336 92.7926836044911596 1289.975158450439 +3337 0.3337 92.6638230934484426 1287.235062403779 +3338 0.3338 92.5352363475487749 1284.499855589551 +3339 0.3339 92.4069228782816623 1281.769529752570 +3340 0.3340 92.2788821979614227 1279.044076652351 +3341 0.3341 92.1511138197256656 1276.323488062930 +3342 0.3342 92.0236172575338713 1273.607755772880 +3343 0.3343 91.8963920261659553 1270.896871585351 +3344 0.3344 91.7694376412207902 1268.190827317911 +3345 0.3345 91.6427536191147709 1265.489614802589 +3346 0.3346 91.5163394770803507 1262.793225885909 +3347 0.3347 91.3901947331646198 1260.101652428711 +3348 0.3348 91.2643189062278708 1257.414886306270 +3349 0.3349 91.1387115159421484 1254.732919408169 +3350 0.3350 91.0133720827898287 1252.055743638331 +3351 0.3351 90.8883001280621556 1249.383350914991 +3352 0.3352 90.7634951738578764 1246.715733170589 +3353 0.3353 90.6389567430817493 1244.052882351831 +3354 0.3354 90.5146843594431800 1241.394790419629 +3355 0.3355 90.3906775474547430 1238.741449349091 +3356 0.3356 90.2669358324308178 1236.092851129440 +3357 0.3357 90.1434587404861389 1233.448987764060 +3358 0.3358 90.0202457985344182 1230.809851270390 +3359 0.3359 89.8972965342868946 1228.175433679980 +3360 0.3360 89.7746104762509702 1225.545727038410 +3361 0.3361 89.6521871537287893 1222.920723405249 +3362 0.3362 89.5300260968158170 1220.300414854099 +3363 0.3363 89.4081268363994894 1217.684793472489 +3364 0.3364 89.2864889041577641 1215.073851361890 +3365 0.3365 89.1651118325577841 1212.467580637689 +3366 0.3366 89.0439951548544428 1209.865973429160 +3367 0.3367 88.9231384050890199 1207.269021879400 +3368 0.3368 88.8025411180877882 1204.676718145331 +3369 0.3369 88.6822028294606355 1202.089054397720 +3370 0.3370 88.5621230755997004 1199.506022821080 +3371 0.3371 88.4423013936779654 1196.927615613650 +3372 0.3372 88.3227373216479066 1194.353824987410 +3373 0.3373 88.2034303982401298 1191.784643168060 +3374 0.3374 88.0843801629619776 1189.220062394909 +3375 0.3375 87.9655861560961796 1186.660074920940 +3376 0.3376 87.8470479186994879 1184.104673012761 +3377 0.3377 87.7287649926013273 1181.553848950530 +3378 0.3378 87.6107369204024025 1179.007595028000 +3379 0.3379 87.4929632454733763 1176.465903552449 +3380 0.3380 87.3754435119535202 1173.928766844660 +3381 0.3381 87.2581772647493352 1171.396177238909 +3382 0.3382 87.1411640495332449 1168.868127082910 +3383 0.3383 87.0244034127422026 1166.344608737811 +3384 0.3384 86.9078949015763982 1163.825614578210 +3385 0.3385 86.7916380639978939 1161.311136992011 +3386 0.3386 86.6756324487292602 1158.801168380531 +3387 0.3387 86.5598776052523107 1156.295701158399 +3388 0.3388 86.4443730838067097 1153.794727753520 +3389 0.3389 86.3291184353886791 1151.298240607111 +3390 0.3390 86.2141132117496483 1148.806232173619 +3391 0.3391 86.0993569653949322 1146.318694920719 +3392 0.3392 85.9848492495824388 1143.835621329289 +3393 0.3393 85.8705896183213042 1141.357003893400 +3394 0.3394 85.7565776263706283 1138.882835120240 +3395 0.3395 85.6428128292381103 1136.413107530150 +3396 0.3396 85.5292947831787700 1133.947813656519 +3397 0.3397 85.4160230451936542 1131.486946045900 +3398 0.3398 85.3029971730284728 1129.030497257801 +3399 0.3399 85.1902167251723483 1126.578459864830 +3400 0.3400 85.0776812608564796 1124.130826452521 +3401 0.3401 84.9653903400528776 1121.687589619420 +3402 0.3402 84.8533435234730575 1119.248741977030 +3403 0.3403 84.7415403725667176 1116.814276149779 +3404 0.3404 84.6299804495204739 1114.384184774970 +3405 0.3405 84.5186633172565820 1111.958460502799 +3406 0.3406 84.4075885394316288 1109.537095996300 +3407 0.3407 84.2967556804352540 1107.120083931330 +3408 0.3408 84.1861643053888571 1104.707416996570 +3409 0.3409 84.0758139801443605 1102.299087893449 +3410 0.3410 83.9657042712828741 1099.895089336151 +3411 0.3411 83.8558347461134872 1097.495414051610 +3412 0.3412 83.7462049726719329 1095.100054779420 +3413 0.3413 83.6368145197193655 1092.709004271929 +3414 0.3414 83.5276629567410680 1090.322255294040 +3415 0.3415 83.4187498539452008 1087.939800623371 +3416 0.3416 83.3100747822615233 1085.561633050081 +3417 0.3417 83.2016373133401714 1083.187745376950 +3418 0.3418 83.0934370195503647 1080.818130419321 +3419 0.3419 82.9854734739791411 1078.452781005029 +3420 0.3420 82.8777462504301639 1076.091689974460 +3421 0.3421 82.7702549234224136 1073.734850180450 +3422 0.3422 82.6629990681889808 1071.382254488341 +3423 0.3423 82.5559782606757722 1069.033895775869 +3424 0.3424 82.4491920775403173 1066.689766933209 +3425 0.3425 82.3426400961505038 1064.349860862920 +3426 0.3426 82.2363218945833552 1062.014170479920 +3427 0.3427 82.1302370516237801 1059.682688711490 +3428 0.3428 82.0243851467633505 1057.355408497209 +3429 0.3429 81.9187657601990367 1055.032322788950 +3430 0.3430 81.8133784728320421 1052.713424550891 +3431 0.3431 81.7082228662665244 1050.398706759409 +3432 0.3432 81.6032985228084016 1048.088162403150 +3433 0.3433 81.4986050254641015 1045.781784482971 +3434 0.3434 81.3941419579393539 1043.479566011840 +3435 0.3435 81.2899089046380112 1041.181500014970 +3436 0.3436 81.1859054506607833 1038.887579529620 +3437 0.3437 81.0821311818040442 1036.597797605230 +3438 0.3438 80.9785856845586238 1034.312147303280 +3439 0.3439 80.8752685461085861 1032.030621697339 +3440 0.3440 80.7721793543300635 1029.753213873030 +3441 0.3441 80.6693176977900208 1027.479916927939 +3442 0.3442 80.5666831657450331 1025.210723971681 +3443 0.3443 80.4642753481401485 1022.945628125870 +3444 0.3444 80.3620938356076522 1020.684622524020 +3445 0.3445 80.2601382194658726 1018.427700311620 +3446 0.3446 80.1584080917179875 1016.174854646010 +3447 0.3447 80.0569030450508592 1013.926078696431 +3448 0.3448 79.9556226728338402 1011.681365644030 +3449 0.3449 79.8545665691175515 1009.440708681711 +3450 0.3450 79.7537343286327598 1007.204101014249 +3451 0.3451 79.6531255467891413 1004.971535858171 +3452 0.3452 79.5527398196741444 1002.743006441829 +3453 0.3453 79.4525767440517825 1000.518506005270 +3454 0.3454 79.3526359173615106 998.298027800280 +3455 0.3455 79.2529169377169751 996.081565090350 +3456 0.3456 79.1534194039049197 993.869111150640 +3457 0.3457 79.0541429153839914 991.660659267990 +3458 0.3458 78.9550870722835469 989.456202740849 +3459 0.3459 78.8562514754025443 987.255734879330 +3460 0.3460 78.7576357262083206 985.059249005060 +3461 0.3461 78.6592394268354980 982.866738451290 +3462 0.3462 78.5610621800847895 980.678196562820 +3463 0.3463 78.4631035894218485 978.493616695940 +3464 0.3464 78.3653632589761315 976.312992218491 +3465 0.3465 78.2678407935397189 974.136316509740 +3466 0.3466 78.1705357985662062 971.963582960460 +3467 0.3467 78.0734478801695388 969.794784972871 +3468 0.3468 77.9765766451228615 967.629915960541 +3469 0.3469 77.8799217008574090 965.468969348520 +3470 0.3470 77.7834826554613272 963.311938573170 +3471 0.3471 77.6872591176785647 961.158817082220 +3472 0.3472 77.5912506969077214 959.009598334760 +3473 0.3473 77.4954570032009258 956.864275801169 +3474 0.3474 77.3998776472627128 954.722842963090 +3475 0.3475 77.3045122404488865 952.585293313459 +3476 0.3476 77.2093603947653833 950.451620356480 +3477 0.3477 77.1144217228671778 948.321817607550 +3478 0.3478 77.0196958380571317 946.195878593239 +3479 0.3479 76.9251823542848996 944.073796851371 +3480 0.3480 76.8308808861457919 941.955565930861 +3481 0.3481 76.7367910488796525 939.841179391850 +3482 0.3482 76.6429124583697785 937.730630805509 +3483 0.3483 76.5492447311417976 935.623913754160 +3484 0.3484 76.4557874843625314 933.521021831169 +3485 0.3485 76.3625403358389292 931.421948640989 +3486 0.3486 76.2695029040169317 929.326687799099 +3487 0.3487 76.1766748079803762 927.235232931991 +3488 0.3488 76.0840556674499169 925.147577677119 +3489 0.3489 75.9916451027819164 923.063715682980 +3490 0.3490 75.8994427349673231 920.983640608969 +3491 0.3491 75.8074481856306051 918.907346125411 +3492 0.3492 75.7156610770286562 916.834825913580 +3493 0.3493 75.6240810320497019 914.766073665610 +3494 0.3494 75.5327076742121903 912.701083084519 +3495 0.3495 75.4415406276637555 910.639847884179 +3496 0.3496 75.3505795171800798 908.582361789270 +3497 0.3497 75.2598239681638574 906.528618535301 +3498 0.3498 75.1692736066436709 904.478611868560 +3499 0.3499 75.0789280592729398 902.432335546110 +3500 0.3500 74.9887869533288409 900.389783335751 +3501 0.3501 74.8988499167112565 898.350949016040 +3502 0.3502 74.8091165779416514 896.315826376200 +3503 0.3503 74.7195865661620360 894.284409216190 +3504 0.3504 74.6302595111339002 892.256691346581 +3505 0.3505 74.5411350432371336 890.232666588650 +3506 0.3506 74.4522127934689877 888.212328774241 +3507 0.3507 74.3634923934429821 886.195671745870 +3508 0.3508 74.2749734753878528 884.182689356590 +3509 0.3509 74.1866556721465145 882.173375470040 +3510 0.3510 74.0985386171749951 880.167723960430 +3511 0.3511 74.0106219445413558 878.165728712450 +3512 0.3512 73.9229052889246674 876.167383621350 +3513 0.3513 73.8353882856139592 874.172682592830 +3514 0.3514 73.7480705705071671 872.181619543090 +3515 0.3515 73.6609517801100679 870.194188398760 +3516 0.3516 73.5740315515352847 868.210383096890 +3517 0.3517 73.4873095225011923 866.230197584980 +3518 0.3518 73.4007853313308942 864.253625820880 +3519 0.3519 73.3144586169512138 862.280661772850 +3520 0.3520 73.2283290188915998 860.311299419470 +3521 0.3521 73.1423961772831461 858.345532749670 +3522 0.3522 73.0566597328575256 856.383355762680 +3523 0.3523 72.9711193269459955 854.424762468040 +3524 0.3524 72.8857746014783174 852.469746885580 +3525 0.3525 72.8006251989817770 850.518303045340 +3526 0.3526 72.7156707625801317 848.570424987630 +3527 0.3527 72.6309109359926026 846.626106762980 +3528 0.3528 72.5463453635328506 844.685342432091 +3529 0.3529 72.4619736901079534 842.748126065881 +3530 0.3530 72.3777955612173827 840.814451745410 +3531 0.3531 72.2938106229520230 838.884313561880 +3532 0.3532 72.2100185219930921 836.957705616610 +3533 0.3533 72.1264189056112031 835.034622021030 +3534 0.3534 72.0430114216653124 833.115056896660 +3535 0.3535 71.9597957186017254 831.199004375080 +3536 0.3536 71.8767714454530733 829.286458597910 +3537 0.3537 71.7939382518373321 827.377413716830 +3538 0.3538 71.7112957879568143 825.471863893480 +3539 0.3539 71.6288437045971591 823.569803299540 +3540 0.3540 71.5465816531263528 821.671226116639 +3541 0.3541 71.4645092854937047 819.776126536360 +3542 0.3542 71.3826262542288816 817.884498760230 +3543 0.3543 71.3009322124408840 815.996336999689 +3544 0.3544 71.2194268138170941 814.111635476070 +3545 0.3545 71.1381097126222670 812.230388420610 +3546 0.3546 71.0569805636975218 810.352590074381 +3547 0.3547 70.9760390224593891 808.478234688300 +3548 0.3548 70.8952847448988166 806.607316523130 +3549 0.3549 70.8147173875801883 804.739829849430 +3550 0.3550 70.7343366076403441 802.875768947541 +3551 0.3551 70.6541420627875851 801.015128107580 +3552 0.3552 70.5741334113007355 799.157901629430 +3553 0.3553 70.4943103120281336 797.304083822691 +3554 0.3554 70.4146724243866657 795.453669006701 +3555 0.3555 70.3352194083608140 793.606651510449 +3556 0.3556 70.2559509245016613 791.763025672670 +3557 0.3557 70.1768666339259397 789.922785841701 +3558 0.3558 70.0979661983150777 788.085926375560 +3559 0.3559 70.0192492799142059 786.252441641920 +3560 0.3560 69.9407155415312189 784.422326017950 +3561 0.3561 69.8623646465357950 782.595573890540 +3562 0.3562 69.7841962588584579 780.772179656080 +3563 0.3563 69.7062100429896248 778.952137720550 +3564 0.3564 69.6284056639786257 777.135442499450 +3565 0.3565 69.5507827874327660 775.322088417780 +3566 0.3566 69.4733410795163735 773.512069910081 +3567 0.3567 69.3960802069498470 771.705381420360 +3568 0.3568 69.3189998370087181 769.902017402090 +3569 0.3569 69.2420996375226991 768.101972318210 +3570 0.3570 69.1653792768747309 766.305240641070 +3571 0.3571 69.0888384240000590 764.511816852440 +3572 0.3572 69.0124767483852679 762.721695443510 +3573 0.3573 68.9362939200673566 760.934870914820 +3574 0.3574 68.8602896096328010 759.151337776279 +3575 0.3575 68.7844634882166304 757.371090547151 +3576 0.3576 68.7088152275014750 755.594123756020 +3577 0.3577 68.6333444997166282 753.820431940791 +3578 0.3578 68.5580509776371514 752.050009648670 +3579 0.3579 68.4829343345829074 750.282851436110 +3580 0.3580 68.4079942444176652 748.518951868830 +3581 0.3581 68.3332303815481339 746.758305521830 +3582 0.3582 68.2586424209230813 745.000906979290 +3583 0.3583 68.1842300380323820 743.246750834610 +3584 0.3584 68.1099929089061362 741.495831690390 +3585 0.3585 68.0359307101136892 739.748144158410 +3586 0.3586 67.9620431187627929 738.003682859600 +3587 0.3587 67.8883298124986112 736.262442424010 +3588 0.3588 67.8147904695028672 734.524417490840 +3589 0.3589 67.7414247684929052 732.789602708380 +3590 0.3590 67.6682323887207815 731.057992734050 +3591 0.3591 67.5952130099723689 729.329582234280 +3592 0.3592 67.5223663125664189 727.604365884620 +3593 0.3593 67.4496919773537087 725.882338369590 +3594 0.3594 67.3771896857160897 724.163494382800 +3595 0.3595 67.3048591195656059 722.447828626840 +3596 0.3596 67.2326999613435987 720.735335813270 +3597 0.3597 67.1607118940197978 719.026010662659 +3598 0.3598 67.0888946010914395 717.319847904500 +3599 0.3599 67.0172477665823578 715.616842277270 +3600 0.3600 66.9457710750420745 713.916988528320 +3601 0.3601 66.8744642115449608 712.220281413940 +3602 0.3602 66.8033268616892997 710.526715699310 +3603 0.3603 66.7323587115964045 708.836286158470 +3604 0.3604 66.6615594479097666 707.148987574340 +3605 0.3605 66.5909287577941171 705.464814738650 +3606 0.3606 66.5204663289345888 703.783762451981 +3607 0.3607 66.4501718495358062 702.105825523740 +3608 0.3608 66.3800450083210194 700.430998772060 +3609 0.3609 66.3100854945312221 698.759277023940 +3610 0.3610 66.2402929979242714 697.090655115100 +3611 0.3611 66.1706672087740202 695.425127889970 +3612 0.3612 66.1012078178694367 693.762690201780 +3613 0.3613 66.0319145165137229 692.103336912420 +3614 0.3614 65.9627869965234765 690.447062892490 +3615 0.3615 65.8938249502277813 688.793863021290 +3616 0.3616 65.8250280704673827 687.143732186760 +3617 0.3617 65.7563960505937644 685.496665285510 +3618 0.3618 65.6879285844683523 683.852657222770 +3619 0.3619 65.6196253664615909 682.211702912390 +3620 0.3620 65.5514860914521336 680.573797276830 +3621 0.3621 65.4835104548259324 678.938935247140 +3622 0.3622 65.4156981524754286 677.307111762911 +3623 0.3623 65.3480488807986717 675.678321772330 +3624 0.3624 65.2805623366984520 674.052560232100 +3625 0.3625 65.2132382175814769 672.429822107460 +3626 0.3626 65.1460762213575038 670.810102372140 +3627 0.3627 65.0790760464384732 669.193396008350 +3628 0.3628 65.0122373917377132 667.579698006850 +3629 0.3629 64.9455599566690296 665.969003366760 +3630 0.3630 64.8790434411459103 664.361307095741 +3631 0.3631 64.8126875455806299 662.756604209810 +3632 0.3632 64.7464919708834685 661.154889733440 +3633 0.3633 64.6804564184618158 659.556158699500 +3634 0.3634 64.6145805902193757 657.960406149230 +3635 0.3635 64.5488641885552994 656.367627132240 +3636 0.3636 64.4833069163633610 654.777816706520 +3637 0.3637 64.4179084770311192 653.190969938350 +3638 0.3638 64.3526685744390790 651.607081902401 +3639 0.3639 64.2875869129598811 650.026147681590 +3640 0.3640 64.2226631974574502 648.448162367160 +3641 0.3641 64.1578971332861556 646.873121058639 +3642 0.3642 64.0932884262900302 645.301018863780 +3643 0.3643 64.0288367828019176 643.731850898600 +3644 0.3644 63.9645419096426124 642.165612287380 +3645 0.3645 63.9004035141201143 640.602298162590 +3646 0.3646 63.8364213040287396 639.041903664900 +3647 0.3647 63.7725949876483327 637.484423943190 +3648 0.3648 63.7089242737434489 635.929854154479 +3649 0.3649 63.6454088715625304 634.378189463960 +3650 0.3650 63.5820484908370815 632.829425045000 +3651 0.3651 63.5188428417808808 631.283556079060 +3652 0.3652 63.4557916350891418 629.740577755710 +3653 0.3653 63.3928945819377248 628.200485272650 +3654 0.3654 63.3301513939823124 626.663273835629 +3655 0.3655 63.2675617833576069 625.128938658489 +3656 0.3656 63.2051254626765271 623.597474963120 +3657 0.3657 63.1428421450293982 622.068877979460 +3658 0.3658 63.0807115439831492 620.543142945450 +3659 0.3659 63.0187333735805240 619.020265107080 +3660 0.3660 62.9569073483392572 617.500239718290 +3661 0.3661 62.8952331832512925 615.983062041030 +3662 0.3662 62.8337105937819800 614.468727345239 +3663 0.3663 62.7723392958692799 612.957230908750 +3664 0.3664 62.7111190059229742 611.448568017389 +3665 0.3665 62.6500494408238637 609.942733964870 +3666 0.3666 62.5891303179229794 608.439724052841 +3667 0.3667 62.5283613550407935 606.939533590830 +3668 0.3668 62.4677422704664380 605.442157896270 +3669 0.3669 62.4072727829569018 603.947592294410 +3670 0.3670 62.3469526117362633 602.455832118429 +3671 0.3671 62.2867814764948804 600.966872709259 +3672 0.3672 62.2267590973886300 599.480709415720 +3673 0.3673 62.1668851950381267 597.997337594400 +3674 0.3674 62.1071594905279198 596.516752609720 +3675 0.3675 62.0475817054057401 595.038949833880 +3676 0.3676 61.9881515616817040 593.563924646790 +3677 0.3677 61.9288687818275534 592.091672436180 +3678 0.3678 61.8697330887758739 590.622188597480 +3679 0.3679 61.8107442059193062 589.155468533880 +3680 0.3680 61.7519018571098002 587.691507656260 +3681 0.3681 61.6932057666578260 586.230301383181 +3682 0.3682 61.6346556593316208 584.771845140930 +3683 0.3683 61.5762512603564005 583.316134363410 +3684 0.3684 61.5179922954136202 581.863164492240 +3685 0.3685 61.4598784906401789 580.412930976630 +3686 0.3686 61.4019095726276731 578.965429273439 +3687 0.3687 61.3440852684216438 577.520654847151 +3688 0.3688 61.2864053055207947 576.078603169850 +3689 0.3689 61.2288694118762464 574.639269721160 +3690 0.3690 61.1714773158907690 573.202649988350 +3691 0.3691 61.1142287464180427 571.768739466180 +3692 0.3692 61.0571234327618839 570.337533657021 +3693 0.3693 61.0001611046754988 568.909028070740 +3694 0.3694 60.9433414923607231 567.483218224710 +3695 0.3695 60.8866643264672973 566.060099643840 +3696 0.3696 60.8301293380920782 564.639667860500 +3697 0.3697 60.7737362587783210 563.221918414580 +3698 0.3698 60.7174848205149260 561.806846853380 +3699 0.3699 60.6613747557356717 560.394448731720 +3700 0.3700 60.6054057973184968 558.984719611780 +3701 0.3701 60.5495776785847468 557.577655063220 +3702 0.3702 60.4938901332984287 556.173250663090 +3703 0.3703 60.4383428956654853 554.771501995840 +3704 0.3704 60.3829357003330287 553.372404653310 +3705 0.3705 60.3276682823886290 551.975954234700 +3706 0.3706 60.2725403773595687 550.582146346570 +3707 0.3707 60.2175517212120965 549.190976602839 +3708 0.3708 60.1627020503507168 547.802440624740 +3709 0.3709 60.1079911016174364 546.416534040841 +3710 0.3710 60.0534186122910469 545.033252486990 +3711 0.3711 59.9989843200863788 543.652591606340 +3712 0.3712 59.9446879631535978 542.274547049339 +3713 0.3713 59.8905292800774447 540.899114473670 +3714 0.3714 59.8365080098765461 539.526289544279 +3715 0.3715 59.7826238920026611 538.156067933390 +3716 0.3716 59.7288766663399713 536.788445320380 +3717 0.3717 59.6752660732043552 535.423417391889 +3718 0.3718 59.6217918533426712 534.060979841740 +3719 0.3719 59.5684537479320326 532.701128370980 +3720 0.3720 59.5152514985790972 531.343858687780 +3721 0.3721 59.4621848473193353 529.989166507490 +3722 0.3722 59.4092535366163332 528.637047552620 +3723 0.3723 59.3564573093610619 527.287497552820 +3724 0.3724 59.3037959088711801 525.940512244840 +3725 0.3725 59.2512690788903100 524.596087372550 +3726 0.3726 59.1988765635873335 523.254218686920 +3727 0.3727 59.1466181075556889 521.914901946000 +3728 0.3728 59.0944934558126391 520.578132914940 +3729 0.3729 59.0425023537985965 519.243907365900 +3730 0.3730 58.9906445473763910 517.912221078150 +3731 0.3731 58.9389197828305882 516.583069837910 +3732 0.3732 58.8873278068667645 515.256449438520 +3733 0.3733 58.8358683666108249 513.932355680240 +3734 0.3734 58.7845412096082924 512.610784370390 +3735 0.3735 58.7333460838236121 511.291731323240 +3736 0.3736 58.6822827376394471 509.975192360030 +3737 0.3737 58.6313509198559970 508.661163309000 +3738 0.3738 58.5805503796902798 507.349640005290 +3739 0.3739 58.5298808667754642 506.040618290989 +3740 0.3740 58.4793421311601591 504.734094015120 +3741 0.3741 58.4289339233077243 503.430063033600 +3742 0.3742 58.3786559940955811 502.128521209260 +3743 0.3743 58.3285080948145307 500.829464411780 +3744 0.3744 58.2784899771680571 499.532888517761 +3745 0.3745 58.2286013932716386 498.238789410620 +3746 0.3746 58.1788420956520724 496.947162980669 +3747 0.3747 58.1292118372467925 495.658005125000 +3748 0.3748 58.0797103714031664 494.371311747580 +3749 0.3749 58.0303374518778270 493.087078759149 +3750 0.3750 57.9810928328360049 491.805302077290 +3751 0.3751 57.9319762688508249 490.525977626310 +3752 0.3752 57.8829875149026449 489.249101337350 +3753 0.3753 57.8341263263783674 487.974669148270 +3754 0.3754 57.7853924590707706 486.702677003710 +3755 0.3755 57.7367856691778343 485.433120855039 +3756 0.3756 57.6883057133020642 484.165996660360 +3757 0.3757 57.6399523484498246 482.901300384480 +3758 0.3758 57.5917253320306557 481.639027998890 +3759 0.3759 57.5436244218566202 480.379175481820 +3760 0.3760 57.4956493761416212 479.121738818150 +3761 0.3761 57.4477999535007413 477.866713999430 +3762 0.3762 57.4000759129495748 476.614097023859 +3763 0.3763 57.3524770139035667 475.363883896270 +3764 0.3764 57.3050030161773449 474.116070628181 +3765 0.3765 57.2576536799840525 472.870653237650 +3766 0.3766 57.2104287659347008 471.627627749420 +3767 0.3767 57.1633280350374946 470.386990194759 +3768 0.3768 57.1163512486971783 469.148736611580 +3769 0.3769 57.0694981687143823 467.912863044330 +3770 0.3770 57.0227685572849623 466.679365544040 +3771 0.3771 56.9761621769993454 465.448240168270 +3772 0.3772 56.9296787908418764 464.219482981141 +3773 0.3773 56.8833181621901574 462.993090053260 +3774 0.3774 56.8370800548144075 461.769057461790 +3775 0.3775 56.7909642328767958 460.547381290399 +3776 0.3776 56.7449704609308156 459.328057629200 +3777 0.3777 56.6990985039206166 458.111082574840 +3778 0.3778 56.6533481271803581 456.896452230380 +3779 0.3779 56.6077190964335699 455.684162705400 +3780 0.3780 56.5622111777925056 454.474210115870 +3781 0.3781 56.5168241377575029 453.266590584220 +3782 0.3782 56.4715577432163300 452.061300239300 +3783 0.3783 56.4264117614435463 450.858335216360 +3784 0.3784 56.3813859600998768 449.657691657079 +3785 0.3785 56.3364801072315515 448.459365709480 +3786 0.3786 56.2916939712696802 447.263353528000 +3787 0.3787 56.2470273210296057 446.069651273420 +3788 0.3788 56.2024799257102927 444.878255112910 +3789 0.3789 56.1580515548936532 443.689161219921 +3790 0.3790 56.1137419785439420 442.502365774310 +3791 0.3791 56.0695509670071175 441.317864962180 +3792 0.3792 56.0254782910102094 440.135654975999 +3793 0.3793 55.9815237216606860 438.955732014510 +3794 0.3794 55.9376870304458222 437.778092282751 +3795 0.3795 55.8939679892320811 436.602731992040 +3796 0.3796 55.8503663702644815 435.429647359930 +3797 0.3797 55.8068819461659729 434.258834610280 +3798 0.3798 55.7635144899368029 433.090289973130 +3799 0.3799 55.7202637749539065 431.924009684800 +3800 0.3800 55.6771295749702730 430.759989987810 +3801 0.3801 55.6341116641143358 429.598227130910 +3802 0.3802 55.5912098168893394 428.438717369010 +3803 0.3803 55.5484238081727284 427.281456963250 +3804 0.3804 55.5057534132155226 426.126442180910 +3805 0.3805 55.4631984076417055 424.973669295469 +3806 0.3806 55.4207585674476064 423.823134586540 +3807 0.3807 55.3784336690012822 422.674834339879 +3808 0.3808 55.3362234890419202 421.528764847380 +3809 0.3809 55.2941278046791993 420.384922407070 +3810 0.3810 55.2521463933926924 419.243303323080 +3811 0.3811 55.2102790330312558 418.103903905650 +3812 0.3812 55.1685255018124181 416.966720471060 +3813 0.3813 55.1268855783217759 415.831749341750 +3814 0.3814 55.0853590415123762 414.698986846181 +3815 0.3815 55.0439456707041259 413.568429318851 +3816 0.3816 55.0026452455831674 412.440073100380 +3817 0.3817 54.9614575462012809 411.313914537351 +3818 0.3818 54.9203823529752952 410.189949982400 +3819 0.3819 54.8794194466864624 409.068175794190 +3820 0.3820 54.8385686084798820 407.948588337360 +3821 0.3821 54.7978296198638830 406.831183982590 +3822 0.3822 54.7572022627094270 405.715959106470 +3823 0.3823 54.7166863192495185 404.602910091650 +3824 0.3824 54.6762815720786008 403.492033326670 +3825 0.3825 54.6359878041519664 402.383325206070 +3826 0.3826 54.5958047987851458 401.276782130300 +3827 0.3827 54.5557323396533391 400.172400505770 +3828 0.3828 54.5157702107908122 399.070176744770 +3829 0.3829 54.4759181965902997 397.970107265550 +3830 0.3830 54.4361760818024081 396.872188492221 +3831 0.3831 54.3965436515350547 395.776416854800 +3832 0.3832 54.3570206912528562 394.682788789180 +3833 0.3833 54.3176069867765392 393.591300737130 +3834 0.3834 54.2783023242823717 392.501949146261 +3835 0.3835 54.2391064903015589 391.414730470050 +3836 0.3836 54.2000192717196683 390.329641167780 +3837 0.3837 54.1610404557760461 389.246677704620 +3838 0.3838 54.1221698300632426 388.165836551510 +3839 0.3839 54.0834071825264076 387.087114185190 +3840 0.3840 54.0447523014627365 386.010507088240 +3841 0.3841 54.0062049755208733 384.936011748990 +3842 0.3842 53.9677649937003423 383.863624661581 +3843 0.3843 53.9294321453509724 382.793342325860 +3844 0.3844 53.8912062201723074 381.725161247489 +3845 0.3845 53.8530870082130377 380.659077937850 +3846 0.3846 53.8150742998704388 379.595088914090 +3847 0.3847 53.7771678858897815 378.533190699030 +3848 0.3848 53.7393675573637708 377.473379821249 +3849 0.3849 53.7016731057319561 376.415652815040 +3850 0.3850 53.6640843227801838 375.360006220340 +3851 0.3851 53.6266010006400293 374.306436582820 +3852 0.3852 53.5892229317881998 373.254940453800 +3853 0.3853 53.5519499090459945 372.205514390301 +3854 0.3854 53.5147817255787288 371.158154954950 +3855 0.3855 53.4777181748951804 370.112858716060 +3856 0.3856 53.4407590508469994 369.069622247560 +3857 0.3857 53.4039041476281682 368.028442129030 +3858 0.3858 53.3671532597744331 366.989314945640 +3859 0.3859 53.3305061821627433 365.952237288160 +3860 0.3860 53.2939627100106819 364.917205753010 +3861 0.3861 53.2575226388759262 363.884216942140 +3862 0.3862 53.2211857646556652 362.853267463081 +3863 0.3863 53.1849518835860593 361.824353928990 +3864 0.3864 53.1488207922416862 360.797472958510 +3865 0.3865 53.1127922875349654 359.772621175870 +3866 0.3866 53.0768661667156323 358.749795210850 +3867 0.3867 53.0410422273701556 357.728991698729 +3868 0.3868 53.0053202674212045 356.710207280300 +3869 0.3869 52.9697000851270943 355.693438601920 +3870 0.3870 52.9341814790812322 354.678682315380 +3871 0.3871 52.8987642482115632 353.665935077990 +3872 0.3872 52.8634481917800372 352.655193552550 +3873 0.3873 52.8282331093820403 351.646454407331 +3874 0.3874 52.7931188009458694 350.639714316040 +3875 0.3875 52.7581050667321705 349.634969957890 +3876 0.3876 52.7231917073334060 348.632218017440 +3877 0.3877 52.6883785236732933 347.631455184780 +3878 0.3878 52.6536653170062863 346.632678155400 +3879 0.3879 52.6190518889170065 345.635883630151 +3880 0.3880 52.5845380413197319 344.641068315360 +3881 0.3881 52.5501235764578283 343.648228922721 +3882 0.3882 52.5158082969032307 342.657362169281 +3883 0.3883 52.4815920055558891 341.668464777520 +3884 0.3884 52.4474745056432496 340.681533475240 +3885 0.3885 52.4134556007197077 339.696564995630 +3886 0.3886 52.3795350946660676 338.713556077219 +3887 0.3887 52.3457127916890101 337.732503463870 +3888 0.3888 52.3119884963205806 336.753403904790 +3889 0.3889 52.2783620134176132 335.776254154490 +3890 0.3890 52.2448331481612485 334.801050972780 +3891 0.3891 52.2114017060563711 333.827791124821 +3892 0.3892 52.1780674929310777 332.856471381010 +3893 0.3893 52.1448303149361720 331.887088517090 +3894 0.3894 52.1116899785446179 330.919639314010 +3895 0.3895 52.0786462905510135 329.954120558020 +3896 0.3896 52.0456990580710794 328.990529040650 +3897 0.3897 52.0128480885411193 328.028861558620 +3898 0.3898 51.9800931897174934 327.069114913960 +3899 0.3899 51.9474341696761002 326.111285913840 +3900 0.3900 51.9148708368118719 325.155371370730 +3901 0.3901 51.8824029998382201 324.201368102280 +3902 0.3902 51.8500304677865387 323.249272931320 +3903 0.3903 51.8177530500056776 322.299082685910 +3904 0.3904 51.7855705561614172 321.350794199260 +3905 0.3905 51.7534827962359643 320.404404309790 +3906 0.3906 51.7214895805274253 319.459909861060 +3907 0.3907 51.6895907196492814 318.517307701800 +3908 0.3908 51.6577860245298979 317.576594685870 +3909 0.3909 51.6260753064119911 316.637767672290 +3910 0.3910 51.5944583768521170 315.700823525180 +3911 0.3911 51.5629350477201669 314.765759113840 +3912 0.3912 51.5315051311988412 313.832571312611 +3913 0.3913 51.5001684397831596 312.901257000990 +3914 0.3914 51.4689247862799348 311.971813063529 +3915 0.3915 51.4377739838072614 311.044236389890 +3916 0.3916 51.4067158457940252 310.118523874840 +3917 0.3917 51.3757501859793777 309.194672418141 +3918 0.3918 51.3448768184122386 308.272678924661 +3919 0.3919 51.3140955574507913 307.352540304330 +3920 0.3920 51.2834062177619714 306.434253472080 +3921 0.3921 51.2528086143209691 305.517815347910 +3922 0.3922 51.2223025624107322 304.603222856840 +3923 0.3923 51.1918878776214470 303.690472928860 +3924 0.3924 51.1615643758500482 302.779562499050 +3925 0.3925 51.1313318732997288 301.870488507400 +3926 0.3926 51.1011901864794069 300.963247898970 +3927 0.3927 51.0711391322032711 300.057837623730 +3928 0.3928 51.0411785275902474 299.154254636680 +3929 0.3929 51.0113081900635237 298.252495897740 +3930 0.3930 50.9815279373500445 297.352558371810 +3931 0.3931 50.9518375874800142 296.454439028730 +3932 0.3932 50.9222369587864137 295.558134843280 +3933 0.3933 50.8927258699044884 294.663642795171 +3934 0.3934 50.8633041397712802 293.770959869020 +3935 0.3935 50.8339715876251077 292.880083054391 +3936 0.3936 50.8047280330051052 291.991009345710 +3937 0.3937 50.7755732957507036 291.103735742310 +3938 0.3938 50.7465071960011684 290.218259248450 +3939 0.3939 50.7175295541950817 289.334576873221 +3940 0.3940 50.6886401910698936 288.452685630590 +3941 0.3941 50.6598389276613901 287.572582539410 +3942 0.3942 50.6311255853032520 286.694264623370 +3943 0.3943 50.6024999856265296 285.817728911020 +3944 0.3944 50.5739619505591946 284.942972435710 +3945 0.3945 50.5455113023256288 284.069992235660 +3946 0.3946 50.5171478634461479 283.198785353900 +3947 0.3947 50.4888714567365398 282.329348838250 +3948 0.3948 50.4606819053075597 281.461679741370 +3949 0.3949 50.4325790325644547 280.595775120660 +3950 0.3950 50.4045626622065015 279.731632038370 +3951 0.3951 50.3766326182265090 278.869247561500 +3952 0.3952 50.3487887249103423 278.008618761801 +3953 0.3953 50.3210308068364611 277.149742715810 +3954 0.3954 50.2933586888754292 276.292616504830 +3955 0.3955 50.2657721961894453 275.437237214880 +3956 0.3956 50.2382711542318603 274.583601936750 +3957 0.3957 50.2108553887467295 273.731707765920 +3958 0.3958 50.1835247257683008 272.881551802609 +3959 0.3959 50.1562789916205816 272.033131151760 +3960 0.3960 50.1291180129168410 271.186442923030 +3961 0.3961 50.1020416165591556 270.341484230729 +3962 0.3962 50.0750496297379257 269.498252193910 +3963 0.3963 50.0481418799314142 268.656743936260 +3964 0.3964 50.0213181949052910 267.816956586150 +3965 0.3965 49.9945784027121505 266.978887276670 +3966 0.3966 49.9679223316910424 266.142533145480 +3967 0.3967 49.9413498104670239 265.307891334950 +3968 0.3968 49.9148606679506699 264.474958992070 +3969 0.3969 49.8884547333376460 263.643733268470 +3970 0.3970 49.8621318361082047 262.814211320399 +3971 0.3971 49.8358918060267513 261.986390308720 +3972 0.3972 49.8097344731413685 261.160267398910 +3973 0.3973 49.7836596677833683 260.335839761050 +3974 0.3974 49.7576672205668231 259.513104569810 +3975 0.3975 49.7317569623881113 258.692059004450 +3976 0.3976 49.7059287244254477 257.872700248810 +3977 0.3977 49.6801823381384438 257.055025491281 +3978 0.3978 49.6545176352676378 256.239031924840 +3979 0.3979 49.6289344478340482 255.424716747009 +3980 0.3980 49.6034326081387036 254.612077159861 +3981 0.3981 49.5780119487622102 253.801110369970 +3982 0.3982 49.5526723025642895 252.991813588510 +3983 0.3983 49.5274135026833093 252.184184031110 +3984 0.3984 49.5022353825358579 251.378218917979 +3985 0.3985 49.4771377758162672 250.573915473779 +3986 0.3986 49.4521205164961941 249.771270927680 +3987 0.3987 49.4271834388241444 248.970282513370 +3988 0.3988 49.4023263773250250 248.170947469020 +3989 0.3989 49.3775491667997102 247.373263037250 +3990 0.3990 49.3528516423245875 246.577226465160 +3991 0.3991 49.3282336392511098 245.782835004330 +3992 0.3992 49.3036949932053545 244.990085910770 +3993 0.3993 49.2792355400875692 244.198976444940 +3994 0.3994 49.2548551160717309 243.409503871761 +3995 0.3995 49.2305535576051128 242.621665460550 +3996 0.3996 49.2063307014078291 241.835458485099 +3997 0.3997 49.1821863844723950 241.050880223550 +3998 0.3998 49.1581204440632931 240.267927958500 +3999 0.3999 49.1341327177165255 239.486598976920 +4000 0.4000 49.1102230432391664 238.706890570200 +4001 0.4001 49.0863912587089501 237.928800034100 +4002 0.4002 49.0626372024738089 237.152324668769 +4003 0.4003 49.0389607131514325 236.377461778699 +4004 0.4004 49.0153616296288561 235.604208672780 +4005 0.4005 48.9918397910620058 234.832562664250 +4006 0.4006 48.9683950368752576 234.062521070670 +4007 0.4007 48.9450272067610257 233.294081213970 +4008 0.4008 48.9217361406793074 232.527240420411 +4009 0.4009 48.8985216788572572 231.761996020560 +4010 0.4010 48.8753836617887600 230.998345349321 +4011 0.4011 48.8523219302339982 230.236285745920 +4012 0.4012 48.8293363252190105 229.475814553861 +4013 0.4013 48.8064266880352733 228.716929120940 +4014 0.4014 48.7835928602392599 227.959626799300 +4015 0.4015 48.7608346836520283 227.203904945270 +4016 0.4016 48.7381520003587880 226.449760919540 +4017 0.4017 48.7155446527084592 225.697192087060 +4018 0.4018 48.6930124833132609 224.946195816970 +4019 0.4019 48.6705553350482774 224.196769482740 +4020 0.4020 48.6481730510510388 223.448910462020 +4021 0.4021 48.6258654747210954 222.702616136780 +4022 0.4022 48.6036324497195977 221.957883893150 +4023 0.4023 48.5814738199688634 221.214711121510 +4024 0.4024 48.5593894296519650 220.473095216460 +4025 0.4025 48.5373791232123040 219.733033576819 +4026 0.4026 48.5154427453531838 218.994523605580 +4027 0.4027 48.4935801410374054 218.257562709950 +4028 0.4028 48.4717911554868408 217.522148301330 +4029 0.4029 48.4500756341820136 216.788277795280 +4030 0.4030 48.4284334228616729 216.055948611560 +4031 0.4031 48.4068643675223882 215.325158174090 +4032 0.4032 48.3853683144181375 214.595903910929 +4033 0.4033 48.3639451100598734 213.868183254310 +4034 0.4034 48.3425946012151257 213.141993640620 +4035 0.4035 48.3213166349075749 212.417332510360 +4036 0.4036 48.3001110584166469 211.694197308170 +4037 0.4037 48.2789777192770941 210.972585482850 +4038 0.4038 48.2579164652785906 210.252494487260 +4039 0.4039 48.2369271444653052 209.533921778399 +4040 0.4040 48.2160096051355183 208.816864817381 +4041 0.4041 48.1951636958411811 208.101321069390 +4042 0.4042 48.1743892653875250 207.387288003731 +4043 0.4043 48.1536861628326491 206.674763093761 +4044 0.4044 48.1330542374871158 205.963743816940 +4045 0.4045 48.1124933389135307 205.254227654780 +4046 0.4046 48.0920033169261458 204.546212092860 +4047 0.4047 48.0715840215904606 203.839694620809 +4048 0.4048 48.0512353032228035 203.134672732320 +4049 0.4049 48.0309570123899334 202.431143925110 +4050 0.4050 48.0107489999086283 201.729105700950 +4051 0.4051 47.9906111168453009 201.028555565590 +4052 0.4052 47.9705432145155797 200.329491028891 +4053 0.4053 47.9505451444839039 199.631909604650 +4054 0.4054 47.9306167585631400 198.935808810690 +4055 0.4055 47.9107579088141620 198.241186168850 +4056 0.4056 47.8909684475454682 197.548039204959 +4057 0.4057 47.8712482273127833 196.856365448810 +4058 0.4058 47.8515971009186316 196.166162434230 +4059 0.4059 47.8320149214119752 195.477427698940 +4060 0.4060 47.8125015420877943 194.790158784710 +4061 0.4061 47.7930568164866969 194.104353237220 +4062 0.4062 47.7736805983945274 193.420008606109 +4063 0.4063 47.7543727418419763 192.737122444970 +4064 0.4064 47.7351331011041609 192.055692311350 +4065 0.4065 47.7159615307002554 191.375715766710 +4066 0.4066 47.6968578853931007 190.697190376450 +4067 0.4067 47.6778220201887848 190.020113709860 +4068 0.4068 47.6588537903362806 189.344483340210 +4069 0.4069 47.6399530513270406 188.670296844590 +4070 0.4070 47.6211196588946066 187.997551804070 +4071 0.4071 47.6023534690142256 187.326245803540 +4072 0.4072 47.5836543379024590 186.656376431861 +4073 0.4073 47.5650221220167779 185.987941281700 +4074 0.4074 47.5464566780552076 185.320937949640 +4075 0.4075 47.5279578629559225 184.655364036110 +4076 0.4076 47.5095255338968485 183.991217145430 +4077 0.4077 47.4911595482952933 183.328494885740 +4078 0.4078 47.4728597638075556 182.667194869030 +4079 0.4079 47.4546260383285485 182.007314711161 +4080 0.4080 47.4364582299914019 181.348852031810 +4081 0.4081 47.4183561971670855 180.691804454490 +4082 0.4082 47.4003197984640323 180.036169606510 +4083 0.4083 47.3823488927277552 179.381945119030 +4084 0.4084 47.3644433390404558 178.729128627000 +4085 0.4085 47.3466029967206481 178.077717769190 +4086 0.4086 47.3288277253227818 177.427710188140 +4087 0.4087 47.3111173846368658 176.779103530180 +4088 0.4088 47.2934718346880842 176.131895445469 +4089 0.4089 47.2758909357364132 175.486083587900 +4090 0.4090 47.2583745482762581 174.841665615140 +4091 0.4091 47.2409225330360698 174.198639188640 +4092 0.4092 47.2235347509779615 173.557001973590 +4093 0.4093 47.2062110632973315 172.916751638961 +4094 0.4094 47.1889513314225155 172.277885857410 +4095 0.4095 47.1717554170143742 171.640402305410 +4096 0.4096 47.1546231819659454 171.004298663120 +4097 0.4097 47.1375544884020670 170.369572614411 +4098 0.4098 47.1205491986790008 169.736221846920 +4099 0.4099 47.1036071753840559 169.104244051990 +4100 0.4100 47.0867282813352261 168.473636924630 +4101 0.4101 47.0699123795808134 167.844398163600 +4102 0.4102 47.0531593333990656 167.216525471320 +4103 0.4103 47.0364690062978070 166.590016553920 +4104 0.4104 47.0198412620140473 165.964869121221 +4105 0.4105 47.0032759645136551 165.341080886689 +4106 0.4106 46.9867729779909453 164.718649567490 +4107 0.4107 46.9703321668683458 164.097572884440 +4108 0.4108 46.9539533957960202 163.477848562000 +4109 0.4109 46.9376365296515061 162.859474328339 +4110 0.4110 46.9213814335393309 162.242447915201 +4111 0.4111 46.9051879727906709 161.626767058000 +4112 0.4112 46.8890560129629819 161.012429495810 +4113 0.4113 46.8729854198396296 160.399432971300 +4114 0.4114 46.8569760594295275 159.787775230760 +4115 0.4115 46.8410277979667811 159.177454024120 +4116 0.4116 46.8251405019103331 158.568467104890 +4117 0.4117 46.8093140379435795 157.960812230201 +4118 0.4118 46.7935482729740286 157.354487160790 +4119 0.4119 46.7778430741329387 156.749489660970 +4120 0.4120 46.7621983087749555 156.145817498650 +4121 0.4121 46.7466138444777570 155.543468445290 +4122 0.4122 46.7310895490416911 154.942440275980 +4123 0.4123 46.7156252904894274 154.342730769310 +4124 0.4124 46.7002209370655876 153.744337707480 +4125 0.4125 46.6848763572364049 153.147258876230 +4126 0.4126 46.6695914196893540 152.551492064860 +4127 0.4127 46.6543659933328030 151.957035066181 +4128 0.4128 46.6391999472956655 151.363885676569 +4129 0.4129 46.6240931509270382 150.772041695950 +4130 0.4130 46.6090454737958524 150.181500927720 +4131 0.4131 46.5940567856905261 149.592261178840 +4132 0.4132 46.5791269566185946 149.004320259781 +4133 0.4133 46.5642558568063833 148.417675984510 +4134 0.4134 46.5494433566986316 147.832326170500 +4135 0.4135 46.5346893269581727 147.248268638719 +4136 0.4136 46.5199936384655572 146.665501213620 +4137 0.4137 46.5053561623187193 146.084021723160 +4138 0.4138 46.4907767698326211 145.503827998749 +4139 0.4139 46.4762553325389192 144.924917875291 +4140 0.4140 46.4617917221855947 144.347289191171 +4141 0.4141 46.4473858107366269 143.770939788180 +4142 0.4142 46.4330374703716373 143.195867511599 +4143 0.4143 46.4187465734855493 142.622070210190 +4144 0.4144 46.4045129926882325 142.049545736110 +4145 0.4145 46.3903366008041758 141.478291944970 +4146 0.4146 46.3762172708721323 140.908306695840 +4147 0.4147 46.3621548761447855 140.339587851160 +4148 0.4148 46.3481492900883865 139.772133276851 +4149 0.4149 46.3342003863824345 139.205940842209 +4150 0.4150 46.3203080389193289 138.641008419951 +4151 0.4151 46.3064721218040205 138.077333886200 +4152 0.4152 46.2926925093536852 137.514915120500 +4153 0.4153 46.2789690760973755 136.953750005760 +4154 0.4154 46.2653016967756727 136.393836428280 +4155 0.4155 46.2516902463403738 135.835172277740 +4156 0.4156 46.2381345999541296 135.277755447190 +4157 0.4157 46.2246346329901172 134.721583833070 +4158 0.4158 46.2111902210317069 134.166655335180 +4159 0.4159 46.1978012398721134 133.612967856670 +4160 0.4160 46.1844675655140762 133.060519304050 +4161 0.4161 46.1711890741695115 132.509307587190 +4162 0.4162 46.1579656422591924 131.959330619250 +4163 0.4163 46.1447971464123938 131.410586316790 +4164 0.4164 46.1316834634665724 130.863072599690 +4165 0.4165 46.1186244704670329 130.316787391100 +4166 0.4166 46.1056200446666011 129.771728617559 +4167 0.4167 46.0926700635252757 129.227894208881 +4168 0.4168 46.0797744047099229 128.685282098219 +4169 0.4169 46.0669329460939139 128.143890221981 +4170 0.4170 46.0541455657568193 127.603716519930 +4171 0.4171 46.0414121419840683 127.064758935069 +4172 0.4172 46.0287325532666287 126.527015413741 +4173 0.4173 46.0161066783006660 125.990483905530 +4174 0.4174 46.0035343959872236 125.455162363310 +4175 0.4175 45.9910155854318958 124.921048743210 +4176 0.4176 45.9785501259445013 124.388141004670 +4177 0.4177 45.9661378970387489 123.856437110340 +4178 0.4178 45.9537787784319249 123.325935026140 +4179 0.4179 45.9414726500445525 122.796632721250 +4180 0.4180 45.9292193920000855 122.268528168070 +4181 0.4181 45.9170188846245679 121.741619342290 +4182 0.4182 45.9048710084463139 121.215904222759 +4183 0.4183 45.8927756441955950 120.691380791601 +4184 0.4184 45.8807326728043066 120.168047034170 +4185 0.4185 45.8687419754056478 119.645900938999 +4186 0.4186 45.8568034333338019 119.124940497860 +4187 0.4187 45.8449169281236237 118.605163705721 +4188 0.4188 45.8330823415102984 118.086568560760 +4189 0.4189 45.8212995554290430 117.569153064320 +4190 0.4190 45.8095684520147799 117.052915221000 +4191 0.4191 45.7978889136018026 116.537853038500 +4192 0.4192 45.7862608227234915 116.023964527770 +4193 0.4193 45.7746840621119588 115.511247702890 +4194 0.4194 45.7631585146977571 114.999700581130 +4195 0.4195 45.7516840636095523 114.489321182910 +4196 0.4196 45.7402605921738186 113.980107531829 +4197 0.4197 45.7288879839144968 113.472057654621 +4198 0.4198 45.7175661225527108 112.965169581160 +4199 0.4199 45.7062948920064258 112.459441344510 +4200 0.4200 45.6950741763901576 111.954870980800 +4201 0.4201 45.6839038600146523 111.451456529360 +4202 0.4202 45.6727838273865530 110.949196032620 +4203 0.4203 45.6617139632081148 110.448087536111 +4204 0.4204 45.6506941523768859 109.948129088501 +4205 0.4205 45.6397242799853800 109.449318741580 +4206 0.4206 45.6288042313207924 108.951654550230 +4207 0.4207 45.6179338918646593 108.455134572439 +4208 0.4208 45.6071131472925728 107.959756869290 +4209 0.4209 45.5963418834738619 107.465519504950 +4210 0.4210 45.5856199864712792 106.972420546700 +4211 0.4211 45.5749473425407032 106.480458064850 +4212 0.4212 45.5643238381308180 105.989630132840 +4213 0.4213 45.5537493598828220 105.499934827149 +4214 0.4214 45.5432237946300944 105.011370227340 +4215 0.4215 45.5327470293979246 104.523934416010 +4216 0.4216 45.5223189514031787 104.037625478850 +4217 0.4217 45.5119394480540080 103.552441504570 +4218 0.4218 45.5016084069495292 103.068380584940 +4219 0.4219 45.4913257158795403 102.585440814770 +4220 0.4220 45.4810912628242079 102.103620291879 +4221 0.4221 45.4709049359537545 101.622917117160 +4222 0.4222 45.4607666236281673 101.143329394520 +4223 0.4223 45.4506762143968999 100.664855230860 +4224 0.4224 45.4406335969985520 100.187492736110 +4225 0.4225 45.4306386603605858 99.711240023230 +4226 0.4226 45.4206912935990204 99.236095208150 +4227 0.4227 45.4107913860181185 98.762056409850 +4228 0.4228 45.4009388271101173 98.289121750240 +4229 0.4229 45.3911335065548940 97.817289354280 +4230 0.4230 45.3813753142196816 97.346557349900 +4231 0.4231 45.3716641401587850 96.876923867971 +4232 0.4232 45.3619998746132680 96.408387042400 +4233 0.4233 45.3523824080106479 95.940945010039 +4234 0.4234 45.3428116309646114 95.474595910669 +4235 0.4235 45.3332874342747232 95.009337887110 +4236 0.4236 45.3238097089261132 94.545169085070 +4237 0.4237 45.3143783460891996 94.082087653240 +4238 0.4238 45.3049932371193762 93.620091743251 +4239 0.4239 45.2956542735567282 93.159179509660 +4240 0.4240 45.2863613471257480 92.699349110010 +4241 0.4241 45.2771143497350081 92.240598704720 +4242 0.4242 45.2679131734769129 91.782926457170 +4243 0.4243 45.2587577106273713 91.326330533640 +4244 0.4244 45.2496478536455200 90.870809103340 +4245 0.4245 45.2405834951734320 90.416360338410 +4246 0.4246 45.2315645280358183 89.962982413859 +4247 0.4247 45.2225908452397434 89.510673507630 +4248 0.4248 45.2136623399743343 89.059431800550 +4249 0.4249 45.2047789056104889 88.609255476360 +4250 0.4250 45.1959404357005923 88.160142721640 +4251 0.4251 45.1871468239782175 87.712091725900 +4252 0.4252 45.1783979643578490 87.265100681539 +4253 0.4253 45.1696937509345844 86.819167783799 +4254 0.4254 45.1610340779838566 86.374291230791 +4255 0.4255 45.1524188399611432 85.930469223510 +4256 0.4256 45.1438479315016750 85.487699965800 +4257 0.4257 45.1353212474201655 85.045981664371 +4258 0.4258 45.1268386827105061 84.605312528770 +4259 0.4259 45.1184001325454958 84.165690771410 +4260 0.4260 45.1100054922765494 83.727114607510 +4261 0.4261 45.1016546574334143 83.289582255170 +4262 0.4262 45.0933475237238923 82.853091935300 +4263 0.4263 45.0850839870335491 82.417641871630 +4264 0.4264 45.0768639434254297 81.983230290731 +4265 0.4265 45.0686872891397954 81.549855421990 +4266 0.4266 45.0605539205938186 81.117515497580 +4267 0.4267 45.0524637343813126 80.686208752530 +4268 0.4268 45.0444166272724544 80.255933424630 +4269 0.4269 45.0364124962135008 79.826687754510 +4270 0.4270 45.0284512383264968 79.398469985550 +4271 0.4271 45.0205327509090196 78.971278363960 +4272 0.4272 45.0126569314338880 78.545111138730 +4273 0.4273 45.0048236775488704 78.119966561610 +4274 0.4274 44.9970328870764362 77.695842887140 +4275 0.4275 44.9892844580134508 77.272738372640 +4276 0.4276 44.9815782885309119 76.850651278191 +4277 0.4277 44.9739142769736731 76.429579866630 +4278 0.4278 44.9662923218601662 76.009522403570 +4279 0.4279 44.9587123218821176 75.590477157361 +4280 0.4280 44.9511741759042920 75.172442399100 +4281 0.4281 44.9436777829642011 74.755416402671 +4282 0.4282 44.9362230422718341 74.339397444650 +4283 0.4283 44.9288098532093798 73.924383804369 +4284 0.4284 44.9214381153309645 73.510373763890 +4285 0.4285 44.9141077283623673 73.097365608000 +4286 0.4286 44.9068185922007572 72.685357624230 +4287 0.4287 44.8995706069144092 72.274348102780 +4288 0.4288 44.8923636727424409 71.864335336640 +4289 0.4289 44.8851976900945360 71.455317621420 +4290 0.4290 44.8780725595506880 71.047293255519 +4291 0.4291 44.8709881818609162 70.640260539960 +4292 0.4292 44.8639444579449886 70.234217778530 +4293 0.4293 44.8569412888921804 69.829163277680 +4294 0.4294 44.8499785759609679 69.425095346541 +4295 0.4295 44.8430562205787950 69.022012296920 +4296 0.4296 44.8361741243417811 68.619912443320 +4297 0.4297 44.8293321890144654 68.218794102950 +4298 0.4298 44.8225303165295372 67.818655595610 +4299 0.4299 44.8157684089875659 67.419495243830 +4300 0.4300 44.8090463686567375 67.021311372800 +4301 0.4301 44.8023640979725855 66.624102310300 +4302 0.4302 44.7957214995377271 66.227866386860 +4303 0.4303 44.7891184761216081 65.832601935580 +4304 0.4304 44.7825549306602184 65.438307292240 +4305 0.4305 44.7760307662558432 65.044980795260 +4306 0.4306 44.7695458861767932 64.652620785680 +4307 0.4307 44.7631001938571487 64.261225607180 +4308 0.4308 44.7566935928964895 63.870793606070 +4309 0.4309 44.7503259870596253 63.481323131270 +4310 0.4310 44.7439972802763464 63.092812534340 +4311 0.4311 44.7377073766411542 62.705260169440 +4312 0.4312 44.7314561804130122 62.318664393330 +4313 0.4313 44.7252435960150763 61.933023565390 +4314 0.4314 44.7190695280344244 61.548336047600 +4315 0.4315 44.7129338812218151 61.164600204540 +4316 0.4316 44.7068365604914177 60.781814403360 +4317 0.4317 44.7007774709205563 60.399977013830 +4318 0.4318 44.6947565177494539 60.019086408280 +4319 0.4319 44.6887736063809555 59.639140961641 +4320 0.4320 44.6828286423803007 59.260139051390 +4321 0.4321 44.6769215314748536 58.882079057610 +4322 0.4322 44.6710521795538256 58.504959362930 +4323 0.4323 44.6652204926680483 58.128778352550 +4324 0.4324 44.6594263770297104 57.753534414210 +4325 0.4325 44.6536697390120878 57.379225938250 +4326 0.4326 44.6479504851493019 57.005851317510 +4327 0.4327 44.6422685221360567 56.633408947410 +4328 0.4328 44.6366237568273903 56.261897225900 +4329 0.4329 44.6310160962384188 55.891314553470 +4330 0.4330 44.6254454475440880 55.521659333140 +4331 0.4331 44.6199117180789102 55.152929970460 +4332 0.4332 44.6144148153367084 54.785124873530 +4333 0.4333 44.6089546469703819 54.418242452930 +4334 0.4334 44.6035311207916436 54.052281121790 +4335 0.4335 44.5981441447707638 53.687239295740 +4336 0.4336 44.5927936270363290 53.323115392930 +4337 0.4337 44.5874794758749857 52.959907833991 +4338 0.4338 44.5822015997311851 52.597615042090 +4339 0.4339 44.5769599072069411 52.236235442860 +4340 0.4340 44.5717543070615747 51.875767464450 +4341 0.4341 44.5665847082114794 51.516209537500 +4342 0.4342 44.5614510197298515 51.157560095100 +4343 0.4343 44.5563531508464550 50.799817572860 +4344 0.4344 44.5512910109473665 50.442980408860 +4345 0.4345 44.5462645095747405 50.087047043640 +4346 0.4346 44.5412735564265461 49.732015920211 +4347 0.4347 44.5363180613563330 49.377885484050 +4348 0.4348 44.5313979343729756 49.024654183100 +4349 0.4349 44.5265130856404312 48.672320467760 +4350 0.4350 44.5216634254774988 48.320882790880 +4351 0.4351 44.5168488643575628 47.970339607790 +4352 0.4352 44.5120693129083662 47.620689376180 +4353 0.4353 44.5073246819117401 47.271930556280 +4354 0.4354 44.5026148823033907 46.924061610700 +4355 0.4355 44.4979398251726295 46.577081004490 +4356 0.4356 44.4932994217621456 46.230987205160 +4357 0.4357 44.4886935834677573 45.885778682590 +4358 0.4358 44.4841222218381702 45.541453909131 +4359 0.4359 44.4795852485747361 45.198011359540 +4360 0.4360 44.4750825755312107 44.855449510960 +4361 0.4361 44.4706141147135128 44.513766842990 +4362 0.4362 44.4661797782794821 44.172961837590 +4363 0.4363 44.4617794785386451 43.833032979150 +4364 0.4364 44.4574131279519662 43.493978754440 +4365 0.4365 44.4530806391316133 43.155797652649 +4366 0.4366 44.4487819248407163 42.818488165340 +4367 0.4367 44.4445168979931253 42.482048786450 +4368 0.4368 44.4402854716531905 42.146478012310 +4369 0.4369 44.4360875590354922 41.811774341641 +4370 0.4370 44.4319230735046347 41.477936275541 +4371 0.4371 44.4277919285749832 41.144962317439 +4372 0.4372 44.4236940379104510 40.812850973181 +4373 0.4373 44.4196293153242436 40.481600750941 +4374 0.4374 44.4155976747786312 40.151210161270 +4375 0.4375 44.4115990303847141 39.821677717070 +4376 0.4376 44.4076332964021816 39.493001933600 +4377 0.4377 44.4037003872390770 39.165181328440 +4378 0.4378 44.3998002174515776 38.838214421570 +4379 0.4379 44.3959327017437388 38.512099735250 +4380 0.4380 44.3920977549672671 38.186835794120 +4381 0.4381 44.3882952921213061 37.862421125121 +4382 0.4382 44.3845252283521745 37.538854257560 +4383 0.4383 44.3807874789531454 37.216133723020 +4384 0.4384 44.3770819593642187 36.894258055450 +4385 0.4385 44.3734085851718945 36.573225791100 +4386 0.4386 44.3697672721089162 36.253035468520 +4387 0.4387 44.3661579360540586 35.933685628601 +4388 0.4388 44.3625804930319063 35.615174814499 +4389 0.4389 44.3590348592125920 35.297501571720 +4390 0.4390 44.3555209509116040 34.980664448050 +4391 0.4391 44.3520386845895231 34.664661993540 +4392 0.4392 44.3485879768518174 34.349492760600 +4393 0.4393 44.3451687444485927 34.035155303850 +4394 0.4394 44.3417809042743869 33.721648180240 +4395 0.4395 44.3384243733679284 33.408969949000 +4396 0.4396 44.3350990689118944 33.097119171621 +4397 0.4397 44.3318049082327192 32.786094411900 +4398 0.4398 44.3285418088003311 32.475894235849 +4399 0.4399 44.3253096882279465 32.166517211780 +4400 0.4400 44.3221084642718424 31.857961910300 +4401 0.4401 44.3189380548311149 31.550226904190 +4402 0.4402 44.3157983779474804 31.243310768560 +4403 0.4403 44.3126893518050124 30.937212080729 +4404 0.4404 44.3096108947299641 30.631929420299 +4405 0.4405 44.3065629251904980 30.327461369090 +4406 0.4406 44.3035453617964876 30.023806511170 +4407 0.4407 44.3005581232992895 29.720963432840 +4408 0.4408 44.2976011285915163 29.418930722631 +4409 0.4409 44.2946742967068161 29.117706971330 +4410 0.4410 44.2917775468196524 28.817290771920 +4411 0.4411 44.2889107982450767 28.517680719610 +4412 0.4412 44.2860739704385011 28.218875411860 +4413 0.4413 44.2832669829954924 27.920873448290 +4414 0.4414 44.2804897556515371 27.623673430779 +4415 0.4415 44.2777422082818291 27.327273963399 +4416 0.4416 44.2750242609010414 27.031673652400 +4417 0.4417 44.2723358336631065 26.736871106290 +4418 0.4418 44.2696768468610031 26.442864935730 +4419 0.4419 44.2670472209265355 26.149653753590 +4420 0.4420 44.2644468764301067 25.857236174930 +4421 0.4421 44.2618757340805118 25.565610816980 +4422 0.4422 44.2593337147247041 25.274776299180 +4423 0.4423 44.2568207393475888 24.984731243150 +4424 0.4424 44.2543367290717953 24.695474272659 +4425 0.4425 44.2518816051574788 24.407004013670 +4426 0.4426 44.2494552890020785 24.119319094310 +4427 0.4427 44.2470577021401184 23.832418144861 +4428 0.4428 44.2446887662429873 23.546299797810 +4429 0.4429 44.2423484031187115 23.260962687730 +4430 0.4430 44.2400365347117557 22.976405451430 +4431 0.4431 44.2377530831027954 22.692626727800 +4432 0.4432 44.2354979705085114 22.409625157929 +4433 0.4433 44.2332711192813619 22.127399385040 +4434 0.4434 44.2310724519093839 21.845948054470 +4435 0.4435 44.2289018910159726 21.565269813730 +4436 0.4436 44.2267593593596615 21.285363312450 +4437 0.4437 44.2246447798339233 21.006227202380 +4438 0.4438 44.2225580754669352 20.727860137429 +4439 0.4439 44.2204991694213803 20.450260773600 +4440 0.4440 44.2184679849942484 20.173427769020 +4441 0.4441 44.2164644456166016 19.897359783980 +4442 0.4442 44.2144884748533613 19.622055480790 +4443 0.4443 44.2125399964031232 19.347513523981 +4444 0.4444 44.2106189340979157 19.073732580110 +4445 0.4445 44.2087252119030154 18.800711317880 +4446 0.4446 44.2068587539167197 18.528448408080 +4447 0.4447 44.2050194843701334 18.256942523591 +4448 0.4448 44.2032073276269841 17.986192339409 +4449 0.4449 44.2014222081833807 17.716196532599 +4450 0.4450 44.1996640506676357 17.446953782330 +4451 0.4451 44.1979327798400305 17.178462769840 +4452 0.4452 44.1962283205926170 16.910722178460 +4453 0.4453 44.1945505979490179 16.643730693590 +4454 0.4454 44.1928995370641999 16.377487002700 +4455 0.4455 44.1912750632242961 16.111989795360 +4456 0.4456 44.1896771018463710 15.847237763151 +4457 0.4457 44.1881055784782220 15.583229599780 +4458 0.4458 44.1865604187981873 15.319964000980 +4459 0.4459 44.1850415486149117 15.057439664551 +4460 0.4460 44.1835488938671688 14.795655290341 +4461 0.4461 44.1820823806236405 14.534609580251 +4462 0.4462 44.1806419350827184 14.274301238230 +4463 0.4463 44.1792274835722907 14.014728970270 +4464 0.4464 44.1778389525495570 13.755891484420 +4465 0.4465 44.1764762686008012 13.497787490740 +4466 0.4466 44.1751393584412000 13.240415701350 +4467 0.4467 44.1738281489146161 12.983774830370 +4468 0.4468 44.1725425669933998 12.727863593990 +4469 0.4469 44.1712825397781828 12.472680710390 +4470 0.4470 44.1700479944976721 12.218224899770 +4471 0.4471 44.1688388585084653 11.964494884390 +4472 0.4472 44.1676550592948232 11.711489388480 +4473 0.4473 44.1664965244684851 11.459207138290 +4474 0.4474 44.1653631817684627 11.207646862100 +4475 0.4475 44.1642549590608482 10.956807290180 +4476 0.4476 44.1631717843386014 10.706687154800 +4477 0.4477 44.1621135857213503 10.457285190240 +4478 0.4478 44.1610802914551996 10.208600132780 +4479 0.4479 44.1600718299125248 9.960630720660 +4480 0.4480 44.1590881295917868 9.713375694140 +4481 0.4481 44.1581291191173051 9.466833795460 +4482 0.4482 44.1571947272390872 9.221003768840 +4483 0.4483 44.1562848828326224 8.975884360470 +4484 0.4484 44.1553995148986687 8.731474318540 +4485 0.4485 44.1545385525630820 8.487772393200 +4486 0.4486 44.1537019250765965 8.244777336570 +4487 0.4487 44.1528895618146322 8.002487902740 +4488 0.4488 44.1521013922771033 7.760902847770 +4489 0.4489 44.1513373460882335 7.520020929660 +4490 0.4490 44.1505973529963285 7.279840908380 +4491 0.4491 44.1498813428736128 7.040361545870 +4492 0.4492 44.1491892457160162 6.801581606000 +4493 0.4493 44.1485209916429895 6.563499854600 +4494 0.4494 44.1478765108972908 6.326115059440 +4495 0.4495 44.1472557338448084 6.089425990240 +4496 0.4496 44.1466585909743614 5.853431418660 +4497 0.4497 44.1460850128975153 5.618130118260 +4498 0.4498 44.1455349303483757 5.383520864590 +4499 0.4499 44.1450082741833896 5.149602435090 +4500 0.4500 44.1445049753811745 4.916373609150 +4501 0.4501 44.1440249650423127 4.683833168080 +4502 0.4502 44.1435681743891521 4.451979895080 +4503 0.4503 44.1431345347656361 4.220812575310 +4504 0.4504 44.1427239776370826 3.990329995820 +4505 0.4505 44.1423364345900140 3.760530945580 +4506 0.4506 44.1419718373319583 3.531414215480 +4507 0.4507 44.1416301176912711 3.302978598270 +4508 0.4508 44.1413112076169227 3.075222888660 +4509 0.4509 44.1410150391783276 2.848145883230 +4510 0.4510 44.1407415445651452 2.621746380470 +4511 0.4511 44.1404906560870884 2.396023180730 +4512 0.4512 44.1402623061737387 2.170975086290 +4513 0.4513 44.1400564273743612 1.946600901300 +4514 0.4514 44.1398729523577060 1.722899431790 +4515 0.4515 44.1397118139118305 1.499869485690 +4516 0.4516 44.1395729449439074 1.277509872790 +4517 0.4517 44.1394562784800328 1.055819404750 +4518 0.4518 44.1393617476650419 0.834796895130 +4519 0.4519 44.1392892857623167 0.614441159340 +4520 0.4520 44.1392388261536155 0.394751014660 +4521 0.4521 44.1392103023388742 0.175725280220 +4522 0.4522 44.1392036479360144 -0.042637222970 +4523 0.4523 44.1392187966807654 -0.260337672040 +4524 0.4524 44.1392556824264801 -0.477377242290 +4525 0.4525 44.1393142391439497 -0.693757107130 +4526 0.4526 44.1393944009212120 -0.909478438170 +4527 0.4527 44.1394961019633740 -1.124542405130 +4528 0.4528 44.1396192765924269 -1.338950175920 +4529 0.4529 44.1397638592470543 -1.552702916580 +4530 0.4530 44.1399297844824474 -1.765801791330 +4531 0.4531 44.1401169869701420 -1.978247962570 +4532 0.4532 44.1403254014978117 -2.190042590850 +4533 0.4533 44.1405549629690981 -2.401186834870 +4534 0.4534 44.1408056064034184 -2.611681851560 +4535 0.4535 44.1410772669357954 -2.821528795980 +4536 0.4536 44.1413698798166649 -3.030728821400 +4537 0.4537 44.1416833804116990 -3.239283079250 +4538 0.4538 44.1420177042016206 -3.447192719160 +4539 0.4539 44.1423727867820261 -3.654458888950 +4540 0.4540 44.1427485638632078 -3.861082734630 +4541 0.4541 44.1431449712699617 -4.067065400400 +4542 0.4542 44.1435619449414176 -4.272408028650 +4543 0.4543 44.1439994209308537 -4.477111760010 +4544 0.4544 44.1444573354055194 -4.681177733260 +4545 0.4545 44.1449356246464504 -4.884607085420 +4546 0.4546 44.1454342250483052 -5.087400951710 +4547 0.4547 44.1459530731191663 -5.289560465550 +4548 0.4548 44.1464921054803767 -5.491086758600 +4549 0.4549 44.1470512588663411 -5.691980960730 +4550 0.4550 44.1476304701243762 -5.892244200010 +4551 0.4551 44.1482296762145126 -6.091877602760 +4552 0.4552 44.1488488142093232 -6.290882293520 +4553 0.4553 44.1494878212937536 -6.489259395040 +4554 0.4554 44.1501466347649227 -6.687010028310 +4555 0.4555 44.1508251920319665 -6.884135312580 +4556 0.4556 44.1515234306158604 -7.080636365300 +4557 0.4557 44.1522412881492343 -7.276514302190 +4558 0.4558 44.1529787023762026 -7.471770237190 +4559 0.4559 44.1537356111521859 -7.666405282490 +4560 0.4560 44.1545119524437411 -7.860420548550 +4561 0.4561 44.1553076643283688 -8.053817144060 +4562 0.4562 44.1561226849943722 -8.246596175960 +4563 0.4563 44.1569569527406429 -8.438758749470 +4564 0.4564 44.1578104059765195 -8.630305968050 +4565 0.4565 44.1586829832215955 -8.821238933420 +4566 0.4566 44.1595746231055415 -9.011558745570 +4567 0.4567 44.1604852643679564 -9.201266502790 +4568 0.4568 44.1614148458581752 -9.390363301570 +4569 0.4569 44.1623633065350916 -9.578850236750 +4570 0.4570 44.1633305854670013 -9.766728401400 +4571 0.4571 44.1643166218314178 -9.953998886860 +4572 0.4572 44.1653213549149015 -10.140662782790 +4573 0.4573 44.1663447241128964 -10.326721177110 +4574 0.4574 44.1673866689295522 -10.512175156020 +4575 0.4575 44.1684471289775544 -10.697025804050 +4576 0.4576 44.1695260439779531 -10.881274203960 +4577 0.4577 44.1706233537599928 -11.064921436860 +4578 0.4578 44.1717389982609419 -11.247968582120 +4579 0.4579 44.1728729175259218 -11.430416717430 +4580 0.4580 44.1740250517077300 -11.612266918790 +4581 0.4581 44.1751953410666971 -11.793520260500 +4582 0.4582 44.1763837259704815 -11.974177815140 +4583 0.4583 44.1775901468939196 -12.154240653640 +4584 0.4584 44.1788145444188629 -12.333709845230 +4585 0.4585 44.1800568592339999 -12.512586457440 +4586 0.4586 44.1813170321346789 -12.690871556150 +4587 0.4587 44.1825950040227653 -12.868566205530 +4588 0.4588 44.1838907159064433 -13.045671468100 +4589 0.4589 44.1852041089000807 -13.222188404690 +4590 0.4590 44.1865351242240365 -13.398118074470 +4591 0.4591 44.1878837032045055 -13.573461534940 +4592 0.4592 44.1892497872733472 -13.748219841930 +4593 0.4593 44.1906333179679223 -13.922394049620 +4594 0.4594 44.1920342369309296 -14.095985210510 +4595 0.4595 44.1934524859102282 -14.268994375460 +4596 0.4596 44.1948880067586813 -14.441422593670 +4597 0.4597 44.1963407414339997 -14.613270912680 +4598 0.4598 44.1978106319985500 -14.784540378390 +4599 0.4599 44.1992976206192196 -14.955232035070 +4600 0.4600 44.2008016495672393 -15.125346925290 +4601 0.4601 44.2023226612180054 -15.294886090050 +4602 0.4602 44.2038605980509374 -15.463850568650 +4603 0.4603 44.2054154026493080 -15.632241398800 +4604 0.4604 44.2069870177000794 -15.800059616560 +4605 0.4605 44.2085753859937256 -15.967306256330 +4606 0.4606 44.2101804504240903 -16.133982350930 +4607 0.4607 44.2118021539882093 -16.300088931510 +4608 0.4608 44.2134404397861687 -16.465627027630 +4609 0.4609 44.2150952510209123 -16.630597667220 +4610 0.4610 44.2167665309981004 -16.795001876570 +4611 0.4611 44.2184542231259456 -16.958840680380 +4612 0.4612 44.2201582709150500 -17.122115101740 +4613 0.4613 44.2218786179782413 -17.284826162100 +4614 0.4614 44.2236152080304095 -17.446974881320 +4615 0.4615 44.2253679848883579 -17.608562277650 +4616 0.4616 44.2271368924706252 -17.769589367750 +4617 0.4617 44.2289218747973436 -17.930057166670 +4618 0.4618 44.2307228759900681 -18.089966687850 +4619 0.4619 44.2325398402716203 -18.249318943160 +4620 0.4620 44.2343727119659178 -18.408114942850 +4621 0.4621 44.2362214354978391 -18.566355695590 +4622 0.4622 44.2380859553930392 -18.724042208470 +4623 0.4623 44.2399662162778142 -18.881175486980 +4624 0.4624 44.2418621628789168 -19.037756535060 +4625 0.4625 44.2437737400234212 -19.193786355010 +4626 0.4626 44.2457008926385527 -19.349265947590 +4627 0.4627 44.2476435657515310 -19.504196312010 +4628 0.4628 44.2496017044894216 -19.658578445830 +4629 0.4629 44.2515752540789720 -19.812413345120 +4630 0.4630 44.2535641598464480 -19.965702004350 +4631 0.4631 44.2555683672174851 -20.118445416400 +4632 0.4632 44.2575878217169389 -20.270644572630 +4633 0.4633 44.2596224689687077 -20.422300462790 +4634 0.4634 44.2616722546956041 -20.573414075130 +4635 0.4635 44.2637371247191780 -20.723986396300 +4636 0.4636 44.2658170249595599 -20.874018411400 +4637 0.4637 44.2679119014353333 -21.023511104000 +4638 0.4638 44.2700217002633423 -21.172465456120 +4639 0.4639 44.2721463676585572 -21.320882448190 +4640 0.4640 44.2742858499339249 -21.468763059170 +4641 0.4641 44.2764400935002058 -21.616108266410 +4642 0.4642 44.2786090448658172 -21.762919045760 +4643 0.4643 44.2807926506366840 -21.909196371520 +4644 0.4644 44.2829908575160829 -22.054941216460 +4645 0.4645 44.2852036123044996 -22.200154551820 +4646 0.4646 44.2874308618994590 -22.344837347310 +4647 0.4647 44.2896725532953823 -22.488990571100 +4648 0.4648 44.2919286335834315 -22.632615189860 +4649 0.4649 44.2941990499513594 -22.775712168700 +4650 0.4650 44.2964837496833610 -22.918282471270 +4651 0.4651 44.2987826801599098 -23.060327059650 +4652 0.4652 44.3010957888576158 -23.201846894410 +4653 0.4653 44.3034230233490689 -23.342842934650 +4654 0.4654 44.3057643313026972 -23.483316137890 +4655 0.4655 44.3081196604826033 -23.623267460200 +4656 0.4656 44.3104889587484223 -23.762697856140 +4657 0.4657 44.3128721740551654 -23.901608278730 +4658 0.4658 44.3152692544530780 -24.039999679530 +4659 0.4659 44.3176801480874829 -24.177873008570 +4660 0.4660 44.3201048031986318 -24.315229214410 +4661 0.4661 44.3225431681215554 -24.452069244100 +4662 0.4662 44.3249951912859217 -24.588394043190 +4663 0.4663 44.3274608212158725 -24.724204555770 +4664 0.4664 44.3299400065298812 -24.859501724420 +4665 0.4665 44.3324326959406108 -24.994286490240 +4666 0.4666 44.3349388382547644 -25.128559792860 +4667 0.4667 44.3374583823729296 -25.262322570410 +4668 0.4668 44.3399912772894282 -25.395575759550 +4669 0.4669 44.3425374720921823 -25.528320295480 +4670 0.4670 44.3450969159625501 -25.660557111920 +4671 0.4671 44.3476695581751983 -25.792287141090 +4672 0.4672 44.3502553480979387 -25.923511313770 +4673 0.4673 44.3528542351915931 -26.054230559310 +4674 0.4674 44.3554661690098371 -26.184445805510 +4675 0.4675 44.3580910991990507 -26.314157978770 +4676 0.4676 44.3607289754981906 -26.443368004040 +4677 0.4677 44.3633797477386267 -26.572076804750 +4678 0.4678 44.3660433658440141 -26.700285302950 +4679 0.4679 44.3687197798301227 -26.827994419190 +4680 0.4680 44.3714089398047093 -26.955205072580 +4681 0.4681 44.3741107959673755 -27.081918180780 +4682 0.4682 44.3768252986094183 -27.208134660030 +4683 0.4683 44.3795523981136739 -27.333855425100 +4684 0.4684 44.3822920449543972 -27.459081389310 +4685 0.4685 44.3850441896970906 -27.583813464580 +4686 0.4686 44.3878087829983912 -27.708052561360 +4687 0.4687 44.3905857756058921 -27.831799588680 +4688 0.4688 44.3933751183580299 -27.955055454130 +4689 0.4689 44.3961767621839272 -28.077821063880 +4690 0.4690 44.3989906581032514 -28.200097322670 +4691 0.4691 44.4018167572260793 -28.321885133820 +4692 0.4692 44.4046550107527338 -28.443185399210 +4693 0.4693 44.4075053699736628 -28.563999019320 +4694 0.4694 44.4103677862692905 -28.684326893180 +4695 0.4695 44.4132422111098748 -28.804169918440 +4696 0.4696 44.4161285960553656 -28.923528991330 +4697 0.4697 44.4190268927552623 -29.042405006630 +4698 0.4698 44.4219370529484792 -29.160798857770 +4699 0.4699 44.4248590284632030 -29.278711436720 +4700 0.4700 44.4277927712167440 -29.396143634080 +4701 0.4701 44.4307382332154006 -29.513096339040 +4702 0.4702 44.4336953665543177 -29.629570439360 +4703 0.4703 44.4366641234173585 -29.745566821430 +4704 0.4704 44.4396444560769410 -29.861086370260 +4705 0.4705 44.4426363168939247 -29.976129969420 +4706 0.4706 44.4456396583174538 -30.090698501110 +4707 0.4707 44.4486544328848154 -30.204792846150 +4708 0.4708 44.4516805932213188 -30.318413883960 +4709 0.4709 44.4547180920401459 -30.431562492590 +4710 0.4710 44.4577668821422094 -30.544239548670 +4711 0.4711 44.4608269164160177 -30.656445927500 +4712 0.4712 44.4638981478375399 -30.768182502950 +4713 0.4713 44.4669805294700637 -30.879450147540 +4714 0.4714 44.4700740144640605 -30.990249732430 +4715 0.4715 44.4731785560570501 -31.100582127380 +4716 0.4716 44.4762941075734588 -31.210448200770 +4717 0.4717 44.4794206224244775 -31.319848819650 +4718 0.4718 44.4825580541079475 -31.428784849680 +4719 0.4719 44.4857063562081905 -31.537257155160 +4720 0.4720 44.4888654823959016 -31.645266599020 +4721 0.4721 44.4920353864279932 -31.752814042850 +4722 0.4722 44.4952160221474813 -31.859900346880 +4723 0.4723 44.4984073434833221 -31.966526369930 +4724 0.4724 44.5016093044502981 -32.072692969550 +4725 0.4725 44.5048218591488691 -32.178401001880 +4726 0.4726 44.5080449617650515 -32.283651321740 +4727 0.4727 44.5112785665702688 -32.388444782590 +4728 0.4728 44.5145226279212238 -32.492782236540 +4729 0.4729 44.5177771002597709 -32.596664534380 +4730 0.4730 44.5210419381127664 -32.700092525520 +4731 0.4731 44.5243170960919485 -32.803067058060 +4732 0.4732 44.5276025288937873 -32.905588978780 +4733 0.4733 44.5308981912993787 -33.007659133090 +4734 0.4734 44.5342040381742876 -33.109278365070 +4735 0.4735 44.5375200244684137 -33.210447517490 +4736 0.4736 44.5408461052158771 -33.311167431770 +4737 0.4737 44.5441822355348691 -33.411438948030 +4738 0.4738 44.5475283706275249 -33.511262905040 +4739 0.4739 44.5508844657797880 -33.610640140250 +4740 0.4740 44.5542504763612897 -33.709571489820 +4741 0.4741 44.5576263578252068 -33.808057788550 +4742 0.4742 44.5610120657081339 -33.906099869960 +4743 0.4743 44.5644075556299413 -34.003698566210 +4744 0.4744 44.5678127832936610 -34.100854708200 +4745 0.4745 44.5712277044853451 -34.197569125510 +4746 0.4746 44.5746522750739373 -34.293842646370 +4747 0.4747 44.5780864510111456 -34.389676097740 +4748 0.4748 44.5815301883312998 -34.485070305290 +4749 0.4749 44.5849834431512306 -34.580026093330 +4750 0.4750 44.5884461716701423 -34.674544284950 +4751 0.4751 44.5919183301694844 -34.768625701870 +4752 0.4752 44.5953998750128022 -34.862271164550 +4753 0.4753 44.5988907626456381 -34.955481492160 +4754 0.4754 44.6023909495953745 -35.048257502550 +4755 0.4755 44.6059003924711206 -35.140600012310 +4756 0.4756 44.6094190479635699 -35.232509836740 +4757 0.4757 44.6129468728449012 -35.323987789820 +4758 0.4758 44.6164838239686077 -35.415034684280 +4759 0.4759 44.6200298582693975 -35.505651331580 +4760 0.4760 44.6235849327630660 -35.595838541850 +4761 0.4761 44.6271490045463608 -35.685597124000 +4762 0.4762 44.6307220307968393 -35.774927885610 +4763 0.4763 44.6343039687727696 -35.863831633020 +4764 0.4764 44.6378947758129883 -35.952309171290 +4765 0.4765 44.6414944093367652 -36.040361304220 +4766 0.4766 44.6451028268436900 -36.127988834320 +4767 0.4767 44.6487199859135515 -36.215192562850 +4768 0.4768 44.6523458442061809 -36.301973289800 +4769 0.4769 44.6559803594613669 -36.388331813900 +4770 0.4770 44.6596234894986921 -36.474268932620 +4771 0.4771 44.6632751922174336 -36.559785442190 +4772 0.4772 44.6669354255964208 -36.644882137530 +4773 0.4773 44.6706041476939149 -36.729559812370 +4774 0.4774 44.6742813166474875 -36.813819259140 +4775 0.4775 44.6779668906739005 -36.897661269060 +4776 0.4776 44.6816608280689564 -36.981086632060 +4777 0.4777 44.6853630872074064 -37.064096136870 +4778 0.4778 44.6890736265427932 -37.146690570910 +4779 0.4779 44.6927924046073599 -37.228870720430 +4780 0.4780 44.6965193800118996 -37.310637370400 +4781 0.4781 44.7002545114456495 -37.391991304550 +4782 0.4782 44.7039977576761487 -37.472933305380 +4783 0.4783 44.7077490775491242 -37.553464154150 +4784 0.4784 44.7115084299883776 -37.633584630910 +4785 0.4785 44.7152757739956428 -37.713295514450 +4786 0.4786 44.7190510686504794 -37.792597582350 +4787 0.4787 44.7228342731101449 -37.871491610940 +4788 0.4788 44.7266253466094597 -37.949978375360 +4789 0.4789 44.7304242484607002 -38.028058649500 +4790 0.4790 44.7342309380534786 -38.105733206010 +4791 0.4791 44.7380453748546003 -38.183002816390 +4792 0.4792 44.7418675184079646 -38.259868250840 +4793 0.4793 44.7456973283344297 -38.336330278400 +4794 0.4794 44.7495347643316919 -38.412389666860 +4795 0.4795 44.7533797861741789 -38.488047182840 +4796 0.4796 44.7572323537129080 -38.563303591690 +4797 0.4797 44.7610924268753720 -38.638159657630 +4798 0.4798 44.7649599656654331 -38.712616143590 +4799 0.4799 44.7688349301631803 -38.786673811360 +4800 0.4800 44.7727172805248230 -38.860333421490 +4801 0.4801 44.7766069769825634 -38.933595733360 +4802 0.4802 44.7805039798444895 -39.006461505110 +4803 0.4803 44.7844082494944331 -39.078931493710 +4804 0.4804 44.7883197463918634 -39.151006454930 +4805 0.4805 44.7922384310717803 -39.222687143350 +4806 0.4806 44.7961642641445650 -39.293974312360 +4807 0.4807 44.8000972062958880 -39.364868714140 +4808 0.4808 44.8040372182865809 -39.435371099710 +4809 0.4809 44.8079842609525087 -39.505482218900 +4810 0.4810 44.8119382952044703 -39.575202820320 +4811 0.4811 44.8158992820280559 -39.644533651430 +4812 0.4812 44.8198671824835557 -39.713475458510 +4813 0.4813 44.8238419577058167 -39.782028986660 +4814 0.4814 44.8278235689041367 -39.850194979780 +4815 0.4815 44.8318119773621575 -39.917974180630 +4816 0.4816 44.8358071444377302 -39.985367330770 +4817 0.4817 44.8398090315628011 -40.052375170600 +4818 0.4818 44.8438176002432982 -40.118998439340 +4819 0.4819 44.8478328120590177 -40.185237875060 +4820 0.4820 44.8518546286635029 -40.251094214650 +4821 0.4821 44.8558830117839307 -40.316568193840 +4822 0.4822 44.8599179232209835 -40.381660547190 +4823 0.4823 44.8639593248487500 -40.446372008100 +4824 0.4824 44.8680071786145973 -40.510703308830 +4825 0.4825 44.8720614465390639 -40.574655180470 +4826 0.4826 44.8761220907157323 -40.638228352940 +4827 0.4827 44.8801890733111293 -40.701423555050 +4828 0.4828 44.8842623565645980 -40.764241514390 +4829 0.4829 44.8883419027881914 -40.826682957460 +4830 0.4830 44.8924276743665445 -40.888748609600 +4831 0.4831 44.8965196337567747 -40.950439194980 +4832 0.4832 44.9006177434883540 -41.011755436630 +4833 0.4833 44.9047219661630095 -41.072698056460 +4834 0.4834 44.9088322644545954 -41.133267775240 +4835 0.4835 44.9129486011089867 -41.193465312540 +4836 0.4836 44.9170709389439580 -41.253291386890 +4837 0.4837 44.9211992408490843 -41.312746715600 +4838 0.4838 44.9253334697856062 -41.371832014890 +4839 0.4839 44.9294735887863439 -41.430547999830 +4840 0.4840 44.9336195609555560 -41.488895384370 +4841 0.4841 44.9377713494688393 -41.546874881320 +4842 0.4842 44.9419289175730228 -41.604487202380 +4843 0.4843 44.9460922285860462 -41.661733058100 +4844 0.4844 44.9502612458968471 -41.718613157930 +4845 0.4845 44.9544359329652536 -41.775128210190 +4846 0.4846 44.9586162533218641 -41.831278922060 +4847 0.4847 44.9628021705679473 -41.887065999630 +4848 0.4848 44.9669936483753219 -41.942490147870 +4849 0.4849 44.9711906504862426 -41.997552070610 +4850 0.4850 44.9753931407133010 -42.052252470600 +4851 0.4851 44.9796010829393040 -42.106592049470 +4852 0.4852 44.9838144411171612 -42.160571507700 +4853 0.4853 44.9880331792697845 -42.214191544720 +4854 0.4854 44.9922572614899607 -42.267452858820 +4855 0.4855 44.9964866519402591 -42.320356147190 +4856 0.4856 45.0007213148529175 -42.372902105930 +4857 0.4857 45.0049612145297147 -42.425091430010 +4858 0.4858 45.0092063153418849 -42.476924813340 +4859 0.4859 45.0134565817299901 -42.528402948710 +4860 0.4860 45.0177119782038133 -42.579526527790 +4861 0.4861 45.0219724693422663 -42.630296241200 +4862 0.4862 45.0262380197932472 -42.680712778440 +4863 0.4863 45.0305085942735630 -42.730776827940 +4864 0.4864 45.0347841575688079 -42.780489077000 +4865 0.4865 45.0390646745332504 -42.829850211880 +4866 0.4866 45.0433501100897331 -42.878860917710 +4867 0.4867 45.0476404292295456 -42.927521878590 +4868 0.4868 45.0519355970123456 -42.975833777470 +4869 0.4869 45.0562355785660316 -43.023797296280 +4870 0.4870 45.0605403390866357 -43.071413115830 +4871 0.4871 45.0648498438382177 -43.118681915880 +4872 0.4872 45.0691640581527651 -43.165604375070 +4873 0.4873 45.0734829474300724 -43.212181171030 +4874 0.4874 45.0778064771376350 -43.258412980260 +4875 0.4875 45.0821346128105560 -43.304300478220 +4876 0.4876 45.0864673200514332 -43.349844339290 +4877 0.4877 45.0908045645302380 -43.395045236780 +4878 0.4878 45.0951463119842231 -43.439903842930 +4879 0.4879 45.0994925282178158 -43.484420828940 +4880 0.4880 45.1038431791025118 -43.528596864930 +4881 0.4881 45.1081982305767539 -43.572432619940 +4882 0.4882 45.1125576486458471 -43.615928761980 +4883 0.4883 45.1169213993818445 -43.659085957990 +4884 0.4884 45.1212894489234344 -43.701904873850 +4885 0.4885 45.1256617634758470 -43.744386174380 +4886 0.4886 45.1300383093107342 -43.786530523380 +4887 0.4887 45.1344190527660842 -43.828338583550 +4888 0.4888 45.1388039602460864 -43.869811016560 +4889 0.4889 45.1431929982210676 -43.910948483070 +4890 0.4890 45.1475861332273496 -43.951751642630 +4891 0.4891 45.1519833318671715 -43.992221153770 +4892 0.4892 45.1563845608085614 -44.032357673990 +4893 0.4893 45.1607897867852515 -44.072161859740 +4894 0.4894 45.1651989765965567 -44.111634366420 +4895 0.4895 45.1696120971072972 -44.150775848410 +4896 0.4896 45.1740291152476701 -44.189586959030 +4897 0.4897 45.1784499980131500 -44.228068350580 +4898 0.4898 45.1828747124643968 -44.266220674320 +4899 0.4899 45.1873032257271348 -44.304044580470 +4900 0.4900 45.1917355049920673 -44.341540718250 +4901 0.4901 45.1961715175147702 -44.378709735810 +4902 0.4902 45.2006112306155785 -44.415552280300 +4903 0.4903 45.2050546116794862 -44.452068997830 +4904 0.4904 45.2095016281560547 -44.488260533490 +4905 0.4905 45.2139522475592983 -44.524127531360 +4906 0.4906 45.2184064374675927 -44.559670634480 +4907 0.4907 45.2228641655235606 -44.594890484870 +4908 0.4908 45.2273253994339797 -44.629787723540 +4909 0.4909 45.2317901069696831 -44.664362990480 +4910 0.4910 45.2362582559654385 -44.698616924690 +4911 0.4911 45.2407298143198773 -44.732550164100 +4912 0.4912 45.2452047499953665 -44.766163345680 +4913 0.4913 45.2496830310179163 -44.799457105360 +4914 0.4914 45.2541646254770882 -44.832432078080 +4915 0.4915 45.2586495015258805 -44.865088897760 +4916 0.4916 45.2631376273806367 -44.897428197320 +4917 0.4917 45.2676289713209385 -44.929450608670 +4918 0.4918 45.2721235016895065 -44.961156762730 +4919 0.4919 45.2766211868921147 -44.992547289400 +4920 0.4920 45.2811219953974629 -45.023622817600 +4921 0.4921 45.2856258957371054 -45.054383975230 +4922 0.4922 45.2901328565053305 -45.084831389230 +4923 0.4923 45.2946428463590678 -45.114965685480 +4924 0.4924 45.2991558340177889 -45.144787488950 +4925 0.4925 45.3036717882634150 -45.174297423540 +4926 0.4926 45.3081906779402033 -45.203496112220 +4927 0.4927 45.3127124719546615 -45.232384176930 +4928 0.4928 45.3172371392754414 -45.260962238650 +4929 0.4929 45.3217646489332395 -45.289230917360 +4930 0.4930 45.3262949700207116 -45.317190832050 +4931 0.4931 45.3308280716923520 -45.344842600740 +4932 0.4932 45.3353639231644152 -45.372186840460 +4933 0.4933 45.3399024937148027 -45.399224167260 +4934 0.4934 45.3444437526829773 -45.425955196220 +4935 0.4935 45.3489876694698637 -45.452380541450 +4936 0.4936 45.3535342135377419 -45.478500816050 +4937 0.4937 45.3580833544101552 -45.504316632190 +4938 0.4938 45.3626350616718170 -45.529828601030 +4939 0.4939 45.3671893049685053 -45.555037332780 +4940 0.4940 45.3717460540069766 -45.579943436680 +4941 0.4941 45.3763052785548595 -45.604547521000 +4942 0.4942 45.3808669484405627 -45.628850193030 +4943 0.4943 45.3854310335531679 -45.652852059100 +4944 0.4944 45.3899975038423520 -45.676553724610 +4945 0.4945 45.3945663293182804 -45.699955793960 +4946 0.4946 45.3991374800515075 -45.723058870590 +4947 0.4947 45.4037109261728844 -45.745863556990 +4948 0.4948 45.4082866378734664 -45.768370454700 +4949 0.4949 45.4128645854044137 -45.790580164300 +4950 0.4950 45.4174447390768989 -45.812493285420 +4951 0.4951 45.4220270692620076 -45.834110416700 +4952 0.4952 45.4266115463906388 -45.855432155890 +4953 0.4953 45.4311981409534198 -45.876459099740 +4954 0.4954 45.4357868235006137 -45.897191844070 +4955 0.4955 45.4403775646420058 -45.917630983750 +4956 0.4956 45.4449703350468255 -45.937777112700 +4957 0.4957 45.4495651054436536 -45.957630823910 +4958 0.4958 45.4541618466203232 -45.977192709420 +4959 0.4959 45.4587605294238131 -45.996463360310 +4960 0.4960 45.4633611247601621 -46.015443366740 +4961 0.4961 45.4679636035943986 -46.034133317930 +4962 0.4962 45.4725679369504050 -46.052533802160 +4963 0.4963 45.4771740959108541 -46.070645406770 +4964 0.4964 45.4817820516171025 -46.088468718160 +4965 0.4965 45.4863917752690980 -46.106004321820 +4966 0.4966 45.4910032381253018 -46.123252802300 +4967 0.4967 45.4956164115025743 -46.140214743190 +4968 0.4968 45.5002312667760904 -46.156890727180 +4969 0.4969 45.5048477753792540 -46.173281336050 +4970 0.4970 45.5094659088035840 -46.189387150610 +4971 0.4971 45.5140856385986510 -46.205208750760 +4972 0.4972 45.5187069363719630 -46.220746715510 +4973 0.4973 45.5233297737888805 -46.236001622900 +4974 0.4974 45.5279541225725310 -46.250974050070 +4975 0.4975 45.5325799545036958 -46.265664573270 +4976 0.4976 45.5372072414207452 -46.280073767770 +4977 0.4977 45.5418359552195327 -46.294202207980 +4978 0.4978 45.5464660678533022 -46.308050467380 +4979 0.4979 45.5510975513325960 -46.321619118520 +4980 0.4980 45.5557303777251761 -46.334908733040 +4981 0.4981 45.5603645191559110 -46.347919881710 +4982 0.4982 45.5649999478067116 -46.360653134320 +4983 0.4983 45.5696366359164173 -46.373109059820 +4984 0.4984 45.5742745557807183 -46.385288226210 +4985 0.4985 45.5789136797520626 -46.397191200620 +4986 0.4986 45.5835539802395573 -46.408818549240 +4987 0.4987 45.5881954297088896 -46.420170837370 +4988 0.4988 45.5928380006822280 -46.431248629440 +4989 0.4989 45.5974816657381439 -46.442052488930 +4990 0.4990 45.6021263975115119 -46.452582978450 +4991 0.4991 45.6067721686934178 -46.462840659710 +4992 0.4992 45.6114189520310802 -46.472826093540 +4993 0.4993 45.6160667203277512 -46.482539839840 +4994 0.4994 45.6207154464426239 -46.491982457660 +4995 0.4995 45.6253651032907612 -46.501154505120 +4996 0.4996 45.6300156638429897 -46.510056539460 +4997 0.4997 45.6346671011258138 -46.518689117050 +4998 0.4998 45.6393193882213382 -46.527052793370 +4999 0.4999 45.6439724982671535 -46.535148122980 +5000 0.5000 45.6486264044562802 -46.542975659600 +5001 0.5001 45.6532810800370612 -46.550535956050 +5002 0.5002 45.6579364983130773 -46.557829564250 +5003 0.5003 45.6625926326430545 -46.564857035270 +5004 0.5004 45.6672494564407785 -46.571618919270 +5005 0.5005 45.6719069431750171 -46.578115765560 +5006 0.5006 45.6765650663694203 -46.584348122570 +5007 0.5007 45.6812237996024422 -46.590316537820 +5008 0.5008 45.6858831165072345 -46.596021558020 +5009 0.5009 45.6905429907715828 -46.601463728950 +5010 0.5010 45.6952033961378064 -46.606643595530 +5011 0.5011 45.6998643064026737 -46.611561701840 +5012 0.5012 45.7045256954173169 -46.616218591060 +5013 0.5013 45.7091875370871463 -46.620614805520 +5014 0.5014 45.7138498053717584 -46.624750886670 +5015 0.5015 45.7185124742848501 -46.628627375110 +5016 0.5016 45.7231755178941341 -46.632244810570 +5017 0.5017 45.7278389103212604 -46.635603731930 +5018 0.5018 45.7325026257417164 -46.638704677190 +5019 0.5019 45.7371666383847497 -46.641548183490 +5020 0.5020 45.7418309225332820 -46.644134787140 +5021 0.5021 45.7464954525238170 -46.646465023560 +5022 0.5022 45.7511602027463624 -46.648539427340 +5023 0.5023 45.7558251476443374 -46.650358532190 +5024 0.5024 45.7604902617144944 -46.651922871020 +5025 0.5025 45.7651555195068340 -46.653232975800 +5026 0.5026 45.7698208956245125 -46.654289377740 +5027 0.5027 45.7744863647237565 -46.655092607160 +5028 0.5028 45.7791519015137922 -46.655643193510 +5029 0.5029 45.7838174807567384 -46.655941665440 +5030 0.5030 45.7884830772675500 -46.655988550730 +5031 0.5031 45.7931486659139040 -46.655784376320 +5032 0.5032 45.7978142216161359 -46.655329668310 +5033 0.5033 45.8024797193471471 -46.654624951960 +5034 0.5034 45.8071451341323268 -46.653670751670 +5035 0.5035 45.8118104410494595 -46.652467591040 +5036 0.5036 45.8164756152286543 -46.651015992810 +5037 0.5037 45.8211406318522378 -46.649316478870 +5038 0.5038 45.8258054661546979 -46.647369570310 +5039 0.5039 45.8304700934225835 -46.645175787350 +5040 0.5040 45.8351344889944201 -46.642735649410 +5041 0.5041 45.8397986282606453 -46.640049675060 +5042 0.5042 45.8444624866635024 -46.637118382030 +5043 0.5043 45.8491260396969693 -46.633942287250 +5044 0.5044 45.8537892629066732 -46.630521906820 +5045 0.5045 45.8584521318898126 -46.626857755980 +5046 0.5046 45.8631146222950719 -46.622950349190 +5047 0.5047 45.8677767098225360 -46.618800200070 +5048 0.5048 45.8724383702236125 -46.614407821390 +5049 0.5049 45.8770995793009391 -46.609773725130 +5050 0.5050 45.8817603129083196 -46.604898422450 +5051 0.5051 45.8864205469506246 -46.599782423680 +5052 0.5052 45.8910802573837273 -46.594426238340 +5053 0.5053 45.8957394202143973 -46.588830375130 +5054 0.5054 45.9003980115002506 -46.582995341950 +5055 0.5055 45.9050560073496428 -46.576921645850 +5056 0.5056 45.9097133839215914 -46.570609793110 +5057 0.5057 45.9143701174257046 -46.564060289170 +5058 0.5058 45.9190261841220959 -46.557273638680 +5059 0.5059 45.9236815603213060 -46.550250345480 +5060 0.5060 45.9283362223842104 -46.542990912580 +5061 0.5061 45.9329901467219486 -46.535495842200 +5062 0.5062 45.9376433097958454 -46.527765635760 +5063 0.5063 45.9422956881173263 -46.519800793870 +5064 0.5064 45.9469472582478389 -46.511601816350 +5065 0.5065 45.9515979967987676 -46.503169202190 +5066 0.5066 45.9562478804313557 -46.494503449620 +5067 0.5067 45.9608968858566413 -46.485605056030 +5068 0.5068 45.9655449898353439 -46.476474518020 +5069 0.5069 45.9701921691778139 -46.467112331440 +5070 0.5070 45.9748384007439483 -46.457518991300 +5071 0.5071 45.9794836614431048 -46.447694991820 +5072 0.5072 45.9841279282340167 -46.437640826430 +5073 0.5073 45.9887711781247290 -46.427356987770 +5074 0.5074 45.9934133881725060 -46.416843967710 +5075 0.5075 45.9980545354837531 -46.406102257300 +5076 0.5076 46.0026945972139600 -46.395132346840 +5077 0.5077 46.0073335505675942 -46.383934725780 +5078 0.5078 46.0119713727980226 -46.372509882850 +5079 0.5079 46.0166080412074621 -46.360858305970 +5080 0.5080 46.0212435331468726 -46.348980482270 +5081 0.5081 46.0258778260158934 -46.336876898100 +5082 0.5082 46.0305108972627508 -46.324548039040 +5083 0.5083 46.0351427243841940 -46.311994389880 +5084 0.5084 46.0397732849254169 -46.299216434640 +5085 0.5085 46.0444025564799801 -46.286214656560 +5086 0.5086 46.0490305166897116 -46.272989538110 +5087 0.5087 46.0536571432446635 -46.259541560950 +5088 0.5088 46.0582824138830134 -46.245871206040 +5089 0.5089 46.0629063063909925 -46.231978953490 +5090 0.5090 46.0675287986028010 -46.217865282670 +5091 0.5091 46.0721498684005439 -46.203530672200 +5092 0.5092 46.0767694937141457 -46.188975599900 +5093 0.5093 46.0813876525212791 -46.174200542840 +5094 0.5094 46.0860043228472875 -46.159205977320 +5095 0.5095 46.0906194827650992 -46.143992378860 +5096 0.5096 46.0952331103951565 -46.128560222240 +5097 0.5097 46.0998451839053445 -46.112909981450 +5098 0.5098 46.1044556815109061 -46.097042129750 +5099 0.5099 46.1090645814743780 -46.080957139630 +5100 0.5100 46.1136718621054982 -46.064655482790 +5101 0.5101 46.1182775017611490 -46.048137630210 +5102 0.5102 46.1228814788452652 -46.031404052090 +5103 0.5103 46.1274837718087625 -46.014455217880 +5104 0.5104 46.1320843591494736 -45.997291596280 +5105 0.5105 46.1366832194120491 -45.979913655240 +5106 0.5106 46.1412803311879074 -45.962321861930 +5107 0.5107 46.1458756731151425 -45.944516682810 +5108 0.5108 46.1504692238784600 -45.926498583540 +5109 0.5109 46.1550609622090917 -45.908268029080 +5110 0.5110 46.1596508668847250 -45.889825483620 +5111 0.5111 46.1642389167294382 -45.871171410590 +5112 0.5112 46.1688250906136020 -45.852306272700 +5113 0.5113 46.1734093674538286 -45.833230531890 +5114 0.5114 46.1779917262128876 -45.813944649360 +5115 0.5115 46.1825721458996341 -45.794449085610 +5116 0.5116 46.1871506055689309 -45.774744300350 +5117 0.5117 46.1917270843215775 -45.754830752540 +5118 0.5118 46.1963015613042245 -45.734708900450 +5119 0.5119 46.2008740157093243 -45.714379201590 +5120 0.5120 46.2054444267750384 -45.693842112710 +5121 0.5121 46.2100127737851665 -45.673098089850 +5122 0.5122 46.2145790360690754 -45.652147588320 +5123 0.5123 46.2191431930016279 -45.630991062680 +5124 0.5124 46.2237052240030977 -45.609628966770 +5125 0.5125 46.2282651085391194 -45.588061753680 +5126 0.5126 46.2328228261205965 -45.566289875800 +5127 0.5127 46.2373783563036227 -45.544313784750 +5128 0.5128 46.2419316786894328 -45.522133931450 +5129 0.5129 46.2464827729243098 -45.499750766110 +5130 0.5130 46.2510316186995212 -45.477164738170 +5131 0.5131 46.2555781957512480 -45.454376296370 +5132 0.5132 46.2601224838604992 -45.431385888720 +5133 0.5133 46.2646644628530623 -45.408193962530 +5134 0.5134 46.2692041125994038 -45.384800964350 +5135 0.5135 46.2737414130146263 -45.361207340050 +5136 0.5136 46.2782763440583693 -45.337413534740 +5137 0.5137 46.2828088857347453 -45.313419992830 +5138 0.5138 46.2873390180922897 -45.289227158020 +5139 0.5139 46.2918667212238546 -45.264835473310 +5140 0.5140 46.2963919752665660 -45.240245380930 +5141 0.5141 46.3009147604017315 -45.215457322450 +5142 0.5142 46.3054350568547903 -45.190471738710 +5143 0.5143 46.3099528448952142 -45.165289069810 +5144 0.5144 46.3144681048364646 -45.139909755210 +5145 0.5145 46.3189808170359001 -45.114334233570 +5146 0.5146 46.3234909618947270 -45.088562942910 +5147 0.5147 46.3279985198578999 -45.062596320510 +5148 0.5148 46.3325034714140713 -45.036434802970 +5149 0.5149 46.3370057970955287 -45.010078826150 +5150 0.5150 46.3415054774780941 -44.983528825220 +5151 0.5151 46.3460024931810892 -44.956785234680 +5152 0.5152 46.3504968248672355 -44.929848488260 +5153 0.5153 46.3549884532426049 -44.902719019060 +5154 0.5154 46.3594773590565268 -44.875397259430 +5155 0.5155 46.3639635231015532 -44.847883641040 +5156 0.5156 46.3684469262133518 -44.820178594870 +5157 0.5157 46.3729275492706563 -44.792282551180 +5158 0.5158 46.3774053731951952 -44.764195939560 +5159 0.5159 46.3818803789516210 -44.735919188890 +5160 0.5160 46.3863525475474319 -44.707452727360 +5161 0.5161 46.3908218600329221 -44.678796982470 +5162 0.5162 46.3952882975010965 -44.649952381040 +5163 0.5163 46.3997518410876069 -44.620919349150 +5164 0.5164 46.4042124719706734 -44.591698312250 +5165 0.5165 46.4086701713710426 -44.562289695080 +5166 0.5166 46.4131249205518799 -44.532693921680 +5167 0.5167 46.4175767008187350 -44.502911415420 +5168 0.5168 46.4220254935194561 -44.472942598980 +5169 0.5169 46.4264712800441259 -44.442787894350 +5170 0.5170 46.4309140418249839 -44.412447722850 +5171 0.5171 46.4353537603363833 -44.381922505100 +5172 0.5172 46.4397904170946916 -44.351212661050 +5173 0.5173 46.4442239936582411 -44.320318609970 +5174 0.5174 46.4486544716272647 -44.289240770460 +5175 0.5175 46.4530818326438109 -44.257979560420 +5176 0.5176 46.4575060583916866 -44.226535397080 +5177 0.5177 46.4619271305963935 -44.194908697000 +5178 0.5178 46.4663450310250496 -44.163099876060 +5179 0.5179 46.4707597414863258 -44.131109349480 +5180 0.5180 46.4751712438303883 -44.098937531790 +5181 0.5181 46.4795795199488211 -44.066584836860 +5182 0.5182 46.4839845517745545 -44.034051677870 +5183 0.5183 46.4883863212818156 -44.001338467360 +5184 0.5184 46.4927848104860431 -43.968445617170 +5185 0.5185 46.4971800014438230 -43.935373538490 +5186 0.5186 46.5015718762528394 -43.902122641850 +5187 0.5187 46.5059604170517886 -43.868693337100 +5188 0.5188 46.5103456060203158 -43.835086033420 +5189 0.5189 46.5147274253789504 -43.801301139340 +5190 0.5190 46.5191058573890572 -43.767339062730 +5191 0.5191 46.5234808843527290 -43.733200210770 +5192 0.5192 46.5278524886127656 -43.698884990020 +5193 0.5193 46.5322206525525814 -43.664393806360 +5194 0.5194 46.5365853585961489 -43.629727064990 +5195 0.5195 46.5409465892079197 -43.594885170490 +5196 0.5196 46.5453043268927829 -43.559868526770 +5197 0.5197 46.5496585541959789 -43.524677537080 +5198 0.5198 46.5540092537030290 -43.489312603990 +5199 0.5199 46.5583564080396997 -43.453774129470 +5200 0.5200 46.5626999998719100 -43.418062514800 +5201 0.5201 46.5670400119056822 -43.382178160620 +5202 0.5202 46.5713764268870563 -43.346121466910 +5203 0.5203 46.5757092276020543 -43.309892833000 +5204 0.5204 46.5800383968765814 -43.273492657590 +5205 0.5205 46.5843639175763968 -43.236921338710 +5206 0.5206 46.5886857726070218 -43.200179273760 +5207 0.5207 46.5930039449136828 -43.163266859470 +5208 0.5208 46.5973184174812545 -43.126184491960 +5209 0.5209 46.6016291733341887 -43.088932566680 +5210 0.5210 46.6059361955364437 -43.051511478430 +5211 0.5211 46.6102394671914340 -43.013921621400 +5212 0.5212 46.6145389714419593 -42.976163389110 +5213 0.5213 46.6188346914701341 -42.938237174450 +5214 0.5214 46.6231266104973372 -42.900143369670 +5215 0.5215 46.6274147117841409 -42.861882366400 +5216 0.5216 46.6316989786302400 -42.823454555590 +5217 0.5217 46.6359793943744023 -42.784860327590 +5218 0.5218 46.6402559423943899 -42.746100072100 +5219 0.5219 46.6445286061069027 -42.707174178190 +5220 0.5220 46.6487973689675286 -42.668083034310 +5221 0.5221 46.6530622144706584 -42.628827028230 +5222 0.5222 46.6573231261494286 -42.589406547150 +5223 0.5223 46.6615800875756648 -42.549821977600 +5224 0.5224 46.6658330823598178 -42.510073705490 +5225 0.5225 46.6700820941508994 -42.470162116110 +5226 0.5226 46.6743271066364116 -42.430087594090 +5227 0.5227 46.6785681035422897 -42.389850523490 +5228 0.5228 46.6828050686328524 -42.349451287700 +5229 0.5229 46.6870379857107096 -42.308890269480 +5230 0.5230 46.6912668386167340 -42.268167851000 +5231 0.5231 46.6954916112299756 -42.227284413790 +5232 0.5232 46.6997122874676052 -42.186240338750 +5233 0.5233 46.7039288512848501 -42.145036006170 +5234 0.5234 46.7081412866749446 -42.103671795710 +5235 0.5235 46.7123495776690518 -42.062148086430 +5236 0.5236 46.7165537083362068 -42.020465256740 +5237 0.5237 46.7207536627832667 -41.978623684470 +5238 0.5238 46.7249494251548327 -41.936623746810 +5239 0.5239 46.7291409796331862 -41.894465820320 +5240 0.5240 46.7333283104382531 -41.852150280980 +5241 0.5241 46.7375114018275113 -41.809677504140 +5242 0.5242 46.7416902380959485 -41.767047864540 +5243 0.5243 46.7458648035759907 -41.724261736290 +5244 0.5244 46.7500350826374529 -41.681319492930 +5245 0.5245 46.7542010596874675 -41.638221507340 +5246 0.5246 46.7583627191704281 -41.594968151830 +5247 0.5247 46.7625200455679249 -41.551559798080 +5248 0.5248 46.7666730233986883 -41.507996817170 +5249 0.5249 46.7708216372185248 -41.464279579580 +5250 0.5250 46.7749658716202603 -41.420408455170 +5251 0.5251 46.7791057112336759 -41.376383813210 +5252 0.5252 46.7832411407254511 -41.332206022350 +5253 0.5253 46.7873721447991002 -41.287875450670 +5254 0.5254 46.7914987081949150 -41.243392465600 +5255 0.5255 46.7956208156898938 -41.198757434000 +5256 0.5256 46.7997384520976993 -41.153970722130 +5257 0.5257 46.8038516022685869 -41.109032695650 +5258 0.5258 46.8079602510893480 -41.063943719600 +5259 0.5259 46.8120643834832535 -41.018704158460 +5260 0.5260 46.8161639844099824 -40.973314376080 +5261 0.5261 46.8202590388655722 -40.927774735720 +5262 0.5262 46.8243495318823619 -40.882085600080 +5263 0.5263 46.8284354485289285 -40.836247331210 +5264 0.5264 46.8325167739100223 -40.790260290610 +5265 0.5265 46.8365934931665109 -40.744124839170 +5266 0.5266 46.8406655914753287 -40.697841337210 +5267 0.5267 46.8447330540494136 -40.651410144430 +5268 0.5268 46.8487958661376354 -40.604831619950 +5269 0.5269 46.8528540130247464 -40.558106122310 +5270 0.5270 46.8569074800313388 -40.511234009470 +5271 0.5271 46.8609562525137520 -40.464215638760 +5272 0.5272 46.8650003158640374 -40.417051366990 +5273 0.5273 46.8690396555099014 -40.369741550340 +5274 0.5274 46.8730742569146415 -40.322286544400 +5275 0.5275 46.8771041055770752 -40.274686704230 +5276 0.5276 46.8811291870314975 -40.226942384230 +5277 0.5277 46.8851494868476237 -40.179053938280 +5278 0.5278 46.8891649906305190 -40.131021719670 +5279 0.5279 46.8931756840205551 -40.082846081080 +5280 0.5280 46.8971815526933398 -40.034527374660 +5281 0.5281 46.9011825823596666 -39.986065951920 +5282 0.5282 46.9051787587654516 -39.937462163850 +5283 0.5283 46.9091700676916830 -39.888716360820 +5284 0.5284 46.9131564949543574 -39.839828892680 +5285 0.5285 46.9171380264044231 -39.790800108630 +5286 0.5286 46.9211146479277232 -39.741630357370 +5287 0.5287 46.9250863454449387 -39.692319986980 +5288 0.5288 46.9290531049115387 -39.642869344980 +5289 0.5289 46.9330149123177023 -39.593278778330 +5290 0.5290 46.9369717536882902 -39.543548633400 +5291 0.5291 46.9409236150827596 -39.493679256030 +5292 0.5292 46.9448704825951353 -39.443670991440 +5293 0.5293 46.9488123423539250 -39.393524184310 +5294 0.5294 46.9527491805220762 -39.343239178750 +5295 0.5295 46.9566809832969270 -39.292816318310 +5296 0.5296 46.9606077369101413 -39.242255945970 +5297 0.5297 46.9645294276276459 -39.191558404150 +5298 0.5298 46.9684460417495870 -39.140724034680 +5299 0.5299 46.9723575656102668 -39.089753178880 +5300 0.5300 46.9762639855780861 -39.038646177460 +5301 0.5301 46.9801652880554883 -38.987403370590 +5302 0.5302 46.9840614594789088 -38.936025097880 +5303 0.5303 46.9879524863187186 -38.884511698380 +5304 0.5304 46.9918383550791674 -38.832863510570 +5305 0.5305 46.9957190522983126 -38.781080872390 +5306 0.5306 46.9995945645479907 -38.729164121220 +5307 0.5307 47.0034648784337463 -38.677113593880 +5308 0.5308 47.0073299805947755 -38.624929626640 +5309 0.5309 47.0111898577038687 -38.572612555200 +5310 0.5310 47.0150444964673682 -38.520162714730 +5311 0.5311 47.0188938836250969 -38.467580439830 +5312 0.5312 47.0227380059503162 -38.414866064550 +5313 0.5313 47.0265768502496613 -38.362019922420 +5314 0.5314 47.0304104033630992 -38.309042346370 +5315 0.5315 47.0342386521638574 -38.255933668800 +5316 0.5316 47.0380615835583740 -38.202694221580 +5317 0.5317 47.0418791844862554 -38.149324336030 +5318 0.5318 47.0456914419201979 -38.095824342890 +5319 0.5319 47.0494983428659594 -38.042194572400 +5320 0.5320 47.0532998743622883 -37.988435354220 +5321 0.5321 47.0570960234808737 -37.934547017480 +5322 0.5322 47.0608867773262887 -37.880529890760 +5323 0.5323 47.0646721230359333 -37.826384302110 +5324 0.5324 47.0684520477799921 -37.772110579040 +5325 0.5325 47.0722265387613703 -37.717709048490 +5326 0.5326 47.0759955832156365 -37.663180036890 +5327 0.5327 47.0797591684109875 -37.608523870140 +5328 0.5328 47.0835172816481702 -37.553740873540 +5329 0.5329 47.0872699102604457 -37.498831371930 +5330 0.5330 47.0910170416135188 -37.443795689570 +5331 0.5331 47.0947586631055088 -37.388634150190 +5332 0.5332 47.0984947621668653 -37.333347076990 +5333 0.5333 47.1022253262603456 -37.277934792630 +5334 0.5334 47.1059503428809379 -37.222397619230 +5335 0.5335 47.1096697995558173 -37.166735878410 +5336 0.5336 47.1133836838442974 -37.110949891200 +5337 0.5337 47.1170919833377653 -37.055039978180 +5338 0.5338 47.1207946856596394 -36.999006459300 +5339 0.5339 47.1244917784653055 -36.942849654080 +5340 0.5340 47.1281832494420811 -36.886569881440 +5341 0.5341 47.1318690863091447 -36.830167459790 +5342 0.5342 47.1355492768174855 -36.773642707050 +5343 0.5343 47.1392238087498683 -36.716995940550 +5344 0.5344 47.1428926699207551 -36.660227477140 +5345 0.5345 47.1465558481762699 -36.603337633130 +5346 0.5346 47.1502133313941414 -36.546326724330 +5347 0.5347 47.1538651074836537 -36.489195065970 +5348 0.5348 47.1575111643855962 -36.431942972820 +5349 0.5349 47.1611514900721929 -36.374570759090 +5350 0.5350 47.1647860725470736 -36.317078738480 +5351 0.5351 47.1684148998452031 -36.259467224170 +5352 0.5352 47.1720379600328528 -36.201736528830 +5353 0.5353 47.1756552412075223 -36.143886964600 +5354 0.5354 47.1792667314979042 -36.085918843080 +5355 0.5355 47.1828724190638269 -36.027832475410 +5356 0.5356 47.1864722920962052 -35.969628172170 +5357 0.5357 47.1900663388169832 -35.911306243420 +5358 0.5358 47.1936545474790918 -35.852866998750 +5359 0.5359 47.1972369063663919 -35.794310747190 +5360 0.5360 47.2008134037936173 -35.735637797280 +5361 0.5361 47.2043840281063325 -35.676848457030 +5362 0.5362 47.2079487676808824 -35.617943033960 +5363 0.5363 47.2115076109243361 -35.558921835080 +5364 0.5364 47.2150605462744366 -35.499785166860 +5365 0.5365 47.2186075621995442 -35.440533335290 +5366 0.5366 47.2221486471986012 -35.381166645830 +5367 0.5367 47.2256837898010673 -35.321685403460 +5368 0.5368 47.2292129785668706 -35.262089912630 +5369 0.5369 47.2327362020863646 -35.202380477290 +5370 0.5370 47.2362534489802712 -35.142557400890 +5371 0.5371 47.2397647078996314 -35.082620986360 +5372 0.5372 47.2432699675257552 -35.022571536150 +5373 0.5373 47.2467692165701720 -34.962409352170 +5374 0.5374 47.2502624437745737 -34.902134735880 +5375 0.5375 47.2537496379107793 -34.841747988180 +5376 0.5376 47.2572307877806637 -34.781249409530 +5377 0.5377 47.2607058822161292 -34.720639299830 +5378 0.5378 47.2641749100790491 -34.659917958520 +5379 0.5379 47.2676378602612033 -34.599085684540 +5380 0.5380 47.2710947216842428 -34.538142776310 +5381 0.5381 47.2745454832996472 -34.477089531760 +5382 0.5382 47.2779901340886539 -34.415926248330 +5383 0.5383 47.2814286630622220 -34.354653222970 +5384 0.5384 47.2848610592609759 -34.293270752120 +5385 0.5385 47.2882873117551696 -34.231779131750 +5386 0.5386 47.2917074096446228 -34.170178657290 +5387 0.5387 47.2951213420586711 -34.108469623730 +5388 0.5388 47.2985290981561377 -34.046652325540 +5389 0.5389 47.3019306671252480 -33.984727056700 +5390 0.5390 47.3053260381836154 -33.922694110710 +5391 0.5391 47.3087152005781775 -33.860553780570 +5392 0.5392 47.3120981435851462 -33.798306358790 +5393 0.5393 47.3154748565099581 -33.735952137410 +5394 0.5394 47.3188453286872246 -33.673491407940 +5395 0.5395 47.3222095494806965 -33.610924461460 +5396 0.5396 47.3255675082831928 -33.548251588530 +5397 0.5397 47.3289191945165797 -33.485473079220 +5398 0.5398 47.3322645976316991 -33.422589223130 +5399 0.5399 47.3356037071083264 -33.359600309380 +5400 0.5400 47.3389365124551276 -33.296506626580 +5401 0.5401 47.3422630032096023 -33.233308462890 +5402 0.5402 47.3455831689380489 -33.170006105970 +5403 0.5403 47.3488969992354995 -33.106599843010 +5404 0.5404 47.3522044837256857 -33.043089960700 +5405 0.5405 47.3555056120609876 -32.979476745270 +5406 0.5406 47.3588003739223709 -32.915760482460 +5407 0.5407 47.3620887590193718 -32.851941457540 +5408 0.5408 47.3653707570900124 -32.788019955300 +5409 0.5409 47.3686463579007793 -32.723996260040 +5410 0.5410 47.3719155512465591 -32.659870655620 +5411 0.5411 47.3751783269506106 -32.595643425380 +5412 0.5412 47.3784346748644936 -32.531314852220 +5413 0.5413 47.3816845848680330 -32.466885218530 +5414 0.5414 47.3849280468692697 -32.402354806260 +5415 0.5415 47.3881650508044245 -32.337723896880 +5416 0.5416 47.3913955866378416 -32.272992771390 +5417 0.5417 47.3946196443619243 -32.208161710300 +5418 0.5418 47.3978372139971214 -32.143230993670 +5419 0.5419 47.4010482855918553 -32.078200901080 +5420 0.5420 47.4042528492224946 -32.013071711650 +5421 0.5421 47.4074508949932820 -31.947843704030 +5422 0.5422 47.4106424130362996 -31.882517156390 +5423 0.5423 47.4138273935114398 -31.817092346450 +5424 0.5424 47.4170058266063350 -31.751569551440 +5425 0.5425 47.4201777025363143 -31.685949048160 +5426 0.5426 47.4233430115443682 -31.620231112900 +5427 0.5427 47.4265017439010919 -31.554416021540 +5428 0.5428 47.4296538899046425 -31.488504049450 +5429 0.5429 47.4327994398806965 -31.422495471570 +5430 0.5430 47.4359383841823927 -31.356390562350 +5431 0.5431 47.4390707131902971 -31.290189595800 +5432 0.5432 47.4421964173123598 -31.223892845460 +5433 0.5433 47.4453154869838514 -31.157500584410 +5434 0.5434 47.4484279126673343 -31.091013085280 +5435 0.5435 47.4515336848526132 -31.024430620230 +5436 0.5436 47.4546327940566712 -30.957753460960 +5437 0.5437 47.4577252308236552 -30.890981878720 +5438 0.5438 47.4608109857248053 -30.824116144310 +5439 0.5439 47.4638900493584259 -30.757156528070 +5440 0.5440 47.4669624123498224 -30.690103299870 +5441 0.5441 47.4700280653512721 -30.622956729140 +5442 0.5442 47.4730869990419748 -30.555717084880 +5443 0.5443 47.4761392041279962 -30.488384635570 +5444 0.5444 47.4791846713422387 -30.420959649300 +5445 0.5445 47.4822233914443856 -30.353442393680 +5446 0.5446 47.4852553552208647 -30.285833135880 +5447 0.5447 47.4882805534847918 -30.218132142630 +5448 0.5448 47.4912989770759353 -30.150339680170 +5449 0.5449 47.4943106168606590 -30.082456014330 +5450 0.5450 47.4973154637319013 -30.014481410480 +5451 0.5451 47.5003135086091035 -29.946416133540 +5452 0.5452 47.5033047424381820 -29.878260447980 +5453 0.5453 47.5062891561914711 -29.810014617830 +5454 0.5454 47.5092667408676945 -29.741678906670 +5455 0.5455 47.5122374874919089 -29.673253577640 +5456 0.5456 47.5152013871154608 -29.604738893420 +5457 0.5457 47.5181584308159444 -29.536135116280 +5458 0.5458 47.5211086096971584 -29.467442508010 +5459 0.5459 47.5240519148890570 -29.398661329990 +5460 0.5460 47.5269883375477136 -29.329791843130 +5461 0.5461 47.5299178688552644 -29.260834307920 +5462 0.5462 47.5328405000198799 -29.191788984390 +5463 0.5463 47.5357562222757082 -29.122656132140 +5464 0.5464 47.5386650268828319 -29.053436010340 +5465 0.5465 47.5415669051272332 -28.984128877720 +5466 0.5466 47.5444618483207506 -28.914734992560 +5467 0.5467 47.5473498478010157 -28.845254612690 +5468 0.5468 47.5502308949314312 -28.775687995560 +5469 0.5469 47.5531049811011144 -28.706035398120 +5470 0.5470 47.5559720977248688 -28.636297076930 +5471 0.5471 47.5588322362431200 -28.566473288080 +5472 0.5472 47.5616853881218873 -28.496564287250 +5473 0.5473 47.5645315448527342 -28.426570329690 +5474 0.5474 47.5673706979527253 -28.356491670190 +5475 0.5475 47.5702028389643914 -28.286328563150 +5476 0.5476 47.5730279594556720 -28.216081262500 +5477 0.5477 47.5758460510198873 -28.145750021740 +5478 0.5478 47.5786571052756742 -28.075335093990 +5479 0.5479 47.5814611138669648 -28.004836731890 +5480 0.5480 47.5842580684629439 -27.934255187660 +5481 0.5481 47.5870479607579853 -27.863590713100 +5482 0.5482 47.5898307824716227 -27.792843559590 +5483 0.5483 47.5926065253485078 -27.722013978070 +5484 0.5484 47.5953751811583672 -27.651102219070 +5485 0.5485 47.5981367416959529 -27.580108532670 +5486 0.5486 47.6008911987810137 -27.509033168530 +5487 0.5487 47.6036385442582386 -27.437876375930 +5488 0.5488 47.6063787699972210 -27.366638403660 +5489 0.5489 47.6091118678924090 -27.295319500120 +5490 0.5490 47.6118378298630773 -27.223919913300 +5491 0.5491 47.6145566478532771 -27.152439890760 +5492 0.5492 47.6172683138317936 -27.080879679610 +5493 0.5493 47.6199728197921033 -27.009239526580 +5494 0.5494 47.6226701577523315 -26.937519677960 +5495 0.5495 47.6253603197552096 -26.865720379630 +5496 0.5496 47.6280432978680395 -26.793841877030 +5497 0.5497 47.6307190841826511 -26.721884415210 +5498 0.5498 47.6333876708153525 -26.649848238790 +5499 0.5499 47.6360490499068945 -26.577733591980 +5500 0.5500 47.6387032136224207 -26.505540718570 +5501 0.5501 47.6413501541514464 -26.433269861920 +5502 0.5502 47.6439898637077945 -26.360921264990 +5503 0.5503 47.6466223345295603 -26.288495170340 +5504 0.5504 47.6492475588790825 -26.215991820080 +5505 0.5505 47.6518655290428867 -26.143411455950 +5506 0.5506 47.6544762373316502 -26.070754319250 +5507 0.5507 47.6570796760801585 -25.998020650860 +5508 0.5508 47.6596758376472636 -25.925210691270 +5509 0.5509 47.6622647144158549 -25.852324680560 +5510 0.5510 47.6648462987928028 -25.779362858400 +5511 0.5511 47.6674205832089228 -25.706325464030 +5512 0.5512 47.6699875601189405 -25.633212736300 +5513 0.5513 47.6725472220014339 -25.560024913640 +5514 0.5514 47.6750995613588202 -25.486762234090 +5515 0.5515 47.6776445707172911 -25.413424935280 +5516 0.5516 47.6801822426267776 -25.340013254410 +5517 0.5517 47.6827125696609144 -25.266527428300 +5518 0.5518 47.6852355444169973 -25.192967693370 +5519 0.5519 47.6877511595159476 -25.119334285610 +5520 0.5520 47.6902594076022623 -25.045627440620 +5521 0.5521 47.6927602813439719 -24.971847393600 +5522 0.5522 47.6952537734326185 -24.897994379340 +5523 0.5523 47.6977398765831992 -24.824068632240 +5524 0.5524 47.7002185835341237 -24.750070386280 +5525 0.5525 47.7026898870471925 -24.675999875040 +5526 0.5526 47.7051537799075334 -24.601857331740 +5527 0.5527 47.7076102549235799 -24.527642989150 +5528 0.5528 47.7100593049270216 -24.453357079670 +5529 0.5529 47.7125009227727688 -24.378999835290 +5530 0.5530 47.7149351013389165 -24.304571487610 +5531 0.5531 47.7173618335266880 -24.230072267830 +5532 0.5532 47.7197811122604136 -24.155502406720 +5533 0.5533 47.7221929304874877 -24.080862134740 +5534 0.5534 47.7245972811783190 -24.006151681870 +5535 0.5535 47.7269941573262955 -23.931371277730 +5536 0.5536 47.7293835519477554 -23.856521151530 +5537 0.5537 47.7317654580819379 -23.781601532120 +5538 0.5538 47.7341398687909404 -23.706612647940 +5539 0.5539 47.7365067771596898 -23.631554727000 +5540 0.5540 47.7388661762958861 -23.556427996990 +5541 0.5541 47.7412180593299951 -23.481232685160 +5542 0.5542 47.7435624194151700 -23.405969018360 +5543 0.5543 47.7458992497272448 -23.330637223080 +5544 0.5544 47.7482285434646698 -23.255237525430 +5545 0.5545 47.7505502938484980 -23.179770151080 +5546 0.5546 47.7528644941223206 -23.104235325380 +5547 0.5547 47.7551711375522530 -23.028633273220 +5548 0.5548 47.7574702174268708 -22.952964219160 +5549 0.5549 47.7597617270571959 -22.877228387340 +5550 0.5550 47.7620456597766392 -22.801426001540 +5551 0.5551 47.7643220089409724 -22.725557285140 +5552 0.5552 47.7665907679282853 -22.649622461120 +5553 0.5553 47.7688519301389434 -22.573621752100 +5554 0.5554 47.7711054889955662 -22.497555380320 +5555 0.5555 47.7733514379429636 -22.421423567610 +5556 0.5556 47.7755897704481143 -22.345226535440 +5557 0.5557 47.7778204800001305 -22.268964504890 +5558 0.5558 47.7800435601102080 -22.192637696670 +5559 0.5559 47.7822590043115980 -22.116246331080 +5560 0.5560 47.7844668061595570 -22.039790628060 +5561 0.5561 47.7866669592313187 -21.963270807180 +5562 0.5562 47.7888594571260583 -21.886687087630 +5563 0.5563 47.7910442934648501 -21.810039688180 +5564 0.5564 47.7932214618906244 -21.733328827280 +5565 0.5565 47.7953909560681396 -21.656554722970 +5566 0.5566 47.7975527696839322 -21.579717592910 +5567 0.5567 47.7997068964462954 -21.502817654410 +5568 0.5568 47.8018533300852368 -21.425855124370 +5569 0.5569 47.8039920643524212 -21.348830219340 +5570 0.5570 47.8061230930211636 -21.271743155500 +5571 0.5571 47.8082464098863724 -21.194594148620 +5572 0.5572 47.8103620087645069 -21.117383414140 +5573 0.5573 47.8124698834935700 -21.040111167100 +5574 0.5574 47.8145700279330370 -20.962777622180 +5575 0.5575 47.8166624359638277 -20.885382993670 +5576 0.5576 47.8187471014882846 -20.807927495510 +5577 0.5577 47.8208240184301232 -20.730411341280 +5578 0.5578 47.8228931807343969 -20.652834744140 +5579 0.5579 47.8249545823674538 -20.575197916950 +5580 0.5580 47.8270082173169087 -20.497501072120 +5581 0.5581 47.8290540795916002 -20.419744421760 +5582 0.5582 47.8310921632215695 -20.341928177580 +5583 0.5583 47.8331224622579967 -20.264052550940 +5584 0.5584 47.8351449707731859 -20.186117752810 +5585 0.5585 47.8371596828605163 -20.108123993810 +5586 0.5586 47.8391665926344203 -20.030071484200 +5587 0.5587 47.8411656942303267 -19.951960433860 +5588 0.5588 47.8431569818046327 -19.873791052310 +5589 0.5589 47.8451404495346821 -19.795563548710 +5590 0.5590 47.8471160916187088 -19.717278131840 +5591 0.5591 47.8490839022758081 -19.638935010140 +5592 0.5592 47.8510438757459013 -19.560534391690 +5593 0.5593 47.8529960062896933 -19.482076484190 +5594 0.5594 47.8549402881886508 -19.403561494970 +5595 0.5595 47.8568767157449528 -19.324989631030 +5596 0.5596 47.8588052832814554 -19.246361099000 +5597 0.5597 47.8607259851416629 -19.167676105130 +5598 0.5598 47.8626388156896851 -19.088934855320 +5599 0.5599 47.8645437693102096 -19.010137555150 +5600 0.5600 47.8664408404084583 -18.931284409770 +5601 0.5601 47.8683300234101452 -18.852375624030 +5602 0.5602 47.8702113127614695 -18.773411402400 +5603 0.5603 47.8720847029290368 -18.694391949000 +5604 0.5604 47.8739501883998670 -18.615317467590 +5605 0.5605 47.8758077636813226 -18.536188161570 +5606 0.5606 47.8776574233011019 -18.457004234010 +5607 0.5607 47.8794991618071819 -18.377765887590 +5608 0.5608 47.8813329737677975 -18.298473324660 +5609 0.5609 47.8831588537713913 -18.219126747200 +5610 0.5610 47.8849767964265922 -18.139726356860 +5611 0.5611 47.8867867963621805 -18.060272354930 +5612 0.5612 47.8885888482270445 -17.980764942320 +5613 0.5613 47.8903829466901385 -17.901204319630 +5614 0.5614 47.8921690864404752 -17.821590687080 +5615 0.5615 47.8939472621870550 -17.741924244570 +5616 0.5616 47.8957174686588658 -17.662205191620 +5617 0.5617 47.8974797006048192 -17.582433727400 +5618 0.5618 47.8992339527937290 -17.502610050760 +5619 0.5619 47.9009802200142758 -17.422734360190 +5620 0.5620 47.9027184970749786 -17.342806853820 +5621 0.5621 47.9044487788041380 -17.262827729420 +5622 0.5622 47.9061710600498358 -17.182797184480 +5623 0.5623 47.9078853356798646 -17.102715416070 +5624 0.5624 47.9095916005817131 -17.022582620950 +5625 0.5625 47.9112898496625377 -16.942398995530 +5626 0.5626 47.9129800778491060 -16.862164735860 +5627 0.5627 47.9146622800877822 -16.781880037690 +5628 0.5628 47.9163364513444847 -16.701545096360 +5629 0.5629 47.9180025866046506 -16.621160106940 +5630 0.5630 47.9196606808732000 -16.540725264100 +5631 0.5631 47.9213107291745146 -16.460240762190 +5632 0.5632 47.9229527265523885 -16.379706795230 +5633 0.5633 47.9245866680699919 -16.299123556870 +5634 0.5634 47.9262125488098576 -16.218491240460 +5635 0.5635 47.9278303638738308 -16.137810038970 +5636 0.5636 47.9294401083830337 -16.057080145060 +5637 0.5637 47.9310417774778372 -15.976301751030 +5638 0.5638 47.9326353663178324 -15.895475048860 +5639 0.5639 47.9342208700817878 -15.814600230180 +5640 0.5640 47.9357982839676069 -15.733677486270 +5641 0.5641 47.9373676031923281 -15.652707008120 +5642 0.5642 47.9389288229920538 -15.571688986330 +5643 0.5643 47.9404819386219287 -15.490623611190 +5644 0.5644 47.9420269453561190 -15.409511072680 +5645 0.5645 47.9435638384877691 -15.328351560370 +5646 0.5646 47.9450926133289670 -15.247145263590 +5647 0.5647 47.9466132652107078 -15.165892371250 +5648 0.5648 47.9481257894828659 -15.084593071980 +5649 0.5649 47.9496301815141663 -15.003247554080 +5650 0.5650 47.9511264366921424 -14.921856005480 +5651 0.5651 47.9526145504231067 -14.840418613820 +5652 0.5652 47.9540945181321163 -14.758935566370 +5653 0.5653 47.9555663352629367 -14.677407050090 +5654 0.5654 47.9570299972780205 -14.595833251620 +5655 0.5655 47.9584854996584653 -14.514214357240 +5656 0.5656 47.9599328379039775 -14.432550552940 +5657 0.5657 47.9613720075328445 -14.350842024330 +5658 0.5658 47.9628030040818985 -14.269088956740 +5659 0.5659 47.9642258231064957 -14.187291535150 +5660 0.5660 47.9656404601804667 -14.105449944220 +5661 0.5661 47.9670469108960944 -14.023564368280 +5662 0.5662 47.9684451708640722 -13.941634991310 +5663 0.5663 47.9698352357134894 -13.859661997020 +5664 0.5664 47.9712171010917743 -13.777645568740 +5665 0.5665 47.9725907626646872 -13.695585889510 +5666 0.5666 47.9739562161162638 -13.613483142030 +5667 0.5667 47.9753134571488005 -13.531337508670 +5668 0.5668 47.9766624814828049 -13.449149171480 +5669 0.5669 47.9780032848569888 -13.366918312210 +5670 0.5670 47.9793358630282114 -13.284645112260 +5671 0.5671 47.9806602117714576 -13.202329752720 +5672 0.5672 47.9819763268798098 -13.119972414360 +5673 0.5673 47.9832842041644057 -13.037573277610 +5674 0.5674 47.9845838394544160 -12.955132522610 +5675 0.5675 47.9858752285970027 -12.872650329160 +5676 0.5676 47.9871583674572975 -12.790126876740 +5677 0.5677 47.9884332519183587 -12.707562344520 +5678 0.5678 47.9896998778811508 -12.624956911360 +5679 0.5679 47.9909582412645079 -12.542310755780 +5680 0.5680 47.9922083380050992 -12.459624055980 +5681 0.5681 47.9934501640573927 -12.376896989870 +5682 0.5682 47.9946837153936343 -12.294129735020 +5683 0.5683 47.9959089880038192 -12.211322468690 +5684 0.5684 47.9971259778956423 -12.128475367840 +5685 0.5685 47.9983346810944909 -12.045588609090 +5686 0.5686 47.9995350936433809 -11.962662368740 +5687 0.5687 48.0007272116029569 -11.879696822820 +5688 0.5688 48.0019110310514492 -11.796692147010 +5689 0.5689 48.0030865480846316 -11.713648516670 +5690 0.5690 48.0042537588158069 -11.630566106860 +5691 0.5691 48.0054126593757644 -11.547445092360 +5692 0.5692 48.0065632459127585 -11.464285647580 +5693 0.5693 48.0077055145924660 -11.381087946640 +5694 0.5694 48.0088394615979652 -11.297852163370 +5695 0.5695 48.0099650831296998 -11.214578471280 +5696 0.5696 48.0110823754054437 -11.131267043550 +5697 0.5697 48.0121913346602724 -11.047918053060 +5698 0.5698 48.0132919571465422 -10.964531672400 +5699 0.5699 48.0143842391338538 -10.881108073820 +5700 0.5700 48.0154681769090104 -10.797647429280 +5701 0.5701 48.0165437667759960 -10.714149910450 +5702 0.5702 48.0176110050559544 -10.630615688650 +5703 0.5703 48.0186698880871319 -10.547044934910 +5704 0.5704 48.0197204122248777 -10.463437819990 +5705 0.5705 48.0207625738415942 -10.379794514290 +5706 0.5706 48.0217963693267080 -10.296115187930 +5707 0.5707 48.0228217950866423 -10.212400010730 +5708 0.5708 48.0238388475447877 -10.128649152200 +5709 0.5709 48.0248475231414744 -10.044862781540 +5710 0.5710 48.0258478183339363 -9.961041067630 +5711 0.5711 48.0268397295962757 -9.877184179100 +5712 0.5712 48.0278232534194416 -9.793292284230 +5713 0.5713 48.0287983863112018 -9.709365551000 +5714 0.5714 48.0297651247961070 -9.625404147120 +5715 0.5715 48.0307234654154627 -9.541408239970 +5716 0.5716 48.0316734047272931 -9.457377996640 +5717 0.5717 48.0326149393063204 -9.373313583910 +5718 0.5718 48.0335480657439291 -9.289215168270 +5719 0.5719 48.0344727806481373 -9.205082915910 +5720 0.5720 48.0353890806435686 -9.120916992730 +5721 0.5721 48.0362969623714235 -9.036717564300 +5722 0.5722 48.0371964224894370 -8.952484795910 +5723 0.5723 48.0380874576718639 -8.868218852580 +5724 0.5724 48.0389700646094440 -8.783919898980 +5725 0.5725 48.0398442400093657 -8.699588099510 +5726 0.5726 48.0407099805952527 -8.615223618290 +5727 0.5727 48.0415672831071205 -8.530826619120 +5728 0.5728 48.0424161443013489 -8.446397265500 +5729 0.5729 48.0432565609506597 -8.361935720670 +5730 0.5730 48.0440885298440676 -8.277442147520 +5731 0.5731 48.0449120477868803 -8.192916708700 +5732 0.5732 48.0457271116006410 -8.108359566530 +5733 0.5733 48.0465337181231220 -8.023770883050 +5734 0.5734 48.0473318642082745 -7.939150820020 +5735 0.5735 48.0481215467262217 -7.854499538890 +5736 0.5736 48.0489027625632090 -7.769817200820 +5737 0.5737 48.0496755086215828 -7.685103966670 +5738 0.5738 48.0504397818197688 -7.600359997040 +5739 0.5739 48.0511955790922300 -7.515585452190 +5740 0.5740 48.0519428973894449 -7.430780492140 +5741 0.5741 48.0526817336778791 -7.345945276610 +5742 0.5742 48.0534120849399571 -7.261079964990 +5743 0.5743 48.0541339481740266 -7.176184716420 +5744 0.5744 48.0548473203943374 -7.091259689750 +5745 0.5745 48.0555521986309984 -7.006305043520 +5746 0.5746 48.0562485799299779 -6.921320936020 +5747 0.5747 48.0569364613530396 -6.836307525190 +5748 0.5748 48.0576158399777356 -6.751264968750 +5749 0.5749 48.0582867128973774 -6.666193424090 +5750 0.5750 48.0589490772210013 -6.581093048340 +5751 0.5751 48.0596029300733321 -6.495963998340 +5752 0.5752 48.0602482685947763 -6.410806430610 +5753 0.5753 48.0608850899413795 -6.325620501440 +5754 0.5754 48.0615133912847909 -6.240406366790 +5755 0.5755 48.0621331698122489 -6.155164182370 +5756 0.5756 48.0627444227265457 -6.069894103590 +5757 0.5757 48.0633471472460059 -5.984596285560 +5758 0.5758 48.0639413406044440 -5.899270883160 +5759 0.5759 48.0645270000511502 -5.813918050920 +5760 0.5760 48.0651041228508547 -5.728537943150 +5761 0.5761 48.0656727062837064 -5.643130713830 +5762 0.5762 48.0662327476452305 -5.557696516680 +5763 0.5763 48.0667842442463211 -5.472235505160 +5764 0.5764 48.0673271934131989 -5.386747832410 +5765 0.5765 48.0678615924873824 -5.301233651320 +5766 0.5766 48.0683874388256740 -5.215693114480 +5767 0.5767 48.0689047298001100 -5.130126374230 +5768 0.5768 48.0694134627979537 -5.044533582600 +5769 0.5769 48.0699136352216527 -4.958914891350 +5770 0.5770 48.0704052444888177 -4.873270451980 +5771 0.5771 48.0708882880322008 -4.787600415700 +5772 0.5772 48.0713627632996605 -4.701904933440 +5773 0.5773 48.0718286677541258 -4.616184155850 +5774 0.5774 48.0722859988735820 -4.530438233320 +5775 0.5775 48.0727347541510426 -4.444667315960 +5776 0.5776 48.0731749310945204 -4.358871553600 +5777 0.5777 48.0736065272269926 -4.273051095800 +5778 0.5778 48.0740295400863715 -4.187206091830 +5779 0.5779 48.0744439672254984 -4.101336690700 +5780 0.5780 48.0748498062120930 -4.015443041160 +5781 0.5781 48.0752470546287327 -3.929525291650 +5782 0.5782 48.0756357100728309 -3.843583590370 +5783 0.5783 48.0760157701566158 -3.757618085260 +5784 0.5784 48.0763872325070736 -3.671628923920 +5785 0.5785 48.0767500947659556 -3.585616253770 +5786 0.5786 48.0771043545897356 -3.499580221880 +5787 0.5787 48.0774500096495814 -3.413520975090 +5788 0.5788 48.0777870576313333 -3.327438659980 +5789 0.5789 48.0781154962354762 -3.241333422830 +5790 0.5790 48.0784353231771036 -3.155205409650 +5791 0.5791 48.0787465361858963 -3.069054766220 +5792 0.5792 48.0790491330061087 -2.982881638000 +5793 0.5793 48.0793431113965184 -2.896686170230 +5794 0.5794 48.0796284691304194 -2.810468507850 +5795 0.5795 48.0799052039955868 -2.724228795550 +5796 0.5796 48.0801733137942477 -2.637967177740 +5797 0.5797 48.0804327963430609 -2.551683798560 +5798 0.5798 48.0806836494730874 -2.465378801910 +5799 0.5799 48.0809258710297556 -2.379052331390 +5800 0.5800 48.0811594588728468 -2.292704530370 +5801 0.5801 48.0813844108764599 -2.206335541930 +5802 0.5802 48.0816007249290038 -2.119945508880 +5803 0.5803 48.0818083989331413 -2.033534573810 +5804 0.5804 48.0820074308057812 -1.947102878980 +5805 0.5805 48.0821978184780505 -1.860650566440 +5806 0.5806 48.0823795598952728 -1.774177777960 +5807 0.5807 48.0825526530169256 -1.687684655040 +5808 0.5808 48.0827170958166263 -1.601171338910 +5809 0.5809 48.0828728862821038 -1.514637970580 +5810 0.5810 48.0830200224151696 -1.428084690750 +5811 0.5811 48.0831585022317043 -1.341511639890 +5812 0.5812 48.0832883237616073 -1.254918958190 +5813 0.5813 48.0834094850487972 -1.168306785600 +5814 0.5814 48.0835219841511687 -1.081675261780 +5815 0.5815 48.0836258191405648 -0.995024526180 +5816 0.5816 48.0837209881027690 -0.908354717930 +5817 0.5817 48.0838074891374632 -0.821665975960 +5818 0.5818 48.0838853203582062 -0.734958438890 +5819 0.5819 48.0839544798924052 -0.648232245110 +5820 0.5820 48.0840149658812948 -0.561487532750 +5821 0.5821 48.0840667764799150 -0.474724439700 +5822 0.5822 48.0841099098570766 -0.387943103550 +5823 0.5823 48.0841443641953390 -0.301143661660 +5824 0.5824 48.0841701376909825 -0.214326251140 +5825 0.5825 48.0841872285539793 -0.127491008840 +5826 0.5826 48.0841956350079869 -0.040638071350 +5827 0.5827 48.0841953552903050 0.046232425000 +5828 0.5828 48.0841863876518474 0.133120344140 +5829 0.5829 48.0841687303571277 0.220025550210 +5830 0.5830 48.0841423816842379 0.306947907650 +5831 0.5831 48.0841073399247989 0.393887281140 +5832 0.5832 48.0840636033839601 0.480843535610 +5833 0.5833 48.0840111703803643 0.567816536260 +5834 0.5834 48.0839500392461261 0.654806148500 +5835 0.5835 48.0838802083268035 0.741812238020 +5836 0.5836 48.0838016759813627 0.828834670790 +5837 0.5837 48.0837144405821775 0.915873312960 +5838 0.5838 48.0836185005149801 1.002928031000 +5839 0.5839 48.0835138541788538 1.089998691590 +5840 0.5840 48.0834004999861904 1.177085161670 +5841 0.5841 48.0832784363626828 1.264187308440 +5842 0.5842 48.0831476617472973 1.351304999320 +5843 0.5843 48.0830081745922300 1.438438102010 +5844 0.5844 48.0828599733629076 1.525586484450 +5845 0.5845 48.0827030565379445 1.612750014820 +5846 0.5846 48.0825374226091284 1.699928561560 +5847 0.5847 48.0823630700813851 1.787121993330 +5848 0.5848 48.0821799974727639 1.874330179070 +5849 0.5849 48.0819882033144097 1.961552987960 +5850 0.5850 48.0817876861505411 2.048790289400 +5851 0.5851 48.0815784445384153 2.136041953080 +5852 0.5852 48.0813604770483138 2.223307848880 +5853 0.5853 48.0811337822635210 2.310587846970 +5854 0.5854 48.0808983587802814 2.397881817760 +5855 0.5855 48.0806542052078001 2.485189631870 +5856 0.5856 48.0804013201681926 2.572511160220 +5857 0.5857 48.0801397022964849 2.659846273920 +5858 0.5858 48.0798693502405712 2.747194844330 +5859 0.5859 48.0795902626611991 2.834556743100 +5860 0.5860 48.0793024382319416 2.921931842070 +5861 0.5861 48.0790058756391687 3.009320013350 +5862 0.5862 48.0787005735820401 3.096721129280 +5863 0.5863 48.0783865307724554 3.184135062440 +5864 0.5864 48.0780637459350473 3.271561685670 +5865 0.5865 48.0777322178071600 3.359000872020 +5866 0.5866 48.0773919451388210 3.446452494810 +5867 0.5867 48.0770429266926982 3.533916427590 +5868 0.5868 48.0766851612441144 3.621392544140 +5869 0.5869 48.0763186475809832 3.708880718480 +5870 0.5870 48.0759433845038160 3.796380824880 +5871 0.5871 48.0755593708256797 3.883892737830 +5872 0.5872 48.0751666053721820 3.971416332100 +5873 0.5873 48.0747650869814436 4.058951482650 +5874 0.5874 48.0743548145040762 4.146498064700 +5875 0.5875 48.0739357868031547 4.234055953690 +5876 0.5876 48.0735080027542026 4.321625025330 +5877 0.5877 48.0730714612451564 4.409205155530 +5878 0.5878 48.0726261611763590 4.496796220470 +5879 0.5879 48.0721721014605095 4.584398096540 +5880 0.5880 48.0717092810226632 4.672010660380 +5881 0.5881 48.0712376988002035 4.759633788830 +5882 0.5882 48.0707573537428132 4.847267359020 +5883 0.5883 48.0702682448124463 4.934911248280 +5884 0.5884 48.0697703709833206 5.022565334180 +5885 0.5885 48.0692637312418896 5.110229494510 +5886 0.5886 48.0687483245867995 5.197903607350 +5887 0.5887 48.0682241500288825 5.285587550920 +5888 0.5888 48.0676912065911495 5.373281203750 +5889 0.5889 48.0671494933087331 5.460984444560 +5890 0.5890 48.0665990092288880 5.548697152340 +5891 0.5891 48.0660397534109549 5.636419206260 +5892 0.5892 48.0654717249263541 5.724150485780 +5893 0.5893 48.0648949228585352 5.811890870530 +5894 0.5894 48.0643093463029913 5.899640240400 +5895 0.5895 48.0637149943671957 5.987398475540 +5896 0.5896 48.0631118661706083 6.075165456270 +5897 0.5897 48.0624999608446331 6.162941063190 +5898 0.5898 48.0618792775326185 6.250725177090 +5899 0.5899 48.0612498153898144 6.338517679020 +5900 0.5900 48.0606115735833512 6.426318450240 +5901 0.5901 48.0599645512922251 6.514127372240 +5902 0.5902 48.0593087477072771 6.601944326740 +5903 0.5903 48.0586441620311575 6.689769195700 +5904 0.5904 48.0579707934783116 6.777601861270 +5905 0.5905 48.0572886412749511 6.865442205870 +5906 0.5906 48.0565977046590547 6.953290112130 +5907 0.5907 48.0558979828803032 7.041145462890 +5908 0.5908 48.0551894752000948 7.129008141240 +5909 0.5909 48.0544721808915085 7.216878030490 +5910 0.5910 48.0537460992392766 7.304755014150 +5911 0.5911 48.0530112295397700 7.392638975970 +5912 0.5912 48.0522675711009768 7.480529799950 +5913 0.5913 48.0515151232424671 7.568427370290 +5914 0.5914 48.0507538852953857 7.656331571390 +5915 0.5915 48.0499838566024167 7.744242287930 +5916 0.5916 48.0492050365177832 7.832159404750 +5917 0.5917 48.0484174244071980 7.920082806960 +5918 0.5918 48.0476210196478561 8.008012379890 +5919 0.5919 48.0468158216284067 8.095948009050 +5920 0.5920 48.0460018297489455 8.183889580210 +5921 0.5921 48.0451790434209656 8.271836979360 +5922 0.5922 48.0443474620673641 8.359790092690 +5923 0.5923 48.0435070851223998 8.447748806620 +5924 0.5924 48.0426579120316788 8.535713007800 +5925 0.5925 48.0417999422521333 8.623682583080 +5926 0.5926 48.0409331752520004 8.711657419560 +5927 0.5927 48.0400576105107930 8.799637404520 +5928 0.5928 48.0391732475192939 8.887622425500 +5929 0.5929 48.0382800857795047 8.975612370220 +5930 0.5930 48.0373781248046612 9.063607126630 +5931 0.5931 48.0364673641191828 9.151606582920 +5932 0.5932 48.0355478032586589 9.239610627490 +5933 0.5933 48.0346194417698413 9.327619148930 +5934 0.5934 48.0336822792105949 9.415632036070 +5935 0.5935 48.0327363151498972 9.503649177950 +5936 0.5936 48.0317815491678104 9.591670463830 +5937 0.5937 48.0308179808554598 9.679695783200 +5938 0.5938 48.0298456098150126 9.767725025720 +5939 0.5939 48.0288644356596635 9.855758081310 +5940 0.5940 48.0278744580135921 9.943794840100 +5941 0.5941 48.0268756765119704 10.031835192400 +5942 0.5942 48.0258680908009126 10.119879028780 +5943 0.5943 48.0248517005374751 10.207926239990 +5944 0.5944 48.0238265053896214 10.295976717020 +5945 0.5945 48.0227925050362145 10.384030351050 +5946 0.5946 48.0217496991669890 10.472087033480 +5947 0.5947 48.0206980874825220 10.560146655920 +5948 0.5948 48.0196376696942124 10.648209110230 +5949 0.5949 48.0185684455242807 10.736274288400 +5950 0.5950 48.0174904147057262 10.824342082730 +5951 0.5951 48.0164035769823059 10.912412385650 +5952 0.5952 48.0153079321085343 11.000485089840 +5953 0.5953 48.0142034798496340 11.088560088190 +5954 0.5954 48.0130902199815353 11.176637273800 +5955 0.5955 48.0119681522908479 11.264716539970 +5956 0.5956 48.0108372765748399 11.352797780210 +5957 0.5957 48.0096975926414160 11.440880888240 +5958 0.5958 48.0085491003091036 11.528965758020 +5959 0.5959 48.0073917994070172 11.617052283660 +5960 0.5960 48.0062256897748583 11.705140359530 +5961 0.5961 48.0050507712628729 11.793229880190 +5962 0.5962 48.0038670437318444 11.881320740390 +5963 0.5963 48.0026745070530723 11.969412835120 +5964 0.5964 48.0014731611083363 12.057506059560 +5965 0.5965 48.0002630057899040 12.145600309100 +5966 0.5966 47.9990440410004808 12.233695479320 +5967 0.5967 47.9978162666532100 12.321791466050 +5968 0.5968 47.9965796826716442 12.409888165280 +5969 0.5969 47.9953342889897172 12.497985473210 +5970 0.5970 47.9940800855517438 12.586083286290 +5971 0.5971 47.9928170723123699 12.674181501120 +5972 0.5972 47.9915452492365873 12.762280014540 +5973 0.5973 47.9902646162996831 12.850378723580 +5974 0.5974 47.9889751734872263 12.938477525490 +5975 0.5975 47.9876769207950673 13.026576317680 +5976 0.5976 47.9863698582292884 13.114674997830 +5977 0.5977 47.9850539858062106 13.202773463770 +5978 0.5978 47.9837293035523444 13.290871613570 +5979 0.5979 47.9823958115043965 13.378969345450 +5980 0.5980 47.9810535097092270 13.467066557890 +5981 0.5981 47.9797023982238571 13.555163149550 +5982 0.5982 47.9783424771154188 13.643259019270 +5983 0.5983 47.9769737464611481 13.731354066120 +5984 0.5984 47.9755962063483707 13.819448189380 +5985 0.5985 47.9742098568744737 13.907541288500 +5986 0.5986 47.9728146981468910 13.995633263150 +5987 0.5987 47.9714107302830755 14.083724013170 +5988 0.5988 47.9699979534104841 14.171813438650 +5989 0.5989 47.9685763676665573 14.259901439850 +5990 0.5990 47.9671459731987042 14.347987917220 +5991 0.5991 47.9657067701642745 14.436072771430 +5992 0.5992 47.9642587587305371 14.524155903340 +5993 0.5993 47.9628019390746658 14.612237214020 +5994 0.5994 47.9613363113837323 14.700316604690 +5995 0.5995 47.9598618758546564 14.788393976850 +5996 0.5996 47.9583786326942061 14.876469232120 +5997 0.5997 47.9568865821189831 14.964542272370 +5998 0.5998 47.9553857243553807 15.052612999630 +5999 0.5999 47.9538760596395903 15.140681316160 +6000 0.6000 47.9523575882175663 15.228747124390 +6001 0.6001 47.9508303103449975 15.316810326950 +6002 0.6002 47.9492942262873143 15.404870826670 +6003 0.6003 47.9477493363196530 15.492928526600 +6004 0.6004 47.9461956407268275 15.580983329930 +6005 0.6005 47.9446331398033294 15.669035140080 +6006 0.6006 47.9430618338532923 15.757083860680 +6007 0.6007 47.9414817231904848 15.845129395530 +6008 0.6008 47.9398928081382749 15.933171648610 +6009 0.6009 47.9382950890296371 16.021210524140 +6010 0.6010 47.9366885662071027 16.109245926490 +6011 0.6011 47.9350732400227670 16.197277760230 +6012 0.6012 47.9334491108382466 16.285305930160 +6013 0.6013 47.9318161790246791 16.373330341210 +6014 0.6014 47.9301744449626881 16.461350898560 +6015 0.6015 47.9285239090423829 16.549367507560 +6016 0.6016 47.9268645716633159 16.637380073730 +6017 0.6017 47.9251964332344897 16.725388502820 +6018 0.6018 47.9235194941743146 16.813392700750 +6019 0.6019 47.9218337549105939 16.901392573610 +6020 0.6020 47.9201392158805248 16.989388027730 +6021 0.6021 47.9184358775306549 17.077378969600 +6022 0.6022 47.9167237403168826 17.165365305900 +6023 0.6023 47.9150028047044145 17.253346943490 +6024 0.6024 47.9132730711677652 17.341323789440 +6025 0.6025 47.9115345401907433 17.429295751010 +6026 0.6026 47.9097872122664086 17.517262735640 +6027 0.6027 47.9080310878970792 17.605224650950 +6028 0.6028 47.9062661675942962 17.693181404750 +6029 0.6029 47.9044924518788022 17.781132905060 +6030 0.6030 47.9027099412805484 17.869079060080 +6031 0.6031 47.9009186363386377 17.957019778160 +6032 0.6032 47.8991185376013320 18.044954967890 +6033 0.6033 47.8973096456260379 18.132884538010 +6034 0.6034 47.8954919609792640 18.220808397460 +6035 0.6035 47.8936654842366210 18.308726455370 +6036 0.6036 47.8918302159828002 18.396638621060 +6037 0.6037 47.8899861568115455 18.484544804020 +6038 0.6038 47.8881333073256457 18.572444913920 +6039 0.6039 47.8862716681369207 18.660338860640 +6040 0.6040 47.8844012398661789 18.748226554240 +6041 0.6041 47.8825220231432169 18.836107904940 +6042 0.6042 47.8806340186068127 18.923982823170 +6043 0.6043 47.8787372269046756 19.011851219520 +6044 0.6044 47.8768316486934609 19.099713004810 +6045 0.6045 47.8749172846387197 19.187568089990 +6046 0.6046 47.8729941354149062 19.275416386220 +6047 0.6047 47.8710622017053566 19.363257804830 +6048 0.6048 47.8691214842022461 19.451092257350 +6049 0.6049 47.8671719836066032 19.538919655480 +6050 0.6050 47.8652137006282743 19.626739911100 +6051 0.6051 47.8632466359859023 19.714552936290 +6052 0.6052 47.8612707904069268 19.802358643280 +6053 0.6053 47.8592861646275338 19.890156944510 +6054 0.6054 47.8572927593926778 19.977947752590 +6055 0.6055 47.8552905754560314 20.065730980300 +6056 0.6056 47.8532796135799856 20.153506540620 +6057 0.6057 47.8512598745356215 20.241274346690 +6058 0.6058 47.8492313591026956 20.329034311850 +6059 0.6059 47.8471940680696193 20.416786349610 +6060 0.6060 47.8451480022334579 20.504530373670 +6061 0.6061 47.8430931623998816 20.592266297870 +6062 0.6062 47.8410295493831725 20.679994036280 +6063 0.6063 47.8389571640062030 20.767713503120 +6064 0.6064 47.8368760071004075 20.855424612780 +6065 0.6065 47.8347860795057755 20.943127279860 +6066 0.6066 47.8326873820708300 21.030821419100 +6067 0.6067 47.8305799156525993 21.118506945470 +6068 0.6068 47.8284636811166237 21.206183774040 +6069 0.6069 47.8263386793369136 21.293851820130 +6070 0.6070 47.8242049111959489 21.381510999200 +6071 0.6071 47.8220623775846434 21.469161226890 +6072 0.6072 47.8199110794023454 21.556802419010 +6073 0.6073 47.8177510175568159 21.644434491580 +6074 0.6074 47.8155821929642002 21.732057360740 +6075 0.6075 47.8134046065490210 21.819670942860 +6076 0.6076 47.8112182592441570 21.907275154440 +6077 0.6077 47.8090231519908286 21.994869912190 +6078 0.6078 47.8068192857385696 22.082455132980 +6079 0.6079 47.8046066614452272 22.170030733830 +6080 0.6080 47.8023852800769333 22.257596631990 +6081 0.6081 47.8001551426080908 22.345152744830 +6082 0.6082 47.7979162500213519 22.432698989920 +6083 0.6083 47.7956686033076039 22.520235285000 +6084 0.6084 47.7934122034659552 22.607761547980 +6085 0.6085 47.7911470515037067 22.695277696930 +6086 0.6086 47.7888731484363518 22.782783650140 +6087 0.6087 47.7865904952875482 22.870279325980 +6088 0.6088 47.7842990930890963 22.957764643100 +6089 0.6089 47.7819989428809322 23.045239520250 +6090 0.6090 47.7796900457110993 23.132703876370 +6091 0.6091 47.7773724026357485 23.220157630580 +6092 0.6092 47.7750460147191092 23.307600702160 +6093 0.6093 47.7727108830334757 23.395033010550 +6094 0.6094 47.7703670086591785 23.482454475400 +6095 0.6095 47.7680143926845844 23.569865016480 +6096 0.6096 47.7656530362060678 23.657264553780 +6097 0.6097 47.7632829403280113 23.744653007410 +6098 0.6098 47.7609041061627551 23.832030297670 +6099 0.6099 47.7585165348306191 23.919396345050 +6100 0.6100 47.7561202274598600 24.006751070170 +6101 0.6101 47.7537151851866568 24.094094393870 +6102 0.6102 47.7513014091551113 24.181426237100 +6103 0.6103 47.7488789005172052 24.268746521000 +6104 0.6104 47.7464476604328070 24.356055166900 +6105 0.6105 47.7440076900696511 24.443352096260 +6106 0.6106 47.7415589906033020 24.530637230740 +6107 0.6107 47.7391015632171545 24.617910492150 +6108 0.6108 47.7366354091024263 24.705171802480 +6109 0.6109 47.7341605294581086 24.792421083850 +6110 0.6110 47.7316769254909872 24.879658258600 +6111 0.6111 47.7291845984155998 24.966883249190 +6112 0.6112 47.7266835494542292 25.054095978280 +6113 0.6113 47.7241737798368817 25.141296368670 +6114 0.6114 47.7216552908012801 25.228484343330 +6115 0.6115 47.7191280835928424 25.315659825410 +6116 0.6116 47.7165921594646605 25.402822738200 +6117 0.6117 47.7140475196774929 25.489973005180 +6118 0.6118 47.7114941654997367 25.577110549970 +6119 0.6119 47.7089320982074199 25.664235296390 +6120 0.6120 47.7063613190841806 25.751347168370 +6121 0.6121 47.7037818294212599 25.838446090040 +6122 0.6122 47.7011936305174729 25.925531985710 +6123 0.6123 47.6985967236791950 26.012604779800 +6124 0.6124 47.6959911102203620 26.099664396930 +6125 0.6125 47.6933767914624198 26.186710761890 +6126 0.6126 47.6907537687343464 26.273743799600 +6127 0.6127 47.6881220433726085 26.360763435160 +6128 0.6128 47.6854816167211553 26.447769593840 +6129 0.6129 47.6828324901314105 26.534762201040 +6130 0.6130 47.6801746649622444 26.621741182350 +6131 0.6131 47.6775081425799527 26.708706463530 +6132 0.6132 47.6748329243582560 26.795657970460 +6133 0.6133 47.6721490116782718 26.882595629220 +6134 0.6134 47.6694564059285071 26.969519366020 +6135 0.6135 47.6667551085048444 27.056429107250 +6136 0.6136 47.6640451208105063 27.143324779470 +6137 0.6137 47.6613264442560620 27.230206309370 +6138 0.6138 47.6585990802594068 27.317073623800 +6139 0.6139 47.6558630302457260 27.403926649800 +6140 0.6140 47.6531182956475092 27.490765314530 +6141 0.6141 47.6503648779045150 27.577589545360 +6142 0.6142 47.6476027784637566 27.664399269750 +6143 0.6143 47.6448319987795017 27.751194415380 +6144 0.6144 47.6420525403132302 27.837974910060 +6145 0.6145 47.6392644045336411 27.924740681740 +6146 0.6146 47.6364675929166239 28.011491658570 +6147 0.6147 47.6336621069452519 28.098227768830 +6148 0.6148 47.6308479481097606 28.184948940940 +6149 0.6149 47.6280251179075407 28.271655103520 +6150 0.6150 47.6251936178431023 28.358346185310 +6151 0.6151 47.6223534494280756 28.445022115240 +6152 0.6152 47.6195046141811957 28.531682822340 +6153 0.6153 47.6166471136282823 28.618328235870 +6154 0.6154 47.6137809493022317 28.704958285170 +6155 0.6155 47.6109061227429819 28.791572899800 +6156 0.6156 47.6080226354975196 28.878172009440 +6157 0.6157 47.6051304891198512 28.964755543920 +6158 0.6158 47.6022296851709967 29.051323433230 +6159 0.6159 47.5993202252189604 29.137875607560 +6160 0.6160 47.5964021108387243 29.224411997160 +6161 0.6161 47.5934753436122406 29.310932532510 +6162 0.6162 47.5905399251284038 29.397437144230 +6163 0.6163 47.5875958569830360 29.483925763070 +6164 0.6164 47.5846431407788870 29.570398319950 +6165 0.6165 47.5816817781255921 29.656854745940 +6166 0.6166 47.5787117706396785 29.743294972270 +6167 0.6167 47.5757331199445517 29.829718930300 +6168 0.6168 47.5727458276704596 29.916126551560 +6169 0.6169 47.5697498954544926 30.002517767730 +6170 0.6170 47.5667453249405767 30.088892510650 +6171 0.6171 47.5637321177794306 30.175250712290 +6172 0.6172 47.5607102756285798 30.261592304770 +6173 0.6173 47.5576798001523215 30.347917220390 +6174 0.6174 47.5546406930217245 30.434225391580 +6175 0.6175 47.5515929559146002 30.520516750920 +6176 0.6176 47.5485365905154964 30.606791231160 +6177 0.6177 47.5454715985156824 30.693048765150 +6178 0.6178 47.5423979816131279 30.779289285950 +6179 0.6179 47.5393157415124961 30.865512726750 +6180 0.6180 47.5362248799251148 30.951719020860 +6181 0.6181 47.5331253985689841 31.037908101770 +6182 0.6182 47.5300172991687404 31.124079903120 +6183 0.6183 47.5269005834556495 31.210234358680 +6184 0.6184 47.5237752531675994 31.296371402380 +6185 0.6185 47.5206413100490650 31.382490968290 +6186 0.6186 47.5174987558511219 31.468592990640 +6187 0.6187 47.5143475923313972 31.554677403800 +6188 0.6188 47.5111878212540901 31.640744142290 +6189 0.6189 47.5080194443899373 31.726793140770 +6190 0.6190 47.5048424635161979 31.812824334040 +6191 0.6191 47.5016568804166397 31.898837657100 +6192 0.6192 47.4984626968815320 31.984833045020 +6193 0.6193 47.4952599147076242 32.070810433070 +6194 0.6194 47.4920485356981388 32.156769756640 +6195 0.6195 47.4888285616627428 32.242710951270 +6196 0.6196 47.4855999944175480 32.328633952660 +6197 0.6197 47.4823628357850822 32.414538696660 +6198 0.6198 47.4791170875942896 32.500425119210 +6199 0.6199 47.4758627516805021 32.586293156470 +6200 0.6200 47.4725998298854464 32.672142744700 +6201 0.6201 47.4693283240571944 32.757973820310 +6202 0.6202 47.4660482360501845 32.843786319880 +6203 0.6203 47.4627595677251861 32.929580180080 +6204 0.6204 47.4594623209492923 33.015355337790 +6205 0.6205 47.4561564975959058 33.101111729980 +6206 0.6206 47.4528420995447178 33.186849293790 +6207 0.6207 47.4495191286817004 33.272567966500 +6208 0.6208 47.4461875868991001 33.358267685530 +6209 0.6209 47.4428474760954018 33.443948388440 +6210 0.6210 47.4394987981753360 33.529610012940 +6211 0.6211 47.4361415550498435 33.615252496880 +6212 0.6212 47.4327757486360895 33.700875778250 +6213 0.6213 47.4294013808574206 33.786479795180 +6214 0.6214 47.4260184536433655 33.872064485930 +6215 0.6215 47.4226269689296203 33.957629788950 +6216 0.6216 47.4192269286580341 34.043175642770 +6217 0.6217 47.4158183347765885 34.128701986090 +6218 0.6218 47.4124011892393966 34.214208757750 +6219 0.6219 47.4089754940066683 34.299695896750 +6220 0.6220 47.4055412510447240 34.385163342190 +6221 0.6221 47.4020984623259451 34.470611033330 +6222 0.6222 47.3986471298288023 34.556038909570 +6223 0.6223 47.3951872555377989 34.641446910450 +6224 0.6224 47.3917188414434918 34.726834975660 +6225 0.6225 47.3882418895424564 34.812203045010 +6226 0.6226 47.3847564018372864 34.897551058450 +6227 0.6227 47.3812623803365582 34.982878956100 +6228 0.6228 47.3777598270548452 35.068186678160 +6229 0.6229 47.3742487440126823 35.153474165040 +6230 0.6230 47.3707291332365656 35.238741357230 +6231 0.6231 47.3672009967589318 35.323988195380 +6232 0.6232 47.3636643366181502 35.409214620290 +6233 0.6233 47.3601191548584950 35.494420572880 +6234 0.6234 47.3565654535301377 35.579605994200 +6235 0.6235 47.3530032346891545 35.664770825470 +6236 0.6236 47.3494325003974836 35.749915008010 +6237 0.6237 47.3458532527229181 35.835038483310 +6238 0.6238 47.3422654937391059 35.920141192980 +6239 0.6239 47.3386692255255213 36.005223078750 +6240 0.6240 47.3350644501674580 36.090284082510 +6241 0.6241 47.3314511697560150 36.175324146280 +6242 0.6242 47.3278293863880890 36.260343212230 +6243 0.6243 47.3241991021663466 36.345341222620 +6244 0.6244 47.3205603191992239 36.430318119900 +6245 0.6245 47.3169130396008981 36.515273846610 +6246 0.6246 47.3132572654912948 36.600208345470 +6247 0.6247 47.3095929989960595 36.685121559290 +6248 0.6248 47.3059202422465432 36.770013431030 +6249 0.6249 47.3022389973798028 36.854883903820 +6250 0.6250 47.2985492665385721 36.939732920860 +6251 0.6251 47.2948510518712553 37.024560425530 +6252 0.6252 47.2911443555319124 37.109366361330 +6253 0.6253 47.2874291796802524 37.194150671900 +6254 0.6254 47.2837055264816044 37.278913300990 +6255 0.6255 47.2799733981069323 37.363654192520 +6256 0.6256 47.2762327967327778 37.448373290500 +6257 0.6257 47.2724837245412957 37.533070539120 +6258 0.6258 47.2687261837202044 37.617745882660 +6259 0.6259 47.2649601764627931 37.702399265560 +6260 0.6260 47.2611857049678932 37.787030632370 +6261 0.6261 47.2574027714398852 37.871639927800 +6262 0.6262 47.2536113780886637 37.956227096680 +6263 0.6263 47.2498115271296300 38.040792083940 +6264 0.6264 47.2460032207836989 38.125334834680 +6265 0.6265 47.2421864612772566 38.209855294130 +6266 0.6266 47.2383612508421677 38.294353407640 +6267 0.6267 47.2345275917157537 38.378829120680 +6268 0.6268 47.2306854861407786 38.463282378850 +6269 0.6269 47.2268349363654423 38.547713127910 +6270 0.6270 47.2229759446433590 38.632121313730 +6271 0.6271 47.2191085132335573 38.716506882320 +6272 0.6272 47.2152326444004515 38.800869779780 +6273 0.6273 47.2113483404138421 38.885209952390 +6274 0.6274 47.2074556035488939 38.969527346550 +6275 0.6275 47.2035544360861294 39.053821908760 +6276 0.6276 47.1996448403114073 39.138093585660 +6277 0.6277 47.1957268185159222 39.222342324050 +6278 0.6278 47.1918003729961768 39.306568070820 +6279 0.6279 47.1878655060539884 39.390770773000 +6280 0.6280 47.1839222199964539 39.474950377760 +6281 0.6281 47.1799705171359491 39.559106832370 +6282 0.6282 47.1760103997901155 39.643240084270 +6283 0.6283 47.1720418702818520 39.727350080990 +6284 0.6284 47.1680649309392948 39.811436770200 +6285 0.6285 47.1640795840958020 39.895500099690 +6286 0.6286 47.1600858320899476 39.979540017390 +6287 0.6287 47.1560836772655136 40.063556471360 +6288 0.6288 47.1520731219714548 40.147549409760 +6289 0.6289 47.1480541685619201 40.231518780920 +6290 0.6290 47.1440268193962098 40.315464533240 +6291 0.6291 47.1399910768387826 40.399386615290 +6292 0.6292 47.1359469432592277 40.483284975750 +6293 0.6293 47.1318944210322712 40.567159563430 +6294 0.6294 47.1278335125377410 40.651010327240 +6295 0.6295 47.1237642201605667 40.734837216260 +6296 0.6296 47.1196865462907724 40.818640179670 +6297 0.6297 47.1156004933234485 40.902419166770 +6298 0.6298 47.1115060636587586 40.986174126980 +6299 0.6299 47.1074032597019183 41.069905009880 +6300 0.6300 47.1032920838631668 41.153611765130 +6301 0.6301 47.0991725385577809 41.237294342540 +6302 0.6302 47.0950446262060538 41.320952692030 +6303 0.6303 47.0909083492332670 41.404586763660 +6304 0.6304 47.0867637100697038 41.488196507600 +6305 0.6305 47.0826107111506147 41.571781874150 +6306 0.6306 47.0784493549162235 41.655342813710 +6307 0.6307 47.0742796438116926 41.738879276850 +6308 0.6308 47.0701015802871368 41.822391214220 +6309 0.6309 47.0659151667975948 41.905878576610 +6310 0.6310 47.0617204058030154 41.989341314940 +6311 0.6311 47.0575172997682571 42.072779380220 +6312 0.6312 47.0533058511630671 42.156192723620 +6313 0.6313 47.0490860624620666 42.239581296410 +6314 0.6314 47.0448579361447443 42.322945049990 +6315 0.6315 47.0406214746954490 42.406283935880 +6316 0.6316 47.0363766806033681 42.489597905700 +6317 0.6317 47.0321235563625208 42.572886911230 +6318 0.6318 47.0278621044717440 42.656150904350 +6319 0.6319 47.0235923274346774 42.739389837050 +6320 0.6320 47.0193142277597502 42.822603661460 +6321 0.6321 47.0150278079601875 42.905792329820 +6322 0.6322 47.0107330705539752 42.988955794490 +6323 0.6323 47.0064300180638526 43.072094007940 +6324 0.6324 47.0021186530173196 43.155206922790 +6325 0.6325 46.9977989779465943 43.238294491760 +6326 0.6326 46.9934709953886198 43.321356667670 +6327 0.6327 46.9891347078850643 43.404393403490 +6328 0.6328 46.9847901179822713 43.487404652310 +6329 0.6329 46.9804372282312883 43.570390367290 +6330 0.6330 46.9760760411878309 43.653350501790 +6331 0.6331 46.9717065594122829 43.736285009210 +6332 0.6332 46.9673287854696682 43.819193843110 +6333 0.6333 46.9629427219296574 43.902076957160 +6334 0.6334 46.9585483713665397 43.984934305150 +6335 0.6335 46.9541457363592372 44.067765840970 +6336 0.6336 46.9497348194912547 44.150571518660 +6337 0.6337 46.9453156233507016 44.233351292350 +6338 0.6338 46.9408881505302702 44.316105116300 +6339 0.6339 46.9364524036272144 44.398832944850 +6340 0.6340 46.9320083852433427 44.481534732550 +6341 0.6341 46.9275560979850184 44.564210433950 +6342 0.6342 46.9230955444631306 44.646860003810 +6343 0.6343 46.9186267272930948 44.729483396940 +6344 0.6344 46.9141496490948313 44.812080568310 +6345 0.6345 46.9096643124927652 44.894651472980 +6346 0.6346 46.9051707201158052 44.977196066150 +6347 0.6347 46.9006688745973435 45.059714303110 +6348 0.6348 46.8961587785752272 45.142206139260 +6349 0.6349 46.8916404346917588 45.224671530160 +6350 0.6350 46.8871138455936816 45.307110431450 +6351 0.6351 46.8825790139321654 45.389522798870 +6352 0.6352 46.8780359423628070 45.471908588310 +6353 0.6353 46.8734846335456012 45.554267755760 +6354 0.6354 46.8689250901449483 45.636600257320 +6355 0.6355 46.8643573148296184 45.718906049210 +6356 0.6356 46.8597813102727727 45.801185087750 +6357 0.6357 46.8551970791519139 45.883437329400 +6358 0.6358 46.8506046241489074 45.965662730710 +6359 0.6359 46.8460039479499528 46.047861248340 +6360 0.6360 46.8413950532455843 46.130032839090 +6361 0.6361 46.8367779427306345 46.212177459860 +6362 0.6362 46.8321526191042565 46.294295067640 +6363 0.6363 46.8275190850698948 46.376385619580 +6364 0.6364 46.8228773433352714 46.458449072890 +6365 0.6365 46.8182273966123788 46.540485384940 +6366 0.6366 46.8135692476174725 46.622494513160 +6367 0.6367 46.8089028990710574 46.704476415150 +6368 0.6368 46.8042283536978729 46.786431048570 +6369 0.6369 46.7995456142268864 46.868358371230 +6370 0.6370 46.7948546833912715 46.950258341020 +6371 0.6371 46.7901555639284226 47.032130915970 +6372 0.6372 46.7854482585799119 47.113976054210 +6373 0.6373 46.7807327700915039 47.195793713970 +6374 0.6374 46.7760091012131269 47.277583853600 +6375 0.6375 46.7712772546988660 47.359346431550 +6376 0.6376 46.7665372333069698 47.441081406410 +6377 0.6377 46.7617890397998082 47.522788736840 +6378 0.6378 46.7570326769438864 47.604468381650 +6379 0.6379 46.7522681475098167 47.686120299720 +6380 0.6380 46.7474954542723253 47.767744450070 +6381 0.6381 46.7427146000102312 47.849340791810 +6382 0.6382 46.7379255875064317 47.930909284190 +6383 0.6383 46.7331284195478958 48.012449886520 +6384 0.6384 46.7283230989256566 48.093962558250 +6385 0.6385 46.7235096284347975 48.175447258950 +6386 0.6386 46.7186880108744376 48.256903948280 +6387 0.6387 46.7138582490477248 48.338332586000 +6388 0.6388 46.7090203457618216 48.419733132000 +6389 0.6389 46.7041743038279051 48.501105546260 +6390 0.6390 46.6993201260611457 48.582449788880 +6391 0.6391 46.6944578152806997 48.663765820070 +6392 0.6392 46.6895873743096885 48.745053600130 +6393 0.6393 46.6847088059752053 48.826313089480 +6394 0.6394 46.6798221131083011 48.907544248660 +6395 0.6395 46.6749272985439561 48.988747038280 +6396 0.6396 46.6700243651210869 49.069921419100 +6397 0.6397 46.6651133156825324 49.151067351950 +6398 0.6398 46.6601941530750466 49.232184797790 +6399 0.6399 46.6552668801492700 49.313273717700 +6400 0.6400 46.6503314997597442 49.394334072810 +6401 0.6401 46.6453880147648832 49.475365824410 +6402 0.6402 46.6404364280269661 49.556368933870 +6403 0.6403 46.6354767424121377 49.637343362700 +6404 0.6404 46.6305089607903795 49.718289072450 +6405 0.6405 46.6255330860355173 49.799206024840 +6406 0.6406 46.6205491210251921 49.880094181660 +6407 0.6407 46.6155570686408680 49.960953504810 +6408 0.6408 46.6105569317678103 50.041783956320 +6409 0.6409 46.6055487132950788 50.122585498280 +6410 0.6410 46.6005324161155201 50.203358092930 +6411 0.6411 46.5955080431257471 50.284101702570 +6412 0.6412 46.5904755972261384 50.364816289660 +6413 0.6413 46.5854350813208171 50.445501816700 +6414 0.6414 46.5803864983176652 50.526158246340 +6415 0.6415 46.5753298511282807 50.606785541320 +6416 0.6416 46.5702651426679921 50.687383664470 +6417 0.6417 46.5651923758558297 50.767952578760 +6418 0.6418 46.5601115536145329 50.848492247220 +6419 0.6419 46.5550226788705217 50.929002633020 +6420 0.6420 46.5499257545539038 51.009483699400 +6421 0.6421 46.5448207835984462 51.089935409720 +6422 0.6422 46.5397077689415894 51.170357727440 +6423 0.6423 46.5345867135244120 51.250750616140 +6424 0.6424 46.5294576202916303 51.331114039480 +6425 0.6425 46.5243204921915918 51.411447961220 +6426 0.6426 46.5191753321762675 51.491752345220 +6427 0.6427 46.5140221432012311 51.572027155480 +6428 0.6428 46.5088609282256513 51.652272356060 +6429 0.6429 46.5036916902122925 51.732487911130 +6430 0.6430 46.4985144321274859 51.812673784980 +6431 0.6431 46.4933291569411367 51.892829941960 +6432 0.6432 46.4881358676267098 51.972956346590 +6433 0.6433 46.4829345671612089 52.053052963420 +6434 0.6434 46.4777252585251830 52.133119757130 +6435 0.6435 46.4725079447026985 52.213156692520 +6436 0.6436 46.4672826286813461 52.293163734460 +6437 0.6437 46.4620493134522263 52.373140847930 +6438 0.6438 46.4568080020099288 52.453087998020 +6439 0.6439 46.4515586973525316 52.533005149900 +6440 0.6440 46.4463014024815948 52.612892268860 +6441 0.6441 46.4410361204021385 52.692749320270 +6442 0.6442 46.4357628541226433 52.772576269620 +6443 0.6443 46.4304816066550359 52.852373082500 +6444 0.6444 46.4251923810146820 52.932139724570 +6445 0.6445 46.4198951802203723 53.011876161620 +6446 0.6446 46.4145900072943149 53.091582359530 +6447 0.6447 46.4092768652621288 53.171258284260 +6448 0.6448 46.4039557571528221 53.250903901890 +6449 0.6449 46.3986266859987992 53.330519178610 +6450 0.6450 46.3932896548358329 53.410104080660 +6451 0.6451 46.3879446667030777 53.489658574430 +6452 0.6452 46.3825917246430350 53.569182626390 +6453 0.6453 46.3772308317015600 53.648676203080 +6454 0.6454 46.3718619909278473 53.728139271180 +6455 0.6455 46.3664852053744170 53.807571797470 +6456 0.6456 46.3611004780971072 53.886973748760 +6457 0.6457 46.3557078121550674 53.966345092030 +6458 0.6458 46.3503072106107510 54.045685794340 +6459 0.6459 46.3448986765298940 54.124995822820 +6460 0.6460 46.3394822129815154 54.204275144730 +6461 0.6461 46.3340578230379094 54.283523727390 +6462 0.6462 46.3286255097746249 54.362741538250 +6463 0.6463 46.3231852762704719 54.441928544860 +6464 0.6464 46.3177371256074863 54.521084714820 +6465 0.6465 46.3122810608709514 54.600210015870 +6466 0.6466 46.3068170851493690 54.679304415830 +6467 0.6467 46.3013452015344456 54.758367882610 +6468 0.6468 46.2958654131211063 54.837400384240 +6469 0.6469 46.2903777230074525 54.916401888820 +6470 0.6470 46.2848821342947829 54.995372364550 +6471 0.6471 46.2793786500875655 55.074311779730 +6472 0.6472 46.2738672734934440 55.153220102750 +6473 0.6473 46.2683480076232030 55.232097302090 +6474 0.6474 46.2628208555907818 55.310943346350 +6475 0.6475 46.2572858205132533 55.389758204200 +6476 0.6476 46.2517429055108238 55.468541844410 +6477 0.6477 46.2461921137068117 55.547294235830 +6478 0.6478 46.2406334482276478 55.626015347450 +6479 0.6479 46.2350669122028606 55.704705148300 +6480 0.6480 46.2294925087650697 55.783363607540 +6481 0.6481 46.2239102410499711 55.861990694400 +6482 0.6482 46.2183201121963378 55.940586378210 +6483 0.6483 46.2127221253460050 56.019150628410 +6484 0.6484 46.2071162836438560 56.097683414510 +6485 0.6485 46.2015025902378227 56.176184706130 +6486 0.6486 46.1958810482788707 56.254654472970 +6487 0.6487 46.1902516609209783 56.333092684820 +6488 0.6488 46.1846144313211582 56.411499311600 +6489 0.6489 46.1789693626394140 56.489874323260 +6490 0.6490 46.1733164580387552 56.568217689890 +6491 0.6491 46.1676557206851754 56.646529381670 +6492 0.6492 46.1619871537476527 56.724809368840 +6493 0.6493 46.1563107603981209 56.803057621760 +6494 0.6494 46.1506265438114909 56.881274110860 +6495 0.6495 46.1449345071656154 56.959458806690 +6496 0.6496 46.1392346536412887 57.037611679870 +6497 0.6497 46.1335269864222397 57.115732701110 +6498 0.6498 46.1278115086951246 57.193821841240 +6499 0.6499 46.1220882236495058 57.271879071140 +6500 0.6500 46.1163571344778589 57.349904361800 +6501 0.6501 46.1106182443755515 57.427897684300 +6502 0.6502 46.1048715565408429 57.505859009820 +6503 0.6503 46.0991170741748704 57.583788309620 +6504 0.6504 46.0933548004816345 57.661685555040 +6505 0.6505 46.0875847386680064 57.739550717530 +6506 0.6506 46.0818068919436996 57.817383768620 +6507 0.6507 46.0760212635212696 57.895184679930 +6508 0.6508 46.0702278566161141 57.972953423160 +6509 0.6509 46.0644266744464517 58.050689970130 +6510 0.6510 46.0586177202333076 58.128394292730 +6511 0.6511 46.0528009972005279 58.206066362920 +6512 0.6512 46.0469765085747440 58.283706152770 +6513 0.6513 46.0411442575853798 58.361313634460 +6514 0.6514 46.0353042474646443 58.438888780210 +6515 0.6515 46.0294564814475180 58.516431562360 +6516 0.6516 46.0236009627717308 58.593941953340 +6517 0.6517 46.0177376946777841 58.671419925650 +6518 0.6518 46.0118666804089074 58.748865451910 +6519 0.6519 46.0059879232110731 58.826278504780 +6520 0.6520 46.0001014263329822 58.903659057050 +6521 0.6521 45.9942071930260497 58.981007081580 +6522 0.6522 45.9883052265444050 59.058322551330 +6523 0.6523 45.9823955301448706 59.135605439330 +6524 0.6524 45.9764781070869688 59.212855718690 +6525 0.6525 45.9705529606329009 59.290073362650 +6526 0.6526 45.9646200940475467 59.367258344500 +6527 0.6527 45.9586795105984436 59.444410637620 +6528 0.6528 45.9527312135557864 59.521530215490 +6529 0.6529 45.9467752061924273 59.598617051670 +6530 0.6530 45.9408114917838546 59.675671119790 +6531 0.6531 45.9348400736081857 59.752692393620 +6532 0.6532 45.9288609549461597 59.829680846950 +6533 0.6533 45.9228741390811237 59.906636453700 +6534 0.6534 45.9168796292990464 59.983559187840 +6535 0.6535 45.9108774288884831 60.060449023490 +6536 0.6536 45.9048675411405682 60.137305934770 +6537 0.6537 45.8988499693490297 60.214129895940 +6538 0.6538 45.8928247168101677 60.290920881350 +6539 0.6539 45.8867917868228332 60.367678865410 +6540 0.6540 45.8807511826884351 60.444403822620 +6541 0.6541 45.8747029077109261 60.521095727590 +6542 0.6542 45.8686469651967954 60.597754554960 +6543 0.6543 45.8625833584550691 60.674380279520 +6544 0.6544 45.8565120907972883 60.750972876120 +6545 0.6545 45.8504331655375026 60.827532319650 +6546 0.6546 45.8443465859922625 60.904058585150 +6547 0.6547 45.8382523554806198 60.980551647710 +6548 0.6548 45.8321504773241060 61.057011482520 +6549 0.6549 45.8260409548467393 61.133438064850 +6550 0.6550 45.8199237913749968 61.209831370030 +6551 0.6551 45.8137989902378209 61.286191373500 +6552 0.6552 45.8076665547666053 61.362518050790 +6553 0.6553 45.8015264882951953 61.438811377480 +6554 0.6554 45.7953787941598591 61.515071329270 +6555 0.6555 45.7892234756993020 61.591297881930 +6556 0.6556 45.7830605362546450 61.667491011280 +6557 0.6557 45.7768899791694182 61.743650693280 +6558 0.6558 45.7707118077895601 61.819776903930 +6559 0.6559 45.7645260254633968 61.895869619350 +6560 0.6560 45.7583326355416418 61.971928815700 +6561 0.6561 45.7521316413773960 62.047954469240 +6562 0.6562 45.7459230463261193 62.123946556330 +6563 0.6563 45.7397068537456306 62.199905053400 +6564 0.6564 45.7334830669961150 62.275829936940 +6565 0.6565 45.7272516894400880 62.351721183550 +6566 0.6566 45.7210127244424172 62.427578769900 +6567 0.6567 45.7147661753702863 62.503402672760 +6568 0.6568 45.7085120455932028 62.579192868950 +6569 0.6569 45.7022503384829832 62.654949335390 +6570 0.6570 45.6959810574137606 62.730672049090 +6571 0.6571 45.6897042057619487 62.806360987110 +6572 0.6572 45.6834197869062635 62.882016126630 +6573 0.6573 45.6771278042276876 62.957637444860 +6574 0.6574 45.6708282611094845 63.033224919160 +6575 0.6575 45.6645211609371842 63.108778526910 +6576 0.6576 45.6582065070985621 63.184298245600 +6577 0.6577 45.6518843029836390 63.259784052800 +6578 0.6578 45.6455545519846950 63.335235926140 +6579 0.6579 45.6392172574962203 63.410653843340 +6580 0.6580 45.6328724229149429 63.486037782220 +6581 0.6581 45.6265200516398011 63.561387720660 +6582 0.6582 45.6201601470719353 63.636703636620 +6583 0.6583 45.6137927126146963 63.711985508130 +6584 0.6584 45.6074177516736228 63.787233313330 +6585 0.6585 45.6010352676564352 63.862447030400 +6586 0.6586 45.5946452639730353 63.937626637650 +6587 0.6587 45.5882477440354847 64.012772113410 +6588 0.6588 45.5818427112580054 64.087883436150 +6589 0.6589 45.5754301690569790 64.162960584350 +6590 0.6590 45.5690101208509333 64.238003536630 +6591 0.6591 45.5625825700605205 64.313012271660 +6592 0.6592 45.5561475201085315 64.387986768190 +6593 0.6593 45.5497049744198677 64.462927005050 +6594 0.6594 45.5432549364215546 64.537832961160 +6595 0.6595 45.5367974095427215 64.612704615490 +6596 0.6596 45.5303323972145932 64.687541947100 +6597 0.6597 45.5238599028704840 64.762344935150 +6598 0.6598 45.5173799299457826 64.837113558860 +6599 0.6599 45.5108924818779670 64.911847797520 +6600 0.6600 45.5043975621065684 64.986547630510 +6601 0.6601 45.4978951740731787 65.061213037280 +6602 0.6602 45.4913853212214505 65.135843997350 +6603 0.6603 45.4848680069970683 65.210440490350 +6604 0.6604 45.4783432348477561 65.285002495940 +6605 0.6605 45.4718110082232627 65.359529993890 +6606 0.6606 45.4652713305753693 65.434022964040 +6607 0.6607 45.4587242053578535 65.508481386300 +6608 0.6608 45.4521696360265040 65.582905240660 +6609 0.6609 45.4456076260391129 65.657294507190 +6610 0.6610 45.4390381788554549 65.731649166030 +6611 0.6611 45.4324612979372873 65.805969197390 +6612 0.6612 45.4258769867483423 65.880254581570 +6613 0.6613 45.4192852487543135 65.954505298940 +6614 0.6614 45.4126860874228697 66.028721329960 +6615 0.6615 45.4060795062236124 66.102902655130 +6616 0.6616 45.3994655086281043 66.177049255050 +6617 0.6617 45.3928440981098333 66.251161110400 +6618 0.6618 45.3862152781442134 66.325238201930 +6619 0.6619 45.3795790522085909 66.399280510450 +6620 0.6620 45.3729354237822236 66.473288016880 +6621 0.6621 45.3662843963462734 66.547260702160 +6622 0.6622 45.3596259733837996 66.621198547360 +6623 0.6623 45.3529601583797515 66.695101533580 +6624 0.6624 45.3462869548209682 66.768969642040 +6625 0.6625 45.3396063661961648 66.842802854010 +6626 0.6626 45.3329183959959252 66.916601150810 +6627 0.6627 45.3262230477126877 66.990364513880 +6628 0.6628 45.3195203248407594 67.064092924710 +6629 0.6629 45.3128102308762806 67.137786364850 +6630 0.6630 45.3060927693172388 67.211444815960 +6631 0.6631 45.2993679436634551 67.285068259750 +6632 0.6632 45.2926357574165692 67.358656677980 +6633 0.6633 45.2858962140800401 67.432210052560 +6634 0.6634 45.2791493171591455 67.505728365390 +6635 0.6635 45.2723950701609539 67.579211598480 +6636 0.6636 45.2656334765943313 67.652659733920 +6637 0.6637 45.2588645399699416 67.726072753850 +6638 0.6638 45.2520882638002249 67.799450640500 +6639 0.6639 45.2453046515993904 67.872793376180 +6640 0.6640 45.2385137068834169 67.946100943260 +6641 0.6641 45.2317154331700451 68.019373324170 +6642 0.6642 45.2249098339787636 68.092610501430 +6643 0.6643 45.2180969128308092 68.165812457630 +6644 0.6644 45.2112766732491593 68.238979175430 +6645 0.6645 45.2044491187585109 68.312110637570 +6646 0.6646 45.1976142528852876 68.385206826850 +6647 0.6647 45.1907720791576395 68.458267726120 +6648 0.6648 45.1839226011054151 68.531293318380 +6649 0.6649 45.1770658222601682 68.604283586600 +6650 0.6650 45.1702017461551435 68.677238513880 +6651 0.6651 45.1633303763252769 68.750158083410 +6652 0.6652 45.1564517163071883 68.823042278390 +6653 0.6653 45.1495657696391604 68.895891082150 +6654 0.6654 45.1426725398611524 68.968704478050 +6655 0.6655 45.1357720305147723 69.041482449530 +6656 0.6656 45.1288642451432906 69.114224980110 +6657 0.6657 45.1219491872916123 69.186932053390 +6658 0.6658 45.1150268605062905 69.259603653020 +6659 0.6659 45.1080972683355057 69.332239762720 +6660 0.6660 45.1011604143290512 69.404840366300 +6661 0.6661 45.0942163020383546 69.477405447610 +6662 0.6662 45.0872649350164423 69.549934990620 +6663 0.6663 45.0803063168179463 69.622428979300 +6664 0.6664 45.0733404509990905 69.694887397760 +6665 0.6665 45.0663673411176973 69.767310230130 +6666 0.6666 45.0593869907331595 69.839697460630 +6667 0.6667 45.0523994034064543 69.912049073540 +6668 0.6668 45.0454045827001153 69.984365053230 +6669 0.6669 45.0384025321782460 70.056645384120 +6670 0.6670 45.0313932554065062 70.128890050700 +6671 0.6671 45.0243767559520975 70.201099037540 +6672 0.6672 45.0173530373837565 70.273272329270 +6673 0.6673 45.0103221032717613 70.345409910590 +6674 0.6674 45.0032839571879180 70.417511766270 +6675 0.6675 44.9962386027055459 70.489577881140 +6676 0.6676 44.9891860433994850 70.561608240120 +6677 0.6677 44.9821262828460675 70.633602828180 +6678 0.6678 44.9750593246231389 70.705561630360 +6679 0.6679 44.9679851723100299 70.777484631770 +6680 0.6680 44.9609038294875631 70.849371817610 +6681 0.6681 44.9538152997380251 70.921223173100 +6682 0.6682 44.9467195866451945 70.993038683570 +6683 0.6683 44.9396166937942994 71.064818334390 +6684 0.6684 44.9325066247720315 71.136562111020 +6685 0.6685 44.9253893831665323 71.208269998990 +6686 0.6686 44.9182649725673926 71.279941983870 +6687 0.6687 44.9111333965656314 71.351578051300 +6688 0.6688 44.9039946587537173 71.423178187030 +6689 0.6689 44.8968487627255257 71.494742376830 +6690 0.6690 44.8896957120763602 71.566270606540 +6691 0.6691 44.8825355104029242 71.637762862110 +6692 0.6692 44.8753681613033422 71.709219129500 +6693 0.6693 44.8681936683771312 71.780639394780 +6694 0.6694 44.8610120352251869 71.852023644060 +6695 0.6695 44.8538232654498046 71.923371863540 +6696 0.6696 44.8466273626546581 71.994684039460 +6697 0.6697 44.8394243304447784 72.065960158140 +6698 0.6698 44.8322141724265748 72.137200205970 +6699 0.6699 44.8249968922078068 72.208404169400 +6700 0.6700 44.8177724933975909 72.279572034950 +6701 0.6701 44.8105409796063867 72.350703789190 +6702 0.6702 44.8033023544459894 72.421799418780 +6703 0.6703 44.7960566215295302 72.492858910430 +6704 0.6704 44.7888037844714617 72.563882250910 +6705 0.6705 44.7815438468875655 72.634869427080 +6706 0.6706 44.7742768123949233 72.705820425830 +6707 0.6707 44.7670026846119242 72.776735234160 +6708 0.6708 44.7597214671582648 72.847613839090 +6709 0.6709 44.7524331636549277 72.918456227720 +6710 0.6710 44.7451377777241817 72.989262387240 +6711 0.6711 44.7378353129895743 73.060032304870 +6712 0.6712 44.7305257730759322 73.130765967910 +6713 0.6713 44.7232091616093541 73.201463363720 +6714 0.6714 44.7158854822171818 73.272124479730 +6715 0.6715 44.7085547385280222 73.342749303430 +6716 0.6716 44.7012169341717325 73.413337822380 +6717 0.6717 44.6938720727794063 73.483890024190 +6718 0.6718 44.6865201579833666 73.554405896550 +6719 0.6719 44.6791611934171797 73.624885427210 +6720 0.6720 44.6717951827156199 73.695328603980 +6721 0.6721 44.6644221295146835 73.765735414730 +6722 0.6722 44.6570420374515749 73.836105847400 +6723 0.6723 44.6496549101647062 73.906439889980 +6724 0.6724 44.6422607512936764 73.976737530560 +6725 0.6725 44.6348595644792852 74.046998757240 +6726 0.6726 44.6274513533635115 74.117223558240 +6727 0.6727 44.6200361215895072 74.187411921780 +6728 0.6728 44.6126138728016102 74.257563836210 +6729 0.6729 44.6051846106453027 74.327679289890 +6730 0.6730 44.5977483387672464 74.397758271260 +6731 0.6731 44.5903050608152398 74.467800768840 +6732 0.6732 44.5828547804382396 74.537806771190 +6733 0.6733 44.5753975012863322 74.607776266930 +6734 0.6734 44.5679332270107480 74.677709244770 +6735 0.6735 44.5604619612638402 74.747605693450 +6736 0.6736 44.5529837076990773 74.817465601780 +6737 0.6737 44.5454984699710579 74.887288958670 +6738 0.6738 44.5380062517354745 74.957075753020 +6739 0.6739 44.5305070566491281 75.026825973860 +6740 0.6740 44.5230008883699213 75.096539610240 +6741 0.6741 44.5154877505568436 75.166216651280 +6742 0.6742 44.5079676468699716 75.235857086190 +6743 0.6743 44.5004405809704551 75.305460904200 +6744 0.6744 44.4929065565205164 75.375028094620 +6745 0.6745 44.4853655771834440 75.444558646810 +6746 0.6746 44.4778176466235919 75.514052550230 +6747 0.6747 44.4702627685063661 75.583509794340 +6748 0.6748 44.4627009464982166 75.652930368720 +6749 0.6749 44.4551321842666312 75.722314262970 +6750 0.6750 44.4475564854801419 75.791661466760 +6751 0.6751 44.4399738538083113 75.860971969830 +6752 0.6752 44.4323842929217179 75.930245761980 +6753 0.6753 44.4247878064919632 75.999482833060 +6754 0.6754 44.4171843981916652 76.068683172970 +6755 0.6755 44.4095740716944292 76.137846771730 +6756 0.6756 44.4019568306748766 76.206973619330 +6757 0.6757 44.3943326788086168 76.276063705900 +6758 0.6758 44.3867016197722393 76.345117021580 +6759 0.6759 44.3790636572433286 76.414133556580 +6760 0.6760 44.3714187949004426 76.483113301190 +6761 0.6761 44.3637670364230985 76.552056245740 +6762 0.6762 44.3561083854917797 76.620962380610 +6763 0.6763 44.3484428457879361 76.689831696270 +6764 0.6764 44.3407704209939624 76.758664183230 +6765 0.6765 44.3330911147931985 76.827459832060 +6766 0.6766 44.3254049308699294 76.896218633380 +6767 0.6767 44.3177118729093635 76.964940577910 +6768 0.6768 44.3100119445976475 77.033625656380 +6769 0.6769 44.3023051496218514 77.102273859590 +6770 0.6770 44.2945914916699479 77.170885178420 +6771 0.6771 44.2868709744308404 77.239459603780 +6772 0.6772 44.2791436015943205 77.307997126670 +6773 0.6773 44.2714093768510821 77.376497738130 +6774 0.6774 44.2636683038927146 77.444961429250 +6775 0.6775 44.2559203864116952 77.513388191190 +6776 0.6776 44.2481656281013755 77.581778015180 +6777 0.6777 44.2404040326559951 77.650130892490 +6778 0.6778 44.2326356037706461 77.718446814430 +6779 0.6779 44.2248603451413018 77.786725772420 +6780 0.6780 44.2170782604647883 77.854967757900 +6781 0.6781 44.2092893534387770 77.923172762360 +6782 0.6782 44.2014936277617920 77.991340777380 +6783 0.6783 44.1936910871331960 78.059471794580 +6784 0.6784 44.1858817352531830 78.127565805620 +6785 0.6785 44.1780655758227923 78.195622802260 +6786 0.6786 44.1702426125438663 78.263642776270 +6787 0.6787 44.1624128491190788 78.331625719510 +6788 0.6788 44.1545762892519065 78.399571623900 +6789 0.6789 44.1467329366466430 78.467480481370 +6790 0.6790 44.1388827950083780 78.535352283970 +6791 0.6791 44.1310258680429897 78.603187023760 +6792 0.6792 44.1231621594571592 78.670984692880 +6793 0.6793 44.1152916729583424 78.738745283510 +6794 0.6794 44.1074144122547693 78.806468787910 +6795 0.6795 44.0995303810554518 78.874155198380 +6796 0.6796 44.0916395830701688 78.941804507270 +6797 0.6797 44.0837420220094529 79.009416707000 +6798 0.6798 44.0758377015846037 79.076991790040 +6799 0.6799 44.0679266255076598 79.144529748900 +6800 0.6800 44.0600087974914061 79.212030576200 +6801 0.6801 44.0520842212493662 79.279494264540 +6802 0.6802 44.0441529004958099 79.346920806640 +6803 0.6803 44.0362148389457175 79.414310195240 +6804 0.6804 44.0282700403148013 79.481662423140 +6805 0.6805 44.0203185083194839 79.548977483200 +6806 0.6806 44.0123602466769057 79.616255368350 +6807 0.6807 44.0043952591049106 79.683496071540 +6808 0.6808 43.9964235493220457 79.750699585800 +6809 0.6809 43.9884451210475476 79.817865904230 +6810 0.6810 43.9804599780013419 79.884995019940 +6811 0.6811 43.9724681239040365 79.952086926150 +6812 0.6812 43.9644695624769284 80.019141616070 +6813 0.6813 43.9564642974419755 80.086159083010 +6814 0.6814 43.9484523325218106 80.153139320350 +6815 0.6815 43.9404336714397203 80.220082321470 +6816 0.6816 43.9324083179196521 80.286988079840 +6817 0.6817 43.9243762756862139 80.353856588990 +6818 0.6818 43.9163375484646394 80.420687842470 +6819 0.6819 43.9082921399808228 80.487481833920 +6820 0.6820 43.9002400539612765 80.554238557020 +6821 0.6821 43.8921812941331524 80.620958005490 +6822 0.6822 43.8841158642242206 80.687640173140 +6823 0.6823 43.8760437679628765 80.754285053790 +6824 0.6824 43.8679650090781195 80.820892641340 +6825 0.6825 43.8598795912995669 80.887462929750 +6826 0.6826 43.8517875183574262 80.953995913010 +6827 0.6827 43.8436887939825155 81.020491585180 +6828 0.6828 43.8355834219062359 81.086949940370 +6829 0.6829 43.8274714058605781 81.153370972730 +6830 0.6830 43.8193527495781154 81.219754676480 +6831 0.6831 43.8112274567919968 81.286101045890 +6832 0.6832 43.8030955312359396 81.352410075280 +6833 0.6833 43.7949569766442224 81.418681759030 +6834 0.6834 43.7868117967516923 81.484916091560 +6835 0.6835 43.7786599952937436 81.551113067350 +6836 0.6836 43.7705015760063318 81.617272680920 +6837 0.6837 43.7623365426259454 81.683394926870 +6838 0.6838 43.7541648988896128 81.749479799830 +6839 0.6839 43.7459866485348954 81.815527294498 +6840 0.6840 43.7378017952998874 81.881537405591 +6841 0.6841 43.7296103429232090 81.947510127929 +6842 0.6842 43.7214122951439990 82.013445456333 +6843 0.6843 43.7132076557018934 82.079343385717 +6844 0.6844 43.7049964283370542 82.145203911021 +6845 0.6845 43.6967786167901409 82.211027027253 +6846 0.6846 43.6885542248023029 82.276812729467 +6847 0.6847 43.6803232561151944 82.342561012753 +6848 0.6848 43.6720857144709456 82.408271872269 +6849 0.6849 43.6638416036121697 82.473945303232 +6850 0.6850 43.6555909272819633 82.539581300902 +6851 0.6851 43.6473336892238919 82.605179860580 +6852 0.6852 43.6390698931819827 82.670740977621 +6853 0.6853 43.6307995429007320 82.736264647449 +6854 0.6854 43.6225226421250838 82.801750865516 +6855 0.6855 43.6142391946004437 82.867199627350 +6856 0.6856 43.6059492040726511 82.932610928499 +6857 0.6857 43.5976526742879997 82.997984764594 +6858 0.6858 43.5893496089932029 83.063321131287 +6859 0.6859 43.5810400119354213 83.128620024308 +6860 0.6860 43.5727238868622351 83.193881439403 +6861 0.6861 43.5644012375216434 83.259105372417 +6862 0.6862 43.5560720676620647 83.324291819195 +6863 0.6863 43.5477363810323226 83.389440775667 +6864 0.6864 43.5393941813816525 83.454552237791 +6865 0.6865 43.5310454724596809 83.519626201606 +6866 0.6866 43.5226902580164463 83.584662663157 +6867 0.6867 43.5143285418023567 83.649661618567 +6868 0.6868 43.5059603275682250 83.714623064010 +6869 0.6869 43.4975856190652408 83.779546995706 +6870 0.6870 43.4892044200449632 83.844433409913 +6871 0.6871 43.4808167342593208 83.909282302952 +6872 0.6872 43.4724225654606116 83.974093671200 +6873 0.6873 43.4640219174014959 84.038867511049 +6874 0.6874 43.4556147938349966 84.103603818988 +6875 0.6875 43.4472011985144704 84.168302591507 +6876 0.6876 43.4387811351936364 84.232963825191 +6877 0.6877 43.4303546076265476 84.297587516651 +6878 0.6878 43.4219216195675912 84.362173662537 +6879 0.6879 43.4134821747714881 84.426722259558 +6880 0.6880 43.4050362769932860 84.491233304487 +6881 0.6881 43.3965839299883527 84.555706794121 +6882 0.6882 43.3881251375123824 84.620142725319 +6883 0.6883 43.3796599033213681 84.684541094987 +6884 0.6884 43.3711882311716153 84.748901900083 +6885 0.6885 43.3627101248197278 84.813225137606 +6886 0.6886 43.3542255880226151 84.877510804590 +6887 0.6887 43.3457346245374779 84.941758898165 +6888 0.6888 43.3372372381217943 85.005969415455 +6889 0.6889 43.3287334325333404 85.070142353658 +6890 0.6890 43.3202232115301555 85.134277710019 +6891 0.6891 43.3117065788705631 85.198375481837 +6892 0.6892 43.3031835383131494 85.262435666438 +6893 0.6893 43.2946540936167636 85.326458261210 +6894 0.6894 43.2861182485405251 85.390443263591 +6895 0.6895 43.2775760068437947 85.454390671068 +6896 0.6896 43.2690273722861818 85.518300481160 +6897 0.6897 43.2604723486275518 85.582172691448 +6898 0.6898 43.2519109396280044 85.646007299549 +6899 0.6899 43.2433431490478668 85.709804303144 +6900 0.6900 43.2347689806477149 85.773563699946 +6901 0.6901 43.2261884381883306 85.837285487725 +6902 0.6902 43.2176015254307302 85.900969664287 +6903 0.6903 43.2090082461361433 85.964616227504 +6904 0.6904 43.2004086040660056 86.028225175263 +6905 0.6905 43.1918026029819657 86.091796505530 +6906 0.6906 43.1831902466458715 86.155330216302 +6907 0.6907 43.1745715388197766 86.218826305628 +6908 0.6908 43.1659464832659125 86.282284771599 +6909 0.6909 43.1573150837467168 86.345705612347 +6910 0.6910 43.1486773440247973 86.409088826064 +6911 0.6911 43.1400332678629468 86.472434410986 +6912 0.6912 43.1313828590241286 86.535742365390 +6913 0.6913 43.1227261212714765 86.599012687594 +6914 0.6914 43.1140630583682949 86.662245375979 +6915 0.6915 43.1053936740780514 86.725440428945 +6916 0.6916 43.0967179721643561 86.788597844978 +6917 0.6917 43.0880359563909821 86.851717622562 +6918 0.6918 43.0793476305218377 86.914799760268 +6919 0.6919 43.0706529983209876 86.977844256683 +6920 0.6920 43.0619520635526314 87.040851110473 +6921 0.6921 43.0532448299810895 87.103820320301 +6922 0.6922 43.0445313013708315 87.166751884926 +6923 0.6923 43.0358114814864265 87.229645803126 +6924 0.6924 43.0270853740925858 87.292502073714 +6925 0.6925 43.0183529829541200 87.355320695575 +6926 0.6926 43.0096143118359606 87.418101667626 +6927 0.6927 43.0008693645031386 87.480844988830 +6928 0.6928 42.9921181447207914 87.543550658176 +6929 0.6929 42.9833606562541419 87.606218674743 +6930 0.6930 42.9745969028685266 87.668849037618 +6931 0.6931 42.9658268883293459 87.731441745936 +6932 0.6932 42.9570506164021069 87.793996798901 +6933 0.6933 42.9482680908523733 87.856514195721 +6934 0.6934 42.9394793154458014 87.918993935688 +6935 0.6935 42.9306842939481115 87.981436018117 +6936 0.6936 42.9218830301250875 88.043840442366 +6937 0.6937 42.9130755277425777 88.106207207868 +6938 0.6938 42.9042617905664798 88.168536314048 +6939 0.6939 42.8954418223627556 88.230827760415 +6940 0.6940 42.8866156268974095 88.293081546511 +6941 0.6941 42.8777832079364885 88.355297671923 +6942 0.6942 42.8689445692460822 88.417476136272 +6943 0.6943 42.8600997145923088 88.479616939241 +6944 0.6944 42.8512486477413219 88.541720080540 +6945 0.6945 42.8423913724592964 88.603785559940 +6946 0.6946 42.8335278925124356 88.665813377227 +6947 0.6947 42.8246582116669643 88.727803532264 +6948 0.6948 42.8157823336891070 88.789756024932 +6949 0.6949 42.8069002623451027 88.851670855183 +6950 0.6950 42.7980120014011973 88.913548022971 +6951 0.6951 42.7891175546236298 88.975387528332 +6952 0.6952 42.7802169257786460 89.037189371330 +6953 0.6953 42.7713101186324778 89.098953552071 +6954 0.6954 42.7623971369513356 89.160680070709 +6955 0.6955 42.7534779845014299 89.222368927419 +6956 0.6956 42.7445526650489356 89.284020122462 +6957 0.6957 42.7356211823600063 89.345633656105 +6958 0.6958 42.7266835402007672 89.407209528669 +6959 0.6959 42.7177397423373080 89.468747740521 +6960 0.6960 42.7087897925356756 89.530248292062 +6961 0.6961 42.6998336945618817 89.591711183760 +6962 0.6962 42.6908714521818879 89.653136416085 +6963 0.6963 42.6819030691616064 89.714523989585 +6964 0.6964 42.6729285492668851 89.775873904823 +6965 0.6965 42.6639478962635224 89.837186162437 +6966 0.6966 42.6549611139172455 89.898460763082 +6967 0.6967 42.6459682059937180 89.959697707444 +6968 0.6968 42.6369691762585319 90.020896996290 +6969 0.6969 42.6279640284771943 90.082058630399 +6970 0.6970 42.6189527664151413 90.143182610599 +6971 0.6971 42.6099353938377234 90.204268937752 +6972 0.6972 42.6009119145101991 90.265317612787 +6973 0.6973 42.5918823321977271 90.326328636656 +6974 0.6974 42.5828466506653740 90.387302010343 +6975 0.6975 42.5738048736781138 90.448237734891 +6976 0.6976 42.5647570050007999 90.509135811375 +6977 0.6977 42.5557030483981862 90.569996240925 +6978 0.6978 42.5466430076349056 90.630819024693 +6979 0.6979 42.5375768864754775 90.691604163882 +6980 0.6980 42.5285046886842935 90.752351659733 +6981 0.6981 42.5194264180256312 90.813061513539 +6982 0.6982 42.5103420782636263 90.873733726623 +6983 0.6983 42.5012516731622796 90.934368300351 +6984 0.6984 42.4921552064854566 90.994965236119 +6985 0.6985 42.4830526819968810 91.055524535401 +6986 0.6986 42.4739441034601271 91.116046199654 +6987 0.6987 42.4648294746386199 91.176530230435 +6988 0.6988 42.4557087992956355 91.236976629296 +6989 0.6989 42.4465820811942791 91.297385397849 +6990 0.6990 42.4374493240974999 91.357756537759 +6991 0.6991 42.4283105317680764 91.418090050703 +6992 0.6992 42.4191657079686237 91.478385938412 +6993 0.6993 42.4100148564615722 91.538644202675 +6994 0.6994 42.4008579810091746 91.598864845279 +6995 0.6995 42.3916950853735059 91.659047868100 +6996 0.6996 42.3825261733164496 91.719193273008 +6997 0.6997 42.3733512485997039 91.779301061955 +6998 0.6998 42.3641703149847615 91.839371236896 +6999 0.6999 42.3549833762329229 91.899403799857 +7000 0.7000 42.3457904361052826 91.959398752883 +7001 0.7001 42.3365914983627363 92.019356098057 +7002 0.7002 42.3273865667659592 92.079275837520 +7003 0.7003 42.3181756450754136 92.139157973439 +7004 0.7004 42.3089587370513414 92.199002508024 +7005 0.7005 42.2997358464537641 92.258809443523 +7006 0.7006 42.2905069770424760 92.318578782226 +7007 0.7007 42.2812721325770440 92.378310526457 +7008 0.7008 42.2720313168167934 92.438004678588 +7009 0.7009 42.2627845335208150 92.497661241020 +7010 0.7010 42.2535317864479509 92.557280216198 +7011 0.7011 42.2442730793568089 92.616861606608 +7012 0.7012 42.2350084160057406 92.676405414772 +7013 0.7013 42.2257378001528423 92.735911643252 +7014 0.7014 42.2164612355559470 92.795380294647 +7015 0.7015 42.2071787259726321 92.854811371598 +7016 0.7016 42.1978902751602121 92.914204876780 +7017 0.7017 42.1885958868757243 92.973560812910 +7018 0.7018 42.1792955648759431 93.032879182746 +7019 0.7019 42.1699893129173518 93.092159989077 +7020 0.7020 42.1606771347561633 93.151403234736 +7021 0.7021 42.1513590341482995 93.210608922592 +7022 0.7022 42.1420350148493910 93.269777055555 +7023 0.7023 42.1327050806147838 93.328907636571 +7024 0.7024 42.1233692351995259 93.388000668623 +7025 0.7025 42.1140274823583596 93.447056154733 +7026 0.7026 42.1046798258457216 93.506074097962 +7027 0.7027 42.0953262694157502 93.565054501407 +7028 0.7028 42.0859668168222711 93.623997368206 +7029 0.7029 42.0766014718187833 93.682902701532 +7030 0.7030 42.0672302381584799 93.741770504597 +7031 0.7031 42.0578531195942205 93.800600780650 +7032 0.7032 42.0484701198785373 93.859393532976 +7033 0.7033 42.0390812427636433 93.918148764902 +7034 0.7034 42.0296864920014102 93.976866479787 +7035 0.7035 42.0202858713433685 94.035546681032 +7036 0.7036 42.0108793845407149 94.094189372071 +7037 0.7037 42.0014670353442909 94.152794556379 +7038 0.7038 41.9920488275045969 94.211362237468 +7039 0.7039 41.9826247647717778 94.269892418884 +7040 0.7040 41.9731948508956236 94.328385104212 +7041 0.7041 41.9637590896255617 94.386840297074 +7042 0.7042 41.9543174847106499 94.445258001129 +7043 0.7043 41.9448700398995911 94.503638220072 +7044 0.7044 41.9354167589407041 94.561980957636 +7045 0.7045 41.9259576455819456 94.620286217589 +7046 0.7046 41.9164927035708814 94.678554003737 +7047 0.7047 41.9070219366547008 94.736784319924 +7048 0.7048 41.8975453485802021 94.794977170031 +7049 0.7049 41.8880629430938001 94.853132557966 +7050 0.7050 41.8785747239415187 94.911250487685 +7051 0.7051 41.8690806948689769 94.969330963176 +7052 0.7052 41.8595808596213956 95.027373988462 +7053 0.7053 41.8500752219435910 95.085379567606 +7054 0.7054 41.8405637855799739 95.143347704702 +7055 0.7055 41.8310465542745433 95.201278403885 +7056 0.7056 41.8215235317708860 95.259171669322 +7057 0.7057 41.8119947218121624 95.317027505216 +7058 0.7058 41.8024601281411137 95.374845915812 +7059 0.7059 41.7929197545000548 95.432626905384 +7060 0.7060 41.7833736046308744 95.490370478243 +7061 0.7061 41.7738216822750275 95.548076638738 +7062 0.7062 41.7642639911735287 95.605745391253 +7063 0.7063 41.7547005350669522 95.663376740206 +7064 0.7064 41.7451313176954386 95.720970690051 +7065 0.7065 41.7355563427986738 95.778527245280 +7066 0.7066 41.7259756141158888 95.836046410415 +7067 0.7067 41.7163891353858673 95.893528190018 +7068 0.7068 41.7067969103469309 95.950972588688 +7069 0.7069 41.6971989427369465 96.008379611053 +7070 0.7070 41.6875952362933049 96.065749261779 +7071 0.7071 41.6779857947529351 96.123081545569 +7072 0.7072 41.6683706218522971 96.180376467159 +7073 0.7073 41.6587497213273750 96.237634031316 +7074 0.7074 41.6491230969136694 96.294854242853 +7075 0.7075 41.6394907523461981 96.352037106607 +7076 0.7076 41.6298526913594955 96.409182627452 +7077 0.7077 41.6202089176876058 96.466290810302 +7078 0.7078 41.6105594350640828 96.523361660099 +7079 0.7079 41.6009042472219832 96.580395181825 +7080 0.7080 41.5912433578938661 96.637391380493 +7081 0.7081 41.5815767708117860 96.694350261151 +7082 0.7082 41.5719044897072862 96.751271828882 +7083 0.7083 41.5622265183114052 96.808156088804 +7084 0.7084 41.5525428603546629 96.865003046067 +7085 0.7085 41.5428535195670676 96.921812705858 +7086 0.7086 41.5331584996781018 96.978585073397 +7087 0.7087 41.5234578044167364 97.035320153936 +7088 0.7088 41.5137514375114023 97.092017952767 +7089 0.7089 41.5040394026900046 97.148678475206 +7090 0.7090 41.4943217036799155 97.205301726613 +7091 0.7091 41.4845983442079671 97.261887712377 +7092 0.7092 41.4748693280004517 97.318436437920 +7093 0.7093 41.4651346587831213 97.374947908699 +7094 0.7094 41.4553943402811740 97.431422130207 +7095 0.7095 41.4456483762192676 97.487859107965 +7096 0.7096 41.4358967703214915 97.544258847534 +7097 0.7097 41.4261395263113883 97.600621354505 +7098 0.7098 41.4163766479119388 97.656946634500 +7099 0.7099 41.4066081388455558 97.713234693179 +7100 0.7100 41.3968340028340833 97.769485536235 +7101 0.7101 41.3870542435988042 97.825699169390 +7102 0.7102 41.3772688648604117 97.881875598402 +7103 0.7103 41.3674778703390373 97.938014829064 +7104 0.7104 41.3576812637542233 97.994116867198 +7105 0.7105 41.3478790488249288 98.050181718662 +7106 0.7106 41.3380712292695307 98.106209389346 +7107 0.7107 41.3282578088058017 98.162199885173 +7108 0.7108 41.3184387911509390 98.218153212097 +7109 0.7109 41.3086141800215287 98.274069376107 +7110 0.7110 41.2987839791335603 98.329948383225 +7111 0.7111 41.2889481922024260 98.385790239506 +7112 0.7112 41.2791068229429001 98.441594951033 +7113 0.7113 41.2692598750691531 98.497362523927 +7114 0.7114 41.2594073522947369 98.553092964339 +7115 0.7115 41.2495492583325998 98.608786278452 +7116 0.7116 41.2396855968950504 98.664442472483 +7117 0.7117 41.2298163716937935 98.720061552682 +7118 0.7118 41.2199415864398944 98.775643525327 +7119 0.7119 41.2100612448437928 98.831188396730 +7120 0.7120 41.2001753506152966 98.886696173239 +7121 0.7121 41.1902839074635736 98.942166861229 +7122 0.7122 41.1803869190971596 98.997600467108 +7123 0.7123 41.1704843892239367 99.052996997321 +7124 0.7124 41.1605763215511544 99.108356458336 +7125 0.7125 41.1506627197854016 99.163678856660 +7126 0.7126 41.1407435876326275 99.218964198830 +7127 0.7127 41.1308189287981136 99.274212491414 +7128 0.7128 41.1208887469864948 99.329423741011 +7129 0.7129 41.1109530459017307 99.384597954252 +7130 0.7130 41.1010118292471276 99.439735137801 +7131 0.7131 41.0910651007253165 99.494835298352 +7132 0.7132 41.0811128640382677 99.549898442631 +7133 0.7133 41.0711551228872693 99.604924577395 +7134 0.7134 41.0611918809729275 99.659913709433 +7135 0.7135 41.0512231419951803 99.714865845564 +7136 0.7136 41.0412489096532695 99.769780992639 +7137 0.7137 41.0312691876457620 99.824659157542 +7138 0.7138 41.0212839796705282 99.879500347184 +7139 0.7139 41.0112932894247422 99.934304568512 +7140 0.7140 41.0012971206048888 99.989071828499 +7141 0.7141 40.9912954769067568 100.043802134151 +7142 0.7142 40.9812883620254240 100.098495492507 +7143 0.7143 40.9712757796552651 100.153151910634 +7144 0.7144 40.9612577334899512 100.207771395629 +7145 0.7145 40.9512342272224359 100.262353954623 +7146 0.7146 40.9412052645449691 100.316899594776 +7147 0.7147 40.9311708491490691 100.371408323279 +7148 0.7148 40.9211309847255365 100.425880147352 +7149 0.7149 40.9110856749644540 100.480315074247 +7150 0.7150 40.9010349235551800 100.534713111248 +7151 0.7151 40.8909787341863336 100.589074265662 +7152 0.7152 40.8809171105458091 100.643398544837 +7153 0.7153 40.8708500563207622 100.697685956143 +7154 0.7154 40.8607775751976092 100.751936506983 +7155 0.7155 40.8506996708620207 100.806150204794 +7156 0.7156 40.8406163469989281 100.860327057035 +7157 0.7157 40.8305276072925167 100.914467071202 +7158 0.7158 40.8204334554262189 100.968570254817 +7159 0.7159 40.8103338950827066 101.022636615436 +7160 0.7160 40.8002289299439056 101.076666160638 +7161 0.7161 40.7901185636909744 101.130658898038 +7162 0.7162 40.7800028000043113 101.184614835278 +7163 0.7163 40.7698816425635471 101.238533980032 +7164 0.7164 40.7597550950475451 101.292416340002 +7165 0.7165 40.7496231611344015 101.346261922918 +7166 0.7166 40.7394858445014307 101.400070736543 +7167 0.7167 40.7293431488251727 101.453842788666 +7168 0.7168 40.7191950777813858 101.507578087109 +7169 0.7169 40.7090416350450468 101.561276639722 +7170 0.7170 40.6988828242903438 101.614938454382 +7171 0.7171 40.6887186491906760 101.668563538997 +7172 0.7172 40.6785491134186543 101.722151901506 +7173 0.7173 40.6683742206460863 101.775703549876 +7174 0.7174 40.6581939745439840 101.829218492100 +7175 0.7175 40.6480083787825706 101.882696736206 +7176 0.7176 40.6378174370312450 101.936138290244 +7177 0.7177 40.6276211529586178 101.989543162300 +7178 0.7178 40.6174195302324819 102.042911360483 +7179 0.7179 40.6072125725198134 102.096242892938 +7180 0.7180 40.5970002834867785 102.149537767829 +7181 0.7181 40.5867826667987188 102.202795993356 +7182 0.7182 40.5765597261201663 102.256017577746 +7183 0.7183 40.5663314651148141 102.309202529254 +7184 0.7184 40.5560978874455458 102.362350856166 +7185 0.7185 40.5458589967743990 102.415462566790 +7186 0.7186 40.5356147967625873 102.468537669471 +7187 0.7187 40.5253652910704858 102.521576172576 +7188 0.7188 40.5151104833576312 102.574578084505 +7189 0.7189 40.5048503772827218 102.627543413683 +7190 0.7190 40.4945849765036101 102.680472168563 +7191 0.7191 40.4843142846773034 102.733364357629 +7192 0.7192 40.4740383054599491 102.786219989390 +7193 0.7193 40.4637570425068631 102.839039072388 +7194 0.7194 40.4534704994724876 102.891821615185 +7195 0.7195 40.4431786800104121 102.944567626381 +7196 0.7196 40.4328815877733660 102.997277114597 +7197 0.7197 40.4225792264132124 103.049950088483 +7198 0.7198 40.4122715995809543 103.102586556718 +7199 0.7199 40.4019587109267206 103.155186528011 +7200 0.7200 40.3916405640997667 103.207750011092 +7201 0.7201 40.3813171627484735 103.260277014725 +7202 0.7202 40.3709885105203554 103.312767547699 +7203 0.7203 40.3606546110620314 103.365221618830 +7204 0.7204 40.3503154680192395 103.417639236965 +7205 0.7205 40.3399710850368436 103.470020410975 +7206 0.7206 40.3296214657588052 103.522365149761 +7207 0.7207 40.3192666138282050 103.574673462247 +7208 0.7208 40.3089065328872209 103.626945357392 +7209 0.7209 40.2985412265771430 103.679180844173 +7210 0.7210 40.2881706985383516 103.731379931602 +7211 0.7211 40.2777949524103391 103.783542628713 +7212 0.7212 40.2674139918316740 103.835668944570 +7213 0.7213 40.2570278204400296 103.887758888265 +7214 0.7214 40.2466364418721696 103.939812468912 +7215 0.7215 40.2362398597639412 103.991829695660 +7216 0.7216 40.2258380777502751 104.043810577674 +7217 0.7217 40.2154310994651851 104.095755124157 +7218 0.7218 40.2050189285417616 104.147663344334 +7219 0.7219 40.1946015686121711 104.199535247456 +7220 0.7220 40.1841790233076566 104.251370842800 +7221 0.7221 40.1737512962585299 104.303170139673 +7222 0.7222 40.1633183910941725 104.354933147407 +7223 0.7223 40.1528803114430346 104.406659875358 +7224 0.7224 40.1424370609326218 104.458350332914 +7225 0.7225 40.1319886431895014 104.510004529486 +7226 0.7226 40.1215350618393032 104.561622474512 +7227 0.7227 40.1110763205067045 104.613204177454 +7228 0.7228 40.1006124228154448 104.664749647807 +7229 0.7229 40.0901433723882974 104.716258895085 +7230 0.7230 40.0796691728471046 104.767731928831 +7231 0.7231 40.0691898278127354 104.819168758615 +7232 0.7232 40.0587053409050995 104.870569394034 +7233 0.7233 40.0482157157431615 104.921933844708 +7234 0.7234 40.0377209559449128 104.973262120284 +7235 0.7235 40.0272210651273781 105.024554230439 +7236 0.7236 40.0167160469066161 105.075810184869 +7237 0.7237 40.0062059048977048 105.127029993304 +7238 0.7238 39.9956906427147629 105.178213665491 +7239 0.7239 39.9851702639709288 105.229361211210 +7240 0.7240 39.9746447722783529 105.280472640264 +7241 0.7241 39.9641141712482124 105.331547962481 +7242 0.7242 39.9535784644907039 105.382587187715 +7243 0.7243 39.9430376556150293 105.433590325846 +7244 0.7244 39.9324917482293955 105.484557386779 +7245 0.7245 39.9219407459410363 105.535488380446 +7246 0.7246 39.9113846523561762 105.586383316805 +7247 0.7247 39.9008234710800451 105.637242205837 +7248 0.7248 39.8902572057168783 105.688065057548 +7249 0.7249 39.8796858598699018 105.738851881973 +7250 0.7250 39.8691094371413470 105.789602689167 +7251 0.7251 39.8585279411324294 105.840317489217 +7252 0.7252 39.8479413754433551 105.890996292229 +7253 0.7253 39.8373497436733288 105.941639108336 +7254 0.7254 39.8267530494205246 105.992245947697 +7255 0.7255 39.8161512962821149 106.042816820496 +7256 0.7256 39.8055444878542417 106.093351736943 +7257 0.7257 39.7949326277320310 106.143850707271 +7258 0.7258 39.7843157195095785 106.194313741737 +7259 0.7259 39.7736937667799637 106.244740850625 +7260 0.7260 39.7630667731352219 106.295132044244 +7261 0.7261 39.7524347421663649 106.345487332926 +7262 0.7262 39.7417976774633672 106.395806727029 +7263 0.7263 39.7311555826151661 106.446090236936 +7264 0.7264 39.7205084612096684 106.496337873052 +7265 0.7265 39.7098563168337222 106.546549645811 +7266 0.7266 39.6991991530731454 106.596725565668 +7267 0.7267 39.6885369735127043 106.646865643102 +7268 0.7268 39.6778697817361206 106.696969888619 +7269 0.7269 39.6671975813260502 106.747038312749 +7270 0.7270 39.6565203758641118 106.797070926046 +7271 0.7271 39.6458381689308581 106.847067739088 +7272 0.7272 39.6351509641057831 106.897028762474 +7273 0.7273 39.6244587649673150 106.946954006833 +7274 0.7274 39.6137615750928305 106.996843482814 +7275 0.7275 39.6030593980586332 107.046697201095 +7276 0.7276 39.5923522374399610 107.096515172372 +7277 0.7277 39.5816400968109718 107.146297407369 +7278 0.7278 39.5709229797447648 107.196043916831 +7279 0.7279 39.5602008898133448 107.245754711531 +7280 0.7280 39.5494738305876581 107.295429802262 +7281 0.7281 39.5387418056375495 107.345069199842 +7282 0.7282 39.5280048185318051 107.394672915115 +7283 0.7283 39.5172628728381028 107.444240958945 +7284 0.7284 39.5065159721230472 107.493773342222 +7285 0.7285 39.4957641199521419 107.543270075859 +7286 0.7286 39.4850073198898102 107.592731170795 +7287 0.7287 39.4742455754993742 107.642156637988 +7288 0.7288 39.4634788903430547 107.691546488422 +7289 0.7289 39.4527072679819781 107.740900733105 +7290 0.7290 39.4419307119761697 107.790219383071 +7291 0.7291 39.4311492258845462 107.839502449370 +7292 0.7292 39.4203628132649229 107.888749943079 +7293 0.7293 39.4095714776740067 107.937961875304 +7294 0.7294 39.3987752226673820 107.987138257164 +7295 0.7295 39.3879740517995316 108.036279099808 +7296 0.7296 39.3771679686238230 108.085384414407 +7297 0.7297 39.3663569766924937 108.134454212155 +7298 0.7298 39.3555410795566729 108.183488504267 +7299 0.7299 39.3447202807663601 108.232487301986 +7300 0.7300 39.3338945838704319 108.281450616571 +7301 0.7301 39.3230639924166354 108.330378459310 +7302 0.7302 39.3122285099515949 108.379270841508 +7303 0.7303 39.3013881400207978 108.428127774501 +7304 0.7304 39.2905428861685877 108.476949269640 +7305 0.7305 39.2796927519381924 108.525735338306 +7306 0.7306 39.2688377408716818 108.574485991894 +7307 0.7307 39.2579778565099957 108.623201241828 +7308 0.7308 39.2471131023929232 108.671881099553 +7309 0.7309 39.2362434820591162 108.720525576539 +7310 0.7310 39.2253689990460757 108.769134684273 +7311 0.7311 39.2144896568901515 108.817708434268 +7312 0.7312 39.2036054591265355 108.866246838059 +7313 0.7313 39.1927164092892752 108.914749907205 +7314 0.7314 39.1818225109112532 108.963217653284 +7315 0.7315 39.1709237675241937 109.011650087900 +7316 0.7316 39.1600201826586627 109.060047222677 +7317 0.7317 39.1491117598440681 109.108409069262 +7318 0.7318 39.1381985026086383 109.156735639322 +7319 0.7319 39.1272804144794435 109.205026944550 +7320 0.7320 39.1163574989823815 109.253282996661 +7321 0.7321 39.1054297596421776 109.301503807386 +7322 0.7322 39.0944971999823849 109.349689388484 +7323 0.7323 39.0835598235253769 109.397839751735 +7324 0.7324 39.0726176337923405 109.445954908942 +7325 0.7325 39.0616706343032973 109.494034871923 +7326 0.7326 39.0507188285770752 109.542079652527 +7327 0.7327 39.0397622201313155 109.590089262620 +7328 0.7328 39.0288008124824799 109.638063714091 +7329 0.7329 39.0178346091458295 109.686003018849 +7330 0.7330 39.0068636136354456 109.733907188827 +7331 0.7331 38.9958878294642020 109.781776235978 +7332 0.7332 38.9849072601437925 109.829610172277 +7333 0.7333 38.9739219091846891 109.877409009723 +7334 0.7334 38.9629317800961843 109.925172760334 +7335 0.7335 38.9519368763863625 109.972901436147 +7336 0.7336 38.9409372015620932 110.020595049226 +7337 0.7337 38.9299327591290520 110.068253611652 +7338 0.7338 38.9189235525916928 110.115877135530 +7339 0.7339 38.9079095854532682 110.163465632986 +7340 0.7340 38.8968908612158089 110.211019116164 +7341 0.7341 38.8858673833801376 110.258537597234 +7342 0.7342 38.8748391554458550 110.306021088385 +7343 0.7343 38.8638061809113466 110.353469601824 +7344 0.7344 38.8527684632737689 110.400883149788 +7345 0.7345 38.8417260060290559 110.448261744525 +7346 0.7346 38.8306788126719127 110.495605398310 +7347 0.7347 38.8196268866958221 110.542914123436 +7348 0.7348 38.8085702315930376 110.590187932220 +7349 0.7349 38.7975088508545767 110.637426836998 +7350 0.7350 38.7864427479702201 110.684630850127 +7351 0.7351 38.7753719264285124 110.731799983983 +7352 0.7352 38.7642963897167618 110.778934250966 +7353 0.7353 38.7532161413210403 110.826033663495 +7354 0.7354 38.7421311847261620 110.873098234009 +7355 0.7355 38.7310415234157119 110.920127974971 +7356 0.7356 38.7199471608720174 110.967122898862 +7357 0.7357 38.7088481005761622 111.014083018182 +7358 0.7358 38.6977443460079797 111.061008345457 +7359 0.7359 38.6866359006460456 111.107898893225 +7360 0.7360 38.6755227679676850 111.154754674055 +7361 0.7361 38.6644049514489581 111.201575700525 +7362 0.7362 38.6532824545646676 111.248361985243 +7363 0.7363 38.6421552807883657 111.295113540832 +7364 0.7364 38.6310234335923255 111.341830379937 +7365 0.7365 38.6198869164475695 111.388512515223 +7366 0.7366 38.6087457328238415 111.435159959376 +7367 0.7367 38.5975998861896201 111.481772725101 +7368 0.7368 38.5864493800121053 111.528350825124 +7369 0.7369 38.5752942177572393 111.574894272189 +7370 0.7370 38.5641344028896782 111.621403079063 +7371 0.7371 38.5529699388727991 111.667877258531 +7372 0.7372 38.5418008291687002 111.714316823399 +7373 0.7373 38.5306270772382078 111.760721786494 +7374 0.7374 38.5194486865408479 111.807092160659 +7375 0.7375 38.5082656605348745 111.853427958762 +7376 0.7376 38.4970780026772488 111.899729193686 +7377 0.7377 38.4858857164236454 111.945995878336 +7378 0.7378 38.4746888052284461 111.992228025640 +7379 0.7379 38.4634872725447394 112.038425648537 +7380 0.7380 38.4522811218243135 112.084588759994 +7381 0.7381 38.4410703565176632 112.130717372996 +7382 0.7382 38.4298549800739835 112.176811500544 +7383 0.7383 38.4186349959411757 112.222871155660 +7384 0.7384 38.4074104075658198 112.268896351390 +7385 0.7385 38.3961812183932096 112.314887100792 +7386 0.7386 38.3849474318673245 112.360843416950 +7387 0.7387 38.3737090514308292 112.406765312962 +7388 0.7388 38.3624660805250812 112.452652801950 +7389 0.7389 38.3512185225901305 112.498505897052 +7390 0.7390 38.3399663810647056 112.544324611427 +7391 0.7391 38.3287096593862202 112.590108958252 +7392 0.7392 38.3174483609907739 112.635858950727 +7393 0.7393 38.3061824893131373 112.681574602062 +7394 0.7394 38.2949120477867595 112.727255925497 +7395 0.7395 38.2836370398437680 112.772902934285 +7396 0.7396 38.2723574689149686 112.818515641698 +7397 0.7397 38.2610733384298314 112.864094061032 +7398 0.7398 38.2497846518164977 112.909638205594 +7399 0.7399 38.2384914125017801 112.955148088717 +7400 0.7400 38.2271936239111554 113.000623723749 +7401 0.7401 38.2158912894687646 113.046065124056 +7402 0.7402 38.2045844125974128 113.091472303030 +7403 0.7403 38.1932729967185551 113.136845274070 +7404 0.7404 38.1819570452523180 113.182184050606 +7405 0.7405 38.1706365616174850 113.227488646077 +7406 0.7406 38.1593115492314823 113.272759073946 +7407 0.7407 38.1479820115104005 113.317995347695 +7408 0.7408 38.1366479518689729 113.363197480821 +7409 0.7409 38.1253093737205901 113.408365486840 +7410 0.7410 38.1139662804772854 113.453499379290 +7411 0.7411 38.1026186755497349 113.498599171724 +7412 0.7412 38.0912665623472648 113.543664877715 +7413 0.7413 38.0799099442778370 113.588696510857 +7414 0.7414 38.0685488247480563 113.633694084755 +7415 0.7415 38.0571832071631633 113.678657613041 +7416 0.7416 38.0458130949270412 113.723587109358 +7417 0.7417 38.0344384914422022 113.768482587372 +7418 0.7418 38.0230594001097941 113.813344060767 +7419 0.7419 38.0116758243295934 113.858171543240 +7420 0.7420 38.0002877675000050 113.902965048513 +7421 0.7421 37.9888952330180629 113.947724590323 +7422 0.7422 37.9774982242794223 113.992450182425 +7423 0.7423 37.9660967446783744 114.037141838589 +7424 0.7424 37.9546907976078174 114.081799572610 +7425 0.7425 37.9432803864592714 114.126423398295 +7426 0.7426 37.9318655146228849 114.171013329474 +7427 0.7427 37.9204461854874140 114.215569379988 +7428 0.7428 37.9090224024402289 114.260091563702 +7429 0.7429 37.8975941688673217 114.304579894495 +7430 0.7430 37.8861614881532844 114.349034386267 +7431 0.7431 37.8747243636813238 114.393455052936 +7432 0.7432 37.8632827988332537 114.437841908431 +7433 0.7433 37.8518367969894953 114.482194966705 +7434 0.7434 37.8403863615290703 114.526514241730 +7435 0.7435 37.8289314958296075 114.570799747490 +7436 0.7436 37.8174722032673358 114.615051497990 +7437 0.7437 37.8060084872170705 114.659269507252 +7438 0.7438 37.7945403510522411 114.703453789315 +7439 0.7439 37.7830677981448630 114.747604358235 +7440 0.7440 37.7715908318655451 114.791721228087 +7441 0.7441 37.7601094555834962 114.835804412962 +7442 0.7442 37.7486236726664970 114.879853926971 +7443 0.7443 37.7371334864809356 114.923869784237 +7444 0.7444 37.7256389003917789 114.967851998905 +7445 0.7445 37.7141399177625800 115.011800585138 +7446 0.7446 37.7026365419554708 115.055715557108 +7447 0.7447 37.6911287763311620 115.099596929016 +7448 0.7448 37.6796166242489576 115.143444715071 +7449 0.7449 37.6681000890667264 115.187258929503 +7450 0.7450 37.6565791741409228 115.231039586560 +7451 0.7451 37.6450538828265664 115.274786700503 +7452 0.7452 37.6335242184772625 115.318500285611 +7453 0.7453 37.6219901844451741 115.362180356186 +7454 0.7454 37.6104517840810360 115.405826926540 +7455 0.7455 37.5989090207341619 115.449440011004 +7456 0.7456 37.5873618977524160 115.493019623926 +7457 0.7457 37.5758104184822344 115.536565779671 +7458 0.7458 37.5642545862686177 115.580078492620 +7459 0.7459 37.5526944044551314 115.623557777172 +7460 0.7460 37.5411298763838843 115.667003647743 +7461 0.7461 37.5295610053955571 115.710416118764 +7462 0.7462 37.5179877948293878 115.753795204682 +7463 0.7463 37.5064102480231583 115.797140919963 +7464 0.7464 37.4948283683132075 115.840453279090 +7465 0.7465 37.4832421590344254 115.883732296560 +7466 0.7466 37.4716516235202519 115.926977986886 +7467 0.7467 37.4600567651026779 115.970190364602 +7468 0.7468 37.4484575871122374 116.013369444255 +7469 0.7469 37.4368540928780078 116.056515240407 +7470 0.7470 37.4252462857276029 116.099627767640 +7471 0.7471 37.4136341689871941 116.142707040553 +7472 0.7472 37.4020177459814818 116.185753073753 +7473 0.7473 37.3903970200337028 116.228765881873 +7474 0.7474 37.3787719944656303 116.271745479558 +7475 0.7475 37.3671426725975806 116.314691881472 +7476 0.7476 37.3555090577483924 116.357605102290 +7477 0.7477 37.3438711532354404 116.400485156705 +7478 0.7478 37.3322289623746357 116.443332059430 +7479 0.7479 37.3205824884804045 116.486145825190 +7480 0.7480 37.3089317348657090 116.528926468727 +7481 0.7481 37.2972767048420337 116.571674004799 +7482 0.7482 37.2856174017193851 116.614388448181 +7483 0.7483 37.2739538288062917 116.657069813662 +7484 0.7484 37.2622859894098042 116.699718116050 +7485 0.7485 37.2506138868354952 116.742333370165 +7486 0.7486 37.2389375243874454 116.784915590846 +7487 0.7487 37.2272569053682574 116.827464792945 +7488 0.7488 37.2155720330790416 116.869980991333 +7489 0.7489 37.2038829108194307 116.912464200894 +7490 0.7490 37.1921895418875579 116.954914436528 +7491 0.7491 37.1804919295800715 116.997331713153 +7492 0.7492 37.1687900771921278 117.039716045700 +7493 0.7493 37.1570839880173835 117.082067449117 +7494 0.7494 37.1453736653480107 117.124385938368 +7495 0.7495 37.1336591124746676 117.166671528430 +7496 0.7496 37.1219403326865347 117.208924234298 +7497 0.7497 37.1102173292712720 117.251144070983 +7498 0.7498 37.0984901055150473 117.293331053507 +7499 0.7499 37.0867586647025291 117.335485196914 +7500 0.7500 37.0750230101168725 117.377606516259 +7501 0.7501 37.0632831450397262 117.419695026613 +7502 0.7502 37.0515390727512397 117.461750743062 +7503 0.7503 37.0397907965300490 117.503773680708 +7504 0.7504 37.0280383196532767 117.545763854669 +7505 0.7505 37.0162816453965391 117.587721280075 +7506 0.7506 37.0045207770339317 117.629645972077 +7507 0.7507 36.9927557178380368 117.671537945835 +7508 0.7508 36.9809864710799161 117.713397216528 +7509 0.7509 36.9692130400291248 117.755223799348 +7510 0.7510 36.9574354279536834 117.797017709504 +7511 0.7511 36.9456536381200991 117.838778962219 +7512 0.7512 36.9338676737933511 117.880507572730 +7513 0.7513 36.9220775382368984 117.922203556289 +7514 0.7514 36.9102832347126721 117.963866928166 +7515 0.7515 36.8984847664810829 118.005497703643 +7516 0.7516 36.8866821368009994 118.047095898017 +7517 0.7517 36.8748753489297698 118.088661526601 +7518 0.7518 36.8630644061232005 118.130194604722 +7519 0.7519 36.8512493116355770 118.171695147721 +7520 0.7520 36.8394300687196434 118.213163170956 +7521 0.7521 36.8276066806266087 118.254598689797 +7522 0.7522 36.8157791506061400 118.296001719631 +7523 0.7523 36.8039474819063628 118.337372275860 +7524 0.7524 36.7921116777738746 118.378710373897 +7525 0.7525 36.7802717414537241 118.420016029173 +7526 0.7526 36.7684276761894111 118.461289257133 +7527 0.7527 36.7565794852228933 118.502530073234 +7528 0.7528 36.7447271717945867 118.543738492953 +7529 0.7529 36.7328707391433511 118.584914531773 +7530 0.7530 36.7210101905065045 118.626058205199 +7531 0.7531 36.7091455291198088 118.667169528749 +7532 0.7532 36.6972767582174768 118.708248517953 +7533 0.7533 36.6854038810321583 118.749295188355 +7534 0.7534 36.6735269007949682 118.790309555516 +7535 0.7535 36.6616458207354441 118.831291635010 +7536 0.7536 36.6497606440815744 118.872241442426 +7537 0.7537 36.6378713740597846 118.913158993363 +7538 0.7538 36.6259780138949438 118.954044303442 +7539 0.7539 36.6140805668103582 118.994897388290 +7540 0.7540 36.6021790360277635 119.035718263555 +7541 0.7541 36.5902734247673393 119.076506944893 +7542 0.7542 36.5783637362476952 119.117263447981 +7543 0.7543 36.5664499736858701 119.157987788503 +7544 0.7544 36.5545321402973400 119.198679982158 +7545 0.7545 36.5426102392959962 119.239340044665 +7546 0.7546 36.5306842738941739 119.279967991753 +7547 0.7547 36.5187542473026312 119.320563839160 +7548 0.7548 36.5068201627305413 119.361127602648 +7549 0.7549 36.4948820233855074 119.401659297985 +7550 0.7550 36.4829398324735621 119.442158940955 +7551 0.7551 36.4709935931991467 119.482626547357 +7552 0.7552 36.4590433087651320 119.523062133003 +7553 0.7553 36.4470889823727973 119.563465713719 +7554 0.7554 36.4351306172218443 119.603837305342 +7555 0.7555 36.4231682165103905 119.644176923728 +7556 0.7556 36.4112017834349686 119.684484584741 +7557 0.7557 36.3992313211905199 119.724760304263 +7558 0.7558 36.3872568329703938 119.765004098187 +7559 0.7559 36.3752783219663627 119.805215982420 +7560 0.7560 36.3632957913685999 119.845395972882 +7561 0.7561 36.3513092443656802 119.885544085509 +7562 0.7562 36.3393186841445939 119.925660336249 +7563 0.7563 36.3273241138907252 119.965744741061 +7564 0.7564 36.3153255367878742 120.005797315923 +7565 0.7565 36.3033229560182349 120.045818076819 +7566 0.7566 36.2913163747624097 120.085807039754 +7567 0.7567 36.2793057961993881 120.125764220739 +7568 0.7568 36.2672912235065610 120.165689635803 +7569 0.7569 36.2552726598597204 120.205583300990 +7570 0.7570 36.2432501084330525 120.245445232350 +7571 0.7571 36.2312235723991378 120.285275445953 +7572 0.7572 36.2191930549289438 120.325073957881 +7573 0.7573 36.2071585591918392 120.364840784224 +7574 0.7574 36.1951200883555728 120.404575941091 +7575 0.7575 36.1830776455862875 120.444279444603 +7576 0.7576 36.1710312340485132 120.483951310892 +7577 0.7577 36.1589808569051669 120.523591556103 +7578 0.7578 36.1469265173175387 120.563200196397 +7579 0.7579 36.1348682184453196 120.602777247944 +7580 0.7580 36.1228059634465737 120.642322726930 +7581 0.7581 36.1107397554777521 120.681836649555 +7582 0.7582 36.0986695976936716 120.721319032028 +7583 0.7583 36.0865954932475432 120.760769890570 +7584 0.7584 36.0745174452909438 120.800189241421 +7585 0.7585 36.0624354569738301 120.839577100828 +7586 0.7586 36.0503495314445388 120.878933485054 +7587 0.7587 36.0382596718497652 120.918258410374 +7588 0.7588 36.0261658813345917 120.957551893074 +7589 0.7589 36.0140681630424666 120.996813949454 +7590 0.7590 36.0019665201152037 121.036044595829 +7591 0.7591 35.9898609556929827 121.075243848523 +7592 0.7592 35.9777514729143633 121.114411723873 +7593 0.7593 35.9656380749162565 121.153548238230 +7594 0.7594 35.9535207648339465 121.192653407958 +7595 0.7595 35.9413995458010760 121.231727249432 +7596 0.7596 35.9292744209496533 121.270769779039 +7597 0.7597 35.9171453934100455 121.309781013180 +7598 0.7598 35.9050124663109713 121.348760968269 +7599 0.7599 35.8928756427795221 121.387709660729 +7600 0.7600 35.8807349259411339 121.426627107000 +7601 0.7601 35.8685903189196083 121.465513323532 +7602 0.7602 35.8564418248370913 121.504368326784 +7603 0.7603 35.8442894468140878 121.543192133233 +7604 0.7604 35.8321331879694611 121.581984759366 +7605 0.7605 35.8199730514204120 121.620746221682 +7606 0.7606 35.8078090402824927 121.659476536691 +7607 0.7607 35.7956411576696141 121.698175720917 +7608 0.7608 35.7834694066940244 121.736843790896 +7609 0.7609 35.7712937904663235 121.775480763175 +7610 0.7610 35.7591143120954484 121.814086654317 +7611 0.7611 35.7469309746886879 121.852661480890 +7612 0.7612 35.7347437813516677 121.891205259479 +7613 0.7613 35.7225527351883585 121.929718006678 +7614 0.7614 35.7103578393010679 121.968199739098 +7615 0.7615 35.6981590967904481 122.006650473358 +7616 0.7616 35.6859565107554744 122.045070226089 +7617 0.7617 35.6737500842934736 122.083459013934 +7618 0.7618 35.6615398205001028 122.121816853551 +7619 0.7619 35.6493257224693423 122.160143761604 +7620 0.7620 35.6371077932935236 122.198439754777 +7621 0.7621 35.6248860360632946 122.236704849756 +7622 0.7622 35.6126604538676474 122.274939063247 +7623 0.7623 35.6004310497938903 122.313142411962 +7624 0.7624 35.5881978269276615 122.351314912630 +7625 0.7625 35.5759607883529299 122.389456581987 +7626 0.7626 35.5637199371519941 122.427567436783 +7627 0.7627 35.5514752764054691 122.465647493779 +7628 0.7628 35.5392268091922929 122.503696769748 +7629 0.7629 35.5269745385897338 122.541715281474 +7630 0.7630 35.5147184676733758 122.579703045754 +7631 0.7631 35.5024585995171194 122.617660079395 +7632 0.7632 35.4901949371931877 122.655586399215 +7633 0.7633 35.4779274837721275 122.693482022045 +7634 0.7634 35.4656562423227868 122.731346964728 +7635 0.7635 35.4533812159123443 122.769181244115 +7636 0.7636 35.4411024076062873 122.806984877073 +7637 0.7637 35.4288198204684122 122.844757880478 +7638 0.7638 35.4165334575608242 122.882500271215 +7639 0.7639 35.4042433219439516 122.920212066185 +7640 0.7640 35.3919494166765247 122.957893282296 +7641 0.7641 35.3796517448155896 122.995543936473 +7642 0.7642 35.3673503094164872 123.033164045643 +7643 0.7643 35.3550451135328672 123.070753626755 +7644 0.7644 35.3427361602166883 123.108312696761 +7645 0.7645 35.3304234525182181 123.145841272627 +7646 0.7646 35.3181069934860190 123.183339371332 +7647 0.7647 35.3057867861669621 123.220807009863 +7648 0.7648 35.2934628336062062 123.258244205218 +7649 0.7649 35.2811351388472261 123.295650974412 +7650 0.7650 35.2688037049317842 123.333027334462 +7651 0.7651 35.2564685348999376 123.370373302402 +7652 0.7652 35.2441296317900523 123.407688895277 +7653 0.7653 35.2317869986387819 123.444974130139 +7654 0.7654 35.2194406384810748 123.482229024055 +7655 0.7655 35.2070905543501667 123.519453594099 +7656 0.7656 35.1947367492775953 123.556647857360 +7657 0.7657 35.1823792262931789 123.593811830937 +7658 0.7658 35.1700179884250375 123.630945531936 +7659 0.7659 35.1576530386995643 123.668048977480 +7660 0.7660 35.1452843801414545 123.705122184697 +7661 0.7661 35.1329120157736838 123.742165170729 +7662 0.7662 35.1205359486175084 123.779177952727 +7663 0.7663 35.1081561816924790 123.816160547855 +7664 0.7664 35.0957727180164198 123.853112973284 +7665 0.7665 35.0833855606054428 123.890035246201 +7666 0.7666 35.0709947124739401 123.926927383798 +7667 0.7667 35.0586001766345845 123.963789403281 +7668 0.7668 35.0462019560983293 124.000621321867 +7669 0.7669 35.0338000538743941 124.037423156781 +7670 0.7670 35.0213944729702931 124.074194925258 +7671 0.7671 35.0089852163917996 124.110936644547 +7672 0.7672 34.9965722871429747 124.147648331908 +7673 0.7673 34.9841556882261457 124.184330004606 +7674 0.7674 34.9717354226419204 124.220981679921 +7675 0.7675 34.9593114933891655 124.257603375140 +7676 0.7676 34.9468839034650287 124.294195107566 +7677 0.7677 34.9344526558649235 124.330756894506 +7678 0.7678 34.9220177535825371 124.367288753283 +7679 0.7679 34.9095791996098086 124.403790701224 +7680 0.7680 34.8971369969369647 124.440262755671 +7681 0.7681 34.8846911485524842 124.476704933975 +7682 0.7682 34.8722416574431122 124.513117253499 +7683 0.7683 34.8597885265938601 124.549499731612 +7684 0.7684 34.8473317589879912 124.585852385695 +7685 0.7685 34.8348713576070494 124.622175233142 +7686 0.7686 34.8224073254308237 124.658468291353 +7687 0.7687 34.8099396654373692 124.694731577740 +7688 0.7688 34.7974683806029930 124.730965109728 +7689 0.7689 34.7849934739022686 124.767168904745 +7690 0.7690 34.7725149483080216 124.803342980237 +7691 0.7691 34.7600328067913296 124.839487353652 +7692 0.7692 34.7475470523215222 124.875602042456 +7693 0.7693 34.7350576878661954 124.911687064120 +7694 0.7694 34.7225647163911830 124.947742436125 +7695 0.7695 34.7100681408605780 124.983768175963 +7696 0.7696 34.6975679642367254 125.019764301136 +7697 0.7697 34.6850641894802081 125.055730829156 +7698 0.7698 34.6725568195498752 125.091667777545 +7699 0.7699 34.6600458574028067 125.127575163834 +7700 0.7700 34.6475313059943346 125.163453005565 +7701 0.7701 34.6350131682780429 125.199301320286 +7702 0.7702 34.6224914472057534 125.235120125562 +7703 0.7703 34.6099661457275261 125.270909438962 +7704 0.7704 34.5974372667916725 125.306669278064 +7705 0.7705 34.5849048133447496 125.342399660460 +7706 0.7706 34.5723687883315378 125.378100603747 +7707 0.7707 34.5598291946950766 125.413772125537 +7708 0.7708 34.5472860353766293 125.449414243449 +7709 0.7709 34.5347393133157041 125.485026975109 +7710 0.7710 34.5221890314500399 125.520610338155 +7711 0.7711 34.5096351927156206 125.556164350236 +7712 0.7712 34.4970778000466609 125.591689029009 +7713 0.7713 34.4845168563756062 125.627184392138 +7714 0.7714 34.4719523646331325 125.662650457301 +7715 0.7715 34.4593843277481611 125.698087242183 +7716 0.7716 34.4468127486478295 125.733494764477 +7717 0.7717 34.4342376302575133 125.768873041890 +7718 0.7718 34.4216589755008116 125.804222092135 +7719 0.7719 34.4090767872995613 125.839541932933 +7720 0.7720 34.3964910685738161 125.874832582018 +7721 0.7721 34.3839018222418602 125.910094057131 +7722 0.7722 34.3713090512202015 125.945326376022 +7723 0.7723 34.3587127584235787 125.980529556453 +7724 0.7724 34.3461129467649471 126.015703616190 +7725 0.7725 34.3335096191554854 126.050848573015 +7726 0.7726 34.3209027785045961 126.085964444714 +7727 0.7727 34.3082924277199055 126.121051249082 +7728 0.7728 34.2956785697072561 126.156109003930 +7729 0.7729 34.2830612073707073 126.191137727069 +7730 0.7730 34.2704403436125347 126.226137436325 +7731 0.7731 34.2578159813332448 126.261108149532 +7732 0.7732 34.2451881234315394 126.296049884530 +7733 0.7733 34.2325567728043509 126.330962659173 +7734 0.7734 34.2199219323468284 126.365846491319 +7735 0.7735 34.2072836049523232 126.400701398840 +7736 0.7736 34.1946417935124032 126.435527399612 +7737 0.7737 34.1819965009168456 126.470324511524 +7738 0.7738 34.1693477300536443 126.505092752471 +7739 0.7739 34.1566954838090027 126.539832140360 +7740 0.7740 34.1440397650673262 126.574542693103 +7741 0.7741 34.1313805767112370 126.609224428626 +7742 0.7742 34.1187179216215597 126.643877364856 +7743 0.7743 34.1060518026773281 126.678501519737 +7744 0.7744 34.0933822227557783 126.713096911218 +7745 0.7745 34.0807091847323562 126.747663557256 +7746 0.7746 34.0680326914807026 126.782201475821 +7747 0.7747 34.0553527458726677 126.816710684883 +7748 0.7748 34.0426693507783042 126.851191202431 +7749 0.7749 34.0299825090658601 126.885643046456 +7750 0.7750 34.0172922236017925 126.920066234960 +7751 0.7751 34.0045984972507469 126.954460785955 +7752 0.7752 33.9919013328755781 126.988826717457 +7753 0.7753 33.9792007333373292 127.023164047493 +7754 0.7754 33.9664967014952524 127.057472794103 +7755 0.7755 33.9537892402067811 127.091752975329 +7756 0.7756 33.9410783523275512 127.126004609223 +7757 0.7757 33.9283640407114007 127.160227713848 +7758 0.7758 33.9156463082103414 127.194422307276 +7759 0.7759 33.9029251576746020 127.228588407582 +7760 0.7760 33.8902005919525777 127.262726032856 +7761 0.7761 33.8774726138908733 127.296835201192 +7762 0.7762 33.8647412263342815 127.330915930694 +7763 0.7763 33.8520064321257763 127.364968239474 +7764 0.7764 33.8392682341065196 127.398992145653 +7765 0.7765 33.8265266351158687 127.432987667359 +7766 0.7766 33.8137816379913616 127.466954822730 +7767 0.7767 33.8010332455687319 127.500893629910 +7768 0.7768 33.7882814606818869 127.534804107056 +7769 0.7769 33.7755262861629149 127.568686272327 +7770 0.7770 33.7627677248421065 127.602540143895 +7771 0.7771 33.7500057795479123 127.636365739937 +7772 0.7772 33.7372404531069847 127.670163078641 +7773 0.7773 33.7244717483441434 127.703932178201 +7774 0.7774 33.7116996680823888 127.737673056821 +7775 0.7775 33.6989242151429096 127.771385732711 +7776 0.7776 33.6861453923450682 127.805070224089 +7777 0.7777 33.6733632025064011 127.838726549185 +7778 0.7778 33.6605776484426329 127.872354726232 +7779 0.7779 33.6477887329676477 127.905954773474 +7780 0.7780 33.6349964588935180 127.939526709165 +7781 0.7781 33.6222008290304828 127.973070551559 +7782 0.7782 33.6094018461869553 128.006586318928 +7783 0.7783 33.5965995131695294 128.040074029544 +7784 0.7784 33.5837938327829661 128.073533701693 +7785 0.7785 33.5709848078302002 128.106965353664 +7786 0.7786 33.5581724411123261 128.140369003757 +7787 0.7787 33.5453567354286264 128.173744670278 +7788 0.7788 33.5325376935765362 128.207092371544 +7789 0.7789 33.5197153183516647 128.240412125875 +7790 0.7790 33.5068896125477877 128.273703951604 +7791 0.7791 33.4940605789568551 128.306967867066 +7792 0.7792 33.4812282203689691 128.340203890609 +7793 0.7793 33.4683925395724060 128.373412040585 +7794 0.7794 33.4555535393536090 128.406592335359 +7795 0.7795 33.4427112224971737 128.439744793297 +7796 0.7796 33.4298655917858696 128.472869432775 +7797 0.7797 33.4170166500006189 128.505966272180 +7798 0.7798 33.4041643999205178 128.539035329902 +7799 0.7799 33.3913088443228077 128.572076624343 +7800 0.7800 33.3784499859828969 128.605090173909 +7801 0.7801 33.3655878276743536 128.638075997015 +7802 0.7802 33.3527223721688983 128.671034112083 +7803 0.7803 33.3398536222364186 128.703964537545 +7804 0.7804 33.3269815806449472 128.736867291838 +7805 0.7805 33.3141062501606839 128.769742393405 +7806 0.7806 33.3012276335479811 128.802589860700 +7807 0.7807 33.2883457335693365 128.835409712182 +7808 0.7808 33.2754605529854146 128.868201966319 +7809 0.7809 33.2625720945550185 128.900966641588 +7810 0.7810 33.2496803610351179 128.933703756469 +7811 0.7811 33.2367853551808210 128.966413329452 +7812 0.7812 33.2238870797453956 128.999095379034 +7813 0.7813 33.2109855374802549 129.031749923720 +7814 0.7814 33.1980807311349650 129.064376982023 +7815 0.7815 33.1851726634572444 129.096976572459 +7816 0.7816 33.1722613371929427 129.129548713555 +7817 0.7817 33.1593467550860694 129.162093423846 +7818 0.7818 33.1464289198787867 129.194610721873 +7819 0.7819 33.1335078343113807 129.227100626183 +7820 0.7820 33.1205835011223044 129.259563155332 +7821 0.7821 33.1076559230481422 129.291998327881 +7822 0.7822 33.0947251028236309 129.324406162400 +7823 0.7823 33.0817910431816387 129.356786677468 +7824 0.7824 33.0688537468531791 129.389139891667 +7825 0.7825 33.0559132165674185 129.421465823587 +7826 0.7826 33.0429694550516473 129.453764491829 +7827 0.7827 33.0300224650313083 129.486035914996 +7828 0.7828 33.0170722492299760 129.518280111702 +7829 0.7829 33.0041188103693628 129.550497100565 +7830 0.7830 32.9911621511693269 129.582686900210 +7831 0.7831 32.9782022743478507 129.614849529272 +7832 0.7832 32.9652391826210689 129.646985006392 +7833 0.7833 32.9522728787032406 129.679093350216 +7834 0.7834 32.9393033653067633 129.711174579398 +7835 0.7835 32.9263306451421656 129.743228712599 +7836 0.7836 32.9133547209181145 129.775255768487 +7837 0.7837 32.9003755953414014 129.807255765739 +7838 0.7838 32.8873932711169630 129.839228723034 +7839 0.7839 32.8744077509478601 129.871174659061 +7840 0.7840 32.8614190375352777 129.903093592517 +7841 0.7841 32.8484271335785465 129.934985542102 +7842 0.7842 32.8354320417751140 129.966850526526 +7843 0.7843 32.8224337648205591 129.998688564506 +7844 0.7844 32.8094323054085990 130.030499674763 +7845 0.7845 32.7964276662310610 130.062283876025 +7846 0.7846 32.7834198499779106 130.094041187030 +7847 0.7847 32.7704088593372305 130.125771626520 +7848 0.7848 32.7573946969952416 130.157475213244 +7849 0.7849 32.7443773656362822 130.189151965959 +7850 0.7850 32.7313568679428144 130.220801903426 +7851 0.7851 32.7183332065954247 130.252425044415 +7852 0.7852 32.7053063842728164 130.284021407702 +7853 0.7853 32.6922764036518245 130.315591012069 +7854 0.7854 32.6792432674074078 130.347133876304 +7855 0.7855 32.6662069782126352 130.378650019207 +7856 0.7856 32.6531675387386997 130.410139459572 +7857 0.7857 32.6401249516549115 130.441602216215 +7858 0.7858 32.6270792196287047 130.473038307947 +7859 0.7859 32.6140303453256308 130.504447753590 +7860 0.7860 32.6009783314093511 130.535830571972 +7861 0.7861 32.5879231805416580 130.567186781930 +7862 0.7862 32.5748648953824471 130.598516402300 +7863 0.7863 32.5618034785897379 130.629819451933 +7864 0.7864 32.5487389328196599 130.661095949680 +7865 0.7865 32.5356712607264527 130.692345914403 +7866 0.7866 32.5226004649624869 130.723569364966 +7867 0.7867 32.5095265481782292 130.754766320243 +7868 0.7868 32.4964495130222630 130.785936799114 +7869 0.7869 32.4833693621412820 130.817080820462 +7870 0.7870 32.4702860981800967 130.848198403179 +7871 0.7871 32.4571997237816277 130.879289566162 +7872 0.7872 32.4441102415869054 130.910354328318 +7873 0.7873 32.4310176542350632 130.941392708553 +7874 0.7874 32.4179219643633445 130.972404725786 +7875 0.7875 32.4048231746071096 131.003390398938 +7876 0.7876 32.3917212875998146 131.034349746938 +7877 0.7877 32.3786163059730328 131.065282788723 +7878 0.7878 32.3655082323564329 131.096189543229 +7879 0.7879 32.3523970693778011 131.127070029408 +7880 0.7880 32.3392828196630191 131.157924266211 +7881 0.7881 32.3261654858360785 131.188752272596 +7882 0.7882 32.3130450705190739 131.219554067531 +7883 0.7883 32.2999215763321956 131.250329669985 +7884 0.7884 32.2867950058937510 131.281079098936 +7885 0.7885 32.2736653618201359 131.311802373368 +7886 0.7886 32.2605326467258564 131.342499512270 +7887 0.7887 32.2473968632235142 131.373170534635 +7888 0.7888 32.2342580139238066 131.403815459468 +7889 0.7889 32.2211161014355412 131.434434305773 +7890 0.7890 32.2079711283656209 131.465027092565 +7891 0.7891 32.1948230973190519 131.495593838861 +7892 0.7892 32.1816720108989216 131.526134563688 +7893 0.7893 32.1685178717064346 131.556649286075 +7894 0.7894 32.1553606823408771 131.587138025058 +7895 0.7895 32.1422004453996379 131.617600799683 +7896 0.7896 32.1290371634782019 131.648037628994 +7897 0.7897 32.1158708391701495 131.678448532048 +7898 0.7898 32.1027014750671498 131.708833527902 +7899 0.7899 32.0895290737589747 131.739192635624 +7900 0.7900 32.0763536378334777 131.769525874283 +7901 0.7901 32.0631751698766152 131.799833262957 +7902 0.7902 32.0499936724724321 131.830114820728 +7903 0.7903 32.0368091482030621 131.860370566687 +7904 0.7904 32.0236215996487346 131.890600519924 +7905 0.7905 32.0104310293877603 131.920804699541 +7906 0.7906 31.9972374399965531 131.950983124643 +7907 0.7907 31.9840408340496047 131.981135814341 +7908 0.7908 31.9708412141194991 132.011262787750 +7909 0.7909 31.9576385827769123 132.041364063994 +7910 0.7910 31.9444329425906020 132.071439662200 +7911 0.7911 31.9312242961274180 132.101489601502 +7912 0.7912 31.9180126459522917 132.131513901038 +7913 0.7913 31.9047979946282432 132.161512579952 +7914 0.7914 31.8915803447163775 132.191485657395 +7915 0.7915 31.8783596987758813 132.221433152520 +7916 0.7916 31.8651360593640298 132.251355084491 +7917 0.7917 31.8519094290361835 132.281251472470 +7918 0.7918 31.8386798103457771 132.311122335633 +7919 0.7919 31.8254472058443376 132.340967693153 +7920 0.7920 31.8122116180814700 132.370787564216 +7921 0.7921 31.7989730496048573 132.400581968008 +7922 0.7922 31.7857315029602709 132.430350923723 +7923 0.7923 31.7724869806915571 132.460094450558 +7924 0.7924 31.7592394853406432 132.489812567720 +7925 0.7925 31.7459890194475349 132.519505294414 +7926 0.7926 31.7327355855503228 132.549172649857 +7927 0.7927 31.7194791861851648 132.578814653269 +7928 0.7928 31.7062198238863076 132.608431323874 +7929 0.7929 31.6929575011860685 132.638022680903 +7930 0.7930 31.6796922206148430 132.667588743592 +7931 0.7931 31.6664239847011046 132.697129531181 +7932 0.7932 31.6531527959714012 132.726645062915 +7933 0.7933 31.6398786569503514 132.756135358048 +7934 0.7934 31.6266015701606555 132.785600435834 +7935 0.7935 31.6133215381230883 132.815040315535 +7936 0.7936 31.6000385633564917 132.844455016419 +7937 0.7937 31.5867526483777823 132.873844557755 +7938 0.7938 31.5734637957019544 132.903208958822 +7939 0.7939 31.5601720078420698 132.932548238903 +7940 0.7940 31.5468772873092611 132.961862417281 +7941 0.7941 31.5335796366127354 132.991151513252 +7942 0.7942 31.5202790582597672 133.020415546111 +7943 0.7943 31.5069755547557051 133.049654535162 +7944 0.7944 31.4936691286039618 133.078868499710 +7945 0.7945 31.4803597823060244 133.108057459069 +7946 0.7946 31.4670475183614435 133.137221432554 +7947 0.7947 31.4537323392678410 133.166360439490 +7948 0.7948 31.4404142475209056 133.195474499201 +7949 0.7949 31.4270932456143939 133.224563631023 +7950 0.7950 31.4137693360401293 133.253627854288 +7951 0.7951 31.4004425212879994 133.282667188340 +7952 0.7952 31.3871128038459553 133.311681652527 +7953 0.7953 31.3737801862000190 133.340671266199 +7954 0.7954 31.3604446708342728 133.369636048713 +7955 0.7955 31.3471062602308663 133.398576019431 +7956 0.7956 31.3337649568700094 133.427491197717 +7957 0.7957 31.3204207632299756 133.456381602943 +7958 0.7958 31.3070736817871058 133.485247254485 +7959 0.7959 31.2937237150157941 133.514088171723 +7960 0.7960 31.2803708653885053 133.542904374042 +7961 0.7961 31.2670151353757610 133.571695880832 +7962 0.7962 31.2536565274461466 133.600462711488 +7963 0.7963 31.2402950440663005 133.629204885408 +7964 0.7964 31.2269306877009285 133.657922421999 +7965 0.7965 31.2135634608127965 133.686615340668 +7966 0.7966 31.2001933658627202 133.715283660827 +7967 0.7967 31.1868204053095823 133.743927401896 +7968 0.7968 31.1734445816103225 133.772546583298 +7969 0.7969 31.1600658972199334 133.801141224458 +7970 0.7970 31.1466843545914713 133.829711344810 +7971 0.7971 31.1332999561760424 133.858256963790 +7972 0.7972 31.1199127044228128 133.886778100838 +7973 0.7973 31.1065226017790017 133.915274775401 +7974 0.7974 31.0931296506898853 133.943747006928 +7975 0.7975 31.0797338535987961 133.972194814875 +7976 0.7976 31.0663352129471164 134.000618218700 +7977 0.7977 31.0529337311742886 134.029017237868 +7978 0.7978 31.0395294107178046 134.057391891847 +7979 0.7979 31.0261222540132060 134.085742200108 +7980 0.7980 31.0127122634940946 134.114068182130 +7981 0.7981 30.9992994415921181 134.142369857393 +7982 0.7982 30.9858837907369811 134.170647245383 +7983 0.7983 30.9724653133564338 134.198900365591 +7984 0.7984 30.9590440118762800 134.227129237513 +7985 0.7985 30.9456198887203726 134.255333880647 +7986 0.7986 30.9321929463106144 134.283514314496 +7987 0.7987 30.9187631870669613 134.311670558568 +7988 0.7988 30.9053306134074148 134.339802632375 +7989 0.7989 30.8918952277480230 134.367910555434 +7990 0.7990 30.8784570325028866 134.395994347266 +7991 0.7991 30.8650160300841527 134.424054027395 +7992 0.7992 30.8515722229020142 134.452089615351 +7993 0.7993 30.8381256133647135 134.480101130668 +7994 0.7994 30.8246762038785356 134.508088592884 +7995 0.7995 30.8112239968478150 134.536052021540 +7996 0.7996 30.7977689946749287 134.563991436183 +7997 0.7997 30.7843111997602996 134.591906856364 +7998 0.7998 30.7708506145024003 134.619798301636 +7999 0.7999 30.7573872412977423 134.647665791559 +8000 0.8000 30.7439210825408793 134.675509345696 +8001 0.8001 30.7304521406244149 134.703328983613 +8002 0.8002 30.7169804179389914 134.731124724883 +8003 0.8003 30.7035059168732936 134.758896589079 +8004 0.8004 30.6900286398140487 134.786644595784 +8005 0.8005 30.6765485891460301 134.814368764578 +8006 0.8006 30.6630657672520499 134.842069115052 +8007 0.8007 30.6495801765129592 134.869745666794 +8008 0.8008 30.6360918193076479 134.897398439401 +8009 0.8009 30.6226006980130556 134.925027452475 +8010 0.8010 30.6091068150041501 134.952632725616 +8011 0.8011 30.5956101726539487 134.980214278434 +8012 0.8012 30.5821107733335005 135.007772130541 +8013 0.8013 30.5686086194118971 135.035306301552 +8014 0.8014 30.5551037132562655 135.062816811086 +8015 0.8015 30.5415960572317715 135.090303678766 +8016 0.8016 30.5280856537016234 135.117766924222 +8017 0.8017 30.5145725050270578 135.145206567084 +8018 0.8018 30.5010566135673535 135.172622626986 +8019 0.8019 30.4875379816798251 135.200015123570 +8020 0.8020 30.4740166117198221 135.227384076476 +8021 0.8021 30.4604925060407297 135.254729505353 +8022 0.8022 30.4469656669939681 135.282051429852 +8023 0.8023 30.4334360969289932 135.309349869625 +8024 0.8024 30.4199037981932960 135.336624844332 +8025 0.8025 30.4063687731323959 135.363876373636 +8026 0.8026 30.3928310240898547 135.391104477202 +8027 0.8027 30.3792905534072588 135.418309174699 +8028 0.8028 30.3657473634242336 135.445490485801 +8029 0.8029 30.3522014564784328 135.472648430186 +8030 0.8030 30.3386528349055453 135.499783027534 +8031 0.8031 30.3251015010392919 135.526894297530 +8032 0.8032 30.3115474572114216 135.553982259862 +8033 0.8033 30.2979907057517188 135.581046934222 +8034 0.8034 30.2844312489879925 135.608088340307 +8035 0.8035 30.2708690892460872 135.635106497815 +8036 0.8036 30.2573042288498755 135.662101426449 +8037 0.8037 30.2437366701212582 135.689073145917 +8038 0.8038 30.2301664153801646 135.716021675927 +8039 0.8039 30.2165934669445591 135.742947036193 +8040 0.8040 30.2030178271304273 135.769849246435 +8041 0.8041 30.1894394982517866 135.796728326371 +8042 0.8042 30.1758584826206828 135.823584295728 +8043 0.8043 30.1622747825471862 135.850417174232 +8044 0.8044 30.1486884003393953 135.877226981617 +8045 0.8045 30.1350993383034336 135.904013737616 +8046 0.8046 30.1215075987434560 135.930777461969 +8047 0.8047 30.1079131839616352 135.957518174418 +8048 0.8048 30.0943160962581793 135.984235894707 +8049 0.8049 30.0807163379313138 136.010930642588 +8050 0.8050 30.0671139112772927 136.037602437811 +8051 0.8051 30.0535088185903945 136.064251300133 +8052 0.8052 30.0399010621629223 136.090877249313 +8053 0.8053 30.0262906442852007 136.117480305116 +8054 0.8054 30.0126775672455786 136.144060487305 +8055 0.8055 29.9990618333304297 136.170617815651 +8056 0.8056 29.9854434448241491 136.197152309929 +8057 0.8057 29.9718224040091563 136.223663989911 +8058 0.8058 29.9581987131658920 136.250152875381 +8059 0.8059 29.9445723745728181 136.276618986119 +8060 0.8060 29.9309433905064175 136.303062341913 +8061 0.8061 29.9173117632411945 136.329482962552 +8062 0.8062 29.9036774950496742 136.355880867830 +8063 0.8063 29.8900405882024067 136.382256077541 +8064 0.8064 29.8764010449679560 136.408608611487 +8065 0.8065 29.8627588676129072 136.434938489468 +8066 0.8066 29.8491140584018702 136.461245731294 +8067 0.8067 29.8354666195974652 136.487530356771 +8068 0.8068 29.8218165534603408 136.513792385711 +8069 0.8069 29.8081638622491596 136.540031837933 +8070 0.8070 29.7945085482206018 136.566248733252 +8071 0.8071 29.7808506136293651 136.592443091492 +8072 0.8072 29.7671900607281650 136.618614932477 +8073 0.8073 29.7535268917677378 136.644764276038 +8074 0.8074 29.7398611089968341 136.670891142004 +8075 0.8075 29.7261927146622220 136.696995550209 +8076 0.8076 29.7125217110086872 136.723077520494 +8077 0.8077 29.6988481002790294 136.749137072696 +8078 0.8078 29.6851718847140624 136.775174226660 +8079 0.8079 29.6714930665526175 136.801189002235 +8080 0.8080 29.6578116480315437 136.827181419268 +8081 0.8081 29.6441276313857003 136.853151497615 +8082 0.8082 29.6304410188479643 136.879099257128 +8083 0.8083 29.6167518126492233 136.905024717670 +8084 0.8084 29.6030600150183858 136.930927899101 +8085 0.8085 29.5893656281823674 136.956808821288 +8086 0.8086 29.5756686543660976 136.982667504096 +8087 0.8087 29.5619690957925236 137.008503967399 +8088 0.8088 29.5482669546825996 137.034318231070 +8089 0.8089 29.5345622332552971 137.060110314985 +8090 0.8090 29.5208549337275983 137.085880239025 +8091 0.8091 29.5071450583144923 137.111628023072 +8092 0.8092 29.4934326092289893 137.137353687012 +8093 0.8093 29.4797175886821030 137.163057250735 +8094 0.8094 29.4659999988828609 137.188738734129 +8095 0.8095 29.4522798420383012 137.214398157092 +8096 0.8096 29.4385571203534688 137.240035539520 +8097 0.8097 29.4248318360314265 137.265650901312 +8098 0.8098 29.4111039912732437 137.291244262371 +8099 0.8099 29.3973735882779934 137.316815642604 +8100 0.8100 29.3836406292427661 137.342365061918 +8101 0.8101 29.3699051163626592 137.367892540225 +8102 0.8102 29.3561670518307771 137.393398097439 +8103 0.8103 29.3424264378382311 137.418881753478 +8104 0.8104 29.3286832765741430 137.444343528260 +8105 0.8105 29.3149375702256449 137.469783441708 +8106 0.8106 29.3011893209778727 137.495201513748 +8107 0.8107 29.2874385310139687 137.520597764305 +8108 0.8108 29.2736852025150895 137.545972213312 +8109 0.8109 29.2599293376603882 137.571324880702 +8110 0.8110 29.2461709386270314 137.596655786409 +8111 0.8111 29.2324100075901931 137.621964950372 +8112 0.8112 29.2186465467230470 137.647252392535 +8113 0.8113 29.2048805581967770 137.672518132839 +8114 0.8114 29.1911120441805743 137.697762191232 +8115 0.8115 29.1773410068416297 137.722984587662 +8116 0.8116 29.1635674483451410 137.748185342082 +8117 0.8117 29.1497913708543130 137.773364474444 +8118 0.8118 29.1360127765303538 137.798522004707 +8119 0.8119 29.1222316675324784 137.823657952831 +8120 0.8120 29.1084480460178980 137.848772338775 +8121 0.8121 29.0946619141418346 137.873865182507 +8122 0.8122 29.0808732740575095 137.898936503993 +8123 0.8123 29.0670821279161515 137.923986323201 +8124 0.8124 29.0532884778669853 137.949014660105 +8125 0.8125 29.0394923260572462 137.974021534679 +8126 0.8126 29.0256936746321657 137.999006966900 +8127 0.8127 29.0118925257349822 138.023970976749 +8128 0.8128 28.9980888815069342 138.048913584206 +8129 0.8129 28.9842827440872597 138.073834809258 +8130 0.8130 28.9704741156132037 138.098734671888 +8131 0.8131 28.9566629982200041 138.123613192091 +8132 0.8132 28.9428493940409055 138.148470389855 +8133 0.8133 28.9290333052071524 138.173306285175 +8134 0.8134 28.9152147338479928 138.198120898048 +8135 0.8135 28.9013936820906672 138.222914248472 +8136 0.8136 28.8875701520604196 138.247686356450 +8137 0.8137 28.8737441458804973 138.272437241985 +8138 0.8138 28.8599156656721441 138.297166925084 +8139 0.8139 28.8460847135546032 138.321875425754 +8140 0.8140 28.8322512916451146 138.346562764005 +8141 0.8141 28.8184154020589212 138.371228959853 +8142 0.8142 28.8045770469092624 138.395874033312 +8143 0.8143 28.7907362283073773 138.420498004400 +8144 0.8144 28.7768929483625016 138.445100893136 +8145 0.8145 28.7630472091818667 138.469682719542 +8146 0.8146 28.7491990128707080 138.494243503645 +8147 0.8147 28.7353483615322531 138.518783265470 +8148 0.8148 28.7214952572677262 138.543302025045 +8149 0.8149 28.7076397021763547 138.567799802402 +8150 0.8150 28.6937816983553553 138.592276617576 +8151 0.8151 28.6799212478999479 138.616732490601 +8152 0.8152 28.6660583529033417 138.641167441514 +8153 0.8153 28.6521930154567492 138.665581490357 +8154 0.8154 28.6383252376493722 138.689974657171 +8155 0.8155 28.6244550215684121 138.714346962000 +8156 0.8156 28.6105823692990668 138.738698424891 +8157 0.8157 28.5967072829245268 138.763029065894 +8158 0.8158 28.5828297645259788 138.787338905056 +8159 0.8159 28.5689498161826059 138.811627962432 +8160 0.8160 28.5550674399715803 138.835896258078 +8161 0.8161 28.5411826379680740 138.860143812050 +8162 0.8162 28.5272954122452518 138.884370644405 +8163 0.8163 28.5134057648742711 138.908576775208 +8164 0.8164 28.4995136979242858 138.932762224520 +8165 0.8165 28.4856192134624386 138.956927012406 +8166 0.8166 28.4717223135538724 138.981071158932 +8167 0.8167 28.4578230002617190 139.005194684171 +8168 0.8168 28.4439212756470994 139.029297608191 +8169 0.8169 28.4300171417691381 139.053379951065 +8170 0.8170 28.4161106006849415 139.077441732871 +8171 0.8171 28.4022016544496125 139.101482973684 +8172 0.8172 28.3882903051162501 139.125503693584 +8173 0.8173 28.3743765547359388 139.149503912653 +8174 0.8174 28.3604604053577560 139.173483650973 +8175 0.8175 28.3465418590287754 139.197442928629 +8176 0.8176 28.3326209177940598 139.221381765708 +8177 0.8177 28.3186975836966610 139.245300182298 +8178 0.8178 28.3047718587776203 139.269198198492 +8179 0.8179 28.2908437450759749 139.293075834380 +8180 0.8180 28.2769132446287514 139.316933110058 +8181 0.8181 28.2629803594709692 139.340770045622 +8182 0.8182 28.2490450916356295 139.364586661170 +8183 0.8183 28.2351074431537299 139.388382976802 +8184 0.8184 28.2211674160542572 139.412159012621 +8185 0.8185 28.2072250123641908 139.435914788729 +8186 0.8186 28.1932802341084923 139.459650325234 +8187 0.8187 28.1793330833101194 139.483365642241 +8188 0.8188 28.1653835619900157 139.507060759859 +8189 0.8189 28.1514316721671136 139.530735698199 +8190 0.8190 28.1374774158583350 139.554390477376 +8191 0.8191 28.1235207950785906 139.578025117502 +8192 0.8192 28.1095618118407806 139.601639638693 +8193 0.8193 28.0956004681557943 139.625234061068 +8194 0.8194 28.0816367660325028 139.648808404747 +8195 0.8195 28.0676707074777738 139.672362689849 +8196 0.8196 28.0537022944964569 139.695896936500 +8197 0.8197 28.0397315290913909 139.719411164824 +8198 0.8198 28.0257584132634037 139.742905394946 +8199 0.8199 28.0117829490113053 139.766379646995 +8200 0.8200 27.9978051383319020 139.789833941099 +8201 0.8201 27.9838249832199786 139.813268297392 +8202 0.8202 27.9698424856683090 139.836682736006 +8203 0.8203 27.9558576476676564 139.860077277076 +8204 0.8204 27.9418704712067658 139.883451940737 +8205 0.8205 27.9278809582723717 139.906806747127 +8206 0.8206 27.9138891108491976 139.930141716388 +8207 0.8207 27.8998949309199453 139.953456868659 +8208 0.8208 27.8858984204653098 139.976752224081 +8209 0.8209 27.8718995814639641 140.000027802801 +8210 0.8210 27.8578984158925742 140.023283624963 +8211 0.8211 27.8438949257257917 140.046519710717 +8212 0.8212 27.8298891129362467 140.069736080209 +8213 0.8213 27.8158809794945583 140.092932753590 +8214 0.8214 27.8018705273693278 140.116109751013 +8215 0.8215 27.7878577585271458 140.139267092630 +8216 0.8216 27.7738426749325846 140.162404798595 +8217 0.8217 27.7598252785482025 140.185522889069 +8218 0.8218 27.7458055713345395 140.208621384203 +8219 0.8219 27.7317835552501215 140.231700304163 +8220 0.8220 27.7177592322514599 140.254759669104 +8221 0.8221 27.7037326042930445 140.277799499192 +8222 0.8222 27.6897036733273545 140.300819814589 +8223 0.8223 27.6756724413048509 140.323820635461 +8224 0.8224 27.6616389101739806 140.346801981974 +8225 0.8225 27.6476030818811687 140.369763874295 +8226 0.8226 27.6335649583708225 140.392706332596 +8227 0.8227 27.6195245415853421 140.415629377045 +8228 0.8228 27.6054818334650989 140.438533027813 +8229 0.8229 27.5914368359484534 140.461417305076 +8230 0.8230 27.5773895509717484 140.484282229009 +8231 0.8231 27.5633399804693084 140.507127819785 +8232 0.8232 27.5492881263734404 140.529954097584 +8233 0.8233 27.5352339906144330 140.552761082584 +8234 0.8234 27.5211775751205572 140.575548794965 +8235 0.8235 27.5071188818180623 140.598317254908 +8236 0.8236 27.4930579126311869 140.621066482596 +8237 0.8237 27.4789946694821481 140.643796498213 +8238 0.8238 27.4649291542911413 140.666507321943 +8239 0.8239 27.4508613689763443 140.689198973974 +8240 0.8240 27.4367913154539202 140.711871474494 +8241 0.8241 27.4227189956380109 140.734524843690 +8242 0.8242 27.4086444114407399 140.757159101753 +8243 0.8243 27.3945675647722098 140.779774268875 +8244 0.8244 27.3804884575405048 140.802370365248 +8245 0.8245 27.3664070916516877 140.824947411066 +8246 0.8246 27.3523234690098072 140.847505426524 +8247 0.8247 27.3382375915168900 140.870044431819 +8248 0.8248 27.3241494610729418 140.892564447146 +8249 0.8249 27.3100590795759501 140.915065492705 +8250 0.8250 27.2959664489218810 140.937547588696 +8251 0.8251 27.2818715710046789 140.960010755318 +8252 0.8252 27.2677744477162740 140.982455012775 +8253 0.8253 27.2536750809465715 141.004880381270 +8254 0.8254 27.2395734725834586 141.027286881006 +8255 0.8255 27.2254696245127974 141.049674532189 +8256 0.8256 27.2113635386184356 141.072043355026 +8257 0.8257 27.1972552167821995 141.094393369724 +8258 0.8258 27.1831446608838903 141.116724596489 +8259 0.8259 27.1690318728012876 141.139037055534 +8260 0.8260 27.1549168544101569 141.161330767069 +8261 0.8261 27.1407996075842384 141.183605751304 +8262 0.8262 27.1266801341952508 141.205862028453 +8263 0.8263 27.1125584361128915 141.228099618730 +8264 0.8264 27.0984345152048363 141.250318542349 +8265 0.8265 27.0843083733367429 141.272518819526 +8266 0.8266 27.0701800123722442 141.294700470479 +8267 0.8267 27.0560494341729481 141.316863515424 +8268 0.8268 27.0419166405984477 141.339007974581 +8269 0.8269 27.0277816335063115 141.361133868170 +8270 0.8270 27.0136444147520827 141.383241216410 +8271 0.8271 26.9995049861892866 141.405330039524 +8272 0.8272 26.9853633496694236 141.427400357735 +8273 0.8273 26.9712195070419725 141.449452191265 +8274 0.8274 26.9570734601543940 141.471485560339 +8275 0.8275 26.9429252108521169 141.493500485184 +8276 0.8276 26.9287747609785555 141.515496986024 +8277 0.8277 26.9146221123750991 141.537475083087 +8278 0.8278 26.9004672668811153 141.559434796600 +8279 0.8279 26.8863102263339471 141.581376146794 +8280 0.8280 26.8721509925689119 141.603299153899 +8281 0.8281 26.8579895674193097 141.625203838143 +8282 0.8282 26.8438259527164149 141.647090219760 +8283 0.8283 26.8296601502894774 141.668958318981 +8284 0.8284 26.8154921619657252 141.690808156039 +8285 0.8285 26.8013219895703649 141.712639751169 +8286 0.8286 26.7871496349265747 141.734453124606 +8287 0.8287 26.7729750998555147 141.756248296585 +8288 0.8288 26.7587983861763199 141.778025287342 +8289 0.8289 26.7446194957060968 141.799784117113 +8290 0.8290 26.7304384302599338 141.821524806140 +8291 0.8291 26.7162551916508946 141.843247374658 +8292 0.8292 26.7020697816900174 141.864951842907 +8293 0.8293 26.6878822021863158 141.886638231130 +8294 0.8294 26.6736924549467815 141.908306559565 +8295 0.8295 26.6595005417763815 141.929956848455 +8296 0.8296 26.6453064644780575 141.951589118041 +8297 0.8297 26.6311102248527263 141.973203388569 +8298 0.8298 26.6169118246992831 141.994799680281 +8299 0.8299 26.6027112658145981 142.016378013421 +8300 0.8300 26.5885085499935165 142.037938408235 +8301 0.8301 26.5743036790288549 142.059480884968 +8302 0.8302 26.5600966547114119 142.081005463869 +8303 0.8303 26.5458874788299610 142.102512165182 +8304 0.8304 26.5316761531712437 142.124001009158 +8305 0.8305 26.5174626795199835 142.145472016043 +8306 0.8306 26.5032470596588787 142.166925206087 +8307 0.8307 26.4890292953685957 142.188360599540 +8308 0.8308 26.4748093884277864 142.209778216653 +8309 0.8309 26.4605873406130705 142.231178077676 +8310 0.8310 26.4463631536990427 142.252560202861 +8311 0.8311 26.4321368294582761 142.273924612459 +8312 0.8312 26.4179083696613155 142.295271326724 +8313 0.8313 26.4036777760766839 142.316600365910 +8314 0.8314 26.3894450504708757 142.337911750270 +8315 0.8315 26.3752101946083606 142.359205500058 +8316 0.8316 26.3609732102515828 142.380481635529 +8317 0.8317 26.3467340991609582 142.401740176939 +8318 0.8318 26.3324928630948847 142.422981144544 +8319 0.8319 26.3182495038097279 142.444204558601 +8320 0.8320 26.3040040230598287 142.465410439365 +8321 0.8321 26.2897564225975060 142.486598807097 +8322 0.8322 26.2755067041730470 142.507769682052 +8323 0.8323 26.2612548695347208 142.528923084489 +8324 0.8324 26.2470009204287642 142.550059034668 +8325 0.8325 26.2327448585993892 142.571177552848 +8326 0.8326 26.2184866857887826 142.592278659290 +8327 0.8327 26.2042264037371062 142.613362374253 +8328 0.8328 26.1899640141824932 142.634428717998 +8329 0.8329 26.1756995188610553 142.655477710784 +8330 0.8330 26.1614329195068720 142.676509372878 +8331 0.8331 26.1471642178520014 142.697523724537 +8332 0.8332 26.1328934156264729 142.718520786027 +8333 0.8333 26.1186205145582910 142.739500577609 +8334 0.8334 26.1043455163734350 142.760463119546 +8335 0.8335 26.0900684227958521 142.781408432102 +8336 0.8336 26.0757892355474716 142.802336535541 +8337 0.8337 26.0615079563481871 142.823247450130 +8338 0.8338 26.0472245869158741 142.844141196128 +8339 0.8339 26.0329391289663761 142.865017793805 +8340 0.8340 26.0186515842135151 142.885877263424 +8341 0.8341 26.0043619543690809 142.906719625252 +8342 0.8342 25.9900702411428419 142.927544899555 +8343 0.8343 25.9757764462425342 142.948353106598 +8344 0.8344 25.9614805713738726 142.969144266648 +8345 0.8345 25.9471826182405430 142.989918399972 +8346 0.8346 25.9328825885442029 143.010675526839 +8347 0.8347 25.9185804839844849 143.031415667514 +8348 0.8348 25.9042763062589962 143.052138842267 +8349 0.8349 25.8899700570633158 143.072845071363 +8350 0.8350 25.8756617380909937 143.093534375073 +8351 0.8351 25.8613513510335551 143.114206773665 +8352 0.8352 25.8470388975805001 143.134862287407 +8353 0.8353 25.8327243794193002 143.155500936568 +8354 0.8354 25.8184077982354019 143.176122741418 +8355 0.8355 25.8040891557122194 143.196727722226 +8356 0.8356 25.7897684535311456 143.217315899261 +8357 0.8357 25.7754456933715446 143.237887292794 +8358 0.8358 25.7611208769107485 143.258441923094 +8359 0.8359 25.7467940058240714 143.278979810430 +8360 0.8360 25.7324650817847953 143.299500975076 +8361 0.8361 25.7181341064641771 143.320005437300 +8362 0.8362 25.7038010815314450 143.340493217372 +8363 0.8363 25.6894660086537989 143.360964335565 +8364 0.8364 25.6751288894964134 143.381418812148 +8365 0.8365 25.6607897257224380 143.401856667392 +8366 0.8366 25.6464485189929903 143.422277921570 +8367 0.8367 25.6321052709671626 143.442682594951 +8368 0.8368 25.6177599833020260 143.463070707809 +8369 0.8369 25.6034126576526155 143.483442280412 +8370 0.8370 25.5890632956719415 143.503797333035 +8371 0.8371 25.5747118990109925 143.524135885948 +8372 0.8372 25.5603584693187251 143.544457959422 +8373 0.8373 25.5460030082420673 143.564763573732 +8374 0.8374 25.5316455174259218 143.585052749145 +8375 0.8375 25.5172859985131666 143.605325505936 +8376 0.8376 25.5029244531446508 143.625581864378 +8377 0.8377 25.4885608829591952 143.645821844739 +8378 0.8378 25.4741952895935952 143.666045467294 +8379 0.8379 25.4598276746826144 143.686252752315 +8380 0.8380 25.4454580398589947 143.706443720073 +8381 0.8381 25.4310863867534493 143.726618390840 +8382 0.8382 25.4167127169946632 143.746776784888 +8383 0.8383 25.4023370322092958 143.766918922490 +8384 0.8384 25.3879593340219749 143.787044823917 +8385 0.8385 25.3735796240553064 143.807154509439 +8386 0.8386 25.3591979039298678 143.827247999333 +8387 0.8387 25.3448141752642080 143.847325313865 +8388 0.8388 25.3304284396748507 143.867386473311 +8389 0.8389 25.3160406987762876 143.887431497940 +8390 0.8390 25.3016509541809889 143.907460408025 +8391 0.8391 25.2872592074993960 143.927473223839 +8392 0.8392 25.2728654603399221 143.947469965650 +8393 0.8393 25.2584697143089514 143.967450653731 +8394 0.8394 25.2440719710108468 143.987415308354 +8395 0.8395 25.2296722320479390 144.007363949790 +8396 0.8396 25.2152704990205336 144.027296598307 +8397 0.8397 25.2008667735269078 144.047213274181 +8398 0.8398 25.1864610571633136 144.067113997679 +8399 0.8399 25.1720533515239744 144.086998789073 +8400 0.8400 25.1576436582010885 144.106867668634 +8401 0.8401 25.1432319787848257 144.126720656631 +8402 0.8402 25.1288183148633273 144.146557773334 +8403 0.8403 25.1144026680227093 144.166379039015 +8404 0.8404 25.0999850398470628 144.186184473941 +8405 0.8405 25.0855654319184467 144.205974098385 +8406 0.8406 25.0711438458168985 144.225747932613 +8407 0.8407 25.0567202831204234 144.245505996896 +8408 0.8408 25.0422947454050018 144.265248311502 +8409 0.8409 25.0278672342445923 144.284974896701 +8410 0.8410 25.0134377512111179 144.304685772762 +8411 0.8411 24.9990062978744838 144.324380959950 +8412 0.8412 24.9845728758025594 144.344060478536 +8413 0.8413 24.9701374865611925 144.363724348789 +8414 0.8414 24.9557001317142060 144.383372590973 +8415 0.8415 24.9412608128233906 144.403005225357 +8416 0.8416 24.9268195314485119 144.422622272208 +8417 0.8417 24.9123762891473106 144.442223751792 +8418 0.8418 24.8979310874755022 144.461809684378 +8419 0.8419 24.8834839279867701 144.481380090229 +8420 0.8420 24.8690348122327798 144.500934989613 +8421 0.8421 24.8545837417631610 144.520474402794 +8422 0.8422 24.8401307181255184 144.539998350037 +8423 0.8423 24.8256757428654353 144.559506851609 +8424 0.8424 24.8112188175264663 144.578999927773 +8425 0.8425 24.7967599436501374 144.598477598793 +8426 0.8426 24.7822991227759495 144.617939884935 +8427 0.8427 24.7678363564413786 144.637386806460 +8428 0.8428 24.7533716461818756 144.656818383631 +8429 0.8429 24.7389049935308591 144.676234636714 +8430 0.8430 24.7244364000197265 144.695635585968 +8431 0.8431 24.7099658671778464 144.715021251656 +8432 0.8432 24.6954933965325623 144.734391654041 +8433 0.8433 24.6810189896091927 144.753746813382 +8434 0.8434 24.6665426479310277 144.773086749942 +8435 0.8435 24.6520643730193321 144.792411483980 +8436 0.8436 24.6375841663933457 144.811721035756 +8437 0.8437 24.6231020295702798 144.831015425530 +8438 0.8438 24.6086179640653242 144.850294673562 +8439 0.8439 24.5941319713916400 144.869558800109 +8440 0.8440 24.5796440530603633 144.888807825430 +8441 0.8441 24.5651542105806016 144.908041769783 +8442 0.8442 24.5506624454594409 144.927260653425 +8443 0.8443 24.5361687592019386 144.946464496613 +8444 0.8444 24.5216731533111272 144.965653319601 +8445 0.8445 24.5071756292880139 144.984827142648 +8446 0.8446 24.4926761886315809 145.003985986010 +8447 0.8447 24.4781748328387820 145.023129869940 +8448 0.8448 24.4636715634045494 145.042258814692 +8449 0.8449 24.4491663818217901 145.061372840520 +8450 0.8450 24.4346592895813792 145.080471967678 +8451 0.8451 24.4201502881721737 145.099556216420 +8452 0.8452 24.4056393790810020 145.118625606995 +8453 0.8453 24.3911265637926711 145.137680159657 +8454 0.8454 24.3766118437899557 145.156719894657 +8455 0.8455 24.3620952205536092 145.175744832244 +8456 0.8456 24.3475766955623634 145.194754992669 +8457 0.8457 24.3330562702929214 145.213750396183 +8458 0.8458 24.3185339462199615 145.232731063033 +8459 0.8459 24.3040097248161366 145.251697013468 +8460 0.8460 24.2894836075520750 145.270648267735 +8461 0.8461 24.2749555958963832 145.289584846083 +8462 0.8462 24.2604256913156426 145.308506768755 +8463 0.8463 24.2458938952744063 145.327414056001 +8464 0.8464 24.2313602092352021 145.346306728062 +8465 0.8465 24.2168246346585398 145.365184805185 +8466 0.8466 24.2022871730029010 145.384048307615 +8467 0.8467 24.1877478257247418 145.402897255593 +8468 0.8468 24.1732065942784935 145.421731669363 +8469 0.8469 24.1586634801165658 145.440551569167 +8470 0.8470 24.1441184846893435 145.459356975244 +8471 0.8471 24.1295716094451898 145.478147907839 +8472 0.8472 24.1150228558304391 145.496924387189 +8473 0.8473 24.1004722252894013 145.515686433534 +8474 0.8474 24.0859197192643677 145.534434067113 +8475 0.8475 24.0713653391956051 145.553167308162 +8476 0.8476 24.0568090865213513 145.571886176920 +8477 0.8477 24.0422509626778229 145.590590693623 +8478 0.8478 24.0276909690992149 145.609280878507 +8479 0.8479 24.0131291072177007 145.627956751808 +8480 0.8480 23.9985653784634216 145.646618333758 +8481 0.8481 23.9839997842645047 145.665265644592 +8482 0.8482 23.9694323260470483 145.683898704543 +8483 0.8483 23.9548630052351292 145.702517533842 +8484 0.8484 23.9402918232508028 145.721122152721 +8485 0.8485 23.9257187815140959 145.739712581410 +8486 0.8486 23.9111438814430173 145.758288840140 +8487 0.8487 23.8965671244535542 145.776850949139 +8488 0.8488 23.8819885119596655 145.795398928636 +8489 0.8489 23.8674080453732920 145.813932798857 +8490 0.8490 23.8528257261043493 145.832452580029 +8491 0.8491 23.8382415555607281 145.850958292378 +8492 0.8492 23.8236555351483013 145.869449956129 +8493 0.8493 23.8090676662709200 145.887927591507 +8494 0.8494 23.7944779503304069 145.906391218733 +8495 0.8495 23.7798863887265703 145.924840858032 +8496 0.8496 23.7652929828571864 145.943276529623 +8497 0.8497 23.7506977341180203 145.961698253729 +8498 0.8498 23.7361006439028053 145.980106050569 +8499 0.8499 23.7215017136032600 145.998499940362 +8500 0.8500 23.7069009446090746 146.016879943327 +8501 0.8501 23.6922983383079249 146.035246079679 +8502 0.8502 23.6776938960854579 146.053598369636 +8503 0.8503 23.6630876193253066 146.071936833414 +8504 0.8504 23.6484795094090750 146.090261491228 +8505 0.8505 23.6338695677163493 146.108572363288 +8506 0.8506 23.6192577956246943 146.126869469811 +8507 0.8507 23.6046441945096532 146.145152831008 +8508 0.8508 23.5900287657447478 146.163422467090 +8509 0.8509 23.5754115107014783 146.181678398265 +8510 0.8510 23.5607924307493271 146.199920644743 +8511 0.8511 23.5461715272557548 146.218149226733 +8512 0.8512 23.5315488015861973 146.236364164442 +8513 0.8513 23.5169242551040725 146.254565478075 +8514 0.8514 23.5022978891707766 146.272753187839 +8515 0.8515 23.4876697051456880 146.290927313938 +8516 0.8516 23.4730397043861636 146.309087876573 +8517 0.8517 23.4584078882475389 146.327234895949 +8518 0.8518 23.4437742580831276 146.345368392267 +8519 0.8519 23.4291388152442295 146.363488385726 +8520 0.8520 23.4145015610801153 146.381594896526 +8521 0.8521 23.3998624969380451 146.399687944866 +8522 0.8522 23.3852216241632540 146.417767550942 +8523 0.8523 23.3705789440989591 146.435833734952 +8524 0.8524 23.3559344580863559 146.453886517089 +8525 0.8525 23.3412881674646258 146.471925917549 +8526 0.8526 23.3266400735709212 146.489951956525 +8527 0.8527 23.3119901777403840 146.507964654208 +8528 0.8528 23.2973384813061344 146.525964030791 +8529 0.8529 23.2826849855992712 146.543950106462 +8530 0.8530 23.2680296919488789 146.561922901410 +8531 0.8531 23.2533726016820168 146.579882435825 +8532 0.8532 23.2387137161237298 146.597828729891 +8533 0.8533 23.2240530365970450 146.615761803796 +8534 0.8534 23.2093905644229679 146.633681677723 +8535 0.8535 23.1947263009204896 146.651588371856 +8536 0.8536 23.1800602474065762 146.669481906378 +8537 0.8537 23.1653924051961830 146.687362301470 +8538 0.8538 23.1507227756022438 146.705229577311 +8539 0.8539 23.1360513599356743 146.723083754082 +8540 0.8540 23.1213781595053725 146.740924851959 +8541 0.8541 23.1067031756182182 146.758752891121 +8542 0.8542 23.0920264095790735 146.776567891741 +8543 0.8543 23.0773478626907860 146.794369873994 +8544 0.8544 23.0626675362541818 146.812158858055 +8545 0.8545 23.0479854315680726 146.829934864094 +8546 0.8546 23.0333015499292522 146.847697912284 +8547 0.8547 23.0186158926325000 146.865448022793 +8548 0.8548 23.0039284609705703 146.883185215790 +8549 0.8549 22.9892392562342103 146.900909511445 +8550 0.8550 22.9745482797121419 146.918620929921 +8551 0.8551 22.9598555326910763 146.936319491383 +8552 0.8552 22.9451610164557067 146.954005215996 +8553 0.8553 22.9304647322887121 146.971678123922 +8554 0.8554 22.9157666814707497 146.989338235323 +8555 0.8555 22.9010668652804661 147.006985570360 +8556 0.8556 22.8863652849944899 147.024620149189 +8557 0.8557 22.8716619418874316 147.042241991971 +8558 0.8558 22.8569568372318912 147.059851118860 +8559 0.8559 22.8422499722984469 147.077447550012 +8560 0.8560 22.8275413483556662 147.095031305581 +8561 0.8561 22.8128309666701021 147.112602405720 +8562 0.8562 22.7981188285062863 147.130160870578 +8563 0.8563 22.7834049351267431 147.147706720309 +8564 0.8564 22.7686892877919753 147.165239975058 +8565 0.8565 22.7539718877604749 147.182760654975 +8566 0.8566 22.7392527362887158 147.200268780205 +8567 0.8567 22.7245318346311613 147.217764370894 +8568 0.8568 22.7098091840402567 147.235247447185 +8569 0.8569 22.6950847857664364 147.252718029220 +8570 0.8570 22.6803586410581168 147.270176137141 +8571 0.8571 22.6656307511617072 147.287621791086 +8572 0.8572 22.6509011173215917 147.305055011193 +8573 0.8573 22.6361697407801508 147.322475817601 +8574 0.8574 22.6214366227777468 147.339884230446 +8575 0.8575 22.6067017645527315 147.357280269859 +8576 0.8576 22.5919651673414386 147.374663955975 +8577 0.8577 22.5772268323781944 147.392035308928 +8578 0.8578 22.5624867608953075 147.409394348843 +8579 0.8579 22.5477449541230719 147.426741095853 +8580 0.8580 22.5330014132897745 147.444075570083 +8581 0.8581 22.5182561396216876 147.461397791660 +8582 0.8582 22.5035091343430693 147.478707780709 +8583 0.8583 22.4887603986761668 147.496005557352 +8584 0.8584 22.4740099338412129 147.513291141713 +8585 0.8585 22.4592577410564331 147.530564553909 +8586 0.8586 22.4445038215380350 147.547825814062 +8587 0.8587 22.4297481765002189 147.565074942289 +8588 0.8588 22.4149908071551707 147.582311958705 +8589 0.8589 22.4002317147130654 147.599536883426 +8590 0.8590 22.3854709003820673 147.616749736565 +8591 0.8591 22.3707083653683263 147.633950538232 +8592 0.8592 22.3559441108759884 147.651139308541 +8593 0.8593 22.3411781381071819 147.668316067597 +8594 0.8594 22.3264104482620276 147.685480835510 +8595 0.8595 22.3116410425386320 147.702633632385 +8596 0.8596 22.2968699221330979 147.719774478327 +8597 0.8597 22.2820970882395102 147.736903393439 +8598 0.8598 22.2673225420499463 147.754020397823 +8599 0.8599 22.2525462847544766 147.771125511576 +8600 0.8600 22.2377683175411569 147.788218754801 +8601 0.8601 22.2229886415960358 147.805300147592 +8602 0.8602 22.2082072581031547 147.822369710045 +8603 0.8603 22.1934241682445403 147.839427462254 +8604 0.8604 22.1786393732002125 147.856473424312 +8605 0.8605 22.1638528741481799 147.873507616309 +8606 0.8606 22.1490646722644478 147.890530058336 +8607 0.8607 22.1342747687230066 147.907540770480 +8608 0.8608 22.1194831646958399 147.924539772828 +8609 0.8609 22.1046898613529237 147.941527085461 +8610 0.8610 22.0898948598622269 147.958502728468 +8611 0.8611 22.0750981613897075 147.975466721926 +8612 0.8612 22.0602997670993162 147.992419085918 +8613 0.8613 22.0454996781529928 148.009359840520 +8614 0.8614 22.0306978957106772 148.026289005810 +8615 0.8615 22.0158944209302945 148.043206601864 +8616 0.8616 22.0010892549677628 148.060112648755 +8617 0.8617 21.9862823989769964 148.077007166555 +8618 0.8618 21.9714738541099024 148.093890175335 +8619 0.8619 21.9566636215163768 148.110761695163 +8620 0.8620 21.9418517023443123 148.127621746107 +8621 0.8621 21.9270380977395938 148.144470348232 +8622 0.8622 21.9122228088461029 148.161307521602 +8623 0.8623 21.8974058368057101 148.178133286282 +8624 0.8624 21.8825871827582787 148.194947662328 +8625 0.8625 21.8677668478416720 148.211750669802 +8626 0.8626 21.8529448331917422 148.228542328762 +8627 0.8627 21.8381211399423414 148.245322659261 +8628 0.8628 21.8232957692253109 148.262091681356 +8629 0.8629 21.8084687221704883 148.278849415097 +8630 0.8630 21.7936399999057073 148.295595880538 +8631 0.8631 21.7788096035567946 148.312331097724 +8632 0.8632 21.7639775342475730 148.329055086705 +8633 0.8633 21.7491437930998615 148.345767867527 +8634 0.8634 21.7343083812334719 148.362469460231 +8635 0.8635 21.7194712997662158 148.379159884863 +8636 0.8636 21.7046325498139012 148.395839161461 +8637 0.8637 21.6897921324903251 148.412507310066 +8638 0.8638 21.6749500489072879 148.429164350712 +8639 0.8639 21.6601063001745793 148.445810303438 +8640 0.8640 21.6452608873999921 148.462445188275 +8641 0.8641 21.6304138116893157 148.479069025256 +8642 0.8642 21.6155650741463319 148.495681834411 +8643 0.8643 21.6007146758728226 148.512283635768 +8644 0.8644 21.5858626179685658 148.528874449354 +8645 0.8645 21.5710089015313393 148.545454295195 +8646 0.8646 21.5561535276569138 148.562023193313 +8647 0.8647 21.5412964974390633 148.578581163730 +8648 0.8648 21.5264378119695543 148.595128226464 +8649 0.8649 21.5115774723381534 148.611664401534 +8650 0.8650 21.4967154796326305 148.628189708958 +8651 0.8651 21.4818518349387446 148.644704168746 +8652 0.8652 21.4669865393402617 148.661207800914 +8653 0.8653 21.4521195939189440 148.677700625470 +8654 0.8654 21.4372509997545500 148.694182662425 +8655 0.8655 21.4223807579248380 148.710653931785 +8656 0.8656 21.4075088695055697 148.727114453555 +8657 0.8657 21.3926353355705068 148.743564247738 +8658 0.8658 21.3777601571914033 148.760003334338 +8659 0.8659 21.3628833354380205 148.776431733351 +8660 0.8660 21.3480048713781159 148.792849464777 +8661 0.8661 21.3331247660774466 148.809256548612 +8662 0.8662 21.3182430205997733 148.825653004849 +8663 0.8663 21.3033596360068564 148.842038853480 +8664 0.8664 21.2884746133584564 148.858414114499 +8665 0.8665 21.2735879537123367 148.874778807889 +8666 0.8666 21.2586996581242609 148.891132953642 +8667 0.8667 21.2438097276479922 148.907476571738 +8668 0.8668 21.2289181633352975 148.923809682163 +8669 0.8669 21.2140249662359430 148.940132304896 +8670 0.8670 21.1991301373977024 148.956444459919 +8671 0.8671 21.1842336778663451 148.972746167206 +8672 0.8672 21.1693355886856480 148.989037446733 +8673 0.8673 21.1544358708973874 149.005318318474 +8674 0.8674 21.1395345255413432 149.021588802400 +8675 0.8675 21.1246315536552984 149.037848918481 +8676 0.8676 21.1097269562750398 149.054098686684 +8677 0.8677 21.0948207344343572 149.070338126975 +8678 0.8678 21.0799128891650440 149.086567259317 +8679 0.8679 21.0650034214968933 149.102786103672 +8680 0.8680 21.0500923324577087 149.118994680000 +8681 0.8681 21.0351796230732973 149.135193008259 +8682 0.8682 21.0202652943674657 149.151381108405 +8683 0.8683 21.0053493473620243 149.167559000390 +8684 0.8684 20.9904317830767972 149.183726704168 +8685 0.8685 20.9755126025296050 149.199884239688 +8686 0.8686 20.9605918067362751 149.216031626898 +8687 0.8687 20.9456693967106418 149.232168885744 +8688 0.8688 20.9307453734645463 149.248296036170 +8689 0.8689 20.9158197380078335 149.264413098118 +8690 0.8690 20.9008924913483511 149.280520091528 +8691 0.8691 20.8859636344919579 149.296617036337 +8692 0.8692 20.8710331684425157 149.312703952481 +8693 0.8693 20.8561010942018967 149.328780859894 +8694 0.8694 20.8411674127699769 149.344847778509 +8695 0.8695 20.8262321251446387 149.360904728255 +8696 0.8696 20.8112952323217719 149.376951729059 +8697 0.8697 20.7963567352952765 149.392988800847 +8698 0.8698 20.7814166350570559 149.409015963544 +8699 0.8699 20.7664749325970242 149.425033237069 +8700 0.8700 20.7515316289031020 149.441040641343 +8701 0.8701 20.7365867249612208 149.457038196285 +8702 0.8702 20.7216402217553153 149.473025921808 +8703 0.8703 20.7066921202673342 149.489003837825 +8704 0.8704 20.6917424214772296 149.504971964250 +8705 0.8705 20.6767911263629678 149.520930320990 +8706 0.8706 20.6618382359005217 149.536878927952 +8707 0.8707 20.6468837510638714 149.552817805041 +8708 0.8708 20.6319276728250109 149.568746972161 +8709 0.8709 20.6169700021539413 149.584666449211 +8710 0.8710 20.6020107400186774 149.600576256091 +8711 0.8711 20.5870498873852377 149.616476412698 +8712 0.8712 20.5720874452176581 149.632366938924 +8713 0.8713 20.5571234144779780 149.648247854663 +8714 0.8714 20.5421577961262543 149.664119179803 +8715 0.8715 20.5271905911205508 149.679980934236 +8716 0.8716 20.5122218004169454 149.695833137843 +8717 0.8717 20.4972514249695266 149.711675810511 +8718 0.8718 20.4822794657303966 149.727508972121 +8719 0.8719 20.4673059236496613 149.743332642551 +8720 0.8720 20.4523307996754511 149.759146841679 +8721 0.8721 20.4373540947538999 149.774951589380 +8722 0.8722 20.4223758098291555 149.790746905526 +8723 0.8723 20.4073959458433798 149.806532809988 +8724 0.8724 20.3924145037367488 149.822309322636 +8725 0.8725 20.3774314844474489 149.838076463333 +8726 0.8726 20.3624468889116841 149.853834251946 +8727 0.8727 20.3474607180636688 149.869582708336 +8728 0.8728 20.3324729728356353 149.885321852362 +8729 0.8729 20.3174836541578223 149.901051703881 +8730 0.8730 20.3024927629584901 149.916772282749 +8731 0.8731 20.2875003001639129 149.932483608818 +8732 0.8732 20.2725062666983753 149.948185701941 +8733 0.8733 20.2575106634841795 149.963878581964 +8734 0.8734 20.2425134914416454 149.979562268735 +8735 0.8735 20.2275147514891032 149.995236782096 +8736 0.8736 20.2125144445429044 150.010902141891 +8737 0.8737 20.1975125715174109 150.026558367958 +8738 0.8738 20.1825091333250057 150.042205480133 +8739 0.8739 20.1675041308760861 150.057843498255 +8740 0.8740 20.1524975650790665 150.073472442152 +8741 0.8741 20.1374894368403758 150.089092331658 +8742 0.8742 20.1224797470644639 150.104703186599 +8743 0.8743 20.1074684966537944 150.120305026802 +8744 0.8744 20.0924556865088491 150.135897872090 +8745 0.8745 20.0774413175281303 150.151481742284 +8746 0.8746 20.0624253906081549 150.167056657203 +8747 0.8747 20.0474079066434605 150.182622636665 +8748 0.8748 20.0323888665266026 150.198179700482 +8749 0.8749 20.0173682711481540 150.213727868467 +8750 0.8750 20.0023461213967089 150.229267160430 +8751 0.8751 19.9873224181588789 150.244797596178 +8752 0.8752 19.9722971623192933 150.260319195517 +8753 0.8753 19.9572703547606061 150.275831978247 +8754 0.8754 19.9422419963634852 150.291335964172 +8755 0.8755 19.9272120880066232 150.306831173088 +8756 0.8756 19.9121806305667306 150.322317624790 +8757 0.8757 19.8971476249185386 150.337795339071 +8758 0.8758 19.8821130719347998 150.353264335724 +8759 0.8759 19.8670769724862879 150.368724634536 +8760 0.8760 19.8520393274417977 150.384176255293 +8761 0.8761 19.8370001376681451 150.399619217781 +8762 0.8762 19.8219594040301672 150.415053541778 +8763 0.8763 19.8069171273907259 150.430479247064 +8764 0.8764 19.7918733086107004 150.445896353417 +8765 0.8765 19.7768279485489984 150.461304880611 +8766 0.8766 19.7617810480625486 150.476704848417 +8767 0.8767 19.7467326080062975 150.492096276604 +8768 0.8768 19.7316826292332195 150.507479184940 +8769 0.8769 19.7166311125943139 150.522853593190 +8770 0.8770 19.7015780589385976 150.538219521114 +8771 0.8771 19.6865234691131192 150.553576988473 +8772 0.8772 19.6714673439629451 150.568926015024 +8773 0.8773 19.6564096843311660 150.584266620523 +8774 0.8774 19.6413504910589047 150.599598824720 +8775 0.8775 19.6262897649853016 150.614922647367 +8776 0.8776 19.6112275069475217 150.630238108210 +8777 0.8777 19.5961637177807617 150.645545226995 +8778 0.8778 19.5810983983182396 150.660844023465 +8779 0.8779 19.5660315493911980 150.676134517359 +8780 0.8780 19.5509631718289079 150.691416728414 +8781 0.8781 19.5358932664586682 150.706690676367 +8782 0.8782 19.5208218341058028 150.721956380949 +8783 0.8783 19.5057488755936603 150.737213861891 +8784 0.8784 19.4906743917436209 150.752463138921 +8785 0.8785 19.4755983833750861 150.767704231762 +8786 0.8786 19.4605208513054926 150.782937160139 +8787 0.8787 19.4454417963502983 150.798161943771 +8788 0.8788 19.4303612193229895 150.813378602377 +8789 0.8789 19.4152791210350877 150.828587155670 +8790 0.8790 19.4001955022961354 150.843787623364 +8791 0.8791 19.3851103639137072 150.858980025168 +8792 0.8792 19.3700237066934093 150.874164380790 +8793 0.8793 19.3549355314388727 150.889340709935 +8794 0.8794 19.3398458389517600 150.904509032305 +8795 0.8795 19.3247546300317659 150.919669367602 +8796 0.8796 19.3096619054766094 150.934821735521 +8797 0.8797 19.2945676660820453 150.949966155756 +8798 0.8798 19.2794719126418563 150.965102648002 +8799 0.8799 19.2643746459478606 150.980231231946 +8800 0.8800 19.2492758667899011 150.995351927277 +8801 0.8801 19.2341755759558524 151.010464753678 +8802 0.8802 19.2190737742316280 151.025569730831 +8803 0.8803 19.2039704624011662 151.040666878417 +8804 0.8804 19.1888656412464407 151.055756216110 +8805 0.8805 19.1737593115474567 151.070837763586 +8806 0.8806 19.1586514740822516 151.085911540516 +8807 0.8807 19.1435421296268977 151.100977566570 +8808 0.8808 19.1284312789554996 151.116035861413 +8809 0.8809 19.1133189228401932 151.131086444707 +8810 0.8810 19.0982050620511536 151.146129336115 +8811 0.8811 19.0830896973565842 151.161164555297 +8812 0.8812 19.0679728295227235 151.176192121906 +8813 0.8813 19.0528544593138491 151.191212055596 +8814 0.8814 19.0377345874922668 151.206224376017 +8815 0.8815 19.0226132148183247 151.221229102818 +8816 0.8816 19.0074903420504029 151.236226255644 +8817 0.8817 18.9923659699449132 151.251215854136 +8818 0.8818 18.9772400992563099 151.266197917934 +8819 0.8819 18.9621127307370791 151.281172466677 +8820 0.8820 18.9469838651377458 151.296139519998 +8821 0.8821 18.9318535032068702 151.311099097531 +8822 0.8822 18.9167216456910481 151.326051218902 +8823 0.8823 18.9015882933349175 151.340995903740 +8824 0.8824 18.8864534468811485 151.355933171667 +8825 0.8825 18.8713171070704497 151.370863042304 +8826 0.8826 18.8561792746415726 151.385785535271 +8827 0.8827 18.8410399503313002 151.400700670184 +8828 0.8828 18.8258991348744580 151.415608466652 +8829 0.8829 18.8107568290039104 151.430508944290 +8830 0.8830 18.7956130334505609 151.445402122703 +8831 0.8831 18.7804677489433516 151.460288021496 +8832 0.8832 18.7653209762092636 151.475166660273 +8833 0.8833 18.7501727159733171 151.490038058629 +8834 0.8834 18.7350229689585781 151.504902236165 +8835 0.8835 18.7198717358861479 151.519759212472 +8836 0.8836 18.7047190174751670 151.534609007144 +8837 0.8837 18.6895648144428215 151.549451639765 +8838 0.8838 18.6744091275043367 151.564287129925 +8839 0.8839 18.6592519573729803 151.579115497204 +8840 0.8840 18.6440933047600623 151.593936761182 +8841 0.8841 18.6289331703749319 151.608750941438 +8842 0.8842 18.6137715549249840 151.623558057546 +8843 0.8843 18.5986084591156526 151.638358129076 +8844 0.8844 18.5834438836504177 151.653151175599 +8845 0.8845 18.5682778292308051 151.667937216680 +8846 0.8846 18.5531102965563761 151.682716271883 +8847 0.8847 18.5379412863247452 151.697488360768 +8848 0.8848 18.5227707992315622 151.712253502892 +8849 0.8849 18.5075988359705264 151.727011717811 +8850 0.8850 18.4924253972333830 151.741763025077 +8851 0.8851 18.4772504837099163 151.756507444239 +8852 0.8852 18.4620740960879637 151.771244994843 +8853 0.8853 18.4468962350534014 151.785975696434 +8854 0.8854 18.4317169012901516 151.800699568550 +8855 0.8855 18.4165360954801862 151.815416630732 +8856 0.8856 18.4013538183035230 151.830126902512 +8857 0.8857 18.3861700704382258 151.844830403426 +8858 0.8858 18.3709848525604045 151.859527153001 +8859 0.8859 18.3557981653442148 151.874217170762 +8860 0.8860 18.3406100094618658 151.888900476235 +8861 0.8861 18.3254203855836053 151.903577088940 +8862 0.8862 18.3102292943777378 151.918247028395 +8863 0.8863 18.2950367365106139 151.932910314115 +8864 0.8864 18.2798427126466265 151.947566965613 +8865 0.8865 18.2646472234482253 151.962217002396 +8866 0.8866 18.2494502695759060 151.976860443972 +8867 0.8867 18.2342518516882137 151.991497309844 +8868 0.8868 18.2190519704417468 152.006127619512 +8869 0.8869 18.2038506264911462 152.020751392475 +8870 0.8870 18.1886478204891127 152.035368648226 +8871 0.8871 18.1734435530863898 152.049979406259 +8872 0.8872 18.1582378249317742 152.064583686060 +8873 0.8873 18.1430306366721155 152.079181507118 +8874 0.8874 18.1278219889523129 152.093772888913 +8875 0.8875 18.1126118824153224 152.108357850928 +8876 0.8876 18.0974003177021459 152.122936412637 +8877 0.8877 18.0821872954518383 152.137508593516 +8878 0.8878 18.0669728163015115 152.152074413036 +8879 0.8879 18.0517568808863267 152.166633890666 +8880 0.8880 18.0365394898394982 152.181187045871 +8881 0.8881 18.0213206437923006 152.195733898111 +8882 0.8882 18.0061003433740510 152.210274466849 +8883 0.8883 17.9908785892121301 152.224808771539 +8884 0.8884 17.9756553819319720 152.239336831636 +8885 0.8885 17.9604307221570600 152.253858666588 +8886 0.8886 17.9452046105089380 152.268374295845 +8887 0.8887 17.9299770476072027 152.282883738850 +8888 0.8888 17.9147480340695076 152.297387015044 +8889 0.8889 17.8995175705115628 152.311884143867 +8890 0.8890 17.8842856575471316 152.326375144754 +8891 0.8891 17.8690522957880376 152.340860037138 +8892 0.8892 17.8538174858441572 152.355338840446 +8893 0.8893 17.8385812283234308 152.369811574106 +8894 0.8894 17.8233435238318485 152.384278257542 +8895 0.8895 17.8081043729734638 152.398738910173 +8896 0.8896 17.7928637763503836 152.413193551418 +8897 0.8897 17.7776217345627785 152.427642200689 +8898 0.8898 17.7623782482088757 152.442084877397 +8899 0.8899 17.7471333178849591 152.456521600954 +8900 0.8900 17.7318869441853728 152.470952390762 +8901 0.8901 17.7166391277025248 152.485377266223 +8902 0.8902 17.7013898690268761 152.499796246736 +8903 0.8903 17.6861391687469549 152.514209351698 +8904 0.8904 17.6708870274493464 152.528616600502 +8905 0.8905 17.6556334457186956 152.543018012536 +8906 0.8906 17.6403784241377082 152.557413607188 +8907 0.8907 17.6251219632871567 152.571803403841 +8908 0.8908 17.6098640637458708 152.586187421876 +8909 0.8909 17.5946047260907434 152.600565680670 +8910 0.8910 17.5793439508967317 152.614938199598 +8911 0.8911 17.5640817387368493 152.629304998030 +8912 0.8912 17.5488180901821806 152.643666095335 +8913 0.8913 17.5335530058018705 152.658021510876 +8914 0.8914 17.5182864861631273 152.672371264018 +8915 0.8915 17.5030185318312199 152.686715374118 +8916 0.8916 17.4877491433694878 152.701053860531 +8917 0.8917 17.4724783213393309 152.715386742611 +8918 0.8918 17.4572060663002162 152.729714039704 +8919 0.8919 17.4419323788096747 152.744035771161 +8920 0.8920 17.4266572594233011 152.758351956322 +8921 0.8921 17.4113807086947574 152.772662614527 +8922 0.8922 17.3961027271757764 152.786967765112 +8923 0.8923 17.3808233154161513 152.801267427413 +8924 0.8924 17.3655424739637425 152.815561620759 +8925 0.8925 17.3502602033644813 152.829850364476 +8926 0.8926 17.3349765041623627 152.844133677889 +8927 0.8927 17.3196913768994527 152.858411580319 +8928 0.8928 17.3044048221158810 152.872684091084 +8929 0.8929 17.2891168403498519 152.886951229498 +8930 0.8930 17.2738274321376331 152.901213014873 +8931 0.8931 17.2585365980135634 152.915469466514 +8932 0.8932 17.2432443385100527 152.929720603729 +8933 0.8933 17.2279506541575742 152.943966445820 +8934 0.8934 17.2126555454846795 152.958207012083 +8935 0.8935 17.1973590130179836 152.972442321815 +8936 0.8936 17.1820610572821764 152.986672394306 +8937 0.8937 17.1667616788000181 153.000897248847 +8938 0.8938 17.1514608780923403 153.015116904723 +8939 0.8939 17.1361586556780452 153.029331381215 +8940 0.8940 17.1208550120741059 153.043540697602 +8941 0.8941 17.1055499477955664 153.057744873163 +8942 0.8942 17.0902434633555487 153.071943927166 +8943 0.8943 17.0749355592652456 153.086137878884 +8944 0.8944 17.0596262360339210 153.100326747580 +8945 0.8945 17.0443154941689166 153.114510552518 +8946 0.8946 17.0290033341756413 153.128689312959 +8947 0.8947 17.0136897565575858 153.142863048157 +8948 0.8948 16.9983747618163079 153.157031777367 +8949 0.8949 16.9830583504514472 153.171195519836 +8950 0.8950 16.9677405229607139 153.185354294812 +8951 0.8951 16.9524212798398963 153.199508121537 +8952 0.8952 16.9371006215828572 153.213657019253 +8953 0.8953 16.9217785486815337 153.227801007196 +8954 0.8954 16.9064550616259446 153.241940104596 +8955 0.8955 16.8911301609041793 153.256074330685 +8956 0.8956 16.8758038470024090 153.270203704690 +8957 0.8957 16.8604761204048827 153.284328245834 +8958 0.8958 16.8451469815939241 153.298447973336 +8959 0.8959 16.8298164310499381 153.312562906413 +8960 0.8960 16.8144844692514042 153.326673064279 +8961 0.8961 16.7991510966748834 153.340778466142 +8962 0.8962 16.7838163137950147 153.354879131211 +8963 0.8963 16.7684801210845187 153.368975078687 +8964 0.8964 16.7531425190141974 153.383066327770 +8965 0.8965 16.7378035080529273 153.397152897658 +8966 0.8966 16.7224630886676664 153.411234807542 +8967 0.8967 16.7071212613234579 153.425312076614 +8968 0.8968 16.6917780264834228 153.439384724058 +8969 0.8969 16.6764333846087673 153.453452769059 +8970 0.8970 16.6610873361587757 153.467516230796 +8971 0.8971 16.6457398815908135 153.481575128443 +8972 0.8972 16.6303910213603316 153.495629481177 +8973 0.8973 16.6150407559208659 153.509679308164 +8974 0.8974 16.5996890857240302 153.523724628571 +8975 0.8975 16.5843360112195235 153.537765461561 +8976 0.8976 16.5689815328551298 153.551801826293 +8977 0.8977 16.5536256510767181 153.565833741923 +8978 0.8978 16.5382683663282428 153.579861227601 +8979 0.8979 16.5229096790517396 153.593884302480 +8980 0.8980 16.5075495896873292 153.607902985703 +8981 0.8981 16.4921880986732248 153.621917296412 +8982 0.8982 16.4768252064457172 153.635927253747 +8983 0.8983 16.4614609134391863 153.649932876842 +8984 0.8984 16.4460952200861037 153.663934184829 +8985 0.8985 16.4307281268170193 153.677931196836 +8986 0.8986 16.4153596340605787 153.691923931989 +8987 0.8987 16.3999897422435090 153.705912409408 +8988 0.8988 16.3846184517906295 153.719896648211 +8989 0.8989 16.3692457631248445 153.733876667514 +8990 0.8990 16.3538716766671470 153.747852486427 +8991 0.8991 16.3384961928366224 153.761824124057 +8992 0.8992 16.3231193120504443 153.775791599508 +8993 0.8993 16.3077410347238754 153.789754931881 +8994 0.8994 16.2923613612702667 153.803714140272 +8995 0.8995 16.2769802921010651 153.817669243778 +8996 0.8996 16.2615978276258026 153.831620261484 +8997 0.8997 16.2462139682521034 153.845567212479 +8998 0.8998 16.2308287143856873 153.859510115847 +8999 0.8999 16.2154420664303629 153.873448990666 +9000 0.9000 16.2000540247880274 153.887383856012 +9001 0.9001 16.1846645898586949 153.901314730622 +9002 0.9002 16.1692737620407030 153.915241629199 +9003 0.9003 16.1538815417313053 153.929164558746 +9004 0.9004 16.1384879293274537 153.943083518271 +9005 0.9005 16.1230929252265973 153.956998498837 +9006 0.9006 16.1076965298274750 153.970909483599 +9007 0.9007 16.0922987435309039 153.984816447856 +9008 0.9008 16.0768995667405576 153.998719359089 +9009 0.9009 16.0614989998637512 154.012618177006 +9010 0.9010 16.0460970433122228 154.026512853594 +9011 0.9011 16.0306936975028869 154.040403333151 +9012 0.9012 16.0152889628586124 154.054289552340 +9013 0.9013 15.9998828398089845 154.068171440224 +9014 0.9014 15.9844753287910581 154.082048918320 +9015 0.9015 15.9690664302501109 154.095921900636 +9016 0.9016 15.9536561446403944 154.109790293710 +9017 0.9017 15.9382444724258754 154.123653996666 +9018 0.9018 15.9228314140809797 154.137512901250 +9019 0.9019 15.9074169700913242 154.151366891870 +9020 0.9020 15.8920011409544486 154.165215845647 +9021 0.9021 15.8765839271805440 154.179059632451 +9022 0.9022 15.8611653292931738 154.192898114947 +9023 0.9023 15.8457453478299950 154.206731148644 +9024 0.9024 15.8303239833434670 154.220558581926 +9025 0.9025 15.8149012364015658 154.234380256103 +9026 0.9026 15.7994771075884888 154.248196005451 +9027 0.9027 15.7840515975053535 154.262005657255 +9028 0.9028 15.7686247067708987 154.275809031853 +9029 0.9029 15.7531964360221721 154.289605942673 +9030 0.9030 15.7377667859152250 154.303396196284 +9031 0.9031 15.7223357571257889 154.317179592428 +9032 0.9032 15.7069033503499647 154.330955924073 +9033 0.9033 15.6914695663048889 154.344724977445 +9034 0.9034 15.6760344057294123 154.358486532080 +9035 0.9035 15.6605978693847661 154.372240360850 +9036 0.9036 15.6451599580552223 154.385986230025 +9037 0.9037 15.6297206725487570 154.399723899299 +9038 0.9038 15.6142800136976998 154.413453121840 +9039 0.9039 15.5988379823593917 154.427173644328 +9040 0.9040 15.5833945794168258 154.440885206993 +9041 0.9041 15.5679498057792927 154.454587543667 +9042 0.9042 15.5525036623830193 154.468280381812 +9043 0.9043 15.5370561501918001 154.481963442572 +9044 0.9044 15.5216072701976309 154.495636440808 +9045 0.9045 15.5061570234213342 154.509299085139 +9046 0.9046 15.4907054109131774 154.522951077983 +9047 0.9047 15.4752524337534982 154.536592115606 +9048 0.9048 15.4597980930533101 154.550221888147 +9049 0.9049 15.4443423899549188 154.563840079673 +9050 0.9050 15.4288853256325247 154.577446368210 +9051 0.9051 15.4134269012928247 154.591040425787 +9052 0.9052 15.3979671181756110 154.604621918480 +9053 0.9053 15.3825059775543647 154.618190506443 +9054 0.9054 15.3670434807368448 154.631745843959 +9055 0.9055 15.3515796290656734 154.645287579466 +9056 0.9056 15.3361144239189198 154.658815355616 +9057 0.9057 15.3206478667106740 154.672328809295 +9058 0.9058 15.3051799588916246 154.685827571678 +9059 0.9059 15.2897107019496286 154.699311268257 +9060 0.9060 15.2742400974102708 154.712779518891 +9061 0.9061 15.2587681468374345 154.726231937839 +9062 0.9062 15.2432948518338520 154.739668133797 +9063 0.9063 15.2278202140416656 154.753087709943 +9064 0.9064 15.2123442351429699 154.766490263978 +9065 0.9065 15.1968669168603636 154.779875388157 +9066 0.9066 15.1813882609574886 154.793242669330 +9067 0.9067 15.1659082692395728 154.806591688991 +9068 0.9068 15.1504269435539580 154.819922023300 +9069 0.9069 15.1349442857906364 154.833233243138 +9070 0.9070 15.1194602978827728 154.846524914132 +9071 0.9071 15.1039749818072302 154.859796596703 +9072 0.9072 15.0884883395850906 154.873047846101 +9073 0.9073 15.0730003732821629 154.886278212443 +9074 0.9074 15.0575110850095033 154.899487240749 +9075 0.9075 15.0420204769239163 154.912674470988 +9076 0.9076 15.0265285512284610 154.925839438108 +9077 0.9077 15.0110353101729519 154.938981672074 +9078 0.9078 14.9955407560544529 154.952100697915 +9079 0.9079 14.9800448912177693 154.965196035750 +9080 0.9080 14.9645477180559396 154.978267200836 +9081 0.9081 14.9490492390107175 154.991313703594 +9082 0.9082 14.9335494565730542 155.004335049661 +9083 0.9083 14.9180483732835754 155.017330739915 +9084 0.9084 14.9025459917330529 155.030300270517 +9085 0.9085 14.8870423145628799 155.043243132952 +9086 0.9086 14.8715373444655299 155.056158814056 +9087 0.9087 14.8560310841850232 155.069046796066 +9088 0.9088 14.8405235365173880 155.081906556648 +9089 0.9089 14.8250147043111085 155.094737568934 +9090 0.9090 14.8095045904675828 155.107539301566 +9091 0.9091 14.7939931979415693 155.120311218722 +9092 0.9092 14.7784805297416248 155.133052780162 +9093 0.9093 14.7629665889305546 155.145763441260 +9094 0.9094 14.7474513786258399 155.158442653043 +9095 0.9095 14.7319349020000772 155.171089862221 +9096 0.9096 14.7164171622814042 155.183704511233 +9097 0.9097 14.7008981627539281 155.196286038275 +9098 0.9098 14.6853779067581467 155.208833877341 +9099 0.9099 14.6698563976913672 155.221347458253 +9100 0.9100 14.6543336390081187 155.233826206704 +9101 0.9101 14.6388096342205696 155.246269544291 +9102 0.9102 14.6232843868989271 155.258676888551 +9103 0.9103 14.6077579006718494 155.271047652990 +9104 0.9104 14.5922301792268438 155.283381247134 +9105 0.9105 14.5767012263106608 155.295677076544 +9106 0.9106 14.5611710457296901 155.307934542871 +9107 0.9107 14.5456396413503519 155.320153043877 +9108 0.9108 14.5301070170994837 155.332331973478 +9109 0.9109 14.5145731769647206 155.344470721777 +9110 0.9110 14.4990381249948772 155.356568675096 +9111 0.9111 14.4835018653003225 155.368625216016 +9112 0.9112 14.4679644020533509 155.380639723405 +9113 0.9113 14.4524257394885574 155.392611572461 +9114 0.9114 14.4368858819031978 155.404540134743 +9115 0.9115 14.4213448336575514 155.416424778200 +9116 0.9116 14.4058025991752814 155.428264867214 +9117 0.9117 14.3902591829437885 155.440059762631 +9118 0.9118 14.3747145895145678 155.451808821792 +9119 0.9119 14.3591688235035502 155.463511398573 +9120 0.9120 14.3436218895914500 155.475166843413 +9121 0.9121 14.3280737925241120 155.486774503354 +9122 0.9122 14.3125245371128411 155.498333722070 +9123 0.9123 14.2969741282347425 155.509843839903 +9124 0.9124 14.2814225708330529 155.521304193897 +9125 0.9125 14.2658698699174664 155.532714117831 +9126 0.9126 14.2503160305644627 155.544072942251 +9127 0.9127 14.2347610579176251 155.555379994505 +9128 0.9128 14.2192049571879604 155.566634598779 +9129 0.9129 14.2036477336542148 155.577836076122 +9130 0.9130 14.1880893926631835 155.588983744493 +9131 0.9131 14.1725299396300208 155.600076918775 +9132 0.9132 14.1569693800385412 155.611114910829 +9133 0.9133 14.1414077194415242 155.622097029509 +9134 0.9134 14.1258449634610130 155.633022580705 +9135 0.9135 14.1102811177886096 155.643890867373 +9136 0.9136 14.0947161881857621 155.654701189568 +9137 0.9137 14.0791501804840600 155.665452844473 +9138 0.9138 14.0635831005855145 155.676145126439 +9139 0.9139 14.0480149544628414 155.686777327012 +9140 0.9140 14.0324457481597431 155.697348734962 +9141 0.9141 14.0168754877911788 155.707858636324 +9142 0.9142 14.0013041795436415 155.718306314422 +9143 0.9143 13.9857318296754247 155.728691049906 +9144 0.9144 13.9701584445168905 155.739012120783 +9145 0.9145 13.9545840304707287 155.749268802446 +9146 0.9146 13.9390085940122201 155.759460367709 +9147 0.9147 13.9234321416894922 155.769586086835 +9148 0.9148 13.9078546801237710 155.779645227573 +9149 0.9149 13.8922762160096323 155.789637055185 +9150 0.9150 13.8766967561152494 155.799560832478 +9151 0.9151 13.8611163072826340 155.809415819836 +9152 0.9152 13.8455348764278803 155.819201275253 +9153 0.9153 13.8299524705414001 155.828916454360 +9154 0.9154 13.8143690966881589 155.838560610458 +9155 0.9155 13.7987847620079087 155.848132994551 +9156 0.9156 13.7831994737154133 155.857632855371 +9157 0.9157 13.7676132391006742 155.867059439417 +9158 0.9158 13.7520260655291544 155.876411990981 +9159 0.9159 13.7364379604419966 155.885689752176 +9160 0.9160 13.7208489313562385 155.894891962971 +9161 0.9161 13.7052589858650293 155.904017861216 +9162 0.9162 13.6896681316378341 155.913066682683 +9163 0.9163 13.6740763764206452 155.922037661083 +9164 0.9164 13.6584837280361864 155.930930028107 +9165 0.9165 13.6428901943841083 155.939743013446 +9166 0.9166 13.6272957834411947 155.948475844829 +9167 0.9167 13.6117005032615506 155.957127748050 +9168 0.9168 13.5961043619767974 155.965697946999 +9169 0.9169 13.5805073677962636 155.974185663688 +9170 0.9170 13.5649095290071653 155.982590118281 +9171 0.9171 13.5493108539747951 155.990910529133 +9172 0.9172 13.5337113511426974 155.999146112805 +9173 0.9173 13.5181110290328519 156.007296084101 +9174 0.9174 13.5025098962458419 156.015359656102 +9175 0.9175 13.4869079614610285 156.023336040181 +9176 0.9176 13.4713052334367163 156.031224446048 +9177 0.9177 13.4557017210103247 156.039024081767 +9178 0.9178 13.4400974330985470 156.046734153791 +9179 0.9179 13.4244923786975079 156.054353866990 +9180 0.9180 13.4088865668829254 156.061882424678 +9181 0.9181 13.3932800068102598 156.069319028644 +9182 0.9182 13.3776727077148685 156.076662879174 +9183 0.9183 13.3620646789121551 156.083913175091 +9184 0.9184 13.3464559297977114 156.091069113773 +9185 0.9185 13.3308464698474634 156.098129891187 +9186 0.9186 13.3152363086178092 156.105094701913 +9187 0.9187 13.2996254557457547 156.111962739176 +9188 0.9188 13.2840139209490520 156.118733194872 +9189 0.9189 13.2684017140263286 156.125405259597 +9190 0.9190 13.2527888448572160 156.131978122672 +9191 0.9191 13.2371753234024734 156.138450972174 +9192 0.9192 13.2215611597041161 156.144822994964 +9193 0.9193 13.2059463638855323 156.151093376710 +9194 0.9194 13.1903309461516010 156.157261301919 +9195 0.9195 13.1747149167888065 156.163325953963 +9196 0.9196 13.1590982861653529 156.169286515106 +9197 0.9197 13.1434810647312705 156.175142166531 +9198 0.9198 13.1278632630185257 156.180892088369 +9199 0.9199 13.1122448916411205 156.186535459721 +9200 0.9200 13.0966259612951994 156.192071458691 +9201 0.9201 13.0810064827591450 156.197499262412 +9202 0.9202 13.0653864668936706 156.202818047068 +9203 0.9203 13.0497659246419211 156.208026987925 +9204 0.9204 13.0341448670295570 156.213125259358 +9205 0.9205 13.0185233051648463 156.218112034872 +9206 0.9206 13.0029012502387467 156.222986487136 +9207 0.9207 12.9872787135249901 156.227747788004 +9208 0.9208 12.9716557063801634 156.232395108544 +9209 0.9209 12.9560322402437826 156.236927619062 +9210 0.9210 12.9404083266383729 156.241344489130 +9211 0.9211 12.9247839771695361 156.245644887612 +9212 0.9212 12.9091592035260216 156.249827982688 +9213 0.9213 12.8935340174797926 156.253892941881 +9214 0.9214 12.8779084308860945 156.257838932083 +9215 0.9215 12.8622824556835109 156.261665119579 +9216 0.9216 12.8466561038940288 156.265370670077 +9217 0.9217 12.8310293876230883 156.268954748731 +9218 0.9218 12.8154023190596433 156.272416520159 +9219 0.9219 12.7997749104762111 156.275755148484 +9220 0.9220 12.7841471742289201 156.278969797344 +9221 0.9221 12.7685191227575565 156.282059629925 +9222 0.9222 12.7528907685856101 156.285023808989 +9223 0.9223 12.7372621243203170 156.287861496888 +9224 0.9224 12.7216332026526935 156.290571855600 +9225 0.9225 12.7060040163575767 156.293154046749 +9226 0.9226 12.6903745782936586 156.295607231627 +9227 0.9227 12.6747449014035158 156.297930571224 +9228 0.9228 12.6591149987136422 156.300123226250 +9229 0.9229 12.6434848833344713 156.302184357160 +9230 0.9230 12.6278545684604051 156.304113124176 +9231 0.9231 12.6122240673698300 156.305908687317 +9232 0.9232 12.5965933934251435 156.307570206415 +9233 0.9233 12.5809625600727646 156.309096841150 +9234 0.9234 12.5653315808431536 156.310487751061 +9235 0.9235 12.5497004693508210 156.311742095578 +9236 0.9236 12.5340692392943396 156.312859034049 +9237 0.9237 12.5184379044563485 156.313837725756 +9238 0.9238 12.5028064787035635 156.314677329942 +9239 0.9239 12.4871749759867754 156.315377005836 +9240 0.9240 12.4715434103408498 156.315935912674 +9241 0.9241 12.4559117958847292 156.316353209723 +9242 0.9242 12.4402801468214275 156.316628056309 +9243 0.9243 12.4246484774380210 156.316759611832 +9244 0.9244 12.4090168021056400 156.316747035794 +9245 0.9245 12.3933851352794591 156.316589487825 +9246 0.9246 12.3777534914986820 156.316286127699 +9247 0.9247 12.3621218853865287 156.315836115363 +9248 0.9248 12.3464903316502124 156.315238610956 +9249 0.9249 12.3308588450809236 156.314492774833 +9250 0.9250 12.3152274405538016 156.313597767593 +9251 0.9251 12.2995961330279169 156.312552750088 +9252 0.9252 12.2839649375462390 156.311356883461 +9253 0.9253 12.2683338692356081 156.310009329159 +9254 0.9254 12.2527029433067014 156.308509248959 +9255 0.9255 12.2370721750540046 156.306855804986 +9256 0.9256 12.2214415798557674 156.305048159745 +9257 0.9257 12.2058111731739736 156.303085476130 +9258 0.9258 12.1901809705542945 156.300966917457 +9259 0.9259 12.1745509876260485 156.298691647478 +9260 0.9260 12.1589212401021545 156.296258830410 +9261 0.9261 12.1432917437790859 156.293667630950 +9262 0.9262 12.1276625145368229 156.290917214305 +9263 0.9263 12.1120335683387967 156.288006746202 +9264 0.9264 12.0964049212318407 156.284935392919 +9265 0.9265 12.0807765893461294 156.281702321306 +9266 0.9266 12.0651485888951235 156.278306698801 +9267 0.9267 12.0495209361755116 156.274747693456 +9268 0.9268 12.0338936475671403 156.271024473954 +9269 0.9269 12.0182667395329617 156.267136209635 +9270 0.9270 12.0026402286189544 156.263082070514 +9271 0.9271 11.9870141314540639 156.258861227302 +9272 0.9272 11.9713884647501274 156.254472851429 +9273 0.9273 11.9557632453018030 156.249916115062 +9274 0.9274 11.9401384899864933 156.245190191128 +9275 0.9275 11.9245142157642707 156.240294253332 +9276 0.9276 11.9088904396777959 156.235227476180 +9277 0.9277 11.8932671788522377 156.229989035001 +9278 0.9278 11.8776444504951897 156.224578105962 +9279 0.9279 11.8620222718965866 156.218993866093 +9280 0.9280 11.8464006604286158 156.213235493306 +9281 0.9281 11.8307796335456299 156.207302166413 +9282 0.9282 11.8151592087840509 156.201193065151 +9283 0.9283 11.7995394037622834 156.194907370195 +9284 0.9284 11.7839202361806148 156.188444263186 +9285 0.9285 11.7683017238211178 156.181802926743 +9286 0.9286 11.7526838845475563 156.174982544490 +9287 0.9287 11.7370667363052785 156.167982301067 +9288 0.9288 11.7214502971211179 156.160801382162 +9289 0.9289 11.7058345851032843 156.153438974515 +9290 0.9290 11.6902196184412617 156.145894265951 +9291 0.9291 11.6746054154056935 156.138166445395 +9292 0.9292 11.6589919943482787 156.130254702884 +9293 0.9293 11.6433793737016540 156.122158229600 +9294 0.9294 11.6277675719792803 156.113876217874 +9295 0.9295 11.6121566077753258 156.105407861219 +9296 0.9296 11.5965464997645480 156.096752354341 +9297 0.9297 11.5809372667021737 156.087908893156 +9298 0.9298 11.5653289274237743 156.078876674816 +9299 0.9299 11.5497215008451466 156.069654897722 +9300 0.9300 11.5341150059621835 156.060242761544 +9301 0.9301 11.5185094618507442 156.050639467243 +9302 0.9302 11.5029048876665279 156.040844217084 +9303 0.9303 11.4873013026449406 156.030856214657 +9304 0.9304 11.4716987261009624 156.020674664897 +9305 0.9305 11.4560971774290135 156.010298774098 +9306 0.9306 11.4404966761028124 155.999727749938 +9307 0.9307 11.4248972416752412 155.988960801487 +9308 0.9308 11.4092988937782049 155.977997139234 +9309 0.9309 11.3937016521224876 155.966835975104 +9310 0.9310 11.3781055364976087 155.955476522468 +9311 0.9311 11.3625105667716770 155.943917996171 +9312 0.9312 11.3469167628912420 155.932159612541 +9313 0.9313 11.3313241448811439 155.920200589415 +9314 0.9314 11.3157327328443653 155.908040146149 +9315 0.9315 11.3001425469618759 155.895677503639 +9316 0.9316 11.2845536074924766 155.883111884339 +9317 0.9317 11.2689659347726465 155.870342512277 +9318 0.9318 11.2533795492163797 155.857368613070 +9319 0.9319 11.2377944713150288 155.844189413948 +9320 0.9320 11.2222107216371434 155.830804143762 +9321 0.9321 11.2066283208283046 155.817212033011 +9322 0.9322 11.1910472896109621 155.803412313849 +9323 0.9323 11.1754676487842648 155.789404220106 +9324 0.9324 11.1598894192238944 155.775186987309 +9325 0.9325 11.1443126218818946 155.760759852693 +9326 0.9326 11.1287372777864988 155.746122055218 +9327 0.9327 11.1131634080419577 155.731272835590 +9328 0.9328 11.0975910338283654 155.716211436271 +9329 0.9329 11.0820201764014765 155.700937101498 +9330 0.9330 11.0664508570925371 155.685449077308 +9331 0.9331 11.0508830973080947 155.669746611536 +9332 0.9332 11.0353169185298263 155.653828953845 +9333 0.9333 11.0197523423143462 155.637695355743 +9334 0.9334 11.0041893902930301 155.621345070588 +9335 0.9335 10.9886280841718200 155.604777353615 +9336 0.9336 10.9730684457310428 155.587991461942 +9337 0.9337 10.9575104968252166 155.570986654598 +9338 0.9338 10.9419542593828609 155.553762192525 +9339 0.9339 10.9263997554063046 155.536317338603 +9340 0.9340 10.9108470069714905 155.518651357665 +9341 0.9341 10.8952960362277818 155.500763516503 +9342 0.9342 10.8797468653977614 155.482653083898 +9343 0.9343 10.8641995167770347 155.464319330625 +9344 0.9344 10.8486540127340305 155.445761529471 +9345 0.9345 10.8331103757097953 155.426978955251 +9346 0.9346 10.8175686282177921 155.407970884819 +9347 0.9347 10.8020287928436964 155.388736597091 +9348 0.9348 10.7864908922451885 155.369275373052 +9349 0.9349 10.7709549491517471 155.349586495775 +9350 0.9350 10.7554209863644363 155.329669250435 +9351 0.9351 10.7398890267556979 155.309522924324 +9352 0.9352 10.7243590932691379 155.289146806864 +9353 0.9353 10.7088312089193138 155.268540189623 +9354 0.9354 10.6933053967915157 155.247702366329 +9355 0.9355 10.6777816800415550 155.226632632884 +9356 0.9356 10.6622600818955426 155.205330287381 +9357 0.9357 10.6467406256496684 155.183794630113 +9358 0.9358 10.6312233346699827 155.162024963594 +9359 0.9359 10.6157082323921745 155.140020592566 +9360 0.9360 10.6001953423213457 155.117780824017 +9361 0.9361 10.5846846880317855 155.095304967197 +9362 0.9362 10.5691762931667448 155.072592333625 +9363 0.9363 10.5536701814382088 155.049642237110 +9364 0.9364 10.5381663766266644 155.026453993763 +9365 0.9365 10.5226649025808765 155.003026922005 +9366 0.9366 10.5071657832176459 154.979360342589 +9367 0.9367 10.4916690425215862 154.955453578608 +9368 0.9368 10.4761747045448796 154.931305955507 +9369 0.9369 10.4606827934070488 154.906916801105 +9370 0.9370 10.4451933332947142 154.882285445599 +9371 0.9371 10.4297063484613552 154.857411221581 +9372 0.9372 10.4142218632270733 154.832293464052 +9373 0.9373 10.3987399019783489 154.806931510433 +9374 0.9374 10.3832604891677978 154.781324700580 +9375 0.9375 10.3677836493139282 154.755472376795 +9376 0.9376 10.3523094070008970 154.729373883839 +9377 0.9377 10.3368377868782577 154.703028568948 +9378 0.9378 10.3213688136607189 154.676435781842 +9379 0.9379 10.3059025121278900 154.649594874737 +9380 0.9380 10.2904389071240345 154.622505202363 +9381 0.9381 10.2749780235578179 154.595166121971 +9382 0.9382 10.2595198864020514 154.567576993346 +9383 0.9383 10.2440645206934438 154.539737178823 +9384 0.9384 10.2286119515323382 154.511646043298 +9385 0.9385 10.2131622040824617 154.483302954234 +9386 0.9386 10.1977153035706660 154.454707281683 +9387 0.9387 10.1822712752866664 154.425858398292 +9388 0.9388 10.1668301445827858 154.396755679317 +9389 0.9389 10.1513919368736882 154.367398502631 +9390 0.9390 10.1359566776361198 154.337786248743 +9391 0.9391 10.1205243924086421 154.307918300807 +9392 0.9392 10.1050951067913708 154.277794044625 +9393 0.9393 10.0896688464457061 154.247412868674 +9394 0.9394 10.0742456370940676 154.216774164107 +9395 0.9395 10.0588255045196249 154.185877324765 +9396 0.9396 10.0434084745660268 154.154721747194 +9397 0.9397 10.0279945731371338 154.123306830654 +9398 0.9398 10.0125838261967441 154.091631977122 +9399 0.9399 9.9971762597683220 154.059696591319 +9400 0.9400 9.9817718999347207 154.027500080708 +9401 0.9401 9.9663707728379105 153.995041855511 +9402 0.9402 9.9509729046786983 153.962321328717 +9403 0.9403 9.9355783217164575 153.929337916097 +9404 0.9404 9.9201870502688418 153.896091036210 +9405 0.9405 9.9047991167115104 153.862580110419 +9406 0.9406 9.8894145474778448 153.828804562897 +9407 0.9407 9.8740333690586688 153.794763820640 +9408 0.9408 9.8586556080019623 153.760457313475 +9409 0.9409 9.8432812909125840 153.725884474079 +9410 0.9410 9.8279104444519820 153.691044737973 +9411 0.9411 9.8125430953379063 153.655937543553 +9412 0.9412 9.7971792703441238 153.620562332082 +9413 0.9413 9.7818189963001334 153.584918547713 +9414 0.9414 9.7664623000908737 153.549005637491 +9415 0.9415 9.7511092086564304 153.512823051368 +9416 0.9416 9.7357597489917520 153.476370242208 +9417 0.9417 9.7204139481463514 153.439646665803 +9418 0.9418 9.7050718332240162 153.402651780883 +9419 0.9419 9.6897334313825159 153.365385049117 +9420 0.9420 9.6743987698333029 153.327845935128 +9421 0.9421 9.6590678758412203 153.290033906512 +9422 0.9422 9.6437407767242025 153.251948433830 +9423 0.9423 9.6284174998529792 153.213588990629 +9424 0.9424 9.6130980726507751 153.174955053453 +9425 0.9425 9.5977825225930111 153.136046101842 +9426 0.9426 9.5824708772070011 153.096861618350 +9427 0.9427 9.5671631640716566 153.057401088555 +9428 0.9428 9.5518594108171762 153.017664001060 +9429 0.9429 9.5365596451247470 152.977649847511 +9430 0.9430 9.5212638947262409 152.937358122600 +9431 0.9431 9.5059721874039074 152.896788324079 +9432 0.9432 9.4906845509900659 152.855939952763 +9433 0.9433 9.4754010133668007 152.814812512546 +9434 0.9434 9.4601216024656534 152.773405510401 +9435 0.9435 9.4448463462673136 152.731718456395 +9436 0.9436 9.4295752728013085 152.689750863701 +9437 0.9437 9.4143084101456935 152.647502248598 +9438 0.9438 9.3990457864267398 152.604972130481 +9439 0.9439 9.3837874298186215 152.562160031877 +9440 0.9440 9.3685333685431047 152.519065478444 +9441 0.9441 9.3532836308692335 152.475687998988 +9442 0.9442 9.3380382451130117 152.432027125462 +9443 0.9443 9.3227972396370902 152.388082392982 +9444 0.9444 9.3075606428504489 152.343853339832 +9445 0.9445 9.2923284832080846 152.299339507470 +9446 0.9446 9.2771007892106834 152.254540440543 +9447 0.9447 9.2618775894043122 152.209455686885 +9448 0.9448 9.2466589123800915 152.164084797533 +9449 0.9449 9.2314447867738778 152.118427326730 +9450 0.9450 9.2162352412659452 152.072482831938 +9451 0.9451 9.2010303045806570 152.026250873838 +9452 0.9452 9.1858300054861477 151.979731016344 +9453 0.9453 9.1706343727939998 151.932922826608 +9454 0.9454 9.1554434353589187 151.885825875030 +9455 0.9455 9.1402572220784037 151.838439735257 +9456 0.9456 9.1250757618924307 151.790763984205 +9457 0.9457 9.1098990837831177 151.742798202053 +9458 0.9458 9.0947272167744018 151.694541972253 +9459 0.9459 9.0795601899317120 151.645994881546 +9460 0.9460 9.0643980323616375 151.597156519956 +9461 0.9461 9.0492407732115989 151.548026480808 +9462 0.9462 9.0340884416695229 151.498604360725 +9463 0.9463 9.0189410669635048 151.448889759647 +9464 0.9464 9.0037986783614805 151.398882280827 +9465 0.9465 8.9886613051708970 151.348581530840 +9466 0.9466 8.9735289767383755 151.297987119596 +9467 0.9467 8.9584017224493788 151.247098660338 +9468 0.9468 8.9432795717278797 151.195915769656 +9469 0.9469 8.9281625540360228 151.144438067489 +9470 0.9470 8.9130506988737910 151.092665177133 +9471 0.9471 8.8979440357786714 151.040596725245 +9472 0.9472 8.8828425943253162 150.988232341855 +9473 0.9473 8.8677464041252048 150.935571660365 +9474 0.9474 8.8526554948263083 150.882614317563 +9475 0.9475 8.8375698961127487 150.829359953620 +9476 0.9476 8.8224896377044626 150.775808212105 +9477 0.9477 8.8074147493568589 150.721958739985 +9478 0.9478 8.7923452608604773 150.667811187633 +9479 0.9479 8.7772812020406530 150.613365208837 +9480 0.9480 8.7622226027571717 150.558620460798 +9481 0.9481 8.7471694929039252 150.503576604142 +9482 0.9482 8.7321219024085721 150.448233302926 +9483 0.9483 8.7170798612321931 150.392590224641 +9484 0.9484 8.7020433993689501 150.336647040216 +9485 0.9485 8.6870125468457378 150.280403424027 +9486 0.9486 8.6719873337218409 150.223859053906 +9487 0.9487 8.6569677900885882 150.167013611132 +9488 0.9488 8.6419539460690089 150.109866780456 +9489 0.9489 8.6269458318174816 150.052418250089 +9490 0.9490 8.6119434775193913 149.994667711719 +9491 0.9491 8.5969469133907808 149.936614860508 +9492 0.9492 8.5819561696779996 149.878259395103 +9493 0.9493 8.5669712766573625 149.819601017638 +9494 0.9494 8.5519922646347943 149.760639433741 +9495 0.9495 8.5370191639454802 149.701374352533 +9496 0.9496 8.5220520049535207 149.641805486644 +9497 0.9497 8.5070908180515783 149.581932552206 +9498 0.9498 8.4921356336605243 149.521755268862 +9499 0.9499 8.4771864822290919 149.461273359779 +9500 0.9500 8.4622433942335213 149.400486551634 +9501 0.9501 8.4473064001772080 149.339394574640 +9502 0.9502 8.4323755305903489 149.277997162535 +9503 0.9503 8.4174508160295929 149.216294052591 +9504 0.9504 8.4025322870776833 149.154284985618 +9505 0.9505 8.3876199743431030 149.091969705973 +9506 0.9506 8.3727139084597262 149.029347961558 +9507 0.9507 8.3578141200864575 148.966419503827 +9508 0.9508 8.3429206399068772 148.903184087788 +9509 0.9509 8.3280334986288871 148.839641472012 +9510 0.9510 8.3131527269843559 148.775791418629 +9511 0.9511 8.2982783557287565 148.711633693342 +9512 0.9512 8.2834104156408177 148.647168065420 +9513 0.9513 8.2685489375221604 148.582394307711 +9514 0.9514 8.2536939521969437 148.517312196640 +9515 0.9515 8.2388454905115012 148.451921512218 +9516 0.9516 8.2240035833339888 148.386222038036 +9517 0.9517 8.2091682615540229 148.320213561282 +9518 0.9518 8.1943395560823227 148.253895872734 +9519 0.9519 8.1795174978503482 148.187268766765 +9520 0.9520 8.1647021178099415 148.120332041354 +9521 0.9521 8.1498934469329694 148.053085498076 +9522 0.9522 8.1350915162109594 147.985528942118 +9523 0.9523 8.1202963566547393 147.917662182280 +9524 0.9524 8.1055079992940762 147.849485030967 +9525 0.9525 8.0907264751773180 147.780997304207 +9526 0.9526 8.0759518153710257 147.712198821644 +9527 0.9527 8.0611840509596160 147.643089406548 +9528 0.9528 8.0464232130449975 147.573668885811 +9529 0.9529 8.0316693327462101 147.503937089955 +9530 0.9530 8.0169224411990552 147.433893853133 +9531 0.9531 8.0021825695557425 147.363539013131 +9532 0.9532 7.9874497489845169 147.292872411372 +9533 0.9533 7.9727240106693023 147.221893892920 +9534 0.9534 7.9580053858093320 147.150603306479 +9535 0.9535 7.9432939056187886 147.079000504397 +9536 0.9536 7.9285896013264354 147.007085342669 +9537 0.9537 7.9138925041752550 146.934857680942 +9538 0.9538 7.8992026454220827 146.862317382512 +9539 0.9539 7.8845200563372408 146.789464314329 +9540 0.9540 7.8698447682041746 146.716298347001 +9541 0.9541 7.8551768123190850 146.642819354794 +9542 0.9542 7.8405162199905636 146.569027215631 +9543 0.9543 7.8258630225392265 146.494921811103 +9544 0.9544 7.8112172512973483 146.420503026463 +9545 0.9545 7.7965789376084933 146.345770750631 +9546 0.9546 7.7819481128271519 146.270724876194 +9547 0.9547 7.7673248083183717 146.195365299413 +9548 0.9548 7.7527090554573901 146.119691920220 +9549 0.9549 7.7381008856292679 146.043704642218 +9550 0.9550 7.7235003302285223 145.967403372691 +9551 0.9551 7.7089074206587576 145.890788022596 +9552 0.9552 7.6943221883322996 145.813858506571 +9553 0.9553 7.6797446646698244 145.736614742934 +9554 0.9554 7.6651748810999933 145.659056653685 +9555 0.9555 7.6506128690590840 145.581184164507 +9556 0.9556 7.6360586599906206 145.502997204769 +9557 0.9557 7.6215122853450055 145.424495707525 +9558 0.9558 7.6069737765791530 145.345679609518 +9559 0.9559 7.5924431651561184 145.266548851177 +9560 0.9560 7.5779204825447284 145.187103376622 +9561 0.9561 7.5634057602192142 145.107343133666 +9562 0.9562 7.5488990296588403 145.027268073809 +9563 0.9563 7.5344003223475378 144.946878152248 +9564 0.9564 7.5199096697735319 144.866173327873 +9565 0.9565 7.5054271034289748 144.785153563267 +9566 0.9566 7.4909526548095755 144.703818824711 +9567 0.9567 7.4764863554142309 144.622169082180 +9568 0.9568 7.4620282367446542 144.540204309346 +9569 0.9569 7.4475783303050074 144.457924483582 +9570 0.9570 7.4331366676015307 144.375329585956 +9571 0.9571 7.4187032801421715 144.292419601236 +9572 0.9572 7.4042781994362157 144.209194517888 +9573 0.9573 7.3898614569939172 144.125654328081 +9574 0.9574 7.3754530843261294 144.041799027682 +9575 0.9575 7.3610531129439325 143.957628616257 +9576 0.9576 7.3466615743582659 143.873143097079 +9577 0.9577 7.3322785000795561 143.788342477114 +9578 0.9578 7.3179039216173489 143.703226767034 +9579 0.9579 7.3035378704799365 143.617795981215 +9580 0.9580 7.2891803781739890 143.532050137727 +9581 0.9581 7.2748314762041852 143.445989258350 +9582 0.9582 7.2604911960728398 143.359613368560 +9583 0.9583 7.2461595692795351 143.272922497537 +9584 0.9584 7.2318366273207504 143.185916678160 +9585 0.9585 7.2175224016894921 143.098595947014 +9586 0.9586 7.2032169238749226 143.010960344379 +9587 0.9587 7.1889202253619917 142.923009914240 +9588 0.9588 7.1746323376310652 142.834744704283 +9589 0.9589 7.1603532921575566 142.746164765891 +9590 0.9590 7.1460831204115545 142.657270154147 +9591 0.9591 7.1318218538574554 142.568060927837 +9592 0.9592 7.1175695239535912 142.478537149441 +9593 0.9593 7.1033261621518626 142.388698885138 +9594 0.9594 7.0890917998973650 142.298546204809 +9595 0.9595 7.0748664686280236 142.208079182026 +9596 0.9596 7.0606501997742193 142.117297894060 +9597 0.9597 7.0464430247584220 142.026202421877 +9598 0.9598 7.0322449749948213 141.934792850136 +9599 0.9599 7.0180560818889548 141.843069267193 +9600 0.9600 7.0038763768373409 141.751031765094 +9601 0.9601 6.9897058912271071 141.658680439575 +9602 0.9602 6.9755446564356252 141.566015390068 +9603 0.9603 6.9613927038301373 141.473036719689 +9604 0.9604 6.9472500647673909 141.379744535246 +9605 0.9605 6.9331167705932666 141.286138947233 +9606 0.9606 6.9189928526424138 141.192220069830 +9607 0.9607 6.9048783422378772 141.097988020904 +9608 0.9608 6.8907732706907323 141.003442922002 +9609 0.9609 6.8766776692997142 140.908584898353 +9610 0.9610 6.8625915693508528 140.813414078870 +9611 0.9611 6.8485150021171020 140.717930596145 +9612 0.9612 6.8344479988579723 140.622134586444 +9613 0.9613 6.8203905908191649 140.526026189712 +9614 0.9614 6.8063428092322011 140.429605549569 +9615 0.9615 6.7923046853140576 140.332872813306 +9616 0.9616 6.7782762502667984 140.235828131885 +9617 0.9617 6.7642575352772072 140.138471659939 +9618 0.9618 6.7502485715164218 140.040803555769 +9619 0.9619 6.7362493901395668 139.942823981338 +9620 0.9620 6.7222600222853863 139.844533102277 +9621 0.9621 6.7082804990758786 139.745931087879 +9622 0.9622 6.6943108516159304 139.647018111091 +9623 0.9623 6.6803511109929499 139.547794348524 +9624 0.9624 6.6664013082765017 139.448259980444 +9625 0.9625 6.6524614745179411 139.348415190767 +9626 0.9626 6.6385316407500499 139.248260167064 +9627 0.9627 6.6246118379866692 139.147795100553 +9628 0.9628 6.6107020972223367 139.047020186102 +9629 0.9629 6.5968024494319204 138.945935622217 +9630 0.9630 6.5829129255702572 138.844541611054 +9631 0.9631 6.5690335565717843 138.742838358404 +9632 0.9632 6.5551643733501797 138.640826073697 +9633 0.9633 6.5413054067979948 138.538504969996 +9634 0.9634 6.5274566877862954 138.435875263998 +9635 0.9635 6.5136182471642945 138.332937176028 +9636 0.9636 6.4997901157589908 138.229690930042 +9637 0.9637 6.4859723243748082 138.126136753614 +9638 0.9638 6.4721649037932307 138.022274877944 +9639 0.9639 6.4583678847724411 137.918105537850 +9640 0.9640 6.4445812980469608 137.813628971764 +9641 0.9641 6.4308051743272863 137.708845421733 +9642 0.9642 6.4170395442995289 137.603755133413 +9643 0.9643 6.4032844386250547 137.498358356070 +9644 0.9644 6.3895398879401224 137.392655342568 +9645 0.9645 6.3758059228555251 137.286646349376 +9646 0.9646 6.3620825739562283 137.180331636562 +9647 0.9647 6.3483698718010109 137.073711467786 +9648 0.9648 6.3346678469221063 136.966786110302 +9649 0.9649 6.3209765298248435 136.859555834950 +9650 0.9650 6.3072959509872879 136.752020916156 +9651 0.9651 6.2936261408598835 136.644181631927 +9652 0.9652 6.2799671298650948 136.536038263849 +9653 0.9653 6.2663189483970481 136.427591097084 +9654 0.9654 6.2526816268211753 136.318840420365 +9655 0.9655 6.2390551954738580 136.209786525989 +9656 0.9656 6.2254396846620672 136.100429709824 +9657 0.9657 6.2118351246630112 135.990770271292 +9658 0.9658 6.1982415457237776 135.880808513377 +9659 0.9659 6.1846589780609778 135.770544742615 +9660 0.9660 6.1710874518603926 135.659979269092 +9661 0.9661 6.1575269972766158 135.549112406438 +9662 0.9662 6.1439776444327023 135.437944471827 +9663 0.9663 6.1304394234198121 135.326475785970 +9664 0.9664 6.1169123642968577 135.214706673114 +9665 0.9665 6.1033964970901504 135.102637461035 +9666 0.9666 6.0898918517930465 134.990268481035 +9667 0.9667 6.0763984583655981 134.877600067940 +9668 0.9668 6.0629163467341964 134.764632560094 +9669 0.9669 6.0494455467912243 134.651366299355 +9670 0.9670 6.0359860883947016 134.537801631089 +9671 0.9671 6.0225380013679386 134.423938904170 +9672 0.9672 6.0091013154991817 134.309778470975 +9673 0.9673 5.9956760605412640 134.195320687374 +9674 0.9674 5.9822622662112588 134.080565912733 +9675 0.9675 5.9688599621901268 133.965514509907 +9676 0.9676 5.9554691781223701 133.850166845232 +9677 0.9677 5.9420899436156818 133.734523288529 +9678 0.9678 5.9287222882406008 133.618584213087 +9679 0.9679 5.9153662415301627 133.502349995674 +9680 0.9680 5.9020218329795533 133.385821016517 +9681 0.9681 5.8886890920457624 133.268997659308 +9682 0.9682 5.8753680481472372 133.151880311196 +9683 0.9683 5.8620587306635379 133.034469362782 +9684 0.9684 5.8487611689349936 132.916765208110 +9685 0.9685 5.8354753922623548 132.798768244675 +9686 0.9686 5.8222014299064506 132.680478873402 +9687 0.9687 5.8089393110878476 132.561897498653 +9688 0.9688 5.7956890649865036 132.443024528218 +9689 0.9689 5.7824507207414273 132.323860373308 +9690 0.9690 5.7692243074503340 132.204405448553 +9691 0.9691 5.7560098541693065 132.084660171997 +9692 0.9692 5.7428073899124525 131.964624965090 +9693 0.9693 5.7296169436515640 131.844300252687 +9694 0.9694 5.7164385443157775 131.723686463040 +9695 0.9695 5.7032722207912361 131.602784027792 +9696 0.9696 5.6901180019207480 131.481593381976 +9697 0.9697 5.6769759165034488 131.360114964005 +9698 0.9698 5.6638459932944647 131.238349215669 +9699 0.9699 5.6507282610045744 131.116296582131 +9700 0.9700 5.6376227482998722 130.993957511917 +9701 0.9701 5.6245294838014308 130.871332456918 +9702 0.9702 5.6114484960849662 130.748421872374 +9703 0.9703 5.5983798136805039 130.625226216881 +9704 0.9704 5.5853234650720411 130.501745952374 +9705 0.9705 5.5722794786972161 130.377981544129 +9706 0.9706 5.5592478829469716 130.253933460756 +9707 0.9707 5.5462287061652242 130.129602174188 +9708 0.9708 5.5332219766485302 130.004988159685 +9709 0.9709 5.5202277226457550 129.880091895818 +9710 0.9710 5.5072459723577403 129.754913864471 +9711 0.9711 5.4942767539369752 129.629454550830 +9712 0.9712 5.4813200954872645 129.503714443381 +9713 0.9713 5.4683760250634004 129.377694033903 +9714 0.9714 5.4554445706708323 129.251393817460 +9715 0.9715 5.4425257602653394 129.124814292396 +9716 0.9716 5.4296196217527033 128.997955960329 +9717 0.9717 5.4167261829883788 128.870819326152 +9718 0.9718 5.4038454717771707 128.743404898012 +9719 0.9719 5.3909775158729039 128.615713187316 +9720 0.9720 5.3781223429781022 128.487744708722 +9721 0.9721 5.3652799807436597 128.359499980131 +9722 0.9722 5.3524504567685192 128.230979522682 +9723 0.9723 5.3396337985993476 128.102183860744 +9724 0.9724 5.3268300337302144 127.973113521915 +9725 0.9725 5.3140391896022683 127.843769037006 +9726 0.9726 5.3012612936034156 127.714150940047 +9727 0.9727 5.2884963730679999 127.584259768271 +9728 0.9728 5.2757444552764809 127.454096062109 +9729 0.9729 5.2630055674551164 127.323660365186 +9730 0.9730 5.2502797367756413 127.192953224319 +9731 0.9731 5.2375669903549502 127.061975189496 +9732 0.9732 5.2248673552547809 126.930726813885 +9733 0.9733 5.2121808584813953 126.799208653820 +9734 0.9734 5.1995075269852649 126.667421268793 +9735 0.9735 5.1868473876607526 126.535365221451 +9736 0.9736 5.1742004673458002 126.403041077589 +9737 0.9737 5.1615667928216142 126.270449406139 +9738 0.9738 5.1489463908123492 126.137590779168 +9739 0.9739 5.1363392879847973 126.004465771872 +9740 0.9740 5.1237455109480754 125.871074962559 +9741 0.9741 5.1111650862533144 125.737418932659 +9742 0.9742 5.0985980403933464 125.603498266700 +9743 0.9743 5.0860443998023959 125.469313552314 +9744 0.9744 5.0735041908557692 125.334865380222 +9745 0.9745 5.0609774398695464 125.200154344229 +9746 0.9746 5.0484641731002737 125.065181041220 +9747 0.9747 5.0359644167446556 124.929946071150 +9748 0.9748 5.0234781969392461 124.794450037034 +9749 0.9749 5.0110055397601467 124.658693544948 +9750 0.9750 4.9985464712226984 124.522677204013 +9751 0.9751 4.9861010172811779 124.386401626393 +9752 0.9752 4.9736692038284938 124.249867427287 +9753 0.9753 4.9612510566958834 124.113075224921 +9754 0.9754 4.9488466016526100 123.976025640540 +9755 0.9755 4.9364558644056631 123.838719298401 +9756 0.9756 4.9240788705994545 123.701156825766 +9757 0.9757 4.9117156458155211 123.563338852897 +9758 0.9758 4.8993662155722246 123.425266013041 +9759 0.9759 4.8870306053244512 123.286938942432 +9760 0.9760 4.8747088404633159 123.148358280276 +9761 0.9761 4.8624009463158648 123.009524668748 +9762 0.9762 4.8501069481447781 122.870438752981 +9763 0.9763 4.8378268711480761 122.731101181063 +9764 0.9764 4.8255607404588217 122.591512604021 +9765 0.9765 4.8133085811448293 122.451673675826 +9766 0.9766 4.8010704182083694 122.311585053370 +9767 0.9767 4.7888462765858772 122.171247396472 +9768 0.9768 4.7766361811476603 122.030661367862 +9769 0.9769 4.7644401566976082 121.889827633175 +9770 0.9770 4.7522582279729022 121.748746860945 +9771 0.9771 4.7400904196437255 121.607419722594 +9772 0.9772 4.7279367563129746 121.465846892426 +9773 0.9773 4.7157972625159719 121.324029047620 +9774 0.9774 4.7036719627201800 121.181966868220 +9775 0.9775 4.6915608813249126 121.039661037127 +9776 0.9776 4.6794640426610519 120.897112240092 +9777 0.9777 4.6673814709907617 120.754321165710 +9778 0.9778 4.6553131905072060 120.611288505404 +9779 0.9779 4.6432592253342646 120.468014953427 +9780 0.9780 4.6312195995262506 120.324501206848 +9781 0.9781 4.6191943370676309 120.180747965543 +9782 0.9782 4.6071834618727445 120.036755932190 +9783 0.9783 4.5951869977855218 119.892525812260 +9784 0.9784 4.5832049685792082 119.748058314007 +9785 0.9785 4.5712373979560850 119.603354148460 +9786 0.9786 4.5592843095471913 119.458414029416 +9787 0.9787 4.5473457269120487 119.313238673432 +9788 0.9788 4.5354216735383863 119.167828799813 +9789 0.9789 4.5235121728418655 119.022185130608 +9790 0.9790 4.5116172481658054 118.876308390599 +9791 0.9791 4.4997369227809108 118.730199307293 +9792 0.9792 4.4878712198850002 118.583858610911 +9793 0.9793 4.4760201626027349 118.437287034387 +9794 0.9794 4.4641837739853480 118.290485313348 +9795 0.9795 4.4523620770103749 118.143454186118 +9796 0.9796 4.4405550945813843 117.996194393696 +9797 0.9797 4.4287628495277112 117.848706679760 +9798 0.9798 4.4169853646041908 117.700991790649 +9799 0.9799 4.4052226624908899 117.553050475360 +9800 0.9800 4.3934747657928455 117.404883485535 +9801 0.9801 4.3817416970397955 117.256491575456 +9802 0.9802 4.3700234786859209 117.107875502032 +9803 0.9803 4.3583201331095793 116.959036024794 +9804 0.9804 4.3466316826130456 116.809973905885 +9805 0.9805 4.3349581494222491 116.660689910049 +9806 0.9806 4.3232995556865159 116.511184804623 +9807 0.9807 4.3116559234783081 116.361459359531 +9808 0.9808 4.3000272747929680 116.211514347273 +9809 0.9809 4.2884136315484591 116.061350542911 +9810 0.9810 4.2768150155851101 115.910968724070 +9811 0.9811 4.2652314486653609 115.760369670919 +9812 0.9812 4.2536629524735066 115.609554166170 +9813 0.9813 4.2421095486154448 115.458522995063 +9814 0.9814 4.2305712586184239 115.307276945358 +9815 0.9815 4.2190481039307892 115.155816807331 +9816 0.9816 4.2075401059217352 115.004143373755 +9817 0.9817 4.1960472858810522 114.852257439898 +9818 0.9818 4.1845696650188815 114.700159803516 +9819 0.9819 4.1731072644654637 114.547851264835 +9820 0.9820 4.1616601052708946 114.395332626547 +9821 0.9821 4.1502282084048767 114.242604693802 +9822 0.9822 4.1388115947564765 114.089668274196 +9823 0.9823 4.1274102851338785 113.936524177760 +9824 0.9824 4.1160243002641428 113.783173216954 +9825 0.9825 4.1046536607929625 113.629616206658 +9826 0.9826 4.0932983872844213 113.475853964158 +9827 0.9827 4.0819585002207566 113.321887309140 +9828 0.9828 4.0706340200021156 113.167717063682 +9829 0.9829 4.0593249669463196 113.013344052239 +9830 0.9830 4.0480313612886256 112.858769101636 +9831 0.9831 4.0367532231814911 112.703993041063 +9832 0.9832 4.0254905726943351 112.549016702058 +9833 0.9833 4.0142434298133072 112.393840918500 +9834 0.9834 4.0030118144410523 112.238466526603 +9835 0.9835 3.9917957463964773 112.082894364900 +9836 0.9836 3.9805952454145204 111.927125274237 +9837 0.9837 3.9694103311459203 111.771160097765 +9838 0.9838 3.9582410231569858 111.614999680925 +9839 0.9839 3.9470873409293676 111.458644871440 +9840 0.9840 3.9359493038598301 111.302096519311 +9841 0.9841 3.9248269312600246 111.145355476797 +9842 0.9842 3.9137202423562640 110.988422598413 +9843 0.9843 3.9026292562892975 110.831298740918 +9844 0.9844 3.8915539921140865 110.673984763303 +9845 0.9845 3.8804944687995824 110.516481526781 +9846 0.9846 3.8694507052285041 110.358789894782 +9847 0.9847 3.8584227201971180 110.200910732939 +9848 0.9848 3.8474105324150174 110.042844909075 +9849 0.9849 3.8364141605049036 109.884593293199 +9850 0.9850 3.8254336230023691 109.726156757494 +9851 0.9851 3.8144689383556791 109.567536176304 +9852 0.9852 3.8035201249255577 109.408732426127 +9853 0.9853 3.7925872009849710 109.249746385605 +9854 0.9854 3.7816701847189154 109.090578935511 +9855 0.9855 3.7707690942242027 108.931230958741 +9856 0.9856 3.7598839475092505 108.771703340304 +9857 0.9857 3.7490147624938697 108.611996967309 +9858 0.9858 3.7381615570090561 108.452112728960 +9859 0.9859 3.7273243487967811 108.292051516538 +9860 0.9860 3.7165031555097841 108.131814223399 +9861 0.9861 3.7056979947113664 107.971401744958 +9862 0.9862 3.6949088838751845 107.810814978681 +9863 0.9863 3.6841358403850468 107.650054824074 +9864 0.9864 3.6733788815347097 107.489122182672 +9865 0.9865 3.6626380245276748 107.328017958029 +9866 0.9866 3.6519132864769879 107.166743055709 +9867 0.9867 3.6412046844050390 107.005298383273 +9868 0.9868 3.6305122352433616 106.843684850270 +9869 0.9869 3.6198359558324369 106.681903368228 +9870 0.9870 3.6091758629214934 106.519954850638 +9871 0.9871 3.5985319731683139 106.357840212950 +9872 0.9872 3.5879043031390383 106.195560372560 +9873 0.9873 3.5772928693079704 106.033116248797 +9874 0.9874 3.5666976880573849 105.870508762915 +9875 0.9875 3.5561187756773349 105.707738838082 +9876 0.9876 3.5455561483654625 105.544807399369 +9877 0.9877 3.5350098222268072 105.381715373739 +9878 0.9878 3.5244798132736181 105.218463690037 +9879 0.9879 3.5139661374251672 105.055053278979 +9880 0.9880 3.5034688105075613 104.891485073141 +9881 0.9881 3.4929878482535570 104.727760006948 +9882 0.9882 3.4825232663023766 104.563879016663 +9883 0.9883 3.4720750801995246 104.399843040380 +9884 0.9884 3.4616433053966054 104.235653018006 +9885 0.9885 3.4512279572511422 104.071309891257 +9886 0.9886 3.4408290510263972 103.906814603642 +9887 0.9887 3.4304466018911923 103.742168100457 +9888 0.9888 3.4200806249197311 103.577371328769 +9889 0.9889 3.4097311350914223 103.412425237409 +9890 0.9890 3.3993981472907038 103.247330776958 +9891 0.9891 3.3890816763068687 103.082088899740 +9892 0.9892 3.3787817368338913 102.916700559807 +9893 0.9893 3.3684983434702542 102.751166712931 +9894 0.9894 3.3582315107187783 102.585488316590 +9895 0.9895 3.3479812529864508 102.419666329961 +9896 0.9896 3.3377475845842577 102.253701713903 +9897 0.9897 3.3275305197270151 102.087595430953 +9898 0.9898 3.3173300725332022 101.921348445307 +9899 0.9899 3.3071462570247960 101.754961722820 +9900 0.9900 3.2969790871271059 101.588436230982 +9901 0.9901 3.2868285766686109 101.421772938915 +9902 0.9902 3.2766947393807970 101.254972817363 +9903 0.9903 3.2665775888979955 101.088036838671 +9904 0.9904 3.2564771387572229 100.920965976786 +9905 0.9905 3.2463934023980219 100.753761207238 +9906 0.9906 3.2363263931623032 100.586423507133 +9907 0.9907 3.2262761242941900 100.418953855135 +9908 0.9908 3.2162426089398601 100.251353231466 +9909 0.9909 3.2062258601473927 100.083622617882 +9910 0.9910 3.1962258908666152 99.915762997672 +9911 0.9911 3.1862427139489498 99.747775355642 +9912 0.9912 3.1762763421472626 99.579660678100 +9913 0.9913 3.1663267881157147 99.411419952856 +9914 0.9914 3.1563940644096120 99.243054169198 +9915 0.9915 3.1464781834852578 99.074564317887 +9916 0.9916 3.1365791576998059 98.905951391147 +9917 0.9917 3.1266969993111160 98.737216382649 +9918 0.9918 3.1168317204776086 98.568360287502 +9919 0.9919 3.1069833332581211 98.399384102243 +9920 0.9920 3.0971518496117678 98.230288824821 +9921 0.9921 3.0873372813977973 98.061075454592 +9922 0.9922 3.0775396403754525 97.891744992301 +9923 0.9923 3.0677589382038337 97.722298440073 +9924 0.9924 3.0579951864417598 97.552736801406 +9925 0.9925 3.0482483965476321 97.383061081151 +9926 0.9926 3.0385185798792995 97.213272285505 +9927 0.9927 3.0288057476939243 97.043371422002 +9928 0.9928 3.0191099111478494 96.873359499496 +9929 0.9929 3.0094310812964671 96.703237528154 +9930 0.9930 2.9997692690940876 96.533006519440 +9931 0.9931 2.9901244853938103 96.362667486107 +9932 0.9932 2.9804967409473959 96.192221442184 +9933 0.9933 2.9708860464051385 96.021669402963 +9934 0.9934 2.9612924123157409 95.851012384991 +9935 0.9935 2.9517158491261886 95.680251406053 +9936 0.9936 2.9421563671816275 95.509387485168 +9937 0.9937 2.9326139767252410 95.338421642566 +9938 0.9938 2.9230886878981281 95.167354899688 +9939 0.9939 2.9135805107391857 94.996188279165 +9940 0.9940 2.9040894551849865 94.824922804816 +9941 0.9941 2.8946155310696646 94.653559501624 +9942 0.9942 2.8851587481247969 94.482099395734 +9943 0.9943 2.8757191159792881 94.310543514438 +9944 0.9944 2.8662966441592581 94.138892886161 +9945 0.9945 2.8568913420879274 93.967148540454 +9946 0.9946 2.8475032190855059 93.795311507977 +9947 0.9947 2.8381322843690824 93.623382820490 +9948 0.9948 2.8287785470525160 93.451363510842 +9949 0.9949 2.8194420161463261 93.279254612954 +9950 0.9950 2.8101227005575877 93.107057161816 +9951 0.9951 2.8008206090898238 92.934772193465 +9952 0.9952 2.7915357504429017 92.762400744981 +9953 0.9953 2.7822681332129293 92.589943854470 +9954 0.9954 2.7730177658921531 92.417402561057 +9955 0.9955 2.7637846568688569 92.244777904868 +9956 0.9956 2.7545688144272624 92.072070927022 +9957 0.9957 2.7453702467474304 91.899282669619 +9958 0.9958 2.7361889619051634 91.726414175725 +9959 0.9959 2.7270249678719090 91.553466489364 +9960 0.9960 2.7178782725146653 91.380440655505 +9961 0.9961 2.7087488835958879 91.207337720045 +9962 0.9962 2.6996368087733953 91.034158729805 +9963 0.9963 2.6905420556002793 90.860904732512 +9964 0.9964 2.6814646315248143 90.687576776789 +9965 0.9965 2.6724045438903676 90.514175912144 +9966 0.9966 2.6633617999353127 90.340703188954 +9967 0.9967 2.6543364067929422 90.167159658457 +9968 0.9968 2.6453283714913827 89.993546372739 +9969 0.9969 2.6363377009535096 89.819864384721 +9970 0.9970 2.6273644019968661 89.646114748148 +9971 0.9971 2.6184084813335802 89.472298517573 +9972 0.9972 2.6094699455702841 89.298416748350 +9973 0.9973 2.6005488012080358 89.124470496619 +9974 0.9974 2.5916450546422398 88.950460819297 +9975 0.9975 2.5827587121625721 88.776388774059 +9976 0.9976 2.5738897799529026 88.602255419334 +9977 0.9977 2.5650382640912217 88.428061814287 +9978 0.9978 2.5562041705495671 88.253809018807 +9979 0.9979 2.5473875051939516 88.079498093500 +9980 0.9980 2.5385882737842933 87.905130099670 +9981 0.9981 2.5298064819743442 87.730706099314 +9982 0.9982 2.5210421353116237 87.556227155100 +9983 0.9983 2.5122952392373503 87.381694330365 +9984 0.9984 2.5035657990863771 87.207108689098 +9985 0.9985 2.4948538200871262 87.032471295923 +9986 0.9986 2.4861593073615254 86.857783216098 +9987 0.9987 2.4774822659249458 86.683045515493 +9988 0.9988 2.4688227006861423 86.508259260580 +9989 0.9989 2.4601806164471922 86.333425518422 +9990 0.9990 2.4515560179034379 86.158545356665 +9991 0.9991 2.4429489096434289 85.983619843513 +9992 0.9992 2.4343592961488669 85.808650047729 +9993 0.9993 2.4257871817945498 85.633637038617 +9994 0.9994 2.4172325708483187 85.458581886007 +9995 0.9995 2.4086954674710057 85.283485660250 +9996 0.9996 2.4001758757163834 85.108349432194 +9997 0.9997 2.3916737995311141 84.933174273187 +9998 0.9998 2.3831892427547023 84.757961255052 +9999 0.9999 2.3747222091194460 84.582711450078 +10000 1.0000 2.3662727022503915 84.407425931012 +10001 1.0001 2.3578407256652891 84.232105771038 +10002 1.0002 2.3494262827745485 84.056752043776 +10003 1.0003 2.3410293768811967 83.881365823259 +10004 1.0004 2.3326500111808377 83.705948183924 +10005 1.0005 2.3242881887616114 83.530500200605 +10006 1.0006 2.3159439126041557 83.355022948513 +10007 1.0007 2.3076171855815688 83.179517503225 +10008 1.0008 2.2993080104593737 83.003984940675 +10009 1.0009 2.2910163898954830 82.828426337140 +10010 1.0010 2.2827423264401645 82.652842769226 +10011 1.0011 2.2744858225360103 82.477235313856 +10012 1.0012 2.2662468805179046 82.301605048261 +10013 1.0013 2.2580255026129934 82.125953049960 +10014 1.0014 2.2498216909406574 81.950280396756 +10015 1.0015 2.2416354475124836 81.774588166719 +10016 1.0016 2.2334667742322392 81.598877438171 +10017 1.0017 2.2253156728958468 81.423149289681 +10018 1.0018 2.2171821451913605 81.247404800043 +10019 1.0019 2.2090661926989448 81.071645048274 +10020 1.0020 2.2009678168908513 80.895871113592 +10021 1.0021 2.1928870191314012 80.720084075409 +10022 1.0022 2.1848238006769649 80.544285013316 +10023 1.0023 2.1767781626759453 80.368475007073 +10024 1.0024 2.1687501061687620 80.192655136592 +10025 1.0025 2.1607396320878358 80.016826481930 +10026 1.0026 2.1527467412575758 79.840990123271 +10027 1.0027 2.1447714343943662 79.665147140919 +10028 1.0028 2.1368137121065565 79.489298615280 +10029 1.0029 2.1288735748944498 79.313445626854 +10030 1.0030 2.1209510231502962 79.137589256218 +10031 1.0031 2.1130460571582845 78.961730584018 +10032 1.0032 2.1051586770945359 78.785870690953 +10033 1.0033 2.0972888830271001 78.610010657763 +10034 1.0034 2.0894366749159512 78.434151565218 +10035 1.0035 2.0816020526129853 78.258294494105 +10036 1.0036 2.0737850158620192 78.082440525213 +10037 1.0037 2.0659855642987925 77.906590739324 +10038 1.0038 2.0582036974509665 77.730746217196 +10039 1.0039 2.0504394147381291 77.554908039556 +10040 1.0040 2.0426927154717971 77.379077287082 +10041 1.0041 2.0349635988554233 77.203255040394 +10042 1.0042 2.0272520639844016 77.027442380040 +10043 1.0043 2.0195581098460753 76.851640386483 +10044 1.0044 2.0118817353197467 76.675850140088 +10045 1.0045 2.0042229391766866 76.500072721113 +10046 1.0046 1.9965817200801463 76.324309209690 +10047 1.0047 1.9889580765853709 76.148560685818 +10048 1.0048 1.9813520071396125 75.972828229350 +10049 1.0049 1.9737635100821462 75.797112919974 +10050 1.0050 1.9661925836442871 75.621415837210 +10051 1.0051 1.9586392259494072 75.445738060388 +10052 1.0052 1.9511034350129557 75.270080668643 +10053 1.0053 1.9435852087424785 75.094444740898 +10054 1.0054 1.9360845449376409 74.918831355852 +10055 1.0055 1.9286014412902499 74.743241591968 +10056 1.0056 1.9211358953842783 74.567676527462 +10057 1.0057 1.9136879046958910 74.392137240285 +10058 1.0058 1.9062574665934708 74.216624808117 +10059 1.0059 1.8988445783376475 74.041140308350 +10060 1.0060 1.8914492370813263 73.865684818075 +10061 1.0061 1.8840714398697189 73.690259414073 +10062 1.0062 1.8767111836403751 73.514865172801 +10063 1.0063 1.8693684652232163 73.339503170377 +10064 1.0064 1.8620432813405690 73.164174482568 +10065 1.0065 1.8547356286072016 72.988880184780 +10066 1.0066 1.8474455035303605 72.813621352044 +10067 1.0067 1.8401729025098084 72.638399059001 +10068 1.0068 1.8329178218378637 72.463214379893 +10069 1.0069 1.8256802576994415 72.288068388548 +10070 1.0070 1.8184602061720956 72.112962158369 +10071 1.0071 1.8112576632260611 71.937896762319 +10072 1.0072 1.8040726247242995 71.762873272910 +10073 1.0073 1.7969050864225444 71.587892762190 +10074 1.0074 1.7897550439693484 71.412956301732 +10075 1.0075 1.7826224929061310 71.238064962618 +10076 1.0076 1.7755074286672285 71.063219815428 +10077 1.0077 1.7684098465799456 70.888421930229 +10078 1.0078 1.7613297418646061 70.713672376560 +10079 1.0079 1.7542671096346072 70.538972223420 +10080 1.0080 1.7472219448964734 70.364322539255 +10081 1.0081 1.7401942425499133 70.189724391948 +10082 1.0082 1.7331839973878758 70.015178848803 +10083 1.0083 1.7261912040966090 69.840686976532 +10084 1.0084 1.7192158572557201 69.666249841246 +10085 1.0085 1.7122579513382359 69.491868508441 +10086 1.0086 1.7053174807106646 69.317544042983 +10087 1.0087 1.6983944396330606 69.143277509097 +10088 1.0088 1.6914888222590878 68.969069970357 +10089 1.0089 1.6846006226360866 68.794922489667 +10090 1.0090 1.6777298347051404 68.620836129256 +10091 1.0091 1.6708764523011446 68.446811950660 +10092 1.0092 1.6640404691528761 68.272851014710 +10093 1.0093 1.6572218788830644 68.098954381522 +10094 1.0094 1.6504206750084642 67.925123110482 +10095 1.0095 1.6436368509399284 67.751358260234 +10096 1.0096 1.6368703999824832 67.577660888669 +10097 1.0097 1.6301213153354044 67.404032052909 +10098 1.0098 1.6233895900922941 67.230472809298 +10099 1.0099 1.6166752172411598 67.056984213387 +10100 1.0100 1.6099781896644942 66.883567319923 +10101 1.0101 1.6032985001393565 66.710223182833 +10102 1.0102 1.5966361413374539 66.536952855218 +10103 1.0103 1.5899911058252263 66.363757389334 +10104 1.0104 1.5833633860639305 66.190637836583 +10105 1.0105 1.5767529744097264 66.017595247498 +10106 1.0106 1.5701598631137648 65.844630671734 +10107 1.0107 1.5635840443222755 65.671745158050 +10108 1.0108 1.5570255100766579 65.498939754303 +10109 1.0109 1.5504842523135713 65.326215507430 +10110 1.0110 1.5439602628650280 65.153573463439 +10111 1.0111 1.5374535334584862 64.981014667395 +10112 1.0112 1.5309640557169462 64.808540163405 +10113 1.0113 1.5244918211590452 64.636150994612 +10114 1.0114 1.5180368211991560 64.463848203175 +10115 1.0115 1.5115990471474841 64.291632830263 +10116 1.0116 1.5051784902101690 64.119505916036 +10117 1.0117 1.4987751414893853 63.947468499640 +10118 1.0118 1.4923889919834439 63.775521619188 +10119 1.0119 1.4860200325868971 63.603666311750 +10120 1.0120 1.4796682540906425 63.431903613340 +10121 1.0121 1.4733336471820302 63.260234558906 +10122 1.0122 1.4670162024449691 63.088660182315 +10123 1.0123 1.4607159103600362 62.917181516341 +10124 1.0124 1.4544327613045867 62.745799592651 +10125 1.0125 1.4481667455528644 62.574515441796 +10126 1.0126 1.4419178532761148 62.403330093197 +10127 1.0127 1.4356860745426985 62.232244575130 +10128 1.0128 1.4294713993182060 62.061259914720 +10129 1.0129 1.4232738174655739 61.890377137920 +10130 1.0130 1.4170933187452026 61.719597269506 +10131 1.0131 1.4109298928150744 61.548921333060 +10132 1.0132 1.4047835292308735 61.378350350961 +10133 1.0133 1.3986542174461070 61.207885344369 +10134 1.0134 1.3925419468122278 61.037527333216 +10135 1.0135 1.3864467065787573 60.867277336192 +10136 1.0136 1.3803684858934111 60.697136370731 +10137 1.0137 1.3743072738022244 60.527105453003 +10138 1.0138 1.3682630592496794 60.357185597896 +10139 1.0139 1.3622358310788341 60.187377819010 +10140 1.0140 1.3562255780314516 60.017683128639 +10141 1.0141 1.3502322887481315 59.848102537763 +10142 1.0142 1.3442559517684418 59.678637056031 +10143 1.0143 1.3382965555310526 59.509287691754 +10144 1.0144 1.3323540883738705 59.340055451890 +10145 1.0145 1.3264285385341745 59.170941342030 +10146 1.0146 1.3205198941487535 59.001946366389 +10147 1.0147 1.3146281432540445 58.833071527792 +10148 1.0148 1.3087532737862719 58.664317827662 +10149 1.0149 1.3028952735815884 58.495686266009 +10150 1.0150 1.2970541303762173 58.327177841414 +10151 1.0151 1.2912298318065956 58.158793551021 +10152 1.0152 1.2854223654095183 57.990534390524 +10153 1.0153 1.2796317186222843 57.822401354153 +10154 1.0154 1.2738578787828436 57.654395434662 +10155 1.0155 1.2681008331299446 57.486517623318 +10156 1.0156 1.2623605688032842 57.318768909889 +10157 1.0157 1.2566370728436582 57.151150282632 +10158 1.0158 1.2509303321931127 56.983662728277 +10159 1.0159 1.2452403336950977 56.816307232021 +10160 1.0160 1.2395670640946210 56.649084777512 +10161 1.0161 1.2339105100384036 56.481996346837 +10162 1.0162 1.2282706580750362 56.315042920510 +10163 1.0163 1.2226474946551376 56.148225477463 +10164 1.0164 1.2170410061315129 55.981544995029 +10165 1.0165 1.2114511787593147 55.815002448933 +10166 1.0166 1.2058779986962040 55.648598813280 +10167 1.0167 1.2003214520025129 55.482335060541 +10168 1.0168 1.1947815246414089 55.316212161543 +10169 1.0169 1.1892582024790590 55.150231085455 +10170 1.0170 1.1837514712847972 54.984392799780 +10171 1.0171 1.1782613167312912 54.818698270338 +10172 1.0172 1.1727877243947116 54.653148461255 +10173 1.0173 1.1673306797549010 54.487744334955 +10174 1.0174 1.1618901681955460 54.322486852143 +10175 1.0175 1.1564661750043490 54.157376971796 +10176 1.0176 1.1510586853732017 53.992415651152 +10177 1.0177 1.1456676843983593 53.827603845693 +10178 1.0178 1.1402931570806176 53.662942509140 +10179 1.0179 1.1349350883254889 53.498432593435 +10180 1.0180 1.1295934629433806 53.334075048734 +10181 1.0181 1.1242682656497744 53.169870823391 +10182 1.0182 1.1189594810654075 53.005820863949 +10183 1.0183 1.1136670937164539 52.841926115126 +10184 1.0184 1.1083910880347072 52.678187519807 +10185 1.0185 1.1031314483577654 52.514606019027 +10186 1.0186 1.0978881589292160 52.351182551964 +10187 1.0187 1.0926612038988217 52.187918055922 +10188 1.0188 1.0874505673227093 52.024813466325 +10189 1.0189 1.0822562331635579 51.861869716701 +10190 1.0190 1.0770781852907891 51.699087738673 +10191 1.0191 1.0719164074807583 51.536468461945 +10192 1.0192 1.0667708834169465 51.374012814292 +10193 1.0193 1.0616415966901547 51.211721721546 +10194 1.0194 1.0565285307986980 51.049596107588 +10195 1.0195 1.0514316691486019 50.887636894334 +10196 1.0196 1.0463509950537990 50.725845001723 +10197 1.0197 1.0412864917363276 50.564221347706 +10198 1.0198 1.0362381423265306 50.402766848235 +10199 1.0199 1.0312059298632563 50.241482417251 +10200 1.0200 1.0261898372940603 50.080368966671 +10201 1.0201 1.0211898474754078 49.919427406380 +10202 1.0202 1.0162059431728780 49.758658644214 +10203 1.0203 1.0112381070613696 49.598063585955 +10204 1.0204 1.0062863217253062 49.437643135313 +10205 1.0205 1.0013505696588445 49.277398193922 +10206 1.0206 0.9964308332660824 49.117329661318 +10207 1.0207 0.9915270948612696 48.957438434939 +10208 1.0208 0.9866393366690173 48.797725410106 +10209 1.0209 0.9817675408245112 48.638191480015 +10210 1.0210 0.9769116893737244 48.478837535722 +10211 1.0211 0.9720717642736315 48.319664466137 +10212 1.0212 0.9672477473924243 48.160673158009 +10213 1.0213 0.9624396205097281 48.001864495914 +10214 1.0214 0.9576473653168202 47.843239362245 +10215 1.0215 0.9528709634168477 47.684798637203 +10216 1.0216 0.9481103963250486 47.526543198781 +10217 1.0217 0.9433656454689717 47.368473922755 +10218 1.0218 0.9386366921887002 47.210591682676 +10219 1.0219 0.9339235177370737 47.052897349853 +10220 1.0220 0.9292261032799138 46.895391793344 +10221 1.0221 0.9245444298962493 46.738075879946 +10222 1.0222 0.9198784785785428 46.580950474184 +10223 1.0223 0.9152282302329188 46.424016438297 +10224 1.0224 0.9105936656793924 46.267274632231 +10225 1.0225 0.9059747656520997 46.110725913623 +10226 1.0226 0.9013715107995288 45.954371137795 +10227 1.0227 0.8967838816847522 45.798211157738 +10228 1.0228 0.8922118587856601 45.642246824104 +10229 1.0229 0.8876554224951951 45.486478985196 +10230 1.0230 0.8831145531215876 45.330908486954 +10231 1.0231 0.8785892308885926 45.175536172944 +10232 1.0232 0.8740794359357278 45.020362884352 +10233 1.0233 0.8695851483185120 44.865389459964 +10234 1.0234 0.8651063480087056 44.710616736165 +10235 1.0235 0.8606430148945512 44.556045546923 +10236 1.0236 0.8561951287810163 44.401676723775 +10237 1.0237 0.8517626693900364 44.247511095823 +10238 1.0238 0.8473456163607593 44.093549489718 +10239 1.0239 0.8429439492497908 43.939792729654 +10240 1.0240 0.8385576475314406 43.786241637350 +10241 1.0241 0.8341866905979707 43.632897032047 +10242 1.0242 0.8298310577598438 43.479759730492 +10243 1.0243 0.8254907282459728 43.326830546928 +10244 1.0244 0.8211656812039722 43.174110293085 +10245 1.0245 0.8168558957004094 43.021599778170 +10246 1.0246 0.8125613507210582 42.869299808854 +10247 1.0247 0.8082820251711526 42.717211189259 +10248 1.0248 0.8040178978756418 42.565334720956 +10249 1.0249 0.7997689475794467 42.413671202945 +10250 1.0250 0.7955351529477170 42.262221431648 +10251 1.0251 0.7913164925660895 42.110986200903 +10252 1.0252 0.7871129449409472 41.959966301943 +10253 1.0253 0.7829244884996802 41.809162523397 +10254 1.0254 0.7787511015909467 41.658575651272 +10255 1.0255 0.7745927624849359 41.508206468945 +10256 1.0256 0.7704494493736310 41.358055757152 +10257 1.0257 0.7663211403710745 41.208124293979 +10258 1.0258 0.7622078135136331 41.058412854848 +10259 1.0259 0.7581094467602650 40.908922212513 +10260 1.0260 0.7540260179927873 40.759653137041 +10261 1.0261 0.7499575050161448 40.610606395810 +10262 1.0262 0.7459038855586795 40.461782753496 +10263 1.0263 0.7418651372724018 40.313182972057 +10264 1.0264 0.7378412377332624 40.164807810732 +10265 1.0265 0.7338321644414245 40.016658026025 +10266 1.0266 0.7298378948215384 39.868734371697 +10267 1.0267 0.7258584062230159 39.721037598753 +10268 1.0268 0.7218936759203064 39.573568455437 +10269 1.0269 0.7179436811131737 39.426327687215 +10270 1.0270 0.7140083989269744 39.279316036771 +10271 1.0271 0.7100878064129360 39.132534243997 +10272 1.0272 0.7061818805484374 38.985983045974 +10273 1.0273 0.7022905982372900 38.839663176975 +10274 1.0274 0.6984139363100190 38.693575368445 +10275 1.0275 0.6945518715241469 38.547720348997 +10276 1.0276 0.6907043805644771 38.402098844397 +10277 1.0277 0.6868714400433793 38.256711577560 +10278 1.0278 0.6830530265010746 38.111559268534 +10279 1.0279 0.6792491164059232 37.966642634494 +10280 1.0280 0.6754596861547120 37.821962389732 +10281 1.0281 0.6716847120729431 37.677519245645 +10282 1.0282 0.6679241704151244 37.533313910729 +10283 1.0283 0.6641780373650598 37.389347090564 +10284 1.0284 0.6604462890361410 37.245619487811 +10285 1.0285 0.6567289014716406 37.102131802195 +10286 1.0286 0.6530258506450058 36.958884730500 +10287 1.0287 0.6493371124601529 36.815878966558 +10288 1.0288 0.6456626627517630 36.673115201241 +10289 1.0289 0.6420024772855785 36.530594122450 +10290 1.0290 0.6383565317587008 36.388316415104 +10291 1.0291 0.6347248017998889 36.246282761133 +10292 1.0292 0.6311072629698589 36.104493839467 +10293 1.0293 0.6275038907615842 35.962950326027 +10294 1.0294 0.6239146606005970 35.821652893718 +10295 1.0295 0.6203395478452903 35.680602212415 +10296 1.0296 0.6167785277872218 35.539798948956 +10297 1.0297 0.6132315756514173 35.399243767133 +10298 1.0298 0.6096986665966765 35.258937327683 +10299 1.0299 0.6061797757158784 35.118880288277 +10300 1.0300 0.6026748780362889 34.979073303513 +10301 1.0301 0.5991839485198681 34.839517024904 +10302 1.0302 0.5957069620635793 34.700212100872 +10303 1.0303 0.5922438934996990 34.561159176736 +10304 1.0304 0.5887947175961270 34.422358894704 +10305 1.0305 0.5853594090566985 34.283811893866 +10306 1.0306 0.5819379425214961 34.145518810181 +10307 1.0307 0.5785302925671636 34.007480276470 +10308 1.0308 0.5751364337072197 33.869696922409 +10309 1.0309 0.5717563403923734 33.732169374516 +10310 1.0310 0.5683899870108404 33.594898256144 +10311 1.0311 0.5650373478886596 33.457884187474 +10312 1.0312 0.5616983972900107 33.321127785504 +10313 1.0313 0.5583731094175336 33.184629664038 +10314 1.0314 0.5550614584126476 33.048390433682 +10315 1.0315 0.5517634183558719 32.912410701833 +10316 1.0316 0.5484789632671468 32.776691072669 +10317 1.0317 0.5452080671061562 32.641232147143 +10318 1.0318 0.5419507037726505 32.506034522971 +10319 1.0319 0.5387068471067706 32.371098794628 +10320 1.0320 0.5354764708893726 32.236425553333 +10321 1.0321 0.5322595488423536 32.102015387046 +10322 1.0322 0.5290560546289784 31.967868880458 +10323 1.0323 0.5258659618542064 31.833986614983 +10324 1.0324 0.5226892440650202 31.700369168743 +10325 1.0325 0.5195258747507544 31.567017116573 +10326 1.0326 0.5163758273434258 31.433931029999 +10327 1.0327 0.5132390752180640 31.301111477237 +10328 1.0328 0.5101155916930429 31.168559023186 +10329 1.0329 0.5070053500304130 31.036274229411 +10330 1.0330 0.5039083234362353 30.904257654144 +10331 1.0331 0.5008244850609144 30.772509852274 +10332 1.0332 0.4977538079995340 30.641031375333 +10333 1.0333 0.4946962652921926 30.509822771495 +10334 1.0334 0.4916518299243398 30.378884585562 +10335 1.0335 0.4886204748271135 30.248217358964 +10336 1.0336 0.4856021728776783 30.117821629739 +10337 1.0337 0.4825968968995645 29.987697932538 +10338 1.0338 0.4796046196630073 29.857846798606 +10339 1.0339 0.4766253138852879 29.728268755781 +10340 1.0340 0.4736589522310746 29.598964328484 +10341 1.0341 0.4707055073127649 29.469934037711 +10342 1.0342 0.4677649516908280 29.341178401026 +10343 1.0343 0.4648372578741493 29.212697932549 +10344 1.0344 0.4619223983203741 29.084493142956 +10345 1.0345 0.4590203454362530 28.956564539466 +10346 1.0346 0.4561310715779881 28.828912625832 +10347 1.0347 0.4532545490515795 28.701537902339 +10348 1.0348 0.4503907501131731 28.574440865790 +10349 1.0349 0.4475396469694083 28.447622009506 +10350 1.0350 0.4447012117777676 28.321081823309 +10351 1.0351 0.4418754166469260 28.194820793523 +10352 1.0352 0.4390622336371018 28.068839402961 +10353 1.0353 0.4362616347604076 27.943138130922 +10354 1.0354 0.4334735919812025 27.817717453181 +10355 1.0355 0.4306980772164445 27.692577841979 +10356 1.0356 0.4279350623360443 27.567719766024 +10357 1.0357 0.4251845191632194 27.443143690474 +10358 1.0358 0.4224464194748488 27.318850076938 +10359 1.0359 0.4197207350018289 27.194839383461 +10360 1.0360 0.4170074374294295 27.071112064526 +10361 1.0361 0.4143064983976514 26.947668571037 +10362 1.0362 0.4116178895015835 26.824509350320 +10363 1.0363 0.4089415822917618 26.701634846114 +10364 1.0364 0.4062775482745281 26.579045498561 +10365 1.0365 0.4036257589123900 26.456741744200 +10366 1.0366 0.4009861856243818 26.334724015965 +10367 1.0367 0.3983587997864250 26.212992743170 +10368 1.0368 0.3957435727316911 26.091548351509 +10369 1.0369 0.3931404757509632 25.970391263048 +10370 1.0370 0.3905494800930001 25.849521896215 +10371 1.0371 0.3879705569648996 25.728940665795 +10372 1.0372 0.3854036775324636 25.608647982925 +10373 1.0373 0.3828488129205630 25.488644255087 +10374 1.0374 0.3803059342135037 25.368929886099 +10375 1.0375 0.3777750124553931 25.249505276113 +10376 1.0376 0.3752560186505074 25.130370821601 +10377 1.0377 0.3727489237636594 25.011526915358 +10378 1.0378 0.3702536987205672 24.892973946487 +10379 1.0379 0.3677703144082228 24.774712300401 +10380 1.0380 0.3652987416752623 24.656742358809 +10381 1.0381 0.3628389513323361 24.539064499714 +10382 1.0382 0.3603909141524801 24.421679097405 +10383 1.0383 0.3579546008714872 24.304586522454 +10384 1.0384 0.3555299821882791 24.187787141707 +10385 1.0385 0.3531170287652799 24.071281318277 +10386 1.0386 0.3507157112287891 23.955069411539 +10387 1.0387 0.3483260001693557 23.839151777129 +10388 1.0388 0.3459478661421528 23.723528766929 +10389 1.0389 0.3435812796673530 23.608200729068 +10390 1.0390 0.3412262112305039 23.493168007914 +10391 1.0391 0.3388826312829049 23.378430944067 +10392 1.0392 0.3365505102419837 23.263989874355 +10393 1.0393 0.3342298184916746 23.149845131828 +10394 1.0394 0.3319205263827956 23.035997045752 +10395 1.0395 0.3296226042334279 22.922445941603 +10396 1.0396 0.3273360223292946 22.809192141063 +10397 1.0397 0.3250607509241409 22.696235962010 +10398 1.0398 0.3227967602401144 22.583577718521 +10399 1.0399 0.3205440204681455 22.471217720858 +10400 1.0400 0.3183025017683292 22.359156275467 +10401 1.0401 0.3160721742703073 22.247393684970 +10402 1.0402 0.3138530080736506 22.135930248165 +10403 1.0403 0.3116449732482416 22.024766260015 +10404 1.0404 0.3094480398346585 21.913902011646 +10405 1.0405 0.3072621778445593 21.803337790339 +10406 1.0406 0.3050873572610659 21.693073879529 +10407 1.0407 0.3029235480391496 21.583110558797 +10408 1.0408 0.3007707201060165 21.473448103866 +10409 1.0409 0.2986288433614934 21.364086786595 +10410 1.0410 0.2964978876784149 21.255026874976 +10411 1.0411 0.2943778229030097 21.146268633127 +10412 1.0412 0.2922686188552888 21.037812321291 +10413 1.0413 0.2901702453294331 20.929658195824 +10414 1.0414 0.2880826720941818 20.821806509201 +10415 1.0415 0.2860058688932219 20.714257509997 +10416 1.0416 0.2839398054455771 20.607011442900 +10417 1.0417 0.2818844514459976 20.500068548690 +10418 1.0418 0.2798397765653509 20.393429064244 +10419 1.0419 0.2778057504510121 20.287093222530 +10420 1.0420 0.2757823427272556 20.181061252601 +10421 1.0421 0.2737695229956460 20.075333379591 +10422 1.0422 0.2717672608354310 19.969909824710 +10423 1.0423 0.2697755258039332 19.864790805245 +10424 1.0424 0.2677942874369436 19.759976534547 +10425 1.0425 0.2658235152491146 19.655467222034 +10426 1.0426 0.2638631787343537 19.551263073184 +10427 1.0427 0.2619132473662178 19.447364289532 +10428 1.0428 0.2599736905983080 19.343771068664 +10429 1.0429 0.2580444778646641 19.240483604216 +10430 1.0430 0.2561255785801599 19.137502085867 +10431 1.0431 0.2542169621408996 19.034826699339 +10432 1.0432 0.2523185979246133 18.932457626387 +10433 1.0433 0.2504304552910536 18.830395044806 +10434 1.0434 0.2485525035823926 18.728639128414 +10435 1.0435 0.2466847121236190 18.627190047058 +10436 1.0436 0.2448270502229357 18.526047966609 +10437 1.0437 0.2429794871721576 18.425213048953 +10438 1.0438 0.2411419922471102 18.324685451994 +10439 1.0439 0.2393145347080281 18.224465329649 +10440 1.0440 0.2374970837999535 18.124552831843 +10441 1.0441 0.2356896087531362 18.024948104503 +10442 1.0442 0.2338920787834328 17.925651289565 +10443 1.0443 0.2321044630927066 17.826662524958 +10444 1.0444 0.2303267308692281 17.727981944611 +10445 1.0445 0.2285588512880754 17.629609678443 +10446 1.0446 0.2268007935115350 17.531545852365 +10447 1.0447 0.2250525266895031 17.433790588274 +10448 1.0448 0.2233140199598868 17.336344004051 +10449 1.0449 0.2215852424490063 17.239206213559 +10450 1.0450 0.2198661632719965 17.142377326639 +10451 1.0451 0.2181567515332092 17.045857449107 +10452 1.0452 0.2164569763266163 16.949646682751 +10453 1.0453 0.2147668067362120 16.853745125334 +10454 1.0454 0.2130862118364162 16.758152870582 +10455 1.0455 0.2114151606924777 16.662870008188 +10456 1.0456 0.2097536223608779 16.567896623808 +10457 1.0457 0.2081015658897345 16.473232799060 +10458 1.0458 0.2064589603192056 16.378878611519 +10459 1.0459 0.2048257746818940 16.284834134713 +10460 1.0460 0.2032019780032519 16.191099438128 +10461 1.0461 0.2015875393019855 16.097674587200 +10462 1.0462 0.1999824275904598 16.004559643315 +10463 1.0463 0.1983866118751038 15.911754663805 +10464 1.0464 0.1968000611568161 15.819259701948 +10465 1.0465 0.1952227444313703 15.727074806968 +10466 1.0466 0.1936546306898206 15.635200024027 +10467 1.0467 0.1920956889189078 15.543635394229 +10468 1.0468 0.1905458881014655 15.452380954617 +10469 1.0469 0.1890051972168263 15.361436738167 +10470 1.0470 0.1874735852412282 15.270802773794 +10471 1.0471 0.1859510211482213 15.180479086344 +10472 1.0472 0.1844374739090743 15.090465696595 +10473 1.0473 0.1829329124931817 15.000762621257 +10474 1.0474 0.1814373058684706 14.911369872966 +10475 1.0475 0.1799506230018079 14.822287460288 +10476 1.0476 0.1784728328594076 14.733515387717 +10477 1.0477 0.1770039044072383 14.645053655669 +10478 1.0478 0.1755438066114306 14.556902260486 +10479 1.0479 0.1740925084386846 14.469061194433 +10480 1.0480 0.1726499788566782 14.381530445696 +10481 1.0481 0.1712161868344742 14.294309998384 +10482 1.0482 0.1697911013429287 14.207399832525 +10483 1.0483 0.1683746913550992 14.120799924066 +10484 1.0484 0.1669669258466520 14.034510244877 +10485 1.0485 0.1655677737962712 13.948530762740 +10486 1.0486 0.1641772041860662 13.862861441359 +10487 1.0487 0.1627951860019807 13.777502240352 +10488 1.0488 0.1614216882342003 13.692453115256 +10489 1.0489 0.1600566798775613 13.607714017523 +10490 1.0490 0.1587001299319593 13.523284894518 +10491 1.0491 0.1573520074027571 13.439165689526 +10492 1.0492 0.1560122813011935 13.355356341746 +10493 1.0493 0.1546809206447918 13.271856786287 +10494 1.0494 0.1533578944577684 13.188666954181 +10495 1.0495 0.1520431717714409 13.105786772370 +10496 1.0496 0.1507367216246369 13.023216163709 +10497 1.0497 0.1494385130641029 12.940955046973 +10498 1.0498 0.1481485151449118 12.859003336849 +10499 1.0499 0.1468666969308724 12.777360943939 +10500 1.0500 0.1455930274949372 12.696027774764 +10501 1.0501 0.1443274759196112 12.615003731757 +10502 1.0502 0.1430700112973598 12.534288713271 +10503 1.0503 0.1418206027310177 12.453882613571 +10504 1.0504 0.1405792193341968 12.373785322846 +10505 1.0505 0.1393458302316945 12.293996727200 +10506 1.0506 0.1381204045599018 12.214516708654 +10507 1.0507 0.1369029114672116 12.135345145150 +10508 1.0508 0.1356933201144264 12.056481910554 +10509 1.0509 0.1344915996751663 11.977926874648 +10510 1.0510 0.1332977193362769 11.899679903140 +10511 1.0511 0.1321116482982369 11.821740857660 +10512 1.0512 0.1309333557755658 11.744109595763 +10513 1.0513 0.1297628109972312 11.666785970928 +10514 1.0514 0.1285999832070566 11.589769832565 +10515 1.0515 0.1274448416641279 11.513061026009 +10516 1.0516 0.1262973556432012 11.436659392525 +10517 1.0517 0.1251574944351094 11.360564769310 +10518 1.0518 0.1240252273471691 11.284776989495 +10519 1.0519 0.1229005237035873 11.209295882142 +10520 1.0520 0.1217833528458677 11.134121272251 +10521 1.0521 0.1206736841332171 11.059252980760 +10522 1.0522 0.1195714869429518 10.984690824547 +10523 1.0523 0.1184767306709029 10.910434616430 +10524 1.0524 0.1173893847318228 10.836484165173 +10525 1.0525 0.1163094185597901 10.762839275481 +10526 1.0526 0.1152368016086155 10.689499748011 +10527 1.0527 0.1141715033522465 10.616465379368 +10528 1.0528 0.1131134932851727 10.543735962109 +10529 1.0529 0.1120627409228300 10.471311284745 +10530 1.0530 0.1110192158020054 10.399191131746 +10531 1.0531 0.1099828874812413 10.327375283537 +10532 1.0532 0.1089537255412389 10.255863516510 +10533 1.0533 0.1079316995852625 10.184655603018 +10534 1.0534 0.1069167792395425 10.113751311382 +10535 1.0535 0.1059089341536788 10.043150405893 +10536 1.0536 0.1049081340010433 9.972852646816 +10537 1.0537 0.1039143484791831 9.902857790388 +10538 1.0538 0.1029275473102222 9.833165588830 +10539 1.0539 0.1019477002412638 9.763775790339 +10540 1.0540 0.1009747770447917 9.694688139103 +10541 1.0541 0.1000087475190719 9.625902375293 +10542 1.0542 0.0990495814885536 9.557418235073 +10543 1.0543 0.0980972488042697 9.489235450604 +10544 1.0544 0.0971517193442373 9.421353750044 +10545 1.0545 0.0962129630138576 9.353772857551 +10546 1.0546 0.0952809497463155 9.286492493291 +10547 1.0547 0.0943556495029791 9.219512373437 +10548 1.0548 0.0934370322737984 9.152832210176 +10549 1.0549 0.0925250680777039 9.086451711714 +10550 1.0550 0.0916197269630046 9.020370582272 +10551 1.0551 0.0907209790077859 8.954588522102 +10552 1.0552 0.0898287943203068 8.889105227480 +10553 1.0553 0.0889431430393970 8.823920390717 +10554 1.0554 0.0880639953348530 8.759033700163 +10555 1.0555 0.0871913214078346 8.694444840204 +10556 1.0556 0.0863250914912606 8.630153491276 +10557 1.0557 0.0854652758502036 8.566159329865 +10558 1.0558 0.0846118447822847 8.502462028513 +10559 1.0559 0.0837647686180682 8.439061255817 +10560 1.0560 0.0829240177214552 8.375956676442 +10561 1.0561 0.0820895624900770 8.313147951122 +10562 1.0562 0.0812613733556878 8.250634736663 +10563 1.0563 0.0804394207845571 8.188416685951 +10564 1.0564 0.0796236752778617 8.126493447957 +10565 1.0565 0.0788141073720770 8.064864667737 +10566 1.0566 0.0780106876393677 8.003529986448 +10567 1.0567 0.0772133866879784 7.942489041338 +10568 1.0568 0.0764221751626230 7.881741465769 +10569 1.0569 0.0756370237448743 7.821286889206 +10570 1.0570 0.0748579031535525 7.761124937231 +10571 1.0571 0.0740847841451133 7.701255231552 +10572 1.0572 0.0733176375140357 7.641677390001 +10573 1.0573 0.0725564340932086 7.582391026541 +10574 1.0574 0.0718011447543176 7.523395751279 +10575 1.0575 0.0710517404082305 7.464691170461 +10576 1.0576 0.0703081920053831 7.406276886488 +10577 1.0577 0.0695704705361629 7.348152497916 +10578 1.0578 0.0688385470312938 7.290317599466 +10579 1.0579 0.0681123925622192 7.232771782026 +10580 1.0580 0.0673919782414849 7.175514632660 +10581 1.0581 0.0666772752231210 7.118545734617 +10582 1.0582 0.0659682547030236 7.061864667332 +10583 1.0583 0.0652648879193352 7.005471006435 +10584 1.0584 0.0645671461528253 6.949364323763 +10585 1.0585 0.0638750007272694 6.893544187355 +10586 1.0586 0.0631884230098281 6.838010161471 +10587 1.0587 0.0625073844114250 6.782761806592 +10588 1.0588 0.0618318563871240 6.727798679428 +10589 1.0589 0.0611618104365061 6.673120332929 +10590 1.0590 0.0604972181040453 6.618726316288 +10591 1.0591 0.0598380509794835 6.564616174947 +10592 1.0592 0.0591842806982057 6.510789450609 +10593 1.0593 0.0585358789416131 6.457245681244 +10594 1.0594 0.0578928174374960 6.403984401098 +10595 1.0595 0.0572550679604064 6.351005140694 +10596 1.0596 0.0566226023320293 6.298307426849 +10597 1.0597 0.0559953924215531 6.245890782674 +10598 1.0598 0.0553734101460400 6.193754727588 +10599 1.0599 0.0547566274707945 6.141898777323 +10600 1.0600 0.0541450164097317 6.090322443933 +10601 1.0601 0.0535385490257451 6.039025235799 +10602 1.0602 0.0529371974310730 5.988006657643 +10603 1.0603 0.0523409337876641 5.937266210534 +10604 1.0604 0.0517497303075428 5.886803391892 +10605 1.0605 0.0511635592531729 5.836617695506 +10606 1.0606 0.0505823929378210 5.786708611533 +10607 1.0607 0.0500062037259187 5.737075626513 +10608 1.0608 0.0494349640334241 5.687718223378 +10609 1.0609 0.0488686463281825 5.638635881455 +10610 1.0610 0.0483072231302857 5.589828076480 +10611 1.0611 0.0477506670124314 5.541294280607 +10612 1.0612 0.0471989506002801 5.493033962418 +10613 1.0613 0.0466520465728129 5.445046586926 +10614 1.0614 0.0461099276626869 5.397331615594 +10615 1.0615 0.0455725666565903 5.349888506338 +10616 1.0616 0.0450399363955967 5.302716713534 +10617 1.0617 0.0445120097755180 5.255815688040 +10618 1.0618 0.0439887597472564 5.209184877192 +10619 1.0619 0.0434701593171557 5.162823724821 +10620 1.0620 0.0429561815473516 5.116731671262 +10621 1.0621 0.0424467995561203 5.070908153364 +10622 1.0622 0.0419419865182272 5.025352604498 +10623 1.0623 0.0414417156652737 4.980064454572 +10624 1.0624 0.0409459602860432 4.935043130039 +10625 1.0625 0.0404546937268461 4.890288053902 +10626 1.0626 0.0399678893918642 4.845798645736 +10627 1.0627 0.0394855207434931 4.801574321687 +10628 1.0628 0.0390075613026842 4.757614494491 +10629 1.0629 0.0385339846492854 4.713918573484 +10630 1.0630 0.0380647644223809 4.670485964607 +10631 1.0631 0.0375998743206295 4.627316070421 +10632 1.0632 0.0371392881026023 4.584408290122 +10633 1.0633 0.0366829795871191 4.541762019542 +10634 1.0634 0.0362309226535832 4.499376651177 +10635 1.0635 0.0357830912423154 4.457251574178 +10636 1.0636 0.0353394593548877 4.415386174376 +10637 1.0637 0.0349000010544542 4.373779834293 +10638 1.0638 0.0344646904660821 4.332431933150 +10639 1.0639 0.0340335017770806 4.291341846880 +10640 1.0640 0.0336064092373296 4.250508948139 +10641 1.0641 0.0331833871596067 4.209932606320 +10642 1.0642 0.0327644099199124 4.169612187566 +10643 1.0643 0.0323494519577953 4.129547054775 +10644 1.0644 0.0319384877766754 4.089736567624 +10645 1.0645 0.0315314919441655 4.050180082574 +10646 1.0646 0.0311284390923927 4.010876952882 +10647 1.0647 0.0307293039183177 3.971826528617 +10648 1.0648 0.0303340611840532 3.933028156674 +10649 1.0649 0.0299426857171807 3.894481180776 +10650 1.0650 0.0295551524110666 3.856184941506 +10651 1.0651 0.0291714362251762 3.818138776302 +10652 1.0652 0.0287915121853871 3.780342019480 +10653 1.0653 0.0284153553843008 3.742794002246 +10654 1.0654 0.0280429409815530 3.705494052710 +10655 1.0655 0.0276742442041230 3.668441495890 +10656 1.0656 0.0273092403466414 3.631635653741 +10657 1.0657 0.0269479047716964 3.595075845160 +10658 1.0658 0.0265902129101385 3.558761385998 +10659 1.0659 0.0262361402613846 3.522691589080 +10660 1.0660 0.0258856623937199 3.486865764213 +10661 1.0661 0.0255387549445989 3.451283218208 +10662 1.0662 0.0251953936209442 3.415943254886 +10663 1.0663 0.0248555541994451 3.380845175096 +10664 1.0664 0.0245192125268539 3.345988276728 +10665 1.0665 0.0241863445202810 3.311371854730 +10666 1.0666 0.0238569261674882 3.276995201125 +10667 1.0667 0.0235309335271811 3.242857605018 +10668 1.0668 0.0232083427292995 3.208958352614 +10669 1.0669 0.0228891299753068 3.175296727239 +10670 1.0670 0.0225732715384775 3.141872009348 +10671 1.0671 0.0222607437641829 3.108683476543 +10672 1.0672 0.0219515230701764 3.075730403587 +10673 1.0673 0.0216455859468760 3.043012062421 +10674 1.0674 0.0213429089576460 3.010527722179 +10675 1.0675 0.0210434687390768 2.978276649206 +10676 1.0676 0.0207472420012632 2.946258107066 +10677 1.0677 0.0204542055280816 2.914471356566 +10678 1.0678 0.0201643361774645 2.882915655775 +10679 1.0679 0.0198776108816746 2.851590260024 +10680 1.0680 0.0195940066475763 2.820494421941 +10681 1.0681 0.0193135005569065 2.789627391455 +10682 1.0682 0.0190360697665428 2.758988415819 +10683 1.0683 0.0187616915087708 2.728576739621 +10684 1.0684 0.0184903430915494 2.698391604808 +10685 1.0685 0.0182220018987743 2.668432250694 +10686 1.0686 0.0179566453905403 2.638697913985 +10687 1.0687 0.0176942511034014 2.609187828793 +10688 1.0688 0.0174347966506294 2.579901226648 +10689 1.0689 0.0171782597224706 2.550837336527 +10690 1.0690 0.0169246180864015 2.521995384855 +10691 1.0691 0.0166738495873818 2.493374595540 +10692 1.0692 0.0164259321481057 2.464974189982 +10693 1.0693 0.0161808437692524 2.436793387084 +10694 1.0694 0.0159385625297338 2.408831403287 +10695 1.0695 0.0156990665869409 2.381087452571 +10696 1.0696 0.0154623341769884 2.353560746480 +10697 1.0697 0.0152283436149571 2.326250494145 +10698 1.0698 0.0149970732951353 2.299155902291 +10699 1.0699 0.0147685016912572 2.272276175272 +10700 1.0700 0.0145426073567402 2.245610515067 +10701 1.0701 0.0143193689249209 2.219158121320 +10702 1.0702 0.0140987651092873 2.192918191351 +10703 1.0703 0.0138807747037115 2.166889920165 +10704 1.0704 0.0136653765826789 2.141072500488 +10705 1.0705 0.0134525497015156 2.115465122777 +10706 1.0706 0.0132422730966151 2.090066975234 +10707 1.0707 0.0130345258856614 2.064877243840 +10708 1.0708 0.0128292872678512 2.039895112363 +10709 1.0709 0.0126265365241140 2.015119762381 +10710 1.0710 0.0124262530173300 1.990550373299 +10711 1.0711 0.0122284161925464 1.966186122374 +10712 1.0712 0.0120330055771910 1.942026184734 +10713 1.0713 0.0118400007812846 1.918069733393 +10714 1.0714 0.0116493814976511 1.894315939277 +10715 1.0715 0.0114611275021252 1.870763971243 +10716 1.0716 0.0112752186537581 1.847412996098 +10717 1.0717 0.0110916348950223 1.824262178619 +10718 1.0718 0.0109103562520126 1.801310681573 +10719 1.0719 0.0107313628346465 1.778557665749 +10720 1.0720 0.0105546348368612 1.756002289959 +10721 1.0721 0.0103801525368095 1.733643711074 +10722 1.0722 0.0102078962970537 1.711481084043 +10723 1.0723 0.0100378465647558 1.689513561915 +10724 1.0724 0.0098699838718676 1.667740295849 +10725 1.0725 0.0097042888353176 1.646160435151 +10726 1.0726 0.0095407421571954 1.624773127293 +10727 1.0727 0.0093793246249346 1.603577517922 +10728 1.0728 0.0092200171114936 1.582572750899 +10729 1.0729 0.0090628005755333 1.561757968307 +10730 1.0730 0.0089076560615937 1.541132310484 +10731 1.0731 0.0087545647002673 1.520694916044 +10732 1.0732 0.0086035077083707 1.500444921889 +10733 1.0733 0.0084544663891142 1.480381463241 +10734 1.0734 0.0083074221322687 1.460503673669 +10735 1.0735 0.0081623564143303 1.440810685098 +10736 1.0736 0.0080192507986833 1.421301627843 +10737 1.0737 0.0078780869357596 1.401975630630 +10738 1.0738 0.0077388465631973 1.382831820617 +10739 1.0739 0.0076015115059954 1.363869323421 +10740 1.0740 0.0074660636766676 1.345087263135 +10741 1.0741 0.0073324850753930 1.326484762356 +10742 1.0742 0.0072007577901645 1.308060942215 +10743 1.0743 0.0070708639969343 1.289814922389 +10744 1.0744 0.0069427859597585 1.271745821127 +10745 1.0745 0.0068165060309377 1.253852755289 +10746 1.0746 0.0066920066511557 1.236134840351 +10747 1.0747 0.0065692703496163 1.218591190437 +10748 1.0748 0.0064482797441769 1.201220918350 +10749 1.0749 0.0063290175414800 1.184023135589 +10750 1.0750 0.0062114665370820 1.166996952370 +10751 1.0751 0.0060956096155803 1.150141477664 +10752 1.0752 0.0059814297507363 1.133455819216 +10753 1.0753 0.0058689100055975 1.116939083561 +10754 1.0754 0.0057580335326161 1.100590376067 +10755 1.0755 0.0056487835737656 1.084408800942 +10756 1.0756 0.0055411434606546 1.068393461278 +10757 1.0757 0.0054350966146375 1.052543459064 +10758 1.0758 0.0053306265469237 1.036857895211 +10759 1.0759 0.0052277168586837 1.021335869590 +10760 1.0760 0.0051263512411516 1.005976481052 +10761 1.0761 0.0050265134757268 0.990778827444 +10762 1.0762 0.0049281874340719 0.975742005655 +10763 1.0763 0.0048313570782079 0.960865111625 +10764 1.0764 0.0047360064606075 0.946147240382 +10765 1.0765 0.0046421197242849 0.931587486071 +10766 1.0766 0.0045496811028828 0.917184941969 +10767 1.0767 0.0044586749207582 0.902938700523 +10768 1.0768 0.0043690855930633 0.888847853375 +10769 1.0769 0.0042808976258253 0.874911491386 +10770 1.0770 0.0041940956160226 0.861128704668 +10771 1.0771 0.0041086642516587 0.847498582610 +10772 1.0772 0.0040245883118330 0.834020213903 +10773 1.0773 0.0039418526668094 0.820692686569 +10774 1.0774 0.0038604422780810 0.807515087999 +10775 1.0775 0.0037803421984325 0.794486504971 +10776 1.0776 0.0037015375720005 0.781606023670 +10777 1.0777 0.0036240136343299 0.768872729743 +10778 1.0778 0.0035477557124276 0.756285708302 +10779 1.0779 0.0034727492248142 0.743844043967 +10780 1.0780 0.0033989796815715 0.731546820887 +10781 1.0781 0.0033264326843881 0.719393122780 +10782 1.0782 0.0032550939266016 0.707382032950 +10783 1.0783 0.0031849491932377 0.695512634328 +10784 1.0784 0.0031159843610471 0.683784009485 +10785 1.0785 0.0030481853985386 0.672195240684 +10786 1.0786 0.0029815383660096 0.660745409896 +10787 1.0787 0.0029160294155733 0.649433598830 +10788 1.0788 0.0028516447911837 0.638258888962 +10789 1.0789 0.0027883708286568 0.627220361576 +10790 1.0790 0.0027261939556886 0.616317097789 +10791 1.0791 0.0026651006918706 0.605548178571 +10792 1.0792 0.0026050776487022 0.594912684797 +10793 1.0793 0.0025461115295996 0.584409697255 +10794 1.0794 0.0024881891299019 0.574038296699 +10795 1.0795 0.0024312973368741 0.563797563857 +10796 1.0796 0.0023754231297069 0.553686579486 +10797 1.0797 0.0023205535795131 0.543704424390 +10798 1.0798 0.0022666758493212 0.533850179448 +10799 1.0799 0.0022137771940656 0.524122925664 +10800 1.0800 0.0021618449605738 0.514521744172 +10801 1.0801 0.0021108665875506 0.505045716293 +10802 1.0802 0.0020608296055578 0.495693923563 +10803 1.0803 0.0020117216369922 0.486465447748 +10804 1.0804 0.0019635303960603 0.477359370891 +10805 1.0805 0.0019162436887484 0.468374775347 +10806 1.0806 0.0018698494127906 0.459510743809 +10807 1.0807 0.0018243355576327 0.450766359348 +10808 1.0808 0.0017796902043936 0.442140705434 +10809 1.0809 0.0017359015258228 0.433632865983 +10810 1.0810 0.0016929577862545 0.425241925382 +10811 1.0811 0.0016508473415590 0.416966968528 +10812 1.0812 0.0016095586390897 0.408807080858 +10813 1.0813 0.0015690802176278 0.400761348381 +10814 1.0814 0.0015294007073227 0.392828857720 +10815 1.0815 0.0014905088296297 0.385008696140 +10816 1.0816 0.0014523933972435 0.377299951584 +10817 1.0817 0.0014150433140288 0.369701712711 +10818 1.0818 0.0013784475749471 0.362213068922 +10819 1.0819 0.0013425952659805 0.354833110410 +10820 1.0820 0.0013074755640514 0.347560928172 +10821 1.0821 0.0012730777369392 0.340395614072 +10822 1.0822 0.0012393911431929 0.333336260855 +10823 1.0823 0.0012064052320405 0.326381962192 +10824 1.0824 0.0011741095432952 0.319531812714 +10825 1.0825 0.0011424937072572 0.312784908047 +10826 1.0826 0.0011115474446122 0.306140344852 +10827 1.0827 0.0010812605663269 0.299597220855 +10828 1.0828 0.0010516229735397 0.293154634889 +10829 1.0829 0.0010226246574491 0.286811686921 +10830 1.0830 0.0009942556991976 0.280567478110 +10831 1.0831 0.0009665062697512 0.274421110818 +10832 1.0832 0.0009393666297772 0.268371688663 +10833 1.0833 0.0009128271295165 0.262418316551 +10834 1.0834 0.0008868782086531 0.256560100717 +10835 1.0835 0.0008615103961794 0.250796148757 +10836 1.0836 0.0008367143102582 0.245125569667 +10837 1.0837 0.0008124806580803 0.239547473891 +10838 1.0838 0.0007888002357185 0.234060973344 +10839 1.0839 0.0007656639279785 0.228665181457 +10840 1.0840 0.0007430627082448 0.223359213216 +10841 1.0841 0.0007209876383239 0.218142185203 +10842 1.0842 0.0006994298682825 0.213013215624 +10843 1.0843 0.0006783806362830 0.207971424366 +10844 1.0844 0.0006578312684139 0.203015933017 +10845 1.0845 0.0006377731785172 0.198145864916 +10846 1.0846 0.0006181978680119 0.193360345191 +10847 1.0847 0.0005990969257125 0.188658500797 +10848 1.0848 0.0005804620276449 0.184039460555 +10849 1.0849 0.0005622849368572 0.179502355198 +10850 1.0850 0.0005445575032274 0.175046317398 +10851 1.0851 0.0005272716632662 0.170670481827 +10852 1.0852 0.0005104194399165 0.166373985167 +10853 1.0853 0.0004939929423488 0.162155966187 +10854 1.0854 0.0004779843657518 0.158015565753 +10855 1.0855 0.0004623859911197 0.153951926889 +10856 1.0856 0.0004471901850352 0.149964194801 +10857 1.0857 0.0004323893994483 0.146051516936 +10858 1.0858 0.0004179761714509 0.142213043013 +10859 1.0859 0.0004039431230473 0.138447925058 +10860 1.0860 0.0003902829609210 0.134755317469 +10861 1.0861 0.0003769884761960 0.131134377031 +10862 1.0862 0.0003640525441954 0.127584262980 +10863 1.0863 0.0003514681241949 0.124104137030 +10864 1.0864 0.0003392282591727 0.120693163414 +10865 1.0865 0.0003273260755543 0.117350508954 +10866 1.0866 0.0003157547829535 0.114075343062 +10867 1.0867 0.0003045076739095 0.110866837818 +10868 1.0868 0.0002935781236189 0.107724167994 +10869 1.0869 0.0002829595896640 0.104646511105 +10870 1.0870 0.0002726456117360 0.101633047454 +10871 1.0871 0.0002626298113548 0.098682960170 +10872 1.0872 0.0002529058915840 0.095795435247 +10873 1.0873 0.0002434676367412 0.092969661608 +10874 1.0874 0.0002343089121044 0.090204831129 +10875 1.0875 0.0002254236636133 0.087500138693 +10876 1.0876 0.0002168059175669 0.084854782235 +10877 1.0877 0.0002084497803163 0.082267962776 +10878 1.0878 0.0002003494379531 0.079738884489 +10879 1.0879 0.0001924991559926 0.077266754721 +10880 1.0880 0.0001848932790538 0.074850784055 +10881 1.0881 0.0001775262305334 0.072490186352 +10882 1.0882 0.0001703925122766 0.070184178785 +10883 1.0883 0.0001634867042423 0.067931981900 +10884 1.0884 0.0001568034641644 0.065732819658 +10885 1.0885 0.0001503375272079 0.063585919473 +10886 1.0886 0.0001440837056206 0.061490512273 +10887 1.0887 0.0001380368883804 0.059445832530 +10888 1.0888 0.0001321920408378 0.057451118322 +10889 1.0889 0.0001265442043530 0.055505611374 +10890 1.0890 0.0001210884959298 0.053608557091 +10891 1.0891 0.0001158201078430 0.051759204644 +10892 1.0892 0.0001107343072624 0.049956806968 +10893 1.0893 0.0001058264358719 0.048200620843 +10894 1.0894 0.0001010919094829 0.046489906937 +10895 1.0895 0.0000965262176438 0.044823929845 +10896 1.0896 0.0000921249232441 0.043201958148 +10897 1.0897 0.0000878836621143 0.041623264449 +10898 1.0898 0.0000837981426202 0.040087125432 +10899 1.0899 0.0000798641452531 0.038592821910 +10900 1.0900 0.0000760775222143 0.037139638866 +10901 1.0901 0.0000724341969954 0.035726865513 +10902 1.0902 0.0000689301639531 0.034353795333 +10903 1.0903 0.0000655614878794 0.033019726141 +10904 1.0904 0.0000623243035668 0.031723960111 +10905 1.0905 0.0000592148153684 0.030465803857 +10906 1.0906 0.0000562292967526 0.029244568458 +10907 1.0907 0.0000533640898539 0.028059569516 +10908 1.0908 0.0000506156050177 0.026910127209 +10909 1.0909 0.0000479803203400 0.025795566344 +10910 1.0910 0.0000454547812025 0.024715216407 +10911 1.0911 0.0000430355998020 0.023668411603 +10912 1.0912 0.0000407194546760 0.022654490917 +10913 1.0913 0.0000385030902213 0.021672798176 +10914 1.0914 0.0000363833162086 0.020722682078 +10915 1.0915 0.0000343570072916 0.019803496262 +10916 1.0916 0.0000324211025110 0.018914599350 +10917 1.0917 0.0000305726047935 0.018055355001 +10918 1.0918 0.0000288085804450 0.017225131969 +10919 1.0919 0.0000271261586386 0.016423304158 +10920 1.0920 0.0000255225308978 0.015649250658 +10921 1.0921 0.0000239949505744 0.014902355811 +10922 1.0922 0.0000225407323202 0.014182009273 +10923 1.0923 0.0000211572515542 0.013487606046 +10924 1.0924 0.0000198419439246 0.012818546546 +10925 1.0925 0.0000185923047646 0.012174236655 +10926 1.0926 0.0000174058885430 0.011554087776 +10927 1.0927 0.0000162803083101 0.010957516881 +10928 1.0928 0.0000152132351372 0.010383946578 +10929 1.0929 0.0000142023975512 0.009832805142 +10930 1.0930 0.0000132455809640 0.009303526601 +10931 1.0931 0.0000123406270956 0.008795550768 +10932 1.0932 0.0000114854333918 0.008308323307 +10933 1.0933 0.0000106779524373 0.007841295783 +10934 1.0934 0.0000099161913620 0.007393925723 +10935 1.0935 0.0000091982112426 0.006965676665 +10936 1.0936 0.0000085221264982 0.006556018223 +10937 1.0937 0.0000078861042801 0.006164426141 +10938 1.0938 0.0000072883638560 0.005790382341 +10939 1.0939 0.0000067271759896 0.005433374986 +10940 1.0940 0.0000062008623133 0.005092898541 +10941 1.0941 0.0000057077946946 0.004768453831 +10942 1.0942 0.0000052463945990 0.004459548082 +10943 1.0943 0.0000048151324451 0.004165694997 +10944 1.0944 0.0000044125269547 0.003886414811 +10945 1.0945 0.0000040371444973 0.003621234336 +10946 1.0946 0.0000036875984288 0.003369687033 +10947 1.0947 0.0000033625484234 0.003131313075 +10948 1.0948 0.0000030606998009 0.002905659376 +10949 1.0949 0.0000027808028475 0.002692279692 +10950 1.0950 0.0000025216521309 0.002490734641 +10951 1.0951 0.0000022820858090 0.002300591796 +10952 1.0952 0.0000020609849337 0.002121425711 +10953 1.0953 0.0000018572727477 0.001952818009 +10954 1.0954 0.0000016699139756 0.001794357432 +10955 1.0955 0.0000014979141091 0.001645639898 +10956 1.0956 0.0000013403186865 0.001506268554 +10957 1.0957 0.0000011962125655 0.001375853866 +10958 1.0958 0.0000010647191904 0.001254013637 +10959 1.0959 0.0000009449998532 0.001140373105 +10960 1.0960 0.0000008362529484 0.001034564991 +10961 1.0961 0.0000007377132216 0.000936229546 +10962 1.0962 0.0000006486510122 0.000845014642 +10963 1.0963 0.0000005683714894 0.000760575813 +10964 1.0964 0.0000004962138834 0.000682576309 +10965 1.0965 0.0000004315507083 0.000610687192 +10966 1.0966 0.0000003737869807 0.000544587361 +10967 1.0967 0.0000003223594303 0.000483963647 +10968 1.0968 0.0000002767357060 0.000428510838 +10969 1.0969 0.0000002364135746 0.000377931790 +10970 1.0970 0.0000002009201127 0.000331937448 +10971 1.0971 0.0000001698108937 0.000290246931 +10972 1.0972 0.0000001426691673 0.000252587597 +10973 1.0973 0.0000001191050332 0.000218695086 +10974 1.0974 0.0000000987546079 0.000188313420 +10975 1.0975 0.0000000812791854 0.000161195030 +10976 1.0976 0.0000000663643913 0.000137100852 +10977 1.0977 0.0000000537193301 0.000115800371 +10978 1.0978 0.0000000430757274 0.000097071684 +10979 1.0979 0.0000000341870639 0.000080701586 +10980 1.0980 0.0000000268277032 0.000066485628 +10981 1.0981 0.0000000207920133 0.000054228171 +10982 1.0982 0.0000000158934821 0.000043742451 +10983 1.0983 0.0000000119638259 0.000034850674 +10984 1.0984 0.0000000088520896 0.000027384052 +10985 1.0985 0.0000000064237434 0.000021182871 +10986 1.0986 0.0000000045597703 0.000016096591 +10987 1.0987 0.0000000031557477 0.000011983863 +10988 1.0988 0.0000000021209224 0.000008712642 +10989 1.0989 0.0000000013772786 0.000006160234 +10990 1.0990 0.0000000008585994 0.000004213351 +10991 1.0991 0.0000000005095214 0.000002768207 +10992 1.0992 0.0000000002845824 0.000001730574 +10993 1.0993 0.0000000001472622 0.000001015831 +10994 1.0994 0.0000000000690166 0.000000549080 +10995 1.0995 0.0000000000283044 0.000000265164 +10996 1.0996 0.0000000000096082 0.000000108760 +10997 1.0997 0.0000000000024472 0.000000034461 +10998 1.0998 0.0000000000003834 0.000000006815 +10999 1.0999 0.0000000000000213 0.000000000426 +11000 1.1000 0.0000000000000000 0.000000000000 +#Correcting potential for cireaxFF HH + +HH_cireaxFF +N 6000 R 0.0001 0.60 + +1 0.0001 3797890.9392291540279984 33206349399.138427734375 +2 0.0002 1722494.9110903698019683 8301571163.637251853943 +3 0.0003 1122937.5926132882013917 3689575205.904382228851 +4 0.0004 834690.0008127633482218 2075376630.106112480164 +5 0.0005 664509.5044536795467138 1328233297.075562715530 +6 0.0006 551978.9563009395496920 922377665.979238033295 +7 0.0007 471977.0966619757236913 677659526.800038814545 +8 0.0008 412152.7179571118904278 518828047.297237277031 +9 0.0009 365714.6299731913604774 409933712.381173670292 +10 0.0010 328615.8323907385347411 332042239.267882823944 +11 0.0011 298293.1523345073219389 274411361.856740832329 +12 0.0012 273043.6664075446315110 230578356.682512432337 +13 0.0013 251691.4498322109866422 196465974.824161022902 +14 0.0014 233398.2087391692330129 169398847.036673963070 +15 0.0015 217550.1427719162311405 147562472.308386147022 +16 0.0016 203687.4690429928014055 129691002.270082563162 +17 0.0017 191458.9405489375349134 114879567.611022695899 +18 0.0018 180591.5899878731579520 102467443.610265031457 +19 0.0019 170870.0645197642443236 91963065.751913383603 +20 0.0020 162122.1812141085101757 82994600.361201152205 +21 0.0021 154208.6221667436766438 75276580.586095467210 +22 0.0022 147015.4478375526086893 68586905.997725889087 +23 0.0023 140448.5683578797033988 62750683.595732025802 +24 0.0024 134429.6001954161911272 57628679.653538167477 +25 0.0025 128892.7193197872402379 53108937.859040811658 +26 0.0026 123782.2419719153112965 49100609.098397634923 +27 0.0027 119050.7440046396513935 45529350.247115477920 +28 0.0028 114657.5838912299659569 42333852.021078258753 +29 0.0029 110567.7317897445173003 39463190.008630804718 +30 0.0030 106750.8331308781198459 36874783.168697230518 +31 0.0031 103180.4536898424703395 34532805.652015879750 +32 0.0032 99833.4663847921474371 32406940.448990609497 +33 0.0033 96689.5496975369314896 30471393.296113744378 +34 0.0034 93730.7747060154651990 28704106.534315660596 +35 0.0035 90941.2629848008509725 27086127.889976661652 +36 0.0036 88306.9015780777990585 25601100.244484253228 +37 0.0037 85815.1042360084247775 24234846.596903316677 +38 0.0038 83454.6103836347028846 22975030.450571224093 +39 0.0039 81215.3150433022092329 21810876.356078684330 +40 0.0040 79088.1242888014239725 20732938.733937062323 +41 0.0041 77064.8318683794641402 19732909.674502246082 +42 0.0042 75138.0134655730071245 18803458.381626948714 +43 0.0043 73300.9357243389240466 17938096.443054690957 +44 0.0044 71547.4776878622797085 17131064.286478303373 +45 0.0045 69872.0627186485507991 16377235.097796306014 +46 0.0046 68269.5993038358574267 15672033.198457607999 +47 0.0047 66735.4294215345871635 15011364.447567705065 +48 0.0048 65265.2833648572850507 14391556.685978462920 +49 0.0049 63855.2401005604333477 13809308.599958522245 +50 0.0050 62501.6923870088357944 13261645.671073490754 +51 0.0051 61201.3159978628827957 12745882.111845636740 +52 0.0052 59951.0424985035206191 12259587.875341583043 +53 0.0053 58748.0351057271182071 11800559.980186514556 +54 0.0054 57589.6672308318229625 11366797.517719358206 +55 0.0055 56473.5033644123541308 10956479.810670090839 +56 0.0056 55397.2820100169192301 10567947.277238540351 +57 0.0057 54358.9004149418324232 10199684.624263165519 +58 0.0058 53356.4008811763487756 9850306.051046444103 +59 0.0059 52387.9584689461044036 9518542.193558432162 +60 0.0060 51451.8699303213943494 9203228.578935710713 +61 0.0061 50546.5437316817624378 8903295.393856944516 +62 0.0062 49670.4910420562737272 8617758.398652873933 +63 0.0063 48822.3175799818709493 8345710.842835226096 +64 0.0064 48000.7162249470493407 8086316.257861227728 +65 0.0065 47204.4603110534590087 7838802.020010582171 +66 0.0066 46432.3975305156127433 7602453.590746403672 +67 0.0067 45683.4443832643009955 7376609.354279844090 +68 0.0068 44956.5811164201149950 7160655.982603823766 +69 0.0069 44250.8471039254218340 6954024.267290038057 +70 0.0070 43565.3366223063421785 6756185.365091556683 +71 0.0071 42899.1949834988408838 6566647.411058522761 +72 0.0072 42251.6149900149321184 6384952.458619666286 +73 0.0073 41621.8336815316069988 6210673.711046861485 +74 0.0074 41009.1293453283797135 6043413.013017731719 +75 0.0075 40412.8187659414834343 5882798.574720124714 +76 0.0076 39832.2546919962987886 5728482.904183511622 +77 0.0077 39266.8235004698290140 5580140.926345888525 +78 0.0078 38715.9430406611209037 5437468.269828204997 +79 0.0079 38179.0606419426039793 5300179.704542100430 +80 0.0080 37655.6512709583330434 5168007.715143349953 +81 0.0081 37145.2158253512752708 5040701.196997836232 +82 0.0082 36647.2795523623062763 4918024.262781535275 +83 0.0083 36161.3905817674312857 4799755.149116020650 +84 0.0084 35687.1185636231457465 4685685.213769730181 +85 0.0085 35224.0534021870626020 4575618.014951894991 +86 0.0086 34771.8040781840900308 4469368.465107540600 +87 0.0087 34329.9975523085740861 4366762.052402776666 +88 0.0088 33898.2777434993331553 4267634.123782012612 +89 0.0089 33476.3045761055254843 4171829.224094125908 +90 0.0090 33063.7530905842431821 4079200.486331530847 +91 0.0091 32660.3126128419717134 3989609.068513828795 +92 0.0092 32265.6859777571735322 3902923.633182167541 +93 0.0093 31879.5888028051194851 3819019.865858890116 +94 0.0094 31501.7488080534712935 3737780.029174046591 +95 0.0095 31131.9051791112069623 3659092.549671253655 +96 0.0096 30769.8079698984438437 3582851.634583971929 +97 0.0097 30415.2175423630833393 3508956.916123266798 +98 0.0098 30067.9040405047780951 3437313.121042810380 +99 0.0099 29727.6468962801882299 3367829.763448988087 +100 0.0100 29394.2343651574519754 3300420.859005731065 +101 0.0101 29067.4630892647546716 3235004.658848212566 +102 0.0102 28747.1376862389952294 3171503.401666941587 +103 0.0103 28433.0703620277417940 3109843.082558151335 +104 0.0104 28125.0805460319934355 3049953.237356806640 +105 0.0105 27822.9945471002283739 2991766.741278477944 +106 0.0106 27526.6452289965454838 2935219.620795187540 +107 0.0107 27235.8717040687661211 2880250.877760431264 +108 0.0108 26950.5190439367252111 2826802.324880378786 +109 0.0109 26670.4380061075971753 2774818.431702210568 +110 0.0110 26395.4847755045666418 2724246.180358372163 +111 0.0111 26125.5207199683136423 2675034.930366700049 +112 0.0112 25860.4121588578527735 2627136.291842553765 +113 0.0113 25600.0301439392242173 2580504.006530004088 +114 0.0114 25344.2502518074288673 2535093.836105915252 +115 0.0115 25092.9523871394812886 2490863.457253013272 +116 0.0116 24846.0205961249594111 2447772.363037394360 +117 0.0117 24603.3428894650387520 2405781.770161029417 +118 0.0118 24364.8110743723518681 2364854.531692738645 +119 0.0119 24130.3205950421615853 2324955.054911054671 +120 0.0120 23899.7703811006467731 2286049.223919261713 +121 0.0121 23673.0627035687430180 2248104.326718825381 +122 0.0122 23450.1030379103140149 2211088.986449721735 +123 0.0123 23230.7999337614310207 2174973.096527959686 +124 0.0124 23015.0648909635419841 2139727.759429817088 +125 0.0125 22802.8122415475299931 2105325.228890395258 +126 0.0126 22593.9590373379905941 2071738.855300423456 +127 0.0127 22388.4249428679249831 2038943.034100894816 +128 0.0128 22186.1321333134474116 2006913.156988691539 +129 0.0129 21987.0051971760294691 1975625.565759636927 +130 0.0130 21790.9710434566804906 1945057.508627335075 +131 0.0131 21597.9588130819574872 1915187.098867130466 +132 0.0132 21407.8997943563590525 1885993.275644818088 +133 0.0133 21220.7273422291546012 1857455.766899243696 +134 0.0134 21036.3768011763677350 1829555.054156522499 +135 0.0135 20854.7854315104414127 1802272.339162001619 +136 0.0136 20675.8923389411793323 1775589.512223207159 +137 0.0137 20499.6384072217915673 1749489.122164525557 +138 0.0138 20325.9662337235531595 1723954.347800214309 +139 0.0139 20154.8200677915956476 1698968.970838940004 +140 0.0140 19986.1457517427406856 1674517.350138149690 +141 0.0141 19819.8906643742302549 1650584.397232070565 +142 0.0142 19656.0036668595384981 1627155.553061789367 +143 0.0143 19494.4350509144278476 1604216.765840423526 +144 0.0144 19335.1364891228840861 1581754.469990479527 +145 0.0145 19178.0609873186294863 1559755.566094624344 +146 0.0146 19023.1628389236866497 1538207.401804244379 +147 0.0147 18870.3975811507662002 1517097.753654155647 +148 0.0148 18719.7219529813373811 1496414.809734444367 +149 0.0149 18571.0938548359335982 1476147.153173595900 +150 0.0150 18424.4723098577560449 1456283.746389925713 +151 0.0151 18279.8174267347349087 1436813.916070528561 +152 0.0152 18137.0903639892167121 1417727.338839818956 +153 0.0153 17996.2532956681498035 1399014.027581501054 +154 0.0154 17857.2693783700597123 1380664.318380307872 +155 0.0155 17720.1027195484675758 1362668.858051502844 +156 0.0156 17584.7183470344825764 1345018.592228198191 +157 0.0157 17451.0821797241660533 1327704.753978095716 +158 0.0158 17319.1609993791171291 1310718.852922896855 +159 0.0159 17188.9224234912071552 1294052.664835321717 +160 0.0160 17060.3348791649550549 1277698.221689730417 +161 0.0161 16933.3675779732693627 1261647.802143992623 +162 0.0162 16807.9904917444982857 1245893.922431436367 +163 0.0163 16684.1743292407954868 1230429.327642629389 +164 0.0164 16561.8905136897519697 1215246.983378208475 +165 0.0165 16441.1111611331070890 1200340.067754710326 +166 0.0166 16321.8090595580470108 1185701.963746519992 +167 0.0167 16203.9576487783288030 1171326.251847842243 +168 0.0168 16087.5310010339635483 1157206.703039470362 +169 0.0169 15972.5038022796870791 1143337.272046067519 +170 0.0170 15858.8513341338712053 1129712.090870235115 +171 0.0171 15746.5494564608343353 1116325.462590484647 +172 0.0172 15635.5745905607673194 1103171.855410865974 +173 0.0173 15525.9037029426854133 1090245.896950758062 +174 0.0174 15417.5142896569686854 1077542.368763569044 +175 0.0175 15310.3843611650809180 1065056.201074176002 +176 0.0176 15204.4924277251211606 1052782.467725025257 +177 0.0177 15099.8174852727934194 1040716.381321541499 +178 0.0178 14996.3390017783203803 1028853.288567928714 +179 0.0179 14894.0369040606838098 1017188.665784800309 +180 0.0180 14792.8915650414055563 1005718.114600747707 +181 0.0181 14692.8837914208706934 994437.357809931855 +182 0.0182 14593.9948117609401379 983342.235388665460 +183 0.0183 14496.2062649583112943 972428.700663912809 +184 0.0184 14399.5001890937583084 961692.816627136664 +185 0.0185 14303.8590106430383457 951130.752387271146 +186 0.0186 14209.2655340358342073 940738.779756810400 +187 0.0187 14115.7029315497256903 930513.269965347252 +188 0.0188 14023.1547335267005110 920450.690495161572 +189 0.0189 13931.6048189002576692 910547.602033683565 +190 0.0190 13841.0374060216763610 900800.655537953018 +191 0.0191 13751.4370437744601077 891206.589406373678 +192 0.0192 13662.7886029664769012 881762.226753307506 +193 0.0193 13575.0772679896981572 872464.472782266093 +194 0.0194 13488.2885287379031070 863310.312253641896 +195 0.0195 13402.4081727730663260 854296.807043093839 +196 0.0196 13317.4222777315644635 845421.093786924961 +197 0.0197 13233.3172039616729307 836680.381610908546 +198 0.0198 13150.0795873841670982 828071.949939193903 +199 0.0199 13067.6963325682008872 819593.146380113903 +200 0.0200 12986.1546060149066761 811241.384685778175 +201 0.0201 12905.4418296414896759 803014.142782570096 +202 0.0202 12825.5456744588755100 794908.960869705305 +203 0.0203 12746.4540544362298533 786923.439583210624 +204 0.0204 12668.1551205459327321 779055.238222738379 +205 0.0205 12590.6372549828574847 771302.073038782924 +206 0.0206 12513.8890655520208384 763661.715577960364 +207 0.0207 12437.8993802189179405 756131.991084102541 +208 0.0208 12362.6572418170599121 748710.776953040273 +209 0.0209 12288.1519029074570426 741396.001239002682 +210 0.0210 12214.3728207849726459 734185.641210696078 +211 0.0211 12141.3096526266799629 727077.721955164568 +212 0.0212 12068.9522507775400300 720070.315027646720 +213 0.0213 11997.2906581688730512 713161.537145687966 +214 0.0214 11926.3151038652940770 706349.548925882671 +215 0.0215 11856.0159987359184015 699632.553661636543 +216 0.0216 11786.3839312458130735 693008.796140454360 +217 0.0217 11717.4096633638255298 686476.561499288655 +218 0.0218 11649.0841265830331395 680034.174116562121 +219 0.0219 11581.3984180502284289 673679.996539516840 +220 0.0220 11514.3437968009711767 667412.428445621277 +221 0.0221 11447.9116800968495227 661229.905636797659 +222 0.0222 11382.0936398617450322 655130.899065289646 +223 0.0223 11316.8813992139785114 649113.913890042342 +224 0.0224 11252.2668290913516103 643177.488562501385 +225 0.0225 11188.2419449661865656 637320.193940789090 +226 0.0226 11124.7989036475846660 631540.632431264035 +227 0.0227 11061.9300001681967842 625837.437156488304 +228 0.0228 10999.6276647529375623 620209.271148678847 +229 0.0229 10937.8844598671148560 614654.826567770680 +230 0.0230 10876.6930773415660951 609172.823943215539 +231 0.0231 10816.0463355724696157 603762.011438712478 +232 0.0232 10755.9371767935808748 598421.164139074157 +233 0.0233 10696.3586644187034835 593149.083358470700 +234 0.0234 10637.3039804523141356 587944.595969322603 +235 0.0235 10578.7664229662914295 582806.553751141066 +236 0.0236 10520.7394036408022657 577733.832758645411 +237 0.0237 10463.2164453674449760 572725.332708496600 +238 0.0238 10406.1911799128174607 567779.976384037058 +239 0.0239 10349.6573456407440972 562896.709057426779 +240 0.0240 10293.6087852914424730 558074.497928592842 +241 0.0241 10238.0394438159910351 553312.331580449129 +242 0.0242 10182.9433662644769356 548609.219449837692 +243 0.0243 10128.3146957263015793 543964.191313675372 +244 0.0244 10074.1476713211268361 539376.296789824031 +245 0.0245 10020.4366262390267366 534844.604852175224 +246 0.0246 9967.1759858284422080 530368.203359515872 +247 0.0247 9914.3602657305800676 525946.198597722105 +248 0.0248 9861.9840700589520566 521577.714834837010 +249 0.0249 9810.0420896227788035 517261.893888643535 +250 0.0250 9758.5291001930308994 512997.894706310530 +251 0.0251 9707.4399608099283796 508784.892955745687 +252 0.0252 9656.7696121307271824 504622.080628273543 +253 0.0253 9606.5130748166993726 500508.665652283933 +254 0.0254 9556.6654479582084605 496443.871517517080 +255 0.0255 9507.2219075368520862 492426.936909621581 +256 0.0256 9458.1777049236352468 488457.115354706591 +257 0.0257 9409.5281654122227337 484533.674873543438 +258 0.0258 9361.2686867862885265 480655.897645138903 +259 0.0259 9313.3947379200635623 476823.079679376213 +260 0.0260 9265.9018574111723865 473034.530498457083 +261 0.0261 9218.7856522449055774 469289.572826871474 +262 0.0262 9172.0417964890802978 465587.542289632780 +263 0.0263 9125.6660300186722452 461927.787118529668 +264 0.0264 9079.6541572694386559 458309.667866153468 +265 0.0265 9034.0020460197574721 454732.557127462584 +266 0.0266 8988.7056261999514390 451195.839268662035 +267 0.0267 8943.7608887283586228 447698.910163181077 +268 0.0268 8899.1638843734726834 444241.176934524265 +269 0.0269 8854.9107226414562319 440822.057705812913 +270 0.0270 8810.9975706883760722 437440.981355801225 +271 0.0271 8767.4206522565273190 434097.387281184027 +272 0.0272 8724.1762466342170228 430790.725165011594 +273 0.0273 8681.2606876384143106 427520.454751028272 +274 0.0274 8638.6703626196740515 424286.045623773185 +275 0.0275 8596.4017114887719799 421086.976994260505 +276 0.0276 8554.4512257645055797 417922.737491083797 +277 0.0277 8512.8154476421113941 414792.824956804106 +278 0.0278 8471.4909690818003583 411696.746249434771 +279 0.0279 8430.4744309168836480 408634.017048916605 +280 0.0280 8389.7625219810179260 405604.161668412504 +281 0.0281 8349.3519782540824963 402606.712870297022 +282 0.0282 8309.2395820262318011 399641.211686701921 +283 0.0283 8269.4221610796721507 396707.207244501391 +284 0.0284 8229.8965878877170326 393804.256594596838 +285 0.0285 8190.6597788307171868 390931.924545384187 +286 0.0286 8151.7086934284334347 388089.783500298625 +287 0.0287 8113.0403335884529952 385277.413299310661 +288 0.0288 8074.6517428702745747 382494.401064265287 +289 0.0289 8036.5400057646629648 379740.341047962662 +290 0.0290 7998.7022469879211712 377014.834486879641 +291 0.0291 7961.1356307907062728 374317.489457421761 +292 0.0292 7923.8373602810543161 371647.920735618740 +293 0.0293 7886.8046767612650001 369005.749660162895 +294 0.0294 7850.0348590783214604 366390.603998709412 +295 0.0295 7813.5252229875186458 363802.117817338614 +296 0.0296 7777.2731205289965146 361239.931353097141 +297 0.0297 7741.2759394168642757 358703.690889546939 +298 0.0298 7705.5311024406255456 356193.048635229468 +299 0.0299 7670.0360668786161114 353707.662604961544 +300 0.0300 7634.7883239231723564 351247.196503909014 +301 0.0301 7599.7853981172593194 348811.319614349399 +302 0.0302 7565.0248468022900852 346399.706685042300 +303 0.0303 7530.5042595768791216 344012.037823172985 +304 0.0304 7496.2212577662821786 341647.998388757696 +305 0.0305 7462.1734939022699109 339307.278891487280 +306 0.0306 7428.3586512131996642 336989.574889911804 +307 0.0307 7394.7744431240571430 334694.586892931722 +308 0.0308 7361.4186127662351282 332422.020263517683 +309 0.0309 7328.2889324968291476 330171.585124605917 +310 0.0310 7295.3832034272427336 327942.996267125709 +311 0.0311 7262.6992549608821719 325735.973060077988 +312 0.0312 7230.2349443397461073 323550.239362646767 +313 0.0313 7197.9881561997008248 321385.523438253556 +314 0.0314 7165.9568021342611246 319241.557870541175 +315 0.0315 7134.1388202666739744 317118.079481209570 +316 0.0316 7102.5321748301294065 315014.829249676259 +317 0.0317 7071.1348557559203982 312931.552234507049 +318 0.0318 7039.9448782693661997 310867.997496569238 +319 0.0319 7008.9602824933444936 308823.918023872888 +320 0.0320 6978.1791330592486702 306799.070658051991 +321 0.0321 6947.5995187252237884 304793.216022445762 +322 0.0322 6917.2195520015147849 302806.118451742514 +323 0.0323 6887.0373687827704998 300837.545923143101 +324 0.0324 6857.0511279871625447 298887.269989015476 +325 0.0325 6827.2590112021625828 296955.065710989409 +326 0.0326 6797.6592223368397754 295040.711595467408 +327 0.0327 6768.2499872805401537 293143.989530517720 +328 0.0328 6739.0295535678087617 291264.684724107734 +329 0.0329 6709.9961900494208749 289402.585643650207 +330 0.0330 6681.1481865693967848 287557.483956830285 +331 0.0331 6652.4838536478710012 285729.174473683524 +332 0.0332 6624.0015221696921799 283917.455089892494 +333 0.0333 6595.6995430786337238 282122.126731268479 +334 0.0334 6567.5762870770995505 280342.993299406895 +335 0.0335 6539.6301443312058836 278579.861618462426 +336 0.0336 6511.8595241811308370 276832.541383042291 +337 0.0337 6484.2628548566199242 275100.845107175875 +338 0.0338 6456.8385831975447218 273384.588074336876 +339 0.0339 6429.5851743794028152 271683.588288502593 +340 0.0340 6402.5011116436671728 269997.666426213400 +341 0.0341 6375.5848960328758039 268326.645789619943 +342 0.0342 6348.8350461303707561 266670.352260480518 +343 0.0343 6322.2500978045909505 265028.614255112305 +344 0.0344 6295.8286039578233613 263401.262680239393 +345 0.0345 6269.5691342793234071 261788.130889750697 +346 0.0346 6243.4702750027199727 260189.054642318690 +347 0.0347 6217.5306286676095624 258603.872059885209 +348 0.0348 6191.7488138852668271 257032.423586966324 +349 0.0349 6166.1234651083796052 255474.551950786379 +350 0.0350 6140.6532324047302609 253930.102122199372 +351 0.0351 6115.3367812347505605 252398.921277389309 +352 0.0352 6090.1727922328645946 250880.858760333562 +353 0.0353 6065.1599609925469849 249375.766046012985 +354 0.0354 6040.2969978550299857 247883.496704335703 +355 0.0355 6015.5826277015739834 246403.906364788214 +356 0.0356 5991.0155897492459189 244936.852681767195 +357 0.0357 5966.5946373501274138 243482.195300596883 +358 0.0358 5942.3185377938871170 242039.795824207686 +359 0.0359 5918.1860721136536085 240609.517780463502 +360 0.0360 5894.1960348951242850 239191.226590125298 +361 0.0361 5870.3472340888465624 237784.789535432705 +362 0.0362 5846.6384908256104609 236390.075729293516 +363 0.0363 5823.0686392348925438 235006.956085067795 +364 0.0364 5799.6365262662930036 233635.303286930110 +365 0.0365 5776.3410115139067784 232274.991760797304 +366 0.0366 5753.1809670435759472 230925.897645818506 +367 0.0367 5730.1552772229651964 229587.898766401282 +368 0.0368 5707.2628385544066987 228260.874604775396 +369 0.0369 5684.5025595104643799 226944.706274066091 +370 0.0370 5661.8733603721666441 225639.276491892000 +371 0.0371 5639.3741730698502579 224344.469554441806 +372 0.0372 5617.0039410265753759 223060.171311054786 +373 0.0373 5594.7616190040589572 221786.269139269600 +374 0.0374 5572.6461729510783698 220522.651920336095 +375 0.0375 5550.6565798543024357 219269.210015191376 +376 0.0376 5528.7918275914989863 218025.835240880318 +377 0.0377 5507.0509147870843663 216792.420847409609 +378 0.0378 5485.4328506699621357 215568.861495032528 +379 0.0379 5463.9366549336127719 214355.053231954807 +380 0.0380 5442.5613575983925330 213150.893472446391 +381 0.0381 5421.3059988760023771 211956.280975355621 +382 0.0382 5400.1696290360832791 210771.115823022119 +383 0.0383 5379.1513082749042951 209595.299400565797 +384 0.0384 5358.2501065860978997 208428.734375559114 +385 0.0385 5337.4651036334162200 207271.324678068690 +386 0.0386 5316.7953886254599638 206122.975481052708 +387 0.0387 5296.2400601923518479 204983.593181118398 +388 0.0388 5275.7982262643145077 203853.085379624623 +389 0.0389 5255.4690039521274230 202731.360864120419 +390 0.0390 5235.2515194294155663 201618.329590123205 +391 0.0391 5215.1449078167488551 200513.902663215820 +392 0.0392 5195.1483130675151187 199417.992321466503 +393 0.0393 5175.2608878555338379 198330.511918162607 +394 0.0394 5155.4817934643833723 197251.375904848013 +395 0.0395 5135.8101996784080256 196180.499814658891 +396 0.0396 5116.2452846753767517 195117.800245962891 +397 0.0397 5096.7862349207644002 194063.194846275903 +398 0.0398 5077.4322450636273061 193016.602296464203 +399 0.0399 5058.1825178340423008 191977.942295230401 +400 0.0400 5039.0362639420882260 190947.135543857410 +401 0.0401 5019.9927019783335709 189924.103731232521 +402 0.0402 5001.0510583158156805 188908.769519123598 +403 0.0403 4982.2105670134742468 187901.056527708512 +404 0.0404 4963.4704697210208906 186900.889321363793 +405 0.0405 4944.8300155852184616 185908.193394692207 +406 0.0406 4926.2884611575445888 184922.895158791798 +407 0.0407 4907.8450703032167439 183944.921927760006 +408 0.0408 4889.4991141115569917 182974.201905434893 +409 0.0409 4871.2498708076673211 182010.664172355406 +410 0.0410 4853.0966256654019162 181054.238672945299 +411 0.0411 4835.0386709216081726 180104.856202922296 +412 0.0412 4817.0753056916164496 179162.448396911874 +413 0.0413 4799.2058358859567306 178226.947716274706 +414 0.0414 4781.4295741282858216 177298.287437139690 +415 0.0415 4763.7458396744968923 176376.401638641197 +416 0.0416 4746.1539583329977177 175461.225191345118 +417 0.0417 4728.6532623861367028 174552.693745879398 +418 0.0418 4711.2430905127548613 173650.743721751584 +419 0.0419 4693.9227877118501056 172755.312296346587 +420 0.0420 4676.6917052273265654 171866.337394116475 +421 0.0421 4659.5492004738234755 170983.757675945119 +422 0.0422 4642.4946369635918018 170107.512528690218 +423 0.0423 4625.5273842344122386 169237.542054897116 +424 0.0424 4608.6468177785327498 168373.787062684598 +425 0.0425 4591.8523189726092824 167516.189055792696 +426 0.0426 4575.1432750086296437 166664.690223798825 +427 0.0427 4558.5190788258150860 165819.233432492794 +428 0.0428 4541.9791290434704933 164979.762214406888 +429 0.0429 4525.5228298947749863 164146.220759498625 +430 0.0430 4509.1495911615002115 163318.553905994806 +431 0.0431 4492.8588281096317587 162496.707131370786 +432 0.0432 4476.6499614258891597 161680.626543487393 +433 0.0433 4460.5224171551217296 160870.258871862694 +434 0.0434 4444.4756266385738854 160065.551459085895 +435 0.0435 4428.5090264530008426 159266.452252375020 +436 0.0436 4412.6220583506192270 158472.909795265179 +437 0.0437 4396.8141691998844180 157684.873219428002 +438 0.0438 4381.0848109270818895 156902.292236623383 +439 0.0439 4365.4334404587116296 156125.117130786792 +440 0.0440 4349.8595196646610930 155353.298750224814 +441 0.0441 4334.3625153021521328 154586.788499957591 +442 0.0442 4318.9418989604464514 153825.538334160607 +443 0.0443 4303.5971470063013840 153069.500748739694 +444 0.0444 4288.3277405301632825 152318.628774015204 +445 0.0445 4273.1331652930857672 151572.875967531581 +446 0.0446 4258.0129116743610211 150832.196406962204 +447 0.0447 4242.9664746198559442 150096.544683145214 +448 0.0448 4227.9933535910377032 149365.875893212418 +449 0.0449 4213.0930525146850414 148640.145633832086 +450 0.0450 4198.2650797332653383 147919.309994559822 +451 0.0451 4183.5089479559728716 147203.325551281509 +452 0.0452 4168.8241742104200966 146492.149359771516 +453 0.0453 4154.2102797949646629 145785.738949338702 +454 0.0454 4139.6667902316685286 145084.052316579124 +455 0.0455 4125.1932352198791705 144387.047919215198 +456 0.0456 4110.7891485904165165 143694.684670041082 +457 0.0457 4096.4540682603665118 143006.921930951008 +458 0.0458 4082.1875361884663107 142323.719507061702 +459 0.0459 4067.9890983310669981 141645.037640927214 +460 0.0460 4053.8583045986788420 140970.837006836111 +461 0.0461 4039.7947088130767952 140301.078705203283 +462 0.0462 4025.7978686649648807 139635.724257037102 +463 0.0463 4011.8673456721880939 138974.735598497209 +464 0.0464 3998.0027051384868173 138318.075075530593 +465 0.0465 3984.2035161127805623 137665.705438592006 +466 0.0466 3970.4693513489792167 137017.589837436215 +467 0.0467 3956.7997872663072485 136373.691816001607 +468 0.0468 3943.1944039101394992 135733.975307351706 +469 0.0469 3929.6527849133362906 135098.404628710909 +470 0.0470 3916.1745174580728417 134466.944476561417 +471 0.0471 3902.7591922381539007 133839.559921816399 +472 0.0472 3889.4064034218095003 133216.216405068204 +473 0.0473 3876.1157486149609213 132596.879731900379 +474 0.0474 3862.8868288249523175 131981.516068276193 +475 0.0475 3849.7192484247393622 131370.091935986100 +476 0.0476 3836.6126151175312771 130762.574208174192 +477 0.0477 3823.5665399018766948 130158.930104914805 +478 0.0478 3810.5806370371874436 129559.127188870698 +479 0.0479 3797.6545240096938869 128963.133361000000 +480 0.0480 3784.7878214988272703 128370.916856334414 +481 0.0481 3771.9801533440195271 127782.446239815996 +482 0.0482 3759.2311465119191780 127197.690402194989 +483 0.0483 3746.5404310640101357 126616.618555985508 +484 0.0484 3733.9076401246366004 126039.200231481605 +485 0.0485 3721.3324098494208556 125465.405272828997 +486 0.0486 3708.8143793940716932 124895.203834155793 +487 0.0487 3696.3531908835761897 124328.566375758615 +488 0.0488 3683.9484893817716511 123765.463660336201 +489 0.0489 3671.5999228612904517 123205.866749289082 +490 0.0490 3659.3071421738727622 122649.746999061885 +491 0.0491 3647.0698010210426219 122097.076057543905 +492 0.0492 3634.8875559251396226 121547.825860515688 +493 0.0493 3622.7600662007062056 121001.968628151400 +494 0.0494 3610.6869939262201115 120459.476861566305 +495 0.0495 3598.6680039161710738 119920.323339417504 +496 0.0496 3586.7027636934731163 119384.481114546099 +497 0.0497 3574.7909434622119988 118851.923510671899 +498 0.0498 3562.9322160807214459 118322.624119135202 +499 0.0499 3551.1262570349808811 117796.556795678407 +500 0.0500 3539.3727444123328496 117273.695657280594 +501 0.0501 3527.6713588755173987 116754.015079026300 +502 0.0502 3516.0217836370147779 116237.489691030307 +503 0.0503 3504.4237044336937288 115724.094375392902 +504 0.0504 3492.8768095017640007 115213.804263205908 +505 0.0505 3481.3807895520239981 114706.594731596502 +506 0.0506 3469.9353377454035581 114202.441400813201 +507 0.0507 3458.5401496687954932 113701.320131348999 +508 0.0508 3447.1949233111722606 113203.207021111593 +509 0.0509 3435.8993590399854838 112708.078402620697 +510 0.0510 3424.6531595778415067 112215.910840257697 +511 0.0511 3413.4560299794516141 111726.681127540491 +512 0.0512 3402.3076776088523729 111240.366284443095 +513 0.0513 3391.2078121168929101 110756.943554748403 +514 0.0514 3380.1561454189832148 110276.390403441299 +515 0.0515 3369.1523916731048303 109798.684514128501 +516 0.0516 3358.1962672580730214 109323.803786503893 +517 0.0517 3347.2874907520558736 108851.726333840896 +518 0.0518 3336.4257829113375919 108382.430480521405 +519 0.0519 3325.6108666493319106 107915.894759596791 +520 0.0520 3314.8424670158328809 107452.097910383702 +521 0.0521 3304.1203111765094036 106991.018876088390 +522 0.0522 3293.4441283926316828 106532.636801470508 +523 0.0523 3282.8136500010318741 106076.931030525200 +524 0.0524 3272.2286093942948355 105623.881104211905 +525 0.0525 3261.6887420011739778 105173.466758200710 +526 0.0526 3251.1937852672313056 104725.667920653999 +527 0.0527 3240.7434786356966470 104280.464710036700 +528 0.0528 3230.3375635285469798 103837.837432959204 +529 0.0529 3219.9757833277972168 103397.766582040102 +530 0.0530 3209.6578833570047209 102960.232833805901 +531 0.0531 3199.3836108629839146 102525.217046613194 +532 0.0532 3189.1527149977232511 102092.700258601195 +533 0.0533 3178.9649468005095514 101662.663685669395 +534 0.0534 3168.8200591802519739 101235.088719480002 +535 0.0535 3158.7178068980033459 100809.956925493389 +536 0.0536 3148.6579465496779449 100387.250041016800 +537 0.0537 3138.6402365489625481 99966.949973295399 +538 0.0538 3128.6644371104171114 99549.038797609304 +539 0.0539 3118.7303102327659872 99133.498755413690 +540 0.0540 3108.8376196823710416 98720.312252485601 +541 0.0541 3098.9861309768912179 98309.461857110102 +542 0.0542 3089.1756113691217251 97900.930298279200 +543 0.0543 3079.4058298310119426 97494.700463916903 +544 0.0544 3069.6765570378593111 97090.755399133006 +545 0.0545 3059.9875653526783026 96689.078304486597 +546 0.0546 3050.3386288107399196 96289.652534285400 +547 0.0547 3040.7295231042808155 95892.461594900291 +548 0.0548 3031.1600255673811262 95497.489143095998 +549 0.0549 3021.6299151610064655 95104.718984397608 +550 0.0550 3012.1389724582136296 94714.135071462399 +551 0.0551 3002.6869796295163724 94325.721502481407 +552 0.0552 2993.2737204284121617 93939.462519600100 +553 0.0553 2983.8989801770644590 93555.342507355497 +554 0.0554 2974.5625457521396129 93173.345991137699 +555 0.0555 2965.2642055707992768 92793.457635665793 +556 0.0556 2956.0037495768415283 92415.662243489103 +557 0.0557 2946.7809692269920561 92039.944753500298 +558 0.0558 2937.5956574773435932 91666.290239472699 +559 0.0559 2928.4476087699395066 91294.683908613209 +560 0.0560 2919.3366190195019954 90925.111100133901 +561 0.0561 2910.2624856003030800 90557.557283840506 +562 0.0562 2901.2250073331738349 90192.008058743304 +563 0.0563 2892.2239844726527735 89828.449151673893 +564 0.0564 2883.2592186942724766 89466.866415933808 +565 0.0565 2874.3305130819780970 89107.245829949898 +566 0.0566 2865.4376721156831991 88749.573495947800 +567 0.0567 2856.5805016589533807 88393.835638644508 +568 0.0568 2847.7588089468235921 88040.018603955294 +569 0.0569 2838.9724025737400552 87688.108857716492 +570 0.0570 2830.2210924816331499 87338.092984424511 +571 0.0571 2821.5046899481126275 86989.957685989706 +572 0.0572 2812.8230075747878800 86643.689780506102 +573 0.0573 2804.1758592757109909 86299.276201035798 +574 0.0574 2795.5630602659389297 85956.703994407901 +575 0.0575 2786.9844270502167092 85615.960320032595 +576 0.0576 2778.4397774117787776 85277.032448729500 +577 0.0577 2769.9289304012636421 84939.907761570110 +578 0.0578 2761.4517063257485461 84604.573748733892 +579 0.0579 2753.0079267378928307 84271.018008379106 +580 0.0580 2744.5974144251977123 83939.228245526392 +581 0.0581 2736.2199933993733794 83609.192270955900 +582 0.0582 2727.8754888858197774 83280.898000118497 +583 0.0583 2719.5637273132110749 82954.333452058592 +584 0.0584 2711.2845363031906345 82629.486748351410 +585 0.0585 2703.0377446601705742 82306.346112052299 +586 0.0586 2694.8231823612350126 81984.899866657594 +587 0.0587 2686.6406805461483600 81665.136435079796 +588 0.0588 2678.4900715074627442 81347.044338633204 +589 0.0589 2670.3711886807295741 81030.612196033209 +590 0.0590 2662.2838666348075094 80715.828722405698 +591 0.0591 2654.2279410622718387 80402.682728309199 +592 0.0592 2646.2032487699179910 80091.163118768993 +593 0.0593 2638.2096276693632717 79781.258892321493 +594 0.0594 2630.2469167677436417 79472.959140070947 +595 0.0595 2622.3149561585023548 79166.253044755809 +596 0.0596 2614.4135870122731831 78861.129879828150 +597 0.0597 2606.5426515678545911 78557.579008541652 +598 0.0598 2598.7019931232748604 78255.589883052293 +599 0.0599 2590.8914560269458889 77955.152043527560 +600 0.0600 2583.1108856689061213 77656.255117267618 +601 0.0601 2575.3601284721507909 77358.888817836021 +602 0.0602 2567.6390318840490181 77063.042944200439 +603 0.0603 2559.9474443678445823 76768.707379883854 +604 0.0604 2552.2852153942440054 76475.872092124846 +605 0.0605 2544.6521954330851258 76184.527131048526 +606 0.0606 2537.0482359450902550 75894.662628845719 +607 0.0607 2529.4731893736998245 75606.268798963472 +608 0.0608 2521.9269091369865237 75319.335935302617 +609 0.0609 2514.4092496196499269 75033.854411426786 +610 0.0610 2506.9200661650897928 74749.814679778734 +611 0.0611 2499.4592150675553057 74467.207270906831 +612 0.0612 2492.0265535643748080 74186.022792699412 +613 0.0613 2484.6219398282582915 73906.251929628474 +614 0.0614 2477.2452329596767413 73627.885442002560 +615 0.0615 2469.8962929793151488 73350.914165226437 +616 0.0616 2462.5749808206001035 73075.329009070818 +617 0.0617 2455.2811583222992340 72801.120956949555 +618 0.0618 2448.0146882211915909 72528.281065205156 +619 0.0619 2440.7754341448112427 72256.800462402665 +620 0.0620 2433.5632606042595398 71986.670348630636 +621 0.0621 2426.3780329870874084 71717.881994811658 +622 0.0622 2419.2196175502458573 71450.426742018375 +623 0.0623 2412.0878814131051513 71184.296000799222 +624 0.0624 2404.9826925505394684 70919.481250510740 +625 0.0625 2397.9039197860811328 70655.974038657121 +626 0.0626 2390.8514327851362395 70393.765980237920 +627 0.0627 2383.8251020482694003 70132.848757102445 +628 0.0628 2376.8247989045485156 69873.214117311829 +629 0.0629 2369.8503955049577598 69614.853874507331 +630 0.0630 2362.9017648158678639 69357.759907286818 +631 0.0631 2355.9787806125741554 69101.924158587179 +632 0.0632 2349.0813174728909871 68847.338635074135 +633 0.0633 2342.2092507708102858 68593.995406538481 +634 0.0634 2335.3624566702183074 68341.886605299340 +635 0.0635 2328.5408121186728749 68091.004425613588 +636 0.0636 2321.7441948412374586 67841.341123091712 +637 0.0637 2314.9724833343766477 67592.889014121087 +638 0.0638 2308.2255568599057369 67345.640475293985 +639 0.0639 2301.5032954389989754 67099.587942843282 +640 0.0640 2294.8055798462528401 66854.723912083238 +641 0.0641 2288.1322916038056974 66611.040936857127 +642 0.0642 2281.4833129755133996 66368.531628991012 +643 0.0643 2274.8585269611762669 66127.188657751933 +644 0.0644 2268.2578172908229135 65887.004749314467 +645 0.0645 2261.6810684190454594 65647.972686230991 +646 0.0646 2255.1281655193884035 65410.085306908266 +647 0.0647 2248.5989944787884269 65173.335505090348 +648 0.0648 2242.0934418920664939 64937.716229346421 +649 0.0649 2235.6113950564708830 64703.220482563738 +650 0.0650 2229.1527419662702414 64469.841321447631 +651 0.0651 2222.7173713073966610 64237.571856024762 +652 0.0652 2216.3051724521378674 64006.405249153417 +653 0.0653 2209.9160354538780666 63776.334716038182 +654 0.0654 2203.5498510418888145 63547.353523750251 +655 0.0655 2197.2065106161635413 63319.454990752158 +656 0.0656 2190.8859062423043724 63092.632486428774 +657 0.0657 2184.5879306464516958 62866.879430621761 +658 0.0658 2178.3124772102619318 62642.189293170457 +659 0.0659 2172.0594399659307783 62418.555593456593 +660 0.0660 2165.8287135912601116 62195.971899954537 +661 0.0661 2159.6201934047730902 61974.431829785521 +662 0.0662 2153.4337753608697312 61753.929048277496 +663 0.0663 2147.2693560450293262 61534.457268528786 +664 0.0664 2141.1268326690542381 61316.010250976942 +665 0.0665 2135.0061030663568999 61098.581802971908 +666 0.0666 2128.9070656872904692 60882.165778353694 +667 0.0667 2122.8296195945208638 60666.756077033991 +668 0.0668 2116.7736644584401802 60452.346644583442 +669 0.0669 2110.7391005526201297 60238.931471821677 +670 0.0670 2104.7258287493082207 60026.504594412996 +671 0.0671 2098.7337505149644130 59815.060092464846 +672 0.0672 2092.7627679058346075 59604.592090132202 +673 0.0673 2086.8127835635668816 59395.094755224258 +674 0.0674 2080.8837007108650141 59186.562298816811 +675 0.0675 2074.9754231471806634 58978.988974867236 +676 0.0676 2069.0878552444455636 58772.369079834811 +677 0.0677 2063.2209019428387364 58566.696952303704 +678 0.0678 2057.3744687465928109 58361.966972610564 +679 0.0679 2051.5484617198385422 58158.173562476164 +680 0.0680 2045.7427874824827541 57955.311184640268 +681 0.0681 2039.9573532061258447 57753.374342500028 +682 0.0682 2034.1920666100131712 57552.357579753101 +683 0.0683 2028.4468359570232678 57352.255480043961 +684 0.0684 2022.7215700496903992 57153.062666612801 +685 0.0685 2017.0161782262623547 56954.773801950047 +686 0.0686 2011.3305703567921228 56757.383587452656 +687 0.0687 2005.6646568392652625 56560.886763084374 +688 0.0688 2000.0183485957591074 56365.278107040052 +689 0.0689 1994.3915570686365299 56170.552435412843 +690 0.0690 1988.7841942167726756 55976.704601864716 +691 0.0691 1983.1961725118144386 55783.729497300243 +692 0.0692 1977.6274049344722243 55591.622049544487 +693 0.0693 1972.0778049708437720 55400.377223022959 +694 0.0694 1966.5472866087702641 55209.990018445678 +695 0.0695 1961.0357643342233587 55020.455472494272 +696 0.0696 1955.5431531277231443 54831.768657511348 +697 0.0697 1950.0693684607879277 54643.924681194570 +698 0.0698 1944.6143262924135797 54456.918686292505 +699 0.0699 1939.1779430655838041 54270.745850304040 +700 0.0700 1933.7601357038095102 54085.401385180412 +701 0.0701 1928.3608216076988811 53900.880537031080 +702 0.0702 1922.9799186515558631 53717.178585831418 +703 0.0703 1917.6173451800075327 53534.290845133888 +704 0.0704 1912.2730200046617028 53352.212661782563 +705 0.0705 1906.9468624007911330 53170.939415629371 +706 0.0706 1901.6387921040470701 52990.466519253998 +707 0.0707 1896.3487293072000739 52810.789417686334 +708 0.0708 1891.0765946569092648 52631.903588131521 +709 0.0709 1885.8223092505177192 52453.804539697856 +710 0.0710 1880.5857946328765138 52276.487813127562 +711 0.0711 1875.3669727931935540 52099.948980529465 +712 0.0712 1870.1657661619112787 51924.183645115401 +713 0.0713 1864.9820976076086936 51749.187440938367 +714 0.0714 1859.8158904339300079 51574.956032633410 +715 0.0715 1854.6670683765403282 51401.485115161551 +716 0.0716 1849.5355556001045443 51228.770413555016 +717 0.0717 1844.4212766952934999 51056.807682666637 +718 0.0718 1839.3241566758142653 50885.592706920143 +719 0.0719 1834.2441209754649663 50715.121300064064 +720 0.0720 1829.1810954452153055 50545.389304927026 +721 0.0721 1824.1350063503100500 50376.392593175893 +722 0.0722 1819.1057803673973012 50208.127065076827 +723 0.0723 1814.0933445816806397 50040.588649257377 +724 0.0724 1809.0976264840942349 49873.773302471986 +725 0.0725 1804.1185539685020558 49707.677009369334 +726 0.0726 1799.1560553289205018 49542.295782261608 +727 0.0727 1794.2100592567626336 49377.625660896978 +728 0.0728 1789.2804948381060512 49213.662712232632 +729 0.0729 1784.3672915509837367 49050.403030211943 +730 0.0730 1779.4703792626960421 48887.842735542195 +731 0.0731 1774.5896882271451886 48725.977975474911 +732 0.0732 1769.7251490821920470 48564.804923589225 +733 0.0733 1764.8766928470338371 48404.319779575591 +734 0.0734 1760.0442509196038827 48244.518769022579 +735 0.0735 1755.2277550739925118 48085.398143206214 +736 0.0736 1750.4271374578881932 47926.954178880129 +737 0.0737 1745.6423305900407286 47769.183178068204 +738 0.0738 1740.8732673577442256 47612.081467859622 +739 0.0739 1736.1198810143409901 47455.645400205220 +740 0.0740 1731.3821051767449717 47299.871351715869 +741 0.0741 1726.6598738229859009 47144.755723463430 +742 0.0742 1721.9531212897736623 46990.294940782347 +743 0.0743 1717.2617822700808574 46836.485453074383 +744 0.0744 1712.5857918107465139 46683.323733614598 +745 0.0745 1707.9250853100977565 46530.806279358563 +746 0.0746 1703.2795985155921699 46378.929610752923 +747 0.0747 1698.6492675214772134 46227.690271546060 +748 0.0748 1694.0340287664698735 46077.084828601626 +749 0.0749 1689.4338190314540498 45927.109871713503 +750 0.0750 1684.8485754371972689 45777.762013422289 +751 0.0751 1680.2782354420844513 45629.037888833554 +752 0.0752 1675.7227368398707767 45480.934155438321 +753 0.0753 1671.1820177574520585 45333.447492934487 +754 0.0754 1666.6560166526528519 45186.574603050016 +755 0.0755 1662.1446723120318438 45040.312209368392 +756 0.0756 1657.6479238487056591 44894.657057155040 +757 0.0757 1653.1657107001885834 44749.605913185420 +758 0.0758 1648.6979726262504755 44605.155565575027 +759 0.0759 1644.2446497067912787 44461.302823610720 +760 0.0760 1639.8056823397314474 44318.044517583716 +761 0.0761 1635.3810112389210190 44175.377498623959 +762 0.0762 1630.9705774320630098 44033.298638536377 +763 0.0763 1626.5743222586543197 43891.804829637775 +764 0.0764 1622.1921873679425516 43750.892984596503 +765 0.0765 1617.8241147168989755 43610.560036272771 +766 0.0766 1613.4700465682074082 43470.802937560125 +767 0.0767 1609.1299254882678724 43331.618661229200 +768 0.0768 1604.8036943452177638 43193.004199772455 +769 0.0769 1600.4912963069666603 43054.956565250483 +770 0.0770 1596.1926748392472746 42917.472789139072 +771 0.0771 1591.9077737036814142 42780.549922178965 +772 0.0772 1587.6365369558611746 42644.185034225426 +773 0.0773 1583.3789089434449124 42508.375214100757 +774 0.0774 1579.1348343042675424 42373.117569446411 +775 0.0775 1574.9042579644662965 42238.409226578267 +776 0.0776 1570.6871251366203524 42104.247330341561 +777 0.0777 1566.4833813179047866 41970.629043968278 +778 0.0778 1562.2929722882595343 41837.551548935488 +779 0.0779 1558.1158441085715367 41705.012044824565 +780 0.0780 1553.9519431188712133 41573.007749182216 +781 0.0781 1549.8012159365430307 41441.535897382259 +782 0.0782 1545.6636094545494871 41310.593742489436 +783 0.0783 1541.5390708396687387 41180.178555123290 +784 0.0784 1537.4275475307463239 41050.287623324301 +785 0.0785 1533.3289872369591649 40920.918252420532 +786 0.0786 1529.2433379360934396 40792.067764895983 +787 0.0787 1525.1705478728356411 40663.733500259514 +788 0.0788 1521.1105655570768249 40535.912814915515 +789 0.0789 1517.0633397622293614 40408.603082035595 +790 0.0790 1513.0288195235559670 40281.801691430919 +791 0.0791 1509.0069541365130590 40155.506049426433 +792 0.0792 1504.9976931551050257 40029.713578735296 +793 0.0793 1501.0009863902514553 39904.421718335638 +794 0.0794 1497.0167839081673264 39779.627923347085 +795 0.0795 1493.0450360287545664 39655.329664909295 +796 0.0796 1489.0856933240061153 39531.524430061167 +797 0.0797 1485.1387066164220414 39408.209721621424 +798 0.0798 1481.2040269774374792 39285.383058069361 +799 0.0799 1477.2816057258626188 39163.041973428277 +800 0.0800 1473.3713944263338362 39041.184017147985 +801 0.0801 1469.4733448877768751 38919.806753989869 +802 0.0802 1465.5874091618818511 38798.907763912255 +803 0.0803 1461.7135395415884886 38678.484641956995 +804 0.0804 1457.8516885595838630 38558.534998136674 +805 0.0805 1454.0018089868108291 38439.056457323284 +806 0.0806 1450.1638538309878186 38320.046659137559 +807 0.0807 1446.3377763351388694 38201.503257839518 +808 0.0808 1442.5235299761359329 38083.423922219568 +809 0.0809 1438.7210684632505036 37965.806335491085 +810 0.0810 1434.9303457367168448 37848.648195183116 +811 0.0811 1431.1513159663059014 37731.947213035150 +812 0.0812 1427.3839335499096705 37615.701114891730 +813 0.0813 1423.6281531121351236 37499.907640598278 +814 0.0814 1419.8839295029101777 37384.564543898545 +815 0.0815 1416.1512177960987628 37269.669592331549 +816 0.0816 1412.4299732881256659 37155.220567130928 +817 0.0817 1408.7201514966129707 37041.215263123660 +818 0.0818 1405.0217081590251382 36927.651488631149 +819 0.0819 1401.3345992313250008 36814.527065369715 +820 0.0820 1397.6587808866388514 36701.839828352931 +821 0.0821 1393.9942095139315370 36589.587625794942 +822 0.0822 1390.3408417166911022 36477.768319013070 +823 0.0823 1386.6986343116238913 36366.379782333344 +824 0.0824 1383.0675443273573819 36255.419902995040 +825 0.0825 1379.4475290031548411 36144.886581057654 +826 0.0826 1375.8385457876365763 36034.777729306683 +827 0.0827 1372.2405523375130088 35925.091273162587 +828 0.0828 1368.6535065163254785 35815.825150588091 +829 0.0829 1365.0773663931961437 35706.977311998373 +830 0.0830 1361.5120902415876571 35598.545720170441 +831 0.0831 1357.9576365380714833 35490.528350154316 +832 0.0832 1354.4139639611046277 35382.923189184177 +833 0.0833 1350.8810313898159166 35275.728236591058 +834 0.0834 1347.3587979028006885 35168.941503715490 +835 0.0835 1343.8472227769238998 35062.561013821498 +836 0.0836 1340.3462654861323244 34956.584802010744 +837 0.0837 1336.8558857002749392 34851.010915138038 +838 0.0838 1333.3760432839317218 34745.837411726970 +839 0.0839 1329.9066982952510898 34641.062361886696 +840 0.0840 1326.4478109847952965 34536.683847228931 +841 0.0841 1322.9993417943944678 34432.699960786143 +842 0.0842 1319.5612513560085972 34329.108806930075 +843 0.0843 1316.1335004905974984 34225.908501291298 +844 0.0844 1312.7160502069989434 34123.097170678702 +845 0.0845 1309.3088617008149868 34020.672953000714 +846 0.0846 1305.9118963533055648 33918.633997186240 +847 0.0847 1302.5251157302909633 33816.978463106629 +848 0.0848 1299.1484815810606506 33715.704521498541 +849 0.0849 1295.7819558372914344 33614.810353886845 +850 0.0850 1292.4255006119717564 33514.294152508832 +851 0.0851 1289.0790781983344004 33414.154120238338 +852 0.0852 1285.7426510687969312 33314.388470511280 +853 0.0853 1282.4161818739087266 33214.995427250760 +854 0.0854 1279.0996334413064233 33115.973224794216 +855 0.0855 1275.7929687746757281 33017.320107819804 +856 0.0856 1272.4961510527209612 32919.034331273884 +857 0.0857 1269.2091436281423285 32821.114160299614 +858 0.0858 1265.9319100266191072 32723.557870165278 +859 0.0859 1262.6644139458012432 32626.363746193572 +860 0.0860 1259.4066192543068610 32529.530083691858 +861 0.0861 1256.1584899907281851 32433.055187881990 +862 0.0862 1252.9199903626424657 32336.937373832072 +863 0.0863 1249.6910847456315423 32241.174966387312 +864 0.0864 1246.4717376823070936 32145.766300102587 +865 0.0865 1243.2619138813431618 32050.709719174854 +866 0.0866 1240.0615782165154997 31956.003577376796 +867 0.0867 1236.8706957257472823 31861.646237989822 +868 0.0868 1233.6892316101607321 31767.636073739031 +869 0.0869 1230.5171512331373833 31673.971466727722 +870 0.0870 1227.3544201193824392 31580.650808372993 +871 0.0871 1224.2010039539966328 31487.672499340988 +872 0.0872 1221.0568685815553636 31395.034949484114 +873 0.0873 1217.9219800051923812 31302.736577777163 +874 0.0874 1214.7963043856907461 31210.775812255102 +875 0.0875 1211.6798080405803830 31119.151089950923 +876 0.0876 1208.5724574432410918 31027.860856834050 +877 0.0877 1205.4742192220119250 30936.903567749090 +878 0.0878 1202.3850601593067040 30846.277686355254 +879 0.0879 1199.3049471907356747 30755.981685066010 +880 0.0880 1196.2338474042328471 30666.014044989926 +881 0.0881 1193.1717280391897020 30576.373255870989 +882 0.0882 1190.1185564855945813 30487.057816029977 +883 0.0883 1187.0743002831777630 30398.066232306228 +884 0.0884 1184.0389271205624482 30309.397020000062 +885 0.0885 1181.0124048344216590 30221.048702814853 +886 0.0886 1177.9947014086408217 30133.019812800820 +887 0.0887 1174.9857849734858064 30045.308890297973 +888 0.0888 1171.9856238047768784 29957.914483880704 +889 0.0889 1168.9941863230676518 29870.835150301544 +890 0.0890 1166.0114410928306370 29784.069454436562 +891 0.0891 1163.0373568216473359 29697.615969230777 +892 0.0892 1160.0719023594035662 29611.473275643002 +893 0.0893 1157.1150466974918345 29525.639962593341 +894 0.0894 1154.1667589680166657 29440.114626908522 +895 0.0895 1151.2270084430076622 29354.895873269663 +896 0.0896 1148.2957645336362020 29269.982314159563 +897 0.0897 1145.3729967894378206 29185.372569810090 +898 0.0898 1142.4586748975398223 29101.065268150945 +899 0.0899 1139.5527686818943494 29017.059044758342 +900 0.0900 1136.6552481025162251 28933.352542803252 +901 0.0901 1133.7660832547260270 28849.944413001685 +902 0.0902 1130.8852443683977071 28766.833313564402 +903 0.0903 1128.0127018072121245 28684.017910146409 +904 0.0904 1125.1484260679148974 28601.496875798577 +905 0.0905 1122.2923877795790304 28519.268890917727 +906 0.0906 1119.4445577028732259 28437.332643198599 +907 0.0907 1116.6049067293340613 28355.686827585210 +908 0.0908 1113.7734058806436224 28274.330146223088 +909 0.0909 1110.9500263079119122 28193.261308411944 +910 0.0910 1108.1347392909633527 28112.479030558119 +911 0.0911 1105.3275162376289700 28031.982036127971 +912 0.0912 1102.5283286830424458 27951.769055601639 +913 0.0913 1099.7371482889409435 27871.838826426523 +914 0.0914 1096.9539468429709359 27792.190092971927 +915 0.0915 1094.1786962579981264 27712.821606483580 +916 0.0916 1091.4113685714219173 27633.732125038419 +917 0.0917 1088.6519359444951078 27554.920413500025 +918 0.0918 1085.9003706616463205 27476.385243474469 +919 0.0919 1083.1566451298092488 27398.125393265993 +920 0.0920 1080.4207318777541786 27320.139647833294 +921 0.0921 1077.6926035554251939 27242.426798746637 +922 0.0922 1074.9722329332805657 27164.985644144137 +923 0.0923 1072.2595929016388254 27087.814988689883 +924 0.0924 1069.5546564700277941 27010.913643530832 +925 0.0925 1066.8573967665383861 26934.280426255107 +926 0.0926 1064.1677870371831887 26857.914160850261 +927 0.0927 1061.4858006452575410 26781.813677661856 +928 0.0928 1058.8114110707067539 26705.977813352401 +929 0.0929 1056.1445919094960573 26630.405410860127 +930 0.0930 1053.4853168729850950 26555.095319359301 +931 0.0931 1050.8335597873060578 26480.046394219338 +932 0.0932 1048.1892945927468190 26405.257496965223 +933 0.0933 1045.5524953431365702 26330.727495237850 +934 0.0934 1042.9231362052369150 26256.455262754913 +935 0.0935 1040.3011914581356905 26182.439679271432 +936 0.0936 1037.6866354926451095 26108.679630541781 +937 0.0937 1035.0794428107039948 26035.174008280592 +938 0.0938 1032.4795880247836521 25961.921710125160 +939 0.0939 1029.8870458572976077 25888.921639596989 +940 0.0940 1027.3017911400145294 25816.172706065088 +941 0.0941 1024.7237988134759235 25743.673824707828 +942 0.0942 1022.1530439264167853 25671.423916476509 +943 0.0943 1019.5895016351900040 25599.421908058150 +944 0.0944 1017.0331472031950852 25527.666731839839 +945 0.0945 1014.4839560003094903 25456.157325871609 +946 0.0946 1011.9419035023244078 25384.892633830925 +947 0.0947 1009.4069652903834822 25313.871604987398 +948 0.0948 1006.8791170504257479 25243.093194166562 +949 0.0949 1004.3583345726316338 25172.556361715753 +950 0.0950 1001.8445937508724910 25102.260073468078 +951 0.0951 999.3378705821636458 25032.203300709061 +952 0.0952 996.8381411661210905 24962.385020141151 +953 0.0953 994.3453817044214702 24892.804213850512 +954 0.0954 991.8595685002653681 24823.459869272378 +955 0.0955 989.3806779578438864 24754.350979158069 +956 0.0956 986.9086865818088654 24685.476541541400 +957 0.0957 984.4435709767465141 24616.835559705502 +958 0.0958 981.9853078466537681 24548.427042149950 +959 0.0959 979.5338739944183999 24480.250002558201 +960 0.0960 977.0892463213021983 24412.303459765259 +961 0.0961 974.6514018264276729 24344.586437725171 +962 0.0962 972.2203176062674856 24277.097965479559 +963 0.0963 969.7959708541371810 24209.837077125590 +964 0.0964 967.3783388596916666 24142.802811784772 +965 0.0965 964.9673990084238540 24075.994213571383 +966 0.0966 962.5631287811671655 24009.410331561558 +967 0.0967 960.1655057536008826 23943.050219763012 +968 0.0968 957.7745075957585641 23876.912937083478 +969 0.0969 955.3901120715393063 23810.997547301402 +970 0.0970 953.0122970382225276 23745.303119035030 +971 0.0971 950.6410404459851407 23679.828725713010 +972 0.0972 948.2763203374222485 23614.573445544240 +973 0.0973 945.9181148470705693 23549.536361488790 +974 0.0974 943.5664022009347036 23484.716561228590 +975 0.0975 941.2211607160163567 23420.113137138040 +976 0.0976 938.8823687998466312 23355.725186255568 +977 0.0977 936.5500049500211617 23291.551810254721 +978 0.0978 934.2240477537376364 23227.592115415791 +979 0.0979 931.9044758873369574 23163.845212597520 +980 0.0980 929.5912681158465602 23100.310217209357 +981 0.0981 927.2844032925269175 23036.986249183068 +982 0.0982 924.9838603584204293 22973.872432945882 +983 0.0983 922.6896183419034969 22910.967897392249 +984 0.0984 920.4016563582409844 22848.271775856931 +985 0.0985 918.1199536091437494 22785.783206088381 +986 0.0986 915.8444893823283337 22723.501330220883 +987 0.0987 913.5752430510798376 22661.425294749028 +988 0.0988 911.3121940738174089 22599.554250500252 +989 0.0989 909.0553219936618916 22537.887352609188 +990 0.0990 906.8046064380068856 22476.423760491518 +991 0.0991 904.5600271180913978 22415.162637817339 +992 0.0992 902.3215638285762452 22354.103152486590 +993 0.0993 900.0891964471218216 22293.244476602420 +994 0.0994 897.8629049339693893 22232.585786446420 +995 0.0995 895.6426693315244165 22172.126262453312 +996 0.0996 893.4284697639424166 22111.865089185809 +997 0.0997 891.2202864367176289 22051.801455309702 +998 0.0998 889.0180996362736323 21991.934553569590 +999 0.0999 886.8218897295569150 21932.263580763931 +1000 0.1000 884.6316371636327176 21872.787737720901 +1001 0.1001 882.4473224652829231 21813.506229274259 +1002 0.1002 880.2689262406072430 21754.418264239390 +1003 0.1003 878.0964291746257686 21695.523055389240 +1004 0.1004 875.9298120308847047 21636.819819431032 +1005 0.1005 873.7690556510640363 21578.307776982518 +1006 0.1006 871.6141409545874694 21519.986152548550 +1007 0.1007 869.4650489382350997 21461.854174498279 +1008 0.1008 867.3217606757581279 21403.911075041960 +1009 0.1009 865.1842573174956215 21346.156090207980 +1010 0.1010 863.0525200899942320 21288.588459820199 +1011 0.1011 860.9265302956293908 21231.207427475758 +1012 0.1012 858.8062693122294604 21174.012240522319 +1013 0.1013 856.6917185927015908 21117.002150035922 +1014 0.1014 854.5828596646598498 21060.176410798980 +1015 0.1015 852.4796741300559688 21003.534281278440 +1016 0.1016 850.3821436648119061 20947.075023603909 +1017 0.1017 848.2902500184544579 20890.797903546110 +1018 0.1018 846.2039750137523697 20834.702190495231 +1019 0.1019 844.1233005463556083 20778.787157439801 +1020 0.1020 842.0482085844363382 20723.052080945701 +1021 0.1021 839.9786811683322867 20667.496241134580 +1022 0.1022 837.9147004101923812 20612.118921663372 +1023 0.1023 835.8562484936239798 20556.919409703631 +1024 0.1024 833.8033076733427151 20501.896995920710 +1025 0.1025 831.7558602748240446 20447.050974453261 +1026 0.1026 829.7138886939567328 20392.380642893149 +1027 0.1027 827.6773753966988352 20337.885302265189 +1028 0.1028 825.6463029187352731 20283.564257006881 +1029 0.1029 823.6206538651374558 20229.416814949051 +1030 0.1030 821.6004109100252890 20175.442287295278 +1031 0.1031 819.5855567962303212 20121.639988603030 +1032 0.1032 817.5760743349619588 20068.009236763599 +1033 0.1033 815.5719464054745913 20014.549352983347 +1034 0.1034 813.5731559547372171 19961.259661763572 +1035 0.1035 811.5796859971048889 19908.139490882262 +1036 0.1036 809.5915196139920909 19855.188171374732 +1037 0.1037 807.6086399535475948 19802.405037514571 +1038 0.1038 805.6310302303320441 19749.789426795447 +1039 0.1039 803.6586737249966745 19697.340679911969 +1040 0.1040 801.6915537839639683 19645.058140741588 +1041 0.1041 799.7296538191105810 19592.941156326149 +1042 0.1042 797.7729573074516338 19540.989076853362 +1043 0.1043 795.8214477908270510 19489.201255639160 +1044 0.1044 793.8751088755896035 19437.577049109583 +1045 0.1045 791.9339242322949985 19386.115816782720 +1046 0.1046 789.9978775953933336 19334.816921251142 +1047 0.1047 788.0669527629225968 19283.679728164141 +1048 0.1048 786.1411335962038720 19232.703606210409 +1049 0.1049 784.2204040195383641 19181.887927100513 +1050 0.1050 782.3047480199059009 19131.232065549571 +1051 0.1051 780.3941496466653689 19080.735399260400 +1052 0.1052 778.4885930112570804 19030.397308906020 +1053 0.1053 776.5880622869061654 18980.217178112987 +1054 0.1054 774.6925417083282355 18930.194393444719 +1055 0.1055 772.8020155714367547 18880.328344384270 +1056 0.1056 770.9164682330516598 18830.618423318399 +1057 0.1057 769.0358841106096861 18781.064025520533 +1058 0.1058 767.1602476818769674 18731.664549134770 +1059 0.1059 765.2895434846623175 18682.419395159268 +1060 0.1060 763.4237561165327861 18633.327967430290 +1061 0.1061 761.5628702345309193 18584.389672606238 +1062 0.1062 759.7068705548930438 18535.603920151530 +1063 0.1063 757.8557418527694836 18486.970122320759 +1064 0.1064 756.0094689619462542 18438.487694143030 +1065 0.1065 754.1680367745688045 18390.156053406219 +1066 0.1066 752.3314302408664389 18341.974620641733 +1067 0.1067 750.4996343688789011 18293.942819108452 +1068 0.1068 748.6726342241845487 18246.060074778157 +1069 0.1069 746.8504149296296646 18198.325816319830 +1070 0.1070 745.0329616650594744 18150.739475084571 +1071 0.1071 743.2202596670507546 18103.300485090622 +1072 0.1072 741.4122942286458056 18056.008283008581 +1073 0.1073 739.6090506990880158 18008.862308146352 +1074 0.1074 737.8105144835590181 17961.862002434209 +1075 0.1075 736.0166710429167551 17915.006810410800 +1076 0.1076 734.2275058934358185 17868.296179208082 +1077 0.1077 732.4430046065485840 17821.729558536779 +1078 0.1078 730.6631528085881655 17775.306400672529 +1079 0.1079 728.8879361805325061 17729.026160441052 +1080 0.1080 727.1173404577501742 17682.888295204619 +1081 0.1081 725.3513514297476377 17636.892264847040 +1082 0.1082 723.5899549399172201 17591.037531760790 +1083 0.1083 721.8331368852875585 17545.323560832250 +1084 0.1084 720.0808832162745148 17499.749819427991 +1085 0.1085 718.3331799364340213 17454.315777381740 +1086 0.1086 716.5900131022159485 17409.020906979771 +1087 0.1087 714.8513688227195644 17363.864682948231 +1088 0.1088 713.1172332594502450 17318.846582438848 +1089 0.1089 711.3875926260774349 17273.966085016269 +1090 0.1090 709.6624331881944272 17229.222672644632 +1091 0.1091 707.9417412630784838 17184.615829673829 +1092 0.1092 706.2255032194534579 17140.145042827018 +1093 0.1093 704.5137054772527563 17095.809801187421 +1094 0.1094 702.8063345073841219 17051.609596185142 +1095 0.1095 701.1033768314956660 17007.543921584518 +1096 0.1096 699.4048190217429237 16963.612273471372 +1097 0.1097 697.7106477005573879 16919.814150240039 +1098 0.1098 696.0208495404162932 16876.149052581022 +1099 0.1099 694.3354112636138780 16832.616483468351 +1100 0.1100 692.6543196420331014 16789.215948147161 +1101 0.1101 690.9775614969196340 16745.946954121078 +1102 0.1102 689.3051236986565300 16702.809011140278 +1103 0.1103 687.6369931665400372 16659.801631188951 +1104 0.1104 685.9731568685568845 16616.924328473477 +1105 0.1105 684.3136018211627061 16574.176619409798 +1106 0.1106 682.6583150890616025 16531.558022612291 +1107 0.1107 681.0072837849869529 16489.068058880708 +1108 0.1108 679.3604950694834770 16446.706251189553 +1109 0.1109 677.7179361506902069 16404.472124675391 +1110 0.1110 676.0795942841251644 16362.365206625538 +1111 0.1111 674.4454567724706067 16320.385026466281 +1112 0.1112 672.8155109653597492 16278.531115751543 +1113 0.1113 671.1897442591646268 16236.803008151261 +1114 0.1114 669.5681440967850904 16195.200239440179 +1115 0.1115 667.9506979674388276 16153.722347485969 +1116 0.1116 666.3373934064526338 16112.368872238669 +1117 0.1117 664.7282179950547061 16071.139355718980 +1118 0.1118 663.1231593601684153 16030.033342007500 +1119 0.1119 661.5222051742064195 15989.050377233141 +1120 0.1120 659.9253431548665958 15948.190009563041 +1121 0.1121 658.3325610649288819 15907.451789190749 +1122 0.1122 656.7438467120530277 15866.835268325740 +1123 0.1123 655.1591879485775962 15826.340001182882 +1124 0.1124 653.5785726713198756 15785.965543971179 +1125 0.1125 652.0019888213771537 15745.711454883680 +1126 0.1126 650.4294243839286764 15705.577294086601 +1127 0.1127 648.8608673880388551 15665.562623708738 +1128 0.1128 647.2963059064618392 15625.667007831260 +1129 0.1129 645.7357280554464296 15585.890012477168 +1130 0.1130 644.1791219945424700 15546.231205601021 +1131 0.1131 642.6264759264084887 15506.690157078752 +1132 0.1132 641.0777780966196815 15467.266438697179 +1133 0.1133 639.5330167934776000 15427.959624144471 +1134 0.1134 637.9921803478204083 15388.769288999280 +1135 0.1135 636.4552571328343902 15349.695010721458 +1136 0.1136 634.9222355638662521 15310.736368641808 +1137 0.1137 633.3931040982365630 15271.892943952047 +1138 0.1138 631.8678512350542178 15233.164319695390 +1139 0.1139 630.3464655150315821 15194.550080756231 +1140 0.1140 628.8289355203012292 15156.049813851268 +1141 0.1141 627.3152498742326770 15117.663107518831 +1142 0.1142 625.8053972412512849 15079.389552110108 +1143 0.1143 624.2993663266568092 15041.228739779461 +1144 0.1144 622.7971458764441195 15003.180264474438 +1145 0.1145 621.2987246771240279 14965.243721927291 +1146 0.1146 619.8040915555454831 14927.418709644631 +1147 0.1147 618.3132353787183320 14889.704826898971 +1148 0.1148 616.8261450536374468 14852.101674719011 +1149 0.1149 615.3428095271074199 14814.608855880500 +1150 0.1150 613.8632177855685086 14777.225974897308 +1151 0.1151 612.3873588549230362 14739.952638012212 +1152 0.1152 610.9152218003630423 14702.788453187921 +1153 0.1153 609.4467957261987294 14665.733030098090 +1154 0.1154 607.9820697756879326 14628.785980118391 +1155 0.1155 606.5210331308661580 14591.946916317771 +1156 0.1156 605.0636750123777574 14555.215453449700 +1157 0.1157 603.6099846793081269 14518.591207943191 +1158 0.1158 602.1599514290162460 14482.073797894180 +1159 0.1159 600.7135645969686948 14445.662843057191 +1160 0.1160 599.2708135565740122 14409.357964836261 +1161 0.1161 597.8316877190183050 14373.158786276752 +1162 0.1162 596.3961765331016522 14337.064932056690 +1163 0.1163 594.9642694850748512 14301.076028478768 +1164 0.1164 593.5359560984778682 14265.191703461000 +1165 0.1165 592.1112259339782895 14229.411586529539 +1166 0.1166 590.6900685892113643 14193.735308809719 +1167 0.1167 589.2724736986200469 14158.162503017678 +1168 0.1168 587.8584309332965177 14122.692803452923 +1169 0.1169 586.4479300008243854 14087.325845989420 +1170 0.1170 585.0409606451215723 14052.061268067780 +1171 0.1171 583.6375126462837670 14016.898708687639 +1172 0.1172 582.2375758204294698 13981.837808398937 +1173 0.1173 580.8411400195448095 13946.878209294522 +1174 0.1174 579.4481951313299533 13912.019555001980 +1175 0.1175 578.0587310790460833 13877.261490675992 +1176 0.1176 576.6727378213627162 13842.603662990379 +1177 0.1177 575.2902053522067263 13808.045720130322 +1178 0.1178 573.9111237006109150 13773.587311784930 +1179 0.1179 572.5354829305647399 13739.228089139200 +1180 0.1180 571.1632731408644759 13704.967704866662 +1181 0.1181 569.7944844649650804 13670.805813121811 +1182 0.1182 568.4291070708324014 13636.742069532291 +1183 0.1183 567.0671311607961798 13602.776131191829 +1184 0.1184 565.7085469714039618 13568.907656652502 +1185 0.1185 564.3533447732754667 13535.136305917527 +1186 0.1186 563.0015148709578625 13501.461740433679 +1187 0.1187 561.6530476027819532 13467.883623084221 +1188 0.1188 560.3079333407187050 13434.401618181671 +1189 0.1189 558.9661624902365702 13401.015391460091 +1190 0.1190 557.6277254901601736 13367.724610068741 +1191 0.1191 556.2926128125285459 13334.528942564182 +1192 0.1192 554.9608149624551743 13301.428058903490 +1193 0.1193 553.6323224779881684 13268.421630437400 +1194 0.1194 552.3071259299711073 13235.509329902899 +1195 0.1195 550.9852159219051373 13202.690831416570 +1196 0.1196 549.6665830898109562 13169.965810467400 +1197 0.1197 548.3512181020920480 13137.333943910191 +1198 0.1198 547.0391116593985998 13104.794909958520 +1199 0.1199 545.7302544944917599 13072.348388177892 +1200 0.1200 544.4246373721089185 13039.994059479141 +1201 0.1201 543.1222510888293300 13007.731606111589 +1202 0.1202 541.8230864729409859 12975.560711656291 +1203 0.1203 540.5271343843071463 12943.481061019567 +1204 0.1204 539.2343857142348043 12911.492340426181 +1205 0.1205 537.9448313853428090 12879.594237413203 +1206 0.1206 536.6584623514310124 12847.786440822740 +1207 0.1207 535.3752695973500977 12816.068640795991 +1208 0.1208 534.0952441388719762 12784.440528766641 +1209 0.1209 532.8183770225608669 12752.901797454631 +1210 0.1210 531.5446593256451706 12721.452140859381 +1211 0.1211 530.2740821558895732 12690.091254253599 +1212 0.1212 529.0066366514680567 12658.818834177258 +1213 0.1213 527.7423139808377073 12627.634578430800 +1214 0.1214 526.4811053426127501 12596.538186069371 +1215 0.1215 525.2230019654394937 12565.529357396270 +1216 0.1216 523.9679951078718432 12534.607793957082 +1217 0.1217 522.7160760582472676 12503.773198533299 +1218 0.1218 521.4672361345637910 12473.025275136451 +1219 0.1219 520.2214666843568693 12442.363729001760 +1220 0.1220 518.9787590845776322 12411.788266582262 +1221 0.1221 517.7391047414713512 12381.298595542929 +1222 0.1222 516.5024950904564776 12350.894424754661 +1223 0.1223 515.2689215960043612 12320.575464287998 +1224 0.1224 514.0383757515195384 12290.341425408018 +1225 0.1225 512.8108490792208158 12260.192020567421 +1226 0.1226 511.5863331300223535 12230.126963401817 +1227 0.1227 510.3648194834161131 12200.145968723031 +1228 0.1228 509.1462997473542487 12170.248752513851 +1229 0.1229 507.9307655581324639 12140.435031922239 +1230 0.1230 506.7182085802735969 12110.704525255589 +1231 0.1231 505.5086205064120577 12081.056951974722 +1232 0.1232 504.3019930571788905 12051.492032688981 +1233 0.1233 503.0983179810869501 12022.009489150130 +1234 0.1234 501.8975870544171016 11992.609044246761 +1235 0.1235 500.6997920811048175 11963.290421999109 +1236 0.1236 499.5049248926272298 11934.053347553168 +1237 0.1237 498.3129773478908078 11904.897547175462 +1238 0.1238 497.1239413331196602 11875.822748247661 +1239 0.1239 495.9378087617442361 11846.828679260940 +1240 0.1240 494.7545715742906509 11817.915069810599 +1241 0.1241 493.5742217382705803 11789.081650591110 +1242 0.1242 492.3967512480714959 11760.328153390357 +1243 0.1243 491.2221521248477529 11731.654311084480 +1244 0.1244 490.0504164164119061 11703.059857632868 +1245 0.1245 488.8815361971266498 11674.544528072562 +1246 0.1246 487.7155035677973842 11646.108058513131 +1247 0.1247 486.5523106555651225 11617.750186131740 +1248 0.1248 485.3919496138001364 11589.470649167848 +1249 0.1249 484.2344126219958298 11561.269186917998 +1250 0.1250 483.0796918856633511 11533.145539731071 +1251 0.1251 481.9277796362266599 11505.099449002699 +1252 0.1252 480.7786681309179926 11477.130657170761 +1253 0.1253 479.6323496526739518 11449.238907710031 +1254 0.1254 478.4888165100320521 11421.423945127663 +1255 0.1255 477.3480610370277759 11393.685514957420 +1256 0.1256 476.2100755930921423 11366.023363755590 +1257 0.1257 475.0748525629495589 11338.437239095951 +1258 0.1258 473.9423843565165271 11310.926889564300 +1259 0.1259 472.8126634088005744 11283.492064754300 +1260 0.1260 471.6856821797997554 11256.132515262580 +1261 0.1261 470.5614331544024367 11228.847992683528 +1262 0.1262 469.4399088422879913 11201.638249604968 +1263 0.1263 468.3211017778275504 11174.503039603342 +1264 0.1264 467.2050045199854367 11147.442117238741 +1265 0.1265 466.0916096522209386 11120.455238050719 +1266 0.1266 464.9809097823907678 11093.542158553149 +1267 0.1267 463.8728975426516286 11066.702636229978 +1268 0.1268 462.7675655893636417 11039.936429530289 +1269 0.1269 461.6649066029939377 11013.243297864090 +1270 0.1270 460.5649132880208754 10986.623001597540 +1271 0.1271 459.4675783728386023 10960.075302048481 +1272 0.1272 458.3728946096620689 10933.599961481728 +1273 0.1273 457.2808547744327257 10907.196743105242 +1274 0.1274 456.1914516667242196 10880.865411064871 +1275 0.1275 455.1046781096489440 10854.605730440389 +1276 0.1276 454.0205269497648715 10828.417467241208 +1277 0.1277 452.9389910569827293 10802.300388401498 +1278 0.1278 451.8600633244738560 10776.254261776328 +1279 0.1279 450.7837366685781717 10750.278856137211 +1280 0.1280 449.7100040287129445 10724.373941167531 +1281 0.1281 448.6388583672816139 10698.539287458672 +1282 0.1282 447.5702926695834094 10672.774666505540 +1283 0.1283 446.5042999437230264 10647.079850702139 +1284 0.1284 445.4408732205210413 10621.454613338041 +1285 0.1285 444.3800055534244962 10595.898728593200 +1286 0.1286 443.3216900184181100 10570.411971534621 +1287 0.1287 442.2659197139357730 10544.994118112012 +1288 0.1288 441.2126877607724964 10519.644945153310 +1289 0.1289 440.1619873019967599 10494.364230361001 +1290 0.1290 439.1138115028633138 10469.151752307940 +1291 0.1291 438.0681535507262652 10444.007290433068 +1292 0.1292 437.0250066549527332 10418.930625037810 +1293 0.1293 435.9843640468367880 10393.921537281542 +1294 0.1294 434.9462189795137874 10368.979809178159 +1295 0.1295 433.9105647278752826 10344.105223591601 +1296 0.1296 432.8773945884840941 10319.297564232300 +1297 0.1297 431.8467018794898422 10294.556615653040 +1298 0.1298 430.8184799405449326 10269.882163245151 +1299 0.1299 429.7927221327209395 10245.273993234452 +1300 0.1300 428.7694218384253304 10220.731892677841 +1301 0.1301 427.7485724613184743 10196.255649458721 +1302 0.1302 426.7301674262313327 10171.845052284010 +1303 0.1303 425.7142001790831500 10147.499890679588 +1304 0.1304 424.7006641867998269 10123.219954987180 +1305 0.1305 423.6895529372324631 10099.005036360211 +1306 0.1306 422.6808599390764698 10074.854926759868 +1307 0.1307 421.6745787217908514 10050.769418952139 +1308 0.1308 420.6707028355180569 10026.748306503190 +1309 0.1309 419.6692258510040574 10002.791383776388 +1310 0.1310 418.6701413595188228 9978.898445928460 +1311 0.1311 417.6734429727771385 9955.069288905681 +1312 0.1312 416.6791243228598205 9931.303709440130 +1313 0.1313 415.6871790621354990 9907.601505046830 +1314 0.1314 414.6976008631821742 9883.962474019179 +1315 0.1315 413.7103834187099096 9860.386415426088 +1316 0.1316 412.7255204414831837 9836.873129108411 +1317 0.1317 411.7430056642440377 9813.422415674740 +1318 0.1318 410.7628328396353368 9790.034076499020 +1319 0.1319 409.7849957401246002 9766.707913715740 +1320 0.1320 408.8094881579279445 9743.443730217808 +1321 0.1321 407.8363039049344252 9720.241329652019 +1322 0.1322 406.8654368126310032 9697.100516416369 +1323 0.1323 405.8968807320273982 9674.021095655920 +1324 0.1324 404.9306295335815662 9651.002873260280 +1325 0.1325 403.9666771071255766 9628.045655859591 +1326 0.1326 403.0050173617915448 9605.149250821061 +1327 0.1327 402.0456442259381902 9582.313466246431 +1328 0.1328 401.0885516470774519 9559.538110967789 +1329 0.1329 400.1337335918018425 9536.822994544491 +1330 0.1330 399.1811840457115750 9514.167927260409 +1331 0.1331 398.2308970133425419 9491.572720119801 +1332 0.1332 397.2828665180942949 9469.037184844759 +1333 0.1333 396.3370866021584789 9446.561133871612 +1334 0.1334 395.3935513264474935 9424.144380347749 +1335 0.1335 394.4522547705236661 9401.786738128529 +1336 0.1336 393.5131910325285389 9379.488021774039 +1337 0.1337 392.5763542291125532 9357.248046545939 +1338 0.1338 391.6417384953650753 9335.066628404038 +1339 0.1339 390.7093379847447068 9312.943584003800 +1340 0.1340 389.7791468690098782 9290.878730692431 +1341 0.1341 388.8511593381499551 9268.871886506491 +1342 0.1342 387.9253696003162304 9246.922870168421 +1343 0.1343 387.0017718817536547 9225.031501083200 +1344 0.1344 386.0803604267326818 9203.197599336170 +1345 0.1345 385.1611294974814541 9181.420985688950 +1346 0.1346 384.2440733741181589 9159.701481577360 +1347 0.1347 383.3291863545838964 9138.038909107539 +1348 0.1348 382.4164627545758322 9116.433091053670 +1349 0.1349 381.5058969074804054 9094.883850854581 +1350 0.1350 380.5974831643071070 9073.391012610959 +1351 0.1351 379.6912158936224273 9051.954401082490 +1352 0.1352 378.7870894814840881 9030.573841684491 +1353 0.1353 377.8850983313755592 9009.249160485619 +1354 0.1354 376.9852368641410862 8987.980184204349 +1355 0.1355 376.0874995179205484 8966.766740206580 +1356 0.1356 375.1918807480851115 8945.608656502600 +1357 0.1357 374.2983750271727672 8924.505761744131 +1358 0.1358 373.4069768448244986 8903.457885221509 +1359 0.1359 372.5176807077203875 8882.464856861079 +1360 0.1360 371.6304811395162346 8861.526507221999 +1361 0.1361 370.7453726807804628 8840.642667493859 +1362 0.1362 369.8623498889310781 8819.813169493451 +1363 0.1363 368.9814073381732555 8799.037845662511 +1364 0.1364 368.1025396194369250 8778.316529064559 +1365 0.1365 367.2257413403145847 8757.649053382360 +1366 0.1366 366.3510071249997395 8737.035252914990 +1367 0.1367 365.4783316142252261 8716.474962575350 +1368 0.1368 364.6077094652021060 8695.968017887451 +1369 0.1369 363.7391353515585593 8675.514254983560 +1370 0.1370 362.8726039632792890 8655.113510601801 +1371 0.1371 362.0081100066450404 8634.765622083101 +1372 0.1372 361.1456482041724598 8614.470427368840 +1373 0.1373 360.2852132945541257 8594.227764998279 +1374 0.1374 359.4268000325989192 8574.037474105660 +1375 0.1375 358.5704031891727368 8553.899394417811 +1376 0.1376 357.7160175511392595 8533.813366251570 +1377 0.1377 356.8636379213011196 8513.779230510940 +1378 0.1378 356.0132591183412956 8493.796828685048 +1379 0.1379 355.1648759767647903 8473.866002845021 +1380 0.1380 354.3184833468404236 8453.986595641760 +1381 0.1381 353.4740760945431930 8434.158450303210 +1382 0.1382 352.6316491014964072 8414.381410632370 +1383 0.1383 351.7911972649146151 8394.655321004031 +1384 0.1384 350.9527154975462508 8374.980026362951 +1385 0.1385 350.1161987276170748 8355.355372220711 +1386 0.1386 349.2816418987733300 8335.781204654082 +1387 0.1387 348.4490399700255239 8316.257370301930 +1388 0.1388 347.6183879156922671 8296.783716362901 +1389 0.1389 346.7896807253444535 8277.360090593220 +1390 0.1390 345.9629134037496101 8257.986341304011 +1391 0.1391 345.1380809708164747 8238.662317359260 +1392 0.1392 344.3151784615398583 8219.387868172840 +1393 0.1393 343.4942009259459041 8200.162843706741 +1394 0.1394 342.6751434290371208 8180.987094468390 +1395 0.1395 341.8580010507382667 8161.860471508259 +1396 0.1396 341.0427688858419515 8142.782826417661 +1397 0.1397 340.2294420439547480 8123.754011326400 +1398 0.1398 339.4180156494434186 8104.773878900500 +1399 0.1399 338.6084848413814257 8085.842282339750 +1400 0.1400 337.8008447734956690 8066.959075375431 +1401 0.1401 336.9950906141135079 8048.124112268109 +1402 0.1402 336.1912175461098400 8029.337247805570 +1403 0.1403 335.3892207668545780 8010.598337299961 +1404 0.1404 334.5890954881602966 7991.907236586221 +1405 0.1405 333.7908369362299936 7973.263802019301 +1406 0.1406 332.9944403516054194 7954.667890472430 +1407 0.1407 332.1999009891150649 7936.119359334551 +1408 0.1408 331.4072141178229458 7917.618066507859 +1409 0.1409 330.6163750209772161 7899.163870406610 +1410 0.1410 329.8273789959591795 7880.756629953680 +1411 0.1411 329.0402213542325285 7862.396204579400 +1412 0.1412 328.2548974212926396 7844.082454218760 +1413 0.1413 327.4714025366162105 7825.815239309660 +1414 0.1414 326.6897320536112375 7807.594420790320 +1415 0.1415 325.9098813395668230 7789.419860097740 +1416 0.1416 325.1318457756036651 7771.291419165191 +1417 0.1417 324.3556207566243756 7753.208960420180 +1418 0.1418 323.5812016912642548 7735.172346782109 +1419 0.1419 322.8085840018421209 7717.181441660870 +1420 0.1420 322.0377631243113683 7699.236108954061 +1421 0.1421 321.2687345082114234 7681.336213045190 +1422 0.1422 320.5014936166190864 7663.481618801750 +1423 0.1423 319.7360359261003282 7645.672191573040 +1424 0.1424 318.9723569266622576 7627.907797187971 +1425 0.1425 318.2104521217052024 7610.188301953360 +1426 0.1426 317.4503170279749611 7592.513572651720 +1427 0.1427 316.6919471755153950 7574.883476539269 +1428 0.1428 315.9353381076212486 7557.297881343949 +1429 0.1429 315.1804853807908557 7539.756655263369 +1430 0.1430 314.4273845646795280 7522.259666963179 +1431 0.1431 313.6760312420526589 7504.806785574420 +1432 0.1432 312.9264210087393394 7487.397880692241 +1433 0.1433 312.1785494735860311 7470.032822373630 +1434 0.1434 311.4324122584105794 7452.711481135630 +1435 0.1435 310.6880049979561704 7435.433727952930 +1436 0.1436 309.9453233398456860 7418.199434256820 +1437 0.1437 309.2043629445362285 7401.008471932299 +1438 0.1438 308.4651194852737603 7383.860713317191 +1439 0.1439 307.7275886480479699 7366.756031199099 +1440 0.1440 306.9917661315473083 7349.694298814680 +1441 0.1441 306.2576476471142541 7332.675389846861 +1442 0.1442 305.5252289187007477 7315.699178423610 +1443 0.1443 304.7945056828237966 7298.765539115630 +1444 0.1444 304.0654736885213083 7281.874346934661 +1445 0.1445 303.3381286973079796 7265.025477331940 +1446 0.1446 302.6124664831315840 7248.218806195790 +1447 0.1447 301.8884828323292595 7231.454209850419 +1448 0.1448 301.1661735435840797 7214.731565053529 +1449 0.1449 300.4455344278816256 7198.050748995030 +1450 0.1450 299.7265613084671259 7181.411639294851 +1451 0.1451 299.0092500208023125 7164.814114001280 +1452 0.1452 298.2935964125227883 7148.258051589451 +1453 0.1453 297.5795963433953375 7131.743330959199 +1454 0.1454 296.8672456852756909 7115.269831433410 +1455 0.1455 296.1565403220662347 7098.837432756230 +1456 0.1456 295.4474761496738324 7082.446015091789 +1457 0.1457 294.7400490759681588 7066.095459021510 +1458 0.1458 294.0342550207399199 7049.785645543549 +1459 0.1459 293.3300899156592436 7033.516456069960 +1460 0.1460 292.6275497042344682 7017.287772425860 +1461 0.1461 291.9266303417708173 7001.099476847149 +1462 0.1462 291.2273277953294723 6984.951451979271 +1463 0.1463 290.5296380436867594 6968.843580875000 +1464 0.1464 289.8335570772933352 6952.775746993429 +1465 0.1465 289.1390808982337717 6936.747834197570 +1466 0.1466 288.4462055201862540 6920.759726753279 +1467 0.1467 287.7549269683822217 6904.811309327420 +1468 0.1468 287.0652412795665782 6888.902466985890 +1469 0.1469 286.3771445019576731 6873.033085192720 +1470 0.1470 285.6906326952076824 6857.203049807570 +1471 0.1471 285.0057019303630454 6841.412247084921 +1472 0.1472 284.3223482898252428 6825.660563671679 +1473 0.1473 283.6405678673113471 6809.947886606319 +1474 0.1474 282.9603567678151990 6794.274103316689 +1475 0.1475 282.2817111075684124 6778.639101618900 +1476 0.1476 281.6046270140017214 6763.042769715300 +1477 0.1477 280.9291006257063259 6747.484996193150 +1478 0.1478 280.2551280923955233 6731.965670023171 +1479 0.1479 279.5827055748665089 6716.484680557581 +1480 0.1480 278.9118292449621777 6701.041917528991 +1481 0.1481 278.2424952855333231 6685.637271048460 +1482 0.1482 277.5746998904006659 6670.270631604350 +1483 0.1483 276.9084392643174510 6654.941890060441 +1484 0.1484 276.2437096229317035 6639.650937654631 +1485 0.1485 275.5805071927491099 6624.397665997401 +1486 0.1486 274.9188282110957289 6609.181967070131 +1487 0.1487 274.2586689260810431 6594.003733223721 +1488 0.1488 273.6000255965610108 6578.862857177151 +1489 0.1489 272.9428944921013453 6563.759232015931 +1490 0.1490 272.2872718929410212 6548.692751190691 +1491 0.1491 271.6331540899557240 6533.663308515429 +1492 0.1492 270.9805373846216412 6518.670798166340 +1493 0.1493 270.3294180889793097 6503.715114680320 +1494 0.1494 269.6797925255976338 6488.796152953551 +1495 0.1495 269.0316570275379604 6473.913808239580 +1496 0.1496 268.3850079383185516 6459.067976148830 +1497 0.1497 267.7398416118788305 6444.258552645991 +1498 0.1498 267.0961544125440810 6429.485434049560 +1499 0.1499 266.4539427149900916 6414.748517030059 +1500 0.1500 265.8132029042081399 6400.047698608450 +1501 0.1501 265.1739313754699765 6385.382876154949 +1502 0.1502 264.5361245342928669 6370.753947387600 +1503 0.1503 263.8997787964049735 6356.160810370820 +1504 0.1504 263.2648905877107381 6341.603363514160 +1505 0.1505 262.6314563442564918 6327.081505570600 +1506 0.1506 261.9994725121961778 6312.595135635621 +1507 0.1507 261.3689355477571326 6298.144153145270 +1508 0.1508 260.7398419172060926 6283.728457875530 +1509 0.1509 260.1121880968153164 6269.347949940161 +1510 0.1510 259.4859705728288191 6255.002529790131 +1511 0.1511 258.8611858414287212 6240.692098211531 +1512 0.1512 258.2378304087018819 6226.416556324800 +1513 0.1513 257.6159007906064744 6212.175805583220 +1514 0.1514 256.9953935129387332 6197.969747771359 +1515 0.1515 256.3763051112999278 6183.798285004311 +1516 0.1516 255.7586321310634219 6169.661319725531 +1517 0.1517 255.1423711273418178 6155.558754706431 +1518 0.1518 254.5275186649542718 6141.490493044671 +1519 0.1519 253.9140713183939226 6127.456438162460 +1520 0.1520 253.3020256717954908 6113.456493806179 +1521 0.1521 252.6913783189029630 6099.490564044250 +1522 0.1522 252.0821258630374189 6085.558553266470 +1523 0.1523 251.4742649170649997 6071.660366182170 +1524 0.1524 250.8677921033649056 6057.795907819570 +1525 0.1525 250.2627040537977336 6043.965083523890 +1526 0.1526 249.6589974096737024 6030.167798956669 +1527 0.1527 249.0566688217211606 6016.403960094091 +1528 0.1528 248.4557149500551532 6002.673473226060 +1529 0.1529 247.8561324641460999 5988.976244954801 +1530 0.1530 247.2579180427886740 5975.312182193459 +1531 0.1531 246.6610683740707373 5961.681192165250 +1532 0.1532 246.0655801553423885 5948.083182401941 +1533 0.1533 245.4714500931851546 5934.518060742890 +1534 0.1534 244.8786749033813237 5920.985735333481 +1535 0.1535 244.2872513108834198 5907.486114624399 +1536 0.1536 243.6971760497837067 5894.019107369971 +1537 0.1537 243.1084458632838619 5880.584622627080 +1538 0.1538 242.5210575036647924 5867.182569754490 +1539 0.1539 241.9350077322565369 5853.812858410820 +1540 0.1540 241.3502933194083084 5840.475398553869 +1541 0.1541 240.7669110444586238 5827.170100439690 +1542 0.1542 240.1848576957056025 5813.896874620711 +1543 0.1543 239.6041300703772947 5800.655631945209 +1544 0.1544 239.0247249746022362 5787.446283555770 +1545 0.1545 238.4466392233800320 5774.268740888380 +1546 0.1546 237.8698696405520536 5761.122915671370 +1547 0.1547 237.2944130587723066 5748.008719923590 +1548 0.1548 236.7202663194784122 5734.926065954370 +1549 0.1549 236.1474262728626172 5721.874866361351 +1550 0.1550 235.5758897778430594 5708.855034030061 +1551 0.1551 235.0056537020349197 5695.866482132571 +1552 0.1552 234.4367149217219719 5682.909124126200 +1553 0.1553 233.8690703218280476 5669.982873752539 +1554 0.1554 233.3027167958885855 5657.087645036780 +1555 0.1555 232.7376512460224660 5644.223352285620 +1556 0.1556 232.1738705829038167 5631.389910087290 +1557 0.1557 231.6113717257339601 5618.587233309590 +1558 0.1558 231.0501516022135036 5605.815237099370 +1559 0.1559 230.4902071485144859 5593.073836881179 +1560 0.1560 229.9315353092526095 5580.362948356130 +1561 0.1561 229.3741330374597567 5567.682487501101 +1562 0.1562 228.8179972945563350 5555.032370567480 +1563 0.1563 228.2631250503239642 5542.412514080110 +1564 0.1564 227.7095132828781345 5529.822834836311 +1565 0.1565 227.1571589786410925 5517.263249904790 +1566 0.1566 226.6060591323146127 5504.733676624620 +1567 0.1567 226.0562107468531678 5492.234032604079 +1568 0.1568 225.5076108334369849 5479.764235719809 +1569 0.1569 224.9602564114452150 5467.324204115740 +1570 0.1570 224.4141445084293309 5454.913856201751 +1571 0.1571 223.8692721600865809 5442.533110653150 +1572 0.1572 223.3256364102334430 5430.181886409500 +1573 0.1573 222.7832343107793065 5417.860102673149 +1574 0.1574 222.2420629217002102 5405.567678908949 +1575 0.1575 221.7021193110126376 5393.304534842720 +1576 0.1576 221.1634005547474828 5381.070590460540 +1577 0.1577 220.6259037369240730 5368.865766007410 +1578 0.1578 220.0896259495243612 5356.689981986810 +1579 0.1579 219.5545642924670631 5344.543159159199 +1580 0.1580 219.0207158735820485 5332.425218541221 +1581 0.1581 218.4880778085847624 5320.336081404710 +1582 0.1582 217.9566472210507300 5308.275669275990 +1583 0.1583 217.4264212423902052 5296.243903934369 +1584 0.1584 216.8973970118229033 5284.240707411530 +1585 0.1585 216.3695716763527912 5272.266001990571 +1586 0.1586 215.8429423907430191 5260.319710205060 +1587 0.1587 215.3175063174908814 5248.401754837681 +1588 0.1588 214.7932606268030042 5236.512058920070 +1589 0.1589 214.2702024965704481 5224.650545730980 +1590 0.1590 213.7483291123440949 5212.817138796050 +1591 0.1591 213.2276376673099776 5201.011761886501 +1592 0.1592 212.7081253622647523 5189.234339018270 +1593 0.1593 212.1897894055912843 5177.484794451270 +1594 0.1594 211.6726270132343188 5165.763052688009 +1595 0.1595 211.1566354086762658 5154.069038473269 +1596 0.1596 210.6418118229129561 5142.402676792671 +1597 0.1597 210.1281534944297107 5130.763892872210 +1598 0.1598 209.6156576691772671 5119.152612176850 +1599 0.1599 209.1043216005479053 5107.568760410109 +1600 0.1600 208.5941425493517443 5096.012263512929 +1601 0.1601 208.0851177837929527 5084.483047662709 +1602 0.1602 207.5772445794461873 5072.981039272519 +1603 0.1603 207.0705202192330603 5061.506164990230 +1604 0.1604 206.5649419933986621 5050.058351697620 +1605 0.1605 206.0605071994883133 5038.637526509450 +1606 0.1606 205.5572131423242013 5027.243616772599 +1607 0.1607 205.0550571339823023 5015.876550065229 +1608 0.1608 204.5540364937692459 5004.536254195810 +1609 0.1609 204.0541485481993220 4993.222657202509 +1610 0.1610 203.5553906309716012 4981.935687351910 +1611 0.1611 203.0577600829470839 4970.675273138680 +1612 0.1612 202.5612542521259343 4959.441343284300 +1613 0.1613 202.0658704936249137 4948.233826736239 +1614 0.1614 201.5716061696547285 4937.052652667590 +1615 0.1615 201.0784586494975770 4925.897750475539 +1616 0.1616 200.5864253094847527 4914.769049780871 +1617 0.1617 200.0955035329743339 4903.666480427401 +1618 0.1618 199.6056907103289291 4892.589972480499 +1619 0.1619 199.1169842388935649 4881.539456226800 +1620 0.1620 198.6293815229735458 4870.514862173310 +1621 0.1621 198.1428799738125690 4859.516121046340 +1622 0.1622 197.6574770095707265 4848.543163790740 +1623 0.1623 197.1731700553027054 4837.595921569431 +1624 0.1624 196.6899565429361303 4826.674325762159 +1625 0.1625 196.2078339112497645 4815.778307964980 +1626 0.1626 195.7267996058520509 4804.907799989151 +1627 0.1627 195.2468510791595691 4794.062733860760 +1628 0.1628 194.7679857903755476 4783.243041819589 +1629 0.1629 194.2902012054686338 4772.448656318510 +1630 0.1630 193.8134947971515771 4761.679510022349 +1631 0.1631 193.3378640448600834 4750.935535807780 +1632 0.1632 192.8633064347316122 4740.216666761830 +1633 0.1633 192.3898194595844586 4729.522836181499 +1634 0.1634 191.9174006188967496 4718.853977572900 +1635 0.1635 191.4460474187855823 4708.210024650440 +1636 0.1636 190.9757573719862478 4697.590911336110 +1637 0.1637 190.5065279978315118 4686.996571758690 +1638 0.1638 190.0383568222309236 4676.426940252991 +1639 0.1639 189.5712413776503240 4665.881951359080 +1640 0.1640 189.1051792030912964 4655.361539821560 +1641 0.1641 188.6401678440707883 4644.865640588810 +1642 0.1642 188.1762048526007334 4634.394188812180 +1643 0.1643 187.7132877871678716 4623.947119845340 +1644 0.1644 187.2514142127134278 4613.524369243430 +1645 0.1645 186.7905817006131315 4603.125872762470 +1646 0.1646 186.3307878286570940 4592.751566358411 +1647 0.1647 185.8720301810298565 4582.401386186611 +1648 0.1648 185.4143063482904665 4572.075268600970 +1649 0.1649 184.9576139273527531 4561.773150153261 +1650 0.1650 184.5019505214654600 4551.494967592381 +1651 0.1651 184.0473137401926635 4541.240657863670 +1652 0.1652 183.5937011993940757 4531.010158108121 +1653 0.1653 183.1411105212055759 4520.803405661751 +1654 0.1654 182.6895393340197415 4510.620338054810 +1655 0.1655 182.2389852724664365 4500.460893011120 +1656 0.1656 181.7894459773935125 4490.325008447349 +1657 0.1657 181.3409190958475392 4480.212622472350 +1658 0.1658 180.8934022810545912 4470.123673386410 +1659 0.1659 180.4468931924012338 4460.058099680541 +1660 0.1660 180.0013894954154239 4450.015840035830 +1661 0.1661 179.5568888617474954 4439.996833322770 +1662 0.1662 179.1133889691513446 4430.001018600471 +1663 0.1663 178.6708875014655291 4420.028335116101 +1664 0.1664 178.2293821485945102 4410.078722304109 +1665 0.1665 177.7888706064900362 4400.152119785551 +1666 0.1666 177.3493505771323839 4390.248467367490 +1667 0.1667 176.9108197685118853 4380.367705042250 +1668 0.1668 176.4732758946104241 4370.509772986770 +1669 0.1669 176.0367166753829906 4360.674611561921 +1670 0.1670 175.6011398367392928 4350.862161311900 +1671 0.1671 175.1665431105255379 4341.072362963420 +1672 0.1672 174.7329242345061004 4331.305157425240 +1673 0.1673 174.3002809523454744 4321.560485787380 +1674 0.1674 173.8686110135900833 4311.838289320530 +1675 0.1675 173.4379121736502896 4302.138509475340 +1676 0.1676 173.0081821937824316 4292.461087881839 +1677 0.1677 172.5794188410709182 4282.805966348710 +1678 0.1678 172.1516198884103517 4273.173086862720 +1679 0.1679 171.7247831144878205 4263.562391588060 +1680 0.1680 171.2989063037651363 4253.973822865679 +1681 0.1681 170.8739872464612120 4244.407323212660 +1682 0.1682 170.4500237385344974 4234.862835321600 +1683 0.1683 170.0270135816654147 4225.340302059981 +1684 0.1684 169.6049545832389356 4215.839666469529 +1685 0.1685 169.1838445563271875 4206.360871765591 +1686 0.1686 168.7636813196720880 4196.903861336550 +1687 0.1687 168.3444626976680922 4187.468578743099 +1688 0.1688 167.9261865203450554 4178.054967717769 +1689 0.1689 167.5088506233509520 4168.662972164210 +1690 0.1690 167.0924528479349078 4159.292536156611 +1691 0.1691 166.6769910409301190 4149.943603939110 +1692 0.1692 166.2624630547369122 4140.616119925121 +1693 0.1693 165.8488667473058058 4131.310028696840 +1694 0.1694 165.4361999821207405 4122.025275004539 +1695 0.1695 165.0244606281822257 4112.761803766020 +1696 0.1696 164.6136465599906273 4103.519560066001 +1697 0.1697 164.2037556575295412 4094.298489155510 +1698 0.1698 163.7947858062491946 4085.098536451349 +1699 0.1699 163.3867348970498483 4075.919647535429 +1700 0.1700 162.9796008262653686 4066.761768154220 +1701 0.1701 162.5733814956467427 4057.624844218180 +1702 0.1702 162.1680748123457647 4048.508821801159 +1703 0.1703 161.7636786888987217 4039.413647139790 +1704 0.1704 161.3601910432100794 4030.339266632960 +1705 0.1705 160.9576097985363674 4021.285626841210 +1706 0.1706 160.5559328834700068 4012.252674486170 +1707 0.1707 160.1551582319231954 4003.240356449961 +1708 0.1708 159.7552837831119632 3994.248619774669 +1709 0.1709 159.3563074815401421 3985.277411661781 +1710 0.1710 158.9582272769834788 3976.326679471521 +1711 0.1711 158.5610411244737747 3967.396370722479 +1712 0.1712 158.1647469842831129 3958.486433090861 +1713 0.1713 157.7693428219080829 3949.596814410011 +1714 0.1714 157.3748266080540930 3940.727462669931 +1715 0.1715 156.9811963186197659 3931.878326016581 +1716 0.1716 156.5884499346813641 3923.049352751440 +1717 0.1717 156.1965854424772431 3914.240491330900 +1718 0.1718 155.8056008333924183 3905.451690365770 +1719 0.1719 155.4154941039431037 3896.682898620699 +1720 0.1720 155.0262632557613927 3887.934065013640 +1721 0.1721 154.6379062955799384 3879.205138615311 +1722 0.1722 154.2504212352167485 3870.496068648671 +1723 0.1723 153.8638060915598942 3861.806804488350 +1724 0.1724 153.4780588865524749 3853.137295660171 +1725 0.1725 153.0931776471774413 3844.487491840599 +1726 0.1726 152.7091604054426170 3835.857342856160 +1727 0.1727 152.3260051983656638 3827.246798683030 +1728 0.1728 151.9437100679591879 3818.655809446399 +1729 0.1729 151.5622730612158762 3810.084325419959 +1730 0.1730 151.1816922300936028 3801.532297025521 +1731 0.1731 150.8019656315007069 3792.999674832300 +1732 0.1732 150.4230913272812700 3784.486409556550 +1733 0.1733 150.0450673842003937 3775.992452060989 +1734 0.1734 149.6678918739296194 3767.517753354280 +1735 0.1735 149.2915628730323760 3759.062264590530 +1736 0.1736 148.9160784629494003 3750.625937068831 +1737 0.1737 148.5414367299843263 3742.208722232690 +1738 0.1738 148.1676357652892193 3733.810571669561 +1739 0.1739 147.7946736648502224 3725.431437110340 +1740 0.1740 147.4225485294732607 3717.071270428841 +1741 0.1741 147.0512584647697452 3708.730023641320 +1742 0.1742 146.6808015811423900 3700.407648906009 +1743 0.1743 146.3111759937709735 3692.104098522590 +1744 0.1744 145.9423798225982694 3683.819324931700 +1745 0.1745 145.5744111923159494 3675.553280714420 +1746 0.1746 145.2072682323506285 3667.305918591880 +1747 0.1747 144.8409490768497960 3659.077191424691 +1748 0.1748 144.4754518646679458 3650.867052212450 +1749 0.1749 144.1107747393526495 3642.675454093350 +1750 0.1750 143.7469158491308008 3634.502350343610 +1751 0.1751 143.3838733468947737 3626.347694377030 +1752 0.1752 143.0216453901886950 3618.211439744550 +1753 0.1753 142.6602301411947735 3610.093540133709 +1754 0.1754 142.2996257667196858 3601.993949368260 +1755 0.1755 141.9398304381809055 3593.912621407590 +1756 0.1756 141.5808423315932032 3585.849510346351 +1757 0.1757 141.2226596275552026 3577.804570413939 +1758 0.1758 140.8652805112357953 3569.777755974070 +1759 0.1759 140.5087031723608675 3561.769021524281 +1760 0.1760 140.1529258051998852 3553.778321695479 +1761 0.1761 139.7979466085525360 3545.805611251530 +1762 0.1762 139.4437637857355128 3537.850845088679 +1763 0.1763 139.0903755445693264 3529.913978235241 +1764 0.1764 138.7377800973650039 3521.994965851080 +1765 0.1765 138.3859756609111002 3514.093763227120 +1766 0.1766 138.0349604564604817 3506.210325785000 +1767 0.1767 137.6847327097173945 3498.344609076509 +1768 0.1768 137.3352906508244189 3490.496568783230 +1769 0.1769 136.9866325143494521 3482.666160716040 +1770 0.1770 136.6387565392729186 3474.853340814690 +1771 0.1771 136.2916609689748100 3467.058065147369 +1772 0.1772 135.9453440512219231 3459.280289910291 +1773 0.1773 135.5998040381550425 3451.519971427169 +1774 0.1774 135.2550391862762353 3443.777066148869 +1775 0.1775 134.9110477564361474 3436.051530652951 +1776 0.1776 134.5678280138213267 3428.343321643200 +1777 0.1777 134.2253782279416896 3420.652395949271 +1778 0.1778 133.8836966726179298 3412.978710526200 +1779 0.1779 133.5427816259689280 3405.322222453970 +1780 0.1780 133.2026313703993594 3397.682888937121 +1781 0.1781 132.8632441925872740 3390.060667304339 +1782 0.1782 132.5246183834716476 3382.455515007980 +1783 0.1783 132.1867522382400750 3374.867389623720 +1784 0.1784 131.8496440563163787 3367.296248850040 +1785 0.1785 131.5132921413484723 3359.742050507920 +1786 0.1786 131.1776948011960542 3352.204752540340 +1787 0.1787 130.8428503479184428 3344.684313011900 +1788 0.1788 130.5087570977624409 3337.180690108410 +1789 0.1789 130.1754133711501993 3329.693842136480 +1790 0.1790 129.8428174926672227 3322.223727523100 +1791 0.1791 129.5109677910503194 3314.770304815240 +1792 0.1792 129.1798625991755785 3307.333532679430 +1793 0.1793 128.8495002540465464 3299.913369901399 +1794 0.1794 128.5198790967822049 3292.509775385600 +1795 0.1795 128.1909974726051757 3285.122708154910 +1796 0.1796 127.8628537308299116 3277.752127350120 +1797 0.1797 127.5354462248509293 3270.397992229629 +1798 0.1798 127.2087733121310009 3263.060262168970 +1799 0.1799 126.8828333541895290 3255.738896660499 +1800 0.1800 126.5576247165908512 3248.433855312930 +1801 0.1801 126.2331457689326584 3241.145097850980 +1802 0.1802 125.9093948848343558 3233.872584114980 +1803 0.1803 125.5863704419255811 3226.616274060450 +1804 0.1804 125.2640708218346646 3219.376127757760 +1805 0.1805 124.9424944101771899 3212.152105391730 +1806 0.1806 124.6216395965445400 3204.944167261229 +1807 0.1807 124.3015047744925425 3197.752273778819 +1808 0.1808 123.9820883415300870 3190.576385470320 +1809 0.1809 123.6633886991078413 3183.416462974510 +1810 0.1810 123.3454042526069827 3176.272467042701 +1811 0.1811 123.0281334113279286 3169.144358538339 +1812 0.1812 122.7115745884791806 3162.032098436720 +1813 0.1813 122.3957262011661271 3154.935647824470 +1814 0.1814 122.0805866703799438 3147.854967899310 +1815 0.1815 121.7661544209864957 3140.790019969631 +1816 0.1816 121.4524278817153089 3133.740765454140 +1817 0.1817 121.1394054851485294 3126.707165881420 +1818 0.1818 120.8270856677099800 3119.689182889690 +1819 0.1819 120.5154668696541762 3112.686778226321 +1820 0.1820 120.2045475350554824 3105.699913747560 +1821 0.1821 119.8943261117971986 3098.728551418110 +1822 0.1822 119.5848010515607598 3091.772653310780 +1823 0.1823 119.2759708098149076 3084.832181606181 +1824 0.1824 118.9678338458049893 3077.907098592290 +1825 0.1825 118.6603886225421718 3070.997366664110 +1826 0.1826 118.3536336067927977 3064.102948323370 +1827 0.1827 118.0475672690677271 3057.223806178110 +1828 0.1828 117.7421880836117083 3050.359902942340 +1829 0.1829 117.4374945283928042 3043.511201435750 +1830 0.1830 117.1334850850918485 3036.677664583240 +1831 0.1831 116.8301582390919577 3029.859255414690 +1832 0.1832 116.5275124794680011 3023.055937064560 +1833 0.1833 116.2255462989761980 3016.267672771500 +1834 0.1834 115.9242581940437162 3009.494425878120 +1835 0.1835 115.6236466647582830 3002.736159830560 +1836 0.1836 115.3237102148578543 2995.992838178140 +1837 0.1837 115.0244473517202977 2989.264424573060 +1838 0.1838 114.7258565863531459 2982.550882770071 +1839 0.1839 114.4279364333833371 2975.852176626080 +1840 0.1840 114.1306854110470397 2969.168270099880 +1841 0.1841 113.8341020411794631 2962.499127251780 +1842 0.1842 113.5381848492047112 2955.844712243230 +1843 0.1843 113.2429323641257213 2949.204989336600 +1844 0.1844 112.9483431185141598 2942.579922894720 +1845 0.1845 112.6544156485003896 2935.969477380610 +1846 0.1846 112.3611484937634941 2929.373617357230 +1847 0.1847 112.0685401975212869 2922.792307486970 +1848 0.1848 111.7765893065203642 2916.225512531480 +1849 0.1849 111.4852943710262281 2909.673197351280 +1850 0.1850 111.1946539448133962 2903.135326905450 +1851 0.1851 110.9046665851555531 2896.611866251300 +1852 0.1852 110.6153308528157879 2890.102780544060 +1853 0.1853 110.3266453120367601 2883.608035036510 +1854 0.1854 110.0386085305309933 2877.127595078790 +1855 0.1855 109.7512190794711557 2870.661426117889 +1856 0.1856 109.4644755334803818 2864.209493697500 +1857 0.1857 109.1783764706226236 2857.771763457630 +1858 0.1858 108.8929204723930297 2851.348201134260 +1859 0.1859 108.6081061237083674 2844.938772559110 +1860 0.1860 108.3239320128974441 2838.543443659270 +1861 0.1861 108.0403967316916436 2832.162180456870 +1862 0.1862 107.7574988752153615 2825.794949068820 +1863 0.1863 107.4752370419765981 2819.441715706490 +1864 0.1864 107.1936098338575079 2813.102446675401 +1865 0.1865 106.9126158561049920 2806.777108374909 +1866 0.1866 106.6322537173213476 2800.465667297860 +1867 0.1867 106.3525220294549314 2794.168090030390 +1868 0.1868 106.0734194077908370 2787.884343251540 +1869 0.1869 105.7949444709416156 2781.614393732970 +1870 0.1870 105.5170958408380386 2775.358208338680 +1871 0.1871 105.2398721427198751 2769.115754024680 +1872 0.1872 104.9632720051267114 2762.886997838690 +1873 0.1873 104.6872940598887851 2756.671906919920 +1874 0.1874 104.4119369421178618 2750.470448498661 +1875 0.1875 104.1371992901981258 2744.282589896070 +1876 0.1876 103.8630797457771280 2738.108298523810 +1877 0.1877 103.5895769537567475 2731.947541883849 +1878 0.1878 103.3166895622841537 2725.800287568090 +1879 0.1879 103.0444162227428393 2719.666503258110 +1880 0.1880 102.7727555897436957 2713.546156724860 +1881 0.1881 102.5017063211160320 2707.439215828390 +1882 0.1882 102.2312670778987354 2701.345648517550 +1883 0.1883 101.9614365243313756 2695.265422829731 +1884 0.1884 101.6922133278453657 2689.198506890520 +1885 0.1885 101.4235961590551653 2683.144868913480 +1886 0.1886 101.1555836917494986 2677.104477199850 +1887 0.1887 100.8881746028826001 2671.077300138209 +1888 0.1888 100.6213675725654753 2665.063306204300 +1889 0.1889 100.3551612840572318 2659.062463960649 +1890 0.1890 100.0895544237563826 2653.074742056330 +1891 0.1891 99.8245456811922338 2647.100109226680 +1892 0.1892 99.5601337490162450 2641.138534293060 +1893 0.1893 99.2963173229934597 2635.189986162520 +1894 0.1894 99.0330951019939505 2629.254433827550 +1895 0.1895 98.7704657879842784 2623.331846365800 +1896 0.1896 98.5084280860189949 2617.422192939830 +1897 0.1897 98.2469807042321577 2611.525442796809 +1898 0.1898 97.9861223538289039 2605.641565268280 +1899 0.1899 97.7258517490769947 2599.770529769840 +1900 0.1900 97.4661676072984591 2593.912305800910 +1901 0.1901 97.2070686488611955 2588.066862944441 +1902 0.1902 96.9485535971706440 2582.234170866680 +1903 0.1903 96.6906211786614591 2576.414199316890 +1904 0.1904 96.4332701227892670 2570.606918127070 +1905 0.1905 96.1764991620223242 2564.812297211710 +1906 0.1906 95.9203070318333602 2559.030306567520 +1907 0.1907 95.6646924706913211 2553.260916273150 +1908 0.1908 95.4096542200532127 2547.504096488980 +1909 0.1909 95.1551910243559291 2541.759817456799 +1910 0.1910 94.9013016310081099 2536.028049499610 +1911 0.1911 94.6479847903820684 2530.308763021299 +1912 0.1912 94.3952392558056772 2524.601928506450 +1913 0.1913 94.1430637835543536 2518.907516520039 +1914 0.1914 93.8914571328429872 2513.225497707181 +1915 0.1915 93.6404180658179826 2507.555842792930 +1916 0.1916 93.3899453475492436 2501.898522581930 +1917 0.1917 93.1400377460222302 2496.253507958260 +1918 0.1918 92.8906940321300567 2490.620769885160 +1919 0.1919 92.6419129796655625 2485.000279404680 +1920 0.1920 92.3936933653134531 2479.392007637610 +1921 0.1921 92.1460339686424135 2473.795925783050 +1922 0.1922 91.8989335720973486 2468.212005118289 +1923 0.1923 91.6523909609915108 2462.640216998519 +1924 0.1924 91.4064049234987550 2457.080532856550 +1925 0.1925 91.1609742506457934 2451.532924202640 +1926 0.1926 90.9160977363044509 2445.997362624190 +1927 0.1927 90.6717741771839627 2440.473819785500 +1928 0.1928 90.4280023728233147 2434.962267427580 +1929 0.1929 90.1847811255835410 2429.462677367860 +1930 0.1930 89.9421092406401499 2423.975021499960 +1931 0.1931 89.6999855259754781 2418.499271793490 +1932 0.1932 89.4584087923711166 2413.035400293730 +1933 0.1933 89.2173778534003645 2407.583379121440 +1934 0.1934 88.9768915254206547 2402.143180472660 +1935 0.1935 88.7369486275661075 2396.714776618411 +1936 0.1936 88.4975479817399560 2391.298139904490 +1937 0.1937 88.2586884126071709 2385.893242751200 +1938 0.1938 88.0203687475869572 2380.500057653190 +1939 0.1939 87.7825878168453357 2375.118557179160 +1940 0.1940 87.5453444532877967 2369.748713971610 +1941 0.1941 87.3086374925518811 2364.390500746710 +1942 0.1942 87.0724657729998484 2359.043890293950 +1943 0.1943 86.8368281357113574 2353.708855475989 +1944 0.1944 86.6017234244761340 2348.385369228400 +1945 0.1945 86.3671504857867376 2343.073404559430 +1946 0.1946 86.1331081688312707 2337.772934549810 +1947 0.1947 85.8995953254861604 2332.483932352500 +1948 0.1948 85.6666108103089101 2327.206371192440 +1949 0.1949 85.4341534805309664 2321.940224366391 +1950 0.1950 85.2022221960505135 2316.685465242660 +1951 0.1951 84.9708158194253400 2311.442067260899 +1952 0.1952 84.7399332158657046 2306.210003931870 +1953 0.1953 84.5095732532272450 2300.989248837200 +1954 0.1954 84.2797348020039294 2295.779775629250 +1955 0.1955 84.0504167353209226 2290.581558030800 +1956 0.1956 83.8216179289276369 2285.394569834841 +1957 0.1957 83.5933372611906691 2280.218784904430 +1958 0.1958 83.3655736130868235 2275.054177172399 +1959 0.1959 83.1383258681961479 2269.900720641151 +1960 0.1960 82.9115929126949709 2264.758389382460 +1961 0.1961 82.6853736353489808 2259.627157537280 +1962 0.1962 82.4596669275063476 2254.506999315459 +1963 0.1963 82.2344716830907885 2249.397888995601 +1964 0.1964 82.0097867985947744 2244.299800924810 +1965 0.1965 81.7856111730726099 2239.212709518470 +1966 0.1966 81.5619437081336827 2234.136589260070 +1967 0.1967 81.3387833079356284 2229.071414700979 +1968 0.1968 81.1161288791775661 2224.017160460240 +1969 0.1969 80.8939793310933339 2218.973801224321 +1970 0.1970 80.6723335754447675 2213.941311746950 +1971 0.1971 80.4511905265149778 2208.919666848930 +1972 0.1972 80.2305491011016443 2203.908841417850 +1973 0.1973 80.0104082185103493 2198.908810407979 +1974 0.1974 79.7907668005479564 2193.919548839950 +1975 0.1975 79.5716237715159309 2188.941031800650 +1976 0.1976 79.3529780582037461 2183.973234442990 +1977 0.1977 79.1348285898823178 2179.016131985690 +1978 0.1978 78.9171742982973825 2174.069699713040 +1979 0.1979 78.7000141176629882 2169.133912974770 +1980 0.1980 78.4833469846549576 2164.208747185820 +1981 0.1981 78.2671718384043658 2159.294177826130 +1982 0.1982 78.0514876204910308 2154.390180440430 +1983 0.1983 77.8362932749371055 2149.496730638090 +1984 0.1984 77.6215877482005538 2144.613804092850 +1985 0.1985 77.4073699891687710 2139.741376542700 +1986 0.1986 77.1936389491521595 2134.879423789610 +1987 0.1987 76.9803935818777063 2130.027921699400 +1988 0.1988 76.7676328434826587 2125.186846201490 +1989 0.1989 76.5553556925081438 2120.356173288740 +1990 0.1990 76.3435610898928445 2115.535879017270 +1991 0.1991 76.1322479989666761 2110.725939506170 +1992 0.1992 75.9214153854444902 2105.926330937450 +1993 0.1993 75.7110622174198369 2101.137029555740 +1994 0.1994 75.5011874653586403 2096.358011668151 +1995 0.1995 75.2917901020930316 2091.589253644080 +1996 0.1996 75.0828691028150814 2086.830731914940 +1997 0.1997 74.8744234450706330 2082.082422974159 +1998 0.1998 74.6664521087530915 2077.344303376750 +1999 0.1999 74.4589540760972852 2072.616349739330 +2000 0.2000 74.2519283316733265 2067.898538739800 +2001 0.2001 74.0453738623804725 2063.190847117250 +2002 0.2002 73.8392896574410287 2058.493251671680 +2003 0.2003 73.6336747083942527 2053.805729263900 +2004 0.2004 73.4285280090903001 2049.128256815280 +2005 0.2005 73.2238485556841567 2044.460811307630 +2006 0.2006 73.0196353466296273 2039.803369782940 +2007 0.2007 72.8158873826733100 2035.155909343291 +2008 0.2008 72.6126036668486137 2030.518407150560 +2009 0.2009 72.4097832044697611 2025.890840426360 +2010 0.2010 72.2074250031258487 2021.273186451750 +2011 0.2011 72.0055280726749061 2016.665422567120 +2012 0.2012 71.8040914252379565 2012.067526172010 +2013 0.2013 71.6031140751931048 2007.479474724910 +2014 0.2014 71.4025950391697108 2002.901245743060 +2015 0.2015 71.2025333360424355 1998.332816802340 +2016 0.2016 71.0029279869254708 1993.774165537020 +2017 0.2017 70.8037780151666425 1989.225269639620 +2018 0.2018 70.6050824463416262 1984.686106860770 +2019 0.2019 70.4068403082481353 1980.156655008950 +2020 0.2020 70.2090506309001654 1975.636891950359 +2021 0.2021 70.0117124465222105 1971.126795608780 +2022 0.2022 69.8148247895435077 1966.626343965349 +2023 0.2023 69.6183866965923244 1962.135515058400 +2024 0.2024 69.4223972064902455 1957.654286983280 +2025 0.2025 69.2268553602464749 1953.182637892230 +2026 0.2026 69.0317602010521512 1948.720545994140 +2027 0.2027 68.8371107742747199 1944.267989554441 +2028 0.2028 68.6429061274522496 1939.824946894900 +2029 0.2029 68.4491453102878324 1935.391396393450 +2030 0.2030 68.2558273746439568 1930.967316484050 +2031 0.2031 68.0629513745369366 1926.552685656480 +2032 0.2032 67.8705163661312980 1922.147482456220 +2033 0.2033 67.6785214077342800 1917.751685484201 +2034 0.2034 67.4869655597902351 1913.365273396750 +2035 0.2035 67.2958478848751298 1908.988224905329 +2036 0.2036 67.1051674476910449 1904.620518776450 +2037 0.2037 66.9149233150606477 1900.262133831420 +2038 0.2038 66.7251145559217633 1895.913048946230 +2039 0.2039 66.5357402413218750 1891.573243051420 +2040 0.2040 66.3467994444127100 1887.242695131870 +2041 0.2041 66.1582912404447825 1882.921384226630 +2042 0.2042 65.9702147067620075 1878.609289428800 +2043 0.2043 65.7825689227963011 1874.306389885330 +2044 0.2044 65.5953529700621942 1870.012664796890 +2045 0.2045 65.4085659321514612 1865.728093417700 +2046 0.2046 65.2222068947278046 1861.452655055360 +2047 0.2047 65.0362749455214981 1857.186329070670 +2048 0.2048 64.8507691743240855 1852.929094877540 +2049 0.2049 64.6656886729830660 1848.680931942790 +2050 0.2050 64.4810325353966221 1844.441819785970 +2051 0.2051 64.2967998575083612 1840.211737979240 +2052 0.2052 64.1129897373020441 1835.990666147170 +2053 0.2053 63.9296012747963474 1831.778583966690 +2054 0.2054 63.7466335720396700 1827.575471166790 +2055 0.2055 63.5640857331049105 1823.381307528440 +2056 0.2056 63.3819568640842661 1819.196072884470 +2057 0.2057 63.2002460730840738 1815.019747119340 +2058 0.2058 63.0189524702196522 1810.852310169060 +2059 0.2059 62.8380751676101497 1806.693742020960 +2060 0.2060 62.6576132793734217 1802.544022713600 +2061 0.2061 62.4775659216209149 1798.403132336600 +2062 0.2062 62.2979322124525581 1794.271051030480 +2063 0.2063 62.1187112719517103 1790.147758986520 +2064 0.2064 61.9399022221800521 1786.033236446610 +2065 0.2065 61.7615041871725694 1781.927463703069 +2066 0.2066 61.5835162929324866 1777.830421098570 +2067 0.2067 61.4059376674262651 1773.742089025900 +2068 0.2068 61.2287674405785722 1769.662447927890 +2069 0.2069 61.0520047442673146 1765.591478297210 +2070 0.2070 60.8756487123186432 1761.529160676270 +2071 0.2071 60.6996984805019792 1757.475475657031 +2072 0.2072 60.5241531865250835 1753.430403880880 +2073 0.2073 60.3490119700291174 1749.393926038480 +2074 0.2074 60.1742739725837126 1745.366022869630 +2075 0.2075 59.9999383376820745 1741.346675163140 +2076 0.2076 59.8260042107360874 1737.335863756630 +2077 0.2077 59.6524707390714326 1733.333569536440 +2078 0.2078 59.4793370719227354 1729.339773437480 +2079 0.2079 59.3066023604287125 1725.354456443019 +2080 0.2080 59.1342657576273254 1721.377599584690 +2081 0.2081 58.9623264184509850 1717.409183942170 +2082 0.2082 58.7907834997217194 1713.449190643180 +2083 0.2083 58.6196361601463991 1709.497600863270 +2084 0.2084 58.4488835603119483 1705.554395825720 +2085 0.2085 58.2785248626805981 1701.619556801340 +2086 0.2086 58.1085592315851116 1697.693065108420 +2087 0.2087 57.9389858332240664 1693.774902112510 +2088 0.2088 57.7698038356571288 1689.865049226310 +2089 0.2089 57.6010124088003366 1685.963487909580 +2090 0.2090 57.4326107244214157 1682.070199668890 +2091 0.2091 57.2645979561350913 1678.185166057619 +2092 0.2092 57.0969732793984264 1674.308368675700 +2093 0.2093 56.9297358715061605 1670.439789169570 +2094 0.2094 56.7628849115860845 1666.579409231970 +2095 0.2095 56.5964195805943930 1662.727210601880 +2096 0.2096 56.4303390613110878 1658.883175064290 +2097 0.2097 56.2646425383353659 1655.047284450170 +2098 0.2098 56.0993291980810440 1651.219520636250 +2099 0.2099 55.9343982287719825 1647.399865544950 +2100 0.2100 55.7698488204375238 1643.588301144200 +2101 0.2101 55.6056801649079446 1639.784809447350 +2102 0.2102 55.4418914558099303 1635.989372512980 +2103 0.2103 55.2784818885620410 1632.201972444840 +2104 0.2104 55.1154506603702146 1628.422591391670 +2105 0.2105 54.9527969702232753 1624.651211547090 +2106 0.2106 54.7905200188884507 1620.887815149420 +2107 0.2107 54.6286190089068953 1617.132384481650 +2108 0.2108 54.4670931445892492 1613.384901871230 +2109 0.2109 54.3059416320111907 1609.645349689960 +2110 0.2110 54.1451636790090021 1605.913710353870 +2111 0.2111 53.9847584951751571 1602.189966323080 +2112 0.2112 53.8247252918539161 1598.474100101690 +2113 0.2113 53.6650632821369484 1594.766094237660 +2114 0.2114 53.5057716808589348 1591.065931322630 +2115 0.2115 53.3468497045932111 1587.373593991830 +2116 0.2116 53.1882965716474203 1583.689064924010 +2117 0.2117 53.0301115020591638 1580.012326841190 +2118 0.2118 52.8722937175916741 1576.343362508650 +2119 0.2119 52.7148424417295018 1572.682154734740 +2120 0.2120 52.5577568996742244 1569.028686370760 +2121 0.2121 52.4010363183401395 1565.382940310900 +2122 0.2122 52.2446799263499955 1561.744899492000 +2123 0.2123 52.0886869540307202 1558.114546893550 +2124 0.2124 51.9330566334091657 1554.491865537500 +2125 0.2125 51.7777881982078867 1550.876838488120 +2126 0.2126 51.6228808838408852 1547.269448851930 +2127 0.2127 51.4683339274094109 1543.669679777559 +2128 0.2128 51.3141465676977475 1540.077514455640 +2129 0.2129 51.1603180451690349 1536.492936118620 +2130 0.2130 51.0068476019610699 1532.915928040730 +2131 0.2131 50.8537344818821424 1529.346473537810 +2132 0.2132 50.7009779304068928 1525.784555967220 +2133 0.2133 50.5485771946721485 1522.230158727680 +2134 0.2134 50.3965315234728024 1518.683265259210 +2135 0.2135 50.2448401672576921 1515.143859042960 +2136 0.2136 50.0935023781254856 1511.611923601110 +2137 0.2137 49.9425174098205886 1508.087442496770 +2138 0.2138 49.7918845177290592 1504.570399333830 +2139 0.2139 49.6416029588745218 1501.060777756860 +2140 0.2140 49.4916719919141244 1497.558561451030 +2141 0.2141 49.3420908771344742 1494.063734141910 +2142 0.2142 49.1928588764476089 1490.576279595410 +2143 0.2143 49.0439752533869537 1487.096181617720 +2144 0.2144 48.8954392731033138 1483.623424055030 +2145 0.2145 48.7472502023608811 1480.157990793590 +2146 0.2146 48.5994073095332269 1476.699865759530 +2147 0.2147 48.4519098645993154 1473.249032918700 +2148 0.2148 48.3047571391395465 1469.805476276610 +2149 0.2149 48.1579484063317977 1466.369179878320 +2150 0.2150 48.0114829409474666 1462.940127808310 +2151 0.2151 47.8653600193475341 1459.518304190340 +2152 0.2152 47.7195789194786428 1456.103693187420 +2153 0.2153 47.5741389208691956 1452.696279001590 +2154 0.2154 47.4290393046254195 1449.296045873910 +2155 0.2155 47.2842793534275074 1445.902978084300 +2156 0.2156 47.1398583515257243 1442.517059951409 +2157 0.2157 46.9957755847365277 1439.138275832550 +2158 0.2158 46.8520303404387235 1435.766610123570 +2159 0.2159 46.7086219075696079 1432.402047258730 +2160 0.2160 46.5655495766211374 1429.044571710610 +2161 0.2161 46.4228126396361063 1425.694167990030 +2162 0.2162 46.2804103902043096 1422.350820645870 +2163 0.2163 46.1383421234587630 1419.014514265030 +2164 0.2164 45.9966071360719013 1415.685233472250 +2165 0.2165 45.8552047262517846 1412.362962930120 +2166 0.2166 45.7141341937383388 1409.047687338840 +2167 0.2167 45.5733948397995832 1405.739391436210 +2168 0.2168 45.4329859672278999 1402.438059997470 +2169 0.2169 45.2929068803362682 1399.143677835210 +2170 0.2170 45.1531568849545408 1395.856229799290 +2171 0.2171 45.0137352884257425 1392.575700776680 +2172 0.2172 44.8746413996023392 1389.302075691400 +2173 0.2173 44.7358745288425439 1386.035339504440 +2174 0.2174 44.5974339880066424 1382.775477213560 +2175 0.2175 44.4593190904532989 1379.522473853270 +2176 0.2176 44.3215291510359037 1376.276314494700 +2177 0.2177 44.1840634860988928 1373.036984245530 +2178 0.2178 44.0469214134741236 1369.804468249810 +2179 0.2179 43.9101022524772375 1366.578751687940 +2180 0.2180 43.7736053239040146 1363.359819776480 +2181 0.2181 43.6374299500267853 1360.147657768170 +2182 0.2182 43.5015754545907924 1356.942250951690 +2183 0.2183 43.3660411628106246 1353.743584651690 +2184 0.2184 43.2308264013666133 1350.551644228590 +2185 0.2185 43.0959304984012590 1347.366415078520 +2186 0.2186 42.9613527835156717 1344.187882633210 +2187 0.2187 42.8270925877660176 1341.016032359920 +2188 0.2188 42.6931492436599598 1337.850849761300 +2189 0.2189 42.5595220851531266 1334.692320375330 +2190 0.2190 42.4262104476456017 1331.540429775150 +2191 0.2191 42.2932136679783923 1328.395163569060 +2192 0.2192 42.1605310844299197 1325.256507400350 +2193 0.2193 42.0281620367125441 1322.124446947230 +2194 0.2194 41.8961058659690480 1318.998967922740 +2195 0.2195 41.7643619147691822 1315.880056074600 +2196 0.2196 41.6329295271061923 1312.767697185190 +2197 0.2197 41.5018080483933645 1309.661877071410 +2198 0.2198 41.3709968254605656 1306.562581584590 +2199 0.2199 41.2404952065508184 1303.469796610370 +2200 0.2200 41.1103025413168695 1300.383508068660 +2201 0.2201 40.9804181808177574 1297.303701913520 +2202 0.2202 40.8508414775154307 1294.230364133010 +2203 0.2203 40.7215717852713226 1291.163480749180 +2204 0.2204 40.5926084593429692 1288.103037817930 +2205 0.2205 40.4639508563806274 1285.049021428940 +2206 0.2206 40.3355983344239064 1282.001417705530 +2207 0.2207 40.2075502528984003 1278.960212804620 +2208 0.2208 40.0798059726123412 1275.925392916600 +2209 0.2209 39.9523648557532454 1272.896944265270 +2210 0.2210 39.8252262658845950 1269.874853107700 +2211 0.2211 39.6983895679424990 1266.859105734210 +2212 0.2212 39.5718541282323812 1263.849688468180 +2213 0.2213 39.4456193144256702 1260.846587666050 +2214 0.2214 39.3196844955565084 1257.849789717161 +2215 0.2215 39.1940490420184631 1254.859281043730 +2216 0.2216 39.0687123255612434 1251.875048100720 +2217 0.2217 38.9436737192874247 1248.897077375690 +2218 0.2218 38.8189325976491943 1245.925355388850 +2219 0.2219 38.6944883364451115 1242.959868692830 +2220 0.2220 38.5703403128168389 1240.000603872670 +2221 0.2221 38.4464879052459167 1237.047547545710 +2222 0.2222 38.3229304935505581 1234.100686361479 +2223 0.2223 38.1996674588824021 1231.160007001660 +2224 0.2224 38.0766981837233232 1228.225496179940 +2225 0.2225 37.9540220518822267 1225.297140641950 +2226 0.2226 37.8316384484918729 1222.374927165190 +2227 0.2227 37.7095467600056651 1219.458842558920 +2228 0.2228 37.5877463741945164 1216.548873664090 +2229 0.2229 37.4662366801436519 1213.645007353211 +2230 0.2230 37.3450170682494758 1210.747230530340 +2231 0.2231 37.2240869302164157 1207.855530130930 +2232 0.2232 37.1034456590537829 1204.969893121779 +2233 0.2233 36.9830926490726526 1202.090306500890 +2234 0.2234 36.8630272958827305 1199.216757297490 +2235 0.2235 36.7432489963892621 1196.349232571840 +2236 0.2236 36.6237571487899132 1193.487719415200 +2237 0.2237 36.5045511525716648 1190.632204949740 +2238 0.2238 36.3856304085077582 1187.782676328450 +2239 0.2239 36.2669943186545822 1184.939120735030 +2240 0.2240 36.1486422863486396 1182.101525383860 +2241 0.2241 36.0305737162034561 1179.269877519880 +2242 0.2242 35.9127880141065390 1176.444164418510 +2243 0.2243 35.7952845872163365 1173.624373385579 +2244 0.2244 35.6780628439591965 1170.810491757210 +2245 0.2245 35.5611221940263462 1168.002506899780 +2246 0.2246 35.4444620483708661 1165.200406209810 +2247 0.2247 35.3280818192046837 1162.404177113870 +2248 0.2248 35.2119809199955611 1159.613807068580 +2249 0.2249 35.0961587654641107 1156.829283560390 +2250 0.2250 34.9806147715808109 1154.050594105600 +2251 0.2251 34.8653483555630146 1151.277726250260 +2252 0.2252 34.7503589358719935 1148.510667570090 +2253 0.2253 34.6356459322099681 1145.749405670350 +2254 0.2254 34.5212087655171587 1142.993928185840 +2255 0.2255 34.4070468579688296 1140.244222780760 +2256 0.2256 34.2931596329723618 1137.500277148630 +2257 0.2257 34.1795465151643185 1134.762079012280 +2258 0.2258 34.0662069304075175 1132.029616123670 +2259 0.2259 33.9531403057881391 1129.302876263850 +2260 0.2260 33.8403460696127993 1126.581847242970 +2261 0.2261 33.7278236514056502 1123.866516900020 +2262 0.2262 33.6155724819055024 1121.156873102930 +2263 0.2263 33.5035919930629404 1118.452903748370 +2264 0.2264 33.3918816180374378 1115.754596761720 +2265 0.2265 33.2804407911945006 1113.061940097020 +2266 0.2266 33.1692689481028111 1110.374921736830 +2267 0.2267 33.0583655255313573 1107.693529692190 +2268 0.2268 32.9477299614466190 1105.017752002540 +2269 0.2269 32.8373616950097116 1102.347576735650 +2270 0.2270 32.7272601665735507 1099.682991987500 +2271 0.2271 32.6174248176800603 1097.023985882260 +2272 0.2272 32.5078550910573369 1094.370546572190 +2273 0.2273 32.3985504306168508 1091.722662237560 +2274 0.2274 32.2895102814506458 1089.080321086580 +2275 0.2275 32.1807340898285545 1086.443511355300 +2276 0.2276 32.0722213031954126 1083.812221307600 +2277 0.2277 31.9639713701682808 1081.186439235030 +2278 0.2278 31.8559837405336879 1078.566153456809 +2279 0.2279 31.7482578652448630 1075.951352319700 +2280 0.2280 31.6407931964189792 1073.342024197960 +2281 0.2281 31.5335891873344174 1070.738157493251 +2282 0.2282 31.4266452924280237 1068.139740634600 +2283 0.2283 31.3199609672923813 1065.546762078270 +2284 0.2284 31.2135356686730816 1062.959210307740 +2285 0.2285 31.1073688544660136 1060.377073833610 +2286 0.2286 31.0014599837146569 1057.800341193500 +2287 0.2287 30.8958085166073815 1055.229000952020 +2288 0.2288 30.7904139144747475 1052.663041700690 +2289 0.2289 30.6852756397868198 1050.102452057880 +2290 0.2290 30.5803931561504960 1047.547220668630 +2291 0.2291 30.4757659283068243 1044.997336204780 +2292 0.2292 30.3713934221283495 1042.452787364710 +2293 0.2293 30.2672751046164450 1039.913562873360 +2294 0.2294 30.1634104438986697 1037.379651482140 +2295 0.2295 30.0597989092261209 1034.851041968870 +2296 0.2296 29.9564399709707914 1032.327723137691 +2297 0.2297 29.8533331006229581 1029.809683818990 +2298 0.2298 29.7504777707885388 1027.296912869380 +2299 0.2299 29.6478734551864918 1024.789399171560 +2300 0.2300 29.5455196286462005 1022.287131634270 +2301 0.2301 29.4434157671048737 1019.790099192260 +2302 0.2302 29.3415613476049515 1017.298290806190 +2303 0.2303 29.2399558482915154 1014.811695462510 +2304 0.2304 29.1385987484097164 1012.330302173490 +2305 0.2305 29.0374895283021885 1009.854099977090 +2306 0.2306 28.9366276694064872 1007.383077936910 +2307 0.2307 28.8360126542525386 1004.917225142080 +2308 0.2308 28.7356439664600707 1002.456530707280 +2309 0.2309 28.6355210907360771 1000.000983772580 +2310 0.2310 28.5356435128722765 997.550573503410 +2311 0.2311 28.4360107197425798 995.105289090520 +2312 0.2312 28.3366221993005603 992.665119749870 +2313 0.2313 28.2374774405769351 990.230054722600 +2314 0.2314 28.1385759336770604 987.800083274879 +2315 0.2315 28.0399171697784197 985.375194697970 +2316 0.2316 27.9415006411281155 982.955378308080 +2317 0.2317 27.8433258410403965 980.540623446280 +2318 0.2318 27.7453922638941570 978.130919478490 +2319 0.2319 27.6476994051304636 975.726255795390 +2320 0.2320 27.5502467612500759 973.326621812340 +2321 0.2321 27.4530338298109911 970.932006969360 +2322 0.2322 27.3560601094259752 968.542400730980 +2323 0.2323 27.2593250997601118 966.157792586280 +2324 0.2324 27.1628283015283607 963.778172048740 +2325 0.2325 27.0665692164931109 961.403528656240 +2326 0.2326 26.9705473474617534 959.033851970940 +2327 0.2327 26.8747621982842446 956.669131579230 +2328 0.2328 26.7792132738506972 954.309357091710 +2329 0.2329 26.6839000800889572 951.954518143060 +2330 0.2330 26.5888221239622027 949.604604392030 +2331 0.2331 26.4939789134665347 947.259605521330 +2332 0.2332 26.3993699576285863 944.919511237620 +2333 0.2333 26.3049947665031354 942.584311271400 +2334 0.2334 26.2108528511707171 940.253995376960 +2335 0.2335 26.1169437237352540 937.928553332320 +2336 0.2336 26.0232668973216796 935.607974939200 +2337 0.2337 25.9298218860735759 933.292250022880 +2338 0.2338 25.8366082051508208 930.981368432230 +2339 0.2339 25.7436253707272300 928.675320039570 +2340 0.2340 25.6508728999882187 926.374094740640 +2341 0.2341 25.5583503111284571 924.077682454570 +2342 0.2342 25.4660571233495396 921.786073123760 +2343 0.2343 25.3739928568576580 919.499256713850 +2344 0.2344 25.2821570328612815 917.217223213650 +2345 0.2345 25.1905491735688436 914.939962635100 +2346 0.2346 25.0991688021864299 912.667465013180 +2347 0.2347 25.0080154429154788 910.399720405870 +2348 0.2348 24.9170886209504800 908.136718894079 +2349 0.2349 24.8263878624766967 905.878450581580 +2350 0.2350 24.7359126946678707 903.624905594960 +2351 0.2351 24.6456626456839452 901.376074083570 +2352 0.2352 24.5556372446687945 899.131946219450 +2353 0.2353 24.4658360217479611 896.892512197250 +2354 0.2354 24.3762585080263854 894.657762234230 +2355 0.2355 24.2869042355861673 892.427686570130 +2356 0.2356 24.1977727374843035 890.202275467170 +2357 0.2357 24.1088635477504454 887.981519209960 +2358 0.2358 24.0201762013846754 885.765408105430 +2359 0.2359 23.9317102343552648 883.553932482811 +2360 0.2360 23.8434651835964466 881.347082693560 +2361 0.2361 23.7554405870062055 879.144849111251 +2362 0.2362 23.6676359834440611 876.947222131630 +2363 0.2363 23.5800509127288578 874.754192172440 +2364 0.2364 23.4926849156365627 872.565749673440 +2365 0.2365 23.4055375338980767 870.381885096300 +2366 0.2366 23.3186083101970318 868.202588924580 +2367 0.2367 23.2318967881676208 866.027851663670 +2368 0.2368 23.1454025123924048 863.857663840680 +2369 0.2369 23.0591250284001461 861.692016004461 +2370 0.2370 22.9730638826636486 859.530898725520 +2371 0.2371 22.8872186225975760 857.374302595900 +2372 0.2372 22.8015887965563202 855.222218229250 +2373 0.2373 22.7161739538318272 853.074636260631 +2374 0.2374 22.6309736446514655 850.931547346600 +2375 0.2375 22.5459874201758872 848.792942164990 +2376 0.2376 22.4612148324968857 846.658811415040 +2377 0.2377 22.3766554346352748 844.529145817200 +2378 0.2378 22.2923087805387610 842.403936113100 +2379 0.2379 22.2081744250798288 840.283173065560 +2380 0.2380 22.1242519240536275 838.166847458450 +2381 0.2381 22.0405408341758680 836.054950096720 +2382 0.2382 21.9570407130807190 833.947471806290 +2383 0.2383 21.8737511193187046 831.844403433980 +2384 0.2384 21.7906716123546289 829.745735847500 +2385 0.2385 21.7078017525654836 827.651459935400 +2386 0.2386 21.6251411012383663 825.561566606970 +2387 0.2387 21.5426892205684091 823.476046792200 +2388 0.2388 21.4604456736567109 821.394891441780 +2389 0.2389 21.3784100245082733 819.318091526970 +2390 0.2390 21.2965818380299439 817.245638039620 +2391 0.2391 21.2149606800283621 815.177521992010 +2392 0.2392 21.1335461172079135 813.113734416930 +2393 0.2393 21.0523377171686903 811.054266367530 +2394 0.2394 20.9713350484044483 808.999108917320 +2395 0.2395 20.8905376803005787 806.948253160090 +2396 0.2396 20.8099451831320827 804.901690209840 +2397 0.2397 20.7295571280615505 802.859411200790 +2398 0.2398 20.6493730871371461 800.821407287290 +2399 0.2399 20.5693926332905974 798.787669643710 +2400 0.2400 20.4896153403351846 796.758189464540 +2401 0.2401 20.4100407829637511 794.732957964150 +2402 0.2402 20.3306685367466962 792.711966376920 +2403 0.2403 20.2514981781299994 790.695205957040 +2404 0.2404 20.1725292844332209 788.682667978550 +2405 0.2405 20.0937614338475292 786.674343735270 +2406 0.2406 20.0151942054337297 784.670224540700 +2407 0.2407 19.9368271791202929 782.670301728050 +2408 0.2408 19.8586599357013824 780.674566650130 +2409 0.2409 19.7806920568349085 778.683010679330 +2410 0.2410 19.7029231250405665 776.695625207530 +2411 0.2411 19.6253527236978833 774.712401646120 +2412 0.2412 19.5479804370442842 772.733331425870 +2413 0.2413 19.4708058501731429 770.758405996950 +2414 0.2414 19.3938285490318556 768.787616828800 +2415 0.2415 19.3170481204199049 766.820955410200 +2416 0.2416 19.2404641519869415 764.858413249100 +2417 0.2417 19.1640762322308547 762.899981872610 +2418 0.2418 19.0878839504958755 760.945652827000 +2419 0.2419 19.0118868969706440 758.995417677600 +2420 0.2420 18.9360846626863264 757.049268008750 +2421 0.2421 18.8604768395146998 755.107195423770 +2422 0.2422 18.7850630201662661 753.169191544930 +2423 0.2423 18.7098427981883511 751.235248013340 +2424 0.2424 18.6348157679632358 749.305356488980 +2425 0.2425 18.5599815247062594 747.379508650560 +2426 0.2426 18.4853396644639538 745.457696195580 +2427 0.2427 18.4108897841121646 743.539910840190 +2428 0.2428 18.3366314813541962 741.626144319200 +2429 0.2429 18.2625643547189362 739.716388385990 +2430 0.2430 18.1886880035590117 737.810634812490 +2431 0.2431 18.1150020280489308 735.908875389150 +2432 0.2432 18.0415060291832319 734.011101924840 +2433 0.2433 17.9681996087746469 732.117306246830 +2434 0.2434 17.8950823694522647 730.227480200780 +2435 0.2435 17.8221539146596939 728.341615650610 +2436 0.2436 17.7494138486532371 726.459704478550 +2437 0.2437 17.6768617765000577 724.581738585020 +2438 0.2438 17.6044973040763750 722.707709888610 +2439 0.2439 17.5323200380656417 720.837610326040 +2440 0.2440 17.4603295859567353 718.971431852090 +2441 0.2441 17.3885255560421506 717.109166439620 +2442 0.2442 17.3169075574161972 715.250806079420 +2443 0.2443 17.2454751999732139 713.396342780230 +2444 0.2444 17.1742280944057661 711.545768568730 +2445 0.2445 17.1031658522028600 709.699075489380 +2446 0.2446 17.0322880856481653 707.856255604500 +2447 0.2447 16.9615944078182324 706.017300994150 +2448 0.2448 16.8910844325807190 704.182203756100 +2449 0.2449 16.8207577745926251 702.350956005770 +2450 0.2450 16.7506140492985232 700.523549876250 +2451 0.2451 16.6806528729287997 698.699977518190 +2452 0.2452 16.6108738624979040 696.880231099750 +2453 0.2453 16.5412766358025856 695.064302806620 +2454 0.2454 16.4718608114201608 693.252184841910 +2455 0.2455 16.4026260087067577 691.443869426150 +2456 0.2456 16.3335718477955893 689.639348797210 +2457 0.2457 16.2646979495952131 687.838615210280 +2458 0.2458 16.1960039357878074 686.041660937860 +2459 0.2459 16.1274894288274346 684.248478269600 +2460 0.2460 16.0591540519383322 682.459059512420 +2461 0.2461 15.9909974291131949 680.673396990310 +2462 0.2462 15.9230191851114586 678.891483044400 +2463 0.2463 15.8552189454575956 677.113310032860 +2464 0.2464 15.7875963364394085 675.338870330880 +2465 0.2465 15.7201509851063328 673.568156330620 +2466 0.2466 15.6528825192677452 671.801160441140 +2467 0.2467 15.5857905674912676 670.037875088410 +2468 0.2468 15.5188747591010845 668.278292715250 +2469 0.2469 15.4521347241762594 666.522405781250 +2470 0.2470 15.3855700935490578 664.770206762770 +2471 0.2471 15.3191804988032736 663.021688152900 +2472 0.2472 15.2529655722725614 661.276842461360 +2473 0.2473 15.1869249470387651 659.535662214560 +2474 0.2474 15.1210582569302634 657.798139955460 +2475 0.2475 15.0553651365203116 656.064268243560 +2476 0.2476 14.9898452211253890 654.334039654890 +2477 0.2477 14.9244981468035469 652.607446781950 +2478 0.2478 14.8593235503527676 650.884482233630 +2479 0.2479 14.7943210693093228 649.165138635250 +2480 0.2480 14.7294903419461392 647.449408628420 +2481 0.2481 14.6648310072711645 645.737284871080 +2482 0.2482 14.6003427050257386 644.028760037420 +2483 0.2483 14.5360250756829732 642.323826817880 +2484 0.2484 14.4718777604461284 640.622477919010 +2485 0.2485 14.4079004012469998 638.924706063560 +2486 0.2486 14.3440926407443037 637.230503990370 +2487 0.2487 14.2804541223220696 635.539864454300 +2488 0.2488 14.2169844900880413 633.852780226260 +2489 0.2489 14.1536833888720714 632.169244093140 +2490 0.2490 14.0905504642245276 630.489248857750 +2491 0.2491 14.0275853624146993 628.812787338820 +2492 0.2492 13.9647877304292134 627.139852370890 +2493 0.2493 13.9021572159704494 625.470436804380 +2494 0.2494 13.8396934674549588 623.804533505440 +2495 0.2495 13.7773961340118856 622.142135356010 +2496 0.2496 13.7152648654814016 620.483235253680 +2497 0.2497 13.6532993124131306 618.827826111730 +2498 0.2498 13.5914991260645923 617.175900859050 +2499 0.2499 13.5298639583996341 615.527452440120 +2500 0.2500 13.4683934620868797 613.882473814980 +2501 0.2501 13.4070872904981719 612.240957959160 +2502 0.2502 13.3459450977070322 610.602897863640 +2503 0.2503 13.2849665384871063 608.968286534880 +2504 0.2504 13.2241512683106279 607.337116994670 +2505 0.2505 13.1634989433468856 605.709382280190 +2506 0.2506 13.1030092204606774 604.085075443960 +2507 0.2507 13.0426817572107936 602.464189553710 +2508 0.2508 12.9825162118484858 600.846717692450 +2509 0.2509 12.9225122433159427 599.232652958410 +2510 0.2510 12.8626695112447749 597.621988464940 +2511 0.2511 12.8029876759545012 596.014717340550 +2512 0.2512 12.7434663984510337 594.410832728810 +2513 0.2513 12.6841053404251749 592.810327788370 +2514 0.2514 12.6249041642511131 591.213195692870 +2515 0.2515 12.5658625329849230 589.619429630940 +2516 0.2516 12.5069801103630684 588.029022806150 +2517 0.2517 12.4482565608009121 586.441968436980 +2518 0.2518 12.3896915493912250 584.858259756750 +2519 0.2519 12.3312847419027065 583.277890013630 +2520 0.2520 12.2730358047784947 581.700852470590 +2521 0.2521 12.2149444051346983 580.127140405340 +2522 0.2522 12.1570102107589140 578.556747110330 +2523 0.2523 12.0992328901087642 576.989665892650 +2524 0.2524 12.0416121123104265 575.425890074090 +2525 0.2525 11.9841475471571712 573.865412991020 +2526 0.2526 11.9268388651079000 572.308227994400 +2527 0.2527 11.8696857372856943 570.754328449710 +2528 0.2528 11.8126878354763605 569.203707736960 +2529 0.2529 11.7558448321269822 567.656359250610 +2530 0.2530 11.6991564003444743 566.112276399550 +2531 0.2531 11.6426222138941426 564.571452607090 +2532 0.2532 11.5862419471982445 563.033881310880 +2533 0.2533 11.5300152753345557 561.499555962900 +2534 0.2534 11.4739418740349404 559.968470029420 +2535 0.2535 11.4180214196839209 558.440616990970 +2536 0.2536 11.3622535893172572 556.915990342300 +2537 0.2537 11.3066380606205250 555.394583592350 +2538 0.2538 11.2511745119276974 553.876390264200 +2539 0.2539 11.1958626222197335 552.361403895070 +2540 0.2540 11.1407020711231688 550.849618036220 +2541 0.2541 11.0856925389087078 549.341026252990 +2542 0.2542 11.0308337064898225 547.835622124730 +2543 0.2543 10.9761252554213478 546.333399244780 +2544 0.2544 10.9215668678980897 544.834351220370 +2545 0.2545 10.8671582267534355 543.338471672720 +2546 0.2546 10.8128990154579583 541.845754236840 +2547 0.2547 10.7587889181180323 540.356192561670 +2548 0.2548 10.7048276194744538 538.869780309900 +2549 0.2549 10.6510148049010596 537.386511158000 +2550 0.2550 10.5973501604033498 535.906378796190 +2551 0.2551 10.5438333726171205 534.429376928410 +2552 0.2552 10.4904641288070870 532.955499272260 +2553 0.2553 10.4372421168655247 531.484739558970 +2554 0.2554 10.3841670253109069 530.017091533400 +2555 0.2555 10.3312385432865383 528.552548953980 +2556 0.2556 10.2784563605592059 527.091105592670 +2557 0.2557 10.2258201675178260 525.632755234930 +2558 0.2558 10.1733296551720933 524.177491679720 +2559 0.2559 10.1209845151511360 522.725308739430 +2560 0.2560 10.0687844397021724 521.276200239850 +2561 0.2561 10.0167291216891723 519.830160020160 +2562 0.2562 9.9648182545915205 518.387181932880 +2563 0.2563 9.9130515325026831 516.947259843850 +2564 0.2564 9.8614286501288824 515.510387632170 +2565 0.2565 9.8099493027877642 514.076559190200 +2566 0.2566 9.7586131864070786 512.645768423510 +2567 0.2567 9.7074199975233597 511.218009250870 +2568 0.2568 9.6563694332806076 509.793275604170 +2569 0.2569 9.6054611914289758 508.371561428450 +2570 0.2570 9.5546949703234620 506.952860681810 +2571 0.2571 9.5040704689226008 505.537167335420 +2572 0.2572 9.4535873867871558 504.124475373480 +2573 0.2573 9.4032454240788237 502.714778793160 +2574 0.2574 9.3530442815589367 501.308071604590 +2575 0.2575 9.3029836605871630 499.904347830880 +2576 0.2576 9.2530632631202199 498.503601507970 +2577 0.2577 9.2032827917105848 497.105826684720 +2578 0.2578 9.1536419495052090 495.711017422780 +2579 0.2579 9.1041404402442385 494.319167796630 +2580 0.2580 9.0547779682597298 492.930271893530 +2581 0.2581 9.0055542384743816 491.544323813450 +2582 0.2582 8.9564689564002542 490.161317669110 +2583 0.2583 8.9075218281375044 488.781247585900 +2584 0.2584 8.8587125603731174 487.404107701840 +2585 0.2585 8.8100408603796456 486.029892167580 +2586 0.2586 8.7615064360139474 484.658595146380 +2587 0.2587 8.7131089957159258 483.290210814040 +2588 0.2588 8.6648482485072797 481.924733358870 +2589 0.2589 8.6167239039902501 480.562156981720 +2590 0.2590 8.5687356723463708 479.202475895880 +2591 0.2591 8.5208832643352235 477.845684327070 +2592 0.2592 8.4731663912931978 476.491776513440 +2593 0.2593 8.4255847651322497 475.140746705530 +2594 0.2594 8.3781380983386633 473.792589166190 +2595 0.2595 8.3308261039718232 472.447298170610 +2596 0.2596 8.2836484956629786 471.104868006270 +2597 0.2597 8.2366049876140206 469.765292972900 +2598 0.2598 8.1896952945962518 468.428567382470 +2599 0.2599 8.1429191319491707 467.094685559140 +2600 0.2600 8.0962762155792500 465.763641839260 +2601 0.2601 8.0497662619587214 464.435430571310 +2602 0.2602 8.0033889881243621 463.110046115870 +2603 0.2603 7.9571441116762873 461.787482845620 +2604 0.2604 7.9110313507767414 460.467735145300 +2605 0.2605 7.8650504241488948 459.150797411640 +2606 0.2606 7.8192010510756411 457.836664053430 +2607 0.2607 7.7734829513984005 456.525329491380 +2608 0.2608 7.7278958455159250 455.216788158130 +2609 0.2609 7.6824394543831049 453.911034498270 +2610 0.2610 7.6371134995097787 452.608062968260 +2611 0.2611 7.5919177029595462 451.307868036390 +2612 0.2612 7.5468517873485865 450.010444182810 +2613 0.2613 7.5019154758444744 448.715785899430 +2614 0.2614 7.4571084921650046 447.423887689970 +2615 0.2615 7.4124305605770129 446.134744069870 +2616 0.2616 7.3678814058952060 444.848349566270 +2617 0.2617 7.3234607534809921 443.564698718010 +2618 0.2618 7.2791683292413119 442.283786075590 +2619 0.2619 7.2350038596274757 441.005606201140 +2620 0.2620 7.1909670716340006 439.730153668360 +2621 0.2621 7.1470576927974534 438.457423062580 +2622 0.2622 7.1032754511952936 437.187408980610 +2623 0.2623 7.0596200754447214 435.920106030840 +2624 0.2624 7.0160912947015239 434.655508833110 +2625 0.2625 6.9726888386589305 433.393612018750 +2626 0.2626 6.9294124375464685 432.134410230490 +2627 0.2627 6.8862618221288185 430.877898122510 +2628 0.2628 6.8432367237046767 429.624070360330 +2629 0.2629 6.8003368741056160 428.372921620880 +2630 0.2630 6.7575620056949548 427.124446592350 +2631 0.2631 6.7149118513666224 425.878639974300 +2632 0.2632 6.6723861445440322 424.635496477510 +2633 0.2633 6.6299846191789555 423.395010824030 +2634 0.2634 6.5877070097503978 422.157177747120 +2635 0.2635 6.5455530512634796 420.921991991250 +2636 0.2636 6.5035224792483151 419.689448312050 +2637 0.2637 6.4616150297588995 418.459541476260 +2638 0.2638 6.4198304393719967 417.232266261800 +2639 0.2639 6.3781684451860263 416.007617457610 +2640 0.2640 6.3366287848199585 414.785589863740 +2641 0.2641 6.2952111964122093 413.566178291250 +2642 0.2642 6.2539154186195374 412.349377562190 +2643 0.2643 6.2127411906159455 411.135182509650 +2644 0.2644 6.1716882520915819 409.923587977630 +2645 0.2645 6.1307563432516474 408.714588821060 +2646 0.2646 6.0899452048153044 407.508179905800 +2647 0.2647 6.0492545780145850 406.304356108590 +2648 0.2648 6.0086842045933055 405.103112316990 +2649 0.2649 5.9682338268059842 403.904443429430 +2650 0.2650 5.9279031874167574 402.708344355100 +2651 0.2651 5.8876920296983020 401.514810014000 +2652 0.2652 5.8476000974307585 400.323835336870 +2653 0.2653 5.8076271349006570 399.135415265160 +2654 0.2654 5.7677728868998468 397.949544751050 +2655 0.2655 5.7280370987244256 396.766218757370 +2656 0.2656 5.6884195161736759 395.585432257620 +2657 0.2657 5.6489198855490006 394.407180235890 +2658 0.2658 5.6095379536528602 393.231457686910 +2659 0.2659 5.5702734677877164 392.058259615970 +2660 0.2660 5.5311261757549737 390.887581038890 +2661 0.2661 5.4920958258539265 389.719416982050 +2662 0.2662 5.4531821668807083 388.553762482310 +2663 0.2663 5.4143849481272435 387.390612586990 +2664 0.2664 5.3757039193801992 386.229962353900 +2665 0.2665 5.3371388309199421 385.071806851240 +2666 0.2666 5.2986894335194989 383.916141157630 +2667 0.2667 5.2603554784435138 382.762960362070 +2668 0.2668 5.2221367174472162 381.612259563890 +2669 0.2669 5.1840329027753835 380.464033872760 +2670 0.2670 5.1460437871613118 379.318278408680 +2671 0.2671 5.1081691238257836 378.174988301890 +2672 0.2672 5.0704086664760446 377.034158692890 +2673 0.2673 5.0327621693047773 375.895784732450 +2674 0.2674 4.9952293869890800 374.759861581500 +2675 0.2675 4.9578100746894451 373.626384411190 +2676 0.2676 4.9205039880487460 372.495348402800 +2677 0.2677 4.8833108831912169 371.366748747780 +2678 0.2678 4.8462305167214454 370.240580647650 +2679 0.2679 4.8092626457233605 369.116839314050 +2680 0.2680 4.7724070277592245 367.995519968670 +2681 0.2681 4.7356634208686277 366.876617843270 +2682 0.2682 4.6990315835674865 365.760128179560 +2683 0.2683 4.6625112748470423 364.646046229320 +2684 0.2684 4.6261022541728627 363.534367254270 +2685 0.2685 4.5898042814838460 362.425086526060 +2686 0.2686 4.5536171171912292 361.318199326280 +2687 0.2687 4.5175405221775939 360.213700946430 +2688 0.2688 4.4815742577958781 359.111586687890 +2689 0.2689 4.4457180858683909 358.011851861850 +2690 0.2690 4.4099717686858284 356.914491789400 +2691 0.2691 4.3743350690062890 355.819501801390 +2692 0.2692 4.3388077500542961 354.726877238470 +2693 0.2693 4.3033895755198195 353.636613451060 +2694 0.2694 4.2680803095573019 352.548705799300 +2695 0.2695 4.2328797167846828 351.463149653080 +2696 0.2696 4.1977875622824312 350.379940391950 +2697 0.2697 4.1628036115925768 349.299073405140 +2698 0.2698 4.1279276307177417 348.220544091570 +2699 0.2699 4.0931593861201776 347.144347859720 +2700 0.2700 4.0584986447208049 346.070480127730 +2701 0.2701 4.0239451738982535 344.998936323290 +2702 0.2702 3.9894987414879051 343.929711883680 +2703 0.2703 3.9551591157809360 342.862802255700 +2704 0.2704 3.9209260655233686 341.798202895650 +2705 0.2705 3.8867993599151189 340.735909269340 +2706 0.2706 3.8527787686090482 339.675916852070 +2707 0.2707 3.8188640617100167 338.618221128560 +2708 0.2708 3.7850550097739406 337.562817592960 +2709 0.2709 3.7513513838068500 336.509701748850 +2710 0.2710 3.7177529552639488 335.458869109170 +2711 0.2711 3.6842594960486794 334.410315196220 +2712 0.2712 3.6508707785117842 333.364035541680 +2713 0.2713 3.6175865754503760 332.320025686480 +2714 0.2714 3.5844066601070055 331.278281180930 +2715 0.2715 3.5513308061687319 330.238797584540 +2716 0.2716 3.5183587877661990 329.201570466120 +2717 0.2717 3.4854903794727079 328.166595403700 +2718 0.2718 3.4527253563032980 327.133867984500 +2719 0.2719 3.4200634937138239 326.103383804980 +2720 0.2720 3.3875045676000388 325.075138470720 +2721 0.2721 3.3550483542966791 324.049127596470 +2722 0.2722 3.3226946305765512 323.025346806090 +2723 0.2723 3.2904431736496176 322.003791732580 +2724 0.2724 3.2582937611620890 320.984458017990 +2725 0.2725 3.2262461711955175 319.967341313440 +2726 0.2726 3.1943001822658905 318.952437279100 +2727 0.2727 3.1624555733227275 317.939741584160 +2728 0.2728 3.1307121237481792 316.929249906810 +2729 0.2729 3.0990696133561277 315.920957934220 +2730 0.2730 3.0675278223912912 314.914861362510 +2731 0.2731 3.0360865315283285 313.910955896740 +2732 0.2732 3.0047455218709467 312.909237250900 +2733 0.2733 2.9735045749510074 311.909701147890 +2734 0.2734 2.9423634727276413 310.912343319430 +2735 0.2735 2.9113219975863620 309.917159506160 +2736 0.2736 2.8803799323381787 308.924145457510 +2737 0.2737 2.8495370602187151 307.933296931760 +2738 0.2738 2.8187931648873286 306.944609695970 +2739 0.2739 2.7881480304262327 305.958079525950 +2740 0.2740 2.7576014413396197 304.973702206310 +2741 0.2741 2.7271531825527853 303.991473530380 +2742 0.2742 2.6968030394112574 303.011389300180 +2743 0.2743 2.6665507976799261 302.033445326450 +2744 0.2744 2.6363962435421739 301.057637428590 +2745 0.2745 2.6063391635990110 300.083961434670 +2746 0.2746 2.5763793448682084 299.112413181380 +2747 0.2747 2.5465165747834377 298.142988514030 +2748 0.2748 2.5167506411934095 297.175683286530 +2749 0.2749 2.4870813323610150 296.210493361360 +2750 0.2750 2.4575084369624691 295.247414609560 +2751 0.2751 2.4280317440864563 294.286442910700 +2752 0.2752 2.3986510432332784 293.327574152860 +2753 0.2753 2.3693661243140034 292.370804232640 +2754 0.2754 2.3401767776496163 291.416129055100 +2755 0.2755 2.3110827939701735 290.463544533760 +2756 0.2756 2.2820839644139568 289.513046590570 +2757 0.2757 2.2531800805266320 288.564631155930 +2758 0.2758 2.2243709342604054 287.618294168600 +2759 0.2759 2.1956563179731865 286.674031575780 +2760 0.2760 2.1670360244277509 285.731839332930 +2761 0.2761 2.1385098467909058 284.791713403970 +2762 0.2762 2.1100775786326547 283.853649761050 +2763 0.2763 2.0817390139253673 282.917644384700 +2764 0.2764 2.0534939470429490 281.983693263670 +2765 0.2765 2.0253421727600149 281.051792395010 +2766 0.2766 1.9972834862510631 280.121937784030 +2767 0.2767 1.9693176830896497 279.194125444240 +2768 0.2768 1.9414445592475693 278.268351397370 +2769 0.2769 1.9136639110940332 277.344611673350 +2770 0.2770 1.8859755353948522 276.422902310270 +2771 0.2771 1.8583792293116197 275.503219354380 +2772 0.2772 1.8308747904008962 274.585558860090 +2773 0.2773 1.8034620166133981 273.669916889870 +2774 0.2774 1.7761407062931875 272.756289514340 +2775 0.2775 1.7489106581768621 271.844672812170 +2776 0.2776 1.7217716713927476 270.935062870120 +2777 0.2777 1.6947235454600926 270.027455782980 +2778 0.2778 1.6677660802882672 269.121847653530 +2779 0.2779 1.6408990761759596 268.218234592620 +2780 0.2780 1.6141223338103761 267.316612719050 +2781 0.2781 1.5874356542664436 266.416978159600 +2782 0.2782 1.5608388390060151 265.519327048970 +2783 0.2783 1.5343316898770731 264.623655529870 +2784 0.2784 1.5079140091129366 263.729959752860 +2785 0.2785 1.4815855993314726 262.838235876420 +2786 0.2786 1.4553462635343071 261.948480066890 +2787 0.2787 1.4291958051060361 261.060688498530 +2788 0.2788 1.4031340278134405 260.174857353380 +2789 0.2789 1.3771607358047051 259.290982821330 +2790 0.2790 1.3512757336086332 258.409061100110 +2791 0.2791 1.3254788261338686 257.529088395180 +2792 0.2792 1.2997698186681181 256.651060919830 +2793 0.2793 1.2741485168773732 255.774974895070 +2794 0.2794 1.2486147268051362 254.900826549670 +2795 0.2795 1.2231682548716467 254.028612120120 +2796 0.2796 1.1978089078731111 253.158327850590 +2797 0.2797 1.1725364929809337 252.289969992960 +2798 0.2798 1.1473508177409466 251.423534806780 +2799 0.2799 1.1222516900726460 250.559018559230 +2800 0.2800 1.0972389182684275 249.696417525140 +2801 0.2801 1.0723123109928225 248.835727986960 +2802 0.2802 1.0474716772817376 247.976946234740 +2803 0.2803 1.0227168265416966 247.120068566080 +2804 0.2804 0.9980475685490831 246.265091286190 +2805 0.2805 0.9734637134493825 245.412010707820 +2806 0.2806 0.9489650717564311 244.560823151210 +2807 0.2807 0.9245514543516621 243.711524944170 +2808 0.2808 0.9002226724833541 242.864112421990 +2809 0.2809 0.8759785377658841 242.018581927410 +2810 0.2810 0.8518188621789801 241.174929810670 +2811 0.2811 0.8277434580669750 240.333152429430 +2812 0.2812 0.8037521381380630 239.493246148810 +2813 0.2813 0.7798447154635565 238.655207341320 +2814 0.2814 0.7560210034771470 237.819032386870 +2815 0.2815 0.7322808159741655 236.984717672760 +2816 0.2816 0.7086239671108455 236.152259593640 +2817 0.2817 0.6850502714035875 235.321654551520 +2818 0.2818 0.6615595437282250 234.492898955730 +2819 0.2819 0.6381515993192930 233.665989222910 +2820 0.2820 0.6148262537692974 232.840921777000 +2821 0.2821 0.5915833230279854 232.017693049240 +2822 0.2822 0.5684226234016170 231.196299478130 +2823 0.2823 0.5453439715522415 230.376737509380 +2824 0.2824 0.5223471844969739 229.559003595970 +2825 0.2825 0.4994320796072704 228.743094198100 +2826 0.2826 0.4765984746082089 227.929005783130 +2827 0.2827 0.4538461875777699 227.116734825650 +2828 0.2828 0.4311750369461189 226.306277807370 +2829 0.2829 0.4085848414948899 225.497631217210 +2830 0.2830 0.3860754203564709 224.690791551170 +2831 0.2831 0.3636465930132919 223.885755312410 +2832 0.2832 0.3412981792971144 223.082519011140 +2833 0.2833 0.3190299993883209 222.281079164730 +2834 0.2834 0.2968418738152064 221.481432297560 +2835 0.2835 0.2747336234532739 220.683574941090 +2836 0.2836 0.2527050695245274 219.887503633840 +2837 0.2837 0.2307560335967704 219.093214921300 +2838 0.2838 0.2088863375829039 218.300705356030 +2839 0.2839 0.1870958037402259 217.509971497530 +2840 0.2840 0.1653842546697334 216.721009912320 +2841 0.2841 0.1437515133154249 215.933817173850 +2842 0.2842 0.1221974029636059 215.148389862530 +2843 0.2843 0.1007217472421934 214.364724565720 +2844 0.2844 0.0793243701200249 213.582817877650 +2845 0.2845 0.0580050959061689 212.802666399470 +2846 0.2846 0.0367637492492339 212.024266739230 +2847 0.2847 0.0156001551366809 211.247615511830 +2848 0.2848 -0.0054858611058626 210.472709339040 +2849 0.2849 -0.0264944738152871 209.699544849450 +2850 0.2850 -0.0474258569916836 208.928118678480 +2851 0.2851 -0.0682801842990256 208.158427468360 +2852 0.2852 -0.0890576290658491 207.390467868110 +2853 0.2853 -0.1097583642859311 206.624236533530 +2854 0.2854 -0.1303825626189666 205.859730127180 +2855 0.2855 -0.1509303963912441 205.096945318370 +2856 0.2856 -0.1714020375963201 204.335878783150 +2857 0.2857 -0.1917976578956906 203.576527204260 +2858 0.2858 -0.2121174286194616 202.818887271160 +2859 0.2859 -0.2323615207670207 202.062955680020 +2860 0.2860 -0.2525301050077037 201.308729133640 +2861 0.2861 -0.2726233516814607 200.556204341500 +2862 0.2862 -0.2926414307995222 199.805378019730 +2863 0.2863 -0.3125845120450627 199.056246891080 +2864 0.2864 -0.3324527647738617 198.308807684900 +2865 0.2865 -0.3522463580149652 197.563057137170 +2866 0.2866 -0.3719654604713447 196.818991990420 +2867 0.2867 -0.3916102405205542 196.076608993770 +2868 0.2868 -0.4111808662153872 195.335904902890 +2869 0.2869 -0.4306775052845312 194.596876479990 +2870 0.2870 -0.4501003251332217 193.859520493820 +2871 0.2871 -0.4694494928438937 193.123833719620 +2872 0.2872 -0.4887251751768317 192.389812939140 +2873 0.2873 -0.5079275385708182 191.657454940590 +2874 0.2874 -0.5270567491437816 190.926756518680 +2875 0.2875 -0.5461129726934446 190.197714474580 +2876 0.2876 -0.5650963746979656 189.470325615840 +2877 0.2877 -0.5840071203165831 188.744586756510 +2878 0.2878 -0.6028453743902591 188.020494717010 +2879 0.2879 -0.6216113014423176 187.298046324160 +2880 0.2880 -0.6403050656790841 186.577238411170 +2881 0.2881 -0.6589268309905236 185.858067817620 +2882 0.2882 -0.6774767609508762 185.140531389430 +2883 0.2883 -0.6959550188192917 184.424625978880 +2884 0.2884 -0.7143617675404647 183.710348444580 +2885 0.2885 -0.7326971697452647 182.997695651420 +2886 0.2886 -0.7509613877513667 182.286664470620 +2887 0.2887 -0.7691545835638822 181.577251779690 +2888 0.2888 -0.7872769188759863 180.869454462390 +2889 0.2889 -0.8053285550695418 180.163269408720 +2890 0.2890 -0.8233096532157268 179.458693514980 +2891 0.2891 -0.8412203740756588 178.755723683660 +2892 0.2892 -0.8590608781010147 178.054356823460 +2893 0.2893 -0.8768313254346527 177.354589849300 +2894 0.2894 -0.8945318759112327 176.656419682300 +2895 0.2895 -0.9121626890578337 175.959843249720 +2896 0.2896 -0.9297239240945707 175.264857485020 +2897 0.2897 -0.9472157399352102 174.571459327770 +2898 0.2898 -0.9646382951877848 173.879645723720 +2899 0.2899 -0.9819917481552047 173.189413624680 +2900 0.2900 -0.9992762568358702 172.500759988630 +2901 0.2901 -1.0164919789242817 171.813681779600 +2902 0.2902 -1.0336390718116477 171.128175967720 +2903 0.2903 -1.0507176925864932 170.444239529190 +2904 0.2904 -1.0677279980352652 169.761869446250 +2905 0.2905 -1.0846701446429377 169.081062707200 +2906 0.2906 -1.1015442885936146 168.401816306340 +2907 0.2907 -1.1183505857711322 167.724127244010 +2908 0.2908 -1.1350891917596602 167.047992526550 +2909 0.2909 -1.1517602618442997 166.373409166240 +2910 0.2910 -1.1683639510116828 165.700374181420 +2911 0.2911 -1.1849004139505703 165.028884596330 +2912 0.2912 -1.2013698050524444 164.358937441150 +2913 0.2913 -1.2177722784121043 163.690529752050 +2914 0.2914 -1.2341079878282608 163.023658571080 +2915 0.2915 -1.2503770868041253 162.358320946210 +2916 0.2916 -1.2665797285480014 161.694513931310 +2917 0.2917 -1.2827160659738734 161.032234586130 +2918 0.2918 -1.2987862517019944 160.371479976290 +2919 0.2919 -1.3147904380594719 159.712247173260 +2920 0.2920 -1.3307287770808549 159.054533254400 +2921 0.2921 -1.3466014205087165 158.398335302830 +2922 0.2922 -1.3624085197942351 157.743650407540 +2923 0.2923 -1.3781502260977780 157.090475663320 +2924 0.2924 -1.3938266902894816 156.438808170750 +2925 0.2925 -1.4094380629498280 155.788645036180 +2926 0.2926 -1.4249844943702239 155.139983371740 +2927 0.2927 -1.4404661345535770 154.492820295320 +2928 0.2928 -1.4558831332148705 153.847152930550 +2929 0.2929 -1.4712356397817381 153.202978406800 +2930 0.2930 -1.4865238033950336 152.560293859110 +2931 0.2931 -1.5017477729094051 151.919096428320 +2932 0.2932 -1.5169076968938646 151.279383260870 +2933 0.2933 -1.5320037236323547 150.641151508930 +2934 0.2934 -1.5470360011243187 150.004398330350 +2935 0.2935 -1.5620046770852647 149.369120888570 +2936 0.2936 -1.5769098989473311 148.735316352760 +2937 0.2937 -1.5917518138598532 148.102981897680 +2938 0.2938 -1.6065305686899232 147.472114703720 +2939 0.2939 -1.6212463100229513 146.842711956840 +2940 0.2940 -1.6358991841632253 146.214770848640 +2941 0.2941 -1.6504893371344718 145.588288576290 +2942 0.2942 -1.6650169146804132 144.963262342540 +2943 0.2943 -1.6794820622653241 144.339689355680 +2944 0.2944 -1.6938849250745862 143.717566829560 +2945 0.2945 -1.7082256480152422 143.096891983560 +2946 0.2946 -1.7225043757165492 142.477662042580 +2947 0.2947 -1.7367212525305307 141.859874237050 +2948 0.2948 -1.7508764225325257 141.243525802850 +2949 0.2949 -1.7649700295217392 140.628613981420 +2950 0.2950 -1.7790022170217912 140.015136019620 +2951 0.2951 -1.7929731282812618 139.403089169790 +2952 0.2952 -1.8068829062742369 138.792470689710 +2953 0.2953 -1.8207316937008533 138.183277842620 +2954 0.2954 -1.8345196329878437 137.575507897190 +2955 0.2955 -1.8482468662890768 136.969158127470 +2956 0.2956 -1.8619135354860983 136.364225812960 +2957 0.2957 -1.8755197821886718 135.760708238510 +2958 0.2958 -1.8890657477353159 135.158602694370 +2959 0.2959 -1.9025515731938438 134.557906476190 +2960 0.2960 -1.9159773993618998 133.958616884930 +2961 0.2961 -1.9293433667674917 133.360731226910 +2962 0.2962 -1.9426496156695268 132.764246813790 +2963 0.2963 -1.9558962860583449 132.169160962570 +2964 0.2964 -1.9690835176562484 131.575470995500 +2965 0.2965 -1.9822114499180350 130.983174240230 +2966 0.2966 -1.9952802220315264 130.392268029600 +2967 0.2967 -2.0082899729180954 129.802749701780 +2968 0.2968 -2.0212408412331939 129.214616600190 +2969 0.2969 -2.0341329653668798 128.627866073530 +2970 0.2970 -2.0469664834443408 128.042495475690 +2971 0.2971 -2.0597415333264180 127.458502165850 +2972 0.2972 -2.0724582526101294 126.875883508380 +2973 0.2973 -2.0851167786291902 126.294636872840 +2974 0.2974 -2.0977172484545337 125.714759634030 +2975 0.2975 -2.1102597988948313 125.136249171920 +2976 0.2976 -2.1227445664970093 124.559102871640 +2977 0.2977 -2.1351716875467663 123.983318123500 +2978 0.2978 -2.1475412980690898 123.408892322970 +2979 0.2979 -2.1598535338287692 122.835822870620 +2980 0.2980 -2.1721085303309118 122.264107172230 +2981 0.2981 -2.1843064228214546 121.693742638630 +2982 0.2982 -2.1964473462876750 121.124726685780 +2983 0.2983 -2.2085314354587013 120.557056734750 +2984 0.2984 -2.2205588248060222 119.990730211670 +2985 0.2985 -2.2325296485439945 119.425744547780 +2986 0.2986 -2.2444440406303516 118.862097179360 +2987 0.2987 -2.2563021347667078 118.299785547760 +2988 0.2988 -2.2681040643990635 117.738807099350 +2989 0.2989 -2.2798499627183095 117.179159285570 +2990 0.2990 -2.2915399626607305 116.620839562850 +2991 0.2991 -2.3031741969085053 116.063845392650 +2992 0.2992 -2.3147527978902080 115.508174241400 +2993 0.2993 -2.3262758977813061 114.953823580560 +2994 0.2994 -2.3377436285046618 114.400790886550 +2995 0.2995 -2.3491561217310264 113.849073640740 +2996 0.2996 -2.3605135088795386 113.298669329500 +2997 0.2997 -2.3718159211182197 112.749575444120 +2998 0.2998 -2.3830634893644662 112.201789480810 +2999 0.2999 -2.3942563442855436 111.655308940740 +3000 0.3000 -2.4053946162990791 111.110131329970 +3001 0.3001 -2.4164784355735520 110.566254159490 +3002 0.3002 -2.4275079320287842 110.023674945150 +3003 0.3003 -2.4384832353364274 109.482391207710 +3004 0.3004 -2.4494044749204531 108.942400472800 +3005 0.3005 -2.4602717799576377 108.403700270890 +3006 0.3006 -2.4710852793780491 107.866288137340 +3007 0.3007 -2.4818451018655323 107.330161612320 +3008 0.3008 -2.4925513758581910 106.795318240850 +3009 0.3009 -2.5032042295488721 106.261755572770 +3010 0.3010 -2.5138037908856465 105.729471162720 +3011 0.3011 -2.5243501875722894 105.198462570140 +3012 0.3012 -2.5348435470687605 104.668727359280 +3013 0.3013 -2.5452839965916816 104.140263099140 +3014 0.3014 -2.5556716631148153 103.613067363530 +3015 0.3015 -2.5660066733695408 103.087137730980 +3016 0.3016 -2.5762891538453294 102.562471784790 +3017 0.3017 -2.5865192307902194 102.039067113010 +3018 0.3018 -2.5966970302112888 101.516921308380 +3019 0.3019 -2.6068226778751282 100.996031968410 +3020 0.3020 -2.6168962993083129 100.476396695280 +3021 0.3021 -2.6269180197978712 99.958013095890 +3022 0.3022 -2.6368879643917569 99.440878781820 +3023 0.3023 -2.6468062578993155 98.924991369350 +3024 0.3024 -2.6566730248917518 98.410348479380 +3025 0.3025 -2.6664883897025971 97.896947737520 +3026 0.3026 -2.6762524764281737 97.384786774010 +3027 0.3027 -2.6859654089280607 96.873863223730 +3028 0.3028 -2.6956273108255568 96.364174726190 +3029 0.3029 -2.7052383055081419 95.855718925510 +3030 0.3030 -2.7147985161279395 95.348493470440 +3031 0.3031 -2.7243080656021781 94.842496014330 +3032 0.3032 -2.7337670766136482 94.337724215070 +3033 0.3033 -2.7431756716111626 93.834175735220 +3034 0.3034 -2.7525339728100162 93.331848241850 +3035 0.3035 -2.7618421021924373 92.830739406570 +3036 0.3036 -2.7711001815080456 92.330846905600 +3037 0.3037 -2.7803083322743101 91.832168419690 +3038 0.3038 -2.7894666757769984 91.334701634080 +3039 0.3039 -2.7985753330706320 90.838444238590 +3040 0.3040 -2.8076344249789371 90.343393927510 +3041 0.3041 -2.8166440720952943 89.849548399630 +3042 0.3042 -2.8256043947831904 89.356905358290 +3043 0.3043 -2.8345155131766675 88.865462511250 +3044 0.3044 -2.8433775471807690 88.375217570780 +3045 0.3045 -2.8521906164719879 87.886168253600 +3046 0.3046 -2.8609548404987133 87.398312280910 +3047 0.3047 -2.8696703384816749 86.911647378320 +3048 0.3048 -2.8783372294143863 86.426171275910 +3049 0.3049 -2.8869556320635898 85.941881708160 +3050 0.3050 -2.8955256649696985 85.458776414010 +3051 0.3051 -2.9040474464472363 84.976853136750 +3052 0.3052 -2.9125210945852800 84.496109624120 +3053 0.3053 -2.9209467272478968 84.016543628220 +3054 0.3054 -2.9293244620745855 83.538152905550 +3055 0.3055 -2.9376544164807119 83.060935216980 +3056 0.3056 -2.9459367076579475 82.584888327730 +3057 0.3057 -2.9541714525747031 82.110010007380 +3058 0.3058 -2.9623587679765646 81.636298029850 +3059 0.3059 -2.9704987703867283 81.163750173420 +3060 0.3060 -2.9785915761064321 80.692364220660 +3061 0.3061 -2.9866373012153886 80.222137958470 +3062 0.3062 -2.9946360615722161 79.753069178080 +3063 0.3063 -3.0025879728148688 79.285155674970 +3064 0.3064 -3.0104931503610652 78.818395248960 +3065 0.3065 -3.0183517094087198 78.352785704130 +3066 0.3066 -3.0261637649363662 77.888324848800 +3067 0.3067 -3.0339294317035872 77.425010495620 +3068 0.3068 -3.0416488242514403 76.962840461440 +3069 0.3069 -3.0493220569028812 76.501812567380 +3070 0.3070 -3.0569492437631887 76.041924638770 +3071 0.3071 -3.0645304987203872 75.583174505200 +3072 0.3072 -3.0720659354456692 75.125560000440 +3073 0.3073 -3.0795556673938163 74.669078962500 +3074 0.3074 -3.0869998078036209 74.213729233590 +3075 0.3075 -3.0943984696983042 73.759508660080 +3076 0.3076 -3.1017517658859366 73.306415092570 +3077 0.3077 -3.1090598089598540 72.854446385780 +3078 0.3078 -3.1163227112990746 72.403600398630 +3079 0.3079 -3.1235405850687159 71.953874994200 +3080 0.3080 -3.1307135422204104 71.505268039690 +3081 0.3081 -3.1378416944927179 71.057777406460 +3082 0.3082 -3.1449251534115406 70.611400969990 +3083 0.3083 -3.1519640302905341 70.166136609880 +3084 0.3084 -3.1589584362315213 69.721982209860 +3085 0.3085 -3.1659084821249013 69.278935657740 +3086 0.3086 -3.1728142786500606 68.836994845450 +3087 0.3087 -3.1796759362757818 68.396157668970 +3088 0.3088 -3.1864935652606499 67.956422028390 +3089 0.3089 -3.1932672756534632 67.517785827880 +3090 0.3090 -3.1999971772936386 67.080246975630 +3091 0.3091 -3.2066833798116168 66.643803383930 +3092 0.3092 -3.2133259926292657 66.208452969050 +3093 0.3093 -3.2199251249602860 65.774193651360 +3094 0.3094 -3.2264808858106160 65.341023355240 +3095 0.3095 -3.2329933839788310 64.908940009060 +3096 0.3096 -3.2394627280565453 64.477941545230 +3097 0.3097 -3.2458890264288143 64.048025900150 +3098 0.3098 -3.2522723872745334 63.619191014230 +3099 0.3099 -3.2586129185668362 63.191434831830 +3100 0.3100 -3.2649107280734939 62.764755301320 +3101 0.3101 -3.2711659233573109 62.339150375020 +3102 0.3102 -3.2773786117765238 61.914618009240 +3103 0.3103 -3.2835489004851954 61.491156164190 +3104 0.3104 -3.2896768964336083 61.068762804070 +3105 0.3105 -3.2957627063686621 60.647435897010 +3106 0.3106 -3.3018064368342634 60.227173415020 +3107 0.3107 -3.3078081941717192 59.807973334100 +3108 0.3108 -3.3137680845201292 59.389833634100 +3109 0.3109 -3.3196862138167758 58.972752298830 +3110 0.3110 -3.3255626877975137 58.556727315930 +3111 0.3111 -3.3313976119971591 58.141756676980 +3112 0.3112 -3.3371910917498790 57.727838377420 +3113 0.3113 -3.3429432321895773 57.314970416550 +3114 0.3114 -3.3486541382502817 56.903150797540 +3115 0.3115 -3.3543239146665300 56.492377527430 +3116 0.3116 -3.3599526659737551 56.082648617070 +3117 0.3117 -3.3655404965086673 55.673962081170 +3118 0.3118 -3.3710875104096409 55.266315938300 +3119 0.3119 -3.3765938116170955 54.859708210790 +3120 0.3120 -3.3820595038738768 54.454136924840 +3121 0.3121 -3.3874846907256391 54.049600110410 +3122 0.3122 -3.3928694755212248 53.646095801300 +3123 0.3123 -3.3982139614130431 53.243622035070 +3124 0.3124 -3.4035182513574505 52.842176853080 +3125 0.3125 -3.4087824481151268 52.441758300450 +3126 0.3126 -3.4140066542514531 52.042364426080 +3127 0.3127 -3.4191909721368887 51.643993282630 +3128 0.3128 -3.4243355039473453 51.246642926500 +3129 0.3129 -3.4294403516645628 50.850311417850 +3130 0.3130 -3.4345056170764829 50.454996820550 +3131 0.3131 -3.4395314017776215 50.060697202220 +3132 0.3132 -3.4445178071694427 49.667410634200 +3133 0.3133 -3.4494649344607287 49.275135191520 +3134 0.3134 -3.4543728846679516 48.883868952940 +3135 0.3135 -3.4592417586156445 48.493610000920 +3136 0.3136 -3.4640716569367691 48.104356421570 +3137 0.3137 -3.4688626800730842 47.716106304730 +3138 0.3138 -3.4736149282755151 47.328857743890 +3139 0.3139 -3.4783285016045191 46.942608836190 +3140 0.3140 -3.4830034999304527 46.557357682480 +3141 0.3141 -3.4876400229339373 46.173102387210 +3142 0.3142 -3.4922381701062224 45.789841058490 +3143 0.3143 -3.4967980407495505 45.407571808070 +3144 0.3144 -3.5013197339775219 45.026292751360 +3145 0.3145 -3.5058033487154558 44.646002007320 +3146 0.3146 -3.5102489837007509 44.266697698580 +3147 0.3147 -3.5146567374832478 43.888377951360 +3148 0.3148 -3.5190267084255886 43.511040895460 +3149 0.3149 -3.5233589947035777 43.134684664320 +3150 0.3150 -3.5276536943065402 42.759307394930 +3151 0.3151 -3.5319109050376789 42.384907227840 +3152 0.3152 -3.5361307245144316 42.011482307210 +3153 0.3153 -3.5403132501688277 41.639030780710 +3154 0.3154 -3.5444585792478449 41.267550799630 +3155 0.3155 -3.5485668088137645 40.897040518760 +3156 0.3156 -3.5526380357445242 40.527498096430 +3157 0.3157 -3.5566723567340728 40.158921694540 +3158 0.3158 -3.5606698682927229 39.791309478460 +3159 0.3159 -3.5646306667475023 39.424659617130 +3160 0.3160 -3.5685548482425071 39.058970282970 +3161 0.3161 -3.5724425087392513 38.694239651910 +3162 0.3162 -3.5762937440170157 38.330465903380 +3163 0.3163 -3.5801086496732002 37.967647220310 +3164 0.3164 -3.5838873211236693 37.605781789070 +3165 0.3165 -3.5876298536030999 37.244867799540 +3166 0.3166 -3.5913363421653308 36.884903445080 +3167 0.3167 -3.5950068816837084 36.525886922470 +3168 0.3168 -3.5986415668514309 36.167816431980 +3169 0.3169 -3.6022404921818949 35.810690177300 +3170 0.3170 -3.6058037520090385 35.454506365570 +3171 0.3171 -3.6093314404876851 35.099263207360 +3172 0.3172 -3.6128236515938870 34.744958916680 +3173 0.3173 -3.6162804791252663 34.391591710910 +3174 0.3174 -3.6197020167013569 34.039159810900 +3175 0.3175 -3.6230883577639452 33.687661440870 +3176 0.3176 -3.6264395955774109 33.337094828440 +3177 0.3177 -3.6297558232290648 32.987458204640 +3178 0.3178 -3.6330371336294887 32.638749803840 +3179 0.3179 -3.6362836195128727 32.290967863840 +3180 0.3180 -3.6394953734373532 31.944110625770 +3181 0.3181 -3.6426724877853478 31.598176334120 +3182 0.3182 -3.6458150547638928 31.253163236780 +3183 0.3183 -3.6489231664049777 30.909069584920 +3184 0.3184 -3.6519969145658790 30.565893633110 +3185 0.3185 -3.6550363909294958 30.223633639230 +3186 0.3186 -3.6580416870046815 29.882287864480 +3187 0.3187 -3.6610128941265758 29.541854573410 +3188 0.3188 -3.6639501034569393 29.202332033860 +3189 0.3189 -3.6668534059844804 28.863718516960 +3190 0.3190 -3.6697228925251872 28.526012297180 +3191 0.3191 -3.6725586537226595 28.189211652270 +3192 0.3192 -3.6753607800484360 27.853314863260 +3193 0.3193 -3.6781293618023221 27.518320214460 +3194 0.3194 -3.6808644891127176 27.184225993450 +3195 0.3195 -3.6835662519369445 26.851030491090 +3196 0.3196 -3.6862347400615740 26.518732001500 +3197 0.3197 -3.6888700431027512 26.187328822040 +3198 0.3198 -3.6914722505065196 25.856819253330 +3199 0.3199 -3.6940414515491460 25.527201599200 +3200 0.3200 -3.6965777353374443 25.198474166770 +3201 0.3201 -3.6990811908090997 24.870635266340 +3202 0.3202 -3.7015519067329885 24.543683211440 +3203 0.3203 -3.7039899717095017 24.217616318820 +3204 0.3204 -3.7063954741708649 23.892432908440 +3205 0.3205 -3.7087685023814596 23.568131303450 +3206 0.3206 -3.7111091444381428 23.244709830210 +3207 0.3207 -3.7134174882705651 22.922166818240 +3208 0.3208 -3.7156936216414906 22.600500600270 +3209 0.3209 -3.7179376321471143 22.279709512200 +3210 0.3210 -3.7201496072173783 21.959791893080 +3211 0.3211 -3.7223296341162886 21.640746085130 +3212 0.3212 -3.7244777999422314 21.322570433730 +3213 0.3213 -3.7265941916282888 21.005263287420 +3214 0.3214 -3.7286788959425516 20.688822997840 +3215 0.3215 -3.7307319994884347 20.373247919820 +3216 0.3216 -3.7327535887049903 20.058536411290 +3217 0.3217 -3.7347437498672198 19.744686833300 +3218 0.3218 -3.7367025690863866 19.431697550040 +3219 0.3219 -3.7386301323103268 19.119566928760 +3220 0.3220 -3.7405265253237583 18.808293339870 +3221 0.3221 -3.7423918337485951 18.497875156870 +3222 0.3222 -3.7442261430442541 18.188310756310 +3223 0.3223 -3.7460295385079632 17.879598517870 +3224 0.3224 -3.7478021052750705 17.571736824280 +3225 0.3225 -3.7495439283193530 17.264724061370 +3226 0.3226 -3.7512550924533219 16.958558618010 +3227 0.3227 -3.7529356823285296 16.653238886140 +3228 0.3228 -3.7545857824358744 16.348763260760 +3229 0.3229 -3.7562054771059072 16.045130139900 +3230 0.3230 -3.7577948505091352 15.742337924660 +3231 0.3231 -3.7593539866563259 15.440385019150 +3232 0.3232 -3.7608829693988093 15.139269830520 +3233 0.3233 -3.7623818824287816 14.838990768930 +3234 0.3234 -3.7638508092796075 14.539546247590 +3235 0.3235 -3.7652898333261211 14.240934682680 +3236 0.3236 -3.7666990377849254 13.943154493410 +3237 0.3237 -3.7680785057146955 13.646204101990 +3238 0.3238 -3.7694283200164747 13.350081933590 +3239 0.3239 -3.7707485634339752 13.054786416420 +3240 0.3240 -3.7720393185538783 12.760315981640 +3241 0.3241 -3.7733006678061285 12.466669063360 +3242 0.3242 -3.7745326934642311 12.173844098690 +3243 0.3243 -3.7757354776455516 11.881839527720 +3244 0.3244 -3.7769091023116101 11.590653793450 +3245 0.3245 -3.7780536492683758 11.300285341860 +3246 0.3246 -3.7791692001665624 11.010732621870 +3247 0.3247 -3.7802558365019214 10.721994085310 +3248 0.3248 -3.7813136396155369 10.434068187000 +3249 0.3249 -3.7823426906941191 10.146953384640 +3250 0.3250 -3.7833430707702944 9.860648138870 +3251 0.3251 -3.7843148607228998 9.575150913240 +3252 0.3252 -3.7852581412772719 9.290460174200 +3253 0.3253 -3.7861729930055370 9.006574391100 +3254 0.3254 -3.7870594963269029 8.723492036220 +3255 0.3255 -3.7879177315079491 8.441211584700 +3256 0.3256 -3.7887477786629127 8.159731514570 +3257 0.3257 -3.7895497177539785 7.879050306750 +3258 0.3258 -3.7903236285915667 7.599166445010 +3259 0.3259 -3.7910695908346188 7.320078416030 +3260 0.3260 -3.7917876839908855 7.041784709300 +3261 0.3261 -3.7924779874172119 6.764283817230 +3262 0.3262 -3.7931405803198235 6.487574235000 +3263 0.3263 -3.7937755417546084 6.211654460700 +3264 0.3264 -3.7943829506274058 5.936522995250 +3265 0.3265 -3.7949628856942863 5.662178342360 +3266 0.3266 -3.7955154255618360 5.388619008630 +3267 0.3267 -3.7960406486874385 5.115843503420 +3268 0.3268 -3.7965386333795572 4.843850338950 +3269 0.3269 -3.7970094577980174 4.572638030250 +3270 0.3270 -3.7974531999542855 4.302205095110 +3271 0.3271 -3.7978699377117500 4.032550054180 +3272 0.3272 -3.7982597487860010 3.763671430840 +3273 0.3273 -3.7986227107451098 3.495567751340 +3274 0.3274 -3.7989589010099079 3.228237544620 +3275 0.3275 -3.7992683968542620 2.961679342460 +3276 0.3276 -3.7995512754053542 2.695891679380 +3277 0.3277 -3.7998076136439582 2.430873092700 +3278 0.3278 -3.8000374884047159 2.166622122450 +3279 0.3279 -3.8002409763764113 1.903137311460 +3280 0.3280 -3.8004181541022488 1.640417205290 +3281 0.3281 -3.8005690979801252 1.378460352240 +3282 0.3282 -3.8006938842629041 1.117265303340 +3283 0.3283 -3.8007925890586898 0.856830612370 +3284 0.3284 -3.8008652883311007 0.597154835850 +3285 0.3285 -3.8009120578995419 0.338236532970 +3286 0.3286 -3.8009329734394748 0.080074265690 +3287 0.3287 -3.8009281104826917 -0.177333401350 +3288 0.3288 -3.8008975444175848 -0.433987900790 +3289 0.3289 -3.8008413504894163 -0.689890662580 +3290 0.3290 -3.8007596038005884 -0.945043113980 +3291 0.3291 -3.8006523793109119 -1.199446679550 +3292 0.3292 -3.8005197518378759 -1.453102781170 +3293 0.3293 -3.8003617960569152 -1.706012838050 +3294 0.3294 -3.8001785865016773 -1.958178266710 +3295 0.3295 -3.7999701975642908 -2.209600481020 +3296 0.3296 -3.7997367034956309 -2.460280892180 +3297 0.3297 -3.7994781784055847 -2.710220908740 +3298 0.3298 -3.7991946962633181 -2.959421936590 +3299 0.3299 -3.7988863308975400 -3.207885378970 +3300 0.3300 -3.7985531559967662 -3.455612636510 +3301 0.3301 -3.7981952451095826 -3.702605107160 +3302 0.3302 -3.7978126716449112 -3.948864186270 +3303 0.3303 -3.7974055088722696 -4.194391266560 +3304 0.3304 -3.7969738299220355 -4.439187738120 +3305 0.3305 -3.7965177077857075 -4.683254988440 +3306 0.3306 -3.7960372153161654 -4.926594402400 +3307 0.3307 -3.7955324252279321 -5.169207362270 +3308 0.3308 -3.7950034100974337 -5.411095247700 +3309 0.3309 -3.7944502423632587 -5.652259435800 +3310 0.3310 -3.7938729943264162 -5.892701301050 +3311 0.3311 -3.7932717381505956 -6.132422215360 +3312 0.3312 -3.7926465458624254 -6.371423548040 +3313 0.3313 -3.7919974893517296 -6.609706665880 +3314 0.3314 -3.7913246403717835 -6.847272933040 +3315 0.3315 -3.7906280705395741 -7.084123711150 +3316 0.3316 -3.7899078513360509 -7.320260359310 +3317 0.3317 -3.7891640541063847 -7.555684234010 +3318 0.3318 -3.7883967500602225 -7.790396689230 +3319 0.3319 -3.7876060102719413 -8.024399076390 +3320 0.3320 -3.7867919056809018 -8.257692744400 +3321 0.3321 -3.7859545070917018 -8.490279039600 +3322 0.3322 -3.7850938851744309 -8.722159305820 +3323 0.3323 -3.7842101104649197 -8.953334884400 +3324 0.3324 -3.7833032533649944 -9.183807114110 +3325 0.3325 -3.7823733841427267 -9.413577331240 +3326 0.3326 -3.7814205729326869 -9.642646869560 +3327 0.3327 -3.7804448897361915 -9.871017060350 +3328 0.3328 -3.7794464044215546 -10.098689232390 +3329 0.3329 -3.7784251867243372 -10.325664711960 +3330 0.3330 -3.7773813062475967 -10.551944822850 +3331 0.3331 -3.7763148324621341 -10.777530886400 +3332 0.3332 -3.7752258347067431 -11.002424221420 +3333 0.3333 -3.7741143821884573 -11.226626144300 +3334 0.3334 -3.7729805439827953 -11.450137968940 +3335 0.3335 -3.7718243890340100 -11.672961006770 +3336 0.3336 -3.7706459861553325 -11.895096566780 +3337 0.3337 -3.7694454040292196 -12.116545955480 +3338 0.3338 -3.7682227112075970 -12.337310476970 +3339 0.3339 -3.7669779761121038 -12.557391432890 +3340 0.3340 -3.7657112670343382 -12.776790122420 +3341 0.3341 -3.7644226521360999 -12.995507842350 +3342 0.3342 -3.7631121994496315 -13.213545887020 +3343 0.3343 -3.7617799768778646 -13.430905548320 +3344 0.3344 -3.7604260521946595 -13.647588115780 +3345 0.3345 -3.7590504930450477 -13.863594876460 +3346 0.3346 -3.7576533669454721 -14.078927115050 +3347 0.3347 -3.7562347412840285 -14.293586113820 +3348 0.3348 -3.7547946833207058 -14.507573152630 +3349 0.3349 -3.7533332601876253 -14.720889508980 +3350 0.3350 -3.7518505388892791 -14.933536457940 +3351 0.3351 -3.7503465863027716 -15.145515272210 +3352 0.3352 -3.7488214691780546 -15.356827222130 +3353 0.3353 -3.7472752541381662 -15.567473575640 +3354 0.3354 -3.7457080076794691 -15.777455598300 +3355 0.3355 -3.7441197961718871 -15.986774553340 +3356 0.3356 -3.7425106858591399 -16.195431701600 +3357 0.3357 -3.7408807428589821 -16.403428301560 +3358 0.3358 -3.7392300331634347 -16.610765609390 +3359 0.3359 -3.7375586226390225 -16.817444878850 +3360 0.3360 -3.7358665770270099 -17.023467361400 +3361 0.3361 -3.7341539619436315 -17.228834306170 +3362 0.3362 -3.7324208428803280 -17.433546959900 +3363 0.3363 -3.7306672852039799 -17.637606567060 +3364 0.3364 -3.7288933541571381 -17.841014369780 +3365 0.3365 -3.7270991148582566 -18.043771607850 +3366 0.3366 -3.7252846323019262 -18.245879518760 +3367 0.3367 -3.7234499713591034 -18.447339337700 +3368 0.3368 -3.7215951967773417 -18.648152297530 +3369 0.3369 -3.7197203731810236 -18.848319628830 +3370 0.3370 -3.7178255650715890 -19.047842559860 +3371 0.3371 -3.7159108368277654 -19.246722316610 +3372 0.3372 -3.7139762527057960 -19.444960122780 +3373 0.3373 -3.7120218768396680 -19.642557199780 +3374 0.3374 -3.7100477732413419 -19.839514766740 +3375 0.3375 -3.7080540058009799 -20.035834040500 +3376 0.3376 -3.7060406382871713 -20.231516235670 +3377 0.3377 -3.7040077343471594 -20.426562564570 +3378 0.3378 -3.7019553575070683 -20.620974237250 +3379 0.3379 -3.6998835711721298 -20.814752461520 +3380 0.3380 -3.6977924386269070 -21.007898442940 +3381 0.3381 -3.6956820230355198 -21.200413384800 +3382 0.3382 -3.6935523874418714 -21.392298488170 +3383 0.3383 -3.6914035947698682 -21.583554951890 +3384 0.3384 -3.6892357078236468 -21.774183972540 +3385 0.3385 -3.6870487892877968 -21.964186744460 +3386 0.3386 -3.6848429017275834 -22.153564459810 +3387 0.3387 -3.6826181075891684 -22.342318308490 +3388 0.3388 -3.6803744691998332 -22.530449478210 +3389 0.3389 -3.6781120487682011 -22.717959154430 +3390 0.3390 -3.6758309083844565 -22.904848520460 +3391 0.3391 -3.6735311100205661 -23.091118757350 +3392 0.3392 -3.6712127155304999 -23.276771043970 +3393 0.3393 -3.6688757866504504 -23.461806557020 +3394 0.3394 -3.6665203849990506 -23.646226470980 +3395 0.3395 -3.6641465720775943 -23.830031958150 +3396 0.3396 -3.6617544092702548 -24.013224188640 +3397 0.3397 -3.6593439578443023 -24.195804330410 +3398 0.3398 -3.6569152789503208 -24.377773549220 +3399 0.3399 -3.6544684336224265 -24.559133008670 +3400 0.3400 -3.6520034827784831 -24.739883870200 +3401 0.3401 -3.6495204872203186 -24.920027293090 +3402 0.3402 -3.6470195076339422 -25.099564434440 +3403 0.3403 -3.6445006045897586 -25.278496449230 +3404 0.3404 -3.6419638385427833 -25.456824490280 +3405 0.3405 -3.6394092698328566 -25.634549708250 +3406 0.3406 -3.6368369586848592 -25.811673251700 +3407 0.3407 -3.6342469652089249 -25.988196266990 +3408 0.3408 -3.6316393494006536 -26.164119898440 +3409 0.3409 -3.6290141711413240 -26.339445288150 +3410 0.3410 -3.6263714901981086 -26.514173576160 +3411 0.3411 -3.6237113662242817 -26.688305900380 +3412 0.3412 -3.6210338587594344 -26.861843396570 +3413 0.3413 -3.6183390272296845 -27.034787198430 +3414 0.3414 -3.6156269309478875 -27.207138437510 +3415 0.3415 -3.6128976291138470 -27.378898243300 +3416 0.3416 -3.6101511808145244 -27.550067743150 +3417 0.3417 -3.6073876450242492 -27.720648062350 +3418 0.3418 -3.6046070806049273 -27.890640324090 +3419 0.3419 -3.6018095463062498 -28.060045649460 +3420 0.3420 -3.5989951007659022 -28.228865157490 +3421 0.3421 -3.5961638025097717 -28.397099965120 +3422 0.3422 -3.5933157099521553 -28.564751187210 +3423 0.3423 -3.5904508813959657 -28.731819936580 +3424 0.3424 -3.5875693750329392 -28.898307323950 +3425 0.3425 -3.5846712489438417 -29.064214458000 +3426 0.3426 -3.5817565610986741 -29.229542445350 +3427 0.3427 -3.5788253693568786 -29.394292390560 +3428 0.3428 -3.5758777314675432 -29.558465396150 +3429 0.3429 -3.5729137050696065 -29.722062562580 +3430 0.3430 -3.5699333476920629 -29.885084988290 +3431 0.3431 -3.5669367167541655 -30.047533769660 +3432 0.3432 -3.5639238695656297 -30.209410001060 +3433 0.3433 -3.5608948633268356 -30.370714774820 +3434 0.3434 -3.5578497551290327 -30.531449181240 +3435 0.3435 -3.5547886019545403 -30.691614308610 +3436 0.3436 -3.5517114606769500 -30.851211243200 +3437 0.3437 -3.5486183880613278 -31.010241069240 +3438 0.3438 -3.5455094407644152 -31.168704869010 +3439 0.3439 -3.5423846753348291 -31.326603722710 +3440 0.3440 -3.5392441482132635 -31.483938708600 +3441 0.3441 -3.5360879157326877 -31.640710902920 +3442 0.3442 -3.5329160341185455 -31.796921379920 +3443 0.3443 -3.5297285594889574 -31.952571211840 +3444 0.3444 -3.5265255478549178 -32.107661468950 +3445 0.3445 -3.5233070551204926 -32.262193219550 +3446 0.3446 -3.5200731370830169 -32.416167529960 +3447 0.3447 -3.5168238494332944 -32.569585464490 +3448 0.3448 -3.5135592477557940 -32.722448085520 +3449 0.3449 -3.5102793875288452 -32.874756453460 +3450 0.3450 -3.5069843241248360 -33.026511626720 +3451 0.3451 -3.5036741128104105 -33.177714661790 +3452 0.3452 -3.5003488087466605 -33.328366613210 +3453 0.3453 -3.4970084669893242 -33.478468533520 +3454 0.3454 -3.4936531424889807 -33.628021473350 +3455 0.3455 -3.4902828900912426 -33.777026481410 +3456 0.3456 -3.4868977645369528 -33.925484604390 +3457 0.3457 -3.4834978204623761 -34.073396887140 +3458 0.3458 -3.4800831123993934 -34.220764372510 +3459 0.3459 -3.4766536947756963 -34.367588101430 +3460 0.3460 -3.4732096219149780 -34.513869112940 +3461 0.3461 -3.4697509480371251 -34.659608444120 +3462 0.3462 -3.4662777272584102 -34.804807130180 +3463 0.3463 -3.4627900135916843 -34.949466204340 +3464 0.3464 -3.4592878609465676 -35.093586697990 +3465 0.3465 -3.4557713231296394 -35.237169640570 +3466 0.3466 -3.4522404538446301 -35.380216059620 +3467 0.3467 -3.4486953066926094 -35.522726980790 +3468 0.3468 -3.4451359351721775 -35.664703427850 +3469 0.3469 -3.4415623926796530 -35.806146422640 +3470 0.3470 -3.4379747325092636 -35.947056985150 +3471 0.3471 -3.4343730078533330 -36.087436133460 +3472 0.3472 -3.4307572718024710 -36.227284883780 +3473 0.3473 -3.4271275773457597 -36.366604250450 +3474 0.3474 -3.4234839773709411 -36.505395245920 +3475 0.3475 -3.4198265246646056 -36.643658880790 +3476 0.3476 -3.4161552719123769 -36.781396163780 +3477 0.3477 -3.4124702716991009 -36.918608101740 +3478 0.3478 -3.4087715765090283 -37.055295699710 +3479 0.3479 -3.4050592387260035 -37.191459960790 +3480 0.3480 -3.4013333106336483 -37.327101886310 +3481 0.3481 -3.3975938444155469 -37.462222475720 +3482 0.3482 -3.3938408921554313 -37.596822726590 +3483 0.3483 -3.3900745058373647 -37.730903634740 +3484 0.3484 -3.3862947373459256 -37.864466194040 +3485 0.3485 -3.3825016384663922 -37.997511396630 +3486 0.3486 -3.3786952608849230 -38.130040232750 +3487 0.3487 -3.3748756561887436 -38.262053690840 +3488 0.3488 -3.3710428758663253 -38.393552757530 +3489 0.3489 -3.3671969713075698 -38.524538417580 +3490 0.3490 -3.3633379938039902 -38.655011654010 +3491 0.3491 -3.3594659945488918 -38.784973447960 +3492 0.3492 -3.3555810246375537 -38.914424778800 +3493 0.3493 -3.3516831350674092 -39.043366624090 +3494 0.3494 -3.3477723767382268 -39.171799959560 +3495 0.3495 -3.3438488004522897 -39.299725759180 +3496 0.3496 -3.3399124569145751 -39.427144995110 +3497 0.3497 -3.3359633967329345 -39.554058637700 +3498 0.3498 -3.3320016704182724 -39.680467655540 +3499 0.3499 -3.3280273283847239 -39.806373015430 +3500 0.3500 -3.3240404209498338 -39.931775682370 +3501 0.3501 -3.3200409983347350 -40.056676619610 +3502 0.3502 -3.3160291106643238 -40.181076788610 +3503 0.3503 -3.3120048079674413 -40.304977149040 +3504 0.3504 -3.3079681401770467 -40.428378658850 +3505 0.3505 -3.3039191571303945 -40.551282274190 +3506 0.3506 -3.2998579085692117 -40.673688949470 +3507 0.3507 -3.2957844441398727 -40.795599637310 +3508 0.3508 -3.2916988133935767 -40.917015288610 +3509 0.3509 -3.2876010657865202 -41.037936852520 +3510 0.3510 -3.2834912506800733 -41.158365276420 +3511 0.3511 -3.2793694173409542 -41.278301505960 +3512 0.3512 -3.2752356149414030 -41.397746485060 +3513 0.3513 -3.2710898925593561 -41.516701155880 +3514 0.3514 -3.2669322991786189 -41.635166458860 +3515 0.3515 -3.2627628836890410 -41.753143332700 +3516 0.3516 -3.2585816948866864 -41.870632714390 +3517 0.3517 -3.2543887814740069 -41.987635539200 +3518 0.3518 -3.2501841920600145 -42.104152740650 +3519 0.3519 -3.2459679751604535 -42.220185250570 +3520 0.3520 -3.2417401791979721 -42.335733999060 +3521 0.3521 -3.2375008525022926 -42.450799914530 +3522 0.3522 -3.2332500433103828 -42.565383923670 +3523 0.3523 -3.2289877997666268 -42.679486951450 +3524 0.3524 -3.2247141699229958 -42.793109921170 +3525 0.3525 -3.2204292017392158 -42.906253754430 +3526 0.3526 -3.2161329430829384 -43.018919371120 +3527 0.3527 -3.2118254417299110 -43.131107689430 +3528 0.3528 -3.2075067453641450 -43.242819625890 +3529 0.3529 -3.2031769015780833 -43.354056095340 +3530 0.3530 -3.1988359578727699 -43.464818010930 +3531 0.3531 -3.1944839616580163 -43.575106284140 +3532 0.3532 -3.1901209602525706 -43.684921824770 +3533 0.3533 -3.1857470008842848 -43.794265540950 +3534 0.3534 -3.1813621306902804 -43.903138339140 +3535 0.3535 -3.1769663967171162 -44.011541124140 +3536 0.3536 -3.1725598459209543 -44.119474799100 +3537 0.3537 -3.1681425251677253 -44.226940265480 +3538 0.3538 -3.1637144812332947 -44.333938423130 +3539 0.3539 -3.1592757608036286 -44.440470170190 +3540 0.3540 -3.1548264104749584 -44.546536403210 +3541 0.3541 -3.1503664767539448 -44.652138017060 +3542 0.3542 -3.1458960060578423 -44.757275904990 +3543 0.3543 -3.1414150447146643 -44.861950958570 +3544 0.3544 -3.1369236389633475 -44.966164067770 +3545 0.3545 -3.1324218349539126 -45.069916120930 +3546 0.3546 -3.1279096787476290 -45.173208004740 +3547 0.3547 -3.1233872163171790 -45.276040604260 +3548 0.3548 -3.1188544935468174 -45.378414802970 +3549 0.3549 -3.1143115562325354 -45.480331482670 +3550 0.3550 -3.1097584500822228 -45.581791523580 +3551 0.3551 -3.1051952207158289 -45.682795804300 +3552 0.3552 -3.1006219136655235 -45.783345201810 +3553 0.3553 -3.0960385743758585 -45.883440591490 +3554 0.3554 -3.0914452482039283 -45.983082847110 +3555 0.3555 -3.0868419804195306 -46.082272840840 +3556 0.3556 -3.0822288162053253 -46.181011443270 +3557 0.3557 -3.0776058006569942 -46.279299523350 +3558 0.3558 -3.0729729787834028 -46.377137948480 +3559 0.3559 -3.0683303955067562 -46.474527584450 +3560 0.3560 -3.0636780956627603 -46.571469295470 +3561 0.3561 -3.0590161240007787 -46.667963944160 +3562 0.3562 -3.0543445251839922 -46.764012391570 +3563 0.3563 -3.0496633437895557 -46.859615497160 +3564 0.3564 -3.0449726243087563 -46.954774118830 +3565 0.3565 -3.0402724111471700 -47.049489112900 +3566 0.3566 -3.0355627486248196 -47.143761334110 +3567 0.3567 -3.0308436809763313 -47.237591635660 +3568 0.3568 -3.0261152523510892 -47.330980869180 +3569 0.3569 -3.0213775068133941 -47.423929884720 +3570 0.3570 -3.0166304883426180 -47.516439530800 +3571 0.3571 -3.0118742408333596 -47.608510654370 +3572 0.3572 -3.0071088080955990 -47.700144100840 +3573 0.3573 -3.0023342338548540 -47.791340714060 +3574 0.3574 -2.9975505617523335 -47.882101336350 +3575 0.3575 -2.9927578353450914 -47.972426808490 +3576 0.3576 -2.9879560981061819 -48.062317969700 +3577 0.3577 -2.9831453934248122 -48.151775657690 +3578 0.3578 -2.9783257646064971 -48.240800708610 +3579 0.3579 -2.9734972548732115 -48.329393957100 +3580 0.3580 -2.9686599073635427 -48.417556236280 +3581 0.3581 -2.9638137651328429 -48.505288377720 +3582 0.3582 -2.9589588711533823 -48.592591211490 +3583 0.3583 -2.9540952683145010 -48.679465566140 +3584 0.3584 -2.9492229994227595 -48.765912268690 +3585 0.3585 -2.9443421072020919 -48.851932144660 +3586 0.3586 -2.9394526342939549 -48.937526018080 +3587 0.3587 -2.9345546232574802 -49.022694711410 +3588 0.3588 -2.9296481165696258 -49.107439045680 +3589 0.3589 -2.9247331566253227 -49.191759840380 +3590 0.3590 -2.9198097857376282 -49.275657913510 +3591 0.3591 -2.9148780461378743 -49.359134081570 +3592 0.3592 -2.9099379799758172 -49.442189159570 +3593 0.3593 -2.9049896293197861 -49.524823961050 +3594 0.3594 -2.9000330361568327 -49.607039298020 +3595 0.3595 -2.8950682423928793 -49.688835981050 +3596 0.3596 -2.8900952898528658 -49.770214819220 +3597 0.3597 -2.8851142202808999 -49.851176620100 +3598 0.3598 -2.8801250753404037 -49.931722189820 +3599 0.3599 -2.8751278966142606 -50.011852333040 +3600 0.3600 -2.8701227256049631 -50.091567852910 +3601 0.3601 -2.8651096037347594 -50.170869551160 +3602 0.3602 -2.8600885723458003 -50.249758228020 +3603 0.3603 -2.8550596727002846 -50.328234682290 +3604 0.3604 -2.8500229459806059 -50.406299711280 +3605 0.3605 -2.8449784332894983 -50.483954110870 +3606 0.3606 -2.8399261756501804 -50.561198675490 +3607 0.3607 -2.8348662140065013 -50.638034198090 +3608 0.3608 -2.8297985892230879 -50.714461470180 +3609 0.3609 -2.8247233420854858 -50.790481281860 +3610 0.3610 -2.8196405133003055 -50.866094421750 +3611 0.3611 -2.8145501434953655 -50.941301677050 +3612 0.3612 -2.8094522732198381 -51.016103833500 +3613 0.3613 -2.8043469429443904 -51.090501675460 +3614 0.3614 -2.7992341930613280 -51.164495985790 +3615 0.3615 -2.7941140638847397 -51.238087545980 +3616 0.3616 -2.7889865956506386 -51.311277136040 +3617 0.3617 -2.7838518285171054 -51.384065534620 +3618 0.3618 -2.7787098025644288 -51.456453518910 +3619 0.3619 -2.7735605577952502 -51.528441864660 +3620 0.3620 -2.7684041341347032 -51.600031346280 +3621 0.3621 -2.7632405714305546 -51.671222736690 +3622 0.3622 -2.7580699094533476 -51.742016807450 +3623 0.3623 -2.7528921878965411 -51.812414328680 +3624 0.3624 -2.7477074463766504 -51.882416069130 +3625 0.3625 -2.7425157244333880 -51.952022796120 +3626 0.3626 -2.7373170615298017 -52.021235275610 +3627 0.3627 -2.7321114970524158 -52.090054272110 +3628 0.3628 -2.7268990703113718 -52.158480548770 +3629 0.3629 -2.7216798205405661 -52.226514867340 +3630 0.3630 -2.7164537868977892 -52.294157988200 +3631 0.3631 -2.7112210084648631 -52.361410670320 +3632 0.3632 -2.7059815242477820 -52.428273671300 +3633 0.3633 -2.7007353731768489 -52.494747747360 +3634 0.3634 -2.6954825941068146 -52.560833653330 +3635 0.3635 -2.6902232258170136 -52.626532142690 +3636 0.3636 -2.6849573070115036 -52.691843967510 +3637 0.3637 -2.6796848763192007 -52.756769878550 +3638 0.3638 -2.6744059722940166 -52.821310625130 +3639 0.3639 -2.6691206334149968 -52.885466955260 +3640 0.3640 -2.6638288980864560 -52.949239615560 +3641 0.3641 -2.6585308046381124 -53.012629351310 +3642 0.3642 -2.6532263913252265 -53.075636906410 +3643 0.3643 -2.6479156963287340 -53.138263023440 +3644 0.3644 -2.6425987577553824 -53.200508443590 +3645 0.3645 -2.6372756136378670 -53.262373906720 +3646 0.3646 -2.6319463019349629 -53.323860151360 +3647 0.3647 -2.6266108605316618 -53.384967914660 +3648 0.3648 -2.6212693272393062 -53.445697932450 +3649 0.3649 -2.6159217397957226 -53.506050939220 +3650 0.3650 -2.6105681358653552 -53.566027668130 +3651 0.3651 -2.6052085530393994 -53.625628850990 +3652 0.3652 -2.5998430288359353 -53.684855218290 +3653 0.3653 -2.5944716007000617 -53.743707499180 +3654 0.3654 -2.5890943060040272 -53.802186421510 +3655 0.3655 -2.5837111820473631 -53.860292711770 +3656 0.3656 -2.5783222660570169 -53.918027095150 +3657 0.3657 -2.5729275951874824 -53.975390295540 +3658 0.3658 -2.5675272065209325 -54.032383035460 +3659 0.3659 -2.5621211370673516 -54.089006036160 +3660 0.3660 -2.5567094237646644 -54.145260017580 +3661 0.3661 -2.5512921034788696 -54.201145698320 +3662 0.3662 -2.5458692130041682 -54.256663795710 +3663 0.3663 -2.5404407890630956 -54.311815025740 +3664 0.3664 -2.5350068683066511 -54.366600103150 +3665 0.3665 -2.5295674873144285 -54.421019741300 +3666 0.3666 -2.5241226825947467 -54.475074652340 +3667 0.3667 -2.5186724905847755 -54.528765547080 +3668 0.3668 -2.5132169476506698 -54.582093135030 +3669 0.3669 -2.5077560900876956 -54.635058124450 +3670 0.3670 -2.5022899541203598 -54.687661222270 +3671 0.3671 -2.4968185759025379 -54.739903134170 +3672 0.3672 -2.4913419915176025 -54.791784564540 +3673 0.3673 -2.4858602369785521 -54.843306216470 +3674 0.3674 -2.4803733482281385 -54.894468791800 +3675 0.3675 -2.4748813611389946 -54.945272991080 +3676 0.3676 -2.4693843115137617 -54.995719513580 +3677 0.3677 -2.4638822350852161 -55.045809057330 +3678 0.3678 -2.4583751675163965 -55.095542319060 +3679 0.3679 -2.4528631444007307 -55.144919994260 +3680 0.3680 -2.4473462012621598 -55.193942777160 +3681 0.3681 -2.4418243735552680 -55.242611360680 +3682 0.3682 -2.4362976966654064 -55.290926436550 +3683 0.3683 -2.4307662059088191 -55.338888695200 +3684 0.3684 -2.4252299365327672 -55.386498825840 +3685 0.3685 -2.4196889237156562 -55.433757516380 +3686 0.3686 -2.4141432025671601 -55.480665453540 +3687 0.3687 -2.4085928081283461 -55.527223322740 +3688 0.3688 -2.4030377753717986 -55.573431808210 +3689 0.3689 -2.3974781392017448 -55.619291592870 +3690 0.3690 -2.3919139344541769 -55.664803358490 +3691 0.3691 -2.3863451958969764 -55.709967785520 +3692 0.3692 -2.3807719582300391 -55.754785553230 +3693 0.3693 -2.3751942560853956 -55.799257339640 +3694 0.3694 -2.3696121240273369 -55.843383821530 +3695 0.3695 -2.3640255965525374 -55.887165674460 +3696 0.3696 -2.3584347080901757 -55.930603572770 +3697 0.3697 -2.3528394930020582 -55.973698189580 +3698 0.3698 -2.3472399855827404 -56.016450196780 +3699 0.3699 -2.3416362200596490 -56.058860265050 +3700 0.3700 -2.3360282305932043 -56.100929063840 +3701 0.3701 -2.3304160512769423 -56.142657261400 +3702 0.3702 -2.3247997161376333 -56.184045524780 +3703 0.3703 -2.3191792591354052 -56.225094519780 +3704 0.3704 -2.3135547141638644 -56.265804911040 +3705 0.3705 -2.3079261150502135 -56.306177361980 +3706 0.3706 -2.3022934955553747 -56.346212534800 +3707 0.3707 -2.2966568893741091 -56.385911090510 +3708 0.3708 -2.2910163301351365 -56.425273688940 +3709 0.3709 -2.2853718514012544 -56.464300988700 +3710 0.3710 -2.2797234866694582 -56.502993647220 +3711 0.3711 -2.2740712693710612 -56.541352320720 +3712 0.3712 -2.2684152328718108 -56.579377664290 +3713 0.3713 -2.2627554104720082 -56.617070331760 +3714 0.3714 -2.2570918354066301 -56.654430975800 +3715 0.3715 -2.2514245408454436 -56.691460247930 +3716 0.3716 -2.2457535598931244 -56.728158798450 +3717 0.3717 -2.2400789255893767 -56.764527276500 +3718 0.3718 -2.2344006709090496 -56.800566330040 +3719 0.3719 -2.2287188287622537 -56.836276605880 +3720 0.3720 -2.2230334319944793 -56.871658749610 +3721 0.3721 -2.2173445133867142 -56.906713405690 +3722 0.3722 -2.2116521056555589 -56.941441217420 +3723 0.3723 -2.2059562414533431 -56.975842826900 +3724 0.3724 -2.2002569533682435 -57.009918875090 +3725 0.3725 -2.1945542739243993 -57.043670001790 +3726 0.3726 -2.1888482355820278 -57.077096845640 +3727 0.3727 -2.1831388707375399 -57.110200044120 +3728 0.3728 -2.1774262117236547 -57.142980233580 +3729 0.3729 -2.1717102908095165 -57.175438049180 +3730 0.3730 -2.1659911402008105 -57.207574124940 +3731 0.3731 -2.1602687920398749 -57.239389093770 +3732 0.3732 -2.1545432784058174 -57.270883587380 +3733 0.3733 -2.1488146313146284 -57.302058236400 +3734 0.3734 -2.1430828827192951 -57.332913670260 +3735 0.3735 -2.1373480645099177 -57.363450517290 +3736 0.3736 -2.1316102085138207 -57.393669404650 +3737 0.3737 -2.1258693464956675 -57.423570958410 +3738 0.3738 -2.1201255101575729 -57.453155803480 +3739 0.3739 -2.1143787311392175 -57.482424563630 +3740 0.3740 -2.1086290410179589 -57.511377861540 +3741 0.3741 -2.1028764713089454 -57.540016318730 +3742 0.3742 -2.0971210534652283 -57.568340555610 +3743 0.3743 -2.0913628188778741 -57.596351191470 +3744 0.3744 -2.0856017988760778 -57.624048844460 +3745 0.3745 -2.0798380247272719 -57.651434131660 +3746 0.3746 -2.0740715276372397 -57.678507668980 +3747 0.3747 -2.0683023387502284 -57.705270071250 +3748 0.3748 -2.0625304891490566 -57.731721952190 +3749 0.3749 -2.0567560098552282 -57.757863924380 +3750 0.3750 -2.0509789318290421 -57.783696599340 +3751 0.3751 -2.0451992859697028 -57.809220587450 +3752 0.3752 -2.0394171031154298 -57.834436498010 +3753 0.3753 -2.0336324140435700 -57.859344939190 +3754 0.3754 -2.0278452494707064 -57.883946518080 +3755 0.3755 -2.0220556400527676 -57.908241840700 +3756 0.3756 -2.0162636163851371 -57.932231511910 +3757 0.3757 -2.0104692090027645 -57.955916135540 +3758 0.3758 -2.0046724483802718 -57.979296314310 +3759 0.3759 -1.9988733649320642 -58.002372649840 +3760 0.3760 -1.9930719890124393 -58.025145742660 +3761 0.3761 -1.9872683509156943 -58.047616192240 +3762 0.3762 -1.9814624808762342 -58.069784596960 +3763 0.3763 -1.9756544090686812 -58.091651554100 +3764 0.3764 -1.9698441656079817 -58.113217659890 +3765 0.3765 -1.9640317805495142 -58.134483509460 +3766 0.3766 -1.9582172838891967 -58.155449696890 +3767 0.3767 -1.9524007055635937 -58.176116815170 +3768 0.3768 -1.9465820754500247 -58.196485456210 +3769 0.3769 -1.9407614233666701 -58.216556210880 +3770 0.3770 -1.9349387790726771 -58.236329668980 +3771 0.3771 -1.9291141722682676 -58.255806419210 +3772 0.3772 -1.9232876325948443 -58.274987049260 +3773 0.3773 -1.9174591896350957 -58.293872145710 +3774 0.3774 -1.9116288729131037 -58.312462294130 +3775 0.3775 -1.9057967118944477 -58.330758078990 +3776 0.3776 -1.8999627359863112 -58.348760083740 +3777 0.3777 -1.8941269745375862 -58.366468890760 +3778 0.3778 -1.8882894568389796 -58.383885081370 +3779 0.3779 -1.8824502121231177 -58.401009235870 +3780 0.3780 -1.8766092695646492 -58.417841933500 +3781 0.3781 -1.8707666582803517 -58.434383752450 +3782 0.3782 -1.8649224073292368 -58.450635269850 +3783 0.3783 -1.8590765457126517 -58.466597061850 +3784 0.3784 -1.8532291023743841 -58.482269703500 +3785 0.3785 -1.8473801062007675 -58.497653768830 +3786 0.3786 -1.8415295860207825 -58.512749830870 +3787 0.3787 -1.8356775706061610 -58.527558461560 +3788 0.3788 -1.8298240886714905 -58.542080231850 +3789 0.3789 -1.8239691688743160 -58.556315711640 +3790 0.3790 -1.8181128398152431 -58.570265469820 +3791 0.3791 -1.8122551300380396 -58.583930074250 +3792 0.3792 -1.8063960680297391 -58.597310091760 +3793 0.3793 -1.8005356822207430 -58.610406088160 +3794 0.3794 -1.7946740009849229 -58.623218628240 +3795 0.3795 -1.7888110526397210 -58.635748275800 +3796 0.3796 -1.7829468654462530 -58.647995593560 +3797 0.3797 -1.7770814676094100 -58.659961143300 +3798 0.3798 -1.7712148872779585 -58.671645485730 +3799 0.3799 -1.7653471525446420 -58.683049180600 +3800 0.3800 -1.7594782914462814 -58.694172786610 +3801 0.3801 -1.7536083319638769 -58.705016861480 +3802 0.3802 -1.7477373020227074 -58.715581961910 +3803 0.3803 -1.7418652294924319 -58.725868643600 +3804 0.3804 -1.7359921421871884 -58.735877461270 +3805 0.3805 -1.7301180678656944 -58.745608968610 +3806 0.3806 -1.7242430342313464 -58.755063718350 +3807 0.3807 -1.7183670689323205 -58.764242262170 +3808 0.3808 -1.7124901995616715 -58.773145150810 +3809 0.3809 -1.7066124536574305 -58.781772934010 +3810 0.3810 -1.7007338587027054 -58.790126160490 +3811 0.3811 -1.6948544421257805 -58.798205378010 +3812 0.3812 -1.6889742313002130 -58.806011133340 +3813 0.3813 -1.6830932535449330 -58.813543972260 +3814 0.3814 -1.6772115361243416 -58.820804439570 +3815 0.3815 -1.6713291062484090 -58.827793079080 +3816 0.3816 -1.6654459910727719 -58.834510433660 +3817 0.3817 -1.6595622176988309 -58.840957045160 +3818 0.3818 -1.6536778131738499 -58.847133454460 +3819 0.3819 -1.6477928044910519 -58.853040201500 +3820 0.3820 -1.6419072185897170 -58.858677825200 +3821 0.3821 -1.6360210823552790 -58.864046863560 +3822 0.3822 -1.6301344226194210 -58.869147853600 +3823 0.3823 -1.6242472661601746 -58.873981331330 +3824 0.3824 -1.6183596397020155 -58.878547831850 +3825 0.3825 -1.6124715699159589 -58.882847889280 +3826 0.3826 -1.6065830834196553 -58.886882036790 +3827 0.3827 -1.6006942067774883 -58.890650806550 +3828 0.3828 -1.5948049665006698 -58.894154729820 +3829 0.3829 -1.5889153890473344 -58.897394336890 +3830 0.3830 -1.5830255008226359 -58.900370157080 +3831 0.3831 -1.5771353281788418 -58.903082718800 +3832 0.3832 -1.5712448974154289 -58.905532549460 +3833 0.3833 -1.5653542347791780 -58.907720175560 +3834 0.3834 -1.5594633664642685 -58.909646122630 +3835 0.3835 -1.5535723186123735 -58.911310915270 +3836 0.3836 -1.5476811173127536 -58.912715077130 +3837 0.3837 -1.5417897886023506 -58.913859130930 +3838 0.3838 -1.5358983584658825 -58.914743598430 +3839 0.3839 -1.5300068528359376 -58.915369000470 +3840 0.3840 -1.5241152975930661 -58.915735856960 +3841 0.3841 -1.5182237185658751 -58.915844686860 +3842 0.3842 -1.5123321415311231 -58.915696008180 +3843 0.3843 -1.5064405922138107 -58.915290338070 +3844 0.3844 -1.5005490962872741 -58.914628192660 +3845 0.3845 -1.4946576793732800 -58.913710087220 +3846 0.3846 -1.4887663670421150 -58.912536536080 +3847 0.3847 -1.4828751848126804 -58.911108052610 +3848 0.3848 -1.4769841581525840 -58.909425149320 +3849 0.3849 -1.4710933124782304 -58.907488337750 +3850 0.3850 -1.4652026731549164 -58.905298128530 +3851 0.3851 -1.4593122654969199 -58.902855031400 +3852 0.3852 -1.4534221147675925 -58.900159555150 +3853 0.3853 -1.4475322461794504 -58.897212207690 +3854 0.3854 -1.4416426848942665 -58.894013495990 +3855 0.3855 -1.4357534560231604 -58.890563926130 +3856 0.3856 -1.4298645846266909 -58.886864003260 +3857 0.3857 -1.4239760957149454 -58.882914231650 +3858 0.3858 -1.4180880142476304 -58.878715114650 +3859 0.3859 -1.4122003651341630 -58.874267154700 +3860 0.3860 -1.4063131732337599 -58.869570853360 +3861 0.3861 -1.4004264633555279 -58.864626711280 +3862 0.3862 -1.3945402602585548 -58.859435228180 +3863 0.3863 -1.3886545886519983 -58.853996902950 +3864 0.3864 -1.3827694731951743 -58.848312233530 +3865 0.3865 -1.3768849384976483 -58.842381716990 +3866 0.3866 -1.3710010091193237 -58.836205849500 +3867 0.3867 -1.3651177095705316 -58.829785126340 +3868 0.3868 -1.3592350643121185 -58.823120041920 +3869 0.3869 -1.3533530977555359 -58.816211089730 +3870 0.3870 -1.3474718342629288 -58.809058762410 +3871 0.3871 -1.3415912981472238 -58.801663551690 +3872 0.3872 -1.3357115136722177 -58.794025948430 +3873 0.3873 -1.3298325050526651 -58.786146442620 +3874 0.3874 -1.3239542964543671 -58.778025523340 +3875 0.3875 -1.3180769119942586 -58.769663678830 +3876 0.3876 -1.3122003757404956 -58.761061396430 +3877 0.3877 -1.3063247117125432 -58.752219162620 +3878 0.3878 -1.3004499438812616 -58.743137463010 +3879 0.3879 -1.2945760961689956 -58.733816782310 +3880 0.3880 -1.2887031924496597 -58.724257604410 +3881 0.3881 -1.2828312565488247 -58.714460412290 +3882 0.3882 -1.2769603122438062 -58.704425688080 +3883 0.3883 -1.2710903832637492 -58.694153913060 +3884 0.3884 -1.2652214932897143 -58.683645567640 +3885 0.3885 -1.2593536659547653 -58.672901131340 +3886 0.3886 -1.2534869248440548 -58.661921082870 +3887 0.3887 -1.2476212934949094 -58.650705900040 +3888 0.3888 -1.2417567953969153 -58.639256059840 +3889 0.3889 -1.2358934539920052 -58.627572038360 +3890 0.3890 -1.2300312926745423 -58.615654310900 +3891 0.3891 -1.2241703347914048 -58.603503351850 +3892 0.3892 -1.2183106036420732 -58.591119634780 +3893 0.3893 -1.2124521224787137 -58.578503632410 +3894 0.3894 -1.2065949145062627 -58.565655816610 +3895 0.3895 -1.2007390028825116 -58.552576658410 +3896 0.3896 -1.1948844107181926 -58.539266627970 +3897 0.3897 -1.1890311610770616 -58.525726194650 +3898 0.3898 -1.1831792769759817 -58.511955826950 +3899 0.3899 -1.1773287813850082 -58.497955992520 +3900 0.3900 -1.1714796972274732 -58.483727158180 +3901 0.3901 -1.1656320473800672 -58.469269789940 +3902 0.3902 -1.1597858546729227 -58.454584352950 +3903 0.3903 -1.1539411418897003 -58.439671311500 +3904 0.3904 -1.1480979317676687 -58.424531129130 +3905 0.3905 -1.1422562469977893 -58.409164268460 +3906 0.3906 -1.1364161102247994 -58.393571191340 +3907 0.3907 -1.1305775440472929 -58.377752358790 +3908 0.3908 -1.1247405710178049 -58.361708230970 +3909 0.3909 -1.1189052136428934 -58.345439267260 +3910 0.3910 -1.1130714943832218 -58.328945926170 +3911 0.3911 -1.1072394356536408 -58.312228665450 +3912 0.3912 -1.1014090598232693 -58.295287941980 +3913 0.3913 -1.0955803892155782 -58.278124211840 +3914 0.3914 -1.0897534461084708 -58.260737930310 +3915 0.3915 -1.0839282527343639 -58.243129551830 +3916 0.3916 -1.0781048312802703 -58.225299530040 +3917 0.3917 -1.0722832038878798 -58.207248317770 +3918 0.3918 -1.0664633926536398 -58.188976367030 +3919 0.3919 -1.0606454196288357 -58.170484129050 +3920 0.3920 -1.0548293068196728 -58.151772054210 +3921 0.3921 -1.0490150761873569 -58.132840592110 +3922 0.3922 -1.0432027496481728 -58.113690191570 +3923 0.3923 -1.0373923490735668 -58.094321300550 +3924 0.3924 -1.0315838962902264 -58.074734366260 +3925 0.3925 -1.0257774130801589 -58.054929835090 +3926 0.3926 -1.0199729211807733 -58.034908152620 +3927 0.3927 -1.0141704422849589 -58.014669763670 +3928 0.3928 -1.0083699980411649 -57.994215112210 +3929 0.3929 -1.0025716100534798 -57.973544641490 +3930 0.3930 -0.9967752998817099 -57.952658793910 +3931 0.3931 -0.9909810890414599 -57.931558011090 +3932 0.3932 -0.9851889990042119 -57.910242733870 +3933 0.3933 -0.9793990511974033 -57.888713402300 +3934 0.3934 -0.9736112670045053 -57.866970455660 +3935 0.3935 -0.9678256677651018 -57.845014332410 +3936 0.3936 -0.9620422747749683 -57.822845470260 +3937 0.3937 -0.9562611092861498 -57.800464306110 +3938 0.3938 -0.9504821925070388 -57.777871276110 +3939 0.3939 -0.9447055456024533 -57.755066815600 +3940 0.3940 -0.9389311896937148 -57.732051359170 +3941 0.3941 -0.9331591458587253 -57.708825340620 +3942 0.3942 -0.9273894351320453 -57.685389192980 +3943 0.3943 -0.9216220785049714 -57.661743348500 +3944 0.3944 -0.9158570969256129 -57.637888238670 +3945 0.3945 -0.9100945112989705 -57.613824294180 +3946 0.3946 -0.9043343424870119 -57.589551944990 +3947 0.3947 -0.8985766113087480 -57.565071620290 +3948 0.3948 -0.8928213385403105 -57.540383748460 +3949 0.3949 -0.8870685449150291 -57.515488757170 +3950 0.3950 -0.8813182511235066 -57.490387073280 +3951 0.3951 -0.8755704778136961 -57.465079122930 +3952 0.3952 -0.8698252455909761 -57.439565331470 +3953 0.3953 -0.8640825750182271 -57.413846123510 +3954 0.3954 -0.8583424866159075 -57.387921922880 +3955 0.3955 -0.8526050008621295 -57.361793152680 +3956 0.3956 -0.8468701381927345 -57.335460235220 +3957 0.3957 -0.8411379190013685 -57.308923592100 +3958 0.3958 -0.8354083636395565 -57.282183644140 +3959 0.3959 -0.8296814924167785 -57.255240811420 +3960 0.3960 -0.8239573256005445 -57.228095513260 +3961 0.3961 -0.8182358834164695 -57.200748168240 +3962 0.3962 -0.8125171860483474 -57.173199194200 +3963 0.3963 -0.8068012536382264 -57.145449008220 +3964 0.3964 -0.8010881062864834 -57.117498026640 +3965 0.3965 -0.7953777640518979 -57.089346665070 +3966 0.3966 -0.7896702469517264 -57.060995338360 +3967 0.3967 -0.7839655749617769 -57.032444460630 +3968 0.3968 -0.7782637680164813 -57.003694445280 +3969 0.3969 -0.7725648460089704 -56.974745704940 +3970 0.3970 -0.7668688287911478 -56.945598651510 +3971 0.3971 -0.7611757361737628 -56.916253696190 +3972 0.3972 -0.7554855879264832 -56.886711249400 +3973 0.3973 -0.7497984037779702 -56.856971720860 +3974 0.3974 -0.7441142034159492 -56.827035519560 +3975 0.3975 -0.7384330064872853 -56.796903053720 +3976 0.3976 -0.7327548325980537 -56.766574730910 +3977 0.3977 -0.7270797013136138 -56.736050957890 +3978 0.3978 -0.7214076321586818 -56.705332140750 +3979 0.3979 -0.7157386446174028 -56.674418684830 +3980 0.3980 -0.7100727581334227 -56.643310994770 +3981 0.3981 -0.7044099921099607 -56.612009474470 +3982 0.3982 -0.6987503659098812 -56.580514527120 +3983 0.3983 -0.6930938988557661 -56.548826555180 +3984 0.3984 -0.6874406102299866 -56.516945960410 +3985 0.3985 -0.6817905192747736 -56.484873143850 +3986 0.3986 -0.6761436451922901 -56.452608505820 +3987 0.3987 -0.6705000071447030 -56.420152445920 +3988 0.3988 -0.6648596242542540 -56.387505363060 +3989 0.3989 -0.6592225156033306 -56.354667655410 +3990 0.3990 -0.6535887002345365 -56.321639720470 +3991 0.3991 -0.6479581971507630 -56.288421955000 +3992 0.3992 -0.6423310253152600 -56.255014755060 +3993 0.3993 -0.6367072036517055 -56.221418516030 +3994 0.3994 -0.6310867510442765 -56.187633632550 +3995 0.3995 -0.6254696863377209 -56.153660498560 +3996 0.3996 -0.6198560283374259 -56.119499507340 +3997 0.3997 -0.6142457958094885 -56.085151051410 +3998 0.3998 -0.6086390074807855 -56.050615522650 +3999 0.3999 -0.6030356820390425 -56.015893312210 +4000 0.4000 -0.5974358381329045 -55.980984810550 +4001 0.4001 -0.5918394943720060 -55.945890407420 +4002 0.4002 -0.5862466693270395 -55.910610491910 +4003 0.4003 -0.5806573815298240 -55.875145452400 +4004 0.4004 -0.5750716494733761 -55.839495676560 +4005 0.4005 -0.5694894916119776 -55.803661551410 +4006 0.4006 -0.5639109263612451 -55.767643463240 +4007 0.4007 -0.5583359720981981 -55.731441797700 +4008 0.4008 -0.5527646471613276 -55.695056939710 +4009 0.4009 -0.5471969698506660 -55.658489273520 +4010 0.4010 -0.5416329584278550 -55.621739182700 +4011 0.4011 -0.5360726311162125 -55.584807050150 +4012 0.4012 -0.5305160061008020 -55.547693258060 +4013 0.4013 -0.5249631015285010 -55.510398187960 +4014 0.4014 -0.5194139355080670 -55.472922220720 +4015 0.4015 -0.5138685261102071 -55.435265736480 +4016 0.4016 -0.5083268913676451 -55.397429114760 +4017 0.4017 -0.5027890492751891 -55.359412734360 +4018 0.4018 -0.4972550177897991 -55.321216973440 +4019 0.4019 -0.4917248148306531 -55.282842209480 +4020 0.4020 -0.4861984582792150 -55.244288819280 +4021 0.4021 -0.4806759659793031 -55.205557178960 +4022 0.4022 -0.4751573557371546 -55.166647664010 +4023 0.4023 -0.4696426453214931 -55.127560649220 +4024 0.4024 -0.4641318524635961 -55.088296508720 +4025 0.4025 -0.4586249948573611 -55.048855615980 +4026 0.4026 -0.4531220901593716 -55.009238343810 +4027 0.4027 -0.4476231559889641 -54.969445064340 +4028 0.4028 -0.4421282099282941 -54.929476149060 +4029 0.4029 -0.4366372695224016 -54.889331968790 +4030 0.4030 -0.4311503522792776 -54.849012893690 +4031 0.4031 -0.4256674756699296 -54.808519293270 +4032 0.4032 -0.4201886571284471 -54.767851536380 +4033 0.4033 -0.4147139140520676 -54.727009991210 +4034 0.4034 -0.4092432638012421 -54.685995025300 +4035 0.4035 -0.4037767236997001 -54.644807005540 +4036 0.4036 -0.3983143110345146 -54.603446298170 +4037 0.4037 -0.3928560430561686 -54.561913268750 +4038 0.4038 -0.3874019369786181 -54.520208282260 +4039 0.4039 -0.3819520099793571 -54.478331702960 +4040 0.4040 -0.3765062791994842 -54.436283894500 +4041 0.4041 -0.3710647617437661 -54.394065219860 +4042 0.4042 -0.3656274746807021 -54.351676041420 +4043 0.4043 -0.3601944350425876 -54.309116720870 +4044 0.4044 -0.3547656598255801 -54.266387619280 +4045 0.4045 -0.3493411659897616 -54.223489097090 +4046 0.4046 -0.3439209704592041 -54.180421514060 +4047 0.4047 -0.3385050901220326 -54.137185229370 +4048 0.4048 -0.3330935418304891 -54.093780601500 +4049 0.4049 -0.3276863424009961 -54.050207988360 +4050 0.4050 -0.3222835086142201 -54.006467747160 +4051 0.4051 -0.3168850572151366 -53.962560234510 +4052 0.4052 -0.3114910049130911 -53.918485806400 +4053 0.4053 -0.3061013683818636 -53.874244818150 +4054 0.4054 -0.3007161642597311 -53.829837624500 +4055 0.4055 -0.2953354091495307 -53.785264579510 +4056 0.4056 -0.2899591196187227 -53.740526036650 +4057 0.4057 -0.2845873121994537 -53.695622348730 +4058 0.4058 -0.2792200033886186 -53.650553867970 +4059 0.4059 -0.2738572096479236 -53.605320945930 +4060 0.4060 -0.2684989474039471 -53.559923933600 +4061 0.4061 -0.2631452330482036 -53.514363181270 +4062 0.4062 -0.2577960829372066 -53.468639038670 +4063 0.4063 -0.2524515133925286 -53.422751854890 +4064 0.4064 -0.2471115407008636 -53.376701978410 +4065 0.4065 -0.2417761811140891 -53.330489757080 +4066 0.4066 -0.2364454508493281 -53.284115538140 +4067 0.4067 -0.2311193660890116 -53.237579668190 +4068 0.4068 -0.2257979429809381 -53.190882493280 +4069 0.4069 -0.2204811976383357 -53.144024358770 +4070 0.4070 -0.2151691461399242 -53.097005609460 +4071 0.4071 -0.2098618045299747 -53.049826589530 +4072 0.4072 -0.2045591888183722 -53.002487642520 +4073 0.4073 -0.1992613149806756 -52.954989111410 +4074 0.4074 -0.1939681989581787 -52.907331338530 +4075 0.4075 -0.1886798566579712 -52.859514665620 +4076 0.4076 -0.1833963039529992 -52.811539433820 +4077 0.4077 -0.1781175566821247 -52.763405983670 +4078 0.4078 -0.1728436306501877 -52.715114655070 +4079 0.4079 -0.1675745416280652 -52.666665787380 +4080 0.4080 -0.1623103053527317 -52.618059719290 +4081 0.4081 -0.1570509375273192 -52.569296788960 +4082 0.4082 -0.1517964538211767 -52.520377333890 +4083 0.4083 -0.1465468698699317 -52.471301691010 +4084 0.4084 -0.1413022012755477 -52.422070196670 +4085 0.4085 -0.1360624636063842 -52.372683186600 +4086 0.4086 -0.1308276723972576 -52.323140995930 +4087 0.4087 -0.1255978431494996 -52.273443959230 +4088 0.4088 -0.1203729913310166 -52.223592410430 +4089 0.4089 -0.1151531323763491 -52.173586682920 +4090 0.4090 -0.1099382816867296 -52.123427109470 +4091 0.4091 -0.1047284546301436 -52.073114022250 +4092 0.4092 -0.0995236665413866 -52.022647752890 +4093 0.4093 -0.0943239327221231 -51.972028632380 +4094 0.4094 -0.0891292684409461 -51.921256991160 +4095 0.4095 -0.0839396889334351 -51.870333159060 +4096 0.4096 -0.0787552094022151 -51.819257465340 +4097 0.4097 -0.0735758450170136 -51.768030238690 +4098 0.4098 -0.0684016109147186 -51.716651807210 +4099 0.4099 -0.0632325221994391 -51.665122498380 +4100 0.4100 -0.0580685939425616 -51.613442639170 +4101 0.4101 -0.0529098411828076 -51.561612555910 +4102 0.4102 -0.0477562789262916 -51.509632574410 +4103 0.4103 -0.0426079221465786 -51.457503019850 +4104 0.4104 -0.0374647857847421 -51.405224216880 +4105 0.4105 -0.0323268847494211 -51.352796489540 +4106 0.4106 -0.0271942339168786 -51.300220161310 +4107 0.4107 -0.0220668481310576 -51.247495555110 +4108 0.4108 -0.0169447422036376 -51.194622993290 +4109 0.4109 -0.0118279309140931 -51.141602797600 +4110 0.4110 -0.0067164290097511 -51.088435289240 +4111 0.4111 -0.0016102512058461 -51.035120788860 +4112 0.4112 0.0034905878144224 -50.981659616510 +4113 0.4113 0.0085860733998334 -50.928052091710 +4114 0.4114 0.0136761909310884 -50.874298533390 +4115 0.4115 0.0187609258207539 -50.820399259920 +4116 0.4116 0.0238402635132054 -50.766354589110 +4117 0.4117 0.0289141894845714 -50.712164838210 +4118 0.4118 0.0339826892426774 -50.657830323910 +4119 0.4119 0.0390457483269894 -50.603351362330 +4120 0.4120 0.0441033523085594 -50.548728269070 +4121 0.4121 0.0491554867899689 -50.493961359120 +4122 0.4122 0.0542021374052724 -50.439050946950 +4123 0.4123 0.0592432898199424 -50.383997346450 +4124 0.4124 0.0642789297308129 -50.328800870960 +4125 0.4125 0.0693090428660264 -50.273461833310 +4126 0.4126 0.0743336149849769 -50.217980545700 +4127 0.4127 0.0793526318782549 -50.162357319860 +4128 0.4128 0.0843660793675929 -50.106592466900 +4129 0.4129 0.0893739433058099 -50.050686297440 +4130 0.4130 0.0943762095767569 -49.994639121500 +4131 0.4131 0.0993728640952609 -49.938451248580 +4132 0.4132 0.1043638928070724 -49.882122987650 +4133 0.4133 0.1093492816888089 -49.825654647080 +4134 0.4134 0.1143290167479014 -49.769046534770 +4135 0.4135 0.1193030840225404 -49.712298958010 +4136 0.4136 0.1242714695816199 -49.655412223580 +4137 0.4137 0.1292341595246844 -49.598386637710 +4138 0.4138 0.1341911399818759 -49.541222506120 +4139 0.4139 0.1391423971138789 -49.483920133940 +4140 0.4140 0.1440879171118654 -49.426479825790 +4141 0.4141 0.1490276861974424 -49.368901885750 +4142 0.4142 0.1539616906225980 -49.311186617360 +4143 0.4143 0.1588899166696480 -49.253334323640 +4144 0.4144 0.1638123506511825 -49.195345307050 +4145 0.4145 0.1687289789100115 -49.137219869530 +4146 0.4146 0.1736397878191130 -49.078958312500 +4147 0.4147 0.1785447637815790 -49.020560936820 +4148 0.4148 0.1834438932305625 -48.962028042850 +4149 0.4149 0.1883371626292245 -48.903359930390 +4150 0.4150 0.1932245584706815 -48.844556898750 +4151 0.4151 0.1981060672779525 -48.785619246670 +4152 0.4152 0.2029816756039055 -48.726547272390 +4153 0.4153 0.2078513700312060 -48.667341273620 +4154 0.4154 0.2127151371722635 -48.608001547530 +4155 0.4155 0.2175729636691804 -48.548528390810 +4156 0.4156 0.2224248361936994 -48.488922099570 +4157 0.4157 0.2272707414471494 -48.429182969430 +4158 0.4158 0.2321106661603954 -48.369311295490 +4159 0.4159 0.2369445970937859 -48.309307372320 +4160 0.4160 0.2417725210371009 -48.249171493980 +4161 0.4161 0.2465944248095004 -48.188903954010 +4162 0.4162 0.2514102952594721 -48.128505045423 +4163 0.4163 0.2562201192647799 -48.067975060735 +4164 0.4164 0.2610238837324128 -48.007314291922 +4165 0.4165 0.2658215755985324 -47.946523030469 +4166 0.4166 0.2706131818284226 -47.885601567337 +4167 0.4167 0.2753986894164380 -47.824550192969 +4168 0.4168 0.2801780853859518 -47.763369197308 +4169 0.4169 0.2849513567893066 -47.702058869788 +4170 0.4170 0.2897184907077622 -47.640619499324 +4171 0.4171 0.2944794742514448 -47.579051374328 +4172 0.4172 0.2992342945592958 -47.517354782692 +4173 0.4173 0.3039829387990219 -47.455530011829 +4174 0.4174 0.3087253941670440 -47.393577348613 +4175 0.4175 0.3134616478884472 -47.331497079451 +4176 0.4176 0.3181916872169299 -47.269289490203 +4177 0.4177 0.3229154994347527 -47.206954866254 +4178 0.4178 0.3276330718526902 -47.144493492496 +4179 0.4179 0.3323443918099792 -47.081905653283 +4180 0.4180 0.3370494466742681 -47.019191632494 +4181 0.4181 0.3417482238415687 -46.956351713519 +4182 0.4182 0.3464407107362059 -46.893386179225 +4183 0.4183 0.3511268948107668 -46.830295311993 +4184 0.4184 0.3558067635460514 -46.767079393699 +4185 0.4185 0.3604803044510240 -46.703738705752 +4186 0.4186 0.3651475050627633 -46.640273529035 +4187 0.4187 0.3698083529464122 -46.576684143942 +4188 0.4188 0.3744628356951282 -46.512970830379 +4189 0.4189 0.3791109409300357 -46.449133867770 +4190 0.4190 0.3837526563001760 -46.385173535037 +4191 0.4191 0.3883879694824584 -46.321090110610 +4192 0.4192 0.3930168681816103 -46.256883872429 +4193 0.4193 0.3976393401301300 -46.192555097965 +4194 0.4194 0.4022553730882367 -46.128104064168 +4195 0.4195 0.4068649548438208 -46.063531047516 +4196 0.4196 0.4114680732123983 -45.998836324032 +4197 0.4197 0.4160647160370596 -45.934020169195 +4198 0.4198 0.4206548711884222 -45.869082858058 +4199 0.4199 0.4252385265645825 -45.804024665148 +4200 0.4200 0.4298156700910668 -45.738845864538 +4201 0.4201 0.4343862897207835 -45.673546729796 +4202 0.4202 0.4389503734339750 -45.608127534033 +4203 0.4203 0.4435079092381697 -45.542588549862 +4204 0.4204 0.4480588851681344 -45.476930049430 +4205 0.4205 0.4526032892858256 -45.411152304395 +4206 0.4206 0.4571411096803429 -45.345255585951 +4207 0.4207 0.4616723344678805 -45.279240164802 +4208 0.4208 0.4661969517916798 -45.213106311183 +4209 0.4209 0.4707149498219824 -45.146854294868 +4210 0.4210 0.4752263167559821 -45.080484385126 +4211 0.4211 0.4797310408177777 -45.013996850786 +4212 0.4212 0.4842291102583266 -44.947391960193 +4213 0.4213 0.4887205133553971 -44.880669981218 +4214 0.4214 0.4932052384135207 -44.813831181253 +4215 0.4215 0.4976832737639454 -44.746875827243 +4216 0.4216 0.5021546077645900 -44.679804185648 +4217 0.4217 0.5066192287999957 -44.612616522465 +4218 0.4218 0.5110771252812810 -44.545313103243 +4219 0.4219 0.5155282856460943 -44.477894193024 +4220 0.4220 0.5199726983585667 -44.410360056425 +4221 0.4221 0.5244103519092665 -44.342710957571 +4222 0.4222 0.5288412348151520 -44.274947160139 +4223 0.4223 0.5332653356195265 -44.207068927350 +4224 0.4224 0.5376826428919915 -44.139076521951 +4225 0.4225 0.5420931452284007 -44.070970206233 +4226 0.4226 0.5464968312508133 -44.002750242018 +4227 0.4227 0.5508936896074478 -43.934416890673 +4228 0.4228 0.5552837089726377 -43.865970413126 +4229 0.4229 0.5596668780467857 -43.797411069834 +4230 0.4230 0.5640431855563162 -43.728739120774 +4231 0.4231 0.5684126202536305 -43.659954825512 +4232 0.4232 0.5727751709170624 -43.591058443127 +4233 0.4233 0.5771308263508316 -43.522050232256 +4234 0.4234 0.5814795753849986 -43.452930451084 +4235 0.4235 0.5858214068754196 -43.383699357337 +4236 0.4236 0.5901563097037013 -43.314357208296 +4237 0.4237 0.5944842727771554 -43.244904260787 +4238 0.4238 0.5988052850287544 -43.175340771192 +4239 0.4239 0.6031193354170858 -43.105666995437 +4240 0.4240 0.6074264129263079 -43.035883189004 +4241 0.4241 0.6117265065661045 -42.965989606927 +4242 0.4242 0.6160196053716405 -42.895986503793 +4243 0.4243 0.6203056984035175 -42.825874133747 +4244 0.4244 0.6245847747477290 -42.755652750483 +4245 0.4245 0.6288568235156159 -42.685322607254 +4246 0.4246 0.6331218338438221 -42.614883956871 +4247 0.4247 0.6373797948942508 -42.544337051701 +4248 0.4248 0.6416306958540194 -42.473682143671 +4249 0.4249 0.6458745259354163 -42.402919484266 +4250 0.4250 0.6501112743758560 -42.332049324530 +4251 0.4251 0.6543409304378361 -42.261071915072 +4252 0.4252 0.6585634834088925 -42.189987506055 +4253 0.4253 0.6627789226015559 -42.118796347214 +4254 0.4254 0.6669872373533086 -42.047498687840 +4255 0.4255 0.6711884170265402 -41.976094776793 +4256 0.4256 0.6753824510085045 -41.904584862492 +4257 0.4257 0.6795693287112754 -41.832969192927 +4258 0.4258 0.6837490395717043 -41.761248015651 +4259 0.4259 0.6879215730513762 -41.689421577789 +4260 0.4260 0.6920869186365671 -41.617490126028 +4261 0.4261 0.6962450658382000 -41.545453906630 +4262 0.4262 0.7003960041918025 -41.473313165420 +4263 0.4263 0.7045397232574633 -41.401068147796 +4264 0.4264 0.7086762126197896 -41.328719098732 +4265 0.4265 0.7128054618878646 -41.256266262768 +4266 0.4266 0.7169274606952040 -41.183709884019 +4267 0.4267 0.7210421986997136 -41.111050206174 +4268 0.4268 0.7251496655836470 -41.038287472493 +4269 0.4269 0.7292498510535625 -40.965421925817 +4270 0.4270 0.7333427448402813 -40.892453808558 +4271 0.4271 0.7374283366988444 -40.819383362706 +4272 0.4272 0.7415066164084713 -40.746210829830 +4273 0.4273 0.7455775737725167 -40.672936451077 +4274 0.4274 0.7496411986184288 -40.599560467167 +4275 0.4275 0.7536974807977078 -40.526083118412 +4276 0.4276 0.7577464101858631 -40.452504644693 +4277 0.4277 0.7617879766823716 -40.378825285477 +4278 0.4278 0.7658221702106363 -40.305045279816 +4279 0.4279 0.7698489807179438 -40.231164866336 +4280 0.4280 0.7738683981754235 -40.157184283257 +4281 0.4281 0.7778804125780052 -40.083103768376 +4282 0.4282 0.7818850139443779 -40.008923559079 +4283 0.4283 0.7858821923169488 -39.934643892337 +4284 0.4284 0.7898719377618009 -39.860265004705 +4285 0.4285 0.7938542403686526 -39.785787132330 +4286 0.4286 0.7978290902508164 -39.711210510945 +4287 0.4287 0.8017964775451573 -39.636535375872 +4288 0.4288 0.8057563924120519 -39.561761962020 +4289 0.4289 0.8097088250353476 -39.486890503894 +4290 0.4290 0.8136537656223215 -39.411921235585 +4291 0.4291 0.8175912044036397 -39.336854390780 +4292 0.4292 0.8215211316333165 -39.261690202755 +4293 0.4293 0.8254435375886734 -39.186428904383 +4294 0.4294 0.8293584125702989 -39.111070728127 +4295 0.4295 0.8332657469020076 -39.035615906049 +4296 0.4296 0.8371655309308003 -38.960064669805 +4297 0.4297 0.8410577550268229 -38.884417250648 +4298 0.4298 0.8449424095833264 -38.808673879423 +4299 0.4299 0.8488194850166269 -38.732834786584 +4300 0.4300 0.8526889717660646 -38.656900202172 +4301 0.4301 0.8565508602939650 -38.580870355835 +4302 0.4302 0.8604051410855976 -38.504745476817 +4303 0.4303 0.8642518046491369 -38.428525793967 +4304 0.4304 0.8680908415156218 -38.352211535731 +4305 0.4305 0.8719222422389162 -38.275802930158 +4306 0.4306 0.8757459973956693 -38.199300204903 +4307 0.4307 0.8795620975852755 -38.122703587222 +4308 0.4308 0.8833705334298355 -38.046013303978 +4309 0.4309 0.8871712955741161 -37.969229581635 +4310 0.4310 0.8909643746855112 -37.892352646265 +4311 0.4311 0.8947497614540021 -37.815382723553 +4312 0.4312 0.8985274465921187 -37.738320038780 +4313 0.4313 0.9022974208348998 -37.661164816842 +4314 0.4314 0.9060596749398541 -37.583917282243 +4315 0.4315 0.9098141996869210 -37.506577659096 +4316 0.4316 0.9135609858784320 -37.429146171124 +4317 0.4317 0.9173000243390713 -37.351623041661 +4318 0.4318 0.9210313059158370 -37.274008493654 +4319 0.4319 0.9247548214780028 -37.196302749661 +4320 0.4320 0.9284705619170784 -37.118506031851 +4321 0.4321 0.9321785181467717 -37.040618562013 +4322 0.4322 0.9358786811029495 -36.962640561543 +4323 0.4323 0.9395710417435996 -36.884572251459 +4324 0.4324 0.9432555910487921 -36.806413852390 +4325 0.4325 0.9469323200206408 -36.728165584583 +4326 0.4326 0.9506012196832652 -36.649827667905 +4327 0.4327 0.9542622810827524 -36.571400321838 +4328 0.4328 0.9579154952871184 -36.492883765483 +4329 0.4329 0.9615608533862706 -36.414278217562 +4330 0.4330 0.9651983464919696 -36.335583896416 +4331 0.4331 0.9688279657377907 -36.256801020007 +4332 0.4332 0.9724497022790870 -36.177929805918 +4333 0.4333 0.9760635472929506 -36.098970471355 +4334 0.4334 0.9796694919781758 -36.019923233147 +4335 0.4335 0.9832675275552205 -35.940788307748 +4336 0.4336 0.9868576452661695 -35.861565911231 +4337 0.4337 0.9904398363746961 -35.782256259301 +4338 0.4338 0.9940140921660254 -35.702859567285 +4339 0.4339 0.9975804039468964 -35.623376050135 +4340 0.4340 1.0011387630455248 -35.543805922433 +4341 0.4341 1.0046891608115658 -35.464149398387 +4342 0.4342 1.0082315886160769 -35.384406691835 +4343 0.4343 1.0117660378514808 -35.304578016243 +4344 0.4344 1.0152924999315283 -35.224663584706 +4345 0.4345 1.0188109662912610 -35.144663609951 +4346 0.4346 1.0223214283869753 -35.064578304336 +4347 0.4347 1.0258238776961845 -34.984407879850 +4348 0.4348 1.0293183057175828 -34.904152548112 +4349 0.4349 1.0328047039710073 -34.823812520381 +4350 0.4350 1.0362830639974037 -34.743388007547 +4351 0.4351 1.0397533773587873 -34.662879220127 +4352 0.4352 1.0432156356382078 -34.582286368287 +4353 0.4353 1.0466698304397131 -34.501609661817 +4354 0.4354 1.0501159533883113 -34.420849310150 +4355 0.4355 1.0535539961299365 -34.340005522354 +4356 0.4356 1.0569839503314109 -34.259078507134 +4357 0.4357 1.0604058076804095 -34.178068472836 +4358 0.4358 1.0638195598854234 -34.096975627442 +4359 0.4359 1.0672251986757244 -34.015800178579 +4360 0.4360 1.0706227158013288 -33.934542333509 +4361 0.4361 1.0740121030329612 -33.853202299138 +4362 0.4362 1.0773933521620187 -33.771780282013 +4363 0.4363 1.0807664550005356 -33.690276488324 +4364 0.4364 1.0841314033811469 -33.608691123904 +4365 0.4365 1.0874881891570536 -33.527024394230 +4366 0.4366 1.0908368042019863 -33.445276504423 +4367 0.4367 1.0941772404101699 -33.363447659251 +4368 0.4368 1.0975094896962887 -33.281538063124 +4369 0.4369 1.1008335439954500 -33.199547920102 +4370 0.4370 1.1041493952631496 -33.117477433891 +4371 0.4371 1.1074570354752362 -33.035326807843 +4372 0.4372 1.1107564566278765 -32.953096244961 +4373 0.4373 1.1140476507375194 -32.870785947896 +4374 0.4374 1.1173306098408615 -32.788396118946 +4375 0.4375 1.1206053259948121 -32.705926960066 +4376 0.4376 1.1238717912764582 -32.623378672856 +4377 0.4377 1.1271299977830294 -32.540751458568 +4378 0.4378 1.1303799376318633 -32.458045518110 +4379 0.4379 1.1336216029603707 -32.375261052038 +4380 0.4380 1.1368549859260011 -32.292398260567 +4381 0.4381 1.1400800787062075 -32.209457343562 +4382 0.4382 1.1432968734984128 -32.126438500544 +4383 0.4383 1.1465053625199744 -32.043341930689 +4384 0.4384 1.1497055380081502 -31.960167832830 +4385 0.4385 1.1528973922200645 -31.876916405456 +4386 0.4386 1.1560809174326729 -31.793587846713 +4387 0.4387 1.1592561059427289 -31.710182354407 +4388 0.4388 1.1624229500667493 -31.626700126001 +4389 0.4389 1.1655814421409800 -31.543141358614 +4390 0.4390 1.1687315745213624 -31.459506249033 +4391 0.4391 1.1718733395834990 -31.375794993698 +4392 0.4392 1.1750067297226197 -31.292007788713 +4393 0.4393 1.1781317373535476 -31.208144829844 +4394 0.4394 1.1812483549106656 -31.124206312518 +4395 0.4395 1.1843565748478828 -31.040192431826 +4396 0.4396 1.1874563896386003 -30.956103382523 +4397 0.4397 1.1905477917756777 -30.871939359026 +4398 0.4398 1.1936307737714000 -30.787700555420 +4399 0.4399 1.1967053281574438 -30.703387165454 +4400 0.4400 1.1997714474848435 -30.618999382539 +4401 0.4401 1.2028291243239586 -30.534537399761 +4402 0.4402 1.2058783512644400 -30.450001409867 +4403 0.4403 1.2089191209151970 -30.365391605273 +4404 0.4404 1.2119514259043640 -30.280708178066 +4405 0.4405 1.2149752588792673 -30.195951320000 +4406 0.4406 1.2179906125063922 -30.111121222498 +4407 0.4407 1.2209974794713498 -30.026218076655 +4408 0.4408 1.2239958524788443 -29.941242073235 +4409 0.4409 1.2269857242526399 -29.856193402677 +4410 0.4410 1.2299670875355282 -29.771072255088 +4411 0.4411 1.2329399350892951 -29.685878820250 +4412 0.4412 1.2359042596946885 -29.600613287619 +4413 0.4413 1.2388600541513857 -29.515275846325 +4414 0.4414 1.2418073112779604 -29.429866685171 +4415 0.4415 1.2447460239118506 -29.344385992633 +4416 0.4416 1.2476761849093256 -29.258833956868 +4417 0.4417 1.2505977871454543 -29.173210765707 +4418 0.4418 1.2535108235140726 -29.087516606659 +4419 0.4419 1.2564152869277510 -29.001751666907 +4420 0.4420 1.2593111703177620 -28.915916133315 +4421 0.4421 1.2621984666340491 -28.830010192426 +4422 0.4422 1.2650771688451936 -28.744034030462 +4423 0.4423 1.2679472699383829 -28.657987833322 +4424 0.4424 1.2708087629193787 -28.571871786592 +4425 0.4425 1.2736616408124850 -28.485686075533 +4426 0.4426 1.2765058966605161 -28.399430885088 +4427 0.4427 1.2793415235247647 -28.313106399886 +4428 0.4428 1.2821685144849708 -28.226712804238 +4429 0.4429 1.2849868626392895 -28.140250282135 +4430 0.4430 1.2877965611042592 -28.053719017258 +4431 0.4431 1.2905976030147703 -27.967119192964 +4432 0.4432 1.2933899815240337 -27.880450992304 +4433 0.4433 1.2961736898035494 -27.793714598010 +4434 0.4434 1.2989487210430750 -27.706910192502 +4435 0.4435 1.3017150684505943 -27.620037957885 +4436 0.4436 1.3044727252522861 -27.533098075951 +4437 0.4437 1.3072216846924929 -27.446090728185 +4438 0.4438 1.3099619400336899 -27.359016095757 +4439 0.4439 1.3126934845564542 -27.271874359526 +4440 0.4440 1.3154163115594326 -27.184665700041 +4441 0.4441 1.3181304143593120 -27.097390297545 +4442 0.4442 1.3208357862907874 -27.010048331963 +4443 0.4443 1.3235324207065315 -26.922639982923 +4444 0.4444 1.3262203109771646 -26.835165429737 +4445 0.4445 1.3288994504912222 -26.747624851413 +4446 0.4446 1.3315698326551253 -26.660018426650 +4447 0.4447 1.3342314508931499 -26.572346333843 +4448 0.4448 1.3368842986473959 -26.484608751079 +4449 0.4449 1.3395283693777571 -26.396805856144 +4450 0.4450 1.3421636565618900 -26.308937826515 +4451 0.4451 1.3447901536951841 -26.221004839367 +4452 0.4452 1.3474078542907311 -26.133007071573 +4453 0.4453 1.3500167518792947 -26.044944699700 +4454 0.4454 1.3526168400092804 -25.956817900013 +4455 0.4455 1.3552081122467052 -25.868626848482 +4456 0.4456 1.3577905621751676 -25.780371720767 +4457 0.4457 1.3603641833958173 -25.692052692229 +4458 0.4458 1.3629289695273255 -25.603669937934 +4459 0.4459 1.3654849142058543 -25.515223632644 +4460 0.4460 1.3680320110850277 -25.426713950823 +4461 0.4461 1.3705702538359008 -25.338141066640 +4462 0.4462 1.3730996361469308 -25.249505153959 +4463 0.4463 1.3756201517239464 -25.160806386352 +4464 0.4464 1.3781317942901188 -25.072044937095 +4465 0.4465 1.3806345575859318 -24.983220979164 +4466 0.4466 1.3831284353691522 -24.894334685244 +4467 0.4467 1.3856134214148004 -24.805386227719 +4468 0.4468 1.3880895095151204 -24.716375778683 +4469 0.4469 1.3905566934795512 -24.627303509934 +4470 0.4470 1.3930149671346970 -24.538169592979 +4471 0.4471 1.3954643243242975 -24.448974199029 +4472 0.4472 1.3979047589091991 -24.359717499003 +4473 0.4473 1.4003362647673256 -24.270399663529 +4474 0.4474 1.4027588357936494 -24.181020862946 +4475 0.4475 1.4051724659001614 -24.091581267296 +4476 0.4476 1.4075771490158431 -24.002081046339 +4477 0.4477 1.4099728790866370 -23.912520369539 +4478 0.4478 1.4123596500754176 -23.822899406072 +4479 0.4479 1.4147374559619625 -23.733218324827 +4480 0.4480 1.4171062907429242 -23.643477294405 +4481 0.4481 1.4194661484318003 -23.553676483116 +4482 0.4482 1.4218170230589056 -23.463816058989 +4483 0.4483 1.4241589086713431 -23.373896189762 +4484 0.4484 1.4264917993329755 -23.283917042886 +4485 0.4485 1.4288156891243964 -23.193878785530 +4486 0.4486 1.4311305721429017 -23.103781584577 +4487 0.4487 1.4334364425024619 -23.013625606626 +4488 0.4488 1.4357332943336927 -22.923411017989 +4489 0.4489 1.4380211217838272 -22.833137984700 +4490 0.4490 1.4402999190166874 -22.742806672503 +4491 0.4491 1.4425696802126560 -22.652417246870 +4492 0.4492 1.4448303995686487 -22.561969872982 +4493 0.4493 1.4470820712980850 -22.471464715742 +4494 0.4494 1.4493246896308607 -22.380901939774 +4495 0.4495 1.4515582488133203 -22.290281709418 +4496 0.4496 1.4537827431082280 -22.199604188737 +4497 0.4497 1.4559981667947406 -22.108869541515 +4498 0.4498 1.4582045141683793 -22.018077931257 +4499 0.4499 1.4604017795410016 -21.927229521189 +4500 0.4500 1.4625899572407739 -21.836324474257 +4501 0.4501 1.4647690416121362 -21.745362952987 +4502 0.4502 1.4669390270156772 -21.654345117834 +4503 0.4503 1.4690999078278497 -21.563271125616 +4504 0.4504 1.4712516784406031 -21.472141129452 +4505 0.4505 1.4733943332610195 -21.380955278875 +4506 0.4506 1.4755278667109604 -21.289713719941 +4507 0.4507 1.4776522732267230 -21.198416595310 +4508 0.4508 1.4797675472587069 -21.107064044367 +4509 0.4509 1.4818736832710908 -21.015656203312 +4510 0.4510 1.4839706757415196 -20.924193205265 +4511 0.4511 1.4860585191608009 -20.832675180359 +4512 0.4512 1.4881372080326114 -20.741102255849 +4513 0.4513 1.4902067368732137 -20.649474556197 +4514 0.4514 1.4922671002111823 -20.557792203176 +4515 0.4515 1.4943182925871397 -20.466055315973 +4516 0.4516 1.4963603085535018 -20.374264011267 +4517 0.4517 1.4983931426742325 -20.282418403346 +4518 0.4518 1.5004167895246088 -20.190518604179 +4519 0.4519 1.5024312436909943 -20.098564723531 +4520 0.4520 1.5044364997706230 -20.006556869040 +4521 0.4521 1.5064325523713908 -19.914495146318 +4522 0.4522 1.5084193961116585 -19.822379659037 +4523 0.4523 1.5103970256200618 -19.730210509029 +4524 0.4524 1.5123654355353318 -19.637987796369 +4525 0.4525 1.5143246205061232 -19.545711619461 +4526 0.4526 1.5162745751908533 -19.453382075141 +4527 0.4527 1.5182152942575478 -19.360999258749 +4528 0.4528 1.5201467723836970 -19.268563264234 +4529 0.4529 1.5220690042561198 -19.176074184223 +4530 0.4530 1.5239819845708371 -19.083532110123 +4531 0.4531 1.5258857080329531 -18.990937132197 +4532 0.4532 1.5277801693565454 -18.898289339648 +4533 0.4533 1.5296653632645638 -18.805588820719 +4534 0.4534 1.5315412844887375 -18.712835662756 +4535 0.4535 1.5334079277694905 -18.620029952303 +4536 0.4536 1.5352652878558648 -18.527171775182 +4537 0.4537 1.5371133595054527 -18.434261216577 +4538 0.4538 1.5389521374843369 -18.341298361108 +4539 0.4539 1.5407816165670385 -18.248283292923 +4540 0.4540 1.5426017915364729 -18.155216095765 +4541 0.4541 1.5444126571839143 -18.062096853064 +4542 0.4542 1.5462142083089676 -17.968925648002 +4543 0.4543 1.5480064397195479 -17.875702563603 +4544 0.4544 1.5497893462318684 -17.782427682807 +4545 0.4545 1.5515629226704355 -17.689101088537 +4546 0.4546 1.5533271638680517 -17.595722863789 +4547 0.4547 1.5550820646658261 -17.502293091697 +4548 0.4548 1.5568276199131919 -17.408811855618 +4549 0.4549 1.5585638244679325 -17.315279239194 +4550 0.4550 1.5602906731962138 -17.221695326433 +4551 0.4551 1.5620081609726242 -17.128060201775 +4552 0.4552 1.5637162826802218 -17.034373950179 +4553 0.4553 1.5654150332105896 -16.940636657176 +4554 0.4554 1.5671044074638960 -16.846848408951 +4555 0.4555 1.5687844003489639 -16.753009292409 +4556 0.4556 1.5704550067833467 -16.659119395248 +4557 0.4557 1.5721162216934101 -16.565178806022 +4558 0.4558 1.5737680400144221 -16.471187614215 +4559 0.4559 1.5754104566906482 -16.377145910309 +4560 0.4560 1.5770434666754558 -16.283053785844 +4561 0.4561 1.5786670649314225 -16.188911333492 +4562 0.4562 1.5802812464304530 -16.094718647117 +4563 0.4563 1.5818860061539011 -16.000475821845 +4564 0.4564 1.5834813390926996 -15.906182954124 +4565 0.4565 1.5850672402474955 -15.811840141795 +4566 0.4566 1.5866437046287925 -15.717447484143 +4567 0.4567 1.5882107272570982 -15.623005081973 +4568 0.4568 1.5897683031630800 -15.528513037662 +4569 0.4569 1.5913164273877243 -15.433971455224 +4570 0.4570 1.5928550949825044 -15.339380440379 +4571 0.4571 1.5943843010095531 -15.244740100593 +4572 0.4572 1.5959040405418405 -15.150050545156 +4573 0.4573 1.5974143086633601 -15.055311885237 +4574 0.4574 1.5989151004693187 -14.960524233935 +4575 0.4575 1.6004064110663325 -14.865687706342 +4576 0.4576 1.6018882355726298 -14.770802419605 +4577 0.4577 1.6033605691182584 -14.675868492968 +4578 0.4578 1.6048234068452991 -14.580886047847 +4579 0.4579 1.6062767439080847 -14.485855207867 +4580 0.4580 1.6077205754734245 -14.390776098928 +4581 0.4581 1.6091548967208338 -14.295648849258 +4582 0.4582 1.6105797028427697 -14.200473589460 +4583 0.4583 1.6119949890448713 -14.105250452572 +4584 0.4584 1.6134007505462058 -14.009979574118 +4585 0.4585 1.6147969825795192 -13.914661092151 +4586 0.4586 1.6161836803914928 -13.819295147321 +4587 0.4587 1.6175608392430043 -13.723881882908 +4588 0.4588 1.6189284544093938 -13.628421444880 +4589 0.4589 1.6202865211807351 -13.532913981948 +4590 0.4590 1.6216350348621125 -13.437359645601 +4591 0.4591 1.6229739907739007 -13.341758590163 +4592 0.4592 1.6243033842520511 -13.246110972846 +4593 0.4593 1.6256232106483823 -13.150416953779 +4594 0.4594 1.6269334653308751 -13.054676696075 +4595 0.4595 1.6282341436839718 -12.958890365859 +4596 0.4596 1.6295252411088812 -12.863058132330 +4597 0.4597 1.6308067530238872 -12.767180167789 +4598 0.4598 1.6320786748646614 -12.671256647693 +4599 0.4599 1.6333410020845811 -12.575287750701 +4600 0.4600 1.6345937301550515 -12.479273658706 +4601 0.4601 1.6358368545658313 -12.383214556888 +4602 0.4602 1.6370703708253631 -12.287110633749 +4603 0.4603 1.6382942744611084 -12.190962081156 +4604 0.4604 1.6395085610198856 -12.094769094388 +4605 0.4605 1.6407132260682131 -11.998531872160 +4606 0.4606 1.6419082651926551 -11.902250616681 +4607 0.4607 1.6430936740001731 -11.805925533682 +4608 0.4608 1.6442694481184803 -11.709556832459 +4609 0.4609 1.6454355831963985 -11.613144725904 +4610 0.4610 1.6465920749042213 -11.516689430551 +4611 0.4611 1.6477389189340792 -11.420191166608 +4612 0.4612 1.6488761110003092 -11.323650157993 +4613 0.4613 1.6500036468398274 -11.227066632372 +4614 0.4614 1.6511215222125055 -11.130440821192 +4615 0.4615 1.6522297329015507 -11.033772959714 +4616 0.4616 1.6533282747138891 -10.937063287052 +4617 0.4617 1.6544171434805519 -10.840312046203 +4618 0.4618 1.6554963350570662 -10.743519484080 +4619 0.4619 1.6565658453238474 -10.646685851545 +4620 0.4620 1.6576256701865966 -10.549811403437 +4621 0.4621 1.6586758055766990 -10.452896398612 +4622 0.4622 1.6597162474516278 -10.355941099965 +4623 0.4623 1.6607469917953495 -10.258945774466 +4624 0.4624 1.6617680346187320 -10.161910693184 +4625 0.4625 1.6627793719599575 -10.064836131324 +4626 0.4626 1.6637809998849360 -9.967722368245 +4627 0.4627 1.6647729144877232 -9.870569687502 +4628 0.4628 1.6657551118909411 -9.773378376856 +4629 0.4629 1.6667275882461998 -9.676148728320 +4630 0.4630 1.6676903397345244 -9.578881038171 +4631 0.4631 1.6686433625667820 -9.481575606981 +4632 0.4632 1.6695866529841132 -9.384232739645 +4633 0.4633 1.6705202072583656 -9.286852745403 +4634 0.4634 1.6714440216925288 -9.189435937863 +4635 0.4635 1.6723580926211736 -9.091982635032 +4636 0.4636 1.6732624164108916 -8.994493159328 +4637 0.4637 1.6741569894607387 -8.896967837615 +4638 0.4638 1.6750418082026801 -8.799407001214 +4639 0.4639 1.6759168691020376 -8.701810985936 +4640 0.4640 1.6767821686579394 -8.604180132097 +4641 0.4641 1.6776377034037711 -8.506514784536 +4642 0.4642 1.6784834699076303 -8.408815292648 +4643 0.4643 1.6793194647727820 -8.311082010385 +4644 0.4644 1.6801456846381160 -8.213315296293 +4645 0.4645 1.6809621261786067 -8.115515513521 +4646 0.4646 1.6817687861057748 -8.017683029841 +4647 0.4647 1.6825656611681505 -7.919818217673 +4648 0.4648 1.6833527481517387 -7.821921454089 +4649 0.4649 1.6841300438804852 -7.723993120841 +4650 0.4650 1.6848975452167461 -7.626033604376 +4651 0.4651 1.6856552490617571 -7.528043295846 +4652 0.4652 1.6864031523561060 -7.430022591131 +4653 0.4653 1.6871412520802052 -7.331971890850 +4654 0.4654 1.6878695452547663 -7.233891600373 +4655 0.4655 1.6885880289412771 -7.135782129845 +4656 0.4656 1.6892967002424788 -7.037643894188 +4657 0.4657 1.6899955563028441 -6.939477313120 +4658 0.4658 1.6906845943090585 -6.841282811167 +4659 0.4659 1.6913638114905007 -6.743060817677 +4660 0.4660 1.6920332051197260 -6.644811766829 +4661 0.4661 1.6926927725129497 -6.546536097646 +4662 0.4662 1.6933425110305320 -6.448234254001 +4663 0.4663 1.6939824180774641 -6.349906684639 +4664 0.4664 1.6946124911038547 -6.251553843174 +4665 0.4665 1.6952327276054187 -6.153176188106 +4666 0.4666 1.6958431251239652 -6.054774182824 +4667 0.4667 1.6964436812478880 -5.956348295631 +4668 0.4668 1.6970343936126560 -5.857898999727 +4669 0.4669 1.6976152599013039 -5.759426773231 +4670 0.4670 1.6981862778449253 -5.660932099196 +4671 0.4671 1.6987474452231650 -5.562415465599 +4672 0.4672 1.6992987598647127 -5.463877365355 +4673 0.4673 1.6998402196477966 -5.365318296326 +4674 0.4674 1.7003718225006792 -5.266738761326 +4675 0.4675 1.7008935664021512 -5.168139268115 +4676 0.4676 1.7014054493820281 -5.069520329423 +4677 0.4677 1.7019074695216461 -4.970882462935 +4678 0.4678 1.7023996249543583 -4.872226191310 +4679 0.4679 1.7028819138660323 -4.773552042171 +4680 0.4680 1.7033543344955469 -4.674860548119 +4681 0.4681 1.7038168851352895 -4.576152246733 +4682 0.4682 1.7042695641316545 -4.477427680566 +4683 0.4683 1.7047123698855406 -4.378687397154 +4684 0.4684 1.7051453008528490 -4.279931949014 +4685 0.4685 1.7055683555449819 -4.181161893644 +4686 0.4686 1.7059815325293404 -4.082377793525 +4687 0.4687 1.7063848304298226 -3.983580216121 +4688 0.4688 1.7067782479273228 -3.884769733882 +4689 0.4689 1.7071617837602284 -3.785946924231 +4690 0.4690 1.7075354367249191 -3.687112369582 +4691 0.4691 1.7078992056762643 -3.588266657319 +4692 0.4692 1.7082530895281207 -3.489410379808 +4693 0.4693 1.7085970872538307 -3.390544134392 +4694 0.4694 1.7089311978867192 -3.291668523378 +4695 0.4695 1.7092554205205905 -3.192784154049 +4696 0.4696 1.7095697543102255 -3.093891638649 +4697 0.4697 1.7098741984718773 -2.994991594385 +4698 0.4698 1.7101687522837676 -2.896084643424 +4699 0.4699 1.7104534150865829 -2.797171412880 +4700 0.4700 1.7107281862839678 -2.698252534817 +4701 0.4701 1.7109930653430205 -2.599328646239 +4702 0.4702 1.7112480517947872 -2.500400389094 +4703 0.4703 1.7114931452347544 -2.401468410248 +4704 0.4704 1.7117283453233416 -2.302533361497 +4705 0.4705 1.7119536517863942 -2.203595899554 +4706 0.4706 1.7121690644156740 -2.104656686038 +4707 0.4707 1.7123745830693493 -2.005716387471 +4708 0.4708 1.7125702076724865 -1.906775675271 +4709 0.4709 1.7127559382175368 -1.807835225737 +4710 0.4710 1.7129317747648261 -1.708895720046 +4711 0.4711 1.7130977174430404 -1.609957844240 +4712 0.4712 1.7132537664497134 -1.511022289221 +4713 0.4713 1.7133999220517115 -1.412089750741 +4714 0.4714 1.7135361845857178 -1.313160929385 +4715 0.4715 1.7136625544587154 -1.214236530568 +4716 0.4716 1.7137790321484696 -1.115317264518 +4717 0.4717 1.7138856182040090 -1.016403846271 +4718 0.4718 1.7139823132461054 -0.917496995659 +4719 0.4719 1.7140691179677527 -0.818597437290 +4720 0.4720 1.7141460331346445 -0.719705900544 +4721 0.4721 1.7142130595856497 -0.620823119558 +4722 0.4722 1.7142701982332882 -0.521949833211 +4723 0.4723 1.7143174500642044 -0.423086785115 +4724 0.4724 1.7143548161396400 -0.324234723598 +4725 0.4725 1.7143822975959044 -0.225394401690 +4726 0.4726 1.7143998956448445 -0.126566577112 +4727 0.4727 1.7144076115743130 -0.027752012259 +4728 0.4728 1.7144054467486349 0.071048525820 +4729 0.4729 1.7143934026090728 0.169834265423 +4730 0.4730 1.7143714806742905 0.268604430226 +4731 0.4731 1.7143396825408146 0.367358239290 +4732 0.4732 1.7142980098834961 0.466094907078 +4733 0.4733 1.7142464644559685 0.564813643476 +4734 0.4734 1.7141850480911045 0.663513653802 +4735 0.4735 1.7141137627014726 0.762194138833 +4736 0.4736 1.7140326102797905 0.860854294812 +4737 0.4737 1.7139415928993760 0.959493313476 +4738 0.4738 1.7138407127145989 1.058110382065 +4739 0.4739 1.7137299719613284 1.156704683346 +4740 0.4740 1.7136093729573798 1.255275395627 +4741 0.4741 1.7134789181029593 1.353821692782 +4742 0.4742 1.7133386098811070 1.452342744266 +4743 0.4743 1.7131884508581370 1.550837715132 +4744 0.4744 1.7130284436840775 1.649305766057 +4745 0.4745 1.7128585910931067 1.747746053358 +4746 0.4746 1.7126788959039878 1.846157729018 +4747 0.4747 1.7124893610205023 1.944539940693 +4748 0.4748 1.7122899894318802 2.042891831749 +4749 0.4749 1.7120807842132288 2.141212541275 +4750 0.4750 1.7118617485259600 2.239501204102 +4751 0.4751 1.7116328856182133 2.337756950831 +4752 0.4752 1.7113941988252790 2.435978907855 +4753 0.4753 1.7111456915700176 2.534166197373 +4754 0.4754 1.7108873673632778 2.632317937422 +4755 0.4755 1.7106192298043121 2.730433241894 +4756 0.4756 1.7103412825811892 2.828511220563 +4757 0.4757 1.7100535294712058 2.926550979107 +4758 0.4758 1.7097559743412942 3.024551619125 +4759 0.4759 1.7094486211484294 3.122512238173 +4760 0.4760 1.7091314739400318 3.220431929781 +4761 0.4761 1.7088045368543689 3.318309783475 +4762 0.4762 1.7084678141209548 3.416144884807 +4763 0.4763 1.7081213100609454 3.513936315381 +4764 0.4764 1.7077650290875328 3.611683152871 +4765 0.4765 1.7073989757063368 3.709384471050 +4766 0.4766 1.7070231545157935 3.807039339817 +4767 0.4767 1.7066375702075416 3.904646825222 +4768 0.4768 1.7062422275668059 4.002205989494 +4769 0.4769 1.7058371314727783 4.099715891060 +4770 0.4770 1.7054222868989961 4.197175584581 +4771 0.4771 1.7049976989137186 4.294584120971 +4772 0.4772 1.7045633726802984 4.391940547432 +4773 0.4773 1.7041193134575532 4.489243907474 +4774 0.4774 1.7036655266001324 4.586493240942 +4775 0.4775 1.7032020175588822 4.683687584060 +4776 0.4776 1.7027287918812080 4.780825969426 +4777 0.4777 1.7022458552114328 4.877907426077 +4778 0.4778 1.7017532132911544 4.974930979490 +4779 0.4779 1.7012508719595985 5.071895651629 +4780 0.4780 1.7007388371539689 5.168800460962 +4781 0.4781 1.7002171149097962 5.265644422491 +4782 0.4782 1.6996857113612822 5.362426547789 +4783 0.4783 1.6991446327416415 5.459145845023 +4784 0.4784 1.6985938853834412 5.555801318983 +4785 0.4785 1.6980334757189364 5.652391971116 +4786 0.4786 1.6974634102804029 5.748916799553 +4787 0.4787 1.6968836957004680 5.845374799144 +4788 0.4788 1.6962943387124370 5.941764961479 +4789 0.4789 1.6956953461506166 6.038086274930 +4790 0.4790 1.6950867249506365 6.134337724672 +4791 0.4791 1.6944684821497669 6.230518292720 +4792 0.4792 1.6938406248872329 6.326626957958 +4793 0.4793 1.6932031604045261 6.422662696175 +4794 0.4794 1.6925560960457131 6.518624480085 +4795 0.4795 1.6918994392577404 6.614511279370 +4796 0.4796 1.6912331975907362 6.710322060713 +4797 0.4797 1.6905573786983097 6.806055787817 +4798 0.4798 1.6898719903378463 6.901711421453 +4799 0.4799 1.6891770403707997 6.997287919480 +4800 0.4800 1.6884725367629814 7.092784236886 +4801 0.4801 1.6877584875848461 7.188199325819 +4802 0.4802 1.6870349010117744 7.283532135615 +4803 0.4803 1.6863017853243518 7.378781612838 +4804 0.4804 1.6855591489086446 7.473946701308 +4805 0.4805 1.6848070002564721 7.569026342142 +4806 0.4806 1.6840453479656763 7.664019473775 +4807 0.4807 1.6832742007403869 7.758925032011 +4808 0.4808 1.6824935673912844 7.853741950037 +4809 0.4809 1.6817034568358589 7.948469158474 +4810 0.4810 1.6809038780986649 8.043105585407 +4811 0.4811 1.6800948403115741 8.137650156412 +4812 0.4812 1.6792763527140235 8.232101794597 +4813 0.4813 1.6784484246532616 8.326459420641 +4814 0.4814 1.6776110655845886 8.420721952817 +4815 0.4815 1.6767642850715958 8.514888307039 +4816 0.4816 1.6759080927863994 8.608957396889 +4817 0.4817 1.6750424985098720 8.702928133659 +4818 0.4818 1.6741675121318702 8.796799426377 +4819 0.4819 1.6732831436514586 8.890570181854 +4820 0.4820 1.6723894031771303 8.984239304712 +4821 0.4821 1.6714863009270235 9.077805697424 +4822 0.4822 1.6705738472291352 9.171268260344 +4823 0.4823 1.6696520525215304 9.264625891753 +4824 0.4824 1.6687209273525485 9.357877487884 +4825 0.4825 1.6677804823810058 9.451021942971 +4826 0.4826 1.6668307283763937 9.544058149271 +4827 0.4827 1.6658716762190744 9.636984997114 +4828 0.4828 1.6649033369004720 9.729801374933 +4829 0.4829 1.6639257215232603 9.822506169300 +4830 0.4830 1.6629388413015471 9.915098264965 +4831 0.4831 1.6619427075610540 10.007576544897 +4832 0.4832 1.6609373317392935 10.099939890313 +4833 0.4833 1.6599227253857416 10.192187180724 +4834 0.4834 1.6588989001620074 10.284317293962 +4835 0.4835 1.6578658678419980 10.376329106228 +4836 0.4836 1.6568236403120802 10.468221492129 +4837 0.4837 1.6557722295712385 10.559993324703 +4838 0.4838 1.6547116477312296 10.651643475475 +4839 0.4839 1.6536419070167319 10.743170814481 +4840 0.4840 1.6525630197654924 10.834574210310 +4841 0.4841 1.6514749984284693 10.925852530150 +4842 0.4842 1.6503778555699711 11.017004639814 +4843 0.4843 1.6492716038677910 11.108029403786 +4844 0.4844 1.6481562561133389 11.198925685257 +4845 0.4845 1.6470318252117679 11.289692346164 +4846 0.4846 1.6458983241820984 11.380328247227 +4847 0.4847 1.6447557661573375 11.470832247991 +4848 0.4848 1.6436041643845947 11.561203206866 +4849 0.4849 1.6424435322251936 11.651439981155 +4850 0.4850 1.6412738831547804 11.741541427110 +4851 0.4851 1.6400952307634271 11.831506399954 +4852 0.4852 1.6389075887557327 11.921333753936 +4853 0.4853 1.6377109709509183 12.011022342354 +4854 0.4854 1.6365053912829202 12.100571017609 +4855 0.4855 1.6352908638004779 12.189978631235 +4856 0.4856 1.6340674026672191 12.279244033942 +4857 0.4857 1.6328350221617394 12.368366075652 +4858 0.4858 1.6315937366776794 12.457343605546 +4859 0.4859 1.6303435607237973 12.546175472096 +4860 0.4860 1.6290845089240371 12.634860523105 +4861 0.4861 1.6278165960175941 12.723397605754 +4862 0.4862 1.6265398368589747 12.811785566635 +4863 0.4863 1.6252542464180535 12.900023251790 +4864 0.4864 1.6239598397801260 12.988109506758 +4865 0.4865 1.6226566321459577 13.076043176607 +4866 0.4866 1.6213446388318282 13.163823105980 +4867 0.4867 1.6200238752695726 13.251448139131 +4868 0.4868 1.6186943570066177 13.338917119966 +4869 0.4869 1.6173560997060150 13.426228892087 +4870 0.4870 1.6160091191464694 13.513382298825 +4871 0.4871 1.6146534312223639 13.600376183285 +4872 0.4872 1.6132890519437804 13.687209388388 +4873 0.4873 1.6119159974365158 13.773880756905 +4874 0.4874 1.6105342839420953 13.860389131504 +4875 0.4875 1.6091439278177808 13.946733354784 +4876 0.4876 1.6077449455365755 14.032912269321 +4877 0.4877 1.6063373536872243 14.118924717705 +4878 0.4878 1.6049211689742098 14.204769542584 +4879 0.4879 1.6034964082177456 14.290445586698 +4880 0.4880 1.6020630883537645 14.375951692926 +4881 0.4881 1.6006212264339019 14.461286704326 +4882 0.4882 1.5991708396254773 14.546449464167 +4883 0.4883 1.5977119452114696 14.631438815985 +4884 0.4884 1.5962445605904900 14.716253603606 +4885 0.4885 1.5947687032767497 14.800892671202 +4886 0.4886 1.5932843909000234 14.885354863322 +4887 0.4887 1.5917916412056106 14.969639024935 +4888 0.4888 1.5902904720542901 15.053744001474 +4889 0.4889 1.5887809014222729 15.137668638871 +4890 0.4890 1.5872629474011493 15.221411783604 +4891 0.4891 1.5857366281978325 15.304972282731 +4892 0.4892 1.5842019621344992 15.388348983935 +4893 0.4893 1.5826589676485241 15.471540735565 +4894 0.4894 1.5811076632924121 15.554546386674 +4895 0.4895 1.5795480677337255 15.637364787061 +4896 0.4896 1.5779801997550067 15.719994787316 +4897 0.4897 1.5764040782536985 15.802435238849 +4898 0.4898 1.5748197222420590 15.884684993942 +4899 0.4899 1.5732271508470725 15.966742905789 +4900 0.4900 1.5716263833103568 16.048607828528 +4901 0.4901 1.5700174389880657 16.130278617293 +4902 0.4902 1.5684003373507889 16.211754128241 +4903 0.4903 1.5667750979834463 16.293033218610 +4904 0.4904 1.5651417405851786 16.374114746742 +4905 0.4905 1.5635002849692345 16.454997572138 +4906 0.4906 1.5618507510628532 16.535680555489 +4907 0.4907 1.5601931589071427 16.616162558720 +4908 0.4908 1.5585275286569549 16.696442445035 +4909 0.4909 1.5568538805807559 16.776519078944 +4910 0.4910 1.5551722350604926 16.856391326323 +4911 0.4911 1.5534826125914547 16.936058054437 +4912 0.4912 1.5517850337821333 17.015518131991 +4913 0.4913 1.5500795193540753 17.094770429170 +4914 0.4914 1.5483660901417335 17.173813817667 +4915 0.4915 1.5466447670923131 17.252647170743 +4916 0.4916 1.5449155712656135 17.331269363250 +4917 0.4917 1.5431785238338667 17.409679271688 +4918 0.4918 1.5414336460815710 17.487875774224 +4919 0.4919 1.5396809594053222 17.565857750752 +4920 0.4920 1.5379204853136383 17.643624082925 +4921 0.4921 1.5361522454267824 17.721173654192 +4922 0.4922 1.5343762614765803 17.798505349848 +4923 0.4923 1.5325925553062349 17.875618057059 +4924 0.4924 1.5308011488701361 17.952510664917 +4925 0.4925 1.5290020642336664 18.029182064476 +4926 0.4926 1.5271953235730034 18.105631148783 +4927 0.4927 1.5253809491749177 18.181856812931 +4928 0.4928 1.5235589634365667 18.257857954088 +4929 0.4929 1.5217293888652850 18.333633471545 +4930 0.4930 1.5198922480783701 18.409182266753 +4931 0.4931 1.5180475638028648 18.484503243355 +4932 0.4932 1.5161953588753350 18.559595307243 +4933 0.4933 1.5143356562416439 18.634457366577 +4934 0.4934 1.5124684789567229 18.709088331845 +4935 0.4935 1.5105938501843366 18.783487115882 +4936 0.4936 1.5087117931968461 18.857652633926 +4937 0.4937 1.5068223313749673 18.931583803650 +4938 0.4938 1.5049254882075247 19.005279545205 +4939 0.4939 1.5030212872912021 19.078738781247 +4940 0.4940 1.5011097523302899 19.151960436998 +4941 0.4941 1.4991909071364267 19.224943440264 +4942 0.4942 1.4972647756283390 19.297686721487 +4943 0.4943 1.4953313818315757 19.370189213780 +4944 0.4944 1.4933907498782386 19.442449852962 +4945 0.4945 1.4914429040067103 19.514467577603 +4946 0.4946 1.4894878685613770 19.586241329064 +4947 0.4947 1.4875256679923476 19.657770051522 +4948 0.4948 1.4855563268551701 19.729052692029 +4949 0.4949 1.4835798698105420 19.800088200535 +4950 0.4950 1.4815963216240189 19.870875529929 +4951 0.4951 1.4796057071657183 19.941413636084 +4952 0.4952 1.4776080514100196 20.011701477889 +4953 0.4953 1.4756033794352605 20.081738017291 +4954 0.4954 1.4735917164234296 20.151522219328 +4955 0.4955 1.4715730876598545 20.221053052173 +4956 0.4956 1.4695475185328875 20.290329487168 +4957 0.4957 1.4675150345335859 20.359350498861 +4958 0.4958 1.4654756612553903 20.428115065051 +4959 0.4959 1.4634294243937969 20.496622166816 +4960 0.4960 1.4613763497460284 20.564870788554 +4961 0.4961 1.4593164632106994 20.632859918025 +4962 0.4962 1.4572497907874791 20.700588546382 +4963 0.4963 1.4551763585767494 20.768055668211 +4964 0.4964 1.4530961927792603 20.835260281571 +4965 0.4965 1.4510093196957805 20.902201388023 +4966 0.4966 1.4489157657267455 20.968877992677 +4967 0.4967 1.4468155573719006 21.035289104220 +4968 0.4968 1.4447087212299417 21.101433734958 +4969 0.4969 1.4425952839981511 21.167310900855 +4970 0.4970 1.4404752724720304 21.232919621559 +4971 0.4971 1.4383487135449300 21.298258920451 +4972 0.4972 1.4362156342076737 21.363327824672 +4973 0.4973 1.4340760615481818 21.428125365166 +4974 0.4974 1.4319300227510880 21.492650576708 +4975 0.4975 1.4297775450973551 21.556902497949 +4976 0.4976 1.4276186559638853 21.620880171448 +4977 0.4977 1.4254533828231277 21.684582643705 +4978 0.4978 1.4232817532426825 21.748008965200 +4979 0.4979 1.4211037948849010 21.811158190428 +4980 0.4980 1.4189195355064830 21.874029377935 +4981 0.4981 1.4167290029580686 21.936621590351 +4982 0.4982 1.4145322251838297 21.998933894425 +4983 0.4983 1.4123292302210551 22.060965361066 +4984 0.4984 1.4101200461997332 22.122715065370 +4985 0.4985 1.4079047013421317 22.184182086657 +4986 0.4986 1.4056832239623733 22.245365508513 +4987 0.4987 1.4034556424660072 22.306264418812 +4988 0.4988 1.4012219853495786 22.366877909760 +4989 0.4989 1.3989822812001944 22.427205077926 +4990 0.4990 1.3967365586950842 22.487245024277 +4991 0.4991 1.3944848466011599 22.546996854210 +4992 0.4992 1.3922271737745699 22.606459677587 +4993 0.4993 1.3899635691602521 22.665632608769 +4994 0.4994 1.3876940617914810 22.724514766653 +4995 0.4995 1.3854186807894135 22.783105274698 +4996 0.4996 1.3831374553626303 22.841403260966 +4997 0.4997 1.3808504148066747 22.899407858148 +4998 0.4998 1.3785575885035872 22.957118203603 +4999 0.4999 1.3762590059214377 23.014533439390 +5000 0.5000 1.3739546966138534 23.071652712298 +5001 0.5001 1.3716446902195445 23.128475173879 +5002 0.5002 1.3693290164618264 23.184999980484 +5003 0.5003 1.3670077051481375 23.241226293292 +5004 0.5004 1.3646807861695558 23.297153278344 +5005 0.5005 1.3623482895003098 23.352780106574 +5006 0.5006 1.3600102451972891 23.408105953841 +5007 0.5007 1.3576666833995490 23.463130000962 +5008 0.5008 1.3553176343278139 23.517851433741 +5009 0.5009 1.3529631282839767 23.572269443006 +5010 0.5010 1.3506031956505948 23.626383224632 +5011 0.5011 1.3482378668903843 23.680191979581 +5012 0.5012 1.3458671725457090 23.733694913925 +5013 0.5013 1.3434911432380687 23.786891238882 +5014 0.5014 1.3411098096675822 23.839780170847 +5015 0.5015 1.3387232026124689 23.892360931420 +5016 0.5016 1.3363313529285261 23.944632747436 +5017 0.5017 1.3339342915486043 23.996594851000 +5018 0.5018 1.3315320494820788 24.048246479510 +5019 0.5019 1.3291246578143188 24.099586875693 +5020 0.5020 1.3267121477061525 24.150615287630 +5021 0.5021 1.3242945503933314 24.201330968791 +5022 0.5022 1.3218718971859889 24.251733178062 +5023 0.5023 1.3194442194680973 24.301821179769 +5024 0.5024 1.3170115486969232 24.351594243714 +5025 0.5025 1.3145739164024770 24.401051645207 +5026 0.5026 1.3121313541869626 24.450192665080 +5027 0.5027 1.3096838937242219 24.499016589736 +5028 0.5028 1.3072315667591772 24.547522711158 +5029 0.5029 1.3047744051072721 24.595710326946 +5030 0.5030 1.3023124406539071 24.643578740355 +5031 0.5031 1.2998457053538743 24.691127260301 +5032 0.5032 1.2973742312307888 24.738355201409 +5033 0.5033 1.2948980503765168 24.785261884028 +5034 0.5034 1.2924171949506023 24.831846634264 +5035 0.5035 1.2899316971796888 24.878108784007 +5036 0.5036 1.2874415893569409 24.924047670954 +5037 0.5037 1.2849469038414609 24.969662638645 +5038 0.5038 1.2824476730577048 25.014953036476 +5039 0.5039 1.2799439294948940 25.059918219741 +5040 0.5040 1.2774357057064247 25.104557549645 +5041 0.5041 1.2749230343092754 25.148870393339 +5042 0.5042 1.2724059479834116 25.192856123939 +5043 0.5043 1.2698844794711865 25.236514120560 +5044 0.5044 1.2673586615767416 25.279843768337 +5045 0.5045 1.2648285271654025 25.322844458447 +5046 0.5046 1.2622941091630731 25.365515588142 +5047 0.5047 1.2597554405556277 25.407856560766 +5048 0.5048 1.2572125543883002 25.449866785787 +5049 0.5049 1.2546654837650697 25.491545678820 +5050 0.5050 1.2521142618480463 25.532892661647 +5051 0.5051 1.2495589218568517 25.573907162247 +5052 0.5052 1.2469994970679985 25.614588614815 +5053 0.5053 1.2444360208142682 25.654936459791 +5054 0.5054 1.2418685264840845 25.694950143883 +5055 0.5055 1.2392970475208862 25.734629120084 +5056 0.5056 1.2367216174224969 25.773972847705 +5057 0.5057 1.2341422697404920 25.812980792392 +5058 0.5058 1.2315590380795649 25.851652426152 +5059 0.5059 1.2289719560968886 25.889987227373 +5060 0.5060 1.2263810575014775 25.927984680849 +5061 0.5061 1.2237863760535452 25.965644277798 +5062 0.5062 1.2211879455638606 26.002965515897 +5063 0.5063 1.2185857998931016 26.039947899284 +5064 0.5064 1.2159799729512075 26.076590938598 +5065 0.5065 1.2133704986967280 26.112894150991 +5066 0.5066 1.2107574111361710 26.148857060150 +5067 0.5067 1.2081407443233472 26.184479196325 +5068 0.5068 1.2055205323587139 26.219760096339 +5069 0.5069 1.2028968093887160 26.254699303619 +5070 0.5070 1.2002696096051244 26.289296368214 +5071 0.5071 1.1976389672443735 26.323550846807 +5072 0.5072 1.1950049165868957 26.357462302750 +5073 0.5073 1.1923674919564544 26.391030306073 +5074 0.5074 1.1897267277194754 26.424254433507 +5075 0.5075 1.1870826582843748 26.457134268504 +5076 0.5076 1.1844353181008866 26.489669401257 +5077 0.5077 1.1817847416593878 26.521859428718 +5078 0.5078 1.1791309634902210 26.553703954618 +5079 0.5079 1.1764740181630160 26.585202589483 +5080 0.5080 1.1738139402860090 26.616354950658 +5081 0.5081 1.1711507645053600 26.647160662323 +5082 0.5082 1.1684845255044687 26.677619355504 +5083 0.5083 1.1658152580032881 26.707730668106 +5084 0.5084 1.1631429967576370 26.737494244917 +5085 0.5085 1.1604677765585096 26.766909737632 +5086 0.5086 1.1577896322313845 26.795976804870 +5087 0.5087 1.1551085986355316 26.824695112190 +5088 0.5088 1.1524247106633168 26.853064332106 +5089 0.5089 1.1497380032395059 26.881084144111 +5090 0.5090 1.1470485113205662 26.908754234684 +5091 0.5091 1.1443562698939664 26.936074297312 +5092 0.5092 1.1416613139774756 26.963044032506 +5093 0.5093 1.1389636786184596 26.989663147816 +5094 0.5094 1.1362633988931767 27.015931357842 +5095 0.5095 1.1335605099060715 27.041848384261 +5096 0.5096 1.1308550467890670 27.067413955829 +5097 0.5097 1.1281470447008553 27.092627808408 +5098 0.5098 1.1254365388261864 27.117489684967 +5099 0.5099 1.1227235643751576 27.141999335610 +5100 0.5100 1.1200081565824980 27.166156517585 +5101 0.5101 1.1172903507068539 27.189960995296 +5102 0.5102 1.1145701820300731 27.213412540320 +5103 0.5103 1.1118476858564861 27.236510931418 +5104 0.5104 1.1091228975121876 27.259255954551 +5105 0.5105 1.1063958523443154 27.281647402894 +5106 0.5106 1.1036665857203285 27.303685076844 +5107 0.5107 1.1009351330272843 27.325368784040 +5108 0.5108 1.0982015296711138 27.346698339369 +5109 0.5109 1.0954658110758964 27.367673564981 +5110 0.5110 1.0927280126831320 27.388294290304 +5111 0.5111 1.0899881699510143 27.408560352052 +5112 0.5112 1.0872463183536998 27.428471594237 +5113 0.5113 1.0845024933805789 27.448027868182 +5114 0.5114 1.0817567305355431 27.467229032533 +5115 0.5115 1.0790090653362532 27.486074953267 +5116 0.5116 1.0762595333134046 27.504565503706 +5117 0.5117 1.0735081700099929 27.522700564527 +5118 0.5118 1.0707550109805781 27.540480023767 +5119 0.5119 1.0680000917905474 27.557903776845 +5120 0.5120 1.0652434480153772 27.574971726560 +5121 0.5121 1.0624851152398940 27.591683783105 +5122 0.5122 1.0597251290575347 27.608039864079 +5123 0.5123 1.0569635250696061 27.624039894494 +5124 0.5124 1.0542003388845422 27.639683806784 +5125 0.5125 1.0514356061171624 27.654971540812 +5126 0.5126 1.0486693623879275 27.669903043883 +5127 0.5127 1.0459016433221959 27.684478270749 +5128 0.5128 1.0431324845494776 27.698697183616 +5129 0.5129 1.0403619217026889 27.712559752158 +5130 0.5130 1.0375899904174051 27.726065953518 +5131 0.5131 1.0348167263311132 27.739215772317 +5132 0.5132 1.0320421650824643 27.752009200664 +5133 0.5133 1.0292663423105231 27.764446238160 +5134 0.5134 1.0264892936540198 27.776526891907 +5135 0.5135 1.0237110547505988 27.788251176512 +5136 0.5136 1.0209316612360684 27.799619114096 +5137 0.5137 1.0181511487436488 27.810630734296 +5138 0.5138 1.0153695529032201 27.821286074277 +5139 0.5139 1.0125869093405695 27.831585178733 +5140 0.5140 1.0098032536766381 27.841528099892 +5141 0.5141 1.0070186215267674 27.851114897523 +5142 0.5142 1.0042330484999442 27.860345638942 +5143 0.5143 1.0014465701980464 27.869220399013 +5144 0.5144 0.9986592222150877 27.877739260158 +5145 0.5145 0.9958710401364621 27.885902312354 +5146 0.5146 0.9930820595381874 27.893709653140 +5147 0.5147 0.9902923159861491 27.901161387627 +5148 0.5148 0.9875018450353431 27.908257628492 +5149 0.5149 0.9847106822291193 27.914998495984 +5150 0.5150 0.9819188630984234 27.921384117934 +5151 0.5151 0.9791264231610395 27.927414629744 +5152 0.5152 0.9763333979208321 27.933090174405 +5153 0.5153 0.9735398228669875 27.938410902487 +5154 0.5154 0.9707457334732557 27.943376972149 +5155 0.5155 0.9679511651971913 27.947988549138 +5156 0.5156 0.9651561534793950 27.952245806788 +5157 0.5157 0.9623607337427542 27.956148926027 +5158 0.5158 0.9595649413916842 27.959698095372 +5159 0.5159 0.9567688118113687 27.962893510938 +5160 0.5160 0.9539723803670004 27.965735376429 +5161 0.5161 0.9511756824030216 27.968223903146 +5162 0.5162 0.9483787532423652 27.970359309983 +5163 0.5163 0.9455816281856945 27.972141823432 +5164 0.5164 0.9427843425106442 27.973571677572 +5165 0.5165 0.9399869314710614 27.974649114085 +5166 0.5166 0.9371894302962451 27.975374382240 +5167 0.5167 0.9343918741901882 27.975747738899 +5168 0.5168 0.9315942983308173 27.975769448518 +5169 0.5169 0.9287967378692344 27.975439783139 +5170 0.5170 0.9259992279289578 27.974759022394 +5171 0.5171 0.9232018036051631 27.973727453501 +5172 0.5172 0.9204044999639249 27.972345371263 +5173 0.5173 0.9176073520414587 27.970613078062 +5174 0.5174 0.9148103948433626 27.968530883861 +5175 0.5175 0.9120136633438596 27.966099106199 +5176 0.5176 0.9092171924850402 27.963318070189 +5177 0.5177 0.9064210171761052 27.960188108511 +5178 0.5178 0.9036251722926090 27.956709561415 +5179 0.5179 0.9008296926757026 27.952882776713 +5180 0.5180 0.8980346131313782 27.948708109773 +5181 0.5181 0.8952399684297134 27.944185923522 +5182 0.5182 0.8924457933041158 27.939316588432 +5183 0.5183 0.8896521224505679 27.934100482525 +5184 0.5184 0.8868589905268737 27.928537991360 +5185 0.5185 0.8840664321519041 27.922629508033 +5186 0.5186 0.8812744819048440 27.916375433168 +5187 0.5187 0.8784831743244398 27.909776174916 +5188 0.5188 0.8756925439082467 27.902832148946 +5189 0.5189 0.8729026251118776 27.895543778436 +5190 0.5190 0.8701134523482521 27.887911494074 +5191 0.5191 0.8673250599868462 27.879935734044 +5192 0.5192 0.8645374823529427 27.871616944026 +5193 0.5193 0.8617507537268823 27.862955577183 +5194 0.5194 0.8589649083433153 27.853952094156 +5195 0.5195 0.8561799803904545 27.844606963059 +5196 0.5196 0.8533960040093281 27.834920659468 +5197 0.5197 0.8506130132930341 27.824893666413 +5198 0.5198 0.8478310422859948 27.814526474373 +5199 0.5199 0.8450501249832131 27.803819581262 +5200 0.5200 0.8422702953295286 27.792773492429 +5201 0.5201 0.8394915872188752 27.781388720638 +5202 0.5202 0.8367140344935398 27.769665786071 +5203 0.5203 0.8339376709434209 27.757605216308 +5204 0.5204 0.8311625303052894 27.745207546322 +5205 0.5205 0.8283886462620499 27.732473318469 +5206 0.5206 0.8256160524420024 27.719403082480 +5207 0.5207 0.8228447824181060 27.705997395448 +5208 0.5208 0.8200748697072429 27.692256821815 +5209 0.5209 0.8173063477694836 27.678181933369 +5210 0.5210 0.8145392500073539 27.663773309225 +5211 0.5211 0.8117736097651017 27.649031535819 +5212 0.5212 0.8090094603279661 27.633957206895 +5213 0.5213 0.8062468349214469 27.618550923489 +5214 0.5214 0.8034857667105761 27.602813293925 +5215 0.5215 0.8007262887991899 27.586744933798 +5216 0.5216 0.7979684342292018 27.570346465964 +5217 0.5217 0.7952122359798776 27.553618520521 +5218 0.5218 0.7924577269671111 27.536561734808 +5219 0.5219 0.7897049400427018 27.519176753379 +5220 0.5220 0.7869539079936329 27.501464227999 +5221 0.5221 0.7842046635413515 27.483424817627 +5222 0.5222 0.7814572393410500 27.465059188404 +5223 0.5223 0.7787116679809482 27.446368013633 +5224 0.5224 0.7759679819815779 27.427351973773 +5225 0.5225 0.7732262137950683 27.408011756419 +5226 0.5226 0.7704863958044328 27.388348056292 +5227 0.5227 0.7677485603228573 27.368361575218 +5228 0.5228 0.7650127395929904 27.348053022120 +5229 0.5229 0.7622789657862348 27.327423112994 +5230 0.5230 0.7595472710020399 27.306472570904 +5231 0.5231 0.7568176872671969 27.285202125955 +5232 0.5232 0.7540902465351348 27.263612515287 +5233 0.5233 0.7513649806852178 27.241704483052 +5234 0.5234 0.7486419215220452 27.219478780400 +5235 0.5235 0.7459211007747520 27.196936165464 +5236 0.5236 0.7432025500963119 27.174077403340 +5237 0.5237 0.7404863010628414 27.150903266068 +5238 0.5238 0.7377723851729069 27.127414532623 +5239 0.5239 0.7350608338468312 27.103611988891 +5240 0.5240 0.7323516784260042 27.079496427649 +5241 0.5241 0.7296449501721941 27.055068648554 +5242 0.5242 0.7269406802668604 27.030329458119 +5243 0.5243 0.7242388998104696 27.005279669698 +5244 0.5244 0.7215396398218115 26.979920103465 +5245 0.5245 0.7188429312373185 26.954251586395 +5246 0.5246 0.7161488049103862 26.928274952249 +5247 0.5247 0.7134572916106964 26.901991041548 +5248 0.5248 0.7107684220235410 26.875400701560 +5249 0.5249 0.7080822267491491 26.848504786276 +5250 0.5250 0.7053987363020159 26.821304156389 +5251 0.5251 0.7027179811102325 26.793799679279 +5252 0.5252 0.7000399915148192 26.765992228988 +5253 0.5253 0.6973647977690597 26.737882686202 +5254 0.5254 0.6946924300378382 26.709471938227 +5255 0.5255 0.6920229183969783 26.680760878971 +5256 0.5256 0.6893562928325836 26.651750408922 +5257 0.5257 0.6866925832403813 26.622441435124 +5258 0.5258 0.6840318194250671 26.592834871160 +5259 0.5259 0.6813740310996528 26.562931637126 +5260 0.5260 0.6787192478848161 26.532732659609 +5261 0.5261 0.6760674993082523 26.502238871667 +5262 0.5262 0.6734188148040287 26.471451212805 +5263 0.5263 0.6707732237119408 26.440370628952 +5264 0.5264 0.6681307552768713 26.408998072439 +5265 0.5265 0.6654914386481506 26.377334501974 +5266 0.5266 0.6628553028789209 26.345380882621 +5267 0.5267 0.6602223769255012 26.313138185772 +5268 0.5268 0.6575926896467561 26.280607389131 +5269 0.5269 0.6549662698034655 26.247789476681 +5270 0.5270 0.6523431460576982 26.214685438665 +5271 0.5271 0.6497233469721869 26.181296271559 +5272 0.5272 0.6471069010097065 26.147622978051 +5273 0.5273 0.6444938365324533 26.113666567013 +5274 0.5274 0.6418841818014289 26.079428053474 +5275 0.5275 0.6392779649758251 26.044908458601 +5276 0.5276 0.6366752141124117 26.010108809667 +5277 0.5277 0.6340759571649269 25.975030140028 +5278 0.5278 0.6314802219834705 25.939673489099 +5279 0.5279 0.6288880363138993 25.904039902324 +5280 0.5280 0.6262994277972256 25.868130431152 +5281 0.5281 0.6237144239690174 25.831946133011 +5282 0.5282 0.6211330522588030 25.795488071278 +5283 0.5283 0.6185553399894763 25.758757315256 +5284 0.5284 0.6159813143767062 25.721754940145 +5285 0.5285 0.6134110025283481 25.684482027016 +5286 0.5286 0.6108444314438585 25.646939662777 +5287 0.5287 0.6082816280137117 25.609128940159 +5288 0.5288 0.6057226190188201 25.571050957672 +5289 0.5289 0.6031674311299571 25.532706819587 +5290 0.5290 0.6006160909071824 25.494097635907 +5291 0.5291 0.5980686247992704 25.455224522334 +5292 0.5292 0.5955250591431415 25.416088600244 +5293 0.5293 0.5929854201632964 25.376690996657 +5294 0.5294 0.5904497339712531 25.337032844207 +5295 0.5295 0.5879180265649872 25.297115281112 +5296 0.5296 0.5853903238283740 25.256939451151 +5297 0.5297 0.5828666515306352 25.216506503623 +5298 0.5298 0.5803470353257877 25.175817593328 +5299 0.5299 0.5778315007520948 25.134873880531 +5300 0.5300 0.5753200732315217 25.093676530932 +5301 0.5301 0.5728127780691933 25.052226715636 +5302 0.5302 0.5703096404528551 25.010525611126 +5303 0.5303 0.5678106854523376 24.968574399226 +5304 0.5304 0.5653159380190226 24.926374267075 +5305 0.5305 0.5628254229853142 24.883926407092 +5306 0.5306 0.5603391650641123 24.841232016947 +5307 0.5307 0.5578571888482884 24.798292299531 +5308 0.5308 0.5553795188101659 24.755108462919 +5309 0.5309 0.5529061793010028 24.711681720342 +5310 0.5310 0.5504371945504779 24.668013290157 +5311 0.5311 0.5479725886661798 24.624104395805 +5312 0.5312 0.5455123856330999 24.579956265793 +5313 0.5313 0.5430566093131278 24.535570133649 +5314 0.5314 0.5406052834445507 24.490947237893 +5315 0.5315 0.5381584316415556 24.446088822008 +5316 0.5316 0.5357160773937352 24.400996134401 +5317 0.5317 0.5332782440655965 24.355670428371 +5318 0.5318 0.5308449548960740 24.310112962081 +5319 0.5319 0.5284162329980442 24.264324998515 +5320 0.5320 0.5259921013578459 24.218307805451 +5321 0.5321 0.5235725828348021 24.172062655424 +5322 0.5322 0.5211577001607464 24.125590825692 +5323 0.5323 0.5187474759395515 24.078893598205 +5324 0.5324 0.5163419326466631 24.031972259563 +5325 0.5325 0.5139410926286354 23.984828100989 +5326 0.5326 0.5115449781026714 23.937462418290 +5327 0.5327 0.5091536111561659 23.889876511820 +5328 0.5328 0.5067670137462522 23.842071686452 +5329 0.5329 0.5043852076993529 23.794049251535 +5330 0.5330 0.5020082147107332 23.745810520860 +5331 0.5331 0.4996360563440589 23.697356812627 +5332 0.5332 0.4972687540309572 23.648689449408 +5333 0.5333 0.4949063290705812 23.599809758110 +5334 0.5334 0.4925488026291788 23.550719069939 +5335 0.5335 0.4901961957396637 23.501418720362 +5336 0.5336 0.4878485293011918 23.451910049076 +5337 0.5337 0.4855058240787399 23.402194399963 +5338 0.5338 0.4831681007026888 23.352273121059 +5339 0.5339 0.4808353796684099 23.302147564518 +5340 0.5340 0.4785076813358557 23.251819086567 +5341 0.5341 0.4761850259291535 23.201289047478 +5342 0.5342 0.4738674335362033 23.150558811525 +5343 0.5343 0.4715549241082798 23.099629746945 +5344 0.5344 0.4692475174596373 23.048503225906 +5345 0.5345 0.4669452332671188 22.997180624464 +5346 0.5346 0.4646480910697693 22.945663322526 +5347 0.5347 0.4623561102684524 22.893952703813 +5348 0.5348 0.4600693101254707 22.842050155820 +5349 0.5349 0.4577877097641908 22.789957069779 +5350 0.5350 0.4555113281686709 22.737674840618 +5351 0.5351 0.4532401841832938 22.685204866924 +5352 0.5352 0.4509742965124024 22.632548550904 +5353 0.5353 0.4487136837199400 22.579707298344 +5354 0.5354 0.4464583642290942 22.526682518571 +5355 0.5355 0.4442083563219449 22.473475624415 +5356 0.5356 0.4419636781391160 22.420088032163 +5357 0.5357 0.4397243476794313 22.366521161531 +5358 0.5358 0.4374903827995743 22.312776435610 +5359 0.5359 0.4352618012137519 22.258855280838 +5360 0.5360 0.4330386204933623 22.204759126952 +5361 0.5361 0.4308208580666671 22.150489406952 +5362 0.5362 0.4286085312184666 22.096047557058 +5363 0.5363 0.4264016570897802 22.041435016670 +5364 0.5364 0.4242002526775303 21.986653228330 +5365 0.5365 0.4220043348342299 21.931703637676 +5366 0.5366 0.4198139202676758 21.876587693406 +5367 0.5367 0.4176290255406439 21.821306847233 +5368 0.5368 0.4154496670705900 21.765862553845 +5369 0.5369 0.4132758611293543 21.710256270868 +5370 0.5370 0.4111076238428701 21.654489458816 +5371 0.5371 0.4089449711908765 21.598563581056 +5372 0.5372 0.4067879190066355 21.542480103764 +5373 0.5373 0.4046364829766531 21.486240495884 +5374 0.5374 0.4024906786404048 21.429846229082 +5375 0.5375 0.4003505213900651 21.373298777713 +5376 0.5376 0.3982160264702411 21.316599618767 +5377 0.5377 0.3960872089777110 21.259750231835 +5378 0.5378 0.3939640838611660 21.202752099065 +5379 0.5379 0.3918466659209570 21.145606705116 +5380 0.5380 0.3897349698088451 21.088315537121 +5381 0.5381 0.3876290100277572 21.030880084637 +5382 0.5382 0.3855288009315450 20.973301839609 +5383 0.5383 0.3834343567247485 20.915582296321 +5384 0.5384 0.3813456914623645 20.857722951359 +5385 0.5385 0.3792628190496184 20.799725303561 +5386 0.5386 0.3771857532417415 20.741590853979 +5387 0.5387 0.3751145076437509 20.683321105833 +5388 0.5388 0.3730490957102359 20.624917564467 +5389 0.5389 0.3709895307451472 20.566381737306 +5390 0.5390 0.3689358259015912 20.507715133815 +5391 0.5391 0.3668879941816280 20.448919265448 +5392 0.5392 0.3648460484360751 20.389995645611 +5393 0.5393 0.3628100013643138 20.330945789615 +5394 0.5394 0.3607798655141015 20.271771214631 +5395 0.5395 0.3587556532813876 20.212473439646 +5396 0.5396 0.3567373769101344 20.153053985420 +5397 0.5397 0.3547250484921413 20.093514374442 +5398 0.5398 0.3527186799668752 20.033856130880 +5399 0.5399 0.3507182831213040 19.974080780544 +5400 0.5400 0.3487238695897351 19.914189850835 +5401 0.5401 0.3467354508536581 19.854184870704 +5402 0.5402 0.3447530382415928 19.794067370603 +5403 0.5403 0.3427766429289403 19.733838882446 +5404 0.5404 0.3408062759378402 19.673500939556 +5405 0.5405 0.3388419481370311 19.613055076627 +5406 0.5406 0.3368836702417161 19.552502829674 +5407 0.5407 0.3349314528134329 19.491845735989 +5408 0.5408 0.3329853062599286 19.431085334097 +5409 0.5409 0.3310452408350384 19.370223163708 +5410 0.5410 0.3291112666385695 19.309260765670 +5411 0.5411 0.3271833936161895 19.248199681929 +5412 0.5412 0.3252616315593192 19.187041455478 +5413 0.5413 0.3233459901050297 19.125787630312 +5414 0.5414 0.3214364787359448 19.064439751385 +5415 0.5415 0.3195331067801477 19.002999364558 +5416 0.5416 0.3176358834110918 18.941468016559 +5417 0.5417 0.3157448176475172 18.879847254934 +5418 0.5418 0.3138599183533705 18.818138628000 +5419 0.5419 0.3119811942377305 18.756343684799 +5420 0.5420 0.3101086538547378 18.694463975055 +5421 0.5421 0.3082423056035290 18.632501049121 +5422 0.5422 0.3063821577281760 18.570456457939 +5423 0.5423 0.3045282183176297 18.508331752987 +5424 0.5424 0.3026804953056684 18.446128486240 +5425 0.5425 0.3008389964708507 18.383848210114 +5426 0.5426 0.2990037294364735 18.321492477429 +5427 0.5427 0.2971747016705344 18.259062841354 +5428 0.5428 0.2953519204856985 18.196560855363 +5429 0.5429 0.2935353930392709 18.133988073190 +5430 0.5430 0.2917251263331723 18.071346048781 +5431 0.5431 0.2899211272139210 18.008636336244 +5432 0.5432 0.2881234023726186 17.945860489804 +5433 0.5433 0.2863319583449406 17.883020063757 +5434 0.5434 0.2845468015111317 17.820116612421 +5435 0.5435 0.2827679380960061 17.757151690089 +5436 0.5436 0.2809953741689526 17.694126850982 +5437 0.5437 0.2792291156439434 17.631043649202 +5438 0.5438 0.2774691682795491 17.567903638683 +5439 0.5439 0.2757155376789576 17.504708373146 +5440 0.5440 0.2739682292899980 17.441459406047 +5441 0.5441 0.2722272484051689 17.378158290535 +5442 0.5442 0.2704926001616720 17.314806579402 +5443 0.5443 0.2687642895414503 17.251405825033 +5444 0.5444 0.2670423213712305 17.187957579363 +5445 0.5445 0.2653267003225711 17.124463393825 +5446 0.5446 0.2636174309119145 17.060924819305 +5447 0.5447 0.2619145175006447 16.997343406091 +5448 0.5448 0.2602179642951486 16.933720703831 +5449 0.5449 0.2585277753468831 16.870058261478 +5450 0.5450 0.2568439545524469 16.806357627248 +5451 0.5451 0.2551665056536560 16.742620348570 +5452 0.5452 0.2534954322376257 16.678847972036 +5453 0.5453 0.2518307377368560 16.615042043356 +5454 0.5454 0.2501724254293228 16.551204107309 +5455 0.5455 0.2485204984385726 16.487335707694 +5456 0.5456 0.2468749597338236 16.423438387286 +5457 0.5457 0.2452358121300703 16.359513687780 +5458 0.5458 0.2436030582881936 16.295563149753 +5459 0.5459 0.2419767007150757 16.231588312607 +5460 0.5460 0.2403567417637190 16.167590714527 +5461 0.5461 0.2387431836333712 16.103571892428 +5462 0.5462 0.2371360283696541 16.039533381914 +5463 0.5463 0.2355352778646973 15.975476717222 +5464 0.5464 0.2339409338572772 15.911403431179 +5465 0.5465 0.2323529979329608 15.847315055150 +5466 0.5466 0.2307714715242535 15.783213118995 +5467 0.5467 0.2291963559107529 15.719099151018 +5468 0.5468 0.2276276522193062 15.654974677916 +5469 0.5469 0.2260653614241736 15.590841224736 +5470 0.5470 0.2245094843471955 15.526700314825 +5471 0.5471 0.2229600216579652 15.462553469781 +5472 0.5472 0.2214169738740059 15.398402209405 +5473 0.5473 0.2198803413609531 15.334248051652 +5474 0.5474 0.2183501243327410 15.270092512589 +5475 0.5475 0.2168263228517947 15.205937106337 +5476 0.5476 0.2153089368292263 15.141783345031 +5477 0.5477 0.2137979660250364 15.077632738768 +5478 0.5478 0.2122934100483200 15.013486795560 +5479 0.5479 0.2107952683574777 14.949347021286 +5480 0.5480 0.2093035402604311 14.885214919645 +5481 0.5481 0.2078182249148436 14.821091992105 +5482 0.5482 0.2063393213283455 14.756979737858 +5483 0.5483 0.2048668283587640 14.692879653771 +5484 0.5484 0.2034007447143585 14.628793234338 +5485 0.5485 0.2019410689540600 14.564721971632 +5486 0.5486 0.2004877994877156 14.500667355256 +5487 0.5487 0.1990409345763378 14.436630872300 +5488 0.5488 0.1976004723323586 14.372614007285 +5489 0.5489 0.1961664107198882 14.308618242123 +5490 0.5490 0.1947387475549788 14.244645056065 +5491 0.5491 0.1933174805058928 14.180695925654 +5492 0.5492 0.1919026070933763 14.116772324678 +5493 0.5493 0.1904941246909363 14.052875724121 +5494 0.5494 0.1890920305251244 13.989007592117 +5495 0.5495 0.1876963216758234 13.925169393902 +5496 0.5496 0.1863069950765400 13.861362591766 +5497 0.5497 0.1849240475147015 13.797588645005 +5498 0.5498 0.1835474756319575 13.733849009875 +5499 0.5499 0.1821772759244865 13.670145139544 +5500 0.5500 0.1808134447433072 13.606478484043 +5501 0.5501 0.1794559782945939 13.542850490223 +5502 0.5502 0.1781048726399977 13.479262601701 +5503 0.5503 0.1767601236969716 13.415716258821 +5504 0.5504 0.1754217272391005 13.352212898599 +5505 0.5505 0.1740896788964365 13.288753954681 +5506 0.5506 0.1727639741558376 13.225340857297 +5507 0.5507 0.1714446083613125 13.161975033206 +5508 0.5508 0.1701315767143692 13.098657905660 +5509 0.5509 0.1688248742743688 13.035390894347 +5510 0.5510 0.1675244959588838 12.972175415354 +5511 0.5511 0.1662304365440605 12.909012881111 +5512 0.5512 0.1649426906649874 12.845904700352 +5513 0.5513 0.1636612528160667 12.782852278062 +5514 0.5514 0.1623861173513918 12.719857015435 +5515 0.5515 0.1611172784851287 12.656920309827 +5516 0.5516 0.1598547302919019 12.594043554709 +5517 0.5517 0.1585984667071856 12.531228139617 +5518 0.5518 0.1573484815276991 12.468475450114 +5519 0.5519 0.1561047684118065 12.405786867737 +5520 0.5520 0.1548673208799220 12.343163769953 +5521 0.5521 0.1536361323149187 12.280607530114 +5522 0.5522 0.1524111959625425 12.218119517408 +5523 0.5523 0.1511925049318311 12.155701096820 +5524 0.5524 0.1499800521955363 12.093353629078 +5525 0.5525 0.1487738305905517 12.031078470613 +5526 0.5526 0.1475738328183455 11.968876973512 +5527 0.5527 0.1463800514453963 11.906750485472 +5528 0.5528 0.1451924789036350 11.844700349753 +5529 0.5529 0.1440111074908904 11.782727905140 +5530 0.5530 0.1428359293713390 11.720834485888 +5531 0.5531 0.1416669365759605 11.659021421682 +5532 0.5532 0.1405041210029966 11.597290037596 +5533 0.5533 0.1393474744184149 11.535641654038 +5534 0.5534 0.1381969884563772 11.474077586716 +5535 0.5535 0.1370526546197120 11.412599146587 +5536 0.5536 0.1359144642803921 11.351207639812 +5537 0.5537 0.1347824086800156 11.289904367718 +5538 0.5538 0.1336564789302923 11.228690626747 +5539 0.5539 0.1325366660135343 11.167567708414 +5540 0.5540 0.1314229607831504 11.106536899264 +5541 0.5541 0.1303153539641458 11.045599480827 +5542 0.5542 0.1292138361536257 10.984756729576 +5543 0.5543 0.1281183978213029 10.924009916880 +5544 0.5544 0.1270290293100106 10.863360308964 +5545 0.5545 0.1259457208362193 10.802809166863 +5546 0.5546 0.1248684624905572 10.742357746378 +5547 0.5547 0.1237972442383364 10.682007298039 +5548 0.5548 0.1227320559200818 10.621759067052 +5549 0.5549 0.1216728872520660 10.561614293265 +5550 0.5550 0.1206197278268466 10.501574211122 +5551 0.5551 0.1195725671138097 10.441640049616 +5552 0.5552 0.1185313944597161 10.381813032256 +5553 0.5553 0.1174961990892525 10.322094377016 +5554 0.5554 0.1164669701055870 10.262485296295 +5555 0.5555 0.1154436964909283 10.202986996879 +5556 0.5556 0.1144263671070896 10.143600679894 +5557 0.5557 0.1134149706960567 10.084327540765 +5558 0.5558 0.1124094958805595 10.025168769179 +5559 0.5559 0.1114099311646487 9.966125549037 +5560 0.5560 0.1104162649342760 9.907199058417 +5561 0.5561 0.1094284854578786 9.848390469531 +5562 0.5562 0.1084465808869678 9.789700948684 +5563 0.5563 0.1074705392567219 9.731131656235 +5564 0.5564 0.1065003484865824 9.672683746555 +5565 0.5565 0.1055359963808555 9.614358367983 +5566 0.5566 0.1045774706293167 9.556156662793 +5567 0.5567 0.1036247588078196 9.498079767148 +5568 0.5568 0.1026778483789091 9.440128811062 +5569 0.5569 0.1017367266924381 9.382304918358 +5570 0.5570 0.1008013809861886 9.324609206633 +5571 0.5571 0.0998717983864963 9.267042787213 +5572 0.5572 0.0989479659088797 9.209606765119 +5573 0.5573 0.0980298704586727 9.152302239020 +5574 0.5574 0.0971174988316615 9.095130301205 +5575 0.5575 0.0962108377147245 9.038092037534 +5576 0.5576 0.0953098736864776 8.981188527404 +5577 0.5577 0.0944145932179218 8.924420843712 +5578 0.5578 0.0935249826730957 8.867790052811 +5579 0.5579 0.0926410283097312 8.811297214479 +5580 0.5580 0.0917627162799134 8.754943381876 +5581 0.5581 0.0908900326307442 8.698729601509 +5582 0.5582 0.0900229633050091 8.642656913192 +5583 0.5583 0.0891614941418490 8.586726350011 +5584 0.5584 0.0883056108774342 8.530938938285 +5585 0.5585 0.0874552991456434 8.475295697531 +5586 0.5586 0.0866105444787454 8.419797640428 +5587 0.5587 0.0857713323080853 8.364445772774 +5588 0.5588 0.0849376479647737 8.309241093458 +5589 0.5589 0.0841094766803799 8.254184594419 +5590 0.5590 0.0832868035876283 8.199277260613 +5591 0.5591 0.0824696137210989 8.144520069974 +5592 0.5592 0.0816578920179312 8.089913993380 +5593 0.5593 0.0808516233185313 8.035459994618 +5594 0.5594 0.0800507923672829 7.981159030350 +5595 0.5595 0.0792553838132616 7.927012050077 +5596 0.5596 0.0784653822109526 7.873019996103 +5597 0.5597 0.0776807720209724 7.819183803501 +5598 0.5598 0.0769015376107932 7.765504400083 +5599 0.5599 0.0761276632554710 7.711982706360 +5600 0.5600 0.0753591331383773 7.658619635514 +5601 0.5601 0.0745959313519338 7.605416093357 +5602 0.5602 0.0738380418983506 7.552372978307 +5603 0.5603 0.0730854486903678 7.499491181348 +5604 0.5604 0.0723381355520005 7.446771585999 +5605 0.5605 0.0715960862192864 7.394215068283 +5606 0.5606 0.0708592843410376 7.341822496693 +5607 0.5607 0.0701277134795949 7.289594732161 +5608 0.5608 0.0694013571115855 7.237532628026 +5609 0.5609 0.0686801986286842 7.185637030000 +5610 0.5610 0.0679642213383772 7.133908776141 +5611 0.5611 0.0672534084647292 7.082348696818 +5612 0.5612 0.0665477431491541 7.030957614684 +5613 0.5613 0.0658472084511879 6.979736344640 +5614 0.5614 0.0651517873492654 6.928685693810 +5615 0.5615 0.0644614627414995 6.877806461508 +5616 0.5616 0.0637762174464637 6.827099439209 +5617 0.5617 0.0630960342039773 6.776565410519 +5618 0.5618 0.0624208956758939 6.726205151149 +5619 0.5619 0.0617507844468926 6.676019428877 +5620 0.5620 0.0610856830252723 6.626009003529 +5621 0.5621 0.0604255738437484 6.576174626949 +5622 0.5622 0.0597704392602528 6.526517042963 +5623 0.5623 0.0591202615587366 6.477036987361 +5624 0.5624 0.0584750229499754 6.427735187862 +5625 0.5625 0.0578347055723778 6.378612364091 +5626 0.5626 0.0571992914927957 6.329669227550 +5627 0.5627 0.0565687627073387 6.280906481591 +5628 0.5628 0.0559431011421896 6.232324821391 +5629 0.5629 0.0553222886544239 6.183924933922 +5630 0.5630 0.0547063070328313 6.135707497930 +5631 0.5631 0.0540951379987395 6.087673183906 +5632 0.5632 0.0534887632068411 6.039822654063 +5633 0.5633 0.0528871642460226 5.992156562306 +5634 0.5634 0.0522903226401967 5.944675554212 +5635 0.5635 0.0516982198491358 5.897380267006 +5636 0.5636 0.0511108372693089 5.850271329532 +5637 0.5637 0.0505281562347207 5.803349362233 +5638 0.5638 0.0499501580177527 5.756614977126 +5639 0.5639 0.0493768238300075 5.710068777779 +5640 0.5640 0.0488081348231542 5.663711359287 +5641 0.5641 0.0482440720897773 5.617543308250 +5642 0.5642 0.0476846166642272 5.571565202752 +5643 0.5643 0.0471297495234728 5.525777612336 +5644 0.5644 0.0465794515879567 5.480181097986 +5645 0.5645 0.0460337037224524 5.434776212101 +5646 0.5646 0.0454924867369234 5.389563498478 +5647 0.5647 0.0449557813873852 5.344543492286 +5648 0.5648 0.0444235683767682 5.299716720055 +5649 0.5649 0.0438958283557833 5.255083699643 +5650 0.5650 0.0433725419237898 5.210644940227 +5651 0.5651 0.0428536896296645 5.166400942278 +5652 0.5652 0.0423392519726734 5.122352197545 +5653 0.5653 0.0418292094033446 5.078499189030 +5654 0.5654 0.0413235423243442 5.034842390979 +5655 0.5655 0.0408222310913525 4.991382268854 +5656 0.5656 0.0403252560139436 4.948119279324 +5657 0.5657 0.0398325973564654 4.905053870240 +5658 0.5658 0.0393442353389223 4.862186480622 +5659 0.5659 0.0388601501378591 4.819517540642 +5660 0.5660 0.0383803218872466 4.777047471608 +5661 0.5661 0.0379047306793691 4.734776685942 +5662 0.5662 0.0374333565657133 4.692705587175 +5663 0.5663 0.0369661795578585 4.650834569920 +5664 0.5664 0.0365031796283691 4.609164019869 +5665 0.5665 0.0360443367116874 4.567694313765 +5666 0.5666 0.0355896307050292 4.526425819399 +5667 0.5667 0.0351390414692798 4.485358895589 +5668 0.5668 0.0346925488298918 4.444493892170 +5669 0.5669 0.0342501325777842 4.403831149982 +5670 0.5670 0.0338117724702426 4.363371000850 +5671 0.5671 0.0333774482318211 4.323113767580 +5672 0.5672 0.0329471395552450 4.283059763943 +5673 0.5673 0.0325208261023148 4.243209294660 +5674 0.5674 0.0320984875048119 4.203562655398 +5675 0.5675 0.0316801033654044 4.164120132753 +5676 0.5676 0.0312656532585545 4.124882004244 +5677 0.5677 0.0308551167314276 4.085848538295 +5678 0.5678 0.0304484733048010 4.047019994236 +5679 0.5679 0.0300457024739750 4.008396622284 +5680 0.5680 0.0296467837096838 3.969978663540 +5681 0.5681 0.0292516964590079 3.931766349979 +5682 0.5682 0.0288604201462871 3.893759904436 +5683 0.5683 0.0284729341740349 3.855959540609 +5684 0.5684 0.0280892179238524 3.818365463041 +5685 0.5685 0.0277092507573443 3.780977867121 +5686 0.5686 0.0273330120170347 3.743796939070 +5687 0.5687 0.0269604810272841 3.706822855942 +5688 0.5688 0.0265916370952064 3.670055785612 +5689 0.5689 0.0262264595115871 3.633495886774 +5690 0.5690 0.0258649275518017 3.597143308934 +5691 0.5691 0.0255070204767346 3.560998192408 +5692 0.5692 0.0251527175336984 3.525060668317 +5693 0.5693 0.0248019979573536 3.489330858578 +5694 0.5694 0.0244548409706293 3.453808875908 +5695 0.5695 0.0241112257856430 3.418494823818 +5696 0.5696 0.0237711316046216 3.383388796611 +5697 0.5697 0.0234345376208222 3.348490879376 +5698 0.5698 0.0231014230194538 3.313801147993 +5699 0.5699 0.0227717669785978 3.279319669126 +5700 0.5700 0.0224455486701301 3.245046500227 +5701 0.5701 0.0221227472606423 3.210981689530 +5702 0.5702 0.0218033419123630 3.177125276056 +5703 0.5703 0.0214873117840796 3.143477289611 +5704 0.5704 0.0211746360320597 3.110037750787 +5705 0.5705 0.0208652938109721 3.076806670965 +5706 0.5706 0.0205592642748082 3.043784052314 +5707 0.5707 0.0202565265778026 3.010969887797 +5708 0.5708 0.0199570598753544 2.978364161168 +5709 0.5709 0.0196608433249468 2.945966846983 +5710 0.5710 0.0193678560870678 2.913777910597 +5711 0.5711 0.0190780773261295 2.881797308170 +5712 0.5712 0.0187914862113874 2.850024986671 +5713 0.5713 0.0185080619178595 2.818460883888 +5714 0.5714 0.0182277836272438 2.787104928425 +5715 0.5715 0.0179506305288369 2.755957039713 +5716 0.5716 0.0176765818204504 2.725017128017 +5717 0.5717 0.0174056167093276 2.694285094440 +5718 0.5718 0.0171377144130590 2.663760830931 +5719 0.5719 0.0168728541604977 2.633444220296 +5720 0.5720 0.0166110151926728 2.603335136202 +5721 0.5721 0.0163521767637034 2.573433443186 +5722 0.5722 0.0160963181417106 2.543738996669 +5723 0.5723 0.0158434186097292 2.514251642960 +5724 0.5724 0.0155934574666178 2.484971219268 +5725 0.5725 0.0153464140279687 2.455897553713 +5726 0.5726 0.0151022676270161 2.427030465340 +5727 0.5727 0.0148609976155428 2.398369764125 +5728 0.5728 0.0146225833647870 2.369915250992 +5729 0.5729 0.0143870042663463 2.341666717821 +5730 0.5730 0.0141542397330820 2.313623947467 +5731 0.5731 0.0139242692000202 2.285786713767 +5732 0.5732 0.0136970721252539 2.258154781561 +5733 0.5733 0.0134726279908408 2.230727906700 +5734 0.5734 0.0132509163037025 2.203505836067 +5735 0.5735 0.0130319165965197 2.176488307587 +5736 0.5736 0.0128156084286280 2.149675050247 +5737 0.5737 0.0126019713869101 2.123065784112 +5738 0.5738 0.0123909850866873 2.096660220344 +5739 0.5739 0.0121826291726095 2.070458061212 +5740 0.5740 0.0119768833195428 2.044459000121 +5741 0.5741 0.0117737272334557 2.018662721623 +5742 0.5742 0.0115731406523025 1.993068901439 +5743 0.5743 0.0113751033469067 1.967677206479 +5744 0.5744 0.0111795951218398 1.942487294859 +5745 0.5745 0.0109865958163003 1.917498815930 +5746 0.5746 0.0107960853049894 1.892711410288 +5747 0.5747 0.0106080434989848 1.868124709805 +5748 0.5748 0.0104224503466121 1.843738337648 +5749 0.5749 0.0102392858343146 1.819551908301 +5750 0.5750 0.0100585299875201 1.795565027591 +5751 0.5751 0.0098801628715049 1.771777292711 +5752 0.5752 0.0097041645922572 1.748188292243 +5753 0.5753 0.0095305152973359 1.724797606183 +5754 0.5754 0.0093591951767281 1.701604805973 +5755 0.5755 0.0091901844637036 1.678609454518 +5756 0.5756 0.0090234634356667 1.655811106220 +5757 0.5757 0.0088590124150057 1.633209307000 +5758 0.5758 0.0086968117699392 1.610803594329 +5759 0.5759 0.0085368419153598 1.588593497259 +5760 0.5760 0.0083790833136747 1.566578536443 +5761 0.5761 0.0082235164756437 1.544758224177 +5762 0.5762 0.0080701219612139 1.523132064419 +5763 0.5763 0.0079188803803516 1.501699552828 +5764 0.5764 0.0077697723938708 1.480460176787 +5765 0.5765 0.0076227787142592 1.459413415445 +5766 0.5766 0.0074778801065001 1.438558739738 +5767 0.5767 0.0073350573888914 1.417895612436 +5768 0.5768 0.0071942914338616 1.397423488159 +5769 0.5769 0.0070555631687822 1.377141813429 +5770 0.5770 0.0069188535767762 1.357050026691 +5771 0.5771 0.0067841436975237 1.337147558360 +5772 0.5772 0.0066514146280635 1.317433830843 +5773 0.5773 0.0065206475235919 1.297908258590 +5774 0.5774 0.0063918235982563 1.278570248121 +5775 0.5775 0.0062649241259468 1.259419198069 +5776 0.5776 0.0061399304410825 1.240454499217 +5777 0.5777 0.0060168239393950 1.221675534534 +5778 0.5778 0.0058955860787073 1.203081679220 +5779 0.5779 0.0057761983797093 1.184672300740 +5780 0.5780 0.0056586424267287 1.166446758871 +5781 0.5781 0.0055428998684984 1.148404405737 +5782 0.5782 0.0054289524189186 1.130544585858 +5783 0.5783 0.0053167818578164 1.112866636186 +5784 0.5784 0.0052063700316994 1.095369886153 +5785 0.5785 0.0050976988545064 1.078053657707 +5786 0.5786 0.0049907503083525 1.060917265371 +5787 0.5787 0.0048855064442703 1.043960016273 +5788 0.5788 0.0047819493829467 1.027181210200 +5789 0.5789 0.0046800613154546 1.010580139641 +5790 0.5790 0.0045798245039808 0.994156089836 +5791 0.5791 0.0044812212825479 0.977908338821 +5792 0.5792 0.0043842340577328 0.961836157481 +5793 0.5793 0.0042888453093791 0.945938809593 +5794 0.5794 0.0041950375913056 0.930215551877 +5795 0.5795 0.0041027935320093 0.914665634049 +5796 0.5796 0.0040120958353633 0.899288298872 +5797 0.5797 0.0039229272813097 0.884082782200 +5798 0.5798 0.0038352707265478 0.869048313038 +5799 0.5799 0.0037491091052162 0.854184113594 +5800 0.5800 0.0036644254295701 0.839489399327 +5801 0.5801 0.0035812027906536 0.824963379004 +5802 0.5802 0.0034994243589655 0.810605254757 +5803 0.5803 0.0034190733851208 0.796414222137 +5804 0.5804 0.0033401332005058 0.782389470164 +5805 0.5805 0.0032625872179279 0.768530181393 +5806 0.5806 0.0031864189322599 0.754835531967 +5807 0.5807 0.0031116119210779 0.741304691673 +5808 0.5808 0.0030381498452941 0.727936824004 +5809 0.5809 0.0029660164497831 0.714731086215 +5810 0.5810 0.0028951955640031 0.701686629386 +5811 0.5811 0.0028256711026098 0.688802598479 +5812 0.5812 0.0027574270660655 0.676078132407 +5813 0.5813 0.0026904475412409 0.663512364085 +5814 0.5814 0.0026247167020116 0.651104420501 +5815 0.5815 0.0025602188098478 0.638853422775 +5816 0.5816 0.0024969382143977 0.626758486227 +5817 0.5817 0.0024348593540645 0.614818720438 +5818 0.5818 0.0023739667565768 0.603033229315 +5819 0.5819 0.0023142450395530 0.591401111162 +5820 0.5820 0.0022556789110579 0.579921458740 +5821 0.5821 0.0021982531701537 0.568593359343 +5822 0.5822 0.0021419527074437 0.557415894857 +5823 0.5823 0.0020867625056091 0.546388141836 +5824 0.5824 0.0020326676399389 0.535509171567 +5825 0.5825 0.0019796532788535 0.524778050142 +5826 0.5826 0.0019277046844198 0.514193838531 +5827 0.5827 0.0018768072128608 0.503755592650 +5828 0.5828 0.0018269463150565 0.493462363436 +5829 0.5829 0.0017781075370387 0.483313196921 +5830 0.5830 0.0017302765204776 0.473307134300 +5831 0.5831 0.0016834390031619 0.463443212013 +5832 0.5832 0.0016375808194705 0.453720461817 +5833 0.5833 0.0015926879008364 0.444137910864 +5834 0.5834 0.0015487462762046 0.434694581772 +5835 0.5835 0.0015057420724806 0.425389492709 +5836 0.5836 0.0014636615149717 0.416221657467 +5837 0.5837 0.0014224909278211 0.407190085546 +5838 0.5838 0.0013822167344327 0.398293782222 +5839 0.5839 0.0013428254578891 0.389531748649 +5840 0.5840 0.0013043037213610 0.380902981914 +5841 0.5841 0.0012666382485083 0.372406475140 +5842 0.5842 0.0012298158638734 0.364041217557 +5843 0.5843 0.0011938234932663 0.355806194587 +5844 0.5844 0.0011586481641402 0.347700387935 +5845 0.5845 0.0011242770059602 0.339722775665 +5846 0.5846 0.0010906972505625 0.331872332288 +5847 0.5847 0.0010578962325053 0.324148028857 +5848 0.5848 0.0010258613894105 0.316548833039 +5849 0.5849 0.0009945802622977 0.309073709216 +5850 0.5850 0.0009640404959088 0.301721618563 +5851 0.5851 0.0009342298390232 0.294491519149 +5852 0.5852 0.0009051361447649 0.287382366017 +5853 0.5853 0.0008767473708998 0.280393111285 +5854 0.5854 0.0008490515801244 0.273522704222 +5855 0.5855 0.0008220369403454 0.266770091359 +5856 0.5856 0.0007956917249489 0.260134216571 +5857 0.5857 0.0007700043130617 0.253614021172 +5858 0.5858 0.0007449631898025 0.247208444013 +5859 0.5859 0.0007205569465230 0.240916421577 +5860 0.5860 0.0006967742810405 0.234736888073 +5861 0.5861 0.0006736039978601 0.228668775535 +5862 0.5862 0.0006510350083873 0.222711013920 +5863 0.5863 0.0006290563311309 0.216862531208 +5864 0.5864 0.0006076570918958 0.211122253494 +5865 0.5865 0.0005868265239659 0.205489105104 +5866 0.5866 0.0005665539682768 0.199962008678 +5867 0.5867 0.0005468288735786 0.194539885287 +5868 0.5868 0.0005276407965881 0.189221654523 +5869 0.5869 0.0005089794021313 0.184006234612 +5870 0.5870 0.0004908344632749 0.178892542516 +5871 0.5871 0.0004731958614473 0.173879494037 +5872 0.5872 0.0004560535865494 0.168966003920 +5873 0.5873 0.0004393977370551 0.164150985966 +5874 0.5874 0.0004232185201000 0.159433353136 +5875 0.5875 0.0004075062515602 0.154812017660 +5876 0.5876 0.0003922513561198 0.150285891148 +5877 0.5877 0.0003774443673278 0.145853884692 +5878 0.5878 0.0003630759276436 0.141514908993 +5879 0.5879 0.0003491367884712 0.137267874454 +5880 0.5880 0.0003356178101833 0.133111691305 +5881 0.5881 0.0003225099621323 0.129045269714 +5882 0.5882 0.0003098043226517 0.125067519898 +5883 0.5883 0.0002974920790448 0.121177352240 +5884 0.5884 0.0002855645275626 0.117373677404 +5885 0.5885 0.0002740130733697 0.113655406454 +5886 0.5886 0.0002628292304983 0.110021450974 +5887 0.5887 0.0002520046217911 0.106470723171 +5888 0.5888 0.0002415309788316 0.103002136019 +5889 0.5889 0.0002314001418629 0.099614603355 +5890 0.5890 0.0002216040596943 0.096307040016 +5891 0.5891 0.0002121347895957 0.093078361957 +5892 0.5892 0.0002029844971796 0.089927486364 +5893 0.5893 0.0001941454562717 0.086853331794 +5894 0.5894 0.0001856100487678 0.083854818285 +5895 0.5895 0.0001773707644789 0.080930867493 +5896 0.5896 0.0001694202009641 0.078080402803 +5897 0.5897 0.0001617510633501 0.075302349477 +5898 0.5898 0.0001543561641385 0.072595634755 +5899 0.5899 0.0001472284230001 0.069959188012 +5900 0.5900 0.0001403608665563 0.067391940864 +5901 0.5901 0.0001337466281472 0.064892827319 +5902 0.5902 0.0001273789475872 0.062460783881 +5903 0.5903 0.0001212511709073 0.060094749716 +5904 0.5904 0.0001153567500837 0.057793666756 +5905 0.5905 0.0001096892427533 0.055556479852 +5906 0.5906 0.0001042423119160 0.053382136895 +5907 0.5907 0.0000990097256231 0.051269588963 +5908 0.5908 0.0000939853566525 0.049217790448 +5909 0.5909 0.0000891631821699 0.047225699205 +5910 0.5910 0.0000845372833759 0.045292276674 +5911 0.5911 0.0000801018451402 0.043416488041 +5912 0.5912 0.0000758511556204 0.041597302354 +5913 0.5913 0.0000717796058688 0.039833692678 +5914 0.5914 0.0000678816894229 0.038124636241 +5915 0.5915 0.0000641520018825 0.036469114567 +5916 0.5916 0.0000605852404732 0.034866113619 +5917 0.5917 0.0000571762035945 0.033314623955 +5918 0.5918 0.0000539197903535 0.031813640865 +5919 0.5919 0.0000508110000845 0.030362164515 +5920 0.5920 0.0000478449318538 0.028959200099 +5921 0.5921 0.0000450167839493 0.027603757991 +5922 0.5922 0.0000423218533553 0.026294853888 +5923 0.5923 0.0000397555352129 0.025031508961 +5924 0.5924 0.0000373133222647 0.023812750002 +5925 0.5925 0.0000349908042850 0.022637609593 +5926 0.5926 0.0000327836674933 0.021505126240 +5927 0.5927 0.0000306876939549 0.020414344528 +5928 0.5928 0.0000286987609638 0.019364315294 +5929 0.5929 0.0000268128404110 0.018354095762 +5930 0.5930 0.0000250259981374 0.017382749709 +5931 0.5931 0.0000233343932709 0.016449347622 +5932 0.5932 0.0000217342775469 0.015552966857 +5933 0.5933 0.0000202219946143 0.014692691796 +5934 0.5934 0.0000187939793241 0.013867614007 +5935 0.5935 0.0000174467570030 0.013076832415 +5936 0.5936 0.0000161769427100 0.012319453445 +5937 0.5937 0.0000149812404775 0.011594591205 +5938 0.5938 0.0000138564425353 0.010901367639 +5939 0.5939 0.0000127994285187 0.010238912694 +5940 0.5940 0.0000118071646594 0.009606364491 +5941 0.5941 0.0000108767029609 0.009002869480 +5942 0.5942 0.0000100051803554 0.008427582629 +5943 0.5943 0.0000091898178456 0.007879667567 +5944 0.5944 0.0000084279196287 0.007358296772 +5945 0.5945 0.0000077168722031 0.006862651740 +5946 0.5946 0.0000070541434585 0.006391923152 +5947 0.5947 0.0000064372817488 0.005945311043 +5948 0.5948 0.0000058639149470 0.005522024993 +5949 0.5949 0.0000053317494834 0.005121284279 +5950 0.5950 0.0000048385693660 0.004742318068 +5951 0.5951 0.0000043822351834 0.004384365584 +5952 0.5952 0.0000039606830894 0.004046676296 +5953 0.5953 0.0000035719237704 0.003728510085 +5954 0.5954 0.0000032140413947 0.003429137428 +5955 0.5955 0.0000028851925443 0.003147839580 +5956 0.5956 0.0000025836051272 0.002883908762 +5957 0.5957 0.0000023075772728 0.002636648327 +5958 0.5958 0.0000020554762083 0.002405372962 +5959 0.5959 0.0000018257371175 0.002189408855 +5960 0.5960 0.0000016168619797 0.001988093901 +5961 0.5961 0.0000014274183913 0.001800777867 +5962 0.5962 0.0000012560383680 0.001626822598 +5963 0.5963 0.0000011014171283 0.001465602195 +5964 0.5964 0.0000009623118584 0.001316503204 +5965 0.5965 0.0000008375404574 0.001178924815 +5966 0.5966 0.0000007259802642 0.001052279049 +5967 0.5967 0.0000006265667647 0.000935990942 +5968 0.5968 0.0000005382922795 0.000829498762 +5969 0.5969 0.0000004602046326 0.000732254177 +5970 0.5970 0.0000003914058004 0.000643722466 +5971 0.5971 0.0000003310505415 0.000563382712 +5972 0.5972 0.0000002783450059 0.000490728000 +5973 0.5973 0.0000002325453249 0.000425265619 +5974 0.5974 0.0000001929561812 0.000366517256 +5975 0.5975 0.0000001589293584 0.000314019201 +5976 0.5976 0.0000001298622712 0.000267322543 +5977 0.5977 0.0000001051964747 0.000225993387 +5978 0.5978 0.0000000844161535 0.000189613036 +5979 0.5979 0.0000000670465907 0.000157778221 +5980 0.5980 0.0000000526526156 0.000130101281 +5981 0.5981 0.0000000408370316 0.000106210399 +5982 0.5982 0.0000000312390227 0.000085749779 +5983 0.5983 0.0000000235325395 0.000068379884 +5984 0.5984 0.0000000174246640 0.000053777626 +5985 0.5985 0.0000000126539537 0.000041636579 +5986 0.5986 0.0000000089887644 0.000031667209 +5987 0.5987 0.0000000062255506 0.000023597067 +5988 0.5988 0.0000000041871465 0.000017171015 +5989 0.5989 0.0000000027210244 0.000012151426 +5990 0.5990 0.0000000016975314 0.000008318434 +5991 0.5991 0.0000000010081044 0.000005470106 +5992 0.5992 0.0000000005634638 0.000003422706 +5993 0.5993 0.0000000002917849 0.000002010872 +5994 0.5994 0.0000000001368474 0.000001087878 +5995 0.5995 0.0000000000561625 0.000000525820 +5996 0.5996 0.0000000000190784 0.000000215861 +5997 0.5997 0.0000000000048627 0.000000068454 +5998 0.5998 0.0000000000007625 0.000000013551 +5999 0.5999 0.0000000000000424 0.000000000849 +6000 0.6000 0.0000000000000000 0.000000000000 diff --git a/examples/reax/ci-reaxFF/control b/examples/reax/ci-reaxFF/control new file mode 100644 index 0000000000..f213657d10 --- /dev/null +++ b/examples/reax/ci-reaxFF/control @@ -0,0 +1 @@ +tabulate_long_range 30000 diff --git a/examples/reax/ci-reaxFF/ffield.ci-reax.CH b/examples/reax/ci-reaxFF/ffield.ci-reax.CH new file mode 100644 index 0000000000..6882da5d58 --- /dev/null +++ b/examples/reax/ci-reaxFF/ffield.ci-reax.CH @@ -0,0 +1,78 @@ +DATE: 2017-11-20 CONTRIBUTOR: Michal Kanski michal.kanski@uj.edu.pl CITATION: Michal Kanski, Dawid Maciazek, Zbigniew Postawa, Adri C.T. van Duin, Chowdhury Ashraf, and Barbara J. Garrison Development of a Charge-Implicit ReaxFF Potential for Hydrocarbon Systems, J. Phys. Chem. Lett., 2018, 9, pp 359–363, DOI: 10.1021/acs.jpclett.7b03155 + 39 ! Number of general parameters + 50.0000 !p(boc1) + 9.5469 !p(boc2) + 26.5405 !p(coa2) + 1.5105 !p(trip4) + 6.6630 !p(trip3) + 70.0000 !kc2 + 1.0588 !p(ovun6) + 4.6000 !p(trip2) + 12.1176 !p(ovun7) + 13.3056 !p(ovun8) + -70.1292 !p(trip1) + 0.0000 !Lower Taper-radius (swa) + 7.0000 !Upper Taper-radius (swb) + 0.0000 !not used + 33.8667 !p(val7) + 6.0891 !p(lp1) + 1.0563 !p(val9) + 2.0384 !p(val10) + 6.1431 !not used + 6.9290 !p(pen2) + 0.3989 !p(pen3) + 3.9954 !p(pen4) + 0.0000 !not used + 5.7796 !p(tor2) + 10.0000 !p(tor3) + 1.9487 !p(tor4) + 0.0000 !not used + 2.1645 !p(cot2) + 1.5591 !p(vdW1) + 0.1000 !Cutoff for bond order*100 (cutoff) + 2.1365 !p(coa4) + 0.6991 !p(ovun4) + 50.0000 !p(ovun3) + 1.8512 !p(val8) + 0.0000 !not used + 0.0000 !not used + 0.0000 !not used + 0.0000 !not used + 2.6962 !p(coa3) + 2 ! Nr of atoms; atomID;ro(sigma); Val;atom mass;Rvdw;Dij;gamma + alfa;gamma(w);Val(angle);p(ovun5);n.u.;chiEEM;etaEEM;n.u. + ro(pipi);p(lp2);Heat increment;p(boc4);p(boc3);p(boc5),n.u.;n.u. + p(ovun2);p(val3);n.u.;Val(boc);p(val5);n.u.;n.u.;n.u. + C 1.5807 4.0000 12.0000 2.1339 0.2705 0.9000 1.3561 4.0000 + 7.0578 2.2030 4.0000 33.2433 79.5548 1.0000 7.0000 0.0000 + 1.2857 0.0000 199.0303 25.5946 34.7987 33.8858 0.8563 0.0000 + -3.2763 4.0000 1.0564 4.0000 1.1829 1.8737 0.9340 10.7610 + H 0.8431 1.0000 1.0080 1.7993 0.0531 1.0206 -0.1000 1.0000 + 5.1365 2.3597 1.0000 0.0000 121.1250 1.0000 7.0000 1.0000 + -0.1000 0.0000 62.4879 1.7831 10.0956 1.5343 1.0698 0.0000 + -39.1433 2.0000 1.0338 1.0000 1.4937 1.4730 0.2395 9.1813 + 3 ! Nr of bonds; at1;at2;De(sigma);De(pi);De(pipi);p(be1);p(b + p(be2);p(bo3);p(bo4);n.u.;p(bo1);p(bo2) + 1 1 143.8966 78.5316 96.1991 -0.6337 -1.0884 1.0000 19.6513 0.4644 + 1.0466 -0.6287 8.3354 1.0000 -0.1410 7.4059 1.0000 0.0000 + 1 2 142.2786 0.0000 0.0000 -0.7910 0.0000 1.0000 7.6804 0.6354 + 8.9091 1.0000 0.0000 1.0000 -0.1759 9.1526 0.0000 0.0000 + 2 2 166.9928 0.0000 0.0000 -0.2894 0.0000 1.0000 9.0000 0.7986 + 22.4216 1.0000 0.0000 1.0000 -0.1025 5.0250 0.0000 0.0000 + 1 ! Nr of off-diagonal terms. at1;at2;Dij;RvdW;alfa;ro(sigma);r + 1 2 0.0384 1.4571 8.0036 1.4872 -1.0000 -1.0000 + 6 ! Nr of angles. at1;at2;at3;Thetao,o;p(val1);p(val2);p(coa1); + 1 1 1 66.9930 26.8666 1.3549 -0.9012 4.6851 18.8775 1.8087 + 1 1 2 65.9137 8.8776 9.1600 0.0000 0.3144 0.0000 4.3449 + 2 1 2 70.6653 32.2568 1.7885 0.0000 2.1528 0.0000 9.9760 + 1 2 2 0.0000 40.0000 1.0000 0.0000 3.2849 0.0000 9.0719 + 1 2 1 0.0000 33.4427 5.0679 0.0000 1.1188 0.0000 10.0000 + 2 2 2 0.0000 27.9213 5.8635 0.0000 0.0000 0.0000 1.0400 + 6 ! Nr of torsions. at1;at2;at3;at4;;V1;V2;V3;p(tor1);p(cot1);n + 1 1 1 1 0.0500 17.1779 0.1145 -3.7630 -1.4900 0.0000 0.0000 + 1 1 1 2 -0.4619 27.8830 0.2611 -3.8205 -2.0485 0.0000 0.0000 + 2 1 1 2 0.1629 22.7282 0.3893 -2.9569 -7.8729 0.0000 0.0000 + 0 1 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 2 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 1 1 0 0.0000 50.0000 0.3000 -4.0000 -2.0000 0.0000 0.0000 + 0 ! Nr of hydrogen bonds. at1;at2;at3;r(hb);p(hb1);p(hb2);p(hb3 diff --git a/examples/reax/ci-reaxFF/in.ci-reax.CH b/examples/reax/ci-reaxFF/in.ci-reax.CH new file mode 100644 index 0000000000..b3a2406a56 --- /dev/null +++ b/examples/reax/ci-reaxFF/in.ci-reax.CH @@ -0,0 +1,19 @@ +#ci-reax potential for CH systems with tabulated ZBL correction +atom_style charge +units real + +read_data CH4.dat + +pair_style hybrid/overlay reax/c control checkqeq no table linear 11000 +pair_coeff * * reax/c ffield.ci-reax.CH C H +pair_coeff 1 1 table ci-reaxFF_ZBL.dat CC_cireaxFF +pair_coeff 1 2 table ci-reaxFF_ZBL.dat CH_cireaxFF +pair_coeff 2 2 table ci-reaxFF_ZBL.dat HH_cireaxFF + +timestep 0.25 +fix 1 all nve +fix 2 all temp/berendsen 500.0 500.0 100.0 + +#dump 1 all atom 30 dump.ci-reax.lammpstrj + +run 3000 diff --git a/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 b/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 new file mode 100644 index 0000000000..e966fd26b6 --- /dev/null +++ b/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 @@ -0,0 +1,86 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +#ci-reax potential for CH systems with tabulated ZBL correction +atom_style charge +units real + +read_data CH4.dat + orthogonal box = (0 0 0) to (20 20 20) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 315 atoms + reading velocities ... + 315 velocities + +pair_style hybrid/overlay reax/c control checkqeq no table linear 11000 +pair_coeff * * reax/c ffield.ci-reax.CH C H +Reading potential file ffield.ci-reax.CH with DATE: 2017-11-20 +pair_coeff 1 1 table ci-reaxFF_ZBL.dat CC_cireaxFF +WARNING: 2 of 10000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:481) +pair_coeff 1 2 table ci-reaxFF_ZBL.dat CH_cireaxFF +WARNING: 2 of 11000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:481) +pair_coeff 2 2 table ci-reaxFF_ZBL.dat HH_cireaxFF +WARNING: 2 of 6000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:481) + +timestep 0.25 +fix 1 all nve +fix 2 all temp/berendsen 500.0 500.0 100.0 + +#dump 1 all atom 30 dump.ci-reax.lammpstrj + +run 3000 +WARNING: Total cutoff < 2*bond cutoff. May need to use an increased neighbor list skin. (../pair_reaxc.cpp:392) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 9.5 + ghost atom cutoff = 9.5 + binsize = 4.75, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) pair table, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 43.46 | 43.46 | 43.46 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 508.42043 -28736.654 0 -28260.785 1678.3276 + 3000 480.41333 -28707.835 0 -28258.181 -3150.0762 +Loop time of 45.3959 on 1 procs for 3000 steps with 315 atoms + +Performance: 1.427 ns/day, 16.813 hours/ns, 66.085 timesteps/s +96.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 44.955 | 44.955 | 44.955 | 0.0 | 99.03 +Neigh | 0.29903 | 0.29903 | 0.29903 | 0.0 | 0.66 +Comm | 0.056547 | 0.056547 | 0.056547 | 0.0 | 0.12 +Output | 4.8399e-05 | 4.8399e-05 | 4.8399e-05 | 0.0 | 0.00 +Modify | 0.058722 | 0.058722 | 0.058722 | 0.0 | 0.13 +Other | | 0.02632 | | | 0.06 + +Nlocal: 315 ave 315 max 315 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 2056 ave 2056 max 2056 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 32754 ave 32754 max 32754 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 32754 +Ave neighs/atom = 103.981 +Neighbor list builds = 37 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:45 diff --git a/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 b/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 new file mode 100644 index 0000000000..ccc87b3536 --- /dev/null +++ b/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 @@ -0,0 +1,86 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +#ci-reax potential for CH systems with tabulated ZBL correction +atom_style charge +units real + +read_data CH4.dat + orthogonal box = (0 0 0) to (20 20 20) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 315 atoms + reading velocities ... + 315 velocities + +pair_style hybrid/overlay reax/c control checkqeq no table linear 11000 +pair_coeff * * reax/c ffield.ci-reax.CH C H +Reading potential file ffield.ci-reax.CH with DATE: 2017-11-20 +pair_coeff 1 1 table ci-reaxFF_ZBL.dat CC_cireaxFF +WARNING: 2 of 10000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:481) +pair_coeff 1 2 table ci-reaxFF_ZBL.dat CH_cireaxFF +WARNING: 2 of 11000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:481) +pair_coeff 2 2 table ci-reaxFF_ZBL.dat HH_cireaxFF +WARNING: 2 of 6000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:481) + +timestep 0.25 +fix 1 all nve +fix 2 all temp/berendsen 500.0 500.0 100.0 + +#dump 1 all atom 30 dump.ci-reax.lammpstrj + +run 3000 +WARNING: Total cutoff < 2*bond cutoff. May need to use an increased neighbor list skin. (../pair_reaxc.cpp:392) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 9.5 + ghost atom cutoff = 9.5 + binsize = 4.75, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) pair table, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 24.48 | 25.61 | 27.27 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 508.42043 -28736.654 0 -28260.785 1678.3276 + 3000 480.41333 -28707.835 0 -28258.181 -3150.0762 +Loop time of 24.7034 on 4 procs for 3000 steps with 315 atoms + +Performance: 2.623 ns/day, 9.149 hours/ns, 121.441 timesteps/s +95.8% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 18.945 | 21.367 | 24.046 | 39.3 | 86.49 +Neigh | 0.1456 | 0.15254 | 0.16101 | 1.6 | 0.62 +Comm | 0.39168 | 3.0859 | 5.5185 | 103.9 | 12.49 +Output | 3.5763e-05 | 4.065e-05 | 5.2452e-05 | 0.0 | 0.00 +Modify | 0.05831 | 0.068811 | 0.077666 | 2.9 | 0.28 +Other | | 0.0292 | | | 0.12 + +Nlocal: 78.75 ave 96 max 65 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Nghost: 1233 ave 1348 max 1116 min +Histogram: 1 0 1 0 0 0 0 1 0 1 +Neighs: 9467.25 ave 12150 max 7160 min +Histogram: 1 1 0 0 0 0 0 1 0 1 + +Total # of neighbors = 37869 +Ave neighs/atom = 120.219 +Neighbor list builds = 37 +Dangerous builds = 0 + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:24 diff --git a/examples/reax/log.5Oct16.reax.rdx.g++.1 b/examples/reax/log.5Oct16.reax.rdx.g++.1 deleted file mode 100644 index 08a24cf635..0000000000 --- a/examples/reax/log.5Oct16.reax.rdx.g++.1 +++ /dev/null @@ -1,101 +0,0 @@ -LAMMPS (5 Oct 2016) -# ReaxFF potential for RDX system - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - -# reax args: hbcut hbnewflag tripflag precision - -pair_style reax 6.0 1 1 1.0e-6 -WARNING: The pair_style reax command will be deprecated soon - users should switch to pair_style reax/c (../pair_reax.cpp:49) -pair_coeff * * ffield.reax 1 2 3 4 - -compute reax all pair reax - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all custom 10 dump.reax.rdx id type q xs ys zs - -#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - 1 neighbor list requests - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 3 3 3 -Memory usage per processor = 2.95105 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1885.1268 -1885.1268 27233.074 -2958.4712 79.527715 0.31082031 0 97.771125 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79971 0 168.88435 - 10 1281.7558 -1989.1322 -1912.7188 -19609.913 -2733.8828 -15.775275 0.20055725 0 55.020231 3.1070522 -77.710916 0 14.963568 -5.8082204 843.41939 -180.17724 0 107.5115 - 20 516.83079 -1941.677 -1910.8655 -12525.41 -2801.8626 7.4107974 0.073134188 0 81.986982 0.2281551 -57.494871 0 30.656735 -10.102557 877.78696 -158.93385 0 88.574158 - 30 467.2641 -1940.978 -1913.1215 -35957.487 -2755.021 -6.9179959 0.049322439 0 78.853175 0.13604392 -51.653634 0 19.862872 -9.7098575 853.79334 -151.232 0 80.861768 - 40 647.45541 -1951.1994 -1912.6006 -5883.7147 -2798.3556 17.334807 0.15102863 0 63.23512 0.18070931 -54.598962 0 17.325008 -12.052277 883.01667 -164.21335 0 96.777422 - 50 716.38057 -1949.4749 -1906.767 5473.2085 -2800.931 9.2056917 0.15413274 0 85.371449 3.2986106 -78.253597 0 34.861773 -8.5531236 882.01435 -193.85275 0 117.2096 - 60 1175.2707 -1975.9611 -1905.8959 -1939.4971 -2726.5816 -11.651982 0.24296788 0 48.320663 7.1799636 -75.363641 0 16.520132 -4.8869463 844.754 -194.23296 0 119.73837 - 70 1156.7 -1975.3486 -1906.3905 24628.344 -2880.5223 25.652478 0.26894312 0 83.724884 7.1049303 -68.700942 0 24.750744 -8.6338218 911.20067 -183.4058 0 113.21158 - 80 840.23687 -1955.4768 -1905.3851 -17731.383 -2755.7295 -8.0168306 0.13867962 0 86.14748 2.2387306 -76.945841 0 23.595858 -7.2609645 853.6346 -167.88289 0 94.603895 - 90 365.79169 -1926.406 -1904.5989 898.37155 -2842.183 47.368211 0.23109 0 92.288131 0.38031313 -61.361483 0 18.476377 -12.255472 900.24202 -186.48056 0 116.88831 - 100 801.32078 -1953.4177 -1905.646 -2417.5518 -2802.7244 4.6676973 0.18046558 0 76.730114 5.4177372 -77.102556 0 24.997234 -7.7554179 898.67306 -196.8912 0 120.38952 -Loop time of 0.512828 on 1 procs for 100 steps with 21 atoms - -Performance: 16.848 ns/day, 1.425 hours/ns, 194.997 timesteps/s -99.4% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.51126 | 0.51126 | 0.51126 | 0.0 | 99.69 -Neigh | 0.00071597 | 0.00071597 | 0.00071597 | 0.0 | 0.14 -Comm | 0.00040317 | 0.00040317 | 0.00040317 | 0.0 | 0.08 -Output | 0.00027037 | 0.00027037 | 0.00027037 | 0.0 | 0.05 -Modify | 7.2241e-05 | 7.2241e-05 | 7.2241e-05 | 0.0 | 0.01 -Other | | 0.000108 | | | 0.02 - -Nlocal: 21 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1106 ave 1106 max 1106 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1106 -Ave neighs/atom = 52.6667 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reax/log.5Oct16.reax.rdx.g++.4 b/examples/reax/log.5Oct16.reax.rdx.g++.4 deleted file mode 100644 index 2f052fbf74..0000000000 --- a/examples/reax/log.5Oct16.reax.rdx.g++.4 +++ /dev/null @@ -1,101 +0,0 @@ -LAMMPS (5 Oct 2016) -# ReaxFF potential for RDX system - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 21 atoms - -# reax args: hbcut hbnewflag tripflag precision - -pair_style reax 6.0 1 1 1.0e-6 -WARNING: The pair_style reax command will be deprecated soon - users should switch to pair_style reax/c (../pair_reax.cpp:49) -pair_coeff * * ffield.reax 1 2 3 4 - -compute reax all pair reax - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all custom 10 dump.reax.rdx id type q xs ys zs - -#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - 1 neighbor list requests - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 3 3 3 -Memory usage per processor = 3.0718 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1885.1268 -1885.1268 27233.074 -2958.4712 79.527715 0.31082031 0 97.771125 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79972 0 168.8843 - 10 1281.7558 -1989.1322 -1912.7188 -19609.913 -2733.8828 -15.775275 0.20055725 0 55.020231 3.1070523 -77.710916 0 14.963568 -5.8082204 843.41939 -180.17725 0 107.51148 - 20 516.8308 -1941.677 -1910.8655 -12525.411 -2801.8626 7.4107973 0.07313419 0 81.986982 0.2281551 -57.494871 0 30.656735 -10.102557 877.78696 -158.93385 0 88.574155 - 30 467.26411 -1940.978 -1913.1215 -35957.487 -2755.021 -6.9179966 0.049322437 0 78.853175 0.13604391 -51.653634 0 19.862872 -9.7098574 853.79333 -151.232 0 80.861765 - 40 647.45584 -1951.1994 -1912.6006 -5883.7102 -2798.3557 17.334812 0.15102857 0 63.235124 0.18070914 -54.598951 0 17.325006 -12.052278 883.01674 -164.21335 0 96.777418 - 50 716.38108 -1949.4679 -1906.76 5473.1803 -2800.9311 9.2057064 0.15413272 0 85.371443 3.2986124 -78.253597 0 34.861778 -8.5531235 882.01441 -193.85213 0 117.21596 - 60 1175.2703 -1975.9632 -1905.898 -1939.6676 -2726.5815 -11.652032 0.24296779 0 48.320636 7.1799647 -75.363643 0 16.520124 -4.8869416 844.75396 -194.25563 0 119.75889 - 70 1156.7016 -1975.3469 -1906.3887 24628.125 -2880.5225 25.65252 0.26894309 0 83.724869 7.1048931 -68.700978 0 24.750754 -8.6338341 911.20067 -183.41947 0 113.22722 - 80 840.3323 -1955.4867 -1905.3893 -17732.956 -2755.7336 -8.0168615 0.13869303 0 86.143454 2.2388975 -76.946365 0 23.594977 -7.2608903 853.63682 -167.88599 0 94.604168 - 90 365.75853 -1926.4192 -1904.6141 902.29004 -2842.1715 47.360077 0.23110905 0 92.28805 0.38040356 -61.364192 0 18.473252 -12.253964 900.23128 -186.47889 0 116.88518 - 100 801.64661 -1953.4392 -1905.6481 -2464.5533 -2802.6922 4.6510183 0.18048786 0 76.715675 5.41849 -77.102069 0 24.987058 -7.7531389 898.65974 -196.87724 0 120.37303 -Loop time of 0.405054 on 4 procs for 100 steps with 21 atoms - -Performance: 21.331 ns/day, 1.125 hours/ns, 246.881 timesteps/s -96.9% 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.16194 | 0.24674 | 0.40012 | 18.4 | 60.92 -Neigh | 7.3671e-05 | 0.00024015 | 0.00053477 | 1.1 | 0.06 -Comm | 0.0037704 | 0.1575 | 0.24247 | 23.1 | 38.88 -Output | 0.00037122 | 0.00040913 | 0.0004406 | 0.1 | 0.10 -Modify | 4.22e-05 | 6.175e-05 | 8.3685e-05 | 0.2 | 0.02 -Other | | 0.0001087 | | | 0.03 - -Nlocal: 5.25 ave 15 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 -Nghost: 355.5 ave 432 max 282 min -Histogram: 1 0 0 0 1 1 0 0 0 1 -Neighs: 301.25 ave 827 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 - -Total # of neighbors = 1205 -Ave neighs/atom = 57.381 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reax/log.5Oct16.reaxc.rdx.g++.1 b/examples/reax/log.5Oct16.reaxc.rdx.g++.1 deleted file mode 100644 index 5c8bb737b9..0000000000 --- a/examples/reax/log.5Oct16.reaxc.rdx.g++.1 +++ /dev/null @@ -1,104 +0,0 @@ -LAMMPS (5 Oct 2016) -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - -pair_style reax/c control.reax_c.rdx -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - 2 neighbor list requests - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 3 3 3 -Memory usage per processor = 14.4462 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068717 0.2433807 0 96.181613 0.96184887 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 -Loop time of 0.362895 on 1 procs for 100 steps with 21 atoms - -Performance: 23.809 ns/day, 1.008 hours/ns, 275.562 timesteps/s -100.0% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.34367 | 0.34367 | 0.34367 | 0.0 | 94.70 -Neigh | 0.0078354 | 0.0078354 | 0.0078354 | 0.0 | 2.16 -Comm | 0.00043559 | 0.00043559 | 0.00043559 | 0.0 | 0.12 -Output | 0.00019908 | 0.00019908 | 0.00019908 | 0.0 | 0.05 -Modify | 0.010645 | 0.010645 | 0.010645 | 0.0 | 2.93 -Other | | 0.0001094 | | | 0.03 - -Nlocal: 21 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.1905 -Neighbor list builds = 10 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/reax/log.5Oct16.reaxc.rdx.g++.4 b/examples/reax/log.5Oct16.reaxc.rdx.g++.4 deleted file mode 100644 index 10f11811cf..0000000000 --- a/examples/reax/log.5Oct16.reaxc.rdx.g++.4 +++ /dev/null @@ -1,104 +0,0 @@ -LAMMPS (5 Oct 2016) -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 21 atoms - -pair_style reax/c control.reax_c.rdx -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - 2 neighbor list requests - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 3 3 3 -Memory usage per processor = 12.531 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1884.3081 -1884.3081 27186.18 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79953 0 168.88418 - 10 1288.6115 -1989.6644 -1912.8422 -19456.354 -2734.6769 -15.60722 0.2017796 0 54.629558 3.1252288 -77.7067 0 14.933901 -5.8108542 843.92073 -180.43321 0 107.75934 - 20 538.95831 -1942.7037 -1910.5731 -10725.671 -2803.7395 7.9078306 0.077926651 0 81.610051 0.22951926 -57.557099 0 30.331204 -10.178049 878.99014 -159.69268 0 89.316921 - 30 463.09502 -1933.5765 -1905.9685 -33255.512 -2749.8591 -8.015455 0.027628766 0 81.6274 0.11972393 -50.262275 0 20.820315 -9.6327041 851.88722 -149.49498 0 79.205714 - 40 885.49378 -1958.9125 -1906.1228 -4814.644 -2795.644 9.1506485 0.13747497 0 70.948 0.24360511 -57.862677 0 19.076502 -11.141216 873.73898 -159.99393 0 92.43409 - 50 861.16297 -1954.4602 -1903.1209 -1896.8002 -2784.8451 3.8270162 0.157933 0 79.851673 3.3492148 -78.066132 0 32.628944 -7.9565368 872.81852 -190.98572 0 114.76001 - 60 1167.7835 -1971.8433 -1902.2245 -3482.8296 -2705.8635 -17.121613 0.2274909 0 44.507674 7.85602 -74.788998 0 16.256483 -4.6046575 835.83058 -188.33691 0 114.19414 - 70 1439.9939 -1989.3026 -1903.4556 23846.042 -2890.7893 31.958672 0.26671708 0 85.758381 3.1804035 -71.002944 0 24.357195 -10.311284 905.8679 -175.38487 0 106.79661 - 80 502.39535 -1930.7548 -1900.8039 -20356.194 -2703.8126 -18.662209 0.11286005 0 99.803849 2.0329206 -76.171278 0 19.23716 -6.2787147 826.47505 -166.03123 0 92.539386 - 90 749.07874 -1946.9841 -1902.3269 17798.394 -2863.7576 42.068612 0.24338059 0 96.181423 0.96185061 -69.95542 0 24.615344 -11.582758 903.68812 -190.13826 0 120.69124 - 100 1109.6904 -1968.5879 -1902.4323 -4490.0667 -2755.8991 -7.1224194 0.21757691 0 61.805857 7.0827218 -75.645383 0 20.115437 -6.23727 863.56487 -198.56975 0 122.09963 -Loop time of 0.293673 on 4 procs for 100 steps with 21 atoms - -Performance: 29.420 ns/day, 0.816 hours/ns, 340.514 timesteps/s -99.1% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.24143 | 0.24223 | 0.24409 | 0.2 | 82.48 -Neigh | 0.003767 | 0.0049117 | 0.0061524 | 1.2 | 1.67 -Comm | 0.0030656 | 0.0048578 | 0.0057402 | 1.5 | 1.65 -Output | 0.00033545 | 0.00036347 | 0.00038052 | 0.1 | 0.12 -Modify | 0.039885 | 0.041207 | 0.042435 | 0.4 | 14.03 -Other | | 0.0001001 | | | 0.03 - -Nlocal: 5.25 ave 15 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 -Nghost: 355.5 ave 432 max 282 min -Histogram: 1 0 0 0 1 1 0 0 0 1 -Neighs: 298.75 ave 822 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 - -Total # of neighbors = 1195 -Ave neighs/atom = 56.9048 -Neighbor list builds = 10 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/reax/log.8March18.reax.rdx.g++.1 b/examples/reax/log.8March18.reax.rdx.g++.1 new file mode 100644 index 0000000000..c2edc5d51f --- /dev/null +++ b/examples/reax/log.8March18.reax.rdx.g++.1 @@ -0,0 +1,107 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system + +units real + +atom_style charge +read_data data.rdx + orthogonal box = (35 35 35) to (48 48 48) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + +# reax args: hbcut hbnewflag tripflag precision + +pair_style reax 6.0 1 1 1.0e-6 +WARNING: The pair_style reax command is unsupported. Please switch to pair_style reax/c instead (../pair_reax.cpp:49) +pair_coeff * * ffield.reax 1 2 3 4 + +compute reax all pair reax + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + +timestep 1.0 + +#dump 1 all custom 10 dump.reax.rdx id type q xs ys zs + +#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair reax, perpetual + attributes: half, newton off + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.278 | 3.278 | 3.278 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + 0 0 -1885.1269 -1885.1269 27233.074 -2958.4712 79.527715 0.31082031 0 97.771125 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79973 0 168.8842 + 10 1281.7558 -1989.1322 -1912.7188 -19609.913 -2733.8828 -15.775275 0.20055725 0 55.02023 3.1070523 -77.710916 0 14.963568 -5.8082203 843.41939 -180.17724 0 107.5115 + 20 516.83079 -1941.677 -1910.8655 -12525.412 -2801.8626 7.410797 0.073134186 0 81.986983 0.2281551 -57.494871 0 30.656735 -10.102557 877.78695 -158.93385 0 88.574159 + 30 467.26411 -1940.978 -1913.1215 -35957.489 -2755.021 -6.9179958 0.049322453 0 78.853173 0.13604393 -51.653635 0 19.862871 -9.7098575 853.79334 -151.232 0 80.86177 + 40 647.45528 -1951.1994 -1912.6006 -5883.713 -2798.3556 17.334814 0.15102862 0 63.235117 0.18070924 -54.598957 0 17.325007 -12.052278 883.0167 -164.21335 0 96.777424 + 50 716.38088 -1949.4735 -1906.7656 5473.1969 -2800.9309 9.2056861 0.15413274 0 85.371466 3.2986127 -78.253597 0 34.861774 -8.553123 882.01431 -193.85254 0 117.21068 + 60 1175.2705 -1975.961 -1905.8958 -1939.4966 -2726.5816 -11.651996 0.24296786 0 48.320654 7.1799691 -75.363638 0 16.520127 -4.8869441 844.75401 -194.23297 0 119.73841 + 70 1156.701 -1975.3497 -1906.3916 24628.304 -2880.5225 25.652501 0.26894311 0 83.724852 7.1049152 -68.70096 0 24.750735 -8.6338267 911.20079 -183.40562 0 113.21047 + 80 840.23677 -1955.4769 -1905.3851 -17731.334 -2755.7299 -8.0167723 0.1386797 0 86.147417 2.2387319 -76.945843 0 23.595869 -7.260968 853.63487 -167.88288 0 94.603961 + 90 365.79122 -1926.4061 -1904.599 898.38479 -2842.1832 47.368107 0.23109002 0 92.288071 0.38031213 -61.361485 0 18.476336 -12.25546 900.24233 -186.48046 0 116.88827 + 100 801.32158 -1953.418 -1905.6462 -2417.6887 -2802.7247 4.6676477 0.18046575 0 76.729987 5.4177322 -77.102566 0 24.997175 -7.7554074 898.67337 -196.89114 0 120.38946 +Loop time of 0.463306 on 1 procs for 100 steps with 21 atoms + +Performance: 18.649 ns/day, 1.287 hours/ns, 215.840 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.46143 | 0.46143 | 0.46143 | 0.0 | 99.60 +Neigh | 0.00087953 | 0.00087953 | 0.00087953 | 0.0 | 0.19 +Comm | 0.00042653 | 0.00042653 | 0.00042653 | 0.0 | 0.09 +Output | 0.00034237 | 0.00034237 | 0.00034237 | 0.0 | 0.07 +Modify | 0.00010109 | 0.00010109 | 0.00010109 | 0.0 | 0.02 +Other | | 0.000124 | | | 0.03 + +Nlocal: 21 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1106 ave 1106 max 1106 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1106 +Ave neighs/atom = 52.6667 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.8March18.reax.rdx.g++.4 b/examples/reax/log.8March18.reax.rdx.g++.4 new file mode 100644 index 0000000000..9526e25661 --- /dev/null +++ b/examples/reax/log.8March18.reax.rdx.g++.4 @@ -0,0 +1,107 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system + +units real + +atom_style charge +read_data data.rdx + orthogonal box = (35 35 35) to (48 48 48) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 21 atoms + +# reax args: hbcut hbnewflag tripflag precision + +pair_style reax 6.0 1 1 1.0e-6 +WARNING: The pair_style reax command is unsupported. Please switch to pair_style reax/c instead (../pair_reax.cpp:49) +pair_coeff * * ffield.reax 1 2 3 4 + +compute reax all pair reax + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + +timestep 1.0 + +#dump 1 all custom 10 dump.reax.rdx id type q xs ys zs + +#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair reax, perpetual + attributes: half, newton off + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.262 | 3.36 | 3.647 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + 0 0 -1885.1268 -1885.1268 27233.074 -2958.4712 79.527715 0.31082031 0 97.771125 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79972 0 168.88428 + 10 1281.7558 -1989.1322 -1912.7187 -19609.913 -2733.8828 -15.775275 0.20055725 0 55.020231 3.1070523 -77.710916 0 14.963568 -5.8082203 843.41939 -180.17724 0 107.51152 + 20 516.83079 -1941.677 -1910.8655 -12525.412 -2801.8626 7.410797 0.073134187 0 81.986983 0.2281551 -57.494871 0 30.656735 -10.102557 877.78695 -158.93385 0 88.574168 + 30 467.26411 -1940.978 -1913.1215 -35957.489 -2755.021 -6.9179959 0.049322449 0 78.853173 0.13604392 -51.653635 0 19.862871 -9.7098575 853.79334 -151.232 0 80.861765 + 40 647.45479 -1951.1995 -1912.6007 -5883.7199 -2798.3556 17.334805 0.15102868 0 63.235116 0.18070946 -54.59897 0 17.32501 -12.052277 883.0166 -164.21339 0 96.777473 + 50 716.37927 -1949.466 -1906.7582 5473.2486 -2800.9309 9.2056758 0.15413278 0 85.37143 3.2986099 -78.253596 0 34.861773 -8.5531243 882.01424 -193.85223 0 117.21791 + 60 1175.2698 -1975.9612 -1905.896 -1939.5206 -2726.5818 -11.651942 0.24296793 0 48.320679 7.1799538 -75.36365 0 16.520134 -4.8869515 844.75405 -194.23289 0 119.7383 + 70 1156.6963 -1975.3494 -1906.3915 24628.423 -2880.5221 25.65242 0.26894312 0 83.724787 7.1049615 -68.700925 0 24.750729 -8.6338123 911.2006 -183.40591 0 113.21091 + 80 840.238 -1955.4788 -1905.387 -17731.371 -2755.7301 -8.0167357 0.13868007 0 86.147246 2.2387405 -76.945868 0 23.595868 -7.2609697 853.6349 -167.88312 0 94.602512 + 90 365.78645 -1926.4072 -1904.6004 898.36945 -2842.1831 47.368307 0.23108998 0 92.288039 0.38031101 -61.361464 0 18.476388 -12.255481 900.24216 -186.48066 0 116.88716 + 100 801.31322 -1953.4165 -1905.6452 -2417.2041 -2802.7247 4.6678077 0.18046498 0 76.730367 5.4176812 -77.102592 0 24.9973 -7.7554425 898.6732 -196.89097 0 120.39043 +Loop time of 0.404551 on 4 procs for 100 steps with 21 atoms + +Performance: 21.357 ns/day, 1.124 hours/ns, 247.188 timesteps/s +97.4% 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.2191 | 0.28038 | 0.39839 | 13.2 | 69.31 +Neigh | 5.8651e-05 | 0.00025928 | 0.00062203 | 0.0 | 0.06 +Comm | 0.0046599 | 0.12307 | 0.1845 | 19.9 | 30.42 +Output | 0.00055337 | 0.00062728 | 0.00071192 | 0.0 | 0.16 +Modify | 5.3167e-05 | 7.844e-05 | 0.00010109 | 0.0 | 0.02 +Other | | 0.0001363 | | | 0.03 + +Nlocal: 5.25 ave 15 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +Nghost: 355.5 ave 432 max 282 min +Histogram: 1 0 0 0 1 1 0 0 0 1 +Neighs: 301.25 ave 827 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 + +Total # of neighbors = 1205 +Ave neighs/atom = 57.381 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.5Oct16.reax.tatb.g++.1 b/examples/reax/log.8March18.reax.tatb.g++.1 similarity index 61% rename from examples/reax/log.5Oct16.reax.tatb.g++.1 rename to examples/reax/log.8March18.reax.tatb.g++.1 index cc8d42a583..53d77cd1da 100644 --- a/examples/reax/log.5Oct16.reax.tatb.g++.1 +++ b/examples/reax/log.8March18.reax.tatb.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # ReaxFF potential for TATB system units real @@ -12,7 +13,7 @@ read_data data.tatb # reax args: hbcut hbnewflag tripflag precision pair_style reax 6.0 1 1 1.0e-6 -WARNING: The pair_style reax command will be deprecated soon - users should switch to pair_style reax/c (../pair_reax.cpp:49) +WARNING: The pair_style reax command is unsupported. Please switch to pair_style reax/c instead (../pair_reax.cpp:49) pair_coeff * * ffield.reax 1 2 3 4 compute reax all pair reax @@ -54,34 +55,39 @@ fix 2 all reax/bonds 25 bonds.reax.tatb run 25 Neighbor list info ... - 1 neighbor list requests update every 5 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12.5 ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 5 4 3 -Memory usage per processor = 6.61277 Mbytes + binsize = 6.25, bins = 5 4 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair reax, perpetual + attributes: half, newton off + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Per MPI rank memory allocation (min/avg/max) = 7.764 | 7.764 | 7.764 Mbytes Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq 0 0 -44767.08 -44767.08 7294.6353 -61120.591 486.4378 4.7236377 0 1568.024 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6378 0 6391.0231 - 5 0.63682807 -44767.737 -44767.01 8391.5966 -61118.763 486.82916 4.723415 0 1567.835 20.768662 -278.20804 -1557.6962 252.64683 -655.74117 18859.328 -8738.2727 0 6388.8127 - 10 2.4306957 -44769.41 -44766.635 11717.369 -61113.142 487.89093 4.7227063 0 1567.2936 20.705084 -274.37509 -1560.8546 252.87219 -655.43578 18850.19 -8731.0713 0 6381.7946 - 15 5.0590478 -44772.63 -44766.854 17125.033 -61103.34 489.28007 4.7214008 0 1566.4744 20.590604 -268.28963 -1566.5961 252.97781 -654.93836 18835.335 -8719.3112 0 6370.4665 - 20 8.0678579 -44775.923 -44766.713 24620.824 -61088.791 490.42346 4.7193467 0 1565.5541 20.415031 -260.38512 -1574.1001 253.39805 -654.26837 18815.312 -8703.3104 0 6355.1097 - 25 10.975539 -44777.231 -44764.701 34381.278 -61068.889 490.53149 4.7164093 0 1566.5715 20.169755 -251.2311 -1582.8552 253.88696 -653.46042 18790.855 -8683.8362 0 6336.3099 -Loop time of 7.48375 on 1 procs for 25 steps with 384 atoms + 5 0.63682806 -44767.737 -44767.01 8391.5964 -61118.763 486.82916 4.723415 0 1567.835 20.768662 -278.20804 -1557.6962 252.64683 -655.74117 18859.328 -8738.2728 0 6388.8127 + 10 2.4306958 -44769.409 -44766.634 11717.376 -61113.142 487.89093 4.7227063 0 1567.2936 20.705084 -274.37509 -1560.8546 252.87219 -655.43578 18850.19 -8731.0693 0 6381.7942 + 15 5.0590493 -44772.631 -44766.855 17125.067 -61103.34 489.28007 4.7214008 0 1566.4744 20.590604 -268.28962 -1566.5961 252.97781 -654.93836 18835.335 -8719.3013 0 6370.4551 + 20 8.067859 -44775.936 -44766.725 24620.627 -61088.791 490.42346 4.7193467 0 1565.5541 20.415031 -260.38512 -1574.1001 253.39805 -654.26837 18815.312 -8703.3748 0 6355.1614 + 25 10.975538 -44777.233 -44764.702 34381.173 -61068.889 490.53149 4.7164093 0 1566.5715 20.169755 -251.23109 -1582.8552 253.88696 -653.46042 18790.855 -8683.8691 0 6336.3409 +Loop time of 7.80129 on 1 procs for 25 steps with 384 atoms -Performance: 0.018 ns/day, 1330.444 hours/ns, 3.341 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 0.017 ns/day, 1386.896 hours/ns, 3.205 timesteps/s +99.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 | 7.4284 | 7.4284 | 7.4284 | 0.0 | 99.26 -Neigh | 0.051549 | 0.051549 | 0.051549 | 0.0 | 0.69 -Comm | 0.0021887 | 0.0021887 | 0.0021887 | 0.0 | 0.03 -Output | 0.00025821 | 0.00025821 | 0.00025821 | 0.0 | 0.00 -Modify | 0.00099206 | 0.00099206 | 0.00099206 | 0.0 | 0.01 -Other | | 0.0003154 | | | 0.00 +Pair | 7.7384 | 7.7384 | 7.7384 | 0.0 | 99.19 +Neigh | 0.058615 | 0.058615 | 0.058615 | 0.0 | 0.75 +Comm | 0.0022428 | 0.0022428 | 0.0022428 | 0.0 | 0.03 +Output | 0.00033212 | 0.00033212 | 0.00033212 | 0.0 | 0.00 +Modify | 0.0013618 | 0.0013618 | 0.0013618 | 0.0 | 0.02 +Other | | 0.0003309 | | | 0.00 Nlocal: 384 ave 384 max 384 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -94,4 +100,4 @@ Total # of neighbors = 286828 Ave neighs/atom = 746.948 Neighbor list builds = 5 Dangerous builds not checked -Total wall time: 0:00:07 +Total wall time: 0:00:08 diff --git a/examples/reax/log.5Oct16.reax.tatb.g++.4 b/examples/reax/log.8March18.reax.tatb.g++.4 similarity index 61% rename from examples/reax/log.5Oct16.reax.tatb.g++.4 rename to examples/reax/log.8March18.reax.tatb.g++.4 index 8fa9a608cf..e3acac9d0e 100644 --- a/examples/reax/log.5Oct16.reax.tatb.g++.4 +++ b/examples/reax/log.8March18.reax.tatb.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # ReaxFF potential for TATB system units real @@ -12,7 +13,7 @@ read_data data.tatb # reax args: hbcut hbnewflag tripflag precision pair_style reax 6.0 1 1 1.0e-6 -WARNING: The pair_style reax command will be deprecated soon - users should switch to pair_style reax/c (../pair_reax.cpp:49) +WARNING: The pair_style reax command is unsupported. Please switch to pair_style reax/c instead (../pair_reax.cpp:49) pair_coeff * * ffield.reax 1 2 3 4 compute reax all pair reax @@ -54,34 +55,39 @@ fix 2 all reax/bonds 25 bonds.reax.tatb run 25 Neighbor list info ... - 1 neighbor list requests update every 5 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12.5 ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 5 4 3 -Memory usage per processor = 4.03843 Mbytes + binsize = 6.25, bins = 5 4 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair reax, perpetual + attributes: half, newton off + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.402 | 4.402 | 4.402 Mbytes Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq 0 0 -44767.08 -44767.08 7294.6353 -61120.591 486.4378 4.7236377 0 1568.024 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6378 0 6391.0231 - 5 0.63682726 -44767.816 -44767.089 8391.165 -61118.763 486.82916 4.723415 0 1567.835 20.768662 -278.20804 -1557.6962 252.64683 -655.74117 18859.328 -8738.3995 0 6388.86 - 10 2.4306905 -44769.408 -44766.633 11717.247 -61113.142 487.89094 4.7227063 0 1567.2936 20.705084 -274.3751 -1560.8546 252.87219 -655.43578 18850.19 -8731.0965 0 6381.8216 - 15 5.0590422 -44772.626 -44766.85 17124.943 -61103.34 489.2801 4.7214008 0 1566.4744 20.590604 -268.28963 -1566.5961 252.97781 -654.93836 18835.335 -8719.3383 0 6370.4973 - 20 8.0678512 -44775.934 -44766.723 24620.531 -61088.791 490.42349 4.7193467 0 1565.5541 20.415031 -260.38513 -1574.1001 253.39804 -654.26837 18815.312 -8703.4033 0 6355.1921 - 25 10.97553 -44777.231 -44764.701 34381.242 -61068.889 490.53154 4.7164093 0 1566.5715 20.169755 -251.23111 -1582.8552 253.88696 -653.46042 18790.855 -8683.8451 0 6336.3185 -Loop time of 3.27945 on 4 procs for 25 steps with 384 atoms + 5 0.63682727 -44767.816 -44767.089 8391.1708 -61118.763 486.82916 4.723415 0 1567.835 20.768662 -278.20804 -1557.6962 252.64683 -655.74117 18859.328 -8738.3973 0 6388.8581 + 10 2.4306941 -44769.405 -44766.63 11717.306 -61113.142 487.89094 4.7227063 0 1567.2936 20.705084 -274.3751 -1560.8546 252.87219 -655.43578 18850.19 -8731.08 0 6381.8083 + 15 5.0590444 -44772.6 -44766.824 17125.207 -61103.34 489.28008 4.7214008 0 1566.4744 20.590604 -268.28963 -1566.5961 252.97781 -654.93836 18835.335 -8719.2653 0 6370.4505 + 20 8.0678523 -44775.983 -44766.772 24620.114 -61088.791 490.42348 4.7193467 0 1565.5541 20.415031 -260.38513 -1574.1001 253.39804 -654.26837 18815.312 -8703.5228 0 6355.2629 + 25 10.975532 -44777.234 -44764.704 34381.065 -61068.889 490.53151 4.7164093 0 1566.5715 20.169755 -251.23111 -1582.8552 253.88696 -653.46042 18790.855 -8683.898 0 6336.3682 +Loop time of 3.74388 on 4 procs for 25 steps with 384 atoms -Performance: 0.041 ns/day, 583.013 hours/ns, 7.623 timesteps/s -99.8% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 0.036 ns/day, 665.579 hours/ns, 6.678 timesteps/s +98.7% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 3.0329 | 3.1456 | 3.2612 | 5.2 | 95.92 -Neigh | 0.011087 | 0.011261 | 0.011608 | 0.2 | 0.34 -Comm | 0.0057111 | 0.12121 | 0.23398 | 26.2 | 3.70 -Output | 0.00039172 | 0.0005855 | 0.00080633 | 0.6 | 0.02 -Modify | 0.00035787 | 0.00059456 | 0.00082469 | 0.7 | 0.02 -Other | | 0.0002265 | | | 0.01 +Pair | 3.478 | 3.6025 | 3.7215 | 4.8 | 96.22 +Neigh | 0.012731 | 0.01299 | 0.013174 | 0.2 | 0.35 +Comm | 0.0073411 | 0.12653 | 0.25119 | 25.4 | 3.38 +Output | 0.00050354 | 0.00081849 | 0.0011628 | 0.0 | 0.02 +Modify | 0.00049281 | 0.00082356 | 0.001157 | 0.0 | 0.02 +Other | | 0.0002663 | | | 0.01 Nlocal: 96 ave 96 max 96 min Histogram: 4 0 0 0 0 0 0 0 0 0 diff --git a/examples/reax/log.8March18.reaxc.rdx.g++.1 b/examples/reax/log.8March18.reaxc.rdx.g++.1 new file mode 100644 index 0000000000..4ae10e3f52 --- /dev/null +++ b/examples/reax/log.8March18.reaxc.rdx.g++.1 @@ -0,0 +1,115 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx + orthogonal box = (35 35 35) to (48 48 48) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + +pair_style reax/c control.reax_c.rdx +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 15.28 | 15.28 | 15.28 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79937 0 168.88402 + 10 1288.6114 -1989.6644 -1912.8422 -19456.35 -2734.6769 -15.607219 0.20177961 0 54.629556 3.1252294 -77.7067 0 14.933901 -5.8108541 843.92074 -180.43322 0 107.75935 + 20 538.95849 -1942.7037 -1910.5731 -10725.658 -2803.7395 7.9078331 0.077926702 0 81.610043 0.22951937 -57.557104 0 30.331203 -10.178049 878.99015 -159.69092 0 89.315159 + 30 463.09542 -1933.5765 -1905.9685 -33255.507 -2749.8591 -8.0154628 0.027628767 0 81.627403 0.11972403 -50.262284 0 20.82032 -9.6327022 851.88722 -149.495 0 79.205731 + 40 885.49449 -1958.9126 -1906.1228 -4814.7123 -2795.644 9.1506221 0.1374749 0 70.948046 0.24360579 -57.8627 0 19.076515 -11.141211 873.73892 -159.9939 0 92.434059 + 50 861.1646 -1954.4599 -1903.1206 -1896.7387 -2784.8446 3.8269113 0.1579328 0 79.851775 3.3492107 -78.066127 0 32.628975 -7.9565255 872.81826 -190.98565 0 114.75994 + 60 1167.785 -1971.8432 -1902.2243 -3482.6975 -2705.8638 -17.121582 0.22749067 0 44.507705 7.856069 -74.788959 0 16.256519 -4.6046602 835.8308 -188.33691 0 114.19414 + 70 1439.9947 -1989.3024 -1903.4554 23845.067 -2890.7896 31.958874 0.26671735 0 85.758608 3.1803486 -71.002907 0 24.357106 -10.311315 905.86799 -175.38482 0 106.79659 + 80 502.40024 -1930.7547 -1900.8035 -20356.557 -2703.8096 -18.663105 0.11286226 0 99.803799 2.0329394 -76.171387 0 19.236609 -6.2786041 826.47358 -166.03157 0 92.539694 + 90 749.09267 -1946.9834 -1902.3254 17798.812 -2863.7586 42.068927 0.24338042 0 96.18195 0.96181754 -69.955528 0 24.61541 -11.58277 903.68895 -190.13838 0 120.69139 + 100 1109.7046 -1968.5875 -1902.4311 -4490.6736 -2755.8953 -7.1235173 0.21757663 0 61.806405 7.0825933 -75.645487 0 20.114745 -6.2371664 863.56285 -198.56939 0 122.09923 +Loop time of 0.395195 on 1 procs for 100 steps with 21 atoms + +Performance: 21.863 ns/day, 1.098 hours/ns, 253.039 timesteps/s +99.3% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.3722 | 0.3722 | 0.3722 | 0.0 | 94.18 +Neigh | 0.0098455 | 0.0098455 | 0.0098455 | 0.0 | 2.49 +Comm | 0.00047445 | 0.00047445 | 0.00047445 | 0.0 | 0.12 +Output | 0.00034022 | 0.00034022 | 0.00034022 | 0.0 | 0.09 +Modify | 0.012187 | 0.012187 | 0.012187 | 0.0 | 3.08 +Other | | 0.0001521 | | | 0.04 + +Nlocal: 21 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.1905 +Neighbor list builds = 10 +Dangerous builds not checked + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:00 diff --git a/examples/reax/log.8March18.reaxc.rdx.g++.4 b/examples/reax/log.8March18.reaxc.rdx.g++.4 new file mode 100644 index 0000000000..6ea4835402 --- /dev/null +++ b/examples/reax/log.8March18.reaxc.rdx.g++.4 @@ -0,0 +1,115 @@ +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx + orthogonal box = (35 35 35) to (48 48 48) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 21 atoms + +pair_style reax/c control.reax_c.rdx +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#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 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 10.37 | 11.76 | 13.34 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq + 0 0 -1884.3081 -1884.3081 27186.178 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79988 0 168.88453 + 10 1288.6115 -1989.6644 -1912.8422 -19456.354 -2734.6769 -15.60722 0.2017796 0 54.629558 3.1252286 -77.7067 0 14.933902 -5.8108544 843.92073 -180.43321 0 107.75934 + 20 538.95818 -1942.7037 -1910.5731 -10725.623 -2803.7394 7.9078307 0.077926702 0 81.61005 0.22951942 -57.557107 0 30.331206 -10.178049 878.9901 -159.68951 0 89.313749 + 30 463.09514 -1933.5765 -1905.9685 -33255.525 -2749.859 -8.0154737 0.027628797 0 81.627408 0.11972402 -50.262283 0 20.82031 -9.6327021 851.88715 -149.49499 0 79.205724 + 40 885.49412 -1958.9125 -1906.1227 -4814.6606 -2795.6439 9.150622 0.13747487 0 70.948029 0.24360517 -57.862679 0 19.076509 -11.141214 873.7389 -159.99392 0 92.434078 + 50 861.16393 -1954.46 -1903.1207 -1896.7323 -2784.8449 3.8270197 0.1579328 0 79.851743 3.3492115 -78.066132 0 32.628992 -7.9565379 872.81841 -190.98568 0 114.75996 + 60 1167.7846 -1971.8432 -1902.2243 -3482.8111 -2705.8633 -17.121657 0.2274907 0 44.507681 7.8560366 -74.788989 0 16.256493 -4.6046537 835.8305 -188.33687 0 114.1941 + 70 1439.9942 -1989.3023 -1903.4554 23845.444 -2890.7894 31.958784 0.26671721 0 85.758586 3.1803655 -71.002918 0 24.357158 -10.311304 905.86792 -175.38481 0 106.79657 + 80 502.3975 -1930.7546 -1900.8036 -20356.439 -2703.8105 -18.662812 0.11286123 0 99.80391 2.0329293 -76.171334 0 19.236803 -6.2786439 826.47397 -166.03141 0 92.539551 + 90 749.09048 -1946.9837 -1902.3258 17798.718 -2863.7582 42.068719 0.24338057 0 96.181773 0.96183581 -69.955529 0 24.615414 -11.582758 903.68862 -190.1384 0 120.69139 + 100 1109.6999 -1968.5875 -1902.4314 -4490.3728 -2755.8964 -7.1231468 0.21757685 0 61.806149 7.0826648 -75.645428 0 20.115002 -6.2371958 863.56343 -198.56957 0 122.09942 +Loop time of 0.329552 on 4 procs for 100 steps with 21 atoms + +Performance: 26.217 ns/day, 0.915 hours/ns, 303.443 timesteps/s +96.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 | 0.26372 | 0.26499 | 0.26754 | 0.3 | 80.41 +Neigh | 0.0045478 | 0.0062494 | 0.0076699 | 1.5 | 1.90 +Comm | 0.0041637 | 0.0064691 | 0.0080271 | 1.8 | 1.96 +Output | 0.00054169 | 0.00056636 | 0.00060368 | 0.0 | 0.17 +Modify | 0.049433 | 0.051134 | 0.05311 | 0.6 | 15.52 +Other | | 0.000141 | | | 0.04 + +Nlocal: 5.25 ave 15 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +Nghost: 355.5 ave 432 max 282 min +Histogram: 1 0 0 0 1 1 0 0 0 1 +Neighs: 298.75 ave 822 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 + +Total # of neighbors = 1195 +Ave neighs/atom = 56.9048 +Neighbor list builds = 10 +Dangerous builds not checked + +Please see the log.cite file for references relevant to this simulation + +Total wall time: 0:00:00 diff --git a/examples/reax/log.5Oct16.reaxc.tatb.g++.1 b/examples/reax/log.8March18.reaxc.tatb.g++.1 similarity index 57% rename from examples/reax/log.5Oct16.reaxc.tatb.g++.1 rename to examples/reax/log.8March18.reaxc.tatb.g++.1 index deb1c5f1d7..ac5537bba4 100644 --- a/examples/reax/log.5Oct16.reaxc.tatb.g++.1 +++ b/examples/reax/log.8March18.reaxc.tatb.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # ReaxFF potential for TATB system # this run is equivalent to reax/in.reax.tatb, @@ -56,34 +57,44 @@ fix 3 all reax/c/species 1 5 5 species.tatb run 25 Neighbor list info ... - 2 neighbor list requests update every 5 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12.5 ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 5 4 3 -Memory usage per processor = 155.82 Mbytes + binsize = 6.25, bins = 5 4 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 176.7 | 176.7 | 176.7 Mbytes Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -44760.998 -44760.998 7827.7879 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6394 0 6391.0274 - 5 0.61603942 -44761.698 -44760.994 8934.6281 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.193 0 6388.6691 - 10 2.3525551 -44763.227 -44760.541 12288.607 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50358 -1560.7569 252.85309 -655.44063 18850.391 -8730.9688 0 6381.7066 - 15 4.9013326 -44766.36 -44760.764 17717.015 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.237 0 6370.4033 - 20 7.829471 -44769.686 -44760.747 25205.558 -61089.006 490.21313 4.719302 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.5091 0 6355.2604 - 25 10.697926 -44772.904 -44760.691 34232.793 -61069.308 490.25886 4.7163736 0 1570.7397 20.181346 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.3608 0 6336.8416 -Loop time of 4.34725 on 1 procs for 25 steps with 384 atoms + 0 0 -44760.998 -44760.998 7827.7874 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6395 0 6391.0275 + 5 0.61603968 -44761.698 -44760.994 8934.6347 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1911 0 6388.6671 + 10 2.3525551 -44763.227 -44760.541 12288.583 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9768 0 6381.7146 + 15 4.9013279 -44766.36 -44760.764 17717.01 -61103.434 489.14722 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2375 0 6370.4038 + 20 7.8294645 -44769.686 -44760.747 25205.624 -61089.006 490.21314 4.719302 0 1571.7022 20.420943 -260.85564 -1573.7378 253.3539 -654.31623 18816.07 -8703.4889 0 6355.2402 + 25 10.697904 -44772.904 -44760.691 34232.965 -61069.308 490.25888 4.7163736 0 1570.7397 20.181346 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.3125 0 6336.7934 +Loop time of 4.72562 on 1 procs for 25 steps with 384 atoms -Performance: 0.031 ns/day, 772.845 hours/ns, 5.751 timesteps/s -99.8% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 0.029 ns/day, 840.110 hours/ns, 5.290 timesteps/s +99.4% 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.5264 | 3.5264 | 3.5264 | 0.0 | 81.12 -Neigh | 0.40335 | 0.40335 | 0.40335 | 0.0 | 9.28 -Comm | 0.0021031 | 0.0021031 | 0.0021031 | 0.0 | 0.05 -Output | 0.00019765 | 0.00019765 | 0.00019765 | 0.0 | 0.00 -Modify | 0.41479 | 0.41479 | 0.41479 | 0.0 | 9.54 -Other | | 0.0004084 | | | 0.01 +Pair | 3.775 | 3.775 | 3.775 | 0.0 | 79.88 +Neigh | 0.47047 | 0.47047 | 0.47047 | 0.0 | 9.96 +Comm | 0.0025151 | 0.0025151 | 0.0025151 | 0.0 | 0.05 +Output | 0.0003159 | 0.0003159 | 0.0003159 | 0.0 | 0.01 +Modify | 0.47676 | 0.47676 | 0.47676 | 0.0 | 10.09 +Other | | 0.0005293 | | | 0.01 Nlocal: 384 ave 384 max 384 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -99,4 +110,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:04 +Total wall time: 0:00:05 diff --git a/examples/reax/log.5Oct16.reaxc.tatb.g++.4 b/examples/reax/log.8March18.reaxc.tatb.g++.4 similarity index 57% rename from examples/reax/log.5Oct16.reaxc.tatb.g++.4 rename to examples/reax/log.8March18.reaxc.tatb.g++.4 index 064a4da54c..12558be68a 100644 --- a/examples/reax/log.5Oct16.reaxc.tatb.g++.4 +++ b/examples/reax/log.8March18.reaxc.tatb.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (5 Oct 2016) +LAMMPS (8 Mar 2018) + using 1 OpenMP thread(s) per MPI task # ReaxFF potential for TATB system # this run is equivalent to reax/in.reax.tatb, @@ -56,34 +57,44 @@ fix 3 all reax/c/species 1 5 5 species.tatb run 25 Neighbor list info ... - 2 neighbor list requests update every 5 steps, delay 0 steps, check no max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 12.5 ghost atom cutoff = 12.5 - binsize = 6.25 -> bins = 5 4 3 -Memory usage per processor = 105.386 Mbytes + binsize = 6.25, bins = 5 4 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 118 | 118 | 118 Mbytes Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -44760.998 -44760.998 7827.7867 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6397 0 6391.0277 - 5 0.61603967 -44761.698 -44760.994 8934.6339 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1905 0 6388.6665 - 10 2.3525545 -44763.227 -44760.541 12288.586 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9762 0 6381.714 - 15 4.9013281 -44766.36 -44760.764 17716.982 -61103.434 489.14722 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2476 0 6370.4138 - 20 7.8294637 -44769.686 -44760.747 25205.512 -61089.006 490.21314 4.719302 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.518 0 6355.2692 - 25 10.697905 -44772.904 -44760.691 34232.815 -61069.308 490.25887 4.7163736 0 1570.7397 20.181346 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.3481 0 6336.829 -Loop time of 2.60733 on 4 procs for 25 steps with 384 atoms + 0 0 -44760.998 -44760.998 7827.7866 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6398 0 6391.0277 + 5 0.61603968 -44761.698 -44760.994 8934.6335 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1906 0 6388.6666 + 10 2.3525544 -44763.227 -44760.541 12288.587 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9764 0 6381.7141 + 15 4.9013311 -44766.36 -44760.764 17716.955 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2558 0 6370.4221 + 20 7.8294715 -44769.686 -44760.747 25205.613 -61089.006 490.21314 4.7193021 0 1571.7022 20.420943 -260.85564 -1573.7378 253.3539 -654.31623 18816.07 -8703.4906 0 6355.2419 + 25 10.697924 -44772.904 -44760.691 34232.794 -61069.308 490.25886 4.7163736 0 1570.7397 20.181347 -251.91376 -1582.3261 253.82253 -653.53183 18791.975 -8684.3641 0 6336.8449 +Loop time of 2.84068 on 4 procs for 25 steps with 384 atoms -Performance: 0.052 ns/day, 463.526 hours/ns, 9.588 timesteps/s -99.9% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 0.048 ns/day, 505.009 hours/ns, 8.801 timesteps/s +98.4% 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.1835 | 2.1843 | 2.1854 | 0.0 | 83.77 -Neigh | 0.22091 | 0.22364 | 0.22821 | 0.6 | 8.58 -Comm | 0.005677 | 0.0069622 | 0.0078082 | 1.0 | 0.27 -Output | 0.00036621 | 0.0028675 | 0.0037034 | 2.7 | 0.11 -Modify | 0.18736 | 0.18921 | 0.19102 | 0.4 | 7.26 -Other | | 0.0003636 | | | 0.01 +Pair | 2.3253 | 2.328 | 2.3305 | 0.2 | 81.95 +Neigh | 0.2589 | 0.26458 | 0.26897 | 0.7 | 9.31 +Comm | 0.0094428 | 0.012062 | 0.014872 | 2.3 | 0.42 +Output | 0.00043392 | 0.0042209 | 0.0054941 | 3.4 | 0.15 +Modify | 0.22563 | 0.23134 | 0.23579 | 0.8 | 8.14 +Other | | 0.0005122 | | | 0.02 Nlocal: 96 ave 96 max 96 min Histogram: 4 0 0 0 0 0 0 0 0 0 @@ -99,4 +110,4 @@ Dangerous builds not checked Please see the log.cite file for references relevant to this simulation -Total wall time: 0:00:02 +Total wall time: 0:00:03 diff --git a/examples/rigid/bodies.txt b/examples/rigid/bodies.txt new file mode 100644 index 0000000000..ddca2c7539 --- /dev/null +++ b/examples/rigid/bodies.txt @@ -0,0 +1,83 @@ +81 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +9 1 +10 2 +11 2 +12 2 +13 2 +14 2 +15 2 +16 2 +17 2 +18 2 +19 3 +20 3 +21 3 +22 3 +23 3 +24 3 +25 3 +26 3 +27 3 +28 4 +29 4 +30 4 +31 4 +32 4 +33 4 +34 4 +35 4 +36 4 +37 5 +38 5 +39 5 +40 5 +41 5 +42 5 +43 5 +44 5 +45 5 +46 6 +47 6 +48 6 +49 6 +50 6 +51 6 +52 6 +53 6 +54 6 +55 7 +56 7 +57 7 +58 7 +59 7 +60 7 +61 7 +62 7 +63 7 +64 8 +65 8 +66 8 +67 8 +68 8 +69 8 +70 8 +71 8 +72 8 +73 9 +74 9 +75 9 +76 9 +77 9 +78 9 +79 9 +80 9 +81 9 + diff --git a/examples/rigid/data.rigid-property b/examples/rigid/data.rigid-property new file mode 100644 index 0000000000..66fc42d2d2 --- /dev/null +++ b/examples/rigid/data.rigid-property @@ -0,0 +1,185 @@ +# LAMMPS data file for rigid bodies + +81 atoms +1 atom types + +-12 12 xlo xhi +-12 12 ylo yhi +-12 12 zlo zhi + +Masses + +1 1 + +Pair Coeffs + +1 1 1 + +Atoms + +1 1 0 0 0 +2 1 0 1 0 +3 1 0 0.5 0 +4 1 0.5 0 0 +5 1 0.5 0.5 1 +6 1 1 0.5 0 +7 1 0.5 1 0 +8 1 1 0 0 +9 1 1 1 0 +10 1 2 1 0 +11 1 1 2 0 +12 1 1.5 2 0 +13 1 1.5 1 0 +14 1 1 1.5 0 +15 1 1.5 1.5 1 +16 1 2 1.5 0 +17 1 2 2 0 +18 1 2 3 0 +19 1 2 2.5 0 +20 1 2.5 2 0 +21 1 2.5 2.5 1 +22 1 3 2.5 0 +23 1 2.5 3 0 +24 1 3 2 0 +25 1 3 3 0 +26 1 4 3 0 +27 1 3 4 0 +28 1 3.5 4 0 +29 1 3.5 3 0 +30 1 3 3.5 0 +31 1 3.5 3.5 1 +32 1 4 3.5 0 +33 1 4 4 0 +34 1 4 5 0 +35 1 4 4.5 0 +36 1 4.5 4 0 +37 1 4.5 4.5 1 +38 1 5 4.5 0 +39 1 4.5 5 0 +40 1 5 4 0 +41 1 5 5 0 +42 1 6 5 0 +43 1 5 6 0 +44 1 5.5 6 0 +45 1 5.5 5 0 +46 1 5 5.5 0 +47 1 5.5 5.5 1 +48 1 6 5.5 0 +49 1 6 6 0 +50 1 6 7 0 +51 1 6 6.5 0 +52 1 6.5 6 0 +53 1 6.5 6.5 1 +54 1 7 6.5 0 +55 1 6.5 7 0 +56 1 7 6 0 +57 1 7 7 0 +58 1 8 7 0 +59 1 7 8 0 +60 1 7.5 8 0 +61 1 7.5 7 0 +62 1 7 7.5 0 +63 1 7.5 7.5 1 +64 1 8 7.5 0 +65 1 8 8 0 +66 1 8 9 0 +67 1 8 8.5 0 +68 1 8.5 8 0 +69 1 8.5 8.5 1 +70 1 9 8.5 0 +71 1 8.5 9 0 +72 1 9 8 0 +73 1 9 9 0 +74 1 10 9 0 +75 1 9 10 0 +76 1 9.5 10 0 +77 1 9.5 9 0 +78 1 9 9.5 0 +79 1 9.5 9.5 1 +80 1 10 9.5 0 +81 1 10 10 0 + +Bodies + +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +9 1 +10 2 +11 2 +12 2 +13 2 +14 2 +15 2 +16 2 +17 2 +18 2 +19 3 +20 3 +21 3 +22 3 +23 3 +24 3 +25 3 +26 3 +27 3 +28 4 +29 4 +30 4 +31 4 +32 4 +33 4 +34 4 +35 4 +36 4 +37 5 +38 5 +39 5 +40 5 +41 5 +42 5 +43 5 +44 5 +45 5 +46 6 +47 6 +48 6 +49 6 +50 6 +51 6 +52 6 +53 6 +54 6 +55 7 +56 7 +57 7 +58 7 +59 7 +60 7 +61 7 +62 7 +63 7 +64 8 +65 8 +66 8 +67 8 +68 8 +69 8 +70 8 +71 8 +72 8 +73 9 +74 9 +75 9 +76 9 +77 9 +78 9 +79 9 +80 9 +81 9 + diff --git a/examples/rigid/in.rigid-atomfile b/examples/rigid/in.rigid-atomfile new file mode 100644 index 0000000000..8817386c79 --- /dev/null +++ b/examples/rigid/in.rigid-atomfile @@ -0,0 +1,83 @@ +# Simple rigid body system + +units lj +atom_style atomic +atom_modify map array + +pair_style lj/cut 2.5 + +read_data data.rigid + +velocity all create 100.0 4928459 + + +# unconnected bodies + +group clump1 id <> 1 9 +group clump2 id <> 10 18 +group clump3 id <> 19 27 +group clump4 id <> 28 36 +group clump5 id <> 37 45 +group clump6 id <> 46 54 +group clump7 id <> 55 63 +group clump8 id <> 64 72 +group clump9 id <> 73 81 + +variable bodies atomfile bodies.txt +fix 1 all rigid custom v_bodies + +# 1 chain of connected bodies + +#group clump1 id <> 1 9 +#group clump2 id <> 9 18 +#group clump3 id <> 18 27 +#group clump4 id <> 27 36 +#group clump5 id <> 36 45 +#group clump6 id <> 45 54 +#group clump7 id <> 54 63 +#group clump8 id <> 63 72 +#group clump9 id <> 72 81 + +#fix 1 all poems group clump1 clump2 clump3 clump4 clump5 & +# clump6 clump7 clump8 clump9 + +# 2 chains of connected bodies + +#group clump1 id <> 1 9 +#group clump2 id <> 9 18 +#group clump3 id <> 18 27 +#group clump4 id <> 27 36 +#group clump5 id <> 37 45 +#group clump6 id <> 45 54 +#group clump7 id <> 54 63 +#group clump8 id <> 63 72 +#group clump9 id <> 72 81 + +#fix 1 all poems group clump1 clump2 clump3 clump4 +#fix 2 all poems group clump5 clump6 clump7 clump8 clump9 + +neigh_modify exclude group clump1 clump1 +neigh_modify exclude group clump2 clump2 +neigh_modify exclude group clump3 clump3 +neigh_modify exclude group clump4 clump4 +neigh_modify exclude group clump5 clump5 +neigh_modify exclude group clump6 clump6 +neigh_modify exclude group clump7 clump7 +neigh_modify exclude group clump8 clump8 +neigh_modify exclude group clump9 clump9 + +thermo 100 + +#dump 1 all atom 50 dump.rigid + +#dump 2 all image 100 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 5 + +#dump 3 all movie 100 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 5 + +timestep 0.0001 +thermo 50 +run 10000 diff --git a/examples/rigid/in.rigid-atomvar b/examples/rigid/in.rigid-atomvar new file mode 100644 index 0000000000..994ab1d284 --- /dev/null +++ b/examples/rigid/in.rigid-atomvar @@ -0,0 +1,83 @@ +# Simple rigid body system + +units lj +atom_style atomic +atom_modify map array + +pair_style lj/cut 2.5 + +read_data data.rigid + +velocity all create 100.0 4928459 + + +# unconnected bodies + +group clump1 id <> 1 9 +group clump2 id <> 10 18 +group clump3 id <> 19 27 +group clump4 id <> 28 36 +group clump5 id <> 37 45 +group clump6 id <> 46 54 +group clump7 id <> 55 63 +group clump8 id <> 64 72 +group clump9 id <> 73 81 + +variable bodies atom 1.0*gmask(clump1)+2.0*gmask(clump2)+3.0*gmask(clump3)+4.0*gmask(clump4)+5.0*gmask(clump5)+6.0*gmask(clump6)+7.0*gmask(clump7)+8.0*gmask(clump8)+9.0*gmask(clump9) +fix 1 all rigid custom v_bodies + +# 1 chain of connected bodies + +#group clump1 id <> 1 9 +#group clump2 id <> 9 18 +#group clump3 id <> 18 27 +#group clump4 id <> 27 36 +#group clump5 id <> 36 45 +#group clump6 id <> 45 54 +#group clump7 id <> 54 63 +#group clump8 id <> 63 72 +#group clump9 id <> 72 81 + +#fix 1 all poems group clump1 clump2 clump3 clump4 clump5 & +# clump6 clump7 clump8 clump9 + +# 2 chains of connected bodies + +#group clump1 id <> 1 9 +#group clump2 id <> 9 18 +#group clump3 id <> 18 27 +#group clump4 id <> 27 36 +#group clump5 id <> 37 45 +#group clump6 id <> 45 54 +#group clump7 id <> 54 63 +#group clump8 id <> 63 72 +#group clump9 id <> 72 81 + +#fix 1 all poems group clump1 clump2 clump3 clump4 +#fix 2 all poems group clump5 clump6 clump7 clump8 clump9 + +neigh_modify exclude group clump1 clump1 +neigh_modify exclude group clump2 clump2 +neigh_modify exclude group clump3 clump3 +neigh_modify exclude group clump4 clump4 +neigh_modify exclude group clump5 clump5 +neigh_modify exclude group clump6 clump6 +neigh_modify exclude group clump7 clump7 +neigh_modify exclude group clump8 clump8 +neigh_modify exclude group clump9 clump9 + +thermo 100 + +#dump 1 all atom 50 dump.rigid + +#dump 2 all image 100 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 5 + +#dump 3 all movie 100 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 5 + +timestep 0.0001 +thermo 50 +run 10000 diff --git a/examples/rigid/in.rigid-property b/examples/rigid/in.rigid-property new file mode 100644 index 0000000000..53d62776e6 --- /dev/null +++ b/examples/rigid/in.rigid-property @@ -0,0 +1,85 @@ +# Simple rigid body system + +units lj +atom_style atomic +atom_modify map array + +pair_style lj/cut 2.5 + +fix 0 all property/atom i_bodies + +read_data data.rigid-property fix 0 NULL Bodies + +velocity all create 100.0 4928459 + + +# unconnected bodies + +group clump1 id <> 1 9 +group clump2 id <> 10 18 +group clump3 id <> 19 27 +group clump4 id <> 28 36 +group clump5 id <> 37 45 +group clump6 id <> 46 54 +group clump7 id <> 55 63 +group clump8 id <> 64 72 +group clump9 id <> 73 81 + +# assemble bodies from per-atom custom integer property bodies +fix 1 all rigid custom i_bodies + +# 1 chain of connected bodies + +#group clump1 id <> 1 9 +#group clump2 id <> 9 18 +#group clump3 id <> 18 27 +#group clump4 id <> 27 36 +#group clump5 id <> 36 45 +#group clump6 id <> 45 54 +#group clump7 id <> 54 63 +#group clump8 id <> 63 72 +#group clump9 id <> 72 81 + +#fix 1 all poems group clump1 clump2 clump3 clump4 clump5 & +# clump6 clump7 clump8 clump9 + +# 2 chains of connected bodies + +#group clump1 id <> 1 9 +#group clump2 id <> 9 18 +#group clump3 id <> 18 27 +#group clump4 id <> 27 36 +#group clump5 id <> 37 45 +#group clump6 id <> 45 54 +#group clump7 id <> 54 63 +#group clump8 id <> 63 72 +#group clump9 id <> 72 81 + +#fix 1 all poems group clump1 clump2 clump3 clump4 +#fix 2 all poems group clump5 clump6 clump7 clump8 clump9 + +neigh_modify exclude group clump1 clump1 +neigh_modify exclude group clump2 clump2 +neigh_modify exclude group clump3 clump3 +neigh_modify exclude group clump4 clump4 +neigh_modify exclude group clump5 clump5 +neigh_modify exclude group clump6 clump6 +neigh_modify exclude group clump7 clump7 +neigh_modify exclude group clump8 clump8 +neigh_modify exclude group clump9 clump9 + +thermo 100 + +#dump 1 all atom 50 dump.rigid + +#dump 2 all image 100 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 5 + +#dump 3 all movie 100 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 5 + +timestep 0.0001 +thermo 50 +run 10000 diff --git a/examples/snap/Mo_Chen_PRM2017.snap b/examples/snap/Mo_Chen_PRM2017.snap new file mode 100644 index 0000000000..e5e5f3e180 --- /dev/null +++ b/examples/snap/Mo_Chen_PRM2017.snap @@ -0,0 +1,7 @@ + +# DATE: 2017-09-18 CONTRIBUTOR: Chi Chen CITATION: C. Chen, Z. Deng, R. Tran, H. Tang, I.-H. Chu, S. P. Ong, "Accurate force field for molybdenum by machine learning large materials data" Physical Review Materials 1, 04 3603 (2017) +# Generated by Materials Virtual Lab +# Definition of SNAP potential. +pair_style snap +pair_coeff * * Mo_Chen_PRM2017.snapcoeff Mo Mo_Chen_PRM2017.snapparam Mo + diff --git a/examples/snap/Mo_Chen_PRM2017.snapcoeff b/examples/snap/Mo_Chen_PRM2017.snapcoeff new file mode 100644 index 0000000000..577c45bd76 --- /dev/null +++ b/examples/snap/Mo_Chen_PRM2017.snapcoeff @@ -0,0 +1,35 @@ +# DATE: 2017-09-18 CONTRIBUTOR: Chi Chen CITATION: C. Chen, Z. Deng, R. Tran, H. Tang, I.-H. Chu, S. P. Ong, "Accurate force field for molybdenum by machine learning large materials data" Physical Review Materials 1, 04 3603 (2017) +# Generated by Materials Virtual Lab +1 31 +Mo 0.5 1 +-17.2757958404 +0.00431015861472 +0.0657685117891 +0.477733335702 +0.0152688837211 +0.77559888196 +0.284846429566 +0.148804982644 +0.0573702179736 +0.19281989434 +0.323441703578 +0.101324335724 +0.0139639846514 +-0.0324444749083 +0.0349797952779 +0.0613023441282 +0.0881078513046 +0.118716074611 +0.0069662975532 +-0.0174658914685 +-0.0178902177779 +0.0195993756659 +0.0719238160707 +0.0344832661036 +-0.0358616891662 +-0.0292380783172 +-0.0334933909866 +0.00595462520243 +0.0754556638328 +-0.000972545258845 +-0.0100170422751 diff --git a/examples/snap/Mo_Chen_PRM2017.snapparam b/examples/snap/Mo_Chen_PRM2017.snapparam new file mode 100644 index 0000000000..e618bc1dd4 --- /dev/null +++ b/examples/snap/Mo_Chen_PRM2017.snapparam @@ -0,0 +1,4 @@ +# DATE: 2017-09-18 CONTRIBUTOR: Chi Chen CITATION: C. Chen, Z. Deng, R. Tran, H. Tang, I.-H. Chu, S. P. Ong, "Accurate force field for molybdenum by machine learning large materials data" Physical Review Materials 1, 04 3603 (2017) +# Generated by Materials Virtual Lab +rcutfac 4.615858 +twojmax 6 diff --git a/examples/snap/in.snap.Mo_Chen b/examples/snap/in.snap.Mo_Chen new file mode 100644 index 0000000000..007bce2462 --- /dev/null +++ b/examples/snap/in.snap.Mo_Chen @@ -0,0 +1,45 @@ +# Demonstrate SNAP Ta potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 3.160 +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 183.84 + +# choose potential + +include Mo_Chen_PRM2017.snap + +# Setup output + +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 +fix 1 all nve +run ${nsteps} + diff --git a/lib/.gitignore b/lib/.gitignore index e153da2c34..4f9ebba6a5 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -1 +1,3 @@ Makefile.lammps +.depend +Makefile.auto diff --git a/lib/Install.py b/lib/Install.py index 18b426f928..d30cbffcf1 100644 --- a/lib/Install.py +++ b/lib/Install.py @@ -4,24 +4,35 @@ # soft linked to by many of the lib/Install.py files # used to automate the steps described in the corresponding lib/README -import sys,commands,os +from __future__ import print_function +import sys,os,subprocess # help message help = """ -Syntax: python Install.py -m machine -e suffix - specify -m and optionally -e, order does not matter +Syntax from src dir: make lib-libname args="-m machine -e suffix" +Syntax from lib dir: python Install.py -m machine -e suffix + +libname = name of lib dir (e.g. atc, h5md, meam, poems, etc) +specify -m and optionally -e, order does not matter + -m = peform a clean followed by "make -f Makefile.machine" machine = suffix of a lib/Makefile.* file -e = set EXTRAMAKE variable in Makefile.machine to Makefile.lammps.suffix does not alter existing Makefile.machine + +Examples: + +make lib-poems args="-m serial" # build POEMS lib with same settings as in the serial Makefile in src +make lib-colvars args="-m mpi" # build USER-COLVARS lib with same settings as in the mpi Makefile in src +make lib-meam args="-m ifort" # build MEAM lib with custom Makefile.ifort (using Intel Fortran) """ # print error message or help def error(str=None): - if not str: print help - else: print "ERROR",str + if not str: print(help) + else: print("ERROR",str) sys.exit() # parse args @@ -38,12 +49,12 @@ while iarg < nargs: if args[iarg] == "-m": if iarg+2 > nargs: error() machine = args[iarg+1] - iarg += 2 + iarg += 2 elif args[iarg] == "-e": if iarg+2 > nargs: error() extraflag = 1 suffix = args[iarg+1] - iarg += 2 + iarg += 2 else: error() # set lib from working dir @@ -53,30 +64,38 @@ lib = os.path.basename(cwd) # create Makefile.auto as copy of Makefile.machine # reset EXTRAMAKE if requested - + if not os.path.exists("Makefile.%s" % machine): error("lib/%s/Makefile.%s does not exist" % (lib,machine)) lines = open("Makefile.%s" % machine,'r').readlines() fp = open("Makefile.auto",'w') +has_extramake = False for line in lines: words = line.split() - if len(words) == 3 and extraflag and \ - words[0] == "EXTRAMAKE" and words[1] == '=': - line = line.replace(words[2],"Makefile.lammps.%s" % suffix) - print >>fp,line, + if len(words) == 3 and words[0] == "EXTRAMAKE" and words[1] == '=': + has_extramake = True + if extraflag: + line = line.replace(words[2],"Makefile.lammps.%s" % suffix) + fp.write(line) fp.close() -# make the library via Makefile.auto +# make the library via Makefile.auto optionally with parallel make -print "Building lib%s.a ..." % lib -cmd = "make -f Makefile.auto clean; make -f Makefile.auto" -txt = commands.getoutput(cmd) -print txt +try: + import multiprocessing + n_cpus = multiprocessing.cpu_count() +except: + n_cpus = 1 -if os.path.exists("lib%s.a" % lib): print "Build was successful" +print("Building lib%s.a ..." % lib) +cmd = "make -f Makefile.auto clean; make -f Makefile.auto -j%d" % n_cpus +txt = subprocess.check_output(cmd,shell=True,stderr=subprocess.STDOUT) +print(txt.decode('UTF-8')) + +if os.path.exists("lib%s.a" % lib): print("Build was successful") else: error("Build of lib/%s/lib%s.a was NOT successful" % (lib,lib)) -if not os.path.exists("Makefile.lammps"): - print "lib/%s/Makefile.lammps was NOT created" % lib +if has_extramake and not os.path.exists("Makefile.lammps"): + print("lib/%s/Makefile.lammps was NOT created" % lib) diff --git a/lib/atc/Install.py b/lib/atc/Install.py index 37041d2ea1..ffe709d44c 120000 --- a/lib/atc/Install.py +++ b/lib/atc/Install.py @@ -1 +1 @@ -Install.py \ No newline at end of file +../Install.py \ No newline at end of file diff --git a/lib/atc/Makefile.g++ b/lib/atc/Makefile.g++ index d15e6cb3b8..bb3028392a 100644 --- a/lib/atc/Makefile.g++ +++ b/lib/atc/Makefile.g++ @@ -1,3 +1,4 @@ +# library build -*- makefile -*- SHELL = /bin/sh # which file will be copied to Makefile.lammps @@ -5,6 +6,7 @@ SHELL = /bin/sh EXTRAMAKE = Makefile.lammps.installed # ------ FILES ------ + SRC = $(wildcard *.cpp) INC = $(wildcard *.h) @@ -47,5 +49,9 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ +.PHONY: clean lib + clean: -rm *.o *.d *~ $(LIB) + +sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw32-cross b/lib/atc/Makefile.mingw32-cross deleted file mode 100644 index 8b33540981..0000000000 --- a/lib/atc/Makefile.mingw32-cross +++ /dev/null @@ -1,67 +0,0 @@ -# library build -*- makefile -*- -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps -EXTRAMAKE = Makefile.lammps.linalg - -# ------ FILES ------ - -SRC = $(wildcard *.cpp) -INC = $(wildcard *.h) - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw32/ -LIB = $(DIR)libatc.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) - -# ------ SETTINGS ------ - -# include any MPI settings needed for the ATC library to build with -# the same MPI library that LAMMPS is built with - -CC = i686-w64-mingw32-g++ -CCFLAGS = -I../../src -I../../src/STUBS -DMPICH_IGNORE_CXX_SEEK \ - -O3 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -DLAMMPS_SMALLSMALL -Wno-uninitialized -ARCHIVE = i686-w64-mingw32-ar -ARCHFLAG = -rcs -DEPFLAGS = -M -LINK = $(CC) -LINKFLAGS = -O -USRLIB = -SYSLIB = - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -o $@ -$(DIR)%.d:%.cpp - $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ - -# ------ DEPENDENCIES ------ - -DEPENDS = $(OBJ:.o=.d) - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) - -$(DEPENDS) : $(DIR) -sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw32-cross-mpi b/lib/atc/Makefile.mingw32-cross-mpi deleted file mode 100644 index c5feeca81a..0000000000 --- a/lib/atc/Makefile.mingw32-cross-mpi +++ /dev/null @@ -1,68 +0,0 @@ -# library build -*- makefile -*- -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps -EXTRAMAKE = Makefile.lammps.linalg - -# ------ FILES ------ - -SRC = $(wildcard *.cpp) -INC = $(wildcard *.h) - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw32-mpi/ -LIB = $(DIR)libatc.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) - -# ------ SETTINGS ------ - -# include any MPI settings needed for the ATC library to build with -# the same MPI library that LAMMPS is built with - -CC = i686-w64-mingw32-g++ -CCFLAGS = -I../../tools/mingw-cross/mpich2-win32/include/ \ - -I../../src -DMPICH_IGNORE_CXX_SEEK \ - -O3 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -DLAMMPS_SMALLSMALL -Wno-uninitialized -ARCHIVE = i686-w64-mingw32-ar -ARCHFLAG = -rcs -DEPFLAGS = -M -LINK = $(CC) -LINKFLAGS = -O -USRLIB = -SYSLIB = - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -o $@ -$(DIR)%.d:%.cpp - $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ - -# ------ DEPENDENCIES ------ - -DEPENDS = $(OBJ:.o=.d) - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) - -$(DEPENDS) : $(DIR) -sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw64-cross b/lib/atc/Makefile.mingw64-cross deleted file mode 100644 index fbd3a02610..0000000000 --- a/lib/atc/Makefile.mingw64-cross +++ /dev/null @@ -1,67 +0,0 @@ -# library build -*- makefile -*- -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps -EXTRAMAKE = Makefile.lammps.linalg - -# ------ FILES ------ - -SRC = $(wildcard *.cpp) -INC = $(wildcard *.h) - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw64/ -LIB = $(DIR)libatc.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) - -# ------ SETTINGS ------ - -# include any MPI settings needed for the ATC library to build with -# the same MPI library that LAMMPS is built with - -CC = x86_64-w64-mingw32-g++ -CCFLAGS = -I../../src -I../../src/STUBS -DMPICH_IGNORE_CXX_SEEK \ - -O3 -march=core2 -mtune=core2 -mpc64 -msse2 \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -DLAMMPS_SMALLBIG -Wno-uninitialized -ARCHIVE = x86_64-w64-mingw32-ar -ARCHFLAG = -rcs -DEPFLAGS = -M -LINK = $(CC) -LINKFLAGS = -O -USRLIB = -SYSLIB = - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -o $@ -$(DIR)%.d:%.cpp - $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ - -# ------ DEPENDENCIES ------ - -DEPENDS = $(OBJ:.o=.d) - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) - -$(DEPENDS) : $(DIR) -sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mingw64-cross-mpi b/lib/atc/Makefile.mingw64-cross-mpi deleted file mode 100644 index f8dd64eae3..0000000000 --- a/lib/atc/Makefile.mingw64-cross-mpi +++ /dev/null @@ -1,68 +0,0 @@ -# library build -*- makefile -*- -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps -EXTRAMAKE = Makefile.lammps.linalg - -# ------ FILES ------ - -SRC = $(wildcard *.cpp) -INC = $(wildcard *.h) - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw64-mpi/ -LIB = $(DIR)libatc.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) - -# ------ SETTINGS ------ - -# include any MPI settings needed for the ATC library to build with -# the same MPI library that LAMMPS is built with - -CC = x86_64-w64-mingw32-g++ -CCFLAGS = -I../../tools/mingw-cross/mpich2-win64/include/ \ - -I../../src -DMPICH_IGNORE_CXX_SEEK \ - -O3 -march=core2 -mtune=core2 -mpc64 -msse2 \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -DLAMMPS_SMALLBIG -Wno-uninitialized -ARCHIVE = x86_64-w64-mingw32-ar -ARCHFLAG = -rcs -DEPFLAGS = -M -LINK = $(CC) -LINKFLAGS = -O -USRLIB = -SYSLIB = - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -o $@ -$(DIR)%.d:%.cpp - $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ - -# ------ DEPENDENCIES ------ - -DEPENDS = $(OBJ:.o=.d) - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) - -$(DEPENDS) : $(DIR) -sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mpi b/lib/atc/Makefile.mpi new file mode 100644 index 0000000000..ec941efdcb --- /dev/null +++ b/lib/atc/Makefile.mpi @@ -0,0 +1,55 @@ +# library build -*- makefile -*- +SHELL = /bin/sh + +# which file will be copied to Makefile.lammps +EXTRAMAKE = Makefile.lammps.linalg + +# ------ FILES ------ + +SRC = $(wildcard *.cpp) +INC = $(wildcard *.h) + +# ------ DEFINITIONS ------ + +LIB = libatc.a +OBJ = $(SRC:.cpp=.o) + +default: lib + +# ------ SETTINGS ------ + +.PHONY: clean lib depend + +# include any MPI settings needed for the ATC library to build with +# must be the same MPI library that LAMMPS is built with + +CC = mpicxx +CCFLAGS = -O3 -Wall -g -fPIC +CPPFLAGS = -I../../src -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 +ARCHIVE = ar +ARCHFLAG = -rc +# ------ MAKE PROCEDURE ------ + +lib: $(OBJ) + $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) + @cp $(EXTRAMAKE) Makefile.lammps + +# ------ COMPILE RULES ------ + +%.o:%.cpp + $(CC) $(CPPFLAGS) $(CCFLAGS) -c $< + +# ------ DEPENDENCIES ------ + +depend .depend : fastdep.exe $(SRC) + @./fastdep.exe $(INCFLAGS) -- $^ > .depend || exit 1 + +fastdep.exe: ../../src/DEPEND/fastdep.c + @cc -O -o $@ $< + +# ------ CLEAN ------ + +clean: + -rm -f *.o *~ .depend $(LIB) fastdep.exe + +sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mpic++ b/lib/atc/Makefile.mpic++ deleted file mode 100644 index c9dfdb79c9..0000000000 --- a/lib/atc/Makefile.mpic++ +++ /dev/null @@ -1,39 +0,0 @@ -# library build -*- makefile -*- -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps -EXTRAMAKE = Makefile.lammps.installed -# ------ FILES ------ -SRC = $(wildcard *.cpp) -INC = $(wildcard *.h) -# ------ DEFINITIONS ------ -LIB = libatc.a -OBJ = $(SRC:.cpp=.o) -# ------ SETTINGS ------ - -# include any MPI settings needed for the ATC library to build with -# must be the same MPI library that LAMMPS is built with - -CC = mpic++ -CCFLAGS = -O3 -Wall -g -I../../src -fPIC -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 -ARCHIVE = ar -ARCHFLAG = -rc -DEPFLAGS = -M -LINK = $(CC) -LINKFLAGS = -O -# ------ MAKE PROCEDURE ------ -lib: $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps -# ------ COMPILE RULES ------ -%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -%.d:%.cpp - $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ -# ------ DEPENDENCIES ------ -DEPENDS = $(OBJ:.o=.d) -# ------ CLEAN ------ -clean: - -rm *.o *.d *~ $(LIB) - -sinclude $(DEPENDS) diff --git a/lib/atc/Makefile.mpic++ b/lib/atc/Makefile.mpic++ new file mode 120000 index 0000000000..1f5f55d2ad --- /dev/null +++ b/lib/atc/Makefile.mpic++ @@ -0,0 +1 @@ +Makefile.mpi \ No newline at end of file diff --git a/lib/atc/Makefile.serial b/lib/atc/Makefile.serial index 44ce5fd341..70b786a6b8 100644 --- a/lib/atc/Makefile.serial +++ b/lib/atc/Makefile.serial @@ -14,18 +14,20 @@ INC = $(wildcard *.h) LIB = libatc.a OBJ = $(SRC:.cpp=.o) +default: lib + # ------ SETTINGS ------ +.PHONY: clean lib depend + # include any MPI settings needed for the ATC library to build with # must be the same MPI library that LAMMPS is built with CC = g++ -CCFLAGS = -O -g -fPIC -I../../src -I../../src/STUBS +CCFLAGS = -O3 -g -fPIC +CPPFLAGS = -I../../src -I../../src/STUBS ARCHIVE = ar ARCHFLAG = -rc -DEPFLAGS = -M -LINK = $(CC) -LINKFLAGS = -O # ------ MAKE PROCEDURE ------ lib: $(OBJ) @@ -35,17 +37,19 @@ lib: $(OBJ) # ------ COMPILE RULES ------ %.o:%.cpp - $(CC) $(CCFLAGS) -c $< -%.d:%.cpp - $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ + $(CC) $(CPPFLAGS) $(CCFLAGS) -c $< # ------ DEPENDENCIES ------ -DEPENDS = $(OBJ:.o=.d) +depend .depend : fastdep.exe $(SRC) + @./fastdep.exe $(INCFLAGS) -- $^ > .depend || exit 1 + +fastdep.exe: ../../src/DEPEND/fastdep.c + @cc -O -o $@ $< # ------ CLEAN ------ clean: - -rm *.o *.d *~ $(LIB) + -rm -f *.o *~ .depend $(LIB) fastdep.exe -sinclude $(DEPENDS) +sinclude .depend diff --git a/lib/atc/Matrix.h b/lib/atc/Matrix.h index e467128fbc..e806ebd016 100644 --- a/lib/atc/Matrix.h +++ b/lib/atc/Matrix.h @@ -356,7 +356,7 @@ DenseMatrix Matrix::pow(double n) const int sz=this->size(); for(INDEX i=0; i $@ # ------ DEPENDENCIES ------ @@ -76,4 +68,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - -rm *.d *~ $(OBJ) $(LIB) + -rm -f *.d *~ $(OBJ) $(LIB) diff --git a/lib/awpmd/Makefile.mpicc b/lib/awpmd/Makefile.mpicc index 4c289ad88a..5cf6a75bd7 100644 --- a/lib/awpmd/Makefile.mpicc +++ b/lib/awpmd/Makefile.mpicc @@ -36,8 +36,10 @@ OBJ = $(SRC:.cpp=.o) # include any MPI settings needed for the ATC library to build with # the same MPI library that LAMMPS is built with -CC = mpic++ -CCFLAGS = -O -fPIC -Isystems/interact/TCP/ -Isystems/interact -Iivutils/include +CC = mpicxx +CCFLAGS = -O3 -fPIC -Isystems/interact/TCP/ -Isystems/interact -Iivutils/include \ + -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 + ARCHIVE = ar ARCHFLAG = -rc DEPFLAGS = -M @@ -66,4 +68,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - -rm *.d *~ $(OBJ) $(LIB) + -rm -f *.d *~ $(OBJ) $(LIB) diff --git a/lib/awpmd/Makefile.mingw32-cross b/lib/awpmd/Makefile.serial similarity index 54% rename from lib/awpmd/Makefile.mingw32-cross rename to lib/awpmd/Makefile.serial index 6a93987173..f51714fc9a 100644 --- a/lib/awpmd/Makefile.mingw32-cross +++ b/lib/awpmd/Makefile.serial @@ -1,4 +1,3 @@ -# library build -*- makefile -*- SHELL = /bin/sh # which file will be copied to Makefile.lammps @@ -7,9 +6,10 @@ EXTRAMAKE = Makefile.lammps.linalg # ------ FILES ------ -SRC = logexc.cpp wpmd.cpp wpmd_split.cpp -vpath %.cpp ivutils/src -vpath %.cpp systems/interact/TCP +SRC = \ + ivutils/src/logexc.cpp \ + systems/interact/TCP/wpmd.cpp \ + systems/interact/TCP/wpmd_split.cpp INC = \ cerf.h \ @@ -27,22 +27,21 @@ INC = \ wpmd_split.h # ------ DEFINITIONS ------ -DIR = Obj_mingw32/ -LIB = $(DIR)libawpmd.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) + +LIB = libawpmd.a +OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ # include any MPI settings needed for the ATC library to build with # the same MPI library that LAMMPS is built with -CC = i686-w64-mingw32-g++ -CCFLAGS = -O2 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -finline-functions \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -Wall -W -Wno-uninitialized -Isystems/interact/TCP/ -Isystems/interact -Iivutils/include -ARCHIVE = i686-w64-mingw32-ar -ARCHFLAG = -rscv +CC = g++ +CCFLAGS = -O3 -fPIC -Isystems/interact/TCP/ -Isystems/interact -Iivutils/include \ + -I../../src/STUBS + +ARCHIVE = ar +ARCHFLAG = -rc DEPFLAGS = -M #LINK = #LINKFLAGS = @@ -51,23 +50,15 @@ SYSLIB = # ------ MAKE PROCEDURE ------ -default: $(DIR) $(LIB) Makefile.lammps - -$(DIR): - mkdir $(DIR) - -Makefile.lammps: - @cp $(EXTRAMAKE) Makefile.lammps - -$(LIB): $(OBJ) +lib: $(OBJ) $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) @cp $(EXTRAMAKE) Makefile.lammps # ------ COMPILE RULES ------ -$(DIR)%.o:%.cpp +%.o:%.cpp $(CC) $(CCFLAGS) -c $< -o $@ -$(DIR)%.d:%.cpp +%.d:%.cpp $(CC) $(CCFLAGS) $(DEPFLAGS) $< > $@ # ------ DEPENDENCIES ------ @@ -77,4 +68,4 @@ DEPENDS = $(OBJ:.o=.d) # ------ CLEAN ------ clean: - -rm *.d *~ $(OBJ) $(LIB) + -rm -f *.d *~ $(OBJ) $(LIB) diff --git a/lib/colvars/Install.py b/lib/colvars/Install.py index af658fa26c..030644ceb5 100644 --- a/lib/colvars/Install.py +++ b/lib/colvars/Install.py @@ -13,7 +13,7 @@ Syntax from lib/colvars dir: python Install.py -m machine -e suffix specify -m and optionally -e, order does not matter - -m = peform a clean followed by "make -f Makefile.machine" + -m = delete all existing objects, followed by "make -f Makefile.machine" machine = suffix of a lib/colvars/Makefile.* or of a src/MAKE/MACHINES/Makefile.* file -e = set EXTRAMAKE variable in Makefile.machine to Makefile.lammps.suffix @@ -21,14 +21,14 @@ specify -m and optionally -e, order does not matter Examples: -make lib-colvars args="-m g++" # build COLVARS lib with GNU g++ compiler +make lib-colvars args="-m mpi" # build COLVARS lib with default mpi compiler wrapper """ # print error message or help def error(str=None): if not str: print(help) - else: print("ERROR"),str + else: print("ERROR",str) sys.exit() # parse args @@ -45,12 +45,12 @@ while iarg < nargs: if args[iarg] == "-m": if iarg+2 > len(args): error() machine = args[iarg+1] - iarg += 2 + iarg += 2 elif args[iarg] == "-e": if iarg+2 > len(args): error() extraflag = True suffix = args[iarg+1] - iarg += 2 + iarg += 2 else: error() # set lib from working dir @@ -122,7 +122,7 @@ for line in lines: fp.write(line) fp.close() -# make the library via Makefile.auto +# make the library via Makefile.auto optionally with parallel make try: import multiprocessing @@ -132,9 +132,9 @@ except: print("Building lib%s.a ..." % lib) cmd = ["make -f Makefile.auto clean"] -print(subprocess.check_output(cmd, shell=True).decode()) +print(subprocess.check_output(cmd, shell=True).decode('UTF-8')) cmd = ["make -f Makefile.auto -j%d" % n_cpus] -print(subprocess.check_output(cmd, shell=True).decode()) +print(subprocess.check_output(cmd, shell=True).decode('UTF-8')) if os.path.exists("lib%s.a" % lib): print("Build was successful") else: error("Build of lib/%s/lib%s.a was NOT successful" % (lib,lib)) diff --git a/lib/colvars/Makefile.common b/lib/colvars/Makefile.common index f47403f771..e3fa4662e6 100644 --- a/lib/colvars/Makefile.common +++ b/lib/colvars/Makefile.common @@ -12,7 +12,7 @@ ifeq ($(COLVARS_DEBUG),) COLVARS_DEBUG_INCFLAGS = else -COLVARS_DEBUG_INCFLAGS= -DCOLVARS_DEBUG +COLVARS_DEBUG_INCFLAGS = -DCOLVARS_DEBUG endif COLVARS_INCFLAGS = $(COLVARS_DEBUG_INCFLAGS) $(COLVARS_PYTHON_INCFLAGS) @@ -21,6 +21,7 @@ COLVARS_INCFLAGS = $(COLVARS_DEBUG_INCFLAGS) $(COLVARS_PYTHON_INCFLAGS) .SUFFIXES: .SUFFIXES: .cpp .o + COLVARS_SRCS = \ colvaratoms.cpp \ colvarbias_abf.cpp \ @@ -45,21 +46,32 @@ COLVARS_SRCS = \ colvartypes.cpp \ colvarvalue.cpp -COLVARS_OBJS = $(COLVARS_SRCS:.cpp=.o) +LEPTON_SRCS = \ + lepton/src/CompiledExpression.cpp lepton/src/ExpressionTreeNode.cpp \ + lepton/src/ParsedExpression.cpp lepton/src/ExpressionProgram.cpp \ + lepton/src/Operation.cpp lepton/src/Parser.cpp -.cpp.o: - $(CXX) $(CXXFLAGS) $(COLVARS_INCFLAGS) -c $< +LEPTON_OBJS = \ + lepton/src/CompiledExpression.o lepton/src/ExpressionTreeNode.o \ + lepton/src/ParsedExpression.o lepton/src/ExpressionProgram.o \ + lepton/src/Operation.o lepton/src/Parser.o + +COLVARS_OBJS = $(COLVARS_SRCS:.cpp=.o) $(LEPTON_OBJS) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) $(COLVARS_INCFLAGS) -Ilepton/include -DLEPTON -c -o $@ $< $(COLVARS_LIB): Makefile.deps $(COLVARS_OBJS) - $(AR) $(ARFLAGS) $(COLVARS_LIB) $(COLVARS_OBJS) + $(AR) $(ARFLAGS) $(COLVARS_LIB) $(COLVARS_OBJS) $(LEPTON_OBJS) Makefile.deps: $(COLVARS_SRCS) @echo > $@ @for src in $^ ; do \ obj=`basename $$src .cpp`.o ; \ - $(CXX) -MM $(COLVARS_INCFLAGS) \ + $(CXX) -MM $(COLVARS_INCFLAGS) -Ilepton/include -DLEPTON \ -MT '$$(COLVARS_OBJ_DIR)'$$obj $$src >> $@ ; \ done include Makefile.deps +include Makefile.lepton.deps # Hand-generated diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps index f463da5f86..9a7de0647d 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -1,78 +1,235 @@ $(COLVARS_OBJ_DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h \ colvarparse.h colvaratoms.h colvardeps.h $(COLVARS_OBJ_DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvar.h \ - colvarparse.h colvardeps.h colvarbias_abf.h colvarbias.h colvargrid.h + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvar.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarbias_abf.h colvarbias.h colvargrid.h colvar_UIestimator.h $(COLVARS_OBJ_DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarbias_alb.h colvar.h colvarparse.h colvardeps.h colvarbias.h + colvars_version.h colvarbias.h colvar.h colvarvalue.h colvartypes.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarbias_alb.h $(COLVARS_OBJ_DIR)colvarbias.o: colvarbias.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h \ - colvar.h colvarparse.h colvardeps.h -$(COLVARS_OBJ_DIR)colvarbias_histogram.o: colvarbias_histogram.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarbias_histogram.h \ - colvarbias.h colvargrid.h -$(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvarbias_meta.h colvarbias.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvarbias.h \ + colvar.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvargrid.h +$(COLVARS_OBJ_DIR)colvarbias_histogram.o: colvarbias_histogram.cpp \ + colvarmodule.h colvars_version.h colvarproxy.h colvarvalue.h \ + colvartypes.h colvar.h colvarparse.h colvardeps.h \ + lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarbias_histogram.h colvarbias.h colvargrid.h +$(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvarmodule.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvar.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarbias_meta.h colvarbias.h colvargrid.h $(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ - colvardeps.h + colvarmodule.h colvars_version.h colvarproxy.h colvarvalue.h \ + colvartypes.h colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ + colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h $(COLVARS_OBJ_DIR)colvarcomp_angles.o: colvarcomp_angles.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarcomp.h \ - colvaratoms.h + colvarmodule.h colvars_version.h colvar.h colvarvalue.h colvartypes.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvaratoms.h colvardeps.h colvar.h \ + colvarmodule.h colvars_version.h colvarparse.h colvarvalue.h \ + colvartypes.h colvaratoms.h colvarproxy.h colvardeps.h colvar.h \ + lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvarcomp.h $(COLVARS_OBJ_DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvar.h \ - colvarparse.h colvardeps.h colvarcomp.h colvaratoms.h + colvars_version.h colvarvalue.h colvartypes.h colvar.h colvarparse.h \ + colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_distances.o: colvarcomp_distances.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvardeps.h colvarcomp.h \ - colvaratoms.h + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_protein.o: colvarcomp_protein.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvardeps.h colvarcomp.h \ - colvaratoms.h + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvardeps.h colvarcomp.h \ - colvaratoms.h + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ - colvardeps.h colvarcomp.h colvaratoms.h colvarscript.h colvarbias.h -$(COLVARS_OBJ_DIR)colvardeps.o: colvardeps.cpp colvardeps.h \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h -$(COLVARS_OBJ_DIR)colvargrid.o: colvargrid.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h colvar.h colvardeps.h colvarcomp.h colvaratoms.h \ - colvargrid.h -$(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h colvar.h colvardeps.h colvarbias.h colvarbias_abf.h \ - colvargrid.h colvarbias_alb.h colvarbias_histogram.h colvarbias_meta.h \ - colvarbias_restraint.h colvarscript.h colvaratoms.h -$(COLVARS_OBJ_DIR)colvarparse.o: colvarparse.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvarvalue.h colvartypes.h colvarparse.h colvar.h colvardeps.h \ + lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h colvarscript.h colvarbias.h +$(COLVARS_OBJ_DIR)colvardeps.o: colvardeps.cpp colvarmodule.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvardeps.h \ colvarparse.h +$(COLVARS_OBJ_DIR)colvargrid.o: colvargrid.cpp colvarmodule.h \ + colvars_version.h colvarvalue.h colvartypes.h colvarparse.h colvar.h \ + colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h colvargrid.h +$(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ + colvars_version.h colvarparse.h colvarvalue.h colvartypes.h \ + colvarproxy.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarbias.h colvarbias_abf.h colvargrid.h colvar_UIestimator.h \ + colvarbias_alb.h colvarbias_histogram.h colvarbias_meta.h \ + colvarbias_restraint.h colvarscript.h colvaratoms.h colvarcomp.h +$(COLVARS_OBJ_DIR)colvarparse.o: colvarparse.cpp colvarmodule.h \ + colvars_version.h colvarvalue.h colvartypes.h colvarparse.h $(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h \ colvarscript.h colvarbias.h colvar.h colvarparse.h colvardeps.h \ + lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvaratoms.h $(COLVARS_OBJ_DIR)colvarscript.o: colvarscript.cpp colvarscript.h \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarbias.h colvar.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarproxy.h $(COLVARS_OBJ_DIR)colvartypes.o: colvartypes.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h + colvars_version.h colvartypes.h colvarparse.h colvarvalue.h $(COLVARS_OBJ_DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h + colvars_version.h colvarvalue.h colvartypes.h diff --git a/lib/colvars/Makefile.lepton.deps b/lib/colvars/Makefile.lepton.deps new file mode 100644 index 0000000000..93c3912384 --- /dev/null +++ b/lib/colvars/Makefile.lepton.deps @@ -0,0 +1,40 @@ +lepton/src/CompiledExpression.o: lepton/src/CompiledExpression.cpp \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h +lepton/src/ExpressionProgram.o: lepton/src/ExpressionProgram.cpp \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h +lepton/src/ExpressionTreeNode.o: lepton/src/ExpressionTreeNode.cpp \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/Exception.h lepton/include/lepton/Operation.h \ + lepton/include/lepton/CustomFunction.h lepton/include/lepton/Exception.h +lepton/src/Operation.o: lepton/src/Operation.cpp \ + lepton/include/lepton/Operation.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h lepton/include/lepton/Exception.h \ + lepton/include/lepton/ExpressionTreeNode.h lepton/src/MSVC_erfc.h +lepton/src/ParsedExpression.o: lepton/src/ParsedExpression.cpp \ + lepton/include/lepton/ParsedExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h +lepton/src/Parser.o: lepton/src/Parser.cpp \ + lepton/include/lepton/Parser.h lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h lepton/include/lepton/Exception.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h diff --git a/lib/colvars/Makefile.mingw32-cross b/lib/colvars/Makefile.mingw32-cross deleted file mode 100644 index 29c64b26a2..0000000000 --- a/lib/colvars/Makefile.mingw32-cross +++ /dev/null @@ -1,31 +0,0 @@ -# -*- makefile -*- to build Colvars module with MinGW 32-bit - -EXTRAMAKE = Makefile.lammps.empty - -COLVARS_LIB = libcolvars.a -COLVARS_OBJ_DIR = Obj_mingw64/ - -CXX = i686-w64-mingw32-g++ -CXXFLAGS = -O2 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -fno-rtti -fno-exceptions -finline-functions \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -Wall -W -Wno-uninitialized -AR = i686-w64-mingw32-ar -ARFLAGS = -rscv -SHELL = /bin/sh - -.PHONY: default clean - -default: $(COLVARS_OBJ_DIR) $(COLVARS_LIB) Makefile.lammps - -include Makefile.common - -$(COLVARS_OBJ_DIR): - mkdir $(COLVARS_OBJ_DIR) - -clean: - -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) - -rmdir $(COLVARS_OBJ_DIR) - -Makefile.lammps: - -cp $(EXTRAMAKE) Makefile.lammps diff --git a/lib/colvars/Makefile.mingw32-cross-mpi b/lib/colvars/Makefile.mingw32-cross-mpi deleted file mode 100644 index 1e35c5b461..0000000000 --- a/lib/colvars/Makefile.mingw32-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw32-cross - -rm -f Obj_mingw32-mpi - ln -s Obj_mingw32 Obj_mingw32-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw32-cross - -rm -f Obj_mingw32-mpi - diff --git a/lib/colvars/Makefile.mingw64-cross b/lib/colvars/Makefile.mingw64-cross deleted file mode 100644 index 2fd1c6fc67..0000000000 --- a/lib/colvars/Makefile.mingw64-cross +++ /dev/null @@ -1,31 +0,0 @@ -# -*- makefile -*- to build Colvars module with MinGW 32-bit - -EXTRAMAKE = Makefile.lammps.empty - -COLVARS_LIB = libcolvars.a -COLVARS_OBJ_DIR = Obj_mingw32/ - -CXX = x86_64-w64-mingw32-g++ -CXXFLAGS = -O2 -march=core2 -mtune=core2 -mpc64 -msse2 \ - -fno-rtti -fno-exceptions -finline-functions \ - -ffast-math -funroll-loops -fstrict-aliasing \ - -Wall -W -Wno-uninitialized -AR = x86_64-w64-mingw32-ar -ARFLAGS = -rscv -SHELL = /bin/sh - -.PHONY: default clean - -default: $(COLVARS_OBJ_DIR) $(COLVARS_LIB) Makefile.lammps - -include Makefile.common - -$(COLVARS_OBJ_DIR): - mkdir $(COLVARS_OBJ_DIR) - -clean: - -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) - -rmdir $(COLVARS_OBJ_DIR) - -Makefile.lammps: - -cp $(EXTRAMAKE) Makefile.lammps diff --git a/lib/colvars/Makefile.mingw64-cross-mpi b/lib/colvars/Makefile.mingw64-cross-mpi deleted file mode 100644 index ca6f4a6d43..0000000000 --- a/lib/colvars/Makefile.mingw64-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw64-cross - -rm -f Obj_mingw64-mpi - ln -s Obj_mingw64 Obj_mingw64-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw64-cross - -rm -f Obj_mingw64-mpi - diff --git a/lib/colvars/Makefile.mpi b/lib/colvars/Makefile.mpi new file mode 100644 index 0000000000..6343ed7c06 --- /dev/null +++ b/lib/colvars/Makefile.mpi @@ -0,0 +1,25 @@ +# -*- makefile -*- to build Colvars module with default MPI compiler wrapper + +EXTRAMAKE = Makefile.lammps.empty + +COLVARS_LIB = libcolvars.a +COLVARS_OBJ_DIR = + +CXX = mpicxx +CXXFLAGS = -O2 -g -Wall -fPIC -funroll-loops +AR = ar +ARFLAGS = -rscv +SHELL = /bin/sh + +.PHONY: default clean + +default: $(COLVARS_LIB) Makefile.lammps + +include Makefile.common + +clean: + -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) + +Makefile.lammps: + -cp $(EXTRAMAKE) Makefile.lammps + diff --git a/lib/colvars/Makefile.serial b/lib/colvars/Makefile.serial new file mode 100644 index 0000000000..556e39d070 --- /dev/null +++ b/lib/colvars/Makefile.serial @@ -0,0 +1,25 @@ +# -*- makefile -*- to build Colvars module with GNU compiler + +EXTRAMAKE = Makefile.lammps.empty + +COLVARS_LIB = libcolvars.a +COLVARS_OBJ_DIR = + +CXX = g++ +CXXFLAGS = -O2 -g -Wall -fPIC -funroll-loops +AR = ar +ARFLAGS = -rscv +SHELL = /bin/sh + +.PHONY: default clean + +default: $(COLVARS_LIB) Makefile.lammps + +include Makefile.common + +clean: + -rm -f $(COLVARS_OBJS) $(COLVARS_LIB) + +Makefile.lammps: + -cp $(EXTRAMAKE) Makefile.lammps + diff --git a/lib/colvars/README b/lib/colvars/README index ce1d319974..087528748b 100644 --- a/lib/colvars/README +++ b/lib/colvars/README @@ -32,7 +32,7 @@ where Makefile.g++ uses the GNU C++ compiler and is a good template to start. **Optional**: if you use the Install.py script provided in this folder, you can give the machine name as the '-m' argument. This can be the suffix of one -of the files from either this folder, or from src/MAKE. +of the files from either this folder, or from src/MAKE/MACHINES. *This is only supported by the Install.py within the lib/colvars folder*. When you are done building this library, two files should @@ -47,16 +47,20 @@ correct for your system, else the LAMMPS build will likely fail. If you want to set a debug flag recognized by the library, the settings in Makefile.common should work. +Note: some Colvars functions use the Lepton mathematical expression parser, +which is here included (no additional steps required). For more details, see: + https://simtk.org/projects/lepton + ## Documentation For the reference manual see: http://colvars.github.io/colvars-refman-lammps -A copy of reference manual is also in: +A copy of the reference manual is also in: doc/PDF/colvars-refman-lammps.pdf -Also included is a Doxygen-based developer documentation: +Also available is a Doxygen-based developer documentation: http://colvars.github.io/doxygen/html/ The reference article is: diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index d23bd852aa..5a4e8b617a 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -195,7 +195,7 @@ int colvar::init(std::string const &conf) // - it is homogeneous // - all cvcs are periodic // - all cvcs have the same period - if (cvcs[0]->b_periodic) { // TODO make this a CVC feature + if (is_enabled(f_cv_homogeneous) && cvcs[0]->b_periodic) { // TODO make this a CVC feature bool b_periodic = true; period = cvcs[0]->period; for (i = 1; i < cvcs.size(); i++) { @@ -1008,6 +1008,8 @@ int colvar::calc() int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) { + colvarproxy *proxy = cvm::main()->proxy; + int error_code = COLVARS_OK; if (cvm::debug()) cvm::log("Calculating colvar \""+this->name+"\", components "+ @@ -1018,14 +1020,18 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) return error_code; } - if (cvm::step_relative() > 0) { - // Total force depends on Jacobian derivative from previous timestep + if ((cvm::step_relative() > 0) && (!proxy->total_forces_same_step())){ + // Use Jacobian derivative from previous timestep error_code |= calc_cvc_total_force(first_cvc, num_cvcs); } // atom coordinates are updated by the next line error_code |= calc_cvc_values(first_cvc, num_cvcs); error_code |= calc_cvc_gradients(first_cvc, num_cvcs); error_code |= calc_cvc_Jacobians(first_cvc, num_cvcs); + if (proxy->total_forces_same_step()){ + // Use Jacobian derivative from this timestep + error_code |= calc_cvc_total_force(first_cvc, num_cvcs); + } if (cvm::debug()) cvm::log("Done calculating colvar \""+this->name+"\".\n"); @@ -1043,6 +1049,7 @@ int colvar::collect_cvc_data() if (cvm::step_relative() > 0) { // Total force depends on Jacobian derivative from previous timestep + // collect_cvc_total_forces() uses the previous value of jd error_code |= collect_cvc_total_forces(); } error_code |= collect_cvc_values(); @@ -1138,7 +1145,7 @@ int colvar::collect_cvc_values() if (!cvcs[i]->is_enabled()) continue; x += (cvcs[i])->sup_coeff * ( ((cvcs[i])->sup_np != 1) ? - std::pow((cvcs[i])->value().real_value, (cvcs[i])->sup_np) : + cvm::integer_power((cvcs[i])->value().real_value, (cvcs[i])->sup_np) : (cvcs[i])->value().real_value ); } } else { @@ -1219,7 +1226,7 @@ int colvar::collect_cvc_gradients() if (!cvcs[i]->is_enabled()) continue; // Coefficient: d(a * x^n) = a * n * x^(n-1) * dx cvm::real coeff = (cvcs[i])->sup_coeff * cvm::real((cvcs[i])->sup_np) * - std::pow((cvcs[i])->value().real_value, (cvcs[i])->sup_np-1); + cvm::integer_power((cvcs[i])->value().real_value, (cvcs[i])->sup_np-1); for (size_t j = 0; j < cvcs[i]->atom_groups.size(); j++) { @@ -1471,9 +1478,15 @@ cvm::real colvar::update_forces_energy() // Coupling force is a slow force, to be applied to atomic coords impulse-style f *= cvm::real(time_step_factor); - // The total force acting on the extended variable is f_ext - // This will be used in the next timestep - ft_reported = f_ext; + if (is_enabled(f_cv_subtract_applied_force)) { + // Report a "system" force without the biases on this colvar + // that is, just the spring force + ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x); + } else { + // The total force acting on the extended variable is f_ext + // This will be used in the next timestep + ft_reported = f_ext; + } // leapfrog: starting from x_i, f_i, v_(i-1/2) vr += (0.5 * dt) * f_ext / ext_mass; @@ -1580,9 +1593,9 @@ void colvar::communicate_forces() for (i = 0; i < cvcs.size(); i++) { if (!cvcs[i]->is_enabled()) continue; (cvcs[i])->apply_force(f * (cvcs[i])->sup_coeff * - cvm::real((cvcs[i])->sup_np) * - (std::pow((cvcs[i])->value().real_value, - (cvcs[i])->sup_np-1)) ); + cvm::real((cvcs[i])->sup_np) * + (cvm::integer_power((cvcs[i])->value().real_value, + (cvcs[i])->sup_np-1)) ); } } else { diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 6113e1678b..32c329460d 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -11,8 +11,6 @@ #define COLVAR_H #include -#include -#include #include "colvarmodule.h" #include "colvarvalue.h" @@ -61,6 +59,12 @@ public: /// \brief Current actual value (not extended DOF) colvarvalue const & actual_value() const; + /// \brief Current running average (if calculated as set by analysis flag) + colvarvalue const & run_ave() const; + + /// \brief Force constant of the spring + cvm::real const & force_constant() const; + /// \brief Current velocity (previously set by calc() or by read_traj()) colvarvalue const & velocity() const; @@ -88,9 +92,20 @@ public: static std::vector cv_features; /// \brief Implementation of the feature list accessor for colvar - std::vector &features() { + virtual const std::vector &features() + { return cv_features; } + virtual std::vector &modify_features() + { + return cv_features; + } + static void delete_features() { + for (size_t i=0; i < cv_features.size(); i++) { + delete cv_features[i]; + } + cv_features.clear(); + } /// Implements possible actions to be carried out /// when a given feature is enabled @@ -502,7 +517,7 @@ public: // collective variable component base class class cvc; - // currently available collective variable components + // list of available collective variable components // scalar colvar components class distance; @@ -587,18 +602,25 @@ public: } }; +inline cvm::real const & colvar::force_constant() const +{ + return ext_force_k; +} inline colvarvalue const & colvar::value() const { return x_reported; } - inline colvarvalue const & colvar::actual_value() const { return x; } +inline colvarvalue const & colvar::run_ave() const +{ + return runave; +} inline colvarvalue const & colvar::velocity() const { diff --git a/lib/colvars/colvar_UIestimator.h b/lib/colvars/colvar_UIestimator.h new file mode 100644 index 0000000000..36ed938119 --- /dev/null +++ b/lib/colvars/colvar_UIestimator.h @@ -0,0 +1,736 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + +#ifndef COLVAR_UIESTIMATOR_H +#define COLVAR_UIESTIMATOR_H + +#include +#include +#include +#include +#include + +#include + +// only for colvar module! +// when integrated into other code, just remove this line and "...cvm::backup_file(...)" +#include "colvarmodule.h" + +namespace UIestimator { + const int Y_SIZE = 21; // defines the range of extended CV with respect to a given CV + // For example, CV=10, width=1, Y_SIZE=21, then eCV=[0-20], having a size of 21 + const int HALF_Y_SIZE = 10; + const int EXTENDED_X_SIZE = HALF_Y_SIZE; + const double EPSILON = 0.000001; // for comparison of float numbers + + class n_matrix { // Stores the distribution matrix of n(x,y) + + public: + n_matrix() {} + n_matrix(const std::vector & lowerboundary, // lowerboundary of x + const std::vector & upperboundary, // upperboundary of + const std::vector & width, // width of x + const int y_size) { // size of y, for example, ysize=7, then when x=1, the distribution of y in [-2,4] is considered + + int i; + + this->lowerboundary = lowerboundary; + this->upperboundary = upperboundary; + this->width = width; + this->dimension = lowerboundary.size(); + this->y_size = y_size; // keep in mind the internal (spare) matrix is stored in diagonal form + this->y_total_size = int(std::pow(double(y_size), double(dimension)) + EPSILON); + + // the range of the matrix is [lowerboundary, upperboundary] + x_total_size = 1; + for (i = 0; i < dimension; i++) { + x_size.push_back(int((upperboundary[i] - lowerboundary[i]) / width[i] + EPSILON)); + x_total_size *= x_size[i]; + } + + // initialize the internal matrix + matrix.reserve(x_total_size); + for (i = 0; i < x_total_size; i++) { + matrix.push_back(std::vector(y_total_size, 0)); + } + + temp.resize(dimension); + } + + int inline get_value(const std::vector & x, const std::vector & y) { + return matrix[convert_x(x)][convert_y(x, y)]; + } + + void inline set_value(const std::vector & x, const std::vector & y, const int value) { + matrix[convert_x(x)][convert_y(x,y)] = value; + } + + void inline increase_value(const std::vector & x, const std::vector & y, const int value) { + matrix[convert_x(x)][convert_y(x,y)] += value; + } + + private: + std::vector lowerboundary; + std::vector upperboundary; + std::vector width; + int dimension; + std::vector x_size; // the size of x in each dimension + int x_total_size; // the size of x of the internal matrix + int y_size; // the size of y in each dimension + int y_total_size; // the size of y of the internal matrix + + std::vector > matrix; // the internal matrix + + std::vector temp; // this vector is used in convert_x and convert_y to save computational resource + + int i, j; + + int convert_x(const std::vector & x) { // convert real x value to its interal index + for (i = 0; i < dimension; i++) { + temp[i] = int((x[i] - lowerboundary[i]) / width[i] + EPSILON); + } + + int index = 0; + for (i = 0; i < dimension; i++) { + if (i + 1 < dimension) { + int x_temp = 1; + for (j = i + 1; j < dimension; j++) + x_temp *= x_size[j]; + index += temp[i] * x_temp; + } + else + index += temp[i]; + } + return index; + } + + int convert_y(const std::vector & x, const std::vector & y) { // convert real y value to its interal index + + int i; + + for (i = 0; i < dimension; i++) { + temp[i] = round((round(y[i] / width[i] + EPSILON) - round(x[i] / width[i] + EPSILON)) + (y_size - 1) / 2 + EPSILON); + } + + int index = 0; + for (i = 0; i < dimension; i++) { + if (i + 1 < dimension) + index += temp[i] * int(std::pow(double(y_size), double(dimension - i - 1)) + EPSILON); + else + index += temp[i]; + } + return index; + } + + double round(double r) { + return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); + } + }; + + // vector, store the sum_x, sum_x_square, count_y + template + class n_vector { + + public: + n_vector() {} + n_vector(const std::vector & lowerboundary, // lowerboundary of x + const std::vector & upperboundary, // upperboundary of + const std::vector & width, // width of x + const int y_size, // size of y, for example, ysize=7, then when x=1, the distribution of y in [-2,4] is considered + const T & default_value) { // the default value of T + + this->width = width; + this->dimension = lowerboundary.size(); + + x_total_size = 1; + for (int i = 0; i < dimension; i++) { + this->lowerboundary.push_back(lowerboundary[i] - (y_size - 1) / 2 * width[i] - EPSILON); + this->upperboundary.push_back(upperboundary[i] + (y_size - 1) / 2 * width[i] + EPSILON); + + x_size.push_back(int((this->upperboundary[i] - this->lowerboundary[i]) / this->width[i] + EPSILON)); + x_total_size *= x_size[i]; + } + + // initialize the internal vector + vector.resize(x_total_size, default_value); + + temp.resize(dimension); + } + + const T inline get_value(const std::vector & x) { + return vector[convert_x(x)]; + } + + void inline set_value(const std::vector & x, const T value) { + vector[convert_x(x)] = value; + } + + void inline increase_value(const std::vector & x, const T value) { + vector[convert_x(x)] += value; + } + private: + std::vector lowerboundary; + std::vector upperboundary; + std::vector width; + int dimension; + std::vector x_size; // the size of x in each dimension + int x_total_size; // the size of x of the internal matrix + + std::vector vector; // the internal vector + + std::vector temp; // this vector is used in convert_x and convert_y to save computational resource + + int convert_x(const std::vector & x) { // convert real x value to its interal index + + int i, j; + + for (i = 0; i < dimension; i++) { + temp[i] = int((x[i] - lowerboundary[i]) / width[i] + EPSILON); + } + + int index = 0; + for (i = 0; i < dimension; i++) { + if (i + 1 < dimension) { + int x_temp = 1; + for (j = i + 1; j < dimension; j++) + x_temp *= x_size[j]; + index += temp[i] * x_temp; + } + else + index += temp[i]; + } + return index; + } + }; + + class UIestimator { // the implemension of UI estimator + + public: + UIestimator() {} + + //called when (re)start an eabf simulation + UIestimator(const std::vector & lowerboundary, + const std::vector & upperboundary, + const std::vector & width, + const std::vector & krestr, // force constant in eABF + const std::string & output_filename, // the prefix of output files + const int output_freq, + const bool restart, // whether restart from a .count and a .grad file + const std::vector & input_filename, // the prefixes of input files + const double temperature) { + + // initialize variables + this->lowerboundary = lowerboundary; + this->upperboundary = upperboundary; + this->width = width; + this->krestr = krestr; + this->output_filename = output_filename; + this->output_freq = output_freq; + this->restart = restart; + this->input_filename = input_filename; + this->temperature = temperature; + + int i, j; + + dimension = lowerboundary.size(); + + for (i = 0; i < dimension; i++) { + sum_x.push_back(n_vector(lowerboundary, upperboundary, width, Y_SIZE, 0.0)); + sum_x_square.push_back(n_vector(lowerboundary, upperboundary, width, Y_SIZE, 0.0)); + + x_av.push_back(n_vector(lowerboundary, upperboundary, width, Y_SIZE, 0.0)); + sigma_square.push_back(n_vector(lowerboundary, upperboundary, width, Y_SIZE, 0.0)); + } + + count_y = n_vector(lowerboundary, upperboundary, width, Y_SIZE, 0); + distribution_x_y = n_matrix(lowerboundary, upperboundary, width, Y_SIZE); + + grad = n_vector >(lowerboundary, upperboundary, width, 1, std::vector(dimension, 0.0)); + count = n_vector(lowerboundary, upperboundary, width, 1, 0); + + written = false; + written_1D = false; + + if (dimension == 1) { + std::vector upperboundary_temp = upperboundary; + upperboundary_temp[0] = upperboundary[0] + width[0]; + oneD_pmf = n_vector(lowerboundary, upperboundary_temp, width, 1, 0.0); + } + + if (restart == true) { + input_grad = n_vector >(lowerboundary, upperboundary, width, 1, std::vector(dimension, 0.0)); + input_count = n_vector(lowerboundary, upperboundary, width, 1, 0); + + // initialize input_Grad and input_count + // the loop_flag is a n-dimensional vector, increae from lowerboundary to upperboundary when looping + std::vector loop_flag(dimension, 0); + for (i = 0; i < dimension; i++) { + loop_flag[i] = lowerboundary[i]; + } + + i = 0; + while (i >= 0) { + for (j = 0; j < dimension; j++) { + input_grad.set_value(loop_flag, std::vector(dimension,0)); + } + input_count.set_value(loop_flag, 0); + + // iterate over any dimensions + i = dimension - 1; + while (i >= 0) { + loop_flag[i] += width[i]; + if (loop_flag[i] > upperboundary[i] - width[i] + EPSILON) { + loop_flag[i] = lowerboundary[i]; + i--; + } + else + break; + } + } + read_inputfiles(input_filename); + } + } + + ~UIestimator() {} + + // called from MD engine every step + bool update(const int step, std::vector x, std::vector y) { + + int i; + + if (step % output_freq == 0) { + calc_pmf(); + write_files(); + //write_interal_data(); + } + + for (i = 0; i < dimension; i++) { + // for dihedral RC, it is possible that x = 179 and y = -179, should correct it + // may have problem, need to fix + if (x[i] > 150 && y[i] < -150) { + y[i] += 360; + } + if (x[i] < -150 && y[i] > 150) { + y[i] -= 360; + } + + if (x[i] < lowerboundary[i] - EXTENDED_X_SIZE * width[i] + EPSILON || x[i] > upperboundary[i] + EXTENDED_X_SIZE * width[i] - EPSILON \ + || y[i] - x[i] < -HALF_Y_SIZE * width[i] + EPSILON || y[i] - x[i] > HALF_Y_SIZE * width[i] - EPSILON \ + || y[i] - lowerboundary[i] < -HALF_Y_SIZE * width[i] + EPSILON || y[i] - upperboundary[i] > HALF_Y_SIZE * width[i] - EPSILON) + return false; + } + + for (i = 0; i < dimension; i++) { + sum_x[i].increase_value(y, x[i]); + sum_x_square[i].increase_value(y, x[i] * x[i]); + } + count_y.increase_value(y, 1); + + for (i = 0; i < dimension; i++) { + // adapt colvars precision + if (x[i] < lowerboundary[i] + EPSILON || x[i] > upperboundary[i] - EPSILON) + return false; + } + distribution_x_y.increase_value(x, y, 1); + + return true; + } + + // update the output_filename + void update_output_filename(const std::string& filename) { + output_filename = filename; + } + + private: + std::vector > sum_x; // the sum of x in each y bin + std::vector > sum_x_square; // the sum of x in each y bin + n_vector count_y; // the distribution of y + n_matrix distribution_x_y; // the distribution of pair + + int dimension; + + std::vector lowerboundary; + std::vector upperboundary; + std::vector width; + std::vector krestr; + std::string output_filename; + int output_freq; + bool restart; + std::vector input_filename; + double temperature; + + n_vector > grad; + n_vector count; + + n_vector oneD_pmf; + + n_vector > input_grad; + n_vector input_count; + + // used in double integration + std::vector > x_av; + std::vector > sigma_square; + + bool written; + bool written_1D; + + // calculate gradients from the internal variables + void calc_pmf() { + int norm; + int i, j, k; + + std::vector loop_flag(dimension, 0); + for (i = 0; i < dimension; i++) { + loop_flag[i] = lowerboundary[i] - HALF_Y_SIZE * width[i]; + } + + i = 0; + while (i >= 0) { + norm = count_y.get_value(loop_flag) > 0 ? count_y.get_value(loop_flag) : 1; + for (j = 0; j < dimension; j++) { + x_av[j].set_value(loop_flag, sum_x[j].get_value(loop_flag) / norm); + sigma_square[j].set_value(loop_flag, sum_x_square[j].get_value(loop_flag) / norm - x_av[j].get_value(loop_flag) * x_av[j].get_value(loop_flag)); + } + + // iterate over any dimensions + i = dimension - 1; + while (i >= 0) { + loop_flag[i] += width[i]; + if (loop_flag[i] > upperboundary[i] + HALF_Y_SIZE * width[i] - width[i] + EPSILON) { + loop_flag[i] = lowerboundary[i] - HALF_Y_SIZE * width[i]; + i--; + } + else + break; + } + } + + // double integration + std::vector av(dimension, 0); + std::vector diff_av(dimension, 0); + + std::vector loop_flag_x(dimension, 0); + std::vector loop_flag_y(dimension, 0); + for (i = 0; i < dimension; i++) { + loop_flag_x[i] = lowerboundary[i]; + loop_flag_y[i] = loop_flag_x[i] - HALF_Y_SIZE * width[i]; + } + + i = 0; + while (i >= 0) { + norm = 0; + for (k = 0; k < dimension; k++) { + av[k] = 0; + diff_av[k] = 0; + loop_flag_y[k] = loop_flag_x[k] - HALF_Y_SIZE * width[k]; + } + + int j = 0; + while (j >= 0) { + norm += distribution_x_y.get_value(loop_flag_x, loop_flag_y); + for (k = 0; k < dimension; k++) { + if (sigma_square[k].get_value(loop_flag_y) > EPSILON || sigma_square[k].get_value(loop_flag_y) < -EPSILON) + av[k] += distribution_x_y.get_value(loop_flag_x, loop_flag_y) * ( (loop_flag_x[k] + 0.5 * width[k]) - x_av[k].get_value(loop_flag_y)) / sigma_square[k].get_value(loop_flag_y); + + diff_av[k] += distribution_x_y.get_value(loop_flag_x, loop_flag_y) * (loop_flag_x[k] - loop_flag_y[k]); + } + + // iterate over any dimensions + j = dimension - 1; + while (j >= 0) { + loop_flag_y[j] += width[j]; + if (loop_flag_y[j] > loop_flag_x[j] + HALF_Y_SIZE * width[j] - width[j] + EPSILON) { + loop_flag_y[j] = loop_flag_x[j] - HALF_Y_SIZE * width[j]; + j--; + } + else + break; + } + } + + std::vector grad_temp(dimension, 0); + for (k = 0; k < dimension; k++) { + diff_av[k] /= (norm > 0 ? norm : 1); + av[k] = cvm::boltzmann() * temperature * av[k] / (norm > 0 ? norm : 1); + grad_temp[k] = av[k] - krestr[k] * diff_av[k]; + } + grad.set_value(loop_flag_x, grad_temp); + count.set_value(loop_flag_x, norm); + + // iterate over any dimensions + i = dimension - 1; + while (i >= 0) { + loop_flag_x[i] += width[i]; + if (loop_flag_x[i] > upperboundary[i] - width[i] + EPSILON) { + loop_flag_x[i] = lowerboundary[i]; + i--; + } + else + break; + } + } + } + + + // calculate 1D pmf + void calc_1D_pmf() + { + std::vector last_position(1, 0); + std::vector position(1, 0); + + double min = 0; + double dG = 0; + double i; + + oneD_pmf.set_value(lowerboundary, 0); + last_position = lowerboundary; + for (i = lowerboundary[0] + width[0]; i < upperboundary[0] + EPSILON; i += width[0]) { + position[0] = i + EPSILON; + if (restart == false || input_count.get_value(last_position) == 0) { + dG = oneD_pmf.get_value(last_position) + grad.get_value(last_position)[0] * width[0]; + } + else { + dG = oneD_pmf.get_value(last_position) + ((grad.get_value(last_position)[0] * count.get_value(last_position) + input_grad.get_value(last_position)[0] * input_count.get_value(last_position)) / (count.get_value(last_position) + input_count.get_value(last_position))) * width[0]; + } + if (dG < min) + min = dG; + oneD_pmf.set_value(position, dG); + last_position[0] = i + EPSILON; + } + + for (i = lowerboundary[0]; i < upperboundary[0] + EPSILON; i += width[0]) { + position[0] = i + EPSILON; + oneD_pmf.set_value(position, oneD_pmf.get_value(position) - min); + } + } + + // write 1D pmf + void write_1D_pmf() { + std::string pmf_filename = output_filename + ".UI.pmf"; + + // only for colvars module! + if (written_1D) cvm::backup_file(pmf_filename.c_str()); + + std::ostream* ofile_pmf = cvm::proxy->output_stream(pmf_filename.c_str()); + + std::vector position(1, 0); + for (double i = lowerboundary[0]; i < upperboundary[0] + EPSILON; i += width[0]) { + *ofile_pmf << i << " "; + position[0] = i + EPSILON; + *ofile_pmf << oneD_pmf.get_value(position) << std::endl; + } + cvm::proxy->close_output_stream(pmf_filename.c_str()); + + written_1D = true; + } + + // write heads of the output files + void writehead(std::ostream& os) const { + os << "# " << dimension << std::endl; + for (int i = 0; i < dimension; i++) { + os << "# " << lowerboundary[i] << " " << width[i] << " " << int((upperboundary[i] - lowerboundary[i]) / width[i] + EPSILON) << " " << 0 << std::endl; + } + os << std::endl; + } + + // write interal data, used for testing + void write_interal_data() { + std::string internal_filename = output_filename + ".UI.internal"; + + std::ostream* ofile_internal = cvm::proxy->output_stream(internal_filename.c_str()); + + std::vector loop_flag(dimension, 0); + for (int i = 0; i < dimension; i++) { + loop_flag[i] = lowerboundary[i]; + } + + int n = 0; + while (n >= 0) { + for (int j = 0; j < dimension; j++) { + *ofile_internal << loop_flag[j] + 0.5 * width[j] << " "; + } + + for (int k = 0; k < dimension; k++) { + *ofile_internal << grad.get_value(loop_flag)[k] << " "; + } + + std::vector ii(dimension,0); + for (double i = loop_flag[0] - 10; i < loop_flag[0] + 10 + EPSILON; i+= width[0]) { + for (double j = loop_flag[1] - 10; j< loop_flag[1] + 10 + EPSILON; j+=width[1]) { + ii[0] = i; + ii[1] = j; + *ofile_internal << i <<" "<= 0) { + loop_flag[n] += width[n]; + if (loop_flag[n] > upperboundary[n] - width[n] + EPSILON) { + loop_flag[n] = lowerboundary[n]; + n--; + } + else + break; + } + } + cvm::proxy->close_output_stream(internal_filename.c_str()); + } + + // write output files + void write_files() { + std::string grad_filename = output_filename + ".UI.grad"; + std::string hist_filename = output_filename + ".UI.hist.grad"; + std::string count_filename = output_filename + ".UI.count"; + + int i, j; +// + // only for colvars module! + if (written) cvm::backup_file(grad_filename.c_str()); + //if (written) cvm::backup_file(hist_filename.c_str()); + if (written) cvm::backup_file(count_filename.c_str()); + + std::ostream* ofile = cvm::proxy->output_stream(grad_filename.c_str()); + std::ostream* ofile_hist = cvm::proxy->output_stream(hist_filename.c_str(), std::ios::app); + std::ostream* ofile_count = cvm::proxy->output_stream(count_filename.c_str()); + + writehead(*ofile); + writehead(*ofile_hist); + writehead(*ofile_count); + + if (dimension == 1) { + calc_1D_pmf(); + write_1D_pmf(); + } + + std::vector loop_flag(dimension, 0); + for (i = 0; i < dimension; i++) { + loop_flag[i] = lowerboundary[i]; + } + + i = 0; + while (i >= 0) { + for (j = 0; j < dimension; j++) { + *ofile << loop_flag[j] + 0.5 * width[j] << " "; + *ofile_hist << loop_flag[j] + 0.5 * width[j] << " "; + *ofile_count << loop_flag[j] + 0.5 * width[j] << " "; + } + + if (restart == false) { + for (j = 0; j < dimension; j++) { + *ofile << grad.get_value(loop_flag)[j] << " "; + *ofile_hist << grad.get_value(loop_flag)[j] << " "; + } + *ofile << std::endl; + *ofile_hist << std::endl; + *ofile_count << count.get_value(loop_flag) << " " <= 0) { + loop_flag[i] += width[i]; + if (loop_flag[i] > upperboundary[i] - width[i] + EPSILON) { + loop_flag[i] = lowerboundary[i]; + i--; + *ofile << std::endl; + *ofile_hist << std::endl; + *ofile_count << std::endl; + } + else + break; + } + } + cvm::proxy->close_output_stream(grad_filename.c_str()); + cvm::proxy->close_output_stream(hist_filename.c_str()); + cvm::proxy->close_output_stream(count_filename.c_str()); + + written = true; + } + + // read input files + void read_inputfiles(const std::vector input_filename) + { + char sharp; + double nothing; + int dimension_temp; + int i, j, k, l, m; + + std::vector loop_bin_size(dimension, 0); + std::vector position_temp(dimension, 0); + std::vector grad_temp(dimension, 0); + int count_temp = 0; + for (i = 0; i < int(input_filename.size()); i++) { + int size = 1 , size_temp = 0; + + std::string count_filename = input_filename[i] + ".UI.count"; + std::string grad_filename = input_filename[i] + ".UI.grad"; + + std::ifstream count_file(count_filename.c_str(), std::ios::in); + std::ifstream grad_file(grad_filename.c_str(), std::ios::in); + + count_file >> sharp >> dimension_temp; + grad_file >> sharp >> dimension_temp; + + for (j = 0; j < dimension; j++) { + count_file >> sharp >> nothing >> nothing >> size_temp >> nothing; + grad_file >> sharp >> nothing >> nothing >> nothing >> nothing; + size *= size_temp; + } + + for (j = 0; j < size; j++) { + do { + for (k = 0; k < dimension; k++) { + count_file >> position_temp[k]; + grad_file >> nothing; + } + + for (l = 0; l < dimension; l++) { + grad_file >> grad_temp[l]; + } + count_file >> count_temp; + } + while (position_temp[i] < lowerboundary[i] - EPSILON || position_temp[i] > upperboundary[i] + EPSILON); + + if (count_temp == 0) { + continue; + } + + for (m = 0; m < dimension; m++) { + grad_temp[m] = (grad_temp[m] * count_temp + input_grad.get_value(position_temp)[m] * input_count.get_value(position_temp)) / (count_temp + input_count.get_value(position_temp)); + } + input_grad.set_value(position_temp, grad_temp); + input_count.increase_value(position_temp, count_temp); + } + + count_file.close(); + grad_file.close(); + } + } + }; +}; + +#endif diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 9b4a922e3f..1be6f42e59 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -8,9 +8,11 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarparse.h" #include "colvaratoms.h" + cvm::atom::atom() { index = -1; @@ -817,6 +819,18 @@ int cvm::atom_group::create_sorted_ids(void) } +int cvm::atom_group::overlap(const atom_group &g1, const atom_group &g2){ + for (cvm::atom_const_iter ai1 = g1.begin(); ai1 != g1.end(); ai1++) { + for (cvm::atom_const_iter ai2 = g2.begin(); ai2 != g2.end(); ai2++) { + if (ai1->id == ai2->id) { + return (ai1->id + 1); // 1-based index to allow boolean usage + } + } + } + return 0; +} + + void cvm::atom_group::center_ref_pos() { ref_pos_cog = cvm::atom_pos(0.0, 0.0, 0.0); diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index dba2890abc..0dda6ab792 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -11,6 +11,7 @@ #define COLVARATOMS_H #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarparse.h" #include "colvardeps.h" @@ -206,9 +207,20 @@ public: static std::vector ag_features; /// \brief Implementation of the feature list accessor for atom group - virtual std::vector &features() { + virtual const std::vector &features() + { return ag_features; } + virtual std::vector &modify_features() + { + return ag_features; + } + static void delete_features() { + for (size_t i=0; i < ag_features.size(); i++) { + delete ag_features[i]; + } + ag_features.clear(); + } protected: @@ -275,6 +287,10 @@ public: /// Allocates and populates the sorted list of atom ids int create_sorted_ids(void); + /// Detect whether two groups share atoms + /// If yes, returns 1-based number of a common atom; else, returns 0 + static int overlap(const atom_group &g1, const atom_group &g2); + /// \brief When updating atomic coordinates, translate them to align with the /// center of mass of the reference coordinates bool b_center; diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index e437466be9..29620fbee8 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -8,8 +8,10 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarvalue.h" #include "colvarbias.h" +#include "colvargrid.h" colvarbias::colvarbias(char const *key) @@ -31,12 +33,14 @@ int colvarbias::init(std::string const &conf) { colvarparse::init(conf); + size_t i = 0; + if (name.size() == 0) { // first initialization cvm::log("Initializing a new \""+bias_type+"\" instance.\n"); - rank = cvm::num_biases_type(bias_type); + rank = cvm::main()->num_biases_type(bias_type); get_keyval(conf, "name", name, bias_type+cvm::to_str(rank)); { @@ -62,7 +66,7 @@ int colvarbias::init(std::string const &conf) INPUT_ERROR); return INPUT_ERROR; } - for (size_t i = 0; i < colvar_names.size(); i++) { + for (i = 0; i < colvar_names.size(); i++) { add_colvar(colvar_names[i]); } } @@ -148,6 +152,13 @@ int colvarbias::clear() } +int colvarbias::clear_state_data() +{ + // no mutable content to delete for base class + return COLVARS_OK; +} + + int colvarbias::add_colvar(std::string const &cv_name) { if (colvar *cv = cvm::colvar_by_name(cv_name)) { @@ -164,6 +175,8 @@ int colvarbias::add_colvar(std::string const &cv_name) colvar_forces.back().is_derivative(); // colvar constraints are not applied to the force colvar_forces.back().reset(); + previous_colvar_forces.push_back(colvar_forces.back()); + cv->biases.push_back(this); // add back-reference to this bias to colvar if (is_enabled(f_cvb_apply_force)) { @@ -204,7 +217,8 @@ int colvarbias::update() void colvarbias::communicate_forces() { - for (size_t i = 0; i < num_variables(); i++) { + size_t i = 0; + for (i = 0; i < num_variables(); i++) { if (cvm::debug()) { cvm::log("Communicating a force to colvar \""+ variables(i)->name+"\".\n"); @@ -216,6 +230,9 @@ void colvarbias::communicate_forces() // aware of this bias' time_step_factor variables(i)->add_bias_force(cvm::real(time_step_factor) * colvar_forces[i]); } + for (i = 0; i < num_variables(); i++) { + previous_colvar_forces[i] = colvar_forces[i]; + } } @@ -384,10 +401,264 @@ std::ostream & colvarbias::write_traj(std::ostream &os) os << " "; if (b_output_energy) os << " " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << bias_energy; return os; } + + +colvarbias_ti::colvarbias_ti(char const *key) + : colvarbias(key) +{ + provide(f_cvb_calc_ti_samples); + ti_avg_forces = NULL; + ti_count = NULL; +} + + +colvarbias_ti::~colvarbias_ti() +{ + colvarbias_ti::clear_state_data(); +} + + +int colvarbias_ti::clear_state_data() +{ + if (ti_avg_forces != NULL) { + delete ti_avg_forces; + ti_avg_forces = NULL; + } + if (ti_count != NULL) { + delete ti_count; + ti_count = NULL; + } + return COLVARS_OK; +} + + +int colvarbias_ti::init(std::string const &conf) +{ + int error_code = COLVARS_OK; + + get_keyval_feature(this, conf, "writeTISamples", + f_cvb_write_ti_samples, + is_enabled(f_cvb_write_ti_samples)); + + get_keyval_feature(this, conf, "writeTIPMF", + f_cvb_write_ti_pmf, + is_enabled(f_cvb_write_ti_pmf)); + + if ((num_variables() > 1) && is_enabled(f_cvb_write_ti_pmf)) { + return cvm::error("Error: only 1-dimensional PMFs can be written " + "on the fly.\n" + "Consider using writeTISamples instead and " + "post-processing the sampled free-energy gradients.\n", + COLVARS_NOT_IMPLEMENTED); + } else { + error_code |= init_grids(); + } + + if (is_enabled(f_cvb_write_ti_pmf)) { + enable(f_cvb_write_ti_samples); + } + + if (is_enabled(f_cvb_calc_ti_samples)) { + std::vector const time_biases = + cvm::main()->time_dependent_biases(); + if (time_biases.size() > 0) { + if ((time_biases.size() > 1) || (time_biases[0] != this->name)) { + for (size_t i = 0; i < num_variables(); i++) { + if (! variables(i)->is_enabled(f_cv_subtract_applied_force)) { + return cvm::error("Error: cannot collect TI samples while other " + "time-dependent biases are active and not all " + "variables have subtractAppliedForces on.\n", + INPUT_ERROR); + } + } + } + } + } + + return error_code; +} + + +int colvarbias_ti::init_grids() +{ + if (is_enabled(f_cvb_calc_ti_samples)) { + if (ti_avg_forces == NULL) { + ti_bin.resize(num_variables()); + ti_system_forces.resize(num_variables()); + for (size_t icv = 0; icv < num_variables(); icv++) { + ti_system_forces[icv].type(variables(icv)->value()); + ti_system_forces[icv].is_derivative(); + ti_system_forces[icv].reset(); + } + ti_avg_forces = new colvar_grid_gradient(colvars); + ti_count = new colvar_grid_count(colvars); + ti_avg_forces->samples = ti_count; + ti_count->has_parent_data = true; + } + } + + return COLVARS_OK; +} + + +int colvarbias_ti::update() +{ + return update_system_forces(NULL); +} + + +int colvarbias_ti::update_system_forces(std::vector const + *subtract_forces) +{ + if (! is_enabled(f_cvb_calc_ti_samples)) { + return COLVARS_OK; + } + + has_data = true; + + if (cvm::debug()) { + cvm::log("Updating system forces for bias "+this->name+"\n"); + } + + colvarproxy *proxy = cvm::main()->proxy; + + size_t i; + + if (proxy->total_forces_same_step()) { + for (i = 0; i < num_variables(); i++) { + ti_bin[i] = ti_avg_forces->current_bin_scalar(i); + } + } + + // Collect total colvar forces + if ((cvm::step_relative() > 0) || proxy->total_forces_same_step()) { + if (ti_avg_forces->index_ok(ti_bin)) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->is_enabled(f_cv_subtract_applied_force)) { + // this colvar is already subtracting all applied forces + ti_system_forces[i] = variables(i)->total_force(); + } else { + ti_system_forces[i] = variables(i)->total_force() - + ((subtract_forces != NULL) ? + (*subtract_forces)[i] : previous_colvar_forces[i]); + } + } + ti_avg_forces->acc_value(ti_bin, ti_system_forces); + } + } + + if (!proxy->total_forces_same_step()) { + // Set the index for use in the next iteration, when total forces come in + for (i = 0; i < num_variables(); i++) { + ti_bin[i] = ti_avg_forces->current_bin_scalar(i); + } + } + + return COLVARS_OK; +} + + +std::string const colvarbias_ti::get_state_params() const +{ + return std::string(""); +} + + +int colvarbias_ti::set_state_params(std::string const &state_conf) +{ + return COLVARS_OK; +} + + +std::ostream & colvarbias_ti::write_state_data(std::ostream &os) +{ + if (! is_enabled(f_cvb_calc_ti_samples)) { + return os; + } + os << "\nhistogram\n"; + ti_count->write_raw(os); + os << "\nsystem_forces\n"; + ti_avg_forces->write_raw(os); + return os; +} + + +std::istream & colvarbias_ti::read_state_data(std::istream &is) +{ + if (! is_enabled(f_cvb_calc_ti_samples)) { + return is; + } + if (cvm::debug()) { + cvm::log("Reading state data for the TI estimator.\n"); + } + if (! read_state_data_key(is, "histogram")) { + return is; + } + if (! ti_count->read_raw(is)) { + return is; + } + if (! read_state_data_key(is, "system_forces")) { + return is; + } + if (! ti_avg_forces->read_raw(is)) { + return is; + } + if (cvm::debug()) { + cvm::log("Done reading state data for the TI estimator.\n"); + } + return is; +} + + +int colvarbias_ti::write_output_files() +{ + if (!has_data) { + // nothing to write + return COLVARS_OK; + } + + std::string const ti_output_prefix = cvm::output_prefix()+"."+this->name; + + std::ostream *os = NULL; + + if (is_enabled(f_cvb_write_ti_samples)) { + std::string const ti_count_file_name(ti_output_prefix+".ti.count"); + os = cvm::proxy->output_stream(ti_count_file_name); + if (os) { + ti_count->write_multicol(*os); + cvm::proxy->close_output_stream(ti_count_file_name); + } + + std::string const ti_grad_file_name(ti_output_prefix+".ti.grad"); + os = cvm::proxy->output_stream(ti_grad_file_name); + if (os) { + ti_avg_forces->write_multicol(*os); + cvm::proxy->close_output_stream(ti_grad_file_name); + } + } + + if (is_enabled(f_cvb_write_ti_pmf)) { + std::string const pmf_file_name(ti_output_prefix+".ti.pmf"); + cvm::log("Writing TI PMF to file \""+pmf_file_name+"\".\n"); + os = cvm::proxy->output_stream(pmf_file_name); + if (os) { + // get the FE gradient + ti_avg_forces->multiply_constant(-1.0); + ti_avg_forces->write_1D_integral(*os); + ti_avg_forces->multiply_constant(-1.0); + cvm::proxy->close_output_stream(pmf_file_name); + } + } + + return COLVARS_OK; +} + + // Static members std::vector colvarbias::cvb_features; diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index 205e761cfc..083b9d7303 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -109,6 +109,9 @@ public: /// \brief Delete everything virtual int clear(); + /// \brief Delete only the allocatable data (save memory) + virtual int clear_state_data(); + /// Destructor virtual ~colvarbias(); @@ -175,10 +178,20 @@ public: static std::vector cvb_features; /// \brief Implementation of the feature list accessor for colvarbias - virtual std::vector &features() + virtual const std::vector &features() { return cvb_features; } + virtual std::vector &modify_features() + { + return cvb_features; + } + static void delete_features() { + for (size_t i=0; i < cvb_features.size(); i++) { + delete cvb_features[i]; + } + cvb_features.clear(); + } protected: @@ -190,6 +203,9 @@ protected: /// \brief Current forces from this bias to the variables std::vector colvar_forces; + /// \brief Forces last applied by this bias to the variables + std::vector previous_colvar_forces; + /// \brief Current energy of this bias (colvar_forces should be obtained by deriving this) cvm::real bias_energy; @@ -205,4 +221,48 @@ protected: }; + +class colvar_grid_gradient; +class colvar_grid_count; + +/// \brief Base class for unconstrained thermodynamic-integration FE estimator +class colvarbias_ti : public virtual colvarbias { +public: + + colvarbias_ti(char const *key); + virtual ~colvarbias_ti(); + + virtual int clear_state_data(); + + virtual int init(std::string const &conf); + virtual int init_grids(); + virtual int update(); + + /// Subtract applied forces (either last forces or argument) from the total + /// forces + virtual int update_system_forces(std::vector const + *subtract_forces); + + virtual std::string const get_state_params() const; + virtual int set_state_params(std::string const &state_conf); + virtual std::ostream & write_state_data(std::ostream &os); + virtual std::istream & read_state_data(std::istream &is); + virtual int write_output_files(); + +protected: + + /// \brief Forces exerted from the system to the associated variables + std::vector ti_system_forces; + + /// Averaged system forces + colvar_grid_gradient *ti_avg_forces; + + /// Histogram of sampled data + colvar_grid_count *ti_count; + + /// Because total forces may be from the last simulation step, + /// store the index of the variables then + std::vector ti_bin; +}; + #endif diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index a96fc21d64..b3b5b3eb16 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -8,24 +8,29 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_abf.h" colvarbias_abf::colvarbias_abf(char const *key) : colvarbias(key), + b_UI_estimator(false), + b_CZAR_estimator(false), system_force(NULL), gradients(NULL), + pmf(NULL), samples(NULL), z_gradients(NULL), z_samples(NULL), czar_gradients(NULL), + czar_pmf(NULL), last_gradients(NULL), - last_samples(NULL) + last_samples(NULL), + pabf_freq(0) { } - int colvarbias_abf::init(std::string const &conf) { colvarbias::init(conf); @@ -89,7 +94,7 @@ int colvarbias_abf::init(std::string const &conf) // ************* checking the associated colvars ******************* - if (colvars.size() == 0) { + if (num_variables() == 0) { cvm::error("Error: no collective variables specified for the ABF bias.\n"); return COLVARS_ERROR; } @@ -100,7 +105,8 @@ int colvarbias_abf::init(std::string const &conf) } bool b_extended = false; - for (size_t i = 0; i < colvars.size(); i++) { + size_t i; + for (i = 0; i < num_variables(); i++) { if (colvars[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Error: ABF bias can only use scalar-type variables.\n"); @@ -130,10 +136,10 @@ int colvarbias_abf::init(std::string const &conf) } if (get_keyval(conf, "maxForce", max_force)) { - if (max_force.size() != colvars.size()) { + if (max_force.size() != num_variables()) { cvm::error("Error: Number of parameters to maxForce does not match number of colvars."); } - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { if (max_force[i] < 0.0) { cvm::error("Error: maxForce should be non-negative."); } @@ -143,9 +149,9 @@ int colvarbias_abf::init(std::string const &conf) cap_force = false; } - bin.assign(colvars.size(), 0); - force_bin.assign(colvars.size(), 0); - system_force = new cvm::real [colvars.size()]; + bin.assign(num_variables(), 0); + force_bin.assign(num_variables(), 0); + system_force = new cvm::real [num_variables()]; // Construct empty grids based on the colvars if (cvm::debug()) { @@ -157,13 +163,14 @@ int colvarbias_abf::init(std::string const &conf) gradients->samples = samples; samples->has_parent_data = true; - // Data for eABF z-based estimator - if (b_extended) { + // Data for eAB F z-based estimator + if ( b_extended ) { + get_keyval(conf, "CZARestimator", b_CZAR_estimator, true); // CZAR output files for stratified eABF get_keyval(conf, "writeCZARwindowFile", b_czar_window_file, false, colvarparse::parse_silent); - z_bin.assign(colvars.size(), 0); + z_bin.assign(num_variables(), 0); z_samples = new colvar_grid_count(colvars); z_samples->request_actual_value(); z_gradients = new colvar_grid_gradient(colvars); @@ -173,6 +180,27 @@ int colvarbias_abf::init(std::string const &conf) czar_gradients = new colvar_grid_gradient(colvars); } + // For now, we integrate on-the-fly iff the grid is < 3D + if ( num_variables() <= 3 ) { + pmf = new integrate_potential(colvars, gradients); + if ( b_CZAR_estimator ) { + czar_pmf = new integrate_potential(colvars, czar_gradients); + } + get_keyval(conf, "integrate", b_integrate, true); // Integrate for output + if ( num_variables() > 1 ) { + // Projected ABF + get_keyval(conf, "pABFintegrateFreq", pabf_freq, 0); + // Parameters for integrating initial (and final) gradient data + get_keyval(conf, "integrateInitSteps", integrate_initial_steps, 1e4); + get_keyval(conf, "integrateInitTol", integrate_initial_tol, 1e-6); + // for updating the integrated PMF on the fly + get_keyval(conf, "integrateSteps", integrate_steps, 100); + get_keyval(conf, "integrateTol", integrate_tol, 1e-4); + } + } else { + b_integrate = false; + } + // For shared ABF, we store a second set of grids. // This used to be only if "shared" was defined, // but now we allow calling share externally (e.g. from Tcl). @@ -185,10 +213,42 @@ int colvarbias_abf::init(std::string const &conf) // If custom grids are provided, read them if ( input_prefix.size() > 0 ) { read_gradients_samples(); + // Update divergence to account for input data + pmf->set_div(); + } + + // if extendedLangrangian is on, then call UI estimator + if (b_extended) { + get_keyval(conf, "UIestimator", b_UI_estimator, false); + + if (b_UI_estimator) { + std::vector UI_lowerboundary; + std::vector UI_upperboundary; + std::vector UI_width; + std::vector UI_krestr; + + bool UI_restart = (input_prefix.size() > 0); + + for (i = 0; i < num_variables(); i++) + { + UI_lowerboundary.push_back(colvars[i]->lower_boundary); + UI_upperboundary.push_back(colvars[i]->upper_boundary); + UI_width.push_back(colvars[i]->width); + UI_krestr.push_back(colvars[i]->force_constant()); + } + eabf_UI = UIestimator::UIestimator(UI_lowerboundary, + UI_upperboundary, + UI_width, + UI_krestr, // force constant in eABF + output_prefix, // the prefix of output files + cvm::restart_out_freq, + UI_restart, // whether restart from a .count and a .grad file + input_prefix, // the prefixes of input files + cvm::temperature()); + } } cvm::log("Finished ABF setup.\n"); - return COLVARS_OK; } @@ -205,6 +265,11 @@ colvarbias_abf::~colvarbias_abf() gradients = NULL; } + if (pmf) { + delete pmf; + pmf = NULL; + } + if (z_samples) { delete z_samples; z_samples = NULL; @@ -220,6 +285,11 @@ colvarbias_abf::~colvarbias_abf() czar_gradients = NULL; } + if (czar_pmf) { + delete czar_pmf; + czar_pmf = NULL; + } + // shared ABF // We used to only do this if "shared" was defined, // but now we can call shared externally @@ -245,40 +315,48 @@ colvarbias_abf::~colvarbias_abf() int colvarbias_abf::update() { + int iter; + if (cvm::debug()) cvm::log("Updating ABF bias " + this->name); - if (cvm::step_relative() == 0) { + size_t i; + for (i = 0; i < num_variables(); i++) { + bin[i] = samples->current_bin_scalar(i); + } + if (cvm::proxy->total_forces_same_step()) { + // e.g. in LAMMPS, total forces are current + force_bin = bin; + } - // At first timestep, do only: - // initialization stuff (file operations relying on n_abf_biases - // compute current value of colvars + if (cvm::step_relative() > 0 || cvm::proxy->total_forces_same_step()) { - for (size_t i = 0; i < colvars.size(); i++) { - bin[i] = samples->current_bin_scalar(i); - } + if (update_bias) { +// if (b_adiabatic_reweighting) { +// // Update gradients non-locally based on conditional distribution of +// // fictitious variable TODO +// +// } else + if (samples->index_ok(force_bin)) { + // Only if requested and within bounds of the grid... - } else { - - for (size_t i = 0; i < colvars.size(); i++) { - bin[i] = samples->current_bin_scalar(i); - } - - if ( update_bias && samples->index_ok(force_bin) ) { - // Only if requested and within bounds of the grid... - - for (size_t i = 0; i < colvars.size(); i++) { - // get total forces (lagging by 1 timestep) from colvars - // and subtract previous ABF force if necessary - update_system_force(i); + for (i = 0; i < num_variables(); i++) { + // get total forces (lagging by 1 timestep) from colvars + // and subtract previous ABF force if necessary + update_system_force(i); + } + gradients->acc_force(force_bin, system_force); + if ( b_integrate ) { + pmf->update_div_neighbors(force_bin); + } } - gradients->acc_force(force_bin, system_force); } + if ( z_gradients && update_bias ) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { z_bin[i] = z_samples->current_bin_scalar(i); } if ( z_samples->index_ok(z_bin) ) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { // If we are outside the range of xi, the force has not been obtained above // the function is just an accessor, so cheap to call again anyway update_system_force(i); @@ -286,20 +364,31 @@ int colvarbias_abf::update() z_gradients->acc_force(z_bin, system_force); } } + + if ( b_integrate ) { + if ( pabf_freq && cvm::step_relative() % pabf_freq == 0 ) { + cvm::real err; + iter = pmf->integrate(integrate_steps, integrate_tol, err); + pmf->set_zero_minimum(); // TODO: do this only when necessary + } + } } - // save bin for next timestep - force_bin = bin; + if (!cvm::proxy->total_forces_same_step()) { + // e.g. in NAMD, total forces will be available for next timestep + // hence we store the current colvar bin + force_bin = bin; + } // Reset biasing forces from previous timestep - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_forces[i].reset(); } // Compute and apply the new bias, if applicable if (is_enabled(f_cvb_apply_force) && samples->index_ok(bin)) { - size_t count = samples->value(bin); + cvm::real count = samples->value(bin); cvm::real fact = 1.0; // Factor that ensures smooth introduction of the force @@ -308,21 +397,34 @@ int colvarbias_abf::update() (cvm::real(count - min_samples)) / (cvm::real(full_samples - min_samples)); } - const cvm::real * grad = &(gradients->value(bin)); + std::vector grad(num_variables()); + if ( pabf_freq ) { + // In projected ABF, the force is the PMF gradient estimate + pmf->vector_gradient_finite_diff(bin, grad); + } else { + // Normal ABF + gradients->vector_value(bin, grad); + } + +// if ( b_adiabatic_reweighting) { +// // Average of force according to conditional distribution of fictitious variable +// // need freshly integrated PMF, gradient TODO +// } else if ( fact != 0.0 ) { - if ( (colvars.size() == 1) && colvars[0]->periodic_boundaries() ) { + if ( (num_variables() == 1) && colvars[0]->periodic_boundaries() ) { // Enforce a zero-mean bias on periodic, 1D coordinates // in other words: boundary condition is that the biasing potential is periodic - colvar_forces[0].real_value = fact * (grad[0] / cvm::real(count) - gradients->average()); + // This is enforced naturally if using integrated PMF + colvar_forces[0].real_value = fact * (grad[0] - gradients->average ()); } else { - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { // subtracting the mean force (opposite of the FE gradient) means adding the gradient - colvar_forces[i].real_value = fact * grad[i] / cvm::real(count); + colvar_forces[i].real_value = fact * grad[i]; } } if (cap_force) { - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { if ( colvar_forces[i].real_value * colvar_forces[i].real_value > max_force[i] * max_force[i] ) { colvar_forces[i].real_value = (colvar_forces[i].real_value > 0 ? max_force[i] : -1.0 * max_force[i]); } @@ -332,7 +434,7 @@ int colvarbias_abf::update() } // update the output prefix; TODO: move later to setup_output() function - if (cvm::num_biases_feature(colvardeps::f_cvb_calc_pmf) == 1) { + if (cvm::main()->num_biases_feature(colvardeps::f_cvb_calc_pmf) == 1) { // This is the only bias computing PMFs output_prefix = cvm::output_prefix(); } else { @@ -364,6 +466,20 @@ int colvarbias_abf::update() cvm::log("Prepared sample and gradient buffers at step "+cvm::to_str(cvm::step_absolute())+"."); } + // update UI estimator every step + if (b_UI_estimator) + { + std::vector x(num_variables(),0); + std::vector y(num_variables(),0); + for (size_t i = 0; i < num_variables(); i++) + { + x[i] = colvars[i]->actual_value(); + y[i] = colvars[i]->value(); + } + eabf_UI.update_output_filename(output_prefix); + eabf_UI.update(cvm::step_absolute(), x, y); + } + return COLVARS_OK; } @@ -455,32 +571,66 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(samples_out_name, mode); if (!samples_os) { cvm::error("Error opening ABF samples file " + samples_out_name + " for writing"); + return; } samples->write_multicol(*samples_os); cvm::proxy->close_output_stream(samples_out_name); + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string samples_dx_out_name = prefix + ".count.dx"; + std::ostream *samples_dx_os = cvm::proxy->output_stream(samples_dx_out_name, mode); + if (!samples_os) { + cvm::error("Error opening samples file " + samples_dx_out_name + " for writing"); + return; + } + samples->write_opendx(*samples_dx_os); + *samples_dx_os << std::endl; + cvm::proxy->close_output_stream(samples_dx_out_name); + } + std::ostream *gradients_os = cvm::proxy->output_stream(gradients_out_name, mode); if (!gradients_os) { cvm::error("Error opening ABF gradient file " + gradients_out_name + " for writing"); + return; } gradients->write_multicol(*gradients_os); cvm::proxy->close_output_stream(gradients_out_name); - if (colvars.size() == 1) { - // Do numerical integration and output a PMF + if (b_integrate) { + // Do numerical integration (to high precision) and output a PMF + cvm::real err; + pmf->integrate(integrate_initial_steps, integrate_initial_tol, err); + pmf->set_zero_minimum(); + std::string pmf_out_name = prefix + ".pmf"; std::ostream *pmf_os = cvm::proxy->output_stream(pmf_out_name, mode); if (!pmf_os) { cvm::error("Error opening pmf file " + pmf_out_name + " for writing"); + return; } - gradients->write_1D_integral(*pmf_os); + pmf->write_multicol(*pmf_os); + + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string pmf_dx_out_name = prefix + ".pmf.dx"; + std::ostream *pmf_dx_os = cvm::proxy->output_stream(pmf_dx_out_name, mode); + if (!pmf_dx_os) { + cvm::error("Error opening pmf file " + pmf_dx_out_name + " for writing"); + return; + } + pmf->write_opendx(*pmf_dx_os); + *pmf_dx_os << std::endl; + cvm::proxy->close_output_stream(pmf_dx_out_name); + } + *pmf_os << std::endl; cvm::proxy->close_output_stream(pmf_out_name); } - if (z_gradients) { - // Write eABF-related quantities + if (b_CZAR_estimator) { + // Write eABF CZAR-related quantities std::string z_samples_out_name = prefix + ".zcount"; @@ -488,6 +638,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(z_samples_out_name, mode); if (!z_samples_os) { cvm::error("Error opening eABF z-histogram file " + z_samples_out_name + " for writing"); + return; } z_samples->write_multicol(*z_samples_os); cvm::proxy->close_output_stream(z_samples_out_name); @@ -499,6 +650,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(z_gradients_out_name, mode); if (!z_gradients_os) { cvm::error("Error opening eABF z-gradient file " + z_gradients_out_name + " for writing"); + return; } z_gradients->write_multicol(*z_gradients_os); cvm::proxy->close_output_stream(z_gradients_out_name); @@ -509,8 +661,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app czar_gradients->index_ok(ix); czar_gradients->incr(ix)) { for (size_t n = 0; n < czar_gradients->multiplicity(); n++) { czar_gradients->set_value(ix, z_gradients->value_output(ix, n) - - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), - n); + - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), n); } } @@ -520,17 +671,39 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(czar_gradients_out_name, mode); if (!czar_gradients_os) { cvm::error("Error opening CZAR gradient file " + czar_gradients_out_name + " for writing"); + return; } czar_gradients->write_multicol(*czar_gradients_os); cvm::proxy->close_output_stream(czar_gradients_out_name); - if (colvars.size() == 1) { - // Do numerical integration and output a PMF + if (b_integrate) { + // Do numerical integration (to high precision) and output a PMF + cvm::real err; + czar_pmf->set_div(); + czar_pmf->integrate(integrate_initial_steps, integrate_initial_tol, err); + czar_pmf->set_zero_minimum(); + std::string czar_pmf_out_name = prefix + ".czar.pmf"; - std::ostream *czar_pmf_os = - cvm::proxy->output_stream(czar_pmf_out_name, mode); - if (!czar_pmf_os) cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); - czar_gradients->write_1D_integral(*czar_pmf_os); + std::ostream *czar_pmf_os = cvm::proxy->output_stream(czar_pmf_out_name, mode); + if (!czar_pmf_os) { + cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); + return; + } + czar_pmf->write_multicol(*czar_pmf_os); + + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string czar_pmf_dx_out_name = prefix + ".czar.pmf.dx"; + std::ostream *czar_pmf_dx_os = cvm::proxy->output_stream(czar_pmf_dx_out_name, mode); + if (!czar_pmf_dx_os) { + cvm::error("Error opening CZAR pmf file " + czar_pmf_dx_out_name + " for writing"); + return; + } + czar_pmf->write_opendx(*czar_pmf_dx_os); + *czar_pmf_dx_os << std::endl; + cvm::proxy->close_output_stream(czar_pmf_dx_out_name); + } + *czar_pmf_os << std::endl; cvm::proxy->close_output_stream(czar_pmf_out_name); } @@ -588,7 +761,7 @@ void colvarbias_abf::read_gradients_samples() is.close(); } - if (z_gradients) { + if (b_CZAR_estimator) { // Read eABF z-averaged data for CZAR cvm::log("Reading z-histogram from " + z_samples_in_name + " and z-gradient from " + z_gradients_in_name); @@ -621,7 +794,7 @@ std::ostream & colvarbias_abf::write_state_data(std::ostream& os) os << "\ngradient\n"; gradients->write_raw(os, 8); - if (z_gradients) { + if (b_CZAR_estimator) { os.setf(std::ios::fmtflags(0), std::ios::floatfield); // default floating-point format os << "\nz_samples\n"; z_samples->write_raw(os, 8); @@ -654,8 +827,12 @@ std::istream & colvarbias_abf::read_state_data(std::istream& is) if (! gradients->read_raw(is)) { return is; } + if (b_integrate) { + // Update divergence to account for restart data + pmf->set_div(); + } - if (z_gradients) { + if (b_CZAR_estimator) { if (! read_state_data_key(is, "z_samples")) { return is; diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 41a5475fa7..0260401292 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -17,6 +17,7 @@ #include "colvarbias.h" #include "colvargrid.h" +#include "colvar_UIestimator.h" typedef cvm::real* gradient_t; @@ -39,22 +40,44 @@ private: /// Base filename(s) for reading previous gradient data (replaces data from restart file) std::vector input_prefix; - bool update_bias; - bool hide_Jacobian; - size_t full_samples; - size_t min_samples; - /// frequency for updating output files - int output_freq; - /// Write combined files with a history of all output data? - bool b_history_files; - /// Write CZAR output file for stratified eABF (.zgrad) - bool b_czar_window_file; - size_t history_freq; + bool update_bias; + bool hide_Jacobian; + bool b_integrate; - /// Cap applied biasing force? + size_t full_samples; + size_t min_samples; + /// frequency for updating output files + int output_freq; + /// Write combined files with a history of all output data? + bool b_history_files; + /// Write CZAR output file for stratified eABF (.zgrad) + bool b_czar_window_file; + size_t history_freq; + /// Umbrella Integration estimator of free energy from eABF + UIestimator::UIestimator eabf_UI; + /// Run UI estimator? + bool b_UI_estimator; + /// Run CZAR estimator? + bool b_CZAR_estimator; + + /// Frequency for updating pABF PMF (if zero, pABF is not used) + int pabf_freq; + /// Max number of CG iterations for integrating PMF at startup and for file output + int integrate_initial_steps; + /// Tolerance for integrating PMF at startup and for file output + cvm::real integrate_initial_tol; + /// Max number of CG iterations for integrating PMF at on-the-fly pABF updates + int integrate_steps; + /// Tolerance for integrating PMF at on-the-fly pABF updates + cvm::real integrate_tol; + + /// Cap the biasing force to be applied? bool cap_force; std::vector max_force; + // Frequency for updating 2D gradients + int integrate_freq; + // Internal data and methods std::vector bin, force_bin, z_bin; @@ -64,12 +87,16 @@ private: colvar_grid_gradient *gradients; /// n-dim grid of number of samples colvar_grid_count *samples; + /// n-dim grid of pmf (dimension 1 to 3) + integrate_potential *pmf; /// n-dim grid: average force on "real" coordinate for eABF z-based estimator colvar_grid_gradient *z_gradients; /// n-dim grid of number of samples on "real" coordinate for eABF z-based estimator colvar_grid_count *z_samples; /// n-dim grid contining CZAR estimator of "real" free energy gradients colvar_grid_gradient *czar_gradients; + /// n-dim grid of CZAR pmf (dimension 1 to 3) + integrate_potential *czar_pmf; inline int update_system_force(size_t i) { @@ -89,9 +116,9 @@ private: } // shared ABF - bool shared_on; - size_t shared_freq; - int shared_last_step; + bool shared_on; + size_t shared_freq; + int shared_last_step; // Share between replicas -- may be called independently of update virtual int replica_share(); @@ -107,12 +134,12 @@ private: //// Give the count at a given bin index. virtual int bin_count(int bin_index); - /// Write human-readable FE gradients and sample count - void write_gradients_samples(const std::string &prefix, bool append = false); - void write_last_gradients_samples(const std::string &prefix, bool append = false); + /// Write human-readable FE gradients and sample count, and DX file in dim > 2 + void write_gradients_samples(const std::string &prefix, bool append = false); + void write_last_gradients_samples(const std::string &prefix, bool append = false); /// Read human-readable FE gradients and sample count (if not using restart) - void read_gradients_samples(); + void read_gradients_samples(); std::istream& read_state_data(std::istream&); std::ostream& write_state_data(std::ostream&); diff --git a/lib/colvars/colvarbias_alb.cpp b/lib/colvars/colvarbias_alb.cpp index 124a15c5da..187ecc363a 100644 --- a/lib/colvars/colvarbias_alb.cpp +++ b/lib/colvars/colvarbias_alb.cpp @@ -7,13 +7,11 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. -#include -#include -#include +#include #include "colvarmodule.h" -#include "colvarbias_alb.h" #include "colvarbias.h" +#include "colvarbias_alb.h" #ifdef _MSC_VER #if _MSC_VER <= 1700 @@ -45,22 +43,22 @@ int colvarbias_alb::init(std::string const &conf) size_t i; // get the initial restraint centers - colvar_centers.resize(colvars.size()); + colvar_centers.resize(num_variables()); - means.resize(colvars.size()); - ssd.resize(colvars.size()); //sum of squares of differences from mean + means.resize(num_variables()); + ssd.resize(num_variables()); //sum of squares of differences from mean //setup force vectors - max_coupling_range.resize(colvars.size()); - max_coupling_rate.resize(colvars.size()); - coupling_accum.resize(colvars.size()); - set_coupling.resize(colvars.size()); - current_coupling.resize(colvars.size()); - coupling_rate.resize(colvars.size()); + max_coupling_range.resize(num_variables()); + max_coupling_rate.resize(num_variables()); + coupling_accum.resize(num_variables()); + set_coupling.resize(num_variables()); + current_coupling.resize(num_variables()); + coupling_rate.resize(num_variables()); enable(f_cvb_apply_force); - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_centers[i].type(colvars[i]->value()); //zero moments means[i] = ssd[i] = 0; @@ -70,7 +68,7 @@ int colvarbias_alb::init(std::string const &conf) } if (get_keyval(conf, "centers", colvar_centers, colvar_centers)) { - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_centers[i].apply_constraints(); } } else { @@ -78,7 +76,7 @@ int colvarbias_alb::init(std::string const &conf) cvm::fatal_error("Error: must define the initial centers of adaptive linear bias .\n"); } - if (colvar_centers.size() != colvars.size()) + if (colvar_centers.size() != num_variables()) cvm::fatal_error("Error: number of centers does not match " "that of collective variables.\n"); @@ -100,17 +98,17 @@ int colvarbias_alb::init(std::string const &conf) //initial guess if (!get_keyval(conf, "forceConstant", set_coupling, set_coupling)) - for (i =0 ; i < colvars.size(); i++) + for (i =0 ; i < num_variables(); i++) set_coupling[i] = 0.; //how we're going to increase to that point - for (i = 0; i < colvars.size(); i++) + for (i = 0; i < num_variables(); i++) coupling_rate[i] = (set_coupling[i] - current_coupling[i]) / update_freq; if (!get_keyval(conf, "forceRange", max_coupling_range, max_coupling_range)) { //set to default - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { if (cvm::temperature() > 0) max_coupling_range[i] = 3 * cvm::temperature() * cvm::boltzmann(); else @@ -120,7 +118,7 @@ int colvarbias_alb::init(std::string const &conf) if (!get_keyval(conf, "rateMax", max_coupling_rate, max_coupling_rate)) { //set to default - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { max_coupling_rate[i] = max_coupling_range[i] / (10 * update_freq); } } @@ -151,7 +149,7 @@ int colvarbias_alb::update() // Force and energy calculation bool finished_equil_flag = 1; cvm::real delta; - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { colvar_forces[i] = -1.0 * restraint_force(restraint_convert_k(current_coupling[i], colvars[i]->width), colvars[i], colvar_centers[i]); @@ -168,7 +166,9 @@ int colvarbias_alb::update() } else { //check if we've reached the setpoint - if (coupling_rate[i] == 0 || pow(current_coupling[i] - set_coupling[i],2) < pow(coupling_rate[i],2)) { + cvm::real const coupling_diff = current_coupling[i] - set_coupling[i]; + if ((coupling_rate[i] == 0) || + ((coupling_diff*coupling_diff) < (coupling_rate[i]*coupling_rate[i]))) { finished_equil_flag &= 1; //we continue equilibrating as long as we haven't reached all the set points } else { @@ -209,7 +209,7 @@ int colvarbias_alb::update() cvm::real temp; //reset means and sum of squares of differences - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { temp = 2. * (means[i] / (static_cast (colvar_centers[i])) - 1) * ssd[i] / (update_calls - 1); @@ -222,7 +222,7 @@ int colvarbias_alb::update() ssd[i] = 0; //stochastic if we do that update or not - if (colvars.size() == 1 || rand() < RAND_MAX / ((int) colvars.size())) { + if (num_variables() == 1 || rand() < RAND_MAX / ((int) num_variables())) { coupling_accum[i] += step_size * step_size; current_coupling[i] = set_coupling[i]; set_coupling[i] += max_coupling_range[i] / sqrt(coupling_accum[i]) * step_size; @@ -284,37 +284,37 @@ std::string const colvarbias_alb::get_state_params() const std::ostringstream os; os << " setCoupling "; size_t i; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << set_coupling[i] << "\n"; } os << " currentCoupling "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << current_coupling[i] << "\n"; } os << " maxCouplingRange "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << max_coupling_range[i] << "\n"; } os << " couplingRate "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << coupling_rate[i] << "\n"; } os << " couplingAccum "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << coupling_accum[i] << "\n"; } os << " mean "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << means[i] << "\n"; } os << " ssd "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << ssd[i] << "\n"; } @@ -350,7 +350,7 @@ std::ostream & colvarbias_alb::write_traj_label(std::ostream &os) } if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { size_t const this_cv_width = (colvars[i]->value()).output_width(cvm::cv_width); os << " x0_" << cvm::wrap_string(colvars[i]->name, this_cv_width-3); @@ -378,7 +378,7 @@ std::ostream & colvarbias_alb::write_traj(std::ostream &os) if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { os << " " << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) << colvar_centers[i]; diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 0722e6384d..329b1d9dc0 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -8,10 +8,10 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_histogram.h" -/// Histogram "bias" constructor colvarbias_histogram::colvarbias_histogram(char const *key) : colvarbias(key), @@ -44,7 +44,7 @@ int colvarbias_histogram::init(std::string const &conf) get_keyval(conf, "gatherVectorColvars", colvar_array, colvar_array); if (colvar_array) { - for (i = 0; i < colvars.size(); i++) { // should be all vector + for (i = 0; i < num_variables(); i++) { // should be all vector if (colvars[i]->value().type() != colvarvalue::type_vector) { cvm::error("Error: used gatherVectorColvars with non-vector colvar.\n", INPUT_ERROR); return INPUT_ERROR; @@ -63,7 +63,7 @@ int colvarbias_histogram::init(std::string const &conf) } } } else { - for (i = 0; i < colvars.size(); i++) { // should be all scalar + for (i = 0; i < num_variables(); i++) { // should be all scalar if (colvars[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Error: only scalar colvars are supported when gatherVectorColvars is off.\n", INPUT_ERROR); return INPUT_ERROR; @@ -77,7 +77,7 @@ int colvarbias_histogram::init(std::string const &conf) get_keyval(conf, "weights", weights, weights); } - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvars[i]->enable(f_cv_grid); } @@ -116,7 +116,7 @@ int colvarbias_histogram::update() } // assign a valid bin size - bin.assign(colvars.size(), 0); + bin.assign(num_variables(), 0); if (out_name.size() == 0) { // At the first timestep, we need to assign out_name since @@ -137,7 +137,7 @@ int colvarbias_histogram::update() if (colvar_array_size == 0) { // update indices for scalar values size_t i; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { bin[i] = grid->current_bin_scalar(i); } @@ -148,7 +148,7 @@ int colvarbias_histogram::update() // update indices for vector/array values size_t iv, i; for (iv = 0; iv < colvar_array_size; iv++) { - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { bin[i] = grid->current_bin_scalar(i, iv); } diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index 66806fc9fc..f3ae3631a0 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -27,13 +27,14 @@ #define PATHSEP "/" #endif - +#include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_meta.h" colvarbias_meta::colvarbias_meta(char const *key) - : colvarbias(key) + : colvarbias(key), colvarbias_ti(key) { new_hills_begin = hills.end(); hills_traj_os = NULL; @@ -44,6 +45,7 @@ colvarbias_meta::colvarbias_meta(char const *key) int colvarbias_meta::init(std::string const &conf) { colvarbias::init(conf); + colvarbias_ti::init(conf); enable(f_cvb_calc_pmf); @@ -104,7 +106,7 @@ int colvarbias_meta::init(std::string const &conf) get_keyval(conf, "dumpFreeEnergyFile", dump_fes, true, colvarparse::parse_silent); if (get_keyval(conf, "saveFreeEnergyFile", dump_fes_save, false, colvarparse::parse_silent)) { cvm::log("Option \"saveFreeEnergyFile\" is deprecated, " - "please use \"keepFreeEnergyFile\" instead."); + "please use \"keepFreeEnergyFiles\" instead."); } get_keyval(conf, "keepFreeEnergyFiles", dump_fes_save, dump_fes_save); @@ -230,15 +232,7 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf) colvarbias_meta::~colvarbias_meta() { - if (hills_energy) { - delete hills_energy; - hills_energy = NULL; - } - - if (hills_energy_gradients) { - delete hills_energy_gradients; - hills_energy_gradients = NULL; - } + colvarbias_meta::clear_state_data(); if (replica_hills_os) { cvm::proxy->close_output_stream(replica_hills_file); @@ -250,13 +244,31 @@ colvarbias_meta::~colvarbias_meta() hills_traj_os = NULL; } - if(target_dist) { + if (target_dist) { delete target_dist; target_dist = NULL; } } +int colvarbias_meta::clear_state_data() +{ + if (hills_energy) { + delete hills_energy; + hills_energy = NULL; + } + + if (hills_energy_gradients) { + delete hills_energy_gradients; + hills_energy_gradients = NULL; + } + + hills.clear(); + hills_off_grid.clear(); + + return COLVARS_OK; +} + // ********************************************************************** // Hill management member functions @@ -336,6 +348,9 @@ int colvarbias_meta::update() // update base class error_code |= colvarbias::update(); + // update the TI estimator (if defined) + error_code |= colvarbias_ti::update(); + // update grid definition, if needed error_code |= update_grid_params(); // add new biasing energy/forces @@ -1000,6 +1015,10 @@ void colvarbias_meta::update_replicas_registry() (replicas.back())->hills_energy = new colvar_grid_scalar(colvars); (replicas.back())->hills_energy_gradients = new colvar_grid_gradient(colvars); } + if (is_enabled(f_cvb_calc_ti_samples)) { + (replicas.back())->enable(f_cvb_calc_ti_samples); + (replicas.back())->colvarbias_ti::init_grids(); + } } } } else { @@ -1374,6 +1393,8 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) } } + colvarbias_ti::read_state_data(is); + if (cvm::debug()) cvm::log("colvarbias_meta::read_restart() done\n"); @@ -1474,7 +1495,7 @@ std::istream & colvarbias_meta::read_hill(std::istream &is) int colvarbias_meta::setup_output() { output_prefix = cvm::output_prefix(); - if (cvm::num_biases_feature(colvardeps::f_cvb_calc_pmf) > 1) { + if (cvm::main()->num_biases_feature(colvardeps::f_cvb_calc_pmf) > 1) { // if this is not the only free energy integrator, append // this bias's name, to distinguish it from the output of the other // biases producing a .pmf file @@ -1631,6 +1652,7 @@ std::ostream & colvarbias_meta::write_state_data(std::ostream& os) } } + colvarbias_ti::write_state_data(os); return os; } @@ -1651,6 +1673,7 @@ int colvarbias_meta::write_state_to_replicas() int colvarbias_meta::write_output_files() { + colvarbias_ti::write_output_files(); if (dump_fes) { write_pmf(); } diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index 249f7342bc..78b2d35d41 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -19,7 +19,10 @@ #include "colvargrid.h" /// Metadynamics bias (implementation of \link colvarbias \endlink) -class colvarbias_meta : public colvarbias { +class colvarbias_meta + : public virtual colvarbias, + public virtual colvarbias_ti +{ public: @@ -35,10 +38,13 @@ public: Communication comm; colvarbias_meta(char const *key); + virtual ~colvarbias_meta(); + virtual int init(std::string const &conf); virtual int init_well_tempered_params(std::string const &conf); virtual int init_ebmeta_params(std::string const &conf); - virtual ~colvarbias_meta(); + + virtual int clear_state_data(); virtual int update(); virtual int update_grid_params(); diff --git a/lib/colvars/colvarbias_restraint.cpp b/lib/colvars/colvarbias_restraint.cpp index bb6d6164e5..4ed1a95f94 100644 --- a/lib/colvars/colvarbias_restraint.cpp +++ b/lib/colvars/colvarbias_restraint.cpp @@ -7,14 +7,17 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. +#include + #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarvalue.h" #include "colvarbias_restraint.h" colvarbias_restraint::colvarbias_restraint(char const *key) - : colvarbias(key) + : colvarbias(key), colvarbias_ti(key) { } @@ -24,6 +27,8 @@ int colvarbias_restraint::init(std::string const &conf) colvarbias::init(conf); enable(f_cvb_apply_force); + colvarbias_ti::init(conf); + if (cvm::debug()) cvm::log("Initializing a new restraint bias.\n"); @@ -86,7 +91,7 @@ std::ostream & colvarbias_restraint::write_traj(std::ostream &os) colvarbias_restraint_centers::colvarbias_restraint_centers(char const *key) - : colvarbias(key), colvarbias_restraint(key) + : colvarbias(key), colvarbias_ti(key), colvarbias_restraint(key) { } @@ -99,12 +104,9 @@ int colvarbias_restraint_centers::init(std::string const &conf) if (null_centers) { // try to initialize the restraint centers for the first time colvar_centers.resize(num_variables()); - colvar_centers_raw.resize(num_variables()); for (i = 0; i < num_variables(); i++) { colvar_centers[i].type(variables(i)->value()); colvar_centers[i].reset(); - colvar_centers_raw[i].type(variables(i)->value()); - colvar_centers_raw[i].reset(); } } @@ -113,7 +115,6 @@ int colvarbias_restraint_centers::init(std::string const &conf) if (cvm::debug()) { cvm::log("colvarbias_restraint: parsing initial centers, i = "+cvm::to_str(i)+".\n"); } - colvar_centers_raw[i] = colvar_centers[i]; colvar_centers[i].apply_constraints(); } null_centers = false; @@ -141,8 +142,6 @@ int colvarbias_restraint_centers::change_configuration(std::string const &conf) for (size_t i = 0; i < num_variables(); i++) { colvar_centers[i].type(variables(i)->value()); colvar_centers[i].apply_constraints(); - colvar_centers_raw[i].type(variables(i)->value()); - colvar_centers_raw[i] = colvar_centers[i]; } } return COLVARS_OK; @@ -151,16 +150,17 @@ int colvarbias_restraint_centers::change_configuration(std::string const &conf) colvarbias_restraint_k::colvarbias_restraint_k(char const *key) - : colvarbias(key), colvarbias_restraint(key) + : colvarbias(key), colvarbias_ti(key), colvarbias_restraint(key) { force_k = -1.0; + check_positive_k = true; } int colvarbias_restraint_k::init(std::string const &conf) { get_keyval(conf, "forceConstant", force_k, (force_k > 0.0 ? force_k : 1.0)); - if (force_k < 0.0) { + if (check_positive_k && (force_k < 0.0)) { cvm::error("Error: undefined or invalid force constant.\n", INPUT_ERROR); return INPUT_ERROR; } @@ -181,6 +181,7 @@ colvarbias_restraint_moving::colvarbias_restraint_moving(char const *key) target_nstages = 0; target_nsteps = 0; stage = 0; + acc_work = 0.0; b_chg_centers = false; b_chg_force_k = false; } @@ -207,6 +208,14 @@ int colvarbias_restraint_moving::init(std::string const &conf) cvm::error("Error: targetNumStages and lambdaSchedule are incompatible.\n", INPUT_ERROR); return cvm::get_error(); } + + get_keyval_feature(this, conf, "outputAccumulatedWork", + f_cvb_output_acc_work, + is_enabled(f_cvb_output_acc_work)); + if (is_enabled(f_cvb_output_acc_work) && (target_nstages > 0)) { + return cvm::error("Error: outputAccumulatedWork and targetNumStages " + "are incompatible.\n", INPUT_ERROR); + } } return COLVARS_OK; @@ -232,7 +241,6 @@ int colvarbias_restraint_moving::set_state_params(std::string const &conf) { if (b_chg_centers || b_chg_force_k) { if (target_nstages) { - // cvm::log ("Reading current stage from the restart.\n"); if (!get_keyval(conf, "stage", stage)) cvm::error("Error: current stage is missing from the restart.\n"); } @@ -244,14 +252,13 @@ int colvarbias_restraint_moving::set_state_params(std::string const &conf) colvarbias_restraint_centers_moving::colvarbias_restraint_centers_moving(char const *key) : colvarbias(key), + colvarbias_ti(key), colvarbias_restraint(key), colvarbias_restraint_centers(key), colvarbias_restraint_moving(key) { b_chg_centers = false; b_output_centers = false; - b_output_acc_work = false; - acc_work = 0.0; } @@ -265,103 +272,132 @@ int colvarbias_restraint_centers_moving::init(std::string const &conf) size_t i; if (get_keyval(conf, "targetCenters", target_centers, colvar_centers)) { - if (colvar_centers.size() != num_variables()) { + if (target_centers.size() != num_variables()) { cvm::error("Error: number of target centers does not match " - "that of collective variables.\n"); + "that of collective variables.\n", INPUT_ERROR); } b_chg_centers = true; for (i = 0; i < target_centers.size(); i++) { target_centers[i].apply_constraints(); + centers_incr.push_back(colvar_centers[i]); + centers_incr[i].reset(); } } if (b_chg_centers) { - // parse moving restraint options + // parse moving schedule options colvarbias_restraint_moving::init(conf); + if (initial_centers.size() == 0) { + // One-time init + initial_centers = colvar_centers; + } + // Call to check that the definition is correct + for (i = 0; i < num_variables(); i++) { + colvarvalue const midpoint = + colvarvalue::interpolate(initial_centers[i], + target_centers[i], + 0.5); + } + } else { target_centers.clear(); - return COLVARS_OK; } + // Output restraint centers even when they do not change; some NAMD REUS + // scripts expect this behavior get_keyval(conf, "outputCenters", b_output_centers, b_output_centers); - get_keyval(conf, "outputAccumulatedWork", b_output_acc_work, b_output_acc_work); return COLVARS_OK; } +int colvarbias_restraint_centers_moving::update_centers(cvm::real lambda) +{ + if (cvm::debug()) { + cvm::log("Updating centers for the restraint bias \""+ + this->name+"\": "+cvm::to_str(colvar_centers)+".\n"); + } + size_t i; + for (i = 0; i < num_variables(); i++) { + colvarvalue const c_new = colvarvalue::interpolate(initial_centers[i], + target_centers[i], + lambda); + centers_incr[i] = 0.5 * c_new.dist2_grad(colvar_centers[i]); + colvar_centers[i] = c_new; + variables(i)->wrap(colvar_centers[i]); + } + if (cvm::debug()) { + cvm::log("New centers for the restraint bias \""+ + this->name+"\": "+cvm::to_str(colvar_centers)+".\n"); + } + return cvm::get_error(); +} + + int colvarbias_restraint_centers_moving::update() { if (b_chg_centers) { - if (cvm::debug()) { - cvm::log("Updating centers for the restraint bias \""+ - this->name+"\": "+cvm::to_str(colvar_centers)+".\n"); - } - - if (!centers_incr.size()) { - // if this is the first calculation, calculate the advancement - // at each simulation step (or stage, if applicable) - // (take current stage into account: it can be non-zero - // if we are restarting a staged calculation) - centers_incr.resize(num_variables()); - for (size_t i = 0; i < num_variables(); i++) { - centers_incr[i].type(variables(i)->value()); - centers_incr[i] = (target_centers[i] - colvar_centers_raw[i]) / - cvm::real( target_nstages ? (target_nstages - stage) : - (target_nsteps - cvm::step_absolute())); - } - if (cvm::debug()) { - cvm::log("Center increment for the restraint bias \""+ - this->name+"\": "+cvm::to_str(centers_incr)+" at stage "+cvm::to_str(stage)+ ".\n"); - } - } - if (target_nstages) { - if ((cvm::step_relative() > 0) - && (cvm::step_absolute() % target_nsteps) == 0 - && stage < target_nstages) { - - for (size_t i = 0; i < num_variables(); i++) { - colvar_centers_raw[i] += centers_incr[i]; - colvar_centers[i] = colvar_centers_raw[i]; - variables(i)->wrap(colvar_centers[i]); - colvar_centers[i].apply_constraints(); + // Staged update + if (stage <= target_nstages) { + if ((cvm::step_relative() > 0) && + ((cvm::step_absolute() % target_nsteps) == 1)) { + cvm::real const lambda = + cvm::real(stage)/cvm::real(target_nstages); + update_centers(lambda); + stage++; + cvm::log("Moving restraint \"" + this->name + + "\" stage " + cvm::to_str(stage) + + " : setting centers to " + cvm::to_str(colvar_centers) + + " at step " + cvm::to_str(cvm::step_absolute())); + } else { + for (size_t i = 0; i < num_variables(); i++) { + centers_incr[i].reset(); + } } - stage++; - cvm::log("Moving restraint \"" + this->name + - "\" stage " + cvm::to_str(stage) + - " : setting centers to " + cvm::to_str(colvar_centers) + - " at step " + cvm::to_str(cvm::step_absolute())); } - } else if ((cvm::step_relative() > 0) && (cvm::step_absolute() <= target_nsteps)) { - // move the restraint centers in the direction of the targets - // (slow growth) + } else { + // Continuous update + if (cvm::step_absolute() <= target_nsteps) { + cvm::real const lambda = + cvm::real(cvm::step_absolute())/cvm::real(target_nsteps); + update_centers(lambda); + } else { + for (size_t i = 0; i < num_variables(); i++) { + centers_incr[i].reset(); + } + } + } + + if (cvm::step_relative() == 0) { for (size_t i = 0; i < num_variables(); i++) { - colvar_centers_raw[i] += centers_incr[i]; - colvar_centers[i] = colvar_centers_raw[i]; - variables(i)->wrap(colvar_centers[i]); - colvar_centers[i].apply_constraints(); + // finite differences are undefined when restarting + centers_incr[i].reset(); } } if (cvm::debug()) { - cvm::log("New centers for the restraint bias \""+ - this->name+"\": "+cvm::to_str(colvar_centers)+".\n"); + cvm::log("Center increment for the restraint bias \""+ + this->name+"\": "+cvm::to_str(centers_incr)+ + " at stage "+cvm::to_str(stage)+ ".\n"); } } - return COLVARS_OK; + return cvm::get_error(); } int colvarbias_restraint_centers_moving::update_acc_work() { - if (b_output_acc_work) { - if ((cvm::step_relative() > 0) || (cvm::step_absolute() == 0)) { - for (size_t i = 0; i < num_variables(); i++) { - // project forces on the calculated increments at this step - acc_work += colvar_forces[i] * centers_incr[i]; + if (b_chg_centers) { + if (is_enabled(f_cvb_output_acc_work)) { + if ((cvm::step_relative() > 0) && + (cvm::step_absolute() <= target_nsteps)) { + for (size_t i = 0; i < num_variables(); i++) { + // project forces on the calculated increments at this step + acc_work += colvar_forces[i] * centers_incr[i]; + } } } } @@ -383,22 +419,15 @@ std::string const colvarbias_restraint_centers_moving::get_state_params() const << colvar_centers[i]; } os << "\n"; - os << "centers_raw "; - for (i = 0; i < num_variables(); i++) { - os << " " - << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) - << colvar_centers_raw[i]; - } - os << "\n"; - if (b_output_acc_work) { + if (is_enabled(f_cvb_output_acc_work)) { os << "accumulatedWork " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << acc_work << "\n"; } } - return colvarbias_restraint_moving::get_state_params() + os.str(); + return os.str(); } @@ -410,9 +439,7 @@ int colvarbias_restraint_centers_moving::set_state_params(std::string const &con // cvm::log ("Reading the updated restraint centers from the restart.\n"); if (!get_keyval(conf, "centers", colvar_centers)) cvm::error("Error: restraint centers are missing from the restart.\n"); - if (!get_keyval(conf, "centers_raw", colvar_centers_raw)) - cvm::error("Error: \"raw\" restraint centers are missing from the restart.\n"); - if (b_output_acc_work) { + if (is_enabled(f_cvb_output_acc_work)) { if (!get_keyval(conf, "accumulatedWork", acc_work)) cvm::error("Error: accumulatedWork is missing from the restart.\n"); } @@ -432,7 +459,7 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj_label(std::ostrea } } - if (b_output_acc_work) { + if (b_chg_centers && is_enabled(f_cvb_output_acc_work)) { os << " W_" << cvm::wrap_string(this->name, cvm::en_width-2); } @@ -451,7 +478,7 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj(std::ostream &os) } } - if (b_output_acc_work) { + if (b_chg_centers && is_enabled(f_cvb_output_acc_work)) { os << " " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << acc_work; @@ -464,16 +491,18 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj(std::ostream &os) colvarbias_restraint_k_moving::colvarbias_restraint_k_moving(char const *key) : colvarbias(key), + colvarbias_ti(key), colvarbias_restraint(key), colvarbias_restraint_k(key), colvarbias_restraint_moving(key) { b_chg_force_k = false; target_equil_steps = 0; - target_force_k = 0.0; - starting_force_k = 0.0; + target_force_k = -1.0; + starting_force_k = -1.0; force_k_exp = 1.0; restraint_FE = 0.0; + force_k_incr = 0.0; } @@ -551,14 +580,13 @@ int colvarbias_restraint_k_moving::update() if (target_equil_steps == 0 || cvm::step_absolute() % target_nsteps >= target_equil_steps) { // Start averaging after equilibration period, if requested - // Square distance normalized by square colvar width - cvm::real dist_sq = 0.0; + // Derivative of energy with respect to force_k + cvm::real dU_dk = 0.0; for (size_t i = 0; i < num_variables(); i++) { - dist_sq += d_restraint_potential_dk(i); + dU_dk += d_restraint_potential_dk(i); } - - restraint_FE += 0.5 * force_k_exp * std::pow(lambda, force_k_exp - 1.0) - * (target_force_k - starting_force_k) * dist_sq; + restraint_FE += force_k_exp * std::pow(lambda, force_k_exp - 1.0) + * (target_force_k - starting_force_k) * dU_dk; } // Finish current stage... @@ -589,10 +617,13 @@ int colvarbias_restraint_k_moving::update() } else if (cvm::step_absolute() <= target_nsteps) { + // update force constant (slow growth) lambda = cvm::real(cvm::step_absolute()) / cvm::real(target_nsteps); + cvm::real const force_k_old = force_k; force_k = starting_force_k + (target_force_k - starting_force_k) * std::pow(lambda, force_k_exp); + force_k_incr = force_k - force_k_old; } } @@ -600,6 +631,23 @@ int colvarbias_restraint_k_moving::update() } +int colvarbias_restraint_k_moving::update_acc_work() +{ + if (b_chg_force_k) { + if (is_enabled(f_cvb_output_acc_work)) { + if (cvm::step_relative() > 0) { + cvm::real dU_dk = 0.0; + for (size_t i = 0; i < num_variables(); i++) { + dU_dk += d_restraint_potential_dk(i); + } + acc_work += dU_dk * force_k_incr; + } + } + } + return COLVARS_OK; +} + + std::string const colvarbias_restraint_k_moving::get_state_params() const { std::ostringstream os; @@ -608,8 +656,14 @@ std::string const colvarbias_restraint_k_moving::get_state_params() const os << "forceConstant " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << force_k << "\n"; + + if (is_enabled(f_cvb_output_acc_work)) { + os << "accumulatedWork " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << acc_work << "\n"; + } } - return colvarbias_restraint_moving::get_state_params() + os.str(); + return os.str(); } @@ -621,6 +675,10 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf) // cvm::log ("Reading the updated force constant from the restart.\n"); if (!get_keyval(conf, "forceConstant", force_k, force_k)) cvm::error("Error: force constant is missing from the restart.\n"); + if (is_enabled(f_cvb_output_acc_work)) { + if (!get_keyval(conf, "accumulatedWork", acc_work)) + cvm::error("Error: accumulatedWork is missing from the restart.\n"); + } } return COLVARS_OK; @@ -629,12 +687,21 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf) std::ostream & colvarbias_restraint_k_moving::write_traj_label(std::ostream &os) { + if (b_chg_force_k && is_enabled(f_cvb_output_acc_work)) { + os << " W_" + << cvm::wrap_string(this->name, cvm::en_width-2); + } return os; } std::ostream & colvarbias_restraint_k_moving::write_traj(std::ostream &os) { + if (b_chg_force_k && is_enabled(f_cvb_output_acc_work)) { + os << " " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << acc_work; + } return os; } @@ -701,6 +768,7 @@ std::ostream & colvarbias_restraint::write_state(std::ostream &os) colvarbias_restraint_harmonic::colvarbias_restraint_harmonic(char const *key) : colvarbias(key), + colvarbias_ti(key), colvarbias_restraint(key), colvarbias_restraint_centers(key), colvarbias_restraint_moving(key), @@ -732,17 +800,23 @@ int colvarbias_restraint_harmonic::init(std::string const &conf) int colvarbias_restraint_harmonic::update() { + int error_code = COLVARS_OK; + + // update the TI estimator (if defined) + error_code |= colvarbias_ti::update(); + // update parameters (centers or force constant) - colvarbias_restraint_centers_moving::update(); - colvarbias_restraint_k_moving::update(); + error_code |= colvarbias_restraint_centers_moving::update(); + error_code |= colvarbias_restraint_k_moving::update(); // update restraint energy and forces - colvarbias_restraint::update(); + error_code |= colvarbias_restraint::update(); // update accumulated work using the current forces - colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); - return COLVARS_OK; + return error_code; } @@ -770,6 +844,7 @@ cvm::real colvarbias_restraint_harmonic::d_restraint_potential_dk(size_t i) cons std::string const colvarbias_restraint_harmonic::get_state_params() const { return colvarbias_restraint::get_state_params() + + colvarbias_restraint_moving::get_state_params() + colvarbias_restraint_centers_moving::get_state_params() + colvarbias_restraint_k_moving::get_state_params(); } @@ -779,12 +854,25 @@ int colvarbias_restraint_harmonic::set_state_params(std::string const &conf) { int error_code = COLVARS_OK; error_code |= colvarbias_restraint::set_state_params(conf); + error_code |= colvarbias_restraint_moving::set_state_params(conf); error_code |= colvarbias_restraint_centers_moving::set_state_params(conf); error_code |= colvarbias_restraint_k_moving::set_state_params(conf); return error_code; } +std::ostream & colvarbias_restraint_harmonic::write_state_data(std::ostream &os) +{ + return colvarbias_ti::write_state_data(os); +} + + +std::istream & colvarbias_restraint_harmonic::read_state_data(std::istream &is) +{ + return colvarbias_ti::read_state_data(is); +} + + std::ostream & colvarbias_restraint_harmonic::write_traj_label(std::ostream &os) { colvarbias_restraint::write_traj_label(os); @@ -832,13 +920,14 @@ cvm::real colvarbias_restraint_harmonic::energy_difference(std::string const &co colvarbias_restraint_harmonic_walls::colvarbias_restraint_harmonic_walls(char const *key) : colvarbias(key), + colvarbias_ti(key), colvarbias_restraint(key), colvarbias_restraint_k(key), colvarbias_restraint_moving(key), colvarbias_restraint_k_moving(key) { - lower_wall_k = 0.0; - upper_wall_k = 0.0; + lower_wall_k = -1.0; + upper_wall_k = -1.0; } @@ -848,26 +937,6 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) colvarbias_restraint_moving::init(conf); colvarbias_restraint_k_moving::init(conf); - get_keyval(conf, "lowerWallConstant", lower_wall_k, - (lower_wall_k > 0.0) ? lower_wall_k : force_k); - get_keyval(conf, "upperWallConstant", upper_wall_k, - (upper_wall_k > 0.0) ? upper_wall_k : force_k); - - if (lower_wall_k * upper_wall_k > 0.0) { - for (size_t i = 0; i < num_variables(); i++) { - if (variables(i)->width != 1.0) - cvm::log("The lower and upper wall force constants for colvar \""+ - variables(i)->name+ - "\" will be rescaled to "+ - cvm::to_str(lower_wall_k / - (variables(i)->width * variables(i)->width))+ - " and "+ - cvm::to_str(upper_wall_k / - (variables(i)->width * variables(i)->width))+ - " according to the specified width.\n"); - } - } - enable(f_cvb_scalar_variables); size_t i; @@ -903,16 +972,23 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) } if ((lower_walls.size() == 0) && (upper_walls.size() == 0)) { - cvm::error("Error: no walls provided.\n", INPUT_ERROR); - return INPUT_ERROR; + return cvm::error("Error: no walls provided.\n", INPUT_ERROR); + } + + if (lower_walls.size() > 0) { + get_keyval(conf, "lowerWallConstant", lower_wall_k, + (lower_wall_k > 0.0) ? lower_wall_k : force_k); + } + if (upper_walls.size() > 0) { + get_keyval(conf, "upperWallConstant", upper_wall_k, + (upper_wall_k > 0.0) ? upper_wall_k : force_k); } if ((lower_walls.size() == 0) || (upper_walls.size() == 0)) { for (i = 0; i < num_variables(); i++) { if (variables(i)->is_enabled(f_cv_periodic)) { - cvm::error("Error: at least one variable is periodic, " - "both walls must be provided.\n", INPUT_ERROR); - return INPUT_ERROR; + return cvm::error("Error: at least one variable is periodic, " + "both walls must be provided.\n", INPUT_ERROR); } } } @@ -933,19 +1009,49 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) INPUT_ERROR); return INPUT_ERROR; } - force_k = lower_wall_k * upper_wall_k; - // transform the two constants to relative values + force_k = std::sqrt(lower_wall_k * upper_wall_k); + // transform the two constants to relative values using gemetric mean as ref + // to preserve force_k if provided as single parameter // (allow changing both via force_k) lower_wall_k /= force_k; upper_wall_k /= force_k; + } else { + // If only one wall is defined, need to rescale as well + if (lower_walls.size() > 0) { + force_k = lower_wall_k; + lower_wall_k = 1.0; + } + if (upper_walls.size() > 0) { + force_k = upper_wall_k; + upper_wall_k = 1.0; + } } - for (i = 0; i < num_variables(); i++) { - if (variables(i)->width != 1.0) - cvm::log("The force constant for colvar \""+variables(i)->name+ - "\" will be rescaled to "+ - cvm::to_str(force_k / (variables(i)->width * variables(i)->width))+ - " according to the specified width.\n"); + // Initialize starting value of the force constant (in case it's changing) + starting_force_k = force_k; + + if (lower_walls.size() > 0) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The lower wall force constant for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(lower_wall_k * force_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } + } + + if (upper_walls.size() > 0) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The upper wall force constant for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(upper_wall_k * force_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } } return COLVARS_OK; @@ -954,11 +1060,17 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) int colvarbias_restraint_harmonic_walls::update() { - colvarbias_restraint_k_moving::update(); + int error_code = COLVARS_OK; - colvarbias_restraint::update(); + error_code |= colvarbias_ti::update(); - return COLVARS_OK; + error_code |= colvarbias_restraint_k_moving::update(); + + error_code |= colvarbias_restraint::update(); + + error_code |= colvarbias_restraint_k_moving::update_acc_work(); + + return error_code; } @@ -1037,6 +1149,7 @@ cvm::real colvarbias_restraint_harmonic_walls::d_restraint_potential_dk(size_t i std::string const colvarbias_restraint_harmonic_walls::get_state_params() const { return colvarbias_restraint::get_state_params() + + colvarbias_restraint_moving::get_state_params() + colvarbias_restraint_k_moving::get_state_params(); } @@ -1045,11 +1158,24 @@ int colvarbias_restraint_harmonic_walls::set_state_params(std::string const &con { int error_code = COLVARS_OK; error_code |= colvarbias_restraint::set_state_params(conf); + error_code |= colvarbias_restraint_moving::set_state_params(conf); error_code |= colvarbias_restraint_k_moving::set_state_params(conf); return error_code; } +std::ostream & colvarbias_restraint_harmonic_walls::write_state_data(std::ostream &os) +{ + return colvarbias_ti::write_state_data(os); +} + + +std::istream & colvarbias_restraint_harmonic_walls::read_state_data(std::istream &is) +{ + return colvarbias_ti::read_state_data(is); +} + + std::ostream & colvarbias_restraint_harmonic_walls::write_traj_label(std::ostream &os) { colvarbias_restraint::write_traj_label(os); @@ -1069,6 +1195,7 @@ std::ostream & colvarbias_restraint_harmonic_walls::write_traj(std::ostream &os) colvarbias_restraint_linear::colvarbias_restraint_linear(char const *key) : colvarbias(key), + colvarbias_ti(key), colvarbias_restraint(key), colvarbias_restraint_centers(key), colvarbias_restraint_moving(key), @@ -1076,6 +1203,7 @@ colvarbias_restraint_linear::colvarbias_restraint_linear(char const *key) colvarbias_restraint_centers_moving(key), colvarbias_restraint_k_moving(key) { + check_positive_k = false; } @@ -1105,17 +1233,23 @@ int colvarbias_restraint_linear::init(std::string const &conf) int colvarbias_restraint_linear::update() { + int error_code = COLVARS_OK; + + // update the TI estimator (if defined) + error_code |= colvarbias_ti::update(); + // update parameters (centers or force constant) - colvarbias_restraint_centers_moving::update(); - colvarbias_restraint_k_moving::update(); + error_code |= colvarbias_restraint_centers_moving::update(); + error_code |= colvarbias_restraint_k_moving::update(); // update restraint energy and forces - colvarbias_restraint::update(); + error_code |= colvarbias_restraint::update(); // update accumulated work using the current forces - colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); - return COLVARS_OK; + return error_code; } @@ -1164,6 +1298,7 @@ cvm::real colvarbias_restraint_linear::d_restraint_potential_dk(size_t i) const std::string const colvarbias_restraint_linear::get_state_params() const { return colvarbias_restraint::get_state_params() + + colvarbias_restraint_moving::get_state_params() + colvarbias_restraint_centers_moving::get_state_params() + colvarbias_restraint_k_moving::get_state_params(); } @@ -1173,12 +1308,25 @@ int colvarbias_restraint_linear::set_state_params(std::string const &conf) { int error_code = COLVARS_OK; error_code |= colvarbias_restraint::set_state_params(conf); + error_code |= colvarbias_restraint_moving::set_state_params(conf); error_code |= colvarbias_restraint_centers_moving::set_state_params(conf); error_code |= colvarbias_restraint_k_moving::set_state_params(conf); return error_code; } +std::ostream & colvarbias_restraint_linear::write_state_data(std::ostream &os) +{ + return colvarbias_ti::write_state_data(os); +} + + +std::istream & colvarbias_restraint_linear::read_state_data(std::istream &is) +{ + return colvarbias_ti::read_state_data(is); +} + + std::ostream & colvarbias_restraint_linear::write_traj_label(std::ostream &os) { colvarbias_restraint::write_traj_label(os); diff --git a/lib/colvars/colvarbias_restraint.h b/lib/colvars/colvarbias_restraint.h index 98b967abdb..3ee999c262 100644 --- a/lib/colvars/colvarbias_restraint.h +++ b/lib/colvars/colvarbias_restraint.h @@ -16,7 +16,8 @@ /// see derived classes for specific types /// (implementation of \link colvarbias \endlink) class colvarbias_restraint - : public virtual colvarbias + : public virtual colvarbias, + public virtual colvarbias_ti { public: @@ -74,9 +75,6 @@ protected: /// \brief Restraint centers std::vector colvar_centers; - - /// \brief Restraint centers outside the domain of the colvars (no wrapping or constraints applied) - std::vector colvar_centers_raw; }; @@ -91,14 +89,18 @@ public: virtual int change_configuration(std::string const &conf); protected: + /// \brief Restraint force constant cvm::real force_k; + + /// \brief Whether the force constant should be positive + bool check_positive_k; }; /// Options to change the restraint configuration over time (shared between centers and k moving) class colvarbias_restraint_moving - : public virtual colvarparse { + : public virtual colvarparse, public virtual colvardeps { public: colvarbias_restraint_moving(char const *key); @@ -131,6 +133,9 @@ protected: /// \brief Number of steps required to reach the target force constant /// or restraint centers long target_nsteps; + + /// \brief Accumulated work (computed when outputAccumulatedWork == true) + cvm::real acc_work; }; @@ -156,19 +161,18 @@ protected: /// \brief New restraint centers std::vector target_centers; - /// \brief Amplitude of the restraint centers' increment at each step - /// (or stage) towards the new values (calculated from target_nsteps) + /// \brief Initial value of the restraint centers + std::vector initial_centers; + + /// \brief Increment of the restraint centers at each step std::vector centers_incr; + /// \brief Update the centers by interpolating between initial and target + virtual int update_centers(cvm::real lambda); + /// Whether to write the current restraint centers to the trajectory file bool b_output_centers; - /// Whether to write the current accumulated work to the trajectory file - bool b_output_acc_work; - - /// \brief Accumulated work - cvm::real acc_work; - /// Update the accumulated work int update_acc_work(); }; @@ -208,6 +212,12 @@ protected: /// \brief Equilibration steps for restraint FE calculation through TI cvm::real target_equil_steps; + + /// \brief Increment of the force constant at each step + cvm::real force_k_incr; + + /// Update the accumulated work + int update_acc_work(); }; @@ -223,6 +233,8 @@ public: virtual int update(); virtual std::string const get_state_params() const; virtual int set_state_params(std::string const &conf); + virtual std::ostream & write_state_data(std::ostream &os); + virtual std::istream & read_state_data(std::istream &os); virtual std::ostream & write_traj_label(std::ostream &os); virtual std::ostream & write_traj(std::ostream &os); virtual int change_configuration(std::string const &conf); @@ -249,6 +261,8 @@ public: virtual void communicate_forces(); virtual std::string const get_state_params() const; virtual int set_state_params(std::string const &conf); + virtual std::ostream & write_state_data(std::ostream &os); + virtual std::istream & read_state_data(std::istream &os); virtual std::ostream & write_traj_label(std::ostream &os); virtual std::ostream & write_traj(std::ostream &os); @@ -289,6 +303,8 @@ public: virtual std::string const get_state_params() const; virtual int set_state_params(std::string const &conf); + virtual std::ostream & write_state_data(std::ostream &os); + virtual std::istream & read_state_data(std::istream &os); virtual std::ostream & write_traj_label(std::ostream &os); virtual std::ostream & write_traj(std::ostream &os); diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index 2c865a166b..52078a3a30 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -20,52 +20,48 @@ // simple_scalar_dist_functions (derived_class) -#include -#include - - #include "colvarmodule.h" #include "colvar.h" #include "colvaratoms.h" -/// \brief Colvar component (base class); most implementations of -/// \link cvc \endlink utilize one or more \link -/// colvarmodule::atom \endlink or \link colvarmodule::atom_group -/// \endlink objects to access atoms. +/// \brief Colvar component (base class for collective variables) /// /// A \link cvc \endlink object (or an object of a -/// cvc-derived class) specifies how to calculate a collective -/// variable, its gradients and other related physical quantities -/// which do not depend only on the numeric value (the \link colvar -/// \endlink class already serves this purpose). +/// cvc-derived class) implements the calculation of a collective +/// variable, its gradients and any other related physical quantities +/// that depend on microscopic degrees of freedom. /// -/// No restriction is set to what kind of calculation a \link -/// cvc \endlink object performs (usually calculate an -/// analytical function of atomic coordinates). The only constraint -/// is that the value calculated is implemented as a \link colvarvalue -/// \endlink object. This serves to provide a unique way to calculate -/// scalar and non-scalar collective variables, and specify if and how -/// they can be combined together by the parent \link colvar \endlink -/// object. +/// No restriction is set to what kind of calculation a \link cvc \endlink +/// object performs (usually an analytical function of atomic coordinates). +/// The only constraints are that: \par +/// +/// - The value is calculated by the \link calc_value() \endlink +/// method, and is an object of \link colvarvalue \endlink class. This +/// provides a transparent way to treat scalar and non-scalar variables +/// alike, and allows an automatic selection of the applicable algorithms. +/// +/// - The object provides an implementation \link apply_force() \endlink to +/// apply forces to atoms. Typically, one or more \link cvm::atom_group +/// \endlink objects are used, but this is not a requirement for as long as +/// the \link cvc \endlink object communicates with the simulation program. /// /// If you wish to implement a new collective variable component, you /// should write your own class by inheriting directly from \link -/// cvc \endlink, or one of its derived classes (for instance, -/// \link distance \endlink is frequently used, because it provides +/// colvar::cvc \endlink, or one of its derived classes (for instance, +/// \link colvar::distance \endlink is frequently used, because it provides /// useful data and function members for any colvar based on two -/// atom groups). The steps are: \par -/// 1. add the name of this class under colvar.h \par -/// 2. add a call to the parser in colvar.C, within the function colvar::colvar() \par -/// 3. declare the class in colvarcomp.h \par -/// 4. implement the class in one of the files colvarcomp_*.C +/// atom groups). +/// +/// The steps are: \par +/// 1. Declare the new class as a derivative of \link colvar::cvc \endlink +/// in the file \link colvarcomp.h \endlink +/// 2. Implement the new class in a file named colvarcomp_.cpp +/// 3. Declare the name of the new class inside the \link colvar \endlink class +/// in \link colvar.h \endlink (see "list of available components") +/// 4. Add a call for the new class in colvar::init_components() +//// (file: colvar.cpp) /// -/// -/// The cvm::atom and cvm::atom_group classes are available to -/// transparently communicate with the simulation program. However, -/// they are not strictly needed, as long as all the degrees of -/// freedom associated to the cvc are properly evolved by a simple -/// call to e.g. apply_force(). class colvar::cvc : public colvarparse, public colvardeps @@ -132,9 +128,20 @@ public: static std::vector cvc_features; /// \brief Implementation of the feature list accessor for colvar - virtual std::vector &features() { + virtual const std::vector &features() + { return cvc_features; } + virtual std::vector &modify_features() + { + return cvc_features; + } + static void delete_features() { + for (size_t i=0; i < cvc_features.size(); i++) { + delete cvc_features[i]; + } + cvc_features.clear(); + } /// \brief Obtain data needed for the calculation for the backend virtual void read_data(); @@ -144,7 +151,7 @@ public: /// \brief Calculate the atomic gradients, to be reused later in /// order to apply forces - virtual void calc_gradients() = 0; + virtual void calc_gradients() {} /// \brief Calculate the atomic fit gradients void calc_fit_gradients(); diff --git a/lib/colvars/colvarcomp_coordnums.cpp b/lib/colvars/colvarcomp_coordnums.cpp index 369d489e27..c34dc77215 100644 --- a/lib/colvars/colvarcomp_coordnums.cpp +++ b/lib/colvars/colvarcomp_coordnums.cpp @@ -18,6 +18,7 @@ + template cvm::real colvar::coordnum::switching_function(cvm::real const &r0, int const &en, @@ -32,8 +33,8 @@ cvm::real colvar::coordnum::switching_function(cvm::real const &r0, int const en2 = en/2; int const ed2 = ed/2; - cvm::real const xn = std::pow(l2, en2); - cvm::real const xd = std::pow(l2, ed2); + cvm::real const xn = cvm::integer_power(l2, en2); + cvm::real const xd = cvm::integer_power(l2, ed2); cvm::real const func = (1.0-xn)/(1.0-xd); if (calculate_gradients) { @@ -62,8 +63,8 @@ cvm::real colvar::coordnum::switching_function(cvm::rvector const &r0_vec, int const en2 = en/2; int const ed2 = ed/2; - cvm::real const xn = std::pow(l2, en2); - cvm::real const xd = std::pow(l2, ed2); + cvm::real const xn = cvm::integer_power(l2, en2); + cvm::real const xd = cvm::integer_power(l2, ed2); cvm::real const func = (1.0-xn)/(1.0-xd); if (calculate_gradients) { @@ -87,6 +88,12 @@ colvar::coordnum::coordnum(std::string const &conf) group1 = parse_group(conf, "group1"); group2 = parse_group(conf, "group2"); + if (int atom_number = cvm::atom_group::overlap(*group1, *group2)) { + cvm::error("Error: group1 and group2 share a common atom (number: " + + cvm::to_str(atom_number) + ")\n"); + return; + } + if (group1->b_dummy) { cvm::error("Error: only group2 is allowed to be a dummy atom\n"); return; @@ -111,11 +118,17 @@ colvar::coordnum::coordnum(std::string const &conf) if (r0_vec.z < 0.0) r0_vec.z *= -1.0; } - get_keyval(conf, "expNumer", en, int(6) ); - get_keyval(conf, "expDenom", ed, int(12)); + get_keyval(conf, "expNumer", en, 6); + get_keyval(conf, "expDenom", ed, 12); if ( (en%2) || (ed%2) ) { - cvm::error("Error: odd exponents provided, can only use even ones.\n", INPUT_ERROR); + cvm::error("Error: odd exponent(s) provided, can only use even ones.\n", + INPUT_ERROR); + } + + if ( (en <= 0) || (ed <= 0) ) { + cvm::error("Error: negative exponent(s) provided.\n", + INPUT_ERROR); } if (!is_enabled(f_cvc_pbc_minimum_image)) { @@ -250,8 +263,13 @@ colvar::h_bond::h_bond(std::string const &conf) get_keyval(conf, "expDenom", ed, 8); if ( (en%2) || (ed%2) ) { - cvm::error("Error: odd exponents provided, can only use even ones.\n"); - return; + cvm::error("Error: odd exponent(s) provided, can only use even ones.\n", + INPUT_ERROR); + } + + if ( (en <= 0) || (ed <= 0) ) { + cvm::error("Error: negative exponent(s) provided.\n", + INPUT_ERROR); } if (cvm::debug()) @@ -318,12 +336,18 @@ colvar::selfcoordnum::selfcoordnum(std::string const &conf) group1 = parse_group(conf, "group1"); get_keyval(conf, "cutoff", r0, cvm::real(4.0 * cvm::unit_angstrom())); - get_keyval(conf, "expNumer", en, int(6) ); - get_keyval(conf, "expDenom", ed, int(12)); + get_keyval(conf, "expNumer", en, 6); + get_keyval(conf, "expDenom", ed, 12); + if ( (en%2) || (ed%2) ) { - cvm::error("Error: odd exponents provided, can only use even ones.\n"); - return; + cvm::error("Error: odd exponent(s) provided, can only use even ones.\n", + INPUT_ERROR); + } + + if ( (en <= 0) || (ed <= 0) ) { + cvm::error("Error: negative exponent(s) provided.\n", + INPUT_ERROR); } if (!is_enabled(f_cvc_pbc_minimum_image)) { @@ -401,12 +425,17 @@ colvar::groupcoordnum::groupcoordnum(std::string const &conf) if (r0_vec.z < 0.0) r0_vec.z *= -1.0; } - get_keyval(conf, "expNumer", en, int(6) ); - get_keyval(conf, "expDenom", ed, int(12)); + get_keyval(conf, "expNumer", en, 6); + get_keyval(conf, "expDenom", ed, 12); if ( (en%2) || (ed%2) ) { - cvm::error("Error: odd exponents provided, can only use even ones.\n"); - return; + cvm::error("Error: odd exponent(s) provided, can only use even ones.\n", + INPUT_ERROR); + } + + if ( (en <= 0) || (ed <= 0) ) { + cvm::error("Error: negative exponent(s) provided.\n", + INPUT_ERROR); } if (!is_enabled(f_cvc_pbc_minimum_image)) { @@ -438,8 +467,8 @@ cvm::real colvar::groupcoordnum::switching_function(cvm::real const &r0, int const en2 = en/2; int const ed2 = ed/2; - cvm::real const xn = std::pow(l2, en2); - cvm::real const xd = std::pow(l2, ed2); + cvm::real const xn = cvm::integer_power(l2, en2); + cvm::real const xd = cvm::integer_power(l2, ed2); cvm::real const func = (1.0-xn)/(1.0-xd); if (calculate_gradients) { @@ -471,8 +500,8 @@ cvm::real colvar::groupcoordnum::switching_function(cvm::rvector const &r0_vec, int const en2 = en/2; int const ed2 = ed/2; - cvm::real const xn = std::pow(l2, en2); - cvm::real const xd = std::pow(l2, ed2); + cvm::real const xn = cvm::integer_power(l2, en2); + cvm::real const xd = cvm::integer_power(l2, ed2); cvm::real const func = (1.0-xn)/(1.0-xd); if (calculate_gradients) { diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index 18d154515a..9911f4c87e 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -581,6 +581,12 @@ colvar::distance_inv::distance_inv(std::string const &conf) } } + if (is_enabled(f_cvc_debug_gradient)) { + cvm::log("Warning: debugGradients will not give correct results " + "for distanceInv, because its value and gradients are computed " + "simultaneously.\n"); + } + x.type(colvarvalue::type_scalar); } @@ -601,11 +607,9 @@ void colvar::distance_inv::calc_value() for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = ai2->pos - ai1->pos; cvm::real const d2 = dv.norm2(); - cvm::real dinv = 1.0; - for (int ne = 0; ne < exponent/2; ne++) - dinv *= 1.0/d2; + cvm::real const dinv = cvm::integer_power(d2, -1*(exponent/2)); x.real_value += dinv; - cvm::rvector const dsumddv = -(cvm::real(exponent)) * dinv/d2 * dv; + cvm::rvector const dsumddv = -1.0*(exponent/2) * dinv/d2 * 2.0 * dv; ai1->grad += -1.0 * dsumddv; ai2->grad += dsumddv; } @@ -615,11 +619,9 @@ void colvar::distance_inv::calc_value() for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = cvm::position_distance(ai1->pos, ai2->pos); cvm::real const d2 = dv.norm2(); - cvm::real dinv = 1.0; - for (int ne = 0; ne < exponent/2; ne++) - dinv *= 1.0/d2; + cvm::real const dinv = cvm::integer_power(d2, -1*(exponent/2)); x.real_value += dinv; - cvm::rvector const dsumddv = -(cvm::real(exponent)) * dinv/d2 * dv; + cvm::rvector const dsumddv = -1.0*(exponent/2) * dinv/d2 * 2.0 * dv; ai1->grad += -1.0 * dsumddv; ai2->grad += dsumddv; } @@ -627,13 +629,11 @@ void colvar::distance_inv::calc_value() } x.real_value *= 1.0 / cvm::real(group1->size() * group2->size()); - x.real_value = std::pow(x.real_value, -1.0/(cvm::real(exponent))); -} + x.real_value = std::pow(x.real_value, -1.0/cvm::real(exponent)); - -void colvar::distance_inv::calc_gradients() -{ - cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) * std::pow(x.real_value, exponent+1) / cvm::real(group1->size() * group2->size()); + cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) * + cvm::integer_power(x.real_value, exponent+1) / + cvm::real(group1->size() * group2->size()); for (cvm::atom_iter ai1 = group1->begin(); ai1 != group1->end(); ai1++) { ai1->grad *= dxdsum; } @@ -643,6 +643,11 @@ void colvar::distance_inv::calc_gradients() } +void colvar::distance_inv::calc_gradients() +{ +} + + void colvar::distance_inv::apply_force(colvarvalue const &force) { if (!group1->noforce) @@ -1066,8 +1071,9 @@ void colvar::rmsd::calc_force_invgrads() void colvar::rmsd::calc_Jacobian_derivative() { // divergence of the rotated coordinates (including only derivatives of the rotation matrix) - cvm::real divergence = 0.0; + cvm::real rotation_term = 0.0; + // The rotation term only applies is coordinates are rotated if (atoms->b_rotate) { // gradient of the rotation matrix @@ -1104,7 +1110,7 @@ void colvar::rmsd::calc_Jacobian_derivative() for (size_t alpha = 0; alpha < 3; alpha++) { for (size_t beta = 0; beta < 3; beta++) { - divergence += grad_rot_mat[beta][alpha][alpha] * y[beta]; + rotation_term += grad_rot_mat[beta][alpha][alpha] * y[beta]; // Note: equation was derived for inverse rotation (see colvars paper) // so here the matrix is transposed // (eq would give divergence += grad_rot_mat[alpha][beta][alpha] * y[beta];) @@ -1112,7 +1118,13 @@ void colvar::rmsd::calc_Jacobian_derivative() } } } - jd.real_value = x.real_value > 0.0 ? (3.0 * atoms->size() - 4.0 - divergence) / x.real_value : 0.0; + + // The translation term only applies is coordinates are centered + cvm::real translation_term = atoms->b_center ? 3.0 : 0.0; + + jd.real_value = x.real_value > 0.0 ? + (3.0 * atoms->size() - 1.0 - translation_term - rotation_term) / x.real_value : + 0.0; } diff --git a/lib/colvars/colvarcomp_protein.cpp b/lib/colvars/colvarcomp_protein.cpp index b8fc96cfad..91e47f13d9 100644 --- a/lib/colvars/colvarcomp_protein.cpp +++ b/lib/colvars/colvarcomp_protein.cpp @@ -150,8 +150,8 @@ void colvar::alpha_angles::calc_value() (theta[i])->calc_value(); cvm::real const t = ((theta[i])->value().real_value-theta_ref)/theta_tol; - cvm::real const f = ( (1.0 - std::pow(t, (int) 2)) / - (1.0 - std::pow(t, (int) 4)) ); + cvm::real const f = ( (1.0 - (t*t)) / + (1.0 - (t*t*t*t)) ); x.real_value += theta_norm * f; @@ -202,12 +202,12 @@ void colvar::alpha_angles::apply_force(colvarvalue const &force) for (size_t i = 0; i < theta.size(); i++) { cvm::real const t = ((theta[i])->value().real_value-theta_ref)/theta_tol; - cvm::real const f = ( (1.0 - std::pow(t, (int) 2)) / - (1.0 - std::pow(t, (int) 4)) ); + cvm::real const f = ( (1.0 - (t*t)) / + (1.0 - (t*t*t*t)) ); cvm::real const dfdt = - 1.0/(1.0 - std::pow(t, (int) 4)) * - ( (-2.0 * t) + (-1.0*f)*(-4.0 * std::pow(t, (int) 3)) ); + 1.0/(1.0 - (t*t*t*t)) * + ( (-2.0 * t) + (-1.0*f)*(-4.0 * (t*t*t)) ); (theta[i])->apply_force(theta_norm * dfdt * (1.0/theta_tol) * diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 5402836f53..a058ad55c2 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -8,10 +8,16 @@ // Colvars repository at GitHub. +#include "colvarmodule.h" +#include "colvarproxy.h" #include "colvardeps.h" + colvardeps::colvardeps() - : time_step_factor (1) {} +{ + time_step_factor = 1; +} + colvardeps::~colvardeps() { size_t i; @@ -374,8 +380,8 @@ int colvardeps::decr_ref_count(int feature_id) { } void colvardeps::init_feature(int feature_id, const char *description, feature_type type) { - features()[feature_id]->description = description; - features()[feature_id]->type = type; + modify_features()[feature_id]->description = description; + modify_features()[feature_id]->type = type; } // Shorthand macros for describing dependencies @@ -401,7 +407,7 @@ void colvardeps::init_cvb_requires() { int i; if (features().size() == 0) { for (i = 0; i < f_cvb_ntot; i++) { - features().push_back(new feature); + modify_features().push_back(new feature); } init_feature(f_cvb_active, "active", f_type_dynamic); @@ -413,15 +419,30 @@ void colvardeps::init_cvb_requires() { init_feature(f_cvb_apply_force, "apply force", f_type_user); f_req_children(f_cvb_apply_force, f_cv_gradient); - init_feature(f_cvb_get_total_force, "obtain total force"); + init_feature(f_cvb_get_total_force, "obtain total force", f_type_dynamic); f_req_children(f_cvb_get_total_force, f_cv_total_force); + init_feature(f_cvb_output_acc_work, "output accumulated work", f_type_user); + f_req_self(f_cvb_output_acc_work, f_cvb_apply_force); + init_feature(f_cvb_history_dependent, "history-dependent", f_type_static); + init_feature(f_cvb_time_dependent, "time-dependent", f_type_static); + init_feature(f_cvb_scalar_variables, "require scalar variables", f_type_static); f_req_children(f_cvb_scalar_variables, f_cv_scalar); init_feature(f_cvb_calc_pmf, "calculate a PMF", f_type_static); + + init_feature(f_cvb_calc_ti_samples, "calculate TI samples", f_type_dynamic); + f_req_self(f_cvb_calc_ti_samples, f_cvb_get_total_force); + f_req_children(f_cvb_calc_ti_samples, f_cv_grid); + + init_feature(f_cvb_write_ti_samples, "write TI samples ", f_type_user); + f_req_self(f_cvb_write_ti_samples, f_cvb_calc_ti_samples); + + init_feature(f_cvb_write_ti_pmf, "write TI PMF", f_type_user); + f_req_self(f_cvb_write_ti_pmf, f_cvb_calc_ti_samples); } // Initialize feature_states for each instance @@ -431,6 +452,9 @@ void colvardeps::init_cvb_requires() { // Most features are available, so we set them so // and list exceptions below } + + // only compute TI samples when deriving from colvarbias_ti + feature_states[f_cvb_calc_ti_samples].available = false; } @@ -438,7 +462,7 @@ void colvardeps::init_cv_requires() { size_t i; if (features().size() == 0) { for (i = 0; i < f_cv_ntot; i++) { - features().push_back(new feature); + modify_features().push_back(new feature); } init_feature(f_cv_active, "active", f_type_dynamic); @@ -504,9 +528,6 @@ void colvardeps::init_cv_requires() { init_feature(f_cv_subtract_applied_force, "subtract applied force from total force", f_type_user); f_req_self(f_cv_subtract_applied_force, f_cv_total_force); - // There is no well-defined way to implement f_cv_subtract_applied_force - // in the case of extended-Lagrangian colvars - f_req_exclude(f_cv_subtract_applied_force, f_cv_extended_Lagrangian); init_feature(f_cv_lower_boundary, "lower boundary", f_type_user); f_req_self(f_cv_lower_boundary, f_cv_scalar); @@ -514,7 +535,7 @@ void colvardeps::init_cv_requires() { init_feature(f_cv_upper_boundary, "upper boundary", f_type_user); f_req_self(f_cv_upper_boundary, f_cv_scalar); - init_feature(f_cv_grid, "grid", f_type_user); + init_feature(f_cv_grid, "grid", f_type_dynamic); f_req_self(f_cv_grid, f_cv_lower_boundary); f_req_self(f_cv_grid, f_cv_upper_boundary); @@ -554,7 +575,7 @@ void colvardeps::init_cvc_requires() { // Initialize static array once and for all if (features().size() == 0) { for (i = 0; i < colvardeps::f_cvc_ntot; i++) { - features().push_back(new feature); + modify_features().push_back(new feature); } init_feature(f_cvc_active, "active", f_type_dynamic); @@ -633,7 +654,7 @@ void colvardeps::init_ag_requires() { // Initialize static array once and for all if (features().size() == 0) { for (i = 0; i < f_ag_ntot; i++) { - features().push_back(new feature); + modify_features().push_back(new feature); } init_feature(f_ag_active, "active", f_type_dynamic); @@ -693,7 +714,6 @@ void colvardeps::print_state() { } - void colvardeps::add_child(colvardeps *child) { children.push_back(child); diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index b810a5fca1..940eefb01b 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -135,7 +135,8 @@ public: // with a non-static array // Intermediate classes (colvarbias and colvarcomp, which are also base classes) // implement this as virtual to allow overriding - virtual std::vector&features() = 0; + virtual const std::vector&features() = 0; + virtual std::vector&modify_features() = 0; void add_child(colvardeps *child); @@ -179,8 +180,6 @@ public: protected: - - /// Parse a keyword and enable a feature accordingly bool get_keyval_feature(colvarparse *cvp, std::string const &conf, char const *key, @@ -226,12 +225,22 @@ public: f_cvb_apply_force, /// \brief requires total forces f_cvb_get_total_force, + /// \brief whether this bias should record the accumulated work + f_cvb_output_acc_work, /// \brief depends on simulation history f_cvb_history_dependent, + /// \brief depends on time + f_cvb_time_dependent, /// \brief requires scalar colvars f_cvb_scalar_variables, /// \brief whether this bias will compute a PMF f_cvb_calc_pmf, + /// \brief whether this bias will compute TI samples + f_cvb_calc_ti_samples, + /// \brief whether this bias will write TI samples + f_cvb_write_ti_samples, + /// \brief whether this bias should write the TI PMF + f_cvb_write_ti_pmf, f_cvb_ntot }; diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 9016e2c23a..1ac4aae133 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -14,6 +14,7 @@ #include "colvarcomp.h" #include "colvargrid.h" +#include colvar_grid_count::colvar_grid_count() : colvar_grid() @@ -22,43 +23,37 @@ colvar_grid_count::colvar_grid_count() } colvar_grid_count::colvar_grid_count(std::vector const &nx_i, - size_t const &def_count) + size_t const &def_count) : colvar_grid(nx_i, def_count, 1) {} colvar_grid_count::colvar_grid_count(std::vector &colvars, - size_t const &def_count) - : colvar_grid(colvars, def_count, 1) + size_t const &def_count, + bool margin) + : colvar_grid(colvars, def_count, 1, margin) {} colvar_grid_scalar::colvar_grid_scalar() - : colvar_grid(), samples(NULL), grad(NULL) + : colvar_grid(), samples(NULL) {} colvar_grid_scalar::colvar_grid_scalar(colvar_grid_scalar const &g) - : colvar_grid(g), samples(NULL), grad(NULL) + : colvar_grid(g), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, 1), samples(NULL), grad(NULL) + : colvar_grid(nx_i, 0.0, 1), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, bool margin) - : colvar_grid(colvars, 0.0, 1, margin), samples(NULL), grad(NULL) + : colvar_grid(colvars, 0.0, 1, margin), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::~colvar_grid_scalar() { - if (grad) { - delete [] grad; - grad = NULL; - } } cvm::real colvar_grid_scalar::maximum_value() const @@ -143,18 +138,18 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) os << "# xi A(xi)\n"; - if ( cv.size() != 1 ) { + if (cv.size() != 1) { cvm::error("Cannot write integral for multi-dimensional gradient grids."); return; } integral = 0.0; - int_vals.push_back( 0.0 ); + int_vals.push_back(0.0); min = 0.0; // correction for periodic colvars, so that the PMF is periodic cvm::real corr; - if ( periodic[0] ) { + if (periodic[0]) { corr = average(); } else { corr = 0.0; @@ -171,7 +166,7 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) } if ( integral < min ) min = integral; - int_vals.push_back( integral ); + int_vals.push_back(integral); } bin = 0.0; @@ -192,3 +187,670 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) +integrate_potential::integrate_potential(std::vector &colvars, colvar_grid_gradient * gradients) + : colvar_grid_scalar(colvars, true), + gradients(gradients) +{ + // parent class colvar_grid_scalar is constructed with margin option set to true + // hence PMF grid is wider than gradient grid if non-PBC + + if (nd > 1) { + divergence.resize(nt); + + // Compute inverse of Laplacian diagonal for Jacobi preconditioning + // For now all code related to preconditioning is commented out + // until a method better than Jacobi is implemented +// cvm::log("Preparing inverse diagonal for preconditioning..."); +// inv_lap_diag.resize(nt); +// std::vector id(nt), lap_col(nt); +// for (int i = 0; i < nt; i++) { +// if (i % (nt / 100) == 0) +// cvm::log(cvm::to_str(i)); +// id[i] = 1.; +// atimes(id, lap_col); +// id[i] = 0.; +// inv_lap_diag[i] = 1. / lap_col[i]; +// } +// cvm::log("Done."); + } +} + + +int integrate_potential::integrate(const int itmax, const cvm::real &tol, cvm::real & err) +{ + int iter = 0; + + if (nd == 1) { + + cvm::real sum = 0.0; + cvm::real corr; + if ( periodic[0] ) { + corr = gradients->average(); // Enforce PBC by subtracting average gradient + } else { + corr = 0.0; + } + + std::vector ix; + // Iterate over valid indices in gradient grid + for (ix = new_index(); gradients->index_ok(ix); incr(ix)) { + set_value(ix, sum); + sum += (gradients->value_output(ix) - corr) * widths[0]; + } + if (index_ok(ix)) { + // This will happen if non-periodic: then PMF grid has one extra bin wrt gradient grid + set_value(ix, sum); + } + + } else if (nd <= 3) { + + nr_linbcg_sym(divergence, data, tol, itmax, iter, err); + cvm::log("Integrated in " + cvm::to_str(iter) + " steps, error: " + cvm::to_str(err)); + + } else { + cvm::error("Cannot integrate PMF in dimension > 3\n"); + } + + return iter; +} + + +void integrate_potential::set_div() +{ + if (nd == 1) return; + for (std::vector ix = new_index(); index_ok(ix); incr(ix)) { + update_div_local(ix); + } +} + + +void integrate_potential::update_div_neighbors(const std::vector &ix0) +{ + std::vector ix(ix0); + int i, j, k; + + // If not periodic, expanded grid ensures that neighbors of ix0 are valid grid points + if (nd == 1) { + return; + + } else if (nd == 2) { + + update_div_local(ix); + ix[0]++; wrap(ix); + update_div_local(ix); + ix[1]++; wrap(ix); + update_div_local(ix); + ix[0]--; wrap(ix); + update_div_local(ix); + + } else if (nd == 3) { + + for (i = 0; i<2; i++) { + ix[1] = ix0[1]; + for (j = 0; j<2; j++) { + ix[2] = ix0[2]; + for (k = 0; k<2; k++) { + wrap(ix); + update_div_local(ix); + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + } +} + +void integrate_potential::get_grad(cvm::real * g, std::vector &ix) +{ + size_t count, i; + bool edge = gradients->wrap_edge(ix); // Detect edge if non-PBC + + if (gradients->samples) { + count = gradients->samples->value(ix); + } else { + count = 1; + } + + if (!edge && count) { + cvm::real const *grad = &(gradients->value(ix)); + cvm::real const fact = 1.0 / count; + for ( i = 0; i &ix0) +{ + const int linear_index = address(ix0); + int i, j, k; + std::vector ix = ix0; + const cvm::real * g; + + if (nd == 2) { + // gradients at grid points surrounding the current scalar grid point + cvm::real g00[2], g01[2], g10[2], g11[2]; + + get_grad(g11, ix); + ix[0] = ix0[0] - 1; + get_grad(g01, ix); + ix[1] = ix0[1] - 1; + get_grad(g00, ix); + ix[0] = ix0[0]; + get_grad(g10, ix); + + divergence[linear_index] = ((g10[0]-g00[0] + g11[0]-g01[0]) / widths[0] + + (g01[1]-g00[1] + g11[1]-g10[1]) / widths[1]) * 0.5; + } else if (nd == 3) { + cvm::real gc[24]; // stores 3d gradients in 8 contiguous bins + int index = 0; + + ix[0] = ix0[0] - 1; + for (i = 0; i<2; i++) { + ix[1] = ix0[1] - 1; + for (j = 0; j<2; j++) { + ix[2] = ix0[2] - 1; + for (k = 0; k<2; k++) { + get_grad(gc + index, ix); + index += 3; + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + + divergence[linear_index] = + ((gc[3*4]-gc[0] + gc[3*5]-gc[3*1] + gc[3*6]-gc[3*2] + gc[3*7]-gc[3*3]) + / widths[0] + + (gc[3*2+1]-gc[0+1] + gc[3*3+1]-gc[3*1+1] + gc[3*6+1]-gc[3*4+1] + gc[3*7+1]-gc[3*5+1]) + / widths[1] + + (gc[3*1+2]-gc[0+2] + gc[3*3+2]-gc[3*2+2] + gc[3*5+2]-gc[3*4+2] + gc[3*7+2]-gc[3*6+2]) + / widths[2]) * 0.25; + } +} + + +/// Multiplication by sparse matrix representing Laplacian +/// NOTE: Laplacian must be symmetric for solving with CG +void integrate_potential::atimes(const std::vector &A, std::vector &LA) +{ + if (nd == 2) { + // DIMENSION 2 + + size_t index, index2; + int i, j; + cvm::real fact; + const cvm::real ffx = 1.0 / (widths[0] * widths[0]); + const cvm::real ffy = 1.0 / (widths[1] * widths[1]); + const int h = nx[1]; + const int w = nx[0]; + // offsets for 4 reference points of the Laplacian stencil + int xm = -h; + int xp = h; + int ym = -1; + int yp = 1; + + // NOTE on performance: this version is slightly sub-optimal because + // it contains two double loops on the core of the array (for x and y terms) + // The slightly faster version is in commit 0254cb5a2958cb2e135f268371c4b45fad34866b + // yet it is much uglier, and probably horrible to extend to dimension 3 + // All terms in the matrix are assigned (=) during the x loops, then updated (+=) + // with the y (and z) contributions + + + // All x components except on x edges + index = h; // Skip first column + + // Halve the term on y edges (if any) to preserve symmetry of the Laplacian matrix + // (Long Chen, Finite Difference Methods, UCI, 2017) + fact = periodic[1] ? 1.0 : 0.5; + + for (i=1; i &b, std::vector &x) +{ + for (size_t i=0; i &b, std::vector &x, const cvm::real &tol, + const int itmax, int &iter, cvm::real &err) +{ + cvm::real ak,akden,bk,bkden,bknum,bnrm; + const cvm::real EPS=1.0e-14; + int j; + std::vector p(nt), r(nt), z(nt); + + iter=0; + atimes(x,r); + for (j=0;j &colvars, - size_t const &def_count = 0); + size_t const &def_count = 0, + bool margin = false); /// Increment the counter at given position inline void incr_count(std::vector const &ix) @@ -1210,12 +1236,13 @@ public: int A0, A1, A2; std::vector ix = ix0; + // TODO this can be rewritten more concisely with wrap_edge() if (periodic[n]) { ix[n]--; wrap(ix); - A0 = data[address(ix)]; + A0 = value(ix); ix = ix0; ix[n]++; wrap(ix); - A1 = data[address(ix)]; + A1 = value(ix); if (A0 * A1 == 0) { return 0.; // can't handle empty bins } else { @@ -1224,10 +1251,10 @@ public: } } else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge ix[n]--; - A0 = data[address(ix)]; + A0 = value(ix); ix = ix0; ix[n]++; - A1 = data[address(ix)]; + A1 = value(ix); if (A0 * A1 == 0) { return 0.; // can't handle empty bins } else { @@ -1238,9 +1265,9 @@ public: // edge: use 2nd order derivative int increment = (ix[n] == 0 ? 1 : -1); // move right from left edge, or the other way around - A0 = data[address(ix)]; - ix[n] += increment; A1 = data[address(ix)]; - ix[n] += increment; A2 = data[address(ix)]; + A0 = value(ix); + ix[n] += increment; A1 = value(ix); + ix[n] += increment; A2 = value(ix); if (A0 * A1 * A2 == 0) { return 0.; // can't handle empty bins } else { @@ -1249,6 +1276,49 @@ public: } } } + + /// \brief Return the gradient of discrete count from finite differences + /// on the *same* grid for dimension n + inline cvm::real gradient_finite_diff(const std::vector &ix0, + int n = 0) + { + int A0, A1, A2; + std::vector ix = ix0; + + // FIXME this can be rewritten more concisely with wrap_edge() + if (periodic[n]) { + ix[n]--; wrap(ix); + A0 = value(ix); + ix = ix0; + ix[n]++; wrap(ix); + A1 = value(ix); + if (A0 * A1 == 0) { + return 0.; // can't handle empty bins + } else { + return cvm::real(A1 - A0) / (widths[n] * 2.); + } + } else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge + ix[n]--; + A0 = value(ix); + ix = ix0; + ix[n]++; + A1 = value(ix); + if (A0 * A1 == 0) { + return 0.; // can't handle empty bins + } else { + return cvm::real(A1 - A0) / (widths[n] * 2.); + } + } else { + // edge: use 2nd order derivative + int increment = (ix[n] == 0 ? 1 : -1); + // move right from left edge, or the other way around + A0 = value(ix); + ix[n] += increment; A1 = value(ix); + ix[n] += increment; A2 = value(ix); + return (-1.5 * cvm::real(A0) + 2. * cvm::real(A1) + - 0.5 * cvm::real(A2)) * increment / widths[n]; + } + } }; @@ -1289,27 +1359,57 @@ public: has_data = true; } - /// Return the gradient of the scalar field from finite differences - inline const cvm::real * gradient_finite_diff( const std::vector &ix0 ) + /// \brief Return the gradient of the scalar field from finite differences + /// Input coordinates are those of gradient grid, shifted wrt scalar grid + /// Should not be called on edges of scalar grid, provided the latter has margins + /// wrt gradient grid + inline void vector_gradient_finite_diff( const std::vector &ix0, std::vector &grad) { cvm::real A0, A1; std::vector ix; - if (nd != 2) { - cvm::error("Finite differences available in dimension 2 only."); - return grad; - } - for (unsigned int n = 0; n < nd; n++) { + size_t i, j, k, n; + + if (nd == 2) { + for (n = 0; n < 2; n++) { + ix = ix0; + A0 = value(ix); + ix[n]++; wrap(ix); + A1 = value(ix); + ix[1-n]++; wrap(ix); + A1 += value(ix); + ix[n]--; wrap(ix); + A0 += value(ix); + grad[n] = 0.5 * (A1 - A0) / widths[n]; + } + } else if (nd == 3) { + + cvm::real p[8]; // potential values within cube, indexed in binary (4 i + 2 j + k) ix = ix0; - A0 = data[address(ix)]; - ix[n]++; wrap(ix); - A1 = data[address(ix)]; - ix[1-n]++; wrap(ix); - A1 += data[address(ix)]; - ix[n]--; wrap(ix); - A0 += data[address(ix)]; - grad[n] = 0.5 * (A1 - A0) / widths[n]; + int index = 0; + for (i = 0; i<2; i++) { + ix[1] = ix0[1]; + for (j = 0; j<2; j++) { + ix[2] = ix0[2]; + for (k = 0; k<2; k++) { + wrap(ix); + p[index++] = value(ix); + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + + // The following would be easier to read using binary literals + // 100 101 110 111 000 001 010 011 + grad[0] = 0.25 * ((p[4] + p[5] + p[6] + p[7]) - (p[0] + p[1] + p[2] + p[3])) / widths[0]; + // 010 011 110 111 000 001 100 101 + grad[1] = 0.25 * ((p[2] + p[3] + p[6] + p[7]) - (p[0] + p[1] + p[4] + p[5])) / widths[0]; + // 001 011 101 111 000 010 100 110 + grad[2] = 0.25 * ((p[1] + p[3] + p[5] + p[7]) - (p[0] + p[2] + p[4] + p[6])) / widths[0]; + } else { + cvm::error("Finite differences available in dimension 2 and 3 only."); } - return grad; } /// \brief Return the value of the function at ix divided by its @@ -1373,10 +1473,6 @@ public: /// \brief Assuming that the map is a normalized probability density, /// calculates the entropy (uses widths if they are defined) cvm::real entropy() const; - -private: - // gradient - cvm::real * grad; }; @@ -1390,6 +1486,10 @@ public: /// should be divided colvar_grid_count *samples; + /// \brief Provide the floating point weights by which each binned value + /// should be divided (alternate to samples, only one should be non-null) + colvar_grid_scalar *weights; + /// Default constructor colvar_grid_gradient(); @@ -1403,10 +1503,33 @@ public: /// Constructor from a vector of colvars colvar_grid_gradient(std::vector &colvars); - /// \brief Accumulate the gradient - inline void acc_grad(std::vector const &ix, cvm::real const *grads) { + /// \brief Get a vector with the binned value(s) indexed by ix, normalized if applicable + inline void vector_value(std::vector const &ix, std::vector &v) const + { + cvm::real const * p = &value(ix); + if (samples) { + int count = samples->value(ix); + if (count) { + cvm::real invcount = 1.0 / count; + for (size_t i = 0; i < mult; i++) { + v[i] = invcount * p[i]; + } + } else { + for (size_t i = 0; i < mult; i++) { + v[i] = 0.0; + } + } + } else { + for (size_t i = 0; i < mult; i++) { + v[i] = p[i]; + } + } + } + + /// \brief Accumulate the value + inline void acc_value(std::vector const &ix, std::vector const &values) { for (size_t imult = 0; imult < mult; imult++) { - data[address(ix) + imult] += grads[imult]; + data[address(ix) + imult] += values[imult].real_value; } if (samples) samples->incr_count(ix); @@ -1422,6 +1545,17 @@ public: samples->incr_count(ix); } + /// \brief Accumulate the gradient based on the force (i.e. sums the + /// opposite of the force) with a non-integer weight + inline void acc_force_weighted(std::vector const &ix, + cvm::real const *forces, + cvm::real weight) { + for (size_t imult = 0; imult < mult; imult++) { + data[address(ix) + imult] -= forces[imult] * weight; + } + weights->acc_value(ix, weight); + } + /// \brief Return the value of the function at ix divided by its /// number of samples (if the count grid is defined) virtual inline cvm::real value_output(std::vector const &ix, @@ -1489,5 +1623,70 @@ public: }; + +/// Integrate (1D, 2D or 3D) gradients + +class integrate_potential : public colvar_grid_scalar +{ + public: + + integrate_potential(); + + virtual ~integrate_potential() + {} + + /// Constructor from a vector of colvars + gradient grid + integrate_potential (std::vector &colvars, colvar_grid_gradient * gradients); + + /// \brief Calculate potential from divergence (in 2D); return number of steps + int integrate (const int itmax, const cvm::real & tol, cvm::real & err); + + /// \brief Update matrix containing divergence and boundary conditions + /// based on new gradient point value, in neighboring bins + void update_div_neighbors(const std::vector &ix); + + /// \brief Set matrix containing divergence and boundary conditions + /// based on complete gradient grid + void set_div(); + + /// \brief Add constant to potential so that its minimum value is zero + /// Useful e.g. for output + inline void set_zero_minimum() { + add_constant(-1.0 * minimum_value()); + } + + protected: + + // Reference to gradient grid + colvar_grid_gradient *gradients; + + /// Array holding divergence + boundary terms (modified Neumann) if not periodic + std::vector divergence; + +// std::vector inv_lap_diag; // Inverse of the diagonal of the Laplacian; for conditioning + + /// \brief Update matrix containing divergence and boundary conditions + /// called by update_div_neighbors + void update_div_local(const std::vector &ix); + + /// Obtain the gradient vector at given location ix, if available + /// or zero if it is on the edge of the gradient grid + /// ix gets wrapped in PBC + void get_grad(cvm::real * g, std::vector &ix); + + /// \brief Solve linear system based on CG, valid for symmetric matrices only + void nr_linbcg_sym(const std::vector &b, std::vector &x, + const cvm::real &tol, const int itmax, int &iter, cvm::real &err); + + /// l2 norm of a vector + cvm::real l2norm(const std::vector &x); + + /// Multiplication by sparse matrix representing Lagrangian (or its transpose) + void atimes(const std::vector &x, std::vector &r); + +// /// Inversion of preconditioner matrix +// void asolve(const std::vector &b, std::vector &x); +}; + #endif diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 780dc28afa..9898e2d5e8 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -22,6 +22,7 @@ #include "colvarbias_restraint.h" #include "colvarscript.h" #include "colvaratoms.h" +#include "colvarcomp.h" colvarmodule::colvarmodule(colvarproxy *proxy_in) @@ -274,9 +275,9 @@ int colvarmodule::parse_global_params(std::string const &conf) parse->get_keyval(conf, "colvarsRestartFrequency", restart_out_freq, restart_out_freq); - // if this is true when initializing, it means - // we are continuing after a reset(): default to true - parse->get_keyval(conf, "colvarsTrajAppend", cv_traj_append, cv_traj_append); + // Deprecate append flag + parse->get_keyval(conf, "colvarsTrajAppend", + cv_traj_append, cv_traj_append, colvarparse::parse_silent); parse->get_keyval(conf, "scriptedColvarForces", use_scripted_forces, false); @@ -409,28 +410,18 @@ int colvarmodule::parse_biases(std::string const &conf) cvm::decrease_depth(); } - size_t i; - - size_t n_hist_dep_biases = 0; - std::vector hist_dep_biases_names; - for (i = 0; i < biases.size(); i++) { - if (biases[i]->is_enabled(colvardeps::f_cvb_apply_force) && - biases[i]->is_enabled(colvardeps::f_cvb_history_dependent)) { - n_hist_dep_biases++; - hist_dep_biases_names.push_back(biases[i]->name); - } - } - if (n_hist_dep_biases > 1) { - cvm::log("WARNING: there are "+cvm::to_str(n_hist_dep_biases)+ - " history-dependent biases with non-zero force parameters:\n"+ - cvm::to_str(hist_dep_biases_names)+"\n"+ - "Please make sure that their forces do not counteract each other.\n"); + std::vector const time_biases = time_dependent_biases(); + if (time_biases.size() > 1) { + cvm::log("WARNING: there are "+cvm::to_str(time_biases.size())+ + " time-dependent biases with non-zero force parameters:\n"+ + cvm::to_str(time_biases)+"\n"+ + "Please ensure that their forces do not counteract each other.\n"); } - if (biases.size() || use_scripted_forces) { + if (num_biases() || use_scripted_forces) { cvm::log(cvm::line_marker); cvm::log("Collective variables biases initialized, "+ - cvm::to_str(biases.size())+" in total.\n"); + cvm::to_str(num_biases())+" in total.\n"); } else { if (!use_scripted_forces) { cvm::log("No collective variables biases were defined.\n"); @@ -441,12 +432,37 @@ int colvarmodule::parse_biases(std::string const &conf) } -int colvarmodule::num_biases_feature(int feature_id) +int colvarmodule::num_variables() const +{ + return colvars.size(); +} + + +int colvarmodule::num_variables_feature(int feature_id) const { - colvarmodule *cv = cvm::main(); size_t n = 0; - for (std::vector::iterator bi = cv->biases.begin(); - bi != cv->biases.end(); + for (std::vector::const_iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + if ((*cvi)->is_enabled(feature_id)) { + n++; + } + } + return n; +} + + +int colvarmodule::num_biases() const +{ + return biases.size(); +} + + +int colvarmodule::num_biases_feature(int feature_id) const +{ + size_t n = 0; + for (std::vector::const_iterator bi = biases.begin(); + bi != biases.end(); bi++) { if ((*bi)->is_enabled(feature_id)) { n++; @@ -456,12 +472,11 @@ int colvarmodule::num_biases_feature(int feature_id) } -int colvarmodule::num_biases_type(std::string const &type) +int colvarmodule::num_biases_type(std::string const &type) const { - colvarmodule *cv = cvm::main(); size_t n = 0; - for (std::vector::iterator bi = cv->biases.begin(); - bi != cv->biases.end(); + for (std::vector::const_iterator bi = biases.begin(); + bi != biases.end(); bi++) { if ((*bi)->bias_type == type) { n++; @@ -471,6 +486,22 @@ int colvarmodule::num_biases_type(std::string const &type) } +std::vector const colvarmodule::time_dependent_biases() const +{ + size_t i; + std::vector biases_names; + for (i = 0; i < num_biases(); i++) { + if (biases[i]->is_enabled(colvardeps::f_cvb_apply_force) && + biases[i]->is_enabled(colvardeps::f_cvb_active) && + (biases[i]->is_enabled(colvardeps::f_cvb_history_dependent) || + biases[i]->is_enabled(colvardeps::f_cvb_time_dependent))) { + biases_names.push_back(biases[i]->name); + } + } + return biases_names; +} + + int colvarmodule::catch_input_errors(int result) { if (result != COLVARS_OK || get_error()) { @@ -673,8 +704,15 @@ int colvarmodule::calc() } // write restart files, if needed - if (restart_out_freq && restart_out_name.size()) { - error_code |= write_restart_files(); + if (restart_out_freq && (cvm::step_relative() > 0) && + ((cvm::step_absolute() % restart_out_freq) == 0) ) { + if (restart_out_name.size()) { + // Write restart file, if different from main output + error_code |= write_restart_file(restart_out_name); + } else { + error_code |= write_restart_file(output_prefix()+".colvars.state"); + } + write_output_files(); } return error_code; @@ -777,7 +815,7 @@ int colvarmodule::calc_biases() { // update the biases and communicate their forces to the collective // variables - if (cvm::debug() && biases.size()) + if (cvm::debug() && num_biases()) cvm::log("Updating collective variable biases.\n"); std::vector::iterator bi; @@ -839,7 +877,7 @@ int colvarmodule::update_colvar_forces() std::vector::iterator bi; // sum the forces from all biases for each collective variable - if (cvm::debug() && biases.size()) + if (cvm::debug() && num_biases()) cvm::log("Collecting forces from all biases.\n"); cvm::increase_depth(); for (bi = biases_active()->begin(); bi != biases_active()->end(); bi++) { @@ -916,21 +954,16 @@ int colvarmodule::calc_scripted_forces() } -int colvarmodule::write_restart_files() +int colvarmodule::write_restart_file(std::string const &out_name) { - if ( (cvm::step_relative() > 0) && - ((cvm::step_absolute() % restart_out_freq) == 0) ) { - cvm::log("Writing the state file \""+ - restart_out_name+"\".\n"); - proxy->backup_file(restart_out_name); - std::ostream *restart_out_os = proxy->output_stream(restart_out_name); - if (!restart_out_os) return cvm::get_error(); - if (!write_restart(*restart_out_os)) { - return cvm::error("Error: in writing restart file.\n", FILE_ERROR); - } - proxy->close_output_stream(restart_out_name); + cvm::log("Saving collective variables state to \""+out_name+"\".\n"); + proxy->backup_file(out_name); + std::ostream *restart_out_os = proxy->output_stream(out_name); + if (!restart_out_os) return cvm::get_error(); + if (!write_restart(*restart_out_os)) { + return cvm::error("Error: in writing restart file.\n", FILE_ERROR); } - + proxy->close_output_stream(out_name); return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } @@ -1011,7 +1044,15 @@ colvarmodule::~colvarmodule() { if ((proxy->smp_thread_id() == COLVARS_NOT_IMPLEMENTED) || (proxy->smp_thread_id() == 0)) { + reset(); + + // Delete contents of static arrays + colvarbias::delete_features(); + colvar::delete_features(); + colvar::cvc::delete_features(); + atom_group::delete_features(); + delete parse; parse = NULL; proxy = NULL; @@ -1057,8 +1098,6 @@ int colvarmodule::reset() int colvarmodule::setup_input() { - if (this->size() == 0) return cvm::get_error(); - std::string restart_in_name(""); // read the restart configuration, if available @@ -1091,14 +1130,12 @@ int colvarmodule::setup_input() } } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } int colvarmodule::setup_output() { - if (this->size() == 0) return cvm::get_error(); - int error_code = COLVARS_OK; // output state file (restart) @@ -1107,7 +1144,8 @@ int colvarmodule::setup_output() std::string(""); if (restart_out_name.size()) { - cvm::log("The restart output state file will be \""+restart_out_name+"\".\n"); + cvm::log("The restart output state file will be \""+ + restart_out_name+"\".\n"); } output_prefix() = proxy->output_prefix(); @@ -1138,7 +1176,7 @@ int colvarmodule::setup_output() set_error_bits(FILE_ERROR); } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } @@ -1261,7 +1299,7 @@ continue the previous simulation.\n\n"); to:\n\ \""+ proxy->input_prefix()+".colvars.state\"\n"); output_prefix() = output_prefix()+".tmp"; - write_output_files(); + write_restart_file(output_prefix()+".colvars.state"); cvm::error("Exiting with error until issue is addressed.\n", FATAL_ERROR); } @@ -1277,24 +1315,13 @@ int colvarmodule::backup_file(char const *filename) int colvarmodule::write_output_files() { - // if this is a simulation run (i.e. not a postprocessing), output data - // must be written to be able to restart the simulation - std::string const out_name = - (output_prefix().size() ? - std::string(output_prefix()+".colvars.state") : - std::string("colvars.state")); - cvm::log("Saving collective variables state to \""+out_name+"\".\n"); - - std::ostream * os = proxy->output_stream(out_name); - os->setf(std::ios::scientific, std::ios::floatfield); - this->write_restart(*os); - proxy->close_output_stream(out_name); + int error_code = COLVARS_OK; cvm::increase_depth(); for (std::vector::iterator cvi = colvars.begin(); cvi != colvars.end(); cvi++) { - (*cvi)->write_output_files(); + error_code |= (*cvi)->write_output_files(); } cvm::decrease_depth(); @@ -1302,8 +1329,8 @@ int colvarmodule::write_output_files() for (std::vector::iterator bi = biases.begin(); bi != biases.end(); bi++) { - (*bi)->write_output_files(); - (*bi)->write_state_to_replicas(); + error_code |= (*bi)->write_output_files(); + error_code |= (*bi)->write_state_to_replicas(); } cvm::decrease_depth(); @@ -1403,15 +1430,12 @@ std::ostream & colvarmodule::write_restart(std::ostream &os) cvi != colvars.end(); cvi++) { (*cvi)->write_restart(os); - error_code |= (*cvi)->write_output_files(); } for (std::vector::iterator bi = biases.begin(); bi != biases.end(); bi++) { (*bi)->write_state(os); - error_code |= (*bi)->write_state_to_replicas(); - error_code |= (*bi)->write_output_files(); } cvm::decrease_depth(); @@ -1736,6 +1760,89 @@ int cvm::load_coords_xyz(char const *filename, } + +// Wrappers to proxy functions: these may go in the future + +cvm::real cvm::unit_angstrom() +{ + return proxy->unit_angstrom(); +} + + +cvm::real cvm::boltzmann() +{ + return proxy->boltzmann(); +} + + +cvm::real cvm::temperature() +{ + return proxy->temperature(); +} + + +cvm::real cvm::dt() +{ + return proxy->dt(); +} + + +void cvm::request_total_force() +{ + proxy->request_total_force(true); +} + +cvm::rvector cvm::position_distance(atom_pos const &pos1, + atom_pos const &pos2) +{ + return proxy->position_distance(pos1, pos2); +} + +cvm::real cvm::position_dist2(cvm::atom_pos const &pos1, + cvm::atom_pos const &pos2) +{ + return proxy->position_dist2(pos1, pos2); +} + +cvm::real cvm::rand_gaussian(void) +{ + return proxy->rand_gaussian(); +} + + + +bool cvm::replica_enabled() +{ + return proxy->replica_enabled(); +} + +int cvm::replica_index() +{ + return proxy->replica_index(); +} + +int cvm::replica_num() +{ + return proxy->replica_num(); +} + +void cvm::replica_comm_barrier() +{ + return proxy->replica_comm_barrier(); +} + +int cvm::replica_comm_recv(char* msg_data, int buf_len, int src_rep) +{ + return proxy->replica_comm_recv(msg_data,buf_len,src_rep); +} + +int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) +{ + return proxy->replica_comm_send(msg_data,msg_len,dest_rep); +} + + + // shared pointer to the proxy object colvarproxy *colvarmodule::proxy = NULL; diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 0f6efd14c4..64a98b77a0 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -39,16 +39,14 @@ You can browse the class hierarchy or the list of source files. #define FILE_ERROR (1<<4) #define MEMORY_ERROR (1<<5) #define FATAL_ERROR (1<<6) // Should be set, or not, together with other bits -#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm +//#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm #define COLVARS_NO_SUCH_FRAME (1<<8) // Cannot load the requested frame #include #include -#include -#include -#include #include -#include +#include +#include #include #include @@ -83,6 +81,21 @@ public: /// Defining an abstract real number allows to switch precision typedef double real; + + /// Override std::pow with a product for n integer + static inline real integer_power(real const &x, int const n) + { + // Original code: math_special.h in LAMMPS + double yy, ww; + if (x == 0.0) return 0.0; + int nn = (n > 0) ? n : -n; + ww = x; + for (yy = 1.0; nn != 0; nn >>= 1, ww *=ww) { + if (nn & 1) yy *= ww; + } + return (n > 0) ? yy : 1.0/yy; + } + /// Residue identifier typedef int residue_id; @@ -292,11 +305,24 @@ private: public: - /// Return how many biases have this feature enabled - static int num_biases_feature(int feature_id); + /// Return how many variables are defined + int num_variables() const; - /// Return how many biases are defined with this type - static int num_biases_type(std::string const &type); + /// Return how many variables have this feature enabled + int num_variables_feature(int feature_id) const; + + /// Return how many biases are defined + int num_biases() const; + + /// Return how many biases have this feature enabled + int num_biases_feature(int feature_id) const; + + /// Return how many biases of this type are defined + int num_biases_type(std::string const &type) const; + + /// Return the names of time-dependent biases with forces enabled (ABF, + /// metadynamics, etc) + std::vector const time_dependent_biases() const; private: /// Useful wrapper to interrupt parsing if any error occurs @@ -334,9 +360,9 @@ public: /// Write all trajectory files int write_traj_files(); - /// Write all restart files - int write_restart_files(); - /// Write all FINAL output files + /// Write a state file useful to resume the simulation + int write_restart_file(std::string const &out_name); + /// Write all other output files int write_output_files(); /// Backup a file before writing it static int backup_file(char const *filename); @@ -580,7 +606,7 @@ public: /// from static functions in the colvarmodule class static colvarproxy *proxy; - /// \brief Accessor for the above + /// \brief Access the one instance of the Colvars module static colvarmodule *main(); }; @@ -590,16 +616,14 @@ public: typedef colvarmodule cvm; -#include "colvartypes.h" - std::ostream & operator << (std::ostream &os, cvm::rvector const &v); std::istream & operator >> (std::istream &is, cvm::rvector &v); template std::string cvm::to_str(T const &x, - size_t const &width, - size_t const &prec) { + size_t const &width, + size_t const &prec) { std::ostringstream os; if (width) os.width(width); if (prec) { @@ -610,9 +634,10 @@ template std::string cvm::to_str(T const &x, return os.str(); } + template std::string cvm::to_str(std::vector const &x, - size_t const &width, - size_t const &prec) { + size_t const &width, + size_t const &prec) { if (!x.size()) return std::string(""); std::ostringstream os; if (prec) { @@ -633,70 +658,4 @@ template std::string cvm::to_str(std::vector const &x, } -#include "colvarproxy.h" - - -inline cvm::real cvm::unit_angstrom() -{ - return proxy->unit_angstrom(); -} - -inline cvm::real cvm::boltzmann() -{ - return proxy->boltzmann(); -} - -inline cvm::real cvm::temperature() -{ - return proxy->temperature(); -} - -inline cvm::real cvm::dt() -{ - return proxy->dt(); -} - -// Replica exchange commands -inline bool cvm::replica_enabled() { - return proxy->replica_enabled(); -} -inline int cvm::replica_index() { - return proxy->replica_index(); -} -inline int cvm::replica_num() { - return proxy->replica_num(); -} -inline void cvm::replica_comm_barrier() { - return proxy->replica_comm_barrier(); -} -inline int cvm::replica_comm_recv(char* msg_data, int buf_len, int src_rep) { - return proxy->replica_comm_recv(msg_data,buf_len,src_rep); -} -inline int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) { - return proxy->replica_comm_send(msg_data,msg_len,dest_rep); -} - - -inline void cvm::request_total_force() -{ - proxy->request_total_force(true); -} - -inline cvm::rvector cvm::position_distance(atom_pos const &pos1, - atom_pos const &pos2) -{ - return proxy->position_distance(pos1, pos2); -} - -inline cvm::real cvm::position_dist2(cvm::atom_pos const &pos1, - cvm::atom_pos const &pos2) -{ - return proxy->position_dist2(pos1, pos2); -} - -inline cvm::real cvm::rand_gaussian(void) -{ - return proxy->rand_gaussian(); -} - #endif diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 9f333b7b76..43c8c69c04 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -553,7 +553,8 @@ bool colvarparse::key_lookup(std::string const &conf, size_t *save_pos) { if (cvm::debug()) { - cvm::log("Looking for the keyword \""+std::string(key_in)+"\" and its value.\n"); + cvm::log("Looking for the keyword \""+std::string(key_in)+ + "\" and its value.\n"); } // add this keyword to the register (in its camelCase version) diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index fa24091d52..8767d5f459 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -10,6 +10,15 @@ #include #include +#if defined(_OPENMP) +#include +#endif + +#if defined(NAMD_TCL) || defined(VMDTCL) +#define COLVARS_TCL +#include +#endif + #include "colvarmodule.h" #include "colvarproxy.h" #include "colvarscript.h" @@ -40,6 +49,12 @@ bool colvarproxy_system::total_forces_enabled() const } +bool colvarproxy_system::total_forces_same_step() const +{ + return false; +} + + cvm::real colvarproxy_system::position_dist2(cvm::atom_pos const &pos1, cvm::atom_pos const &pos2) { @@ -204,7 +219,13 @@ void colvarproxy_atom_groups::clear_atom_group(int index) colvarproxy_smp::colvarproxy_smp() { - b_smp_active = true; + b_smp_active = true; // May be disabled by user option + omp_lock_state = NULL; +#if defined(_OPENMP) + if (smp_thread_id() == 0) { + omp_init_lock(reinterpret_cast(omp_lock_state)); + } +#endif } @@ -213,60 +234,143 @@ colvarproxy_smp::~colvarproxy_smp() {} int colvarproxy_smp::smp_enabled() { +#if defined(_OPENMP) + if (b_smp_active) { + return COLVARS_OK; + } + return COLVARS_ERROR; +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_smp::smp_colvars_loop() { +#if defined(_OPENMP) + colvarmodule *cv = cvm::main(); + colvarproxy *proxy = cv->proxy; +#pragma omp parallel for + for (size_t i = 0; i < cv->variables_active_smp()->size(); i++) { + colvar *x = (*(cv->variables_active_smp()))[i]; + int x_item = (*(cv->variables_active_smp_items()))[i]; + if (cvm::debug()) { + cvm::log("["+cvm::to_str(proxy->smp_thread_id())+"/"+ + cvm::to_str(proxy->smp_num_threads())+ + "]: calc_colvars_items_smp(), i = "+cvm::to_str(i)+", cv = "+ + x->name+", cvc = "+cvm::to_str(x_item)+"\n"); + } + x->calc_cvcs(x_item, 1); + } + return cvm::get_error(); +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_smp::smp_biases_loop() { +#if defined(_OPENMP) + colvarmodule *cv = cvm::main(); +#pragma omp parallel + { +#pragma omp for + for (size_t i = 0; i < cv->biases_active()->size(); i++) { + colvarbias *b = (*(cv->biases_active()))[i]; + if (cvm::debug()) { + cvm::log("Calculating bias \""+b->name+"\" on thread "+ + cvm::to_str(smp_thread_id())+"\n"); + } + b->update(); + } + } + return cvm::get_error(); +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_smp::smp_biases_script_loop() { +#if defined(_OPENMP) + colvarmodule *cv = cvm::main(); +#pragma omp parallel + { +#pragma omp single nowait + { + cv->calc_scripted_forces(); + } +#pragma omp for + for (size_t i = 0; i < cv->biases_active()->size(); i++) { + colvarbias *b = (*(cv->biases_active()))[i]; + if (cvm::debug()) { + cvm::log("Calculating bias \""+b->name+"\" on thread "+ + cvm::to_str(smp_thread_id())+"\n"); + } + b->update(); + } + } + return cvm::get_error(); +#else return COLVARS_NOT_IMPLEMENTED; +#endif } + + int colvarproxy_smp::smp_thread_id() { +#if defined(_OPENMP) + return omp_get_thread_num(); +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_smp::smp_num_threads() { +#if defined(_OPENMP) + return omp_get_max_threads(); +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_smp::smp_lock() { +#if defined(_OPENMP) + omp_set_lock(reinterpret_cast(omp_lock_state)); +#endif return COLVARS_OK; } int colvarproxy_smp::smp_trylock() { +#if defined(_OPENMP) + return omp_test_lock(reinterpret_cast(omp_lock_state)) ? + COLVARS_OK : COLVARS_ERROR; +#else return COLVARS_OK; +#endif } int colvarproxy_smp::smp_unlock() { +#if defined(_OPENMP) + omp_unset_lock(reinterpret_cast(omp_lock_state)); +#endif return COLVARS_OK; } - colvarproxy_replicas::colvarproxy_replicas() {} @@ -321,8 +425,10 @@ colvarproxy_script::colvarproxy_script() colvarproxy_script::~colvarproxy_script() {} -char *colvarproxy_script::script_obj_to_str(unsigned char *obj) +char const *colvarproxy_script::script_obj_to_str(unsigned char *obj) { + cvm::error("Error: trying to print a script object without a scripting " + "language interface.\n", BUG_ERROR); return reinterpret_cast(obj); } @@ -352,6 +458,140 @@ int colvarproxy_script::run_colvar_gradient_callback( +colvarproxy_tcl::colvarproxy_tcl() +{ + _tcl_interp = NULL; +} + + +colvarproxy_tcl::~colvarproxy_tcl() +{ +} + + +void colvarproxy_tcl::init_tcl_pointers() +{ + cvm::error("Error: Tcl support is currently unavailable " + "outside NAMD or VMD.\n", COLVARS_NOT_IMPLEMENTED); +} + + +char const *colvarproxy_tcl::tcl_obj_to_str(unsigned char *obj) +{ +#if defined(COLVARS_TCL) + return Tcl_GetString(reinterpret_cast(obj)); +#else + return NULL; +#endif +} + + +int colvarproxy_tcl::tcl_run_force_callback() +{ +#if defined(COLVARS_TCL) + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + std::string cmd = std::string("calc_colvar_forces ") + + cvm::to_str(cvm::step_absolute()); + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + if (err != TCL_OK) { + cvm::log(std::string("Error while executing calc_colvar_forces:\n")); + cvm::error(Tcl_GetStringResult(tcl_interp)); + return COLVARS_ERROR; + } + return cvm::get_error(); +#else + return COLVARS_NOT_IMPLEMENTED; +#endif +} + + +int colvarproxy_tcl::tcl_run_colvar_callback( + std::string const &name, + std::vector const &cvc_values, + colvarvalue &value) +{ +#if defined(COLVARS_TCL) + + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + size_t i; + std::string cmd = std::string("calc_") + name; + for (i = 0; i < cvc_values.size(); i++) { + cmd += std::string(" {") + (*(cvc_values[i])).to_simple_string() + + std::string("}"); + } + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + const char *result = Tcl_GetStringResult(tcl_interp); + if (err != TCL_OK) { + return cvm::error(std::string("Error while executing ") + + cmd + std::string(":\n") + + std::string(Tcl_GetStringResult(tcl_interp)), COLVARS_ERROR); + } + std::istringstream is(result); + if (value.from_simple_string(is.str()) != COLVARS_OK) { + cvm::log("Error parsing colvar value from script:"); + cvm::error(result); + return COLVARS_ERROR; + } + return cvm::get_error(); + +#else + + return COLVARS_NOT_IMPLEMENTED; + +#endif +} + + +int colvarproxy_tcl::tcl_run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvc_values, + std::vector > &gradient) +{ +#if defined(COLVARS_TCL) + + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + size_t i; + std::string cmd = std::string("calc_") + name + "_gradient"; + for (i = 0; i < cvc_values.size(); i++) { + cmd += std::string(" {") + (*(cvc_values[i])).to_simple_string() + + std::string("}"); + } + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + if (err != TCL_OK) { + return cvm::error(std::string("Error while executing ") + + cmd + std::string(":\n") + + std::string(Tcl_GetStringResult(tcl_interp)), COLVARS_ERROR); + } + Tcl_Obj **list; + int n; + Tcl_ListObjGetElements(tcl_interp, Tcl_GetObjResult(tcl_interp), + &n, &list); + if (n != int(gradient.size())) { + cvm::error("Error parsing list of gradient values from script: found " + + cvm::to_str(n) + " values instead of " + + cvm::to_str(gradient.size())); + return COLVARS_ERROR; + } + for (i = 0; i < gradient.size(); i++) { + std::istringstream is(Tcl_GetString(list[i])); + if (gradient[i].from_simple_string(is.str()) != COLVARS_OK) { + cvm::log("Gradient matrix size: " + cvm::to_str(gradient[i].size())); + cvm::log("Gradient string: " + cvm::to_str(Tcl_GetString(list[i]))); + cvm::error("Error parsing gradient value from script", COLVARS_ERROR); + return COLVARS_ERROR; + } + } + + return cvm::get_error(); + +#else + + return COLVARS_NOT_IMPLEMENTED; + +#endif +} + + colvarproxy_io::colvarproxy_io() {} @@ -442,6 +682,7 @@ colvarproxy::colvarproxy() { colvars = NULL; b_simulation_running = true; + b_delete_requested = false; } @@ -457,6 +698,14 @@ int colvarproxy::reset() } +int colvarproxy::request_deletion() +{ + return cvm::error("Error: \"delete\" command is only available in VMD; " + "please use \"reset\" instead.\n", + COLVARS_NOT_IMPLEMENTED); +} + + int colvarproxy::setup() { return COLVARS_OK; @@ -480,13 +729,3 @@ size_t colvarproxy::restart_frequency() return 0; } - - - - - - - - - - diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 95d13cd7e0..bf29048270 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -80,6 +80,9 @@ public: /// Are total forces being used? virtual bool total_forces_enabled() const; + + /// Are total forces from the current step available? + virtual bool total_forces_same_step() const; }; @@ -372,6 +375,11 @@ public: /// Release the lock virtual int smp_unlock(); + +protected: + + /// Lock state for OpenMP + void *omp_lock_state; }; @@ -407,7 +415,7 @@ public: }; -/// Method for scripting language interface (Tcl or Python) +/// Methods for scripting language interface (Tcl or Python) class colvarproxy_script { public: @@ -419,7 +427,7 @@ public: virtual ~colvarproxy_script(); /// Convert a script object (Tcl or Python call argument) to a C string - virtual char *script_obj_to_str(unsigned char *obj); + virtual char const *script_obj_to_str(unsigned char *obj); /// Pointer to the scripting interface object /// (does not need to be allocated in a new interface) @@ -446,6 +454,46 @@ public: }; +/// Methods for using Tcl within Colvars +class colvarproxy_tcl { + +public: + + /// Constructor + colvarproxy_tcl(); + + /// Destructor + virtual ~colvarproxy_tcl(); + + /// Is Tcl available? (trigger initialization if needed) + int tcl_available(); + + /// Tcl implementation of script_obj_to_str() + char const *tcl_obj_to_str(unsigned char *obj); + + /// Run a user-defined colvar forces script + int tcl_run_force_callback(); + + int tcl_run_colvar_callback( + std::string const &name, + std::vector const &cvcs, + colvarvalue &value); + + int tcl_run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvcs, + std::vector > &gradient); + +protected: + + /// Pointer to Tcl interpreter object + void *_tcl_interp; + + /// Set Tcl pointers + virtual void init_tcl_pointers(); +}; + + /// Methods for data input/output class colvarproxy_io { @@ -532,6 +580,7 @@ class colvarproxy public colvarproxy_smp, public colvarproxy_replicas, public colvarproxy_script, + public colvarproxy_tcl, public colvarproxy_io { @@ -546,6 +595,15 @@ public: /// Destructor virtual ~colvarproxy(); + /// Request deallocation of the module (currently only implemented by VMD) + virtual int request_deletion(); + + /// Whether deallocation was requested + inline bool delete_requested() + { + return b_delete_requested; + } + /// \brief Reset proxy state, e.g. requested atoms virtual int reset(); @@ -583,6 +641,9 @@ protected: /// Whether a simulation is running (warn against irrecovarable errors) bool b_simulation_running; + /// Whether the entire module should be deallocated by the host engine + bool b_delete_requested; + }; diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index e544756428..dc4b8bd07e 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,4 +1,5 @@ -#define COLVARS_VERSION "2017-07-15" +#ifndef COLVARS_VERSION +#define COLVARS_VERSION "2018-01-17" // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars @@ -6,3 +7,4 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. +#endif diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 5bb2faae24..0977496b9e 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -11,7 +11,10 @@ #include #include +#define COLVARSCRIPT_CPP #include "colvarscript.h" +#undef COLVARSCRIPT_CPP + #include "colvarproxy.h" #include "colvardeps.h" @@ -21,6 +24,11 @@ colvarscript::colvarscript(colvarproxy *p) colvars(p->colvars), proxy_error(0) { + comm_help.resize(colvarscript::cv_n_commands); + comm_fns.resize(colvarscript::cv_n_commands); +#define COLVARSCRIPT_INIT_FN +#include "colvarscript.h" +#undef COLVARSCRIPT_INIT_FN } @@ -66,8 +74,9 @@ int colvarscript::run(int objc, unsigned char *const objv[]) } if (objc < 2) { - result = help_string(); - return COLVARS_OK; + set_str_result("No commands given: use \"cv help\" " + "for a list of commands."); + return COLVARSCRIPT_ERROR; } std::string const cmd(obj_to_str(objv[1])); @@ -116,8 +125,7 @@ int colvarscript::run(int objc, unsigned char *const objv[]) if (cmd == "delete") { // Note: the delete bit may be ignored by some backends // it is mostly useful in VMD - colvars->set_error_bits(DELETE_COLVARS); - return COLVARS_OK; + return proxy->request_deletion(); } if (cmd == "update") { @@ -167,17 +175,7 @@ int colvarscript::run(int objc, unsigned char *const objv[]) /// Parse config from string if (cmd == "config") { - if (objc < 3) { - result = "Missing arguments\n" + help_string(); - return COLVARSCRIPT_ERROR; - } - std::string const conf(obj_to_str(objv[2])); - if (colvars->read_config_string(conf) == COLVARS_OK) { - return COLVARS_OK; - } else { - result = "Error parsing configuration string"; - return COLVARSCRIPT_ERROR; - } + return exec_command(cv_config, NULL, objc, objv); } /// Load an input state file @@ -204,6 +202,8 @@ int colvarscript::run(int objc, unsigned char *const objv[]) proxy->output_prefix() = obj_to_str(objv[2]); int error = 0; error |= colvars->setup_output(); + error |= colvars->write_restart_file(colvars->output_prefix()+ + ".colvars.state"); error |= colvars->write_output_files(); return error ? COLVARSCRIPT_ERROR : COLVARS_OK; } @@ -255,6 +255,10 @@ int colvarscript::run(int objc, unsigned char *const objv[]) } } + if (cmd == "help") { + return exec_command(cv_help, NULL, objc, objv); + } + result = "Syntax error\n" + help_string(); return COLVARSCRIPT_ERROR; } @@ -269,6 +273,11 @@ int colvarscript::proc_colvar(colvar *cv, int objc, unsigned char *const objv[]) return COLVARS_OK; } + if (subcmd == "run_ave") { + result = (cv->run_ave()).to_simple_string(); + return COLVARS_OK; + } + if (subcmd == "width") { result = cvm::to_str(cv->width, 0, cvm::cv_prec); return COLVARS_OK; @@ -295,7 +304,9 @@ int colvarscript::proc_colvar(colvar *cv, int objc, unsigned char *const objv[]) // colvar destructor is tasked with the cleanup delete cv; // TODO this could be done by the destructors - colvars->write_traj_label(*(colvars->cv_traj_os)); + if (colvars->cv_traj_os != NULL) { + colvars->write_traj_label(*(colvars->cv_traj_os)); + } return COLVARS_OK; } @@ -374,7 +385,6 @@ int colvarscript::proc_colvar(colvar *cv, int objc, unsigned char *const objv[]) int colvarscript::proc_bias(colvarbias *b, int objc, unsigned char *const objv[]) { - std::string const key(obj_to_str(objv[0])); std::string const subcmd(obj_to_str(objv[2])); if (subcmd == "energy") { @@ -425,7 +435,9 @@ int colvarscript::proc_bias(colvarbias *b, int objc, unsigned char *const objv[] // the bias destructor takes care of the cleanup at cvm level delete b; // TODO this could be done by the destructors - colvars->write_traj_label(*(colvars->cv_traj_os)); + if (colvars->cv_traj_os != NULL) { + colvars->write_traj_label(*(colvars->cv_traj_os)); + } return COLVARS_OK; } @@ -472,7 +484,7 @@ int colvarscript::proc_features(colvardeps *obj, } if ((subcmd == "get") || (subcmd == "set")) { - std::vector &features = obj->features(); + std::vector const &features = obj->features(); std::string const req_feature(obj_to_str(objv[3])); colvardeps::feature *f = NULL; int fid = 0; @@ -528,7 +540,7 @@ int colvarscript::proc_features(colvardeps *obj, } -std::string colvarscript::help_string() +std::string colvarscript::help_string() const { std::string buf; buf = "Usage: cv [args...]\n\ @@ -538,7 +550,7 @@ Managing the Colvars module:\n\ config -- read configuration from the given string\n\ reset -- delete all internal configuration\n\ delete -- delete this Colvars module instance\n\ - version -- return version of colvars code\n\ + version -- return version of Colvars code\n\ \n\ Input and output:\n\ list -- return a list of all variables\n\ @@ -564,6 +576,8 @@ Accessing collective variables:\n\ colvar type -- return the type of colvar \n\ colvar delete -- delete colvar \n\ colvar addforce -- apply given force on colvar \n\ + colvar getappliedforce -- return applied force of colvar \n\ + colvar gettotalforce -- return total force of colvar \n\ colvar getconfig -- return config string of colvar \n\ colvar cvcflags -- enable or disable cvcs according to 0/1 flags\n\ colvar get -- get the value of the colvar feature \n\ diff --git a/lib/colvars/colvarscript.h b/lib/colvars/colvarscript.h index 94d451809c..39cd089340 100644 --- a/lib/colvars/colvarscript.h +++ b/lib/colvars/colvarscript.h @@ -8,21 +8,27 @@ // Colvars repository at GitHub. #ifndef COLVARSCRIPT_H -#define COLVARSCRIPT_H +//#define COLVARSCRIPT_H // Delay definition until later #include +#include +#include + #include "colvarmodule.h" #include "colvarvalue.h" #include "colvarbias.h" #include "colvarproxy.h" + // Only these error values are part of the scripting interface #define COLVARSCRIPT_ERROR -1 #define COLVARSCRIPT_OK 0 + class colvarscript { private: + colvarproxy *proxy; colvarmodule *colvars; @@ -35,16 +41,93 @@ public: colvarscript(colvarproxy * p); inline ~colvarscript() {} - /// If an error is caught by the proxy through fatal_error(), this is set to COLVARSCRIPT_ERROR + /// If an error is caught by the proxy through fatal_error(), this is set to + /// COLVARSCRIPT_ERROR int proxy_error; - /// If an error is returned by one of the methods, it should set this to the error message + /// If an error is returned by one of the methods, it should set this to the + /// error message std::string result; /// Run script command with given positional arguments (objects) int run(int objc, unsigned char *const objv[]); + /// Set the return value of the script command to the given string + inline void set_str_result(std::string const &s) + { + result = s; + } + + /// Build and return a short help + std::string help_string(void) const; + + /// Use scripting language to get the string representation of an object + inline char const *obj_to_str(unsigned char *const obj) + { + return cvm::proxy->script_obj_to_str(obj); + } + + enum command { + cv_help, + cv_version, + cv_config, + cv_configfile, + cv_reset, + cv_delete, + cv_list, + cv_list_biases, + cv_load, + cv_save, + cv_update, + cv_addenergy, + cv_getenergy, + cv_printframe, + cv_printframelabels, + cv_frame, + cv_colvar, + cv_colvar_value, + cv_colvar_update, + cv_colvar_type, + cv_colvar_delete, + cv_colvar_addforce, + cv_colvar_getappliedforce, + cv_colvar_gettotalforce, + cv_colvar_cvcflags, + cv_colvar_getconfig, + cv_colvar_get, + cv_colvar_set, + cv_bias, + cv_bias_energy, + cv_bias_update, + cv_bias_delete, + cv_bias_getconfig, + cv_bias_get, + cv_bias_set, + cv_n_commands + }; + + /// Execute a script command + inline int exec_command(command c, + void *pobj, + int objc, unsigned char * const *objv) + { + return (*(comm_fns[c]))(pobj, objc, objv); + } + + /// Get help for a command (TODO reformat for each language?) + inline std::string command_help(colvarscript::command c) const + { + return comm_help[c]; + } + + /// Clear all object results + inline void clear_results() + { + result.clear(); + } + private: + /// Run subcommands on colvar int proc_colvar(colvar *cv, int argc, unsigned char *const argv[]); @@ -55,17 +138,146 @@ private: int proc_features(colvardeps *obj, int argc, unsigned char *const argv[]); - /// Build and return a short help - std::string help_string(void); + /// Internal identifiers of command strings + std::map comm_str_map; -public: + /// Help strings for each command + std::vector comm_help; - inline char const *obj_to_str(unsigned char *const obj) - { - return cvm::proxy->script_obj_to_str(obj); - } + /// Number of arguments for each command + std::vector comm_n_args; + + /// Arguments for each command + std::vector< std::vector > comm_args; + + /// Implementations of each command + std::vector comm_fns; }; +/// Get a pointer to the main colvarscript object +inline static colvarscript *colvarscript_obj() +{ + return cvm::main()->proxy->script; +} + +/// Get a pointer to the colvar object pointed to by pobj +inline static colvar *colvar_obj(void *pobj) +{ + return reinterpret_cast(pobj); +} + +/// Get a pointer to the colvarbias object pointed to by pobj +inline static colvarbias *colvarbias_obj(void *pobj) +{ + return reinterpret_cast(pobj); +} + + +#define CVSCRIPT_COMM_FNAME(COMM) cvscript_ ## COMM + +#define CVSCRIPT_COMM_PROTO(COMM) \ + int CVSCRIPT_COMM_FNAME(COMM)(void *, int, unsigned char *const *); + +#define CVSCRIPT(COMM,HELP,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) \ + CVSCRIPT_COMM_PROTO(COMM) + +#undef COLVARSCRIPT_H +#endif // #ifndef COLVARSCRIPT_H + + +#ifdef COLVARSCRIPT_CPP +#define CVSCRIPT_COMM_FN(COMM,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) \ + int CVSCRIPT_COMM_FNAME(COMM)(void *pobj, \ + int objc, unsigned char *const objv[]) \ + { \ + colvarscript *script = colvarscript_obj(); \ + script->clear_results(); \ + if (objc < 2+N_ARGS_MIN) /* "cv" and "COMM" are 1st and 2nd */ { \ + script->set_str_result("Missing arguments\n" + \ + script->command_help(colvarscript::COMM)); \ + return COLVARSCRIPT_ERROR; \ + } \ + if (objc > 2+N_ARGS_MAX) { \ + script->set_str_result("Too many arguments\n" + \ + script->command_help(colvarscript::COMM)); \ + return COLVARSCRIPT_ERROR; \ + } \ + FN_BODY; \ + } +#undef CVSCRIPT +#define CVSCRIPT(COMM,HELP,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) \ + CVSCRIPT_COMM_FN(COMM,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) +#endif // #ifdef COLVARSCRIPT_CPP + + +#ifdef COLVARSCRIPT_INIT_FN +#define CVSCRIPT_COMM_INIT(COMM,HELP,ARGS) { \ + comm_str_map[#COMM] = COMM; \ + comm_help[COMM] = HELP; \ + comm_fns[COMM] = &(CVSCRIPT_COMM_FNAME(COMM)); \ + } +#undef CVSCRIPT +#define CVSCRIPT(COMM,HELP,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) \ + CVSCRIPT_COMM_INIT(COMM,HELP,ARGS) #endif + + +#if !defined(COLVARSCRIPT_H) || defined(COLVARSCRIPT_INIT_FN) +#define COLVARSCRIPT_H + +#ifndef COLVARSCRIPT_INIT_FN +#ifdef __cplusplus +extern "C" { +#endif +#endif + + // Add optional arguments for command-specific help? + CVSCRIPT(cv_help, + "Print the help message", + 0, 0, + {}, + script->set_str_result(script->help_string()); + return COLVARS_OK; + ) + + CVSCRIPT(cv_config, + "Read configuration from the given string", + 1, 1, + { "conf (str) - Configuration string" }, + std::string const conf(script->obj_to_str(objv[2])); + if (cvm::main()->read_config_string(conf) == COLVARS_OK) { + return COLVARS_OK; + } + script->set_str_result("Error parsing configuration string"); + return COLVARSCRIPT_ERROR; + ) + + CVSCRIPT(cv_addenergy, + "Add an energy to the MD engine", + 1, 1, + { "E (float) - Amount of energy to add" }, + cvm::main()->total_bias_energy += + strtod(script->obj_to_str(objv[2]), NULL); + return COLVARS_OK; + ) + + CVSCRIPT(cv_getenergy, + "Get the current Colvars energy", + 1, 1, + { "E (float) - Store the energy in this variable" }, + double *energy = reinterpret_cast(objv[2]); + *energy = cvm::main()->total_bias_energy; + return COLVARS_OK; + ) + +#ifndef COLVARSCRIPT_INIT_FN +#ifdef __cplusplus +} // extern "C" +#endif +#endif + +#undef CVSCRIPT + +#endif // #ifndef COLVARSCRIPT_H diff --git a/lib/colvars/colvartypes.cpp b/lib/colvars/colvartypes.cpp index 5200d4d041..b604606d46 100644 --- a/lib/colvars/colvartypes.cpp +++ b/lib/colvars/colvartypes.cpp @@ -19,6 +19,17 @@ bool colvarmodule::rotation::monitor_crossings = false; cvm::real colvarmodule::rotation::crossing_threshold = 1.0E-02; +/// Numerical recipes diagonalization +static int jacobi(cvm::real **a, cvm::real *d, cvm::real **v, int *nrot); + +/// Eigenvector sort +static int eigsrt(cvm::real *d, cvm::real **v); + +/// Transpose the matrix +static int transpose(cvm::real **v); + + + std::string cvm::rvector::to_simple_string() const { std::ostringstream os; @@ -286,7 +297,12 @@ void colvarmodule::rotation::diagonalize_matrix(cvm::matrix2d &S, // diagonalize int jac_nrot = 0; - jacobi(S.c_array(), S_eigval.c_array(), S_eigvec.c_array(), &jac_nrot); + if (jacobi(S.c_array(), S_eigval.c_array(), S_eigvec.c_array(), &jac_nrot) != + COLVARS_OK) { + cvm::error("Too many iterations in routine jacobi.\n" + "This is usually the result of an ill-defined set of atoms for " + "rotational alignment (RMSD, rotateReference, etc).\n"); + } eigsrt(S_eigval.c_array(), S_eigvec.c_array()); // jacobi saves eigenvectors by columns transpose(S_eigvec.c_array()); @@ -296,7 +312,7 @@ void colvarmodule::rotation::diagonalize_matrix(cvm::matrix2d &S, cvm::real norm2 = 0.0; size_t i; for (i = 0; i < 4; i++) { - norm2 += std::pow(S_eigvec[ie][i], int(2)); + norm2 += S_eigvec[ie][i] * S_eigvec[ie][i]; } cvm::real const norm = std::sqrt(norm2); for (i = 0; i < 4; i++) { @@ -528,7 +544,7 @@ void colvarmodule::rotation::calc_optimal_rotation(std::vector co #define n 4 -void jacobi(cvm::real **a, cvm::real *d, cvm::real **v, int *nrot) +int jacobi(cvm::real **a, cvm::real *d, cvm::real **v, int *nrot) { int j,iq,ip,i; cvm::real tresh,theta,tau,t,sm,s,h,g,c; @@ -554,7 +570,7 @@ void jacobi(cvm::real **a, cvm::real *d, cvm::real **v, int *nrot) sm += std::fabs(a[ip][iq]); } if (sm == 0.0) { - return; + return COLVARS_OK; } if (i < 4) tresh=0.2*sm/(n*n); @@ -606,10 +622,11 @@ void jacobi(cvm::real **a, cvm::real *d, cvm::real **v, int *nrot) z[ip]=0.0; } } - cvm::error("Too many iterations in routine jacobi.\n"); + return COLVARS_ERROR; } -void eigsrt(cvm::real *d, cvm::real **v) + +int eigsrt(cvm::real *d, cvm::real **v) { int k,j,i; cvm::real p; @@ -628,9 +645,11 @@ void eigsrt(cvm::real *d, cvm::real **v) } } } + return COLVARS_OK; } -void transpose(cvm::real **v) + +int transpose(cvm::real **v) { cvm::real p; int i,j; @@ -641,6 +660,7 @@ void transpose(cvm::real **v) v[j][i]=p; } } + return COLVARS_OK; } #undef n diff --git a/lib/colvars/colvartypes.h b/lib/colvars/colvartypes.h index 17c09a5095..97257d18ad 100644 --- a/lib/colvars/colvartypes.h +++ b/lib/colvars/colvartypes.h @@ -705,7 +705,7 @@ public: { std::stringstream stream(s); size_t i = 0; - while ((stream >> data[i]) && (i < data.size())) { + while ((i < data.size()) && (stream >> data[i])) { i++; } if (i < data.size()) { @@ -1020,16 +1020,6 @@ inline cvm::rvector operator * (cvm::rmatrix const &m, } -/// Numerical recipes diagonalization -void jacobi(cvm::real **a, cvm::real *d, cvm::real **v, int *nrot); - -/// Eigenvector sort -void eigsrt(cvm::real *d, cvm::real **v); - -/// Transpose the matrix -void transpose(cvm::real **v); - - /// \brief 1-dimensional vector of real numbers with four components and diff --git a/lib/colvars/colvarvalue.cpp b/lib/colvars/colvarvalue.cpp index 7b498be6d6..312d101603 100644 --- a/lib/colvars/colvarvalue.cpp +++ b/lib/colvars/colvarvalue.cpp @@ -570,6 +570,50 @@ colvarvalue colvarvalue::dist2_grad(colvarvalue const &x2) const } +/// Return the midpoint between x1 and x2, optionally weighted by lambda +/// (which must be between 0.0 and 1.0) +colvarvalue const colvarvalue::interpolate(colvarvalue const &x1, + colvarvalue const &x2, + cvm::real const lambda) +{ + colvarvalue::check_types(x1, x2); + + if ((lambda < 0.0) || (lambda > 1.0)) { + cvm::error("Error: trying to interpolate between two colvarvalues with a " + "lamdba outside [0:1].\n", BUG_ERROR); + } + + colvarvalue interp = ((1.0-lambda)*x1 + lambda*x2); + cvm::real const d2 = x1.dist2(x2); + + switch (x1.type()) { + case colvarvalue::type_scalar: + case colvarvalue::type_3vector: + case colvarvalue::type_vector: + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + return interp; + break; + case colvarvalue::type_unit3vector: + case colvarvalue::type_quaternion: + if (interp.norm()/std::sqrt(d2) < 1.0e-6) { + cvm::error("Error: interpolation between "+cvm::to_str(x1)+" and "+ + cvm::to_str(x2)+" with lambda = "+cvm::to_str(lambda)+ + " is undefined: result = "+cvm::to_str(interp)+"\n", + INPUT_ERROR); + } + interp.apply_constraints(); + return interp; + break; + case colvarvalue::type_notset: + default: + x1.undef_op(); + break; + } + return colvarvalue(colvarvalue::type_notset); +} + + std::string colvarvalue::to_simple_string() const { switch (type()) { diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index fce0e1a970..41759e92b0 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -193,6 +193,12 @@ public: /// Derivative with respect to this \link colvarvalue \endlink of the square distance colvarvalue dist2_grad(colvarvalue const &x2) const; + /// Return the midpoint between x1 and x2, optionally weighted by lambda + /// (which must be between 0.0 and 1.0) + static colvarvalue const interpolate(colvarvalue const &x1, + colvarvalue const &x2, + cvm::real const lambda = 0.5); + /// Assignment operator (type of x is checked) colvarvalue & operator = (colvarvalue const &x); @@ -285,10 +291,10 @@ public: cvm::real & operator [] (int const i); /// Ensure that the two types are the same within a binary operator - int static check_types(colvarvalue const &x1, colvarvalue const &x2); + static int check_types(colvarvalue const &x1, colvarvalue const &x2); /// Ensure that the two types are the same within an assignment, or that the left side is type_notset - int static check_types_assign(Type const &vt1, Type const &vt2); + static int check_types_assign(Type const &vt1, Type const &vt2); /// Undefined operation void undef_op() const; @@ -317,14 +323,14 @@ public: /// \brief Optimized routine for the inner product of one collective /// variable with an array - void static inner_opt(colvarvalue const &x, + static void inner_opt(colvarvalue const &x, std::vector::iterator &xv, std::vector::iterator const &xv_end, std::vector::iterator &result); /// \brief Optimized routine for the inner product of one collective /// variable with an array - void static inner_opt(colvarvalue const &x, + static void inner_opt(colvarvalue const &x, std::list::iterator &xv, std::list::iterator const &xv_end, std::vector::iterator &result); @@ -332,14 +338,14 @@ public: /// \brief Optimized routine for the second order Legendre /// polynomial, (3cos^2(w)-1)/2, of one collective variable with an /// array - void static p2leg_opt(colvarvalue const &x, + static void p2leg_opt(colvarvalue const &x, std::vector::iterator &xv, std::vector::iterator const &xv_end, std::vector::iterator &result); /// \brief Optimized routine for the second order Legendre /// polynomial of one collective variable with an array - void static p2leg_opt(colvarvalue const &x, + static void p2leg_opt(colvarvalue const &x, std::list::iterator &xv, std::list::iterator const &xv_end, std::vector::iterator &result); diff --git a/lib/colvars/lepton/include/Lepton.h b/lib/colvars/lepton/include/Lepton.h new file mode 100644 index 0000000000..22edcb3ff9 --- /dev/null +++ b/lib/colvars/lepton/include/Lepton.h @@ -0,0 +1,43 @@ +#ifndef LEPTON_H_ +#define LEPTON_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/CompiledExpression.h" +#include "lepton/CustomFunction.h" +#include "lepton/ExpressionProgram.h" +#include "lepton/ExpressionTreeNode.h" +#include "lepton/Operation.h" +#include "lepton/ParsedExpression.h" +#include "lepton/Parser.h" + +#endif /*LEPTON_H_*/ diff --git a/lib/colvars/lepton/include/lepton/CompiledExpression.h b/lib/colvars/lepton/include/lepton/CompiledExpression.h new file mode 100644 index 0000000000..67442e0cf5 --- /dev/null +++ b/lib/colvars/lepton/include/lepton/CompiledExpression.h @@ -0,0 +1,113 @@ +#ifndef LEPTON_COMPILED_EXPRESSION_H_ +#define LEPTON_COMPILED_EXPRESSION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2013-2016 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "windowsIncludes.h" +#include +#include +#include +#include +#include +#ifdef LEPTON_USE_JIT + #include "asmjit.h" +#endif + +namespace Lepton { + +class Operation; +class ParsedExpression; + +/** + * A CompiledExpression is a highly optimized representation of an expression for cases when you want to evaluate + * it many times as quickly as possible. You should treat it as an opaque object; none of the internal representation + * is visible. + * + * A CompiledExpression is created by calling createCompiledExpression() on a ParsedExpression. + * + * WARNING: CompiledExpression is NOT thread safe. You should never access a CompiledExpression from two threads at + * the same time. + */ + +class LEPTON_EXPORT CompiledExpression { +public: + CompiledExpression(); + CompiledExpression(const CompiledExpression& expression); + ~CompiledExpression(); + CompiledExpression& operator=(const CompiledExpression& expression); + /** + * Get the names of all variables used by this expression. + */ + const std::set& getVariables() const; + /** + * Get a reference to the memory location where the value of a particular variable is stored. This can be used + * to set the value of the variable before calling evaluate(). + */ + double& getVariableReference(const std::string& name); + /** + * You can optionally specify the memory locations from which the values of variables should be read. + * This is useful, for example, when several expressions all use the same variable. You can then set + * the value of that variable in one place, and it will be seen by all of them. + */ + void setVariableLocations(std::map& variableLocations); + /** + * Evaluate the expression. The values of all variables should have been set before calling this. + */ + double evaluate() const; +private: + friend class ParsedExpression; + CompiledExpression(const ParsedExpression& expression); + void compileExpression(const ExpressionTreeNode& node, std::vector >& temps); + int findTempIndex(const ExpressionTreeNode& node, std::vector >& temps); + std::map variablePointers; + std::vector > variablesToCopy; + std::vector > arguments; + std::vector target; + std::vector operation; + std::map variableIndices; + std::set variableNames; + mutable std::vector workspace; + mutable std::vector argValues; + std::map dummyVariables; + void* jitCode; +#ifdef LEPTON_USE_JIT + void generateJitCode(); + void generateSingleArgCall(asmjit::X86Compiler& c, asmjit::X86XmmVar& dest, asmjit::X86XmmVar& arg, double (*function)(double)); + std::vector constants; + asmjit::JitRuntime runtime; +#endif +}; + +} // namespace Lepton + +#endif /*LEPTON_COMPILED_EXPRESSION_H_*/ diff --git a/lib/colvars/lepton/include/lepton/CustomFunction.h b/lib/colvars/lepton/include/lepton/CustomFunction.h new file mode 100644 index 0000000000..5c5586105f --- /dev/null +++ b/lib/colvars/lepton/include/lepton/CustomFunction.h @@ -0,0 +1,77 @@ +#ifndef LEPTON_CUSTOM_FUNCTION_H_ +#define LEPTON_CUSTOM_FUNCTION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" + +namespace Lepton { + +/** + * This class is the interface for defining your own function that may be included in expressions. + * To use it, create a concrete subclass that implements all of the virtual methods for each new function + * you want to define. Then when you call Parser::parse() to parse an expression, pass a map of + * function names to CustomFunction objects. + */ + +class LEPTON_EXPORT CustomFunction { +public: + virtual ~CustomFunction() { + } + /** + * Get the number of arguments this function expects. + */ + virtual int getNumArguments() const = 0; + /** + * Evaluate the function. + * + * @param arguments the array of argument values + */ + virtual double evaluate(const double* arguments) const = 0; + /** + * Evaluate a derivative of the function. + * + * @param arguments the array of argument values + * @param derivOrder an array specifying the number of times the function has been differentiated + * with respect to each of its arguments. For example, the array {0, 2} indicates + * a second derivative with respect to the second argument. + */ + virtual double evaluateDerivative(const double* arguments, const int* derivOrder) const = 0; + /** + * Create a new duplicate of this object on the heap using the "new" operator. + */ + virtual CustomFunction* clone() const = 0; +}; + +} // namespace Lepton + +#endif /*LEPTON_CUSTOM_FUNCTION_H_*/ diff --git a/lib/colvars/lepton/include/lepton/Exception.h b/lib/colvars/lepton/include/lepton/Exception.h new file mode 100644 index 0000000000..5ad55714d1 --- /dev/null +++ b/lib/colvars/lepton/include/lepton/Exception.h @@ -0,0 +1,59 @@ +#ifndef LEPTON_EXCEPTION_H_ +#define LEPTON_EXCEPTION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include +#include + +namespace Lepton { + +/** + * This class is used for all exceptions thrown by Lepton. + */ + +class Exception : public std::exception { +public: + Exception(const std::string& message) : message(message) { + } + ~Exception() throw() { + } + const char* what() const throw() { + return message.c_str(); + } +private: + std::string message; +}; + +} // namespace Lepton + +#endif /*LEPTON_EXCEPTION_H_*/ diff --git a/lib/colvars/lepton/include/lepton/ExpressionProgram.h b/lib/colvars/lepton/include/lepton/ExpressionProgram.h new file mode 100644 index 0000000000..94d37f471d --- /dev/null +++ b/lib/colvars/lepton/include/lepton/ExpressionProgram.h @@ -0,0 +1,95 @@ +#ifndef LEPTON_EXPRESSION_PROGRAM_H_ +#define LEPTON_EXPRESSION_PROGRAM_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "windowsIncludes.h" +#include +#include +#include + +namespace Lepton { + +class ParsedExpression; + +/** + * An ExpressionProgram is a linear sequence of Operations for evaluating an expression. The evaluation + * is done with a stack. The arguments to each Operation are first taken off the stack in order, then it is + * evaluated and the result is pushed back onto the stack. At the end, the stack contains a single value, + * which is the value of the expression. + * + * An ExpressionProgram is created by calling createProgram() on a ParsedExpression. + */ + +class LEPTON_EXPORT ExpressionProgram { +public: + ExpressionProgram(); + ExpressionProgram(const ExpressionProgram& program); + ~ExpressionProgram(); + ExpressionProgram& operator=(const ExpressionProgram& program); + /** + * Get the number of Operations that make up this program. + */ + int getNumOperations() const; + /** + * Get an Operation in this program. + */ + const Operation& getOperation(int index) const; + /** + * Get the size of the stack needed to execute this program. This is the largest number of elements present + * on the stack at any point during evaluation. + */ + int getStackSize() const; + /** + * Evaluate the expression. If the expression involves any variables, this method will throw an exception. + */ + double evaluate() const; + /** + * Evaluate the expression. + * + * @param variables a map specifying the values of all variables that appear in the expression. If any + * variable appears in the expression but is not included in this map, an exception + * will be thrown. + */ + double evaluate(const std::map& variables) const; +private: + friend class ParsedExpression; + ExpressionProgram(const ParsedExpression& expression); + void buildProgram(const ExpressionTreeNode& node); + std::vector operations; + int maxArgs, stackSize; +}; + +} // namespace Lepton + +#endif /*LEPTON_EXPRESSION_PROGRAM_H_*/ diff --git a/lib/colvars/lepton/include/lepton/ExpressionTreeNode.h b/lib/colvars/lepton/include/lepton/ExpressionTreeNode.h new file mode 100644 index 0000000000..bf3a9a0902 --- /dev/null +++ b/lib/colvars/lepton/include/lepton/ExpressionTreeNode.h @@ -0,0 +1,105 @@ +#ifndef LEPTON_EXPRESSION_TREE_NODE_H_ +#define LEPTON_EXPRESSION_TREE_NODE_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" +#include +#include + +namespace Lepton { + +class Operation; + +/** + * This class represents a node in the abstract syntax tree representation of an expression. + * Each node is defined by an Operation and a set of children. When the expression is + * evaluated, each child is first evaluated in order, then the resulting values are passed + * as the arguments to the Operation's evaluate() method. + */ + +class LEPTON_EXPORT ExpressionTreeNode { +public: + /** + * Create a new ExpressionTreeNode. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + * @param children the children of this node + */ + ExpressionTreeNode(Operation* operation, const std::vector& children); + /** + * Create a new ExpressionTreeNode with two children. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + * @param child1 the first child of this node + * @param child2 the second child of this node + */ + ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child1, const ExpressionTreeNode& child2); + /** + * Create a new ExpressionTreeNode with one child. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + * @param child the child of this node + */ + ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child); + /** + * Create a new ExpressionTreeNode with no children. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + */ + ExpressionTreeNode(Operation* operation); + ExpressionTreeNode(const ExpressionTreeNode& node); + ExpressionTreeNode(); + ~ExpressionTreeNode(); + bool operator==(const ExpressionTreeNode& node) const; + bool operator!=(const ExpressionTreeNode& node) const; + ExpressionTreeNode& operator=(const ExpressionTreeNode& node); + /** + * Get the Operation performed by this node. + */ + const Operation& getOperation() const; + /** + * Get this node's child nodes. + */ + const std::vector& getChildren() const; +private: + Operation* operation; + std::vector children; +}; + +} // namespace Lepton + +#endif /*LEPTON_EXPRESSION_TREE_NODE_H_*/ diff --git a/lib/colvars/lepton/include/lepton/Operation.h b/lib/colvars/lepton/include/lepton/Operation.h new file mode 100644 index 0000000000..f7a8b78163 --- /dev/null +++ b/lib/colvars/lepton/include/lepton/Operation.h @@ -0,0 +1,1165 @@ +#ifndef LEPTON_OPERATION_H_ +#define LEPTON_OPERATION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2015 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" +#include "CustomFunction.h" +#include "Exception.h" +#include +#include +#include +#include +#include +#include + +namespace Lepton { + +class ExpressionTreeNode; + +/** + * An Operation represents a single step in the evaluation of an expression, such as a function, + * an operator, or a constant value. Each Operation takes some number of values as arguments + * and produces a single value. + * + * This is an abstract class with subclasses for specific operations. + */ + +class LEPTON_EXPORT Operation { +public: + virtual ~Operation() { + } + /** + * This enumeration lists all Operation subclasses. This is provided so that switch statements + * can be used when processing or analyzing parsed expressions. + */ + enum Id {CONSTANT, VARIABLE, CUSTOM, ADD, SUBTRACT, MULTIPLY, DIVIDE, POWER, NEGATE, SQRT, EXP, LOG, + SIN, COS, SEC, CSC, TAN, COT, ASIN, ACOS, ATAN, SINH, COSH, TANH, ERF, ERFC, STEP, DELTA, SQUARE, CUBE, RECIPROCAL, + ADD_CONSTANT, MULTIPLY_CONSTANT, POWER_CONSTANT, MIN, MAX, ABS, FLOOR, CEIL, SELECT}; + /** + * Get the name of this Operation. + */ + virtual std::string getName() const = 0; + /** + * Get this Operation's ID. + */ + virtual Id getId() const = 0; + /** + * Get the number of arguments this operation expects. + */ + virtual int getNumArguments() const = 0; + /** + * Create a clone of this Operation. + */ + virtual Operation* clone() const = 0; + /** + * Perform the computation represented by this operation. + * + * @param args the array of arguments + * @param variables a map containing the values of all variables + * @return the result of performing the computation. + */ + virtual double evaluate(double* args, const std::map& variables) const = 0; + /** + * Return an ExpressionTreeNode which represents the analytic derivative of this Operation with respect to a variable. + * + * @param children the child nodes + * @param childDerivs the derivatives of the child nodes with respect to the variable + * @param variable the variable with respect to which the derivate should be taken + */ + virtual ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const = 0; + /** + * Get whether this operation should be displayed with infix notation. + */ + virtual bool isInfixOperator() const { + return false; + } + /** + * Get whether this is a symmetric binary operation, such that exchanging its arguments + * does not affect the result. + */ + virtual bool isSymmetric() const { + return false; + } + virtual bool operator!=(const Operation& op) const { + return op.getId() != getId(); + } + virtual bool operator==(const Operation& op) const { + return !(*this != op); + } + class Constant; + class Variable; + class Custom; + class Add; + class Subtract; + class Multiply; + class Divide; + class Power; + class Negate; + class Sqrt; + class Exp; + class Log; + class Sin; + class Cos; + class Sec; + class Csc; + class Tan; + class Cot; + class Asin; + class Acos; + class Atan; + class Sinh; + class Cosh; + class Tanh; + class Erf; + class Erfc; + class Step; + class Delta; + class Square; + class Cube; + class Reciprocal; + class AddConstant; + class MultiplyConstant; + class PowerConstant; + class Min; + class Max; + class Abs; + class Floor; + class Ceil; + class Select; +}; + +class LEPTON_EXPORT Operation::Constant : public Operation { +public: + Constant(double value) : value(value) { + } + std::string getName() const { + std::stringstream name; + name << value; + return name.str(); + } + Id getId() const { + return CONSTANT; + } + int getNumArguments() const { + return 0; + } + Operation* clone() const { + return new Constant(value); + } + double evaluate(double* args, const std::map& variables) const { + return value; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + double getValue() const { + return value; + } + bool operator!=(const Operation& op) const { + const Constant* o = dynamic_cast(&op); + return (o == NULL || o->value != value); + } +private: + double value; +}; + +class LEPTON_EXPORT Operation::Variable : public Operation { +public: + Variable(const std::string& name) : name(name) { + } + std::string getName() const { + return name; + } + Id getId() const { + return VARIABLE; + } + int getNumArguments() const { + return 0; + } + Operation* clone() const { + return new Variable(name); + } + double evaluate(double* args, const std::map& variables) const { + std::map::const_iterator iter = variables.find(name); + if (iter == variables.end()) + throw Exception("No value specified for variable "+name); + return iter->second; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + bool operator!=(const Operation& op) const { + const Variable* o = dynamic_cast(&op); + return (o == NULL || o->name != name); + } +private: + std::string name; +}; + +class LEPTON_EXPORT Operation::Custom : public Operation { +public: + Custom(const std::string& name, CustomFunction* function) : name(name), function(function), isDerivative(false), derivOrder(function->getNumArguments(), 0) { + } + Custom(const Custom& base, int derivIndex) : name(base.name), function(base.function->clone()), isDerivative(true), derivOrder(base.derivOrder) { + derivOrder[derivIndex]++; + } + ~Custom() { + delete function; + } + std::string getName() const { + return name; + } + Id getId() const { + return CUSTOM; + } + int getNumArguments() const { + return function->getNumArguments(); + } + Operation* clone() const { + Custom* clone = new Custom(name, function->clone()); + clone->isDerivative = isDerivative; + clone->derivOrder = derivOrder; + return clone; + } + double evaluate(double* args, const std::map& variables) const { + if (isDerivative) + return function->evaluateDerivative(args, &derivOrder[0]); + return function->evaluate(args); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + const std::vector& getDerivOrder() const { + return derivOrder; + } + bool operator!=(const Operation& op) const { + const Custom* o = dynamic_cast(&op); + return (o == NULL || o->name != name || o->isDerivative != isDerivative || o->derivOrder != derivOrder); + } +private: + std::string name; + CustomFunction* function; + bool isDerivative; + std::vector derivOrder; +}; + +class LEPTON_EXPORT Operation::Add : public Operation { +public: + Add() { + } + std::string getName() const { + return "+"; + } + Id getId() const { + return ADD; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Add(); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]+args[1]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + bool isInfixOperator() const { + return true; + } + bool isSymmetric() const { + return true; + } +}; + +class LEPTON_EXPORT Operation::Subtract : public Operation { +public: + Subtract() { + } + std::string getName() const { + return "-"; + } + Id getId() const { + return SUBTRACT; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Subtract(); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]-args[1]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + bool isInfixOperator() const { + return true; + } +}; + +class LEPTON_EXPORT Operation::Multiply : public Operation { +public: + Multiply() { + } + std::string getName() const { + return "*"; + } + Id getId() const { + return MULTIPLY; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Multiply(); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]*args[1]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + bool isInfixOperator() const { + return true; + } + bool isSymmetric() const { + return true; + } +}; + +class LEPTON_EXPORT Operation::Divide : public Operation { +public: + Divide() { + } + std::string getName() const { + return "/"; + } + Id getId() const { + return DIVIDE; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Divide(); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]/args[1]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + bool isInfixOperator() const { + return true; + } +}; + +class LEPTON_EXPORT Operation::Power : public Operation { +public: + Power() { + } + std::string getName() const { + return "^"; + } + Id getId() const { + return POWER; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Power(); + } + double evaluate(double* args, const std::map& variables) const { + return std::pow(args[0], args[1]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + bool isInfixOperator() const { + return true; + } +}; + +class LEPTON_EXPORT Operation::Negate : public Operation { +public: + Negate() { + } + std::string getName() const { + return "-"; + } + Id getId() const { + return NEGATE; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Negate(); + } + double evaluate(double* args, const std::map& variables) const { + return -args[0]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Sqrt : public Operation { +public: + Sqrt() { + } + std::string getName() const { + return "sqrt"; + } + Id getId() const { + return SQRT; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Sqrt(); + } + double evaluate(double* args, const std::map& variables) const { + return std::sqrt(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Exp : public Operation { +public: + Exp() { + } + std::string getName() const { + return "exp"; + } + Id getId() const { + return EXP; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Exp(); + } + double evaluate(double* args, const std::map& variables) const { + return std::exp(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Log : public Operation { +public: + Log() { + } + std::string getName() const { + return "log"; + } + Id getId() const { + return LOG; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Log(); + } + double evaluate(double* args, const std::map& variables) const { + return std::log(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Sin : public Operation { +public: + Sin() { + } + std::string getName() const { + return "sin"; + } + Id getId() const { + return SIN; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Sin(); + } + double evaluate(double* args, const std::map& variables) const { + return std::sin(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Cos : public Operation { +public: + Cos() { + } + std::string getName() const { + return "cos"; + } + Id getId() const { + return COS; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Cos(); + } + double evaluate(double* args, const std::map& variables) const { + return std::cos(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Sec : public Operation { +public: + Sec() { + } + std::string getName() const { + return "sec"; + } + Id getId() const { + return SEC; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Sec(); + } + double evaluate(double* args, const std::map& variables) const { + return 1.0/std::cos(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Csc : public Operation { +public: + Csc() { + } + std::string getName() const { + return "csc"; + } + Id getId() const { + return CSC; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Csc(); + } + double evaluate(double* args, const std::map& variables) const { + return 1.0/std::sin(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Tan : public Operation { +public: + Tan() { + } + std::string getName() const { + return "tan"; + } + Id getId() const { + return TAN; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Tan(); + } + double evaluate(double* args, const std::map& variables) const { + return std::tan(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Cot : public Operation { +public: + Cot() { + } + std::string getName() const { + return "cot"; + } + Id getId() const { + return COT; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Cot(); + } + double evaluate(double* args, const std::map& variables) const { + return 1.0/std::tan(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Asin : public Operation { +public: + Asin() { + } + std::string getName() const { + return "asin"; + } + Id getId() const { + return ASIN; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Asin(); + } + double evaluate(double* args, const std::map& variables) const { + return std::asin(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Acos : public Operation { +public: + Acos() { + } + std::string getName() const { + return "acos"; + } + Id getId() const { + return ACOS; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Acos(); + } + double evaluate(double* args, const std::map& variables) const { + return std::acos(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Atan : public Operation { +public: + Atan() { + } + std::string getName() const { + return "atan"; + } + Id getId() const { + return ATAN; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Atan(); + } + double evaluate(double* args, const std::map& variables) const { + return std::atan(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Sinh : public Operation { +public: + Sinh() { + } + std::string getName() const { + return "sinh"; + } + Id getId() const { + return SINH; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Sinh(); + } + double evaluate(double* args, const std::map& variables) const { + return std::sinh(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Cosh : public Operation { +public: + Cosh() { + } + std::string getName() const { + return "cosh"; + } + Id getId() const { + return COSH; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Cosh(); + } + double evaluate(double* args, const std::map& variables) const { + return std::cosh(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Tanh : public Operation { +public: + Tanh() { + } + std::string getName() const { + return "tanh"; + } + Id getId() const { + return TANH; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Tanh(); + } + double evaluate(double* args, const std::map& variables) const { + return std::tanh(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Erf : public Operation { +public: + Erf() { + } + std::string getName() const { + return "erf"; + } + Id getId() const { + return ERF; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Erf(); + } + double evaluate(double* args, const std::map& variables) const; + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Erfc : public Operation { +public: + Erfc() { + } + std::string getName() const { + return "erfc"; + } + Id getId() const { + return ERFC; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Erfc(); + } + double evaluate(double* args, const std::map& variables) const; + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Step : public Operation { +public: + Step() { + } + std::string getName() const { + return "step"; + } + Id getId() const { + return STEP; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Step(); + } + double evaluate(double* args, const std::map& variables) const { + return (args[0] >= 0.0 ? 1.0 : 0.0); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Delta : public Operation { +public: + Delta() { + } + std::string getName() const { + return "delta"; + } + Id getId() const { + return DELTA; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Delta(); + } + double evaluate(double* args, const std::map& variables) const { + return (args[0] == 0.0 ? 1.0 : 0.0); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Square : public Operation { +public: + Square() { + } + std::string getName() const { + return "square"; + } + Id getId() const { + return SQUARE; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Square(); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]*args[0]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Cube : public Operation { +public: + Cube() { + } + std::string getName() const { + return "cube"; + } + Id getId() const { + return CUBE; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Cube(); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]*args[0]*args[0]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Reciprocal : public Operation { +public: + Reciprocal() { + } + std::string getName() const { + return "recip"; + } + Id getId() const { + return RECIPROCAL; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Reciprocal(); + } + double evaluate(double* args, const std::map& variables) const { + return 1.0/args[0]; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::AddConstant : public Operation { +public: + AddConstant(double value) : value(value) { + } + std::string getName() const { + std::stringstream name; + name << value << "+"; + return name.str(); + } + Id getId() const { + return ADD_CONSTANT; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new AddConstant(value); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]+value; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + double getValue() const { + return value; + } + bool operator!=(const Operation& op) const { + const AddConstant* o = dynamic_cast(&op); + return (o == NULL || o->value != value); + } +private: + double value; +}; + +class LEPTON_EXPORT Operation::MultiplyConstant : public Operation { +public: + MultiplyConstant(double value) : value(value) { + } + std::string getName() const { + std::stringstream name; + name << value << "*"; + return name.str(); + } + Id getId() const { + return MULTIPLY_CONSTANT; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new MultiplyConstant(value); + } + double evaluate(double* args, const std::map& variables) const { + return args[0]*value; + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + double getValue() const { + return value; + } + bool operator!=(const Operation& op) const { + const MultiplyConstant* o = dynamic_cast(&op); + return (o == NULL || o->value != value); + } +private: + double value; +}; + +class LEPTON_EXPORT Operation::PowerConstant : public Operation { +public: + PowerConstant(double value) : value(value) { + intValue = (int) value; + isIntPower = (intValue == value); + } + std::string getName() const { + std::stringstream name; + name << "^" << value; + return name.str(); + } + Id getId() const { + return POWER_CONSTANT; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new PowerConstant(value); + } + double evaluate(double* args, const std::map& variables) const { + if (isIntPower) { + // Integer powers can be computed much more quickly by repeated multiplication. + + int exponent = intValue; + double base = args[0]; + if (exponent < 0) { + exponent = -exponent; + base = 1.0/base; + } + double result = 1.0; + while (exponent != 0) { + if ((exponent&1) == 1) + result *= base; + base *= base; + exponent = exponent>>1; + } + return result; + } + else + return std::pow(args[0], value); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; + double getValue() const { + return value; + } + bool operator!=(const Operation& op) const { + const PowerConstant* o = dynamic_cast(&op); + return (o == NULL || o->value != value); + } + bool isInfixOperator() const { + return true; + } +private: + double value; + int intValue; + bool isIntPower; +}; + +class LEPTON_EXPORT Operation::Min : public Operation { +public: + Min() { + } + std::string getName() const { + return "min"; + } + Id getId() const { + return MIN; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Min(); + } + double evaluate(double* args, const std::map& variables) const { + // parens around (std::min) are workaround for horrible microsoft max/min macro trouble + return (std::min)(args[0], args[1]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Max : public Operation { +public: + Max() { + } + std::string getName() const { + return "max"; + } + Id getId() const { + return MAX; + } + int getNumArguments() const { + return 2; + } + Operation* clone() const { + return new Max(); + } + double evaluate(double* args, const std::map& variables) const { + // parens around (std::min) are workaround for horrible microsoft max/min macro trouble + return (std::max)(args[0], args[1]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Abs : public Operation { +public: + Abs() { + } + std::string getName() const { + return "abs"; + } + Id getId() const { + return ABS; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Abs(); + } + double evaluate(double* args, const std::map& variables) const { + return std::abs(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Floor : public Operation { +public: + + Floor() { + } + std::string getName() const { + return "floor"; + } + Id getId() const { + return FLOOR; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Floor(); + } + double evaluate(double* args, const std::map& variables) const { + return std::floor(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Ceil : public Operation { +public: + Ceil() { + } + std::string getName() const { + return "ceil"; + } + Id getId() const { + return CEIL; + } + int getNumArguments() const { + return 1; + } + Operation* clone() const { + return new Ceil(); + } + double evaluate(double* args, const std::map& variables) const { + return std::ceil(args[0]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +class LEPTON_EXPORT Operation::Select : public Operation { +public: + Select() { + } + std::string getName() const { + return "select"; + } + Id getId() const { + return SELECT; + } + int getNumArguments() const { + return 3; + } + Operation* clone() const { + return new Select(); + } + double evaluate(double* args, const std::map& variables) const { + return (args[0] != 0.0 ? args[1] : args[2]); + } + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const; +}; + +} // namespace Lepton + +#endif /*LEPTON_OPERATION_H_*/ diff --git a/lib/colvars/lepton/include/lepton/ParsedExpression.h b/lib/colvars/lepton/include/lepton/ParsedExpression.h new file mode 100644 index 0000000000..d88b3d5829 --- /dev/null +++ b/lib/colvars/lepton/include/lepton/ParsedExpression.h @@ -0,0 +1,130 @@ +#ifndef LEPTON_PARSED_EXPRESSION_H_ +#define LEPTON_PARSED_EXPRESSION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009=2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "windowsIncludes.h" +#include +#include + +namespace Lepton { + +class CompiledExpression; +class ExpressionProgram; + +/** + * This class represents the result of parsing an expression. It provides methods for working with the + * expression in various ways, such as evaluating it, getting the tree representation of the expresson, etc. + */ + +class LEPTON_EXPORT ParsedExpression { +public: + /** + * Create an uninitialized ParsedExpression. This exists so that ParsedExpressions can be put in STL containers. + * Doing anything with it will produce an exception. + */ + ParsedExpression(); + /** + * Create a ParsedExpression. Normally you will not call this directly. Instead, use the Parser class + * to parse expression. + */ + ParsedExpression(const ExpressionTreeNode& rootNode); + /** + * Get the root node of the expression's abstract syntax tree. + */ + const ExpressionTreeNode& getRootNode() const; + /** + * Evaluate the expression. If the expression involves any variables, this method will throw an exception. + */ + double evaluate() const; + /** + * Evaluate the expression. + * + * @param variables a map specifying the values of all variables that appear in the expression. If any + * variable appears in the expression but is not included in this map, an exception + * will be thrown. + */ + double evaluate(const std::map& variables) const; + /** + * Create a new ParsedExpression which produces the same result as this one, but is faster to evaluate. + */ + ParsedExpression optimize() const; + /** + * Create a new ParsedExpression which produces the same result as this one, but is faster to evaluate. + * + * @param variables a map specifying values for a subset of variables that appear in the expression. + * All occurrences of these variables in the expression are replaced with the values + * specified. + */ + ParsedExpression optimize(const std::map& variables) const; + /** + * Create a new ParsedExpression which is the analytic derivative of this expression with respect to a + * particular variable. + * + * @param variable the variable with respect to which the derivate should be taken + */ + ParsedExpression differentiate(const std::string& variable) const; + /** + * Create an ExpressionProgram that represents the same calculation as this expression. + */ + ExpressionProgram createProgram() const; + /** + * Create a CompiledExpression that represents the same calculation as this expression. + */ + CompiledExpression createCompiledExpression() const; + /** + * Create a new ParsedExpression which is identical to this one, except that the names of some + * variables have been changed. + * + * @param replacements a map whose keys are the names of variables, and whose values are the + * new names to replace them with + */ + ParsedExpression renameVariables(const std::map& replacements) const; +private: + static double evaluate(const ExpressionTreeNode& node, const std::map& variables); + static ExpressionTreeNode preevaluateVariables(const ExpressionTreeNode& node, const std::map& variables); + static ExpressionTreeNode precalculateConstantSubexpressions(const ExpressionTreeNode& node); + static ExpressionTreeNode substituteSimplerExpression(const ExpressionTreeNode& node); + static ExpressionTreeNode differentiate(const ExpressionTreeNode& node, const std::string& variable); + static double getConstantValue(const ExpressionTreeNode& node); + static ExpressionTreeNode renameNodeVariables(const ExpressionTreeNode& node, const std::map& replacements); + ExpressionTreeNode rootNode; +}; + +LEPTON_EXPORT std::ostream& operator<<(std::ostream& out, const ExpressionTreeNode& node); + +LEPTON_EXPORT std::ostream& operator<<(std::ostream& out, const ParsedExpression& exp); + +} // namespace Lepton + +#endif /*LEPTON_PARSED_EXPRESSION_H_*/ diff --git a/lib/colvars/lepton/include/lepton/Parser.h b/lib/colvars/lepton/include/lepton/Parser.h new file mode 100644 index 0000000000..63d5988d5f --- /dev/null +++ b/lib/colvars/lepton/include/lepton/Parser.h @@ -0,0 +1,77 @@ +#ifndef LEPTON_PARSER_H_ +#define LEPTON_PARSER_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" +#include +#include +#include + +namespace Lepton { + +class CustomFunction; +class ExpressionTreeNode; +class Operation; +class ParsedExpression; +class ParseToken; + +/** + * This class provides the main interface for parsing expressions. + */ + +class LEPTON_EXPORT Parser { +public: + /** + * Parse a mathematical expression and return a representation of it as an abstract syntax tree. + */ + static ParsedExpression parse(const std::string& expression); + /** + * Parse a mathematical expression and return a representation of it as an abstract syntax tree. + * + * @param customFunctions a map specifying user defined functions that may appear in the expression. + * The key are function names, and the values are corresponding CustomFunction objects. + */ + static ParsedExpression parse(const std::string& expression, const std::map& customFunctions); +private: + static std::string trim(const std::string& expression); + static std::vector tokenize(const std::string& expression); + static ParseToken getNextToken(const std::string& expression, int start); + static ExpressionTreeNode parsePrecedence(const std::vector& tokens, int& pos, const std::map& customFunctions, + const std::map& subexpressionDefs, int precedence); + static Operation* getOperatorOperation(const std::string& name); + static Operation* getFunctionOperation(const std::string& name, const std::map& customFunctions); +}; + +} // namespace Lepton + +#endif /*LEPTON_PARSER_H_*/ diff --git a/lib/colvars/lepton/include/lepton/windowsIncludes.h b/lib/colvars/lepton/include/lepton/windowsIncludes.h new file mode 100644 index 0000000000..798229850e --- /dev/null +++ b/lib/colvars/lepton/include/lepton/windowsIncludes.h @@ -0,0 +1,41 @@ +#ifndef LEPTON_WINDOW_INCLUDE_H_ +#define LEPTON_WINDOW_INCLUDE_H_ + +/* + * Shared libraries are messy in Visual Studio. We have to distinguish three + * cases: + * (1) this header is being used to build the Lepton shared library + * (dllexport) + * (2) this header is being used by a *client* of the Lepton shared + * library (dllimport) + * (3) we are building the Lepton static library, or the client is + * being compiled with the expectation of linking with the + * Lepton static library (nothing special needed) + * In the CMake script for building this library, we define one of the symbols + * Lepton_BUILDING_{SHARED|STATIC}_LIBRARY + * Client code normally has no special symbol defined, in which case we'll + * assume it wants to use the shared library. However, if the client defines + * the symbol LEPTON_USE_STATIC_LIBRARIES we'll suppress the dllimport so + * that the client code can be linked with static libraries. Note that + * the client symbol is not library dependent, while the library symbols + * affect only the Lepton library, meaning that other libraries can + * be clients of this one. However, we are assuming all-static or all-shared. + */ + +#ifdef _MSC_VER + // We don't want to hear about how sprintf is "unsafe". + #pragma warning(disable:4996) + // Keep MS VC++ quiet about lack of dll export of private members. + #pragma warning(disable:4251) + #if defined(LEPTON_BUILDING_SHARED_LIBRARY) + #define LEPTON_EXPORT __declspec(dllexport) + #elif defined(LEPTON_BUILDING_STATIC_LIBRARY) || defined(LEPTON_USE_STATIC_LIBRARIES) + #define LEPTON_EXPORT + #else + #define LEPTON_EXPORT __declspec(dllimport) // i.e., a client of a shared library + #endif +#else + #define LEPTON_EXPORT // Linux, Mac +#endif + +#endif // LEPTON_WINDOW_INCLUDE_H_ diff --git a/lib/colvars/lepton/src/CompiledExpression.cpp b/lib/colvars/lepton/src/CompiledExpression.cpp new file mode 100644 index 0000000000..302f294ee2 --- /dev/null +++ b/lib/colvars/lepton/src/CompiledExpression.cpp @@ -0,0 +1,400 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2013-2016 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/CompiledExpression.h" +#include "lepton/Operation.h" +#include "lepton/ParsedExpression.h" +#include + +using namespace Lepton; +using namespace std; +#ifdef LEPTON_USE_JIT + using namespace asmjit; +#endif + +CompiledExpression::CompiledExpression() : jitCode(NULL) { +} + +CompiledExpression::CompiledExpression(const ParsedExpression& expression) : jitCode(NULL) { + ParsedExpression expr = expression.optimize(); // Just in case it wasn't already optimized. + vector > temps; + compileExpression(expr.getRootNode(), temps); + int maxArguments = 1; + for (int i = 0; i < (int) operation.size(); i++) + if (operation[i]->getNumArguments() > maxArguments) + maxArguments = operation[i]->getNumArguments(); + argValues.resize(maxArguments); +#ifdef LEPTON_USE_JIT + generateJitCode(); +#endif +} + +CompiledExpression::~CompiledExpression() { + for (int i = 0; i < (int) operation.size(); i++) + if (operation[i] != NULL) + delete operation[i]; +} + +CompiledExpression::CompiledExpression(const CompiledExpression& expression) : jitCode(NULL) { + *this = expression; +} + +CompiledExpression& CompiledExpression::operator=(const CompiledExpression& expression) { + arguments = expression.arguments; + target = expression.target; + variableIndices = expression.variableIndices; + variableNames = expression.variableNames; + workspace.resize(expression.workspace.size()); + argValues.resize(expression.argValues.size()); + operation.resize(expression.operation.size()); + for (int i = 0; i < (int) operation.size(); i++) + operation[i] = expression.operation[i]->clone(); + setVariableLocations(variablePointers); + return *this; +} + +void CompiledExpression::compileExpression(const ExpressionTreeNode& node, vector >& temps) { + if (findTempIndex(node, temps) != -1) + return; // We have already processed a node identical to this one. + + // Process the child nodes. + + vector args; + for (int i = 0; i < node.getChildren().size(); i++) { + compileExpression(node.getChildren()[i], temps); + args.push_back(findTempIndex(node.getChildren()[i], temps)); + } + + // Process this node. + + if (node.getOperation().getId() == Operation::VARIABLE) { + variableIndices[node.getOperation().getName()] = (int) workspace.size(); + variableNames.insert(node.getOperation().getName()); + } + else { + int stepIndex = (int) arguments.size(); + arguments.push_back(vector()); + target.push_back((int) workspace.size()); + operation.push_back(node.getOperation().clone()); + if (args.size() == 0) + arguments[stepIndex].push_back(0); // The value won't actually be used. We just need something there. + else { + // If the arguments are sequential, we can just pass a pointer to the first one. + + bool sequential = true; + for (int i = 1; i < args.size(); i++) + if (args[i] != args[i-1]+1) + sequential = false; + if (sequential) + arguments[stepIndex].push_back(args[0]); + else + arguments[stepIndex] = args; + } + } + temps.push_back(make_pair(node, (int) workspace.size())); + workspace.push_back(0.0); +} + +int CompiledExpression::findTempIndex(const ExpressionTreeNode& node, vector >& temps) { + for (int i = 0; i < (int) temps.size(); i++) + if (temps[i].first == node) + return i; + return -1; +} + +const set& CompiledExpression::getVariables() const { + return variableNames; +} + +double& CompiledExpression::getVariableReference(const string& name) { + map::iterator pointer = variablePointers.find(name); + if (pointer != variablePointers.end()) + return *pointer->second; + map::iterator index = variableIndices.find(name); + if (index == variableIndices.end()) + throw Exception("getVariableReference: Unknown variable '"+name+"'"); + return workspace[index->second]; +} + +void CompiledExpression::setVariableLocations(map& variableLocations) { + variablePointers = variableLocations; +#ifdef LEPTON_USE_JIT + // Rebuild the JIT code. + + if (workspace.size() > 0) + generateJitCode(); +#else + // Make a list of all variables we will need to copy before evaluating the expression. + + variablesToCopy.clear(); + for (map::const_iterator iter = variableIndices.begin(); iter != variableIndices.end(); ++iter) { + map::iterator pointer = variablePointers.find(iter->first); + if (pointer != variablePointers.end()) + variablesToCopy.push_back(make_pair(&workspace[iter->second], pointer->second)); + } +#endif +} + +double CompiledExpression::evaluate() const { +#ifdef LEPTON_USE_JIT + return ((double (*)()) jitCode)(); +#else + for (int i = 0; i < variablesToCopy.size(); i++) + *variablesToCopy[i].first = *variablesToCopy[i].second; + + // Loop over the operations and evaluate each one. + + for (int step = 0; step < operation.size(); step++) { + const vector& args = arguments[step]; + if (args.size() == 1) + workspace[target[step]] = operation[step]->evaluate(&workspace[args[0]], dummyVariables); + else { + for (int i = 0; i < args.size(); i++) + argValues[i] = workspace[args[i]]; + workspace[target[step]] = operation[step]->evaluate(&argValues[0], dummyVariables); + } + } + return workspace[workspace.size()-1]; +#endif +} + +#ifdef LEPTON_USE_JIT +static double evaluateOperation(Operation* op, double* args) { + map* dummyVariables = NULL; + return op->evaluate(args, *dummyVariables); +} + +void CompiledExpression::generateJitCode() { + X86Compiler c(&runtime); + c.addFunc(kFuncConvHost, FuncBuilder0()); + vector workspaceVar(workspace.size()); + for (int i = 0; i < (int) workspaceVar.size(); i++) + workspaceVar[i] = c.newXmmVar(kX86VarTypeXmmSd); + X86GpVar argsPointer(c); + c.mov(argsPointer, imm_ptr(&argValues[0])); + + // Load the arguments into variables. + + for (set::const_iterator iter = variableNames.begin(); iter != variableNames.end(); ++iter) { + map::iterator index = variableIndices.find(*iter); + X86GpVar variablePointer(c); + c.mov(variablePointer, imm_ptr(&getVariableReference(index->first))); + c.movsd(workspaceVar[index->second], x86::ptr(variablePointer, 0, 0)); + } + + // Make a list of all constants that will be needed for evaluation. + + vector operationConstantIndex(operation.size(), -1); + for (int step = 0; step < (int) operation.size(); step++) { + // Find the constant value (if any) used by this operation. + + Operation& op = *operation[step]; + double value; + if (op.getId() == Operation::CONSTANT) + value = dynamic_cast(op).getValue(); + else if (op.getId() == Operation::ADD_CONSTANT) + value = dynamic_cast(op).getValue(); + else if (op.getId() == Operation::MULTIPLY_CONSTANT) + value = dynamic_cast(op).getValue(); + else if (op.getId() == Operation::RECIPROCAL) + value = 1.0; + else if (op.getId() == Operation::STEP) + value = 1.0; + else if (op.getId() == Operation::DELTA) + value = 1.0; + else + continue; + + // See if we already have a variable for this constant. + + for (int i = 0; i < (int) constants.size(); i++) + if (value == constants[i]) { + operationConstantIndex[step] = i; + break; + } + if (operationConstantIndex[step] == -1) { + operationConstantIndex[step] = constants.size(); + constants.push_back(value); + } + } + + // Load constants into variables. + + vector constantVar(constants.size()); + if (constants.size() > 0) { + X86GpVar constantsPointer(c); + c.mov(constantsPointer, imm_ptr(&constants[0])); + for (int i = 0; i < (int) constants.size(); i++) { + constantVar[i] = c.newXmmVar(kX86VarTypeXmmSd); + c.movsd(constantVar[i], x86::ptr(constantsPointer, 8*i, 0)); + } + } + + // Evaluate the operations. + + for (int step = 0; step < (int) operation.size(); step++) { + Operation& op = *operation[step]; + vector args = arguments[step]; + if (args.size() == 1) { + // One or more sequential arguments. Fill out the list. + + for (int i = 1; i < op.getNumArguments(); i++) + args.push_back(args[0]+i); + } + + // Generate instructions to execute this operation. + + switch (op.getId()) { + case Operation::CONSTANT: + c.movsd(workspaceVar[target[step]], constantVar[operationConstantIndex[step]]); + break; + case Operation::ADD: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.addsd(workspaceVar[target[step]], workspaceVar[args[1]]); + break; + case Operation::SUBTRACT: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.subsd(workspaceVar[target[step]], workspaceVar[args[1]]); + break; + case Operation::MULTIPLY: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.mulsd(workspaceVar[target[step]], workspaceVar[args[1]]); + break; + case Operation::DIVIDE: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.divsd(workspaceVar[target[step]], workspaceVar[args[1]]); + break; + case Operation::NEGATE: + c.xorps(workspaceVar[target[step]], workspaceVar[target[step]]); + c.subsd(workspaceVar[target[step]], workspaceVar[args[0]]); + break; + case Operation::SQRT: + c.sqrtsd(workspaceVar[target[step]], workspaceVar[args[0]]); + break; + case Operation::EXP: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], exp); + break; + case Operation::LOG: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], log); + break; + case Operation::SIN: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], sin); + break; + case Operation::COS: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], cos); + break; + case Operation::TAN: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], tan); + break; + case Operation::ASIN: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], asin); + break; + case Operation::ACOS: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], acos); + break; + case Operation::ATAN: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], atan); + break; + case Operation::SINH: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], sinh); + break; + case Operation::COSH: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], cosh); + break; + case Operation::TANH: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], tanh); + break; + case Operation::STEP: + c.xorps(workspaceVar[target[step]], workspaceVar[target[step]]); + c.cmpsd(workspaceVar[target[step]], workspaceVar[args[0]], imm(18)); // Comparison mode is _CMP_LE_OQ = 18 + c.andps(workspaceVar[target[step]], constantVar[operationConstantIndex[step]]); + break; + case Operation::DELTA: + c.xorps(workspaceVar[target[step]], workspaceVar[target[step]]); + c.cmpsd(workspaceVar[target[step]], workspaceVar[args[0]], imm(16)); // Comparison mode is _CMP_EQ_OS = 16 + c.andps(workspaceVar[target[step]], constantVar[operationConstantIndex[step]]); + break; + case Operation::SQUARE: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.mulsd(workspaceVar[target[step]], workspaceVar[args[0]]); + break; + case Operation::CUBE: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.mulsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.mulsd(workspaceVar[target[step]], workspaceVar[args[0]]); + break; + case Operation::RECIPROCAL: + c.movsd(workspaceVar[target[step]], constantVar[operationConstantIndex[step]]); + c.divsd(workspaceVar[target[step]], workspaceVar[args[0]]); + break; + case Operation::ADD_CONSTANT: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.addsd(workspaceVar[target[step]], constantVar[operationConstantIndex[step]]); + break; + case Operation::MULTIPLY_CONSTANT: + c.movsd(workspaceVar[target[step]], workspaceVar[args[0]]); + c.mulsd(workspaceVar[target[step]], constantVar[operationConstantIndex[step]]); + break; + case Operation::ABS: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], fabs); + break; + case Operation::FLOOR: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], floor); + break; + case Operation::CEIL: + generateSingleArgCall(c, workspaceVar[target[step]], workspaceVar[args[0]], ceil); + break; + default: + // Just invoke evaluateOperation(). + + for (int i = 0; i < (int) args.size(); i++) + c.movsd(x86::ptr(argsPointer, 8*i, 0), workspaceVar[args[i]]); + X86GpVar fn(c, kVarTypeIntPtr); + c.mov(fn, imm_ptr((void*) evaluateOperation)); + X86CallNode* call = c.call(fn, kFuncConvHost, FuncBuilder2()); + call->setArg(0, imm_ptr(&op)); + call->setArg(1, imm_ptr(&argValues[0])); + call->setRet(0, workspaceVar[target[step]]); + } + } + c.ret(workspaceVar[workspace.size()-1]); + c.endFunc(); + jitCode = c.make(); +} + +void CompiledExpression::generateSingleArgCall(X86Compiler& c, X86XmmVar& dest, X86XmmVar& arg, double (*function)(double)) { + X86GpVar fn(c, kVarTypeIntPtr); + c.mov(fn, imm_ptr((void*) function)); + X86CallNode* call = c.call(fn, kFuncConvHost, FuncBuilder1()); + call->setArg(0, arg); + call->setRet(0, dest); +} +#endif diff --git a/lib/colvars/lepton/src/ExpressionProgram.cpp b/lib/colvars/lepton/src/ExpressionProgram.cpp new file mode 100644 index 0000000000..65d3f0c79a --- /dev/null +++ b/lib/colvars/lepton/src/ExpressionProgram.cpp @@ -0,0 +1,105 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/ExpressionProgram.h" +#include "lepton/Operation.h" +#include "lepton/ParsedExpression.h" + +using namespace Lepton; +using namespace std; + +ExpressionProgram::ExpressionProgram() : maxArgs(0), stackSize(0) { +} + +ExpressionProgram::ExpressionProgram(const ParsedExpression& expression) : maxArgs(0), stackSize(0) { + buildProgram(expression.getRootNode()); + int currentStackSize = 0; + for (int i = 0; i < (int) operations.size(); i++) { + int args = operations[i]->getNumArguments(); + if (args > maxArgs) + maxArgs = args; + currentStackSize += 1-args; + if (currentStackSize > stackSize) + stackSize = currentStackSize; + } +} + +ExpressionProgram::~ExpressionProgram() { + for (int i = 0; i < (int) operations.size(); i++) + delete operations[i]; +} + +ExpressionProgram::ExpressionProgram(const ExpressionProgram& program) { + *this = program; +} + +ExpressionProgram& ExpressionProgram::operator=(const ExpressionProgram& program) { + maxArgs = program.maxArgs; + stackSize = program.stackSize; + operations.resize(program.operations.size()); + for (int i = 0; i < (int) operations.size(); i++) + operations[i] = program.operations[i]->clone(); + return *this; +} + +void ExpressionProgram::buildProgram(const ExpressionTreeNode& node) { + for (int i = (int) node.getChildren().size()-1; i >= 0; i--) + buildProgram(node.getChildren()[i]); + operations.push_back(node.getOperation().clone()); +} + +int ExpressionProgram::getNumOperations() const { + return (int) operations.size(); +} + +const Operation& ExpressionProgram::getOperation(int index) const { + return *operations[index]; +} + +int ExpressionProgram::getStackSize() const { + return stackSize; +} + +double ExpressionProgram::evaluate() const { + return evaluate(map()); +} + +double ExpressionProgram::evaluate(const std::map& variables) const { + vector stack(stackSize+1); + int stackPointer = stackSize; + for (int i = 0; i < (int) operations.size(); i++) { + int numArgs = operations[i]->getNumArguments(); + double result = operations[i]->evaluate(&stack[stackPointer], variables); + stackPointer += numArgs-1; + stack[stackPointer] = result; + } + return stack[stackSize-1]; +} diff --git a/lib/colvars/lepton/src/ExpressionTreeNode.cpp b/lib/colvars/lepton/src/ExpressionTreeNode.cpp new file mode 100644 index 0000000000..8519878262 --- /dev/null +++ b/lib/colvars/lepton/src/ExpressionTreeNode.cpp @@ -0,0 +1,107 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2015 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/ExpressionTreeNode.h" +#include "lepton/Exception.h" +#include "lepton/Operation.h" + +using namespace Lepton; +using namespace std; + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation, const vector& children) : operation(operation), children(children) { + if (operation->getNumArguments() != children.size()) + throw Exception("wrong number of arguments to function: "+operation->getName()); +} + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child1, const ExpressionTreeNode& child2) : operation(operation) { + children.push_back(child1); + children.push_back(child2); + if (operation->getNumArguments() != children.size()) + throw Exception("wrong number of arguments to function: "+operation->getName()); +} + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child) : operation(operation) { + children.push_back(child); + if (operation->getNumArguments() != children.size()) + throw Exception("wrong number of arguments to function: "+operation->getName()); +} + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation) : operation(operation) { + if (operation->getNumArguments() != children.size()) + throw Exception("wrong number of arguments to function: "+operation->getName()); +} + +ExpressionTreeNode::ExpressionTreeNode(const ExpressionTreeNode& node) : operation(node.operation == NULL ? NULL : node.operation->clone()), children(node.getChildren()) { +} + +ExpressionTreeNode::ExpressionTreeNode() : operation(NULL) { +} + +ExpressionTreeNode::~ExpressionTreeNode() { + if (operation != NULL) + delete operation; +} + +bool ExpressionTreeNode::operator!=(const ExpressionTreeNode& node) const { + if (node.getOperation() != getOperation()) + return true; + if (getOperation().isSymmetric() && getChildren().size() == 2) { + if (getChildren()[0] == node.getChildren()[0] && getChildren()[1] == node.getChildren()[1]) + return false; + if (getChildren()[0] == node.getChildren()[1] && getChildren()[1] == node.getChildren()[0]) + return false; + return true; + } + for (int i = 0; i < (int) getChildren().size(); i++) + if (getChildren()[i] != node.getChildren()[i]) + return true; + return false; +} + +bool ExpressionTreeNode::operator==(const ExpressionTreeNode& node) const { + return !(*this != node); +} + +ExpressionTreeNode& ExpressionTreeNode::operator=(const ExpressionTreeNode& node) { + if (operation != NULL) + delete operation; + operation = node.getOperation().clone(); + children = node.getChildren(); + return *this; +} + +const Operation& ExpressionTreeNode::getOperation() const { + return *operation; +} + +const vector& ExpressionTreeNode::getChildren() const { + return children; +} diff --git a/lib/colvars/lepton/src/MSVC_erfc.h b/lib/colvars/lepton/src/MSVC_erfc.h new file mode 100644 index 0000000000..eadb20fdf8 --- /dev/null +++ b/lib/colvars/lepton/src/MSVC_erfc.h @@ -0,0 +1,87 @@ +#ifndef LEPTON_MSVC_ERFC_H_ +#define LEPTON_MSVC_ERFC_H_ + +/* + * Up to version 11 (VC++ 2012), Microsoft does not support the + * standard C99 erf() and erfc() functions so we have to fake them here. + * These were added in version 12 (VC++ 2013), which sets _MSC_VER=1800 + * (VC11 has _MSC_VER=1700). + */ + +#if defined(_MSC_VER) +#define M_PI 3.14159265358979323846264338327950288 + +#if _MSC_VER <= 1700 // 1700 is VC11, 1800 is VC12 +/*************************** +* erf.cpp +* author: Steve Strand +* written: 29-Jan-04 +***************************/ + +#include + +static const double rel_error= 1E-12; //calculate 12 significant figures +//you can adjust rel_error to trade off between accuracy and speed +//but don't ask for > 15 figures (assuming usual 52 bit mantissa in a double) + +static double erfc(double x); + +static double erf(double x) +//erf(x) = 2/sqrt(pi)*integral(exp(-t^2),t,0,x) +// = 2/sqrt(pi)*[x - x^3/3 + x^5/5*2! - x^7/7*3! + ...] +// = 1-erfc(x) +{ + static const double two_sqrtpi= 1.128379167095512574; // 2/sqrt(pi) + if (fabs(x) > 2.2) { + return 1.0 - erfc(x); //use continued fraction when fabs(x) > 2.2 + } + double sum= x, term= x, xsqr= x*x; + int j= 1; + do { + term*= xsqr/j; + sum-= term/(2*j+1); + ++j; + term*= xsqr/j; + sum+= term/(2*j+1); + ++j; + } while (fabs(term)/sum > rel_error); + return two_sqrtpi*sum; +} + + +static double erfc(double x) +//erfc(x) = 2/sqrt(pi)*integral(exp(-t^2),t,x,inf) +// = exp(-x^2)/sqrt(pi) * [1/x+ (1/2)/x+ (2/2)/x+ (3/2)/x+ (4/2)/x+ ...] +// = 1-erf(x) +//expression inside [] is a continued fraction so '+' means add to denominator only +{ + static const double one_sqrtpi= 0.564189583547756287; // 1/sqrt(pi) + if (fabs(x) < 2.2) { + return 1.0 - erf(x); //use series when fabs(x) < 2.2 + } + // Don't look for x==0 here! + if (x < 0) { //continued fraction only valid for x>0 + return 2.0 - erfc(-x); + } + double a=1, b=x; //last two convergent numerators + double c=x, d=x*x+0.5; //last two convergent denominators + double q1, q2= b/d; //last two convergents (a/c and b/d) + double n= 1.0, t; + do { + t= a*n+b*x; + a= b; + b= t; + t= c*n+d*x; + c= d; + d= t; + n+= 0.5; + q1= q2; + q2= b/d; + } while (fabs(q1-q2)/q2 > rel_error); + return one_sqrtpi*exp(-x*x)*q2; +} + +#endif // _MSC_VER <= 1700 +#endif // _MSC_VER + +#endif // LEPTON_MSVC_ERFC_H_ diff --git a/lib/colvars/lepton/src/Operation.cpp b/lib/colvars/lepton/src/Operation.cpp new file mode 100644 index 0000000000..693dea2ede --- /dev/null +++ b/lib/colvars/lepton/src/Operation.cpp @@ -0,0 +1,335 @@ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2015 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/Operation.h" +#include "lepton/ExpressionTreeNode.h" +#include "MSVC_erfc.h" + +using namespace Lepton; +using namespace std; + +double Operation::Erf::evaluate(double* args, const map& variables) const { + return erf(args[0]); +} + +double Operation::Erfc::evaluate(double* args, const map& variables) const { + return erfc(args[0]); +} + +ExpressionTreeNode Operation::Constant::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Constant(0.0)); +} + +ExpressionTreeNode Operation::Variable::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + if (variable == name) + return ExpressionTreeNode(new Operation::Constant(1.0)); + return ExpressionTreeNode(new Operation::Constant(0.0)); +} + +ExpressionTreeNode Operation::Custom::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + if (function->getNumArguments() == 0) + return ExpressionTreeNode(new Operation::Constant(0.0)); + ExpressionTreeNode result = ExpressionTreeNode(new Operation::Multiply(), ExpressionTreeNode(new Operation::Custom(*this, 0), children), childDerivs[0]); + for (int i = 1; i < getNumArguments(); i++) { + result = ExpressionTreeNode(new Operation::Add(), + result, + ExpressionTreeNode(new Operation::Multiply(), ExpressionTreeNode(new Operation::Custom(*this, i), children), childDerivs[i])); + } + return result; +} + +ExpressionTreeNode Operation::Add::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Add(), childDerivs[0], childDerivs[1]); +} + +ExpressionTreeNode Operation::Subtract::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Subtract(), childDerivs[0], childDerivs[1]); +} + +ExpressionTreeNode Operation::Multiply::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Add(), + ExpressionTreeNode(new Operation::Multiply(), children[0], childDerivs[1]), + ExpressionTreeNode(new Operation::Multiply(), children[1], childDerivs[0])); +} + +ExpressionTreeNode Operation::Divide::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Divide(), + ExpressionTreeNode(new Operation::Subtract(), + ExpressionTreeNode(new Operation::Multiply(), children[1], childDerivs[0]), + ExpressionTreeNode(new Operation::Multiply(), children[0], childDerivs[1])), + ExpressionTreeNode(new Operation::Square(), children[1])); +} + +ExpressionTreeNode Operation::Power::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Add(), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Multiply(), + children[1], + ExpressionTreeNode(new Operation::Power(), + children[0], ExpressionTreeNode(new Operation::AddConstant(-1.0), children[1]))), + childDerivs[0]), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Log(), children[0]), + ExpressionTreeNode(new Operation::Power(), children[0], children[1])), + childDerivs[1])); +} + +ExpressionTreeNode Operation::Negate::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Negate(), childDerivs[0]); +} + +ExpressionTreeNode Operation::Sqrt::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::MultiplyConstant(0.5), + ExpressionTreeNode(new Operation::Reciprocal(), + ExpressionTreeNode(new Operation::Sqrt(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Exp::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Exp(), children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Log::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Reciprocal(), children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Sin::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Cos(), children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Cos::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Sin(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Sec::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Sec(), children[0]), + ExpressionTreeNode(new Operation::Tan(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Csc::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Csc(), children[0]), + ExpressionTreeNode(new Operation::Cot(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Tan::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Square(), + ExpressionTreeNode(new Operation::Sec(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Cot::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Square(), + ExpressionTreeNode(new Operation::Csc(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Asin::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Reciprocal(), + ExpressionTreeNode(new Operation::Sqrt(), + ExpressionTreeNode(new Operation::Subtract(), + ExpressionTreeNode(new Operation::Constant(1.0)), + ExpressionTreeNode(new Operation::Square(), children[0])))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Acos::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Reciprocal(), + ExpressionTreeNode(new Operation::Sqrt(), + ExpressionTreeNode(new Operation::Subtract(), + ExpressionTreeNode(new Operation::Constant(1.0)), + ExpressionTreeNode(new Operation::Square(), children[0]))))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Atan::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Reciprocal(), + ExpressionTreeNode(new Operation::AddConstant(1.0), + ExpressionTreeNode(new Operation::Square(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Sinh::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Cosh(), + children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Cosh::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Sinh(), + children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Tanh::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Subtract(), + ExpressionTreeNode(new Operation::Constant(1.0)), + ExpressionTreeNode(new Operation::Square(), + ExpressionTreeNode(new Operation::Tanh(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Erf::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Constant(2.0/sqrt(M_PI))), + ExpressionTreeNode(new Operation::Exp(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Square(), children[0])))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Erfc::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Constant(-2.0/sqrt(M_PI))), + ExpressionTreeNode(new Operation::Exp(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Square(), children[0])))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Step::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Constant(0.0)); +} + +ExpressionTreeNode Operation::Delta::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Constant(0.0)); +} + +ExpressionTreeNode Operation::Square::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::MultiplyConstant(2.0), + children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Cube::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::MultiplyConstant(3.0), + ExpressionTreeNode(new Operation::Square(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Reciprocal::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::Negate(), + ExpressionTreeNode(new Operation::Reciprocal(), + ExpressionTreeNode(new Operation::Square(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::AddConstant::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return childDerivs[0]; +} + +ExpressionTreeNode Operation::MultiplyConstant::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::MultiplyConstant(value), + childDerivs[0]); +} + +ExpressionTreeNode Operation::PowerConstant::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode(new Operation::MultiplyConstant(value), + ExpressionTreeNode(new Operation::PowerConstant(value-1), + children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Min::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + ExpressionTreeNode step(new Operation::Step(), + ExpressionTreeNode(new Operation::Subtract(), children[0], children[1])); + return ExpressionTreeNode(new Operation::Subtract(), + ExpressionTreeNode(new Operation::Multiply(), childDerivs[1], step), + ExpressionTreeNode(new Operation::Multiply(), childDerivs[0], + ExpressionTreeNode(new Operation::AddConstant(-1), step))); +} + +ExpressionTreeNode Operation::Max::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + ExpressionTreeNode step(new Operation::Step(), + ExpressionTreeNode(new Operation::Subtract(), children[0], children[1])); + return ExpressionTreeNode(new Operation::Subtract(), + ExpressionTreeNode(new Operation::Multiply(), childDerivs[0], step), + ExpressionTreeNode(new Operation::Multiply(), childDerivs[1], + ExpressionTreeNode(new Operation::AddConstant(-1), step))); +} + +ExpressionTreeNode Operation::Abs::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + ExpressionTreeNode step(new Operation::Step(), children[0]); + return ExpressionTreeNode(new Operation::Multiply(), + childDerivs[0], + ExpressionTreeNode(new Operation::AddConstant(-1), + ExpressionTreeNode(new Operation::MultiplyConstant(2), step))); +} + +ExpressionTreeNode Operation::Floor::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Constant(0.0)); +} + +ExpressionTreeNode Operation::Ceil::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + return ExpressionTreeNode(new Operation::Constant(0.0)); +} + +ExpressionTreeNode Operation::Select::differentiate(const std::vector& children, const std::vector& childDerivs, const std::string& variable) const { + vector derivChildren; + derivChildren.push_back(children[0]); + derivChildren.push_back(childDerivs[1]); + derivChildren.push_back(childDerivs[2]); + return ExpressionTreeNode(new Operation::Select(), derivChildren); +} diff --git a/lib/colvars/lepton/src/ParsedExpression.cpp b/lib/colvars/lepton/src/ParsedExpression.cpp new file mode 100644 index 0000000000..6effd06007 --- /dev/null +++ b/lib/colvars/lepton/src/ParsedExpression.cpp @@ -0,0 +1,351 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/ParsedExpression.h" +#include "lepton/CompiledExpression.h" +#include "lepton/ExpressionProgram.h" +#include "lepton/Operation.h" +#include +#include + +using namespace Lepton; +using namespace std; + +ParsedExpression::ParsedExpression() : rootNode(ExpressionTreeNode()) { +} + +ParsedExpression::ParsedExpression(const ExpressionTreeNode& rootNode) : rootNode(rootNode) { +} + +const ExpressionTreeNode& ParsedExpression::getRootNode() const { + if (&rootNode.getOperation() == NULL) + throw Exception("Illegal call to an initialized ParsedExpression"); + return rootNode; +} + +double ParsedExpression::evaluate() const { + return evaluate(getRootNode(), map()); +} + +double ParsedExpression::evaluate(const map& variables) const { + return evaluate(getRootNode(), variables); +} + +double ParsedExpression::evaluate(const ExpressionTreeNode& node, const map& variables) { + int numArgs = (int) node.getChildren().size(); + vector args(max(numArgs, 1)); + for (int i = 0; i < numArgs; i++) + args[i] = evaluate(node.getChildren()[i], variables); + return node.getOperation().evaluate(&args[0], variables); +} + +ParsedExpression ParsedExpression::optimize() const { + ExpressionTreeNode result = precalculateConstantSubexpressions(getRootNode()); + while (true) { + ExpressionTreeNode simplified = substituteSimplerExpression(result); + if (simplified == result) + break; + result = simplified; + } + return ParsedExpression(result); +} + +ParsedExpression ParsedExpression::optimize(const map& variables) const { + ExpressionTreeNode result = preevaluateVariables(getRootNode(), variables); + result = precalculateConstantSubexpressions(result); + while (true) { + ExpressionTreeNode simplified = substituteSimplerExpression(result); + if (simplified == result) + break; + result = simplified; + } + return ParsedExpression(result); +} + +ExpressionTreeNode ParsedExpression::preevaluateVariables(const ExpressionTreeNode& node, const map& variables) { + if (node.getOperation().getId() == Operation::VARIABLE) { + const Operation::Variable& var = dynamic_cast(node.getOperation()); + map::const_iterator iter = variables.find(var.getName()); + if (iter == variables.end()) + return node; + return ExpressionTreeNode(new Operation::Constant(iter->second)); + } + vector children(node.getChildren().size()); + for (int i = 0; i < (int) children.size(); i++) + children[i] = preevaluateVariables(node.getChildren()[i], variables); + return ExpressionTreeNode(node.getOperation().clone(), children); +} + +ExpressionTreeNode ParsedExpression::precalculateConstantSubexpressions(const ExpressionTreeNode& node) { + vector children(node.getChildren().size()); + for (int i = 0; i < (int) children.size(); i++) + children[i] = precalculateConstantSubexpressions(node.getChildren()[i]); + ExpressionTreeNode result = ExpressionTreeNode(node.getOperation().clone(), children); + if (node.getOperation().getId() == Operation::VARIABLE || node.getOperation().getId() == Operation::CUSTOM) + return result; + for (int i = 0; i < (int) children.size(); i++) + if (children[i].getOperation().getId() != Operation::CONSTANT) + return result; + return ExpressionTreeNode(new Operation::Constant(evaluate(result, map()))); +} + +ExpressionTreeNode ParsedExpression::substituteSimplerExpression(const ExpressionTreeNode& node) { + vector children(node.getChildren().size()); + for (int i = 0; i < (int) children.size(); i++) + children[i] = substituteSimplerExpression(node.getChildren()[i]); + switch (node.getOperation().getId()) { + case Operation::ADD: + { + double first = getConstantValue(children[0]); + double second = getConstantValue(children[1]); + if (first == 0.0) // Add 0 + return children[1]; + if (second == 0.0) // Add 0 + return children[0]; + if (first == first) // Add a constant + return ExpressionTreeNode(new Operation::AddConstant(first), children[1]); + if (second == second) // Add a constant + return ExpressionTreeNode(new Operation::AddConstant(second), children[0]); + if (children[1].getOperation().getId() == Operation::NEGATE) // a+(-b) = a-b + return ExpressionTreeNode(new Operation::Subtract(), children[0], children[1].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::NEGATE) // (-a)+b = b-a + return ExpressionTreeNode(new Operation::Subtract(), children[1], children[0].getChildren()[0]); + break; + } + case Operation::SUBTRACT: + { + if (children[0] == children[1]) + return ExpressionTreeNode(new Operation::Constant(0.0)); // Subtracting anything from itself is 0 + double first = getConstantValue(children[0]); + if (first == 0.0) // Subtract from 0 + return ExpressionTreeNode(new Operation::Negate(), children[1]); + double second = getConstantValue(children[1]); + if (second == 0.0) // Subtract 0 + return children[0]; + if (second == second) // Subtract a constant + return ExpressionTreeNode(new Operation::AddConstant(-second), children[0]); + if (children[1].getOperation().getId() == Operation::NEGATE) // a-(-b) = a+b + return ExpressionTreeNode(new Operation::Add(), children[0], children[1].getChildren()[0]); + break; + } + case Operation::MULTIPLY: + { + double first = getConstantValue(children[0]); + double second = getConstantValue(children[1]); + if (first == 0.0 || second == 0.0) // Multiply by 0 + return ExpressionTreeNode(new Operation::Constant(0.0)); + if (first == 1.0) // Multiply by 1 + return children[1]; + if (second == 1.0) // Multiply by 1 + return children[0]; + if (children[0].getOperation().getId() == Operation::CONSTANT) { // Multiply by a constant + if (children[1].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Combine two multiplies into a single one + return ExpressionTreeNode(new Operation::MultiplyConstant(first*dynamic_cast(&children[1].getOperation())->getValue()), children[1].getChildren()[0]); + return ExpressionTreeNode(new Operation::MultiplyConstant(first), children[1]); + } + if (children[1].getOperation().getId() == Operation::CONSTANT) { // Multiply by a constant + if (children[0].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Combine two multiplies into a single one + return ExpressionTreeNode(new Operation::MultiplyConstant(second*dynamic_cast(&children[0].getOperation())->getValue()), children[0].getChildren()[0]); + return ExpressionTreeNode(new Operation::MultiplyConstant(second), children[0]); + } + if (children[0].getOperation().getId() == Operation::NEGATE && children[1].getOperation().getId() == Operation::NEGATE) // The two negations cancel + return ExpressionTreeNode(new Operation::Multiply(), children[0].getChildren()[0], children[1].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::NEGATE && children[1].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Negate the constant + return ExpressionTreeNode(new Operation::Multiply(), children[0].getChildren()[0], ExpressionTreeNode(new Operation::MultiplyConstant(-dynamic_cast(&children[1].getOperation())->getValue()), children[1].getChildren()[0])); + if (children[1].getOperation().getId() == Operation::NEGATE && children[0].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Negate the constant + return ExpressionTreeNode(new Operation::Multiply(), ExpressionTreeNode(new Operation::MultiplyConstant(-dynamic_cast(&children[0].getOperation())->getValue()), children[0].getChildren()[0]), children[1].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::NEGATE) // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Multiply(), children[0].getChildren()[0], children[1])); + if (children[1].getOperation().getId() == Operation::NEGATE) // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Multiply(), children[0], children[1].getChildren()[0])); + if (children[1].getOperation().getId() == Operation::RECIPROCAL) // a*(1/b) = a/b + return ExpressionTreeNode(new Operation::Divide(), children[0], children[1].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::RECIPROCAL) // (1/a)*b = b/a + return ExpressionTreeNode(new Operation::Divide(), children[1], children[0].getChildren()[0]); + if (children[0] == children[1]) + return ExpressionTreeNode(new Operation::Square(), children[0]); // x*x = square(x) + if (children[0].getOperation().getId() == Operation::SQUARE && children[0].getChildren()[0] == children[1]) + return ExpressionTreeNode(new Operation::Cube(), children[1]); // x*x*x = cube(x) + if (children[1].getOperation().getId() == Operation::SQUARE && children[1].getChildren()[0] == children[0]) + return ExpressionTreeNode(new Operation::Cube(), children[0]); // x*x*x = cube(x) + break; + } + case Operation::DIVIDE: + { + if (children[0] == children[1]) + return ExpressionTreeNode(new Operation::Constant(1.0)); // Dividing anything from itself is 0 + double numerator = getConstantValue(children[0]); + if (numerator == 0.0) // 0 divided by something + return ExpressionTreeNode(new Operation::Constant(0.0)); + if (numerator == 1.0) // 1 divided by something + return ExpressionTreeNode(new Operation::Reciprocal(), children[1]); + double denominator = getConstantValue(children[1]); + if (denominator == 1.0) // Divide by 1 + return children[0]; + if (children[1].getOperation().getId() == Operation::CONSTANT) { + if (children[0].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Combine a multiply and a divide into one multiply + return ExpressionTreeNode(new Operation::MultiplyConstant(dynamic_cast(&children[0].getOperation())->getValue()/denominator), children[0].getChildren()[0]); + return ExpressionTreeNode(new Operation::MultiplyConstant(1.0/denominator), children[0]); // Replace a divide with a multiply + } + if (children[0].getOperation().getId() == Operation::NEGATE && children[1].getOperation().getId() == Operation::NEGATE) // The two negations cancel + return ExpressionTreeNode(new Operation::Divide(), children[0].getChildren()[0], children[1].getChildren()[0]); + if (children[1].getOperation().getId() == Operation::NEGATE && children[0].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Negate the constant + return ExpressionTreeNode(new Operation::Divide(), ExpressionTreeNode(new Operation::MultiplyConstant(-dynamic_cast(&children[0].getOperation())->getValue()), children[0].getChildren()[0]), children[1].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::NEGATE) // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Divide(), children[0].getChildren()[0], children[1])); + if (children[1].getOperation().getId() == Operation::NEGATE) // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Divide(), children[0], children[1].getChildren()[0])); + if (children[1].getOperation().getId() == Operation::RECIPROCAL) // a/(1/b) = a*b + return ExpressionTreeNode(new Operation::Multiply(), children[0], children[1].getChildren()[0]); + break; + } + case Operation::POWER: + { + double base = getConstantValue(children[0]); + if (base == 0.0) // 0 to any power is 0 + return ExpressionTreeNode(new Operation::Constant(0.0)); + if (base == 1.0) // 1 to any power is 1 + return ExpressionTreeNode(new Operation::Constant(1.0)); + double exponent = getConstantValue(children[1]); + if (exponent == 0.0) // x^0 = 1 + return ExpressionTreeNode(new Operation::Constant(1.0)); + if (exponent == 1.0) // x^1 = x + return children[0]; + if (exponent == -1.0) // x^-1 = recip(x) + return ExpressionTreeNode(new Operation::Reciprocal(), children[0]); + if (exponent == 2.0) // x^2 = square(x) + return ExpressionTreeNode(new Operation::Square(), children[0]); + if (exponent == 3.0) // x^3 = cube(x) + return ExpressionTreeNode(new Operation::Cube(), children[0]); + if (exponent == 0.5) // x^0.5 = sqrt(x) + return ExpressionTreeNode(new Operation::Sqrt(), children[0]); + if (exponent == exponent) // Constant power + return ExpressionTreeNode(new Operation::PowerConstant(exponent), children[0]); + break; + } + case Operation::NEGATE: + { + if (children[0].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Combine a multiply and a negate into a single multiply + return ExpressionTreeNode(new Operation::MultiplyConstant(-dynamic_cast(&children[0].getOperation())->getValue()), children[0].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::CONSTANT) // Negate a constant + return ExpressionTreeNode(new Operation::Constant(-getConstantValue(children[0]))); + if (children[0].getOperation().getId() == Operation::NEGATE) // The two negations cancel + return children[0].getChildren()[0]; + break; + } + case Operation::MULTIPLY_CONSTANT: + { + if (children[0].getOperation().getId() == Operation::MULTIPLY_CONSTANT) // Combine two multiplies into a single one + return ExpressionTreeNode(new Operation::MultiplyConstant(dynamic_cast(&node.getOperation())->getValue()*dynamic_cast(&children[0].getOperation())->getValue()), children[0].getChildren()[0]); + if (children[0].getOperation().getId() == Operation::CONSTANT) // Multiply two constants + return ExpressionTreeNode(new Operation::Constant(dynamic_cast(&node.getOperation())->getValue()*getConstantValue(children[0]))); + if (children[0].getOperation().getId() == Operation::NEGATE) // Combine a multiply and a negate into a single multiply + return ExpressionTreeNode(new Operation::MultiplyConstant(-dynamic_cast(&node.getOperation())->getValue()), children[0].getChildren()[0]); + break; + } + default: + { + // If operation ID is not one of the above, + // we don't substitute a simpler expression. + break; + } + + } + return ExpressionTreeNode(node.getOperation().clone(), children); +} + +ParsedExpression ParsedExpression::differentiate(const string& variable) const { + return differentiate(getRootNode(), variable); +} + +ExpressionTreeNode ParsedExpression::differentiate(const ExpressionTreeNode& node, const string& variable) { + vector childDerivs(node.getChildren().size()); + for (int i = 0; i < (int) childDerivs.size(); i++) + childDerivs[i] = differentiate(node.getChildren()[i], variable); + return node.getOperation().differentiate(node.getChildren(),childDerivs, variable); +} + +double ParsedExpression::getConstantValue(const ExpressionTreeNode& node) { + if (node.getOperation().getId() == Operation::CONSTANT) + return dynamic_cast(node.getOperation()).getValue(); + return numeric_limits::quiet_NaN(); +} + +ExpressionProgram ParsedExpression::createProgram() const { + return ExpressionProgram(*this); +} + +CompiledExpression ParsedExpression::createCompiledExpression() const { + return CompiledExpression(*this); +} + +ParsedExpression ParsedExpression::renameVariables(const map& replacements) const { + return ParsedExpression(renameNodeVariables(getRootNode(), replacements)); +} + +ExpressionTreeNode ParsedExpression::renameNodeVariables(const ExpressionTreeNode& node, const map& replacements) { + if (node.getOperation().getId() == Operation::VARIABLE) { + map::const_iterator replace = replacements.find(node.getOperation().getName()); + if (replace != replacements.end()) + return ExpressionTreeNode(new Operation::Variable(replace->second)); + } + vector children; + for (int i = 0; i < (int) node.getChildren().size(); i++) + children.push_back(renameNodeVariables(node.getChildren()[i], replacements)); + return ExpressionTreeNode(node.getOperation().clone(), children); +} + +ostream& Lepton::operator<<(ostream& out, const ExpressionTreeNode& node) { + if (node.getOperation().isInfixOperator() && node.getChildren().size() == 2) { + out << "(" << node.getChildren()[0] << ")" << node.getOperation().getName() << "(" << node.getChildren()[1] << ")"; + } + else if (node.getOperation().isInfixOperator() && node.getChildren().size() == 1) { + out << "(" << node.getChildren()[0] << ")" << node.getOperation().getName(); + } + else { + out << node.getOperation().getName(); + if (node.getChildren().size() > 0) { + out << "("; + for (int i = 0; i < (int) node.getChildren().size(); i++) { + if (i > 0) + out << ", "; + out << node.getChildren()[i]; + } + out << ")"; + } + } + return out; +} + +ostream& Lepton::operator<<(ostream& out, const ParsedExpression& exp) { + out << exp.getRootNode(); + return out; +} diff --git a/lib/colvars/lepton/src/Parser.cpp b/lib/colvars/lepton/src/Parser.cpp new file mode 100644 index 0000000000..6b19d7370d --- /dev/null +++ b/lib/colvars/lepton/src/Parser.cpp @@ -0,0 +1,406 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2015 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "lepton/Parser.h" +#include "lepton/CustomFunction.h" +#include "lepton/Exception.h" +#include "lepton/ExpressionTreeNode.h" +#include "lepton/Operation.h" +#include "lepton/ParsedExpression.h" +#include +#include + +using namespace Lepton; +using namespace std; + +static const string Digits = "0123456789"; +static const string Operators = "+-*/^"; +static const bool LeftAssociative[] = {true, true, true, true, false}; +static const int Precedence[] = {0, 0, 1, 1, 3}; +static const Operation::Id OperationId[] = {Operation::ADD, Operation::SUBTRACT, Operation::MULTIPLY, Operation::DIVIDE, Operation::POWER}; + +class Lepton::ParseToken { +public: + enum Type {Number, Operator, Variable, Function, LeftParen, RightParen, Comma, Whitespace}; + + ParseToken(string text, Type type) : text(text), type(type) { + } + const string& getText() const { + return text; + } + Type getType() const { + return type; + } +private: + string text; + Type type; +}; + +string Parser::trim(const string& expression) { + // Remove leading and trailing spaces. + + int start, end; + for (start = 0; start < (int) expression.size() && isspace(expression[start]); start++) + ; + for (end = (int) expression.size()-1; end > start && isspace(expression[end]); end--) + ; + if (start == end && isspace(expression[end])) + return ""; + return expression.substr(start, end-start+1); +} + +ParseToken Parser::getNextToken(const string& expression, int start) { + char c = expression[start]; + if (c == '(') + return ParseToken("(", ParseToken::LeftParen); + if (c == ')') + return ParseToken(")", ParseToken::RightParen); + if (c == ',') + return ParseToken(",", ParseToken::Comma); + if (Operators.find(c) != string::npos) + return ParseToken(string(1, c), ParseToken::Operator); + if (isspace(c)) { + // White space + + for (int pos = start+1; pos < (int) expression.size(); pos++) { + if (!isspace(expression[pos])) + return ParseToken(expression.substr(start, pos-start), ParseToken::Whitespace); + } + return ParseToken(expression.substr(start, string::npos), ParseToken::Whitespace); + } + if (c == '.' || Digits.find(c) != string::npos) { + // A number + + bool foundDecimal = (c == '.'); + bool foundExp = false; + int pos; + for (pos = start+1; pos < (int) expression.size(); pos++) { + c = expression[pos]; + if (Digits.find(c) != string::npos) + continue; + if (c == '.' && !foundDecimal) { + foundDecimal = true; + continue; + } + if ((c == 'e' || c == 'E') && !foundExp) { + foundExp = true; + if (pos < (int) expression.size()-1 && (expression[pos+1] == '-' || expression[pos+1] == '+')) + pos++; + continue; + } + break; + } + return ParseToken(expression.substr(start, pos-start), ParseToken::Number); + } + + // A variable, function, or left parenthesis + + for (int pos = start; pos < (int) expression.size(); pos++) { + c = expression[pos]; + if (c == '(') + return ParseToken(expression.substr(start, pos-start+1), ParseToken::Function); + if (Operators.find(c) != string::npos || c == ',' || c == ')' || isspace(c)) + return ParseToken(expression.substr(start, pos-start), ParseToken::Variable); + } + return ParseToken(expression.substr(start, string::npos), ParseToken::Variable); +} + +vector Parser::tokenize(const string& expression) { + vector tokens; + int pos = 0; + while (pos < (int) expression.size()) { + ParseToken token = getNextToken(expression, pos); + if (token.getType() != ParseToken::Whitespace) + tokens.push_back(token); + pos += (int) token.getText().size(); + } + return tokens; +} + +ParsedExpression Parser::parse(const string& expression) { + return parse(expression, map()); +} + +ParsedExpression Parser::parse(const string& expression, const map& customFunctions) { + try { + // First split the expression into subexpressions. + + string primaryExpression = expression; + vector subexpressions; + while (true) { + string::size_type pos = primaryExpression.find_last_of(';'); + if (pos == string::npos) + break; + string sub = trim(primaryExpression.substr(pos+1)); + if (sub.size() > 0) + subexpressions.push_back(sub); + primaryExpression = primaryExpression.substr(0, pos); + } + + // Parse the subexpressions. + + map subexpDefs; + for (int i = 0; i < (int) subexpressions.size(); i++) { + string::size_type equalsPos = subexpressions[i].find('='); + if (equalsPos == string::npos) + throw Exception("subexpression does not specify a name"); + string name = trim(subexpressions[i].substr(0, equalsPos)); + if (name.size() == 0) + throw Exception("subexpression does not specify a name"); + vector tokens = tokenize(subexpressions[i].substr(equalsPos+1)); + int pos = 0; + subexpDefs[name] = parsePrecedence(tokens, pos, customFunctions, subexpDefs, 0); + if (pos != tokens.size()) + throw Exception("unexpected text at end of subexpression: "+tokens[pos].getText()); + } + + // Now parse the primary expression. + + vector tokens = tokenize(primaryExpression); + int pos = 0; + ExpressionTreeNode result = parsePrecedence(tokens, pos, customFunctions, subexpDefs, 0); + if (pos != tokens.size()) + throw Exception("unexpected text at end of expression: "+tokens[pos].getText()); + return ParsedExpression(result); + } + catch (Exception& ex) { + throw Exception("Parse error in expression \""+expression+"\": "+ex.what()); + } +} + +ExpressionTreeNode Parser::parsePrecedence(const vector& tokens, int& pos, const map& customFunctions, + const map& subexpressionDefs, int precedence) { + if (pos == tokens.size()) + throw Exception("unexpected end of expression"); + + // Parse the next value (number, variable, function, parenthesized expression) + + ParseToken token = tokens[pos]; + ExpressionTreeNode result; + if (token.getType() == ParseToken::Number) { + double value; + stringstream(token.getText()) >> value; + result = ExpressionTreeNode(new Operation::Constant(value)); + pos++; + } + else if (token.getType() == ParseToken::Variable) { + map::const_iterator subexp = subexpressionDefs.find(token.getText()); + if (subexp == subexpressionDefs.end()) { + Operation* op = new Operation::Variable(token.getText()); + result = ExpressionTreeNode(op); + } + else + result = subexp->second; + pos++; + } + else if (token.getType() == ParseToken::LeftParen) { + pos++; + result = parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, 0); + if (pos == tokens.size() || tokens[pos].getType() != ParseToken::RightParen) + throw Exception("unbalanced parentheses"); + pos++; + } + else if (token.getType() == ParseToken::Function) { + pos++; + vector args; + bool moreArgs; + do { + args.push_back(parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, 0)); + moreArgs = (pos < (int) tokens.size() && tokens[pos].getType() == ParseToken::Comma); + if (moreArgs) + pos++; + } while (moreArgs); + if (pos == tokens.size() || tokens[pos].getType() != ParseToken::RightParen) + throw Exception("unbalanced parentheses"); + pos++; + Operation* op = getFunctionOperation(token.getText(), customFunctions); + try { + result = ExpressionTreeNode(op, args); + } + catch (...) { + delete op; + throw; + } + } + else if (token.getType() == ParseToken::Operator && token.getText() == "-") { + pos++; + ExpressionTreeNode toNegate = parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, 2); + result = ExpressionTreeNode(new Operation::Negate(), toNegate); + } + else + throw Exception("unexpected token: "+token.getText()); + + // Now deal with the next binary operator. + + while (pos < (int) tokens.size() && tokens[pos].getType() == ParseToken::Operator) { + token = tokens[pos]; + int opIndex = (int) Operators.find(token.getText()); + int opPrecedence = Precedence[opIndex]; + if (opPrecedence < precedence) + return result; + pos++; + ExpressionTreeNode arg = parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, LeftAssociative[opIndex] ? opPrecedence+1 : opPrecedence); + Operation* op = getOperatorOperation(token.getText()); + try { + result = ExpressionTreeNode(op, result, arg); + } + catch (...) { + delete op; + throw; + } + } + return result; +} + +Operation* Parser::getOperatorOperation(const std::string& name) { + switch (OperationId[Operators.find(name)]) { + case Operation::ADD: + return new Operation::Add(); + case Operation::SUBTRACT: + return new Operation::Subtract(); + case Operation::MULTIPLY: + return new Operation::Multiply(); + case Operation::DIVIDE: + return new Operation::Divide(); + case Operation::POWER: + return new Operation::Power(); + default: + throw Exception("unknown operator"); + } +} + +Operation* Parser::getFunctionOperation(const std::string& name, const map& customFunctions) { + + static map opMap; + if (opMap.size() == 0) { + opMap["sqrt"] = Operation::SQRT; + opMap["exp"] = Operation::EXP; + opMap["log"] = Operation::LOG; + opMap["sin"] = Operation::SIN; + opMap["cos"] = Operation::COS; + opMap["sec"] = Operation::SEC; + opMap["csc"] = Operation::CSC; + opMap["tan"] = Operation::TAN; + opMap["cot"] = Operation::COT; + opMap["asin"] = Operation::ASIN; + opMap["acos"] = Operation::ACOS; + opMap["atan"] = Operation::ATAN; + opMap["sinh"] = Operation::SINH; + opMap["cosh"] = Operation::COSH; + opMap["tanh"] = Operation::TANH; + opMap["erf"] = Operation::ERF; + opMap["erfc"] = Operation::ERFC; + opMap["step"] = Operation::STEP; + opMap["delta"] = Operation::DELTA; + opMap["square"] = Operation::SQUARE; + opMap["cube"] = Operation::CUBE; + opMap["recip"] = Operation::RECIPROCAL; + opMap["min"] = Operation::MIN; + opMap["max"] = Operation::MAX; + opMap["abs"] = Operation::ABS; + opMap["floor"] = Operation::FLOOR; + opMap["ceil"] = Operation::CEIL; + opMap["select"] = Operation::SELECT; + } + string trimmed = name.substr(0, name.size()-1); + + // First check custom functions. + + map::const_iterator custom = customFunctions.find(trimmed); + if (custom != customFunctions.end()) + return new Operation::Custom(trimmed, custom->second->clone()); + + // Now try standard functions. + + map::const_iterator iter = opMap.find(trimmed); + if (iter == opMap.end()) + throw Exception("unknown function: "+trimmed); + switch (iter->second) { + case Operation::SQRT: + return new Operation::Sqrt(); + case Operation::EXP: + return new Operation::Exp(); + case Operation::LOG: + return new Operation::Log(); + case Operation::SIN: + return new Operation::Sin(); + case Operation::COS: + return new Operation::Cos(); + case Operation::SEC: + return new Operation::Sec(); + case Operation::CSC: + return new Operation::Csc(); + case Operation::TAN: + return new Operation::Tan(); + case Operation::COT: + return new Operation::Cot(); + case Operation::ASIN: + return new Operation::Asin(); + case Operation::ACOS: + return new Operation::Acos(); + case Operation::ATAN: + return new Operation::Atan(); + case Operation::SINH: + return new Operation::Sinh(); + case Operation::COSH: + return new Operation::Cosh(); + case Operation::TANH: + return new Operation::Tanh(); + case Operation::ERF: + return new Operation::Erf(); + case Operation::ERFC: + return new Operation::Erfc(); + case Operation::STEP: + return new Operation::Step(); + case Operation::DELTA: + return new Operation::Delta(); + case Operation::SQUARE: + return new Operation::Square(); + case Operation::CUBE: + return new Operation::Cube(); + case Operation::RECIPROCAL: + return new Operation::Reciprocal(); + case Operation::MIN: + return new Operation::Min(); + case Operation::MAX: + return new Operation::Max(); + case Operation::ABS: + return new Operation::Abs(); + case Operation::FLOOR: + return new Operation::Floor(); + case Operation::CEIL: + return new Operation::Ceil(); + case Operation::SELECT: + return new Operation::Select(); + default: + throw Exception("unknown function"); + } +} diff --git a/lib/gpu/.gitignore b/lib/gpu/.gitignore index 228a9f7731..7b5254e480 100644 --- a/lib/gpu/.gitignore +++ b/lib/gpu/.gitignore @@ -1,4 +1,7 @@ -obj -obj_ocl -ocl_get_devices -nvc_get_devices +/obj +/obj_ocl +/ocl_get_devices +/nvc_get_devices +/*.cubin +/*_cubin.h +/*_cl.h diff --git a/lib/gpu/Install.py b/lib/gpu/Install.py index d396be5e1a..13d7ad157e 100644 --- a/lib/gpu/Install.py +++ b/lib/gpu/Install.py @@ -3,44 +3,57 @@ # Install.py tool to build the GPU library # used to automate the steps described in the README file in this dir -import sys,os,re,commands +from __future__ import print_function +import sys,os,subprocess # help message help = """ -Syntax: python Install.py -i isuffix -h hdir -a arch -p precision -e esuffix -m -o osuffix - specify one or more options, order does not matter - copies an existing Makefile.isuffix in lib/gpu to Makefile.auto - optionally edits these variables in Makefile.auto: - CUDA_HOME, CUDA_ARCH, CUDA_PRECISION, EXTRAMAKE - optionally uses Makefile.auto to build the GPU library -> libgpu.a - and to copy a Makefile.lammps.esuffix -> Makefile.lammps - optionally copies Makefile.auto to a new Makefile.osuffix +Syntax from src dir: make lib-gpu args="-m machine -h hdir -a arch -p precision -e esuffix -b -o osuffix" +Syntax from lib dir: python Install.py -m machine -h hdir -a arch -p precision -e esuffix -b -o osuffix - -i = use Makefile.isuffix as starting point, copy to Makefile.auto - default isuffix = linux +specify one or more options, order does not matter + +copies an existing Makefile.machine in lib/gpu to Makefile.auto +optionally edits these variables in Makefile.auto: + CUDA_HOME, CUDA_ARCH, CUDA_PRECISION, EXTRAMAKE +optionally uses Makefile.auto to build the GPU library -> libgpu.a + and to copy a Makefile.lammps.esuffix -> Makefile.lammps +optionally copies Makefile.auto to a new Makefile.osuffix + + -m = use Makefile.machine as starting point, copy to Makefile.auto + default machine = linux -h = set CUDA_HOME variable in Makefile.auto to hdir hdir = path to NVIDIA Cuda software, e.g. /usr/local/cuda -a = set CUDA_ARCH variable in Makefile.auto to arch - use arch = ?? for K40 (Tesla) - use arch = 37 for dual K80 (Tesla) - use arch = 60 for P100 (Pascal) + use arch = 20 for Tesla C2050/C2070 (Fermi) (deprecated as of CUDA 8.0) + or GeForce GTX 580 or similar + use arch = 30 for Tesla K10 (Kepler) + use arch = 35 for Tesla K40 (Kepler) or GeForce GTX Titan or similar + use arch = 37 for Tesla dual K80 (Kepler) + use arch = 60 for Tesla P100 (Pascal) -p = set CUDA_PRECISION variable in Makefile.auto to precision use precision = double or mixed or single -e = set EXTRAMAKE variable in Makefile.auto to Makefile.lammps.esuffix - -m = make the GPU library using Makefile.auto + -b = make the GPU library using Makefile.auto first performs a "make clean" - produces libgpu.a if successful + then produces libgpu.a if successful also copies EXTRAMAKE file -> Makefile.lammps -e can set which Makefile.lammps.esuffix file is copied -o = copy final Makefile.auto to Makefile.osuffix + +Examples: + +make lib-gpu args="-b" # build GPU lib with default Makefile.linux +make lib-gpu args="-m xk7 -p single -o xk7.single" # create new Makefile.xk7.single, altered for single-precision +make lib-gpu args="-m mpi -a 35 -p single -o mpi.mixed -b" # create new Makefile.mpi.mixed, also build GPU lib with these settings """ # print error message or help def error(str=None): - if not str: print help - else: print "ERROR",str + if not str: print(help) + else: print("ERROR",str) sys.exit() # parse args @@ -56,7 +69,7 @@ outflag = 0 iarg = 0 while iarg < nargs: - if args[iarg] == "-i": + if args[iarg] == "-m": if iarg+2 > nargs: error() isuffix = args[iarg+1] iarg += 2 @@ -80,7 +93,7 @@ while iarg < nargs: eflag = 1 lmpsuffix = args[iarg+1] iarg += 2 - elif args[iarg] == "-m": + elif args[iarg] == "-b": makeflag = 1 iarg += 1 elif args[iarg] == "-o": @@ -95,10 +108,10 @@ if pflag: elif precision == "mixed": precstr = "-D_SINGLE_DOUBLE" elif precision == "single": precstr = "-D_SINGLE_SINGLE" else: error("Invalid precision setting") - + # create Makefile.auto # reset EXTRAMAKE, CUDA_HOME, CUDA_ARCH, CUDA_PRECISION if requested - + if not os.path.exists("Makefile.%s" % isuffix): error("lib/gpu/Makefile.%s does not exist" % isuffix) @@ -108,9 +121,9 @@ fp = open("Makefile.auto",'w') for line in lines: words = line.split() if len(words) != 3: - print >>fp,line, + fp.write(line) continue - + if hflag and words[0] == "CUDA_HOME" and words[1] == '=': line = line.replace(words[2],hdir) if aflag and words[0] == "CUDA_ARCH" and words[1] == '=': @@ -119,20 +132,20 @@ for line in lines: line = line.replace(words[2],precstr) if eflag and words[0] == "EXTRAMAKE" and words[1] == '=': line = line.replace(words[2],"Makefile.lammps.%s" % lmpsuffix) - - print >>fp,line, + fp.write(line) fp.close() # perform make # make operations copies EXTRAMAKE file to Makefile.lammps if makeflag: - print "Building libgpu.a ..." + print("Building libgpu.a ...") cmd = "rm -f libgpu.a" - commands.getoutput(cmd) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) cmd = "make -f Makefile.auto clean; make -f Makefile.auto" - commands.getoutput(cmd) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + print(txt.decode('UTF-8')) if not os.path.exists("libgpu.a"): error("Build of lib/gpu/libgpu.a was NOT successful") if not os.path.exists("Makefile.lammps"): @@ -141,6 +154,6 @@ if makeflag: # copy new Makefile.auto to Makefile.osuffix if outflag: - print "Creating new Makefile.%s" % osuffix + print("Creating new Makefile.%s" % osuffix) cmd = "cp Makefile.auto Makefile.%s" % osuffix - commands.getoutput(cmd) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) diff --git a/lib/gpu/Makefile.linux b/lib/gpu/Makefile.linux index d72c0ba437..ed5b6092d3 100644 --- a/lib/gpu/Makefile.linux +++ b/lib/gpu/Makefile.linux @@ -35,9 +35,9 @@ CUDA_PRECISION = -D_SINGLE_DOUBLE CUDA_INCLUDE = -I$(CUDA_HOME)/include CUDA_LIB = -L$(CUDA_HOME)/lib64 -CUDA_OPTS = -DUNIX -O3 -Xptxas -v --use_fast_math $(LMP_INC) +CUDA_OPTS = -DUNIX -O3 -Xptxas -v --use_fast_math $(LMP_INC) -Xcompiler -fPIC -CUDR_CPP = mpic++ -DMPI_GERYON -DUCL_NO_EXIT -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 -fPIC +CUDR_CPP = mpicxx -DMPI_GERYON -DUCL_NO_EXIT -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 -fPIC CUDR_OPTS = -O2 $(LMP_INC) # -xHost -no-prec-div -ansi-alias BIN_DIR = ./ diff --git a/lib/gpu/Makefile.mingw32-cross b/lib/gpu/Makefile.mingw32-cross deleted file mode 100644 index 6f77634755..0000000000 --- a/lib/gpu/Makefile.mingw32-cross +++ /dev/null @@ -1,17 +0,0 @@ -CUDA_HOME = ../../tools/mingw-cross/OpenCL - -OCL_CPP = i686-w64-mingw32-g++ -O2 -march=i686 -mtune=generic -mfpmath=387 \ - -mpc64 -DMPI_GERYON -DUCL_NO_EXIT -I../../src/STUBS \ - -I$(CUDA_HOME)/include -OCL_LINK = -static -Wl,--enable-stdcall-fixup -L$(CUDA_HOME)/../Obj_mingw32 -Wl,-Bdynamic,-lOpenCL,-Bstatic -L../../src/STUBS -lmpi_mingw32 -OCL_PREC = -D_SINGLE_DOUBLE -OCL_TUNE = -DFERMI_OCL -EXTRAMAKE = Makefile.lammps.mingw-cross - -BIN_DIR = Obj_mingw32 -OBJ_DIR = Obj_mingw32 -LIB_DIR = Obj_mingw32 -AR = i686-w64-mingw32-ar -BSH = /bin/sh - -include Opencl.makefile diff --git a/lib/gpu/Makefile.mingw32-cross-mpi b/lib/gpu/Makefile.mingw32-cross-mpi deleted file mode 100644 index 94099cd90b..0000000000 --- a/lib/gpu/Makefile.mingw32-cross-mpi +++ /dev/null @@ -1,19 +0,0 @@ -CUDA_HOME = ../../tools/mingw-cross/OpenCL - -OCL_CPP = i686-w64-mingw32-g++ -O2 -march=i686 -mtune=generic -mfpmath=387 \ - -mpc64 -DMPI_GERYON -DUCL_NO_EXIT -I$(CUDA_HOME)/include \ - -I../../tools/mingw-cross/mpich2-win32/include/ \ - -DMPICH_IGNORE_CXX_SEEK -OCL_LINK = -static -Wl,--enable-stdcall-fixup -L$(CUDA_HOME)/../Obj_mingw32 -Wl,-Bdynamic,-lOpenCL,-Bstatic \ - -L../../tools/mingw-cross/mpich2-win32/lib -lmpi -OCL_PREC = -D_SINGLE_DOUBLE -OCL_TUNE = -DFERMI_OCL -EXTRAMAKE = Makefile.lammps.mingw-cross - -BIN_DIR = Obj_mingw32-mpi -OBJ_DIR = Obj_mingw32-mpi -LIB_DIR = Obj_mingw32-mpi -AR = i686-w64-mingw32-ar -BSH = /bin/sh - -include Opencl.makefile diff --git a/lib/gpu/Makefile.mingw64-cross b/lib/gpu/Makefile.mingw64-cross deleted file mode 100644 index 54f6af8c65..0000000000 --- a/lib/gpu/Makefile.mingw64-cross +++ /dev/null @@ -1,18 +0,0 @@ -CUDA_HOME = ../../tools/mingw-cross/OpenCL - -OCL_CPP = x86_64-w64-mingw32-g++ -O3 -march=core2 -mtune=core2 -mpc64 \ - -msse2 -DMPI_GERYON -DUCL_NO_EXIT -I../../src/STUBS \ - -I$(CUDA_HOME)/include -OCL_LINK = -static -Wl,--enable-stdcall-fixup -L$(CUDA_HOME)/../Obj_mingw64 -Wl,-Bdynamic,-lOpenCL,-Bstatic \ - -L../../src/STUBS -lmpi_mingw64 -OCL_PREC = -D_SINGLE_DOUBLE -OCL_TUNE = -DFERMI_OCL -EXTRAMAKE = Makefile.lammps.mingw-cross - -BIN_DIR = Obj_mingw64 -OBJ_DIR = Obj_mingw64 -LIB_DIR = Obj_mingw64 -AR = x86_64-w64-mingw32-ar -BSH = /bin/sh - -include Opencl.makefile diff --git a/lib/gpu/Makefile.mingw64-cross-mpi b/lib/gpu/Makefile.mingw64-cross-mpi deleted file mode 100644 index 2ff72d98b1..0000000000 --- a/lib/gpu/Makefile.mingw64-cross-mpi +++ /dev/null @@ -1,20 +0,0 @@ -CUDA_HOME = ../../tools/mingw-cross/OpenCL - -OCL_CPP = x86_64-w64-mingw32-g++ -O3 -march=core2 -mtune=core2 -mpc64 \ - -msse2 -DMPI_GERYON -DUCL_NO_EXIT -I$(CUDA_HOME)/include \ - -I../../tools/mingw-cross/mpich2-win64/include/ \ - -DMPICH_IGNORE_CXX_SEEK - -OCL_LINK = -static -Wl,--enable-stdcall-fixup -L$(CUDA_HOME)/../Obj_mingw64 -Wl,-Bdynamic,-lOpenCL,-Bstatic \ - -L../../tools/mingw-cross/mpich2-win64/lib -lmpi -OCL_PREC = -D_SINGLE_DOUBLE -OCL_TUNE = -DFERMI_OCL -EXTRAMAKE = Makefile.lammps.mingw-cross - -BIN_DIR = Obj_mingw64-mpi -OBJ_DIR = Obj_mingw64-mpi -LIB_DIR = Obj_mingw64-mpi -AR = x86_64-w64-mingw32-ar -BSH = /bin/sh - -include Opencl.makefile diff --git a/lib/gpu/Makefile.mpi b/lib/gpu/Makefile.mpi new file mode 120000 index 0000000000..8bad27d081 --- /dev/null +++ b/lib/gpu/Makefile.mpi @@ -0,0 +1 @@ +Makefile.linux \ No newline at end of file diff --git a/lib/gpu/Makefile.serial b/lib/gpu/Makefile.serial index 809e99cc94..9348dc565a 100644 --- a/lib/gpu/Makefile.serial +++ b/lib/gpu/Makefile.serial @@ -1,5 +1,5 @@ # /* ---------------------------------------------------------------------- -# Generic Makefile for CUDA using MPI STUBS library +# Generic Linux Makefile for CUDA # - Change CUDA_ARCH for your GPU # ------------------------------------------------------------------------- */ @@ -7,23 +7,38 @@ EXTRAMAKE = Makefile.lammps.standard -CUDA_HOME = $(HOME)/cuda +ifeq ($(CUDA_HOME),) +CUDA_HOME = /usr/local/cuda +endif + NVCC = nvcc # Tesla CUDA -CUDA_ARCH = -arch=sm_20 +CUDA_ARCH = -arch=sm_21 # newer CUDA #CUDA_ARCH = -arch=sm_13 # older CUDA #CUDA_ARCH = -arch=sm_10 -DCUDA_PRE_THREE +CUDA_ARCH = -arch=sm_35 + +# this setting should match LAMMPS Makefile +# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL + +LMP_INC = -DLAMMPS_SMALLBIG + +# precision for GPU calculations +# -D_SINGLE_SINGLE # Single precision for all calculations +# -D_DOUBLE_DOUBLE # Double precision for all calculations +# -D_SINGLE_DOUBLE # Accumulation of forces, etc. in double CUDA_PRECISION = -D_SINGLE_DOUBLE -CUDA_INCLUDE = -I$(CUDA_HOME)/include -CUDA_LIB = -L$(CUDA_HOME)/lib64 -L../../src/STUBS -lmpi -CUDA_OPTS = -DUNIX -O3 -Xptxas -v --use_fast_math -CUDR_CPP = g++ -DMPI_GERYON -DUCL_NO_EXIT -I../../src/STUBS -CUDR_OPTS = -O2 +CUDA_INCLUDE = -I$(CUDA_HOME)/include +CUDA_LIB = -L$(CUDA_HOME)/lib64 -L../../src/STUBS -lmpi_stubs +CUDA_OPTS = -DUNIX -O3 -Xptxas -v --use_fast_math $(LMP_INC) + +CUDR_CPP = g++ -DMPI_GERYON -DUCL_NO_EXIT -fPIC -I../../src/STUBS +CUDR_OPTS = -O2 $(LMP_INC) # -xHost -no-prec-div -ansi-alias BIN_DIR = ./ OBJ_DIR = ./ @@ -31,5 +46,7 @@ LIB_DIR = ./ AR = ar BSH = /bin/sh +CUDPP_OPT = -DUSE_CUDPP -Icudpp_mini + include Nvidia.makefile diff --git a/lib/gpu/Nvidia.makefile b/lib/gpu/Nvidia.makefile index ee2eb72632..5f692cf66c 100644 --- a/lib/gpu/Nvidia.makefile +++ b/lib/gpu/Nvidia.makefile @@ -76,7 +76,8 @@ OBJS = $(OBJ_DIR)/lal_atom.o $(OBJ_DIR)/lal_ans.o \ $(OBJ_DIR)/lal_coul.o $(OBJ_DIR)/lal_coul_ext.o \ $(OBJ_DIR)/lal_coul_debye.o $(OBJ_DIR)/lal_coul_debye_ext.o \ $(OBJ_DIR)/lal_zbl.o $(OBJ_DIR)/lal_zbl_ext.o \ - $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o + $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o \ + $(OBJ_DIR)/lal_ufm.o $(OBJ_DIR)/lal_ufm_ext.o CBNS = $(OBJ_DIR)/device.cubin $(OBJ_DIR)/device_cubin.h \ $(OBJ_DIR)/atom.cubin $(OBJ_DIR)/atom_cubin.h \ @@ -131,7 +132,8 @@ CBNS = $(OBJ_DIR)/device.cubin $(OBJ_DIR)/device_cubin.h \ $(OBJ_DIR)/coul.cubin $(OBJ_DIR)/coul_cubin.h \ $(OBJ_DIR)/coul_debye.cubin $(OBJ_DIR)/coul_debye_cubin.h \ $(OBJ_DIR)/zbl.cubin $(OBJ_DIR)/zbl_cubin.h \ - $(OBJ_DIR)/lj_cubic.cubin $(OBJ_DIR)/lj_cubic_cubin.h + $(OBJ_DIR)/lj_cubic.cubin $(OBJ_DIR)/lj_cubic_cubin.h \ + $(OBJ_DIR)/ufm.cubin $(OBJ_DIR)/ufm_cubin.h all: $(OBJ_DIR) $(GPU_LIB) $(EXECS) @@ -705,6 +707,18 @@ $(OBJ_DIR)/dpd.cubin: lal_dpd.cu lal_precision.h lal_preprocessor.h $(OBJ_DIR)/dpd_cubin.h: $(OBJ_DIR)/dpd.cubin $(OBJ_DIR)/dpd.cubin $(BIN2C) -c -n dpd $(OBJ_DIR)/dpd.cubin > $(OBJ_DIR)/dpd_cubin.h +$(OBJ_DIR)/ufm.cubin: lal_ufm.cu lal_precision.h lal_preprocessor.h + $(CUDA) --cubin -DNV_KERNEL -o $@ lal_ufm.cu + +$(OBJ_DIR)/ufm_cubin.h: $(OBJ_DIR)/ufm.cubin $(OBJ_DIR)/ufm.cubin + $(BIN2C) -c -n ufm $(OBJ_DIR)/ufm.cubin > $(OBJ_DIR)/ufm_cubin.h + +$(OBJ_DIR)/lal_ufm.o: $(ALL_H) lal_ufm.h lal_ufm.cpp $(OBJ_DIR)/ufm_cubin.h $(OBJ_DIR)/lal_base_atomic.o + $(CUDR) -o $@ -c lal_ufm.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/lal_ufm_ext.o: $(ALL_H) lal_ufm.h lal_ufm_ext.cpp lal_base_atomic.h + $(CUDR) -o $@ -c lal_ufm_ext.cpp -I$(OBJ_DIR) + $(OBJ_DIR)/lal_dpd.o: $(ALL_H) lal_dpd.h lal_dpd.cpp $(OBJ_DIR)/dpd_cubin.h $(OBJ_DIR)/lal_base_dpd.o $(CUDR) -o $@ -c lal_dpd.cpp -I$(OBJ_DIR) diff --git a/lib/gpu/Opencl.makefile b/lib/gpu/Opencl.makefile index f116508ae5..bb07151447 100644 --- a/lib/gpu/Opencl.makefile +++ b/lib/gpu/Opencl.makefile @@ -65,7 +65,8 @@ OBJS = $(OBJ_DIR)/lal_atom.o $(OBJ_DIR)/lal_answer.o \ $(OBJ_DIR)/lal_coul.o $(OBJ_DIR)/lal_coul_ext.o \ $(OBJ_DIR)/lal_coul_debye.o $(OBJ_DIR)/lal_coul_debye_ext.o \ $(OBJ_DIR)/lal_zbl.o $(OBJ_DIR)/lal_zbl_ext.o \ - $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o + $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o \ + $(OBJ_DIR)/lal_ufm.o $(OBJ_DIR)/lal_ufm_ext.o KERS = $(OBJ_DIR)/device_cl.h $(OBJ_DIR)/atom_cl.h \ $(OBJ_DIR)/neighbor_cpu_cl.h $(OBJ_DIR)/pppm_cl.h \ @@ -93,7 +94,8 @@ KERS = $(OBJ_DIR)/device_cl.h $(OBJ_DIR)/atom_cl.h \ $(OBJ_DIR)/tersoff_cl.h $(OBJ_DIR)/tersoff_zbl_cl.h \ $(OBJ_DIR)/tersoff_mod_cl.h $(OBJ_DIR)/coul_cl.h \ $(OBJ_DIR)/coul_debye_cl.h $(OBJ_DIR)/zbl_cl.h \ - $(OBJ_DIR)/lj_cubic_cl.h $(OBJ_DIR)/vashishta_cl.h + $(OBJ_DIR)/lj_cubic_cl.h $(OBJ_DIR)/vashishta_cl.h \ + $(OBJ_DIR)/ufm_cl.h OCL_EXECS = $(BIN_DIR)/ocl_get_devices @@ -577,6 +579,15 @@ $(OBJ_DIR)/lal_lj_cubic.o: $(ALL_H) lal_lj_cubic.h lal_lj_cubic.cpp $(OBJ_DIR)/ $(OBJ_DIR)/lal_lj_cubic_ext.o: $(ALL_H) lal_lj_cubic.h lal_lj_cubic_ext.cpp lal_base_atomic.h $(OCL) -o $@ -c lal_lj_cubic_ext.cpp -I$(OBJ_DIR) +$(OBJ_DIR)/ufm_cl.h: lal_ufm.cu $(PRE1_H) + $(BSH) ./geryon/file_to_cstr.sh ufm $(PRE1_H) lal_ufm.cu $(OBJ_DIR)/ufm_cl.h; + +$(OBJ_DIR)/lal_ufm.o: $(ALL_H) lal_ufm.h lal_ufm.cpp $(OBJ_DIR)/ufm_cl.h $(OBJ_DIR)/ufm_cl.h $(OBJ_DIR)/lal_base_atomic.o + $(OCL) -o $@ -c lal_ufm.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/lal_ufm_ext.o: $(ALL_H) lal_ufm.h lal_ufm_ext.cpp lal_base_atomic.h + $(OCL) -o $@ -c lal_ufm_ext.cpp -I$(OBJ_DIR) + $(BIN_DIR)/ocl_get_devices: ./geryon/ucl_get_devices.cpp $(OCL) -o $@ ./geryon/ucl_get_devices.cpp -DUCL_OPENCL $(OCL_LINK) diff --git a/lib/gpu/README b/lib/gpu/README index b26897e885..15b65516ac 100644 --- a/lib/gpu/README +++ b/lib/gpu/README @@ -135,6 +135,7 @@ Current styles supporting GPU acceleration: 38 yukawa/colloid 39 yukawa 40 pppm + 41 ufm MULTIPLE LAMMPS PROCESSES diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index 20656c8489..138b03c091 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -140,8 +140,13 @@ class UCL_Device { inline void push_command_queue() { cl_int errorv; _cq.push_back(cl_command_queue()); - _cq.back()=clCreateCommandQueue(_context,_cl_device, - CL_QUEUE_PROFILING_ENABLE,&errorv); + +#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); +#else + _cq.back()=clCreateCommandQueue(_context, _cl_device, CL_QUEUE_PROFILING_ENABLE, &errorv); +#endif if (errorv!=CL_SUCCESS) { std::cerr << "Could not create command queue on device: " << name() << std::endl; diff --git a/lib/gpu/lal_aux_fun1.h b/lib/gpu/lal_aux_fun1.h index b40bb7f943..47a216ff6f 100644 --- a/lib/gpu/lal_aux_fun1.h +++ b/lib/gpu/lal_aux_fun1.h @@ -22,21 +22,21 @@ offset=tid & (t_per_atom-1); \ ii=fast_mul((int)BLOCK_ID_X,(int)(BLOCK_SIZE_X)/t_per_atom)+tid/t_per_atom; -#define nbor_info(nbor_mem, packed_mem, nbor_stride, t_per_atom, ii, offset, \ - i, numj, stride, nbor_end, nbor_begin) \ - i=nbor_mem[ii]; \ - nbor_begin=ii+nbor_stride; \ - numj=nbor_mem[nbor_begin]; \ - if (nbor_mem==packed_mem) { \ - nbor_begin+=nbor_stride+fast_mul(ii,t_per_atom-1); \ - stride=fast_mul(t_per_atom,nbor_stride); \ - nbor_end=nbor_begin+fast_mul(numj/t_per_atom,stride)+(numj & (t_per_atom-1)); \ +#define nbor_info(dev_nbor, dev_packed, nbor_pitch, t_per_atom, ii, offset, \ + i, numj, n_stride, nbor_end, nbor_begin) \ + i=dev_nbor[ii]; \ + nbor_begin=ii+nbor_pitch; \ + numj=dev_nbor[nbor_begin]; \ + if (dev_nbor==dev_packed) { \ + nbor_begin+=nbor_pitch+fast_mul(ii,t_per_atom-1); \ + n_stride=fast_mul(t_per_atom,nbor_pitch); \ + nbor_end=nbor_begin+fast_mul(numj/t_per_atom,n_stride)+(numj & (t_per_atom-1)); \ nbor_begin+=offset; \ } else { \ - nbor_begin+=nbor_stride; \ - nbor_begin=nbor_mem[nbor_begin]; \ + nbor_begin+=nbor_pitch; \ + nbor_begin=dev_nbor[nbor_begin]; \ nbor_end=nbor_begin+numj; \ - stride=t_per_atom; \ + n_stride=t_per_atom; \ nbor_begin+=offset; \ } diff --git a/lib/gpu/lal_base_three.cpp b/lib/gpu/lal_base_three.cpp index f772e36295..aa77a48c66 100644 --- a/lib/gpu/lal_base_three.cpp +++ b/lib/gpu/lal_base_three.cpp @@ -20,7 +20,7 @@ using namespace LAMMPS_AL; extern Device global_device; template -BaseThreeT::BaseThree() : _compiled(false), _max_bytes(0) { +BaseThreeT::BaseThree() : _compiled(false), _max_bytes(0) { device=&global_device; ans=new Answer(); nbor=new Neighbor(); @@ -53,8 +53,8 @@ int BaseThreeT::init_three(const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, const double gpu_split, FILE *_screen, const void *pair_program, - const char *k_two, const char *k_three_center, - const char *k_three_end) { + const char *two, const char *three_center, + const char *three_end, const char *short_nbor) { screen=_screen; int gpu_nbor=0; @@ -70,10 +70,10 @@ int BaseThreeT::init_three(const int nlocal, const int nall, _gpu_host=1; _threads_per_atom=device->threads_per_atom(); - if (_threads_per_atom>1 && gpu_nbor==0) { + if (_threads_per_atom>1 && gpu_nbor==0) { // neigh no and tpa > 1 nbor->packing(true); _nbor_data=&(nbor->dev_packed); - } else + } else // neigh yes or tpa == 1 _nbor_data=&(nbor->dev_nbor); if (_threads_per_atom*_threads_per_atom>device->warp_size()) return -10; @@ -97,7 +97,7 @@ int BaseThreeT::init_three(const int nlocal, const int nall, _block_pair=device->pair_block_size(); _block_size=device->block_ellipse(); - compile_kernels(*ucl_device,pair_program,k_two,k_three_center,k_three_end); + compile_kernels(*ucl_device,pair_program,two,three_center,three_end,short_nbor); // Initialize host-device load balancer hd_balancer.init(device,gpu_nbor,gpu_split); @@ -113,6 +113,11 @@ int BaseThreeT::init_three(const int nlocal, const int nall, _max_an_bytes+=ans2->gpu_bytes(); #endif + int ef_nall=nall; + if (ef_nall==0) + ef_nall=2000; + dev_short_nbor.alloc(ef_nall*(2+max_nbors),*(this->ucl_device),UCL_READ_WRITE); + return 0; } @@ -136,6 +141,7 @@ void BaseThreeT::clear_atomic() { k_three_end.clear(); k_three_end_vatom.clear(); k_pair.clear(); + k_short_nbor.clear(); delete pair_program; _compiled=false; } @@ -143,6 +149,7 @@ void BaseThreeT::clear_atomic() { time_pair.clear(); hd_balancer.clear(); + dev_short_nbor.clear(); nbor->clear(); ans->clear(); #ifdef THREE_CONCURRENT @@ -169,6 +176,8 @@ int * BaseThreeT::reset_nbors(const int nall, const int inum, const int nlist, if (!success) return NULL; + _nall = nall; + // originally the requirement that nall == nlist was enforced // to allow direct indexing neighbors of neighbors after re-arrangement // nbor->get_host3(nall,nlist,ilist,numj,firstneigh,block_size()); @@ -203,6 +212,8 @@ inline int BaseThreeT::build_nbor_list(const int inum, const int host_inum, return 0; atom->cast_copy_x(host_x,host_type); + _nall = nall; + int mn; nbor->build_nbor_list(host_x, nall, host_inum, nall, *atom, sublo, subhi, tag, nspecial, special, success, mn); @@ -247,12 +258,22 @@ void BaseThreeT::compute(const int f_ago, const int inum_full, const int nall, reset_nbors(nall, inum, nlist, ilist, numj, firstneigh, success); if (!success) return; + _max_nbors = nbor->max_nbor_loop(nlist,numj,ilist); } atom->cast_x_data(host_x,host_type); hd_balancer.start_timer(); atom->add_x_data(host_x,host_type); + // re-allocate dev_short_nbor if necessary + if (nall*(2+_max_nbors) > dev_short_nbor.cols()) { + int _nmax=static_cast(static_cast(nall)*1.10); + dev_short_nbor.resize((2+_max_nbors)*_nmax); + } + + // _ainum to be used in loop() for short neighbor list build + _ainum = nlist; + int evatom=0; if (eatom || vatom) evatom=1; @@ -300,7 +321,7 @@ int ** BaseThreeT::compute(const int ago, const int inum_full, // Build neighbor list on GPU if necessary if (ago==0) { - build_nbor_list(inum, inum_full-inum, nall, host_x, host_type, + _max_nbors = build_nbor_list(inum, inum_full-inum, nall, host_x, host_type, sublo, subhi, tag, nspecial, special, success); if (!success) return NULL; @@ -313,6 +334,15 @@ int ** BaseThreeT::compute(const int ago, const int inum_full, *ilist=nbor->host_ilist.begin(); *jnum=nbor->host_acc.begin(); + // re-allocate dev_short_nbor if necessary + if (nall*(2+_max_nbors) > dev_short_nbor.cols()) { + int _nmax=static_cast(static_cast(nall)*1.10); + dev_short_nbor.resize((2+_max_nbors)*_nmax); + } + + // _ainum to be used in loop() for short neighbor list build + _ainum = nall; + int evatom=0; if (eatom || vatom) evatom=1; @@ -339,19 +369,20 @@ double BaseThreeT::host_memory_usage_atomic() const { template void BaseThreeT::compile_kernels(UCL_Device &dev, const void *pair_str, - const char *ktwo, const char *kthree_center, - const char *kthree_end) { + const char *two, const char *three_center, + const char *three_end, const char* short_nbor) { if (_compiled) return; - std::string vatom_name=std::string(kthree_end)+"_vatom"; + std::string vatom_name=std::string(three_end)+"_vatom"; pair_program=new UCL_Program(dev); pair_program->load_string(pair_str,device->compile_string().c_str()); - k_three_center.set_function(*pair_program,kthree_center); - k_three_end.set_function(*pair_program,kthree_end); + k_three_center.set_function(*pair_program,three_center); + k_three_end.set_function(*pair_program,three_end); k_three_end_vatom.set_function(*pair_program,vatom_name.c_str()); - k_pair.set_function(*pair_program,ktwo); + k_pair.set_function(*pair_program,two); + k_short_nbor.set_function(*pair_program,short_nbor); pos_tex.get_texture(*pair_program,"pos_tex"); #ifdef THREE_CONCURRENT diff --git a/lib/gpu/lal_base_three.h b/lib/gpu/lal_base_three.h index 4f27ecdf92..f5f36863c4 100644 --- a/lib/gpu/lal_base_three.h +++ b/lib/gpu/lal_base_three.h @@ -56,7 +56,8 @@ class BaseThree { const int maxspecial, const double cell_size, const double gpu_split, FILE *screen, const void *pair_program, const char *k_two, - const char *k_three_center, const char *k_three_end); + const char *k_three_center, const char *k_three_end, + const char *k_short_nbor=NULL); /// Estimate the overhead for GPU context changes and CPU driver void estimate_gpu_overhead(); @@ -73,18 +74,18 @@ class BaseThree { } /// Check if there is enough storage for neighbors and realloc if not - /** \param nlocal number of particles whose nbors must be stored on device - * \param host_inum number of particles whose nbors need to copied to host - * \param current maximum number of neighbors + /** \param inum number of particles whose nbors must be stored on device + * \param max_nbors maximum number of neighbors + * \param success set to false if insufficient memory * \note olist_size=total number of local particles **/ inline void resize_local(const int inum, const int max_nbors, bool &success) { nbor->resize(inum,max_nbors,success); } /// Check if there is enough storage for neighbors and realloc if not - /** \param nlocal number of particles whose nbors must be stored on device + /** \param inum number of particles whose nbors must be stored on device * \param host_inum number of particles whose nbors need to copied to host - * \param current maximum number of neighbors + * \param max_nbors current maximum number of neighbors * \note host_inum is 0 if the host is performing neighboring * \note nlocal+host_inum=total number local particles * \note olist_size=0 **/ @@ -143,14 +144,6 @@ class BaseThree { const bool vflag, const bool eatom, const bool vatom, int &host_start, const double cpu_time, bool &success); - /// Pair loop with device neighboring - int * compute(const int ago, const int inum_full, const int nall, - double **host_x, int *host_type, double *sublo, - double *subhi, tagint *tag, int **nspecial, - tagint **special, const bool eflag, const bool vflag, - const bool eatom, const bool vatom, int &host_start, - const double cpu_time, bool &success); - /// Pair loop with device neighboring int ** compute(const int ago, const int inum_full, const int nall, double **host_x, int *host_type, double *sublo, @@ -193,6 +186,9 @@ class BaseThree { /// Neighbor data Neighbor *nbor; + UCL_D_Vec dev_short_nbor; + UCL_Kernel k_short_nbor; + // ------------------------- DEVICE KERNELS ------------------------- UCL_Program *pair_program; UCL_Kernel k_pair, k_three_center, k_three_end, k_three_end_vatom; @@ -207,12 +203,13 @@ class BaseThree { int _block_pair, _block_size, _threads_per_atom, _end_command_queue; int _gpu_nbor; double _max_bytes, _max_an_bytes; + int _max_nbors, _ainum, _nall; double _gpu_overhead, _driver_overhead; UCL_D_Vec *_nbor_data; void compile_kernels(UCL_Device &dev, const void *pair_string, - const char *k_two, const char *k_three_center, - const char *k_three_end); + const char *two, const char *three_center, + const char *three_end, const char* short_nbor); virtual void loop(const bool _eflag, const bool _vflag, const int evatom) = 0; diff --git a/lib/gpu/lal_lj_expand_ext.cpp b/lib/gpu/lal_lj_expand_ext.cpp index 94a57192b9..a9c791803b 100644 --- a/lib/gpu/lal_lj_expand_ext.cpp +++ b/lib/gpu/lal_lj_expand_ext.cpp @@ -92,7 +92,7 @@ int lje_gpu_init(const int ntypes, double **cutsq, double **host_lj1, // --------------------------------------------------------------------------- // Copy updated coeffs from host to device // --------------------------------------------------------------------------- -int lje_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, +void lje_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, double **host_lj2, double **host_lj3, double **host_lj4, double **offset, double **shift) { int world_me=LJEMF.device->world_me(); diff --git a/lib/gpu/lal_sw.cpp b/lib/gpu/lal_sw.cpp index 3492d7030e..24984e4878 100644 --- a/lib/gpu/lal_sw.cpp +++ b/lib/gpu/lal_sw.cpp @@ -55,7 +55,7 @@ int SWT::init(const int ntypes, const int nlocal, const int nall, const int max_ int success; success=this->init_three(nlocal,nall,max_nbors,0,cell_size,gpu_split, _screen,sw,"k_sw","k_sw_three_center", - "k_sw_three_end"); + "k_sw_three_end","k_sw_short_nbor"); if (success!=0) return success; @@ -193,19 +193,30 @@ void SWT::loop(const bool _eflag, const bool _vflag, const int evatom) { else vflag=0; - int GX=static_cast(ceil(static_cast(this->ans->inum())/ + // build the short neighbor list + int ainum=this->_ainum; + int nbor_pitch=this->nbor->nbor_pitch(); + int GX=static_cast(ceil(static_cast(ainum)/ (BX/this->_threads_per_atom))); + this->k_short_nbor.set_size(GX,BX); + this->k_short_nbor.run(&this->atom->x, &sw3, &map, &elem2param, &_nelements, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &ainum, + &nbor_pitch, &this->_threads_per_atom); // this->_nbor_data == nbor->dev_packed for gpu_nbor == 0 and tpa > 1 // this->_nbor_data == nbor->dev_nbor for gpu_nbor == 1 or tpa == 1 - int ainum=this->ans->inum(); - int nbor_pitch=this->nbor->nbor_pitch(); + ainum=this->ans->inum(); + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->ans->inum())/ + (BX/this->_threads_per_atom))); this->time_pair.start(); - + this->k_pair.set_size(GX,BX); this->k_pair.run(&this->atom->x, &sw1, &sw2, &sw3, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom); @@ -217,6 +228,7 @@ void SWT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_center.run(&this->atom->x, &sw1, &sw2, &sw3, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &evatom); @@ -231,7 +243,7 @@ void SWT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &sw1, &sw2, &sw3, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -240,7 +252,7 @@ void SWT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &sw1, &sw2, &sw3, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); diff --git a/lib/gpu/lal_sw.cu b/lib/gpu/lal_sw.cu index 46330c59e4..517de70691 100644 --- a/lib/gpu/lal_sw.cu +++ b/lib/gpu/lal_sw.cu @@ -130,6 +130,63 @@ texture sw3_tex; #endif +__kernel void k_sw_short_nbor(const __global numtyp4 *restrict x_, + const __global numtyp4 *restrict sw3, + const __global int *restrict map, + const __global int *restrict elem2param, + const int nelements, + const __global int * dev_nbor, + const __global int * dev_packed, + __global int * dev_short_nbor, + const int inum, const int nbor_pitch, const int t_per_atom) { + __local int n_stride; + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + if (iiinit_three(nlocal,nall,max_nbors,0,cell_size,gpu_split, _screen,tersoff,"k_tersoff_repulsive", - "k_tersoff_three_center", "k_tersoff_three_end"); + "k_tersoff_three_center", "k_tersoff_three_end", + "k_tersoff_short_nbor"); if (success!=0) return success; @@ -157,11 +158,16 @@ int TersoffT::init(const int ntypes, const int nlocal, const int nall, const int UCL_H_Vec cutsq_view(nparams,*(this->ucl_device), UCL_WRITE_ONLY); - for (int i=0; i(host_cutsq[i]); + if (cutsqmax < host_cutsq[i]) cutsqmax = host_cutsq[i]; + } cutsq.alloc(nparams,*(this->ucl_device),UCL_READ_ONLY); ucl_copy(cutsq,cutsq_view,false); + _cutshortsq = static_cast(cutsqmax); + UCL_H_Vec dview_elem2param(nelements*nelements*nelements, *(this->ucl_device), UCL_WRITE_ONLY); @@ -219,171 +225,6 @@ double TersoffT::host_memory_usage() const { #define KTHREADS this->_threads_per_atom #define JTHREADS this->_threads_per_atom -// --------------------------------------------------------------------------- -// Copy nbor list from host if necessary and then calculate forces, virials,.. -// --------------------------------------------------------------------------- -template -void TersoffT::compute(const int f_ago, const int inum_full, const int nall, - const int nlist, double **host_x, int *host_type, - int *ilist, int *numj, int **firstneigh, - const bool eflag, const bool vflag, const bool eatom, - const bool vatom, int &host_start, - const double cpu_time, bool &success) { - this->acc_timers(); - if (inum_full==0) { - host_start=0; - // Make sure textures are correct if realloc by a different hybrid style - this->resize_atom(0,nall,success); - this->zero_timers(); - return; - } - - int ago=this->hd_balancer.ago_first(f_ago); - int inum=this->hd_balancer.balance(ago,inum_full,cpu_time); - this->ans->inum(inum); - #ifdef THREE_CONCURRENT - this->ans2->inum(inum); - #endif - host_start=inum; - - if (ago==0) { - this->reset_nbors(nall, inum, nlist, ilist, numj, firstneigh, success); - if (!success) - return; - _max_nbors = this->nbor->max_nbor_loop(nlist,numj,ilist); - } - - this->atom->cast_x_data(host_x,host_type); - this->hd_balancer.start_timer(); - this->atom->add_x_data(host_x,host_type); - - // re-allocate zetaij if necessary - if (nall*_max_nbors > _zetaij.cols()) { - int _nmax=static_cast(static_cast(nall)*1.10); - _zetaij.resize(_max_nbors*_nmax); - } - - int _eflag; - if (eflag) - _eflag=1; - else - _eflag=0; - - int ainum=nlist; - int nbor_pitch=this->nbor->nbor_pitch(); - int BX=this->block_pair(); - int GX=static_cast(ceil(static_cast(ainum)/ - (BX/(JTHREADS*KTHREADS)))); - - this->k_zeta.set_size(GX,BX); - this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &cutsq, - &map, &elem2param, &_nelements, &_nparams, &_zetaij, - &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &_eflag, &ainum, &nbor_pitch, &this->_threads_per_atom); - - int evatom=0; - if (eatom || vatom) - evatom=1; - #ifdef THREE_CONCURRENT - this->ucl_device->sync(); - #endif - loop(eflag,vflag,evatom); - this->ans->copy_answers(eflag,vflag,eatom,vatom,ilist); - this->device->add_ans_object(this->ans); - #ifdef THREE_CONCURRENT - this->ans2->copy_answers(eflag,vflag,eatom,vatom,ilist); - this->device->add_ans_object(this->ans2); - #endif - this->hd_balancer.stop_timer(); -} - -// --------------------------------------------------------------------------- -// Reneighbor on GPU if necessary and then compute forces, virials, energies -// --------------------------------------------------------------------------- -template -int ** TersoffT::compute(const int ago, const int inum_full, - const int nall, double **host_x, int *host_type, - double *sublo, double *subhi, tagint *tag, - int **nspecial, tagint **special, const bool eflag, - const bool vflag, const bool eatom, - const bool vatom, int &host_start, - int **ilist, int **jnum, - const double cpu_time, bool &success) { - this->acc_timers(); - - if (inum_full==0) { - host_start=0; - // Make sure textures are correct if realloc by a different hybrid style - this->resize_atom(0,nall,success); - this->zero_timers(); - return NULL; - } - - this->hd_balancer.balance(cpu_time); - int inum=this->hd_balancer.get_gpu_count(ago,inum_full); - this->ans->inum(inum); - #ifdef THREE_CONCURRENT - this->ans2->inum(inum); - #endif - host_start=inum; - - // Build neighbor list on GPU if necessary - if (ago==0) { - _max_nbors = this->build_nbor_list(inum, inum_full-inum, nall, host_x, host_type, - sublo, subhi, tag, nspecial, special, success); - if (!success) - return NULL; - this->hd_balancer.start_timer(); - } else { - this->atom->cast_x_data(host_x,host_type); - this->hd_balancer.start_timer(); - this->atom->add_x_data(host_x,host_type); - } - *ilist=this->nbor->host_ilist.begin(); - *jnum=this->nbor->host_acc.begin(); - - // re-allocate zetaij if necessary - if (nall*_max_nbors > _zetaij.cols()) { - int _nmax=static_cast(static_cast(nall)*1.10); - _zetaij.resize(_max_nbors*_nmax); - } - - int _eflag; - if (eflag) - _eflag=1; - else - _eflag=0; - - int ainum=nall; - int nbor_pitch=this->nbor->nbor_pitch(); - int BX=this->block_pair(); - int GX=static_cast(ceil(static_cast(ainum)/ - (BX/(JTHREADS*KTHREADS)))); - - this->k_zeta.set_size(GX,BX); - this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &cutsq, - &map, &elem2param, &_nelements, &_nparams, &_zetaij, - &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &_eflag, &ainum, &nbor_pitch, &this->_threads_per_atom); - - int evatom=0; - if (eatom || vatom) - evatom=1; - #ifdef THREE_CONCURRENT - this->ucl_device->sync(); - #endif - loop(eflag,vflag,evatom); - this->ans->copy_answers(eflag,vflag,eatom,vatom); - this->device->add_ans_object(this->ans); - #ifdef THREE_CONCURRENT - this->ans2->copy_answers(eflag,vflag,eatom,vatom); - this->device->add_ans_object(this->ans2); - #endif - this->hd_balancer.stop_timer(); - - return this->nbor->host_jlist.begin()-host_start; -} - // --------------------------------------------------------------------------- // Calculate energies, forces, and torques // --------------------------------------------------------------------------- @@ -402,9 +243,40 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { else vflag=0; - int ainum=this->ans->inum(); + // build the short neighbor list + int ainum=this->_ainum; int nbor_pitch=this->nbor->nbor_pitch(); - int GX=static_cast(ceil(static_cast(this->ans->inum())/ + int GX=static_cast(ceil(static_cast(ainum)/ + (BX/this->_threads_per_atom))); + + this->k_short_nbor.set_size(GX,BX); + this->k_short_nbor.run(&this->atom->x, &cutsq, &map, + &elem2param, &_nelements, &_nparams, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &ainum, + &nbor_pitch, &this->_threads_per_atom); + + // re-allocate zetaij if necessary + int nall = this->_nall; + if (nall*this->_max_nbors > _zetaij.cols()) { + int _nmax=static_cast(static_cast(nall)*1.10); + _zetaij.resize(this->_max_nbors*_nmax); + } + + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->_ainum)/ + (BX/(JTHREADS*KTHREADS)))); + + this->k_zeta.set_size(GX,BX); + this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &cutsq, + &map, &elem2param, &_nelements, &_nparams, &_zetaij, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, + &_eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); + + ainum=this->ans->inum(); + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->ans->inum())/ (BX/this->_threads_per_atom))); this->time_pair.start(); @@ -412,6 +284,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_pair.run(&this->atom->x, &ts1, &ts2, &cutsq, &map, &elem2param, &_nelements, &_nparams, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom); @@ -423,6 +296,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_center.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &evatom); @@ -437,7 +311,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -446,7 +320,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_tersoff.cu b/lib/gpu/lal_tersoff.cu index b7d48d9e34..cec0ccc443 100644 --- a/lib/gpu/lal_tersoff.cu +++ b/lib/gpu/lal_tersoff.cu @@ -106,7 +106,7 @@ texture ts5_tex; ans[ii]=old; \ } -#define store_zeta(z, tid, t_per_atom, offset) \ +#define acc_zeta(z, tid, t_per_atom, offset) \ if (t_per_atom>1) { \ __local acctyp red_acc[BLOCK_PAIR]; \ red_acc[tid]=z; \ @@ -155,7 +155,7 @@ texture ts5_tex; ans[ii]=old; \ } -#define store_zeta(z, tid, t_per_atom, offset) \ +#define acc_zeta(z, tid, t_per_atom, offset) \ if (t_per_atom>1) { \ for (unsigned int s=t_per_atom/2; s>0; s>>=1) { \ z += shfl_xor(z, s, t_per_atom); \ @@ -164,6 +164,65 @@ texture ts5_tex; #endif +__kernel void k_tersoff_short_nbor(const __global numtyp4 *restrict x_, + const __global numtyp *restrict cutsq, + const __global int *restrict map, + const __global int *restrict elem2param, + const int nelements, const int nparams, + const __global int * dev_nbor, + const __global int * dev_packed, + __global int * dev_short_nbor, + const int inum, const int nbor_pitch, + const int t_per_atom) { + __local int n_stride; + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + if (ii cutsq[ijparam]) continue; +// if (rsq1 > cutsq[ijparam]) continue; // compute zeta_ij z = (acctyp)0; int nbor_k = nborj_start-offset_j+offset_k; - for ( ; nbor_k < nbor_end; nbor_k+=n_stride) { - int k=dev_packed[nbor_k]; + int k_end = nbor_end; + if (dev_packed==dev_nbor) { + int numk = dev_short_nbor[nbor_k-n_stride]; + k_end = nbor_k+fast_mul(numk,n_stride); + } + + for ( ; nbor_k < k_end; nbor_k+=n_stride) { + int k=nbor_mem[nbor_k]; k &= NEIGHMASK; if (k == j) continue; @@ -284,10 +357,12 @@ __kernel void k_tersoff_zeta(const __global numtyp4 *restrict x_, //int jj = (nbor_j-offset_j-2*nbor_pitch)/n_stride; //int idx = jj*n_stride + i*t_per_atom + offset_j; - int idx; - zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, - i, nbor_j, offset_j, idx); - store_zeta(z, tid, t_per_atom, offset_k); + //idx to zetaij is shifted by n_stride relative to nbor_j in dev_short_nbor + int idx = nbor_j; + if (dev_packed==dev_nbor) idx -= n_stride; +// zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, +// i, nbor_j, offset_j, idx); + acc_zeta(z, tid, t_per_atom, offset_k); numtyp4 ts1_ijparam = ts1[ijparam]; //fetch4(ts1_ijparam,ijparam,ts1_tex); numtyp ijparam_lam2 = ts1_ijparam.y; @@ -330,6 +405,7 @@ __kernel void k_tersoff_repulsive(const __global numtyp4 *restrict x_, const int nelements, const int nparams, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -356,8 +432,8 @@ __kernel void k_tersoff_repulsive(const __global numtyp4 *restrict x_, __syncthreads(); if (ii0) - energy+=feng[1]; - if (vflag>0) { - virial[0] += delx*delx*force; - virial[1] += dely*dely*force; - virial[2] += delz*delz*force; - virial[3] += delx*dely*force; - virial[4] += delx*delz*force; - virial[5] += dely*delz*force; - } + if (eflag>0) + energy+=feng[1]; + if (vflag>0) { + virial[0] += delx*delx*force; + virial[1] += dely*dely*force; + virial[2] += delz*delz*force; + virial[3] += delx*dely*force; + virial[4] += delx*delz*force; + virial[5] += dely*delz*force; } } // for nbor @@ -428,6 +511,7 @@ __kernel void k_tersoff_three_center(const __global numtyp4 *restrict x_, const __global acctyp4 *restrict zetaij, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -461,20 +545,28 @@ __kernel void k_tersoff_three_center(const __global numtyp4 *restrict x_, if (ii cutsq[ijparam]) continue; numtyp r1 = ucl_sqrt(rsq1); numtyp r1inv = ucl_rsqrt(rsq1); @@ -497,9 +588,11 @@ __kernel void k_tersoff_three_center(const __global numtyp4 *restrict x_, //int jj = (nbor_j-offset_j-2*nbor_pitch) / n_stride; //int idx = jj*n_stride + i*t_per_atom + offset_j; - int idx; - zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, - i, nbor_j, offset_j, idx); + //idx to zetaij is shifted by n_stride relative to nbor_j in dev_short_nbor + int idx = nbor_j; + if (dev_packed==dev_nbor) idx -= n_stride; +// zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, +// i, nbor_j, offset_j, idx); acctyp4 zeta_ij = zetaij[idx]; // fetch(zeta_ij,idx,zeta_tex); numtyp force = zeta_ij.x*tpainv; numtyp prefactor = zeta_ij.y; @@ -520,9 +613,15 @@ __kernel void k_tersoff_three_center(const __global numtyp4 *restrict x_, virial[5] += delr1[1]*delr1[2]*mforce; } - int nbor_k=nborj_start-offset_j+offset_k; - for ( ; nbor_k cutsq[ijparam]) continue; - numtyp mdelr1[3]; mdelr1[0] = -delr1[0]; mdelr1[1] = -delr1[1]; @@ -683,13 +790,20 @@ __kernel void k_tersoff_three_end(const __global numtyp4 *restrict x_, k_end=nbor_k+numk; nbor_k+=offset_k; } + + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } int nbork_start = nbor_k; // look up for zeta_ji: find i in the j's neighbor list int m = tid / t_per_atom; int ijnum = -1; for ( ; nbor_k cutsq[ijparam]) continue; - numtyp mdelr1[3]; mdelr1[0] = -delr1[0]; mdelr1[1] = -delr1[1]; @@ -909,13 +1035,20 @@ __kernel void k_tersoff_three_end_vatom(const __global numtyp4 *restrict x_, k_end=nbor_k+numk; nbor_k+=offset_k; } + + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } int nbork_start = nbor_k; // look up for zeta_ji int m = tid / t_per_atom; int ijnum = -1; for ( ; nbor_k { const double* h, const double* gamma, const double* beta, const double* powern, const double* cutsq); - /// Pair loop with host neighboring - void compute(const int f_ago, const int inum_full, const int nall, - const int nlist, double **host_x, int *host_type, - int *ilist, int *numj, int **firstneigh, const bool eflag, - const bool vflag, const bool eatom, const bool vatom, - int &host_start, const double cpu_time, bool &success); - - /// Pair loop with device neighboring - int ** compute(const int ago, const int inum_full, - const int nall, double **host_x, int *host_type, double *sublo, - double *subhi, tagint *tag, int **nspecial, - tagint **special, const bool eflag, const bool vflag, - const bool eatom, const bool vatom, int &host_start, - int **ilist, int **numj, const double cpu_time, bool &success); - /// Clear all host and device data /** \note This is called at the beginning of the init() routine **/ void clear(); @@ -104,8 +89,7 @@ class Tersoff : public BaseThree { UCL_Kernel k_zeta; UCL_Texture ts1_tex, ts2_tex, ts3_tex, ts4_tex, ts5_tex; - - int _max_nbors; + numtyp _cutshortsq; private: bool _allocated; diff --git a/lib/gpu/lal_tersoff_mod.cpp b/lib/gpu/lal_tersoff_mod.cpp index 553dad3583..c37c07f1a1 100644 --- a/lib/gpu/lal_tersoff_mod.cpp +++ b/lib/gpu/lal_tersoff_mod.cpp @@ -55,7 +55,8 @@ int TersoffMT::init(const int ntypes, const int nlocal, const int nall, const in int success; success=this->init_three(nlocal,nall,max_nbors,0,cell_size,gpu_split, _screen,tersoff_mod,"k_tersoff_mod_repulsive", - "k_tersoff_mod_three_center", "k_tersoff_mod_three_end"); + "k_tersoff_mod_three_center", "k_tersoff_mod_three_end", + "k_tersoff_mod_short_nbor"); if (success!=0) return success; @@ -157,11 +158,16 @@ int TersoffMT::init(const int ntypes, const int nlocal, const int nall, const in UCL_H_Vec cutsq_view(nparams,*(this->ucl_device), UCL_WRITE_ONLY); - for (int i=0; i(host_cutsq[i]); + if (cutsqmax < host_cutsq[i]) cutsqmax = host_cutsq[i]; + } cutsq.alloc(nparams,*(this->ucl_device),UCL_READ_ONLY); ucl_copy(cutsq,cutsq_view,false); + _cutshortsq = static_cast(cutsqmax); + UCL_H_Vec dview_elem2param(nelements*nelements*nelements, *(this->ucl_device), UCL_WRITE_ONLY); @@ -219,171 +225,6 @@ double TersoffMT::host_memory_usage() const { #define KTHREADS this->_threads_per_atom #define JTHREADS this->_threads_per_atom -// --------------------------------------------------------------------------- -// Copy nbor list from host if necessary and then calculate forces, virials,.. -// --------------------------------------------------------------------------- -template -void TersoffMT::compute(const int f_ago, const int inum_full, const int nall, - const int nlist, double **host_x, int *host_type, - int *ilist, int *numj, int **firstneigh, - const bool eflag, const bool vflag, const bool eatom, - const bool vatom, int &host_start, - const double cpu_time, bool &success) { - this->acc_timers(); - if (inum_full==0) { - host_start=0; - // Make sure textures are correct if realloc by a different hybrid style - this->resize_atom(0,nall,success); - this->zero_timers(); - return; - } - - int ago=this->hd_balancer.ago_first(f_ago); - int inum=this->hd_balancer.balance(ago,inum_full,cpu_time); - this->ans->inum(inum); - #ifdef THREE_CONCURRENT - this->ans2->inum(inum); - #endif - host_start=inum; - - if (ago==0) { - this->reset_nbors(nall, inum, nlist, ilist, numj, firstneigh, success); - if (!success) - return; - _max_nbors = this->nbor->max_nbor_loop(nlist,numj,ilist); - } - - this->atom->cast_x_data(host_x,host_type); - this->hd_balancer.start_timer(); - this->atom->add_x_data(host_x,host_type); - - // re-allocate zetaij if necessary - if (nall*_max_nbors > _zetaij.cols()) { - int _nmax=static_cast(static_cast(nall)*1.10); - _zetaij.resize(_max_nbors*_nmax); - } - - int _eflag; - if (eflag) - _eflag=1; - else - _eflag=0; - - int ainum=nlist; - int nbor_pitch=this->nbor->nbor_pitch(); - int BX=this->block_pair(); - int GX=static_cast(ceil(static_cast(ainum)/ - (BX/(JTHREADS*KTHREADS)))); - - this->k_zeta.set_size(GX,BX); - this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &cutsq, - &map, &elem2param, &_nelements, &_nparams, &_zetaij, - &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &_eflag, &ainum, &nbor_pitch, &this->_threads_per_atom); - - int evatom=0; - if (eatom || vatom) - evatom=1; - #ifdef THREE_CONCURRENT - this->ucl_device->sync(); - #endif - loop(eflag,vflag,evatom); - this->ans->copy_answers(eflag,vflag,eatom,vatom,ilist); - this->device->add_ans_object(this->ans); - #ifdef THREE_CONCURRENT - this->ans2->copy_answers(eflag,vflag,eatom,vatom,ilist); - this->device->add_ans_object(this->ans2); - #endif - this->hd_balancer.stop_timer(); -} - -// --------------------------------------------------------------------------- -// Reneighbor on GPU if necessary and then compute forces, virials, energies -// --------------------------------------------------------------------------- -template -int ** TersoffMT::compute(const int ago, const int inum_full, - const int nall, double **host_x, int *host_type, - double *sublo, double *subhi, tagint *tag, - int **nspecial, tagint **special, const bool eflag, - const bool vflag, const bool eatom, - const bool vatom, int &host_start, - int **ilist, int **jnum, - const double cpu_time, bool &success) { - this->acc_timers(); - - if (inum_full==0) { - host_start=0; - // Make sure textures are correct if realloc by a different hybrid style - this->resize_atom(0,nall,success); - this->zero_timers(); - return NULL; - } - - this->hd_balancer.balance(cpu_time); - int inum=this->hd_balancer.get_gpu_count(ago,inum_full); - this->ans->inum(inum); - #ifdef THREE_CONCURRENT - this->ans2->inum(inum); - #endif - host_start=inum; - - // Build neighbor list on GPU if necessary - if (ago==0) { - _max_nbors = this->build_nbor_list(inum, inum_full-inum, nall, host_x, host_type, - sublo, subhi, tag, nspecial, special, success); - if (!success) - return NULL; - this->hd_balancer.start_timer(); - } else { - this->atom->cast_x_data(host_x,host_type); - this->hd_balancer.start_timer(); - this->atom->add_x_data(host_x,host_type); - } - *ilist=this->nbor->host_ilist.begin(); - *jnum=this->nbor->host_acc.begin(); - - // re-allocate zetaij if necessary - if (nall*_max_nbors > _zetaij.cols()) { - int _nmax=static_cast(static_cast(nall)*1.10); - _zetaij.resize(_max_nbors*_nmax); - } - - int _eflag; - if (eflag) - _eflag=1; - else - _eflag=0; - - int ainum=nall; - int nbor_pitch=this->nbor->nbor_pitch(); - int BX=this->block_pair(); - int GX=static_cast(ceil(static_cast(ainum)/ - (BX/(JTHREADS*KTHREADS)))); - - this->k_zeta.set_size(GX,BX); - this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &cutsq, - &map, &elem2param, &_nelements, &_nparams, &_zetaij, - &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &_eflag, &ainum, &nbor_pitch, &this->_threads_per_atom); - - int evatom=0; - if (eatom || vatom) - evatom=1; - #ifdef THREE_CONCURRENT - this->ucl_device->sync(); - #endif - loop(eflag,vflag,evatom); - this->ans->copy_answers(eflag,vflag,eatom,vatom); - this->device->add_ans_object(this->ans); - #ifdef THREE_CONCURRENT - this->ans2->copy_answers(eflag,vflag,eatom,vatom); - this->device->add_ans_object(this->ans2); - #endif - this->hd_balancer.stop_timer(); - - return this->nbor->host_jlist.begin()-host_start; -} - // --------------------------------------------------------------------------- // Calculate energies, forces, and torques // --------------------------------------------------------------------------- @@ -402,9 +243,40 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { else vflag=0; - int ainum=this->ans->inum(); + // build the short neighbor list + int ainum=this->_ainum; int nbor_pitch=this->nbor->nbor_pitch(); - int GX=static_cast(ceil(static_cast(this->ans->inum())/ + int GX=static_cast(ceil(static_cast(ainum)/ + (BX/this->_threads_per_atom))); + + this->k_short_nbor.set_size(GX,BX); + this->k_short_nbor.run(&this->atom->x, &cutsq, &map, + &elem2param, &_nelements, &_nparams, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &ainum, + &nbor_pitch, &this->_threads_per_atom); + + // re-allocate zetaij if necessary + int nall = this->_nall; + if (nall*this->_max_nbors > _zetaij.cols()) { + int _nmax=static_cast(static_cast(nall)*1.10); + _zetaij.resize(this->_max_nbors*_nmax); + } + + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->_ainum)/ + (BX/(JTHREADS*KTHREADS)))); + + this->k_zeta.set_size(GX,BX); + this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &cutsq, + &map, &elem2param, &_nelements, &_nparams, &_zetaij, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, + &_eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); + + ainum=this->ans->inum(); + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->ans->inum())/ (BX/this->_threads_per_atom))); this->time_pair.start(); @@ -412,6 +284,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_pair.run(&this->atom->x, &ts1, &ts2, &cutsq, &map, &elem2param, &_nelements, &_nparams, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom); @@ -423,6 +296,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_center.run(&this->atom->x, &ts1, &ts2, &ts4, &ts5, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &evatom); @@ -437,7 +311,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &ts1, &ts2, &ts4, &ts5, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -446,7 +320,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &ts1, &ts2, &ts4, &ts5, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_tersoff_mod.cu b/lib/gpu/lal_tersoff_mod.cu index 3a81b36941..576359b514 100644 --- a/lib/gpu/lal_tersoff_mod.cu +++ b/lib/gpu/lal_tersoff_mod.cu @@ -106,7 +106,7 @@ texture ts5_tex; ans[ii]=old; \ } -#define store_zeta(z, tid, t_per_atom, offset) \ +#define acc_zeta(z, tid, t_per_atom, offset) \ if (t_per_atom>1) { \ __local acctyp red_acc[BLOCK_PAIR]; \ red_acc[tid]=z; \ @@ -155,7 +155,7 @@ texture ts5_tex; ans[ii]=old; \ } -#define store_zeta(z, tid, t_per_atom, offset) \ +#define acc_zeta(z, tid, t_per_atom, offset) \ if (t_per_atom>1) { \ for (unsigned int s=t_per_atom/2; s>0; s>>=1) { \ z += shfl_xor(z, s, t_per_atom); \ @@ -164,6 +164,65 @@ texture ts5_tex; #endif +__kernel void k_tersoff_mod_short_nbor(const __global numtyp4 *restrict x_, + const __global numtyp *restrict cutsq, + const __global int *restrict map, + const __global int *restrict elem2param, + const int nelements, const int nparams, + const __global int * dev_nbor, + const __global int * dev_packed, + __global int * dev_short_nbor, + const int inum, const int nbor_pitch, + const int t_per_atom) { + __local int n_stride; + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + if (ii cutsq[ijparam]) continue; - // compute zeta_ij - z = (numtyp)0; + z = (acctyp)0; int nbor_k = nborj_start-offset_j+offset_k; - for ( ; nbor_k < nbor_end; nbor_k+=n_stride) { - int k=dev_packed[nbor_k]; + int k_end = nbor_end; + if (dev_packed==dev_nbor) { + int numk = dev_short_nbor[nbor_k-n_stride]; + k_end = nbor_k+fast_mul(numk,n_stride); + } + + for ( ; nbor_k < k_end; nbor_k+=n_stride) { + int k=nbor_mem[nbor_k]; k &= NEIGHMASK; if (k == j) continue; @@ -287,10 +358,12 @@ __kernel void k_tersoff_mod_zeta(const __global numtyp4 *restrict x_, //int jj = (nbor_j-offset_j-2*nbor_pitch)/n_stride; //int idx = jj*n_stride + i*t_per_atom + offset_j; - int idx; - zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, - i, nbor_j, offset_j, idx); - store_zeta(z, tid, t_per_atom, offset_k); + //idx to zetaij is shifted by n_stride relative to nbor_j in dev_short_nbor + int idx = nbor_j; + if (dev_packed==dev_nbor) idx -= n_stride; +// zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, +// i, nbor_j, offset_j, idx); + acc_zeta(z, tid, t_per_atom, offset_k); numtyp4 ts1_ijparam = ts1[ijparam]; //fetch4(ts1_ijparam,ijparam,ts1_tex); numtyp ijparam_lam2 = ts1_ijparam.y; @@ -331,6 +404,7 @@ __kernel void k_tersoff_mod_repulsive(const __global numtyp4 *restrict x_, const int nelements, const int nparams, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -357,8 +431,8 @@ __kernel void k_tersoff_mod_repulsive(const __global numtyp4 *restrict x_, __syncthreads(); if (ii0) - energy+=feng[1]; - if (vflag>0) { - virial[0] += delx*delx*force; - virial[1] += dely*dely*force; - virial[2] += delz*delz*force; - virial[3] += delx*dely*force; - virial[4] += delx*delz*force; - virial[5] += dely*delz*force; - } + if (eflag>0) + energy+=feng[1]; + if (vflag>0) { + virial[0] += delx*delx*force; + virial[1] += dely*dely*force; + virial[2] += delz*delz*force; + virial[3] += delx*dely*force; + virial[4] += delx*delz*force; + virial[5] += dely*delz*force; } } // for nbor @@ -430,6 +511,7 @@ __kernel void k_tersoff_mod_three_center(const __global numtyp4 *restrict x_, const __global acctyp4 *restrict zetaij, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -465,20 +547,28 @@ __kernel void k_tersoff_mod_three_center(const __global numtyp4 *restrict x_, if (ii cutsq[ijparam]) continue; numtyp r1 = ucl_sqrt(rsq1); numtyp r1inv = ucl_rsqrt(rsq1); @@ -501,9 +590,11 @@ __kernel void k_tersoff_mod_three_center(const __global numtyp4 *restrict x_, //int jj = (nbor_j-offset_j-2*nbor_pitch) / n_stride; //int idx = jj*n_stride + i*t_per_atom + offset_j; - int idx; - zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, - i, nbor_j, offset_j, idx); + //idx to zetaij is shifted by n_stride relative to nbor_j in dev_short_nbor + int idx = nbor_j; + if (dev_packed==dev_nbor) idx -= n_stride; +// zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, +// i, nbor_j, offset_j, idx); acctyp4 zeta_ij = zetaij[idx]; // fetch(zeta_ij,idx,zeta_tex); numtyp force = zeta_ij.x*tpainv; numtyp prefactor = zeta_ij.y; @@ -524,9 +615,15 @@ __kernel void k_tersoff_mod_three_center(const __global numtyp4 *restrict x_, virial[5] += delr1[1]*delr1[2]*mforce; } - int nbor_k=nborj_start-offset_j+offset_k; - for ( ; nbor_k cutsq[ijparam]) continue; - numtyp mdelr1[3]; mdelr1[0] = -delr1[0]; mdelr1[1] = -delr1[1]; @@ -693,13 +798,20 @@ __kernel void k_tersoff_mod_three_end(const __global numtyp4 *restrict x_, k_end=nbor_k+numk; nbor_k+=offset_k; } + + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } int nbork_start = nbor_k; // look up for zeta_ji: find i in the j's neighbor list int m = tid / t_per_atom; int ijnum = -1; for ( ; nbor_k cutsq[ijparam]) continue; - numtyp mdelr1[3]; mdelr1[0] = -delr1[0]; mdelr1[1] = -delr1[1]; @@ -928,13 +1052,20 @@ __kernel void k_tersoff_mod_three_end_vatom(const __global numtyp4 *restrict x_, k_end=nbor_k+numk; nbor_k+=offset_k; } + + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } int nbork_start = nbor_k; // look up for zeta_ji int m = tid / t_per_atom; int ijnum = -1; for ( ; nbor_k { const double* h, const double* beta, const double* powern, const double* powern_del, const double* ca1, const double* cutsq); - /// Pair loop with host neighboring - void compute(const int f_ago, const int inum_full, const int nall, - const int nlist, double **host_x, int *host_type, - int *ilist, int *numj, int **firstneigh, const bool eflag, - const bool vflag, const bool eatom, const bool vatom, - int &host_start, const double cpu_time, bool &success); - - /// Pair loop with device neighboring - int ** compute(const int ago, const int inum_full, - const int nall, double **host_x, int *host_type, double *sublo, - double *subhi, tagint *tag, int **nspecial, - tagint **special, const bool eflag, const bool vflag, - const bool eatom, const bool vatom, int &host_start, - int **ilist, int **numj, const double cpu_time, bool &success); - /// Clear all host and device data /** \note This is called at the beginning of the init() routine **/ void clear(); @@ -104,8 +89,7 @@ class TersoffMod : public BaseThree { UCL_Kernel k_zeta; UCL_Texture ts1_tex, ts2_tex, ts3_tex, ts4_tex, ts5_tex; - - int _max_nbors; + numtyp _cutshortsq; private: bool _allocated; diff --git a/lib/gpu/lal_tersoff_zbl.cpp b/lib/gpu/lal_tersoff_zbl.cpp index 9cce8a802d..341f663030 100644 --- a/lib/gpu/lal_tersoff_zbl.cpp +++ b/lib/gpu/lal_tersoff_zbl.cpp @@ -62,7 +62,8 @@ int TersoffZT::init(const int ntypes, const int nlocal, const int nall, int success; success=this->init_three(nlocal,nall,max_nbors,0,cell_size,gpu_split, _screen,tersoff_zbl,"k_tersoff_zbl_repulsive", - "k_tersoff_zbl_three_center", "k_tersoff_zbl_three_end"); + "k_tersoff_zbl_three_center", "k_tersoff_zbl_three_end", + "k_tersoff_zbl_short_nbor"); if (success!=0) return success; @@ -177,11 +178,16 @@ int TersoffZT::init(const int ntypes, const int nlocal, const int nall, UCL_H_Vec cutsq_view(nparams,*(this->ucl_device), UCL_WRITE_ONLY); - for (int i=0; i(host_cutsq[i]); + if (cutsqmax < host_cutsq[i]) cutsqmax = host_cutsq[i]; + } cutsq.alloc(nparams,*(this->ucl_device),UCL_READ_ONLY); ucl_copy(cutsq,cutsq_view,false); + _cutshortsq = static_cast(cutsqmax); + UCL_H_Vec dview_elem2param(nelements*nelements*nelements, *(this->ucl_device), UCL_WRITE_ONLY); @@ -244,171 +250,6 @@ double TersoffZT::host_memory_usage() const { #define KTHREADS this->_threads_per_atom #define JTHREADS this->_threads_per_atom -// --------------------------------------------------------------------------- -// Copy nbor list from host if necessary and then calculate forces, virials,.. -// --------------------------------------------------------------------------- -template -void TersoffZT::compute(const int f_ago, const int inum_full, const int nall, - const int nlist, double **host_x, int *host_type, - int *ilist, int *numj, int **firstneigh, - const bool eflag, const bool vflag, const bool eatom, - const bool vatom, int &host_start, - const double cpu_time, bool &success) { - this->acc_timers(); - if (inum_full==0) { - host_start=0; - // Make sure textures are correct if realloc by a different hybrid style - this->resize_atom(0,nall,success); - this->zero_timers(); - return; - } - - int ago=this->hd_balancer.ago_first(f_ago); - int inum=this->hd_balancer.balance(ago,inum_full,cpu_time); - this->ans->inum(inum); - #ifdef THREE_CONCURRENT - this->ans2->inum(inum); - #endif - host_start=inum; - - if (ago==0) { - this->reset_nbors(nall, inum, nlist, ilist, numj, firstneigh, success); - if (!success) - return; - _max_nbors = this->nbor->max_nbor_loop(nlist,numj,ilist); - } - - this->atom->cast_x_data(host_x,host_type); - this->hd_balancer.start_timer(); - this->atom->add_x_data(host_x,host_type); - - // re-allocate zetaij if necessary - if (nall*_max_nbors > _zetaij.cols()) { - int _nmax=static_cast(static_cast(nall)*1.10); - _zetaij.resize(_max_nbors*_nmax); - } - - int _eflag; - if (eflag) - _eflag=1; - else - _eflag=0; - - int ainum=nlist; - int nbor_pitch=this->nbor->nbor_pitch(); - int BX=this->block_pair(); - int GX=static_cast(ceil(static_cast(ainum)/ - (BX/(JTHREADS*KTHREADS)))); - - this->k_zeta.set_size(GX,BX); - this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &ts6, &cutsq, - &map, &elem2param, &_nelements, &_nparams, &_zetaij, - &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &_eflag, &ainum, &nbor_pitch, &this->_threads_per_atom); - - int evatom=0; - if (eatom || vatom) - evatom=1; - #ifdef THREE_CONCURRENT - this->ucl_device->sync(); - #endif - loop(eflag,vflag,evatom); - this->ans->copy_answers(eflag,vflag,eatom,vatom,ilist); - this->device->add_ans_object(this->ans); - #ifdef THREE_CONCURRENT - this->ans2->copy_answers(eflag,vflag,eatom,vatom,ilist); - this->device->add_ans_object(this->ans2); - #endif - this->hd_balancer.stop_timer(); -} - -// --------------------------------------------------------------------------- -// Reneighbor on GPU if necessary and then compute forces, virials, energies -// --------------------------------------------------------------------------- -template -int ** TersoffZT::compute(const int ago, const int inum_full, - const int nall, double **host_x, int *host_type, - double *sublo, double *subhi, tagint *tag, - int **nspecial, tagint **special, const bool eflag, - const bool vflag, const bool eatom, - const bool vatom, int &host_start, - int **ilist, int **jnum, - const double cpu_time, bool &success) { - this->acc_timers(); - - if (inum_full==0) { - host_start=0; - // Make sure textures are correct if realloc by a different hybrid style - this->resize_atom(0,nall,success); - this->zero_timers(); - return NULL; - } - - this->hd_balancer.balance(cpu_time); - int inum=this->hd_balancer.get_gpu_count(ago,inum_full); - this->ans->inum(inum); - #ifdef THREE_CONCURRENT - this->ans2->inum(inum); - #endif - host_start=inum; - - // Build neighbor list on GPU if necessary - if (ago==0) { - _max_nbors = this->build_nbor_list(inum, inum_full-inum, nall, host_x, host_type, - sublo, subhi, tag, nspecial, special, success); - if (!success) - return NULL; - this->hd_balancer.start_timer(); - } else { - this->atom->cast_x_data(host_x,host_type); - this->hd_balancer.start_timer(); - this->atom->add_x_data(host_x,host_type); - } - *ilist=this->nbor->host_ilist.begin(); - *jnum=this->nbor->host_acc.begin(); - - // re-allocate zetaij if necessary - if (nall*_max_nbors > _zetaij.cols()) { - int _nmax=static_cast(static_cast(nall)*1.10); - _zetaij.resize(_max_nbors*_nmax); - } - - int _eflag; - if (eflag) - _eflag=1; - else - _eflag=0; - - int ainum=nall; - int nbor_pitch=this->nbor->nbor_pitch(); - int BX=this->block_pair(); - int GX=static_cast(ceil(static_cast(ainum)/ - (BX/(JTHREADS*KTHREADS)))); - - this->k_zeta.set_size(GX,BX); - this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &ts6, &cutsq, - &map, &elem2param, &_nelements, &_nparams, &_zetaij, - &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &_eflag, &ainum, &nbor_pitch, &this->_threads_per_atom); - - int evatom=0; - if (eatom || vatom) - evatom=1; - #ifdef THREE_CONCURRENT - this->ucl_device->sync(); - #endif - loop(eflag,vflag,evatom); - this->ans->copy_answers(eflag,vflag,eatom,vatom); - this->device->add_ans_object(this->ans); - #ifdef THREE_CONCURRENT - this->ans2->copy_answers(eflag,vflag,eatom,vatom); - this->device->add_ans_object(this->ans2); - #endif - this->hd_balancer.stop_timer(); - - return this->nbor->host_jlist.begin()-host_start; -} - // --------------------------------------------------------------------------- // Calculate energies, forces, and torques // --------------------------------------------------------------------------- @@ -427,9 +268,40 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { else vflag=0; - int ainum=this->ans->inum(); + // build the short neighbor list + int ainum=this->_ainum; int nbor_pitch=this->nbor->nbor_pitch(); - int GX=static_cast(ceil(static_cast(this->ans->inum())/ + int GX=static_cast(ceil(static_cast(ainum)/ + (BX/this->_threads_per_atom))); + + this->k_short_nbor.set_size(GX,BX); + this->k_short_nbor.run(&this->atom->x, &cutsq, &map, + &elem2param, &_nelements, &_nparams, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &ainum, + &nbor_pitch, &this->_threads_per_atom); + + // re-allocate zetaij if necessary + int nall = this->_nall; + if (nall*this->_max_nbors > _zetaij.cols()) { + int _nmax=static_cast(static_cast(nall)*1.10); + _zetaij.resize(this->_max_nbors*_nmax); + } + + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->_ainum)/ + (BX/(JTHREADS*KTHREADS)))); + + this->k_zeta.set_size(GX,BX); + this->k_zeta.run(&this->atom->x, &ts1, &ts2, &ts3, &ts4, &ts5, &ts6, &cutsq, + &map, &elem2param, &_nelements, &_nparams, &_zetaij, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, + &_eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); + + ainum=this->ans->inum(); + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->ans->inum())/ (BX/this->_threads_per_atom))); this->time_pair.start(); @@ -438,6 +310,7 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { &_global_e, &_global_a_0, &_global_epsilon_0, &cutsq, &map, &elem2param, &_nelements, &_nparams, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom); @@ -449,6 +322,7 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_center.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &evatom); @@ -463,7 +337,7 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -472,7 +346,7 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_tersoff_zbl.cu b/lib/gpu/lal_tersoff_zbl.cu index 9509b9802c..e8bb017f59 100644 --- a/lib/gpu/lal_tersoff_zbl.cu +++ b/lib/gpu/lal_tersoff_zbl.cu @@ -109,7 +109,7 @@ texture ts6_tex; ans[ii]=old; \ } -#define store_zeta(z, tid, t_per_atom, offset) \ +#define acc_zeta(z, tid, t_per_atom, offset) \ if (t_per_atom>1) { \ __local acctyp red_acc[BLOCK_PAIR]; \ red_acc[tid]=z; \ @@ -158,7 +158,7 @@ texture ts6_tex; ans[ii]=old; \ } -#define store_zeta(z, tid, t_per_atom, offset) \ +#define acc_zeta(z, tid, t_per_atom, offset) \ if (t_per_atom>1) { \ for (unsigned int s=t_per_atom/2; s>0; s>>=1) { \ z += shfl_xor(z, s, t_per_atom); \ @@ -167,6 +167,65 @@ texture ts6_tex; #endif +__kernel void k_tersoff_zbl_short_nbor(const __global numtyp4 *restrict x_, + const __global numtyp *restrict cutsq, + const __global int *restrict map, + const __global int *restrict elem2param, + const int nelements, const int nparams, + const __global int * dev_nbor, + const __global int * dev_packed, + __global int * dev_short_nbor, + const int inum, const int nbor_pitch, + const int t_per_atom) { + __local int n_stride; + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + if (ii cutsq[ijparam]) continue; - // compute zeta_ij z = (acctyp)0; int nbor_k = nborj_start-offset_j+offset_k; - for ( ; nbor_k < nbor_end; nbor_k+=n_stride) { - int k=dev_packed[nbor_k]; + int k_end = nbor_end; + if (dev_packed==dev_nbor) { + int numk = dev_short_nbor[nbor_k-n_stride]; + k_end = nbor_k+fast_mul(numk,n_stride); + } + + for ( ; nbor_k < k_end; nbor_k+=n_stride) { + int k=nbor_mem[nbor_k]; k &= NEIGHMASK; if (k == j) continue; @@ -290,10 +361,12 @@ __kernel void k_tersoff_zbl_zeta(const __global numtyp4 *restrict x_, //int jj = (nbor_j-offset_j-2*nbor_pitch)/n_stride; //int idx = jj*n_stride + i*t_per_atom + offset_j; - int idx; - zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, - i, nbor_j, offset_j, idx); - store_zeta(z, tid, t_per_atom, offset_k); + //idx to zetaij is shifted by n_stride relative to nbor_j in dev_short_nbor + int idx = nbor_j; + if (dev_packed==dev_nbor) idx -= n_stride; +// zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, +// i, nbor_j, offset_j, idx); + acc_zeta(z, tid, t_per_atom, offset_k); numtyp4 ts1_ijparam = ts1[ijparam]; //fetch4(ts1_ijparam,ijparam,ts1_tex); numtyp ijparam_lam2 = ts1_ijparam.y; @@ -342,6 +415,7 @@ __kernel void k_tersoff_zbl_repulsive(const __global numtyp4 *restrict x_, const int nelements, const int nparams, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -370,8 +444,8 @@ __kernel void k_tersoff_zbl_repulsive(const __global numtyp4 *restrict x_, __syncthreads(); if (ii0) - energy+=feng[1]; - if (vflag>0) { - virial[0] += delx*delx*force; - virial[1] += dely*dely*force; - virial[2] += delz*delz*force; - virial[3] += delx*dely*force; - virial[4] += delx*delz*force; - virial[5] += dely*delz*force; - } + if (eflag>0) + energy+=feng[1]; + if (vflag>0) { + virial[0] += delx*delx*force; + virial[1] += dely*dely*force; + virial[2] += delz*delz*force; + virial[3] += delx*dely*force; + virial[4] += delx*delz*force; + virial[5] += dely*delz*force; } } // for nbor @@ -448,6 +529,7 @@ __kernel void k_tersoff_zbl_three_center(const __global numtyp4 *restrict x_, const __global acctyp4 *restrict zetaij, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -481,20 +563,28 @@ __kernel void k_tersoff_zbl_three_center(const __global numtyp4 *restrict x_, if (ii cutsq[ijparam]) continue; numtyp r1 = ucl_sqrt(rsq1); numtyp r1inv = ucl_rsqrt(rsq1); @@ -517,9 +606,11 @@ __kernel void k_tersoff_zbl_three_center(const __global numtyp4 *restrict x_, //int jj = (nbor_j-offset_j-2*nbor_pitch) / n_stride; //int idx = jj*n_stride + i*t_per_atom + offset_j; - int idx; - zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, - i, nbor_j, offset_j, idx); + //idx to zetaij is shifted by n_stride relative to nbor_j in dev_short_nbor + int idx = nbor_j; + if (dev_packed==dev_nbor) idx -= n_stride; +// zeta_idx(dev_nbor,dev_packed, nbor_pitch, n_stride, t_per_atom, +// i, nbor_j, offset_j, idx); acctyp4 zeta_ij = zetaij[idx]; // fetch(zeta_ij,idx,zeta_tex); numtyp force = zeta_ij.x*tpainv; numtyp prefactor = zeta_ij.y; @@ -540,9 +631,15 @@ __kernel void k_tersoff_zbl_three_center(const __global numtyp4 *restrict x_, virial[5] += delr1[1]*delr1[2]*mforce; } - int nbor_k=nborj_start-offset_j+offset_k; - for ( ; nbor_k cutsq[ijparam]) continue; - numtyp mdelr1[3]; mdelr1[0] = -delr1[0]; mdelr1[1] = -delr1[1]; @@ -703,13 +808,20 @@ __kernel void k_tersoff_zbl_three_end(const __global numtyp4 *restrict x_, k_end=nbor_k+numk; nbor_k+=offset_k; } + + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } int nbork_start = nbor_k; // look up for zeta_ji: find i in the j's neighbor list int m = tid / t_per_atom; int ijnum = -1; for ( ; nbor_k cutsq[ijparam]) continue; - numtyp mdelr1[3]; mdelr1[0] = -delr1[0]; mdelr1[1] = -delr1[1]; @@ -929,13 +1053,20 @@ __kernel void k_tersoff_zbl_three_end_vatom(const __global numtyp4 *restrict x_, k_end=nbor_k+numk; nbor_k+=offset_k; } + + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } int nbork_start = nbor_k; // look up for zeta_ji int m = tid / t_per_atom; int ijnum = -1; for ( ; nbor_k { const double* ZBLcut, const double* ZBLexpscale, const double global_e, const double global_a_0, const double global_epsilon_0, const double* cutsq); - /// Pair loop with host neighboring - void compute(const int f_ago, const int inum_full, const int nall, - const int nlist, double **host_x, int *host_type, - int *ilist, int *numj, int **firstneigh, const bool eflag, - const bool vflag, const bool eatom, const bool vatom, - int &host_start, const double cpu_time, bool &success); - - /// Pair loop with device neighboring - int ** compute(const int ago, const int inum_full, - const int nall, double **host_x, int *host_type, double *sublo, - double *subhi, tagint *tag, int **nspecial, - tagint **special, const bool eflag, const bool vflag, - const bool eatom, const bool vatom, int &host_start, - int **ilist, int **numj, const double cpu_time, bool &success); - /// Clear all host and device data /** \note This is called at the beginning of the init() routine **/ void clear(); @@ -109,8 +94,8 @@ class TersoffZBL : public BaseThree { UCL_Kernel k_zeta; UCL_Texture ts1_tex, ts2_tex, ts3_tex, ts4_tex, ts5_tex, ts6_tex; - int _max_nbors; numtyp _global_e,_global_a_0,_global_epsilon_0; + numtyp _cutshortsq; private: bool _allocated; diff --git a/lib/gpu/lal_ufm.cpp b/lib/gpu/lal_ufm.cpp new file mode 100644 index 0000000000..c7aa2cca39 --- /dev/null +++ b/lib/gpu/lal_ufm.cpp @@ -0,0 +1,172 @@ +/*************************************************************************** + ufm.cpp + ------------------- + Rodolfo Paula Leite (Unicamp/Brazil) + Maurice de Koning (Unicamp/Brazil) + + Class for acceleration of the ufm pair style. + + __________________________________________________________________________ + This file is part of the LAMMPS Accelerator Library (LAMMPS_AL) + __________________________________________________________________________ + + begin : + email : pl.rodolfo@gmail.com + dekoning@ifi.unicamp.br + ***************************************************************************/ + +#if defined(USE_OPENCL) +#include "ufm_cl.h" +#elif defined(USE_CUDART) +const char *ufm=0; +#else +#include "ufm_cubin.h" +#endif + +#include "lal_ufm.h" +#include +using namespace LAMMPS_AL; +#define UFMT UFM + +extern Device device; + +template +UFMT::UFM() : BaseAtomic(), _allocated(false) { +} + +template +UFMT::~UFM() { + clear(); +} + +template +int UFMT::bytes_per_atom(const int max_nbors) const { + return this->bytes_per_atom_atomic(max_nbors); +} + +template +int UFMT::init(const int ntypes, + double **host_cutsq, double **host_uf1, + double **host_uf2, double **host_uf3, + double **host_uf4, double **host_offset, + double *host_special_lj, const int nlocal, + const int nall, const int max_nbors, + const int maxspecial, const double cell_size, + const double gpu_split, FILE *_screen) { + int success; + success=this->init_atomic(nlocal,nall,max_nbors,maxspecial,cell_size,gpu_split, + _screen,ufm,"k_ufm"); + if (success!=0) + return success; + + // If atom type constants fit in shared memory use fast kernel + int lj_types=ntypes; + shared_types=false; + int max_shared_types=this->device->max_shared_types(); + if (lj_types<=max_shared_types && this->_block_size>=max_shared_types) { + lj_types=max_shared_types; + shared_types=true; + } + _lj_types=lj_types; + + // Allocate a host write buffer for data initialization + UCL_H_Vec host_write(lj_types*lj_types*32,*(this->ucl_device), + UCL_WRITE_ONLY); + + for (int i=0; iucl_device),UCL_READ_ONLY); + this->atom->type_pack4(ntypes,lj_types,uf1,host_write,host_uf1,host_uf2, + host_cutsq); + + uf3.alloc(lj_types*lj_types,*(this->ucl_device),UCL_READ_ONLY); + this->atom->type_pack4(ntypes,lj_types,uf3,host_write,host_uf3,host_uf4, + host_offset); + + UCL_H_Vec dview; + sp_lj.alloc(4,*(this->ucl_device),UCL_READ_ONLY); + dview.view(host_special_lj,4,*(this->ucl_device)); + ucl_copy(sp_lj,dview,false); + + _allocated=true; + this->_max_bytes=uf1.row_bytes()+uf3.row_bytes()+sp_lj.row_bytes(); + return 0; +} + +template +void UFMT::reinit(const int ntypes, double **host_cutsq, double **host_uf1, + double **host_uf2, double **host_uf3, + double **host_uf4, double **host_offset) { + // Allocate a host write buffer for data initialization + UCL_H_Vec host_write(_lj_types*_lj_types*32,*(this->ucl_device), + UCL_WRITE_ONLY); + + for (int i=0; i<_lj_types*_lj_types; i++) + host_write[i]=0.0; + + this->atom->type_pack4(ntypes,_lj_types,uf1,host_write,host_uf1,host_uf2, + host_cutsq); + this->atom->type_pack4(ntypes,_lj_types,uf3,host_write,host_uf3,host_uf4, + host_offset); +} + +template +void UFMT::clear() { + if (!_allocated) + return; + _allocated=false; + + uf1.clear(); + uf3.clear(); + sp_lj.clear(); + this->clear_atomic(); +} + +template +double UFMT::host_memory_usage() const { + return this->host_memory_usage_atomic()+sizeof(UFM); +} + +// --------------------------------------------------------------------------- +// Calculate energies, forces, and torques +// --------------------------------------------------------------------------- +template +void UFMT::loop(const bool _eflag, const bool _vflag) { + // Compute the block size and grid size to keep all cores busy + const int BX=this->block_size(); + int eflag, vflag; + if (_eflag) + eflag=1; + else + eflag=0; + + if (_vflag) + vflag=1; + else + vflag=0; + + int GX=static_cast(ceil(static_cast(this->ans->inum())/ + (BX/this->_threads_per_atom))); + + int ainum=this->ans->inum(); + int nbor_pitch=this->nbor->nbor_pitch(); + this->time_pair.start(); + if (shared_types) { + this->k_pair_fast.set_size(GX,BX); + this->k_pair_fast.run(&this->atom->x, &uf1, &uf3, &sp_lj, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->ans->force, &this->ans->engv, &eflag, + &vflag, &ainum, &nbor_pitch, + &this->_threads_per_atom); + } else { + this->k_pair.set_size(GX,BX); + this->k_pair.run(&this->atom->x, &uf1, &uf3, &_lj_types, &sp_lj, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->ans->force, &this->ans->engv, &eflag, &vflag, + &ainum, &nbor_pitch, &this->_threads_per_atom); + } + this->time_pair.stop(); +} + +template class UFM; diff --git a/lib/gpu/lal_ufm.cu b/lib/gpu/lal_ufm.cu new file mode 100644 index 0000000000..51c4df3b5b --- /dev/null +++ b/lib/gpu/lal_ufm.cu @@ -0,0 +1,188 @@ +/*************************************************************************** + ufm.cu + ------------------- + Rodolfo Paula Leite (Unicamp/Brazil) + Maurice de Koning (Unicamp/Brazil) + + Device code for acceleration of the ufm pair style + + __________________________________________________________________________ + This file is part of the LAMMPS Accelerator Library (LAMMPS_AL) + __________________________________________________________________________ + + begin : + email : pl.rodolfo@gmail.com + dekoning@ifi.unicamp.br + ***************************************************************************/ + +#ifdef NV_KERNEL +#include "lal_aux_fun1.h" +#ifndef _DOUBLE_DOUBLE +texture pos_tex; +#else +texture pos_tex; +#endif +#else +#define pos_tex x_ +#endif + +__kernel void k_ufm(const __global numtyp4 *restrict x_, + const __global numtyp4 *restrict uf1, + const __global numtyp4 *restrict uf3, + const int lj_types, + const __global numtyp *restrict sp_lj, + const __global int * dev_nbor, + const __global int * dev_packed, + __global acctyp4 *restrict ans, + __global acctyp *restrict engv, + const int eflag, const int vflag, const int inum, + const int nbor_pitch, const int t_per_atom) { + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + acctyp energy=(acctyp)0; + acctyp4 f; + f.x=(acctyp)0; f.y=(acctyp)0; f.z=(acctyp)0; + acctyp virial[6]; + for (int i=0; i<6; i++) + virial[i]=(acctyp)0; + + if (ii0) { + energy += - factor_lj * uf3[mtype].x*log(1.0 - expuf) - uf3[mtype].z; + } + if (vflag>0) { + virial[0] += delx*delx*force; + virial[1] += dely*dely*force; + virial[2] += delz*delz*force; + virial[3] += delx*dely*force; + virial[4] += delx*delz*force; + virial[5] += dely*delz*force; + } + } + + } // for nbor + store_answers(f,energy,virial,ii,inum,tid,t_per_atom,offset,eflag,vflag, + ans,engv); + } // if ii +} + +__kernel void k_ufm_fast(const __global numtyp4 *restrict x_, + const __global numtyp4 *restrict uf1_in, + const __global numtyp4 *restrict uf3_in, + const __global numtyp *restrict sp_lj_in, + const __global int * dev_nbor, + const __global int * dev_packed, + __global acctyp4 *restrict ans, + __global acctyp *restrict engv, + const int eflag, const int vflag, const int inum, + const int nbor_pitch, const int t_per_atom) { + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + __local numtyp4 uf1[MAX_SHARED_TYPES*MAX_SHARED_TYPES]; + __local numtyp4 uf3[MAX_SHARED_TYPES*MAX_SHARED_TYPES]; + __local numtyp sp_lj[4]; + if (tid<4) + sp_lj[tid]=sp_lj_in[tid]; + if (tid0) + uf3[tid]=uf3_in[tid]; + } + + acctyp energy=(acctyp)0; + acctyp4 f; + f.x=(acctyp)0; f.y=(acctyp)0; f.z=(acctyp)0; + acctyp virial[6]; + for (int i=0; i<6; i++) + virial[i]=(acctyp)0; + + __syncthreads(); + + if (ii0) { + energy += - factor_lj * uf3[mtype].x * log(1.0 - expuf) - uf3[mtype].z; + } + if (vflag>0) { + virial[0] += delx*delx*force; + virial[1] += dely*dely*force; + virial[2] += delz*delz*force; + virial[3] += delx*dely*force; + virial[4] += delx*delz*force; + virial[5] += dely*delz*force; + } + } + + } // for nbor + store_answers(f,energy,virial,ii,inum,tid,t_per_atom,offset,eflag,vflag, + ans,engv); + } // if ii +} + diff --git a/lib/gpu/lal_ufm.h b/lib/gpu/lal_ufm.h new file mode 100644 index 0000000000..aeeaacbe99 --- /dev/null +++ b/lib/gpu/lal_ufm.h @@ -0,0 +1,86 @@ +/*************************************************************************** + ufm.h + ------------------- + Rodolfo Paula Leite (Unicamp/Brazil) + Maurice de Koning (Unicamp/Brazil) + + Class for acceleration of the ufm pair style. + + __________________________________________________________________________ + This file is part of the LAMMPS Accelerator Library (LAMMPS_AL) + __________________________________________________________________________ + + begin : + email : pl.rodolfo@gmail.com + dekoning@ifi.unicamp.br + ***************************************************************************/ + +#ifndef LAL_UFM_H +#define LAL_UFM_H + +#include "lal_base_atomic.h" + +namespace LAMMPS_AL { + +template +class UFM : public BaseAtomic { + public: + UFM(); + ~UFM(); + + /// Clear any previous data and set up for a new LAMMPS run + /** \param max_nbors initial number of rows in the neighbor matrix + * \param cell_size cutoff + skin + * \param gpu_split fraction of particles handled by device + * + * Returns: + * - 0 if successfull + * - -1 if fix gpu not found + * - -3 if there is an out of memory error + * - -4 if the GPU library was not compiled for GPU + * - -5 Double precision is not supported on card **/ + int init(const int ntypes, double **host_cutsq, + double **host_uf1, double **host_uf2, double **host_uf3, + double **host_uf4, double **host_offset, double *host_special_lj, + const int nlocal, const int nall, const int max_nbors, + const int maxspecial, const double cell_size, + const double gpu_split, FILE *screen); + + /// Send updated coeffs from host to device (to be compatible with fix adapt) + void reinit(const int ntypes, double **host_cutsq, + double **host_uf1, double **host_uf2, double **host_uf3, + double **host_uf4, double **host_offset); + + /// Clear all host and device data + /** \note This is called at the beginning of the init() routine **/ + void clear(); + + /// Returns memory usage on device per atom + int bytes_per_atom(const int max_nbors) const; + + /// Total host memory used by library for pair style + double host_memory_usage() const; + + // --------------------------- TYPE DATA -------------------------- + + /// uf1.x = uf1, uf1.y = uf2, uf1.z = cutsq + UCL_D_Vec uf1; + /// uf3.x = uf3, uf3.y = uf4, uf3.z = offset + UCL_D_Vec uf3; + /// Special LJ values + UCL_D_Vec sp_lj; + + /// If atom type constants fit in shared memory, use fast kernels + bool shared_types; + + /// Number of atom types + int _lj_types; + + private: + bool _allocated; + void loop(const bool _eflag, const bool _vflag); +}; + +} + +#endif diff --git a/lib/gpu/lal_ufm_ext.cpp b/lib/gpu/lal_ufm_ext.cpp new file mode 100644 index 0000000000..ae4a5fb8fc --- /dev/null +++ b/lib/gpu/lal_ufm_ext.cpp @@ -0,0 +1,143 @@ +/*************************************************************************** + ufm_ext.cpp + ------------------------------ + Rodolfo Paula Leite (Unicamp/Brazil) + Maurice de Koning (Unicamp/Brazil) + + Functions for LAMMPS access to ufm acceleration routines. + + __________________________________________________________________________ + This file is part of the LAMMPS Accelerator Library (LAMMPS_AL) + __________________________________________________________________________ + + begin : + email : pl.rodolfo@gmail.com + dekoning@ifi.unicamp.br + ***************************************************************************/ + +#include +#include +#include + +#include "lal_ufm.h" + +using namespace std; +using namespace LAMMPS_AL; + +static UFM UFMLMF; + +// --------------------------------------------------------------------------- +// Allocate memory on host and device and copy constants to device +// --------------------------------------------------------------------------- +int ufml_gpu_init(const int ntypes, double **cutsq, double **host_uf1, + double **host_uf2, double **host_uf3, double **host_uf4, + double **offset, double *special_lj, const int inum, const int nall, + const int max_nbors, const int maxspecial, const double cell_size, + int &gpu_mode, FILE *screen) { + UFMLMF.clear(); + gpu_mode=UFMLMF.device->gpu_mode(); + double gpu_split=UFMLMF.device->particle_split(); + int first_gpu=UFMLMF.device->first_device(); + int last_gpu=UFMLMF.device->last_device(); + int world_me=UFMLMF.device->world_me(); + int gpu_rank=UFMLMF.device->gpu_rank(); + int procs_per_gpu=UFMLMF.device->procs_per_gpu(); + + UFMLMF.device->init_message(screen,"ufm",first_gpu,last_gpu); + + bool message=false; + if (UFMLMF.device->replica_me()==0 && screen) + message=true; + + if (message) { + fprintf(screen,"Initializing Device and compiling on process 0..."); + fflush(screen); + } + + int init_ok=0; + if (world_me==0) + init_ok=UFMLMF.init(ntypes, cutsq, host_uf1, host_uf2, host_uf3, + host_uf4, offset, special_lj, inum, nall, 300, + maxspecial, cell_size, gpu_split, screen); + + UFMLMF.device->world_barrier(); + if (message) + fprintf(screen,"Done.\n"); + + for (int i=0; igpu_barrier(); + if (message) + fprintf(screen,"Done.\n"); + } + if (message) + fprintf(screen,"\n"); + + if (init_ok==0) + UFMLMF.estimate_gpu_overhead(); + return init_ok; +} + +// --------------------------------------------------------------------------- +// Copy updated coeffs from host to device +// --------------------------------------------------------------------------- +void ufml_gpu_reinit(const int ntypes, double **cutsq, double **host_uf1, + double **host_uf2, double **host_uf3, double **host_uf4, + double **offset) { + int world_me=UFMLMF.device->world_me(); + int gpu_rank=UFMLMF.device->gpu_rank(); + int procs_per_gpu=UFMLMF.device->procs_per_gpu(); + + if (world_me==0) + UFMLMF.reinit(ntypes, cutsq, host_uf1, host_uf2, host_uf3, host_uf4, offset); + UFMLMF.device->world_barrier(); + + for (int i=0; igpu_barrier(); + } +} + +void ufml_gpu_clear() { + UFMLMF.clear(); +} + +int ** ufml_gpu_compute_n(const int ago, const int inum_full, + const int nall, double **host_x, int *host_type, + double *sublo, double *subhi, tagint *tag, int **nspecial, + tagint **special, const bool eflag, const bool vflag, + const bool eatom, const bool vatom, int &host_start, + int **ilist, int **jnum, const double cpu_time, + bool &success) { + return UFMLMF.compute(ago, inum_full, nall, host_x, host_type, sublo, + subhi, tag, nspecial, special, eflag, vflag, eatom, + vatom, host_start, ilist, jnum, cpu_time, success); +} + +void ufml_gpu_compute(const int ago, const int inum_full, const int nall, + double **host_x, int *host_type, int *ilist, int *numj, + int **firstneigh, const bool eflag, const bool vflag, + const bool eatom, const bool vatom, int &host_start, + const double cpu_time, bool &success) { + UFMLMF.compute(ago,inum_full,nall,host_x,host_type,ilist,numj, + firstneigh,eflag,vflag,eatom,vatom,host_start,cpu_time,success); +} + +double ufml_gpu_bytes() { + return UFMLMF.host_memory_usage(); +} + + diff --git a/lib/gpu/lal_vashishta.cpp b/lib/gpu/lal_vashishta.cpp index 96537e65d3..d03ac992bd 100644 --- a/lib/gpu/lal_vashishta.cpp +++ b/lib/gpu/lal_vashishta.cpp @@ -59,7 +59,7 @@ int VashishtaT::init(const int ntypes, const int nlocal, const int nall, const i int success; success=this->init_three(nlocal,nall,max_nbors,0,cell_size,gpu_split, _screen,vashishta,"k_vashishta","k_vashishta_three_center", - "k_vashishta_three_end"); + "k_vashishta_three_end","k_vashishta_short_nbor"); if (success!=0) return success; @@ -128,15 +128,18 @@ int VashishtaT::init(const int ntypes, const int nlocal, const int nall, const i param4.alloc(nparams,*(this->ucl_device),UCL_READ_ONLY); + double r0sqmax = 0; for (int i=0; i(r0sq); dview[i].y=static_cast(gamma[i]); dview[i].z=static_cast(cutsq[i]); dview[i].w=static_cast(r0[i]); } + _cutshortsq = static_cast(r0sqmax); + ucl_copy(param4,dview,false); param4_tex.get_texture(*(this->pair_program),"param4_tex"); param4_tex.bind_float(param4,4); @@ -223,15 +226,28 @@ void VashishtaT::loop(const bool _eflag, const bool _vflag, const int evatom) { else vflag=0; - int GX=static_cast(ceil(static_cast(this->ans->inum())/ + // build the short neighbor list + int ainum=this->_ainum; + int nbor_pitch=this->nbor->nbor_pitch(); + int GX=static_cast(ceil(static_cast(ainum)/ (BX/this->_threads_per_atom))); + this->k_short_nbor.set_size(GX,BX); + this->k_short_nbor.run(&this->atom->x, ¶m4, &map, + &elem2param, &_nelements, &_nparams, + &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &ainum, + &nbor_pitch, &this->_threads_per_atom); + // this->_nbor_data == nbor->dev_packed for gpu_nbor == 0 and tpa > 1 // this->_nbor_data == nbor->dev_nbor for gpu_nbor == 1 or tpa == 1 - int ainum=this->ans->inum(); - int nbor_pitch=this->nbor->nbor_pitch(); + ainum=this->ans->inum(); + nbor_pitch=this->nbor->nbor_pitch(); + GX=static_cast(ceil(static_cast(this->ans->inum())/ + (BX/this->_threads_per_atom))); this->time_pair.start(); + // note that k_pair does not run with the short neighbor list this->k_pair.set_size(GX,BX); this->k_pair.run(&this->atom->x, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, &map, &elem2param, &_nelements, @@ -248,6 +264,7 @@ void VashishtaT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_center.run(&this->atom->x, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), + &this->dev_short_nbor, &this->ans->force, &this->ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &evatom); Answer *end_ans; @@ -257,21 +274,19 @@ void VashishtaT::loop(const bool _eflag, const bool _vflag, const int evatom) { end_ans=this->ans; #endif if (evatom!=0) { - this->k_three_end_vatom.set_size(GX,BX); this->k_three_end_vatom.run(&this->atom->x, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } else { - this->k_three_end.set_size(GX,BX); this->k_three_end.run(&this->atom->x, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, + &this->nbor->dev_acc, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_vashishta.cu b/lib/gpu/lal_vashishta.cu index caa3c03613..d2e8bb1496 100644 --- a/lib/gpu/lal_vashishta.cu +++ b/lib/gpu/lal_vashishta.cu @@ -136,6 +136,64 @@ texture param5_tex; #endif +__kernel void k_vashishta_short_nbor(const __global numtyp4 *restrict x_, + const __global numtyp4 *restrict param4, + const __global int *restrict map, + const __global int *restrict elem2param, + const int nelements, const int nparams, + const __global int * dev_nbor, + const __global int * dev_packed, + __global int * dev_short_nbor, + const int inum, const int nbor_pitch, + const int t_per_atom) { + __local int n_stride; + int tid, ii, offset; + atom_info(t_per_atom,ii,tid,offset); + + if (ii0) energy += (param3_bigh*reta+vc2-vc3-param3_bigw*r6inv-r*param3_dvrc+param3_c0); @@ -255,31 +313,31 @@ __kernel void k_vashishta(const __global numtyp4 *restrict x_, numtyp r1 = ucl_sqrt(rsq1); \ numtyp rinvsq1 = ucl_recip(rsq1); \ numtyp rainv1 = ucl_recip(r1 - param_r0_ij); \ - numtyp gsrainv1 = param_gamma_ij * rainv1; \ + numtyp gsrainv1 = param_gamma_ij * rainv1; \ numtyp gsrainvsq1 = gsrainv1*rainv1/r1; \ numtyp expgsrainv1 = ucl_exp(gsrainv1); \ \ numtyp r2 = ucl_sqrt(rsq2); \ numtyp rinvsq2 = ucl_recip(rsq2); \ numtyp rainv2 = ucl_recip(r2 - param_r0_ik); \ - numtyp gsrainv2 = param_gamma_ik * rainv2; \ + numtyp gsrainv2 = param_gamma_ik * rainv2; \ numtyp gsrainvsq2 = gsrainv2*rainv2/r2; \ numtyp expgsrainv2 = ucl_exp(gsrainv2); \ \ numtyp rinv12 = ucl_recip(r1*r2); \ numtyp cs = (delr1x*delr2x + delr1y*delr2y + delr1z*delr2z) * rinv12; \ - numtyp delcs = cs - param_costheta_ijk; \ + numtyp delcs = cs - param_costheta_ijk; \ numtyp delcssq = delcs*delcs; \ - numtyp pcsinv = param_bigc_ijk*delcssq+1.0; \ + numtyp pcsinv = param_bigc_ijk*delcssq+1.0; \ numtyp pcsinvsq = pcsinv*pcsinv; \ numtyp pcs = delcssq/pcsinv; \ \ numtyp facexp = expgsrainv1*expgsrainv2; \ \ - numtyp facrad = param_bigb_ijk * facexp*pcs; \ + numtyp facrad = param_bigb_ijk * facexp*pcs; \ numtyp frad1 = facrad*gsrainvsq1; \ numtyp frad2 = facrad*gsrainvsq2; \ - numtyp facang = param_big2b_ijk * facexp*delcs/pcsinvsq; \ + numtyp facang = param_big2b_ijk * facexp*delcs/pcsinvsq; \ numtyp facang12 = rinv12*facang; \ numtyp csfacang = cs*facang; \ numtyp csfac1 = rinvsq1*csfacang; \ @@ -311,28 +369,28 @@ __kernel void k_vashishta(const __global numtyp4 *restrict x_, numtyp r1 = ucl_sqrt(rsq1); \ numtyp rinvsq1 = ucl_recip(rsq1); \ numtyp rainv1 = ucl_recip(r1 - param_r0_ij); \ - numtyp gsrainv1 = param_gamma_ij * rainv1; \ + numtyp gsrainv1 = param_gamma_ij * rainv1; \ numtyp gsrainvsq1 = gsrainv1*rainv1/r1; \ numtyp expgsrainv1 = ucl_exp(gsrainv1); \ \ numtyp r2 = ucl_sqrt(rsq2); \ numtyp rainv2 = ucl_recip(r2 - param_r0_ik); \ - numtyp gsrainv2 = param_gamma_ik * rainv2; \ + numtyp gsrainv2 = param_gamma_ik * rainv2; \ numtyp expgsrainv2 = ucl_exp(gsrainv2); \ \ numtyp rinv12 = ucl_recip(r1*r2); \ numtyp cs = (delr1x*delr2x + delr1y*delr2y + delr1z*delr2z) * rinv12; \ - numtyp delcs = cs - param_costheta_ijk; \ + numtyp delcs = cs - param_costheta_ijk; \ numtyp delcssq = delcs*delcs; \ - numtyp pcsinv = param_bigc_ijk*delcssq+1.0; \ + numtyp pcsinv = param_bigc_ijk*delcssq+1.0; \ numtyp pcsinvsq = pcsinv*pcsinv; \ numtyp pcs = delcssq/pcsinv; \ \ numtyp facexp = expgsrainv1*expgsrainv2; \ \ - numtyp facrad = param_bigb_ijk * facexp*pcs; \ + numtyp facrad = param_bigb_ijk * facexp*pcs; \ numtyp frad1 = facrad*gsrainvsq1; \ - numtyp facang = param_big2b_ijk * facexp*delcs/pcsinvsq; \ + numtyp facang = param_big2b_ijk * facexp*delcs/pcsinvsq; \ numtyp facang12 = rinv12*facang; \ numtyp csfacang = cs*facang; \ numtyp csfac1 = rinvsq1*csfacang; \ @@ -353,6 +411,7 @@ __kernel void k_vashishta_three_center(const __global numtyp4 *restrict x_, const int nelements, const __global int * dev_nbor, const __global int * dev_packed, + const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, const int eflag, const int vflag, @@ -377,7 +436,7 @@ __kernel void k_vashishta_three_center(const __global numtyp4 *restrict x_, if (ii param_r0sq_ij) continue; + if (rsq1 > param_r0sq_ij) continue; // still keep this for neigh no and tpa > 1 param_gamma_ij=param4_ijparam.y; param_r0_ij=param4_ijparam.w; - int nbor_k=nbor_j-offset_j+offset_k; - if (nbor_k<=nbor_j) - nbor_k+=n_stride; + int nbor_k,k_end; + if (dev_packed==dev_nbor) { + nbor_k=nborj_start-offset_j+offset_k; + int numk = dev_short_nbor[nbor_k-n_stride]; + k_end = nbor_k+fast_mul(numk,n_stride); + } else { + nbor_k = nbor_j-offset_j+offset_k; + if (nbor_k<=nbor_j) nbor_k += n_stride; + k_end = nbor_end; + } - for ( ; nbor_k param_r0sq_ij) continue; + if (rsq1 > param_r0sq_ij) continue; // still keep this for neigh no and tpa > 1 param_gamma_ij=param4_ijparam.y; param_r0_ij = param4_ijparam.w; @@ -551,8 +637,15 @@ __kernel void k_vashishta_three_end(const __global numtyp4 *restrict x_, nbor_k+=offset_k; } + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } + for ( ; nbor_k param_r0sq_ij) continue; + if (rsq1 > param_r0sq_ij) continue; // still keep this for neigh no and tpa > 1 param_gamma_ij=param4_ijparam.y; param_r0_ij=param4_ijparam.w; @@ -690,8 +792,15 @@ __kernel void k_vashishta_three_end_vatom(const __global numtyp4 *restrict x_, nbor_k+=offset_k; } + // recalculate numk and k_end for the use of short neighbor list + if (dev_packed==dev_nbor) { + numk = dev_short_nbor[nbor_k]; + nbor_k += n_stride; + k_end = nbor_k+fast_mul(numk,n_stride); + } + for ( ; nbor_k { UCL_D_Vec elem2param; UCL_D_Vec map; int _nparams,_nelements; + numtyp _cutshortsq; UCL_Texture param1_tex, param2_tex, param3_tex, param4_tex, param5_tex; diff --git a/lib/h5md/Install.py b/lib/h5md/Install.py index 37041d2ea1..ffe709d44c 120000 --- a/lib/h5md/Install.py +++ b/lib/h5md/Install.py @@ -1 +1 @@ -Install.py \ No newline at end of file +../Install.py \ No newline at end of file diff --git a/lib/h5md/Makefile.h5cc b/lib/h5md/Makefile.h5cc index bd3e8a9784..9feed2d74e 100644 --- a/lib/h5md/Makefile.h5cc +++ b/lib/h5md/Makefile.h5cc @@ -9,12 +9,14 @@ HDF5_PATH=/usr INC=-I include AR=ar ARFLAGS=rc -LIB=libch5md.a +# need to build two libraries to not break compatibility and to support Install.py +LIB=libh5md.a libch5md.a all: lib Makefile.lammps build: mkdir -p build + build/ch5md.o: src/ch5md.c | build $(CC) $(INC) $(CFLAGS) -c $< -o $@ @@ -23,8 +25,11 @@ Makefile.lammps: .PHONY: all lib clean -$(LIB): build/ch5md.o - $(AR) $(ARFLAGS) $(LIB) build/ch5md.o +libch5md.a : build/ch5md.o + $(AR) $(ARFLAGS) $@ build/ch5md.o + +libh5md.a : build/ch5md.o + $(AR) $(ARFLAGS) $@ build/ch5md.o lib: $(LIB) diff --git a/lib/h5md/Makefile.mpi b/lib/h5md/Makefile.mpi new file mode 120000 index 0000000000..df682a9547 --- /dev/null +++ b/lib/h5md/Makefile.mpi @@ -0,0 +1 @@ +Makefile.h5cc \ No newline at end of file diff --git a/lib/h5md/Makefile.serial b/lib/h5md/Makefile.serial new file mode 120000 index 0000000000..df682a9547 --- /dev/null +++ b/lib/h5md/Makefile.serial @@ -0,0 +1 @@ +Makefile.h5cc \ No newline at end of file diff --git a/lib/kim/.gitignore b/lib/kim/.gitignore index 3be8ecbdd6..c1f57fe64c 100644 --- a/lib/kim/.gitignore +++ b/lib/kim/.gitignore @@ -1,2 +1,3 @@ /Makefile.KIM_DIR /Makefile.KIM_Config +/installed-kim-api-* diff --git a/lib/kim/Install.py b/lib/kim/Install.py index bcd22dcbb3..0e87388954 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -1,150 +1,257 @@ #!/usr/bin/env python -# install.py tool to setup the kim-api library +# install.py tool to download, compile, and setup the kim-api library # used to automate the steps described in the README file in this dir -import sys,os,re,urllib,commands +from __future__ import print_function +import sys,os,re,subprocess + +# help message help = """ -Syntax: install.py -v version -c kim-dir -b kim-model-name -a kim-name - specify one or more options, order does not matter - -v = version of kim-api to download and work with - default = kim-api-v1.8.2 (current as of June 2017) - -c = create Makefile.KIM_DIR within lammps lib/kim to configure lammps - for use with the kim-api library installed at "kim-dir" (absolute - path). default = this dir - -b = build kim-api and kim model where kim-model-name can be a specific - openkim.org model name (such as - "EAM_Dynamo_Ackland_W__MO_141627196590_002") or the keyword - "OpenKIM" to install all compatible models from the openkim.org - site. - -a = add kim-name openkim.org item (model driver or model) to existing - kim-api instalation. +Syntax from src dir: make lib-kim args="-b -v version -a kim-name" + or: make lib-kim args="-b -a everything" + or: make lib-kim args="-n -a kim-name" + or: make lib-kim args="-p /usr/local/open-kim -a kim-name" +Syntax from lib dir: python Install.py -b -v version -a kim-name + or: python Install.py -b -a everything + or: python Install.py -n -a kim-name + or: python Install.py -p /usr/local/open-kim -a kim-name + +specify one or more options, order does not matter + + -v = version of KIM API library to use + default = kim-api-v1.9.2 (current as of Oct 2017) + -b = download and build base KIM API library with example Models + this will delete any previous installation in the current folder + -n = do NOT download and build base KIM API library. + Use an existing installation + -p = specify location of KIM API installation (implies -n) + -a = add single KIM model or model driver with kim-name + to existing KIM API lib (see example below). + If kim-name = everything, then rebuild KIM API library with + *all* available OpenKIM Models (make take a long time). + -vv = be more verbose about what is happening while the script runs + +Examples: + +make lib-kim args="-b" # install KIM API lib with only example models +make lib-kim args="-a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # Ditto plus one model +make lib-kim args="-b -a everything" # install KIM API lib with all models +make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # only add one model or model driver + +See the list of KIM model drivers here: +https://openkim.org/kim-items/model-drivers/alphabetical + +See the list of all KIM models here: +https://openkim.org/kim-items/models/by-model-drivers + +See the list of example KIM models included by default here: +https://openkim.org/kim-api +in the "What is in the KIM API source package?" section """ -def error(): - print help +def error(str=None): + if not str: print(help) + else: print("ERROR",str) sys.exit() +# expand to full path name +# process leading '~' or relative path + +def fullpath(path): + return os.path.abspath(os.path.expanduser(path)) + +def which(program): + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + +def geturl(url,fname): + success = False + + if which('curl') != None: + cmd = 'curl -L -o "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling curl failed with: %s" % e.output.decode('UTF-8')) + + if not success and which('wget') != None: + cmd = 'wget -O "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling wget failed with: %s" % e.output.decode('UTF-8')) + + if not success: + error("Failed to download source code with 'curl' or 'wget'") + return + # parse args -args = sys.argv +args = sys.argv[1:] +nargs = len(args) +if nargs == 0: error() thisdir = os.environ['PWD'] -dir = thisdir -version = "kim-api-v1.8.2" +version = "kim-api-v1.9.2" -dirflag = 0 -buildflag = 0 -addflag = 0 +buildflag = False +everythingflag = False +addflag = False +verboseflag = False +pathflag = False -iarg = 1 +iarg = 0 while iarg < len(args): if args[iarg] == "-v": if iarg+2 > len(args): error() version = args[iarg+1] iarg += 2 - elif args[iarg] == "-c": - dirflag = 1 - if iarg+2 > len(args): error() - dir = args[iarg+1] - iarg += 2 elif args[iarg] == "-b": - buildflag = 1 + buildflag = True + iarg += 1 + elif args[iarg] == "-n": + buildflag = False + iarg += 1 + elif args[iarg] == "-p": if iarg+2 > len(args): error() - modelname = args[iarg+1] + kimdir = fullpath(args[iarg+1]) + pathflag = True + buildflag = False iarg += 2 elif args[iarg] == "-a": - addflag = 1 + addflag = True if iarg+2 > len(args): error() addmodelname = args[iarg+1] + if addmodelname == "everything": + buildflag = True + everythingflag = True + addflag = False iarg += 2 + elif args[iarg] == "-vv": + verboseflag = True + iarg += 1 else: error() thisdir = os.path.abspath(thisdir) -dir = os.path.abspath(dir) -url = "https://s3.openkim.org/kim-api/%s.tgz" % version +url = "https://s3.openkim.org/kim-api/%s.txz" % version -# download and unpack tarball +# set KIM API directory +if pathflag: + if not os.path.isdir(kimdir): + print("\nkim-api is not installed at %s" % kimdir) + error() -if not os.path.isfile("%s/Makefile.KIM_DIR" % thisdir): - open("%s/Makefile.KIM_DIR" % thisdir, 'w').write("KIM_INSTALL_DIR=%s" % dir) - open("%s/Makefile.KIM_Config" % thisdir, 'w').write("include %s/lib/kim-api/Makefile.KIM_Config" % dir) - print "Created %s/Makefile.KIM_DIR : using %s" % (thisdir,dir) + # configure LAMMPS to use existing kim-api installation + with open("%s/Makefile.KIM_DIR" % thisdir, 'w') as mkfile: + mkfile.write("KIM_INSTALL_DIR=%s\n\n" % kimdir) + mkfile.write(".DUMMY: print_dir\n\n") + mkfile.write("print_dir:\n") + mkfile.write(" @printf $(KIM_INSTALL_DIR)\n") + + with open("%s/Makefile.KIM_Config" % thisdir, 'w') as cfgfile: + cfgfile.write("include %s/lib/kim-api/Makefile.KIM_Config" % kimdir) + + print("Created %s/Makefile.KIM_DIR\n using %s" % (thisdir,kimdir)) else: - if dirflag == 1: - open("%s/Makefile.KIM_DIR" % thisdir, 'w').write("KIM_INSTALL_DIR=%s" % dir) - open("%s/Makefile.KIM_Config" % thisdir, 'w').write("include %s/lib/kim-api/Makefile.KIM_Config" % dir) - print "Updated %s/Makefile.KIM_DIR : using %s" % (thisdir,dir) + kimdir = os.path.join(os.path.abspath(thisdir), "installed-" + version) +# download KIM tarball, unpack, build KIM +if buildflag: -if buildflag == 1: - # download kim-api - print "Downloading kim-api tarball ..." - urllib.urlretrieve(url,"%s/%s.tgz" % (thisdir,version)) - print "Unpacking kim-api tarball ..." - cmd = "cd %s; rm -rf %s; tar zxvf %s.tgz" % (thisdir,version,version) - txt = commands.getstatusoutput(cmd) - if txt[0] != 0: error() + # check to see if an installed kim-api already exists and wipe it out. + + if os.path.isdir(kimdir): + print("kim-api is already installed at %s.\nRemoving it for re-install" % kimdir) + cmd = 'rm -rf "%s"' % kimdir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + + # configure LAMMPS to use kim-api to be installed + + with open("%s/Makefile.KIM_DIR" % thisdir, 'w') as mkfile: + mkfile.write("KIM_INSTALL_DIR=%s\n\n" % kimdir) + mkfile.write(".DUMMY: print_dir\n\n") + mkfile.write("print_dir:\n") + mkfile.write(" @printf $(KIM_INSTALL_DIR)\n") + + with open("%s/Makefile.KIM_Config" % thisdir, 'w') as cfgfile: + cfgfile.write("include %s/lib/kim-api/Makefile.KIM_Config" % kimdir) + + print("Created %s/Makefile.KIM_DIR\n using %s" % (thisdir,kimdir)) + + # download entire kim-api tarball + + print("Downloading kim-api tarball ...") + geturl(url,"%s/%s.txz" % (thisdir,version)) + print("Unpacking kim-api tarball ...") + cmd = 'cd "%s"; rm -rf "%s"; tar -xJvf %s.txz' % (thisdir,version,version) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) # configure kim-api - print "Configuring kim-api ..." - cmd = "cd %s/%s; ./configure --prefix='%s'" % (thisdir,version,dir) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() + + print("Configuring kim-api ...") + cmd = 'cd "%s/%s"; ./configure --prefix="%s"' % (thisdir,version,kimdir) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) # build kim-api - print "Configuring model : %s" % modelname - cmd = "cd %s/%s; make add-%s" % (thisdir,version,modelname) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() - # - print "Building kim-api ..." - cmd = "cd %s/%s; make" % (thisdir,version) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() + print("Building kim-api ...") + cmd = 'cd "%s/%s"; make' % (thisdir,version) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print(txt.decode("UTF-8")) # install kim-api - print "Installing kim-api ..." - cmd = "cd %s/%s; make install" % (thisdir,version) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() - # - cmd = "cd %s/%s; make install-set-default-to-v1" %(thisdir,version) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() + + print("Installing kim-api ...") + cmd = 'cd "%s/%s"; make install' % (thisdir,version) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print(txt.decode("UTF-8")) # remove source files - print "Removing kim-api source and build files ..." - cmd = "cd %s; rm -rf %s; rm -rf %s.tgz" % (thisdir,version,version) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() -if addflag == 1: - # download model - url = "https://openkim.org/download/%s.tgz" % addmodelname - print "Downloading item tarball ..." - urllib.urlretrieve(url,"%s/%s.tgz" % (thisdir,addmodelname)) - print "Unpacking item tarball ..." - cmd = "cd %s; tar zxvf %s.tgz" % (thisdir,addmodelname) - txt = commands.getstatusoutput(cmd) - if txt[0] != 0: error() - # - print "Building item ..." - cmd = "cd %s/%s; make; make install" %(thisdir,addmodelname) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() - # - print "Removing kim item source and build files ..." - cmd = "cd %s; rm -rf %s; rm -rf %s.tgz" %(thisdir,addmodelname,addmodelname) - txt = commands.getstatusoutput(cmd) - print txt[1] - if txt[0] != 0: error() + print("Building and installing example Models") + cmd = 'cd "%s/%s/examples"; make model-drivers-all-system' % (thisdir,version) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print (txt.decode("UTF-8")) + cmd = 'cd "%s/%s/examples"; make models-all-system' % (thisdir,version) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print (txt.decode("UTF-8")) + + print("Removing kim-api source and build files ...") + cmd = 'cd "%s"; rm -rf %s; rm -rf %s.txz' % (thisdir,version,version) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + + # add all OpenKIM models, if desired + if everythingflag: + print("Adding all OpenKIM models, this will take a while ...") + cmd = '%s/bin/kim-api-v1-collections-management install system OpenKIM' % (kimdir) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print(txt.decode("UTF-8")) + +# add single OpenKIM model +if addflag: + + if not os.path.isdir(kimdir): + print("\nkim-api is not installed") + error() + + # download single model + cmd = '%s/bin/kim-api-v1-collections-management install system %s' % (kimdir, addmodelname) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print (txt.decode("UTF-8")) diff --git a/lib/kim/Makefile.lammps b/lib/kim/Makefile.lammps index b66d7005a4..d73891d1e2 100644 --- a/lib/kim/Makefile.lammps +++ b/lib/kim/Makefile.lammps @@ -18,10 +18,10 @@ include ../../lib/kim/Makefile.KIM_DIR -ifeq ($(wildcard $(KIM_INSTALL_DIR)/bin/kim-api-build-config),) - KIM_CONFIG_HELPER = kim-api-build-config +ifeq ($(wildcard $(KIM_INSTALL_DIR)/bin/kim-api-v1-build-config),) + KIM_CONFIG_HELPER = kim-api-v1-build-config else - KIM_CONFIG_HELPER = $(KIM_INSTALL_DIR)/bin/kim-api-build-config + KIM_CONFIG_HELPER = $(KIM_INSTALL_DIR)/bin/kim-api-v1-build-config endif ifeq ($(shell $(KIM_CONFIG_HELPER) --version 2> /dev/null),) $(error $(KIM_CONFIG_HELPER) utility is not available. Something is wrong with your KIM API package setup) diff --git a/lib/kim/README b/lib/kim/README index 00d6ea8fad..7a4230dc25 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -8,14 +8,16 @@ James Sethna (Cornell U). Ryan Elliott is the main developer for the KIM API and he also maintains the code that implements the pair_style kim command. -To download, build, and install the KIM API on your system, follow -these steps. You can use the install.py script to automate these steps. +You can type "make lib-kim" from the src directory to see help on +how to download and build this library via make commands, or you can +do the same thing by typing "python Install.py" from within this +directory, or you can do it manually by following the instructions +below. ----------------- Instructions: - 1. Configure lammps for use with the kim-api library installed in this directory $ printf "KIM_INSTALL_DIR=${PWD}\n" > ./Makefile.KIM_DIR @@ -65,7 +67,7 @@ $ rm -rf EAM_Johnson_NearestNeighbor_Cu__MO_887933271505_001.tgz When these steps are complete you can build LAMMPS with the KIM package installed: -$ cd ../../src +$ cd lammpos/src $ make yes-kim $ make g++ (or whatever target you wish) diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index acb54ff22f..e3de6b048d 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,5 +1,152 @@ # Change Log +## [2.5.00](https://github.com/kokkos/kokkos/tree/2.5.00) (2017-12-15) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.04.11...2.5.00) + +**Part of the Kokkos C++ Performance Portability Programming EcoSystem 2.5** + +**Implemented enhancements:** + +- Provide Makefile.kokkos logic for CMake and TriBITS [\#878](https://github.com/kokkos/kokkos/issues/878) +- Add Scatter View [\#825](https://github.com/kokkos/kokkos/issues/825) +- Drop gcc 4.7 and intel 14 from supported compiler list [\#603](https://github.com/kokkos/kokkos/issues/603) +- Enable construction of unmanaged view using common\_view\_alloc\_prop [\#1170](https://github.com/kokkos/kokkos/issues/1170) +- Unused Function Warning with XL [\#1267](https://github.com/kokkos/kokkos/issues/1267) +- Add memory pool parameter check [\#1218](https://github.com/kokkos/kokkos/issues/1218) +- CUDA9: Fix warning for unsupported long double [\#1189](https://github.com/kokkos/kokkos/issues/1189) +- CUDA9: fix warning on defaulted function marking [\#1188](https://github.com/kokkos/kokkos/issues/1188) +- CUDA9: fix warnings for deprecated warp level functions [\#1187](https://github.com/kokkos/kokkos/issues/1187) +- Add CUDA 9.0 nightly testing [\#1174](https://github.com/kokkos/kokkos/issues/1174) +- {OMPI,MPICH}\_CXX hack breaks nvcc\_wrapper use case [\#1166](https://github.com/kokkos/kokkos/issues/1166) +- KOKKOS\_HAVE\_CUDA\_LAMBDA became KOKKOS\_CUDA\_USE\_LAMBDA [\#1274](https://github.com/kokkos/kokkos/issues/1274) + +**Fixed bugs:** + +- MinMax Reducer with tagged operator doesn't compile [\#1251](https://github.com/kokkos/kokkos/issues/1251) +- Reducers for Tagged operators give wrong answer [\#1250](https://github.com/kokkos/kokkos/issues/1250) +- Kokkos not Compatible with Big Endian Machines? [\#1235](https://github.com/kokkos/kokkos/issues/1235) +- Parallel Scan hangs forever on BG/Q [\#1234](https://github.com/kokkos/kokkos/issues/1234) +- Threads backend doesn't compile with Clang on OS X [\#1232](https://github.com/kokkos/kokkos/issues/1232) +- $\(shell date\) needs quote [\#1264](https://github.com/kokkos/kokkos/issues/1264) +- Unqualified parallel\_for call conflicts with user-defined parallel\_for [\#1219](https://github.com/kokkos/kokkos/issues/1219) +- KokkosAlgorithms: CMake issue in unit tests [\#1212](https://github.com/kokkos/kokkos/issues/1212) +- Intel 18 Error: "simd pragma has been deprecated" [\#1210](https://github.com/kokkos/kokkos/issues/1210) +- Memory leak in Kokkos::initialize [\#1194](https://github.com/kokkos/kokkos/issues/1194) +- CUDA9: compiler error with static assert template arguments [\#1190](https://github.com/kokkos/kokkos/issues/1190) +- Kokkos::Serial::is\_initialized returns always true [\#1184](https://github.com/kokkos/kokkos/issues/1184) +- Triple nested parallelism still fails on bowman [\#1093](https://github.com/kokkos/kokkos/issues/1093) +- OpenMP openmp.range on Develop Runs Forever on POWER7+ with RHEL7 and GCC4.8.5 [\#995](https://github.com/kokkos/kokkos/issues/995) +- Rendezvous performance at global scope [\#985](https://github.com/kokkos/kokkos/issues/985) + + +## [2.04.11](https://github.com/kokkos/kokkos/tree/2.04.11) (2017-10-28) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.04.04...2.04.11) + +**Implemented enhancements:** + +- Add Subview pattern. [\#648](https://github.com/kokkos/kokkos/issues/648) +- Add Kokkos "global" is\_initialized [\#1060](https://github.com/kokkos/kokkos/issues/1060) +- Add create\_mirror\_view\_and\_copy [\#1161](https://github.com/kokkos/kokkos/issues/1161) +- Add KokkosConcepts SpaceAccessibility function [\#1092](https://github.com/kokkos/kokkos/issues/1092) +- Option to Disable Initialize Warnings [\#1142](https://github.com/kokkos/kokkos/issues/1142) +- Mature task-DAG capability [\#320](https://github.com/kokkos/kokkos/issues/320) +- Promote Work DAG from experimental [\#1126](https://github.com/kokkos/kokkos/issues/1126) +- Implement new WorkGraph push/pop [\#1108](https://github.com/kokkos/kokkos/issues/1108) +- Kokkos\_ENABLE\_Cuda\_Lambda should default ON [\#1101](https://github.com/kokkos/kokkos/issues/1101) +- Add multidimensional parallel for example and improve unit test [\#1064](https://github.com/kokkos/kokkos/issues/1064) +- Fix ROCm: Performance tests not building [\#1038](https://github.com/kokkos/kokkos/issues/1038) +- Make KOKKOS\_ALIGN\_SIZE a configure-time option [\#1004](https://github.com/kokkos/kokkos/issues/1004) +- Make alignment consistent [\#809](https://github.com/kokkos/kokkos/issues/809) +- Improve subview construction on Cuda backend [\#615](https://github.com/kokkos/kokkos/issues/615) + +**Fixed bugs:** + +- Kokkos::vector fixes for application [\#1134](https://github.com/kokkos/kokkos/issues/1134) +- DynamicView non-power of two value\_type [\#1177](https://github.com/kokkos/kokkos/issues/1177) +- Memory pool bug [\#1154](https://github.com/kokkos/kokkos/issues/1154) +- Cuda launch bounds performance regression bug [\#1140](https://github.com/kokkos/kokkos/issues/1140) +- Significant performance regression in LAMMPS after updating Kokkos [\#1139](https://github.com/kokkos/kokkos/issues/1139) +- CUDA compile error [\#1128](https://github.com/kokkos/kokkos/issues/1128) +- MDRangePolicy neg idx test failure in debug mode [\#1113](https://github.com/kokkos/kokkos/issues/1113) +- subview construction on Cuda backend [\#615](https://github.com/kokkos/kokkos/issues/615) + +## [2.04.04](https://github.com/kokkos/kokkos/tree/2.04.04) (2017-09-11) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.04.00...2.04.04) + +**Implemented enhancements:** + +- OpenMP partition: set number of threads on nested level [\#1082](https://github.com/kokkos/kokkos/issues/1082) +- Add StaticCrsGraph row\(\) method [\#1071](https://github.com/kokkos/kokkos/issues/1071) +- Enhance Kokkos complex operator overloading [\#1052](https://github.com/kokkos/kokkos/issues/1052) +- Tell Trilinos packages about host+device lambda [\#1019](https://github.com/kokkos/kokkos/issues/1019) +- Function markup for defaulted class members [\#952](https://github.com/kokkos/kokkos/issues/952) +- Add deterministic random number generator [\#857](https://github.com/kokkos/kokkos/issues/857) + +**Fixed bugs:** + +- Fix reduction\_identity\::max for floating point numbers [\#1048](https://github.com/kokkos/kokkos/issues/1048) +- Fix MD iteration policy ignores lower bound on GPUs [\#1041](https://github.com/kokkos/kokkos/issues/1041) +- (Experimental) HBWSpace Linking issues in KokkosKernels [\#1094](https://github.com/kokkos/kokkos/issues/1094) +- (Experimental) ROCm: algorithms/unit\_tests test\_sort failing with segfault [\#1070](https://github.com/kokkos/kokkos/issues/1070) + +## [2.04.00](https://github.com/kokkos/kokkos/tree/2.04.00) (2017-08-16) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.03.13...2.04.00) + +**Implemented enhancements:** + +- Added ROCm backend to support AMD GPUs +- Kokkos::complex\ behaves slightly differently from std::complex\ [\#1011](https://github.com/kokkos/kokkos/issues/1011) +- Kokkos::Experimental::Crs constructor arguments were in the wrong order [\#992](https://github.com/kokkos/kokkos/issues/992) +- Work graph construction ease-of-use (one lambda for count and fill) [\#991](https://github.com/kokkos/kokkos/issues/991) +- when\_all returns pointer of futures (improved interface) [\#990](https://github.com/kokkos/kokkos/issues/990) +- Allow assignment of LayoutLeft to LayoutRight or vice versa for rank-0 Views [\#594](https://github.com/kokkos/kokkos/issues/594) +- Changed the meaning of Kokkos\_ENABLE\_CXX11\_DISPATCH\_LAMBDA [\#1035](https://github.com/kokkos/kokkos/issues/1035) + +**Fixed bugs:** + +- memory pool default constructor does not properly set member variables. [\#1007](https://github.com/kokkos/kokkos/issues/1007) + +## [2.03.13](https://github.com/kokkos/kokkos/tree/2.03.13) (2017-07-27) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.03.05...2.03.13) + +**Implemented enhancements:** + +- Disallow enabling both OpenMP and Threads in the same executable [\#406](https://github.com/kokkos/kokkos/issues/406) +- Make Kokkos::OpenMP respect OMP environment even if hwloc is available [\#630](https://github.com/kokkos/kokkos/issues/630) +- Improve Atomics Performance on KNL/Broadwell where PREFETCHW/RFO is Available [\#898](https://github.com/kokkos/kokkos/issues/898) +- Kokkos::resize should test whether dimensions have changed before resizing [\#904](https://github.com/kokkos/kokkos/issues/904) +- Develop performance-regression/acceptance tests [\#737](https://github.com/kokkos/kokkos/issues/737) +- Make the deep\_copy Profiling hook a start/end system [\#890](https://github.com/kokkos/kokkos/issues/890) +- Add deep\_copy Profiling hook [\#843](https://github.com/kokkos/kokkos/issues/843) +- Append tag name to parallel construct name for Profiling [\#842](https://github.com/kokkos/kokkos/issues/842) +- Add view label to `View bounds error` message for CUDA backend [\#870](https://github.com/kokkos/kokkos/issues/870) +- Disable printing the loaded profiling library [\#824](https://github.com/kokkos/kokkos/issues/824) +- "Declared but never referenced" warnings [\#853](https://github.com/kokkos/kokkos/issues/853) +- Warnings about lock\_address\_cuda\_space [\#852](https://github.com/kokkos/kokkos/issues/852) +- WorkGraph execution policy [\#771](https://github.com/kokkos/kokkos/issues/771) +- Simplify makefiles by guarding compilation with appropriate KOKKOS\_ENABLE\_\#\#\# macros [\#716](https://github.com/kokkos/kokkos/issues/716) +- Cmake build: wrong include install directory [\#668](https://github.com/kokkos/kokkos/issues/668) +- Derived View type and allocation [\#566](https://github.com/kokkos/kokkos/issues/566) +- Fix Compiler warnings when compiling core unit tests for Cuda [\#214](https://github.com/kokkos/kokkos/issues/214) + +**Fixed bugs:** + +- Out-of-bounds read in Kokkos\_Layout.hpp [\#975](https://github.com/kokkos/kokkos/issues/975) +- CudaClang: Fix failing test with Clang 4.0 [\#941](https://github.com/kokkos/kokkos/issues/941) +- Respawn when memory pool allocation fails \(not available memory\) [\#940](https://github.com/kokkos/kokkos/issues/940) +- Memory pool aborts on zero allocation request, returns NULL for \< minimum [\#939](https://github.com/kokkos/kokkos/issues/939) +- Error with TaskScheduler query of underlying memory pool [\#917](https://github.com/kokkos/kokkos/issues/917) +- Profiling::\*Callee static variables declared in header [\#863](https://github.com/kokkos/kokkos/issues/863) +- calling \*Space::name\(\) causes compile error [\#862](https://github.com/kokkos/kokkos/issues/862) +- bug in Profiling::deallocateData [\#860](https://github.com/kokkos/kokkos/issues/860) +- task\_depend test failing, CUDA 8.0 + Pascal + RDC [\#829](https://github.com/kokkos/kokkos/issues/829) +- \[develop branch\] Standalone cmake issues [\#826](https://github.com/kokkos/kokkos/issues/826) +- Kokkos CUDA failes to compile with OMPI\_CXX and MPICH\_CXX wrappers [\#776](https://github.com/kokkos/kokkos/issues/776) +- Task Team reduction on Pascal [\#767](https://github.com/kokkos/kokkos/issues/767) +- CUDA stack overflow with TaskDAG test [\#758](https://github.com/kokkos/kokkos/issues/758) +- TeamVector test on Cuda [\#670](https://github.com/kokkos/kokkos/issues/670) +- Clang 4.0 Cuda Build broken again [\#560](https://github.com/kokkos/kokkos/issues/560) + ## [2.03.05](https://github.com/kokkos/kokkos/tree/2.03.05) (2017-05-27) [Full Changelog](https://github.com/kokkos/kokkos/compare/2.03.00...2.03.05) diff --git a/lib/kokkos/CMakeLists.txt b/lib/kokkos/CMakeLists.txt index b2771ed527..9c708ded4a 100644 --- a/lib/kokkos/CMakeLists.txt +++ b/lib/kokkos/CMakeLists.txt @@ -1,3 +1,5 @@ +# Is this a build as part of Trilinos? + IF(COMMAND TRIBITS_PACKAGE_DECL) SET(KOKKOS_HAS_TRILINOS ON CACHE BOOL "") ELSE() @@ -6,13 +8,57 @@ ENDIF() IF(NOT KOKKOS_HAS_TRILINOS) cmake_minimum_required(VERSION 3.1 FATAL_ERROR) - project(Kokkos CXX) - INCLUDE(cmake/kokkos.cmake) + # Define Project Name if this is a standalone build + IF(NOT DEFINED ${PROJECT_NAME}) + project(Kokkos CXX) + ENDIF() + + # Basic initialization (Used in KOKKOS_SETTINGS) + set(KOKKOS_SRC_PATH ${Kokkos_SOURCE_DIR}) + set(KOKKOS_PATH ${KOKKOS_SRC_PATH}) + + #------------ COMPILER AND FEATURE CHECKS ------------------------------------ + include(${KOKKOS_SRC_PATH}/cmake/kokkos_functions.cmake) + set_kokkos_cxx_compiler() + set_kokkos_cxx_standard() + + #------------ GET OPTIONS AND KOKKOS_SETTINGS -------------------------------- + # Add Kokkos' modules to CMake's module path. + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${Kokkos_SOURCE_DIR}/cmake/Modules/") + + set(KOKKOS_CMAKE_VERBOSE True) + include(${KOKKOS_SRC_PATH}/cmake/kokkos_options.cmake) + + include(${KOKKOS_SRC_PATH}/cmake/kokkos_settings.cmake) + + #------------ GENERATE HEADER AND SOURCE FILES ------------------------------- + execute_process( + COMMAND ${KOKKOS_SETTINGS} make -f ${KOKKOS_SRC_PATH}/cmake/Makefile.generate_cmake_settings CXX=${CMAKE_CXX_COMPILER} generate_build_settings + WORKING_DIRECTORY "${Kokkos_BINARY_DIR}" + OUTPUT_FILE ${Kokkos_BINARY_DIR}/core_src_make.out + RESULT_VARIABLE res + ) + include(${Kokkos_BINARY_DIR}/kokkos_generated_settings.cmake) + set_kokkos_srcs(KOKKOS_SRC ${KOKKOS_SRC}) + + #------------ NOW BUILD ------------------------------------------------------ + include(${KOKKOS_SRC_PATH}/cmake/kokkos_build.cmake) + + #------------ Add in Fake Tribits Handling to allow unit test builds- -------- + + include(${KOKKOS_SRC_PATH}/cmake/tribits.cmake) + + TRIBITS_PACKAGE_DECL(Kokkos) + + ADD_SUBDIRECTORY(core) + ADD_SUBDIRECTORY(containers) + ADD_SUBDIRECTORY(algorithms) + ELSE() #------------------------------------------------------------------------------ # -# A) Forward delcare the package so that certain options are also defined for +# A) Forward declare the package so that certain options are also defined for # subpackages # @@ -21,178 +67,28 @@ TRIBITS_PACKAGE_DECL(Kokkos) # ENABLE_SHADOWING_WARNINGS) #------------------------------------------------------------------------------ # -# B) Define the common options for Kokkos first so they can be used by -# subpackages as well. +# B) Install Kokkos' build files # +# If using the Makefile-generated files, then need to set things up. +# Here, assume that TriBITS has been run from ProjectCompilerPostConfig.cmake +# and already generated KokkosCore_config.h and kokkos_generated_settings.cmake +# in the previously define Kokkos_GEN_DIR +# We need to copy them over to the correct place and source the cmake file -# mfh 01 Aug 2016: See Issue #61: -# -# https://github.com/kokkos/kokkos/issues/61 -# -# Don't use TRIBITS_ADD_DEBUG_OPTION() here, because that defines -# HAVE_KOKKOS_DEBUG. We define KOKKOS_HAVE_DEBUG here instead, -# for compatibility with Kokkos' Makefile build system. +if(NOT KOKKOS_LEGACY_TRIBITS) + set(Kokkos_GEN_DIR ${CMAKE_BINARY_DIR}) + file(COPY "${Kokkos_GEN_DIR}/KokkosCore_config.h" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" USE_SOURCE_PERMISSIONS) + install(FILES "${Kokkos_GEN_DIR}/KokkosCore_config.h" + DESTINATION include) + file(COPY "${Kokkos_GEN_DIR}/kokkos_generated_settings.cmake" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" USE_SOURCE_PERMISSIONS) -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_DEBUG - KOKKOS_HAVE_DEBUG - "Enable run-time debug checks. These checks may be expensive, so they are disabled by default in a release build." - ${${PROJECT_NAME}_ENABLE_DEBUG} -) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_SIERRA_BUILD - KOKKOS_FOR_SIERRA - "Configure Kokkos for building within the Sierra build system." - OFF - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Cuda - KOKKOS_HAVE_CUDA - "Enable CUDA support in Kokkos." - "${TPL_ENABLE_CUDA}" - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Cuda_UVM - KOKKOS_USE_CUDA_UVM - "Enable CUDA Unified Virtual Memory as the default in Kokkos." - OFF - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Cuda_RDC - KOKKOS_HAVE_CUDA_RDC - "Enable CUDA Relocatable Device Code support in Kokkos." - OFF - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Cuda_Lambda - KOKKOS_HAVE_CUDA_LAMBDA - "Enable CUDA LAMBDA support in Kokkos." - OFF - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Pthread - KOKKOS_HAVE_PTHREAD - "Enable Pthread support in Kokkos." - OFF - ) - -ASSERT_DEFINED(TPL_ENABLE_Pthread) -IF(Kokkos_ENABLE_Pthread AND NOT TPL_ENABLE_Pthread) - MESSAGE(FATAL_ERROR "You set Kokkos_ENABLE_Pthread=ON, but Trilinos' support for Pthread(s) is not enabled (TPL_ENABLE_Pthread=OFF). This is not allowed. Please enable Pthreads in Trilinos before attempting to enable Kokkos' support for Pthreads.") -ENDIF() -IF(NOT TPL_ENABLE_Pthread) - ADD_DEFINITIONS(-DGTEST_HAS_PTHREAD=0) -ENDIF() - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_OpenMP - KOKKOS_HAVE_OPENMP - "Enable OpenMP support in Kokkos." - "${${PROJECT_NAME}_ENABLE_OpenMP}" - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_QTHREAD - KOKKOS_HAVE_QTHREADS - "Enable Qthreads support in Kokkos." - "${TPL_ENABLE_QTHREAD}" - ) - -# TODO: No longer an option in Kokkos. Needs to be removed. -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_CXX11 - KOKKOS_HAVE_CXX11 - "Enable C++11 support in Kokkos." - "${${PROJECT_NAME}_ENABLE_CXX11}" - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_HWLOC - KOKKOS_HAVE_HWLOC - "Enable HWLOC support in Kokkos." - "${TPL_ENABLE_HWLOC}" - ) - -# TODO: This is currently not used in Kokkos. Should it be removed? -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_MPI - KOKKOS_HAVE_MPI - "Enable MPI support in Kokkos." - "${TPL_ENABLE_MPI}" - ) - -# Set default value of Kokkos_ENABLE_Debug_Bounds_Check option -# -# CMake is case sensitive. The Kokkos_ENABLE_Debug_Bounds_Check -# option (defined below) is annoyingly not all caps, but we need to -# keep it that way for backwards compatibility. If users forget and -# try using an all-caps variable, then make it count by using the -# all-caps version as the default value of the original, not-all-caps -# option. Otherwise, the default value of this option comes from -# Kokkos_ENABLE_DEBUG (see Issue #367). - -ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_DEBUG) -IF(DEFINED Kokkos_ENABLE_DEBUG_BOUNDS_CHECK) - IF(Kokkos_ENABLE_DEBUG_BOUNDS_CHECK) - SET(Kokkos_ENABLE_Debug_Bounds_Check_DEFAULT ON) - ELSE() - SET(Kokkos_ENABLE_Debug_Bounds_Check_DEFAULT "${${PACKAGE_NAME}_ENABLE_DEBUG}") - ENDIF() -ELSE() - SET(Kokkos_ENABLE_Debug_Bounds_Check_DEFAULT "${${PACKAGE_NAME}_ENABLE_DEBUG}") -ENDIF() -ASSERT_DEFINED(Kokkos_ENABLE_Debug_Bounds_Check_DEFAULT) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Debug_Bounds_Check - KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK - "Enable Kokkos::View run-time bounds checking." - "${Kokkos_ENABLE_Debug_Bounds_Check_DEFAULT}" - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Debug_DualView_Modify_Check - KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK - "Enable abort when Kokkos::DualView modified on host and device without sync." - "${Kokkos_ENABLE_DEBUG}" - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Profiling - KOKKOS_ENABLE_PROFILING - "Enable KokkosP profiling support for kernel data collections." - "${TPL_ENABLE_DLlib}" - ) - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Profiling_Load_Print - KOKKOS_ENABLE_PROFILING_LOAD_PRINT - "Print to standard output which profiling library was loaded." - OFF - ) - -# placeholder for future device... -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Winthread - KOKKOS_HAVE_WINTHREAD - "Enable Winthread support in Kokkos." - "${TPL_ENABLE_Winthread}" - ) - -# TODO: No longer an option in Kokkos. Needs to be removed. -# use new/old View -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_USING_DEPRECATED_VIEW - KOKKOS_USING_DEPRECATED_VIEW - "Choose whether to use the old, deprecated Kokkos::View" - OFF - ) + include(${CMAKE_CURRENT_BINARY_DIR}/kokkos_generated_settings.cmake) + # Sources come from makefile-generated kokkos_generated_settings.cmake file + # Enable using the individual sources if needed + set_kokkos_srcs(KOKKOS_SRC ${KOKKOS_SRC}) +endif () #------------------------------------------------------------------------------ @@ -226,10 +122,6 @@ TRIBITS_PACKAGE_DEF() TRIBITS_EXCLUDE_AUTOTOOLS_FILES() -TRIBITS_EXCLUDE_FILES( - classic/doc - classic/LinAlg/doc/CrsRefactorNotesMay2012 - ) - TRIBITS_PACKAGE_POSTPROCESS() + ENDIF() diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index 24cd772e00..4315b009d5 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -4,10 +4,16 @@ KOKKOS_PATH=../../lib/kokkos CXXFLAGS=$(CCFLAGS) -# Options: Cuda,OpenMP,Pthreads,Qthreads,Serial +# Options: Cuda,ROCm,OpenMP,Pthreads,Qthreads,Serial KOKKOS_DEVICES ?= "OpenMP" #KOKKOS_DEVICES ?= "Pthreads" -# Options: KNC,SNB,HSW,Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61,ARMv80,ARMv81,ARMv8-ThunderX,BGQ,Power7,Power8,Power9,KNL,BDW,SKX +# Options: +# Intel: KNC,KNL,SNB,HSW,BDW,SKX +# NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61 +# ARM: ARMv80,ARMv81,ARMv8-ThunderX +# IBM: BGQ,Power7,Power8,Power9 +# AMD-GPUS: Kaveri,Carrizo,Fiji,Vega +# AMD-CPUS: AMDAVX,Ryzen,Epyc KOKKOS_ARCH ?= "" # Options: yes,no KOKKOS_DEBUG ?= "no" @@ -22,32 +28,39 @@ KOKKOS_OPTIONS ?= "" # Options: force_uvm,use_ldg,rdc,enable_lambda KOKKOS_CUDA_OPTIONS ?= "enable_lambda" +# Return a 1 if a string contains a substring and 0 if not +# Note the search string should be without '"' +# Example: $(call kokkos_has_string,"hwloc,librt",hwloc) +# Will return a 1 +kokkos_has_string=$(if $(findstring $2,$1),1,0) + # Check for general settings. -KOKKOS_INTERNAL_ENABLE_DEBUG := $(strip $(shell echo $(KOKKOS_DEBUG) | grep "yes" | wc -l)) -KOKKOS_INTERNAL_ENABLE_CXX11 := $(strip $(shell echo $(KOKKOS_CXX_STANDARD) | grep "c++11" | wc -l)) -KOKKOS_INTERNAL_ENABLE_CXX1Z := $(strip $(shell echo $(KOKKOS_CXX_STANDARD) | grep "c++1z" | wc -l)) +KOKKOS_INTERNAL_ENABLE_DEBUG := $(call kokkos_has_string,$(KOKKOS_DEBUG),yes) +KOKKOS_INTERNAL_ENABLE_CXX11 := $(call kokkos_has_string,$(KOKKOS_CXX_STANDARD),c++11) +KOKKOS_INTERNAL_ENABLE_CXX1Z := $(call kokkos_has_string,$(KOKKOS_CXX_STANDARD),c++1z) # Check for external libraries. -KOKKOS_INTERNAL_USE_HWLOC := $(strip $(shell echo $(KOKKOS_USE_TPLS) | grep "hwloc" | wc -l)) -KOKKOS_INTERNAL_USE_LIBRT := $(strip $(shell echo $(KOKKOS_USE_TPLS) | grep "librt" | wc -l)) -KOKKOS_INTERNAL_USE_MEMKIND := $(strip $(shell echo $(KOKKOS_USE_TPLS) | grep "experimental_memkind" | wc -l)) +KOKKOS_INTERNAL_USE_HWLOC := $(call kokkos_has_string,$(KOKKOS_USE_TPLS),hwloc) +KOKKOS_INTERNAL_USE_LIBRT := $(call kokkos_has_string,$(KOKKOS_USE_TPLS),librt) +KOKKOS_INTERNAL_USE_MEMKIND := $(call kokkos_has_string,$(KOKKOS_USE_TPLS),experimental_memkind) # Check for advanced settings. -KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "aggressive_vectorization" | wc -l)) -KOKKOS_INTERNAL_DISABLE_PROFILING := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "disable_profiling" | wc -l)) -KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "disable_dualview_modify_check" | wc -l)) -KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "enable_profile_load_print" | wc -l)) -KOKKOS_INTERNAL_CUDA_USE_LDG := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "use_ldg" | wc -l)) -KOKKOS_INTERNAL_CUDA_USE_UVM := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "force_uvm" | wc -l)) -KOKKOS_INTERNAL_CUDA_USE_RELOC := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "rdc" | wc -l)) -KOKKOS_INTERNAL_CUDA_USE_LAMBDA := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "enable_lambda" | wc -l)) +KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS := $(call kokkos_has_string,$(KOKKOS_OPTIONS),compiler_warnings) +KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION := $(call kokkos_has_string,$(KOKKOS_OPTIONS),aggressive_vectorization) +KOKKOS_INTERNAL_DISABLE_PROFILING := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_profiling) +KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_dualview_modify_check) +KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT := $(call kokkos_has_string,$(KOKKOS_OPTIONS),enable_profile_load_print) +KOKKOS_INTERNAL_CUDA_USE_LDG := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),use_ldg) +KOKKOS_INTERNAL_CUDA_USE_UVM := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),force_uvm) +KOKKOS_INTERNAL_CUDA_USE_RELOC := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),rdc) +KOKKOS_INTERNAL_CUDA_USE_LAMBDA := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),enable_lambda) + # Check for Kokkos Host Execution Spaces one of which must be on. -KOKKOS_INTERNAL_USE_OPENMPTARGET := $(strip $(shell echo $(KOKKOS_DEVICES) | grep OpenMPTarget | wc -l)) -KOKKOS_INTERNAL_USE_OPENMP := $(strip $(shell echo $(subst OpenMPTarget,,$(KOKKOS_DEVICES)) | grep OpenMP | wc -l)) -KOKKOS_INTERNAL_USE_PTHREADS := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Pthread | wc -l)) -KOKKOS_INTERNAL_USE_QTHREADS := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Qthreads | wc -l)) -KOKKOS_INTERNAL_USE_SERIAL := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Serial | wc -l)) +KOKKOS_INTERNAL_USE_OPENMP := $(call kokkos_has_string,$(subst OpenMPTarget,,$(KOKKOS_DEVICES)),OpenMP) +KOKKOS_INTERNAL_USE_PTHREADS := $(call kokkos_has_string,$(KOKKOS_DEVICES),Pthread) +KOKKOS_INTERNAL_USE_QTHREADS := $(call kokkos_has_string,$(KOKKOS_DEVICES),Qthreads) +KOKKOS_INTERNAL_USE_SERIAL := $(call kokkos_has_string,$(KOKKOS_DEVICES),Serial) ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 0) ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 0) @@ -58,7 +71,9 @@ ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 0) endif # Check for other Execution Spaces. -KOKKOS_INTERNAL_USE_CUDA := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Cuda | wc -l)) +KOKKOS_INTERNAL_USE_CUDA := $(call kokkos_has_string,$(KOKKOS_DEVICES),Cuda) +KOKKOS_INTERNAL_USE_ROCM := $(call kokkos_has_string,$(KOKKOS_DEVICES),ROCm) +KOKKOS_INTERNAL_USE_OPENMPTARGET := $(call kokkos_has_string,$(KOKKOS_DEVICES),OpenMPTarget) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) KOKKOS_INTERNAL_NVCC_PATH := $(shell which nvcc) @@ -68,24 +83,20 @@ endif # Check OS. KOKKOS_OS := $(strip $(shell uname -s)) -KOKKOS_INTERNAL_OS_CYGWIN := $(strip $(shell uname -s | grep CYGWIN | wc -l)) -KOKKOS_INTERNAL_OS_LINUX := $(strip $(shell uname -s | grep Linux | wc -l)) -KOKKOS_INTERNAL_OS_DARWIN := $(strip $(shell uname -s | grep Darwin | wc -l)) +KOKKOS_INTERNAL_OS_CYGWIN := $(call kokkos_has_string,$(KOKKOS_OS),CYGWIN) +KOKKOS_INTERNAL_OS_LINUX := $(call kokkos_has_string,$(KOKKOS_OS),Linux) +KOKKOS_INTERNAL_OS_DARWIN := $(call kokkos_has_string,$(KOKKOS_OS),Darwin) # Check compiler. -KOKKOS_INTERNAL_COMPILER_INTEL := $(strip $(shell $(CXX) --version 2>&1 | grep "Intel Corporation" | wc -l)) -KOKKOS_INTERNAL_COMPILER_PGI := $(strip $(shell $(CXX) --version 2>&1 | grep PGI | wc -l)) +KOKKOS_CXX_VERSION := $(strip $(shell $(CXX) --version 2>&1)) +KOKKOS_INTERNAL_COMPILER_INTEL := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),Intel Corporation) +KOKKOS_INTERNAL_COMPILER_PGI := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),PGI) KOKKOS_INTERNAL_COMPILER_XL := $(strip $(shell $(CXX) -qversion 2>&1 | grep XL | wc -l)) KOKKOS_INTERNAL_COMPILER_CRAY := $(strip $(shell $(CXX) -craype-verbose 2>&1 | grep "CC-" | wc -l)) -KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell $(CXX) --version 2>&1 | grep nvcc | wc -l)) -KOKKOS_INTERNAL_COMPILER_CLANG := $(strip $(shell $(CXX) --version 2>&1 | grep clang | wc -l)) -KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(strip $(shell $(CXX) --version 2>&1 | grep "apple-darwin" | wc -l)) -ifneq ($(OMPI_CXX),) - KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell $(OMPI_CXX) --version 2>&1 | grep "nvcc" | wc -l)) -endif -ifneq ($(MPICH_CXX),) - KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell $(MPICH_CXX) --version 2>&1 | grep "nvcc" | wc -l)) -endif +KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell export OMPI_CXX=$(OMPI_CXX); export MPICH_CXX=$(MPICH_CXX); $(CXX) --version 2>&1 | grep nvcc | wc -l)) +KOKKOS_INTERNAL_COMPILER_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),clang) +KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),apple-darwin) +KOKKOS_INTERNAL_COMPILER_HCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),HCC) ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 2) KOKKOS_INTERNAL_COMPILER_CLANG = 1 @@ -98,6 +109,10 @@ endif ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) KOKKOS_INTERNAL_COMPILER_CLANG = 0 endif +# AMD HCC passes both clang and hcc test so turn off clang +ifeq ($(KOKKOS_INTERNAL_COMPILER_HCC), 1) + KOKKOS_INTENAL_COMPILER_CLANG = 0 +endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) KOKKOS_INTERNAL_COMPILER_CLANG_VERSION := $(shell clang --version | grep version | cut -d ' ' -f3 | tr -d '.') @@ -111,6 +126,36 @@ ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) endif endif +# Set compiler warnings flags. +ifeq ($(KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + # TODO check if PGI accepts GNU style warnings + KOKKOS_INTERNAL_COMPILER_WARNINGS = + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_INTERNAL_COMPILER_WARNINGS = -Wall -Wshadow -pedantic -Wsign-compare -Wtype-limits -Wuninitialized + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) + KOKKOS_INTERNAL_COMPILER_WARNINGS = -Wall -Wshadow -pedantic -Wsign-compare -Wtype-limits -Wuninitialized + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) + KOKKOS_INTERNAL_COMPILER_WARNINGS = -Wall -Wshadow -pedantic -Wsign-compare -Wtype-limits -Wuninitialized + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + # TODO check if cray accepts GNU style warnings + KOKKOS_INTERNAL_COMPILER_WARNINGS = + else + #gcc + KOKKOS_INTERNAL_COMPILER_WARNINGS = -Wall -Wshadow -pedantic -Wsign-compare -Wtype-limits -Wignored-qualifiers -Wempty-body -Wclobbered -Wuninitialized + endif + endif + endif + endif + endif +else + KOKKOS_INTERNAL_COMPILER_WARNINGS = +endif + # Set OpenMP flags. ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -mp @@ -152,8 +197,12 @@ else ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_INTERNAL_CXX11_FLAG := -hstd=c++11 else - KOKKOS_INTERNAL_CXX11_FLAG := --std=c++11 - KOKKOS_INTERNAL_CXX1Z_FLAG := --std=c++1z + ifeq ($(KOKKOS_INTERNAL_COMPILER_HCC), 1) + KOKKOS_INTERNAL_CXX11_FLAG := + else + KOKKOS_INTERNAL_CXX11_FLAG := --std=c++11 + KOKKOS_INTERNAL_CXX1Z_FLAG := --std=c++1z + endif endif endif endif @@ -161,46 +210,48 @@ endif # Check for Kokkos Architecture settings. # Intel based. -KOKKOS_INTERNAL_USE_ARCH_KNC := $(strip $(shell echo $(KOKKOS_ARCH) | grep KNC | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_SNB := $(strip $(shell echo $(KOKKOS_ARCH) | grep SNB | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_HSW := $(strip $(shell echo $(KOKKOS_ARCH) | grep HSW | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_BDW := $(strip $(shell echo $(KOKKOS_ARCH) | grep BDW | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_SKX := $(strip $(shell echo $(KOKKOS_ARCH) | grep SKX | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_KNL := $(strip $(shell echo $(KOKKOS_ARCH) | grep KNL | wc -l)) +KOKKOS_INTERNAL_USE_ARCH_KNC := $(call kokkos_has_string,$(KOKKOS_ARCH),KNC) +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_SKX := $(call kokkos_has_string,$(KOKKOS_ARCH),SKX) +KOKKOS_INTERNAL_USE_ARCH_KNL := $(call kokkos_has_string,$(KOKKOS_ARCH),KNL) # NVIDIA based. NVCC_WRAPPER := $(KOKKOS_PATH)/bin/nvcc_wrapper -KOKKOS_INTERNAL_USE_ARCH_KEPLER30 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler30 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_KEPLER32 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler32 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_KEPLER35 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler35 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_KEPLER37 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler37 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_MAXWELL50 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Maxwell50 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_MAXWELL52 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Maxwell52 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_MAXWELL53 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Maxwell53 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_PASCAL61 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Pascal61 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_PASCAL60 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Pascal60 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_NVIDIA := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_KEPLER30) \ - + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER32) \ - + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER35) \ - + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER37) \ - + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL61) \ - + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL60) \ - + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50) \ - + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52) \ - + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53) | bc)) +KOKKOS_INTERNAL_USE_ARCH_KEPLER30 := $(call kokkos_has_string,$(KOKKOS_ARCH),Kepler30) +KOKKOS_INTERNAL_USE_ARCH_KEPLER32 := $(call kokkos_has_string,$(KOKKOS_ARCH),Kepler32) +KOKKOS_INTERNAL_USE_ARCH_KEPLER35 := $(call kokkos_has_string,$(KOKKOS_ARCH),Kepler35) +KOKKOS_INTERNAL_USE_ARCH_KEPLER37 := $(call kokkos_has_string,$(KOKKOS_ARCH),Kepler37) +KOKKOS_INTERNAL_USE_ARCH_MAXWELL50 := $(call kokkos_has_string,$(KOKKOS_ARCH),Maxwell50) +KOKKOS_INTERNAL_USE_ARCH_MAXWELL52 := $(call kokkos_has_string,$(KOKKOS_ARCH),Maxwell52) +KOKKOS_INTERNAL_USE_ARCH_MAXWELL53 := $(call kokkos_has_string,$(KOKKOS_ARCH),Maxwell53) +KOKKOS_INTERNAL_USE_ARCH_PASCAL61 := $(call kokkos_has_string,$(KOKKOS_ARCH),Pascal61) +KOKKOS_INTERNAL_USE_ARCH_PASCAL60 := $(call kokkos_has_string,$(KOKKOS_ARCH),Pascal60) +KOKKOS_INTERNAL_USE_ARCH_NVIDIA := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KEPLER30) \ + + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER32) \ + + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER35) \ + + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER37) \ + + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL61) \ + + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL60) \ + + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50) \ + + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52) \ + + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53)) +#SEK: This seems like a bug to me ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 0) - KOKKOS_INTERNAL_USE_ARCH_MAXWELL50 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Maxwell | wc -l)) - KOKKOS_INTERNAL_USE_ARCH_KEPLER35 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler | wc -l)) - KOKKOS_INTERNAL_USE_ARCH_NVIDIA := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_KEPLER30) \ - + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER32) \ - + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER35) \ - + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER37) \ - + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL61) \ - + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL60) \ - + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50) \ - + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52) \ - + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53) | bc)) + KOKKOS_INTERNAL_USE_ARCH_MAXWELL50 := $(call kokkos_has_string,$(KOKKOS_ARCH),Maxwell) + KOKKOS_INTERNAL_USE_ARCH_KEPLER35 := $(call kokkos_has_string,$(KOKKOS_ARCH),Kepler) + KOKKOS_INTERNAL_USE_ARCH_NVIDIA := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KEPLER30) \ + + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER32) \ + + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER35) \ + + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER37) \ + + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL61) \ + + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL60) \ + + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50) \ + + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52) \ + + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53)) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 1) @@ -213,37 +264,46 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 1) endif endif # ARM based. -KOKKOS_INTERNAL_USE_ARCH_ARMV80 := $(strip $(shell echo $(KOKKOS_ARCH) | grep ARMv80 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_ARMV81 := $(strip $(shell echo $(KOKKOS_ARCH) | grep ARMv81 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX := $(strip $(shell echo $(KOKKOS_ARCH) | grep ARMv8-ThunderX | wc -l)) +KOKKOS_INTERNAL_USE_ARCH_ARMV80 := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv80) +KOKKOS_INTERNAL_USE_ARCH_ARMV81 := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv81) +KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv8-ThunderX) KOKKOS_INTERNAL_USE_ARCH_ARM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_ARMV80)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV81)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX) | bc)) # IBM based. -KOKKOS_INTERNAL_USE_ARCH_BGQ := $(strip $(shell echo $(KOKKOS_ARCH) | grep BGQ | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_POWER7 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Power7 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_POWER8 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Power8 | wc -l)) -KOKKOS_INTERNAL_USE_ARCH_POWER9 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Power9 | wc -l)) +KOKKOS_INTERNAL_USE_ARCH_BGQ := $(call kokkos_has_string,$(KOKKOS_ARCH),BGQ) +KOKKOS_INTERNAL_USE_ARCH_POWER7 := $(call kokkos_has_string,$(KOKKOS_ARCH),Power7) +KOKKOS_INTERNAL_USE_ARCH_POWER8 := $(call kokkos_has_string,$(KOKKOS_ARCH),Power8) +KOKKOS_INTERNAL_USE_ARCH_POWER9 := $(call kokkos_has_string,$(KOKKOS_ARCH),Power9) KOKKOS_INTERNAL_USE_ARCH_IBM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_BGQ)+$(KOKKOS_INTERNAL_USE_ARCH_POWER7)+$(KOKKOS_INTERNAL_USE_ARCH_POWER8)+$(KOKKOS_INTERNAL_USE_ARCH_POWER9) | bc)) # AMD based. -KOKKOS_INTERNAL_USE_ARCH_AMDAVX := $(strip $(shell echo $(KOKKOS_ARCH) | grep AMDAVX | wc -l)) +KOKKOS_INTERNAL_USE_ARCH_AMDAVX := $(call kokkos_has_string,$(KOKKOS_ARCH),AMDAVX) +KOKKOS_INTERNAL_USE_ARCH_RYZEN := $(call kokkos_has_string,$(KOKKOS_ARCH),Ryzen) +KOKKOS_INTERNAL_USE_ARCH_EPYC := $(call kokkos_has_string,$(KOKKOS_ARCH),Epyc) +KOKKOS_INTERNAL_USE_ARCH_KAVERI := $(call kokkos_has_string,$(KOKKOS_ARCH),Kaveri) +KOKKOS_INTERNAL_USE_ARCH_CARRIZO := $(call kokkos_has_string,$(KOKKOS_ARCH),Carrizo) +KOKKOS_INTERNAL_USE_ARCH_FIJI := $(call kokkos_has_string,$(KOKKOS_ARCH),Fiji) +KOKKOS_INTERNAL_USE_ARCH_VEGA := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega) +KOKKOS_INTERNAL_USE_ARCH_GFX901 := $(call kokkos_has_string,$(KOKKOS_ARCH),gfx901) # Any AVX? -KOKKOS_INTERNAL_USE_ARCH_AVX := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_SNB)+$(KOKKOS_INTERNAL_USE_ARCH_AMDAVX) | bc )) -KOKKOS_INTERNAL_USE_ARCH_AVX2 := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_HSW)+$(KOKKOS_INTERNAL_USE_ARCH_BDW) | bc )) -KOKKOS_INTERNAL_USE_ARCH_AVX512MIC := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_KNL) | bc )) -KOKKOS_INTERNAL_USE_ARCH_AVX512XEON := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_SKX) | bc )) +KOKKOS_INTERNAL_USE_ARCH_SSE42 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM)) +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_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 := $(strip $(shell echo $(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) | bc )) -KOKKOS_INTERNAL_USE_ISA_KNC := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_KNC) | bc )) -KOKKOS_INTERNAL_USE_ISA_POWERPCLE := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_POWER8)+$(KOKKOS_INTERNAL_USE_ARCH_POWER9) | bc )) +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_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 := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_BDW)+$(KOKKOS_INTERNAL_USE_ARCH_SKX) | bc )) +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_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_AVX512XEON)+$(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) @@ -257,91 +317,105 @@ endif KOKKOS_CPPFLAGS = -I./ -I$(KOKKOS_PATH)/core/src -I$(KOKKOS_PATH)/containers/src -I$(KOKKOS_PATH)/algorithms/src -# No warnings: KOKKOS_CXXFLAGS = -# INTEL and CLANG warnings: -#KOKKOS_CXXFLAGS = -Wall -Wshadow -pedantic -Wsign-compare -Wtype-limits -Wuninitialized -# GCC warnings: -#KOKKOS_CXXFLAGS = -Wall -Wshadow -pedantic -Wsign-compare -Wtype-limits -Wuninitialized -Wignored-qualifiers -Wempty-body -Wclobbered +ifeq ($(KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS), 1) + KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_WARNINGS) +endif -KOKKOS_LIBS = -lkokkos -ldl +KOKKOS_LIBS = -ldl KOKKOS_LDFLAGS = -L$(shell pwd) KOKKOS_SRC = KOKKOS_HEADERS = # Generating the KokkosCore_config.h file. +KOKKOS_INTERNAL_CONFIG_TMP=KokkosCore_config.tmp +KOKKOS_CONFIG_HEADER=KokkosCore_config.h +# Functions for generating config header file +kokkos_append_header = $(shell echo $1 >> $(KOKKOS_INTERNAL_CONFIG_TMP)) + +# Do not append first line tmp := $(shell echo "/* ---------------------------------------------" > KokkosCore_config.tmp) -tmp := $(shell echo "Makefile constructed configuration:" >> KokkosCore_config.tmp) -tmp := $(shell date >> KokkosCore_config.tmp) -tmp := $(shell echo "----------------------------------------------*/" >> KokkosCore_config.tmp) +tmp := $(call kokkos_append_header,"Makefile constructed configuration:") +tmp := $(call kokkos_append_header,"$(shell date)") +tmp := $(call kokkos_append_header,"----------------------------------------------*/") -tmp := $(shell echo '\#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H)' >> KokkosCore_config.tmp) -tmp := $(shell echo '\#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead."' >> KokkosCore_config.tmp) -tmp := $(shell echo '\#else' >> KokkosCore_config.tmp) -tmp := $(shell echo '\#define KOKKOS_CORE_CONFIG_H' >> KokkosCore_config.tmp) -tmp := $(shell echo '\#endif' >> KokkosCore_config.tmp) - -tmp := $(shell echo "/* Execution Spaces */" >> KokkosCore_config.tmp) +tmp := $(call kokkos_append_header,'\#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H)') +tmp := $(call kokkos_append_header,'\#error "Do not include $(KOKKOS_CONFIG_HEADER) directly; include Kokkos_Macros.hpp instead."') +tmp := $(call kokkos_append_header,'\#else') +tmp := $(call kokkos_append_header,'\#define KOKKOS_CORE_CONFIG_H') +tmp := $(call kokkos_append_header,'\#endif') + +tmp := $(call kokkos_append_header,"/* Execution Spaces */") ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) - tmp := $(shell echo "\#define KOKKOS_HAVE_CUDA 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_CUDA") +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + tmp := $(call kokkos_append_header,'\#define KOKKOS_ENABLE_ROCM') endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) - tmp := $(shell echo '\#define KOKKOS_ENABLE_OPENMPTARGET 1' >> KokkosCore_config.tmp) + tmp := $(call kokkos_append_header,'\#define KOKKOS_ENABLE_OPENMPTARGET') endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) - tmp := $(shell echo '\#define KOKKOS_HAVE_OPENMP 1' >> KokkosCore_config.tmp) + tmp := $(call kokkos_append_header,'\#define KOKKOS_HAVE_OPENMP') endif ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) - tmp := $(shell echo "\#define KOKKOS_HAVE_PTHREAD 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_PTHREAD") endif ifeq ($(KOKKOS_INTERNAL_USE_QTHREADS), 1) - tmp := $(shell echo "\#define KOKKOS_HAVE_QTHREADS 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_QTHREADS") endif ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) - tmp := $(shell echo "\#define KOKKOS_HAVE_SERIAL 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_SERIAL") endif ifeq ($(KOKKOS_INTERNAL_USE_TM), 1) - tmp := $(shell echo "\#ifndef __CUDA_ARCH__" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ENABLE_TM" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#endif" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#ifndef __CUDA_ARCH__") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_TM") + tmp := $(call kokkos_append_header,"\#endif") endif ifeq ($(KOKKOS_INTERNAL_USE_ISA_X86_64), 1) - tmp := $(shell echo "\#ifndef __CUDA_ARCH__" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_USE_ISA_X86_64" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#endif" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#ifndef __CUDA_ARCH__") + tmp := $(call kokkos_append_header,"\#define KOKKOS_USE_ISA_X86_64") + tmp := $(call kokkos_append_header,"\#endif") endif ifeq ($(KOKKOS_INTERNAL_USE_ISA_KNC), 1) - tmp := $(shell echo "\#ifndef __CUDA_ARCH__" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_USE_ISA_KNC" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#endif" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#ifndef __CUDA_ARCH__") + tmp := $(call kokkos_append_header,"\#define KOKKOS_USE_ISA_KNC") + tmp := $(call kokkos_append_header,"\#endif") endif ifeq ($(KOKKOS_INTERNAL_USE_ISA_POWERPCLE), 1) - tmp := $(shell echo "\#ifndef __CUDA_ARCH__" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_USE_ISA_POWERPCLE" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#endif" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#ifndef __CUDA_ARCH__") + tmp := $(call kokkos_append_header,"\#define KOKKOS_USE_ISA_POWERPCLE") + tmp := $(call kokkos_append_header,"\#endif") endif -tmp := $(shell echo "/* General Settings */" >> KokkosCore_config.tmp) +ifeq ($(KOKKOS_INTERNAL_USE_ISA_POWERPCBE), 1) + tmp := $(call kokkos_append_header,"\#ifndef __CUDA_ARCH__") + tmp := $(call kokkos_append_header,"\#define KOKKOS_USE_ISA_POWERPCBE") + tmp := $(call kokkos_append_header,"\#endif") +endif + +tmp := $(call kokkos_append_header,"/* General Settings */") ifeq ($(KOKKOS_INTERNAL_ENABLE_CXX11), 1) KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_CXX11_FLAG) - tmp := $(shell echo "\#define KOKKOS_HAVE_CXX11 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_CXX11") endif ifeq ($(KOKKOS_INTERNAL_ENABLE_CXX1Z), 1) KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_CXX1Z_FLAG) - tmp := $(shell echo "\#define KOKKOS_HAVE_CXX11 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_HAVE_CXX1Z 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_CXX11") + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_CXX1Z") endif ifeq ($(KOKKOS_INTERNAL_ENABLE_DEBUG), 1) @@ -351,63 +425,63 @@ ifeq ($(KOKKOS_INTERNAL_ENABLE_DEBUG), 1) KOKKOS_CXXFLAGS += -g KOKKOS_LDFLAGS += -g -ldl - tmp := $(shell echo "\#define KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_HAVE_DEBUG 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK") + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_DEBUG") ifeq ($(KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK), 0) - tmp := $(shell echo "\#define KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK") endif endif ifeq ($(KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT), 1) - tmp := $(shell echo "\#define KOKKOS_ENABLE_PROFILING_LOAD_PRINT 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_PROFILING_LOAD_PRINT") endif ifeq ($(KOKKOS_INTERNAL_USE_HWLOC), 1) KOKKOS_CPPFLAGS += -I$(HWLOC_PATH)/include KOKKOS_LDFLAGS += -L$(HWLOC_PATH)/lib KOKKOS_LIBS += -lhwloc - tmp := $(shell echo "\#define KOKKOS_HAVE_HWLOC 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_HWLOC") endif ifeq ($(KOKKOS_INTERNAL_USE_LIBRT), 1) - tmp := $(shell echo "\#define KOKKOS_USE_LIBRT 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_USE_LIBRT") KOKKOS_LIBS += -lrt endif ifeq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) KOKKOS_CPPFLAGS += -I$(MEMKIND_PATH)/include KOKKOS_LDFLAGS += -L$(MEMKIND_PATH)/lib - KOKKOS_LIBS += -lmemkind - tmp := $(shell echo "\#define KOKKOS_HAVE_HBWSPACE 1" >> KokkosCore_config.tmp ) + KOKKOS_LIBS += -lmemkind -lnuma + tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_HBWSPACE") endif ifeq ($(KOKKOS_INTERNAL_DISABLE_PROFILING), 0) - tmp := $(shell echo "\#define KOKKOS_ENABLE_PROFILING" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_PROFILING") endif -tmp := $(shell echo "/* Optimization Settings */" >> KokkosCore_config.tmp) +tmp := $(call kokkos_append_header,"/* Optimization Settings */") ifeq ($(KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION), 1) - tmp := $(shell echo "\#define KOKKOS_OPT_RANGE_AGGRESSIVE_VECTORIZATION 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_OPT_RANGE_AGGRESSIVE_VECTORIZATION") endif -tmp := $(shell echo "/* Cuda Settings */" >> KokkosCore_config.tmp) +tmp := $(call kokkos_append_header,"/* Cuda Settings */") ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) ifeq ($(KOKKOS_INTERNAL_CUDA_USE_LDG), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LDG_INTRINSIC 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_USE_LDG_INTRINSIC") else ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LDG_INTRINSIC 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_USE_LDG_INTRINSIC") endif endif ifeq ($(KOKKOS_INTERNAL_CUDA_USE_UVM), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_UVM 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_USE_UVM") endif ifeq ($(KOKKOS_INTERNAL_CUDA_USE_RELOC), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_RELOCATABLE_DEVICE_CODE 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_USE_RELOCATABLE_DEVICE_CODE") KOKKOS_CXXFLAGS += --relocatable-device-code=true KOKKOS_LDFLAGS += --relocatable-device-code=true endif @@ -415,7 +489,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) ifeq ($(KOKKOS_INTERNAL_CUDA_USE_LAMBDA), 1) ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) ifeq ($(shell test $(KOKKOS_INTERNAL_COMPILER_NVCC_VERSION) -gt 70; echo $$?),0) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LAMBDA 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_USE_LAMBDA") KOKKOS_CXXFLAGS += -expt-extended-lambda else $(warning Warning: Cuda Lambda support was requested but NVCC version is too low. This requires NVCC for Cuda version 7.5 or higher. Disabling Lambda support now.) @@ -423,19 +497,19 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LAMBDA 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_USE_LAMBDA") endif endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_CLANG_WORKAROUND" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_CUDA_CLANG_WORKAROUND") endif endif # Add Architecture flags. ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV80), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_ARMV80 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ARMV80") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -452,7 +526,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV80), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV81), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_ARMV81 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ARMV81") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -469,8 +543,8 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV81), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_ARMV80 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_ARMV8_THUNDERX 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ARMV80") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ARMV8_THUNDERX") ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) KOKKOS_CXXFLAGS += @@ -486,8 +560,30 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX), 1) endif endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SSE42), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_SSE42") + + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) + KOKKOS_CXXFLAGS += -xSSE4.2 + KOKKOS_LDFLAGS += -xSSE4.2 + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + KOKKOS_CXXFLAGS += -tp=nehalem + KOKKOS_LDFLAGS += -tp=nehalem + else + # Assume that this is a really a GNU compiler. + KOKKOS_CXXFLAGS += -msse4.2 + KOKKOS_LDFLAGS += -msse4.2 + endif + endif + endif +endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_AVX 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_AVX") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -mavx @@ -508,32 +604,62 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX), 1) endif endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER8), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_POWER8 1" >> KokkosCore_config.tmp ) +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER7), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_POWER7") ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) else # Assume that this is a really a GNU compiler or it could be XL on P8. - KOKKOS_CXXFLAGS += -mcpu=power8 -mtune=power8 - KOKKOS_LDFLAGS += -mcpu=power8 -mtune=power8 + KOKKOS_CXXFLAGS += -mcpu=power7 -mtune=power7 + KOKKOS_LDFLAGS += -mcpu=power7 -mtune=power7 endif endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER9), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_POWER9 1" >> KokkosCore_config.tmp ) +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER8), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_POWER8") ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) else - # Assume that this is a really a GNU compiler or it could be XL on P9. - KOKKOS_CXXFLAGS += -mcpu=power9 -mtune=power9 - KOKKOS_LDFLAGS += -mcpu=power9 -mtune=power9 + ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) + KOKKOS_CXXFLAGS += -mcpu=power8 -mtune=power8 + KOKKOS_LDFLAGS += -mcpu=power8 -mtune=power8 + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) + + else + # Assume that this is a really a GNU compiler on P8. + KOKKOS_CXXFLAGS += -mcpu=power8 -mtune=power8 + KOKKOS_LDFLAGS += -mcpu=power8 -mtune=power8 + endif + endif + endif +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER9), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_POWER9") + + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) + KOKKOS_CXXFLAGS += -mcpu=power9 -mtune=power9 + KOKKOS_LDFLAGS += -mcpu=power9 -mtune=power9 + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) + + else + # Assume that this is a really a GNU compiler on P9 + KOKKOS_CXXFLAGS += -mcpu=power9 -mtune=power9 + KOKKOS_LDFLAGS += -mcpu=power9 -mtune=power9 + endif + endif endif endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_HSW), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_AVX2 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_AVX2") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -xCORE-AVX2 @@ -555,7 +681,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_HSW), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_BDW), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_AVX2 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_AVX2") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -xCORE-AVX2 @@ -577,7 +703,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_BDW), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_AVX512MIC 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_AVX512MIC") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -xMIC-AVX512 @@ -598,7 +724,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_AVX512XEON 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_AVX512XEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) KOKKOS_CXXFLAGS += -xCORE-AVX512 @@ -619,7 +745,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KNC), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KNC 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KNC") KOKKOS_CXXFLAGS += -mmic KOKKOS_LDFLAGS += -mmic endif @@ -635,48 +761,48 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER30), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER30 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER30") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_30 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER32), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER32 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER32") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_32 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER35), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER35 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER35") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_35 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER37), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER37 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KEPLER37") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_37 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL50 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_MAXWELL") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_MAXWELL50") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_50 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL52 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_MAXWELL") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_MAXWELL52") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_52 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL53 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_MAXWELL") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_MAXWELL53") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_53 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_PASCAL60), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL60 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_PASCAL") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_PASCAL60") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_60 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_PASCAL61), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL61 1" >> KokkosCore_config.tmp ) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_PASCAL") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_PASCAL61") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_61 endif @@ -689,7 +815,49 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) endif endif -KOKKOS_INTERNAL_LS_CONFIG := $(shell ls KokkosCore_config.h) +# Figure out the architecture flag for ROCm. +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + # Lets start with adding architecture defines + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KAVERI), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ROCM 701") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_KAVERI") + KOKKOS_INTERNAL_ROCM_ARCH_FLAG := --amdgpu-target=gfx701 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_CARRIZO), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ROCM 801") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_CARRIZO") + KOKKOS_INTERNAL_ROCM_ARCH_FLAG := --amdgpu-target=gfx801 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_FIJI), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ROCM 803") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_FIJI") + KOKKOS_INTERNAL_ROCM_ARCH_FLAG := --amdgpu-target=gfx803 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ROCM 900") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_VEGA") + KOKKOS_INTERNAL_ROCM_ARCH_FLAG := --amdgpu-target=gfx900 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_GFX901), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ROCM 901") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_GFX901") + KOKKOS_INTERNAL_ROCM_ARCH_FLAG := --amdgpu-target=gfx901 + endif + + + KOKKOS_INTERNAL_HCC_PATH := $(shell which $(CXX)) + ROCM_HCC_PATH ?= $(KOKKOS_INTERNAL_HCC_PATH:/bin/clang++=) + + KOKKOS_CXXFLAGS += $(shell $(ROCM_HCC_PATH)/bin/hcc-config --cxxflags) + KOKKOS_LDFLAGS += $(shell $(ROCM_HCC_PATH)/bin/hcc-config --ldflags) -lhc_am -lm + KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_ROCM_ARCH_FLAG) + + KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/ROCm/*.cpp) + KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/ROCm/*.hpp) +endif + +KOKKOS_INTERNAL_LS_CONFIG := $(shell ls KokkosCore_config.h 2>&1) + ifeq ($(KOKKOS_INTERNAL_LS_CONFIG), KokkosCore_config.h) KOKKOS_INTERNAL_NEW_CONFIG := $(strip $(shell diff KokkosCore_config.h KokkosCore_config.tmp | grep define | wc -l)) else @@ -792,6 +960,10 @@ ifeq ($(KOKKOS_INTERNAL_OS_CYGWIN), 1) KOKKOS_CXXFLAGS += -U__STRICT_ANSI__ endif +# Set KokkosExtraLibs and add -lkokkos to link line +KOKKOS_EXTRA_LIBS := ${KOKKOS_LIBS} +KOKKOS_LIBS := -lkokkos ${KOKKOS_LIBS} + # Setting up dependencies. KokkosCore_config.h: diff --git a/lib/kokkos/Makefile.targets b/lib/kokkos/Makefile.targets index 3cb52a04cd..a63598577c 100644 --- a/lib/kokkos/Makefile.targets +++ b/lib/kokkos/Makefile.targets @@ -20,8 +20,10 @@ Kokkos_TaskQueue.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Ta $(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 $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_HostThreadTeam.cpp -Kokkos_spinwait.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_spinwait.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_spinwait.cpp +Kokkos_Spinwait.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Spinwait.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Spinwait.cpp +Kokkos_HostBarrier.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_HostBarrier.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_HostBarrier.cpp Kokkos_Profiling_Interface.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Profiling_Interface.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Profiling_Interface.cpp Kokkos_SharedAlloc.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_SharedAlloc.cpp @@ -36,6 +38,19 @@ Kokkos_CudaSpace.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cu $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_CudaSpace.cpp Kokkos_Cuda_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Task.cpp $(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 +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) +Kokkos_ROCm_Exec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Exec.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Exec.cpp +Kokkos_ROCm_Space.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Space.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Space.cpp +Kokkos_ROCm_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Task.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Task.cpp +Kokkos_ROCm_Impl.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Impl.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/ROCm/Kokkos_ROCm_Impl.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) diff --git a/lib/kokkos/README b/lib/kokkos/README index 257a2e5db4..d6c66634dd 100644 --- a/lib/kokkos/README +++ b/lib/kokkos/README @@ -41,40 +41,39 @@ hcedwar(at)sandia.gov and crtrott(at)sandia.gov ============================================================================ Primary tested compilers on X86 are: - GCC 4.7.2 GCC 4.8.4 - GCC 4.9.2 + GCC 4.9.3 GCC 5.1.0 - GCC 5.2.0 - Intel 14.0.4 + GCC 5.3.0 + GCC 6.1.0 Intel 15.0.2 Intel 16.0.1 - Intel 17.0.098 - Intel 17.1.132 + Intel 17.1.043 + Intel 17.4.196 + Intel 18.0.128 Clang 3.5.2 Clang 3.6.1 Clang 3.7.1 Clang 3.8.1 Clang 3.9.0 - PGI 17.1 + Clang 4.0.0 + Clang 4.0.0 for CUDA (CUDA Toolkit 8.0.44) + PGI 17.10 + NVCC 7.0 for CUDA (with gcc 4.8.4) + NVCC 7.5 for CUDA (with gcc 4.8.4) + NVCC 8.0.44 for CUDA (with gcc 5.3.0) Primary tested compilers on Power 8 are: GCC 5.4.0 (OpenMP,Serial) - IBM XL 13.1.3 (OpenMP, Serial) (There is a workaround in place to avoid a compiler bug) + IBM XL 13.1.5 (OpenMP, Serial) (There is a workaround in place to avoid a compiler bug) + NVCC 8.0.44 for CUDA (with gcc 5.4.0) + NVCC 9.0.103 for CUDA (with gcc 6.3.0) Primary tested compilers on Intel KNL are: GCC 6.2.0 - Intel 16.2.181 (with gcc 4.7.2) - Intel 17.0.098 (with gcc 4.7.2) - Intel 17.1.132 (with gcc 4.9.3) + Intel 16.4.258 (with gcc 4.7.2) Intel 17.2.174 (with gcc 4.9.3) - Intel 18.0.061 (beta) (with gcc 4.9.3) - -Secondary tested compilers are: - CUDA 7.0 (with gcc 4.8.4) - CUDA 7.5 (with gcc 4.8.4) - CUDA 8.0 (with gcc 5.3.0 on X86 and gcc 5.4.0 on Power8) - CUDA/Clang 8.0 using Clang/Trunk compiler + Intel 18.0.128 (with gcc 4.9.3) Other compilers working: X86: @@ -93,8 +92,8 @@ GCC: -Wall -Wshadow -pedantic -Werror -Wsign-compare -Wtype-limits -Wignored-qualifiers -Wempty-body -Wclobbered -Wuninitialized Intel: -Wall -Wshadow -pedantic -Werror -Wsign-compare -Wtype-limits -Wuninitialized Clang: -Wall -Wshadow -pedantic -Werror -Wsign-compare -Wtype-limits -Wuninitialized +NVCC: -Wall -Wshadow -pedantic -Werror -Wsign-compare -Wtype-limits -Wuninitialized -Secondary compilers are passing without -Werror. Other compilers are tested occasionally, in particular when pushing from develop to master branch, without -Werror and only for a select set of backends. @@ -171,3 +170,22 @@ Contributions to Kokkos are welcome. In order to do so, please open an issue where a feature request or bug can be discussed. Then issue a pull request with your contribution. Pull requests must be issued against the develop branch. +=========================================================================== +====Citing Kokkos========================================================== +=========================================================================== + +If you publish work which mentions Kokkos, please cite the following paper: + +@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" +} diff --git a/lib/kokkos/algorithms/CMakeLists.txt b/lib/kokkos/algorithms/CMakeLists.txt index 7853184a54..507c9f2fdb 100644 --- a/lib/kokkos/algorithms/CMakeLists.txt +++ b/lib/kokkos/algorithms/CMakeLists.txt @@ -2,7 +2,9 @@ TRIBITS_SUBPACKAGE(Algorithms) -ADD_SUBDIRECTORY(src) +IF(KOKKOS_HAS_TRILINOS) + ADD_SUBDIRECTORY(src) +ENDIF() TRIBITS_ADD_TEST_DIRECTORIES(unit_tests) #TRIBITS_ADD_TEST_DIRECTORIES(performance_tests) diff --git a/lib/kokkos/algorithms/src/Kokkos_Random.hpp b/lib/kokkos/algorithms/src/Kokkos_Random.hpp index 42c115b7a5..3db9a145d7 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Random.hpp @@ -755,6 +755,12 @@ namespace Kokkos { return Random_XorShift64(state_(i),i); } + // NOTE: state_idx MUST be unique and less than num_states + KOKKOS_INLINE_FUNCTION + Random_XorShift64 get_state(const int state_idx) const { + return Random_XorShift64(state_(state_idx),state_idx); + } + KOKKOS_INLINE_FUNCTION void free_state(const Random_XorShift64& state) const { state_(state.state_idx_) = state.state_; @@ -1010,6 +1016,12 @@ namespace Kokkos { return Random_XorShift1024(state_,p_(i),i); }; + // NOTE: state_idx MUST be unique and less than num_states + KOKKOS_INLINE_FUNCTION + Random_XorShift1024 get_state(const int state_idx) const { + return Random_XorShift1024(state_,p_(state_idx),state_idx); + } + KOKKOS_INLINE_FUNCTION void free_state(const Random_XorShift1024& state) const { for(int i = 0; i<16; i++) @@ -1208,8 +1220,8 @@ Random_XorShift64 Random_XorShift64_Pool::get_state( template<> KOKKOS_INLINE_FUNCTION void Random_XorShift64_Pool::free_state(const Random_XorShift64 &state) const { -#ifdef __CUDA_ARCH__ state_(state.state_idx_) = state.state_; +#ifdef __CUDA_ARCH__ locks_(state.state_idx_) = 0; return; #endif @@ -1244,7 +1256,244 @@ Random_XorShift1024 Random_XorShift1024_Pool::get_st template<> KOKKOS_INLINE_FUNCTION void Random_XorShift1024_Pool::free_state(const Random_XorShift1024 &state) const { + for(int i=0; i<16; i++) + state_(state.state_idx_,i) = state.state_[i]; #ifdef __CUDA_ARCH__ + locks_(state.state_idx_) = 0; + return; +#endif +} + + +#endif + +#if defined(KOKKOS_ENABLE_ROCM) + + template<> + class Random_XorShift1024 { + private: + int p_; + const int state_idx_; + uint64_t* state_; + const int stride_; + friend class Random_XorShift1024_Pool; + public: + + typedef Kokkos::Experimental::ROCm device_type; + typedef Random_XorShift1024_Pool pool_type; + + enum {MAX_URAND = 0xffffffffU}; + enum {MAX_URAND64 = 0xffffffffffffffffULL-1}; + enum {MAX_RAND = static_cast(0xffffffffU/2)}; + enum {MAX_RAND64 = static_cast(0xffffffffffffffffULL/2-1)}; + + KOKKOS_INLINE_FUNCTION + Random_XorShift1024 (const typename pool_type::state_data_type& state, int p, int state_idx = 0): + p_(p),state_idx_(state_idx),state_(&state(state_idx,0)),stride_(state.stride_1()){ + } + + KOKKOS_INLINE_FUNCTION + uint32_t urand() { + uint64_t state_0 = state_[ p_ * stride_ ]; + uint64_t state_1 = state_[ (p_ = ( p_ + 1 ) & 15) * stride_ ]; + state_1 ^= state_1 << 31; + state_1 ^= state_1 >> 11; + state_0 ^= state_0 >> 30; + uint64_t tmp = ( state_[ p_ * stride_ ] = state_0 ^ state_1 ) * 1181783497276652981ULL; + tmp = tmp>>16; + return static_cast(tmp&MAX_URAND); + } + + KOKKOS_INLINE_FUNCTION + uint64_t urand64() { + uint64_t state_0 = state_[ p_ * stride_ ]; + uint64_t state_1 = state_[ (p_ = ( p_ + 1 ) & 15) * stride_ ]; + state_1 ^= state_1 << 31; + state_1 ^= state_1 >> 11; + state_0 ^= state_0 >> 30; + return (( state_[ p_ * stride_ ] = state_0 ^ state_1 ) * 1181783497276652981LL) - 1; + } + + KOKKOS_INLINE_FUNCTION + uint32_t urand(const uint32_t& range) { + const uint32_t max_val = (MAX_URAND/range)*range; + uint32_t tmp = urand(); + while(tmp>=max_val) + urand(); + return tmp%range; + } + + KOKKOS_INLINE_FUNCTION + uint32_t urand(const uint32_t& start, const uint32_t& end ) { + return urand(end-start)+start; + } + + KOKKOS_INLINE_FUNCTION + uint64_t urand64(const uint64_t& range) { + const uint64_t max_val = (MAX_URAND64/range)*range; + uint64_t tmp = urand64(); + while(tmp>=max_val) + urand64(); + return tmp%range; + } + + KOKKOS_INLINE_FUNCTION + uint64_t urand64(const uint64_t& start, const uint64_t& end ) { + return urand64(end-start)+start; + } + + KOKKOS_INLINE_FUNCTION + int rand() { + return static_cast(urand()/2); + } + + KOKKOS_INLINE_FUNCTION + int rand(const int& range) { + const int max_val = (MAX_RAND/range)*range; + int tmp = rand(); + while(tmp>=max_val) + rand(); + return tmp%range; + } + + KOKKOS_INLINE_FUNCTION + int rand(const int& start, const int& end ) { + return rand(end-start)+start; + } + + KOKKOS_INLINE_FUNCTION + int64_t rand64() { + return static_cast(urand64()/2); + } + + KOKKOS_INLINE_FUNCTION + int64_t rand64(const int64_t& range) { + const int64_t max_val = (MAX_RAND64/range)*range; + int64_t tmp = rand64(); + while(tmp>=max_val) + rand64(); + return tmp%range; + } + + KOKKOS_INLINE_FUNCTION + int64_t rand64(const int64_t& start, const int64_t& end ) { + return rand64(end-start)+start; + } + + KOKKOS_INLINE_FUNCTION + float frand() { + return 1.0f * urand64()/MAX_URAND64; + } + + KOKKOS_INLINE_FUNCTION + float frand(const float& range) { + return range * urand64()/MAX_URAND64; + } + + KOKKOS_INLINE_FUNCTION + float frand(const float& start, const float& end ) { + return frand(end-start)+start; + } + + KOKKOS_INLINE_FUNCTION + double drand() { + return 1.0 * urand64()/MAX_URAND64; + } + + KOKKOS_INLINE_FUNCTION + double drand(const double& range) { + return range * urand64()/MAX_URAND64; + } + + KOKKOS_INLINE_FUNCTION + double drand(const double& start, const double& end ) { + return frand(end-start)+start; + } + + //Marsaglia polar method for drawing a standard normal distributed random number + KOKKOS_INLINE_FUNCTION + double normal() { + double S = 2.0; + double U; + while(S>=1.0) { + U = 2.0*drand() - 1.0; + const double V = 2.0*drand() - 1.0; + S = U*U+V*V; + } + return U*std::sqrt(-2.0*log(S)/S); + } + + KOKKOS_INLINE_FUNCTION + double normal(const double& mean, const double& std_dev=1.0) { + return mean + normal()*std_dev; + } + }; + +template<> +inline +Random_XorShift64_Pool::Random_XorShift64_Pool(uint64_t seed) { + num_states_ = 0; + init(seed,4*32768); +} + +template<> +KOKKOS_INLINE_FUNCTION +Random_XorShift64 Random_XorShift64_Pool::get_state() const { +#ifdef __HCC_ACCELERATOR__ + 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)%num_states_; + while(Kokkos::atomic_compare_exchange(&locks_(i),0,1)) { + i+=blockDim_x*blockDim_y*blockDim_z; + if(i>=num_states_) {i = i_offset;} + } + + return Random_XorShift64(state_(i),i); +#else + return Random_XorShift64(state_(0),0); +#endif +} + +template<> +KOKKOS_INLINE_FUNCTION +void Random_XorShift64_Pool::free_state(const Random_XorShift64 &state) const { +#ifdef __HCC_ACCELERATOR__ + state_(state.state_idx_) = state.state_; + locks_(state.state_idx_) = 0; + return; +#endif +} + + +template<> +inline +Random_XorShift1024_Pool::Random_XorShift1024_Pool(uint64_t seed) { + num_states_ = 0; + init(seed,4*32768); +} + +template<> +KOKKOS_INLINE_FUNCTION +Random_XorShift1024 Random_XorShift1024_Pool::get_state() const { +#ifdef __HCC_ACCELERATOR__ + 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)%num_states_; + while(Kokkos::atomic_compare_exchange(&locks_(i),0,1)) { + i+=blockDim_x*blockDim_y*blockDim_z; + if(i>=num_states_) {i = i_offset;} + } + + return Random_XorShift1024(state_, p_(i), i); +#else + return Random_XorShift1024(state_, p_(0), 0); +#endif +} + +template<> +KOKKOS_INLINE_FUNCTION +void Random_XorShift1024_Pool::free_state(const Random_XorShift1024 &state) const { +#ifdef __HCC_ACCELERATOR__ for(int i=0; i<16; i++) state_(state.state_idx_,i) = state.state_[i]; locks_(state.state_idx_) = 0; diff --git a/lib/kokkos/algorithms/unit_tests/CMakeLists.txt b/lib/kokkos/algorithms/unit_tests/CMakeLists.txt index fde6b967e0..f5aa24e9be 100644 --- a/lib/kokkos/algorithms/unit_tests/CMakeLists.txt +++ b/lib/kokkos/algorithms/unit_tests/CMakeLists.txt @@ -3,6 +3,32 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src ) +IF(NOT KOKKOS_HAS_TRILINOS) + IF(KOKKOS_SEPARATE_LIBS) + set(TEST_LINK_TARGETS kokkoscore) + ELSE() + set(TEST_LINK_TARGETS kokkos) + ENDIF() +ENDIF() + +SET(GTEST_SOURCE_DIR ${${PARENT_PACKAGE_NAME}_SOURCE_DIR}/tpls/gtest) +INCLUDE_DIRECTORIES(${GTEST_SOURCE_DIR}) + +# mfh 03 Nov 2017: The gtest library used here must have a different +# name than that of the gtest library built in KokkosCore. We can't +# just refer to the library in KokkosCore's tests, because it's +# possible to build only (e.g.,) KokkosAlgorithms tests, without +# building KokkosCore tests. + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_HAS_PTHREAD=0") + +TRIBITS_ADD_LIBRARY( + kokkosalgorithms_gtest + HEADERS ${GTEST_SOURCE_DIR}/gtest/gtest.h + SOURCES ${GTEST_SOURCE_DIR}/gtest/gtest-all.cc + TESTONLY + ) + SET(SOURCES UnitTestMain.cpp TestCuda.cpp @@ -34,5 +60,5 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkosalgorithms_gtest ${TEST_LINK_TARGETS} ) diff --git a/lib/kokkos/algorithms/unit_tests/Makefile b/lib/kokkos/algorithms/unit_tests/Makefile index b74192ef18..b5848c451e 100644 --- a/lib/kokkos/algorithms/unit_tests/Makefile +++ b/lib/kokkos/algorithms/unit_tests/Makefile @@ -15,7 +15,8 @@ endif CXXFLAGS = -O3 LINK ?= $(CXX) -LDFLAGS ?= -lpthread +LDFLAGS ?= +override LDFLAGS += -lpthread include $(KOKKOS_PATH)/Makefile.kokkos @@ -30,6 +31,12 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) TEST_TARGETS += test-cuda endif +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + OBJ_ROCM = TestROCm.o UnitTestMain.o gtest-all.o + TARGETS += KokkosAlgorithms_UnitTest_ROCm + TEST_TARGETS += test-rocm +endif + ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) OBJ_THREADS = TestThreads.o UnitTestMain.o gtest-all.o TARGETS += KokkosAlgorithms_UnitTest_Threads @@ -51,6 +58,9 @@ endif KokkosAlgorithms_UnitTest_Cuda: $(OBJ_CUDA) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_CUDA) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_Cuda +KokkosAlgorithms_UnitTest_ROCm: $(OBJ_ROCM) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(EXTRA_PATH) $(OBJ_ROCM) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_ROCm + KokkosAlgorithms_UnitTest_Threads: $(OBJ_THREADS) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_THREADS) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_Threads @@ -63,6 +73,9 @@ KokkosAlgorithms_UnitTest_Serial: $(OBJ_SERIAL) $(KOKKOS_LINK_DEPENDS) test-cuda: KokkosAlgorithms_UnitTest_Cuda ./KokkosAlgorithms_UnitTest_Cuda +test-rocm: KokkosAlgorithms_UnitTest_ROCm + ./KokkosAlgorithms_UnitTest_ROCm + test-threads: KokkosAlgorithms_UnitTest_Threads ./KokkosAlgorithms_UnitTest_Threads diff --git a/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp b/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp index 1e7ee68549..c2c118ce1a 100644 --- a/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp @@ -61,14 +61,19 @@ protected: { std::cout << std::setprecision(5) << std::scientific; - unsigned threads_count = omp_get_max_threads(); + int threads_count = 0; + #pragma omp parallel + { + #pragma omp atomic + ++threads_count; + } - if ( Kokkos::hwloc::available() ) { - threads_count = Kokkos::hwloc::get_available_numa_count() * - Kokkos::hwloc::get_available_cores_per_numa(); + if (threads_count > 3) { + threads_count /= 2; } Kokkos::OpenMP::initialize( threads_count ); + Kokkos::OpenMP::print_configuration( std::cout ); } static void TearDownTestCase() diff --git a/lib/kokkos/algorithms/unit_tests/TestROCm.cpp b/lib/kokkos/algorithms/unit_tests/TestROCm.cpp new file mode 100644 index 0000000000..720b377ed2 --- /dev/null +++ b/lib/kokkos/algorithms/unit_tests/TestROCm.cpp @@ -0,0 +1,112 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#ifdef KOKKOS_ENABLE_ROCM + +#include +#include +#include + +#include + +#include + +#include +#include + +namespace Test { + +class rocm : public ::testing::Test { +protected: + static void SetUpTestCase() + { + std::cout << std::setprecision(5) << std::scientific; + Kokkos::HostSpace::execution_space::initialize(); + Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice(0) ); + } + static void TearDownTestCase() + { + Kokkos::Experimental::ROCm::finalize(); + Kokkos::HostSpace::execution_space::finalize(); + } +}; + +void rocm_test_random_xorshift64( int num_draws ) +{ + Impl::test_random >(num_draws); +} + +void rocm_test_random_xorshift1024( int num_draws ) +{ + Impl::test_random >(num_draws); +} + + +#define ROCM_RANDOM_XORSHIFT64( num_draws ) \ + TEST_F( rocm, Random_XorShift64 ) { \ + rocm_test_random_xorshift64(num_draws); \ + } + +#define ROCM_RANDOM_XORSHIFT1024( num_draws ) \ + TEST_F( rocm, Random_XorShift1024 ) { \ + rocm_test_random_xorshift1024(num_draws); \ + } + +#define ROCM_SORT_UNSIGNED( size ) \ + TEST_F( rocm, SortUnsigned ) { \ + Impl::test_sort< Kokkos::Experimental::ROCm, unsigned >(size); \ + } + +ROCM_RANDOM_XORSHIFT64( 132141141 ) +ROCM_RANDOM_XORSHIFT1024( 52428813 ) +ROCM_SORT_UNSIGNED(171) + +#undef ROCM_RANDOM_XORSHIFT64 +#undef ROCM_RANDOM_XORSHIFT1024 +#undef ROCM_SORT_UNSIGNED +} +#else +void KOKKOS_ALGORITHMS_UNITTESTS_TESTROCM_PREVENT_LINK_ERROR() {} +#endif /* #ifdef KOKKOS_ENABLE_ROCM */ + diff --git a/lib/kokkos/algorithms/unit_tests/TestRandom.hpp b/lib/kokkos/algorithms/unit_tests/TestRandom.hpp index 9cf02f74b4..2771f1793d 100644 --- a/lib/kokkos/algorithms/unit_tests/TestRandom.hpp +++ b/lib/kokkos/algorithms/unit_tests/TestRandom.hpp @@ -1,12 +1,12 @@ //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -35,7 +35,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER @@ -283,12 +283,12 @@ struct test_random_scalar { RandomGenerator& pool, unsigned int num_draws) { - using std::cerr; + using std::cout; using std::endl; using Kokkos::parallel_reduce; { - cerr << " -- Testing randomness properties" << endl; + cout << " -- Testing randomness properties" << endl; RandomProperties result; typedef test_random_functor functor_type; @@ -307,7 +307,7 @@ struct test_random_scalar { ( 1.5*tolerance > variance_eps)) ? 1:0; pass_covar = ((-2.0*tolerance < covariance_eps) && ( 2.0*tolerance > covariance_eps)) ? 1:0; - cerr << "Pass: " << pass_mean + cout << "Pass: " << pass_mean << " " << pass_var << " " << mean_eps << " " << variance_eps @@ -315,7 +315,7 @@ struct test_random_scalar { << " || " << tolerance << endl; } { - cerr << " -- Testing 1-D histogram" << endl; + cout << " -- Testing 1-D histogram" << endl; RandomProperties result; typedef test_histogram1d_functor functor_type; @@ -335,7 +335,7 @@ struct test_random_scalar { pass_hist1d_covar = ((-0.06 < covariance_eps) && ( 0.06 > covariance_eps)) ? 1:0; - cerr << "Density 1D: " << mean_eps + cout << "Density 1D: " << mean_eps << " " << variance_eps << " " << (result.covariance/HIST_DIM1D/HIST_DIM1D) << " || " << tolerance @@ -348,7 +348,7 @@ struct test_random_scalar { << endl; } { - cerr << " -- Testing 3-D histogram" << endl; + cout << " -- Testing 3-D histogram" << endl; RandomProperties result; typedef test_histogram3d_functor functor_type; @@ -368,7 +368,7 @@ struct test_random_scalar { pass_hist3d_covar = ((-tolerance < covariance_eps) && ( tolerance > covariance_eps)) ? 1:0; - cerr << "Density 3D: " << mean_eps + cout << "Density 3D: " << mean_eps << " " << variance_eps << " " << result.covariance/HIST_DIM1D/HIST_DIM1D << " || " << tolerance @@ -381,18 +381,18 @@ struct test_random_scalar { template void test_random(unsigned int num_draws) { - using std::cerr; + using std::cout; using std::endl; typename test_random_functor::type_1d density_1d("D1d"); typename test_random_functor::type_3d density_3d("D3d"); uint64_t ticks = std::chrono::high_resolution_clock::now().time_since_epoch().count(); - cerr << "Test Seed:" << ticks << endl; + cout << "Test Seed:" << ticks << endl; RandomGenerator pool(ticks); - cerr << "Test Scalar=int" << endl; + cout << "Test Scalar=int" << endl; test_random_scalar test_int(density_1d,density_3d,pool,num_draws); ASSERT_EQ( test_int.pass_mean,1); ASSERT_EQ( test_int.pass_var,1); @@ -406,7 +406,7 @@ void test_random(unsigned int num_draws) deep_copy(density_1d,0); deep_copy(density_3d,0); - cerr << "Test Scalar=unsigned int" << endl; + cout << "Test Scalar=unsigned int" << endl; test_random_scalar test_uint(density_1d,density_3d,pool,num_draws); ASSERT_EQ( test_uint.pass_mean,1); ASSERT_EQ( test_uint.pass_var,1); @@ -420,7 +420,7 @@ void test_random(unsigned int num_draws) deep_copy(density_1d,0); deep_copy(density_3d,0); - cerr << "Test Scalar=int64_t" << endl; + cout << "Test Scalar=int64_t" << endl; test_random_scalar test_int64(density_1d,density_3d,pool,num_draws); ASSERT_EQ( test_int64.pass_mean,1); ASSERT_EQ( test_int64.pass_var,1); @@ -434,7 +434,7 @@ void test_random(unsigned int num_draws) deep_copy(density_1d,0); deep_copy(density_3d,0); - cerr << "Test Scalar=uint64_t" << endl; + cout << "Test Scalar=uint64_t" << endl; test_random_scalar test_uint64(density_1d,density_3d,pool,num_draws); ASSERT_EQ( test_uint64.pass_mean,1); ASSERT_EQ( test_uint64.pass_var,1); @@ -448,7 +448,7 @@ void test_random(unsigned int num_draws) deep_copy(density_1d,0); deep_copy(density_3d,0); - cerr << "Test Scalar=float" << endl; + cout << "Test Scalar=float" << endl; test_random_scalar test_float(density_1d,density_3d,pool,num_draws); ASSERT_EQ( test_float.pass_mean,1); ASSERT_EQ( test_float.pass_var,1); @@ -462,7 +462,7 @@ void test_random(unsigned int num_draws) deep_copy(density_1d,0); deep_copy(density_3d,0); - cerr << "Test Scalar=double" << endl; + cout << "Test Scalar=double" << endl; test_random_scalar test_double(density_1d,density_3d,pool,num_draws); ASSERT_EQ( test_double.pass_mean,1); ASSERT_EQ( test_double.pass_var,1); diff --git a/lib/kokkos/algorithms/unit_tests/TestSort.hpp b/lib/kokkos/algorithms/unit_tests/TestSort.hpp index 04be98f1cc..2cb0b89712 100644 --- a/lib/kokkos/algorithms/unit_tests/TestSort.hpp +++ b/lib/kokkos/algorithms/unit_tests/TestSort.hpp @@ -211,12 +211,15 @@ void test_dynamic_view_sort(unsigned int n ) const size_t upper_bound = 2 * n ; + const size_t total_alloc_size = n * sizeof(KeyType) * 1.2 ; + const size_t superblock_size = std::min(total_alloc_size, size_t(1000000)); + typename KeyDynamicViewType::memory_pool pool( memory_space() , n * sizeof(KeyType) * 1.2 , 500 /* min block size in bytes */ , 30000 /* max block size in bytes */ - , 1000000 /* min superblock size in bytes */ + , superblock_size ); KeyDynamicViewType keys("Keys",pool,upper_bound); @@ -271,8 +274,10 @@ void test_sort(unsigned int N) { test_1D_sort(N*N*N, true); test_1D_sort(N*N*N, false); +#if !defined(KOKKOS_ENABLE_ROCM) test_3D_sort(N); test_dynamic_view_sort(N*N); +#endif } } diff --git a/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp b/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp index f952ab3db5..9e75b580bc 100644 --- a/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp +++ b/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ diff --git a/lib/kokkos/benchmarks/atomic/Makefile b/lib/kokkos/benchmarks/atomic/Makefile new file mode 100644 index 0000000000..41875ee5e4 --- /dev/null +++ b/lib/kokkos/benchmarks/atomic/Makefile @@ -0,0 +1,44 @@ +KOKKOS_PATH = ${HOME}/kokkos +KOKKOS_DEVICES = "OpenMP" +KOKKOS_ARCH = "SNB" +EXE_NAME = "test" + +SRC = $(wildcard *.cpp) + +default: build + echo "Start Build" + + +ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) +CXX = ${KOKKOS_PATH}/config/nvcc_wrapper +EXE = ${EXE_NAME}.cuda +KOKKOS_CUDA_OPTIONS = "enable_lambda" +else +CXX = g++ +EXE = ${EXE_NAME}.host +endif + +CXXFLAGS = -O3 + +LINK = ${CXX} +LINKFLAGS = -O3 + +DEPFLAGS = -M + +OBJ = $(SRC:.cpp=.o) +LIB = + +include $(KOKKOS_PATH)/Makefile.kokkos + +build: $(EXE) + +$(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + +clean: kokkos-clean + rm -f *.o *.cuda *.host + +# Compilation rules + +%.o:%.cpp $(KOKKOS_CPP_DEPENDS) + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< diff --git a/lib/kokkos/benchmarks/atomic/main.cpp b/lib/kokkos/benchmarks/atomic/main.cpp new file mode 100644 index 0000000000..d86d196249 --- /dev/null +++ b/lib/kokkos/benchmarks/atomic/main.cpp @@ -0,0 +1,124 @@ +#include +#include +#include + +template +double test_atomic(int L, int N, int M,int K,int R,Kokkos::View offsets) { + Kokkos::View output("Output",N); + Kokkos::Impl::Timer timer; + + for(int r = 0; r +double test_no_atomic(int L, int N, int M,int K,int R,Kokkos::View offsets) { + Kokkos::View output("Output",N); + Kokkos::Impl::Timer timer; + for(int r = 0; r\n"); + printf("Example Input GPU:\n"); + printf(" Histogram : 1000000 1000 1 1000 1 10 1\n"); + printf(" MD Force : 100000 100000 100 1000 20 10 4\n"); + printf(" Matrix Assembly : 100000 1000000 50 1000 20 10 4\n"); + Kokkos::finalize(); + return 0; + } + + + int L = atoi(argv[1]); + int N = atoi(argv[2]); + int M = atoi(argv[3]); + int D = atoi(argv[4]); + int K = atoi(argv[5]); + int R = atoi(argv[6]); + int type = atoi(argv[7]); + + Kokkos::View offsets("Offsets",L,M); + Kokkos::Random_XorShift64_Pool<> pool(12371); + Kokkos::fill_random(offsets,pool,D); + double time = 0; + if(type==1) + time = test_atomic(L,N,M,K,R,offsets); + if(type==2) + time = test_atomic(L,N,M,K,R,offsets); + if(type==3) + time = test_atomic(L,N,M,K,R,offsets); + if(type==4) + time = test_atomic(L,N,M,K,R,offsets); + if(type==5) + time = test_atomic >(L,N,M,K,R,offsets); + + double time2 = 1; + if(type==1) + time2 = test_no_atomic(L,N,M,K,R,offsets); + if(type==2) + time2 = test_no_atomic(L,N,M,K,R,offsets); + if(type==3) + time2 = test_no_atomic(L,N,M,K,R,offsets); + if(type==4) + time2 = test_no_atomic(L,N,M,K,R,offsets); + if(type==5) + time2 = test_no_atomic >(L,N,M,K,R,offsets); + + int size = 0; + if(type==1) size = sizeof(int); + if(type==2) size = sizeof(long); + if(type==3) size = sizeof(float); + if(type==4) size = sizeof(double); + if(type==5) size = sizeof(Kokkos::complex); + + printf("%i\n",size); + printf("Time: %s %i %i %i %i %i %i (t_atomic: %e t_nonatomic: %e ratio: %lf )( GUpdates/s: %lf GB/s: %lf )\n", + (type==1)?"int": ( + (type==2)?"long": ( + (type==3)?"float": ( + (type==4)?"double":"complex"))), + L,N,M,D,K,R,time,time2,time/time2, + 1.e-9*L*R*M/time, 1.0*L*R*M*2*size/time/1024/1024/1024); +} + Kokkos::finalize(); +} + diff --git a/lib/kokkos/benchmarks/benchmark_suite/scripts/build_code.bash b/lib/kokkos/benchmarks/benchmark_suite/scripts/build_code.bash new file mode 100755 index 0000000000..0b885293e2 --- /dev/null +++ b/lib/kokkos/benchmarks/benchmark_suite/scripts/build_code.bash @@ -0,0 +1,84 @@ +#!/bin/bash + +# ---- Default Settings ----- + +# Paths +KOKKOS_PATH=${PWD}/kokkos +KOKKOS_KERNELS_PATH=${PWD}/kokkos-kernels +MINIMD_PATH=${PWD}/miniMD/kokkos +MINIFE_PATH=${PWD}/miniFE/kokkos + +# Kokkos Configure Options +KOKKOS_DEVICES=OpenMP +KOKKOS_ARCH=SNB + +# Compiler Options +CXX=mpicxx +OPT_FLAG="-O3" + +while [[ $# > 0 ]] +do + key="$1" + + case $key in + --kokkos-path*) + KOKKOS_PATH="${key#*=}" + ;; + --kokkos-kernels-path*) + KOKKOS_KERNELS_PATH="${key#*=}" + ;; + --minimd-path*) + MINIMD_PATH="${key#*=}" + ;; + --minife-path*) + MINIFE_PATH="${key#*=}" + ;; + --device-list*) + KOKKOS_DEVICES="${key#*=}" + ;; + --arch*) + KOKKOS_ARCH="--arch=${key#*=}" + ;; + --opt-flag*) + OPT_FLAG="${key#*=}" + ;; + --compiler*) + CXX="${key#*=}" + ;; + --with-cuda-options*) + KOKKOS_CUDA_OPTIONS="--with-cuda-options=${key#*=}" + ;; + --help*) + PRINT_HELP=True + ;; + *) + # args, just append + ARGS="$ARGS $1" + ;; + esac + + shift +done + +mkdir build + +# Build BytesAndFlops +mkdir build/bytes_and_flops +cd build/bytes_and_flops +make KOKKOS_ARCH=${KOKKOS_ARCH} KOKKOS_DEVICES=${KOKKOS_DEVICES} CXX=${CXX} KOKKOS_PATH=${KOKKOS_PATH}\ + CXXFLAGS=${OPT_FLAG} -f ${KOKKOS_PATH}/benchmarks/bytes_and_flops/Makefile -j 16 +cd ../.. + +mkdir build/miniMD +cd build/miniMD +make KOKKOS_ARCH=${KOKKOS_ARCH} KOKKOS_DEVICES=${KOKKOS_DEVICES} CXX=${CXX} KOKKOS_PATH=${KOKKOS_PATH} \ + CXXFLAGS=${OPT_FLAG} -f ${MINIMD_PATH}/Makefile -j 16 +cd ../../ + +mkdir build/miniFE +cd build/miniFE +make KOKKOS_ARCH=${KOKKOS_ARCH} KOKKOS_DEVICES=${KOKKOS_DEVICES} CXX=${CXX} KOKKOS_PATH=${KOKKOS_PATH} \ + CXXFLAGS=${OPT_FLAG} -f ${MINIFE_PATH}/src/Makefile -j 16 +cd ../../ + + diff --git a/lib/kokkos/benchmarks/benchmark_suite/scripts/checkout_repos.bash b/lib/kokkos/benchmarks/benchmark_suite/scripts/checkout_repos.bash new file mode 100755 index 0000000000..9b52a36d89 --- /dev/null +++ b/lib/kokkos/benchmarks/benchmark_suite/scripts/checkout_repos.bash @@ -0,0 +1,37 @@ +#!/bin/bash + +# Kokkos +if [ ! -d "kokkos" ]; then + git clone https://github.com/kokkos/kokkos +fi +cd kokkos +git checkout develop +git pull +cd .. + +# KokkosKernels +if [ ! -d "kokkos-kernels" ]; then +git clone https://github.com/kokkos/kokkos-kernels +fi +cd kokkos-kernels +git pull +cd .. + +# MiniMD +if [ ! -d "miniMD" ]; then + git clone https://github.com/mantevo/miniMD +fi +cd miniMD +git pull +cd .. + +# MiniFE +if [ ! -d "miniFE" ]; then + git clone https://github.com/mantevo/miniFE +fi +cd miniFE +git pull +cd .. + + + diff --git a/lib/kokkos/benchmarks/benchmark_suite/scripts/run_benchmark.bash b/lib/kokkos/benchmarks/benchmark_suite/scripts/run_benchmark.bash new file mode 100755 index 0000000000..6afa05f5fc --- /dev/null +++ b/lib/kokkos/benchmarks/benchmark_suite/scripts/run_benchmark.bash @@ -0,0 +1,14 @@ +#!/bin/bash +SCRIPT_PATH=$1 +KOKKOS_DEVICES=$2 +KOKKOS_ARCH=$3 +COMPILER=$4 +if [[ $# < 4 ]]; then + echo "Usage: ./run_benchmark.bash PATH_TO_SCRIPTS KOKKOS_DEVICES KOKKOS_ARCH COMPILER" +else + +${SCRIPT_PATH}/checkout_repos.bash +${SCRIPT_PATH}/build_code.bash --arch=${KOKKOS_ARCH} --device-list=${KOKKOS_DEVICES} --compiler=${COMPILER} +${SCRIPT_PATH}/run_tests.bash + +fi \ No newline at end of file diff --git a/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash b/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash new file mode 100755 index 0000000000..63aaca9e40 --- /dev/null +++ b/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash @@ -0,0 +1,44 @@ +#!/bin/bash + +# BytesAndFlops +cd build/bytes_and_flops + +USE_CUDA=`grep "_CUDA 1" KokkosCore_config.h | wc -l` + +if [[ ${USE_CUDA} > 0 ]]; then + BAF_EXE=bytes_and_flops.cuda + TEAM_SIZE=256 +else + BAF_EXE=bytes_and_flops.host + TEAM_SIZE=1 +fi + +BAF_PERF_1=`./${BAF_EXE} 2 100000 1024 1 1 1 1 ${TEAM_SIZE} 6000 | awk '{print $12/174.5}'` +BAF_PERF_2=`./${BAF_EXE} 2 100000 1024 16 1 8 64 ${TEAM_SIZE} 6000 | awk '{print $14/1142.65}'` + +echo "BytesAndFlops: ${BAF_PERF_1} ${BAF_PERF_2}" +cd ../.. + + +# MiniMD +cd build/miniMD +cp ../../miniMD/kokkos/Cu_u6.eam ./ +MD_PERF_1=`./miniMD --half_neigh 0 -s 60 --ntypes 1 -t ${OMP_NUM_THREADS} -i ../../miniMD/kokkos/in.eam.miniMD | grep PERF_SUMMARY | awk '{print $10/21163341}'` +MD_PERF_2=`./miniMD --half_neigh 0 -s 20 --ntypes 1 -t ${OMP_NUM_THREADS} -i ../../miniMD/kokkos/in.eam.miniMD | grep PERF_SUMMARY | awk '{print $10/13393417}'` + +echo "MiniMD: ${MD_PERF_1} ${MD_PERF_2}" +cd ../.. + +# MiniFE +cd build/miniFE +rm *.yaml +./miniFE.x -nx 100 &> /dev/null +FE_PERF_1=`grep "CG Mflop" *.yaml | awk '{print $4/14174}'` +rm *.yaml +./miniFE.x -nx 50 &> /dev/null +FE_PERF_2=`grep "CG Mflop" *.yaml | awk '{print $4/11897}'` +cd ../.. +echo "MiniFE: ${FE_PERF_1} ${FE_PERF_2}" + +PERF_RESULT=`echo "${BAF_PERF_1} ${BAF_PERF_2} ${MD_PERF_1} ${MD_PERF_2} ${FE_PERF_1} ${FE_PERF_2}" | awk '{print ($1+$2+$3+$4+$5+$6)/6}'` +echo "Total Result: " ${PERF_RESULT} \ No newline at end of file diff --git a/lib/kokkos/benchmarks/bytes_and_flops/Makefile b/lib/kokkos/benchmarks/bytes_and_flops/Makefile index 5ddf78f28e..6cbef56ff0 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/Makefile +++ b/lib/kokkos/benchmarks/bytes_and_flops/Makefile @@ -1,7 +1,18 @@ -KOKKOS_PATH = ${HOME}/kokkos -SRC = $(wildcard *.cpp) KOKKOS_DEVICES=Cuda KOKKOS_CUDA_OPTIONS=enable_lambda +KOKKOS_ARCH = "SNB,Kepler35" + + +MAKEFILE_PATH := $(subst Makefile,,$(abspath $(lastword $(MAKEFILE_LIST)))) + +ifndef KOKKOS_PATH + KOKKOS_PATH = $(MAKEFILE_PATH)../.. +endif + +SRC = $(wildcard $(MAKEFILE_PATH)*.cpp) +HEADERS = $(wildcard $(MAKEFILE_PATH)*.hpp) + +vpath %.cpp $(sort $(dir $(SRC))) default: build echo "Start Build" @@ -9,22 +20,19 @@ default: build ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper EXE = bytes_and_flops.cuda -KOKKOS_DEVICES = "Cuda,OpenMP" -KOKKOS_ARCH = "SNB,Kepler35" else CXX = g++ EXE = bytes_and_flops.host -KOKKOS_DEVICES = "OpenMP" -KOKKOS_ARCH = "SNB" endif -CXXFLAGS = -O3 -g +CXXFLAGS ?= -O3 -g +override CXXFLAGS += -I$(MAKEFILE_PATH) DEPFLAGS = -M LINK = ${CXX} LINKFLAGS = -OBJ = $(SRC:.cpp=.o) +OBJ = $(notdir $(SRC:.cpp=.o)) LIB = include $(KOKKOS_PATH)/Makefile.kokkos @@ -39,5 +47,5 @@ clean: kokkos-clean # Compilation rules -%.o:%.cpp $(KOKKOS_CPP_DEPENDS) bench.hpp bench_unroll_stride.hpp bench_stride.hpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< +%.o:%.cpp $(KOKKOS_CPP_DEPENDS) $(HEADERS) + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< -o $(notdir $@) diff --git a/lib/kokkos/benchmarks/bytes_and_flops/main.cpp b/lib/kokkos/benchmarks/bytes_and_flops/main.cpp index f545247212..8db5ce0eb5 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/main.cpp +++ b/lib/kokkos/benchmarks/bytes_and_flops/main.cpp @@ -44,12 +44,13 @@ #include #include #include +#include int main(int argc, char* argv[]) { Kokkos::initialize(); - - if(argc<10) { + + if(argc<10) { printf("Arguments: N K R D U F T S\n"); printf(" P: Precision (1==float, 2==double)\n"); printf(" N,K: dimensions of the 2D array to allocate\n"); @@ -68,7 +69,7 @@ int main(int argc, char* argv[]) { Kokkos::finalize(); return 0; } - + int P = atoi(argv[1]); int N = atoi(argv[2]); @@ -80,7 +81,7 @@ int main(int argc, char* argv[]) { int T = atoi(argv[8]); int S = atoi(argv[9]); - if(U>8) {printf("U must be 1-8\n"); return 0;} + if(U>8) {printf("U must be 1-8\n"); return 0;} if( (D!=1) && (D!=2) && (D!=4) && (D!=8) && (D!=16) && (D!=32)) {printf("D must be one of 1,2,4,8,16,32\n"); return 0;} if( (P!=1) && (P!=2) ) {printf("P must be one of 1,2\n"); return 0;} diff --git a/lib/kokkos/benchmarks/gather/main.cpp b/lib/kokkos/benchmarks/gather/main.cpp index 161c6f2091..88eb0493c1 100644 --- a/lib/kokkos/benchmarks/gather/main.cpp +++ b/lib/kokkos/benchmarks/gather/main.cpp @@ -44,11 +44,11 @@ #include #include #include +#include int main(int argc, char* argv[]) { Kokkos::initialize(argc,argv); - if(argc<8) { printf("Arguments: S N K D\n"); printf(" S: Scalar Type Size (1==float, 2==double, 4=complex)\n"); diff --git a/lib/kokkos/benchmarks/policy_performance/Makefile b/lib/kokkos/benchmarks/policy_performance/Makefile new file mode 100644 index 0000000000..13aef3209c --- /dev/null +++ b/lib/kokkos/benchmarks/policy_performance/Makefile @@ -0,0 +1,44 @@ +KOKKOS_PATH = ../.. +SRC = $(wildcard *.cpp) + +default: build + echo "Start Build" + +ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) +CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper +CXXFLAGS = -O3 -g +LINK = ${CXX} +LINKFLAGS = +EXE = policy_performance.cuda +KOKKOS_DEVICES = "Cuda,OpenMP" +KOKKOS_ARCH = "SNB,Kepler35" +KOKKOS_CUDA_OPTIONS+=enable_lambda +else +CXX = g++ +CXXFLAGS = -O3 -g -Wall -Werror +LINK = ${CXX} +LINKFLAGS = +EXE = policy_performance.host +KOKKOS_DEVICES = "OpenMP" +KOKKOS_ARCH = "SNB" +endif + +DEPFLAGS = -M + +OBJ = $(SRC:.cpp=.o) +LIB = + +include $(KOKKOS_PATH)/Makefile.kokkos + +build: $(EXE) + +$(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + +clean: kokkos-clean + rm -f *.o *.cuda *.host + +# Compilation rules + +%.o:%.cpp $(KOKKOS_CPP_DEPENDS) main.cpp policy_perf_test.hpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< diff --git a/lib/kokkos/benchmarks/policy_performance/main.cpp b/lib/kokkos/benchmarks/policy_performance/main.cpp new file mode 100644 index 0000000000..b0ed9bb512 --- /dev/null +++ b/lib/kokkos/benchmarks/policy_performance/main.cpp @@ -0,0 +1,170 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include "policy_perf_test.hpp" + +int main(int argc, char* argv[] ) { + Kokkos::initialize(argc,argv); + + if(argc<10) { + printf(" Ten arguments are needed to run this program:\n"); + printf(" (1)team_range, (2)thread_range, (3)vector_range, (4)outer_repeat, (5)thread_repeat, (6)vector_repeat, (7)team_size, (8)vector_size, (9)schedule, (10)test_type\n"); + printf(" team_range: number of teams (league_size)\n"); + printf(" thread_range: range for nested TeamThreadRange parallel_*\n"); + printf(" vector_range: range for nested ThreadVectorRange parallel_*\n"); + printf(" outer_repeat: number of repeats for outer parallel_* call\n"); + printf(" thread_repeat: number of repeats for TeamThreadRange parallel_* call\n"); + printf(" vector_repeat: number of repeats for ThreadVectorRange parallel_* call\n"); + printf(" team_size: number of team members (team_size)\n"); + printf(" vector_size: desired vectorization (if possible)\n"); + printf(" schedule: 1 == Static 2 == Dynamic\n"); + printf(" test_type: 3-digit code XYZ for testing (nested) parallel_*\n"); + printf(" code key: XYZ X in {1,2,3,4,5}, Y in {0,1,2}, Z in {0,1,2}\n"); + printf(" TeamPolicy:\n"); + printf(" X: 0 = none (never used, makes no sense); 1 = parallel_for; 2 = parallel_reduce\n"); + printf(" Y: 0 = none; 1 = parallel_for; 2 = parallel_reduce\n"); + printf(" Z: 0 = none; 1 = parallel_for; 2 = parallel_reduce\n"); + printf(" RangePolicy:\n"); + printf(" X: 3 = parallel_for; 4 = parallel_reduce; 5 = parallel_scan\n"); + printf(" Y: 0 = none\n"); + printf(" Z: 0 = none\n"); + printf(" Example Input:\n"); + printf(" 100000 32 32 100 100 100 8 1 1 100\n"); + Kokkos::finalize(); + return 0; + } + + int team_range = atoi(argv[1]); + int thread_range = atoi(argv[2]); + int vector_range = atoi(argv[3]); + + int outer_repeat = atoi(argv[4]); + int thread_repeat = atoi(argv[5]); + int vector_repeat = atoi(argv[6]); + + int team_size = atoi(argv[7]); + int vector_size = atoi(argv[8]); + int schedule = atoi(argv[9]); + int test_type = atoi(argv[10]); + + int disable_verbose_output = 0; + if ( argc > 11 ) { + disable_verbose_output = atoi(argv[11]); + } + + if ( schedule != 1 && schedule != 2 ) { + printf("schedule: %d\n", schedule); + printf("Options for schedule are: 1 == Static 2 == Dynamic\n"); + Kokkos::finalize(); + return -1; + } + + if ( test_type != 100 && test_type != 110 && test_type != 111 && test_type != 112 && test_type != 120 && test_type != 121 && test_type != 122 + && test_type != 200 && test_type != 210 && test_type != 211 && test_type != 212 && test_type != 220 && test_type != 221 && test_type != 222 + && test_type != 300 && test_type != 400 && test_type != 500 + ) + { + printf("Incorrect test_type option\n"); + Kokkos::finalize(); + return -2; + } + + double result = 0.0; + + Kokkos::parallel_reduce( "parallel_reduce warmup", Kokkos::TeamPolicy<>(10,1), + KOKKOS_LAMBDA(const Kokkos::TeamPolicy<>::member_type team, double& lval) { + lval += 1; + }, result); + + typedef Kokkos::View view_type_1d; + typedef Kokkos::View view_type_2d; + typedef Kokkos::View view_type_3d; + + // Allocate view without initializing + // Call a 'warmup' test with 1 repeat - this will initialize the corresponding view appropriately for test and should obey first-touch etc + // Second call to test is the one we actually care about and time + view_type_1d v_1( Kokkos::ViewAllocateWithoutInitializing("v_1"), team_range*team_size); + view_type_2d v_2( Kokkos::ViewAllocateWithoutInitializing("v_2"), team_range*team_size, thread_range); + view_type_3d v_3( Kokkos::ViewAllocateWithoutInitializing("v_3"), team_range*team_size, thread_range, vector_range); + + double result_computed = 0.0; + double result_expect = 0.0; + double time = 0.0; + + if(schedule==1) { + if ( test_type != 500 ) { + // warmup - no repeat of loops + test_policy,int>(team_range,thread_range,vector_range,1,1,1,team_size,vector_size,test_type,v_1,v_2,v_3,result_computed,result_expect,time); + test_policy,int>(team_range,thread_range,vector_range,outer_repeat,thread_repeat,vector_repeat,team_size,vector_size,test_type,v_1,v_2,v_3,result_computed,result_expect,time); + } + else { + // parallel_scan: initialize 1d view for parallel_scan + test_policy,int>(team_range,thread_range,vector_range,1,1,1,team_size,vector_size,100,v_1,v_2,v_3,result_computed,result_expect,time); + test_policy,int>(team_range,thread_range,vector_range,outer_repeat,thread_repeat,vector_repeat,team_size,vector_size,test_type,v_1,v_2,v_3,result_computed,result_expect,time); + } + } + if(schedule==2) { + if ( test_type != 500 ) { + // warmup - no repeat of loops + test_policy,int>(team_range,thread_range,vector_range,1,1,1,team_size,vector_size,test_type,v_1,v_2,v_3,result_computed,result_expect,time); + test_policy,int>(team_range,thread_range,vector_range,outer_repeat,thread_repeat,vector_repeat,team_size,vector_size,test_type,v_1,v_2,v_3,result_computed,result_expect,time); + } + else { + // parallel_scan: initialize 1d view for parallel_scan + test_policy,int>(team_range,thread_range,vector_range,1,1,1,team_size,vector_size,100,v_1,v_2,v_3,result_computed,result_expect,time); + test_policy,int>(team_range,thread_range,vector_range,outer_repeat,thread_repeat,vector_repeat,team_size,vector_size,test_type,v_1,v_2,v_3,result_computed,result_expect,time); + } + } + + if ( disable_verbose_output == 0 ) { + printf("%7i %4i %2i %9i %4i %4i %4i %2i %1i %3i %e %e %lf\n",team_range,thread_range,vector_range,outer_repeat,thread_repeat,vector_repeat,team_size,vector_size,schedule,test_type,result_computed,result_expect,time); + } + else { + printf("%lf\n",time); + } + + Kokkos::finalize(); + + return 0; +} diff --git a/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp b/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp new file mode 100644 index 0000000000..11576413e2 --- /dev/null +++ b/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp @@ -0,0 +1,355 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +template < class ViewType > +struct ParallelScanFunctor { + using value_type = double; + ViewType v; + + ParallelScanFunctor( const ViewType & v_ ) + : v(v_) + {} + + KOKKOS_INLINE_FUNCTION + void operator()( const int idx, value_type& val, const bool& final ) const + { + // inclusive scan + val += v(idx); + if ( final ) { + v(idx) = val; + } + } +}; + +template +void test_policy(int team_range, int thread_range, int vector_range, + int outer_repeat, int thread_repeat, int inner_repeat, + int team_size, int vector_size, int test_type, + ViewType1 &v1, ViewType2 &v2, ViewType3 &v3, + double &result, double &result_expect, double &time) { + + typedef Kokkos::TeamPolicy t_policy; + typedef typename t_policy::member_type t_team; + Kokkos::Timer timer; + + for(int orep = 0; orep(v1) +#if 0 + // This does not compile with pre Cuda 8.0 - see Github Issue #913 for explanation + KOKKOS_LAMBDA (const int idx, double& val, const bool& final) { + // inclusive scan + val += v1(idx); + if ( final ) { + v1(idx) = val; + } + } +#endif + ); + // result = v1( team_size*team_range - 1 ); // won't work with Cuda - need to copy result back to host to print + // result_expect = 0.5*(team_size*team_range)*(team_size*team_range-1); + } + + } // end outer for loop + + time = timer.seconds(); +} //end test_policy diff --git a/lib/kokkos/benchmarks/policy_performance/script_basic_testing.sh b/lib/kokkos/benchmarks/policy_performance/script_basic_testing.sh new file mode 100755 index 0000000000..e621fffbd4 --- /dev/null +++ b/lib/kokkos/benchmarks/policy_performance/script_basic_testing.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# Script to check policy_perf_test code works with each possible combo of options + +echo "Performance test results for parallel_reduce code computing sum of sequence [0,N) with various (nested) policies" + +EXECUTABLE=policy_performance + +TEAMRANGE=1000 +THREADRANGE=4 +VECTORRANGE=32 +TEAMSIZE=4 +VECTORSIZE=1 +OREPEAT=1 +MREPEAT=1 +IREPEAT=1 +SCHEDULE=1 + +SUFFIX=host +if [ -e $EXECUTABLE.$SUFFIX ] +then +SCHEDULE=1 +echo "Host tests Static schedule" +for CODE in {100,110,111,112,120,121,122,200,210,211,212,220,221,222,300,400,500} +do + OMP_PROC_BIND=true ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE +done + +SCHEDULE=2 +echo "Host tests Dynamic schedule" +for CODE in {100,110,111,112,120,121,122,200,210,211,212,220,221,222,300,400,500} +do + OMP_PROC_BIND=true ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE +done +fi + +SUFFIX=cuda +if [ -e $EXECUTABLE.$SUFFIX ] +then +SCHEDULE=1 +echo "Cuda tests Static schedule" +for CODE in {100,110,111,112,120,121,122,200,210,211,212,220,221,222,300,400,500} +do + ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE +done + +SCHEDULE=2 +echo "Cuda tests Dynamic schedule" +for CODE in {100,110,111,112,120,121,122,200,210,211,212,220,221,222,300,400,500} +do + ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE +done +fi diff --git a/lib/kokkos/benchmarks/policy_performance/script_sample_usage.sh b/lib/kokkos/benchmarks/policy_performance/script_sample_usage.sh new file mode 100755 index 0000000000..f4bfb87f8f --- /dev/null +++ b/lib/kokkos/benchmarks/policy_performance/script_sample_usage.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# Sample script for benchmarking policy performance + +# Suggested enviroment variables to export prior to executing script: +# KNL: +# OMP_NUM_THREADS=256 KMP_AFFINITY=compact +# Power: +# OMP_NUM_THREADS=64 OMP_PROC_BIND=true + +# Constants and Variables: +# Vary: TEAMSIZE, and THREADRANGE +# for TEAMSIZE in {1,2,4,5,8}; do +# for THREADRANGE in {32,41,1000}; do +# Fixed: TEAMRANGE, VECTORRANGE, VECTORSIZE +# System specific: Adjust REPEAT values to architecture tests are run on + +# Tests +# Static SCHEDULE = 1 +# Tier 1: parallel_for + RangePolicy 300 +# Tier 2: parallel_reduce, parallel_scan + RangePolicy 400 500 +# Tier 3: 'outer' parallel_for with TeamPolicy (nested parallelism) 1XY +# Tier 4: 'outer' parallel_reduce with TeamPolicy (nested parallelism) 2XY +# Dynamic SCHEDULE = 2 +# Tier 5: parallel_for + RangePolicy 300 +# Tier 6: parallel_reduce, parallel_scan + RangePolicy 400 500 +# Tier 7: 'outer' parallel_for with TeamPolicy (nested parallelism) 1XY +# Tier 8: 'outer' parallel_reduce with TeamPolicy (nested parallelism) 2XY + +# Results grouped by: +# 0) SCHEDULE 1) CODE (test) 2) TEAMRANGE 3) TEAMSIZE 4) THREADRANGE + +EXECUTABLE=policy_performance + +# Default defined values +TEAMRANGE=1000 +THREADRANGE=1 +VECTORRANGE=32 +TEAMSIZE=1 +VECTORSIZE=1 +OREPEAT=1 +MREPEAT=1 +IREPEAT=1 +SCHEDULE=1 + +# Host tests +SUFFIX=host +if [ -e $EXECUTABLE.$SUFFIX ]; then +echo "Host" + +for SCHEDULE in {1,2}; do + +# Tier 1 and 2, 5 and 6 +for CODE in {300,400,500}; do + for TEAMSIZE in {1,2,4,5,8}; do + OMP_PROC_BIND=true ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE + done +done + +# Tier 3, 7 +for CODE in {100,110,111,112,120,121,122}; do + for TEAMSIZE in {1,2,4,5,8}; do + for THREADRANGE in {32,41,1000}; do + OMP_PROC_BIND=true ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE + done + done +done + +# Tier 4, 8 +for CODE in {200,210,211,212,220,221,222}; do + for TEAMSIZE in {1,2,4,5,8}; do + for THREADRANGE in {32,41,1000}; do + OMP_PROC_BIND=true ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE + done + done +done + +done # end SCHEDULE + +fi # end host + + +# Cuda tests +SUFFIX=cuda +# TEAMRANGE=10000, TEAMSIZE=8 too large +# TEAMRANGE=10000, TEAMSIZE=8, THREADRANGE=1000 too large +if [ -e $EXECUTABLE.$SUFFIX ]; then +echo "Cuda" + +for SCHEDULE in {1,2}; do + +# Reset defaults +TEAMRANGE=1000 +THREADRANGE=1 +VECTORRANGE=32 +TEAMSIZE=1 +VECTORSIZE=1 + +# Tier 1 and 2, 5 and 6 +for CODE in {300,400,500}; do + for TEAMSIZE in {1,2,4,5,8}; do + ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE + done +done + +# Tier 3, 7 +for CODE in {100,110,111,112,120,121,122}; do + for TEAMSIZE in {1,2,4,5,8}; do + for THREADRANGE in {32,41,1000}; do + ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE + done + done +done + +# Tier 4, 8 +for CODE in {200,210,211,212,220,221,222}; do + for TEAMSIZE in {1,2,4,5,8}; do + for THREADRANGE in {32,41,1000}; do + ./$EXECUTABLE.$SUFFIX $TEAMRANGE $THREADRANGE $VECTORRANGE $OREPEAT $MREPEAT $IREPEAT $TEAMSIZE $VECTORSIZE $SCHEDULE $CODE + done + done +done + +done # end SCHEDULE + +fi #end cuda diff --git a/lib/kokkos/bin/hpcbind b/lib/kokkos/bin/hpcbind new file mode 100755 index 0000000000..92f9f81ac9 --- /dev/null +++ b/lib/kokkos/bin/hpcbind @@ -0,0 +1,614 @@ +#!/usr/bin/env bash + +################################################################################ +# Check if hwloc commands exist +################################################################################ +declare -i HPCBIND_HAS_HWLOC=1 +type hwloc-bind >/dev/null 2>&1 +HPCBIND_HAS_HWLOC=$((HPCBIND_HAS_HWLOC & ! $?)) + +type hwloc-distrib >/dev/null 2>&1 +HPCBIND_HAS_HWLOC=$((HPCBIND_HAS_HWLOC & ! $?)) + +type hwloc-ls >/dev/null 2>&1 +HPCBIND_HAS_HWLOC=$((HPCBIND_HAS_HWLOC & ! $?)) + +type hwloc-calc >/dev/null 2>&1 +HPCBIND_HAS_HWLOC=$((HPCBIND_HAS_HWLOC & ! $?)) + +type hwloc-ps >/dev/null 2>&1 +HPCBIND_HAS_HWLOC=$((HPCBIND_HAS_HWLOC & ! $?)) + +if [[ ${HPCBIND_HAS_HWLOC} -eq 0 ]]; then + echo "hwloc not found, no process binding will occur" +fi + +# Get parent cpuset +HPCBIND_HWLOC_PARENT_CPUSET="" +if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then + HPCBIND_HWLOC_VERSION="$(hwloc-ls --version | cut -d ' ' -f 2)" + MY_PID="$BASHPID" + HPCBIND_HWLOC_PARENT_CPUSET="$(hwloc-ps -a --cpuset | grep ${MY_PID} | cut -f 2)" +fi + +################################################################################ +# Check if nvidia-smi exist +################################################################################ +declare -i HPCBIND_HAS_NVIDIA=0 +type nvidia-smi >/dev/null 2>&1 +HPCBIND_HAS_NVIDIA=$((!$?)) + + +################################################################################ +# Get visible gpu +################################################################################ +declare -i NUM_GPUS=0 +HPCBIND_VISIBLE_GPUS="" +if [[ ${HPCBIND_HAS_NVIDIA} -eq 1 ]]; then + NUM_GPUS=$(nvidia-smi -L | wc -l); + HPCBIND_HAS_NVIDIA=$((!$?)) + if [[ ${HPCBIND_HAS_NVIDIA} -eq 1 ]]; then + GPU_LIST="$( seq 0 $((NUM_GPUS-1)) )" + HPCBIND_VISIBLE_GPUS=${CUDA_VISIBLE_DEVICES:-${GPU_LIST}} + fi +fi + +declare -i HPCBIND_ENABLE_GPU_MAPPING=$((NUM_GPUS > 0)) + + +################################################################################ +# Get queue id +# supports sbatch, bsub, aprun +################################################################################ +HPCBIND_QUEUE_NAME="" +declare -i HPCBIND_QUEUE_RANK=0 +declare -i HPCBIND_QUEUE_SIZE=0 +declare -i HPCBIND_QUEUE_MAPPING=0 + +if [[ ! -z "${PMI_RANK}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="mpich" + HPCBIND_QUEUE_RANK=${PMI_RANK} + HPCBIND_QUEUE_SIZE=${PMI_SIZE} +elif [[ ! -z "${OMPI_COMM_WORLD_RANK}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="openmpi" + HPCBIND_QUEUE_RANK=${OMPI_COMM_WORLD_RANK} + HPCBIND_QUEUE_SIZE=${OMPI_COMM_WORLD_SIZE} +elif [[ ! -z "${MV2_COMM_WORLD_RANK}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="mvapich2" + HPCBIND_QUEUE_RANK=${MV2_COMM_WORLD_RANK} + HPCBIND_QUEUE_SIZE=${MV2_COMM_WORLD_SIZE} +elif [[ ! -z "${SLURM_LOCAL_ID}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="slurm" + HPCBIND_QUEUE_RANK=${SLURM_PROCID} + HPCBIND_QUEUE_SIZE=${SLURM_NPROCS} +elif [[ ! -z "${ALPS_APP_PE}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="aprun" + HPCBIND_QUEUE_RANK=${ALPS_APP_PE} +elif [[ ! -z "${LBS_JOBINDEX}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="bsub" + HPCBIND_QUEUE_RANK=${LBS_JOBINDEX} +fi + +################################################################################ +# Show help +################################################################################ +function show_help { + local cmd=$(basename "$0") + echo "Usage: ${cmd} -- command ..." + echo " Set the process mask, OMP environment variables and CUDA environment" + echo " variables to sane values if possible. Uses hwloc and nvidia-smi if" + echo " available. Will preserve the current process binding, so it is safe" + echo " to use with a queuing system or mpiexec." + echo "" + echo "Options:" + echo " --no-hwloc-bind Disable binding" + echo " --proc-bind= Set the initial process mask for the script" + echo " LOC can be any valid location argument for" + echo " hwloc-calc Default: all" + echo " --whole-system ${cmd} will ignore the its parent process binding" + echo " --distribute=N Distribute the current cpuset into N partitions" + echo " --distribute-partition=I" + echo " Use the i'th partition (zero based)" + echo " --visible-gpus= Comma separated list of gpu ids" + echo " Default: CUDA_VISIBLE_DEVICES or all gpus in" + echo " sequential order" + echo " --ignore-queue Ignore queue job id when choosing visible GPU and partition" + echo " --no-gpu-mapping Do not set CUDA_VISIBLE_DEVICES" + echo " --openmp=M.m Set env variables for the given OpenMP version" + echo " Default: 4.0" + echo " --openmp-ratio=N/D Ratio of the cpuset to use for OpenMP" + echo " Default: 1" + echo " --openmp-places= Op=threads|cores|sockets. Default: threads" + echo " --no-openmp-proc-bind Set OMP_PROC_BIND to false and unset OMP_PLACES" + echo " --force-openmp-num-threads=N" + echo " Override logic for selecting OMP_NUM_THREADS" + echo " --force-openmp-proc-bind=" + echo " Override logic for selecting OMP_PROC_BIND" + echo " --no-openmp-nested Set OMP_NESTED to false" + echo " --output-prefix=

    Save the output to files of the form" + echo " P.hpcbind.N, P.stdout.N and P.stderr.N where P is " + echo " the prefix and N is the rank (no spaces)" + echo " --output-mode= How console output should be handled." + echo " Options are all, rank0, and none. Default: rank0" + echo " --lstopo Show bindings in lstopo" + echo " -v|--verbose Print bindings and relevant environment variables" + echo " -h|--help Show this message" + echo "" + echo "Sample Usage:" + echo "" + echo " Split the current process cpuset into 4 and use the 3rd partition" + echo " ${cmd} --distribute=4 --distribute-partition=2 -v -- command ..." + echo "" + echo " Launch 16 jobs over 4 nodes with 4 jobs per node using only the even pus" + echo " and save the output to rank specific files" + echo " mpiexec -N 16 -npernode 4 ${cmd} --whole-system --proc-bind=pu:even \\" + echo " --distribute=4 -v --output-prefix=output -- command ..." + echo "" + echo " Bind the process to all even cores" + echo " ${cmd} --proc-bind=core:even -v -- command ..." + echo "" + echo " Bind the the even cores of socket 0 and the odd cores of socket 1" + echo " ${cmd} --proc-bind='socket:0.core:even socket:1.core:odd' -v -- command ..." + echo "" + echo " Skip GPU 0 when mapping visible devices" + echo " ${cmd} --distribute=4 --distribute-partition=0 --visible-gpus=1,2 -v -- command ..." + echo "" + echo " Display the current bindings" + echo " ${cmd} --proc-bind=numa:0 -- command" + echo "" + echo " Display the current bindings using lstopo" + echo " ${cmd} --proc-bind=numa:0.core:odd --lstopo" + echo "" +} + + +################################################################################ +# Parse command line arguments +################################################################################ +# Show help if no command line arguments given +if [[ "$#" -eq 0 ]]; then + show_help + exit 0 +fi + +declare -a UNKNOWN_ARGS=() +declare -i HPCBIND_ENABLE_HWLOC_BIND=${HPCBIND_HAS_HWLOC} +declare -i HPCBIND_DISTRIBUTE=1 +declare -i HPCBIND_PARTITION=-1 +HPCBIND_PROC_BIND="all" +HPCBIND_OPENMP_VERSION=4.0 +declare -i HPCBIND_OPENMP_RATIO_NUMERATOR=1 +declare -i HPCBIND_OPENMP_RATIO_DENOMINATOR=1 +HPCBIND_OPENMP_PLACES=${OMP_PLACES:-threads} +declare -i HPCBIND_OPENMP_PROC_BIND=1 +HPCBIND_OPENMP_FORCE_NUM_THREADS="" +HPCBIND_OPENMP_FORCE_PROC_BIND="" +declare -i HPCBIND_OPENMP_NESTED=1 +declare -i HPCBIND_VERBOSE=0 + +declare -i HPCBIND_LSTOPO=0 + +HPCBIND_OUTPUT_PREFIX="" +HPCBIND_OUTPUT_MODE="rank0" + +declare -i HPCBIND_HAS_COMMAND=0 + +for i in "$@"; do + case "$i" in + # number of partitions to create + --no-hwloc-bind) + HPCBIND_ENABLE_HWLOC_BIND=0 + shift + ;; + --proc-bind=*) + HPCBIND_PROC_BIND="${i#*=}" + shift + ;; + --whole-system) + HPCBIND_HWLOC_PARENT_CPUSET="" + shift + ;; + --distribute=*) + HPCBIND_DISTRIBUTE="${i#*=}" + if [[ ${HPCBIND_DISTRIBUTE} -le 0 ]]; then + HPCBIND_DISTRIBUTE=1 + fi + shift + ;; + # which partition to use + --distribute-partition=*) + HPCBIND_PARTITION="${i#*=}" + shift + ;; + --visible-gpus=*) + HPCBIND_VISIBLE_GPUS=$(echo "${i#*=}" | tr ',' ' ') + shift + ;; + --ignore-queue) + HPCBIND_QUEUE_MAPPING=0 + shift + ;; + --no-gpu-mapping) + HPCBIND_ENABLE_GPU_MAPPING=0 + shift + ;; + --openmp=*) + HPCBIND_OPENMP_VERSION="${i#*=}" + shift + ;; + --openmp-ratio=*) + IFS=/ read HPCBIND_OPENMP_RATIO_NUMERATOR HPCBIND_OPENMP_RATIO_DENOMINATOR <<< "${i#*=}" + if [[ ${HPCBIND_OPENMP_RATIO_NUMERATOR} -le 0 ]]; then + HPCBIND_OPENMP_RATIO_NUMERATOR=1 + fi + if [[ ${HPCBIND_OPENMP_RATIO_DENOMINATOR} -le 0 ]]; then + HPCBIND_OPENMP_RATIO_DENOMINATOR=1 + fi + if [[ ${HPCBIND_OPENMP_RATIO_NUMERATOR} -gt ${HPCBIND_OPENMP_RATIO_DENOMINATOR} ]]; then + HPCBIND_OPENMP_RATIO_NUMERATOR=1 + HPCBIND_OPENMP_RATIO_DENOMINATOR=1 + fi + shift + ;; + --openmp-places=*) + HPCBIND_OPENMP_PLACES="${i#*=}" + shift + ;; + --no-openmp-proc-bind) + HPCBIND_OPENMP_PROC_BIND=0 + shift + ;; + --force-openmp-proc-bind=*) + HPCBIND_OPENMP_FORCE_PROC_BIND="${i#*=}" + shift + ;; + --force-openmp-num-threads=*) + HPCBIND_OPENMP_FORCE_NUM_THREADS="${i#*=}" + shift + ;; + --no-openmp-nested) + HPCBIND_OPENMP_NESTED=0 + shift + ;; + --output-prefix=*) + HPCBIND_OUTPUT_PREFIX="${i#*=}" + shift + ;; + --output-mode=*) + HPCBIND_OUTPUT_MODE="${i#*=}" + #convert to lower case + HPCBIND_OUTPUT_MODE="${HPCBIND_OUTPUT_MODE,,}" + shift + ;; + --lstopo) + HPCBIND_VERBOSE=1 + HPCBIND_LSTOPO=1 + shift + ;; + -v|--verbose) + HPCBIND_VERBOSE=1 + shift + ;; + -h|--help) + show_help + exit 0 + ;; + # ignore remaining arguments + --) + HPCBIND_HAS_COMMAND=1 + shift + break + ;; + # unknown option + *) + UNKNOWN_ARGS+=("$i") + shift + ;; + esac +done + +################################################################################ +# Check output mode +################################################################################ +declare -i HPCBIND_TEE=0 + +if [[ "${HPCBIND_OUTPUT_MODE}" == "none" ]]; then + HPCBIND_TEE=0 +elif [[ "${HPCBIND_OUTPUT_MODE}" == "all" ]]; then + HPCBIND_TEE=1 +elif [[ ${HPCBIND_QUEUE_RANK} -eq 0 ]]; then + #default to rank0 printing to screen + HPCBIND_TEE=1 +fi + + +if [[ "${HPCBIND_OUTPUT_PREFIX}" == "" ]]; then + HPCBIND_LOG=/dev/null + HPCBIND_ERR=/dev/null + HPCBIND_OUT=/dev/null +else + if [[ ${HPCBIND_QUEUE_SIZE} -gt 0 ]]; then + HPCBIND_STR_QUEUE_SIZE="${HPCBIND_QUEUE_SIZE}" + HPCBIND_STR_QUEUE_RANK=$(printf %0*d ${#HPCBIND_STR_QUEUE_SIZE} ${HPCBIND_QUEUE_RANK}) + + HPCBIND_LOG="${HPCBIND_OUTPUT_PREFIX}.hpcbind.${HPCBIND_STR_QUEUE_RANK}" + HPCBIND_ERR="${HPCBIND_OUTPUT_PREFIX}.stderr.${HPCBIND_STR_QUEUE_RANK}" + HPCBIND_OUT="${HPCBIND_OUTPUT_PREFIX}.stdout.${HPCBIND_STR_QUEUE_RANK}" + else + HPCBIND_LOG="${HPCBIND_OUTPUT_PREFIX}.hpcbind.${HPCBIND_QUEUE_RANK}" + HPCBIND_ERR="${HPCBIND_OUTPUT_PREFIX}.stderr.${HPCBIND_QUEUE_RANK}" + HPCBIND_OUT="${HPCBIND_OUTPUT_PREFIX}.stdout.${HPCBIND_QUEUE_RANK}" + fi + > ${HPCBIND_LOG} +fi + + +################################################################################ +# Check unknown arguments +################################################################################ +if [[ ${#UNKNOWN_ARGS[*]} > 0 ]]; then + echo "HPCBIND Uknown options: ${UNKNOWN_ARGS[*]}" > >(tee -a ${HPCBIND_LOG}) + exit 1 +fi + +################################################################################ +# Check that visible gpus are valid +################################################################################ +HPCBIND_VISIBLE_GPUS=(${HPCBIND_VISIBLE_GPUS}) +if [[ ${HPCBIND_ENABLE_GPU_MAPPING} -eq 1 ]]; then + for ((i=0; i < ${#HPCBIND_VISIBLE_GPUS[*]}; i++)); do + if [[ ${HPCBIND_VISIBLE_GPUS[$i]} -ge ${NUM_GPUS} || + ${HPCBIND_VISIBLE_GPUS[$i]} -lt 0 ]]; then + echo "HPCBIND Invaild GPU ID ${HPCBIND_VISIBLE_GPUS[$i]} (setting to 0)" > >(tee -a ${HPCBIND_LOG}) + HPCBIND_VISIBLE_GPUS[$i]=0; + fi + done + NUM_GPUS=${#HPCBIND_VISIBLE_GPUS[@]} +fi + + +################################################################################ +#choose the correct partition +################################################################################ +if [[ ${HPCBIND_PARTITION} -lt 0 && ${HPCBIND_QUEUE_MAPPING} -eq 1 ]]; then + HPCBIND_PARTITION=${HPCBIND_QUEUE_RANK} +elif [[ ${HPCBIND_PARTITION} -lt 0 ]]; then + HPCBIND_PARTITION=0 +fi + +if [[ ${HPCBIND_PARTITION} -ge ${HPCBIND_DISTRIBUTE} ]]; then + HPCBIND_PARTITION=$((HPCBIND_PARTITION % HPCBIND_DISTRIBUTE)) +fi + +################################################################################ +# Find cpuset and num threads +################################################################################ +HPCBIND_HWLOC_CPUSET="" +declare -i HPCBIND_NUM_PUS=0 + +if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 ]]; then + if [[ "${HPCBIND_HWLOC_PARENT_CPUSET}" == "" ]]; then + BINDING=$(hwloc-calc ${HPCBIND_PROC_BIND[*]}) + else + BINDING=$(hwloc-calc --restrict ${HPCBIND_HWLOC_PARENT_CPUSET} ${HPCBIND_PROC_BIND[*]}) + fi + + if [[ ${HPCBIND_DISTRIBUTE} -gt 1 ]]; then + CPUSETS=($(hwloc-distrib --restrict ${BINDING} --at core ${HPCBIND_DISTRIBUTE})) + HPCBIND_HWLOC_CPUSET="${CPUSETS[${HPCBIND_PARTITION}]}" + else + HPCBIND_HWLOC_CPUSET="${BINDING}" + fi + HPCBIND_NUM_PUS=$(hwloc-calc -q -N pu ${HPCBIND_HWLOC_CPUSET} ) + if [ $? -ne 0 ]; then + HPCBIND_NUM_PUS=1 + fi + HPCBIND_NUM_CORES=$(hwloc-calc -q -N core ${HPCBIND_HWLOC_CPUSET} ) + if [ $? -ne 0 ]; then + HPCBIND_NUM_CORES=1 + fi + HPCBIND_NUM_NUMAS=$(hwloc-calc -q -N numa ${HPCBIND_HWLOC_CPUSET} ) + if [ $? -ne 0 ]; then + HPCBIND_NUM_NUMAS=1 + fi + HPCBIND_NUM_SOCKETS=$(hwloc-calc -q -N socket ${HPCBIND_HWLOC_CPUSET} ) + if [ $? -ne 0 ]; then + HPCBIND_NUM_SOCKETS=1 + fi +else + HPCBIND_NUM_PUS=$(cat /proc/cpuinfo | grep -c processor) + HPCBIND_NUM_CORES=${HPCBIND_NUM_PUS} + HPCBIND_NUM_NUMAS=1 + HPCBIND_NUM_SOCKETS=1 +fi + + +if [[ ${HPCBIND_OPENMP_FORCE_NUM_THREADS} != "" ]]; then + HPCBIND_OPENMP_NUM_THREADS=${HPCBIND_OPENMP_FORCE_NUM_THREADS} +else + declare -i HPCBIND_OPENMP_NUM_THREADS=$((HPCBIND_NUM_PUS * HPCBIND_OPENMP_RATIO_NUMERATOR / HPCBIND_OPENMP_RATIO_DENOMINATOR)) + + if [[ ${HPCBIND_OPENMP_NUM_THREADS} -lt 1 ]]; then + HPCBIND_OPENMP_NUM_THREADS=1 + elif [[ ${HPCBIND_OPENMP_NUM_THREADS} -gt ${HPCBIND_NUM_PUS} ]]; then + HPCBIND_OPENMP_NUM_THREADS=${HPCBIND_NUM_PUS} + fi +fi + +################################################################################ +# Set OpenMP environment variables +################################################################################ + +# set OMP_NUM_THREADS +if [[ ${HPCBIND_OPENMP_NESTED} -eq 1 ]]; then + export OMP_NUM_THREADS="${HPCBIND_OPENMP_NUM_THREADS},1" +else + export OMP_NUM_THREADS=${HPCBIND_OPENMP_NUM_THREADS} +fi + +# set OMP_PROC_BIND and OMP_PLACES +if [[ ${HPCBIND_OPENMP_PROC_BIND} -eq 1 ]]; then + if [[ "${HPCBIND_OPENMP_FORCE_PROC_BIND}" == "" ]]; then + #default proc bind logic + if [[ "${HPCBIND_OPENMP_VERSION}" == "4.0" || "${HPCBIND_OPENMP_VERSION}" > "4.0" ]]; then + export OMP_PLACES="${HPCBIND_OPENMP_PLACES}" + if [[ ${HPCBIND_OPENMP_NESTED} -eq 1 ]]; then + export OMP_PROC_BIND="spread,spread" + else + export OMP_PROC_BIND="spread" + fi + else + export OMP_PROC_BIND="true" + unset OMP_PLACES + fi + else + #force proc bind + export OMP_PLACES="${HPCBIND_OPENMP_PLACES}" + export OMP_PROC_BIND="${HPCBIND_OPENMP_FORCE_PROC_BIND}" + fi +else + # no openmp proc bind + unset OMP_PLACES + unset OMP_PROC_BIND +fi + +# set up hot teams (intel specific) +if [[ ${HPCBIND_OPENMP_NESTED} -eq 1 ]]; then + export OMP_NESTED="true" + export OMP_MAX_ACTIVE_LEVELS=2 + export KMP_HOT_TEAMS=1 + export KMP_HOT_TEAMS_MAX_LEVEL=2 +else + export OMP_NESTED="false" +fi + +# set OMP_NESTED + +################################################################################ +# Set CUDA environment variables +################################################################################ + +if [[ ${HPCBIND_ENABLE_GPU_MAPPING} -eq 1 ]]; then + if [[ ${HPCBIND_QUEUE_MAPPING} -eq 0 ]]; then + declare -i GPU_ID=$((HPCBIND_PARTITION % NUM_GPUS)) + export CUDA_VISIBLE_DEVICES="${HPCBIND_VISIBLE_GPUS[${GPU_ID}]}" + else + declare -i MY_TASK_ID=$((HPCBIND_QUEUE_RANK * HPCBIND_DISTRIBUTE + HPCBIND_PARTITION)) + declare -i GPU_ID=$((MY_TASK_ID % NUM_GPUS)) + export CUDA_VISIBLE_DEVICES="${HPCBIND_VISIBLE_GPUS[${GPU_ID}]}" + fi +fi + +################################################################################ +# Set hpcbind environment variables +################################################################################ +export HPCBIND_HWLOC_VERSION=${HPCBIND_HWLOC_VERSION} +export HPCBIND_HAS_HWLOC=${HPCBIND_HAS_HWLOC} +export HPCBIND_HAS_NVIDIA=${HPCBIND_HAS_NVIDIA} +export HPCBIND_NUM_PUS=${HPCBIND_NUM_PUS} +export HPCBIND_NUM_CORES=${HPCBIND_NUM_CORES} +export HPCBIND_NUM_NUMAS=${HPCBIND_NUM_NUMAS} +export HPCBIND_NUM_SOCKETS=${HPCBIND_NUM_SOCKETS} +export HPCBIND_HWLOC_CPUSET="${HPCBIND_HWLOC_CPUSET}" +export HPCBIND_HWLOC_DISTRIBUTE=${HPCBIND_DISTRIBUTE} +export HPCBIND_HWLOC_DISTRIBUTE_PARTITION=${HPCBIND_PARTITION} +export HPCBIND_OPENMP_RATIO="${HPCBIND_OPENMP_RATIO_NUMERATOR}/${HPCBIND_OPENMP_RATIO_DENOMINATOR}" +if [[ "${HPCBIND_HWLOC_PARENT_CPUSET}" == "" ]]; then + export HPCBIND_HWLOC_PARENT_CPUSET="all" +else + export HPCBIND_HWLOC_PARENT_CPUSET="${HPCBIND_HWLOC_PARENT_CPUSET}" +fi +export HPCBIND_HWLOC_PROC_BIND="${HPCBIND_PROC_BIND}" +export HPCBIND_NVIDIA_ENABLE_GPU_MAPPING=${HPCBIND_ENABLE_GPU_MAPPING} +export HPCBIND_NVIDIA_VISIBLE_GPUS=$(echo "${HPCBIND_VISIBLE_GPUS[*]}" | tr ' ' ',') +export HPCBIND_OPENMP_VERSION="${HPCBIND_OPENMP_VERSION}" +if [[ "${HPCBIND_QUEUE_NAME}" != "" ]]; then + export HPCBIND_QUEUE_RANK=${HPCBIND_QUEUE_RANK} + export HPCBIND_QUEUE_SIZE=${HPCBIND_QUEUE_SIZE} + export HPCBIND_QUEUE_NAME="${HPCBIND_QUEUE_NAME}" + export HPCBIND_QUEUE_MAPPING=${HPCBIND_QUEUE_MAPPING} +fi + + +################################################################################ +# Print verbose +################################################################################ + +TMP_ENV=$(env | sort) +if [[ ${HPCBIND_TEE} -eq 0 || ${HPCBIND_VERBOSE} -eq 0 ]]; then + echo "[HOST]" >> ${HPCBIND_LOG} + hostname -s >> ${HPCBIND_LOG} + echo "[HPCBIND]" >> ${HPCBIND_LOG} + echo "${TMP_ENV}" | grep -E "^HPCBIND_" >> ${HPCBIND_LOG} + echo "[CUDA]" >> ${HPCBIND_LOG} + echo "${TMP_ENV}" | grep -E "^CUDA_" >> ${HPCBIND_LOG} + echo "[OPENMP]" >> ${HPCBIND_LOG} + echo "${TMP_ENV}" | grep -E "^OMP_" >> ${HPCBIND_LOG} + echo "[GOMP] (gcc, g++, and gfortran)" >> ${HPCBIND_LOG} + echo "${TMP_ENV}" | grep -E "^GOMP_" >> ${HPCBIND_LOG} + echo "[KMP] (icc, icpc, and ifort)" >> ${HPCBIND_LOG} + echo "${TMP_ENV}" | grep -E "^KMP_" >> ${HPCBIND_LOG} + echo "[XLSMPOPTS] (xlc, xlc++, and xlf)" >> ${HPCBIND_LOG} + echo "${TMP_ENV}" | grep -E "^XLSMPOPTS" >> ${HPCBIND_LOG} + + if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then + echo "[BINDINGS]" >> ${HPCBIND_LOG} + hwloc-ls --restrict "${HPCBIND_HWLOC_CPUSET}" >> ${HPCBIND_LOG} + else + echo "Unable to show bindings, hwloc not available." >> ${HPCBIND_LOG} + fi +else + echo "[HOST]" > >(tee -a ${HPCBIND_LOG}) + hostname -s > >(tee -a ${HPCBIND_LOG}) + echo "[HPCBIND]" > >(tee -a ${HPCBIND_LOG}) + echo "${TMP_ENV}" | grep -E "^HPCBIND_" > >(tee -a ${HPCBIND_LOG}) + echo "[CUDA]" > >(tee -a ${HPCBIND_LOG}) + echo "${TMP_ENV}" | grep -E "^CUDA_" > >(tee -a ${HPCBIND_LOG}) + echo "[OPENMP]" > >(tee -a ${HPCBIND_LOG}) + echo "${TMP_ENV}" | grep -E "^OMP_" > >(tee -a ${HPCBIND_LOG}) + echo "[GOMP] (gcc, g++, and gfortran)" > >(tee -a ${HPCBIND_LOG}) + echo "${TMP_ENV}" | grep -E "^GOMP_" > >(tee -a ${HPCBIND_LOG}) + echo "[KMP] (icc, icpc, and ifort)" > >(tee -a ${HPCBIND_LOG}) + echo "${TMP_ENV}" | grep -E "^KMP_" > >(tee -a ${HPCBIND_LOG}) + echo "[XLSMPOPTS] (xlc, xlc++, and xlf)" > >(tee -a ${HPCBIND_LOG}) + echo "${TMP_ENV}" | grep -E "^XLSMPOPTS" > >(tee -a ${HPCBIND_LOG}) + + if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then + echo "[BINDINGS]" > >(tee -a ${HPCBIND_LOG}) + hwloc-ls --restrict "${HPCBIND_HWLOC_CPUSET}" --no-io --no-bridges > >(tee -a ${HPCBIND_LOG}) + else + echo "Unable to show bindings, hwloc not available." > >(tee -a ${HPCBIND_LOG}) + fi +fi + +################################################################################ +# Run command +################################################################################ + +# must be the last executed command so that the return value is correct +if [[ ${HPCBIND_LSTOPO} -eq 1 && ${HPCBIND_HAS_HWLOC} -eq 1 && ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 && ! -z ${DISPLAY} ]]; then + hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- lstopo --pid 0 +elif [[ ${HPCBIND_HAS_COMMAND} -eq 1 ]]; then + # clear output files + > ${HPCBIND_ERR} + > ${HPCBIND_OUT} + if [[ ${HPCBIND_TEE} -eq 0 ]]; then + if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 ]]; then + hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- $@ > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} + else + eval $@ > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} + fi + else + if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 ]]; then + hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- $@ > >(tee ${HPCBIND_OUT}) 2> >(tee ${HPCBIND_ERR} >&2) + else + eval $@ > >(tee ${HPCBIND_OUT}) 2> >(tee ${HPCBIND_ERR} >&2) + fi + fi +fi diff --git a/lib/kokkos/bin/nvcc_wrapper b/lib/kokkos/bin/nvcc_wrapper index 09fa5d500a..d339da4fcd 100755 --- a/lib/kokkos/bin/nvcc_wrapper +++ b/lib/kokkos/bin/nvcc_wrapper @@ -39,6 +39,12 @@ cuda_args="" # Arguments for both NVCC and Host compiler shared_args="" +# Argument -c +compile_arg="" + +# Argument -o +output_arg="" + # Linker arguments xlinker_args="" @@ -66,6 +72,7 @@ dry_run=0 # Skip NVCC compilation and use host compiler directly host_only=0 +host_only_args="" # Enable workaround for CUDA 6.5 for pragma ident replace_pragma_ident=0 @@ -78,6 +85,14 @@ temp_dir=${TMPDIR:-/tmp} # Check if we have an optimization argument already optimization_applied=0 +# Check if we have -std=c++X or --std=c++X already +stdcxx_applied=0 + +# Run nvcc a second time to generate dependencies if needed +depfile_separate=0 +depfile_output_arg="" +depfile_target_arg="" + #echo "Arguments: $# $@" while [ $# -gt 0 ] @@ -109,12 +124,31 @@ do fi ;; #Handle shared args (valid for both nvcc and the host compiler) - -D*|-c|-I*|-L*|-l*|-g|--help|--version|-E|-M|-shared) + -D*|-I*|-L*|-l*|-g|--help|--version|-E|-M|-shared) shared_args="$shared_args $1" ;; - #Handle shared args that have an argument - -o|-MT) - shared_args="$shared_args $1 $2" + #Handle compilation argument + -c) + compile_arg="$1" + ;; + #Handle output argument + -o) + output_arg="$output_arg $1 $2" + shift + ;; + # Handle depfile arguments. We map them to a separate call to nvcc. + -MD|-MMD) + depfile_separate=1 + host_only_args="$host_only_args $1" + ;; + -MF) + depfile_output_arg="-o $2" + host_only_args="$host_only_args $1 $2" + shift + ;; + -MT) + depfile_target_arg="$1 $2" + host_only_args="$host_only_args $1 $2" shift ;; #Handle known nvcc args @@ -130,10 +164,16 @@ do cuda_args="$cuda_args $1 $2" shift ;; - #Handle c++11 setting - --std=c++11|-std=c++11) - shared_args="$shared_args $1" + #Handle c++11 + --std=c++11|-std=c++11|--std=c++14|-std=c++14|--std=c++1z|-std=c++1z) + if [ $stdcxx_applied -eq 1 ]; then + echo "nvcc_wrapper - *warning* you have set multiple optimization flags (-std=c++1* or --std=c++1*), only the first is used because nvcc can only accept a single std setting" + else + shared_args="$shared_args $1" + stdcxx_applied=1 + fi ;; + #strip of -std=c++98 due to nvcc warnings and Tribits will place both -std=c++11 and -std=c++98 -std=c++98|--std=c++98) ;; @@ -233,7 +273,7 @@ if [ $first_xcompiler_arg -eq 0 ]; then fi #Compose host only command -host_command="$host_compiler $shared_args $xcompiler_args $host_linker_args $shared_versioned_libraries_host" +host_command="$host_compiler $shared_args $host_only_args $compile_arg $output_arg $xcompiler_args $host_linker_args $shared_versioned_libraries_host" #nvcc does not accept '#pragma ident SOME_MACRO_STRING' but it does accept '#ident SOME_MACRO_STRING' if [ $replace_pragma_ident -eq 1 ]; then @@ -265,10 +305,21 @@ else host_command="$host_command $object_files" fi +if [ $depfile_separate -eq 1 ]; then + # run nvcc a second time to generate dependencies (without compiling) + nvcc_depfile_command="$nvcc_command -M $depfile_target_arg $depfile_output_arg" +else + nvcc_depfile_command="" +fi + +nvcc_command="$nvcc_command $compile_arg $output_arg" + #Print command for dryrun if [ $dry_run -eq 1 ]; then if [ $host_only -eq 1 ]; then echo $host_command + elif [ -n "$nvcc_depfile_command" ]; then + echo $nvcc_command "&&" $nvcc_depfile_command else echo $nvcc_command fi @@ -278,6 +329,8 @@ fi #Run compilation command if [ $host_only -eq 1 ]; then $host_command +elif [ -n "$nvcc_depfile_command" ]; then + $nvcc_command && $nvcc_depfile_command else $nvcc_command fi diff --git a/lib/kokkos/bin/runtest b/lib/kokkos/bin/runtest new file mode 100755 index 0000000000..92411fe5ba --- /dev/null +++ b/lib/kokkos/bin/runtest @@ -0,0 +1,165 @@ +#!/usr/bin/env bash + +function get_path() { + cd "$(dirname "$0")" + cd .. + echo "$(pwd -P)" +} + +KOKKOS_PATH="$(get_path "$0")" + +function show_help() { + local cmd=$(basename "$0") + echo "Usage: ${cmd} " + echo " Build and run the tests" + echo "" + echo "Options:" + echo " -j=N|--make-j=N Build the tests in parallel" + echo " -c|--clean Clean build and regenerate make files" + echo " --clean-on-pass Clean build when runtest passes" + echo " --output-prefix=

      Prefix of log files  Default: runtest"
    +  echo "  --build-only           Only build the tests"
    +  echo "  -v|--verbose           Tee STDOUT and STDERR to screen and files"
    +  echo "  -h|--help              Show this message"
    +  echo ""
    +  ${KOKKOS_PATH}/generate_makefile.bash --help
    +  return 0
    +}
    +
    +
    +declare -a GENERATE_ARGS=()
    +declare -i VERBOSE=0
    +declare -i CLEAN=0
    +declare -i CLEAN_ON_PASS=0
    +declare -i BUILD_ONLY=0
    +OUTPUT="runtest"
    +
    +declare -i MAKE_J=${HPCBIND_NUM_PUS:-1}
    +
    +for i in $@; do
    +  case $i in
    +    -j=*|--make-j=*)
    +      MAKE_J=${i#*=}
    +      shift
    +      ;;
    +    -c|--clean)
    +      CLEAN=1
    +      shift
    +      ;;
    +    --clean-on-pass)
    +      CLEAN_ON_PASS=1
    +      shift
    +      ;;
    +    --output-prefix=*)
    +      OUTPUT=${i#*=}
    +      shift
    +      ;;
    +    --build-only)
    +      BUILD_ONLY=1
    +      shift
    +      ;;
    +    -v|--verbose)
    +      VERBOSE=1
    +      shift
    +      ;;
    +    -h|--help)
    +      show_help
    +      exit 0
    +      ;;
    +    *)
    +      GENERATE_ARGS+=("$i")
    +      shift
    +      ;;
    +  esac
    +done
    +
    +if [[ "$(pwd -P)" == ${KOKKOS_PATH} ]]; then
    +  echo "Cannot call $0 from root repository path ${KOKKOS_PATH}"
    +  exit 1
    +fi
    +
    +# Some makefile dependencies are incorrect, so clean needs to force
    +# a new call to generate_makefiles.bash
    +if [[ ${CLEAN} -eq 1 ]]; then
    +  START=${SECONDS}
    +  echo "Cleaning"
    +  /bin/rm -rf algorithms containers core example install Makefile >/dev/null 2>&1
    +  END=${SECONDS}
    +  echo "    $((END-START)) seconds"
    +  if [[ ${VERBOSE} -eq 1 ]]; then
    +    echo ""
    +    echo ""
    +  fi
    +fi
    +
    +declare -i START=${SECONDS}
    +echo "Generating Makefile"
    +echo "    ${KOKKOS_PATH}/generate_makefile.bash --kokkos-path=${KOKKOS_PATH} ${GENERATE_ARGS[@]}"
    +
    +if [[ ${VERBOSE} -eq 0 ]]; then
    +  "${KOKKOS_PATH}"/generate_makefile.bash --kokkos-path="${KOKKOS_PATH}" "${GENERATE_ARGS[@]}" > ${OUTPUT}.out 2> >(tee ${OUTPUT}.err >&2)
    +else
    +  "${KOKKOS_PATH}"/generate_makefile.bash --kokkos-path="${KOKKOS_PATH}" "${GENERATE_ARGS[@]}" > >(tee ${OUTPUT}.out) 2> >(tee ${OUTPUT}.err >&2)
    +fi
    +declare -i RESULT=$?
    +declare -i END=${SECONDS}
    +if [[ ${RESULT} -eq 0 ]]; then
    +  echo "    PASS:  $((END-START)) seconds"
    +  if [[ ${VERBOSE} -eq 1 ]]; then
    +    echo ""
    +    echo ""
    +  fi
    +else
    +  cat ${OUTPUT}.out | grep "FAIL"
    +  cat ${OUTPUT}.err | grep "FAIL"
    +  echo "    FAIL:  $((END-START)) seconds"
    +  exit 1
    +fi
    +
    +START=${SECONDS}
    +echo "Building"
    +if [[ ${VERBOSE} -eq 0 ]]; then
    +  make --keep-going -j ${MAKE_J} build-test >> ${OUTPUT}.out 2> >(tee -a ${OUTPUT}.err >&2)
    +else
    +  make --keep-going -j ${MAKE_J} build-test > >(tee -a ${OUTPUT}.out) 2> >(tee -a ${OUTPUT}.err >&2)
    +fi
    +RESULT=$?
    +END=${SECONDS}
    +if [[ ${RESULT} -eq 0 ]]; then
    +  echo "    PASS:  $((END-START)) seconds"
    +  if [[ ${VERBOSE} -eq 1 ]]; then
    +    echo ""
    +    echo ""
    +  fi
    +else
    +  cat ${OUTPUT}.out | grep -E "[[:space:]]error:[[:space:]]"
    +  cat ${OUTPUT}.err | grep -E "[[:space:]]error:[[:space:]]"
    +  echo "    FAIL:  $((END-START)) seconds"
    +  exit 1
    +fi
    +
    +if [[ ${BUILD_ONLY} -eq 0 ]]; then
    +  START=${SECONDS}
    +  echo "Testing"
    +  if [[ ${VERBOSE} -eq 0 ]]; then
    +    make --keep-going test >> ${OUTPUT}.out 2> >(tee -a ${OUTPUT}.err >&2)
    +  else
    +    make --keep-going test > >(tee -a ${OUTPUT}.out) 2> >(tee -a ${OUTPUT}.err >&2)
    +  fi
    +  RESULT=$?
    +  END=${SECONDS}
    +  if [[ ${RESULT} -eq 0 ]]; then
    +    echo "    PASS:  $((END-START)) seconds"
    +    if [[ ${CLEAN_ON_PASS} -eq 1 ]]; then
    +      make clean
    +    fi
    +  else
    +    cat ${OUTPUT}.out | grep "FAIL"
    +    cat ${OUTPUT}.err | grep "FAIL"
    +    echo "    FAIL:  $((END-START)) seconds"
    +    exit 1
    +  fi
    +fi
    +
    +exit ${RESULT}
    +
    diff --git a/lib/kokkos/cmake/Makefile.generate_cmake_settings b/lib/kokkos/cmake/Makefile.generate_cmake_settings
    new file mode 100644
    index 0000000000..da076b23db
    --- /dev/null
    +++ b/lib/kokkos/cmake/Makefile.generate_cmake_settings
    @@ -0,0 +1,8 @@
    +ifndef KOKKOS_PATH
    +  MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
    +  KOKKOS_PATH = $(subst Makefile,,$(MAKEFILE_PATH))..
    +endif
    +
    +include $(KOKKOS_PATH)/Makefile.kokkos
    +include $(KOKKOS_PATH)/core/src/Makefile.generate_header_lists
    +include $(KOKKOS_PATH)/core/src/Makefile.generate_build_files
    diff --git a/lib/kokkos/cmake/kokkos.cmake b/lib/kokkos/cmake/kokkos.cmake
    deleted file mode 100644
    index 235b7eaba4..0000000000
    --- a/lib/kokkos/cmake/kokkos.cmake
    +++ /dev/null
    @@ -1,1198 +0,0 @@
    -
    -
    -# Set which Kokkos backend to use.
    -set(KOKKOS_ENABLE_CUDA OFF CACHE BOOL "Use Kokkos CUDA backend")
    -set(KOKKOS_ENABLE_OPENMP ON CACHE BOOL "Use Kokkos OpenMP backend")
    -set(KOKKOS_ENABLE_PTHREAD OFF CACHE BOOL "Use Kokkos Pthreads backend")
    -set(KOKKOS_ENABLE_QTHREADS OFF CACHE BOOL "Use Kokkos Qthreads backend")
    -set(KOKKOS_ENABLE_SERIAL ON CACHE BOOL "Use Kokkos Serial backend")
    -
    -# List of possible host architectures.
    -list(APPEND KOKKOS_HOST_ARCH_LIST
    -     None            # No architecture optimization
    -     AMDAVX          # AMD chip
    -     ARMv80          # ARMv8.0 Compatible CPU
    -     ARMv81          # ARMv8.1 Compatible CPU
    -     ARMv8-ThunderX  # ARMv8 Cavium ThunderX CPU
    -     SNB             # Intel Sandy/Ivy Bridge CPUs
    -     HSW             # Intel Haswell CPUs
    -     BDW             # Intel Broadwell Xeon E-class CPUs
    -     SKX             # Intel Sky Lake Xeon E-class HPC CPUs (AVX512)
    -     KNC             # Intel Knights Corner Xeon Phi
    -     KNL             # Intel Knights Landing Xeon Phi
    -     BGQ             # IBM Blue Gene Q
    -     Power7          # IBM POWER7 CPUs
    -     Power8          # IBM POWER8 CPUs
    -     Power9          # IBM POWER9 CPUs
    -    )
    -
    -# Setting this variable to a value other than "None" can improve host
    -# performance by turning on architecture specific code.
    -set(KOKKOS_HOST_ARCH "None" CACHE STRING "Optimize for specific host architecture.")
    -set_property(CACHE KOKKOS_HOST_ARCH PROPERTY STRINGS ${KOKKOS_HOST_ARCH_LIST})
    -
    -# List of possible GPU architectures.
    -list(APPEND KOKKOS_GPU_ARCH_LIST
    -     None            # No architecture optimization
    -     Kepler          # NVIDIA Kepler default (generation CC 3.5)
    -     Kepler30        # NVIDIA Kepler generation CC 3.0
    -     Kepler32        # NVIDIA Kepler generation CC 3.2
    -     Kepler35        # NVIDIA Kepler generation CC 3.5
    -     Kepler37        # NVIDIA Kepler generation CC 3.7
    -     Maxwell         # NVIDIA Maxwell default (generation CC 5.0)
    -     Maxwell50       # NVIDIA Maxwell generation CC 5.0
    -     Maxwell52       # NVIDIA Maxwell generation CC 5.2
    -     Maxwell53       # NVIDIA Maxwell generation CC 5.3
    -     Pascal60        # NVIDIA Pascal generation CC 6.0
    -     Pascal61        # NVIDIA Pascal generation CC 6.1
    -    )
    -
    -# Setting this variable to a value other than "None" can improve GPU
    -# performance by turning on architecture specific code.
    -set(KOKKOS_GPU_ARCH "None" CACHE STRING "Optimize for specific GPU architecture.")
    -set_property(CACHE KOKKOS_GPU_ARCH PROPERTY STRINGS ${KOKKOS_GPU_ARCH_LIST})
    -
    -set(KOKKOS_SEPARATE_LIBS OFF CACHE BOOL "OFF = kokkos.  ON = kokkoscore, kokkoscontainers, and kokkosalgorithms.")
    -
    -# Enable hwloc library.
    -set(KOKKOS_ENABLE_HWLOC OFF CACHE BOOL "Enable hwloc for better process placement.")
    -set(KOKKOS_HWLOC_DIR "" CACHE PATH "Location of hwloc library.")
    -
    -# Enable memkind library.
    -set(KOKKOS_ENABLE_MEMKIND OFF CACHE BOOL "Enable memkind.")
    -set(KOKKOS_MEMKIND_DIR "" CACHE PATH "Location of memkind library.")
    -
    -set(KOKKOS_ENABLE_LIBRT OFF CACHE BOOL "Enable librt for more precise timer.")
    -
    -# Enable debugging.
    -set(KOKKOS_DEBUG OFF CACHE BOOL "Enable debugging in Kokkos.")
    -
    -# Enable profiling.
    -set(KOKKOS_ENABLE_PROFILING ON CACHE BOOL "Enable profiling.")
    -
    -# Enable aggressive vectorization.
    -set(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION OFF CACHE BOOL "Enable aggressive vectorization.")
    -
    -# Qthreads options.
    -set(KOKKOS_QTHREADS_DIR "" CACHE PATH "Location of Qthreads library.")
    -
    -# CUDA options.
    -set(KOKKOS_CUDA_DIR "" CACHE PATH "Location of CUDA library.  Defaults to where nvcc installed.")
    -set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC OFF CACHE BOOL "Enable CUDA LDG.")
    -set(KOKKOS_ENABLE_CUDA_UVM OFF CACHE BOOL "Enable CUDA unified virtual memory.")
    -set(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE OFF CACHE BOOL "Enable relocatable device code for CUDA.")
    -set(KOKKOS_ENABLE_CUDA_LAMBDA ON CACHE BOOL "Enable lambdas for CUDA.")
    -
    -################################### FUNCTIONS ##################################
    -
    -# Sets the following compiler variables that are analogous to the CMAKE_*
    -# versions.  We add the ability to detect NVCC (really nvcc_wrapper).
    -#   KOKKOS_CXX_COMPILER
    -#   KOKKOS_CXX_COMPILER_ID
    -#   KOKKOS_CXX_COMPILER_VERSION
    -#
    -# Also verifies the compiler version meets the minimum required by Kokkos.
    -function(set_kokkos_cxx_compiler)
    -  # Since CMake doesn't recognize the nvcc compiler until 3.8, we use our own
    -  # version of the CMake variables and detect nvcc ourselves.  Initially set to
    -  # the CMake variable values.
    -  set(INTERNAL_CXX_COMPILER ${CMAKE_CXX_COMPILER})
    -  set(INTERNAL_CXX_COMPILER_ID ${CMAKE_CXX_COMPILER_ID})
    -  set(INTERNAL_CXX_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
    -
    -  # Check if the compiler is nvcc (which really means nvcc_wrapper).
    -  execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version
    -                  COMMAND grep nvcc
    -                  COMMAND wc -l
    -                  OUTPUT_VARIABLE INTERNAL_HAVE_COMPILER_NVCC
    -                  OUTPUT_STRIP_TRAILING_WHITESPACE)
    -
    -  string(REGEX REPLACE "^ +" ""
    -         INTERNAL_HAVE_COMPILER_NVCC ${INTERNAL_HAVE_COMPILER_NVCC})
    -
    -  if(INTERNAL_HAVE_COMPILER_NVCC)
    -    # Set the compiler id to nvcc.  We use the value used by CMake 3.8.
    -    set(INTERNAL_CXX_COMPILER_ID NVIDIA)
    -
    -    # Set nvcc's compiler version.
    -    execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version
    -                    COMMAND grep release
    -                    OUTPUT_VARIABLE INTERNAL_CXX_COMPILER_VERSION
    -                    OUTPUT_STRIP_TRAILING_WHITESPACE)
    -
    -    string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+$"
    -           INTERNAL_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION})
    -  endif()
    -
    -  # Enforce the minimum compilers supported by Kokkos.
    -  set(KOKKOS_MESSAGE_TEXT "Compiler not supported by Kokkos.  Required compiler versions:")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    Clang      3.5.2 or higher")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    GCC        4.7.2 or higher")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    Intel     14.0.4 or higher")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    NVCC      7.0.28 or higher")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    PGI         17.1 or higher\n")
    -
    -  if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang)
    -    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 3.5.2)
    -      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -    endif()
    -  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL GNU)
    -    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.7.2)
    -      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -    endif()
    -  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL Intel)
    -    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 14.0.4)
    -      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -    endif()
    -  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
    -    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 7.0.28)
    -      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -    endif()
    -  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL PGI)
    -    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 17.1)
    -      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -    endif()
    -  endif()
    -
    -  # Enforce that extensions are turned off for nvcc_wrapper.
    -  if(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
    -    if(NOT DEFINED CMAKE_CXX_EXTENSIONS OR CMAKE_CXX_EXTENSIONS STREQUAL ON)
    -      message(FATAL_ERROR "NVCC doesn't support C++ extensions.  Set CMAKE_CXX_EXTENSIONS to OFF in your CMakeLists.txt.")
    -    endif()
    -  endif()
    -
    -  if(KOKKOS_ENABLE_CUDA)
    -    # Enforce that the compiler can compile CUDA code.
    -    if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang)
    -      if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.0.0)
    -        message(FATAL_ERROR "Compiling CUDA code directly with Clang requires version 4.0.0 or higher.")
    -      endif()
    -    elseif(NOT INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
    -      message(FATAL_ERROR "Invalid compiler for CUDA.  The compiler must be nvcc_wrapper or Clang.")
    -    endif()
    -  endif()
    -
    -  set(KOKKOS_CXX_COMPILER ${INTERNAL_CXX_COMPILER} PARENT_SCOPE)
    -  set(KOKKOS_CXX_COMPILER_ID ${INTERNAL_CXX_COMPILER_ID} PARENT_SCOPE)
    -  set(KOKKOS_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION} PARENT_SCOPE)
    -endfunction()
    -
    -# Transitively enforces that the appropriate CXX standard compile flags (C++11
    -# or above) are added to targets that use the Kokkos library.  Compile features
    -# are used if possible.  Otherwise, the appropriate flags are added to
    -# KOKKOS_CXX_FLAGS.  Values set by the user to CMAKE_CXX_STANDARD and
    -# CMAKE_CXX_EXTENSIONS are honored.
    -function(set_kokkos_compiler_standard)
    -  # The following table lists the versions of CMake that supports CXX_STANDARD
    -  # and the CXX compile features for different compilers.  The versions are
    -  # based on CMake documentation, looking at CMake code, and verifying by
    -  # testing with specific CMake versions.
    -  #
    -  #   COMPILER                      CXX_STANDARD     Compile Features
    -  #   ---------------------------------------------------------------
    -  #   Clang                             3.1                3.1
    -  #   GNU                               3.1                3.2
    -  #   AppleClang                        3.2                3.2
    -  #   Intel                             3.6                3.6
    -  #   Cray                              No                 No
    -  #   PGI                               No                 No
    -  #   XL                                No                 No
    -  #
    -  # For compiling CUDA code using nvcc_wrapper, we will use the host compiler's
    -  # flags for turning on C++11.  Since for compiler ID and versioning purposes
    -  # CMake recognizes the host compiler when calling nvcc_wrapper, this just
    -  # works.  Both NVCC and nvcc_wrapper only recognize '-std=c++11' which means
    -  # that we can only use host compilers for CUDA builds that use those flags.
    -  # It also means that extensions (gnu++11) can't be turned on for CUDA builds.
    -
    -  # Check if we can use compile features.
    -  if(NOT KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
    -    if(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
    -      if(NOT CMAKE_VERSION VERSION_LESS 3.1)
    -        set(INTERNAL_USE_COMPILE_FEATURES ON)
    -      endif()
    -    elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang OR CMAKE_CXX_COMPILER_ID STREQUAL GNU)
    -      if(NOT CMAKE_VERSION VERSION_LESS 3.2)
    -        set(INTERNAL_USE_COMPILE_FEATURES ON)
    -      endif()
    -    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
    -      if(NOT CMAKE_VERSION VERSION_LESS 3.6)
    -        set(INTERNAL_USE_COMPILE_FEATURES ON)
    -      endif()
    -    endif()
    -  endif()
    -
    -  if(INTERNAL_USE_COMPILE_FEATURES)
    -    # Use the compile features aspect of CMake to transitively cause C++ flags
    -    # to populate to user code.
    -
    -    # I'm using a hack by requiring features that I know force the lowest version
    -    # of the compilers we want to support.  Clang 3.3 and later support all of
    -    # the C++11 standard.  With CMake 3.8 and higher, we could switch to using
    -    # cxx_std_11.
    -    set(KOKKOS_CXX11_FEATURES
    -        cxx_nonstatic_member_init # Forces GCC 4.7 or later and Intel 14.0 or later.
    -        PARENT_SCOPE
    -       )
    -  else()
    -    # CXX compile features are not yet implemented for this combination of
    -    # compiler and version of CMake.
    -
    -    if(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
    -      # Versions of CMAKE before 3.2 don't support CXX_STANDARD or C++ compile
    -      # features for the AppleClang compiler.  Set compiler flags transitively
    -      # here such that they trickle down to a call to target_compile_options().
    -
    -      # The following two blocks of code were copied from
    -      # /Modules/Compiler/AppleClang-CXX.cmake from CMake 3.7.2 and then
    -      # modified.
    -      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0)
    -        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
    -        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
    -      endif()
    -
    -      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.1)
    -        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
    -        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
    -      elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
    -        # AppleClang 5.0 knows this flag, but does not set a __cplusplus macro
    -        # greater than 201103L.
    -        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
    -        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
    -      endif()
    -    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
    -      # Versions of CMAKE before 3.6 don't support CXX_STANDARD or C++ compile
    -      # features for the Intel compiler.  Set compiler flags transitively here
    -      # such that they trickle down to a call to target_compile_options().
    -
    -      # The following three blocks of code were copied from
    -      # /Modules/Compiler/Intel-CXX.cmake from CMake 3.7.2 and then modified.
    -      if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
    -        set(_std -Qstd)
    -        set(_ext c++)
    -      else()
    -        set(_std -std)
    -        set(_ext gnu++)
    -      endif()
    -
    -      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.2)
    -        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++14")
    -        # TODO: There is no gnu++14 value supported; figure out what to do.
    -        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++14")
    -      elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.0)
    -        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++1y")
    -        # TODO: There is no gnu++14 value supported; figure out what to do.
    -        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++1y")
    -      endif()
    -
    -      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
    -        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++11")
    -        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}11")
    -      elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
    -        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++0x")
    -        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}0x")
    -      endif()
    -    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Cray)
    -      # CMAKE doesn't support CXX_STANDARD or C++ compile features for the Cray
    -      # compiler.  Set compiler options transitively here such that they trickle
    -      # down to a call to target_compile_options().
    -      set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-hstd=c++11")
    -      set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-hstd=c++11")
    -      set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-hstd=c++11")
    -      set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-hstd=c++11")
    -    elseif(CMAKE_CXX_COMPILER_ID STREQUAL PGI)
    -      # CMAKE doesn't support CXX_STANDARD or C++ compile features for the PGI
    -      # compiler.  Set compiler options transitively here such that they trickle
    -      # down to a call to target_compile_options().
    -      set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "--c++11")
    -      set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "--c++11")
    -      set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "--c++11")
    -      set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "--c++11")
    -    elseif(CMAKE_CXX_COMPILER_ID STREQUAL XL)
    -      # CMAKE doesn't support CXX_STANDARD or C++ compile features for the XL
    -      # compiler.  Set compiler options transitively here such that they trickle
    -      # down to a call to target_compile_options().
    -      set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
    -      set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11")
    -      set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++11")
    -      set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=c++11")
    -    else()
    -      # Assume GNU.  CMAKE_CXX_STANDARD is handled correctly by CMake 3.1 and
    -      # above for this compiler.  If the user explicitly requests a C++
    -      # standard, CMake takes care of it.  If not, transitively require C++11.
    -      if(NOT CMAKE_CXX_STANDARD)
    -        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION ${CMAKE_CXX11_STANDARD_COMPILE_OPTION})
    -        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION ${CMAKE_CXX11_EXTENSION_COMPILE_OPTION})
    -      endif()
    -    endif()
    -
    -    # Set the C++ standard info for Kokkos respecting user set values for
    -    # CMAKE_CXX_STANDARD and CMAKE_CXX_EXTENSIONS.
    -    if(CMAKE_CXX_STANDARD EQUAL 14)
    -      if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF)
    -        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_STANDARD_COMPILE_OPTION})
    -      else()
    -        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_EXTENSION_COMPILE_OPTION})
    -      endif()
    -    elseif(CMAKE_CXX_STANDARD EQUAL 11)
    -      if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF)
    -        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION})
    -      else()
    -        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION})
    -      endif()
    -    else()
    -      # The user didn't explicitly request a standard, transitively require
    -      # C++11 respecting CMAKE_CXX_EXTENSIONS.
    -      if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF)
    -        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION})
    -      else()
    -        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION})
    -      endif()
    -    endif()
    -
    -    set(KOKKOS_CXX_FLAGS ${INTERNAL_CXX_FLAGS} PARENT_SCOPE)
    -  endif()
    -endfunction()
    -
    -########################## COMPILER AND FEATURE CHECKS #########################
    -
    -# TODO: We are assuming that nvcc_wrapper is using g++ as the host compiler.
    -#       Should we allow the user the option to change this?  The host compiler
    -#       for nvcc_wrapper can be set via the NVCC_WRAPPER_DEFAULT_COMPILER
    -#       environment variable or by passing a different host compiler with the
    -#       -ccbin flag.
    -
    -# TODO: Fully add CUDA support for Clang.
    -set_kokkos_cxx_compiler()
    -
    -set_kokkos_compiler_standard()
    -
    -######################### INITIALIZE INTERNAL VARIABLES ########################
    -
    -# Add Kokkos' modules to CMake's module path.
    -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${Kokkos_SOURCE_DIR}/cmake/Modules/")
    -
    -# Start with all global variables set to false.  This guarantees correct
    -# results with changes and multiple configures.
    -set(KOKKOS_HAVE_CUDA OFF CACHE INTERNAL "")
    -set(KOKKOS_USE_CUDA_UVM OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_CUDA_RDC OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_CUDA_LAMBDA OFF CACHE INTERNAL "")
    -set(KOKKOS_CUDA_CLANG_WORKAROUND OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_OPENMP OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_PTHREAD OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_QTHREADS OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_SERIAL OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_HWLOC OFF CACHE INTERNAL "")
    -set(KOKKOS_ENABLE_HBWSPACE OFF CACHE INTERNAL "")
    -set(KOKKOS_HAVE_DEBUG OFF CACHE INTERNAL "")
    -set(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK OFF CACHE INTERNAL "")
    -set(KOKKOS_ENABLE_ISA_X86_64 OFF CACHE INTERNAL "")
    -set(KOKKOS_ENABLE_ISA_KNC OFF CACHE INTERNAL "")
    -set(KOKKOS_ENABLE_ISA_POWERPCLE OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_ARMV80 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_ARMV81 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_ARMV8_THUNDERX OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_AVX OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_AVX2 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_AVX512MIC OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_AVX512XEON OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_KNC OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_POWER8 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_POWER9 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_KEPLER OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_KEPLER30 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_KEPLER32 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_KEPLER35 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_KEPLER37 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_MAXWELL OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_MAXWELL50 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_MAXWELL52 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_MAXWELL53 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_PASCAL OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_PASCAL60 OFF CACHE INTERNAL "")
    -set(KOKKOS_ARCH_PASCAL61 OFF CACHE INTERNAL "")
    -
    -############################## SET BACKEND OPTIONS #############################
    -
    -# Make sure at least one backend is selected.
    -if(NOT KOKKOS_ENABLE_CUDA AND NOT KOKKOS_ENABLE_OPENMP AND NOT KOKKOS_ENABLE_PTHREAD AND NOT KOKKOS_ENABLE_QTHREADS AND NOT KOKKOS_ENABLE_SERIAL)
    -  message(FATAL_ERROR "Must set one of KOKKOS_ENABLE_CUDA, KOKKOS_ENABLE_OPENMP, KOKKOS_ENABLE_PTHREAD, KOKKOS_ENABLE_QTHREADS, or KOKKOS_ENABLE_SERIAL")
    -endif()
    -
    -# Only one of OpenMP, Pthreads, and Qthreads can be set.
    -set(KOKKOS_MESSAGE_TEXT "Only one of KOKKOS_ENABLE_OPENMP, KOKKOS_ENABLE_PTHREAD, and KOKKOS_ENABLE_QTHREADS can be selected")
    -if(KOKKOS_ENABLE_OPENMP AND KOKKOS_ENABLE_PTHREAD)
    -  message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -elseif(KOKKOS_ENABLE_OPENMP AND KOKKOS_ENABLE_QTHREADS)
    -  message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -elseif(KOKKOS_ENABLE_PTHREAD AND KOKKOS_ENABLE_QTHREADS)
    -  message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -endif()
    -
    -# Get source files.
    -file(GLOB KOKKOS_CORE_SRCS core/src/impl/*.cpp)
    -file(GLOB KOKKOS_CONTAINERS_SRCS containers/src/impl/*.cpp)
    -
    -# Set options if using CUDA backend.
    -if(KOKKOS_ENABLE_CUDA)
    -  if(KOKKOS_CUDA_DIR)
    -    set(CUDA_TOOLKIT_ROOT_DIR ${KOKKOS_CUDA_DIR})
    -  endif()
    -
    -  find_package(CUDA)
    -
    -  if(NOT CUDA_FOUND)
    -    if(KOKKOS_CUDA_DIR)
    -      message(FATAL_ERROR "Couldn't find CUDA in default locations, and KOKKOS_CUDA_DIR points to an invalid installation.")
    -    else()
    -      message(FATAL_ERROR "Couldn't find CUDA in default locations.  Set KOKKOS_CUDA_DIR.")
    -    endif()
    -  endif()
    -
    -  list(APPEND KOKKOS_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS})
    -  list(APPEND KOKKOS_LD_FLAGS -L${CUDA_TOOLKIT_ROOT_DIR}/lib64)
    -  list(APPEND KOKKOS_LIBS cudart cuda)
    -
    -  set(KOKKOS_HAVE_CUDA ON CACHE INTERNAL "")
    -  file(GLOB KOKKOS_CUDA_SRCS core/src/Cuda/*.cpp)
    -  list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_CUDA_SRCS})
    -
    -  # Set CUDA UVM if requested.
    -  if(KOKKOS_ENABLE_CUDA_UVM)
    -    set(KOKKOS_USE_CUDA_UVM ON CACHE INTERNAL "")
    -  endif()
    -
    -  # Set CUDA relocatable device code if requested.
    -  if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE)
    -    set(KOKKOS_HAVE_CUDA_RDC ON CACHE INTERNAL "")
    -    list(APPEND KOKKOS_CXX_FLAGS --relocatable-device-code=true)
    -    list(APPEND KOKKOS_LD_FLAGS --relocatable-device-code=true)
    -  endif()
    -
    -  # Set CUDA lambda if requested.
    -  if(KOKKOS_ENABLE_CUDA_LAMBDA)
    -    set(KOKKOS_HAVE_CUDA_LAMBDA ON CACHE INTERNAL "")
    -
    -    if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
    -      if(KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 7.5)
    -        message(FATAL_ERROR "CUDA lambda support requires CUDA 7.5 or higher.  Disable it or use a 7.5 or later compiler.")
    -      else()
    -        list(APPEND KOKKOS_CXX_FLAGS -expt-extended-lambda)
    -      endif()
    -    endif()
    -  endif()
    -
    -  # Set Clang specific options.
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Clang)
    -    list(APPEND KOKKOS_CXX_FLAGS --cuda-path=${CUDA_TOOLKIT_ROOT_DIR})
    -
    -    set(KOKKOS_CUDA_CLANG_WORKAROUND ON CACHE INTERNAL "")
    -
    -    # Force CUDA_LDG_INTRINSIC on when using Clang.
    -    set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC ON CACHE BOOL "Enable CUDA LDG." FORCE)
    -  endif()
    -endif()
    -
    -# Set options if using OpenMP backend.
    -if(KOKKOS_ENABLE_OPENMP)
    -  find_package(OpenMP REQUIRED)
    -
    -  if(OPENMP_FOUND)
    -    if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
    -      list(APPEND KOKKOS_CXX_FLAGS -Xcompiler)
    -    endif()
    -
    -    list(APPEND KOKKOS_CXX_FLAGS ${OpenMP_CXX_FLAGS})
    -    list(APPEND KOKKOS_LD_FLAGS ${OpenMP_CXX_FLAGS})
    -  endif()
    -
    -  set(KOKKOS_HAVE_OPENMP ON CACHE INTERNAL "")
    -  file(GLOB KOKKOS_OPENMP_SRCS core/src/OpenMP/*.cpp)
    -  list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_OPENMP_SRCS})
    -endif()
    -
    -# Set options if using Pthreads backend.
    -if(KOKKOS_ENABLE_PTHREAD)
    -  find_package(Threads REQUIRED)
    -
    -  list(APPEND KOKKOS_LIBS Threads::Threads)
    -
    -  set(KOKKOS_HAVE_PTHREAD ON CACHE INTERNAL "")
    -  file(GLOB KOKKOS_PTHREAD_SRCS core/src/Threads/*.cpp)
    -  list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_PTHREAD_SRCS})
    -endif()
    -
    -# Set options if using Qthreads backend.
    -if(KOKKOS_ENABLE_QTHREADS)
    -  if(KOKKOS_QTHREADS_DIR)
    -    list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_QTHREADS_DIR})
    -  endif()
    -
    -  find_package(Qthreads)
    -
    -  if(NOT QTHREADS_FOUND)
    -    if(KOKKOS_QTHREADS_DIR)
    -      message(FATAL_ERROR "Couldn't find Qthreads in default locations, and KOKKOS_QTHREADS_DIR points to an invalid installation.")
    -    else()
    -      message(FATAL_ERROR "Couldn't find Qthreads in default locations.  Set KOKKOS_QTHREADS_DIR.")
    -    endif()
    -  endif()
    -
    -  list(APPEND KOKKOS_INCLUDE_DIRS ${QTHREADS_INCLUDE_DIR})
    -  list(APPEND KOKKOS_LIBS ${QTHREADS_LIBRARIES})
    -
    -  set(KOKKOS_HAVE_QTHREADS ON CACHE INTERNAL "")
    -  file(GLOB KOKKOS_QTHREADS_SRCS core/src/Threads/*.cpp)
    -  list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_QTHREADS_SRCS})
    -
    -  if(KOKKOS_QTHREADS_DIR)
    -    list(REMOVE_AT CMAKE_PREFIX_PATH -1)
    -  endif()
    -endif()
    -
    -# Set options if using Serial backend.
    -if(KOKKOS_ENABLE_SERIAL)
    -  set(KOKKOS_HAVE_SERIAL ON CACHE INTERNAL "")
    -else()
    -  # Remove serial source files.
    -  list(REMOVE_ITEM KOKKOS_CORE_SRCS
    -       "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Serial.cpp"
    -       "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Serial_Task.cpp")
    -endif()
    -
    -########################### SET ARCHITECTURE OPTIONS ###########################
    -
    -# Make sure the host architecture option is valid.  Need to verify in case user
    -# passes the option via the command line.
    -list(FIND KOKKOS_HOST_ARCH_LIST "${KOKKOS_HOST_ARCH}" KOKKOS_VALID_HOST_ARCH)
    -if(KOKKOS_VALID_HOST_ARCH EQUAL -1)
    -  set(KOKKOS_ARCH_TEXT "\n    ${KOKKOS_HOST_ARCH_LIST}")
    -  string(REPLACE ";" "\n    " KOKKOS_ARCH_TEXT "${KOKKOS_ARCH_TEXT}")
    -  set(KOKKOS_MESSAGE_TEXT "Invalid architecture for KOKKOS_HOST_ARCH: '${KOKKOS_HOST_ARCH}'")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n  Choices:${KOKKOS_ARCH_TEXT}\n")
    -  message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -endif()
    -
    -# Make sure the GPU architecture option is valid.  Need to verify in case user
    -# passes the option via the command line.
    -list(FIND KOKKOS_GPU_ARCH_LIST "${KOKKOS_GPU_ARCH}" KOKKOS_VALID_GPU_ARCH)
    -if(KOKKOS_VALID_GPU_ARCH EQUAL -1)
    -  set(KOKKOS_ARCH_TEXT "\n    ${KOKKOS_GPU_ARCH_LIST}")
    -  string(REPLACE ";" "\n    " KOKKOS_ARCH_TEXT "${KOKKOS_ARCH_TEXT}")
    -  set(KOKKOS_MESSAGE_TEXT "Invalid architecture for KOKKOS_GPU_ARCH: '${KOKKOS_GPU_ARCH}'")
    -  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n  Choices:${KOKKOS_ARCH_TEXT}\n")
    -  message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    -endif()
    -
    -# Decide what ISA level we are able to support.
    -if(KOKKOS_HOST_ARCH STREQUAL SNB OR KOKKOS_HOST_ARCH STREQUAL HSW OR KOKKOS_HOST_ARCH STREQUAL BDW OR
    -   KOKKOS_HOST_ARCH STREQUAL SKX OR KOKKOS_HOST_ARCH STREQUAL KNL)
    -  set(KOKKOS_ENABLE_ISA_X86_64 ON CACHE INTERNAL "")
    -endif()
    -
    -if(KOKKOS_HOST_ARCH STREQUAL KNC)
    -  set(KOKKOS_ENABLE_ISA_KNC ON CACHE INTERNAL "")
    -endif()
    -
    -if(KOKKOS_HOST_ARCH STREQUAL Power8 OR KOKKOS_HOST_ARCH STREQUAL Power9)
    -  set(KOKKOS_ENABLE_ISA_POWERPCLE ON CACHE INTERNAL "")
    -endif()
    -
    -# Add host architecture options.
    -if(KOKKOS_HOST_ARCH STREQUAL ARMv80)
    -  set(KOKKOS_ARCH_ARMV80 ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -march=armv8-a)
    -    list(APPEND KOKKOS_LD_FLAGS -march=armv8-a)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL ARMv81)
    -  set(KOKKOS_ARCH_ARMV81 ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -march=armv8.1-a)
    -    list(APPEND KOKKOS_LD_FLAGS -march=armv8.1-a)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL ARMv8-ThunderX)
    -  set(KOKKOS_ARCH_ARMV80 ON CACHE INTERNAL "")
    -  set(KOKKOS_ARCH_ARMV8_THUNDERX ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -march=armv8-a -mtune=thunderx)
    -    list(APPEND KOKKOS_LD_FLAGS -march=armv8-a -mtune=thunderx)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL SNB OR KOKKOS_HOST_ARCH STREQUAL AMDAVX)
    -  set(KOKKOS_ARCH_AVX ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
    -    list(APPEND KOKKOS_CXX_FLAGS -mavx)
    -    list(APPEND KOKKOS_LD_FLAGS -mavx)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -    list(APPEND KOKKOS_CXX_FLAGS -tp=sandybridge)
    -    list(APPEND KOKKOS_LD_FLAGS -tp=sandybridge)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -mavx)
    -    list(APPEND KOKKOS_LD_FLAGS -mavx)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL HSW OR KOKKOS_HOST_ARCH STREQUAL BDW)
    -  set(KOKKOS_ARCH_AVX2 ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
    -    list(APPEND KOKKOS_CXX_FLAGS -xCORE-AVX2)
    -    list(APPEND KOKKOS_LD_FLAGS -xCORE-AVX2)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -    list(APPEND KOKKOS_CXX_FLAGS -tp=haswell)
    -    list(APPEND KOKKOS_LD_FLAGS -tp=haswell)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -march=core-avx2 -mtune=core-avx2)
    -    list(APPEND KOKKOS_LD_FLAGS -march=core-avx2 -mtune=core-avx2)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL KNL)
    -  set(KOKKOS_ARCH_AVX512MIC ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
    -    list(APPEND KOKKOS_CXX_FLAGS -xMIC-AVX512)
    -    list(APPEND KOKKOS_LD_FLAGS -xMIC-AVX512)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -march=knl)
    -    list(APPEND KOKKOS_LD_FLAGS -march=knl)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL SKX)
    -  set(KOKKOS_ARCH_AVX512XEON ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
    -    list(APPEND KOKKOS_CXX_FLAGS -xCORE-AVX512)
    -    list(APPEND KOKKOS_LD_FLAGS -xCORE-AVX512)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -march=skylake-avx512)
    -    list(APPEND KOKKOS_LD_FLAGS -march=skylake-avx512)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL KNC)
    -  set(KOKKOS_ARCH_KNC ON CACHE INTERNAL "")
    -  list(APPEND KOKKOS_CXX_FLAGS -mmic)
    -  list(APPEND KOKKOS_LD_FLAGS -mmic)
    -elseif(KOKKOS_HOST_ARCH STREQUAL Power8)
    -  set(KOKKOS_ARCH_POWER8 ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -mcpu=power8 -mtune=power8)
    -    list(APPEND KOKKOS_LD_FLAGS -mcpu=power8 -mtune=power8)
    -  endif()
    -elseif(KOKKOS_HOST_ARCH STREQUAL Power9)
    -  set(KOKKOS_ARCH_POWER9 ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
    -  else()
    -    list(APPEND KOKKOS_CXX_FLAGS -mcpu=power9 -mtune=power9)
    -    list(APPEND KOKKOS_LD_FLAGS -mcpu=power9 -mtune=power9)
    -  endif()
    -endif()
    -
    -# Add GPU architecture options.
    -if(KOKKOS_ENABLE_CUDA)
    -  if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
    -    set(KOKKOS_GPU_ARCH_FLAG -arch)
    -  elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Clang)
    -    list(APPEND KOKKOS_CXX_FLAGS -x cuda)
    -    set(KOKKOS_GPU_ARCH_FLAG --cuda-gpu-arch)
    -  endif()
    -
    -  if(KOKKOS_GPU_ARCH STREQUAL Kepler30)
    -    set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_KEPLER30 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_30)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Kepler32)
    -    set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_KEPLER32 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_32)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Kepler35 OR KOKKOS_GPU_ARCH STREQUAL Kepler)
    -    set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_KEPLER35 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_35)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Kepler37)
    -    set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_KEPLER37 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_37)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell50 OR KOKKOS_GPU_ARCH STREQUAL Maxwell)
    -    set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_MAXWELL50 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_50)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell52)
    -    set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_MAXWELL52 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_52)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell53)
    -    set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_MAXWELL53 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_53)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Pascal60)
    -    set(KOKKOS_ARCH_PASCAL ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_PASCAL60 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_60)
    -  elseif(KOKKOS_GPU_ARCH STREQUAL Pascal61)
    -    set(KOKKOS_ARCH_PASCAL ON CACHE INTERNAL "")
    -    set(KOKKOS_ARCH_PASCAL61 ON CACHE INTERNAL "")
    -    set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_61)
    -  endif()
    -
    -  if(NOT KOKKOS_GPU_ARCH STREQUAL None)
    -    list(APPEND KOKKOS_CXX_FLAGS ${KOKKOS_GPU_ARCH_FLAG})
    -
    -    if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
    -      list(APPEND KOKKOS_LD_FLAGS ${KOKKOS_GPU_ARCH_FLAG})
    -    endif()
    -  endif()
    -endif()
    -
    -############################### SET OTHER OPTIONS ##############################
    -
    -# Set options if using hwloc.
    -if(KOKKOS_ENABLE_HWLOC)
    -  if(KOKKOS_HWLOC_DIR)
    -    list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_HWLOC_DIR})
    -  endif()
    -
    -  find_package(HWLOC)
    -
    -  if(NOT HWLOC_FOUND)
    -    if(KOKKOS_HWLOC_DIR)
    -      message(FATAL_ERROR "Couldn't find HWLOC in default locations, and KOKKOS_HWLOC_DIR points to an invalid installation.")
    -    else()
    -      message(FATAL_ERROR "Couldn't find HWLOC in default locations.  Set KOKKOS_HWLOC_DIR.")
    -    endif()
    -  endif()
    -
    -  list(APPEND KOKKOS_INCLUDE_DIRS ${HWLOC_INCLUDE_DIR})
    -  list(APPEND KOKKOS_LIBS ${HWLOC_LIBRARIES})
    -
    -  set(KOKKOS_HAVE_HWLOC ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_HWLOC_DIR)
    -    list(REMOVE_AT CMAKE_PREFIX_PATH -1)
    -  endif()
    -endif()
    -
    -# Set options if using memkind.
    -if(KOKKOS_ENABLE_MEMKIND)
    -  if(KOKKOS_MEMKIND_DIR)
    -    list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_MEMKIND_DIR})
    -  endif()
    -
    -  find_package(Memkind)
    -
    -  if(NOT MEMKIND_FOUND)
    -    if(KOKKOS_MEMKIND_DIR)
    -      message(FATAL_ERROR "Couldn't find Memkind in default locations, and KOKKOS_MEMKIND_DIR points to an invalid installation.")
    -    else()
    -      message(FATAL_ERROR "Couldn't find Memkind in default locations.  Set KOKKOS_MEMKIND_DIR.")
    -    endif()
    -  endif()
    -
    -  set(KOKKOS_ENABLE_HBWSPACE ON CACHE INTERNAL "")
    -  list(APPEND KOKKOS_INCLUDE_DIRS ${MEMKIND_INCLUDE_DIR})
    -  list(APPEND KOKKOS_LIBS ${MEMKIND_LIBRARIES})
    -
    -  if(KOKKOS_MEMKIND_DIR)
    -    list(REMOVE_AT CMAKE_PREFIX_PATH -1)
    -  endif()
    -else()
    -  # Remove HBW source file.
    -  list(REMOVE_ITEM KOKKOS_CORE_SRCS
    -       "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_HBWSpace.cpp")
    -endif()
    -
    -# Set options if using librt.
    -if(KOKKOS_ENABLE_LIBRT)
    -  list(APPEND KOKKOS_LIBS rt)
    -endif()
    -
    -# Set debugging if requested.
    -if(KOKKOS_DEBUG)
    -  set(KOKKOS_HAVE_DEBUG ON CACHE INTERNAL "")
    -  set(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ON CACHE INTERNAL "")
    -
    -  if(KOKKOS_CXX_COVIDIA)
    -    list(APPEND KOKKOS_CXX_FLAGS -lineinfo)
    -  endif()
    -
    -  list(APPEND KOKKOS_CXX_FLAGS -g)
    -  list(APPEND KOKKOS_LD_FLAGS -g)
    -endif()
    -
    -# Set profiling if requested.
    -if(KOKKOS_ENABLE_PROFILING)
    -  list(APPEND KOKKOS_LIBS dl)
    -else()
    -  # Remove profiling source file.
    -  list(REMOVE_ITEM KOKKOS_CORE_SRCS
    -       "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Profiling_Interface.cpp")
    -endif()
    -
    -# Use GCC toolchain with Clang.
    -if(KOKKOS_CXX_COMPILER_ID STREQUAL Clang AND NOT APPLE)
    -  find_program(KOKKOS_GCC_PATH g++)
    -  if(NOT KOKKOS_GCC_PATH)
    -    message(FATAL_ERROR "Can't find GCC path to get toolchain for Clang.")
    -  endif()
    -  string(REPLACE "/bin/g++" "" KOKKOS_GCC_PATH ${KOKKOS_GCC_PATH})
    -
    -  list(APPEND KOKKOS_CXX_FLAGS --gcc-toolchain=${KOKKOS_GCC_PATH})
    -  list(APPEND KOKKOS_LD_FLAGS --gcc-toolchain=${KOKKOS_GCC_PATH})
    -endif()
    -
    -############################ Detect if submodule ###############################
    -#
    -# With thanks to StackOverflow:  
    -#      http://stackoverflow.com/questions/25199677/how-to-detect-if-current-scope-has-a-parent-in-cmake
    -#
    -get_directory_property(HAS_PARENT PARENT_DIRECTORY)
    -if(HAS_PARENT)
    -  message(STATUS "Submodule build")
    -  SET(KOKKOS_HEADER_DIR "include/kokkos")
    -else()
    -  message(STATUS "Standalone build")
    -  SET(KOKKOS_HEADER_DIR "include")
    -endif()
    -
    -############################ PRINT CONFIGURE STATUS ############################
    -
    -message(STATUS "")
    -message(STATUS "****************** Kokkos Settings ******************")
    -message(STATUS "Execution Spaces")
    -
    -if(KOKKOS_ENABLE_CUDA)
    -  message(STATUS "  Device Parallel: Cuda")
    -else()
    -  message(STATUS "  Device Parallel: None")
    -endif()
    -
    -if(KOKKOS_ENABLE_OPENMP)
    -  message(STATUS "    Host Parallel: OpenMP")
    -elseif(KOKKOS_ENABLE_PTHREAD)
    -  message(STATUS "    Host Parallel: Pthread")
    -elseif(KOKKOS_ENABLE_QTHREADS)
    -  message(STATUS "    Host Parallel: Qthreads")
    -else()
    -  message(STATUS "    Host Parallel: None")
    -endif()
    -
    -if(KOKKOS_ENABLE_SERIAL)
    -  message(STATUS "      Host Serial: Serial")
    -else()
    -  message(STATUS "      Host Serial: None")
    -endif()
    -
    -message(STATUS "")
    -message(STATUS "Architectures")
    -message(STATUS "    Host Architecture: ${KOKKOS_HOST_ARCH}")
    -message(STATUS "  Device Architecture: ${KOKKOS_GPU_ARCH}")
    -
    -message(STATUS "")
    -message(STATUS "Enabled options")
    -
    -if(KOKKOS_SEPARATE_LIBS)
    -  message(STATUS "  KOKKOS_SEPARATE_LIBS")
    -endif()
    -
    -if(KOKKOS_ENABLE_HWLOC)
    -  message(STATUS "  KOKKOS_ENABLE_HWLOC")
    -endif()
    -
    -if(KOKKOS_ENABLE_MEMKIND)
    -  message(STATUS "  KOKKOS_ENABLE_MEMKIND")
    -endif()
    -
    -if(KOKKOS_DEBUG)
    -  message(STATUS "  KOKKOS_DEBUG")
    -endif()
    -
    -if(KOKKOS_ENABLE_PROFILING)
    -  message(STATUS "  KOKKOS_ENABLE_PROFILING")
    -endif()
    -
    -if(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION)
    -  message(STATUS "  KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION")
    -endif()
    -
    -if(KOKKOS_ENABLE_CUDA)
    -  if(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC)
    -    message(STATUS "  KOKKOS_ENABLE_CUDA_LDG_INTRINSIC")
    -  endif()
    -
    -  if(KOKKOS_ENABLE_CUDA_UVM)
    -    message(STATUS "  KOKKOS_ENABLE_CUDA_UVM")
    -  endif()
    -
    -  if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE)
    -    message(STATUS "  KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE")
    -  endif()
    -
    -  if(KOKKOS_ENABLE_CUDA_LAMBDA)
    -    message(STATUS "  KOKKOS_ENABLE_CUDA_LAMBDA")
    -  endif()
    -
    -  if(KOKKOS_CUDA_DIR)
    -    message(STATUS "  KOKKOS_CUDA_DIR: ${KOKKOS_CUDA_DIR}")
    -  endif()
    -endif()
    -
    -if(KOKKOS_QTHREADS_DIR)
    -  message(STATUS "  KOKKOS_QTHREADS_DIR: ${KOKKOS_QTHREADS_DIR}")
    -endif()
    -
    -if(KOKKOS_HWLOC_DIR)
    -  message(STATUS "  KOKKOS_HWLOC_DIR: ${KOKKOS_HWLOC_DIR}")
    -endif()
    -
    -if(KOKKOS_MEMKIND_DIR)
    -  message(STATUS "  KOKKOS_MEMKIND_DIR: ${KOKKOS_MEMKIND_DIR}")
    -endif()
    -
    -message(STATUS "*****************************************************")
    -message(STATUS "")
    -
    -################################ SET UP PROJECT ################################
    -
    -configure_file(
    -  ${Kokkos_SOURCE_DIR}/core/cmake/KokkosCore_config.h.in
    -  ${Kokkos_BINARY_DIR}/KokkosCore_config.h
    -)
    -
    -SET(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
    -SET(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
    -SET(INSTALL_INCLUDE_DIR ${KOKKOS_HEADER_DIR} CACHE PATH
    -  "Installation directory for header files")
    -IF(WIN32 AND NOT CYGWIN)
    -  SET(DEF_INSTALL_CMAKE_DIR CMake)
    -ELSE()
    -  SET(DEF_INSTALL_CMAKE_DIR lib/CMake/Kokkos)
    -ENDIF()
    -
    -SET(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
    -    "Installation directory for CMake files")
    -
    -# Make relative paths absolute (needed later on)
    -FOREACH(p LIB BIN INCLUDE CMAKE)
    -  SET(var INSTALL_${p}_DIR)
    -  IF(NOT IS_ABSOLUTE "${${var}}")
    -    SET(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
    -  ENDIF()
    -ENDFOREACH()
    -
    -# set up include-directories
    -SET (Kokkos_INCLUDE_DIRS
    -    ${Kokkos_SOURCE_DIR}/core/src
    -    ${Kokkos_SOURCE_DIR}/containers/src
    -    ${Kokkos_SOURCE_DIR}/algorithms/src
    -    ${Kokkos_BINARY_DIR}  # to find KokkosCore_config.h
    -)
    -
    -INCLUDE_DIRECTORIES(${Kokkos_INCLUDE_DIRS})
    -
    -IF(KOKKOS_SEPARATE_LIBS)
    -  # kokkoscore
    -  ADD_LIBRARY(
    -    kokkoscore
    -    ${KOKKOS_CORE_SRCS}
    -  )
    -
    -  target_compile_options(
    -    kokkoscore
    -    PUBLIC ${KOKKOS_CXX_FLAGS}
    -  )
    -
    -  target_compile_features(
    -    kokkoscore
    -    PUBLIC ${KOKKOS_CXX11_FEATURES}
    -  )
    -
    -  # Install the kokkoscore library
    -  INSTALL (TARGETS kokkoscore
    -           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
    -  )
    -
    -  # Install the kokkoscore headers
    -  INSTALL (DIRECTORY
    -           ${Kokkos_SOURCE_DIR}/core/src/
    -           DESTINATION ${KOKKOS_HEADER_DIR} 
    -           FILES_MATCHING PATTERN "*.hpp"
    -  )
    -
    -  # Install KokkosCore_config.h header
    -  INSTALL (FILES
    -           ${Kokkos_BINARY_DIR}/KokkosCore_config.h
    -           DESTINATION ${KOKKOS_HEADER_DIR}
    -  )
    -
    -  TARGET_LINK_LIBRARIES(
    -    kokkoscore
    -    ${KOKKOS_LD_FLAGS}
    -    ${KOKKOS_LIBS}
    -  )
    -
    -  # kokkoscontainers
    -  ADD_LIBRARY(
    -    kokkoscontainers
    -    ${KOKKOS_CONTAINERS_SRCS}
    -  )
    -
    -  TARGET_LINK_LIBRARIES(
    -    kokkoscontainers
    -    kokkoscore
    -  )
    -
    -  # Install the kokkocontainers library
    -  INSTALL (TARGETS kokkoscontainers
    -           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
    -
    -  # Install the kokkoscontainers headers
    -  INSTALL (DIRECTORY
    -           ${Kokkos_SOURCE_DIR}/containers/src/
    -           DESTINATION ${KOKKOS_HEADER_DIR} 
    -           FILES_MATCHING PATTERN "*.hpp"
    -  )
    -
    -  # kokkosalgorithms - Build as interface library since no source files.
    -  ADD_LIBRARY(
    -    kokkosalgorithms
    -    INTERFACE
    -  )
    -
    -  target_include_directories(
    -    kokkosalgorithms
    -    INTERFACE ${Kokkos_SOURCE_DIR}/algorithms/src
    -  )
    -
    -  TARGET_LINK_LIBRARIES(
    -    kokkosalgorithms
    -    INTERFACE kokkoscore
    -  )
    -
    -  # Install the kokkoalgorithms library
    -  INSTALL (TARGETS kokkosalgorithms
    -           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
    -
    -  # Install the kokkosalgorithms headers
    -  INSTALL (DIRECTORY
    -           ${Kokkos_SOURCE_DIR}/algorithms/src/
    -           DESTINATION ${KOKKOS_INSTALL_INDLUDE_DIR}
    -           FILES_MATCHING PATTERN "*.hpp"
    -  )
    -
    -  SET (Kokkos_LIBRARIES_NAMES kokkoscore kokkoscontainers kokkosalgorithms)
    -
    -ELSE()
    -  # kokkos
    -  ADD_LIBRARY(
    -    kokkos
    -    ${KOKKOS_CORE_SRCS}
    -    ${KOKKOS_CONTAINERS_SRCS}
    -  )
    -
    -  target_compile_options(
    -    kokkos
    -    PUBLIC ${KOKKOS_CXX_FLAGS}
    -  )
    -
    -  target_compile_features(
    -    kokkos
    -    PUBLIC ${KOKKOS_CXX11_FEATURES}
    -  )
    -
    -  TARGET_LINK_LIBRARIES(
    -    kokkos
    -    ${KOKKOS_LD_FLAGS}
    -    ${KOKKOS_LIBS}
    -  )
    -
    -  # Install the kokkos library
    -  INSTALL (TARGETS kokkos
    -           EXPORT KokkosTargets
    -           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    -           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
    -
    -
    -  # Install the kokkos headers
    -  INSTALL (DIRECTORY
    -           EXPORT KokkosTargets
    -           ${Kokkos_SOURCE_DIR}/core/src/
    -           DESTINATION ${KOKKOS_HEADER_DIR}
    -           FILES_MATCHING PATTERN "*.hpp"
    -  )
    -  INSTALL (DIRECTORY
    -           EXPORT KokkosTargets
    -           ${Kokkos_SOURCE_DIR}/containers/src/
    -           DESTINATION ${KOKKOS_HEADER_DIR}
    -           FILES_MATCHING PATTERN "*.hpp"
    -  )
    -  INSTALL (DIRECTORY
    -           EXPORT KokkosTargets
    -           ${Kokkos_SOURCE_DIR}/algorithms/src/
    -           DESTINATION ${KOKKOS_HEADER_DIR}
    -           FILES_MATCHING PATTERN "*.hpp"
    -  )
    -
    -  INSTALL (FILES
    -           ${Kokkos_BINARY_DIR}/KokkosCore_config.h
    -           DESTINATION ${KOKKOS_HEADER_DIR}
    -  )
    -
    -  include_directories(${Kokkos_BINARY_DIR})
    -  include_directories(${Kokkos_SOURCE_DIR}/core/src)
    -  include_directories(${Kokkos_SOURCE_DIR}/containers/src)
    -  include_directories(${Kokkos_SOURCE_DIR}/algorithms/src)
    -
    -
    -  SET (Kokkos_LIBRARIES_NAMES kokkos)
    -
    -endif()
    -
    -# Add all targets to the build-tree export set
    -export(TARGETS ${Kokkos_LIBRARIES_NAMES}
    -  FILE "${Kokkos_BINARY_DIR}/KokkosTargets.cmake")
    -
    -# Export the package for use from the build-tree
    -# (this registers the build-tree with a global CMake-registry)
    -export(PACKAGE Kokkos)
    -
    -# Create the KokkosConfig.cmake and KokkosConfigVersion files
    -file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
    -   "${INSTALL_INCLUDE_DIR}")
    -# ... for the build tree
    -set(CONF_INCLUDE_DIRS "${Kokkos_SOURCE_DIR}" "${Kokkos_BINARY_DIR}")
    -configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in
    -  "${Kokkos_BINARY_DIR}/KokkosConfig.cmake" @ONLY)
    -# ... for the install tree
    -set(CONF_INCLUDE_DIRS "\${Kokkos_CMAKE_DIR}/${REL_INCLUDE_DIR}")
    -configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in
    -  "${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake" @ONLY)
    -
    -# Install the KokkosConfig.cmake and KokkosConfigVersion.cmake
    -install(FILES
    -  "${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake"
    -  DESTINATION "${INSTALL_CMAKE_DIR}")
    -
    -# Install the export set for use with the install-tree
    -INSTALL(EXPORT KokkosTargets DESTINATION
    -       "${INSTALL_CMAKE_DIR}")
    diff --git a/lib/kokkos/cmake/kokkos_build.cmake b/lib/kokkos/cmake/kokkos_build.cmake
    new file mode 100644
    index 0000000000..f31680d6e2
    --- /dev/null
    +++ b/lib/kokkos/cmake/kokkos_build.cmake
    @@ -0,0 +1,219 @@
    +# kokkos_generated_settings.cmake includes the kokkos library itself in KOKKOS_LIBS
    +# which we do not want to use for the cmake builds so clean this up
    +string(REGEX REPLACE "-lkokkos" "" KOKKOS_LIBS ${KOKKOS_LIBS})
    +
    +############################ Detect if submodule ###############################
    +#
    +# With thanks to StackOverflow:  
    +#      http://stackoverflow.com/questions/25199677/how-to-detect-if-current-scope-has-a-parent-in-cmake
    +#
    +get_directory_property(HAS_PARENT PARENT_DIRECTORY)
    +if(HAS_PARENT)
    +  message(STATUS "Submodule build")
    +  SET(KOKKOS_HEADER_DIR "include/kokkos")
    +else()
    +  message(STATUS "Standalone build")
    +  SET(KOKKOS_HEADER_DIR "include")
    +endif()
    +
    +################################ Handle the actual build #######################
    +
    +SET(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
    +SET(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
    +SET(INSTALL_INCLUDE_DIR ${KOKKOS_HEADER_DIR} CACHE PATH
    +  "Installation directory for header files")
    +IF(WIN32 AND NOT CYGWIN)
    +  SET(DEF_INSTALL_CMAKE_DIR CMake)
    +ELSE()
    +  SET(DEF_INSTALL_CMAKE_DIR lib/CMake/Kokkos)
    +ENDIF()
    +
    +SET(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
    +    "Installation directory for CMake files")
    +
    +# Make relative paths absolute (needed later on)
    +FOREACH(p LIB BIN INCLUDE CMAKE)
    +  SET(var INSTALL_${p}_DIR)
    +  IF(NOT IS_ABSOLUTE "${${var}}")
    +    SET(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
    +  ENDIF()
    +ENDFOREACH()
    +
    +# set up include-directories
    +SET (Kokkos_INCLUDE_DIRS
    +    ${Kokkos_SOURCE_DIR}/core/src
    +    ${Kokkos_SOURCE_DIR}/containers/src
    +    ${Kokkos_SOURCE_DIR}/algorithms/src
    +    ${Kokkos_BINARY_DIR}  # to find KokkosCore_config.h
    +    ${KOKKOS_INCLUDE_DIRS}
    +)
    +
    +# pass include dirs back to parent scope
    +if(HAS_PARENT)
    +SET(Kokkos_INCLUDE_DIRS_RET ${Kokkos_INCLUDE_DIRS} PARENT_SCOPE)
    +else()
    +SET(Kokkos_INCLUDE_DIRS_RET ${Kokkos_INCLUDE_DIRS})
    +endif()
    +
    +INCLUDE_DIRECTORIES(${Kokkos_INCLUDE_DIRS})
    +
    +IF(KOKKOS_SEPARATE_LIBS)
    +  # Sources come from makefile-generated kokkos_generated_settings.cmake file
    +  # Separate libs need to separate the sources
    +  set_kokkos_srcs(KOKKOS_SRC ${KOKKOS_SRC})
    +
    +  # kokkoscore
    +  ADD_LIBRARY(
    +    kokkoscore
    +    ${KOKKOS_CORE_SRCS}
    +  )
    +
    +  target_compile_options(
    +    kokkoscore
    +    PUBLIC $<$:${KOKKOS_CXX_FLAGS}>
    +  )
    +
    +  # Install the kokkoscore library
    +  INSTALL (TARGETS kokkoscore
    +           EXPORT KokkosTargets
    +           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
    +  )
    +
    +  TARGET_LINK_LIBRARIES(
    +    kokkoscore
    +    ${KOKKOS_LD_FLAGS}
    +    ${KOKKOS_EXTRA_LIBS_LIST}
    +  )
    +
    +  # kokkoscontainers
    +  if (DEFINED KOKKOS_CONTAINERS_SRCS)
    +    ADD_LIBRARY(
    +      kokkoscontainers
    +      ${KOKKOS_CONTAINERS_SRCS}
    +    )
    +  endif()
    +
    +  TARGET_LINK_LIBRARIES(
    +    kokkoscontainers
    +    kokkoscore
    +  )
    +
    +  # Install the kokkocontainers library
    +  INSTALL (TARGETS kokkoscontainers
    +           EXPORT KokkosTargets
    +           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
    +
    +  # kokkosalgorithms - Build as interface library since no source files.
    +  ADD_LIBRARY(
    +    kokkosalgorithms
    +    INTERFACE
    +  )
    +
    +  target_include_directories(
    +    kokkosalgorithms
    +    INTERFACE ${Kokkos_SOURCE_DIR}/algorithms/src
    +  )
    +
    +  TARGET_LINK_LIBRARIES(
    +    kokkosalgorithms
    +    INTERFACE kokkoscore
    +  )
    +
    +  # Install the kokkoalgorithms library
    +  INSTALL (TARGETS kokkosalgorithms
    +           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
    +
    +  SET (Kokkos_LIBRARIES_NAMES kokkoscore kokkoscontainers kokkosalgorithms)
    +
    +ELSE()
    +  # kokkos
    +  ADD_LIBRARY(
    +    kokkos
    +    ${KOKKOS_CORE_SRCS}
    +    ${KOKKOS_CONTAINERS_SRCS}
    +  )
    +
    +  target_compile_options(
    +    kokkos
    +    PUBLIC $<$:${KOKKOS_CXX_FLAGS}>
    +  )
    +
    +  TARGET_LINK_LIBRARIES(
    +    kokkos
    +    ${KOKKOS_LD_FLAGS}
    +    ${KOKKOS_EXTRA_LIBS_LIST}
    +  )
    +
    +  # Install the kokkos library
    +  INSTALL (TARGETS kokkos
    +           EXPORT KokkosTargets
    +           ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    +           RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
    +
    +
    +  SET (Kokkos_LIBRARIES_NAMES kokkos)
    +
    +endif()  # KOKKOS_SEPARATE_LIBS
    +
    +# Install the kokkos headers
    +INSTALL (DIRECTORY
    +         EXPORT KokkosTargets
    +         ${Kokkos_SOURCE_DIR}/core/src/
    +         DESTINATION ${KOKKOS_HEADER_DIR}
    +         FILES_MATCHING PATTERN "*.hpp"
    +)
    +INSTALL (DIRECTORY
    +         EXPORT KokkosTargets
    +         ${Kokkos_SOURCE_DIR}/containers/src/
    +         DESTINATION ${KOKKOS_HEADER_DIR}
    +         FILES_MATCHING PATTERN "*.hpp"
    +)
    +INSTALL (DIRECTORY
    +         EXPORT KokkosTargets
    +         ${Kokkos_SOURCE_DIR}/algorithms/src/
    +         DESTINATION ${KOKKOS_HEADER_DIR}
    +         FILES_MATCHING PATTERN "*.hpp"
    +)
    +
    +INSTALL (FILES
    +         ${Kokkos_BINARY_DIR}/KokkosCore_config.h
    +         DESTINATION ${KOKKOS_HEADER_DIR}
    +)
    +
    +# Add all targets to the build-tree export set
    +export(TARGETS ${Kokkos_LIBRARIES_NAMES}
    +  FILE "${Kokkos_BINARY_DIR}/KokkosTargets.cmake")
    +
    +# Export the package for use from the build-tree
    +# (this registers the build-tree with a global CMake-registry)
    +export(PACKAGE Kokkos)
    +
    +# Create the KokkosConfig.cmake and KokkosConfigVersion files
    +file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
    +   "${INSTALL_INCLUDE_DIR}")
    +# ... for the build tree
    +set(CONF_INCLUDE_DIRS "${Kokkos_SOURCE_DIR}" "${Kokkos_BINARY_DIR}")
    +configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in
    +  "${Kokkos_BINARY_DIR}/KokkosConfig.cmake" @ONLY)
    +# ... for the install tree
    +set(CONF_INCLUDE_DIRS "\${Kokkos_CMAKE_DIR}/${REL_INCLUDE_DIR}")
    +configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in
    +  "${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake" @ONLY)
    +
    +# Install the KokkosConfig.cmake and KokkosConfigVersion.cmake
    +install(FILES
    +  "${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake"
    +  DESTINATION "${INSTALL_CMAKE_DIR}")
    +
    +#This seems not to do anything?
    +#message(STATUS "KokkosTargets: " ${KokkosTargets})
    +# Install the export set for use with the install-tree
    +INSTALL(EXPORT KokkosTargets DESTINATION
    +       "${INSTALL_CMAKE_DIR}")
    diff --git a/lib/kokkos/cmake/kokkos_functions.cmake b/lib/kokkos/cmake/kokkos_functions.cmake
    new file mode 100644
    index 0000000000..c0c62ccb6a
    --- /dev/null
    +++ b/lib/kokkos/cmake/kokkos_functions.cmake
    @@ -0,0 +1,345 @@
    +################################### FUNCTIONS ##################################
    +# List of functions
    +#   set_kokkos_cxx_compiler
    +#   set_kokkos_cxx_standard
    +#   set_kokkos_srcs
    +
    +#-------------------------------------------------------------------------------
    +# function(set_kokkos_cxx_compiler)
    +# Sets the following compiler variables that are analogous to the CMAKE_*
    +# versions.  We add the ability to detect NVCC (really nvcc_wrapper).
    +#   KOKKOS_CXX_COMPILER
    +#   KOKKOS_CXX_COMPILER_ID
    +#   KOKKOS_CXX_COMPILER_VERSION
    +#
    +# Inputs:
    +#   KOKKOS_ENABLE_CUDA
    +#   CMAKE_CXX_COMPILER
    +#   CMAKE_CXX_COMPILER_ID
    +#   CMAKE_CXX_COMPILER_VERSION
    +#
    +# Also verifies the compiler version meets the minimum required by Kokkos.
    +function(set_kokkos_cxx_compiler)
    +  # Since CMake doesn't recognize the nvcc compiler until 3.8, we use our own
    +  # version of the CMake variables and detect nvcc ourselves.  Initially set to
    +  # the CMake variable values.
    +  set(INTERNAL_CXX_COMPILER ${CMAKE_CXX_COMPILER})
    +  set(INTERNAL_CXX_COMPILER_ID ${CMAKE_CXX_COMPILER_ID})
    +  set(INTERNAL_CXX_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
    +
    +  # Check if the compiler is nvcc (which really means nvcc_wrapper).
    +  execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version
    +                  COMMAND grep nvcc
    +                  COMMAND wc -l
    +                  OUTPUT_VARIABLE INTERNAL_HAVE_COMPILER_NVCC
    +                  OUTPUT_STRIP_TRAILING_WHITESPACE)
    +
    +  string(REGEX REPLACE "^ +" ""
    +         INTERNAL_HAVE_COMPILER_NVCC ${INTERNAL_HAVE_COMPILER_NVCC})
    +
    +  if(INTERNAL_HAVE_COMPILER_NVCC)
    +    # Set the compiler id to nvcc.  We use the value used by CMake 3.8.
    +    set(INTERNAL_CXX_COMPILER_ID NVIDIA)
    +
    +    # Set nvcc's compiler version.
    +    execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version
    +                    COMMAND grep release
    +                    OUTPUT_VARIABLE INTERNAL_CXX_COMPILER_VERSION
    +                    OUTPUT_STRIP_TRAILING_WHITESPACE)
    +
    +    string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+$"
    +           INTERNAL_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION})
    +  endif()
    +
    +  # Enforce the minimum compilers supported by Kokkos.
    +  set(KOKKOS_MESSAGE_TEXT "Compiler not supported by Kokkos.  Required compiler versions:")
    +  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    Clang      3.5.2 or higher")
    +  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    GCC        4.8.4 or higher")
    +  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    Intel     15.0.2 or higher")
    +  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    NVCC      7.0.28 or higher")
    +  set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n    PGI         17.1 or higher\n")
    +
    +  if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang)
    +    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 3.5.2)
    +      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    +    endif()
    +  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL GNU)
    +    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.8.4)
    +      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    +    endif()
    +  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL Intel)
    +    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 15.0.2)
    +      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    +    endif()
    +  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
    +    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 7.0.28)
    +      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    +    endif()
    +  elseif(INTERNAL_CXX_COMPILER_ID STREQUAL PGI)
    +    if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 17.1)
    +      message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
    +    endif()
    +  endif()
    +
    +  # Enforce that extensions are turned off for nvcc_wrapper.
    +  if(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
    +    if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL ON)
    +      message(FATAL_ERROR "NVCC doesn't support C++ extensions.  Set CMAKE_CXX_EXTENSIONS to OFF in your CMakeLists.txt.")
    +    endif()
    +  endif()
    +
    +  if(KOKKOS_ENABLE_CUDA)
    +    # Enforce that the compiler can compile CUDA code.
    +    if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang)
    +      if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.0.0)
    +        message(FATAL_ERROR "Compiling CUDA code directly with Clang requires version 4.0.0 or higher.")
    +      endif()
    +    elseif(NOT INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
    +      message(FATAL_ERROR "Invalid compiler for CUDA.  The compiler must be nvcc_wrapper or Clang.")
    +    endif()
    +  endif()
    +
    +  set(KOKKOS_CXX_COMPILER ${INTERNAL_CXX_COMPILER} PARENT_SCOPE)
    +  set(KOKKOS_CXX_COMPILER_ID ${INTERNAL_CXX_COMPILER_ID} PARENT_SCOPE)
    +  set(KOKKOS_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION} PARENT_SCOPE)
    +endfunction()
    +
    +#-------------------------------------------------------------------------------
    +# function(set_kokkos_cxx_standard)
    +#  Transitively enforces that the appropriate CXX standard compile flags (C++11
    +#  or above) are added to targets that use the Kokkos library.  Compile features
    +#  are used if possible.  Otherwise, the appropriate flags are added to
    +#  KOKKOS_CXX_FLAGS.  Values set by the user to CMAKE_CXX_STANDARD and
    +#  CMAKE_CXX_EXTENSIONS are honored.
    +#
    +# Outputs:
    +#   KOKKOS_CXX11_FEATURES
    +#   KOKKOS_CXX_FLAGS
    +#
    +# Inputs:
    +#  KOKKOS_CXX_COMPILER
    +#  KOKKOS_CXX_COMPILER_ID
    +#  KOKKOS_CXX_COMPILER_VERSION
    +#
    +function(set_kokkos_cxx_standard)
    +  # The following table lists the versions of CMake that supports CXX_STANDARD
    +  # and the CXX compile features for different compilers.  The versions are
    +  # based on CMake documentation, looking at CMake code, and verifying by
    +  # testing with specific CMake versions.
    +  #
    +  #   COMPILER                      CXX_STANDARD     Compile Features
    +  #   ---------------------------------------------------------------
    +  #   Clang                             3.1                3.1
    +  #   GNU                               3.1                3.2
    +  #   AppleClang                        3.2                3.2
    +  #   Intel                             3.6                3.6
    +  #   Cray                              No                 No
    +  #   PGI                               No                 No
    +  #   XL                                No                 No
    +  #
    +  # For compiling CUDA code using nvcc_wrapper, we will use the host compiler's
    +  # flags for turning on C++11.  Since for compiler ID and versioning purposes
    +  # CMake recognizes the host compiler when calling nvcc_wrapper, this just
    +  # works.  Both NVCC and nvcc_wrapper only recognize '-std=c++11' which means
    +  # that we can only use host compilers for CUDA builds that use those flags.
    +  # It also means that extensions (gnu++11) can't be turned on for CUDA builds.
    +
    +  # Check if we can use compile features.
    +  if(NOT KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
    +    if(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
    +      if(NOT CMAKE_VERSION VERSION_LESS 3.1)
    +        set(INTERNAL_USE_COMPILE_FEATURES ON)
    +      endif()
    +    elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang OR CMAKE_CXX_COMPILER_ID STREQUAL GNU)
    +      if(NOT CMAKE_VERSION VERSION_LESS 3.2)
    +        set(INTERNAL_USE_COMPILE_FEATURES ON)
    +      endif()
    +    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
    +      if(NOT CMAKE_VERSION VERSION_LESS 3.6)
    +        set(INTERNAL_USE_COMPILE_FEATURES ON)
    +      endif()
    +    endif()
    +  endif()
    +
    +  if(INTERNAL_USE_COMPILE_FEATURES)
    +    # Use the compile features aspect of CMake to transitively cause C++ flags
    +    # to populate to user code.
    +
    +    # I'm using a hack by requiring features that I know force the lowest version
    +    # of the compilers we want to support.  Clang 3.3 and later support all of
    +    # the C++11 standard.  With CMake 3.8 and higher, we could switch to using
    +    # cxx_std_11.
    +    set(KOKKOS_CXX11_FEATURES
    +        cxx_nonstatic_member_init # Forces GCC 4.7 or later and Intel 14.0 or later.
    +        PARENT_SCOPE
    +       )
    +  else()
    +    # CXX compile features are not yet implemented for this combination of
    +    # compiler and version of CMake.
    +
    +    if(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
    +      # Versions of CMAKE before 3.2 don't support CXX_STANDARD or C++ compile
    +      # features for the AppleClang compiler.  Set compiler flags transitively
    +      # here such that they trickle down to a call to target_compile_options().
    +
    +      # The following two blocks of code were copied from
    +      # /Modules/Compiler/AppleClang-CXX.cmake from CMake 3.7.2 and then
    +      # modified.
    +      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0)
    +        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
    +        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
    +      endif()
    +
    +      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.1)
    +        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
    +        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
    +      elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
    +        # AppleClang 5.0 knows this flag, but does not set a __cplusplus macro
    +        # greater than 201103L.
    +        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
    +        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
    +      endif()
    +    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
    +      # Versions of CMAKE before 3.6 don't support CXX_STANDARD or C++ compile
    +      # features for the Intel compiler.  Set compiler flags transitively here
    +      # such that they trickle down to a call to target_compile_options().
    +
    +      # The following three blocks of code were copied from
    +      # /Modules/Compiler/Intel-CXX.cmake from CMake 3.7.2 and then modified.
    +      if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
    +        set(_std -Qstd)
    +        set(_ext c++)
    +      else()
    +        set(_std -std)
    +        set(_ext gnu++)
    +      endif()
    +
    +      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.2)
    +        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++14")
    +        # TODO: There is no gnu++14 value supported; figure out what to do.
    +        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++14")
    +      elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.0)
    +        set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++1y")
    +        # TODO: There is no gnu++14 value supported; figure out what to do.
    +        set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++1y")
    +      endif()
    +
    +      if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
    +        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++11")
    +        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}11")
    +      elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
    +        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++0x")
    +        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}0x")
    +      endif()
    +    elseif(CMAKE_CXX_COMPILER_ID STREQUAL Cray)
    +      # CMAKE doesn't support CXX_STANDARD or C++ compile features for the Cray
    +      # compiler.  Set compiler options transitively here such that they trickle
    +      # down to a call to target_compile_options().
    +      set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-hstd=c++11")
    +      set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-hstd=c++11")
    +      set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-hstd=c++11")
    +      set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-hstd=c++11")
    +    elseif(CMAKE_CXX_COMPILER_ID STREQUAL PGI)
    +      # CMAKE doesn't support CXX_STANDARD or C++ compile features for the PGI
    +      # compiler.  Set compiler options transitively here such that they trickle
    +      # down to a call to target_compile_options().
    +      set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "--c++11")
    +      set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "--c++11")
    +      set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "--c++11")
    +      set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "--c++11")
    +    elseif(CMAKE_CXX_COMPILER_ID STREQUAL XL)
    +      # CMAKE doesn't support CXX_STANDARD or C++ compile features for the XL
    +      # compiler.  Set compiler options transitively here such that they trickle
    +      # down to a call to target_compile_options().
    +      set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
    +      set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11")
    +      set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++11")
    +      set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=c++11")
    +    else()
    +      # Assume GNU.  CMAKE_CXX_STANDARD is handled correctly by CMake 3.1 and
    +      # above for this compiler.  If the user explicitly requests a C++
    +      # standard, CMake takes care of it.  If not, transitively require C++11.
    +      if(NOT CMAKE_CXX_STANDARD)
    +        set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION ${CMAKE_CXX11_STANDARD_COMPILE_OPTION})
    +        set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION ${CMAKE_CXX11_EXTENSION_COMPILE_OPTION})
    +      endif()
    +    endif()
    +
    +    # Set the C++ standard info for Kokkos respecting user set values for
    +    # CMAKE_CXX_STANDARD and CMAKE_CXX_EXTENSIONS.
    +    # Only use cxx extension if explicitly requested
    +    if(CMAKE_CXX_STANDARD EQUAL 14)
    +      if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL ON)
    +        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_EXTENSION_COMPILE_OPTION})
    +      else()
    +        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_STANDARD_COMPILE_OPTION})
    +      endif()
    +    elseif(CMAKE_CXX_STANDARD EQUAL 11)
    +      if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL ON)
    +        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION})
    +      else()
    +        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION})
    +      endif()
    +    else()
    +      # The user didn't explicitly request a standard, transitively require
    +      # C++11 respecting CMAKE_CXX_EXTENSIONS.
    +      if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL ON)
    +        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION})
    +      else()
    +        set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION})
    +      endif()
    +    endif()
    +
    +    set(KOKKOS_CXX_FLAGS ${INTERNAL_CXX_FLAGS} PARENT_SCOPE)
    +  endif()
    +endfunction()
    +
    +
    +#-------------------------------------------------------------------------------
    +# function(set_kokkos_sources)
    +# Takes a list of sources for kokkos (e.g., KOKKOS_SRC from Makefile.kokkos and
    +# put it into kokkos_generated_settings.cmake) and sorts the files into the subpackages or
    +# separate_libraries.  This is core and containers (algorithms is pure header
    +# files).
    +#
    +# Inputs:
    +#   KOKKOS_SRC
    +# 
    +# Outputs:
    +#   KOKKOS_CORE_SRCS
    +#   KOKKOS_CONTAINERS_SRCS
    +#
    +function(set_kokkos_srcs)
    +  set(opts ) # no-value args
    +  set(oneValArgs )
    +  set(multValArgs KOKKOS_SRC) # e.g., lists
    +  cmake_parse_arguments(IN "${opts}" "${oneValArgs}" "${multValArgs}" ${ARGN})
    +
    +  foreach(sfile ${IN_KOKKOS_SRC})
    +     string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" stripfile "${sfile}")
    +     string(REPLACE "/" ";" striplist "${stripfile}")
    +     list(GET striplist 0 firstdir)
    +     if(${firstdir} STREQUAL "core")
    +       list(APPEND KOKKOS_CORE_SRCS ${sfile})
    +     else()
    +       list(APPEND KOKKOS_CONTAINERS_SRCS ${sfile})
    +     endif()
    +  endforeach()
    +  set(KOKKOS_CORE_SRCS ${KOKKOS_CORE_SRCS} PARENT_SCOPE)
    +  set(KOKKOS_CONTAINERS_SRCS ${KOKKOS_CONTAINERS_SRCS} PARENT_SCOPE)
    +  return()
    +endfunction()
    +
    +# Setting a default value if it is not already set
    +macro(set_kokkos_default_default VARIABLE DEFAULT)
    +  IF( "${KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT}" STREQUAL "" )
    +    IF( "${KOKKOS_ENABLE_${VARIABLE}}" STREQUAL "" )
    +      set(KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT ${DEFAULT})
    +  #    MESSAGE(WARNING "Set: KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT to ${KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT}")
    +    ELSE()
    +      set(KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT ${KOKKOS_ENABLE_${VARIABLE}})
    +   #   MESSAGE(WARNING "Set: KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT to ${KOKKOS_INTERNAL_ENABLE_${VARIABLE}_DEFAULT}")
    +    ENDIF()
    +  ENDIF()
    +  UNSET(KOKKOS_ENABLE_${VARIABLE} CACHE)
    +endmacro()
    diff --git a/lib/kokkos/cmake/kokkos_options.cmake b/lib/kokkos/cmake/kokkos_options.cmake
    new file mode 100644
    index 0000000000..f17710a4ce
    --- /dev/null
    +++ b/lib/kokkos/cmake/kokkos_options.cmake
    @@ -0,0 +1,365 @@
    +########################## NOTES ###############################################
    +#  List the options for configuring kokkos using CMake method of doing it.
    +#  These options then get mapped onto KOKKOS_SETTINGS environment variable by
    +#  kokkos_settings.cmake.  It is separate to allow other packages to override
    +#  these variables (e.g., TriBITS).
    +
    +########################## AVAILABLE OPTIONS ###################################
    +# Use lists for documentation, verification, and programming convenience
    +
    +# All CMake options of the type KOKKOS_ENABLE_*
    +set(KOKKOS_INTERNAL_ENABLE_OPTIONS_LIST)
    +list(APPEND KOKKOS_INTERNAL_ENABLE_OPTIONS_LIST
    +     Serial
    +     OpenMP
    +     Pthread
    +     Qthread
    +     Cuda
    +     ROCm
    +     HWLOC
    +     MEMKIND
    +     LIBRT
    +     Cuda_Lambda
    +     Cuda_Relocatable_Device_Code
    +     Cuda_UVM
    +     Cuda_LDG_Intrinsic
    +     Debug
    +     Debug_DualView_Modify_Check
    +     Debug_Bounds_Checkt
    +     Compiler_Warnings
    +     Profiling
    +     Profiling_Load_Print
    +     Aggressive_Vectorization
    +     )
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- Recognize CamelCase Options ---------------------------
    +#-------------------------------------------------------------------------------
    +
    +foreach(opt ${KOKKOS_INTERNAL_ENABLE_OPTIONS_LIST})
    +  string(TOUPPER ${opt} OPT )
    +  IF(DEFINED Kokkos_ENABLE_${opt})
    +    IF(DEFINED KOKKOS_ENABLE_${OPT})
    +      IF(NOT ("${KOKKOS_ENABLE_${OPT}}" STREQUAL "${Kokkos_ENABLE_${opt}}"))
    +        IF(DEFINED KOKKOS_ENABLE_${OPT}_INTERNAL)
    +          MESSAGE(WARNING  "Defined both Kokkos_ENABLE_${opt}=[${Kokkos_ENABLE_${opt}}] and KOKKOS_ENABLE_${OPT}=[${KOKKOS_ENABLE_${OPT}}] and they differ! Could be caused by old CMakeCache Variable. Run CMake again and warning should disappear. If not you are truly setting both variables.")
    +          IF(NOT ("${Kokkos_ENABLE_${opt}}" STREQUAL "${KOKKOS_ENABLE_${OPT}_INTERNAL}"))
    +            UNSET(KOKKOS_ENABLE_${OPT} CACHE)
    +            SET(KOKKOS_ENABLE_${OPT} ${Kokkos_ENABLE_${opt}})
    +            MESSAGE(WARNING "SET BOTH VARIABLES KOKKOS_ENABLE_${OPT}: ${KOKKOS_ENABLE_${OPT}}")
    +          ELSE()
    +            SET(Kokkos_ENABLE_${opt} ${KOKKOS_ENABLE_${OPT}})
    +          ENDIF()
    +        ELSE()
    +          MESSAGE(FATAL_ERROR "Defined both Kokkos_ENABLE_${opt}=[${Kokkos_ENABLE_${opt}}] and KOKKOS_ENABLE_${OPT}=[${KOKKOS_ENABLE_${OPT}}] and they differ!")
    +        ENDIF()
    +      ENDIF()
    +    ELSE()
    +      SET(KOKKOS_INTERNAL_ENABLE_${OPT}_DEFAULT ${Kokkos_ENABLE_${opt}})
    +    ENDIF()
    +  ENDIF()
    +endforeach()
    +
    +IF(DEFINED Kokkos_Arch)
    +  IF(DEFINED KOKKOS_ARCH)
    +    IF(NOT (${KOKKOS_ARCH} STREQUAL "${Kokkos_Arch}"))
    +      MESSAGE(FATAL_ERROR "Defined both Kokkos_Arch and KOKKOS_ARCH and they differ!")
    +    ENDIF()
    +  ELSE()
    +    SET(KOKKOS_ARCH ${Kokkos_Arch})
    +  ENDIF()
    +ENDIF()
    +  
    +#-------------------------------------------------------------------------------
    +# List of possible host architectures.
    +#-------------------------------------------------------------------------------
    +set(KOKKOS_ARCH_LIST)
    +list(APPEND KOKKOS_ARCH_LIST
    +     None            # No architecture optimization
    +     AMDAVX          # (HOST) AMD chip
    +     ARMv80          # (HOST) ARMv8.0 Compatible CPU
    +     ARMv81          # (HOST) ARMv8.1 Compatible CPU
    +     ARMv8-ThunderX  # (HOST) ARMv8 Cavium ThunderX CPU
    +     WSM             # (HOST) Intel Westmere CPU
    +     SNB             # (HOST) Intel Sandy/Ivy Bridge CPUs
    +     HSW             # (HOST) Intel Haswell CPUs
    +     BDW             # (HOST) Intel Broadwell Xeon E-class CPUs
    +     SKX             # (HOST) Intel Sky Lake Xeon E-class HPC CPUs (AVX512)
    +     KNC             # (HOST) Intel Knights Corner Xeon Phi
    +     KNL             # (HOST) Intel Knights Landing Xeon Phi
    +     BGQ             # (HOST) IBM Blue Gene Q
    +     Power7          # (HOST) IBM POWER7 CPUs
    +     Power8          # (HOST) IBM POWER8 CPUs
    +     Power9          # (HOST) IBM POWER9 CPUs
    +     Kepler          # (GPU) NVIDIA Kepler default (generation CC 3.5)
    +     Kepler30        # (GPU) NVIDIA Kepler generation CC 3.0
    +     Kepler32        # (GPU) NVIDIA Kepler generation CC 3.2
    +     Kepler35        # (GPU) NVIDIA Kepler generation CC 3.5
    +     Kepler37        # (GPU) NVIDIA Kepler generation CC 3.7
    +     Maxwell         # (GPU) NVIDIA Maxwell default (generation CC 5.0)
    +     Maxwell50       # (GPU) NVIDIA Maxwell generation CC 5.0
    +     Maxwell52       # (GPU) NVIDIA Maxwell generation CC 5.2
    +     Maxwell53       # (GPU) NVIDIA Maxwell generation CC 5.3
    +     Pascal60        # (GPU) NVIDIA Pascal generation CC 6.0
    +     Pascal61        # (GPU) NVIDIA Pascal generation CC 6.1
    +    )
    +
    +# List of possible device architectures.
    +# The case and spelling here needs to match Makefile.kokkos
    +set(KOKKOS_DEVICES_LIST)
    +# Options: Cuda,ROCm,OpenMP,Pthread,Qthreads,Serial
    +list(APPEND KOKKOS_DEVICES_LIST
    +    Cuda          # NVIDIA GPU -- see below
    +    OpenMP        # OpenMP
    +    Pthread       # pthread
    +    Qthreads      # qthreads
    +    Serial        # serial
    +    ROCm          # Relocatable device code
    +    )
    +
    +# List of possible TPLs for Kokkos
    +# From Makefile.kokkos: Options: hwloc,librt,experimental_memkind
    +set(KOKKOS_USE_TPLS_LIST)
    +list(APPEND KOKKOS_USE_TPLS_LIST
    +    HWLOC          # hwloc
    +    LIBRT          # librt
    +    MEMKIND        # experimental_memkind
    +    )
    +# Map of cmake variables to Makefile variables
    +set(KOKKOS_INTERNAL_HWLOC hwloc)
    +set(KOKKOS_INTERNAL_LIBRT librt)
    +set(KOKKOS_INTERNAL_MEMKIND experimental_memkind)
    +
    +# List of possible Advanced options
    +set(KOKKOS_OPTIONS_LIST)
    +list(APPEND KOKKOS_OPTIONS_LIST
    +       AGGRESSIVE_VECTORIZATION    
    +       DISABLE_PROFILING          
    +       DISABLE_DUALVIEW_MODIFY_CHECK
    +       ENABLE_PROFILE_LOAD_PRINT   
    +    )
    +# Map of cmake variables to Makefile variables
    +set(KOKKOS_INTERNAL_LDG_INTRINSIC use_ldg)
    +set(KOKKOS_INTERNAL_UVM librt)
    +set(KOKKOS_INTERNAL_RELOCATABLE_DEVICE_CODE rdc)
    +
    +
    +#-------------------------------------------------------------------------------
    +# List of possible Options for CUDA
    +#-------------------------------------------------------------------------------
    +# From Makefile.kokkos: Options: use_ldg,force_uvm,rdc
    +set(KOKKOS_CUDA_OPTIONS_LIST)
    +list(APPEND KOKKOS_CUDA_OPTIONS_LIST
    +    LDG_INTRINSIC              # use_ldg
    +    UVM                        # force_uvm
    +    RELOCATABLE_DEVICE_CODE    # rdc
    +    LAMBDA                     # enable_lambda
    +    )
    +    
    +# Map of cmake variables to Makefile variables
    +set(KOKKOS_INTERNAL_LDG_INTRINSIC use_ldg)
    +set(KOKKOS_INTERNAL_UVM force_uvm)
    +set(KOKKOS_INTERNAL_RELOCATABLE_DEVICE_CODE rdc)
    +set(KOKKOS_INTERNAL_LAMBDA enable_lambda)
    +
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- Create doc strings ----------------------------
    +#-------------------------------------------------------------------------------
    +
    +set(tmpr "\n       ")
    +string(REPLACE ";" ${tmpr} KOKKOS_INTERNAL_ARCH_DOCSTR "${KOKKOS_ARCH_LIST}")
    +# This would be useful, but we use Foo_ENABLE mechanisms
    +#string(REPLACE ";" ${tmpr} KOKKOS_INTERNAL_DEVICES_DOCSTR "${KOKKOS_DEVICES_LIST}")
    +#string(REPLACE ";" ${tmpr} KOKKOS_INTERNAL_USE_TPLS_DOCSTR "${KOKKOS_USE_TPLS_LIST}")
    +#string(REPLACE ";" ${tmpr} KOKKOS_INTERNAL_CUDA_OPTIONS_DOCSTR "${KOKKOS_CUDA_OPTIONS_LIST}")
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- GENERAL OPTIONS -------------------------------
    +#-------------------------------------------------------------------------------
    +
    +# Setting this variable to a value other than "None" can improve host
    +# performance by turning on architecture specific code.
    +# NOT SET is used to determine if the option is passed in.  It is reset to
    +# default "None" down below.
    +set(KOKKOS_ARCH "NOT_SET" CACHE STRING 
    +      "Optimize for specific host architecture. Options are: ${KOKKOS_INTERNAL_ARCH_DOCSTR}")
    +
    +# Whether to build separate libraries or now
    +set(KOKKOS_SEPARATE_LIBS OFF CACHE BOOL "OFF = kokkos.  ON = kokkoscore, kokkoscontainers, and kokkosalgorithms.")
    +
    +# Qthreads options.
    +set(KOKKOS_QTHREADS_DIR "" CACHE PATH "Location of Qthreads library.")
    +
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- KOKKOS_DEVICES --------------------------------
    +#-------------------------------------------------------------------------------
    +# Figure out default settings
    +IF(Trilinos_ENABLE_Kokkos)             
    +  set_kokkos_default_default(SERIAL ON)
    +  set_kokkos_default_default(PTHREAD OFF)
    +  IF(TPL_ENABLE_QTHREAD)
    +    set_kokkos_default_default(QTHREADS ${TPL_ENABLE_QTHREAD})
    +  ELSE()
    +    set_kokkos_default_default(QTHREADS OFF)
    +  ENDIF()
    +  IF(Trilinos_ENABLE_OpenMP)
    +    set_kokkos_default_default(OPENMP ${Trilinos_ENABLE_OpenMP})
    +  ELSE()
    +    set_kokkos_default_default(OPENMP OFF)
    +  ENDIF()
    +  IF(TPL_ENABLE_CUDA)
    +    set_kokkos_default_default(CUDA ${TPL_ENABLE_CUDA})
    +  ELSE()
    +    set_kokkos_default_default(CUDA OFF)
    +  ENDIF()
    +  set_kokkos_default_default(ROCM OFF)
    +ELSE()
    +  set_kokkos_default_default(SERIAL ON)
    +  set_kokkos_default_default(OPENMP OFF)
    +  set_kokkos_default_default(PTHREAD OFF)
    +  set_kokkos_default_default(QTHREAD OFF)
    +  set_kokkos_default_default(CUDA OFF)
    +  set_kokkos_default_default(ROCM OFF)
    +ENDIF()
    +
    +# Set which Kokkos backend to use.
    +# These are the actual options that define the settings.
    +set(KOKKOS_ENABLE_SERIAL ${KOKKOS_INTERNAL_ENABLE_SERIAL_DEFAULT} CACHE BOOL "Whether to enable the Kokkos::Serial device.  This device executes \"parallel\" kernels sequentially on a single CPU thread.  It is enabled by default.  If you disable this device, please enable at least one other CPU device, such as Kokkos::OpenMP or Kokkos::Threads.")
    +set(KOKKOS_ENABLE_OPENMP ${KOKKOS_INTERNAL_ENABLE_OPENMP_DEFAULT} CACHE BOOL "Enable OpenMP support in Kokkos." FORCE)
    +set(KOKKOS_ENABLE_PTHREAD ${KOKKOS_INTERNAL_ENABLE_PTHREAD_DEFAULT} CACHE BOOL "Enable Pthread support in Kokkos.")
    +set(KOKKOS_ENABLE_QTHREADS ${KOKKOS_INTERNAL_ENABLE_QTHREADS_DEFAULT} CACHE BOOL "Enable Qthreads support in Kokkos.")
    +set(KOKKOS_ENABLE_CUDA ${KOKKOS_INTERNAL_ENABLE_CUDA_DEFAULT} CACHE BOOL "Enable CUDA support in Kokkos.")
    +set(KOKKOS_ENABLE_ROCM ${KOKKOS_INTERNAL_ENABLE_ROCM_DEFAULT} CACHE BOOL "Enable ROCm support in Kokkos.")
    +
    +
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- KOKKOS DEBUG and PROFILING --------------------
    +#-------------------------------------------------------------------------------
    +
    +# Debug related options enable compiler warnings
    +
    +set_kokkos_default_default(DEBUG OFF)
    +set(KOKKOS_ENABLE_DEBUG ${KOKKOS_INTERNAL_ENABLE_DEBUG_DEFAULT} CACHE BOOL "Enable Kokkos Debug.")
    +
    +# From Makefile.kokkos: Advanced Options: 
    +#compiler_warnings, aggressive_vectorization, disable_profiling, disable_dualview_modify_check, enable_profile_load_print
    +set_kokkos_default_default(COMPILER_WARNINGS OFF)
    +set(KOKKOS_ENABLE_COMPILER_WARNINGS ${KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS_DEFAULT} CACHE BOOL "Enable compiler warnings.")
    +
    +set_kokkos_default_default(DEBUG_DUALVIEW_MODIFY_CHECK OFF)
    +set(KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK ${KOKKOS_INTERNAL_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK_DEFAULT} CACHE BOOL "Enable dualview modify check.")
    +
    +# Enable aggressive vectorization.
    +set_kokkos_default_default(AGGRESSIVE_VECTORIZATION OFF)
    +set(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION ${KOKKOS_INTERNAL_ENABLE_AGGRESSIVE_VECTORIZATION_DEFAULT} CACHE BOOL "Enable aggressive vectorization.")
    +
    +# Enable profiling.
    +set_kokkos_default_default(PROFILING ON)
    +set(KOKKOS_ENABLE_PROFILING ${KOKKOS_INTERNAL_ENABLE_PROFILING_DEFAULT} CACHE BOOL "Enable profiling.")
    +
    +set_kokkos_default_default(PROFILING_LOAD_PRINT OFF)
    +set(KOKKOS_ENABLE_PROFILING_LOAD_PRINT ${KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT_DEFAULT} CACHE BOOL "Enable profile load print.")
    +
    +
    +
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- KOKKOS_USE_TPLS -------------------------------
    +#-------------------------------------------------------------------------------
    +# Enable hwloc library.
    +# Figure out default:
    +IF(Trilinos_ENABLE_Kokkos AND TPL_ENABLE_HWLOC)
    +  set_kokkos_default_default(HWLOC ON)
    +ELSE()
    +  set_kokkos_default_default(HWLOC OFF)
    +ENDIF()
    +set(KOKKOS_ENABLE_HWLOC ${KOKKOS_INTERNAL_ENABLE_HWLOC_DEFAULT} CACHE BOOL "Enable hwloc for better process placement.")
    +set(KOKKOS_HWLOC_DIR "" CACHE PATH "Location of hwloc library. (kokkos tpl)")
    +
    +# Enable memkind library.
    +set_kokkos_default_default(MEMKIND OFF)
    +set(KOKKOS_ENABLE_MEMKIND ${KOKKOS_INTERNAL_ENABLE_MEMKIND_DEFAULT} CACHE BOOL "Enable memkind. (kokkos tpl)")
    +set(KOKKOS_MEMKIND_DIR "" CACHE PATH "Location of memkind library. (kokkos tpl)")
    +
    +# Enable rt library.
    +IF(Trilinos_ENABLE_Kokkos)
    +  IF(DEFINED TPL_ENABLE_LIBRT)
    +    set_kokkos_default_default(LIBRT ${TPL_ENABLE_LIBRT})
    +  ELSE()
    +    set_kokkos_default_default(LIBRT OFF)
    +  ENDIF()
    +ELSE()
    +  set_kokkos_default_default(LIBRT ON)
    +ENDIF()
    +set(KOKKOS_ENABLE_LIBRT ${KOKKOS_INTERNAL_ENABLE_LIBRT_DEFAULT} CACHE BOOL "Enable librt for more precise timer.  (kokkos tpl)")
    +
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- KOKKOS_CUDA_OPTIONS ---------------------------
    +#-------------------------------------------------------------------------------
    +
    +# CUDA options.
    +# Set Defaults
    +set_kokkos_default_default(CUDA_LDG_INTRINSIC_DEFAULT OFF)
    +set_kokkos_default_default(CUDA_UVM_DEFAULT OFF)
    +set_kokkos_default_default(CUDA_RELOCATABLE_DEVICE_CODE OFF)
    +IF(Trilinos_ENABLE_Kokkos)
    +  IF(KOKKOS_ENABLE_CUDA)
    +    find_package(CUDA)
    +  ENDIF()
    +  IF (DEFINED CUDA_VERSION)
    +    IF (CUDA_VERSION VERSION_GREATER "7.0")
    +      set_kokkos_default_default(CUDA_LAMBDA ON)
    +    ELSE()
    +      set_kokkos_default_default(CUDA_LAMBDA OFF)
    +    ENDIF()
    +  ENDIF()
    +ELSE()
    +  set_kokkos_default_default(CUDA_LAMBDA OFF)
    +ENDIF()
    +
    +# Set actual options
    +set(KOKKOS_CUDA_DIR "" CACHE PATH "Location of CUDA library.  Defaults to where nvcc installed.")
    +set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC ${KOKKOS_INTERNAL_ENABLE_CUDA_LDG_INTRINSIC_DEFAULT} CACHE BOOL "Enable CUDA LDG. (cuda option)") 
    +set(KOKKOS_ENABLE_CUDA_UVM ${KOKKOS_INTERNAL_ENABLE_CUDA_UVM_DEFAULT} CACHE BOOL "Enable CUDA unified virtual memory.")
    +set(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE ${KOKKOS_INTERNAL_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE_DEFAULT} CACHE BOOL "Enable relocatable device code for CUDA. (cuda option)")
    +set(KOKKOS_ENABLE_CUDA_LAMBDA ${KOKKOS_INTERNAL_ENABLE_CUDA_LAMBDA_DEFAULT} CACHE BOOL "Enable lambdas for CUDA. (cuda option)")
    +
    +
    +#-------------------------------------------------------------------------------
    +#----------------------- HOST ARCH AND LEGACY TRIBITS --------------------------
    +#-------------------------------------------------------------------------------
    +
    +# This defines the previous legacy TriBITS builds. 
    +set(KOKKOS_LEGACY_TRIBITS False)
    +IF ("${KOKKOS_ARCH}" STREQUAL "NOT_SET")
    +  set(KOKKOS_ARCH "None")
    +  IF(KOKKOS_HAS_TRILINOS)
    +    set(KOKKOS_LEGACY_TRIBITS True)
    +  ENDIF()
    +ENDIF()
    +IF (KOKKOS_HAS_TRILINOS)
    +  IF (KOKKOS_LEGACY_TRIBITS)
    +    message(STATUS "Using the legacy tribits build because KOKKOS_ARCH not set")
    +  ELSE()
    +    message(STATUS "NOT using the legacy tribits build because KOKKOS_ARCH *is* set")
    +  ENDIF()
    +ENDIF()
    +
    +#-------------------------------------------------------------------------------
    +#----------------------- Set CamelCase Options if they are not yet set ---------
    +#-------------------------------------------------------------------------------
    +
    +foreach(opt ${KOKKOS_INTERNAL_ENABLE_OPTIONS_LIST})
    +  string(TOUPPER ${opt} OPT )
    +  UNSET(KOKKOS_ENABLE_${OPT}_INTERNAL CACHE)
    +  SET(KOKKOS_ENABLE_${OPT}_INTERNAL ${KOKKOS_ENABLE_${OPT}} CACHE BOOL INTERNAL)
    +  IF(DEFINED KOKKOS_ENABLE_${OPT})
    +    UNSET(Kokkos_ENABLE_${opt} CACHE)
    +    SET(Kokkos_ENABLE_${opt} ${KOKKOS_ENABLE_${OPT}} CACHE BOOL "CamelCase Compatibility setting for KOKKOS_ENABLE_${OPT}")
    +  ENDIF()
    +endforeach()
    +
    diff --git a/lib/kokkos/cmake/kokkos_settings.cmake b/lib/kokkos/cmake/kokkos_settings.cmake
    new file mode 100644
    index 0000000000..850a74a670
    --- /dev/null
    +++ b/lib/kokkos/cmake/kokkos_settings.cmake
    @@ -0,0 +1,257 @@
    +########################## NOTES ###############################################
    +# This files goal is to take CMake options found in kokkos_options.cmake but 
    +# possibly set from elsewhere 
    +#   (see: trilinos/cmake/ProjectCOmpilerPostConfig.cmake) 
    +# using CMake idioms and map them onto the KOKKOS_SETTINGS variables that gets 
    +# passed to the kokkos makefile configuration:
    +#  make -f ${CMAKE_SOURCE_DIR}/core/src/Makefile ${KOKKOS_SETTINGS} build-makefile-cmake-kokkos
    +# that generates KokkosCore_config.h and kokkos_generated_settings.cmake
    +# To understand how to form KOKKOS_SETTINGS, see
    +#     /Makefile.kokkos
    +
    +#-------------------------------------------------------------------------------
    +#------------------------------- GENERAL OPTIONS -------------------------------
    +#-------------------------------------------------------------------------------
    +
    +# Ensure that KOKKOS_ARCH is in the ARCH_LIST
    +foreach(arch ${KOKKOS_ARCH})
    +  list(FIND KOKKOS_ARCH_LIST ${arch} indx)
    +  if (indx EQUAL -1)
    +    message(FATAL_ERROR "${arch} is not an accepted value for KOKKOS_ARCH."
    +      "  Please pick from these choices: ${KOKKOS_INTERNAL_ARCH_DOCSTR}")
    +  endif ()
    +endforeach()
    +
    +# KOKKOS_SETTINGS uses KOKKOS_ARCH
    +string(REPLACE ";" "," KOKKOS_ARCH "${KOKKOS_ARCH}")
    +set(KOKKOS_ARCH ${KOKKOS_ARCH})
    +
    +# From Makefile.kokkos: Options: yes,no
    +if(${KOKKOS_ENABLE_DEBUG})
    +  set(KOKKOS_DEBUG yes)
    +else()
    +  set(KOKKOS_DEBUG no)
    +endif()
    +
    +#------------------------------- KOKKOS_DEVICES --------------------------------
    +# Can have multiple devices 
    +set(KOKKOS_DEVICESl)
    +foreach(devopt ${KOKKOS_DEVICES_LIST})
    +  string(TOUPPER ${devopt} devoptuc)
    +  if (${KOKKOS_ENABLE_${devoptuc}}) 
    +    list(APPEND KOKKOS_DEVICESl ${devopt})
    +  endif ()
    +endforeach()
    +# List needs to be comma-delmitted
    +string(REPLACE ";" "," KOKKOS_DEVICES "${KOKKOS_DEVICESl}")
    +
    +#------------------------------- KOKKOS_OPTIONS --------------------------------
    +# From Makefile.kokkos: Options: aggressive_vectorization,disable_profiling
    +#compiler_warnings, aggressive_vectorization, disable_profiling, disable_dualview_modify_check, enable_profile_load_print
    +
    +set(KOKKOS_OPTIONSl)
    +if(${KOKKOS_ENABLE_COMPILER_WARNINGS})
    +      list(APPEND KOKKOS_OPTIONSl compiler_warnings)
    +endif()
    +if(${KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION})
    +      list(APPEND KOKKOS_OPTIONSl aggressive_vectorization)
    +endif()
    +if(NOT ${KOKKOS_ENABLE_PROFILING})
    +      list(APPEND KOKKOS_OPTIONSl disable_vectorization)
    +endif()
    +if(NOT ${KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK})
    +      list(APPEND KOKKOS_OPTIONSl disable_dualview_modify_check)
    +endif()
    +if(${KOKKOS_ENABLE_PROFILING_LOAD_PRINT})
    +      list(APPEND KOKKOS_OPTIONSl enable_profile_load_print)
    +endif()
    +# List needs to be comma-delimitted
    +string(REPLACE ";" "," KOKKOS_OPTIONS "${KOKKOS_OPTIONSl}")
    +
    +
    +#------------------------------- KOKKOS_USE_TPLS -------------------------------
    +# Construct the Makefile options
    +set(KOKKOS_USE_TPLSl)
    +foreach(tplopt ${KOKKOS_USE_TPLS_LIST})
    +  if (${KOKKOS_ENABLE_${tplopt}}) 
    +    list(APPEND KOKKOS_USE_TPLSl ${KOKKOS_INTERNAL_${tplopt}})
    +  endif ()
    +endforeach()
    +# List needs to be comma-delimitted
    +string(REPLACE ";" "," KOKKOS_USE_TPLS "${KOKKOS_USE_TPLSl}")
    +
    +
    +#------------------------------- KOKKOS_CUDA_OPTIONS ---------------------------
    +# Construct the Makefile options
    +set(KOKKOS_CUDA_OPTIONS)
    +foreach(cudaopt ${KOKKOS_CUDA_OPTIONS_LIST})
    +  if (${KOKKOS_ENABLE_CUDA_${cudaopt}})
    +    list(APPEND KOKKOS_CUDA_OPTIONSl ${KOKKOS_INTERNAL_${cudaopt}})
    +  endif ()
    +endforeach()
    +# List needs to be comma-delmitted
    +string(REPLACE ";" "," KOKKOS_CUDA_OPTIONS "${KOKKOS_CUDA_OPTIONSl}")
    +
    +#------------------------------- PATH VARIABLES --------------------------------
    +#  Want makefile to use same executables specified which means modifying
    +#  the path so the $(shell ...) commands in the makefile see the right exec
    +#  Also, the Makefile's use FOO_PATH naming scheme for -I/-L construction
    +#TODO:  Makefile.kokkos allows this to be overwritten? ROCM_HCC_PATH
    +
    +set(KOKKOS_INTERNAL_PATHS)
    +set(addpathl)
    +foreach(kvar "CUDA;QTHREADS;${KOKKOS_USE_TPLS_LIST}")
    +  if(${KOKKOS_ENABLE_${kvar}})
    +    if(DEFINED KOKKOS_${kvar}_DIR)
    +      set(KOKKOS_INTERNAL_PATHS "${KOKKOS_INTERNAL_PATHS} ${kvar}_PATH=${KOKKOS_${kvar}_DIR}")
    +      if(IS_DIRECTORY ${KOKKOS_${kvar}_DIR}/bin)
    +        list(APPEND addpathl ${KOKKOS_${kvar}_DIR}/bin)
    +      endif()
    +    endif()
    +  endif()
    +endforeach()
    +# Path env is : delimitted
    +string(REPLACE ";" ":" KOKKOS_INTERNAL_ADDTOPATH "${addpathl}")
    +
    +
    +######################### SET KOKKOS_SETTINGS ##################################
    +# Set the KOKKOS_SETTINGS String -- this is the primary communication with the
    +# makefile configuration.  See Makefile.kokkos
    +
    +set(KOKKOS_SETTINGS KOKKOS_SRC_PATH=${KOKKOS_SRC_PATH})
    +set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} KOKKOS_PATH=${KOKKOS_PATH})
    +set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} KOKKOS_INSTALL_PATH=${CMAKE_INSTALL_PREFIX})
    +
    +# Form of KOKKOS_foo=$KOKKOS_foo
    +foreach(kvar ARCH;DEVICES;DEBUG;OPTIONS;CUDA_OPTIONS;USE_TPLS)
    +  set(KOKKOS_VAR KOKKOS_${kvar})
    +  if(DEFINED KOKKOS_${kvar})
    +    if (NOT "${${KOKKOS_VAR}}" STREQUAL "")
    +      set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} ${KOKKOS_VAR}=${${KOKKOS_VAR}})
    +    endif()
    +  endif()
    +endforeach()
    +
    +# Form of VAR=VAL
    +#TODO:  Makefile supports MPICH_CXX, OMPI_CXX as well
    +foreach(ovar CXX;CXXFLAGS;LDFLAGS)
    +  if(DEFINED ${ovar})
    +    if (NOT "${${ovar}}" STREQUAL "")
    +      set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} ${ovar}=${${ovar}})
    +    endif()
    +  endif()
    +endforeach()
    +
    +# Finally, do the paths
    +if (NOT "${KOKKOS_INTERNAL_PATHS}" STREQUAL "")
    +  set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} ${KOKKOS_INTERNAL_PATHS})
    +endif()
    +if (NOT "${KOKKOS_INTERNAL_ADDTOPATH}" STREQUAL "")
    +  set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} PATH=${KOKKOS_INTERNAL_ADDTOPATH}:\${PATH})
    +endif()
    +
    +# Final form that gets passed to make
    +set(KOKKOS_SETTINGS env ${KOKKOS_SETTINGS})
    +
    +
    +############################ PRINT CONFIGURE STATUS ############################
    +
    +if(KOKKOS_CMAKE_VERBOSE)
    +  message(STATUS "")
    +  message(STATUS "****************** Kokkos Settings ******************")
    +  message(STATUS "Execution Spaces")
    +
    +  if(KOKKOS_ENABLE_CUDA)
    +    message(STATUS "  Device Parallel: Cuda")
    +  else()
    +    message(STATUS "  Device Parallel: None")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_OPENMP)
    +    message(STATUS "    Host Parallel: OpenMP")
    +  elseif(KOKKOS_ENABLE_PTHREAD)
    +    message(STATUS "    Host Parallel: Pthread")
    +  elseif(KOKKOS_ENABLE_QTHREADS)
    +    message(STATUS "    Host Parallel: Qthreads")
    +  else()
    +    message(STATUS "    Host Parallel: None")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_SERIAL)
    +    message(STATUS "      Host Serial: Serial")
    +  else()
    +    message(STATUS "      Host Serial: None")
    +  endif()
    +
    +  message(STATUS "")
    +  message(STATUS "Architectures:")
    +  message(STATUS "    ${KOKKOS_ARCH}")
    +
    +  message(STATUS "")
    +  message(STATUS "Enabled options")
    +
    +  if(KOKKOS_SEPARATE_LIBS)
    +    message(STATUS "  KOKKOS_SEPARATE_LIBS")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_HWLOC)
    +    message(STATUS "  KOKKOS_ENABLE_HWLOC")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_MEMKIND)
    +    message(STATUS "  KOKKOS_ENABLE_MEMKIND")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_DEBUG)
    +    message(STATUS "  KOKKOS_ENABLE_DEBUG")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_PROFILING)
    +    message(STATUS "  KOKKOS_ENABLE_PROFILING")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION)
    +    message(STATUS "  KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION")
    +  endif()
    +
    +  if(KOKKOS_ENABLE_CUDA)
    +    if(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC)
    +      message(STATUS "  KOKKOS_ENABLE_CUDA_LDG_INTRINSIC")
    +    endif()
    +
    +    if(KOKKOS_ENABLE_CUDA_UVM)
    +      message(STATUS "  KOKKOS_ENABLE_CUDA_UVM")
    +    endif()
    +
    +    if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE)
    +      message(STATUS "  KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE")
    +    endif()
    +
    +    if(KOKKOS_ENABLE_CUDA_LAMBDA)
    +      message(STATUS "  KOKKOS_ENABLE_CUDA_LAMBDA")
    +    endif()
    +
    +    if(KOKKOS_CUDA_DIR)
    +      message(STATUS "  KOKKOS_CUDA_DIR: ${KOKKOS_CUDA_DIR}")
    +    endif()
    +  endif()
    +
    +  if(KOKKOS_QTHREADS_DIR)
    +    message(STATUS "  KOKKOS_QTHREADS_DIR: ${KOKKOS_QTHREADS_DIR}")
    +  endif()
    +
    +  if(KOKKOS_HWLOC_DIR)
    +    message(STATUS "  KOKKOS_HWLOC_DIR: ${KOKKOS_HWLOC_DIR}")
    +  endif()
    +
    +  if(KOKKOS_MEMKIND_DIR)
    +    message(STATUS "  KOKKOS_MEMKIND_DIR: ${KOKKOS_MEMKIND_DIR}")
    +  endif()
    +
    +  message(STATUS "")
    +  message(STATUS "Final kokkos settings variable:")
    +  message(STATUS "  ${KOKKOS_SETTINGS}")
    +
    +  message(STATUS "*****************************************************")
    +  message(STATUS "")
    +endif()
    diff --git a/lib/kokkos/cmake/tribits.cmake b/lib/kokkos/cmake/tribits.cmake
    index 0f00f1dd2e..321704a1c8 100644
    --- a/lib/kokkos/cmake/tribits.cmake
    +++ b/lib/kokkos/cmake/tribits.cmake
    @@ -3,10 +3,6 @@ INCLUDE(CTest)
     
     cmake_policy(SET CMP0054 NEW)
     
    -IF(NOT DEFINED ${PROJECT_NAME})
    -  project(KokkosCMake) 
    -ENDIF()
    -
     MESSAGE(WARNING "The project name is: ${PROJECT_NAME}")
     
     IF(NOT DEFINED ${PROJECT_NAME}_ENABLE_OpenMP)
    @@ -46,26 +42,26 @@ MACRO(PREPEND_GLOBAL_SET VARNAME)
       GLOBAL_SET(${VARNAME} ${ARGN} ${${VARNAME}})
     ENDMACRO()
     
    -FUNCTION(REMOVE_GLOBAL_DUPLICATES VARNAME)
    -  ASSERT_DEFINED(${VARNAME})
    -  IF (${VARNAME})
    -    SET(TMP ${${VARNAME}})
    -    LIST(REMOVE_DUPLICATES TMP)
    -    GLOBAL_SET(${VARNAME} ${TMP})
    -  ENDIF()
    -ENDFUNCTION()
    +#FUNCTION(REMOVE_GLOBAL_DUPLICATES VARNAME)
    +#  ASSERT_DEFINED(${VARNAME})
    +#  IF (${VARNAME})
    +#    SET(TMP ${${VARNAME}})
    +#    LIST(REMOVE_DUPLICATES TMP)
    +#    GLOBAL_SET(${VARNAME} ${TMP})
    +#  ENDIF()
    +#ENDFUNCTION()
     
    -MACRO(TRIBITS_ADD_OPTION_AND_DEFINE  USER_OPTION_NAME  MACRO_DEFINE_NAME DOCSTRING  DEFAULT_VALUE)
    -  MESSAGE(STATUS "TRIBITS_ADD_OPTION_AND_DEFINE: '${USER_OPTION_NAME}' '${MACRO_DEFINE_NAME}' '${DEFAULT_VALUE}'")
    -  SET( ${USER_OPTION_NAME} "${DEFAULT_VALUE}" CACHE BOOL "${DOCSTRING}" )
    -  IF(NOT ${MACRO_DEFINE_NAME} STREQUAL "")
    -    IF(${USER_OPTION_NAME})
    -      GLOBAL_SET(${MACRO_DEFINE_NAME} ON)
    -    ELSE()
    -      GLOBAL_SET(${MACRO_DEFINE_NAME} OFF)
    -    ENDIF()
    -  ENDIF()
    -ENDMACRO()
    +#MACRO(TRIBITS_ADD_OPTION_AND_DEFINE  USER_OPTION_NAME  MACRO_DEFINE_NAME DOCSTRING  DEFAULT_VALUE)
    +#  MESSAGE(STATUS "TRIBITS_ADD_OPTION_AND_DEFINE: '${USER_OPTION_NAME}' '${MACRO_DEFINE_NAME}' '${DEFAULT_VALUE}'")
    +#  SET( ${USER_OPTION_NAME} "${DEFAULT_VALUE}" CACHE BOOL "${DOCSTRING}" )
    +#  IF(NOT ${MACRO_DEFINE_NAME} STREQUAL "")
    +#    IF(${USER_OPTION_NAME})
    +#      GLOBAL_SET(${MACRO_DEFINE_NAME} ON)
    +#    ELSE()
    +#      GLOBAL_SET(${MACRO_DEFINE_NAME} OFF)
    +#    ENDIF()
    +#  ENDIF()
    +#ENDMACRO()
     
     FUNCTION(TRIBITS_CONFIGURE_FILE  PACKAGE_NAME_CONFIG_FILE)
     
    @@ -77,17 +73,20 @@ FUNCTION(TRIBITS_CONFIGURE_FILE  PACKAGE_NAME_CONFIG_FILE)
     
     ENDFUNCTION()
     
    -MACRO(TRIBITS_ADD_DEBUG_OPTION)
    -  TRIBITS_ADD_OPTION_AND_DEFINE(
    -    ${PROJECT_NAME}_ENABLE_DEBUG
    -    HAVE_${PROJECT_NAME_UC}_DEBUG
    -    "Enable a host of runtime debug checking."
    -    OFF
    -    )
    -ENDMACRO()
    +#MACRO(TRIBITS_ADD_DEBUG_OPTION)
    +#  TRIBITS_ADD_OPTION_AND_DEFINE(
    +#    ${PROJECT_NAME}_ENABLE_DEBUG
    +#    HAVE_${PROJECT_NAME_UC}_DEBUG
    +#    "Enable a host of runtime debug checking."
    +#    OFF
    +#    )
    +#ENDMACRO()
     
     
     MACRO(TRIBITS_ADD_TEST_DIRECTORIES)
    +  message(STATUS "ProjectName: " ${PROJECT_NAME})
    +  message(STATUS "Tests: " ${${PROJECT_NAME}_ENABLE_TESTS})
    +  
       IF(${${PROJECT_NAME}_ENABLE_TESTS})
         FOREACH(TEST_DIR ${ARGN})
           ADD_SUBDIRECTORY(${TEST_DIR})
    @@ -387,17 +386,17 @@ FUNCTION(TRIBITS_TPL_FIND_INCLUDE_DIRS_AND_LIBRARIES TPL_NAME)
     
     ENDFUNCTION()
     
    -MACRO(TRIBITS_PROCESS_TPL_DEP_FILE TPL_FILE)
    -  GET_FILENAME_COMPONENT(TPL_NAME ${TPL_FILE} NAME_WE)
    -  INCLUDE("${TPL_FILE}")
    -  IF(TARGET TPL_LIB_${TPL_NAME})
    -    MESSAGE(STATUS "Found tpl library: ${TPL_NAME}")
    -    SET(TPL_ENABLE_${TPL_NAME} TRUE)
    -  ELSE()
    -    MESSAGE(STATUS "Tpl library not found: ${TPL_NAME}")
    -    SET(TPL_ENABLE_${TPL_NAME} FALSE)
    -  ENDIF()
    -ENDMACRO()
    +#MACRO(TRIBITS_PROCESS_TPL_DEP_FILE TPL_FILE)
    +#  GET_FILENAME_COMPONENT(TPL_NAME ${TPL_FILE} NAME_WE)
    +#  INCLUDE("${TPL_FILE}")
    +#  IF(TARGET TPL_LIB_${TPL_NAME})
    +#    MESSAGE(STATUS "Found tpl library: ${TPL_NAME}")
    +#    SET(TPL_ENABLE_${TPL_NAME} TRUE)
    +#  ELSE()
    +#    MESSAGE(STATUS "Tpl library not found: ${TPL_NAME}")
    +#    SET(TPL_ENABLE_${TPL_NAME} FALSE)
    +#  ENDIF()
    +#ENDMACRO()
     
     MACRO(PREPEND_TARGET_SET VARNAME TARGET_NAME TYPE)
       IF(TYPE STREQUAL "REQUIRED")
    @@ -475,6 +474,7 @@ MACRO(TRIBITS_SUBPACKAGE NAME)
       SET(PARENT_PACKAGE_NAME ${PACKAGE_NAME})
       SET(PACKAGE_NAME ${PACKAGE_NAME}${NAME})
       STRING(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UC)
    +  SET(${PACKAGE_NAME}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
     
       ADD_INTERFACE_LIBRARY(PACKAGE_${PACKAGE_NAME})
     
    @@ -494,11 +494,11 @@ MACRO(TRIBITS_PACKAGE_DECL NAME)
       SET(${PACKAGE_NAME}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
       STRING(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UC)
     
    -  SET(TRIBITS_DEPS_DIR "${CMAKE_SOURCE_DIR}/cmake/deps")
    -  FILE(GLOB TPLS_FILES "${TRIBITS_DEPS_DIR}/*.cmake")
    -  FOREACH(TPL_FILE ${TPLS_FILES})
    -    TRIBITS_PROCESS_TPL_DEP_FILE(${TPL_FILE})
    -  ENDFOREACH()
    +  #SET(TRIBITS_DEPS_DIR "${CMAKE_SOURCE_DIR}/cmake/deps")
    +  #FILE(GLOB TPLS_FILES "${TRIBITS_DEPS_DIR}/*.cmake")
    +  #FOREACH(TPL_FILE ${TPLS_FILES})
    +  #  TRIBITS_PROCESS_TPL_DEP_FILE(${TPL_FILE})
    +  #ENDFOREACH()
     
     ENDMACRO()
     
    diff --git a/lib/kokkos/config/kokkos-promotion.txt b/lib/kokkos/config/kokkos-promotion.txt
    new file mode 100644
    index 0000000000..d56298b416
    --- /dev/null
    +++ b/lib/kokkos/config/kokkos-promotion.txt
    @@ -0,0 +1,140 @@
    +Summary:
    +
    +- Step 1: Testing Kokkos itself using test_all_sandia
    +
    +- Step 2: Testing of Kokkos integrated into Trilinos (config/trilinos-integration/*.sh)
    +
    +- Step 3: Locally update CHANGELOG, merge into master, edit config/master_history.txt
    +
    +- Step 4: Locally snapshot new master into corresponding Trilinos branch (develop or temporary), push with checking-test-sems.sh
    +
    +- Step 5: Push local Kokkos master to GitHub (need Owner approval)
    +
    +Steps 1, 2, and 4 include testing that may fail. These failures must be fixed either by pull requests to Kokkos develop, or by creating a new Trilinos branch for parts of Trilinos that must be updated. This is what usually takes the most time.
    +
    +
    +// -------------------------------------------------------------------------------- //
    +
    +
    +Step 1: The following should be repeated on enough machines to cover all
    +supported compilers. Those machines are:
    +
    +    kokkos-dev
    +    ??? <- TODO: identify other machines
    +
    +  1.1. Clone kokkos develop branch (or just switch to it)
    +
    +         git clone -b develop git@github.com:kokkos/kokkos.git
    +         cd kokkos
    +
    +  1.2. Create a testing directory
    +
    +         mkdir testing
    +         cd testing
    +
    +  1.3. Run the test_all_sandia script with no options to test all compilers
    +
    +         nohup ../config/test_all_sandia &
    +         tail -f nohup.out                   # to watch progress
    +
    +// -------------------------------------------------------------------------------- //
    +
    +Step 2:
    +  2.1. Build and test Trilinos with 4 different configurations; Run scripts for white and shepard that are provided in kokkos/config/trilinos-integration. These scripts load their own modules/environment, so don't require preparation. You can run all four at the same time, use separate directories for each.
    +
    +         mkdir serial
    +         cd serial
    +         nohup KOKKOS_PATH/config/trilinos-integration/shepard_jenkins_run_script_serial_intel &
    +
    +  2.2. Compare the compile errors and test failures between updated and pristine versions. There may be compile failures that happen in both, tests that fail in both, and there may be tests that only fail some times (thus, rerun tests manually as needed).
    +
    +// -------------------------------------------------------------------------------- //
    +
    +Step 3: This step should be run on kokkos-dev
    +
    +  3.1. If you don't have a GitHub token already, generate one for yourself (this will give you TOKEN):
    +
    +       https://github.com/settings/tokens
    +
    +  3.2. Get a clean copy of the Kokkos develop branch
    +
    +       git clone -b develop git@github.com:kokkos/kokkos.git
    +       cd kokkos
    +
    +  3.3. Generate the initial changelog. Use the most recent tag as OLDTAG (`git tag -l` can show you all tags). The NEWTAG is the new version number, e.g. "2.04.00". RUN THIS OUTSIDE THE KOKKOS SOURCE TREE!
    +
    +       module load ruby/2.3.1/gcc/5.3.0
    +       gitthub_changelog_generator kokkos/kokkos --token TOKEN --no-pull-requests --include-labels 'InDevelop' --enhancement-labels 'enhancement,Feature Request' --future-release 'NEWTAG' --between-tags 'NEWTAG,OLDTAG'
    +       cat CHANGELOG.md
    +
    +  3.4. Manually cleanup and commit the change log. Pushing to develop requires Owner permission.
    +       (Copy the new section from the generated CHANGELOG.md to KOKKOS_PATH/CHANGELOG.md)
    +       (Make desired changes to CHANGELOG.md to enhance clarity (remove issues not noteworthy))
    +       (Commit and push the CHANGELOG.md to develop)
    +
    +  3.5. Merge develop into master. DO NOT FAST-FORWARD THE MERGE!!!!
    +
    +       (From kokkos directory):
    +       git checkout master
    +       git merge --no-ff origin/develop
    +
    +  3.6. Update the tag in kokkos/config/master_history.txt
    +
    +       Tag description: MajorNumber.MinorNumber.WeeksSinceMinorNumberUpdate
    +       Tag field widths: #.#.##
    +       date description: month:day:year
    +       date field widths: ##:##:####
    +       master description: SHA1 of previous master commit (use `git log`?)
    +       develop description: SHA1 of merged develop branch
    +       SHA1 field width: ######## (8 chars)
    +
    +       # Append to config/master_history.txt:
    +
    +       tag:  2.03.13    date: 07:27:2017    master: da314444    develop: 29ccb58a
    +       
    +       git commit --amend -a
    +
    +
    +  3.7. Create the new tag:
    +
    +       git tag -a #.#.##
    +
    +         (type the following into the tag message (same as for step 4.3))
    +         tag: #.#.##
    +         date: mm/dd/yyyy
    +         master: sha1
    +         develop: sha1
    +
    +  3.8. DO NOT PUSH YET !!!
    +
    +
    +// -------------------------------------------------------------------------------- //
    +
    +Step 4: This step can be done on any SEMS machine (e.g. kokkos-dev). Actually, the checkin step requires lots of disk space and RAM. Use ceerws1113 if you have access to it.
    +
    +  4.1 Clone the Trilinos corresponding branch (or just switch to it)
    +
    +        git clone -b develop git@github.com:trilinos/Trilinos.git
    +        TRILINOS_PATH=$PWD/Trilinos
    +
    +  4.2 Snapshot Kokkos into Trilinos - this requires python/2.7.9 and that both Trilinos and Kokkos be clean - no untracked or modified files. Run the following outside of the Kokkos and Trilinos source trees.
    +
    +        module load sems-python/2.7.9
    +        python KOKKOS_PATH/config/snapshot.py KOKKOS_PATH TRILINOS_PATH/packages
    +
    +  4.3. Run checkin-test to push to trilinos using the CI build modules (gcc/4.9.3)
    +
    +       cd TRILINOS_PATH
    +       mkdir CHECKIN
    +       cd CHECKIN
    +       nohup ../cmake/std/sems/checkin-test-sems.sh --do-all --push &
    +
    +  4.4. If there are failures, fix and backtrack. Otherwise, go to next step
    +
    +// -------------------------------------------------------------------------------- //
    +
    +Step 5: Push Kokkos master to GitHub (requires Owner permission).
    +      
    +       cd KOKKOS_PATH
    +       git push --follow-tags origin master 
    +
    diff --git a/lib/kokkos/config/master_history.txt b/lib/kokkos/config/master_history.txt
    index cc6f4c97d7..06c3f95a80 100644
    --- a/lib/kokkos/config/master_history.txt
    +++ b/lib/kokkos/config/master_history.txt
    @@ -7,3 +7,8 @@ tag:  2.02.07    date: 12:16:2016    master: 4b4cc4ba    develop: 382c0966
     tag:  2.02.15    date: 02:10:2017    master: 8c64cd93    develop: 28dea8b6
     tag:  2.03.00    date: 04:25:2017    master: 120d9ce7    develop: 015ba641
     tag:  2.03.05    date: 05:27:2017    master: 36b92f43    develop: 79073186
    +tag:  2.03.13    date: 07:27:2017    master: da314444    develop: 29ccb58a
    +tag:  2.04.00    date: 08:16:2017    master: 54eb75c0    develop: 32fb8ee1
    +tag:  2.04.04    date: 09:11:2017    master: 2b7e9c20    develop: 51e7b25a
    +tag:  2.04.11    date: 10:28:2017    master: 54a1330a    develop: ed36c017
    +tag:  2.5.11     date: 12:15:2017    master: dfe685f4    develop: ec7ad6d8
    diff --git a/lib/kokkos/config/nvcc_wrapper b/lib/kokkos/config/nvcc_wrapper
    index cb206cf88b..d339da4fcd 100755
    --- a/lib/kokkos/config/nvcc_wrapper
    +++ b/lib/kokkos/config/nvcc_wrapper
    @@ -39,6 +39,12 @@ cuda_args=""
     # Arguments for both NVCC and Host compiler
     shared_args=""
     
    +# Argument -c
    +compile_arg=""
    +
    +# Argument -o 
    +output_arg=""
    +
     # Linker arguments
     xlinker_args=""
     
    @@ -66,6 +72,7 @@ dry_run=0
     
     # Skip NVCC compilation and use host compiler directly
     host_only=0
    +host_only_args=""
     
     # Enable workaround for CUDA 6.5 for pragma ident 
     replace_pragma_ident=0
    @@ -78,6 +85,14 @@ temp_dir=${TMPDIR:-/tmp}
     # Check if we have an optimization argument already
     optimization_applied=0
     
    +# Check if we have -std=c++X  or --std=c++X already
    +stdcxx_applied=0
    +
    +# Run nvcc a second time to generate dependencies if needed
    +depfile_separate=0
    +depfile_output_arg=""
    +depfile_target_arg=""
    +
     #echo "Arguments: $# $@"
     
     while [ $# -gt 0 ]
    @@ -109,12 +124,31 @@ do
         fi
         ;;
       #Handle shared args (valid for both nvcc and the host compiler)
    -  -D*|-c|-I*|-L*|-l*|-g|--help|--version|-E|-M|-shared)
    +  -D*|-I*|-L*|-l*|-g|--help|--version|-E|-M|-shared)
         shared_args="$shared_args $1"
         ;;
    -  #Handle shared args that have an argument
    -  -o|-MT)
    -    shared_args="$shared_args $1 $2"
    +  #Handle compilation argument
    +  -c)
    +    compile_arg="$1"
    +    ;;
    +  #Handle output argument
    +  -o)
    +    output_arg="$output_arg $1 $2"
    +    shift
    +    ;;
    +  # Handle depfile arguments.  We map them to a separate call to nvcc.
    +  -MD|-MMD)
    +    depfile_separate=1
    +    host_only_args="$host_only_args $1"
    +    ;;
    +  -MF)
    +    depfile_output_arg="-o $2"
    +    host_only_args="$host_only_args $1 $2"
    +    shift
    +    ;;
    +  -MT)
    +    depfile_target_arg="$1 $2"
    +    host_only_args="$host_only_args $1 $2"
         shift
         ;;
       #Handle known nvcc args
    @@ -130,16 +164,25 @@ do
         cuda_args="$cuda_args $1 $2"
         shift
         ;;
    -  #Handle c++11 setting
    -  --std=c++11|-std=c++11)
    -    shared_args="$shared_args $1"
    +  #Handle c++11
    +  --std=c++11|-std=c++11|--std=c++14|-std=c++14|--std=c++1z|-std=c++1z)
    +    if [ $stdcxx_applied -eq 1 ]; then
    +       echo "nvcc_wrapper - *warning* you have set multiple optimization flags (-std=c++1* or --std=c++1*), only the first is used because nvcc can only accept a single std setting"
    +    else
    +       shared_args="$shared_args $1"
    +       stdcxx_applied=1
    +    fi
         ;;
    +
       #strip of -std=c++98 due to nvcc warnings and Tribits will place both -std=c++11 and -std=c++98
       -std=c++98|--std=c++98)
         ;;
       #strip of pedantic because it produces endless warnings about #LINE added by the preprocessor
       -pedantic|-Wpedantic|-ansi)
         ;;
    +  #strip of -Woverloaded-virtual to avoid "cc1: warning: command line option ‘-Woverloaded-virtual’ is valid for C++/ObjC++ but not for C"
    +  -Woverloaded-virtual)
    +    ;;
       #strip -Xcompiler because we add it
       -Xcompiler)
         if [ $first_xcompiler_arg -eq 1 ]; then
    @@ -190,7 +233,7 @@ do
         object_files_xlinker="$object_files_xlinker -Xlinker $1"
         ;;
       #Handle object files which always need to use "-Xlinker": -x cu applies to all input files, so give them to linker, except if only linking
    -  *.dylib)
    +  @*|*.dylib)
         object_files="$object_files -Xlinker $1"
         object_files_xlinker="$object_files_xlinker -Xlinker $1"
         ;;
    @@ -230,7 +273,7 @@ if [ $first_xcompiler_arg -eq 0 ]; then
     fi
     
     #Compose host only command
    -host_command="$host_compiler $shared_args $xcompiler_args $host_linker_args $shared_versioned_libraries_host"
    +host_command="$host_compiler $shared_args $host_only_args $compile_arg $output_arg $xcompiler_args $host_linker_args $shared_versioned_libraries_host"
     
     #nvcc does not accept '#pragma ident SOME_MACRO_STRING' but it does accept '#ident SOME_MACRO_STRING'
     if [ $replace_pragma_ident -eq 1 ]; then
    @@ -262,10 +305,21 @@ else
       host_command="$host_command $object_files"
     fi
     
    +if [ $depfile_separate -eq 1 ]; then
    +  # run nvcc a second time to generate dependencies (without compiling)
    +  nvcc_depfile_command="$nvcc_command -M $depfile_target_arg $depfile_output_arg"
    +else
    +  nvcc_depfile_command=""
    +fi
    +
    +nvcc_command="$nvcc_command $compile_arg $output_arg"
    +
     #Print command for dryrun
     if [ $dry_run -eq 1 ]; then
       if [ $host_only -eq 1 ]; then
         echo $host_command
    +  elif [ -n "$nvcc_depfile_command" ]; then
    +    echo $nvcc_command "&&" $nvcc_depfile_command
       else
         echo $nvcc_command
       fi
    @@ -275,6 +329,8 @@ fi
     #Run compilation command
     if [ $host_only -eq 1 ]; then
       $host_command
    +elif [ -n "$nvcc_depfile_command" ]; then
    +  $nvcc_command && $nvcc_depfile_command
     else
       $nvcc_command
     fi
    diff --git a/lib/kokkos/config/query_cuda_arch.cpp b/lib/kokkos/config/query_cuda_arch.cpp
    new file mode 100644
    index 0000000000..383f04e34e
    --- /dev/null
    +++ b/lib/kokkos/config/query_cuda_arch.cpp
    @@ -0,0 +1,24 @@
    +#include 
    +#include 
    +int main()
    +{
    +	cudaDeviceProp prop;
    +  const cudaError_t err_code = cudaGetDeviceProperties(&prop, 0);
    +  if (cudaSuccess != err_code) {
    +		fprintf(stderr,"cudaGetDeviceProperties failed: %s\n", cudaGetErrorString(err_code));
    +		return -1;
    +	}
    +  switch (prop.major) {
    +    case 3:
    +      printf("Kepler"); break;
    +    case 5:
    +      printf("Maxwell"); break;
    +    case 6:
    +      printf("Pascal"); break;
    +    default:
    +      fprintf(stderr, "Unspported Device %d%d\n", (int)prop.major, (int)prop.minor);
    +      return -1;
    +  }
    +  printf("%d%d\n", (int)prop.major, (int)prop.minor);
    +  return 0;
    +}
    diff --git a/lib/kokkos/config/test_all_sandia b/lib/kokkos/config/test_all_sandia
    index 8e1246bf8b..660ab91ff5 100755
    --- a/lib/kokkos/config/test_all_sandia
    +++ b/lib/kokkos/config/test_all_sandia
    @@ -16,12 +16,12 @@ if [[ "$HOSTNAME" =~ (white|ride).* ]]; then
       MACHINE=white
     elif [[ "$HOSTNAME" =~ .*bowman.* ]]; then
       MACHINE=bowman
    -elif [[ "$HOSTNAME" =~ node.* ]]; then # Warning: very generic name
    +elif [[ "$HOSTNAME" =~ n.* ]]; then # Warning: very generic name
       if [[ "$PROCESSOR" = "aarch64" ]]; then
         MACHINE=sullivan
    -  else
    -    MACHINE=shepard
       fi
    +elif [[ "$HOSTNAME" =~ node.* ]]; then # Warning: very generic name
    +    MACHINE=shepard
     elif [[ "$HOSTNAME" =~ apollo ]]; then
       MACHINE=apollo
     elif [[ "$HOSTNAME" =~ sullivan ]]; then
    @@ -45,7 +45,8 @@ GCC_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits
     IBM_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized"
     CLANG_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized"
     INTEL_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized"
    -CUDA_WARNING_FLAGS=""
    +CUDA_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized"
    +PGI_WARNING_FLAGS=""
     
     # Default. Machine specific can override.
     DEBUG=False
    @@ -61,6 +62,8 @@ SPOT_CHECK=False
     
     PRINT_HELP=False
     OPT_FLAG=""
    +CXX_FLAGS_EXTRA=""
    +LD_FLAGS_EXTRA=""
     KOKKOS_OPTIONS=""
     
     #
    @@ -111,6 +114,12 @@ do
         --with-cuda-options*)
           KOKKOS_CUDA_OPTIONS="--with-cuda-options=${key#*=}"
           ;;
    +    --cxxflags-extra*)
    +      CXX_FLAGS_EXTRA="${key#*=}"
    +      ;;
    +    --ldflags-extra*)
    +      LD_FLAGS_EXTRA="${key#*=}"
    +      ;;
         --help*)
           PRINT_HELP=True
           ;;
    @@ -150,19 +159,21 @@ if [ "$MACHINE" = "sems" ]; then
     
       if [ "$SPOT_CHECK" = "True" ]; then
         # Format: (compiler module-list build-list exe-name warning-flag)
    -    COMPILERS=("gcc/4.7.2 $BASE_MODULE_LIST "OpenMP,Pthread" g++ $GCC_WARNING_FLAGS"
    -               "gcc/5.1.0 $BASE_MODULE_LIST "Serial" g++ $GCC_WARNING_FLAGS"
    -               "intel/16.0.1 $BASE_MODULE_LIST "OpenMP" icpc $INTEL_WARNING_FLAGS"
    +    COMPILERS=("gcc/5.3.0 $BASE_MODULE_LIST "OpenMP" g++ $GCC_WARNING_FLAGS"
    +               "gcc/6.1.0 $BASE_MODULE_LIST "Serial" g++ $GCC_WARNING_FLAGS"
    +               "intel/17.0.1 $BASE_MODULE_LIST "OpenMP" icpc $INTEL_WARNING_FLAGS"
                    "clang/3.9.0 $BASE_MODULE_LIST "Pthread_Serial" clang++ $CLANG_WARNING_FLAGS"
                    "cuda/8.0.44 $CUDA8_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS"
         )
       else
         # Format: (compiler module-list build-list exe-name warning-flag)
    -    COMPILERS=("gcc/4.7.2 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    -               "gcc/4.8.4 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    -               "intel/14.0.4 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +    COMPILERS=("gcc/4.8.4 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    +               "gcc/4.9.3 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    +               "gcc/5.3.0 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    +               "gcc/6.1.0 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
                    "intel/15.0.2 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
                    "intel/16.0.1 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +               "intel/16.0.3 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
                    "clang/3.6.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS"
                    "clang/3.7.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS"
                    "clang/3.8.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS"
    @@ -180,6 +191,7 @@ elif [ "$MACHINE" = "white" ]; then
       BASE_MODULE_LIST="/"
       IBM_MODULE_LIST="/xl/"
       CUDA_MODULE_LIST="/,gcc/5.4.0"
    +  CUDA_MODULE_LIST2="/,gcc/6.3.0,ibm/xl/13.1.6-BETA"
     
       # Don't do pthread on white.
       GCC_BUILD_LIST="OpenMP,Serial,OpenMP_Serial"
    @@ -188,6 +200,7 @@ elif [ "$MACHINE" = "white" ]; then
       COMPILERS=("gcc/5.4.0 $BASE_MODULE_LIST $IBM_BUILD_LIST g++ $GCC_WARNING_FLAGS"
                  "ibm/13.1.3 $IBM_MODULE_LIST $IBM_BUILD_LIST xlC $IBM_WARNING_FLAGS"
                  "cuda/8.0.44 $CUDA_MODULE_LIST $CUDA_IBM_BUILD_LIST ${KOKKOS_PATH}/bin/nvcc_wrapper $CUDA_WARNING_FLAGS"
    +             "cuda/9.0.103 $CUDA_MODULE_LIST2 $CUDA_IBM_BUILD_LIST ${KOKKOS_PATH}/bin/nvcc_wrapper $CUDA_WARNING_FLAGS"
       )
     
       if [ -z "$ARCH_FLAG" ]; then
    @@ -206,8 +219,9 @@ elif [ "$MACHINE" = "bowman" ]; then
       OLD_INTEL_BUILD_LIST="Pthread,Serial,Pthread_Serial"
     
       # Format: (compiler module-list build-list exe-name warning-flag)
    -  COMPILERS=("intel/16.2.181 $BASE_MODULE_LIST $OLD_INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    -             "intel/17.0.098 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +  COMPILERS=("intel/16.4.258 $BASE_MODULE_LIST $OLD_INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +             "intel/17.2.174 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +             "intel/18.0.128 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
       )
     
       if [ -z "$ARCH_FLAG" ]; then
    @@ -237,13 +251,13 @@ elif [ "$MACHINE" = "shepard" ]; then
       SKIP_HWLOC=True
       export SLURM_TASKS_PER_NODE=32
     
    -  BASE_MODULE_LIST="/compilers/"
    -
    -  OLD_INTEL_BUILD_LIST="Pthread,Serial,Pthread_Serial"
    +  BASE_MODULE_LIST="/"
    +  BASE_MODULE_LIST_INTEL="/compilers/"
     
       # Format: (compiler module-list build-list exe-name warning-flag)
    -  COMPILERS=("intel/16.2.181 $BASE_MODULE_LIST $OLD_INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    -             "intel/17.0.098 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +  COMPILERS=("intel/17.4.196 $BASE_MODULE_LIST_INTEL $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +             "intel/18.0.128 $BASE_MODULE_LIST_INTEL $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +             "pgi/17.10.0 $BASE_MODULE_LIST $GCC_BUILD_LIST pgc++ $PGI_WARNING_FLAGS"
       )
     
       if [ -z "$ARCH_FLAG" ]; then
    @@ -276,26 +290,25 @@ elif [ "$MACHINE" = "apollo" ]; then
     
       if [ "$SPOT_CHECK" = "True" ]; then
         # Format: (compiler module-list build-list exe-name warning-flag)
    -    COMPILERS=("gcc/4.7.2 $BASE_MODULE_LIST "OpenMP,Pthread" g++ $GCC_WARNING_FLAGS"
    +    COMPILERS=("gcc/4.8.4 $BASE_MODULE_LIST "OpenMP,Pthread" g++ $GCC_WARNING_FLAGS"
                    "gcc/5.1.0 $BASE_MODULE_LIST "Serial" g++ $GCC_WARNING_FLAGS"
                    "intel/16.0.1 $BASE_MODULE_LIST "OpenMP" icpc $INTEL_WARNING_FLAGS"
                    "clang/3.9.0 $BASE_MODULE_LIST "Pthread_Serial" clang++ $CLANG_WARNING_FLAGS"
    -               "clang/head $CLANG_MODULE_LIST "Cuda_Pthread" clang++ $CUDA_WARNING_FLAGS"
    +               "clang/4.0.0 $CLANG_MODULE_LIST "Cuda_Pthread" clang++ $CUDA_WARNING_FLAGS"
                    "cuda/8.0.44 $CUDA_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS"
         )
       else
         # Format: (compiler module-list build-list exe-name warning-flag)
         COMPILERS=("cuda/8.0.44 $CUDA8_MODULE_LIST $BUILD_LIST_CUDA_NVCC $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS"
    -               "clang/head $CLANG_MODULE_LIST $BUILD_LIST_CUDA_CLANG clang++ $CUDA_WARNING_FLAGS"
    +               "clang/4.0.0 $CLANG_MODULE_LIST $BUILD_LIST_CUDA_CLANG clang++ $CUDA_WARNING_FLAGS"
                    "clang/3.9.0 $CLANG_MODULE_LIST $BUILD_LIST_CLANG clang++ $CLANG_WARNING_FLAGS"
    -               "gcc/4.7.2 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
                    "gcc/4.8.4 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    -               "gcc/4.9.2 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    +               "gcc/4.9.3 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
                    "gcc/5.3.0 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
                    "gcc/6.1.0 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS"
    -               "intel/14.0.4 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
                    "intel/15.0.2 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
                    "intel/16.0.1 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
    +               "intel/17.0.1 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS"
                    "clang/3.5.2 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS"
                    "clang/3.6.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS"
                    "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS"
    @@ -332,6 +345,8 @@ if [ "$PRINT_HELP" = "True" ]; then
       echo "--dry-run: Just print what would be executed"
       echo "--build-only: Just do builds, don't run anything"
       echo "--opt-flag=FLAG: Optimization flag (default: -O3)"
    +  echo "--cxxflags-extra=FLAGS: Extra flags to be added to CXX_FLAGS"
    +  echo "--ldflags-extra=FLAGS: Extra flags to be added to LD_FLAGS"
       echo "--arch=ARCHITECTURE: overwrite architecture flags"
       echo "--with-cuda-options=OPT: set KOKKOS_CUDA_OPTIONS"
       echo "--build-list=BUILD,BUILD,BUILD..."
    @@ -357,14 +372,14 @@ if [ "$PRINT_HELP" = "True" ]; then
       echo "  Run all gcc tests"
       echo "  % test_all_sandia gcc"
       echo ""
    -  echo "  Run all gcc/4.7.2 and all intel tests"
    -  echo "  % test_all_sandia gcc/4.7.2 intel"
    +  echo "  Run all gcc/4.8.4 and all intel tests"
    +  echo "  % test_all_sandia gcc/4.8.4 intel"
       echo ""
       echo "  Run all tests in debug"
       echo "  % test_all_sandia --debug"
       echo ""
    -  echo "  Run gcc/4.7.2 and only do OpenMP and OpenMP_Serial builds"
    -  echo "  % test_all_sandia gcc/4.7.2 --build-list=OpenMP,OpenMP_Serial"
    +  echo "  Run gcc/4.8.4 and only do OpenMP and OpenMP_Serial builds"
    +  echo "  % test_all_sandia gcc/4.8.4 --build-list=OpenMP,OpenMP_Serial"
       echo ""
       echo "If you want to kill the tests, do:"
       echo "  hit ctrl-z"
    @@ -562,10 +577,15 @@ single_build_and_test() {
       if [[ "$build_type" = *debug* ]]; then
         local extra_args="$extra_args --debug"
         local cxxflags="-g $compiler_warning_flags"
    +    local ldflags="-g"
       else
         local cxxflags="$OPT_FLAG $compiler_warning_flags"
    +    local ldflags="${OPT_FLAG}"
       fi
     
    +  local cxxflags="${cxxflags} ${CXX_FLAGS_EXTRA}"
    +  local ldflags="${ldflags} ${LD_FLAGS_EXTRA}"
    +
       if [[ "$KOKKOS_CUDA_OPTIONS" != "" ]]; then
         local extra_args="$extra_args $KOKKOS_CUDA_OPTIONS"
       fi
    @@ -582,9 +602,9 @@ single_build_and_test() {
           run_cmd ls fake_problem >& ${desc}.configure.log || { report_and_log_test_result 1 $desc configure && return 0; }
         fi
       else
    -    run_cmd ${KOKKOS_PATH}/generate_makefile.bash --with-devices=$build $ARCH_FLAG --compiler=$(which $compiler_exe) --cxxflags=\"$cxxflags\" $extra_args &>> ${desc}.configure.log || { report_and_log_test_result 1 ${desc} configure && return 0; }
    +    run_cmd ${KOKKOS_PATH}/generate_makefile.bash --with-devices=$build $ARCH_FLAG --compiler=$(which $compiler_exe) --cxxflags=\"$cxxflags\" --ldflags=\"$ldflags\" $extra_args &>> ${desc}.configure.log || { report_and_log_test_result 1 ${desc} configure && return 0; }
         local -i build_start_time=$(date +%s)
    -    run_cmd make build-test >& ${desc}.build.log || { report_and_log_test_result 1 ${desc} build && return 0; }
    +    run_cmd make -j 32 build-test >& ${desc}.build.log || { report_and_log_test_result 1 ${desc} build && return 0; }
         local -i build_end_time=$(date +%s)
         comment="build_time=$(($build_end_time-$build_start_time))"
     
    diff --git a/lib/kokkos/config/trilinos-integration/checkin-test b/lib/kokkos/config/trilinos-integration/checkin-test
    index 92a1b1c068..ffb565fcbb 100644
    --- a/lib/kokkos/config/trilinos-integration/checkin-test
    +++ b/lib/kokkos/config/trilinos-integration/checkin-test
    @@ -1,4 +1,4 @@
     module purge
    -module load sems-env sems-gcc/4.9.3 sems-openmpi/1.10.1 sems-hdf5/1.8.12/parallel sems-netcdf/4.3.2/parallel sems-python/2.7.9 sems-zlib/1.2.8/base sems-cmake/3.5.2 sems-parmetis/4.0.3/64bit_parallel sems-scotch/6.0.3/nopthread_64bit_parallel sems-boost/1.59.0/base
    +module load sems-env sems-gcc/4.9.3 sems-openmpi/1.10.1 sems-hdf5/1.8.12/parallel sems-netcdf/4.3.2/parallel sems-python/2.7.9 sems-zlib/1.2.8/base sems-cmake/3.5.2 sems-parmetis/4.0.3/64bit_parallel sems-scotch/6.0.3/nopthread_64bit_parallel sems-boost/1.63.0/base sems-yaml_cpp sems-superlu
     
     #Run Trilinos CheckinTest
    diff --git a/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel
    index 23968e8c0f..f122a1b36f 100755
    --- a/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel
    +++ b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel
    @@ -1,6 +1,6 @@
     #!/bin/bash -el
     ulimit -c 0
    -module load devpack/openmpi/1.10.0/intel/16.1.056/cuda/none 
    +module load devpack/openmpi/2.1.1/intel/17.4.196/cuda/none
     
     KOKKOS_BRANCH=$1
     TRILINOS_UPDATE_BRANCH=$2
    @@ -28,14 +28,14 @@ export JENKINS_DO_PTHREAD=ON
     export JENKINS_DO_SERIAL=OFF
     export JENKINS_DO_COMPLEX=OFF
     
    -export ARCH_CXX_FLAG="-xCORE-AVX2 -mkl"
    -export ARCH_C_FLAG="-xCORE-AVX2 -mkl"
    +export JENKINS_ARCH_CXX_FLAG="-xCORE-AVX2 -mkl"
    +export JENKINS_ARCH_C_FLAG="-xCORE-AVX2 -mkl"
     export BLAS_LIBRARIES="-mkl;${MKLROOT}/lib/intel64/libmkl_intel_lp64.a;${MKLROOT}/lib/intel64/libmkl_intel_thread.a;${MKLROOT}/lib/intel64/libmkl_core.a"
     export LAPACK_LIBRARIES=${BLAS_LIBRARIES}
     
     export JENKINS_DO_TESTS=ON
     export JENKINS_DO_EXAMPLES=ON
    -export JENKINS_DO_SHARED=OFF
    +export JENKINS_DO_SHARED=ON
     
     export QUEUE=haswell
     
    diff --git a/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel
    index 964de3a002..f9b2200a43 100755
    --- a/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel
    +++ b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel
    @@ -1,6 +1,6 @@
     #!/bin/bash -el
     ulimit -c 0
    -module load devpack/openmpi/1.10.0/intel/16.1.056/cuda/none 
    +module load devpack/openmpi/2.1.1/intel/17.4.196/cuda/none
     
     KOKKOS_BRANCH=$1
     TRILINOS_UPDATE_BRANCH=$2
    @@ -28,14 +28,14 @@ export JENKINS_DO_PTHREAD=OFF
     export JENKINS_DO_SERIAL=ON
     export JENKINS_DO_COMPLEX=ON
     
    -export ARCH_CXX_FLAG="-xCORE-AVX2 -mkl"
    -export ARCH_C_FLAG="-xCORE-AVX2 -mkl"
    +export JENKINS_ARCH_CXX_FLAG="-xCORE-AVX2 -mkl"
    +export JENKINS_ARCH_C_FLAG="-xCORE-AVX2 -mkl"
     export BLAS_LIBRARIES="-mkl;${MKLROOT}/lib/intel64/libmkl_intel_lp64.a;${MKLROOT}/lib/intel64/libmkl_intel_thread.a;${MKLROOT}/lib/intel64/libmkl_core.a"
     export LAPACK_LIBRARIES=${BLAS_LIBRARIES}
     
     export JENKINS_DO_TESTS=ON
     export JENKINS_DO_EXAMPLES=ON
    -export JENKINS_DO_SHARED=OFF
    +export JENKINS_DO_SHARED=ON
     
     export QUEUE=haswell
     
    diff --git a/lib/kokkos/containers/CMakeLists.txt b/lib/kokkos/containers/CMakeLists.txt
    index 894935fa01..c37aa3e3e2 100644
    --- a/lib/kokkos/containers/CMakeLists.txt
    +++ b/lib/kokkos/containers/CMakeLists.txt
    @@ -2,7 +2,10 @@
     
     TRIBITS_SUBPACKAGE(Containers)
     
    -ADD_SUBDIRECTORY(src)
    +
    +IF(KOKKOS_HAS_TRILINOS)
    +  ADD_SUBDIRECTORY(src)
    +ENDIF()
     
     TRIBITS_ADD_TEST_DIRECTORIES(unit_tests)
     TRIBITS_ADD_TEST_DIRECTORIES(performance_tests)
    diff --git a/lib/kokkos/containers/performance_tests/CMakeLists.txt b/lib/kokkos/containers/performance_tests/CMakeLists.txt
    index 403ac746f6..1203a8bd81 100644
    --- a/lib/kokkos/containers/performance_tests/CMakeLists.txt
    +++ b/lib/kokkos/containers/performance_tests/CMakeLists.txt
    @@ -3,6 +3,14 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
     INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR})
     INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src )
     
    +IF(NOT KOKKOS_HAS_TRILINOS)
    +  IF(KOKKOS_SEPARATE_LIBS)
    +    set(TEST_LINK_TARGETS kokkoscore)
    +  ELSE()
    +    set(TEST_LINK_TARGETS kokkos)
    +  ENDIF()
    +ENDIF()
    +
     SET(SOURCES
       TestMain.cpp 
       TestCuda.cpp
    @@ -24,7 +32,7 @@ TRIBITS_ADD_EXECUTABLE(
       PerfTestExec
       SOURCES ${SOURCES}
       COMM serial mpi
    -  TESTONLYLIBS kokkos_gtest
    +  TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS}
       )
     
     TRIBITS_ADD_TEST(
    diff --git a/lib/kokkos/containers/performance_tests/Makefile b/lib/kokkos/containers/performance_tests/Makefile
    index edaaf1ee51..ebed75ccd6 100644
    --- a/lib/kokkos/containers/performance_tests/Makefile
    +++ b/lib/kokkos/containers/performance_tests/Makefile
    @@ -15,7 +15,8 @@ endif
     
     CXXFLAGS = -O3
     LINK ?= $(CXX)
    -LDFLAGS ?= -lpthread
    +LDFLAGS ?=
    +override LDFLAGS += -lpthread
     
     include $(KOKKOS_PATH)/Makefile.kokkos
     
    @@ -30,6 +31,12 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1)
     	TEST_TARGETS += test-cuda
     endif
     
    +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1)
    +	OBJ_ROCM = TestROCm.o TestMain.o gtest-all.o
    +	TARGETS += KokkosContainers_PerformanceTest_ROCm
    +	TEST_TARGETS += test-rocm
    +endif
    +
     ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1)
     	OBJ_THREADS = TestThreads.o TestMain.o gtest-all.o
     	TARGETS += KokkosContainers_PerformanceTest_Threads
    @@ -45,6 +52,9 @@ endif
     KokkosContainers_PerformanceTest_Cuda: $(OBJ_CUDA) $(KOKKOS_LINK_DEPENDS)
     	$(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_CUDA) $(KOKKOS_LIBS) $(LIB) -o KokkosContainers_PerformanceTest_Cuda
     
    +KokkosContainers_PerformanceTest_ROCm: $(OBJ_ROCM) $(KOKKOS_LINK_DEPENDS)
    +	$(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_ROCM) $(KOKKOS_LIBS) $(LIB) -o KokkosContainers_PerformanceTest_ROCm
    +
     KokkosContainers_PerformanceTest_Threads: $(OBJ_THREADS) $(KOKKOS_LINK_DEPENDS)
     	$(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_THREADS) $(KOKKOS_LIBS) $(LIB) -o KokkosContainers_PerformanceTest_Threads
     
    @@ -54,13 +64,15 @@ KokkosContainers_PerformanceTest_OpenMP: $(OBJ_OPENMP) $(KOKKOS_LINK_DEPENDS)
     test-cuda: KokkosContainers_PerformanceTest_Cuda
     	./KokkosContainers_PerformanceTest_Cuda
     
    +test-rocm: KokkosContainers_PerformanceTest_ROCm
    +	./KokkosContainers_PerformanceTest_ROCm
    +
     test-threads: KokkosContainers_PerformanceTest_Threads
     	./KokkosContainers_PerformanceTest_Threads
     
     test-openmp: KokkosContainers_PerformanceTest_OpenMP
     	./KokkosContainers_PerformanceTest_OpenMP
     
    -
     build_all: $(TARGETS)
     
     test: $(TEST_TARGETS)
    diff --git a/lib/kokkos/containers/performance_tests/TestDynRankView.hpp b/lib/kokkos/containers/performance_tests/TestDynRankView.hpp
    index 4c0ccb6b88..ced74c6f51 100644
    --- a/lib/kokkos/containers/performance_tests/TestDynRankView.hpp
    +++ b/lib/kokkos/containers/performance_tests/TestDynRankView.hpp
    @@ -180,8 +180,8 @@ void test_dynrankview_op_perf( const int par_size )
     
       typedef DeviceType execution_space;
       typedef typename execution_space::size_type size_type;
    -  const size_type dim2 = 90;
    -  const size_type dim3 = 30;
    +  const size_type dim_2 = 90;
    +  const size_type dim_3 = 30;
     
       double elapsed_time_view = 0;
       double elapsed_time_compview = 0;
    @@ -191,7 +191,7 @@ void test_dynrankview_op_perf( const int par_size )
       double elapsed_time_compdrview = 0;
       Kokkos::Timer timer;
       {
    -    Kokkos::View testview("testview",par_size,dim2,dim3);
    +    Kokkos::View testview("testview",par_size,dim_2,dim_3);
         typedef InitViewFunctor FunctorType;
     
         timer.reset();
    @@ -220,7 +220,7 @@ void test_dynrankview_op_perf( const int par_size )
         std::cout << " Strided View time (init only): " << elapsed_time_strideview << std::endl;
       }
       {
    -    Kokkos::View testview("testview",par_size,dim2,dim3,1,1,1,1);
    +    Kokkos::View testview("testview",par_size,dim_2,dim_3,1,1,1,1);
         typedef InitViewRank7Functor FunctorType;
     
         timer.reset();
    @@ -231,7 +231,7 @@ void test_dynrankview_op_perf( const int par_size )
         std::cout << " View Rank7 time (init only): " << elapsed_time_view_rank7 << std::endl;
       }
       {
    -    Kokkos::DynRankView testdrview("testdrview",par_size,dim2,dim3);
    +    Kokkos::DynRankView testdrview("testdrview",par_size,dim_2,dim_3);
         typedef InitDynRankViewFunctor FunctorType;
     
         timer.reset();
    diff --git a/lib/kokkos/containers/performance_tests/TestMain.cpp b/lib/kokkos/containers/performance_tests/TestMain.cpp
    index f952ab3db5..1224af7cdb 100644
    --- a/lib/kokkos/containers/performance_tests/TestMain.cpp
    +++ b/lib/kokkos/containers/performance_tests/TestMain.cpp
    @@ -1,13 +1,13 @@
     /*
     //@HEADER
     // ************************************************************************
    -// 
    +//
     //                        Kokkos v. 2.0
     //              Copyright (2014) Sandia Corporation
    -// 
    +//
     // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
     // 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:
    @@ -36,12 +36,15 @@
     // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     //
     // Questions? Contact  H. Carter Edwards (hcedwar@sandia.gov)
    -// 
    +//
     // ************************************************************************
     //@HEADER
     */
     
     #include 
    +#include 
    +
    +#include 
     
     int main(int argc, char *argv[]) {
       ::testing::InitGoogleTest(&argc,argv);
    diff --git a/lib/kokkos/containers/performance_tests/TestOpenMP.cpp b/lib/kokkos/containers/performance_tests/TestOpenMP.cpp
    index b674ec4a74..012f45bab7 100644
    --- a/lib/kokkos/containers/performance_tests/TestOpenMP.cpp
    +++ b/lib/kokkos/containers/performance_tests/TestOpenMP.cpp
    @@ -54,6 +54,7 @@
     #include 
     
     #include 
    +#include 
     
     #include 
     #include 
    @@ -69,30 +70,13 @@ protected:
       {
         std::cout << std::setprecision(5) << std::scientific;
     
    -    unsigned num_threads = 4;
    -
    -    if (Kokkos::hwloc::available()) {
    -      num_threads = Kokkos::hwloc::get_available_numa_count()
    -                    * Kokkos::hwloc::get_available_cores_per_numa()
    -                    * Kokkos::hwloc::get_available_threads_per_core()
    -                    ;
    -
    -    }
    -
    -    std::cout << "OpenMP: " << num_threads << std::endl;
    -
    -    Kokkos::OpenMP::initialize( num_threads );
    -
    -    std::cout << "available threads: " << omp_get_max_threads() << std::endl;
    +    Kokkos::OpenMP::initialize();
    +    Kokkos::OpenMP::print_configuration( std::cout );
       }
     
       static void TearDownTestCase()
       {
         Kokkos::OpenMP::finalize();
    -
    -    omp_set_num_threads(1);
    -
    -    ASSERT_EQ( 1 , omp_get_max_threads() );
       }
     };
     
    @@ -139,6 +123,18 @@ TEST_F( openmp, unordered_map_performance_far)
       Perf::run_performance_tests(base_file_name.str());
     }
     
    +TEST_F( openmp, scatter_view)
    +{
    +  std::cout << "ScatterView data-duplicated test:\n";
    +  Perf::test_scatter_view(10, 1000 * 1000);
    +//std::cout << "ScatterView atomics test:\n";
    +//Perf::test_scatter_view(10, 1000 * 1000);
    +}
    +
     } // namespace test
     #else
     void KOKKOS_CONTAINERS_PERFORMANCE_TESTS_TESTOPENMP_PREVENT_EMPTY_LINK_ERROR() {}
    diff --git a/lib/kokkos/containers/performance_tests/TestROCm.cpp b/lib/kokkos/containers/performance_tests/TestROCm.cpp
    new file mode 100644
    index 0000000000..6647d23065
    --- /dev/null
    +++ b/lib/kokkos/containers/performance_tests/TestROCm.cpp
    @@ -0,0 +1,113 @@
    +/*
    +//@HEADER
    +// ************************************************************************
    +//
    +//                        Kokkos v. 2.0
    +//              Copyright (2014) Sandia Corporation
    +//
    +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
    +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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  H. Carter Edwards (hcedwar@sandia.gov)
    +//
    +// ************************************************************************
    +//@HEADER
    +*/
    +
    +#include 
    +#if defined( KOKKOS_ENABLE_ROCM )
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#include 
    +
    +#include 
    +
    +#include 
    +
    +#include 
    +
    +#include 
    +
    +#include 
    +
    +namespace Performance {
    +
    +class rocm : public ::testing::Test {
    +protected:
    +  static void SetUpTestCase()
    +  {
    +    std::cout << std::setprecision(5) << std::scientific;
    +    Kokkos::HostSpace::execution_space::initialize();
    +    Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice(0) );
    +  }
    +  static void TearDownTestCase()
    +  {
    +    Kokkos::Experimental::ROCm::finalize();
    +    Kokkos::HostSpace::execution_space::finalize();
    +  }
    +};
    +#if 0
    +// issue 1089
    +TEST_F( rocm, dynrankview_perf )
    +{
    +  std::cout << "ROCm" << std::endl;
    +  std::cout << " DynRankView vs View: Initialization Only " << std::endl;
    +  test_dynrankview_op_perf( 40960 );
    +}
    +
    +TEST_F( rocm, global_2_local)
    +{
    +  std::cout << "ROCm" << std::endl;
    +  std::cout << "size, create, generate, fill, find" << std::endl;
    +  for (unsigned i=Performance::begin_id_size; i<=Performance::end_id_size; i *= Performance::id_step)
    +    test_global_to_local_ids(i);
    +}
    +
    +#endif
    +TEST_F( rocm, unordered_map_performance_near)
    +{
    +  Perf::run_performance_tests("rocm-near");
    +}
    +
    +TEST_F( rocm, unordered_map_performance_far)
    +{
    +  Perf::run_performance_tests("rocm-far");
    +}
    +
    +}
    +#else
    +void KOKKOS_CONTAINERS_PERFORMANCE_TESTS_TESTROCM_PREVENT_EMPTY_LINK_ERROR() {}
    +#endif  /* #if defined( KOKKOS_ENABLE_ROCM ) */
    diff --git a/lib/kokkos/containers/performance_tests/TestScatterView.hpp b/lib/kokkos/containers/performance_tests/TestScatterView.hpp
    new file mode 100644
    index 0000000000..4fd69173c0
    --- /dev/null
    +++ b/lib/kokkos/containers/performance_tests/TestScatterView.hpp
    @@ -0,0 +1,113 @@
    +/*
    +//@HEADER
    +// ************************************************************************
    +//
    +//                        Kokkos v. 2.0
    +//              Copyright (2014) Sandia Corporation
    +//
    +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
    +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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  H. Carter Edwards (hcedwar@sandia.gov)
    +//
    +// ************************************************************************
    +//@HEADER
    +*/
    +
    +#ifndef KOKKOS_TEST_SCATTER_VIEW_HPP
    +#define KOKKOS_TEST_SCATTER_VIEW_HPP
    +
    +#include 
    +#include 
    +
    +namespace Perf {
    +
    +template 
    +void test_scatter_view(int m, int n)
    +{
    +  Kokkos::View original_view("original_view", n);
    +  {
    +    auto scatter_view = Kokkos::Experimental::create_scatter_view
    +      < Kokkos::Experimental::ScatterSum
    +      , duplication
    +      , contribution
    +      > (original_view);
    +    Kokkos::Experimental::UniqueToken<
    +      ExecSpace, Kokkos::Experimental::UniqueTokenScope::Global>
    +      unique_token{ExecSpace()};
    +  //auto internal_view = scatter_view.internal_view;
    +    auto policy = Kokkos::RangePolicy(0, n);
    +    for (int foo = 0; foo < 5; ++foo) {
    +    {
    +      auto num_threads = unique_token.size();
    +      std::cout << "num_threads " << num_threads << '\n';
    +      Kokkos::View hand_coded_duplicate_view("hand_coded_duplicate", num_threads, n);
    +      auto f2 = KOKKOS_LAMBDA(int i) {
    +        auto thread_id = unique_token.acquire();
    +        for (int j = 0; j < 10; ++j) {
    +          auto k = (i + j) % n;
    +          hand_coded_duplicate_view(thread_id, k, 0) += 4.2;
    +          hand_coded_duplicate_view(thread_id, k, 1) += 2.0;
    +          hand_coded_duplicate_view(thread_id, k, 2) += 1.0;
    +        }
    +      };
    +      Kokkos::Timer timer;
    +      timer.reset();
    +      for (int k = 0; k < m; ++k) {
    +        Kokkos::parallel_for(policy, f2, "hand_coded_duplicate_scatter_view_test");
    +      }
    +      auto t = timer.seconds();
    +      std::cout << "hand-coded test took " << t << " seconds\n";
    +    }
    +    {
    +      auto f = KOKKOS_LAMBDA(int i) {
    +        auto scatter_access = scatter_view.access();
    +        for (int j = 0; j < 10; ++j) {
    +          auto k = (i + j) % n;
    +          scatter_access(k, 0) += 4.2;
    +          scatter_access(k, 1) += 2.0;
    +          scatter_access(k, 2) += 1.0;
    +        }
    +      };
    +      Kokkos::Timer timer;
    +      timer.reset();
    +      for (int k = 0; k < m; ++k) {
    +        Kokkos::parallel_for(policy, f, "scatter_view_test");
    +      }
    +      auto t = timer.seconds();
    +      std::cout << "test took " << t << " seconds\n";
    +    }
    +  }
    +  }
    +}
    +
    +}
    +
    +#endif
    diff --git a/lib/kokkos/containers/src/CMakeLists.txt b/lib/kokkos/containers/src/CMakeLists.txt
    index da5a791530..e68fcad5e9 100644
    --- a/lib/kokkos/containers/src/CMakeLists.txt
    +++ b/lib/kokkos/containers/src/CMakeLists.txt
    @@ -6,26 +6,42 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
     
     #-----------------------------------------------------------------------------
     
    -SET(HEADERS "")
    -SET(SOURCES "")
    -
    -SET(HEADERS_IMPL "")
    -
    -FILE(GLOB HEADERS *.hpp)
    -FILE(GLOB HEADERS_IMPL impl/*.hpp)
    -FILE(GLOB SOURCES impl/*.cpp)
    -
     SET(TRILINOS_INCDIR ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR})
     
    -INSTALL(FILES ${HEADERS_IMPL} DESTINATION ${TRILINOS_INCDIR}/impl/)
    +if(KOKKOS_LEGACY_TRIBITS)
     
    -TRIBITS_ADD_LIBRARY(
    -    kokkoscontainers
    -    HEADERS ${HEADERS}
    -    NOINSTALLHEADERS ${HEADERS_IMPL}
    -    SOURCES ${SOURCES}
    -    DEPLIBS
    -    )
    +  SET(HEADERS "")
    +  SET(SOURCES "")
     
    +  SET(HEADERS_IMPL "")
    +
    +  FILE(GLOB HEADERS *.hpp)
    +  FILE(GLOB HEADERS_IMPL impl/*.hpp)
    +  FILE(GLOB SOURCES impl/*.cpp)
    +
    +  INSTALL(FILES ${HEADERS_IMPL} DESTINATION ${TRILINOS_INCDIR}/impl/)
    +
    +  TRIBITS_ADD_LIBRARY(
    +      kokkoscontainers
    +      HEADERS ${HEADERS}
    +      NOINSTALLHEADERS ${HEADERS_IMPL}
    +      SOURCES ${SOURCES}
    +      DEPLIBS
    +      )
    +
    +else()
    +
    +  INSTALL (
    +      DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/"
    +      DESTINATION ${TRILINOS_INCDIR}
    +      FILES_MATCHING PATTERN "*.hpp"
    +      )
    +
    +  TRIBITS_ADD_LIBRARY(
    +      kokkoscontainers
    +      SOURCES ${KOKKOS_CONTAINERS_SRCS}
    +      DEPLIBS
    +      )
    +
    +endif()
     #-----------------------------------------------------------------------------
    -
    diff --git a/lib/kokkos/containers/src/Kokkos_DualView.hpp b/lib/kokkos/containers/src/Kokkos_DualView.hpp
    index 937eab0d88..35cc8ec753 100644
    --- a/lib/kokkos/containers/src/Kokkos_DualView.hpp
    +++ b/lib/kokkos/containers/src/Kokkos_DualView.hpp
    @@ -564,7 +564,7 @@ namespace Impl {
     template< class D, class A1, class A2, class A3, class ... Args >
     struct DualViewSubview {
     
    -  typedef typename Kokkos::Experimental::Impl::ViewMapping
    +  typedef typename Kokkos::Impl::ViewMapping
         < void
         , Kokkos::ViewTraits< D, A1, A2, A3 >
         , Args ...
    diff --git a/lib/kokkos/containers/src/Kokkos_DynRankView.hpp b/lib/kokkos/containers/src/Kokkos_DynRankView.hpp
    index 8e464506f9..d22d6b865d 100644
    --- a/lib/kokkos/containers/src/Kokkos_DynRankView.hpp
    +++ b/lib/kokkos/containers/src/Kokkos_DynRankView.hpp
    @@ -46,19 +46,6 @@
     ///
     /// This header file declares and defines Kokkos::Experimental::DynRankView and its
     /// related nonmember functions.
    -/*
    - *   Changes from View
    - *   1. The rank of the DynRankView is returned by the method rank()
    - *   2. Max rank of a DynRankView is 7
    - *   3. subview name is subdynrankview
    - *   4. Every subdynrankview is returned with LayoutStride
    - *
    - *   NEW: Redesigned DynRankView
    - *   5. subview function name now available
    - *   6. Copy and Copy-Assign View to DynRankView
    - *   7. deep_copy between Views and DynRankViews
    - *   8. rank( view ); returns the rank of View or DynRankView
    - */
     
     #ifndef KOKKOS_DYNRANKVIEW_HPP
     #define KOKKOS_DYNRANKVIEW_HPP
    @@ -117,6 +104,14 @@ struct DynRankDimTraits {
                           , layout.dimension[7] );
       }
     
    +  // Extra overload to match that for specialize types v2
    +  template 
    +  KOKKOS_INLINE_FUNCTION
    +  static size_t computeRank( const Kokkos::Impl::ViewCtorProp& prop, const Layout& layout )
    +  {
    +    return computeRank(layout);
    +  }
    +
       // Create the layout for the rank-7 view.
       // Non-strided Layout
       template 
    @@ -158,8 +153,17 @@ struct DynRankDimTraits {
                      );
       }
     
    +  // Extra overload to match that for specialize types
    +  template 
    +  KOKKOS_INLINE_FUNCTION
    +  static typename std::enable_if< (std::is_same::value || std::is_same::value || std::is_same::value) , typename Traits::array_layout >::type createLayout( const ViewCtorProp& prop, const typename Traits::array_layout& layout )
    +  {
    +    return createLayout( layout );
    +  }
    +
       // Create a view from the given dimension arguments.
       // This is only necessary because the shmem constructor doesn't take a layout.
    +  //   NDE shmem View's are not compatible with the added view_alloc value_type / fad_dim deduction functionality
       template 
       static ViewType createView( const ViewArg& arg
                                 , const size_t N0
    @@ -186,7 +190,8 @@ struct DynRankDimTraits {
       // Non-strided Layout
       template 
       KOKKOS_INLINE_FUNCTION
    -  static typename std::enable_if< (std::is_same::value || std::is_same::value) && std::is_integral::value , Layout >::type reconstructLayout( const Layout& layout , iType dynrank )
    +  static typename std::enable_if< (std::is_same::value || std::is_same::value) && std::is_integral::value , Layout >::type
    +  reconstructLayout( const Layout& layout , iType dynrank )
       {
         return Layout( dynrank > 0 ? layout.dimension[0] : ~size_t(0)
                      , dynrank > 1 ? layout.dimension[1] : ~size_t(0)
    @@ -202,7 +207,8 @@ struct DynRankDimTraits {
       // LayoutStride
       template 
       KOKKOS_INLINE_FUNCTION
    -  static typename std::enable_if< (std::is_same::value) && std::is_integral::value , Layout >::type reconstructLayout( const Layout& layout , iType dynrank )
    +  static typename std::enable_if< (std::is_same::value) && std::is_integral::value , Layout >::type
    +  reconstructLayout( const Layout& layout , iType dynrank )
       {
         return Layout( dynrank > 0 ? layout.dimension[0] : ~size_t(0)
                      , dynrank > 0 ? layout.stride[0] : (0)
    @@ -311,6 +317,11 @@ void dyn_rank_view_verify_operator_bounds
     /** \brief  Assign compatible default mappings */
     struct ViewToDynRankViewTag {};
     
    +} // namespace Impl
    +} // namespace Experimental
    +
    +namespace Impl {
    +
     template< class DstTraits , class SrcTraits >
     class ViewMapping< DstTraits , SrcTraits ,
       typename std::enable_if<(
    @@ -337,7 +348,7 @@ class ViewMapping< DstTraits , SrcTraits ,
             )
           )
         )
    -  ) , ViewToDynRankViewTag >::type >
    +  ) , Kokkos::Experimental::Impl::ViewToDynRankViewTag >::type >
     {
     private:
     
    @@ -376,7 +387,7 @@ public:
     
           typedef typename DstType::offset_type  dst_offset_type ;
           dst.m_map.m_offset = dst_offset_type(std::integral_constant() , src.layout() ); //Check this for integer input1 for padding, etc
    -      dst.m_map.m_handle = Kokkos::Experimental::Impl::ViewDataHandle< DstTraits >::assign( src.m_map.m_handle , src.m_track );
    +      dst.m_map.m_handle = Kokkos::Impl::ViewDataHandle< DstTraits >::assign( src.m_map.m_handle , src.m_track );
           dst.m_track.assign( src.m_track , DstTraits::is_managed );
           dst.m_rank = src.Rank ;
         }
    @@ -384,22 +395,20 @@ public:
     
     } //end Impl
     
    +namespace Experimental {
    +
     /* \class DynRankView
      * \brief Container that creates a Kokkos view with rank determined at runtime.
    - *   Essentially this is a rank 7 view that wraps the access operators
    - *   to yield the functionality of a view
    + *   Essentially this is a rank 7 view
      *
      *   Changes from View
      *   1. The rank of the DynRankView is returned by the method rank()
      *   2. Max rank of a DynRankView is 7
    - *   3. subview name is subdynrankview
    - *   4. Every subdynrankview is returned with LayoutStride
    - *
    - *   NEW: Redesigned DynRankView
    - *   5. subview function name now available
    - *   6. Copy and Copy-Assign View to DynRankView
    - *   7. deep_copy between Views and DynRankViews
    - *   8. rank( view ); returns the rank of View or DynRankView
    + *   3. subview called with 'subview(...)' or 'subdynrankview(...)' (backward compatibility) 
    + *   4. Every subview is returned with LayoutStride
    + *   5. Copy and Copy-Assign View to DynRankView
    + *   6. deep_copy between Views and DynRankViews
    + *   7. rank( view ); returns the rank of View or DynRankView
      *
      */
     
    @@ -427,7 +436,7 @@ public:
     
     
     private:
    -  typedef Kokkos::Experimental::Impl::ViewMapping< traits , void > map_type ;
    +  typedef Kokkos::Impl::ViewMapping< traits , void > map_type ;
       typedef Kokkos::Experimental::Impl::SharedAllocationTracker      track_type ;
     
       track_type  m_track ;
    @@ -556,7 +565,7 @@ public:
       // Allow specializations to query their specialized map
     
       KOKKOS_INLINE_FUNCTION
    -  const Kokkos::Experimental::Impl::ViewMapping< traits , void > &
    +  const Kokkos::Impl::ViewMapping< traits , void > &
       implementation_map() const { return m_map ; }
     
       //----------------------------------------
    @@ -803,7 +812,7 @@ public:
         , m_rank(rhs.m_rank)
         {
           typedef typename DynRankView ::traits SrcTraits ;
    -      typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits , void > Mapping ;
    +      typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , void > Mapping ;
           static_assert( Mapping::is_assignable , "Incompatible DynRankView copy construction" );
           Mapping::assign( m_map , rhs.m_map , rhs.m_track );
         }
    @@ -813,7 +822,7 @@ public:
       DynRankView & operator = (const DynRankView & rhs )
         {
           typedef typename DynRankView ::traits SrcTraits ;
    -      typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits , void > Mapping ;
    +      typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , void > Mapping ;
           static_assert( Mapping::is_assignable , "Incompatible DynRankView copy construction" );
           Mapping::assign( m_map , rhs.m_map , rhs.m_track );
           m_track.assign( rhs.m_track , traits::is_managed );
    @@ -831,7 +840,7 @@ public:
         , m_rank( rhs.Rank )
         {
           typedef typename View::traits  SrcTraits ;
    -      typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag >  Mapping ;
    +      typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag >  Mapping ;
           static_assert( Mapping::is_assignable , "Incompatible DynRankView copy construction" );
           Mapping::assign( *this , rhs );
         }
    @@ -841,7 +850,7 @@ public:
       DynRankView & operator = ( const View & rhs )
         {
           typedef typename View::traits  SrcTraits ;
    -      typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag >  Mapping ;
    +      typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag >  Mapping ;
           static_assert( Mapping::is_assignable , "Incompatible View to DynRankView copy assignment" );
           Mapping::assign( *this , rhs );
           return *this ;
    @@ -870,7 +879,7 @@ public:
           )
           : m_track()
           , m_map()
    -      , m_rank( Impl::DynRankDimTraits::computeRank(arg_layout) )
    +      , m_rank( Impl::DynRankDimTraits::template computeRank< typename traits::array_layout, P...>(arg_prop, arg_layout) )
         {
           // Append layout and spaces if not input
           typedef Impl::ViewCtorProp< P ... > alloc_prop_input ;
    @@ -923,7 +932,7 @@ public:
     //------------------------------------------------------------
     
           Kokkos::Experimental::Impl::SharedAllocationRecord<> *
    -        record = m_map.allocate_shared( prop , Impl::DynRankDimTraits::createLayout(arg_layout) );
    +        record = m_map.allocate_shared( prop , Impl::DynRankDimTraits::template createLayout(arg_prop, arg_layout) );
     
     //------------------------------------------------------------
     #if defined( KOKKOS_ENABLE_CUDA )
    @@ -947,8 +956,8 @@ public:
                                    >::type const & arg_layout
           )
           : m_track() // No memory tracking
    -      , m_map( arg_prop , Impl::DynRankDimTraits::createLayout(arg_layout) )
    -      , m_rank( Impl::DynRankDimTraits::computeRank(arg_layout) )
    +      , m_map( arg_prop , Impl::DynRankDimTraits::template createLayout(arg_prop, arg_layout) )
    +      , m_rank( Impl::DynRankDimTraits::template computeRank< typename traits::array_layout, P...>(arg_prop, arg_layout) )
         {
           static_assert(
             std::is_same< pointer_type
    @@ -1034,6 +1043,7 @@ public:
         {}
     
       // For backward compatibility
    +  // NDE This ctor does not take ViewCtorProp argument - should not use alternative createLayout call
       explicit inline
       DynRankView( const ViewAllocateWithoutInitializing & arg_prop
           , const typename traits::array_layout & arg_layout
    @@ -1179,6 +1189,11 @@ namespace Impl {
     
     struct DynRankSubviewTag {};
     
    +} // namespace Impl
    +} // namespace Experimental
    +
    +namespace Impl {
    +
     template< class SrcTraits , class ... Args >
     struct ViewMapping
       < typename std::enable_if<(
    @@ -1192,7 +1207,7 @@ struct ViewMapping
             std::is_same< typename SrcTraits::array_layout
                         , Kokkos::LayoutStride >::value
           )
    -    ), DynRankSubviewTag >::type
    +    ), Kokkos::Experimental::Impl::DynRankSubviewTag >::type
       , SrcTraits
       , Args ... >
     {
    @@ -1264,7 +1279,7 @@ public:
       };
     
     
    -  typedef DynRankView< value_type , array_layout , typename SrcTraits::device_type , typename SrcTraits::memory_traits >  ret_type;
    +  typedef Kokkos::Experimental::DynRankView< value_type , array_layout , typename SrcTraits::device_type , typename SrcTraits::memory_traits >  ret_type;
     
       template < typename T , class ... P >
       KOKKOS_INLINE_FUNCTION
    @@ -1336,9 +1351,10 @@ public:
     
     } // end Impl
     
    +namespace Experimental {
     
     template< class V , class ... Args >
    -using Subdynrankview = typename Kokkos::Experimental::Impl::ViewMapping< Kokkos::Experimental::Impl::DynRankSubviewTag , V , Args... >::ret_type ;
    +using Subdynrankview = typename Kokkos::Impl::ViewMapping< Kokkos::Experimental::Impl::DynRankSubviewTag , V , Args... >::ret_type ;
     
     template< class D , class ... P , class ...Args >
     KOKKOS_INLINE_FUNCTION
    @@ -1348,7 +1364,7 @@ subdynrankview( const Kokkos::Experimental::DynRankView< D , P... > &src , Args.
         if ( src.rank() > sizeof...(Args) ) //allow sizeof...(Args) >= src.rank(), ignore the remaining args
           { Kokkos::abort("subdynrankview: num of args must be >= rank of the source DynRankView"); }
     
    -    typedef Kokkos::Experimental::Impl::ViewMapping< Kokkos::Experimental::Impl::DynRankSubviewTag , Kokkos::ViewTraits< D*******, P... > , Args... > metafcn ;
    +    typedef Kokkos::Impl::ViewMapping< Kokkos::Experimental::Impl::DynRankSubviewTag , Kokkos::ViewTraits< D*******, P... > , Args... > metafcn ;
     
         return metafcn::subview( src.rank() , src , args... );
       }
    diff --git a/lib/kokkos/containers/src/Kokkos_DynamicView.hpp b/lib/kokkos/containers/src/Kokkos_DynamicView.hpp
    index da96db2d6b..86275ce7c9 100644
    --- a/lib/kokkos/containers/src/Kokkos_DynamicView.hpp
    +++ b/lib/kokkos/containers/src/Kokkos_DynamicView.hpp
    @@ -1,13 +1,13 @@
     /*
     //@HEADER
     // ************************************************************************
    -// 
    +//
     //                        Kokkos v. 2.0
     //              Copyright (2014) Sandia Corporation
    -// 
    +//
     // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
     // 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:
    @@ -36,7 +36,7 @@
     // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     //
     // Questions? Contact  H. Carter Edwards (hcedwar@sandia.gov)
    -// 
    +//
     // ************************************************************************
     //@HEADER
     */
    @@ -57,7 +57,7 @@ namespace Experimental {
      */
     template< typename DataType , typename ... P >
     class DynamicView : public Kokkos::ViewTraits< DataType , P ... >
    -{ 
    +{
     public:
     
       typedef Kokkos::ViewTraits< DataType , P ... >  traits ;
    @@ -68,12 +68,14 @@ private:
     
       typedef Kokkos::Experimental::Impl::SharedAllocationTracker   track_type ;
     
    -  static_assert( traits::rank == 1 && traits::rank_dynamic == 1 
    +  static_assert( traits::rank == 1 && traits::rank_dynamic == 1
                    , "DynamicView must be rank-one" );
     
       static_assert( std::is_trivial< typename traits::value_type >::value &&
    -                 std::is_same< typename traits::specialize , void >::value
    -               , "DynamicView must have trivial data type" );
    +                 std::is_same< typename traits::specialize , void >::value &&
    +                 Kokkos::Impl::is_power_of_two
    +                   ::value
    +               , "DynamicView must have trivial value_type and sizeof(value_type) is a power-of-two");
     
     
       template< class Space , bool = Kokkos::Impl::MemorySpaceAccess< Space , typename traits::memory_space >::accessible > struct verify_space
    @@ -216,14 +218,14 @@ public:
             // Verify that allocation of the requested chunk in in progress.
     
             // The allocated chunk counter is m_chunks[ m_chunk_max ]
    -        const uintptr_t n = 
    +        const uintptr_t n =
               *reinterpret_cast( m_chunks + m_chunk_max );
     
             if ( n <= ic ) {
               Kokkos::abort("Kokkos::DynamicView array bounds error");
             }
     
    -        // Allocation of this chunk is in progress 
    +        // Allocation of this chunk is in progress
             // so wait for allocation to complete.
             while ( 0 == *ch );
           }
    @@ -267,7 +269,7 @@ public:
             const uintptr_t jc_try = jc ;
     
             // Jump iteration to the chunk counter.
    -        
    +
             jc = atomic_compare_exchange( pc , jc_try , jc_try + 1 );
     
             if ( jc_try == jc ) {
    @@ -316,7 +318,7 @@ public:
           }
           else {
             while ( NC + 1 <= *pc ) {
    -          --*pc ;        
    +          --*pc ;
               m_pool.deallocate( m_chunks[*pc]
                                , sizeof(value_type) << m_chunk_shift );
               m_chunks[*pc] = 0 ;
    @@ -331,7 +333,7 @@ public:
         typename traits::value_type ** m_chunks ;
         uintptr_t                    * m_pc ;
         uintptr_t                      m_nc ;
    -    unsigned                       m_chunk_shift ;  
    +    unsigned                       m_chunk_shift ;
     
         KOKKOS_INLINE_FUNCTION
         void operator()( int ) const
    @@ -348,7 +350,7 @@ public:
             }
             else {
               while ( m_nc + 1 <= *m_pc ) {
    -            --*m_pc ;        
    +            --*m_pc ;
                 m_pool.deallocate( m_chunks[*m_pc]
                                  , sizeof(value_type) << m_chunk_shift );
                 m_chunks[*m_pc] = 0 ;
    @@ -482,7 +484,7 @@ public:
       };
     
     
    -  /**\brief  Allocation constructor 
    +  /**\brief  Allocation constructor
        *
        *  Memory is allocated in chunks from the memory pool.
        *  The chunk size conforms to the memory pool's chunk size.
    @@ -557,7 +559,7 @@ void deep_copy( const View & dst
     
       if ( DstExecCanAccessSrc ) {
         // Copying data between views in accessible memory spaces and either non-contiguous or incompatible shape.
    -    Kokkos::Experimental::Impl::ViewRemap< dst_type , src_type >( dst , src );
    +    Kokkos::Impl::ViewRemap< dst_type , src_type >( dst , src );
       }
       else {
         Kokkos::Impl::throw_runtime_exception("deep_copy given views that would require a temporary allocation");
    @@ -581,7 +583,7 @@ void deep_copy( const DynamicView & dst
     
       if ( DstExecCanAccessSrc ) {
         // Copying data between views in accessible memory spaces and either non-contiguous or incompatible shape.
    -    Kokkos::Experimental::Impl::ViewRemap< dst_type , src_type >( dst , src );
    +    Kokkos::Impl::ViewRemap< dst_type , src_type >( dst , src );
       }
       else {
         Kokkos::Impl::throw_runtime_exception("deep_copy given views that would require a temporary allocation");
    diff --git a/lib/kokkos/containers/src/Kokkos_ScatterView.hpp b/lib/kokkos/containers/src/Kokkos_ScatterView.hpp
    new file mode 100644
    index 0000000000..48c4709480
    --- /dev/null
    +++ b/lib/kokkos/containers/src/Kokkos_ScatterView.hpp
    @@ -0,0 +1,999 @@
    +/*
    +//@HEADER
    +// ************************************************************************
    +//
    +//                        Kokkos v. 2.0
    +//              Copyright (2014) Sandia Corporation
    +//
    +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
    +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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  H. Carter Edwards (hcedwar@sandia.gov)
    +//
    +// ************************************************************************
    +//@HEADER
    +*/
    +
    +
    +/// \file Kokkos_ScatterView.hpp
    +/// \brief Declaration and definition of Kokkos::ScatterView.
    +///
    +/// This header file declares and defines Kokkos::ScatterView and its
    +/// related nonmember functions.
    +
    +#ifndef KOKKOS_SCATTER_VIEW_HPP
    +#define KOKKOS_SCATTER_VIEW_HPP
    +
    +#include 
    +#include 
    +
    +namespace Kokkos {
    +namespace Experimental {
    +
    +//TODO: replace this enum with the Kokkos::Sum, etc reducers for parallel_reduce
    +enum : int {
    +  ScatterSum,
    +};
    +
    +enum : int {
    +  ScatterNonDuplicated = 0,
    +  ScatterDuplicated    = 1
    +};
    +
    +enum : int {
    +  ScatterNonAtomic = 0,
    +  ScatterAtomic    = 1
    +};
    +
    +}} // Kokkos::Experimental
    +
    +namespace Kokkos {
    +namespace Impl {
    +namespace Experimental {
    +
    +template 
    +struct DefaultDuplication;
    +
    +template 
    +struct DefaultContribution;
    +
    +#ifdef KOKKOS_ENABLE_SERIAL
    +template <>
    +struct DefaultDuplication {
    +  enum : int { value = Kokkos::Experimental::ScatterNonDuplicated };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterNonAtomic };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterNonAtomic };
    +};
    +#endif
    +
    +#ifdef KOKKOS_ENABLE_OPENMP
    +template <>
    +struct DefaultDuplication {
    +  enum : int { value = Kokkos::Experimental::ScatterDuplicated };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterAtomic };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterNonAtomic };
    +};
    +#endif
    +
    +#ifdef KOKKOS_ENABLE_THREADS
    +template <>
    +struct DefaultDuplication {
    +  enum : int { value = Kokkos::Experimental::ScatterDuplicated };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterAtomic };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterNonAtomic };
    +};
    +#endif
    +
    +#ifdef KOKKOS_ENABLE_CUDA
    +template <>
    +struct DefaultDuplication {
    +  enum : int { value = Kokkos::Experimental::ScatterNonDuplicated };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterAtomic };
    +};
    +template <>
    +struct DefaultContribution {
    +  enum : int { value = Kokkos::Experimental::ScatterAtomic };
    +};
    +#endif
    +
    +/* ScatterValue is the object returned by the access operator() of ScatterAccess,
    +   similar to that returned by an Atomic View, it wraps Kokkos::atomic_add with convenient
    +   operator+=, etc. */
    +template 
    +struct ScatterValue;
    +
    +template 
    +struct ScatterValue {
    +  public:
    +    KOKKOS_FORCEINLINE_FUNCTION ScatterValue(ValueType& value_in) : value( value_in ) {}
    +    KOKKOS_FORCEINLINE_FUNCTION ScatterValue(ScatterValue&& other) : value( other.value ) {}
    +    KOKKOS_FORCEINLINE_FUNCTION void operator+=(ValueType const& rhs) {
    +      value += rhs;
    +    }
    +    KOKKOS_FORCEINLINE_FUNCTION void operator-=(ValueType const& rhs) {
    +      value -= rhs;
    +    }
    +  private:
    +    ValueType& value;
    +};
    +
    +template 
    +struct ScatterValue {
    +  public:
    +    KOKKOS_FORCEINLINE_FUNCTION ScatterValue(ValueType& value_in) : value( value_in ) {}
    +    KOKKOS_FORCEINLINE_FUNCTION void operator+=(ValueType const& rhs) {
    +      Kokkos::atomic_add(&value, rhs);
    +    }
    +    KOKKOS_FORCEINLINE_FUNCTION void operator-=(ValueType const& rhs) {
    +      Kokkos::atomic_add(&value, -rhs);
    +    }
    +  private:
    +    ValueType& value;
    +};
    +
    +/* DuplicatedDataType, given a View DataType, will create a new DataType
    +   that has a new runtime dimension which becomes the largest-stride dimension.
    +   In the case of LayoutLeft, due to the limitation induced by the design of DataType
    +   itself, it must convert any existing compile-time dimensions into runtime dimensions. */
    +template 
    +struct DuplicatedDataType;
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef T* value_type; // For LayoutRight, add a star all the way on the left
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef typename DuplicatedDataType::value_type value_type[N];
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef typename DuplicatedDataType::value_type value_type[];
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef typename DuplicatedDataType::value_type* value_type;
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef T* value_type;
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef typename DuplicatedDataType::value_type* value_type;
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef typename DuplicatedDataType::value_type* value_type;
    +};
    +
    +template 
    +struct DuplicatedDataType {
    +  typedef typename DuplicatedDataType::value_type* value_type;
    +};
    +
    +/* Slice is just responsible for stuffing the correct number of Kokkos::ALL
    +   arguments on the correct side of the index in a call to subview() to get a
    +   subview where the index specified is the largest-stride one. */
    +template 
    +struct Slice {
    +  typedef Slice next;
    +  typedef typename next::value_type value_type;
    +
    +  static
    +  value_type get(V const& src, const size_t i, Args ... args) {
    +    return next::get(src, i, Kokkos::ALL, args...);
    +  }
    +};
    +
    +template 
    +struct Slice {
    +  typedef typename Kokkos::Impl::ViewMapping
    +                          < void
    +                          , V
    +                          , const size_t
    +                          , Args ...
    +                          >::type value_type;
    +  static
    +  value_type get(V const& src, const size_t i, Args ... args) {
    +    return Kokkos::subview(src, i, args...);
    +  }
    +};
    +
    +template 
    +struct Slice {
    +  typedef typename Kokkos::Impl::ViewMapping
    +                          < void
    +                          , V
    +                          , Args ...
    +                          , const size_t
    +                          >::type value_type;
    +  static
    +  value_type get(V const& src, const size_t i, Args ... args) {
    +    return Kokkos::subview(src, args..., i);
    +  }
    +};
    +
    +template 
    +struct ReduceDuplicates;
    +
    +template 
    +struct ReduceDuplicatesBase {
    +  typedef ReduceDuplicates Derived;
    +  ValueType const* src;
    +  ValueType* dst;
    +  size_t stride;
    +  size_t start;
    +  size_t n;
    +  ReduceDuplicatesBase(ValueType const* src_in, ValueType* dest_in, size_t stride_in, size_t start_in, size_t n_in, std::string const& name)
    +    : src(src_in)
    +    , dst(dest_in)
    +    , stride(stride_in)
    +    , start(start_in)
    +    , n(n_in)
    +  {
    +#if defined(KOKKOS_ENABLE_PROFILING)
    +    uint64_t kpID = 0;
    +    if(Kokkos::Profiling::profileLibraryLoaded()) {
    +      Kokkos::Profiling::beginParallelFor(std::string("reduce_") + name, 0, &kpID);
    +    }
    +#endif
    +    typedef RangePolicy policy_type;
    +    typedef Kokkos::Impl::ParallelFor closure_type;
    +    const closure_type closure(*(static_cast(this)), policy_type(0, stride));
    +    closure.execute();
    +#if defined(KOKKOS_ENABLE_PROFILING)
    +    if(Kokkos::Profiling::profileLibraryLoaded()) {
    +      Kokkos::Profiling::endParallelFor(kpID);
    +    }
    +#endif
    +  }
    +};
    +
    +template 
    +struct ReduceDuplicates :
    +  public ReduceDuplicatesBase
    +{
    +  typedef ReduceDuplicatesBase Base;
    +  ReduceDuplicates(ValueType const* src_in, ValueType* dst_in, size_t stride_in, size_t start_in, size_t n_in, std::string const& name):
    +    Base(src_in, dst_in, stride_in, start_in, n_in, name)
    +  {}
    +  KOKKOS_FORCEINLINE_FUNCTION void operator()(size_t i) const {
    +    for (size_t j = Base::start; j < Base::n; ++j) {
    +      Base::dst[i] += Base::src[i + Base::stride * j];
    +    }
    +  }
    +};
    +
    +template 
    +struct ResetDuplicates;
    +
    +template 
    +struct ResetDuplicatesBase {
    +  typedef ResetDuplicates Derived;
    +  ValueType* data;
    +  ResetDuplicatesBase(ValueType* data_in, size_t size_in, std::string const& name)
    +    : data(data_in)
    +  {
    +#if defined(KOKKOS_ENABLE_PROFILING)
    +    uint64_t kpID = 0;
    +    if(Kokkos::Profiling::profileLibraryLoaded()) {
    +      Kokkos::Profiling::beginParallelFor(std::string("reduce_") + name, 0, &kpID);
    +    }
    +#endif
    +    typedef RangePolicy policy_type;
    +    typedef Kokkos::Impl::ParallelFor closure_type;
    +    const closure_type closure(*(static_cast(this)), policy_type(0, size_in));
    +    closure.execute();
    +#if defined(KOKKOS_ENABLE_PROFILING)
    +    if(Kokkos::Profiling::profileLibraryLoaded()) {
    +      Kokkos::Profiling::endParallelFor(kpID);
    +    }
    +#endif
    +  }
    +};
    +
    +template 
    +struct ResetDuplicates :
    +  public ResetDuplicatesBase
    +{
    +  typedef ResetDuplicatesBase Base;
    +  ResetDuplicates(ValueType* data_in, size_t size_in, std::string const& name):
    +    Base(data_in, size_in, name)
    +  {}
    +  KOKKOS_FORCEINLINE_FUNCTION void operator()(size_t i) const {
    +    Base::data[i] = Kokkos::reduction_identity::sum();
    +  }
    +};
    +
    +}}} // Kokkos::Impl::Experimental
    +
    +namespace Kokkos {
    +namespace Experimental {
    +
    +template ::value
    +         ,int contribution = Kokkos::Impl::Experimental::DefaultContribution::value
    +         >
    +class ScatterView;
    +
    +template 
    +class ScatterAccess;
    +
    +// non-duplicated implementation
    +template 
    +class ScatterView
    +{
    +public:
    +  typedef Kokkos::View original_view_type;
    +  typedef typename original_view_type::value_type original_value_type;
    +  typedef typename original_view_type::reference_type original_reference_type;
    +  friend class ScatterAccess;
    +  friend class ScatterAccess;
    +
    +  ScatterView()
    +  {
    +  }
    +
    +  template 
    +  ScatterView(View const& original_view)
    +  : internal_view(original_view)
    +  {
    +  }
    +
    +  template 
    +  ScatterView(std::string const& name, Dims ... dims)
    +  : internal_view(name, dims ...)
    +  {
    +  }
    +
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  ScatterAccess
    +  access() const {
    +    return ScatterAccess{*this};
    +  }
    +
    +  original_view_type subview() const {
    +    return internal_view;
    +  }
    +
    +  template 
    +  void contribute_into(View const& dest) const
    +  {
    +    typedef View dest_type;
    +    static_assert(std::is_same<
    +        typename dest_type::array_layout,
    +        Layout>::value,
    +        "ScatterView contribute destination has different layout");
    +    static_assert(Kokkos::Impl::VerifyExecutionCanAccessMemorySpace<
    +        typename ExecSpace::memory_space,
    +        typename dest_type::memory_space>::value,
    +        "ScatterView contribute destination memory space not accessible");
    +    if (dest.data() == internal_view.data()) return;
    +    Kokkos::Impl::Experimental::ReduceDuplicates(
    +        internal_view.data(),
    +        dest.data(),
    +        0,
    +        0,
    +        1,
    +        internal_view.label());
    +  }
    +
    +  void reset() {
    +    Kokkos::Impl::Experimental::ResetDuplicates(
    +        internal_view.data(),
    +        internal_view.size(),
    +        internal_view.label());
    +  }
    +  template 
    +  void reset_except(View const& view) {
    +    if (view.data() != internal_view.data()) reset();
    +  }
    +
    +  void resize(const size_t n0 = 0,
    +           const size_t n1 = 0,
    +           const size_t n2 = 0,
    +           const size_t n3 = 0,
    +           const size_t n4 = 0,
    +           const size_t n5 = 0,
    +           const size_t n6 = 0,
    +           const size_t n7 = 0) {
    +    ::Kokkos::resize(internal_view,n0,n1,n2,n3,n4,n5,n6,n7);
    +  }
    +
    +  void realloc(const size_t n0 = 0,
    +           const size_t n1 = 0,
    +           const size_t n2 = 0,
    +           const size_t n3 = 0,
    +           const size_t n4 = 0,
    +           const size_t n5 = 0,
    +           const size_t n6 = 0,
    +           const size_t n7 = 0) {
    +    ::Kokkos::realloc(internal_view,n0,n1,n2,n3,n4,n5,n6,n7);
    +  }
    +
    +protected:
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  original_reference_type at(Args ... args) const {
    +    return internal_view(args...);
    +  }
    +private:
    +  typedef original_view_type internal_view_type;
    +  internal_view_type internal_view;
    +};
    +
    +template 
    +class ScatterAccess
    +{
    +public:
    +  typedef ScatterView view_type;
    +  typedef typename view_type::original_value_type original_value_type;
    +  typedef Kokkos::Impl::Experimental::ScatterValue<
    +      original_value_type, Op, override_contribution> value_type;
    +
    +  KOKKOS_INLINE_FUNCTION
    +  ScatterAccess(view_type const& view_in)
    +    : view(view_in)
    +  {
    +  }
    +
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  value_type operator()(Args ... args) const {
    +    return view.at(args...);
    +  }
    +
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  typename std::enable_if::value, value_type>::type
    +  operator[](Arg arg) const {
    +    return view.at(arg);
    +  }
    +
    +private:
    +  view_type const& view;
    +};
    +
    +// duplicated implementation
    +// LayoutLeft and LayoutRight are different enough that we'll just specialize each
    +
    +template 
    +class ScatterView
    +{
    +public:
    +  typedef Kokkos::View original_view_type;
    +  typedef typename original_view_type::value_type original_value_type;
    +  typedef typename original_view_type::reference_type original_reference_type;
    +  friend class ScatterAccess;
    +  friend class ScatterAccess;
    +  typedef typename Kokkos::Impl::Experimental::DuplicatedDataType data_type_info;
    +  typedef typename data_type_info::value_type internal_data_type;
    +  typedef Kokkos::View internal_view_type;
    +
    +  ScatterView()
    +  {
    +  }
    +
    +  template 
    +  ScatterView(View const& original_view)
    +  : unique_token()
    +  , internal_view(Kokkos::ViewAllocateWithoutInitializing(
    +                    std::string("duplicated_") + original_view.label()),
    +                  unique_token.size(),
    +                  original_view.extent(0),
    +                  original_view.extent(1),
    +                  original_view.extent(2),
    +                  original_view.extent(3),
    +                  original_view.extent(4),
    +                  original_view.extent(5),
    +                  original_view.extent(6))
    +  {
    +    reset();
    +  }
    +
    +  template 
    +  ScatterView(std::string const& name, Dims ... dims)
    +  : internal_view(Kokkos::ViewAllocateWithoutInitializing(name), unique_token.size(), dims ...)
    +  {
    +    reset();
    +  }
    +
    +  template 
    +  inline
    +  ScatterAccess
    +  access() const {
    +    return ScatterAccess{*this};
    +  }
    +
    +  typename Kokkos::Impl::Experimental::Slice<
    +    Kokkos::LayoutRight, internal_view_type::rank, internal_view_type>::value_type
    +  subview() const
    +  {
    +    return Kokkos::Impl::Experimental::Slice<
    +      Kokkos::LayoutRight, internal_view_type::Rank, internal_view_type>::get(internal_view, 0);
    +  }
    +
    +  template 
    +  void contribute_into(View const& dest) const
    +  {
    +    typedef View dest_type;
    +    static_assert(std::is_same<
    +        typename dest_type::array_layout,
    +        Kokkos::LayoutRight>::value,
    +        "ScatterView deep_copy destination has different layout");
    +    static_assert(Kokkos::Impl::VerifyExecutionCanAccessMemorySpace<
    +        typename ExecSpace::memory_space,
    +        typename dest_type::memory_space>::value,
    +        "ScatterView deep_copy destination memory space not accessible");
    +    size_t strides[8];
    +    internal_view.stride(strides);
    +    bool is_equal = (dest.data() == internal_view.data());
    +    size_t start = is_equal ? 1 : 0;
    +    Kokkos::Impl::Experimental::ReduceDuplicates(
    +        internal_view.data(),
    +        dest.data(),
    +        strides[0],
    +        start,
    +        internal_view.extent(0),
    +        internal_view.label());
    +  }
    +
    +  void reset() {
    +    Kokkos::Impl::Experimental::ResetDuplicates(
    +        internal_view.data(),
    +        internal_view.size(),
    +        internal_view.label());
    +  }
    +  template 
    +  void reset_except(View const& view) {
    +    if (view.data() != internal_view.data()) {
    +      reset();
    +      return;
    +    }
    +    Kokkos::Impl::Experimental::ResetDuplicates(
    +        internal_view.data() + view.size(),
    +        internal_view.size() - view.size(),
    +        internal_view.label());
    +  }
    +
    +  void resize(const size_t n0 = 0,
    +           const size_t n1 = 0,
    +           const size_t n2 = 0,
    +           const size_t n3 = 0,
    +           const size_t n4 = 0,
    +           const size_t n5 = 0,
    +           const size_t n6 = 0) {
    +    ::Kokkos::resize(internal_view,unique_token.size(),n0,n1,n2,n3,n4,n5,n6);
    +  }
    +
    +  void realloc(const size_t n0 = 0,
    +           const size_t n1 = 0,
    +           const size_t n2 = 0,
    +           const size_t n3 = 0,
    +           const size_t n4 = 0,
    +           const size_t n5 = 0,
    +           const size_t n6 = 0) {
    +    ::Kokkos::realloc(internal_view,unique_token.size(),n0,n1,n2,n3,n4,n5,n6);
    +  }
    +
    +protected:
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  original_reference_type at(int rank, Args ... args) const {
    +    return internal_view(rank, args...);
    +  }
    +
    +protected:
    +  typedef Kokkos::Experimental::UniqueToken<
    +      ExecSpace, Kokkos::Experimental::UniqueTokenScope::Global> unique_token_type;
    +
    +  unique_token_type unique_token;
    +  internal_view_type internal_view;
    +};
    +
    +template 
    +class ScatterView
    +{
    +public:
    +  typedef Kokkos::View original_view_type;
    +  typedef typename original_view_type::value_type original_value_type;
    +  typedef typename original_view_type::reference_type original_reference_type;
    +  friend class ScatterAccess;
    +  friend class ScatterAccess;
    +  typedef typename Kokkos::Impl::Experimental::DuplicatedDataType data_type_info;
    +  typedef typename data_type_info::value_type internal_data_type;
    +  typedef Kokkos::View internal_view_type;
    +
    +  ScatterView()
    +  {
    +  }
    +
    +  template 
    +  ScatterView(View const& original_view)
    +  : unique_token()
    +  {
    +    size_t arg_N[8] = {
    +      original_view.extent(0),
    +      original_view.extent(1),
    +      original_view.extent(2),
    +      original_view.extent(3),
    +      original_view.extent(4),
    +      original_view.extent(5),
    +      original_view.extent(6),
    +      0
    +    };
    +    arg_N[internal_view_type::rank - 1] = unique_token.size();
    +    internal_view = internal_view_type(
    +        Kokkos::ViewAllocateWithoutInitializing(
    +          std::string("duplicated_") + original_view.label()),
    +        arg_N[0], arg_N[1], arg_N[2], arg_N[3],
    +        arg_N[4], arg_N[5], arg_N[6], arg_N[7]);
    +    reset();
    +  }
    +
    +  template 
    +  ScatterView(std::string const& name, Dims ... dims)
    +  : internal_view(Kokkos::ViewAllocateWithoutInitializing(name), dims ..., unique_token.size())
    +  {
    +    reset();
    +  }
    +
    +  template 
    +  inline
    +  ScatterAccess
    +  access() const {
    +    return ScatterAccess{*this};
    +  }
    +
    +  typename Kokkos::Impl::Experimental::Slice<
    +    Kokkos::LayoutLeft, internal_view_type::rank, internal_view_type>::value_type
    +  subview() const
    +  {
    +    return Kokkos::Impl::Experimental::Slice<
    +      Kokkos::LayoutLeft, internal_view_type::rank, internal_view_type>::get(internal_view, 0);
    +  }
    +
    +  template 
    +  void contribute_into(View const& dest) const
    +  {
    +    typedef View dest_type;
    +    static_assert(std::is_same<
    +        typename dest_type::array_layout,
    +        Kokkos::LayoutLeft>::value,
    +        "ScatterView deep_copy destination has different layout");
    +    static_assert(Kokkos::Impl::VerifyExecutionCanAccessMemorySpace<
    +        typename ExecSpace::memory_space,
    +        typename dest_type::memory_space>::value,
    +        "ScatterView deep_copy destination memory space not accessible");
    +    size_t strides[8];
    +    internal_view.stride(strides);
    +    size_t stride = strides[internal_view_type::rank - 1];
    +    auto extent = internal_view.extent(
    +        internal_view_type::rank - 1);
    +    bool is_equal = (dest.data() == internal_view.data());
    +    size_t start = is_equal ? 1 : 0;
    +    Kokkos::Impl::Experimental::ReduceDuplicates(
    +        internal_view.data(),
    +        dest.data(),
    +        stride,
    +        start,
    +        extent,
    +        internal_view.label());
    +  }
    +
    +  void reset() {
    +    Kokkos::Impl::Experimental::ResetDuplicates(
    +        internal_view.data(),
    +        internal_view.size(),
    +        internal_view.label());
    +  }
    +  template 
    +  void reset_except(View const& view) {
    +    if (view.data() != internal_view.data()) {
    +      reset();
    +      return;
    +    }
    +    Kokkos::Impl::Experimental::ResetDuplicates(
    +        internal_view.data() + view.size(),
    +        internal_view.size() - view.size(),
    +        internal_view.label());
    +  }
    +
    +  void resize(const size_t n0 = 0,
    +           const size_t n1 = 0,
    +           const size_t n2 = 0,
    +           const size_t n3 = 0,
    +           const size_t n4 = 0,
    +           const size_t n5 = 0,
    +           const size_t n6 = 0) {
    +
    +    size_t arg_N[8] = {n0,n1,n2,n3,n4,n5,n6,0};
    +    const int i = internal_view.rank-1;
    +    arg_N[i] = unique_token.size();
    +
    +    ::Kokkos::resize(internal_view,
    +        arg_N[0], arg_N[1], arg_N[2], arg_N[3],
    +        arg_N[4], arg_N[5], arg_N[6], arg_N[7]);
    +  }
    +
    +  void realloc(const size_t n0 = 0,
    +           const size_t n1 = 0,
    +           const size_t n2 = 0,
    +           const size_t n3 = 0,
    +           const size_t n4 = 0,
    +           const size_t n5 = 0,
    +           const size_t n6 = 0) {
    +
    +    size_t arg_N[8] = {n0,n1,n2,n3,n4,n5,n6,0};
    +    const int i = internal_view.rank-1;
    +    arg_N[i] = unique_token.size();
    +
    +    ::Kokkos::realloc(internal_view,
    +        arg_N[0], arg_N[1], arg_N[2], arg_N[3],
    +        arg_N[4], arg_N[5], arg_N[6], arg_N[7]);
    +  }
    +
    +protected:
    +  template 
    +  inline original_reference_type at(int thread_id, Args ... args) const {
    +    return internal_view(args..., thread_id);
    +  }
    +
    +protected:
    +  typedef Kokkos::Experimental::UniqueToken<
    +      ExecSpace, Kokkos::Experimental::UniqueTokenScope::Global> unique_token_type;
    +
    +  unique_token_type unique_token;
    +  internal_view_type internal_view;
    +};
    +
    +
    +/* This object has to be separate in order to store the thread ID, which cannot
    +   be obtained until one is inside a parallel construct, and may be relatively
    +   expensive to obtain at every contribution
    +   (calls a non-inlined function, looks up a thread-local variable).
    +   Due to the expense, it is sensible to query it at most once per parallel iterate
    +   (ideally once per thread, but parallel_for doesn't expose that)
    +   and then store it in a stack variable.
    +   ScatterAccess serves as a non-const object on the stack which can store the thread ID */
    +
    +template 
    +class ScatterAccess
    +{
    +public:
    +  typedef ScatterView view_type;
    +  typedef typename view_type::original_value_type original_value_type;
    +  typedef Kokkos::Impl::Experimental::ScatterValue<
    +      original_value_type, Op, override_contribution> value_type;
    +
    +  inline ScatterAccess(view_type const& view_in)
    +    : view(view_in)
    +    , thread_id(view_in.unique_token.acquire()) {
    +  }
    +
    +  inline ~ScatterAccess() {
    +    if (thread_id != ~thread_id_type(0)) view.unique_token.release(thread_id);
    +  }
    +
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  value_type operator()(Args ... args) const {
    +    return view.at(thread_id, args...);
    +  }
    +
    +  template 
    +  KOKKOS_FORCEINLINE_FUNCTION
    +  typename std::enable_if::value, value_type>::type
    +  operator[](Arg arg) const {
    +    return view.at(thread_id, arg);
    +  }
    +
    +private:
    +
    +  view_type const& view;
    +
    +  // simplify RAII by disallowing copies
    +  ScatterAccess(ScatterAccess const& other) = delete;
    +  ScatterAccess& operator=(ScatterAccess const& other) = delete;
    +  ScatterAccess& operator=(ScatterAccess&& other) = delete;
    +
    +public:
    +  // do need to allow moves though, for the common
    +  // auto b = a.access();
    +  // that assignments turns into a move constructor call 
    +  inline ScatterAccess(ScatterAccess&& other)
    +    : view(other.view)
    +    , thread_id(other.thread_id)
    +  {
    +    other.thread_id = ~thread_id_type(0);
    +  }
    +
    +private:
    +
    +  typedef typename view_type::unique_token_type unique_token_type;
    +  typedef typename unique_token_type::size_type thread_id_type;
    +  thread_id_type thread_id;
    +};
    +
    +template 
    +ScatterView
    +  < RT
    +  , typename ViewTraits::array_layout
    +  , typename ViewTraits::execution_space
    +  , Op
    +  /* just setting defaults if not specified... things got messy because the view type
    +     does not come before the duplication/contribution settings in the
    +     template parameter list */
    +  , duplication == -1 ? Kokkos::Impl::Experimental::DefaultDuplication::execution_space>::value : duplication
    +  , contribution == -1 ?
    +      Kokkos::Impl::Experimental::DefaultContribution<
    +                        typename ViewTraits::execution_space,
    +                        (duplication == -1 ?
    +                           Kokkos::Impl::Experimental::DefaultDuplication<
    +                             typename ViewTraits::execution_space
    +                             >::value
    +                                           : duplication
    +                        )
    +                        >::value
    +                       : contribution
    +  >
    +create_scatter_view(View const& original_view) {
    +  return original_view; // implicit ScatterView constructor call
    +}
    +
    +}} // namespace Kokkos::Experimental
    +
    +namespace Kokkos {
    +namespace Experimental {
    +
    +template 
    +void
    +contribute(View& dest, Kokkos::Experimental::ScatterView const& src)
    +{
    +  src.contribute_into(dest);
    +}
    +
    +}} // namespace Kokkos::Experimental
    +
    +namespace Kokkos {
    +
    +template 
    +void
    +realloc(Kokkos::Experimental::ScatterView& scatter_view, IS ... is)
    +{
    +  scatter_view.realloc(is ...);
    +}
    +
    +template 
    +void
    +resize(Kokkos::Experimental::ScatterView& scatter_view, IS ... is)
    +{
    +  scatter_view.resize(is ...);
    +}
    +
    +} // namespace Kokkos
    +
    +#endif
    diff --git a/lib/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp b/lib/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp
    index 0408472c68..996b6b5610 100644
    --- a/lib/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp
    +++ b/lib/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp
    @@ -125,6 +125,123 @@ namespace Impl {
       };
     }
     
    +/// \class GraphRowViewConst
    +/// \brief View of a row of a sparse graph.
    +/// \tparam GraphType Sparse graph type, such as (but not limited to) StaticCrsGraph.
    +///
    +/// This class provides a generic view of a row of a sparse graph.
    +/// We intended this class to view a row of a StaticCrsGraph, but
    +/// GraphType need not necessarily be CrsMatrix.
    +///
    +/// The row view is suited for computational kernels like sparse
    +/// matrix-vector multiply, as well as for modifying entries in the
    +/// sparse matrix.  The view is always const as it does not allow graph modification.
    +///
    +/// Here is an example loop over the entries in the row:
    +/// \code
    +/// typedef typename GraphRowViewConst::ordinal_type ordinal_type;
    +///
    +/// GraphRowView G_i = ...;
    +/// const ordinal_type numEntries = G_i.length;
    +/// for (ordinal_type k = 0; k < numEntries; ++k) {
    +///   ordinal_type j = G_i.colidx (k);
    +///   // ... do something with A_ij and j ...
    +/// }
    +/// \endcode
    +///
    +/// GraphType must provide the \c data_type
    +/// typedefs. In addition, it must make sense to use GraphRowViewConst to
    +/// view a row of GraphType. In particular, column
    +/// indices of a row must be accessible using the entries
    +/// resp. colidx arrays given to the constructor of this
    +/// class, with a constant stride between successive entries.
    +/// The stride is one for the compressed sparse row storage format (as
    +/// is used by CrsMatrix), but may be greater than one for other
    +/// sparse matrix storage formats (e.g., ELLPACK or jagged diagonal).
    +template
    +struct GraphRowViewConst {
    +  //! The type of the column indices in the row.
    +  typedef const typename GraphType::data_type ordinal_type;
    +
    +private:
    +  //! Array of (local) column indices in the row.
    +  ordinal_type* colidx_;
    +  /// \brief Stride between successive entries in the row.
    +  ///
    +  /// For compressed sparse row (CSR) storage, this is always one.
    +  /// This might be greater than one for storage formats like ELLPACK
    +  /// or Jagged Diagonal.  Nevertheless, the stride can never be
    +  /// greater than the number of rows or columns in the matrix.  Thus,
    +  /// \c ordinal_type is the correct type.
    +  const ordinal_type stride_;
    +
    +public:
    +  /// \brief Constructor
    +  ///
    +  /// \param values [in] Array of the row's values.
    +  /// \param colidx [in] Array of the row's column indices.
    +  /// \param stride [in] (Constant) stride between matrix entries in
    +  ///   each of the above arrays.
    +  /// \param count [in] Number of entries in the row.
    +  KOKKOS_INLINE_FUNCTION
    +  GraphRowViewConst ( ordinal_type* const colidx_in,
    +                      const ordinal_type& stride,
    +                      const ordinal_type& count) :
    +    colidx_ (colidx_in), stride_ (stride), length (count)
    +  {}
    +
    +  /// \brief Constructor with offset into \c colidx array
    +  ///
    +  /// \param colidx [in] Array of the row's column indices.
    +  /// \param stride [in] (Constant) stride between matrix entries in
    +  ///   each of the above arrays.
    +  /// \param count [in] Number of entries in the row.
    +  /// \param idx [in] Start offset into \c colidx array
    +  ///
    +  /// \tparam OffsetType The type of \c idx (see above).  Must be a
    +  ///   built-in integer type.  This may differ from ordinal_type.
    +  ///   For example, the matrix may have dimensions that fit in int,
    +  ///   but a number of entries that does not fit in int.
    +  template
    +  KOKKOS_INLINE_FUNCTION
    +  GraphRowViewConst ( const typename GraphType::entries_type& colidx_in,
    +                      const ordinal_type& stride,
    +                      const ordinal_type& count,
    +                      const OffsetType& idx,
    +                      const typename std::enable_if::value, int>::type& = 0) :
    +    colidx_ (&colidx_in(idx)), stride_ (stride), length (count)
    +  {}
    +
    +  /// \brief Number of entries in the row.
    +  ///
    +  /// This is a public const field rather than a public const method,
    +  /// in order to avoid possible overhead of a method call if the
    +  /// compiler is unable to inline that method call.
    +  ///
    +  /// We assume that rows contain no duplicate entries (i.e., entries
    +  /// with the same column index).  Thus, a row may have up to
    +  /// A.numCols() entries.  This means that the correct type of
    +  /// 'length' is ordinal_type.
    +  const ordinal_type length;
    +
    +  /// \brief (Const) reference to the column index of entry i in this
    +  ///   row of the sparse matrix.
    +  ///
    +  /// "Entry i" is not necessarily the entry with column index i, nor
    +  /// does i necessarily correspond to the (local) row index.
    +  KOKKOS_INLINE_FUNCTION
    +  ordinal_type& colidx (const ordinal_type& i) const {
    +    return colidx_[i*stride_];
    +  }
    +
    +  /// \brief An alias for colidx
    +  KOKKOS_INLINE_FUNCTION
    +  ordinal_type& operator()(const ordinal_type& i) const {
    +    return colidx(i);
    +  }
    +};
    +
    +
     /// \class StaticCrsGraph
     /// \brief Compressed row storage array.
     ///
    @@ -218,6 +335,38 @@ public:
           static_cast (0);
       }
     
    +  /// \brief Return a const view of row i of the graph.
    +  ///
    +  /// If row i does not belong to the graph, return an empty view.
    +  ///
    +  /// The returned object \c view implements the following interface:
    +  /// 
      + ///
    • \c view.length is the number of entries in the row
    • + ///
    • \c view.colidx(k) returns a const reference to the + /// column index of the k-th entry in the row
    • + ///
    + /// k is not a column index; it just counts from 0 to + /// view.length - 1. + /// + /// Users should not rely on the return type of this method. They + /// should instead assign to 'auto'. That allows compile-time + /// polymorphism for different kinds of sparse matrix formats (e.g., + /// ELLPACK or Jagged Diagonal) that we may wish to support in the + /// future. + KOKKOS_INLINE_FUNCTION + GraphRowViewConst rowConst (const data_type i) const { + const size_type start = row_map(i); + // count is guaranteed to fit in ordinal_type, as long as no row + // has duplicate entries. + const data_type count = static_cast (row_map(i+1) - start); + + if (count == 0) { + return GraphRowViewConst (NULL, 1, 0); + } else { + return GraphRowViewConst (entries, 1, count, start); + } + } + /** \brief Create a row partitioning into a given number of blocks * balancing non-zeros + a fixed cost per row. */ diff --git a/lib/kokkos/containers/src/Kokkos_UnorderedMap.hpp b/lib/kokkos/containers/src/Kokkos_UnorderedMap.hpp index 63520daa6b..059587a67c 100644 --- a/lib/kokkos/containers/src/Kokkos_UnorderedMap.hpp +++ b/lib/kokkos/containers/src/Kokkos_UnorderedMap.hpp @@ -517,7 +517,7 @@ public: size_type find_attempts = 0; - enum { bounded_find_attempts = 32u }; + enum : unsigned { bounded_find_attempts = 32u }; const size_type max_attempts = (m_bounded_insert && (bounded_find_attempts < m_available_indexes.max_hint()) ) ? bounded_find_attempts : m_available_indexes.max_hint(); diff --git a/lib/kokkos/containers/src/Kokkos_Vector.hpp b/lib/kokkos/containers/src/Kokkos_Vector.hpp index 91fecd6151..03bbefab10 100644 --- a/lib/kokkos/containers/src/Kokkos_Vector.hpp +++ b/lib/kokkos/containers/src/Kokkos_Vector.hpp @@ -56,11 +56,12 @@ template< class Scalar, class Arg1Type = void> class vector : public DualView { +public: typedef Scalar value_type; typedef Scalar* pointer; typedef const Scalar* const_pointer; - typedef Scalar* reference; - typedef const Scalar* const_reference; + typedef Scalar& reference; + typedef const Scalar& const_reference; typedef Scalar* iterator; typedef const Scalar* const_iterator; @@ -73,11 +74,11 @@ private: public: #ifdef KOKKOS_ENABLE_CUDA_UVM - KOKKOS_INLINE_FUNCTION Scalar& operator() (int i) const {return DV::h_view(i);}; - KOKKOS_INLINE_FUNCTION Scalar& operator[] (int i) const {return DV::h_view(i);}; + KOKKOS_INLINE_FUNCTION reference operator() (int i) const {return DV::h_view(i);}; + KOKKOS_INLINE_FUNCTION reference operator[] (int i) const {return DV::h_view(i);}; #else - inline Scalar& operator() (int i) const {return DV::h_view(i);}; - inline Scalar& operator[] (int i) const {return DV::h_view(i);}; + inline reference operator() (int i) const {return DV::h_view(i);}; + inline reference operator[] (int i) const {return DV::h_view(i);}; #endif /* Member functions which behave like std::vector functions */ @@ -86,7 +87,7 @@ public: _size = 0; _extra_storage = 1.1; DV::modified_host() = 1; - }; + } vector(int n, Scalar val=Scalar()):DualView("Vector",size_t(n*(1.1))) { @@ -146,25 +147,32 @@ public: DV::h_view(_size) = val; _size++; - }; + } void pop_back() { _size--; - }; + } void clear() { _size = 0; } - size_type size() const {return _size;}; + size_type size() const {return _size;} size_type max_size() const {return 2000000000;} - size_type capacity() const {return DV::capacity();}; - bool empty() const {return _size==0;}; + size_type capacity() const {return DV::capacity();} + bool empty() const {return _size==0;} - iterator begin() const {return &DV::h_view(0);}; + iterator begin() const {return &DV::h_view(0);} - iterator end() const {return &DV::h_view(_size);}; + iterator end() const {return &DV::h_view(_size);} + reference front() {return DV::h_view(0);} + + reference back() {return DV::h_view(_size - 1);} + + const_reference front() const {return DV::h_view(0);} + + const_reference back() const {return DV::h_view(_size - 1);} /* std::algorithms wich work originally with iterators, here they are implemented as member functions */ diff --git a/lib/kokkos/containers/unit_tests/CMakeLists.txt b/lib/kokkos/containers/unit_tests/CMakeLists.txt index 0c59c616d6..1162d2a6ba 100644 --- a/lib/kokkos/containers/unit_tests/CMakeLists.txt +++ b/lib/kokkos/containers/unit_tests/CMakeLists.txt @@ -3,7 +3,13 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src ) -SET(LIBRARIES kokkoscore) +IF(NOT KOKKOS_HAS_TRILINOS) + IF(KOKKOS_SEPARATE_LIBS) + set(TEST_LINK_TARGETS kokkoscore) + ELSE() + set(TEST_LINK_TARGETS kokkos) + ENDIF() +ENDIF() IF(Kokkos_ENABLE_Pthread) TRIBITS_ADD_EXECUTABLE_AND_TEST( @@ -12,7 +18,7 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -23,7 +29,7 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -34,7 +40,7 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -45,7 +51,7 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() diff --git a/lib/kokkos/containers/unit_tests/Makefile b/lib/kokkos/containers/unit_tests/Makefile index 52559935d4..2b6861f6d7 100644 --- a/lib/kokkos/containers/unit_tests/Makefile +++ b/lib/kokkos/containers/unit_tests/Makefile @@ -15,7 +15,8 @@ endif CXXFLAGS = -O3 LINK ?= $(CXX) -LDFLAGS ?= -lpthread +LDFLAGS ?= +override LDFLAGS += -lpthread include $(KOKKOS_PATH)/Makefile.kokkos @@ -30,6 +31,12 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) TEST_TARGETS += test-cuda endif +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + OBJ_ROCM = TestROCm.o UnitTestMain.o gtest-all.o + TARGETS += KokkosContainers_UnitTest_ROCm + TEST_TARGETS += test-rocm +endif + ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) OBJ_THREADS = TestThreads.o UnitTestMain.o gtest-all.o TARGETS += KokkosContainers_UnitTest_Threads @@ -51,6 +58,9 @@ endif KokkosContainers_UnitTest_Cuda: $(OBJ_CUDA) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_CUDA) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosContainers_UnitTest_Cuda +KokkosContainers_UnitTest_ROCm: $(OBJ_ROCM) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(EXTRA_PATH) $(OBJ_ROCM) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosContainers_UnitTest_ROCm + KokkosContainers_UnitTest_Threads: $(OBJ_THREADS) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_THREADS) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosContainers_UnitTest_Threads @@ -63,6 +73,9 @@ KokkosContainers_UnitTest_Serial: $(OBJ_SERIAL) $(KOKKOS_LINK_DEPENDS) test-cuda: KokkosContainers_UnitTest_Cuda ./KokkosContainers_UnitTest_Cuda +test-rocm: KokkosContainers_UnitTest_ROCm + ./KokkosContainers_UnitTest_ROCm + test-threads: KokkosContainers_UnitTest_Threads ./KokkosContainers_UnitTest_Threads diff --git a/lib/kokkos/containers/unit_tests/TestCuda.cpp b/lib/kokkos/containers/unit_tests/TestCuda.cpp index 5a78a5de9e..ddd6bdae6d 100644 --- a/lib/kokkos/containers/unit_tests/TestCuda.cpp +++ b/lib/kokkos/containers/unit_tests/TestCuda.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include #include @@ -69,6 +70,8 @@ #include #include +#include + //---------------------------------------------------------------------------- @@ -94,6 +97,10 @@ TEST_F( cuda , dyn_view_api) { TestDynViewAPI< double , Kokkos::Cuda >(); } +TEST_F( cuda, viewctorprop_embedded_dim ) { + TestViewCtorProp_EmbeddedDim< Kokkos::Cuda >::test_vcpt( 2, 3 ); +} + TEST_F( cuda , staticcrsgraph ) { TestStaticCrsGraph::run_test_graph< Kokkos::Cuda >(); @@ -195,10 +202,18 @@ void cuda_test_bitset() cuda_test_dualview_combinations(size); \ } +#define CUDA_SCATTERVIEW_TEST( size ) \ + TEST_F( cuda, scatterview_##size##x) { \ + test_scatter_view(size); \ + } + CUDA_DUALVIEW_COMBINE_TEST( 10 ) CUDA_VECTOR_COMBINE_TEST( 10 ) CUDA_VECTOR_COMBINE_TEST( 3057 ) +CUDA_SCATTERVIEW_TEST( 10 ) + +CUDA_SCATTERVIEW_TEST( 1000000 ) CUDA_INSERT_TEST(close, 100000, 90000, 100, 500) CUDA_INSERT_TEST(far, 100000, 90000, 100, 500) diff --git a/lib/kokkos/containers/unit_tests/TestDynamicView.hpp b/lib/kokkos/containers/unit_tests/TestDynamicView.hpp index a7ae15921f..860c75b1ac 100644 --- a/lib/kokkos/containers/unit_tests/TestDynamicView.hpp +++ b/lib/kokkos/containers/unit_tests/TestDynamicView.hpp @@ -131,11 +131,14 @@ struct TestDynamicView // printf("TestDynamicView::run(%d) construct memory pool\n",arg_total_size); + const size_t total_alloc_size = arg_total_size * sizeof(Scalar) * 1.2 ; + const size_t superblock = std::min( total_alloc_size , size_t(1000000) ); + memory_pool_type pool( memory_space() - , arg_total_size * sizeof(Scalar) * 1.2 + , total_alloc_size , 500 /* min block size in bytes */ , 30000 /* max block size in bytes */ - , 1000000 /* min superblock size in bytes */ + , superblock ); // printf("TestDynamicView::run(%d) construct dynamic view\n",arg_total_size); diff --git a/lib/kokkos/containers/unit_tests/TestOpenMP.cpp b/lib/kokkos/containers/unit_tests/TestOpenMP.cpp index 2448bd077b..6b2223f418 100644 --- a/lib/kokkos/containers/unit_tests/TestOpenMP.cpp +++ b/lib/kokkos/containers/unit_tests/TestOpenMP.cpp @@ -63,9 +63,13 @@ #include #include +#include + #include #include +#include + #include namespace Test { @@ -76,14 +80,7 @@ protected: { std::cout << std::setprecision(5) << std::scientific; - unsigned threads_count = 4 ; - - if ( Kokkos::hwloc::available() ) { - threads_count = Kokkos::hwloc::get_available_numa_count() * - Kokkos::hwloc::get_available_cores_per_numa(); - } - - Kokkos::OpenMP::initialize( threads_count ); + Kokkos::OpenMP::initialize(); } static void TearDownTestCase() @@ -96,6 +93,10 @@ TEST_F( openmp, dyn_view_api) { TestDynViewAPI< double , Kokkos::OpenMP >(); } +TEST_F( openmp, viewctorprop_embedded_dim ) { + TestViewCtorProp_EmbeddedDim< Kokkos::OpenMP >::test_vcpt( 2, 3 ); +} + TEST_F( openmp, bitset ) { test_bitset(); @@ -153,6 +154,11 @@ TEST_F( openmp , staticcrsgraph ) test_dualview_combinations(size); \ } +#define OPENMP_SCATTERVIEW_TEST( size ) \ + TEST_F( openmp, scatterview_##size##x) { \ + test_scatter_view(size); \ + } + OPENMP_INSERT_TEST(close, 100000, 90000, 100, 500, true) OPENMP_INSERT_TEST(far, 100000, 90000, 100, 500, false) OPENMP_FAILED_INSERT_TEST( 10000, 1000 ) @@ -162,6 +168,10 @@ OPENMP_VECTOR_COMBINE_TEST( 10 ) OPENMP_VECTOR_COMBINE_TEST( 3057 ) OPENMP_DUALVIEW_COMBINE_TEST( 10 ) +OPENMP_SCATTERVIEW_TEST( 10 ) + +OPENMP_SCATTERVIEW_TEST( 1000000 ) + #undef OPENMP_INSERT_TEST #undef OPENMP_FAILED_INSERT_TEST #undef OPENMP_ASSIGNEMENT_TEST diff --git a/lib/kokkos/containers/unit_tests/TestROCm.cpp b/lib/kokkos/containers/unit_tests/TestROCm.cpp new file mode 100644 index 0000000000..b910e881e8 --- /dev/null +++ b/lib/kokkos/containers/unit_tests/TestROCm.cpp @@ -0,0 +1,263 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#ifdef KOKKOS_ENABLE_ROCM + +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include + +//---------------------------------------------------------------------------- + + + +namespace Test { + +class rocm : public ::testing::Test { +protected: + static void SetUpTestCase() + { + std::cout << std::setprecision(5) << std::scientific; + Kokkos::HostSpace::execution_space::initialize(); + Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice(0) ); + } + static void TearDownTestCase() + { + Kokkos::Experimental::ROCm::finalize(); + Kokkos::HostSpace::execution_space::finalize(); + } +}; + +#if !defined(KOKKOS_ENABLE_ROCM) +//issue 964 +TEST_F( rocm , dyn_view_api) { + TestDynViewAPI< double , Kokkos::Experimental::ROCm >(); +} +#endif + +TEST_F( rocm, viewctorprop_embedded_dim ) { + TestViewCtorProp_EmbeddedDim< Kokkos::Experimental::ROCm >::test_vcpt( 2, 3 ); +} + +TEST_F( rocm , staticcrsgraph ) +{ + TestStaticCrsGraph::run_test_graph< Kokkos::Experimental::ROCm >(); + TestStaticCrsGraph::run_test_graph2< Kokkos::Experimental::ROCm >(); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(1, 0); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(1, 1000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(1, 10000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(1, 100000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(3, 0); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(3, 1000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(3, 10000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(3, 100000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(75, 0); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(75, 1000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(75, 10000); + TestStaticCrsGraph::run_test_graph3< Kokkos::Experimental::ROCm >(75, 100000); +} + + +#if !defined(KOKKOS_ENABLE_ROCM) +// issue 1089 +// same as 130203 (MemPool, static member function link issue +void rocm_test_insert_close( uint32_t num_nodes + , uint32_t num_inserts + , uint32_t num_duplicates + ) +{ + test_insert< Kokkos::Experimental::ROCm >( num_nodes, num_inserts, num_duplicates, true); +} + +// hcc link error , Referencing function in another module! +void rocm_test_insert_far( uint32_t num_nodes + , uint32_t num_inserts + , uint32_t num_duplicates + ) +{ + test_insert< Kokkos::Experimental::ROCm >( num_nodes, num_inserts, num_duplicates, false); +} + +void rocm_test_failed_insert( uint32_t num_nodes ) +{ + test_failed_insert< Kokkos::Experimental::ROCm >( num_nodes ); +} + +void rocm_test_deep_copy( uint32_t num_nodes ) +{ + test_deep_copy< Kokkos::Experimental::ROCm >( num_nodes ); +} + +void rocm_test_vector_combinations(unsigned int size) +{ + test_vector_combinations(size); +} + +void rocm_test_dualview_combinations(unsigned int size) +{ + test_dualview_combinations(size); +} + +void rocm_test_bitset() +{ + test_bitset(); +} + + + +/*TEST_F( rocm, bitset ) +{ + rocm_test_bitset(); +}*/ + +#define ROCM_INSERT_TEST( name, num_nodes, num_inserts, num_duplicates, repeat ) \ + TEST_F( rocm, UnorderedMap_insert_##name##_##num_nodes##_##num_inserts##_##num_duplicates##_##repeat##x) { \ + for (int i=0; i + typedef TestDynamicView< double , Kokkos::Experimental::ROCmSpace > + TestDynView ; + + for ( int i = 0 ; i < 10 ; ++i ) { + TestDynView::run( 100000 + 100 * i ); + } +} +#endif + + +#if defined(KOKKOS_CLASS_LAMBDA) +TEST_F(rocm, ErrorReporterViaLambda) +{ + TestErrorReporter>(); +} +#endif + +TEST_F(rocm, ErrorReporter) +{ + TestErrorReporter>(); +} + +} + +#else +void KOKKOS_CONTAINERS_UNIT_TESTS_TESTROCM_PREVENT_EMPTY_LINK_ERROR() {} +#endif /* #ifdef KOKKOS_ENABLE_ROCM */ + diff --git a/lib/kokkos/containers/unit_tests/TestScatterView.hpp b/lib/kokkos/containers/unit_tests/TestScatterView.hpp new file mode 100644 index 0000000000..42e6c09307 --- /dev/null +++ b/lib/kokkos/containers/unit_tests/TestScatterView.hpp @@ -0,0 +1,156 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_TEST_SCATTER_VIEW_HPP +#define KOKKOS_TEST_SCATTER_VIEW_HPP + +#include + +namespace Test { + +template +void test_scatter_view_config(int n) +{ + Kokkos::View original_view("original_view", n); + { + auto scatter_view = Kokkos::Experimental::create_scatter_view + < Kokkos::Experimental::ScatterSum + , duplication + , contribution + > (original_view); +#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA ) + auto policy = Kokkos::RangePolicy(0, n); + auto f = KOKKOS_LAMBDA(int i) { + auto scatter_access = scatter_view.access(); + auto scatter_access_atomic = scatter_view.template access(); + for (int j = 0; j < 10; ++j) { + auto k = (i + j) % n; + scatter_access(k, 0) += 4.2; + scatter_access_atomic(k, 1) += 2.0; + scatter_access(k, 2) += 1.0; + } + }; + Kokkos::parallel_for(policy, f, "scatter_view_test"); +#endif + Kokkos::Experimental::contribute(original_view, scatter_view); + scatter_view.reset_except(original_view); +#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA ) + Kokkos::parallel_for(policy, f, "scatter_view_test"); +#endif + Kokkos::Experimental::contribute(original_view, scatter_view); + } +#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA ) + auto host_view = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), original_view); + for (typename decltype(host_view)::size_type i = 0; i < host_view.dimension_0(); ++i) { + auto val0 = host_view(i, 0); + auto val1 = host_view(i, 1); + auto val2 = host_view(i, 2); + EXPECT_TRUE(std::fabs((val0 - 84.0) / 84.0) < 1e-15); + EXPECT_TRUE(std::fabs((val1 - 40.0) / 40.0) < 1e-15); + EXPECT_TRUE(std::fabs((val2 - 20.0) / 20.0) < 1e-15); + } +#endif + { + Kokkos::Experimental::ScatterView + < double*[3] + , Layout + , ExecSpace + , Kokkos::Experimental::ScatterSum + , duplication + , contribution + > + persistent_view("persistent", n); + auto result_view = persistent_view.subview(); + contribute(result_view, persistent_view); + } +} + +template +struct TestDuplicatedScatterView { + TestDuplicatedScatterView(int n) { + test_scatter_view_config(n); + test_scatter_view_config(n); + } +}; + +#ifdef KOKKOS_ENABLE_CUDA +// disable duplicated instantiation with CUDA until +// UniqueToken can support it +template <> +struct TestDuplicatedScatterView { + TestDuplicatedScatterView(int) { + } +}; +#endif + +template +void test_scatter_view(int n) +{ + // all of these configurations should compile okay, but only some of them are + // correct and/or sensible in terms of memory use + Kokkos::Experimental::UniqueToken unique_token{ExecSpace()}; + + // no atomics or duplication is only sensible if the execution space + // is running essentially in serial (doesn't have to be Serial though, + // we also test OpenMP with one thread: LAMMPS cares about that) + if (unique_token.size() == 1) { + test_scatter_view_config(n); + } + test_scatter_view_config(n); + + TestDuplicatedScatterView duptest(n); +} + +} // namespace Test + +#endif //KOKKOS_TEST_UNORDERED_MAP_HPP + + diff --git a/lib/kokkos/containers/unit_tests/TestSerial.cpp b/lib/kokkos/containers/unit_tests/TestSerial.cpp index 06c4d9f6ed..c9b7392d48 100644 --- a/lib/kokkos/containers/unit_tests/TestSerial.cpp +++ b/lib/kokkos/containers/unit_tests/TestSerial.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include @@ -67,6 +68,8 @@ #include #include +#include + namespace Test { class serial : public ::testing::Test { @@ -85,6 +88,10 @@ TEST_F( serial, dyn_view_api) { TestDynViewAPI< double , Kokkos::Serial >(); } +TEST_F( serial, viewctorprop_embedded_dim ) { + TestViewCtorProp_EmbeddedDim< Kokkos::Serial >::test_vcpt( 2, 3 ); +} + TEST_F( serial , staticcrsgraph ) { TestStaticCrsGraph::run_test_graph< Kokkos::Serial >(); @@ -142,6 +149,11 @@ TEST_F( serial, bitset ) test_dualview_combinations(size); \ } +#define SERIAL_SCATTERVIEW_TEST( size ) \ + TEST_F( serial, scatterview_##size##x) { \ + test_scatter_view(size); \ + } + SERIAL_INSERT_TEST(close, 100000, 90000, 100, 500, true) SERIAL_INSERT_TEST(far, 100000, 90000, 100, 500, false) SERIAL_FAILED_INSERT_TEST( 10000, 1000 ) @@ -151,6 +163,10 @@ SERIAL_VECTOR_COMBINE_TEST( 10 ) SERIAL_VECTOR_COMBINE_TEST( 3057 ) SERIAL_DUALVIEW_COMBINE_TEST( 10 ) +SERIAL_SCATTERVIEW_TEST( 10 ) + +SERIAL_SCATTERVIEW_TEST( 1000000 ) + #undef SERIAL_INSERT_TEST #undef SERIAL_FAILED_INSERT_TEST #undef SERIAL_ASSIGNEMENT_TEST diff --git a/lib/kokkos/containers/unit_tests/TestStaticCrsGraph.hpp b/lib/kokkos/containers/unit_tests/TestStaticCrsGraph.hpp index cccb304ec0..aee6ef79b6 100644 --- a/lib/kokkos/containers/unit_tests/TestStaticCrsGraph.hpp +++ b/lib/kokkos/containers/unit_tests/TestStaticCrsGraph.hpp @@ -71,7 +71,7 @@ void run_test_graph() } dx = Kokkos::create_staticcrsgraph( "dx" , graph ); - hx = Kokkos::create_mirror( dx ); + hx = Kokkos::create_mirror( dx ); ASSERT_EQ( hx.row_map.dimension_0() - 1 , LENGTH ); @@ -83,6 +83,16 @@ void run_test_graph() ASSERT_EQ( (int) hx.entries( j + begin ) , graph[i][j] ); } } + + // Test row view access + for ( size_t i = 0 ; i < LENGTH ; ++i ) { + auto rowView = hx.rowConst(i); + ASSERT_EQ( rowView.length, graph[i].size() ); + for ( size_t j = 0 ; j < rowView.length ; ++j ) { + ASSERT_EQ( rowView.colidx( j ) , graph[i][j] ); + ASSERT_EQ( rowView( j ) , graph[i][j] ); + } + } } template< class Space > @@ -182,5 +192,6 @@ void run_test_graph3(size_t B, size_t N) ASSERT_FALSE((ne>2*((hx.row_map(hx.numRows())+C*hx.numRows())/B))&&(hx.row_block_offsets(i+1)>hx.row_block_offsets(i)+1)); } } + } /* namespace TestStaticCrsGraph */ diff --git a/lib/kokkos/containers/unit_tests/TestThreads.cpp b/lib/kokkos/containers/unit_tests/TestThreads.cpp index 938ec88e90..aca0b57d65 100644 --- a/lib/kokkos/containers/unit_tests/TestThreads.cpp +++ b/lib/kokkos/containers/unit_tests/TestThreads.cpp @@ -70,6 +70,8 @@ #include #include +#include + namespace Test { class threads : public ::testing::Test { @@ -103,6 +105,10 @@ TEST_F( threads , dyn_view_api) { TestDynViewAPI< double , Kokkos::Threads >(); } +TEST_F( threads, viewctorprop_embedded_dim ) { + TestViewCtorProp_EmbeddedDim< Kokkos::Threads >::test_vcpt( 2, 3 ); +} + TEST_F( threads , staticcrsgraph ) { TestStaticCrsGraph::run_test_graph< Kokkos::Threads >(); diff --git a/lib/kokkos/containers/unit_tests/TestViewCtorPropEmbeddedDim.hpp b/lib/kokkos/containers/unit_tests/TestViewCtorPropEmbeddedDim.hpp new file mode 100644 index 0000000000..1efd1ddc51 --- /dev/null +++ b/lib/kokkos/containers/unit_tests/TestViewCtorPropEmbeddedDim.hpp @@ -0,0 +1,213 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#include + +#include +#include + +#include +#include + +namespace Test { + +namespace { + +template +struct TestViewCtorProp_EmbeddedDim { + + using ViewIntType = typename Kokkos::View< int**, ExecSpace >; + using ViewDoubleType = typename Kokkos::View< double*, ExecSpace >; + + using DynRankViewIntType = typename Kokkos::DynRankView< int, ExecSpace >; + using DynRankViewDoubleType = typename Kokkos::DynRankView< double, ExecSpace >; + + // Cuda 7.0 has issues with using a lamda in parallel_for to initialize the view - replace with this functor + template < class ViewType > + struct Functor { + + ViewType v; + + Functor( const ViewType & v_ ) : v(v_) {} + + KOKKOS_INLINE_FUNCTION + void operator()( const int i ) const { + v(i) = i; + } + + }; + + + static void test_vcpt( const int N0, const int N1 ) + { + + // Create two views to test + { + using VIT = typename TestViewCtorProp_EmbeddedDim::ViewIntType ; + using VDT = typename TestViewCtorProp_EmbeddedDim::ViewDoubleType ; + + VIT vi1("vi1", N0, N1); + VDT vd1("vd1", N0); + + // TEST: Test for common type between two views, one with type double, other with type int + // Deduce common value_type and construct a view with that type + { + // Two views + auto view_alloc_arg = Kokkos::common_view_alloc_prop(vi1, vd1); + typedef typename decltype( view_alloc_arg )::value_type CommonViewValueType; + typedef typename Kokkos::View< CommonViewValueType*, ExecSpace > CVT; + typedef typename CVT::HostMirror HostCVT; + + // Construct View using the common type; for case of specialization, an 'embedded_dim' would be stored by view_alloc_arg + CVT cv1( Kokkos::view_alloc( "cv1", view_alloc_arg ), N0*N1 ); + + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace >(0, N0*N1), + Functor(cv1) + ); + + HostCVT hcv1 = Kokkos::create_mirror_view( cv1 ); + Kokkos::deep_copy( hcv1, cv1 ); + + ASSERT_EQ( (std::is_same< CommonViewValueType, double >::value) , true ) ; + #if 0 + // debug output + for ( int i = 0; i < N0*N1; ++i ) { + printf(" Output check: hcv1(%d) = %lf\n ", i, hcv1(i) ); + } + + printf( " Common value type view: %s \n", typeid( CVT() ).name() ); + printf( " Common value type: %s \n", typeid( CommonViewValueType() ).name() ); + if ( std::is_same< CommonViewValueType, double >::value == true ) { + printf("Proper common value_type\n"); + } + else { + printf("WRONG common value_type\n"); + } + // end debug output + #endif + } + + { + // Single view + auto view_alloc_arg = Kokkos::common_view_alloc_prop(vi1); + typedef typename decltype( view_alloc_arg )::value_type CommonViewValueType; + typedef typename Kokkos::View< CommonViewValueType*, ExecSpace > CVT; + typedef typename CVT::HostMirror HostCVT; + + // Construct View using the common type; for case of specialization, an 'embedded_dim' would be stored by view_alloc_arg + CVT cv1( Kokkos::view_alloc( "cv1", view_alloc_arg ), N0*N1 ); + + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace >(0, N0*N1), + Functor(cv1) + ); + + HostCVT hcv1 = Kokkos::create_mirror_view( cv1 ); + Kokkos::deep_copy( hcv1, cv1 ); + + ASSERT_EQ( (std::is_same< CommonViewValueType, int>::value) , true ) ; + } + + } + + // Create two dynamic rank views to test + { + using VIT = typename TestViewCtorProp_EmbeddedDim::DynRankViewIntType ; + using VDT = typename TestViewCtorProp_EmbeddedDim::DynRankViewDoubleType ; + + VIT vi1("vi1", N0, N1); + VDT vd1("vd1", N0); + + // TEST: Test for common type between two views, one with type double, other with type int + // Deduce common value_type and construct a view with that type + { + // Two views + auto view_alloc_arg = Kokkos::common_view_alloc_prop( vi1, vd1 ); + typedef typename decltype( view_alloc_arg )::value_type CommonViewValueType; + typedef typename Kokkos::View< CommonViewValueType*, ExecSpace > CVT; + typedef typename CVT::HostMirror HostCVT; + + // Construct View using the common type; for case of specialization, an 'embedded_dim' would be stored by view_alloc_arg + CVT cv1( Kokkos::view_alloc( "cv1", view_alloc_arg ), N0*N1 ); + + + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace >(0, N0*N1), + Functor(cv1) + ); + + HostCVT hcv1 = Kokkos::create_mirror_view( cv1 ); + Kokkos::deep_copy( hcv1, cv1 ); + + ASSERT_EQ( (std::is_same< CommonViewValueType, double >::value) , true ) ; + } + + { + // Single views + auto view_alloc_arg = Kokkos::common_view_alloc_prop( vi1 ); + typedef typename decltype( view_alloc_arg )::value_type CommonViewValueType; + typedef typename Kokkos::View< CommonViewValueType*, ExecSpace > CVT; + typedef typename CVT::HostMirror HostCVT; + + // Construct View using the common type; for case of specialization, an 'embedded_dim' would be stored by view_alloc_arg + CVT cv1( Kokkos::view_alloc( "cv1", view_alloc_arg ), N0*N1 ); + + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace >(0, N0*N1), + Functor(cv1) + ); + + HostCVT hcv1 = Kokkos::create_mirror_view( cv1 ); + Kokkos::deep_copy( hcv1, cv1 ); + + ASSERT_EQ( (std::is_same< CommonViewValueType, int>::value) , true ) ; + } + } + + + } // end test_vcpt + +}; // end struct + +} // namespace + +} // namespace Test diff --git a/lib/kokkos/containers/unit_tests/UnitTestMain.cpp b/lib/kokkos/containers/unit_tests/UnitTestMain.cpp index f952ab3db5..2b73535c83 100644 --- a/lib/kokkos/containers/unit_tests/UnitTestMain.cpp +++ b/lib/kokkos/containers/unit_tests/UnitTestMain.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,12 +36,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ #include +#include +#include int main(int argc, char *argv[]) { ::testing::InitGoogleTest(&argc,argv); diff --git a/lib/kokkos/core/CMakeLists.txt b/lib/kokkos/core/CMakeLists.txt index 42fce6b2f2..93db0d2ecf 100644 --- a/lib/kokkos/core/CMakeLists.txt +++ b/lib/kokkos/core/CMakeLists.txt @@ -2,7 +2,9 @@ TRIBITS_SUBPACKAGE(Core) -ADD_SUBDIRECTORY(src) +IF(KOKKOS_HAS_TRILINOS) + ADD_SUBDIRECTORY(src) +ENDIF() TRIBITS_ADD_TEST_DIRECTORIES(unit_test) TRIBITS_ADD_TEST_DIRECTORIES(perf_test) diff --git a/lib/kokkos/core/cmake/KokkosCore_config.h.in b/lib/kokkos/core/cmake/KokkosCore_config.h.in index 621cd54e1c..599c6b0224 100644 --- a/lib/kokkos/core/cmake/KokkosCore_config.h.in +++ b/lib/kokkos/core/cmake/KokkosCore_config.h.in @@ -1,15 +1,15 @@ -#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) -#error "Don't include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." -#else -#define KOKKOS_CORE_CONFIG_H -#endif - /* The trivial 'src/build_common.sh' creates a config * that must stay in sync with this file. */ #cmakedefine KOKKOS_FOR_SIERRA -#ifndef KOKKOS_FOR_SIERRA +#if !defined(KOKKOS_FOR_SIERRA) + +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Don't include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif #cmakedefine KOKKOS_HAVE_CUDA #cmakedefine KOKKOS_HAVE_OPENMP @@ -93,12 +93,6 @@ #cmakedefine KOKKOS_ARCH_PASCAL60 1 #cmakedefine KOKKOS_ARCH_PASCAL61 1 -// Don't forbid users from defining this macro on the command line, -// but still make sure that CMake logic can control its definition. -#ifndef KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA -#cmakedefine KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA 1 -#endif - // TODO: These are currently not used in Kokkos. Should they be removed? #cmakedefine KOKKOS_HAVE_MPI #cmakedefine KOKKOS_HAVE_CUSPARSE @@ -107,4 +101,4 @@ #cmakedefine KOKKOS_USING_DEPRECATED_VIEW #cmakedefine KOKKOS_HAVE_CXX11 -#endif // KOKKOS_FOR_SIERRA +#endif // !defined(KOKKOS_FOR_SIERRA) diff --git a/lib/kokkos/core/perf_test/CMakeLists.txt b/lib/kokkos/core/perf_test/CMakeLists.txt index 9f19a2a73e..84c49a7713 100644 --- a/lib/kokkos/core/perf_test/CMakeLists.txt +++ b/lib/kokkos/core/perf_test/CMakeLists.txt @@ -2,6 +2,14 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}) +IF(NOT KOKKOS_HAS_TRILINOS) + IF(KOKKOS_SEPARATE_LIBS) + set(TEST_LINK_TARGETS kokkoscore) + ELSE() + set(TEST_LINK_TARGETS kokkos) + ENDIF() +ENDIF() + # warning: PerfTest_CustomReduction.cpp uses # ../../algorithms/src/Kokkos_Random.hpp # we'll just allow it to be included, but note @@ -23,7 +31,7 @@ TRIBITS_ADD_EXECUTABLE( PerfTestExec SOURCES ${SOURCES} COMM serial mpi - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) TRIBITS_ADD_TEST( diff --git a/lib/kokkos/core/perf_test/Makefile b/lib/kokkos/core/perf_test/Makefile index f59e7bbe1c..cdb8e03c1e 100644 --- a/lib/kokkos/core/perf_test/Makefile +++ b/lib/kokkos/core/perf_test/Makefile @@ -17,7 +17,8 @@ endif CXXFLAGS = -O3 #CXXFLAGS += -DGENERIC_REDUCER LINK ?= $(CXX) -LDFLAGS ?= -lpthread +LDFLAGS ?= +override LDFLAGS += -lpthread include $(KOKKOS_PATH)/Makefile.kokkos @@ -43,6 +44,7 @@ TEST_TARGETS += test-atomic # +ifneq ($(KOKKOS_INTERNAL_USE_ROCM), 1) OBJ_MEMPOOL = test_mempool.o TARGETS += KokkosCore_PerformanceTest_Mempool TEST_TARGETS += test-mempool @@ -52,6 +54,7 @@ TEST_TARGETS += test-mempool OBJ_TASKDAG = test_taskdag.o TARGETS += KokkosCore_PerformanceTest_TaskDAG TEST_TARGETS += test-taskdag +endif # @@ -79,7 +82,6 @@ test-mempool: KokkosCore_PerformanceTest_Mempool test-taskdag: KokkosCore_PerformanceTest_TaskDAG ./KokkosCore_PerformanceTest_TaskDAG - build_all: $(TARGETS) test: $(TEST_TARGETS) diff --git a/lib/kokkos/core/perf_test/PerfTestMain.cpp b/lib/kokkos/core/perf_test/PerfTestMain.cpp index d80cfab8b5..832f650b9a 100644 --- a/lib/kokkos/core/perf_test/PerfTestMain.cpp +++ b/lib/kokkos/core/perf_test/PerfTestMain.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,12 +36,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ #include +#include + #include namespace Test { diff --git a/lib/kokkos/core/src/CMakeLists.txt b/lib/kokkos/core/src/CMakeLists.txt index 492470d05d..1914b6ba96 100644 --- a/lib/kokkos/core/src/CMakeLists.txt +++ b/lib/kokkos/core/src/CMakeLists.txt @@ -1,39 +1,4 @@ -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Serial - KOKKOS_HAVE_SERIAL - "Whether to enable the Kokkos::Serial device. This device executes \"parallel\" kernels sequentially on a single CPU thread. It is enabled by default. If you disable this device, please enable at least one other CPU device, such as Kokkos::OpenMP or Kokkos::Threads." - ON - ) - -ASSERT_DEFINED(${PROJECT_NAME}_ENABLE_CXX11) -ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_CUDA) - -# Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA governs whether Kokkos allows -# use of lambdas at the outer level of parallel dispatch (that is, as -# the argument to an outer parallel_for, parallel_reduce, or -# parallel_scan). This works with non-CUDA execution spaces if C++11 -# is enabled. It does not currently work with public releases of -# CUDA. If that changes, please change the default here to ON if CUDA -# and C++11 are ON. -IF (${PROJECT_NAME}_ENABLE_CXX11) - IF (${PACKAGE_NAME}_ENABLE_CUDA) - SET(Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA_DEFAULT OFF) - ELSE () - SET(Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA_DEFAULT ON) - ENDIF () -ELSE () - SET(Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA_DEFAULT OFF) -ENDIF () - -TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA - KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA - "Whether Kokkos allows use of lambdas at the outer level of parallel dispatch (that is, as the argument to an outer parallel_for, parallel_reduce, or parallel_scan). This requires C++11. It also does not currently work with public releases of CUDA. As a result, even if C++11 is enabled, this will be OFF by default if CUDA is enabled. If this option is ON, the macro KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA will be defined. For compatibility with Kokkos' Makefile build system, it is also possible to define that macro on the command line." - ${Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA_DEFAULT} - ) - -TRIBITS_CONFIGURE_FILE(${PACKAGE_NAME}_config.h) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) @@ -44,68 +9,90 @@ SET(TRILINOS_INCDIR ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DI #----------------------------------------------------------------------------- -SET(HEADERS_PUBLIC "") -SET(HEADERS_PRIVATE "") -SET(SOURCES "") +IF(KOKKOS_LEGACY_TRIBITS) -FILE(GLOB HEADERS_PUBLIC Kokkos*.hpp) -LIST( APPEND HEADERS_PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}_config.h ) + ASSERT_DEFINED(${PROJECT_NAME}_ENABLE_CXX11) + ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_CUDA) + + SET(HEADERS_PUBLIC "") + SET(HEADERS_PRIVATE "") + SET(SOURCES "") + + FILE(GLOB HEADERS_PUBLIC Kokkos*.hpp) + LIST( APPEND HEADERS_PUBLIC ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_config.h ) + + #----------------------------------------------------------------------------- + + FILE(GLOB HEADERS_IMPL impl/*.hpp) + FILE(GLOB SOURCES_IMPL impl/*.cpp) + + LIST(APPEND HEADERS_PRIVATE ${HEADERS_IMPL} ) + LIST(APPEND SOURCES ${SOURCES_IMPL} ) + + INSTALL(FILES ${HEADERS_IMPL} DESTINATION ${TRILINOS_INCDIR}/impl/) + + #----------------------------------------------------------------------------- + + FILE(GLOB HEADERS_THREADS Threads/*.hpp) + FILE(GLOB SOURCES_THREADS Threads/*.cpp) + + LIST(APPEND HEADERS_PRIVATE ${HEADERS_THREADS} ) + LIST(APPEND SOURCES ${SOURCES_THREADS} ) + + INSTALL(FILES ${HEADERS_THREADS} DESTINATION ${TRILINOS_INCDIR}/Threads/) + + #----------------------------------------------------------------------------- + + FILE(GLOB HEADERS_OPENMP OpenMP/*.hpp) + FILE(GLOB SOURCES_OPENMP OpenMP/*.cpp) + + LIST(APPEND HEADERS_PRIVATE ${HEADERS_OPENMP} ) + LIST(APPEND SOURCES ${SOURCES_OPENMP} ) + + INSTALL(FILES ${HEADERS_OPENMP} DESTINATION ${TRILINOS_INCDIR}/OpenMP/) + + #----------------------------------------------------------------------------- + + FILE(GLOB HEADERS_CUDA Cuda/*.hpp) + FILE(GLOB SOURCES_CUDA Cuda/*.cpp) + + LIST(APPEND HEADERS_PRIVATE ${HEADERS_CUDA} ) + LIST(APPEND SOURCES ${SOURCES_CUDA} ) + + INSTALL(FILES ${HEADERS_CUDA} DESTINATION ${TRILINOS_INCDIR}/Cuda/) + + #----------------------------------------------------------------------------- + FILE(GLOB HEADERS_QTHREADS Qthreads/*.hpp) + FILE(GLOB SOURCES_QTHREADS Qthreads/*.cpp) + + LIST(APPEND HEADERS_PRIVATE ${HEADERS_QTHREADS} ) + LIST(APPEND SOURCES ${SOURCES_QTHREADS} ) + + INSTALL(FILES ${HEADERS_QTHREADS} DESTINATION ${TRILINOS_INCDIR}/Qthreads/) + + TRIBITS_ADD_LIBRARY( + kokkoscore + HEADERS ${HEADERS_PUBLIC} + NOINSTALLHEADERS ${HEADERS_PRIVATE} + SOURCES ${SOURCES} + DEPLIBS + ) #----------------------------------------------------------------------------- +# In the new build system, sources are calculated by Makefile.kokkos +else() -FILE(GLOB HEADERS_IMPL impl/*.hpp) -FILE(GLOB SOURCES_IMPL impl/*.cpp) + INSTALL (DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}/" + DESTINATION ${TRILINOS_INCDIR} + FILES_MATCHING PATTERN "*.hpp" + ) -LIST(APPEND HEADERS_PRIVATE ${HEADERS_IMPL} ) -LIST(APPEND SOURCES ${SOURCES_IMPL} ) - -INSTALL(FILES ${HEADERS_IMPL} DESTINATION ${TRILINOS_INCDIR}/impl/) + TRIBITS_ADD_LIBRARY( + kokkoscore + SOURCES ${KOKKOS_CORE_SRCS} + DEPLIBS + ) +endif() #----------------------------------------------------------------------------- - -FILE(GLOB HEADERS_THREADS Threads/*.hpp) -FILE(GLOB SOURCES_THREADS Threads/*.cpp) - -LIST(APPEND HEADERS_PRIVATE ${HEADERS_THREADS} ) -LIST(APPEND SOURCES ${SOURCES_THREADS} ) - -INSTALL(FILES ${HEADERS_THREADS} DESTINATION ${TRILINOS_INCDIR}/Threads/) - -#----------------------------------------------------------------------------- - -FILE(GLOB HEADERS_OPENMP OpenMP/*.hpp) -FILE(GLOB SOURCES_OPENMP OpenMP/*.cpp) - -LIST(APPEND HEADERS_PRIVATE ${HEADERS_OPENMP} ) -LIST(APPEND SOURCES ${SOURCES_OPENMP} ) - -INSTALL(FILES ${HEADERS_OPENMP} DESTINATION ${TRILINOS_INCDIR}/OpenMP/) - -#----------------------------------------------------------------------------- - -FILE(GLOB HEADERS_CUDA Cuda/*.hpp) -FILE(GLOB SOURCES_CUDA Cuda/*.cpp) - -LIST(APPEND HEADERS_PRIVATE ${HEADERS_CUDA} ) -LIST(APPEND SOURCES ${SOURCES_CUDA} ) - -INSTALL(FILES ${HEADERS_CUDA} DESTINATION ${TRILINOS_INCDIR}/Cuda/) - -#----------------------------------------------------------------------------- -FILE(GLOB HEADERS_QTHREADS Qthreads/*.hpp) -FILE(GLOB SOURCES_QTHREADS Qthreads/*.cpp) - -LIST(APPEND HEADERS_PRIVATE ${HEADERS_QTHREADS} ) -LIST(APPEND SOURCES ${SOURCES_QTHREADS} ) - -INSTALL(FILES ${HEADERS_QTHREADS} DESTINATION ${TRILINOS_INCDIR}/Qthreads/) - -#----------------------------------------------------------------------------- - -TRIBITS_ADD_LIBRARY( - kokkoscore - HEADERS ${HEADERS_PUBLIC} - NOINSTALLHEADERS ${HEADERS_PRIVATE} - SOURCES ${SOURCES} - DEPLIBS - ) diff --git a/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile.hpp b/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile.hpp index 341404b9c3..1a5626b04e 100644 --- a/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile.hpp +++ b/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile.hpp @@ -63,7 +63,7 @@ #include #endif -namespace Kokkos { namespace Experimental { namespace Impl { +namespace Kokkos { namespace Impl { // ------------------------------------------------------------------ // @@ -110,21 +110,12 @@ struct apply_impl<2,RP,Functor,void > { // LL if (RP::inner_direction == RP::Left) { - /* - index_type offset_1 = blockIdx.y*m_rp.m_tile[1] + threadIdx.y; - index_type offset_0 = blockIdx.x*m_rp.m_tile[0] + threadIdx.x; - - for ( index_type j = offset_1; j < m_rp.m_upper[1], threadIdx.y < m_rp.m_tile[1]; j += (gridDim.y*m_rp.m_tile[1]) ) { - for ( index_type i = offset_0; i < m_rp.m_upper[0], threadIdx.x < m_rp.m_tile[0]; i += (gridDim.x*m_rp.m_tile[0]) ) { - m_func(i, j); - } } -*/ for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { m_func(offset_0 , offset_1); } @@ -134,21 +125,12 @@ struct apply_impl<2,RP,Functor,void > } // LR else { -/* - index_type offset_1 = blockIdx.y*m_rp.m_tile[1] + threadIdx.y; - index_type offset_0 = blockIdx.x*m_rp.m_tile[0] + threadIdx.x; - - for ( index_type i = offset_0; i < m_rp.m_upper[0], threadIdx.x < m_rp.m_tile[0]; i += (gridDim.x*m_rp.m_tile[0]) ) { - for ( index_type j = offset_1; j < m_rp.m_upper[1], threadIdx.y < m_rp.m_tile[1]; j += (gridDim.y*m_rp.m_tile[1]) ) { - m_func(i, j); - } } -*/ for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { m_func(offset_0 , offset_1); } @@ -182,21 +164,12 @@ struct apply_impl<2,RP,Functor,Tag> { if (RP::inner_direction == RP::Left) { // Loop over size maxnumblocks until full range covered -/* - index_type offset_1 = blockIdx.y*m_rp.m_tile[1] + threadIdx.y; - index_type offset_0 = blockIdx.x*m_rp.m_tile[0] + threadIdx.x; - - for ( index_type j = offset_1; j < m_rp.m_upper[1], threadIdx.y < m_rp.m_tile[1]; j += (gridDim.y*m_rp.m_tile[1]) ) { - for ( index_type i = offset_0; i < m_rp.m_upper[0], threadIdx.x < m_rp.m_tile[0]; i += (gridDim.x*m_rp.m_tile[0]) ) { - m_func(Tag(), i, j); - } } -*/ for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { m_func(Tag(), offset_0 , offset_1); } @@ -205,21 +178,12 @@ struct apply_impl<2,RP,Functor,Tag> } } else { -/* - index_type offset_1 = blockIdx.y*m_rp.m_tile[1] + threadIdx.y; - index_type offset_0 = blockIdx.x*m_rp.m_tile[0] + threadIdx.x; - - for ( index_type i = offset_0; i < m_rp.m_upper[0], threadIdx.x < m_rp.m_tile[0]; i += (gridDim.x*m_rp.m_tile[0]) ) { - for ( index_type j = offset_1; j < m_rp.m_upper[1], threadIdx.y < m_rp.m_tile[1]; j += (gridDim.y*m_rp.m_tile[1]) ) { - m_func(Tag(), i, j); - } } -*/ for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { m_func(Tag(), offset_0 , offset_1); } @@ -255,15 +219,15 @@ struct apply_impl<3,RP,Functor,void > // LL if (RP::inner_direction == RP::Left) { for ( index_type tile_id2 = blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.z; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.z < m_rp.m_tile[2] ) { for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { m_func(offset_0 , offset_1 , offset_2); } @@ -276,15 +240,15 @@ struct apply_impl<3,RP,Functor,void > // LR else { for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { for ( index_type tile_id2 = blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.z; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.z < m_rp.m_tile[2] ) { m_func(offset_0 , offset_1 , offset_2); } @@ -319,15 +283,15 @@ struct apply_impl<3,RP,Functor,Tag> { if (RP::inner_direction == RP::Left) { for ( index_type tile_id2 = blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.z; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.z < m_rp.m_tile[2] ) { for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { m_func(Tag(), offset_0 , offset_1 , offset_2); } @@ -339,15 +303,15 @@ struct apply_impl<3,RP,Functor,Tag> } else { for ( index_type tile_id0 = blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { - const index_type offset_0 = tile_id0*m_rp.m_tile[0] + threadIdx.x; + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && threadIdx.x < m_rp.m_tile[0] ) { for ( index_type tile_id1 = blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + threadIdx.y; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && threadIdx.y < m_rp.m_tile[1] ) { for ( index_type tile_id2 = blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.z; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.z < m_rp.m_tile[2] ) { m_func(Tag(), offset_0 , offset_1 , offset_2); } @@ -398,19 +362,19 @@ struct apply_impl<4,RP,Functor,void > const index_type thr_id1 = threadIdx.x / m_rp.m_tile[0]; for ( index_type tile_id3 = blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { - const index_type offset_3 = tile_id3*m_rp.m_tile[3] + threadIdx.z; + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && threadIdx.z < m_rp.m_tile[3] ) { for ( index_type tile_id2 = blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.y; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.y < m_rp.m_tile[2] ) { for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { m_func(offset_0 , offset_1 , offset_2 , offset_3); } @@ -436,19 +400,19 @@ struct apply_impl<4,RP,Functor,void > const index_type thr_id1 = threadIdx.x % m_rp.m_tile[1]; for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type tile_id2 = blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.y; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.y < m_rp.m_tile[2] ) { for ( index_type tile_id3 = blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { - const index_type offset_3 = tile_id3*m_rp.m_tile[3] + threadIdx.z; + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && threadIdx.z < m_rp.m_tile[3] ) { m_func(offset_0 , offset_1 , offset_2 , offset_3); } @@ -498,19 +462,19 @@ struct apply_impl<4,RP,Functor,Tag> const index_type thr_id1 = threadIdx.x / m_rp.m_tile[0]; for ( index_type tile_id3 = blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { - const index_type offset_3 = tile_id3*m_rp.m_tile[3] + threadIdx.z; + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && threadIdx.z < m_rp.m_tile[3] ) { for ( index_type tile_id2 = blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.y; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.y < m_rp.m_tile[2] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { m_func(Tag(), offset_0 , offset_1 , offset_2 , offset_3); } @@ -535,19 +499,19 @@ struct apply_impl<4,RP,Functor,Tag> const index_type thr_id1 = threadIdx.x % m_rp.m_tile[1]; for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = tile_id1*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type tile_id2 = blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { - const index_type offset_2 = tile_id2*m_rp.m_tile[2] + threadIdx.y; + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && threadIdx.y < m_rp.m_tile[2] ) { for ( index_type tile_id3 = blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { - const index_type offset_3 = tile_id3*m_rp.m_tile[3] + threadIdx.z; + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && threadIdx.z < m_rp.m_tile[3] ) { m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3); } @@ -612,23 +576,23 @@ struct apply_impl<5,RP,Functor,void > const index_type thr_id3 = threadIdx.y / m_rp.m_tile[2]; for ( index_type tile_id4 = blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { - const index_type offset_4 = tile_id4*m_rp.m_tile[4] + threadIdx.z; + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && threadIdx.z < m_rp.m_tile[4] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { m_func(offset_0 , offset_1 , offset_2 , offset_3, offset_4); } @@ -667,23 +631,23 @@ struct apply_impl<5,RP,Functor,void > const index_type thr_id3 = threadIdx.y % m_rp.m_tile[3]; for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type tile_id4 = blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { - const index_type offset_4 = tile_id4*m_rp.m_tile[4] + threadIdx.z; + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && threadIdx.z < m_rp.m_tile[4] ) { m_func(offset_0 , offset_1 , offset_2 , offset_3 , offset_4); } @@ -747,23 +711,23 @@ struct apply_impl<5,RP,Functor,Tag> const index_type thr_id3 = threadIdx.y / m_rp.m_tile[2]; for ( index_type tile_id4 = blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { - const index_type offset_4 = tile_id4*m_rp.m_tile[4] + threadIdx.z; + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && threadIdx.z < m_rp.m_tile[4] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3, offset_4); } @@ -802,23 +766,23 @@ struct apply_impl<5,RP,Functor,Tag> const index_type thr_id3 = threadIdx.y % m_rp.m_tile[3]; for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type tile_id4 = blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { - const index_type offset_4 = tile_id4*m_rp.m_tile[4] + threadIdx.z; + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && threadIdx.z < m_rp.m_tile[4] ) { m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3 , offset_4); } @@ -895,27 +859,27 @@ struct apply_impl<6,RP,Functor,void > const index_type thr_id5 = threadIdx.z / m_rp.m_tile[4]; for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { - const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5; + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { - const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4; + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { m_func(offset_0 , offset_1 , offset_2 , offset_3, offset_4, offset_5); } @@ -967,27 +931,27 @@ struct apply_impl<6,RP,Functor,void > const index_type thr_id5 = threadIdx.z % m_rp.m_tile[5]; for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { - const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4; + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { - const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5; + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { m_func(offset_0 , offset_1 , offset_2 , offset_3 , offset_4 , offset_5); } @@ -1064,27 +1028,27 @@ struct apply_impl<6,RP,Functor,Tag> const index_type thr_id5 = threadIdx.z / m_rp.m_tile[4]; for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { - const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5; + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { - const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4; + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3, offset_4, offset_5); } @@ -1136,27 +1100,27 @@ struct apply_impl<6,RP,Functor,Tag> const index_type thr_id5 = threadIdx.z % m_rp.m_tile[5]; for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { - const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0; + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { - const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1; + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { - const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2; + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { - const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3; + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { - const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4; + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { - const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5; + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3 , offset_4 , offset_5); } @@ -1292,7 +1256,7 @@ protected: const Functor m_func; }; -} } } //end namespace Kokkos::Experimental::Impl +} } //end namespace Kokkos::Impl #endif #endif diff --git a/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp b/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp new file mode 100644 index 0000000000..d59c5c6726 --- /dev/null +++ b/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp @@ -0,0 +1,2715 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_CUDA_EXP_ITERATE_TILE_REFACTOR_HPP +#define KOKKOS_CUDA_EXP_ITERATE_TILE_REFACTOR_HPP + +#include +#if defined( __CUDACC__ ) && defined( KOKKOS_ENABLE_CUDA ) + +#include +#include +#include + +#include + +// #include +// Including the file above leads to following type of errors: +// /home/ndellin/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp(84): error: incomplete type is not allowed +// use existing Kokkos functionality, e.g. max blocks, once resolved + +#if defined(KOKKOS_ENABLE_PROFILING) +#include +#include +#endif + +namespace Kokkos { namespace Impl { + +namespace Refactor { + +// ------------------------------------------------------------------ // +// ParallelFor iteration pattern +template< int N , typename RP , typename Functor , typename Tag > +struct DeviceIterateTile; + +//Rank 2 +// Specializations for void tag type +template< typename RP , typename Functor > +struct DeviceIterateTile<2,RP,Functor,void > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + inline __device__ + void exec_range() const + { + // LL + if (RP::inner_direction == RP::Left) { + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + m_func(offset_0 , offset_1); + } + } + } + } + } + // LR + else { + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + m_func(offset_0 , offset_1); + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag > +struct DeviceIterateTile<2,RP,Functor,Tag> +{ + using index_type = typename RP::index_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + inline __device__ + void exec_range() const + { + if (RP::inner_direction == RP::Left) { + // Loop over size maxnumblocks until full range covered + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + m_func(Tag(), offset_0 , offset_1); + } + } + } + } + } + else { + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + m_func(Tag(), offset_0 , offset_1); + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + + +//Rank 3 +// Specializations for void tag type +template< typename RP , typename Functor > +struct DeviceIterateTile<3,RP,Functor,void > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + inline __device__ + void exec_range() const + { + // LL + if (RP::inner_direction == RP::Left) { + for ( index_type tile_id2 = (index_type)blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.z < m_rp.m_tile[2] ) { + + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + m_func(offset_0 , offset_1 , offset_2); + } + } + } + } + } + } + } + // LR + else { + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + + for ( index_type tile_id2 = (index_type)blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.z < m_rp.m_tile[2] ) { + m_func(offset_0 , offset_1 , offset_2); + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + +// Specializations for void tag type +template< typename RP , typename Functor , typename Tag > +struct DeviceIterateTile<3,RP,Functor,Tag> +{ + using index_type = typename RP::index_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + inline __device__ + void exec_range() const + { + if (RP::inner_direction == RP::Left) { + for ( index_type tile_id2 = (index_type)blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.z < m_rp.m_tile[2] ) { + + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + m_func(Tag(), offset_0 , offset_1 , offset_2); + } + } + } + } + } + } + } + else { + for ( index_type tile_id0 = (index_type)blockIdx.x; tile_id0 < m_rp.m_tile_end[0]; tile_id0 += gridDim.x ) { + const index_type offset_0 = tile_id0*m_rp.m_tile[0] + (index_type)threadIdx.x + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && (index_type)threadIdx.x < m_rp.m_tile[0] ) { + + for ( index_type tile_id1 = (index_type)blockIdx.y; tile_id1 < m_rp.m_tile_end[1]; tile_id1 += gridDim.y ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && (index_type)threadIdx.y < m_rp.m_tile[1] ) { + + for ( index_type tile_id2 = (index_type)blockIdx.z; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.z ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.z < m_rp.m_tile[2] ) { + m_func(Tag(), offset_0 , offset_1 , offset_2); + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + + +//Rank 4 +// Specializations for void tag type +template< typename RP , typename Functor > +struct DeviceIterateTile<4,RP,Functor,void > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + // LL + if (RP::inner_direction == RP::Left) { + const index_type temp0 = m_rp.m_tile_end[0]; + const index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl0 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl1 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl0 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x % numbl0; + const index_type tile_id1 = (index_type)blockIdx.x / numbl0; + const index_type thr_id0 = (index_type)threadIdx.x % m_rp.m_tile[0]; + const index_type thr_id1 = (index_type)threadIdx.x / m_rp.m_tile[0]; + + for ( index_type tile_id3 = (index_type)blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && (index_type)threadIdx.z < m_rp.m_tile[3] ) { + + for ( index_type tile_id2 = (index_type)blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.y < m_rp.m_tile[2] ) { + + for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + m_func(offset_0 , offset_1 , offset_2 , offset_3); + } + } + } + } + } + } + } + } + } + // LR + else { + const index_type temp0 = m_rp.m_tile_end[0]; + const index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl1 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl0 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl1 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x / numbl1; + const index_type tile_id1 = (index_type)blockIdx.x % numbl1; + const index_type thr_id0 = (index_type)threadIdx.x / m_rp.m_tile[1]; + const index_type thr_id1 = (index_type)threadIdx.x % m_rp.m_tile[1]; + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type tile_id2 = (index_type)blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.y < m_rp.m_tile[2] ) { + + for ( index_type tile_id3 = (index_type)blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && (index_type)threadIdx.z < m_rp.m_tile[3] ) { + m_func(offset_0 , offset_1 , offset_2 , offset_3); + } + } + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + +// Specializations for void tag type +template< typename RP , typename Functor , typename Tag > +struct DeviceIterateTile<4,RP,Functor,Tag> +{ + using index_type = typename RP::index_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if (RP::inner_direction == RP::Left) { + const index_type temp0 = m_rp.m_tile_end[0]; + const index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl0 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl1 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl0 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x % numbl0; + const index_type tile_id1 = (index_type)blockIdx.x / numbl0; + const index_type thr_id0 = (index_type)threadIdx.x % m_rp.m_tile[0]; + const index_type thr_id1 = (index_type)threadIdx.x / m_rp.m_tile[0]; + + for ( index_type tile_id3 = (index_type)blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && (index_type)threadIdx.z < m_rp.m_tile[3] ) { + + for ( index_type tile_id2 = (index_type)blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.y < m_rp.m_tile[2] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + m_func(Tag(), offset_0 , offset_1 , offset_2 , offset_3); + } + } + } + } + } + } + } + } + } + else { + const index_type temp0 = m_rp.m_tile_end[0]; + const index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl1 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl0 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl1 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x / numbl1; + const index_type tile_id1 = (index_type)blockIdx.x % numbl1; + const index_type thr_id0 = (index_type)threadIdx.x / m_rp.m_tile[1]; + const index_type thr_id1 = (index_type)threadIdx.x % m_rp.m_tile[1]; + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = tile_id1*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type tile_id2 = (index_type)blockIdx.y; tile_id2 < m_rp.m_tile_end[2]; tile_id2 += gridDim.y ) { + const index_type offset_2 = tile_id2*m_rp.m_tile[2] + (index_type)threadIdx.y + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && (index_type)threadIdx.y < m_rp.m_tile[2] ) { + + for ( index_type tile_id3 = (index_type)blockIdx.z; tile_id3 < m_rp.m_tile_end[3]; tile_id3 += gridDim.z ) { + const index_type offset_3 = tile_id3*m_rp.m_tile[3] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && (index_type)threadIdx.z < m_rp.m_tile[3] ) { + m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3); + } + } + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + + +//Rank 5 +// Specializations for void tag type +template< typename RP , typename Functor > +struct DeviceIterateTile<5,RP,Functor,void > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + // LL + if (RP::inner_direction == RP::Left) { + + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl0 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl1 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl0 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x % numbl0; + const index_type tile_id1 = (index_type)blockIdx.x / numbl0; + const index_type thr_id0 = (index_type)threadIdx.x % m_rp.m_tile[0]; + const index_type thr_id1 = (index_type)threadIdx.x / m_rp.m_tile[0]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl2 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl3 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl2 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y % numbl2; + const index_type tile_id3 = (index_type)blockIdx.y / numbl2; + const index_type thr_id2 = (index_type)threadIdx.y % m_rp.m_tile[2]; + const index_type thr_id3 = (index_type)threadIdx.y / m_rp.m_tile[2]; + + for ( index_type tile_id4 = (index_type)blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && (index_type)threadIdx.z < m_rp.m_tile[4] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + m_func(offset_0 , offset_1 , offset_2 , offset_3, offset_4); + } + } + } + } + } + } + } + } + } + } + } + // LR + else { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl1 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl0 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl1 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x / numbl1; + const index_type tile_id1 = (index_type)blockIdx.x % numbl1; + const index_type thr_id0 = (index_type)threadIdx.x / m_rp.m_tile[1]; + const index_type thr_id1 = (index_type)threadIdx.x % m_rp.m_tile[1]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl3 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl2 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl3 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y / numbl3; + const index_type tile_id3 = (index_type)blockIdx.y % numbl3; + const index_type thr_id2 = (index_type)threadIdx.y / m_rp.m_tile[3]; + const index_type thr_id3 = (index_type)threadIdx.y % m_rp.m_tile[3]; + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type tile_id4 = (index_type)blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && (index_type)threadIdx.z < m_rp.m_tile[4] ) { + m_func(offset_0 , offset_1 , offset_2 , offset_3 , offset_4); + } + } + } + } + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag > +struct DeviceIterateTile<5,RP,Functor,Tag> +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + // LL + if (RP::inner_direction == RP::Left) { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl0 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl1 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl0 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x % numbl0; + const index_type tile_id1 = (index_type)blockIdx.x / numbl0; + const index_type thr_id0 = (index_type)threadIdx.x % m_rp.m_tile[0]; + const index_type thr_id1 = (index_type)threadIdx.x / m_rp.m_tile[0]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl2 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl3 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl2 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y % numbl2; + const index_type tile_id3 = (index_type)blockIdx.y / numbl2; + const index_type thr_id2 = (index_type)threadIdx.y % m_rp.m_tile[2]; + const index_type thr_id3 = (index_type)threadIdx.y / m_rp.m_tile[2]; + + for ( index_type tile_id4 = (index_type)blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && (index_type)threadIdx.z < m_rp.m_tile[4] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3, offset_4); + } + } + } + } + } + } + } + } + } + } + } + // LR + else { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl1 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl0 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl1 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x / numbl1; + const index_type tile_id1 = (index_type)blockIdx.x % numbl1; + const index_type thr_id0 = (index_type)threadIdx.x / m_rp.m_tile[1]; + const index_type thr_id1 = (index_type)threadIdx.x % m_rp.m_tile[1]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl3 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl2 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl3 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y / numbl3; + const index_type tile_id3 = (index_type)blockIdx.y % numbl3; + const index_type thr_id2 = (index_type)threadIdx.y / m_rp.m_tile[3]; + const index_type thr_id3 = (index_type)threadIdx.y % m_rp.m_tile[3]; + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type tile_id4 = (index_type)blockIdx.z; tile_id4 < m_rp.m_tile_end[4]; tile_id4 += gridDim.z ) { + const index_type offset_4 = tile_id4*m_rp.m_tile[4] + (index_type)threadIdx.z + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && (index_type)threadIdx.z < m_rp.m_tile[4] ) { + m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3 , offset_4); + } + } + } + } + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + + +//Rank 6 +// Specializations for void tag type +template< typename RP , typename Functor > +struct DeviceIterateTile<6,RP,Functor,void > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + // LL + if (RP::inner_direction == RP::Left) { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl0 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl1 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl0 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x % numbl0; + const index_type tile_id1 = (index_type)blockIdx.x / numbl0; + const index_type thr_id0 = (index_type)threadIdx.x % m_rp.m_tile[0]; + const index_type thr_id1 = (index_type)threadIdx.x / m_rp.m_tile[0]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl2 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl3 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl2 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y % numbl2; + const index_type tile_id3 = (index_type)blockIdx.y / numbl2; + const index_type thr_id2 = (index_type)threadIdx.y % m_rp.m_tile[2]; + const index_type thr_id3 = (index_type)threadIdx.y / m_rp.m_tile[2]; + + temp0 = m_rp.m_tile_end[4]; + temp1 = m_rp.m_tile_end[5]; + const index_type numbl4 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl5 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl4 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id4 = (index_type)blockIdx.z % numbl4; + const index_type tile_id5 = (index_type)blockIdx.z / numbl4; + const index_type thr_id4 = (index_type)threadIdx.z % m_rp.m_tile[4]; + const index_type thr_id5 = (index_type)threadIdx.z / m_rp.m_tile[4]; + + for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; + if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { + + for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + m_func(offset_0 , offset_1 , offset_2 , offset_3, offset_4, offset_5); + } + } + } + } + } + } + } + } + } + } + } + } + } + // LR + else { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl1 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl0 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl1 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x / numbl1; + const index_type tile_id1 = (index_type)blockIdx.x % numbl1; + const index_type thr_id0 = (index_type)threadIdx.x / m_rp.m_tile[1]; + const index_type thr_id1 = (index_type)threadIdx.x % m_rp.m_tile[1]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl3 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl2 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl3 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y / numbl3; + const index_type tile_id3 = (index_type)blockIdx.y % numbl3; + const index_type thr_id2 = (index_type)threadIdx.y / m_rp.m_tile[3]; + const index_type thr_id3 = (index_type)threadIdx.y % m_rp.m_tile[3]; + + temp0 = m_rp.m_tile_end[4]; + temp1 = m_rp.m_tile_end[5]; + const index_type numbl5 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl4 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl5 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id4 = (index_type)blockIdx.z / numbl5; + const index_type tile_id5 = (index_type)blockIdx.z % numbl5; + const index_type thr_id4 = (index_type)threadIdx.z / m_rp.m_tile[5]; + const index_type thr_id5 = (index_type)threadIdx.z % m_rp.m_tile[5]; + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { + + for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; + if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { + m_func(offset_0 , offset_1 , offset_2 , offset_3 , offset_4 , offset_5); + } + } + } + } + } + } + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag > +struct DeviceIterateTile<6,RP,Functor,Tag> +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ ) + : m_rp(rp_) + , m_func(f_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + // LL + if (RP::inner_direction == RP::Left) { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl0 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl1 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl0 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x % numbl0; + const index_type tile_id1 = (index_type)blockIdx.x / numbl0; + const index_type thr_id0 = (index_type)threadIdx.x % m_rp.m_tile[0]; + const index_type thr_id1 = (index_type)threadIdx.x / m_rp.m_tile[0]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl2 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl3 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl2 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y % numbl2; + const index_type tile_id3 = (index_type)blockIdx.y / numbl2; + const index_type thr_id2 = (index_type)threadIdx.y % m_rp.m_tile[2]; + const index_type thr_id3 = (index_type)threadIdx.y / m_rp.m_tile[2]; + + temp0 = m_rp.m_tile_end[4]; + temp1 = m_rp.m_tile_end[5]; + const index_type numbl4 = ( temp0 <= max_blocks ? temp0 : max_blocks ) ; + const index_type numbl5 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl4 ) : + ( temp1 <= max_blocks ? temp1 : max_blocks ) ); + + const index_type tile_id4 = (index_type)blockIdx.z % numbl4; + const index_type tile_id5 = (index_type)blockIdx.z / numbl4; + const index_type thr_id4 = (index_type)threadIdx.z % m_rp.m_tile[4]; + const index_type thr_id5 = (index_type)threadIdx.z / m_rp.m_tile[4]; + + for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; + if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { + + for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type j = tile_id1 ; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type i = tile_id0 ; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3, offset_4, offset_5); + } + } + } + } + } + } + } + } + } + } + } + } + } + // LR + else { + index_type temp0 = m_rp.m_tile_end[0]; + index_type temp1 = m_rp.m_tile_end[1]; + const index_type numbl1 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl0 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl1 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id0 = (index_type)blockIdx.x / numbl1; + const index_type tile_id1 = (index_type)blockIdx.x % numbl1; + const index_type thr_id0 = (index_type)threadIdx.x / m_rp.m_tile[1]; + const index_type thr_id1 = (index_type)threadIdx.x % m_rp.m_tile[1]; + + temp0 = m_rp.m_tile_end[2]; + temp1 = m_rp.m_tile_end[3]; + const index_type numbl3 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl2 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl3 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id2 = (index_type)blockIdx.y / numbl3; + const index_type tile_id3 = (index_type)blockIdx.y % numbl3; + const index_type thr_id2 = (index_type)threadIdx.y / m_rp.m_tile[3]; + const index_type thr_id3 = (index_type)threadIdx.y % m_rp.m_tile[3]; + + temp0 = m_rp.m_tile_end[4]; + temp1 = m_rp.m_tile_end[5]; + const index_type numbl5 = ( temp1 <= max_blocks ? temp1 : max_blocks ) ; + const index_type numbl4 = ( temp0*temp1 > max_blocks ? index_type( max_blocks / numbl5 ) : + ( temp0 <= max_blocks ? temp0 : max_blocks ) ); + + const index_type tile_id4 = (index_type)blockIdx.z / numbl5; + const index_type tile_id5 = (index_type)blockIdx.z % numbl5; + const index_type thr_id4 = (index_type)threadIdx.z / m_rp.m_tile[5]; + const index_type thr_id5 = (index_type)threadIdx.z % m_rp.m_tile[5]; + + for ( index_type i = tile_id0; i < m_rp.m_tile_end[0]; i += numbl0 ) { + const index_type offset_0 = i*m_rp.m_tile[0] + thr_id0 + (index_type)m_rp.m_lower[0]; + if ( offset_0 < m_rp.m_upper[0] && thr_id0 < m_rp.m_tile[0] ) { + + for ( index_type j = tile_id1; j < m_rp.m_tile_end[1]; j += numbl1 ) { + const index_type offset_1 = j*m_rp.m_tile[1] + thr_id1 + (index_type)m_rp.m_lower[1]; + if ( offset_1 < m_rp.m_upper[1] && thr_id1 < m_rp.m_tile[1] ) { + + for ( index_type k = tile_id2; k < m_rp.m_tile_end[2]; k += numbl2 ) { + const index_type offset_2 = k*m_rp.m_tile[2] + thr_id2 + (index_type)m_rp.m_lower[2]; + if ( offset_2 < m_rp.m_upper[2] && thr_id2 < m_rp.m_tile[2] ) { + + for ( index_type l = tile_id3; l < m_rp.m_tile_end[3]; l += numbl3 ) { + const index_type offset_3 = l*m_rp.m_tile[3] + thr_id3 + (index_type)m_rp.m_lower[3]; + if ( offset_3 < m_rp.m_upper[3] && thr_id3 < m_rp.m_tile[3] ) { + + for ( index_type m = tile_id4; m < m_rp.m_tile_end[4]; m += numbl4 ) { + const index_type offset_4 = m*m_rp.m_tile[4] + thr_id4 + (index_type)m_rp.m_lower[4]; + if ( offset_4 < m_rp.m_upper[4] && thr_id4 < m_rp.m_tile[4] ) { + + for ( index_type n = tile_id5; n < m_rp.m_tile_end[5]; n += numbl5 ) { + const index_type offset_5 = n*m_rp.m_tile[5] + thr_id5 + (index_type)m_rp.m_lower[5]; + if ( offset_5 < m_rp.m_upper[5] && thr_id5 < m_rp.m_tile[5] ) { + m_func(Tag() , offset_0 , offset_1 , offset_2 , offset_3 , offset_4 , offset_5); + } + } + } + } + } + } + } + } + } + } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; +}; + +} // Refactor + +// ---------------------------------------------------------------------------------- + +namespace Reduce { + +template < typename T > +using is_void = std::is_same< T, void >; + +template < typename T > +struct is_array_type : std::false_type +{ + using value_type = T; +}; + +template < typename T > +struct is_array_type< T* > : std::true_type +{ + using value_type = T; +}; + +template < typename T > +struct is_array_type< T[] > : std::true_type +{ + using value_type = T; +}; + +// ------------------------------------------------------------------ // +template< int N , typename RP , typename Functor , typename Tag , typename ValueType , typename Enable = void > +struct DeviceIterateTile; + +// ParallelReduce iteration pattern +// Scalar reductions + +// num_blocks = min( num_tiles, max_num_blocks ); //i.e. determined by number of tiles and reduction algorithm constraints +// extract n-dim tile offsets (i.e. tile's global starting mulit-index) from the tileid = blockid using tile dimensions +// local indices within a tile extracted from (index_type)threadIdx.x using tile dims, constrained by blocksize +// combine tile and local id info for multi-dim global ids + +// Pattern: +// Each block+thread is responsible for a tile+local_id combo (additional when striding by num_blocks) +// 1. create offset arrays +// 2. loop over number of tiles, striding by griddim (equal to num tiles, or max num blocks) +// 3. temps set for tile_idx and thrd_idx, which will be modified +// 4. if LL vs LR: +// determine tile starting point offsets (multidim) +// determine local index offsets (multidim) +// concatentate tile offset + local offset for global multi-dim index +// if offset withinin range bounds AND local offset within tile bounds, call functor + +// ValueType = T +//Rank 2 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<2,RP,Functor,void,ValueType, typename std::enable_if< !is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_v ); } + } + } + } + + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<2,RP,Functor,Tag, ValueType, typename std::enable_if< !is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); // Move this to first computation, add to m_offset right away + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +//Rank 3 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<3,RP,Functor,void,ValueType , typename std::enable_if< !is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); // Move this to first computation, add to m_offset right away + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +// Specializations for void tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<3,RP,Functor,Tag, ValueType, typename std::enable_if< !is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); // Move this to first computation, add to m_offset right away + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +//Rank 4 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<4,RP,Functor,void,ValueType , typename std::enable_if< !is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +// Specializations for void tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<4,RP,Functor,Tag,ValueType, typename std::enable_if< !is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +//Rank 5 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<5,RP,Functor,void,ValueType , typename std::enable_if< !is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<5,RP,Functor,Tag,ValueType, typename std::enable_if< !is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +//Rank 6 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<6,RP,Functor,void,ValueType , typename std::enable_if< !is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_offset[5], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<6,RP,Functor,Tag,ValueType, typename std::enable_if< !is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , ValueType & v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_offset[5], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + ValueType & m_v; +}; + + +// ValueType = T[], T* +//Rank 2 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<2,RP,Functor,void,ValueType, typename std::enable_if< is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); // Move this to first computation, add to m_offset right away + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<2,RP,Functor,Tag, ValueType, typename std::enable_if< is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_v ); } + } + } //end for loop over num_tiles - product of tiles in each direction + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +//Rank 3 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<3,RP,Functor,void,ValueType , typename std::enable_if< is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); // Move this to first computation, add to m_offset right away + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +// Specializations for void tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<3,RP,Functor,Tag, ValueType, typename std::enable_if< is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + inline __device__ + void exec_range() const + { + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +//Rank 4 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<4,RP,Functor,void,ValueType , typename std::enable_if< is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +// Specializations for void tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<4,RP,Functor,Tag,ValueType, typename std::enable_if< is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + inline __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +//Rank 5 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<5,RP,Functor,void,ValueType , typename std::enable_if< is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<5,RP,Functor,Tag,ValueType, typename std::enable_if< is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +//Rank 6 +// Specializations for void tag type +template< typename RP , typename Functor , typename ValueType > +struct DeviceIterateTile<6,RP,Functor,void,ValueType , typename std::enable_if< is_array_type::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_offset[5], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + + +// Specializations for tag type +template< typename RP , typename Functor , typename Tag, typename ValueType > +struct DeviceIterateTile<6,RP,Functor,Tag,ValueType, typename std::enable_if< is_array_type::value && !is_void< Tag >::value >::type > +{ + using index_type = typename RP::index_type; + using value_type = typename is_array_type< ValueType >::value_type; + + __device__ + DeviceIterateTile( const RP & rp_ , const Functor & f_ , value_type* v_) + : m_rp(rp_) + , m_func(f_) + , m_v(v_) + {} + + static constexpr index_type max_blocks = 65535; + //static constexpr index_type max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + + inline __device__ + void exec_range() const + { + //enum { max_blocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount) }; + //const index_type max_blocks = static_cast( Kokkos::Impl::cuda_internal_maximum_grid_count() ); + if ( (index_type)blockIdx.x < m_rp.m_num_tiles && (index_type)threadIdx.y < m_rp.m_prod_tile_dims ) { + index_type m_offset[RP::rank]; // tile starting global id offset + index_type m_local_offset[RP::rank]; // tile starting global id offset + + for ( index_type tileidx = (index_type)blockIdx.x; tileidx < m_rp.m_num_tiles; tileidx += gridDim.x ) { + index_type tile_idx = tileidx; // temp because tile_idx will be modified while determining tile starting point offsets + index_type thrd_idx = (index_type)threadIdx.y; + bool in_bounds = true; + + // LL + if (RP::inner_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + + // tile-local indices identified with (index_type)threadIdx.y + m_local_offset[i] = (thrd_idx % m_rp.m_tile[i]); + thrd_idx /= m_rp.m_tile[i]; + + m_offset[i] += m_local_offset[i]; + if ( !(m_offset[i] < m_rp.m_upper[i] && m_local_offset[i] < m_rp.m_tile[i]) ) { + in_bounds &= false; + } + } + if ( in_bounds ) + { m_func( Tag(), m_offset[0], m_offset[1], m_offset[2], m_offset[3], m_offset[4], m_offset[5], m_v ); } + } + } + } + } //end exec_range + +private: + const RP & m_rp; + const Functor & m_func; + value_type* m_v; +}; + +} // Reduce + +// ---------------------------------------------------------------------------------- + +} } //end namespace Kokkos::Impl + +#endif +#endif diff --git a/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp b/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp index 13abcfd93c..f55191e98c 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp @@ -53,6 +53,7 @@ #include #include #include +#include //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -125,53 +126,12 @@ unsigned long kokkos_impl_cuda_constant_memory_buffer[ Kokkos::Impl::CudaTraits: #endif - -namespace Kokkos { -namespace Impl { - struct CudaLockArraysStruct { - int* atomic; - int* scratch; - int* threadid; - int n; - }; -} -} -__device__ __constant__ -#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE -extern -#endif -Kokkos::Impl::CudaLockArraysStruct kokkos_impl_cuda_lock_arrays ; - -#define CUDA_SPACE_ATOMIC_MASK 0x1FFFF -#define CUDA_SPACE_ATOMIC_XOR_MASK 0x15A39 - namespace Kokkos { namespace Impl { void* cuda_resize_scratch_space(std::int64_t bytes, bool force_shrink = false); } } -namespace Kokkos { -namespace Impl { -__device__ inline -bool lock_address_cuda_space(void* ptr) { - size_t offset = size_t(ptr); - offset = offset >> 2; - offset = offset & CUDA_SPACE_ATOMIC_MASK; - return (0 == atomicCAS(&kokkos_impl_cuda_lock_arrays.atomic[offset],0,1)); -} - -__device__ inline -void unlock_address_cuda_space(void* ptr) { - size_t offset = size_t(ptr); - offset = offset >> 2; - offset = offset & CUDA_SPACE_ATOMIC_MASK; - atomicExch( &kokkos_impl_cuda_lock_arrays.atomic[ offset ], 0); -} - -} -} - template< typename T > inline __device__ @@ -192,7 +152,7 @@ namespace Impl { // For 2.0 capability: 48 KB L1 and 16 KB shared //---------------------------------------------------------------------------- -template< class DriverType > +template< class DriverType> __global__ static void cuda_parallel_launch_constant_memory() { @@ -202,20 +162,45 @@ static void cuda_parallel_launch_constant_memory() driver(); } -template< class DriverType > +template< class DriverType, unsigned int maxTperB, unsigned int minBperSM > +__global__ +__launch_bounds__(maxTperB, minBperSM) +static void cuda_parallel_launch_constant_memory() +{ + const DriverType & driver = + *((const DriverType *) kokkos_impl_cuda_constant_memory_buffer ); + + driver(); +} + +template< class DriverType> __global__ static void cuda_parallel_launch_local_memory( const DriverType driver ) { driver(); } -template < class DriverType , - bool Large = ( CudaTraits::ConstantMemoryUseThreshold < sizeof(DriverType) ) > +template< class DriverType, unsigned int maxTperB, unsigned int minBperSM > +__global__ +__launch_bounds__(maxTperB, minBperSM) +static void cuda_parallel_launch_local_memory( const DriverType driver ) +{ + driver(); +} + +template < class DriverType + , class LaunchBounds = Kokkos::LaunchBounds<> + , bool Large = ( CudaTraits::ConstantMemoryUseThreshold < sizeof(DriverType) ) > struct CudaParallelLaunch ; -template < class DriverType > -struct CudaParallelLaunch< DriverType , true > { - +template < class DriverType + , unsigned int MaxThreadsPerBlock + , unsigned int MinBlocksPerSM > +struct CudaParallelLaunch< DriverType + , Kokkos::LaunchBounds< MaxThreadsPerBlock + , MinBlocksPerSM > + , true > +{ inline CudaParallelLaunch( const DriverType & driver , const dim3 & grid @@ -236,28 +221,28 @@ struct CudaParallelLaunch< DriverType , true > { if ( CudaTraits::SharedMemoryCapacity < shmem ) { Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: shared memory request is too large") ); } - #ifndef KOKKOS_ARCH_KEPLER //On Kepler the L1 has no benefit since it doesn't cache reads - else if ( shmem ) { - CUDA_SAFE_CALL( cudaFuncSetCacheConfig( cuda_parallel_launch_constant_memory< DriverType > , cudaFuncCachePreferShared ) ); - } else { - CUDA_SAFE_CALL( cudaFuncSetCacheConfig( cuda_parallel_launch_constant_memory< DriverType > , cudaFuncCachePreferL1 ) ); + #ifndef KOKKOS_ARCH_KEPLER + // On Kepler the L1 has no benefit since it doesn't cache reads + else { + CUDA_SAFE_CALL( + cudaFuncSetCacheConfig + ( cuda_parallel_launch_constant_memory + < DriverType, MaxThreadsPerBlock, MinBlocksPerSM > + , ( shmem ? cudaFuncCachePreferShared : cudaFuncCachePreferL1 ) + ) ); } #endif // Copy functor to constant memory on the device - cudaMemcpyToSymbol( kokkos_impl_cuda_constant_memory_buffer , & driver , sizeof(DriverType) ); + cudaMemcpyToSymbol( + kokkos_impl_cuda_constant_memory_buffer, &driver, sizeof(DriverType) ); - #ifndef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE - Kokkos::Impl::CudaLockArraysStruct locks; - locks.atomic = atomic_lock_array_cuda_space_ptr(false); - locks.scratch = scratch_lock_array_cuda_space_ptr(false); - locks.threadid = threadid_lock_array_cuda_space_ptr(false); - locks.n = Kokkos::Cuda::concurrency(); - cudaMemcpyToSymbol( kokkos_impl_cuda_lock_arrays , & locks , sizeof(CudaLockArraysStruct) ); - #endif + KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE(); // Invoke the driver function on the device - cuda_parallel_launch_constant_memory< DriverType ><<< grid , block , shmem , stream >>>(); + cuda_parallel_launch_constant_memory + < DriverType, MaxThreadsPerBlock, MinBlocksPerSM > + <<< grid , block , shmem , stream >>>(); #if defined( KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ) CUDA_SAFE_CALL( cudaGetLastError() ); @@ -268,8 +253,10 @@ struct CudaParallelLaunch< DriverType , true > { }; template < class DriverType > -struct CudaParallelLaunch< DriverType , false > { - +struct CudaParallelLaunch< DriverType + , Kokkos::LaunchBounds<> + , true > +{ inline CudaParallelLaunch( const DriverType & driver , const dim3 & grid @@ -279,27 +266,136 @@ struct CudaParallelLaunch< DriverType , false > { { if ( grid.x && ( block.x * block.y * block.z ) ) { + if ( sizeof( Kokkos::Impl::CudaTraits::ConstantGlobalBufferType ) < + sizeof( DriverType ) ) { + Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: Functor is too large") ); + } + + // Fence before changing settings and copying closure + Kokkos::Cuda::fence(); + if ( CudaTraits::SharedMemoryCapacity < shmem ) { Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: shared memory request is too large") ); } - #ifndef KOKKOS_ARCH_KEPLER //On Kepler the L1 has no benefit since it doesn't cache reads - else if ( shmem ) { - CUDA_SAFE_CALL( cudaFuncSetCacheConfig( cuda_parallel_launch_local_memory< DriverType > , cudaFuncCachePreferShared ) ); - } else { - CUDA_SAFE_CALL( cudaFuncSetCacheConfig( cuda_parallel_launch_local_memory< DriverType > , cudaFuncCachePreferL1 ) ); + #ifndef KOKKOS_ARCH_KEPLER + // On Kepler the L1 has no benefit since it doesn't cache reads + else { + CUDA_SAFE_CALL( + cudaFuncSetCacheConfig + ( cuda_parallel_launch_constant_memory< DriverType > + , ( shmem ? cudaFuncCachePreferShared : cudaFuncCachePreferL1 ) + ) ); } #endif - #ifndef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE - Kokkos::Impl::CudaLockArraysStruct locks; - locks.atomic = atomic_lock_array_cuda_space_ptr(false); - locks.scratch = scratch_lock_array_cuda_space_ptr(false); - locks.threadid = threadid_lock_array_cuda_space_ptr(false); - locks.n = Kokkos::Cuda::concurrency(); - cudaMemcpyToSymbol( kokkos_impl_cuda_lock_arrays , & locks , sizeof(CudaLockArraysStruct) ); + // Copy functor to constant memory on the device + cudaMemcpyToSymbol( + kokkos_impl_cuda_constant_memory_buffer, &driver, sizeof(DriverType) ); + + KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE(); + + // Invoke the driver function on the device + cuda_parallel_launch_constant_memory< DriverType > + <<< grid , block , shmem , stream >>>(); + +#if defined( KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ) + CUDA_SAFE_CALL( cudaGetLastError() ); + Kokkos::Cuda::fence(); +#endif + } + } +}; + +template < class DriverType + , unsigned int MaxThreadsPerBlock + , unsigned int MinBlocksPerSM > +struct CudaParallelLaunch< DriverType + , Kokkos::LaunchBounds< MaxThreadsPerBlock + , MinBlocksPerSM > + , false > +{ + inline + CudaParallelLaunch( const DriverType & driver + , const dim3 & grid + , const dim3 & block + , const int shmem + , const cudaStream_t stream = 0 ) + { + if ( grid.x && ( block.x * block.y * block.z ) ) { + + if ( sizeof( Kokkos::Impl::CudaTraits::ConstantGlobalBufferType ) < + sizeof( DriverType ) ) { + Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: Functor is too large") ); + } + + if ( CudaTraits::SharedMemoryCapacity < shmem ) { + Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: shared memory request is too large") ); + } + #ifndef KOKKOS_ARCH_KEPLER + // On Kepler the L1 has no benefit since it doesn't cache reads + else { + CUDA_SAFE_CALL( + cudaFuncSetCacheConfig + ( cuda_parallel_launch_local_memory + < DriverType, MaxThreadsPerBlock, MinBlocksPerSM > + , ( shmem ? cudaFuncCachePreferShared : cudaFuncCachePreferL1 ) + ) ); + } #endif - cuda_parallel_launch_local_memory< DriverType ><<< grid , block , shmem , stream >>>( driver ); + KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE(); + + // Invoke the driver function on the device + cuda_parallel_launch_local_memory + < DriverType, MaxThreadsPerBlock, MinBlocksPerSM > + <<< grid , block , shmem , stream >>>( driver ); + +#if defined( KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ) + CUDA_SAFE_CALL( cudaGetLastError() ); + Kokkos::Cuda::fence(); +#endif + } + } +}; + +template < class DriverType > +struct CudaParallelLaunch< DriverType + , Kokkos::LaunchBounds<> + , false > +{ + inline + CudaParallelLaunch( const DriverType & driver + , const dim3 & grid + , const dim3 & block + , const int shmem + , const cudaStream_t stream = 0 ) + { + if ( grid.x && ( block.x * block.y * block.z ) ) { + + if ( sizeof( Kokkos::Impl::CudaTraits::ConstantGlobalBufferType ) < + sizeof( DriverType ) ) { + Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: Functor is too large") ); + } + + if ( CudaTraits::SharedMemoryCapacity < shmem ) { + Kokkos::Impl::throw_runtime_exception( std::string("CudaParallelLaunch FAILED: shared memory request is too large") ); + } + #ifndef KOKKOS_ARCH_KEPLER + // On Kepler the L1 has no benefit since it doesn't cache reads + else { + CUDA_SAFE_CALL( + cudaFuncSetCacheConfig + ( cuda_parallel_launch_local_memory< DriverType > + , ( shmem ? cudaFuncCachePreferShared : cudaFuncCachePreferL1 ) + ) ); + } + #endif + + KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE(); + + // Invoke the driver function on the device + cuda_parallel_launch_local_memory< DriverType > + <<< grid , block , shmem , stream >>>( driver ); #if defined( KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ) CUDA_SAFE_CALL( cudaGetLastError() ); diff --git a/lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp b/lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp index 406b4f1e22..33f77ea835 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp @@ -230,18 +230,6 @@ void CudaHostPinnedSpace::deallocate( void * const arg_alloc_ptr , const size_t } catch(...) {} } -constexpr const char* CudaSpace::name() { - return m_name; -} - -constexpr const char* CudaUVMSpace::name() { - return m_name; -} - -constexpr const char* CudaHostPinnedSpace::name() { - return m_name; -} - } // namespace Kokkos //---------------------------------------------------------------------------- @@ -378,7 +366,7 @@ SharedAllocationRecord< Kokkos::CudaSpace , void >:: if(Kokkos::Profiling::profileLibraryLoaded()) { SharedAllocationHeader header ; - Kokkos::Impl::DeepCopy::DeepCopy( & header , RecordBase::m_alloc_ptr , sizeof(SharedAllocationHeader) ); + Kokkos::Impl::DeepCopy( & header , RecordBase::m_alloc_ptr , sizeof(SharedAllocationHeader) ); Kokkos::Profiling::deallocateData( Kokkos::Profiling::SpaceHandle(Kokkos::CudaSpace::name()),header.m_label, @@ -458,7 +446,7 @@ SharedAllocationRecord( const Kokkos::CudaSpace & arg_space ); // Copy to device memory - Kokkos::Impl::DeepCopy::DeepCopy( RecordBase::m_alloc_ptr , & header , sizeof(SharedAllocationHeader) ); + Kokkos::Impl::DeepCopy( RecordBase::m_alloc_ptr , & header , sizeof(SharedAllocationHeader) ); } SharedAllocationRecord< Kokkos::CudaUVMSpace , void >:: @@ -655,18 +643,19 @@ reallocate_tracked( void * const arg_alloc_ptr SharedAllocationRecord< Kokkos::CudaSpace , void > * SharedAllocationRecord< Kokkos::CudaSpace , void >::get_record( void * alloc_ptr ) { - using Header = SharedAllocationHeader ; using RecordBase = SharedAllocationRecord< void , void > ; using RecordCuda = SharedAllocationRecord< Kokkos::CudaSpace , void > ; #if 0 + using Header = SharedAllocationHeader ; + // Copy the header from the allocation Header head ; Header const * const head_cuda = alloc_ptr ? Header::get_header( alloc_ptr ) : (Header*) 0 ; if ( alloc_ptr ) { - Kokkos::Impl::DeepCopy::DeepCopy( & head , head_cuda , sizeof(SharedAllocationHeader) ); + Kokkos::Impl::DeepCopy( & head , head_cuda , sizeof(SharedAllocationHeader) ); } RecordCuda * const record = alloc_ptr ? static_cast< RecordCuda * >( head.m_record ) : (RecordCuda *) 0 ; @@ -724,7 +713,7 @@ SharedAllocationRecord< Kokkos::CudaHostPinnedSpace , void >::get_record( void * // Iterate records to print orphaned memory ... void SharedAllocationRecord< Kokkos::CudaSpace , void >:: -print_records( std::ostream & s , const Kokkos::CudaSpace & space , bool detail ) +print_records( std::ostream & s , const Kokkos::CudaSpace & , bool detail ) { SharedAllocationRecord< void , void > * r = & s_root_record ; @@ -735,7 +724,7 @@ print_records( std::ostream & s , const Kokkos::CudaSpace & space , bool detail if ( detail ) { do { if ( r->m_alloc_ptr ) { - Kokkos::Impl::DeepCopy::DeepCopy( & head , r->m_alloc_ptr , sizeof(SharedAllocationHeader) ); + Kokkos::Impl::DeepCopy( & head , r->m_alloc_ptr , sizeof(SharedAllocationHeader) ); } else { head.m_label[0] = 0 ; @@ -762,7 +751,7 @@ print_records( std::ostream & s , const Kokkos::CudaSpace & space , bool detail , reinterpret_cast( r->m_dealloc ) , head.m_label ); - std::cout << buffer ; + s << buffer ; r = r->m_next ; } while ( r != & s_root_record ); } @@ -770,7 +759,7 @@ print_records( std::ostream & s , const Kokkos::CudaSpace & space , bool detail do { if ( r->m_alloc_ptr ) { - Kokkos::Impl::DeepCopy::DeepCopy( & head , r->m_alloc_ptr , sizeof(SharedAllocationHeader) ); + Kokkos::Impl::DeepCopy( & head , r->m_alloc_ptr , sizeof(SharedAllocationHeader) ); //Formatting dependent on sizeof(uintptr_t) const char * format_string; @@ -792,7 +781,7 @@ print_records( std::ostream & s , const Kokkos::CudaSpace & space , bool detail else { snprintf( buffer , 256 , "Cuda [ 0 + 0 ]\n" ); } - std::cout << buffer ; + s << buffer ; r = r->m_next ; } while ( r != & s_root_record ); } @@ -800,95 +789,18 @@ print_records( std::ostream & s , const Kokkos::CudaSpace & space , bool detail void SharedAllocationRecord< Kokkos::CudaUVMSpace , void >:: -print_records( std::ostream & s , const Kokkos::CudaUVMSpace & space , bool detail ) +print_records( std::ostream & s , const Kokkos::CudaUVMSpace & , bool detail ) { SharedAllocationRecord< void , void >::print_host_accessible_records( s , "CudaUVM" , & s_root_record , detail ); } void SharedAllocationRecord< Kokkos::CudaHostPinnedSpace , void >:: -print_records( std::ostream & s , const Kokkos::CudaHostPinnedSpace & space , bool detail ) +print_records( std::ostream & s , const Kokkos::CudaHostPinnedSpace & , bool detail ) { SharedAllocationRecord< void , void >::print_host_accessible_records( s , "CudaHostPinned" , & s_root_record , detail ); } -} // namespace Impl -} // namespace Kokkos - -/*--------------------------------------------------------------------------*/ -/*--------------------------------------------------------------------------*/ - -namespace Kokkos { -namespace { - __global__ void init_lock_array_kernel_atomic() { - unsigned i = blockIdx.x*blockDim.x + threadIdx.x; - - if(i>>(); - init_lock_array_kernel_scratch_threadid<<<(Kokkos::Cuda::concurrency()+255)/256,256>>>(Kokkos::Cuda::concurrency()); - } -} - void* cuda_resize_scratch_space(std::int64_t bytes, bool force_shrink) { static void* ptr = NULL; static std::int64_t current_size = 0; @@ -908,8 +820,8 @@ void* cuda_resize_scratch_space(std::int64_t bytes, bool force_shrink) { return ptr; } -} -} +} // namespace Impl +} // namespace Kokkos #else void KOKKOS_CORE_SRC_CUDA_CUDASPACE_PREVENT_LINK_ERROR() {} #endif // KOKKOS_ENABLE_CUDA diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Impl.cpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Impl.cpp index daf55cbd97..a63fb0cda4 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Impl.cpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Impl.cpp @@ -51,6 +51,7 @@ #include #include +#include #include #include @@ -69,9 +70,6 @@ __device__ __constant__ unsigned long kokkos_impl_cuda_constant_memory_buffer[ Kokkos::Impl::CudaTraits::ConstantMemoryUsage / sizeof(unsigned long) ] ; -__device__ __constant__ -Kokkos::Impl::CudaLockArraysStruct kokkos_impl_cuda_lock_arrays ; - #endif /*--------------------------------------------------------------------------*/ @@ -103,6 +101,7 @@ int cuda_kernel_arch() return arch ; } +#ifdef KOKKOS_ENABLE_CUDA_UVM bool cuda_launch_blocking() { const char * env = getenv("CUDA_LAUNCH_BLOCKING"); @@ -111,16 +110,13 @@ bool cuda_launch_blocking() return atoi(env); } +#endif } void cuda_device_synchronize() { -// static const bool launch_blocking = cuda_launch_blocking(); - -// if (!launch_blocking) { - CUDA_SAFE_CALL( cudaDeviceSynchronize() ); -// } + CUDA_SAFE_CALL( cudaDeviceSynchronize() ); } void cuda_internal_error_throw( cudaError e , const char * name, const char * file, const int line ) @@ -240,6 +236,7 @@ public: unsigned m_maxWarpCount ; unsigned m_maxBlock ; unsigned m_maxSharedWords ; + uint32_t m_maxConcurrency ; size_type m_scratchSpaceCount ; size_type m_scratchFlagsCount ; size_type m_scratchUnifiedCount ; @@ -248,6 +245,7 @@ public: size_type * m_scratchSpace ; size_type * m_scratchFlags ; size_type * m_scratchUnified ; + uint32_t * m_scratchConcurrentBitset ; cudaStream_t * m_stream ; static int was_initialized; @@ -274,6 +272,7 @@ public: , m_maxWarpCount( 0 ) , m_maxBlock( 0 ) , m_maxSharedWords( 0 ) + , m_maxConcurrency( 0 ) , m_scratchSpaceCount( 0 ) , m_scratchFlagsCount( 0 ) , m_scratchUnifiedCount( 0 ) @@ -282,6 +281,7 @@ public: , m_scratchSpace( 0 ) , m_scratchFlags( 0 ) , m_scratchUnified( 0 ) + , m_scratchConcurrentBitset( 0 ) , m_stream( 0 ) {} @@ -327,7 +327,8 @@ CudaInternal::~CudaInternal() if ( m_stream || m_scratchSpace || m_scratchFlags || - m_scratchUnified ) { + m_scratchUnified || + m_scratchConcurrentBitset ) { std::cerr << "Kokkos::Cuda ERROR: Failed to call Kokkos::Cuda::finalize()" << std::endl ; std::cerr.flush(); @@ -339,6 +340,7 @@ CudaInternal::~CudaInternal() m_maxWarpCount = 0 ; m_maxBlock = 0 ; m_maxSharedWords = 0 ; + m_maxConcurrency = 0 ; m_scratchSpaceCount = 0 ; m_scratchFlagsCount = 0 ; m_scratchUnifiedCount = 0 ; @@ -347,6 +349,7 @@ CudaInternal::~CudaInternal() m_scratchSpace = 0 ; m_scratchFlags = 0 ; m_scratchUnified = 0 ; + m_scratchConcurrentBitset = 0 ; m_stream = 0 ; } @@ -418,7 +421,7 @@ void CudaInternal::initialize( int cuda_device_id , int stream_count ) std::string msg = ss.str(); Kokkos::abort( msg.c_str() ); } - if ( compiled_major != cudaProp.major || compiled_minor != cudaProp.minor ) { + if ( Kokkos::show_warnings() && (compiled_major != cudaProp.major || compiled_minor != cudaProp.minor) ) { std::cerr << "Kokkos::Cuda::initialize WARNING: running kernels compiled for compute capability " << compiled_major << "." << compiled_minor << " on device with compute capability " @@ -464,7 +467,7 @@ void CudaInternal::initialize( int cuda_device_id , int stream_count ) m_scratchUnifiedSupported = cudaProp.unifiedAddressing ; - if ( ! m_scratchUnifiedSupported ) { + if ( Kokkos::show_warnings() && ! m_scratchUnifiedSupported ) { std::cout << "Kokkos::Cuda device " << cudaProp.name << " capability " << cudaProp.major << "." << cudaProp.minor @@ -485,6 +488,33 @@ void CudaInternal::initialize( int cuda_device_id , int stream_count ) (void) scratch_space( reduce_block_count * 16 * sizeof(size_type) ); } //---------------------------------- + // Concurrent bitset for obtaining unique tokens from within + // an executing kernel. + { + const unsigned max_threads_per_sm = 2048 ; // up to capability 7.0 + + m_maxConcurrency = + max_threads_per_sm * cudaProp.multiProcessorCount ; + + const int32_t buffer_bound = + Kokkos::Impl::concurrent_bitset::buffer_bound( m_maxConcurrency ); + + // Allocate and initialize uint32_t[ buffer_bound ] + + typedef Kokkos::Experimental::Impl::SharedAllocationRecord< Kokkos::CudaSpace , void > Record ; + + Record * const r = Record::allocate( Kokkos::CudaSpace() + , "InternalScratchBitset" + , sizeof(uint32_t) * buffer_bound ); + + Record::increment( r ); + + m_scratchConcurrentBitset = reinterpret_cast( r->data() ); + + CUDA_SAFE_CALL( cudaMemset( m_scratchConcurrentBitset , 0 , sizeof(uint32_t) * buffer_bound ) ); + + } + //---------------------------------- if ( stream_count ) { m_stream = (cudaStream_t*) ::malloc( stream_count * sizeof(cudaStream_t) ); @@ -515,7 +545,7 @@ void CudaInternal::initialize( int cuda_device_id , int stream_count ) } #ifdef KOKKOS_ENABLE_CUDA_UVM - if(!cuda_launch_blocking()) { + if( Kokkos::show_warnings() && !cuda_launch_blocking() ) { std::cout << "Kokkos::Cuda::initialize WARNING: Cuda is allocating into UVMSpace by default" << std::endl; std::cout << " without setting CUDA_LAUNCH_BLOCKING=1." << std::endl; std::cout << " The code must call Cuda::fence() after each kernel" << std::endl; @@ -531,7 +561,7 @@ void CudaInternal::initialize( int cuda_device_id , int stream_count ) bool visible_devices_one=true; if (env_visible_devices == 0) visible_devices_one=false; - if(!visible_devices_one && !force_device_alloc) { + if( Kokkos::show_warnings() && (!visible_devices_one && !force_device_alloc) ) { std::cout << "Kokkos::Cuda::initialize WARNING: Cuda is allocating into UVMSpace by default" << std::endl; std::cout << " without setting CUDA_MANAGED_FORCE_DEVICE_ALLOC=1 or " << std::endl; std::cout << " setting CUDA_VISIBLE_DEVICES." << std::endl; @@ -543,16 +573,7 @@ void CudaInternal::initialize( int cuda_device_id , int stream_count ) cudaThreadSetCacheConfig(cudaFuncCachePreferShared); // Init the array for used for arbitrarily sized atomics - Impl::init_lock_arrays_cuda_space(); - - #ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE - Kokkos::Impl::CudaLockArraysStruct locks; - locks.atomic = atomic_lock_array_cuda_space_ptr(false); - locks.scratch = scratch_lock_array_cuda_space_ptr(false); - locks.threadid = threadid_lock_array_cuda_space_ptr(false); - locks.n = Kokkos::Cuda::concurrency(); - cudaMemcpyToSymbol( kokkos_impl_cuda_lock_arrays , & locks , sizeof(CudaLockArraysStruct) ); - #endif + Impl::initialize_host_cuda_lock_arrays(); } //---------------------------------------------------------------------------- @@ -635,9 +656,7 @@ void CudaInternal::finalize() was_finalized = 1; if ( 0 != m_scratchSpace || 0 != m_scratchFlags ) { - atomic_lock_array_cuda_space_ptr(true); - scratch_lock_array_cuda_space_ptr(true); - threadid_lock_array_cuda_space_ptr(true); + Impl::finalize_host_cuda_lock_arrays(); if ( m_stream ) { for ( size_type i = 1 ; i < m_streamCount ; ++i ) { @@ -653,6 +672,7 @@ void CudaInternal::finalize() RecordCuda::decrement( RecordCuda::get_record( m_scratchFlags ) ); RecordCuda::decrement( RecordCuda::get_record( m_scratchSpace ) ); RecordHost::decrement( RecordHost::get_record( m_scratchUnified ) ); + RecordCuda::decrement( RecordCuda::get_record( m_scratchConcurrentBitset ) ); m_cudaDev = -1 ; m_multiProcCount = 0 ; @@ -666,6 +686,7 @@ void CudaInternal::finalize() m_scratchSpace = 0 ; m_scratchFlags = 0 ; m_scratchUnified = 0 ; + m_scratchConcurrentBitset = 0 ; m_stream = 0 ; } } @@ -713,9 +734,8 @@ namespace Kokkos { Cuda::size_type Cuda::detect_device_count() { return Impl::CudaInternalDevices::singleton().m_cudaDevCount ; } -int Cuda::concurrency() { - return 131072; -} +int Cuda::concurrency() +{ return Impl::CudaInternal::singleton().m_maxConcurrency ; } int Cuda::is_initialized() { return Impl::CudaInternal::singleton().is_initialized(); } @@ -798,7 +818,22 @@ void Cuda::fence() const char* Cuda::name() { return "Cuda"; } } // namespace Kokkos + +namespace Kokkos { +namespace Experimental { + +UniqueToken< Kokkos::Cuda , Kokkos::Experimental::UniqueTokenScope::Global >:: +UniqueToken( Kokkos::Cuda const & ) + : m_buffer( Kokkos::Impl::CudaInternal::singleton().m_scratchConcurrentBitset ) + , m_count( Kokkos::Impl::CudaInternal::singleton().m_maxConcurrency ) + {} + +} // namespace Experimental +} // namespace Kokkos + #else + void KOKKOS_CORE_SRC_CUDA_IMPL_PREVENT_LINK_ERROR() {} + #endif // KOKKOS_ENABLE_CUDA diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp new file mode 100644 index 0000000000..237022ad23 --- /dev/null +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp @@ -0,0 +1,119 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#ifdef KOKKOS_ENABLE_CUDA + +#include +#include +#include + +#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE +namespace Kokkos { +namespace Impl { +__device__ __constant__ +CudaLockArrays g_device_cuda_lock_arrays = { nullptr, nullptr, 0 }; +} +} +#endif + +namespace Kokkos { + +namespace { + +__global__ void init_lock_array_kernel_atomic() { + unsigned i = blockIdx.x*blockDim.x + threadIdx.x; + if(i>>(); + init_lock_array_kernel_threadid<<<(Kokkos::Cuda::concurrency()+255)/256,256>>>(Kokkos::Cuda::concurrency()); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); +} + +void finalize_host_cuda_lock_arrays() { + if (g_host_cuda_lock_arrays.atomic == nullptr) return; + cudaFree(g_host_cuda_lock_arrays.atomic); + g_host_cuda_lock_arrays.atomic = nullptr; + cudaFree(g_host_cuda_lock_arrays.scratch); + g_host_cuda_lock_arrays.scratch = nullptr; + g_host_cuda_lock_arrays.n = 0; +#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE + KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE(); +#endif +} + +} // namespace Impl + +} // namespace Kokkos + +#else + +void KOKKOS_CORE_SRC_CUDA_CUDA_LOCKS_PREVENT_LINK_ERROR() {} + +#endif diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp new file mode 100644 index 0000000000..d01f06fb4f --- /dev/null +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp @@ -0,0 +1,166 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_CUDA_LOCKS_HPP +#define KOKKOS_CUDA_LOCKS_HPP + +#include + +#ifdef KOKKOS_ENABLE_CUDA + +#include + +#include + +namespace Kokkos { +namespace Impl { + +struct CudaLockArrays { + std::int32_t* atomic; + std::int32_t* scratch; + std::int32_t n; +}; + +/// \brief This global variable in Host space is the central definition +/// of these arrays. +extern Kokkos::Impl::CudaLockArrays g_host_cuda_lock_arrays ; + +/// \brief After this call, the g_host_cuda_lock_arrays variable has +/// valid, initialized arrays. +/// +/// This call is idempotent. +void initialize_host_cuda_lock_arrays(); + +/// \brief After this call, the g_host_cuda_lock_arrays variable has +/// all null pointers, and all array memory has been freed. +/// +/// This call is idempotent. +void finalize_host_cuda_lock_arrays(); + +} // namespace Impl +} // namespace Kokkos + +#if defined( __CUDACC__ ) + +namespace Kokkos { +namespace Impl { + +/// \brief This global variable in CUDA space is what kernels use +/// to get access to the lock arrays. +/// +/// When relocatable device code is enabled, there can be one single +/// instance of this global variable for the entire executable, +/// whose definition will be in Kokkos_Cuda_Locks.cpp (and whose declaration +/// here must then be extern. +/// This one instance will be initialized by initialize_host_cuda_lock_arrays +/// and need not be modified afterwards. +/// +/// When relocatable device code is disabled, an instance of this variable +/// will be created in every translation unit that sees this header file +/// (we make this clear by marking it static, meaning no other translation +/// unit can link to it). +/// Since the Kokkos_Cuda_Locks.cpp translation unit cannot initialize the +/// instances in other translation units, we must update this CUDA global +/// variable based on the Host global variable prior to running any kernels +/// that will use it. +/// That is the purpose of the KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE macro. +__device__ __constant__ +#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE +extern +#endif +Kokkos::Impl::CudaLockArrays g_device_cuda_lock_arrays ; + +#define CUDA_SPACE_ATOMIC_MASK 0x1FFFF + +/// \brief Aquire a lock for the address +/// +/// This function tries to aquire the lock for the hash value derived +/// from the provided ptr. If the lock is successfully aquired the +/// function returns true. Otherwise it returns false. +__device__ inline +bool lock_address_cuda_space(void* ptr) { + size_t offset = size_t(ptr); + offset = offset >> 2; + offset = offset & CUDA_SPACE_ATOMIC_MASK; + return (0 == atomicCAS(&Kokkos::Impl::g_device_cuda_lock_arrays.atomic[offset],0,1)); +} + +/// \brief Release lock for the address +/// +/// This function releases the lock for the hash value derived +/// from the provided ptr. This function should only be called +/// after previously successfully aquiring a lock with +/// lock_address. +__device__ inline +void unlock_address_cuda_space(void* ptr) { + size_t offset = size_t(ptr); + offset = offset >> 2; + offset = offset & CUDA_SPACE_ATOMIC_MASK; + atomicExch( &Kokkos::Impl::g_device_cuda_lock_arrays.atomic[ offset ], 0); +} + +} // namespace Impl +} // namespace Kokkos + +/* Dan Ibanez: it is critical that this code be a macro, so that it will + capture the right address for Kokkos::Impl::g_device_cuda_lock_arrays! + putting this in an inline function will NOT do the right thing! */ +#define KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE() \ +{ \ + CUDA_SAFE_CALL(cudaMemcpyToSymbol( \ + Kokkos::Impl::g_device_cuda_lock_arrays , \ + & Kokkos::Impl::g_host_cuda_lock_arrays , \ + sizeof(Kokkos::Impl::CudaLockArrays) ) ); \ +} + +#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE +#define KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE() +#else +#define KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE() KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE() +#endif + +#endif /* defined( __CUDACC__ ) */ + +#endif /* defined( KOKKOS_ENABLE_CUDA ) */ + +#endif /* #ifndef KOKKOS_CUDA_LOCKS_HPP */ diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp index 0c8c700e8f..5fd442ffc9 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp @@ -58,6 +58,7 @@ #include #include #include +#include #include #if defined(KOKKOS_ENABLE_PROFILING) @@ -65,6 +66,8 @@ #include #endif +#include + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -318,6 +321,7 @@ private: typedef Kokkos::RangePolicy< Traits ... > Policy; typedef typename Policy::member_type Member ; typedef typename Policy::work_tag WorkTag ; + typedef typename Policy::launch_bounds LaunchBounds ; const FunctorType m_functor ; const Policy m_policy ; @@ -363,7 +367,7 @@ public: const dim3 block( 1 , CudaTraits::WarpSize * cuda_internal_maximum_warp_count(), 1); const dim3 grid( std::min( ( nwork + block.y - 1 ) / block.y , cuda_internal_maximum_grid_count() ) , 1 , 1); - CudaParallelLaunch< ParallelFor >( *this , grid , block , 0 ); + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this , grid , block , 0 ); } ParallelFor( const FunctorType & arg_functor , @@ -373,6 +377,115 @@ public: { } }; + +// MDRangePolicy impl +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType + , Kokkos::MDRangePolicy< Traits ... > + , Kokkos::Cuda + > +{ +private: + typedef Kokkos::MDRangePolicy< Traits ... > Policy ; + using RP = Policy; + typedef typename Policy::array_index_type array_index_type; + typedef typename Policy::index_type index_type; + typedef typename Policy::launch_bounds LaunchBounds; + + + const FunctorType m_functor ; + const Policy m_rp ; + +public: + + inline + __device__ + void operator()(void) const + { + Kokkos::Impl::Refactor::DeviceIterateTile(m_rp,m_functor).exec_range(); + } + + + inline + void execute() const + { + const array_index_type maxblocks = static_cast(Kokkos::Impl::CudaTraits::UpperBoundGridCount); + if ( RP::rank == 2 ) + { + const dim3 block( m_rp.m_tile[0] , m_rp.m_tile[1] , 1); + const dim3 grid( + std::min( ( m_rp.m_upper[0] - m_rp.m_lower[0] + block.x - 1 ) / block.x , maxblocks ) + , std::min( ( m_rp.m_upper[1] - m_rp.m_lower[1] + block.y - 1 ) / block.y , maxblocks ) + , 1 + ); + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this , grid , block , 0 ); + } + else if ( RP::rank == 3 ) + { + const dim3 block( m_rp.m_tile[0] , m_rp.m_tile[1] , m_rp.m_tile[2] ); + const dim3 grid( + std::min( ( m_rp.m_upper[0] - m_rp.m_lower[0] + block.x - 1 ) / block.x , maxblocks ) + , std::min( ( m_rp.m_upper[1] - m_rp.m_lower[1] + block.y - 1 ) / block.y , maxblocks ) + , std::min( ( m_rp.m_upper[2] - m_rp.m_lower[2] + block.z - 1 ) / block.z , maxblocks ) + ); + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this , grid , block , 0 ); + } + else if ( RP::rank == 4 ) + { + // id0,id1 encoded within threadIdx.x; id2 to threadIdx.y; id3 to threadIdx.z + const dim3 block( m_rp.m_tile[0]*m_rp.m_tile[1] , m_rp.m_tile[2] , m_rp.m_tile[3] ); + const dim3 grid( + std::min( static_cast( m_rp.m_tile_end[0] * m_rp.m_tile_end[1] ) + , static_cast(maxblocks) ) + , std::min( ( m_rp.m_upper[2] - m_rp.m_lower[2] + block.y - 1 ) / block.y , maxblocks ) + , std::min( ( m_rp.m_upper[3] - m_rp.m_lower[3] + block.z - 1 ) / block.z , maxblocks ) + ); + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this , grid , block , 0 ); + } + else if ( RP::rank == 5 ) + { + // id0,id1 encoded within threadIdx.x; id2,id3 to threadIdx.y; id4 to threadIdx.z + const dim3 block( m_rp.m_tile[0]*m_rp.m_tile[1] , m_rp.m_tile[2]*m_rp.m_tile[3] , m_rp.m_tile[4] ); + const dim3 grid( + std::min( static_cast( m_rp.m_tile_end[0] * m_rp.m_tile_end[1] ) + , static_cast(maxblocks) ) + , std::min( static_cast( m_rp.m_tile_end[2] * m_rp.m_tile_end[3] ) + , static_cast(maxblocks) ) + , std::min( ( m_rp.m_upper[4] - m_rp.m_lower[4] + block.z - 1 ) / block.z , maxblocks ) + ); + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this , grid , block , 0 ); + } + else if ( RP::rank == 6 ) + { + // id0,id1 encoded within threadIdx.x; id2,id3 to threadIdx.y; id4,id5 to threadIdx.z + const dim3 block( m_rp.m_tile[0]*m_rp.m_tile[1] , m_rp.m_tile[2]*m_rp.m_tile[3] , m_rp.m_tile[4]*m_rp.m_tile[5] ); + const dim3 grid( + std::min( static_cast( m_rp.m_tile_end[0] * m_rp.m_tile_end[1] ) + , static_cast(maxblocks) ) + , std::min( static_cast( m_rp.m_tile_end[2] * m_rp.m_tile_end[3] ) + , static_cast(maxblocks) ) + , std::min( static_cast( m_rp.m_tile_end[4] * m_rp.m_tile_end[5] ) + , static_cast(maxblocks) ) + ); + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this , grid , block , 0 ); + } + else + { + printf("Kokkos::MDRange Error: Exceeded rank bounds with Cuda\n"); + Kokkos::abort("Aborting"); + } + + } //end execute + +// inline + ParallelFor( const FunctorType & arg_functor + , Policy arg_policy ) + : m_functor( arg_functor ) + , m_rp( arg_policy ) + {} +}; + + template< class FunctorType , class ... Properties > class ParallelFor< FunctorType , Kokkos::TeamPolicy< Properties ... > @@ -384,6 +497,7 @@ private: typedef TeamPolicyInternal< Kokkos::Cuda , Properties ... > Policy ; typedef typename Policy::member_type Member ; typedef typename Policy::work_tag WorkTag ; + typedef typename Policy::launch_bounds LaunchBounds ; public: @@ -430,15 +544,15 @@ public: if ( m_scratch_size[1]>0 ) { __shared__ int base_thread_id; if (threadIdx.x==0 && threadIdx.y==0 ) { - threadid = ((blockIdx.x*blockDim.z + threadIdx.z) * blockDim.x * blockDim.y) % kokkos_impl_cuda_lock_arrays.n; + threadid = ((blockIdx.x*blockDim.z + threadIdx.z) * blockDim.x * blockDim.y) % Kokkos::Impl::g_device_cuda_lock_arrays.n; threadid = ((threadid + blockDim.x * blockDim.y-1)/(blockDim.x * blockDim.y)) * blockDim.x * blockDim.y; - if(threadid > kokkos_impl_cuda_lock_arrays.n) threadid-=blockDim.x * blockDim.y; + if(threadid > Kokkos::Impl::g_device_cuda_lock_arrays.n) threadid-=blockDim.x * blockDim.y; int done = 0; while (!done) { - done = (0 == atomicCAS(&kokkos_impl_cuda_lock_arrays.atomic[threadid],0,1)); + done = (0 == atomicCAS(&Kokkos::Impl::g_device_cuda_lock_arrays.scratch[threadid],0,1)); if(!done) { threadid += blockDim.x * blockDim.y; - if(threadid > kokkos_impl_cuda_lock_arrays.n) threadid = 0; + if(threadid > Kokkos::Impl::g_device_cuda_lock_arrays.n) threadid = 0; } } base_thread_id = threadid; @@ -448,7 +562,8 @@ public: } - for ( int league_rank = blockIdx.x ; league_rank < m_league_size ; league_rank += gridDim.x ) { + const int int_league_size = (int)m_league_size; + for ( int league_rank = blockIdx.x ; league_rank < int_league_size ; league_rank += gridDim.x ) { this-> template exec_team< WorkTag >( typename Policy::member_type( kokkos_impl_cuda_shared_memory() @@ -462,7 +577,7 @@ public: if ( m_scratch_size[1]>0 ) { __syncthreads(); if (threadIdx.x==0 && threadIdx.y==0 ) - kokkos_impl_cuda_lock_arrays.atomic[threadid]=0; + Kokkos::Impl::g_device_cuda_lock_arrays.scratch[threadid]=0; } } @@ -473,7 +588,7 @@ public: const dim3 grid( int(m_league_size) , 1 , 1 ); const dim3 block( int(m_vector_size) , int(m_team_size) , 1 ); - CudaParallelLaunch< ParallelFor >( *this, grid, block, shmem_size_total ); // copy to device and execute + CudaParallelLaunch< ParallelFor, LaunchBounds >( *this, grid, block, shmem_size_total ); // copy to device and execute } @@ -529,13 +644,15 @@ private: typedef typename Policy::WorkRange WorkRange ; typedef typename Policy::work_tag WorkTag ; typedef typename Policy::member_type Member ; + typedef typename Policy::launch_bounds LaunchBounds ; typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; - typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTag > ValueJoin ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTagFwd > ValueJoin ; public: @@ -563,6 +680,7 @@ private: typedef int DummySHMEMReductionType; public: + // Make the exec_range calls call to Reduce::DeviceIterateTile template< class TagType > __device__ inline typename std::enable_if< std::is_same< TagType , void >::value >::type @@ -604,7 +722,7 @@ public: } // Reduce with final value at blockDim.y - 1 location. - if ( cuda_single_inter_block_reduce_scan( + if ( cuda_single_inter_block_reduce_scan( ReducerConditional::select(m_functor , m_reducer) , blockIdx.x , gridDim.x , kokkos_impl_cuda_shared_memory() , m_scratch_space , m_scratch_flags ) ) { @@ -614,7 +732,7 @@ public: size_type * const global = m_unified_space ? m_unified_space : m_scratch_space ; if ( threadIdx.y == 0 ) { - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , shared ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , shared ); } if ( CudaTraits::WarpSize < word_count.value ) { __syncthreads(); } @@ -649,11 +767,11 @@ public: value_type init; ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , &init); - if(Impl::cuda_inter_block_reduction + if(Impl::cuda_inter_block_reduction (value,init,ValueJoin(ReducerConditional::select(m_functor , m_reducer)),m_scratch_space,result,m_scratch_flags,max_active_thread)) { const unsigned id = threadIdx.y*blockDim.x + threadIdx.x; if(id==0) { - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , (void*) &value ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , (void*) &value ); *result = value; } } @@ -686,7 +804,7 @@ public: const int shmem = UseShflReduction?0:cuda_single_inter_block_reduce_scan_shmem( m_functor , block.y ); - CudaParallelLaunch< ParallelReduce >( *this, grid, block, shmem ); // copy to device and execute + CudaParallelLaunch< ParallelReduce, LaunchBounds >( *this, grid, block, shmem ); // copy to device and execute Cuda::fence(); @@ -737,6 +855,233 @@ public: { } }; + +// MDRangePolicy impl +template< class FunctorType , class ReducerType, class ... Traits > +class ParallelReduce< FunctorType + , Kokkos::MDRangePolicy< Traits ... > + , ReducerType + , Kokkos::Cuda + > +{ +private: + + typedef Kokkos::MDRangePolicy< Traits ... > Policy ; + typedef typename Policy::array_index_type array_index_type; + typedef typename Policy::index_type index_type; + + typedef typename Policy::work_tag WorkTag ; + typedef typename Policy::member_type Member ; + typedef typename Policy::launch_bounds LaunchBounds; + + typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; + + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTagFwd > ValueJoin ; + +public: + + typedef typename ValueTraits::pointer_type pointer_type ; + typedef typename ValueTraits::value_type value_type ; + typedef typename ValueTraits::reference_type reference_type ; + typedef FunctorType functor_type ; + typedef Cuda::size_type size_type ; + + // Algorithmic constraints: blockSize is a power of two AND blockDim.y == blockDim.z == 1 + + const FunctorType m_functor ; + const Policy m_policy ; // used for workrange and nwork + const ReducerType m_reducer ; + const pointer_type m_result_ptr ; + size_type * m_scratch_space ; + size_type * m_scratch_flags ; + size_type * m_unified_space ; + + typedef typename Kokkos::Impl::Reduce::DeviceIterateTile DeviceIteratePattern; + + // Shall we use the shfl based reduction or not (only use it for static sized types of more than 128bit + enum { UseShflReduction = ((sizeof(value_type)>2*sizeof(double)) && ValueTraits::StaticValueSize) }; + // Some crutch to do function overloading +private: + typedef double DummyShflReductionType; + typedef int DummySHMEMReductionType; + +public: + inline + __device__ + void + exec_range( reference_type update ) const + { + Kokkos::Impl::Reduce::DeviceIterateTile(m_policy, m_functor, update).exec_range(); + } + + inline + __device__ + void operator() (void) const { + run(Kokkos::Impl::if_c::select(1,1.0) ); + } + + __device__ inline + void run(const DummySHMEMReductionType& ) const + { + const integral_nonzero_constant< size_type , ValueTraits::StaticValueSize / sizeof(size_type) > + word_count( ValueTraits::value_size( ReducerConditional::select(m_functor , m_reducer) ) / sizeof(size_type) ); + + { + reference_type value = + ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , kokkos_impl_cuda_shared_memory() + threadIdx.y * word_count.value ); + + // Number of blocks is bounded so that the reduction can be limited to two passes. + // Each thread block is given an approximately equal amount of work to perform. + // Accumulate the values for this block. + // The accumulation ordering does not match the final pass, but is arithmatically equivalent. + + this-> exec_range( value ); + } + + // Reduce with final value at blockDim.y - 1 location. + // Problem: non power-of-two blockDim + if ( cuda_single_inter_block_reduce_scan( + ReducerConditional::select(m_functor , m_reducer) , blockIdx.x , gridDim.x , + kokkos_impl_cuda_shared_memory() , m_scratch_space , m_scratch_flags ) ) { + + // This is the final block with the final result at the final threads' location + size_type * const shared = kokkos_impl_cuda_shared_memory() + ( blockDim.y - 1 ) * word_count.value ; + size_type * const global = m_unified_space ? m_unified_space : m_scratch_space ; + + if ( threadIdx.y == 0 ) { + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , shared ); + } + + if ( CudaTraits::WarpSize < word_count.value ) { __syncthreads(); } + + for ( unsigned i = threadIdx.y ; i < word_count.value ; i += blockDim.y ) { global[i] = shared[i]; } + } + } + + __device__ inline + void run(const DummyShflReductionType&) const + { + + value_type value; + ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , &value); + // Number of blocks is bounded so that the reduction can be limited to two passes. + // Each thread block is given an approximately equal amount of work to perform. + // Accumulate the values for this block. + // The accumulation ordering does not match the final pass, but is arithmatically equivalent. + + const Member work_part = + ( ( m_policy.m_num_tiles + ( gridDim.x - 1 ) ) / gridDim.x ); //portion of tiles handled by each block + + this-> exec_range( value ); + + pointer_type const result = (pointer_type) (m_unified_space ? m_unified_space : m_scratch_space) ; + + int max_active_thread = work_part < blockDim.y ? work_part:blockDim.y; + max_active_thread = (max_active_thread == 0)?blockDim.y:max_active_thread; + + value_type init; + ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , &init); + if(Impl::cuda_inter_block_reduction + (value,init,ValueJoin(ReducerConditional::select(m_functor , m_reducer)),m_scratch_space,result,m_scratch_flags,max_active_thread)) { + const unsigned id = threadIdx.y*blockDim.x + threadIdx.x; + if(id==0) { + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , (void*) &value ); + *result = value; + } + } + } + + // Determine block size constrained by shared memory: + static inline + unsigned local_block_size( const FunctorType & f ) + { + unsigned n = CudaTraits::WarpSize * 8 ; + while ( n && CudaTraits::SharedMemoryCapacity < cuda_single_inter_block_reduce_scan_shmem( f , n ) ) { n >>= 1 ; } + return n ; + } + + inline + void execute() + { + const int nwork = m_policy.m_num_tiles; + if ( nwork ) { + int block_size = m_policy.m_prod_tile_dims; + // CONSTRAINT: Algorithm requires block_size >= product of tile dimensions + // Nearest power of two + int exponent_pow_two = std::ceil( std::log2(block_size) ); + block_size = std::pow(2, exponent_pow_two); + int suggested_blocksize = local_block_size( m_functor ); + + block_size = (block_size > suggested_blocksize) ? block_size : suggested_blocksize ; //Note: block_size must be less than or equal to 512 + + + m_scratch_space = cuda_internal_scratch_space( ValueTraits::value_size( ReducerConditional::select(m_functor , m_reducer) ) * block_size /* block_size == max block_count */ ); + m_scratch_flags = cuda_internal_scratch_flags( sizeof(size_type) ); + m_unified_space = cuda_internal_scratch_unified( ValueTraits::value_size( ReducerConditional::select(m_functor , m_reducer) ) ); + + // REQUIRED ( 1 , N , 1 ) + const dim3 block( 1 , block_size , 1 ); + // Required grid.x <= block.y + const dim3 grid( std::min( int(block.y) , int( nwork ) ) , 1 , 1 ); + + const int shmem = UseShflReduction?0:cuda_single_inter_block_reduce_scan_shmem( m_functor , block.y ); + + CudaParallelLaunch< ParallelReduce, LaunchBounds >( *this, grid, block, shmem ); // copy to device and execute + + Cuda::fence(); + + if ( m_result_ptr ) { + if ( m_unified_space ) { + const int count = ValueTraits::value_count( ReducerConditional::select(m_functor , m_reducer) ); + for ( int i = 0 ; i < count ; ++i ) { m_result_ptr[i] = pointer_type(m_unified_space)[i] ; } + } + else { + const int size = ValueTraits::value_size( ReducerConditional::select(m_functor , m_reducer) ); + DeepCopy( m_result_ptr , m_scratch_space , size ); + } + } + } + else { + if (m_result_ptr) { + ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , m_result_ptr ); + } + } + } + + template< class HostViewType > + ParallelReduce( const FunctorType & arg_functor + , const Policy & arg_policy + , const HostViewType & arg_result + , typename std::enable_if< + Kokkos::is_view< HostViewType >::value + ,void*>::type = NULL) + : m_functor( arg_functor ) + , m_policy( arg_policy ) + , m_reducer( InvalidType() ) + , m_result_ptr( arg_result.ptr_on_device() ) + , m_scratch_space( 0 ) + , m_scratch_flags( 0 ) + , m_unified_space( 0 ) + {} + + ParallelReduce( const FunctorType & arg_functor + , const Policy & arg_policy + , const ReducerType & reducer) + : m_functor( arg_functor ) + , m_policy( arg_policy ) + , m_reducer( reducer ) + , m_result_ptr( reducer.view().ptr_on_device() ) + , m_scratch_space( 0 ) + , m_scratch_flags( 0 ) + , m_unified_space( 0 ) + {} +}; + + //---------------------------------------------------------------------------- #if 1 @@ -753,13 +1098,15 @@ private: typedef TeamPolicyInternal< Kokkos::Cuda, Properties ... > Policy ; typedef typename Policy::member_type Member ; typedef typename Policy::work_tag WorkTag ; + typedef typename Policy::launch_bounds LaunchBounds ; typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; - typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTag > ValueJoin ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTagFwd > ValueJoin ; typedef typename ValueTraits::pointer_type pointer_type ; typedef typename ValueTraits::reference_type reference_type ; @@ -819,15 +1166,15 @@ public: if ( m_scratch_size[1]>0 ) { __shared__ int base_thread_id; if (threadIdx.x==0 && threadIdx.y==0 ) { - threadid = ((blockIdx.x*blockDim.z + threadIdx.z) * blockDim.x * blockDim.y) % kokkos_impl_cuda_lock_arrays.n; + threadid = ((blockIdx.x*blockDim.z + threadIdx.z) * blockDim.x * blockDim.y) % Kokkos::Impl::g_device_cuda_lock_arrays.n; threadid = ((threadid + blockDim.x * blockDim.y-1)/(blockDim.x * blockDim.y)) * blockDim.x * blockDim.y; - if(threadid > kokkos_impl_cuda_lock_arrays.n) threadid-=blockDim.x * blockDim.y; + if(threadid > Kokkos::Impl::g_device_cuda_lock_arrays.n) threadid-=blockDim.x * blockDim.y; int done = 0; while (!done) { - done = (0 == atomicCAS(&kokkos_impl_cuda_lock_arrays.atomic[threadid],0,1)); + done = (0 == atomicCAS(&Kokkos::Impl::g_device_cuda_lock_arrays.scratch[threadid],0,1)); if(!done) { threadid += blockDim.x * blockDim.y; - if(threadid > kokkos_impl_cuda_lock_arrays.n) threadid = 0; + if(threadid > Kokkos::Impl::g_device_cuda_lock_arrays.n) threadid = 0; } } base_thread_id = threadid; @@ -840,7 +1187,7 @@ public: if ( m_scratch_size[1]>0 ) { __syncthreads(); if (threadIdx.x==0 && threadIdx.y==0 ) - kokkos_impl_cuda_lock_arrays.atomic[threadid]=0; + Kokkos::Impl::g_device_cuda_lock_arrays.scratch[threadid]=0; } } @@ -854,7 +1201,8 @@ public: ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , kokkos_impl_cuda_shared_memory() + threadIdx.y * word_count.value ); // Iterate this block through the league - for ( int league_rank = blockIdx.x ; league_rank < m_league_size ; league_rank += gridDim.x ) { + const int int_league_size = (int)m_league_size; + for ( int league_rank = blockIdx.x ; league_rank < int_league_size ; league_rank += gridDim.x ) { this-> template exec_team< WorkTag > ( Member( kokkos_impl_cuda_shared_memory() + m_team_begin , m_shmem_begin @@ -877,7 +1225,7 @@ public: size_type * const global = m_unified_space ? m_unified_space : m_scratch_space ; if ( threadIdx.y == 0 ) { - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , shared ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , shared ); } if ( CudaTraits::WarpSize < word_count.value ) { __syncthreads(); } @@ -894,7 +1242,8 @@ public: ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , &value); // Iterate this block through the league - for ( int league_rank = blockIdx.x ; league_rank < m_league_size ; league_rank += gridDim.x ) { + const int int_league_size = (int)m_league_size; + for ( int league_rank = blockIdx.x ; league_rank < int_league_size ; league_rank += gridDim.x ) { this-> template exec_team< WorkTag > ( Member( kokkos_impl_cuda_shared_memory() + m_team_begin , m_shmem_begin @@ -914,7 +1263,7 @@ public: (value,init,ValueJoin(ReducerConditional::select(m_functor , m_reducer)),m_scratch_space,result,m_scratch_flags,blockDim.y)) { const unsigned id = threadIdx.y*blockDim.x + threadIdx.x; if(id==0) { - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , (void*) &value ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , (void*) &value ); *result = value; } } @@ -936,7 +1285,7 @@ public: const dim3 grid( block_count , 1 , 1 ); const int shmem_size_total = m_team_begin + m_shmem_begin + m_shmem_size ; - CudaParallelLaunch< ParallelReduce >( *this, grid, block, shmem_size_total ); // copy to device and execute + CudaParallelLaunch< ParallelReduce, LaunchBounds >( *this, grid, block, shmem_size_total ); // copy to device and execute Cuda::fence(); @@ -975,12 +1324,6 @@ public: , m_shmem_begin( 0 ) , m_shmem_size( 0 ) , m_scratch_ptr{NULL,NULL} - , m_league_size( arg_policy.league_size() ) - , m_team_size( 0 <= arg_policy.team_size() ? arg_policy.team_size() : - Kokkos::Impl::cuda_get_opt_block_size< ParallelReduce >( arg_functor , arg_policy.vector_length(), - arg_policy.team_scratch_size(0),arg_policy.thread_scratch_size(0) ) / - arg_policy.vector_length() ) - , m_vector_size( arg_policy.vector_length() ) , m_scratch_size{ arg_policy.scratch_size(0,( 0 <= arg_policy.team_size() ? arg_policy.team_size() : Kokkos::Impl::cuda_get_opt_block_size< ParallelReduce >( arg_functor , arg_policy.vector_length(), @@ -991,6 +1334,12 @@ public: arg_policy.team_scratch_size(0),arg_policy.thread_scratch_size(0) ) / arg_policy.vector_length() ) )} + , m_league_size( arg_policy.league_size() ) + , m_team_size( 0 <= arg_policy.team_size() ? arg_policy.team_size() : + Kokkos::Impl::cuda_get_opt_block_size< ParallelReduce >( arg_functor , arg_policy.vector_length(), + arg_policy.team_scratch_size(0),arg_policy.thread_scratch_size(0) ) / + arg_policy.vector_length() ) + , m_vector_size( arg_policy.vector_length() ) { // Return Init value if the number of worksets is zero if( arg_policy.league_size() == 0) { @@ -1150,6 +1499,7 @@ private: typedef typename reducer_type<>::pointer_type pointer_type ; typedef typename reducer_type<>::reference_type reference_type ; typedef typename reducer_type<>::value_type value_type ; + typedef typename Policy::launch_bounds LaunchBounds ; typedef Kokkos::Impl::FunctorAnalysis < Kokkos::Impl::FunctorPatternInterface::REDUCE @@ -1273,7 +1623,7 @@ public: const int shmem = m_shmem_team_begin + m_shmem_team_size ; // copy to device and execute - CudaParallelLaunch( *this, grid, block, shmem ); + CudaParallelLaunch( *this, grid, block, shmem ); Cuda::fence(); @@ -1373,7 +1723,7 @@ public: if ( CudaTraits::WarpSize < team_threads ) { // Need inter-warp team reduction (collectives) shared memory - // Speculate an upper bound for the value size + // Speculate an upper bound for the value size m_shmem_team_begin = align_scratch( CudaTraits::warp_count(team_threads) * sizeof(double) ); @@ -1426,7 +1776,7 @@ public: // Reduce space has claim flag followed by vaue buffer const int global_reduce_value_size = - max_concurrent_block * + max_concurrent_block * ( aligned_flag_size + align_scratch( value_size ) ); // Scratch space has claim flag followed by scratch buffer @@ -1469,6 +1819,7 @@ private: typedef typename Policy::member_type Member ; typedef typename Policy::work_tag WorkTag ; typedef typename Policy::WorkRange WorkRange ; + typedef typename Policy::launch_bounds LaunchBounds ; typedef Kokkos::Impl::FunctorValueTraits< FunctorType, WorkTag > ValueTraits ; typedef Kokkos::Impl::FunctorValueInit< FunctorType, WorkTag > ValueInit ; @@ -1655,10 +2006,10 @@ public: const int shmem = ValueTraits::value_size( m_functor ) * ( block_size + 2 ); m_final = false ; - CudaParallelLaunch< ParallelScan >( *this, grid, block, shmem ); // copy to device and execute + CudaParallelLaunch< ParallelScan, LaunchBounds >( *this, grid, block, shmem ); // copy to device and execute m_final = true ; - CudaParallelLaunch< ParallelScan >( *this, grid, block, shmem ); // copy to device and execute + CudaParallelLaunch< ParallelScan, LaunchBounds >( *this, grid, block, shmem ); // copy to device and execute } } diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp index 432c7895cc..a478396910 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp @@ -69,7 +69,7 @@ void cuda_shfl( T & out , T const & in , int lane , typename std::enable_if< sizeof(int) == sizeof(T) , int >::type width ) { *reinterpret_cast(&out) = - __shfl( *reinterpret_cast(&in) , lane , width ); + KOKKOS_IMPL_CUDA_SHFL( *reinterpret_cast(&in) , lane , width ); } template< typename T > @@ -83,7 +83,7 @@ void cuda_shfl( T & out , T const & in , int lane , for ( int i = 0 ; i < N ; ++i ) { reinterpret_cast(&out)[i] = - __shfl( reinterpret_cast(&in)[i] , lane , width ); + KOKKOS_IMPL_CUDA_SHFL( reinterpret_cast(&in)[i] , lane , width ); } } @@ -95,7 +95,7 @@ void cuda_shfl_down( T & out , T const & in , int delta , typename std::enable_if< sizeof(int) == sizeof(T) , int >::type width ) { *reinterpret_cast(&out) = - __shfl_down( *reinterpret_cast(&in) , delta , width ); + KOKKOS_IMPL_CUDA_SHFL_DOWN( *reinterpret_cast(&in) , delta , width ); } template< typename T > @@ -109,7 +109,7 @@ void cuda_shfl_down( T & out , T const & in , int delta , for ( int i = 0 ; i < N ; ++i ) { reinterpret_cast(&out)[i] = - __shfl_down( reinterpret_cast(&in)[i] , delta , width ); + KOKKOS_IMPL_CUDA_SHFL_DOWN( reinterpret_cast(&in)[i] , delta , width ); } } @@ -121,7 +121,7 @@ void cuda_shfl_up( T & out , T const & in , int delta , typename std::enable_if< sizeof(int) == sizeof(T) , int >::type width ) { *reinterpret_cast(&out) = - __shfl_up( *reinterpret_cast(&in) , delta , width ); + KOKKOS_IMPL_CUDA_SHFL_UP( *reinterpret_cast(&in) , delta , width ); } template< typename T > @@ -135,7 +135,7 @@ void cuda_shfl_up( T & out , T const & in , int delta , for ( int i = 0 ; i < N ; ++i ) { reinterpret_cast(&out)[i] = - __shfl_up( reinterpret_cast(&in)[i] , delta , width ); + KOKKOS_IMPL_CUDA_SHFL_UP( reinterpret_cast(&in)[i] , delta , width ); } } @@ -151,7 +151,7 @@ template< class ValueType , class JoinOp> __device__ inline void cuda_intra_warp_reduction( ValueType& result, const JoinOp& join, - const int max_active_thread = blockDim.y) { + const uint32_t max_active_thread = blockDim.y) { unsigned int shift = 1; @@ -268,29 +268,33 @@ bool cuda_inter_block_reduction( typename FunctorValueTraits< FunctorType , ArgT if( id + 1 < int(gridDim.x) ) join(value, tmp); } + int active = KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 2) { value_type tmp = Kokkos::shfl_down(value, 2,32); if( id + 2 < int(gridDim.x) ) join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 4) { value_type tmp = Kokkos::shfl_down(value, 4,32); if( id + 4 < int(gridDim.x) ) join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 8) { value_type tmp = Kokkos::shfl_down(value, 8,32); if( id + 8 < int(gridDim.x) ) join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 16) { value_type tmp = Kokkos::shfl_down(value, 16,32); if( id + 16 < int(gridDim.x) ) join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); } } - //The last block has in its thread=0 the global reduction value through "value" return last_block; #else @@ -302,7 +306,7 @@ template< class ReducerType > __device__ inline typename std::enable_if< Kokkos::is_reducer::value >::type cuda_intra_warp_reduction( const ReducerType& reducer, - const int max_active_thread = blockDim.y) { + const uint32_t max_active_thread = blockDim.y) { typedef typename ReducerType::value_type ValueType; @@ -428,26 +432,31 @@ cuda_inter_block_reduction( const ReducerType& reducer, if( id + 1 < int(gridDim.x) ) reducer.join(value, tmp); } + int active = KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 2) { value_type tmp = Kokkos::shfl_down(value, 2,32); if( id + 2 < int(gridDim.x) ) reducer.join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 4) { value_type tmp = Kokkos::shfl_down(value, 4,32); if( id + 4 < int(gridDim.x) ) reducer.join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 8) { value_type tmp = Kokkos::shfl_down(value, 8,32); if( id + 8 < int(gridDim.x) ) reducer.join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); if (int(blockDim.x*blockDim.y) > 16) { value_type tmp = Kokkos::shfl_down(value, 16,32); if( id + 16 < int(gridDim.x) ) reducer.join(value, tmp); } + active += KOKKOS_IMPL_CUDA_BALLOT(1); } } @@ -594,7 +603,7 @@ bool cuda_single_inter_block_reduce_scan( const FunctorType & functor , typedef FunctorValueOps< FunctorType , ArgTag > ValueOps ; typedef typename ValueTraits::pointer_type pointer_type ; - typedef typename ValueTraits::reference_type reference_type ; + //typedef typename ValueTraits::reference_type reference_type ; // '__ffs' = position of the least significant bit set to 1. // 'blockDim.y' is guaranteed to be a power of two so this @@ -637,7 +646,7 @@ bool cuda_single_inter_block_reduce_scan( const FunctorType & functor , { void * const shared_ptr = shared_data + word_count.value * threadIdx.y ; - reference_type shared_value = ValueInit::init( functor , shared_ptr ); + /* reference_type shared_value = */ ValueInit::init( functor , shared_ptr ); for ( size_type i = b ; i < e ; ++i ) { ValueJoin::join( functor , shared_ptr , global_data + word_count.value * i ); diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp index 3c6f0a5dda..5f08800c40 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp @@ -58,25 +58,56 @@ template class TaskQueue< Kokkos::Cuda > ; //---------------------------------------------------------------------------- +#if defined( KOKKOS_DEBUG ) + +__device__ +void verify_warp_convergence( const char * const where ) +{ + const unsigned b = __ballot(1); + + if ( b != ~0u ) { + +printf(" verify_warp_convergence( %s ) (%d,%d,%d) (%d,%d,%d) failed %x\n" + , where + , blockIdx.x + , blockIdx.y + , blockIdx.z + , threadIdx.x + , threadIdx.y + , threadIdx.z + , b ); + + } +} + +#endif // #if defined( KOKKOS_DEBUG ) + +//---------------------------------------------------------------------------- + __device__ void TaskQueueSpecialization< Kokkos::Cuda >::driver - ( TaskQueueSpecialization< Kokkos::Cuda >::queue_type * const queue ) + ( TaskQueueSpecialization< Kokkos::Cuda >::queue_type * const queue + , int32_t shmem_per_warp ) { using Member = TaskExec< Kokkos::Cuda > ; using Queue = TaskQueue< Kokkos::Cuda > ; - using task_root_type = TaskBase< Kokkos::Cuda , void , void > ; + using task_root_type = TaskBase< void , void , void > ; + + extern __shared__ int32_t shmem_all[]; task_root_type * const end = (task_root_type *) task_root_type::EndTag ; - Member single_exec( 1 ); - Member team_exec( blockDim.y ); + int32_t * const warp_shmem = + shmem_all + ( threadIdx.z * shmem_per_warp ) / sizeof(int32_t); + + task_root_type * const task_shmem = (task_root_type *) warp_shmem ; const int warp_lane = threadIdx.x + threadIdx.y * blockDim.x ; - union { - task_root_type * ptr ; - int raw[2] ; - } task ; + Member single_exec( warp_shmem , 1 ); + Member team_exec( warp_shmem , blockDim.y ); + + task_root_type * task_ptr ; // Loop until all queues are empty and no tasks in flight @@ -87,41 +118,86 @@ void TaskQueueSpecialization< Kokkos::Cuda >::driver if ( 0 == warp_lane ) { - task.ptr = 0 < *((volatile int *) & queue->m_ready_count) ? end : 0 ; + task_ptr = 0 < *((volatile int *) & queue->m_ready_count) ? end : 0 ; // Loop by priority and then type - for ( int i = 0 ; i < Queue::NumQueue && end == task.ptr ; ++i ) { - for ( int j = 0 ; j < 2 && end == task.ptr ; ++j ) { - task.ptr = Queue::pop_ready_task( & queue->m_ready[i][j] ); + for ( int i = 0 ; i < Queue::NumQueue && end == task_ptr ; ++i ) { + for ( int j = 0 ; j < 2 && end == task_ptr ; ++j ) { + task_ptr = Queue::pop_ready_task( & queue->m_ready[i][j] ); } } #if 0 printf("TaskQueue::driver(%d,%d) task(%lx)\n",threadIdx.z,blockIdx.x - , uintptr_t(task.ptr)); + , uintptr_t(task_ptr)); #endif } // shuffle broadcast - task.raw[0] = __shfl( task.raw[0] , 0 ); - task.raw[1] = __shfl( task.raw[1] , 0 ); + ((int*) & task_ptr )[0] = __shfl( ((int*) & task_ptr )[0] , 0 ); + ((int*) & task_ptr )[1] = __shfl( ((int*) & task_ptr )[1] , 0 ); - if ( 0 == task.ptr ) break ; // 0 == queue->m_ready_count +#if defined( KOKKOS_DEBUG ) + verify_warp_convergence("task_ptr"); +#endif - if ( end != task.ptr ) { - if ( task_root_type::TaskTeam == task.ptr->m_task_type ) { + if ( 0 == task_ptr ) break ; // 0 == queue->m_ready_count + + if ( end != task_ptr ) { + + // Whole warp copy task's closure to/from shared memory. + // Use all threads of warp for coalesced read/write. + + int32_t const b = sizeof(task_root_type) / sizeof(int32_t); + int32_t const e = *((int32_t volatile *)( & task_ptr->m_alloc_size )) / sizeof(int32_t); + + int32_t volatile * const task_mem = (int32_t volatile *) task_ptr ; + + // copy global to shared memory: + + for ( int32_t i = warp_lane ; i < e ; i += CudaTraits::WarpSize ) { + warp_shmem[i] = task_mem[i] ; + } + + Kokkos::memory_fence(); + + // Copy done - use memory fence so that memory writes are visible. + // For reliable warp convergence on Pascal and Volta an explicit + // warp level synchronization will also be required. + + if ( task_root_type::TaskTeam == task_shmem->m_task_type ) { // Thread Team Task - (*task.ptr->m_apply)( task.ptr , & team_exec ); + (*task_shmem->m_apply)( task_shmem , & team_exec ); } else if ( 0 == threadIdx.y ) { // Single Thread Task - (*task.ptr->m_apply)( task.ptr , & single_exec ); + (*task_shmem->m_apply)( task_shmem , & single_exec ); } + // copy shared to global memory: + + for ( int32_t i = b + warp_lane ; i < e ; i += CudaTraits::WarpSize ) { + task_mem[i] = warp_shmem[i] ; + } + + Kokkos::memory_fence(); + +#if defined( KOKKOS_DEBUG ) + verify_warp_convergence("apply"); +#endif + + // If respawn requested copy respawn data back to main memory + if ( 0 == warp_lane ) { - queue->complete( task.ptr ); + + if ( ((task_root_type *) task_root_type::LockTag) != task_shmem->m_next ) { + ( (volatile task_root_type *) task_ptr )->m_next = task_shmem->m_next ; + ( (volatile task_root_type *) task_ptr )->m_priority = task_shmem->m_priority ; + } + + queue->complete( task_ptr ); } } } while(1); @@ -130,18 +206,20 @@ printf("TaskQueue::driver(%d,%d) task(%lx)\n",threadIdx.z,blockIdx.x namespace { __global__ -void cuda_task_queue_execute( TaskQueue< Kokkos::Cuda > * queue ) -{ TaskQueueSpecialization< Kokkos::Cuda >::driver( queue ); } +void cuda_task_queue_execute( TaskQueue< Kokkos::Cuda > * queue + , int32_t shmem_size ) +{ TaskQueueSpecialization< Kokkos::Cuda >::driver( queue , shmem_size ); } } void TaskQueueSpecialization< Kokkos::Cuda >::execute ( TaskQueue< Kokkos::Cuda > * const queue ) { + const int shared_per_warp = 2048 ; const int warps_per_block = 4 ; const dim3 grid( Kokkos::Impl::cuda_internal_multiprocessor_count() , 1 , 1 ); const dim3 block( 1 , Kokkos::Impl::CudaTraits::WarpSize , warps_per_block ); - const int shared = 0 ; + const int shared_total = shared_per_warp * warps_per_block ; const cudaStream_t stream = 0 ; CUDA_SAFE_CALL( cudaDeviceSynchronize() ); @@ -159,7 +237,7 @@ printf("cuda_task_queue_execute before\n"); // // CUDA_SAFE_CALL( cudaDeviceSetLimit( cudaLimitStackSize , stack_size ) ); - cuda_task_queue_execute<<< grid , block , shared , stream >>>( queue ); + cuda_task_queue_execute<<< grid , block , shared_total , stream >>>( queue , shared_per_warp ); CUDA_SAFE_CALL( cudaGetLastError() ); diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp index 5d08219ea5..4a52985d29 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp @@ -57,7 +57,7 @@ namespace { template< typename TaskType > __global__ void set_cuda_task_base_apply_function_pointer - ( TaskBase::function_type * ptr ) + ( TaskBase::function_type * ptr ) { *ptr = TaskType::apply ; } } @@ -78,7 +78,7 @@ public: void iff_single_thread_recursive_execute( queue_type * const ) {} __device__ - static void driver( queue_type * const ); + static void driver( queue_type * const , int32_t ); static void execute( queue_type * const ); @@ -106,7 +106,14 @@ public: extern template class TaskQueue< Kokkos::Cuda > ; +}} /* namespace Kokkos::Impl */ + //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + /**\brief Impl::TaskExec is the TaskScheduler::member_type * passed to tasks running in a Cuda space. * @@ -134,11 +141,13 @@ private: friend class Kokkos::Impl::TaskQueue< Kokkos::Cuda > ; friend class Kokkos::Impl::TaskQueueSpecialization< Kokkos::Cuda > ; + int32_t * m_team_shmem ; const int m_team_size ; __device__ - TaskExec( int arg_team_size = blockDim.y ) - : m_team_size( arg_team_size ) {} + TaskExec( int32_t * arg_team_shmem , int arg_team_size = blockDim.y ) + : m_team_shmem( arg_team_shmem ) + , m_team_size( arg_team_size ) {} public: @@ -154,7 +163,13 @@ public: }; +}} /* namespace Kokkos::Impl */ + //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { template struct TeamThreadRangeBoundariesStruct > diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp index 084daa098b..3f3d85ecd1 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp @@ -106,7 +106,7 @@ private: typedef Kokkos::Cuda execution_space ; typedef execution_space::scratch_memory_space scratch_memory_space ; - void * m_team_reduce ; + mutable void * m_team_reduce ; scratch_memory_space m_team_shared ; int m_team_reduce_size ; int m_league_rank ; @@ -166,7 +166,7 @@ public: if ( 1 == blockDim.z ) { // team == block __syncthreads(); // Wait for shared data write until all threads arrive here - if ( threadIdx.x == 0 && threadIdx.y == thread_id ) { + if ( threadIdx.x == 0u && threadIdx.y == (uint32_t)thread_id ) { *((ValueType*) m_team_reduce) = val ; } __syncthreads(); // Wait for shared data read until root thread writes @@ -210,7 +210,7 @@ public: const int wx = ( threadIdx.x + blockDim.x * threadIdx.y ) & CudaTraits::WarpIndexMask ; - for ( int i = CudaTraits::WarpSize ; blockDim.x <= ( i >>= 1 ) ; ) { + for ( int i = CudaTraits::WarpSize ; (int)blockDim.x <= ( i >>= 1 ) ; ) { cuda_shfl_down( reducer.reference() , tmp , i , CudaTraits::WarpSize ); @@ -354,7 +354,7 @@ public: for ( int i = blockDim.x ; ( i >>= 1 ) ; ) { cuda_shfl_down( reducer.reference() , tmp , i , blockDim.x ); - if ( threadIdx.x < i ) { reducer.join( tmp , reducer.reference() ); } + if ( (int)threadIdx.x < i ) { reducer.join( tmp , reducer.reference() ); } } // Broadcast from root lane to all other lanes. @@ -410,7 +410,7 @@ public: value_type tmp( reducer.reference() ); - for ( int i = CudaTraits::WarpSize ; blockDim.x <= ( i >>= 1 ) ; ) { + for ( int i = CudaTraits::WarpSize ; (int)blockDim.x <= ( i >>= 1 ) ; ) { cuda_shfl_down( reducer.reference(), tmp, i, CudaTraits::WarpSize ); @@ -479,7 +479,7 @@ public: __threadfence(); // Wait until global write is visible. - last_block = gridDim.x == + last_block = (int)gridDim.x == 1 + Kokkos::atomic_fetch_add(global_scratch_flags,1); // If last block then reset count @@ -509,7 +509,7 @@ public: reducer.copy( ((pointer_type)shmem) + offset , ((pointer_type)global_scratch_space) + offset ); - for ( int i = nentry + tid ; i < gridDim.x ; i += nentry ) { + for ( int i = nentry + tid ; i < (int)gridDim.x ; i += nentry ) { reducer.join( ((pointer_type)shmem) + offset , ((pointer_type)global_scratch_space) + i * reducer.length() ); @@ -576,6 +576,14 @@ public: , m_league_size( arg_league_size ) {} +public: + // Declare to avoid unused private member warnings which are trigger + // when SFINAE excludes the member function which uses these variables + // Making another class a friend also surpresses these warnings + bool impl_avoid_sfinae_warning() const noexcept + { + return m_team_reduce_size > 0 && m_team_reduce != nullptr; + } }; } // namspace Impl @@ -913,10 +921,10 @@ void parallel_scan // [t] += [t-4] if t >= 4 // ... - for ( int j = 1 ; j < blockDim.x ; j <<= 1 ) { + for ( int j = 1 ; j < (int)blockDim.x ; j <<= 1 ) { value_type tmp = 0 ; Impl::cuda_shfl_up( tmp , sval , j , blockDim.x ); - if ( j <= threadIdx.x ) { sval += tmp ; } + if ( j <= (int)threadIdx.x ) { sval += tmp ; } } // Include accumulation and remove value for exclusive scan: diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_UniqueToken.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_UniqueToken.hpp new file mode 100644 index 0000000000..1ff4ff3540 --- /dev/null +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_UniqueToken.hpp @@ -0,0 +1,133 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_CUDA_UNIQUE_TOKEN_HPP +#define KOKKOS_CUDA_UNIQUE_TOKEN_HPP + +#include +#ifdef KOKKOS_ENABLE_CUDA + +#include +#include +#include +#include + +namespace Kokkos { namespace Experimental { + +// both global and instance Unique Tokens are implemented in the same way +template<> +class UniqueToken< Cuda, UniqueTokenScope::Global > +{ +private: + + uint32_t volatile * m_buffer ; + uint32_t m_count ; + +public: + + using execution_space = Cuda; + + explicit + UniqueToken( execution_space const& ); + + KOKKOS_INLINE_FUNCTION + UniqueToken() : m_buffer(0), m_count(0) {} + + KOKKOS_FUNCTION_DEFAULTED + UniqueToken( const UniqueToken & ) = default; + + KOKKOS_FUNCTION_DEFAULTED + UniqueToken( UniqueToken && ) = default; + + KOKKOS_FUNCTION_DEFAULTED + UniqueToken & operator=( const UniqueToken & ) = default ; + + KOKKOS_FUNCTION_DEFAULTED + UniqueToken & operator=( UniqueToken && ) = default ; + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + KOKKOS_INLINE_FUNCTION + int32_t size() const noexcept { return m_count ; } + + /// \brief acquire value such that 0 <= value < size() + KOKKOS_INLINE_FUNCTION + int32_t acquire() const + { + const Kokkos::pair result = + Kokkos::Impl::concurrent_bitset:: + acquire_bounded( m_buffer + , m_count + , Kokkos::Impl::clock_tic() % m_count + ); + + if ( result.first < 0 ) { + Kokkos::abort("UniqueToken failure to release tokens, no tokens available" ); + } + + return result.first; + } + + /// \brief release an acquired value + KOKKOS_INLINE_FUNCTION + void release( int32_t i ) const noexcept + { + Kokkos::Impl::concurrent_bitset::release( m_buffer, i ); + } +}; + +template<> +class UniqueToken< Cuda, UniqueTokenScope::Instance > + : public UniqueToken< Cuda, UniqueTokenScope::Global > +{ +public: + + explicit + UniqueToken( execution_space const& arg ) + : UniqueToken< Cuda, UniqueTokenScope::Global >( arg ) {} +}; + +}} // namespace Kokkos::Experimental + +#endif // KOKKOS_ENABLE_CUDA +#endif // KOKKOS_CUDA_UNIQUE_TOKEN_HPP + diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp index 99d8fcc999..264f77b3bc 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp @@ -47,7 +47,7 @@ #ifdef KOKKOS_ENABLE_CUDA #include - +#include namespace Kokkos { @@ -91,12 +91,12 @@ namespace Impl { KOKKOS_INLINE_FUNCTION int shfl(const int &val, const int& srcLane, const int& width ) { - return __shfl(val,srcLane,width); + return KOKKOS_IMPL_CUDA_SHFL(val,srcLane,width); } KOKKOS_INLINE_FUNCTION float shfl(const float &val, const int& srcLane, const int& width ) { - return __shfl(val,srcLane,width); + return KOKKOS_IMPL_CUDA_SHFL(val,srcLane,width); } template @@ -105,7 +105,7 @@ namespace Impl { ) { Scalar tmp1 = val; float tmp = *reinterpret_cast(&tmp1); - tmp = __shfl(tmp,srcLane,width); + tmp = KOKKOS_IMPL_CUDA_SHFL(tmp,srcLane,width); return *reinterpret_cast(&tmp); } @@ -113,8 +113,8 @@ namespace Impl { double shfl(const double &val, const int& srcLane, const int& width) { int lo = __double2loint(val); int hi = __double2hiint(val); - lo = __shfl(lo,srcLane,width); - hi = __shfl(hi,srcLane,width); + lo = KOKKOS_IMPL_CUDA_SHFL(lo,srcLane,width); + hi = KOKKOS_IMPL_CUDA_SHFL(hi,srcLane,width); return __hiloint2double(hi,lo); } @@ -123,8 +123,8 @@ namespace Impl { Scalar shfl(const Scalar &val, const int& srcLane, const typename Impl::enable_if< (sizeof(Scalar) == 8) ,int>::type& width) { int lo = __double2loint(*reinterpret_cast(&val)); int hi = __double2hiint(*reinterpret_cast(&val)); - lo = __shfl(lo,srcLane,width); - hi = __shfl(hi,srcLane,width); + lo = KOKKOS_IMPL_CUDA_SHFL(lo,srcLane,width); + hi = KOKKOS_IMPL_CUDA_SHFL(hi,srcLane,width); const double tmp = __hiloint2double(hi,lo); return *(reinterpret_cast(&tmp)); } @@ -137,18 +137,18 @@ namespace Impl { s_val = val; for(int i = 0; i @@ -156,7 +156,7 @@ namespace Impl { Scalar shfl_down(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 4) , int >::type & width) { Scalar tmp1 = val; float tmp = *reinterpret_cast(&tmp1); - tmp = __shfl_down(tmp,delta,width); + tmp = KOKKOS_IMPL_CUDA_SHFL_DOWN(tmp,delta,width); return *reinterpret_cast(&tmp); } @@ -164,8 +164,8 @@ namespace Impl { double shfl_down(const double &val, const int& delta, const int& width) { int lo = __double2loint(val); int hi = __double2hiint(val); - lo = __shfl_down(lo,delta,width); - hi = __shfl_down(hi,delta,width); + lo = KOKKOS_IMPL_CUDA_SHFL_DOWN(lo,delta,width); + hi = KOKKOS_IMPL_CUDA_SHFL_DOWN(hi,delta,width); return __hiloint2double(hi,lo); } @@ -174,8 +174,8 @@ namespace Impl { Scalar shfl_down(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 8) , int >::type & width) { int lo = __double2loint(*reinterpret_cast(&val)); int hi = __double2hiint(*reinterpret_cast(&val)); - lo = __shfl_down(lo,delta,width); - hi = __shfl_down(hi,delta,width); + lo = KOKKOS_IMPL_CUDA_SHFL_DOWN(lo,delta,width); + hi = KOKKOS_IMPL_CUDA_SHFL_DOWN(hi,delta,width); const double tmp = __hiloint2double(hi,lo); return *(reinterpret_cast(&tmp)); } @@ -188,18 +188,18 @@ namespace Impl { s_val = val; for(int i = 0; i @@ -207,7 +207,7 @@ namespace Impl { Scalar shfl_up(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 4) , int >::type & width) { Scalar tmp1 = val; float tmp = *reinterpret_cast(&tmp1); - tmp = __shfl_up(tmp,delta,width); + tmp = KOKKOS_IMPL_CUDA_SHFL_UP(tmp,delta,width); return *reinterpret_cast(&tmp); } @@ -215,8 +215,8 @@ namespace Impl { double shfl_up(const double &val, const int& delta, const int& width ) { int lo = __double2loint(val); int hi = __double2hiint(val); - lo = __shfl_up(lo,delta,width); - hi = __shfl_up(hi,delta,width); + lo = KOKKOS_IMPL_CUDA_SHFL_UP(lo,delta,width); + hi = KOKKOS_IMPL_CUDA_SHFL_UP(hi,delta,width); return __hiloint2double(hi,lo); } @@ -225,8 +225,8 @@ namespace Impl { Scalar shfl_up(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 8) , int >::type & width) { int lo = __double2loint(*reinterpret_cast(&val)); int hi = __double2hiint(*reinterpret_cast(&val)); - lo = __shfl_up(lo,delta,width); - hi = __shfl_up(hi,delta,width); + lo = KOKKOS_IMPL_CUDA_SHFL_UP(lo,delta,width); + hi = KOKKOS_IMPL_CUDA_SHFL_UP(hi,delta,width); const double tmp = __hiloint2double(hi,lo); return *(reinterpret_cast(&tmp)); } @@ -239,7 +239,7 @@ namespace Impl { s_val = val; for(int i = 0; i +#if ( CUDA_VERSION < 9000 ) +#define KOKKOS_IMPL_CUDA_BALLOT(x) __ballot(x) +#define KOKKOS_IMPL_CUDA_SHFL(x,y,z) __shfl(x,y,z) +#define KOKKOS_IMPL_CUDA_SHFL_UP(x,y,z) __shfl_up(x,y,z) +#define KOKKOS_IMPL_CUDA_SHFL_DOWN(x,y,z) __shfl_down(x,y,z) +#else +#define KOKKOS_IMPL_CUDA_BALLOT(x) __ballot_sync(0xffffffff,x) +#define KOKKOS_IMPL_CUDA_SHFL(x,y,z) __shfl_sync(0xffffffff,x,y,z) +#define KOKKOS_IMPL_CUDA_SHFL_UP(x,y,z) __shfl_up_sync(0xffffffff,x,y,z) +#define KOKKOS_IMPL_CUDA_SHFL_DOWN(x,y,z) __shfl_down_sync(0xffffffff,x,y,z) +#endif diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp index f5e2d87fb6..32ee7d0e59 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp @@ -127,11 +127,11 @@ struct CudaTextureFetch { template< class CudaMemorySpace > inline explicit CudaTextureFetch( const ValueType * const arg_ptr - , Kokkos::Experimental::Impl::SharedAllocationRecord< CudaMemorySpace , void > & record + , Kokkos::Impl::SharedAllocationRecord< CudaMemorySpace , void > * record ) - : m_obj( record.template attach_texture_object< AliasType >() ) + : m_obj( record->template attach_texture_object< AliasType >() ) , m_ptr( arg_ptr ) - , m_offset( record.attach_texture_object_offset( reinterpret_cast( arg_ptr ) ) ) + , m_offset( record->attach_texture_object_offset( reinterpret_cast( arg_ptr ) ) ) {} // Texture object spans the entire allocation. @@ -199,8 +199,8 @@ struct CudaLDGFetch { template< class CudaMemorySpace > inline explicit CudaLDGFetch( const ValueType * const arg_ptr - , Kokkos::Experimental::Impl::SharedAllocationRecord< CudaMemorySpace , void > const & - ) + , Kokkos::Impl::SharedAllocationRecord* + ) : m_ptr( arg_ptr ) {} @@ -221,7 +221,6 @@ struct CudaLDGFetch { //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { /** \brief Replace Default ViewDataHandle with Cuda texture fetch specialization @@ -286,7 +285,21 @@ public: // Assignment of texture = non-texture requires creation of a texture object // which can only occur on the host. In addition, 'get_record' is only valid // if called in a host execution space - return handle_type( arg_data_ptr , arg_tracker.template get_record< typename Traits::memory_space >() ); + + + typedef typename Traits::memory_space memory_space ; + typedef typename Impl::SharedAllocationRecord record ; + + record * const r = arg_tracker.template get_record< memory_space >(); + +#if ! defined( KOKKOS_ENABLE_CUDA_LDG_INTRINSIC ) + if ( 0 == r ) { + Kokkos::abort("Cuda const random access View using Cuda texture memory requires Kokkos to allocate the View's memory"); + } +#endif + + return handle_type( arg_data_ptr , r ); + #else Kokkos::Impl::cuda_abort("Cannot create Cuda texture object from within a Cuda kernel"); return handle_type(); @@ -294,9 +307,8 @@ public: } }; -} -} -} +} // namespace Impl +} // namespace Kokkos //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/Cuda/Kokkos_Cuda_WorkGraphPolicy.hpp b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_WorkGraphPolicy.hpp new file mode 100644 index 0000000000..9f5ab1b1f2 --- /dev/null +++ b/lib/kokkos/core/src/Cuda/Kokkos_Cuda_WorkGraphPolicy.hpp @@ -0,0 +1,121 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_CUDA_WORKGRAPHPOLICY_HPP +#define KOKKOS_CUDA_WORKGRAPHPOLICY_HPP + +namespace Kokkos { +namespace Impl { + +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType + , Kokkos::WorkGraphPolicy< Traits ... > + , Kokkos::Cuda + > +{ +public: + + typedef Kokkos::WorkGraphPolicy< Traits ... > Policy ; + typedef ParallelFor Self ; + +private: + + Policy m_policy ; + FunctorType m_functor ; + + template< class TagType > + __device__ inline + typename std::enable_if< std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { m_functor( w ); } + + template< class TagType > + __device__ inline + typename std::enable_if< ! std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { const TagType t{} ; m_functor( t , w ); } + +public: + + __device__ inline + void operator()() const noexcept + { + if ( 0 == ( threadIdx.y % 16 ) ) { + + // Spin until COMPLETED_TOKEN. + // END_TOKEN indicates no work is currently available. + + for ( std::int32_t w = Policy::END_TOKEN ; + Policy::COMPLETED_TOKEN != ( w = m_policy.pop_work() ) ; ) { + if ( Policy::END_TOKEN != w ) { + exec_one< typename Policy::work_tag >( w ); + m_policy.completed_work(w); + } + } + } + } + + inline + void execute() + { + const int warps_per_block = 4 ; + const dim3 grid( Kokkos::Impl::cuda_internal_multiprocessor_count() , 1 , 1 ); + const dim3 block( 1 , Kokkos::Impl::CudaTraits::WarpSize , warps_per_block ); + const int shared = 0 ; + const cudaStream_t stream = 0 ; + + Kokkos::Impl::CudaParallelLaunch(*this, grid, block, shared, stream); + } + + inline + ParallelFor( const FunctorType & arg_functor + , const Policy & arg_policy ) + : m_policy( arg_policy ) + , m_functor( arg_functor ) + {} +}; + +} // namespace Impl +} // namespace Kokkos + +#endif /* #define KOKKOS_CUDA_WORKGRAPHPOLICY_HPP */ diff --git a/lib/kokkos/core/src/KokkosExp_MDRangePolicy.hpp b/lib/kokkos/core/src/KokkosExp_MDRangePolicy.hpp index 4f68d9c2c0..9486f8d26a 100644 --- a/lib/kokkos/core/src/KokkosExp_MDRangePolicy.hpp +++ b/lib/kokkos/core/src/KokkosExp_MDRangePolicy.hpp @@ -52,9 +52,10 @@ #if defined( __CUDACC__ ) && defined( KOKKOS_ENABLE_CUDA ) #include +#include #endif -namespace Kokkos { namespace Experimental { +namespace Kokkos { // ------------------------------------------------------------------ // @@ -120,28 +121,17 @@ struct MDRangePolicy , typename traits::index_type > ; + typedef MDRangePolicy execution_policy; // needed for is_execution_space interrogation + static_assert( !std::is_same::value , "Kokkos Error: MD iteration pattern not defined" ); using iteration_pattern = typename traits::iteration_pattern; using work_tag = typename traits::work_tag; + using launch_bounds = typename traits::launch_bounds; + using member_type = typename range_policy::member_type; - static constexpr int rank = iteration_pattern::rank; - - static constexpr int outer_direction = static_cast ( - (iteration_pattern::outer_direction != Iterate::Default) - ? iteration_pattern::outer_direction - : default_outer_direction< typename traits::execution_space>::value ); - - static constexpr int inner_direction = static_cast ( - iteration_pattern::inner_direction != Iterate::Default - ? iteration_pattern::inner_direction - : default_inner_direction< typename traits::execution_space>::value ) ; - - - // Ugly ugly workaround intel 14 not handling scoped enum correctly - static constexpr int Right = static_cast( Iterate::Right ); - static constexpr int Left = static_cast( Iterate::Left ); + enum { rank = static_cast(iteration_pattern::rank) }; using index_type = typename traits::index_type; using array_index_type = long; @@ -155,11 +145,50 @@ struct MDRangePolicy // This would require the user to either pass a matching index_type parameter // as template parameter to the MDRangePolicy or static_cast the individual values + point_type m_lower; + point_type m_upper; + tile_type m_tile; + point_type m_tile_end; + index_type m_num_tiles; + index_type m_prod_tile_dims; + +/* + // NDE enum impl definition alternative - replace static constexpr int ? + enum { outer_direction = static_cast ( + (iteration_pattern::outer_direction != Iterate::Default) + ? iteration_pattern::outer_direction + : default_outer_direction< typename traits::execution_space>::value ) }; + + enum { inner_direction = static_cast ( + iteration_pattern::inner_direction != Iterate::Default + ? iteration_pattern::inner_direction + : default_inner_direction< typename traits::execution_space>::value ) }; + + enum { Right = static_cast( Iterate::Right ) }; + enum { Left = static_cast( Iterate::Left ) }; +*/ + //static constexpr int rank = iteration_pattern::rank; + + static constexpr int outer_direction = static_cast ( + (iteration_pattern::outer_direction != Iterate::Default) + ? iteration_pattern::outer_direction + : default_outer_direction< typename traits::execution_space>::value ); + + static constexpr int inner_direction = static_cast ( + iteration_pattern::inner_direction != Iterate::Default + ? iteration_pattern::inner_direction + : default_inner_direction< typename traits::execution_space>::value ) ; + + // Ugly ugly workaround intel 14 not handling scoped enum correctly + static constexpr int Right = static_cast( Iterate::Right ); + static constexpr int Left = static_cast( Iterate::Left ); + MDRangePolicy( point_type const& lower, point_type const& upper, tile_type const& tile = tile_type{} ) : m_lower(lower) , m_upper(upper) , m_tile(tile) , m_num_tiles(1) + , m_prod_tile_dims(1) { // Host if ( true @@ -172,8 +201,8 @@ struct MDRangePolicy for (int i=0; i 0)) ) + if ( ((int)inner_direction == (int)Right && (i < rank-1)) + || ((int)inner_direction == (int)Left && (i > 0)) ) { m_tile[i] = 2; } @@ -183,6 +212,7 @@ struct MDRangePolicy } m_tile_end[i] = static_cast((span + m_tile[i] - 1) / m_tile[i]); m_num_tiles *= m_tile_end[i]; + m_prod_tile_dims *= m_tile[i]; } } #if defined(KOKKOS_ENABLE_CUDA) @@ -190,14 +220,18 @@ struct MDRangePolicy { index_type span; for (int i=0; i 0)) ) + if ( ((int)inner_direction == (int)Right && (i < rank-1)) + || ((int)inner_direction == (int)Left && (i > 0)) ) { - m_tile[i] = 2; + if ( m_prod_tile_dims < 512 ) { + m_tile[i] = 2; + } else { + m_tile[i] = 1; + } } else { m_tile[i] = 16; @@ -205,12 +239,9 @@ struct MDRangePolicy } m_tile_end[i] = static_cast((span + m_tile[i] - 1) / m_tile[i]); m_num_tiles *= m_tile_end[i]; + m_prod_tile_dims *= m_tile[i]; } - index_type total_tile_size_check = 1; - for (int i=0; i= 1024 ) { // improve this check - 1024,1024,64 max per dim (Kepler), but product num_threads < 1024; more restrictions pending register limit + if ( m_prod_tile_dims > 512 ) { // Match Cuda restriction for ParallelReduce; 1024,1024,64 max per dim (Kepler), but product num_threads < 1024 printf(" Tile dimensions exceed Cuda limits\n"); Kokkos::abort(" Cuda ExecSpace Error: MDRange tile dims exceed maximum number of threads per block - choose smaller tile dims"); //Kokkos::Impl::throw_runtime_exception( " Cuda ExecSpace Error: MDRange tile dims exceed maximum number of threads per block - choose smaller tile dims"); @@ -223,19 +254,7 @@ struct MDRangePolicy template < typename LT , typename UT , typename TT = array_index_type > MDRangePolicy( std::initializer_list const& lower, std::initializer_list const& upper, std::initializer_list const& tile = {} ) { -#if 0 - // This should work, less duplicated code but not yet extensively tested - point_type lower_tmp, upper_tmp; - tile_type tile_tmp; - for ( auto i = 0; i < rank; ++i ) { - lower_tmp[i] = static_cast(lower.begin()[i]); - upper_tmp[i] = static_cast(upper.begin()[i]); - tile_tmp[i] = static_cast(tile.begin()[i]); - } - MDRangePolicy( lower_tmp, upper_tmp, tile_tmp ); - -#else if(static_cast(m_lower.size()) != rank || static_cast(m_upper.size()) != rank) Kokkos::abort("MDRangePolicy: Constructor initializer lists have wrong size"); @@ -249,7 +268,7 @@ struct MDRangePolicy } m_num_tiles = 1; - + m_prod_tile_dims = 1; // Host if ( true @@ -262,8 +281,8 @@ struct MDRangePolicy for (int i=0; i 0)) ) + if ( ((int)inner_direction == (int)Right && (i < rank-1)) + || ((int)inner_direction == (int)Left && (i > 0)) ) { m_tile[i] = 2; } @@ -273,6 +292,7 @@ struct MDRangePolicy } m_tile_end[i] = static_cast((span + m_tile[i] - 1) / m_tile[i]); m_num_tiles *= m_tile_end[i]; + m_prod_tile_dims *= m_tile[i]; } } #if defined(KOKKOS_ENABLE_CUDA) @@ -284,10 +304,14 @@ struct MDRangePolicy if ( m_tile[i] <= 0 ) { // TODO: determine what is a good default tile size for cuda // may be rank dependent - if ( (inner_direction == Right && (i < rank-1)) - || (inner_direction == Left && (i > 0)) ) + if ( ((int)inner_direction == (int)Right && (i < rank-1)) + || ((int)inner_direction == (int)Left && (i > 0)) ) { - m_tile[i] = 2; + if ( m_prod_tile_dims < 512 ) { + m_tile[i] = 2; + } else { + m_tile[i] = 1; + } } else { m_tile[i] = 16; @@ -295,33 +319,35 @@ struct MDRangePolicy } m_tile_end[i] = static_cast((span + m_tile[i] - 1) / m_tile[i]); m_num_tiles *= m_tile_end[i]; + m_prod_tile_dims *= m_tile[i]; } - index_type total_tile_size_check = 1; - for (int i=0; i= 1024 ) { // improve this check - 1024,1024,64 max per dim (Kepler), but product num_threads < 1024; more restrictions pending register limit + if ( m_prod_tile_dims > 512 ) { // Match Cuda restriction for ParallelReduce; 1024,1024,64 max per dim (Kepler), but product num_threads < 1024 printf(" Tile dimensions exceed Cuda limits\n"); Kokkos::abort(" Cuda ExecSpace Error: MDRange tile dims exceed maximum number of threads per block - choose smaller tile dims"); //Kokkos::Impl::throw_runtime_exception( " Cuda ExecSpace Error: MDRange tile dims exceed maximum number of threads per block - choose smaller tile dims"); } } #endif -#endif } - - point_type m_lower; - point_type m_upper; - tile_type m_tile; - point_type m_tile_end; - index_type m_num_tiles; }; + +} // namespace Kokkos + +// For backward compatibility +namespace Kokkos { namespace Experimental { + using Kokkos::MDRangePolicy; + using Kokkos::Rank; + using Kokkos::Iterate; +} } // end Kokkos::Experimental // ------------------------------------------------------------------ // // ------------------------------------------------------------------ // -//md_parallel_for +//md_parallel_for - deprecated use parallel_for // ------------------------------------------------------------------ // + +namespace Kokkos { namespace Experimental { + template void md_parallel_for( MDRange const& range , Functor const& f @@ -333,9 +359,8 @@ void md_parallel_for( MDRange const& range ) >::type* = 0 ) { - Impl::MDFunctor g(range, f); + Kokkos::Impl::Experimental::MDFunctor g(range, f); - //using range_policy = typename MDRange::range_policy; using range_policy = typename MDRange::impl_range_policy; Kokkos::parallel_for( range_policy(0, range.m_num_tiles).set_chunk_size(1), g, str ); @@ -352,9 +377,8 @@ void md_parallel_for( const std::string& str ) >::type* = 0 ) { - Impl::MDFunctor g(range, f); + Kokkos::Impl::Experimental::MDFunctor g(range, f); - //using range_policy = typename MDRange::range_policy; using range_policy = typename MDRange::impl_range_policy; Kokkos::parallel_for( range_policy(0, range.m_num_tiles).set_chunk_size(1), g, str ); @@ -373,7 +397,7 @@ void md_parallel_for( const std::string& str ) >::type* = 0 ) { - Impl::DeviceIterateTile closure(range, f); + Kokkos::Impl::DeviceIterateTile closure(range, f); closure.execute(); } @@ -388,14 +412,14 @@ void md_parallel_for( MDRange const& range ) >::type* = 0 ) { - Impl::DeviceIterateTile closure(range, f); + Kokkos::Impl::DeviceIterateTile closure(range, f); closure.execute(); } #endif // ------------------------------------------------------------------ // // ------------------------------------------------------------------ // -//md_parallel_reduce +//md_parallel_reduce - deprecated use parallel_reduce // ------------------------------------------------------------------ // template void md_parallel_reduce( MDRange const& range @@ -409,9 +433,8 @@ void md_parallel_reduce( MDRange const& range ) >::type* = 0 ) { - Impl::MDFunctor g(range, f, v); + Kokkos::Impl::Experimental::MDFunctor g(range, f); - //using range_policy = typename MDRange::range_policy; using range_policy = typename MDRange::impl_range_policy; Kokkos::parallel_reduce( str, range_policy(0, range.m_num_tiles).set_chunk_size(1), g, v ); } @@ -428,50 +451,16 @@ void md_parallel_reduce( const std::string& str ) >::type* = 0 ) { - Impl::MDFunctor g(range, f, v); + Kokkos::Impl::Experimental::MDFunctor g(range, f); - //using range_policy = typename MDRange::range_policy; using range_policy = typename MDRange::impl_range_policy; Kokkos::parallel_reduce( str, range_policy(0, range.m_num_tiles).set_chunk_size(1), g, v ); } -// Cuda - parallel_reduce not implemented yet -/* -template -void md_parallel_reduce( MDRange const& range - , Functor const& f - , ValueType & v - , const std::string& str = "" - , typename std::enable_if<( true - #if defined( KOKKOS_ENABLE_CUDA) - && std::is_same< typename MDRange::range_policy::execution_space, Kokkos::Cuda>::value - #endif - ) >::type* = 0 - ) -{ - Impl::DeviceIterateTile closure(range, f, v); - closure.execute(); -} +// Cuda - md_parallel_reduce not implemented - use parallel_reduce -template -void md_parallel_reduce( const std::string& str - , MDRange const& range - , Functor const& f - , ValueType & v - , typename std::enable_if<( true - #if defined( KOKKOS_ENABLE_CUDA) - && std::is_same< typename MDRange::range_policy::execution_space, Kokkos::Cuda>::value - #endif - ) >::type* = 0 - ) -{ - Impl::DeviceIterateTile closure(range, f, v); - closure.execute(); -} -*/ - -}} // namespace Kokkos::Experimental +} } // namespace Kokkos::Experimental #endif //KOKKOS_CORE_EXP_MD_RANGE_POLICY_HPP diff --git a/lib/kokkos/core/src/Kokkos_Array.hpp b/lib/kokkos/core/src/Kokkos_Array.hpp index abb263b7cc..43e6386b54 100644 --- a/lib/kokkos/core/src/Kokkos_Array.hpp +++ b/lib/kokkos/core/src/Kokkos_Array.hpp @@ -152,10 +152,10 @@ public: KOKKOS_INLINE_FUNCTION pointer data() { return pointer(0) ; } KOKKOS_INLINE_FUNCTION const_pointer data() const { return const_pointer(0); } - ~Array() = default ; - Array() = default ; - Array( const Array & ) = default ; - Array & operator = ( const Array & ) = default ; + KOKKOS_FUNCTION_DEFAULTED ~Array() = default ; + KOKKOS_FUNCTION_DEFAULTED Array() = default ; + KOKKOS_FUNCTION_DEFAULTED Array( const Array & ) = default ; + KOKKOS_FUNCTION_DEFAULTED Array & operator = ( const Array & ) = default ; // Some supported compilers are not sufficiently C++11 compliant // for default move constructor and move assignment operator. @@ -209,7 +209,7 @@ public: KOKKOS_INLINE_FUNCTION pointer data() { return m_elem ; } KOKKOS_INLINE_FUNCTION const_pointer data() const { return m_elem ; } - ~Array() = default ; + KOKKOS_FUNCTION_DEFAULTED ~Array() = default ; Array() = delete ; Array( const Array & rhs ) = delete ; @@ -278,7 +278,7 @@ public: KOKKOS_INLINE_FUNCTION pointer data() { return m_elem ; } KOKKOS_INLINE_FUNCTION const_pointer data() const { return m_elem ; } - ~Array() = default ; + KOKKOS_FUNCTION_DEFAULTED ~Array() = default ; Array() = delete ; Array( const Array & ) = delete ; diff --git a/lib/kokkos/core/src/Kokkos_Atomic.hpp b/lib/kokkos/core/src/Kokkos_Atomic.hpp index 3ecae24da4..54a97a16c1 100644 --- a/lib/kokkos/core/src/Kokkos_Atomic.hpp +++ b/lib/kokkos/core/src/Kokkos_Atomic.hpp @@ -80,6 +80,11 @@ // Compiling NVIDIA device code, must use Cuda atomics: #define KOKKOS_ENABLE_CUDA_ATOMICS + +#elif defined(KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_ROCM_GPU) + +#define KOKKOS_ENABLE_ROCM_ATOMICS + #endif #if ! defined( KOKKOS_ENABLE_GNU_ATOMICS ) && \ @@ -114,40 +119,9 @@ #endif /* Not pre-selected atomic implementation */ #endif -//---------------------------------------------------------------------------- - -// Forward decalaration of functions supporting arbitrary sized atomics -// This is necessary since Kokkos_Atomic.hpp is internally included very early -// through Kokkos_HostSpace.hpp as well as the allocation tracker. #ifdef KOKKOS_ENABLE_CUDA -namespace Kokkos { -namespace Impl { -/// \brief Aquire a lock for the address -/// -/// This function tries to aquire the lock for the hash value derived -/// from the provided ptr. If the lock is successfully aquired the -/// function returns true. Otherwise it returns false. -#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE -extern +#include #endif -__device__ inline -bool lock_address_cuda_space(void* ptr); - -/// \brief Release lock for the address -/// -/// This function releases the lock for the hash value derived -/// from the provided ptr. This function should only be called -/// after previously successfully aquiring a lock with -/// lock_address. -#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE -extern -#endif -__device__ inline -void unlock_address_cuda_space(void* ptr); -} -} -#endif - namespace Kokkos { template @@ -185,6 +159,19 @@ const char * atomic_query_version() } // namespace Kokkos +#if defined( KOKKOS_ENABLE_ROCM ) +#include +namespace Kokkos { +namespace Impl { +extern KOKKOS_INLINE_FUNCTION +bool lock_address_rocm_space(void* ptr); + +extern KOKKOS_INLINE_FUNCTION +void unlock_address_rocm_space(void* ptr); +} +} +#endif + #ifdef _WIN32 #include "impl/Kokkos_Atomic_Windows.hpp" #else diff --git a/lib/kokkos/core/src/Kokkos_Complex.hpp b/lib/kokkos/core/src/Kokkos_Complex.hpp index 1fe964a6d2..f8355f0d06 100644 --- a/lib/kokkos/core/src/Kokkos_Complex.hpp +++ b/lib/kokkos/core/src/Kokkos_Complex.hpp @@ -107,6 +107,11 @@ public: re_ (val), im_ (0.0) {} + // BUG HCC WORKAROUND + KOKKOS_INLINE_FUNCTION complex( const RealType& re, const RealType& im): + re_ (re), im_ (im) + {} + //! Constructor that takes the real and imaginary parts. template KOKKOS_INLINE_FUNCTION complex (const RealType1& re, const RealType2& im) : @@ -227,45 +232,99 @@ public: return re_; } + //! Set the imaginary part of this complex number. + KOKKOS_INLINE_FUNCTION void imag (RealType v) { + im_ = v; + } + + //! Set the real part of this complex number. + KOKKOS_INLINE_FUNCTION void real (RealType v) { + re_ = v; + } + + template KOKKOS_INLINE_FUNCTION - complex& operator += (const complex& src) { + complex& + operator += (const complex& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ += src.re_; im_ += src.im_; return *this; } + template KOKKOS_INLINE_FUNCTION - void operator += (const volatile complex& src) volatile { + void + operator += (const volatile complex& src) volatile { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ += src.re_; im_ += src.im_; } KOKKOS_INLINE_FUNCTION - complex& operator += (const RealType& src) { + complex& + operator += (const std::complex& src) { + re_ += src.real(); + im_ += src.imag(); + return *this; + } + + template + KOKKOS_INLINE_FUNCTION + complex& + operator += (const InputRealType& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ += src; return *this; } + template KOKKOS_INLINE_FUNCTION - void operator += (const volatile RealType& src) volatile { + void + operator += (const volatile InputRealType& src) volatile { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ += src; } - + + template KOKKOS_INLINE_FUNCTION - complex& operator -= (const complex& src) { + complex& + operator -= (const complex& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ -= src.re_; im_ -= src.im_; return *this; } KOKKOS_INLINE_FUNCTION - complex& operator -= (const RealType& src) { + complex& + operator -= (const std::complex& src) { + re_ -= src.real(); + im_ -= src.imag(); + return *this; + } + + template + KOKKOS_INLINE_FUNCTION + complex& + operator -= (const InputRealType& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ -= src; return *this; } + template KOKKOS_INLINE_FUNCTION - complex& operator *= (const complex& src) { + complex& + operator *= (const complex& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); const RealType realPart = re_ * src.re_ - im_ * src.im_; const RealType imagPart = re_ * src.im_ + im_ * src.re_; re_ = realPart; @@ -273,8 +332,12 @@ public: return *this; } + template KOKKOS_INLINE_FUNCTION - void operator *= (const volatile complex& src) volatile { + void + operator *= (const volatile complex& src) volatile { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); const RealType realPart = re_ * src.re_ - im_ * src.im_; const RealType imagPart = re_ * src.im_ + im_ * src.re_; re_ = realPart; @@ -282,24 +345,74 @@ public: } KOKKOS_INLINE_FUNCTION - complex& operator *= (const RealType& src) { + complex& + operator *= (const std::complex& src) { + const RealType realPart = re_ * src.real() - im_ * src.imag(); + const RealType imagPart = re_ * src.imag() + im_ * src.real(); + re_ = realPart; + im_ = imagPart; + return *this; + } + + template + KOKKOS_INLINE_FUNCTION + complex& + operator *= (const InputRealType& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ *= src; im_ *= src; return *this; } + template KOKKOS_INLINE_FUNCTION - void operator *= (const volatile RealType& src) volatile { + void + operator *= (const volatile InputRealType& src) volatile { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); re_ *= src; im_ *= src; } + template KOKKOS_INLINE_FUNCTION - complex& operator /= (const complex& y) { + complex& + operator /= (const complex& y) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); + // Scale (by the "1-norm" of y) to avoid unwarranted overflow. // If the real part is +/-Inf and the imaginary part is -/+Inf, // this won't change the result. - const RealType s = ::fabs (y.real ()) + ::fabs (y.imag ()); + const RealType s = std::fabs (y.real ()) + std::fabs (y.imag ()); + + // If s is 0, then y is zero, so x/y == real(x)/0 + i*imag(x)/0. + // In that case, the relation x/y == (x/s) / (y/s) doesn't hold, + // because y/s is NaN. + if (s == 0.0) { + this->re_ /= s; + this->im_ /= s; + } + else { + const complex x_scaled (this->re_ / s, this->im_ / s); + const complex y_conj_scaled (y.re_ / s, -(y.im_) / s); + const RealType y_scaled_abs = y_conj_scaled.re_ * y_conj_scaled.re_ + + y_conj_scaled.im_ * y_conj_scaled.im_; // abs(y) == abs(conj(y)) + *this = x_scaled * y_conj_scaled; + *this /= y_scaled_abs; + } + return *this; + } + + KOKKOS_INLINE_FUNCTION + complex& + operator /= (const std::complex& y) { + + // Scale (by the "1-norm" of y) to avoid unwarranted overflow. + // If the real part is +/-Inf and the imaginary part is -/+Inf, + // this won't change the result. + const RealType s = std::fabs (y.real ()) + std::fabs (y.imag ()); // If s is 0, then y is zero, so x/y == real(x)/0 + i*imag(x)/0. // In that case, the relation x/y == (x/s) / (y/s) doesn't hold, @@ -319,57 +432,95 @@ public: return *this; } + + template KOKKOS_INLINE_FUNCTION - complex& operator /= (const RealType& src) { + complex& + operator /= (const InputRealType& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); + re_ /= src; im_ /= src; return *this; } + template KOKKOS_INLINE_FUNCTION - bool operator == (const complex& src) { - return (re_ == src.re_) && (im_ == src.im_); + bool + operator == (const complex& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); + + return (re_ == static_cast(src.re_)) && (im_ == static_cast(src.im_)); } KOKKOS_INLINE_FUNCTION - bool operator == (const RealType src) { - return (re_ == src) && (im_ == RealType(0)); + bool + operator == (const std::complex& src) { + return (re_ == src.real()) && (im_ == src.imag()); + } + + template + KOKKOS_INLINE_FUNCTION + bool + operator == (const InputRealType src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); + + return (re_ == static_cast(src)) && (im_ == RealType(0)); + } + + template + KOKKOS_INLINE_FUNCTION + bool + operator != (const complex& src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); + + return (re_ != static_cast(src.re_)) || (im_ != static_cast(src.im_)); } KOKKOS_INLINE_FUNCTION - bool operator != (const complex& src) { - return (re_ != src.re_) || (im_ != src.im_); + bool + operator != (const std::complex& src) { + return (re_ != src.real()) || (im_ != src.imag()); } + template KOKKOS_INLINE_FUNCTION - bool operator != (const RealType src) { - return (re_ != src) || (im_ != RealType(0)); - } + bool + operator != (const InputRealType src) { + static_assert(std::is_convertible::value, + "InputRealType must be convertible to RealType"); + return (re_ != static_cast(src)) || (im_ != RealType(0)); + } + }; //! Binary + operator for complex complex. -template +template KOKKOS_INLINE_FUNCTION -complex -operator + (const complex& x, const complex& y) { - return complex (x.real () + y.real (), x.imag () + y.imag ()); +complex::type> +operator + (const complex& x, const complex& y) { + return complex::type > (x.real () + y.real (), x.imag () + y.imag ()); } //! Binary + operator for complex scalar. -template +template KOKKOS_INLINE_FUNCTION -complex -operator + (const complex& x, const RealType& y) { - return complex (x.real () + y , x.imag ()); +complex::type> +operator + (const complex& x, const RealType2& y) { + return complex::type> (x.real () + y , x.imag ()); } //! Binary + operator for scalar complex. -template +template KOKKOS_INLINE_FUNCTION -complex -operator + (const RealType& x, const complex& y) { - return complex (x + y.real (), y.imag ()); +complex::type> +operator + (const RealType1& x, const complex& y) { + return complex::type> (x + y.real (), y.imag ()); } //! Unary + operator for complex. @@ -381,27 +532,27 @@ operator + (const complex& x) { } //! Binary - operator for complex. -template +template KOKKOS_INLINE_FUNCTION -complex -operator - (const complex& x, const complex& y) { - return complex (x.real () - y.real (), x.imag () - y.imag ()); +complex::type> +operator - (const complex& x, const complex& y) { + return complex::type> (x.real () - y.real (), x.imag () - y.imag ()); } //! Binary - operator for complex scalar. -template +template KOKKOS_INLINE_FUNCTION -complex -operator - (const complex& x, const RealType& y) { - return complex (x.real () - y , x.imag ()); +complex::type> +operator - (const complex& x, const RealType2& y) { + return complex::type> (x.real () - y , x.imag ()); } //! Binary - operator for scalar complex. -template +template KOKKOS_INLINE_FUNCTION -complex -operator - (const RealType& x, const complex& y) { - return complex (x - y.real (), - y.imag ()); +complex::type> +operator - (const RealType1& x, const complex& y) { + return complex::type> (x - y.real (), - y.imag ()); } //! Unary - operator for complex. @@ -413,12 +564,12 @@ operator - (const complex& x) { } //! Binary * operator for complex. -template +template KOKKOS_INLINE_FUNCTION -complex -operator * (const complex& x, const complex& y) { - return complex (x.real () * y.real () - x.imag () * y.imag (), - x.real () * y.imag () + x.imag () * y.real ()); +complex::type> +operator * (const complex& x, const complex& y) { + return complex::type> (x.real () * y.real () - x.imag () * y.imag (), + x.real () * y.imag () + x.imag () * y.real ()); } /// \brief Binary * operator for std::complex and complex. @@ -431,33 +582,34 @@ operator * (const complex& x, const complex& y) { /// This function cannot be called in a CUDA device function, because /// std::complex's methods and nonmember functions are not marked as /// CUDA device functions. -template -complex -operator * (const std::complex& x, const complex& y) { - return complex (x.real () * y.real () - x.imag () * y.imag (), - x.real () * y.imag () + x.imag () * y.real ()); +template +inline +complex::type> +operator * (const std::complex& x, const complex& y) { + return complex::type> (x.real () * y.real () - x.imag () * y.imag (), + x.real () * y.imag () + x.imag () * y.real ()); } /// \brief Binary * operator for RealType times complex. /// /// This function exists because the compiler doesn't know that /// RealType and complex commute with respect to operator*. -template +template KOKKOS_INLINE_FUNCTION -complex -operator * (const RealType& x, const complex& y) { - return complex (x * y.real (), x * y.imag ()); +complex::type> +operator * (const RealType1& x, const complex& y) { + return complex::type> (x * y.real (), x * y.imag ()); } /// \brief Binary * operator for RealType times complex. /// /// This function exists because the compiler doesn't know that /// RealType and complex commute with respect to operator*. -template +template KOKKOS_INLINE_FUNCTION -complex -operator * (const complex& y, const RealType& x) { - return complex (x * y.real (), x * y.imag ()); +complex::type> +operator * (const complex& y, const RealType2& x) { + return complex::type> (x * y.real (), x * y.imag ()); } //! Imaginary part of a complex number. @@ -524,33 +676,34 @@ complex pow (const complex& x) { //! Binary operator / for complex and real numbers template KOKKOS_INLINE_FUNCTION -complex +complex::type> operator / (const complex& x, const RealType2& y) { - return complex (real (x) / y, imag (x) / y); + return complex::type> (real (x) / y, imag (x) / y); } //! Binary operator / for complex. -template +template KOKKOS_INLINE_FUNCTION -complex -operator / (const complex& x, const complex& y) { +complex::type> +operator / (const complex& x, const complex& y) { // Scale (by the "1-norm" of y) to avoid unwarranted overflow. // If the real part is +/-Inf and the imaginary part is -/+Inf, // this won't change the result. - const RealType s = ::fabs (real (y)) + ::fabs (imag (y)); + typedef typename std::common_type::type common_real_type; + const common_real_type s = std::fabs (real (y)) + std::fabs (imag (y)); // If s is 0, then y is zero, so x/y == real(x)/0 + i*imag(x)/0. // In that case, the relation x/y == (x/s) / (y/s) doesn't hold, // because y/s is NaN. if (s == 0.0) { - return complex (real (x) / s, imag (x) / s); + return complex (real (x) / s, imag (x) / s); } else { - const complex x_scaled (real (x) / s, imag (x) / s); - const complex y_conj_scaled (real (y) / s, -imag (y) / s); - const RealType y_scaled_abs = real (y_conj_scaled) * real (y_conj_scaled) + + const complex x_scaled (real (x) / s, imag (x) / s); + const complex y_conj_scaled (real (y) / s, -imag (y) / s); + const RealType1 y_scaled_abs = real (y_conj_scaled) * real (y_conj_scaled) + imag (y_conj_scaled) * imag (y_conj_scaled); // abs(y) == abs(conj(y)) - complex result = x_scaled * y_conj_scaled; + complex result = x_scaled * y_conj_scaled; result /= y_scaled_abs; return result; } @@ -559,16 +712,19 @@ operator / (const complex& x, const complex& y) { //! Binary operator / for complex and real numbers template KOKKOS_INLINE_FUNCTION -complex +complex::type> operator / (const RealType1& x, const complex& y) { - return complex (x)/y; + return complex::type> (x)/y; } //! Equality operator for two complex numbers. -template +template KOKKOS_INLINE_FUNCTION -bool operator == (const complex& x, const complex& y) { - return real (x) == real (y) && imag (x) == imag (y); +bool +operator == (const complex& x, const complex& y) { + typedef typename std::common_type::type common_real_type; + return ( static_cast(real (x)) == static_cast(real (y)) && + static_cast(imag (x)) == static_cast(imag (y)) ); } /// \brief Equality operator for std::complex and Kokkos::complex. @@ -577,50 +733,68 @@ bool operator == (const complex& x, const complex& y) { /// Otherwise, CUDA builds will give compiler warnings ("warning: /// calling a constexpr __host__ function("real") from a __host__ /// __device__ function("operator==") is not allowed"). -template -bool operator == (const std::complex& x, const complex& y) { - return std::real (x) == real (y) && std::imag (x) == imag (y); +template +inline +bool +operator == (const std::complex& x, const complex& y) { + typedef typename std::common_type::type common_real_type; + return ( static_cast(std::real (x)) == static_cast(real (y)) && + static_cast(std::imag (x)) == static_cast(imag (y)) ); } - + //! Equality operator for complex and real number. template KOKKOS_INLINE_FUNCTION -bool operator == (const complex& x, const RealType2& y) { - return real (x) == y && imag (x) == static_cast (0.0); +bool +operator == (const complex& x, const RealType2& y) { + typedef typename std::common_type::type common_real_type; + return ( static_cast(real (x)) == static_cast(y) && + static_cast(imag (x)) == static_cast(0.0) ); } //! Equality operator for real and complex number. -template +template KOKKOS_INLINE_FUNCTION -bool operator == (const RealType& x, const complex& y) { +bool +operator == (const RealType1& x, const complex& y) { return y == x; } //! Inequality operator for two complex numbers. -template +template KOKKOS_INLINE_FUNCTION -bool operator != (const complex& x, const complex& y) { - return real (x) != real (y) || imag (x) != imag (y); +bool +operator != (const complex& x, const complex& y) { + typedef typename std::common_type::type common_real_type; + return ( static_cast(real (x)) != static_cast(real (y)) || + static_cast(imag (x)) != static_cast(imag (y)) ); } //! Inequality operator for std::complex and Kokkos::complex. -template -KOKKOS_INLINE_FUNCTION -bool operator != (const std::complex& x, const complex& y) { - return std::real (x) != real (y) || std::imag (x) != imag (y); +template +inline +bool +operator != (const std::complex& x, const complex& y) { + typedef typename std::common_type::type common_real_type; + return ( static_cast(std::real (x)) != static_cast(real (y)) || + static_cast(std::imag (x)) != static_cast(imag (y)) ); } //! Inequality operator for complex and real number. template KOKKOS_INLINE_FUNCTION -bool operator != (const complex& x, const RealType2& y) { - return real (x) != y || imag (x) != static_cast (0.0); +bool +operator != (const complex& x, const RealType2& y) { + typedef typename std::common_type::type common_real_type; + return ( static_cast(real (x)) != static_cast(y) || + static_cast(imag (x)) != static_cast(0.0) ); } //! Inequality operator for real and complex number. -template +template KOKKOS_INLINE_FUNCTION -bool operator != (const RealType& x, const complex& y) { +bool +operator != (const RealType1& x, const complex& y) { return y != x; } diff --git a/lib/kokkos/core/src/Kokkos_Concepts.hpp b/lib/kokkos/core/src/Kokkos_Concepts.hpp index 9a2b53e157..f9366a9594 100644 --- a/lib/kokkos/core/src/Kokkos_Concepts.hpp +++ b/lib/kokkos/core/src/Kokkos_Concepts.hpp @@ -79,6 +79,21 @@ struct IndexType using type = T; }; +/**\brief Specify Launch Bounds for CUDA execution. + * + * If no launch bounds specified then do not set launch bounds. + */ +template< unsigned int maxT = 0 /* Max threads per block */ + , unsigned int minB = 0 /* Min blocks per SM */ + > +struct LaunchBounds +{ + using launch_bounds = LaunchBounds; + using type = LaunchBounds; + static unsigned int constexpr maxTperB {maxT}; + static unsigned int constexpr minBperSM {minB}; +}; + } // namespace Kokkos //---------------------------------------------------------------------------- @@ -119,6 +134,7 @@ using Kokkos::is_array_layout ; KOKKOS_IMPL_IS_CONCEPT( iteration_pattern ) KOKKOS_IMPL_IS_CONCEPT( schedule_type ) KOKKOS_IMPL_IS_CONCEPT( index_type ) +KOKKOS_IMPL_IS_CONCEPT( launch_bounds ) } @@ -264,6 +280,9 @@ struct MemorySpaceAccess { enum { deepcopy = assignable }; }; +}} // namespace Kokkos::Impl + +namespace Kokkos { /**\brief Can AccessSpace access MemorySpace ? * @@ -342,6 +361,13 @@ public: >::type space ; }; +} // namespace Kokkos + +namespace Kokkos { +namespace Impl { + +using Kokkos::SpaceAccessibility ; // For backward compatibility + }} // namespace Kokkos::Impl //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/Kokkos_Core.hpp b/lib/kokkos/core/src/Kokkos_Core.hpp index 19de791c0f..b1531a0a1b 100644 --- a/lib/kokkos/core/src/Kokkos_Core.hpp +++ b/lib/kokkos/core/src/Kokkos_Core.hpp @@ -74,6 +74,10 @@ #include #endif +#if defined( KOKKOS_ENABLE_ROCM ) +#include +#endif + #include #include #include @@ -95,18 +99,28 @@ struct InitArguments { int num_threads; int num_numa; int device_id; + bool disable_warnings; - InitArguments() { - num_threads = -1; - num_numa = -1; - device_id = -1; - } + InitArguments( int nt = -1 + , int nn = -1 + , int dv = -1 + , bool dw = false + ) + : num_threads{ nt } + , num_numa{ nn } + , device_id{ dv } + , disable_warnings{ dw } + {} }; void initialize(int& narg, char* arg[]); void initialize(const InitArguments& args = InitArguments()); +bool is_initialized() noexcept; + +bool show_warnings() noexcept; + /** \brief Finalize the spaces that were initialized via Kokkos::initialize */ void finalize(); @@ -168,6 +182,9 @@ void * kokkos_realloc( void * arg_alloc , const size_t arg_alloc_size ) } // namespace Kokkos +#include +#include + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/Kokkos_Core_fwd.hpp b/lib/kokkos/core/src/Kokkos_Core_fwd.hpp index 09081d2387..29001e19ed 100644 --- a/lib/kokkos/core/src/Kokkos_Core_fwd.hpp +++ b/lib/kokkos/core/src/Kokkos_Core_fwd.hpp @@ -51,6 +51,9 @@ #include #include +#include +#include + //---------------------------------------------------------------------------- // Have assumed a 64bit build (8byte pointers) throughout the code base. @@ -119,6 +122,13 @@ class CudaHostPinnedSpace; ///< Memory space on Host accessible to Cuda GPU class Cuda; ///< Execution space for Cuda GPU #endif +#if defined( KOKKOS_ENABLE_ROCM ) +namespace Experimental { +class ROCmSpace ; ///< Memory space on ROCm GPU +class ROCm ; ///< Execution space for ROCm GPU +} +#endif + template struct Device; @@ -137,6 +147,8 @@ namespace Kokkos { typedef Cuda DefaultExecutionSpace; #elif defined ( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMPTARGET ) typedef Experimental::OpenMPTarget DefaultExecutionSpace ; +#elif defined ( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_ROCM ) + typedef Experimental::ROCm DefaultExecutionSpace ; #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMP ) typedef OpenMP DefaultExecutionSpace; #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_THREADS ) @@ -182,6 +194,8 @@ namespace Impl { #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA ) && defined( KOKKOS_ENABLE_CUDA ) typedef Kokkos::CudaSpace ActiveExecutionMemorySpace; +#elif defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_ROCM_GPU ) +typedef Kokkos::HostSpace ActiveExecutionMemorySpace ; #elif defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) typedef Kokkos::HostSpace ActiveExecutionMemorySpace; #else diff --git a/lib/kokkos/core/src/Kokkos_Crs.hpp b/lib/kokkos/core/src/Kokkos_Crs.hpp new file mode 100644 index 0000000000..7bbc938010 --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_Crs.hpp @@ -0,0 +1,456 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_CRS_HPP +#define KOKKOS_CRS_HPP + +namespace Kokkos { + +/// \class Crs +/// \brief Compressed row storage array. +/// +/// \tparam DataType The type of stored entries. If a Crs is +/// used as the graph of a sparse matrix, then this is usually an +/// integer type, the type of the column indices in the sparse +/// matrix. +/// +/// \tparam Arg1Type The second template parameter, corresponding +/// either to the Device type (if there are no more template +/// parameters) or to the Layout type (if there is at least one more +/// template parameter). +/// +/// \tparam Arg2Type The third template parameter, which if provided +/// corresponds to the Device type. +/// +/// \tparam SizeType The type of row offsets. Usually the default +/// parameter suffices. However, setting a nondefault value is +/// necessary in some cases, for example, if you want to have a +/// sparse matrices with dimensions (and therefore column indices) +/// that fit in \c int, but want to store more than INT_MAX +/// entries in the sparse matrix. +/// +/// A row has a range of entries: +///
      +///
    • row_map[i0] <= entry < row_map[i0+1]
    • +///
    • 0 <= i1 < row_map[i0+1] - row_map[i0]
    • +///
    • entries( entry , i2 , i3 , ... );
    • +///
    • entries( row_map[i0] + i1 , i2 , i3 , ... );
    • +///
    +template< class DataType, + class Arg1Type, + class Arg2Type = void, + typename SizeType = typename ViewTraits::size_type> +class Crs { +protected: + typedef ViewTraits traits; + +public: + typedef DataType data_type; + typedef typename traits::array_layout array_layout; + typedef typename traits::execution_space execution_space; + typedef typename traits::memory_space memory_space; + typedef typename traits::device_type device_type; + typedef SizeType size_type; + + typedef Crs< DataType , Arg1Type , Arg2Type , SizeType > staticcrsgraph_type; + typedef Crs< DataType , array_layout , typename traits::host_mirror_space , SizeType > HostMirror; + typedef View row_map_type; + typedef View entries_type; + + row_map_type row_map; + entries_type entries; + + //! Construct an empty view. + Crs() : row_map(), entries() {} + + //! Copy constructor (shallow copy). + Crs(const Crs& rhs) : row_map(rhs.row_map), entries(rhs.entries) + {} + + template + Crs(const RowMapType& row_map_, const EntriesType& entries_) : row_map(row_map_), entries(entries_) + {} + + /** \brief Assign to a view of the rhs array. + * If the old view is the last view + * then allocated memory is deallocated. + */ + Crs& operator= (const Crs& rhs) { + row_map = rhs.row_map; + entries = rhs.entries; + return *this; + } + + /** \brief Destroy this view of the array. + * If the last view then allocated memory is deallocated. + */ + ~Crs() {} + + /** \brief Return number of rows in the graph + */ + KOKKOS_INLINE_FUNCTION + size_type numRows() const { + return (row_map.dimension_0 () != 0) ? + row_map.dimension_0 () - static_cast (1) : + static_cast (0); + } +}; + +/*--------------------------------------------------------------------------*/ + +template< class OutCounts, + class DataType, + class Arg1Type, + class Arg2Type, + class SizeType> +void get_crs_transpose_counts( + OutCounts& out, + Crs const& in, + std::string const& name = "transpose_counts"); + +template< class OutCounts, + class InCrs> +typename OutCounts::value_type get_crs_row_map_from_counts( + OutCounts& out, + InCrs const& in, + std::string const& name = "row_map"); + +template< class DataType, + class Arg1Type, + class Arg2Type, + class SizeType> +void transpose_crs( + Crs& out, + Crs const& in); + +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Impl { + +template +class GetCrsTransposeCounts { + public: + using execution_space = typename InCrs::execution_space; + using self_type = GetCrsTransposeCounts; + using index_type = typename InCrs::size_type; + private: + InCrs in; + OutCounts out; + public: + KOKKOS_INLINE_FUNCTION + void operator()(index_type i) const { + atomic_increment( &out[in.entries(i)] ); + } + GetCrsTransposeCounts(InCrs const& arg_in, OutCounts const& arg_out): + in(arg_in),out(arg_out) { + using policy_type = RangePolicy; + using closure_type = Kokkos::Impl::ParallelFor; + const closure_type closure(*this, policy_type(0, index_type(in.entries.size()))); + closure.execute(); + execution_space::fence(); + } +}; + +template +class CrsRowMapFromCounts { + public: + using execution_space = typename InCounts::execution_space; + using value_type = typename OutRowMap::value_type; + using index_type = typename InCounts::size_type; + using last_value_type = Kokkos::View; + private: + InCounts m_in; + OutRowMap m_out; + last_value_type m_last_value; + public: + KOKKOS_INLINE_FUNCTION + void operator()(index_type i, value_type& update, bool final_pass) const { + if (i < m_in.size()) { + update += m_in(i); + if (final_pass) m_out(i + 1) = update; + } else if (final_pass) { + m_out(0) = 0; + m_last_value() = update; + } + } + KOKKOS_INLINE_FUNCTION + void init(value_type& update) const { update = 0; } + KOKKOS_INLINE_FUNCTION + void join(volatile value_type& update, const volatile value_type& input) const { + update += input; + } + using self_type = CrsRowMapFromCounts; + CrsRowMapFromCounts(InCounts const& arg_in, OutRowMap const& arg_out): + m_in(arg_in), m_out(arg_out), m_last_value("last_value") { + } + value_type execute() { + using policy_type = RangePolicy; + using closure_type = Kokkos::Impl::ParallelScan; + closure_type closure(*this, policy_type(0, m_in.size() + 1)); + closure.execute(); + auto last_value = Kokkos::create_mirror_view(m_last_value); + Kokkos::deep_copy(last_value, m_last_value); + return last_value(); + } +}; + +template +class FillCrsTransposeEntries { + public: + using execution_space = typename InCrs::execution_space; + using memory_space = typename InCrs::memory_space; + using value_type = typename OutCrs::entries_type::value_type; + using index_type = typename InCrs::size_type; + private: + using counters_type = View; + InCrs in; + OutCrs out; + counters_type counters; + public: + KOKKOS_INLINE_FUNCTION + void operator()(index_type i) const { + auto begin = in.row_map(i); + auto end = in.row_map(i + 1); + for (auto j = begin; j < end; ++j) { + auto ti = in.entries(j); + auto tbegin = out.row_map(ti); + auto tj = atomic_fetch_add( &counters(ti), 1 ); + out.entries( tbegin + tj ) = i; + } + } + using self_type = FillCrsTransposeEntries; + FillCrsTransposeEntries(InCrs const& arg_in, OutCrs const& arg_out): + in(arg_in),out(arg_out), + counters("counters", arg_out.numRows()) { + using policy_type = RangePolicy; + using closure_type = Kokkos::Impl::ParallelFor; + const closure_type closure(*this, policy_type(0, index_type(in.numRows()))); + closure.execute(); + execution_space::fence(); + } +}; + +}} // namespace Kokkos::Impl + +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { + +template< class OutCounts, + class DataType, + class Arg1Type, + class Arg2Type, + class SizeType> +void get_crs_transpose_counts( + OutCounts& out, + Crs const& in, + std::string const& name) { + using InCrs = Crs; + out = OutCounts(name, in.numRows()); + Kokkos::Impl::GetCrsTransposeCounts functor(in, out); +} + +template< class OutRowMap, + class InCounts> +typename OutRowMap::value_type get_crs_row_map_from_counts( + OutRowMap& out, + InCounts const& in, + std::string const& name) { + out = OutRowMap(ViewAllocateWithoutInitializing(name), in.size() + 1); + Kokkos::Impl::CrsRowMapFromCounts functor(in, out); + return functor.execute(); +} + +template< class DataType, + class Arg1Type, + class Arg2Type, + class SizeType> +void transpose_crs( + Crs& out, + Crs const& in) +{ + typedef Crs crs_type ; + typedef typename crs_type::memory_space memory_space ; + typedef View counts_type ; + { + counts_type counts; + Kokkos::get_crs_transpose_counts(counts, in); + Kokkos::get_crs_row_map_from_counts(out.row_map, counts, + "tranpose_row_map"); + } + out.entries = decltype(out.entries)("transpose_entries", in.entries.size()); + Kokkos::Impl:: + FillCrsTransposeEntries entries_functor(in, out); +} + +template< class CrsType, + class Functor, + class ExecutionSpace = typename CrsType::execution_space> +struct CountAndFillBase; + +template< class CrsType, + class Functor, + class ExecutionSpace> +struct CountAndFillBase { + using data_type = typename CrsType::size_type; + using size_type = typename CrsType::size_type; + using row_map_type = typename CrsType::row_map_type; + using counts_type = row_map_type; + CrsType m_crs; + Functor m_functor; + counts_type m_counts; + struct Count {}; + inline void operator()(Count, size_type i) const { + m_counts(i) = m_functor(i, nullptr); + } + struct Fill {}; + inline void operator()(Fill, size_type i) const { + auto j = m_crs.row_map(i); + /* we don't want to access entries(entries.size()), even if its just to get its + address and never use it. + this can happen when row (i) is empty and all rows after it are also empty. + we could compare to row_map(i + 1), but that is a read from global memory, + whereas dimension_0() should be part of the View in registers (or constant memory) */ + data_type* fill = + (j == static_cast(m_crs.entries.dimension_0())) ? + nullptr : (&(m_crs.entries(j))); + m_functor(i, fill); + } + CountAndFillBase(CrsType& crs, Functor const& f): + m_crs(crs), + m_functor(f) + {} +}; + +#if defined( KOKKOS_ENABLE_CUDA ) +template< class CrsType, + class Functor> +struct CountAndFillBase { + using data_type = typename CrsType::size_type; + using size_type = typename CrsType::size_type; + using row_map_type = typename CrsType::row_map_type; + using counts_type = row_map_type; + CrsType m_crs; + Functor m_functor; + counts_type m_counts; + struct Count {}; + __device__ inline void operator()(Count, size_type i) const { + m_counts(i) = m_functor(i, nullptr); + } + struct Fill {}; + __device__ inline void operator()(Fill, size_type i) const { + auto j = m_crs.row_map(i); + /* we don't want to access entries(entries.size()), even if its just to get its + address and never use it. + this can happen when row (i) is empty and all rows after it are also empty. + we could compare to row_map(i + 1), but that is a read from global memory, + whereas dimension_0() should be part of the View in registers (or constant memory) */ + data_type* fill = + (j == static_cast(m_crs.entries.dimension_0())) ? + nullptr : (&(m_crs.entries(j))); + m_functor(i, fill); + } + CountAndFillBase(CrsType& crs, Functor const& f): + m_crs(crs), + m_functor(f) + {} +}; +#endif + +template< class CrsType, + class Functor> +struct CountAndFill : public CountAndFillBase { + using base_type = CountAndFillBase; + using typename base_type::data_type; + using typename base_type::size_type; + using typename base_type::counts_type; + using typename base_type::Count; + using typename base_type::Fill; + using entries_type = typename CrsType::entries_type; + using self_type = CountAndFill; + CountAndFill(CrsType& crs, size_type nrows, Functor const& f): + base_type(crs, f) + { + using execution_space = typename CrsType::execution_space; + this->m_counts = counts_type("counts", nrows); + { + using count_policy_type = RangePolicy; + using count_closure_type = + Kokkos::Impl::ParallelFor; + const count_closure_type closure(*this, count_policy_type(0, nrows)); + closure.execute(); + } + auto nentries = Kokkos:: + get_crs_row_map_from_counts(this->m_crs.row_map, this->m_counts); + this->m_counts = counts_type(); + this->m_crs.entries = entries_type("entries", nentries); + { + using fill_policy_type = RangePolicy; + using fill_closure_type = + Kokkos::Impl::ParallelFor; + const fill_closure_type closure(*this, fill_policy_type(0, nrows)); + closure.execute(); + } + crs = this->m_crs; + } +}; + +template< class CrsType, + class Functor> +void count_and_fill_crs( + CrsType& crs, + typename CrsType::size_type nrows, + Functor const& f) { + Kokkos::CountAndFill(crs, nrows, f); +} + +} // namespace Kokkos + +#endif /* #define KOKKOS_CRS_HPP */ diff --git a/lib/kokkos/core/src/Kokkos_Cuda.hpp b/lib/kokkos/core/src/Kokkos_Cuda.hpp index f0f0f87458..197831dee5 100644 --- a/lib/kokkos/core/src/Kokkos_Cuda.hpp +++ b/lib/kokkos/core/src/Kokkos_Cuda.hpp @@ -217,8 +217,8 @@ public: private: - cudaStream_t m_stream ; int m_device ; + cudaStream_t m_stream ; }; } // namespace Kokkos @@ -295,6 +295,7 @@ struct VerifyExecutionCanAccessMemorySpace #include #include #include +#include #include //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/Kokkos_CudaSpace.hpp b/lib/kokkos/core/src/Kokkos_CudaSpace.hpp index 307ab193b1..fb5985e164 100644 --- a/lib/kokkos/core/src/Kokkos_CudaSpace.hpp +++ b/lib/kokkos/core/src/Kokkos_CudaSpace.hpp @@ -90,7 +90,7 @@ public: , const size_t arg_alloc_size ) const ; /**\brief Return Name of the MemorySpace */ - static constexpr const char* name(); + static constexpr const char* name() { return m_name; } /*--------------------------------*/ /** \brief Error reporting for HostSpace attempt to access CudaSpace */ @@ -186,7 +186,7 @@ public: , const size_t arg_alloc_size ) const ; /**\brief Return Name of the MemorySpace */ - static constexpr const char* name(); + static constexpr const char* name() { return m_name; } /*--------------------------------*/ @@ -234,7 +234,7 @@ public: , const size_t arg_alloc_size ) const ; /**\brief Return Name of the MemorySpace */ - static constexpr const char* name(); + static constexpr const char* name() { return m_name; } private: diff --git a/lib/kokkos/core/src/Kokkos_ExecPolicy.hpp b/lib/kokkos/core/src/Kokkos_ExecPolicy.hpp index 375a2d3744..6f6343713c 100644 --- a/lib/kokkos/core/src/Kokkos_ExecPolicy.hpp +++ b/lib/kokkos/core/src/Kokkos_ExecPolicy.hpp @@ -379,11 +379,13 @@ Impl::PerThreadValue PerThread(const int& arg); * uses variadic templates. Each and any of the template arguments can * be omitted. * - * Possible Template arguments and there default values: + * Possible Template arguments and their default values: * ExecutionSpace (DefaultExecutionSpace): where to execute code. Must be enabled. * WorkTag (none): Tag which is used as the first argument for the functor operator. * Schedule (Schedule): Scheduling Policy (Dynamic, or Static). * IndexType (IndexType: Integer Index type used to iterate over the Index space. + * LaunchBounds Launch Bounds for CUDA compilation, + * default of LaunchBounds<0,0> indicates no launch bounds specified. */ template< class ... Properties> class TeamPolicy: public @@ -561,6 +563,45 @@ KOKKOS_INLINE_FUNCTION Impl::ThreadVectorRangeBoundariesStruct ThreadVectorRange( const TeamMemberType&, const iType& count ); +#if defined(KOKKOS_ENABLE_PROFILING) +namespace Impl { + +template::value > +struct ParallelConstructName; + +template +struct ParallelConstructName { + ParallelConstructName(std::string const& label):label_ref(label) { + if (label.empty()) { + default_name = std::string(typeid(FunctorType).name()) + "/" + + typeid(TagType).name(); + } + } + std::string const& get() { + return (label_ref.empty()) ? default_name : label_ref; + } + std::string const& label_ref; + std::string default_name; +}; + +template +struct ParallelConstructName { + ParallelConstructName(std::string const& label):label_ref(label) { + if (label.empty()) { + default_name = std::string(typeid(FunctorType).name()); + } + } + std::string const& get() { + return (label_ref.empty()) ? default_name : label_ref; + } + std::string const& label_ref; + std::string default_name; +}; + +} // namespace Impl +#endif /* defined KOKKOS_ENABLE_PROFILING */ + } // namespace Kokkos #endif /* #define KOKKOS_EXECPOLICY_HPP */ diff --git a/lib/kokkos/core/src/Kokkos_HBWSpace.hpp b/lib/kokkos/core/src/Kokkos_HBWSpace.hpp index e224cd4e84..b811751a2c 100644 --- a/lib/kokkos/core/src/Kokkos_HBWSpace.hpp +++ b/lib/kokkos/core/src/Kokkos_HBWSpace.hpp @@ -126,14 +126,6 @@ public: //! This memory space preferred device_type typedef Kokkos::Device< execution_space, memory_space > device_type; - /*--------------------------------*/ - /* Functions unique to the HBWSpace */ - static int in_parallel(); - - static void register_in_parallel( int (*)() ); - - /*--------------------------------*/ - /**\brief Default memory space instance */ HBWSpace(); HBWSpace( const HBWSpace & rhs ) = default; @@ -155,12 +147,11 @@ public: , const size_t arg_alloc_size ) const; /**\brief Return Name of the MemorySpace */ - static constexpr const char* name(); + static constexpr const char* name() { return "HBW"; } private: AllocationMechanism m_alloc_mech; - static constexpr const char* m_name = "HBW"; friend class Kokkos::Impl::SharedAllocationRecord< Kokkos::Experimental::HBWSpace, void >; }; diff --git a/lib/kokkos/core/src/Kokkos_HostSpace.hpp b/lib/kokkos/core/src/Kokkos_HostSpace.hpp index d00cce8f60..431635047a 100644 --- a/lib/kokkos/core/src/Kokkos_HostSpace.hpp +++ b/lib/kokkos/core/src/Kokkos_HostSpace.hpp @@ -130,14 +130,6 @@ public: //! This memory space preferred device_type typedef Kokkos::Device< execution_space, memory_space > device_type; - /*--------------------------------*/ - /* Functions unique to the HostSpace */ - static int in_parallel(); - - static void register_in_parallel( int (*)() ); - - /*--------------------------------*/ - /**\brief Default memory space instance */ HostSpace(); HostSpace( HostSpace && rhs ) = default; @@ -161,7 +153,7 @@ public: , const size_t arg_alloc_size ) const; /**\brief Return Name of the MemorySpace */ - static constexpr const char* name(); + static constexpr const char* name() { return m_name; } private: AllocationMechanism m_alloc_mech; diff --git a/lib/kokkos/core/src/Kokkos_Layout.hpp b/lib/kokkos/core/src/Kokkos_Layout.hpp index f300a6d9f6..87c705153e 100644 --- a/lib/kokkos/core/src/Kokkos_Layout.hpp +++ b/lib/kokkos/core/src/Kokkos_Layout.hpp @@ -156,6 +156,8 @@ struct LayoutStride { for ( int r = 0 ; r < ARRAY_LAYOUT_MAX_RANK ; ++r ) { tmp.dimension[r] = 0 ; tmp.stride[r] = 0 ; + } + for ( int r = 0 ; r < rank ; ++r ) { check_input &= ~int( 1 << order[r] ); } if ( 0 == check_input ) { diff --git a/lib/kokkos/core/src/Kokkos_Macros.hpp b/lib/kokkos/core/src/Kokkos_Macros.hpp index 1439dbd3f8..b51f38efb2 100644 --- a/lib/kokkos/core/src/Kokkos_Macros.hpp +++ b/lib/kokkos/core/src/Kokkos_Macros.hpp @@ -96,6 +96,14 @@ //---------------------------------------------------------------------------- +#if defined(KOKKOS_ENABLE_SERIAL) || defined(KOKKOS_ENABLE_THREADS) || \ + defined(KOKKOS_ENABLE_OPENMP) || defined(KOKKOS_ENABLE_QTHREADS) || \ + defined(KOKKOS_ENABLE_ROCM) || defined(KOKKOS_ENABLE_OPENMPTARGET) + #define KOKKOS_INTERNAL_ENABLE_NON_CUDA_BACKEND +#endif + +#define KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA + #if defined( KOKKOS_ENABLE_CUDA ) && defined( __CUDACC__ ) // Compiling with a CUDA compiler. // @@ -133,6 +141,9 @@ #if ( CUDA_VERSION < 8000 ) && defined( __NVCC__ ) #define KOKKOS_LAMBDA [=]__device__ + #if defined( KOKKOS_INTERNAL_ENABLE_NON_CUDA_BACKEND ) + #undef KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA + #endif #else #define KOKKOS_LAMBDA [=]__host__ __device__ @@ -141,16 +152,13 @@ #endif #endif - #define KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA 1 - #endif -#endif // #if defined( KOKKOS_ENABLE_CUDA ) && defined( __CUDACC__ ) - -#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA ) - // Cuda version 8.0 still needs the functor wrapper - #if /* ( CUDA_VERSION < 8000 ) && */ defined( __NVCC__ ) + #if defined( __NVCC__ ) #define KOKKOS_IMPL_NEED_FUNCTOR_WRAPPER - #endif -#endif + #endif + #else // !defined(KOKKOS_ENABLE_CUDA_LAMBDA) + #undef KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA + #endif // !defined(KOKKOS_ENABLE_CUDA_LAMBDA) +#endif // #if defined( KOKKOS_ENABLE_CUDA ) && defined( __CUDACC__ ) //---------------------------------------------------------------------------- // Language info: C++, CUDA, OPENMP @@ -161,8 +169,20 @@ #define KOKKOS_FORCEINLINE_FUNCTION __device__ __host__ __forceinline__ #define KOKKOS_INLINE_FUNCTION __device__ __host__ inline #define KOKKOS_FUNCTION __device__ __host__ + #ifdef KOKKOS_COMPILER_CLANG + #define KOKKOS_FUNCTION_DEFAULTED KOKKOS_FUNCTION + #endif #endif // #if defined( __CUDA_ARCH__ ) +#if defined( KOKKOS_ENABLE_ROCM ) && defined( __HCC__ ) + + #define KOKKOS_FORCEINLINE_FUNCTION __attribute__((amp,cpu)) inline + #define KOKKOS_INLINE_FUNCTION __attribute__((amp,cpu)) inline + #define KOKKOS_FUNCTION __attribute__((amp,cpu)) + #define KOKKOS_LAMBDA [=] __attribute__((amp,cpu)) + #define KOKKOS_FUNCTION_DEFAULTED KOKKOS_FUNCTION +#endif + #if defined( _OPENMP ) // Compiling with OpenMP. // The value of _OPENMP is an integer value YYYYMM @@ -179,15 +199,6 @@ // Host code is compiled again with another compiler. // Device code is compile to 'ptx'. #define KOKKOS_COMPILER_NVCC __NVCC__ -#else - #if !defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA ) - #if !defined( KOKKOS_ENABLE_CUDA ) // Compiling with clang for Cuda does not work with LAMBDAs either - // CUDA (including version 6.5) does not support giving lambdas as - // arguments to global functions. Thus its not currently possible - // to dispatch lambdas from the host. - #define KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA 1 - #endif - #endif #endif // #if defined( __NVCC__ ) #if !defined( KOKKOS_LAMBDA ) @@ -240,7 +251,7 @@ #endif #endif -#if defined( __PGIC__ ) && !defined( __GNUC__ ) +#if defined( __PGIC__ ) #define KOKKOS_COMPILER_PGI __PGIC__*100+__PGIC_MINOR__*10+__PGIC_PATCHLEVEL__ #if ( 1540 > KOKKOS_COMPILER_PGI ) @@ -257,24 +268,22 @@ #define KOKKOS_ENABLE_PRAGMA_UNROLL 1 #define KOKKOS_ENABLE_PRAGMA_LOOPCOUNT 1 #define KOKKOS_ENABLE_PRAGMA_VECTOR 1 - #define KOKKOS_ENABLE_PRAGMA_SIMD 1 + #if ( 1800 > KOKKOS_COMPILER_INTEL ) + #define KOKKOS_ENABLE_PRAGMA_SIMD 1 + #endif #if ( __INTEL_COMPILER > 1400 ) #define KOKKOS_ENABLE_PRAGMA_IVDEP 1 #endif + #if ! defined( KOKKOS_MEMORY_ALIGNMENT ) + #define KOKKOS_MEMORY_ALIGNMENT 64 + #endif + #define KOKKOS_RESTRICT __restrict__ - #ifndef KOKKOS_ALIGN - #define KOKKOS_ALIGN(size) __attribute__((aligned(size))) - #endif - - #ifndef KOKKOS_ALIGN_PTR - #define KOKKOS_ALIGN_PTR(size) __attribute__((align_value(size))) - #endif - - #ifndef KOKKOS_ALIGN_SIZE - #define KOKKOS_ALIGN_SIZE 64 + #ifndef KOKKOS_IMPL_ALIGN_PTR + #define KOKKOS_IMPL_ALIGN_PTR(size) __attribute__((align_value(size))) #endif #if ( 1400 > KOKKOS_COMPILER_INTEL ) @@ -297,6 +306,10 @@ #endif #endif + #if defined( KOKKOS_ARCH_AVX512MIC ) + #define KOKKOS_ENABLE_RFO_PREFETCH 1 + #endif + #if defined( __MIC__ ) // Compiling for Xeon Phi #endif @@ -317,6 +330,10 @@ //#define KOKKOS_ENABLE_PRAGMA_LOOPCOUNT 1 //#define KOKKOS_ENABLE_PRAGMA_VECTOR 1 //#define KOKKOS_ENABLE_PRAGMA_SIMD 1 + + #if ! defined( KOKKOS_ENABLE_ASM ) + #define KOKKOS_ENABLE_ASM 1 + #endif #endif //---------------------------------------------------------------------------- @@ -332,6 +349,11 @@ #if !defined( KOKKOS_FORCEINLINE_FUNCTION ) #define KOKKOS_FORCEINLINE_FUNCTION inline __attribute__((always_inline)) #endif + + #if !defined( KOKKOS_IMPL_ALIGN_PTR ) + #define KOKKOS_IMPL_ALIGN_PTR(size) __attribute__((aligned(size))) + #endif + #endif //---------------------------------------------------------------------------- @@ -344,13 +366,18 @@ //#define KOKKOS_ENABLE_PRAGMA_VECTOR 1 //#define KOKKOS_ENABLE_PRAGMA_SIMD 1 + #if defined( KOKKOS_ARCH_AVX512MIC ) + #define KOKKOS_ENABLE_RFO_PREFETCH 1 + #endif + #if !defined( KOKKOS_FORCEINLINE_FUNCTION ) #define KOKKOS_FORCEINLINE_FUNCTION inline __attribute__((always_inline)) #endif #if !defined( KOKKOS_ENABLE_ASM ) && !defined( __PGIC__ ) && \ ( defined( __amd64 ) || defined( __amd64__ ) || \ - defined( __x86_64 ) || defined( __x86_64__ ) ) + defined( __x86_64 ) || defined( __x86_64__ ) || \ + defined(__PPC64__) ) #define KOKKOS_ENABLE_ASM 1 #endif #endif @@ -388,6 +415,10 @@ #define KOKKOS_FUNCTION /**/ #endif +#if !defined( KOKKOS_FUNCTION_DEFAULTED ) + #define KOKKOS_FUNCTION_DEFAULTED /**/ +#endif + //---------------------------------------------------------------------------- // Define empty macro for restrict if necessary: @@ -398,16 +429,16 @@ //---------------------------------------------------------------------------- // Define Macro for alignment: -#if !defined KOKKOS_ALIGN_SIZE - #define KOKKOS_ALIGN_SIZE 16 +#if ! defined( KOKKOS_MEMORY_ALIGNMENT ) + #define KOKKOS_MEMORY_ALIGNMENT 16 #endif -#if !defined( KOKKOS_ALIGN ) - #define KOKKOS_ALIGN(size) __attribute__((aligned(size))) +#if ! defined( KOKKOS_MEMORY_ALIGNMENT_THRESHOLD ) + #define KOKKOS_MEMORY_ALIGNMENT_THRESHOLD 4 #endif -#if !defined( KOKKOS_ALIGN_PTR ) - #define KOKKOS_ALIGN_PTR(size) __attribute__((aligned(size))) +#if !defined( KOKKOS_IMPL_ALIGN_PTR ) + #define KOKKOS_IMPL_ALIGN_PTR(size) /* */ #endif //---------------------------------------------------------------------------- @@ -415,6 +446,7 @@ // There is zero or one default execution space specified. #if 1 < ( ( defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_CUDA ) ? 1 : 0 ) + \ + ( defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_ROCM ) ? 1 : 0 ) + \ ( defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMPTARGET ) ? 1 : 0 ) + \ ( defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMP ) ? 1 : 0 ) + \ ( defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_THREADS ) ? 1 : 0 ) + \ @@ -426,6 +458,7 @@ // If default is not specified then chose from enabled execution spaces. // Priority: CUDA, OPENMP, THREADS, QTHREADS, SERIAL #if defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_CUDA ) +#elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_ROCM ) #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMPTARGET ) #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMP ) #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_THREADS ) @@ -433,6 +466,8 @@ #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_SERIAL ) #elif defined( KOKKOS_ENABLE_CUDA ) #define KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_CUDA +#elif defined( KOKKOS_ENABLE_ROCM ) + #define KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_ROCM #elif defined( KOKKOS_ENABLE_OPENMPTARGET ) #define KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMPTARGET #elif defined( KOKKOS_ENABLE_OPENMP ) @@ -450,6 +485,8 @@ #if defined( __CUDACC__ ) && defined( __CUDA_ARCH__ ) && defined( KOKKOS_ENABLE_CUDA ) #define KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA +#elif defined( __HCC__ ) && defined( __HCC_ACCELERATOR__ ) && defined( KOKKOS_ENABLE_ROCM ) + #define KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_ROCM_GPU #else #define KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST #endif @@ -476,5 +513,11 @@ #define KOKKOS_ENABLE_TASKDAG #endif + +#if defined ( KOKKOS_ENABLE_CUDA ) + #if ( 9000 <= CUDA_VERSION ) + #define KOKKOS_IMPL_CUDA_VERSION_9_WORKAROUND + #endif +#endif #endif // #ifndef KOKKOS_MACROS_HPP diff --git a/lib/kokkos/core/src/Kokkos_MasterLock.hpp b/lib/kokkos/core/src/Kokkos_MasterLock.hpp new file mode 100644 index 0000000000..81564b8eac --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_MasterLock.hpp @@ -0,0 +1,73 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_MASTER_LOCK_HPP +#define KOKKOS_MASTER_LOCK_HPP + +#include + +namespace Kokkos { namespace Experimental { + +// my be used to coordinate work between master instances +// SHOULD NOT be used within a parallel algorithm +// +// This lock should be used with with a scoped lock guard +// i.e. std::unique_lock, std::lock_guard +// +// cannot be copied or moved +// has the following functions available +// +// Lock() +// ~Lock() +// +// void lock() +// void unlock() +// bool try_lock() +// +template +class MasterLock; + +}} // namespace Kokkos::Experimental + +#endif //KOKKOS_MASTER_LOCK_HPP + diff --git a/lib/kokkos/core/src/Kokkos_MemoryPool.hpp b/lib/kokkos/core/src/Kokkos_MemoryPool.hpp index dbf1ad8057..9199725767 100644 --- a/lib/kokkos/core/src/Kokkos_MemoryPool.hpp +++ b/lib/kokkos/core/src/Kokkos_MemoryPool.hpp @@ -51,6 +51,27 @@ #include #include +namespace Kokkos { +namespace Impl { +/* Report violation of size constraints: + * min_block_alloc_size <= max_block_alloc_size + * max_block_alloc_size <= min_superblock_size + * min_superblock_size <= max_superblock_size + * min_superblock_size <= min_total_alloc_size + * min_superblock_size <= min_block_alloc_size * + * max_block_per_superblock + */ +void memory_pool_bounds_verification + ( size_t min_block_alloc_size + , size_t max_block_alloc_size + , size_t min_superblock_size + , size_t max_superblock_size + , size_t max_block_per_superblock + , size_t min_total_alloc_size + ); +} +} + namespace Kokkos { template< typename DeviceType > @@ -66,11 +87,6 @@ private: enum : uint32_t { max_bit_count_lg2 = CB::max_bit_count_lg2 }; enum : uint32_t { max_bit_count = CB::max_bit_count }; - /* Defaults for min block, max block, and superblock sizes */ - enum : uint32_t { MIN_BLOCK_SIZE_LG2 = 6 /* 64 bytes */ }; - enum : uint32_t { MAX_BLOCK_SIZE_LG2 = 12 /* 4k bytes */ }; - enum : uint32_t { SUPERBLOCK_SIZE_LG2 = 16 /* 64k bytes */ }; - enum : uint32_t { HINT_PER_BLOCK_SIZE = 2 }; /* Each superblock has a concurrent bitset state @@ -85,6 +101,14 @@ private: * is concurrently updated. */ + /* Mapping between block_size <-> block_state + * + * block_state = ( m_sb_size_lg2 - block_size_lg2 ) << state_shift + * block_size = m_sb_size_lg2 - ( block_state >> state_shift ) + * + * Thus A_block_size < B_block_size <=> A_block_state > B_block_state + */ + typedef typename DeviceType::memory_space base_memory_space ; enum { accessible = @@ -108,6 +132,10 @@ private: public: + /**\brief The maximum size of a superblock and block */ + enum : uint32_t { max_superblock_size = 1LU << 31 /* 2 gigabytes */ }; + enum : uint32_t { max_block_per_superblock = max_bit_count }; + //-------------------------------------------------------------------------- KOKKOS_INLINE_FUNCTION @@ -203,7 +231,7 @@ public: const uint32_t * sb_state_ptr = sb_state_array ; s << "pool_size(" << ( size_t(m_sb_count) << m_sb_size_lg2 ) << ")" - << " superblock_size(" << ( 1 << m_sb_size_lg2 ) << ")" << std::endl ; + << " superblock_size(" << ( 1LU << m_sb_size_lg2 ) << ")" << std::endl ; for ( int32_t i = 0 ; i < m_sb_count ; ++i , sb_state_ptr += m_sb_state_size ) { @@ -212,7 +240,7 @@ public: const uint32_t block_count_lg2 = (*sb_state_ptr) >> state_shift ; const uint32_t block_size_lg2 = m_sb_size_lg2 - block_count_lg2 ; - const uint32_t block_count = 1 << block_count_lg2 ; + const uint32_t block_count = 1u << block_count_lg2 ; const uint32_t block_used = (*sb_state_ptr) & state_used_mask ; s << "Superblock[ " << i << " / " << m_sb_count << " ] {" @@ -230,12 +258,24 @@ public: //-------------------------------------------------------------------------- - MemoryPool() = default ; MemoryPool( MemoryPool && ) = default ; MemoryPool( const MemoryPool & ) = default ; MemoryPool & operator = ( MemoryPool && ) = default ; MemoryPool & operator = ( const MemoryPool & ) = default ; + MemoryPool() + : m_tracker() + , m_sb_state_array(0) + , m_sb_state_size(0) + , m_sb_size_lg2(0) + , m_max_block_size_lg2(0) + , m_min_block_size_lg2(0) + , m_sb_count(0) + , m_hint_offset(0) + , m_data_offset(0) + , m_unused_padding(0) + {} + /**\brief Allocate a memory pool from 'memspace'. * * The memory pool will have at least 'min_total_alloc_size' bytes @@ -251,10 +291,10 @@ public: * significant runtime performance improvements. */ MemoryPool( const base_memory_space & memspace - , const size_t min_total_alloc_size - , const uint32_t min_block_alloc_size // = 1 << MIN_BLOCK_SIZE_LG2 - , const uint32_t max_block_alloc_size // = 1 << MAX_BLOCK_SIZE_LG2 - , const uint32_t min_superblock_size // = 1 << SUPERBLOCK_SIZE_LG2 + , const size_t min_total_alloc_size + , size_t min_block_alloc_size = 0 + , size_t max_block_alloc_size = 0 + , size_t min_superblock_size = 0 ) : m_tracker() , m_sb_state_array(0) @@ -267,10 +307,73 @@ public: , m_data_offset(0) , m_unused_padding(0) { - const uint32_t int_align_lg2 = 3 ; /* align as int[8] */ - const uint32_t int_align_mask = ( 1u << int_align_lg2 ) - 1 ; + const uint32_t int_align_lg2 = 3 ; /* align as int[8] */ + const uint32_t int_align_mask = ( 1u << int_align_lg2 ) - 1 ; + const uint32_t default_min_block_size = 1u << 6 ; /* 64 bytes */ + const uint32_t default_max_block_size = 1u << 12 ;/* 4k bytes */ + const uint32_t default_min_superblock_size = 1u << 20 ;/* 1M bytes */ + //-------------------------------------------------- + // Default block and superblock sizes: + + if ( 0 == min_block_alloc_size ) { + // Default all sizes: + + min_superblock_size = + std::min( size_t(default_min_superblock_size) + , min_total_alloc_size ); + + min_block_alloc_size = + std::min( size_t(default_min_block_size) + , min_superblock_size ); + + max_block_alloc_size = + std::min( size_t(default_max_block_size) + , min_superblock_size ); + } + else if ( 0 == min_superblock_size ) { + + // Choose superblock size as minimum of: + // max_block_per_superblock * min_block_size + // max_superblock_size + // min_total_alloc_size + + const size_t max_superblock = + min_block_alloc_size * max_block_per_superblock ; + + min_superblock_size = + std::min( max_superblock , + std::min( size_t(max_superblock_size) + , min_total_alloc_size ) ); + } + + if ( 0 == max_block_alloc_size ) { + max_block_alloc_size = min_superblock_size ; + } + + //-------------------------------------------------- + + /* Enforce size constraints: + * min_block_alloc_size <= max_block_alloc_size + * max_block_alloc_size <= min_superblock_size + * min_superblock_size <= max_superblock_size + * min_superblock_size <= min_total_alloc_size + * min_superblock_size <= min_block_alloc_size * + * max_block_per_superblock + */ + + Kokkos::Impl::memory_pool_bounds_verification + ( min_block_alloc_size + , max_block_alloc_size + , min_superblock_size + , max_superblock_size + , max_block_per_superblock + , min_total_alloc_size + ); + + //-------------------------------------------------- // Block and superblock size is power of two: + // Maximum value is 'max_superblock_size' m_min_block_size_lg2 = Kokkos::Impl::integral_power_of_two_that_contains(min_block_alloc_size); @@ -281,45 +384,26 @@ public: m_sb_size_lg2 = Kokkos::Impl::integral_power_of_two_that_contains(min_superblock_size); - // Constraints: - // m_min_block_size_lg2 <= m_max_block_size_lg2 <= m_sb_size_lg2 - // m_sb_size_lg2 <= m_min_block_size + max_bit_count_lg2 + { + // number of superblocks is multiple of superblock size that + // can hold min_total_alloc_size. - if ( m_min_block_size_lg2 + max_bit_count_lg2 < m_sb_size_lg2 ) { - m_min_block_size_lg2 = m_sb_size_lg2 - max_bit_count_lg2 ; - } - if ( m_min_block_size_lg2 + max_bit_count_lg2 < m_max_block_size_lg2 ) { - m_min_block_size_lg2 = m_max_block_size_lg2 - max_bit_count_lg2 ; - } - if ( m_max_block_size_lg2 < m_min_block_size_lg2 ) { - m_max_block_size_lg2 = m_min_block_size_lg2 ; - } - if ( m_sb_size_lg2 < m_max_block_size_lg2 ) { - m_sb_size_lg2 = m_max_block_size_lg2 ; + const uint64_t sb_size_mask = ( 1LU << m_sb_size_lg2 ) - 1 ; + + m_sb_count = ( min_total_alloc_size + sb_size_mask ) >> m_sb_size_lg2 ; } - // At least 32 minimum size blocks in a superblock + { + // Any superblock can be assigned to the smallest size block + // Size the block bitset to maximum number of blocks - if ( m_sb_size_lg2 < m_min_block_size_lg2 + 5 ) { - m_sb_size_lg2 = m_min_block_size_lg2 + 5 ; + const uint32_t max_block_count_lg2 = + m_sb_size_lg2 - m_min_block_size_lg2 ; + + m_sb_state_size = + ( CB::buffer_bound_lg2( max_block_count_lg2 ) + int_align_mask ) & ~int_align_mask ; } - // number of superblocks is multiple of superblock size that - // can hold min_total_alloc_size. - - const uint32_t sb_size_mask = ( 1u << m_sb_size_lg2 ) - 1 ; - - m_sb_count = ( min_total_alloc_size + sb_size_mask ) >> m_sb_size_lg2 ; - - // Any superblock can be assigned to the smallest size block - // Size the block bitset to maximum number of blocks - - const uint32_t max_block_count_lg2 = - m_sb_size_lg2 - m_min_block_size_lg2 ; - - m_sb_state_size = - ( CB::buffer_bound_lg2( max_block_count_lg2 ) + int_align_mask ) & ~int_align_mask ; - // Array of all superblock states const size_t all_sb_state_size = @@ -404,7 +488,7 @@ private: * Restrict lower bound to minimum block size. */ KOKKOS_FORCEINLINE_FUNCTION - unsigned get_block_size_lg2( unsigned n ) const noexcept + uint32_t get_block_size_lg2( uint32_t n ) const noexcept { const unsigned i = Kokkos::Impl::integral_power_of_two_that_contains( n ); @@ -413,11 +497,12 @@ private: public: + /* Return 0 for invalid block size */ KOKKOS_INLINE_FUNCTION - uint32_t allocate_block_size( uint32_t alloc_size ) const noexcept + uint32_t allocate_block_size( uint64_t alloc_size ) const noexcept { return alloc_size <= (1UL << m_max_block_size_lg2) - ? ( 1u << get_block_size_lg2( alloc_size ) ) + ? ( 1UL << get_block_size_lg2( uint32_t(alloc_size) ) ) : 0 ; } @@ -435,140 +520,171 @@ public: void * allocate( size_t alloc_size , int32_t attempt_limit = 1 ) const noexcept { + if ( size_t(1LU << m_max_block_size_lg2) < alloc_size ) { + Kokkos::abort("Kokkos MemoryPool allocation request exceeded specified maximum allocation size"); + } + + if ( 0 == alloc_size ) return (void*) 0 ; + void * p = 0 ; const uint32_t block_size_lg2 = get_block_size_lg2( alloc_size ); - if ( block_size_lg2 <= m_max_block_size_lg2 ) { + // Allocation will fit within a superblock + // that has block sizes ( 1 << block_size_lg2 ) - // Allocation will fit within a superblock - // that has block sizes ( 1 << block_size_lg2 ) + const uint32_t block_count_lg2 = m_sb_size_lg2 - block_size_lg2 ; + const uint32_t block_state = block_count_lg2 << state_shift ; + const uint32_t block_count = 1u << block_count_lg2 ; - const uint32_t block_count_lg2 = m_sb_size_lg2 - block_size_lg2 ; - const uint32_t block_state = block_count_lg2 << state_shift ; - const uint32_t block_count = 1u << block_count_lg2 ; - const uint32_t block_count_mask = block_count - 1 ; + // Superblock hints for this block size: + // hint_sb_id_ptr[0] is the dynamically changing hint + // hint_sb_id_ptr[1] is the static start point - // Superblock hints for this block size: - // hint_sb_id_ptr[0] is the dynamically changing hint - // hint_sb_id_ptr[1] is the static start point + volatile uint32_t * const hint_sb_id_ptr + = m_sb_state_array /* memory pool state array */ + + m_hint_offset /* offset to hint portion of array */ + + HINT_PER_BLOCK_SIZE /* number of hints per block size */ + * ( block_size_lg2 - m_min_block_size_lg2 ); /* block size id */ - volatile uint32_t * const hint_sb_id_ptr - = m_sb_state_array /* memory pool state array */ - + m_hint_offset /* offset to hint portion of array */ - + HINT_PER_BLOCK_SIZE /* number of hints per block size */ - * ( block_size_lg2 - m_min_block_size_lg2 ); /* block size id */ + const int32_t sb_id_begin = int32_t( hint_sb_id_ptr[1] ); - const int32_t sb_id_begin = int32_t( hint_sb_id_ptr[1] ); + // Fast query clock register 'tic' to pseudo-randomize + // the guess for which block within a superblock should + // be claimed. If not available then a search occurs. - // Fast query clock register 'tic' to pseudo-randomize - // the guess for which block within a superblock should - // be claimed. If not available then a search occurs. - - const uint32_t block_id_hint = block_count_mask & - (uint32_t)( Kokkos::Impl::clock_tic() + const uint32_t block_id_hint = + (uint32_t)( Kokkos::Impl::clock_tic() #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA ) - // Spread out potentially concurrent access - // by threads within a warp or thread block. - + ( threadIdx.x + blockDim.x * threadIdx.y ) + // Spread out potentially concurrent access + // by threads within a warp or thread block. + + ( threadIdx.x + blockDim.x * threadIdx.y ) #endif - ); + ); - int32_t sb_id = -1 ; + // expected state of superblock for allocation + uint32_t sb_state = block_state ; - volatile uint32_t * sb_state_array = 0 ; + int32_t sb_id = -1 ; - while ( attempt_limit ) { + volatile uint32_t * sb_state_array = 0 ; - int32_t hint_sb_id = -1 ; + while ( attempt_limit ) { - if ( sb_id < 0 ) { + int32_t hint_sb_id = -1 ; - sb_id = hint_sb_id = int32_t( *hint_sb_id_ptr ); + if ( sb_id < 0 ) { - sb_state_array = m_sb_state_array + ( sb_id * m_sb_state_size ); + // No superblock specified, try the hint for this block size + + sb_id = hint_sb_id = int32_t( *hint_sb_id_ptr ); + + sb_state_array = m_sb_state_array + ( sb_id * m_sb_state_size ); + } + + // Require: + // 0 <= sb_id + // sb_state_array == m_sb_state_array + m_sb_state_size * sb_id + + if ( sb_state == ( state_header_mask & *sb_state_array ) ) { + + // This superblock state is as expected, for the moment. + // Attempt to claim a bit. The attempt updates the state + // so have already made sure the state header is as expected. + + const uint32_t count_lg2 = sb_state >> state_shift ; + const uint32_t mask = ( 1u << count_lg2 ) - 1 ; + + const Kokkos::pair result = + CB::acquire_bounded_lg2( sb_state_array + , count_lg2 + , block_id_hint & mask + , sb_state + ); + + // If result.first < 0 then failed to acquire + // due to either full or buffer was wrong state. + // Could be wrong state if a deallocation raced the + // superblock to empty before the acquire could succeed. + + if ( 0 <= result.first ) { // acquired a bit + + const uint32_t size_lg2 = m_sb_size_lg2 - count_lg2 ; + + // Set the allocated block pointer + + p = ((char*)( m_sb_state_array + m_data_offset )) + + ( uint64_t(sb_id) << m_sb_size_lg2 ) // superblock memory + + ( uint64_t(result.first) << size_lg2 ); // block memory + +#if 0 + printf( " MemoryPool(0x%lx) pointer(0x%lx) allocate(%lu) sb_id(%d) sb_state(0x%x) block_size(%d) block_capacity(%d) block_id(%d) block_claimed(%d)\n" + , (uintptr_t)m_sb_state_array + , (uintptr_t)p + , alloc_size + , sb_id + , sb_state + , (1u << size_lg2) + , (1u << count_lg2) + , result.first + , result.second ); +#endif + + break ; // Success } + } + //------------------------------------------------------------------ + // Arrive here if failed to acquire a block. + // Must find a new superblock. - // Require: - // 0 <= sb_id - // sb_state_array == m_sb_state_array + m_sb_state_size * sb_id + // Start searching at designated index for this block size. + // Look for superblock that, in preferential order, + // 1) part-full superblock of this block size + // 2) empty superblock to claim for this block size + // 3) part-full superblock of the next larger block size - if ( block_state == ( state_header_mask & *sb_state_array ) ) { + sb_state = block_state ; // Expect to find the desired state + sb_id = -1 ; - // This superblock state is assigned to this block size. - // Try to claim a bit. + bool update_hint = false ; + int32_t sb_id_empty = -1 ; + int32_t sb_id_large = -1 ; + uint32_t sb_state_large = 0 ; - const Kokkos::pair result = - CB::acquire_bounded_lg2( sb_state_array - , block_count_lg2 - , block_id_hint - , block_state - ); + sb_state_array = m_sb_state_array + sb_id_begin * m_sb_state_size ; - // If result.first < 0 then failed to acquire - // due to either full or buffer was wrong state. - // Could be wrong state if a deallocation raced the - // superblock to empty before the acquire could succeed. + for ( int32_t i = 0 , id = sb_id_begin ; i < m_sb_count ; ++i ) { - if ( 0 <= result.first ) { // acquired a bit + // Query state of the candidate superblock. + // Note that the state may change at any moment + // as concurrent allocations and deallocations occur. + + const uint32_t full_state = *sb_state_array ; + const uint32_t used = full_state & state_used_mask ; + const uint32_t state = full_state & state_header_mask ; - // Set the allocated block pointer + if ( state == block_state ) { - p = ((char*)( m_sb_state_array + m_data_offset )) - + ( uint32_t(sb_id) << m_sb_size_lg2 ) // superblock memory - + ( result.first << block_size_lg2 ); // block memory + // Superblock is assigned to this block size - break ; // Success + if ( used < block_count ) { + + // There is room to allocate one block + + sb_id = id ; + + // Is there room to allocate more than one block? + + update_hint = used + 1 < block_count ; + + break ; } - -// printf(" acquire block_count_lg2(%d) block_state(0x%x) sb_id(%d) result(%d,%d)\n" , block_count_lg2 , block_state , sb_id , result.first , result.second ); - } - //------------------------------------------------------------------ - // Arrive here if failed to acquire a block. - // Must find a new superblock. + else if ( 0 == used ) { - // Start searching at designated index for this block size. - // Look for a partially full superblock of this block size. - // Look for an empty superblock just in case cannot find partfull. + // Superblock is empty - sb_id = -1 ; - - int32_t sb_id_empty = -1 ; - - sb_state_array = m_sb_state_array + sb_id_begin * m_sb_state_size ; - - for ( int32_t i = 0 , id = sb_id_begin ; i < m_sb_count ; ++i ) { - - // Query state of the candidate superblock. - // Note that the state may change at any moment - // as concurrent allocations and deallocations occur. - - const uint32_t state = *sb_state_array ; - const uint32_t used = state & state_used_mask ; - - if ( block_state == ( state & state_header_mask ) ) { - - // Superblock is assigned to this block size - - if ( used < block_count ) { - - // There is room to allocate one block - - sb_id = id ; - - if ( used + 1 < block_count ) { - - // There is room to allocate more than one block - - Kokkos::atomic_compare_exchange - ( hint_sb_id_ptr , uint32_t(hint_sb_id) , uint32_t(sb_id) ); - } - - break ; - } - } - else if ( ( used == 0 ) && ( sb_id_empty == -1 ) ) { + if ( -1 == sb_id_empty ) { // Superblock is not assigned to this block size // and is the first empty superblock encountered. @@ -576,61 +692,81 @@ public: sb_id_empty = id ; } - - if ( ++id < m_sb_count ) { - sb_state_array += m_sb_state_size ; - } - else { - id = 0 ; - sb_state_array = m_sb_state_array ; - } + } + else if ( ( -1 == sb_id_empty /* have not found an empty */ ) && + ( -1 == sb_id_large /* have not found a larger */ ) && + ( state < block_state /* a larger block */ ) && + // is not full: + ( used < ( 1u << ( state >> state_shift ) ) ) ) { + // First superblock encountered that is + // larger than this block size and + // has room for an allocation. + // Save this id to use of partfull or empty superblock not found + sb_id_large = id ; + sb_state_large = state ; } -// printf(" search m_sb_count(%d) sb_id(%d) sb_id_empty(%d)\n" , m_sb_count , sb_id , sb_id_empty ); + // Iterate around the superblock array: - if ( sb_id < 0 ) { + if ( ++id < m_sb_count ) { + sb_state_array += m_sb_state_size ; + } + else { + id = 0 ; + sb_state_array = m_sb_state_array ; + } + } - // Did not find a partfull superblock for this block size. + // printf(" search m_sb_count(%d) sb_id(%d) sb_id_empty(%d) sb_id_large(%d)\n" , m_sb_count , sb_id , sb_id_empty , sb_id_large); - if ( 0 <= sb_id_empty ) { + if ( sb_id < 0 ) { - // Found first empty superblock following designated superblock - // Attempt to claim it for this block size. - // If the claim fails assume that another thread claimed it - // for this block size and try to use it anyway, - // but do not update hint. + // Did not find a partfull superblock for this block size. - sb_id = sb_id_empty ; + if ( 0 <= sb_id_empty ) { - sb_state_array = m_sb_state_array + ( sb_id * m_sb_state_size ); + // Found first empty superblock following designated superblock + // Attempt to claim it for this block size. + // If the claim fails assume that another thread claimed it + // for this block size and try to use it anyway, + // but do not update hint. - // If successfully changed assignment of empty superblock 'sb_id' - // to this block_size then update the hint. + sb_id = sb_id_empty ; - const uint32_t state_empty = state_header_mask & *sb_state_array ; + sb_state_array = m_sb_state_array + ( sb_id * m_sb_state_size ); - if ( state_empty == - Kokkos::atomic_compare_exchange - (sb_state_array,state_empty,block_state) ) { + // If successfully changed assignment of empty superblock 'sb_id' + // to this block_size then update the hint. - // If this thread claimed the block then update the hint + const uint32_t state_empty = state_header_mask & *sb_state_array ; + // If this thread claims the empty block then update the hint + update_hint = + state_empty == Kokkos::atomic_compare_exchange - ( hint_sb_id_ptr , uint32_t(hint_sb_id) , uint32_t(sb_id) ); - } - } - else { - // Did not find a potentially usable superblock - --attempt_limit ; - } + (sb_state_array,state_empty,block_state); } - } // end allocation attempt loop + else if ( 0 <= sb_id_large ) { - //-------------------------------------------------------------------- - } - else { - Kokkos::abort("Kokkos MemoryPool allocation request exceeded specified maximum allocation size"); - } + // Found a larger superblock with space available + + sb_id = sb_id_large ; + sb_state = sb_state_large ; + + sb_state_array = m_sb_state_array + ( sb_id * m_sb_state_size ); + } + else { + // Did not find a potentially usable superblock + --attempt_limit ; + } + } + + if ( update_hint ) { + Kokkos::atomic_compare_exchange + ( hint_sb_id_ptr , uint32_t(hint_sb_id) , uint32_t(sb_id) ); + } + } // end allocation attempt loop + //-------------------------------------------------------------------- return p ; } @@ -646,6 +782,8 @@ public: KOKKOS_INLINE_FUNCTION void deallocate( void * p , size_t /* alloc_size */ ) const noexcept { + if ( 0 == p ) return ; + // Determine which superblock and block const ptrdiff_t d = ((char*)p) - ((char*)( m_sb_state_array + m_data_offset )); @@ -669,7 +807,7 @@ public: const uint32_t block_size_lg2 = m_sb_size_lg2 - ( block_state >> state_shift ); - ok_block_aligned = 0 == ( d & ( ( 1 << block_size_lg2 ) - 1 ) ); + ok_block_aligned = 0 == ( d & ( ( 1UL << block_size_lg2 ) - 1 ) ); if ( ok_block_aligned ) { @@ -677,31 +815,70 @@ public: // mask into superblock and then shift down for block index const uint32_t bit = - ( d & ( ptrdiff_t( 1 << m_sb_size_lg2 ) - 1 ) ) >> block_size_lg2 ; + ( d & ( ptrdiff_t( 1LU << m_sb_size_lg2 ) - 1 ) ) >> block_size_lg2 ; const int result = CB::release( sb_state_array , bit , block_state ); ok_dealloc_once = 0 <= result ; -// printf(" deallocate from sb_id(%d) result(%d) bit(%d) state(0x%x)\n" -// , sb_id -// , result -// , uint32_t(d >> block_size_lg2) -// , *sb_state_array ); - +#if 0 + printf( " MemoryPool(0x%lx) pointer(0x%lx) deallocate sb_id(%d) block_size(%d) block_capacity(%d) block_id(%d) block_claimed(%d)\n" + , (uintptr_t)m_sb_state_array + , (uintptr_t)p + , sb_id + , (1u << block_size_lg2) + , (1u << (m_sb_size_lg2 - block_size_lg2)) + , bit + , result ); +#endif } } if ( ! ok_contains || ! ok_block_aligned || ! ok_dealloc_once ) { #if 0 - printf("Kokkos MemoryPool deallocate(0x%lx) contains(%d) block_aligned(%d) dealloc_once(%d)\n",(uintptr_t)p,ok_contains,ok_block_aligned,ok_dealloc_once); + printf( " MemoryPool(0x%lx) pointer(0x%lx) deallocate ok_contains(%d) ok_block_aligned(%d) ok_dealloc_once(%d)\n" + , (uintptr_t)m_sb_state_array + , (uintptr_t)p + , int(ok_contains) + , int(ok_block_aligned) + , int(ok_dealloc_once) ); #endif Kokkos::abort("Kokkos MemoryPool::deallocate given erroneous pointer"); } } // end deallocate //-------------------------------------------------------------------------- + + KOKKOS_INLINE_FUNCTION + int number_of_superblocks() const noexcept { return m_sb_count ; } + + KOKKOS_INLINE_FUNCTION + void superblock_state( int sb_id + , int & block_size + , int & block_count_capacity + , int & block_count_used ) const noexcept + { + block_size = 0 ; + block_count_capacity = 0 ; + block_count_used = 0 ; + + if ( Kokkos::Impl::MemorySpaceAccess + < Kokkos::Impl::ActiveExecutionMemorySpace + , base_memory_space >::accessible ) { + // Can access the state array + + const uint32_t state = + ((uint32_t volatile *)m_sb_state_array)[sb_id*m_sb_state_size]; + + const uint32_t block_count_lg2 = state >> state_shift ; + const uint32_t block_used = state & state_used_mask ; + + block_size = 1LU << ( m_sb_size_lg2 - block_count_lg2 ); + block_count_capacity = 1LU << block_count_lg2 ; + block_count_used = block_used ; + } + } }; } // namespace Kokkos diff --git a/lib/kokkos/core/src/Kokkos_MemoryTraits.hpp b/lib/kokkos/core/src/Kokkos_MemoryTraits.hpp index 94b58b8aff..36170e4a8e 100644 --- a/lib/kokkos/core/src/Kokkos_MemoryTraits.hpp +++ b/lib/kokkos/core/src/Kokkos_MemoryTraits.hpp @@ -72,11 +72,11 @@ struct MemoryTraits { //! Tag this class as a kokkos memory traits: typedef MemoryTraits memory_traits ; - enum { Unmanaged = T & unsigned(Kokkos::Unmanaged) }; - enum { RandomAccess = T & unsigned(Kokkos::RandomAccess) }; - enum { Atomic = T & unsigned(Kokkos::Atomic) }; - enum { Restrict = T & unsigned(Kokkos::Restrict) }; - enum { Aligned = T & unsigned(Kokkos::Aligned) }; + enum : bool { Unmanaged = (unsigned(0) != (T & unsigned(Kokkos::Unmanaged))) }; + enum : bool { RandomAccess = (unsigned(0) != (T & unsigned(Kokkos::RandomAccess))) }; + enum : bool { Atomic = (unsigned(0) != (T & unsigned(Kokkos::Atomic))) }; + enum : bool { Restrict = (unsigned(0) != (T & unsigned(Kokkos::Restrict))) }; + enum : bool { Aligned = (unsigned(0) != (T & unsigned(Kokkos::Aligned))) }; }; @@ -97,22 +97,22 @@ typedef Kokkos::MemoryTraits< Kokkos::Unmanaged | Kokkos::RandomAccess > MemoryR namespace Kokkos { namespace Impl { +static_assert( + ( 0 < int(KOKKOS_MEMORY_ALIGNMENT) ) && + ( 0 == ( int(KOKKOS_MEMORY_ALIGNMENT) & (int(KOKKOS_MEMORY_ALIGNMENT)-1))) , + "KOKKOS_MEMORY_ALIGNMENT must be a power of two" ); + /** \brief Memory alignment settings * * Sets global value for memory alignment. Must be a power of two! * Enable compatibility of views from different devices with static stride. * Use compiler flag to enable overwrites. */ -enum { MEMORY_ALIGNMENT = -#if defined( KOKKOS_MEMORY_ALIGNMENT ) - ( 1 << Kokkos::Impl::integral_power_of_two( KOKKOS_MEMORY_ALIGNMENT ) ) -#else - ( 1 << Kokkos::Impl::integral_power_of_two( 128 ) ) -#endif - , MEMORY_ALIGNMENT_THRESHOLD = 4 +enum : unsigned + { MEMORY_ALIGNMENT = KOKKOS_MEMORY_ALIGNMENT + , MEMORY_ALIGNMENT_THRESHOLD = KOKKOS_MEMORY_ALIGNMENT_THRESHOLD }; - } //namespace Impl } // namespace Kokkos diff --git a/lib/kokkos/core/src/Kokkos_NumericTraits.hpp b/lib/kokkos/core/src/Kokkos_NumericTraits.hpp index 339571941d..7264ba7f38 100644 --- a/lib/kokkos/core/src/Kokkos_NumericTraits.hpp +++ b/lib/kokkos/core/src/Kokkos_NumericTraits.hpp @@ -192,7 +192,7 @@ template<> struct reduction_identity { KOKKOS_FORCEINLINE_FUNCTION constexpr static float sum() {return static_cast(0.0f);} KOKKOS_FORCEINLINE_FUNCTION constexpr static float prod() {return static_cast(1.0f);} - KOKKOS_FORCEINLINE_FUNCTION constexpr static float max() {return FLT_MIN;} + KOKKOS_FORCEINLINE_FUNCTION constexpr static float max() {return -FLT_MAX;} KOKKOS_FORCEINLINE_FUNCTION constexpr static float min() {return FLT_MAX;} }; @@ -200,17 +200,19 @@ template<> struct reduction_identity { KOKKOS_FORCEINLINE_FUNCTION constexpr static double sum() {return static_cast(0.0);} KOKKOS_FORCEINLINE_FUNCTION constexpr static double prod() {return static_cast(1.0);} - KOKKOS_FORCEINLINE_FUNCTION constexpr static double max() {return DBL_MIN;} + KOKKOS_FORCEINLINE_FUNCTION constexpr static double max() {return -DBL_MAX;} KOKKOS_FORCEINLINE_FUNCTION constexpr static double min() {return DBL_MAX;} }; +#if !defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA ) template<> struct reduction_identity { KOKKOS_FORCEINLINE_FUNCTION constexpr static long double sum() {return static_cast(0.0);} KOKKOS_FORCEINLINE_FUNCTION constexpr static long double prod() {return static_cast(1.0);} - KOKKOS_FORCEINLINE_FUNCTION constexpr static long double max() {return LDBL_MIN;} + KOKKOS_FORCEINLINE_FUNCTION constexpr static long double max() {return -LDBL_MAX;} KOKKOS_FORCEINLINE_FUNCTION constexpr static long double min() {return LDBL_MAX;} }; +#endif } diff --git a/lib/kokkos/core/src/Kokkos_OpenMP.hpp b/lib/kokkos/core/src/Kokkos_OpenMP.hpp index 3e11621ce6..d5de01cf2f 100644 --- a/lib/kokkos/core/src/Kokkos_OpenMP.hpp +++ b/lib/kokkos/core/src/Kokkos_OpenMP.hpp @@ -47,10 +47,6 @@ #include #if defined( KOKKOS_ENABLE_OPENMP) -#if !defined(_OPENMP) -#error "You enabled Kokkos OpenMP support without enabling OpenMP in the compiler!" -#endif - #include #include @@ -67,95 +63,144 @@ #include #include +#include + /*--------------------------------------------------------------------------*/ namespace Kokkos { +namespace Impl { +class OpenMPExec; +} + /// \class OpenMP /// \brief Kokkos device for multicore processors in the host memory space. class OpenMP { public: - //------------------------------------ - //! \name Type declarations that all Kokkos devices must provide. - //@{ - //! Tag this class as a kokkos execution space using execution_space = OpenMP; + + using memory_space = #ifdef KOKKOS_ENABLE_HBWSPACE - using memory_space = Experimental::HBWSpace; + Experimental::HBWSpace; #else - using memory_space = HostSpace; + HostSpace; #endif + //! This execution space preferred device_type - using device_type = Kokkos::Device; - - using array_layout = LayoutRight; - using size_type = memory_space::size_type; - + using device_type = Kokkos::Device< execution_space, memory_space >; + using array_layout = LayoutRight; + using size_type = memory_space::size_type; using scratch_memory_space = ScratchMemorySpace< OpenMP >; - //@} - //------------------------------------ - //! \name Functions that all Kokkos execution spaces must implement. - //@{ + /// \brief Get a handle to the default execution space instance + inline + OpenMP() noexcept; - inline static bool in_parallel(); + // Using omp_get_max_threads(); is problematic + // On Intel (essentially an initial call to the OpenMP runtime + // without a parallel region before will set a process mask for a single core + // The runtime will than bind threads for a parallel region to other cores on the + // entering the first parallel region and make the process mask the aggregate of + // the thread masks. The intend seems to be to make serial code run fast, if you + // compile with OpenMP enabled but don't actually use parallel regions or so + // static int omp_max_threads = omp_get_max_threads(); + static int get_current_max_threads() noexcept; - /** \brief Set the device in a "sleep" state. A noop for OpenMP. */ - static bool sleep(); + /// \brief Initialize the default execution space + /// + /// if ( thread_count == -1 ) + /// then use the number of threads that openmp defaults to + /// if ( thread_count == 0 && Kokkos::hwlow_available() ) + /// then use hwloc to choose the number of threads and change + /// the default number of threads + /// if ( thread_count > 0 ) + /// then force openmp to use the given number of threads and change + /// the default number of threads + static void initialize( int thread_count = -1 ); - /** \brief Wake the device from the 'sleep' state. A noop for OpenMP. */ - static bool wake(); - - /** \brief Wait until all dispatched functors complete. A noop for OpenMP. */ - static void fence() {} - - /// \brief Print configuration information to the given output stream. - static void print_configuration( std::ostream & , const bool detail = false ); - - /// \brief Free any resources being consumed by the device. + /// \brief Free any resources being consumed by the default execution space static void finalize(); - /** \brief Initialize the device. - * - * 1) If the hardware locality library is enabled and OpenMP has not - * already bound threads then bind OpenMP threads to maximize - * core utilization and group for memory hierarchy locality. - * - * 2) Allocate a HostThread for each OpenMP thread to hold its - * topology and fan in/out data. - */ - static void initialize( unsigned thread_count = 0 , - unsigned use_numa_count = 0 , - unsigned use_cores_per_numa = 0 ); + /// \brief is the default execution space initialized for current 'master' thread + static bool is_initialized() noexcept; - static int is_initialized(); + /// \brief Print configuration information to the given output stream. + static void print_configuration( std::ostream & , const bool verbose = false ); - /** \brief Return the maximum amount of concurrency. */ - static int concurrency(); + /// \brief is the instance running a parallel algorithm + inline + static bool in_parallel( OpenMP const& = OpenMP() ) noexcept; - //@} - //------------------------------------ - /** \brief This execution space has a topological thread pool which can be queried. - * - * All threads within a pool have a common memory space for which they are cache coherent. - * depth = 0 gives the number of threads in the whole pool. - * depth = 1 gives the number of threads in a NUMA region, typically sharing L3 cache. - * depth = 2 gives the number of threads at the finest granularity, typically sharing L1 cache. - */ - inline static int thread_pool_size( int depth = 0 ); + /// \brief Wait until all dispatched functors complete on the given instance + /// + /// This is a no-op on OpenMP + inline + static void fence( OpenMP const& = OpenMP() ) noexcept; + + /// \brief Does the given instance return immediately after launching + /// a parallel algorithm + /// + /// This always returns false on OpenMP + inline + static bool is_asynchronous( OpenMP const& = OpenMP() ) noexcept; + + + /// \brief Partition the default instance into new instances without creating + /// new masters + /// + /// This is a no-op on OpenMP since the default instance cannot be partitioned + /// without promoting other threads to 'master' + static std::vector partition(...); + + /// Non-default instances should be ref-counted so that when the last + /// is destroyed the instance resources are released + /// + /// This is a no-op on OpenMP since a non default instance cannot be created + static OpenMP create_instance(...); + + /// \brief Partition the default instance and call 'f' on each new 'master' thread + /// + /// Func is a functor with the following signiture + /// void( int partition_id, int num_partitions ) + template + static void partition_master( F const& f + , int requested_num_partitions = 0 + , int requested_partition_size = 0 + ); + + inline + static int thread_pool_size() noexcept; /** \brief The rank of the executing thread in this thread pool */ - KOKKOS_INLINE_FUNCTION static int thread_pool_rank(); + KOKKOS_INLINE_FUNCTION + static int thread_pool_rank() noexcept; - //------------------------------------ +#if !defined( KOKKOS_DISABLE_DEPRECATED ) + /// \brief Initialize the default execution space + static void initialize( int thread_count, + int use_numa_count, + int use_cores_per_numa = 0); - inline static unsigned max_hardware_threads() { return thread_pool_size(0); } + inline + static int thread_pool_size( int depth ); - KOKKOS_INLINE_FUNCTION static - unsigned hardware_thread_id() { return thread_pool_rank(); } + static void sleep() {}; + static void wake() {}; - static const char* name(); + // use UniqueToken + static int concurrency(); + + // use UniqueToken + inline + static int max_hardware_threads() noexcept; + + // use UniqueToken + KOKKOS_INLINE_FUNCTION + static int hardware_thread_id() noexcept; +#endif + + static constexpr const char* name() noexcept { return "OpenMP"; } }; } // namespace Kokkos @@ -195,6 +240,7 @@ struct VerifyExecutionCanAccessMemorySpace /*--------------------------------------------------------------------------*/ #include +#include #include #include diff --git a/lib/kokkos/core/src/Kokkos_Pair.hpp b/lib/kokkos/core/src/Kokkos_Pair.hpp index 067767f2f8..b6b1596883 100644 --- a/lib/kokkos/core/src/Kokkos_Pair.hpp +++ b/lib/kokkos/core/src/Kokkos_Pair.hpp @@ -78,7 +78,7 @@ struct pair /// This calls the default constructors of T1 and T2. It won't /// compile if those default constructors are not defined and /// public. - KOKKOS_FORCEINLINE_FUNCTION constexpr + KOKKOS_FUNCTION_DEFAULTED constexpr pair() = default ; /// \brief Constructor that takes both elements of the pair. @@ -458,7 +458,7 @@ struct pair first_type first; enum { second = 0 }; - KOKKOS_FORCEINLINE_FUNCTION constexpr + KOKKOS_FUNCTION_DEFAULTED constexpr pair() = default ; KOKKOS_FORCEINLINE_FUNCTION constexpr diff --git a/lib/kokkos/core/src/Kokkos_Parallel.hpp b/lib/kokkos/core/src/Kokkos_Parallel.hpp index e412e608b2..0ceae866c4 100644 --- a/lib/kokkos/core/src/Kokkos_Parallel.hpp +++ b/lib/kokkos/core/src/Kokkos_Parallel.hpp @@ -177,22 +177,23 @@ void parallel_for( const ExecPolicy & policy ) { #if defined(KOKKOS_ENABLE_PROFILING) - uint64_t kpID = 0; - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::beginParallelFor("" == str ? typeid(FunctorType).name() : str, 0, &kpID); - } + uint64_t kpID = 0; + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Impl::ParallelConstructName name(str); + Kokkos::Profiling::beginParallelFor(name.get(), 0, &kpID); + } #endif - Kokkos::Impl::shared_allocation_tracking_claim_and_disable(); + Kokkos::Impl::shared_allocation_tracking_disable(); Impl::ParallelFor< FunctorType , ExecPolicy > closure( functor , policy ); - Kokkos::Impl::shared_allocation_tracking_release_and_enable(); + Kokkos::Impl::shared_allocation_tracking_enable(); closure.execute(); #if defined(KOKKOS_ENABLE_PROFILING) - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::endParallelFor(kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::endParallelFor(kpID); + } #endif } @@ -210,14 +211,15 @@ void parallel_for( const size_t work_count #if defined(KOKKOS_ENABLE_PROFILING) uint64_t kpID = 0; - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::beginParallelFor("" == str ? typeid(FunctorType).name() : str, 0, &kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Impl::ParallelConstructName name(str); + Kokkos::Profiling::beginParallelFor(name.get(), 0, &kpID); + } #endif - Kokkos::Impl::shared_allocation_tracking_claim_and_disable(); + Kokkos::Impl::shared_allocation_tracking_disable(); Impl::ParallelFor< FunctorType , policy > closure( functor , policy(0,work_count) ); - Kokkos::Impl::shared_allocation_tracking_release_and_enable(); + Kokkos::Impl::shared_allocation_tracking_enable(); closure.execute(); @@ -239,7 +241,7 @@ void parallel_for( const std::string & str std::cout << "KOKKOS_DEBUG Start parallel_for kernel: " << str << std::endl; #endif - parallel_for(policy,functor,str); + ::Kokkos::parallel_for(policy,functor,str); #if KOKKOS_ENABLE_DEBUG_PRINT_KERNEL_NAMES Kokkos::fence(); @@ -420,21 +422,22 @@ void parallel_scan( const ExecutionPolicy & policy { #if defined(KOKKOS_ENABLE_PROFILING) uint64_t kpID = 0; - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::beginParallelScan("" == str ? typeid(FunctorType).name() : str, 0, &kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Impl::ParallelConstructName name(str); + Kokkos::Profiling::beginParallelScan(name.get(), 0, &kpID); + } #endif - Kokkos::Impl::shared_allocation_tracking_claim_and_disable(); + Kokkos::Impl::shared_allocation_tracking_disable(); Impl::ParallelScan< FunctorType , ExecutionPolicy > closure( functor , policy ); - Kokkos::Impl::shared_allocation_tracking_release_and_enable(); + Kokkos::Impl::shared_allocation_tracking_enable(); closure.execute(); #if defined(KOKKOS_ENABLE_PROFILING) - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::endParallelScan(kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::endParallelScan(kpID); + } #endif } @@ -453,21 +456,22 @@ void parallel_scan( const size_t work_count #if defined(KOKKOS_ENABLE_PROFILING) uint64_t kpID = 0; - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::beginParallelScan("" == str ? typeid(FunctorType).name() : str, 0, &kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Impl::ParallelConstructName name(str); + Kokkos::Profiling::beginParallelScan(name.get(), 0, &kpID); + } #endif - Kokkos::Impl::shared_allocation_tracking_claim_and_disable(); + Kokkos::Impl::shared_allocation_tracking_disable(); Impl::ParallelScan< FunctorType , policy > closure( functor , policy(0,work_count) ); - Kokkos::Impl::shared_allocation_tracking_release_and_enable(); + Kokkos::Impl::shared_allocation_tracking_enable(); closure.execute(); #if defined(KOKKOS_ENABLE_PROFILING) - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::endParallelScan(kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::endParallelScan(kpID); + } #endif } @@ -483,7 +487,7 @@ void parallel_scan( const std::string& str std::cout << "KOKKOS_DEBUG Start parallel_scan kernel: " << str << std::endl; #endif - parallel_scan(policy,functor,str); + ::Kokkos::parallel_scan(policy,functor,str); #if KOKKOS_ENABLE_DEBUG_PRINT_KERNEL_NAMES Kokkos::fence(); diff --git a/lib/kokkos/core/src/Kokkos_Parallel_Reduce.hpp b/lib/kokkos/core/src/Kokkos_Parallel_Reduce.hpp index 8ea5183e35..c392fc5b9a 100644 --- a/lib/kokkos/core/src/Kokkos_Parallel_Reduce.hpp +++ b/lib/kokkos/core/src/Kokkos_Parallel_Reduce.hpp @@ -872,13 +872,14 @@ namespace Impl { const FunctorType& functor, ReturnType& return_value) { #if defined(KOKKOS_ENABLE_PROFILING) - uint64_t kpID = 0; - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::beginParallelReduce("" == label ? typeid(FunctorType).name() : label, 0, &kpID); - } + uint64_t kpID = 0; + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Impl::ParallelConstructName name(label); + Kokkos::Profiling::beginParallelReduce(name.get(), 0, &kpID); + } #endif - Kokkos::Impl::shared_allocation_tracking_claim_and_disable(); + Kokkos::Impl::shared_allocation_tracking_disable(); #ifdef KOKKOS_IMPL_NEED_FUNCTOR_WRAPPER Impl::ParallelReduce closure(functor_adaptor::functor(functor), @@ -890,13 +891,13 @@ namespace Impl { policy, return_value_adapter::return_value(return_value,functor)); #endif - Kokkos::Impl::shared_allocation_tracking_release_and_enable(); + Kokkos::Impl::shared_allocation_tracking_enable(); closure.execute(); #if defined(KOKKOS_ENABLE_PROFILING) - if(Kokkos::Profiling::profileLibraryLoaded()) { - Kokkos::Profiling::endParallelReduce(kpID); - } + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::endParallelReduce(kpID); + } #endif } @@ -1015,7 +1016,7 @@ parallel_reduce( std::string const & arg_label //------------------------------ - #if (KOKKOS_ENABLE_PROFILING) + #if defined(KOKKOS_ENABLE_PROFILING) uint64_t kpID = 0; if(Kokkos::Profiling::profileLibraryLoaded()) { Kokkos::Profiling::beginParallelReduce(arg_label, 0, &kpID); @@ -1041,7 +1042,7 @@ parallel_reduce( std::string const & arg_label //------------------------------ - #if (KOKKOS_ENABLE_PROFILING) + #if defined(KOKKOS_ENABLE_PROFILING) if(Kokkos::Profiling::profileLibraryLoaded()) { Kokkos::Profiling::endParallelReduce(kpID); } diff --git a/lib/kokkos/core/src/Kokkos_Profiling_ProfileSection.hpp b/lib/kokkos/core/src/Kokkos_Profiling_ProfileSection.hpp new file mode 100644 index 0000000000..b5e58507d6 --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_Profiling_ProfileSection.hpp @@ -0,0 +1,111 @@ +/* + //@HEADER + // ************************************************************************ + // + // Kokkos v. 2.0 + // Copyright (2014) Sandia Corporation + // + // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, + // 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) + // + // ************************************************************************ + //@HEADER + */ + +#ifndef KOKKOSP_PROFILE_SECTION_HPP +#define KOKKOSP_PROFILE_SECTION_HPP + +#include +#include + +#include + +namespace Kokkos { +namespace Profiling { + +class ProfilingSection { + +public: + ProfilingSection(const std::string& sectionName) : + secName(sectionName) { + + #if defined( KOKKOS_ENABLE_PROFILING ) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::createProfileSection(secName, &secID); + } + #else + secID = 0; + #endif + } + + void start() { + #if defined( KOKKOS_ENABLE_PROFILING ) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::startSection(secID); + } + #endif + } + + void stop() { + #if defined( KOKKOS_ENABLE_PROFILING ) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::stopSection(secID); + } + #endif + } + + ~ProfilingSection() { + #if defined( KOKKOS_ENABLE_PROFILING ) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::destroyProfileSection(secID); + } + #endif + } + + std::string getName() { + return secName; + } + + uint32_t getSectionID() { + return secID; + } + +protected: + const std::string secName; + uint32_t secID; + +}; + +} +} + +#endif \ No newline at end of file diff --git a/lib/kokkos/core/src/Kokkos_ROCm.hpp b/lib/kokkos/core/src/Kokkos_ROCm.hpp new file mode 100644 index 0000000000..6effbb6090 --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_ROCm.hpp @@ -0,0 +1,238 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_ROCM_HPP +#define KOKKOS_ROCM_HPP + +#include + +#if defined( KOKKOS_ENABLE_ROCM ) +#include +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*--------------------------------------------------------------------------*/ + +#include +#include +#include + +#if defined( __HCC_ACCELERATOR__ ) + +using namespace ::Concurrency::precise_math ; + +#endif + +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Impl { +class ROCmExec ; +} // namespace Impl +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Experimental { +/// \class ROCm +/// \brief Kokkos device for multicore processors in the host memory space. +class ROCm { +public: + //------------------------------------ + //! \name Type declarations that all Kokkos devices must provide. + //@{ + + //! Tag this class as a kokkos execution space + typedef ROCm execution_space ; + typedef ROCmSpace memory_space ; + typedef Kokkos::Device device_type; + + typedef LayoutLeft array_layout ; + typedef HostSpace::size_type size_type ; + + typedef ScratchMemorySpace< ROCm > scratch_memory_space ; + + ~ROCm() {} + ROCm(); +// explicit ROCm( const int instance_id ); + + ROCm( ROCm && ) = default ; + ROCm( const ROCm & ) = default ; + ROCm & operator = ( ROCm && ) = default ; + ROCm & operator = ( const ROCm & ) = default ; + + + //@} + //------------------------------------ + //! \name Functions that all Kokkos devices must implement. + //@{ + + KOKKOS_INLINE_FUNCTION static int in_parallel() { +#if defined( __HCC_ACCELERATOR__ ) + return true; +#else + return false; +#endif + } + + /** \brief Set the device in a "sleep" state. */ + static bool sleep() ; + + /** \brief Wake the device from the 'sleep' state. A noop for OpenMP. */ + static bool wake() ; + + /** \brief Wait until all dispatched functors complete. A noop for OpenMP. */ + static void fence() ; + + /// \brief Print configuration information to the given output stream. + static void print_configuration( std::ostream & , const bool detail = false ); + + /// \brief Free any resources being consumed by the device. + static void finalize() ; + + /** \brief Initialize the device. + * + */ + struct SelectDevice { + int rocm_device_id ; + SelectDevice() : rocm_device_id(1) {} + explicit SelectDevice( int id ) : rocm_device_id( id+1 ) {} + }; + + int rocm_device() const { return m_device ; } + bool isAPU(); + bool isAPU(int device); + + static void initialize( const SelectDevice = SelectDevice()); + + static int is_initialized(); + +// static size_type device_arch(); + +// static size_type detect_device_count(); + + + static int concurrency() ; + static const char* name(); +private: + int m_device ; + +}; +} +} // namespace Kokkos + +namespace Kokkos { +namespace Impl { + +template<> +struct MemorySpaceAccess + < Kokkos::Experimental::ROCmSpace + , Kokkos::Experimental::ROCm::scratch_memory_space + > +{ + enum { assignable = false }; + enum { accessible = true }; + enum { deepcopy = false }; +}; + +template<> +struct VerifyExecutionCanAccessMemorySpace + < Kokkos::Experimental::ROCm::memory_space + , Kokkos::Experimental::ROCm::scratch_memory_space + > +{ + enum { value = true }; + KOKKOS_INLINE_FUNCTION static void verify( void ) { } + KOKKOS_INLINE_FUNCTION static void verify( const void * ) { } +}; + +template<> +struct VerifyExecutionCanAccessMemorySpace + < Kokkos::HostSpace + , Kokkos::Experimental::ROCm::scratch_memory_space + > +{ + enum { value = false }; + inline static void verify( void ) { Kokkos::Experimental::ROCmSpace::access_error(); } + inline static void verify( const void * p ) { Kokkos::Experimental::ROCmSpace::access_error(p); } +}; +} // namespace Experimental +} // namespace Kokkos + + + +#define threadIdx_x (hc_get_workitem_id(0)) +#define threadIdx_y (hc_get_workitem_id(1)) +#define threadIdx_z (hc_get_workitem_id(2)) + +#define blockIdx_x (hc_get_group_id(0)) +#define blockIdx_y (hc_get_group_id(1)) +#define blockIdx_z (hc_get_group_id(2)) + +#define blockDim_x (hc_get_group_size(0)) +#define blockDim_y (hc_get_group_size(1)) +#define blockDim_z (hc_get_group_size(2)) + +#define gridDim_x (hc_get_num_groups(0)) +#define gridDim_y (hc_get_num_groups(1)) +#define gridDim_z (hc_get_num_groups(2)) + + +#include +#include + +#endif +#endif + + diff --git a/lib/kokkos/core/src/Kokkos_ROCmSpace.hpp b/lib/kokkos/core/src/Kokkos_ROCmSpace.hpp new file mode 100644 index 0000000000..dce6a3cb3f --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_ROCmSpace.hpp @@ -0,0 +1,622 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_ROCMSPACE_HPP +#define KOKKOS_ROCMSPACE_HPP + +#include + +#if defined( KOKKOS_ENABLE_ROCM ) + +#include +#include +#include + +#include + + +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Experimental { +/** \brief ROCm on-device memory management */ + +class ROCmSpace { +public: + + //! Tag this class as a kokkos memory space + typedef ROCmSpace memory_space ; + typedef Kokkos::Experimental::ROCm execution_space ; + typedef Kokkos::Device device_type; + + typedef unsigned int size_type ; + + /*--------------------------------*/ + + ROCmSpace(); + ROCmSpace( ROCmSpace && rhs ) = default ; + ROCmSpace( const ROCmSpace & rhs ) = default ; + ROCmSpace & operator = ( ROCmSpace && rhs ) = default ; + ROCmSpace & operator = ( const ROCmSpace & rhs ) = default ; + ~ROCmSpace() = default ; + + /**\brief Allocate untracked memory in the rocm space */ + void * allocate( const size_t arg_alloc_size ) const ; + + /**\brief Deallocate untracked memory in the rocm space */ + void deallocate( void * const arg_alloc_ptr + , const size_t arg_alloc_size ) const ; + + /**\brief Return Name of the MemorySpace */ + static constexpr const char* name() { return m_name; }; + + /*--------------------------------*/ + /** \brief Error reporting for HostSpace attempt to access ROCmSpace */ + static void access_error(); + static void access_error( const void * const ); + +private: + + int m_device ; ///< Which ROCm device + + static constexpr const char* m_name = "ROCm"; + friend class Kokkos::Impl::SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void > ; +}; + +} // namespace Experimental + +namespace Impl { + +void * rocm_device_allocate(int); +void * rocm_hostpinned_allocate(int); +void rocm_device_free(void * ); + +/// \brief Initialize lock array for arbitrary size atomics. +/// +/// Arbitrary atomics are implemented using a hash table of locks +/// where the hash value is derived from the address of the +/// object for which an atomic operation is performed. +/// This function initializes the locks to zero (unset). +void init_lock_arrays_rocm_space(); + +/// \brief Retrieve the pointer to the lock array for arbitrary size atomics. +/// +/// Arbitrary atomics are implemented using a hash table of locks +/// where the hash value is derived from the address of the +/// object for which an atomic operation is performed. +/// This function retrieves the lock array pointer. +/// If the array is not yet allocated it will do so. +int* atomic_lock_array_rocm_space_ptr(bool deallocate = false); + +/// \brief Retrieve the pointer to the scratch array for team and thread private global memory. +/// +/// Team and Thread private scratch allocations in +/// global memory are aquired via locks. +/// This function retrieves the lock array pointer. +/// If the array is not yet allocated it will do so. +int* scratch_lock_array_rocm_space_ptr(bool deallocate = false); + +/// \brief Retrieve the pointer to the scratch array for unique identifiers. +/// +/// Unique identifiers in the range 0-ROCm::concurrency +/// are provided via locks. +/// This function retrieves the lock array pointer. +/// If the array is not yet allocated it will do so. +int* threadid_lock_array_rocm_space_ptr(bool deallocate = false); +} +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + + +namespace Kokkos { +namespace Experimental { +/** \brief Host memory that is accessible to ROCm execution space + * through ROCm's host-pinned memory allocation. + */ +class ROCmHostPinnedSpace { +public: + + //! Tag this class as a kokkos memory space + /** \brief Memory is in HostSpace so use the HostSpace::execution_space */ + typedef HostSpace::execution_space execution_space ; + typedef ROCmHostPinnedSpace memory_space ; + typedef Kokkos::Device device_type; + typedef unsigned int size_type ; + + /*--------------------------------*/ + + ROCmHostPinnedSpace(); + ROCmHostPinnedSpace( ROCmHostPinnedSpace && rhs ) = default ; + ROCmHostPinnedSpace( const ROCmHostPinnedSpace & rhs ) = default ; + ROCmHostPinnedSpace & operator = ( ROCmHostPinnedSpace && rhs ) = default ; + ROCmHostPinnedSpace & operator = ( const ROCmHostPinnedSpace & rhs ) = default ; + ~ROCmHostPinnedSpace() = default ; + + /**\brief Allocate untracked memory in the space */ + void * allocate( const size_t arg_alloc_size ) const ; + + /**\brief Deallocate untracked memory in the space */ + void deallocate( void * const arg_alloc_ptr + , const size_t arg_alloc_size ) const ; + + /**\brief Return Name of the MemorySpace */ + static constexpr const char* name() { return m_name; }; + +private: + + static constexpr const char* m_name = "ROCmHostPinned"; + + /*--------------------------------*/ +}; +} // namespace Experimental +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Impl { + +static_assert( Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmSpace >::assignable , "" ); + +//---------------------------------------- + +template<> +struct MemorySpaceAccess< Kokkos::HostSpace , Kokkos::Experimental::ROCmSpace > { + enum { assignable = false }; + enum { accessible = false }; + enum { deepcopy = true }; +}; + +template<> +struct MemorySpaceAccess< Kokkos::HostSpace , Kokkos::Experimental::ROCmHostPinnedSpace > { + // HostSpace::execution_space == ROCmHostPinnedSpace::execution_space + enum { assignable = true }; + enum { accessible = true }; + enum { deepcopy = true }; +}; + +//---------------------------------------- + +template<> +struct MemorySpaceAccess< Kokkos::Experimental::ROCmSpace , Kokkos::HostSpace > { + enum { assignable = false }; + enum { accessible = false }; + enum { deepcopy = true }; +}; + +template<> +struct MemorySpaceAccess< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmHostPinnedSpace > { + // ROCmSpace::execution_space != ROCmHostPinnedSpace::execution_space + enum { assignable = false }; + enum { accessible = true }; // ROCmSpace::execution_space + enum { deepcopy = true }; +}; + + +//---------------------------------------- +// ROCmHostPinnedSpace::execution_space == HostSpace::execution_space +// ROCmHostPinnedSpace accessible to both ROCm and Host + +template<> +struct MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::HostSpace > { + enum { assignable = false }; // Cannot access from ROCm + enum { accessible = true }; // ROCmHostPinnedSpace::execution_space + enum { deepcopy = true }; +}; + +template<> +struct MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCmSpace > { + enum { assignable = false }; // Cannot access from Host + enum { accessible = false }; + enum { deepcopy = true }; +}; + +}; +//---------------------------------------- + +} // namespace Kokkos::Impl + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Impl { + +hc::completion_future DeepCopyAsyncROCm( void * dst , const void * src , size_t n); + +template<> struct DeepCopy< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCm> +{ + DeepCopy( void * dst , const void * src , size_t ); + DeepCopy( const Kokkos::Experimental::ROCm & , void * dst , const void * src , size_t ); +}; + +template<> struct DeepCopy< Kokkos::Experimental::ROCmSpace , HostSpace , Kokkos::Experimental::ROCm > +{ + DeepCopy( void * dst , const void * src , size_t ); + DeepCopy( const Kokkos::Experimental::ROCm & , void * dst , const void * src , size_t ); +}; + +template<> struct DeepCopy< HostSpace , Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCm > +{ + DeepCopy( void * dst , const void * src , size_t ); + DeepCopy( const Kokkos::Experimental::ROCm & , void * dst , const void * src , size_t ); +}; + +template struct DeepCopy< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCm >( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + hc::completion_future fut = DeepCopyAsyncROCm (dst,src,n); + fut.wait(); +// DeepCopy (dst,src,n); + } +}; + +template struct DeepCopy< Kokkos::Experimental::ROCmSpace , HostSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< Kokkos::Experimental::ROCmSpace , HostSpace , Kokkos::Experimental::ROCm>( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + DeepCopy (dst,src,n); + } +}; + +template +struct DeepCopy< HostSpace , Kokkos::Experimental::ROCmSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< HostSpace , Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCm >( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + DeepCopy (dst,src,n); + } +}; + +template<> struct DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCm> +{ + DeepCopy( void * dst , const void * src , size_t ); + DeepCopy( const Kokkos::Experimental::ROCm & , void * dst , const void * src , size_t ); +}; + +template<> struct DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , HostSpace , Kokkos::Experimental::ROCm > +{ + DeepCopy( void * dst , const void * src , size_t ); + DeepCopy( const Kokkos::Experimental::ROCm & , void * dst , const void * src , size_t ); +}; + +template<> struct DeepCopy< HostSpace , Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCm > +{ + DeepCopy( void * dst , const void * src , size_t ); + DeepCopy( const Kokkos::Experimental::ROCm & , void * dst , const void * src , size_t ); +}; + +template +struct DeepCopy< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmHostPinnedSpace , ExecutionSpace> +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< Kokkos::Experimental::ROCmSpace , HostSpace , Kokkos::Experimental::ROCm >( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + hc::completion_future fut = DeepCopyAsyncROCm (dst,src,n); + fut.wait(); +// DeepCopyROCm (dst,src,n); + } +}; + +template struct DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCmSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< HostSpace , Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCm >( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + hc::completion_future fut = DeepCopyAsyncROCm (dst,src,n); + fut.wait(); +// DeepCopyROCm (dst,src,n); + } +}; + + + +template struct DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCmHostPinnedSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCm >( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); +// hc::completion_future fut = DeepCopyAsyncROCm (dst,src,n); +// fut.wait(); +// DeepCopyAsyncROCm (dst,src,n); + DeepCopy (dst,src,n); + } +}; + +template struct DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , HostSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< Kokkos::Experimental::ROCmHostPinnedSpace , HostSpace , Kokkos::Experimental::ROCm>( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + DeepCopy (dst,src,n); + } +}; + +template +struct DeepCopy< HostSpace , Kokkos::Experimental::ROCmHostPinnedSpace , ExecutionSpace > +{ + inline + DeepCopy( void * dst , const void * src , size_t n ) + { (void) DeepCopy< HostSpace , Kokkos::Experimental::ROCmHostPinnedSpace , Kokkos::Experimental::ROCm >( dst , src , n ); } + + inline + DeepCopy( const ExecutionSpace& exec, void * dst , const void * src , size_t n ) + { + exec.fence(); + DeepCopy (dst,src,n); + } +}; +} // namespace Impl +} // namespace Kokkos + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +/** Running in ROCmSpace attempting to access HostSpace: error */ +template<> +struct VerifyExecutionCanAccessMemorySpace< Kokkos::Experimental::ROCmSpace , Kokkos::HostSpace > +{ + enum { value = false }; + KOKKOS_INLINE_FUNCTION static void verify( void ) + { Kokkos::abort("ROCm code attempted to access HostSpace memory"); } + + KOKKOS_INLINE_FUNCTION static void verify( const void * ) + { Kokkos::abort("ROCm code attempted to access HostSpace memory"); } +}; + +/** Running in ROCmSpace accessing ROCmHostPinnedSpace: ok */ +template<> +struct VerifyExecutionCanAccessMemorySpace< Kokkos::Experimental::ROCmSpace , Kokkos::Experimental::ROCmHostPinnedSpace > +{ + enum { value = true }; + KOKKOS_INLINE_FUNCTION static void verify( void ) { } + KOKKOS_INLINE_FUNCTION static void verify( const void * ) { } +}; + +/** Running in ROCmSpace attempting to access an unknown space: error */ +template< class OtherSpace > +struct VerifyExecutionCanAccessMemorySpace< + typename enable_if< ! is_same::value , Kokkos::Experimental::ROCmSpace >::type , + OtherSpace > +{ + enum { value = false }; + KOKKOS_INLINE_FUNCTION static void verify( void ) + { Kokkos::abort("ROCm code attempted to access unknown Space memory"); } + + KOKKOS_INLINE_FUNCTION static void verify( const void * ) + { Kokkos::abort("ROCm code attempted to access unknown Space memory"); } +}; + +//---------------------------------------------------------------------------- +/** Running in HostSpace attempting to access ROCmSpace */ +template<> +struct VerifyExecutionCanAccessMemorySpace< Kokkos::HostSpace , Kokkos::Experimental::ROCmSpace > +{ + enum { value = false }; + inline static void verify( void ) { Kokkos::Experimental::ROCmSpace::access_error(); } + inline static void verify( const void * p ) { Kokkos::Experimental::ROCmSpace::access_error(p); } +}; + +/** Running in HostSpace accessing ROCmHostPinnedSpace is OK */ +template<> +struct VerifyExecutionCanAccessMemorySpace< Kokkos::HostSpace , Kokkos::Experimental::ROCmHostPinnedSpace > +{ + enum { value = true }; + KOKKOS_INLINE_FUNCTION static void verify( void ) {} + KOKKOS_INLINE_FUNCTION static void verify( const void * ) {} +}; +} // namespace Impl +} // namespace Kokkos + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +template<> +class SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void > + : public SharedAllocationRecord< void , void > +{ +private: + + + typedef SharedAllocationRecord< void , void > RecordBase ; + + SharedAllocationRecord( const SharedAllocationRecord & ) = delete ; + SharedAllocationRecord & operator = ( const SharedAllocationRecord & ) = delete ; + + static void deallocate( RecordBase * ); + + static RecordBase s_root_record ; + + const Kokkos::Experimental::ROCmSpace m_space ; + +protected: + + ~SharedAllocationRecord(); + + SharedAllocationRecord( const Kokkos::Experimental::ROCmSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + , const RecordBase::function_type arg_dealloc = & deallocate + ); + +public: + + std::string get_label() const ; + + static SharedAllocationRecord * allocate( const Kokkos::Experimental::ROCmSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size ); + + /**\brief Allocate tracked memory in the space */ + static + void * allocate_tracked( const Kokkos::Experimental::ROCmSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size ); + + /**\brief Reallocate tracked memory in the space */ + static + void * reallocate_tracked( void * const arg_alloc_ptr + , const size_t arg_alloc_size ); + + /**\brief Deallocate tracked memory in the space */ + static + void deallocate_tracked( void * const arg_alloc_ptr ); + + static SharedAllocationRecord * get_record( void * arg_alloc_ptr ); + + static void print_records( std::ostream & , const Kokkos::Experimental::ROCmSpace & , bool detail = false ); +}; + +template<> +class SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void > + : public SharedAllocationRecord< void , void > +{ +private: + + typedef SharedAllocationRecord< void , void > RecordBase ; + + SharedAllocationRecord( const SharedAllocationRecord & ) = delete ; + SharedAllocationRecord & operator = ( const SharedAllocationRecord & ) = delete ; + + static void deallocate( RecordBase * ); + + static RecordBase s_root_record ; + + const Kokkos::Experimental::ROCmHostPinnedSpace m_space ; + +protected: + + ~SharedAllocationRecord(); + SharedAllocationRecord() : RecordBase(), m_space() {} + + SharedAllocationRecord( const Kokkos::Experimental::ROCmHostPinnedSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + , const RecordBase::function_type arg_dealloc = & deallocate + ); + +public: + + std::string get_label() const ; + + static SharedAllocationRecord * allocate( const Kokkos::Experimental::ROCmHostPinnedSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + ); + /**\brief Allocate tracked memory in the space */ + static + void * allocate_tracked( const Kokkos::Experimental::ROCmHostPinnedSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size ); + + /**\brief Reallocate tracked memory in the space */ + static + void * reallocate_tracked( void * const arg_alloc_ptr + , const size_t arg_alloc_size ); + + /**\brief Deallocate tracked memory in the space */ + static + void deallocate_tracked( void * const arg_alloc_ptr ); + + + static SharedAllocationRecord * get_record( void * arg_alloc_ptr ); + + static void print_records( std::ostream & , const Kokkos::Experimental::ROCmHostPinnedSpace & , bool detail = false ); +}; +} // namespace Impl +} // namespace Kokkos + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +#endif /* #if defined( KOKKOS_ENABLE_ROCM ) */ +#endif /* #define KOKKOS_ROCMSPACE_HPP */ + diff --git a/lib/kokkos/core/src/Kokkos_Serial.hpp b/lib/kokkos/core/src/Kokkos_Serial.hpp index 73e8ae3030..e713461f8d 100644 --- a/lib/kokkos/core/src/Kokkos_Serial.hpp +++ b/lib/kokkos/core/src/Kokkos_Serial.hpp @@ -66,6 +66,7 @@ #include +#include namespace Kokkos { @@ -144,7 +145,7 @@ public: unsigned use_cores_per_numa = 0 , bool allow_asynchronous_threadpool = false); - static int is_initialized(); + static bool is_initialized(); /** \brief Return the maximum amount of concurrency. */ static int concurrency() {return 1;}; @@ -423,11 +424,13 @@ private: typedef typename Policy::work_tag WorkTag ; typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; typedef FunctorAnalysis< FunctorPatternInterface::REDUCE , Policy , FunctorType > Analysis ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTag > ValueInit ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; typedef typename Analysis::pointer_type pointer_type ; typedef typename Analysis::reference_type reference_type ; @@ -487,7 +490,7 @@ public: this-> template exec< WorkTag >( update ); - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >:: + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >:: final( ReducerConditional::select(m_functor , m_reducer) , ptr ); } @@ -526,6 +529,7 @@ public: } }; + /*--------------------------------------------------------------------------*/ template< class FunctorType , class ... Traits > @@ -604,6 +608,179 @@ public: {} }; +} // namespace Impl +} // namespace Kokkos + + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ +/* Parallel patterns for Kokkos::Serial with MDRangePolicy */ + +namespace Kokkos { +namespace Impl { + +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType , + Kokkos::MDRangePolicy< Traits ... > , + Kokkos::Serial + > +{ +private: + + typedef Kokkos::MDRangePolicy< Traits ... > MDRangePolicy ; + typedef typename MDRangePolicy::impl_range_policy Policy ; + + typedef typename Kokkos::Impl::HostIterateTile< MDRangePolicy, FunctorType, typename MDRangePolicy::work_tag, void > iterate_type; + + const FunctorType m_functor ; + const MDRangePolicy m_mdr_policy ; + const Policy m_policy ; + + void + exec() const + { + const typename Policy::member_type e = m_policy.end(); + for ( typename Policy::member_type i = m_policy.begin() ; i < e ; ++i ) { + iterate_type( m_mdr_policy, m_functor )( i ); + } + } + +public: + + inline + void execute() const + { this->exec(); } + + inline + ParallelFor( const FunctorType & arg_functor + , const MDRangePolicy & arg_policy ) + : m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + {} +}; + + +template< class FunctorType , class ReducerType , class ... Traits > +class ParallelReduce< FunctorType + , Kokkos::MDRangePolicy< Traits ... > + , ReducerType + , Kokkos::Serial + > +{ +private: + + typedef Kokkos::MDRangePolicy< Traits ... > MDRangePolicy ; + typedef typename MDRangePolicy::impl_range_policy Policy ; + + typedef typename MDRangePolicy::work_tag WorkTag ; + + typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; + + typedef typename ReducerTypeFwd::value_type ValueType; + + typedef FunctorAnalysis< FunctorPatternInterface::REDUCE , Policy , FunctorType > Analysis ; + + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; + + typedef typename Analysis::pointer_type pointer_type ; + typedef typename Analysis::reference_type reference_type ; + + + using iterate_type = typename Kokkos::Impl::HostIterateTile< MDRangePolicy + , FunctorType + , WorkTag + , ValueType + >; + + + const FunctorType m_functor ; + const MDRangePolicy m_mdr_policy ; + const Policy m_policy ; + const ReducerType m_reducer ; + const pointer_type m_result_ptr ; + + inline + void + exec( reference_type update ) const + { + const typename Policy::member_type e = m_policy.end(); + for ( typename Policy::member_type i = m_policy.begin() ; i < e ; ++i ) { + iterate_type( m_mdr_policy, m_functor, update )( i ); + } + } + +public: + + inline + void execute() const + { + const size_t pool_reduce_size = + Analysis::value_size( ReducerConditional::select(m_functor , m_reducer) ); + const size_t team_reduce_size = 0 ; // Never shrinks + const size_t team_shared_size = 0 ; // Never shrinks + const size_t thread_local_size = 0 ; // Never shrinks + + serial_resize_thread_team_data( pool_reduce_size + , team_reduce_size + , team_shared_size + , thread_local_size ); + + HostThreadTeamData & data = *serial_get_thread_team_data(); + + pointer_type ptr = + m_result_ptr ? m_result_ptr : pointer_type(data.pool_reduce_local()); + + reference_type update = + ValueInit::init( ReducerConditional::select(m_functor , m_reducer) , ptr ); + + this-> exec( update ); + + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >:: + final( ReducerConditional::select(m_functor , m_reducer) , ptr ); + } + + template< class HostViewType > + ParallelReduce( const FunctorType & arg_functor , + const MDRangePolicy & arg_policy , + const HostViewType & arg_result_view , + typename std::enable_if< + Kokkos::is_view< HostViewType >::value && + !Kokkos::is_reducer_type::value + ,void*>::type = NULL) + : m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + , m_reducer( InvalidType() ) + , m_result_ptr( arg_result_view.data() ) + { + static_assert( Kokkos::is_view< HostViewType >::value + , "Kokkos::Serial reduce result must be a View" ); + + static_assert( std::is_same< typename HostViewType::memory_space , HostSpace >::value + , "Kokkos::Serial reduce result must be a View in HostSpace" ); + } + + inline + ParallelReduce( const FunctorType & arg_functor + , MDRangePolicy arg_policy + , const ReducerType& reducer ) + : m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + , m_reducer( reducer ) + , m_result_ptr( reducer.view().data() ) + { + /*static_assert( std::is_same< typename ViewType::memory_space + , Kokkos::HostSpace >::value + , "Reduction result on Kokkos::OpenMP must be a Kokkos::View in HostSpace" );*/ + } +}; + + + } // namespace Impl } // namespace Kokkos @@ -704,8 +881,9 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTag > ValueInit ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; typedef typename Analysis::pointer_type pointer_type ; typedef typename Analysis::reference_type reference_type ; @@ -766,7 +944,7 @@ public: this-> template exec< WorkTag >( data , update ); - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >:: + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >:: final( ReducerConditional::select(m_functor , m_reducer) , ptr ); } @@ -819,6 +997,60 @@ public: /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ +namespace Kokkos { namespace Experimental { + +template<> +class UniqueToken< Serial, UniqueTokenScope::Instance> +{ +public: + using execution_space = Serial; + using size_type = int; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ) noexcept {} + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + inline + int size() const noexcept { return 1; } + + /// \brief acquire value such that 0 <= value < size() + inline + int acquire() const noexcept { return 0; } + + /// \brief release a value acquired by generate + inline + void release( int ) const noexcept {} +}; + +template<> +class UniqueToken< Serial, UniqueTokenScope::Global> +{ +public: + using execution_space = Serial; + using size_type = int; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ) noexcept {} + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + inline + int size() const noexcept { return 1; } + + /// \brief acquire value such that 0 <= value < size() + inline + int acquire() const noexcept { return 0; } + + /// \brief release a value acquired by generate + inline + void release( int ) const noexcept {} +}; + +}} // namespace Kokkos::Experimental + #include #endif // defined( KOKKOS_ENABLE_SERIAL ) diff --git a/lib/kokkos/core/src/Kokkos_TaskScheduler.hpp b/lib/kokkos/core/src/Kokkos_TaskScheduler.hpp index 7edda7aa75..079f80f556 100644 --- a/lib/kokkos/core/src/Kokkos_TaskScheduler.hpp +++ b/lib/kokkos/core/src/Kokkos_TaskScheduler.hpp @@ -148,7 +148,7 @@ private: typename std::conditional< Arg2_is_space , Arg2 , void >::type >::type ; - using task_base = Impl::TaskBase< Space , ValueType , void > ; + using task_base = Impl::TaskBase< void , void , void > ; using queue_type = Impl::TaskQueue< Space > ; task_base * m_task ; @@ -293,13 +293,17 @@ public: //---------------------------------------- KOKKOS_INLINE_FUNCTION - typename task_base::get_return_type + int is_ready() const noexcept + { return ( 0 == m_task ) || ( ((task_base*) task_base::LockTag) == m_task->m_wait ); } + + KOKKOS_INLINE_FUNCTION + const typename Impl::TaskResult< ValueType >::reference_type get() const { if ( 0 == m_task ) { Kokkos::abort( "Kokkos:::Future::get ERROR: is_null()"); } - return m_task->get(); + return Impl::TaskResult< ValueType >::get( m_task ); } }; @@ -396,7 +400,7 @@ private: using track_type = Kokkos::Impl::SharedAllocationTracker ; using queue_type = Kokkos::Impl::TaskQueue< ExecSpace > ; - using task_base = Impl::TaskBase< ExecSpace , void , void > ; + using task_base = Impl::TaskBase< void , void , void > ; track_type m_track ; queue_type * m_queue ; @@ -464,29 +468,19 @@ public: KOKKOS_INLINE_FUNCTION memory_pool * memory() const noexcept - { return m_queue ? m_queue->m_memory : (memory_pool*) 0 ; } + { return m_queue ? &( m_queue->m_memory ) : (memory_pool*) 0 ; } //---------------------------------------- /**\brief Allocation size for a spawned task */ template< typename FunctorType > KOKKOS_FUNCTION size_t spawn_allocation_size() const - { - using task_type = Impl::TaskBase< execution_space - , typename FunctorType::value_type - , FunctorType > ; - - return m_queue->allocate_block_size( sizeof(task_type) ); - } + { return m_queue->template spawn_allocation_size< FunctorType >(); } /**\brief Allocation size for a when_all aggregate */ KOKKOS_FUNCTION size_t when_all_allocation_size( int narg ) const - { - using task_base = Kokkos::Impl::TaskBase< ExecSpace , void , void > ; - - return m_queue->allocate_block_size( sizeof(task_base) + narg * sizeof(task_base*) ); - } + { return m_queue->when_all_allocation_size( narg ); } //---------------------------------------- @@ -507,7 +501,7 @@ public: queue_type * const queue = arg_policy.m_scheduler ? arg_policy.m_scheduler->m_queue : ( arg_policy.m_dependence.m_task - ? arg_policy.m_dependence.m_task->m_queue + ? static_cast(arg_policy.m_dependence.m_task->m_queue) : (queue_type*) 0 ); if ( 0 == queue ) { @@ -530,8 +524,12 @@ public: future_type f ; // Allocate task from memory pool + + const size_t alloc_size = + queue->template spawn_allocation_size< FunctorType >(); + f.m_task = - reinterpret_cast< task_type * >(queue->allocate(sizeof(task_type))); + reinterpret_cast< task_type * >(queue->allocate(alloc_size) ); if ( f.m_task ) { @@ -539,15 +537,17 @@ public: // Reference count starts at two: // +1 for the matching decrement when task is complete // +1 for the future - new ( f.m_task ) - task_type( arg_function - , queue - , arg_policy.m_dependence.m_task /* dependence */ - , 2 /* reference count */ - , int(sizeof(task_type)) /* allocation size */ - , int(arg_policy.m_task_type) - , int(arg_policy.m_priority) - , std::move(arg_functor) ); + new ( f.m_task ) task_type( std::move(arg_functor) ); + + f.m_task->m_apply = arg_function ; + f.m_task->m_queue = queue ; + f.m_task->m_next = arg_policy.m_dependence.m_task ; + f.m_task->m_ref_count = 2 ; + f.m_task->m_alloc_size = alloc_size ; + f.m_task->m_task_type = arg_policy.m_task_type ; + f.m_task->m_priority = arg_policy.m_priority ; + + Kokkos::memory_fence(); // The dependence (if any) is processed immediately // within the schedule function, as such the dependence's @@ -586,6 +586,30 @@ public: // Postcondition: task is in Executing-Respawn state } + template< typename FunctorType > + KOKKOS_FUNCTION static + void + respawn( FunctorType * arg_self + , TaskScheduler const & + , TaskPriority const & arg_priority + ) + { + // Precondition: task is in Executing state + + using value_type = typename FunctorType::value_type ; + using task_type = Impl::TaskBase< execution_space + , value_type + , FunctorType > ; + + task_type * const task = static_cast< task_type * >( arg_self ); + + task->m_priority = static_cast(arg_priority); + + task->add_dependence( (task_base*) 0 ); + + // Postcondition: task is in Executing-Respawn state + } + //---------------------------------------- /**\brief Return a future that is complete * when all input futures are complete. @@ -596,7 +620,7 @@ public: when_all( Future< A1 , A2 > const arg[] , int narg ) { using future_type = Future< execution_space > ; - using task_base = Kokkos::Impl::TaskBase< execution_space , void , void > ; + using task_base = Kokkos::Impl::TaskBase< void , void , void > ; future_type f ; @@ -610,9 +634,9 @@ public: // Increment reference count to track subsequent assignment. Kokkos::atomic_increment( &(t->m_ref_count) ); if ( queue == 0 ) { - queue = t->m_queue ; + queue = static_cast< queue_type * >( t->m_queue ); } - else if ( queue != t->m_queue ) { + else if ( queue != static_cast< queue_type * >( t->m_queue ) ) { Kokkos::abort("Kokkos when_all Futures must be in the same scheduler" ); } } @@ -620,28 +644,34 @@ public: if ( queue != 0 ) { - size_t const size = sizeof(task_base) + narg * sizeof(task_base*); + size_t const alloc_size = queue->when_all_allocation_size( narg ); f.m_task = - reinterpret_cast< task_base * >( queue->allocate( size ) ); + reinterpret_cast< task_base * >( queue->allocate( alloc_size ) ); if ( f.m_task ) { // Reference count starts at two: // +1 to match decrement when task completes // +1 for the future - new( f.m_task ) task_base( queue - , 2 /* reference count */ - , size /* allocation size */ - , narg /* dependence count */ - ); + + new( f.m_task ) task_base(); + + f.m_task->m_queue = queue ; + f.m_task->m_ref_count = 2 ; + f.m_task->m_alloc_size = alloc_size ; + f.m_task->m_dep_count = narg ; + f.m_task->m_task_type = task_base::Aggregate ; // Assign dependences, reference counts were already incremented - task_base ** const dep = f.m_task->aggregate_dependences(); + task_base * volatile * const dep = + f.m_task->aggregate_dependences(); for ( int i = 0 ; i < narg ; ++i ) { dep[i] = arg[i].m_task ; } + Kokkos::memory_fence(); + queue->schedule_aggregate( f.m_task ); // this when_all may be processed at any moment } @@ -651,6 +681,67 @@ public: return f ; } + template < class F > + KOKKOS_FUNCTION + Future< execution_space > + when_all( int narg , F const func ) + { + using input_type = decltype( func(0) ); + using future_type = Future< execution_space > ; + using task_base = Kokkos::Impl::TaskBase< void , void , void > ; + + static_assert( is_future< input_type >::value + , "Functor must return a Kokkos::Future" ); + + future_type f ; + + if ( 0 == narg ) return f ; + + size_t const alloc_size = m_queue->when_all_allocation_size( narg ); + + f.m_task = + reinterpret_cast< task_base * >( m_queue->allocate( alloc_size ) ); + + if ( f.m_task ) { + + // Reference count starts at two: + // +1 to match decrement when task completes + // +1 for the future + + new( f.m_task ) task_base(); + + f.m_task->m_queue = m_queue ; + f.m_task->m_ref_count = 2 ; + f.m_task->m_alloc_size = alloc_size ; + f.m_task->m_dep_count = narg ; + f.m_task->m_task_type = task_base::Aggregate ; + + // Assign dependences, reference counts were already incremented + + task_base * volatile * const dep = + f.m_task->aggregate_dependences(); + + for ( int i = 0 ; i < narg ; ++i ) { + const input_type arg_f = func(i); + if ( 0 != arg_f.m_task ) { + + if ( m_queue != static_cast< queue_type * >( arg_f.m_task->m_queue ) ) { + Kokkos::abort("Kokkos when_all Futures must be in the same scheduler" ); + } + // Increment reference count to track subsequent assignment. + Kokkos::atomic_increment( &(arg_f.m_task->m_ref_count) ); + dep[i] = arg_f.m_task ; + } + } + + Kokkos::memory_fence(); + + m_queue->schedule_aggregate( f.m_task ); + // this when_all may be processed at any moment + } + return f ; + } + //---------------------------------------- KOKKOS_INLINE_FUNCTION diff --git a/lib/kokkos/core/src/Kokkos_UniqueToken.hpp b/lib/kokkos/core/src/Kokkos_UniqueToken.hpp new file mode 100644 index 0000000000..1ffb07a6db --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_UniqueToken.hpp @@ -0,0 +1,88 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_UNIQUE_TOKEN_HPP +#define KOKKOS_UNIQUE_TOKEN_HPP + +#include + +namespace Kokkos { namespace Experimental { + +enum class UniqueTokenScope : int +{ + Instance, + Global +}; + +/// \brief class to generate unique ids base on the required amount of concurrency +/// +/// This object should behave like a ref-counted object, so that when the last +/// instance is destroy resources are free if needed +template +class UniqueToken +{ +public: + using execution_space = ExecutionSpace; + using size_type = typename execution_space::size_type; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ); + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + KOKKOS_INLINE_FUNCTION + size_type size() const ; + + /// \brief acquire value such that 0 <= value < size() + KOKKOS_INLINE_FUNCTION + size_type acquire() const ; + + /// \brief release a value acquired by generate + KOKKOS_INLINE_FUNCTION + void release( size_type ) const ; +}; + +}} // namespace Kokkos::Experimental + +#endif //KOKKOS_UNIQUE_TOKEN_HPP diff --git a/lib/kokkos/core/src/Kokkos_View.hpp b/lib/kokkos/core/src/Kokkos_View.hpp index 3312aa6a96..d4940b3412 100644 --- a/lib/kokkos/core/src/Kokkos_View.hpp +++ b/lib/kokkos/core/src/Kokkos_View.hpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ @@ -54,11 +54,14 @@ #include #include +#if defined(KOKKOS_ENABLE_PROFILING) +#include +#endif + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { template< class DataType > @@ -73,16 +76,6 @@ struct ViewDataAnalysis ; template< class , class ... > class ViewMapping { public: enum { is_assignable = false }; }; -} /* namespace Impl */ -} /* namespace Experimental */ -} /* namespace Kokkos */ - -namespace Kokkos { -namespace Impl { - -using Kokkos::Experimental::Impl::ViewMapping ; -using Kokkos::Experimental::Impl::ViewDataAnalysis ; - } /* namespace Impl */ } /* namespace Kokkos */ @@ -415,7 +408,7 @@ view_alloc( Args const & ... args ) } template< class ... Args > -inline +KOKKOS_INLINE_FUNCTION Impl::ViewCtorProp< typename Impl::ViewCtorProp< void , Args >::type ... > view_wrap( Args const & ... args ) { @@ -1223,6 +1216,13 @@ public: m_track.assign_allocated_record_to_uninitialized( record ); } + KOKKOS_INLINE_FUNCTION + void assign_data( pointer_type arg_data ) + { + m_track.clear(); + m_map.assign_data( arg_data ); + } + // Wrap memory according to properties and array layout template< class ... P > explicit KOKKOS_INLINE_FUNCTION @@ -1563,12 +1563,12 @@ namespace Kokkos { namespace Impl { inline -void shared_allocation_tracking_claim_and_disable() -{ Kokkos::Impl::SharedAllocationRecord::tracking_claim_and_disable(); } +void shared_allocation_tracking_disable() +{ Kokkos::Impl::SharedAllocationRecord::tracking_disable(); } inline -void shared_allocation_tracking_release_and_enable() -{ Kokkos::Impl::SharedAllocationRecord::tracking_release_and_enable(); } +void shared_allocation_tracking_enable() +{ Kokkos::Impl::SharedAllocationRecord::tracking_enable(); } } /* namespace Impl */ } /* namespace Kokkos */ @@ -1795,6 +1795,20 @@ void deep_copy if ( (void *) dst.data() != (void*) src.data() ) { +#if defined(KOKKOS_ENABLE_PROFILING) + if (Kokkos::Profiling::profileLibraryLoaded()) { + const size_t nbytes = sizeof(typename dst_type::value_type) * dst.span(); + Kokkos::Profiling::beginDeepCopy( + Kokkos::Profiling::SpaceHandle(dst_memory_space::name()), + dst.label(), + dst.data(), + Kokkos::Profiling::SpaceHandle(src_memory_space::name()), + src.label(), + src.data(), + nbytes); + } +#endif + // Concern: If overlapping views then a parallel copy will be erroneous. // ... @@ -1882,7 +1896,14 @@ void deep_copy else { Kokkos::Impl::throw_runtime_exception("deep_copy given views that would require a temporary allocation"); } - } + +#if defined(KOKKOS_ENABLE_PROFILING) + if (Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::endDeepCopy(); + } +#endif + + } // ( (void *) dst.data() != (void*) src.data() ) } } /* namespace Kokkos */ @@ -2221,6 +2242,29 @@ create_mirror_view(const Space& , const Kokkos::View & src return typename Impl::MirrorViewType::view_type(src.label(),src.layout()); } +// Create a mirror view and deep_copy in a new space (specialization for same space) +template +typename Impl::MirrorViewType::view_type +create_mirror_view_and_copy(const Space& , const Kokkos::View & src + , std::string const& name = "" + , typename std::enable_if::is_same_memspace>::type* = 0 ) { + (void)name; + return src; +} + +// Create a mirror view and deep_copy in a new space (specialization for different space) +template +typename Impl::MirrorViewType::view_type +create_mirror_view_and_copy(const Space& , const Kokkos::View & src + , std::string const& name = "" + , typename std::enable_if::is_same_memspace>::type* = 0 ) { + using Mirror = typename Impl::MirrorViewType::view_type; + std::string label = name.empty() ? src.label() : name; + auto mirror = Mirror(ViewAllocateWithoutInitializing(label), src.layout()); + deep_copy(mirror, src); + return mirror; +} + } /* namespace Kokkos */ //---------------------------------------------------------------------------- @@ -2249,6 +2293,82 @@ resize( Kokkos::View & v , static_assert( Kokkos::ViewTraits::is_managed , "Can only resize managed views" ); + // Fix #904 by checking dimensions before actually resizing. + // + // Rank is known at compile time, so hopefully the compiler will + // remove branches that are compile-time false. The upcoming "if + // constexpr" language feature would make this certain. + if (view_type::Rank == 1 && + n0 == static_cast (v.extent(0))) { + return; + } + if (view_type::Rank == 2 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1))) { + return; + } + if (view_type::Rank == 3 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1)) && + n2 == static_cast (v.extent(2))) { + return; + } + if (view_type::Rank == 4 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1)) && + n2 == static_cast (v.extent(2)) && + n3 == static_cast (v.extent(3))) { + return; + } + if (view_type::Rank == 5 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1)) && + n2 == static_cast (v.extent(2)) && + n3 == static_cast (v.extent(3)) && + n4 == static_cast (v.extent(4))) { + return; + } + if (view_type::Rank == 6 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1)) && + n2 == static_cast (v.extent(2)) && + n3 == static_cast (v.extent(3)) && + n4 == static_cast (v.extent(4)) && + n5 == static_cast (v.extent(5))) { + return; + } + if (view_type::Rank == 7 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1)) && + n2 == static_cast (v.extent(2)) && + n3 == static_cast (v.extent(3)) && + n4 == static_cast (v.extent(4)) && + n5 == static_cast (v.extent(5)) && + n6 == static_cast (v.extent(6))) { + return; + } + if (view_type::Rank == 8 && + n0 == static_cast (v.extent(0)) && + n1 == static_cast (v.extent(1)) && + n2 == static_cast (v.extent(2)) && + n3 == static_cast (v.extent(3)) && + n4 == static_cast (v.extent(4)) && + n5 == static_cast (v.extent(5)) && + n6 == static_cast (v.extent(6)) && + n7 == static_cast (v.extent(7))) { + return; + } + // If Kokkos ever supports Views of rank > 8, the above code won't + // be incorrect, because avoiding reallocation in resize() is just + // an optimization. + + // TODO (mfh 27 Jun 2017) If the old View has enough space but just + // different dimensions (e.g., if the product of the dimensions, + // including extra space for alignment, will not change), then + // consider just reusing storage. For now, Kokkos always + // reallocates if any of the dimensions change, even if the old View + // has enough space. + view_type v_resized( v.label(), n0, n1, n2, n3, n4, n5, n6, n7 ); Kokkos::Impl::ViewRemap< view_type , view_type >( v_resized , v ); @@ -2317,6 +2437,109 @@ void realloc( Kokkos::View & v , } } /* namespace Kokkos */ +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { namespace Impl { + +template < class Specialize, typename A, typename B > +struct CommonViewValueType; + +template < typename A, typename B > +struct CommonViewValueType< void, A, B > +{ + using value_type = typename std::common_type< A , B >::type; +}; + + +template < class Specialize, class ValueType > +struct CommonViewAllocProp; + +template < class ValueType > +struct CommonViewAllocProp< void, ValueType > +{ + using value_type = ValueType; + using scalar_array_type = ValueType; + + template < class ... Views > + KOKKOS_INLINE_FUNCTION + CommonViewAllocProp( const Views & ... ) {} +}; + + +template < class ... Views > +struct DeduceCommonViewAllocProp; + +// Base case must provide types for: +// 1. specialize 2. value_type 3. is_view 4. prop_type +template < class FirstView > +struct DeduceCommonViewAllocProp< FirstView > +{ + using specialize = typename FirstView::traits::specialize; + + using value_type = typename FirstView::traits::value_type; + + enum : bool { is_view = is_view< FirstView >::value }; + + using prop_type = CommonViewAllocProp< specialize, value_type >; +}; + + +template < class FirstView, class ... NextViews > +struct DeduceCommonViewAllocProp< FirstView, NextViews... > +{ + using NextTraits = DeduceCommonViewAllocProp< NextViews... >; + + using first_specialize = typename FirstView::traits::specialize; + using first_value_type = typename FirstView::traits::value_type; + + enum : bool { first_is_view = is_view< FirstView >::value }; + + using next_specialize = typename NextTraits::specialize; + using next_value_type = typename NextTraits::value_type; + + enum : bool { next_is_view = NextTraits::is_view }; + + // common types + + // determine specialize type + // if first and next specialize differ, but are not the same specialize, error out + static_assert( !(!std::is_same< first_specialize, next_specialize >::value && !std::is_same< first_specialize, void>::value && !std::is_same< void, next_specialize >::value) , "Kokkos DeduceCommonViewAllocProp ERROR: Only one non-void specialize trait allowed" ); + + // otherwise choose non-void specialize if either/both are non-void + using specialize = typename std::conditional< std::is_same< first_specialize, next_specialize >::value + , first_specialize + , typename std::conditional< ( std::is_same< first_specialize, void >::value + && !std::is_same< next_specialize, void >::value) + , next_specialize + , first_specialize + >::type + >::type; + + using value_type = typename CommonViewValueType< specialize, first_value_type, next_value_type >::value_type; + + enum : bool { is_view = (first_is_view && next_is_view) }; + + using prop_type = CommonViewAllocProp< specialize, value_type >; +}; + +} // end namespace Impl + +template < class ... Views > +using DeducedCommonPropsType = typename Impl::DeduceCommonViewAllocProp::prop_type ; + +// User function +template < class ... Views > +KOKKOS_INLINE_FUNCTION +DeducedCommonPropsType +common_view_alloc_prop( Views const & ... views ) +{ + return DeducedCommonPropsType( views... ); +} + +} // namespace Kokkos + + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // For backward compatibility: @@ -2350,6 +2573,9 @@ using Kokkos::Impl::WithoutInitializing_t ; using Kokkos::Impl::AllowPadding_t ; using Kokkos::Impl::SharedAllocationRecord ; using Kokkos::Impl::SharedAllocationTracker ; +using Kokkos::Impl::ViewMapping ; +using Kokkos::Impl::ViewDataAnalysis ; + } /* namespace Impl */ } /* namespace Experimental */ diff --git a/lib/kokkos/core/src/Kokkos_WorkGraphPolicy.hpp b/lib/kokkos/core/src/Kokkos_WorkGraphPolicy.hpp new file mode 100644 index 0000000000..f9521a7e38 --- /dev/null +++ b/lib/kokkos/core/src/Kokkos_WorkGraphPolicy.hpp @@ -0,0 +1,258 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_WORKGRAPHPOLICY_HPP +#define KOKKOS_WORKGRAPHPOLICY_HPP + +namespace Kokkos { +namespace Impl { + +template< class functor_type , class execution_space, class ... policy_args > +class WorkGraphExec; + +}} // namespace Kokkos::Impl + +namespace Kokkos { + +template< class ... Properties > +class WorkGraphPolicy +{ +public: + + using self_type = WorkGraphPolicy; + using traits = Kokkos::Impl::PolicyTraits; + using index_type = typename traits::index_type; + using member_type = index_type; + using work_tag = typename traits::work_tag; + using execution_space = typename traits::execution_space; + using memory_space = typename execution_space::memory_space; + using graph_type = Kokkos::Crs; + + enum : std::int32_t { + END_TOKEN = -1 , + BEGIN_TOKEN = -2 , + COMPLETED_TOKEN = -3 }; + +private: + + using ints_type = Kokkos::View; + + // Let N = m_graph.numRows(), the total work + // m_queue[ 0 .. N-1] = the ready queue + // m_queue[ N .. 2*N-1] = the waiting queue counts + // m_queue[2*N .. 2*N+2] = the ready queue hints + + graph_type const m_graph; + ints_type m_queue ; + + KOKKOS_INLINE_FUNCTION + void push_work( const std::int32_t w ) const noexcept + { + const std::int32_t N = m_graph.numRows(); + + std::int32_t volatile * const ready_queue = & m_queue[0] ; + std::int32_t volatile * const end_hint = & m_queue[2*N+1] ; + + // Push work to end of queue + const std::int32_t j = atomic_fetch_add( end_hint , 1 ); + + if ( ( N <= j ) || + ( END_TOKEN != atomic_exchange(ready_queue+j,w) ) ) { + // ERROR: past the end of queue or did not replace END_TOKEN + Kokkos::abort("WorkGraphPolicy push_work error"); + } + + memory_fence(); + } + +public: + + /**\brief Attempt to pop the work item at the head of the queue. + * + * Find entry 'i' such that + * ( m_queue[i] != BEGIN_TOKEN ) AND + * ( i == 0 OR m_queue[i-1] == BEGIN_TOKEN ) + * if found then + * increment begin hint + * return atomic_exchange( m_queue[i] , BEGIN_TOKEN ) + * else if i < total work + * return END_TOKEN + * else + * return COMPLETED_TOKEN + * + */ + KOKKOS_INLINE_FUNCTION + std::int32_t pop_work() const noexcept + { + const std::int32_t N = m_graph.numRows(); + + std::int32_t volatile * const ready_queue = & m_queue[0] ; + std::int32_t volatile * const begin_hint = & m_queue[2*N] ; + + // begin hint is guaranteed to be less than or equal to + // actual begin location in the queue. + + for ( std::int32_t i = *begin_hint ; i < N ; ++i ) { + + const std::int32_t w = ready_queue[i] ; + + if ( w == END_TOKEN ) { return END_TOKEN ; } + + if ( ( w != BEGIN_TOKEN ) && + ( w == atomic_compare_exchange(ready_queue+i,w,BEGIN_TOKEN) ) ) { + // Attempt to claim ready work index succeeded, + // update the hint and return work index + atomic_increment( begin_hint ); + return w ; + } + // arrive here when ready_queue[i] == BEGIN_TOKEN + } + + return COMPLETED_TOKEN ; + } + + + KOKKOS_INLINE_FUNCTION + void completed_work( std::int32_t w ) const noexcept + { + Kokkos::memory_fence(); + + // Make sure the completed work function's memory accesses are flushed. + + const std::int32_t N = m_graph.numRows(); + + std::int32_t volatile * const count_queue = & m_queue[N] ; + + const std::int32_t B = m_graph.row_map(w); + const std::int32_t E = m_graph.row_map(w+1); + + for ( std::int32_t i = B ; i < E ; ++i ) { + const std::int32_t j = m_graph.entries(i); + if ( 1 == atomic_fetch_add(count_queue+j,-1) ) { + push_work(j); + } + } + } + + struct TagInit {}; + struct TagCount {}; + struct TagReady {}; + + /**\brief Initialize queue + * + * m_queue[0..N-1] = END_TOKEN, the ready queue + * m_queue[N..2*N-1] = 0, the waiting count queue + * m_queue[2*N..2*N+1] = 0, begin/end hints for ready queue + */ + KOKKOS_INLINE_FUNCTION + void operator()( const TagInit , int i ) const noexcept + { m_queue[i] = i < m_graph.numRows() ? END_TOKEN : 0 ; } + + KOKKOS_INLINE_FUNCTION + void operator()( const TagCount , int i ) const noexcept + { + std::int32_t volatile * const count_queue = + & m_queue[ m_graph.numRows() ] ; + + atomic_increment( count_queue + m_graph.entries[i] ); + } + + KOKKOS_INLINE_FUNCTION + void operator()( const TagReady , int w ) const noexcept + { + std::int32_t const * const count_queue = + & m_queue[ m_graph.numRows() ] ; + + if ( 0 == count_queue[w] ) push_work(w); + } + + WorkGraphPolicy( const graph_type & arg_graph ) + : m_graph(arg_graph) + , m_queue( view_alloc( "queue" , WithoutInitializing ) + , arg_graph.numRows() * 2 + 2 ) + { + { // Initialize + using policy_type = RangePolicy; + using closure_type = Kokkos::Impl::ParallelFor; + const closure_type closure(*this, policy_type(0, m_queue.size())); + closure.execute(); + execution_space::fence(); + } + + { // execute-after counts + using policy_type = RangePolicy; + using closure_type = Kokkos::Impl::ParallelFor; + const closure_type closure(*this,policy_type(0,m_graph.entries.size())); + closure.execute(); + execution_space::fence(); + } + + { // Scheduling ready tasks + using policy_type = RangePolicy; + using closure_type = Kokkos::Impl::ParallelFor; + const closure_type closure(*this,policy_type(0,m_graph.numRows())); + closure.execute(); + execution_space::fence(); + } + } +}; + +} // namespace Kokkos + +#ifdef KOKKOS_ENABLE_SERIAL +#include "impl/Kokkos_Serial_WorkGraphPolicy.hpp" +#endif + +#ifdef KOKKOS_ENABLE_OPENMP +#include "OpenMP/Kokkos_OpenMP_WorkGraphPolicy.hpp" +#endif + +#ifdef KOKKOS_ENABLE_CUDA +#include "Cuda/Kokkos_Cuda_WorkGraphPolicy.hpp" +#endif + +#ifdef KOKKOS_ENABLE_THREADS +#include "Threads/Kokkos_Threads_WorkGraphPolicy.hpp" +#endif + +#endif /* #define KOKKOS_WORKGRAPHPOLICY_HPP */ diff --git a/lib/kokkos/core/src/Makefile b/lib/kokkos/core/src/Makefile index 8fb13b8954..6ee5fec716 100644 --- a/lib/kokkos/core/src/Makefile +++ b/lib/kokkos/core/src/Makefile @@ -5,51 +5,44 @@ endif PREFIX ?= /usr/local/lib/kokkos -default: messages build-lib - echo "End Build" +default: build-lib ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) - CXX = $(KOKKOS_PATH)/bin/nvcc_wrapper + CXX ?= $(KOKKOS_PATH)/bin/nvcc_wrapper else - CXX = g++ + CXX ?= g++ endif -CXXFLAGS = -O3 +CXXFLAGS ?= -O3 LINK ?= $(CXX) LDFLAGS ?= include $(KOKKOS_PATH)/Makefile.kokkos - -PWD = $(shell pwd) - -KOKKOS_HEADERS_INCLUDE = $(wildcard $(KOKKOS_PATH)/core/src/*.hpp) -KOKKOS_HEADERS_INCLUDE_IMPL = $(wildcard $(KOKKOS_PATH)/core/src/impl/*.hpp) -KOKKOS_HEADERS_INCLUDE += $(wildcard $(KOKKOS_PATH)/containers/src/*.hpp) -KOKKOS_HEADERS_INCLUDE_IMPL += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.hpp) -KOKKOS_HEADERS_INCLUDE += $(wildcard $(KOKKOS_PATH)/algorithms/src/*.hpp) +include $(KOKKOS_PATH)/core/src/Makefile.generate_header_lists +include $(KOKKOS_PATH)/core/src/Makefile.generate_build_files CONDITIONAL_COPIES = ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) - KOKKOS_HEADERS_CUDA += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) CONDITIONAL_COPIES += copy-cuda endif ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) - KOKKOS_HEADERS_THREADS += $(wildcard $(KOKKOS_PATH)/core/src/Threads/*.hpp) CONDITIONAL_COPIES += copy-threads endif ifeq ($(KOKKOS_INTERNAL_USE_QTHREADS), 1) - KOKKOS_HEADERS_QTHREADS += $(wildcard $(KOKKOS_PATH)/core/src/Qthreads/*.hpp) CONDITIONAL_COPIES += copy-qthreads endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) - KOKKOS_HEADERS_OPENMP += $(wildcard $(KOKKOS_PATH)/core/src/OpenMP/*.hpp) CONDITIONAL_COPIES += copy-openmp endif +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + CONDITIONAL_COPIES += copy-rocm +endif + ifeq ($(KOKKOS_OS),CYGWIN) COPY_FLAG = -u endif @@ -66,103 +59,7 @@ else KOKKOS_DEBUG_CMAKE = ON endif -messages: - echo "Start Build" - -build-makefile-kokkos: - rm -f Makefile.kokkos - echo "#Global Settings used to generate this library" >> Makefile.kokkos - echo "KOKKOS_PATH = $(PREFIX)" >> Makefile.kokkos - echo "KOKKOS_DEVICES = $(KOKKOS_DEVICES)" >> Makefile.kokkos - echo "KOKKOS_ARCH = $(KOKKOS_ARCH)" >> Makefile.kokkos - echo "KOKKOS_DEBUG = $(KOKKOS_DEBUG)" >> Makefile.kokkos - echo "KOKKOS_USE_TPLS = $(KOKKOS_USE_TPLS)" >> Makefile.kokkos - echo "KOKKOS_CXX_STANDARD = $(KOKKOS_CXX_STANDARD)" >> Makefile.kokkos - echo "KOKKOS_OPTIONS = $(KOKKOS_OPTIONS)" >> Makefile.kokkos - echo "KOKKOS_CUDA_OPTIONS = $(KOKKOS_CUDA_OPTIONS)" >> Makefile.kokkos - echo "CXX ?= $(CXX)" >> Makefile.kokkos - echo "NVCC_WRAPPER ?= $(PREFIX)/bin/nvcc_wrapper" >> Makefile.kokkos - echo "" >> Makefile.kokkos - echo "#Source and Header files of Kokkos relative to KOKKOS_PATH" >> Makefile.kokkos - echo "KOKKOS_HEADERS = $(KOKKOS_HEADERS)" >> Makefile.kokkos - echo "KOKKOS_SRC = $(KOKKOS_SRC)" >> Makefile.kokkos - echo "" >> Makefile.kokkos - echo "#Variables used in application Makefiles" >> Makefile.kokkos - echo "KOKKOS_CPP_DEPENDS = $(KOKKOS_CPP_DEPENDS)" >> Makefile.kokkos - echo "KOKKOS_CXXFLAGS = $(KOKKOS_CXXFLAGS)" >> Makefile.kokkos - echo "KOKKOS_CPPFLAGS = $(KOKKOS_CPPFLAGS)" >> Makefile.kokkos - echo "KOKKOS_LINK_DEPENDS = $(KOKKOS_LINK_DEPENDS)" >> Makefile.kokkos - echo "KOKKOS_LIBS = $(KOKKOS_LIBS)" >> Makefile.kokkos - echo "KOKKOS_LDFLAGS = $(KOKKOS_LDFLAGS)" >> Makefile.kokkos - echo "" >> Makefile.kokkos - echo "#Internal settings which need to propagated for Kokkos examples" >> Makefile.kokkos - echo "KOKKOS_INTERNAL_USE_CUDA = ${KOKKOS_INTERNAL_USE_CUDA}" >> Makefile.kokkos - echo "KOKKOS_INTERNAL_USE_QTHREADS = ${KOKKOS_INTERNAL_USE_QTHREADS}" >> Makefile.kokkos - echo "KOKKOS_INTERNAL_USE_OPENMP = ${KOKKOS_INTERNAL_USE_OPENMP}" >> Makefile.kokkos - echo "KOKKOS_INTERNAL_USE_PTHREADS = ${KOKKOS_INTERNAL_USE_PTHREADS}" >> Makefile.kokkos - echo "" >> Makefile.kokkos - echo "#Fake kokkos-clean target" >> Makefile.kokkos - echo "kokkos-clean:" >> Makefile.kokkos - echo "" >> Makefile.kokkos - sed \ - -e 's|$(KOKKOS_PATH)/core/src|$(PREFIX)/include|g' \ - -e 's|$(KOKKOS_PATH)/containers/src|$(PREFIX)/include|g' \ - -e 's|$(KOKKOS_PATH)/algorithms/src|$(PREFIX)/include|g' \ - -e 's|-L$(PWD)|-L$(PREFIX)/lib|g' \ - -e 's|= libkokkos.a|= $(PREFIX)/lib/libkokkos.a|g' \ - -e 's|= KokkosCore_config.h|= $(PREFIX)/include/KokkosCore_config.h|g' Makefile.kokkos \ - > Makefile.kokkos.tmp - mv -f Makefile.kokkos.tmp Makefile.kokkos - -build-cmake-kokkos: - rm -f kokkos.cmake - echo "#Global Settings used to generate this library" >> kokkos.cmake - echo "set(KOKKOS_PATH $(PREFIX) CACHE PATH \"Kokkos installation path\")" >> kokkos.cmake - echo "set(KOKKOS_DEVICES $(KOKKOS_DEVICES) CACHE STRING \"Kokkos devices list\")" >> kokkos.cmake - echo "set(KOKKOS_ARCH $(KOKKOS_ARCH) CACHE STRING \"Kokkos architecture flags\")" >> kokkos.cmake - echo "set(KOKKOS_DEBUG $(KOKKOS_DEBUG_CMAKE) CACHE BOOL \"Kokkos debug enabled ?)\")" >> kokkos.cmake - echo "set(KOKKOS_USE_TPLS $(KOKKOS_USE_TPLS) CACHE STRING \"Kokkos templates list\")" >> kokkos.cmake - echo "set(KOKKOS_CXX_STANDARD $(KOKKOS_CXX_STANDARD) CACHE STRING \"Kokkos C++ standard\")" >> kokkos.cmake - echo "set(KOKKOS_OPTIONS $(KOKKOS_OPTIONS) CACHE STRING \"Kokkos options\")" >> kokkos.cmake - echo "set(KOKKOS_CUDA_OPTIONS $(KOKKOS_CUDA_OPTIONS) CACHE STRING \"Kokkos Cuda options\")" >> kokkos.cmake - echo "if(NOT $ENV{CXX})" >> kokkos.cmake - echo ' message(WARNING "You are currently using compiler $${CMAKE_CXX_COMPILER} while Kokkos was built with $(CXX) ; make sure this is the behavior you intended to be.")' >> kokkos.cmake - echo "endif()" >> kokkos.cmake - echo "if(NOT DEFINED ENV{NVCC_WRAPPER})" >> kokkos.cmake - echo " set(NVCC_WRAPPER \"$(NVCC_WRAPPER)\" CACHE FILEPATH \"Path to command nvcc_wrapper\")" >> kokkos.cmake - echo "else()" >> kokkos.cmake - echo ' set(NVCC_WRAPPER $$ENV{NVCC_WRAPPER} CACHE FILEPATH "Path to command nvcc_wrapper")' >> kokkos.cmake - echo "endif()" >> kokkos.cmake - echo "" >> kokkos.cmake - echo "#Source and Header files of Kokkos relative to KOKKOS_PATH" >> kokkos.cmake - echo "set(KOKKOS_HEADERS \"$(KOKKOS_HEADERS)\" CACHE STRING \"Kokkos headers list\")" >> kokkos.cmake - echo "set(KOKKOS_SRC \"$(KOKKOS_SRC)\" CACHE STRING \"Kokkos source list\")" >> kokkos.cmake - echo "" >> kokkos.cmake - echo "#Variables used in application Makefiles" >> kokkos.cmake - echo "set(KOKKOS_CPP_DEPENDS \"$(KOKKOS_CPP_DEPENDS)\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_CXXFLAGS \"$(KOKKOS_CXXFLAGS)\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_CPPFLAGS \"$(KOKKOS_CPPFLAGS)\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_LINK_DEPENDS \"$(KOKKOS_LINK_DEPENDS)\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_LIBS \"$(KOKKOS_LIBS)\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_LDFLAGS \"$(KOKKOS_LDFLAGS)\" CACHE STRING \"\")" >> kokkos.cmake - echo "" >> kokkos.cmake - echo "#Internal settings which need to propagated for Kokkos examples" >> kokkos.cmake - echo "set(KOKKOS_INTERNAL_USE_CUDA \"${KOKKOS_INTERNAL_USE_CUDA}\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_INTERNAL_USE_OPENMP \"${KOKKOS_INTERNAL_USE_OPENMP}\" CACHE STRING \"\")" >> kokkos.cmake - echo "set(KOKKOS_INTERNAL_USE_PTHREADS \"${KOKKOS_INTERNAL_USE_PTHREADS}\" CACHE STRING \"\")" >> kokkos.cmake - echo "mark_as_advanced(KOKKOS_HEADERS KOKKOS_SRC KOKKOS_INTERNAL_USE_CUDA KOKKOS_INTERNAL_USE_OPENMP KOKKOS_INTERNAL_USE_PTHREADS)" >> kokkos.cmake - echo "" >> kokkos.cmake - sed \ - -e 's|$(KOKKOS_PATH)/core/src|$(PREFIX)/include|g' \ - -e 's|$(KOKKOS_PATH)/containers/src|$(PREFIX)/include|g' \ - -e 's|$(KOKKOS_PATH)/algorithms/src|$(PREFIX)/include|g' \ - -e 's|-L$(PWD)|-L$(PREFIX)/lib|g' \ - -e 's|= libkokkos.a|= $(PREFIX)/lib/libkokkos.a|g' \ - -e 's|= KokkosCore_config.h|= $(PREFIX)/include/KokkosCore_config.h|g' kokkos.cmake \ - > kokkos.cmake.tmp - mv -f kokkos.cmake.tmp kokkos.cmake - -build-lib: build-makefile-kokkos build-cmake-kokkos $(KOKKOS_LINK_DEPENDS) +build-lib: $(KOKKOS_LINK_DEPENDS) mkdir: mkdir -p $(PREFIX) @@ -187,14 +84,18 @@ copy-openmp: mkdir mkdir -p $(PREFIX)/include/OpenMP cp $(COPY_FLAG) $(KOKKOS_HEADERS_OPENMP) $(PREFIX)/include/OpenMP -install: mkdir $(CONDITIONAL_COPIES) build-lib +copy-rocm: mkdir + mkdir -p $(PREFIX)/include/ROCm + cp $(COPY_FLAG) $(KOKKOS_HEADERS_ROCM) $(PREFIX)/include/ROCm + +install: mkdir $(CONDITIONAL_COPIES) build-lib generate_build_settings cp $(COPY_FLAG) $(NVCC_WRAPPER) $(PREFIX)/bin cp $(COPY_FLAG) $(KOKKOS_HEADERS_INCLUDE) $(PREFIX)/include cp $(COPY_FLAG) $(KOKKOS_HEADERS_INCLUDE_IMPL) $(PREFIX)/include/impl - cp $(COPY_FLAG) Makefile.kokkos $(PREFIX) - cp $(COPY_FLAG) kokkos.cmake $(PREFIX) + cp $(COPY_FLAG) $(KOKKOS_MAKEFILE) $(PREFIX) + cp $(COPY_FLAG) $(KOKKOS_CMAKEFILE) $(PREFIX) cp $(COPY_FLAG) libkokkos.a $(PREFIX)/lib - cp $(COPY_FLAG) KokkosCore_config.h $(PREFIX)/include + cp $(COPY_FLAG) $(KOKKOS_CONFIG_HEADER) $(PREFIX)/include clean: kokkos-clean - rm -f Makefile.kokkos + rm -f $(KOKKOS_MAKEFILE) $(KOKKOS_CMAKEFILE) diff --git a/lib/kokkos/core/src/Makefile.generate_build_files b/lib/kokkos/core/src/Makefile.generate_build_files new file mode 100644 index 0000000000..d55967f84f --- /dev/null +++ b/lib/kokkos/core/src/Makefile.generate_build_files @@ -0,0 +1,100 @@ +# This file is responsible for generating files which will be used +# by build system (make and cmake) in scenarios where the kokkos library +# gets installed before building the app + +# These files are generated by this makefile +KOKKOS_MAKEFILE=Makefile.kokkos +KOKKOS_CMAKEFILE=kokkos_generated_settings.cmake + +ifeq ($(KOKKOS_DEBUG),"no") + KOKKOS_DEBUG_CMAKE = OFF +else + KOKKOS_DEBUG_CMAKE = ON +endif + +# Functions for generating makefile and cmake file +# In calling these routines, do not put space after , +# e.g., $(call kokkos_append_var,KOKKOS_PATH,$(PREFIX)) +kokkos_append_makefile = echo $1 >> $(KOKKOS_MAKEFILE) +kokkos_append_cmakefile = echo $1 >> $(KOKKOS_CMAKEFILE) + +kokkos_setvar_cmakefile = echo set\($1 $2\) >> $(KOKKOS_CMAKEFILE) +kokkos_setlist_cmakefile = echo set\($1 \"$2\"\) >> $(KOKKOS_CMAKEFILE) + +kokkos_appendvar_makefile = echo $1 = $($(1)) >> $(KOKKOS_MAKEFILE) +kokkos_appendvar2_makefile = echo $1 ?= $($(1)) >> $(KOKKOS_MAKEFILE) +kokkos_appendvar_cmakefile = echo set\($1 $($(1)) CACHE $2 FORCE\) >> $(KOKKOS_CMAKEFILE) +kokkos_appendval_makefile = echo $1 = $2 >> $(KOKKOS_MAKEFILE) +kokkos_appendval_cmakefile = echo set\($1 $2 CACHE $3 FORCE\) >> $(KOKKOS_CMAKEFILE) + +kokkos_append_string = $(call kokkos_append_makefile,$1); $(call kokkos_append_cmakefile,$1) +kokkos_append_var = $(call kokkos_appendvar_makefile,$1); $(call kokkos_appendvar_cmakefile,$1,$2) +kokkos_append_var2 = $(call kokkos_appendvar2_makefile,$1); $(call kokkos_appendvar_cmakefile,$1,$2) +kokkos_append_varval = $(call kokkos_appendval_makefile,$1,$2); $(call kokkos_appendval_cmakefile,$1,$2,$3) + +generate_build_settings: $(KOKKOS_CONFIG_HEADER) + @rm -f $(KOKKOS_MAKEFILE) + @rm -f $(KOKKOS_CMAKEFILE) + @$(call kokkos_append_string, "#Global Settings used to generate this library") + @$(call kokkos_append_varval,KOKKOS_PATH,$(KOKKOS_INSTALL_PATH),'FILEPATH "Kokkos installation path"') + @$(call kokkos_append_var,KOKKOS_DEVICES,'STRING "Kokkos devices list"') + @$(call kokkos_append_var,KOKKOS_ARCH,'STRING "Kokkos architecture flags"') + @$(call kokkos_appendvar_makefile,KOKKOS_DEBUG) + @$(call kokkos_appendvar_cmakefile,KOKKOS_DEBUG_CMAKE,'BOOL "Kokkos debug enabled ?"') + @$(call kokkos_append_var,KOKKOS_USE_TPLS,'STRING "Kokkos templates list"') + @$(call kokkos_append_var,KOKKOS_CXX_STANDARD,'STRING "Kokkos C++ standard"') + @$(call kokkos_append_var,KOKKOS_OPTIONS,'STRING "Kokkos options"') + @$(call kokkos_append_var,KOKKOS_CUDA_OPTIONS,'STRING "Kokkos Cuda options"') + @$(call kokkos_appendvar2,CXX,'KOKKOS C++ Compiler') + @$(call kokkos_append_cmakefile,"if(NOT DEFINED ENV{NVCC_WRAPPER})") + @$(call kokkos_append_var2,NVCC_WRAPPER,'FILEPATH "Path to command nvcc_wrapper"') + @$(call kokkos_append_cmakefile,"else()") + @$(call kokkos_append_cmakefile,' set(NVCC_WRAPPER $$ENV{NVCC_WRAPPER} CACHE FILEPATH "Path to command nvcc_wrapper")') + @$(call kokkos_append_cmakefile,"endif()") + @$(call kokkos_append_string,"") + @$(call kokkos_append_string,"#Source and Header files of Kokkos relative to KOKKOS_PATH") + @$(call kokkos_append_var,KOKKOS_HEADERS,'STRING "Kokkos headers list"') + @$(call kokkos_append_var,KOKKOS_HEADERS_IMPL,'STRING "Kokkos headers impl list"') + @$(call kokkos_append_var,KOKKOS_HEADERS_CUDA,'STRING "Kokkos headers Cuda list"') + @$(call kokkos_append_var,KOKKOS_HEADERS_OPENMP,'STRING "Kokkos headers OpenMP list"') + @$(call kokkos_append_var,KOKKOS_HEADERS_ROCM,'STRING "Kokkos headers ROCm list"') + @$(call kokkos_append_var,KOKKOS_HEADERS_THREADS,'STRING "Kokkos headers Threads list"') + @$(call kokkos_append_var,KOKKOS_HEADERS_QTHREADS,'STRING "Kokkos headers QThreads list"') + @$(call kokkos_append_var,KOKKOS_SRC,'STRING "Kokkos source list"') + @$(call kokkos_append_string,"") + @$(call kokkos_append_string,"#Variables used in application Makefiles") + @$(call kokkos_append_var,KOKKOS_OS,'STRING ""') # This was not in original cmake gen + @$(call kokkos_append_var,KOKKOS_CPP_DEPENDS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_LINK_DEPENDS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_CXXFLAGS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_CPPFLAGS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_LDFLAGS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_LIBS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_EXTRA_LIBS,'STRING ""') + @$(call kokkos_append_string,"") + @$(call kokkos_append_string,"#Internal settings which need to propagated for Kokkos examples") + @$(call kokkos_append_var,KOKKOS_INTERNAL_USE_CUDA,'STRING ""') + @$(call kokkos_append_var,KOKKOS_INTERNAL_USE_OPENMP,'STRING ""') + @$(call kokkos_append_var,KOKKOS_INTERNAL_USE_PTHREADS,'STRING ""') + @$(call kokkos_append_var,KOKKOS_INTERNAL_USE_ROCM,'STRING ""') + @$(call kokkos_append_var,KOKKOS_INTERNAL_USE_QTHREADS,'STRING ""') # Not in original cmake gen + @$(call kokkos_append_cmakefile "mark_as_advanced(KOKKOS_HEADERS KOKKOS_SRC KOKKOS_INTERNAL_USE_CUDA KOKKOS_INTERNAL_USE_OPENMP KOKKOS_INTERNAL_USE_PTHREADS)") + @$(call kokkos_append_makefile,"") + @$(call kokkos_append_makefile,"#Fake kokkos-clean target") + @$(call kokkos_append_makefile,"kokkos-clean:") + @$(call kokkos_append_makefile,"") + @sed \ + -e 's|$(KOKKOS_PATH)/core/src|$(PREFIX)/include|g' \ + -e 's|$(KOKKOS_PATH)/containers/src|$(PREFIX)/include|g' \ + -e 's|$(KOKKOS_PATH)/algorithms/src|$(PREFIX)/include|g' \ + -e 's|-L$(PWD)|-L$(PREFIX)/lib|g' \ + -e 's|= libkokkos.a|= $(PREFIX)/lib/libkokkos.a|g' \ + -e 's|= $(KOKKOS_CONFIG_HEADER)|= $(PREFIX)/include/$(KOKKOS_CONFIG_HEADER)|g' $(KOKKOS_MAKEFILE) \ + > $(KOKKOS_MAKEFILE).tmp + @mv -f $(KOKKOS_MAKEFILE).tmp $(KOKKOS_MAKEFILE) + @$(call kokkos_setvar_cmakefile,KOKKOS_CXX_FLAGS,$(KOKKOS_CXXFLAGS)) + @$(call kokkos_setvar_cmakefile,KOKKOS_CPP_FLAGS,$(KOKKOS_CPPFLAGS)) + @$(call kokkos_setvar_cmakefile,KOKKOS_LD_FLAGS,$(KOKKOS_LDFLAGS)) + @$(call kokkos_setlist_cmakefile,KOKKOS_LIBS_LIST,$(KOKKOS_LIBS)) + @$(call kokkos_setlist_cmakefile,KOKKOS_EXTRA_LIBS_LIST,$(KOKKOS_EXTRA_LIBS)) + diff --git a/lib/kokkos/core/src/Makefile.generate_header_lists b/lib/kokkos/core/src/Makefile.generate_header_lists new file mode 100644 index 0000000000..cd308bf8f4 --- /dev/null +++ b/lib/kokkos/core/src/Makefile.generate_header_lists @@ -0,0 +1,28 @@ +# Build a List of Header Files + +KOKKOS_HEADERS_INCLUDE = $(wildcard $(KOKKOS_PATH)/core/src/*.hpp) +KOKKOS_HEADERS_INCLUDE_IMPL = $(wildcard $(KOKKOS_PATH)/core/src/impl/*.hpp) +KOKKOS_HEADERS_INCLUDE += $(wildcard $(KOKKOS_PATH)/containers/src/*.hpp) +KOKKOS_HEADERS_INCLUDE_IMPL += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.hpp) +KOKKOS_HEADERS_INCLUDE += $(wildcard $(KOKKOS_PATH)/algorithms/src/*.hpp) + +ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) + KOKKOS_HEADERS_CUDA += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) +endif + +ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) + KOKKOS_HEADERS_THREADS += $(wildcard $(KOKKOS_PATH)/core/src/Threads/*.hpp) +endif + +ifeq ($(KOKKOS_INTERNAL_USE_QTHREADS), 1) + KOKKOS_HEADERS_QTHREADS += $(wildcard $(KOKKOS_PATH)/core/src/Qthreads/*.hpp) +endif + +ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) + KOKKOS_HEADERS_OPENMP += $(wildcard $(KOKKOS_PATH)/core/src/OpenMP/*.hpp) +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + KOKKOS_HEADERS_ROCM += $(wildcard $(KOKKOS_PATH)/core/src/ROCm/*.hpp) +endif + diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp index 4e0ea93920..ed19a248a6 100644 --- a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp @@ -45,75 +45,100 @@ #if defined( KOKKOS_ENABLE_OPENMP ) #include +#include + #include #include #include + #include + #include -#include #include #include namespace Kokkos { namespace Impl { -namespace { -KOKKOS_INLINE_FUNCTION -int kokkos_omp_in_parallel(); +int g_openmp_hardware_max_threads = 1; -int kokkos_omp_in_critical_region = ( Kokkos::HostSpace::register_in_parallel( kokkos_omp_in_parallel ) , 0 ); +__thread int t_openmp_hardware_id = 0; +__thread Impl::OpenMPExec * t_openmp_instance = nullptr; -KOKKOS_INLINE_FUNCTION -int kokkos_omp_in_parallel() +void OpenMPExec::validate_partition( const int nthreads + , int & num_partitions + , int & partition_size + ) { -#ifndef __CUDA_ARCH__ - return omp_in_parallel() && ! kokkos_omp_in_critical_region ; -#else - return 0; -#endif + if (nthreads == 1) { + num_partitions = 1; + partition_size = 1; + } + else if( num_partitions < 1 && partition_size < 1) { + int idle = nthreads; + for (int np = 2; np <= nthreads ; ++np) { + for (int ps = 1; ps <= nthreads/np; ++ps) { + if (nthreads - np*ps < idle) { + idle = nthreads - np*ps; + num_partitions = np; + partition_size = ps; + } + if (idle == 0) { + break; + } + } + } + } + else if( num_partitions < 1 && partition_size > 0 ) { + if ( partition_size <= nthreads ) { + num_partitions = nthreads / partition_size; + } + else { + num_partitions = 1; + partition_size = nthreads; + } + } + else if( num_partitions > 0 && partition_size < 1 ) { + if ( num_partitions <= nthreads ) { + partition_size = nthreads / num_partitions; + } + else { + num_partitions = nthreads; + partition_size = 1; + } + } + else if ( num_partitions * partition_size > nthreads ) { + int idle = nthreads; + const int NP = num_partitions; + const int PS = partition_size; + for (int np = NP; np > 0; --np) { + for (int ps = PS; ps > 0; --ps) { + if ( (np*ps <= nthreads) + && (nthreads - np*ps < idle) ) { + idle = nthreads - np*ps; + num_partitions = np; + partition_size = ps; + } + if (idle == 0) { + break; + } + } + } + } + } -bool s_using_hwloc = false; - -} // namespace -} // namespace Impl -} // namespace Kokkos - - -namespace Kokkos { -namespace Impl { - -int OpenMPExec::m_map_rank[ OpenMPExec::MAX_THREAD_COUNT ] = { 0 }; - -int OpenMPExec::m_pool_topo[ 4 ] = { 0 }; - -HostThreadTeamData * OpenMPExec::m_pool[ OpenMPExec::MAX_THREAD_COUNT ] = { 0 }; - -void OpenMPExec::verify_is_process( const char * const label ) +void OpenMPExec::verify_is_master( const char * const label ) { - if ( omp_in_parallel() ) { + if ( !t_openmp_instance ) + { std::string msg( label ); - msg.append( " ERROR: in parallel" ); + msg.append( " ERROR: in parallel or not initialized" ); Kokkos::Impl::throw_runtime_exception( msg ); } } -void OpenMPExec::verify_initialized( const char * const label ) -{ - if ( 0 == m_pool[0] ) { - std::string msg( label ); - msg.append( " ERROR: not initialized" ); - Kokkos::Impl::throw_runtime_exception( msg ); - } - - if ( omp_get_max_threads() != Kokkos::OpenMP::thread_pool_size(0) ) { - std::string msg( label ); - msg.append( " ERROR: Initialized but threads modified inappropriately" ); - Kokkos::Impl::throw_runtime_exception( msg ); - } - -} } // namespace Impl } // namespace Kokkos @@ -133,11 +158,11 @@ void OpenMPExec::clear_thread_data() const int old_alloc_bytes = m_pool[0] ? ( member_bytes + m_pool[0]->scratch_bytes() ) : 0 ; - Kokkos::HostSpace space ; + OpenMP::memory_space space ; -#pragma omp parallel + #pragma omp parallel num_threads( m_pool_size ) { - const int rank = m_map_rank[ omp_get_thread_num() ]; + const int rank = omp_get_thread_num(); if ( 0 != m_pool[rank] ) { @@ -189,13 +214,13 @@ void OpenMPExec::resize_thread_data( size_t pool_reduce_bytes , team_shared_bytes , thread_local_bytes ); - const int pool_size = omp_get_max_threads(); + OpenMP::memory_space space ; - Kokkos::HostSpace space ; + memory_fence(); -#pragma omp parallel + #pragma omp parallel num_threads(m_pool_size) { - const int rank = m_map_rank[ omp_get_thread_num() ]; + const int rank = omp_get_thread_num(); if ( 0 != m_pool[rank] ) { @@ -214,11 +239,14 @@ void OpenMPExec::resize_thread_data( size_t pool_reduce_bytes , pool_reduce_bytes , team_reduce_bytes , team_shared_bytes - , thread_local_bytes ); + , thread_local_bytes + ); + + memory_fence(); } /* END #pragma omp parallel */ - HostThreadTeamData::organize_pool( m_pool , pool_size ); + HostThreadTeamData::organize_pool( m_pool , m_pool_size ); } } @@ -232,16 +260,8 @@ namespace Kokkos { //---------------------------------------------------------------------------- -int OpenMP::is_initialized() -{ return 0 != Impl::OpenMPExec::m_pool[0]; } - -void OpenMP::initialize( unsigned thread_count , - unsigned use_numa_count , - unsigned use_cores_per_numa ) +int OpenMP::get_current_max_threads() noexcept { - // Before any other call to OMP query the maximum number of threads - // and save the value for re-initialization unit testing. - // Using omp_get_max_threads(); is problematic in conjunction with // Hwloc on Intel (essentially an initial call to the OpenMP runtime // without a parallel region before will set a process mask for a single core @@ -250,117 +270,106 @@ void OpenMP::initialize( unsigned thread_count , // the thread masks. The intend seems to be to make serial code run fast, if you // compile with OpenMP enabled but don't actually use parallel regions or so // static int omp_max_threads = omp_get_max_threads(); - int nthreads = 0; + + int count = 0; #pragma omp parallel { #pragma omp atomic - nthreads++; + ++count; } + return count; +} - static int omp_max_threads = nthreads; - - const bool is_initialized = 0 != Impl::OpenMPExec::m_pool[0] ; - - bool thread_spawn_failed = false ; - - if ( ! is_initialized ) { - - // Use hwloc thread pinning if concerned with locality. - // If spreading threads across multiple NUMA regions. - // If hyperthreading is enabled. - Impl::s_using_hwloc = hwloc::available() && ( - ( 1 < Kokkos::hwloc::get_available_numa_count() ) || - ( 1 < Kokkos::hwloc::get_available_threads_per_core() ) ); - - std::pair threads_coord[ Impl::OpenMPExec::MAX_THREAD_COUNT ]; - - // If hwloc available then use it's maximum value. - - if ( thread_count == 0 ) { - thread_count = Impl::s_using_hwloc - ? Kokkos::hwloc::get_available_numa_count() * - Kokkos::hwloc::get_available_cores_per_numa() * - Kokkos::hwloc::get_available_threads_per_core() - : omp_max_threads ; - } - - if(Impl::s_using_hwloc) - hwloc::thread_mapping( "Kokkos::OpenMP::initialize" , - false /* do not allow asynchronous */ , - thread_count , - use_numa_count , - use_cores_per_numa , - threads_coord ); - - // Spawn threads: - - omp_set_num_threads( thread_count ); - - // Verify OMP interaction: - if ( int(thread_count) != omp_get_max_threads() ) { - thread_spawn_failed = true ; - } - - // Verify spawning and bind threads: -#pragma omp parallel - { -#pragma omp critical - { - if ( int(thread_count) != omp_get_num_threads() ) { - thread_spawn_failed = true ; - } - - // Call to 'bind_this_thread' is not thread safe so place this whole block in a critical region. - // Call to 'new' may not be thread safe as well. - - const unsigned omp_rank = omp_get_thread_num(); - const unsigned thread_r = Impl::s_using_hwloc && Kokkos::hwloc::can_bind_threads() - ? Kokkos::hwloc::bind_this_thread( thread_count , threads_coord ) - : omp_rank ; - - Impl::OpenMPExec::m_map_rank[ omp_rank ] = thread_r ; - } -/* END #pragma omp critical */ - } -/* END #pragma omp parallel */ - - if ( ! thread_spawn_failed ) { - Impl::OpenMPExec::m_pool_topo[0] = thread_count ; - Impl::OpenMPExec::m_pool_topo[1] = Impl::s_using_hwloc ? thread_count / use_numa_count : thread_count; - Impl::OpenMPExec::m_pool_topo[2] = Impl::s_using_hwloc ? thread_count / ( use_numa_count * use_cores_per_numa ) : 1; - - // New, unified host thread team data: - { - size_t pool_reduce_bytes = 32 * thread_count ; - size_t team_reduce_bytes = 32 * thread_count ; - size_t team_shared_bytes = 1024 * thread_count ; - size_t thread_local_bytes = 1024 ; - - Impl::OpenMPExec::resize_thread_data( pool_reduce_bytes - , team_reduce_bytes - , team_shared_bytes - , thread_local_bytes - ); - } - } - } - - if ( is_initialized || thread_spawn_failed ) { - std::string msg("Kokkos::OpenMP::initialize ERROR"); - - if ( is_initialized ) { msg.append(" : already initialized"); } - if ( thread_spawn_failed ) { msg.append(" : failed spawning threads"); } +void OpenMP::initialize( int thread_count ) +{ + if ( omp_in_parallel() ) { + std::string msg("Kokkos::OpenMP::initialize ERROR : in parallel"); Kokkos::Impl::throw_runtime_exception(msg); } + if ( Impl::t_openmp_instance ) + { + finalize(); + } + + { + if ( Kokkos::show_warnings() && nullptr == std::getenv("OMP_PROC_BIND") ) { + printf("Kokkos::OpenMP::initialize WARNING: OMP_PROC_BIND environment variable not set\n"); + printf(" In general, for best performance with OpenMP 4.0 or better set OMP_PROC_BIND=spread and OMP_PLACES=threads\n"); + printf(" For best performance with OpenMP 3.1 set OMP_PROC_BIND=true\n"); + printf(" For unit testing set OMP_PROC_BIND=false\n"); + } + + OpenMP::memory_space space ; + + // Before any other call to OMP query the maximum number of threads + // and save the value for re-initialization unit testing. + + Impl::g_openmp_hardware_max_threads = get_current_max_threads(); + + int process_num_threads = Impl::g_openmp_hardware_max_threads; + + if ( Kokkos::hwloc::available() ) { + process_num_threads = Kokkos::hwloc::get_available_numa_count() + * Kokkos::hwloc::get_available_cores_per_numa() + * Kokkos::hwloc::get_available_threads_per_core(); + } + + // if thread_count < 0, use g_openmp_hardware_max_threads; + // if thread_count == 0, set g_openmp_hardware_max_threads to process_num_threads + // if thread_count > 0, set g_openmp_hardware_max_threads to thread_count + if (thread_count < 0 ) { + thread_count = Impl::g_openmp_hardware_max_threads; + } + else if( thread_count == 0 && Impl::g_openmp_hardware_max_threads != process_num_threads ) { + Impl::g_openmp_hardware_max_threads = process_num_threads; + omp_set_num_threads(Impl::g_openmp_hardware_max_threads); + } + else { + if( Kokkos::show_warnings() && thread_count > process_num_threads ) { + printf( "Kokkos::OpenMP::initialize WARNING: You are likely oversubscribing your CPU cores.\n"); + printf( " process threads available : %3d, requested thread : %3d\n", process_num_threads, thread_count ); + } + Impl::g_openmp_hardware_max_threads = thread_count; + omp_set_num_threads(Impl::g_openmp_hardware_max_threads); + } + + // setup thread local + #pragma omp parallel num_threads(Impl::g_openmp_hardware_max_threads) + { + Impl::t_openmp_instance = nullptr; + Impl::t_openmp_hardware_id = omp_get_thread_num(); + Impl::SharedAllocationRecord< void, void >::tracking_enable(); + } + + void * const ptr = space.allocate( sizeof(Impl::OpenMPExec) ); + + Impl::t_openmp_instance = new (ptr) Impl::OpenMPExec( Impl::g_openmp_hardware_max_threads ); + + // New, unified host thread team data: + { + size_t pool_reduce_bytes = 32 * thread_count ; + size_t team_reduce_bytes = 32 * thread_count ; + size_t team_shared_bytes = 1024 * thread_count ; + size_t thread_local_bytes = 1024 ; + + Impl::t_openmp_instance->resize_thread_data( pool_reduce_bytes + , team_reduce_bytes + , team_shared_bytes + , thread_local_bytes + ); + } + } + + // Check for over-subscription - //if( Impl::mpi_ranks_per_node() * long(thread_count) > Impl::processors_per_node() ) { - // std::cout << "Kokkos::OpenMP::initialize WARNING: You are likely oversubscribing your CPU cores." << std::endl; - // std::cout << " Detected: " << Impl::processors_per_node() << " cores per node." << std::endl; - // std::cout << " Detected: " << Impl::mpi_ranks_per_node() << " MPI_ranks per node." << std::endl; - // std::cout << " Requested: " << thread_count << " threads per process." << std::endl; - //} + if( Kokkos::show_warnings() && (Impl::mpi_ranks_per_node() * long(thread_count) > Impl::processors_per_node()) ) { + std::cout << "Kokkos::OpenMP::initialize WARNING: You are likely oversubscribing your CPU cores." << std::endl; + std::cout << " Detected: " << Impl::processors_per_node() << " cores per node." << std::endl; + std::cout << " Detected: " << Impl::mpi_ranks_per_node() << " MPI_ranks per node." << std::endl; + std::cout << " Requested: " << thread_count << " threads per process." << std::endl; + } // Init the array for used for arbitrarily sized atomics Impl::init_lock_array_host_space(); @@ -373,20 +382,38 @@ void OpenMP::initialize( unsigned thread_count , void OpenMP::finalize() { - Impl::OpenMPExec::verify_initialized( "OpenMP::finalize" ); - Impl::OpenMPExec::verify_is_process( "OpenMP::finalize" ); + if ( omp_in_parallel() ) + { + std::string msg("Kokkos::OpenMP::finalize ERROR "); + if( !Impl::t_openmp_instance ) msg.append(": not initialized"); + if( omp_in_parallel() ) msg.append(": in parallel"); + Kokkos::Impl::throw_runtime_exception(msg); + } - // New, unified host thread team data: - Impl::OpenMPExec::clear_thread_data(); + if ( Impl::t_openmp_instance ) { - Impl::OpenMPExec::m_pool_topo[0] = 0 ; - Impl::OpenMPExec::m_pool_topo[1] = 0 ; - Impl::OpenMPExec::m_pool_topo[2] = 0 ; + const int nthreads = Impl::t_openmp_instance->m_pool_size <= Impl::g_openmp_hardware_max_threads + ? Impl::g_openmp_hardware_max_threads + : Impl::t_openmp_instance->m_pool_size; - omp_set_num_threads(1); + using Exec = Impl::OpenMPExec; + Exec * instance = Impl::t_openmp_instance; + instance->~Exec(); - if ( Impl::s_using_hwloc && Kokkos::hwloc::can_bind_threads() ) { - hwloc::unbind_this_thread(); + OpenMP::memory_space space; + space.deallocate( instance, sizeof(Exec) ); + + #pragma omp parallel num_threads(nthreads) + { + Impl::t_openmp_hardware_id = 0; + Impl::t_openmp_instance = nullptr; + Impl::SharedAllocationRecord< void, void >::tracking_disable(); + } + + // allow main thread to track + Impl::SharedAllocationRecord< void, void >::tracking_enable(); + + Impl::g_openmp_hardware_max_threads = 1; } #if defined(KOKKOS_ENABLE_PROFILING) @@ -396,70 +423,48 @@ void OpenMP::finalize() //---------------------------------------------------------------------------- -void OpenMP::print_configuration( std::ostream & s , const bool detail ) +void OpenMP::print_configuration( std::ostream & s , const bool verbose ) { - Impl::OpenMPExec::verify_is_process( "OpenMP::print_configuration" ); - s << "Kokkos::OpenMP" ; -#if defined( KOKKOS_ENABLE_OPENMP ) - s << " KOKKOS_ENABLE_OPENMP" ; -#endif -#if defined( KOKKOS_ENABLE_HWLOC ) - - const unsigned numa_count_ = Kokkos::hwloc::get_available_numa_count(); - const unsigned cores_per_numa = Kokkos::hwloc::get_available_cores_per_numa(); - const unsigned threads_per_core = Kokkos::hwloc::get_available_threads_per_core(); - - s << " hwloc[" << numa_count_ << "x" << cores_per_numa << "x" << threads_per_core << "]" - << " hwloc_binding_" << ( Impl::s_using_hwloc ? "enabled" : "disabled" ) - ; -#endif - - const bool is_initialized = 0 != Impl::OpenMPExec::m_pool[0] ; + const bool is_initialized = Impl::t_openmp_instance != nullptr; if ( is_initialized ) { - const int numa_count = Kokkos::Impl::OpenMPExec::m_pool_topo[0] / Kokkos::Impl::OpenMPExec::m_pool_topo[1] ; - const int core_per_numa = Kokkos::Impl::OpenMPExec::m_pool_topo[1] / Kokkos::Impl::OpenMPExec::m_pool_topo[2] ; - const int thread_per_core = Kokkos::Impl::OpenMPExec::m_pool_topo[2] ; + Impl::OpenMPExec::verify_is_master( "OpenMP::print_configuration" ); + + const int numa_count = 1; + const int core_per_numa = Impl::g_openmp_hardware_max_threads; + const int thread_per_core = 1; s << " thread_pool_topology[ " << numa_count << " x " << core_per_numa << " x " << thread_per_core << " ]" << std::endl ; - - if ( detail ) { - std::vector< std::pair > coord( Kokkos::Impl::OpenMPExec::m_pool_topo[0] ); - -#pragma omp parallel - { -#pragma omp critical - { - coord[ omp_get_thread_num() ] = hwloc::get_this_thread_coordinate(); - } -/* END #pragma omp critical */ - } -/* END #pragma omp parallel */ - - for ( unsigned i = 0 ; i < coord.size() ; ++i ) { - s << " thread omp_rank[" << i << "]" - << " kokkos_rank[" << Impl::OpenMPExec::m_map_rank[ i ] << "]" - << " hwloc_coord[" << coord[i].first << "." << coord[i].second << "]" - << std::endl ; - } - } } else { s << " not initialized" << std::endl ; } } +std::vector OpenMP::partition(...) +{ return std::vector(1); } + +OpenMP OpenMP::create_instance(...) { return OpenMP(); } + + +#if !defined( KOKKOS_DISABLE_DEPRECATED ) + int OpenMP::concurrency() { - return thread_pool_size(0); + return Impl::g_openmp_hardware_max_threads; } -const char* OpenMP::name() { return "OpenMP"; } +void OpenMP::initialize( int thread_count , int, int ) +{ + initialize(thread_count); +} + +#endif } // namespace Kokkos diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp index 75b7f5da4a..de84f6e59f 100644 --- a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp @@ -47,6 +47,10 @@ #include #if defined( KOKKOS_ENABLE_OPENMP ) +#if !defined(_OPENMP) +#error "You enabled Kokkos OpenMP support without enabling OpenMP in the compiler!" +#endif + #include #include @@ -54,6 +58,8 @@ #include +#include + #include #include #include @@ -63,8 +69,14 @@ //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- -namespace Kokkos { -namespace Impl { +namespace Kokkos { namespace Impl { + +class OpenMPExec; + +extern int g_openmp_hardware_max_threads; + +extern __thread int t_openmp_hardware_id; +extern __thread OpenMPExec * t_openmp_instance; //---------------------------------------------------------------------------- /** \brief Data for OpenMP thread execution */ @@ -74,279 +86,280 @@ public: friend class Kokkos::OpenMP ; - enum { MAX_THREAD_COUNT = 4096 }; + enum { MAX_THREAD_COUNT = 512 }; + + void clear_thread_data(); + + static void validate_partition( const int nthreads + , int & num_partitions + , int & partition_size + ); private: + OpenMPExec( int arg_pool_size ) + : m_pool_size{ arg_pool_size } + , m_level{ omp_get_level() } + , m_pool() + {} - static int m_pool_topo[ 4 ]; - static int m_map_rank[ MAX_THREAD_COUNT ]; + ~OpenMPExec() + { + clear_thread_data(); + } - static HostThreadTeamData * m_pool[ MAX_THREAD_COUNT ]; + int m_pool_size; + int m_level; - static - void clear_thread_data(); + HostThreadTeamData * m_pool[ MAX_THREAD_COUNT ]; public: - // Topology of a cache coherent thread pool: - // TOTAL = NUMA x GRAIN - // pool_size( depth = 0 ) - // pool_size(0) = total number of threads - // pool_size(1) = number of threads per NUMA - // pool_size(2) = number of threads sharing finest grain memory hierarchy + static void verify_is_master( const char * const ); - inline static - int pool_size( int depth = 0 ) { return m_pool_topo[ depth ]; } - - static void finalize(); - - static void initialize( const unsigned team_count , - const unsigned threads_per_team , - const unsigned numa_count , - const unsigned cores_per_numa ); - - static void verify_is_process( const char * const ); - static void verify_initialized( const char * const ); - - - static void resize_thread_data( size_t pool_reduce_bytes , size_t team_reduce_bytes , size_t team_shared_bytes , size_t thread_local_bytes ); - inline static - HostThreadTeamData * get_thread_data() noexcept - { return m_pool[ m_map_rank[ omp_get_thread_num() ] ]; } + inline + HostThreadTeamData * get_thread_data() const noexcept + { return m_pool[ m_level == omp_get_level() ? 0 : omp_get_thread_num() ]; } - inline static - HostThreadTeamData * get_thread_data( int i ) noexcept - { return m_pool[i]; } + inline + HostThreadTeamData * get_thread_data( int i ) const noexcept + { return m_pool[i]; } }; -} // namespace Impl -} // namespace Kokkos - -//---------------------------------------------------------------------------- -//---------------------------------------------------------------------------- - -namespace Kokkos { -namespace Impl { - -template< class ... Properties > -class TeamPolicyInternal< Kokkos::OpenMP, Properties ... >: public PolicyTraits -{ -public: - - //! Tag this class as a kokkos execution policy - typedef TeamPolicyInternal execution_policy ; - - typedef PolicyTraits traits; - - TeamPolicyInternal& operator = (const TeamPolicyInternal& p) { - m_league_size = p.m_league_size; - m_team_size = p.m_team_size; - m_team_alloc = p.m_team_alloc; - m_team_iter = p.m_team_iter; - m_team_scratch_size[0] = p.m_team_scratch_size[0]; - m_thread_scratch_size[0] = p.m_thread_scratch_size[0]; - m_team_scratch_size[1] = p.m_team_scratch_size[1]; - m_thread_scratch_size[1] = p.m_thread_scratch_size[1]; - m_chunk_size = p.m_chunk_size; - return *this; - } - - //---------------------------------------- - - template< class FunctorType > - inline static - int team_size_max( const FunctorType & ) { - int pool_size = traits::execution_space::thread_pool_size(1); - int max_host_team_size = Impl::HostThreadTeamData::max_team_members; - return pool_size - inline static - int team_size_recommended( const FunctorType & ) - { return traits::execution_space::thread_pool_size(2); } - - template< class FunctorType > - inline static - int team_size_recommended( const FunctorType &, const int& ) - { return traits::execution_space::thread_pool_size(2); } - - //---------------------------------------- - -private: - - int m_league_size ; - int m_team_size ; - int m_team_alloc ; - int m_team_iter ; - - size_t m_team_scratch_size[2]; - size_t m_thread_scratch_size[2]; - - int m_chunk_size; - - inline void init( const int league_size_request - , const int team_size_request ) - { - const int pool_size = traits::execution_space::thread_pool_size(0); - const int max_host_team_size = Impl::HostThreadTeamData::max_team_members; - const int team_max = pool_size 0) { - if(!Impl::is_integral_power_of_two( m_chunk_size )) - Kokkos::abort("TeamPolicy blocking granularity must be power of two" ); - } - - int new_chunk_size = 1; - while(new_chunk_size*100*concurrency < m_league_size) - new_chunk_size *= 2; - if(new_chunk_size < 128) { - new_chunk_size = 1; - while( (new_chunk_size*40*concurrency < m_league_size ) && (new_chunk_size<128) ) - new_chunk_size*=2; - } - m_chunk_size = new_chunk_size; - } - -public: - typedef Impl::HostThreadTeamMember< Kokkos::OpenMP > member_type ; -}; -} // namespace Impl - -} // namespace Kokkos +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -inline -bool OpenMP::in_parallel() -{ return omp_in_parallel(); } +inline OpenMP::OpenMP() noexcept +{} inline -int OpenMP::thread_pool_size( int depth ) +bool OpenMP::is_initialized() noexcept +{ return Impl::t_openmp_instance != nullptr; } + +inline +bool OpenMP::in_parallel( OpenMP const& ) noexcept { - return Impl::OpenMPExec::pool_size(depth); + //t_openmp_instance is only non-null on a master thread + return !Impl::t_openmp_instance + || Impl::t_openmp_instance->m_level < omp_get_level() + ; +} + +inline +int OpenMP::thread_pool_size() noexcept +{ + return OpenMP::in_parallel() + ? omp_get_num_threads() + : Impl::t_openmp_instance->m_pool_size + ; } KOKKOS_INLINE_FUNCTION -int OpenMP::thread_pool_rank() +int OpenMP::thread_pool_rank() noexcept { #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) - return Impl::OpenMPExec::m_map_rank[ omp_get_thread_num() ]; + return Impl::t_openmp_instance ? 0 : omp_get_thread_num(); #else return -1 ; #endif } +inline +void OpenMP::fence( OpenMP const& instance ) noexcept {} + +inline +bool OpenMP::is_asynchronous( OpenMP const& instance ) noexcept +{ return false; } + +template +void OpenMP::partition_master( F const& f + , int num_partitions + , int partition_size + ) +{ + if (omp_get_nested()) { + using Exec = Impl::OpenMPExec; + + Exec * prev_instance = Impl::t_openmp_instance; + + Exec::validate_partition( prev_instance->m_pool_size, num_partitions, partition_size ); + + OpenMP::memory_space space; + + #pragma omp parallel num_threads(num_partitions) + { + void * const ptr = space.allocate( sizeof(Exec) ); + + Impl::t_openmp_instance = new (ptr) Exec( partition_size ); + + size_t pool_reduce_bytes = 32 * partition_size ; + size_t team_reduce_bytes = 32 * partition_size ; + size_t team_shared_bytes = 1024 * partition_size ; + size_t thread_local_bytes = 1024 ; + + Impl::t_openmp_instance->resize_thread_data( pool_reduce_bytes + , team_reduce_bytes + , team_shared_bytes + , thread_local_bytes + ); + + omp_set_num_threads(partition_size); + f( omp_get_thread_num(), omp_get_num_threads() ); + + Impl::t_openmp_instance->~Exec(); + space.deallocate( Impl::t_openmp_instance, sizeof(Exec) ); + Impl::t_openmp_instance = nullptr; + } + + Impl::t_openmp_instance = prev_instance; + } + else { + // nested openmp not enabled + f(0,1); + } +} + + +namespace Experimental { + +template<> +class MasterLock +{ +public: + void lock() { omp_set_lock( &m_lock ); } + void unlock() { omp_unset_lock( &m_lock ); } + bool try_lock() { return static_cast(omp_test_lock( &m_lock )); } + + MasterLock() { omp_init_lock( &m_lock ); } + ~MasterLock() { omp_destroy_lock( &m_lock ); } + + MasterLock( MasterLock const& ) = delete; + MasterLock( MasterLock && ) = delete; + MasterLock & operator=( MasterLock const& ) = delete; + MasterLock & operator=( MasterLock && ) = delete; + +private: + omp_lock_t m_lock; + +}; + +template<> +class UniqueToken< OpenMP, UniqueTokenScope::Instance> +{ +public: + using execution_space = OpenMP; + using size_type = int; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ) noexcept {} + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + KOKKOS_INLINE_FUNCTION + int size() const noexcept + { + #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + return Kokkos::OpenMP::thread_pool_size(); + #else + return 0 ; + #endif + } + + /// \brief acquire value such that 0 <= value < size() + KOKKOS_INLINE_FUNCTION + int acquire() const noexcept + { + #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + return Kokkos::OpenMP::thread_pool_rank(); + #else + return 0 ; + #endif + } + + /// \brief release a value acquired by generate + KOKKOS_INLINE_FUNCTION + void release( int ) const noexcept {} +}; + +template<> +class UniqueToken< OpenMP, UniqueTokenScope::Global> +{ +public: + using execution_space = OpenMP; + using size_type = int; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ) noexcept {} + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + KOKKOS_INLINE_FUNCTION + int size() const noexcept + { + #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + return Kokkos::Impl::g_openmp_hardware_max_threads ; + #else + return 0 ; + #endif + } + + /// \brief acquire value such that 0 <= value < size() + KOKKOS_INLINE_FUNCTION + int acquire() const noexcept + { + #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + return Kokkos::Impl::t_openmp_hardware_id ; + #else + return 0 ; + #endif + } + + /// \brief release a value acquired by generate + KOKKOS_INLINE_FUNCTION + void release( int ) const noexcept {} +}; + +} // namespace Experimental + + +#if !defined( KOKKOS_DISABLE_DEPRECATED ) + +inline +int OpenMP::thread_pool_size( int depth ) +{ + return depth < 2 + ? thread_pool_size() + : 1; +} + +KOKKOS_INLINE_FUNCTION +int OpenMP::hardware_thread_id() noexcept +{ +#if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + return Impl::t_openmp_hardware_id; +#else + return -1 ; +#endif +} + +inline +int OpenMP::max_hardware_threads() noexcept +{ + return Impl::g_openmp_hardware_max_threads; +} + +#endif // KOKKOS_DISABLE_DEPRECATED + } // namespace Kokkos #endif diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel.hpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel.hpp index c47e0fc654..70115b4728 100644 --- a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel.hpp +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Parallel.hpp @@ -52,6 +52,8 @@ #include #include +#include + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -71,8 +73,9 @@ private: typedef typename Policy::WorkRange WorkRange ; typedef typename Policy::member_type Member ; - const FunctorType m_functor ; - const Policy m_policy ; + OpenMPExec * m_instance ; + const FunctorType m_functor ; + const Policy m_policy ; template< class TagType > inline static @@ -110,16 +113,120 @@ private: public: inline void execute() const + { + enum { is_dynamic = std::is_same< typename Policy::schedule_type::type + , Kokkos::Dynamic >::value + }; + + if ( OpenMP::in_parallel() ) { + exec_range< WorkTag >( m_functor + , m_policy.begin() + , m_policy.end() ); + } + else { + + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_for"); + + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) + { + HostThreadTeamData & data = *(m_instance->get_thread_data()); + + data.set_work_partition( m_policy.end() - m_policy.begin() + , m_policy.chunk_size() ); + + if ( is_dynamic ) { + // Make sure work partition is set before stealing + if ( data.pool_rendezvous() ) data.pool_rendezvous_release(); + } + + std::pair range(0,0); + + do { + + range = is_dynamic ? data.get_work_stealing_chunk() + : data.get_work_partition(); + + ParallelFor::template + exec_range< WorkTag >( m_functor + , range.first + m_policy.begin() + , range.second + m_policy.begin() ); + + } while ( is_dynamic && 0 <= range.first ); + } + } + } + + inline + ParallelFor( const FunctorType & arg_functor + , Policy arg_policy ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) + , m_policy( arg_policy ) + {} +}; + + +// MDRangePolicy impl +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType + , Kokkos::MDRangePolicy< Traits ... > + , Kokkos::OpenMP + > +{ +private: + + typedef Kokkos::MDRangePolicy< Traits ... > MDRangePolicy ; + typedef typename MDRangePolicy::impl_range_policy Policy ; + typedef typename MDRangePolicy::work_tag WorkTag ; + + typedef typename Policy::WorkRange WorkRange ; + typedef typename Policy::member_type Member ; + + typedef typename Kokkos::Impl::HostIterateTile< MDRangePolicy, FunctorType, typename MDRangePolicy::work_tag, void > iterate_type; + + OpenMPExec * m_instance ; + const FunctorType m_functor ; + const MDRangePolicy m_mdr_policy ; + const Policy m_policy ; // construct as RangePolicy( 0, num_tiles ).set_chunk_size(1) in ctor + + inline static + void + exec_range( const MDRangePolicy & mdr_policy + , const FunctorType & functor + , const Member ibeg , const Member iend ) { + #ifdef KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION + #ifdef KOKKOS_ENABLE_PRAGMA_IVDEP + #pragma ivdep + #endif + #endif + for ( Member iwork = ibeg ; iwork < iend ; ++iwork ) { + iterate_type( mdr_policy, functor )( iwork ); + } + } + +public: + + inline void execute() const + { enum { is_dynamic = std::is_same< typename Policy::schedule_type::type , Kokkos::Dynamic >::value }; - OpenMPExec::verify_is_process("Kokkos::OpenMP parallel_for"); - OpenMPExec::verify_initialized("Kokkos::OpenMP parallel_for"); + if ( OpenMP::in_parallel() ) { + ParallelFor::exec_range ( m_mdr_policy + , m_functor + , m_policy.begin() + , m_policy.end() ); + } + else { -#pragma omp parallel + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_for"); + + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) { - HostThreadTeamData & data = *OpenMPExec::get_thread_data(); + HostThreadTeamData & data = *(m_instance->get_thread_data()); data.set_work_partition( m_policy.end() - m_policy.begin() , m_policy.chunk_size() ); @@ -136,8 +243,8 @@ public: range = is_dynamic ? data.get_work_stealing_chunk() : data.get_work_partition(); - ParallelFor::template - exec_range< WorkTag >( m_functor + ParallelFor::exec_range( m_mdr_policy + , m_functor , range.first + m_policy.begin() , range.second + m_policy.begin() ); @@ -145,12 +252,15 @@ public: } // END #pragma omp parallel } + } inline ParallelFor( const FunctorType & arg_functor - , Policy arg_policy ) - : m_functor( arg_functor ) - , m_policy( arg_policy ) + , MDRangePolicy arg_policy ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) {} }; @@ -182,19 +292,21 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; // Static Assert WorkTag void if ReducerType not InvalidType - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; - typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTag > ValueJoin ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTagFwd > ValueJoin ; typedef typename Analysis::pointer_type pointer_type ; typedef typename Analysis::reference_type reference_type ; - const FunctorType m_functor ; - const Policy m_policy ; - const ReducerType m_reducer ; - const pointer_type m_result_ptr ; + OpenMPExec * m_instance; + const FunctorType m_functor; + const Policy m_policy; + const ReducerType m_reducer; + const pointer_type m_result_ptr; template< class TagType > inline static @@ -228,21 +340,21 @@ public: enum { is_dynamic = std::is_same< typename Policy::schedule_type::type , Kokkos::Dynamic >::value }; - OpenMPExec::verify_is_process("Kokkos::OpenMP parallel_reduce"); - OpenMPExec::verify_initialized("Kokkos::OpenMP parallel_reduce"); + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_reduce"); const size_t pool_reduce_bytes = Analysis::value_size( ReducerConditional::select(m_functor, m_reducer)); - OpenMPExec::resize_thread_data( pool_reduce_bytes + m_instance->resize_thread_data( pool_reduce_bytes , 0 // team_reduce_bytes , 0 // team_shared_bytes , 0 // thread_local_bytes ); -#pragma omp parallel + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) { - HostThreadTeamData & data = *OpenMPExec::get_thread_data(); + HostThreadTeamData & data = *(m_instance->get_thread_data()); data.set_work_partition( m_policy.end() - m_policy.begin() , m_policy.chunk_size() ); @@ -271,19 +383,18 @@ public: } while ( is_dynamic && 0 <= range.first ); } -// END #pragma omp parallel // Reduction: - const pointer_type ptr = pointer_type( OpenMPExec::get_thread_data(0)->pool_reduce_local() ); + const pointer_type ptr = pointer_type( m_instance->get_thread_data(0)->pool_reduce_local() ); - for ( int i = 1 ; i < OpenMPExec::pool_size() ; ++i ) { + for ( int i = 1 ; i < pool_size ; ++i ) { ValueJoin::join( ReducerConditional::select(m_functor , m_reducer) , ptr - , OpenMPExec::get_thread_data(i)->pool_reduce_local() ); + , m_instance->get_thread_data(i)->pool_reduce_local() ); } - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , ptr ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , ptr ); if ( m_result_ptr ) { const int n = Analysis::value_count( ReducerConditional::select(m_functor , m_reducer) ); @@ -303,7 +414,8 @@ public: Kokkos::is_view< ViewType >::value && !Kokkos::is_reducer_type::value ,void*>::type = NULL) - : m_functor( arg_functor ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) , m_policy( arg_policy ) , m_reducer( InvalidType() ) , m_result_ptr( arg_view.data() ) @@ -317,7 +429,8 @@ public: ParallelReduce( const FunctorType & arg_functor , Policy arg_policy , const ReducerType& reducer ) - : m_functor( arg_functor ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) , m_policy( arg_policy ) , m_reducer( reducer ) , m_result_ptr( reducer.view().data() ) @@ -329,6 +442,174 @@ public: }; + +// MDRangePolicy impl +template< class FunctorType , class ReducerType, class ... Traits > +class ParallelReduce< FunctorType + , Kokkos::MDRangePolicy< Traits ...> + , ReducerType + , Kokkos::OpenMP + > +{ +private: + + typedef Kokkos::MDRangePolicy< Traits ... > MDRangePolicy ; + typedef typename MDRangePolicy::impl_range_policy Policy ; + + typedef typename MDRangePolicy::work_tag WorkTag ; + typedef typename Policy::WorkRange WorkRange ; + typedef typename Policy::member_type Member ; + + typedef FunctorAnalysis< FunctorPatternInterface::REDUCE , Policy , FunctorType > Analysis ; + + typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; + + typedef typename ReducerTypeFwd::value_type ValueType; + + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTagFwd > ValueJoin ; + + typedef typename Analysis::pointer_type pointer_type ; + typedef typename Analysis::reference_type reference_type ; + + using iterate_type = typename Kokkos::Impl::HostIterateTile< MDRangePolicy + , FunctorType + , WorkTag + , ValueType + >; + + OpenMPExec * m_instance ; + const FunctorType m_functor ; + const MDRangePolicy m_mdr_policy ; + const Policy m_policy ; // construct as RangePolicy( 0, num_tiles ).set_chunk_size(1) in ctor + const ReducerType m_reducer ; + const pointer_type m_result_ptr ; + + inline static + void + exec_range( const MDRangePolicy & mdr_policy + , const FunctorType & functor + , const Member ibeg , const Member iend + , reference_type update ) + { + for ( Member iwork = ibeg ; iwork < iend ; ++iwork ) { + iterate_type( mdr_policy, functor, update )( iwork ); + } + } + +public: + + inline void execute() const + { + enum { is_dynamic = std::is_same< typename Policy::schedule_type::type + , Kokkos::Dynamic >::value }; + + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_reduce"); + + const size_t pool_reduce_bytes = + Analysis::value_size( ReducerConditional::select(m_functor, m_reducer)); + + m_instance->resize_thread_data( pool_reduce_bytes + , 0 // team_reduce_bytes + , 0 // team_shared_bytes + , 0 // thread_local_bytes + ); + + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) + { + HostThreadTeamData & data = *(m_instance->get_thread_data()); + + data.set_work_partition( m_policy.end() - m_policy.begin() + , m_policy.chunk_size() ); + + if ( is_dynamic ) { + // Make sure work partition is set before stealing + if ( data.pool_rendezvous() ) data.pool_rendezvous_release(); + } + + reference_type update = + ValueInit::init( ReducerConditional::select(m_functor , m_reducer) + , data.pool_reduce_local() ); + + std::pair range(0,0); + + do { + + range = is_dynamic ? data.get_work_stealing_chunk() + : data.get_work_partition(); + + ParallelReduce::exec_range ( m_mdr_policy, m_functor + , range.first + m_policy.begin() + , range.second + m_policy.begin() + , update ); + + } while ( is_dynamic && 0 <= range.first ); + } +// END #pragma omp parallel + + // Reduction: + + const pointer_type ptr = pointer_type( m_instance->get_thread_data(0)->pool_reduce_local() ); + + for ( int i = 1 ; i < pool_size ; ++i ) { + ValueJoin::join( ReducerConditional::select(m_functor , m_reducer) + , ptr + , m_instance->get_thread_data(i)->pool_reduce_local() ); + } + + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , ptr ); + + if ( m_result_ptr ) { + const int n = Analysis::value_count( ReducerConditional::select(m_functor , m_reducer) ); + + for ( int j = 0 ; j < n ; ++j ) { m_result_ptr[j] = ptr[j] ; } + } + } + + //---------------------------------------- + + template< class ViewType > + inline + ParallelReduce( const FunctorType & arg_functor + , MDRangePolicy arg_policy + , const ViewType & arg_view + , typename std::enable_if< + Kokkos::is_view< ViewType >::value && + !Kokkos::is_reducer_type::value + ,void*>::type = NULL) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + , m_reducer( InvalidType() ) + , m_result_ptr( arg_view.data() ) + { + /*static_assert( std::is_same< typename ViewType::memory_space + , Kokkos::HostSpace >::value + , "Reduction result on Kokkos::OpenMP must be a Kokkos::View in HostSpace" );*/ + } + + inline + ParallelReduce( const FunctorType & arg_functor + , MDRangePolicy arg_policy + , const ReducerType& reducer ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + , m_reducer( reducer ) + , m_result_ptr( reducer.view().data() ) + { + /*static_assert( std::is_same< typename ViewType::memory_space + , Kokkos::HostSpace >::value + , "Reduction result on Kokkos::OpenMP must be a Kokkos::View in HostSpace" );*/ + } + +}; + } // namespace Impl } // namespace Kokkos @@ -361,8 +642,9 @@ private: typedef typename Analysis::pointer_type pointer_type ; typedef typename Analysis::reference_type reference_type ; - const FunctorType m_functor ; - const Policy m_policy ; + OpenMPExec * m_instance; + const FunctorType m_functor; + const Policy m_policy; template< class TagType > inline static @@ -394,23 +676,23 @@ public: inline void execute() const { - OpenMPExec::verify_is_process("Kokkos::OpenMP parallel_scan"); - OpenMPExec::verify_initialized("Kokkos::OpenMP parallel_scan"); + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_scan"); const int value_count = Analysis::value_count( m_functor ); const size_t pool_reduce_bytes = 2 * Analysis::value_size( m_functor ); - OpenMPExec::resize_thread_data( pool_reduce_bytes + m_instance->resize_thread_data( pool_reduce_bytes , 0 // team_reduce_bytes , 0 // team_shared_bytes , 0 // thread_local_bytes ); -#pragma omp parallel + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) { - HostThreadTeamData & data = *OpenMPExec::get_thread_data(); + HostThreadTeamData & data = *(m_instance->get_thread_data()); - const WorkRange range( m_policy, data.pool_rank(), data.pool_size() ); + const WorkRange range( m_policy, omp_get_thread_num(), omp_get_num_threads() ); reference_type update_sum = ValueInit::init( m_functor , data.pool_reduce_local() ); @@ -422,7 +704,7 @@ public: pointer_type ptr_prev = 0 ; - const int n = data.pool_size(); + const int n = omp_get_num_threads(); for ( int i = 0 ; i < n ; ++i ) { @@ -452,7 +734,6 @@ public: ParallelScan::template exec_range< WorkTag > ( m_functor , range.begin() , range.end() , update_base , true ); } -/* END #pragma omp parallel */ } @@ -461,7 +742,8 @@ public: inline ParallelScan( const FunctorType & arg_functor , const Policy & arg_policy ) - : m_functor( arg_functor ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) , m_policy( arg_policy ) {} @@ -492,9 +774,10 @@ private: typedef typename Policy::schedule_type::type SchedTag ; typedef typename Policy::member_type Member ; - const FunctorType m_functor ; - const Policy m_policy ; - const int m_shmem_size ; + OpenMPExec * m_instance; + const FunctorType m_functor; + const Policy m_policy; + const int m_shmem_size; template< class TagType > inline static @@ -548,22 +831,22 @@ public: { enum { is_dynamic = std::is_same< SchedTag , Kokkos::Dynamic >::value }; - OpenMPExec::verify_is_process("Kokkos::OpenMP parallel_for"); - OpenMPExec::verify_initialized("Kokkos::OpenMP parallel_for"); + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_for"); const size_t pool_reduce_size = 0 ; // Never shrinks const size_t team_reduce_size = TEAM_REDUCE_SIZE * m_policy.team_size(); const size_t team_shared_size = m_shmem_size + m_policy.scratch_size(1); const size_t thread_local_size = 0 ; // Never shrinks - OpenMPExec::resize_thread_data( pool_reduce_size + m_instance->resize_thread_data( pool_reduce_size , team_reduce_size , team_shared_size , thread_local_size ); -#pragma omp parallel + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) { - HostThreadTeamData & data = *OpenMPExec::get_thread_data(); + HostThreadTeamData & data = *(m_instance->get_thread_data()); const int active = data.organize_team( m_policy.team_size() ); @@ -598,14 +881,14 @@ public: data.disband_team(); } -// END #pragma omp parallel } inline ParallelFor( const FunctorType & arg_functor , const Policy & arg_policy ) - : m_functor( arg_functor ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) , m_policy( arg_policy ) , m_shmem_size( arg_policy.scratch_size(0) + arg_policy.scratch_size(1) + @@ -639,18 +922,20 @@ private: , FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTag > ValueInit ; - typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd , WorkTag > ValueJoin ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd , WorkTagFwd > ValueJoin ; typedef typename Analysis::pointer_type pointer_type ; typedef typename Analysis::reference_type reference_type ; - const FunctorType m_functor ; - const Policy m_policy ; - const ReducerType m_reducer ; - const pointer_type m_result_ptr ; - const int m_shmem_size ; + OpenMPExec * m_instance; + const FunctorType m_functor; + const Policy m_policy; + const ReducerType m_reducer; + const pointer_type m_result_ptr; + const int m_shmem_size; template< class TagType > inline static @@ -706,8 +991,7 @@ public: { enum { is_dynamic = std::is_same< SchedTag , Kokkos::Dynamic >::value }; - OpenMPExec::verify_is_process("Kokkos::OpenMP parallel_reduce"); - OpenMPExec::verify_initialized("Kokkos::OpenMP parallel_reduce"); + OpenMPExec::verify_is_master("Kokkos::OpenMP parallel_reduce"); const size_t pool_reduce_size = Analysis::value_size( ReducerConditional::select(m_functor, m_reducer)); @@ -716,14 +1000,15 @@ public: const size_t team_shared_size = m_shmem_size + m_policy.scratch_size(1); const size_t thread_local_size = 0 ; // Never shrinks - OpenMPExec::resize_thread_data( pool_reduce_size + m_instance->resize_thread_data( pool_reduce_size , team_reduce_size , team_shared_size , thread_local_size ); -#pragma omp parallel + const int pool_size = OpenMP::thread_pool_size(); + #pragma omp parallel num_threads(pool_size) { - HostThreadTeamData & data = *OpenMPExec::get_thread_data(); + HostThreadTeamData & data = *(m_instance->get_thread_data()); const int active = data.organize_team( m_policy.team_size() ); @@ -763,20 +1048,29 @@ public: } data.disband_team(); + + // This thread has updated 'pool_reduce_local()' with its + // contributions to the reduction. The parallel region is + // about to terminate and the master thread will load and + // reduce each 'pool_reduce_local()' contribution. + // Must 'memory_fence()' to guarantee that storing the update to + // 'pool_reduce_local()' will complete before this thread + // exits the parallel region. + + memory_fence(); } -// END #pragma omp parallel // Reduction: - const pointer_type ptr = pointer_type( OpenMPExec::get_thread_data(0)->pool_reduce_local() ); + const pointer_type ptr = pointer_type( m_instance->get_thread_data(0)->pool_reduce_local() ); - for ( int i = 1 ; i < OpenMPExec::pool_size() ; ++i ) { + for ( int i = 1 ; i < pool_size ; ++i ) { ValueJoin::join( ReducerConditional::select(m_functor , m_reducer) , ptr - , OpenMPExec::get_thread_data(i)->pool_reduce_local() ); + , m_instance->get_thread_data(i)->pool_reduce_local() ); } - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , ptr ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , ptr ); if ( m_result_ptr ) { const int n = Analysis::value_count( ReducerConditional::select(m_functor , m_reducer) ); @@ -796,7 +1090,8 @@ public: Kokkos::is_view< ViewType >::value && !Kokkos::is_reducer_type::value ,void*>::type = NULL) - : m_functor( arg_functor ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) , m_policy( arg_policy ) , m_reducer( InvalidType() ) , m_result_ptr( arg_result.ptr_on_device() ) @@ -810,7 +1105,8 @@ public: ParallelReduce( const FunctorType & arg_functor , Policy arg_policy , const ReducerType& reducer ) - : m_functor( arg_functor ) + : m_instance( t_openmp_instance ) + , m_functor( arg_functor ) , m_policy( arg_policy ) , m_reducer( reducer ) , m_result_ptr( reducer.view().data() ) diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.cpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.cpp index d4ade211f8..77363876b0 100644 --- a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.cpp +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.cpp @@ -105,7 +105,7 @@ void TaskQueueSpecialization< Kokkos::OpenMP >::execute { using execution_space = Kokkos::OpenMP ; using queue_type = TaskQueue< execution_space > ; - using task_root_type = TaskBase< execution_space , void , void > ; + using task_root_type = TaskBase< void , void , void > ; using Member = Impl::HostThreadTeamMember< execution_space > ; static task_root_type * const end = @@ -115,23 +115,19 @@ void TaskQueueSpecialization< Kokkos::OpenMP >::execute HostThreadTeamData & team_data_single = HostThreadTeamDataSingleton::singleton(); - const int team_size = Impl::OpenMPExec::pool_size(2); // Threads per core - // const int team_size = Impl::OpenMPExec::pool_size(1); // Threads per NUMA + Impl::OpenMPExec * instance = t_openmp_instance; + const int pool_size = OpenMP::thread_pool_size(); -#if 0 -fprintf(stdout,"TaskQueue execute %d\n", team_size ); -fflush(stdout); -#endif + const int team_size = 1; // Threads per core + instance->resize_thread_data( 0 /* global reduce buffer */ + , 512 * team_size /* team reduce buffer */ + , 0 /* team shared buffer */ + , 0 /* thread local buffer */ + ); - OpenMPExec::resize_thread_data( 0 /* global reduce buffer */ - , 512 * team_size /* team reduce buffer */ - , 0 /* team shared buffer */ - , 0 /* thread local buffer */ - ); - -#pragma omp parallel + #pragma omp parallel num_threads(pool_size) { - Impl::HostThreadTeamData & self = *Impl::OpenMPExec::get_thread_data(); + Impl::HostThreadTeamData & self = *(instance->get_thread_data()); // Organizing threads into a team performs a barrier across the // entire pool to insure proper initialization of the team @@ -142,18 +138,6 @@ fflush(stdout); Member single_exec( team_data_single ); Member team_exec( self ); -#if 0 -fprintf(stdout,"TaskQueue pool(%d of %d) team(%d of %d) league(%d of %d) running\n" - , self.pool_rank() - , self.pool_size() - , team_exec.team_rank() - , team_exec.team_size() - , team_exec.league_rank() - , team_exec.league_size() - ); -fflush(stdout); -#endif - // Loop until all queues are empty and no tasks in flight task_root_type * task = 0 ; @@ -197,15 +181,6 @@ fflush(stdout); // if a single thread task then execute now -#if 0 -fprintf(stdout,"TaskQueue pool(%d of %d) executing single task 0x%lx\n" - , self.pool_rank() - , self.pool_size() - , int64_t(task) - ); -fflush(stdout); -#endif - (*task->m_apply)( task , & single_exec ); leader_loop = true ; @@ -220,57 +195,14 @@ fflush(stdout); if ( 0 != task ) { // Thread Team Task -#if 0 -fprintf(stdout,"TaskQueue pool(%d of %d) team((%d of %d) league(%d of %d) executing team task 0x%lx\n" - , self.pool_rank() - , self.pool_size() - , team_exec.team_rank() - , team_exec.team_size() - , team_exec.league_rank() - , team_exec.league_size() - , int64_t(task) - ); -fflush(stdout); -#endif - (*task->m_apply)( task , & team_exec ); // The m_apply function performs a barrier } } while( 0 != task ); - -#if 0 -fprintf(stdout,"TaskQueue pool(%d of %d) team(%d of %d) league(%d of %d) ending\n" - , self.pool_rank() - , self.pool_size() - , team_exec.team_rank() - , team_exec.team_size() - , team_exec.league_rank() - , team_exec.league_size() - ); -fflush(stdout); -#endif - } - self.disband_team(); - -#if 0 -fprintf(stdout,"TaskQueue pool(%d of %d) disbanded\n" - , self.pool_rank() - , self.pool_size() - ); -fflush(stdout); -#endif - } -// END #pragma omp parallel - -#if 0 -fprintf(stdout,"TaskQueue execute %d end\n", team_size ); -fflush(stdout); -#endif - } void TaskQueueSpecialization< Kokkos::OpenMP >:: @@ -279,10 +211,10 @@ void TaskQueueSpecialization< Kokkos::OpenMP >:: { using execution_space = Kokkos::OpenMP ; using queue_type = TaskQueue< execution_space > ; - using task_root_type = TaskBase< execution_space , void , void > ; + using task_root_type = TaskBase< void , void , void > ; using Member = Impl::HostThreadTeamMember< execution_space > ; - if ( 1 == omp_get_num_threads() ) { + if ( 1 == OpenMP::thread_pool_size() ) { task_root_type * const end = (task_root_type *) task_root_type::EndTag ; diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.hpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.hpp index 82fbef255b..dfa1635e08 100644 --- a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.hpp +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Task.hpp @@ -45,7 +45,7 @@ #define KOKKOS_IMPL_OPENMP_TASK_HPP #include -#if defined( KOKKOS_ENABLE_TASKDAG ) +#if defined( KOKKOS_ENABLE_OPENMP ) && defined( KOKKOS_ENABLE_TASKDAG ) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -60,7 +60,7 @@ public: using execution_space = Kokkos::OpenMP ; using queue_type = Kokkos::Impl::TaskQueue< execution_space > ; - using task_base_type = Kokkos::Impl::TaskBase< execution_space , void , void > ; + using task_base_type = Kokkos::Impl::TaskBase< void , void , void > ; using member_type = Kokkos::Impl::HostThreadTeamMember< execution_space > ; // Must specify memory space diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Team.hpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Team.hpp new file mode 100644 index 0000000000..743e6b6e62 --- /dev/null +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Team.hpp @@ -0,0 +1,245 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_OPENMP_TEAM_HPP +#define KOKKOS_OPENMP_TEAM_HPP + +#include +#if defined( KOKKOS_ENABLE_OPENMP ) + +#include + +namespace Kokkos { namespace Impl { + +template< class ... Properties > +class TeamPolicyInternal< Kokkos::OpenMP, Properties ... >: public PolicyTraits +{ +public: + + //! Tag this class as a kokkos execution policy + typedef TeamPolicyInternal execution_policy ; + + typedef PolicyTraits traits; + + TeamPolicyInternal& operator = (const TeamPolicyInternal& p) { + m_league_size = p.m_league_size; + m_team_size = p.m_team_size; + m_team_alloc = p.m_team_alloc; + m_team_iter = p.m_team_iter; + m_team_scratch_size[0] = p.m_team_scratch_size[0]; + m_thread_scratch_size[0] = p.m_thread_scratch_size[0]; + m_team_scratch_size[1] = p.m_team_scratch_size[1]; + m_thread_scratch_size[1] = p.m_thread_scratch_size[1]; + m_chunk_size = p.m_chunk_size; + return *this; + } + + //---------------------------------------- + + template< class FunctorType > + inline static + int team_size_max( const FunctorType & ) { + int pool_size = traits::execution_space::thread_pool_size(1); + int max_host_team_size = Impl::HostThreadTeamData::max_team_members; + return pool_size + inline static + int team_size_recommended( const FunctorType & ) + { return traits::execution_space::thread_pool_size(2); } + + template< class FunctorType > + inline static + int team_size_recommended( const FunctorType &, const int& ) + { return traits::execution_space::thread_pool_size(2); } + + //---------------------------------------- + +private: + + int m_league_size ; + int m_team_size ; + int m_team_alloc ; + int m_team_iter ; + + size_t m_team_scratch_size[2]; + size_t m_thread_scratch_size[2]; + + int m_chunk_size; + + inline void init( const int league_size_request + , const int team_size_request ) + { + const int pool_size = traits::execution_space::thread_pool_size(0); + const int max_host_team_size = Impl::HostThreadTeamData::max_team_members; + const int team_max = pool_size 0) { + if(!Impl::is_integral_power_of_two( m_chunk_size )) + Kokkos::abort("TeamPolicy blocking granularity must be power of two" ); + } + + int new_chunk_size = 1; + while(new_chunk_size*100*concurrency < m_league_size) + new_chunk_size *= 2; + if(new_chunk_size < 128) { + new_chunk_size = 1; + while( (new_chunk_size*40*concurrency < m_league_size ) && (new_chunk_size<128) ) + new_chunk_size*=2; + } + m_chunk_size = new_chunk_size; + } + +public: + typedef Impl::HostThreadTeamMember< Kokkos::OpenMP > member_type ; +}; + +}} // namespace Kokkos::Impl + +#endif +#endif /* KOKKOS_OPENMP_TEAM_HPP */ + + diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_WorkGraphPolicy.hpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_WorkGraphPolicy.hpp new file mode 100644 index 0000000000..540b91a52a --- /dev/null +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_WorkGraphPolicy.hpp @@ -0,0 +1,107 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_OPENMP_WORKGRAPHPOLICY_HPP +#define KOKKOS_OPENMP_WORKGRAPHPOLICY_HPP + +namespace Kokkos { +namespace Impl { + +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType , + Kokkos::WorkGraphPolicy< Traits ... > , + Kokkos::OpenMP + > +{ +private: + + typedef Kokkos::WorkGraphPolicy< Traits ... > Policy ; + + Policy m_policy ; + FunctorType m_functor ; + + template< class TagType > + typename std::enable_if< std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { m_functor( w ); } + + template< class TagType > + typename std::enable_if< ! std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { const TagType t{} ; m_functor( t , w ); } + +public: + + inline + void execute() + { + const int pool_size = OpenMP::thread_pool_size(); + + #pragma omp parallel num_threads(pool_size) + { + // Spin until COMPLETED_TOKEN. + // END_TOKEN indicates no work is currently available. + + for ( std::int32_t w = Policy::END_TOKEN ; + Policy::COMPLETED_TOKEN != ( w = m_policy.pop_work() ) ; ) { + if ( Policy::END_TOKEN != w ) { + exec_one< typename Policy::work_tag >( w ); + m_policy.completed_work(w); + } + } + } + } + + inline + ParallelFor( const FunctorType & arg_functor + , const Policy & arg_policy ) + : m_policy( arg_policy ) + , m_functor( arg_functor ) + {} +}; + +} // namespace Impl +} // namespace Kokkos + +#endif /* #define KOKKOS_OPENMP_WORKGRAPHPOLICY_HPP */ + diff --git a/lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp b/lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp index bec7844ed6..258a9d2ff7 100644 --- a/lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp +++ b/lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ @@ -45,7 +45,7 @@ #define KOKKOS_OPENMPTARGETEXEC_HPP #include -#include +#include #include #include @@ -59,10 +59,10 @@ namespace Impl { class OpenMPTargetExec { -public: +public: enum { MAX_ACTIVE_THREADS = 256*8*56*4 }; enum { MAX_ACTIVE_TEAMS = MAX_ACTIVE_THREADS/32 }; - + private: static void* scratch_ptr; @@ -70,7 +70,7 @@ public: static void verify_is_process( const char * const ); static void verify_initialized( const char * const ); - static void* get_scratch_ptr(); + static void* get_scratch_ptr(); static void clear_scratch(); static void resize_scratch( int64_t reduce_bytes , int64_t team_reduce_bytes, int64_t team_shared_bytes, int64_t thread_local_bytes ); @@ -159,7 +159,7 @@ public: KOKKOS_INLINE_FUNCTION void team_barrier() const { - #pragma omp barrier + #pragma omp barrier } template @@ -191,13 +191,13 @@ public: typedef ValueType value_type; const JoinLambdaAdapter op(op_in); - + // Make sure there is enough scratch space: typedef typename if_c< sizeof(value_type) < TEAM_REDUCE_SIZE , value_type , void >::type type ; const int n_values = TEAM_REDUCE_SIZE/sizeof(value_type); - type * team_scratch = (type*) ((char*)m_glb_scratch + TEAM_REDUCE_SIZE*omp_get_team_num()); + type * team_scratch = (type*) ((char*)m_glb_scratch + TEAM_REDUCE_SIZE*omp_get_team_num()); for(int i = m_team_rank; i < n_values; i+= m_team_size) { team_scratch[i] = value_type(); } @@ -209,7 +209,7 @@ public: team_scratch[m_team_rank%n_values]+=value; #pragma omp barrier } - + for(int d = 1; d::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; // Static Assert WorkTag void if ReducerType not InvalidType - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; - typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd, WorkTag > ValueJoin ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd , WorkTagFwd > ValueJoin ; enum {HasJoin = ReduceFunctorHasJoin::value }; enum {UseReducer = is_reducer_type::value }; @@ -620,10 +621,11 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTag > ValueInit ; - typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd , WorkTag > ValueJoin ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd , WorkTagFwd > ValueJoin ; typedef typename ValueTraits::pointer_type pointer_type ; typedef typename ValueTraits::reference_type reference_type ; diff --git a/lib/kokkos/core/src/Qthreads/Kokkos_QthreadsExec.hpp b/lib/kokkos/core/src/Qthreads/Kokkos_QthreadsExec.hpp index c3b773e073..abf390b176 100644 --- a/lib/kokkos/core/src/Qthreads/Kokkos_QthreadsExec.hpp +++ b/lib/kokkos/core/src/Qthreads/Kokkos_QthreadsExec.hpp @@ -47,7 +47,7 @@ #include #if defined( KOKKOS_ENABLE_QTHREADS ) -#include +#include //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/Qthreads/Kokkos_Qthreads_Parallel.hpp b/lib/kokkos/core/src/Qthreads/Kokkos_Qthreads_Parallel.hpp index b45c7114a3..6c94319004 100644 --- a/lib/kokkos/core/src/Qthreads/Kokkos_Qthreads_Parallel.hpp +++ b/lib/kokkos/core/src/Qthreads/Kokkos_Qthreads_Parallel.hpp @@ -150,11 +150,12 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType > ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void >::type WorkTagFwd; // Static Assert WorkTag void if ReducerType not InvalidType - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; typedef typename ValueTraits::pointer_type pointer_type ; typedef typename ValueTraits::reference_type reference_type ; @@ -213,7 +214,7 @@ public: const pointer_type data = (pointer_type) QthreadsExec::exec_all_reduce_result(); - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer) , data ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer) , data ); if ( m_result_ptr ) { const unsigned n = ValueTraits::value_count( ReducerConditional::select(m_functor , m_reducer) ); @@ -331,9 +332,10 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void >::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTag > ValueInit ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; typedef typename ValueTraits::pointer_type pointer_type ; typedef typename ValueTraits::reference_type reference_type ; @@ -394,7 +396,7 @@ public: const pointer_type data = (pointer_type) QthreadsExec::exec_all_reduce_result(); - Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTag >::final( ReducerConditional::select(m_functor , m_reducer), data ); + Kokkos::Impl::FunctorFinal< ReducerTypeFwd , WorkTagFwd >::final( ReducerConditional::select(m_functor , m_reducer), data ); if ( m_result_ptr ) { const unsigned n = ValueTraits::value_count( ReducerConditional::select(m_functor , m_reducer) ); diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Atomic.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Atomic.hpp new file mode 100644 index 0000000000..3c7586e264 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Atomic.hpp @@ -0,0 +1,439 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +//#include + +#ifdef KOKKOS_ENABLE_ROCM_ATOMICS +namespace Kokkos { + //ROCm can do: + //Types int/unsigned int + //variants: atomic_exchange/compare_exchange/fetch_add/fetch_sub/fetch_max/fetch_min/fetch_and/fetch_or/fetch_xor/fetch_inc/fetch_dec + + + KOKKOS_INLINE_FUNCTION + int atomic_exchange(int* dest, const int& val) { + return hc::atomic_exchange_int(dest, val); + } + + KOKKOS_INLINE_FUNCTION + unsigned int atomic_exchange(unsigned int* dest, const unsigned int& val) { + return hc::atomic_exchange_unsigned(dest, val); + } + + KOKKOS_INLINE_FUNCTION + int64_t atomic_exchange(int64_t* dest, const int64_t& val) { + return (int64_t)hc::atomic_exchange_uint64((uint64_t*)dest, (const uint64_t&)val); + } + + KOKKOS_INLINE_FUNCTION + uint64_t atomic_exchange(uint64_t* dest, const uint64_t& val) { + return hc::atomic_exchange_uint64(dest, val); + } + + KOKKOS_INLINE_FUNCTION + long long atomic_exchange(long long* dest, const long long& val) { + return (long long)hc::atomic_exchange_uint64((uint64_t*)dest, (const uint64_t&)val); + } + + KOKKOS_INLINE_FUNCTION + unsigned long long atomic_exchange(unsigned long long* dest, const unsigned long long& val) { + return (unsigned long long)hc::atomic_exchange_uint64((uint64_t*)dest, (const uint64_t&)val); + } + + KOKKOS_INLINE_FUNCTION + float atomic_exchange(float* dest, const float& val) { + union U { + int i ; + float f ; + KOKKOS_INLINE_FUNCTION U() {}; + } idest,ival; + idest.f = *dest; + ival.f = val; + idest.i = hc::atomic_exchange_int((int*)dest, ival.i); + return idest.f; + } + + KOKKOS_INLINE_FUNCTION + double atomic_exchange(double* dest, const double& val) { + union U { + uint64_t i ; + double d ; + KOKKOS_INLINE_FUNCTION U() {}; + } idest,ival; + idest.d = *dest; + ival.d = val; + idest.i = hc::atomic_exchange_uint64((uint64_t*)dest, ival.i); + return idest.d; + } + + KOKKOS_INLINE_FUNCTION + int atomic_compare_exchange(int* dest, int compare, const int& val); + + KOKKOS_INLINE_FUNCTION + int64_t atomic_compare_exchange(int64_t* dest, int64_t compare, const int64_t& val); + + template + KOKKOS_INLINE_FUNCTION + T atomic_exchange(T* dest, typename std::enable_if::type val) { + union U { + int i ; + T t ; + KOKKOS_INLINE_FUNCTION U() {}; + } assume , oldval , newval ; + + oldval.t = *dest ; + assume.i = oldval.i ; + newval.t = val ; + atomic_compare_exchange( (int*)(dest) , assume.i, newval.i ); + + return oldval.t ; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_exchange(T* dest, typename std::enable_if::type val) { + union U { + uint64_t i ; + T t ; + KOKKOS_INLINE_FUNCTION U() {}; + } assume , oldval , newval ; + + oldval.t = *dest ; + + assume.i = oldval.i ; + newval.t = val ; + atomic_compare_exchange( (int64_t*)(dest) , assume.i, newval.i ); + + return oldval.t ; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_exchange(T* dest, typename std::enable_if::type val) { + return val; + } + + KOKKOS_INLINE_FUNCTION + int atomic_compare_exchange(int* dest, int compare, const int& val) { + return hc::atomic_compare_exchange_int(dest, compare, val); + } + + KOKKOS_INLINE_FUNCTION + unsigned int atomic_compare_exchange(unsigned int* dest, unsigned int compare, const unsigned int& val) { + return hc::atomic_compare_exchange_unsigned(dest, compare, val); + } + + KOKKOS_INLINE_FUNCTION + int64_t atomic_compare_exchange(int64_t* dest, int64_t compare, const int64_t& val) { + return (int64_t) hc::atomic_compare_exchange_uint64((uint64_t*)dest, (uint64_t)compare, (const uint64_t&)val); + } + + KOKKOS_INLINE_FUNCTION + uint64_t atomic_compare_exchange(uint64_t* dest, uint64_t compare, const uint64_t& val) { + return hc::atomic_compare_exchange_uint64(dest, compare, val); + } + + KOKKOS_INLINE_FUNCTION + long long atomic_compare_exchange(long long* dest, long long compare, const long long& val) { + return (long long)hc::atomic_compare_exchange_uint64((uint64_t*)(dest), (uint64_t)(compare), (const uint64_t&)(val)); + } + + KOKKOS_INLINE_FUNCTION + float atomic_compare_exchange(float* dest, float compare, const float& val) { + union U { + int i ; + float f ; + KOKKOS_INLINE_FUNCTION U() {}; + } idest,icompare,ival; + idest.f = *dest; + icompare.f = compare; + ival.f = val; + idest.i = hc::atomic_compare_exchange_int(reinterpret_cast(dest), icompare.i, ival.i); + return idest.f; + } + + KOKKOS_INLINE_FUNCTION + double atomic_compare_exchange(double* dest, double compare, const double& val) { + union U { + uint64_t i ; + double d ; + KOKKOS_INLINE_FUNCTION U() {}; + } idest,icompare,ival; + idest.d = *dest; + icompare.d = compare; + ival.d = val; + idest.i = hc::atomic_compare_exchange_uint64(reinterpret_cast(dest), icompare.i, ival.i); + return idest.d; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_compare_exchange(volatile T* dest, T compare, typename std::enable_if::type val) { + union U { + int i ; + T f ; + KOKKOS_INLINE_FUNCTION U() {}; + } idest,icompare,ival; + idest.f = *dest; + icompare.f = compare; + ival.f = val; + idest.i = hc::atomic_compare_exchange_int((int*)(dest), icompare.i, ival.i); + return idest.f; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_compare_exchange(volatile T* dest, T compare, typename std::enable_if::type val) { + union U { + uint64_t i ; + T f ; + KOKKOS_INLINE_FUNCTION U() {}; + } idest,icompare,ival; + idest.f = *dest; + icompare.f = compare; + ival.f = val; + idest.i = hc::atomic_compare_exchange_uint64((uint64_t*)(dest), icompare.i, ival.i); + return idest.f; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_compare_exchange(volatile T* dest, T compare, typename std::enable_if<(sizeof(T) != sizeof(int32_t)) && (sizeof(T) != sizeof(int64_t)), const T&>::type val) { + return val; + } + + KOKKOS_INLINE_FUNCTION + int atomic_fetch_add (volatile int * dest, const int& val) { + return hc::atomic_fetch_add((int *)dest, val); + } + + KOKKOS_INLINE_FUNCTION + unsigned int atomic_fetch_add(unsigned int* dest, const unsigned int& val) { + return hc::atomic_fetch_add(dest, val); + } + + KOKKOS_INLINE_FUNCTION + unsigned long atomic_fetch_add(volatile unsigned long* dest, const unsigned long& val) { + return (unsigned long)hc::atomic_fetch_add((uint64_t *)dest, (const uint64_t)val); + } + + KOKKOS_INLINE_FUNCTION + int64_t atomic_fetch_add(volatile int64_t* dest, const int64_t& val) { + return (int64_t)hc::atomic_fetch_add((uint64_t *)dest, (const uint64_t&)val); + } + + KOKKOS_INLINE_FUNCTION + char atomic_fetch_add(volatile char * dest, const char& val) { + unsigned int oldval,newval,assume; + oldval = *(int *)dest ; + + do { + assume = oldval ; + newval = assume&0x7fffff00 + ((assume&0xff)+val)&0xff ; + oldval = hc::atomic_compare_exchange_unsigned((unsigned int*)dest, assume,newval); + } while ( assume != oldval ); + + return oldval ; + } + + + KOKKOS_INLINE_FUNCTION + short atomic_fetch_add(volatile short * dest, const short& val) { + unsigned int oldval,newval,assume; + oldval = *(int *)dest ; + + do { + assume = oldval ; + newval = assume&0x7fff0000 + ((assume&0xffff)+val)&0xffff ; + oldval = hc::atomic_compare_exchange_unsigned((unsigned int*)dest, assume,newval); + } while ( assume != oldval ); + + return oldval ; + } + + KOKKOS_INLINE_FUNCTION + long long atomic_fetch_add(volatile long long * dest, const long long& val) { + return (long long)hc::atomic_fetch_add((uint64_t*)dest, (const uint64_t&)val); + } + + + + KOKKOS_INLINE_FUNCTION + int atomic_fetch_sub (volatile int * dest, const int& val) { + return hc::atomic_fetch_sub((int *)dest, val); + } + + KOKKOS_INLINE_FUNCTION + unsigned int atomic_fetch_sub(volatile unsigned int* dest, const unsigned int& val) { + return hc::atomic_fetch_sub((unsigned int *)dest, val); + } + + KOKKOS_INLINE_FUNCTION + int64_t atomic_fetch_sub(int64_t* dest, const int64_t& val) { + return (int64_t)hc::atomic_fetch_add((uint64_t *)dest, -(const uint64_t&)val); +// return (int64_t)hc::atomic_fetch_sub_uint64((uint64_t*)dest, (const uint64_t&)val); + } + + KOKKOS_INLINE_FUNCTION + char atomic_fetch_sub(volatile char * dest, const char& val) { + unsigned int oldval,newval,assume; + oldval = *(int *)dest ; + + do { + assume = oldval ; + newval = assume&0x7fffff00 + ((assume&0xff)-val)&0xff ; + oldval = hc::atomic_compare_exchange_unsigned((unsigned int*)dest, assume,newval); + } while ( assume != oldval ); + + return oldval ; + } + + KOKKOS_INLINE_FUNCTION + short atomic_fetch_sub(volatile short * dest, const short& val) { + unsigned int oldval,newval,assume; + oldval = *(int *)dest ; + + do { + assume = oldval ; + newval = assume&0x7fff0000 + ((assume&0xffff)-val)&0xffff; + oldval = hc::atomic_compare_exchange_unsigned((unsigned int*)dest, assume,newval); + } while ( assume != oldval ); + + return oldval ; + } + + KOKKOS_INLINE_FUNCTION + long long atomic_fetch_sub(volatile long long * dest, const long long& val) { + return (long long)hc::atomic_fetch_add((uint64_t*)dest, -(const uint64_t&)val); + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_fetch_add(volatile T* dest, typename std::enable_if::type val) { + union U { + unsigned int i ; + T t ; + KOKKOS_INLINE_FUNCTION U() {}; + } assume , oldval , newval ; + + oldval.t = *dest ; + + do { + assume.i = oldval.i ; + newval.t = assume.t + val ; + oldval.i = atomic_compare_exchange( (unsigned int*)(dest) , assume.i , newval.i ); + } while ( assume.i != oldval.i ); + + return oldval.t ; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_fetch_add(volatile T* dest, typename std::enable_if::type val) { + union U { + uint64_t i ; + T t ; + KOKKOS_INLINE_FUNCTION U() {}; + } assume , oldval , newval ; + + oldval.t = *dest ; + + do { + assume.i = oldval.i ; + newval.t = assume.t + val ; + oldval.i = atomic_compare_exchange( (uint64_t*)dest , assume.i , newval.i ); + } while ( assume.i != oldval.i ); + + return oldval.t ; + } + + + //WORKAROUND + template + KOKKOS_INLINE_FUNCTION + T atomic_fetch_add(volatile T* dest, typename std::enable_if::type val) { + return val ; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_fetch_sub(volatile T* dest, typename std::enable_if::type & val) { + union U { + int i ; + T t ; + KOKKOS_INLINE_FUNCTION U() {}; + } assume , oldval , newval ; + + oldval.t = *dest ; + + do { + assume.i = oldval.i ; + newval.t = assume.t - val ; + oldval.i = Kokkos::atomic_compare_exchange( (int*)dest , assume.i , newval.i ); + } while ( assume.i != oldval.i ); + + return oldval.t ; + } + + template + KOKKOS_INLINE_FUNCTION + T atomic_fetch_sub(volatile T* dest, typename std::enable_if::type val) { + union U { + int64_t i ; + T t ; + KOKKOS_INLINE_FUNCTION U() {}; + } assume , oldval , newval ; + + oldval.t = *dest ; + + do { + assume.i = oldval.i ; + newval.t = assume.t - val ; + oldval.i = atomic_compare_exchange( (int64_t*)dest , assume.i , newval.i ); + } while ( assume.i != oldval.i ); + + return oldval.t ; + } +} +#endif diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Config.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Config.hpp new file mode 100644 index 0000000000..83b5792a64 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Config.hpp @@ -0,0 +1,51 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef GUARD_CORE_KOKKOS_ROCM_CONFIG_HPP +#define GUARD_CORE_KOKKOS_ROCM_CONFIG_HPP + +#ifndef KOKKOS_ROCM_HAS_WORKAROUNDS +#define KOKKOS_ROCM_HAS_WORKAROUNDS 1 +#endif + +#endif diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.cpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.cpp new file mode 100644 index 0000000000..e919d35903 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.cpp @@ -0,0 +1,133 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ +#ifndef KOKKOS_ROCMEXEC_HPP +#define KOKKOS_ROCMEXEC_HPP + +#include +#include +#include +//#include +#include + +#define ROCM_SPACE_ATOMIC_MASK 0x1FFFF +#define ROCM_SPACE_ATOMIC_XOR_MASK 0x15A39 +#define ROCM_CONCURRENCY 20480 +//#define ROCM_CONCURRENCY 81920 # for fiji + +namespace Kokkos { + static int rocm_space_atomic_locks[ROCM_SPACE_ATOMIC_MASK+1]; + static int rocm_space_scratch_locks[ROCM_CONCURRENCY]; + static int rocm_space_threadid_locks[ROCM_CONCURRENCY]; +namespace Impl { +// TODO: mimic cuda implemtation, add dgpu capability + + void init_rocm_atomic_lock_array() { + static int is_initialized = 0; + if(!is_initialized) + { + for(int i = 0; i < ROCM_SPACE_ATOMIC_MASK+1; i++) + rocm_space_atomic_locks[i] = 0; + is_initialized = 1; + } + } + + void init_rocm_scratch_lock_array() { + static int is_initialized = 0; + if(!is_initialized) + { + for(int i = 0; i < ROCM_CONCURRENCY; i++) + rocm_space_scratch_locks[i] = 0; + is_initialized = 1; + } + } + + void init_rocm_threadid_lock_array() { + static int is_initialized = 0; + if(!is_initialized) + { + for(int i = 0; i < ROCM_CONCURRENCY; i++) + rocm_space_threadid_locks[i] = 0; + is_initialized = 1; + } + } + + void init_lock_arrays_rocm_space() { + init_rocm_atomic_lock_array(); +// init_rocm_scratch_lock_array(); +// init_rocm_threadid_lock_array(); + } +} + +} // namespace Kokkos +#if 0 +namespace Kokkos { +namespace Impl { +KOKKOS_INLINE_FUNCTION +bool lock_address_rocm_space(void* ptr) { +#if 0 +return(Kokkos::Impl::lock_address_host_space(ptr)); +#else + size_t offset = size_t(ptr); + offset = offset >> 2; + offset = offset & ROCM_SPACE_ATOMIC_MASK; + return (0 == hc::atomic_compare_exchange(&rocm_space_atomic_locks[offset],0,1)); +#endif +} + +KOKKOS_INLINE_FUNCTION +void unlock_address_rocm_space(void* ptr) { +#if 0 +Kokkos::Impl::unlock_address_host_space(ptr) ; +#else + size_t offset = size_t(ptr); + offset = offset >> 2; + offset = offset & ROCM_SPACE_ATOMIC_MASK; + hc::atomic_exchange( &rocm_space_atomic_locks[ offset ], 0); +#endif +} + +} +} // namespace Kokkos +#endif + +#endif /* #ifndef KOKKOS_ROCMEXEC_HPP */ diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.hpp new file mode 100644 index 0000000000..48a27eb11d --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.hpp @@ -0,0 +1,137 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ +#ifndef KOKKOS_ROCMEXEC_HPP +#define KOKKOS_ROCMEXEC_HPP + +#include +#include + +#if defined(__HCC_ACCELERATOR__) +#define printf(...) +#endif + +namespace Kokkos { +namespace Impl { +struct ROCmTraits { +// TODO: determine if needed + enum { WavefrontSize = 64 /* 64 */ }; + enum { WorkgroupSize = 64 /* 64 */ }; + enum { WavefrontIndexMask = 0x001f /* Mask for warpindex */ }; + enum { WavefrontIndexShift = 5 /* WarpSize == 1 << WarpShift */ }; + + enum { SharedMemoryBanks = 32 /* Compute device 2.0 */ }; + enum { SharedMemoryCapacity = 0x0C000 /* 48k shared / 16k L1 Cache */ }; + enum { SharedMemoryUsage = 0x04000 /* 16k shared / 48k L1 Cache */ }; + + enum { UpperBoundExtentCount = 65535 /* Hard upper bound */ }; +#if 0 + KOKKOS_INLINE_FUNCTION static + ROCmSpace::size_type wavefront_count( ROCmSpace::size_type i ) + { return ( i + WavefrontIndexMask ) >> WavefrontIndexShift ; } + + KOKKOS_INLINE_FUNCTION static + ROCmSpace::size_type wavefront_align( ROCmSpace::size_type i ) + { + enum { Mask = ~ROCmSpace::size_type( WavefrontIndexMask ) }; + return ( i + WavefrontIndexMask ) & Mask ; + } +#endif +}; +size_t rocm_internal_cu_count(); +size_t rocm_internal_maximum_workgroup_count(); + +size_t * rocm_internal_scratch_flags( const size_t size ); +size_t * rocm_internal_scratch_space( const size_t size ); + +} +} // namespace Kokkos +#define ROCM_SPACE_ATOMIC_MASK 0x1FFFF +#define ROCM_SPACE_ATOMIC_XOR_MASK 0x15A39 +//int rocm_space_atomic_locks[ROCM_SPACE_ATOMIC_MASK+1]; +extern int + *rocm_space_atomic_locks; + +namespace Kokkos { +namespace Impl { + void init_lock_arrays_rocm_space(); + + void* rocm_resize_scratch_space(size_t bytes, bool force_shrink = false); + +// TODO: determine if needed +KOKKOS_INLINE_FUNCTION +bool lock_address_rocm_space(void* ptr) { +#if 0 +return(Kokkos::Impl::lock_address_host_space(ptr)); +#else + size_t offset = size_t(ptr); + offset = offset >> 2; + offset = offset & ROCM_SPACE_ATOMIC_MASK; + return (0 == hc::atomic_compare_exchange(&rocm_space_atomic_locks[offset],0,1)); +#endif +} +KOKKOS_INLINE_FUNCTION +void unlock_address_rocm_space(void* ptr) { +#if 0 +Kokkos::Impl::unlock_address_host_space(ptr) ; +#else + size_t offset = size_t(ptr); + offset = offset >> 2; + offset = offset & ROCM_SPACE_ATOMIC_MASK; + hc::atomic_exchange( &rocm_space_atomic_locks[ offset ], 0); +#endif +} + +} +} // namespace Kokkos + +namespace Kokkos { +namespace Impl { +//extern +//KOKKOS_INLINE_FUNCTION +//void init_lock_arrays_rocm_space(); + + +} +} // namespace Kokkos + +#endif /* #ifndef KOKKOS_ROCMEXEC_HPP */ diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Impl.cpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Impl.cpp new file mode 100644 index 0000000000..ffb129cb86 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Impl.cpp @@ -0,0 +1,754 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +/*--------------------------------------------------------------------------*/ +/* Kokkos interfaces */ + +#include + +/* only compile this file if ROCM is enabled for Kokkos */ +#ifdef KOKKOS_ENABLE_ROCM + +//#include +#include +#include +#include + +/*--------------------------------------------------------------------------*/ +/* Standard 'C' libraries */ +#include + +/* Standard 'C++' libraries */ +#include +#include +#include +#include + + + +//KOKKOS_INLINE_FUNCTION +// Kokkos::Impl::ROCmLockArraysStruct kokkos_impl_rocm_lock_arrays ; + + +/*--------------------------------------------------------------------------*/ +namespace Kokkos { +namespace Impl { + +#if 0 +namespace { +__global__ +void query_rocm_kernel_arch( int * d_arch ) +{ +#if defined( __HCC_ACCELERATOR__ ) + *d_arch = OCM_ARCH__ ; +#else + *d_arch = 0 ; +#endif +} + +/** Query what compute capability is actually launched to the device: */ +int rocm_kernel_arch() +{ + int * d_arch = 0 ; + rocmMalloc( (void **) & d_arch , sizeof(int) ); + query_rocm_kernel_arch<<<1,1>>>( d_arch ); + int arch = 0 ; + rocmMemcpy( & arch , d_arch , sizeof(int) , rocmMemcpyDefault ); + rocmFree( d_arch ); + return arch ; +} +bool rocm_launch_blocking() +{ + const char * env = getenv("ROCM_LAUNCH_BLOCKING"); + + if (env == 0) return false; + + return atoi(env); +} + +} +#endif + +// true device memory allocation, not visible from host +void * rocm_device_allocate(int size) +{ + void * ptr; + hc::accelerator acc; + ptr = hc::am_alloc(size,acc,0); + return ptr; +} + +// host pinned allocation +// flag = 1, non-coherent, host resident, but with gpu address space pointer +// flag = 2, coherent, host resident, but with host address space pointer +void * rocm_hostpinned_allocate(int size) +{ + void * ptr; + hc::accelerator acc; + ptr = hc::am_alloc(size,acc,2); + return ptr; +} +// same free used by all rocm memory allocations +void rocm_device_free(void * ptr) +{ + hc::am_free(ptr); +} + + +KOKKOS_INLINE_FUNCTION +void rocm_device_synchronize() +{ + hc::accelerator_view av = hc::accelerator().get_default_view(); + hc::completion_future fut = av.create_marker(); + fut.wait(); +} + +void rocm_internal_error_throw( const char * name, const char * file, const int line ) +{ +#if 0 + std::ostringstream out ; + out << name << " error( " << rocmGetErrorName(e) << "): " << rocmGetErrorString(e); + if (file) { + out << " " << file << ":" << line; + } + throw_runtime_exception( out.str() ); +#endif +} + +//---------------------------------------------------------------------------- +// Some significant rocm device properties: +// +// rocmDeviceProp::name : Text label for device +// rocmDeviceProp::major : Device major number +// rocmDeviceProp::minor : Device minor number +// rocmDeviceProp::workgroupSize : number of threads per workgroup +// rocmDeviceProp::multiProcessorCount : number of multiprocessors +// rocmDeviceProp::sharedMemPerBlock : capacity of shared memory per wavefront +// rocmDeviceProp::totalConstMem : capacity of constant memory +// rocmDeviceProp::totalGlobalMem : capacity of global memory +// rocmDeviceProp::maxGridSize[3] : maximum grid size + +// +// +// the data we have available from a ROCm accelerator +// std::wstring get_device_path() +// std::wstring get_description() +// unsigned int get_version() +// bool get_has_display() +// size_t get_dedicated_memory() +// bool get_supports_double_precision() +// bool get_supports_limited_double_precision() +// bool get_is_debug() +// bool get_supports_cpu_shared_memory() +// size_t get_max_tile_static_size() +// unsigned int get_cu_count() +// bool has_cpu_accessible_am() +struct rocmDeviceProp { + char name[256]; + char description[256]; + unsigned int version; + int device_type; + int device_ordinal; + int major; + int minor; + size_t totalGlobalMem; + size_t sharedMemPerWavefront; + int WavefrontSize; + int WorkgroupSize; + int MaxTileCount; + int maxThreadsPerWorkgroup; + int multiProcessorCount; + int canMapHostMemory; + bool APU; +}; + + + +void rocmGetDeviceProperties(struct rocmDeviceProp* devProp, int device) +{ + std::wstring s; + int i,n; + hc::accelerator acc; + std::vector accv = acc.get_all() ; + + hc::accelerator a = accv[device]; + + s=a.get_device_path(); + i = 0; + for(wchar_t c: s) + if((n=std::wctomb(&devProp->name[i],c))>0) + i+=n; + + /* assume a CPU */ + devProp->version = a.get_version(); + devProp->major = a.get_version()>>16; // for CPU, these are meaningless + devProp->minor = a.get_version()&0xff; + devProp->device_ordinal = 0; + + /* is this an AMD graphics card */ + if((devProp->name[0]=='g') && (devProp->name[1]=='f') + && (devProp->name[2]=='x')) { + /* for AMD cards, the name has the format gfxMmmO */ + + devProp->device_type = ((devProp->name[3]-0x30)<<16) + + ((devProp->name[4]-0x30)<<8) + + (devProp->name[5]-0x30); + devProp->device_ordinal = devProp->name[6]-0x30; + devProp->major = devProp->name[3]-0x30; + devProp->minor = devProp->name[5]-0x30; + } + + s=a.get_description(); + i = 0; + for(wchar_t c: s) + if((n=std::wctomb(&devProp->description[i],c))>0) + i+=n; + devProp->totalGlobalMem = a.get_dedicated_memory(); + devProp->sharedMemPerWavefront = a.get_max_tile_static_size(); + devProp->WavefrontSize = 64; + devProp->WorkgroupSize = 256; // preferred + devProp->MaxTileCount = 409600; // as defined in /opt/rocm/hcc-lc/include/hsa_new.h + devProp->maxThreadsPerWorkgroup = 1024; + devProp->multiProcessorCount = a.get_cu_count(); + devProp->canMapHostMemory = a.get_supports_cpu_shared_memory(); +// Kaveri has 64KB L2 per CU, 16KB L1, 64KB Vector Regs/SIMD, or 128 regs/thread +// GCN has 64KB LDS per CU + +//Kaveri APU is 7:0:0 +//Carrizo APU is 8:0:1 + devProp->APU = (((devProp->major==7)&&(devProp->minor==0))| + ((devProp->major==8)&&(devProp->minor==1)))?true:false; +} + +namespace { + + + +class ROCmInternalDevices { +public: + enum { MAXIMUM_DEVICE_COUNT = 64 }; + struct rocmDeviceProp m_rocmProp[ MAXIMUM_DEVICE_COUNT ] ; + int m_rocmDevCount ; + + ROCmInternalDevices(); + + static const ROCmInternalDevices & singleton(); +}; + +ROCmInternalDevices::ROCmInternalDevices() +{ + hc::accelerator acc; + std::vector accv = acc.get_all() ; + m_rocmDevCount = accv.size(); + + if(m_rocmDevCount > MAXIMUM_DEVICE_COUNT) { + Kokkos::abort("Sorry, you have more GPUs per node than we thought anybody would ever have. Please report this to github.com/kokkos/kokkos."); + } + for ( int i = 0 ; i < m_rocmDevCount ; ++i ) { + rocmGetDeviceProperties( m_rocmProp + i , i ); + } +} + +const ROCmInternalDevices & ROCmInternalDevices::singleton() +{ + static ROCmInternalDevices* self = nullptr; + if (!self) { + self = new ROCmInternalDevices(); + } + return *self; + +} + +} + +//---------------------------------------------------------------------------- + +class ROCmInternal { +private: + + ROCmInternal( const ROCmInternal & ); + ROCmInternal & operator = ( const ROCmInternal & ); + + +public: + + typedef Kokkos::Experimental::ROCm::size_type size_type ; + + int m_rocmDev ; + int m_rocmArch ; + unsigned m_multiProcCount ; + unsigned m_maxWorkgroup ; + unsigned m_maxSharedWords ; + size_type m_scratchSpaceCount ; + size_type m_scratchFlagsCount ; + size_type * m_scratchSpace ; + size_type * m_scratchFlags ; + + static int was_finalized; + + static ROCmInternal & singleton(); + + int verify_is_initialized( const char * const label ) const ; + + int is_initialized() const + { return 0 != m_scratchSpace && 0 != m_scratchFlags ; } + + void initialize( int rocm_device_id ); + void finalize(); + + void print_configuration( std::ostream & ) const ; + + + ~ROCmInternal(); + + ROCmInternal() + : m_rocmDev( -1 ) + , m_rocmArch( -1 ) + , m_multiProcCount( 0 ) + , m_maxWorkgroup( 0 ) + , m_maxSharedWords( 0 ) + , m_scratchSpaceCount( 0 ) + , m_scratchFlagsCount( 0 ) + , m_scratchSpace( 0 ) + , m_scratchFlags( 0 ) + {} + + size_type * scratch_space( const size_type size ); + size_type * scratch_flags( const size_type size ); +}; + +int ROCmInternal::was_finalized = 0; +//---------------------------------------------------------------------------- + + +void ROCmInternal::print_configuration( std::ostream & s ) const +{ + const ROCmInternalDevices & dev_info = ROCmInternalDevices::singleton(); + +#if defined( KOKKOS_ENABLE_ROCM ) + s << "macro KOKKOS_ENABLE_ROCM : defined" << std::endl ; +#endif +#if defined( __hcc_version__ ) + s << "macro __hcc_version__ = " << __hcc_version__ + << std::endl ; +#endif + + for ( int i = 0 ; i < dev_info.m_rocmDevCount ; ++i ) { + s << "Kokkos::Experimental::ROCm[ " << i << " ] " + << dev_info.m_rocmProp[i].name + << " version " << (dev_info.m_rocmProp[i].major) << "." << dev_info.m_rocmProp[i].minor + << ", Total Global Memory: " << human_memory_size(dev_info.m_rocmProp[i].totalGlobalMem) + << ", Shared Memory per Wavefront: " << human_memory_size(dev_info.m_rocmProp[i].sharedMemPerWavefront); + if ( m_rocmDev == i ) s << " : Selected" ; + s << std::endl ; + } +} + +//---------------------------------------------------------------------------- + +ROCmInternal::~ROCmInternal() +{ + if ( m_scratchSpace || + m_scratchFlags ) { + std::cerr << "Kokkos::Experimental::ROCm ERROR: Failed to call Kokkos::Experimental::ROCm::finalize()" + << std::endl ; + std::cerr.flush(); + } + + m_rocmDev = -1 ; + m_rocmArch = -1 ; + m_multiProcCount = 0 ; + m_maxWorkgroup = 0 ; + m_maxSharedWords = 0 ; + m_scratchSpaceCount = 0 ; + m_scratchFlagsCount = 0 ; + m_scratchSpace = 0 ; + m_scratchFlags = 0 ; +} + +int ROCmInternal::verify_is_initialized( const char * const label ) const +{ + if ( m_rocmDev < 0 ) { + std::cerr << "Kokkos::Experimental::ROCm::" << label << " : ERROR device not initialized" << std::endl ; + } + return 0 <= m_rocmDev ; +} + +ROCmInternal & ROCmInternal::singleton() +{ + static ROCmInternal* self = nullptr ; + if (!self) { + self = new ROCmInternal(); + } + return *self ; + +} + +void ROCmInternal::initialize( int rocm_device_id ) +{ + if ( was_finalized ) Kokkos::abort("Calling ROCm::initialize after ROCm::finalize is illegal\n"); + + if ( is_initialized() ) return; + + enum { WordSize = sizeof(size_type) }; + + if ( ! HostSpace::execution_space::is_initialized() ) { + const std::string msg("ROCm::initialize ERROR : HostSpace::execution_space is not initialized"); + throw_runtime_exception( msg ); + } + + const ROCmInternalDevices & dev_info = ROCmInternalDevices::singleton(); + + const bool ok_init = 0 == m_scratchSpace || 0 == m_scratchFlags ; + + const bool ok_id = 1 <= rocm_device_id && + rocm_device_id < dev_info.m_rocmDevCount ; + + // Need at least a GPU device + + const bool ok_dev = ok_id && + ( 1 <= dev_info.m_rocmProp[ rocm_device_id ].major && + 0 <= dev_info.m_rocmProp[ rocm_device_id ].minor ); + if ( ok_init && ok_dev ) { + + const struct rocmDeviceProp & rocmProp = + dev_info.m_rocmProp[ rocm_device_id ]; + + m_rocmDev = rocm_device_id ; + +// rocmSetDevice( m_rocmDev ) ); + Kokkos::Impl::rocm_device_synchronize(); + +/* + // Query what compute capability architecture a kernel executes: + m_rocmArch = rocm_kernel_arch(); + if ( m_rocmArch != rocmProp.major * 100 + rocmProp.minor * 10 ) { + std::cerr << "Kokkos::Experimental::ROCm::initialize WARNING: running kernels compiled for compute capability " + << ( m_rocmArch / 100 ) << "." << ( ( m_rocmArch % 100 ) / 10 ) + << " on device with compute capability " + << rocmProp.major << "." << rocmProp.minor + << " , this will likely reduce potential performance." + << std::endl ; + } +*/ + // number of multiprocessors + + m_multiProcCount = rocmProp.multiProcessorCount ; + + //---------------------------------- + // Maximum number of wavefronts, + // at most one workgroup per thread in a workgroup for reduction. + + + m_maxSharedWords = rocmProp.sharedMemPerWavefront/ WordSize ; + + //---------------------------------- + // Maximum number of Workgroups: + + m_maxWorkgroup = 5*rocmProp.multiProcessorCount; //TODO: confirm usage and value + + //---------------------------------- + // Multiblock reduction uses scratch flags for counters + // and scratch space for partial reduction values. + // Allocate some initial space. This will grow as needed. + + { + const unsigned reduce_block_count = m_maxWorkgroup * Impl::ROCmTraits::WorkgroupSize ; + + (void) scratch_flags( reduce_block_count * 2 * sizeof(size_type) ); + (void) scratch_space( reduce_block_count * 16 * sizeof(size_type) ); + } + //---------------------------------- + + } + else { + + std::ostringstream msg ; + msg << "Kokkos::Experimental::ROCm::initialize(" << rocm_device_id << ") FAILED" ; + + if ( ! ok_init ) { + msg << " : Already initialized" ; + } + if ( ! ok_id ) { + msg << " : Device identifier out of range " + << "[0.." << (dev_info.m_rocmDevCount-1) << "]" ; + } + else if ( ! ok_dev ) { + msg << " : Device " ; + msg << dev_info.m_rocmProp[ rocm_device_id ].major ; + msg << "." ; + msg << dev_info.m_rocmProp[ rocm_device_id ].minor ; + msg << " Need at least a GPU" ; + msg << std::endl; + } + Kokkos::Impl::throw_runtime_exception( msg.str() ); + } + + + // Init the array for used for arbitrarily sized atomics + Kokkos::Impl::init_lock_arrays_rocm_space(); + +// Kokkos::Impl::ROCmLockArraysStruct locks; +// locks.atomic = atomic_lock_array_rocm_space_ptr(false); +// locks.scratch = scratch_lock_array_rocm_space_ptr(false); +// locks.threadid = threadid_lock_array_rocm_space_ptr(false); +// rocmMemcpyToSymbol( kokkos_impl_rocm_lock_arrays , & locks , sizeof(ROCmLockArraysStruct) ); +} + +//---------------------------------------------------------------------------- + +typedef Kokkos::Experimental::ROCm::size_type ScratchGrain[ Impl::ROCmTraits::WorkgroupSize ] ; +enum { sizeScratchGrain = sizeof(ScratchGrain) }; + +void rocmMemset( Kokkos::Experimental::ROCm::size_type * ptr , Kokkos::Experimental::ROCm::size_type value , Kokkos::Experimental::ROCm::size_type size) +{ +char * mptr = (char * ) ptr; +#if 0 + parallel_for_each(hc::extent<1>(size), + [=, &ptr] + (hc::index<1> idx) __HC__ + { + int i = idx[0]; + ptr[i] = value; + }).wait(); +#else + for (int i= 0; i Record ; + + Record * const r = Record::allocate( Kokkos::HostSpace() + , "InternalScratchFlags" + , ( sizeScratchGrain * m_scratchFlagsCount ) ); + + Record::increment( r ); + + m_scratchFlags = reinterpret_cast( r->data() ); + + rocmMemset( m_scratchFlags , 0 , m_scratchFlagsCount * sizeScratchGrain ); + } + + return m_scratchFlags ; +} + +Kokkos::Experimental::ROCm::size_type * +ROCmInternal::scratch_space( const Kokkos::Experimental::ROCm::size_type size ) +{ + if ( verify_is_initialized("scratch_space") && m_scratchSpaceCount * sizeScratchGrain < size ) { + + m_scratchSpaceCount = ( size + sizeScratchGrain - 1 ) / sizeScratchGrain ; + + typedef Kokkos::Experimental::Impl::SharedAllocationRecord< Kokkos::HostSpace , void > Record ; + + Record * const r = Record::allocate( Kokkos::HostSpace() + , "InternalScratchSpace" + , ( sizeScratchGrain * m_scratchSpaceCount ) ); + + Record::increment( r ); + + m_scratchSpace = reinterpret_cast( r->data() ); + } + + return m_scratchSpace ; +} + +//---------------------------------------------------------------------------- + +void ROCmInternal::finalize() +{ + Kokkos::Impl::rocm_device_synchronize(); + was_finalized = 1; + if ( 0 != m_scratchSpace || 0 != m_scratchFlags ) { + +// atomic_lock_array_rocm_space_ptr(false); +// scratch_lock_array_rocm_space_ptr(false); +// threadid_lock_array_rocm_space_ptr(false); + + typedef Kokkos::Experimental::Impl::SharedAllocationRecord< HostSpace > RecordROCm ; + typedef Kokkos::Experimental::Impl::SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace > RecordHost ; + + RecordROCm::decrement( RecordROCm::get_record( m_scratchFlags ) ); + RecordROCm::decrement( RecordROCm::get_record( m_scratchSpace ) ); + + m_rocmDev = -1 ; + m_multiProcCount = 0 ; + m_maxWorkgroup = 0 ; + m_maxSharedWords = 0 ; + m_scratchSpaceCount = 0 ; + m_scratchFlagsCount = 0 ; + m_scratchSpace = 0 ; + m_scratchFlags = 0 ; + } +} + +//---------------------------------------------------------------------------- + +Kokkos::Experimental::ROCm::size_type rocm_internal_cu_count() +{ return ROCmInternal::singleton().m_multiProcCount ; } + +Kokkos::Experimental::ROCm::size_type rocm_internal_maximum_extent_size() +{ return ROCmInternal::singleton().m_maxWorkgroup ; } + +Kokkos::Experimental::ROCm::size_type rocm_internal_maximum_shared_words() +{ return ROCmInternal::singleton().m_maxSharedWords ; } + +Kokkos::Experimental::ROCm::size_type * rocm_internal_scratch_space( const Kokkos::Experimental::ROCm::size_type size ) +{ return ROCmInternal::singleton().scratch_space( size ); } + +Kokkos::Experimental::ROCm::size_type * rocm_internal_scratch_flags( const Kokkos::Experimental::ROCm::size_type size ) +{ return ROCmInternal::singleton().scratch_flags( size ); } + + + +} // namespace Impl +} // namespace Kokkos + +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Experimental { + +//ROCm::size_type ROCm::detect_device_count() +//{ return Impl::ROCmInternalDevices::singleton().m_rocmDevCount ; } + +int ROCm::concurrency() { +#if defined(KOKKOS_ARCH_KAVERI) + return 8*64*40; // 20480 kaveri +#else + return 32*8*40; // 81920 fiji and hawaii +#endif +} +int ROCm::is_initialized() +{ return Kokkos::Impl::ROCmInternal::singleton().is_initialized(); } + +void ROCm::initialize( const ROCm::SelectDevice config ) +{ + Kokkos::Impl::ROCmInternal::singleton().initialize( config.rocm_device_id ); + + #if defined(KOKKOS_ENABLE_PROFILING) + Kokkos::Profiling::initialize(); + #endif +} + +#if 0 +std::vector +ROCm::detect_device_arch() +{ + const Impl::ROCmInternalDevices & s = Impl::ROCmInternalDevices::singleton(); + + std::vector output( s.m_rocmDevCount ); + + for ( int i = 0 ; i < s.m_rocmDevCount ; ++i ) { + output[i] = s.m_rocmProp[i].major * 100 + s.m_rocmProp[i].minor ; + } + + return output ; +} + +ROCm::size_type ROCm::device_arch() +{ + return 1 ; +} +#endif + +void ROCm::finalize() +{ + Kokkos::Impl::ROCmInternal::singleton().finalize(); + + #if defined(KOKKOS_ENABLE_PROFILING) + Kokkos::Profiling::finalize(); + #endif +} + +ROCm::ROCm() + : m_device( Kokkos::Impl::ROCmInternal::singleton().m_rocmDev ) +{ + Kokkos::Impl::ROCmInternal::singleton().verify_is_initialized( "ROCm instance constructor" ); +} + +bool ROCm::isAPU(int device) { + const Kokkos::Impl::ROCmInternalDevices & dev_info = + Kokkos::Impl::ROCmInternalDevices::singleton(); + return (dev_info.m_rocmProp[device].APU); +} + +bool ROCm::isAPU() { + return ROCm::isAPU(rocm_device()); +} + +//ROCm::ROCm( const int instance_id ) +// : m_device( Impl::ROCmInternal::singleton().m_rocmDev ) +//{} + +void ROCm::print_configuration( std::ostream & s , const bool ) +{ Kokkos::Impl::ROCmInternal::singleton().print_configuration( s ); } + +bool ROCm::sleep() { return false ; } + +bool ROCm::wake() { return true ; } + +void ROCm::fence() +{ + Kokkos::Impl::rocm_device_synchronize(); +} + +const char* ROCm::name() { return "ROCm"; } + +} // namespace Experimental +} // namespace Kokkos + +#endif // KOKKOS_ENABLE_ROCM +//---------------------------------------------------------------------------- + diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Invoke.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Invoke.hpp new file mode 100644 index 0000000000..481e7df3a4 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Invoke.hpp @@ -0,0 +1,138 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +#if !defined( KOKKOS_ROCM_INVOKE_H ) +#define KOKKOS_ROCM_INVOKE_H + +namespace Kokkos { +namespace Impl { + +template()), int>::type = 0> +KOKKOS_INLINE_FUNCTION void rocm_invoke(F&& f, Ts&&... xs) +{ + f(Tag(), static_cast(xs)...); +} + +template()), int>::type = 0> +KOKKOS_INLINE_FUNCTION void rocm_invoke(F&& f, Ts&&... xs) +{ + f(static_cast(xs)...); +} + + +template +struct rocm_invoke_fn +{ + F* f; + rocm_invoke_fn(F& f_) : f(&f_) + {} + + template + KOKKOS_INLINE_FUNCTION void operator()(Ts&&... xs) const + { + rocm_invoke(*f, static_cast(xs)...); + } +}; + +template +KOKKOS_INLINE_FUNCTION rocm_invoke_fn make_rocm_invoke_fn(F& f) +{ + return {f}; +} + +template +KOKKOS_INLINE_FUNCTION T& rocm_unwrap(T& x) +{ + return x; +} + +template +KOKKOS_INLINE_FUNCTION T& rocm_unwrap(std::reference_wrapper x) +{ + return x; +} + +template +struct rocm_capture_fn +{ + F f; + T data; + + KOKKOS_INLINE_FUNCTION rocm_capture_fn(F f_, T x) + : f(f_), data(x) + {} + + template + KOKKOS_INLINE_FUNCTION void operator()(Ts&&... xs) const + { + f(rocm_unwrap(data), static_cast(xs)...); + } +}; + +template +KOKKOS_INLINE_FUNCTION rocm_capture_fn rocm_capture(F f, T x) +{ + return {f, x}; +} + +template +KOKKOS_INLINE_FUNCTION auto rocm_capture(F f, T x, U y, Ts... xs) -> decltype(rocm_capture(rocm_capture(f, x), y, xs...)) +{ + return rocm_capture(rocm_capture(f, x), y, xs...); +} + +struct rocm_apply_op +{ + template + KOKKOS_INLINE_FUNCTION void operator()(F&& f, Ts&&... xs) const + { + f(static_cast(xs)...); + } +}; + +}} + +#endif diff --git a/lib/kokkos/core/src/impl/Kokkos_spinwait.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Join.hpp similarity index 68% rename from lib/kokkos/core/src/impl/Kokkos_spinwait.hpp rename to lib/kokkos/core/src/ROCm/Kokkos_ROCm_Join.hpp index 6e34b8a943..d3d150703e 100644 --- a/lib/kokkos/core/src/impl/Kokkos_spinwait.hpp +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Join.hpp @@ -41,40 +41,32 @@ //@HEADER */ - -#ifndef KOKKOS_SPINWAIT_HPP -#define KOKKOS_SPINWAIT_HPP - -#include - -#include +#if !defined( KOKKOS_ROCM_JOIN_H ) +#define KOKKOS_ROCM_JOIN_H namespace Kokkos { namespace Impl { -#if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) -void spinwait_while_equal( volatile int32_t & flag , const int32_t value ); -void spinwait_until_equal( volatile int32_t & flag , const int32_t value ); +// Adaptor to use ValueJoin with standard algorithms +template +struct join_operator +{ + const F* fp; + template + T operator()(T x, const U& y) const + { + Joiner::join(*fp, &x, &y); + return x; + } +}; -void spinwait_while_equal( volatile int64_t & flag , const int64_t value ); -void spinwait_until_equal( volatile int64_t & flag , const int64_t value ); -#else +template +join_operator make_join_operator(const F& f) +{ + return join_operator{&f}; +} -KOKKOS_INLINE_FUNCTION -void spinwait_while_equal( volatile int32_t & , const int32_t ) {} -KOKKOS_INLINE_FUNCTION -void spinwait_until_equal( volatile int32_t & , const int32_t ) {} - -KOKKOS_INLINE_FUNCTION -void spinwait_while_equal( volatile int64_t & , const int64_t ) {} -KOKKOS_INLINE_FUNCTION -void spinwait_until_equal( volatile int64_t & , const int64_t ) {} +}} #endif - -} /* namespace Impl */ -} /* namespace Kokkos */ - -#endif /* #ifndef KOKKOS_SPINWAIT_HPP */ - diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Parallel.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Parallel.hpp new file mode 100644 index 0000000000..04f4754db2 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Parallel.hpp @@ -0,0 +1,1417 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include +#include +#include + + +namespace Kokkos { +namespace Impl { + +struct ROCmTeamMember ; + +template< class ... Properties > +class TeamPolicyInternal< Kokkos::Experimental::ROCm, Properties ... >: public PolicyTraits { +private: + int m_league_size ; + int m_team_size ; + int m_vector_length ; + int m_team_scratch_size[2] ; + int m_thread_scratch_size[2] ; + int m_chunk_size ; + + +public: + + using execution_policy = TeamPolicyInternal ; + using execution_space = Kokkos::Experimental::ROCm ; + typedef PolicyTraits traits; + + TeamPolicyInternal& operator = (const TeamPolicyInternal& p) { + m_league_size = p.m_league_size; + m_team_size = p.m_team_size; + m_vector_length = p.m_vector_length; + m_team_scratch_size[0] = p.m_team_scratch_size[0]; + m_team_scratch_size[1] = p.m_team_scratch_size[1]; + m_thread_scratch_size[0] = p.m_thread_scratch_size[0]; + m_thread_scratch_size[1] = p.m_thread_scratch_size[1]; + m_chunk_size = p.m_chunk_size; + return *this; + } + + TeamPolicyInternal() + : m_league_size( 0 ) + , m_team_size( 0 ) + , m_vector_length( 0 ) + , m_team_scratch_size {0,0} + , m_thread_scratch_size {0,0} + , m_chunk_size ( 64 ) + {} + + TeamPolicyInternal( const int arg_league_size + , const int arg_team_size ) + : m_league_size( arg_league_size ), + m_team_size( arg_team_size ) + , m_team_scratch_size {0,0} + , m_thread_scratch_size {0,0} + , m_chunk_size ( 64 ) + {} + + TeamPolicyInternal( const int arg_league_size + , const int arg_team_size + , const int vector_length_request=1) + : m_league_size( arg_league_size ), + m_team_size( arg_team_size ), + m_vector_length (vector_length_request) + , m_team_scratch_size {0,0} + , m_thread_scratch_size {0,0} + , m_chunk_size ( 64 ) + {} + + TeamPolicyInternal( const int arg_league_size + , const Kokkos::AUTO_t ) + : m_league_size( arg_league_size ), m_team_size( -1 ) + , m_team_scratch_size {0,0} + , m_thread_scratch_size {0,0} + , m_chunk_size ( 64 ) + {} + + TeamPolicyInternal( const int arg_league_size + , const Kokkos::AUTO_t + , const int vector_length_request) + : m_league_size( arg_league_size ), + m_team_size( -1 ), + m_vector_length (vector_length_request) + , m_team_scratch_size {0,0} + , m_thread_scratch_size {0,0} + , m_chunk_size ( 64 ) + {} + + inline int chunk_size() const { return m_chunk_size ; } + + /** \brief set chunk_size to a discrete value*/ + KOKKOS_INLINE_FUNCTION TeamPolicyInternal set_chunk_size(typename traits::index_type chunk_size_) const { + TeamPolicyInternal p = *this; + p.m_chunk_size = chunk_size_; + return p; + } + + /** \brief set per team scratch size for a specific level of the scratch hierarchy */ + inline TeamPolicyInternal set_scratch_size(const int& level, const PerTeamValue& per_team) const { + TeamPolicyInternal p = *this; + p.m_team_scratch_size[level] = per_team.value; + return p; + }; + + /** \brief set per thread scratch size for a specific level of the scratch hierarchy */ + inline TeamPolicyInternal set_scratch_size(const int& level, const PerThreadValue& per_thread) const { + TeamPolicyInternal p = *this; + p.m_thread_scratch_size[level] = per_thread.value; + return p; + }; + + /** \brief set per thread and per team scratch size for a specific level of the scratch hierarchy */ + inline TeamPolicyInternal set_scratch_size(const int& level, const PerTeamValue& per_team, const PerThreadValue& per_thread) const { + TeamPolicyInternal p = *this; + p.m_team_scratch_size[level] = per_team.value; + p.m_thread_scratch_size[level] = per_thread.value; + return p; + }; + +// TODO: evaluate proper team_size_max requirements + template< class Functor_Type> + KOKKOS_INLINE_FUNCTION static + int team_size_max( const Functor_Type & functor) + { + typedef typename Kokkos::Impl::FunctorValueTraits::value_type value_type; + return team_size_recommended(functor); + // return std::min(Kokkos::Impl::get_max_tile_size() / sizeof(value_type), Kokkos::Impl::get_max_tile_thread()); + } + + template< class Functor_Type> + KOKKOS_INLINE_FUNCTION static int team_size_recommended(const Functor_Type & functor) + { return Kokkos::Impl::get_tile_size::value_type>(); } + + template< class Functor_Type > + KOKKOS_INLINE_FUNCTION static int team_size_recommended(const Functor_Type &functor, const int vector_length) + { + int max = team_size_recommended( functor )/vector_length; + if(max < 1) max = 1; + return(max); + } + + template + KOKKOS_INLINE_FUNCTION int team_size(const F& f) const { return (m_team_size > 0) ? m_team_size : team_size_recommended(f); } + KOKKOS_INLINE_FUNCTION int team_size() const { return (m_team_size > 0) ? m_team_size : Impl::get_max_tile_thread(); ; } + KOKKOS_INLINE_FUNCTION int league_size() const { return m_league_size ; } + + + inline int vector_length() const { return m_vector_length ; } + inline int scratch_size(int level, int team_size_ = -1) const { + if(team_size_<0) team_size_ = m_team_size; + return m_team_scratch_size[level] + team_size_*m_thread_scratch_size[level]; + } + inline size_t team_scratch_size(int level) const { + return m_team_scratch_size[level]; + } + inline size_t thread_scratch_size(int level) const { + return m_thread_scratch_size[level]; + } + + typedef Impl::ROCmTeamMember member_type; +}; + + struct ROCmTeamMember { + typedef Kokkos::Experimental::ROCm execution_space ; + typedef Kokkos::ScratchMemorySpace scratch_memory_space ; + + KOKKOS_INLINE_FUNCTION + const scratch_memory_space & team_shmem() const + { return m_team_shared.set_team_thread_mode(0,1,0); } + KOKKOS_INLINE_FUNCTION + const execution_space::scratch_memory_space & team_scratch(const int& level) const + { return m_team_shared.set_team_thread_mode(level,1,0) ; } + KOKKOS_INLINE_FUNCTION + const execution_space::scratch_memory_space & thread_scratch(const int& level) const + { return m_team_shared.set_team_thread_mode(level, + team_size(), + team_rank()) ; } + + + /* Rank of this team within the league of teams */ + KOKKOS_INLINE_FUNCTION int league_rank() const { return m_idx.tile[0]; } + /* Number of teams in the league */ + KOKKOS_INLINE_FUNCTION int league_size() const { return m_league_size; } + /* Rank of this thread within this team */ + KOKKOS_INLINE_FUNCTION int team_rank() const { return m_idx.local[0] / m_vector_length; } + /* Rank of this thread within this thread */ + KOKKOS_INLINE_FUNCTION int vector_rank() const { return m_idx.local[0] % m_vector_length; } + KOKKOS_INLINE_FUNCTION int lindex() const { return m_idx.local[0]; } + KOKKOS_INLINE_FUNCTION int gindex() const { return m_idx.global[0]; } + KOKKOS_INLINE_FUNCTION int tindex() const { return m_idx.tile[0]; } + KOKKOS_INLINE_FUNCTION int tile_dim() const { return m_idx.tile_dim[0]; } + KOKKOS_INLINE_FUNCTION int team_size() const { return m_team_size; } + KOKKOS_INLINE_FUNCTION int vector_length() const { return m_vector_length; } + + + KOKKOS_INLINE_FUNCTION + ROCmTeamMember( const hc::tiled_index< 1 > & arg_idx, int league_size_,int team_size_ ) + : m_league_size( league_size_ ) + , m_team_size( team_size_ ) + , m_team_shared( nullptr, 0 ) + , m_vector_length( 1 ) + , m_idx( arg_idx ) + {} + + KOKKOS_INLINE_FUNCTION + ROCmTeamMember( const hc::tiled_index< 1 > & arg_idx, int league_size_,int team_size_, char * shared, std::size_t shsize, std::size_t scratch_size0, char * scratch_ptr, std::size_t scratch_size1, std::size_t vector_length) + : m_league_size( league_size_ ) + , m_team_size( team_size_ ) + , m_team_shared( shared + + arg_idx.tile[0]*(shsize+scratch_size0), + (shsize+scratch_size0)*league_size_, + scratch_ptr + arg_idx.tile[0]*scratch_size1, + scratch_size1*league_size_) + , m_vector_length( vector_length ) + , m_idx( arg_idx ) + {} + + KOKKOS_INLINE_FUNCTION + void team_barrier() const { + m_idx.barrier.wait(); + } + + template + KOKKOS_INLINE_FUNCTION + void team_broadcast(const ValueType& value, const int& thread_id ) const + { + static_assert(std::is_trivially_default_constructible(), "Only trivial constructible types can be broadcasted"); + tile_static ValueType local_value; + zero_init(local_value); + if (this->team_rank() == thread_id) { + local_value = value; + } + this->team_barrier(); + value = local_value; + } +// Reduce across a team of threads. +// +// Each thread has vector_length elements. +// This reduction is for TeamThreadRange operations, where the range +// is spread across threads. Effectively, there are vector_length +// independent reduction operations. +// This is different from a reduction across the elements of a thread, +// which reduces every vector element. + + template< class ValueType, class JoinOp > + KOKKOS_INLINE_FUNCTION + ValueType team_reduce( const ValueType & value , const JoinOp & op_in) const + { + typedef JoinLambdaAdapter JoinOpFunctor ; + const JoinOpFunctor op(op_in); + + tile_static ValueType buffer[512]; + const auto local = lindex(); + const auto team = team_rank(); + auto vector_rank = local%m_vector_length; + auto thread_base = team*m_vector_length; + + const std::size_t size = next_pow_2(m_team_size+1)/2; +#if defined(ROCM15) + buffer[local] = value; +#else + // ROCM 1.5 handles address spaces better, previous version didn't + lds_for(buffer[local], [&](ValueType& x) + { + x = value; + }); +#endif + m_idx.barrier.wait(); + + for(std::size_t s = 1; s < size; s *= 2) + { + const std::size_t index = 2 * s * team; + if (index < size) + { +#if defined(ROCM15) + op.join(buffer[vector_rank+index*m_vector_length], + buffer[vector_rank+(index+s)*m_vector_length]); +#else + lds_for(buffer[vector_rank+index*m_vector_length], [&](ValueType& x) + { + lds_for(buffer[vector_rank+(index+s)*m_vector_length], + [&](ValueType& y) + { + op.join(x, y); + }); + }); +#endif + } + m_idx.barrier.wait(); + } + + if (local == 0) + { + for(int i=size*m_vector_length; i + KOKKOS_INLINE_FUNCTION + typename std::enable_if< is_reducer< ReducerType >::value >::type + team_reduce( const ReducerType & reducer) const + { + typedef typename ReducerType::value_type value_type ; + + tile_static value_type buffer[512]; + const auto local = lindex(); + const auto team = team_rank(); + auto vector_rank = local%m_vector_length; + auto thread_base = team*m_vector_length; + + const std::size_t size = next_pow_2(m_team_size+1)/2; +#if defined(ROCM15) + buffer[local] = reducer.reference(); +#else + // ROCM 1.5 handles address spaces better, previous version didn't + lds_for(buffer[local], [&](ValueType& x) + { + x = value; + }); +#endif + m_idx.barrier.wait(); + + for(std::size_t s = 1; s < size; s *= 2) + { + const std::size_t index = 2 * s * team; + if (index < size) + { +#if defined(ROCM15) + reducer.join(buffer[vector_rank+index*m_vector_length], + buffer[vector_rank+(index+s)*m_vector_length]); +#else + lds_for(buffer[vector_rank+index*m_vector_length], [&](ValueType& x) + { + lds_for(buffer[vector_rank+(index+s)*m_vector_length], + [&](ValueType& y) + { + reducer.join(x, y); + }); + }); +#endif + } + m_idx.barrier.wait(); + } + + if (local == 0) + { + for(int i=size*m_vector_length; i + KOKKOS_INLINE_FUNCTION + ValueType thread_reduce( const ValueType & value , const JoinOp & op_in) const + { + typedef JoinLambdaAdapter JoinOpFunctor ; + const JoinOpFunctor op(op_in); + + const auto local = m_idx.local[0]; + tile_static ValueType buffer[512]; + const std::size_t size = m_vector_length; //vector length must be power of 2 + auto vector_rank = local%m_vector_length; + auto thread_base = team_rank()*m_vector_length; + lds_for(buffer[local], [&](ValueType& x) + { + x = value; + }); + m_idx.barrier.wait(); + for(std::size_t s = 1; s < size; s *= 2) + { + const std::size_t index = 2 * s * vector_rank; + if (index < size) + { +#if defined(ROCM15) + op.join(buffer[thread_base+index], buffer[thread_base+index+s]); +#else + + lds_for(buffer[thread_base+index], [&](ValueType& x) + { + lds_for(buffer[thread_base+index+s], [&](ValueType& y) + { + op.join(x, y); + }); + }); +#endif + } + m_idx.barrier.wait(); + } + + m_idx.barrier.wait(); + return buffer[thread_base]; + } + + template< typename ReducerType > + KOKKOS_INLINE_FUNCTION static + typename std::enable_if< is_reducer< ReducerType >::value >::type + vector_reduce( ReducerType const & reducer ) + { + #ifdef __HCC_ACCELERATOR__ + if(blockDim_x == 1) return; + + // Intra vector lane shuffle reduction: + typename ReducerType::value_type tmp ( reducer.reference() ); + + for ( int i = blockDim_x ; ( i >>= 1 ) ; ) { + shfl_down( reducer.reference() , i , blockDim_x ); + if ( (int)threadIdx_x < i ) { reducer.join( tmp , reducer.reference() ); } + } + + // Broadcast from root lane to all other lanes. + // Cannot use "butterfly" algorithm to avoid the broadcast + // because floating point summation is not associative + // and thus different threads could have different results. + + shfl( reducer.reference() , 0 , blockDim_x ); + #endif + } + + + + /** \brief Intra-team exclusive prefix sum with team_rank() ordering + * with intra-team non-deterministic ordering accumulation. + * + * The global inter-team accumulation value will, at the end of the + * league's parallel execution, be the scan's total. + * Parallel execution ordering of the league's teams is non-deterministic. + * As such the base value for each team's scan operation is similarly + * non-deterministic. + */ + template< typename Type > + KOKKOS_INLINE_FUNCTION Type team_scan( const Type & value , Type * const global_accum = nullptr ) const + { + #if 0 + const auto local = m_idx.local[0]; + const auto last = m_team_size - 1; + const auto init = 0; + tile_static Type buffer[256]; + + if (local == last) buffer[0] = init; + else buffer[local] = value; + + m_idx.barrier.wait(); + + for(std::size_t s = 1; s < m_team_size; s *= 2) + { + if (local >= s) buffer[local] += buffer[local - s]; + m_idx.barrier.wait(); + } + + if ( global_accum ) + { + if(local == last) + { + atomic_fetch_add(global_accum, buffer[local] + value); + } + m_idx.barrier.wait(); + buffer[local] += *global_accum; + } + m_idx.barrier.wait(); + return buffer[local]; +#else + tile_static Type sarray[2][256+1]; + int lid = m_idx.local[0]; + int lp1 = lid+1; + + int toggle = 1; + int _toggle = 0; + m_idx.barrier.wait(); + + if(lid == 0) + { + sarray[1][0] = 0; + sarray[0][0] = 0; + } + sarray[1][lp1] = value; + + m_idx.barrier.wait(); + for(int stride = 1; stride < m_team_size; stride*=2) + { + if(lid >= stride) + { + sarray[_toggle][lp1] = + sarray[toggle][lp1]+sarray[toggle][lp1-stride]; + } + else + { + sarray[_toggle][lp1] = sarray[toggle][lp1]; + } + toggle = _toggle; + _toggle = 1-toggle; + m_idx.barrier.wait(); + } + + if ( global_accum ) + { + if(m_team_size == lp1) + { + sarray[toggle][m_team_size] = atomic_fetch_add(global_accum,sarray[toggle][m_team_size]); + } + m_idx.barrier.wait(); + sarray[toggle][lid] += sarray[toggle][m_team_size]; + } + m_idx.barrier.wait(); + return sarray[toggle][lid]; +#endif + } + + private: + int m_league_size ; + int m_team_size ; + const scratch_memory_space m_team_shared; + + public: + int m_vector_length; + hc::tiled_index<1> m_idx; + }; +} +} // namespace Kokkos +#include + +namespace Kokkos { +namespace Impl { + +//---------------------------------------------------------------------------- + +template< class FunctorType , class... Traits > +class ParallelFor< FunctorType + , Kokkos::RangePolicy< Traits... >, Kokkos::Experimental::ROCm > +{ +private: + + typedef Kokkos::RangePolicy< Traits... > Policy ; + +public: + + inline + ParallelFor( const FunctorType & f + , const Policy & policy ) + { + + + const auto len = policy.end()-policy.begin(); + const auto offset = policy.begin(); + if(len == 0) return; +// define a lambda to work around a compiler issue. The compiler does not +// properly dereference f inside the pfe. +auto foo = [=](size_t i){rocm_invoke(f, i);}; + +#if __hcc_workweek__ > 16600 + hc::parallel_for_each(hc::extent<1>(len) , [=](const hc::index<1> & idx) [[hc]] [[hc_max_workgroup_dim(1024,1,1)]] +#else + hc::parallel_for_each(hc::extent<1>(len).tile(256) , [=](const hc::index<1> & idx) [[hc]] +#endif + { + if(idx[0] +class ParallelFor< F + , Kokkos::TeamPolicy< Traits... > + , Kokkos::Experimental::ROCm > +{ + using Policy = Kokkos::Impl::TeamPolicyInternal< Kokkos::Experimental::ROCm, Traits... >; + typedef Kokkos::Impl::FunctorValueTraits ValueTraits; + +public: + inline + ParallelFor( const F & f + , const Policy & policy ) + { + const auto league_size = policy.league_size(); + const auto team_size = policy.team_size(); + const int vector_length = policy.vector_length(); + const auto total_size = league_size * team_size * vector_length; + const int scratch_size0 = policy.scratch_size(0,team_size); + const int scratch_size1 = policy.scratch_size(1,team_size); + + if(total_size == 0) return; + + const auto shared_size = FunctorTeamShmemSize< F >::value( f , team_size ); + char * scratch = NULL; + char * shared = (char *)rocm_device_allocate(shared_size * league_size + + scratch_size0*league_size); + if(0 flat_extent( total_size ); + + hc::tiled_extent< 1 > team_extent = flat_extent.tile(team_size*vector_length); + hc::parallel_for_each( team_extent , [=](hc::tiled_index<1> idx) [[hc]] + { + rocm_invoke(f, typename Policy::member_type(idx, league_size, team_size, shared, shared_size, scratch_size0, scratch, scratch_size1,vector_length)); + }).wait(); + + if(0 +class ParallelReduce< + FunctorType , Kokkos::RangePolicy< Traits... >, ReducerType, Kokkos::Experimental::ROCm > +{ +public: + + typedef Kokkos::RangePolicy< Traits... > Policy ; + + // TODO: Use generic lambdas instead + struct invoke_fn + { + template + KOKKOS_INLINE_FUNCTION void operator()(std::size_t size, F&& f, hc::tiled_index<1> idx, tile_desc td, Ts&&... xs) const + { + auto global = idx.global[0]; + if (global < size) f(idx.global[0], static_cast(xs)...); + } + }; + + template< class ViewType > + inline + ParallelReduce( const FunctorType & f, + const Policy & policy, + const ViewType & result_view, + typename std::enable_if< + Kokkos::is_view< ViewType >::value && + !Kokkos::is_reducer_type::value + ,void*>::type = NULL) + { + typedef typename Policy::work_tag Tag; + typedef Kokkos::Impl::FunctorValueTraits< FunctorType , Tag > ValueTraits; + typedef Kokkos::Impl::FunctorValueInit< FunctorType , Tag > ValueInit; + typedef typename ValueTraits::reference_type reference_type; + + const auto total_size = policy.end() - policy.begin(); + + if(total_size==0) { + if (result_view.data()) { + ValueInit::init( f , result_view.data() ); + } + return; + } + + Kokkos::Impl::reduce_enqueue< Tag > + ( total_size + , f + , InvalidType{} + , rocm_capture(invoke_fn{}, total_size) + , result_view.data() + , result_view.extent(0) + ); + } + + inline + ParallelReduce( const FunctorType & f, + Policy policy, + const ReducerType& reducer ) + { + typedef typename Policy::work_tag Tag; + + typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef Kokkos::Impl::FunctorValueTraits< FunctorType , Tag > ValueTraits; + typedef Kokkos::Impl::FunctorValueInit< ReducerType, Tag > ValueInit ; + + typedef typename ValueTraits::reference_type reference_type; + + const auto total_size = policy.end() - policy.begin(); + + if(total_size==0) { + if (reducer.view().data()) { + ValueInit::init( ReducerConditional::select(f,reducer), + reducer.view().data() ); + } + return; + } + + Kokkos::Impl::reduce_enqueue< Tag > + ( total_size + , f + , reducer + , rocm_capture(invoke_fn{}, total_size) + , reducer.view().data() + , reducer.view().extent(0) + ); + } + + KOKKOS_INLINE_FUNCTION + void execute() const {} + +}; + +template< class FunctorType, class ReducerType, class... Traits > +class ParallelReduce< + FunctorType , Kokkos::TeamPolicy< Traits... >, ReducerType, Kokkos::Experimental::ROCm > +{ + using Policy = Kokkos::Impl::TeamPolicyInternal< Kokkos::Experimental::ROCm, Traits... >; + typedef Kokkos::Impl::FunctorValueTraits ValueTraits; + +public: + + struct invoke_fn + { + template + KOKKOS_INLINE_FUNCTION void operator()(Create&& create, F&& f, hc::tiled_index<1> idx, tile_desc td, Ts&&... xs) const + { + f(create(idx, td), static_cast(xs)...); + } + }; + + template< class ViewType > + inline + ParallelReduce( const FunctorType & f, + const Policy & policy, + const ViewType & result_view, + typename std::enable_if< + Kokkos::is_view< ViewType >::value && + !Kokkos::is_reducer_type::value + ,void*>::type = NULL) + { + const int league_size = policy.league_size(); + const int team_size = policy.team_size(f); + const int vector_length = policy.vector_length(); + const int scratch_size0 = policy.scratch_size(0,team_size); + const int scratch_size1 = policy.scratch_size(1,team_size); + const int total_size = league_size * team_size ; + + if(total_size == 0) return; + + const int reduce_size = ValueTraits::value_size( f ); + const int shared_size = FunctorTeamShmemSize< FunctorType >::value( f , team_size ); + + char * shared; + char * scratch = NULL; + + shared = (char *)rocm_device_allocate(league_size * + (shared_size + scratch_size0)); + if(0 idx, tile_desc td) + { + + return typename Policy::member_type(idx, league_size, td.team_size, + shared, shared_size, scratch_size0, + scratch, scratch_size1, + vector_length); + }; + + Kokkos::Impl::reduce_enqueue< typename Policy::work_tag > + ( total_size*vector_length + , f + , InvalidType{} + , rocm_capture(invoke_fn{}, create_team_member) + , result_view.ptr_on_device() + , result_view.dimension_0() + , team_size + , vector_length + , shared_size + ); + + if(0::value( f , team_size ); + const int scratch_size0 = policy.scratch_size(0,team_size); + const int scratch_size1 = policy.scratch_size(1,team_size); + + char * shared; + char * scratch = NULL; + shared = (char *)rocm_device_allocate((shared_size + scratch_size0) * + league_size); + if(0 idx, tile_desc td) + { + return typename Policy::member_type(idx, league_size, td.tile_size, shared, shared_size, scratch_size0, scratch, scratch_size1, vector_length); + }; + + Kokkos::Impl::reduce_enqueue< typename Policy::work_tag > + ( league_size + , f + , reducer + , rocm_capture(invoke_fn{}, create_team_member) + , reducer.view().data() + , reducer.view().extent(0),team_size,vector_length + , shared_size + ); + + if(0 +class ParallelScan< FunctorType , Kokkos::RangePolicy< Traits... >, Kokkos::Experimental::ROCm > +{ +private: + + typedef Kokkos::RangePolicy< Traits... > Policy; + typedef typename Policy::work_tag Tag; + typedef Kokkos::Impl::FunctorValueTraits< FunctorType, Tag> ValueTraits; + +public: + + //---------------------------------------- + + inline + ParallelScan( const FunctorType & f + , const Policy & policy ) + { + const auto len = policy.end()-policy.begin(); + + + if(len==0) return; + + scan_enqueue(len, f, [](hc::tiled_index<1> idx, int, int) { return idx.global[0]; }); + } + + KOKKOS_INLINE_FUNCTION + void execute() const {} + + //---------------------------------------- +}; + +template< class FunctorType , class... Traits> +class ParallelScan< FunctorType , Kokkos::TeamPolicy< Traits... >, Kokkos::Experimental::ROCm > +{ +private: + + using Policy = Kokkos::Impl::TeamPolicyInternal< Kokkos::Experimental::ROCm, Traits... >; + typedef typename Policy::work_tag Tag; + typedef Kokkos::Impl::FunctorValueTraits< FunctorType, Tag> ValueTraits; + +public: + + //---------------------------------------- + + inline + ParallelScan( const FunctorType & f + , const Policy & policy ) + { + const auto league_size = policy.league_size(); + const auto team_size = policy.team_size(f); + const auto len = league_size * team_size; + + if(len == 0) return; + + scan_enqueue(len, f, [&](hc::tiled_index<1> idx, int n_teams, int n_leagues) { return typename Policy::member_type(idx,n_leagues,n_teams); }); + } + + KOKKOS_INLINE_FUNCTION + void execute() const {} + + //---------------------------------------- +}; + +} +} + +namespace Kokkos { +namespace Impl { + template + struct TeamThreadRangeBoundariesStruct { + typedef iType index_type; + const iType start; + const iType end; + const iType increment; + const ROCmTeamMember& thread; + +#if defined( __HCC_ACCELERATOR__ ) + KOKKOS_INLINE_FUNCTION + TeamThreadRangeBoundariesStruct (const ROCmTeamMember& thread_, const iType& count): + start( thread_.team_rank() ), + end( count ), + increment( thread_.team_size() ), + thread(thread_) + {} + KOKKOS_INLINE_FUNCTION + TeamThreadRangeBoundariesStruct (const ROCmTeamMember& thread_, const iType& begin_, const iType& end_): + start( begin_ + thread_.team_rank() ), + end( end_ ), + increment( thread_.team_size() ), + thread(thread_) + {} +#else + KOKKOS_INLINE_FUNCTION + TeamThreadRangeBoundariesStruct (const ROCmTeamMember& thread_, const iType& count): + start( 0 ), + end( count ), + increment( 1 ), + thread(thread_) + {} + KOKKOS_INLINE_FUNCTION + TeamThreadRangeBoundariesStruct (const ROCmTeamMember& thread_, const iType& begin_, const iType& end_): + start( begin_ ), + end( end_ ), + increment( 1 ), + thread(thread_) + {} +#endif + }; + template + struct ThreadVectorRangeBoundariesStruct { + typedef iType index_type; + const iType start; + const iType end; + const iType increment; + const ROCmTeamMember& thread; + +#if defined( __HCC_ACCELERATOR__ ) + KOKKOS_INLINE_FUNCTION + ThreadVectorRangeBoundariesStruct (const ROCmTeamMember& thread_, const iType& count): + start( thread_.lindex()%thread_.vector_length() ), + end( count ), + increment( thread_.vector_length() ), + thread(thread_) + {} + +// KOKKOS_INLINE_FUNCTION +// ThreadVectorRangeBoundariesStruct (const iType& count): +// start( 0 ), +// end( count ), +// increment( 1 ) +// {} +#else + KOKKOS_INLINE_FUNCTION + ThreadVectorRangeBoundariesStruct (const ROCmTeamMember& thread_, const iType& count): + start( 0 ), + end( count ), + increment( 1 ), + thread(thread_) + {} + KOKKOS_INLINE_FUNCTION + ThreadVectorRangeBoundariesStruct (const iType& count): + start( 0 ), + end( count ), + increment( 1 ) + {} +#endif + }; + +} +} + +namespace Kokkos { + +template +KOKKOS_INLINE_FUNCTION +Impl::TeamThreadRangeBoundariesStruct + TeamThreadRange(const Impl::ROCmTeamMember& thread, const iType& count) { + return Impl::TeamThreadRangeBoundariesStruct(thread,count); +} + +template +KOKKOS_INLINE_FUNCTION +Impl::TeamThreadRangeBoundariesStruct::type,Impl::ROCmTeamMember> + TeamThreadRange(const Impl::ROCmTeamMember& thread, const iType1& begin, const iType2& end) { + typedef typename std::common_type< iType1, iType2 >::type iType; + return Impl::TeamThreadRangeBoundariesStruct(thread,begin,end); +} + +template +KOKKOS_INLINE_FUNCTION +Impl::ThreadVectorRangeBoundariesStruct + ThreadVectorRange(const Impl::ROCmTeamMember& thread, const iType& count) { + return Impl::ThreadVectorRangeBoundariesStruct(thread,count); +} + +KOKKOS_INLINE_FUNCTION +Impl::ThreadSingleStruct PerTeam(const Impl::ROCmTeamMember& thread) { + return Impl::ThreadSingleStruct(thread); +} + +KOKKOS_INLINE_FUNCTION +Impl::VectorSingleStruct PerThread(const Impl::ROCmTeamMember& thread) { + return Impl::VectorSingleStruct(thread); +} + +template +KOKKOS_INLINE_FUNCTION +void single(const Impl::VectorSingleStruct& single_struct, const FunctorType& lambda) { + if(single_struct.team_member.vector_rank()==0) lambda(); +} + +template +KOKKOS_INLINE_FUNCTION +void single(const Impl::ThreadSingleStruct& single_struct, const FunctorType& lambda) { + if((single_struct.team_member.lindex()==0)) lambda(); +} + +template +KOKKOS_INLINE_FUNCTION +void single(const Impl::VectorSingleStruct& single_struct, const FunctorType& lambda, ValueType& val) { +#if defined(ROCM15) + // 1.5 needs this more proper restriction on which work units run + if( single_struct.team_member.vector_rank()==0) lambda(val); + val = shfl(val,0,single_struct.team_member.vector_length()); +#else + // but older compilers are fine with this (TestTeamVector::Test< Kokkos::Experimental::ROCm >(4)) + lambda(val); +#endif +} + +template +KOKKOS_INLINE_FUNCTION +void single(const Impl::ThreadSingleStruct& single_struct, const FunctorType& lambda, ValueType& val) { + if(single_struct.team_member.lindex()==0) lambda(val); + single_struct.team_member.team_broadcast(val,0); +} + +} + +namespace Kokkos { + + /** \brief Inter-thread parallel_for. Executes lambda(iType i) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all threads of the the calling thread team. + * This functionality requires C++11 support.*/ +template +KOKKOS_INLINE_FUNCTION +void parallel_for(const Impl::TeamThreadRangeBoundariesStruct& loop_boundaries, const Lambda& lambda) { + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) + lambda(i); +} + +/** \brief Inter-thread thread range parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all threads of the the calling thread team and a summation of + * val is performed and put into result. This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ValueType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::TeamThreadRangeBoundariesStruct& loop_boundaries, + const Lambda & lambda, ValueType& result) { + + result = ValueType(); + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + ValueType tmp = ValueType(); + lambda(i,tmp); + result+=tmp; + } + result = loop_boundaries.thread.team_reduce(result, + Impl::JoinAdd()); +// Impl::rocm_intra_workgroup_reduction( loop_boundaries.thread, result, +// Impl::JoinAdd()); +// Impl::rocm_inter_workgroup_reduction( loop_boundaries.thread, result, +// Impl::JoinAdd()); +} + +/** \brief Inter-thread thread range parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all threads of the the calling thread team and a summation of + * val is performed and put into result. This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ReducerType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::TeamThreadRangeBoundariesStruct& loop_boundaries, + const Lambda & lambda, ReducerType const & reducer) { + reducer.init( reducer.reference() ); + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,reducer.reference()); + } + loop_boundaries.thread.team_reduce(reducer); +} + +/** \brief Intra-thread thread range parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes of the the calling thread and a reduction of + * val is performed using JoinType(ValueType& val, const ValueType& update) and put into init_result. + * The input value of init_result is used as initializer for temporary variables of ValueType. Therefore + * the input value should be the neutral element with respect to the join operation (e.g. '0 for +-' or + * '1 for *'). This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ValueType, class JoinType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::TeamThreadRangeBoundariesStruct& loop_boundaries, + const Lambda & lambda, const JoinType& join, ValueType& result) { + +#if defined(ROCM15) + ValueType tmp = result; + // Simpler code works with ROCM1.5 + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,tmp); + } + result = loop_boundaries.thread.team_reduce(tmp,join); +#else + // this workaround freezes up with ROCM1.5, but needed for earlier compilers + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + ValueType tmp = ValueType(); + lambda(i,tmp); + join(result,tmp); + } + result = loop_boundaries.thread.team_reduce(result,join); +#endif +// Impl::rocm_intra_workgroup_reduction( loop_boundaries.thread, result,join); +// Impl::rocm_inter_workgroup_reduction( loop_boundaries.thread, result,join); +} + +} //namespace Kokkos + + +namespace Kokkos { +/** \brief Intra-thread vector parallel_for. Executes lambda(iType i) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes of the the calling thread. + * This functionality requires C++11 support.*/ +template +KOKKOS_INLINE_FUNCTION +void parallel_for(const Impl::ThreadVectorRangeBoundariesStruct& + loop_boundaries, const Lambda& lambda) { + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) + lambda(i); +} + +/** \brief Intra-thread vector parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes of the the calling thread and a summation of + * val is performed and put into result. This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ValueType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::ThreadVectorRangeBoundariesStruct& + loop_boundaries, const Lambda & lambda, ValueType& result) { + result = ValueType(); + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + ValueType tmp = ValueType(); + lambda(i,tmp); + result+=tmp; + } + result = loop_boundaries.thread.thread_reduce(result,Impl::JoinAdd()); +} + +/** \brief Intra-thread vector parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes of the the calling thread and a reduction of + * val is performed using JoinType(ValueType& val, const ValueType& update) and put into init_result. + * The input value of init_result is used as initializer for temporary variables of ValueType. Therefore + * the input value should be the neutral element with respect to the join operation (e.g. '0 for +-' or + * '1 for *'). This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ValueType, class JoinType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::ThreadVectorRangeBoundariesStruct& + loop_boundaries, const Lambda & lambda, const JoinType& join, ValueType& result) { + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,result); + loop_boundaries.thread.team_barrier(); + } + result = loop_boundaries.thread.thread_reduce(result,join); +} + + +/** \brief Intra-thread vector parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes of the the calling thread and a summation of + * val is performed and put into result. This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ReducerType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::ThreadVectorRangeBoundariesStruct& + loop_boundaries, const Lambda & lambda, ReducerType const & reducer) { + reducer.init( reducer.reference() ); + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,reducer.reference()); + } + loop_boundaries.thread.vector_reduce(reducer); +} +/** \brief Intra-thread vector parallel_reduce. Executes lambda(iType i, ValueType & val) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes of the the calling thread and a reduction of + * val is performed using JoinType(ValueType& val, const ValueType& update) and put into init_result. + * The input value of init_result is used as initializer for temporary variables of ValueType. Therefore + * the input value should be the neutral element with respect to the join operation (e.g. '0 for +-' or + * '1 for *'). This functionality requires C++11 support.*/ +template< typename iType, class Lambda, typename ReducerType, class JoinType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce(const Impl::ThreadVectorRangeBoundariesStruct& + loop_boundaries, const Lambda & lambda, const JoinType& join, ReducerType const & reducer) { + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,reducer.reference()); + loop_boundaries.thread.team_barrier(); + } + reducer.reference() = loop_boundaries.thread.thread_reduce(reducer.reference(),join); +} + +/** \brief Intra-thread vector parallel exclusive prefix sum. Executes lambda(iType i, ValueType & val, bool final) + * for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all vector lanes in the thread and a scan operation is performed. + * Depending on the target execution space the operator might be called twice: once with final=false + * and once with final=true. When final==true val contains the prefix sum value. The contribution of this + * "i" needs to be added to val no matter whether final==true or not. In a serial execution + * (i.e. team_size==1) the operator is only called once with final==true. Scan_val will be set + * to the final sum value over all vector lanes. + * This functionality requires C++11 support.*/ +template< typename iType, class FunctorType > +KOKKOS_INLINE_FUNCTION +void parallel_scan(const Impl::ThreadVectorRangeBoundariesStruct& + loop_boundaries, const FunctorType & lambda) { + + typedef Kokkos::Impl::FunctorValueTraits< FunctorType , void > ValueTraits ; + typedef typename ValueTraits::value_type value_type ; + + value_type scan_val = value_type(); +#if (__ROCM_ARCH__ >= 800) +// adopt the cuda vector shuffle method + const int VectorLength = loop_boundaries.increment; + int lid = loop_boundaries.thread.lindex(); + int vector_rank = lid%VectorLength; + + iType loop_bound = ((loop_boundaries.end+VectorLength-1)/VectorLength) * VectorLength; + value_type val ; + for(int _i = vector_rank; _i < loop_bound; _i += VectorLength) { + val = value_type(); + if(_i 1) { + const value_type tmp2 = shfl_up(tmp, 1,VectorLength); + if(vector_rank > 0) + tmp+=tmp2; + } + if(vector_rank == 1) + result_i = tmp; + if (VectorLength > 3) { + const value_type tmp2 = shfl_up(tmp, 2,VectorLength); + if(vector_rank > 1) + tmp+=tmp2; + } + if ((vector_rank >= 2) && + (vector_rank < 4)) + result_i = tmp; + if (VectorLength > 7) { + const value_type tmp2 = shfl_up(tmp, 4,VectorLength); + if(vector_rank > 3) + tmp+=tmp2; + } + if ((vector_rank >= 4) && + (vector_rank < 8)) + result_i = tmp; + if (VectorLength > 15) { + const value_type tmp2 = shfl_up(tmp, 8,VectorLength); + if(vector_rank > 7) + tmp+=tmp2; + } + if ((vector_rank >= 8) && + (vector_rank < 16)) + result_i = tmp; + if (VectorLength > 31) { + const value_type tmp2 = shfl_up(tmp, 16,VectorLength); + if(vector_rank > 15) + tmp+=tmp2; + } + if ((vector_rank >=16) && + (vector_rank < 32)) + result_i = tmp; + if (VectorLength > 63) { + const value_type tmp2 = shfl_up(tmp, 32,VectorLength); + if(vector_rank > 31) + tmp+=tmp2; + } + + if (vector_rank >= 32) + result_i = tmp; + + val = scan_val + result_i - val; + scan_val += shfl(tmp,VectorLength-1,VectorLength); + if(_i + +#include +#include +#include +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace Kokkos { +namespace Impl { + +template +T* reduce_value(T* x, std::true_type) [[hc]] +{ + return x; +} + +template +T& reduce_value(T* x, std::false_type) [[hc]] +{ + return *x; +} + +#if KOKKOS_ROCM_HAS_WORKAROUNDS +struct always_true +{ + template + bool operator()(Ts&&...) const + { + return true; + } +}; +#endif + +template< class Tag, class F, class ReducerType, class Invoker, class T > +void reduce_enqueue( + const int szElements, // size of the extent + const F & f, + const ReducerType& reducer, + Invoker invoke, + T * const output_result, + int const output_length, + const int team_size=64, + const int vector_size=1, + int const shared_size=0) +{ + using namespace hc ; + + typedef Kokkos::Impl::if_c< std::is_same::value, F, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, Tag, void >::type TagFwd; + + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , TagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , TagFwd > ValueInit ; + typedef Kokkos::Impl::FunctorValueJoin< ReducerTypeFwd , TagFwd > ValueJoin ; + typedef Kokkos::Impl::FunctorFinal< ReducerTypeFwd , TagFwd > ValueFinal ; + + typedef typename ValueTraits::pointer_type pointer_type ; + typedef typename ValueTraits::reference_type reference_type ; + + if (output_length < 1) return; + + const auto td = get_tile_desc(szElements,output_length,team_size,vector_size, shared_size); + + // allocate host and device memory for the results from each team + std::vector result_cpu(td.num_tiles*output_length); + hc::array result(td.num_tiles*output_length); + + auto fut = tile_for(td, [=,&result](hc::tiled_index<1> t_idx, tile_buffer buffer) [[hc]] + { + const auto local = t_idx.local[0]; + const auto global = t_idx.global[0]; + const auto tile = t_idx.tile[0]; + + buffer.action_at(local, [&](T* state) + { + ValueInit::init(ReducerConditional::select(f, reducer), state); + invoke(make_rocm_invoke_fn(f), t_idx, td, reduce_value(state, std::is_pointer())); + }); + t_idx.barrier.wait(); + + // Reduce within a tile using multiple threads. +// even though buffer.size is always 64, the value 64 must be hard coded below +// due to a compiler bug +// for(std::size_t s = 1; s < buffer.size(); s *= 2) + for(std::size_t s = 1; s < 64; s *= 2) + { + const std::size_t index = 2 * s * local; +// if (index < buffer.size()) + if (index < 64) + { + buffer.action_at(index, index + s, [&](T* x, T* y) + { + ValueJoin::join(ReducerConditional::select(f, reducer), x, y); + }); + } + t_idx.barrier.wait(); + } + + // Store the tile result in the global memory. + if (local == 0) + { +#if KOKKOS_ROCM_HAS_WORKAROUNDS + // Workaround for assigning from LDS memory: std::copy should work + // directly + buffer.action_at(0, [&](T* x) + { +#if ROCM15 +// new ROCM 15 address space changes aren't implemented in std algorithms yet + auto * src = reinterpret_cast(x); + auto * dest = reinterpret_cast(result.data()+tile*output_length); + for(int i=0; i + +/* only compile this file if ROCM is enabled for Kokkos */ +#if defined( __HCC__ ) && defined( KOKKOS_ENABLE_ROCM ) + +//#include + +#include +#include +#include +#include + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +//---------------------------------------------------------------------------- + +template< typename T > +KOKKOS_INLINE_FUNCTION +void rocm_shfl( T & out , T const & in , int lane , + typename std::enable_if< sizeof(int) == sizeof(T) , int >::type width ) +{ + *reinterpret_cast(&out) = + __shfl( *reinterpret_cast(&in) , lane , width ); +} + +template< typename T > +KOKKOS_INLINE_FUNCTION +void rocm_shfl( T & out , T const & in , int lane , + typename std::enable_if + < ( sizeof(int) < sizeof(T) ) && ( 0 == ( sizeof(T) % sizeof(int) ) ) + , int >::type width ) +{ + enum : int { N = sizeof(T) / sizeof(int) }; + + for ( int i = 0 ; i < N ; ++i ) { + reinterpret_cast(&out)[i] = + __shfl( reinterpret_cast(&in)[i] , lane , width ); + } +} + +//---------------------------------------------------------------------------- + +template< typename T > +KOKKOS_INLINE_FUNCTION +void rocm_shfl_down( T & out , T const & in , int delta , + typename std::enable_if< sizeof(int) == sizeof(T) , int >::type width ) +{ + *reinterpret_cast(&out) = + __shfl_down( *reinterpret_cast(&in) , delta , width ); +} + +template< typename T > +KOKKOS_INLINE_FUNCTION +void rocm_shfl_down( T & out , T const & in , int delta , + typename std::enable_if + < ( sizeof(int) < sizeof(T) ) && ( 0 == ( sizeof(T) % sizeof(int) ) ) + , int >::type width ) +{ + enum : int { N = sizeof(T) / sizeof(int) }; + + for ( int i = 0 ; i < N ; ++i ) { + reinterpret_cast(&out)[i] = + __shfl_down( reinterpret_cast(&in)[i] , delta , width ); + } +} + +//---------------------------------------------------------------------------- + +template< typename T > +KOKKOS_INLINE_FUNCTION +void rocm_shfl_up( T & out , T const & in , int delta , + typename std::enable_if< sizeof(int) == sizeof(T) , int >::type width ) +{ + *reinterpret_cast(&out) = + __shfl_up( *reinterpret_cast(&in) , delta , width ); +} + +template< typename T > +KOKKOS_INLINE_FUNCTION +void rocm_shfl_up( T & out , T const & in , int delta , + typename std::enable_if + < ( sizeof(int) < sizeof(T) ) && ( 0 == ( sizeof(T) % sizeof(int) ) ) + , int >::type width ) +{ + enum : int { N = sizeof(T) / sizeof(int) }; + + for ( int i = 0 ; i < N ; ++i ) { + reinterpret_cast(&out)[i] = + __shfl_up( reinterpret_cast(&in)[i] , delta , width ); + } +} +#if 0 +//---------------------------------------------------------------------------- +/** \brief Reduce within a workgroup over team.vector_length(), the "vector" dimension. + * + * This will be called within a nested, intra-team parallel operation. + * Use shuffle operations to avoid conflicts with shared memory usage. + * + * Requires: + * team.vector_length() is power of 2 + * team.vector_length() <= 32 (one workgroup) + * + * Cannot use "butterfly" pattern because floating point + * addition is non-associative. Therefore, must broadcast + * the final result. + */ +template< class Reducer > +KOKKOS_INLINE_FUNCTION +void rocm_intra_workgroup_vector_reduce( Reducer const & reducer ) +{ + static_assert( + std::is_reference< typename Reducer::reference_type >::value , "" ); + + if ( 1 < team.vector_length() ) { + + typename Reducer::value_type tmp ; + + for ( int i = team.vector_length() ; ( i >>= 1 ) ; ) { + + rocm_shfl_down( tmp , reducer.reference() , i , team.vector_length() ); + + if ( team.vector_rank() < i ) { reducer.join( reducer.data() , & tmp ); } + } + + // Broadcast from root "lane" to all other "lanes" + + rocm_shfl( reducer.reference() , reducer.reference() , 0 , team.vector_length() ); + } +} + +/** \brief Inclusive scan over team.vector_length(), the "vector" dimension. + * + * This will be called within a nested, intra-team parallel operation. + * Use shuffle operations to avoid conflicts with shared memory usage. + * + * Algorithm is concurrent bottom-up reductions in triangular pattern + * where each ROCM thread is the root of a reduction tree from the + * zeroth ROCM thread to itself. + * + * Requires: + * team.vector_length() is power of 2 + * team.vector_length() <= 32 (one workgroup) + */ +template< typename ValueType > +KOKKOS_INLINE_FUNCTION +void rocm_intra_workgroup_vector_inclusive_scan( ValueType & local ) +{ + ValueType tmp ; + + // Bottom up: + // [t] += [t-1] if t >= 1 + // [t] += [t-2] if t >= 2 + // [t] += [t-4] if t >= 4 + // ... + + for ( int i = 1 ; i < team.vector_length() ; i <<= 1 ) { + + rocm_shfl_up( tmp , local , i , team.vector_length() ); + + if ( i <= team.vector_rank() ) { local += tmp ; } + } +} +#endif + +//---------------------------------------------------------------------------- +/* + * Algorithmic constraints: + * (a) threads with same team.team_rank() have same value + * (b) team.vector_length() == power of two + * (c) blockDim.z == 1 + */ + +template< class ValueType , class JoinOp> +KOKKOS_INLINE_FUNCTION +void rocm_intra_workgroup_reduction( const ROCmTeamMember& team, + ValueType& result, + const JoinOp& join) { + + unsigned int shift = 1; + int max_active_thread = team.team_size(); + + //Reduce over values from threads with different team.team_rank() + while(team.vector_length() * shift < 32 ) { + const ValueType tmp = shfl_down(result, team.vector_length()*shift,32u); + //Only join if upper thread is active (this allows non power of two for team.team_size() + if(team.team_rank() + shift < max_active_thread) + join(result , tmp); + shift*=2; + } + + result = shfl(result,0,32); +} + +template< class ValueType , class JoinOp> +KOKKOS_INLINE_FUNCTION +void rocm_inter_workgroup_reduction( const ROCmTeamMember& team, + ValueType& value, + const JoinOp& join) { + + #define STEP_WIDTH 4 + + tile_static ValueType sh_result[256]; + int max_active_thread = team.team_size(); + ValueType* result = (ValueType*) & sh_result; + const unsigned step = 256 / team.vector_length(); + unsigned shift = STEP_WIDTH; + const int id = team.team_rank()%step==0?team.team_rank()/step:65000; + if(id < STEP_WIDTH ) { + result[id] = value; + } + team.team_barrier(); + + while (shift<=max_active_thread/step) { + if(shift<=id && shift+STEP_WIDTH>id && team.vector_rank()==0) { + join(result[id%STEP_WIDTH],value); + } + team.team_barrier(); + shift+=STEP_WIDTH; + } + + + value = result[0]; + for(int i = 1; (i*step +KOKKOS_INLINE_FUNCTION +void rocm_intra_block_reduction( ROCmTeamMember& team, + ValueType& value, + const JoinOp& join, + const int max_active_thread) { + rocm_intra_workgroup_reduction(team,value,join,max_active_thread); + rocm_inter_workgroup_reduction(team,value,join,max_active_thread); +} + +template< class FunctorType , class JoinOp , class ArgTag = void > +KOKKOS_INLINE_FUNCTION +bool rocm_inter_block_reduction( ROCmTeamMember& team, + typename FunctorValueTraits< FunctorType , ArgTag >::reference_type value, + typename FunctorValueTraits< FunctorType , ArgTag >::reference_type neutral, + const JoinOp& join, + ROCm::size_type * const m_scratch_space, + typename FunctorValueTraits< FunctorType , ArgTag >::pointer_type const result, + ROCm::size_type * const m_scratch_flags, + const int max_active_thread) { +#ifdef __ROCM_ARCH__ + typedef typename FunctorValueTraits< FunctorType , ArgTag >::pointer_type pointer_type; + typedef typename FunctorValueTraits< FunctorType , ArgTag >::value_type value_type; + + //Do the intra-block reduction with shfl operations and static shared memory + rocm_intra_block_reduction(value,join,max_active_thread); + + const unsigned id = team.team_rank()*team.vector_length() + team.vector_rank(); + + //One thread in the block writes block result to global scratch_memory + if(id == 0 ) { + pointer_type global = ((pointer_type) m_scratch_space) + blockIdx.x; + *global = value; + } + + //One workgroup of last block performs inter block reduction through loading the block values from global scratch_memory + bool last_block = false; + + team.team_barrier(); + if ( id < 32 ) { + ROCm::size_type count; + + //Figure out whether this is the last block + if(id == 0) + count = Kokkos::atomic_fetch_add(m_scratch_flags,1); + count = Kokkos::shfl(count,0,32); + + //Last block does the inter block reduction + if( count == gridDim.x - 1) { + //set flag back to zero + if(id == 0) + *m_scratch_flags = 0; + last_block = true; + value = neutral; + + pointer_type const volatile global = (pointer_type) m_scratch_space ; + + //Reduce all global values with splitting work over threads in one workgroup + const int step_size = team.vector_length()*team.team_size() < 32 ? team.vector_length()*team.team_size() : 32; + for(int i=id; i 1) { + value_type tmp = Kokkos::shfl_down(value, 1,32); + if( id + 1 < gridDim.x ) + join(value, tmp); + } + if (team.vector_length()*team.team_size() > 2) { + value_type tmp = Kokkos::shfl_down(value, 2,32); + if( id + 2 < gridDim.x ) + join(value, tmp); + } + if (team.vector_length()*team.team_size() > 4) { + value_type tmp = Kokkos::shfl_down(value, 4,32); + if( id + 4 < gridDim.x ) + join(value, tmp); + } + if (team.vector_length()*team.team_size() > 8) { + value_type tmp = Kokkos::shfl_down(value, 8,32); + if( id + 8 < gridDim.x ) + join(value, tmp); + } + if (team.vector_length()*team.team_size() > 16) { + value_type tmp = Kokkos::shfl_down(value, 16,32); + if( id + 16 < gridDim.x ) + join(value, tmp); + } + } + } + + //The last block has in its thread=0 the global reduction value through "value" + return last_block; +#else + return true; +#endif +} +#endif +#if 0 + +//---------------------------------------------------------------------------- +// See section B.17 of ROCm C Programming Guide Version 3.2 +// for discussion of +// __launch_bounds__(maxThreadsPerBlock,minBlocksPerMultiprocessor) +// function qualifier which could be used to improve performance. +//---------------------------------------------------------------------------- +// Maximize shared memory and minimize L1 cache: +// rocmFuncSetCacheConfig(MyKernel, rocmFuncCachePreferShared ); +// For 2.0 capability: 48 KB shared and 16 KB L1 +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +/* + * Algorithmic constraints: + * (a) team.team_size() is a power of two + * (b) team.team_size() <= 512 + * (c) team.vector_length() == blockDim.z == 1 + */ + +template< bool DoScan , class FunctorType , class ArgTag > +KOKKOS_INLINE_FUNCTION +void rocm_intra_block_reduce_scan( const FunctorType & functor , + const typename FunctorValueTraits< FunctorType , ArgTag >::pointer_type base_data ) +{ + typedef FunctorValueTraits< FunctorType , ArgTag > ValueTraits ; + typedef FunctorValueJoin< FunctorType , ArgTag > ValueJoin ; + + typedef typename ValueTraits::pointer_type pointer_type ; + + const unsigned value_count = ValueTraits::value_count( functor ); + const unsigned BlockSizeMask = team.team_size() - 1 ; + + // Must have power of two thread count + + if ( BlockSizeMask & team.team_size() ) { Kokkos::abort("ROCm::rocm_intra_block_scan requires power-of-two blockDim"); } + +#define BLOCK_REDUCE_STEP( R , TD , S ) \ + if ( ! ( R & ((1<<(S+1))-1) ) ) { ValueJoin::join( functor , TD , (TD - (value_count< +KOKKOS_INLINE_FUNCTION +bool rocm_single_inter_block_reduce_scan( const FunctorType & functor , + const ROCm::size_type block_id , + const ROCm::size_type block_count , + ROCm::size_type * const shared_data , + ROCm::size_type * const global_data , + ROCm::size_type * const global_flags ) +{ + typedef ROCm::size_type size_type ; + typedef FunctorValueTraits< FunctorType , ArgTag > ValueTraits ; + typedef FunctorValueJoin< FunctorType , ArgTag > ValueJoin ; + typedef FunctorValueInit< FunctorType , ArgTag > ValueInit ; + typedef FunctorValueOps< FunctorType , ArgTag > ValueOps ; + + typedef typename ValueTraits::pointer_type pointer_type ; + typedef typename ValueTraits::reference_type reference_type ; + typedef typename ValueTraits::value_type value_type ; + + // '__ffs' = position of the least significant bit set to 1. + // 'team.team_size()' is guaranteed to be a power of two so this + // is the integral shift value that can replace an integral divide. + const unsigned BlockSizeShift = __ffs( team.team_size() ) - 1 ; + const unsigned BlockSizeMask = team.team_size() - 1 ; + + // Must have power of two thread count + if ( BlockSizeMask & team.team_size() ) { Kokkos::abort("ROCm::rocm_single_inter_block_reduce_scan requires power-of-two blockDim"); } + + const integral_nonzero_constant< size_type , ValueTraits::StaticValueSize / sizeof(size_type) > + word_count( ValueTraits::value_size( functor ) / sizeof(size_type) ); + + // Reduce the accumulation for the entire block. + rocm_intra_block_reduce_scan( functor , pointer_type(shared_data) ); + + { + // Write accumulation total to global scratch space. + // Accumulation total is the last thread's data. + size_type * const shared = shared_data + word_count.value * BlockSizeMask ; + size_type * const global = global_data + word_count.value * block_id ; + +#if (__ROCM_ARCH__ < 500) + for ( size_type i = team.team_rank() ; i < word_count.value ; i += team.team_size() ) { global[i] = shared[i] ; } +#else + for ( size_type i = 0 ; i < word_count.value ; i += 1 ) { global[i] = shared[i] ; } +#endif + + } + + // Contributing blocks note that their contribution has been completed via an atomic-increment flag + // If this block is not the last block to contribute to this group then the block is done. + team.team_barrier(); + const bool is_last_block = + ! team.team_reduce( team.team_rank() ? 0 : ( 1 + atomicInc( global_flags , block_count - 1 ) < block_count ) ,Impl::JoinAdd()); + + if ( is_last_block ) { + + const size_type b = ( long(block_count) * long(team.team_rank()) ) >> BlockSizeShift ; + const size_type e = ( long(block_count) * long( team.team_rank() + 1 ) ) >> BlockSizeShift ; + + { + void * const shared_ptr = shared_data + word_count.value * team.team_rank() ; + reference_type shared_value = ValueInit::init( functor , shared_ptr ); + + for ( size_type i = b ; i < e ; ++i ) { + ValueJoin::join( functor , shared_ptr , global_data + word_count.value * i ); + } + } + + rocm_intra_block_reduce_scan( functor , pointer_type(shared_data) ); + + if ( DoScan ) { + + size_type * const shared_value = shared_data + word_count.value * ( team.team_rank() ? team.team_rank() - 1 : team.team_size() ); + + if ( ! team.team_rank() ) { ValueInit::init( functor , shared_value ); } + + // Join previous inclusive scan value to each member + for ( size_type i = b ; i < e ; ++i ) { + size_type * const global_value = global_data + word_count.value * i ; + ValueJoin::join( functor , shared_value , global_value ); + ValueOps ::copy( functor , global_value , shared_value ); + } + } + } + + return is_last_block ; +} + +// Size in bytes required for inter block reduce or scan +template< bool DoScan , class FunctorType , class ArgTag > +inline +unsigned rocm_single_inter_block_reduce_scan_shmem( const FunctorType & functor , const unsigned BlockSize ) +{ + return ( BlockSize + 2 ) * Impl::FunctorValueTraits< FunctorType , ArgTag >::value_size( functor ); +} +#endif + +} // namespace Impl +} // namespace Kokkos + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +#endif /* #if defined( __ROCMCC__ ) */ +#endif /* KOKKOS_ROCM_REDUCESCAN_HPP */ + diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Scan.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Scan.hpp new file mode 100644 index 0000000000..c2e85ad112 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Scan.hpp @@ -0,0 +1,157 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Kokkos { +namespace Impl { + +template< class Tag, class F, class TransformIndex> +void scan_enqueue( + const int len, + const F & f, + TransformIndex transform_index) +{ + typedef Kokkos::Impl::FunctorValueTraits< F, Tag> ValueTraits; + typedef Kokkos::Impl::FunctorValueInit< F, Tag> ValueInit; + typedef Kokkos::Impl::FunctorValueJoin< F, Tag> ValueJoin; + typedef Kokkos::Impl::FunctorValueOps< F, Tag> ValueOps; + + typedef typename ValueTraits::value_type value_type; + typedef typename ValueTraits::pointer_type pointer_type; + typedef typename ValueTraits::reference_type reference_type; + + const auto td = get_tile_desc(len); + std::vector result_cpu(td.num_tiles); + hc::array result(td.num_tiles); + hc::array scratch(len); + + tile_for(td, [&,f,len,td](hc::tiled_index<1> t_idx, tile_buffer buffer) [[hc]] + { + const auto local = t_idx.local[0]; + const auto global = t_idx.global[0]; + const auto tile = t_idx.tile[0]; + + // Join tile buffer elements + const auto join = [&](std::size_t i, std::size_t j) + { + buffer.action_at(i, j, [&](value_type& x, const value_type& y) + { + ValueJoin::join(f, &x, &y); + }); + }; + + // Copy into tile + buffer.action_at(local, [&](value_type& state) + { + ValueInit::init(f, &state); + if (global < len) rocm_invoke(f, transform_index(t_idx, td.tile_size, td.num_tiles), state, false); + }); + t_idx.barrier.wait(); + // Up sweep phase + for(std::size_t d=1;d0;d/=2) + { + auto d2 = 2*d; + auto i = local*d2; + if(i1) +// std::partial_sum(result_cpu.data(), result_cpu.data()+(td.num_tiles-1)*sizeof(value_type), result_cpu.data(), make_join_operator(f)); +// use this implementation instead. + for(int i=1; i(len).tile(td.tile_size), [&,f,len,td](hc::tiled_index<1> t_idx) [[hc]] + { +// const auto local = t_idx.local[0]; + const auto global = t_idx.global[0]; + const auto tile = t_idx.tile[0]; + + if (global < len) + { + auto final_state = scratch[global]; + +// the join is locking up, at least with 1.6 + if (tile != 0) final_state += result[tile-1]; +// if (tile != 0) ValueJoin::join(f, &final_state, &result[tile-1]); + rocm_invoke(f, transform_index(t_idx, td.tile_size, td.num_tiles), final_state, true); + } + }).wait(); +} + +} // namespace Impl +} // namespace Kokkos diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Space.cpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Space.cpp new file mode 100644 index 0000000000..e2b6738076 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Space.cpp @@ -0,0 +1,726 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include +#include +#include +#include +#include + +/* only compile this file if ROCM is enabled for Kokkos */ +#ifdef KOKKOS_ENABLE_ROCM + +#include +#include +#include + +#include + +#if defined(KOKKOS_ENABLE_PROFILING) +#include +#endif + + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ +#define ROCM_SAFE_CALL +namespace Kokkos { +namespace Impl { +using namespace hc; + +DeepCopy::DeepCopy( void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + + +DeepCopy::DeepCopy( void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( const Kokkos::Experimental::ROCm & instance , void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( const Kokkos::Experimental::ROCm & instance , void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( const Kokkos::Experimental::ROCm & instance , void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + + + +DeepCopy::DeepCopy( void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + + +DeepCopy::DeepCopy( void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( const Kokkos::Experimental::ROCm & instance , void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( const Kokkos::Experimental::ROCm & instance , void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + +DeepCopy::DeepCopy( const Kokkos::Experimental::ROCm & instance , void * dst , const void * src , size_t n ) +{ + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + av.copy( src , dst , n); +} + + +hc::completion_future DeepCopyAsyncROCm( void * dst , const void * src , size_t n) { + hc::accelerator acc; + hc::accelerator_view av = acc.get_default_view(); + return(av.copy_async( src , dst , n)); +} + +} // namespace Impl +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + + +namespace Kokkos { + +void Experimental::ROCmSpace::access_error() +{ + const std::string msg("Kokkos::Experimental::ROCmSpace::access_error attempt to execute Experimental::ROCm function from non-ROCm space" ); + Kokkos::Impl::throw_runtime_exception( msg ); +} + +void Experimental::ROCmSpace::access_error( const void * const ) +{ + const std::string msg("Kokkos::Experimental::ROCmSpace::access_error attempt to execute Experimental::ROCm function from non-ROCm space" ); + Kokkos::Impl::throw_runtime_exception( msg ); +} + +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Experimental { + +ROCmSpace::ROCmSpace() + : m_device( ROCm().rocm_device() ) +{ +} + +ROCmHostPinnedSpace::ROCmHostPinnedSpace() +{ +} + +void * ROCmSpace::allocate( const size_t arg_alloc_size ) const +{ + void * ptr = Kokkos::Impl::rocm_device_allocate( arg_alloc_size ); + return ptr ; +} + +void * Experimental::ROCmHostPinnedSpace::allocate( const size_t arg_alloc_size ) const +{ + void * ptr = Kokkos::Impl::rocm_hostpinned_allocate( arg_alloc_size ); + return ptr ; +} + +void ROCmSpace::deallocate( void * const arg_alloc_ptr , const size_t /* arg_alloc_size */ ) const +{ + Kokkos::Impl::rocm_device_free(arg_alloc_ptr); +} + +void Experimental::ROCmHostPinnedSpace::deallocate( void * const arg_alloc_ptr , const size_t /* arg_alloc_size */ ) const +{ + Kokkos::Impl::rocm_device_free(arg_alloc_ptr); +} + +} // namespace Experimental +} // namespace Kokkos + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +SharedAllocationRecord< void , void > +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >::s_root_record ; + +SharedAllocationRecord< void , void > +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >::s_root_record ; + + +std::string +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >::get_label() const +{ + SharedAllocationHeader header ; + + Kokkos::Impl::DeepCopy< Kokkos::HostSpace , Kokkos::Experimental::ROCmSpace >( & header , RecordBase::head() , sizeof(SharedAllocationHeader) ); + + return std::string( header.m_label ); +} + +std::string +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >::get_label() const +{ + return std::string( RecordBase::head()->m_label ); +} + +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void > * +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +allocate( const Kokkos::Experimental::ROCmSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + ) +{ + return new SharedAllocationRecord( arg_space , arg_label , arg_alloc_size ); +} + +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void > * +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +allocate( const Kokkos::Experimental::ROCmHostPinnedSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + ) +{ + return new SharedAllocationRecord( arg_space , arg_label , arg_alloc_size ); +} + +void +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +deallocate( SharedAllocationRecord< void , void > * arg_rec ) +{ + delete static_cast(arg_rec); +} + +void +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +deallocate( SharedAllocationRecord< void , void > * arg_rec ) +{ + delete static_cast(arg_rec); +} + +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +~SharedAllocationRecord() +{ + #if defined(KOKKOS_ENABLE_PROFILING) + if(Kokkos::Profiling::profileLibraryLoaded()) { + + SharedAllocationHeader header ; + Kokkos::Impl::DeepCopy( & header , RecordBase::m_alloc_ptr , sizeof(SharedAllocationHeader) ); + + Kokkos::Profiling::deallocateData( + Kokkos::Profiling::SpaceHandle(Kokkos::Experimental::ROCmSpace::name()),header.m_label, + data(),size()); + } + #endif + + m_space.deallocate( SharedAllocationRecord< void , void >::m_alloc_ptr + , SharedAllocationRecord< void , void >::m_alloc_size + ); +} + +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +~SharedAllocationRecord() +{ + #if defined(KOKKOS_ENABLE_PROFILING) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::deallocateData( + Kokkos::Profiling::SpaceHandle(Kokkos::Experimental::ROCmHostPinnedSpace::name()),RecordBase::m_alloc_ptr->m_label, + data(),size()); + } + #endif + + m_space.deallocate( SharedAllocationRecord< void , void >::m_alloc_ptr + , SharedAllocationRecord< void , void >::m_alloc_size + ); +} + +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +SharedAllocationRecord( const Kokkos::Experimental::ROCmSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + , const SharedAllocationRecord< void , void >::function_type arg_dealloc + ) + // Pass through allocated [ SharedAllocationHeader , user_memory ] + // Pass through deallocation function + : SharedAllocationRecord< void , void > + ( & SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >::s_root_record + , reinterpret_cast( arg_space.allocate( sizeof(SharedAllocationHeader) + arg_alloc_size ) ) + , sizeof(SharedAllocationHeader) + arg_alloc_size + , arg_dealloc + ) + , m_space( arg_space ) +{ + #if defined(KOKKOS_ENABLE_PROFILING) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::allocateData(Kokkos::Profiling::SpaceHandle(arg_space.name()),arg_label,data(),arg_alloc_size); + } + #endif + + SharedAllocationHeader header ; + + // Fill in the Header information + header.m_record = static_cast< SharedAllocationRecord< void , void > * >( this ); + + strncpy( header.m_label + , arg_label.c_str() + , SharedAllocationHeader::maximum_label_length + ); + + // Copy to device memory + Kokkos::Impl::DeepCopy( RecordBase::m_alloc_ptr , & header , sizeof(SharedAllocationHeader) ); +} + +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +SharedAllocationRecord( const Kokkos::Experimental::ROCmHostPinnedSpace & arg_space + , const std::string & arg_label + , const size_t arg_alloc_size + , const SharedAllocationRecord< void , void >::function_type arg_dealloc + ) + // Pass through allocated [ SharedAllocationHeader , user_memory ] + // Pass through deallocation function + : SharedAllocationRecord< void , void > + ( & SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >::s_root_record + , reinterpret_cast( arg_space.allocate( sizeof(SharedAllocationHeader) + arg_alloc_size ) ) + , sizeof(SharedAllocationHeader) + arg_alloc_size + , arg_dealloc + ) + , m_space( arg_space ) +{ + #if defined(KOKKOS_ENABLE_PROFILING) + if(Kokkos::Profiling::profileLibraryLoaded()) { + Kokkos::Profiling::allocateData(Kokkos::Profiling::SpaceHandle(arg_space.name()),arg_label,data(),arg_alloc_size); + } + #endif + // Fill in the Header information, directly accessible via host pinned memory + + RecordBase::m_alloc_ptr->m_record = this ; + + strncpy( RecordBase::m_alloc_ptr->m_label + , arg_label.c_str() + , SharedAllocationHeader::maximum_label_length + ); +} + +//---------------------------------------------------------------------------- + +void * SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +allocate_tracked( const Kokkos::Experimental::ROCmSpace & arg_space + , const std::string & arg_alloc_label + , const size_t arg_alloc_size ) +{ + if ( ! arg_alloc_size ) return (void *) 0 ; + + SharedAllocationRecord * const r = + allocate( arg_space , arg_alloc_label , arg_alloc_size ); + + RecordBase::increment( r ); + + return r->data(); +} + +void SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +deallocate_tracked( void * const arg_alloc_ptr ) +{ + if ( arg_alloc_ptr != 0 ) { + SharedAllocationRecord * const r = get_record( arg_alloc_ptr ); + + RecordBase::decrement( r ); + } +} + +void * SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +reallocate_tracked( void * const arg_alloc_ptr + , const size_t arg_alloc_size ) +{ + SharedAllocationRecord * const r_old = get_record( arg_alloc_ptr ); + SharedAllocationRecord * const r_new = allocate( r_old->m_space , r_old->get_label() , arg_alloc_size ); + + Kokkos::Impl::DeepCopy( r_new->data() , r_old->data() + , std::min( r_old->size() , r_new->size() ) ); + + RecordBase::increment( r_new ); + RecordBase::decrement( r_old ); + + return r_new->data(); +} + +#if 0 +void * SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +allocate_tracked( const Kokkos::Experimental::ROCmHostPinnedSpace & arg_space + , const std::string & arg_alloc_label + , const size_t arg_alloc_size ) +{ + if ( ! arg_alloc_size ) return (void *) 0 ; + + SharedAllocationRecord * const r = + allocate( arg_space , arg_alloc_label , arg_alloc_size ); + + RecordBase::increment( r ); + + return r->data(); +} + +void SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +deallocate_tracked( void * const arg_alloc_ptr ) +{ + if ( arg_alloc_ptr != 0 ) { + SharedAllocationRecord * const r = get_record( arg_alloc_ptr ); + + RecordBase::decrement( r ); + } +} + +void * SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +reallocate_tracked( void * const arg_alloc_ptr + , const size_t arg_alloc_size ) +{ + SharedAllocationRecord * const r_old = get_record( arg_alloc_ptr ); + SharedAllocationRecord * const r_new = allocate( r_old->m_space , r_old->get_label() , arg_alloc_size ); + + Kokkos::Impl::DeepCopy( r_new->data() , r_old->data() + , std::min( r_old->size() , r_new->size() ) ); + + RecordBase::increment( r_new ); + RecordBase::decrement( r_old ); + + return r_new->data(); +} +#endif + +//---------------------------------------------------------------------------- + +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void > * +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >::get_record( void * alloc_ptr ) +{ + using Header = SharedAllocationHeader ; + using RecordBase = SharedAllocationRecord< void , void > ; + using RecordROCm = SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void > ; + +#if 0 + // Copy the header from the allocation + Header head ; + + Header const * const head_rocm = alloc_ptr ? Header::get_header( alloc_ptr ) : (Header*) 0 ; + + if ( alloc_ptr ) { + Kokkos::Impl::DeepCopy( & head , head_rocm , sizeof(SharedAllocationHeader) ); + } + + RecordROCm * const record = alloc_ptr ? static_cast< RecordROCm * >( head.m_record ) : (RecordROCm *) 0 ; + + if ( ! alloc_ptr || record->m_alloc_ptr != head_rocm ) { + Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >::get_record ERROR" ) ); + } + +#else + + // Iterate the list to search for the record among all allocations + // requires obtaining the root of the list and then locking the list. + + RecordROCm * const record = static_cast< RecordROCm * >( RecordBase::find( & s_root_record , alloc_ptr ) ); + + if ( record == 0 ) { + Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >::get_record ERROR" ) ); + } + +#endif + + return record ; +} + +#if 0 +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void > * +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >::get_record( void * alloc_ptr ) +{ + using Header = SharedAllocationHeader ; + using RecordROCm = SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void > ; + + Header * const h = alloc_ptr ? reinterpret_cast< Header * >( alloc_ptr ) - 1 : (Header *) 0 ; + + if ( ! alloc_ptr || h->m_record->m_alloc_ptr != h ) { + Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >::get_record ERROR" ) ); + } + + return static_cast< RecordROCm * >( h->m_record ); +} +#endif + +// Iterate records to print orphaned memory ... +void +SharedAllocationRecord< Kokkos::Experimental::ROCmSpace , void >:: +print_records( std::ostream & s , const Kokkos::Experimental::ROCmSpace & space , bool detail ) +{ + SharedAllocationRecord< void , void > * r = & s_root_record ; + + char buffer[256] ; + + SharedAllocationHeader head ; + + if ( detail ) { + do { + if ( r->m_alloc_ptr ) { + Kokkos::Impl::DeepCopy( & head , r->m_alloc_ptr , sizeof(SharedAllocationHeader) ); + } + else { + head.m_label[0] = 0 ; + } + + //Formatting dependent on sizeof(uintptr_t) + const char * format_string; + + if (sizeof(uintptr_t) == sizeof(unsigned long)) { + format_string = "ROCm addr( 0x%.12lx ) list( 0x%.12lx 0x%.12lx ) extent[ 0x%.12lx + %.8ld ] count(%d) dealloc(0x%.12lx) %s\n"; + } + else if (sizeof(uintptr_t) == sizeof(unsigned long long)) { + format_string = "ROCm addr( 0x%.12llx ) list( 0x%.12llx 0x%.12llx ) extent[ 0x%.12llx + %.8ld ] count(%d) dealloc(0x%.12llx) %s\n"; + } + + snprintf( buffer , 256 + , format_string + , reinterpret_cast( r ) + , reinterpret_cast( r->m_prev ) + , reinterpret_cast( r->m_next ) + , reinterpret_cast( r->m_alloc_ptr ) + , r->m_alloc_size + , r->m_count + , reinterpret_cast( r->m_dealloc ) + , head.m_label + ); + std::cout << buffer ; + r = r->m_next ; + } while ( r != & s_root_record ); + } + else { + do { + if ( r->m_alloc_ptr ) { + + Kokkos::Impl::DeepCopy( & head , r->m_alloc_ptr , sizeof(SharedAllocationHeader) ); + + //Formatting dependent on sizeof(uintptr_t) + const char * format_string; + + if (sizeof(uintptr_t) == sizeof(unsigned long)) { + format_string = "ROCm [ 0x%.12lx + %ld ] %s\n"; + } + else if (sizeof(uintptr_t) == sizeof(unsigned long long)) { + format_string = "ROCm [ 0x%.12llx + %ld ] %s\n"; + } + + snprintf( buffer , 256 + , format_string + , reinterpret_cast< uintptr_t >( r->data() ) + , r->size() + , head.m_label + ); + } + else { + snprintf( buffer , 256 , "ROCm [ 0 + 0 ]\n" ); + } + std::cout << buffer ; + r = r->m_next ; + } while ( r != & s_root_record ); + } +} +#if 0 +void +SharedAllocationRecord< Kokkos::Experimental::ROCmHostPinnedSpace , void >:: +print_records( std::ostream & s , const Kokkos::Experimental::ROCmHostPinnedSpace & space , bool detail ) +{ + SharedAllocationRecord< void , void >::print_host_accessible_records( s , "ROCmHostPinned" , & s_root_record , detail ); +} +#endif + +} // namespace Impl +} // namespace Kokkos + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ +namespace Kokkos { +namespace { +#if 0 + KOKKOS_INLINE_FUNCTION void init_lock_array_kernel_atomic() { + unsigned i = tindex()*team_size() + lindex(); + + if(i>>(); + init_lock_array_kernel_scratch_threadid<<<(Kokkos::Experimental::ROCm::concurrency()+255)/256,256>>>(Kokkos::Experimental::ROCm::concurrency()); + } +} +#endif + +void* rocm_resize_scratch_space(size_t bytes, bool force_shrink) { + static void* ptr = NULL; + static size_t current_size = 0; + if(current_size == 0) { + current_size = bytes; + ptr = Kokkos::kokkos_malloc("ROCmSpace::ScratchMemory",current_size); + } + if(bytes > current_size) { + current_size = bytes; + ptr = Kokkos::kokkos_realloc(ptr,current_size); + } + if((bytes < current_size) && (force_shrink)) { + current_size = bytes; + Kokkos::kokkos_free(ptr); + ptr = Kokkos::kokkos_malloc("ROCmSpace::ScratchMemory",current_size); + } + return ptr; +} + +} +} + +#endif // KOKKOS_ENABLE_ROCM + diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.cpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.cpp new file mode 100644 index 0000000000..317995c4f4 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.cpp @@ -0,0 +1,174 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#if defined( KOKKOS_ENABLE_ROCM ) && defined( KOKKOS_ENABLE_TASKDAG ) + +#include + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +template class TaskQueue< Kokkos::Experimental::ROCm > ; + + +//---------------------------------------------------------------------------- +KOKKOS_INLINE_FUNCTION +void TaskQueueSpecialization< Kokkos::Experimental::ROCm >::driver + ( TaskQueueSpecialization< Kokkos::Experimental::ROCm >::queue_type * const queue, + hc::tiled_index<3> threadIdx ) +{ + using Member = TaskExec< Kokkos::Experimental::ROCm > ; + using Queue = TaskQueue< Kokkos::Experimental::ROCm > ; + using task_root_type = TaskBase< void , void , void > ; + + task_root_type * const end = (task_root_type *) task_root_type::EndTag ; + + Member single_exec( 1, threadIdx ); + Member team_exec( threadIdx.tile_dim[0], threadIdx ); + + const int wavefront_lane = threadIdx.local[0] + threadIdx.local[1]* threadIdx.tile_dim[0] ; + + union { + task_root_type * ptr ; + int raw[2] ; + } task ; + + // Loop until all queues are empty and no tasks in flight + + do { + + // Each team lead attempts to acquire either a thread team task + // or collection of single thread tasks for the team. + + if ( 0 == wavefront_lane ) { + + task.ptr = 0 < *((volatile int *) & queue->m_ready_count) ? end : 0 ; + + // Loop by priority and then type + for ( int i = 0 ; i < Queue::NumQueue && end == task.ptr ; ++i ) { + for ( int j = 0 ; j < 2 && end == task.ptr ; ++j ) { + task.ptr = Queue::pop_ready_task( & queue->m_ready[i][j] ); + } + } + +#if 0 +printf("TaskQueue::driver(%d,%d) task(%lx)\n",threadIdx.z,blockIdx.x + , uintptr_t(task.ptr)); +#endif + + } + + // shuffle broadcast + + task.raw[0] = hc::__shfl( task.raw[0] , 0 ); + task.raw[1] = hc::__shfl( task.raw[1] , 0 ); + + if ( 0 == task.ptr ) break ; // 0 == queue->m_ready_count + + if ( end != task.ptr ) { + if ( task_root_type::TaskTeam == task.ptr->m_task_type ) { + // Thread Team Task + (*task.ptr->m_apply)( task.ptr , & team_exec ); + } + else if ( 0 == threadIdx.local[1] ) { + // Single Thread Task + (*task.ptr->m_apply)( task.ptr , & single_exec ); + } + + if ( 0 == wavefront_lane ) { + queue->complete( task.ptr ); + } + } + } while(1); +} +#if 0 +namespace { +KOKKOS_INLINE_FUNCTION +void rocm_task_queue_execute( TaskQueue< Kokkos::Experimental::ROCm > * queue, + hc::tiled_index<3> threadIdx ) +{ TaskQueueSpecialization< Kokkos::Experimental::ROCm >::driver( queue, threadIdx ); } + +} +#endif +void TaskQueueSpecialization< Kokkos::Experimental::ROCm >::execute + ( TaskQueue< Kokkos::Experimental::ROCm > * const queue ) +{ + const int workgroups_per_wavefront = 4 ; + const int wavefront_size = Kokkos::Impl::ROCmTraits::WavefrontSize ; + const int cu_count = Kokkos::Impl::rocm_internal_cu_count(); +// const dim3 grid( Kokkos::Impl::rocm_internal_cu_count() , 1 , 1 ); +// const dim3 block( 1 , Kokkos::Impl::ROCmTraits::WorkGroupSize , workgroups_per_wavefront ); + + + + // Query the stack size, in bytes: + // If not large enough then set the stack size, in bytes: + +// adapted from the cuda code. TODO: Not at all sure that this is the proper +// to map the cuda grid/blocks/3D tiling to HCC +#if 0 + hc::extent< 3 > flat_extent( cu_count, + wavefront_size, workgroups_per_wavefront ); + hc::tiled_extent< 3 > team_extent = flat_extent.tile(1, + wavefront_size,workgroups_per_wavefront); + + hc::parallel_for_each( team_extent , [&](hc::tiled_index<3> idx) [[hc]] + { + TaskQueueSpecialization< Kokkos::Experimental::ROCm >::driver( queue,idx ); + }).wait(); +#endif +} + + +}} /* namespace Kokkos::Impl */ + +//---------------------------------------------------------------------------- + +#endif /* #if defined( KOKKOS_ENABLE_ROCM ) && defined( KOKKOS_ENABLE_TASKDAG ) */ + + diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.hpp new file mode 100644 index 0000000000..16badcc1d4 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.hpp @@ -0,0 +1,458 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_IMPL_ROCM_TASK_HPP +#define KOKKOS_IMPL_ROCM_TASK_HPP + +#if defined( KOKKOS_ENABLE_TASKDAG ) + +#include + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +template< class > class TaskExec ; + +template<> +class TaskQueueSpecialization< Kokkos::Experimental::ROCm > +{ +public: + + using execution_space = Kokkos::Experimental::ROCm ; + using queue_type = Kokkos::Impl::TaskQueue< execution_space > ; + using task_base_type = Kokkos::Impl::TaskBase< execution_space , void , void > ; + using member_type = TaskExec< execution_space > ; + + // Must specify memory space + using memory_space = Kokkos::HostSpace ; + + static + void iff_single_thread_recursive_execute( queue_type * const ) {} + + KOKKOS_INLINE_FUNCTION + static void driver( queue_type * const, hc::tiled_index<3> ); + + // Must provide task queue execution function + static void execute( queue_type * const ); + + // Must provide mechanism to set function pointer in + // execution space from the host process. + template< typename FunctorType > + static + void proc_set_apply( typename TaskBase< Kokkos::Experimental::ROCm + , typename FunctorType::value_type + , FunctorType + >::function_type * ptr ) + { + using TaskType = TaskBase< Kokkos::Experimental::ROCm + , typename FunctorType::value_type + , FunctorType + > ; + hc::extent< 1 > flat_extent( 1 ); + hc::tiled_extent< 1 > team_extent = flat_extent.tile( 1); + + hc::parallel_for_each( team_extent , [&](hc::tiled_index<1> idx) [[hc]] + { + *ptr = TaskType::apply ; + }).wait(); + } +}; + +/*template<> +KOKKOS_FUNCTION +void TaskQueue::decrement( typename TaskQueue::task_root_type * +) {} +*/ +extern template class TaskQueue< Kokkos::Experimental::ROCm > ; + +//---------------------------------------------------------------------------- +/**\brief Impl::TaskExec is the TaskScheduler::member_type + * passed to tasks running in a ROCm space. + * + * ROCm thread blocks for tasking are dimensioned: + * idx.tile_dim[0] == vector length + * idx.tile_dim[1] == team size + * idx.tile_dim[2] == number of teams + * where + * idx.tile_dim[0] * idx.tile_dim[1] == WavefrontSize + * + * Both single thread and thread team tasks are run by a full ROCm warp. + * A single thread task is called by warp lane #0 and the remaining + * lanes of the warp are idle. + */ +template<> +class TaskExec< Kokkos::Experimental::ROCm > +{ +private: + + TaskExec( TaskExec && ) = delete ; + TaskExec( TaskExec const & ) = delete ; + TaskExec & operator = ( TaskExec && ) = delete ; + TaskExec & operator = ( TaskExec const & ) = delete ; + + + friend class Kokkos::Impl::TaskQueue< Kokkos::Experimental::ROCm > ; + friend class Kokkos::Impl::TaskQueueSpecialization< Kokkos::Experimental::ROCm > ; + + int m_team_size ; + hc::tiled_index<3> m_idx; + +// KOKKOS_INLINE_FUNCTION TaskExec( int arg_team_size ) //TODO: tile_dim[0] +// : m_team_size( arg_team_size ) {} + + KOKKOS_INLINE_FUNCTION TaskExec( int arg_team_size, + hc::tiled_index<3> tidx) + : m_team_size( arg_team_size), + m_idx( tidx ) {} + +public: +// const auto local = t_idx.local[0]; +// const auto global = t_idx.global[0]; +// const auto tile = t_idx.tile[0]; + + hc::tiled_index<3> idx() const { return m_idx;} + +#if defined( __HCC_ACCELERATOR__ ) + KOKKOS_INLINE_FUNCTION void team_barrier() { /* __threadfence_block(); */ } + KOKKOS_INLINE_FUNCTION int team_rank() const { return m_idx.local[1] ; } // t_idx.tile[0]; + KOKKOS_INLINE_FUNCTION int team_size() const { return m_team_size ; } +#else + KOKKOS_INLINE_FUNCTION void team_barrier() {} + KOKKOS_INLINE_FUNCTION int team_rank() const { return 0 ; } + KOKKOS_INLINE_FUNCTION int team_size() const { return 0 ; } +#endif +}; + +}} /* namespace Kokkos::Impl */ + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +namespace Kokkos { + +template +KOKKOS_INLINE_FUNCTION +Impl::TeamThreadRangeBoundariesStruct > +TeamThreadRange + ( Impl::TaskExec< Kokkos::Experimental::ROCm > & thread, const iType & count ) +{ + return Impl::TeamThreadRangeBoundariesStruct >(thread,count); +} + +template +KOKKOS_INLINE_FUNCTION +Impl::TeamThreadRangeBoundariesStruct< typename std::common_type< iType1, iType2 >::type, + Impl::TaskExec< Kokkos::Experimental::ROCm > > +TeamThreadRange + ( Impl:: TaskExec< Kokkos::Experimental::ROCm > & thread, const iType1 & begin, const iType2 & end ) +{ + typedef typename std::common_type::type iType; + return Impl::TeamThreadRangeBoundariesStruct >(thread, begin, end); +} + +template +KOKKOS_INLINE_FUNCTION +Impl::ThreadVectorRangeBoundariesStruct > +ThreadVectorRange + ( Impl::TaskExec< Kokkos::Experimental::ROCm > & thread + , const iType & count ) +{ + return Impl::ThreadVectorRangeBoundariesStruct >(thread,count); +} + +/** \brief Inter-thread parallel_for. Executes lambda(iType i) for each i=0..N-1. + * + * The range i=0..N-1 is mapped to all threads of the the calling thread team. + * This functionality requires C++11 support. +*/ +template +KOKKOS_INLINE_FUNCTION +void parallel_for + ( const Impl::TeamThreadRangeBoundariesStruct >& loop_boundaries + , const Lambda& lambda + ) +{ + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i); + } +} + +// reduce across corresponding lanes between team members within workgroup +// assume stride*team_size == workgroup_size +template< typename ValueType > +KOKKOS_INLINE_FUNCTION +void strided_shfl_workgroup_reduction + (const ValueType& f(), + ValueType& val, + int team_size, + int stride) +{ + for (int lane_delta=(team_size*stride)>>1; lane_delta>=stride; lane_delta>>=1) { + f(val, Kokkos::shfl_down(val, lane_delta, team_size*stride)); + } +} + +template< typename ValueType, class JoinType > +KOKKOS_INLINE_FUNCTION +void strided_shfl_workgroup_reduction + (const JoinType& join, + ValueType& val, + int team_size, + int stride) +{ + for (int lane_delta=(team_size*stride)>>1; lane_delta>=stride; lane_delta>>=1) { + join(val, shfl_down(val, lane_delta, team_size*stride)); + } +} + +// multiple within-workgroup non-strided reductions +template< typename ValueType, class JoinType > +KOKKOS_INLINE_FUNCTION +void multi_shfl_workgroup_reduction + (const JoinType& join, + ValueType& val, + int vec_length) +{ + for (int lane_delta=vec_length>>1; lane_delta; lane_delta>>=1) { + join(val, shfl_down(val, lane_delta, vec_length)); + } +} + +// broadcast within workgroup +template< class ValueType > +KOKKOS_INLINE_FUNCTION +ValueType shfl_workgroup_broadcast + (ValueType& val, + int src_lane, + int width) +{ + return shfl(val, src_lane, width); +} + +// all-reduce across corresponding vector lanes between team members within workgroup +// assume vec_length*team_size == workgroup_size +// blockDim.x == vec_length == stride +// blockDim.y == team_size +// threadIdx.x == position in vec +// threadIdx.y == member number + +template +KOKKOS_INLINE_FUNCTION +void parallel_reduce + ( const Impl::TeamThreadRangeBoundariesStruct >& loop_boundaries + , const Lambda& lambda + , ValueType& initialized_result) +{ + int team_rank = loop_boundaries.thread.team_rank(); // member num within the team + ValueType result = initialized_result; + hc::tiled_index<3> idx = loop_boundaries.thread.idx(); + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i, result); + } + initialized_result = result; + + strided_shfl_workgroup_reduction( + [&] (ValueType& val1, const ValueType& val2) { val1 += val2; }, + initialized_result, + loop_boundaries.thread.team_size(), + idx.tile_dim[0]); + initialized_result = shfl_workgroup_broadcast( initialized_result, idx.local[0], Impl::ROCmTraits::WavefrontSize ); + +} + +template< typename iType, class Lambda, typename ValueType, class JoinType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce + (const Impl::TeamThreadRangeBoundariesStruct >& loop_boundaries, + const Lambda & lambda, + const JoinType & join, + ValueType& initialized_result) +{ + hc::tiled_index<3> idx = loop_boundaries.thread.idx(); + int team_rank = loop_boundaries.thread.team_rank(); // member num within the team + ValueType result = initialized_result; + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i, result); + } + + strided_shfl_workgroup_reduction( + join, + initialized_result, + loop_boundaries.thread.team_size(), + idx.tile_dim[0]); + initialized_result = shfl_workgroup_broadcast( initialized_result, idx.local[0], Impl::ROCmTraits::WavefrontSize ); +} + +// placeholder for future function +template< typename iType, class Lambda, typename ValueType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce + (const Impl::ThreadVectorRangeBoundariesStruct >& loop_boundaries, + const Lambda & lambda, + ValueType& initialized_result) +{ + ValueType result = initialized_result; + hc::tiled_index<3> idx = loop_boundaries.thread.idx(); + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,result); + } + + initialized_result = result; + + //initialized_result = multi_shfl_workgroup_reduction( + multi_shfl_workgroup_reduction( + [&] (ValueType& val1, const ValueType& val2) { val1 += val2; }, + initialized_result, + idx.tile_dim[0]); + initialized_result = shfl_workgroup_broadcast( initialized_result, 0, idx.tile_dim[0] ); +} + +// placeholder for future function +template< typename iType, class Lambda, typename ValueType, class JoinType > +KOKKOS_INLINE_FUNCTION +void parallel_reduce + (const Impl::ThreadVectorRangeBoundariesStruct >& loop_boundaries, + const Lambda & lambda, + const JoinType & join, + ValueType& initialized_result) +{ + hc::tiled_index<3> idx = loop_boundaries.thread.idx(); + ValueType result = initialized_result; + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + lambda(i,result); + } + initialized_result = result; + + multi_shfl_workgroup_reduction(join, initialized_result, idx.tile_dim[0]); + initialized_result = shfl_workgroup_broadcast( initialized_result, 0, idx.tile_dim[0] ); +} + +template< typename ValueType, typename iType, class Lambda > +KOKKOS_INLINE_FUNCTION +void parallel_scan + (const Impl::TeamThreadRangeBoundariesStruct >& loop_boundaries, + const Lambda & lambda) +{ + hc::tiled_index<3> idx = loop_boundaries.thread.idx(); + ValueType accum = 0 ; + ValueType val, y, local_total; + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + val = 0; + lambda(i,val,false); + + // intra-idx.tile_dim[0] exclusive scan on 'val' + // accum = accumulated, sum in total for this iteration + + // INCLUSIVE scan + for( int offset = idx.tile_dim[0] ; offset < Impl::ROCmTraits::WavefrontSize ; offset <<= 1 ) { + y = shfl_up(val, offset, Impl::ROCmTraits::WavefrontSize); + if(idx.local[1]*idx.tile_dim[0] >= offset) { val += y; } + } + + // pass accum to all threads + local_total = shfl_workgroup_broadcast(val, + idx.local[0]+Impl::ROCmTraits::WavefrontSize-idx.tile_dim[0], + Impl::ROCmTraits::WavefrontSize); + + // make EXCLUSIVE scan by shifting values over one + val = shfl_up(val, idx.tile_dim[0], Impl::ROCmTraits::WavefrontSize); + if ( idx.local[1] == 0 ) { val = 0 ; } + + val += accum; + lambda(i,val,true); + accum += local_total; + } +} + +// placeholder for future function +template< typename iType, class Lambda, typename ValueType > +KOKKOS_INLINE_FUNCTION +void parallel_scan + (const Impl::ThreadVectorRangeBoundariesStruct >& loop_boundaries, + const Lambda & lambda) +{ + hc::tiled_index<3> idx = loop_boundaries.thread.idx(); + ValueType accum = 0 ; + ValueType val, y, local_total; + + for( iType i = loop_boundaries.start; i < loop_boundaries.end; i+=loop_boundaries.increment) { + val = 0; + lambda(i,val,false); + + // intra-idx.tile_dim[0] exclusive scan on 'val' + // accum = accumulated, sum in total for this iteration + + // INCLUSIVE scan + for( int offset = 1 ; offset < idx.tile_dim[0] ; offset <<= 1 ) { + y = shfl_up(val, offset, idx.tile_dim[0]); + if(idx.local[0] >= offset) { val += y; } + } + + // pass accum to all threads + local_total = shfl_workgroup_broadcast(val, idx.tile_dim[0]-1, + idx.tile_dim[0]); + + // make EXCLUSIVE scan by shifting values over one + val = shfl_up(val, 1, idx.tile_dim[0]); + if ( idx.local[0] == 0 ) { val = 0 ; } + + val += accum; + lambda(i,val,true); + accum += local_total; + } +} + + +} /* namespace Kokkos */ +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +#endif /* #if defined( KOKKOS_ENABLE_TASKDAG ) */ +#endif /* #ifndef KOKKOS_IMPL_ROCM_TASK_HPP */ + diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Tile.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Tile.hpp new file mode 100644 index 0000000000..e1a89e3794 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Tile.hpp @@ -0,0 +1,518 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include +#include +#include + +#if !defined( KOKKOS_ROCM_TILE_H ) +#define KOKKOS_ROCM_TILE_H + +// Macro to abstract out the enable_if craziness +#define KOKKOS_ROCM_REQUIRES(...) \ + bool KokkosROCmRequiresBool ## __LINE__ = true, typename std::enable_if::type = 0 + +// This number uniquely identifies the 1.5 release build. +#if __hcc_workweek__ > 17160 +#define ROCM15 1 +#endif + +namespace Kokkos { +namespace Impl { + +template + +#if defined(ROCM15) +using lds_t = T; +#else +// prior to 1.5, needed to decorate LDS addresses +using lds_t = __attribute__((address_space(3))) T; +#endif + +#define KOKKOS_ROCM_TILE_RESTRIC_CPU restrict(cpu, amp) + +// a set of routines to the replace the std::routines +// that will operate on address space 3 types + +#if defined(ROCM15) +// 1.5 can't use std::copy et al for LDS access, so we define our own +// set of routines +template +void rcopy(I first, I last, O out) [[hc]] +{ + while (first != last) *out++ = *first++; +} +template +void rfor_each(I first, I last, F f) [[hc]] +{ + for(;first!=last;++first) f(*first); +} + +template +void rtransform(I first, I last, O out, F f) [[hc]] +{ + while(first!=last) *out++ = f(*first++); +} +#endif + + +inline std::size_t get_max_tile_size() KOKKOS_ROCM_TILE_RESTRIC_CPU +{ + return hc::accelerator().get_max_tile_static_size() - 1024; +} + +inline std::size_t get_max_tile_thread() KOKKOS_ROCM_TILE_RESTRIC_CPU +{ + return 64; +} + +inline int next_pow_2(int x) restrict(cpu, amp) +{ + --x; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return x+1; +} + +template +inline std::size_t get_tile_size(std::size_t n = 1, + std::size_t team = 64, + std::size_t vector = 1) + KOKKOS_ROCM_TILE_RESTRIC_CPU +{ + const auto size = sizeof(T) * n; + const auto group_size = get_max_tile_size(); + if (size == 0 || size > group_size) return 0; + // Assume that thread size is a power of 2 + auto thread_size = std::min(team*vector,4*get_max_tile_thread()); + // ensure that we have enough tile static memory to keep + // threadsize * size elements for reductions + while(size > (group_size / thread_size) && thread_size > 2) +{ thread_size /= 2; +} + return thread_size; +} + +template +struct array_view +{ + T* x; + std::size_t n; + + array_view(T* xp, std::size_t np) [[hc]] [[cpu]] + : x(xp), n(np) + {} + + array_view(T* xp, T* yp) [[hc]] [[cpu]] + : x(xp), n(yp-xp) + {} + + T& operator[](std::size_t i) const [[hc]] [[cpu]] + { + return x[i]; + } + + std::size_t size() const [[hc]] [[cpu]] + { + return this->n; + } + + T* data() const [[hc]] [[cpu]] + { + return x; + } + + T* begin() const [[hc]] [[cpu]] + { + return x; + } + + T* end() const [[hc]] [[cpu]] + { + return x+this->size(); + } +}; + +template +struct rocm_char +{ using type=char; }; + +template +struct rocm_char +: std::add_const::type> +{}; +#if !defined(ROCM15) +// earlier compilers required explicit address space decorations +template +struct rocm_char<__attribute__((address_space(3))) T> +{ using type = __attribute__((address_space(3))) typename rocm_char::type; }; + +template +struct rocm_char +{ using type = const __attribute__((address_space(3))) typename rocm_char::type; }; +#endif + +template::type> +Char* rocm_byte_cast(T& x) restrict(cpu, amp) +{ + return reinterpret_cast(&x); +} + +template +void rocm_raw_assign(T& x, const U& y) restrict(cpu, amp) +{ + auto * src = rocm_byte_cast(y); + auto * dest = rocm_byte_cast(x); +#if defined (ROCM15) + rcopy(src, src+sizeof(T), dest); +#else + std::copy(src, src+sizeof(T), dest); +#endif +} + +template +void rocm_assign_impl(T& x, const U& y, std::true_type) restrict(cpu, amp) +{ + rocm_raw_assign(x, y); +} + +template +void rocm_assign_impl(T& x, const U& y, std::false_type) restrict(cpu, amp) +{ + x = y; +} + +// Workaround for assigning in and out of LDS memory +template +void rocm_assign(T& x, const U& y) restrict(cpu, amp) +{ + rocm_assign_impl(x, y, std::integral_constant()); +} + +// Compute the address space of tile +template +struct tile_type +{ +#if defined (ROCM15) + typedef T type; +#else + typedef __attribute__((address_space(3))) T type; +#endif +}; + +#if !defined (ROCM15) +template +void lds_for(__attribute__((address_space(3))) T& value, Body b) [[hc]] +{ + T state = value; + b(state); + value = state; +} +#endif + +template +void lds_for(T& value, Body b) [[hc]] +{ + b(value); +} + + +constexpr std::size_t get_max_tile_array_size() +{ + return 24; +} + +template +struct single_action +{ + template + void action_at(std::size_t i, Action a) [[hc]] + { + auto& value = static_cast(*this)[i]; +#if KOKKOS_ROCM_HAS_WORKAROUNDS + T state = value; + a(state); + value = state; +#else + a(value); +#endif + } + + template + void action_at(std::size_t i, std::size_t j, Action a) [[hc]] + { + static_cast(*this).action_at(i, [&](T& x) + { + static_cast(*this).action_at(j, [&](T& y) + { + a(x, y); + }); + }); + } +}; + +template +struct tile_buffer +: array_view::type>, single_action, T> +{ + typedef typename tile_type::type element_type; + typedef array_view base; + + using base::base; + + tile_buffer(element_type* xp, std::size_t np, std::size_t) [[hc]] [[cpu]] + : base(xp, np) + {} + + tile_buffer(T* xp, T* yp, std::size_t) [[hc]] [[cpu]] + : base(xp, yp) + {} +}; + +template +struct tile_buffer +{ + typedef typename tile_type::type element_type; + typedef typename tile_type::type tchar_type; + element_type* element_data; + std::size_t n, m; + + tile_buffer(element_type* xp, std::size_t np, std::size_t mp) [[hc]] [[cpu]] + : element_data(xp), n(np), m(mp) + {} + + tile_buffer(element_type* xp, element_type* yp, std::size_t mp) [[hc]] [[cpu]] + : element_data(xp), n(yp-xp), m(mp) + {} + + element_type* operator[](std::size_t i) const [[hc]] [[cpu]] + { + return element_data+i*m; + } + + template + typename Impl::enable_if< (sizeof(Q) <= 8) , void >::type + action_at(std::size_t i, Action a) [[hc]] + { + element_type* value = (*this)[i]; +#if defined (ROCM15) + a(value); +#else +#if KOKKOS_ROCM_HAS_WORKAROUNDS + if (m > get_max_tile_array_size()) return; + T state[get_max_tile_array_size()]; + // std::copy(value, value+m, state); + // Workaround for assigning from LDS memory + std::transform(value, value+m, state, [](element_type& x) + { + T result; + rocm_assign(result, x); + return result; + }); + a(state); + std::copy(state, state+m, value); +#endif +#endif + } + + template + typename Impl::enable_if< !(sizeof(Q) <= 8) , void >::type + action_at(std::size_t i, Action a) [[hc]] + { + element_type* value = (*this)[i]; +#if defined (ROCM15) + a(value); +#else +//#if KOKKOS_ROCM_HAS_WORKAROUNDS + if (m > get_max_tile_array_size()) return; + T state[get_max_tile_array_size()]; + // std::copy(value, value+m, state); + // Workaround for assigning from LDS memory + std::transform(value, value+m, state, [](element_type& x) + { + T result; + rocm_assign(result, x); + return result; + }); + a(state); + // this workaround required when T is greater than 8 bytes + tile_static char tv[64*sizeof(T)]; + size_t sT = sizeof(T); + for (int j = 0; j + void action_at(std::size_t i, std::size_t j, Action a) [[hc]] + { + this->action_at(i, [&](T* x) + { + this->action_at(j, [&](T* y) + { + a(x, y); + }); + }); + } + + std::size_t size() const [[hc]] [[cpu]] + { + return this->n; + } + + element_type* data() const [[hc]] [[cpu]] + { + return element_data; + } +}; + +// Zero initialize LDS memory +struct zero_init_f +{ + template +#if defined (ROCM15) + void operator()(T& x, std::size_t=1) const [[hc]] + { + auto * start = reinterpret_cast(&x); + for(int i=0; i(&x); + std::fill(start, start+sizeof(T), 0); + rocm_raw_assign(x, T()); + } +#endif + + template +#if defined (ROCM15) + void operator()(T* x, std::size_t size) const [[hc]] + { + rfor_each(x, x+size, *this); + } +#else + void operator()(__attribute__((address_space(3))) T* x, std::size_t size) const [[hc]] + { + std::for_each(x, x+size, *this); + } +#endif +}; + +static constexpr zero_init_f zero_init = {}; + +struct tile_desc +{ + // Number of work items, or size of extent + std::size_t elements; + // number of threads in team + std::size_t team_size; + // vector length of team + std::size_t vector_length; + // Size of tile + std::size_t tile_size; + // Size of array + std::size_t array_size; + // Number of tiles + std::size_t num_tiles; + // Per team reserved LDS memory, used for reduction + std::size_t reduce_size; + // Per team shared memory in LDS, this in addition to reduce shared mem + std::size_t shared_size; + std::size_t size; +}; + +template +tile_desc get_tile_desc(std::size_t size, + std::size_t array_size=1, + std::size_t team_size=64, + std::size_t vector_size=1, + std::size_t shared_size=0) +{ + tile_desc result; + result.elements = size; + result.array_size = array_size; + result.vector_length = vector_size; + result.team_size = team_size; + result.tile_size = get_tile_size(array_size,team_size,vector_size); + result.num_tiles = std::ceil(1.0 * size / result.tile_size); + result.reduce_size = result.tile_size * sizeof(T) * array_size; + result.shared_size = shared_size; + result.size = result.tile_size * result.num_tiles; + + return result; +} + +template::type> +hc::completion_future tile_for(tile_desc td, F f) +{ + assert(td.array_size <= get_max_tile_array_size() && "Exceed max array size"); + assert(((td.size % td.tile_size) == 0) && "Tile size must be divisible by extent"); + auto grid = hc::extent<1>(td.size).tile_with_dynamic( + td.tile_size, td.reduce_size + td.shared_size); + // grid.set_dynamic_group_segment_size(td.reduce_size + td.shared_size); + return parallel_for_each(grid, [=](hc::tiled_index<1> t_idx) [[hc]] + { +#if defined (ROCM15) + typedef T group_t; +#else + typedef __attribute__((address_space(3))) T group_t; +#endif + group_t * buffer = (group_t *)hc::get_dynamic_group_segment_base_pointer(); + tile_buffer tb(buffer, td.tile_size, td.array_size); + zero_init(tb[t_idx.local[0]], td.array_size); + f(t_idx, tb); + }); +} + +}} + +#endif diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Vectorization.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Vectorization.hpp new file mode 100644 index 0000000000..ac166f9ad8 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Vectorization.hpp @@ -0,0 +1,346 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ +#ifndef KOKKOS_ROCM_VECTORIZATION_HPP +#define KOKKOS_ROCM_VECTORIZATION_HPP + +#include + +/* only compile this file if ROCM is enabled for Kokkos */ +#ifdef KOKKOS_ENABLE_ROCM + +#include + +namespace Kokkos { +using namespace hc; + +// Shuffle only makes sense on >= Fiji GPUs; it doesn't work on CPUs +// or other GPUs. We provide a generic definition (which is trivial +// and doesn't do what it claims to do) because we don't actually use +// this function unless we are on a suitable GPU, with a suitable +// Scalar type. (For example, in the mat-vec, the "ThreadsPerRow" +// internal parameter depends both on the ExecutionSpace and the Scalar type, +// and it controls whether shfl_down() gets called.) +namespace Impl { + + template< typename Scalar > + struct shfl_union { + enum {n = sizeof(Scalar)/4}; + float fval[n]; + KOKKOS_INLINE_FUNCTION + Scalar value() { + return *(Scalar*) fval; + } + KOKKOS_INLINE_FUNCTION + void operator= (Scalar& value_) { + float* const val_ptr = (float*) &value_; + for(int i=0; i + KOKKOS_INLINE_FUNCTION + Scalar shfl(const Scalar &val, const int& srcLane, const typename Impl::enable_if< (sizeof(Scalar) == 4) , int >::type& width + ) { + Scalar tmp1 = val; + float tmp = *reinterpret_cast(&tmp1); + tmp = __shfl(tmp,srcLane,width); + return *reinterpret_cast(&tmp); + } + + KOKKOS_INLINE_FUNCTION + double shfl(const double &val, const int& srcLane, const int& width) { + int lo = __double2loint(val); + int hi = __double2hiint(val); + lo = __shfl(lo,srcLane,width); + hi = __shfl(hi,srcLane,width); + return __hiloint2double(hi,lo); + } + + template + KOKKOS_INLINE_FUNCTION + Scalar shfl(const Scalar &val, const int& srcLane, const typename Impl::enable_if< (sizeof(Scalar) == 8) ,int>::type& width) { + int lo = __double2loint(*reinterpret_cast(&val)); + int hi = __double2hiint(*reinterpret_cast(&val)); + lo = __shfl(lo,srcLane,width); + hi = __shfl(hi,srcLane,width); + const double tmp = __hiloint2double(hi,lo); + return *(reinterpret_cast(&tmp)); + } + + template + KOKKOS_INLINE_FUNCTION + Scalar shfl(const Scalar &val, const int& srcLane, const typename Impl::enable_if< (sizeof(Scalar) > 8) ,int>::type& width) { + Impl::shfl_union s_val; + Impl::shfl_union r_val; + s_val = val; + + for(int i = 0; i + KOKKOS_INLINE_FUNCTION + Scalar shfl_down(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 4) , int >::type & width) { + Scalar tmp1 = val; + float tmp = *reinterpret_cast(&tmp1); + tmp = __shfl_down(tmp,delta,width); + return *reinterpret_cast(&tmp); + } + + KOKKOS_INLINE_FUNCTION + long shfl_down(const long &val, const int& delta, const int& width) { + int lo = __long2loint(val); + int hi = __long2hiint(val); + lo = __shfl_down(lo,delta,width); + hi = __shfl_down(hi,delta,width); + return __hiloint2long(hi,lo); + } + + KOKKOS_INLINE_FUNCTION + double shfl_down(const double &val, const int& delta, const int& width) { + int lo = __double2loint(val); + int hi = __double2hiint(val); + lo = __shfl_down(lo,delta,width); + hi = __shfl_down(hi,delta,width); + return __hiloint2double(hi,lo); + } + + template + KOKKOS_INLINE_FUNCTION + Scalar shfl_down(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 8) , int >::type & width) { + int lo = __double2loint(*reinterpret_cast(&val)); + int hi = __double2hiint(*reinterpret_cast(&val)); + lo = __shfl_down(lo,delta,width); + hi = __shfl_down(hi,delta,width); + const double tmp = __hiloint2double(hi,lo); + return *(reinterpret_cast(&tmp)); + } + + template + KOKKOS_INLINE_FUNCTION + Scalar shfl_down(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) > 8) , int >::type & width) { + Impl::shfl_union s_val; + Impl::shfl_union r_val; + s_val = val; + + for(int i = 0; i + KOKKOS_INLINE_FUNCTION + Scalar shfl_up(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 4) , int >::type & width) { + Scalar tmp1 = val; + float tmp = *reinterpret_cast(&tmp1); + tmp = __shfl_up(tmp,delta,width); + return *reinterpret_cast(&tmp); + } + + KOKKOS_INLINE_FUNCTION + double shfl_up(const double &val, const int& delta, const int& width ) { + int lo = __double2loint(val); + int hi = __double2hiint(val); + lo = __shfl_up(lo,delta,width); + hi = __shfl_up(hi,delta,width); + return __hiloint2double(hi,lo); + } + + template + KOKKOS_INLINE_FUNCTION + Scalar shfl_up(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) == 8) , int >::type & width) { + int lo = __double2loint(*reinterpret_cast(&val)); + int hi = __double2hiint(*reinterpret_cast(&val)); + lo = __shfl_up(lo,delta,width); + hi = __shfl_up(hi,delta,width); + const double tmp = __hiloint2double(hi,lo); + return *(reinterpret_cast(&tmp)); + } + + template + KOKKOS_INLINE_FUNCTION + Scalar shfl_up(const Scalar &val, const int& delta, const typename Impl::enable_if< (sizeof(Scalar) > 8) , int >::type & width) { + Impl::shfl_union s_val; + Impl::shfl_union r_val; + s_val = val; + + for(int i = 0; i + inline + Scalar shfl(const Scalar &val, const int& srcLane, const int& width) { + if(width > 1) Kokkos::abort("Error: calling shfl from a device with CC<8.0."); + return val; + } + + template + inline + Scalar shfl_down(const Scalar &val, const int& delta, const int& width) { + if(width > 1) Kokkos::abort("Error: calling shfl_down from a device with CC<8.0."); + return val; + } + + template + inline + Scalar shfl_up(const Scalar &val, const int& delta, const int& width) { + if(width > 1) Kokkos::abort("Error: calling shfl_down from a device with CC<8.0."); + return val; + } +#endif + + + +} + +#endif // KOKKOS_ENABLE_ROCM +#endif diff --git a/lib/kokkos/core/src/ROCm/hc_math_std.hpp b/lib/kokkos/core/src/ROCm/hc_math_std.hpp new file mode 100644 index 0000000000..56c2e634e4 --- /dev/null +++ b/lib/kokkos/core/src/ROCm/hc_math_std.hpp @@ -0,0 +1,367 @@ +#pragma once + +#include "hc.hpp" +#include + +// Math functions with integer overloads will be converted to +// this floating point type. +#define HC_IMPLICIT_FLOAT_CONV double + +#ifdef __KALMAR_ACCELERATOR__ + +#define HC_MATH_WRAPPER_1(function, arg1) \ +template \ +inline T function(T arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1); \ +} + +#define KALMAR_MATH_WRAPPER_1(function, arg1) HC_MATH_WRAPPER_1(function, arg1) + +#define HC_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) \ +template \ +inline \ +typename std::enable_if::value,HC_IMPLICIT_FLOAT_CONV>::type \ + function(T arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(static_cast(arg1)); \ +} \ +template \ +inline \ +typename std::enable_if::value,T>::type \ + function(T arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1); \ +} + +#define KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) HC_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) + +#define HC_MATH_WRAPPER_2(function, arg1, arg2) \ +template \ +inline T function(T arg1, T arg2) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1, arg2); \ +} + +#define HC_MATH_ALIAS_2(alias, function, arg1, arg2) \ +template \ +inline T alias(T arg1, T arg2) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1, arg2); \ +} + +#define HC_MATH_WRAPPER_3(function, arg1, arg2, arg3) \ +template \ +inline T function(T arg1, T arg2, T arg3) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1, arg2, arg3); \ +} + +#define HC_MATH_WRAPPER_TQ(function, arg1) \ +template \ +inline T function(Q arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1); \ +} + +#define HC_MATH_WRAPPER_FP_OVERLOAD_TQ(function, T, arg1) \ +template \ +inline \ +typename std::enable_if::value,T>::type \ +function(Q arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(static_cast(arg1)); \ +}\ +template \ +inline \ +typename std::enable_if::value,T>::type \ +function(Q arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1); \ +} + +#define HC_MATH_WRAPPER_TTQ(function, arg1, arg2) \ +template \ +inline T function(T arg1, Q arg2) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1, arg2); \ +} + +#define HC_MATH_WRAPPER_FP_OVERLOAD_TTQ(function, arg1, arg2) \ +template \ +inline \ +typename std::enable_if::value||std::is_integral::value,HC_IMPLICIT_FLOAT_CONV>::type \ +function(T arg1, Q arg2) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(static_cast(arg1),static_cast(arg2)); \ +}\ +template \ +inline \ +typename std::enable_if::value&&std::is_floating_point::value,T>::type \ +function(T arg1, Q arg2) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1,arg2); \ +} + +#define HC_MATH_WRAPPER_TTTQ(function, arg1, arg2, arg3) \ +template \ +inline T function(T arg1, T arg2, Q arg3) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1, arg2, arg3); \ +} + +#define HC_MATH_WRAPPER_VTQQ(function, arg1, arg2, arg3) \ +template \ +inline void function(T arg1, Q arg2, Q arg3) __attribute__((hc,cpu)) { \ + hc::precise_math::function(arg1, arg2, arg3); \ +} + +#else + +#define HC_MATH_WRAPPER_1(function, arg1) \ +template \ +inline T function(T arg1) __attribute__((hc,cpu)) { \ + return std::function(arg1); \ +} + +#define KALMAR_MATH_WRAPPER_1(function, arg1) \ +template \ +inline T function(T arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1); \ +} + +#define HC_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) \ +template \ +inline \ +typename std::enable_if::value,HC_IMPLICIT_FLOAT_CONV>::type \ + function(T arg1) __attribute__((hc,cpu)) { \ + return ::function(static_cast(arg1)); \ +} \ +template \ +inline \ +typename std::enable_if::value,T>::type \ + function(T arg1) __attribute__((hc,cpu)) { \ + return std::function(arg1); \ +} + +#define KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) \ +template \ +inline \ +typename std::enable_if::value,HC_IMPLICIT_FLOAT_CONV>::type \ + function(T arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(static_cast(arg1)); \ +} \ +template \ +inline \ +typename std::enable_if::value,T>::type \ + function(T arg1) __attribute__((hc,cpu)) { \ + return hc::precise_math::function(arg1); \ +} + +#define HC_MATH_WRAPPER_2(function, arg1, arg2) \ +template \ +inline T function(T arg1, T arg2) __attribute__((hc,cpu)) { \ + return std::function(arg1, arg2); \ +} + +#define HC_MATH_ALIAS_2(alias, function, arg1, arg2) \ +template \ +inline T alias(T arg1, T arg2) __attribute__((hc,cpu)) { \ + return std::function(arg1, arg2); \ +} + +#define HC_MATH_WRAPPER_3(function, arg1, arg2, arg3) \ +template \ +inline T function(T arg1, T arg2, T arg3) __attribute__((hc,cpu)) { \ + return std::function(arg1, arg2, arg3); \ +} + +#define HC_MATH_WRAPPER_TQ(function, arg1) \ +template \ +inline T function(Q arg1) __attribute__((hc,cpu)) { \ + return std::function(arg1); \ +} + +#define HC_MATH_WRAPPER_FP_OVERLOAD_TQ(function, T, arg1) \ +template \ +inline \ +typename std::enable_if::value,T>::type \ +function(Q arg1) __attribute__((hc)) { \ + return std::function(static_cast(arg1)); \ +}\ +template \ +inline \ +typename std::enable_if::value,T>::type \ +function(Q arg1) __attribute__((hc)) { \ + return std::function(arg1); \ +} + +#define HC_MATH_WRAPPER_TTQ(function, arg1, arg2) \ +template \ +inline T function(T arg1, Q arg2) __attribute__((hc,cpu)) { \ + return std::function(arg1, arg2); \ +} + +#define HC_MATH_WRAPPER_FP_OVERLOAD_TTQ(function, arg1, arg2) \ +template \ +inline \ +typename std::enable_if::value||std::is_integral::value,HC_IMPLICIT_FLOAT_CONV>::type \ +function(T arg1, Q arg2) __attribute__((hc,cpu)) { \ + return std::function(static_cast(arg1),static_cast(arg2)); \ +}\ +template \ +inline \ +typename std::enable_if::value&&std::is_floating_point::value,T>::type \ +function(T arg1, Q arg2) __attribute__((hc,cpu)) { \ + return std::function(arg1,arg2); \ +} + +#define HC_MATH_WRAPPER_TTTQ(function, arg1, arg2, arg3) \ +template \ +inline T function(T arg1, T arg2, Q arg3) __attribute__((hc,cpu)) { \ + return std::function(arg1, arg2, arg3); \ +} + +#define HC_MATH_WRAPPER_VTQQ(function, arg1, arg2, arg3) \ +template \ +inline void function(T arg1, Q arg2, Q arg3) __attribute__((hc,cpu)) { \ + std::function(arg1, arg2, arg3); \ +} + +#endif + + +// override global math functions +namespace std { + +// following math functions are NOT available because they don't have a GPU implementation +// +// erfinv +// erfcinv +// fpclassify +// +// following math functions are NOT available because they don't have a CPU implementation +// +// cospif +// cospi +// rsqrtf +// rsqrt +// sinpif +// sinpi +// tanpi +// + +HC_MATH_WRAPPER_TQ(ilogbf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_TQ(ilogb, int, x) +HC_MATH_WRAPPER_FP_OVERLOAD_TQ(isfinite, bool, x) +HC_MATH_WRAPPER_FP_OVERLOAD_TQ(isinf, bool, x) +HC_MATH_WRAPPER_FP_OVERLOAD_TQ(isnan, bool, x) +HC_MATH_WRAPPER_FP_OVERLOAD_TQ(isnormal, bool, x) +HC_MATH_WRAPPER_TQ(nanf, tagp) +HC_MATH_WRAPPER_TQ(nan, tagp) +//HC_MATH_WRAPPER_TQ(signbitf, x) +HC_MATH_WRAPPER_TQ(signbit, x) +HC_MATH_WRAPPER_TTQ(frexpf, x, exp) +HC_MATH_WRAPPER_TTQ(frexp, x, exp) +HC_MATH_WRAPPER_TTQ(ldexpf, x, exp) +HC_MATH_WRAPPER_TTQ(ldexp, x, exp) +HC_MATH_WRAPPER_TTQ(lgammaf, x, exp) +HC_MATH_WRAPPER_TTQ(lgamma, x, exp) +HC_MATH_WRAPPER_TTQ(modff, x, exp) +HC_MATH_WRAPPER_TTQ(modf, x, exp) +HC_MATH_WRAPPER_TTQ(scalbnf, x, exp) +HC_MATH_WRAPPER_TTQ(scalbn, x, exp) +HC_MATH_WRAPPER_TTTQ(remquof, x, y, quo) +HC_MATH_WRAPPER_TTTQ(remquo, x, y, quo) +HC_MATH_WRAPPER_VTQQ(sincosf, x, s, c) +HC_MATH_WRAPPER_VTQQ(sincos, x, s, c) + +HC_MATH_WRAPPER_1(acosf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(acos, x) +HC_MATH_WRAPPER_1(acoshf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(acosh, x) +HC_MATH_WRAPPER_1(asinf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(asin, x) +HC_MATH_WRAPPER_1(asinhf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(asinh, x) +HC_MATH_WRAPPER_1(atanf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(atan, x) +HC_MATH_WRAPPER_1(atanhf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(atanh, x) +HC_MATH_WRAPPER_2(atan2f, x, y) +HC_MATH_WRAPPER_2(atan2, x, y) +HC_MATH_WRAPPER_1(cbrtf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(cbrt, x) +HC_MATH_WRAPPER_1(ceilf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(ceil, x) +HC_MATH_WRAPPER_2(copysignf, x, y) +HC_MATH_WRAPPER_2(copysign, x, y) +HC_MATH_WRAPPER_1(cosf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(cos, x) +HC_MATH_WRAPPER_1(coshf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(cosh, x) +KALMAR_MATH_WRAPPER_1(cospif, x) +KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(cospi, x) +HC_MATH_WRAPPER_1(erff, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(erf, x) +HC_MATH_WRAPPER_1(erfcf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(erfc, x) +HC_MATH_WRAPPER_1(expf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(exp, x) +HC_MATH_WRAPPER_1(exp2f, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(exp2, x) +HC_MATH_WRAPPER_1(exp10f, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(exp10, x) +HC_MATH_WRAPPER_1(expm1f, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(expm1, x) +HC_MATH_WRAPPER_1(fabsf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(fabs, x) +HC_MATH_WRAPPER_2(fdimf, x, y) +HC_MATH_WRAPPER_2(fdim, x, y) +HC_MATH_WRAPPER_1(floorf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(floor, x) +HC_MATH_WRAPPER_3(fmaf, x, y, z) +HC_MATH_WRAPPER_3(fma, x, y, z) +HC_MATH_WRAPPER_2(fmaxf, x, y) +HC_MATH_WRAPPER_2(fmax, x, y) +HC_MATH_WRAPPER_2(fminf, x, y) +HC_MATH_WRAPPER_2(fmin, x, y) +HC_MATH_WRAPPER_2(fmodf, x, y) +HC_MATH_WRAPPER_2(fmod, x, y) +HC_MATH_WRAPPER_2(hypotf, x, y) +HC_MATH_WRAPPER_2(hypot, x, y) +HC_MATH_WRAPPER_1(logf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(log, x) +HC_MATH_WRAPPER_1(log10f, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(log10, x) +HC_MATH_WRAPPER_1(log2f, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(log2, x) +HC_MATH_WRAPPER_1(log1pf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(log1p, x) +HC_MATH_WRAPPER_1(logbf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(logb, x) +HC_MATH_WRAPPER_1(nearbyintf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(nearbyint, x) +HC_MATH_WRAPPER_2(nextafterf, x, y) +HC_MATH_WRAPPER_2(nextafter, x, y) +HC_MATH_WRAPPER_2(powf, x, y) +HC_MATH_WRAPPER_FP_OVERLOAD_TTQ(pow,x,y) +//HC_MATH_WRAPPER_1(rcbrtf, x) +//HC_MATH_WRAPPER_1(rcbrt, x) +HC_MATH_WRAPPER_2(remainderf, x, y) +HC_MATH_WRAPPER_2(remainder, x, y) +HC_MATH_WRAPPER_1(roundf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(round, x) +KALMAR_MATH_WRAPPER_1(rsqrtf, x) +KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(rsqrt, x) +HC_MATH_WRAPPER_2(scalbf, x, exp) +HC_MATH_WRAPPER_2(scalb, x, exp) +HC_MATH_WRAPPER_1(sinf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(sin, x) +HC_MATH_WRAPPER_1(sinhf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(sinh, x) +KALMAR_MATH_WRAPPER_1(sinpif, x) +KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(sinpi, x) +HC_MATH_WRAPPER_1(sqrtf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(sqrt, x) +HC_MATH_WRAPPER_1(tgammaf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(tgamma, x) +HC_MATH_WRAPPER_1(tanf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(tan, x) +HC_MATH_WRAPPER_1(tanhf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(tanh, x) +HC_MATH_WRAPPER_1(truncf, x) +HC_MATH_WRAPPER_FP_OVERLOAD_1(trunc, x) + +//HC_MATH_ALIAS_2(min, fmin, x, y) +//HC_MATH_ALIAS_2(max, fmax, x, y) + +} // namespace + diff --git a/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.cpp b/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.cpp index 4c805310cc..977ada214e 100644 --- a/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.cpp +++ b/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.cpp @@ -45,14 +45,14 @@ #include #if defined( KOKKOS_ENABLE_THREADS ) -#include - #include #include #include #include #include + #include + #include #include #include @@ -80,9 +80,7 @@ const void * volatile s_current_function_arg = 0 ; struct Sentinel { Sentinel() - { - HostSpace::register_in_parallel( ThreadsExec::in_parallel ); - } + {} ~Sentinel() { @@ -122,6 +120,8 @@ void execute_function_noop( ThreadsExec & , const void * ) {} void ThreadsExec::driver(void) { + SharedAllocationRecord< void, void >::tracking_enable(); + ThreadsExec this_thread ; while ( ThreadsExec::Active == this_thread.m_pool_state ) { @@ -266,7 +266,7 @@ void ThreadsExec::execute_sleep( ThreadsExec & exec , const void * ) const int rank_rev = exec.m_pool_size - ( exec.m_pool_rank + 1 ); for ( int i = 0 ; i < n ; ++i ) { - Impl::spinwait_while_equal( exec.m_pool_base[ rank_rev + (1<m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( exec.m_pool_base[ rank_rev + (1<m_pool_state , ThreadsExec::Active ); } exec.m_pool_state = ThreadsExec::Inactive ; @@ -310,7 +310,7 @@ void ThreadsExec::fence() { if ( s_thread_pool_size[0] ) { // Wait for the root thread to complete: - Impl::spinwait_while_equal( s_threads_exec[0]->m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( s_threads_exec[0]->m_pool_state , ThreadsExec::Active ); } s_current_function = 0 ; @@ -716,16 +716,18 @@ void ThreadsExec::initialize( unsigned thread_count , } // Check for over-subscription - //if( Impl::mpi_ranks_per_node() * long(thread_count) > Impl::processors_per_node() ) { - // std::cout << "Kokkos::Threads::initialize WARNING: You are likely oversubscribing your CPU cores." << std::endl; - // std::cout << " Detected: " << Impl::processors_per_node() << " cores per node." << std::endl; - // std::cout << " Detected: " << Impl::mpi_ranks_per_node() << " MPI_ranks per node." << std::endl; - // std::cout << " Requested: " << thread_count << " threads per process." << std::endl; - //} + if( Kokkos::show_warnings() && (Impl::mpi_ranks_per_node() * long(thread_count) > Impl::processors_per_node()) ) { + std::cout << "Kokkos::Threads::initialize WARNING: You are likely oversubscribing your CPU cores." << std::endl; + std::cout << " Detected: " << Impl::processors_per_node() << " cores per node." << std::endl; + std::cout << " Detected: " << Impl::mpi_ranks_per_node() << " MPI_ranks per node." << std::endl; + std::cout << " Requested: " << thread_count << " threads per process." << std::endl; + } // Init the array for used for arbitrarily sized atomics Impl::init_lock_array_host_space(); + Impl::SharedAllocationRecord< void, void >::tracking_enable(); + #if defined(KOKKOS_ENABLE_PROFILING) Kokkos::Profiling::initialize(); #endif diff --git a/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.hpp b/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.hpp index 74de3a2596..71189cf7cc 100644 --- a/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.hpp +++ b/lib/kokkos/core/src/Threads/Kokkos_ThreadsExec.hpp @@ -50,11 +50,12 @@ #include #include -#include +#include #include #include +#include //---------------------------------------------------------------------------- namespace Kokkos { @@ -106,7 +107,7 @@ private: // Which thread am I stealing from currently int m_current_steal_target; // This thread's owned work_range - Kokkos::pair m_work_range KOKKOS_ALIGN(16); + Kokkos::pair m_work_range __attribute__((aligned(16))) ; // Team Offset if one thread determines work_range for others long m_team_work_index; @@ -190,13 +191,13 @@ public: // Fan-in reduction with highest ranking thread as the root for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { // Wait: Active -> Rendezvous - Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Active ); } if ( rev_rank ) { m_pool_state = ThreadsExec::Rendezvous ; // Wait: Rendezvous -> Active - Impl::spinwait_while_equal( m_pool_state , ThreadsExec::Rendezvous ); + Impl::spinwait_while_equal( m_pool_state , ThreadsExec::Rendezvous ); } else { // Root thread does the reduction and broadcast @@ -232,13 +233,13 @@ public: // Fan-in reduction with highest ranking thread as the root for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { // Wait: Active -> Rendezvous - Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Active ); } if ( rev_rank ) { m_pool_state = ThreadsExec::Rendezvous ; // Wait: Rendezvous -> Active - Impl::spinwait_while_equal( m_pool_state , ThreadsExec::Rendezvous ); + Impl::spinwait_while_equal( m_pool_state , ThreadsExec::Rendezvous ); } else { // Root thread does the reduction and broadcast @@ -267,7 +268,7 @@ public: ThreadsExec & fan = *m_pool_base[ rev_rank + ( 1 << i ) ] ; - Impl::spinwait_while_equal( fan.m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( fan.m_pool_state , ThreadsExec::Active ); Join::join( f , reduce_memory() , fan.reduce_memory() ); } @@ -275,6 +276,17 @@ public: if ( ! rev_rank ) { Final::final( f , reduce_memory() ); } + + // This thread has updated 'reduce_memory()' and upon returning + // from this function will set 'm_pool_state' to inactive. + // If this is a non-root thread then setting 'm_pool_state' + // to inactive triggers another thread to exit a spinwait + // and read the 'reduce_memory'. + // Must 'memory_fence()' to guarantee that storing the update to + // 'reduce_memory()' will complete before storing the the update to + // 'm_pool_state'. + + memory_fence(); } inline @@ -283,7 +295,7 @@ public: const int rev_rank = m_pool_size - ( m_pool_rank + 1 ); for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { - Impl::spinwait_while_equal( m_pool_base[rev_rank+(1<m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( m_pool_base[rev_rank+(1<m_pool_state , ThreadsExec::Active ); } } @@ -315,7 +327,7 @@ public: ThreadsExec & fan = *m_pool_base[ rev_rank + (1< ReductionAvailable (or ScanAvailable) - Impl::spinwait_while_equal( fan.m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( fan.m_pool_state , ThreadsExec::Active ); Join::join( f , work_value , fan.reduce_memory() ); } @@ -333,8 +345,8 @@ public: // Wait: Active -> ReductionAvailable // Wait: ReductionAvailable -> ScanAvailable - Impl::spinwait_while_equal( th.m_pool_state , ThreadsExec::Active ); - Impl::spinwait_while_equal( th.m_pool_state , ThreadsExec::ReductionAvailable ); + Impl::spinwait_while_equal( th.m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( th.m_pool_state , ThreadsExec::ReductionAvailable ); Join::join( f , work_value + count , ((scalar_type *)th.reduce_memory()) + count ); } @@ -345,7 +357,7 @@ public: // Wait for all threads to complete inclusive scan // Wait: ScanAvailable -> Rendezvous - Impl::spinwait_while_equal( m_pool_state , ThreadsExec::ScanAvailable ); + Impl::spinwait_while_equal( m_pool_state , ThreadsExec::ScanAvailable ); } //-------------------------------- @@ -353,7 +365,7 @@ public: for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { ThreadsExec & fan = *m_pool_base[ rev_rank + (1< ScanAvailable - Impl::spinwait_while_equal( fan.m_pool_state , ThreadsExec::ReductionAvailable ); + Impl::spinwait_while_equal( fan.m_pool_state , ThreadsExec::ReductionAvailable ); // Set: ScanAvailable -> Rendezvous fan.m_pool_state = ThreadsExec::Rendezvous ; } @@ -380,13 +392,13 @@ public: // Wait for all threads to copy previous thread's inclusive scan value // Wait for all threads: Rendezvous -> ScanCompleted for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { - Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Rendezvous ); + Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Rendezvous ); } if ( rev_rank ) { // Set: ScanAvailable -> ScanCompleted m_pool_state = ThreadsExec::ScanCompleted ; // Wait: ScanCompleted -> Active - Impl::spinwait_while_equal( m_pool_state , ThreadsExec::ScanCompleted ); + Impl::spinwait_while_equal( m_pool_state , ThreadsExec::ScanCompleted ); } // Set: ScanCompleted -> Active for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { @@ -413,7 +425,7 @@ public: // Fan-in reduction with highest ranking thread as the root for ( int i = 0 ; i < m_pool_fan_size ; ++i ) { // Wait: Active -> Rendezvous - Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Active ); + Impl::spinwait_while_equal( m_pool_base[ rev_rank + (1<m_pool_state , ThreadsExec::Active ); } for ( unsigned i = 0 ; i < count ; ++i ) { work_value[i+count] = work_value[i]; } @@ -421,7 +433,7 @@ public: if ( rev_rank ) { m_pool_state = ThreadsExec::Rendezvous ; // Wait: Rendezvous -> Active - Impl::spinwait_while_equal( m_pool_state , ThreadsExec::Rendezvous ); + Impl::spinwait_while_equal( m_pool_state , ThreadsExec::Rendezvous ); } else { // Root thread does the thread-scan before releasing threads @@ -627,6 +639,62 @@ inline void Threads::fence() } /* namespace Kokkos */ +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { namespace Experimental { + +template<> +class UniqueToken< Threads, UniqueTokenScope::Instance> +{ +public: + using execution_space = Threads; + using size_type = int; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ) noexcept {} + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + inline + int size() const noexcept { return Threads::thread_pool_size(); } + + /// \brief acquire value such that 0 <= value < size() + inline + int acquire() const noexcept { return Threads::thread_pool_rank(); } + + /// \brief release a value acquired by generate + inline + void release( int ) const noexcept {} +}; + +template<> +class UniqueToken< Threads, UniqueTokenScope::Global> +{ +public: + using execution_space = Threads; + using size_type = int; + + /// \brief create object size for concurrency on the given instance + /// + /// This object should not be shared between instances + UniqueToken( execution_space const& = execution_space() ) noexcept {} + + /// \brief upper bound for acquired values, i.e. 0 <= value < size() + inline + int size() const noexcept { return Threads::thread_pool_size(); } + + /// \brief acquire value such that 0 <= value < size() + inline + int acquire() const noexcept { return Threads::thread_pool_rank(); } + + /// \brief release a value acquired by generate + inline + void release( int ) const noexcept {} +}; + +}} // namespace Kokkos::Experimental //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- #endif diff --git a/lib/kokkos/core/src/Threads/Kokkos_ThreadsTeam.hpp b/lib/kokkos/core/src/Threads/Kokkos_ThreadsTeam.hpp index c12019413b..7a51b41bfb 100644 --- a/lib/kokkos/core/src/Threads/Kokkos_ThreadsTeam.hpp +++ b/lib/kokkos/core/src/Threads/Kokkos_ThreadsTeam.hpp @@ -50,7 +50,7 @@ #include #include -#include +#include #include #include @@ -107,13 +107,13 @@ public: // Wait for fan-in threads for ( n = 1 ; ( ! ( m_team_rank_rev & n ) ) && ( ( j = m_team_rank_rev + n ) < m_team_size ) ; n <<= 1 ) { - Impl::spinwait_while_equal( m_team_base[j]->state() , ThreadsExec::Active ); + Impl::spinwait_while_equal( m_team_base[j]->state() , ThreadsExec::Active ); } // If not root then wait for release if ( m_team_rank_rev ) { m_exec->state() = ThreadsExec::Rendezvous ; - Impl::spinwait_while_equal( m_exec->state() , ThreadsExec::Rendezvous ); + Impl::spinwait_while_equal( m_exec->state() , ThreadsExec::Rendezvous ); } return ! m_team_rank_rev ; @@ -482,6 +482,8 @@ public: void next_static() { if ( m_league_rank < m_league_end ) { + // Make sure all stores are complete before entering the barrier + memory_fence(); team_barrier(); set_team_shared(); } @@ -518,6 +520,8 @@ public: return; if ( m_league_rank < m_league_chunk_end ) { + // Make sure all stores are complete before entering the barrier + memory_fence(); team_barrier(); set_team_shared(); } diff --git a/lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel.hpp b/lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel.hpp index 0ee0cd3280..be9f5a6f87 100644 --- a/lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel.hpp +++ b/lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel.hpp @@ -55,6 +55,8 @@ #include #include +#include + //---------------------------------------------------------------------------- namespace Kokkos { @@ -174,6 +176,108 @@ public: {} }; + +// MDRangePolicy impl +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType + , Kokkos::MDRangePolicy< Traits ... > + , Kokkos::Threads + > +{ +private: + typedef Kokkos::MDRangePolicy< Traits ... > MDRangePolicy ; + typedef typename MDRangePolicy::impl_range_policy Policy ; + + typedef typename MDRangePolicy::work_tag WorkTag ; + + typedef typename Policy::WorkRange WorkRange ; + typedef typename Policy::member_type Member ; + + typedef typename Kokkos::Impl::HostIterateTile< MDRangePolicy, FunctorType, typename MDRangePolicy::work_tag, void > iterate_type; + + const FunctorType m_functor ; + const MDRangePolicy m_mdr_policy ; + const Policy m_policy ; // construct as RangePolicy( 0, num_tiles ).set_chunk_size(1) in ctor + + inline static + void + exec_range( const MDRangePolicy & mdr_policy + , const FunctorType & functor + , const Member ibeg , const Member iend ) + { + #if defined( KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION ) && \ + defined( KOKKOS_ENABLE_PRAGMA_IVDEP ) + #pragma ivdep + #endif + for ( Member i = ibeg ; i < iend ; ++i ) { + iterate_type( mdr_policy, functor )( i ); + } + } + + static void exec( ThreadsExec & exec , const void * arg ) + { + exec_schedule(exec,arg); + } + + template + static + typename std::enable_if< std::is_same::value >::type + exec_schedule( ThreadsExec & exec , const void * arg ) + { + const ParallelFor & self = * ((const ParallelFor *) arg ); + + WorkRange range( self.m_policy , exec.pool_rank() , exec.pool_size() ); + + ParallelFor::exec_range + ( self.m_mdr_policy, self.m_functor , range.begin() , range.end() ); + + exec.fan_in(); + } + + template + static + typename std::enable_if< std::is_same::value >::type + exec_schedule( ThreadsExec & exec , const void * arg ) + { + const ParallelFor & self = * ((const ParallelFor *) arg ); + + WorkRange range( self.m_policy , exec.pool_rank() , exec.pool_size() ); + + exec.set_work_range(range.begin(),range.end(),self.m_policy.chunk_size()); + exec.reset_steal_target(); + exec.barrier(); + + long work_index = exec.get_work_index(); + + while(work_index != -1) { + const Member begin = static_cast(work_index) * self.m_policy.chunk_size(); + const Member end = begin + self.m_policy.chunk_size() < self.m_policy.end()?begin+self.m_policy.chunk_size():self.m_policy.end(); + + ParallelFor::exec_range + ( self.m_mdr_policy, self.m_functor , begin , end ); + work_index = exec.get_work_index(); + } + + exec.fan_in(); + } + +public: + + inline + void execute() const + { + ThreadsExec::start( & ParallelFor::exec , this ); + ThreadsExec::fence(); + } + + ParallelFor( const FunctorType & arg_functor + , const MDRangePolicy & arg_policy ) + : m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + {} +}; + //---------------------------------------------------------------------------- /* ParallelFor Kokkos::Threads with TeamPolicy */ @@ -292,9 +396,10 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; typedef typename ValueTraits::pointer_type pointer_type ; typedef typename ValueTraits::reference_type reference_type ; @@ -354,7 +459,7 @@ private: ( self.m_functor , range.begin() , range.end() , ValueInit::init( ReducerConditional::select(self.m_functor , self.m_reducer) , exec.reduce_memory() ) ); - exec.template fan_in_reduce< ReducerTypeFwd , WorkTag >( ReducerConditional::select(self.m_functor , self.m_reducer) ); + exec.template fan_in_reduce< ReducerTypeFwd , WorkTagFwd >( ReducerConditional::select(self.m_functor , self.m_reducer) ); } template @@ -380,7 +485,7 @@ private: work_index = exec.get_work_index(); } - exec.template fan_in_reduce< ReducerTypeFwd , WorkTag >( ReducerConditional::select(self.m_functor , self.m_reducer) ); + exec.template fan_in_reduce< ReducerTypeFwd , WorkTagFwd >( ReducerConditional::select(self.m_functor , self.m_reducer) ); } public: @@ -440,6 +545,170 @@ public: }; + +// MDRangePolicy impl +template< class FunctorType , class ReducerType, class ... Traits > +class ParallelReduce< FunctorType + , Kokkos::MDRangePolicy< Traits ... > + , ReducerType + , Kokkos::Threads + > +{ +private: + + typedef Kokkos::MDRangePolicy< Traits ... > MDRangePolicy ; + typedef typename MDRangePolicy::impl_range_policy Policy ; + + typedef typename MDRangePolicy::work_tag WorkTag ; + typedef typename Policy::WorkRange WorkRange ; + typedef typename Policy::member_type Member ; + + typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; + typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; + + typedef typename ReducerTypeFwd::value_type ValueType; + + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; + + typedef typename ValueTraits::pointer_type pointer_type ; + typedef typename ValueTraits::reference_type reference_type ; + + using iterate_type = typename Kokkos::Impl::HostIterateTile< MDRangePolicy + , FunctorType + , WorkTag + , ValueType + >; + + const FunctorType m_functor ; + const MDRangePolicy m_mdr_policy ; + const Policy m_policy ; // construct as RangePolicy( 0, num_tiles ).set_chunk_size(1) in ctor + const ReducerType m_reducer ; + const pointer_type m_result_ptr ; + + inline static + void + exec_range( const MDRangePolicy & mdr_policy + , const FunctorType & functor + , const Member & ibeg , const Member & iend + , reference_type update ) + { + #if defined( KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION ) && \ + defined( KOKKOS_ENABLE_PRAGMA_IVDEP ) + #pragma ivdep + #endif + for ( Member i = ibeg ; i < iend ; ++i ) { + iterate_type( mdr_policy, functor, update )( i ); + } + } + + static void + exec( ThreadsExec & exec , const void * arg ) { + exec_schedule(exec, arg); + } + + template + static + typename std::enable_if< std::is_same::value >::type + exec_schedule( ThreadsExec & exec , const void * arg ) + { + const ParallelReduce & self = * ((const ParallelReduce *) arg ); + const WorkRange range( self.m_policy, exec.pool_rank(), exec.pool_size() ); + + ParallelReduce::exec_range + ( self.m_mdr_policy, self.m_functor , range.begin() , range.end() + , ValueInit::init( ReducerConditional::select(self.m_functor , self.m_reducer) , exec.reduce_memory() ) ); + + exec.template fan_in_reduce< ReducerTypeFwd , WorkTagFwd >( ReducerConditional::select(self.m_functor , self.m_reducer) ); + } + + template + static + typename std::enable_if< std::is_same::value >::type + exec_schedule( ThreadsExec & exec , const void * arg ) + { + const ParallelReduce & self = * ((const ParallelReduce *) arg ); + const WorkRange range( self.m_policy, exec.pool_rank(), exec.pool_size() ); + + exec.set_work_range(range.begin(),range.end(),self.m_policy.chunk_size()); + exec.reset_steal_target(); + exec.barrier(); + + long work_index = exec.get_work_index(); + reference_type update = ValueInit::init( ReducerConditional::select(self.m_functor , self.m_reducer) , exec.reduce_memory() ); + while(work_index != -1) { + const Member begin = static_cast(work_index) * self.m_policy.chunk_size(); + const Member end = begin + self.m_policy.chunk_size() < self.m_policy.end()?begin+self.m_policy.chunk_size():self.m_policy.end(); + ParallelReduce::exec_range + ( self.m_mdr_policy, self.m_functor , begin , end + , update ); + work_index = exec.get_work_index(); + } + + exec.template fan_in_reduce< ReducerTypeFwd , WorkTagFwd >( ReducerConditional::select(self.m_functor , self.m_reducer) ); + } + +public: + + inline + void execute() const + { + ThreadsExec::resize_scratch( ValueTraits::value_size( ReducerConditional::select(m_functor , m_reducer) ) , 0 ); + + ThreadsExec::start( & ParallelReduce::exec , this ); + + ThreadsExec::fence(); + + if ( m_result_ptr ) { + + const pointer_type data = + (pointer_type) ThreadsExec::root_reduce_scratch(); + + const unsigned n = ValueTraits::value_count( ReducerConditional::select(m_functor , m_reducer) ); + for ( unsigned i = 0 ; i < n ; ++i ) { m_result_ptr[i] = data[i]; } + } + } + + template< class HostViewType > + ParallelReduce( const FunctorType & arg_functor , + const MDRangePolicy & arg_policy , + const HostViewType & arg_result_view , + typename std::enable_if< + Kokkos::is_view< HostViewType >::value && + !Kokkos::is_reducer_type::value + ,void*>::type = NULL) + : m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + , m_reducer( InvalidType() ) + , m_result_ptr( arg_result_view.ptr_on_device() ) + { + static_assert( Kokkos::is_view< HostViewType >::value + , "Kokkos::Threads reduce result must be a View" ); + + static_assert( std::is_same< typename HostViewType::memory_space , HostSpace >::value + , "Kokkos::Threads reduce result must be a View in HostSpace" ); + } + + inline + ParallelReduce( const FunctorType & arg_functor + , MDRangePolicy arg_policy + , const ReducerType& reducer ) + : m_functor( arg_functor ) + , m_mdr_policy( arg_policy ) + , m_policy( Policy(0, m_mdr_policy.m_num_tiles).set_chunk_size(1) ) + , m_reducer( reducer ) + , m_result_ptr( reducer.view().data() ) + { + /*static_assert( std::is_same< typename ViewType::memory_space + , Kokkos::HostSpace >::value + , "Reduction result on Kokkos::OpenMP must be a Kokkos::View in HostSpace" );*/ + } + +}; + + //---------------------------------------------------------------------------- /* ParallelReduce with Kokkos::Threads and TeamPolicy */ @@ -458,9 +727,10 @@ private: typedef Kokkos::Impl::if_c< std::is_same::value, FunctorType, ReducerType> ReducerConditional; typedef typename ReducerConditional::type ReducerTypeFwd; + typedef typename Kokkos::Impl::if_c< std::is_same::value, WorkTag, void>::type WorkTagFwd; - typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd, WorkTag > ValueTraits ; - typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd, WorkTag > ValueInit ; + typedef Kokkos::Impl::FunctorValueTraits< ReducerTypeFwd , WorkTagFwd > ValueTraits ; + typedef Kokkos::Impl::FunctorValueInit< ReducerTypeFwd , WorkTagFwd > ValueInit ; typedef typename ValueTraits::pointer_type pointer_type ; typedef typename ValueTraits::reference_type reference_type ; @@ -500,7 +770,7 @@ private: ( self.m_functor , Member( & exec , self.m_policy , self.m_shared ) , ValueInit::init( ReducerConditional::select(self.m_functor , self.m_reducer) , exec.reduce_memory() ) ); - exec.template fan_in_reduce< ReducerTypeFwd , WorkTag >( ReducerConditional::select(self.m_functor , self.m_reducer) ); + exec.template fan_in_reduce< ReducerTypeFwd , WorkTagFwd >( ReducerConditional::select(self.m_functor , self.m_reducer) ); } public: diff --git a/lib/kokkos/core/src/Threads/Kokkos_Threads_WorkGraphPolicy.hpp b/lib/kokkos/core/src/Threads/Kokkos_Threads_WorkGraphPolicy.hpp new file mode 100644 index 0000000000..203e5b2b99 --- /dev/null +++ b/lib/kokkos/core/src/Threads/Kokkos_Threads_WorkGraphPolicy.hpp @@ -0,0 +1,117 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_THREADS_WORKGRAPHPOLICY_HPP +#define KOKKOS_THREADS_WORKGRAPHPOLICY_HPP + +namespace Kokkos { +namespace Impl { + +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType , + Kokkos::WorkGraphPolicy< Traits ... > , + Kokkos::Threads + > +{ +private: + + typedef Kokkos::WorkGraphPolicy< Traits ... > Policy ; + + typedef ParallelFor, + Kokkos::Threads> Self ; + + Policy m_policy ; + FunctorType m_functor ; + + template< class TagType > + typename std::enable_if< std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { m_functor( w ); } + + template< class TagType > + typename std::enable_if< ! std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { const TagType t{}; m_functor( t , w ); } + + inline void exec_one_thread() const noexcept + { + // Spin until COMPLETED_TOKEN. + // END_TOKEN indicates no work is currently available. + + for ( std::int32_t w = Policy::END_TOKEN ; + Policy::COMPLETED_TOKEN != ( w = m_policy.pop_work() ) ; ) { + if ( Policy::END_TOKEN != w ) { + exec_one< typename Policy::work_tag >( w ); + m_policy.completed_work(w); + } + } + } + + static inline void thread_main( ThreadsExec&, const void* arg ) noexcept + { + const Self& self = *(static_cast(arg)); + self.exec_one_thread(); + } + +public: + + inline + void execute() + { + ThreadsExec::start( & Self::thread_main, this ); + ThreadsExec::fence(); + } + + inline + ParallelFor( const FunctorType & arg_functor + , const Policy & arg_policy ) + : m_policy( arg_policy ) + , m_functor( arg_functor ) + {} +}; + +} // namespace Impl +} // namespace Kokkos + +#endif /* #define KOKKOS_THREADS_WORKGRAPHPOLICY_HPP */ diff --git a/lib/kokkos/core/src/impl/KokkosExp_Host_IterateTile.hpp b/lib/kokkos/core/src/impl/KokkosExp_Host_IterateTile.hpp index 77a1e8754d..e851a1e217 100644 --- a/lib/kokkos/core/src/impl/KokkosExp_Host_IterateTile.hpp +++ b/lib/kokkos/core/src/impl/KokkosExp_Host_IterateTile.hpp @@ -59,7 +59,7 @@ #include #include -namespace Kokkos { namespace Experimental { namespace Impl { +namespace Kokkos { namespace Impl { // Temporary, for testing new loop macros #define KOKKOS_ENABLE_NEW_LOOP_MACROS 1 @@ -141,7 +141,6 @@ namespace Kokkos { namespace Experimental { namespace Impl { #define LOOP_ARGS_8 LOOP_ARGS_7, i7 + m_offset[7] - // New Loop Macros... // parallel_for, non-tagged #define APPLY( func, ... ) \ @@ -1010,8 +1009,6 @@ namespace Kokkos { namespace Experimental { namespace Impl { // end tagged macros - - // Structs for calling loops template < int Rank, bool IsLeft, typename IType, typename Tagged, typename Enable = void > struct Tile_Loop_Type; @@ -1277,7 +1274,20 @@ struct Tile_Loop_Type<8, IsLeft, IType, Tagged, typename std::enable_if< !std::i template -using is_void = std::is_same< T , void >; +using is_void_type = std::is_same< T , void >; + +template +struct is_type_array : std::false_type +{ + using value_type = T; +}; + +template +struct is_type_array< T[] > : std::true_type +{ + using value_type = T; +}; + template < typename RP , typename Functor @@ -1293,7 +1303,7 @@ template < typename RP , typename Tag , typename ValueType > -struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_if< is_void::value >::type > +struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_if< is_void_type::value >::type > { using index_type = typename RP::index_type; using point_type = typename RP::point_type; @@ -1761,18 +1771,17 @@ struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_i RP const& m_rp; Functor const& m_func; typename std::conditional< std::is_same::value,int,Tag>::type m_tag; -// value_type & m_v; - }; -// ValueType: For reductions +// For ParallelReduce +// ValueType - scalar: For reductions template < typename RP , typename Functor , typename Tag , typename ValueType > -struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_if< !is_void::value >::type > +struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_if< !is_void_type::value && !is_type_array::value >::type > { using index_type = typename RP::index_type; using point_type = typename RP::point_type; @@ -2251,12 +2260,499 @@ struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_i }; +// For ParallelReduce +// Extra specialization for array reductions +// ValueType[]: For array reductions +template < typename RP + , typename Functor + , typename Tag + , typename ValueType + > +struct HostIterateTile < RP , Functor , Tag , ValueType , typename std::enable_if< !is_void_type::value && is_type_array::value >::type > +{ + using index_type = typename RP::index_type; + using point_type = typename RP::point_type; + + using value_type = typename is_type_array::value_type; // strip away the 'array-ness' [], only underlying type remains + + inline + HostIterateTile( RP const& rp, Functor const& func, value_type *v ) // v should be an array; treat as pointer for compatibility since size is not known nor needed here + : m_rp(rp) //Cuda 7.0 does not like braces... + , m_func(func) + , m_v(v) // use with non-void ValueType struct + {} + + inline + bool check_iteration_bounds( point_type& partial_tile , point_type& offset ) const { + bool is_full_tile = true; + + for ( int i = 0; i < RP::rank; ++i ) { + if ((offset[i] + m_rp.m_tile[i]) <= m_rp.m_upper[i]) { + partial_tile[i] = m_rp.m_tile[i] ; + } + else { + is_full_tile = false ; + partial_tile[i] = (m_rp.m_upper[i] - 1 - offset[i]) == 0 ? 1 + : (m_rp.m_upper[i] - m_rp.m_tile[i]) > 0 ? (m_rp.m_upper[i] - offset[i]) + : (m_rp.m_upper[i] - m_rp.m_lower[i]) ; // when single tile encloses range + } + } + + return is_full_tile ; + } // end check bounds + + + template + struct RankTag + { + typedef RankTag type; + enum { value = (int)Rank }; + }; + + +#if KOKKOS_ENABLE_NEW_LOOP_MACROS + template + inline + void + operator()(IType tile_idx) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + Tile_Loop_Type< RP::rank, (RP::inner_direction == RP::Left), index_type, Tag >::apply( m_v, m_func, full_tile, m_offset, m_rp.m_tile, m_tiledims ); + + } + +#else + template + inline + void + operator()(IType tile_idx) const + { operator_impl( tile_idx , RankTag() ); } + // added due to compiler error when using sfinae to choose operator based on rank + + + template + inline + void operator_impl( IType tile_idx , const RankTag<2> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_2L(index_type, m_tiledims) { + apply( LOOP_ARGS_2 ); + } + } else { +// #pragma simd + LOOP_2L(index_type, m_tiledims) { + apply( LOOP_ARGS_2 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_2R(index_type, m_tiledims) { + apply( LOOP_ARGS_2 ); + } + } else { +// #pragma simd + LOOP_2R(index_type, m_tiledims) { + apply( LOOP_ARGS_2 ); + } + } + } // end RP::Right + + } //end op() rank == 2 + + + template + inline + void operator_impl( IType tile_idx , const RankTag<3> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_3L(index_type, m_tiledims) { + apply( LOOP_ARGS_3 ); + } + } else { +// #pragma simd + LOOP_3L(index_type, m_tiledims) { + apply( LOOP_ARGS_3 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_3R(index_type, m_tiledims) { + apply( LOOP_ARGS_3 ); + } + } else { +// #pragma simd + LOOP_3R(index_type, m_tiledims) { + apply( LOOP_ARGS_3 ); + } + } + } // end RP::Right + + } //end op() rank == 3 + + + template + inline + void operator_impl( IType tile_idx , const RankTag<4> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_4L(index_type, m_tiledims) { + apply( LOOP_ARGS_4 ); + } + } else { +// #pragma simd + LOOP_4L(index_type, m_tiledims) { + apply( LOOP_ARGS_4 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_4R(index_type, m_tiledims) { + apply( LOOP_ARGS_4 ); + } + } else { +// #pragma simd + LOOP_4R(index_type, m_tiledims) { + apply( LOOP_ARGS_4 ); + } + } + } // end RP::Right + + } //end op() rank == 4 + + + template + inline + void operator_impl( IType tile_idx , const RankTag<5> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_5L(index_type, m_tiledims) { + apply( LOOP_ARGS_5 ); + } + } else { +// #pragma simd + LOOP_5L(index_type, m_tiledims) { + apply( LOOP_ARGS_5 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_5R(index_type, m_tiledims) { + apply( LOOP_ARGS_5 ); + } + } else { +// #pragma simd + LOOP_5R(index_type, m_tiledims) { + apply( LOOP_ARGS_5 ); + } + } + } // end RP::Right + + } //end op() rank == 5 + + + template + inline + void operator_impl( IType tile_idx , const RankTag<6> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_6L(index_type, m_tiledims) { + apply( LOOP_ARGS_6 ); + } + } else { +// #pragma simd + LOOP_6L(index_type, m_tiledims) { + apply( LOOP_ARGS_6 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_6R(index_type, m_tiledims) { + apply( LOOP_ARGS_6 ); + } + } else { +// #pragma simd + LOOP_6R(index_type, m_tiledims) { + apply( LOOP_ARGS_6 ); + } + } + } // end RP::Right + + } //end op() rank == 6 + + + template + inline + void operator_impl( IType tile_idx , const RankTag<7> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_7L(index_type, m_tiledims) { + apply( LOOP_ARGS_7 ); + } + } else { +// #pragma simd + LOOP_7L(index_type, m_tiledims) { + apply( LOOP_ARGS_7 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_7R(index_type, m_tiledims) { + apply( LOOP_ARGS_7 ); + } + } else { +// #pragma simd + LOOP_7R(index_type, m_tiledims) { + apply( LOOP_ARGS_7 ); + } + } + } // end RP::Right + + } //end op() rank == 7 + + + template + inline + void operator_impl( IType tile_idx , const RankTag<8> ) const + { + point_type m_offset; + point_type m_tiledims; + + if (RP::outer_direction == RP::Left) { + for (int i=0; i=0; --i) { + m_offset[i] = (tile_idx % m_rp.m_tile_end[i]) * m_rp.m_tile[i] + m_rp.m_lower[i] ; + tile_idx /= m_rp.m_tile_end[i]; + } + } + + //Check if offset+tiledim in bounds - if not, replace tile dims with the partial tile dims + const bool full_tile = check_iteration_bounds(m_tiledims , m_offset) ; + + if (RP::inner_direction == RP::Left) { + if ( full_tile ) { +// #pragma simd + LOOP_8L(index_type, m_tiledims) { + apply( LOOP_ARGS_8 ); + } + } else { +// #pragma simd + LOOP_8L(index_type, m_tiledims) { + apply( LOOP_ARGS_8 ); + } + } + } // end RP::Left + else { + if ( full_tile ) { +// #pragma simd + LOOP_8R(index_type, m_tiledims) { + apply( LOOP_ARGS_8 ); + } + } else { +// #pragma simd + LOOP_8R(index_type, m_tiledims) { + apply( LOOP_ARGS_8 ); + } + } + } // end RP::Right + + } //end op() rank == 8 +#endif + + + template + typename std::enable_if<( sizeof...(Args) == RP::rank && std::is_same::value), void>::type + apply(Args &&... args) const + { + m_func(args... , m_v); + } + + template + typename std::enable_if<( sizeof...(Args) == RP::rank && !std::is_same::value), void>::type + apply(Args &&... args) const + { + m_func( m_tag, args... , m_v); + } + + + RP const& m_rp; + Functor const& m_func; + value_type * m_v; + typename std::conditional< std::is_same::value,int,Tag>::type m_tag; + +}; + + // ------------------------------------------------------------------ // // MDFunctor - wraps the range_policy and functor to pass to IterateTile -// Serial, Threads, OpenMP +// Used for md_parallel_{for,reduce} with Serial, Threads, OpenMP // Cuda uses DeviceIterateTile directly within md_parallel_for -// ParallelReduce +// TODO Once md_parallel_{for,reduce} removed, this can be removed + +namespace Experimental { + +// ParallelReduce - scalar reductions template < typename MDRange, typename Functor, typename ValueType = void > struct MDFunctor { @@ -2265,15 +2761,15 @@ struct MDFunctor using value_type = ValueType; using work_tag = typename range_policy::work_tag; using index_type = typename range_policy::index_type; - using iterate_type = typename Kokkos::Experimental::Impl::HostIterateTile< MDRange - , Functor - , work_tag - , value_type - >; + using iterate_type = typename Kokkos::Impl::HostIterateTile< MDRange + , Functor + , work_tag + , value_type + >; inline - MDFunctor( MDRange const& range, Functor const& f, ValueType & v ) + MDFunctor( MDRange const& range, Functor const& f ) : m_range( range ) , m_func( f ) {} @@ -2290,7 +2786,6 @@ struct MDFunctor inline MDFunctor& operator=( MDFunctor && ) = default; -// KOKKOS_FORCEINLINE_FUNCTION //Caused cuda warning - __host__ warning inline void operator()(index_type t, value_type & v) const { @@ -2301,6 +2796,56 @@ struct MDFunctor Functor m_func; }; + +// ParallelReduce - array reductions +template < typename MDRange, typename Functor, typename ValueType > +struct MDFunctor< MDRange, Functor, ValueType[] > +{ + using range_policy = MDRange; + using functor_type = Functor; + using value_type = ValueType[]; + using work_tag = typename range_policy::work_tag; + using index_type = typename range_policy::index_type; + using iterate_type = typename Kokkos::Impl::HostIterateTile< MDRange + , Functor + , work_tag + , value_type + >; + + + inline + MDFunctor( MDRange const& range, Functor const& f ) + : m_range( range ) + , m_func( f ) + , value_count( f.value_count ) + {} + + inline + MDFunctor( MDFunctor const& ) = default; + + inline + MDFunctor& operator=( MDFunctor const& ) = default; + + inline + MDFunctor( MDFunctor && ) = default; + + inline + MDFunctor& operator=( MDFunctor && ) = default; + + // FIXME Init and Join, as defined in m_func, are not working through the MDFunctor + // Best path forward is to eliminate need for MDFunctor, directly use MDRangePolicy within Parallel{For,Reduce} ?? + inline + void operator()(index_type t, value_type v) const + { + iterate_type(m_range, m_func, v)(t); + } + + MDRange m_range; + Functor m_func; + size_t value_count; +}; + + // ParallelFor template < typename MDRange, typename Functor > struct MDFunctor< MDRange, Functor, void > @@ -2309,11 +2854,11 @@ struct MDFunctor< MDRange, Functor, void > using functor_type = Functor; using work_tag = typename range_policy::work_tag; using index_type = typename range_policy::index_type; - using iterate_type = typename Kokkos::Experimental::Impl::HostIterateTile< MDRange - , Functor - , work_tag - , void - >; + using iterate_type = typename Kokkos::Impl::HostIterateTile< MDRange + , Functor + , work_tag + , void + >; inline @@ -2344,9 +2889,9 @@ struct MDFunctor< MDRange, Functor, void > Functor m_func; }; +} // end namespace Experimental #undef KOKKOS_ENABLE_NEW_LOOP_MACROS -} } } //end namespace Kokkos::Experimental::Impl +} } //end namespace Kokkos::Impl #endif - diff --git a/lib/kokkos/core/src/impl/Kokkos_AnalyzePolicy.hpp b/lib/kokkos/core/src/impl/Kokkos_AnalyzePolicy.hpp index c5685c5b62..3fb15c8d1e 100644 --- a/lib/kokkos/core/src/impl/Kokkos_AnalyzePolicy.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_AnalyzePolicy.hpp @@ -55,16 +55,19 @@ template < typename ExecutionSpace = void , typename WorkTag = void , typename IndexType = void , typename IterationPattern = void + , typename LaunchBounds = void > struct PolicyTraitsBase { - using type = PolicyTraitsBase< ExecutionSpace, Schedule, WorkTag, IndexType, IterationPattern>; + using type = PolicyTraitsBase< ExecutionSpace, Schedule, WorkTag, IndexType, + IterationPattern, LaunchBounds>; using execution_space = ExecutionSpace; using schedule_type = Schedule; using work_tag = WorkTag; using index_type = IndexType; using iteration_pattern = IterationPattern; + using launch_bounds = LaunchBounds; }; @@ -78,6 +81,7 @@ struct SetExecutionSpace , typename PolicyBase::work_tag , typename PolicyBase::index_type , typename PolicyBase::iteration_pattern + , typename PolicyBase::launch_bounds >; }; @@ -91,6 +95,7 @@ struct SetSchedule , typename PolicyBase::work_tag , typename PolicyBase::index_type , typename PolicyBase::iteration_pattern + , typename PolicyBase::launch_bounds >; }; @@ -104,6 +109,7 @@ struct SetWorkTag , WorkTag , typename PolicyBase::index_type , typename PolicyBase::iteration_pattern + , typename PolicyBase::launch_bounds >; }; @@ -117,6 +123,7 @@ struct SetIndexType , typename PolicyBase::work_tag , IndexType , typename PolicyBase::iteration_pattern + , typename PolicyBase::launch_bounds >; }; @@ -131,6 +138,22 @@ struct SetIterationPattern , typename PolicyBase::work_tag , typename PolicyBase::index_type , IterationPattern + , typename PolicyBase::launch_bounds + >; +}; + + +template +struct SetLaunchBounds +{ + static_assert( is_void::value + , "Kokkos Error: More than one launch_bounds given" ); + using type = PolicyTraitsBase< typename PolicyBase::execution_space + , typename PolicyBase::schedule_type + , typename PolicyBase::work_tag + , typename PolicyBase::index_type + , typename PolicyBase::iteration_pattern + , LaunchBounds >; }; @@ -146,8 +169,9 @@ struct AnalyzePolicy : public , typename std::conditional< is_index_type::value , SetIndexType , typename std::conditional< std::is_integral::value , SetIndexType > , typename std::conditional< is_iteration_pattern::value, SetIterationPattern + , typename std::conditional< is_launch_bounds::value , SetLaunchBounds , SetWorkTag - >::type >::type >::type >::type>::type::type + >::type >::type >::type >::type >::type>::type::type , Traits... > {}; @@ -178,11 +202,18 @@ struct AnalyzePolicy , void // TODO set default iteration pattern , typename Base::iteration_pattern >::type; + + using launch_bounds = typename std::conditional< is_void< typename Base::launch_bounds >::value + , LaunchBounds<> + , typename Base::launch_bounds + >::type; + using type = PolicyTraitsBase< execution_space , schedule_type , work_tag , index_type , iteration_pattern + , launch_bounds >; }; diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Compare_Exchange_Strong.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Compare_Exchange_Strong.hpp index 010b15064e..bc0d969699 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Compare_Exchange_Strong.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Compare_Exchange_Strong.hpp @@ -41,10 +41,18 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_ATOMIC_COMPARE_EXCHANGE_STRONG_HPP ) #define KOKKOS_ATOMIC_COMPARE_EXCHANGE_STRONG_HPP +#if defined(KOKKOS_ENABLE_CUDA) +#include +#endif + namespace Kokkos { //---------------------------------------------------------------------------- @@ -99,7 +107,7 @@ T atomic_compare_exchange( volatile T * const dest , const T & compare , T return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; - unsigned int active = __ballot(1); + unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); unsigned int done_active = 0; while (active!=done_active) { if(!done) { @@ -111,7 +119,7 @@ T atomic_compare_exchange( volatile T * const dest , const T & compare , done = 1; } } - done_active = __ballot(done); + done_active = KOKKOS_IMPL_CUDA_BALLOT(done); } return return_val; } @@ -121,16 +129,27 @@ T atomic_compare_exchange( volatile T * const dest , const T & compare , //---------------------------------------------------------------------------- // GCC native CAS supports int, long, unsigned int, unsigned long. // Intel native CAS support int and long with the same interface as GCC. +#if !defined(KOKKOS_ENABLE_ROCM_ATOMICS) #if !defined(__CUDA_ARCH__) || defined(KOKKOS_IMPL_CUDA_CLANG_WORKAROUND) #if defined(KOKKOS_ENABLE_GNU_ATOMICS) || defined(KOKKOS_ENABLE_INTEL_ATOMICS) inline int atomic_compare_exchange( volatile int * const dest, const int compare, const int val) -{ return __sync_val_compare_and_swap(dest,compare,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_val_compare_and_swap(dest,compare,val); +} inline long atomic_compare_exchange( volatile long * const dest, const long compare, const long val ) -{ return __sync_val_compare_and_swap(dest,compare,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_val_compare_and_swap(dest,compare,val); +} #if defined( KOKKOS_ENABLE_GNU_ATOMICS ) @@ -159,6 +178,10 @@ T atomic_compare_exchange( volatile T * const dest, const T & compare, KOKKOS_INLINE_FUNCTION U() {}; } tmp ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + tmp.i = __sync_val_compare_and_swap( (int*) dest , *((int*)&compare) , *((int*)&val) ); return tmp.t ; } @@ -175,6 +198,10 @@ T atomic_compare_exchange( volatile T * const dest, const T & compare, KOKKOS_INLINE_FUNCTION U() {}; } tmp ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + tmp.i = __sync_val_compare_and_swap( (long*) dest , *((long*)&compare) , *((long*)&val) ); return tmp.t ; } @@ -193,6 +220,10 @@ T atomic_compare_exchange( volatile T * const dest, const T & compare, KOKKOS_INLINE_FUNCTION U() {}; } tmp ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + tmp.i = Impl::cas128( (Impl::cas128_t*) dest , *((Impl::cas128_t*)&compare) , *((Impl::cas128_t*)&val) ); return tmp.t ; } @@ -209,6 +240,10 @@ T atomic_compare_exchange( volatile T * const dest , const T compare , #endif , const T >::type& val ) { +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + while( !Impl::lock_address_host_space( (void*) dest ) ); T return_val = *dest; if( return_val == compare ) { @@ -250,6 +285,7 @@ T atomic_compare_exchange( volatile T * const dest, const T compare, const T val #endif #endif +#endif // !defined ROCM_ATOMICS template KOKKOS_INLINE_FUNCTION diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Decrement.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Decrement.hpp index 127de528f5..2a13a4865c 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Decrement.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Decrement.hpp @@ -41,6 +41,10 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP) && ! defined( KOKKOS_ATOMIC_DECREMENT_HPP ) #define KOKKOS_ATOMIC_DECREMENT_HPP @@ -54,6 +58,10 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_decrement(volatile char* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif + __asm__ __volatile__( "lock decb %0" : /* no output registers */ @@ -69,6 +77,10 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_decrement(volatile short* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif + __asm__ __volatile__( "lock decw %0" : /* no output registers */ @@ -84,6 +96,10 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_decrement(volatile int* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif + __asm__ __volatile__( "lock decl %0" : /* no output registers */ @@ -99,6 +115,9 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_decrement(volatile long long int* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif __asm__ __volatile__( "lock decq %0" : /* no output registers */ diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Exchange.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Exchange.hpp index a1ff47abce..2f5bfd44e8 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Exchange.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Exchange.hpp @@ -41,10 +41,18 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_ATOMIC_EXCHANGE_HPP ) #define KOKKOS_ATOMIC_EXCHANGE_HPP +#if defined(KOKKOS_ENABLE_CUDA) +#include +#endif + namespace Kokkos { //---------------------------------------------------------------------------- @@ -81,6 +89,10 @@ T atomic_exchange( typename Kokkos::Impl::enable_if< sizeof(T) == sizeof(int) , const T & >::type val ) { // int tmp = __ullAtomicExch( (int*) dest , *((int*)&val) ); +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + int tmp = atomicExch( ((int*)dest) , *((int*)&val) ); return *((T*)&tmp); } @@ -93,6 +105,11 @@ T atomic_exchange( sizeof(T) == sizeof(unsigned long long int) , const T & >::type val ) { typedef unsigned long long int type ; + +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + // type tmp = __ullAtomicExch( (type*) dest , *((type*)&val) ); type tmp = atomicExch( ((type*)dest) , *((type*)&val) ); return *((T*)&tmp); @@ -108,8 +125,12 @@ T atomic_exchange( volatile T * const dest , { T return_val; // This is a way to (hopefully) avoid dead lock in a warp +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + int done = 0; - unsigned int active = __ballot(1); + unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); unsigned int done_active = 0; while (active!=done_active) { if(!done) { @@ -120,7 +141,7 @@ T atomic_exchange( volatile T * const dest , done = 1; } } - done_active = __ballot(done); + done_active = KOKKOS_IMPL_CUDA_BALLOT(done); } return return_val; } @@ -173,6 +194,9 @@ T atomic_exchange( volatile T * const dest , , const T & >::type val ) { typedef typename Kokkos::Impl::if_c< sizeof(T) == sizeof(int) , int , long >::type type ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif const type v = *((type*)&val); // Extract to be sure the value doesn't change @@ -201,6 +225,10 @@ T atomic_exchange( volatile T * const dest , typename Kokkos::Impl::enable_if< sizeof(T) == sizeof(Impl::cas128_t) , const T & >::type val ) { +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + union U { Impl::cas128_t i ; T t ; @@ -260,6 +288,10 @@ void atomic_assign( volatile T * const dest , { typedef typename Kokkos::Impl::if_c< sizeof(T) == sizeof(int) , int , long >::type type ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + const type v = *((type*)&val); // Extract to be sure the value doesn't change type assumed ; @@ -285,6 +317,10 @@ void atomic_assign( volatile T * const dest , typename Kokkos::Impl::enable_if< sizeof(T) == sizeof(Impl::cas128_t) , const T & >::type val ) { +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + union U { Impl::cas128_t i ; T t ; diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Add.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Add.hpp index 860c8e0e43..dfdd133a3c 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Add.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Add.hpp @@ -41,10 +41,18 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_ATOMIC_FETCH_ADD_HPP ) #define KOKKOS_ATOMIC_FETCH_ADD_HPP +#if defined(KOKKOS_ENABLE_CUDA) +#include +#endif + namespace Kokkos { //---------------------------------------------------------------------------- @@ -135,7 +143,7 @@ T atomic_fetch_add( volatile T * const dest , T return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; - unsigned int active = __ballot(1); + unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); unsigned int done_active = 0; while (active!=done_active) { if(!done) { @@ -147,13 +155,14 @@ T atomic_fetch_add( volatile T * const dest , done = 1; } } - done_active = __ballot(done); + done_active = KOKKOS_IMPL_CUDA_BALLOT(done); } return return_val; } #endif #endif //---------------------------------------------------------------------------- +#if !defined(KOKKOS_ENABLE_ROCM_ATOMICS) #if !defined(__CUDA_ARCH__) || defined(KOKKOS_IMPL_CUDA_CLANG_WORKAROUND) #if defined(KOKKOS_ENABLE_GNU_ATOMICS) || defined(KOKKOS_ENABLE_INTEL_ATOMICS) @@ -161,36 +170,60 @@ T atomic_fetch_add( volatile T * const dest , inline int atomic_fetch_add( volatile int * dest , const int val ) { - int original = val; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif - __asm__ __volatile__( - "lock xadd %1, %0" - : "+m" (*dest), "+r" (original) - : "m" (*dest), "r" (original) - : "memory" + int original = val; + + __asm__ __volatile__( + "lock xadd %1, %0" + : "+m" (*dest), "+r" (original) + : "m" (*dest), "r" (original) + : "memory" ); - return original; + return original; } #else inline int atomic_fetch_add( volatile int * const dest , const int val ) -{ return __sync_fetch_and_add(dest, val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_add(dest, val); +} #endif inline long int atomic_fetch_add( volatile long int * const dest , const long int val ) -{ return __sync_fetch_and_add(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_add(dest,val); +} #if defined( KOKKOS_ENABLE_GNU_ATOMICS ) inline unsigned int atomic_fetch_add( volatile unsigned int * const dest , const unsigned int val ) -{ return __sync_fetch_and_add(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_add(dest,val); +} inline unsigned long int atomic_fetch_add( volatile unsigned long int * const dest , const unsigned long int val ) -{ return __sync_fetch_and_add(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_add(dest,val); +} #endif @@ -205,6 +238,10 @@ T atomic_fetch_add( volatile T * const dest , inline U() {}; } assume , oldval , newval ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + oldval.t = *dest ; do { @@ -228,6 +265,10 @@ T atomic_fetch_add( volatile T * const dest , inline U() {}; } assume , oldval , newval ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + oldval.t = *dest ; do { @@ -253,6 +294,10 @@ T atomic_fetch_add( volatile T * const dest , inline U() {}; } assume , oldval , newval ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + oldval.t = *dest ; do { @@ -315,6 +360,7 @@ T atomic_fetch_add( volatile T * const dest , const T val ) #endif #endif +#endif // !defined ROCM_ATOMICS //---------------------------------------------------------------------------- // Simpler version of atomic_fetch_add without the fetch diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_And.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_And.hpp index 83f5b2a5aa..6ecb65336c 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_And.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_And.hpp @@ -41,6 +41,10 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_ATOMIC_FETCH_AND_HPP ) #define KOKKOS_ATOMIC_FETCH_AND_HPP @@ -76,21 +80,41 @@ unsigned long long int atomic_fetch_and( volatile unsigned long long int * const inline int atomic_fetch_and( volatile int * const dest , const int val ) -{ return __sync_fetch_and_and(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_and(dest,val); +} inline long int atomic_fetch_and( volatile long int * const dest , const long int val ) -{ return __sync_fetch_and_and(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_and(dest,val); +} #if defined( KOKKOS_ENABLE_GNU_ATOMICS ) inline unsigned int atomic_fetch_and( volatile unsigned int * const dest , const unsigned int val ) -{ return __sync_fetch_and_and(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_and(dest,val); +} inline unsigned long int atomic_fetch_and( volatile unsigned long int * const dest , const unsigned long int val ) -{ return __sync_fetch_and_and(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_and(dest,val); +} #endif diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Or.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Or.hpp index 8c73b4c3ef..ed3b438f89 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Or.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Or.hpp @@ -41,6 +41,10 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_ATOMIC_FETCH_OR_HPP ) #define KOKKOS_ATOMIC_FETCH_OR_HPP @@ -76,21 +80,41 @@ unsigned long long int atomic_fetch_or( volatile unsigned long long int * const inline int atomic_fetch_or( volatile int * const dest , const int val ) -{ return __sync_fetch_and_or(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_or(dest,val); +} inline long int atomic_fetch_or( volatile long int * const dest , const long int val ) -{ return __sync_fetch_and_or(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_or(dest,val); +} #if defined( KOKKOS_ENABLE_GNU_ATOMICS ) inline unsigned int atomic_fetch_or( volatile unsigned int * const dest , const unsigned int val ) -{ return __sync_fetch_and_or(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_or(dest,val); +} inline unsigned long int atomic_fetch_or( volatile unsigned long int * const dest , const unsigned long int val ) -{ return __sync_fetch_and_or(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_or(dest,val); +} #endif diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp index 504731d3a2..fc8955d909 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp @@ -41,10 +41,18 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_ATOMIC_FETCH_SUB_HPP ) #define KOKKOS_ATOMIC_FETCH_SUB_HPP +#if defined(KOKKOS_ENABLE_CUDA) +#include +#endif + namespace Kokkos { //---------------------------------------------------------------------------- @@ -113,7 +121,7 @@ T atomic_fetch_sub( volatile T * const dest , T return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; - unsigned int active = __ballot(1); + unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); unsigned int done_active = 0; while (active!=done_active) { if(!done) { @@ -124,33 +132,54 @@ T atomic_fetch_sub( volatile T * const dest , done = 1; } } - done_active = __ballot(done); + done_active = KOKKOS_IMPL_CUDA_BALLOT(done); } return return_val; } #endif #endif //---------------------------------------------------------------------------- +#if !defined(KOKKOS_ENABLE_ROCM_ATOMICS) #if !defined(__CUDA_ARCH__) || defined(KOKKOS_IMPL_CUDA_CLANG_WORKAROUND) #if defined(KOKKOS_ENABLE_GNU_ATOMICS) || defined(KOKKOS_ENABLE_INTEL_ATOMICS) inline int atomic_fetch_sub( volatile int * const dest , const int val ) -{ return __sync_fetch_and_sub(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_sub(dest,val); +} inline long int atomic_fetch_sub( volatile long int * const dest , const long int val ) -{ return __sync_fetch_and_sub(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_sub(dest,val); +} #if defined( KOKKOS_ENABLE_GNU_ATOMICS ) inline unsigned int atomic_fetch_sub( volatile unsigned int * const dest , const unsigned int val ) -{ return __sync_fetch_and_sub(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_sub(dest,val); +} inline unsigned long int atomic_fetch_sub( volatile unsigned long int * const dest , const unsigned long int val ) -{ return __sync_fetch_and_sub(dest,val); } +{ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + return __sync_fetch_and_sub(dest,val); +} #endif @@ -161,6 +190,10 @@ T atomic_fetch_sub( volatile T * const dest , { union { int i ; T t ; } assume , oldval , newval ; +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + oldval.t = *dest ; do { @@ -178,6 +211,10 @@ T atomic_fetch_sub( volatile T * const dest , typename Kokkos::Impl::enable_if< sizeof(T) != sizeof(int) && sizeof(T) == sizeof(long) , const T >::type val ) { +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + union { long i ; T t ; } assume , oldval , newval ; oldval.t = *dest ; @@ -202,6 +239,10 @@ T atomic_fetch_sub( volatile T * const dest , && ( sizeof(T) != 8 ) , const T >::type& val ) { +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) dest, _MM_HINT_ET0 ); +#endif + while( !Impl::lock_address_host_space( (void*) dest ) ); T return_val = *dest; *dest = return_val - val; @@ -227,6 +268,8 @@ T atomic_fetch_sub( volatile T * const dest , const T val ) #endif #endif +#endif // !defined ROCM_ATOMICS + // Simpler version of atomic_fetch_sub without the fetch template KOKKOS_INLINE_FUNCTION diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Generic.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Generic.hpp index 65578156d5..3a2a9e1f80 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Generic.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Generic.hpp @@ -46,6 +46,10 @@ #define KOKKOS_ATOMIC_GENERIC_HPP #include +#if defined(KOKKOS_ENABLE_CUDA) +#include +#endif + // Combination operands to be used in an Compare and Exchange based atomic operation namespace Kokkos { namespace Impl { @@ -238,11 +242,11 @@ T atomic_fetch_oper( const Oper& op, volatile T * const dest , *dest = Oper::apply(return_val, val); Impl::unlock_address_host_space( (void*) dest ); return return_val; -#else +#elif defined(KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA) // This is a way to (hopefully) avoid dead lock in a warp T return_val; int done = 0; - unsigned int active = __ballot(1); + unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); unsigned int done_active = 0; while (active!=done_active) { if(!done) { @@ -253,7 +257,7 @@ T atomic_fetch_oper( const Oper& op, volatile T * const dest , done=1; } } - done_active = __ballot(done); + done_active = KOKKOS_IMPL_CUDA_BALLOT(done); } return return_val; #endif @@ -277,11 +281,11 @@ T atomic_oper_fetch( const Oper& op, volatile T * const dest , *dest = return_val; Impl::unlock_address_host_space( (void*) dest ); return return_val; -#else +#elif defined(KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA) T return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; - unsigned int active = __ballot(1); + unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); unsigned int done_active = 0; while (active!=done_active) { if(!done) { @@ -292,7 +296,7 @@ T atomic_oper_fetch( const Oper& op, volatile T * const dest , done=1; } } - done_active = __ballot(done); + done_active = KOKKOS_IMPL_CUDA_BALLOT(done); } return return_val; #endif diff --git a/lib/kokkos/core/src/impl/Kokkos_Atomic_Increment.hpp b/lib/kokkos/core/src/impl/Kokkos_Atomic_Increment.hpp index 2985fad95e..e7626603fc 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Atomic_Increment.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Atomic_Increment.hpp @@ -41,6 +41,10 @@ //@HEADER */ +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) +#include +#endif + #include #if defined( KOKKOS_ATOMIC_HPP) && ! defined( KOKKOS_ATOMIC_INCREMENT_HPP ) #define KOKKOS_ATOMIC_INCREMENT_HPP @@ -52,6 +56,9 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_increment(volatile char* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif __asm__ __volatile__( "lock incb %0" : /* no output registers */ @@ -67,6 +74,9 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_increment(volatile short* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif __asm__ __volatile__( "lock incw %0" : /* no output registers */ @@ -82,6 +92,9 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_increment(volatile int* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif __asm__ __volatile__( "lock incl %0" : /* no output registers */ @@ -97,6 +110,9 @@ template<> KOKKOS_INLINE_FUNCTION void atomic_increment(volatile long long int* a) { #if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) && ! defined(_WIN32) && ! defined(__CUDA_ARCH__) +#if defined( KOKKOS_ENABLE_RFO_PREFETCH ) + _mm_prefetch( (const char*) a, _MM_HINT_ET0 ); +#endif __asm__ __volatile__( "lock incq %0" : /* no output registers */ diff --git a/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp b/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp index df16b3738b..18c61a209c 100644 --- a/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp @@ -48,6 +48,10 @@ #include #include +#if defined( __HCC_ACCELERATOR__ ) +#include +#endif + namespace Kokkos { namespace Impl { @@ -62,10 +66,14 @@ int bit_first_zero( unsigned i ) noexcept #if defined( __CUDA_ARCH__ ) return full != i ? __ffs( ~i ) - 1 : -1 ; +#elif defined( __HCC_ACCELERATOR__ ) + return full != i ? (int)hc::__firstbit_u32_u32(~i) : -1 ; #elif defined( KOKKOS_COMPILER_INTEL ) return full != i ? _bit_scan_forward( ~i ) : -1 ; #elif defined( KOKKOS_COMPILER_IBM ) return full != i ? __cnttz4( ~i ) : -1 ; +#elif defined( KOKKOS_COMPILER_CRAYC ) + return full != i ? _popcnt( i ^ (i+1) ) - 1 : -1 ; #elif defined( KOKKOS_COMPILER_GNU ) || defined( __GNUC__ ) || defined( __GNUG__ ) return full != i ? __builtin_ffs( ~i ) - 1 : -1 ; #else @@ -82,21 +90,22 @@ int bit_scan_forward( unsigned i ) { #if defined( __CUDA_ARCH__ ) return __ffs(i) - 1; +#elif defined( __HCC_ACCELERATOR__ ) + return (int)hc::__firstbit_u32_u32(i); #elif defined( KOKKOS_COMPILER_INTEL ) return _bit_scan_forward(i); #elif defined( KOKKOS_COMPILER_IBM ) return __cnttz4(i); +#elif defined( KOKKOS_COMPILER_CRAYC ) + return i ? _popcnt(~i & (i-1)) : -1; #elif defined( KOKKOS_COMPILER_GNU ) || defined( __GNUC__ ) || defined( __GNUG__ ) return __builtin_ffs(i) - 1; #else - unsigned t = 1u; - int r = 0; - while ( i && ( i & t == 0 ) ) - { - t = t << 1; - ++r; + int offset = -1; + if ( i ) { + for ( offset = 0 ; (i & ( 1 << offset ) ) == 0 ; ++offset ); } - return r; + return offset; #endif } @@ -106,21 +115,22 @@ int bit_scan_reverse( unsigned i ) enum { shift = static_cast( sizeof(unsigned) * CHAR_BIT - 1 ) }; #if defined( __CUDA_ARCH__ ) return shift - __clz(i); +#elif defined( __HCC_ACCELERATOR__ ) + return (int)hc::__firstbit_u32_u32(i); #elif defined( KOKKOS_COMPILER_INTEL ) return _bit_scan_reverse(i); #elif defined( KOKKOS_COMPILER_IBM ) return shift - __cntlz4(i); +#elif defined( KOKKOS_COMPILER_CRAYC ) + return i ? shift - _leadz32(i) : 0 ; #elif defined( __GNUC__ ) || defined( __GNUG__ ) return shift - __builtin_clz(i); #else - unsigned t = 1u << shift; - int r = 0; - while ( i && ( i & t == 0 ) ) - { - t = t >> 1; - ++r; + int offset = 0; + if ( i ) { + for ( offset = shift ; (i & ( 1 << offset ) ) == 0 ; --offset ); } - return r; + return offset; #endif } @@ -130,10 +140,14 @@ int bit_count( unsigned i ) { #if defined( __CUDA_ARCH__ ) return __popc(i); +#elif defined( __HCC_ACCELERATOR__ ) + return (int)hc::__popcount_u32_b32(i); #elif defined ( __INTEL_COMPILER ) return _popcnt32(i); #elif defined( KOKKOS_COMPILER_IBM ) return __popcnt4(i); +#elif defined( KOKKOS_COMPILER_CRAYC ) + return _popcnt(i); #elif defined( __GNUC__ ) || defined( __GNUG__ ) return __builtin_popcount(i); #else diff --git a/lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp b/lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp index 92111c3c59..c59c59d497 100644 --- a/lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp @@ -72,6 +72,10 @@ uint64_t clock_tic(void) noexcept return clock64(); +#elif defined(__HCC_ACCELERATOR__) + // Get clock register + return hc::__clock_u64(); + #elif defined( __i386__ ) || defined( __x86_64 ) // Return value of 64-bit hi-res clock register. diff --git a/lib/kokkos/core/src/impl/Kokkos_Core.cpp b/lib/kokkos/core/src/impl/Kokkos_Core.cpp index f0ff6d78ec..2d03cd2f72 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Core.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_Core.cpp @@ -51,9 +51,12 @@ //---------------------------------------------------------------------------- -namespace Kokkos { -namespace Impl { namespace { +bool g_is_initialized = false; +bool g_show_warnings = true; +} + +namespace Kokkos { namespace Impl { namespace { bool is_unsigned_int(const char* str) { @@ -75,29 +78,28 @@ void initialize_internal(const InitArguments& args) setenv("MEMKIND_HBW_NODES", "1", 0); #endif + if (args.disable_warnings) { + g_show_warnings = false; + } + // Protect declarations, to prevent "unused variable" warnings. #if defined( KOKKOS_ENABLE_OPENMP ) || defined( KOKKOS_ENABLE_THREADS ) || defined( KOKKOS_ENABLE_OPENMPTARGET ) const int num_threads = args.num_threads; const int use_numa = args.num_numa; #endif // defined( KOKKOS_ENABLE_OPENMP ) || defined( KOKKOS_ENABLE_THREADS ) -#if defined( KOKKOS_ENABLE_CUDA ) +#if defined( KOKKOS_ENABLE_CUDA ) || defined( KOKKOS_ENABLE_ROCM ) const int use_gpu = args.device_id; #endif // defined( KOKKOS_ENABLE_CUDA ) #if defined( KOKKOS_ENABLE_OPENMP ) if( std::is_same< Kokkos::OpenMP , Kokkos::DefaultExecutionSpace >::value || std::is_same< Kokkos::OpenMP , Kokkos::HostSpace::execution_space >::value ) { - if(num_threads>0) { - if(use_numa>0) { - Kokkos::OpenMP::initialize(num_threads,use_numa); - } - else { - Kokkos::OpenMP::initialize(num_threads); - } - } else { - Kokkos::OpenMP::initialize(); + if(use_numa>0) { + Kokkos::OpenMP::initialize(num_threads,use_numa); + } + else { + Kokkos::OpenMP::initialize(num_threads); } - //std::cout << "Kokkos::initialize() fyi: OpenMP enabled and initialized" << std::endl ; } else { //std::cout << "Kokkos::initialize() fyi: OpenMP enabled but not initialized" << std::endl ; @@ -130,10 +132,8 @@ setenv("MEMKIND_HBW_NODES", "1", 0); // struct, you may remove this line of code. (void) args; - if( std::is_same< Kokkos::Serial , Kokkos::DefaultExecutionSpace >::value || - std::is_same< Kokkos::Serial , Kokkos::HostSpace::execution_space >::value ) { - Kokkos::Serial::initialize(); - } + // Always initialize Serial if it is configure time enabled + Kokkos::Serial::initialize(); #endif #if defined( KOKKOS_ENABLE_OPENMPTARGET ) @@ -167,9 +167,22 @@ setenv("MEMKIND_HBW_NODES", "1", 0); } #endif +#if defined( KOKKOS_ENABLE_ROCM ) + if( std::is_same< Kokkos::Experimental::ROCm , Kokkos::DefaultExecutionSpace >::value || 0 < use_gpu ) { + if (use_gpu > -1) { + Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice( use_gpu ) ); + } + else { + Kokkos::Experimental::ROCm::initialize(); + } + std::cout << "Kokkos::initialize() fyi: ROCm enabled and initialized" << std::endl ; + } +#endif + #if defined(KOKKOS_ENABLE_PROFILING) Kokkos::Profiling::initialize(); #endif + g_is_initialized = true; } void finalize_internal( const bool all_spaces = false ) @@ -186,6 +199,13 @@ void finalize_internal( const bool all_spaces = false ) } #endif +#if defined( KOKKOS_ENABLE_ROCM ) + if( std::is_same< Kokkos::Experimental::ROCm , Kokkos::DefaultExecutionSpace >::value || all_spaces ) { + if(Kokkos::Experimental::ROCm::is_initialized()) + Kokkos::Experimental::ROCm::finalize(); + } +#endif + #if defined( KOKKOS_ENABLE_OPENMPTARGET ) if( std::is_same< Kokkos::Experimental::OpenMPTarget , Kokkos::DefaultExecutionSpace >::value || all_spaces ) { if(Kokkos::Experimental::OpenMPTarget::is_initialized()) @@ -212,13 +232,12 @@ void finalize_internal( const bool all_spaces = false ) #endif #if defined( KOKKOS_ENABLE_SERIAL ) - if( std::is_same< Kokkos::Serial , Kokkos::DefaultExecutionSpace >::value || - std::is_same< Kokkos::Serial , Kokkos::HostSpace::execution_space >::value || - all_spaces ) { - if(Kokkos::Serial::is_initialized()) - Kokkos::Serial::finalize(); - } + if(Kokkos::Serial::is_initialized()) + Kokkos::Serial::finalize(); #endif + + g_is_initialized = false; + g_show_warnings = true; } void fence_internal() @@ -230,6 +249,12 @@ void fence_internal() } #endif +#if defined( KOKKOS_ENABLE_ROCM ) + if( std::is_same< Kokkos::Experimental::ROCm , Kokkos::DefaultExecutionSpace >::value ) { + Kokkos::Experimental::ROCm::fence(); + } +#endif + #if defined( KOKKOS_ENABLE_OPENMP ) if( std::is_same< Kokkos::OpenMP , Kokkos::DefaultExecutionSpace >::value || std::is_same< Kokkos::OpenMP , Kokkos::HostSpace::execution_space >::value ) { @@ -286,9 +311,7 @@ bool check_int_arg(char const* arg, char const* expected, int* value) { return true; } -} // namespace -} // namespace Impl -} // namespace Kokkos +}}} // namespace Kokkos::Impl::{unnamed} //---------------------------------------------------------------------------- @@ -299,6 +322,7 @@ void initialize(int& narg, char* arg[]) int num_threads = -1; int numa = -1; int device = -1; + bool disable_warnings = false; int kokkos_threads_found = 0; int kokkos_numa_found = 0; @@ -353,6 +377,7 @@ void initialize(int& narg, char* arg[]) } if((strncmp(arg[iarg],"--kokkos-ndevices",17) == 0) || !kokkos_ndevices_found) ndevices = atoi(num1_only); + delete [] num1_only; if( num2 != NULL ) { if(( !Impl::is_unsigned_int(num2+1) ) || (strlen(num2)==1) ) @@ -395,6 +420,12 @@ void initialize(int& narg, char* arg[]) } else { iarg++; } + } else if ( strcmp(arg[iarg],"--kokkos-disable-warnings") == 0) { + disable_warnings = true; + for(int k=iarg;k(Impl::is_array< typename FunctorType::value_type >::value) }; + // If not an array then what is the sizeof(value_type) - enum { StaticValueSize = Impl::is_array< typename FunctorType::value_type >::value ? 0 : sizeof(value_type) }; + enum { StaticValueSize = IsArray ? 0 : sizeof(value_type) }; typedef value_type * pointer_type ; // The reference_type for an array is 'value_type *' // The reference_type for a single value is 'value_type &' - typedef typename Impl::if_c< ! StaticValueSize , value_type * - , value_type & >::type reference_type ; + typedef typename Impl::if_c< IsArray , value_type * + , value_type & >::type reference_type ; // Number of values if single value template< class F > KOKKOS_FORCEINLINE_FUNCTION static - typename Impl::enable_if< std::is_same::value && StaticValueSize , unsigned >::type + typename Impl::enable_if< std::is_same::value && ! IsArray , unsigned >::type value_count( const F & ) { return 1 ; } // Number of values if an array, protect via templating because 'f.value_count' // will only exist when the functor declares the value_type to be an array. template< class F > KOKKOS_FORCEINLINE_FUNCTION static - typename Impl::enable_if< std::is_same::value && ! StaticValueSize , unsigned >::type + typename Impl::enable_if< std::is_same::value && IsArray , unsigned >::type value_count( const F & f ) { return f.value_count ; } // Total size of the value @@ -473,7 +476,7 @@ template< class FunctorType , class ArgTag , class T , class Enable > struct FunctorValueInit< FunctorType , ArgTag , T & , Enable > { KOKKOS_FORCEINLINE_FUNCTION static - T & init( const FunctorType & f , void * p ) + T & init( const FunctorType & , void * p ) { return *( new(p) T() ); }; }; diff --git a/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp b/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp index 8cb7430035..cd0553218d 100644 --- a/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp @@ -70,62 +70,6 @@ #ifdef KOKKOS_ENABLE_HBWSPACE #define MEMKIND_TYPE MEMKIND_HBW //hbw_get_kind(HBW_PAGESIZE_4KB) -namespace Kokkos { -namespace Experimental { -namespace { - -static const int QUERY_SPACE_IN_PARALLEL_MAX = 16 ; - -typedef int (* QuerySpaceInParallelPtr )(); - -QuerySpaceInParallelPtr s_in_parallel_query[ QUERY_SPACE_IN_PARALLEL_MAX ] ; -int s_in_parallel_query_count = 0 ; - -} // namespace - -void HBWSpace::register_in_parallel( int (*device_in_parallel)() ) -{ - if ( 0 == device_in_parallel ) { - Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Experimental::HBWSpace::register_in_parallel ERROR : given NULL" ) ); - } - - int i = -1 ; - - if ( ! (device_in_parallel)() ) { - for ( i = 0 ; i < s_in_parallel_query_count && ! (*(s_in_parallel_query[i]))() ; ++i ); - } - - if ( i < s_in_parallel_query_count ) { - Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Experimental::HBWSpace::register_in_parallel_query ERROR : called in_parallel" ) ); - - } - - if ( QUERY_SPACE_IN_PARALLEL_MAX <= i ) { - Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Experimental::HBWSpace::register_in_parallel_query ERROR : exceeded maximum" ) ); - - } - - for ( i = 0 ; i < s_in_parallel_query_count && s_in_parallel_query[i] != device_in_parallel ; ++i ); - - if ( i == s_in_parallel_query_count ) { - s_in_parallel_query[s_in_parallel_query_count++] = device_in_parallel ; - } -} - -int HBWSpace::in_parallel() -{ - const int n = s_in_parallel_query_count ; - - int i = 0 ; - - while ( i < n && ! (*(s_in_parallel_query[i]))() ) { ++i ; } - - return i < n ; -} - -} // namespace Experiemtal -} // namespace Kokkos - /*--------------------------------------------------------------------------*/ namespace Kokkos { @@ -222,10 +166,6 @@ void HBWSpace::deallocate( void * const arg_alloc_ptr , const size_t arg_alloc_s } } -constexpr const char* HBWSpace::name() { - return m_name; -} - } // namespace Experimental } // namespace Kokkos diff --git a/lib/kokkos/core/src/impl/Kokkos_HostBarrier.cpp b/lib/kokkos/core/src/impl/Kokkos_HostBarrier.cpp new file mode 100644 index 0000000000..e382acae32 --- /dev/null +++ b/lib/kokkos/core/src/impl/Kokkos_HostBarrier.cpp @@ -0,0 +1,204 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +#include +#include + +namespace Kokkos { namespace Impl { + +namespace { + +enum : int { HEADER_SIZE = HostBarrier::HEADER / sizeof(uint64_t) }; + +inline constexpr int length64( const int nthreads ) noexcept +{ + return (nthreads-1 + sizeof(uint64_t)-1) / sizeof(uint64_t); +} + +} // namespace + +void rendezvous_initialize( volatile void * buffer + , const int size + , const int rank + ) noexcept +{ + Kokkos::store_fence(); + + // ensure that the buffer has been zero'd out + constexpr uint8_t zero8 = static_cast(0); + constexpr uint64_t zero64 = static_cast(0); + + volatile uint64_t * header = reinterpret_cast(buffer); + + if (rank > 0) { + volatile uint8_t * bytes = reinterpret_cast(buffer) + RENDEZVOUS_HEADER; + + bytes[rank-1] = zero8; + + // last thread is responsible for zeroing out the final bytes of the last uint64_t + if (rank == size-1) { + const int tmp = (size-1) % sizeof(uint64_t); + const int rem = tmp ? sizeof(uint64_t) - tmp : 0; + for (int i=0; i(buffer) + HEADER_SIZE; + + // wait for other threads to finish initializing + for (int i=0; i(step + 1u) + ? step + 1u + : step + 2u + ; + + // if size == 1, it is incorrect for rank 0 to check the tail value of the buffer + // this optimization prevents a potential read of uninitialized memory + if ( size == 1 ) { return true; } + + const uint8_t byte_value = static_cast(step); + + // byte that is set in the spin_value rotates every time + // this prevents threads from overtaking the master thread + const uint64_t spin_value = static_cast(byte_value) << (byte_value&7); + + if ( rank > 0 ) { + volatile uint64_t * header = reinterpret_cast(buffer); + volatile uint8_t * bytes = reinterpret_cast(buffer) + RENDEZVOUS_HEADER; + + bytes[ rank-1 ] = byte_value; + + if ( active_wait ) { + spinwait_until_equal( *header, spin_value ); + } + else { + yield_until_equal( *header, spin_value ); + } + } + else { // rank 0 + volatile uint64_t * buff = reinterpret_cast(buffer) + HEADER_SIZE; + const int n = length64(size); + + uint64_t comp = byte_value; + comp = comp | (comp << 8); + comp = comp | (comp << 16); + comp = comp | (comp << 32); + + const int rem = (size-1) % sizeof(uint64_t); + + union { + volatile uint64_t value; + volatile uint8_t array[sizeof(uint64_t)]; + } tmp{}; + + for (int i=0; i(step); + const uint64_t spin_value = static_cast(byte_value) << (byte_value&7); + volatile uint64_t * header = reinterpret_cast(buffer); + + // Force all outstanding stores from this thread to retire before releasing + // the other threads. This forces correctness on systems with out-of-order + // memory (Power and ARM) + Kokkos::store_fence(); + + *header = spin_value; + + Kokkos::memory_fence(); +} + +}} // namespace Kokkos::Impl + diff --git a/lib/kokkos/core/src/impl/Kokkos_HostBarrier.hpp b/lib/kokkos/core/src/impl/Kokkos_HostBarrier.hpp new file mode 100644 index 0000000000..733b69e79f --- /dev/null +++ b/lib/kokkos/core/src/impl/Kokkos_HostBarrier.hpp @@ -0,0 +1,146 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_HOST_BARRIER_HPP +#define KOKKOS_HOST_BARRIER_HPP + +#include +#include + +namespace Kokkos { namespace Impl { + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +enum : int { RENDEZVOUS_ALIGNMENT = 128 + , RENDEZVOUS_HEADER = RENDEZVOUS_ALIGNMENT + }; + +inline constexpr int rendezvous_buffer_size( const int nthreads ) noexcept +{ + return RENDEZVOUS_HEADER + ((nthreads-1 + RENDEZVOUS_ALIGNMENT-1) / RENDEZVOUS_ALIGNMENT) * RENDEZVOUS_ALIGNMENT; +} + +void rendezvous_initialize( volatile void * buffer + , const int size + , const int rank + ) noexcept; + + +bool rendezvous( volatile void * buffer + , uint64_t & step + , const int size + , const int rank + , bool active_wait = true + ) noexcept; + +void rendezvous_release( volatile void * buffer + , const uint64_t step + ) noexcept; + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + + +class HostBarrier +{ +public: + + enum : int { ALIGNMENT = RENDEZVOUS_ALIGNMENT }; + enum : int { HEADER = ALIGNMENT}; + + enum Policy : int { ACTIVE, PASSIVE }; + + inline static constexpr int buffer_size( const int nthreads ) noexcept + { + return rendezvous_buffer_size(nthreads); + } + + HostBarrier( volatile void * arg_buffer + , int arg_size + , int arg_rank + , Policy arg_policy + ) noexcept + : m_buffer{arg_buffer} + , m_size{arg_size} + , m_rank{arg_rank} + , m_policy{arg_policy} + , m_step{0} + { + rendezvous_initialize( m_buffer, m_size, m_rank ); + } + + bool rendezvous() const noexcept + { + return Kokkos::Impl::rendezvous( m_buffer + , m_step + , m_size + , m_rank + , m_policy == ACTIVE + ); + } + + void rendezvous_release() const noexcept + { + Kokkos::Impl::rendezvous_release( m_buffer, m_step ); + } + +private: + volatile void * m_buffer ; + const int m_size ; + const int m_rank ; + const Policy m_policy ; + mutable uint64_t m_step ; + +private: + HostBarrier( const HostBarrier & ) = delete; + HostBarrier( HostBarrier && ) = delete; + HostBarrier & operator=( const HostBarrier & ) = delete; + HostBarrier & operator=( HostBarrier && ) = delete; +}; + +}} // namespace Kokkos::Impl + +#endif // KOKKOS_HOST_BARRIER_HPP + diff --git a/lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp b/lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp index 2a5c34c375..4cec5ebad9 100644 --- a/lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp @@ -106,62 +106,6 @@ //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- -namespace Kokkos { -namespace { - -static const int QUERY_SPACE_IN_PARALLEL_MAX = 16 ; - -typedef int (* QuerySpaceInParallelPtr )(); - -QuerySpaceInParallelPtr s_in_parallel_query[ QUERY_SPACE_IN_PARALLEL_MAX ] ; -int s_in_parallel_query_count = 0 ; - -} // namespace - -void HostSpace::register_in_parallel( int (*device_in_parallel)() ) -{ - if ( 0 == device_in_parallel ) { - Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::HostSpace::register_in_parallel ERROR : given NULL" ) ); - } - - int i = -1 ; - - if ( ! (device_in_parallel)() ) { - for ( i = 0 ; i < s_in_parallel_query_count && ! (*(s_in_parallel_query[i]))() ; ++i ); - } - - if ( i < s_in_parallel_query_count ) { - Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::HostSpace::register_in_parallel_query ERROR : called in_parallel" ) ); - - } - - if ( QUERY_SPACE_IN_PARALLEL_MAX <= i ) { - Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::HostSpace::register_in_parallel_query ERROR : exceeded maximum" ) ); - - } - - for ( i = 0 ; i < s_in_parallel_query_count && s_in_parallel_query[i] != device_in_parallel ; ++i ); - - if ( i == s_in_parallel_query_count ) { - s_in_parallel_query[s_in_parallel_query_count++] = device_in_parallel ; - } -} - -int HostSpace::in_parallel() -{ - const int n = s_in_parallel_query_count ; - - int i = 0 ; - - while ( i < n && ! (*(s_in_parallel_query[i]))() ) { ++i ; } - - return i < n ; -} - -} // namespace Kokkos - -/*--------------------------------------------------------------------------*/ - namespace Kokkos { /* Default allocation mechanism */ @@ -310,7 +254,12 @@ void * HostSpace::allocate( const size_t arg_alloc_size ) const } -void HostSpace::deallocate( void * const arg_alloc_ptr , const size_t arg_alloc_size ) const +void HostSpace::deallocate( void * const arg_alloc_ptr + , const size_t +#if defined( KOKKOS_IMPL_POSIX_MMAP_FLAGS ) + arg_alloc_size +#endif + ) const { if ( arg_alloc_ptr ) { @@ -340,9 +289,6 @@ void HostSpace::deallocate( void * const arg_alloc_ptr , const size_t arg_alloc_ } } -constexpr const char* HostSpace::name() { - return m_name; -} } // namespace Kokkos //---------------------------------------------------------------------------- @@ -468,7 +414,7 @@ SharedAllocationRecord< Kokkos::HostSpace , void >::get_record( void * alloc_ptr // Iterate records to print orphaned memory ... void SharedAllocationRecord< Kokkos::HostSpace , void >:: -print_records( std::ostream & s , const Kokkos::HostSpace & space , bool detail ) +print_records( std::ostream & s , const Kokkos::HostSpace & , bool detail ) { SharedAllocationRecord< void , void >::print_host_accessible_records( s , "HostSpace" , & s_root_record , detail ); } diff --git a/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.cpp b/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.cpp index ac200209c7..c2c6e45ef8 100644 --- a/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.cpp @@ -45,7 +45,7 @@ #include #include #include -#include +#include //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -58,9 +58,11 @@ void HostThreadTeamData::organize_pool { bool ok = true ; + memory_fence(); + // Verify not already a member of a pool: for ( int rank = 0 ; rank < size && ok ; ++rank ) { - ok = ( 0 != members[rank] ) && ( 0 == members[rank]->m_pool_scratch ); + ok = ( nullptr != members[rank] ) && ( 0 == members[rank]->m_pool_scratch ); } if ( ok ) { @@ -89,7 +91,6 @@ void HostThreadTeamData::organize_pool mem->m_team_alloc = 1 ; mem->m_league_rank = rank ; mem->m_league_size = size ; - mem->m_pool_rendezvous_step = 0 ; mem->m_team_rendezvous_step = 0 ; pool[ rank ] = mem ; } @@ -116,7 +117,6 @@ void HostThreadTeamData::disband_pool() m_team_alloc = 1 ; m_league_rank = 0 ; m_league_size = 1 ; - m_pool_rendezvous_step = 0 ; m_team_rendezvous_step = 0 ; } @@ -206,147 +206,6 @@ void HostThreadTeamData::disband_team() m_team_rendezvous_step = 0 ; } -//---------------------------------------------------------------------------- -/* pattern for rendezvous - * - * if ( rendezvous() ) { - * ... all other threads are still in team_rendezvous() ... - * rendezvous_release(); - * ... all other threads are released from team_rendezvous() ... - * } - */ - -int HostThreadTeamData::rendezvous( int64_t * const buffer - , int & rendezvous_step - , int const size - , int const rank ) noexcept -{ - enum : int { shift_byte = 3 }; - enum : int { size_byte = ( 01 << shift_byte ) }; // == 8 - enum : int { mask_byte = size_byte - 1 }; - - enum : int { shift_mem_cycle = 2 }; - enum : int { size_mem_cycle = ( 01 << shift_mem_cycle ) }; // == 4 - enum : int { mask_mem_cycle = size_mem_cycle - 1 }; - - // Cycle step values: 1 <= step <= size_val_cycle - // An odd multiple of memory cycle so that when a memory location - // is reused it has a different value. - // Must be representable within a single byte: size_val_cycle < 16 - - enum : int { size_val_cycle = 3 * size_mem_cycle }; - - // Requires: - // Called by rank = [ 0 .. size ) - // buffer aligned to int64_t[4] - - // A sequence of rendezvous uses four cycled locations in memory - // and non-equal cycled synchronization values to - // 1) prevent rendezvous from overtaking one another and - // 2) give each spin wait location an int64_t[4] span - // so that it has its own cache line. - - const int step = ( rendezvous_step % size_val_cycle ) + 1 ; - - rendezvous_step = step ; - - // The leading int64_t[4] span is for thread 0 to write - // and all other threads to read spin-wait. - // sync_offset is the index into this array for this step. - - const int sync_offset = ( step & mask_mem_cycle ) + size_mem_cycle ; - - union { - int64_t full ; - int8_t byte[8] ; - } value ; - - if ( rank ) { - - const int group_begin = rank << shift_byte ; // == rank * size_byte - - if ( group_begin < size ) { - - // This thread waits for threads - // [ group_begin .. group_begin + 8 ) - // [ rank*8 .. rank*8 + 8 ) - // to write to their designated bytes. - - const int end = group_begin + size_byte < size - ? size_byte : size - group_begin ; - - value.full = 0 ; - for ( int i = 0 ; i < end ; ++i ) value.byte[i] = int8_t( step ); - - store_fence(); // This should not be needed but fixes #742 - - spinwait_until_equal( buffer[ (rank << shift_mem_cycle) + sync_offset ] - , value.full ); - } - - { - // This thread sets its designated byte. - // ( rank % size_byte ) + - // ( ( rank / size_byte ) * size_byte * size_mem_cycle ) + - // ( sync_offset * size_byte ) - const int offset = ( rank & mask_byte ) - + ( ( rank & ~mask_byte ) << shift_mem_cycle ) - + ( sync_offset << shift_byte ); - - // All of this thread's previous memory stores must be complete before - // this thread stores the step value at this thread's designated byte - // in the shared synchronization array. - - Kokkos::memory_fence(); - - ((volatile int8_t*) buffer)[ offset ] = int8_t( step ); - - // Memory fence to push the previous store out - Kokkos::memory_fence(); - } - - // Wait for thread 0 to release all other threads - - spinwait_until_equal( buffer[ step & mask_mem_cycle ] , int64_t(step) ); - - } - else { - // Thread 0 waits for threads [1..7] - // to write to their designated bytes. - - const int end = size_byte < size ? 8 : size ; - - value.full = 0 ; - for ( int i = 1 ; i < end ; ++i ) value.byte[i] = int8_t( step ); - - spinwait_until_equal( buffer[ sync_offset ], value.full ); - } - - return rank ? 0 : 1 ; -} - -void HostThreadTeamData:: - rendezvous_release( int64_t * const buffer - , int const rendezvous_step ) noexcept -{ - enum : int { shift_mem_cycle = 2 }; - enum : int { size_mem_cycle = ( 01 << shift_mem_cycle ) }; // == 4 - enum : int { mask_mem_cycle = size_mem_cycle - 1 }; - - // Requires: - // Called after team_rendezvous - // Called only by true == team_rendezvous(root) - - // Memory fence to be sure all previous writes are complete: - Kokkos::memory_fence(); - - ((volatile int64_t*) buffer)[ rendezvous_step & mask_mem_cycle ] = - int64_t( rendezvous_step ); - - // Memory fence to push the store out - Kokkos::memory_fence(); -} - //---------------------------------------------------------------------------- int HostThreadTeamData::get_work_stealing() noexcept diff --git a/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.hpp b/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.hpp index c050a16eae..dc3b89c7c7 100644 --- a/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_HostThreadTeam.hpp @@ -50,6 +50,7 @@ #include #include #include +#include //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -67,14 +68,12 @@ public: // Assume upper bounds on number of threads: // pool size <= 1024 threads - // pool rendezvous <= ( 1024 / 8 ) * 4 + 4 = 2052 // team size <= 64 threads - // team rendezvous <= ( 64 / 8 ) * 4 + 4 = 36 enum : int { max_pool_members = 1024 }; enum : int { max_team_members = 64 }; - enum : int { max_pool_rendezvous = ( max_pool_members / 8 ) * 4 + 4 }; - enum : int { max_team_rendezvous = ( max_team_members / 8 ) * 4 + 4 }; + enum : int { max_pool_rendezvous = rendezvous_buffer_size( max_pool_members ) }; + enum : int { max_team_rendezvous = rendezvous_buffer_size( max_team_members ) }; private: @@ -114,33 +113,12 @@ private: int m_league_size ; int m_work_chunk ; int m_steal_rank ; // work stealing rank - int mutable m_pool_rendezvous_step ; - int mutable m_team_rendezvous_step ; + uint64_t mutable m_pool_rendezvous_step ; + uint64_t mutable m_team_rendezvous_step ; HostThreadTeamData * team_member( int r ) const noexcept { return ((HostThreadTeamData**)(m_pool_scratch+m_pool_members))[m_team_base+r]; } - // Rendezvous pattern: - // if ( rendezvous(root) ) { - // ... only root thread here while all others wait ... - // rendezvous_release(); - // } - // else { - // ... all other threads release here ... - // } - // - // Requires: buffer[ ( max_threads / 8 ) * 4 + 4 ]; 0 == max_threads % 8 - // - static - int rendezvous( int64_t * const buffer - , int & rendezvous_step - , int const size - , int const rank ) noexcept ; - - static - void rendezvous_release( int64_t * const buffer - , int const rendezvous_step ) noexcept ; - public: inline @@ -150,7 +128,8 @@ public: rendezvous( m_team_scratch + m_team_rendezvous , m_team_rendezvous_step , m_team_size - , ( m_team_rank + m_team_size - root ) % m_team_size ); + , ( m_team_rank + m_team_size - root ) % m_team_size + ); } inline @@ -175,19 +154,30 @@ public: inline int pool_rendezvous() const noexcept { + static constexpr bool active_wait = + #if defined( KOKKOS_COMPILER_IBM ) + // If running on IBM POWER architecture the global + // level rendzvous should immediately yield when + // waiting for other threads in the pool to arrive. + false + #else + true + #endif + ; return 1 == m_pool_size ? 1 : rendezvous( m_pool_scratch + m_pool_rendezvous , m_pool_rendezvous_step , m_pool_size - , m_pool_rank ); + , m_pool_rank + , active_wait + ); } inline void pool_rendezvous_release() const noexcept { if ( 1 < m_pool_size ) { - rendezvous_release( m_pool_scratch + m_pool_rendezvous - , m_pool_rendezvous_step ); + rendezvous_release( m_pool_scratch + m_pool_rendezvous, m_pool_rendezvous_step ); } } @@ -406,7 +396,7 @@ fflush(stdout); // Steal from next team, round robin // The next team is offset by m_team_alloc if it fits in the pool. - m_steal_rank = m_team_base + m_team_alloc + m_team_size <= m_pool_size ? + m_steal_rank = m_team_base + m_team_alloc + m_team_size <= m_pool_size ? m_team_base + m_team_alloc : 0 ; } diff --git a/lib/kokkos/core/src/impl/Kokkos_MemoryPool.cpp b/lib/kokkos/core/src/impl/Kokkos_MemoryPool.cpp new file mode 100644 index 0000000000..d7fe74a6d8 --- /dev/null +++ b/lib/kokkos/core/src/impl/Kokkos_MemoryPool.cpp @@ -0,0 +1,125 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +/* Verify size constraints: + * min_block_alloc_size <= max_block_alloc_size + * max_block_alloc_size <= min_superblock_size + * min_superblock_size <= max_superblock_size + * min_superblock_size <= min_total_alloc_size + * min_superblock_size <= min_block_alloc_size * + * max_block_per_superblock + */ +void memory_pool_bounds_verification + ( size_t min_block_alloc_size + , size_t max_block_alloc_size + , size_t min_superblock_size + , size_t max_superblock_size + , size_t max_block_per_superblock + , size_t min_total_alloc_size + ) +{ + const size_t max_superblock = + min_block_alloc_size * max_block_per_superblock ; + + if ( ( size_t(max_superblock_size) < min_superblock_size ) || + ( min_total_alloc_size < min_superblock_size ) || + ( max_superblock < min_superblock_size ) || + ( min_superblock_size < max_block_alloc_size ) || + ( max_block_alloc_size < min_block_alloc_size ) ) { + + std::ostringstream msg ; + + msg << "Kokkos::MemoryPool size constraint violation" ; + + if ( size_t(max_superblock_size) < min_superblock_size ) { + msg << " : max_superblock_size(" + << max_superblock_size + << ") < min_superblock_size(" + << min_superblock_size << ")" ; + } + + if ( min_total_alloc_size < min_superblock_size ) { + msg << " : min_total_alloc_size(" + << min_total_alloc_size + << ") < min_superblock_size(" + << min_superblock_size << ")" ; + } + + if ( max_superblock < min_superblock_size ) { + msg << " : max_superblock(" + << max_superblock + << ") < min_superblock_size(" + << min_superblock_size << ")" ; + } + + if ( min_superblock_size < max_block_alloc_size ) { + msg << " : min_superblock_size(" + << min_superblock_size + << ") < max_block_alloc_size(" + << max_block_alloc_size << ")" ; + } + + if ( max_block_alloc_size < min_block_alloc_size ) { + msg << " : max_block_alloc_size(" + << max_block_alloc_size + << ") < min_block_alloc_size(" + << min_block_alloc_size << ")" ; + } + + Kokkos::Impl::throw_runtime_exception( msg.str() ); + } +} + +} +} + diff --git a/lib/kokkos/core/src/impl/Kokkos_Memory_Fence.hpp b/lib/kokkos/core/src/impl/Kokkos_Memory_Fence.hpp index 7a887a9e29..abd9fe6724 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Memory_Fence.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Memory_Fence.hpp @@ -44,6 +44,11 @@ #include #if defined( KOKKOS_ATOMIC_HPP ) && ! defined( KOKKOS_MEMORY_FENCE_HPP ) #define KOKKOS_MEMORY_FENCE_HPP + +#if !defined(_OPENMP) +#include +#endif + namespace Kokkos { //---------------------------------------------------------------------------- @@ -51,23 +56,12 @@ namespace Kokkos { KOKKOS_FORCEINLINE_FUNCTION void memory_fence() { -#if defined( __CUDA_ARCH__ ) +#if defined( __CUDA_ARCH__ ) __threadfence(); -#elif defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) - asm volatile ( - "mfence" ::: "memory" - ); -#elif defined( KOKKOS_ENABLE_GNU_ATOMICS ) || \ - ( defined( KOKKOS_COMPILER_NVCC ) && defined( KOKKOS_ENABLE_INTEL_ATOMICS ) ) - __sync_synchronize(); -#elif defined( KOKKOS_ENABLE_INTEL_ATOMICS ) - _mm_mfence(); -#elif defined( KOKKOS_ENABLE_OPENMP_ATOMICS ) +#elif defined( _OPENMP ) #pragma omp flush -#elif defined( KOKKOS_ENABLE_WINDOWS_ATOMICS ) - MemoryBarrier(); #else - #error "Error: memory_fence() not defined" + std::atomic_thread_fence( std::memory_order_seq_cst ); #endif } @@ -79,12 +73,12 @@ void memory_fence() KOKKOS_FORCEINLINE_FUNCTION void store_fence() { -#if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) - asm volatile ( - "sfence" ::: "memory" - ); +#if defined( __CUDA_ARCH__ ) + __threadfence(); +#elif defined( _OPENMP ) + #pragma omp flush #else - memory_fence(); + std::atomic_thread_fence( std::memory_order_seq_cst ); #endif } @@ -96,12 +90,12 @@ void store_fence() KOKKOS_FORCEINLINE_FUNCTION void load_fence() { -#if defined( KOKKOS_ENABLE_ASM ) && defined( KOKKOS_ENABLE_ISA_X86_64 ) - asm volatile ( - "lfence" ::: "memory" - ); +#if defined( __CUDA_ARCH__ ) + __threadfence(); +#elif defined( _OPENMP ) + #pragma omp flush #else - memory_fence(); + std::atomic_thread_fence( std::memory_order_seq_cst ); #endif } diff --git a/lib/kokkos/core/src/impl/Kokkos_OldMacros.hpp b/lib/kokkos/core/src/impl/Kokkos_OldMacros.hpp index 15ce6964a0..a408199088 100644 --- a/lib/kokkos/core/src/impl/Kokkos_OldMacros.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_OldMacros.hpp @@ -140,12 +140,6 @@ #endif #endif -#ifdef KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA -#ifndef KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA -#define KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA -#endif -#endif - #ifdef KOKKOS_HAVE_CXX1Z #ifndef KOKKOS_ENABLE_CXX1Z #define KOKKOS_ENABLE_CXX1Z KOKKOS_HAVE_CXX1Z diff --git a/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.cpp b/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.cpp index 98482cfab6..a90bd507d5 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.cpp @@ -50,51 +50,77 @@ namespace Kokkos { namespace Profiling { +static initFunction initProfileLibrary = nullptr; +static finalizeFunction finalizeProfileLibrary = nullptr; + +static beginFunction beginForCallee = nullptr; +static beginFunction beginScanCallee = nullptr; +static beginFunction beginReduceCallee = nullptr; +static endFunction endForCallee = nullptr; +static endFunction endScanCallee = nullptr; +static endFunction endReduceCallee = nullptr; + +static pushFunction pushRegionCallee = nullptr; +static popFunction popRegionCallee = nullptr; + +static allocateDataFunction allocateDataCallee = nullptr; +static deallocateDataFunction deallocateDataCallee = nullptr; + +static beginDeepCopyFunction beginDeepCopyCallee = nullptr; +static endDeepCopyFunction endDeepCopyCallee = nullptr; + +static createProfileSectionFunction createSectionCallee = nullptr; +static startProfileSectionFunction startSectionCallee = nullptr; +static stopProfileSectionFunction stopSectionCallee = nullptr; +static destroyProfileSectionFunction destroySectionCallee = nullptr; + +static profileEventFunction profileEventCallee = nullptr; + SpaceHandle::SpaceHandle(const char* space_name) { strncpy(name,space_name,64); } bool profileLibraryLoaded() { - return (NULL != initProfileLibrary); + return (nullptr != initProfileLibrary); } void beginParallelFor(const std::string& kernelPrefix, const uint32_t devID, uint64_t* kernelID) { - if(NULL != beginForCallee) { + if(nullptr != beginForCallee) { Kokkos::fence(); (*beginForCallee)(kernelPrefix.c_str(), devID, kernelID); } } void endParallelFor(const uint64_t kernelID) { - if(NULL != endForCallee) { + if(nullptr != endForCallee) { Kokkos::fence(); (*endForCallee)(kernelID); } } void beginParallelScan(const std::string& kernelPrefix, const uint32_t devID, uint64_t* kernelID) { - if(NULL != beginScanCallee) { + if(nullptr != beginScanCallee) { Kokkos::fence(); (*beginScanCallee)(kernelPrefix.c_str(), devID, kernelID); } } void endParallelScan(const uint64_t kernelID) { - if(NULL != endScanCallee) { + if(nullptr != endScanCallee) { Kokkos::fence(); (*endScanCallee)(kernelID); } } void beginParallelReduce(const std::string& kernelPrefix, const uint32_t devID, uint64_t* kernelID) { - if(NULL != beginReduceCallee) { + if(nullptr != beginReduceCallee) { Kokkos::fence(); (*beginReduceCallee)(kernelPrefix.c_str(), devID, kernelID); } } void endParallelReduce(const uint64_t kernelID) { - if(NULL != endReduceCallee) { + if(nullptr != endReduceCallee) { Kokkos::fence(); (*endReduceCallee)(kernelID); } @@ -102,31 +128,78 @@ void endParallelReduce(const uint64_t kernelID) { void pushRegion(const std::string& kName) { - if( NULL != pushRegionCallee ) { + if( nullptr != pushRegionCallee ) { Kokkos::fence(); (*pushRegionCallee)(kName.c_str()); } } void popRegion() { - if( NULL != popRegionCallee ) { + if( nullptr != popRegionCallee ) { Kokkos::fence(); (*popRegionCallee)(); } } void allocateData(const SpaceHandle space, const std::string label, const void* ptr, const uint64_t size) { - if(NULL != allocateDataCallee) { + if(nullptr != allocateDataCallee) { (*allocateDataCallee)(space,label.c_str(),ptr,size); } } void deallocateData(const SpaceHandle space, const std::string label, const void* ptr, const uint64_t size) { - if(NULL != allocateDataCallee) { + if(nullptr != deallocateDataCallee) { (*deallocateDataCallee)(space,label.c_str(),ptr,size); } } +void beginDeepCopy(const SpaceHandle dst_space, const std::string dst_label, const void* dst_ptr, + const SpaceHandle src_space, const std::string src_label, const void* src_ptr, + const uint64_t size) { + if(nullptr != beginDeepCopyCallee) { + (*beginDeepCopyCallee)(dst_space, dst_label.c_str(), dst_ptr, + src_space, src_label.c_str(), src_ptr, + size); + } +} + +void endDeepCopy() { + if(nullptr != endDeepCopyCallee) { + (*endDeepCopyCallee)(); + } +} + +void createProfileSection(const std::string& sectionName, uint32_t* secID) { + + if(nullptr != createSectionCallee) { + (*createSectionCallee)(sectionName.c_str(), secID); + } +} + +void startSection(const uint32_t secID) { + if(nullptr != startSectionCallee) { + (*startSectionCallee)(secID); + } +} + +void stopSection(const uint32_t secID) { + if(nullptr != stopSectionCallee) { + (*stopSectionCallee)(secID); + } +} + +void destroyProfileSection(const uint32_t secID) { + if(nullptr != destroySectionCallee) { + (*destroySectionCallee)(secID); + } +} + +void markEvent(const std::string& eventName) { + if(nullptr != profileEventCallee) { + (*profileEventCallee)(eventName.c_str()); + } +} + void initialize() { // Make sure initialize calls happens only once @@ -140,7 +213,7 @@ void initialize() { // If we do not find a profiling library in the environment then exit // early. - if( NULL == envProfileLibrary ) { + if( nullptr == envProfileLibrary ) { return ; } @@ -149,10 +222,10 @@ void initialize() { char* profileLibraryName = strtok(envProfileCopy, ";"); - if( (NULL != profileLibraryName) && (strcmp(profileLibraryName, "") != 0) ) { + if( (nullptr != profileLibraryName) && (strcmp(profileLibraryName, "") != 0) ) { firstProfileLibrary = dlopen(profileLibraryName, RTLD_NOW | RTLD_GLOBAL); - if(NULL == firstProfileLibrary) { + if(nullptr == firstProfileLibrary) { std::cerr << "Error: Unable to load KokkosP library: " << profileLibraryName << std::endl; } else { @@ -191,14 +264,30 @@ void initialize() { auto p12 = dlsym(firstProfileLibrary, "kokkosp_deallocate_data"); deallocateDataCallee = *((deallocateDataFunction*) &p12); + auto p13 = dlsym(firstProfileLibrary, "kokkosp_begin_deep_copy"); + beginDeepCopyCallee = *((beginDeepCopyFunction*) &p13); + auto p14 = dlsym(firstProfileLibrary, "kokkosp_end_deep_copy"); + endDeepCopyCallee = *((endDeepCopyFunction*) &p14); + + auto p15 = dlsym(firstProfileLibrary, "kokkosp_create_profile_section"); + createSectionCallee = *((createProfileSectionFunction*) &p15); + auto p16 = dlsym(firstProfileLibrary, "kokkosp_start_profile_section"); + startSectionCallee = *((startProfileSectionFunction*) &p16); + auto p17 = dlsym(firstProfileLibrary, "kokkosp_stop_profile_section"); + stopSectionCallee = *((stopProfileSectionFunction*) &p17); + auto p18 = dlsym(firstProfileLibrary, "kokkosp_destroy_profile_section"); + destroySectionCallee = *((destroyProfileSectionFunction*) &p18); + + auto p19 = dlsym(firstProfileLibrary, "kokkosp_profile_event"); + profileEventCallee = *((profileEventFunction*) &p19); } } - if(NULL != initProfileLibrary) { + if(nullptr != initProfileLibrary) { (*initProfileLibrary)(0, (uint64_t) KOKKOSP_INTERFACE_VERSION, (uint32_t) 0, - NULL); + nullptr); } free(envProfileCopy); @@ -210,28 +299,37 @@ void finalize() { if(is_finalized) return; is_finalized = 1; - if(NULL != finalizeProfileLibrary) { + if(nullptr != finalizeProfileLibrary) { (*finalizeProfileLibrary)(); - // Set all profile hooks to NULL to prevent + // Set all profile hooks to nullptr to prevent // any additional calls. Once we are told to // finalize, we mean it - initProfileLibrary = NULL; - finalizeProfileLibrary = NULL; + initProfileLibrary = nullptr; + finalizeProfileLibrary = nullptr; - beginForCallee = NULL; - beginScanCallee = NULL; - beginReduceCallee = NULL; - endScanCallee = NULL; - endForCallee = NULL; - endReduceCallee = NULL; + beginForCallee = nullptr; + beginScanCallee = nullptr; + beginReduceCallee = nullptr; + endScanCallee = nullptr; + endForCallee = nullptr; + endReduceCallee = nullptr; - pushRegionCallee = NULL; - popRegionCallee = NULL; + pushRegionCallee = nullptr; + popRegionCallee = nullptr; - allocateDataCallee = NULL; - deallocateDataCallee = NULL; + allocateDataCallee = nullptr; + deallocateDataCallee = nullptr; + beginDeepCopyCallee = nullptr; + endDeepCopyCallee = nullptr; + + createSectionCallee = nullptr; + startSectionCallee = nullptr; + stopSectionCallee = nullptr; + destroySectionCallee = nullptr; + + profileEventCallee = nullptr; } } } diff --git a/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.hpp b/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.hpp index f76e5dfa04..f348239e08 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Profiling_Interface.hpp @@ -45,6 +45,7 @@ #define KOKKOSP_INTERFACE_HPP #include + #if defined(KOKKOS_ENABLE_PROFILING) #include @@ -57,7 +58,7 @@ #include #include -#define KOKKOSP_INTERFACE_VERSION 20150628 +#define KOKKOSP_INTERFACE_VERSION 20171029 namespace Kokkos { namespace Profiling { @@ -81,23 +82,18 @@ typedef void (*popFunction)(); typedef void (*allocateDataFunction)(const SpaceHandle, const char*, const void*, const uint64_t); typedef void (*deallocateDataFunction)(const SpaceHandle, const char*, const void*, const uint64_t); +typedef void (*createProfileSectionFunction)(const char*, uint32_t*); +typedef void (*startProfileSectionFunction)(const uint32_t); +typedef void (*stopProfileSectionFunction)(const uint32_t); +typedef void (*destroyProfileSectionFunction)(const uint32_t); -static initFunction initProfileLibrary = NULL; -static finalizeFunction finalizeProfileLibrary = NULL; - -static beginFunction beginForCallee = NULL; -static beginFunction beginScanCallee = NULL; -static beginFunction beginReduceCallee = NULL; -static endFunction endForCallee = NULL; -static endFunction endScanCallee = NULL; -static endFunction endReduceCallee = NULL; - -static pushFunction pushRegionCallee = NULL; -static popFunction popRegionCallee = NULL; - -static allocateDataFunction allocateDataCallee = NULL; -static deallocateDataFunction deallocateDataCallee = NULL; +typedef void (*profileEventFunction)(const char*); +typedef void (*beginDeepCopyFunction)( + SpaceHandle, const char*, const void*, + SpaceHandle, const char*, const void*, + uint64_t); +typedef void (*endDeepCopyFunction)(); bool profileLibraryLoaded(); @@ -111,38 +107,24 @@ void endParallelReduce(const uint64_t kernelID); void pushRegion(const std::string& kName); void popRegion(); +void createProfileSection(const std::string& sectionName, uint32_t* secID); +void startSection(const uint32_t secID); +void stopSection(const uint32_t secID); +void destroyProfileSection(const uint32_t secID); + +void markEvent(const std::string* evName); + void allocateData(const SpaceHandle space, const std::string label, const void* ptr, const uint64_t size); void deallocateData(const SpaceHandle space, const std::string label, const void* ptr, const uint64_t size); +void beginDeepCopy(const SpaceHandle dst_space, const std::string dst_label, const void* dst_ptr, + const SpaceHandle src_space, const std::string src_label, const void* src_ptr, + const uint64_t size); +void endDeepCopy(); + void initialize(); void finalize(); -//Define finalize_fake inline to get rid of warnings for unused static variables -inline void finalize_fake() { - if(NULL != finalizeProfileLibrary) { - (*finalizeProfileLibrary)(); - - // Set all profile hooks to NULL to prevent - // any additional calls. Once we are told to - // finalize, we mean it - beginForCallee = NULL; - beginScanCallee = NULL; - beginReduceCallee = NULL; - endScanCallee = NULL; - endForCallee = NULL; - endReduceCallee = NULL; - - allocateDataCallee = NULL; - deallocateDataCallee = NULL; - - initProfileLibrary = NULL; - finalizeProfileLibrary = NULL; - pushRegionCallee = NULL; - popRegionCallee = NULL; - } -} - - } } diff --git a/lib/kokkos/core/src/impl/Kokkos_Serial.cpp b/lib/kokkos/core/src/impl/Kokkos_Serial.cpp index 755271c07e..f3b048d58c 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Serial.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_Serial.cpp @@ -50,6 +50,7 @@ #include #include +#include /*--------------------------------------------------------------------------*/ @@ -59,6 +60,8 @@ namespace { HostThreadTeamData g_serial_thread_team_data ; +bool g_serial_is_initialized = false; + } // Resize thread team data scratch memory @@ -123,7 +126,6 @@ void serial_resize_thread_team_data( size_t pool_reduce_bytes } } -// Get thread team data structure for omp_get_thread_num() HostThreadTeamData * serial_get_thread_team_data() { return & g_serial_thread_team_data ; @@ -136,9 +138,9 @@ HostThreadTeamData * serial_get_thread_team_data() namespace Kokkos { -int Serial::is_initialized() +bool Serial::is_initialized() { - return 1 ; + return Impl::g_serial_is_initialized ; } void Serial::initialize( unsigned threads_count @@ -151,11 +153,15 @@ void Serial::initialize( unsigned threads_count (void) use_cores_per_numa; (void) allow_asynchronous_threadpool; + Impl::SharedAllocationRecord< void, void >::tracking_enable(); + // Init the array of locks used for arbitrarily sized atomics Impl::init_lock_array_host_space(); #if defined(KOKKOS_ENABLE_PROFILING) Kokkos::Profiling::initialize(); #endif + + Impl::g_serial_is_initialized = true; } void Serial::finalize() @@ -175,6 +181,8 @@ void Serial::finalize() #if defined(KOKKOS_ENABLE_PROFILING) Kokkos::Profiling::finalize(); #endif + + Impl::g_serial_is_initialized = false; } const char* Serial::name() { return "Serial"; } diff --git a/lib/kokkos/core/src/impl/Kokkos_Serial_Task.cpp b/lib/kokkos/core/src/impl/Kokkos_Serial_Task.cpp index 76297161b1..0b6fbd9af0 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Serial_Task.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_Serial_Task.cpp @@ -62,7 +62,7 @@ void TaskQueueSpecialization< Kokkos::Serial >::execute { using execution_space = Kokkos::Serial ; using queue_type = TaskQueue< execution_space > ; - using task_root_type = TaskBase< execution_space , void , void > ; + using task_root_type = TaskBase< void , void , void > ; using Member = Impl::HostThreadTeamMember< execution_space > ; task_root_type * const end = (task_root_type *) task_root_type::EndTag ; @@ -122,7 +122,7 @@ void TaskQueueSpecialization< Kokkos::Serial > :: { using execution_space = Kokkos::Serial ; using queue_type = TaskQueue< execution_space > ; - using task_root_type = TaskBase< execution_space , void , void > ; + using task_root_type = TaskBase< void , void , void > ; using Member = Impl::HostThreadTeamMember< execution_space > ; task_root_type * const end = (task_root_type *) task_root_type::EndTag ; diff --git a/lib/kokkos/core/src/impl/Kokkos_Serial_Task.hpp b/lib/kokkos/core/src/impl/Kokkos_Serial_Task.hpp index 2eb2b5cf52..39deebbbf1 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Serial_Task.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Serial_Task.hpp @@ -65,7 +65,7 @@ public: using execution_space = Kokkos::Serial ; using memory_space = Kokkos::HostSpace ; using queue_type = Kokkos::Impl::TaskQueue< execution_space > ; - using task_base_type = Kokkos::Impl::TaskBase< execution_space , void , void > ; + using task_base_type = Kokkos::Impl::TaskBase< void , void , void > ; using member_type = Kokkos::Impl::HostThreadTeamMember< execution_space > ; static diff --git a/lib/kokkos/core/src/impl/Kokkos_Serial_WorkGraphPolicy.hpp b/lib/kokkos/core/src/impl/Kokkos_Serial_WorkGraphPolicy.hpp new file mode 100644 index 0000000000..6f247608d9 --- /dev/null +++ b/lib/kokkos/core/src/impl/Kokkos_Serial_WorkGraphPolicy.hpp @@ -0,0 +1,101 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_SERIAL_WORKGRAPHPOLICY_HPP +#define KOKKOS_SERIAL_WORKGRAPHPOLICY_HPP + +namespace Kokkos { +namespace Impl { + +template< class FunctorType , class ... Traits > +class ParallelFor< FunctorType , + Kokkos::WorkGraphPolicy< Traits ... > , + Kokkos::Serial + > +{ +private: + + typedef Kokkos::WorkGraphPolicy< Traits ... > Policy ; + + Policy m_policy ; + FunctorType m_functor ; + + template< class TagType > + typename std::enable_if< std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { m_functor( w ); } + + template< class TagType > + typename std::enable_if< ! std::is_same< TagType , void >::value >::type + exec_one( const std::int32_t w ) const noexcept + { const TagType t{}; m_functor( t , w ); } + +public: + + inline + void execute() const noexcept + { + // Spin until COMPLETED_TOKEN. + // END_TOKEN indicates no work is currently available. + + for ( std::int32_t w = Policy::END_TOKEN ; + Policy::COMPLETED_TOKEN != ( w = m_policy.pop_work() ) ; ) { + if ( Policy::END_TOKEN != w ) { + exec_one< typename Policy::work_tag >( w ); + m_policy.completed_work(w); + } + } + } + + inline + ParallelFor( const FunctorType & arg_functor + , const Policy & arg_policy ) + : m_policy( arg_policy ) + , m_functor( arg_functor ) + {} +}; + +} // namespace Impl +} // namespace Kokkos + +#endif /* #define KOKKOS_SERIAL_WORKGRAPHPOLICY_HPP */ diff --git a/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.cpp b/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.cpp index e28c1194a7..87228ea784 100644 --- a/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.cpp @@ -46,23 +46,23 @@ namespace Kokkos { namespace Impl { -int SharedAllocationRecord< void , void >::s_tracking_enabled = 1 ; +namespace { -void SharedAllocationRecord< void , void >::tracking_claim_and_disable() -{ - // A host thread claim and disable tracking flag +__thread int t_tracking_enabled = 1; - while ( ! Kokkos::atomic_compare_exchange_strong( & s_tracking_enabled, 1, 0 ) ); } -void SharedAllocationRecord< void , void >::tracking_release_and_enable() -{ - // The host thread that claimed and disabled the tracking flag - // now release and enable tracking. +int SharedAllocationRecord< void , void >::tracking_enabled() +{ return t_tracking_enabled; } - if ( ! Kokkos::atomic_compare_exchange_strong( & s_tracking_enabled, 0, 1 ) ){ - Kokkos::Impl::throw_runtime_exception("Kokkos::Impl::SharedAllocationRecord<>::tracking_release_and_enable FAILED, this host process thread did not hold the lock" ); - } +void SharedAllocationRecord< void , void >::tracking_disable() +{ + t_tracking_enabled = 0; +} + +void SharedAllocationRecord< void , void >::tracking_enable() +{ + t_tracking_enabled = 1; } //---------------------------------------------------------------------------- @@ -306,7 +306,7 @@ print_host_accessible_records( std::ostream & s , reinterpret_cast( r->m_dealloc ) , r->m_alloc_ptr->m_label ); - std::cout << buffer ; + s << buffer ; r = r->m_next ; } while ( r != root ); } @@ -334,7 +334,7 @@ print_host_accessible_records( std::ostream & s else { snprintf( buffer , 256 , "%s [ 0 + 0 ]\n" , space_name ); } - std::cout << buffer ; + s << buffer ; r = r->m_next ; } while ( r != root ); } diff --git a/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.hpp b/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.hpp index 4dc61bb02e..73fabe0e0a 100644 --- a/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_SharedAlloc.hpp @@ -71,6 +71,9 @@ public: KOKKOS_INLINE_FUNCTION static const SharedAllocationHeader * get_header( void * alloc_ptr ) { return reinterpret_cast( reinterpret_cast(alloc_ptr) - sizeof(SharedAllocationHeader) ); } + + KOKKOS_INLINE_FUNCTION + const char* label() const { return m_label; } }; template<> @@ -83,8 +86,6 @@ protected: typedef void (* function_type )( SharedAllocationRecord * ); - static int s_tracking_enabled ; - SharedAllocationHeader * const m_alloc_ptr ; size_t const m_alloc_size ; function_type const m_dealloc ; @@ -110,17 +111,17 @@ protected: public: inline std::string get_label() const { return std::string("Unmanaged"); } - static int tracking_enabled() { return s_tracking_enabled ; } + static int tracking_enabled(); /**\brief A host process thread claims and disables the * shared allocation tracking flag. */ - static void tracking_claim_and_disable(); + static void tracking_disable(); /**\brief A host process thread releases and enables the * shared allocation tracking flag. */ - static void tracking_release_and_enable(); + static void tracking_enable(); ~SharedAllocationRecord() = default ; @@ -293,9 +294,13 @@ public: template< class MemorySpace > constexpr - SharedAllocationRecord< MemorySpace , void > & - get_record() const - { return * static_cast< SharedAllocationRecord< MemorySpace , void > * >( m_record ); } + SharedAllocationRecord< MemorySpace , void > * + get_record() const noexcept + { + return ( m_record_bits & DO_NOT_DEREF_FLAG ) + ? (SharedAllocationRecord< MemorySpace,void>*) 0 + : static_cast*>(m_record); + } template< class MemorySpace > std::string get_label() const @@ -317,6 +322,21 @@ public: #endif } + KOKKOS_INLINE_FUNCTION + bool has_record() const { + return (m_record_bits & (~DO_NOT_DEREF_FLAG)) != 0; + } + + KOKKOS_FORCEINLINE_FUNCTION + void clear() + { + // If this is tracking then must decrement + KOKKOS_IMPL_SHARED_ALLOCATION_TRACKER_DECREMENT + // Reset to default constructed value. + m_record_bits = DO_NOT_DEREF_FLAG ; + } + + // Copy: KOKKOS_FORCEINLINE_FUNCTION ~SharedAllocationTracker() { KOKKOS_IMPL_SHARED_ALLOCATION_TRACKER_DECREMENT } diff --git a/lib/kokkos/core/src/impl/Kokkos_Spinwait.cpp b/lib/kokkos/core/src/impl/Kokkos_Spinwait.cpp new file mode 100644 index 0000000000..f151071a9f --- /dev/null +++ b/lib/kokkos/core/src/impl/Kokkos_Spinwait.cpp @@ -0,0 +1,143 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + +#include +#include +#include + +#if defined( KOKKOS_ENABLE_STDTHREAD) || defined( _WIN32 ) + #include +#elif !defined( _WIN32 ) + #include + #include +#else + #include + #include + #include +#endif + +/*--------------------------------------------------------------------------*/ + +namespace Kokkos { +namespace Impl { + +void host_thread_yield( const uint32_t i , const WaitMode mode ) +{ + static constexpr uint32_t sleep_limit = 1 << 13 ; + static constexpr uint32_t yield_limit = 1 << 12 ; + + const int c = Kokkos::Impl::bit_scan_reverse(i); + + if ( sleep_limit < i ) { + + // Attempt to put the thread to sleep for 'c' milliseconds + + #if defined( KOKKOS_ENABLE_STDTHREAD ) || defined( _WIN32 ) + auto start = std::chrono::high_resolution_clock::now(); + std::this_thread::yield(); + std::this_thread::sleep_until( start + std::chrono::nanoseconds( c * 1000 ) ); + #else + timespec req ; + req.tv_sec = 0 ; + req.tv_nsec = 1000 * c ; + nanosleep( &req, nullptr ); + #endif + } + + else if ( mode == WaitMode::PASSIVE || yield_limit < i ) { + + // Attempt to yield thread resources to runtime + + #if defined( KOKKOS_ENABLE_STDTHREAD ) || defined( _WIN32 ) + std::this_thread::yield(); + #else + sched_yield(); + #endif + } + + #if defined( KOKKOS_ENABLE_ASM ) + + else if ( (1u<<4) < i ) { + + // Insert a few no-ops to quiet the thread: + + for ( int k = 0 ; k < c ; ++k ) { + #if defined( __amd64 ) || defined( __amd64__ ) || \ + defined( __x86_64 ) || defined( __x86_64__ ) + #if !defined( _WIN32 ) /* IS NOT Microsoft Windows */ + asm volatile( "nop\n" ); + #else + __asm__ __volatile__( "nop\n" ); + #endif + #elif defined(__PPC64__) + asm volatile( "nop\n" ); + #endif + } + } + + { + // Insert memory pause + #if defined( __amd64 ) || defined( __amd64__ ) || \ + defined( __x86_64 ) || defined( __x86_64__ ) + #if !defined( _WIN32 ) /* IS NOT Microsoft Windows */ + asm volatile( "pause\n":::"memory" ); + #else + __asm__ __volatile__( "pause\n":::"memory" ); + #endif + #elif defined(__PPC64__) + asm volatile( "or 27, 27, 27" ::: "memory" ); + #endif + } + + #endif /* defined( KOKKOS_ENABLE_ASM ) */ +} + +}} // namespace Kokkos::Impl + +#else +void KOKKOS_CORE_SRC_IMPL_SPINWAIT_PREVENT_LINK_ERROR() {} +#endif + diff --git a/lib/kokkos/core/src/impl/Kokkos_Spinwait.hpp b/lib/kokkos/core/src/impl/Kokkos_Spinwait.hpp new file mode 100644 index 0000000000..8846f1ca51 --- /dev/null +++ b/lib/kokkos/core/src/impl/Kokkos_Spinwait.hpp @@ -0,0 +1,145 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + + +#ifndef KOKKOS_SPINWAIT_HPP +#define KOKKOS_SPINWAIT_HPP + +#include +#include + +#include + +#include + +namespace Kokkos { +namespace Impl { + +#if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + +enum class WaitMode : int { + ACTIVE // Used for tight loops to keep threads active longest + , PASSIVE // Used to quickly yield the thread to quite down the system +}; + + +void host_thread_yield( const uint32_t i , const WaitMode mode ); + + +template +typename std::enable_if< std::is_integral::value, void>::type +spinwait_while_equal( T const volatile & flag, const T value ) +{ + Kokkos::store_fence(); + uint32_t i = 0 ; + while( value == flag ) { + host_thread_yield(++i, WaitMode::ACTIVE); + } + Kokkos::load_fence(); +} + +template +typename std::enable_if< std::is_integral::value, void>::type +yield_while_equal( T const volatile & flag, const T value ) +{ + Kokkos::store_fence(); + uint32_t i = 0 ; + while( value == flag ) { + host_thread_yield(++i, WaitMode::PASSIVE); + } + Kokkos::load_fence(); +} + +template +typename std::enable_if< std::is_integral::value, void>::type +spinwait_until_equal( T const volatile & flag, const T value ) +{ + Kokkos::store_fence(); + uint32_t i = 0 ; + while( value != flag ) { + host_thread_yield(++i, WaitMode::ACTIVE); + } + Kokkos::load_fence(); +} + +template +typename std::enable_if< std::is_integral::value, void>::type +yield_until_equal( T const volatile & flag, const T value ) +{ + Kokkos::store_fence(); + uint32_t i = 0 ; + while( value != flag ) { + host_thread_yield(++i, WaitMode::PASSIVE); + } + Kokkos::load_fence(); +} + +#else + +template +KOKKOS_INLINE_FUNCTION +typename std::enable_if< std::is_integral::value, void>::type +spinwait_while_equal( T const volatile & flag, const T value ) {} + +template +KOKKOS_INLINE_FUNCTION +typename std::enable_if< std::is_integral::value, void>::type +yield_while_equal( T const volatile & flag, const T value ) {} + +template +KOKKOS_INLINE_FUNCTION +typename std::enable_if< std::is_integral::value, void>::type +spinwait_until_equal( T const volatile & flag, const T value ) {} + +template +KOKKOS_INLINE_FUNCTION +typename std::enable_if< std::is_integral::value, void>::type +yield_until_equal( T const volatile & flag, const T value ) {} + +#endif + +} /* namespace Impl */ +} /* namespace Kokkos */ + +#endif /* #ifndef KOKKOS_SPINWAIT_HPP */ + diff --git a/lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp b/lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp index bee98e6745..5f8699302d 100644 --- a/lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp @@ -59,24 +59,15 @@ namespace Kokkos { namespace Impl { -/*\brief Implementation data for task data management, access, and execution. - * - * Curiously recurring template pattern (CRTP) - * to allow static_cast from the - * task root type and a task's FunctorType. - * - * TaskBase< Space , ResultType , FunctorType > - * : TaskBase< Space , ResultType , void > - * , FunctorType - * { ... }; - * - * TaskBase< Space , ResultType , void > - * : TaskBase< Space , void , void > - * { ... }; - */ -template< typename Space , typename ResultType , typename FunctorType > +template< class Space , typename ResultType , class FunctorType > class TaskBase ; +template< typename Space > +class TaskQueue ; + +template< typename Space > +class TaskQueueSpecialization ; + } /* namespace Impl */ } /* namespace Kokkos */ @@ -86,8 +77,217 @@ class TaskBase ; namespace Kokkos { namespace Impl { -template< typename Space > -class TaskQueueSpecialization ; +/** \brief Base class for task management, access, and execution. + * + * Inheritance structure to allow static_cast from the task root type + * and a task's FunctorType. + * + * // Enable a functor to access the base class + * // and provide memory for result value. + * TaskBase< Space , ResultType , FunctorType > + * : TaskBase< void , void , void > + * , FunctorType + * { ... }; + * Followed by memory allocated for result value. + * + * + * States of a task: + * + * Constructing State, NOT IN a linked list + * m_wait == 0 + * m_next == 0 + * + * Scheduling transition : Constructing -> Waiting + * before: + * m_wait == 0 + * m_next == this task's initial dependence, 0 if none + * after: + * m_wait == EndTag + * m_next == EndTag + * + * Waiting State, IN a linked list + * m_apply != 0 + * m_queue != 0 + * m_ref_count > 0 + * m_wait == head of linked list of tasks waiting on this task + * m_next == next of linked list of tasks + * + * transition : Waiting -> Executing + * before: + * m_next == EndTag + * after:: + * m_next == LockTag + * + * Executing State, NOT IN a linked list + * m_apply != 0 + * m_queue != 0 + * m_ref_count > 0 + * m_wait == head of linked list of tasks waiting on this task + * m_next == LockTag + * + * Respawn transition : Executing -> Executing-Respawn + * before: + * m_next == LockTag + * after: + * m_next == this task's updated dependence, 0 if none + * + * Executing-Respawn State, NOT IN a linked list + * m_apply != 0 + * m_queue != 0 + * m_ref_count > 0 + * m_wait == head of linked list of tasks waiting on this task + * m_next == this task's updated dependence, 0 if none + * + * transition : Executing -> Complete + * before: + * m_wait == head of linked list + * after: + * m_wait == LockTag + * + * Complete State, NOT IN a linked list + * m_wait == LockTag: cannot add dependence (<=> complete) + * m_next == LockTag: not a member of a wait queue + * + */ +template<> +class TaskBase< void , void , void > +{ +public: + + enum : int16_t { TaskTeam = 0 , TaskSingle = 1 , Aggregate = 2 }; + enum : uintptr_t { LockTag = ~uintptr_t(0) , EndTag = ~uintptr_t(1) }; + + template< typename > friend class Kokkos::TaskScheduler ; + + typedef TaskQueue< void > queue_type ; + + typedef void (* function_type) ( TaskBase * , void * ); + + // sizeof(TaskBase) == 48 + + function_type m_apply ; ///< Apply function pointer + queue_type * m_queue ; ///< Pointer to queue + TaskBase * m_wait ; ///< Linked list of tasks waiting on this + TaskBase * m_next ; ///< Waiting linked-list next + int32_t m_ref_count ; ///< Reference count + int32_t m_alloc_size ; ///< Allocation size + int32_t m_dep_count ; ///< Aggregate's number of dependences + int16_t m_task_type ; ///< Type of task + int16_t m_priority ; ///< Priority of runnable task + + TaskBase( TaskBase && ) = delete ; + TaskBase( const TaskBase & ) = delete ; + TaskBase & operator = ( TaskBase && ) = delete ; + TaskBase & operator = ( const TaskBase & ) = delete ; + + KOKKOS_INLINE_FUNCTION ~TaskBase() = default ; + + KOKKOS_INLINE_FUNCTION constexpr + TaskBase() + : m_apply( 0 ) + , m_queue( 0 ) + , m_wait( 0 ) + , m_next( 0 ) + , m_ref_count( 0 ) + , m_alloc_size( 0 ) + , m_dep_count( 0 ) + , m_task_type( 0 ) + , m_priority( 0 ) + {} + + //---------------------------------------- + + KOKKOS_INLINE_FUNCTION + TaskBase * volatile * aggregate_dependences() volatile + { return reinterpret_cast( this + 1 ); } + + KOKKOS_INLINE_FUNCTION + bool requested_respawn() + { + // This should only be called when a task has finished executing and is + // in the transition to either the complete or executing-respawn state. + TaskBase * const lock = reinterpret_cast< TaskBase * >( LockTag ); + return lock != m_next; + } + + KOKKOS_INLINE_FUNCTION + void add_dependence( TaskBase* dep ) + { + // Precondition: lock == m_next + + TaskBase * const lock = (TaskBase *) LockTag ; + + // Assign dependence to m_next. It will be processed in the subsequent + // call to schedule. Error if the dependence is reset. + if ( lock != Kokkos::atomic_exchange( & m_next, dep ) ) { + Kokkos::abort("TaskScheduler ERROR: resetting task dependence"); + } + + if ( 0 != dep ) { + // The future may be destroyed upon returning from this call + // so increment reference count to track this assignment. + Kokkos::atomic_increment( &(dep->m_ref_count) ); + } + } + + //---------------------------------------- + + KOKKOS_INLINE_FUNCTION + int32_t reference_count() const + { return *((int32_t volatile *)( & m_ref_count )); } + +}; + +static_assert( sizeof(TaskBase) == 48 + , "Verifying expected sizeof(TaskBase)" ); + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +template< typename ResultType > +struct TaskResult { + + enum : int32_t { size = sizeof(ResultType) }; + + using reference_type = ResultType & ; + + KOKKOS_INLINE_FUNCTION static + ResultType * ptr( TaskBase * task ) + { + return reinterpret_cast< ResultType * > + ( reinterpret_cast< char * >(task) + task->m_alloc_size - sizeof(ResultType) ); + } + + KOKKOS_INLINE_FUNCTION static + reference_type get( TaskBase * task ) + { return *ptr( task ); } +}; + +template<> +struct TaskResult< void > { + + enum : int32_t { size = 0 }; + + using reference_type = void ; + + KOKKOS_INLINE_FUNCTION static + void * ptr( TaskBase * ) { return (void*) 0 ; } + + KOKKOS_INLINE_FUNCTION static + reference_type get( TaskBase * ) {} +}; + +} /* namespace Impl */ +} /* namespace Kokkos */ + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +namespace Kokkos { +namespace Impl { + +template<> +class TaskQueue< void > {}; /** \brief Manage task allocation, deallocation, and scheduling. * @@ -95,7 +295,7 @@ class TaskQueueSpecialization ; * All other aspects of task management have shared implementation. */ template< typename ExecSpace > -class TaskQueue { +class TaskQueue : public TaskQueue { private: friend class TaskQueueSpecialization< ExecSpace > ; @@ -106,7 +306,7 @@ private: using memory_space = typename specialization::memory_space ; using device_type = Kokkos::Device< execution_space , memory_space > ; using memory_pool = Kokkos::MemoryPool< device_type > ; - using task_root_type = Kokkos::Impl::TaskBase ; + using task_root_type = Kokkos::Impl::TaskBase ; struct Destroy { TaskQueue * m_queue ; @@ -198,12 +398,10 @@ public: } // Assign task pointer with reference counting of assigned tasks - template< typename LV , typename RV > KOKKOS_FUNCTION static - void assign( TaskBase< execution_space,LV,void> ** const lhs - , TaskBase< execution_space,RV,void> * const rhs ) + void assign( task_root_type ** const lhs + , task_root_type * const rhs ) { - using task_lhs = TaskBase< execution_space,LV,void> ; #if 0 { printf( "assign( 0x%lx { 0x%lx %d %d } , 0x%lx { 0x%lx %d %d } )\n" @@ -225,7 +423,7 @@ public: // Force write of *lhs - *static_cast< task_lhs * volatile * >(lhs) = rhs ; + *static_cast< task_root_type * volatile * >(lhs) = rhs ; Kokkos::memory_fence(); } @@ -238,6 +436,38 @@ public: KOKKOS_FUNCTION void deallocate( void * p , size_t n ); ///< Deallocate to the memory pool + + + //---------------------------------------- + /**\brief Allocation size for a spawned task */ + + template< typename FunctorType > + KOKKOS_FUNCTION + size_t spawn_allocation_size() const + { + using value_type = typename FunctorType::value_type ; + + using task_type = Impl::TaskBase< execution_space + , value_type + , FunctorType > ; + + enum : size_t { align = ( 1 << 4 ) , align_mask = align - 1 }; + enum : size_t { task_size = sizeof(task_type) }; + enum : size_t { result_size = Impl::TaskResult< value_type >::size }; + enum : size_t { alloc_size = + ( ( task_size + align_mask ) & ~align_mask ) + + ( ( result_size + align_mask ) & ~align_mask ) }; + + return m_memory.allocate_block_size( task_size ); + } + + /**\brief Allocation size for a when_all aggregate */ + + KOKKOS_FUNCTION + size_t when_all_allocation_size( int narg ) const + { + return m_memory.allocate_block_size( sizeof(task_root_type) + narg * sizeof(task_root_type*) ); + } }; } /* namespace Impl */ @@ -249,261 +479,9 @@ public: namespace Kokkos { namespace Impl { -template<> -class TaskBase< void , void , void > { -public: - enum : int16_t { TaskTeam = 0 , TaskSingle = 1 , Aggregate = 2 }; - enum : uintptr_t { LockTag = ~uintptr_t(0) , EndTag = ~uintptr_t(1) }; -}; - -/** \brief Base class for task management, access, and execution. - * - * Inheritance structure to allow static_cast from the task root type - * and a task's FunctorType. - * - * // Enable a Future to access result data - * TaskBase< Space , ResultType , void > - * : TaskBase< void , void , void > - * { ... }; - * - * // Enable a functor to access the base class - * TaskBase< Space , ResultType , FunctorType > - * : TaskBase< Space , ResultType , void > - * , FunctorType - * { ... }; - * - * - * States of a task: - * - * Constructing State, NOT IN a linked list - * m_wait == 0 - * m_next == 0 - * - * Scheduling transition : Constructing -> Waiting - * before: - * m_wait == 0 - * m_next == this task's initial dependence, 0 if none - * after: - * m_wait == EndTag - * m_next == EndTag - * - * Waiting State, IN a linked list - * m_apply != 0 - * m_queue != 0 - * m_ref_count > 0 - * m_wait == head of linked list of tasks waiting on this task - * m_next == next of linked list of tasks - * - * transition : Waiting -> Executing - * before: - * m_next == EndTag - * after:: - * m_next == LockTag - * - * Executing State, NOT IN a linked list - * m_apply != 0 - * m_queue != 0 - * m_ref_count > 0 - * m_wait == head of linked list of tasks waiting on this task - * m_next == LockTag - * - * Respawn transition : Executing -> Executing-Respawn - * before: - * m_next == LockTag - * after: - * m_next == this task's updated dependence, 0 if none - * - * Executing-Respawn State, NOT IN a linked list - * m_apply != 0 - * m_queue != 0 - * m_ref_count > 0 - * m_wait == head of linked list of tasks waiting on this task - * m_next == this task's updated dependence, 0 if none - * - * transition : Executing -> Complete - * before: - * m_wait == head of linked list - * after: - * m_wait == LockTag - * - * Complete State, NOT IN a linked list - * m_wait == LockTag: cannot add dependence - * m_next == LockTag: not a member of a wait queue - * - */ -template< typename ExecSpace > -class TaskBase< ExecSpace , void , void > -{ -public: - - enum : int16_t { TaskTeam = TaskBase::TaskTeam - , TaskSingle = TaskBase::TaskSingle - , Aggregate = TaskBase::Aggregate }; - - enum : uintptr_t { LockTag = TaskBase::LockTag - , EndTag = TaskBase::EndTag }; - - using execution_space = ExecSpace ; - using queue_type = TaskQueue< execution_space > ; - - template< typename > friend class Kokkos::TaskScheduler ; - - typedef void (* function_type) ( TaskBase * , void * ); - - // sizeof(TaskBase) == 48 - - function_type m_apply ; ///< Apply function pointer - queue_type * m_queue ; ///< Queue in which this task resides - TaskBase * m_wait ; ///< Linked list of tasks waiting on this - TaskBase * m_next ; ///< Waiting linked-list next - int32_t m_ref_count ; ///< Reference count - int32_t m_alloc_size ; ///< Allocation size - int32_t m_dep_count ; ///< Aggregate's number of dependences - int16_t m_task_type ; ///< Type of task - int16_t m_priority ; ///< Priority of runnable task - - TaskBase() = delete ; - TaskBase( TaskBase && ) = delete ; - TaskBase( const TaskBase & ) = delete ; - TaskBase & operator = ( TaskBase && ) = delete ; - TaskBase & operator = ( const TaskBase & ) = delete ; - - KOKKOS_INLINE_FUNCTION ~TaskBase() = default ; - - // Constructor for a runnable task - KOKKOS_INLINE_FUNCTION - constexpr TaskBase( function_type arg_apply - , queue_type * arg_queue - , TaskBase * arg_dependence - , int arg_ref_count - , int arg_alloc_size - , int arg_task_type - , int arg_priority - ) noexcept - : m_apply( arg_apply ) - , m_queue( arg_queue ) - , m_wait( 0 ) - , m_next( arg_dependence ) - , m_ref_count( arg_ref_count ) - , m_alloc_size( arg_alloc_size ) - , m_dep_count( 0 ) - , m_task_type( arg_task_type ) - , m_priority( arg_priority ) - {} - - // Constructor for an aggregate task - KOKKOS_INLINE_FUNCTION - constexpr TaskBase( queue_type * arg_queue - , int arg_ref_count - , int arg_alloc_size - , int arg_dep_count - ) noexcept - : m_apply( 0 ) - , m_queue( arg_queue ) - , m_wait( 0 ) - , m_next( 0 ) - , m_ref_count( arg_ref_count ) - , m_alloc_size( arg_alloc_size ) - , m_dep_count( arg_dep_count ) - , m_task_type( Aggregate ) - , m_priority( 0 ) - {} - - //---------------------------------------- - - KOKKOS_INLINE_FUNCTION - TaskBase ** aggregate_dependences() - { return reinterpret_cast( this + 1 ); } - - KOKKOS_INLINE_FUNCTION - bool requested_respawn() - { - // This should only be called when a task has finished executing and is - // in the transition to either the complete or executing-respawn state. - TaskBase * const lock = reinterpret_cast< TaskBase * >( LockTag ); - return lock != m_next; - } - - KOKKOS_INLINE_FUNCTION - void add_dependence( TaskBase* dep ) - { - // Precondition: lock == m_next - - TaskBase * const lock = (TaskBase *) LockTag ; - - // Assign dependence to m_next. It will be processed in the subsequent - // call to schedule. Error if the dependence is reset. - if ( lock != Kokkos::atomic_exchange( & m_next, dep ) ) { - Kokkos::abort("TaskScheduler ERROR: resetting task dependence"); - } - - if ( 0 != dep ) { - // The future may be destroyed upon returning from this call - // so increment reference count to track this assignment. - Kokkos::atomic_increment( &(dep->m_ref_count) ); - } - } - - using get_return_type = void ; - - KOKKOS_INLINE_FUNCTION - get_return_type get() const {} -}; - -template < typename ExecSpace , typename ResultType > -class TaskBase< ExecSpace , ResultType , void > - : public TaskBase< ExecSpace , void , void > -{ -private: - - using root_type = TaskBase ; - using function_type = typename root_type::function_type ; - using queue_type = typename root_type::queue_type ; - - static_assert( sizeof(root_type) == 48 , "" ); - - TaskBase() = delete ; - TaskBase( TaskBase && ) = delete ; - TaskBase( const TaskBase & ) = delete ; - TaskBase & operator = ( TaskBase && ) = delete ; - TaskBase & operator = ( const TaskBase & ) = delete ; - -public: - - ResultType m_result ; - - KOKKOS_INLINE_FUNCTION ~TaskBase() = default ; - - // Constructor for runnable task - KOKKOS_INLINE_FUNCTION - constexpr TaskBase( function_type arg_apply - , queue_type * arg_queue - , root_type * arg_dependence - , int arg_ref_count - , int arg_alloc_size - , int arg_task_type - , int arg_priority - ) - : root_type( arg_apply - , arg_queue - , arg_dependence - , arg_ref_count - , arg_alloc_size - , arg_task_type - , arg_priority - ) - , m_result() - {} - - using get_return_type = ResultType const & ; - - KOKKOS_INLINE_FUNCTION - get_return_type get() const { return m_result ; } -}; - -template< typename ExecSpace , typename ResultType , typename FunctorType > +template< class ExecSpace , typename ResultType , class FunctorType > class TaskBase - : public TaskBase< ExecSpace , ResultType , void > + : public TaskBase< void , void , void > , public FunctorType { private: @@ -516,50 +494,31 @@ private: public: - using root_type = TaskBase< ExecSpace , void , void > ; - using base_type = TaskBase< ExecSpace , ResultType , void > ; - using specialization = TaskQueueSpecialization< ExecSpace > ; - using function_type = typename root_type::function_type ; - using queue_type = typename root_type::queue_type ; - using member_type = typename specialization::member_type ; + using root_type = TaskBase< void , void , void > ; using functor_type = FunctorType ; using result_type = ResultType ; - template< typename Type > - KOKKOS_INLINE_FUNCTION static - void apply_functor - ( Type * const task - , typename std::enable_if - < std::is_same< typename Type::result_type , void >::value - , member_type * const - >::type member - ) - { - using fType = typename Type::functor_type ; - static_cast(task)->operator()( *member ); - } + using specialization = TaskQueueSpecialization< ExecSpace > ; + using member_type = typename specialization::member_type ; - template< typename Type > - KOKKOS_INLINE_FUNCTION static - void apply_functor - ( Type * const task - , typename std::enable_if - < ! std::is_same< typename Type::result_type , void >::value - , member_type * const - >::type member - ) - { - using fType = typename Type::functor_type ; - static_cast(task)->operator()( *member , task->m_result ); - } + KOKKOS_INLINE_FUNCTION + void apply_functor( member_type * const member , void * ) + { functor_type::operator()( *member ); } + + template< typename T > + KOKKOS_INLINE_FUNCTION + void apply_functor( member_type * const member + , T * const result ) + { functor_type::operator()( *member , *result ); } KOKKOS_FUNCTION static void apply( root_type * root , void * exec ) { TaskBase * const task = static_cast< TaskBase * >( root ); member_type * const member = reinterpret_cast< member_type * >( exec ); + result_type * const result = TaskResult< result_type >::ptr( task ); - TaskBase::template apply_functor( task , member ); + task->apply_functor( member , result ); // Task may be serial or team. // If team then must synchronize before querying if respawn was requested. @@ -576,26 +535,9 @@ public: } // Constructor for runnable task - KOKKOS_INLINE_FUNCTION - constexpr TaskBase( function_type arg_apply - , queue_type * arg_queue - , root_type * arg_dependence - , int arg_ref_count - , int arg_alloc_size - , int arg_task_type - , int arg_priority - , FunctorType && arg_functor - ) - : base_type( arg_apply - , arg_queue - , arg_dependence - , arg_ref_count - , arg_alloc_size - , arg_task_type - , arg_priority - ) - , functor_type( arg_functor ) - {} + KOKKOS_INLINE_FUNCTION constexpr + TaskBase( FunctorType && arg_functor ) + : root_type() , functor_type( std::move(arg_functor) ) {} KOKKOS_INLINE_FUNCTION ~TaskBase() {} diff --git a/lib/kokkos/core/src/impl/Kokkos_TaskQueue_impl.hpp b/lib/kokkos/core/src/impl/Kokkos_TaskQueue_impl.hpp index aee381afad..0cce45b2e7 100644 --- a/lib/kokkos/core/src/impl/Kokkos_TaskQueue_impl.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_TaskQueue_impl.hpp @@ -44,6 +44,8 @@ #include #if defined( KOKKOS_ENABLE_TASKDAG ) +#define KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING 0 + namespace Kokkos { namespace Impl { @@ -100,9 +102,11 @@ KOKKOS_FUNCTION void TaskQueue< ExecSpace >::decrement ( TaskQueue< ExecSpace >::task_root_type * task ) { - const int count = Kokkos::atomic_fetch_add(&(task->m_ref_count),-1); + task_root_type volatile & t = *task ; -#if 0 + const int count = Kokkos::atomic_fetch_add(&(t.m_ref_count),-1); + +#if KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING if ( 1 == count ) { printf( "decrement-destroy( 0x%lx { 0x%lx %d %d } )\n" , uintptr_t( task ) @@ -114,9 +118,13 @@ void TaskQueue< ExecSpace >::decrement #endif if ( ( 1 == count ) && - ( task->m_next == (task_root_type *) task_root_type::LockTag ) ) { + ( t.m_next == (task_root_type *) task_root_type::LockTag ) ) { // Reference count is zero and task is complete, deallocate. - task->m_queue->deallocate( task , task->m_alloc_size ); + + TaskQueue< ExecSpace > * const queue = + static_cast< TaskQueue< ExecSpace > * >( t.m_queue ); + + queue->deallocate( task , t.m_alloc_size ); } else if ( count <= 1 ) { Kokkos::abort("TaskScheduler task has negative reference count or is incomplete" ); @@ -171,7 +179,7 @@ bool TaskQueue< ExecSpace >::push_task // Fail the push attempt if the queue is locked; // otherwise retry until the push succeeds. -#if 0 +#if KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING printf( "push_task( 0x%lx { 0x%lx } 0x%lx { 0x%lx 0x%lx %d %d %d } )\n" , uintptr_t(queue) , uintptr_t(*queue) @@ -186,9 +194,9 @@ bool TaskQueue< ExecSpace >::push_task task_root_type * const zero = (task_root_type *) 0 ; task_root_type * const lock = (task_root_type *) task_root_type::LockTag ; - task_root_type * volatile * const next = & task->m_next ; + task_root_type * volatile & next = task->m_next ; - if ( zero != *next ) { + if ( zero != next ) { Kokkos::abort("TaskQueue::push_task ERROR: already a member of another queue" ); } @@ -196,9 +204,9 @@ bool TaskQueue< ExecSpace >::push_task while ( lock != y ) { - *next = y ; + next = y ; - // Do not proceed until '*next' has been stored. + // Do not proceed until 'next' has been stored. Kokkos::memory_fence(); task_root_type * const x = y ; @@ -211,9 +219,9 @@ bool TaskQueue< ExecSpace >::push_task // Failed, replace 'task->m_next' value since 'task' remains // not a member of a queue. - *next = zero ; + next = zero ; - // Do not proceed until '*next' has been stored. + // Do not proceed until 'next' has been stored. Kokkos::memory_fence(); return false ; @@ -270,11 +278,13 @@ TaskQueue< ExecSpace >::pop_ready_task // This thread has exclusive access to // the queue and the popped task's m_next. - *queue = task->m_next ; task->m_next = lock ; + task_root_type * volatile & next = task->m_next ; + + *queue = next ; next = lock ; Kokkos::memory_fence(); -#if 0 +#if KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING printf( "pop_ready_task( 0x%lx 0x%lx { 0x%lx 0x%lx %d %d %d } )\n" , uintptr_t(queue) , uintptr_t(task) @@ -323,7 +333,7 @@ void TaskQueue< ExecSpace >::schedule_runnable // task->m_wait == head of linked list (queue) // task->m_next == member of linked list (queue) -#if 0 +#if KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING printf( "schedule_runnable( 0x%lx { 0x%lx 0x%lx %d %d %d }\n" , uintptr_t(task) , uintptr_t(task->m_wait) @@ -337,20 +347,22 @@ void TaskQueue< ExecSpace >::schedule_runnable task_root_type * const lock = (task_root_type *) task_root_type::LockTag ; task_root_type * const end = (task_root_type *) task_root_type::EndTag ; + task_root_type volatile & t = *task ; + bool respawn = false ; //---------------------------------------- - if ( zero == task->m_wait ) { + if ( zero == t.m_wait ) { // Task in Constructing state // - Transition to Waiting state // Preconditions: // - call occurs exclusively within a single thread - task->m_wait = end ; + t.m_wait = end ; // Task in Waiting state } - else if ( lock != task->m_wait ) { + else if ( lock != t.m_wait ) { // Task in Executing state with Respawn request // - Update dependence // - Transition to Waiting state @@ -373,7 +385,9 @@ void TaskQueue< ExecSpace >::schedule_runnable // Exclusive access so don't need an atomic exchange // task_root_type * dep = Kokkos::atomic_exchange( & task->m_next , zero ); - task_root_type * dep = task->m_next ; task->m_next = zero ; + task_root_type * dep = t.m_next ; t.m_next = zero ; + + Kokkos::memory_fence(); const bool is_ready = ( 0 == dep ) || ( ! push_task( & dep->m_wait , task ) ); @@ -398,7 +412,7 @@ void TaskQueue< ExecSpace >::schedule_runnable Kokkos::atomic_increment( & m_ready_count ); task_root_type * volatile * const ready_queue = - & m_ready[ task->m_priority ][ task->m_task_type ]; + & m_ready[ t.m_priority ][ t.m_task_type ]; // A push_task fails if the ready queue is locked. // A ready queue is only locked during a push or pop; @@ -441,11 +455,12 @@ void TaskQueue< ExecSpace >::schedule_aggregate // task->m_wait == head of linked list (queue) // task->m_next == member of linked list (queue) -#if 0 - printf( "schedule_aggregate( 0x%lx { 0x%lx 0x%lx %d %d %d }\n" +#if KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING + printf( "schedule_aggregate( 0x%lx { 0x%lx 0x%lx %d %d %d %d }\n" , uintptr_t(task) , uintptr_t(task->m_wait) , uintptr_t(task->m_next) + , task->m_dep_count , task->m_task_type , task->m_priority , task->m_ref_count ); @@ -455,18 +470,20 @@ void TaskQueue< ExecSpace >::schedule_aggregate task_root_type * const lock = (task_root_type *) task_root_type::LockTag ; task_root_type * const end = (task_root_type *) task_root_type::EndTag ; + task_root_type volatile & t = *task ; + //---------------------------------------- - if ( zero == task->m_wait ) { + if ( zero == t.m_wait ) { // Task in Constructing state // - Transition to Waiting state // Preconditions: // - call occurs exclusively within a single thread - task->m_wait = end ; + t.m_wait = end ; // Task in Waiting state } - else if ( lock == task->m_wait ) { + else if ( lock == t.m_wait ) { // Task in Complete state Kokkos::abort("TaskQueue::schedule_aggregate ERROR: task is complete"); } @@ -477,14 +494,14 @@ void TaskQueue< ExecSpace >::schedule_aggregate // (1) created or // (2) being removed from a completed task's wait list. - task_root_type ** const aggr = task->aggregate_dependences(); + task_root_type * volatile * const aggr = t.aggregate_dependences(); // Assume the 'when_all' is complete until a dependence is // found that is not complete. bool is_complete = true ; - for ( int i = task->m_dep_count ; 0 < i && is_complete ; ) { + for ( int i = t.m_dep_count ; 0 < i && is_complete ; ) { --i ; @@ -523,7 +540,7 @@ void TaskQueue< ExecSpace >::schedule_aggregate // Complete the when_all 'task' to schedule other tasks // that are waiting for the when_all 'task' to complete. - task->m_next = lock ; + t.m_next = lock ; complete( task ); @@ -573,7 +590,7 @@ void TaskQueue< ExecSpace >::complete task_root_type * const lock = (task_root_type *) task_root_type::LockTag ; task_root_type * const end = (task_root_type *) task_root_type::EndTag ; -#if 0 +#if KOKKOS_IMPL_DEBUG_TASKDAG_SCHEDULING printf( "complete( 0x%lx { 0x%lx 0x%lx %d %d %d }\n" , uintptr_t(task) , uintptr_t(task->m_wait) @@ -581,14 +598,15 @@ void TaskQueue< ExecSpace >::complete , task->m_task_type , task->m_priority , task->m_ref_count ); - fflush( stdout ); #endif - const bool runnable = task_root_type::Aggregate != task->m_task_type ; + task_root_type volatile & t = *task ; + + const bool runnable = task_root_type::Aggregate != t.m_task_type ; //---------------------------------------- - if ( runnable && lock != task->m_next ) { + if ( runnable && lock != t.m_next ) { // Is a runnable task has finished executing and requested respawn. // Schedule the task for subsequent execution. @@ -607,7 +625,7 @@ void TaskQueue< ExecSpace >::complete // Stop other tasks from adding themselves to this task's wait queue // by locking the head of this task's wait queue. - task_root_type * x = Kokkos::atomic_exchange( & task->m_wait , lock ); + task_root_type * x = Kokkos::atomic_exchange( & t.m_wait , lock ); if ( x != (task_root_type *) lock ) { @@ -627,9 +645,13 @@ void TaskQueue< ExecSpace >::complete // Have exclusive access to 'x' until it is scheduled // Set x->m_next = zero <= no dependence, not a respawn - task_root_type * const next = x->m_next ; x->m_next = 0 ; + task_root_type volatile & vx = *x ; - if ( task_root_type::Aggregate != x->m_task_type ) { + task_root_type * const next = vx.m_next ; vx.m_next = 0 ; + + Kokkos::memory_fence(); + + if ( task_root_type::Aggregate != vx.m_task_type ) { schedule_runnable( x ); } else { diff --git a/lib/kokkos/core/src/impl/Kokkos_Traits.hpp b/lib/kokkos/core/src/impl/Kokkos_Traits.hpp index 6300417576..b59548ea1d 100644 --- a/lib/kokkos/core/src/impl/Kokkos_Traits.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_Traits.hpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -435,21 +436,12 @@ struct power_of_two<1,true> /** \brief If power of two then return power, * otherwise return ~0u. */ -static KOKKOS_FORCEINLINE_FUNCTION +KOKKOS_FORCEINLINE_FUNCTION unsigned power_of_two_if_valid( const unsigned N ) { unsigned p = ~0u ; - if ( N && ! ( N & ( N - 1 ) ) ) { -#if defined( __CUDA_ARCH__ ) && defined( KOKKOS_ENABLE_CUDA ) - p = __ffs(N) - 1 ; -#elif defined( __GNUC__ ) || defined( __GNUG__ ) - p = __builtin_ffs(N) - 1 ; -#elif defined( __INTEL_COMPILER ) - p = _bit_scan_forward(N); -#else - p = 0 ; - for ( unsigned j = 1 ; ! ( N & j ) ; j <<= 1 ) { ++p ; } -#endif + if ( is_integral_power_of_two ( N ) ) { + p = bit_scan_forward ( N ) ; } return p ; } diff --git a/lib/kokkos/core/src/impl/Kokkos_ViewArray.hpp b/lib/kokkos/core/src/impl/Kokkos_ViewArray.hpp index c55636b64e..ed1a71bea7 100644 --- a/lib/kokkos/core/src/impl/Kokkos_ViewArray.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_ViewArray.hpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ @@ -47,7 +47,6 @@ #include namespace Kokkos { -namespace Experimental { namespace Impl { template< class DataType , class ArrayLayout , class V , size_t N , class P > @@ -94,13 +93,12 @@ public: typedef typename ViewDataType< non_const_scalar_type , array_scalar_dimension >::type non_const_scalar_array_type ; }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { /** \brief View mapping for non-specialized data type and standard layout */ @@ -597,7 +595,7 @@ public: } }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/impl/Kokkos_ViewCtor.hpp b/lib/kokkos/core/src/impl/Kokkos_ViewCtor.hpp index 6381aee468..70522d4067 100644 --- a/lib/kokkos/core/src/impl/Kokkos_ViewCtor.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_ViewCtor.hpp @@ -96,6 +96,29 @@ struct is_view_label< const char[N] > : public std::true_type {}; template< typename ... P > struct ViewCtorProp ; +// Forward declare +template< typename Specialize , typename T > +struct CommonViewAllocProp ; + +/* Common value_type stored as ViewCtorProp + */ +template< typename Specialize , typename T > +struct ViewCtorProp< void , CommonViewAllocProp > +{ + ViewCtorProp() = default ; + ViewCtorProp( const ViewCtorProp & ) = default ; + ViewCtorProp & operator = ( const ViewCtorProp & ) = default ; + + using type = CommonViewAllocProp ; + + KOKKOS_INLINE_FUNCTION + ViewCtorProp( const type & arg ) : value( arg ) {} + KOKKOS_INLINE_FUNCTION + ViewCtorProp( type && arg ) : value( arg ) {} + + type value ; +}; + /* std::integral_constant are dummy arguments * that avoid duplicate base class errors */ @@ -107,6 +130,7 @@ struct ViewCtorProp< void , std::integral_constant > ViewCtorProp & operator = ( const ViewCtorProp & ) = default ; template< typename P > + KOKKOS_INLINE_FUNCTION ViewCtorProp( const P & ) {} }; diff --git a/lib/kokkos/core/src/impl/Kokkos_ViewMapping.hpp b/lib/kokkos/core/src/impl/Kokkos_ViewMapping.hpp index 900bd88f1c..413b55298c 100644 --- a/lib/kokkos/core/src/impl/Kokkos_ViewMapping.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_ViewMapping.hpp @@ -62,7 +62,6 @@ //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { template< unsigned I , size_t ... Args > @@ -250,7 +249,7 @@ struct ViewDimensionAssignable< ViewDimension< DstArgs ... > }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -266,14 +265,11 @@ struct ALL_t { }} // namespace Kokkos::Impl namespace Kokkos { -namespace Experimental { namespace Impl { -using Kokkos::Impl::ALL_t ; - template< class T > struct is_integral_extent_type -{ enum { value = std::is_same::value ? 1 : 0 }; }; +{ enum { value = std::is_same::value ? 1 : 0 }; }; template< class iType > struct is_integral_extent_type< std::pair > @@ -314,10 +310,10 @@ struct SubviewLegalArgsCompileTime; template struct SubviewLegalArgsCompileTime { - enum { value =(((CurrentArg==RankDest-1) && (Kokkos::Experimental::Impl::is_integral_extent_type::value)) || + enum { value =(((CurrentArg==RankDest-1) && (Kokkos::Impl::is_integral_extent_type::value)) || ((CurrentArg>=RankDest) && (std::is_integral::value)) || ((CurrentArg::value)) || - ((CurrentArg==0) && (Kokkos::Experimental::Impl::is_integral_extent_type::value)) + ((CurrentArg==0) && (Kokkos::Impl::is_integral_extent_type::value)) ) && (SubviewLegalArgsCompileTime::value)}; }; @@ -331,7 +327,7 @@ struct SubviewLegalArgsCompileTime struct SubviewLegalArgsCompileTime { - enum { value =(((CurrentArg==RankSrc-RankDest) && (Kokkos::Experimental::Impl::is_integral_extent_type::value)) || + enum { value =(((CurrentArg==RankSrc-RankDest) && (Kokkos::Impl::is_integral_extent_type::value)) || ((CurrentArg::value)) || ((CurrentArg>=RankSrc-RankDest) && (std::is_same::value)) ) && (SubviewLegalArgsCompileTime::value)}; @@ -373,9 +369,9 @@ private: template< size_t ... DimArgs > KOKKOS_FORCEINLINE_FUNCTION - bool set( unsigned domain_rank - , unsigned range_rank - , const ViewDimension< DimArgs ... > & dim ) + bool set( unsigned + , unsigned + , const ViewDimension< DimArgs ... > & ) { return true ; } template< class T , size_t ... DimArgs , class ... Args > @@ -403,7 +399,7 @@ private: bool set( unsigned domain_rank , unsigned range_rank , const ViewDimension< DimArgs ... > & dim - , const Kokkos::Experimental::Impl::ALL_t + , const Kokkos::Impl::ALL_t , Args ... args ) { m_begin[ domain_rank ] = 0 ; @@ -519,7 +515,7 @@ private: , unsigned domain_rank , unsigned range_rank , const ViewDimension< DimArgs ... > & dim - , const Kokkos::Experimental::Impl::ALL_t + , const Kokkos::Impl::ALL_t , Args ... args ) const { const int n = std::min( buf_len , @@ -670,13 +666,12 @@ public: { return unsigned(i) < InternalRangeRank ? m_index[i] : ~0u ; } }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { /** \brief Given a value type and dimension generate the View data type */ @@ -814,13 +809,12 @@ public: typedef non_const_type non_const_scalar_array_type ; }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { template < class Dimension , class Layout , typename Enable = void > @@ -1021,8 +1015,13 @@ struct ViewOffset< Dimension , Kokkos::LayoutLeft constexpr ViewOffset( const ViewOffset< DimRHS , Kokkos::LayoutRight , void > & rhs ) : m_dim( rhs.m_dim.N0, 0, 0, 0, 0, 0, 0, 0 ) { - static_assert( DimRHS::rank == 1 && dimension_type::rank == 1 && dimension_type::rank_dynamic == 1 - , "ViewOffset LayoutLeft and LayoutRight are only compatible when rank == 1" ); + static_assert( + ( DimRHS::rank == 0 && + dimension_type::rank == 0 ) || + ( DimRHS::rank == 1 && + dimension_type::rank == 1 && + dimension_type::rank_dynamic == 1 ) + , "ViewOffset LayoutLeft and LayoutRight are only compatible when rank <= 1" ); } template< class DimRHS > @@ -1030,8 +1029,13 @@ struct ViewOffset< Dimension , Kokkos::LayoutLeft ViewOffset( const ViewOffset< DimRHS , Kokkos::LayoutStride , void > & rhs ) : m_dim( rhs.m_dim.N0, 0, 0, 0, 0, 0, 0, 0 ) { - static_assert( DimRHS::rank == 1 && dimension_type::rank == 1 && dimension_type::rank_dynamic == 1 - , "ViewOffset LayoutLeft and LayoutStride are only compatible when rank == 1" ); + static_assert( + ( DimRHS::rank == 0 && + dimension_type::rank == 0 ) || + ( DimRHS::rank == 1 && + dimension_type::rank == 1 && + dimension_type::rank_dynamic == 1 ) + , "ViewOffset LayoutLeft and LayoutStride are only compatible when rank <= 1" ); if ( rhs.m_stride.S0 != 1 ) { Kokkos::abort("Kokkos::Impl::ViewOffset assignment of LayoutLeft from LayoutStride requires stride == 1" ); } @@ -1043,7 +1047,7 @@ struct ViewOffset< Dimension , Kokkos::LayoutLeft template< class DimRHS > KOKKOS_INLINE_FUNCTION constexpr ViewOffset( - const ViewOffset< DimRHS , Kokkos::LayoutLeft , void > & rhs , + const ViewOffset< DimRHS , Kokkos::LayoutLeft , void > & , const SubviewExtents< DimRHS::rank , dimension_type::rank > & sub ) : m_dim( sub.range_extent(0), 0, 0, 0, 0, 0, 0, 0 ) { @@ -1228,14 +1232,14 @@ private: // If memory alignment is a multiple of the trivial scalar size then attempt to align. enum { align = 0 != TrivialScalarSize && 0 == mod ? div : 0 }; - enum { div_ok = div ? div : 1 }; // To valid modulo zero in constexpr + enum { div_ok = (div != 0) ? div : 1 }; // To valid modulo zero in constexpr KOKKOS_INLINE_FUNCTION static constexpr size_t stride( size_t const N ) - { - return ( align && ( Kokkos::Impl::MEMORY_ALIGNMENT_THRESHOLD * align < N ) && ( N % div_ok ) ) - ? N + align - ( N % div_ok ) : N ; - } + { + return ( (align != 0) && ((Kokkos::Impl::MEMORY_ALIGNMENT_THRESHOLD * align) < N) && ((N % div_ok) != 0) ) + ? N + align - ( N % div_ok ) : N ; + } }; public: @@ -1248,7 +1252,7 @@ public: template< unsigned TrivialScalarSize > KOKKOS_INLINE_FUNCTION constexpr ViewOffset - ( std::integral_constant const & padding_type_size + ( std::integral_constant const & , Kokkos::LayoutLeft const & arg_layout ) : m_dim( arg_layout.dimension[0] , arg_layout.dimension[1] @@ -1499,8 +1503,13 @@ struct ViewOffset< Dimension , Kokkos::LayoutRight constexpr ViewOffset( const ViewOffset< DimRHS , Kokkos::LayoutLeft , void > & rhs ) : m_dim( rhs.m_dim.N0, 0, 0, 0, 0, 0, 0, 0 ) { - static_assert( DimRHS::rank == 1 && dimension_type::rank == 1 && dimension_type::rank_dynamic == 1 - , "ViewOffset LayoutRight and LayoutLeft are only compatible when rank == 1" ); + static_assert( + ( DimRHS::rank == 0 && + dimension_type::rank == 0 ) || + ( DimRHS::rank == 1 && + dimension_type::rank == 1 && + dimension_type::rank_dynamic == 1 ) + , "ViewOffset LayoutRight and LayoutLeft are only compatible when rank <= 1" ); } template< class DimRHS > @@ -1508,8 +1517,13 @@ struct ViewOffset< Dimension , Kokkos::LayoutRight ViewOffset( const ViewOffset< DimRHS , Kokkos::LayoutStride , void > & rhs ) : m_dim( rhs.m_dim.N0, 0, 0, 0, 0, 0, 0, 0 ) { - static_assert( DimRHS::rank == 1 && dimension_type::rank == 1 && dimension_type::rank_dynamic == 1 - , "ViewOffset LayoutLeft/Right and LayoutStride are only compatible when rank == 1" ); + static_assert( + ( DimRHS::rank == 0 && + dimension_type::rank == 0 ) || + ( DimRHS::rank == 1 && + dimension_type::rank == 1 && + dimension_type::rank_dynamic == 1 ) + , "ViewOffset LayoutRight and LayoutString are only compatible when rank <= 1" ); if ( rhs.m_stride.S0 != 1 ) { Kokkos::abort("Kokkos::Impl::ViewOffset assignment of LayoutLeft/Right from LayoutStride requires stride == 1" ); } @@ -1707,12 +1721,12 @@ private: // If memory alignment is a multiple of the trivial scalar size then attempt to align. enum { align = 0 != TrivialScalarSize && 0 == mod ? div : 0 }; - enum { div_ok = div ? div : 1 }; // To valid modulo zero in constexpr + enum { div_ok = (div != 0) ? div : 1 }; // To valid modulo zero in constexpr KOKKOS_INLINE_FUNCTION static constexpr size_t stride( size_t const N ) { - return ( align && ( Kokkos::Impl::MEMORY_ALIGNMENT_THRESHOLD * align < N ) && ( N % div_ok ) ) + return ( (align != 0) && ((Kokkos::Impl::MEMORY_ALIGNMENT_THRESHOLD * align) < N) && ((N % div_ok) != 0) ) ? N + align - ( N % div_ok ) : N ; } }; @@ -1727,7 +1741,7 @@ public: template< unsigned TrivialScalarSize > KOKKOS_INLINE_FUNCTION constexpr ViewOffset - ( std::integral_constant const & padding_type_size + ( std::integral_constant const & , Kokkos::LayoutRight const & arg_layout ) : m_dim( arg_layout.dimension[0] , arg_layout.dimension[1] @@ -2225,13 +2239,12 @@ public: {} }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { /** \brief ViewDataHandle provides the type of the 'data handle' which the view @@ -2355,7 +2368,7 @@ struct ViewDataHandle< Traits , )>::type > { typedef typename Traits::value_type value_type ; - typedef typename Traits::value_type * KOKKOS_ALIGN_PTR(KOKKOS_ALIGN_SIZE) handle_type ; + typedef typename Traits::value_type * KOKKOS_IMPL_ALIGN_PTR(KOKKOS_MEMORY_ALIGNMENT) handle_type ; typedef typename Traits::value_type & return_type ; typedef Kokkos::Impl::SharedAllocationTracker track_type ; @@ -2363,7 +2376,7 @@ struct ViewDataHandle< Traits , static handle_type assign( value_type * arg_data_ptr , track_type const & /*arg_tracker*/ ) { - if ( reinterpret_cast(arg_data_ptr) % KOKKOS_ALIGN_SIZE ) { + if ( reinterpret_cast(arg_data_ptr) % Impl::MEMORY_ALIGNMENT ) { Kokkos::abort("Assigning NonAligned View or Pointer to Kokkos::View with Aligned attribute"); } return handle_type( arg_data_ptr ); @@ -2373,7 +2386,7 @@ struct ViewDataHandle< Traits , static handle_type assign( handle_type const arg_data_ptr , size_t offset ) { - if ( reinterpret_cast(arg_data_ptr+offset) % KOKKOS_ALIGN_SIZE ) { + if ( reinterpret_cast(arg_data_ptr+offset) % Impl::MEMORY_ALIGNMENT ) { Kokkos::abort("Assigning NonAligned View or Pointer to Kokkos::View with Aligned attribute"); } return handle_type( arg_data_ptr + offset ); @@ -2398,7 +2411,7 @@ struct ViewDataHandle< Traits , )>::type > { typedef typename Traits::value_type value_type ; - typedef typename Traits::value_type * KOKKOS_RESTRICT KOKKOS_ALIGN_PTR(KOKKOS_ALIGN_SIZE) handle_type ; + typedef typename Traits::value_type * KOKKOS_RESTRICT KOKKOS_IMPL_ALIGN_PTR(KOKKOS_MEMORY_ALIGNMENT) handle_type ; typedef typename Traits::value_type & return_type ; typedef Kokkos::Impl::SharedAllocationTracker track_type ; @@ -2406,7 +2419,7 @@ struct ViewDataHandle< Traits , static handle_type assign( value_type * arg_data_ptr , track_type const & /*arg_tracker*/ ) { - if ( reinterpret_cast(arg_data_ptr) % KOKKOS_ALIGN_SIZE ) { + if ( reinterpret_cast(arg_data_ptr) % Impl::MEMORY_ALIGNMENT ) { Kokkos::abort("Assigning NonAligned View or Pointer to Kokkos::View with Aligned attribute"); } return handle_type( arg_data_ptr ); @@ -2416,19 +2429,18 @@ struct ViewDataHandle< Traits , static handle_type assign( handle_type const arg_data_ptr , size_t offset ) { - if ( reinterpret_cast(arg_data_ptr+offset) % KOKKOS_ALIGN_SIZE ) { + if ( reinterpret_cast(arg_data_ptr+offset) % Impl::MEMORY_ALIGNMENT ) { Kokkos::abort("Assigning NonAligned View or Pointer to Kokkos::View with Aligned attribute"); } return handle_type( arg_data_ptr + offset ); } }; -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { //---------------------------------------------------------------------------- @@ -2451,8 +2463,9 @@ template< class ExecSpace , class ValueType > struct ViewValueFunctor< ExecSpace , ValueType , false /* is_scalar */ > { typedef Kokkos::RangePolicy< ExecSpace > PolicyType ; + typedef typename ExecSpace::execution_space Exec; - ExecSpace space ; + Exec space ; ValueType * ptr ; size_t n ; bool destroy ; @@ -2597,6 +2610,9 @@ private: public: + typedef void printable_label_typedef; + enum { is_managed = Traits::is_managed }; + //---------------------------------------- // Domain dimensions @@ -2767,6 +2783,11 @@ public: , m_offset( std::integral_constant< unsigned , 0 >() , arg_layout ) {} + /**\brief Assign data */ + KOKKOS_INLINE_FUNCTION + void assign_data( pointer_type arg_ptr ) + { m_handle = handle_type( arg_ptr ); } + //---------------------------------------- /* Allocate and construct mapped array. * Allocate via shared allocation record and @@ -2944,7 +2965,7 @@ public: Kokkos::abort("View Assignment: trying to assign runtime dimension to non matching compile time dimension."); } dst.m_offset = dst_offset_type( src.m_offset ); - dst.m_handle = Kokkos::Experimental::Impl::ViewDataHandle< DstTraits >::assign( src.m_handle , src_track ); + dst.m_handle = Kokkos::Impl::ViewDataHandle< DstTraits >::assign( src.m_handle , src_track ); } }; @@ -3102,7 +3123,7 @@ public: //---------------------------------------------------------------------------- -}}} // namespace Kokkos::Experimental::Impl +}} // namespace Kokkos::Impl //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- @@ -3151,6 +3172,77 @@ void view_error_operator_bounds view_error_operator_bounds(buf+n,len-n,map,args...); } +#if ! defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + +/* Check #3: is the View managed as determined by the MemoryTraits? */ +template< class MapType, + bool is_managed = (MapType::is_managed != 0) > +struct OperatorBoundsErrorOnDevice; + +template< class MapType > +struct OperatorBoundsErrorOnDevice< MapType, false > { +KOKKOS_INLINE_FUNCTION +static void run(MapType const&) { + Kokkos::abort("View bounds error"); +} +}; + +template< class MapType > +struct OperatorBoundsErrorOnDevice< MapType, true > { +KOKKOS_INLINE_FUNCTION +static void run(MapType const& map) { + char const* const user_alloc_start = reinterpret_cast(map.data()); + char const* const header_start = user_alloc_start - sizeof(SharedAllocationHeader); + SharedAllocationHeader const* const header = + reinterpret_cast(header_start); + char const* const label = header->label(); + enum { LEN = 128 }; + char msg[LEN]; + char const* const first_part = "View bounds error of view "; + char* p = msg; + char* const end = msg + LEN - 1; + for (char const* p2 = first_part; (*p2 != '\0') && (p < end); ++p, ++p2) { + *p = *p2; + } + for (char const* p2 = label; (*p2 != '\0') && (p < end); ++p, ++p2) { + *p = *p2; + } + *p = '\0'; + Kokkos::abort(msg); +} +}; + +/* Check #2: does the ViewMapping have the printable_label_typedef defined? + See above that only the non-specialized standard-layout ViewMapping has + this defined by default. + The existence of this typedef indicates the existence of MapType::is_managed */ +template< class T, class Enable = void > +struct has_printable_label_typedef : public std::false_type {}; + +template +struct has_printable_label_typedef< + T, typename enable_if_type::type> + : public std::true_type +{}; + +template< class MapType > +KOKKOS_INLINE_FUNCTION +void operator_bounds_error_on_device( + MapType const&, + std::false_type) { + Kokkos::abort("View bounds error"); +} + +template< class MapType > +KOKKOS_INLINE_FUNCTION +void operator_bounds_error_on_device( + MapType const& map, + std::true_type) { + OperatorBoundsErrorOnDevice< MapType >::run(map); +} + +#endif // ! defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) + template< class MemorySpace , class MapType , class ... Args > KOKKOS_INLINE_FUNCTION void view_verify_operator_bounds @@ -3166,7 +3258,17 @@ void view_verify_operator_bounds view_error_operator_bounds<0>( buffer + n , LEN - n , map , args ... ); Kokkos::Impl::throw_runtime_exception(std::string(buffer)); #else - Kokkos::abort("View bounds error"); + /* Check #1: is there a SharedAllocationRecord? + (we won't use it, but if its not there then there isn't + a corresponding SharedAllocationHeader containing a label). + This check should cover the case of Views that don't + have the Unmanaged trait but were initialized by pointer. */ + if (tracker.has_record()) { + operator_bounds_error_on_device( + map, has_printable_label_typedef()); + } else { + Kokkos::abort("View bounds error"); + } #endif } } diff --git a/lib/kokkos/core/src/impl/Kokkos_ViewTile.hpp b/lib/kokkos/core/src/impl/Kokkos_ViewTile.hpp index ecbcf72fe0..54d061a503 100644 --- a/lib/kokkos/core/src/impl/Kokkos_ViewTile.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_ViewTile.hpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ @@ -48,7 +48,6 @@ //---------------------------------------------------------------------------- namespace Kokkos { -namespace Experimental { namespace Impl { // View mapping for rank two tiled array @@ -144,10 +143,10 @@ public: //---------------------------------------- - ~ViewOffset() = default ; - KOKKOS_INLINE_FUNCTION ViewOffset() = default ; - KOKKOS_INLINE_FUNCTION ViewOffset( const ViewOffset & ) = default ; - KOKKOS_INLINE_FUNCTION ViewOffset & operator = ( const ViewOffset & ) = default ; + KOKKOS_FUNCTION_DEFAULTED ~ViewOffset() = default ; + KOKKOS_FUNCTION_DEFAULTED ViewOffset() = default ; + KOKKOS_FUNCTION_DEFAULTED ViewOffset( const ViewOffset & ) = default ; + KOKKOS_FUNCTION_DEFAULTED ViewOffset & operator = ( const ViewOffset & ) = default ; template< unsigned TrivialScalarSize > KOKKOS_INLINE_FUNCTION @@ -195,11 +194,9 @@ struct ViewMapping }; } /* namespace Impl */ -} /* namespace Experimental */ } /* namespace Kokkos */ namespace Kokkos { -namespace Experimental { template< typename T , unsigned N0 , unsigned N1 , class ... P > KOKKOS_INLINE_FUNCTION @@ -217,7 +214,6 @@ tile_subview( const Kokkos::View,P...> & ( src , SrcLayout() , i_tile0 , i_tile1 ); } -} /* namespace Experimental */ } /* namespace Kokkos */ //---------------------------------------------------------------------------- diff --git a/lib/kokkos/core/src/impl/Kokkos_hwloc.cpp b/lib/kokkos/core/src/impl/Kokkos_hwloc.cpp index 55d7651eca..b8de8674d4 100644 --- a/lib/kokkos/core/src/impl/Kokkos_hwloc.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_hwloc.cpp @@ -48,6 +48,7 @@ #include #include +#include #include #include @@ -312,14 +313,18 @@ Sentinel::Sentinel() hwloc_get_cpubind( s_hwloc_topology , s_process_binding , HWLOC_CPUBIND_PROCESS ); if ( hwloc_bitmap_iszero( s_process_binding ) ) { - std::cerr << "WARNING: Cannot detect process binding -- ASSUMING ALL processing units" << std::endl; + if (Kokkos::show_warnings() ) { + std::cerr << "WARNING: Cannot detect process binding -- ASSUMING ALL processing units" << std::endl; + } const int pu_depth = hwloc_get_type_depth( s_hwloc_topology, HWLOC_OBJ_PU ); int num_pu = 1; if ( pu_depth != HWLOC_TYPE_DEPTH_UNKNOWN ) { num_pu = hwloc_get_nbobjs_by_depth( s_hwloc_topology, pu_depth ); } else { - std::cerr << "WARNING: Cannot detect number of processing units -- ASSUMING 1 (serial)." << std::endl; + if (Kokkos::show_warnings() ) { + std::cerr << "WARNING: Cannot detect number of processing units -- ASSUMING 1 (serial)." << std::endl; + } num_pu = 1; } hwloc_bitmap_set_range( s_process_binding, 0, num_pu-1); @@ -349,7 +354,7 @@ Sentinel::Sentinel() hwloc_bitmap_free( s_process_no_core_zero ); - if ( ! ok ) { + if ( Kokkos::show_warnings() && ! ok ) { std::cerr << "WARNING: Kokkos::hwloc attempted and failed to move process off of core #0" << std::endl ; } } @@ -503,8 +508,8 @@ Sentinel::Sentinel() hwloc_bitmap_free( proc_cpuset_location ); - if ( ! symmetric ) { - std::cout << "Kokkos::hwloc WARNING: Using a symmetric subset of a non-symmetric core topology." + if ( Kokkos::show_warnings() && ! symmetric ) { + std::cerr << "Kokkos::hwloc WARNING: Using a symmetric subset of a non-symmetric core topology." << std::endl ; } } diff --git a/lib/kokkos/core/src/impl/Kokkos_spinwait.cpp b/lib/kokkos/core/src/impl/Kokkos_spinwait.cpp deleted file mode 100644 index 101b714fcd..0000000000 --- a/lib/kokkos/core/src/impl/Kokkos_spinwait.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* -//@HEADER -// ************************************************************************ -// -// Kokkos v. 2.0 -// Copyright (2014) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) -// -// ************************************************************************ -//@HEADER -*/ - -#include -#if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) - -#include - -#include -#include - -/*--------------------------------------------------------------------------*/ - -#if !defined( _WIN32 ) - #if defined( KOKKOS_ENABLE_ASM ) - #if defined( __arm__ ) || defined( __aarch64__ ) - /* No-operation instruction to idle the thread. */ - #define KOKKOS_INTERNAL_PAUSE - #else - /* Pause instruction to prevent excess processor bus usage */ - #define KOKKOS_INTERNAL_PAUSE asm volatile("pause\n":::"memory") - #endif - #define KOKKOS_INTERNAL_NOP2 asm volatile("nop\n" "nop\n") - #define KOKKOS_INTERNAL_NOP4 KOKKOS_INTERNAL_NOP2; KOKKOS_INTERNAL_NOP2 - #define KOKKOS_INTERNAL_NOP8 KOKKOS_INTERNAL_NOP4; KOKKOS_INTERNAL_NOP4; - #define KOKKOS_INTERNAL_NOP16 KOKKOS_INTERNAL_NOP8; KOKKOS_INTERNAL_NOP8; - #define KOKKOS_INTERNAL_NOP32 KOKKOS_INTERNAL_NOP16; KOKKOS_INTERNAL_NOP16; - namespace { - inline void kokkos_internal_yield( const unsigned i ) noexcept { - switch (Kokkos::Impl::bit_scan_reverse((i >> 2)+1u)) { - case 0u: KOKKOS_INTERNAL_NOP2; break; - case 1u: KOKKOS_INTERNAL_NOP4; break; - case 2u: KOKKOS_INTERNAL_NOP8; break; - case 3u: KOKKOS_INTERNAL_NOP16; break; - default: KOKKOS_INTERNAL_NOP32; - } - KOKKOS_INTERNAL_PAUSE; - } - } - #else - #include - namespace { - inline void kokkos_internal_yield( const unsigned ) noexcept { - sched_yield(); - } - } - #endif -#else // defined( _WIN32 ) - #if defined ( KOKKOS_ENABLE_WINTHREAD ) - #include - namespace { - inline void kokkos_internal_yield( const unsigned ) noexcept { - Sleep(0); - } - } - #elif defined( _MSC_VER ) - #define NOMINMAX - #include - #include - namespace { - inline void kokkos_internal_yield( const unsigned ) noexcept { - YieldProcessor(); - } - } - #else - #define KOKKOS_INTERNAL_PAUSE __asm__ __volatile__("pause\n":::"memory") - #define KOKKOS_INTERNAL_NOP2 __asm__ __volatile__("nop\n" "nop") - #define KOKKOS_INTERNAL_NOP4 KOKKOS_INTERNAL_NOP2; KOKKOS_INTERNAL_NOP2 - #define KOKKOS_INTERNAL_NOP8 KOKKOS_INTERNAL_NOP4; KOKKOS_INTERNAL_NOP4; - #define KOKKOS_INTERNAL_NOP16 KOKKOS_INTERNAL_NOP8; KOKKOS_INTERNAL_NOP8; - #define KOKKOS_INTERNAL_NOP32 KOKKOS_INTERNAL_NOP16; KOKKOS_INTERNAL_NOP16; - namespace { - inline void kokkos_internal_yield( const unsigned i ) noexcept { - switch (Kokkos::Impl::bit_scan_reverse((i >> 2)+1u)) { - case 0: KOKKOS_INTERNAL_NOP2; break; - case 1: KOKKOS_INTERNAL_NOP4; break; - case 2: KOKKOS_INTERNAL_NOP8; break; - case 3: KOKKOS_INTERNAL_NOP16; break; - default: KOKKOS_INTERNAL_NOP32; - } - KOKKOS_INTERNAL_PAUSE; - } - } - #endif -#endif - - -/*--------------------------------------------------------------------------*/ - -namespace Kokkos { -namespace Impl { - -void spinwait_while_equal( volatile int32_t & flag , const int32_t value ) -{ - Kokkos::store_fence(); - unsigned i = 0; - while ( value == flag ) { - kokkos_internal_yield(i); - ++i; - } - Kokkos::load_fence(); -} - -void spinwait_until_equal( volatile int32_t & flag , const int32_t value ) -{ - Kokkos::store_fence(); - unsigned i = 0; - while ( value != flag ) { - kokkos_internal_yield(i); - ++i; - } - Kokkos::load_fence(); -} - -void spinwait_while_equal( volatile int64_t & flag , const int64_t value ) -{ - Kokkos::store_fence(); - unsigned i = 0; - while ( value == flag ) { - kokkos_internal_yield(i); - ++i; - } - Kokkos::load_fence(); -} - -void spinwait_until_equal( volatile int64_t & flag , const int64_t value ) -{ - Kokkos::store_fence(); - unsigned i = 0; - while ( value != flag ) { - kokkos_internal_yield(i); - ++i; - } - Kokkos::load_fence(); -} - -} /* namespace Impl */ -} /* namespace Kokkos */ - -#else -void KOKKOS_CORE_SRC_IMPL_SPINWAIT_PREVENT_LINK_ERROR() {} -#endif - diff --git a/lib/kokkos/core/unit_test/CMakeLists.txt b/lib/kokkos/core/unit_test/CMakeLists.txt index 5d6f25ac95..83d617b9a6 100644 --- a/lib/kokkos/core/unit_test/CMakeLists.txt +++ b/lib/kokkos/core/unit_test/CMakeLists.txt @@ -2,7 +2,16 @@ # Add test-only library for gtest to be reused by all the subpackages # +IF(NOT KOKKOS_HAS_TRILINOS) + IF(KOKKOS_SEPARATE_LIBS) + set(TEST_LINK_TARGETS kokkoscore) + ELSE() + set(TEST_LINK_TARGETS kokkos) + ENDIF() +ENDIF() + SET(GTEST_SOURCE_DIR ${${PARENT_PACKAGE_NAME}_SOURCE_DIR}/tpls/gtest) +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_HAS_PTHREAD=0") INCLUDE_DIRECTORIES(${GTEST_SOURCE_DIR}) TRIBITS_ADD_LIBRARY( @@ -49,6 +58,7 @@ IF(Kokkos_ENABLE_Serial) serial/TestSerial_SubView_c10.cpp serial/TestSerial_SubView_c11.cpp serial/TestSerial_SubView_c12.cpp + serial/TestSerial_SubView_c13.cpp serial/TestSerial_Team.cpp serial/TestSerial_TeamReductionScan.cpp serial/TestSerial_TeamScratch.cpp @@ -57,10 +67,12 @@ IF(Kokkos_ENABLE_Serial) serial/TestSerial_ViewMapping_b.cpp serial/TestSerial_ViewMapping_subview.cpp serial/TestSerial_ViewOfClass.cpp + serial/TestSerial_Crs.cpp + serial/TestSerial_WorkGraph.cpp COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -94,6 +106,7 @@ IF(Kokkos_ENABLE_Pthread) threads/TestThreads_SubView_c10.cpp threads/TestThreads_SubView_c11.cpp threads/TestThreads_SubView_c12.cpp + threads/TestThreads_SubView_c13.cpp threads/TestThreads_Team.cpp threads/TestThreads_TeamReductionScan.cpp threads/TestThreads_TeamScratch.cpp @@ -102,10 +115,12 @@ IF(Kokkos_ENABLE_Pthread) threads/TestThreads_ViewMapping_b.cpp threads/TestThreads_ViewMapping_subview.cpp threads/TestThreads_ViewOfClass.cpp + threads/TestThreads_Crs.cpp + threads/TestThreads_WorkGraph.cpp COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -139,6 +154,7 @@ IF(Kokkos_ENABLE_OpenMP) openmp/TestOpenMP_SubView_c10.cpp openmp/TestOpenMP_SubView_c11.cpp openmp/TestOpenMP_SubView_c12.cpp + openmp/TestOpenMP_SubView_c13.cpp openmp/TestOpenMP_Task.cpp openmp/TestOpenMP_Team.cpp openmp/TestOpenMP_TeamReductionScan.cpp @@ -147,10 +163,13 @@ IF(Kokkos_ENABLE_OpenMP) openmp/TestOpenMP_ViewMapping_b.cpp openmp/TestOpenMP_ViewMapping_subview.cpp openmp/TestOpenMP_ViewOfClass.cpp + openmp/TestOpenMP_Crs.cpp + openmp/TestOpenMP_WorkGraph.cpp + openmp/TestOpenMP_UniqueToken.cpp COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -177,13 +196,14 @@ IF(Kokkos_ENABLE_Qthreads) qthreads/TestQthreads_SubView_c10.cpp qthreads/TestQthreads_SubView_c11.cpp qthreads/TestQthreads_SubView_c12.cpp + qthreads/TestQthreads_SubView_c13.cpp qthreads/TestQthreads_Team.cpp qthreads/TestQthreads_ViewAPI_a.cpp qthreads/TestQthreads_ViewAPI_b.cpp COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -228,6 +248,7 @@ IF(Kokkos_ENABLE_Cuda) cuda/TestCuda_SubView_c10.cpp cuda/TestCuda_SubView_c11.cpp cuda/TestCuda_SubView_c12.cpp + cuda/TestCuda_SubView_c13.cpp cuda/TestCuda_Task.cpp cuda/TestCuda_Team.cpp cuda/TestCuda_TeamReductionScan.cpp @@ -237,10 +258,13 @@ IF(Kokkos_ENABLE_Cuda) cuda/TestCuda_ViewMapping_b.cpp cuda/TestCuda_ViewMapping_subview.cpp cuda/TestCuda_ViewOfClass.cpp + cuda/TestCuda_Crs.cpp + cuda/TestCuda_WorkGraph.cpp + cuda/TestCuda_UniqueToken.cpp COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) ENDIF() @@ -253,10 +277,11 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( default/TestDefaultDeviceType_b.cpp default/TestDefaultDeviceType_c.cpp default/TestDefaultDeviceType_d.cpp + default/TestDefaultDeviceTypeResize.cpp COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) foreach(INITTESTS_NUM RANGE 1 16) @@ -266,7 +291,7 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) endforeach(INITTESTS_NUM) @@ -276,5 +301,5 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( COMM serial mpi NUM_MPI_PROCS 1 FAIL_REGULAR_EXPRESSION " FAILED " - TESTONLYLIBS kokkos_gtest + TESTONLYLIBS kokkos_gtest ${TEST_LINK_TARGETS} ) diff --git a/lib/kokkos/core/unit_test/Makefile b/lib/kokkos/core/unit_test/Makefile index 41f192a486..ace6181ddf 100644 --- a/lib/kokkos/core/unit_test/Makefile +++ b/lib/kokkos/core/unit_test/Makefile @@ -10,6 +10,8 @@ vpath %.cpp ${KOKKOS_PATH}/core/unit_test/openmp vpath %.cpp ${KOKKOS_PATH}/core/unit_test/openmptarget vpath %.cpp ${KOKKOS_PATH}/core/unit_test/qthreads vpath %.cpp ${KOKKOS_PATH}/core/unit_test/cuda +vpath %.cpp ${KOKKOS_PATH}/core/unit_test/rocm + TEST_HEADERS = $(wildcard $(KOKKOS_PATH)/core/unit_test/*.hpp) TEST_HEADERS += $(wildcard $(KOKKOS_PATH)/core/unit_test/*/*.hpp) @@ -25,7 +27,8 @@ endif CXXFLAGS = -O3 LINK ?= $(CXX) -LDFLAGS ?= -lpthread +LDFLAGS ?= +override LDFLAGS += -lpthread include $(KOKKOS_PATH)/Makefile.kokkos @@ -54,6 +57,7 @@ else OBJ_CUDA += TestCuda_SubView_c04.o TestCuda_SubView_c05.o TestCuda_SubView_c06.o OBJ_CUDA += TestCuda_SubView_c07.o TestCuda_SubView_c08.o TestCuda_SubView_c09.o OBJ_CUDA += TestCuda_SubView_c10.o TestCuda_SubView_c11.o TestCuda_SubView_c12.o + OBJ_CUDA += TestCuda_SubView_c13.o endif OBJ_CUDA += TestCuda_Reductions.o TestCuda_Scan.o OBJ_CUDA += TestCuda_Complex.o @@ -62,14 +66,68 @@ endif OBJ_CUDA += TestCuda_TeamReductionScan.o OBJ_CUDA += TestCuda_Other.o OBJ_CUDA += TestCuda_MDRange.o - OBJ_CUDA += TestCuda_Task.o + OBJ_CUDA += TestCuda_Crs.o + OBJ_CUDA += TestCuda_Task.o TestCuda_WorkGraph.o OBJ_CUDA += TestCuda_Spaces.o + OBJ_CUDA += TestCuda_UniqueToken.o TARGETS += KokkosCore_UnitTest_Cuda TEST_TARGETS += test-cuda endif +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + OBJ_ROCM = UnitTestMainInit.o gtest-all.o + OBJ_ROCM += TestROCm_Init.o + OBJ_ROCM += TestROCm_Complex.o +# OBJ_ROCM += TestROCm_RangePolicy.o +# rocm.range_scan locking up + OBJ_ROCM += TestROCm_AtomicOperations.o + OBJ_ROCM += TestROCm_Atomics.o +# complex failing + OBJ_ROCM += TestROCm_AtomicViews.o + OBJ_ROCM += TestROCm_Other.o +# rocm.memory_pool + OBJ_ROCM += TestROCm_Scan.o + OBJ_ROCM += TestROCm_SharedAlloc.o + OBJ_ROCM += TestROCm_SubView_a.o +# OBJ_ROCM += TestROCm_SubView_b.o +# relies on host accessable device memory +# OBJ_ROCM += TestROCm_SubView_c01.o +# OBJ_ROCM += TestROCm_SubView_c02.o +# OBJ_ROCM += TestROCm_SubView_c03.o +# OBJ_ROCM += TestROCm_SubView_c04.o +# OBJ_ROCM += TestROCm_SubView_c05.o +# OBJ_ROCM += TestROCm_SubView_c06.o +# OBJ_ROCM += TestROCm_SubView_c07.o +# OBJ_ROCM += TestROCm_SubView_c08.o +# OBJ_ROCM += TestROCm_SubView_c09.o +# OBJ_ROCM += TestROCm_SubView_c10.o +# OBJ_ROCM += TestROCm_SubView_c11.o +# OBJ_ROCM += TestROCm_SubView_c12.o +# all of the above use UVM or Host accessable memory +# OBJ_ROCM += TestROCm_Team.o +# compile fails +# OBJ_ROCM += TestROCm_TeamReductionScan.o +# compile fails +# OBJ_ROCM += TestROCm_TeamScratch.o +# compile fails + OBJ_ROCM += TestROCm_ViewAPI_b.o +# test fail in view_api + OBJ_ROCM += TestROCm_ViewMapping_a.o + OBJ_ROCM += TestROCm_ViewMapping_b.o + OBJ_ROCM += TestROCm_ViewMapping_subview.o + OBJ_ROCM += TestROCmHostPinned_ViewAPI.o + OBJ_ROCM += TestROCmHostPinned_ViewMapping_a.o + OBJ_ROCM += TestROCmHostPinned_ViewMapping_b.o + OBJ_ROCM += TestROCmHostPinned_ViewMapping_subview.o + OBJ_ROCM += TestROCm_ViewOfClass.o + OBJ_ROCM += TestROCm_Spaces.o + + TARGETS += KokkosCore_UnitTest_ROCm + TEST_TARGETS += test-rocm +endif + ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) OBJ_THREADS = UnitTestMainInit.o gtest-all.o @@ -113,6 +171,7 @@ else OBJ_OPENMP += TestOpenMP_SubView_c04.o TestOpenMP_SubView_c05.o TestOpenMP_SubView_c06.o OBJ_OPENMP += TestOpenMP_SubView_c07.o TestOpenMP_SubView_c08.o TestOpenMP_SubView_c09.o OBJ_OPENMP += TestOpenMP_SubView_c10.o TestOpenMP_SubView_c11.o TestOpenMP_SubView_c12.o + OBJ_OPENMP += TestOpenMP_SubView_c13.o endif OBJ_OPENMP += TestOpenMP_Reductions.o TestOpenMP_Scan.o OBJ_OPENMP += TestOpenMP_Complex.o @@ -121,7 +180,9 @@ endif OBJ_OPENMP += TestOpenMP_TeamReductionScan.o OBJ_OPENMP += TestOpenMP_Other.o OBJ_OPENMP += TestOpenMP_MDRange.o - OBJ_OPENMP += TestOpenMP_Task.o + OBJ_OPENMP += TestOpenMP_Crs.o + OBJ_OPENMP += TestOpenMP_Task.o TestOpenMP_WorkGraph.o + OBJ_OPENMP += TestOpenMP_UniqueToken.o TARGETS += KokkosCore_UnitTest_OpenMP @@ -200,6 +261,7 @@ else OBJ_SERIAL += TestSerial_SubView_c04.o TestSerial_SubView_c05.o TestSerial_SubView_c06.o OBJ_SERIAL += TestSerial_SubView_c07.o TestSerial_SubView_c08.o TestSerial_SubView_c09.o OBJ_SERIAL += TestSerial_SubView_c10.o TestSerial_SubView_c11.o TestSerial_SubView_c12.o + OBJ_SERIAL += TestSerial_SubView_c13.o endif OBJ_SERIAL += TestSerial_Reductions.o TestSerial_Scan.o OBJ_SERIAL += TestSerial_Complex.o @@ -207,8 +269,12 @@ endif OBJ_SERIAL += TestSerial_Team.o TestSerial_TeamScratch.o OBJ_SERIAL += TestSerial_TeamReductionScan.o OBJ_SERIAL += TestSerial_Other.o + #HCC_WORKAROUND + ifneq ($(KOKKOS_INTERNAL_COMPILER_HCC), 1) OBJ_SERIAL += TestSerial_MDRange.o - OBJ_SERIAL += TestSerial_Task.o + endif + OBJ_SERIAL += TestSerial_Crs.o + OBJ_SERIAL += TestSerial_Task.o TestSerial_WorkGraph.o TARGETS += KokkosCore_UnitTest_Serial @@ -221,8 +287,10 @@ TEST_TARGETS += test-hwloc OBJ_DEFAULT = UnitTestMainInit.o gtest-all.o ifneq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) +ifneq ($(KOKKOS_INTERNAL_COMPILER_HCC), 1) OBJ_DEFAULT += TestDefaultDeviceType.o TestDefaultDeviceType_a.o TestDefaultDeviceType_b.o TestDefaultDeviceType_c.o TestDefaultDeviceType_d.o endif +endif TARGETS += KokkosCore_UnitTest_Default TEST_TARGETS += test-default @@ -237,6 +305,9 @@ TEST_TARGETS += ${INITTESTS_TEST_TARGETS} KokkosCore_UnitTest_Cuda: $(OBJ_CUDA) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_CUDA) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosCore_UnitTest_Cuda +KokkosCore_UnitTest_ROCm: $(OBJ_ROCM) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(EXTRA_PATH) $(OBJ_ROCM) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosCore_UnitTest_ROCm + KokkosCore_UnitTest_Threads: $(OBJ_THREADS) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_THREADS) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosCore_UnitTest_Threads @@ -259,7 +330,7 @@ KokkosCore_UnitTest_HWLOC: $(OBJ_HWLOC) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_HWLOC) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosCore_UnitTest_HWLOC KokkosCore_UnitTest_AllocationTracker: $(OBJ_ALLOCATIONTRACKER) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(EXTRA_PATH) $(OBJ_ALLOCATIONTRACKER) $(KOKKOS_LIBS) $( $(KOKKOS_LDFLAGS) $(LDFLAGS)LIB) -o KokkosCore_UnitTest_AllocationTracker + $(LINK) $(EXTRA_PATH) $(OBJ_ALLOCATIONTRACKER) $(KOKKOS_LIBS) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(LIB) -o KokkosCore_UnitTest_AllocationTracker KokkosCore_UnitTest_Default: $(OBJ_DEFAULT) $(KOKKOS_LINK_DEPENDS) $(LINK) $(EXTRA_PATH) $(OBJ_DEFAULT) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosCore_UnitTest_Default @@ -270,6 +341,9 @@ ${INITTESTS_TARGETS}: KokkosCore_UnitTest_DefaultDeviceTypeInit_%: TestDefaultDe test-cuda: KokkosCore_UnitTest_Cuda ./KokkosCore_UnitTest_Cuda +test-rocm: KokkosCore_UnitTest_ROCm + ./KokkosCore_UnitTest_ROCm + test-threads: KokkosCore_UnitTest_Threads ./KokkosCore_UnitTest_Threads diff --git a/lib/kokkos/core/unit_test/TestAggregate.hpp b/lib/kokkos/core/unit_test/TestAggregate.hpp index 6896a27bfb..87440c36be 100644 --- a/lib/kokkos/core/unit_test/TestAggregate.hpp +++ b/lib/kokkos/core/unit_test/TestAggregate.hpp @@ -58,7 +58,7 @@ template< class DeviceType > void TestViewAggregate() { typedef Kokkos::Array< double, 32 > value_type; - typedef Kokkos::Experimental::Impl::ViewDataAnalysis< value_type *, Kokkos::LayoutLeft, value_type > analysis_1d; + typedef Kokkos::Impl::ViewDataAnalysis< value_type *, Kokkos::LayoutLeft, value_type > analysis_1d; static_assert( std::is_same< typename analysis_1d::specialize, Kokkos::Array<> >::value, "" ); diff --git a/lib/kokkos/core/unit_test/TestAtomic.hpp b/lib/kokkos/core/unit_test/TestAtomic.hpp index e61d5e730c..fffe6b4699 100644 --- a/lib/kokkos/core/unit_test/TestAtomic.hpp +++ b/lib/kokkos/core/unit_test/TestAtomic.hpp @@ -467,6 +467,7 @@ TEST_F( TEST_CATEGORY, atomics ) ASSERT_TRUE( ( TestAtomic::Loop< float, TEST_EXECSPACE >( 100, 3 ) ) ); #ifndef KOKKOS_ENABLE_OPENMPTARGET +#ifndef KOKKOS_ENABLE_ROCM ASSERT_TRUE( ( TestAtomic::Loop< Kokkos::complex, TEST_EXECSPACE >( 100, 1 ) ) ); ASSERT_TRUE( ( TestAtomic::Loop< Kokkos::complex, TEST_EXECSPACE >( 100, 2 ) ) ); ASSERT_TRUE( ( TestAtomic::Loop< Kokkos::complex, TEST_EXECSPACE >( 100, 3 ) ) ); @@ -475,6 +476,7 @@ TEST_F( TEST_CATEGORY, atomics ) ASSERT_TRUE( ( TestAtomic::Loop< TestAtomic::SuperScalar<4>, TEST_EXECSPACE >( 100, 2 ) ) ); ASSERT_TRUE( ( TestAtomic::Loop< TestAtomic::SuperScalar<4>, TEST_EXECSPACE >( 100, 3 ) ) ); #endif +#endif } diff --git a/lib/kokkos/core/unit_test/TestCompilerMacros.hpp b/lib/kokkos/core/unit_test/TestCompilerMacros.hpp index fddcc4a2e6..f0391134ba 100644 --- a/lib/kokkos/core/unit_test/TestCompilerMacros.hpp +++ b/lib/kokkos/core/unit_test/TestCompilerMacros.hpp @@ -43,6 +43,19 @@ #include +#if defined(KOKKOS_ENABLE_CUDA) && \ + ( !defined(KOKKOS_ENABLE_CUDA_LAMBDA) || \ + ( ( defined(KOKKOS_ENABLE_SERIAL) || defined(KOKKOS_ENABLE_OPENMP) ) && \ + ( (CUDA_VERSION < 8000) && defined( __NVCC__ )))) + #if defined(KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA) + #error "Macro bug: KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA shouldn't be defined" + #endif +#else + #if !defined(KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA) + #error "Macro bug: KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA should be defined" + #endif +#endif + #define KOKKOS_PRAGMA_UNROLL(a) namespace TestCompilerMacros { diff --git a/lib/kokkos/core/unit_test/TestComplex.hpp b/lib/kokkos/core/unit_test/TestComplex.hpp index 36f05612e0..b5f7e2b6ec 100644 --- a/lib/kokkos/core/unit_test/TestComplex.hpp +++ b/lib/kokkos/core/unit_test/TestComplex.hpp @@ -71,11 +71,13 @@ struct TestComplexConstruction { ASSERT_FLOAT_EQ(h_results(7).real(),7.5); ASSERT_FLOAT_EQ(h_results(7).imag(),0.0); ASSERT_FLOAT_EQ(h_results(8).real(),double(8)); ASSERT_FLOAT_EQ(h_results(8).imag(),0.0); +#ifndef KOKKOS_ENABLE_ROCM Kokkos::complex a(1.5,2.5),b(3.25,5.25),r_kk; std::complex sa(a),sb(3.25,5.25),r; r = a; r_kk = a; ASSERT_FLOAT_EQ(r.real(),r_kk.real()); ASSERT_FLOAT_EQ(r.imag(),r_kk.imag()); r = sb*a; r_kk = b*a; ASSERT_FLOAT_EQ(r.real(),r_kk.real()); ASSERT_FLOAT_EQ(r.imag(),r_kk.imag()); r = sa; r_kk = a; ASSERT_FLOAT_EQ(r.real(),r_kk.real()); ASSERT_FLOAT_EQ(r.imag(),r_kk.imag()); +#endif } @@ -114,7 +116,7 @@ struct TestComplexBasicMath { typename Kokkos::View*,ExecSpace>::HostMirror h_results; void testit () { - d_results = Kokkos::View*,ExecSpace>("TestComplexBasicMath",20); + d_results = Kokkos::View*,ExecSpace>("TestComplexBasicMath",24); h_results = Kokkos::create_mirror_view(d_results); Kokkos::parallel_for(Kokkos::RangePolicy(0,1), *this); @@ -125,6 +127,7 @@ struct TestComplexBasicMath { std::complex b(3.25,5.75); std::complex d(1.0,2.0); double c = 9.3; + int e = 2; std::complex r; r = a+b; ASSERT_FLOAT_EQ(h_results(0).real(), r.real()); ASSERT_FLOAT_EQ(h_results(0).imag(), r.imag()); @@ -147,6 +150,12 @@ struct TestComplexBasicMath { r = c-a; ASSERT_FLOAT_EQ(h_results(17).real(), r.real()); ASSERT_FLOAT_EQ(h_results(17).imag(), r.imag()); r = c*a; ASSERT_FLOAT_EQ(h_results(18).real(), r.real()); ASSERT_FLOAT_EQ(h_results(18).imag(), r.imag()); r = c/a; ASSERT_FLOAT_EQ(h_results(19).real(), r.real()); ASSERT_FLOAT_EQ(h_results(19).imag(), r.imag()); + + r = a; + /* r = a+e; */ ASSERT_FLOAT_EQ(h_results(20).real(), r.real()+e); ASSERT_FLOAT_EQ(h_results(20).imag(), r.imag()); + /* r = a-e; */ ASSERT_FLOAT_EQ(h_results(21).real(), r.real()-e); ASSERT_FLOAT_EQ(h_results(21).imag(), r.imag()); + /* r = a*e; */ ASSERT_FLOAT_EQ(h_results(22).real(), r.real()*e); ASSERT_FLOAT_EQ(h_results(22).imag(), r.imag()*e); + /* r = a/e; */ ASSERT_FLOAT_EQ(h_results(23).real(), r.real()/2); ASSERT_FLOAT_EQ(h_results(23).imag(), r.imag()/e); } KOKKOS_INLINE_FUNCTION @@ -158,7 +167,8 @@ struct TestComplexBasicMath { d_results(1) = a-b; d_results(2) = a*b; d_results(3) = a/b; - d_results(4) = Kokkos::complex(1.0,2.0); + d_results(4).real(1.0); + d_results(4).imag(2.0); d_results(4) += a; d_results(5) = Kokkos::complex(1.0,2.0); d_results(5) -= a; @@ -173,7 +183,8 @@ struct TestComplexBasicMath { d_results(9) = a-c; d_results(10) = a*c; d_results(11) = a/c; - d_results(12) = Kokkos::complex(1.0,2.0); + d_results(12).real(1.0); + d_results(12).imag(2.0); d_results(12) += c; d_results(13) = Kokkos::complex(1.0,2.0); d_results(13) -= c; @@ -188,6 +199,12 @@ struct TestComplexBasicMath { d_results(17) = c-a; d_results(18) = c*a; d_results(19) = c/a; + + int e = 2; + d_results(20) = a+e; + d_results(21) = a-e; + d_results(22) = a*e; + d_results(23) = a/e; } }; diff --git a/lib/kokkos/core/unit_test/TestCrs.hpp b/lib/kokkos/core/unit_test/TestCrs.hpp new file mode 100644 index 0000000000..50811fb8a9 --- /dev/null +++ b/lib/kokkos/core/unit_test/TestCrs.hpp @@ -0,0 +1,98 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#include + +namespace Test { + +namespace { + +template< class ExecSpace > +struct CountFillFunctor { + KOKKOS_INLINE_FUNCTION + std::int32_t operator()(std::int32_t row, std::int32_t* fill) const { + auto n = (row % 4) + 1; + if (fill) { + for (std::int32_t j = 0; j < n; ++j) { + fill[j] = j + 1; + } + } + return n; + } +}; + +template< class ExecSpace > +void test_count_fill(std::int32_t nrows) { + Kokkos::Crs graph; + Kokkos::count_and_fill_crs(graph, nrows, CountFillFunctor()); + ASSERT_EQ(graph.numRows(), nrows); + auto row_map = Kokkos::create_mirror_view(graph.row_map); + Kokkos::deep_copy(row_map, graph.row_map); + auto entries = Kokkos::create_mirror_view(graph.entries); + Kokkos::deep_copy(entries, graph.entries); + for (std::int32_t row = 0; row < nrows; ++row) { + auto n = (row % 4) + 1; + ASSERT_EQ(row_map(row + 1) - row_map(row), n); + for (std::int32_t j = 0; j < n; ++j) { + ASSERT_EQ(entries(row_map(row) + j), j + 1); + } + } +} + +} // anonymous namespace + +TEST_F( TEST_CATEGORY, crs_count_fill ) +{ + test_count_fill(0); + test_count_fill(1); + test_count_fill(2); + test_count_fill(3); + test_count_fill(13); + test_count_fill(100); + test_count_fill(1000); + test_count_fill(10000); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/TestDefaultDeviceTypeInit.hpp b/lib/kokkos/core/unit_test/TestDefaultDeviceTypeInit.hpp index 401da58a58..68864c8d66 100644 --- a/lib/kokkos/core/unit_test/TestDefaultDeviceTypeInit.hpp +++ b/lib/kokkos/core/unit_test/TestDefaultDeviceTypeInit.hpp @@ -186,6 +186,21 @@ void check_correct_initialization( const Kokkos::InitArguments & argstruct ) { // Figure out the number of threads the HostSpace ExecutionSpace should have initialized to. int expected_nthreads = argstruct.num_threads; +#ifdef KOKKOS_ENABLE_OPENMP + if ( std::is_same< Kokkos::HostSpace::execution_space, Kokkos::OpenMP >::value ) { + // use openmp default num threads + if ( expected_nthreads < 0 || ( expected_nthreads == 0 && !Kokkos::hwloc::available() ) ) { + expected_nthreads = omp_get_max_threads(); + } + // use hwloc if available + else if ( expected_nthreads == 0 && Kokkos::hwloc::available() ) { + expected_nthreads = Kokkos::hwloc::get_available_numa_count() + * Kokkos::hwloc::get_available_cores_per_numa() + * Kokkos::hwloc::get_available_threads_per_core(); + } + } +#endif + if ( expected_nthreads < 1 ) { if ( Kokkos::hwloc::available() ) { expected_nthreads = Kokkos::hwloc::get_available_numa_count() @@ -193,12 +208,6 @@ void check_correct_initialization( const Kokkos::InitArguments & argstruct ) { * Kokkos::hwloc::get_available_threads_per_core(); } else { -#ifdef KOKKOS_ENABLE_OPENMP - if ( std::is_same< Kokkos::HostSpace::execution_space, Kokkos::OpenMP >::value ) { - expected_nthreads = omp_get_max_threads(); - } - else -#endif expected_nthreads = 1; } diff --git a/lib/kokkos/core/unit_test/TestMDRange.hpp b/lib/kokkos/core/unit_test/TestMDRange.hpp index 091591bcbf..b84b13be7c 100644 --- a/lib/kokkos/core/unit_test/TestMDRange.hpp +++ b/lib/kokkos/core/unit_test/TestMDRange.hpp @@ -51,6 +51,180 @@ namespace Test { namespace { +template +struct TestMDRange_ReduceArray_2D { + + using DataType = int; + using ViewType_2 = typename Kokkos::View< DataType**, ExecSpace >; + using HostViewType_2 = typename ViewType_2::HostMirror; + + ViewType_2 input_view; + + using scalar_type = double; + using value_type = scalar_type[]; + const unsigned value_count; + + TestMDRange_ReduceArray_2D( const int N0, const int N1, const unsigned array_size ) + : input_view( "input_view", N0, N1 ) + , value_count( array_size ) + {} + + KOKKOS_INLINE_FUNCTION + void init( scalar_type dst[] ) const + { + for ( unsigned i = 0; i < value_count; ++i ) { + dst[i] = 0.0; + } + } + + KOKKOS_INLINE_FUNCTION + void join( volatile scalar_type dst[], + const volatile scalar_type src[] ) const + { + for ( unsigned i = 0; i < value_count; ++i ) { + dst[i] += src[i]; + } + } + + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j ) const + { + input_view( i, j ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, value_type lsum ) const + { + lsum[0] += input_view( i, j ) * 2; //+=6 each time if InitTag => N0*N1*6 + lsum[1] += input_view( i, j ) ; //+=3 each time if InitTag => N0*N1*3 + } + + // tagged operators + struct InitTag {}; + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j ) const + { + input_view( i, j ) = 3; + } + + static void test_arrayreduce2( const int N0, const int N1 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2>, Kokkos::IndexType, InitTag > range_type_init; + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type_init range_init( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); + range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); + + const unsigned array_size = 2; + + TestMDRange_ReduceArray_2D functor( N0, N1, array_size ); + + parallel_for( range_init, functor ); // Init the view to 3's + + double sums[ array_size ]; + parallel_reduce( range, functor, sums ); + + // Check output + //printf("Array Reduce result. N0 = %d N1 = %d N0*N1 = %d sums[0] = %lf sums[1] = %lf \n", N0, N1, N0*N1, sums[0], sums[1]); + + ASSERT_EQ( sums[0], 6 * N0 * N1 ); + ASSERT_EQ( sums[1], 3 * N0 * N1 ); + } + } +}; + +template +struct TestMDRange_ReduceArray_3D { + + using DataType = int; + using ViewType_3 = typename Kokkos::View< DataType***, ExecSpace >; + using HostViewType_3 = typename ViewType_3::HostMirror; + + ViewType_3 input_view; + + using scalar_type = double; + using value_type = scalar_type[]; + const unsigned value_count; + + TestMDRange_ReduceArray_3D( const int N0, const int N1, const int N2, const unsigned array_size ) + : input_view( "input_view", N0, N1, N2 ) + , value_count( array_size ) + {} + + KOKKOS_INLINE_FUNCTION + void init( scalar_type dst[] ) const + { + for ( unsigned i = 0; i < value_count; ++i ) { + dst[i] = 0.0; + } + } + + KOKKOS_INLINE_FUNCTION + void join( volatile scalar_type dst[], + const volatile scalar_type src[] ) const + { + for ( unsigned i = 0; i < value_count; ++i ) { + dst[i] += src[i]; + } + } + + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k ) const + { + input_view( i, j, k ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, value_type lsum ) const + { + lsum[0] += input_view( i, j, k ) * 2; //+=6 each time if InitTag => N0*N1*N2*6 + lsum[1] += input_view( i, j, k ) ; //+=3 each time if InitTag => N0*N1*N2*3 + } + + // tagged operators + struct InitTag {}; + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j, const int k ) const + { + input_view( i, j, k ) = 3; + } + + static void test_arrayreduce3( const int N0, const int N1, const int N2 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3>, Kokkos::IndexType, InitTag > range_type_init; + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type_init range_init( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); + range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); + + const unsigned array_size = 2; + + TestMDRange_ReduceArray_3D functor( N0, N1, N2, array_size ); + + parallel_for( range_init, functor ); // Init the view to 3's + + double sums[ array_size ]; + parallel_reduce( range, functor, sums ); + + ASSERT_EQ( sums[0], 6 * N0 * N1 * N2 ); + ASSERT_EQ( sums[1], 3 * N0 * N1 * N2 ); + } + } +}; + + template struct TestMDRange_2D { using DataType = int; @@ -58,6 +232,7 @@ struct TestMDRange_2D { using HostViewType = typename ViewType::HostMirror; ViewType input_view; + using value_type = double; TestMDRange_2D( const DataType N0, const DataType N1 ) : input_view( "input_view", N0, N1 ) {} @@ -68,7 +243,7 @@ struct TestMDRange_2D { } KOKKOS_INLINE_FUNCTION - void operator()( const int i, const int j, double &lsum ) const + void operator()( const int i, const int j, value_type &lsum ) const { lsum += input_view( i, j ) * 2; } @@ -81,6 +256,13 @@ struct TestMDRange_2D { input_view( i, j ) = 3; } + // reduction tagged operators + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j, value_type &lsum ) const + { + lsum += input_view( i, j ) * 3; + } + static void test_reduce2( const int N0, const int N1 ) { using namespace Kokkos::Experimental; @@ -94,13 +276,87 @@ struct TestMDRange_2D { TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 ); } + // Test with reducers - scalar + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2>, Kokkos::IndexType > range_type; + int s0 = 1; + int s1 = 1; + range_type range( {{ s0, s1 }}, {{ N0, N1 }}, {{ 3, 3 }} ); + + TestMDRange_2D functor( N0, N1 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::Experimental::Sum< value_type > reducer_scalar( sum ); + + parallel_reduce( range, functor, reducer_scalar ); + + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) ); + } + // Test with reducers - scalar view + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0 }}, {{ N0, N1 }}, {{ 3, 3 }} ); + + TestMDRange_2D functor( N0, N1 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::View< value_type, Kokkos::HostSpace > sum_view("sum_view"); + sum_view() = sum; + Kokkos::Experimental::Sum< value_type > reducer_view( sum_view ); + + parallel_reduce( range, functor, reducer_view); + sum = sum_view(); + + ASSERT_EQ( sum, 2 * N0 * N1 ); + } + + // Tagged operator test + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2, Iterate::Default, Iterate::Default >, Kokkos::IndexType, InitTag > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 2, 4 } } ); + + TestMDRange_2D functor( N0, N1 ); + + parallel_for( range, functor ); + + // check parallel_for results correct with InitTag + HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); + Kokkos::deep_copy( h_view, functor.input_view ); + int counter = 0; + for ( int i = 0; i < N0; ++i ) + for ( int j = 0; j < N1; ++j ) + { + if ( h_view( i, j ) != 3 ) { + ++counter; + } + } + + if ( counter != 0 ) { + printf( "Defaults + InitTag op(): Errors in test_for3; mismatches = %d\n\n", counter ); + } + ASSERT_EQ( counter, 0 ); + + + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 9 * N0 * N1 ); + } + { typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2, Iterate::Default, Iterate::Default>, Kokkos::IndexType > range_type; typedef typename range_type::tile_type tile_type; @@ -110,9 +366,9 @@ struct TestMDRange_2D { TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 ); } @@ -126,9 +382,9 @@ struct TestMDRange_2D { TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 ); } @@ -142,9 +398,9 @@ struct TestMDRange_2D { TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 ); } @@ -158,9 +414,9 @@ struct TestMDRange_2D { TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 ); } @@ -174,9 +430,9 @@ struct TestMDRange_2D { TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 ); } @@ -191,17 +447,19 @@ struct TestMDRange_2D { typedef typename range_type::tile_type tile_type; typedef typename range_type::point_type point_type; - range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); + const int s0 = 1; + const int s1 = 1; + range_type range( point_type{ { s0, s1 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); int counter = 0; - for ( int i = 0; i < N0; ++i ) - for ( int j = 0; j < N1; ++j ) + for ( int i = s0; i < N0; ++i ) + for ( int j = s1; j < N1; ++j ) { if ( h_view( i, j ) != 3 ) { ++counter; @@ -209,7 +467,7 @@ struct TestMDRange_2D { } if ( counter != 0 ) { - printf( "Default Layouts + InitTag op(): Errors in test_for2; mismatches = %d\n\n", counter ); + printf( "Offset Start + Default Layouts + InitTag op(): Errors in test_for2; mismatches = %d\n\n", counter ); } ASSERT_EQ( counter, 0 ); @@ -223,7 +481,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -251,7 +509,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -280,7 +538,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -309,7 +567,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 4, 4 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -338,7 +596,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 3, 3 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -367,7 +625,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 7, 7 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -396,7 +654,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 16, 16 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -425,7 +683,7 @@ struct TestMDRange_2D { range_type range( point_type{ { 0, 0 } }, point_type{ { N0, N1 } }, tile_type{ { 5, 16 } } ); TestMDRange_2D functor( N0, N1 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -445,6 +703,7 @@ struct TestMDRange_2D { ASSERT_EQ( counter, 0 ); } + } // end test_for2 }; // MDRange_2D @@ -455,6 +714,7 @@ struct TestMDRange_3D { using HostViewType = typename ViewType::HostMirror; ViewType input_view; + using value_type = double; TestMDRange_3D( const DataType N0, const DataType N1, const DataType N2 ) : input_view( "input_view", N0, N1, N2 ) {} @@ -478,6 +738,13 @@ struct TestMDRange_3D { input_view( i, j, k ) = 3; } + // reduction tagged operators + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j, const int k, value_type &lsum ) const + { + lsum += input_view( i, j, k ) * 3; + } + static void test_reduce3( const int N0, const int N1, const int N2 ) { using namespace Kokkos::Experimental; @@ -487,16 +754,92 @@ struct TestMDRange_3D { typedef typename range_type::tile_type tile_type; typedef typename range_type::point_type point_type; - range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); + int s0 = 1; + int s1 = 1; + int s2 = 1; + range_type range( point_type{ { s0, s1, s2 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) ); + } + + // Test with reducers - scalar + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0 }}, {{ N0, N1, N2 }}, {{ 3, 3, 3 }} ); + + TestMDRange_3D functor( N0, N1, N2 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::Experimental::Sum< value_type > reducer_scalar( sum ); + + parallel_reduce( range, functor, reducer_scalar ); ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); } + // Test with reducers - scalar view + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0 }}, {{ N0, N1, N2 }}, {{ 3, 3, 3 }} ); + + TestMDRange_3D functor( N0, N1, N2 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::View< value_type, Kokkos::HostSpace > sum_view("sum_view"); + sum_view() = sum; + Kokkos::Experimental::Sum< value_type > reducer_view( sum_view ); + + parallel_reduce( range, functor, reducer_view); + sum = sum_view(); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); + } + + // Tagged operator test + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3, Iterate::Default, Iterate::Default >, Kokkos::IndexType, InitTag > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 2, 4, 6 } } ); + + TestMDRange_3D functor( N0, N1, N2 ); + + parallel_for( range, functor ); + + // check parallel_for results correct with InitTag + HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); + Kokkos::deep_copy( h_view, functor.input_view ); + int counter = 0; + for ( int i = 0; i < N0; ++i ) + for ( int j = 0; j < N1; ++j ) + for ( int k = 0; k < N2; ++k ) + { + if ( h_view( i, j, k ) != 3 ) { + ++counter; + } + } + + if ( counter != 0 ) { + printf( "Defaults + InitTag op(): Errors in test_for3; mismatches = %d\n\n", counter ); + } + ASSERT_EQ( counter, 0 ); + + + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 9 * N0 * N1 * N2 ); + } { typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3, Iterate::Default, Iterate::Default >, Kokkos::IndexType > range_type; @@ -507,9 +850,9 @@ struct TestMDRange_3D { TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); } @@ -523,9 +866,9 @@ struct TestMDRange_3D { TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); } @@ -539,9 +882,9 @@ struct TestMDRange_3D { TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); } @@ -555,9 +898,9 @@ struct TestMDRange_3D { TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); } @@ -571,9 +914,9 @@ struct TestMDRange_3D { TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); double sum = 0.0; - md_parallel_reduce( range, functor, sum ); + parallel_reduce( range, functor, sum ); ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); } @@ -590,7 +933,7 @@ struct TestMDRange_3D { range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -617,18 +960,21 @@ struct TestMDRange_3D { typedef typename range_type::tile_type tile_type; typedef typename range_type::point_type point_type; - range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); + int s0 = 1; + int s1 = 1; + int s2 = 1; + range_type range( point_type{ { s0, s1, s2 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); int counter = 0; - for ( int i = 0; i < N0; ++i ) - for ( int j = 0; j < N1; ++j ) - for ( int k = 0; k < N2; ++k ) + for ( int i = s0; i < N0; ++i ) + for ( int j = s1; j < N1; ++j ) + for ( int k = s2; k < N2; ++k ) { if ( h_view( i, j, k ) != 3 ) { ++counter; @@ -636,7 +982,7 @@ struct TestMDRange_3D { } if ( counter != 0 ) { - printf( "Defaults + InitTag op(): Errors in test_for3; mismatches = %d\n\n", counter ); + printf( "Offset Start + Defaults + InitTag op(): Errors in test_for3; mismatches = %d\n\n", counter ); } ASSERT_EQ( counter, 0 ); @@ -651,7 +997,7 @@ struct TestMDRange_3D { TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -681,7 +1027,7 @@ struct TestMDRange_3D { range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 3, 3 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -711,7 +1057,7 @@ struct TestMDRange_3D { range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 2, 4, 2 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -741,7 +1087,7 @@ struct TestMDRange_3D { range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 3, 5, 7 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -771,7 +1117,7 @@ struct TestMDRange_3D { range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 8, 8, 8 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -801,7 +1147,7 @@ struct TestMDRange_3D { range_type range( point_type{ { 0, 0, 0 } }, point_type{ { N0, N1, N2 } }, tile_type{ { 2, 4, 2 } } ); TestMDRange_3D functor( N0, N1, N2 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -832,6 +1178,7 @@ struct TestMDRange_4D { using HostViewType = typename ViewType::HostMirror; ViewType input_view; + using value_type = double; TestMDRange_4D( const DataType N0, const DataType N1, const DataType N2, const DataType N3 ) : input_view( "input_view", N0, N1, N2, N3 ) {} @@ -855,6 +1202,195 @@ struct TestMDRange_4D { input_view( i, j, k, l ) = 3; } + // reduction tagged operators + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j, const int k, const int l, value_type &lsum ) const + { + lsum += input_view( i, j, k, l ) * 3; + } + + static void test_reduce4( const int N0, const int N1, const int N2, const int N3 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + int s0 = 1; + int s1 = 1; + int s2 = 1; + int s3 = 1; + range_type range( point_type{ { s0, s1, s2, s3 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 3, 3, 3, 3 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) * (N3 - s3) ); + } + + // Test with reducers - scalar + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0, 0 }}, {{ N0, N1, N2, N3 }}, {{ 3, 3, 3, 3 }} ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::Experimental::Sum< value_type > reducer_scalar( sum ); + + parallel_reduce( range, functor, reducer_scalar ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + + // Test with reducers - scalar view + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0, 0 }}, {{ N0, N1, N2, N3 }}, {{ 3, 3, 3, 3 }} ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::View< value_type, Kokkos::HostSpace > sum_view("sum_view"); + sum_view() = sum; + Kokkos::Experimental::Sum< value_type > reducer_view( sum_view ); + + parallel_reduce( range, functor, reducer_view); + sum = sum_view(); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + + // Tagged operator test + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4, Iterate::Default, Iterate::Default >, Kokkos::IndexType, InitTag > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 2, 4, 6, 2 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + + // check parallel_for results correct with InitTag + HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); + Kokkos::deep_copy( h_view, functor.input_view ); + int counter = 0; + for ( int i = 0; i < N0; ++i ) + for ( int j = 0; j < N1; ++j ) + for ( int k = 0; k < N2; ++k ) + for ( int l = 0; l < N3; ++l ) + { + if ( h_view( i, j, k, l ) != 3 ) { + ++counter; + } + } + + if ( counter != 0 ) { + printf( "Defaults + InitTag op(): Errors in test_reduce4 parallel_for init; mismatches = %d\n\n", counter ); + } + ASSERT_EQ( counter, 0 ); + + + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 9 * N0 * N1 * N2 * N3 ); + } + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4, Iterate::Default, Iterate::Default >, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 2, 4, 6, 2 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4, Iterate::Left, Iterate::Left>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 2, 4, 6, 2 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4, Iterate::Left, Iterate::Right>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 2, 4, 6, 2 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4, Iterate::Right, Iterate::Left>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 2, 4, 6, 2 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4, Iterate::Right, Iterate::Right>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 2, 4, 6, 2 } } ); + + TestMDRange_4D functor( N0, N1, N2, N3 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + } + } // end test_reduce + + + static void test_for4( const int N0, const int N1, const int N2, const int N3 ) { using namespace Kokkos::Experimental; @@ -866,7 +1402,7 @@ struct TestMDRange_4D { range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } } ); TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -894,19 +1430,23 @@ struct TestMDRange_4D { typedef typename range_type::tile_type tile_type; typedef typename range_type::point_type point_type; - range_type range( point_type{ { 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 3, 11, 3, 3 } } ); + int s0 = 1; + int s1 = 1; + int s2 = 1; + int s3 = 1; + range_type range( point_type{ { s0, s1, s2, s3 } }, point_type{ { N0, N1, N2, N3 } }, tile_type{ { 3, 11, 3, 3 } } ); TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); int counter = 0; - for ( int i = 0; i < N0; ++i ) - for ( int j = 0; j < N1; ++j ) - for ( int k = 0; k < N2; ++k ) - for ( int l = 0; l < N3; ++l ) + for ( int i = s0; i < N0; ++i ) + for ( int j = s1; j < N1; ++j ) + for ( int k = s2; k < N2; ++k ) + for ( int l = s3; l < N3; ++l ) { if ( h_view( i, j, k, l ) != 3 ) { ++counter; @@ -914,7 +1454,7 @@ struct TestMDRange_4D { } if ( counter != 0 ) { - printf("Defaults +m_tile > m_upper dim2 InitTag op(): Errors in test_for4; mismatches = %d\n\n",counter); + printf("Offset Start + Defaults +m_tile > m_upper dim2 InitTag op(): Errors in test_for4; mismatches = %d\n\n",counter); } ASSERT_EQ( counter, 0 ); @@ -929,7 +1469,7 @@ struct TestMDRange_4D { TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -961,7 +1501,7 @@ struct TestMDRange_4D { TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -993,7 +1533,7 @@ struct TestMDRange_4D { TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1025,7 +1565,7 @@ struct TestMDRange_4D { TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1057,7 +1597,7 @@ struct TestMDRange_4D { TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1089,7 +1629,7 @@ struct TestMDRange_4D { TestMDRange_4D functor( N0, N1, N2, N3 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1121,6 +1661,7 @@ struct TestMDRange_5D { using HostViewType = typename ViewType::HostMirror; ViewType input_view; + using value_type = double; TestMDRange_5D( const DataType N0, const DataType N1, const DataType N2, const DataType N3, const DataType N4 ) : input_view( "input_view", N0, N1, N2, N3, N4 ) {} @@ -1131,7 +1672,7 @@ struct TestMDRange_5D { } KOKKOS_INLINE_FUNCTION - void operator()( const int i, const int j, const int k, const int l, const int m, double &lsum ) const + void operator()( const int i, const int j, const int k, const int l, const int m, value_type &lsum ) const { lsum += input_view( i, j, k, l, m ) * 2; } @@ -1144,6 +1685,115 @@ struct TestMDRange_5D { input_view( i, j, k, l, m ) = 3; } + // reduction tagged operators + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j, const int k, const int l, const int m, value_type &lsum ) const + { + lsum += input_view( i, j, k, l, m ) * 3; + } + + static void test_reduce5( const int N0, const int N1, const int N2, const int N3, const int N4 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<5>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + int s0 = 1; + int s1 = 1; + int s2 = 1; + int s3 = 1; + int s4 = 1; + range_type range( point_type{ { s0, s1, s2, s3, s4 } }, point_type{ { N0, N1, N2, N3, N4 } }, tile_type{ { 3, 3, 3, 3, 3 } } ); + + TestMDRange_5D functor( N0, N1, N2, N3, N4 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) * (N3 - s3) * (N4 - s4) ); + } + + // Test with reducers - scalar + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<5>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0, 0, 0 }}, {{ N0, N1, N2, N3, N4 }}, {{ 3, 3, 3, 3, 3 }} ); + + TestMDRange_5D functor( N0, N1, N2, N3, N4 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::Experimental::Sum< value_type > reducer_scalar( sum ); + + parallel_reduce( range, functor, reducer_scalar ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 * N4 ); + } + + // Test with reducers - scalar view + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<5>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0, 0, 0 }}, {{ N0, N1, N2, N3, N4 }}, {{ 3, 3, 3, 3, 3 }} ); + + TestMDRange_5D functor( N0, N1, N2, N3, N4 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::View< value_type, Kokkos::HostSpace > sum_view("sum_view"); + sum_view() = sum; + Kokkos::Experimental::Sum< value_type > reducer_view( sum_view ); + + parallel_reduce( range, functor, reducer_view); + sum = sum_view(); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 * N4 ); + } + + // Tagged operator test + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<5, Iterate::Default, Iterate::Default >, Kokkos::IndexType, InitTag > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3, N4 } }, tile_type{ { 2, 4, 6, 2, 2 } } ); + + TestMDRange_5D functor( N0, N1, N2, N3, N4 ); + + parallel_for( range, functor ); + + // check parallel_for results correct with InitTag + HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); + Kokkos::deep_copy( h_view, functor.input_view ); + int counter = 0; + for ( int i = 0; i < N0; ++i ) + for ( int j = 0; j < N1; ++j ) + for ( int k = 0; k < N2; ++k ) + for ( int l = 0; l < N3; ++l ) + for ( int m = 0; m < N4; ++m ) + { + if ( h_view( i, j, k, l, m ) != 3 ) { + ++counter; + } + } + + if ( counter != 0 ) { + printf( "Defaults + InitTag op(): Errors in test_reduce5 parallel_for init; mismatches = %d\n\n", counter ); + } + ASSERT_EQ( counter, 0 ); + + + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 9 * N0 * N1 * N2 * N3 * N4 ); + } + } + static void test_for5( const int N0, const int N1, const int N2, const int N3, const int N4 ) { using namespace Kokkos::Experimental; @@ -1155,7 +1805,7 @@ struct TestMDRange_5D { range_type range( point_type{ { 0, 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3, N4 } } ); TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1184,20 +1834,25 @@ struct TestMDRange_5D { typedef typename range_type::tile_type tile_type; typedef typename range_type::point_type point_type; - range_type range( point_type{ { 0, 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3, N4 } }, tile_type{ { 3, 3, 3, 3, 7 } } ); + int s0 = 1; + int s1 = 1; + int s2 = 1; + int s3 = 1; + int s4 = 1; + range_type range( point_type{ { s0, s1, s2, s3, s4 } }, point_type{ { N0, N1, N2, N3, N4 } }, tile_type{ { 3, 3, 3, 3, 5 } } ); TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); int counter = 0; - for ( int i = 0; i < N0; ++i ) - for ( int j = 0; j < N1; ++j ) - for ( int k = 0; k < N2; ++k ) - for ( int l = 0; l < N3; ++l ) - for ( int m = 0; m < N4; ++m ) + for ( int i = s0; i < N0; ++i ) + for ( int j = s1; j < N1; ++j ) + for ( int k = s2; k < N2; ++k ) + for ( int l = s3; l < N3; ++l ) + for ( int m = s4; m < N4; ++m ) { if ( h_view( i, j, k, l, m ) != 3 ) { ++counter; @@ -1205,7 +1860,7 @@ struct TestMDRange_5D { } if ( counter != 0 ) { - printf( "Defaults + InitTag op(): Errors in test_for5; mismatches = %d\n\n", counter ); + printf( "Offset Start + Defaults + InitTag op(): Errors in test_for5; mismatches = %d\n\n", counter ); } ASSERT_EQ( counter, 0 ); @@ -1220,7 +1875,7 @@ struct TestMDRange_5D { TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1253,7 +1908,7 @@ struct TestMDRange_5D { TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1286,7 +1941,7 @@ struct TestMDRange_5D { TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1319,7 +1974,7 @@ struct TestMDRange_5D { TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1352,7 +2007,7 @@ struct TestMDRange_5D { TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1385,7 +2040,7 @@ struct TestMDRange_5D { TestMDRange_5D functor( N0, N1, N2, N3, N4 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1418,6 +2073,7 @@ struct TestMDRange_6D { using HostViewType = typename ViewType::HostMirror; ViewType input_view; + using value_type = double; TestMDRange_6D( const DataType N0, const DataType N1, const DataType N2, const DataType N3, const DataType N4, const DataType N5 ) : input_view( "input_view", N0, N1, N2, N3, N4, N5 ) {} @@ -1428,7 +2084,7 @@ struct TestMDRange_6D { } KOKKOS_INLINE_FUNCTION - void operator()( const int i, const int j, const int k, const int l, const int m, const int n, double &lsum ) const + void operator()( const int i, const int j, const int k, const int l, const int m, const int n, value_type &lsum ) const { lsum += input_view( i, j, k, l, m, n ) * 2; } @@ -1441,6 +2097,117 @@ struct TestMDRange_6D { input_view( i, j, k, l, m, n ) = 3; } + // reduction tagged operators + KOKKOS_INLINE_FUNCTION + void operator()( const InitTag &, const int i, const int j, const int k, const int l, const int m, const int n, value_type &lsum ) const + { + lsum += input_view( i, j, k, l, m, n ) * 3; + } + + static void test_reduce6( const int N0, const int N1, const int N2, const int N3, const int N4, const int N5 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<6>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + int s0 = 1; + int s1 = 1; + int s2 = 1; + int s3 = 1; + int s4 = 1; + int s5 = 1; + range_type range( point_type{ { s0, s1, s2, s3, s4, s5 } }, point_type{ { N0, N1, N2, N3, N4, N5 } }, tile_type{ { 3, 3, 3, 3, 3, 2 } } ); + + TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) * (N3 - s3) * (N4 - s4) * (N5 - s5) ); + } + + // Test with reducers - scalar + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<6>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0, 0, 0, 0 }}, {{ N0, N1, N2, N3, N4, N5 }}, {{ 3, 3, 3, 3, 3, 2 }} ); + + TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::Experimental::Sum< value_type > reducer_scalar( sum ); + + parallel_reduce( range, functor, reducer_scalar ); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 * N4 * N5 ); + } + + // Test with reducers - scalar view + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<6>, Kokkos::IndexType > range_type; + range_type range( {{ 0, 0, 0, 0, 0, 0 }}, {{ N0, N1, N2, N3, N4, N5 }}, {{ 3, 3, 3, 3, 3, 2 }} ); + + TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); + + parallel_for( range, functor ); + + value_type sum = 0.0; + Kokkos::View< value_type, Kokkos::HostSpace > sum_view("sum_view"); + sum_view() = sum; + Kokkos::Experimental::Sum< value_type > reducer_view( sum_view ); + + parallel_reduce( range, functor, reducer_view); + sum = sum_view(); + + ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 * N4 * N5 ); + } + + // Tagged operator test + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<6, Iterate::Default, Iterate::Default >, Kokkos::IndexType, InitTag > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + range_type range( point_type{ { 0, 0, 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3, N4, N5 } }, tile_type{ { 2, 4, 6, 2, 2, 2 } } ); + + TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); + + parallel_for( range, functor ); + + // check parallel_for results correct with InitTag + HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); + Kokkos::deep_copy( h_view, functor.input_view ); + int counter = 0; + for ( int i = 0; i < N0; ++i ) + for ( int j = 0; j < N1; ++j ) + for ( int k = 0; k < N2; ++k ) + for ( int l = 0; l < N3; ++l ) + for ( int m = 0; m < N4; ++m ) + for ( int n = 0; n < N5; ++n ) + { + if ( h_view( i, j, k, l, m, n ) != 3 ) { + ++counter; + } + } + + if ( counter != 0 ) { + printf( "Defaults + InitTag op(): Errors in test_reduce6 parallel_for init; mismatches = %d\n\n", counter ); + } + ASSERT_EQ( counter, 0 ); + + + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 9 * N0 * N1 * N2 * N3 * N4 * N5 ); + } + } + static void test_for6( const int N0, const int N1, const int N2, const int N3, const int N4, const int N5 ) { using namespace Kokkos::Experimental; @@ -1452,7 +2219,7 @@ struct TestMDRange_6D { range_type range( point_type{ { 0, 0, 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3, N4, N5 } } ); TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1482,21 +2249,27 @@ struct TestMDRange_6D { typedef typename range_type::tile_type tile_type; typedef typename range_type::point_type point_type; - range_type range( point_type{ { 0, 0, 0, 0, 0, 0 } }, point_type{ { N0, N1, N2, N3, N4, N5 } }, tile_type{ { 3, 3, 3, 3, 2, 3 } } ); //tile dims 3,3,3,3,3,3 more than cuda can handle with debugging + int s0 = 1; + int s1 = 1; + int s2 = 1; + int s3 = 1; + int s4 = 1; + int s5 = 1; + range_type range( point_type{ { s0, s1, s2, s3, s4, s5 } }, point_type{ { N0, N1, N2, N3, N4, N5 } }, tile_type{ { 3, 3, 3, 3, 2, 3 } } ); //tile dims 3,3,3,3,3,3 more than cuda can handle with debugging TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); int counter = 0; - for ( int i = 0; i < N0; ++i ) - for ( int j = 0; j < N1; ++j ) - for ( int k = 0; k < N2; ++k ) - for ( int l = 0; l < N3; ++l ) - for ( int m = 0; m < N4; ++m ) - for ( int n = 0; n < N5; ++n ) + for ( int i = s0; i < N0; ++i ) + for ( int j = s1; j < N1; ++j ) + for ( int k = s2; k < N2; ++k ) + for ( int l = s3; l < N3; ++l ) + for ( int m = s4; m < N4; ++m ) + for ( int n = s5; n < N5; ++n ) { if ( h_view( i, j, k, l, m, n ) != 3 ) { ++counter; @@ -1504,7 +2277,7 @@ struct TestMDRange_6D { } if ( counter != 0 ) { - printf( "Defaults + InitTag op(): Errors in test_for6; mismatches = %d\n\n", counter ); + printf( "Offset Start + Defaults + InitTag op(): Errors in test_for6; mismatches = %d\n\n", counter ); } ASSERT_EQ( counter, 0 ); @@ -1519,7 +2292,7 @@ struct TestMDRange_6D { TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1553,7 +2326,7 @@ struct TestMDRange_6D { TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1587,7 +2360,7 @@ struct TestMDRange_6D { TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1621,7 +2394,7 @@ struct TestMDRange_6D { TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1655,7 +2428,7 @@ struct TestMDRange_6D { TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1689,7 +2462,7 @@ struct TestMDRange_6D { TestMDRange_6D functor( N0, N1, N2, N3, N4, N5 ); - md_parallel_for( range, functor ); + parallel_for( range, functor ); HostViewType h_view = Kokkos::create_mirror_view( functor.input_view ); Kokkos::deep_copy( h_view, functor.input_view ); @@ -1716,6 +2489,303 @@ struct TestMDRange_6D { } }; + +template +struct TestMDRange_2D_NegIdx { + + using value_type = double; + + using DataType = int; + using ViewType = typename Kokkos::View< DataType**, ExecSpace >; + using HostViewType = typename ViewType::HostMirror; + + ViewType input_view; + DataType lower_offset[2]; + + TestMDRange_2D_NegIdx( const DataType L0, const DataType L1, const DataType N0, const DataType N1 ) : input_view( "input_view", N0 - L0, N1 - L1 ) + { + lower_offset[0] = L0; + lower_offset[1] = L1; + } + + // When using negative indices, must offset View appropriately as views cannot take a negative index + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j ) const + { + input_view( i - lower_offset[0], j - lower_offset[1] ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, value_type &lsum ) const + { + lsum += input_view( i - lower_offset[0], j - lower_offset[1] ) * 2; + } + + static void test_2D_negidx( const int N0, const int N1 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + const point_type lower{{-1, -1}}; + const point_type upper{{N0, N1}}; + const tile_type tile{{8,8}}; + + range_type range( point_type{{ lower[0], lower[1] }}, point_type{{ upper[0], upper[1] }}, tile_type{{ tile[0], tile[1] }} ); + + TestMDRange_2D_NegIdx functor( lower[0], lower[1], upper[0], upper[1] ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (upper[0] - lower[0]) * (upper[1] - lower[1]) ); + } + } +}; + +template +struct TestMDRange_3D_NegIdx { + + using value_type = double; + + using DataType = int; + using ViewType = typename Kokkos::View< DataType***, ExecSpace >; + using HostViewType = typename ViewType::HostMirror; + + ViewType input_view; + DataType lower_offset[3]; + + TestMDRange_3D_NegIdx( const DataType L0, const DataType L1, const DataType L2, const DataType N0, const DataType N1, const DataType N2 ) : input_view( "input_view", N0 - L0, N1 - L1, N2 - L2 ) + { + lower_offset[0] = L0; + lower_offset[1] = L1; + lower_offset[2] = L2; + } + + // When using negative indices, must offset View appropriately as views cannot take a negative index + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k ) const + { + input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2] ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, value_type &lsum ) const + { + lsum += input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2] ) * 2; + } + + static void test_3D_negidx( const int N0, const int N1, const int N2 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<3>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + const point_type lower{{-1, -1, -1}}; + const point_type upper{{N0, N1, N2}}; + const tile_type tile{{8,8,2}}; + + range_type range( point_type{{ lower[0], lower[1], lower[2] }}, point_type{{ upper[0], upper[1], upper[2] }}, tile_type{{ tile[0], tile[1], tile[2] }} ); + + TestMDRange_3D_NegIdx functor( lower[0], lower[1], lower[2], upper[0], upper[1], upper[2] ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (upper[0] - lower[0]) * (upper[1] - lower[1]) * (upper[2] - lower[2]) ); + } + } +}; + +template +struct TestMDRange_4D_NegIdx { + + using value_type = double; + + using DataType = int; + using ViewType = typename Kokkos::View< DataType****, ExecSpace >; + using HostViewType = typename ViewType::HostMirror; + + ViewType input_view; + DataType lower_offset[4]; + + TestMDRange_4D_NegIdx( const DataType L0, const DataType L1, const DataType L2, const DataType L3, const DataType N0, const DataType N1, const DataType N2, const DataType N3 ) : input_view( "input_view", N0 - L0, N1 - L1, N2 - L2, N3 - L3 ) + { + lower_offset[0] = L0; + lower_offset[1] = L1; + lower_offset[2] = L2; + lower_offset[3] = L3; + } + + // When using negative indices, must offset View appropriately as views cannot take a negative index + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, const int l ) const + { + input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2], l - lower_offset[3] ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, const int l, value_type &lsum ) const + { + lsum += input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2], l - lower_offset[3] ) * 2; + } + + static void test_4D_negidx( const int N0, const int N1, const int N2, const int N3 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<4>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + const point_type lower{{-1, -1, -1, -1}}; + const point_type upper{{N0, N1, N2, N3}}; + const tile_type tile{{8,8,2,2}}; + + range_type range( point_type{{ lower[0], lower[1], lower[2], lower[3] }}, point_type{{ upper[0], upper[1], upper[2], upper[3] }}, tile_type{{ tile[0], tile[1], tile[2], tile[3] }} ); + + TestMDRange_4D_NegIdx functor( lower[0], lower[1], lower[2], lower[3], upper[0], upper[1], upper[2], upper[3] ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (upper[0] - lower[0]) * (upper[1] - lower[1]) * (upper[2] - lower[2]) * (upper[3] - lower[3]) ); + } + } +}; + +template +struct TestMDRange_5D_NegIdx { + + using value_type = double; + + using DataType = int; + using ViewType = typename Kokkos::View< DataType*****, ExecSpace >; + using HostViewType = typename ViewType::HostMirror; + + ViewType input_view; + DataType lower_offset[5]; + + TestMDRange_5D_NegIdx( const DataType L0, const DataType L1, const DataType L2, const DataType L3, const DataType L4, const DataType N0, const DataType N1, const DataType N2, const DataType N3, const DataType N4 ) : input_view( "input_view", N0 - L0, N1 - L1, N2 - L2, N3 - L3, N4 - L4 ) + { + lower_offset[0] = L0; + lower_offset[1] = L1; + lower_offset[2] = L2; + lower_offset[3] = L3; + lower_offset[4] = L4; + } + + // When using negative indices, must offset View appropriately as views cannot take a negative index + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, const int l, const int m ) const + { + input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2], l - lower_offset[3], m - lower_offset[4] ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, const int l, const int m, value_type &lsum ) const + { + lsum += input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2], l - lower_offset[3], m - lower_offset[4] ) * 2; + } + + static void test_5D_negidx( const int N0, const int N1, const int N2, const int N3, const int N4 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<5>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + const point_type lower{{-1, -1, -1, -1, -1}}; + const point_type upper{{N0, N1, N2, N3, N4}}; + const tile_type tile{{8,4,2,2,2}}; + + range_type range( point_type{{ lower[0], lower[1], lower[2], lower[3], lower[4] }}, point_type{{ upper[0], upper[1], upper[2], upper[3], upper[4] }}, tile_type{{ tile[0], tile[1], tile[2], tile[3], tile[4] }} ); + + TestMDRange_5D_NegIdx functor( lower[0], lower[1], lower[2], lower[3], lower[4], upper[0], upper[1], upper[2], upper[3], upper[4] ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (upper[0] - lower[0]) * (upper[1] - lower[1]) * (upper[2] - lower[2]) * (upper[3] - lower[3]) * (upper[4] - lower[4]) ); + } + } +}; + +template +struct TestMDRange_6D_NegIdx { + + using value_type = double; + + using DataType = int; + using ViewType = typename Kokkos::View< DataType******, ExecSpace >; + using HostViewType = typename ViewType::HostMirror; + + ViewType input_view; + DataType lower_offset[6]; + + TestMDRange_6D_NegIdx( const DataType L0, const DataType L1, const DataType L2, const DataType L3, const DataType L4, const DataType L5, const DataType N0, const DataType N1, const DataType N2, const DataType N3, const DataType N4, const DataType N5 ) : input_view( "input_view", N0 - L0, N1 - L1, N2 - L2, N3 - L3, N4 - L4, N5 - L5 ) + { + lower_offset[0] = L0; + lower_offset[1] = L1; + lower_offset[2] = L2; + lower_offset[3] = L3; + lower_offset[4] = L4; + lower_offset[5] = L5; + } + + // When using negative indices, must offset View appropriately as views cannot take a negative index + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, const int l, const int m, const int n ) const + { + input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2], l - lower_offset[3], m - lower_offset[4], n - lower_offset[5] ) = 1; + } + + KOKKOS_INLINE_FUNCTION + void operator()( const int i, const int j, const int k, const int l, const int m, const int n, value_type &lsum ) const + { + lsum += input_view( i - lower_offset[0], j - lower_offset[1], k - lower_offset[2], l - lower_offset[3], m - lower_offset[4], n - lower_offset[5] ) * 2; + } + + static void test_6D_negidx( const int N0, const int N1, const int N2, const int N3, const int N4, const int N5 ) + { + using namespace Kokkos::Experimental; + + { + typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<6>, Kokkos::IndexType > range_type; + typedef typename range_type::tile_type tile_type; + typedef typename range_type::point_type point_type; + + const point_type lower{{-1, -1, -1, -1, -1, -1}}; + const point_type upper{{N0, N1, N2, N3, N4, N5}}; + const tile_type tile{{8,4,2,2,2,1}}; + + range_type range( point_type{{ lower[0], lower[1], lower[2], lower[3], lower[4], lower[5] }}, point_type{{ upper[0], upper[1], upper[2], upper[3], upper[4], upper[5] }}, tile_type{{ tile[0], tile[1], tile[2], tile[3], tile[4], tile[5] }} ); + + TestMDRange_6D_NegIdx functor( lower[0], lower[1], lower[2], lower[3], lower[4], lower[5], upper[0], upper[1], upper[2], upper[3], upper[4], upper[5] ); + + parallel_for( range, functor ); + double sum = 0.0; + parallel_reduce( range, functor, sum ); + + ASSERT_EQ( sum, 2 * (upper[0] - lower[0]) * (upper[1] - lower[1]) * (upper[2] - lower[2]) * (upper[3] - lower[3]) * (upper[4] - lower[4]) * (upper[5] - lower[5]) ); + } + } +}; + + } // namespace TEST_F( TEST_CATEGORY , mdrange_for ) { @@ -1726,11 +2796,27 @@ TEST_F( TEST_CATEGORY , mdrange_for ) { TestMDRange_6D< TEST_EXECSPACE >::test_for6( 10, 10, 10, 10, 5, 5 ); } -#ifndef KOKKOS_ENABLE_CUDA TEST_F( TEST_CATEGORY , mdrange_reduce ) { TestMDRange_2D< TEST_EXECSPACE >::test_reduce2( 100, 100 ); TestMDRange_3D< TEST_EXECSPACE >::test_reduce3( 100, 10, 100 ); + TestMDRange_4D< TEST_EXECSPACE >::test_reduce4( 100, 10, 10, 10 ); + TestMDRange_5D< TEST_EXECSPACE >::test_reduce5( 100, 10, 10, 10, 5 ); + TestMDRange_6D< TEST_EXECSPACE >::test_reduce6( 100, 10, 10, 10, 5, 5 ); } -#endif + +//#ifndef KOKKOS_ENABLE_CUDA +TEST_F( TEST_CATEGORY , mdrange_array_reduce ) { + TestMDRange_ReduceArray_2D< TEST_EXECSPACE >::test_arrayreduce2( 4, 5 ); + TestMDRange_ReduceArray_3D< TEST_EXECSPACE >::test_arrayreduce3( 4, 5, 10 ); +} + +TEST_F( TEST_CATEGORY , mdrange_neg_idx ) { + TestMDRange_2D_NegIdx< TEST_EXECSPACE >::test_2D_negidx( 128, 32 ); + TestMDRange_3D_NegIdx< TEST_EXECSPACE >::test_3D_negidx( 128, 32, 8 ); + TestMDRange_4D_NegIdx< TEST_EXECSPACE >::test_4D_negidx( 128, 32, 8, 8 ); + TestMDRange_5D_NegIdx< TEST_EXECSPACE >::test_5D_negidx( 128, 32, 8, 8, 4 ); + TestMDRange_6D_NegIdx< TEST_EXECSPACE >::test_6D_negidx( 128, 32, 8, 8, 4, 2 ); +} +//#endif } // namespace Test diff --git a/lib/kokkos/core/unit_test/TestMemoryPool.hpp b/lib/kokkos/core/unit_test/TestMemoryPool.hpp index 941cd6c26d..8034ae4ca0 100644 --- a/lib/kokkos/core/unit_test/TestMemoryPool.hpp +++ b/lib/kokkos/core/unit_test/TestMemoryPool.hpp @@ -54,6 +54,96 @@ namespace TestMemoryPool { +template< typename MemSpace = Kokkos::HostSpace > +void test_host_memory_pool_defaults() +{ + typedef typename MemSpace::execution_space Space ; + typedef typename Kokkos::MemoryPool< Space > MemPool ; + + { + const size_t MemoryCapacity = 32000 ; + const size_t MinBlockSize = 64 ; + const size_t MaxBlockSize = 1024 ; + const size_t SuperBlockSize = 4096 ; + + MemPool pool( MemSpace() + , MemoryCapacity + , MinBlockSize + , MaxBlockSize + , SuperBlockSize + ); + + typename MemPool::usage_statistics stats ; + + pool.get_usage_statistics( stats ); + + ASSERT_LE( MemoryCapacity , stats.capacity_bytes ); + ASSERT_LE( MinBlockSize , stats.min_block_bytes ); + ASSERT_LE( MaxBlockSize , stats.max_block_bytes ); + ASSERT_LE( SuperBlockSize , stats.superblock_bytes ); + } + + { + const size_t MemoryCapacity = 10000 ; + + MemPool pool( MemSpace() + , MemoryCapacity + ); + + typename MemPool::usage_statistics stats ; + + pool.get_usage_statistics( stats ); + + ASSERT_LE( MemoryCapacity , stats.capacity_bytes ); + ASSERT_LE( 64u /* default */ , stats.min_block_bytes ); + ASSERT_LE( stats.min_block_bytes , stats.max_block_bytes ); + ASSERT_LE( stats.max_block_bytes , stats.superblock_bytes ); + ASSERT_LE( stats.superblock_bytes , stats.capacity_bytes ); + } + + { + const size_t MemoryCapacity = 10000 ; + const size_t MinBlockSize = 32 ; // power of two is exact + + MemPool pool( MemSpace() + , MemoryCapacity + , MinBlockSize + ); + + typename MemPool::usage_statistics stats ; + + pool.get_usage_statistics( stats ); + + ASSERT_LE( MemoryCapacity , stats.capacity_bytes ); + ASSERT_EQ( MinBlockSize , stats.min_block_bytes ); + ASSERT_LE( stats.min_block_bytes , stats.max_block_bytes ); + ASSERT_LE( stats.max_block_bytes , stats.superblock_bytes ); + ASSERT_LE( stats.superblock_bytes , stats.capacity_bytes ); + } + + { + const size_t MemoryCapacity = 32000 ; + const size_t MinBlockSize = 32 ; // power of two is exact + const size_t MaxBlockSize = 1024 ; // power of two is exact + + MemPool pool( MemSpace() + , MemoryCapacity + , MinBlockSize + , MaxBlockSize + ); + + typename MemPool::usage_statistics stats ; + + pool.get_usage_statistics( stats ); + + ASSERT_LE( MemoryCapacity , stats.capacity_bytes ); + ASSERT_EQ( MinBlockSize , stats.min_block_bytes ); + ASSERT_EQ( MaxBlockSize , stats.max_block_bytes ); + ASSERT_LE( stats.max_block_bytes , stats.superblock_bytes ); + ASSERT_LE( stats.superblock_bytes , stats.capacity_bytes ); + } +} + template< typename MemSpace = Kokkos::HostSpace > void test_host_memory_pool_stats() { @@ -188,8 +278,8 @@ void print_memory_pool_stats << " bytes reserved = " << stats.reserved_bytes << std::endl << " bytes free = " << ( stats.capacity_bytes - ( stats.consumed_bytes + stats.reserved_bytes ) ) << std::endl - << " alloc used = " << stats.consumed_blocks << std::endl - << " alloc reserved = " << stats.reserved_blocks << std::endl + << " block used = " << stats.consumed_blocks << std::endl + << " block reserved = " << stats.reserved_blocks << std::endl << " super used = " << stats.consumed_superblocks << std::endl << " super reserved = " << ( stats.capacity_superblocks - stats.consumed_superblocks ) << std::endl @@ -302,15 +392,243 @@ void test_memory_pool_v2( const bool print_statistics //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- -} // namespace TestMemoryPool { +template< class DeviceType > +struct TestMemoryPoolCorners { + + typedef Kokkos::View< uintptr_t * , DeviceType > ptrs_type ; + typedef Kokkos::MemoryPool< DeviceType > pool_type ; + + pool_type pool ; + ptrs_type ptrs ; + uint32_t size ; + uint32_t stride ; + + TestMemoryPoolCorners( const pool_type & arg_pool + , const ptrs_type & arg_ptrs + , const uint32_t arg_base + , const uint32_t arg_stride + ) + : pool( arg_pool ) + , ptrs( arg_ptrs ) + , size( arg_base ) + , stride( arg_stride ) + {} + + // Specify reduction argument value_type to + // avoid confusion with tag-dispatch. + + using value_type = long ; + + KOKKOS_INLINE_FUNCTION + void operator()( int i , long & err ) const noexcept + { + unsigned alloc_size = size << ( i % stride ); + if ( 0 == ptrs(i) ) { + ptrs(i) = (uintptr_t) pool.allocate( alloc_size ); + if ( ptrs(i) && ! alloc_size ) { ++err ; } + } + } + + struct TagDealloc {}; + + KOKKOS_INLINE_FUNCTION + void operator()( int i ) const noexcept + { + unsigned alloc_size = size << ( i % stride ); + if ( ptrs(i) ) { pool.deallocate( (void*) ptrs(i) , alloc_size ); } + ptrs(i) = 0 ; + } +}; + +template< class DeviceType > +void test_memory_pool_corners( const bool print_statistics + , const bool print_superblocks ) +{ + typedef typename DeviceType::memory_space memory_space ; + typedef typename DeviceType::execution_space execution_space ; + typedef Kokkos::MemoryPool< DeviceType > pool_type ; + typedef TestMemoryPoolCorners< DeviceType > functor_type ; + typedef typename functor_type::ptrs_type ptrs_type ; + + { + // superblock size 1 << 14 + const size_t min_superblock_size = 1u << 14 ; + + // four superblocks + const size_t total_alloc_size = min_superblock_size * 4 ; + + // block sizes { 64 , 128 , 256 , 512 } + // block counts { 256 , 128 , 64 , 32 } + const unsigned min_block_size = 64 ; + const unsigned max_block_size = 512 ; + const unsigned num_blocks = 480 ; + + pool_type pool( memory_space() + , total_alloc_size + , min_block_size + , max_block_size + , min_superblock_size ); + + // Allocate one block from each superblock to lock that + // superblock into the block size. + + ptrs_type ptrs("ptrs",num_blocks); + + long err = 0 ; + + Kokkos::parallel_reduce + ( Kokkos::RangePolicy< execution_space >(0,4) + , functor_type( pool , ptrs , 64 , 4 ) + , err + ); + + if ( print_statistics || err ) { + + typename pool_type::usage_statistics stats ; + + pool.get_usage_statistics( stats ); + + print_memory_pool_stats< pool_type >( stats ); + } + + if ( print_superblocks || err ) { + pool.print_state( std::cout ); + } + + // Now fill remaining allocations with small size + + Kokkos::parallel_reduce + ( Kokkos::RangePolicy< execution_space >(0,num_blocks) + , functor_type( pool , ptrs , 64 , 1 ) + , err + ); + + if ( print_statistics || err ) { + + typename pool_type::usage_statistics stats ; + + pool.get_usage_statistics( stats ); + + print_memory_pool_stats< pool_type >( stats ); + } + + if ( print_superblocks || err ) { + pool.print_state( std::cout ); + } + } +} + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +template< class DeviceType , class Enable = void > +struct TestMemoryPoolHuge +{ + TestMemoryPoolHuge() {} + + enum : size_t { num_superblock = 0 }; + + using value_type = long ; + + KOKKOS_INLINE_FUNCTION + void operator()( int i , long & err ) const noexcept {} + + KOKKOS_INLINE_FUNCTION + void operator()( int i ) const noexcept {} +}; + +template< class DeviceType > +struct TestMemoryPoolHuge< DeviceType + , typename std::enable_if< + std::is_same< Kokkos::HostSpace + , typename DeviceType::memory_space > + ::value >::type + > +{ + typedef Kokkos::View< uintptr_t * , DeviceType > ptrs_type ; + typedef Kokkos::MemoryPool< DeviceType > pool_type ; + typedef typename DeviceType::memory_space memory_space ; + + pool_type pool ; + ptrs_type ptrs ; + + enum : size_t { min_block_size = 512 + , max_block_size = 1lu << 31 + , min_superblock_size = max_block_size + , num_superblock = 4 + , total_alloc_size = num_superblock * max_block_size }; + + TestMemoryPoolHuge() + : pool( memory_space() + , total_alloc_size + , min_block_size + , max_block_size + , min_superblock_size ) + , ptrs( "ptrs" , num_superblock ) + {} + + // Specify reduction argument value_type to + // avoid confusion with tag-dispatch. + + using value_type = long ; + + void operator()( int i , long & err ) const noexcept + { + if ( i < int(num_superblock) ) { + ptrs(i) = (uintptr_t) pool.allocate( max_block_size ); +#if 0 + printf("TestMemoryPoolHuge size(0x%lx) ptr(0x%lx)\n" + , max_block_size + , ptrs(i) ); +#endif + if ( ! ptrs(i) ) { + Kokkos::abort("TestMemoryPoolHuge"); + ++err ; + } + } + } + + void operator()( int i ) const noexcept + { + if ( i < int(num_superblock) ) { + pool.deallocate( (void*) ptrs(i) , max_block_size ); + ptrs(i) = 0 ; + } + } +}; + +template< class DeviceType > +void test_memory_pool_huge() +{ + typedef typename DeviceType::execution_space execution_space ; + typedef TestMemoryPoolHuge< DeviceType > functor_type ; + typedef Kokkos::RangePolicy< execution_space > policy_type ; + + functor_type f ; + policy_type policy( 0 , functor_type::num_superblock ); + + long err = 0 ; + + Kokkos::parallel_reduce( policy , f , err ); + Kokkos::parallel_for( policy , f ); +} + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +} // namespace TestMemoryPool namespace Test { TEST_F( TEST_CATEGORY, memory_pool ) { + TestMemoryPool::test_host_memory_pool_defaults<>(); TestMemoryPool::test_host_memory_pool_stats<>(); TestMemoryPool::test_memory_pool_v2< TEST_EXECSPACE >(false,false); + TestMemoryPool::test_memory_pool_corners< TEST_EXECSPACE >(false,false); + TestMemoryPool::test_memory_pool_huge< TEST_EXECSPACE >(); } + } #endif diff --git a/lib/kokkos/core/unit_test/TestRange.hpp b/lib/kokkos/core/unit_test/TestRange.hpp index f55574761b..e6857a4d2f 100644 --- a/lib/kokkos/core/unit_test/TestRange.hpp +++ b/lib/kokkos/core/unit_test/TestRange.hpp @@ -72,8 +72,33 @@ struct TestRange { typename view_type::HostMirror host_flags = Kokkos::create_mirror_view( m_flags ); Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace, ScheduleType >( 0, N ), *this ); + +#if defined(KOKKOS_ENABLE_PROFILING) + { + typedef TestRange< ExecSpace, ScheduleType > ThisType; + std::string label("parallel_for"); + Kokkos::Impl::ParallelConstructName< ThisType, void> pcn(label); + ASSERT_EQ( pcn.get(), label ); + std::string empty_label(""); + Kokkos::Impl::ParallelConstructName< ThisType, void> empty_pcn(empty_label); + ASSERT_EQ( empty_pcn.get(), typeid(ThisType).name() ); + } +#endif + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace, ScheduleType, VerifyInitTag >( 0, N ), *this ); +#if defined(KOKKOS_ENABLE_PROFILING) + { + typedef TestRange< ExecSpace, ScheduleType > ThisType; + std::string label("parallel_for"); + Kokkos::Impl::ParallelConstructName< ThisType, VerifyInitTag> pcn(label); + ASSERT_EQ( pcn.get(), label ); + std::string empty_label(""); + Kokkos::Impl::ParallelConstructName< ThisType, VerifyInitTag> empty_pcn(empty_label); + ASSERT_EQ( empty_pcn.get(), std::string(typeid(ThisType).name()) + "/" + typeid(VerifyInitTag).name() ); + } +#endif + Kokkos::deep_copy( host_flags, m_flags ); int error_count = 0; @@ -276,19 +301,19 @@ TEST_F( TEST_CATEGORY, range_scan ) { { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(0); f.test_scan(); } { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(0); f.test_scan(); } -#ifndef KOKKOS_ENABLE_CUDA +#if !defined(KOKKOS_ENABLE_CUDA) && !defined(KOKKOS_ENABLE_ROCM) { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(0); f.test_dynamic_policy(); } #endif { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(2); f.test_scan(); } { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(3); f.test_scan(); } -#ifndef KOKKOS_ENABLE_CUDA +#if !defined(KOKKOS_ENABLE_CUDA) && !defined(KOKKOS_ENABLE_ROCM) { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(3); f.test_dynamic_policy(); } #endif { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(1000); f.test_scan(); } { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(1001); f.test_scan(); } -#ifndef KOKKOS_ENABLE_CUDA +#if !defined(KOKKOS_ENABLE_CUDA) && !defined(KOKKOS_ENABLE_ROCM) { TestRange< TEST_EXECSPACE, Kokkos::Schedule >f(1001); f.test_dynamic_policy(); } #endif } diff --git a/lib/kokkos/core/unit_test/TestReduce.hpp b/lib/kokkos/core/unit_test/TestReduce.hpp index 86982e6a55..56d6259b5a 100644 --- a/lib/kokkos/core/unit_test/TestReduce.hpp +++ b/lib/kokkos/core/unit_test/TestReduce.hpp @@ -475,6 +475,8 @@ public: namespace Test { +struct ReducerTag {}; + template< class Scalar, class ExecSpace = Kokkos::DefaultExecutionSpace > struct TestReducers { struct SumFunctor { @@ -590,6 +592,118 @@ struct TestReducers { } }; + struct SumFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + value += values( i ); + } + }; + + struct ProdFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + value *= values( i ); + } + }; + + struct MinFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + if ( values( i ) < value ) value = values( i ); + } + }; + + struct MaxFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + if ( values( i ) > value ) value = values( i ); + } + }; + + struct MinLocFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, typename Kokkos::Experimental::MinLoc< Scalar, int >::value_type & value ) const { + if ( values( i ) < value.val ) { + value.val = values( i ); + value.loc = i; + } + } + }; + + struct MaxLocFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, typename Kokkos::Experimental::MaxLoc< Scalar, int >::value_type & value ) const { + if ( values( i ) > value.val ) { + value.val = values( i ); + value.loc = i; + } + } + }; + + struct MinMaxLocFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, typename Kokkos::Experimental::MinMaxLoc< Scalar, int >::value_type & value ) const { + if ( values( i ) > value.max_val ) { + value.max_val = values( i ); + value.max_loc = i; + } + + if ( values( i ) < value.min_val ) { + value.min_val = values( i ); + value.min_loc = i; + } + } + }; + + struct BAndFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + value = value & values( i ); + } + }; + + struct BOrFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + value = value | values( i ); + } + }; + + struct LAndFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + value = value && values( i ); + } + }; + + struct LOrFunctorTag { + Kokkos::View< const Scalar*, ExecSpace > values; + + KOKKOS_INLINE_FUNCTION + void operator()( const ReducerTag, const int & i, Scalar & value ) const { + value = value || values( i ); + } + }; static void test_sum( int N ) { Kokkos::View< Scalar*, ExecSpace > values( "Values", N ); auto h_values = Kokkos::create_mirror_view( values ); @@ -603,13 +717,19 @@ struct TestReducers { SumFunctor f; f.values = values; + SumFunctorTag f_tag; + f_tag.values = values; Scalar init = 0; { Scalar sum_scalar = init; Kokkos::Experimental::Sum< Scalar > reducer_scalar( sum_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); - + ASSERT_EQ( sum_scalar, reference_sum ); + + sum_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( sum_scalar, reference_sum ); Scalar sum_scalar_view = reducer_scalar.reference(); @@ -643,13 +763,19 @@ struct TestReducers { ProdFunctor f; f.values = values; + ProdFunctorTag f_tag; + f_tag.values = values; Scalar init = 1; { Scalar prod_scalar = init; Kokkos::Experimental::Prod< Scalar > reducer_scalar( prod_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); - + ASSERT_EQ( prod_scalar, reference_prod ); + + prod_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( prod_scalar, reference_prod ); Scalar prod_scalar_view = reducer_scalar.reference(); @@ -684,13 +810,19 @@ struct TestReducers { MinFunctor f; f.values = values; + MinFunctorTag f_tag; + f_tag.values = values; Scalar init = std::numeric_limits< Scalar >::max(); { Scalar min_scalar = init; Kokkos::Experimental::Min< Scalar > reducer_scalar( min_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( min_scalar, reference_min ); + min_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( min_scalar, reference_min ); Scalar min_scalar_view = reducer_scalar.reference(); @@ -725,13 +857,19 @@ struct TestReducers { MaxFunctor f; f.values = values; + MaxFunctorTag f_tag; + f_tag.values = values; Scalar init = std::numeric_limits< Scalar >::min(); { Scalar max_scalar = init; Kokkos::Experimental::Max< Scalar > reducer_scalar( max_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( max_scalar, reference_max ); + + max_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( max_scalar, reference_max ); Scalar max_scalar_view = reducer_scalar.reference(); @@ -776,12 +914,19 @@ struct TestReducers { MinLocFunctor f; f.values = values; + MinLocFunctorTag f_tag; + f_tag.values = values; { value_type min_scalar; Kokkos::Experimental::MinLoc< Scalar, int > reducer_scalar( min_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( min_scalar.val, reference_min ); + ASSERT_EQ( min_scalar.loc, reference_loc ); + + min_scalar = value_type(); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( min_scalar.val, reference_min ); ASSERT_EQ( min_scalar.loc, reference_loc ); @@ -829,12 +974,19 @@ struct TestReducers { MaxLocFunctor f; f.values = values; + MaxLocFunctorTag f_tag; + f_tag.values = values; { value_type max_scalar; Kokkos::Experimental::MaxLoc< Scalar, int > reducer_scalar( max_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( max_scalar.val, reference_max ); + ASSERT_EQ( max_scalar.loc, reference_loc ); + + max_scalar = value_type(); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( max_scalar.val, reference_max ); ASSERT_EQ( max_scalar.loc, reference_loc ); @@ -898,12 +1050,35 @@ struct TestReducers { MinMaxLocFunctor f; f.values = values; + MinMaxLocFunctorTag f_tag; + f_tag.values = values; { value_type minmax_scalar; Kokkos::Experimental::MinMaxLoc< Scalar, int > reducer_scalar( minmax_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( minmax_scalar.min_val, reference_min ); + + for ( int i = 0; i < N; i++ ) { + if ( ( i == minmax_scalar.min_loc ) && ( h_values( i ) == reference_min ) ) { + reference_minloc = i; + } + } + + ASSERT_EQ( minmax_scalar.min_loc, reference_minloc ); + ASSERT_EQ( minmax_scalar.max_val, reference_max ); + + for ( int i = 0; i < N; i++ ) { + if ( ( i == minmax_scalar.max_loc ) && ( h_values( i ) == reference_max ) ) { + reference_maxloc = i; + } + } + + ASSERT_EQ( minmax_scalar.max_loc, reference_maxloc ); + + minmax_scalar = value_type(); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( minmax_scalar.min_val, reference_min ); for ( int i = 0; i < N; i++ ) { @@ -962,14 +1137,21 @@ struct TestReducers { BAndFunctor f; f.values = values; + BAndFunctorTag f_tag; + f_tag.values = values; Scalar init = Scalar() | ( ~Scalar() ); { Scalar band_scalar = init; Kokkos::Experimental::BAnd< Scalar > reducer_scalar( band_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); ASSERT_EQ( band_scalar, reference_band ); + + band_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); + ASSERT_EQ( band_scalar, reference_band ); + Scalar band_scalar_view = reducer_scalar.reference(); ASSERT_EQ( band_scalar_view, reference_band ); @@ -1002,13 +1184,19 @@ struct TestReducers { BOrFunctor f; f.values = values; + BOrFunctorTag f_tag; + f_tag.values = values; Scalar init = Scalar() & ( ~Scalar() ); { Scalar bor_scalar = init; Kokkos::Experimental::BOr< Scalar > reducer_scalar( bor_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( bor_scalar, reference_bor ); + + bor_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( bor_scalar, reference_bor ); Scalar bor_scalar_view = reducer_scalar.reference(); @@ -1042,13 +1230,19 @@ struct TestReducers { LAndFunctor f; f.values = values; + LAndFunctorTag f_tag; + f_tag.values = values; Scalar init = 1; { Scalar land_scalar = init; Kokkos::Experimental::LAnd< Scalar > reducer_scalar( land_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( land_scalar, reference_land ); + + land_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( land_scalar, reference_land ); Scalar land_scalar_view = reducer_scalar.reference(); @@ -1082,13 +1276,19 @@ struct TestReducers { LOrFunctor f; f.values = values; + LOrFunctorTag f_tag; + f_tag.values = values; Scalar init = 0; { Scalar lor_scalar = init; Kokkos::Experimental::LOr< Scalar > reducer_scalar( lor_scalar ); - Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace >( 0, N ), f, reducer_scalar ); + ASSERT_EQ( lor_scalar, reference_lor ); + + lor_scalar = init; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace , ReducerTag >( 0, N ), f_tag, reducer_scalar ); ASSERT_EQ( lor_scalar, reference_lor ); Scalar lor_scalar_view = reducer_scalar.reference(); diff --git a/lib/kokkos/core/unit_test/TestResize.hpp b/lib/kokkos/core/unit_test/TestResize.hpp new file mode 100644 index 0000000000..aaf0422b19 --- /dev/null +++ b/lib/kokkos/core/unit_test/TestResize.hpp @@ -0,0 +1,140 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ +#ifndef TESTVIEWSUBVIEW_HPP_ +#define TESTVIEWSUBVIEW_HPP_ + +#include +#include + +namespace TestViewResize { + +template +void testResize () +{ + const int sizes[8] = {2, 3, 4, 5, 6, 7, 8, 9}; + + // Check #904 fix (no reallocation if dimensions didn't change). + { + typedef Kokkos::View view_type; + view_type view_1d ("view_1d", sizes[0]); + const int* oldPointer = view_1d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_1d, sizes[0]); + const int* newPointer = view_1d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_2d ("view_2d", sizes[0], sizes[1]); + const int* oldPointer = view_2d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_2d, sizes[0], sizes[1]); + const int* newPointer = view_2d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_3d ("view_3d", sizes[0], sizes[1], sizes[2]); + const int* oldPointer = view_3d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_3d, sizes[0], sizes[1], sizes[2]); + const int* newPointer = view_3d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_4d ("view_4d", sizes[0], sizes[1], sizes[2], sizes[3]); + const int* oldPointer = view_4d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_4d, sizes[0], sizes[1], sizes[2], sizes[3]); + const int* newPointer = view_4d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_5d ("view_5d", sizes[0], sizes[1], sizes[2], sizes[3], + sizes[4]); + const int* oldPointer = view_5d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_5d, sizes[0], sizes[1], sizes[2], sizes[3], sizes[4]); + const int* newPointer = view_5d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_6d ("view_6d", sizes[0], sizes[1], sizes[2], sizes[3], + sizes[4], sizes[5]); + const int* oldPointer = view_6d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_6d, sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], + sizes[5]); + const int* newPointer = view_6d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_7d ("view_7d", sizes[0], sizes[1], sizes[2], sizes[3], + sizes[4], sizes[5], sizes[6]); + const int* oldPointer = view_7d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_7d, sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], + sizes[5], sizes[6]); + const int* newPointer = view_7d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } + { + typedef Kokkos::View view_type; + view_type view_8d ("view_8d", sizes[0], sizes[1], sizes[2], sizes[3], + sizes[4], sizes[5], sizes[6], sizes[7]); + const int* oldPointer = view_8d.data (); + EXPECT_TRUE( oldPointer != NULL ); + Kokkos::resize (view_8d, sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], + sizes[5], sizes[6], sizes[7]); + const int* newPointer = view_8d.data (); + EXPECT_TRUE( oldPointer == newPointer ); + } +} + +} // namespace TestViewSubview + +#endif // TESTVIEWSUBVIEW_HPP_ diff --git a/lib/kokkos/core/unit_test/TestScan.hpp b/lib/kokkos/core/unit_test/TestScan.hpp index fa7669c5ed..823f0c99a8 100644 --- a/lib/kokkos/core/unit_test/TestScan.hpp +++ b/lib/kokkos/core/unit_test/TestScan.hpp @@ -92,7 +92,7 @@ struct TestScan { Kokkos::deep_copy( errors_a, 0 ); errors = errors_a; - parallel_scan( N , *this ); + Kokkos::parallel_scan( N , *this ); } TestScan( const WorkSpec & Start , const WorkSpec & N ) @@ -103,7 +103,7 @@ struct TestScan { Kokkos::deep_copy( errors_a, 0 ); errors = errors_a; - parallel_scan( exec_policy( Start , N ) , *this ); + Kokkos::parallel_scan( exec_policy( Start , N ) , *this ); } static void test_range( const WorkSpec & begin, const WorkSpec & end ) diff --git a/lib/kokkos/core/unit_test/TestTaskScheduler.hpp b/lib/kokkos/core/unit_test/TestTaskScheduler.hpp index 3a88475620..2ababe6a49 100644 --- a/lib/kokkos/core/unit_test/TestTaskScheduler.hpp +++ b/lib/kokkos/core/unit_test/TestTaskScheduler.hpp @@ -141,13 +141,13 @@ struct TestFib enum { MinBlockSize = 64 }; enum { MaxBlockSize = 1024 }; - enum { SuperBlockSize = 1u << 12 }; + enum { SuperBlockSize = 4096 }; sched_type root_sched( memory_space() , MemoryCapacity , MinBlockSize - , MaxBlockSize - , SuperBlockSize ); + , std::min(size_t(MaxBlockSize),MemoryCapacity) + , std::min(size_t(SuperBlockSize),MemoryCapacity) ); future_type f = Kokkos::host_spawn( Kokkos::TaskSingle( root_sched ) , TestFib( root_sched, i ) ); @@ -205,11 +205,10 @@ struct TestTaskSpawn { { typedef typename sched_type::memory_space memory_space; - // enum { MemoryCapacity = 4000 }; // Triggers infinite loop in memory pool. enum { MemoryCapacity = 16000 }; enum { MinBlockSize = 64 }; enum { MaxBlockSize = 1024 }; - enum { SuperBlockSize = 1u << 12 }; + enum { SuperBlockSize = 4096 }; sched_type sched( memory_space() , MemoryCapacity @@ -250,20 +249,23 @@ struct TestTaskDependence { const int n = CHUNK < m_count ? CHUNK : m_count; if ( 1 < m_count ) { - future_type f[ CHUNK ]; - const int inc = ( m_count + n - 1 ) / n; + const int increment = ( m_count + n - 1 ) / n; - for ( int i = 0; i < n; ++i ) { - long begin = i * inc; - long count = begin + inc < m_count ? inc : m_count - begin; - f[i] = Kokkos::task_spawn( Kokkos::TaskSingle( m_sched ) - , TestTaskDependence( count, m_sched, m_accum ) ); - } + future_type f = + m_sched.when_all( n , [this,increment]( int i ) { + const long inc = increment ; + const long begin = i * inc ; + const long count = begin + inc < m_count ? inc : m_count - begin ; + + return Kokkos::task_spawn + ( Kokkos::TaskSingle( m_sched ) + , TestTaskDependence( count, m_sched, m_accum ) ); + }); m_count = 0; - Kokkos::respawn( this, Kokkos::when_all( f, n ) ); + Kokkos::respawn( this, f ); } else if ( 1 == m_count ) { Kokkos::atomic_increment( & m_accum() ); @@ -274,11 +276,10 @@ struct TestTaskDependence { { typedef typename sched_type::memory_space memory_space; - // enum { MemoryCapacity = 4000 }; // Triggers infinite loop in memory pool. enum { MemoryCapacity = 16000 }; enum { MinBlockSize = 64 }; enum { MaxBlockSize = 1024 }; - enum { SuperBlockSize = 1u << 12 }; + enum { SuperBlockSize = 4096 }; sched_type sched( memory_space() , MemoryCapacity @@ -358,7 +359,9 @@ struct TestTaskTeam { , begin - 1 ) ); + #ifndef __HCC_ACCELERATOR__ assert( !future.is_null() ); + #endif Kokkos::respawn( this, future ); } @@ -466,13 +469,11 @@ struct TestTaskTeam { static void run( long n ) { - //const unsigned memory_capacity = 10000; // Causes memory pool infinite loop. - //const unsigned memory_capacity = 100000; // Fails with SPAN=1 for serial and OMP. const unsigned memory_capacity = 400000; enum { MinBlockSize = 64 }; enum { MaxBlockSize = 1024 }; - enum { SuperBlockSize = 1u << 12 }; + enum { SuperBlockSize = 4096 }; sched_type root_sched( typename sched_type::memory_space() , memory_capacity @@ -595,12 +596,11 @@ struct TestTaskTeamValue { static void run( long n ) { - //const unsigned memory_capacity = 10000; // Causes memory pool infinite loop. const unsigned memory_capacity = 100000; enum { MinBlockSize = 64 }; enum { MaxBlockSize = 1024 }; - enum { SuperBlockSize = 1u << 12 }; + enum { SuperBlockSize = 4096 }; sched_type root_sched( typename sched_type::memory_space() , memory_capacity @@ -641,19 +641,12 @@ namespace Test { TEST_F( TEST_CATEGORY, task_fib ) { - const int N = 24 ; // 25 triggers tbd bug on Cuda/Pascal + const int N = 27 ; for ( int i = 0; i < N; ++i ) { - TestTaskScheduler::TestFib< TEST_EXECSPACE >::run( i , ( i + 1 ) * ( i + 1 ) * 10000 ); + TestTaskScheduler::TestFib< TEST_EXECSPACE >::run( i , ( i + 1 ) * ( i + 1 ) * 2000 ); } } -#if defined(KOKKOS_ARCH_MAXWELL) || defined(KOKKOS_ARCH_PASCAL) - // TODO: Resolve bug in task DAG for Pascal - #define KOKKOS_IMPL_DISABLE_UNIT_TEST_TASK_DAG_PASCAL -#endif - -#ifndef KOKKOS_IMPL_DISABLE_UNIT_TEST_TASK_DAG_PASCAL - TEST_F( TEST_CATEGORY, task_depend ) { for ( int i = 0; i < 25; ++i ) { @@ -667,11 +660,8 @@ TEST_F( TEST_CATEGORY, task_team ) //TestTaskScheduler::TestTaskTeamValue< TEST_EXECSPACE >::run( 1000 ); // Put back after testing. } -#else //ndef KOKKOS_IMPL_DISABLE_UNIT_TEST_TASK_DAG_PASCAL -#undef KOKKOS_IMPL_DISABLE_UNIT_TEST_TASK_DAG_PASCAL -#endif //ndef KOKKOS_IMPL_DISABLE_UNIT_TEST_TASK_DAG_PASCAL - } + #endif // #if defined( KOKKOS_ENABLE_TASKDAG ) #endif // #ifndef KOKKOS_UNITTEST_TASKSCHEDULER_HPP diff --git a/lib/kokkos/core/unit_test/TestTeamVector.hpp b/lib/kokkos/core/unit_test/TestTeamVector.hpp index e9e2f7548a..be048b19e4 100644 --- a/lib/kokkos/core/unit_test/TestTeamVector.hpp +++ b/lib/kokkos/core/unit_test/TestTeamVector.hpp @@ -46,6 +46,7 @@ #include #include #include +#include namespace TestTeamVector { @@ -838,6 +839,19 @@ public: }, result ); const ScalarType solution = (ScalarType) nrows * (ScalarType) ncols; + + if ( int64_t(solution) != int64_t(result) ) { + printf( " TestTripleNestedReduce failed solution(%" PRId64 ") != result(%" PRId64 ")," + " nrows(%" PRId32 ") ncols(%" PRId32 ") league_size(%" PRId32 ") team_size(%" PRId32 ")\n" + , int64_t(solution) + , int64_t(result) + , int32_t(nrows) + , int32_t(ncols) + , int32_t(nrows/chunk_size) + , int32_t(team_size) + ); + } + ASSERT_EQ( solution, result ); } }; diff --git a/lib/kokkos/core/unit_test/TestTile.hpp b/lib/kokkos/core/unit_test/TestTile.hpp index 8f57dfea75..f15667322f 100644 --- a/lib/kokkos/core/unit_test/TestTile.hpp +++ b/lib/kokkos/core/unit_test/TestTile.hpp @@ -94,7 +94,7 @@ struct ReduceTileErrors const size_t jtile = iwork / tile_dim0; if ( jtile < tile_dim1 ) { - tile_type tile = Kokkos::Experimental::tile_subview( m_array, itile, jtile ); + tile_type tile = Kokkos::tile_subview( m_array, itile, jtile ); if ( tile( 0, 0 ) != ptrdiff_t( ( itile + jtile * tile_dim0 ) * TileLayout::N0 * TileLayout::N1 ) ) { ++errors; diff --git a/lib/kokkos/core/unit_test/TestUniqueToken.hpp b/lib/kokkos/core/unit_test/TestUniqueToken.hpp new file mode 100644 index 0000000000..28add61a8a --- /dev/null +++ b/lib/kokkos/core/unit_test/TestUniqueToken.hpp @@ -0,0 +1,138 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#include + +namespace Test { + +template< class Space > +class TestUniqueToken +{ +public: + typedef typename Space::execution_space execution_space; + typedef Kokkos::View< int * , execution_space > view_type ; + + Kokkos::Experimental::UniqueToken< execution_space , Kokkos::Experimental::UniqueTokenScope::Global > tokens ; + + view_type verify ; + view_type counts ; + view_type errors ; + + KOKKOS_INLINE_FUNCTION + void operator()( long ) const + { + const int32_t t = tokens.acquire(); + + bool ok = true ; + + ok = ok && 0 <= t ; + ok = ok && t < tokens.size(); + ok = ok && 0 == Kokkos::atomic_fetch_add( & verify(t) , 1 ); + + Kokkos::atomic_fetch_add( & counts(t) , 1 ); + + ok = ok && 1 == Kokkos::atomic_fetch_add( & verify(t) , -1 ); + + if ( ! ok ) { Kokkos::atomic_fetch_add( & errors(0) , 1 ) ; } + + tokens.release(t); + } + + TestUniqueToken() + : tokens( execution_space() ) + , verify( "TestUniqueTokenVerify" , tokens.size() ) + , counts( "TestUniqueTokenCounts" , tokens.size() ) + , errors( "TestUniqueTokenErrors" , 1 ) + {} + + static void run() + { + using policy = Kokkos::RangePolicy ; + + TestUniqueToken self ; + + { + const int duplicate = 100 ; + const long n = duplicate * self.tokens.size(); + + Kokkos::parallel_for( policy(0,n) , self ); + Kokkos::parallel_for( policy(0,n) , self ); + Kokkos::parallel_for( policy(0,n) , self ); + Kokkos::fence(); + } + + typename view_type::HostMirror host_counts = + Kokkos::create_mirror_view( self.counts ); + + Kokkos::deep_copy( host_counts , self.counts ); + + int32_t max = 0 ; + + { + const long n = host_counts.extent(0); + for ( long i = 0 ; i < n ; ++i ) { + if ( max < host_counts[i] ) max = host_counts[i] ; + } + } + + std::cout << "TestUniqueToken max reuse = " << max << std::endl ; + + typename view_type::HostMirror host_errors = + Kokkos::create_mirror_view( self.errors ); + + Kokkos::deep_copy( host_errors , self.errors ); + + ASSERT_EQ( host_errors(0) , 0 ); + } +}; + + +TEST_F( TEST_CATEGORY, unique_token ) +{ + TestUniqueToken< TEST_EXECSPACE >::run(); +} + +} // namespace Test + diff --git a/lib/kokkos/core/unit_test/TestViewAPI.hpp b/lib/kokkos/core/unit_test/TestViewAPI.hpp index 232163f11e..0f5650d284 100644 --- a/lib/kokkos/core/unit_test/TestViewAPI.hpp +++ b/lib/kokkos/core/unit_test/TestViewAPI.hpp @@ -786,11 +786,40 @@ struct TestViewMirror ASSERT_EQ( a_h.dimension_0(), a_d .dimension_0() ); } + template< class MemoryTraits > + void static test_mirror_copy() { + Kokkos::View< double*, Layout, Kokkos::HostSpace > a_org( "A", 10 ); + a_org(5) = 42.0; + Kokkos::View< double*, Layout, Kokkos::HostSpace, MemoryTraits > a_h = a_org; + auto a_h2 = Kokkos::create_mirror_view_and_copy( Kokkos::HostSpace(), a_h ); + auto a_d = Kokkos::create_mirror_view_and_copy( DeviceType(), a_h ); + auto a_h3 = Kokkos::create_mirror_view_and_copy( Kokkos::HostSpace(), a_d ); + + int equal_ptr_h_h2 = a_h.data() == a_h2.data() ? 1 : 0; + int equal_ptr_h_d = a_h.data() == a_d.data() ? 1 : 0; + int equal_ptr_h2_d = a_h2.data() == a_d.data() ? 1 : 0; + int equal_ptr_h3_d = a_h3.data() == a_d.data() ? 1 : 0; + + int is_same_memspace = std::is_same< Kokkos::HostSpace, typename DeviceType::memory_space >::value ? 1 : 0; + ASSERT_EQ( equal_ptr_h_h2, 1 ); + ASSERT_EQ( equal_ptr_h_d, is_same_memspace ); + ASSERT_EQ( equal_ptr_h2_d, is_same_memspace ); + ASSERT_EQ( equal_ptr_h3_d, is_same_memspace ); + + ASSERT_EQ( a_h.dimension_0(), a_h3.dimension_0() ); + ASSERT_EQ( a_h.dimension_0(), a_h2.dimension_0() ); + ASSERT_EQ( a_h.dimension_0(), a_d .dimension_0() ); + ASSERT_EQ( a_org(5), a_h3(5) ); + } + + void static testit() { test_mirror< Kokkos::MemoryTraits<0> >(); test_mirror< Kokkos::MemoryTraits >(); test_mirror_view< Kokkos::MemoryTraits<0> >(); test_mirror_view< Kokkos::MemoryTraits >(); + test_mirror_copy< Kokkos::MemoryTraits<0> >(); + test_mirror_copy< Kokkos::MemoryTraits >(); } }; @@ -1312,10 +1341,12 @@ return; } }; +#if !defined(KOKKOS_ENABLE_ROCM) TEST_F( TEST_CATEGORY, view_api ) { TestViewAPI< double, TEST_EXECSPACE >(); } +#endif TEST_F( TEST_CATEGORY, view_remap ) { @@ -1324,10 +1355,14 @@ TEST_F( TEST_CATEGORY, view_remap ) #ifdef KOKKOS_ENABLE_CUDA #define EXECSPACE std::conditional::value,Kokkos::CudaHostPinnedSpace,TEST_EXECSPACE>::type #else - #ifdef KOKKOS_ENABLE_OPENMPTARGET - #define EXECSPACE Kokkos::HostSpace + #ifdef KOKKOS_ENABLE_ROCM + #define EXECSPACE std::conditional::value,Kokkos::Experimental::ROCmHostPinnedSpace,TEST_EXECSPACE>::type #else - #define EXECSPACE TEST_EXECSPACE + #if defined(KOKKOS_ENABLE_OPENMPTARGET) + #define EXECSPACE Kokkos::HostSpace + #else + #define EXECSPACE TEST_EXECSPACE + #endif #endif #endif @@ -1375,4 +1410,14 @@ TEST_F( TEST_CATEGORY, view_remap ) } } +TEST_F( TEST_CATEGORY, view_mirror_nonconst ) +{ + Kokkos::View d_view("d_view", 10); + Kokkos::View d_view_const = d_view; + auto h_view = Kokkos::create_mirror(d_view_const); + Kokkos::deep_copy(h_view, d_view_const); + auto h_view2 = Kokkos::create_mirror(Kokkos::HostSpace(), d_view_const); + Kokkos::deep_copy(h_view2, d_view_const); +} + } // namespace Test diff --git a/lib/kokkos/core/unit_test/TestViewCtorPropEmbeddedDim.hpp b/lib/kokkos/core/unit_test/TestViewCtorPropEmbeddedDim.hpp new file mode 100644 index 0000000000..61b43a588a --- /dev/null +++ b/lib/kokkos/core/unit_test/TestViewCtorPropEmbeddedDim.hpp @@ -0,0 +1,161 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#include + +#include + +#include +#include + +namespace Test { + +namespace { + +template +struct TestViewCtorProp_EmbeddedDim { + + using ViewIntType = typename Kokkos::View< int**, ExecSpace >; + using ViewDoubleType = typename Kokkos::View< double*, ExecSpace >; + + // Cuda 7.0 has issues with using a lamda in parallel_for to initialize the view - replace with this functor + template < class ViewType > + struct Functor { + + ViewType v; + + Functor( const ViewType & v_ ) : v(v_) {} + + KOKKOS_INLINE_FUNCTION + void operator()( const int i ) const { + v(i) = i; + } + + }; + + + static void test_vcpt( const int N0, const int N1 ) + { + + // Create views to test + { + using VIT = typename TestViewCtorProp_EmbeddedDim::ViewIntType ; + using VDT = typename TestViewCtorProp_EmbeddedDim::ViewDoubleType ; + + VIT vi1("vi1", N0, N1); + VDT vd1("vd1", N0); + + // TEST: Test for common type between two views, one with type double, other with type int + // Deduce common value_type and construct a view with that type + { + // Two views + auto view_alloc_arg = Kokkos::common_view_alloc_prop(vi1, vd1); + typedef typename decltype( view_alloc_arg )::value_type CommonViewValueType; + typedef typename Kokkos::View< CommonViewValueType*, ExecSpace > CVT; + typedef typename CVT::HostMirror HostCVT; + + // Construct View using the common type; for case of specialization, an 'embedded_dim' would be stored by view_alloc_arg + CVT cv1( Kokkos::view_alloc( "cv1", view_alloc_arg ), N0*N1 ); + + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace >(0, N0*N1), + Functor(cv1) + ); + + HostCVT hcv1 = Kokkos::create_mirror_view( cv1 ); + Kokkos::deep_copy( hcv1, cv1 ); + + ASSERT_EQ( (std::is_same< CommonViewValueType, double >::value) , true ) ; + ASSERT_EQ( (std::is_same< typename decltype(view_alloc_arg)::scalar_array_type, CommonViewValueType>::value) , true ) ; + #if 0 + // debug output + for ( int i = 0; i < N0*N1; ++i ) { + printf(" Output check: hcv1(%d) = %lf\n ", i, hcv1(i) ); + } + + printf( " Common value type view: %s \n", typeid( CVT() ).name() ); + printf( " Common value type: %s \n", typeid( CommonViewValueType() ).name() ); + if ( std::is_same< CommonViewValueType, double >::value == true ) { + printf("Proper common value_type\n"); + } + else { + printf("WRONG common value_type\n"); + } + // end debug output + #endif + } + + { + // Single view + auto view_alloc_arg = Kokkos::common_view_alloc_prop(vi1); + typedef typename decltype( view_alloc_arg )::value_type CommonViewValueType; + typedef typename Kokkos::View< CommonViewValueType*, ExecSpace > CVT; + typedef typename CVT::HostMirror HostCVT; + + // Construct View using the common type; for case of specialization, an 'embedded_dim' would be stored by view_alloc_arg + CVT cv1( Kokkos::view_alloc( "cv1", view_alloc_arg ), N0*N1 ); + + Kokkos::parallel_for( Kokkos::RangePolicy< ExecSpace >(0, N0*N1), + Functor(cv1) + ); + + HostCVT hcv1 = Kokkos::create_mirror_view( cv1 ); + Kokkos::deep_copy( hcv1, cv1 ); + + ASSERT_EQ( (std::is_same< CommonViewValueType, int>::value) , true ) ; + } + + } + + } // end test_vcpt + +}; // end struct + +} // namespace + +TEST_F( TEST_CATEGORY , viewctorprop_embedded_dim ) { + TestViewCtorProp_EmbeddedDim< TEST_EXECSPACE >::test_vcpt( 2, 3 ); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/TestViewMapping_a.hpp b/lib/kokkos/core/unit_test/TestViewMapping_a.hpp index 6830c2e049..f963875ae1 100644 --- a/lib/kokkos/core/unit_test/TestViewMapping_a.hpp +++ b/lib/kokkos/core/unit_test/TestViewMapping_a.hpp @@ -56,24 +56,24 @@ void test_view_mapping() { typedef typename Space::execution_space ExecSpace; - typedef Kokkos::Experimental::Impl::ViewDimension<> dim_0; - typedef Kokkos::Experimental::Impl::ViewDimension< 2 > dim_s2; - typedef Kokkos::Experimental::Impl::ViewDimension< 2, 3 > dim_s2_s3; - typedef Kokkos::Experimental::Impl::ViewDimension< 2, 3, 4 > dim_s2_s3_s4; + typedef Kokkos::Impl::ViewDimension<> dim_0; + typedef Kokkos::Impl::ViewDimension< 2 > dim_s2; + typedef Kokkos::Impl::ViewDimension< 2, 3 > dim_s2_s3; + typedef Kokkos::Impl::ViewDimension< 2, 3, 4 > dim_s2_s3_s4; - typedef Kokkos::Experimental::Impl::ViewDimension< 0 > dim_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 3 > dim_s0_s3; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 3, 4 > dim_s0_s3_s4; + typedef Kokkos::Impl::ViewDimension< 0 > dim_s0; + typedef Kokkos::Impl::ViewDimension< 0, 3 > dim_s0_s3; + typedef Kokkos::Impl::ViewDimension< 0, 3, 4 > dim_s0_s3_s4; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0 > dim_s0_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 4 > dim_s0_s0_s4; + typedef Kokkos::Impl::ViewDimension< 0, 0 > dim_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 4 > dim_s0_s0_s4; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0 > dim_s0_s0_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0, 0 > dim_s0_s0_s0_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0_s0_s0; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0, 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0_s0_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0 > dim_s0_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0, 0 > dim_s0_s0_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0_s0_s0; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0, 0, 0, 0, 0, 0 > dim_s0_s0_s0_s0_s0_s0_s0_s0; // Fully static dimensions should not be larger than an int. ASSERT_LE( sizeof( dim_0 ), sizeof( int ) ); @@ -186,12 +186,12 @@ void test_view_mapping() //---------------------------------------- - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s0, Kokkos::LayoutStride > stride_s0_s0_s0; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s0, Kokkos::LayoutStride > stride_s0_s0_s0; //---------------------------------------- // Static dimension. { - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s2_s3_s4, Kokkos::LayoutLeft > left_s2_s3_s4; + typedef Kokkos::Impl::ViewOffset< dim_s2_s3_s4, Kokkos::LayoutLeft > left_s2_s3_s4; ASSERT_EQ( sizeof( left_s2_s3_s4 ), sizeof( dim_s2_s3_s4 ) ); @@ -223,7 +223,7 @@ void test_view_mapping() //---------------------------------------- // Small dimension is unpadded. { - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutLeft > left_s0_s0_s4; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutLeft > left_s0_s0_s4; left_s0_s0_s4 dyn_off3( std::integral_constant< unsigned, sizeof( int ) >() , Kokkos::LayoutLeft( 2, 3, 0, 0, 0, 0, 0, 0 ) ); @@ -275,7 +275,7 @@ void test_view_mapping() constexpr int N0 = 2000; constexpr int N1 = 300; - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutLeft > left_s0_s0_s4; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutLeft > left_s0_s0_s4; left_s0_s0_s4 dyn_off3( std::integral_constant< unsigned, sizeof( int ) >() , Kokkos::LayoutLeft( N0, N1, 0, 0, 0, 0, 0, 0 ) ); @@ -314,7 +314,7 @@ void test_view_mapping() //---------------------------------------- // Static dimension. { - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s2_s3_s4, Kokkos::LayoutRight > right_s2_s3_s4; + typedef Kokkos::Impl::ViewOffset< dim_s2_s3_s4, Kokkos::LayoutRight > right_s2_s3_s4; ASSERT_EQ( sizeof( right_s2_s3_s4 ), sizeof( dim_s2_s3_s4 ) ); @@ -350,7 +350,7 @@ void test_view_mapping() //---------------------------------------- // Small dimension is unpadded. { - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutRight > right_s0_s0_s4; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutRight > right_s0_s0_s4; right_s0_s0_s4 dyn_off3( std::integral_constant< unsigned, sizeof( int ) >() , Kokkos::LayoutRight( 2, 3, 0, 0, 0, 0, 0, 0 ) ); @@ -391,7 +391,7 @@ void test_view_mapping() constexpr int N0 = 2000; constexpr int N1 = 300; - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutRight > right_s0_s0_s4; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutRight > right_s0_s0_s4; right_s0_s0_s4 dyn_off3( std::integral_constant< unsigned, sizeof( int ) >() , Kokkos::LayoutRight( N0, N1, 0, 0, 0, 0, 0, 0 ) ); @@ -431,18 +431,18 @@ void test_view_mapping() // Subview. { // Mapping rank 4 to rank 3 - typedef Kokkos::Experimental::Impl::SubviewExtents< 4, 3 > SubviewExtents; + typedef Kokkos::Impl::SubviewExtents< 4, 3 > SubviewExtents; constexpr int N0 = 1000; constexpr int N1 = 2000; constexpr int N2 = 3000; constexpr int N3 = 4000; - Kokkos::Experimental::Impl::ViewDimension< N0, N1, N2, N3 > dim; + Kokkos::Impl::ViewDimension< N0, N1, N2, N3 > dim; SubviewExtents tmp( dim , N0 / 2 - , Kokkos::Experimental::ALL + , Kokkos::ALL , std::pair< int, int >( N2 / 4, 10 + N2 / 4 ) , Kokkos::pair< int, int >( N3 / 4, 20 + N3 / 4 ) ); @@ -469,12 +469,12 @@ void test_view_mapping() constexpr int sub_N1 = 200; constexpr int sub_N2 = 4; - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutLeft > left_s0_s0_s4; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutLeft > left_s0_s0_s4; left_s0_s0_s4 dyn_off3( std::integral_constant< unsigned, sizeof( int ) >() , Kokkos::LayoutLeft( N0, N1, 0, 0, 0, 0, 0, 0 ) ); - Kokkos::Experimental::Impl::SubviewExtents< 3, 3 > + Kokkos::Impl::SubviewExtents< 3, 3 > sub( dyn_off3.m_dim , Kokkos::pair< int, int >( 0, sub_N0 ) , Kokkos::pair< int, int >( 0, sub_N1 ) @@ -509,12 +509,12 @@ void test_view_mapping() constexpr int sub_N1 = 200; constexpr int sub_N2 = 4; - typedef Kokkos::Experimental::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutRight > right_s0_s0_s4; + typedef Kokkos::Impl::ViewOffset< dim_s0_s0_s4, Kokkos::LayoutRight > right_s0_s0_s4; right_s0_s0_s4 dyn_off3( std::integral_constant< unsigned, sizeof( int ) >() , Kokkos::LayoutRight( N0, N1, 0, 0, 0, 0, 0, 0 ) ); - Kokkos::Experimental::Impl::SubviewExtents< 3, 3 > + Kokkos::Impl::SubviewExtents< 3, 3 > sub( dyn_off3.m_dim , Kokkos::pair< int, int >( 0, sub_N0 ) , Kokkos::pair< int, int >( 0, sub_N1 ) @@ -544,7 +544,7 @@ void test_view_mapping() //---------------------------------------- // View data analysis. { - using namespace Kokkos::Experimental::Impl; + using namespace Kokkos::Impl; static_assert( rank_dynamic<>::value == 0, "" ); static_assert( rank_dynamic< 1 >::value == 0, "" ); @@ -554,7 +554,7 @@ void test_view_mapping() } { - using namespace Kokkos::Experimental::Impl; + using namespace Kokkos::Impl; typedef ViewArrayAnalysis< int[] > a_int_r1; typedef ViewArrayAnalysis< int**[4][5][6] > a_int_r5; @@ -598,7 +598,7 @@ void test_view_mapping() } { - using namespace Kokkos::Experimental::Impl; + using namespace Kokkos::Impl; typedef int t_i4[4]; @@ -616,12 +616,12 @@ void test_view_mapping() } { - using namespace Kokkos::Experimental::Impl; + using namespace Kokkos::Impl; typedef ViewDataAnalysis< const int[], void > a_const_int_r1; static_assert( std::is_same< typename a_const_int_r1::specialize, void >::value, "" ); - static_assert( std::is_same< typename a_const_int_r1::dimension, Kokkos::Experimental::Impl::ViewDimension<0> >::value, "" ); + static_assert( std::is_same< typename a_const_int_r1::dimension, Kokkos::Impl::ViewDimension<0> >::value, "" ); static_assert( std::is_same< typename a_const_int_r1::type, const int * >::value, "" ); static_assert( std::is_same< typename a_const_int_r1::value_type, const int >::value, "" ); @@ -637,7 +637,7 @@ void test_view_mapping() static_assert( std::is_same< typename a_const_int_r3::specialize, void >::value, "" ); - static_assert( std::is_same< typename a_const_int_r3::dimension, Kokkos::Experimental::Impl::ViewDimension<0, 0, 4> >::value, "" ); + static_assert( std::is_same< typename a_const_int_r3::dimension, Kokkos::Impl::ViewDimension<0, 0, 4> >::value, "" ); static_assert( std::is_same< typename a_const_int_r3::type, const int**[4] >::value, "" ); static_assert( std::is_same< typename a_const_int_r3::value_type, const int >::value, "" ); @@ -786,7 +786,7 @@ void test_view_mapping() // The execution space of the memory space must be available for view data initialization. if ( std::is_same< ExecSpace, typename ExecSpace::memory_space::execution_space >::value ) { - using namespace Kokkos::Experimental; + using namespace Kokkos; typedef typename ExecSpace::memory_space memory_space; typedef View< int*, memory_space > V; @@ -811,8 +811,8 @@ void test_view_mapping() { typedef Kokkos::ViewTraits< int***, Kokkos::LayoutStride, ExecSpace > traits_t; - typedef Kokkos::Experimental::Impl::ViewDimension< 0, 0, 0 > dims_t; - typedef Kokkos::Experimental::Impl::ViewOffset< dims_t, Kokkos::LayoutStride > offset_t; + typedef Kokkos::Impl::ViewDimension< 0, 0, 0 > dims_t; + typedef Kokkos::Impl::ViewOffset< dims_t, Kokkos::LayoutStride > offset_t; Kokkos::LayoutStride stride; @@ -836,8 +836,8 @@ void test_view_mapping() ASSERT_EQ( offset.span(), 60 ); ASSERT_TRUE( offset.span_is_contiguous() ); - Kokkos::Experimental::Impl::ViewMapping< traits_t, void > - v( Kokkos::Experimental::Impl::ViewCtorProp< int* >( (int*) 0 ), stride ); + Kokkos::Impl::ViewMapping< traits_t, void > + v( Kokkos::Impl::ViewCtorProp< int* >( (int*) 0 ), stride ); } { @@ -849,8 +849,8 @@ void test_view_mapping() constexpr int N1 = 11; V a( "a", N0, N1 ); - M b = Kokkos::Experimental::create_mirror( a ); - M c = Kokkos::Experimental::create_mirror_view( a ); + M b = Kokkos::create_mirror( a ); + M c = Kokkos::create_mirror_view( a ); M d; for ( int i0 = 0; i0 < N0; ++i0 ) @@ -859,8 +859,8 @@ void test_view_mapping() b( i0, i1 ) = 1 + i0 + i1 * N0; } - Kokkos::Experimental::deep_copy( a, b ); - Kokkos::Experimental::deep_copy( c, a ); + Kokkos::deep_copy( a, b ); + Kokkos::deep_copy( c, a ); for ( int i0 = 0; i0 < N0; ++i0 ) for ( int i1 = 0; i1 < N1; ++i1 ) @@ -868,7 +868,7 @@ void test_view_mapping() ASSERT_EQ( b( i0, i1 ), c( i0, i1 ) ); } - Kokkos::Experimental::resize( b, 5, 6 ); + Kokkos::resize( b, 5, 6 ); for ( int i0 = 0; i0 < 5; ++i0 ) for ( int i1 = 0; i1 < 6; ++i1 ) @@ -878,8 +878,8 @@ void test_view_mapping() ASSERT_EQ( b( i0, i1 ), val ); } - Kokkos::Experimental::realloc( c, 5, 6 ); - Kokkos::Experimental::realloc( d, 5, 6 ); + Kokkos::realloc( c, 5, 6 ); + Kokkos::realloc( d, 5, 6 ); ASSERT_EQ( b.dimension_0(), 5 ); ASSERT_EQ( b.dimension_1(), 6 ); @@ -889,7 +889,7 @@ void test_view_mapping() ASSERT_EQ( d.dimension_1(), 6 ); layout_type layout( 7, 8 ); - Kokkos::Experimental::resize( b, layout ); + Kokkos::resize( b, layout ); for ( int i0 = 0; i0 < 7; ++i0 ) for ( int i1 = 6; i1 < 8; ++i1 ) { @@ -909,8 +909,8 @@ void test_view_mapping() ASSERT_EQ( b( i0, i1 ), val ); } - Kokkos::Experimental::realloc( c, layout ); - Kokkos::Experimental::realloc( d, layout ); + Kokkos::realloc( c, layout ); + Kokkos::realloc( d, layout ); ASSERT_EQ( b.dimension_0(), 7 ); ASSERT_EQ( b.dimension_1(), 8 ); @@ -932,8 +932,8 @@ void test_view_mapping() const int order[] = { 1, 0 }; V a( "a", Kokkos::LayoutStride::order_dimensions( 2, order, dimensions ) ); - M b = Kokkos::Experimental::create_mirror( a ); - M c = Kokkos::Experimental::create_mirror_view( a ); + M b = Kokkos::create_mirror( a ); + M c = Kokkos::create_mirror_view( a ); M d; for ( int i0 = 0; i0 < N0; ++i0 ) @@ -942,8 +942,8 @@ void test_view_mapping() b( i0, i1 ) = 1 + i0 + i1 * N0; } - Kokkos::Experimental::deep_copy( a, b ); - Kokkos::Experimental::deep_copy( c, a ); + Kokkos::deep_copy( a, b ); + Kokkos::deep_copy( c, a ); for ( int i0 = 0; i0 < N0; ++i0 ) for ( int i1 = 0; i1 < N1; ++i1 ) @@ -954,7 +954,7 @@ void test_view_mapping() const int dimensions2[] = { 7, 8 }; const int order2[] = { 1, 0 }; layout_type layout = layout_type::order_dimensions( 2, order2, dimensions2 ); - Kokkos::Experimental::resize( b, layout ); + Kokkos::resize( b, layout ); for ( int i0 = 0; i0 < 7; ++i0 ) for ( int i1 = 0; i1 < 8; ++i1 ) @@ -964,8 +964,8 @@ void test_view_mapping() ASSERT_EQ( b( i0, i1 ), val ); } - Kokkos::Experimental::realloc( c, layout ); - Kokkos::Experimental::realloc( d, layout ); + Kokkos::realloc( c, layout ); + Kokkos::realloc( d, layout ); ASSERT_EQ( b.dimension_0(), 7 ); ASSERT_EQ( b.dimension_1(), 8 ); @@ -1012,7 +1012,7 @@ void test_view_mapping() ASSERT_EQ( a.use_count(), 1 ); ASSERT_EQ( b.use_count(), 0 ); -#if !defined( KOKKOS_ENABLE_CUDA_LAMBDA ) +#if !defined( KOKKOS_ENABLE_CUDA_LAMBDA ) && !defined( KOKKOS_ENABLE_ROCM ) // Cannot launch host lambda when CUDA lambda is enabled. typedef typename Kokkos::Impl::HostMirror< Space >::Space::execution_space host_exec_space; @@ -1021,6 +1021,7 @@ void test_view_mapping() // 'a' is captured by copy, and the capture mechanism converts 'a' to an // unmanaged copy. When the parallel dispatch accepts a move for the // lambda, this count should become 1. + ASSERT_EQ( a.use_count(), 2 ); V x = a; ASSERT_EQ( a.use_count(), 2 ); diff --git a/lib/kokkos/core/unit_test/TestViewMapping_b.hpp b/lib/kokkos/core/unit_test/TestViewMapping_b.hpp index ee1c96b423..d0cbfe9e7d 100644 --- a/lib/kokkos/core/unit_test/TestViewMapping_b.hpp +++ b/lib/kokkos/core/unit_test/TestViewMapping_b.hpp @@ -133,11 +133,15 @@ TEST_F( TEST_CATEGORY , view_mapping_atomic ) f.run(); } +} + /*--------------------------------------------------------------------------*/ + namespace Test { -struct ValueType { + +struct MappingClassValueType { KOKKOS_INLINE_FUNCTION - ValueType() + MappingClassValueType() { #if 0 #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA ) @@ -150,7 +154,7 @@ struct ValueType { #endif } KOKKOS_INLINE_FUNCTION - ~ValueType() + ~MappingClassValueType() { #if 0 #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA ) @@ -163,7 +167,6 @@ struct ValueType { #endif } }; -} template< class Space > void test_view_mapping_class_value() @@ -172,7 +175,7 @@ void test_view_mapping_class_value() ExecSpace::fence(); { - Kokkos::View< Test::ValueType, ExecSpace > a( "a" ); + Kokkos::View< MappingClassValueType, ExecSpace > a( "a" ); ExecSpace::fence(); } ExecSpace::fence(); @@ -184,3 +187,74 @@ TEST_F( TEST_CATEGORY , view_mapping_class_value ) } } + +/*--------------------------------------------------------------------------*/ + +namespace Test { + +TEST_F( TEST_CATEGORY , view_mapping_assignable ) +{ + typedef TEST_EXECSPACE exec_space ; + + { // Assignment of rank-0 Left = Right + typedef Kokkos::ViewTraits dst_traits ; + typedef Kokkos::ViewTraits src_traits ; + typedef Kokkos::Impl::ViewMapping mapping ; + static_assert( mapping::is_assignable , "" ); + + Kokkos::View src ; + Kokkos::View dst( src ); + dst = src ; + } + + { // Assignment of rank-0 Right = Left + typedef Kokkos::ViewTraits dst_traits ; + typedef Kokkos::ViewTraits src_traits ; + typedef Kokkos::Impl::ViewMapping mapping ; + static_assert( mapping::is_assignable , "" ); + + Kokkos::View src ; + Kokkos::View dst( src ); + dst = src ; + } + + { // Assignment of rank-1 Left = Right + typedef Kokkos::ViewTraits dst_traits ; + typedef Kokkos::ViewTraits src_traits ; + typedef Kokkos::Impl::ViewMapping mapping ; + static_assert( mapping::is_assignable , "" ); + + Kokkos::View src ; + Kokkos::View dst( src ); + dst = src ; + } + + { // Assignment of rank-1 Right = Left + typedef Kokkos::ViewTraits dst_traits ; + typedef Kokkos::ViewTraits src_traits ; + typedef Kokkos::Impl::ViewMapping mapping ; + static_assert( mapping::is_assignable , "" ); + + Kokkos::View src ; + Kokkos::View dst( src ); + dst = src ; + } + + { // Assignment of rank-2 Left = Right + typedef Kokkos::ViewTraits dst_traits ; + typedef Kokkos::ViewTraits src_traits ; + typedef Kokkos::Impl::ViewMapping mapping ; + static_assert( ! mapping::is_assignable , "" ); + } + + { // Assignment of rank-2 Right = Left + typedef Kokkos::ViewTraits dst_traits ; + typedef Kokkos::ViewTraits src_traits ; + typedef Kokkos::Impl::ViewMapping mapping ; + static_assert( ! mapping::is_assignable , "" ); + } + +} + +} + diff --git a/lib/kokkos/core/unit_test/TestViewMapping_subview.hpp b/lib/kokkos/core/unit_test/TestViewMapping_subview.hpp index 219a4d1f20..d6db548665 100644 --- a/lib/kokkos/core/unit_test/TestViewMapping_subview.hpp +++ b/lib/kokkos/core/unit_test/TestViewMapping_subview.hpp @@ -79,14 +79,18 @@ struct TestViewMappingSubview typedef Kokkos::View< int***[13][14], Kokkos::LayoutLeft, ExecSpace > DLT; typedef Kokkos::Subview< DLT, range, int, int, int, int > DLS1; + #if !defined(KOKKOS_IMPL_CUDA_VERSION_9_WORKAROUND) static_assert( DLS1::rank == 1 && std::is_same< typename DLS1::array_layout, Kokkos::LayoutLeft >::value , "Subview layout error for rank 1 subview of left-most range of LayoutLeft" ); + #endif typedef Kokkos::View< int***[13][14], Kokkos::LayoutRight, ExecSpace > DRT; typedef Kokkos::Subview< DRT, int, int, int, int, range > DRS1; + #if !defined(KOKKOS_IMPL_CUDA_VERSION_9_WORKAROUND) static_assert( DRS1::rank == 1 && std::is_same< typename DRS1::array_layout, Kokkos::LayoutRight >::value , "Subview layout error for rank 1 subview of right-most range of LayoutRight" ); + #endif AT Aa; AS Ab; diff --git a/lib/kokkos/core/unit_test/TestViewSubview.hpp b/lib/kokkos/core/unit_test/TestViewSubview.hpp index e3a12e684e..e4ea090e80 100644 --- a/lib/kokkos/core/unit_test/TestViewSubview.hpp +++ b/lib/kokkos/core/unit_test/TestViewSubview.hpp @@ -915,134 +915,134 @@ void test_3d_subview_5d_impl_layout() { inline void test_subview_legal_args_right() { - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::pair, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::pair, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutRight, Kokkos::LayoutRight, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); } inline void test_subview_legal_args_left() { - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair, int, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, int, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, int, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::pair, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::pair, int, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::pair, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::pair, int >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t, int >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::Impl::ALL_t, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::Impl::ALL_t, int, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, Kokkos::pair, Kokkos::pair, int, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 5, 0, int, int, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); - ASSERT_EQ( 1, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); - ASSERT_EQ( 0, ( Kokkos::Experimental::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::pair >::value ) ); + ASSERT_EQ( 1, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::Impl::ALL_t, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::Impl::ALL_t, Kokkos::pair, Kokkos::pair >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::Impl::ALL_t >::value ) ); + ASSERT_EQ( 0, ( Kokkos::Impl::SubviewLegalArgsCompileTime< Kokkos::LayoutLeft, Kokkos::LayoutLeft, 3, 3, 0, Kokkos::pair, Kokkos::pair, Kokkos::pair >::value ) ); } } // namespace Impl @@ -1294,5 +1294,41 @@ void test_layoutright_to_layoutright() { } } +//---------------------------------------------------------------------------- + +template< class Space > +struct TestUnmanagedSubviewReset +{ + Kokkos::View a ; + + KOKKOS_INLINE_FUNCTION + void operator()( int ) const noexcept + { + auto sub_a = Kokkos::subview(a,0,Kokkos::ALL,Kokkos::ALL,Kokkos::ALL); + + for ( int i = 0 ; i < int(a.dimension(0)) ; ++i ) { + sub_a.assign_data( & a(i,0,0,0) ); + if ( & sub_a(1,1,1) != & a(i,1,1,1) ) { + Kokkos::abort("TestUnmanagedSubviewReset"); + } + } + } + + TestUnmanagedSubviewReset() + : a( Kokkos::view_alloc() , 20 , 10 , 5 , 2 ) + {} +}; + +template< class Space > +void test_unmanaged_subview_reset() +{ + Kokkos::parallel_for + ( Kokkos::RangePolicy< typename Space::execution_space >(0,1) + , TestUnmanagedSubviewReset() + ); +} + } // namespace TestViewSubview + #endif + diff --git a/lib/kokkos/core/unit_test/TestWorkGraph.hpp b/lib/kokkos/core/unit_test/TestWorkGraph.hpp new file mode 100644 index 0000000000..37483a5460 --- /dev/null +++ b/lib/kokkos/core/unit_test/TestWorkGraph.hpp @@ -0,0 +1,171 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +#include + +namespace Test { + +namespace { + +/* This test is meant to be the WorkGraph equivalent of the Task DAG Scheduler test, + please see TestTaskScheduler.hpp for that test. + The algorithm computes the N-th fibonacci number as follows: + - Each "task" or "work item" computes the i-th fibonacci number + - If a task as (i < 2), it will record the known answer ahead of time. + - If a taks has (i >= 2), it will "spawn" two more tasks to compute + the (i - 1) and (i - 2) fibonacci numbers. + We do NOT do any de-duplication of these tasks. + De-duplication would result in only (N - 2) tasks which must be run in serial. + We allow duplicates both to increase the number of tasks and to increase the + amount of available parallelism. + */ + +template< class ExecSpace > +struct TestWorkGraph { + + using MemorySpace = typename ExecSpace::memory_space; + using Policy = Kokkos::WorkGraphPolicy; + using Graph = typename Policy::graph_type; + using RowMap = typename Graph::row_map_type; + using Entries = typename Graph::entries_type; + using Values = Kokkos::View; + + long m_input; + Graph m_graph; + Graph m_transpose; + Values m_values; + + TestWorkGraph(long arg_input):m_input(arg_input) { + form_graph(); + transpose_crs(m_transpose, m_graph); + } + + inline + long full_fibonacci( long n ) { + constexpr long mask = 0x03; + long fib[4] = { 0, 1, 1, 2 }; + for ( long i = 2; i <= n; ++i ) { + fib[ i & mask ] = fib[ ( i - 1 ) & mask ] + fib[ ( i - 2 ) & mask ]; + } + return fib[ n & mask ]; + } + + struct HostEntry { + long input; + std::int32_t parent; + }; + std::vector form_host_graph() { + std::vector g; + g.push_back({ m_input , -1 }); + for (std::int32_t i = 0; i < std::int32_t(g.size()); ++i) { + auto e = g.at(std::size_t(i)); + if (e.input < 2) continue; + /* This part of the host graph formation is the equivalent of task spawning + in the Task DAG system. Notice how each task which is not a base case + spawns two more tasks, without any de-duplication */ + g.push_back({ e.input - 1, i }); + g.push_back({ e.input - 2, i }); + } + return g; + } + + void form_graph() { + auto hg = form_host_graph(); + m_graph.row_map = RowMap("row_map", hg.size() + 1); // row map always has one more + m_graph.entries = Entries("entries", hg.size() - 1); // all but the first have a parent + m_values = Values("values", hg.size()); + //printf("%zu work items\n", hg.size()); + auto h_row_map = Kokkos::create_mirror_view(m_graph.row_map); + auto h_entries = Kokkos::create_mirror_view(m_graph.entries); + auto h_values = Kokkos::create_mirror_view(m_values); + h_row_map(0) = 0; + for (std::int32_t i = 0; i < std::int32_t(hg.size()); ++i) { + auto& e = hg.at(std::size_t(i)); + h_row_map(i + 1) = i; + if (e.input < 2) { + h_values(i) = e.input; + } + if (e.parent == -1) continue; + h_entries(i - 1) = e.parent; + } + Kokkos::deep_copy(m_graph.row_map, h_row_map); + Kokkos::deep_copy(m_graph.entries, h_entries); + Kokkos::deep_copy(m_values, h_values); + } + + KOKKOS_INLINE_FUNCTION + void operator()(std::int32_t i) const { + auto begin = m_transpose.row_map(i); + auto end = m_transpose.row_map(i + 1); + for (auto j = begin; j < end; ++j) { + auto k = m_transpose.entries(j); + m_values(i) += m_values( k ); + } + } + + void test_for() { + Kokkos::parallel_for(Policy(m_graph), *this); + auto h_values = Kokkos::create_mirror_view(m_values); + Kokkos::deep_copy(h_values, m_values); + ASSERT_EQ( h_values(0), full_fibonacci(m_input) ); + } + +}; + +} // anonymous namespace + +TEST_F( TEST_CATEGORY, workgraph_fib ) +{ + int limit = 27; + for ( int i = 0; i < limit; ++i) { + TestWorkGraph< TEST_EXECSPACE > f(i); + f.test_for(); + } + //TestWorkGraph< TEST_EXECSPACE > f(2); + //f.test_for(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/UnitTestConfig.make b/lib/kokkos/core/unit_test/UnitTestConfig.make new file mode 100644 index 0000000000..97f4af5a8b --- /dev/null +++ b/lib/kokkos/core/unit_test/UnitTestConfig.make @@ -0,0 +1,52 @@ +KOKKOS_PATH = ../.. + +# See $(KOKKOS_PATH)/Makefile.kokkos and $(KOKKOS_PATH)/generate_makefile.bash +KOKKOS_ARCH_OPTIONS="None AMDAVX ARMv80 ARMv81 ARMv8-ThunderX \ + BGQ Power7 Power8 Power9 \ + WSM SNB HSW BDW SKX KNC KNL \ + Kepler Kepler30 Kepler32 Kepler35 Kepler37 \ + Maxwell Maxwell50 Maxwell52 Maxwell53 Pascal60 Pascal61" +#KOKKOS_ARCH_OPTIONS="AMDAVX" + +KOKKOS_DEVICE_OPTIONS="Cuda ROCm OpenMP Pthread Serial Qthreads" +#KOKKOS_DEVICE_OPTIONS="Cuda" + +# Configure paths to enable environment query in Makefile.kokkos to work +ROCM_HCC_PATH="config" +CXX="./config/cxx" +ipath=env CXX=$(CXX) env PATH=./config:$$PATH env ROCM_HCC_PATH=$(ROCM_HCC_PATH) + +# Defined in core/src/Makefile -- this should be consistent +KOKKOS_MAKEFILE=Makefile.kokkos +KOKKOS_CMAKEFILE=kokkos_generated_settings.cmake + +# Defined in Makefile.kokkos -- this should be consistent +KOKKOS_INTERNAL_CONFIG_TMP=KokkosCore_config.tmp +KOKKOS_CONFIG_HEADER=KokkosCore_config.h + +d='\#' + +# diff => 0 is no difference. if => 0 is false +testmake=if test "`testmake.sh $1 $2 $3`" = 'Passed'; then echo OK $d $1; else echo not OK $d $1; fi +testconf=if test "`diffconfig.sh $1`" = 'Passed'; then echo OK $d $1; else echo not OK $d $1; fi + +# testing tmp and cmakefile files is unnecessary here +test: + @for karch in "$(KOKKOS_ARCH_OPTIONS)"; do \ + for device in "$(KOKKOS_DEVICE_OPTIONS)"; do \ + $(ipath) KOKKOS_DEVICES=$$device KOKKOS_ARCH=$$karch make -e -f ../src/Makefile build-makefile-cmake-kokkos; \ + rm -f $(KOKKOS_INTERNAL_CONFIG_TMP) $(KOKKOS_CMAKEFILE); \ + prfx="$$karch"_"$$device"_; \ + newmake="$$prfx"$(KOKKOS_MAKEFILE); \ + newconf="$$prfx"$(KOKKOS_CONFIG_HEADER); \ + mv $(KOKKOS_MAKEFILE) config/tmpstore/$$newmake; \ + mv $(KOKKOS_CONFIG_HEADER) config/tmpstore/$$newconf; \ + $(call testmake,$$newmake,$$karch,$$device); \ + $(call testconf,$$newconf); \ + done; \ + done + +test-cmake: + @cd config/cmaketest; \ + cmake . ; \ + make test diff --git a/lib/kokkos/core/unit_test/UnitTestMain.cpp b/lib/kokkos/core/unit_test/UnitTestMain.cpp index 4f52fc9567..a7dc7c4973 100644 --- a/lib/kokkos/core/unit_test/UnitTestMain.cpp +++ b/lib/kokkos/core/unit_test/UnitTestMain.cpp @@ -42,6 +42,7 @@ */ #include +#include int main( int argc, char *argv[] ) { ::testing::InitGoogleTest( &argc, argv ); diff --git a/lib/kokkos/core/unit_test/UnitTestMainInit.cpp b/lib/kokkos/core/unit_test/UnitTestMainInit.cpp index 21f851274b..62a01e9033 100644 --- a/lib/kokkos/core/unit_test/UnitTestMainInit.cpp +++ b/lib/kokkos/core/unit_test/UnitTestMainInit.cpp @@ -42,6 +42,8 @@ */ #include +#include + #include int main( int argc, char *argv[] ) { diff --git a/lib/kokkos/core/unit_test/config/bin/hcc-config b/lib/kokkos/core/unit_test/config/bin/hcc-config new file mode 100755 index 0000000000..fc09138bcc --- /dev/null +++ b/lib/kokkos/core/unit_test/config/bin/hcc-config @@ -0,0 +1,2 @@ +#!/bin/sh +echo "--foo --bar" diff --git a/lib/kokkos/core/unit_test/config/clang b/lib/kokkos/core/unit_test/config/clang new file mode 100755 index 0000000000..34c6919410 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/clang @@ -0,0 +1,5 @@ +#!/bin/sh +echo="Apple LLVM version 8.1.0 (clang-802.0.42)" +echo="Target: x86_64-apple-darwin16.7.0" +echo="Thread model: posix" +echo="InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin" diff --git a/lib/kokkos/core/unit_test/config/cmaketest/CMakeLists.txt b/lib/kokkos/core/unit_test/config/cmaketest/CMakeLists.txt new file mode 100644 index 0000000000..54a4c4a74a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/cmaketest/CMakeLists.txt @@ -0,0 +1,80 @@ +cmake_minimum_required(VERSION 3.1 FATAL_ERROR) +project(Kokkos CXX) + +enable_testing() + +# Initialization +get_filename_component(KOKKOS_TESTDIR ${CMAKE_SOURCE_DIR}/../.. REALPATH) +get_filename_component(KOKKOS_SRCDIR ${CMAKE_SOURCE_DIR}/../../../.. REALPATH) +set(KOKKOS_SRC_PATH ${KOKKOS_SRCDIR}) +set(KOKKOS_PATH ${KOKKOS_SRC_PATH}) + +set(CXX ${KOKKOS_TESTDIR}/config/cxx) + +# Defined in core/src/Makefile -- this should be consistent +set(KOKKOS_MAKEFILE Makefile.kokkos) +set(KOKKOS_CMAKEFILE kokkos_generated_settings.cmake) + +# Defined in Makefile.kokkos -- this should be consistent +set(KOKKOS_INTERNAL_CONFIG_TMP KokkosCore_config.tmp) +set(KOKKOS_CONFIG_HEADER KokkosCore_config.h) + +set(KOKKOS_CMAKE_VERBOSE False) +include(${KOKKOS_SRCDIR}/cmake/kokkos_options.cmake) +foreach(KOKKOS_DEV ${KOKKOS_DEVICES_LIST}) +# Do some initialization: Want to turn everything off for testing + string(TOUPPER ${KOKKOS_DEV} KOKKOS_DEVUC) + set(KOKKOS_ENABLE_${KOKKOS_DEVUC} OFF) +endforeach() + + +#TEST set(KOKKOS_HOST_ARCH_LIST ARMv80) +#TEST set(KOKKOS_DEVICES_LIST Cuda) +#set(KOKKOS_HOST_ARCH_LIST AMDAVX) +#set(KOKKOS_DEVICES_LIST Cuda) + +foreach(KOKKOS_HOST_ARCH ${KOKKOS_HOST_ARCH_LIST}) + foreach(KOKKOS_DEV ${KOKKOS_DEVICES_LIST}) + string(TOUPPER ${KOKKOS_DEV} KOKKOS_DEVUC) + set(KOKKOS_ENABLE_${KOKKOS_DEVUC} On) + + set(KOKKOS_CMAKE_VERBOSE True) + include(${KOKKOS_SRCDIR}/cmake/kokkos_options.cmake) + set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} ROCM_HCC_PATH=${KOKKOS_TESTDIR}/config) + + #message(STATUS "${KOKKOS_SETTINGS} make -f ${KOKKOS_SRCDIR}/core/src/Makefile build-makefile-cmake-kokkos") + execute_process( + COMMAND ${KOKKOS_SETTINGS} make -f ${KOKKOS_SRCDIR}/core/src/Makefile build-makefile-cmake-kokkos + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + OUTPUT_FILE ${CMAKE_BINARY_DIR}/core_src_make.out + RESULT_VARIABLE res + ) + #message(STATUS "RESULT ${res}") + + file(REMOVE ${KOKKOS_INTERNAL_CONFIG_TMP} ${KOKKOS_MAKEFILE}) + set(PREFIX "${KOKKOS_HOST_ARCH}_${KOKKOS_DEV}_") + set(NEWCMAKE ${PREFIX}${KOKKOS_CMAKEFILE}) + set(NEWCONFH ${PREFIX}${KOKKOS_CONFIG_HEADER}) + file(RENAME ${KOKKOS_CMAKEFILE} ${NEWCMAKE}) + file(RENAME ${KOKKOS_CONFIG_HEADER} ${NEWCONFH}) + + add_test(NAME ${NEWCMAKE}-test + COMMAND ${KOKKOS_TESTDIR}/testmake.sh ${NEWCMAKE} ${KOKKOS_HOST_ARCH} ${KOKKOS_DEV} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + set_tests_properties(${NEWCMAKE}-test + PROPERTIES PASS_REGULAR_EXPRESSION Passed + TIMEOUT 15 + ) + add_test(NAME ${NEWCONFH}-test + COMMAND ${KOKKOS_TESTDIR}/diffconfig.sh ${NEWCONFH} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + set_tests_properties(${NEWCONFH}-test + PROPERTIES PASS_REGULAR_EXPRESSION Passed + TIMEOUT 15 + ) + set(KOKKOS_ENABLE_${KOKKOS_DEVUC} Off) + + endforeach() +endforeach() diff --git a/lib/kokkos/core/unit_test/config/cxx b/lib/kokkos/core/unit_test/config/cxx new file mode 100755 index 0000000000..f25d7714a5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/cxx @@ -0,0 +1,5 @@ +#!/bin/sh +echo "g++ (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)" +echo "Copyright (C) 2016 Free Software Foundation, Inc." +echo "This is free software; see the source for copying conditions. There is NO" +echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." diff --git a/lib/kokkos/core/unit_test/config/mpic++ b/lib/kokkos/core/unit_test/config/mpic++ new file mode 100755 index 0000000000..f25d7714a5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/mpic++ @@ -0,0 +1,5 @@ +#!/bin/sh +echo "g++ (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)" +echo "Copyright (C) 2016 Free Software Foundation, Inc." +echo "This is free software; see the source for copying conditions. There is NO" +echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." diff --git a/lib/kokkos/core/unit_test/config/nvcc b/lib/kokkos/core/unit_test/config/nvcc new file mode 100755 index 0000000000..b5bcbf234c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/nvcc @@ -0,0 +1,5 @@ +#!/bin/sh +echo "nvcc: NVIDIA (R) Cuda compiler driver" +echo "Copyright (c) 2005-2016 NVIDIA Corporation" +echo "Built on Tue_Jan_10_13:22:03_CST_2017" +echo "Cuda compilation tools, release 8.0, V8.0.61" diff --git a/lib/kokkos/core/unit_test/config/results/AMDAVX_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/AMDAVX_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..1a737a3b2f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/AMDAVX_Cuda_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:09 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/AMDAVX_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/AMDAVX_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..7a704e4185 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/AMDAVX_OpenMP_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:10 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/AMDAVX_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/AMDAVX_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..c478a5c252 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/AMDAVX_Pthread_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:10 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/AMDAVX_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/AMDAVX_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..fb5d214630 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/AMDAVX_Qthreads_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:11 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/AMDAVX_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/AMDAVX_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..7b7e2b8153 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/AMDAVX_ROCm_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:09 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/AMDAVX_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/AMDAVX_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..9930bacc47 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/AMDAVX_Serial_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:11 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..7f172c00e4 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:17 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 +#define KOKKOS_ARCH_ARMV8_THUNDERX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..d25b832ca2 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_OpenMP_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:18 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 +#define KOKKOS_ARCH_ARMV8_THUNDERX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..cd3a603092 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Pthread_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:19 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 +#define KOKKOS_ARCH_ARMV8_THUNDERX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..3865bc4a9a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Qthreads_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:20 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 +#define KOKKOS_ARCH_ARMV8_THUNDERX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..86b9f84585 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_ROCm_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:18 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 +#define KOKKOS_ARCH_ARMV8_THUNDERX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..75ada8c01f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv8-ThunderX_Serial_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:19 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 +#define KOKKOS_ARCH_ARMV8_THUNDERX 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv80_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv80_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..796c0aab65 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv80_Cuda_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:12 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv80_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv80_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..dcf7ff7ea2 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv80_OpenMP_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:13 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv80_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv80_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..298966b6d4 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv80_Pthread_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:14 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv80_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv80_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..7259a9e964 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv80_Qthreads_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:14 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv80_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv80_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..c2b4f146cb --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv80_ROCm_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:12 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv80_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv80_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..fe5fe66445 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv80_Serial_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:14 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV80 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv81_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv81_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..3d02142438 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv81_Cuda_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:15 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV81 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv81_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv81_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..aa194c77be --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv81_OpenMP_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:16 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV81 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv81_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv81_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..6d2dbeeef4 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv81_Pthread_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:16 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV81 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv81_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv81_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..e9fc71ad9b --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv81_Qthreads_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:17 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV81 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv81_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv81_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..28a56596b4 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv81_ROCm_KokkosCore_config.h @@ -0,0 +1,18 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:15 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV81 1 diff --git a/lib/kokkos/core/unit_test/config/results/ARMv81_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/ARMv81_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..1d29fd1390 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/ARMv81_Serial_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:16 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_ARMV81 1 diff --git a/lib/kokkos/core/unit_test/config/results/BDW_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BDW_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..ce2582b23f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BDW_Cuda_KokkosCore_config.h @@ -0,0 +1,24 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:37 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/BDW_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BDW_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..118d1b225f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BDW_OpenMP_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:38 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/BDW_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BDW_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..6d0215baf6 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BDW_Pthread_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:38 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/BDW_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BDW_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..e879e7e1fe --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BDW_Qthreads_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:39 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/BDW_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BDW_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..3f86d055af --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BDW_ROCm_KokkosCore_config.h @@ -0,0 +1,24 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:37 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/BDW_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BDW_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..fba671ab1a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BDW_Serial_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:39 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/BGQ_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BGQ_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..93c74d41e2 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BGQ_Cuda_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:43 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/BGQ_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BGQ_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..533da16028 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BGQ_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:43 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/BGQ_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BGQ_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..9524c94f2b --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BGQ_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:44 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/BGQ_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BGQ_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..60c7ddcdb5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BGQ_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:44 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/BGQ_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BGQ_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..f5bc1f54a9 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BGQ_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:44 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/BGQ_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/BGQ_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..8372c00699 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/BGQ_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:44 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/HSW_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/HSW_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..7bbe9fa84c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/HSW_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:34 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/HSW_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/HSW_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..17f75872f8 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/HSW_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:35 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/HSW_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/HSW_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..5df1be17ad --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/HSW_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:35 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/HSW_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/HSW_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..253dc35bdf --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/HSW_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:36 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/HSW_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/HSW_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..8e04801b86 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/HSW_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:35 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/HSW_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/HSW_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..99f76aff0b --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/HSW_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:36 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX2 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNC_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNC_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..bdc270fd0d --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNC_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:42 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_KNC +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KNC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNC_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNC_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..f9b79f552d --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNC_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:43 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_KNC +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KNC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNC_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNC_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..15d9d01a0a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNC_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:44 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_KNC +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KNC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNC_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNC_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..5f95a83c27 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNC_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:45 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_KNC +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KNC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNC_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNC_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..5991d3065f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNC_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:43 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_KNC +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KNC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNC_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNC_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..3a8ddecf14 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNC_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:44 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_KNC +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KNC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNL_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNL_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..bd7e2ca330 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNL_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:45 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512MIC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNL_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNL_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..0f567f241c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNL_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:46 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512MIC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNL_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNL_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..1cf3f0997a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNL_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:47 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512MIC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNL_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNL_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..6d179d82f8 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNL_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:48 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512MIC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNL_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNL_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..ae2938e34a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNL_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:46 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512MIC 1 diff --git a/lib/kokkos/core/unit_test/config/results/KNL_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/KNL_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..21f6e7e434 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/KNL_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:47 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512MIC 1 diff --git a/lib/kokkos/core/unit_test/config/results/Kepler30_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler30_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..78e9335e24 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler30_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:48 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KEPLER 1 +#define KOKKOS_ARCH_KEPLER30 1 diff --git a/lib/kokkos/core/unit_test/config/results/Kepler30_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler30_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..769d9c8789 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler30_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:49 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler30_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler30_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..2cc728a5e3 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler30_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:49 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler30_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler30_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..410ba5ea15 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler30_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:50 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler30_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler30_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..34867aa91e --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler30_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:48 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler30_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler30_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..54943b244f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler30_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:50 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler32_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler32_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..c7e23d503c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler32_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:50 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KEPLER 1 +#define KOKKOS_ARCH_KEPLER32 1 diff --git a/lib/kokkos/core/unit_test/config/results/Kepler32_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler32_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..fcfbf97ef2 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler32_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:51 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler32_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler32_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..5cea100aa4 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler32_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:52 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler32_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler32_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..f42d0cc5f2 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler32_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:53 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler32_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler32_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..0ae47b6976 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler32_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:51 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler32_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler32_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..0d20b1dc81 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler32_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:52 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler35_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler35_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..f7935927c3 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler35_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:53 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KEPLER 1 +#define KOKKOS_ARCH_KEPLER35 1 diff --git a/lib/kokkos/core/unit_test/config/results/Kepler35_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler35_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..02777df40a --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler35_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:54 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler35_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler35_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..f51f00ce95 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler35_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:55 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler35_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler35_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..429f5e9e28 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler35_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:55 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler35_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler35_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..111bb09340 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler35_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:54 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler35_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler35_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..da61dabb58 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler35_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:55 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler37_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler37_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..c70ce2e04c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler37_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:56 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KEPLER 1 +#define KOKKOS_ARCH_KEPLER37 1 diff --git a/lib/kokkos/core/unit_test/config/results/Kepler37_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler37_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..d8c6c74832 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler37_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:57 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler37_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler37_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..b832ef36e5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler37_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:58 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler37_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler37_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..2b8a7f8183 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler37_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:59 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler37_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler37_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..6a661f8842 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler37_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:57 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler37_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler37_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..469f3d96a7 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler37_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:58 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..1ccf1bef54 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:50 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_KEPLER 1 +#define KOKKOS_ARCH_KEPLER35 1 diff --git a/lib/kokkos/core/unit_test/config/results/Kepler_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..9d87c958a2 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:51 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..263870be9f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:51 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..021d18c002 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:51 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..2826fdfb88 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:52 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Kepler_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Kepler_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..69097e034d --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Kepler_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:52 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell50_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell50_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..fac64e9e98 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell50_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:59 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_MAXWELL 1 +#define KOKKOS_ARCH_MAXWELL50 1 diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell50_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell50_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..3f5b3eea13 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell50_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:00 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell50_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell50_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..b249c88be5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell50_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:01 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell50_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell50_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..be1353365c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell50_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:02 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell50_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell50_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..ce9f67d5be --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell50_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:00 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell50_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell50_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..f8c6be139e --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell50_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:02 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell52_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell52_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..ce28f3e4b7 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell52_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:03 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_MAXWELL 1 +#define KOKKOS_ARCH_MAXWELL52 1 diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell52_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell52_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..35635063a5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell52_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:04 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell52_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell52_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..140740f81f --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell52_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:04 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell52_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell52_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..58a043c6a3 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell52_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:05 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell52_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell52_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..06ff6935ca --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell52_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:03 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell52_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell52_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..eac120d061 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell52_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:05 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell53_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell53_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..ad8344a099 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell53_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:06 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_MAXWELL 1 +#define KOKKOS_ARCH_MAXWELL53 1 diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell53_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell53_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..ab1e801267 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell53_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:06 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell53_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell53_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..0b1e3bf311 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell53_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:07 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell53_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell53_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..96fdbef3dc --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell53_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:08 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell53_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell53_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..82414cf358 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell53_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:06 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell53_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell53_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..b10b80b3bc --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell53_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:07 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..d81a715007 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:20:00 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_MAXWELL 1 +#define KOKKOS_ARCH_MAXWELL50 1 diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..98e93c7b28 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:20:00 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..47a7ccb7a5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:20:00 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..a7f1fd3803 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:20:01 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..c438f4f7d5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:20:01 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Maxwell_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Maxwell_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..d66c569084 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Maxwell_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:20:01 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/None_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/None_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..6bf2755fd0 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/None_Cuda_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:22 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/None_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/None_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..4dd2eed180 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/None_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:23 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/None_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/None_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..1bdd29b6a5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/None_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:23 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/None_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/None_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..6bd8addd97 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/None_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:23 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/None_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/None_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..74b0d7335c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/None_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:24 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/None_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/None_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..a9d0b264b8 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/None_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Tue Sep 26 15:19:23 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal60_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal60_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..8fe1aa698d --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal60_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:08 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_PASCAL 1 +#define KOKKOS_ARCH_PASCAL60 1 diff --git a/lib/kokkos/core/unit_test/config/results/Pascal60_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal60_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..93173f4e11 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal60_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:09 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal60_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal60_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..a05d5729e0 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal60_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:09 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal60_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal60_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..c5a2d1d707 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal60_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:10 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal60_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal60_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..9c04befef5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal60_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:09 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal60_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal60_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..c6038c2965 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal60_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:10 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal61_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal61_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..0de37df960 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal61_Cuda_KokkosCore_config.h @@ -0,0 +1,19 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:11 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_PASCAL 1 +#define KOKKOS_ARCH_PASCAL61 1 diff --git a/lib/kokkos/core/unit_test/config/results/Pascal61_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal61_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..2c392cc0df --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal61_OpenMP_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:12 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal61_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal61_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..f704aa9c81 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal61_Pthread_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:12 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal61_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal61_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..958aac11da --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal61_Qthreads_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:13 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal61_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal61_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..4a4d8cc683 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal61_ROCm_KokkosCore_config.h @@ -0,0 +1,17 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:11 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Pascal61_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Pascal61_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..6fb2cf9e9d --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Pascal61_Serial_KokkosCore_config.h @@ -0,0 +1,16 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:23:12 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ diff --git a/lib/kokkos/core/unit_test/config/results/Power7_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power7_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..a78e1ffc8d --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power7_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:20 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCBE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER7 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power7_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power7_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..bd856b80a5 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power7_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:21 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCBE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER7 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power7_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power7_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..8b3ac2aff9 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power7_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:21 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCBE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER7 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power7_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power7_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..dffa8a3f58 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power7_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:22 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCBE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER7 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power7_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power7_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..e16cfb37bd --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power7_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:20 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCBE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER7 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power7_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power7_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..6831f3ce25 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power7_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:22 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCBE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER7 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power8_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power8_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..1ab0b04c6c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power8_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:23 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER8 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power8_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power8_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..54750405ca --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power8_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:24 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER8 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power8_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power8_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..5d71338d23 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power8_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:24 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER8 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power8_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power8_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..9da90f4f7e --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power8_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:25 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER8 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power8_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power8_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..f3fd70b0cf --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power8_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:24 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER8 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power8_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power8_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..7c0ecc22d3 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power8_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:25 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER8 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power9_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power9_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..47d518f407 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power9_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:26 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER9 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power9_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power9_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..106bf33e44 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power9_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:27 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER9 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power9_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power9_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..108e5eba47 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power9_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:27 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER9 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power9_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power9_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..5c5be2ed3c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power9_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:28 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER9 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power9_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power9_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..8b6a391d95 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power9_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:26 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER9 1 diff --git a/lib/kokkos/core/unit_test/config/results/Power9_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/Power9_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..6f7aefe62e --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/Power9_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:27 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_POWERPCLE +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_POWER9 1 diff --git a/lib/kokkos/core/unit_test/config/results/SKX_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SKX_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..8f4380d992 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SKX_Cuda_KokkosCore_config.h @@ -0,0 +1,24 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:40 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512XEON 1 diff --git a/lib/kokkos/core/unit_test/config/results/SKX_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SKX_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..0a907a2ae1 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SKX_OpenMP_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:40 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512XEON 1 diff --git a/lib/kokkos/core/unit_test/config/results/SKX_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SKX_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..50a95223c9 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SKX_Pthread_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:41 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512XEON 1 diff --git a/lib/kokkos/core/unit_test/config/results/SKX_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SKX_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..2e4b1d61ef --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SKX_Qthreads_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:42 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512XEON 1 diff --git a/lib/kokkos/core/unit_test/config/results/SKX_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SKX_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..12293350a1 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SKX_ROCm_KokkosCore_config.h @@ -0,0 +1,24 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:40 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512XEON 1 diff --git a/lib/kokkos/core/unit_test/config/results/SKX_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SKX_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..4ea457aacf --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SKX_Serial_KokkosCore_config.h @@ -0,0 +1,23 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:41 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_ENABLE_TM +#endif +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX512XEON 1 diff --git a/lib/kokkos/core/unit_test/config/results/SNB_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SNB_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..34c9537834 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SNB_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:31 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/SNB_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SNB_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..f7ed4d720c --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SNB_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:32 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/SNB_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SNB_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..126c29ba77 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SNB_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:33 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/SNB_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SNB_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..2f0216f9c4 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SNB_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:34 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/SNB_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SNB_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..5c68008bea --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SNB_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:32 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/SNB_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/SNB_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..0278d0d079 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/SNB_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:33 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_AVX 1 diff --git a/lib/kokkos/core/unit_test/config/results/WSM_Cuda_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/WSM_Cuda_KokkosCore_config.h new file mode 100644 index 0000000000..97389bb1bf --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/WSM_Cuda_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:28 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_CUDA 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_SSE42 1 diff --git a/lib/kokkos/core/unit_test/config/results/WSM_OpenMP_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/WSM_OpenMP_KokkosCore_config.h new file mode 100644 index 0000000000..dd5648f0c8 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/WSM_OpenMP_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:29 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_OPENMP 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_SSE42 1 diff --git a/lib/kokkos/core/unit_test/config/results/WSM_Pthread_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/WSM_Pthread_KokkosCore_config.h new file mode 100644 index 0000000000..c8a7adbd89 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/WSM_Pthread_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:30 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_PTHREAD 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_SSE42 1 diff --git a/lib/kokkos/core/unit_test/config/results/WSM_Qthreads_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/WSM_Qthreads_KokkosCore_config.h new file mode 100644 index 0000000000..d4a78790e3 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/WSM_Qthreads_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:31 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_QTHREADS 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_SSE42 1 diff --git a/lib/kokkos/core/unit_test/config/results/WSM_ROCm_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/WSM_ROCm_KokkosCore_config.h new file mode 100644 index 0000000000..712b5686f0 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/WSM_ROCm_KokkosCore_config.h @@ -0,0 +1,21 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:29 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_ENABLE_ROCM 1 +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_SSE42 1 diff --git a/lib/kokkos/core/unit_test/config/results/WSM_Serial_KokkosCore_config.h b/lib/kokkos/core/unit_test/config/results/WSM_Serial_KokkosCore_config.h new file mode 100644 index 0000000000..5bac7c2660 --- /dev/null +++ b/lib/kokkos/core/unit_test/config/results/WSM_Serial_KokkosCore_config.h @@ -0,0 +1,20 @@ +/* --------------------------------------------- +Makefile constructed configuration: +Fri Sep 22 17:22:30 MDT 2017 +----------------------------------------------*/ +#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) +#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." +#else +#define KOKKOS_CORE_CONFIG_H +#endif +/* Execution Spaces */ +#define KOKKOS_HAVE_SERIAL 1 +#ifndef __CUDA_ARCH__ +#define KOKKOS_USE_ISA_X86_64 +#endif +/* General Settings */ +#define KOKKOS_HAVE_CXX11 1 +#define KOKKOS_ENABLE_PROFILING +/* Optimization Settings */ +/* Cuda Settings */ +#define KOKKOS_ARCH_SSE42 1 diff --git a/lib/kokkos/core/unit_test/cuda/TestCuda_Crs.cpp b/lib/kokkos/core/unit_test/cuda/TestCuda_Crs.cpp new file mode 100644 index 0000000000..a90e88933e --- /dev/null +++ b/lib/kokkos/core/unit_test/cuda/TestCuda_Crs.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/cuda/TestCuda_Other.cpp b/lib/kokkos/core/unit_test/cuda/TestCuda_Other.cpp index ba06b71192..fa6722615c 100644 --- a/lib/kokkos/core/unit_test/cuda/TestCuda_Other.cpp +++ b/lib/kokkos/core/unit_test/cuda/TestCuda_Other.cpp @@ -48,3 +48,5 @@ #include #include #include + +#include diff --git a/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c13.cpp b/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c13.cpp new file mode 100644 index 0000000000..2c38bb0d91 --- /dev/null +++ b/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c13.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_test_unmanaged_subview_reset ) +{ + TestViewSubview::test_unmanaged_subview_reset< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c_all.cpp b/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c_all.cpp index a2158f06c7..1210307c76 100644 --- a/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c_all.cpp +++ b/lib/kokkos/core/unit_test/cuda/TestCuda_SubView_c_all.cpp @@ -10,3 +10,4 @@ #include #include #include +#include diff --git a/lib/kokkos/core/unit_test/cuda/TestCuda_UniqueToken.cpp b/lib/kokkos/core/unit_test/cuda/TestCuda_UniqueToken.cpp new file mode 100644 index 0000000000..8424ae10d6 --- /dev/null +++ b/lib/kokkos/core/unit_test/cuda/TestCuda_UniqueToken.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/cuda/TestCuda_WorkGraph.cpp b/lib/kokkos/core/unit_test/cuda/TestCuda_WorkGraph.cpp new file mode 100644 index 0000000000..663ca1d560 --- /dev/null +++ b/lib/kokkos/core/unit_test/cuda/TestCuda_WorkGraph.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/default/TestDefaultDeviceTypeResize.cpp b/lib/kokkos/core/unit_test/default/TestDefaultDeviceTypeResize.cpp new file mode 100644 index 0000000000..c02905535b --- /dev/null +++ b/lib/kokkos/core/unit_test/default/TestDefaultDeviceTypeResize.cpp @@ -0,0 +1,57 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include "TestResize.hpp" + +namespace Test { + +TEST( kokkosresize, host_space_access ) +{ + // Test with the default device type. + using TestViewResize::testResize; + typedef Kokkos::View::device_type device_type; + testResize (); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/default/TestDefaultDeviceType_c.cpp b/lib/kokkos/core/unit_test/default/TestDefaultDeviceType_c.cpp index e11996e8f9..4500392b27 100644 --- a/lib/kokkos/core/unit_test/default/TestDefaultDeviceType_c.cpp +++ b/lib/kokkos/core/unit_test/default/TestDefaultDeviceType_c.cpp @@ -46,6 +46,7 @@ #include #if !defined( KOKKOS_ENABLE_CUDA ) || defined( __CUDACC__ ) +#if !defined( KOKKOS_ENABLE_ROCM ) #include #include @@ -60,3 +61,4 @@ TEST_F( defaultdevicetype, reduce_instantiation_c ) } // namespace Test #endif +#endif diff --git a/lib/kokkos/core/unit_test/diffconfig.sh b/lib/kokkos/core/unit_test/diffconfig.sh new file mode 100755 index 0000000000..0c8836ff83 --- /dev/null +++ b/lib/kokkos/core/unit_test/diffconfig.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# CMake and Make tests run in separate directories +# The mapping of ARCH to #define is very complicated +# so diff is used instead of grepping +if test "`basename $PWD`" = "cmaketest"; then + outfile=$1 + resfile=../results/$1 +else + outfile=config/tmpstore/$1 + resfile=config/results/$1 +fi + +diff=`diff $outfile $resfile 2>&1 | grep -e define -e "such file"` +if test -z "$diff"; then + echo Passed +else + echo Failed: $diff +fi diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP.hpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP.hpp index 2f8daf7ad7..c12574a65a 100644 --- a/lib/kokkos/core/unit_test/openmp/TestOpenMP.hpp +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP.hpp @@ -86,25 +86,26 @@ class openmp : public ::testing::Test { protected: static void SetUpTestCase() { - const unsigned numa_count = Kokkos::hwloc::get_available_numa_count(); - const unsigned cores_per_numa = Kokkos::hwloc::get_available_cores_per_numa(); - const unsigned threads_per_core = Kokkos::hwloc::get_available_threads_per_core(); + int threads_count = 0; + #pragma omp parallel + { + #pragma omp atomic + ++threads_count; + } - const unsigned threads_count = std::max( 1u, numa_count ) * - std::max( 2u, ( cores_per_numa * threads_per_core ) / 2 ); + if (threads_count > 3) { + threads_count /= 2; + } Kokkos::OpenMP::initialize( threads_count ); Kokkos::print_configuration( std::cout, true ); + srand( 10231 ); } static void TearDownTestCase() { Kokkos::OpenMP::finalize(); - - omp_set_num_threads( 1 ); - - ASSERT_EQ( 1, omp_get_max_threads() ); } }; diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP_Crs.cpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP_Crs.cpp new file mode 100644 index 0000000000..54b283f539 --- /dev/null +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP_Crs.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP_Other.cpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP_Other.cpp index 5e9535638d..33e7402ce6 100644 --- a/lib/kokkos/core/unit_test/openmp/TestOpenMP_Other.cpp +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP_Other.cpp @@ -48,3 +48,93 @@ #include #include #include + +#include + +#include + +namespace Test { + +TEST_F( openmp, partition_master ) +{ + using Mutex = Kokkos::Experimental::MasterLock; + + Mutex mtx; + int errors = 0; + + auto master = [&errors, &mtx](int partition_id, int num_partitions) { + + const int pool_size = Kokkos::OpenMP::thread_pool_size(); + + { + std::unique_lock lock(mtx); + if ( Kokkos::OpenMP::in_parallel() ) { + ++errors; + } + if ( Kokkos::OpenMP::thread_pool_rank() != 0 ) { + ++errors; + } + } + + { + int local_errors = 0; + Kokkos::parallel_reduce( Kokkos::RangePolicy(0,1000) + , [pool_size]( const int , int & errs ) { + if ( Kokkos::OpenMP::thread_pool_size() != pool_size ) { + ++errs; + } + } + , local_errors + ); + Kokkos::atomic_add( &errors, local_errors ); + } + + Kokkos::Experimental::UniqueToken< Kokkos::OpenMP > token; + + Kokkos::View count( "", token.size() ); + + Kokkos::parallel_for( Kokkos::RangePolicy(0,1000), + [=] ( const int ) { + int i = token.acquire(); + ++count[i]; + token.release(i); + }); + + Kokkos::View sum (""); + Kokkos::parallel_for( Kokkos::RangePolicy(0,token.size()), + [=] ( const int i ) { + Kokkos::atomic_add( sum.data(), count[i] ); + }); + + if (sum() != 1000) { + Kokkos::atomic_add( &errors, 1 ); + } + }; + + master(0,1); + + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master ); + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master, 4, 0 ); + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master, 0, 4 ); + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master, 2, 2 ); + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master, 8, 0 ); + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master, 0, 8 ); + ASSERT_EQ( errors, 0 ); + + Kokkos::OpenMP::partition_master( master, 8, 8 ); + ASSERT_EQ( errors, 0 ); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c13.cpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c13.cpp new file mode 100644 index 0000000000..937bf69f19 --- /dev/null +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c13.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_test_unmanaged_subview_reset ) +{ + TestViewSubview::test_unmanaged_subview_reset< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c_all.cpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c_all.cpp index 399c6e92e4..5bf3626de9 100644 --- a/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c_all.cpp +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP_SubView_c_all.cpp @@ -10,3 +10,4 @@ #include #include #include +#include diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP_UniqueToken.cpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP_UniqueToken.cpp new file mode 100644 index 0000000000..143a6d9910 --- /dev/null +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP_UniqueToken.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/openmp/TestOpenMP_WorkGraph.cpp b/lib/kokkos/core/unit_test/openmp/TestOpenMP_WorkGraph.cpp new file mode 100644 index 0000000000..ec6fa1653c --- /dev/null +++ b/lib/kokkos/core/unit_test/openmp/TestOpenMP_WorkGraph.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c13.cpp b/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c13.cpp new file mode 100644 index 0000000000..54897c922d --- /dev/null +++ b/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c13.cpp @@ -0,0 +1,55 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +namespace Test { + +TEST_F( qthreads, view_test_unmanaged_subview_reset ) +{ +#if 0 + TestViewSubview::test_unmanaged_subview_reset< TEST_EXECSPACE >(); +#endif +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c_all.cpp b/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c_all.cpp index ab984c5f30..d8ea958a5d 100644 --- a/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c_all.cpp +++ b/lib/kokkos/core/unit_test/qthreads/TestQthreads_SubView_c_all.cpp @@ -10,3 +10,4 @@ #include #include #include +#include diff --git a/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_Category.hpp b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_Category.hpp new file mode 100644 index 0000000000..94e778b3bc --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_Category.hpp @@ -0,0 +1,65 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_TEST_THREADS_HPP +#define KOKKOS_TEST_THREADS_HPP + +#include + +namespace Test { + +class rocm_hostpinned : public ::testing::Test { +protected: + static void SetUpTestCase() { + } + + static void TearDownTestCase() { + } +}; + +} // namespace Test + +#define TEST_CATEGORY rocm_hostpinned +#define TEST_EXECSPACE Kokkos::Experimental::ROCmHostPinnedSpace + +#endif diff --git a/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_SharedAlloc.cpp b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_SharedAlloc.cpp new file mode 100644 index 0000000000..2f8f379db0 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_SharedAlloc.cpp @@ -0,0 +1,55 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + + +TEST_F( TEST_CATEGORY, impl_shared_alloc ) +{ + test_shared_alloc< TEST_EXECSPACE, Kokkos::DefaultHostExecutionSpace >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewAPI.cpp b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewAPI.cpp new file mode 100644 index 0000000000..32ecbbb48f --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewAPI.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_a.cpp b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_a.cpp new file mode 100644 index 0000000000..5523fac7fc --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_a.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_b.cpp b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_b.cpp new file mode 100644 index 0000000000..5e29612d72 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_b.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_subview.cpp b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_subview.cpp new file mode 100644 index 0000000000..6a6194b38f --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCmHostPinned_ViewMapping_subview.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_All.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_All.cpp new file mode 100644 index 0000000000..a9c7e51b62 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_All.cpp @@ -0,0 +1,33 @@ +#include "rocm/TestROCm_Init.cpp" + +//#include "rocm/TestROCm_Complex.cpp" +#include "rocm/TestROCm_Reductions.cpp" +//#include "rocm/TestROCm_RangePolicy.cpp" +//#include "rocm/TestROCm_AtomicOperations.cpp" +//#include "rocm/TestROCm_Atomics.cpp" +//#include "rocm/TestROCm_AtomicViews.cpp" +//#include "rocm/TestROCm_Other.cpp" +//#include "rocm/TestROCm_Scan.cpp" +//#include "rocm/TestROCm_SharedAlloc.cpp" +//#include "rocm/TestROCm_SubView_a.cpp" +//#include "rocm/TestROCm_SubView_b.cpp" +//#include "rocm/TestROCm_SubView_c01.cpp" +//#include "rocm/TestROCm_SubView_c02.cpp" +//#include "rocm/TestROCm_SubView_c03.cpp" +//#include "rocm/TestROCm_SubView_c04.cpp" +//#include "rocm/TestROCm_SubView_c05.cpp" +//#include "rocm/TestROCm_SubView_c06.cpp" +//#include "rocm/TestROCm_SubView_c07.cpp" +//#include "rocm/TestROCm_SubView_c08.cpp" +//#include "rocm/TestROCm_SubView_c09.cpp" +//#include "rocm/TestROCm_SubView_c10.cpp" +//#include "rocm/TestROCm_SubView_c11.cpp" +//#include "rocm/TestROCm_SubView_c12.cpp" +//#include "rocm/TestROCm_Team.cpp" +//#include "rocm/TestROCm_TeamReductionScan.cpp" +//#include "rocm/TestROCm_TeamScratch.cpp" +//#include "rocm/TestROCm_ViewAPI_b.cpp" +//#include "rocm/TestROCm_ViewMapping_a.cpp" +//#include "rocm/TestROCm_ViewMapping_b.cpp" +//#include "rocm/TestROCm_ViewMapping_subview.cpp" +//#include "rocm/TestROCm_ViewOfClass.cpp" diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_AtomicOperations.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_AtomicOperations.cpp new file mode 100644 index 0000000000..e6b7a25316 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_AtomicOperations.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_AtomicViews.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_AtomicViews.cpp new file mode 100644 index 0000000000..d5f82826b0 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_AtomicViews.cpp @@ -0,0 +1,47 @@ + +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Atomics.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Atomics.cpp new file mode 100644 index 0000000000..5944830c43 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Atomics.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Category.hpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Category.hpp new file mode 100644 index 0000000000..a34068f533 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Category.hpp @@ -0,0 +1,65 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_TEST_ROCM_HPP +#define KOKKOS_TEST_ROCM_HPP + +#include + +namespace Test { + +class rocm : public ::testing::Test { +protected: + static void SetUpTestCase() { + } + + static void TearDownTestCase() { + } +}; + +} // namespace Test + +#define TEST_CATEGORY rocm +#define TEST_EXECSPACE Kokkos::Experimental::ROCm + +#endif diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Complex.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Complex.cpp new file mode 100644 index 0000000000..2b72cdee88 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Complex.cpp @@ -0,0 +1,47 @@ + +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Init.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Init.cpp new file mode 100644 index 0000000000..dafe9fb529 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Init.cpp @@ -0,0 +1,50 @@ + +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include +#include + + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Other.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Other.cpp new file mode 100644 index 0000000000..3e182dacba --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Other.cpp @@ -0,0 +1,52 @@ + +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include +//include +#include +#include + +#include diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_RangePolicy.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_RangePolicy.cpp new file mode 100644 index 0000000000..ef7dad95a3 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_RangePolicy.cpp @@ -0,0 +1,47 @@ + +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Reductions.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Reductions.cpp new file mode 100644 index 0000000000..33c4d960f8 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Reductions.cpp @@ -0,0 +1,48 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Scan.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Scan.cpp new file mode 100644 index 0000000000..ae0a016af3 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Scan.cpp @@ -0,0 +1,47 @@ + +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SharedAlloc.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SharedAlloc.cpp new file mode 100644 index 0000000000..7a038edf4b --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SharedAlloc.cpp @@ -0,0 +1,55 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + + +TEST_F( TEST_CATEGORY, impl_shared_alloc ) +{ + test_shared_alloc< Kokkos::Experimental::ROCmSpace, Kokkos::DefaultHostExecutionSpace >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Spaces.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Spaces.cpp new file mode 100644 index 0000000000..d44e7afec3 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Spaces.cpp @@ -0,0 +1,196 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +KOKKOS_INLINE_FUNCTION +void test_abort() +{ + Kokkos::abort( "test_abort" ); +} + +KOKKOS_INLINE_FUNCTION +void test_rocm_spaces_int_value( int * ptr ) +{ + if ( *ptr == 42 ) { *ptr = 2 * 42; } +} + +TEST_F( rocm, space_access ) +{ + static_assert( + Kokkos::Impl::MemorySpaceAccess< Kokkos::HostSpace, Kokkos::HostSpace >::assignable, "" ); + + static_assert( + Kokkos::Impl::MemorySpaceAccess< Kokkos::HostSpace, Kokkos::Experimental::ROCmHostPinnedSpace >::assignable, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::HostSpace, Kokkos::Experimental::ROCmSpace >::assignable, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::HostSpace, Kokkos::Experimental::ROCmSpace >::accessible, "" ); + + //-------------------------------------- + + static_assert( + Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmSpace, Kokkos::Experimental::ROCmSpace >::assignable, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmSpace, Kokkos::Experimental::ROCmHostPinnedSpace >::assignable, "" ); + + static_assert( + Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmSpace, Kokkos::Experimental::ROCmHostPinnedSpace >::accessible, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmSpace, Kokkos::HostSpace >::assignable, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmSpace, Kokkos::HostSpace >::accessible, "" ); + + //-------------------------------------- + + static_assert( + Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::Experimental::ROCmHostPinnedSpace >::assignable, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::HostSpace >::assignable, "" ); + + static_assert( + Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::HostSpace >::accessible, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::Experimental::ROCmSpace >::assignable, "" ); + + static_assert( + ! Kokkos::Impl::MemorySpaceAccess< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::Experimental::ROCmSpace >::accessible, "" ); + + //-------------------------------------- + + static_assert( + ! Kokkos::Impl::SpaceAccessibility< Kokkos::Experimental::ROCm, Kokkos::HostSpace >::accessible, "" ); + + static_assert( + Kokkos::Impl::SpaceAccessibility< Kokkos::Experimental::ROCm, Kokkos::Experimental::ROCmSpace >::accessible, "" ); + + static_assert( + Kokkos::Impl::SpaceAccessibility< Kokkos::Experimental::ROCm, Kokkos::Experimental::ROCmHostPinnedSpace >::accessible, "" ); + + static_assert( + ! Kokkos::Impl::SpaceAccessibility< Kokkos::HostSpace, Kokkos::Experimental::ROCmSpace >::accessible, "" ); + + static_assert( + Kokkos::Impl::SpaceAccessibility< Kokkos::HostSpace, Kokkos::Experimental::ROCmHostPinnedSpace >::accessible, "" ); + + static_assert( + std::is_same< Kokkos::Impl::HostMirror< Kokkos::Experimental::ROCmSpace >::Space + , Kokkos::HostSpace >::value, "" ); + + static_assert( + std::is_same< Kokkos::Impl::HostMirror< Kokkos::Experimental::ROCmHostPinnedSpace >::Space + , Kokkos::Experimental::ROCmHostPinnedSpace >::value, "" ); + + static_assert( + Kokkos::Impl::SpaceAccessibility + < Kokkos::Impl::HostMirror< Kokkos::Experimental::ROCm >::Space + , Kokkos::HostSpace + >::accessible, "" ); + + static_assert( + Kokkos::Impl::SpaceAccessibility + < Kokkos::Impl::HostMirror< Kokkos::Experimental::ROCmSpace >::Space + , Kokkos::HostSpace + >::accessible, "" ); + + static_assert( + Kokkos::Impl::SpaceAccessibility + < Kokkos::Impl::HostMirror< Kokkos::Experimental::ROCmHostPinnedSpace >::Space + , Kokkos::HostSpace + >::accessible, "" ); +} + +template< class MemSpace, class ExecSpace > +struct TestViewROCmAccessible { + enum { N = 1000 }; + + using V = Kokkos::View< double*, MemSpace >; + + V m_base; + + struct TagInit {}; + struct TagTest {}; + + KOKKOS_INLINE_FUNCTION + void operator()( const TagInit &, const int i ) const { m_base[i] = i + 1; } + + KOKKOS_INLINE_FUNCTION + void operator()( const TagTest &, const int i, long & error_count ) const + { if ( m_base[i] != i + 1 ) ++error_count; } + + TestViewROCmAccessible() + : m_base( "base", N ) + {} + + static void run() + { + TestViewROCmAccessible self; + Kokkos::parallel_for( Kokkos::RangePolicy< typename MemSpace::execution_space, TagInit >( 0, N ), self ); + MemSpace::execution_space::fence(); + + // Next access is a different execution space, must complete prior kernel. + long error_count = -1; + Kokkos::parallel_reduce( Kokkos::RangePolicy< ExecSpace, TagTest >( 0, N ), self, error_count ); + EXPECT_EQ( error_count, 0 ); + } +}; + +TEST_F( rocm, impl_view_accessible ) +{ + TestViewROCmAccessible< Kokkos::Experimental::ROCmSpace, Kokkos::Experimental::ROCm >::run(); + + TestViewROCmAccessible< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::Experimental::ROCm >::run(); + TestViewROCmAccessible< Kokkos::Experimental::ROCmHostPinnedSpace, Kokkos::HostSpace::execution_space >::run(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_a.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_a.cpp new file mode 100644 index 0000000000..ea39a25b5c --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_a.cpp @@ -0,0 +1,104 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_auto_1d_left ) +{ + TestViewSubview::test_auto_1d< Kokkos::LayoutLeft, TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_auto_1d_right ) +{ + TestViewSubview::test_auto_1d< Kokkos::LayoutRight, TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_auto_1d_stride ) +{ + TestViewSubview::test_auto_1d< Kokkos::LayoutStride, TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_assign_strided ) +{ + TestViewSubview::test_1d_strided_assignment< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_left_0 ) +{ + TestViewSubview::test_left_0< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_left_1 ) +{ + TestViewSubview::test_left_1< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_left_2 ) +{ + TestViewSubview::test_left_2< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_left_3 ) +{ + TestViewSubview::test_left_3< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_right_0 ) +{ + TestViewSubview::test_right_0< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_right_1 ) +{ + TestViewSubview::test_right_1< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, view_subview_right_3 ) +{ + TestViewSubview::test_right_3< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_b.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_b.cpp new file mode 100644 index 0000000000..00a3a341bb --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_b.cpp @@ -0,0 +1,63 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_layoutleft_to_layoutleft ) +{ + TestViewSubview::test_layoutleft_to_layoutleft< TEST_EXECSPACE >(); + TestViewSubview::test_layoutleft_to_layoutleft< TEST_EXECSPACE, Kokkos::MemoryTraits >(); + TestViewSubview::test_layoutleft_to_layoutleft< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +TEST_F( TEST_CATEGORY, view_subview_layoutright_to_layoutright ) +{ + TestViewSubview::test_layoutright_to_layoutright< TEST_EXECSPACE >(); + TestViewSubview::test_layoutright_to_layoutright< TEST_EXECSPACE, Kokkos::MemoryTraits >(); + TestViewSubview::test_layoutright_to_layoutright< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c01.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c01.cpp new file mode 100644 index 0000000000..c17b0722e9 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c01.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_1d_assign ) +{ + TestViewSubview::test_1d_assign< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c02.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c02.cpp new file mode 100644 index 0000000000..e723b43323 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c02.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_1d_assign_atomic ) +{ + TestViewSubview::test_1d_assign< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c03.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c03.cpp new file mode 100644 index 0000000000..b1170a70f5 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c03.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_1d_assign_randomaccess ) +{ + TestViewSubview::test_1d_assign< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c04.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c04.cpp new file mode 100644 index 0000000000..0788a82ba4 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c04.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_2d_from_3d ) +{ + TestViewSubview::test_2d_subview_3d< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c05.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c05.cpp new file mode 100644 index 0000000000..8d075a37c0 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c05.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_2d_from_3d_atomic ) +{ + TestViewSubview::test_2d_subview_3d< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c06.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c06.cpp new file mode 100644 index 0000000000..b9dc782571 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c06.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_2d_from_3d_randomaccess ) +{ + TestViewSubview::test_2d_subview_3d< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c07.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c07.cpp new file mode 100644 index 0000000000..54c46095aa --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c07.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_3d_from_5d_left ) +{ + TestViewSubview::test_3d_subview_5d_left< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c08.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c08.cpp new file mode 100644 index 0000000000..369e16a795 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c08.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_3d_from_5d_left_atomic ) +{ + TestViewSubview::test_3d_subview_5d_left< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c09.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c09.cpp new file mode 100644 index 0000000000..b97926f98e --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c09.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_3d_from_5d_left_randomaccess ) +{ + TestViewSubview::test_3d_subview_5d_left< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c10.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c10.cpp new file mode 100644 index 0000000000..a1d47e0fbd --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c10.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_3d_from_5d_right ) +{ + TestViewSubview::test_3d_subview_5d_right< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c11.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c11.cpp new file mode 100644 index 0000000000..5be70dc22e --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c11.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_3d_from_5d_right_atomic ) +{ + TestViewSubview::test_3d_subview_5d_right< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c12.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c12.cpp new file mode 100644 index 0000000000..8135476662 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_SubView_c12.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_subview_3d_from_5d_right_randomaccess ) +{ + TestViewSubview::test_3d_subview_5d_right< TEST_EXECSPACE, Kokkos::MemoryTraits >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_Team.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_Team.cpp new file mode 100644 index 0000000000..054bbd83c8 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_Team.cpp @@ -0,0 +1,75 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, team_for ) +{ + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_for( 0 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_for( 0 ); + + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_for( 2 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_for( 2 ); + + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_for( 1000 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_for( 1000 ); +} + + +TEST_F( TEST_CATEGORY, team_reduce ) +{ + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_reduce( 0 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_reduce( 0 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_reduce( 2 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_reduce( 2 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_reduce( 1000 ); + TestTeamPolicy< TEST_EXECSPACE, Kokkos::Schedule >::test_reduce( 1000 ); +} +} + +#include + + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_TeamReductionScan.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_TeamReductionScan.cpp new file mode 100644 index 0000000000..ba0eb0e1bd --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_TeamReductionScan.cpp @@ -0,0 +1,82 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +#if !defined(KOKKOS_ROCM_CLANG_WORKAROUND) +TEST_F( TEST_CATEGORY, team_scan ) +{ + TestScanTeam< TEST_EXECSPACE, Kokkos::Schedule >( 0 ); + TestScanTeam< TEST_EXECSPACE, Kokkos::Schedule >( 0 ); + TestScanTeam< TEST_EXECSPACE, Kokkos::Schedule >( 10 ); + TestScanTeam< TEST_EXECSPACE, Kokkos::Schedule >( 10 ); + TestScanTeam< TEST_EXECSPACE, Kokkos::Schedule >( 10000 ); + TestScanTeam< TEST_EXECSPACE, Kokkos::Schedule >( 10000 ); +} +#endif + +TEST_F( TEST_CATEGORY, team_long_reduce ) +{ + TestReduceTeam< long, TEST_EXECSPACE, Kokkos::Schedule >( 0 ); + TestReduceTeam< long, TEST_EXECSPACE, Kokkos::Schedule >( 0 ); + TestReduceTeam< long, TEST_EXECSPACE, Kokkos::Schedule >( 3 ); + TestReduceTeam< long, TEST_EXECSPACE, Kokkos::Schedule >( 3 ); + TestReduceTeam< long, TEST_EXECSPACE, Kokkos::Schedule >( 100000 ); + TestReduceTeam< long, TEST_EXECSPACE, Kokkos::Schedule >( 100000 ); +} + +TEST_F( TEST_CATEGORY, team_double_reduce ) +{ + TestReduceTeam< double, TEST_EXECSPACE, Kokkos::Schedule >( 0 ); + TestReduceTeam< double, TEST_EXECSPACE, Kokkos::Schedule >( 0 ); + TestReduceTeam< double, TEST_EXECSPACE, Kokkos::Schedule >( 3 ); + TestReduceTeam< double, TEST_EXECSPACE, Kokkos::Schedule >( 3 ); + TestReduceTeam< double, TEST_EXECSPACE, Kokkos::Schedule >( 100000 ); + TestReduceTeam< double, TEST_EXECSPACE, Kokkos::Schedule >( 100000 ); +} + +} // namespace Test + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_TeamScratch.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_TeamScratch.cpp new file mode 100644 index 0000000000..351dfee2b5 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_TeamScratch.cpp @@ -0,0 +1,83 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, team_shared_request ) +{ + TestSharedTeam< TEST_EXECSPACE, Kokkos::Schedule >(); + TestSharedTeam< TEST_EXECSPACE, Kokkos::Schedule >(); +} + +TEST_F( TEST_CATEGORY, team_scratch_request ) +{ + TestScratchTeam< TEST_EXECSPACE, Kokkos::Schedule >(); + TestScratchTeam< TEST_EXECSPACE, Kokkos::Schedule >(); +} + +#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA ) +#if !defined(KOKKOS_ENABLE_ROCM) || ( 8000 <= ROCM_VERSION ) +TEST_F( TEST_CATEGORY, team_lambda_shared_request ) +{ + TestLambdaSharedTeam< Kokkos::HostSpace, TEST_EXECSPACE, Kokkos::Schedule >(); + TestLambdaSharedTeam< Kokkos::HostSpace, TEST_EXECSPACE, Kokkos::Schedule >(); +} +#endif +#endif + +TEST_F( TEST_CATEGORY, shmem_size ) +{ + TestShmemSize< TEST_EXECSPACE >(); +} + +TEST_F( TEST_CATEGORY, multi_level_scratch ) +{ + TestMultiLevelScratchTeam< TEST_EXECSPACE, Kokkos::Schedule >(); + TestMultiLevelScratchTeam< TEST_EXECSPACE, Kokkos::Schedule >(); +} + +} // namespace Test + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_ViewAPI_b.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewAPI_b.cpp new file mode 100644 index 0000000000..3e6f559438 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewAPI_b.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_a.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_a.cpp new file mode 100644 index 0000000000..a7b2b9695d --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_a.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_b.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_b.cpp new file mode 100644 index 0000000000..fa5b209f1b --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_b.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_subview.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_subview.cpp new file mode 100644 index 0000000000..0af114c7ea --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewMapping_subview.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/rocm/TestROCm_ViewOfClass.cpp b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewOfClass.cpp new file mode 100644 index 0000000000..f0b95c0e00 --- /dev/null +++ b/lib/kokkos/core/unit_test/rocm/TestROCm_ViewOfClass.cpp @@ -0,0 +1,46 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + diff --git a/lib/kokkos/core/unit_test/serial/TestSerial_Crs.cpp b/lib/kokkos/core/unit_test/serial/TestSerial_Crs.cpp new file mode 100644 index 0000000000..5799ab816c --- /dev/null +++ b/lib/kokkos/core/unit_test/serial/TestSerial_Crs.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/serial/TestSerial_Other.cpp b/lib/kokkos/core/unit_test/serial/TestSerial_Other.cpp index a6a76a03bd..bc39b1e160 100644 --- a/lib/kokkos/core/unit_test/serial/TestSerial_Other.cpp +++ b/lib/kokkos/core/unit_test/serial/TestSerial_Other.cpp @@ -48,3 +48,5 @@ #include #include #include + +#include diff --git a/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c13.cpp b/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c13.cpp new file mode 100644 index 0000000000..b716dc8254 --- /dev/null +++ b/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c13.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_test_unmanaged_subview_reset ) +{ + TestViewSubview::test_unmanaged_subview_reset< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c_all.cpp b/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c_all.cpp index 24dc6b5061..53e8573ea8 100644 --- a/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c_all.cpp +++ b/lib/kokkos/core/unit_test/serial/TestSerial_SubView_c_all.cpp @@ -10,3 +10,4 @@ #include #include #include +#include diff --git a/lib/kokkos/core/unit_test/serial/TestSerial_WorkGraph.cpp b/lib/kokkos/core/unit_test/serial/TestSerial_WorkGraph.cpp new file mode 100644 index 0000000000..de1638de5e --- /dev/null +++ b/lib/kokkos/core/unit_test/serial/TestSerial_WorkGraph.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/testmake.sh b/lib/kokkos/core/unit_test/testmake.sh new file mode 100755 index 0000000000..b5d4e8874d --- /dev/null +++ b/lib/kokkos/core/unit_test/testmake.sh @@ -0,0 +1,18 @@ +#!/bin/bash +if test "`basename $PWD`" = "cmaketest"; then + outfile=$1 +else + outfile=config/tmpstore/$1 +fi + +grep_arch=`grep KOKKOS_ARCH $outfile | grep $2 2>&1` +grep_devs=`grep KOKKOS_DEVICES $outfile | grep $3 2>&1` +if test -n "$grep_arch"; then + if test -n "$grep_devs"; then + echo Passed + else + echo Failed + fi +else + echo Failed +fi diff --git a/lib/kokkos/core/unit_test/threads/TestThreads_Crs.cpp b/lib/kokkos/core/unit_test/threads/TestThreads_Crs.cpp new file mode 100644 index 0000000000..25243273fe --- /dev/null +++ b/lib/kokkos/core/unit_test/threads/TestThreads_Crs.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/core/unit_test/threads/TestThreads_Other.cpp b/lib/kokkos/core/unit_test/threads/TestThreads_Other.cpp index c11155c5c0..160b37a2c8 100644 --- a/lib/kokkos/core/unit_test/threads/TestThreads_Other.cpp +++ b/lib/kokkos/core/unit_test/threads/TestThreads_Other.cpp @@ -48,3 +48,5 @@ #include #include #include + +#include diff --git a/lib/kokkos/core/unit_test/threads/TestThreads_SubView_c13.cpp b/lib/kokkos/core/unit_test/threads/TestThreads_SubView_c13.cpp new file mode 100644 index 0000000000..1f9679d3ae --- /dev/null +++ b/lib/kokkos/core/unit_test/threads/TestThreads_SubView_c13.cpp @@ -0,0 +1,54 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +namespace Test { + +TEST_F( TEST_CATEGORY, view_test_unmanaged_subview_reset ) +{ + TestViewSubview::test_unmanaged_subview_reset< TEST_EXECSPACE >(); +} + +} // namespace Test diff --git a/lib/kokkos/core/unit_test/threads/TestThreads_WorkGraph.cpp b/lib/kokkos/core/unit_test/threads/TestThreads_WorkGraph.cpp new file mode 100644 index 0000000000..6b7dbb26db --- /dev/null +++ b/lib/kokkos/core/unit_test/threads/TestThreads_WorkGraph.cpp @@ -0,0 +1,45 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include diff --git a/lib/kokkos/doc/SAND2017-10464-Kokkos-Task-DAG.pdf b/lib/kokkos/doc/SAND2017-10464-Kokkos-Task-DAG.pdf new file mode 100644 index 0000000000..571ebff401 Binary files /dev/null and b/lib/kokkos/doc/SAND2017-10464-Kokkos-Task-DAG.pdf differ diff --git a/lib/kokkos/doc/develop_builds.md b/lib/kokkos/doc/develop_builds.md new file mode 100644 index 0000000000..9a211fa776 --- /dev/null +++ b/lib/kokkos/doc/develop_builds.md @@ -0,0 +1,76 @@ + +# Places to build options: architecture, device, advanced options, cuda options + +These are the files that need to be updated when a new architecture or device is +added: + + + generate_makefile.bash + * Interface for makefile system + + cmake/kokkos_options.cmake + * Interface for cmake system + + Makefile.kokkos + * Main logic for build (make and cmake) and defines (KokkosCore_config.h) + + core/unit_test/UnitTestConfig.make + * Unit test for Makefile.kokkos + +In general, an architecture is going to be from on of these platforms: + + AMD + + ARM + + IBM + + Intel + + Intel Xeon Phi + + NVIDIA +Although not strictly necessary, it is helpful to keep things organized by +grouping by platform. + +### generate_makefile.sh + +The bash code does not do any error checking on the `--arch=` or `--device=` +arguments thus strictly speaking you do not *need* to do anything to add a +device or architecture; however, you should add it to the help menu. For the +archictectures, please group by one of the platforms listed above. + + +### cmake/kokkos_options.cmake and cmake/kokkos_settings.cmake + +The options for the CMake build system are: `-DKOKKOS_HOST_ARCH:STRING=` and +`-DKOKKOS_ENABLE_:BOOL=`. Although any string can be passed into +KOKKOS_HOST_ARCH option, it is checked against an accepted list. Likewise, the +KOKKOS_ENABLE_ must have the option added AND it is formed using the +list. Thus: + + A new architecture should be added to the KOKKOS_HOST_ARCH_LIST variable. + + A new device should be added to the KOKKOS_DEVICES_LIST variable **AND** a + KOKKOS_ENABLE_ option specified (see KOKKOS_ENABLE_CUDA for + example). + + A new device should be added to the KOKKOS_DEVICES_LIST variable **AND** a + +The translation from option to the `KOKKOS_SETTINGS` is done in +`kokkos_settings.cmake`. This translation is automated for some types if you ad +to the list, but for others, it may need to be hand coded. + + +### Makefile.kokkos + +This is the main coding used by both the make and cmake system for defining +the sources (generated makefile and cmake snippets by `core/src/Makefile`), for +setting the defines in KokkosCore_config.h, and defining various internal +variables. To understand how to add to this file, you should work closely with +the Kokkos development team. + + +### core/unit_test/UnitTestConfig.make + +This file is used to check the build system in a platform-independent way. It +works by looping over available architectures and devices; thus, you should add +your new architecure to KOKKOS_ARCH_OPTIONS and your new device to +KOKKOS_DEVICE_OPTIONS to be tested. The build system tests work by grepping the +generated build files (automatically). The header file tests work by diffing +the generated file with results that are stored in +`core/unit_tests/config/results` (namespaced by ARCH_DEVICE_). Thus, you will +need to add accepted results to this directory for diffing. + +The CMake build system is also tested in `core/unit_tests/config/cmaketest`. +Because it uses cmake/kokkos_options.cmake, it already has the tests to loop +over. It is diffed with the same files that the build system is tested with. +Thus, if you are consistent in all of the files listed, the unit tests should +pass automatically. diff --git a/lib/kokkos/example/cmake/Dependencies.cmake b/lib/kokkos/example/cmake/Dependencies.cmake index ca50a45c11..ed1ec4c725 100644 --- a/lib/kokkos/example/cmake/Dependencies.cmake +++ b/lib/kokkos/example/cmake/Dependencies.cmake @@ -1,4 +1,3 @@ TRIBITS_PACKAGE_DEFINE_DEPENDENCIES( - LIB_REQUIRED_PACKAGES KokkosCore KokkosContainers KokkosAlgorithms TEST_OPTIONAL_TPLS CUSPARSE MKL ) diff --git a/lib/kokkos/example/cmake_build/CMakeLists.txt b/lib/kokkos/example/cmake_build/CMakeLists.txt index 4e149726ee..8e1aa04727 100644 --- a/lib/kokkos/example/cmake_build/CMakeLists.txt +++ b/lib/kokkos/example/cmake_build/CMakeLists.txt @@ -32,13 +32,13 @@ # 4. make cmake_minimum_required(VERSION 3.1) -project(Example CXX C) +project(Example CXX C Fortran) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_EXTENSIONS OFF) list(APPEND CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3) add_subdirectory(${Example_SOURCE_DIR}/../.. ${Example_BINARY_DIR}/kokkos) -add_executable(example cmake_example.cpp) +include_directories(${Kokkos_INCLUDE_DIRS_RET}) + +add_executable(example cmake_example.cpp foo.f) target_link_libraries(example kokkos) diff --git a/lib/kokkos/example/cmake_build/cmake_example.cpp b/lib/kokkos/example/cmake_build/cmake_example.cpp index 4786eeb859..bba4b7bd01 100644 --- a/lib/kokkos/example/cmake_build/cmake_example.cpp +++ b/lib/kokkos/example/cmake_build/cmake_example.cpp @@ -44,6 +44,8 @@ #include #include +extern "C" void print_fortran_(); + int main(int argc, char* argv[]) { Kokkos::initialize(argc, argv); Kokkos::DefaultExecutionSpace::print_configuration(std::cout); @@ -81,6 +83,8 @@ int main(int argc, char* argv[]) { count_time = timer.seconds(); printf("Sequential: %ld %10.6f\n", seq_count, count_time); + print_fortran_(); + Kokkos::finalize(); return (count == seq_count) ? 0 : -1; diff --git a/lib/kokkos/example/cmake_build/foo.f b/lib/kokkos/example/cmake_build/foo.f new file mode 100644 index 0000000000..e618455283 --- /dev/null +++ b/lib/kokkos/example/cmake_build/foo.f @@ -0,0 +1,4 @@ + FUNCTION print_fortran() + PRINT *, 'Hello World from Fortran' + RETURN + END diff --git a/lib/kokkos/example/feint/Makefile b/lib/kokkos/example/feint/Makefile index 9abf51d107..3f68c1c1cc 100644 --- a/lib/kokkos/example/feint/Makefile +++ b/lib/kokkos/example/feint/Makefile @@ -31,6 +31,10 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) OBJ_EXAMPLE_FEINT += feint_cuda.o endif +ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) + OBJ_EXAMPLE_FEINT += feint_rocm.o +endif + ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) OBJ_EXAMPLE_FEINT += feint_threads.o endif diff --git a/lib/kokkos/example/feint/feint_rocm.cpp b/lib/kokkos/example/feint/feint_rocm.cpp new file mode 100644 index 0000000000..2bb9e0ee15 --- /dev/null +++ b/lib/kokkos/example/feint/feint_rocm.cpp @@ -0,0 +1,67 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include + +#if defined( KOKKOS_ENABLE_ROCM ) + +#include + +namespace Kokkos { +namespace Example { + +template void feint( + const unsigned global_elem_nx , + const unsigned global_elem_ny , + const unsigned global_elem_nz ); + +template void feint( + const unsigned global_elem_nx , + const unsigned global_elem_ny , + const unsigned global_elem_nz ); + +} /* namespace Example */ +} /* namespace Kokkos */ + +#endif + diff --git a/lib/kokkos/example/feint/main.cpp b/lib/kokkos/example/feint/main.cpp index 616e584bf6..57a8f8fafb 100644 --- a/lib/kokkos/example/feint/main.cpp +++ b/lib/kokkos/example/feint/main.cpp @@ -69,12 +69,26 @@ int main() #if defined( KOKKOS_ENABLE_OPENMP ) { - // Use 4 cores per NUMA region, unless fewer available - const unsigned use_numa_count = Kokkos::hwloc::get_available_numa_count(); - const unsigned use_cores_per_numa = std::min( 4u , Kokkos::hwloc::get_available_cores_per_numa() ); + int num_threads = 0; + if ( Kokkos::hwloc::available() ) { + // Use 4 cores per NUMA region, unless fewer available + const unsigned use_numa_count = Kokkos::hwloc::get_available_numa_count(); + const unsigned use_cores_per_numa = std::min( 4u , Kokkos::hwloc::get_available_cores_per_numa() ); + num_threads = use_numa_count * use_cores_per_numa; - Kokkos::OpenMP::initialize( use_numa_count * use_cores_per_numa ); + } + else { + #pragma omp parallel + { + #pragma omp atomic + ++num_threads; + } + num_threads = std::max(4, num_threads/4); + } + + + Kokkos::OpenMP::initialize( num_threads ); std::cout << "feint< OpenMP , NotUsingAtomic >" << std::endl ; Kokkos::Example::feint< Kokkos::OpenMP , false >(); diff --git a/lib/kokkos/example/fenl/fenl.cpp b/lib/kokkos/example/fenl/fenl.cpp index 5a6dc7e241..62a614019c 100644 --- a/lib/kokkos/example/fenl/fenl.cpp +++ b/lib/kokkos/example/fenl/fenl.cpp @@ -110,6 +110,27 @@ Perf fenl< Kokkos::Cuda , Kokkos::Example::BoxElemPart::ElemQuadratic >( #endif +#if defined( KOKKOS_ENABLE_ROCM ) + +template +Perf fenl< Kokkos::Experimental::ROCm , Kokkos::Example::BoxElemPart::ElemLinear >( + MPI_Comm comm , + const int use_print , + const int use_trials , + const int use_atomic , + const int global_elems[] ); + + +template +Perf fenl< Kokkos::Experimental::ROCm , Kokkos::Example::BoxElemPart::ElemQuadratic >( + MPI_Comm comm , + const int use_print , + const int use_trials , + const int use_atomic , + const int global_elems[] ); + +#endif + } /* namespace FENL */ } /* namespace Example */ diff --git a/lib/kokkos/example/fenl/main.cpp b/lib/kokkos/example/fenl/main.cpp index 33b0049bc6..0df5a60b89 100644 --- a/lib/kokkos/example/fenl/main.cpp +++ b/lib/kokkos/example/fenl/main.cpp @@ -67,6 +67,7 @@ enum { CMD_USE_THREADS = 0 , CMD_USE_NUMA , CMD_USE_CORE_PER_NUMA , CMD_USE_CUDA + , CMD_USE_ROCM , CMD_USE_OPENMP , CMD_USE_CUDA_DEV , CMD_USE_FIXTURE_X @@ -114,6 +115,9 @@ void print_cmdline( std::ostream & s , const int cmd[] ) if ( cmd[ CMD_USE_CUDA ] ) { s << " CUDA(" << cmd[ CMD_USE_CUDA_DEV ] << ")" ; } + if ( cmd[ CMD_USE_ROCM ] ) { + s << " ROCM" ; + } if ( cmd[ CMD_USE_ATOMIC ] ) { s << " ATOMIC" ; } @@ -167,6 +171,7 @@ void run( MPI_Comm comm , const int cmd[] ) if ( cmd[ CMD_USE_THREADS ] ) { std::cout << "THREADS , " << cmd[ CMD_USE_THREADS ] ; } else if ( cmd[ CMD_USE_OPENMP ] ) { std::cout << "OPENMP , " << cmd[ CMD_USE_OPENMP ] ; } else if ( cmd[ CMD_USE_CUDA ] ) { std::cout << "CUDA" ; } + else if ( cmd[ CMD_USE_ROCM ] ) { std::cout << "ROCM" ; } if ( cmd[ CMD_USE_FIXTURE_QUADRATIC ] ) { std::cout << " , QUADRATIC-ELEMENT" ; } else { std::cout << " , LINEAR-ELEMENT" ; } @@ -288,6 +293,9 @@ int main( int argc , char ** argv ) cmdline[ CMD_USE_CUDA ] = 1 ; cmdline[ CMD_USE_CUDA_DEV ] = atoi( argv[++i] ) ; } + else if ( 0 == strcasecmp( argv[i] , "rocm" ) ) { + cmdline[ CMD_USE_ROCM ] = 1 ; + } else if ( 0 == strcasecmp( argv[i] , "fixture" ) ) { sscanf( argv[++i] , "%dx%dx%d" , cmdline + CMD_USE_FIXTURE_X , @@ -410,6 +418,21 @@ int main( int argc , char ** argv ) Kokkos::HostSpace::execution_space::finalize(); } +#endif + +#if defined( KOKKOS_ENABLE_ROCM ) + if ( cmdline[ CMD_USE_ROCM ] ) { + // Use the last device: + + Kokkos::HostSpace::execution_space::initialize(); + Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice( cmdline[ CMD_USE_ROCM ] ) ); + + run< Kokkos::Experimental::ROCm , Kokkos::Example::BoxElemPart::ElemLinear >( comm , cmdline ); + + Kokkos::Experimental::ROCm::finalize(); + Kokkos::HostSpace::execution_space::finalize(); + } + #endif } diff --git a/lib/kokkos/example/fixture/Main.cpp b/lib/kokkos/example/fixture/Main.cpp index 9b2275ad27..1f17531bd0 100644 --- a/lib/kokkos/example/fixture/Main.cpp +++ b/lib/kokkos/example/fixture/Main.cpp @@ -300,5 +300,16 @@ int main() Kokkos::HostSpace::execution_space::finalize(); } #endif + +#if defined( KOKKOS_ENABLE_ROCM ) + { + std::cout << "test_fixture< ROCm >" << std::endl ; + Kokkos::HostSpace::execution_space::initialize(); + Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice(0) ); + Kokkos::Example::test_fixture< Kokkos::Experimental::ROCm >(); + Kokkos::Experimental::ROCm::finalize(); + Kokkos::HostSpace::execution_space::finalize(); + } +#endif } diff --git a/lib/kokkos/example/fixture/TestFixture.cpp b/lib/kokkos/example/fixture/TestFixture.cpp index 924cc39ce4..d47621b3cd 100644 --- a/lib/kokkos/example/fixture/TestFixture.cpp +++ b/lib/kokkos/example/fixture/TestFixture.cpp @@ -53,6 +53,10 @@ template void test_fixture< Kokkos::HostSpace::execution_space >(); template void test_fixture(); #endif +#if defined( KOKKOS_ENABLE_ROCM ) +template void test_fixture(); +#endif + } /* namespace Example */ } /* namespace Kokkos */ diff --git a/lib/kokkos/example/global_2_local_ids/G2L_Main.cpp b/lib/kokkos/example/global_2_local_ids/G2L_Main.cpp index fb33aef56e..b6b8b2f5e0 100644 --- a/lib/kokkos/example/global_2_local_ids/G2L_Main.cpp +++ b/lib/kokkos/example/global_2_local_ids/G2L_Main.cpp @@ -138,7 +138,16 @@ int main(int argc, char *argv[]) #endif #ifdef KOKKOS_ENABLE_OPENMP - Kokkos::OpenMP::initialize( threads_count ); + int num_threads = 0; + #pragma omp parallel + { + #pragma omp atomic + ++num_threads; + } + if( num_threads > 3 ) { + num_threads = std::max(4, num_threads/4); + } + Kokkos::OpenMP::initialize( num_threads ); num_errors += G2L::run_openmp(num_ids,num_find_iterations); Kokkos::OpenMP::finalize(); #endif diff --git a/lib/kokkos/example/grow_array/main.cpp b/lib/kokkos/example/grow_array/main.cpp index e7438a9bf4..3f1d534d93 100644 --- a/lib/kokkos/example/grow_array/main.cpp +++ b/lib/kokkos/example/grow_array/main.cpp @@ -88,7 +88,7 @@ int main( int argc , char ** argv ) #if defined( KOKKOS_ENABLE_OPENMP ) { std::cout << "Kokkos::OpenMP" << std::endl ; - Kokkos::OpenMP::initialize( num_threads , use_numa , use_core ); + Kokkos::OpenMP::initialize(); Example::grow_array< Kokkos::OpenMP >( length_array , span_values ); Kokkos::OpenMP::finalize(); } diff --git a/lib/kokkos/example/tutorial/01_hello_world/Makefile b/lib/kokkos/example/tutorial/01_hello_world/Makefile index 62ab22f17e..02a0fb10a0 100644 --- a/lib/kokkos/example/tutorial/01_hello_world/Makefile +++ b/lib/kokkos/example/tutorial/01_hello_world/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_hello_world.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,7 +18,7 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_hello_world.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" @@ -37,7 +37,7 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean rm -f *.o *.cuda *.host diff --git a/lib/kokkos/example/tutorial/01_hello_world_lambda/Makefile b/lib/kokkos/example/tutorial/01_hello_world_lambda/Makefile index 52d5fb07c4..4fe3765c52 100644 --- a/lib/kokkos/example/tutorial/01_hello_world_lambda/Makefile +++ b/lib/kokkos/example/tutorial/01_hello_world_lambda/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_hello_world_lambda.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -19,7 +19,7 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_hello_world_lambda.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" @@ -38,7 +38,7 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean rm -f *.o *.cuda *.host diff --git a/lib/kokkos/example/tutorial/02_simple_reduce/Makefile b/lib/kokkos/example/tutorial/02_simple_reduce/Makefile index d102af5151..bda28fbac0 100644 --- a/lib/kokkos/example/tutorial/02_simple_reduce/Makefile +++ b/lib/kokkos/example/tutorial/02_simple_reduce/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_simple_reduce.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,20 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_simple_reduce.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 02_simple_reduce.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif DEPFLAGS = -M @@ -37,10 +46,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/02_simple_reduce_lambda/Makefile b/lib/kokkos/example/tutorial/02_simple_reduce_lambda/Makefile index 4545668b77..a9542c6a43 100644 --- a/lib/kokkos/example/tutorial/02_simple_reduce_lambda/Makefile +++ b/lib/kokkos/example/tutorial/02_simple_reduce_lambda/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_simple_reduce_lambda.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -19,11 +19,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_simple_reduce_lambda.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 02_simple_reduce_lambda.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -38,10 +48,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/03_simple_view/Makefile b/lib/kokkos/example/tutorial/03_simple_view/Makefile index e716b765e7..de994a8df9 100644 --- a/lib/kokkos/example/tutorial/03_simple_view/Makefile +++ b/lib/kokkos/example/tutorial/03_simple_view/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_simple_view.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_simple_view.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 03_simple_view.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -33,14 +43,15 @@ include $(KOKKOS_PATH)/Makefile.kokkos build: $(EXE) +#for unit testing only, for best preformance with OpenMP 4.0 or better test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/03_simple_view_lambda/Makefile b/lib/kokkos/example/tutorial/03_simple_view_lambda/Makefile index b93c14910e..81910a4571 100644 --- a/lib/kokkos/example/tutorial/03_simple_view_lambda/Makefile +++ b/lib/kokkos/example/tutorial/03_simple_view_lambda/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_simple_view_lambda.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -19,11 +19,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_simple_view_lambda.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 03_simple_view_lambda.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -38,10 +48,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/04_simple_memoryspaces/Makefile b/lib/kokkos/example/tutorial/04_simple_memoryspaces/Makefile index 8dd7598f03..0e84ac9c68 100644 --- a/lib/kokkos/example/tutorial/04_simple_memoryspaces/Makefile +++ b/lib/kokkos/example/tutorial/04_simple_memoryspaces/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 04_simple_memoryspaces.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 04_simple_memoryspaces.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 04_simple_memoryspaces.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/05_simple_atomics/Makefile b/lib/kokkos/example/tutorial/05_simple_atomics/Makefile index d297d45576..67fbd90c55 100644 --- a/lib/kokkos/example/tutorial/05_simple_atomics/Makefile +++ b/lib/kokkos/example/tutorial/05_simple_atomics/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 05_simple_atomics.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 05_simple_atomics.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 05_simple_atomics.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/CMakeLists.txt b/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/CMakeLists.txt new file mode 100644 index 0000000000..d18938a61f --- /dev/null +++ b/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/CMakeLists.txt @@ -0,0 +1,10 @@ + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +# This is a tutorial, not a test, so we don't ask CTest to run it. +TRIBITS_ADD_EXECUTABLE( + tutorial_06_simple_mdrangepolicy + SOURCES simple_mdrangepolicy.cpp + COMM serial mpi + ) diff --git a/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/Makefile b/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/Makefile new file mode 100644 index 0000000000..7d3498ed17 --- /dev/null +++ b/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/Makefile @@ -0,0 +1,48 @@ +KOKKOS_PATH = ../../.. +KOKKOS_SRC_PATH = ${KOKKOS_PATH} +SRC = $(wildcard ${KOKKOS_SRC_PATH}/example/tutorial/06_simple_mdrangepolicy/*.cpp) +vpath %.cpp $(sort $(dir $(SRC))) + +default: build + echo "Start Build" + +ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) +CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 06_simple_mdrangepolicy.cuda +KOKKOS_DEVICES = "Cuda,OpenMP" +KOKKOS_ARCH = "SNB,Kepler35" +else +CXX = g++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 06_simple_mdrangepolicy.host +KOKKOS_DEVICES = "OpenMP" +KOKKOS_ARCH = "SNB" +endif + +DEPFLAGS = -M + +OBJ = $(notdir $(SRC:.cpp=.o)) +LIB = + +include $(KOKKOS_PATH)/Makefile.kokkos + +build: $(EXE) + +test: $(EXE) + ./$(EXE) + +$(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + +clean: kokkos-clean + rm -f *.o *.cuda *.host + +# Compilation rules + +%.o:%.cpp $(KOKKOS_CPP_DEPENDS) + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< -o $(notdir $@) diff --git a/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/simple_mdrangepolicy.cpp b/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/simple_mdrangepolicy.cpp new file mode 100644 index 0000000000..3712d6c5e2 --- /dev/null +++ b/lib/kokkos/example/tutorial/06_simple_mdrangepolicy/simple_mdrangepolicy.cpp @@ -0,0 +1,201 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +// +// MDRangePolicy example with parallel_for and parallel_reduce: +// 1. Start up Kokkos +// 2. Execute a parallel_for loop in the default execution space, +// using a functor to define the loop body +// 3. Shut down Kokkos +// +// Two examples are provided: +// Example 1: Rank 2 case with minimal default parameters and arguments used +// in the MDRangePolicy +// +// Example 2: Rank 3 case with additional outer/inner iterate pattern parameters +// and tile dims passed to the ctor + + +// Simple functor for computing/storing the product of indices in a View v +template < class ViewType > +struct MDFunctor { + + typedef long value_type; + + ViewType v; + size_t size; + + MDFunctor( const ViewType & v_, const size_t size_ ) + : v(v_), size(size_) {} + + // 2D case - used by parallel_for + KOKKOS_INLINE_FUNCTION + void operator () (const int i, const int j) const { + v(i,j) = i*j; // compute the product of indices + } + + // 3D case - used by parallel_for + KOKKOS_INLINE_FUNCTION + void operator () (const int i, const int j, const int k) const { + v(i,j,k) = i*j*k; // compute the product of indices + } + + // 2D case - reduction + KOKKOS_INLINE_FUNCTION + void operator () (const int i, const int j, value_type & incorrect_count) const { + if ( v(i,j) != i*j ) { + incorrect_count += 1; + } + } + + // 3D case - reduction + KOKKOS_INLINE_FUNCTION + void operator () (const int i, const int j, const int k, value_type & incorrect_count) const { + if ( v(i,j,k) != i*j*k ) { + incorrect_count += 1; + } + } + +}; + +int main (int argc, char* argv[]) { + Kokkos::initialize (argc, argv); + + // Bound(s) for MDRangePolicy + const int n = 100; + + // ViewType typedefs for Rank<2>, Rank<3> for example usage + typedef double ScalarType; + typedef typename Kokkos::View ViewType_2D; + typedef typename Kokkos::View ViewType_3D; + + ///////////////////////////////////////////////////////////////////////////// + // Explanation of MDRangePolicy usage, template parameters, constructor arguments + // + // MDRangePolicy typedefs for Rank<2>, Rank<3> cases + // Required template parameters: + // Kokkos::Rank: where N=rank + // + // Optional template parameters to Rank<...>: + // Kokkos::Iterate::{Default,Left,Right}: Outer iteration pattern across tiles; + // defaults based on the execution space similar to Kokkos::Layout + // Kokkos::Iterate::{Default,Left,Right}: Inner iteration pattern within tiles; + // defaults based on the execution space similar to Kokkos::Layout + // + // e.g. typedef Rank<2, Iterate::Left, Iterate::Left> rank2ll; + // + // + // Optional template parameters to MDRangePolicy: + // ExecutionSpace: Kokkos::Serial, Kokkos::OpenMP, Kokkos::Cuda, etc. + // + // Kokkos::IndexType< T >: where T = int, long, unsigned int, etc. + // + // struct Tag{}: A user-provided tag for tagging functor operators + // + // e.g. 1: MDRangePolicy< Kokkos::Serial, Rank<2, Iterate::Left, Iterate::Left>, IndexType, Tag > mdpolicy; + // e.g. 2: MDRangePolicy< Kokkos::Serial, rank2ll, IndexType, Tag > mdpolicy; + // + // + // Required arguments to ctor: + // {{ l0, l1, ... }}: Lower bounds, provided as Kokkos::Array or std::initializer_list + // {{ u0, u1, ... }}: Upper bounds, provided as Kokkos::Array or std::initializer_list + // + // Optional arguments to ctor: + // {{ t0, t1, ... }}: Tile dimensions, provided as Kokkos::Array or std::initializer_list + // defaults based on the execution space + // + // e.g. mdpolicy( {{0,0}}, {{u0,u1}}, {{t0,t1}}; + // + ///////////////////////////////////////////////////////////////////////////// + + // Example 1: + long incorrect_count_2d = 0; + { + // Rank<2> Case: Rank is provided, all other parameters are default + typedef typename Kokkos::Experimental::MDRangePolicy< Kokkos::Experimental::Rank<2> > MDPolicyType_2D; + + // Construct 2D MDRangePolicy: lower and upper bounds provided, tile dims defaulted + MDPolicyType_2D mdpolicy_2d( {{0,0}}, {{n,n}} ); + + // Construct a 2D view to store result of product of indices + ViewType_2D v2("v2", n, n); + + // Execute parallel_for with rank 2 MDRangePolicy + Kokkos::parallel_for( "md2d", mdpolicy_2d, MDFunctor(v2, n) ); + + // Check results with a parallel_reduce using the MDRangePolicy + Kokkos::parallel_reduce( "md2dredux", mdpolicy_2d, MDFunctor(v2, n), incorrect_count_2d ); + + printf("Rank 2 MDRangePolicy incorrect count: %ld\n", incorrect_count_2d); // should be 0 + } + + + // Example 2: + long incorrect_count_3d = 0; + { + // Rank<3> Case: Rank, inner iterate pattern, outer iterate pattern provided + typedef typename Kokkos::Experimental::MDRangePolicy< Kokkos::Experimental::Rank<3, Kokkos::Experimental::Iterate::Left, Kokkos::Experimental::Iterate::Left> > MDPolicyType_3D; + + // Construct 3D MDRangePolicy: lower, upper bounds, tile dims provided + MDPolicyType_3D mdpolicy_3d( {{0,0,0}}, {{n,n,n}}, {{4,4,4}} ); + + // Construct a 3D view to store result of product of indices + ViewType_3D v3("v3", n, n, n); + + // Execute parallel_for with rank 3 MDRangePolicy + Kokkos::parallel_for( "md3d", mdpolicy_3d, MDFunctor(v3, n) ); + + // Check results with a parallel_reduce using the MDRangePolicy + Kokkos::parallel_reduce( "md3dredux", mdpolicy_3d, MDFunctor(v3, n), incorrect_count_3d ); + + printf("Rank 3 MDRangePolicy incorrect count: %ld\n", incorrect_count_3d); // should be 0 + } + + Kokkos::finalize (); + + return (incorrect_count_2d == long(0) && incorrect_count_3d == long(0)) ? 0 : -1; +} + diff --git a/lib/kokkos/example/tutorial/Advanced_Views/01_data_layouts/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/01_data_layouts/Makefile index 956a4d1798..94ace811f3 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/01_data_layouts/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/01_data_layouts/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_data_layouts.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_data_layouts.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 01_data_layouts.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Advanced_Views/02_memory_traits/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/02_memory_traits/Makefile index 41697b0731..f64ee3540e 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/02_memory_traits/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/02_memory_traits/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_memory_traits.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_memory_traits.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 02_memory_traits.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Advanced_Views/03_subviews/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/03_subviews/Makefile index 8d0697aa21..ad70ee02d1 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/03_subviews/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/03_subviews/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_subviews.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_subviews.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 03_subviews.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Advanced_Views/04_dualviews/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/04_dualviews/Makefile index 0a3acd984f..e08be5c1df 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/04_dualviews/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/04_dualviews/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 04_dualviews.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 04_dualviews.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 04_dualviews.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile index 615ee2887a..ffd8184304 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 05_NVIDIA_UVM.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,7 +18,7 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 05_NVIDIA_UVM.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" @@ -37,7 +37,7 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean rm -f *.o *.cuda *.host diff --git a/lib/kokkos/example/tutorial/Advanced_Views/06_AtomicViews/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/06_AtomicViews/Makefile index dfb7d6df64..725d0de0e2 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/06_AtomicViews/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/06_AtomicViews/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 06_AtomicViews.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 06_AtomicViews.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 06_AtomicViews.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile index 432a90126d..8983b46d60 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 --default-stream per-thread LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 07_Overlapping_DeepCopy.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,7 +18,7 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 07_Overlapping_DeepCopy.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" @@ -37,7 +37,7 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean rm -f *.o *.cuda *.host diff --git a/lib/kokkos/example/tutorial/Advanced_Views/Makefile b/lib/kokkos/example/tutorial/Advanced_Views/Makefile index bc4012f68c..12ac5652e5 100644 --- a/lib/kokkos/example/tutorial/Advanced_Views/Makefile +++ b/lib/kokkos/example/tutorial/Advanced_Views/Makefile @@ -22,100 +22,102 @@ endif build: mkdir -p 01_data_layouts cd ./01_data_layouts; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/01_data_layouts/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/01_data_layouts/Makefile ${KOKKOS_SETTINGS} mkdir -p 02_memory_traits cd ./02_memory_traits; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/02_memory_traits/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/02_memory_traits/Makefile ${KOKKOS_SETTINGS} mkdir -p 03_subviews cd ./03_subviews; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/03_subviews/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/03_subviews/Makefile ${KOKKOS_SETTINGS} mkdir -p 04_dualviews cd ./04_dualviews; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/04_dualviews/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/04_dualviews/Makefile ${KOKKOS_SETTINGS} mkdir -p 05_NVIDIA_UVM cd ./05_NVIDIA_UVM; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile ${KOKKOS_SETTINGS} #mkdir -p 06_AtomicViews #cd ./06_AtomicViews; \ - #make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/06_AtomicViews/Makefile ${KOKKOS_SETTINGS} + #$(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/06_AtomicViews/Makefile ${KOKKOS_SETTINGS} #mkdir -p 07_Overlapping_DeepCopy #cd ./07_Overlapping_DeepCopy; \ - #make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile ${KOKKOS_SETTINGS} + #$(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile ${KOKKOS_SETTINGS} build-insource: cd ./01_data_layouts; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./02_memory_traits; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./03_subviews; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./04_dualviews; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./05_NVIDIA_UVM; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} #cd ./06_AtomicViews; \ - #make build -j 4 ${KOKKOS_SETTINGS} + #$(MAKE) build ${KOKKOS_SETTINGS} #cd ./07_Overlapping_DeepCopy; \ - #make build -j 4 ${KOKKOS_SETTINGS} + #$(MAKE) build ${KOKKOS_SETTINGS} + test: cd ./01_data_layouts; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/01_data_layouts/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/01_data_layouts/Makefile ${KOKKOS_SETTINGS} cd ./02_memory_traits; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/02_memory_traits/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/02_memory_traits/Makefile ${KOKKOS_SETTINGS} cd ./03_subviews; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/03_subviews/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/03_subviews/Makefile ${KOKKOS_SETTINGS} cd ./04_dualviews; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/04_dualviews/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/04_dualviews/Makefile ${KOKKOS_SETTINGS} cd ./05_NVIDIA_UVM; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile ${KOKKOS_SETTINGS} #cd ./06_AtomicViews; \ - #make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/06_AtomicViews/Makefile ${KOKKOS_SETTINGS} + #$(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/06_AtomicViews/Makefile ${KOKKOS_SETTINGS} #cd ./07_Overlapping_DeepCopy; \ - #make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile ${KOKKOS_SETTINGS} + #$(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile ${KOKKOS_SETTINGS} test-insource: cd ./01_data_layouts; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./02_memory_traits; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./03_subviews; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./04_dualviews; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./05_NVIDIA_UVM; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} #cd ./06_AtomicViews; \ - #make test -j 4 ${KOKKOS_SETTINGS} + #$(MAKE) test ${KOKKOS_SETTINGS} #cd ./07_Overlapping_DeepCopy; \ - #make test -j 4 ${KOKKOS_SETTINGS} + #$(MAKE) test ${KOKKOS_SETTINGS} + clean: cd ./01_data_layouts; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/01_data_layouts/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/01_data_layouts/Makefile ${KOKKOS_SETTINGS} cd ./02_memory_traits; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/02_memory_traits/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/02_memory_traits/Makefile ${KOKKOS_SETTINGS} cd ./03_subviews; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/03_subviews/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/03_subviews/Makefile ${KOKKOS_SETTINGS} cd ./04_dualviews; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/04_dualviews/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/04_dualviews/Makefile ${KOKKOS_SETTINGS} cd ./05_NVIDIA_UVM; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/05_NVIDIA_UVM/Makefile ${KOKKOS_SETTINGS} #cd ./06_AtomicViews; \ - #make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/06_AtomicViews/Makefile ${KOKKOS_SETTINGS} + #$(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/06_AtomicViews/Makefile ${KOKKOS_SETTINGS} #cd ./07_Overlapping_DeepCopy; \ - #make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile ${KOKKOS_SETTINGS} + #$(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/07_Overlapping_DeepCopy/Makefile ${KOKKOS_SETTINGS} clean-insource: cd ./01_data_layouts; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./02_memory_traits; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./03_subviews; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./04_dualviews; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./05_NVIDIA_UVM; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} #cd ./06_AtomicViews; \ - #make clean ${KOKKOS_SETTINGS} + #$(MAKE) clean ${KOKKOS_SETTINGS} #cd ./07_Overlapping_DeepCopy; \ - #make clean ${KOKKOS_SETTINGS} + #$(MAKE) clean ${KOKKOS_SETTINGS} diff --git a/lib/kokkos/example/tutorial/Algorithms/01_random_numbers/Makefile b/lib/kokkos/example/tutorial/Algorithms/01_random_numbers/Makefile index 60f6f94cdf..386a87474d 100644 --- a/lib/kokkos/example/tutorial/Algorithms/01_random_numbers/Makefile +++ b/lib/kokkos/example/tutorial/Algorithms/01_random_numbers/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_random_numbers.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_random_numbers.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 01_random_numbers.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Algorithms/Makefile b/lib/kokkos/example/tutorial/Algorithms/Makefile index ad0b76f9d6..4e70ba7d97 100644 --- a/lib/kokkos/example/tutorial/Algorithms/Makefile +++ b/lib/kokkos/example/tutorial/Algorithms/Makefile @@ -22,22 +22,22 @@ endif build: mkdir -p 01_random_numbers cd ./01_random_numbers; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Algorithms/01_random_numbers/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Algorithms/01_random_numbers/Makefile ${KOKKOS_SETTINGS} build-insource: cd ./01_random_numbers; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} test: cd ./01_random_numbers; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Algorithms/01_random_numbers/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Algorithms/01_random_numbers/Makefile ${KOKKOS_SETTINGS} test-insource: cd ./01_random_numbers; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} clean: cd ./01_random_numbers; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Algorithms/01_random_numbers/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Algorithms/01_random_numbers/Makefile ${KOKKOS_SETTINGS} clean-insource: cd ./01_random_numbers; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} diff --git a/lib/kokkos/example/tutorial/CMakeLists.txt b/lib/kokkos/example/tutorial/CMakeLists.txt index d1fd4c0ae9..613e460cad 100644 --- a/lib/kokkos/example/tutorial/CMakeLists.txt +++ b/lib/kokkos/example/tutorial/CMakeLists.txt @@ -4,6 +4,7 @@ TRIBITS_ADD_EXAMPLE_DIRECTORIES(02_simple_reduce) TRIBITS_ADD_EXAMPLE_DIRECTORIES(03_simple_view) TRIBITS_ADD_EXAMPLE_DIRECTORIES(04_simple_memoryspaces) TRIBITS_ADD_EXAMPLE_DIRECTORIES(05_simple_atomics) +TRIBITS_ADD_EXAMPLE_DIRECTORIES(06_simple_mdrangepolicy) TRIBITS_ADD_EXAMPLE_DIRECTORIES(Advanced_Views) TRIBITS_ADD_EXAMPLE_DIRECTORIES(Hierarchical_Parallelism) diff --git a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile index 8c50430c30..7282abc30c 100644 --- a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile +++ b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_thread_teams.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_thread_teams.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 01_thread_teams.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile index b9b017bf1b..4049dbde34 100644 --- a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile +++ b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_thread_teams_lambda.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -19,11 +19,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 01_thread_teams_lambda.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 01_thread_teams_lambda.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -38,10 +48,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile index bae9351229..fe882f36b8 100644 --- a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile +++ b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_nested_parallel_for.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 02_nested_parallel_for.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 02_nested_parallel_for.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile index a041b69b56..4481889cdb 100644 --- a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile +++ b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_vectorization.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 03_vectorization.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 03_vectorization.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile index 6418875c9e..0f0bcf70de 100644 --- a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile +++ b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile @@ -10,7 +10,7 @@ ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 04_team_scan.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -18,11 +18,21 @@ else CXX = g++ CXXFLAGS = -O3 LINK = ${CXX} -LINKFLAGS = +LDFLAGS = EXE = 04_team_scan.host KOKKOS_DEVICES = "OpenMP" KOKKOS_ARCH = "SNB" endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = 04_team_scan.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + DEPFLAGS = -M @@ -37,10 +47,10 @@ test: $(EXE) ./$(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) clean: kokkos-clean - rm -f *.o *.cuda *.host + rm -f *.o *.cuda *.host *.rocm # Compilation rules diff --git a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/Makefile b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/Makefile index 44fdf90f8a..4bf6d487ae 100644 --- a/lib/kokkos/example/tutorial/Hierarchical_Parallelism/Makefile +++ b/lib/kokkos/example/tutorial/Hierarchical_Parallelism/Makefile @@ -22,74 +22,74 @@ endif build: mkdir -p 01_thread_teams cd ./01_thread_teams; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile ${KOKKOS_SETTINGS} mkdir -p 01_thread_teams_lambda cd ./01_thread_teams_lambda; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile ${KOKKOS_SETTINGS} mkdir -p 02_nested_parallel_for cd ./02_nested_parallel_for; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile ${KOKKOS_SETTINGS} mkdir -p 03_vectorization cd ./03_vectorization; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile ${KOKKOS_SETTINGS} mkdir -p 04_team_scan cd ./04_team_scan; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile ${KOKKOS_SETTINGS} build-insource: cd ./01_thread_teams; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./01_thread_teams_lambda; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./02_nested_parallel_for; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./03_vectorization; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./04_team_scan; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} test: cd ./01_thread_teams; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile ${KOKKOS_SETTINGS} cd ./01_thread_teams_lambda; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile ${KOKKOS_SETTINGS} cd ./02_nested_parallel_for; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile ${KOKKOS_SETTINGS} cd ./03_vectorization; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile ${KOKKOS_SETTINGS} cd ./04_team_scan; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile ${KOKKOS_SETTINGS} test-insource: cd ./01_thread_teams; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./01_thread_teams_lambda; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./02_nested_parallel_for; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./03_vectorization; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./04_team_scan; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} clean: cd ./01_thread_teams; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams/Makefile ${KOKKOS_SETTINGS} cd ./01_thread_teams_lambda; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/01_thread_teams_lambda/Makefile ${KOKKOS_SETTINGS} cd ./02_nested_parallel_for; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/02_nested_parallel_for/Makefile ${KOKKOS_SETTINGS} cd ./03_vectorization; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/03_vectorization/Makefile ${KOKKOS_SETTINGS} cd ./04_team_scan; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/04_team_scan/Makefile ${KOKKOS_SETTINGS} clean-insource: cd ./01_thread_teams; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./01_thread_teams_lambda; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./02_nested_parallel_for; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./03_vectorization; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./04_team_scan; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} diff --git a/lib/kokkos/example/tutorial/Makefile b/lib/kokkos/example/tutorial/Makefile index 063ace8aab..7b2732eeed 100644 --- a/lib/kokkos/example/tutorial/Makefile +++ b/lib/kokkos/example/tutorial/Makefile @@ -23,152 +23,152 @@ endif build: mkdir -p 01_hello_world cd ./01_hello_world; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/01_hello_world/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/01_hello_world/Makefile ${KOKKOS_SETTINGS} mkdir -p 01_hello_world_lambda cd ./01_hello_world_lambda; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/01_hello_world_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/01_hello_world_lambda/Makefile ${KOKKOS_SETTINGS} mkdir -p 02_simple_reduce cd ./02_simple_reduce; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce/Makefile ${KOKKOS_SETTINGS} mkdir -p 02_simple_reduce_lambda cd ./02_simple_reduce_lambda; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce_lambda/Makefile ${KOKKOS_SETTINGS} mkdir -p 03_simple_view cd ./03_simple_view; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/03_simple_view/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/03_simple_view/Makefile ${KOKKOS_SETTINGS} mkdir -p 03_simple_view_lambda cd ./03_simple_view_lambda; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/03_simple_view_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/03_simple_view_lambda/Makefile ${KOKKOS_SETTINGS} mkdir -p 04_simple_memoryspaces cd ./04_simple_memoryspaces; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/04_simple_memoryspaces/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/04_simple_memoryspaces/Makefile ${KOKKOS_SETTINGS} mkdir -p 05_simple_atomics cd ./05_simple_atomics; \ - make build -j 4 -f ${KOKKOS_PATH}/example/tutorial/05_simple_atomics/Makefile ${KOKKOS_SETTINGS} + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/05_simple_atomics/Makefile ${KOKKOS_SETTINGS} mkdir -p Advanced_Views cd ./Advanced_Views; \ - make build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' mkdir -p Algorithms cd ./Algorithms; \ - make build -f ${KOKKOS_PATH}/example/tutorial/Algorithms/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Algorithms/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' mkdir -p Hierarchical_Parallelism cd ./Hierarchical_Parallelism; \ - make build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) build -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' build-insource: cd ./01_hello_world; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./01_hello_world_lambda; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./02_simple_reduce; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./02_simple_reduce_lambda; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./03_simple_view; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./03_simple_view_lambda; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./04_simple_memoryspaces; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./05_simple_atomics; \ - make build -j 4 ${KOKKOS_SETTINGS} + $(MAKE) build ${KOKKOS_SETTINGS} cd ./Advanced_Views; \ - make build KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) build KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Algorithms; \ - make build KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) build KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Hierarchical_Parallelism; \ - make build KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) build KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' test: cd ./01_hello_world; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/01_hello_world/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/01_hello_world/Makefile ${KOKKOS_SETTINGS} cd ./01_hello_world_lambda; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/01_hello_world_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/01_hello_world_lambda/Makefile ${KOKKOS_SETTINGS} cd ./02_simple_reduce; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce/Makefile ${KOKKOS_SETTINGS} cd ./02_simple_reduce_lambda; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce_lambda/Makefile ${KOKKOS_SETTINGS} cd ./03_simple_view; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/03_simple_view/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/03_simple_view/Makefile ${KOKKOS_SETTINGS} cd ./03_simple_view_lambda; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/03_simple_view_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/03_simple_view_lambda/Makefile ${KOKKOS_SETTINGS} cd ./04_simple_memoryspaces; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/04_simple_memoryspaces/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/04_simple_memoryspaces/Makefile ${KOKKOS_SETTINGS} cd ./05_simple_atomics; \ - make test -j 4 -f ${KOKKOS_PATH}/example/tutorial/05_simple_atomics/Makefile ${KOKKOS_SETTINGS} + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/05_simple_atomics/Makefile ${KOKKOS_SETTINGS} cd ./Advanced_Views; \ - make test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Algorithms; \ - make test -f ${KOKKOS_PATH}/example/tutorial/Algorithms/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Algorithms/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Hierarchical_Parallelism; \ - make test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) test -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' test-insource: cd ./01_hello_world; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./01_hello_world_lambda; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./02_simple_reduce; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./02_simple_reduce_lambda; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./03_simple_view; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./03_simple_view_lambda; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./04_simple_memoryspaces; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./05_simple_atomics; \ - make test -j 4 ${KOKKOS_SETTINGS} + $(MAKE) test ${KOKKOS_SETTINGS} cd ./Advanced_Views; \ - make test KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) test KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Algorithms; \ - make test KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) test KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Hierarchical_Parallelism; \ - make test KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) test KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' clean: cd ./01_hello_world; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/01_hello_world/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/01_hello_world/Makefile ${KOKKOS_SETTINGS} cd ./01_hello_world_lambda; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/01_hello_world_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/01_hello_world_lambda/Makefile ${KOKKOS_SETTINGS} cd ./02_simple_reduce; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce/Makefile ${KOKKOS_SETTINGS} cd ./02_simple_reduce_lambda; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/02_simple_reduce_lambda/Makefile ${KOKKOS_SETTINGS} cd ./03_simple_view; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/03_simple_view/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/03_simple_view/Makefile ${KOKKOS_SETTINGS} cd ./03_simple_view_lambda; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/03_simple_view_lambda/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/03_simple_view_lambda/Makefile ${KOKKOS_SETTINGS} cd ./04_simple_memoryspaces; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/04_simple_memoryspaces/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/04_simple_memoryspaces/Makefile ${KOKKOS_SETTINGS} cd ./05_simple_atomics; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/05_simple_atomics/Makefile ${KOKKOS_SETTINGS} + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/05_simple_atomics/Makefile ${KOKKOS_SETTINGS} cd ./Advanced_Views; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Advanced_Views/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Algorithms; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Algorithms/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Algorithms/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Hierarchical_Parallelism; \ - make clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) clean -f ${KOKKOS_PATH}/example/tutorial/Hierarchical_Parallelism/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' clean-insource: cd ./01_hello_world; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./01_hello_world_lambda; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./02_simple_reduce; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./02_simple_reduce_lambda; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./03_simple_view; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./03_simple_view_lambda; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./04_simple_memoryspaces; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./05_simple_atomics; \ - make clean ${KOKKOS_SETTINGS} + $(MAKE) clean ${KOKKOS_SETTINGS} cd ./Advanced_Views; \ - make clean KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) clean KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Algorithms; \ - make clean KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) clean KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' cd ./Hierarchical_Parallelism; \ - make clean KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' + $(MAKE) clean KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' diff --git a/lib/kokkos/example/tutorial/launch_bounds/CMakeLists.txt b/lib/kokkos/example/tutorial/launch_bounds/CMakeLists.txt new file mode 100644 index 0000000000..7c78db840f --- /dev/null +++ b/lib/kokkos/example/tutorial/launch_bounds/CMakeLists.txt @@ -0,0 +1,10 @@ + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +# This is a tutorial, not a test, so we don't ask CTest to run it. +TRIBITS_ADD_EXECUTABLE( + tutorial_02_simple_reduce + SOURCES simple_reduce.cpp + COMM serial mpi + ) diff --git a/lib/kokkos/example/tutorial/launch_bounds/Makefile b/lib/kokkos/example/tutorial/launch_bounds/Makefile new file mode 100644 index 0000000000..4a1bf17344 --- /dev/null +++ b/lib/kokkos/example/tutorial/launch_bounds/Makefile @@ -0,0 +1,66 @@ +KOKKOS_PATH = ../../.. +KOKKOS_SRC_PATH = ${KOKKOS_PATH} +SRC = $(wildcard ${KOKKOS_SRC_PATH}/example/tutorial/launch_bounds/*.cpp) +vpath %.cpp $(sort $(dir $(SRC))) + +default: build + echo "Start Build" + +ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) +CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = launch_bounds.cuda +KOKKOS_DEVICES = "Cuda,OpenMP" +KOKKOS_ARCH = "SNB,Kepler35" +else +CXX = g++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = launch_bounds.host +KOKKOS_DEVICES = "OpenMP" +KOKKOS_ARCH = "SNB" +endif +ifneq (,$(findstring ROCm,$(KOKKOS_DEVICES))) +CXX = /opt/rocm/hcc/bin/clang++ +CXXFLAGS = -O3 +LINK = ${CXX} +LDFLAGS = +EXE = launch_bounds.rocm +KOKKOS_DEVICES = "ROCm" +KOKKOS_ARCH = "Fiji" +endif + + +# WAR for "undefined memcpy" w/ Ubuntu + CUDA 7.5 +CXXFLAGS += -D_FORCE_INLINES +# Additional compile-time information +CXXFLAGS += -Xptxas=-v + +DEPFLAGS = -M + +OBJ = $(notdir $(SRC:.cpp=.o)) +LIB = + +include $(KOKKOS_PATH)/Makefile.kokkos + +temp: + echo $(KOKKOS_INTERNAL_USE_CUDA) $(CUDA_PATH) + +build: $(EXE) + +test: $(EXE) + ./$(EXE) + +$(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) + $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) + +clean: kokkos-clean + rm -f *.o *.cuda *.rocm + +# Compilation rules + +%.o:%.cpp $(KOKKOS_CPP_DEPENDS) + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< -o $(notdir $@) diff --git a/lib/kokkos/example/tutorial/launch_bounds/launch_bounds_reduce.cpp b/lib/kokkos/example/tutorial/launch_bounds/launch_bounds_reduce.cpp new file mode 100644 index 0000000000..9a26eda507 --- /dev/null +++ b/lib/kokkos/example/tutorial/launch_bounds/launch_bounds_reduce.cpp @@ -0,0 +1,173 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#include +#include + +// +// First reduction (parallel_reduce) example: +// 1. Start up Kokkos +// 2. Execute a parallel_reduce loop in the default execution space, +// using a functor to define the loop body +// 3. Shut down Kokkos +// +struct collision { +// Reduction functor +// For each i, we generate 10 hashes, look for and count collisions +// We use parallel_reduce to count the total collisions +// Note that we're just counting collisions within the 10 generated +// one i. +// This function was chosen as one that very simply can increase the +// register count. + typedef int value_type; + + KOKKOS_INLINE_FUNCTION + int hash(int q) const { + // A simple hash by Justin Sobel + // Thanks to Arash Partow (partow.net) + char* fourchars = (char*)&q; + int hash = 1315423911; + for (int i=0; i<4; fourchars++, i++) { + hash ^= ((hash<<5) + *fourchars + (hash >> 2)); + } + return hash; + } + + KOKKOS_INLINE_FUNCTION + void operator () (const int i, int& lsum) const { + //This is a silly function which generates 10 hashes + // then checks for collisions + int a = hash(i)%64; + int b = hash(i*3)%64; + int c = hash(i*5)%64; + int d = hash(i*7)%64; + int e = hash(i*11)%64; + int f = hash(i*17)%64; + int g = hash(i*23)%64; + int h = hash(i*29)%64; + int j = hash(i*31)%64; + int k = hash(i*37)%64; + + + if (a==b) lsum++; + if (a==c) lsum++; + if (a==d) lsum++; + if (a==e) lsum++; + if (a==f) lsum++; + if (a==g) lsum++; + if (a==h) lsum++; + if (a==j) lsum++; + if (a==k) lsum++; + if (b==c) lsum++; + if (b==d) lsum++; + if (b==e) lsum++; + if (b==f) lsum++; + if (b==g) lsum++; + if (b==h) lsum++; + if (b==j) lsum++; + if (b==k) lsum++; + if (c==d) lsum++; + if (c==e) lsum++; + if (c==f) lsum++; + if (c==g) lsum++; + if (c==h) lsum++; + if (c==j) lsum++; + if (c==k) lsum++; + if (d==e) lsum++; + if (d==f) lsum++; + if (d==g) lsum++; + if (d==h) lsum++; + if (d==j) lsum++; + if (d==k) lsum++; + if (e==f) lsum++; + if (e==g) lsum++; + if (e==h) lsum++; + if (e==j) lsum++; + if (e==k) lsum++; + if (f==g) lsum++; + if (f==h) lsum++; + if (f==j) lsum++; + if (f==k) lsum++; + if (g==h) lsum++; + if (g==j) lsum++; + if (g==k) lsum++; + if (h==j) lsum++; + if (h==k) lsum++; + if (j==k) lsum++; + } + + + +}; + +int main (int argc, char* argv[]) { + Kokkos::initialize (argc, argv); + const int n = 10000; + + // Compute and count hash collisions in + // parallel, using Kokkos. + // This is not really a useful algorithm, but it demonstrates the + // LaunchBounds functionality + int sum1 = 0; + int sum2 = 0; + + //Without LaunchBounds, the kernel uses 56 registers + Kokkos::parallel_reduce (n, collision (), sum1); + + //With LaunchBounds, we can reduce the register usage to 32 + Kokkos::parallel_reduce (Kokkos::RangePolicy>(0,n), collision (), sum2); + + printf ("Number of collisions, " + "computed in parallel, is %i\n", sum1); + + if (sum1 != sum2) { + printf( "Uh-oh! Results do not match\n"); + return -1; + } + + Kokkos::finalize(); + + + return 0; +} + diff --git a/lib/kokkos/generate_makefile.bash b/lib/kokkos/generate_makefile.bash index 5f2442102d..521a77d1af 100755 --- a/lib/kokkos/generate_makefile.bash +++ b/lib/kokkos/generate_makefile.bash @@ -1,7 +1,6 @@ #!/bin/bash KOKKOS_DEVICES="" -MAKE_J_OPTION="32" KOKKOS_DO_EXAMPLES="1" @@ -32,6 +31,9 @@ do KOKKOS_DEVICES="${KOKKOS_DEVICES},Cuda" CUDA_PATH="${key#*=}" ;; + --with-rocm) + KOKKOS_DEVICES="${KOKKOS_DEVICES},ROCm" + ;; --with-openmp) KOKKOS_DEVICES="${KOKKOS_DEVICES},OpenMP" ;; @@ -57,6 +59,9 @@ do --with-hwloc*) HWLOC_PATH="${key#*=}" ;; + --with-memkind*) + MEMKIND_PATH="${key#*=}" + ;; --arch*) KOKKOS_ARCH="${key#*=}" ;; @@ -70,7 +75,8 @@ do KOKKOS_DEBUG=yes ;; --make-j*) - MAKE_J_OPTION="${key#*=}" + echo "Warning: ${key} is deprecated" + echo "Call make with appropriate -j flag" ;; --no-examples) KOKKOS_DO_EXAMPLES="0" @@ -110,23 +116,36 @@ do echo "--with-devices: Explicitly add a set of backends." echo "" echo "--arch=[OPT]: Set target architectures. Options are:" + echo " [AMD]" + echo " AMDAVX = AMD CPU" + echo " [ARM]" echo " ARMv80 = ARMv8.0 Compatible CPU" echo " ARMv81 = ARMv8.1 Compatible CPU" echo " ARMv8-ThunderX = ARMv8 Cavium ThunderX CPU" + echo " [IBM]" + echo " BGQ = IBM Blue Gene Q" + echo " Power7 = IBM POWER7 and POWER7+ CPUs" + echo " Power8 = IBM POWER8 CPUs" + echo " Power9 = IBM POWER9 CPUs" + echo " [Intel]" + echo " WSM = Intel Westmere CPUs" echo " SNB = Intel Sandy/Ivy Bridge CPUs" echo " HSW = Intel Haswell CPUs" echo " BDW = Intel Broadwell Xeon E-class CPUs" echo " SKX = Intel Sky Lake Xeon E-class HPC CPUs (AVX512)" + echo " [Intel Xeon Phi]" echo " KNC = Intel Knights Corner Xeon Phi" echo " KNL = Intel Knights Landing Xeon Phi" + echo " [NVIDIA]" echo " Kepler30 = NVIDIA Kepler generation CC 3.0" + echo " Kepler32 = NVIDIA Kepler generation CC 3.2" echo " Kepler35 = NVIDIA Kepler generation CC 3.5" echo " Kepler37 = NVIDIA Kepler generation CC 3.7" + echo " Maxwell50 = NVIDIA Maxwell generation CC 5.0" + echo " Maxwell52 = NVIDIA Maxwell generation CC 5.2" + echo " Maxwell53 = NVIDIA Maxwell generation CC 5.3" echo " Pascal60 = NVIDIA Pascal generation CC 6.0" echo " Pascal61 = NVIDIA Pascal generation CC 6.1" - echo " Maxwell50 = NVIDIA Maxwell generation CC 5.0" - echo " Power8 = IBM POWER8 CPUs" - echo " Power9 = IBM POWER9 CPUs" echo "" echo "--compiler=/Path/To/Compiler Set the compiler." echo "--debug,-dbg: Enable Debugging." @@ -140,12 +159,17 @@ do echo " -lpthread, etc.)." echo "--with-gtest=/Path/To/Gtest: Set path to gtest. (Used in unit and performance" echo " tests.)" - echo "--with-hwloc=/Path/To/Hwloc: Set path to hwloc." + echo "--with-hwloc=/Path/To/Hwloc: Set path to hwloc library." + echo "--with-memkind=/Path/To/MemKind: Set path to memkind library." echo "--with-options=[OPT]: Additional options to Kokkos:" + echo " compiler_warnings" echo " aggressive_vectorization = add ivdep on loops" + echo " disable_profiling = do not compile with profiling hooks" + echo " " echo "--with-cuda-options=[OPT]: Additional options to CUDA:" echo " force_uvm, use_ldg, enable_lambda, rdc" - echo "--make-j=[NUM]: Set -j flag used during build." + echo "--make-j=[NUM]: DEPRECATED: call make with appropriate" + echo " -j flag" exit 0 ;; *) @@ -213,7 +237,17 @@ else fi if [ ${#HWLOC_PATH} -gt 0 ]; then - KOKKOS_SETTINGS="${KOKKOS_SETTINGS} HWLOC_PATH=${HWLOC_PATH} KOKKOS_USE_TPLS=hwloc" + KOKKOS_SETTINGS="${KOKKOS_SETTINGS} HWLOC_PATH=${HWLOC_PATH}" + KOKKOS_USE_TPLS="${KOKKOS_USE_TPLS},hwloc" +fi + +if [ ${#MEMKIND_PATH} -gt 0 ]; then + KOKKOS_SETTINGS="${KOKKOS_SETTINGS} MEMKIND_PATH=${MEMKIND_PATH}" + KOKKOS_USE_TPLS="${KOKKOS_USE_TPLS},experimental_memkind" +fi + +if [ ${#KOKKOS_USE_TPLS} -gt 0 ]; then + KOKKOS_SETTINGS="${KOKKOS_SETTINGS} KOKKOS_USE_TPLS=${KOKKOS_USE_TPLS}" fi if [ ${#QTHREADS_PATH} -gt 0 ]; then @@ -237,27 +271,28 @@ else KOKKOS_INSTALL_PATH=${KOKKOS_TEST_INSTALL_PATH} fi -mkdir install -echo "#Makefile to satisfy existens of target kokkos-clean before installing the library" > install/Makefile.kokkos -echo "kokkos-clean:" >> install/Makefile.kokkos -echo "" >> install/Makefile.kokkos -mkdir core -mkdir core/unit_test -mkdir core/perf_test -mkdir containers -mkdir containers/unit_tests -mkdir containers/performance_tests -mkdir algorithms -mkdir algorithms/unit_tests -mkdir algorithms/performance_tests -mkdir example -mkdir example/fixture -mkdir example/feint -mkdir example/fenl -mkdir example/tutorial +mkdir -p install +gen_makefile=Makefile.kokkos +echo "#Makefile to satisfy existens of target kokkos-clean before installing the library" > install/${gen_makefile} +echo "kokkos-clean:" >> install/${gen_makefile} +echo "" >> install/${gen_makefile} +mkdir -p core +mkdir -p core/unit_test +mkdir -p core/perf_test +mkdir -p containers +mkdir -p containers/unit_tests +mkdir -p containers/performance_tests +mkdir -p algorithms +mkdir -p algorithms/unit_tests +mkdir -p algorithms/performance_tests +mkdir -p example +mkdir -p example/fixture +mkdir -p example/feint +mkdir -p example/fenl +mkdir -p example/tutorial if [ ${#KOKKOS_ENABLE_EXAMPLE_ICHOL} -gt 0 ]; then - mkdir example/ichol + mkdir -p example/ichol fi KOKKOS_SETTINGS="${KOKKOS_SETTINGS_NO_KOKKOS_PATH} KOKKOS_PATH=${KOKKOS_PATH}" @@ -266,115 +301,115 @@ KOKKOS_SETTINGS="${KOKKOS_SETTINGS_NO_KOKKOS_PATH} KOKKOS_PATH=${KOKKOS_PATH}" echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > core/unit_test/Makefile echo "" >> core/unit_test/Makefile echo "all:" >> core/unit_test/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/core/unit_test/Makefile ${KOKKOS_SETTINGS}" >> core/unit_test/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/unit_test/Makefile ${KOKKOS_SETTINGS}" >> core/unit_test/Makefile echo "" >> core/unit_test/Makefile echo "test: all" >> core/unit_test/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/core/unit_test/Makefile ${KOKKOS_SETTINGS} test" >> core/unit_test/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/unit_test/Makefile ${KOKKOS_SETTINGS} test" >> core/unit_test/Makefile echo "" >> core/unit_test/Makefile echo "clean:" >> core/unit_test/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/core/unit_test/Makefile ${KOKKOS_SETTINGS} clean" >> core/unit_test/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/unit_test/Makefile ${KOKKOS_SETTINGS} clean" >> core/unit_test/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > core/perf_test/Makefile echo "" >> core/perf_test/Makefile echo "all:" >> core/perf_test/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/core/perf_test/Makefile ${KOKKOS_SETTINGS}" >> core/perf_test/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/perf_test/Makefile ${KOKKOS_SETTINGS}" >> core/perf_test/Makefile echo "" >> core/perf_test/Makefile echo "test: all" >> core/perf_test/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/core/perf_test/Makefile ${KOKKOS_SETTINGS} test" >> core/perf_test/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/perf_test/Makefile ${KOKKOS_SETTINGS} test" >> core/perf_test/Makefile echo "" >> core/perf_test/Makefile echo "clean:" >> core/perf_test/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/core/perf_test/Makefile ${KOKKOS_SETTINGS} clean" >> core/perf_test/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/perf_test/Makefile ${KOKKOS_SETTINGS} clean" >> core/perf_test/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > containers/unit_tests/Makefile echo "" >> containers/unit_tests/Makefile echo "all:" >> containers/unit_tests/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/containers/unit_tests/Makefile ${KOKKOS_SETTINGS}" >> containers/unit_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/containers/unit_tests/Makefile ${KOKKOS_SETTINGS}" >> containers/unit_tests/Makefile echo "" >> containers/unit_tests/Makefile echo "test: all" >> containers/unit_tests/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/containers/unit_tests/Makefile ${KOKKOS_SETTINGS} test" >> containers/unit_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/containers/unit_tests/Makefile ${KOKKOS_SETTINGS} test" >> containers/unit_tests/Makefile echo "" >> containers/unit_tests/Makefile echo "clean:" >> containers/unit_tests/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/containers/unit_tests/Makefile ${KOKKOS_SETTINGS} clean" >> containers/unit_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/containers/unit_tests/Makefile ${KOKKOS_SETTINGS} clean" >> containers/unit_tests/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > containers/performance_tests/Makefile echo "" >> containers/performance_tests/Makefile echo "all:" >> containers/performance_tests/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/containers/performance_tests/Makefile ${KOKKOS_SETTINGS}" >> containers/performance_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/containers/performance_tests/Makefile ${KOKKOS_SETTINGS}" >> containers/performance_tests/Makefile echo "" >> containers/performance_tests/Makefile echo "test: all" >> containers/performance_tests/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/containers/performance_tests/Makefile ${KOKKOS_SETTINGS} test" >> containers/performance_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/containers/performance_tests/Makefile ${KOKKOS_SETTINGS} test" >> containers/performance_tests/Makefile echo "" >> containers/performance_tests/Makefile echo "clean:" >> containers/performance_tests/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/containers/performance_tests/Makefile ${KOKKOS_SETTINGS} clean" >> containers/performance_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/containers/performance_tests/Makefile ${KOKKOS_SETTINGS} clean" >> containers/performance_tests/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > algorithms/unit_tests/Makefile echo "" >> algorithms/unit_tests/Makefile echo "all:" >> algorithms/unit_tests/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/algorithms/unit_tests/Makefile ${KOKKOS_SETTINGS}" >> algorithms/unit_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/algorithms/unit_tests/Makefile ${KOKKOS_SETTINGS}" >> algorithms/unit_tests/Makefile echo "" >> algorithms/unit_tests/Makefile echo "test: all" >> algorithms/unit_tests/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/algorithms/unit_tests/Makefile ${KOKKOS_SETTINGS} test" >> algorithms/unit_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/algorithms/unit_tests/Makefile ${KOKKOS_SETTINGS} test" >> algorithms/unit_tests/Makefile echo "" >> algorithms/unit_tests/Makefile echo "clean:" >> algorithms/unit_tests/Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/algorithms/unit_tests/Makefile ${KOKKOS_SETTINGS} clean" >> algorithms/unit_tests/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/algorithms/unit_tests/Makefile ${KOKKOS_SETTINGS} clean" >> algorithms/unit_tests/Makefile KOKKOS_SETTINGS="${KOKKOS_SETTINGS_NO_KOKKOS_PATH} KOKKOS_PATH=${KOKKOS_TEST_INSTALL_PATH}" echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > example/fixture/Makefile echo "" >> example/fixture/Makefile echo "all:" >> example/fixture/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/fixture/Makefile ${KOKKOS_SETTINGS}" >> example/fixture/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/fixture/Makefile ${KOKKOS_SETTINGS}" >> example/fixture/Makefile echo "" >> example/fixture/Makefile echo "test: all" >> example/fixture/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/fixture/Makefile ${KOKKOS_SETTINGS} test" >> example/fixture/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/fixture/Makefile ${KOKKOS_SETTINGS} test" >> example/fixture/Makefile echo "" >> example/fixture/Makefile echo "clean:" >> example/fixture/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/fixture/Makefile ${KOKKOS_SETTINGS} clean" >> example/fixture/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/fixture/Makefile ${KOKKOS_SETTINGS} clean" >> example/fixture/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > example/feint/Makefile echo "" >> example/feint/Makefile echo "all:" >> example/feint/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/feint/Makefile ${KOKKOS_SETTINGS}" >> example/feint/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/feint/Makefile ${KOKKOS_SETTINGS}" >> example/feint/Makefile echo "" >> example/feint/Makefile echo "test: all" >> example/feint/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/feint/Makefile ${KOKKOS_SETTINGS} test" >> example/feint/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/feint/Makefile ${KOKKOS_SETTINGS} test" >> example/feint/Makefile echo "" >> example/feint/Makefile echo "clean:" >> example/feint/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/feint/Makefile ${KOKKOS_SETTINGS} clean" >> example/feint/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/feint/Makefile ${KOKKOS_SETTINGS} clean" >> example/feint/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > example/fenl/Makefile echo "" >> example/fenl/Makefile echo "all:" >> example/fenl/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/fenl/Makefile ${KOKKOS_SETTINGS}" >> example/fenl/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/fenl/Makefile ${KOKKOS_SETTINGS}" >> example/fenl/Makefile echo "" >> example/fenl/Makefile echo "test: all" >> example/fenl/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/fenl/Makefile ${KOKKOS_SETTINGS} test" >> example/fenl/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/fenl/Makefile ${KOKKOS_SETTINGS} test" >> example/fenl/Makefile echo "" >> example/fenl/Makefile echo "clean:" >> example/fenl/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/fenl/Makefile ${KOKKOS_SETTINGS} clean" >> example/fenl/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/fenl/Makefile ${KOKKOS_SETTINGS} clean" >> example/fenl/Makefile echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > example/tutorial/Makefile echo "" >> example/tutorial/Makefile echo "build:" >> example/tutorial/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/tutorial/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' KOKKOS_PATH=${KOKKOS_PATH} build">> example/tutorial/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/tutorial/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' KOKKOS_PATH=${KOKKOS_PATH} build">> example/tutorial/Makefile echo "" >> example/tutorial/Makefile echo "test: build" >> example/tutorial/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/tutorial/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' KOKKOS_PATH=${KOKKOS_PATH} test" >> example/tutorial/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/tutorial/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' KOKKOS_PATH=${KOKKOS_PATH} test" >> example/tutorial/Makefile echo "" >> example/tutorial/Makefile echo "clean:" >> example/tutorial/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/tutorial/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' KOKKOS_PATH=${KOKKOS_PATH} clean" >> example/tutorial/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/tutorial/Makefile KOKKOS_SETTINGS='${KOKKOS_SETTINGS}' KOKKOS_PATH=${KOKKOS_PATH} clean" >> example/tutorial/Makefile if [ ${#KOKKOS_ENABLE_EXAMPLE_ICHOL} -gt 0 ]; then echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > example/ichol/Makefile echo "" >> example/ichol/Makefile echo "all:" >> example/ichol/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/ichol/Makefile ${KOKKOS_SETTINGS}" >> example/ichol/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/ichol/Makefile ${KOKKOS_SETTINGS}" >> example/ichol/Makefile echo "" >> example/ichol/Makefile echo "test: all" >> example/ichol/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/ichol/Makefile ${KOKKOS_SETTINGS} test" >> example/ichol/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/ichol/Makefile ${KOKKOS_SETTINGS} test" >> example/ichol/Makefile echo "" >> example/ichol/Makefile echo "clean:" >> example/ichol/Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/example/ichol/Makefile ${KOKKOS_SETTINGS} clean" >> example/ichol/Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/example/ichol/Makefile ${KOKKOS_SETTINGS} clean" >> example/ichol/Makefile fi KOKKOS_SETTINGS="${KOKKOS_SETTINGS_NO_KOKKOS_PATH} KOKKOS_PATH=${KOKKOS_PATH}" @@ -385,62 +420,64 @@ echo "KOKKOS_SETTINGS=${KOKKOS_SETTINGS}" > Makefile echo "" >> Makefile echo "kokkoslib:" >> Makefile echo -e "\tcd core; \\" >> Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_INSTALL_PATH} build-lib" >> Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_INSTALL_PATH} build-lib" >> Makefile echo "" >> Makefile echo "install: kokkoslib" >> Makefile echo -e "\tcd core; \\" >> Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_INSTALL_PATH} install" >> Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_INSTALL_PATH} install" >> Makefile echo "" >> Makefile echo "kokkoslib-test:" >> Makefile echo -e "\tcd core; \\" >> Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_TEST_INSTALL_PATH} build-lib" >> Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_TEST_INSTALL_PATH} build-lib" >> Makefile echo "" >> Makefile echo "install-test: kokkoslib-test" >> Makefile echo -e "\tcd core; \\" >> Makefile -echo -e "\tmake -j ${MAKE_J_OPTION} -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_TEST_INSTALL_PATH} install" >> Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} PREFIX=${KOKKOS_TEST_INSTALL_PATH} install" >> Makefile echo "" >> Makefile echo "build-test: install-test" >> Makefile -echo -e "\tmake -C core/unit_test" >> Makefile -echo -e "\tmake -C core/perf_test" >> Makefile -echo -e "\tmake -C containers/unit_tests" >> Makefile -echo -e "\tmake -C containers/performance_tests" >> Makefile -echo -e "\tmake -C algorithms/unit_tests" >> Makefile +echo -e "\t\$(MAKE) -C core/unit_test" >> Makefile +echo -e "\t\$(MAKE) -C core/perf_test" >> Makefile +echo -e "\t\$(MAKE) -C containers/unit_tests" >> Makefile +echo -e "\t\$(MAKE) -C containers/performance_tests" >> Makefile +echo -e "\t\$(MAKE) -C algorithms/unit_tests" >> Makefile if [ ${KOKKOS_DO_EXAMPLES} -gt 0 ]; then -echo -e "\tmake -C example/fixture" >> Makefile -echo -e "\tmake -C example/feint" >> Makefile -echo -e "\tmake -C example/fenl" >> Makefile -echo -e "\tmake -C example/tutorial build" >> Makefile +echo -e "\t\$(MAKE) -C example/fixture" >> Makefile +echo -e "\t\$(MAKE) -C example/feint" >> Makefile +echo -e "\t\$(MAKE) -C example/fenl" >> Makefile +echo -e "\t\$(MAKE) -C example/tutorial build" >> Makefile fi echo "" >> Makefile echo "test: build-test" >> Makefile -echo -e "\tmake -C core/unit_test test" >> Makefile -echo -e "\tmake -C core/perf_test test" >> Makefile -echo -e "\tmake -C containers/unit_tests test" >> Makefile -echo -e "\tmake -C containers/performance_tests test" >> Makefile -echo -e "\tmake -C algorithms/unit_tests test" >> Makefile +echo -e "\t\$(MAKE) -C core/unit_test test" >> Makefile +echo -e "\t\$(MAKE) -C core/perf_test test" >> Makefile +echo -e "\t\$(MAKE) -C containers/unit_tests test" >> Makefile +echo -e "\t\$(MAKE) -C containers/performance_tests test" >> Makefile +echo -e "\t\$(MAKE) -C algorithms/unit_tests test" >> Makefile if [ ${KOKKOS_DO_EXAMPLES} -gt 0 ]; then -echo -e "\tmake -C example/fixture test" >> Makefile -echo -e "\tmake -C example/feint test" >> Makefile -echo -e "\tmake -C example/fenl test" >> Makefile -echo -e "\tmake -C example/tutorial test" >> Makefile +echo -e "\t\$(MAKE) -C example/fixture test" >> Makefile +echo -e "\t\$(MAKE) -C example/feint test" >> Makefile +echo -e "\t\$(MAKE) -C example/fenl test" >> Makefile +echo -e "\t\$(MAKE) -C example/tutorial test" >> Makefile fi echo "" >> Makefile echo "unit-tests-only:" >> Makefile -echo -e "\tmake -C core/unit_test test" >> Makefile -echo -e "\tmake -C containers/unit_tests test" >> Makefile -echo -e "\tmake -C algorithms/unit_tests test" >> Makefile +echo -e "\t\$(MAKE) -C core/unit_test test" >> Makefile +echo -e "\t\$(MAKE) -C containers/unit_tests test" >> Makefile +echo -e "\t\$(MAKE) -C algorithms/unit_tests test" >> Makefile echo "" >> Makefile + echo "clean:" >> Makefile -echo -e "\tmake -C core/unit_test clean" >> Makefile -echo -e "\tmake -C core/perf_test clean" >> Makefile -echo -e "\tmake -C containers/unit_tests clean" >> Makefile -echo -e "\tmake -C containers/performance_tests clean" >> Makefile -echo -e "\tmake -C algorithms/unit_tests clean" >> Makefile +echo -e "\t\$(MAKE) -C core/unit_test clean" >> Makefile +echo -e "\t\$(MAKE) -C core/perf_test clean" >> Makefile +echo -e "\t\$(MAKE) -C containers/unit_tests clean" >> Makefile +echo -e "\t\$(MAKE) -C containers/performance_tests clean" >> Makefile +echo -e "\t\$(MAKE) -C algorithms/unit_tests clean" >> Makefile if [ ${KOKKOS_DO_EXAMPLES} -gt 0 ]; then -echo -e "\tmake -C example/fixture clean" >> Makefile -echo -e "\tmake -C example/feint clean" >> Makefile -echo -e "\tmake -C example/fenl clean" >> Makefile -echo -e "\tmake -C example/tutorial clean" >> Makefile +echo -e "\t\$(MAKE) -C example/fixture clean" >> Makefile +echo -e "\t\$(MAKE) -C example/feint clean" >> Makefile +echo -e "\t\$(MAKE) -C example/fenl clean" >> Makefile +echo -e "\t\$(MAKE) -C example/tutorial clean" >> Makefile fi echo -e "\tcd core; \\" >> Makefile -echo -e "\tmake -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} clean" >> Makefile +echo -e "\t\$(MAKE) -f ${KOKKOS_PATH}/core/src/Makefile ${KOKKOS_SETTINGS} clean" >> Makefile + diff --git a/lib/latte/.gitignore b/lib/latte/.gitignore new file mode 100644 index 0000000000..a4c2a2362e --- /dev/null +++ b/lib/latte/.gitignore @@ -0,0 +1,5 @@ +# files and folders to ignore +/filelink +/liblink +/includelink +/LATTE-master diff --git a/lib/latte/Install.py b/lib/latte/Install.py new file mode 100644 index 0000000000..37cb5d6b17 --- /dev/null +++ b/lib/latte/Install.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python + +# Install.py tool to download, unpack, build, and link to the LATTE library +# used to automate the steps described in the README file in this dir + +from __future__ import print_function +import sys,os,re,subprocess + +# help message + +help = """ +Syntax from src dir: make lib-latte args="-b" + make lib-latte args="-p /usr/local/latte" + make lib-latte args="-m gfortran" +Syntax from lib dir: python Install.py -b + python Install.py -p /usr/local/latte + python Install.py -m gfortran + +specify one or more options, order does not matter + + -b = download and build the LATTE library + -p = specify folder of existing LATTE installation + -m = copy Makefile.lammps.suffix to Makefile.lammps + +Example: + +make lib-latte args="-b -m gfortran" # download/build in lib/latte +make lib-latte args="-p $HOME/latte" # use existing LATTE installation +""" + +# settings + +url = "https://github.com/lanl/LATTE/archive/master.tar.gz" + +# print error message or help + +def error(str=None): + if not str: print(help) + else: print("ERROR",str) + sys.exit() + +# expand to full path name +# process leading '~' or relative path + +def fullpath(path): + return os.path.abspath(os.path.expanduser(path)) + +def which(program): + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + +def geturl(url,fname): + success = False + + if which('curl') != None: + cmd = 'curl -L -o "%s" %s' % (fname,url) + print(cmd) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling curl failed with: %s" % e.output.decode('UTF-8')) + + if not success and which('wget') != None: + cmd = 'wget -O "%s" %s' % (fname,url) + print(cmd) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling wget failed with: %s" % e.output.decode('UTF-8')) + + if not success: + error("Failed to download source code with 'curl' or 'wget'") + return + +# parse args + +args = sys.argv[1:] +nargs = len(args) +if nargs == 0: error() + +homepath = "." +homedir = "LATTE-master" + +buildflag = False +pathflag = False +suffixflag = False +linkflag = True + +iarg = 0 +while iarg < nargs: + if args[iarg] == "-p": + if iarg+2 > nargs: error() + lattedir = fullpath(args[iarg+1]) + pathflag = True + iarg += 2 + elif args[iarg] == "-b": + buildflag = True + iarg += 1 + elif args[iarg] == "-m": + if iarg+2 > nargs: error() + suffix = args[iarg+1] + suffixflag = True + iarg += 2 + else: error() + +if (buildflag and pathflag): + error("Cannot use -b and -p flag at the same time") + +if buildflag: + lattepath = fullpath(homepath) + lattedir = "%s/%s" % (lattepath,homedir) + +if pathflag: + if not os.path.isdir(lattedir): error("LATTE path does not exist") + +# download and unpack LATTE tarball + +if buildflag: + print("Downloading LATTE ...") + geturl(url,"master.tar.gz") + + print("Unpacking LATTE zipfile ...") + if os.path.exists(lattedir): + cmd = 'rm -rf "%s"' % lattedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s"; tar zxvf master.tar.gz' % lattepath + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + os.remove("%s/master.tar.gz" % lattepath) + +# build LATTE + +if buildflag: + print("Building LATTE ...") + cmd = 'cd "%s"; make' % lattedir + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + print(txt.decode('UTF-8')) + +# create 3 links in lib/latte to LATTE dirs +# do this -b or -p is set + +if buildflag or pathflag: + print("Creating links to LATTE files") + if os.path.isfile("includelink") or os.path.islink("includelink"): + os.remove("includelink") + if os.path.isfile("liblink") or os.path.islink("liblink"): + os.remove("liblink") + if os.path.isfile("filelink.o") or os.path.islink("filelink.o"): + os.remove("filelink.o") + cmd = 'ln -s "%s/src" includelink' % lattedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'ln -s "%s" liblink' % lattedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'ln -s "%s/src/latte_c_bind.o" filelink.o' % lattedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + +# copy Makefile.lammps.suffix to Makefile.lammps + +if suffixflag: + print("Creating Makefile.lammps") + if os.path.exists("Makefile.lammps.%s" % suffix): + cmd = 'cp Makefile.lammps.%s Makefile.lammps' % suffix + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) diff --git a/lib/latte/Makefile.lammps.gfortran b/lib/latte/Makefile.lammps.gfortran new file mode 100644 index 0000000000..6aa7782f8a --- /dev/null +++ b/lib/latte/Makefile.lammps.gfortran @@ -0,0 +1,7 @@ +# Settings that the LAMMPS build will import when this package library is used + +# GNU Fortran settings + +latte_SYSINC = +latte_SYSLIB = ../../lib/latte/filelink.o -llatte -lgfortran -llapack -lblas +latte_SYSPATH = -fopenmp diff --git a/lib/latte/Makefile.lammps.ifort b/lib/latte/Makefile.lammps.ifort new file mode 100644 index 0000000000..0491bdd8a5 --- /dev/null +++ b/lib/latte/Makefile.lammps.ifort @@ -0,0 +1,12 @@ +# Settings that the LAMMPS build will import when this package library is used + +# Intel ifort settings + +latte_SYSINC = +latte_SYSLIB = ../../lib/latte/filelink.o \ + -llatte -lifcore -lsvml -lompstub -limf -lmkl_intel_lp64 \ + -lmkl_intel_thread -lmkl_core -lmkl_intel_thread -lpthread \ + -openmp -O0 +latte_SYSPATH = -openmp -L${MKLROOT}/lib/intel64 -lmkl_lapack95_lp64 \ + -L/opt/intel/composer_xe_2013_sp1.2.144/compiler/lib/intel64 + diff --git a/lib/latte/Makefile.lammps.linalg b/lib/latte/Makefile.lammps.linalg new file mode 100644 index 0000000000..af062a87e3 --- /dev/null +++ b/lib/latte/Makefile.lammps.linalg @@ -0,0 +1,7 @@ +# Settings that the LAMMPS build will import when this package library is used + +# GNU Fortran settings for use with bundled linalg lib + +latte_SYSINC = +latte_SYSLIB = ../../lib/latte/filelink.o -llatte -llinalg -lgfortran +latte_SYSPATH = -L../../lib/linalg -fopenmp diff --git a/lib/latte/Makefile.lammps.mpi b/lib/latte/Makefile.lammps.mpi new file mode 120000 index 0000000000..28dd3a614c --- /dev/null +++ b/lib/latte/Makefile.lammps.mpi @@ -0,0 +1 @@ +Makefile.lammps.linalg \ No newline at end of file diff --git a/lib/latte/Makefile.lammps.serial b/lib/latte/Makefile.lammps.serial new file mode 120000 index 0000000000..28dd3a614c --- /dev/null +++ b/lib/latte/Makefile.lammps.serial @@ -0,0 +1 @@ +Makefile.lammps.linalg \ No newline at end of file diff --git a/lib/latte/README b/lib/latte/README new file mode 100644 index 0000000000..bdf67dd59c --- /dev/null +++ b/lib/latte/README @@ -0,0 +1,56 @@ +This directory contains links to the LATTE library which is required +to use the LATTE package and its fix latte command in a LAMMPS input +script. + +Information about the LATTE DFTB code can be found at: +https://github.com/lanl/LATTE + +The LATTE development effort is led by Marc Cawkwell and +Anders Niklasson at Los Alamos National Laboratory. + +You can type "make lib-latte" from the src directory to see help on +how to download and build this library via make commands, or you can +do the same thing by typing "python Install.py" from within this +directory, or you can do it manually by following the instructions +below. + +----------------- + +Instructions: + +1. Download or clone the LATTE source code from + https://github.com/lanl/LATTE. If you download a zipfile + or tarball, unpack the tarball either in this /lib/latte + directory or somewhere else on your system. + +2. Modify the makefile.CHOICES according to your system architecture + and compilers. Check that the MAKELIB flag is ON in makefile.CHOICES + and finally, build the code via the make command + % make + +3. Create three symbolic links in this dir (lib/latte) + E.g if you built LATTE in this dir: + % ln -s ./LATTE-master/src includelink + % ln -s ./LATTE-master liblink + % ln -s ./LATTE-master/src/latte_c_bind.o filelink.o + +4. Choose a Makefile.lammps.* file appropriate for your compiler + (GNU gfortran with external BLAS, GNU gfortran with local liblinalg, + or Intel ifort with MKL) and copy it to Makefile.lammps. + Note that you may need to edit Makefile.lammps for paths + and compiler options appropriate to your system. + +----------------- + +When these steps are complete you can build LAMMPS +with the LATTE package installed: + +% cd lammps/src +% make yes-latte +% make g++ (or whatever target you wish) + +Note that if you download and unpack a new LAMMPS tarball, the +"includelink" and "liblink" and "filelink.o" symbolic links will be +lost and you will need to re-create them (step 3). If you built LATTE +in this directory (as opposed to somewhere else on your system), you +will also need to repeat steps 1,2,4. diff --git a/lib/linalg/Install.py b/lib/linalg/Install.py deleted file mode 100644 index c7076ca52f..0000000000 --- a/lib/linalg/Install.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python - -# install.py tool to do build of the linear algebra library -# used to automate the steps described in the README file in this dir - -import sys,commands,os - -# help message - -help = """ -Syntax: python Install.py -m machine - -m = peform a clean followed by "make -f Makefile.machine" - machine = suffix of a lib/Makefile.* file -""" - -# print error message or help - -def error(str=None): - if not str: print help - else: print "ERROR",str - sys.exit() - -# parse args - -args = sys.argv[1:] -nargs = len(args) -if nargs == 0: error() - -machine = None - -iarg = 0 -while iarg < nargs: - if args[iarg] == "-m": - if iarg+2 > nargs: error() - machine = args[iarg+1] - iarg += 2 - else: error() - -# set lib from working dir - -cwd = os.getcwd() -lib = os.path.basename(cwd) - -# make the library - -print "Building lib%s.a ..." % lib -cmd = "make -f Makefile.%s clean; make -f Makefile.%s" % (machine,machine) -txt = commands.getoutput(cmd) -print txt - -if os.path.exists("lib%s.a" % lib): print "Build was successful" -else: error("Build of lib/%s/lib%s.a was NOT successful" % (lib,lib)) diff --git a/lib/linalg/Install.py b/lib/linalg/Install.py new file mode 120000 index 0000000000..ffe709d44c --- /dev/null +++ b/lib/linalg/Install.py @@ -0,0 +1 @@ +../Install.py \ No newline at end of file diff --git a/lib/linalg/Makefile.gfortran b/lib/linalg/Makefile.gfortran index 89b7f2d7a0..7e1d97a5bc 100644 --- a/lib/linalg/Makefile.gfortran +++ b/lib/linalg/Makefile.gfortran @@ -18,10 +18,8 @@ OBJ = $(SRC:.f=.o) # ------ SETTINGS ------ FC = gfortran -FFLAGS = -O3 -fPIC -march=native -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing -Wall -W -Wno-uninitialized -fno-second-underscore -FFLAGS0 = -O0 -fPIC -march=native -mpc64 \ - -Wall -W -Wno-uninitialized -fno-second-underscore +FFLAGS = -O3 -fPIC -ffast-math -fstrict-aliasing -fno-second-underscore +FFLAGS0 = -O0 -fPIC -fno-second-underscore ARCHIVE = ar AR = ar ARCHFLAG = -rcs @@ -47,7 +45,7 @@ dlamch.o: dlamch.f # ------ CLEAN ------ clean: - -rm *.o *.mod *~ $(LIB) + -rm -f *.o *.mod *~ $(LIB) tar: -tar -czvf ../linalg.tar.gz $(FILES) diff --git a/lib/linalg/Makefile.mingw32-cross b/lib/linalg/Makefile.mingw32-cross deleted file mode 100644 index 02aa3f71a3..0000000000 --- a/lib/linalg/Makefile.mingw32-cross +++ /dev/null @@ -1,67 +0,0 @@ -# -*- makefile -*- -# *_________________________________________________________________________* -# * Minimal BLAS/LAPACK Library for use by other LAMMPS packages - -SHELL = /bin/sh - -# ------ FILES ------ - -SRC = $(wildcard *.f) - -FILES = $(SRC) Makefile.* README - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw32/ -LIB = $(DIR)liblinalg.a -OBJ = $(SRC:%.f=$(DIR)%.o) - -# ------ SETTINGS ------ - -FC = i686-w64-mingw32-gfortran -FFLAGS = -O3 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing -Wall -W \ - -Wno-uninitialized -fno-second-underscore -FFLAGS0 = -O0 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -Wall -W -Wno-uninitialized -fno-second-underscore -ARCHIVE = i686-w64-mingw32-ar -AR = i686-w64-mingw32-ar -ARCHFLAG = -rcs -USRLIB = -SYSLIB = - -.PHONY: default clean tar - -.SUFFIXES: -.SUFFIXES: .F .f .o - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - -$(DIR): - mkdir $(DIR) - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.F - $(F90) $(F90FLAGS) -c $< -o $@ - -$(DIR)%.o:%.f - $(FC) $(FFLAGS) -c $< -o $@ - -$(DIR)dlamch.o: dlamch.f - $(FC) $(FFLAGS0) -c $< -o $@ - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.mod *~ $(LIB) - -rmdir $(DIR) - -tar: - -tar -czvf ../linalg.tar.gz $(FILES) - diff --git a/lib/linalg/Makefile.mingw32-cross-mpi b/lib/linalg/Makefile.mingw32-cross-mpi deleted file mode 100644 index 1e35c5b461..0000000000 --- a/lib/linalg/Makefile.mingw32-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw32-cross - -rm -f Obj_mingw32-mpi - ln -s Obj_mingw32 Obj_mingw32-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw32-cross - -rm -f Obj_mingw32-mpi - diff --git a/lib/linalg/Makefile.mingw64-cross b/lib/linalg/Makefile.mingw64-cross deleted file mode 100644 index ee6eef819b..0000000000 --- a/lib/linalg/Makefile.mingw64-cross +++ /dev/null @@ -1,67 +0,0 @@ -# -*- makefile -*- -# *_________________________________________________________________________* -# * Minimal BLAS/LAPACK Library for use by other LAMMPS packages - -SHELL = /bin/sh - -# ------ FILES ------ - -SRC = $(wildcard *.f) - -FILES = $(SRC) Makefile.* README - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw64/ -LIB = $(DIR)liblinalg.a -OBJ = $(SRC:%.f=$(DIR)%.o) - -# ------ SETTINGS ------ - -FC = x86_64-w64-mingw32-gfortran -FFLAGS = -O3 -march=core2 -mtune=generic -msse2 -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing -Wall -W \ - -Wno-uninitialized -fno-second-underscore -FFLAGS0 = -O0 -march=core2 -mtune=generic -msse2 -mpc64 \ - -Wall -W -Wno-uninitialized -fno-second-underscore -ARCHIVE = x86_64-w64-mingw32-ar -AR = x86_64-w64-mingw32-ar -ARCHFLAG = -rcs -USRLIB = -SYSLIB = - -.PHONY: default clean tar - -.SUFFIXES: -.SUFFIXES: .F .f .o - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - -$(DIR): - mkdir $(DIR) - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.F - $(F90) $(F90FLAGS) -c $< -o $@ - -$(DIR)%.o:%.f - $(FC) $(FFLAGS) -c $< -o $@ - -$(DIR)dlamch.o: dlamch.f - $(FC) $(FFLAGS0) -c $< -o $@ - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.mod *~ $(LIB) - -rmdir $(DIR) - -tar: - -tar -czvf ../linalg.tar.gz $(FILES) - diff --git a/lib/linalg/Makefile.mingw64-cross-mpi b/lib/linalg/Makefile.mingw64-cross-mpi deleted file mode 100644 index ca6f4a6d43..0000000000 --- a/lib/linalg/Makefile.mingw64-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw64-cross - -rm -f Obj_mingw64-mpi - ln -s Obj_mingw64 Obj_mingw64-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw64-cross - -rm -f Obj_mingw64-mpi - diff --git a/lib/linalg/Makefile.mpi b/lib/linalg/Makefile.mpi new file mode 100644 index 0000000000..dd22ff134c --- /dev/null +++ b/lib/linalg/Makefile.mpi @@ -0,0 +1,52 @@ +# -*- makefile -*- +# *_________________________________________________________________________* +# * Minimal BLAS/LAPACK Library for use by other LAMMPS packages + +SHELL = /bin/sh + +# ------ FILES ------ + +SRC = $(wildcard *.f) + +FILES = $(SRC) Makefile.* README + +# ------ DEFINITIONS ------ + +LIB = liblinalg.a +OBJ = $(SRC:.f=.o) + +# ------ SETTINGS ------ + +FC = mpifort +FFLAGS = -O3 -fPIC +FFLAGS0 = -O0 -fPIC +ARCHIVE = ar +AR = ar +ARCHFLAG = -rcs +USRLIB = +SYSLIB = + +# ------ MAKE PROCEDURE ------ + +lib: $(OBJ) + $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) + +# ------ COMPILE RULES ------ + +%.o:%.F + $(F90) $(F90FLAGS) -c $< + +%.o:%.f + $(FC) $(FFLAGS) -c $< + +dlamch.o: dlamch.f + $(FC) $(FFLAGS0) -c $< + +# ------ CLEAN ------ + +clean: + -rm -f *.o *.mod *~ $(LIB) + +tar: + -tar -czvf ../linalg.tar.gz $(FILES) + diff --git a/lib/linalg/Makefile.serial b/lib/linalg/Makefile.serial new file mode 120000 index 0000000000..c52fbcb986 --- /dev/null +++ b/lib/linalg/Makefile.serial @@ -0,0 +1 @@ +Makefile.gfortran \ No newline at end of file diff --git a/lib/linalg/dcabs1.f b/lib/linalg/dcabs1.f new file mode 100644 index 0000000000..f6debb9ac2 --- /dev/null +++ b/lib/linalg/dcabs1.f @@ -0,0 +1,58 @@ +*> \brief \b DCABS1 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* DOUBLE PRECISION FUNCTION DCABS1(Z) +* +* .. Scalar Arguments .. +* COMPLEX*16 Z +* .. +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DCABS1 computes absolute value of a double complex number +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup double_blas_level1 +* +* ===================================================================== + DOUBLE PRECISION FUNCTION DCABS1(Z) +* +* -- Reference BLAS level1 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 Z +* .. +* .. +* ===================================================================== +* +* .. Intrinsic Functions .. + INTRINSIC ABS,DBLE,DIMAG +* + DCABS1 = ABS(DBLE(Z)) + ABS(DIMAG(Z)) + RETURN + END diff --git a/lib/linalg/dgesv.f b/lib/linalg/dgesv.f new file mode 100644 index 0000000000..8d47f839dc --- /dev/null +++ b/lib/linalg/dgesv.f @@ -0,0 +1,179 @@ +*> \brief DGESV computes the solution to system of linear equations A * X = B for GE matrices +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DGESV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, LDA, LDB, N, NRHS +* .. +* .. Array Arguments .. +* INTEGER IPIV( * ) +* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DGESV computes the solution to a real system of linear equations +*> A * X = B, +*> where A is an N-by-N matrix and X and B are N-by-NRHS matrices. +*> +*> The LU decomposition with partial pivoting and row interchanges is +*> used to factor A as +*> A = P * L * U, +*> where P is a permutation matrix, L is unit lower triangular, and U is +*> upper triangular. The factored form of A is then used to solve the +*> system of equations A * X = B. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of linear equations, i.e., the order of the +*> matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in] NRHS +*> \verbatim +*> NRHS is INTEGER +*> The number of right hand sides, i.e., the number of columns +*> of the matrix B. NRHS >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On entry, the N-by-N coefficient matrix A. +*> On exit, the factors L and U from the factorization +*> A = P*L*U; the unit diagonal elements of L are not stored. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] IPIV +*> \verbatim +*> IPIV is INTEGER array, dimension (N) +*> The pivot indices that define the permutation matrix P; +*> row i of the matrix was interchanged with row IPIV(i). +*> \endverbatim +*> +*> \param[in,out] B +*> \verbatim +*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) +*> On entry, the N-by-NRHS matrix of right hand side matrix B. +*> On exit, if INFO = 0, the N-by-NRHS solution matrix X. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> The leading dimension of the array B. LDB >= max(1,N). +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: if INFO = i, U(i,i) is exactly zero. The factorization +*> has been completed, but the factor U is exactly +*> singular, so the solution could not be computed. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup doubleGEsolve +* +* ===================================================================== + SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) +* +* -- LAPACK driver routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INFO, LDA, LDB, N, NRHS +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + DOUBLE PRECISION A( LDA, * ), B( LDB, * ) +* .. +* +* ===================================================================== +* +* .. External Subroutines .. + EXTERNAL DGETRF, DGETRS, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -4 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -7 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DGESV ', -INFO ) + RETURN + END IF +* +* Compute the LU factorization of A. +* + CALL DGETRF( N, N, A, LDA, IPIV, INFO ) + IF( INFO.EQ.0 ) THEN +* +* Solve the system A*X = B, overwriting B with X. +* + CALL DGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, B, LDB, + $ INFO ) + END IF + RETURN +* +* End of DGESV +* + END diff --git a/lib/linalg/dgetrs.f b/lib/linalg/dgetrs.f new file mode 100644 index 0000000000..02e9832af7 --- /dev/null +++ b/lib/linalg/dgetrs.f @@ -0,0 +1,225 @@ +*> \brief \b DGETRS +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DGETRS + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER TRANS +* INTEGER INFO, LDA, LDB, N, NRHS +* .. +* .. Array Arguments .. +* INTEGER IPIV( * ) +* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DGETRS solves a system of linear equations +*> A * X = B or A**T * X = B +*> with a general N-by-N matrix A using the LU factorization computed +*> by DGETRF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] TRANS +*> \verbatim +*> TRANS is CHARACTER*1 +*> Specifies the form of the system of equations: +*> = 'N': A * X = B (No transpose) +*> = 'T': A**T* X = B (Transpose) +*> = 'C': A**T* X = B (Conjugate transpose = Transpose) +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in] NRHS +*> \verbatim +*> NRHS is INTEGER +*> The number of right hand sides, i.e., the number of columns +*> of the matrix B. NRHS >= 0. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> The factors L and U from the factorization A = P*L*U +*> as computed by DGETRF. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[in] IPIV +*> \verbatim +*> IPIV is INTEGER array, dimension (N) +*> The pivot indices from DGETRF; for 1<=i<=N, row i of the +*> matrix was interchanged with row IPIV(i). +*> \endverbatim +*> +*> \param[in,out] B +*> \verbatim +*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) +*> On entry, the right hand side matrix B. +*> On exit, the solution matrix X. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> The leading dimension of the array B. LDB >= max(1,N). +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup doubleGEcomputational +* +* ===================================================================== + SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER TRANS + INTEGER INFO, LDA, LDB, N, NRHS +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + DOUBLE PRECISION A( LDA, * ), B( LDB, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE + PARAMETER ( ONE = 1.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL NOTRAN +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL DLASWP, DTRSM, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + NOTRAN = LSAME( TRANS, 'N' ) + IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. + $ LSAME( TRANS, 'C' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -5 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DGETRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* + IF( NOTRAN ) THEN +* +* Solve A * X = B. +* +* Apply row interchanges to the right hand sides. +* + CALL DLASWP( NRHS, B, LDB, 1, N, IPIV, 1 ) +* +* Solve L*X = B, overwriting B with X. +* + CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS, + $ ONE, A, LDA, B, LDB ) +* +* Solve U*X = B, overwriting B with X. +* + CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N, + $ NRHS, ONE, A, LDA, B, LDB ) + ELSE +* +* Solve A**T * X = B. +* +* Solve U**T *X = B, overwriting B with X. +* + CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS, + $ ONE, A, LDA, B, LDB ) +* +* Solve L**T *X = B, overwriting B with X. +* + CALL DTRSM( 'Left', 'Lower', 'Transpose', 'Unit', N, NRHS, ONE, + $ A, LDA, B, LDB ) +* +* Apply row interchanges to the solution vectors. +* + CALL DLASWP( NRHS, B, LDB, 1, N, IPIV, -1 ) + END IF +* + RETURN +* +* End of DGETRS +* + END diff --git a/lib/linalg/dladiv.f b/lib/linalg/dladiv.f new file mode 100644 index 0000000000..306a6b0020 --- /dev/null +++ b/lib/linalg/dladiv.f @@ -0,0 +1,128 @@ +*> \brief \b DLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DLADIV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DLADIV( A, B, C, D, P, Q ) +* +* .. Scalar Arguments .. +* DOUBLE PRECISION A, B, C, D, P, Q +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DLADIV performs complex division in real arithmetic +*> +*> a + i*b +*> p + i*q = --------- +*> c + i*d +*> +*> The algorithm is due to Robert L. Smith and can be found +*> in D. Knuth, The art of Computer Programming, Vol.2, p.195 +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] A +*> \verbatim +*> A is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] C +*> \verbatim +*> C is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] D +*> \verbatim +*> D is DOUBLE PRECISION +*> The scalars a, b, c, and d in the above expression. +*> \endverbatim +*> +*> \param[out] P +*> \verbatim +*> P is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[out] Q +*> \verbatim +*> Q is DOUBLE PRECISION +*> The scalars p and q in the above expression. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup auxOTHERauxiliary +* +* ===================================================================== + SUBROUTINE DLADIV( A, B, C, D, P, Q ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + DOUBLE PRECISION A, B, C, D, P, Q +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + DOUBLE PRECISION E, F +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS +* .. +* .. Executable Statements .. +* + IF( ABS( D ).LT.ABS( C ) ) THEN + E = D / C + F = C + D*E + P = ( A+B*E ) / F + Q = ( B-A*E ) / F + ELSE + E = C / D + F = D + C*E + P = ( B+A*E ) / F + Q = ( -A+B*E ) / F + END IF +* + RETURN +* +* End of DLADIV +* + END diff --git a/lib/linalg/dlapy3.f b/lib/linalg/dlapy3.f new file mode 100644 index 0000000000..23feecc447 --- /dev/null +++ b/lib/linalg/dlapy3.f @@ -0,0 +1,111 @@ +*> \brief \b DLAPY3 returns sqrt(x2+y2+z2). +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DLAPY3 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) +* +* .. Scalar Arguments .. +* DOUBLE PRECISION X, Y, Z +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause +*> unnecessary overflow. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] X +*> \verbatim +*> X is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] Y +*> \verbatim +*> Y is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] Z +*> \verbatim +*> Z is DOUBLE PRECISION +*> X, Y and Z specify the values x, y and z. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup auxOTHERauxiliary +* +* ===================================================================== + DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + DOUBLE PRECISION X, Y, Z +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D0 ) +* .. +* .. Local Scalars .. + DOUBLE PRECISION W, XABS, YABS, ZABS +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, SQRT +* .. +* .. Executable Statements .. +* + XABS = ABS( X ) + YABS = ABS( Y ) + ZABS = ABS( Z ) + W = MAX( XABS, YABS, ZABS ) + IF( W.EQ.ZERO ) THEN +* W can be zero for max(0,nan,0) +* adding all three entries together will make sure +* NaN will not disappear. + DLAPY3 = XABS + YABS + ZABS + ELSE + DLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+ + $ ( ZABS / W )**2 ) + END IF + RETURN +* +* End of DLAPY3 +* + END diff --git a/lib/linalg/dorg2l.f b/lib/linalg/dorg2l.f new file mode 100644 index 0000000000..b95fa50fc5 --- /dev/null +++ b/lib/linalg/dorg2l.f @@ -0,0 +1,198 @@ +*> \brief \b DORG2L generates all or part of the orthogonal matrix Q from a QL factorization determined by sgeqlf (unblocked algorithm). +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DORG2L + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DORG2L generates an m by n real matrix Q with orthonormal columns, +*> which is defined as the last n columns of a product of k elementary +*> reflectors of order m +*> +*> Q = H(k) . . . H(2) H(1) +*> +*> as returned by DGEQLF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. M >= N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. N >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On entry, the (n-k+i)-th column must contain the vector which +*> defines the elementary reflector H(i), for i = 1,2,...,k, as +*> returned by DGEQLF in the last k columns of its array +*> argument A. +*> On exit, the m by n matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is DOUBLE PRECISION array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by DGEQLF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (N) +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup doubleOTHERcomputational +* +* ===================================================================== + SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, II, J, L +* .. +* .. External Subroutines .. + EXTERNAL DLARF, DSCAL, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 .OR. N.GT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.N ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DORG2L', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) + $ RETURN +* +* Initialise columns 1:n-k to columns of the unit matrix +* + DO 20 J = 1, N - K + DO 10 L = 1, M + A( L, J ) = ZERO + 10 CONTINUE + A( M-N+J, J ) = ONE + 20 CONTINUE +* + DO 40 I = 1, K + II = N - K + I +* +* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left +* + A( M-N+II, II ) = ONE + CALL DLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A, + $ LDA, WORK ) + CALL DSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 ) + A( M-N+II, II ) = ONE - TAU( I ) +* +* Set A(m-k+i+1:m,n-k+i) to zero +* + DO 30 L = M - N + II + 1, M + A( L, II ) = ZERO + 30 CONTINUE + 40 CONTINUE + RETURN +* +* End of DORG2L +* + END diff --git a/lib/linalg/dorgql.f b/lib/linalg/dorgql.f new file mode 100644 index 0000000000..ca4698d799 --- /dev/null +++ b/lib/linalg/dorgql.f @@ -0,0 +1,296 @@ +*> \brief \b DORGQL +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DORGQL + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, LWORK, M, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DORGQL generates an M-by-N real matrix Q with orthonormal columns, +*> which is defined as the last N columns of a product of K elementary +*> reflectors of order M +*> +*> Q = H(k) . . . H(2) H(1) +*> +*> as returned by DGEQLF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. M >= N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. N >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On entry, the (n-k+i)-th column must contain the vector which +*> defines the elementary reflector H(i), for i = 1,2,...,k, as +*> returned by DGEQLF in the last k columns of its array +*> argument A. +*> On exit, the M-by-N matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is DOUBLE PRECISION array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by DGEQLF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The dimension of the array WORK. LWORK >= max(1,N). +*> For optimum performance LWORK >= N*NB, where NB is the +*> optimal blocksize. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup doubleOTHERcomputational +* +* ===================================================================== + SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, LWORK, M, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY + INTEGER I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT, + $ NB, NBMIN, NX +* .. +* .. External Subroutines .. + EXTERNAL DLARFB, DLARFT, DORG2L, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. External Functions .. + INTEGER ILAENV + EXTERNAL ILAENV +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + LQUERY = ( LWORK.EQ.-1 ) + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 .OR. N.GT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.N ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + END IF +* + IF( INFO.EQ.0 ) THEN + IF( N.EQ.0 ) THEN + LWKOPT = 1 + ELSE + NB = ILAENV( 1, 'DORGQL', ' ', M, N, K, -1 ) + LWKOPT = N*NB + END IF + WORK( 1 ) = LWKOPT +* + IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN + INFO = -8 + END IF + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DORGQL', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) THEN + RETURN + END IF +* + NBMIN = 2 + NX = 0 + IWS = N + IF( NB.GT.1 .AND. NB.LT.K ) THEN +* +* Determine when to cross over from blocked to unblocked code. +* + NX = MAX( 0, ILAENV( 3, 'DORGQL', ' ', M, N, K, -1 ) ) + IF( NX.LT.K ) THEN +* +* Determine if workspace is large enough for blocked code. +* + LDWORK = N + IWS = LDWORK*NB + IF( LWORK.LT.IWS ) THEN +* +* Not enough workspace to use optimal NB: reduce NB and +* determine the minimum value of NB. +* + NB = LWORK / LDWORK + NBMIN = MAX( 2, ILAENV( 2, 'DORGQL', ' ', M, N, K, -1 ) ) + END IF + END IF + END IF +* + IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN +* +* Use blocked code after the first block. +* The last kk columns are handled by the block method. +* + KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB ) +* +* Set A(m-kk+1:m,1:n-kk) to zero. +* + DO 20 J = 1, N - KK + DO 10 I = M - KK + 1, M + A( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + KK = 0 + END IF +* +* Use unblocked code for the first or only block. +* + CALL DORG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO ) +* + IF( KK.GT.0 ) THEN +* +* Use blocked code +* + DO 50 I = K - KK + 1, K, NB + IB = MIN( NB, K-I+1 ) + IF( N-K+I.GT.1 ) THEN +* +* Form the triangular factor of the block reflector +* H = H(i+ib-1) . . . H(i+1) H(i) +* + CALL DLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, + $ A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK ) +* +* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left +* + CALL DLARFB( 'Left', 'No transpose', 'Backward', + $ 'Columnwise', M-K+I+IB-1, N-K+I-1, IB, + $ A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA, + $ WORK( IB+1 ), LDWORK ) + END IF +* +* Apply H to rows 1:m-k+i+ib-1 of current block +* + CALL DORG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA, + $ TAU( I ), WORK, IINFO ) +* +* Set rows m-k+i+ib:m of current block to zero +* + DO 40 J = N - K + I, N - K + I + IB - 1 + DO 30 L = M - K + I + IB, M + A( L, J ) = ZERO + 30 CONTINUE + 40 CONTINUE + 50 CONTINUE + END IF +* + WORK( 1 ) = IWS + RETURN +* +* End of DORGQL +* + END diff --git a/lib/linalg/dorgtr.f b/lib/linalg/dorgtr.f new file mode 100644 index 0000000000..06a7b6cc1c --- /dev/null +++ b/lib/linalg/dorgtr.f @@ -0,0 +1,255 @@ +*> \brief \b DORGTR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DORGTR + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DORGTR generates a real orthogonal matrix Q which is defined as the +*> product of n-1 elementary reflectors of order N, as returned by +*> DSYTRD: +*> +*> if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), +*> +*> if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangle of A contains elementary reflectors +*> from DSYTRD; +*> = 'L': Lower triangle of A contains elementary reflectors +*> from DSYTRD. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix Q. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On entry, the vectors which define the elementary reflectors, +*> as returned by DSYTRD. +*> On exit, the N-by-N orthogonal matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is DOUBLE PRECISION array, dimension (N-1) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by DSYTRD. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The dimension of the array WORK. LWORK >= max(1,N-1). +*> For optimum performance LWORK >= (N-1)*NB, where NB is +*> the optimal blocksize. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup doubleOTHERcomputational +* +* ===================================================================== + SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE + PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY, UPPER + INTEGER I, IINFO, J, LWKOPT, NB +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + EXTERNAL LSAME, ILAENV +* .. +* .. External Subroutines .. + EXTERNAL DORGQL, DORGQR, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + LQUERY = ( LWORK.EQ.-1 ) + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -4 + ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN + INFO = -7 + END IF +* + IF( INFO.EQ.0 ) THEN + IF( UPPER ) THEN + NB = ILAENV( 1, 'DORGQL', ' ', N-1, N-1, N-1, -1 ) + ELSE + NB = ILAENV( 1, 'DORGQR', ' ', N-1, N-1, N-1, -1 ) + END IF + LWKOPT = MAX( 1, N-1 )*NB + WORK( 1 ) = LWKOPT + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DORGTR', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) THEN + WORK( 1 ) = 1 + RETURN + END IF +* + IF( UPPER ) THEN +* +* Q was determined by a call to DSYTRD with UPLO = 'U' +* +* Shift the vectors which define the elementary reflectors one +* column to the left, and set the last row and column of Q to +* those of the unit matrix +* + DO 20 J = 1, N - 1 + DO 10 I = 1, J - 1 + A( I, J ) = A( I, J+1 ) + 10 CONTINUE + A( N, J ) = ZERO + 20 CONTINUE + DO 30 I = 1, N - 1 + A( I, N ) = ZERO + 30 CONTINUE + A( N, N ) = ONE +* +* Generate Q(1:n-1,1:n-1) +* + CALL DORGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) +* + ELSE +* +* Q was determined by a call to DSYTRD with UPLO = 'L'. +* +* Shift the vectors which define the elementary reflectors one +* column to the right, and set the first row and column of Q to +* those of the unit matrix +* + DO 50 J = N, 2, -1 + A( 1, J ) = ZERO + DO 40 I = J + 1, N + A( I, J ) = A( I, J-1 ) + 40 CONTINUE + 50 CONTINUE + A( 1, 1 ) = ONE + DO 60 I = 2, N + A( I, 1 ) = ZERO + 60 CONTINUE + IF( N.GT.1 ) THEN +* +* Generate Q(2:n,2:n) +* + CALL DORGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, + $ LWORK, IINFO ) + END IF + END IF + WORK( 1 ) = LWKOPT + RETURN +* +* End of DORGTR +* + END diff --git a/lib/linalg/dsyev.f b/lib/linalg/dsyev.f new file mode 100644 index 0000000000..64b39ed847 --- /dev/null +++ b/lib/linalg/dsyev.f @@ -0,0 +1,286 @@ +*> \brief DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DSYEV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER JOBZ, UPLO +* INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DSYEV computes all eigenvalues and, optionally, eigenvectors of a +*> real symmetric matrix A. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] JOBZ +*> \verbatim +*> JOBZ is CHARACTER*1 +*> = 'N': Compute eigenvalues only; +*> = 'V': Compute eigenvalues and eigenvectors. +*> \endverbatim +*> +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangle of A is stored; +*> = 'L': Lower triangle of A is stored. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA, N) +*> On entry, the symmetric matrix A. If UPLO = 'U', the +*> leading N-by-N upper triangular part of A contains the +*> upper triangular part of the matrix A. If UPLO = 'L', +*> the leading N-by-N lower triangular part of A contains +*> the lower triangular part of the matrix A. +*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the +*> orthonormal eigenvectors of the matrix A. +*> If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') +*> or the upper triangle (if UPLO='U') of A, including the +*> diagonal, is destroyed. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] W +*> \verbatim +*> W is DOUBLE PRECISION array, dimension (N) +*> If INFO = 0, the eigenvalues in ascending order. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The length of the array WORK. LWORK >= max(1,3*N-1). +*> For optimal efficiency, LWORK >= (NB+2)*N, +*> where NB is the blocksize for DSYTRD returned by ILAENV. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: if INFO = i, the algorithm failed to converge; i +*> off-diagonal elements of an intermediate tridiagonal +*> form did not converge to zero. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup doubleSYeigen +* +* ===================================================================== + SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) +* +* -- LAPACK driver routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER JOBZ, UPLO + INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) +* .. +* .. Local Scalars .. + LOGICAL LOWER, LQUERY, WANTZ + INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE, + $ LLWORK, LWKOPT, NB + DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, + $ SMLNUM +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + DOUBLE PRECISION DLAMCH, DLANSY + EXTERNAL LSAME, ILAENV, DLAMCH, DLANSY +* .. +* .. External Subroutines .. + EXTERNAL DLASCL, DORGTR, DSCAL, DSTEQR, DSTERF, DSYTRD, + $ XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, SQRT +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + WANTZ = LSAME( JOBZ, 'V' ) + LOWER = LSAME( UPLO, 'L' ) + LQUERY = ( LWORK.EQ.-1 ) +* + INFO = 0 + IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN + INFO = -1 + ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN + INFO = -2 + ELSE IF( N.LT.0 ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -5 + END IF +* + IF( INFO.EQ.0 ) THEN + NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) + LWKOPT = MAX( 1, ( NB+2 )*N ) + WORK( 1 ) = LWKOPT +* + IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY ) + $ INFO = -8 + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DSYEV ', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) THEN + RETURN + END IF +* + IF( N.EQ.1 ) THEN + W( 1 ) = A( 1, 1 ) + WORK( 1 ) = 2 + IF( WANTZ ) + $ A( 1, 1 ) = ONE + RETURN + END IF +* +* Get machine constants. +* + SAFMIN = DLAMCH( 'Safe minimum' ) + EPS = DLAMCH( 'Precision' ) + SMLNUM = SAFMIN / EPS + BIGNUM = ONE / SMLNUM + RMIN = SQRT( SMLNUM ) + RMAX = SQRT( BIGNUM ) +* +* Scale matrix to allowable range, if necessary. +* + ANRM = DLANSY( 'M', UPLO, N, A, LDA, WORK ) + ISCALE = 0 + IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN + ISCALE = 1 + SIGMA = RMIN / ANRM + ELSE IF( ANRM.GT.RMAX ) THEN + ISCALE = 1 + SIGMA = RMAX / ANRM + END IF + IF( ISCALE.EQ.1 ) + $ CALL DLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO ) +* +* Call DSYTRD to reduce symmetric matrix to tridiagonal form. +* + INDE = 1 + INDTAU = INDE + N + INDWRK = INDTAU + N + LLWORK = LWORK - INDWRK + 1 + CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ), + $ WORK( INDWRK ), LLWORK, IINFO ) +* +* For eigenvalues only, call DSTERF. For eigenvectors, first call +* DORGTR to generate the orthogonal matrix, then call DSTEQR. +* + IF( .NOT.WANTZ ) THEN + CALL DSTERF( N, W, WORK( INDE ), INFO ) + ELSE + CALL DORGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ), + $ LLWORK, IINFO ) + CALL DSTEQR( JOBZ, N, W, WORK( INDE ), A, LDA, WORK( INDTAU ), + $ INFO ) + END IF +* +* If matrix was scaled, then rescale eigenvalues appropriately. +* + IF( ISCALE.EQ.1 ) THEN + IF( INFO.EQ.0 ) THEN + IMAX = N + ELSE + IMAX = INFO - 1 + END IF + CALL DSCAL( IMAX, ONE / SIGMA, W, 1 ) + END IF +* +* Set WORK(1) to optimal workspace size. +* + WORK( 1 ) = LWKOPT +* + RETURN +* +* End of DSYEV +* + END diff --git a/lib/linalg/dsygv.f b/lib/linalg/dsygv.f new file mode 100644 index 0000000000..e556318518 --- /dev/null +++ b/lib/linalg/dsygv.f @@ -0,0 +1,314 @@ +*> \brief \b DSYGST +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DSYGV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, +* LWORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER JOBZ, UPLO +* INTEGER INFO, ITYPE, LDA, LDB, LWORK, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DSYGV computes all the eigenvalues, and optionally, the eigenvectors +*> of a real generalized symmetric-definite eigenproblem, of the form +*> A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. +*> Here A and B are assumed to be symmetric and B is also +*> positive definite. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] ITYPE +*> \verbatim +*> ITYPE is INTEGER +*> Specifies the problem type to be solved: +*> = 1: A*x = (lambda)*B*x +*> = 2: A*B*x = (lambda)*x +*> = 3: B*A*x = (lambda)*x +*> \endverbatim +*> +*> \param[in] JOBZ +*> \verbatim +*> JOBZ is CHARACTER*1 +*> = 'N': Compute eigenvalues only; +*> = 'V': Compute eigenvalues and eigenvectors. +*> \endverbatim +*> +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangles of A and B are stored; +*> = 'L': Lower triangles of A and B are stored. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrices A and B. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA, N) +*> On entry, the symmetric matrix A. If UPLO = 'U', the +*> leading N-by-N upper triangular part of A contains the +*> upper triangular part of the matrix A. If UPLO = 'L', +*> the leading N-by-N lower triangular part of A contains +*> the lower triangular part of the matrix A. +*> +*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the +*> matrix Z of eigenvectors. The eigenvectors are normalized +*> as follows: +*> if ITYPE = 1 or 2, Z**T*B*Z = I; +*> if ITYPE = 3, Z**T*inv(B)*Z = I. +*> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') +*> or the lower triangle (if UPLO='L') of A, including the +*> diagonal, is destroyed. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[in,out] B +*> \verbatim +*> B is DOUBLE PRECISION array, dimension (LDB, N) +*> On entry, the symmetric positive definite matrix B. +*> If UPLO = 'U', the leading N-by-N upper triangular part of B +*> contains the upper triangular part of the matrix B. +*> If UPLO = 'L', the leading N-by-N lower triangular part of B +*> contains the lower triangular part of the matrix B. +*> +*> On exit, if INFO <= N, the part of B containing the matrix is +*> overwritten by the triangular factor U or L from the Cholesky +*> factorization B = U**T*U or B = L*L**T. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> The leading dimension of the array B. LDB >= max(1,N). +*> \endverbatim +*> +*> \param[out] W +*> \verbatim +*> W is DOUBLE PRECISION array, dimension (N) +*> If INFO = 0, the eigenvalues in ascending order. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The length of the array WORK. LWORK >= max(1,3*N-1). +*> For optimal efficiency, LWORK >= (NB+2)*N, +*> where NB is the blocksize for DSYTRD returned by ILAENV. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: DPOTRF or DSYEV returned an error code: +*> <= N: if INFO = i, DSYEV failed to converge; +*> i off-diagonal elements of an intermediate +*> tridiagonal form did not converge to zero; +*> > N: if INFO = N + i, for 1 <= i <= N, then the leading +*> minor of order i of B is not positive definite. +*> The factorization of B could not be completed and +*> no eigenvalues or eigenvectors were computed. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup doubleSYeigen +* +* ===================================================================== + SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, + $ LWORK, INFO ) +* +* -- LAPACK driver routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER JOBZ, UPLO + INTEGER INFO, ITYPE, LDA, LDB, LWORK, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE + PARAMETER ( ONE = 1.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY, UPPER, WANTZ + CHARACTER TRANS + INTEGER LWKMIN, LWKOPT, NB, NEIG +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + EXTERNAL LSAME, ILAENV +* .. +* .. External Subroutines .. + EXTERNAL DPOTRF, DSYEV, DSYGST, DTRMM, DTRSM, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + WANTZ = LSAME( JOBZ, 'V' ) + UPPER = LSAME( UPLO, 'U' ) + LQUERY = ( LWORK.EQ.-1 ) +* + INFO = 0 + IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN + INFO = -1 + ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN + INFO = -2 + ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN + INFO = -3 + ELSE IF( N.LT.0 ) THEN + INFO = -4 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -6 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -8 + END IF +* + IF( INFO.EQ.0 ) THEN + LWKMIN = MAX( 1, 3*N - 1 ) + NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) + LWKOPT = MAX( LWKMIN, ( NB + 2 )*N ) + WORK( 1 ) = LWKOPT +* + IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN + INFO = -11 + END IF + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DSYGV ', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Form a Cholesky factorization of B. +* + CALL DPOTRF( UPLO, N, B, LDB, INFO ) + IF( INFO.NE.0 ) THEN + INFO = N + INFO + RETURN + END IF +* +* Transform problem to standard eigenvalue problem and solve. +* + CALL DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) + CALL DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) +* + IF( WANTZ ) THEN +* +* Backtransform eigenvectors to the original problem. +* + NEIG = N + IF( INFO.GT.0 ) + $ NEIG = INFO - 1 + IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN +* +* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; +* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y +* + IF( UPPER ) THEN + TRANS = 'N' + ELSE + TRANS = 'T' + END IF +* + CALL DTRSM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE, + $ B, LDB, A, LDA ) +* + ELSE IF( ITYPE.EQ.3 ) THEN +* +* For B*A*x=(lambda)*x; +* backtransform eigenvectors: x = L*y or U**T*y +* + IF( UPPER ) THEN + TRANS = 'T' + ELSE + TRANS = 'N' + END IF +* + CALL DTRMM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE, + $ B, LDB, A, LDA ) + END IF + END IF +* + WORK( 1 ) = LWKOPT + RETURN +* +* End of DSYGV +* + END diff --git a/lib/linalg/dznrm2.f b/lib/linalg/dznrm2.f new file mode 100644 index 0000000000..b5713a2bfa --- /dev/null +++ b/lib/linalg/dznrm2.f @@ -0,0 +1,119 @@ +*> \brief \b DZNRM2 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) +* +* .. Scalar Arguments .. +* INTEGER INCX,N +* .. +* .. Array Arguments .. +* COMPLEX*16 X(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DZNRM2 returns the euclidean norm of a vector via the function +*> name, so that +*> +*> DZNRM2 := sqrt( x**H*x ) +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup double_blas_level1 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> -- This version written on 25-October-1982. +*> Modified on 14-October-1993 to inline the call to ZLASSQ. +*> Sven Hammarling, Nag Ltd. +*> \endverbatim +*> +* ===================================================================== + DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) +* +* -- Reference BLAS level1 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INCX,N +* .. +* .. Array Arguments .. + COMPLEX*16 X(*) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE,ZERO + PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) +* .. +* .. Local Scalars .. + DOUBLE PRECISION NORM,SCALE,SSQ,TEMP + INTEGER IX +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS,DBLE,DIMAG,SQRT +* .. + IF (N.LT.1 .OR. INCX.LT.1) THEN + NORM = ZERO + ELSE + SCALE = ZERO + SSQ = ONE +* The following loop is equivalent to this call to the LAPACK +* auxiliary routine: +* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) +* + DO 10 IX = 1,1 + (N-1)*INCX,INCX + IF (DBLE(X(IX)).NE.ZERO) THEN + TEMP = ABS(DBLE(X(IX))) + IF (SCALE.LT.TEMP) THEN + SSQ = ONE + SSQ* (SCALE/TEMP)**2 + SCALE = TEMP + ELSE + SSQ = SSQ + (TEMP/SCALE)**2 + END IF + END IF + IF (DIMAG(X(IX)).NE.ZERO) THEN + TEMP = ABS(DIMAG(X(IX))) + IF (SCALE.LT.TEMP) THEN + SSQ = ONE + SSQ* (SCALE/TEMP)**2 + SCALE = TEMP + ELSE + SSQ = SSQ + (TEMP/SCALE)**2 + END IF + END IF + 10 CONTINUE + NORM = SCALE*SQRT(SSQ) + END IF +* + DZNRM2 = NORM + RETURN +* +* End of DZNRM2. +* + END diff --git a/lib/linalg/ilazlc.f b/lib/linalg/ilazlc.f new file mode 100644 index 0000000000..718b277dfa --- /dev/null +++ b/lib/linalg/ilazlc.f @@ -0,0 +1,118 @@ +*> \brief \b ILAZLC scans a matrix for its last non-zero column. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ILAZLC + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* INTEGER FUNCTION ILAZLC( M, N, A, LDA ) +* +* .. Scalar Arguments .. +* INTEGER M, N, LDA +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ILAZLC scans A for its last non-zero column. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix A. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix A. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> The m by n matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,M). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + INTEGER FUNCTION ILAZLC( M, N, A, LDA ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER M, N, LDA +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) +* .. +* .. Local Scalars .. + INTEGER I +* .. +* .. Executable Statements .. +* +* Quick test for the common case where one corner is non-zero. + IF( N.EQ.0 ) THEN + ILAZLC = N + ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN + ILAZLC = N + ELSE +* Now scan each column from the end, returning with the first non-zero. + DO ILAZLC = N, 1, -1 + DO I = 1, M + IF( A(I, ILAZLC).NE.ZERO ) RETURN + END DO + END DO + END IF + RETURN + END diff --git a/lib/linalg/ilazlr.f b/lib/linalg/ilazlr.f new file mode 100644 index 0000000000..44697214c7 --- /dev/null +++ b/lib/linalg/ilazlr.f @@ -0,0 +1,121 @@ +*> \brief \b ILAZLR scans a matrix for its last non-zero row. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ILAZLR + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* INTEGER FUNCTION ILAZLR( M, N, A, LDA ) +* +* .. Scalar Arguments .. +* INTEGER M, N, LDA +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ILAZLR scans A for its last non-zero row. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix A. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix A. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> The m by n matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,M). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + INTEGER FUNCTION ILAZLR( M, N, A, LDA ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER M, N, LDA +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) +* .. +* .. Local Scalars .. + INTEGER I, J +* .. +* .. Executable Statements .. +* +* Quick test for the common case where one corner is non-zero. + IF( M.EQ.0 ) THEN + ILAZLR = M + ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN + ILAZLR = M + ELSE +* Scan up each column tracking the last zero row seen. + ILAZLR = 0 + DO J = 1, N + I=M + DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) + I=I-1 + ENDDO + ILAZLR = MAX( ILAZLR, I ) + END DO + END IF + RETURN + END diff --git a/lib/linalg/zaxpy.f b/lib/linalg/zaxpy.f new file mode 100644 index 0000000000..e6f5e1f6db --- /dev/null +++ b/lib/linalg/zaxpy.f @@ -0,0 +1,102 @@ +*> \brief \b ZAXPY +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) +* +* .. Scalar Arguments .. +* COMPLEX*16 ZA +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* COMPLEX*16 ZX(*),ZY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZAXPY constant times a vector plus a vector. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level1 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> jack dongarra, 3/11/78. +*> modified 12/3/93, array(1) declarations changed to array(*) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) +* +* -- Reference BLAS level1 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ZA + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + COMPLEX*16 ZX(*),ZY(*) +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I,IX,IY +* .. +* .. External Functions .. + DOUBLE PRECISION DCABS1 + EXTERNAL DCABS1 +* .. + IF (N.LE.0) RETURN + IF (DCABS1(ZA).EQ.0.0d0) RETURN + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 +* + DO I = 1,N + ZY(I) = ZY(I) + ZA*ZX(I) + END DO + ELSE +* +* code for unequal increments or equal increments +* not equal to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + ZY(IY) = ZY(IY) + ZA*ZX(IX) + IX = IX + INCX + IY = IY + INCY + END DO + END IF +* + RETURN + END diff --git a/lib/linalg/zcopy.f b/lib/linalg/zcopy.f new file mode 100644 index 0000000000..baeafd5c3b --- /dev/null +++ b/lib/linalg/zcopy.f @@ -0,0 +1,94 @@ +*> \brief \b ZCOPY +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) +* +* .. Scalar Arguments .. +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* COMPLEX*16 ZX(*),ZY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZCOPY copies a vector, x, to a vector, y. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level1 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> jack dongarra, linpack, 4/11/78. +*> modified 12/3/93, array(1) declarations changed to array(*) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) +* +* -- Reference BLAS level1 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + COMPLEX*16 ZX(*),ZY(*) +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I,IX,IY +* .. + IF (N.LE.0) RETURN + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 +* + DO I = 1,N + ZY(I) = ZX(I) + END DO + ELSE +* +* code for unequal increments or equal increments +* not equal to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + ZY(IY) = ZX(IX) + IX = IX + INCX + IY = IY + INCY + END DO + END IF + RETURN + END diff --git a/lib/linalg/zgemm.f b/lib/linalg/zgemm.f new file mode 100644 index 0000000000..f423315508 --- /dev/null +++ b/lib/linalg/zgemm.f @@ -0,0 +1,489 @@ +*> \brief \b ZGEMM +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,M,N +* CHARACTER TRANSA,TRANSB +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZGEMM performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T or op( X ) = X**H, +*> +*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) +*> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**H. +*> \endverbatim +*> +*> \param[in] TRANSB +*> \verbatim +*> TRANSB is CHARACTER*1 +*> On entry, TRANSB specifies the form of op( B ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSB = 'N' or 'n', op( B ) = B. +*> +*> TRANSB = 'T' or 't', op( B ) = B**T. +*> +*> TRANSB = 'C' or 'c', op( B ) = B**H. +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> On entry, M specifies the number of rows of the matrix +*> op( A ) and of the matrix C. M must be at least zero. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of columns of the matrix +*> op( B ) and the number of columns of the matrix C. N must be +*> at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry, K specifies the number of columns of the matrix +*> op( A ) and the number of rows of the matrix op( B ). K must +*> be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, ka ), where ka is +*> k when TRANSA = 'N' or 'n', and is m otherwise. +*> Before entry with TRANSA = 'N' or 'n', the leading m by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by m part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANSA = 'N' or 'n' then +*> LDA must be at least max( 1, m ), otherwise LDA must be at +*> least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is COMPLEX*16 array of DIMENSION ( LDB, kb ), where kb is +*> n when TRANSB = 'N' or 'n', and is k otherwise. +*> Before entry with TRANSB = 'N' or 'n', the leading k by n +*> part of the array B must contain the matrix B, otherwise +*> the leading n by k part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANSB = 'N' or 'n' then +*> LDB must be at least max( 1, k ), otherwise LDB must be at +*> least max( 1, n ). +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is COMPLEX*16 +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then C need not be set on input. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is COMPLEX*16 array of DIMENSION ( LDC, n ). +*> Before entry, the leading m by n part of the array C must +*> contain the matrix C, except when beta is zero, in which +*> case C need not be set on entry. +*> On exit, the array C is overwritten by the m by n matrix +*> ( alpha*op( A )*op( B ) + beta*C ). +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, m ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level3 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 8-February-1989. +*> Jack Dongarra, Argonne National Laboratory. +*> Iain Duff, AERE Harwell. +*> Jeremy Du Croz, Numerical Algorithms Group Ltd. +*> Sven Hammarling, Numerical Algorithms Group Ltd. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +* +* -- Reference BLAS level3 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA,BETA + INTEGER K,LDA,LDB,LDC,M,N + CHARACTER TRANSA,TRANSB +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG,MAX +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I,INFO,J,L,NCOLA,NROWA,NROWB + LOGICAL CONJA,CONJB,NOTA,NOTB +* .. +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER (ONE= (1.0D+0,0.0D+0)) + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* +* Set NOTA and NOTB as true if A and B respectively are not +* conjugated or transposed, set CONJA and CONJB as true if A and +* B respectively are to be transposed but not conjugated and set +* NROWA, NCOLA and NROWB as the number of rows and columns of A +* and the number of rows of B respectively. +* + NOTA = LSAME(TRANSA,'N') + NOTB = LSAME(TRANSB,'N') + CONJA = LSAME(TRANSA,'C') + CONJB = LSAME(TRANSB,'C') + IF (NOTA) THEN + NROWA = M + NCOLA = K + ELSE + NROWA = K + NCOLA = M + END IF + IF (NOTB) THEN + NROWB = K + ELSE + NROWB = N + END IF +* +* Test the input parameters. +* + INFO = 0 + IF ((.NOT.NOTA) .AND. (.NOT.CONJA) .AND. + + (.NOT.LSAME(TRANSA,'T'))) THEN + INFO = 1 + ELSE IF ((.NOT.NOTB) .AND. (.NOT.CONJB) .AND. + + (.NOT.LSAME(TRANSB,'T'))) THEN + INFO = 2 + ELSE IF (M.LT.0) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (K.LT.0) THEN + INFO = 5 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 8 + ELSE IF (LDB.LT.MAX(1,NROWB)) THEN + INFO = 10 + ELSE IF (LDC.LT.MAX(1,M)) THEN + INFO = 13 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZGEMM ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((M.EQ.0) .OR. (N.EQ.0) .OR. + + (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN +* +* And when alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (BETA.EQ.ZERO) THEN + DO 20 J = 1,N + DO 10 I = 1,M + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + DO 30 I = 1,M + C(I,J) = BETA*C(I,J) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF +* +* Start the operations. +* + IF (NOTB) THEN + IF (NOTA) THEN +* +* Form C := alpha*A*B + beta*C. +* + DO 90 J = 1,N + IF (BETA.EQ.ZERO) THEN + DO 50 I = 1,M + C(I,J) = ZERO + 50 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 60 I = 1,M + C(I,J) = BETA*C(I,J) + 60 CONTINUE + END IF + DO 80 L = 1,K + IF (B(L,J).NE.ZERO) THEN + TEMP = ALPHA*B(L,J) + DO 70 I = 1,M + C(I,J) = C(I,J) + TEMP*A(I,L) + 70 CONTINUE + END IF + 80 CONTINUE + 90 CONTINUE + ELSE IF (CONJA) THEN +* +* Form C := alpha*A**H*B + beta*C. +* + DO 120 J = 1,N + DO 110 I = 1,M + TEMP = ZERO + DO 100 L = 1,K + TEMP = TEMP + DCONJG(A(L,I))*B(L,J) + 100 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 110 CONTINUE + 120 CONTINUE + ELSE +* +* Form C := alpha*A**T*B + beta*C +* + DO 150 J = 1,N + DO 140 I = 1,M + TEMP = ZERO + DO 130 L = 1,K + TEMP = TEMP + A(L,I)*B(L,J) + 130 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 140 CONTINUE + 150 CONTINUE + END IF + ELSE IF (NOTA) THEN + IF (CONJB) THEN +* +* Form C := alpha*A*B**H + beta*C. +* + DO 200 J = 1,N + IF (BETA.EQ.ZERO) THEN + DO 160 I = 1,M + C(I,J) = ZERO + 160 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 170 I = 1,M + C(I,J) = BETA*C(I,J) + 170 CONTINUE + END IF + DO 190 L = 1,K + IF (B(J,L).NE.ZERO) THEN + TEMP = ALPHA*DCONJG(B(J,L)) + DO 180 I = 1,M + C(I,J) = C(I,J) + TEMP*A(I,L) + 180 CONTINUE + END IF + 190 CONTINUE + 200 CONTINUE + ELSE +* +* Form C := alpha*A*B**T + beta*C +* + DO 250 J = 1,N + IF (BETA.EQ.ZERO) THEN + DO 210 I = 1,M + C(I,J) = ZERO + 210 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 220 I = 1,M + C(I,J) = BETA*C(I,J) + 220 CONTINUE + END IF + DO 240 L = 1,K + IF (B(J,L).NE.ZERO) THEN + TEMP = ALPHA*B(J,L) + DO 230 I = 1,M + C(I,J) = C(I,J) + TEMP*A(I,L) + 230 CONTINUE + END IF + 240 CONTINUE + 250 CONTINUE + END IF + ELSE IF (CONJA) THEN + IF (CONJB) THEN +* +* Form C := alpha*A**H*B**H + beta*C. +* + DO 280 J = 1,N + DO 270 I = 1,M + TEMP = ZERO + DO 260 L = 1,K + TEMP = TEMP + DCONJG(A(L,I))*DCONJG(B(J,L)) + 260 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 270 CONTINUE + 280 CONTINUE + ELSE +* +* Form C := alpha*A**H*B**T + beta*C +* + DO 310 J = 1,N + DO 300 I = 1,M + TEMP = ZERO + DO 290 L = 1,K + TEMP = TEMP + DCONJG(A(L,I))*B(J,L) + 290 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 300 CONTINUE + 310 CONTINUE + END IF + ELSE + IF (CONJB) THEN +* +* Form C := alpha*A**T*B**H + beta*C +* + DO 340 J = 1,N + DO 330 I = 1,M + TEMP = ZERO + DO 320 L = 1,K + TEMP = TEMP + A(L,I)*DCONJG(B(J,L)) + 320 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 330 CONTINUE + 340 CONTINUE + ELSE +* +* Form C := alpha*A**T*B**T + beta*C +* + DO 370 J = 1,N + DO 360 I = 1,M + TEMP = ZERO + DO 350 L = 1,K + TEMP = TEMP + A(L,I)*B(J,L) + 350 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 360 CONTINUE + 370 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZGEMM . +* + END diff --git a/lib/linalg/zgemv.f b/lib/linalg/zgemv.f new file mode 100644 index 0000000000..4e174c956c --- /dev/null +++ b/lib/linalg/zgemv.f @@ -0,0 +1,354 @@ +*> \brief \b ZGEMV +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA,BETA +* INTEGER INCX,INCY,LDA,M,N +* CHARACTER TRANS +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZGEMV performs one of the matrix-vector operations +*> +*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or +*> +*> y := alpha*A**H*x + beta*y, +*> +*> where alpha and beta are scalars, x and y are vectors and A is an +*> m by n matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] TRANS +*> \verbatim +*> TRANS is CHARACTER*1 +*> On entry, TRANS specifies the operation to be performed as +*> follows: +*> +*> TRANS = 'N' or 'n' y := alpha*A*x + beta*y. +*> +*> TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. +*> +*> TRANS = 'C' or 'c' y := alpha*A**H*x + beta*y. +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> On entry, M specifies the number of rows of the matrix A. +*> M must be at least zero. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of columns of the matrix A. +*> N must be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, n ). +*> Before entry, the leading m by n part of the array A must +*> contain the matrix of coefficients. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. LDA must be at least +*> max( 1, m ). +*> \endverbatim +*> +*> \param[in] X +*> \verbatim +*> X is COMPLEX*16 array of DIMENSION at least +*> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' +*> and at least +*> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. +*> Before entry, the incremented array X must contain the +*> vector x. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> On entry, INCX specifies the increment for the elements of +*> X. INCX must not be zero. +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is COMPLEX*16 +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then Y need not be set on input. +*> \endverbatim +*> +*> \param[in,out] Y +*> \verbatim +*> Y is COMPLEX*16 array of DIMENSION at least +*> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' +*> and at least +*> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. +*> Before entry with BETA non-zero, the incremented array Y +*> must contain the vector y. On exit, Y is overwritten by the +*> updated vector y. +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> On entry, INCY specifies the increment for the elements of +*> Y. INCY must not be zero. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level2 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 2 Blas routine. +*> The vector and matrix arguments are not referenced when N = 0, or M = 0 +*> +*> -- Written on 22-October-1986. +*> Jack Dongarra, Argonne National Lab. +*> Jeremy Du Croz, Nag Central Office. +*> Sven Hammarling, Nag Central Office. +*> Richard Hanson, Sandia National Labs. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) +* +* -- Reference BLAS level2 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA,BETA + INTEGER INCX,INCY,LDA,M,N + CHARACTER TRANS +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER (ONE= (1.0D+0,0.0D+0)) + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY + LOGICAL NOCONJ +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG,MAX +* .. +* +* Test the input parameters. +* + INFO = 0 + IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + + .NOT.LSAME(TRANS,'C')) THEN + INFO = 1 + ELSE IF (M.LT.0) THEN + INFO = 2 + ELSE IF (N.LT.0) THEN + INFO = 3 + ELSE IF (LDA.LT.MAX(1,M)) THEN + INFO = 6 + ELSE IF (INCX.EQ.0) THEN + INFO = 8 + ELSE IF (INCY.EQ.0) THEN + INFO = 11 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZGEMV ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((M.EQ.0) .OR. (N.EQ.0) .OR. + + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN +* + NOCONJ = LSAME(TRANS,'T') +* +* Set LENX and LENY, the lengths of the vectors x and y, and set +* up the start points in X and Y. +* + IF (LSAME(TRANS,'N')) THEN + LENX = N + LENY = M + ELSE + LENX = M + LENY = N + END IF + IF (INCX.GT.0) THEN + KX = 1 + ELSE + KX = 1 - (LENX-1)*INCX + END IF + IF (INCY.GT.0) THEN + KY = 1 + ELSE + KY = 1 - (LENY-1)*INCY + END IF +* +* Start the operations. In this version the elements of A are +* accessed sequentially with one pass through A. +* +* First form y := beta*y. +* + IF (BETA.NE.ONE) THEN + IF (INCY.EQ.1) THEN + IF (BETA.EQ.ZERO) THEN + DO 10 I = 1,LENY + Y(I) = ZERO + 10 CONTINUE + ELSE + DO 20 I = 1,LENY + Y(I) = BETA*Y(I) + 20 CONTINUE + END IF + ELSE + IY = KY + IF (BETA.EQ.ZERO) THEN + DO 30 I = 1,LENY + Y(IY) = ZERO + IY = IY + INCY + 30 CONTINUE + ELSE + DO 40 I = 1,LENY + Y(IY) = BETA*Y(IY) + IY = IY + INCY + 40 CONTINUE + END IF + END IF + END IF + IF (ALPHA.EQ.ZERO) RETURN + IF (LSAME(TRANS,'N')) THEN +* +* Form y := alpha*A*x + y. +* + JX = KX + IF (INCY.EQ.1) THEN + DO 60 J = 1,N + IF (X(JX).NE.ZERO) THEN + TEMP = ALPHA*X(JX) + DO 50 I = 1,M + Y(I) = Y(I) + TEMP*A(I,J) + 50 CONTINUE + END IF + JX = JX + INCX + 60 CONTINUE + ELSE + DO 80 J = 1,N + IF (X(JX).NE.ZERO) THEN + TEMP = ALPHA*X(JX) + IY = KY + DO 70 I = 1,M + Y(IY) = Y(IY) + TEMP*A(I,J) + IY = IY + INCY + 70 CONTINUE + END IF + JX = JX + INCX + 80 CONTINUE + END IF + ELSE +* +* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y. +* + JY = KY + IF (INCX.EQ.1) THEN + DO 110 J = 1,N + TEMP = ZERO + IF (NOCONJ) THEN + DO 90 I = 1,M + TEMP = TEMP + A(I,J)*X(I) + 90 CONTINUE + ELSE + DO 100 I = 1,M + TEMP = TEMP + DCONJG(A(I,J))*X(I) + 100 CONTINUE + END IF + Y(JY) = Y(JY) + ALPHA*TEMP + JY = JY + INCY + 110 CONTINUE + ELSE + DO 140 J = 1,N + TEMP = ZERO + IX = KX + IF (NOCONJ) THEN + DO 120 I = 1,M + TEMP = TEMP + A(I,J)*X(IX) + IX = IX + INCX + 120 CONTINUE + ELSE + DO 130 I = 1,M + TEMP = TEMP + DCONJG(A(I,J))*X(IX) + IX = IX + INCX + 130 CONTINUE + END IF + Y(JY) = Y(JY) + ALPHA*TEMP + JY = JY + INCY + 140 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZGEMV . +* + END diff --git a/lib/linalg/zgerc.f b/lib/linalg/zgerc.f new file mode 100644 index 0000000000..accfeafc05 --- /dev/null +++ b/lib/linalg/zgerc.f @@ -0,0 +1,227 @@ +*> \brief \b ZGERC +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA +* INTEGER INCX,INCY,LDA,M,N +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZGERC performs the rank 1 operation +*> +*> A := alpha*x*y**H + A, +*> +*> where alpha is a scalar, x is an m element vector, y is an n element +*> vector and A is an m by n matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> On entry, M specifies the number of rows of the matrix A. +*> M must be at least zero. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of columns of the matrix A. +*> N must be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] X +*> \verbatim +*> X is COMPLEX*16 array of dimension at least +*> ( 1 + ( m - 1 )*abs( INCX ) ). +*> Before entry, the incremented array X must contain the m +*> element vector x. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> On entry, INCX specifies the increment for the elements of +*> X. INCX must not be zero. +*> \endverbatim +*> +*> \param[in] Y +*> \verbatim +*> Y is COMPLEX*16 array of dimension at least +*> ( 1 + ( n - 1 )*abs( INCY ) ). +*> Before entry, the incremented array Y must contain the n +*> element vector y. +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> On entry, INCY specifies the increment for the elements of +*> Y. INCY must not be zero. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, n ). +*> Before entry, the leading m by n part of the array A must +*> contain the matrix of coefficients. On exit, A is +*> overwritten by the updated matrix. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. LDA must be at least +*> max( 1, m ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level2 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 2 Blas routine. +*> +*> -- Written on 22-October-1986. +*> Jack Dongarra, Argonne National Lab. +*> Jeremy Du Croz, Nag Central Office. +*> Sven Hammarling, Nag Central Office. +*> Richard Hanson, Sandia National Labs. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) +* +* -- Reference BLAS level2 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA + INTEGER INCX,INCY,LDA,M,N +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I,INFO,IX,J,JY,KX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG,MAX +* .. +* +* Test the input parameters. +* + INFO = 0 + IF (M.LT.0) THEN + INFO = 1 + ELSE IF (N.LT.0) THEN + INFO = 2 + ELSE IF (INCX.EQ.0) THEN + INFO = 5 + ELSE IF (INCY.EQ.0) THEN + INFO = 7 + ELSE IF (LDA.LT.MAX(1,M)) THEN + INFO = 9 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZGERC ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN +* +* Start the operations. In this version the elements of A are +* accessed sequentially with one pass through A. +* + IF (INCY.GT.0) THEN + JY = 1 + ELSE + JY = 1 - (N-1)*INCY + END IF + IF (INCX.EQ.1) THEN + DO 20 J = 1,N + IF (Y(JY).NE.ZERO) THEN + TEMP = ALPHA*DCONJG(Y(JY)) + DO 10 I = 1,M + A(I,J) = A(I,J) + X(I)*TEMP + 10 CONTINUE + END IF + JY = JY + INCY + 20 CONTINUE + ELSE + IF (INCX.GT.0) THEN + KX = 1 + ELSE + KX = 1 - (M-1)*INCX + END IF + DO 40 J = 1,N + IF (Y(JY).NE.ZERO) THEN + TEMP = ALPHA*DCONJG(Y(JY)) + IX = KX + DO 30 I = 1,M + A(I,J) = A(I,J) + X(IX)*TEMP + IX = IX + INCX + 30 CONTINUE + END IF + JY = JY + INCY + 40 CONTINUE + END IF +* + RETURN +* +* End of ZGERC . +* + END diff --git a/lib/linalg/zheev.f b/lib/linalg/zheev.f new file mode 100644 index 0000000000..adba990f0a --- /dev/null +++ b/lib/linalg/zheev.f @@ -0,0 +1,298 @@ +*> \brief ZHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZHEEV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, +* INFO ) +* +* .. Scalar Arguments .. +* CHARACTER JOBZ, UPLO +* INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION RWORK( * ), W( * ) +* COMPLEX*16 A( LDA, * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZHEEV computes all eigenvalues and, optionally, eigenvectors of a +*> complex Hermitian matrix A. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] JOBZ +*> \verbatim +*> JOBZ is CHARACTER*1 +*> = 'N': Compute eigenvalues only; +*> = 'V': Compute eigenvalues and eigenvectors. +*> \endverbatim +*> +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangle of A is stored; +*> = 'L': Lower triangle of A is stored. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA, N) +*> On entry, the Hermitian matrix A. If UPLO = 'U', the +*> leading N-by-N upper triangular part of A contains the +*> upper triangular part of the matrix A. If UPLO = 'L', +*> the leading N-by-N lower triangular part of A contains +*> the lower triangular part of the matrix A. +*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the +*> orthonormal eigenvectors of the matrix A. +*> If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') +*> or the upper triangle (if UPLO='U') of A, including the +*> diagonal, is destroyed. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] W +*> \verbatim +*> W is DOUBLE PRECISION array, dimension (N) +*> If INFO = 0, the eigenvalues in ascending order. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The length of the array WORK. LWORK >= max(1,2*N-1). +*> For optimal efficiency, LWORK >= (NB+1)*N, +*> where NB is the blocksize for ZHETRD returned by ILAENV. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] RWORK +*> \verbatim +*> RWORK is DOUBLE PRECISION array, dimension (max(1, 3*N-2)) +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: if INFO = i, the algorithm failed to converge; i +*> off-diagonal elements of an intermediate tridiagonal +*> form did not converge to zero. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16HEeigen +* +* ===================================================================== + SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, + $ INFO ) +* +* -- LAPACK driver routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER JOBZ, UPLO + INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION RWORK( * ), W( * ) + COMPLEX*16 A( LDA, * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) + COMPLEX*16 CONE + PARAMETER ( CONE = ( 1.0D0, 0.0D0 ) ) +* .. +* .. Local Scalars .. + LOGICAL LOWER, LQUERY, WANTZ + INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE, + $ LLWORK, LWKOPT, NB + DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, + $ SMLNUM +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + DOUBLE PRECISION DLAMCH, ZLANHE + EXTERNAL LSAME, ILAENV, DLAMCH, ZLANHE +* .. +* .. External Subroutines .. + EXTERNAL DSCAL, DSTERF, XERBLA, ZHETRD, ZLASCL, ZSTEQR, + $ ZUNGTR +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, SQRT +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + WANTZ = LSAME( JOBZ, 'V' ) + LOWER = LSAME( UPLO, 'L' ) + LQUERY = ( LWORK.EQ.-1 ) +* + INFO = 0 + IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN + INFO = -1 + ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN + INFO = -2 + ELSE IF( N.LT.0 ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -5 + END IF +* + IF( INFO.EQ.0 ) THEN + NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 ) + LWKOPT = MAX( 1, ( NB+1 )*N ) + WORK( 1 ) = LWKOPT +* + IF( LWORK.LT.MAX( 1, 2*N-1 ) .AND. .NOT.LQUERY ) + $ INFO = -8 + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZHEEV ', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) THEN + RETURN + END IF +* + IF( N.EQ.1 ) THEN + W( 1 ) = A( 1, 1 ) + WORK( 1 ) = 1 + IF( WANTZ ) + $ A( 1, 1 ) = CONE + RETURN + END IF +* +* Get machine constants. +* + SAFMIN = DLAMCH( 'Safe minimum' ) + EPS = DLAMCH( 'Precision' ) + SMLNUM = SAFMIN / EPS + BIGNUM = ONE / SMLNUM + RMIN = SQRT( SMLNUM ) + RMAX = SQRT( BIGNUM ) +* +* Scale matrix to allowable range, if necessary. +* + ANRM = ZLANHE( 'M', UPLO, N, A, LDA, RWORK ) + ISCALE = 0 + IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN + ISCALE = 1 + SIGMA = RMIN / ANRM + ELSE IF( ANRM.GT.RMAX ) THEN + ISCALE = 1 + SIGMA = RMAX / ANRM + END IF + IF( ISCALE.EQ.1 ) + $ CALL ZLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO ) +* +* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. +* + INDE = 1 + INDTAU = 1 + INDWRK = INDTAU + N + LLWORK = LWORK - INDWRK + 1 + CALL ZHETRD( UPLO, N, A, LDA, W, RWORK( INDE ), WORK( INDTAU ), + $ WORK( INDWRK ), LLWORK, IINFO ) +* +* For eigenvalues only, call DSTERF. For eigenvectors, first call +* ZUNGTR to generate the unitary matrix, then call ZSTEQR. +* + IF( .NOT.WANTZ ) THEN + CALL DSTERF( N, W, RWORK( INDE ), INFO ) + ELSE + CALL ZUNGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ), + $ LLWORK, IINFO ) + INDWRK = INDE + N + CALL ZSTEQR( JOBZ, N, W, RWORK( INDE ), A, LDA, + $ RWORK( INDWRK ), INFO ) + END IF +* +* If matrix was scaled, then rescale eigenvalues appropriately. +* + IF( ISCALE.EQ.1 ) THEN + IF( INFO.EQ.0 ) THEN + IMAX = N + ELSE + IMAX = INFO - 1 + END IF + CALL DSCAL( IMAX, ONE / SIGMA, W, 1 ) + END IF +* +* Set WORK(1) to optimal complex workspace size. +* + WORK( 1 ) = LWKOPT +* + RETURN +* +* End of ZHEEV +* + END diff --git a/lib/linalg/zhemv.f b/lib/linalg/zhemv.f new file mode 100644 index 0000000000..34216fbfff --- /dev/null +++ b/lib/linalg/zhemv.f @@ -0,0 +1,337 @@ +*> \brief \b ZHEMV +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA,BETA +* INTEGER INCX,INCY,LDA,N +* CHARACTER UPLO +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZHEMV performs the matrix-vector operation +*> +*> y := alpha*A*x + beta*y, +*> +*> where alpha and beta are scalars, x and y are n element vectors and +*> A is an n by n hermitian matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the upper or lower +*> triangular part of the array A is to be referenced as +*> follows: +*> +*> UPLO = 'U' or 'u' Only the upper triangular part of A +*> is to be referenced. +*> +*> UPLO = 'L' or 'l' Only the lower triangular part of A +*> is to be referenced. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the order of the matrix A. +*> N must be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, n ). +*> Before entry with UPLO = 'U' or 'u', the leading n by n +*> upper triangular part of the array A must contain the upper +*> triangular part of the hermitian matrix and the strictly +*> lower triangular part of A is not referenced. +*> Before entry with UPLO = 'L' or 'l', the leading n by n +*> lower triangular part of the array A must contain the lower +*> triangular part of the hermitian matrix and the strictly +*> upper triangular part of A is not referenced. +*> Note that the imaginary parts of the diagonal elements need +*> not be set and are assumed to be zero. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. LDA must be at least +*> max( 1, n ). +*> \endverbatim +*> +*> \param[in] X +*> \verbatim +*> X is COMPLEX*16 array of dimension at least +*> ( 1 + ( n - 1 )*abs( INCX ) ). +*> Before entry, the incremented array X must contain the n +*> element vector x. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> On entry, INCX specifies the increment for the elements of +*> X. INCX must not be zero. +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is COMPLEX*16 +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then Y need not be set on input. +*> \endverbatim +*> +*> \param[in,out] Y +*> \verbatim +*> Y is COMPLEX*16 array of dimension at least +*> ( 1 + ( n - 1 )*abs( INCY ) ). +*> Before entry, the incremented array Y must contain the n +*> element vector y. On exit, Y is overwritten by the updated +*> vector y. +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> On entry, INCY specifies the increment for the elements of +*> Y. INCY must not be zero. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level2 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 2 Blas routine. +*> The vector and matrix arguments are not referenced when N = 0, or M = 0 +*> +*> -- Written on 22-October-1986. +*> Jack Dongarra, Argonne National Lab. +*> Jeremy Du Croz, Nag Central Office. +*> Sven Hammarling, Nag Central Office. +*> Richard Hanson, Sandia National Labs. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) +* +* -- Reference BLAS level2 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA,BETA + INTEGER INCX,INCY,LDA,N + CHARACTER UPLO +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER (ONE= (1.0D+0,0.0D+0)) + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP1,TEMP2 + INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE,DCONJG,MAX +* .. +* +* Test the input parameters. +* + INFO = 0 + IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN + INFO = 1 + ELSE IF (N.LT.0) THEN + INFO = 2 + ELSE IF (LDA.LT.MAX(1,N)) THEN + INFO = 5 + ELSE IF (INCX.EQ.0) THEN + INFO = 7 + ELSE IF (INCY.EQ.0) THEN + INFO = 10 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZHEMV ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN +* +* Set up the start points in X and Y. +* + IF (INCX.GT.0) THEN + KX = 1 + ELSE + KX = 1 - (N-1)*INCX + END IF + IF (INCY.GT.0) THEN + KY = 1 + ELSE + KY = 1 - (N-1)*INCY + END IF +* +* Start the operations. In this version the elements of A are +* accessed sequentially with one pass through the triangular part +* of A. +* +* First form y := beta*y. +* + IF (BETA.NE.ONE) THEN + IF (INCY.EQ.1) THEN + IF (BETA.EQ.ZERO) THEN + DO 10 I = 1,N + Y(I) = ZERO + 10 CONTINUE + ELSE + DO 20 I = 1,N + Y(I) = BETA*Y(I) + 20 CONTINUE + END IF + ELSE + IY = KY + IF (BETA.EQ.ZERO) THEN + DO 30 I = 1,N + Y(IY) = ZERO + IY = IY + INCY + 30 CONTINUE + ELSE + DO 40 I = 1,N + Y(IY) = BETA*Y(IY) + IY = IY + INCY + 40 CONTINUE + END IF + END IF + END IF + IF (ALPHA.EQ.ZERO) RETURN + IF (LSAME(UPLO,'U')) THEN +* +* Form y when A is stored in upper triangle. +* + IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN + DO 60 J = 1,N + TEMP1 = ALPHA*X(J) + TEMP2 = ZERO + DO 50 I = 1,J - 1 + Y(I) = Y(I) + TEMP1*A(I,J) + TEMP2 = TEMP2 + DCONJG(A(I,J))*X(I) + 50 CONTINUE + Y(J) = Y(J) + TEMP1*DBLE(A(J,J)) + ALPHA*TEMP2 + 60 CONTINUE + ELSE + JX = KX + JY = KY + DO 80 J = 1,N + TEMP1 = ALPHA*X(JX) + TEMP2 = ZERO + IX = KX + IY = KY + DO 70 I = 1,J - 1 + Y(IY) = Y(IY) + TEMP1*A(I,J) + TEMP2 = TEMP2 + DCONJG(A(I,J))*X(IX) + IX = IX + INCX + IY = IY + INCY + 70 CONTINUE + Y(JY) = Y(JY) + TEMP1*DBLE(A(J,J)) + ALPHA*TEMP2 + JX = JX + INCX + JY = JY + INCY + 80 CONTINUE + END IF + ELSE +* +* Form y when A is stored in lower triangle. +* + IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN + DO 100 J = 1,N + TEMP1 = ALPHA*X(J) + TEMP2 = ZERO + Y(J) = Y(J) + TEMP1*DBLE(A(J,J)) + DO 90 I = J + 1,N + Y(I) = Y(I) + TEMP1*A(I,J) + TEMP2 = TEMP2 + DCONJG(A(I,J))*X(I) + 90 CONTINUE + Y(J) = Y(J) + ALPHA*TEMP2 + 100 CONTINUE + ELSE + JX = KX + JY = KY + DO 120 J = 1,N + TEMP1 = ALPHA*X(JX) + TEMP2 = ZERO + Y(JY) = Y(JY) + TEMP1*DBLE(A(J,J)) + IX = JX + IY = JY + DO 110 I = J + 1,N + IX = IX + INCX + IY = IY + INCY + Y(IY) = Y(IY) + TEMP1*A(I,J) + TEMP2 = TEMP2 + DCONJG(A(I,J))*X(IX) + 110 CONTINUE + Y(JY) = Y(JY) + ALPHA*TEMP2 + JX = JX + INCX + JY = JY + INCY + 120 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZHEMV . +* + END diff --git a/lib/linalg/zher2.f b/lib/linalg/zher2.f new file mode 100644 index 0000000000..e2a02c3c68 --- /dev/null +++ b/lib/linalg/zher2.f @@ -0,0 +1,317 @@ +*> \brief \b ZHER2 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA +* INTEGER INCX,INCY,LDA,N +* CHARACTER UPLO +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZHER2 performs the hermitian rank 2 operation +*> +*> A := alpha*x*y**H + conjg( alpha )*y*x**H + A, +*> +*> where alpha is a scalar, x and y are n element vectors and A is an n +*> by n hermitian matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the upper or lower +*> triangular part of the array A is to be referenced as +*> follows: +*> +*> UPLO = 'U' or 'u' Only the upper triangular part of A +*> is to be referenced. +*> +*> UPLO = 'L' or 'l' Only the lower triangular part of A +*> is to be referenced. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the order of the matrix A. +*> N must be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] X +*> \verbatim +*> X is COMPLEX*16 array of dimension at least +*> ( 1 + ( n - 1 )*abs( INCX ) ). +*> Before entry, the incremented array X must contain the n +*> element vector x. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> On entry, INCX specifies the increment for the elements of +*> X. INCX must not be zero. +*> \endverbatim +*> +*> \param[in] Y +*> \verbatim +*> Y is COMPLEX*16 array of dimension at least +*> ( 1 + ( n - 1 )*abs( INCY ) ). +*> Before entry, the incremented array Y must contain the n +*> element vector y. +*> \endverbatim +*> +*> \param[in] INCY +*> \verbatim +*> INCY is INTEGER +*> On entry, INCY specifies the increment for the elements of +*> Y. INCY must not be zero. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, n ). +*> Before entry with UPLO = 'U' or 'u', the leading n by n +*> upper triangular part of the array A must contain the upper +*> triangular part of the hermitian matrix and the strictly +*> lower triangular part of A is not referenced. On exit, the +*> upper triangular part of the array A is overwritten by the +*> upper triangular part of the updated matrix. +*> Before entry with UPLO = 'L' or 'l', the leading n by n +*> lower triangular part of the array A must contain the lower +*> triangular part of the hermitian matrix and the strictly +*> upper triangular part of A is not referenced. On exit, the +*> lower triangular part of the array A is overwritten by the +*> lower triangular part of the updated matrix. +*> Note that the imaginary parts of the diagonal elements need +*> not be set, they are assumed to be zero, and on exit they +*> are set to zero. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. LDA must be at least +*> max( 1, n ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level2 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 2 Blas routine. +*> +*> -- Written on 22-October-1986. +*> Jack Dongarra, Argonne National Lab. +*> Jeremy Du Croz, Nag Central Office. +*> Sven Hammarling, Nag Central Office. +*> Richard Hanson, Sandia National Labs. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) +* +* -- Reference BLAS level2 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA + INTEGER INCX,INCY,LDA,N + CHARACTER UPLO +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),X(*),Y(*) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP1,TEMP2 + INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE,DCONJG,MAX +* .. +* +* Test the input parameters. +* + INFO = 0 + IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN + INFO = 1 + ELSE IF (N.LT.0) THEN + INFO = 2 + ELSE IF (INCX.EQ.0) THEN + INFO = 5 + ELSE IF (INCY.EQ.0) THEN + INFO = 7 + ELSE IF (LDA.LT.MAX(1,N)) THEN + INFO = 9 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZHER2 ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN +* +* Set up the start points in X and Y if the increments are not both +* unity. +* + IF ((INCX.NE.1) .OR. (INCY.NE.1)) THEN + IF (INCX.GT.0) THEN + KX = 1 + ELSE + KX = 1 - (N-1)*INCX + END IF + IF (INCY.GT.0) THEN + KY = 1 + ELSE + KY = 1 - (N-1)*INCY + END IF + JX = KX + JY = KY + END IF +* +* Start the operations. In this version the elements of A are +* accessed sequentially with one pass through the triangular part +* of A. +* + IF (LSAME(UPLO,'U')) THEN +* +* Form A when A is stored in the upper triangle. +* + IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN + DO 20 J = 1,N + IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN + TEMP1 = ALPHA*DCONJG(Y(J)) + TEMP2 = DCONJG(ALPHA*X(J)) + DO 10 I = 1,J - 1 + A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2 + 10 CONTINUE + A(J,J) = DBLE(A(J,J)) + + + DBLE(X(J)*TEMP1+Y(J)*TEMP2) + ELSE + A(J,J) = DBLE(A(J,J)) + END IF + 20 CONTINUE + ELSE + DO 40 J = 1,N + IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN + TEMP1 = ALPHA*DCONJG(Y(JY)) + TEMP2 = DCONJG(ALPHA*X(JX)) + IX = KX + IY = KY + DO 30 I = 1,J - 1 + A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2 + IX = IX + INCX + IY = IY + INCY + 30 CONTINUE + A(J,J) = DBLE(A(J,J)) + + + DBLE(X(JX)*TEMP1+Y(JY)*TEMP2) + ELSE + A(J,J) = DBLE(A(J,J)) + END IF + JX = JX + INCX + JY = JY + INCY + 40 CONTINUE + END IF + ELSE +* +* Form A when A is stored in the lower triangle. +* + IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN + DO 60 J = 1,N + IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN + TEMP1 = ALPHA*DCONJG(Y(J)) + TEMP2 = DCONJG(ALPHA*X(J)) + A(J,J) = DBLE(A(J,J)) + + + DBLE(X(J)*TEMP1+Y(J)*TEMP2) + DO 50 I = J + 1,N + A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2 + 50 CONTINUE + ELSE + A(J,J) = DBLE(A(J,J)) + END IF + 60 CONTINUE + ELSE + DO 80 J = 1,N + IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN + TEMP1 = ALPHA*DCONJG(Y(JY)) + TEMP2 = DCONJG(ALPHA*X(JX)) + A(J,J) = DBLE(A(J,J)) + + + DBLE(X(JX)*TEMP1+Y(JY)*TEMP2) + IX = JX + IY = JY + DO 70 I = J + 1,N + IX = IX + INCX + IY = IY + INCY + A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2 + 70 CONTINUE + ELSE + A(J,J) = DBLE(A(J,J)) + END IF + JX = JX + INCX + JY = JY + INCY + 80 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZHER2 . +* + END diff --git a/lib/linalg/zher2k.f b/lib/linalg/zher2k.f new file mode 100644 index 0000000000..0b91bd2cbb --- /dev/null +++ b/lib/linalg/zher2k.f @@ -0,0 +1,443 @@ +*> \brief \b ZHER2K +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA +* DOUBLE PRECISION BETA +* INTEGER K,LDA,LDB,LDC,N +* CHARACTER TRANS,UPLO +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZHER2K performs one of the hermitian rank 2k operations +*> +*> C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C, +*> +*> or +*> +*> C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C, +*> +*> where alpha and beta are scalars with beta real, C is an n by n +*> hermitian matrix and A and B are n by k matrices in the first case +*> and k by n matrices in the second case. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the upper or lower +*> triangular part of the array C is to be referenced as +*> follows: +*> +*> UPLO = 'U' or 'u' Only the upper triangular part of C +*> is to be referenced. +*> +*> UPLO = 'L' or 'l' Only the lower triangular part of C +*> is to be referenced. +*> \endverbatim +*> +*> \param[in] TRANS +*> \verbatim +*> TRANS is CHARACTER*1 +*> On entry, TRANS specifies the operation to be performed as +*> follows: +*> +*> TRANS = 'N' or 'n' C := alpha*A*B**H + +*> conjg( alpha )*B*A**H + +*> beta*C. +*> +*> TRANS = 'C' or 'c' C := alpha*A**H*B + +*> conjg( alpha )*B**H*A + +*> beta*C. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the order of the matrix C. N must be +*> at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry with TRANS = 'N' or 'n', K specifies the number +*> of columns of the matrices A and B, and on entry with +*> TRANS = 'C' or 'c', K specifies the number of rows of the +*> matrices A and B. K must be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 . +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, ka ), where ka is +*> k when TRANS = 'N' or 'n', and is n otherwise. +*> Before entry with TRANS = 'N' or 'n', the leading n by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by n part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANS = 'N' or 'n' +*> then LDA must be at least max( 1, n ), otherwise LDA must +*> be at least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is COMPLEX*16 array of DIMENSION ( LDB, kb ), where kb is +*> k when TRANS = 'N' or 'n', and is n otherwise. +*> Before entry with TRANS = 'N' or 'n', the leading n by k +*> part of the array B must contain the matrix B, otherwise +*> the leading k by n part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANS = 'N' or 'n' +*> then LDB must be at least max( 1, n ), otherwise LDB must +*> be at least max( 1, k ). +*> Unchanged on exit. +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is DOUBLE PRECISION . +*> On entry, BETA specifies the scalar beta. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is COMPLEX*16 array of DIMENSION ( LDC, n ). +*> Before entry with UPLO = 'U' or 'u', the leading n by n +*> upper triangular part of the array C must contain the upper +*> triangular part of the hermitian matrix and the strictly +*> lower triangular part of C is not referenced. On exit, the +*> upper triangular part of the array C is overwritten by the +*> upper triangular part of the updated matrix. +*> Before entry with UPLO = 'L' or 'l', the leading n by n +*> lower triangular part of the array C must contain the lower +*> triangular part of the hermitian matrix and the strictly +*> upper triangular part of C is not referenced. On exit, the +*> lower triangular part of the array C is overwritten by the +*> lower triangular part of the updated matrix. +*> Note that the imaginary parts of the diagonal elements need +*> not be set, they are assumed to be zero, and on exit they +*> are set to zero. +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, n ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level3 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 8-February-1989. +*> Jack Dongarra, Argonne National Laboratory. +*> Iain Duff, AERE Harwell. +*> Jeremy Du Croz, Numerical Algorithms Group Ltd. +*> Sven Hammarling, Numerical Algorithms Group Ltd. +*> +*> -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1. +*> Ed Anderson, Cray Research Inc. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +* +* -- Reference BLAS level3 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA + DOUBLE PRECISION BETA + INTEGER K,LDA,LDB,LDC,N + CHARACTER TRANS,UPLO +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE,DCONJG,MAX +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP1,TEMP2 + INTEGER I,INFO,J,L,NROWA + LOGICAL UPPER +* .. +* .. Parameters .. + DOUBLE PRECISION ONE + PARAMETER (ONE=1.0D+0) + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* +* Test the input parameters. +* + IF (LSAME(TRANS,'N')) THEN + NROWA = N + ELSE + NROWA = K + END IF + UPPER = LSAME(UPLO,'U') +* + INFO = 0 + IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + INFO = 1 + ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND. + + (.NOT.LSAME(TRANS,'C'))) THEN + INFO = 2 + ELSE IF (N.LT.0) THEN + INFO = 3 + ELSE IF (K.LT.0) THEN + INFO = 4 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 7 + ELSE IF (LDB.LT.MAX(1,NROWA)) THEN + INFO = 9 + ELSE IF (LDC.LT.MAX(1,N)) THEN + INFO = 12 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZHER2K',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR. + + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN +* +* And when alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (UPPER) THEN + IF (BETA.EQ.DBLE(ZERO)) THEN + DO 20 J = 1,N + DO 10 I = 1,J + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + DO 30 I = 1,J - 1 + C(I,J) = BETA*C(I,J) + 30 CONTINUE + C(J,J) = BETA*DBLE(C(J,J)) + 40 CONTINUE + END IF + ELSE + IF (BETA.EQ.DBLE(ZERO)) THEN + DO 60 J = 1,N + DO 50 I = J,N + C(I,J) = ZERO + 50 CONTINUE + 60 CONTINUE + ELSE + DO 80 J = 1,N + C(J,J) = BETA*DBLE(C(J,J)) + DO 70 I = J + 1,N + C(I,J) = BETA*C(I,J) + 70 CONTINUE + 80 CONTINUE + END IF + END IF + RETURN + END IF +* +* Start the operations. +* + IF (LSAME(TRANS,'N')) THEN +* +* Form C := alpha*A*B**H + conjg( alpha )*B*A**H + +* C. +* + IF (UPPER) THEN + DO 130 J = 1,N + IF (BETA.EQ.DBLE(ZERO)) THEN + DO 90 I = 1,J + C(I,J) = ZERO + 90 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 100 I = 1,J - 1 + C(I,J) = BETA*C(I,J) + 100 CONTINUE + C(J,J) = BETA*DBLE(C(J,J)) + ELSE + C(J,J) = DBLE(C(J,J)) + END IF + DO 120 L = 1,K + IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN + TEMP1 = ALPHA*DCONJG(B(J,L)) + TEMP2 = DCONJG(ALPHA*A(J,L)) + DO 110 I = 1,J - 1 + C(I,J) = C(I,J) + A(I,L)*TEMP1 + + + B(I,L)*TEMP2 + 110 CONTINUE + C(J,J) = DBLE(C(J,J)) + + + DBLE(A(J,L)*TEMP1+B(J,L)*TEMP2) + END IF + 120 CONTINUE + 130 CONTINUE + ELSE + DO 180 J = 1,N + IF (BETA.EQ.DBLE(ZERO)) THEN + DO 140 I = J,N + C(I,J) = ZERO + 140 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 150 I = J + 1,N + C(I,J) = BETA*C(I,J) + 150 CONTINUE + C(J,J) = BETA*DBLE(C(J,J)) + ELSE + C(J,J) = DBLE(C(J,J)) + END IF + DO 170 L = 1,K + IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN + TEMP1 = ALPHA*DCONJG(B(J,L)) + TEMP2 = DCONJG(ALPHA*A(J,L)) + DO 160 I = J + 1,N + C(I,J) = C(I,J) + A(I,L)*TEMP1 + + + B(I,L)*TEMP2 + 160 CONTINUE + C(J,J) = DBLE(C(J,J)) + + + DBLE(A(J,L)*TEMP1+B(J,L)*TEMP2) + END IF + 170 CONTINUE + 180 CONTINUE + END IF + ELSE +* +* Form C := alpha*A**H*B + conjg( alpha )*B**H*A + +* C. +* + IF (UPPER) THEN + DO 210 J = 1,N + DO 200 I = 1,J + TEMP1 = ZERO + TEMP2 = ZERO + DO 190 L = 1,K + TEMP1 = TEMP1 + DCONJG(A(L,I))*B(L,J) + TEMP2 = TEMP2 + DCONJG(B(L,I))*A(L,J) + 190 CONTINUE + IF (I.EQ.J) THEN + IF (BETA.EQ.DBLE(ZERO)) THEN + C(J,J) = DBLE(ALPHA*TEMP1+ + + DCONJG(ALPHA)*TEMP2) + ELSE + C(J,J) = BETA*DBLE(C(J,J)) + + + DBLE(ALPHA*TEMP1+ + + DCONJG(ALPHA)*TEMP2) + END IF + ELSE + IF (BETA.EQ.DBLE(ZERO)) THEN + C(I,J) = ALPHA*TEMP1 + DCONJG(ALPHA)*TEMP2 + ELSE + C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 + + + DCONJG(ALPHA)*TEMP2 + END IF + END IF + 200 CONTINUE + 210 CONTINUE + ELSE + DO 240 J = 1,N + DO 230 I = J,N + TEMP1 = ZERO + TEMP2 = ZERO + DO 220 L = 1,K + TEMP1 = TEMP1 + DCONJG(A(L,I))*B(L,J) + TEMP2 = TEMP2 + DCONJG(B(L,I))*A(L,J) + 220 CONTINUE + IF (I.EQ.J) THEN + IF (BETA.EQ.DBLE(ZERO)) THEN + C(J,J) = DBLE(ALPHA*TEMP1+ + + DCONJG(ALPHA)*TEMP2) + ELSE + C(J,J) = BETA*DBLE(C(J,J)) + + + DBLE(ALPHA*TEMP1+ + + DCONJG(ALPHA)*TEMP2) + END IF + ELSE + IF (BETA.EQ.DBLE(ZERO)) THEN + C(I,J) = ALPHA*TEMP1 + DCONJG(ALPHA)*TEMP2 + ELSE + C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 + + + DCONJG(ALPHA)*TEMP2 + END IF + END IF + 230 CONTINUE + 240 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZHER2K. +* + END diff --git a/lib/linalg/zhetd2.f b/lib/linalg/zhetd2.f new file mode 100644 index 0000000000..dd8f9cf014 --- /dev/null +++ b/lib/linalg/zhetd2.f @@ -0,0 +1,334 @@ +*> \brief \b ZHETD2 reduces a Hermitian matrix to real symmetric tridiagonal form by an unitary similarity transformation (unblocked algorithm). +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZHETD2 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER INFO, LDA, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION D( * ), E( * ) +* COMPLEX*16 A( LDA, * ), TAU( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZHETD2 reduces a complex Hermitian matrix A to real symmetric +*> tridiagonal form T by a unitary similarity transformation: +*> Q**H * A * Q = T. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> Specifies whether the upper or lower triangular part of the +*> Hermitian matrix A is stored: +*> = 'U': Upper triangular +*> = 'L': Lower triangular +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading +*> n-by-n upper triangular part of A contains the upper +*> triangular part of the matrix A, and the strictly lower +*> triangular part of A is not referenced. If UPLO = 'L', the +*> leading n-by-n lower triangular part of A contains the lower +*> triangular part of the matrix A, and the strictly upper +*> triangular part of A is not referenced. +*> On exit, if UPLO = 'U', the diagonal and first superdiagonal +*> of A are overwritten by the corresponding elements of the +*> tridiagonal matrix T, and the elements above the first +*> superdiagonal, with the array TAU, represent the unitary +*> matrix Q as a product of elementary reflectors; if UPLO +*> = 'L', the diagonal and first subdiagonal of A are over- +*> written by the corresponding elements of the tridiagonal +*> matrix T, and the elements below the first subdiagonal, with +*> the array TAU, represent the unitary matrix Q as a product +*> of elementary reflectors. See Further Details. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] D +*> \verbatim +*> D is DOUBLE PRECISION array, dimension (N) +*> The diagonal elements of the tridiagonal matrix T: +*> D(i) = A(i,i). +*> \endverbatim +*> +*> \param[out] E +*> \verbatim +*> E is DOUBLE PRECISION array, dimension (N-1) +*> The off-diagonal elements of the tridiagonal matrix T: +*> E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. +*> \endverbatim +*> +*> \param[out] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (N-1) +*> The scalar factors of the elementary reflectors (see Further +*> Details). +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16HEcomputational +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> If UPLO = 'U', the matrix Q is represented as a product of elementary +*> reflectors +*> +*> Q = H(n-1) . . . H(2) H(1). +*> +*> Each H(i) has the form +*> +*> H(i) = I - tau * v * v**H +*> +*> where tau is a complex scalar, and v is a complex vector with +*> v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in +*> A(1:i-1,i+1), and tau in TAU(i). +*> +*> If UPLO = 'L', the matrix Q is represented as a product of elementary +*> reflectors +*> +*> Q = H(1) H(2) . . . H(n-1). +*> +*> Each H(i) has the form +*> +*> H(i) = I - tau * v * v**H +*> +*> where tau is a complex scalar, and v is a complex vector with +*> v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), +*> and tau in TAU(i). +*> +*> The contents of A on exit are illustrated by the following examples +*> with n = 5: +*> +*> if UPLO = 'U': if UPLO = 'L': +*> +*> ( d e v2 v3 v4 ) ( d ) +*> ( d e v3 v4 ) ( e d ) +*> ( d e v4 ) ( v1 e d ) +*> ( d e ) ( v1 v2 e d ) +*> ( d ) ( v1 v2 v3 e d ) +*> +*> where d and e denote diagonal and off-diagonal elements of T, and vi +*> denotes an element of the vector defining H(i). +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO ) +* +* -- LAPACK computational routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, LDA, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ), E( * ) + COMPLEX*16 A( LDA, * ), TAU( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO, HALF + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ), + $ HALF = ( 0.5D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL UPPER + INTEGER I + COMPLEX*16 ALPHA, TAUI +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZAXPY, ZHEMV, ZHER2, ZLARFG +* .. +* .. External Functions .. + LOGICAL LSAME + COMPLEX*16 ZDOTC + EXTERNAL LSAME, ZDOTC +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE, MAX, MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters +* + INFO = 0 + UPPER = LSAME( UPLO, 'U') + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -4 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZHETD2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) + $ RETURN +* + IF( UPPER ) THEN +* +* Reduce the upper triangle of A +* + A( N, N ) = DBLE( A( N, N ) ) + DO 10 I = N - 1, 1, -1 +* +* Generate elementary reflector H(i) = I - tau * v * v**H +* to annihilate A(1:i-1,i+1) +* + ALPHA = A( I, I+1 ) + CALL ZLARFG( I, ALPHA, A( 1, I+1 ), 1, TAUI ) + E( I ) = ALPHA +* + IF( TAUI.NE.ZERO ) THEN +* +* Apply H(i) from both sides to A(1:i,1:i) +* + A( I, I+1 ) = ONE +* +* Compute x := tau * A * v storing x in TAU(1:i) +* + CALL ZHEMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO, + $ TAU, 1 ) +* +* Compute w := x - 1/2 * tau * (x**H * v) * v +* + ALPHA = -HALF*TAUI*ZDOTC( I, TAU, 1, A( 1, I+1 ), 1 ) + CALL ZAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 ) +* +* Apply the transformation as a rank-2 update: +* A := A - v * w**H - w * v**H +* + CALL ZHER2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A, + $ LDA ) +* + ELSE + A( I, I ) = DBLE( A( I, I ) ) + END IF + A( I, I+1 ) = E( I ) + D( I+1 ) = A( I+1, I+1 ) + TAU( I ) = TAUI + 10 CONTINUE + D( 1 ) = A( 1, 1 ) + ELSE +* +* Reduce the lower triangle of A +* + A( 1, 1 ) = DBLE( A( 1, 1 ) ) + DO 20 I = 1, N - 1 +* +* Generate elementary reflector H(i) = I - tau * v * v**H +* to annihilate A(i+2:n,i) +* + ALPHA = A( I+1, I ) + CALL ZLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAUI ) + E( I ) = ALPHA +* + IF( TAUI.NE.ZERO ) THEN +* +* Apply H(i) from both sides to A(i+1:n,i+1:n) +* + A( I+1, I ) = ONE +* +* Compute x := tau * A * v storing y in TAU(i:n-1) +* + CALL ZHEMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA, + $ A( I+1, I ), 1, ZERO, TAU( I ), 1 ) +* +* Compute w := x - 1/2 * tau * (x**H * v) * v +* + ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1, A( I+1, I ), + $ 1 ) + CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 ) +* +* Apply the transformation as a rank-2 update: +* A := A - v * w**H - w * v**H +* + CALL ZHER2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1, + $ A( I+1, I+1 ), LDA ) +* + ELSE + A( I+1, I+1 ) = DBLE( A( I+1, I+1 ) ) + END IF + A( I+1, I ) = E( I ) + D( I ) = A( I, I ) + TAU( I ) = TAUI + 20 CONTINUE + D( N ) = A( N, N ) + END IF +* + RETURN +* +* End of ZHETD2 +* + END diff --git a/lib/linalg/zhetrd.f b/lib/linalg/zhetrd.f new file mode 100644 index 0000000000..c607484637 --- /dev/null +++ b/lib/linalg/zhetrd.f @@ -0,0 +1,378 @@ +*> \brief \b ZHETRD +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZHETRD + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION D( * ), E( * ) +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZHETRD reduces a complex Hermitian matrix A to real symmetric +*> tridiagonal form T by a unitary similarity transformation: +*> Q**H * A * Q = T. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangle of A is stored; +*> = 'L': Lower triangle of A is stored. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading +*> N-by-N upper triangular part of A contains the upper +*> triangular part of the matrix A, and the strictly lower +*> triangular part of A is not referenced. If UPLO = 'L', the +*> leading N-by-N lower triangular part of A contains the lower +*> triangular part of the matrix A, and the strictly upper +*> triangular part of A is not referenced. +*> On exit, if UPLO = 'U', the diagonal and first superdiagonal +*> of A are overwritten by the corresponding elements of the +*> tridiagonal matrix T, and the elements above the first +*> superdiagonal, with the array TAU, represent the unitary +*> matrix Q as a product of elementary reflectors; if UPLO +*> = 'L', the diagonal and first subdiagonal of A are over- +*> written by the corresponding elements of the tridiagonal +*> matrix T, and the elements below the first subdiagonal, with +*> the array TAU, represent the unitary matrix Q as a product +*> of elementary reflectors. See Further Details. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] D +*> \verbatim +*> D is DOUBLE PRECISION array, dimension (N) +*> The diagonal elements of the tridiagonal matrix T: +*> D(i) = A(i,i). +*> \endverbatim +*> +*> \param[out] E +*> \verbatim +*> E is DOUBLE PRECISION array, dimension (N-1) +*> The off-diagonal elements of the tridiagonal matrix T: +*> E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. +*> \endverbatim +*> +*> \param[out] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (N-1) +*> The scalar factors of the elementary reflectors (see Further +*> Details). +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The dimension of the array WORK. LWORK >= 1. +*> For optimum performance LWORK >= N*NB, where NB is the +*> optimal blocksize. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16HEcomputational +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> If UPLO = 'U', the matrix Q is represented as a product of elementary +*> reflectors +*> +*> Q = H(n-1) . . . H(2) H(1). +*> +*> Each H(i) has the form +*> +*> H(i) = I - tau * v * v**H +*> +*> where tau is a complex scalar, and v is a complex vector with +*> v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in +*> A(1:i-1,i+1), and tau in TAU(i). +*> +*> If UPLO = 'L', the matrix Q is represented as a product of elementary +*> reflectors +*> +*> Q = H(1) H(2) . . . H(n-1). +*> +*> Each H(i) has the form +*> +*> H(i) = I - tau * v * v**H +*> +*> where tau is a complex scalar, and v is a complex vector with +*> v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), +*> and tau in TAU(i). +*> +*> The contents of A on exit are illustrated by the following examples +*> with n = 5: +*> +*> if UPLO = 'U': if UPLO = 'L': +*> +*> ( d e v2 v3 v4 ) ( d ) +*> ( d e v3 v4 ) ( e d ) +*> ( d e v4 ) ( v1 e d ) +*> ( d e ) ( v1 v2 e d ) +*> ( d ) ( v1 v2 v3 e d ) +*> +*> where d and e denote diagonal and off-diagonal elements of T, and vi +*> denotes an element of the vector defining H(i). +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ), E( * ) + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE + PARAMETER ( ONE = 1.0D+0 ) + COMPLEX*16 CONE + PARAMETER ( CONE = ( 1.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY, UPPER + INTEGER I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB, + $ NBMIN, NX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZHER2K, ZHETD2, ZLATRD +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + EXTERNAL LSAME, ILAENV +* .. +* .. Executable Statements .. +* +* Test the input parameters +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + LQUERY = ( LWORK.EQ.-1 ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -4 + ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN + INFO = -9 + END IF +* + IF( INFO.EQ.0 ) THEN +* +* Determine the block size. +* + NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 ) + LWKOPT = N*NB + WORK( 1 ) = LWKOPT + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZHETRD', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) THEN + WORK( 1 ) = 1 + RETURN + END IF +* + NX = N + IWS = 1 + IF( NB.GT.1 .AND. NB.LT.N ) THEN +* +* Determine when to cross over from blocked to unblocked code +* (last block is always handled by unblocked code). +* + NX = MAX( NB, ILAENV( 3, 'ZHETRD', UPLO, N, -1, -1, -1 ) ) + IF( NX.LT.N ) THEN +* +* Determine if workspace is large enough for blocked code. +* + LDWORK = N + IWS = LDWORK*NB + IF( LWORK.LT.IWS ) THEN +* +* Not enough workspace to use optimal NB: determine the +* minimum value of NB, and reduce NB or force use of +* unblocked code by setting NX = N. +* + NB = MAX( LWORK / LDWORK, 1 ) + NBMIN = ILAENV( 2, 'ZHETRD', UPLO, N, -1, -1, -1 ) + IF( NB.LT.NBMIN ) + $ NX = N + END IF + ELSE + NX = N + END IF + ELSE + NB = 1 + END IF +* + IF( UPPER ) THEN +* +* Reduce the upper triangle of A. +* Columns 1:kk are handled by the unblocked method. +* + KK = N - ( ( N-NX+NB-1 ) / NB )*NB + DO 20 I = N - NB + 1, KK + 1, -NB +* +* Reduce columns i:i+nb-1 to tridiagonal form and form the +* matrix W which is needed to update the unreduced part of +* the matrix +* + CALL ZLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK, + $ LDWORK ) +* +* Update the unreduced submatrix A(1:i-1,1:i-1), using an +* update of the form: A := A - V*W**H - W*V**H +* + CALL ZHER2K( UPLO, 'No transpose', I-1, NB, -CONE, + $ A( 1, I ), LDA, WORK, LDWORK, ONE, A, LDA ) +* +* Copy superdiagonal elements back into A, and diagonal +* elements into D +* + DO 10 J = I, I + NB - 1 + A( J-1, J ) = E( J-1 ) + D( J ) = A( J, J ) + 10 CONTINUE + 20 CONTINUE +* +* Use unblocked code to reduce the last or only block +* + CALL ZHETD2( UPLO, KK, A, LDA, D, E, TAU, IINFO ) + ELSE +* +* Reduce the lower triangle of A +* + DO 40 I = 1, N - NX, NB +* +* Reduce columns i:i+nb-1 to tridiagonal form and form the +* matrix W which is needed to update the unreduced part of +* the matrix +* + CALL ZLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ), + $ TAU( I ), WORK, LDWORK ) +* +* Update the unreduced submatrix A(i+nb:n,i+nb:n), using +* an update of the form: A := A - V*W**H - W*V**H +* + CALL ZHER2K( UPLO, 'No transpose', N-I-NB+1, NB, -CONE, + $ A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE, + $ A( I+NB, I+NB ), LDA ) +* +* Copy subdiagonal elements back into A, and diagonal +* elements into D +* + DO 30 J = I, I + NB - 1 + A( J+1, J ) = E( J ) + D( J ) = A( J, J ) + 30 CONTINUE + 40 CONTINUE +* +* Use unblocked code to reduce the last or only block +* + CALL ZHETD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ), + $ TAU( I ), IINFO ) + END IF +* + WORK( 1 ) = LWKOPT + RETURN +* +* End of ZHETRD +* + END diff --git a/lib/linalg/zlacgv.f b/lib/linalg/zlacgv.f new file mode 100644 index 0000000000..315c4de5ce --- /dev/null +++ b/lib/linalg/zlacgv.f @@ -0,0 +1,116 @@ +*> \brief \b ZLACGV conjugates a complex vector. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLACGV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLACGV( N, X, INCX ) +* +* .. Scalar Arguments .. +* INTEGER INCX, N +* .. +* .. Array Arguments .. +* COMPLEX*16 X( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLACGV conjugates a complex vector of length N. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The length of the vector X. N >= 0. +*> \endverbatim +*> +*> \param[in,out] X +*> \verbatim +*> X is COMPLEX*16 array, dimension +*> (1+(N-1)*abs(INCX)) +*> On entry, the vector of length N to be conjugated. +*> On exit, X is overwritten with conjg(X). +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> The spacing between successive elements of X. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLACGV( N, X, INCX ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER INCX, N +* .. +* .. Array Arguments .. + COMPLEX*16 X( * ) +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I, IOFF +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG +* .. +* .. Executable Statements .. +* + IF( INCX.EQ.1 ) THEN + DO 10 I = 1, N + X( I ) = DCONJG( X( I ) ) + 10 CONTINUE + ELSE + IOFF = 1 + IF( INCX.LT.0 ) + $ IOFF = 1 - ( N-1 )*INCX + DO 20 I = 1, N + X( IOFF ) = DCONJG( X( IOFF ) ) + IOFF = IOFF + INCX + 20 CONTINUE + END IF + RETURN +* +* End of ZLACGV +* + END diff --git a/lib/linalg/zladiv.f b/lib/linalg/zladiv.f new file mode 100644 index 0000000000..8f01fe3e63 --- /dev/null +++ b/lib/linalg/zladiv.f @@ -0,0 +1,97 @@ +*> \brief \b ZLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLADIV + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* COMPLEX*16 FUNCTION ZLADIV( X, Y ) +* +* .. Scalar Arguments .. +* COMPLEX*16 X, Y +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLADIV := X / Y, where X and Y are complex. The computation of X / Y +*> will not overflow on an intermediary step unless the results +*> overflows. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] X +*> \verbatim +*> X is COMPLEX*16 +*> \endverbatim +*> +*> \param[in] Y +*> \verbatim +*> Y is COMPLEX*16 +*> The complex scalars X and Y. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + COMPLEX*16 FUNCTION ZLADIV( X, Y ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + COMPLEX*16 X, Y +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + DOUBLE PRECISION ZI, ZR +* .. +* .. External Subroutines .. + EXTERNAL DLADIV +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE, DCMPLX, DIMAG +* .. +* .. Executable Statements .. +* + CALL DLADIV( DBLE( X ), DIMAG( X ), DBLE( Y ), DIMAG( Y ), ZR, + $ ZI ) + ZLADIV = DCMPLX( ZR, ZI ) +* + RETURN +* +* End of ZLADIV +* + END diff --git a/lib/linalg/zlanhe.f b/lib/linalg/zlanhe.f new file mode 100644 index 0000000000..3093a151af --- /dev/null +++ b/lib/linalg/zlanhe.f @@ -0,0 +1,258 @@ +*> \brief \b ZLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a complex Hermitian matrix. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLANHE + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK ) +* +* .. Scalar Arguments .. +* CHARACTER NORM, UPLO +* INTEGER LDA, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION WORK( * ) +* COMPLEX*16 A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLANHE returns the value of the one norm, or the Frobenius norm, or +*> the infinity norm, or the element of largest absolute value of a +*> complex hermitian matrix A. +*> \endverbatim +*> +*> \return ZLANHE +*> \verbatim +*> +*> ZLANHE = ( max(abs(A(i,j))), NORM = 'M' or 'm' +*> ( +*> ( norm1(A), NORM = '1', 'O' or 'o' +*> ( +*> ( normI(A), NORM = 'I' or 'i' +*> ( +*> ( normF(A), NORM = 'F', 'f', 'E' or 'e' +*> +*> where norm1 denotes the one norm of a matrix (maximum column sum), +*> normI denotes the infinity norm of a matrix (maximum row sum) and +*> normF denotes the Frobenius norm of a matrix (square root of sum of +*> squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] NORM +*> \verbatim +*> NORM is CHARACTER*1 +*> Specifies the value to be returned in ZLANHE as described +*> above. +*> \endverbatim +*> +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> Specifies whether the upper or lower triangular part of the +*> hermitian matrix A is to be referenced. +*> = 'U': Upper triangular part of A is referenced +*> = 'L': Lower triangular part of A is referenced +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. When N = 0, ZLANHE is +*> set to zero. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> The hermitian matrix A. If UPLO = 'U', the leading n by n +*> upper triangular part of A contains the upper triangular part +*> of the matrix A, and the strictly lower triangular part of A +*> is not referenced. If UPLO = 'L', the leading n by n lower +*> triangular part of A contains the lower triangular part of +*> the matrix A, and the strictly upper triangular part of A is +*> not referenced. Note that the imaginary parts of the diagonal +*> elements need not be set and are assumed to be zero. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(N,1). +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), +*> where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, +*> WORK is not referenced. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16HEauxiliary +* +* ===================================================================== + DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER NORM, UPLO + INTEGER LDA, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION WORK( * ) + COMPLEX*16 A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, J + DOUBLE PRECISION ABSA, SCALE, SUM, VALUE +* .. +* .. External Functions .. + LOGICAL LSAME, DISNAN + EXTERNAL LSAME, DISNAN +* .. +* .. External Subroutines .. + EXTERNAL ZLASSQ +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, SQRT +* .. +* .. Executable Statements .. +* + IF( N.EQ.0 ) THEN + VALUE = ZERO + ELSE IF( LSAME( NORM, 'M' ) ) THEN +* +* Find max(abs(A(i,j))). +* + VALUE = ZERO + IF( LSAME( UPLO, 'U' ) ) THEN + DO 20 J = 1, N + DO 10 I = 1, J - 1 + SUM = ABS( A( I, J ) ) + IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM + 10 CONTINUE + SUM = ABS( DBLE( A( J, J ) ) ) + IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM + 20 CONTINUE + ELSE + DO 40 J = 1, N + SUM = ABS( DBLE( A( J, J ) ) ) + IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM + DO 30 I = J + 1, N + SUM = ABS( A( I, J ) ) + IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM + 30 CONTINUE + 40 CONTINUE + END IF + ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR. + $ ( NORM.EQ.'1' ) ) THEN +* +* Find normI(A) ( = norm1(A), since A is hermitian). +* + VALUE = ZERO + IF( LSAME( UPLO, 'U' ) ) THEN + DO 60 J = 1, N + SUM = ZERO + DO 50 I = 1, J - 1 + ABSA = ABS( A( I, J ) ) + SUM = SUM + ABSA + WORK( I ) = WORK( I ) + ABSA + 50 CONTINUE + WORK( J ) = SUM + ABS( DBLE( A( J, J ) ) ) + 60 CONTINUE + DO 70 I = 1, N + SUM = WORK( I ) + IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM + 70 CONTINUE + ELSE + DO 80 I = 1, N + WORK( I ) = ZERO + 80 CONTINUE + DO 100 J = 1, N + SUM = WORK( J ) + ABS( DBLE( A( J, J ) ) ) + DO 90 I = J + 1, N + ABSA = ABS( A( I, J ) ) + SUM = SUM + ABSA + WORK( I ) = WORK( I ) + ABSA + 90 CONTINUE + IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM + 100 CONTINUE + END IF + ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN +* +* Find normF(A). +* + SCALE = ZERO + SUM = ONE + IF( LSAME( UPLO, 'U' ) ) THEN + DO 110 J = 2, N + CALL ZLASSQ( J-1, A( 1, J ), 1, SCALE, SUM ) + 110 CONTINUE + ELSE + DO 120 J = 1, N - 1 + CALL ZLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM ) + 120 CONTINUE + END IF + SUM = 2*SUM + DO 130 I = 1, N + IF( DBLE( A( I, I ) ).NE.ZERO ) THEN + ABSA = ABS( DBLE( A( I, I ) ) ) + IF( SCALE.LT.ABSA ) THEN + SUM = ONE + SUM*( SCALE / ABSA )**2 + SCALE = ABSA + ELSE + SUM = SUM + ( ABSA / SCALE )**2 + END IF + END IF + 130 CONTINUE + VALUE = SCALE*SQRT( SUM ) + END IF +* + ZLANHE = VALUE + RETURN +* +* End of ZLANHE +* + END diff --git a/lib/linalg/zlarf.f b/lib/linalg/zlarf.f new file mode 100644 index 0000000000..f51e1d7383 --- /dev/null +++ b/lib/linalg/zlarf.f @@ -0,0 +1,232 @@ +*> \brief \b ZLARF applies an elementary reflector to a general rectangular matrix. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLARF + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) +* +* .. Scalar Arguments .. +* CHARACTER SIDE +* INTEGER INCV, LDC, M, N +* COMPLEX*16 TAU +* .. +* .. Array Arguments .. +* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLARF applies a complex elementary reflector H to a complex M-by-N +*> matrix C, from either the left or the right. H is represented in the +*> form +*> +*> H = I - tau * v * v**H +*> +*> where tau is a complex scalar and v is a complex vector. +*> +*> If tau = 0, then H is taken to be the unit matrix. +*> +*> To apply H**H, supply conjg(tau) instead +*> tau. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] SIDE +*> \verbatim +*> SIDE is CHARACTER*1 +*> = 'L': form H * C +*> = 'R': form C * H +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix C. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix C. +*> \endverbatim +*> +*> \param[in] V +*> \verbatim +*> V is COMPLEX*16 array, dimension +*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' +*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' +*> The vector v in the representation of H. V is not used if +*> TAU = 0. +*> \endverbatim +*> +*> \param[in] INCV +*> \verbatim +*> INCV is INTEGER +*> The increment between elements of v. INCV <> 0. +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 +*> The value tau in the representation of H. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is COMPLEX*16 array, dimension (LDC,N) +*> On entry, the M-by-N matrix C. +*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', +*> or C * H if SIDE = 'R'. +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> The leading dimension of the array C. LDC >= max(1,M). +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension +*> (N) if SIDE = 'L' +*> or (M) if SIDE = 'R' +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER SIDE + INTEGER INCV, LDC, M, N + COMPLEX*16 TAU +* .. +* .. Array Arguments .. + COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL APPLYLEFT + INTEGER I, LASTV, LASTC +* .. +* .. External Subroutines .. + EXTERNAL ZGEMV, ZGERC +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAZLR, ILAZLC + EXTERNAL LSAME, ILAZLR, ILAZLC +* .. +* .. Executable Statements .. +* + APPLYLEFT = LSAME( SIDE, 'L' ) + LASTV = 0 + LASTC = 0 + IF( TAU.NE.ZERO ) THEN +* Set up variables for scanning V. LASTV begins pointing to the end +* of V. + IF( APPLYLEFT ) THEN + LASTV = M + ELSE + LASTV = N + END IF + IF( INCV.GT.0 ) THEN + I = 1 + (LASTV-1) * INCV + ELSE + I = 1 + END IF +* Look for the last non-zero row in V. + DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) + LASTV = LASTV - 1 + I = I - INCV + END DO + IF( APPLYLEFT ) THEN +* Scan for the last non-zero column in C(1:lastv,:). + LASTC = ILAZLC(LASTV, N, C, LDC) + ELSE +* Scan for the last non-zero row in C(:,1:lastv). + LASTC = ILAZLR(M, LASTV, C, LDC) + END IF + END IF +* Note that lastc.eq.0 renders the BLAS operations null; no special +* case is needed at this level. + IF( APPLYLEFT ) THEN +* +* Form H * C +* + IF( LASTV.GT.0 ) THEN +* +* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) +* + CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, + $ C, LDC, V, INCV, ZERO, WORK, 1 ) +* +* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H +* + CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) + END IF + ELSE +* +* Form C * H +* + IF( LASTV.GT.0 ) THEN +* +* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) +* + CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, + $ V, INCV, ZERO, WORK, 1 ) +* +* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H +* + CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) + END IF + END IF + RETURN +* +* End of ZLARF +* + END diff --git a/lib/linalg/zlarfb.f b/lib/linalg/zlarfb.f new file mode 100644 index 0000000000..99490f5827 --- /dev/null +++ b/lib/linalg/zlarfb.f @@ -0,0 +1,769 @@ +*> \brief \b ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLARFB + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, +* T, LDT, C, LDC, WORK, LDWORK ) +* +* .. Scalar Arguments .. +* CHARACTER DIRECT, SIDE, STOREV, TRANS +* INTEGER K, LDC, LDT, LDV, LDWORK, M, N +* .. +* .. Array Arguments .. +* COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), +* $ WORK( LDWORK, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLARFB applies a complex block reflector H or its transpose H**H to a +*> complex M-by-N matrix C, from either the left or the right. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] SIDE +*> \verbatim +*> SIDE is CHARACTER*1 +*> = 'L': apply H or H**H from the Left +*> = 'R': apply H or H**H from the Right +*> \endverbatim +*> +*> \param[in] TRANS +*> \verbatim +*> TRANS is CHARACTER*1 +*> = 'N': apply H (No transpose) +*> = 'C': apply H**H (Conjugate transpose) +*> \endverbatim +*> +*> \param[in] DIRECT +*> \verbatim +*> DIRECT is CHARACTER*1 +*> Indicates how H is formed from a product of elementary +*> reflectors +*> = 'F': H = H(1) H(2) . . . H(k) (Forward) +*> = 'B': H = H(k) . . . H(2) H(1) (Backward) +*> \endverbatim +*> +*> \param[in] STOREV +*> \verbatim +*> STOREV is CHARACTER*1 +*> Indicates how the vectors which define the elementary +*> reflectors are stored: +*> = 'C': Columnwise +*> = 'R': Rowwise +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix C. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix C. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The order of the matrix T (= the number of elementary +*> reflectors whose product defines the block reflector). +*> \endverbatim +*> +*> \param[in] V +*> \verbatim +*> V is COMPLEX*16 array, dimension +*> (LDV,K) if STOREV = 'C' +*> (LDV,M) if STOREV = 'R' and SIDE = 'L' +*> (LDV,N) if STOREV = 'R' and SIDE = 'R' +*> See Further Details. +*> \endverbatim +*> +*> \param[in] LDV +*> \verbatim +*> LDV is INTEGER +*> The leading dimension of the array V. +*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); +*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); +*> if STOREV = 'R', LDV >= K. +*> \endverbatim +*> +*> \param[in] T +*> \verbatim +*> T is COMPLEX*16 array, dimension (LDT,K) +*> The triangular K-by-K matrix T in the representation of the +*> block reflector. +*> \endverbatim +*> +*> \param[in] LDT +*> \verbatim +*> LDT is INTEGER +*> The leading dimension of the array T. LDT >= K. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is COMPLEX*16 array, dimension (LDC,N) +*> On entry, the M-by-N matrix C. +*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> The leading dimension of the array C. LDC >= max(1,M). +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (LDWORK,K) +*> \endverbatim +*> +*> \param[in] LDWORK +*> \verbatim +*> LDWORK is INTEGER +*> The leading dimension of the array WORK. +*> If SIDE = 'L', LDWORK >= max(1,N); +*> if SIDE = 'R', LDWORK >= max(1,M). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> The shape of the matrix V and the storage of the vectors which define +*> the H(i) is best illustrated by the following example with n = 5 and +*> k = 3. The elements equal to 1 are not stored; the corresponding +*> array elements are modified but restored on exit. The rest of the +*> array is not used. +*> +*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': +*> +*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) +*> ( v1 1 ) ( 1 v2 v2 v2 ) +*> ( v1 v2 1 ) ( 1 v3 v3 ) +*> ( v1 v2 v3 ) +*> ( v1 v2 v3 ) +*> +*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': +*> +*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) +*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) +*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) +*> ( 1 v3 ) +*> ( 1 ) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, + $ T, LDT, C, LDC, WORK, LDWORK ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER DIRECT, SIDE, STOREV, TRANS + INTEGER K, LDC, LDT, LDV, LDWORK, M, N +* .. +* .. Array Arguments .. + COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), + $ WORK( LDWORK, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + CHARACTER TRANST + INTEGER I, J, LASTV, LASTC +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAZLR, ILAZLC + EXTERNAL LSAME, ILAZLR, ILAZLC +* .. +* .. External Subroutines .. + EXTERNAL ZCOPY, ZGEMM, ZLACGV, ZTRMM +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( M.LE.0 .OR. N.LE.0 ) + $ RETURN +* + IF( LSAME( TRANS, 'N' ) ) THEN + TRANST = 'C' + ELSE + TRANST = 'N' + END IF +* + IF( LSAME( STOREV, 'C' ) ) THEN +* + IF( LSAME( DIRECT, 'F' ) ) THEN +* +* Let V = ( V1 ) (first K rows) +* ( V2 ) +* where V1 is unit lower triangular. +* + IF( LSAME( SIDE, 'L' ) ) THEN +* +* Form H * C or H**H * C where C = ( C1 ) +* ( C2 ) +* + LASTV = MAX( K, ILAZLR( M, K, V, LDV ) ) + LASTC = ILAZLC( LASTV, N, C, LDC ) +* +* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) +* +* W := C1**H +* + DO 10 J = 1, K + CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) + CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) + 10 CONTINUE +* +* W := W * V1 +* + CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', + $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) + IF( LASTV.GT.K ) THEN +* +* W := W + C2**H *V2 +* + CALL ZGEMM( 'Conjugate transpose', 'No transpose', + $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, + $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) + END IF +* +* W := W * T**H or W * T +* + CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - V * W**H +* + IF( M.GT.K ) THEN +* +* C2 := C2 - V2 * W**H +* + CALL ZGEMM( 'No transpose', 'Conjugate transpose', + $ LASTV-K, LASTC, K, + $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, + $ ONE, C( K+1, 1 ), LDC ) + END IF +* +* W := W * V1**H +* + CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) +* +* C1 := C1 - W**H +* + DO 30 J = 1, K + DO 20 I = 1, LASTC + C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) + 20 CONTINUE + 30 CONTINUE +* + ELSE IF( LSAME( SIDE, 'R' ) ) THEN +* +* Form C * H or C * H**H where C = ( C1 C2 ) +* + LASTV = MAX( K, ILAZLR( N, K, V, LDV ) ) + LASTC = ILAZLR( M, LASTV, C, LDC ) +* +* W := C * V = (C1*V1 + C2*V2) (stored in WORK) +* +* W := C1 +* + DO 40 J = 1, K + CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) + 40 CONTINUE +* +* W := W * V1 +* + CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', + $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) + IF( LASTV.GT.K ) THEN +* +* W := W + C2 * V2 +* + CALL ZGEMM( 'No transpose', 'No transpose', + $ LASTC, K, LASTV-K, + $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, + $ ONE, WORK, LDWORK ) + END IF +* +* W := W * T or W * T**H +* + CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - W * V**H +* + IF( LASTV.GT.K ) THEN +* +* C2 := C2 - W * V2**H +* + CALL ZGEMM( 'No transpose', 'Conjugate transpose', + $ LASTC, LASTV-K, K, + $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, + $ ONE, C( 1, K+1 ), LDC ) + END IF +* +* W := W * V1**H +* + CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) +* +* C1 := C1 - W +* + DO 60 J = 1, K + DO 50 I = 1, LASTC + C( I, J ) = C( I, J ) - WORK( I, J ) + 50 CONTINUE + 60 CONTINUE + END IF +* + ELSE +* +* Let V = ( V1 ) +* ( V2 ) (last K rows) +* where V2 is unit upper triangular. +* + IF( LSAME( SIDE, 'L' ) ) THEN +* +* Form H * C or H**H * C where C = ( C1 ) +* ( C2 ) +* + LASTC = ILAZLC( M, N, C, LDC ) +* +* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) +* +* W := C2**H +* + DO 70 J = 1, K + CALL ZCOPY( LASTC, C( M-K+J, 1 ), LDC, + $ WORK( 1, J ), 1 ) + CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) + 70 CONTINUE +* +* W := W * V2 +* + CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', + $ LASTC, K, ONE, V( M-K+1, 1 ), LDV, + $ WORK, LDWORK ) + IF( M.GT.K ) THEN +* +* W := W + C1**H*V1 +* + CALL ZGEMM( 'Conjugate transpose', 'No transpose', + $ LASTC, K, M-K, + $ ONE, C, LDC, V, LDV, + $ ONE, WORK, LDWORK ) + END IF +* +* W := W * T**H or W * T +* + CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - V * W**H +* + IF( M.GT.K ) THEN +* +* C1 := C1 - V1 * W**H +* + CALL ZGEMM( 'No transpose', 'Conjugate transpose', + $ M-K, LASTC, K, + $ -ONE, V, LDV, WORK, LDWORK, + $ ONE, C, LDC ) + END IF +* +* W := W * V2**H +* + CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V( M-K+1, 1 ), LDV, + $ WORK, LDWORK ) +* +* C2 := C2 - W**H +* + DO 90 J = 1, K + DO 80 I = 1, LASTC + C( M-K+J, I ) = C( M-K+J, I ) - + $ DCONJG( WORK( I, J ) ) + 80 CONTINUE + 90 CONTINUE +* + ELSE IF( LSAME( SIDE, 'R' ) ) THEN +* +* Form C * H or C * H**H where C = ( C1 C2 ) +* + LASTC = ILAZLR( M, N, C, LDC ) +* +* W := C * V = (C1*V1 + C2*V2) (stored in WORK) +* +* W := C2 +* + DO 100 J = 1, K + CALL ZCOPY( LASTC, C( 1, N-K+J ), 1, + $ WORK( 1, J ), 1 ) + 100 CONTINUE +* +* W := W * V2 +* + CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', + $ LASTC, K, ONE, V( N-K+1, 1 ), LDV, + $ WORK, LDWORK ) + IF( N.GT.K ) THEN +* +* W := W + C1 * V1 +* + CALL ZGEMM( 'No transpose', 'No transpose', + $ LASTC, K, N-K, + $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) + END IF +* +* W := W * T or W * T**H +* + CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - W * V**H +* + IF( N.GT.K ) THEN +* +* C1 := C1 - W * V1**H +* + CALL ZGEMM( 'No transpose', 'Conjugate transpose', + $ LASTC, N-K, K, -ONE, WORK, LDWORK, V, LDV, + $ ONE, C, LDC ) + END IF +* +* W := W * V2**H +* + CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V( N-K+1, 1 ), LDV, + $ WORK, LDWORK ) +* +* C2 := C2 - W +* + DO 120 J = 1, K + DO 110 I = 1, LASTC + C( I, N-K+J ) = C( I, N-K+J ) + $ - WORK( I, J ) + 110 CONTINUE + 120 CONTINUE + END IF + END IF +* + ELSE IF( LSAME( STOREV, 'R' ) ) THEN +* + IF( LSAME( DIRECT, 'F' ) ) THEN +* +* Let V = ( V1 V2 ) (V1: first K columns) +* where V1 is unit upper triangular. +* + IF( LSAME( SIDE, 'L' ) ) THEN +* +* Form H * C or H**H * C where C = ( C1 ) +* ( C2 ) +* + LASTV = MAX( K, ILAZLC( K, M, V, LDV ) ) + LASTC = ILAZLC( LASTV, N, C, LDC ) +* +* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) +* +* W := C1**H +* + DO 130 J = 1, K + CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) + CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) + 130 CONTINUE +* +* W := W * V1**H +* + CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) + IF( LASTV.GT.K ) THEN +* +* W := W + C2**H*V2**H +* + CALL ZGEMM( 'Conjugate transpose', + $ 'Conjugate transpose', LASTC, K, LASTV-K, + $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, + $ ONE, WORK, LDWORK ) + END IF +* +* W := W * T**H or W * T +* + CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - V**H * W**H +* + IF( LASTV.GT.K ) THEN +* +* C2 := C2 - V2**H * W**H +* + CALL ZGEMM( 'Conjugate transpose', + $ 'Conjugate transpose', LASTV-K, LASTC, K, + $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, + $ ONE, C( K+1, 1 ), LDC ) + END IF +* +* W := W * V1 +* + CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', + $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) +* +* C1 := C1 - W**H +* + DO 150 J = 1, K + DO 140 I = 1, LASTC + C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) + 140 CONTINUE + 150 CONTINUE +* + ELSE IF( LSAME( SIDE, 'R' ) ) THEN +* +* Form C * H or C * H**H where C = ( C1 C2 ) +* + LASTV = MAX( K, ILAZLC( K, N, V, LDV ) ) + LASTC = ILAZLR( M, LASTV, C, LDC ) +* +* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) +* +* W := C1 +* + DO 160 J = 1, K + CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) + 160 CONTINUE +* +* W := W * V1**H +* + CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) + IF( LASTV.GT.K ) THEN +* +* W := W + C2 * V2**H +* + CALL ZGEMM( 'No transpose', 'Conjugate transpose', + $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, + $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) + END IF +* +* W := W * T or W * T**H +* + CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - W * V +* + IF( LASTV.GT.K ) THEN +* +* C2 := C2 - W * V2 +* + CALL ZGEMM( 'No transpose', 'No transpose', + $ LASTC, LASTV-K, K, + $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, + $ ONE, C( 1, K+1 ), LDC ) + END IF +* +* W := W * V1 +* + CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', + $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) +* +* C1 := C1 - W +* + DO 180 J = 1, K + DO 170 I = 1, LASTC + C( I, J ) = C( I, J ) - WORK( I, J ) + 170 CONTINUE + 180 CONTINUE +* + END IF +* + ELSE +* +* Let V = ( V1 V2 ) (V2: last K columns) +* where V2 is unit lower triangular. +* + IF( LSAME( SIDE, 'L' ) ) THEN +* +* Form H * C or H**H * C where C = ( C1 ) +* ( C2 ) +* + LASTC = ILAZLC( M, N, C, LDC ) +* +* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) +* +* W := C2**H +* + DO 190 J = 1, K + CALL ZCOPY( LASTC, C( M-K+J, 1 ), LDC, + $ WORK( 1, J ), 1 ) + CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) + 190 CONTINUE +* +* W := W * V2**H +* + CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V( 1, M-K+1 ), LDV, + $ WORK, LDWORK ) + IF( M.GT.K ) THEN +* +* W := W + C1**H * V1**H +* + CALL ZGEMM( 'Conjugate transpose', + $ 'Conjugate transpose', LASTC, K, M-K, + $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) + END IF +* +* W := W * T**H or W * T +* + CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - V**H * W**H +* + IF( M.GT.K ) THEN +* +* C1 := C1 - V1**H * W**H +* + CALL ZGEMM( 'Conjugate transpose', + $ 'Conjugate transpose', M-K, LASTC, K, + $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) + END IF +* +* W := W * V2 +* + CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', + $ LASTC, K, ONE, V( 1, M-K+1 ), LDV, + $ WORK, LDWORK ) +* +* C2 := C2 - W**H +* + DO 210 J = 1, K + DO 200 I = 1, LASTC + C( M-K+J, I ) = C( M-K+J, I ) - + $ DCONJG( WORK( I, J ) ) + 200 CONTINUE + 210 CONTINUE +* + ELSE IF( LSAME( SIDE, 'R' ) ) THEN +* +* Form C * H or C * H**H where C = ( C1 C2 ) +* + LASTC = ILAZLR( M, N, C, LDC ) +* +* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) +* +* W := C2 +* + DO 220 J = 1, K + CALL ZCOPY( LASTC, C( 1, N-K+J ), 1, + $ WORK( 1, J ), 1 ) + 220 CONTINUE +* +* W := W * V2**H +* + CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', + $ 'Unit', LASTC, K, ONE, V( 1, N-K+1 ), LDV, + $ WORK, LDWORK ) + IF( N.GT.K ) THEN +* +* W := W + C1 * V1**H +* + CALL ZGEMM( 'No transpose', 'Conjugate transpose', + $ LASTC, K, N-K, ONE, C, LDC, V, LDV, ONE, + $ WORK, LDWORK ) + END IF +* +* W := W * T or W * T**H +* + CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', + $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) +* +* C := C - W * V +* + IF( N.GT.K ) THEN +* +* C1 := C1 - W * V1 +* + CALL ZGEMM( 'No transpose', 'No transpose', + $ LASTC, N-K, K, -ONE, WORK, LDWORK, V, LDV, + $ ONE, C, LDC ) + END IF +* +* W := W * V2 +* + CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', + $ LASTC, K, ONE, V( 1, N-K+1 ), LDV, + $ WORK, LDWORK ) +* +* C1 := C1 - W +* + DO 240 J = 1, K + DO 230 I = 1, LASTC + C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J ) + 230 CONTINUE + 240 CONTINUE +* + END IF +* + END IF + END IF +* + RETURN +* +* End of ZLARFB +* + END diff --git a/lib/linalg/zlarfg.f b/lib/linalg/zlarfg.f new file mode 100644 index 0000000000..e37c683fc9 --- /dev/null +++ b/lib/linalg/zlarfg.f @@ -0,0 +1,203 @@ +*> \brief \b ZLARFG generates an elementary reflector (Householder matrix). +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLARFG + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) +* +* .. Scalar Arguments .. +* INTEGER INCX, N +* COMPLEX*16 ALPHA, TAU +* .. +* .. Array Arguments .. +* COMPLEX*16 X( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLARFG generates a complex elementary reflector H of order n, such +*> that +*> +*> H**H * ( alpha ) = ( beta ), H**H * H = I. +*> ( x ) ( 0 ) +*> +*> where alpha and beta are scalars, with beta real, and x is an +*> (n-1)-element complex vector. H is represented in the form +*> +*> H = I - tau * ( 1 ) * ( 1 v**H ) , +*> ( v ) +*> +*> where tau is a complex scalar and v is a complex (n-1)-element +*> vector. Note that H is not hermitian. +*> +*> If the elements of x are all zero and alpha is real, then tau = 0 +*> and H is taken to be the unit matrix. +*> +*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the elementary reflector. +*> \endverbatim +*> +*> \param[in,out] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, the value alpha. +*> On exit, it is overwritten with the value beta. +*> \endverbatim +*> +*> \param[in,out] X +*> \verbatim +*> X is COMPLEX*16 array, dimension +*> (1+(N-2)*abs(INCX)) +*> On entry, the vector x. +*> On exit, it is overwritten with the vector v. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> The increment between elements of X. INCX > 0. +*> \endverbatim +*> +*> \param[out] TAU +*> \verbatim +*> TAU is COMPLEX*16 +*> The value tau. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER INCX, N + COMPLEX*16 ALPHA, TAU +* .. +* .. Array Arguments .. + COMPLEX*16 X( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER J, KNT + DOUBLE PRECISION ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM +* .. +* .. External Functions .. + DOUBLE PRECISION DLAMCH, DLAPY3, DZNRM2 + COMPLEX*16 ZLADIV + EXTERNAL DLAMCH, DLAPY3, DZNRM2, ZLADIV +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DCMPLX, DIMAG, SIGN +* .. +* .. External Subroutines .. + EXTERNAL ZDSCAL, ZSCAL +* .. +* .. Executable Statements .. +* + IF( N.LE.0 ) THEN + TAU = ZERO + RETURN + END IF +* + XNORM = DZNRM2( N-1, X, INCX ) + ALPHR = DBLE( ALPHA ) + ALPHI = DIMAG( ALPHA ) +* + IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN +* +* H = I +* + TAU = ZERO + ELSE +* +* general case +* + BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) + SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) + RSAFMN = ONE / SAFMIN +* + KNT = 0 + IF( ABS( BETA ).LT.SAFMIN ) THEN +* +* XNORM, BETA may be inaccurate; scale X and recompute them +* + 10 CONTINUE + KNT = KNT + 1 + CALL ZDSCAL( N-1, RSAFMN, X, INCX ) + BETA = BETA*RSAFMN + ALPHI = ALPHI*RSAFMN + ALPHR = ALPHR*RSAFMN + IF( ABS( BETA ).LT.SAFMIN ) + $ GO TO 10 +* +* New BETA is at most 1, at least SAFMIN +* + XNORM = DZNRM2( N-1, X, INCX ) + ALPHA = DCMPLX( ALPHR, ALPHI ) + BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) + END IF + TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) + ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA ) + CALL ZSCAL( N-1, ALPHA, X, INCX ) +* +* If ALPHA is subnormal, it may lose relative accuracy +* + DO 20 J = 1, KNT + BETA = BETA*SAFMIN + 20 CONTINUE + ALPHA = BETA + END IF +* + RETURN +* +* End of ZLARFG +* + END diff --git a/lib/linalg/zlarft.f b/lib/linalg/zlarft.f new file mode 100644 index 0000000000..2278d11d2b --- /dev/null +++ b/lib/linalg/zlarft.f @@ -0,0 +1,327 @@ +*> \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLARFT + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) +* +* .. Scalar Arguments .. +* CHARACTER DIRECT, STOREV +* INTEGER K, LDT, LDV, N +* .. +* .. Array Arguments .. +* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLARFT forms the triangular factor T of a complex block reflector H +*> of order n, which is defined as a product of k elementary reflectors. +*> +*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; +*> +*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. +*> +*> If STOREV = 'C', the vector which defines the elementary reflector +*> H(i) is stored in the i-th column of the array V, and +*> +*> H = I - V * T * V**H +*> +*> If STOREV = 'R', the vector which defines the elementary reflector +*> H(i) is stored in the i-th row of the array V, and +*> +*> H = I - V**H * T * V +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] DIRECT +*> \verbatim +*> DIRECT is CHARACTER*1 +*> Specifies the order in which the elementary reflectors are +*> multiplied to form the block reflector: +*> = 'F': H = H(1) H(2) . . . H(k) (Forward) +*> = 'B': H = H(k) . . . H(2) H(1) (Backward) +*> \endverbatim +*> +*> \param[in] STOREV +*> \verbatim +*> STOREV is CHARACTER*1 +*> Specifies how the vectors which define the elementary +*> reflectors are stored (see also Further Details): +*> = 'C': columnwise +*> = 'R': rowwise +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the block reflector H. N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The order of the triangular factor T (= the number of +*> elementary reflectors). K >= 1. +*> \endverbatim +*> +*> \param[in] V +*> \verbatim +*> V is COMPLEX*16 array, dimension +*> (LDV,K) if STOREV = 'C' +*> (LDV,N) if STOREV = 'R' +*> The matrix V. See further details. +*> \endverbatim +*> +*> \param[in] LDV +*> \verbatim +*> LDV is INTEGER +*> The leading dimension of the array V. +*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i). +*> \endverbatim +*> +*> \param[out] T +*> \verbatim +*> T is COMPLEX*16 array, dimension (LDT,K) +*> The k by k triangular factor T of the block reflector. +*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is +*> lower triangular. The rest of the array is not used. +*> \endverbatim +*> +*> \param[in] LDT +*> \verbatim +*> LDT is INTEGER +*> The leading dimension of the array T. LDT >= K. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> The shape of the matrix V and the storage of the vectors which define +*> the H(i) is best illustrated by the following example with n = 5 and +*> k = 3. The elements equal to 1 are not stored. +*> +*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': +*> +*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) +*> ( v1 1 ) ( 1 v2 v2 v2 ) +*> ( v1 v2 1 ) ( 1 v3 v3 ) +*> ( v1 v2 v3 ) +*> ( v1 v2 v3 ) +*> +*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': +*> +*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) +*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) +*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) +*> ( 1 v3 ) +*> ( 1 ) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER DIRECT, STOREV + INTEGER K, LDT, LDV, N +* .. +* .. Array Arguments .. + COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, J, PREVLASTV, LASTV +* .. +* .. External Subroutines .. + EXTERNAL ZGEMV, ZLACGV, ZTRMV +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* + IF( LSAME( DIRECT, 'F' ) ) THEN + PREVLASTV = N + DO I = 1, K + PREVLASTV = MAX( PREVLASTV, I ) + IF( TAU( I ).EQ.ZERO ) THEN +* +* H(i) = I +* + DO J = 1, I + T( J, I ) = ZERO + END DO + ELSE +* +* general case +* + IF( LSAME( STOREV, 'C' ) ) THEN +* Skip any trailing zeros. + DO LASTV = N, I+1, -1 + IF( V( LASTV, I ).NE.ZERO ) EXIT + END DO + DO J = 1, I-1 + T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) + END DO + J = MIN( LASTV, PREVLASTV ) +* +* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) +* + CALL ZGEMV( 'Conjugate transpose', J-I, I-1, + $ -TAU( I ), V( I+1, 1 ), LDV, + $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) + ELSE +* Skip any trailing zeros. + DO LASTV = N, I+1, -1 + IF( V( I, LASTV ).NE.ZERO ) EXIT + END DO + DO J = 1, I-1 + T( J, I ) = -TAU( I ) * V( J , I ) + END DO + J = MIN( LASTV, PREVLASTV ) +* +* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H +* + CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), + $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, + $ ONE, T( 1, I ), LDT ) + END IF +* +* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) +* + CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, + $ LDT, T( 1, I ), 1 ) + T( I, I ) = TAU( I ) + IF( I.GT.1 ) THEN + PREVLASTV = MAX( PREVLASTV, LASTV ) + ELSE + PREVLASTV = LASTV + END IF + END IF + END DO + ELSE + PREVLASTV = 1 + DO I = K, 1, -1 + IF( TAU( I ).EQ.ZERO ) THEN +* +* H(i) = I +* + DO J = I, K + T( J, I ) = ZERO + END DO + ELSE +* +* general case +* + IF( I.LT.K ) THEN + IF( LSAME( STOREV, 'C' ) ) THEN +* Skip any leading zeros. + DO LASTV = 1, I-1 + IF( V( LASTV, I ).NE.ZERO ) EXIT + END DO + DO J = I+1, K + T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) + END DO + J = MAX( LASTV, PREVLASTV ) +* +* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) +* + CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, + $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), + $ 1, ONE, T( I+1, I ), 1 ) + ELSE +* Skip any leading zeros. + DO LASTV = 1, I-1 + IF( V( I, LASTV ).NE.ZERO ) EXIT + END DO + DO J = I+1, K + T( J, I ) = -TAU( I ) * V( J, N-K+I ) + END DO + J = MAX( LASTV, PREVLASTV ) +* +* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H +* + CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), + $ V( I+1, J ), LDV, V( I, J ), LDV, + $ ONE, T( I+1, I ), LDT ) + END IF +* +* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) +* + CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, + $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) + IF( I.GT.1 ) THEN + PREVLASTV = MIN( PREVLASTV, LASTV ) + ELSE + PREVLASTV = LASTV + END IF + END IF + T( I, I ) = TAU( I ) + END IF + END DO + END IF + RETURN +* +* End of ZLARFT +* + END diff --git a/lib/linalg/zlascl.f b/lib/linalg/zlascl.f new file mode 100644 index 0000000000..51a4f0f614 --- /dev/null +++ b/lib/linalg/zlascl.f @@ -0,0 +1,364 @@ +*> \brief \b ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLASCL + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER TYPE +* INTEGER INFO, KL, KU, LDA, M, N +* DOUBLE PRECISION CFROM, CTO +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLASCL multiplies the M by N complex matrix A by the real scalar +*> CTO/CFROM. This is done without over/underflow as long as the final +*> result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that +*> A may be full, upper triangular, lower triangular, upper Hessenberg, +*> or banded. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] TYPE +*> \verbatim +*> TYPE is CHARACTER*1 +*> TYPE indices the storage type of the input matrix. +*> = 'G': A is a full matrix. +*> = 'L': A is a lower triangular matrix. +*> = 'U': A is an upper triangular matrix. +*> = 'H': A is an upper Hessenberg matrix. +*> = 'B': A is a symmetric band matrix with lower bandwidth KL +*> and upper bandwidth KU and with the only the lower +*> half stored. +*> = 'Q': A is a symmetric band matrix with lower bandwidth KL +*> and upper bandwidth KU and with the only the upper +*> half stored. +*> = 'Z': A is a band matrix with lower bandwidth KL and upper +*> bandwidth KU. See ZGBTRF for storage details. +*> \endverbatim +*> +*> \param[in] KL +*> \verbatim +*> KL is INTEGER +*> The lower bandwidth of A. Referenced only if TYPE = 'B', +*> 'Q' or 'Z'. +*> \endverbatim +*> +*> \param[in] KU +*> \verbatim +*> KU is INTEGER +*> The upper bandwidth of A. Referenced only if TYPE = 'B', +*> 'Q' or 'Z'. +*> \endverbatim +*> +*> \param[in] CFROM +*> \verbatim +*> CFROM is DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] CTO +*> \verbatim +*> CTO is DOUBLE PRECISION +*> +*> The matrix A is multiplied by CTO/CFROM. A(I,J) is computed +*> without over/underflow if the final result CTO*A(I,J)/CFROM +*> can be represented without over/underflow. CFROM must be +*> nonzero. +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix A. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> The matrix to be multiplied by CTO/CFROM. See TYPE for the +*> storage type. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> 0 - successful exit +*> <0 - if INFO = -i, the i-th argument had an illegal value. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER TYPE + INTEGER INFO, KL, KU, LDA, M, N + DOUBLE PRECISION CFROM, CTO +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) +* .. +* .. Local Scalars .. + LOGICAL DONE + INTEGER I, ITYPE, J, K1, K2, K3, K4 + DOUBLE PRECISION BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM +* .. +* .. External Functions .. + LOGICAL LSAME, DISNAN + DOUBLE PRECISION DLAMCH + EXTERNAL LSAME, DLAMCH, DISNAN +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, MIN +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 +* + IF( LSAME( TYPE, 'G' ) ) THEN + ITYPE = 0 + ELSE IF( LSAME( TYPE, 'L' ) ) THEN + ITYPE = 1 + ELSE IF( LSAME( TYPE, 'U' ) ) THEN + ITYPE = 2 + ELSE IF( LSAME( TYPE, 'H' ) ) THEN + ITYPE = 3 + ELSE IF( LSAME( TYPE, 'B' ) ) THEN + ITYPE = 4 + ELSE IF( LSAME( TYPE, 'Q' ) ) THEN + ITYPE = 5 + ELSE IF( LSAME( TYPE, 'Z' ) ) THEN + ITYPE = 6 + ELSE + ITYPE = -1 + END IF +* + IF( ITYPE.EQ.-1 ) THEN + INFO = -1 + ELSE IF( CFROM.EQ.ZERO .OR. DISNAN(CFROM) ) THEN + INFO = -4 + ELSE IF( DISNAN(CTO) ) THEN + INFO = -5 + ELSE IF( M.LT.0 ) THEN + INFO = -6 + ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR. + $ ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN + INFO = -7 + ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN + INFO = -9 + ELSE IF( ITYPE.GE.4 ) THEN + IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN + INFO = -2 + ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR. + $ ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) ) + $ THEN + INFO = -3 + ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR. + $ ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR. + $ ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN + INFO = -9 + END IF + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZLASCL', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. M.EQ.0 ) + $ RETURN +* +* Get machine parameters +* + SMLNUM = DLAMCH( 'S' ) + BIGNUM = ONE / SMLNUM +* + CFROMC = CFROM + CTOC = CTO +* + 10 CONTINUE + CFROM1 = CFROMC*SMLNUM + IF( CFROM1.EQ.CFROMC ) THEN +! CFROMC is an inf. Multiply by a correctly signed zero for +! finite CTOC, or a NaN if CTOC is infinite. + MUL = CTOC / CFROMC + DONE = .TRUE. + CTO1 = CTOC + ELSE + CTO1 = CTOC / BIGNUM + IF( CTO1.EQ.CTOC ) THEN +! CTOC is either 0 or an inf. In both cases, CTOC itself +! serves as the correct multiplication factor. + MUL = CTOC + DONE = .TRUE. + CFROMC = ONE + ELSE IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN + MUL = SMLNUM + DONE = .FALSE. + CFROMC = CFROM1 + ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN + MUL = BIGNUM + DONE = .FALSE. + CTOC = CTO1 + ELSE + MUL = CTOC / CFROMC + DONE = .TRUE. + END IF + END IF +* + IF( ITYPE.EQ.0 ) THEN +* +* Full matrix +* + DO 30 J = 1, N + DO 20 I = 1, M + A( I, J ) = A( I, J )*MUL + 20 CONTINUE + 30 CONTINUE +* + ELSE IF( ITYPE.EQ.1 ) THEN +* +* Lower triangular matrix +* + DO 50 J = 1, N + DO 40 I = J, M + A( I, J ) = A( I, J )*MUL + 40 CONTINUE + 50 CONTINUE +* + ELSE IF( ITYPE.EQ.2 ) THEN +* +* Upper triangular matrix +* + DO 70 J = 1, N + DO 60 I = 1, MIN( J, M ) + A( I, J ) = A( I, J )*MUL + 60 CONTINUE + 70 CONTINUE +* + ELSE IF( ITYPE.EQ.3 ) THEN +* +* Upper Hessenberg matrix +* + DO 90 J = 1, N + DO 80 I = 1, MIN( J+1, M ) + A( I, J ) = A( I, J )*MUL + 80 CONTINUE + 90 CONTINUE +* + ELSE IF( ITYPE.EQ.4 ) THEN +* +* Lower half of a symmetric band matrix +* + K3 = KL + 1 + K4 = N + 1 + DO 110 J = 1, N + DO 100 I = 1, MIN( K3, K4-J ) + A( I, J ) = A( I, J )*MUL + 100 CONTINUE + 110 CONTINUE +* + ELSE IF( ITYPE.EQ.5 ) THEN +* +* Upper half of a symmetric band matrix +* + K1 = KU + 2 + K3 = KU + 1 + DO 130 J = 1, N + DO 120 I = MAX( K1-J, 1 ), K3 + A( I, J ) = A( I, J )*MUL + 120 CONTINUE + 130 CONTINUE +* + ELSE IF( ITYPE.EQ.6 ) THEN +* +* Band matrix +* + K1 = KL + KU + 2 + K2 = KL + 1 + K3 = 2*KL + KU + 1 + K4 = KL + KU + 1 + M + DO 150 J = 1, N + DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J ) + A( I, J ) = A( I, J )*MUL + 140 CONTINUE + 150 CONTINUE +* + END IF +* + IF( .NOT.DONE ) + $ GO TO 10 +* + RETURN +* +* End of ZLASCL +* + END diff --git a/lib/linalg/zlaset.f b/lib/linalg/zlaset.f new file mode 100644 index 0000000000..11f82361b7 --- /dev/null +++ b/lib/linalg/zlaset.f @@ -0,0 +1,184 @@ +*> \brief \b ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLASET + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER LDA, M, N +* COMPLEX*16 ALPHA, BETA +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLASET initializes a 2-D array A to BETA on the diagonal and +*> ALPHA on the offdiagonals. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> Specifies the part of the matrix A to be set. +*> = 'U': Upper triangular part is set. The lower triangle +*> is unchanged. +*> = 'L': Lower triangular part is set. The upper triangle +*> is unchanged. +*> Otherwise: All of the matrix A is set. +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> On entry, M specifies the number of rows of A. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of columns of A. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> All the offdiagonal array elements are set to ALPHA. +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is COMPLEX*16 +*> All the diagonal array elements are set to BETA. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the m by n matrix A. +*> On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j; +*> A(i,i) = BETA , 1 <= i <= min(m,n) +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,M). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER LDA, M, N + COMPLEX*16 ALPHA, BETA +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I, J +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. Intrinsic Functions .. + INTRINSIC MIN +* .. +* .. Executable Statements .. +* + IF( LSAME( UPLO, 'U' ) ) THEN +* +* Set the diagonal to BETA and the strictly upper triangular +* part of the array to ALPHA. +* + DO 20 J = 2, N + DO 10 I = 1, MIN( J-1, M ) + A( I, J ) = ALPHA + 10 CONTINUE + 20 CONTINUE + DO 30 I = 1, MIN( N, M ) + A( I, I ) = BETA + 30 CONTINUE +* + ELSE IF( LSAME( UPLO, 'L' ) ) THEN +* +* Set the diagonal to BETA and the strictly lower triangular +* part of the array to ALPHA. +* + DO 50 J = 1, MIN( M, N ) + DO 40 I = J + 1, M + A( I, J ) = ALPHA + 40 CONTINUE + 50 CONTINUE + DO 60 I = 1, MIN( N, M ) + A( I, I ) = BETA + 60 CONTINUE +* + ELSE +* +* Set the array to BETA on the diagonal and ALPHA on the +* offdiagonal. +* + DO 80 J = 1, N + DO 70 I = 1, M + A( I, J ) = ALPHA + 70 CONTINUE + 80 CONTINUE + DO 90 I = 1, MIN( M, N ) + A( I, I ) = BETA + 90 CONTINUE + END IF +* + RETURN +* +* End of ZLASET +* + END diff --git a/lib/linalg/zlasr.f b/lib/linalg/zlasr.f new file mode 100644 index 0000000000..5243d8304a --- /dev/null +++ b/lib/linalg/zlasr.f @@ -0,0 +1,439 @@ +*> \brief \b ZLASR applies a sequence of plane rotations to a general rectangular matrix. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLASR + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) +* +* .. Scalar Arguments .. +* CHARACTER DIRECT, PIVOT, SIDE +* INTEGER LDA, M, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION C( * ), S( * ) +* COMPLEX*16 A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLASR applies a sequence of real plane rotations to a complex matrix +*> A, from either the left or the right. +*> +*> When SIDE = 'L', the transformation takes the form +*> +*> A := P*A +*> +*> and when SIDE = 'R', the transformation takes the form +*> +*> A := A*P**T +*> +*> where P is an orthogonal matrix consisting of a sequence of z plane +*> rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', +*> and P**T is the transpose of P. +*> +*> When DIRECT = 'F' (Forward sequence), then +*> +*> P = P(z-1) * ... * P(2) * P(1) +*> +*> and when DIRECT = 'B' (Backward sequence), then +*> +*> P = P(1) * P(2) * ... * P(z-1) +*> +*> where P(k) is a plane rotation matrix defined by the 2-by-2 rotation +*> +*> R(k) = ( c(k) s(k) ) +*> = ( -s(k) c(k) ). +*> +*> When PIVOT = 'V' (Variable pivot), the rotation is performed +*> for the plane (k,k+1), i.e., P(k) has the form +*> +*> P(k) = ( 1 ) +*> ( ... ) +*> ( 1 ) +*> ( c(k) s(k) ) +*> ( -s(k) c(k) ) +*> ( 1 ) +*> ( ... ) +*> ( 1 ) +*> +*> where R(k) appears as a rank-2 modification to the identity matrix in +*> rows and columns k and k+1. +*> +*> When PIVOT = 'T' (Top pivot), the rotation is performed for the +*> plane (1,k+1), so P(k) has the form +*> +*> P(k) = ( c(k) s(k) ) +*> ( 1 ) +*> ( ... ) +*> ( 1 ) +*> ( -s(k) c(k) ) +*> ( 1 ) +*> ( ... ) +*> ( 1 ) +*> +*> where R(k) appears in rows and columns 1 and k+1. +*> +*> Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is +*> performed for the plane (k,z), giving P(k) the form +*> +*> P(k) = ( 1 ) +*> ( ... ) +*> ( 1 ) +*> ( c(k) s(k) ) +*> ( 1 ) +*> ( ... ) +*> ( 1 ) +*> ( -s(k) c(k) ) +*> +*> where R(k) appears in rows and columns k and z. The rotations are +*> performed without ever forming P(k) explicitly. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] SIDE +*> \verbatim +*> SIDE is CHARACTER*1 +*> Specifies whether the plane rotation matrix P is applied to +*> A on the left or the right. +*> = 'L': Left, compute A := P*A +*> = 'R': Right, compute A:= A*P**T +*> \endverbatim +*> +*> \param[in] PIVOT +*> \verbatim +*> PIVOT is CHARACTER*1 +*> Specifies the plane for which P(k) is a plane rotation +*> matrix. +*> = 'V': Variable pivot, the plane (k,k+1) +*> = 'T': Top pivot, the plane (1,k+1) +*> = 'B': Bottom pivot, the plane (k,z) +*> \endverbatim +*> +*> \param[in] DIRECT +*> \verbatim +*> DIRECT is CHARACTER*1 +*> Specifies whether P is a forward or backward sequence of +*> plane rotations. +*> = 'F': Forward, P = P(z-1)*...*P(2)*P(1) +*> = 'B': Backward, P = P(1)*P(2)*...*P(z-1) +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix A. If m <= 1, an immediate +*> return is effected. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix A. If n <= 1, an +*> immediate return is effected. +*> \endverbatim +*> +*> \param[in] C +*> \verbatim +*> C is DOUBLE PRECISION array, dimension +*> (M-1) if SIDE = 'L' +*> (N-1) if SIDE = 'R' +*> The cosines c(k) of the plane rotations. +*> \endverbatim +*> +*> \param[in] S +*> \verbatim +*> S is DOUBLE PRECISION array, dimension +*> (M-1) if SIDE = 'L' +*> (N-1) if SIDE = 'R' +*> The sines s(k) of the plane rotations. The 2-by-2 plane +*> rotation part of the matrix P(k), R(k), has the form +*> R(k) = ( c(k) s(k) ) +*> ( -s(k) c(k) ). +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> The M-by-N matrix A. On exit, A is overwritten by P*A if +*> SIDE = 'R' or by A*P**T if SIDE = 'L'. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,M). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER DIRECT, PIVOT, SIDE + INTEGER LDA, M, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION C( * ), S( * ) + COMPLEX*16 A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, INFO, J + DOUBLE PRECISION CTEMP, STEMP + COMPLEX*16 TEMP +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Executable Statements .. +* +* Test the input parameters +* + INFO = 0 + IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN + INFO = 1 + ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT, + $ 'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN + INFO = 2 + ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) ) + $ THEN + INFO = 3 + ELSE IF( M.LT.0 ) THEN + INFO = 4 + ELSE IF( N.LT.0 ) THEN + INFO = 5 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = 9 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZLASR ', INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) ) + $ RETURN + IF( LSAME( SIDE, 'L' ) ) THEN +* +* Form P * A +* + IF( LSAME( PIVOT, 'V' ) ) THEN + IF( LSAME( DIRECT, 'F' ) ) THEN + DO 20 J = 1, M - 1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 10 I = 1, N + TEMP = A( J+1, I ) + A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I ) + A( J, I ) = STEMP*TEMP + CTEMP*A( J, I ) + 10 CONTINUE + END IF + 20 CONTINUE + ELSE IF( LSAME( DIRECT, 'B' ) ) THEN + DO 40 J = M - 1, 1, -1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 30 I = 1, N + TEMP = A( J+1, I ) + A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I ) + A( J, I ) = STEMP*TEMP + CTEMP*A( J, I ) + 30 CONTINUE + END IF + 40 CONTINUE + END IF + ELSE IF( LSAME( PIVOT, 'T' ) ) THEN + IF( LSAME( DIRECT, 'F' ) ) THEN + DO 60 J = 2, M + CTEMP = C( J-1 ) + STEMP = S( J-1 ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 50 I = 1, N + TEMP = A( J, I ) + A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I ) + A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I ) + 50 CONTINUE + END IF + 60 CONTINUE + ELSE IF( LSAME( DIRECT, 'B' ) ) THEN + DO 80 J = M, 2, -1 + CTEMP = C( J-1 ) + STEMP = S( J-1 ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 70 I = 1, N + TEMP = A( J, I ) + A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I ) + A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I ) + 70 CONTINUE + END IF + 80 CONTINUE + END IF + ELSE IF( LSAME( PIVOT, 'B' ) ) THEN + IF( LSAME( DIRECT, 'F' ) ) THEN + DO 100 J = 1, M - 1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 90 I = 1, N + TEMP = A( J, I ) + A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP + A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP + 90 CONTINUE + END IF + 100 CONTINUE + ELSE IF( LSAME( DIRECT, 'B' ) ) THEN + DO 120 J = M - 1, 1, -1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 110 I = 1, N + TEMP = A( J, I ) + A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP + A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP + 110 CONTINUE + END IF + 120 CONTINUE + END IF + END IF + ELSE IF( LSAME( SIDE, 'R' ) ) THEN +* +* Form A * P**T +* + IF( LSAME( PIVOT, 'V' ) ) THEN + IF( LSAME( DIRECT, 'F' ) ) THEN + DO 140 J = 1, N - 1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 130 I = 1, M + TEMP = A( I, J+1 ) + A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J ) + A( I, J ) = STEMP*TEMP + CTEMP*A( I, J ) + 130 CONTINUE + END IF + 140 CONTINUE + ELSE IF( LSAME( DIRECT, 'B' ) ) THEN + DO 160 J = N - 1, 1, -1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 150 I = 1, M + TEMP = A( I, J+1 ) + A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J ) + A( I, J ) = STEMP*TEMP + CTEMP*A( I, J ) + 150 CONTINUE + END IF + 160 CONTINUE + END IF + ELSE IF( LSAME( PIVOT, 'T' ) ) THEN + IF( LSAME( DIRECT, 'F' ) ) THEN + DO 180 J = 2, N + CTEMP = C( J-1 ) + STEMP = S( J-1 ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 170 I = 1, M + TEMP = A( I, J ) + A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 ) + A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 ) + 170 CONTINUE + END IF + 180 CONTINUE + ELSE IF( LSAME( DIRECT, 'B' ) ) THEN + DO 200 J = N, 2, -1 + CTEMP = C( J-1 ) + STEMP = S( J-1 ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 190 I = 1, M + TEMP = A( I, J ) + A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 ) + A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 ) + 190 CONTINUE + END IF + 200 CONTINUE + END IF + ELSE IF( LSAME( PIVOT, 'B' ) ) THEN + IF( LSAME( DIRECT, 'F' ) ) THEN + DO 220 J = 1, N - 1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 210 I = 1, M + TEMP = A( I, J ) + A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP + A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP + 210 CONTINUE + END IF + 220 CONTINUE + ELSE IF( LSAME( DIRECT, 'B' ) ) THEN + DO 240 J = N - 1, 1, -1 + CTEMP = C( J ) + STEMP = S( J ) + IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN + DO 230 I = 1, M + TEMP = A( I, J ) + A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP + A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP + 230 CONTINUE + END IF + 240 CONTINUE + END IF + END IF + END IF +* + RETURN +* +* End of ZLASR +* + END diff --git a/lib/linalg/zlassq.f b/lib/linalg/zlassq.f new file mode 100644 index 0000000000..5b7e66c30b --- /dev/null +++ b/lib/linalg/zlassq.f @@ -0,0 +1,168 @@ +*> \brief \b ZLASSQ updates a sum of squares represented in scaled form. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLASSQ + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ ) +* +* .. Scalar Arguments .. +* INTEGER INCX, N +* DOUBLE PRECISION SCALE, SUMSQ +* .. +* .. Array Arguments .. +* COMPLEX*16 X( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLASSQ returns the values scl and ssq such that +*> +*> ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, +*> +*> where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is +*> assumed to be at least unity and the value of ssq will then satisfy +*> +*> 1.0 .le. ssq .le. ( sumsq + 2*n ). +*> +*> scale is assumed to be non-negative and scl returns the value +*> +*> scl = max( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ), +*> i +*> +*> scale and sumsq must be supplied in SCALE and SUMSQ respectively. +*> SCALE and SUMSQ are overwritten by scl and ssq respectively. +*> +*> The routine makes only one pass through the vector X. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of elements to be used from the vector X. +*> \endverbatim +*> +*> \param[in] X +*> \verbatim +*> X is COMPLEX*16 array, dimension (N) +*> The vector x as described above. +*> x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> The increment between successive values of the vector X. +*> INCX > 0. +*> \endverbatim +*> +*> \param[in,out] SCALE +*> \verbatim +*> SCALE is DOUBLE PRECISION +*> On entry, the value scale in the equation above. +*> On exit, SCALE is overwritten with the value scl . +*> \endverbatim +*> +*> \param[in,out] SUMSQ +*> \verbatim +*> SUMSQ is DOUBLE PRECISION +*> On entry, the value sumsq in the equation above. +*> On exit, SUMSQ is overwritten with the value ssq . +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +* ===================================================================== + SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER INCX, N + DOUBLE PRECISION SCALE, SUMSQ +* .. +* .. Array Arguments .. + COMPLEX*16 X( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER IX + DOUBLE PRECISION TEMP1 +* .. +* .. External Functions .. + LOGICAL DISNAN + EXTERNAL DISNAN +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DIMAG +* .. +* .. Executable Statements .. +* + IF( N.GT.0 ) THEN + DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX + TEMP1 = ABS( DBLE( X( IX ) ) ) + IF( TEMP1.GT.ZERO.OR.DISNAN( TEMP1 ) ) THEN + IF( SCALE.LT.TEMP1 ) THEN + SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2 + SCALE = TEMP1 + ELSE + SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2 + END IF + END IF + TEMP1 = ABS( DIMAG( X( IX ) ) ) + IF( TEMP1.GT.ZERO.OR.DISNAN( TEMP1 ) ) THEN + IF( SCALE.LT.TEMP1 ) THEN + SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2 + SCALE = TEMP1 + ELSE + SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2 + END IF + END IF + 10 CONTINUE + END IF +* + RETURN +* +* End of ZLASSQ +* + END diff --git a/lib/linalg/zlatrd.f b/lib/linalg/zlatrd.f new file mode 100644 index 0000000000..619d7280c4 --- /dev/null +++ b/lib/linalg/zlatrd.f @@ -0,0 +1,358 @@ +*> \brief \b ZLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiagonal form by an unitary similarity transformation. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLATRD + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER LDA, LDW, N, NB +* .. +* .. Array Arguments .. +* DOUBLE PRECISION E( * ) +* COMPLEX*16 A( LDA, * ), TAU( * ), W( LDW, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to +*> Hermitian tridiagonal form by a unitary similarity +*> transformation Q**H * A * Q, and returns the matrices V and W which are +*> needed to apply the transformation to the unreduced part of A. +*> +*> If UPLO = 'U', ZLATRD reduces the last NB rows and columns of a +*> matrix, of which the upper triangle is supplied; +*> if UPLO = 'L', ZLATRD reduces the first NB rows and columns of a +*> matrix, of which the lower triangle is supplied. +*> +*> This is an auxiliary routine called by ZHETRD. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> Specifies whether the upper or lower triangular part of the +*> Hermitian matrix A is stored: +*> = 'U': Upper triangular +*> = 'L': Lower triangular +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. +*> \endverbatim +*> +*> \param[in] NB +*> \verbatim +*> NB is INTEGER +*> The number of rows and columns to be reduced. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading +*> n-by-n upper triangular part of A contains the upper +*> triangular part of the matrix A, and the strictly lower +*> triangular part of A is not referenced. If UPLO = 'L', the +*> leading n-by-n lower triangular part of A contains the lower +*> triangular part of the matrix A, and the strictly upper +*> triangular part of A is not referenced. +*> On exit: +*> if UPLO = 'U', the last NB columns have been reduced to +*> tridiagonal form, with the diagonal elements overwriting +*> the diagonal elements of A; the elements above the diagonal +*> with the array TAU, represent the unitary matrix Q as a +*> product of elementary reflectors; +*> if UPLO = 'L', the first NB columns have been reduced to +*> tridiagonal form, with the diagonal elements overwriting +*> the diagonal elements of A; the elements below the diagonal +*> with the array TAU, represent the unitary matrix Q as a +*> product of elementary reflectors. +*> See Further Details. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] E +*> \verbatim +*> E is DOUBLE PRECISION array, dimension (N-1) +*> If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal +*> elements of the last NB columns of the reduced matrix; +*> if UPLO = 'L', E(1:nb) contains the subdiagonal elements of +*> the first NB columns of the reduced matrix. +*> \endverbatim +*> +*> \param[out] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (N-1) +*> The scalar factors of the elementary reflectors, stored in +*> TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. +*> See Further Details. +*> \endverbatim +*> +*> \param[out] W +*> \verbatim +*> W is COMPLEX*16 array, dimension (LDW,NB) +*> The n-by-nb matrix W required to update the unreduced part +*> of A. +*> \endverbatim +*> +*> \param[in] LDW +*> \verbatim +*> LDW is INTEGER +*> The leading dimension of the array W. LDW >= max(1,N). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERauxiliary +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> If UPLO = 'U', the matrix Q is represented as a product of elementary +*> reflectors +*> +*> Q = H(n) H(n-1) . . . H(n-nb+1). +*> +*> Each H(i) has the form +*> +*> H(i) = I - tau * v * v**H +*> +*> where tau is a complex scalar, and v is a complex vector with +*> v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), +*> and tau in TAU(i-1). +*> +*> If UPLO = 'L', the matrix Q is represented as a product of elementary +*> reflectors +*> +*> Q = H(1) H(2) . . . H(nb). +*> +*> Each H(i) has the form +*> +*> H(i) = I - tau * v * v**H +*> +*> where tau is a complex scalar, and v is a complex vector with +*> v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), +*> and tau in TAU(i). +*> +*> The elements of the vectors v together form the n-by-nb matrix V +*> which is needed, with W, to apply the transformation to the unreduced +*> part of the matrix, using a Hermitian rank-2k update of the form: +*> A := A - V*W**H - W*V**H. +*> +*> The contents of A on exit are illustrated by the following examples +*> with n = 5 and nb = 2: +*> +*> if UPLO = 'U': if UPLO = 'L': +*> +*> ( a a a v4 v5 ) ( d ) +*> ( a a v4 v5 ) ( 1 d ) +*> ( a 1 v5 ) ( v1 1 a ) +*> ( d 1 ) ( v1 v2 a a ) +*> ( d ) ( v1 v2 a a a ) +*> +*> where d denotes a diagonal element of the reduced matrix, a denotes +*> an element of the original matrix that is unchanged, and vi denotes +*> an element of the vector defining H(i). +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) +* +* -- LAPACK auxiliary routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER LDA, LDW, N, NB +* .. +* .. Array Arguments .. + DOUBLE PRECISION E( * ) + COMPLEX*16 A( LDA, * ), TAU( * ), W( LDW, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO, ONE, HALF + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ), + $ ONE = ( 1.0D+0, 0.0D+0 ), + $ HALF = ( 0.5D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, IW + COMPLEX*16 ALPHA +* .. +* .. External Subroutines .. + EXTERNAL ZAXPY, ZGEMV, ZHEMV, ZLACGV, ZLARFG, ZSCAL +* .. +* .. External Functions .. + LOGICAL LSAME + COMPLEX*16 ZDOTC + EXTERNAL LSAME, ZDOTC +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE, MIN +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( N.LE.0 ) + $ RETURN +* + IF( LSAME( UPLO, 'U' ) ) THEN +* +* Reduce last NB columns of upper triangle +* + DO 10 I = N, N - NB + 1, -1 + IW = I - N + NB + IF( I.LT.N ) THEN +* +* Update A(1:i,i) +* + A( I, I ) = DBLE( A( I, I ) ) + CALL ZLACGV( N-I, W( I, IW+1 ), LDW ) + CALL ZGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ), + $ LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 ) + CALL ZLACGV( N-I, W( I, IW+1 ), LDW ) + CALL ZLACGV( N-I, A( I, I+1 ), LDA ) + CALL ZGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ), + $ LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 ) + CALL ZLACGV( N-I, A( I, I+1 ), LDA ) + A( I, I ) = DBLE( A( I, I ) ) + END IF + IF( I.GT.1 ) THEN +* +* Generate elementary reflector H(i) to annihilate +* A(1:i-2,i) +* + ALPHA = A( I-1, I ) + CALL ZLARFG( I-1, ALPHA, A( 1, I ), 1, TAU( I-1 ) ) + E( I-1 ) = ALPHA + A( I-1, I ) = ONE +* +* Compute W(1:i-1,i) +* + CALL ZHEMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1, + $ ZERO, W( 1, IW ), 1 ) + IF( I.LT.N ) THEN + CALL ZGEMV( 'Conjugate transpose', I-1, N-I, ONE, + $ W( 1, IW+1 ), LDW, A( 1, I ), 1, ZERO, + $ W( I+1, IW ), 1 ) + CALL ZGEMV( 'No transpose', I-1, N-I, -ONE, + $ A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE, + $ W( 1, IW ), 1 ) + CALL ZGEMV( 'Conjugate transpose', I-1, N-I, ONE, + $ A( 1, I+1 ), LDA, A( 1, I ), 1, ZERO, + $ W( I+1, IW ), 1 ) + CALL ZGEMV( 'No transpose', I-1, N-I, -ONE, + $ W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE, + $ W( 1, IW ), 1 ) + END IF + CALL ZSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 ) + ALPHA = -HALF*TAU( I-1 )*ZDOTC( I-1, W( 1, IW ), 1, + $ A( 1, I ), 1 ) + CALL ZAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 ) + END IF +* + 10 CONTINUE + ELSE +* +* Reduce first NB columns of lower triangle +* + DO 20 I = 1, NB +* +* Update A(i:n,i) +* + A( I, I ) = DBLE( A( I, I ) ) + CALL ZLACGV( I-1, W( I, 1 ), LDW ) + CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ), + $ LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 ) + CALL ZLACGV( I-1, W( I, 1 ), LDW ) + CALL ZLACGV( I-1, A( I, 1 ), LDA ) + CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ), + $ LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 ) + CALL ZLACGV( I-1, A( I, 1 ), LDA ) + A( I, I ) = DBLE( A( I, I ) ) + IF( I.LT.N ) THEN +* +* Generate elementary reflector H(i) to annihilate +* A(i+2:n,i) +* + ALPHA = A( I+1, I ) + CALL ZLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1, + $ TAU( I ) ) + E( I ) = ALPHA + A( I+1, I ) = ONE +* +* Compute W(i+1:n,i) +* + CALL ZHEMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA, + $ A( I+1, I ), 1, ZERO, W( I+1, I ), 1 ) + CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE, + $ W( I+1, 1 ), LDW, A( I+1, I ), 1, ZERO, + $ W( 1, I ), 1 ) + CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ), + $ LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) + CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE, + $ A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO, + $ W( 1, I ), 1 ) + CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ), + $ LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) + CALL ZSCAL( N-I, TAU( I ), W( I+1, I ), 1 ) + ALPHA = -HALF*TAU( I )*ZDOTC( N-I, W( I+1, I ), 1, + $ A( I+1, I ), 1 ) + CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 ) + END IF +* + 20 CONTINUE + END IF +* + RETURN +* +* End of ZLATRD +* + END diff --git a/lib/linalg/zsteqr.f b/lib/linalg/zsteqr.f new file mode 100644 index 0000000000..33af78e854 --- /dev/null +++ b/lib/linalg/zsteqr.f @@ -0,0 +1,576 @@ +*> \brief \b ZSTEQR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZSTEQR + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER COMPZ +* INTEGER INFO, LDZ, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION D( * ), E( * ), WORK( * ) +* COMPLEX*16 Z( LDZ, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZSTEQR computes all eigenvalues and, optionally, eigenvectors of a +*> symmetric tridiagonal matrix using the implicit QL or QR method. +*> The eigenvectors of a full or band complex Hermitian matrix can also +*> be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this +*> matrix to tridiagonal form. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] COMPZ +*> \verbatim +*> COMPZ is CHARACTER*1 +*> = 'N': Compute eigenvalues only. +*> = 'V': Compute eigenvalues and eigenvectors of the original +*> Hermitian matrix. On entry, Z must contain the +*> unitary matrix used to reduce the original matrix +*> to tridiagonal form. +*> = 'I': Compute eigenvalues and eigenvectors of the +*> tridiagonal matrix. Z is initialized to the identity +*> matrix. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix. N >= 0. +*> \endverbatim +*> +*> \param[in,out] D +*> \verbatim +*> D is DOUBLE PRECISION array, dimension (N) +*> On entry, the diagonal elements of the tridiagonal matrix. +*> On exit, if INFO = 0, the eigenvalues in ascending order. +*> \endverbatim +*> +*> \param[in,out] E +*> \verbatim +*> E is DOUBLE PRECISION array, dimension (N-1) +*> On entry, the (n-1) subdiagonal elements of the tridiagonal +*> matrix. +*> On exit, E has been destroyed. +*> \endverbatim +*> +*> \param[in,out] Z +*> \verbatim +*> Z is COMPLEX*16 array, dimension (LDZ, N) +*> On entry, if COMPZ = 'V', then Z contains the unitary +*> matrix used in the reduction to tridiagonal form. +*> On exit, if INFO = 0, then if COMPZ = 'V', Z contains the +*> orthonormal eigenvectors of the original Hermitian matrix, +*> and if COMPZ = 'I', Z contains the orthonormal eigenvectors +*> of the symmetric tridiagonal matrix. +*> If COMPZ = 'N', then Z is not referenced. +*> \endverbatim +*> +*> \param[in] LDZ +*> \verbatim +*> LDZ is INTEGER +*> The leading dimension of the array Z. LDZ >= 1, and if +*> eigenvectors are desired, then LDZ >= max(1,N). +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) +*> If COMPZ = 'N', then WORK is not referenced. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: the algorithm has failed to find all the eigenvalues in +*> a total of 30*N iterations; if INFO = i, then i +*> elements of E have not converged to zero; on exit, D +*> and E contain the elements of a symmetric tridiagonal +*> matrix which is unitarily similar to the original +*> matrix. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER COMPZ + INTEGER INFO, LDZ, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ), E( * ), WORK( * ) + COMPLEX*16 Z( LDZ, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, ONE, TWO, THREE + PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, + $ THREE = 3.0D0 ) + COMPLEX*16 CZERO, CONE + PARAMETER ( CZERO = ( 0.0D0, 0.0D0 ), + $ CONE = ( 1.0D0, 0.0D0 ) ) + INTEGER MAXIT + PARAMETER ( MAXIT = 30 ) +* .. +* .. Local Scalars .. + INTEGER I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND, + $ LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1, + $ NM1, NMAXIT + DOUBLE PRECISION ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2, + $ S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST +* .. +* .. External Functions .. + LOGICAL LSAME + DOUBLE PRECISION DLAMCH, DLANST, DLAPY2 + EXTERNAL LSAME, DLAMCH, DLANST, DLAPY2 +* .. +* .. External Subroutines .. + EXTERNAL DLAE2, DLAEV2, DLARTG, DLASCL, DLASRT, XERBLA, + $ ZLASET, ZLASR, ZSWAP +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, SIGN, SQRT +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 +* + IF( LSAME( COMPZ, 'N' ) ) THEN + ICOMPZ = 0 + ELSE IF( LSAME( COMPZ, 'V' ) ) THEN + ICOMPZ = 1 + ELSE IF( LSAME( COMPZ, 'I' ) ) THEN + ICOMPZ = 2 + ELSE + ICOMPZ = -1 + END IF + IF( ICOMPZ.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1, + $ N ) ) ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZSTEQR', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* + IF( N.EQ.1 ) THEN + IF( ICOMPZ.EQ.2 ) + $ Z( 1, 1 ) = CONE + RETURN + END IF +* +* Determine the unit roundoff and over/underflow thresholds. +* + EPS = DLAMCH( 'E' ) + EPS2 = EPS**2 + SAFMIN = DLAMCH( 'S' ) + SAFMAX = ONE / SAFMIN + SSFMAX = SQRT( SAFMAX ) / THREE + SSFMIN = SQRT( SAFMIN ) / EPS2 +* +* Compute the eigenvalues and eigenvectors of the tridiagonal +* matrix. +* + IF( ICOMPZ.EQ.2 ) + $ CALL ZLASET( 'Full', N, N, CZERO, CONE, Z, LDZ ) +* + NMAXIT = N*MAXIT + JTOT = 0 +* +* Determine where the matrix splits and choose QL or QR iteration +* for each block, according to whether top or bottom diagonal +* element is smaller. +* + L1 = 1 + NM1 = N - 1 +* + 10 CONTINUE + IF( L1.GT.N ) + $ GO TO 160 + IF( L1.GT.1 ) + $ E( L1-1 ) = ZERO + IF( L1.LE.NM1 ) THEN + DO 20 M = L1, NM1 + TST = ABS( E( M ) ) + IF( TST.EQ.ZERO ) + $ GO TO 30 + IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+ + $ 1 ) ) ) )*EPS ) THEN + E( M ) = ZERO + GO TO 30 + END IF + 20 CONTINUE + END IF + M = N +* + 30 CONTINUE + L = L1 + LSV = L + LEND = M + LENDSV = LEND + L1 = M + 1 + IF( LEND.EQ.L ) + $ GO TO 10 +* +* Scale submatrix in rows and columns L to LEND +* + ANORM = DLANST( 'I', LEND-L+1, D( L ), E( L ) ) + ISCALE = 0 + IF( ANORM.EQ.ZERO ) + $ GO TO 10 + IF( ANORM.GT.SSFMAX ) THEN + ISCALE = 1 + CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N, + $ INFO ) + CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N, + $ INFO ) + ELSE IF( ANORM.LT.SSFMIN ) THEN + ISCALE = 2 + CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N, + $ INFO ) + CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N, + $ INFO ) + END IF +* +* Choose between QL and QR iteration +* + IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN + LEND = LSV + L = LENDSV + END IF +* + IF( LEND.GT.L ) THEN +* +* QL Iteration +* +* Look for small subdiagonal element. +* + 40 CONTINUE + IF( L.NE.LEND ) THEN + LENDM1 = LEND - 1 + DO 50 M = L, LENDM1 + TST = ABS( E( M ) )**2 + IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+ + $ SAFMIN )GO TO 60 + 50 CONTINUE + END IF +* + M = LEND +* + 60 CONTINUE + IF( M.LT.LEND ) + $ E( M ) = ZERO + P = D( L ) + IF( M.EQ.L ) + $ GO TO 80 +* +* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 +* to compute its eigensystem. +* + IF( M.EQ.L+1 ) THEN + IF( ICOMPZ.GT.0 ) THEN + CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S ) + WORK( L ) = C + WORK( N-1+L ) = S + CALL ZLASR( 'R', 'V', 'B', N, 2, WORK( L ), + $ WORK( N-1+L ), Z( 1, L ), LDZ ) + ELSE + CALL DLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 ) + END IF + D( L ) = RT1 + D( L+1 ) = RT2 + E( L ) = ZERO + L = L + 2 + IF( L.LE.LEND ) + $ GO TO 40 + GO TO 140 + END IF +* + IF( JTOT.EQ.NMAXIT ) + $ GO TO 140 + JTOT = JTOT + 1 +* +* Form shift. +* + G = ( D( L+1 )-P ) / ( TWO*E( L ) ) + R = DLAPY2( G, ONE ) + G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) ) +* + S = ONE + C = ONE + P = ZERO +* +* Inner loop +* + MM1 = M - 1 + DO 70 I = MM1, L, -1 + F = S*E( I ) + B = C*E( I ) + CALL DLARTG( G, F, C, S, R ) + IF( I.NE.M-1 ) + $ E( I+1 ) = R + G = D( I+1 ) - P + R = ( D( I )-G )*S + TWO*C*B + P = S*R + D( I+1 ) = G + P + G = C*R - B +* +* If eigenvectors are desired, then save rotations. +* + IF( ICOMPZ.GT.0 ) THEN + WORK( I ) = C + WORK( N-1+I ) = -S + END IF +* + 70 CONTINUE +* +* If eigenvectors are desired, then apply saved rotations. +* + IF( ICOMPZ.GT.0 ) THEN + MM = M - L + 1 + CALL ZLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ), + $ Z( 1, L ), LDZ ) + END IF +* + D( L ) = D( L ) - P + E( L ) = G + GO TO 40 +* +* Eigenvalue found. +* + 80 CONTINUE + D( L ) = P +* + L = L + 1 + IF( L.LE.LEND ) + $ GO TO 40 + GO TO 140 +* + ELSE +* +* QR Iteration +* +* Look for small superdiagonal element. +* + 90 CONTINUE + IF( L.NE.LEND ) THEN + LENDP1 = LEND + 1 + DO 100 M = L, LENDP1, -1 + TST = ABS( E( M-1 ) )**2 + IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+ + $ SAFMIN )GO TO 110 + 100 CONTINUE + END IF +* + M = LEND +* + 110 CONTINUE + IF( M.GT.LEND ) + $ E( M-1 ) = ZERO + P = D( L ) + IF( M.EQ.L ) + $ GO TO 130 +* +* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 +* to compute its eigensystem. +* + IF( M.EQ.L-1 ) THEN + IF( ICOMPZ.GT.0 ) THEN + CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S ) + WORK( M ) = C + WORK( N-1+M ) = S + CALL ZLASR( 'R', 'V', 'F', N, 2, WORK( M ), + $ WORK( N-1+M ), Z( 1, L-1 ), LDZ ) + ELSE + CALL DLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 ) + END IF + D( L-1 ) = RT1 + D( L ) = RT2 + E( L-1 ) = ZERO + L = L - 2 + IF( L.GE.LEND ) + $ GO TO 90 + GO TO 140 + END IF +* + IF( JTOT.EQ.NMAXIT ) + $ GO TO 140 + JTOT = JTOT + 1 +* +* Form shift. +* + G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) ) + R = DLAPY2( G, ONE ) + G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) ) +* + S = ONE + C = ONE + P = ZERO +* +* Inner loop +* + LM1 = L - 1 + DO 120 I = M, LM1 + F = S*E( I ) + B = C*E( I ) + CALL DLARTG( G, F, C, S, R ) + IF( I.NE.M ) + $ E( I-1 ) = R + G = D( I ) - P + R = ( D( I+1 )-G )*S + TWO*C*B + P = S*R + D( I ) = G + P + G = C*R - B +* +* If eigenvectors are desired, then save rotations. +* + IF( ICOMPZ.GT.0 ) THEN + WORK( I ) = C + WORK( N-1+I ) = S + END IF +* + 120 CONTINUE +* +* If eigenvectors are desired, then apply saved rotations. +* + IF( ICOMPZ.GT.0 ) THEN + MM = L - M + 1 + CALL ZLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ), + $ Z( 1, M ), LDZ ) + END IF +* + D( L ) = D( L ) - P + E( LM1 ) = G + GO TO 90 +* +* Eigenvalue found. +* + 130 CONTINUE + D( L ) = P +* + L = L - 1 + IF( L.GE.LEND ) + $ GO TO 90 + GO TO 140 +* + END IF +* +* Undo scaling if necessary +* + 140 CONTINUE + IF( ISCALE.EQ.1 ) THEN + CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1, + $ D( LSV ), N, INFO ) + CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ), + $ N, INFO ) + ELSE IF( ISCALE.EQ.2 ) THEN + CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1, + $ D( LSV ), N, INFO ) + CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ), + $ N, INFO ) + END IF +* +* Check for no convergence to an eigenvalue after a total +* of N*MAXIT iterations. +* + IF( JTOT.EQ.NMAXIT ) THEN + DO 150 I = 1, N - 1 + IF( E( I ).NE.ZERO ) + $ INFO = INFO + 1 + 150 CONTINUE + RETURN + END IF + GO TO 10 +* +* Order eigenvalues and eigenvectors. +* + 160 CONTINUE + IF( ICOMPZ.EQ.0 ) THEN +* +* Use Quick Sort +* + CALL DLASRT( 'I', N, D, INFO ) +* + ELSE +* +* Use Selection Sort to minimize swaps of eigenvectors +* + DO 180 II = 2, N + I = II - 1 + K = I + P = D( I ) + DO 170 J = II, N + IF( D( J ).LT.P ) THEN + K = J + P = D( J ) + END IF + 170 CONTINUE + IF( K.NE.I ) THEN + D( K ) = D( I ) + D( I ) = P + CALL ZSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 ) + END IF + 180 CONTINUE + END IF + RETURN +* +* End of ZSTEQR +* + END diff --git a/lib/linalg/zswap.f b/lib/linalg/zswap.f new file mode 100644 index 0000000000..ca2f347211 --- /dev/null +++ b/lib/linalg/zswap.f @@ -0,0 +1,98 @@ +*> \brief \b ZSWAP +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) +* +* .. Scalar Arguments .. +* INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. +* COMPLEX*16 ZX(*),ZY(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZSWAP interchanges two vectors. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level1 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> jack dongarra, 3/11/78. +*> modified 12/3/93, array(1) declarations changed to array(*) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) +* +* -- Reference BLAS level1 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INCX,INCY,N +* .. +* .. Array Arguments .. + COMPLEX*16 ZX(*),ZY(*) +* .. +* +* ===================================================================== +* +* .. Local Scalars .. + COMPLEX*16 ZTEMP + INTEGER I,IX,IY +* .. + IF (N.LE.0) RETURN + IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN +* +* code for both increments equal to 1 + DO I = 1,N + ZTEMP = ZX(I) + ZX(I) = ZY(I) + ZY(I) = ZTEMP + END DO + ELSE +* +* code for unequal increments or equal increments not equal +* to 1 +* + IX = 1 + IY = 1 + IF (INCX.LT.0) IX = (-N+1)*INCX + 1 + IF (INCY.LT.0) IY = (-N+1)*INCY + 1 + DO I = 1,N + ZTEMP = ZX(IX) + ZX(IX) = ZY(IY) + ZY(IY) = ZTEMP + IX = IX + INCX + IY = IY + INCY + END DO + END IF + RETURN + END diff --git a/lib/linalg/ztrmm.f b/lib/linalg/ztrmm.f new file mode 100644 index 0000000000..ba7aead68b --- /dev/null +++ b/lib/linalg/ztrmm.f @@ -0,0 +1,452 @@ +*> \brief \b ZTRMM +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) +* +* .. Scalar Arguments .. +* COMPLEX*16 ALPHA +* INTEGER LDA,LDB,M,N +* CHARACTER DIAG,SIDE,TRANSA,UPLO +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),B(LDB,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZTRMM performs one of the matrix-matrix operations +*> +*> B := alpha*op( A )*B, or B := alpha*B*op( A ) +*> +*> where alpha is a scalar, B is an m by n matrix, A is a unit, or +*> non-unit, upper or lower triangular matrix and op( A ) is one of +*> +*> op( A ) = A or op( A ) = A**T or op( A ) = A**H. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] SIDE +*> \verbatim +*> SIDE is CHARACTER*1 +*> On entry, SIDE specifies whether op( A ) multiplies B from +*> the left or right as follows: +*> +*> SIDE = 'L' or 'l' B := alpha*op( A )*B. +*> +*> SIDE = 'R' or 'r' B := alpha*B*op( A ). +*> \endverbatim +*> +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the matrix A is an upper or +*> lower triangular matrix as follows: +*> +*> UPLO = 'U' or 'u' A is an upper triangular matrix. +*> +*> UPLO = 'L' or 'l' A is a lower triangular matrix. +*> \endverbatim +*> +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n' op( A ) = A. +*> +*> TRANSA = 'T' or 't' op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c' op( A ) = A**H. +*> \endverbatim +*> +*> \param[in] DIAG +*> \verbatim +*> DIAG is CHARACTER*1 +*> On entry, DIAG specifies whether or not A is unit triangular +*> as follows: +*> +*> DIAG = 'U' or 'u' A is assumed to be unit triangular. +*> +*> DIAG = 'N' or 'n' A is not assumed to be unit +*> triangular. +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> On entry, M specifies the number of rows of B. M must be at +*> least zero. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of columns of B. N must be +*> at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is COMPLEX*16 +*> On entry, ALPHA specifies the scalar alpha. When alpha is +*> zero then A is not referenced and B need not be set before +*> entry. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, k ), where k is m +*> when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. +*> Before entry with UPLO = 'U' or 'u', the leading k by k +*> upper triangular part of the array A must contain the upper +*> triangular matrix and the strictly lower triangular part of +*> A is not referenced. +*> Before entry with UPLO = 'L' or 'l', the leading k by k +*> lower triangular part of the array A must contain the lower +*> triangular matrix and the strictly upper triangular part of +*> A is not referenced. +*> Note that when DIAG = 'U' or 'u', the diagonal elements of +*> A are not referenced either, but are assumed to be unity. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When SIDE = 'L' or 'l' then +*> LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' +*> then LDA must be at least max( 1, n ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is (input/output) COMPLEX*16 array of DIMENSION ( LDB, n ). +*> Before entry, the leading m by n part of the array B must +*> contain the matrix B, and on exit is overwritten by the +*> transformed matrix. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. LDB must be at least +*> max( 1, m ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level3 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 8-February-1989. +*> Jack Dongarra, Argonne National Laboratory. +*> Iain Duff, AERE Harwell. +*> Jeremy Du Croz, Numerical Algorithms Group Ltd. +*> Sven Hammarling, Numerical Algorithms Group Ltd. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) +* +* -- Reference BLAS level3 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + COMPLEX*16 ALPHA + INTEGER LDA,LDB,M,N + CHARACTER DIAG,SIDE,TRANSA,UPLO +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),B(LDB,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG,MAX +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I,INFO,J,K,NROWA + LOGICAL LSIDE,NOCONJ,NOUNIT,UPPER +* .. +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER (ONE= (1.0D+0,0.0D+0)) + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* +* Test the input parameters. +* + LSIDE = LSAME(SIDE,'L') + IF (LSIDE) THEN + NROWA = M + ELSE + NROWA = N + END IF + NOCONJ = LSAME(TRANSA,'T') + NOUNIT = LSAME(DIAG,'N') + UPPER = LSAME(UPLO,'U') +* + INFO = 0 + IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN + INFO = 1 + ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN + INFO = 2 + ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND. + + (.NOT.LSAME(TRANSA,'T')) .AND. + + (.NOT.LSAME(TRANSA,'C'))) THEN + INFO = 3 + ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN + INFO = 4 + ELSE IF (M.LT.0) THEN + INFO = 5 + ELSE IF (N.LT.0) THEN + INFO = 6 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 9 + ELSE IF (LDB.LT.MAX(1,M)) THEN + INFO = 11 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZTRMM ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF (M.EQ.0 .OR. N.EQ.0) RETURN +* +* And when alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + DO 20 J = 1,N + DO 10 I = 1,M + B(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + RETURN + END IF +* +* Start the operations. +* + IF (LSIDE) THEN + IF (LSAME(TRANSA,'N')) THEN +* +* Form B := alpha*A*B. +* + IF (UPPER) THEN + DO 50 J = 1,N + DO 40 K = 1,M + IF (B(K,J).NE.ZERO) THEN + TEMP = ALPHA*B(K,J) + DO 30 I = 1,K - 1 + B(I,J) = B(I,J) + TEMP*A(I,K) + 30 CONTINUE + IF (NOUNIT) TEMP = TEMP*A(K,K) + B(K,J) = TEMP + END IF + 40 CONTINUE + 50 CONTINUE + ELSE + DO 80 J = 1,N + DO 70 K = M,1,-1 + IF (B(K,J).NE.ZERO) THEN + TEMP = ALPHA*B(K,J) + B(K,J) = TEMP + IF (NOUNIT) B(K,J) = B(K,J)*A(K,K) + DO 60 I = K + 1,M + B(I,J) = B(I,J) + TEMP*A(I,K) + 60 CONTINUE + END IF + 70 CONTINUE + 80 CONTINUE + END IF + ELSE +* +* Form B := alpha*A**T*B or B := alpha*A**H*B. +* + IF (UPPER) THEN + DO 120 J = 1,N + DO 110 I = M,1,-1 + TEMP = B(I,J) + IF (NOCONJ) THEN + IF (NOUNIT) TEMP = TEMP*A(I,I) + DO 90 K = 1,I - 1 + TEMP = TEMP + A(K,I)*B(K,J) + 90 CONTINUE + ELSE + IF (NOUNIT) TEMP = TEMP*DCONJG(A(I,I)) + DO 100 K = 1,I - 1 + TEMP = TEMP + DCONJG(A(K,I))*B(K,J) + 100 CONTINUE + END IF + B(I,J) = ALPHA*TEMP + 110 CONTINUE + 120 CONTINUE + ELSE + DO 160 J = 1,N + DO 150 I = 1,M + TEMP = B(I,J) + IF (NOCONJ) THEN + IF (NOUNIT) TEMP = TEMP*A(I,I) + DO 130 K = I + 1,M + TEMP = TEMP + A(K,I)*B(K,J) + 130 CONTINUE + ELSE + IF (NOUNIT) TEMP = TEMP*DCONJG(A(I,I)) + DO 140 K = I + 1,M + TEMP = TEMP + DCONJG(A(K,I))*B(K,J) + 140 CONTINUE + END IF + B(I,J) = ALPHA*TEMP + 150 CONTINUE + 160 CONTINUE + END IF + END IF + ELSE + IF (LSAME(TRANSA,'N')) THEN +* +* Form B := alpha*B*A. +* + IF (UPPER) THEN + DO 200 J = N,1,-1 + TEMP = ALPHA + IF (NOUNIT) TEMP = TEMP*A(J,J) + DO 170 I = 1,M + B(I,J) = TEMP*B(I,J) + 170 CONTINUE + DO 190 K = 1,J - 1 + IF (A(K,J).NE.ZERO) THEN + TEMP = ALPHA*A(K,J) + DO 180 I = 1,M + B(I,J) = B(I,J) + TEMP*B(I,K) + 180 CONTINUE + END IF + 190 CONTINUE + 200 CONTINUE + ELSE + DO 240 J = 1,N + TEMP = ALPHA + IF (NOUNIT) TEMP = TEMP*A(J,J) + DO 210 I = 1,M + B(I,J) = TEMP*B(I,J) + 210 CONTINUE + DO 230 K = J + 1,N + IF (A(K,J).NE.ZERO) THEN + TEMP = ALPHA*A(K,J) + DO 220 I = 1,M + B(I,J) = B(I,J) + TEMP*B(I,K) + 220 CONTINUE + END IF + 230 CONTINUE + 240 CONTINUE + END IF + ELSE +* +* Form B := alpha*B*A**T or B := alpha*B*A**H. +* + IF (UPPER) THEN + DO 280 K = 1,N + DO 260 J = 1,K - 1 + IF (A(J,K).NE.ZERO) THEN + IF (NOCONJ) THEN + TEMP = ALPHA*A(J,K) + ELSE + TEMP = ALPHA*DCONJG(A(J,K)) + END IF + DO 250 I = 1,M + B(I,J) = B(I,J) + TEMP*B(I,K) + 250 CONTINUE + END IF + 260 CONTINUE + TEMP = ALPHA + IF (NOUNIT) THEN + IF (NOCONJ) THEN + TEMP = TEMP*A(K,K) + ELSE + TEMP = TEMP*DCONJG(A(K,K)) + END IF + END IF + IF (TEMP.NE.ONE) THEN + DO 270 I = 1,M + B(I,K) = TEMP*B(I,K) + 270 CONTINUE + END IF + 280 CONTINUE + ELSE + DO 320 K = N,1,-1 + DO 300 J = K + 1,N + IF (A(J,K).NE.ZERO) THEN + IF (NOCONJ) THEN + TEMP = ALPHA*A(J,K) + ELSE + TEMP = ALPHA*DCONJG(A(J,K)) + END IF + DO 290 I = 1,M + B(I,J) = B(I,J) + TEMP*B(I,K) + 290 CONTINUE + END IF + 300 CONTINUE + TEMP = ALPHA + IF (NOUNIT) THEN + IF (NOCONJ) THEN + TEMP = TEMP*A(K,K) + ELSE + TEMP = TEMP*DCONJG(A(K,K)) + END IF + END IF + IF (TEMP.NE.ONE) THEN + DO 310 I = 1,M + B(I,K) = TEMP*B(I,K) + 310 CONTINUE + END IF + 320 CONTINUE + END IF + END IF + END IF +* + RETURN +* +* End of ZTRMM . +* + END diff --git a/lib/linalg/ztrmv.f b/lib/linalg/ztrmv.f new file mode 100644 index 0000000000..8d7974a059 --- /dev/null +++ b/lib/linalg/ztrmv.f @@ -0,0 +1,373 @@ +*> \brief \b ZTRMV +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) +* +* .. Scalar Arguments .. +* INTEGER INCX,LDA,N +* CHARACTER DIAG,TRANS,UPLO +* .. +* .. Array Arguments .. +* COMPLEX*16 A(LDA,*),X(*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZTRMV performs one of the matrix-vector operations +*> +*> x := A*x, or x := A**T*x, or x := A**H*x, +*> +*> where x is an n element vector and A is an n by n unit, or non-unit, +*> upper or lower triangular matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> On entry, UPLO specifies whether the matrix is an upper or +*> lower triangular matrix as follows: +*> +*> UPLO = 'U' or 'u' A is an upper triangular matrix. +*> +*> UPLO = 'L' or 'l' A is a lower triangular matrix. +*> \endverbatim +*> +*> \param[in] TRANS +*> \verbatim +*> TRANS is CHARACTER*1 +*> On entry, TRANS specifies the operation to be performed as +*> follows: +*> +*> TRANS = 'N' or 'n' x := A*x. +*> +*> TRANS = 'T' or 't' x := A**T*x. +*> +*> TRANS = 'C' or 'c' x := A**H*x. +*> \endverbatim +*> +*> \param[in] DIAG +*> \verbatim +*> DIAG is CHARACTER*1 +*> On entry, DIAG specifies whether or not A is unit +*> triangular as follows: +*> +*> DIAG = 'U' or 'u' A is assumed to be unit triangular. +*> +*> DIAG = 'N' or 'n' A is not assumed to be unit +*> triangular. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the order of the matrix A. +*> N must be at least zero. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is COMPLEX*16 array of DIMENSION ( LDA, n ). +*> Before entry with UPLO = 'U' or 'u', the leading n by n +*> upper triangular part of the array A must contain the upper +*> triangular matrix and the strictly lower triangular part of +*> A is not referenced. +*> Before entry with UPLO = 'L' or 'l', the leading n by n +*> lower triangular part of the array A must contain the lower +*> triangular matrix and the strictly upper triangular part of +*> A is not referenced. +*> Note that when DIAG = 'U' or 'u', the diagonal elements of +*> A are not referenced either, but are assumed to be unity. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. LDA must be at least +*> max( 1, n ). +*> \endverbatim +*> +*> \param[in] X +*> \verbatim +*> X is (input/output) COMPLEX*16 array of dimension at least +*> ( 1 + ( n - 1 )*abs( INCX ) ). +*> Before entry, the incremented array X must contain the n +*> element vector x. On exit, X is overwritten with the +*> tranformed vector x. +*> \endverbatim +*> +*> \param[in] INCX +*> \verbatim +*> INCX is INTEGER +*> On entry, INCX specifies the increment for the elements of +*> X. INCX must not be zero. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16_blas_level2 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 2 Blas routine. +*> The vector and matrix arguments are not referenced when N = 0, or M = 0 +*> +*> -- Written on 22-October-1986. +*> Jack Dongarra, Argonne National Lab. +*> Jeremy Du Croz, Nag Central Office. +*> Sven Hammarling, Nag Central Office. +*> Richard Hanson, Sandia National Labs. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) +* +* -- Reference BLAS level2 routine (version 3.4.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INCX,LDA,N + CHARACTER DIAG,TRANS,UPLO +* .. +* .. Array Arguments .. + COMPLEX*16 A(LDA,*),X(*) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER (ZERO= (0.0D+0,0.0D+0)) +* .. +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I,INFO,IX,J,JX,KX + LOGICAL NOCONJ,NOUNIT +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG,MAX +* .. +* +* Test the input parameters. +* + INFO = 0 + IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN + INFO = 1 + ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. + + .NOT.LSAME(TRANS,'C')) THEN + INFO = 2 + ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (LDA.LT.MAX(1,N)) THEN + INFO = 6 + ELSE IF (INCX.EQ.0) THEN + INFO = 8 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('ZTRMV ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF (N.EQ.0) RETURN +* + NOCONJ = LSAME(TRANS,'T') + NOUNIT = LSAME(DIAG,'N') +* +* Set up the start point in X if the increment is not unity. This +* will be ( N - 1 )*INCX too small for descending loops. +* + IF (INCX.LE.0) THEN + KX = 1 - (N-1)*INCX + ELSE IF (INCX.NE.1) THEN + KX = 1 + END IF +* +* Start the operations. In this version the elements of A are +* accessed sequentially with one pass through A. +* + IF (LSAME(TRANS,'N')) THEN +* +* Form x := A*x. +* + IF (LSAME(UPLO,'U')) THEN + IF (INCX.EQ.1) THEN + DO 20 J = 1,N + IF (X(J).NE.ZERO) THEN + TEMP = X(J) + DO 10 I = 1,J - 1 + X(I) = X(I) + TEMP*A(I,J) + 10 CONTINUE + IF (NOUNIT) X(J) = X(J)*A(J,J) + END IF + 20 CONTINUE + ELSE + JX = KX + DO 40 J = 1,N + IF (X(JX).NE.ZERO) THEN + TEMP = X(JX) + IX = KX + DO 30 I = 1,J - 1 + X(IX) = X(IX) + TEMP*A(I,J) + IX = IX + INCX + 30 CONTINUE + IF (NOUNIT) X(JX) = X(JX)*A(J,J) + END IF + JX = JX + INCX + 40 CONTINUE + END IF + ELSE + IF (INCX.EQ.1) THEN + DO 60 J = N,1,-1 + IF (X(J).NE.ZERO) THEN + TEMP = X(J) + DO 50 I = N,J + 1,-1 + X(I) = X(I) + TEMP*A(I,J) + 50 CONTINUE + IF (NOUNIT) X(J) = X(J)*A(J,J) + END IF + 60 CONTINUE + ELSE + KX = KX + (N-1)*INCX + JX = KX + DO 80 J = N,1,-1 + IF (X(JX).NE.ZERO) THEN + TEMP = X(JX) + IX = KX + DO 70 I = N,J + 1,-1 + X(IX) = X(IX) + TEMP*A(I,J) + IX = IX - INCX + 70 CONTINUE + IF (NOUNIT) X(JX) = X(JX)*A(J,J) + END IF + JX = JX - INCX + 80 CONTINUE + END IF + END IF + ELSE +* +* Form x := A**T*x or x := A**H*x. +* + IF (LSAME(UPLO,'U')) THEN + IF (INCX.EQ.1) THEN + DO 110 J = N,1,-1 + TEMP = X(J) + IF (NOCONJ) THEN + IF (NOUNIT) TEMP = TEMP*A(J,J) + DO 90 I = J - 1,1,-1 + TEMP = TEMP + A(I,J)*X(I) + 90 CONTINUE + ELSE + IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) + DO 100 I = J - 1,1,-1 + TEMP = TEMP + DCONJG(A(I,J))*X(I) + 100 CONTINUE + END IF + X(J) = TEMP + 110 CONTINUE + ELSE + JX = KX + (N-1)*INCX + DO 140 J = N,1,-1 + TEMP = X(JX) + IX = JX + IF (NOCONJ) THEN + IF (NOUNIT) TEMP = TEMP*A(J,J) + DO 120 I = J - 1,1,-1 + IX = IX - INCX + TEMP = TEMP + A(I,J)*X(IX) + 120 CONTINUE + ELSE + IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) + DO 130 I = J - 1,1,-1 + IX = IX - INCX + TEMP = TEMP + DCONJG(A(I,J))*X(IX) + 130 CONTINUE + END IF + X(JX) = TEMP + JX = JX - INCX + 140 CONTINUE + END IF + ELSE + IF (INCX.EQ.1) THEN + DO 170 J = 1,N + TEMP = X(J) + IF (NOCONJ) THEN + IF (NOUNIT) TEMP = TEMP*A(J,J) + DO 150 I = J + 1,N + TEMP = TEMP + A(I,J)*X(I) + 150 CONTINUE + ELSE + IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) + DO 160 I = J + 1,N + TEMP = TEMP + DCONJG(A(I,J))*X(I) + 160 CONTINUE + END IF + X(J) = TEMP + 170 CONTINUE + ELSE + JX = KX + DO 200 J = 1,N + TEMP = X(JX) + IX = JX + IF (NOCONJ) THEN + IF (NOUNIT) TEMP = TEMP*A(J,J) + DO 180 I = J + 1,N + IX = IX + INCX + TEMP = TEMP + A(I,J)*X(IX) + 180 CONTINUE + ELSE + IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) + DO 190 I = J + 1,N + IX = IX + INCX + TEMP = TEMP + DCONJG(A(I,J))*X(IX) + 190 CONTINUE + END IF + X(JX) = TEMP + JX = JX + INCX + 200 CONTINUE + END IF + END IF + END IF +* + RETURN +* +* End of ZTRMV . +* + END diff --git a/lib/linalg/zung2l.f b/lib/linalg/zung2l.f new file mode 100644 index 0000000000..f8fd3667d2 --- /dev/null +++ b/lib/linalg/zung2l.f @@ -0,0 +1,199 @@ +*> \brief \b ZUNG2L generates all or part of the unitary matrix Q from a QL factorization determined by cgeqlf (unblocked algorithm). +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZUNG2L + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZUNG2L generates an m by n complex matrix Q with orthonormal columns, +*> which is defined as the last n columns of a product of k elementary +*> reflectors of order m +*> +*> Q = H(k) . . . H(2) H(1) +*> +*> as returned by ZGEQLF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. M >= N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. N >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the (n-k+i)-th column must contain the vector which +*> defines the elementary reflector H(i), for i = 1,2,...,k, as +*> returned by ZGEQLF in the last k columns of its array +*> argument A. +*> On exit, the m-by-n matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by ZGEQLF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (N) +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, II, J, L +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZLARF, ZSCAL +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 .OR. N.GT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.N ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZUNG2L', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) + $ RETURN +* +* Initialise columns 1:n-k to columns of the unit matrix +* + DO 20 J = 1, N - K + DO 10 L = 1, M + A( L, J ) = ZERO + 10 CONTINUE + A( M-N+J, J ) = ONE + 20 CONTINUE +* + DO 40 I = 1, K + II = N - K + I +* +* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left +* + A( M-N+II, II ) = ONE + CALL ZLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A, + $ LDA, WORK ) + CALL ZSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 ) + A( M-N+II, II ) = ONE - TAU( I ) +* +* Set A(m-k+i+1:m,n-k+i) to zero +* + DO 30 L = M - N + II + 1, M + A( L, II ) = ZERO + 30 CONTINUE + 40 CONTINUE + RETURN +* +* End of ZUNG2L +* + END diff --git a/lib/linalg/zung2r.f b/lib/linalg/zung2r.f new file mode 100644 index 0000000000..63783ac01b --- /dev/null +++ b/lib/linalg/zung2r.f @@ -0,0 +1,201 @@ +*> \brief \b ZUNG2R +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZUNG2R + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZUNG2R generates an m by n complex matrix Q with orthonormal columns, +*> which is defined as the first n columns of a product of k elementary +*> reflectors of order m +*> +*> Q = H(1) H(2) . . . H(k) +*> +*> as returned by ZGEQRF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. M >= N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. N >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the i-th column must contain the vector which +*> defines the elementary reflector H(i), for i = 1,2,...,k, as +*> returned by ZGEQRF in the first k columns of its array +*> argument A. +*> On exit, the m by n matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by ZGEQRF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (N) +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, J, L +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZLARF, ZSCAL +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 .OR. N.GT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.N ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZUNG2R', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) + $ RETURN +* +* Initialise columns k+1:n to columns of the unit matrix +* + DO 20 J = K + 1, N + DO 10 L = 1, M + A( L, J ) = ZERO + 10 CONTINUE + A( J, J ) = ONE + 20 CONTINUE +* + DO 40 I = K, 1, -1 +* +* Apply H(i) to A(i:m,i:n) from the left +* + IF( I.LT.N ) THEN + A( I, I ) = ONE + CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ), + $ A( I, I+1 ), LDA, WORK ) + END IF + IF( I.LT.M ) + $ CALL ZSCAL( M-I, -TAU( I ), A( I+1, I ), 1 ) + A( I, I ) = ONE - TAU( I ) +* +* Set A(1:i-1,i) to zero +* + DO 30 L = 1, I - 1 + A( L, I ) = ZERO + 30 CONTINUE + 40 CONTINUE + RETURN +* +* End of ZUNG2R +* + END diff --git a/lib/linalg/zungl2.f b/lib/linalg/zungl2.f new file mode 100644 index 0000000000..44acba12a6 --- /dev/null +++ b/lib/linalg/zungl2.f @@ -0,0 +1,207 @@ +*> \brief \b ZUNGL2 generates all or part of the unitary matrix Q from an LQ factorization determined by cgelqf (unblocked algorithm). +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZUNGL2 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZUNGL2 generates an m-by-n complex matrix Q with orthonormal rows, +*> which is defined as the first m rows of a product of k elementary +*> reflectors of order n +*> +*> Q = H(k)**H . . . H(2)**H H(1)**H +*> +*> as returned by ZGELQF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. N >= M. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. M >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the i-th row must contain the vector which defines +*> the elementary reflector H(i), for i = 1,2,...,k, as returned +*> by ZGELQF in the first k rows of its array argument A. +*> On exit, the m by n matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by ZGELQF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (M) +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date September 2012 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.2) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* September 2012 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, M, N +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, J, L +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZLACGV, ZLARF, ZSCAL +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG, MAX +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.M ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZUNGL2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( M.LE.0 ) + $ RETURN +* + IF( K.LT.M ) THEN +* +* Initialise rows k+1:m to rows of the unit matrix +* + DO 20 J = 1, N + DO 10 L = K + 1, M + A( L, J ) = ZERO + 10 CONTINUE + IF( J.GT.K .AND. J.LE.M ) + $ A( J, J ) = ONE + 20 CONTINUE + END IF +* + DO 40 I = K, 1, -1 +* +* Apply H(i)**H to A(i:m,i:n) from the right +* + IF( I.LT.N ) THEN + CALL ZLACGV( N-I, A( I, I+1 ), LDA ) + IF( I.LT.M ) THEN + A( I, I ) = ONE + CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, + $ DCONJG( TAU( I ) ), A( I+1, I ), LDA, WORK ) + END IF + CALL ZSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA ) + CALL ZLACGV( N-I, A( I, I+1 ), LDA ) + END IF + A( I, I ) = ONE - DCONJG( TAU( I ) ) +* +* Set A(i,1:i-1) to zero +* + DO 30 L = 1, I - 1 + A( I, L ) = ZERO + 30 CONTINUE + 40 CONTINUE + RETURN +* +* End of ZUNGL2 +* + END diff --git a/lib/linalg/zungql.f b/lib/linalg/zungql.f new file mode 100644 index 0000000000..5c77abbd46 --- /dev/null +++ b/lib/linalg/zungql.f @@ -0,0 +1,296 @@ +*> \brief \b ZUNGQL +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZUNGQL + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, LWORK, M, N +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZUNGQL generates an M-by-N complex matrix Q with orthonormal columns, +*> which is defined as the last N columns of a product of K elementary +*> reflectors of order M +*> +*> Q = H(k) . . . H(2) H(1) +*> +*> as returned by ZGEQLF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. M >= N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. N >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the (n-k+i)-th column must contain the vector which +*> defines the elementary reflector H(i), for i = 1,2,...,k, as +*> returned by ZGEQLF in the last k columns of its array +*> argument A. +*> On exit, the M-by-N matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by ZGEQLF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The dimension of the array WORK. LWORK >= max(1,N). +*> For optimum performance LWORK >= N*NB, where NB is the +*> optimal blocksize. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, LWORK, M, N +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY + INTEGER I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT, + $ NB, NBMIN, NX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNG2L +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. External Functions .. + INTEGER ILAENV + EXTERNAL ILAENV +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + LQUERY = ( LWORK.EQ.-1 ) + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 .OR. N.GT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.N ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + END IF +* + IF( INFO.EQ.0 ) THEN + IF( N.EQ.0 ) THEN + LWKOPT = 1 + ELSE + NB = ILAENV( 1, 'ZUNGQL', ' ', M, N, K, -1 ) + LWKOPT = N*NB + END IF + WORK( 1 ) = LWKOPT +* + IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN + INFO = -8 + END IF + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZUNGQL', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) THEN + RETURN + END IF +* + NBMIN = 2 + NX = 0 + IWS = N + IF( NB.GT.1 .AND. NB.LT.K ) THEN +* +* Determine when to cross over from blocked to unblocked code. +* + NX = MAX( 0, ILAENV( 3, 'ZUNGQL', ' ', M, N, K, -1 ) ) + IF( NX.LT.K ) THEN +* +* Determine if workspace is large enough for blocked code. +* + LDWORK = N + IWS = LDWORK*NB + IF( LWORK.LT.IWS ) THEN +* +* Not enough workspace to use optimal NB: reduce NB and +* determine the minimum value of NB. +* + NB = LWORK / LDWORK + NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQL', ' ', M, N, K, -1 ) ) + END IF + END IF + END IF +* + IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN +* +* Use blocked code after the first block. +* The last kk columns are handled by the block method. +* + KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB ) +* +* Set A(m-kk+1:m,1:n-kk) to zero. +* + DO 20 J = 1, N - KK + DO 10 I = M - KK + 1, M + A( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + KK = 0 + END IF +* +* Use unblocked code for the first or only block. +* + CALL ZUNG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO ) +* + IF( KK.GT.0 ) THEN +* +* Use blocked code +* + DO 50 I = K - KK + 1, K, NB + IB = MIN( NB, K-I+1 ) + IF( N-K+I.GT.1 ) THEN +* +* Form the triangular factor of the block reflector +* H = H(i+ib-1) . . . H(i+1) H(i) +* + CALL ZLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, + $ A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK ) +* +* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left +* + CALL ZLARFB( 'Left', 'No transpose', 'Backward', + $ 'Columnwise', M-K+I+IB-1, N-K+I-1, IB, + $ A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA, + $ WORK( IB+1 ), LDWORK ) + END IF +* +* Apply H to rows 1:m-k+i+ib-1 of current block +* + CALL ZUNG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA, + $ TAU( I ), WORK, IINFO ) +* +* Set rows m-k+i+ib:m of current block to zero +* + DO 40 J = N - K + I, N - K + I + IB - 1 + DO 30 L = M - K + I + IB, M + A( L, J ) = ZERO + 30 CONTINUE + 40 CONTINUE + 50 CONTINUE + END IF +* + WORK( 1 ) = IWS + RETURN +* +* End of ZUNGQL +* + END diff --git a/lib/linalg/zungqr.f b/lib/linalg/zungqr.f new file mode 100644 index 0000000000..6b3e9220cd --- /dev/null +++ b/lib/linalg/zungqr.f @@ -0,0 +1,290 @@ +*> \brief \b ZUNGQR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZUNGQR + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDA, LWORK, M, N +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZUNGQR generates an M-by-N complex matrix Q with orthonormal columns, +*> which is defined as the first N columns of a product of K elementary +*> reflectors of order M +*> +*> Q = H(1) H(2) . . . H(k) +*> +*> as returned by ZGEQRF. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix Q. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix Q. M >= N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The number of elementary reflectors whose product defines the +*> matrix Q. N >= K >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the i-th column must contain the vector which +*> defines the elementary reflector H(i), for i = 1,2,...,k, as +*> returned by ZGEQRF in the first k columns of its array +*> argument A. +*> On exit, the M-by-N matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The first dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by ZGEQRF. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The dimension of the array WORK. LWORK >= max(1,N). +*> For optimum performance LWORK >= N*NB, where NB is the +*> optimal blocksize. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument has an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + INTEGER INFO, K, LDA, LWORK, M, N +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY + INTEGER I, IB, IINFO, IWS, J, KI, KK, L, LDWORK, + $ LWKOPT, NB, NBMIN, NX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNG2R +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. External Functions .. + INTEGER ILAENV + EXTERNAL ILAENV +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + NB = ILAENV( 1, 'ZUNGQR', ' ', M, N, K, -1 ) + LWKOPT = MAX( 1, N )*NB + WORK( 1 ) = LWKOPT + LQUERY = ( LWORK.EQ.-1 ) + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 .OR. N.GT.M ) THEN + INFO = -2 + ELSE IF( K.LT.0 .OR. K.GT.N ) THEN + INFO = -3 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -5 + ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZUNGQR', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.LE.0 ) THEN + WORK( 1 ) = 1 + RETURN + END IF +* + NBMIN = 2 + NX = 0 + IWS = N + IF( NB.GT.1 .AND. NB.LT.K ) THEN +* +* Determine when to cross over from blocked to unblocked code. +* + NX = MAX( 0, ILAENV( 3, 'ZUNGQR', ' ', M, N, K, -1 ) ) + IF( NX.LT.K ) THEN +* +* Determine if workspace is large enough for blocked code. +* + LDWORK = N + IWS = LDWORK*NB + IF( LWORK.LT.IWS ) THEN +* +* Not enough workspace to use optimal NB: reduce NB and +* determine the minimum value of NB. +* + NB = LWORK / LDWORK + NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQR', ' ', M, N, K, -1 ) ) + END IF + END IF + END IF +* + IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN +* +* Use blocked code after the last block. +* The first kk columns are handled by the block method. +* + KI = ( ( K-NX-1 ) / NB )*NB + KK = MIN( K, KI+NB ) +* +* Set A(1:kk,kk+1:n) to zero. +* + DO 20 J = KK + 1, N + DO 10 I = 1, KK + A( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + KK = 0 + END IF +* +* Use unblocked code for the last or only block. +* + IF( KK.LT.N ) + $ CALL ZUNG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, + $ TAU( KK+1 ), WORK, IINFO ) +* + IF( KK.GT.0 ) THEN +* +* Use blocked code +* + DO 50 I = KI + 1, 1, -NB + IB = MIN( NB, K-I+1 ) + IF( I+IB.LE.N ) THEN +* +* Form the triangular factor of the block reflector +* H = H(i) H(i+1) . . . H(i+ib-1) +* + CALL ZLARFT( 'Forward', 'Columnwise', M-I+1, IB, + $ A( I, I ), LDA, TAU( I ), WORK, LDWORK ) +* +* Apply H to A(i:m,i+ib:n) from the left +* + CALL ZLARFB( 'Left', 'No transpose', 'Forward', + $ 'Columnwise', M-I+1, N-I-IB+1, IB, + $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ), + $ LDA, WORK( IB+1 ), LDWORK ) + END IF +* +* Apply H to rows i:m of current block +* + CALL ZUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK, + $ IINFO ) +* +* Set rows 1:i-1 of current block to zero +* + DO 40 J = I, I + IB - 1 + DO 30 L = 1, I - 1 + A( L, J ) = ZERO + 30 CONTINUE + 40 CONTINUE + 50 CONTINUE + END IF +* + WORK( 1 ) = IWS + RETURN +* +* End of ZUNGQR +* + END diff --git a/lib/linalg/zungtr.f b/lib/linalg/zungtr.f new file mode 100644 index 0000000000..422a55a921 --- /dev/null +++ b/lib/linalg/zungtr.f @@ -0,0 +1,256 @@ +*> \brief \b ZUNGTR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZUNGTR + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. +* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZUNGTR generates a complex unitary matrix Q which is defined as the +*> product of n-1 elementary reflectors of order N, as returned by +*> ZHETRD: +*> +*> if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), +*> +*> if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangle of A contains elementary reflectors +*> from ZHETRD; +*> = 'L': Lower triangle of A contains elementary reflectors +*> from ZHETRD. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix Q. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is COMPLEX*16 array, dimension (LDA,N) +*> On entry, the vectors which define the elementary reflectors, +*> as returned by ZHETRD. +*> On exit, the N-by-N unitary matrix Q. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= N. +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (N-1) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i), as returned by ZHETRD. +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) +*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. +*> \endverbatim +*> +*> \param[in] LWORK +*> \verbatim +*> LWORK is INTEGER +*> The dimension of the array WORK. LWORK >= N-1. +*> For optimum performance LWORK >= (N-1)*NB, where NB is +*> the optimal blocksize. +*> +*> If LWORK = -1, then a workspace query is assumed; the routine +*> only calculates the optimal size of the WORK array, returns +*> this value as the first entry of the WORK array, and no error +*> message related to LWORK is issued by XERBLA. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16OTHERcomputational +* +* ===================================================================== + SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) +* +* -- LAPACK computational routine (version 3.4.0) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, LDA, LWORK, N +* .. +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO, ONE + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ), + $ ONE = ( 1.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL LQUERY, UPPER + INTEGER I, IINFO, J, LWKOPT, NB +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + EXTERNAL LSAME, ILAENV +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZUNGQL, ZUNGQR +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input arguments +* + INFO = 0 + LQUERY = ( LWORK.EQ.-1 ) + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -4 + ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN + INFO = -7 + END IF +* + IF( INFO.EQ.0 ) THEN + IF( UPPER ) THEN + NB = ILAENV( 1, 'ZUNGQL', ' ', N-1, N-1, N-1, -1 ) + ELSE + NB = ILAENV( 1, 'ZUNGQR', ' ', N-1, N-1, N-1, -1 ) + END IF + LWKOPT = MAX( 1, N-1 )*NB + WORK( 1 ) = LWKOPT + END IF +* + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZUNGTR', -INFO ) + RETURN + ELSE IF( LQUERY ) THEN + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) THEN + WORK( 1 ) = 1 + RETURN + END IF +* + IF( UPPER ) THEN +* +* Q was determined by a call to ZHETRD with UPLO = 'U' +* +* Shift the vectors which define the elementary reflectors one +* column to the left, and set the last row and column of Q to +* those of the unit matrix +* + DO 20 J = 1, N - 1 + DO 10 I = 1, J - 1 + A( I, J ) = A( I, J+1 ) + 10 CONTINUE + A( N, J ) = ZERO + 20 CONTINUE + DO 30 I = 1, N - 1 + A( I, N ) = ZERO + 30 CONTINUE + A( N, N ) = ONE +* +* Generate Q(1:n-1,1:n-1) +* + CALL ZUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) +* + ELSE +* +* Q was determined by a call to ZHETRD with UPLO = 'L'. +* +* Shift the vectors which define the elementary reflectors one +* column to the right, and set the first row and column of Q to +* those of the unit matrix +* + DO 50 J = N, 2, -1 + A( 1, J ) = ZERO + DO 40 I = J + 1, N + A( I, J ) = A( I, J-1 ) + 40 CONTINUE + 50 CONTINUE + A( 1, 1 ) = ONE + DO 60 I = 2, N + A( I, 1 ) = ZERO + 60 CONTINUE + IF( N.GT.1 ) THEN +* +* Generate Q(2:n,2:n) +* + CALL ZUNGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, + $ LWORK, IINFO ) + END IF + END IF + WORK( 1 ) = LWKOPT + RETURN +* +* End of ZUNGTR +* + END diff --git a/lib/meam/Install.py b/lib/meam/Install.py index 37041d2ea1..ffe709d44c 120000 --- a/lib/meam/Install.py +++ b/lib/meam/Install.py @@ -1 +1 @@ -Install.py \ No newline at end of file +../Install.py \ No newline at end of file diff --git a/lib/colvars/Makefile.lammps b/lib/meam/Makefile.lammps.empty similarity index 60% rename from lib/colvars/Makefile.lammps rename to lib/meam/Makefile.lammps.empty index 99f57b050b..10394b68ad 100644 --- a/lib/colvars/Makefile.lammps +++ b/lib/meam/Makefile.lammps.empty @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -colvars_SYSINC = -colvars_SYSLIB = -colvars_SYSPATH = +meam_SYSINC = +meam_SYSLIB = +meam_SYSPATH = diff --git a/lib/meam/Makefile.mingw32-cross b/lib/meam/Makefile.mingw32-cross deleted file mode 100644 index d4d2dad093..0000000000 --- a/lib/meam/Makefile.mingw32-cross +++ /dev/null @@ -1,69 +0,0 @@ -# * -*- makefile -*- -# *_________________________________________________________________________* -# * MEAM: MODEFIED EMBEDDED ATOM METHOD * -# * DESCRIPTION: SEE READ-ME * -# * FILE NAME: Makefile * -# * AUTHORS: Greg Wagner, Sandia National Laboratories * -# * CONTACT: gjwagne@sandia.gov * -# *_________________________________________________________________________*/ - -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps - -EXTRAMAKE = Makefile.lammps.gfortran - -# ------ FILES ------ - -SRC = meam_data.F meam_setup_done.F meam_setup_global.F meam_setup_param.F meam_dens_init.F meam_dens_final.F meam_force.F meam_cleanup.F - -FILES = $(SRC) Makefile - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw32/ -LIB = $(DIR)libmeam.a -OBJ = $(SRC:%.F=$(DIR)%.o) $(DIR)fm_exp.o - -# ------ SETTINGS ------ - -F90 = i686-w64-mingw32-gfortran -F90FLAGS = -O3 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing -J$(DIR) \ - -Wall -W -Wno-uninitialized -fno-second-underscore -#F90FLAGS = -O -ARCHIVE = i686-w64-mingw32-ar -ARCHFLAG = -rcs -LINK = i686-w64-mingw32-g++ -LINKFLAGS = -O -USRLIB = -SYSLIB = - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) - -$(DIR): - -mkdir $(DIR) - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.F - $(F90) $(F90FLAGS) -c $< -o $@ - -$(DIR)%.o:%.c - $(F90) $(F90FLAGS) -c $< -o $@ - -include .depend -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.mod *~ $(LIB) - -rmdir $(DIR) - -tar: - -tar -cvf ../MEAM.tar $(FILES) diff --git a/lib/meam/Makefile.mingw32-cross-mpi b/lib/meam/Makefile.mingw32-cross-mpi deleted file mode 100644 index 1e35c5b461..0000000000 --- a/lib/meam/Makefile.mingw32-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw32-cross - -rm -f Obj_mingw32-mpi - ln -s Obj_mingw32 Obj_mingw32-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw32-cross - -rm -f Obj_mingw32-mpi - diff --git a/lib/meam/Makefile.mingw64-cross-mpi b/lib/meam/Makefile.mingw64-cross-mpi deleted file mode 100644 index ca6f4a6d43..0000000000 --- a/lib/meam/Makefile.mingw64-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw64-cross - -rm -f Obj_mingw64-mpi - ln -s Obj_mingw64 Obj_mingw64-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw64-cross - -rm -f Obj_mingw64-mpi - diff --git a/lib/meam/Makefile.mingw64-cross b/lib/meam/Makefile.mpi similarity index 63% rename from lib/meam/Makefile.mingw64-cross rename to lib/meam/Makefile.mpi index 1a8e97febe..fd3dbde555 100644 --- a/lib/meam/Makefile.mingw64-cross +++ b/lib/meam/Makefile.mpi @@ -1,4 +1,4 @@ -# * -*- makefile -*- +# * # *_________________________________________________________________________* # * MEAM: MODEFIED EMBEDDED ATOM METHOD * # * DESCRIPTION: SEE READ-ME * @@ -11,7 +11,7 @@ SHELL = /bin/sh # which file will be copied to Makefile.lammps -EXTRAMAKE = Makefile.lammps.gfortran +EXTRAMAKE = Makefile.lammps.empty # ------ FILES ------ @@ -21,49 +21,41 @@ FILES = $(SRC) Makefile # ------ DEFINITIONS ------ -DIR = Obj_mingw64/ -LIB = $(DIR)libmeam.a -OBJ = $(SRC:%.F=$(DIR)%.o) $(DIR)fm_exp.o +LIB = libmeam.a +OBJ = $(SRC:.F=.o) fm_exp.o # ------ SETTINGS ------ -F90 = x86_64-w64-mingw32-gfortran -F90FLAGS = -O3 -march=core2 -mtune=core2 -msse2 -mpc64 \ - -ffast-math -funroll-loops -fstrict-aliasing -J$(DIR) \ - -Wall -W -Wno-uninitialized -fno-second-underscore +F90 = mpifort +CC = mpicc +F90FLAGS = -O3 -fPIC #F90FLAGS = -O -ARCHIVE = x86_64-w64-mingw32-ar -ARCHFLAG = -rcs -LINK = x86_64-w64-mingw32-g++ +ARCHIVE = ar +ARCHFLAG = -rc +LINK = mpicxx LINKFLAGS = -O USRLIB = SYSLIB = # ------ MAKE PROCEDURE ------ -default: $(DIR) $(LIB) - -$(DIR): - -mkdir $(DIR) - -$(LIB): $(OBJ) +lib: $(OBJ) $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) @cp $(EXTRAMAKE) Makefile.lammps # ------ COMPILE RULES ------ -$(DIR)%.o:%.F - $(F90) $(F90FLAGS) -c $< -o $@ +%.o:%.F + $(F90) $(F90FLAGS) -c $< -$(DIR)%.o:%.c - $(F90) $(F90FLAGS) -c $< -o $@ +%.o:%.c + $(CC) $(F90FLAGS) -c $< include .depend # ------ CLEAN ------ clean: - -rm $(DIR)*.o $(DIR)*.mod *~ $(LIB) - -rmdir $(DIR) + -rm *.o *.mod *~ $(LIB) tar: -tar -cvf ../MEAM.tar $(FILES) diff --git a/lib/meam/Makefile.serial b/lib/meam/Makefile.serial new file mode 120000 index 0000000000..c52fbcb986 --- /dev/null +++ b/lib/meam/Makefile.serial @@ -0,0 +1 @@ +Makefile.gfortran \ No newline at end of file diff --git a/lib/meam/meam_dens_final.F b/lib/meam/meam_dens_final.F index cdc47067e2..098b00f296 100644 --- a/lib/meam/meam_dens_final.F +++ b/lib/meam/meam_dens_final.F @@ -72,9 +72,21 @@ c Complete the calculation of density if( rho0(i) .gt. 0.0 ) then if (ialloy.eq.1) then - t_ave(1,i) = t_ave(1,i)/tsq_ave(1,i) - t_ave(2,i) = t_ave(2,i)/tsq_ave(2,i) - t_ave(3,i) = t_ave(3,i)/tsq_ave(3,i) + if (tsq_ave(1,i) .ne. 0.0d0) then + t_ave(1,i) = t_ave(1,i)/tsq_ave(1,i) + else + t_ave(1,i) = 0.0d0 + endif + if (tsq_ave(2,i) .ne. 0.0d0) then + t_ave(2,i) = t_ave(2,i)/tsq_ave(2,i) + else + t_ave(2,i) = 0.0d0 + endif + if (tsq_ave(3,i) .ne. 0.0d0) then + t_ave(3,i) = t_ave(3,i)/tsq_ave(3,i) + else + t_ave(3,i) = 0.0d0 + endif else if (ialloy.eq.2) then t_ave(1,i) = t1_meam(elti) t_ave(2,i) = t2_meam(elti) diff --git a/lib/mscg/.gitignore b/lib/mscg/.gitignore new file mode 100644 index 0000000000..7d45bcb60a --- /dev/null +++ b/lib/mscg/.gitignore @@ -0,0 +1,4 @@ +# files to ignore +/liblink +/includelink +/MSCG-release-master diff --git a/lib/mscg/Install.py b/lib/mscg/Install.py index e547232614..76c986ef6d 100644 --- a/lib/mscg/Install.py +++ b/lib/mscg/Install.py @@ -3,46 +3,90 @@ # Install.py tool to download, unpack, build, and link to the MS-CG library # used to automate the steps described in the README file in this dir -import sys,os,re,commands +from __future__ import print_function +import sys,os,re,subprocess # help message help = """ -Syntax: python Install.py -h hpath hdir -g -b [suffix] -l - specify one or more options, order does not matter - -h = set home dir of MS-CG to be hpath/hdir - hpath can be full path, contain '~' or '.' chars - default hpath = . = lib/mscg - default hdir = MSCG-release-master = what GitHub zipfile unpacks to - -g = grab (download) zipfile from MS-CG GitHub website - unpack it to hpath/hdir - hpath must already exist - if hdir already exists, it will be deleted before unpack - -b = build MS-CG library in its src dir - optional suffix specifies which src/Make/Makefile.suffix to use +Syntax from src dir: make lib-mscg args="-p [path] -m [suffix]" + or: make lib-mscg args="-b -m [suffix]" +Syntax from lib dir: python Install.py -p [path] -m [suffix] +Syntax from lib dir: python Install.py -b -m [suffix] + +specify one or more options, order does not matter + + -b = download and build MS-CG library + -p = specify folder of existing MS-CG installation + -m = machine suffix specifies which src/Make/Makefile.suffix to use default suffix = g++_simple - -l = create 2 softlinks (includelink,liblink) in lib/mscg to MS-CG src dir + +Example: + +make lib-mscg args="-b -m serial " # download/build in lib/mscg/MSCG-release-master with settings compatible with "make serial" +make lib-mscg args="-b -m mpi " # download/build in lib/mscg/MSCG-release-master with settings compatible with "make mpi" +make lib-mscg args="-p /usr/local/mscg-release " # use existing MS-CG installation in /usr/local/mscg-release """ # settings -url = "https://github.com/uchicago-voth/MSCG-release/archive/master.zip" -zipfile = "MS-CG-master.zip" -zipdir = "MSCG-release-master" +url = "http://github.com/uchicago-voth/MSCG-release/archive/master.tar.gz" +tarfile = "MS-CG-master.tar.gz" +tardir = "MSCG-release-master" # print error message or help def error(str=None): - if not str: print help - else: print "ERROR",str + if not str: print(help) + else: print("ERROR",str) sys.exit() # expand to full path name # process leading '~' or relative path - + def fullpath(path): return os.path.abspath(os.path.expanduser(path)) - + +def which(program): + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + +def geturl(url,fname): + success = False + + if which('curl') != None: + cmd = 'curl -L -o "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling curl failed with: %s" % e.output.decode('UTF-8')) + + if not success and which('wget') != None: + cmd = 'wget -O "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling wget failed with: %s" % e.output.decode('UTF-8')) + + if not success: + error("Failed to download source code with 'curl' or 'wget'") + return + # parse args args = sys.argv[1:] @@ -50,73 +94,93 @@ nargs = len(args) if nargs == 0: error() homepath = "." -homedir = zipdir +homedir = tardir -grabflag = 0 -buildflag = 0 +buildflag = False +pathflag = False +linkflag = True msuffix = "g++_simple" -linkflag = 0 iarg = 0 while iarg < nargs: - if args[iarg] == "-h": - if iarg+3 > nargs: error() - homepath = args[iarg+1] - homedir = args[iarg+2] - iarg += 3 - elif args[iarg] == "-g": - grabflag = 1 - iarg += 1 + if args[iarg] == "-p": + if iarg+2 > nargs: error() + mscgpath = fullpath(args[iarg+1]) + pathflag = True + iarg += 2 + elif args[iarg] == "-m": + if iarg+2 > nargs: error() + msuffix = args[iarg+1] + iarg += 2 elif args[iarg] == "-b": - buildflag = 1 - if iarg+1 < nargs and args[iarg+1][0] != '-': - msuffix = args[iarg+1] - iarg += 1 - iarg += 1 - elif args[iarg] == "-l": - linkflag = 1 + buildflag = True iarg += 1 else: error() homepath = fullpath(homepath) -if not os.path.isdir(homepath): error("MS-CG path does not exist") homedir = "%s/%s" % (homepath,homedir) -# download and unpack MS-CG zipfile +if (pathflag): + if not os.path.isdir(mscgpath): error("MS-CG path does not exist") + homedir = mscgpath -if grabflag: - print "Downloading MS-CG ..." - cmd = "curl -L %s > %s/%s" % (url,homepath,zipfile) - print cmd - print commands.getoutput(cmd) +if (buildflag and pathflag): + error("Cannot use -b and -p flag at the same time") - print "Unpacking MS-CG zipfile ..." - if os.path.exists("%s/%s" % (homepath,zipdir)): - commands.getoutput("rm -rf %s/%s" % (homepath,zipdir)) - cmd = "cd %s; unzip %s" % (homepath,zipfile) - commands.getoutput(cmd) - if os.path.basename(homedir) != zipdir: - if os.path.exists(homedir): commands.getoutput("rm -rf %s" % homedir) - os.rename("%s/%s" % (homepath,zipdir),homedir) +if (not buildflag and not pathflag): + error("Have to use either -b or -p flag") + +# download and unpack MS-CG tarfile + +if buildflag: + print("Downloading MS-CG ...") + geturl(url,"%s/%s" % (homepath,tarfile)) + + print("Unpacking MS-CG tarfile ...") + if os.path.exists("%s/%s" % (homepath,tardir)): + cmd = 'rm -rf "%s/%s"' % (homepath,tardir) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s"; tar -xzvf %s' % (homepath,tarfile) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + os.remove("%s/%s" % (homepath,tarfile)) + if os.path.basename(homedir) != tardir: + if os.path.exists(homedir): + cmd = 'rm -rf "%s"' % homedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + os.rename("%s/%s" % (homepath,tardir),homedir) # build MS-CG if buildflag: - print "Building MS-CG ..." - cmd = "cd %s/src; cp Make/Makefile.%s .; make -f Makefile.%s" % \ - (homedir,msuffix,msuffix) - txt = commands.getoutput(cmd) - print txt + print("Building MS-CG ...") + if os.path.exists("%s/src/Make/Makefile.%s" % (homedir,msuffix)): + cmd = 'cd "%s/src"; cp Make/Makefile.%s .; make -f Makefile.%s' % \ + (homedir,msuffix,msuffix) + elif os.path.exists("Makefile.%s" % msuffix): + cmd = 'cd "%s/src"; cp ../../Makefile.%s .; make -f Makefile.%s' % \ + (homedir,msuffix,msuffix) + else: + error("Cannot find Makefile.%s" % msuffix) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + print(txt.decode('UTF-8')) + if not os.path.exists("Makefile.lammps"): + print("Creating Makefile.lammps") + if os.path.exists("Makefile.lammps.%s" % msuffix): + cmd = 'cp Makefile.lammps.%s Makefile.lammps' % msuffix + else: + cmd = 'cp Makefile.lammps.default Makefile.lammps' + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + else: print("Makefile.lammps exists. Please check its settings") # create 2 links in lib/mscg to MS-CG src dir if linkflag: - print "Creating links to MS-CG include and lib files" + print("Creating links to MS-CG include and lib files") if os.path.isfile("includelink") or os.path.islink("includelink"): os.remove("includelink") if os.path.isfile("liblink") or os.path.islink("liblink"): os.remove("liblink") - cmd = "ln -s %s/src includelink" % homedir - commands.getoutput(cmd) - cmd = "ln -s %s/src liblink" % homedir - commands.getoutput(cmd) + cmd = 'ln -s "%s/src" includelink' % homedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'ln -s "%s/src" liblink' % homedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) diff --git a/lib/atc/Makefile.lammps b/lib/mscg/Makefile.lammps.default similarity index 52% rename from lib/atc/Makefile.lammps rename to lib/mscg/Makefile.lammps.default index c8cd66af26..7f04ff2eac 100644 --- a/lib/atc/Makefile.lammps +++ b/lib/mscg/Makefile.lammps.default @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -user-atc_SYSINC = -user-atc_SYSLIB = -lblas -llapack -user-atc_SYSPATH = +mscg_SYSINC = +mscg_SYSLIB = -lgsl -lgslcblas +mscg_SYSPATH = diff --git a/lib/mscg/Makefile.lammps b/lib/mscg/Makefile.lammps.g++_simple similarity index 100% rename from lib/mscg/Makefile.lammps rename to lib/mscg/Makefile.lammps.g++_simple diff --git a/lib/mscg/Makefile.lammps.mpi b/lib/mscg/Makefile.lammps.mpi new file mode 100644 index 0000000000..7f04ff2eac --- /dev/null +++ b/lib/mscg/Makefile.lammps.mpi @@ -0,0 +1,5 @@ +# Settings that the LAMMPS build will import when this package library is used + +mscg_SYSINC = +mscg_SYSLIB = -lgsl -lgslcblas +mscg_SYSPATH = diff --git a/lib/mscg/Makefile.lammps.serial b/lib/mscg/Makefile.lammps.serial new file mode 100644 index 0000000000..7f04ff2eac --- /dev/null +++ b/lib/mscg/Makefile.lammps.serial @@ -0,0 +1,5 @@ +# Settings that the LAMMPS build will import when this package library is used + +mscg_SYSINC = +mscg_SYSLIB = -lgsl -lgslcblas +mscg_SYSPATH = diff --git a/lib/mscg/Makefile.mpi b/lib/mscg/Makefile.mpi new file mode 100644 index 0000000000..d5088176b4 --- /dev/null +++ b/lib/mscg/Makefile.mpi @@ -0,0 +1,104 @@ +# This Makefile is meant for use after +# module load gsl/2.2.1+gcc-6.1 +# module load gcc/6.1 +# It also requires LAPACK +# Module names refer to those on any of RCC's clusters at UChicago. + +# This makefile does NOT include GROMACS reading or MKL (sparse matrix) +# It uses the gcc/g++ compiler (v4.9+) for C++11 support + +# 1) Try this first (as it is the easiest) +NO_GRO_LIBS = -lgsl -lgslcblas + +# 2) If it does not find your libraries automatically, you can specify them manually +# # A) Set the GSL_LIB to the location of your GSL library's lib directory (must be V2+) +GSL_LIB = /software/gsl-2.2.1-el6-x86_64+gcc-6.1/lib +# # B) Set the LAPACK_DIR to the location of your LAPACK library base directory +LAPACK_LIB = $(HOME)/local/lapack-3.7.0 +# # C) Uncomment this next line and then run again (after cleaning up any object files) +#NO_GRO_LIBS = -L$(GSL_LIB) -L$(LAPACK_LIB) -lgsl -lgslcblas -llapack -lm + +OPT = -O2 +NO_GRO_LDFLAGS = $(OPT) +NO_GRO_CFLAGS = $(OPT) +DIMENSION = 3 +CC = mpicc + +COMMON_SOURCE = control_input.h fm_output.h force_computation.h geometry.h interaction_hashing.h interaction_model.h matrix.h splines.h topology.h trajectory_input.h misc.h mscg.h +NO_GRO_COMMON_OBJECTS = control_input.o fm_output.o force_computation.o geometry.o interaction_hashing.o interaction_model.o matrix.o splines.o topology.o trajectory_input_no_gro.o misc.o + +# Target executables +# The library for LAMMPS is lib_mscg.a +libmscg.a: mscg.o $(NO_GRO_COMMON_OBJECTS) + ar rvs libmscg.a *.o + +newfm_no_gro.x: newfm.o $(NO_GRO_COMMON_OBJECTS) + $(CC) $(NO_GRO_LDFLAGS) -o $@ newfm.o $(NO_GRO_COMMON_OBJECTS) -D"_exclude_gromacs=1" $(NO_GRO_LIBS) + +combinefm_no_gro.x: combinefm.o batch_fm_combination.o $(NO_GRO_COMMON_OBJECTS) + $(CC) $(NO_GRO_LDFLAGS) -o $@ combinefm.o batch_fm_combination.o $(NO_GRO_COMMON_OBJECTS) -D"_exclude_gromacs=1" $(NO_GRO_LIBS) + +rangefinder_no_gro.x: rangefinder.o range_finding.o $(NO_GRO_COMMON_OBJECTS) + $(CC) $(NO_GRO_LDFLAGS) -o $@ rangefinder.o range_finding.o $(NO_GRO_COMMON_OBJECTS) -D"_exclude_gromacs=1" $(NO_GRO_LIBS) + +# Target objects + +mscg.o: mscg.cpp $(COMMON_SOURCE) range_finding.o + $(CC) $(NO_GRO_CFLAGS) -c mscg.cpp -o mscg.o $(NO_GRO_LIBS) + +newfm.o: newfm.cpp $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c newfm.cpp + +combinefm.o: combinefm.cpp batch_fm_combination.h $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c combinefm.cpp + +rangefinder.o: rangefinder.cpp range_finding.h $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c rangefinder.cpp + +scalarfm.o: scalarfm.cpp $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c scalarfm.cpp + +batch_fm_combination.o: batch_fm_combination.cpp batch_fm_combination.h external_matrix_routines.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c batch_fm_combination.cpp + +control_input.o: control_input.cpp control_input.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c control_input.cpp + +geometry.o: geometry.cpp geometry.h + $(CC) $(NO_GRO_CFLAGS) -c geometry.cpp -DDIMENSION=$(DIMENSION) + +fm_output.o: fm_output.cpp fm_output.h force_computation.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c fm_output.cpp + +force_computation.o: force_computation.cpp force_computation.h interaction_model.h matrix.h trajectory_input.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c force_computation.cpp -DDIMENSION=$(DIMENSION) + +interaction_hashing.o: interaction_hashing.cpp interaction_hashing.h + $(CC) $(NO_GRO_CFLAGS) -c interaction_hashing.cpp + +interaction_model.o: interaction_model.cpp interaction_model.h control_input.h interaction_hashing.h topology.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c interaction_model.cpp -DDIMENSION=$(DIMENSION) + +matrix.o: matrix.cpp matrix.h control_input.h external_matrix_routines.h interaction_model.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c matrix.cpp -DDIMENSION=$(DIMENSION) + +misc.o: misc.cpp misc.h + $(CC) $(NO_GRO_CFLAGS) -c misc.cpp + +range_finding.o: range_finding.cpp range_finding.h force_computation.h interaction_model.h matrix.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c range_finding.cpp -DDIMENSION=$(DIMENSION) + +splines.o: splines.cpp splines.h interaction_model.h + $(CC) $(NO_GRO_CFLAGS) -c splines.cpp -DDIMENSION=$(DIMENSION) + +topology.o: topology.cpp topology.h interaction_model.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c topology.cpp -DDIMENSION=$(DIMENSION) + +trajectory_input_no_gro.o: trajectory_input.cpp trajectory_input.h control_input.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c trajectory_input.cpp -D"_exclude_gromacs=1" -o trajectory_input_no_gro.o + +# Other convenient commands +clean: + rm *.[o] + +all: libmscg.a newfm_no_gro.x rangefinder_no_gro.x combinefm_no_gro.x diff --git a/lib/mscg/Makefile.serial b/lib/mscg/Makefile.serial new file mode 100644 index 0000000000..4e34706f01 --- /dev/null +++ b/lib/mscg/Makefile.serial @@ -0,0 +1,104 @@ +# This Makefile is meant for use after +# module load gsl/2.2.1+gcc-6.1 +# module load gcc/6.1 +# It also requires LAPACK +# Module names refer to those on any of RCC's clusters at UChicago. + +# This makefile does NOT include GROMACS reading or MKL (sparse matrix) +# It uses the gcc/g++ compiler (v4.9+) for C++11 support + +# 1) Try this first (as it is the easiest) +NO_GRO_LIBS = -lgsl -lgslcblas + +# 2) If it does not find your libraries automatically, you can specify them manually +# # A) Set the GSL_LIB to the location of your GSL library's lib directory (must be V2+) +GSL_LIB = /software/gsl-2.2.1-el6-x86_64+gcc-6.1/lib +# # B) Set the LAPACK_DIR to the location of your LAPACK library base directory +LAPACK_LIB = $(HOME)/local/lapack-3.7.0 +# # C) Uncomment this next line and then run again (after cleaning up any object files) +#NO_GRO_LIBS = -L$(GSL_LIB) -L$(LAPACK_LIB) -lgsl -lgslcblas -llapack -lm + +OPT = -O2 +NO_GRO_LDFLAGS = $(OPT) +NO_GRO_CFLAGS = $(OPT) +DIMENSION = 3 +CC = g++ + +COMMON_SOURCE = control_input.h fm_output.h force_computation.h geometry.h interaction_hashing.h interaction_model.h matrix.h splines.h topology.h trajectory_input.h misc.h mscg.h +NO_GRO_COMMON_OBJECTS = control_input.o fm_output.o force_computation.o geometry.o interaction_hashing.o interaction_model.o matrix.o splines.o topology.o trajectory_input_no_gro.o misc.o + +# Target executables +# The library for LAMMPS is lib_mscg.a +libmscg.a: mscg.o $(NO_GRO_COMMON_OBJECTS) + ar rvs libmscg.a *.o + +newfm_no_gro.x: newfm.o $(NO_GRO_COMMON_OBJECTS) + $(CC) $(NO_GRO_LDFLAGS) -o $@ newfm.o $(NO_GRO_COMMON_OBJECTS) -D"_exclude_gromacs=1" $(NO_GRO_LIBS) + +combinefm_no_gro.x: combinefm.o batch_fm_combination.o $(NO_GRO_COMMON_OBJECTS) + $(CC) $(NO_GRO_LDFLAGS) -o $@ combinefm.o batch_fm_combination.o $(NO_GRO_COMMON_OBJECTS) -D"_exclude_gromacs=1" $(NO_GRO_LIBS) + +rangefinder_no_gro.x: rangefinder.o range_finding.o $(NO_GRO_COMMON_OBJECTS) + $(CC) $(NO_GRO_LDFLAGS) -o $@ rangefinder.o range_finding.o $(NO_GRO_COMMON_OBJECTS) -D"_exclude_gromacs=1" $(NO_GRO_LIBS) + +# Target objects + +mscg.o: mscg.cpp $(COMMON_SOURCE) range_finding.o + $(CC) $(NO_GRO_CFLAGS) -c mscg.cpp -o mscg.o $(NO_GRO_LIBS) + +newfm.o: newfm.cpp $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c newfm.cpp + +combinefm.o: combinefm.cpp batch_fm_combination.h $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c combinefm.cpp + +rangefinder.o: rangefinder.cpp range_finding.h $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c rangefinder.cpp + +scalarfm.o: scalarfm.cpp $(COMMON_SOURCE) + $(CC) $(NO_GRO_CFLAGS) -c scalarfm.cpp + +batch_fm_combination.o: batch_fm_combination.cpp batch_fm_combination.h external_matrix_routines.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c batch_fm_combination.cpp + +control_input.o: control_input.cpp control_input.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c control_input.cpp + +geometry.o: geometry.cpp geometry.h + $(CC) $(NO_GRO_CFLAGS) -c geometry.cpp -DDIMENSION=$(DIMENSION) + +fm_output.o: fm_output.cpp fm_output.h force_computation.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c fm_output.cpp + +force_computation.o: force_computation.cpp force_computation.h interaction_model.h matrix.h trajectory_input.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c force_computation.cpp -DDIMENSION=$(DIMENSION) + +interaction_hashing.o: interaction_hashing.cpp interaction_hashing.h + $(CC) $(NO_GRO_CFLAGS) -c interaction_hashing.cpp + +interaction_model.o: interaction_model.cpp interaction_model.h control_input.h interaction_hashing.h topology.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c interaction_model.cpp -DDIMENSION=$(DIMENSION) + +matrix.o: matrix.cpp matrix.h control_input.h external_matrix_routines.h interaction_model.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c matrix.cpp -DDIMENSION=$(DIMENSION) + +misc.o: misc.cpp misc.h + $(CC) $(NO_GRO_CFLAGS) -c misc.cpp + +range_finding.o: range_finding.cpp range_finding.h force_computation.h interaction_model.h matrix.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c range_finding.cpp -DDIMENSION=$(DIMENSION) + +splines.o: splines.cpp splines.h interaction_model.h + $(CC) $(NO_GRO_CFLAGS) -c splines.cpp -DDIMENSION=$(DIMENSION) + +topology.o: topology.cpp topology.h interaction_model.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c topology.cpp -DDIMENSION=$(DIMENSION) + +trajectory_input_no_gro.o: trajectory_input.cpp trajectory_input.h control_input.h misc.h + $(CC) $(NO_GRO_CFLAGS) -c trajectory_input.cpp -D"_exclude_gromacs=1" -o trajectory_input_no_gro.o + +# Other convenient commands +clean: + rm *.[o] + +all: libmscg.a newfm_no_gro.x rangefinder_no_gro.x combinefm_no_gro.x diff --git a/lib/mscg/README b/lib/mscg/README index b73c8563cd..329eebba96 100755 --- a/lib/mscg/README +++ b/lib/mscg/README @@ -6,12 +6,11 @@ The MS-CG library is available at https://github.com/uchicago-voth/MSCG-release and was developed by Jacob Wagner in Greg Voth's group at the University of Chicago. -This library requires a compiler with C++11 support (e.g., g++ v4.9+), -LAPACK, and the GNU scientific library (GSL v 2.1+). +This library requires a the GNU scientific library (GSL v 2.1+). You can type "make lib-mscg" from the src directory to see help on how to download and build this library via make commands, or you can do -the same thing by typing "python Install.py" from within this +the same thing by typing "python Install.py -m " from within this directory, or you can do it manually by following the instructions below. @@ -21,17 +20,17 @@ You must perform the following steps yourself. 1. Download MS-CG at https://github.com/uchicago-voth/MSCG-release either as a tarball or via SVN, and unpack the tarball either in - this /lib/mscg directory or somewhere else on your system. + this lib/mscg directory or somewhere else on your system. + +2. Ensure that you have GSL installed and a compiler with support for C++11. -2. Ensure that you have LAPACK and GSL (or Intel MKL) as well as a compiler - with support for C++11. - 3. Compile MS-CG from within its home directory using your makefile of choice: - % make -f Makefile."name" libmscg.a - It is recommended that you start with Makefile.g++_simple - for most machines + % make -f Makefile. libmscg.a + It is recommended that you start with Makefile.g++_simple for + most machines. There are also two Makefile with settings matching + the "mpi" and "serial" makefiles in the main LAMMPS folder. -4. There is no need to install MS-CG if you only wish +4. There is no need to install MS-CG system-wide if you only wish to use it from LAMMPS. 5. Create two soft links in this dir (lib/mscg) to the MS-CG src @@ -43,6 +42,9 @@ You must perform the following steps yourself. % ln -s /usr/local/include includelink % ln -s /usr/local/lib liblink +6. Copy a suitable Makefile.lammps. to Makefile.lammps or + copy Makefile.lammps.default to Makefile.lammps and edit as needed. + ----------------- When these steps are complete you can build LAMMPS with the MS-CG diff --git a/lib/poems/Install.py b/lib/poems/Install.py index 37041d2ea1..ffe709d44c 120000 --- a/lib/poems/Install.py +++ b/lib/poems/Install.py @@ -1 +1 @@ -Install.py \ No newline at end of file +../Install.py \ No newline at end of file diff --git a/lib/poems/Makefile.g++ b/lib/poems/Makefile.g++ index 54c897a22c..afcbc4a01d 100644 --- a/lib/poems/Makefile.g++ +++ b/lib/poems/Makefile.g++ @@ -68,7 +68,7 @@ OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ CC = g++ -CCFLAGS = -O -g -fPIC -Wall #-Wno-deprecated +CCFLAGS = -O3 -g -fPIC -Wall #-Wno-deprecated ARCHIVE = ar ARCHFLAG = -rc DEPFLAGS = -M diff --git a/lib/poems/Makefile.mingw32-cross b/lib/poems/Makefile.mingw32-cross deleted file mode 100644 index 17e81b51f0..0000000000 --- a/lib/poems/Makefile.mingw32-cross +++ /dev/null @@ -1,110 +0,0 @@ -# * -# *_________________________________________________________________________* -# * POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE * -# * DESCRIPTION: SEE READ-ME * -# * FILE NAME: Makefile * -# * AUTHORS: See Author List * -# * GRANTS: See Grants List * -# * COPYRIGHT: (C) 2005 by Authors as listed in Author's List * -# * LICENSE: Please see License Agreement * -# * DOWNLOAD: Free at www.rpi.edu/~anderk5 * -# * ADMINISTRATOR: Prof. Kurt Anderson * -# * Computational Dynamics Lab * -# * Rensselaer Polytechnic Institute * -# * 110 8th St. Troy NY 12180 * -# * CONTACT: anderk5@rpi.edu * -# *_________________________________________________________________________*/ - -SHELL = /bin/sh - -# which file will be copied to Makefile.lammps - -EXTRAMAKE = Makefile.lammps.empty - -# ------ FILES ------ - -SRC_MAIN = workspace.cpp system.cpp poemsobject.cpp -INC_MAIN = workspace.h system.h poemsobject.h - -SRC_BODY = body.cpp rigidbody.cpp particle.cpp inertialframe.cpp -INC_BODY = bodies.h body.h rigidbody.h particle.h inertialframe.h - - -SRC_JOINT = joint.cpp revolutejoint.cpp prismaticjoint.cpp sphericaljoint.cpp \ - freebodyjoint.cpp body23joint.cpp mixedjoint.cpp -INC_JOINT = joints.h joint.h revolutejoint.h prismaticjoint.h sphericaljoint.h \ - freebodyjoint.h body23joint.h mixedjoint.h - -SRC_POINT = point.cpp fixedpoint.cpp -INC_POINT = points.h point.h fixedpoint.h - -SRC_SOLVE = solver.cpp -INC_SOLVE = solver.h - -SRC_ORDERN = onsolver.cpp onfunctions.cpp onbody.cpp -INC_ORDERN = onsolver.h onfunctions.h onbody.h - -SRC_MAT = virtualmatrix.cpp matrix.cpp matrixfun.cpp mat3x3.cpp virtualcolmatrix.cpp \ - colmatrix.cpp vect3.cpp virtualrowmatrix.cpp rowmatrix.cpp mat6x6.cpp vect6.cpp \ - fastmatrixops.cpp colmatmap.cpp eulerparameters.cpp vect4.cpp norm.cpp mat4x4.cpp \ - -INC_MAT = matrices.h virtualmatrix.h matrix.h matrixfun.h mat3x3.h virtualcolmatrix.h \ - colmatrix.h vect3.h virtualrowmatrix.h rowmatrix.h mat6x6.h vect6.h \ - fastmatrixops.h colmatmap.h eulerparameters.h vect4.h norm.h mat4x4.h - -SRC_MISC = poemstreenode.cpp -INC_MISC = poemslist.h poemstreenode.h poemstree.h poemsnodelib.h SystemProcessor.h defines.h POEMSChain.h - -SRC = $(SRC_MAIN) $(SRC_BODY) $(SRC_JOINT) $(SRC_POINT) $(SRC_SOLVE) $(SRC_ORDERN) $(SRC_MAT) $(SRC_MISC) -INC = $(INC_MAIN) $(INC_BODY) $(INC_JOINT) $(INC_POINT) $(INC_SOLVE) $(INC_ORDERN) $(INC_MAT) $(INC_MISC) - -FILES = $(SRC) $(INC) Makefile Authors_List.txt Grants_List.txt POEMS_License.txt README Copyright_Notice - -# ------ DEFINITIONS ------ - -DIR = Obj_mingw32/ -LIB = $(DIR)libpoems.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) - -# ------ SETTINGS ------ - -CC = i686-w64-mingw32-g++ -CCFLAGS = -O2 -march=i686 -mtune=generic -mfpmath=387 -mpc64 \ - -ffast-math -funroll-loops -finline-functions -fno-rtti \ - -fno-exceptions -fstrict-aliasing \ - -Wall -W -Wno-uninitialized -ARCHIVE = i686-w64-mingw32-ar -ARCHFLAG = -rcs -DEPFLAGS = -M -LINK = i686-w64-mingw32-g++ -LINKFLAGS = -O -USRLIB = -SYSLIB = - -# ------ MAKE PROCEDURE ------ - -default: $(DIR) $(LIB) - -$(DIR): - -mkdir $(DIR) - -$(LIB): $(OBJ) - $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) - @cp $(EXTRAMAKE) Makefile.lammps - -# ------ COMPILE RULES ------ - -$(DIR)%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -o $@ - -# ------ DEPENDENCIES ------ - -include .depend - -# ------ CLEAN ------ - -clean: - -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) - -tar: - -tar -cvf ../POEMS.tar $(FILES) diff --git a/lib/poems/Makefile.mingw32-cross-mpi b/lib/poems/Makefile.mingw32-cross-mpi deleted file mode 100644 index 1e35c5b461..0000000000 --- a/lib/poems/Makefile.mingw32-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw32-cross - -rm -f Obj_mingw32-mpi - ln -s Obj_mingw32 Obj_mingw32-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw32-cross - -rm -f Obj_mingw32-mpi - diff --git a/lib/poems/Makefile.mingw64-cross-mpi b/lib/poems/Makefile.mingw64-cross-mpi deleted file mode 100644 index ca6f4a6d43..0000000000 --- a/lib/poems/Makefile.mingw64-cross-mpi +++ /dev/null @@ -1,13 +0,0 @@ -# -*- makefile -*- wrapper for non-MPI libraries - -SHELL=/bin/sh - -all: - $(MAKE) $(MFLAGS) mingw64-cross - -rm -f Obj_mingw64-mpi - ln -s Obj_mingw64 Obj_mingw64-mpi - -clean: - $(MAKE) $(MFLAGS) clean-mingw64-cross - -rm -f Obj_mingw64-mpi - diff --git a/lib/poems/Makefile.mingw64-cross b/lib/poems/Makefile.mpi similarity index 86% rename from lib/poems/Makefile.mingw64-cross rename to lib/poems/Makefile.mpi index 2df43dea94..0f0546419c 100644 --- a/lib/poems/Makefile.mingw64-cross +++ b/lib/poems/Makefile.mpi @@ -62,40 +62,31 @@ FILES = $(SRC) $(INC) Makefile Authors_List.txt Grants_List.txt POEMS_License.tx # ------ DEFINITIONS ------ -DIR = Obj_mingw64/ -LIB = $(DIR)libpoems.a -OBJ = $(SRC:%.cpp=$(DIR)%.o) +LIB = libpoems.a +OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -CC = x86_64-w64-mingw32-g++ -CCFLAGS = -O2 -march=core2 -mtune=core2 -msse2 -mpc64 \ - -ffast-math -funroll-loops -finline-functions -fno-rtti \ - -fno-exceptions -fstrict-aliasing \ - -Wall -W -Wno-uninitialized -ARCHIVE = x86_64-w64-mingw32-ar -ARCHFLAG = -rcs +CC = mpicxx +CCFLAGS = -O3 -g -fPIC -Wall #-Wno-deprecated +ARCHIVE = ar +ARCHFLAG = -rc DEPFLAGS = -M -LINK = x86_64-w64-mingw32-g++ +LINK = mpicxx LINKFLAGS = -O USRLIB = SYSLIB = # ------ MAKE PROCEDURE ------ -default: $(DIR) $(LIB) - -$(DIR): - -mkdir $(DIR) - -$(LIB): $(OBJ) +lib: $(OBJ) $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) @cp $(EXTRAMAKE) Makefile.lammps # ------ COMPILE RULES ------ -$(DIR)%.o:%.cpp - $(CC) $(CCFLAGS) -c $< -o $@ +%.o:%.cpp + $(CC) $(CCFLAGS) -c $< # ------ DEPENDENCIES ------ @@ -104,7 +95,7 @@ include .depend # ------ CLEAN ------ clean: - -rm $(DIR)*.o $(DIR)*.d *~ $(LIB) + -rm *.o *.d *~ $(LIB) tar: -tar -cvf ../POEMS.tar $(FILES) diff --git a/lib/poems/Makefile.serial b/lib/poems/Makefile.serial new file mode 120000 index 0000000000..9d7bb000f9 --- /dev/null +++ b/lib/poems/Makefile.serial @@ -0,0 +1 @@ +Makefile.g++ \ No newline at end of file diff --git a/lib/poems/poemsobject.cpp b/lib/poems/poemsobject.cpp index 4a5f903fca..7c3f1ca872 100644 --- a/lib/poems/poemsobject.cpp +++ b/lib/poems/poemsobject.cpp @@ -21,7 +21,7 @@ POEMSObject::POEMSObject(){ name = 0; - ChangeName("unnamed"); + ChangeName((const char*)"unnamed"); ID = -1; } @@ -29,7 +29,7 @@ POEMSObject::~POEMSObject(){ delete [] name; } -void POEMSObject::ChangeName(char* newname){ +void POEMSObject::ChangeName(const char* newname){ delete [] name; name = new char[strlen(newname)+1]; strcpy(name,newname); diff --git a/lib/poems/poemsobject.h b/lib/poems/poemsobject.h index d898ab3c66..63b2915638 100644 --- a/lib/poems/poemsobject.h +++ b/lib/poems/poemsobject.h @@ -26,7 +26,7 @@ class POEMSObject { public: POEMSObject(); virtual ~POEMSObject(); - void ChangeName(char* newname); + void ChangeName(const char* newname); char* GetName(); int GetID(); void SetID(int id); diff --git a/lib/qmmm/Install.py b/lib/qmmm/Install.py index 37041d2ea1..ffe709d44c 120000 --- a/lib/qmmm/Install.py +++ b/lib/qmmm/Install.py @@ -1 +1 @@ -Install.py \ No newline at end of file +../Install.py \ No newline at end of file diff --git a/lib/qmmm/Makefile.mpi b/lib/qmmm/Makefile.mpi new file mode 100644 index 0000000000..590b1047f8 --- /dev/null +++ b/lib/qmmm/Makefile.mpi @@ -0,0 +1,66 @@ +# -*- Makefile -*- for coupling LAMMPS to PWscf for QM/MM molecular dynamics + +# this file will be copied to Makefile.lammps +EXTRAMAKE = Makefile.lammps.empty + +# top level directory of Quantum ESPRESSO 5.4.1 or later +QETOPDIR=$(HOME)/compile/espresso + +# import compiler settings from Quantum ESPRESSO +sinclude $(QETOPDIR)/make.sys + +# FLAGS for c++ OpenMPI 1.8.8 or later when QE was compiled with GNU Fortran 4.x +MPICXX=mpicxx +MPICXXFLAGS= -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1 -O2 -g -fPIC\ + -I../../src -I$(QETOPDIR)/COUPLE/include +MPILIBS=-fopenmp -lgfortran -ldl -ljpeg -lpng -lz -lmpi_mpifh -lmpi + +# location of required libraries +# part 1: hi-level libraries for building pw.x +PWOBJS = \ +$(QETOPDIR)/COUPLE/src/libqecouple.a \ +$(QETOPDIR)/PW/src/libpw.a \ +$(QETOPDIR)/Modules/libqemod.a +# part 2: lo-level libraries for all of Q-E +LIBOBJS = \ +$(QETOPDIR)/FFTXlib/libqefft.a \ +$(QETOPDIR)/LAXlib/libqela.a \ +$(QETOPDIR)/clib/clib.a \ +$(QETOPDIR)/iotk/src/libiotk.a + +# part 3: add-on libraries and main library for LAMMPS +sinclude ../../src/Makefile.package +LAMMPSCFG = mpi +LAMMPSLIB = ../../src/liblammps_$(LAMMPSCFG).a + +# part 4: local QM/MM library and progams +SRC=pwqmmm.c libqmmm.c +OBJ=$(SRC:%.c=%.o) + + +default: libqmmm.a + +all : tldeps libqmmm.a pwqmmm.x + +pwqmmm.x : pwqmmm.o $(OBJ) $(PWOBJS) $(LIBOBJS) $(LAMMPSLIB) + $(MPICXX) $(LDFLAGS) -o $@ $^ $(PKG_PATH) $(PKG_LIB) $(MPILIBS) $(LIBS) + +libqmmm.a: libqmmm.o + $(AR) $(ARFLAGS) $@ $^ + @cp $(EXTRAMAKE) Makefile.lammps + +%.o: %.c + $(MPICXX) -c $(LAMMPSFLAGS) $(MPICXXFLAGS) $< -o $@ + +tldeps: + ( cd $(QETOPDIR) ; $(MAKE) $(MFLAGS) couple || exit 1) + $(MAKE) -C ../../src $(MFLAGS) $(LAMMPSCFG) + $(MAKE) -C ../../src $(MFLAGS) mode=lib $(LAMMPSCFG) + +clean : + -rm -f *.x *.o *.a *~ *.F90 *.d *.mod *.i *.L + +# explicit dependencies + +pwqmmm.o: pwqmmm.c libqmmm.h +libqmmm.o: libqmmm.c libqmmm.h diff --git a/lib/qmmm/Makefile.serial b/lib/qmmm/Makefile.serial new file mode 100644 index 0000000000..f091482792 --- /dev/null +++ b/lib/qmmm/Makefile.serial @@ -0,0 +1,66 @@ +# -*- Makefile -*- for coupling LAMMPS to PWscf for QM/MM molecular dynamics + +# this file will be copied to Makefile.lammps +EXTRAMAKE = Makefile.lammps.empty + +# top level directory of Quantum ESPRESSO 5.4.1 or later +QETOPDIR=$(HOME)/compile/espresso + +# import compiler settings from Quantum ESPRESSO +sinclude $(QETOPDIR)/make.sys + +# FLAGS for GNU c++ with STUBS. non-functional for real coupling +MPICXX=g++ +MPICXXFLAGS= -I../../src/STUBS -O2 -g -fPIC\ + -I../../src -I$(QETOPDIR)/COUPLE/include +MPILIBS=-fopenmp -lgfortran -ldl -ljpeg -lpng -lz -lmpi_mpifh -lmpi + +# location of required libraries +# part 1: hi-level libraries for building pw.x +PWOBJS = \ +$(QETOPDIR)/COUPLE/src/libqecouple.a \ +$(QETOPDIR)/PW/src/libpw.a \ +$(QETOPDIR)/Modules/libqemod.a +# part 2: lo-level libraries for all of Q-E +LIBOBJS = \ +$(QETOPDIR)/FFTXlib/libqefft.a \ +$(QETOPDIR)/LAXlib/libqela.a \ +$(QETOPDIR)/clib/clib.a \ +$(QETOPDIR)/iotk/src/libiotk.a + +# part 3: add-on libraries and main library for LAMMPS +sinclude ../../src/Makefile.package +LAMMPSCFG = mpi +LAMMPSLIB = ../../src/liblammps_$(LAMMPSCFG).a + +# part 4: local QM/MM library and progams +SRC=pwqmmm.c libqmmm.c +OBJ=$(SRC:%.c=%.o) + + +default: libqmmm.a + +all : tldeps libqmmm.a pwqmmm.x + +pwqmmm.x : pwqmmm.o $(OBJ) $(PWOBJS) $(LIBOBJS) $(LAMMPSLIB) + $(MPICXX) $(LDFLAGS) -o $@ $^ $(PKG_PATH) $(PKG_LIB) $(MPILIBS) $(LIBS) + +libqmmm.a: libqmmm.o + $(AR) $(ARFLAGS) $@ $^ + @cp $(EXTRAMAKE) Makefile.lammps + +%.o: %.c + $(MPICXX) -c $(LAMMPSFLAGS) $(MPICXXFLAGS) $< -o $@ + +tldeps: + ( cd $(QETOPDIR) ; $(MAKE) $(MFLAGS) couple || exit 1) + $(MAKE) -C ../../src $(MFLAGS) $(LAMMPSCFG) + $(MAKE) -C ../../src $(MFLAGS) mode=lib $(LAMMPSCFG) + +clean : + -rm -f *.x *.o *.a *~ *.F90 *.d *.mod *.i *.L + +# explicit dependencies + +pwqmmm.o: pwqmmm.c libqmmm.h +libqmmm.o: libqmmm.c libqmmm.h diff --git a/lib/quip/.gitignore b/lib/quip/.gitignore new file mode 100644 index 0000000000..d6797a67fe --- /dev/null +++ b/lib/quip/.gitignore @@ -0,0 +1 @@ +/QUIP diff --git a/lib/quip/Makefile.lammps b/lib/quip/Makefile.lammps index 19ff20b073..e471d3f6f4 100644 --- a/lib/quip/Makefile.lammps +++ b/lib/quip/Makefile.lammps @@ -1,17 +1,26 @@ # Settings that the LAMMPS build will import when this package library is used -# include ${QUIP_ROOT}/Makefiles/Makefile.${QUIP_ARCH} - -F95=$(shell egrep 'F95[ ]*=' ${QUIP_ROOT}/arch/Makefile.${QUIP_ARCH} | sed 's/.*F95[ ]*=[ ]*//') +# try to guess settings assuming there is a configured QUIP git checkout inside the lib/quip directory +QUIPDIR=$(abspath ../../lib/quip/QUIP) +ifeq (${QUIP_ROOT},) + QUIP_ROOT=$(shell test -d $(QUIPDIR) && echo $(QUIPDIR)) + ifeq (${QUIP_ARCH},) + QUIP_ARCH=$(notdir $(wildcard $(QUIP_ROOT)/build/*)) + endif +else +# uncomment and set manually or set the corresponding environment variables +# QUIP_ROOT= +# QUIP_ARCH= +endif ifeq (${QUIP_ROOT},) -$(error Environment variable QUIP_ROOT must be set.) +$(error Environment or make variable QUIP_ROOT must be set.) endif - ifeq (${QUIP_ARCH},) -$(error Environment variable QUIP_ARCH must be set.) +$(error Environment or make variable QUIP_ARCH must be set.) endif +F95=$(shell egrep 'F95[ ]*=' ${QUIP_ROOT}/arch/Makefile.${QUIP_ARCH} | sed 's/.*F95[ ]*=[ ]*//') include ${QUIP_ROOT}/build/${QUIP_ARCH}/Makefile.inc include ${QUIP_ROOT}/Makefile.rules @@ -28,3 +37,4 @@ $(error fortran compiler >>${F95}<< not recognised. Edit lib/quip/Makefile.lammp endif quip_SYSPATH = -L${QUIP_ROOT}/build/${QUIP_ARCH} + diff --git a/lib/quip/README b/lib/quip/README index 94039cfa17..e6cc3903bd 100644 --- a/lib/quip/README +++ b/lib/quip/README @@ -17,7 +17,7 @@ Building LAMMPS with QUIP support: 1) Building QUIP 1.1) Obtaining QUIP -The most current release of QUIP can be obtained from github: +The most current release of QUIP can be obtained from github: $ git clone https://github.com/libAtoms/QUIP.git QUIP @@ -59,7 +59,7 @@ necessary libraries will be built. for example: $ cd QUIP -$ export QUIP_ROOT=/path/to/QUIP +$ export QUIP_ROOT=${PWD} $ export QUIP_ARCH=linux_x86_64_gfortran $ make config $ make libquip @@ -70,21 +70,32 @@ to run a test suite. 2) Building LAMMPS -LAMMPS is now shipped with the interface necessary to use QUIP potentials, but -it should be enabled first. Enter the LAMMPS directory: +Edit Makefile.lammps in the lib/quip folder, if necessary. If you +have cloned, configured, and built QUIP inside this folder, QUIP_ROOT +and QUIP_ARCH should be autodetected, even without having to set +the environment variables. Otherwise export the environment variables +as shown above or edit Makefile.lammps + +LAMMPS ships with a user package containing the interface necessary +to use QUIP potentials, but it needs to be added to the compilation +first. To do that, enter the LAMMPS source directory and type: -$ cd LAMMPS -$ cd src $ make yes-user-quip 2.2) Build LAMMPS according to the instructions on the LAMMPS website. -3) There are two example sets in examples/USER/quip: +3) There are three example sets in examples/USER/quip: - a set of input files to compute the energy of an 8-atom cubic diamond cell of silicon with the Stillinger-Weber potential. Use this to benchmark that the interface is working correctly. +- a set of input files demonstrating the use of the QUIP pair style + for a molecular system with pair style hybrid/overlay and different + exclusion settings for different pair styles. This input is + for DEMONSTRATION purposes only, and does not simulate a physically + meaningful system. + - a set of input files to demonstrate how GAP potentials are specified in a LAMMPS input file to run a short MD. The GAP parameter file gap_example.xml is intended for TESTING purposes only. Potentials can be diff --git a/lib/reax/Install.py b/lib/reax/Install.py index 37041d2ea1..ffe709d44c 120000 --- a/lib/reax/Install.py +++ b/lib/reax/Install.py @@ -1 +1 @@ -Install.py \ No newline at end of file +../Install.py \ No newline at end of file diff --git a/lib/reax/Makefile.gfortran b/lib/reax/Makefile.gfortran index b2b16fcc57..ab42301688 100644 --- a/lib/reax/Makefile.gfortran +++ b/lib/reax/Makefile.gfortran @@ -28,7 +28,7 @@ OBJ = $(SRC:.F=.o) # ------ SETTINGS ------ F90 = gfortran -F90FLAGS = -O -fPIC -fno-second-underscore +F90FLAGS = -O3 -fPIC -fno-second-underscore ARCHIVE = ar ARCHFLAG = -rc USRLIB = diff --git a/lib/reax/Makefile.lammps.empty b/lib/reax/Makefile.lammps.empty new file mode 100644 index 0000000000..758755f3c8 --- /dev/null +++ b/lib/reax/Makefile.lammps.empty @@ -0,0 +1,5 @@ +# Settings that the LAMMPS build will import when this package library is used + +reax_SYSINC = +reax_SYSLIB = +reax_SYSPATH = diff --git a/lib/reax/Makefile.mpi b/lib/reax/Makefile.mpi new file mode 100644 index 0000000000..142f7e9bc6 --- /dev/null +++ b/lib/reax/Makefile.mpi @@ -0,0 +1,51 @@ +# * +# *_________________________________________________________________________* +# * Fortran Library for Reactive Force Field * +# * DESCRIPTION: SEE READ-ME * +# * FILE NAME: Makefile * +# * CONTRIBUTING AUTHORS: Hansohl Cho(MIT), Aidan Thompson(SNL) * +# * and Greg Wagner(SNL) * +# * CONTACT: hansohl@mit.edu, athompson@sandia.gov, gjwagne@sandia.gov * +# *_________________________________________________________________________*/ + +SHELL = /bin/sh + +# which file will be copied to Makefile.lammps + +EXTRAMAKE = Makefile.lammps.empty + +# ------ FILES ------ + +SRC = reax_connect.F reax_inout.F reax_lammps.F reax_poten.F reax_reac.F reax_charges.F + +HEADERFILES = reax_defs.h *.blk + +# ------ DEFINITIONS ------ + +LIB = libreax.a +OBJ = $(SRC:.F=.o) + +# ------ SETTINGS ------ + +F90 = mpifort +F90FLAGS = -O3 -fPIC +ARCHIVE = ar +ARCHFLAG = -rc +USRLIB = +SYSLIB = + +# ------ MAKE PROCEDURE ------ + +lib: $(OBJ) + $(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ) + @cp $(EXTRAMAKE) Makefile.lammps + +# ------ COMPILE RULES ------ + +%.o:%.F $(HEADERFILES) + $(F90) $(F90FLAGS) -c $< + +# ------ CLEAN ------ + +clean: + -rm *.o $(LIB) diff --git a/lib/reax/Makefile.serial b/lib/reax/Makefile.serial new file mode 120000 index 0000000000..c52fbcb986 --- /dev/null +++ b/lib/reax/Makefile.serial @@ -0,0 +1 @@ +Makefile.gfortran \ No newline at end of file diff --git a/lib/reax/reax_charges.F b/lib/reax/reax_charges.F index 5a884d82c6..5815501a29 100644 --- a/lib/reax/reax_charges.F +++ b/lib/reax/reax_charges.F @@ -78,7 +78,7 @@ c$$$ end if SWC3= 140.0D0*(SWA3*SWB+3.0D0*SWA2*SWB2+SWA*SWB3)/D7 SWC2=-210.0D0*(SWA3*SWB2+SWA2*SWB3)/D7 SWC1= 140.0D0*SWA3*SWB3/D7 - SWC0=(-35.0D0*SWA3*SWB2*SWB2+21.0D0*SWA2*SWB3*SWB2+ + SWC0=(-35.0D0*SWA3*SWB2*SWB2+21.0D0*SWA2*SWB3*SWB2- $7.0D0*SWA*SWB3*SWB3+SWB3*SWB3*SWB)/D7 return diff --git a/lib/smd/.gitignore b/lib/smd/.gitignore new file mode 100644 index 0000000000..4ab7a789ec --- /dev/null +++ b/lib/smd/.gitignore @@ -0,0 +1,5 @@ +# ignore these entries with git +/eigen.tar.gz +/eigen-eigen-* +/includelink +/eigen3 diff --git a/lib/smd/Install.py b/lib/smd/Install.py index dc0a3187ce..9247cb449b 100644 --- a/lib/smd/Install.py +++ b/lib/smd/Install.py @@ -3,42 +3,90 @@ # Install.py tool to download, unpack, and point to the Eigen library # used to automate the steps described in the README file in this dir -import sys,os,re,glob,commands +from __future__ import print_function +import sys,os,re,glob,subprocess # help message help = """ -Syntax: python Install.py -h hpath hdir -g -l - specify one or more options, order does not matter - -h = set home dir of Eigen to be hpath/hdir - hpath can be full path, contain '~' or '.' chars - default hpath = . = lib/smd - default hdir = "ee" = what tarball unpacks to (eigen-eigen-*) - -g = grab (download) tarball from http://eigen.tuxfamily.org website - unpack it to hpath/hdir - hpath must already exist - if hdir already exists, it will be deleted before unpack - -l = create softlink (includelink) in lib/smd to Eigen src dir +Syntax from src dir: make lib-smd args="-b" + or: make lib-smd args="-p /usr/include/eigen3" + +Syntax from lib dir: python Install.py -b + or: python Install.py -p /usr/include/eigen3" + or: python Install.py -v 3.3.4 -b + +specify one or more options, order does not matter + + -b = download and unpack/configure the Eigen library + -p = specify folder holding an existing installation of Eigen + -v = set version of Eigen library to download and set up (default = 3.3.4) + + +Example: + +make lib-smd args="-b" # download/build in default lib/smd/eigen-eigen-* +make lib-smd args="-p /usr/include/eigen3" # use existing Eigen installation in /usr/include/eigen3 """ # settings -url = "http://bitbucket.org/eigen/eigen/get/3.3.3.tar.gz" +version = '3.3.4' tarball = "eigen.tar.gz" # print error message or help def error(str=None): - if not str: print help - else: print "ERROR",str + if not str: print(help) + else: print("ERROR",str) sys.exit() # expand to full path name # process leading '~' or relative path - + def fullpath(path): return os.path.abspath(os.path.expanduser(path)) - + +def which(program): + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + +def geturl(url,fname): + success = False + + if which('curl') != None: + cmd = 'curl -L -o "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling curl failed with: %s" % e.output.decode('UTF-8')) + + if not success and which('wget') != None: + cmd = 'wget -O "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling wget failed with: %s" % e.output.decode('UTF-8')) + + if not success: + error("Failed to download source code with 'curl' or 'wget'") + return + # parse args args = sys.argv[1:] @@ -46,58 +94,65 @@ nargs = len(args) if nargs == 0: error() homepath = "." -homedir = "ee" +homedir = "eigen3" -grabflag = 0 -linkflag = 0 +buildflag = False +pathflag = False +linkflag = True iarg = 0 while iarg < nargs: - if args[iarg] == "-h": - if iarg+3 > nargs: error() - homepath = args[iarg+1] - homedir = args[iarg+2] - iarg += 3 - elif args[iarg] == "-g": - grabflag = 1 - iarg += 1 - elif args[iarg] == "-l": - linkflag = 1 + if args[iarg] == "-v": + if iarg+2 > nargs: error() + version = args[iarg+1] + iarg += 2 + elif args[iarg] == "-p": + if iarg+2 > nargs: error() + eigenpath = fullpath(args[iarg+1]) + pathflag = True + iarg += 2 + elif args[iarg] == "-b": + buildflag = True iarg += 1 else: error() homepath = fullpath(homepath) -if not os.path.isdir(homepath): error("Eigen path does not exist") + +if (pathflag): + if not os.path.isdir(eigenpath): error("Eigen path does not exist") + +if (buildflag and pathflag): + error("Cannot use -b and -p flag at the same time") + +if (not buildflag and not pathflag): + error("Have to use either -b or -p flag") # download and unpack Eigen tarball -# glob to find name of dir it unpacks to +# use glob to find name of dir it unpacks to -if grabflag: - print "Downloading Eigen ..." - cmd = "curl -L %s > %s/%s" % (url,homepath,tarball) - print cmd - print commands.getoutput(cmd) +if buildflag: + print("Downloading Eigen ...") + url = "http://bitbucket.org/eigen/eigen/get/%s.tar.gz" % version + geturl(url,"%s/%s" % (homepath,tarball)) - print "Unpacking Eigen tarball ..." + print("Unpacking Eigen tarball ...") edir = glob.glob("%s/eigen-eigen-*" % homepath) for one in edir: - if os.path.isdir(one): commands.getoutput("rm -rf %s" % one) - cmd = "cd %s; tar zxvf %s" % (homepath,tarball) - commands.getoutput(cmd) - if homedir != "ee": - if os.path.exists(homedir): commands.getoutput("rm -rf %s" % homedir) - edir = glob.glob("%s/eigen-eigen-*" % homepath) - os.rename(edir[0],"%s/%s" % (homepath,homedir)) + if os.path.isdir(one): + subprocess.check_output('rm -rf "%s"' % one,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s"; tar -xzvf %s' % (homepath,tarball) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + edir = glob.glob("%s/eigen-eigen-*" % homepath) + os.rename(edir[0],"%s/%s" % (homepath,homedir)) + os.remove(tarball) # create link in lib/smd to Eigen src dir if linkflag: - print "Creating link to Eigen files" + print("Creating link to Eigen files") if os.path.isfile("includelink") or os.path.islink("includelink"): os.remove("includelink") - if homedir == "ee": - edir = glob.glob("%s/eigen-eigen-*" % homepath) - linkdir = edir[0] + if pathflag: linkdir = eigenpath else: linkdir = "%s/%s" % (homepath,homedir) - cmd = "ln -s %s includelink" % linkdir - commands.getoutput(cmd) + cmd = 'ln -s "%s" includelink' % linkdir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) diff --git a/lib/smd/Makefile.lammps b/lib/smd/Makefile.lammps index 7bbf3924ef..6951a1394c 100644 --- a/lib/smd/Makefile.lammps +++ b/lib/smd/Makefile.lammps @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -user-smd_SYSINC = +user-smd_SYSINC = -I../../lib/includelink/eigen3 user-smd_SYSLIB = user-smd_SYSPATH = diff --git a/lib/voronoi/.gitignore b/lib/voronoi/.gitignore new file mode 100644 index 0000000000..6ca01c094f --- /dev/null +++ b/lib/voronoi/.gitignore @@ -0,0 +1,4 @@ +# files to ignore +/liblink +/includelink +/voro++-* diff --git a/lib/voronoi/Install.py b/lib/voronoi/Install.py index 7d847183b3..f40eb53bc6 100644 --- a/lib/voronoi/Install.py +++ b/lib/voronoi/Install.py @@ -3,25 +3,29 @@ # Install.py tool to download, unpack, build, and link to the Voro++ library # used to automate the steps described in the README file in this dir -import sys,os,re,urllib,commands +from __future__ import print_function +import sys,os,re,subprocess # help message help = """ -Syntax: python Install.py -v version -h hpath hdir -g -b -l - specify one or more options, order does not matter - -v = version of Voro++ to download and build - default version = voro++-0.4.6 (current as of Jan 2015) - -h = set home dir of Voro++ to be hpath/hdir - hpath can be full path, contain '~' or '.' chars - default hpath = . = lib/voronoi - default hdir = voro++-0.4.6 = what tarball unpacks to - -g = grab (download) tarball from math.lbl.gov/voro++ website - unpack it to hpath/hdir - hpath must already exist - if hdir already exists, it will be deleted before unpack - -b = build Voro++ library in its src dir - -l = create 2 softlinks (includelink,liblink) in lib/voronoi to Voro++ src dir +Syntax from src dir: make lib-voronoi args="-b" + or: make lib-voronoi args="-p /usr/local/voro++-0.4.6" + or: make lib-voronoi args="-b -v voro++-0.4.6" +Syntax from lib dir: python Install.py -b -v voro++-0.4.6 + or: python Install.py -b + or: python Install.py -p /usr/local/voro++-0.4.6 + +specify one or more options, order does not matter + + -b = download and build the Voro++ library + -p = specify folder of existing Voro++ installation + -v = set version of Voro++ to download and build (default voro++-0.4.6) + +Example: + +make lib-voronoi args="-b" # download/build in lib/voronoi/voro++-0.4.6 +make lib-voronoi args="-p $HOME/voro++-0.4.6" # use existing Voro++ installation in $HOME/voro++-0.4.6 """ # settings @@ -32,16 +36,56 @@ url = "http://math.lbl.gov/voro++/download/dir/%s.tar.gz" % version # print error message or help def error(str=None): - if not str: print help - else: print "ERROR",str + if not str: print(help) + else: print("ERROR",str) sys.exit() # expand to full path name # process leading '~' or relative path - + def fullpath(path): return os.path.abspath(os.path.expanduser(path)) - + +def which(program): + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + +def geturl(url,fname): + success = False + + if which('curl') != None: + cmd = 'curl -L -o "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling curl failed with: %s" % e.output.decode('UTF-8')) + + if not success and which('wget') != None: + cmd = 'wget -O "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling wget failed with: %s" % e.output.decode('UTF-8')) + + if not success: + error("Failed to download source code with 'curl' or 'wget'") + return + # parse args args = sys.argv[1:] @@ -51,9 +95,9 @@ if nargs == 0: error() homepath = "." homedir = version -grabflag = 0 -buildflag = 0 -linkflag = 0 +buildflag = False +pathflag = False +linkflag = True iarg = 0 while iarg < nargs: @@ -61,58 +105,65 @@ while iarg < nargs: if iarg+2 > nargs: error() version = args[iarg+1] iarg += 2 - elif args[iarg] == "-h": - if iarg+3 > nargs: error() - homepath = args[iarg+1] - homedir = args[iarg+2] - iarg += 3 - elif args[iarg] == "-g": - grabflag = 1 - iarg += 1 + elif args[iarg] == "-p": + if iarg+2 > nargs: error() + voropath = fullpath(args[iarg+1]) + pathflag = True + iarg += 2 elif args[iarg] == "-b": - buildflag = 1 - iarg += 1 - elif args[iarg] == "-l": - linkflag = 1 + buildflag = True iarg += 1 else: error() homepath = fullpath(homepath) -if not os.path.isdir(homepath): error("Voro++ path does not exist") -homedir = "%s/%s" % (homepath,homedir) +homedir = "%s/%s" % (homepath,version) + +if (pathflag): + if not os.path.isdir(voropath): error("Voro++ path does not exist") + homedir = voropath + +if (buildflag and pathflag): + error("Cannot use -b and -p flag at the same time") + +if (not buildflag and not pathflag): + error("Have to use either -b or -p flag") # download and unpack Voro++ tarball -if grabflag: - print "Downloading Voro++ ..." - urllib.urlretrieve(url,"%s/%s.tar.gz" % (homepath,version)) - - print "Unpacking Voro++ tarball ..." +if buildflag: + print("Downloading Voro++ ...") + geturl(url,"%s/%s.tar.gz" % (homepath,version)) + + print("Unpacking Voro++ tarball ...") if os.path.exists("%s/%s" % (homepath,version)): - commands.getoutput("rm -rf %s/%s" % (homepath,version)) - cmd = "cd %s; tar zxvf %s.tar.gz" % (homepath,version) - commands.getoutput(cmd) + cmd = 'rm -rf "%s/%s"' % (homepath,version) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s"; tar -xzvf %s.tar.gz' % (homepath,version) + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + os.remove("%s/%s.tar.gz" % (homepath,version)) if os.path.basename(homedir) != version: - if os.path.exists(homedir): commands.getoutput("rm -rf %s" % homedir) + if os.path.exists(homedir): + cmd = 'rm -rf "%s"' % homedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) os.rename("%s/%s" % (homepath,version),homedir) # build Voro++ if buildflag: - print "Building Voro++ ..." - cmd = "cd %s; make" % homedir - txt = commands.getoutput(cmd) - print txt + print("Building Voro++ ...") + cmd = 'cd "%s"; make CXX=g++ CFLAGS="-fPIC -O3"' % homedir + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + print(txt.decode('UTF-8')) # create 2 links in lib/voronoi to Voro++ src dir if linkflag: - print "Creating links to Voro++ include and lib files" + print("Creating links to Voro++ include and lib files") if os.path.isfile("includelink") or os.path.islink("includelink"): os.remove("includelink") if os.path.isfile("liblink") or os.path.islink("liblink"): os.remove("liblink") - cmd = "ln -s %s/src includelink" % homedir - commands.getoutput(cmd) - cmd = "ln -s %s/src liblink" % homedir - commands.getoutput(cmd) + cmd = 'ln -s "%s/src" includelink' % homedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'ln -s "%s/src" liblink' % homedir + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) diff --git a/lib/voronoi/README b/lib/voronoi/README index 9863632be0..9c20eff813 100644 --- a/lib/voronoi/README +++ b/lib/voronoi/README @@ -21,8 +21,8 @@ Instructions: tarball either in this /lib/voronoi directory or somewhere else on your system. -2. compile Voro++ from within its home directory - % make +2. Compile Voro++ from within its home directory + % make 3. There is no need to install Voro++ if you only wish to use it from LAMMPS. You can install it if you diff --git a/potentials/BN.extep b/potentials/BN.extep new file mode 100644 index 0000000000..8732ada84b --- /dev/null +++ b/potentials/BN.extep @@ -0,0 +1,109 @@ +# DATE: 2017-11-28 CONTRIBUTOR: J.H. Los, J.M.H. Kroes CITATION: Los et al. Phys. Rev. B 96, 184108 (2017) + +# B and N mixture, parameterized for ExTeP potential + +# ExTeP parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: +# A,B = eV; lambda1,lambda2,lambda3 = 1/Angstroms; R,D = Angstroms +# other quantities are unitless + +# format of a single entry (one or more lines): +#I J K m, gamma*, lambda3, c, d, h, n, gamma, lambda2, B, R, D, lambda1, A +B B B 3 1.0 0.0 26617.3000 141.2000 -0.1300 1.1422470 0.01498959 2.5211820 2768.7363631 2.0 0.2 2.6857244 3376.3350735 +N N N 3 1.0 0.0 23.5000 3.7500 -0.4000 0.6650000 0.01925100 2.6272721 2563.5603417 2.0 0.2 2.8293093 2978.9527928 +B B N 3 1.0 0.0 26617.3000 141.2000 -0.1300 1.1422470 0.01498959 2.5211820 2768.7363631 2.0 0.2 2.6857244 3376.3350735 +N N B 3 1.0 0.0 23.5000 3.7500 -0.4000 0.6650000 0.01925100 2.6272721 2563.5603417 2.0 0.2 2.8293093 2978.9527928 +B N B 3 1.0 0.0d0 306.586555205d0 10.d0 -0.7218d0 0.6576543657d0 0.0027024851d0 2.69335d0 2595.6860833266d0 2.d0 0.2d0 2.95d0 3330.0655849887d0 +B N N 3 1.0 0.0d0 306.586555205d0 10.d0 -0.7218d0 0.6576543657d0 0.0027024851d0 2.69335d0 2595.6860833266d0 2.d0 0.2d0 2.95d0 3330.0655849887d0 +N B B 3 1.0 0.0d0 306.586555205d0 10.d0 -0.7218d0 0.6576543657d0 0.0027024851d0 2.69335d0 2595.6860833266d0 2.d0 0.2d0 2.95d0 3330.0655849887d0 +N B N 3 1.0 0.0d0 306.586555205d0 10.d0 -0.7218d0 0.6576543657d0 0.0027024851d0 2.69335d0 2595.6860833266d0 2.d0 0.2d0 2.95d0 3330.0655849887d0 +# +# 1.9925 Bicubic Splines Parameters +# +# F_corr [ B, B] +# +#t1 t2 i j val dx dy dxy + B B 0 0 0.0000 0.0000 0.0000 0.0000 + B B 0 1 0.0054 0.0000 0.0000 0.0000 + B B 0 2 0.0182 0.0000 0.0000 0.0000 + B B 0 3 -0.0034 0.0000 0.0000 0.0000 + B B 0 4 -0.0034 0.0000 0.0000 0.0000 + B B 1 0 0.0054 0.0000 0.0000 0.0000 + B B 1 1 0.0100 0.0000 0.0000 0.0000 + B B 1 2 0.0062 0.0000 0.0000 0.0000 + B B 1 3 0.0154 0.0000 0.0000 0.0000 + B B 1 4 0.0154 0.0000 0.0000 0.0000 + B B 2 0 0.0182 0.0000 0.0000 0.0000 + B B 2 1 0.0062 0.0000 0.0000 0.0000 + B B 2 2 0.0154 0.0000 0.0000 0.0000 + B B 2 3 -0.0390 0.0000 -0.0727 0.0000 + B B 2 4 -0.0390 0.0000 -0.0727 0.0000 + B B 3 0 -0.0034 0.0000 0.0000 0.0000 + B B 3 1 0.0154 0.0000 0.0000 0.0000 + B B 3 2 -0.0390 -0.0727 0.0000 0.0000 + B B 3 3 -0.1300 0.0000 0.0000 0.0000 + B B 3 4 -0.1300 0.0000 0.0000 0.0000 + B B 4 0 -0.0034 0.0000 0.0000 0.0000 + B B 4 1 0.0154 0.0000 0.0000 0.0000 + B B 4 2 -0.0390 -0.0727 0.0000 0.0000 + B B 4 3 -0.1300 0.0000 0.0000 0.0000 + B B 4 4 -0.1300 0.0000 0.0000 0.0000 +# +# F_corr [ B, N] +# +#t1 t2 i j val dx dy dxy + B N 0 0 0.0170 0.0000 0.0000 0.0000 + B N 0 1 0.0078 0.0000 0.0000 0.0000 + B N 0 2 0.0000 0.0000 0.0000 0.0000 + B N 0 3 -0.0860 0.0000 0.0000 0.0000 + B N 0 4 -0.0860 0.0000 0.0000 0.0000 + B N 1 0 -0.0090 0.0000 0.0000 0.0000 + B N 1 1 0.0090 0.0000 0.0000 0.0000 + B N 1 2 -0.0068 0.0000 -0.0214 0.0000 + B N 1 3 -0.0338 0.0000 0.0388 0.0000 + B N 1 4 -0.0338 0.0000 0.0388 0.0000 + B N 2 0 0.0000 0.0000 0.0000 0.0000 + B N 2 1 -0.0198 0.0000 0.0000 0.0000 + B N 2 2 0.0000 0.0000 0.0000 0.0000 + B N 2 3 -0.0084 0.0000 0.0169 0.0000 + B N 2 4 -0.0084 0.0000 0.0169 0.0000 + B N 3 0 -0.0750 0.0000 0.0000 0.0000 + B N 3 1 -0.0168 0.0306 0.0000 0.0000 + B N 3 2 -0.0138 0.0084 0.0000 0.0000 + B N 3 3 0.0000 0.0000 0.0000 0.0000 + B N 3 4 0.0000 0.0000 0.0000 0.0000 + B N 4 0 -0.0750 0.0000 0.0000 0.0000 + B N 4 1 -0.0168 0.0306 0.0000 0.0000 + B N 4 2 -0.0138 0.0084 0.0000 0.0000 + B N 4 3 0.0000 0.0000 0.0000 0.0000 + B N 4 4 0.0000 0.0000 0.0000 0.0000 +# +# F_corr [ N, N] +# +#t1 t2 i j val dx dy dxy + N N 0 0 0.0000 0.0000 0.0000 0.0000 + N N 0 1 -0.0282 0.0000 0.0000 0.0000 + N N 0 2 -0.0018 0.0000 0.0000 0.0000 + N N 0 3 -0.0004 0.0000 0.0000 0.0000 + N N 0 4 -0.0004 0.0000 0.0000 0.0000 + N N 1 0 -0.0282 0.0000 0.0000 0.0000 + N N 1 1 0.0200 0.0000 0.0000 0.0000 + N N 1 2 0.0180 0.0162 -0.0027 0.0000 + N N 1 3 0.0146 0.0000 0.0000 0.0000 + N N 1 4 0.0146 0.0000 0.0000 0.0000 + N N 2 0 -0.0018 0.0000 0.0000 0.0000 + N N 2 1 0.0180 -0.0027 0.0162 0.0000 + N N 2 2 0.0306 0.0000 0.0000 0.0000 + N N 2 3 0.0060 0.0000 -0.0073 0.0000 + N N 2 4 0.0060 0.0000 -0.0073 0.0000 + N N 3 0 -0.0004 0.0000 0.0000 0.0000 + N N 3 1 0.0146 0.0000 0.0000 0.0000 + N N 3 2 0.0060 -0.0073 0.0000 0.0000 + N N 3 3 0.0000 0.0000 0.0000 0.0000 + N N 3 4 0.0000 0.0000 0.0000 0.0000 + N N 4 0 -0.0004 0.0000 0.0000 0.0000 + N N 4 1 0.0146 0.0000 0.0000 0.0000 + N N 4 2 0.0060 -0.0073 0.0000 0.0000 + N N 4 3 0.0000 0.0000 0.0000 0.0000 + N N 4 4 0.0000 0.0000 0.0000 0.0000 diff --git a/potentials/Mo_Chen_PRM2017.snap b/potentials/Mo_Chen_PRM2017.snap new file mode 100644 index 0000000000..579315b3dd --- /dev/null +++ b/potentials/Mo_Chen_PRM2017.snap @@ -0,0 +1,6 @@ +# DATE: 2017-09-18 CONTRIBUTOR: Chi Chen CITATION: C. Chen, Z. Deng, R. Tran, H. Tang, I.-H. Chu, S. P. Ong, "Accurate force field for molybdenum by machine learning large materials data" Physical Review Materials 1, 04 3603 (2017) +# Generated by Materials Virtual Lab +# Definition of SNAP potential. +pair_style snap +pair_coeff * * Mo_Chen_PRM2017.snapcoeff Mo Mo_Chen_PRM2017.snapparam Mo + diff --git a/potentials/Mo_Chen_PRM2017.snapcoeff b/potentials/Mo_Chen_PRM2017.snapcoeff new file mode 100644 index 0000000000..577c45bd76 --- /dev/null +++ b/potentials/Mo_Chen_PRM2017.snapcoeff @@ -0,0 +1,35 @@ +# DATE: 2017-09-18 CONTRIBUTOR: Chi Chen CITATION: C. Chen, Z. Deng, R. Tran, H. Tang, I.-H. Chu, S. P. Ong, "Accurate force field for molybdenum by machine learning large materials data" Physical Review Materials 1, 04 3603 (2017) +# Generated by Materials Virtual Lab +1 31 +Mo 0.5 1 +-17.2757958404 +0.00431015861472 +0.0657685117891 +0.477733335702 +0.0152688837211 +0.77559888196 +0.284846429566 +0.148804982644 +0.0573702179736 +0.19281989434 +0.323441703578 +0.101324335724 +0.0139639846514 +-0.0324444749083 +0.0349797952779 +0.0613023441282 +0.0881078513046 +0.118716074611 +0.0069662975532 +-0.0174658914685 +-0.0178902177779 +0.0195993756659 +0.0719238160707 +0.0344832661036 +-0.0358616891662 +-0.0292380783172 +-0.0334933909866 +0.00595462520243 +0.0754556638328 +-0.000972545258845 +-0.0100170422751 diff --git a/potentials/Mo_Chen_PRM2017.snapparam b/potentials/Mo_Chen_PRM2017.snapparam new file mode 100644 index 0000000000..e618bc1dd4 --- /dev/null +++ b/potentials/Mo_Chen_PRM2017.snapparam @@ -0,0 +1,4 @@ +# DATE: 2017-09-18 CONTRIBUTOR: Chi Chen CITATION: C. Chen, Z. Deng, R. Tran, H. Tang, I.-H. Chu, S. P. Ong, "Accurate force field for molybdenum by machine learning large materials data" Physical Review Materials 1, 04 3603 (2017) +# Generated by Materials Virtual Lab +rcutfac 4.615858 +twojmax 6 diff --git a/potentials/Ta06A.snap b/potentials/Ta06A.snap index edcc002524..43ce31fdcc 100644 --- a/potentials/Ta06A.snap +++ b/potentials/Ta06A.snap @@ -2,7 +2,7 @@ # Definition of SNAP potential Ta_Cand06A # Assumes 1 LAMMPS atom type - + variable zblcutinner equal 4 variable zblcutouter equal 4.8 variable zblz equal 73 diff --git a/potentials/W_2940_2017_2_He_JW2013.snap b/potentials/W_2940_2017_2_He_JW2013.snap index 45a31955b3..ff0827c138 100644 --- a/potentials/W_2940_2017_2_He_JW2013.snap +++ b/potentials/W_2940_2017_2_He_JW2013.snap @@ -8,8 +8,8 @@ variable zblz equal 74 # Specify hybrid with SNAP, ZBL, and long-range Coulomb pair_style hybrid/overlay zbl ${zblcutinner} ${zblcutouter} snap table spline 10000 table spline 10000 -pair_coeff 1 1 zbl ${zblz} ${zblz} -pair_coeff * * snap W_2940_2017_2.snapcoeff W W_2940_2017_2.snapparam W NULL +pair_coeff 1 1 zbl ${zblz} ${zblz} +pair_coeff * * snap W_2940_2017_2.snapcoeff W W_2940_2017_2.snapparam W NULL pair_coeff 2 2 table 1 He_He_JW2013.table HeHe pair_coeff 1 2 table 2 W_He_JW2013.table WHe #Hybrid/overlay will take all pair styles and add their contributions equally, order of pair_coeff doesnt matter here diff --git a/potentials/ci-reaxFF_ZBL.dat b/potentials/ci-reaxFF_ZBL.dat new file mode 100644 index 0000000000..27dcb26353 --- /dev/null +++ b/potentials/ci-reaxFF_ZBL.dat @@ -0,0 +1,27016 @@ +#DATE: 2017-11-20 CONTRIBUTOR: Michal Kanski michal.kanski@uj.edu.pl CITATION: Michal Kanski, Dawid Maciazek, Zbigniew Postawa, Adri C.T. van Duin, Chowdhury Ashraf, and Barbara J. Garrison Development of a Charge-Implicit ReaxFF Potential for Hydrocarbon Systems, J. Phys. Chem. Lett., 2018, 9, pp 359–363 DOI: 10.1021/acs.jpclett.7b03155 +#Correcting potential for cireaxFF CC + +CC_cireaxFF +N 10000 R 0.0001 1.0 + +1 0.0001 136733542.9751030206680298 1195428517883.147460937500 +2 0.0002 62019291.9954997226595879 298856501708.918518066406 +3 0.0003 40435234.5333681330084801 132824647533.713272094727 +4 0.0004 30058327.2013075463473797 74713499107.498413085938 +5 0.0005 23931835.2749199047684669 47816339420.254402160645 +6 0.0006 19880741.4538086317479610 33205537001.971019744873 +7 0.0007 17000680.3891085945069790 24395684292.029701232910 +8 0.0008 14847008.6080189552158117 18677751329.763092041016 +9 0.0009 13175243.2629336398094893 14757555571.943220138550 +10 0.0010 11839692.3424190990626812 11953462838.347606658936 +11 0.0011 10748081.6230340171605349 9878751549.354024887085 +12 0.0012 9839105.8625555727630854 8300763660.214876174927 +13 0.0013 9070431.7690561469644308 7072718209.773627281189 +14 0.0014 8411880.7633069269359112 6098301905.210776329041 +15 0.0015 7841356.0325410198420286 5312192710.107365608215 +16 0.0016 7342305.3928770115599036 4668820083.172800064087 +17 0.0017 6902083.9522572997957468 4135608729.221432685852 +18 0.0018 6510864.8878811988979578 3688772558.300591945648 +19 0.0019 6160895.4975742120295763 3310615247.839136600494 +20 0.0020 5845977.1959049208089709 2987750785.546697139740 +21 0.0021 5561094.5383900227025151 2709902364.751267433167 +22 0.0022 5302145.7016517221927643 2469074370.014742851257 +23 0.0023 5065743.4504847163334489 2258970653.325372219086 +24 0.0024 4849065.9777920646592975 2074578800.527655124664 +25 0.0025 4649743.6185463266447186 1911868384.387100934982 +26 0.0026 4465771.7574866404756904 1767568836.806629180908 +27 0.0027 4295443.1253810226917267 1639003805.305733680725 +28 0.0028 4137294.6273328629322350 1523966155.657470941544 +29 0.0029 3990065.1890978142619133 1420622609.043505668640 +30 0.0030 3852662.0462463209405541 1327440247.986360788345 +31 0.0031 3724133.5667513096705079 1243129341.913863420486 +32 0.0032 3603647.1757315262220800 1166598478.481804847717 +33 0.0033 3490471.2985971784219146 1096919064.205148696899 +34 0.0034 3383960.4942189888097346 1033297023.358639001846 +35 0.0035 3283543.1393463956192136 975050074.093221902847 +36 0.0036 3188711.1676347297616303 921589360.140090346336 +37 0.0037 3099011.4741543838754296 872404509.466831564903 +38 0.0038 3014038.6782713006250560 827051408.194830298424 +39 0.0039 2933429.0008542295545340 785142140.146594524384 +40 0.0040 2856855.0606238106265664 746336664.461784839630 +41 0.0041 2784021.4325809990987182 710335896.394444227219 +42 0.0042 2714660.8413970507681370 676875927.284519672394 +43 0.0043 2648530.8863182244822383 645723174.292006373405 +44 0.0044 2585411.2129628695547581 616670292.815091490746 +45 0.0045 2525101.0624447474256158 589532717.547348499298 +46 0.0046 2467417.1403642711229622 564145724.062177419662 +47 0.0047 2412191.7579967323690653 540361923.288598895073 +48 0.0048 2359271.2059573763981462 518049117.498517572880 +49 0.0049 2308514.3271125094033778 497088459.398825407028 +50 0.0050 2259791.2608262123540044 477372866.327112913132 +51 0.0051 2212982.3350130864419043 458805649.935401201248 +52 0.0052 2167977.0860895505174994 441299328.535312891006 +53 0.0053 2124673.3899228563532233 424774594.798573791981 +54 0.0054 2082976.6893821978010237 409159416.014601945877 +55 0.0055 2042799.3061913230922073 394388247.802890300751 +56 0.0056 2004059.8265401863027364 380401345.219845533371 +57 0.0057 1966682.5513935508206487 367144157.712863326073 +58 0.0058 1930597.0036850054748356 354566796.458043813705 +59 0.0059 1895737.4856445277109742 342623564.351513803005 +60 0.0060 1862042.6804083823226392 331272540.371394515038 +61 0.0061 1829455.2928278464823961 320475211.239321410656 +62 0.0062 1797921.7250494603067636 310196144.328400433064 +63 0.0063 1767391.7830019276589155 300402696.622253715992 +64 0.0064 1737818.4104080882389098 291064755.254535496235 +65 0.0065 1709157.4473567360546440 282154505.772510051727 +66 0.0066 1681367.4108286083210260 273646224.790042877197 +67 0.0067 1654409.2948821100872010 265516094.139922231436 +68 0.0068 1628246.3884743598755449 257742034.015083491802 +69 0.0069 1602844.1091279410757124 250303552.913291782141 +70 0.0070 1578169.8508583344519138 243181612.478841125965 +71 0.0071 1554192.8449556564446539 236358505.574718356133 +72 0.0072 1530884.0323706436902285 229817746.125537037849 +73 0.0073 1508215.9465918538626283 223543969.450260490179 +74 0.0074 1486162.6060214177705348 217522841.958459645510 +75 0.0075 1464699.4149625913705677 211740979.218068152666 +76 0.0076 1443803.0724257221445441 206185871.519318282604 +77 0.0077 1423451.4880416989326477 200845816.161146849394 +78 0.0078 1403623.7044448878150433 195709855.775073289871 +79 0.0079 1384299.8255521801766008 190767722.079080611467 +80 0.0080 1365460.9502221292350441 186009784.521940171719 +81 0.0081 1347089.1108291330747306 181427003.337982028723 +82 0.0082 1329167.2163329988252372 177010886.584700584412 +83 0.0083 1311678.9994646823033690 172753450.781627774239 +84 0.0084 1294608.9676851218100637 168647184.809579849243 +85 0.0085 1277942.3576063807122409 164685016.765241563320 +86 0.0086 1261665.0925932293757796 160860283.497783064842 +87 0.0087 1245763.7432892236392945 157166702.582330852747 +88 0.0088 1230225.4908346056472510 153598346.510029822588 +89 0.0089 1215038.0925642750225961 150149618.896581172943 +90 0.0090 1200189.8499929031822830 146815232.530853450298 +91 0.0091 1185669.5789112260099500 143590189.102691560984 +92 0.0092 1171466.5814328556880355 140469760.464712649584 +93 0.0093 1157570.6198447772767395 137449471.296856224537 +94 0.0094 1143971.8921271876897663 134525083.054936051369 +95 0.0095 1130661.0090196582023054 131692579.095653131604 +96 0.0096 1117628.9725208485033363 128948150.880538776517 +97 0.0097 1104867.1557183056138456 126288185.170320540667 +98 0.0098 1092367.2838533269241452 123709252.129252225161 +99 0.0099 1080121.4165335500147194 121208094.266286805272 +100 0.0100 1068121.9310129133518785 118781616.146445572376 +101 0.0101 1056361.5064650054555386 116426874.811711952090 +102 0.0102 1044833.1091816168045625 114141070.856061652303 +103 0.0103 1033529.9786336101824418 111921540.104070499539 +104 0.0104 1022445.6143360610585660 109765745.846911579370 +105 0.0105 1011573.7634640428004786 107671271.593453109264 +106 0.0106 1000908.4091694803209975 105635814.297796532512 +107 0.0107 990443.7595532018458471 103657178.027772441506 +108 0.0108 980174.2372497179312631 101733268.041906595230 +109 0.0109 970094.4695853726007044 99862085.244998902082 +110 0.0110 960199.2792733768001199 98041720.994917616248 +111 0.0111 950483.6756118608172983 96270352.235401079059 +112 0.0112 940942.8461535058449954 94546236.931697666645 +113 0.0113 931572.1488175365375355 92867709.787687748671 +114 0.0114 922367.1044169106753543 91233178.224828958511 +115 0.0115 913323.3895754297263920 89641118.604789152741 +116 0.0116 904436.8300112385768443 88090072.679034829140 +117 0.0117 895703.3941647907486185 86578644.249921590090 +118 0.0118 887119.1871508441399783 85105496.029011249542 +119 0.0119 878680.4450154229998589 83669346.679410919547 +120 0.0120 870383.5292799564776942 82268968.029918745160 +121 0.0121 862224.9217559773242101 80903182.449664056301 +122 0.0122 854201.2196148560615256 79570860.372761189938 +123 0.0123 846309.1306980550289154 78270917.963259682059 +124 0.0124 838545.4690543231554329 77002314.911377072334 +125 0.0125 830907.1506911220494658 75764052.352645143867 +126 0.0126 823391.1895283799385652 74555170.902198210359 +127 0.0127 815994.6935434212209657 73374748.796976760030 +128 0.0128 808714.8610966157866642 72221900.139131650329 +129 0.0129 801548.9774279404664412 71095773.234373733401 +130 0.0130 794494.4113152491627261 69995549.019452005625 +131 0.0131 787548.6118856098037213 68920439.573335886002 +132 0.0132 780709.1055715904803947 67869686.707049682736 +133 0.0133 773973.4932048657210544 66842560.627444788814 +134 0.0134 767339.4472399678779766 65838358.670513130724 +135 0.0135 760804.7091014353791252 64856404.100135907531 +136 0.0136 754367.0866480069234967 63896044.968432106078 +137 0.0137 748024.4517478790367022 62956653.034124605358 +138 0.0138 741774.7379593942314386 62037622.735570535064 +139 0.0139 735615.9383118494879454 61138370.215323373675 +140 0.0140 729546.1031814187299460 60258332.393290862441 +141 0.0141 723563.3382574670249596 59396966.085742965341 +142 0.0142 717665.8025948001304641 58553747.167594641447 +143 0.0143 711851.7067476428346708 57728169.775551363826 +144 0.0144 706119.3109813724877313 56919745.549856245518 +145 0.0145 700466.9235582539113238 56128002.912514261901 +146 0.0146 694892.8990936279296875 55352486.380004324019 +147 0.0147 689395.6369791973847896 54592755.908605583012 +148 0.0148 683973.5798702378524467 53848386.270585127175 +149 0.0149 678625.2122337290784344 53118966.459591180086 +150 0.0150 673349.0589545643888414 52404099.123703107238 +151 0.0151 668143.6839971455046907 51703400.024675302207 +152 0.0152 663007.6891198116354644 51016497.522002995014 +153 0.0153 657939.7126396857202053 50343032.080514550209 +154 0.0154 652938.4282456464134157 49682655.800272755325 +155 0.0155 648002.5438572508282959 49035031.967638544738 +156 0.0156 643130.8005275483010337 48399834.626412853599 +157 0.0157 638321.9713878256734461 47776748.168039754033 +158 0.0158 633574.8606324283173308 47165466.939906477928 +159 0.0159 628888.3025418913457543 46565694.870834015310 +160 0.0160 624261.1605427046306431 45977145.112900443375 +161 0.0161 619692.3263021201128140 45399539.698789633811 +162 0.0162 615180.7188564856769517 44832609.213898874819 +163 0.0163 610725.2837716664653271 44276092.482484482229 +164 0.0164 606324.9923341841204092 43729736.267163299024 +165 0.0165 601978.8407717697555199 43193294.981123179197 +166 0.0166 597685.8495020919945091 42666530.412432491779 +167 0.0167 593445.0624084768351167 42149211.459870830178 +168 0.0168 589255.5461414966266602 41641113.879733696580 +169 0.0169 585116.3894453552784398 41142020.043094031513 +170 0.0170 581026.7025080492021516 40651718.703028045595 +171 0.0171 576985.6163343306398019 40170004.771343305707 +172 0.0172 572992.2821405451977625 39696679.104365877807 +173 0.0173 569045.8707704583648592 39231548.297369919717 +174 0.0174 565145.5721312271198258 38774424.487254247069 +175 0.0175 561290.5946487099863589 38325125.163088224828 +176 0.0176 557480.1647413469618186 37883472.984172195196 +177 0.0177 553713.5263118747388944 37449295.605271562934 +178 0.0178 549989.9402561758179218 37022425.508706055582 +179 0.0179 546308.6839885913068429 36602699.842984899879 +180 0.0180 542669.0509830570081249 36189960.267701454461 +181 0.0181 539070.3503294514957815 35784052.804408960044 +182 0.0182 535511.9063045702641830 35384827.693216085434 +183 0.0183 531993.0579571668058634 34992139.254852578044 +184 0.0184 528513.1587065256899223 34605845.757969021797 +185 0.0185 525071.5759540550643578 34225809.291442871094 +186 0.0186 521667.6907074090559036 33851895.641478024423 +187 0.0187 518300.8972166705643758 33483974.173292048275 +188 0.0188 514970.6026221460779198 33121917.717197436839 +189 0.0189 511676.2266133416560479 32765602.458890669048 +190 0.0190 508417.2010987084941007 32414907.833772044629 +191 0.0191 505192.9698857634211890 32069716.425129342824 +192 0.0192 502002.9883712058071978 31729913.866022869945 +193 0.0193 498846.7232406685943715 31395388.744720906019 +194 0.0194 495723.6521777556627057 31066032.513537451625 +195 0.0195 492633.2635820320574567 30741739.400934405625 +196 0.0196 489575.0562956475769170 30422406.326755054295 +197 0.0197 486548.5393382867332548 30107932.820461794734 +198 0.0198 483553.2316501507884823 29798220.942257214338 +199 0.0199 480588.6618426893255673 29493175.206972211599 +200 0.0200 477654.3679568101069890 29192702.510612268001 +201 0.0201 474749.8972283067414537 28896712.059454869479 +202 0.0202 471874.8058602540986612 28605115.301597803831 +203 0.0203 469028.6588021310744807 28317825.860862147063 +204 0.0204 466211.0295354400877841 28034759.472957979888 +205 0.0205 463421.4998656010138802 27755833.923823870718 +206 0.0206 460659.6597199069801718 27480968.990057088435 +207 0.0207 457925.1069513364927843 27210086.381352901459 +208 0.0208 455217.4471480249776505 26943109.684876874089 +209 0.0209 452536.2934482063865289 26679964.311495050788 +210 0.0210 449881.2663604419794865 26420577.443793386221 +211 0.0211 447251.9935889615444466 26164877.985815625638 +212 0.0212 444648.1098639477859251 25912796.514459405094 +213 0.0213 442069.2567766016582027 25664265.232463356107 +214 0.0214 439515.0826188319479115 25419217.922930303961 +215 0.0215 436985.2422274191048928 25177589.905326664448 +216 0.0216 434479.3968325075693429 24939317.992904558778 +217 0.0217 431997.2139102875953540 24704340.451494581997 +218 0.0218 429538.3670397319365293 24472596.959618736058 +219 0.0219 427102.5357632572413422 24244028.569874707609 +220 0.0220 424689.4054511861759238 24018577.671546678990 +221 0.0221 422298.6671698889695108 23796187.954397317022 +222 0.0222 419930.0175534891313873 23576804.373599492013 +223 0.0223 417583.1586790208821185 23360373.115765564144 +224 0.0224 415257.7979449307895266 23146841.566036168486 +225 0.0225 412953.6479528194759041 22936158.276190649718 +226 0.0226 410670.4263923227554187 22728272.933743335307 +227 0.0227 408407.8559290361008607 22523136.331989940256 +228 0.0228 406165.6640953879687004 22320700.340972378850 +229 0.0229 403943.5831843729247339 22120917.879328645766 +230 0.0230 401741.3501460566185415 21923742.886997830123 +231 0.0231 399558.7064867692533880 21729130.298750009388 +232 0.0232 397395.3981709060608409 21537036.018513951451 +233 0.0233 395251.1755252566654235 21347416.894473515451 +234 0.0234 393125.7931457876111381 21160230.694908045232 +235 0.0235 391019.0098068047082052 20975436.084750473499 +236 0.0236 388930.5883724252344109 20792992.602839525789 +237 0.0237 386860.2957102911313996 20612860.639842413366 +238 0.0238 384807.9026074577705003 20435001.416824940592 +239 0.0239 382773.1836883940850385 20259376.964448984712 +240 0.0240 380755.9173350328928791 20085950.102774336934 +241 0.0241 378755.8856088118627667 19914684.421646654606 +242 0.0242 376772.8741746469750069 19745544.261651482433 +243 0.0243 374806.6722267836448736 19578494.695615377277 +244 0.0244 372857.0724164710263722 19413501.510637447238 +245 0.0245 370923.8707814075751230 19250531.190632022917 +246 0.0246 369006.8666769075789489 19089550.899368293583 +247 0.0247 367105.8627087397035211 18930528.463988956064 +248 0.0248 365220.6646675905794837 18773432.358993183821 +249 0.0249 363351.0814651074470021 18618231.690669137985 +250 0.0250 361496.9250714759109542 18464896.181961365044 +251 0.0251 359658.0104544898495078 18313396.157759305090 +252 0.0252 357834.1555200722068548 18163702.530593875796 +253 0.0253 356025.1810542060411535 18015786.786728885025 +254 0.0254 354230.9106662378180772 17869620.972635030746 +255 0.0255 352451.1707335143582895 17725177.681834086776 +256 0.0256 350685.7903473175247200 17582430.042103126645 +257 0.0257 348934.6012600610847585 17441351.703025192022 +258 0.0258 347197.4378337159287184 17301916.823878325522 +259 0.0259 345474.1369894294766709 17164100.061850748956 +260 0.0260 343764.5381583083071746 17027876.560572274029 +261 0.0261 342068.4832333319936879 16893221.938953686506 +262 0.0262 340385.8165223681717180 16760112.280323171988 +263 0.0263 338716.3847022594418377 16628524.121851090342 +264 0.0264 337060.0367739541106857 16498434.444255290553 +265 0.0265 335416.6240186524810269 16369820.661777207628 +266 0.0266 333785.9999549425556324 16242660.612421756610 +267 0.0267 332168.0202968988451175 16116932.548452043906 +268 0.0268 330562.5429131195996888 15992615.127132756636 +269 0.0269 328969.4277866773190908 15869687.401713062078 +270 0.0270 327388.5369759594905190 15748128.812643324956 +271 0.0271 325819.7345763763878495 15627919.179018380120 +272 0.0272 324262.8866829134640284 15509038.690240252763 +273 0.0273 322717.8613535067415796 15391467.897894557565 +274 0.0274 321184.5285732203046791 15275187.707833781838 +275 0.0275 319662.7602192055201158 15160179.372462106869 +276 0.0276 318152.4300264216726646 15046424.483215091750 +277 0.0277 316653.4135540994466282 14933904.963229581714 +278 0.0278 315165.5881529281032272 14822603.060197308660 +279 0.0279 313688.8329329483676702 14712501.339397784323 +280 0.0280 312223.0287321332143620 14603582.676904901862 +281 0.0281 310768.0580856398446485 14495830.252962842584 +282 0.0282 309323.8051957153948024 14389227.545525571331 +283 0.0283 307890.1559022412984632 14283758.323956133798 +284 0.0284 306466.9976538994233124 14179406.642881162465 +285 0.0285 305054.2194799456046894 14076156.836195666343 +286 0.0286 303651.7119625750929117 13973993.511214442551 +287 0.0287 302259.3672098660608754 13872901.542966175824 +288 0.0288 300877.0788292865036055 13772866.068625522777 +289 0.0289 299504.7419017512584105 13673872.482079930604 +290 0.0290 298142.2529562158742920 13575906.428628131747 +291 0.0291 296789.5099447942338884 13478953.799804234877 +292 0.0292 295446.4122183876461349 13383000.728327834979 +293 0.0293 294112.8605028126039542 13288033.583172608167 +294 0.0294 292788.7568754162639380 13194038.964753715321 +295 0.0295 291474.0047421671915799 13101003.700227901340 +296 0.0296 290168.5088152105454355 13008914.838905386627 +297 0.0297 288872.1750908768153749 12917759.647769382223 +298 0.0298 287584.9108281332883053 12827525.607101077214 +299 0.0299 286306.6245274679386057 12738200.406205844134 +300 0.0300 285037.2259101956151426 12649771.939240539446 +301 0.0301 283776.6258981767459773 12562228.301136301830 +302 0.0302 282524.7365939391311258 12475557.783616345376 +303 0.0303 281281.4712611930444837 12389748.871305577457 +304 0.0304 280046.7443057312630117 12304790.237929681316 +305 0.0305 278820.4712567047099583 12220670.742600921541 +306 0.0306 277602.5687482652137987 12137379.426189245656 +307 0.0307 276392.9545015670009889 12054905.507775587961 +308 0.0308 275191.5473071188898757 11973238.381186157465 +309 0.0309 273998.2670074793277308 11892367.611604552716 +310 0.0310 272813.0344802860636264 11812282.932260446250 +311 0.0311 271635.7716216134140268 11732974.241192895919 +312 0.0312 270466.4013296494958922 11654431.598086046055 +313 0.0313 269304.8474886864423752 11576645.221175214276 +314 0.0314 268151.0349534165579826 11499605.484222205356 +315 0.0315 267004.8895335275446996 11423302.913557609543 +316 0.0316 265866.3379785902216099 11347728.185188286006 +317 0.0317 264735.3079632323351689 11272872.121969090775 +318 0.0318 263611.7280725920572877 11198725.690836351365 +319 0.0319 262495.5277880451176316 11125280.000102177262 +320 0.0320 261386.6374731996038463 11052526.296807663515 +321 0.0321 260284.9883601525216363 10980455.964133888483 +322 0.0322 259190.5125360023812391 10909060.518869204447 +323 0.0323 258103.1429296123678796 10838331.608931053430 +324 0.0324 257022.8132986187411007 10768261.010941350833 +325 0.0325 255949.4582166789623443 10698840.627854099497 +326 0.0326 254883.0130609545740299 10630062.486633783206 +327 0.0327 253823.4139998237078544 10561918.735983561724 +328 0.0328 252770.5979808184492867 10494401.644121481106 +329 0.0329 251724.5027187821688130 10427503.596604170278 +330 0.0330 250685.0666842421051115 10361217.094196930528 +331 0.0331 249652.2290919928636868 10295534.750788057223 +332 0.0332 248625.9298898860579357 10230449.291348015890 +333 0.0333 247606.1097478221345227 10165953.549930257723 +334 0.0334 246592.7100469398428686 10102040.467715313658 +335 0.0335 245585.6728689993615262 10038703.091094499454 +336 0.0336 244584.9409859549487010 9975934.569794008508 +337 0.0337 243590.4578497133625206 9913728.155037814751 +338 0.0338 242602.1675820740347262 9852077.197748674080 +339 0.0339 241620.0149648473015986 9790975.146786075085 +340 0.0340 240643.9454301469668280 9730415.547220334411 +341 0.0341 239673.9050508538202848 9670392.038642469794 +342 0.0342 238709.8405312463000882 9610898.353508125991 +343 0.0343 237751.6991977951256558 9551928.315515581518 +344 0.0344 236799.4289901185256895 9493475.838016536087 +345 0.0345 235852.9784520947432611 9435534.922459183261 +346 0.0346 234912.2967231286456808 9378099.656862746924 +347 0.0347 233977.3335295693832450 9321164.214322661981 +348 0.0348 233048.0391762759536505 9264722.851545842364 +349 0.0349 232124.3645383279072121 9208769.907415295020 +350 0.0350 231206.2610528779623564 9153299.801583385095 +351 0.0351 230293.6807111441448797 9098307.033093061298 +352 0.0352 229386.5760505381622352 9043786.179026553407 +353 0.0353 228484.9001469278009608 8989731.893180772662 +354 0.0354 227588.6066070303204469 8936138.904768906534 +355 0.0355 226697.6495609345147386 8883002.017147472128 +356 0.0356 225811.9836547487066127 8830316.106568528339 +357 0.0357 224931.5640433724620380 8778076.120956219733 +358 0.0358 224056.3463833892892580 8726277.078707177192 +359 0.0359 223186.2868260781979188 8674914.067514412105 +360 0.0360 222321.3420105417899322 8623982.243213858455 +361 0.0361 221461.4690569484373555 8573476.828653439879 +362 0.0362 220606.6255598865682259 8523393.112583830953 +363 0.0363 219756.7695818288484588 8473726.448570698500 +364 0.0364 218911.8596467039315030 8424472.253927672282 +365 0.0365 218071.8547335740586277 8375626.008669952862 +366 0.0366 217236.7142704161815345 8327183.254487744533 +367 0.0367 216406.3981280048319604 8279139.593739313073 +368 0.0368 215580.8666138947010040 8231490.688463139348 +369 0.0369 214760.0804665010946337 8184232.259408850223 +370 0.0370 213944.0008492763445247 8137360.085086370818 +371 0.0371 213132.5893449803697877 8090870.000833030790 +372 0.0372 212325.8079500438179821 8044757.897898260504 +373 0.0373 211523.6190690216317307 7999019.722545329481 +374 0.0374 210725.9855091358767822 7953651.475169957615 +375 0.0375 209932.8704749056196306 7908649.209435313009 +376 0.0376 209144.2375628626905382 7864009.031423158012 +377 0.0377 208360.0507563514984213 7819727.098800633103 +378 0.0378 207580.2744204113259912 7775799.620002530515 +379 0.0379 206804.8732967397663742 7732222.853428640403 +380 0.0380 206033.8124987355549820 7688993.106655824929 +381 0.0381 205267.0575066195451654 7646106.735664557666 +382 0.0382 204504.5741626323433593 7603560.144079709426 +383 0.0383 203746.3286663071194198 7561349.782425034791 +384 0.0384 202992.2875698163115885 7519472.147391326725 +385 0.0385 202242.4177733908582013 7477923.781117897481 +386 0.0386 201496.6865208106173668 7436701.270486981608 +387 0.0387 200755.0613949647231493 7395801.246430922300 +388 0.0388 200017.5103134805976879 7355220.383251846768 +389 0.0389 199284.0015244203386828 7314955.397953567095 +390 0.0390 198554.5036020433763042 7275003.049585497938 +391 0.0391 197828.9854426342062652 7235360.138598185033 +392 0.0392 197107.4162603937729727 7196023.506210444495 +393 0.0393 196389.7655833938624710 7156990.033787740394 +394 0.0394 195676.0032495929044671 7118256.642231527716 +395 0.0395 194966.0994029123394284 7079820.291379486211 +396 0.0396 194260.0244893725612201 7041677.979416278191 +397 0.0397 193557.7492532870091964 7003826.742294752039 +398 0.0398 192859.2447335139149800 6966263.653167183511 +399 0.0399 192164.4822597642196342 6928985.821826678701 +400 0.0400 191473.4334489649918396 6891990.394158147275 +401 0.0401 190786.0702016771247145 6855274.551598954014 +402 0.0402 190102.3646985667292029 6818835.510608957149 +403 0.0403 189422.2893969287979417 6782670.522149682976 +404 0.0404 188745.8170272626739461 6746776.871172529645 +405 0.0405 188072.9205898982472718 6711151.876115866937 +406 0.0406 187403.5733516719192266 6675792.888410670683 +407 0.0407 186737.7488426516356412 6640697.291994819418 +408 0.0408 186075.4208529101160821 6605862.502835530788 +409 0.0409 185416.5634293453476857 6571285.968460116535 +410 0.0410 184761.1508725476160180 6536965.167494639754 +411 0.0411 184109.1577337123744655 6502897.609210464172 +412 0.0412 183460.5588115979335271 6469080.833078474738 +413 0.0413 182815.3291495274752378 6435512.408330894075 +414 0.0414 182173.4440324344031978 6402189.933530419134 +415 0.0415 181534.8789839505334385 6369111.036146689206 +416 0.0416 180899.6097635361948051 6336273.372139813378 +417 0.0417 180267.6123636516567785 6303674.625550972298 +418 0.0418 179638.8630069691280369 6271312.508099725470 +419 0.0419 179013.3381436247436795 6239184.758788173087 +420 0.0420 178391.0144485097553115 6207289.143511652946 +421 0.0421 177771.8688186003710143 6175623.454675846733 +422 0.0422 177155.8783703255467117 6144185.510820384137 +423 0.0423 176543.0204369721177500 6112973.156248455867 +424 0.0424 175933.2725661265430972 6081984.260662759654 +425 0.0425 175326.6125171530293301 6051216.718807229772 +426 0.0426 174723.0182587069284637 6020668.450114805251 +427 0.0427 174122.4679662831476890 5990337.398360865191 +428 0.0428 173524.9400197989889421 5960221.531322392635 +429 0.0429 172930.4130012107489165 5930318.840442646295 +430 0.0430 172338.8656921635556500 5900627.340501287952 +431 0.0431 171750.2770716740051284 5871145.069289900362 +432 0.0432 171164.6263138448703103 5841870.087292721495 +433 0.0433 170581.8927856116206385 5812800.477372545749 +434 0.0434 170002.0560445199080277 5783934.344461663626 +435 0.0435 169425.0958365339320153 5755269.815257835202 +436 0.0436 168850.9920938747818582 5726805.037925051525 +437 0.0437 168279.7249328885809518 5698538.181799128652 +438 0.0438 167711.2746519437350798 5670467.437098023482 +439 0.0439 167145.6217293569934554 5642591.014636720531 +440 0.0440 166582.7468213478277903 5614907.145546681248 +441 0.0441 166022.6307600205182098 5587414.080999678001 +442 0.0442 165465.2545513737422880 5560110.091936131939 +443 0.0443 164910.5993733370560221 5532993.468797597103 +444 0.0444 164358.6465738340048119 5506062.521263504401 +445 0.0445 163809.3776688712241594 5479315.577992068604 +446 0.0446 163262.7743406533554662 5452750.986365268938 +447 0.0447 162718.8184357231948525 5426367.112237730063 +448 0.0448 162177.4919631268130615 5400162.339689624496 +449 0.0449 161638.7770926031516865 5374135.070783387870 +450 0.0450 161102.6561527977755759 5348283.725324149244 +451 0.0451 160569.1116295003739651 5322606.740624014288 +452 0.0452 160038.1261639056901913 5297102.571269845590 +453 0.0453 159509.6825508974725381 5271769.688894728199 +454 0.0454 158983.7637373550969642 5246606.581952922046 +455 0.0455 158460.3528204825415742 5221611.755498275161 +456 0.0456 157939.4330461593344808 5196783.730966017582 +457 0.0457 157420.9878073131258134 5172121.045957907103 +458 0.0458 156905.0006423137092497 5147622.254030704498 +459 0.0459 156391.4552333877945784 5123285.924487766810 +460 0.0460 155880.3354050547059160 5099110.642173876986 +461 0.0461 155371.6251225823652931 5075095.007273220457 +462 0.0462 154865.3084904631832615 5051237.635110300034 +463 0.0463 154361.3697509099729359 5027537.155954011716 +464 0.0464 153859.7932823710434604 5003992.214824530296 +465 0.0465 153360.5635980646475218 4980601.471303174272 +466 0.0466 152863.6653445322299376 4957363.599345142953 +467 0.0467 152369.0833002102153841 4934277.287094967440 +468 0.0468 151876.8023740202188492 4911341.236704847775 +469 0.0469 151386.8076039771840442 4888554.164155574515 +470 0.0470 150899.0841558153915685 4865914.799080181867 +471 0.0471 150413.6173216318711638 4843421.884590195492 +472 0.0472 149930.3925185471307486 4821074.177104503848 +473 0.0473 149449.3952873828820884 4798870.446180671453 +474 0.0474 148970.6112913564138580 4776809.474348803982 +475 0.0475 148494.0263147915829904 4754890.056947860867 +476 0.0476 148019.6262618459586520 4733111.001964338124 +477 0.0477 147547.3971552540606353 4711471.129873333499 +478 0.0478 147077.3251350862847175 4689969.273481942713 +479 0.0479 146609.3964575234276708 4668604.277774934657 +480 0.0480 146143.5974936465499923 4647374.999762667343 +481 0.0481 145679.9147282418562099 4626280.308331250213 +482 0.0482 145218.3347586205636617 4605319.084094828926 +483 0.0483 144758.8442934533231892 4584490.219250014052 +484 0.0484 144301.4301516191917472 4563792.617432483472 +485 0.0485 143846.0792610687785782 4543225.193575555459 +486 0.0486 143392.7786577014485374 4522786.873770900071 +487 0.0487 142941.5154842563497368 4502476.595131097361 +488 0.0488 142492.2769892170617823 4482293.305654374883 +489 0.0489 142045.0505257297772914 4462235.964091056027 +490 0.0490 141599.8235505346092395 4442303.539812127128 +491 0.0491 141156.5836229100241326 4422495.012679481879 +492 0.0492 140715.3184036301390734 4402809.372918158770 +493 0.0493 140276.0156539347080979 4383245.620990309864 +494 0.0494 139838.6632345116522629 4363802.767470985651 +495 0.0495 139403.2491044918133412 4344479.832925658673 +496 0.0496 138969.7613204560475424 4325275.847789490595 +497 0.0497 138538.1880354541644920 4306189.852248271927 +498 0.0498 138108.5174980356823653 4287220.896121088415 +499 0.0499 137680.7380512923991773 4268368.038744527847 +500 0.0500 137254.8381319122272544 4249630.348858638667 +501 0.0501 136830.8062692445819266 4231006.904494369403 +502 0.0502 136408.6310843767423648 4212496.792862656526 +503 0.0503 135988.3012892213591840 4194099.110244992189 +504 0.0504 135569.8056856148468796 4175812.961885531899 +505 0.0505 135153.1331644263409544 4157637.461884729564 +506 0.0506 134738.2727046773943584 4139571.733094390482 +507 0.0507 134325.2133726719766855 4121614.907014190219 +508 0.0508 133913.9443211367761251 4103766.123689664528 +509 0.0509 133504.4547883717168588 4086024.531611518003 +510 0.0510 133096.7340974103135522 4068389.287616347428 +511 0.0511 132690.7716551900666673 4050859.556788770016 +512 0.0512 132286.5569517323747277 4033434.512364832219 +513 0.0513 131884.0795593322836794 4016113.335636750795 +514 0.0514 131483.3291317574912682 3998895.215858955868 +515 0.0515 131084.2954034567810595 3981779.350155374035 +516 0.0516 130686.9681887775950599 3964764.943428073078 +517 0.0517 130291.3373811928468058 3947851.208266993985 +518 0.0518 129897.3929525364510482 3931037.364861014299 +519 0.0519 129505.1249522478901781 3914322.640910173766 +520 0.0520 129114.5235066254244884 3897706.271539064124 +521 0.0521 128725.5788180879026186 3881187.499211404007 +522 0.0522 128338.2811644450412132 3864765.573645757046 +523 0.0523 127952.6208981761301402 3848439.751732352190 +524 0.0524 127568.5884457169595407 3832209.297451062594 +525 0.0525 127186.1743067548813997 3816073.481790409889 +526 0.0526 126805.3690535319765331 3800031.582667718176 +527 0.0527 126426.1633301560796099 3784082.884850270115 +528 0.0528 126048.5478519196913112 3768226.679877527989 +529 0.0529 125672.5134046265884535 3752462.265984409023 +530 0.0530 125298.0508439260884188 3736788.948025525082 +531 0.0531 124925.1510946547932690 3721206.037400431931 +532 0.0532 124553.8051501857698895 3705712.851979916915 +533 0.0533 124184.0040717851225054 3690308.716033163946 +534 0.0534 123815.7389879756665323 3674992.960155951791 +535 0.0535 123449.0010939078783849 3659764.921199737117 +536 0.0536 123083.7816507378011011 3644623.942201695871 +537 0.0537 122720.0719850119348848 3629569.372315638233 +538 0.0538 122357.8634880589524982 3614600.566743873060 +539 0.0539 121997.1476153882686049 3599716.886669937987 +540 0.0540 121637.9158860951574752 3584917.699192154221 +541 0.0541 121280.1598822726518847 3570202.377258101944 +542 0.0542 120923.8712484297429910 3555570.299599932041 +543 0.0543 120569.0416909162304364 3541020.850670445710 +544 0.0544 120215.6629773536988068 3526553.420580124948 +545 0.0545 119863.7269360729551408 3512167.405034823809 +546 0.0546 119513.2254555574909318 3497862.205274344888 +547 0.0547 119164.1504838931869017 3483637.228011821862 +548 0.0548 118816.4940282239113003 3469491.885373768862 +549 0.0549 118470.2481542131718015 3455425.594841030892 +550 0.0550 118125.4049855116027175 3441437.779190366156 +551 0.0551 117781.9567032302438747 3427527.866436836775 +552 0.0552 117439.8955454195529455 3413695.289776933845 +553 0.0553 117099.2138065540930256 3399939.487532343250 +554 0.0554 116759.9038370227499399 3386259.903094561771 +555 0.0555 116421.9580426245229319 3372655.984870031010 +556 0.0556 116085.3688840697141131 3359127.186226147693 +557 0.0557 115750.1288764865166740 3345672.965437815990 +558 0.0558 115416.2305889328854391 3332292.785634693224 +559 0.0559 115083.6666439136897679 3318986.114749182016 +560 0.0560 114752.4297169029887300 3305752.425464965869 +561 0.0561 114422.5125358714285539 3292591.195166236721 +562 0.0562 114093.9078808187332470 3279501.905887547880 +563 0.0563 113766.6085833111428656 3266484.044264285825 +564 0.0564 113440.6075260237412294 3253537.101483763196 +565 0.0565 113115.8976422877021832 3240660.573236916680 +566 0.0566 112792.4719156423234381 3227853.959670593962 +567 0.0567 112470.3233793917752337 3215116.765340421814 +568 0.0568 112149.4451161665347172 3202448.499164298177 +569 0.0569 111829.8302574895060388 3189848.674376392271 +570 0.0570 111511.4719833465933334 3177316.808481732849 +571 0.0571 111194.3635217619303148 3164852.423211421352 +572 0.0572 110878.4981483774463413 3152455.044478238095 +573 0.0573 110563.8691860368853668 3140124.202332985587 +574 0.0574 110250.4700043741759146 3127859.430921176914 +575 0.0575 109938.2940194060938666 3115660.268440396059 +576 0.0576 109627.3346931291744113 3103526.257098075002 +577 0.0577 109317.5855331207712879 3091456.943069862667 +578 0.0578 109009.0400921443506377 3079451.876458412036 +579 0.0579 108701.6919677587866317 3067510.611252752133 +580 0.0580 108395.5348019317461876 3055632.705288087949 +581 0.0581 108090.5622806570318062 3043817.720206141006 +582 0.0582 107786.7681335759261856 3032065.221415860113 +583 0.0583 107484.1461336023930926 3020374.778054755181 +584 0.0584 107182.6900965521199396 3008745.962950566784 +585 0.0585 106882.3938807754166191 2997178.352583447937 +586 0.0586 106583.2513867938105250 2985671.527048591059 +587 0.0587 106285.2565569404105190 2974225.070019331295 +588 0.0588 105988.4033750039088773 2962838.568710591178 +589 0.0589 105692.6858658762357663 2951511.613842889201 +590 0.0590 105398.0980952037498355 2940243.799606688786 +591 0.0591 105104.6341690420522355 2929034.723627181258 +592 0.0592 104812.2882335142203374 2917883.986929481849 +593 0.0593 104521.0544744725339115 2906791.193904312328 +594 0.0594 104230.9271171636210056 2895755.952273962088 +595 0.0595 103941.9004258969798684 2884777.873058722354 +596 0.0596 103653.9687037168623647 2873856.570543735754 +597 0.0597 103367.1262920773733640 2862991.662246165797 +598 0.0598 103081.3675705209170701 2852182.768882826902 +599 0.0599 102796.6869563598738750 2841429.514338104054 +600 0.0600 102513.0789043613476679 2830731.525632334407 +601 0.0601 102230.5379064352018759 2820088.432890503667 +602 0.0602 101949.0584913251077523 2809499.869311322924 +603 0.0603 101668.6352243027067743 2798965.471136649139 +604 0.0604 101389.2627068648143904 2788484.877621303778 +605 0.0605 101110.9355764335923595 2778057.731003179215 +606 0.0606 100833.6485060597478878 2767683.676473695319 +607 0.0607 100557.3962041286285967 2757362.362148708664 +608 0.0608 100282.1734140692133224 2747093.439039573073 +609 0.0609 100007.9749140659987461 2736876.561024673283 +610 0.0610 99734.7955167737090960 2726711.384821256623 +611 0.0611 99462.6300690347707132 2716597.569957532920 +612 0.0612 99191.4734515996387927 2706534.778745140415 +613 0.0613 98921.3205788497871254 2696522.676251916680 +614 0.0614 98652.1663985234335996 2686560.930275016930 +615 0.0615 98384.0058914439723594 2676649.211314231157 +616 0.0616 98116.8340712509670993 2666787.192545733415 +617 0.0617 97850.6459841338801198 2656974.549796028994 +618 0.0618 97585.4367085682606557 2647210.961516254116 +619 0.0619 97321.2013550546107581 2637496.108756755013 +620 0.0620 97057.9350658596813446 2627829.675141920801 +621 0.0621 96795.6330147603148362 2618211.346845369786 +622 0.0622 96534.2904067897761706 2608640.812565323897 +623 0.0623 96273.9024779864994343 2599117.763500323985 +624 0.0624 96014.4644951452210080 2589641.893325224053 +625 0.0625 95755.9717555705865379 2580212.898167368025 +626 0.0626 95498.4195868330571102 2570830.476583180949 +627 0.0627 95241.8033465271582827 2561494.329534859862 +628 0.0628 94986.1184220320428722 2552204.160367432982 +629 0.0629 94731.3602302743674954 2542959.674786048941 +630 0.0630 94477.5242174933955539 2533760.580833489075 +631 0.0631 94224.6058590083266608 2524606.588867954910 +632 0.0632 93972.6006589878670638 2515497.411541108973 +633 0.0633 93721.5041502219974063 2506432.763776316773 +634 0.0634 93471.3118938958214130 2497412.362747202162 +635 0.0635 93222.0194793656410184 2488435.927856354043 +636 0.0636 92973.6225239371124189 2479503.180714318994 +637 0.0637 92726.1166726454539457 2470613.845118837897 +638 0.0638 92479.4975980377930682 2461767.647034241352 +639 0.0639 92233.7609999575215625 2452964.314571151044 +640 0.0640 91988.9026053306442918 2444203.577966340818 +641 0.0641 91744.9181679541798076 2435485.169562886935 +642 0.0642 91501.8034682865109062 2426808.823790412862 +643 0.0643 91259.5543132396996953 2418174.277145739179 +644 0.0644 91018.1665359737380641 2409581.268173493911 +645 0.0645 90777.6359956927044550 2401029.537447206676 +646 0.0646 90537.9585774428269360 2392518.827550380956 +647 0.0647 90299.1301919124089181 2384048.883057888132 +648 0.0648 90061.1467752336320700 2375619.450517554767 +649 0.0649 89824.0042887861636700 2367230.278431896120 +650 0.0650 89587.6987190025683958 2358881.117240109947 +651 0.0651 89352.2260771755536553 2350571.719300235156 +652 0.0652 89117.5823992669756990 2342301.838871441782 +653 0.0653 88883.7637457185774110 2334071.232096662745 +654 0.0654 88650.7662012644868810 2325879.656985240988 +655 0.0655 88418.5858747454331024 2317726.873395881616 +656 0.0656 88187.2188989246496931 2309612.643019710202 +657 0.0657 87956.6614303054811899 2301536.729363576043 +658 0.0658 87726.9096489506337093 2293498.897733487189 +659 0.0659 87497.9597583030408714 2285498.915218234994 +660 0.0660 87269.8079850084759528 2277536.550673202146 +661 0.0661 87042.4505787396046799 2269611.574704292230 +662 0.0662 86815.8838120217842516 2261723.759652150795 +663 0.0663 86590.1039800603612093 2253872.879576376174 +664 0.0664 86365.1074005695409141 2246058.710240065120 +665 0.0665 86140.8904136028140783 2238281.029094408266 +666 0.0666 85917.4493813849258004 2230539.615263488144 +667 0.0667 85694.7806881452852394 2222834.249529276974 +668 0.0668 85472.8807399529905524 2215164.714316701051 +669 0.0669 85251.7459645532071590 2207530.793678916059 +670 0.0670 85031.3728112051176140 2199932.273282770999 +671 0.0671 84811.7577505212684628 2192368.940394323785 +672 0.0672 84592.8972743083286332 2184840.583864617627 +673 0.0673 84374.7878954093175707 2177346.994115536101 +674 0.0674 84157.4261475472449092 2169887.963125823066 +675 0.0675 83940.8085851700889179 2162463.284417212941 +676 0.0676 83724.9317832971864846 2155072.753040826879 +677 0.0677 83509.7923373669764260 2147716.165563513059 +678 0.0678 83295.3868630860670237 2140393.320054554380 +679 0.0679 83081.7119962797296466 2133104.016072260682 +680 0.0680 82868.7643927435710793 2125848.054650980048 +681 0.0681 82656.5407280966173857 2118625.238287957851 +682 0.0682 82445.0376976356928935 2111435.370930572040 +683 0.0683 82234.2520161909924354 2104278.257963562850 +684 0.0684 82024.1804179829923669 2097153.706196411978 +685 0.0685 81814.8196564806276001 2090061.523850882892 +686 0.0686 81606.1665042606473435 2083001.520548672182 +687 0.0687 81398.2177528682514094 2075973.507299164077 +688 0.0688 81190.9702126789197791 2068977.296487379121 +689 0.0689 80984.4207127614499768 2062012.701861926820 +690 0.0690 80778.5661007421877002 2055079.538523242110 +691 0.0691 80573.4032426704361569 2048177.622911756160 +692 0.0692 80368.9290228850295534 2041306.772796346107 +693 0.0693 80165.1403438820707379 2034466.807262790157 +694 0.0694 79962.0341261838038918 2027657.546702427091 +695 0.0695 79759.6073082086368231 2020878.812800869113 +696 0.0696 79557.8568461422546534 2014130.428526828764 +697 0.0697 79356.7797138098540017 2007412.218121102080 +698 0.0698 79156.3729025495122187 2000724.007085616002 +699 0.0699 78956.6334210866043577 1994065.622172628064 +700 0.0700 78757.5582954092678847 1987436.891373981023 +701 0.0701 78559.1445686450460926 1980837.643910526996 +702 0.0702 78361.3893009384337347 1974267.710221600020 +703 0.0703 78164.2895693296159152 1967726.921954615740 +704 0.0704 77967.8424676341383019 1961215.111954805208 +705 0.0705 77772.0451063236541813 1954732.114255007124 +706 0.0706 77576.8946124076319393 1948277.764065563679 +707 0.0707 77382.3881293161393842 1941851.897764329799 +708 0.0708 77188.5228167835884960 1935454.352886810899 +709 0.0709 76995.2958507334260503 1929084.968116336036 +710 0.0710 76802.7044231638865313 1922743.583274375182 +711 0.0711 76610.7457420346181607 1916430.039310909109 +712 0.0712 76419.4170311543275602 1910144.178294973914 +713 0.0713 76228.7155300693266327 1903885.843405185034 +714 0.0714 76038.6384939530398697 1897654.878920459887 +715 0.0715 75849.1831934964866377 1891451.130210749805 +716 0.0716 75660.3469147995492676 1885274.443727936130 +717 0.0717 75472.1269592633179855 1879124.666996743996 +718 0.0718 75284.5206434831925435 1873001.648605788127 +719 0.0719 75097.5252991429733811 1866905.238198698964 +720 0.0720 74911.1382729097676929 1860835.286465344951 +721 0.0721 74725.3569263298413716 1854791.645133090205 +722 0.0722 74540.1786357252713060 1848774.166958209127 +723 0.0723 74355.6007920914998977 1842782.705717317061 +724 0.0724 74171.6208009956899332 1836817.116198963951 +725 0.0725 73988.2360824759816751 1830877.254195200047 +726 0.0726 73805.4440709415503079 1824962.976493319031 +727 0.0727 73623.2422150735073956 1819074.140867645154 +728 0.0728 73441.6279777265590383 1813210.606071356917 +729 0.0729 73260.5988358315662481 1807372.231828523101 +730 0.0730 73080.1522802988329204 1801558.878826004919 +731 0.0731 72900.2858159222523682 1795770.408705636859 +732 0.0732 72720.9969612841523485 1790006.684056395199 +733 0.0733 72542.2832486609986518 1784267.568406587001 +734 0.0734 72364.1422239298553905 1778552.926216223044 +735 0.0735 72186.5714464755728841 1772862.622869415907 +736 0.0736 72009.5684890987613471 1767196.524666810874 +737 0.0737 71833.1309379245067248 1761554.498818153981 +738 0.0738 71657.2563923118577804 1755936.413434864953 +739 0.0739 71481.9424647639825707 1750342.137522774981 +740 0.0740 71307.1867808390961727 1744771.540974817937 +741 0.0741 71132.9869790621596621 1739224.494563881075 +742 0.0742 70959.3407108371757204 1733700.869935660157 +743 0.0743 70786.2456403603137005 1728200.539601657074 +744 0.0744 70613.6994445336313220 1722723.376932133920 +745 0.0745 70441.6998128795676166 1717269.256149256835 +746 0.0746 70270.2444474560907111 1711838.052320202813 +747 0.0747 70099.3310627725586528 1706429.641350412043 +748 0.0748 69928.9573857061914168 1701043.899976806017 +749 0.0749 69759.1211554192850599 1695680.705761178862 +750 0.0750 69589.8201232770516071 1690339.937083567027 +751 0.0751 69421.0520527660846710 1685021.473135730950 +752 0.0752 69252.8147194135672180 1679725.193914671196 +753 0.0753 69085.1059107070177561 1674450.980216201162 +754 0.0754 68917.9234260147786699 1669198.713628606871 +755 0.0755 68751.2650765070284251 1663968.276526329108 +756 0.0756 68585.1286850775213679 1658759.552063735900 +757 0.0757 68419.5120862658804981 1653572.424168952974 +758 0.0758 68254.4131261805450777 1648406.777537713991 +759 0.0759 68089.8296624223003164 1643262.497627299977 +760 0.0760 67925.7595640084036859 1638139.470650517847 +761 0.0761 67762.2007112973951735 1633037.583569784882 +762 0.0762 67599.1509959143440938 1627956.724091162905 +763 0.0763 67436.6083206768525997 1622896.780658543110 +764 0.0764 67274.5705995215394069 1617857.642447864171 +765 0.0765 67113.0357574310764903 1612839.199361337814 +766 0.0766 66952.0017303619242739 1607841.342021773104 +767 0.0767 66791.4664651724888245 1602863.961766964989 +768 0.0768 66631.4279195519338828 1597906.950644044206 +769 0.0769 66471.8840619495313149 1592970.201404015068 +770 0.0770 66312.8328715045208810 1588053.607496201992 +771 0.0771 66154.2723379765666323 1583157.063062875066 +772 0.0772 65996.2004616767371772 1578280.462933810893 +773 0.0773 65838.6152533989952644 1573423.702621007105 +774 0.0774 65681.5147343522839947 1568586.678313335869 +775 0.0775 65524.8969360930495895 1563769.286871347111 +776 0.0776 65368.7599004583826172 1558971.425822052173 +777 0.0777 65213.1016794995884993 1554192.993353782920 +778 0.0778 65057.9203354163473705 1549433.888311086921 +779 0.0779 64903.2139404913104954 1544694.010189681780 +780 0.0780 64748.9805770252569346 1539973.259131439961 +781 0.0781 64595.2183372727158712 1535271.535919404123 +782 0.0782 64441.9253233780982555 1530588.741972892080 +783 0.0783 64289.0996473123232136 1525924.779342620866 +784 0.0784 64136.7394308099028422 1521279.550705844071 +785 0.0785 63984.8428053065290442 1516652.959361606976 +786 0.0786 63833.4079118771551293 1512044.909225943964 +787 0.0787 63682.4329011744994204 1507455.304827217944 +788 0.0788 63531.9159333680654527 1502884.051301439991 +789 0.0789 63381.8551780836132821 1498331.054387644865 +790 0.0790 63232.2488143430673517 1493796.220423321938 +791 0.0791 63083.0950305049118469 1489279.456339850090 +792 0.0792 62934.3920242050153320 1484780.669658025028 +793 0.0793 62786.1380022979355999 1480299.768483560998 +794 0.0794 62638.3311807986247004 1475836.661502727075 +795 0.0795 62490.9697848245923524 1471391.257977915928 +796 0.0796 62344.0520485385350185 1466963.467743301066 +797 0.0797 62197.5762150913433288 1462553.201200571144 +798 0.0798 62051.5405365655824426 1458160.369314593961 +799 0.0799 61905.9432739193871384 1453784.883609284181 +800 0.0800 61760.7826969307570835 1449426.656163285952 +801 0.0801 61616.0570841422959347 1445085.599605927942 +802 0.0802 61471.7647228063506191 1440761.627113043098 +803 0.0803 61327.9039088305580663 1436454.652402872918 +804 0.0804 61184.4729467238139478 1432164.589732075809 +805 0.0805 61041.4701495426270412 1427891.353891650913 +806 0.0806 60898.8938388378956006 1423634.860203002114 +807 0.0807 60756.7423446020475239 1419395.024513952900 +808 0.0808 60615.0140052166025271 1415171.763194891857 +809 0.0809 60473.7071674001199426 1410964.993134832010 +810 0.0810 60332.8201861564957653 1406774.631737606134 +811 0.0811 60192.3514247237108066 1402600.596918050200 +812 0.0812 60052.2992545228989911 1398442.807098225923 +813 0.0813 59912.6620551078012795 1394301.181203675922 +814 0.0814 59773.4382141146343201 1390175.638659684919 +815 0.0815 59634.6261272122646915 1386066.099387662020 +816 0.0816 59496.2241980528124259 1381972.483801399823 +817 0.0817 59358.2308382225673995 1377894.712803561939 +818 0.0818 59220.6444671932913479 1373832.707781995879 +819 0.0819 59083.4635122738764039 1369786.390606242931 +820 0.0820 58946.6864085623674328 1365755.683624005876 +821 0.0821 58810.3115988982899580 1361740.509657592047 +822 0.0822 58674.3375338153855409 1357740.792000550078 +823 0.0823 58538.7626714946527500 1353756.454414122971 +824 0.0824 58403.5854777177519281 1349787.421123935841 +825 0.0825 58268.8044258207301027 1345833.616816549096 +826 0.0826 58134.4179966480951407 1341894.966636141995 +827 0.0827 58000.4246785072318744 1337971.396181180142 +828 0.0828 57866.8229671231165412 1334062.831501122098 +829 0.0829 57733.6113655934022972 1330169.199093156029 +830 0.0830 57600.7883843437957694 1326290.425898970105 +831 0.0831 57468.3525410837683012 1322426.439301527105 +832 0.0832 57336.3023607626018929 1318577.167121869978 +833 0.0833 57204.6363755257116281 1314742.537616000045 +834 0.0834 57073.3531246713246219 1310922.479471714934 +835 0.0835 56942.4511546074645594 1307116.921805503080 +836 0.0836 56811.9290188092127210 1303325.794159517158 +837 0.0837 56681.7852777763182530 1299549.026498423889 +838 0.0838 56552.0184989910703734 1295786.549206481082 +839 0.0839 56422.6272568765198230 1292038.293084460078 +840 0.0840 56293.6101327549622511 1288304.189346707892 +841 0.0841 56164.9657148067199159 1284584.169618171174 +842 0.0842 56036.6925980292362510 1280878.165931493044 +843 0.0843 55908.7893841964541934 1277186.110724085942 +844 0.0844 55781.2546818184855510 1273507.936835279921 +845 0.0845 55654.0871061015495798 1269843.577503425069 +846 0.0846 55527.2852789082244271 1266192.966363095911 +847 0.0847 55400.8478287179532344 1262556.037442269968 +848 0.0848 55274.7733905878631049 1258932.725159547990 +849 0.0849 55149.0606061138169025 1255322.964321393985 +850 0.0850 55023.7081233917779173 1251726.690119356150 +851 0.0851 54898.7145969794364646 1248143.838127413997 +852 0.0852 54774.0786878581056953 1244574.344299242133 +853 0.0853 54649.7990633948647883 1241018.144965545973 +854 0.0854 54525.8743973050150089 1237475.176831399091 +855 0.0855 54402.3033696147613227 1233945.376973642036 +856 0.0856 54279.0846666241632192 1230428.682838253910 +857 0.0857 54156.2169808703620220 1226925.032237773994 +858 0.0858 54033.6990110910337535 1223434.363348727114 +859 0.0859 53911.5294621881403145 1219956.614709089976 +860 0.0860 53789.7070451918989420 1216491.725215751911 +861 0.0861 53668.2304772250063252 1213039.634122058051 +862 0.0862 53547.0984814671392087 1209600.281035233987 +863 0.0863 53426.3097871196732740 1206173.605914032087 +864 0.0864 53305.8631293706639553 1202759.549066213891 +865 0.0865 53185.7572493600455346 1199358.051146148937 +866 0.0866 53065.9908941451139981 1195969.053152418230 +867 0.0867 52946.5628166662208969 1192592.496425422840 +868 0.0868 52827.4717757127000368 1189228.322645022999 +869 0.0869 52708.7165358890415519 1185876.473828187911 +870 0.0870 52590.2958675812988076 1182536.892326653004 +871 0.0871 52472.2085469237354118 1179209.520824675914 +872 0.0872 52354.4533557656686753 1175894.302336648107 +873 0.0873 52237.0290816385895596 1172591.180204904173 +874 0.0874 52119.9345177234717994 1169300.098097451963 +875 0.0875 52003.1684628183138557 1166021.000005693873 +876 0.0876 51886.7297213059136993 1162753.830242255004 +877 0.0877 51770.6171031218618737 1159498.533438783139 +878 0.0878 51654.8294237227382837 1156255.054543741979 +879 0.0879 51539.3655040545418160 1153023.338820255129 +880 0.0880 51424.2241705213309615 1149803.331843974069 +881 0.0881 51309.4042549540827167 1146594.979500931222 +882 0.0882 51194.9045945797624881 1143398.227985410951 +883 0.0883 51080.7240319905977231 1140213.023797904840 +884 0.0884 50966.8614151135552675 1137039.313742977101 +885 0.0885 50853.3155971800442785 1133877.044927243143 +886 0.0886 50740.0854366958155879 1130726.164757274091 +887 0.0887 50627.1697974110720679 1127586.620937614003 +888 0.0888 50514.5675482907536207 1124458.361468741903 +889 0.0889 50402.2775634850622737 1121341.334645078052 +890 0.0890 50290.2987223001618986 1118235.489052976947 +891 0.0891 50178.6299091690743808 1115140.773568818811 +892 0.0892 50067.2700136227867915 1112057.137356976047 +893 0.0893 49956.2179302615404595 1108984.529867933132 +894 0.0894 49845.4725587263237685 1105922.900836369954 +895 0.0895 49735.0328036705468548 1102872.200279189972 +896 0.0896 49624.8975747318982030 1099832.378493720898 +897 0.0897 49515.0657865044267965 1096803.386055743089 +898 0.0898 49405.5363585107552353 1093785.173817700008 +899 0.0899 49296.3082151745256851 1090777.692906829994 +900 0.0900 49187.3802857930204482 1087780.894723285921 +901 0.0901 49078.7515045099353301 1084794.730938391993 +902 0.0902 48970.4208102883785614 1081819.153492776910 +903 0.0903 48862.3871468840079615 1078854.114594605984 +904 0.0904 48754.6494628183863824 1075899.566717823036 +905 0.0905 48647.2067113524753950 1072955.462600349914 +906 0.0906 48540.0578504603399779 1070021.755242340965 +907 0.0907 48433.2018428029987263 1067098.397904494079 +908 0.0908 48326.6376557024632348 1064185.344106249977 +909 0.0909 48220.3642611159448279 1061282.547624144936 +910 0.0910 48114.3806356102359132 1058389.962490087841 +911 0.0911 48008.6857603362441296 1055507.542989682872 +912 0.0912 47903.2786210037302226 1052635.243660546141 +913 0.0913 47798.1582078561696107 1049773.019290677970 +914 0.0914 47693.3235156457958510 1046920.824916763930 +915 0.0915 47588.7735436088260030 1044078.615822601132 +916 0.0916 47484.5072954408242367 1041246.347537442925 +917 0.0917 47380.5237792722327868 1038423.975834406097 +918 0.0918 47276.8220076440702542 1035611.456728849094 +919 0.0919 47173.4009974837899790 1032808.746476817061 +920 0.0920 47070.2597700812766561 1030015.801573466044 +921 0.0921 46967.3973510650321259 1027232.578751489054 +922 0.0922 46864.8127703784775804 1024459.034979591961 +923 0.0923 46762.5050622564522200 1021695.127460914082 +924 0.0924 46660.4732652018283261 1018940.813631556928 +925 0.0925 46558.7164219623009558 1016196.051159041119 +926 0.0926 46457.2335795073086047 1013460.797940794844 +927 0.0927 46356.0237890051357681 1010735.012102694949 +928 0.0928 46255.0861058001246420 1008018.651997560053 +929 0.0929 46154.4195893900614465 1005311.676203713985 +930 0.0930 46054.0233034037009929 1002614.043523492990 +931 0.0931 45953.8963155784367700 999925.712981808931 +932 0.0932 45854.0376977381092729 997246.643824737053 +933 0.0933 45754.4465257709671278 994576.795518076047 +934 0.0934 45655.1218796077664592 991916.127745938022 +935 0.0935 45556.0628432000012253 989264.600409322069 +936 0.0936 45457.2685044982936233 986622.173624766991 +937 0.0937 45358.7379554309081868 983988.807722919853 +938 0.0938 45260.4702918824041262 981364.463247230044 +939 0.0939 45162.4646136724186363 978749.100952500012 +940 0.0940 45064.7200245346102747 976142.681803605985 +941 0.0941 44967.2356320957260323 973545.166974131949 +942 0.0942 44870.0105478547702660 970956.517845022026 +943 0.0943 44773.0438871623555315 968376.696003305959 +944 0.0944 44676.3347692001552787 965805.663240736816 +945 0.0945 44579.8823169604947907 963243.381552493898 +946 0.0946 44483.6856572260730900 960689.813135927077 +947 0.0947 44387.7439205498158117 958144.920389245031 +948 0.0948 44292.0562412348372163 955608.665910264943 +949 0.0949 44196.6217573145695496 953081.012495103991 +950 0.0950 44101.4396105329651618 950561.923136977945 +951 0.0951 44006.5089463248732500 948051.361024921993 +952 0.0952 43911.8289137964966358 945549.289542560931 +953 0.0953 43817.3986657060231664 943055.672266887035 +954 0.0954 43723.2173584443225991 940570.472967054928 +955 0.0955 43629.2841520158108324 938093.655603144085 +956 0.0956 43535.5982100194014492 935625.184324977919 +957 0.0957 43442.1586996296100551 933165.023470914923 +958 0.0958 43348.9647915777313756 930713.137566696154 +959 0.0959 43256.0156601331837010 928269.491324236966 +960 0.0960 43163.3104830849479185 925834.049640491023 +961 0.0961 43070.8484417231084080 923406.777596260072 +962 0.0962 42978.6287208205394563 920987.640455093933 +963 0.0963 42886.6505086146789836 918576.603662086069 +964 0.0964 42794.9129967894332367 916173.632842814084 +965 0.0965 42703.4153804571833462 913778.693802139023 +966 0.0966 42612.1568581409155740 911391.752523149131 +967 0.0967 42521.1366317564534256 909012.775166041101 +968 0.0968 42430.3539065947989002 906641.728066982934 +969 0.0969 42339.8078913045974332 904278.577737092040 +970 0.0970 42249.4977978746828740 901923.290861252928 +971 0.0971 42159.4228416167607065 899575.834297162015 +972 0.0972 42069.5822411481931340 897236.175074130995 +973 0.0973 41979.9752183748787502 894904.280392158078 +974 0.0974 41890.6009984742340748 892580.117620742996 +975 0.0975 41801.4588098782987799 890263.654297949979 +976 0.0976 41712.5478842569355038 887954.858129310072 +977 0.0977 41623.8674565011315281 885653.696986805997 +978 0.0978 41535.4167647063950426 883360.138907867018 +979 0.0979 41447.1950501562896534 881074.152094305027 +980 0.0980 41359.2015573060052702 878795.704911367036 +981 0.0981 41271.4355337661036174 876524.765886684065 +982 0.0982 41183.8962302863001241 874261.303709313972 +983 0.0983 41096.5829007393986103 872005.287228715024 +984 0.0984 41009.4948021052696276 869756.685453813057 +985 0.0985 40922.6311944549815962 867515.467551996931 +986 0.0986 40835.9913409349755966 865281.602848140988 +987 0.0987 40749.5745077513856813 863055.060823683045 +988 0.0988 40663.3799641544173937 860835.811115645920 +989 0.0989 40577.4069824228499783 858623.823515707045 +990 0.0990 40491.6548378486040747 856419.067969243042 +991 0.0991 40406.1228087214185507 854221.514574397006 +992 0.0992 40320.8101763136437512 852031.133581170114 +993 0.0993 40235.7162248650638503 849847.895390497055 +994 0.0994 40150.8402415678719990 847671.770553320996 +995 0.0995 40066.1815165517182322 845502.729769697995 +996 0.0996 39981.7393428688374115 843340.743887895020 +997 0.0997 39897.5130164792717551 841185.783903490985 +998 0.0998 39813.5018362361734034 839037.820958502009 +999 0.0999 39729.7051038712234003 836896.826340481057 +1000 0.1000 39646.1221239801161573 834762.771481661010 +1001 0.1001 39562.7522040081312298 832635.627958073979 +1002 0.1002 39479.5946542357924045 830515.367488696938 +1003 0.1003 39396.6487877646286506 828401.961934586056 +1004 0.1004 39313.9139205030005542 826295.383298031986 +1005 0.1005 39231.3893711520140641 824195.603721715044 +1006 0.1006 39149.0744611915361020 822102.595487860963 +1007 0.1007 39066.9685148662756546 820016.331017413060 +1008 0.1008 38985.0708591719449032 817936.782869201037 +1009 0.1009 38903.3808238415294909 815863.923739121994 +1010 0.1010 38821.8977413316097227 813797.726459324011 +1011 0.1011 38740.6209468087763526 811738.163997394033 +1012 0.1012 38659.5497781361264060 809685.209455553908 +1013 0.1013 38578.6835758598535904 807638.836069860961 +1014 0.1014 38498.0216831958896364 805599.017209416023 +1015 0.1015 38417.5634460166402278 803565.726375574013 +1016 0.1016 38337.3082128378009656 801538.937201158958 +1017 0.1017 38257.2553348052606452 799518.623449692037 +1018 0.1018 38177.4041656820481876 797504.759014612064 +1019 0.1019 38097.7540618353887112 795497.317918518092 +1020 0.1020 38018.3043822238396388 793496.274312397931 +1021 0.1021 37939.0544883844777360 791501.602474879008 +1022 0.1022 37860.0037444201589096 789513.276811475982 +1023 0.1023 37781.1515169868944213 787531.271853839979 +1024 0.1024 37702.4971752812489285 785555.562259025988 +1025 0.1025 37624.0400910278622177 783586.122808751883 +1026 0.1026 37545.7796384669927647 781622.928408669075 +1027 0.1027 37467.7151943421777105 779665.954087630962 +1028 0.1028 37389.8461378879437689 777715.174996984075 +1029 0.1029 37312.1718508176054456 775770.566409841878 +1030 0.1030 37234.6917173110923613 773832.103720379993 +1031 0.1031 37157.4051240029148175 771899.762443123036 +1032 0.1032 37080.3114599701439147 769973.518212251947 +1033 0.1033 37003.4101167204862577 768053.346780902008 +1034 0.1034 36926.7004881804168690 766139.224020467023 +1035 0.1035 36850.1819706833994132 764231.125919924118 +1036 0.1036 36773.8539629581428017 762329.028585137101 +1037 0.1037 36697.7158661169742118 760432.908238191041 +1038 0.1038 36621.7670836442266591 758542.741216707975 +1039 0.1039 36546.0070213847284322 756658.503973186016 +1040 0.1040 36470.4350875323507353 754780.173074329970 +1041 0.1041 36395.0506926186135388 752907.725200394983 +1042 0.1042 36319.8532495013641892 751041.137144527980 +1043 0.1043 36244.8421733535287785 749180.385812119115 +1044 0.1044 36170.0168816519144457 747325.448220152990 +1045 0.1045 36095.3767941660771612 745476.301496566972 +1046 0.1046 36020.9213329472695477 743632.922879616031 +1047 0.1047 35946.6499223174250801 741795.289717230946 +1048 0.1048 35872.5619888582441490 739963.379466400016 +1049 0.1049 35798.6569614002946764 738137.169692534022 +1050 0.1050 35724.9342710122291464 736316.638068848057 +1051 0.1051 35651.3933509900016361 734501.762375747086 +1052 0.1052 35578.0336368462012615 732692.520500209997 +1053 0.1053 35504.8545662994292798 730888.890435184003 +1054 0.1054 35431.8555792637198465 729090.850278971018 +1055 0.1055 35359.0361178380408091 727298.378234641976 +1056 0.1056 35286.3956262958381558 725511.452609422966 +1057 0.1057 35213.9335510746604996 723730.051814117935 +1058 0.1058 35141.6493407658272190 721954.154362506000 +1059 0.1059 35069.5424461041620816 720183.738870769041 +1060 0.1060 34997.6123199577777996 718418.784056897974 +1061 0.1061 34925.8584173179260688 716659.268740127911 +1062 0.1062 34854.2801952888985397 714905.171840352006 +1063 0.1063 34782.8771130780005478 713156.472377564060 +1064 0.1064 34711.6486319855612237 711413.149471282028 +1065 0.1065 34640.5942153949945350 709675.182339992025 +1066 0.1066 34569.7133287629621918 707942.550300588948 +1067 0.1067 34499.0054396095438278 706215.232767818030 +1068 0.1068 34428.4700175084653893 704493.209253728040 +1069 0.1069 34358.1065340774221113 702776.459367119940 +1070 0.1070 34287.9144629684160464 701064.962813004968 +1071 0.1071 34217.8932798581590760 699358.699392064940 +1072 0.1072 34148.0424624385486823 697657.649000109988 +1073 0.1073 34078.3614904071655474 695961.791627552011 +1074 0.1074 34008.8498454578439123 694271.107358871028 +1075 0.1075 33939.5070112712928676 692585.576372088050 +1076 0.1076 33870.3324735057758517 690905.178938243072 +1077 0.1077 33801.3257197878192528 689229.895420877030 +1078 0.1078 33732.4862397030010470 687559.706275508972 +1079 0.1079 33663.8135247867685393 685894.592049133033 +1080 0.1080 33595.3070685153288650 684234.533379697939 +1081 0.1081 33526.9663662965613184 682579.510995612014 +1082 0.1082 33458.7909154610169935 680929.505715228966 +1083 0.1083 33390.7802152529402520 679284.498446353944 +1084 0.1084 33322.9337668213338475 677644.470185749000 +1085 0.1085 33255.2510732111113612 676009.402018634020 +1086 0.1086 33187.7316393542714650 674379.275118198944 +1087 0.1087 33120.3749720611085650 672754.070745119010 +1088 0.1088 33053.1805800114962040 671133.770247064997 +1089 0.1089 32986.1479737462286721 669518.355058233021 +1090 0.1090 32919.2766656583771692 667907.806698851055 +1091 0.1091 32852.5661699846968986 666302.106774720014 +1092 0.1092 32786.0160027971214731 664701.236976730055 +1093 0.1093 32719.6256819942645961 663105.179080402944 +1094 0.1094 32653.3947272929726751 661513.914945414988 +1095 0.1095 32587.3226602199465560 659927.426515143015 +1096 0.1096 32521.4090041033778107 658345.695816199994 +1097 0.1097 32455.6532840646686964 656768.704957982060 +1098 0.1098 32390.0550270101593924 655196.436132211005 +1099 0.1099 32324.6137616229243577 653628.871612485033 +1100 0.1100 32259.3290183546087064 652065.993753831950 +1101 0.1101 32194.2003294173046015 650507.784992261091 +1102 0.1102 32129.2272287754749414 648954.227844321984 +1103 0.1103 32064.4092521379243408 647405.304906668025 +1104 0.1104 31999.7459369498101296 645860.998855615035 +1105 0.1105 31935.2368223846933688 644321.292446707957 +1106 0.1106 31870.8814493366444367 642786.168514293968 +1107 0.1107 31806.6793604123740806 641255.609971089056 +1108 0.1108 31742.6300999234335904 639729.599807751016 +1109 0.1109 31678.7332138784222479 638208.121092465008 +1110 0.1110 31614.9882499752748117 636691.156970513985 +1111 0.1111 31551.3947575935562782 635178.690663862973 +1112 0.1112 31487.9522877868257638 633670.705470746965 +1113 0.1113 31424.6603932750258537 632167.184765257989 +1114 0.1114 31361.5186284369156056 630668.111996929976 +1115 0.1115 31298.5265493025508476 629173.470690336078 +1116 0.1116 31235.6837135458008561 627683.244444686919 +1117 0.1117 31172.9896804768941365 626197.416933416040 +1118 0.1118 31110.4440110350333271 624715.971903795958 +1119 0.1119 31048.0462677810173773 623238.893176528974 +1120 0.1120 30985.7960148899219348 621766.164645357989 +1121 0.1121 30923.6928181438197498 620297.770276671974 +1122 0.1122 30861.7362449245301832 618833.694109119009 +1123 0.1123 30799.9258642064123705 617373.920253211982 +1124 0.1124 30738.2612465492056799 615918.432890953962 +1125 0.1125 30676.7419640908847214 614467.216275444953 +1126 0.1126 30615.3675905405871163 613020.254730510060 +1127 0.1127 30554.1377011715449044 611577.532650317065 +1128 0.1128 30493.0518728140777966 610139.034498998895 +1129 0.1129 30432.1096838486118941 608704.744810289936 +1130 0.1130 30371.3107141987384239 607274.648187143030 +1131 0.1131 30310.6545453243124939 605848.729301369051 +1132 0.1132 30250.1407602145809506 604426.972893266007 +1133 0.1133 30189.7689433813538926 603009.363771257922 +1134 0.1134 30129.5386808522125648 601595.886811536970 +1135 0.1135 30069.4495601637499931 600186.526957690017 +1136 0.1136 30009.5011703548480000 598781.269220357062 +1137 0.1137 29949.6931019599869614 597380.098676864058 +1138 0.1138 29890.0249470025992196 595983.000470884028 +1139 0.1139 29830.4962989884515991 594589.959812068031 +1140 0.1140 29771.1067528990643041 593200.961975710001 +1141 0.1141 29711.8559051851589174 591815.992302397965 +1142 0.1142 29652.7433537601573335 590435.036197663983 +1143 0.1143 29593.7686979936916032 589058.079131648992 +1144 0.1144 29534.9315387051719881 587685.106638756930 +1145 0.1145 29476.2314781573695655 586316.104317321908 +1146 0.1146 29417.6681200500388513 584951.057829267927 +1147 0.1147 29359.2410695135877177 583589.952899776981 +1148 0.1148 29300.9499331027509470 582232.775316956919 +1149 0.1149 29242.7943187903292710 580879.510931511060 +1150 0.1150 29184.7738359609320469 579530.145656408975 +1151 0.1151 29126.8880954047817795 578184.665466565988 +1152 0.1152 29069.1367093115295575 576843.056398511049 +1153 0.1153 29011.5192912640995928 575505.304550070083 +1154 0.1154 28954.0354562325919687 574171.396080048988 +1155 0.1155 28896.6848205681926629 572841.317207906977 +1156 0.1156 28839.4670019971235888 571515.054213448078 +1157 0.1157 28782.3816196146253787 570192.593436502037 +1158 0.1158 28725.4282938789692707 568873.921276616049 +1159 0.1159 28668.6066466055017372 567559.024192741956 +1160 0.1160 28611.9163009607182175 566247.888702925993 +1161 0.1161 28555.3568814563732303 564940.501384005998 +1162 0.1162 28498.9280139436086756 563636.848871304072 +1163 0.1163 28442.6293256071257929 562336.917858326109 +1164 0.1164 28386.4604449593862228 561040.695096455049 +1165 0.1165 28330.4210018348312587 559748.167394660064 +1166 0.1166 28274.5106273841374787 558459.321619190043 +1167 0.1167 28218.7289540685123939 557174.144693284994 +1168 0.1168 28163.0756156540046504 555892.623596877092 +1169 0.1169 28107.5502472058469721 554614.745366301038 +1170 0.1170 28052.1524850828318449 553340.497094004997 +1171 0.1171 27996.8819669317199441 552069.865928255022 +1172 0.1172 27941.7383316816631122 550802.839072859031 +1173 0.1173 27886.7212195386782696 549539.403786869021 +1174 0.1174 27831.8302719801176863 548279.547384307953 +1175 0.1175 27777.0651317492083763 547023.257233883021 +1176 0.1176 27722.4254428495805769 545770.520758708008 +1177 0.1177 27667.9108505398435227 544521.325436015031 +1178 0.1178 27613.5210013281975989 543275.658796895063 +1179 0.1179 27559.2555429670537706 542033.508426008048 +1180 0.1180 27505.1141244476893917 540794.861961313058 +1181 0.1181 27451.0963959949331183 539559.707093801931 +1182 0.1182 27397.2020090618825634 538328.031567219994 +1183 0.1183 27343.4306163246328651 537099.823177805054 +1184 0.1184 27289.7818716770416358 535875.069774013944 +1185 0.1185 27236.2554302255266521 534653.759256264078 +1186 0.1186 27182.8509482838817348 533435.879576659063 +1187 0.1187 27129.5680833681108197 532221.418738738983 +1188 0.1188 27076.4064941913129587 531010.364797209040 +1189 0.1189 27023.3658406585673220 529802.705857682042 +1190 0.1190 26970.4457838618618553 528598.430076428922 +1191 0.1191 26917.6459860750364896 527397.525660109008 +1192 0.1192 26864.9661107487554546 526199.980865526013 +1193 0.1193 26812.4058225055123330 525005.783999370993 +1194 0.1194 26759.9647871346460306 523814.923417967046 +1195 0.1195 26707.6426715873967623 522627.387527025014 +1196 0.1196 26655.4391439719765913 521443.164781393018 +1197 0.1197 26603.3538735486654332 520262.243684803019 +1198 0.1198 26551.3865307249434409 519084.612789632054 +1199 0.1199 26499.5367870506306645 517910.260696655023 +1200 0.1200 26447.8043152130594535 516739.176054804004 +1201 0.1201 26396.1887890322723251 515571.347560920985 +1202 0.1202 26344.6898834562489355 514406.763959519041 +1203 0.1203 26293.3072745561439660 513245.414042550023 +1204 0.1204 26242.0406395215577504 512087.286649158050 +1205 0.1205 26190.8896566558287304 510932.370665450988 +1206 0.1206 26139.8540053713441011 509780.655024259002 +1207 0.1207 26088.9333661848868360 508632.128704904986 +1208 0.1208 26038.1274207129936258 507486.780732974003 +1209 0.1209 25987.4358516673419217 506344.600180075970 +1210 0.1210 25936.8583428501551680 505205.576163625985 +1211 0.1211 25886.3945791496444144 504069.697846606025 +1212 0.1212 25836.0442465354462911 502936.954437347944 +1213 0.1213 25785.8070320541155525 501807.335189298028 +1214 0.1214 25735.6826238246103458 500680.829400803021 +1215 0.1215 25685.6707110338247730 499557.426414882066 +1216 0.1216 25635.7709839321323670 498437.115618998010 +1217 0.1217 25585.9831338289404812 497319.886444858043 +1218 0.1218 25536.3068530882883351 496205.728368169046 +1219 0.1219 25486.7418351244596124 495094.630908440042 +1220 0.1220 25437.2877743975986959 493986.583628752036 +1221 0.1221 25387.9443664093851112 492881.576135555049 +1222 0.1222 25338.7113076986861415 491779.598078440002 +1223 0.1223 25289.5882958372676512 490680.639149940980 +1224 0.1224 25240.5750294255049084 489584.689085314050 +1225 0.1225 25191.6712080881225120 488491.737662323983 +1226 0.1226 25142.8765324699525081 487401.774701049027 +1227 0.1227 25094.1907042317179730 486314.790063656983 +1228 0.1228 25045.6134260458238714 485230.773654210032 +1229 0.1229 24997.1444015921915707 484149.715418452048 +1230 0.1230 24948.7833355540897173 483071.605343610980 +1231 0.1231 24900.5299336140014930 481996.433458185056 +1232 0.1232 24852.3839024495027843 480924.189831754018 +1233 0.1233 24804.3449497291767329 479854.864574767998 +1234 0.1234 24756.4127841085210093 478788.447838351014 +1235 0.1235 24708.5871152258987422 477724.929814103991 +1236 0.1236 24660.8676536984967242 476664.300733903947 +1237 0.1237 24613.2541111183163594 475606.550869711034 +1238 0.1238 24565.7462000481609721 474551.670533370052 +1239 0.1239 24518.3436340176704107 473499.650076418009 +1240 0.1240 24471.0461275193556503 472450.479889890063 +1241 0.1241 24423.8533960046552238 471404.150404132030 +1242 0.1242 24376.7651558800171188 470360.652088598057 +1243 0.1243 24329.7811245030025020 469319.975451678038 +1244 0.1244 24282.9010201783930825 468282.111040490039 +1245 0.1245 24236.1245621543348534 467247.049440708011 +1246 0.1246 24189.4514706184818351 466214.781276364054 +1247 0.1247 24142.8814666941798350 465185.297209671000 +1248 0.1248 24096.4142724366538459 464158.587940833066 +1249 0.1249 24050.0496108292172721 463134.644207864010 +1250 0.1250 24003.7872057795029832 462113.456786404015 +1251 0.1251 23957.6267821157052822 461095.016489536967 +1252 0.1252 23911.5680655828473391 460079.314167614037 +1253 0.1253 23865.6107828390631767 459066.340708071017 +1254 0.1254 23819.7546614518978458 458056.087035248987 +1255 0.1255 23773.9994298946257913 457048.544110219984 +1256 0.1256 23728.3448175425837690 456043.702930607018 +1257 0.1257 23682.7905546695328667 455041.554530414927 +1258 0.1258 23637.3363724440205260 454042.089979845041 +1259 0.1259 23591.9820029257716669 453045.300385135051 +1260 0.1260 23546.7271790620980028 452051.176888371992 +1261 0.1261 23501.5716346843109932 451059.710667336010 +1262 0.1262 23456.5151045041784528 450070.892935316078 +1263 0.1263 23411.5573241103666078 449084.714940948004 +1264 0.1264 23366.6980299649185326 448101.167968044057 +1265 0.1265 23321.9369593997435004 447120.243335424922 +1266 0.1266 23277.2738506131354370 446141.932396751072 +1267 0.1267 23232.7084426662804617 445166.226540360949 +1268 0.1268 23188.2404754798080830 444193.117189103039 +1269 0.1269 23143.8696898303460330 443222.595800167997 +1270 0.1270 23099.5958273470896529 442254.653864936030 +1271 0.1271 23055.4186305084040214 441289.282908802968 +1272 0.1272 23011.3378426384115301 440326.474491027999 +1273 0.1273 22967.3532079036303912 439366.220204562997 +1274 0.1274 22923.4644713096058695 438408.511675905029 +1275 0.1275 22879.6713786975633411 437453.340564931044 +1276 0.1276 22835.9736767410795437 436500.698564734950 +1277 0.1277 22792.3711129427683773 435550.577401480055 +1278 0.1278 22748.8634356309812574 434602.968834241037 +1279 0.1279 22705.4503939565256587 433657.864654839970 +1280 0.1280 22662.1317378893982095 432715.256687703950 +1281 0.1281 22618.9072182155287010 431775.136789702985 +1282 0.1282 22575.7765865335422859 430837.496850000985 +1283 0.1283 22532.7395952515471436 429902.328789903026 +1284 0.1284 22489.7959975839185063 428969.624562703015 +1285 0.1285 22446.9455475481081521 428039.376153534977 +1286 0.1286 22404.1879999614720873 427111.575579222001 +1287 0.1287 22361.5231104381055047 426186.214888131013 +1288 0.1288 22318.9506353856995702 425263.286160019925 +1289 0.1289 22276.4703320024054847 424342.781505895953 +1290 0.1290 22234.0819582737167366 423424.693067861954 +1291 0.1291 22191.7852729693731817 422509.013018981030 +1292 0.1292 22149.5800356402687612 421595.733563123038 +1293 0.1293 22107.4660066153701337 420684.846934824018 +1294 0.1294 22065.4429469986716867 419776.345399144979 +1295 0.1295 22023.5106186661396350 418870.221251526033 +1296 0.1296 21981.6687842626815836 417966.466817646055 +1297 0.1297 21939.9172071991342818 417065.074453286012 +1298 0.1298 21898.2556516492622904 416166.036544181989 +1299 0.1299 21856.6838825467602874 415269.345505887992 +1300 0.1300 21815.2016655822844768 414374.993783643993 +1301 0.1301 21773.8087672004912747 413482.973852225987 +1302 0.1302 21732.5049545970905456 412593.278215822997 +1303 0.1303 21691.2899957159061159 411705.899407887016 +1304 0.1304 21650.1636592459617532 410820.829991008970 +1305 0.1305 21609.1257146185707825 409938.062556774996 +1306 0.1306 21568.1759320044511696 409057.589725638041 +1307 0.1307 21527.3140823108296900 408179.404146785033 +1308 0.1308 21486.5399371785897529 407303.498497997003 +1309 0.1309 21445.8532689794119506 406429.865485524992 +1310 0.1310 21405.2538508129364345 405558.497843955993 +1311 0.1311 21364.7414565039362060 404689.388336081989 +1312 0.1312 21324.3158605994940444 403822.529752767994 +1313 0.1313 21283.9768383662158158 402957.914912828011 +1314 0.1314 21243.7241657874292287 402095.536662893021 +1315 0.1315 21203.5576195604189707 401235.387877283036 +1316 0.1316 21163.4769770936618443 400377.461457880971 +1317 0.1317 21123.4820165040691791 399521.750334005046 +1318 0.1318 21083.5725166142547096 398668.247462289990 +1319 0.1319 21043.7482569498133671 397816.945826548035 +1320 0.1320 21004.0090177366037096 396967.838437656057 +1321 0.1321 20964.3545798980485415 396120.918333431007 +1322 0.1322 20924.7847250524537230 395276.178578498017 +1323 0.1323 20885.2992355103197042 394433.612264180963 +1324 0.1324 20845.8978942716930760 393593.212508365978 +1325 0.1325 20806.5804850235035701 392754.972455394978 +1326 0.1326 20767.3467921369374380 391918.885275935056 +1327 0.1327 20728.1966006647962786 391084.944166861009 +1328 0.1328 20689.1296963388958829 390253.142351138988 +1329 0.1329 20650.1458655674541660 389423.473077703035 +1330 0.1330 20611.2448954325009254 388595.929621341988 +1331 0.1331 20572.4265736873057904 387770.505282581027 +1332 0.1332 20533.6906887537988950 386947.193387559033 +1333 0.1333 20495.0370297200242931 386125.987287920958 +1334 0.1334 20456.4653863375933724 385306.880360698968 +1335 0.1335 20417.9755490191491845 384489.866008194978 +1336 0.1336 20379.5673088358453242 383674.937657869013 +1337 0.1337 20341.2404575148393633 382862.088762225001 +1338 0.1338 20302.9947874367935583 382051.312798699015 +1339 0.1339 20264.8300916333828354 381242.603269541985 +1340 0.1340 20226.7461637848209648 380435.953701717022 +1341 0.1341 20188.7427982173976488 379631.357646775024 +1342 0.1342 20150.8197899010228866 378828.808680755959 +1343 0.1343 20112.9769344467822521 378028.300404071982 +1344 0.1344 20075.2140281045103620 377229.826441398996 +1345 0.1345 20037.5308677603607066 376433.380441571004 +1346 0.1346 19999.9272509344082209 375638.956077466020 +1347 0.1347 19962.4029757782409433 374846.547045902000 +1348 0.1348 19924.9578410725698632 374056.147067527985 +1349 0.1349 19887.5916462248569587 373267.749886717007 +1350 0.1350 19850.3041912669468729 372481.349271464976 +1351 0.1351 19813.0952768527095031 371696.939013275027 +1352 0.1352 19775.9647042556935048 370914.512927061005 +1353 0.1353 19738.9122753667870711 370134.064851039962 +1354 0.1354 19701.9377926919041784 369355.588646628021 +1355 0.1355 19665.0410593496562797 368579.078198335017 +1356 0.1356 19628.2218790690567403 367804.527413666015 +1357 0.1357 19591.4800561872216349 367031.930223015021 +1358 0.1358 19554.8153956470923731 366261.280579564977 +1359 0.1359 19518.2277029951546865 365492.572459184041 +1360 0.1360 19481.7167843791794439 364725.799860329018 +1361 0.1361 19445.2824465459671046 363960.956803938956 +1362 0.1362 19408.9244968391030852 363198.037333342945 +1363 0.1363 19372.6427431967276789 362437.035514154995 +1364 0.1364 19336.4369941493096121 361677.945434172987 +1365 0.1365 19300.3070588174377917 360920.761203292001 +1366 0.1366 19264.2527469096021377 360165.476953392965 +1367 0.1367 19228.2738687200217100 359412.086838252028 +1368 0.1368 19192.3702351264364552 358660.585033445037 +1369 0.1369 19156.5416575879535230 357910.965736248007 +1370 0.1370 19120.7879481428644795 357163.223165542004 +1371 0.1371 19085.1089194065025367 356417.351561720017 +1372 0.1372 19049.5043845690888702 355673.345186588995 +1373 0.1373 19013.9741573935971246 354931.198323277000 +1374 0.1374 18978.5180522136251966 354190.905276139965 +1375 0.1375 18943.1358839312852069 353452.460370667977 +1376 0.1376 18907.8274680150825588 352715.857953391969 +1377 0.1377 18872.5926204978241003 351981.092391790007 +1378 0.1378 18837.4311579745262861 351248.158074200968 +1379 0.1379 18802.3428976003306161 350517.049409724015 +1380 0.1380 18767.3276570884372632 349787.760828134022 +1381 0.1381 18732.3852547080423392 349060.286779791000 +1382 0.1382 18697.5155092822751612 348334.621735547029 +1383 0.1383 18662.7182401861646213 347610.760186658998 +1384 0.1384 18627.9932673445982800 346888.696644698037 +1385 0.1385 18593.3404112302887370 346168.425641460984 +1386 0.1386 18558.7594928617727419 345449.941728882026 +1387 0.1387 18524.2503338013812026 344733.239478947013 +1388 0.1388 18489.8127561532528489 344018.313483600970 +1389 0.1389 18455.4465825613406196 343305.158354668994 +1390 0.1390 18421.1516362074180506 342593.768723762012 +1391 0.1391 18386.9277408091220423 341884.139242194011 +1392 0.1392 18352.7747206179665227 341176.264580897987 +1393 0.1393 18318.6924004174034053 340470.139430337003 +1394 0.1394 18284.6806055208653561 339765.758500422991 +1395 0.1395 18250.7391617698231130 339063.116520430020 +1396 0.1396 18216.8678955318573571 338362.208238911990 +1397 0.1397 18183.0666336987305840 337663.028423618060 +1398 0.1398 18149.3352036844808026 336965.571861409000 +1399 0.1399 18115.6734334235006827 336269.833358176984 +1400 0.1400 18082.0811513686530816 335575.807738761010 +1401 0.1401 18048.5581864893720194 334883.489846865996 +1402 0.1402 18015.1043682697782060 334192.874544978957 +1403 0.1403 17981.7195267068127578 333503.956714294967 +1404 0.1404 17948.4034923083672766 332816.731254626997 +1405 0.1405 17915.1560960914175666 332131.193084332976 +1406 0.1406 17881.9771695801900933 331447.337140234013 +1407 0.1407 17848.8665448043029755 330765.158377530985 +1408 0.1408 17815.8240542969397211 330084.651769732009 +1409 0.1409 17782.8495310930229607 329405.812308572000 +1410 0.1410 17749.9428087273990968 328728.635003929026 +1411 0.1411 17717.1037212330156763 328053.114883755043 +1412 0.1412 17684.3321031391278666 327379.246993991022 +1413 0.1413 17651.6277894695049326 326707.026398491987 +1414 0.1414 17618.9906157406330749 326036.448178955994 +1415 0.1415 17586.4204179599437339 325367.507434838975 +1416 0.1416 17553.9170326240382565 324700.199283284019 +1417 0.1417 17521.4802967169234762 324034.518859043950 +1418 0.1418 17489.1100477082509315 323370.461314409971 +1419 0.1419 17456.8061235515742737 322708.021819129994 +1420 0.1420 17424.5683626825993997 322047.195560340013 +1421 0.1421 17392.3966040174564114 321387.977742488030 +1422 0.1422 17360.2906869509679382 320730.363587258034 +1423 0.1423 17328.2504513549283729 320074.348333503003 +1424 0.1424 17296.2757375763940217 319419.927237165975 +1425 0.1425 17264.3663864359768922 318767.095571206999 +1426 0.1426 17232.5222392261384812 318115.848625535960 +1427 0.1427 17200.7431377095163043 317466.181706939009 +1428 0.1428 17169.0289241172176844 316818.090139002015 +1429 0.1429 17137.3794411471644707 316171.569262047997 +1430 0.1430 17105.7945319624086551 315526.614433057024 +1431 0.1431 17074.2740401894770912 314883.221025603008 +1432 0.1432 17042.8178099167089385 314241.384429780010 +1433 0.1433 17011.4256856926149339 313601.100052133959 +1434 0.1434 16980.0975125242293871 312962.363315591007 +1435 0.1435 16948.8331358754803659 312325.169659390987 +1436 0.1436 16917.6324016655598825 311689.514539016993 +1437 0.1437 16886.4951562673013541 311055.393426127965 +1438 0.1438 16855.4212465055716166 310422.801808487973 +1439 0.1439 16824.4105196556520241 309791.735189903993 +1440 0.1440 16793.4628234416486521 309162.189090151980 +1441 0.1441 16762.5780060348952247 308534.159044914006 +1442 0.1442 16731.7559160523633182 307907.640605709981 +1443 0.1443 16700.9964025550871156 307282.629339828971 +1444 0.1444 16670.2993150465808867 306659.120830268948 +1445 0.1445 16639.6645034712855704 306037.110675667005 +1446 0.1446 16609.0918182129898923 305416.594490231946 +1447 0.1447 16578.5811100932951376 304797.567903682997 +1448 0.1448 16548.1322303700508201 304180.026561181992 +1449 0.1449 16517.7450307358267310 303563.966123271035 +1450 0.1450 16487.4193633163740742 302949.382265808992 +1451 0.1451 16457.1550806690902391 302336.270679901994 +1452 0.1452 16426.9520357815017633 301724.627071848023 +1453 0.1453 16396.8100820697545714 301114.447163064964 +1454 0.1454 16366.7290733770987572 300505.726690036012 +1455 0.1455 16336.7088639723842789 299898.461404239992 +1456 0.1456 16306.7493085485675692 299292.647072092979 +1457 0.1457 16276.8502622212181450 298688.279474884970 +1458 0.1458 16247.0115805270379497 298085.354408718005 +1459 0.1459 16217.2331194223806961 297483.867684443947 +1460 0.1460 16187.5147352817784849 296883.815127606038 +1461 0.1461 16157.8562848964793375 296285.192578374001 +1462 0.1462 16128.2576254729865468 295687.995891486993 +1463 0.1463 16098.7186146316034865 295092.220936189988 +1464 0.1464 16069.2391104049856949 294497.863596178009 +1465 0.1465 16039.8189712367002357 293904.919769530999 +1466 0.1466 16010.4580559797905153 293313.385368657997 +1467 0.1467 15981.1562238953465567 292723.256320238987 +1468 0.1468 15951.9133346510770934 292134.528565162967 +1469 0.1469 15922.7292483198962145 291547.198058468988 +1470 0.1470 15893.6038253785081906 290961.260769291024 +1471 0.1471 15864.5369267060032143 290376.712680797034 +1472 0.1472 15835.5284135824567784 289793.549790133955 +1473 0.1473 15806.5781476875308726 289211.768108367978 +1474 0.1474 15777.6859910990915523 288631.363660425995 +1475 0.1475 15748.8518062918174110 288052.332485044026 +1476 0.1476 15720.0754561358298815 287474.670634704002 +1477 0.1477 15691.3568038953162613 286898.374175579986 +1478 0.1478 15662.6957132271636510 286323.439187486016 +1479 0.1479 15634.0920481795983505 285749.861763812951 +1480 0.1480 15605.5456731908343500 285177.638011481031 +1481 0.1481 15577.0564530877163634 284606.764050871949 +1482 0.1482 15548.6242530843828717 284037.236015790957 +1483 0.1483 15520.2489387809237087 283469.050053396961 +1484 0.1484 15491.9303761620467412 282902.202324156999 +1485 0.1485 15463.6684315957500075 282336.689001785009 +1486 0.1486 15435.4629718320011307 281772.506273195031 +1487 0.1487 15407.3138640014185512 281209.650338443986 +1488 0.1488 15379.2209756139618548 280648.117410675040 +1489 0.1489 15351.1841745576239191 280087.903716070985 +1490 0.1490 15323.2033290971303359 279529.005493793986 +1491 0.1491 15295.2783078726442909 278971.418995938031 +1492 0.1492 15267.4089798984732624 278415.140487474971 +1493 0.1493 15239.5952145617902715 277860.166246202018 +1494 0.1494 15211.8368816213460377 277306.492562689004 +1495 0.1495 15184.1338512062011432 276754.115740226989 +1496 0.1496 15156.4859938144509215 276203.032094775990 +1497 0.1497 15128.8931803119667165 275653.237954917946 +1498 0.1498 15101.3552819311316853 275104.729661797988 +1499 0.1499 15073.8721702695875138 274557.503569082008 +1500 0.1500 15046.4437172889884096 274011.556042896991 +1501 0.1501 15019.0697953137532750 273466.883461789985 +1502 0.1502 14991.7502770298306132 272923.482216670993 +1503 0.1503 14964.4850354834579775 272381.348710766993 +1504 0.1504 14937.2739440799414297 271840.479359567980 +1505 0.1505 14910.1168765824240836 271300.870590784994 +1506 0.1506 14883.0137071106710209 270762.518844294013 +1507 0.1507 14855.9643101398523868 270225.420572086994 +1508 0.1508 14828.9685604993374000 269689.572238230030 +1509 0.1509 14802.0263333714847249 269154.970318806008 +1510 0.1510 14775.1375042904510337 268621.611301874975 +1511 0.1511 14748.3019491409868351 268089.491687415983 +1512 0.1512 14721.5195441572523123 267558.607987290015 +1513 0.1513 14694.7901659216277039 267028.956725184980 +1514 0.1514 14668.1136913635400560 266500.534436571004 +1515 0.1515 14641.4899977582790598 265973.337668652006 +1516 0.1516 14614.9189627258310793 265447.362980321981 +1517 0.1517 14588.4004642297095415 264922.606942113023 +1518 0.1518 14561.9343805757962400 264399.066136152949 +1519 0.1519 14535.5205904111826385 263876.737156116986 +1520 0.1520 14509.1589727230166318 263355.616607184988 +1521 0.1521 14482.8494068373584014 262835.701105988992 +1522 0.1522 14456.5917724180308142 262316.987280572008 +1523 0.1523 14430.3859494654843729 261799.471770346980 +1524 0.1524 14404.2318183156658051 261283.151226039976 +1525 0.1525 14378.1292596388811944 260768.022309655003 +1526 0.1526 14352.0781544386773021 260254.081694427005 +1527 0.1527 14326.0783840507174318 259741.326064772991 +1528 0.1528 14300.1298301416663890 259229.752116253978 +1529 0.1529 14274.2323747080772591 258719.356555524981 +1530 0.1530 14248.3859000752854627 258210.136100295000 +1531 0.1531 14222.5902888963064470 257702.087479281996 +1532 0.1532 14196.8454241507333791 257195.207432166993 +1533 0.1533 14171.1511891436475707 256689.492709556012 +1534 0.1534 14145.5074675045234471 256184.940072931000 +1535 0.1535 14119.9141431861462479 255681.546294608037 +1536 0.1536 14094.3711004635315476 255179.308157702966 +1537 0.1537 14068.8782239328429569 254678.222456071991 +1538 0.1538 14043.4353985103243758 254178.285994283971 +1539 0.1539 14018.0425094312322472 253679.495587576006 +1540 0.1540 13992.6994422487623524 253181.848061803961 +1541 0.1541 13967.4060828330020740 252685.340253403992 +1542 0.1542 13942.1623173698644678 252189.969009358028 +1543 0.1543 13916.9680323600387055 251695.731187142024 +1544 0.1544 13891.8231146179477946 251202.623654689989 +1545 0.1545 13866.7274512706953828 250710.643290349981 +1546 0.1546 13841.6809297570362105 250219.786982849997 +1547 0.1547 13816.6834378263320104 249730.051631247974 +1548 0.1548 13791.7348635375255981 249241.434144897969 +1549 0.1549 13766.8350952581113233 248753.931443405017 +1550 0.1550 13741.9840216631109797 248267.540456590999 +1551 0.1551 13717.1815317340588081 247782.258124449989 +1552 0.1552 13692.4275147579810437 247298.081397106987 +1553 0.1553 13667.7218603263863770 246815.007234783028 +1554 0.1554 13643.0644583342600527 246333.032607754983 +1555 0.1555 13618.4551989790561493 245852.154496311996 +1556 0.1556 13593.8939727597044111 245372.369890721020 +1557 0.1557 13569.3806704756098043 244893.675791187037 +1558 0.1558 13544.9151832256593480 244416.069207810971 +1559 0.1559 13520.4974024072416796 243939.547160556016 +1560 0.1560 13496.1272197152538865 243464.106679205986 +1561 0.1561 13471.8045271411265276 242989.744803326030 +1562 0.1562 13447.5292169718486548 242516.458582230960 +1563 0.1563 13423.3011817889910162 242044.245074938022 +1564 0.1564 13399.1203144677365344 241573.101350138983 +1565 0.1565 13374.9865081759216991 241103.024486153998 +1566 0.1566 13350.8996563730688649 240634.011570900999 +1567 0.1567 13326.8596528094312816 240166.059701850987 +1568 0.1568 13302.8663915250381251 239699.165986002015 +1569 0.1569 13278.9197668487468036 239233.327539830003 +1570 0.1570 13255.0196733972916263 238768.541489262017 +1571 0.1571 13231.1660060743470240 238304.804969632009 +1572 0.1572 13207.3586600695834932 237842.115125651006 +1573 0.1573 13183.5975308577326359 237380.469111365965 +1574 0.1574 13159.8825141976576560 236919.864090127987 +1575 0.1575 13136.2135061314238555 236460.297234553029 +1576 0.1576 13112.5904029833727691 236001.765726484999 +1577 0.1577 13089.0131013591999363 235544.266756964964 +1578 0.1578 13065.4814981450417690 235087.797526195034 +1579 0.1579 13041.9954905065569619 234632.355243497004 +1580 0.1580 13018.5549758880169975 234177.937127284997 +1581 0.1581 12995.1598520114021085 233724.540405025997 +1582 0.1582 12971.8100168754899641 233272.162313206005 +1583 0.1583 12948.5053687549643655 232820.800097297004 +1584 0.1584 12925.2458061995130265 232370.451011719008 +1585 0.1585 12902.0312280329362693 231921.112319809035 +1586 0.1586 12878.8615333522557194 231472.781293786014 +1587 0.1587 12855.7366215268302767 231025.455214715970 +1588 0.1588 12832.6563921974702680 230579.131372478994 +1589 0.1589 12809.6207452755588747 230133.807065736997 +1590 0.1590 12786.6295809421771992 229689.479601894971 +1591 0.1591 12763.6827996472293307 229246.146297072992 +1592 0.1592 12740.7803021085728687 228803.804476070014 +1593 0.1593 12717.9219893111530837 228362.451472334011 +1594 0.1594 12695.1077625061407161 227922.084627925011 +1595 0.1595 12672.3375232100697758 227482.701293484017 +1596 0.1596 12649.6111732039862545 227044.298828199971 +1597 0.1597 12626.9286145325877442 226606.874599777977 +1598 0.1598 12604.2897495033776067 226170.425984406960 +1599 0.1599 12581.6944806858209631 225734.950366726029 +1600 0.1600 12559.1427109104952251 225300.445139793999 +1601 0.1601 12536.6343432682533603 224866.907705056015 +1602 0.1602 12514.1692811093853379 224434.335472312989 +1603 0.1603 12491.7474280427850317 224002.725859687984 +1604 0.1604 12469.3686879351207608 223572.076293597987 +1605 0.1605 12447.0329649100040115 223142.384208720003 +1606 0.1606 12424.7401633471708919 222713.647047957988 +1607 0.1607 12402.4901878816526732 222285.862262415991 +1608 0.1608 12380.2829434029627009 221859.027311365993 +1609 0.1609 12358.1183350542833068 221433.139662213973 +1610 0.1610 12335.9962682316490827 221008.196790474001 +1611 0.1611 12313.9166485831392492 220584.196179731021 +1612 0.1612 12291.8793820080718433 220161.135321618989 +1613 0.1613 12269.8843746562015440 219739.011715782981 +1614 0.1614 12247.9315329269193171 219317.822869853029 +1615 0.1615 12226.0207634684556979 218897.566299413040 +1616 0.1616 12204.1519731770858925 218478.239527969970 +1617 0.1617 12182.3250691963403369 218059.840086926532 +1618 0.1618 12160.5399589162170741 217642.365515548503 +1619 0.1619 12138.7965499723923131 217225.813360935979 +1620 0.1620 12117.0947502454455389 216810.181177995924 +1621 0.1621 12095.4344678600755287 216395.466529411293 +1622 0.1622 12073.8156111843236431 215981.666985612013 +1623 0.1623 12052.2380888288062124 215568.780124744575 +1624 0.1624 12030.7018096459360095 215156.803532646736 +1625 0.1625 12009.2066827291637310 214745.734802814317 +1626 0.1626 11987.7526174122049269 214335.571536375966 +1627 0.1627 11966.3395232682833011 213926.311342064786 +1628 0.1628 11944.9673101093703735 213517.951836185326 +1629 0.1629 11923.6358879854324186 213110.490642591089 +1630 0.1630 11902.3451671836701280 212703.925392653095 +1631 0.1631 11881.0950582277764624 212298.253725232120 +1632 0.1632 11859.8854718771817716 211893.473286651017 +1633 0.1633 11838.7163191263152839 211489.581730667793 +1634 0.1634 11817.5875112038593215 211086.576718447905 +1635 0.1635 11796.4989595720107900 210684.455918533728 +1636 0.1636 11775.4505759257426689 210283.217006821185 +1637 0.1637 11754.4422721920745971 209882.857666529191 +1638 0.1638 11733.4739605293398199 209483.375588175171 +1639 0.1639 11712.5455533264539554 209084.768469546107 +1640 0.1640 11691.6569632021928555 208687.034015673271 +1641 0.1641 11670.8081030044686486 208290.169938802486 +1642 0.1642 11649.9988858096094191 207894.173958368599 +1643 0.1643 11629.2292249216425262 207499.043800973042 +1644 0.1644 11608.4990338715761027 207104.777200348122 +1645 0.1645 11587.8082264166914683 206711.371897339908 +1646 0.1646 11567.1567165398300858 206318.825639878807 +1647 0.1647 11546.5444184486877930 205927.136182948831 +1648 0.1648 11525.9712465751126729 205536.301288570510 +1649 0.1649 11505.4371155743956479 205146.318725764286 +1650 0.1650 11484.9419403245810827 204757.186270534410 +1651 0.1651 11464.4856359257628355 204368.901705837168 +1652 0.1652 11444.0681176993930421 203981.462821557187 +1653 0.1653 11423.6893011875908996 203594.867414484004 +1654 0.1654 11403.3491021524532698 203209.113288281253 +1655 0.1655 11383.0474365753652819 202824.198253465758 +1656 0.1656 11362.7842206563236687 202440.120127381873 +1657 0.1657 11342.5593708132455504 202056.876734175894 +1658 0.1658 11322.3728036812990467 201674.465904769080 +1659 0.1659 11302.2244361122193368 201292.885476837517 +1660 0.1660 11282.1141851736392709 200912.133294781379 +1661 0.1661 11262.0419681484145258 200532.207209704095 +1662 0.1662 11242.0077025339596730 200153.105079390458 +1663 0.1663 11222.0113060415769723 199774.824768273218 +1664 0.1664 11202.0526965957924403 199397.364147418004 +1665 0.1665 11182.1317923336973763 199020.721094493521 +1666 0.1666 11162.2485116042844311 198644.893493751995 +1667 0.1667 11142.4027729677964089 198269.879235997680 +1668 0.1668 11122.5944951950677932 197895.676218572189 +1669 0.1669 11102.8235972668735485 197522.282345322659 +1670 0.1670 11083.0899983732779219 197149.695526583819 +1671 0.1671 11063.3936179129905213 196777.913679151738 +1672 0.1672 11043.7343754927205737 196406.934726257896 +1673 0.1673 11024.1121909265293652 196036.756597550382 +1674 0.1674 11004.5269842351990519 195667.377229068807 +1675 0.1675 10984.9786756455850991 195298.794563220115 +1676 0.1676 10965.4671855899869115 194931.006548756617 +1677 0.1677 10945.9924347055111866 194564.011140752002 +1678 0.1678 10926.5543438334443636 194197.806300578028 +1679 0.1679 10907.1528340186214336 193832.389995884383 +1680 0.1680 10887.7878265087983891 193467.760200571327 +1681 0.1681 10868.4592427540319477 193103.914894771908 +1682 0.1682 10849.1670044060520013 192740.852064826002 +1683 0.1683 10829.9110333176486165 192378.569703259622 +1684 0.1684 10810.6912515420481213 192017.065808762476 +1685 0.1685 10791.5075813323019247 191656.338386162999 +1686 0.1686 10772.3599451406735170 191296.385446411034 +1687 0.1687 10753.2482656180254708 190937.205006550706 +1688 0.1688 10734.1724656132137170 190578.795089702297 +1689 0.1689 10715.1324681724763650 190221.153725036216 +1690 0.1690 10696.1281965388370736 189864.278947758401 +1691 0.1691 10677.1595741514956899 189508.168799078092 +1692 0.1692 10658.2265246452316205 189152.821326196106 +1693 0.1693 10639.3289718498072034 188798.234582278819 +1694 0.1694 10620.4668397893710790 188444.406626433978 +1695 0.1695 10601.6400526818651997 188091.335523696500 +1696 0.1696 10582.8485349384300207 187739.019344999921 +1697 0.1697 10564.0922111628224229 187387.456167159369 +1698 0.1698 10545.3710061508227227 187036.644072850060 +1699 0.1699 10526.6848448896507762 186686.581150584709 +1700 0.1700 10508.0336525573875406 186337.265494693420 +1701 0.1701 10489.4173545223875408 185988.695205305063 +1702 0.1702 10470.8358763427058875 185640.868388321367 +1703 0.1703 10452.2891437655198388 185293.783155401587 +1704 0.1704 10433.7770827265521802 184947.437623937381 +1705 0.1705 10415.2996193495037005 184601.829917037801 +1706 0.1706 10396.8566799454765714 184256.958163501520 +1707 0.1707 10378.4481910124104616 183912.820497804991 +1708 0.1708 10360.0740792345168302 183569.415060073428 +1709 0.1709 10341.7342714817095839 183226.739996068383 +1710 0.1710 10323.4286948090484657 182884.793457162828 +1711 0.1711 10305.1572764561733493 182543.573600322474 +1712 0.1712 10286.9199438467530854 182203.078588086821 +1713 0.1713 10268.7166245879216149 181863.306588546897 +1714 0.1714 10250.5472464697286341 181524.255775328580 +1715 0.1715 10232.4117374645829841 181185.924327570916 +1716 0.1716 10214.3100257267087727 180848.310429907404 +1717 0.1717 10196.2420395915905829 180511.412272445101 +1718 0.1718 10178.2077075754314137 180175.228050747886 +1719 0.1719 10160.2069583746033459 179839.755965813296 +1720 0.1720 10142.2397208651091205 179504.994224057824 +1721 0.1721 10124.3059241020418995 179170.941037292127 +1722 0.1722 10106.4054973190413875 178837.594622707897 +1723 0.1723 10088.5383699277626874 178504.953202855890 +1724 0.1724 10070.7044715173378790 178173.015005624387 +1725 0.1725 10052.9037318538448744 177841.778264224908 +1726 0.1726 10035.1360808797744539 177511.241217173054 +1727 0.1727 10017.4014487135027593 177181.402108264097 +1728 0.1728 9999.6997656487619679 176852.259186562296 +1729 0.1729 9982.0309621541146043 176523.810706377495 +1730 0.1730 9964.3949688724333100 176196.054927245481 +1731 0.1731 9946.7917166203751549 175868.990113913896 +1732 0.1732 9929.2211363878632255 175542.614536320092 +1733 0.1733 9911.6831593375682132 175216.926469577302 +1734 0.1734 9894.1777168043918209 174891.924193950661 +1735 0.1735 9876.7047402949519892 174567.605994843005 +1736 0.1736 9859.2641614870717603 174243.970162774494 +1737 0.1737 9841.8559122292645043 173921.014993368211 +1738 0.1738 9824.4799245402300585 173598.738787329203 +1739 0.1739 9807.1361306083417730 173277.139850426523 +1740 0.1740 9789.8244627911462885 172956.216493477579 +1741 0.1741 9772.5448536148560379 172635.967032327404 +1742 0.1742 9755.2972357738472056 172316.389787834283 +1743 0.1743 9738.0815421301631432 171997.483085851709 +1744 0.1744 9720.8977057130105095 171679.245257206989 +1745 0.1745 9703.7456597182663245 171361.674637690419 +1746 0.1746 9686.6253375079795660 171044.769568030781 +1747 0.1747 9669.5366726098836807 170728.528393884917 +1748 0.1748 9652.4795987168981810 170412.949465814017 +1749 0.1749 9635.4540496866429748 170098.031139273284 +1750 0.1750 9618.4599595409490576 169783.771774589666 +1751 0.1751 9601.4972624653728417 169470.169736944896 +1752 0.1752 9584.5658928087068489 169157.223396362591 +1753 0.1753 9567.6657850825049536 168844.931127687509 +1754 0.1754 9550.7968739605912560 168533.291310572298 +1755 0.1755 9533.9590942785889638 168222.302329455502 +1756 0.1756 9517.1523810334383597 167911.962573551602 +1757 0.1757 9500.3766693829184078 167602.270436829305 +1758 0.1758 9483.6318946451774536 167293.224317996006 +1759 0.1759 9466.9179922982530115 166984.822620483086 +1760 0.1760 9450.2348979796079220 166677.063752429589 +1761 0.1761 9433.5825474856537767 166369.946126661293 +1762 0.1762 9416.9608767712870758 166063.468160682096 +1763 0.1763 9400.3698219494199293 165757.628276651492 +1764 0.1764 9383.8093192905180331 165452.424901370890 +1765 0.1765 9367.2793052221368271 165147.856466266909 +1766 0.1766 9350.7797163284540147 164843.921407376096 +1767 0.1767 9334.3104893498184538 164540.618165329914 +1768 0.1768 9317.8715611822844949 164237.945185337216 +1769 0.1769 9301.4628688771590532 163935.900917166378 +1770 0.1770 9285.0843496405432234 163634.483815136424 +1771 0.1771 9268.7359408328811696 163333.692338091903 +1772 0.1772 9252.4175799685071979 163033.524949396786 +1773 0.1773 9236.1292047151910083 162733.980116912688 +1774 0.1774 9219.8707528936956805 162435.056312985311 +1775 0.1775 9203.6421624773247459 162136.752014427679 +1776 0.1776 9187.4433715914783534 161839.065702508902 +1777 0.1777 9171.2743185132057988 161541.995862932410 +1778 0.1778 9155.1349416707671480 161245.540985827101 +1779 0.1779 9139.0251796431894036 160949.699565727904 +1780 0.1780 9122.9449711598244903 160654.470101561688 +1781 0.1781 9106.8942550999145169 160359.851096633909 +1782 0.1782 9090.8729704921515804 160065.841058611404 +1783 0.1783 9074.8810565142448468 159772.438499507989 +1784 0.1784 9058.9184524924858124 159479.641935670690 +1785 0.1785 9042.9850979013135657 159187.449887762603 +1786 0.1786 9027.0809323628873244 158895.860880750988 +1787 0.1787 9011.2058956466553354 158604.873443892080 +1788 0.1788 8995.3599276689255930 158314.486110712984 +1789 0.1789 8979.5429684924401954 158024.697419000702 +1790 0.1790 8963.7549583259515202 157735.505910786800 +1791 0.1791 8947.9958375237947621 157446.910132332589 +1792 0.1792 8932.2655465854732029 157158.908634116000 +1793 0.1793 8916.5640261552271113 156871.499970812991 +1794 0.1794 8900.8912170216226514 156584.682701288402 +1795 0.1795 8885.2470601171298767 156298.455388578790 +1796 0.1796 8869.6314965177061822 156012.816599879181 +1797 0.1797 8854.0444674423852121 155727.764906529686 +1798 0.1798 8838.4859142528584925 155443.298883998010 +1799 0.1799 8822.9557784530643403 155159.417111869203 +1800 0.1800 8807.4540016887785896 154876.118173831695 +1801 0.1801 8791.9805257472035009 154593.400657659920 +1802 0.1802 8776.5352925565603073 154311.263155203604 +1803 0.1803 8761.1182441856817604 154029.704262371699 +1804 0.1804 8745.7293228436064965 153748.722579121502 +1805 0.1805 8730.3684708791788580 153468.316709441715 +1806 0.1806 8715.0356307806396217 153188.485261341615 +1807 0.1807 8699.7307451752312772 152909.226846834703 +1808 0.1808 8684.4537568287923932 152630.540081928601 +1809 0.1809 8669.2046086453665339 152352.423586606485 +1810 0.1810 8653.9832436667948059 152074.875984821585 +1811 0.1811 8638.7896050723302324 151797.895904473611 +1812 0.1812 8623.6236361782357562 151521.481977404095 +1813 0.1813 8608.4852804373967956 151245.632839378290 +1814 0.1814 8593.3744814389247040 150970.347130074981 +1815 0.1815 8578.2911829077675065 150695.623493069288 +1816 0.1816 8563.2353287043224555 150421.460575826000 +1817 0.1817 8548.2068628240467660 150147.857029676787 +1818 0.1818 8533.2057293970719911 149874.811509818770 +1819 0.1819 8518.2318726878165762 149602.322675291914 +1820 0.1820 8503.2852370946038718 149330.389188970323 +1821 0.1821 8488.3657671492783265 149059.009717549779 +1822 0.1822 8473.4734075168234995 148788.182931534393 +1823 0.1823 8458.6081029949855292 148517.907505221374 +1824 0.1824 8443.7697985138893273 148248.182116692478 +1825 0.1825 8428.9584391356638662 147979.005447798903 +1826 0.1826 8414.1739700540656486 147710.376184147783 +1827 0.1827 8399.4163365941039956 147442.293015091214 +1828 0.1828 8384.6854842116645159 147174.754633715085 +1829 0.1829 8369.9813584931380319 146907.759736821987 +1830 0.1830 8355.3039051550513250 146641.307024925307 +1831 0.1831 8340.6530700436942425 146375.395202228596 +1832 0.1832 8326.0287991347522620 146110.022976621200 +1833 0.1833 8311.4310385329390556 145845.189059660886 +1834 0.1834 8296.8597344716272346 145580.892166565405 +1835 0.1835 8282.3148333124900091 145317.131016195606 +1836 0.1836 8267.7962815451282950 145053.904331046710 +1837 0.1837 8253.3040257867141918 144791.210837236606 +1838 0.1838 8238.8380127816271852 144529.049264490604 +1839 0.1839 8224.3981894010958058 144267.418346132094 +1840 0.1840 8209.9845026428356505 144006.316819071304 +1841 0.1841 8195.5968996306928602 143745.743423789798 +1842 0.1842 8181.2353276142866889 143485.696904330282 +1843 0.1843 8166.8997339686557098 143226.176008289709 +1844 0.1844 8152.5900661939012934 142967.179486796318 +1845 0.1845 8138.3062719148356337 142708.706094510097 +1846 0.1846 8124.0482988806297726 142450.754589603312 +1847 0.1847 8109.8160949644616267 142193.323733751604 +1848 0.1848 8095.6096081631676498 141936.412292120804 +1849 0.1849 8081.4287865968935876 141680.019033357908 +1850 0.1850 8067.2735785087470504 141424.142729577899 +1851 0.1851 8053.1439322644509957 141168.782156352012 +1852 0.1852 8039.0397963519981204 140913.936092698015 +1853 0.1853 8024.9611193813097998 140659.603321065195 +1854 0.1854 8010.9078500838904802 140405.782627327309 +1855 0.1855 7996.8799373124857084 140152.472800768708 +1856 0.1856 7982.8773300407438001 139899.672634076094 +1857 0.1857 7968.8999773628738694 139647.380923321296 +1858 0.1858 7954.9478284933102259 139395.596467955591 +1859 0.1859 7941.0208327663722230 139144.318070799200 +1860 0.1860 7927.1189396359313832 138893.544538022310 +1861 0.1861 7913.2420986750730663 138643.274679145194 +1862 0.1862 7899.3902595757645031 138393.507307017397 +1863 0.1863 7885.5633721485228307 138144.241237813985 +1864 0.1864 7871.7613863220813073 137895.475291020208 +1865 0.1865 7857.9842521430591660 137647.208289421804 +1866 0.1866 7844.2319197756332869 137399.439059095108 +1867 0.1867 7830.5043395012089604 137152.166429393226 +1868 0.1868 7816.8014617180924688 136905.389232942718 +1869 0.1869 7803.1232369411645777 136659.106305621681 +1870 0.1870 7789.4696158015558467 136413.316486559983 +1871 0.1871 7775.8405490463219394 136168.018618120288 +1872 0.1872 7762.2359875381216625 135923.211545893108 +1873 0.1873 7748.6558822548931857 135678.894118684519 +1874 0.1874 7735.1001842895338996 135435.065188503300 +1875 0.1875 7721.5688448495811826 135191.723610552901 +1876 0.1876 7708.0618152568922596 134948.868243222183 +1877 0.1877 7694.5790469473276971 134706.497948072909 +1878 0.1878 7681.1204914704330804 134464.611589827691 +1879 0.1879 7667.6861004891234188 134223.208036363823 +1880 0.1880 7654.2758257793702796 133982.286158700474 +1881 0.1881 7640.8896192298852839 133741.844830990478 +1882 0.1882 7627.5274328418108780 133501.882930506370 +1883 0.1883 7614.1892187284038300 133262.399337633105 +1884 0.1884 7600.8749291147296390 133023.392935858312 +1885 0.1885 7587.5845163373487594 132784.862611760909 +1886 0.1886 7574.3179328440110112 132546.807255001506 +1887 0.1887 7561.0751311933454417 132309.225758311397 +1888 0.1888 7547.8560640545556453 132072.117017484998 +1889 0.1889 7534.6606842071132633 131835.479931367619 +1890 0.1890 7521.4889445404523940 131599.313401844993 +1891 0.1891 7508.3407980536685500 131363.616333837097 +1892 0.1892 7495.2161978552121582 131128.387635285093 +1893 0.1893 7482.1150971625911552 130893.626217143115 +1894 0.1894 7469.0374493020653972 130659.330993366195 +1895 0.1895 7455.9832077083519835 130425.500880902808 +1896 0.1896 7442.9523259243223947 130192.134799687206 +1897 0.1897 7429.9447576007069074 129959.231672622700 +1898 0.1898 7416.9604564957971888 129726.790425580693 +1899 0.1899 7403.9993764751488925 129494.809987384389 +1900 0.1900 7391.0614715112897102 129263.289289803506 +1901 0.1901 7378.1466956834228768 129032.227267541602 +1902 0.1902 7365.2550031771343129 128801.622858229399 +1903 0.1903 7352.3863482841024961 128571.475002412597 +1904 0.1904 7339.5406854018046943 128341.782643545608 +1905 0.1905 7326.7179690332286555 128112.544727980698 +1906 0.1906 7313.9181537865815699 127883.760204956998 +1907 0.1907 7301.1411943750044884 127655.428026592082 +1908 0.1908 7288.3870456162812843 127427.547147876787 +1909 0.1909 7275.6556624325539815 127200.116526660582 +1910 0.1910 7262.9469998500389920 126973.135123643704 +1911 0.1911 7250.2610129987388063 126746.601902369104 +1912 0.1912 7237.5976571121600500 126520.515829213793 +1913 0.1913 7224.9568875270306307 126294.875873379598 +1914 0.1914 7212.3386596830177950 126069.681006879793 +1915 0.1915 7199.7429291224470944 125844.930204537202 +1916 0.1916 7187.1696514900213515 125620.622443970817 +1917 0.1917 7174.6187825325432641 125396.756705587904 +1918 0.1918 7162.0902780986352809 125173.331972574291 +1919 0.1919 7149.5840941384622056 124950.347230886007 +1920 0.1920 7137.1001867034556199 124727.801469241604 +1921 0.1921 7124.6385119460383066 124505.693679110700 +1922 0.1922 7112.1990261193477636 124284.022854708688 +1923 0.1923 7099.7816855769633548 124062.787992985104 +1924 0.1924 7087.3864467726334624 123841.988093614913 +1925 0.1925 7075.0132662600026379 123621.622158993399 +1926 0.1926 7062.6621006923414825 123401.689194221603 +1927 0.1927 7050.3329068222756177 123182.188207104293 +1928 0.1928 7038.0256415015137463 122963.118208135493 +1929 0.1929 7025.7402616805820799 122744.478210493689 +1930 0.1930 7013.4767244085560378 122526.267230031110 +1931 0.1931 7001.2349868327910372 122308.484285268612 +1932 0.1932 6989.0150061986587389 122091.128397381210 +1933 0.1933 6976.8167398492796565 121874.198590197208 +1934 0.1934 6964.6401452252603121 121657.693890183102 +1935 0.1935 6952.4851798644294831 121441.613326438091 +1936 0.1936 6940.3518014015735389 121225.955930687604 +1937 0.1937 6928.2399675681754161 121010.720737270807 +1938 0.1938 6916.1496361921554126 120795.906783134895 +1939 0.1939 6904.0807651976074339 120581.513107827093 +1940 0.1940 6892.0333126045416066 120367.538753485802 +1941 0.1941 6880.0072365286259810 120153.982764831584 +1942 0.1942 6868.0024951809264167 119940.844189161187 +1943 0.1943 6856.0190468676519231 119728.122076336193 +1944 0.1944 6844.0568499898963637 119515.815478777193 +1945 0.1945 6832.1158630433847065 119303.923451456605 +1946 0.1946 6820.1960446182174564 119092.445051888091 +1947 0.1947 6808.2973533986169059 118881.379340119587 +1948 0.1948 6796.4197481626742956 118670.725378726216 +1949 0.1949 6784.5631877820978843 118460.482232800088 +1950 0.1950 6772.7276312219601095 118250.648969946415 +1951 0.1951 6760.9130375404492952 118041.224660271284 +1952 0.1952 6749.1193658886168123 117832.208376374881 +1953 0.1953 6737.3465755101306058 117623.599193345493 +1954 0.1954 6725.5946257410259932 117415.396188750688 +1955 0.1955 6713.8634760094573721 117207.598442628296 +1956 0.1956 6702.1530858354517477 117000.205037481399 +1957 0.1957 6690.4634148306640782 116793.215058267786 +1958 0.1958 6678.7944226981308020 116586.627592391495 +1959 0.1959 6667.1460692320260932 116380.441729700688 +1960 0.1960 6655.5183143174172073 116174.656562474396 +1961 0.1961 6643.9111179300225558 115969.271185417194 +1962 0.1962 6632.3244401359688709 115764.284695650014 +1963 0.1963 6620.7582410915510991 115559.696192705684 +1964 0.1964 6609.2124810429895660 115355.504778519389 +1965 0.1965 6597.6871203261925984 115151.709557418988 +1966 0.1966 6586.1821193665155079 114948.309636122984 +1967 0.1967 6574.6974386785232127 114745.304123728405 +1968 0.1968 6563.2330388657519507 114542.692131704098 +1969 0.1969 6551.7888806204728098 114340.472773886213 +1970 0.1970 6540.3649247234552604 114138.645166465896 +1971 0.1971 6528.9611320437325048 113937.208427987498 +1972 0.1972 6517.5774635383659188 113736.161679337616 +1973 0.1973 6506.2138802522122205 113535.504043737601 +1974 0.1974 6494.8703433176888211 113335.234646739205 +1975 0.1975 6483.5468139545409940 113135.352616214688 +1976 0.1976 6472.2432534696126822 112935.857082350718 +1977 0.1977 6460.9596232566127583 112736.747177639889 +1978 0.1978 6449.6958847958867409 112538.022036876209 +1979 0.1979 6438.4519996541857836 112339.680797144596 +1980 0.1980 6427.2279294844374817 112141.722597817410 +1981 0.1981 6416.0236360255194086 111944.146580543806 +1982 0.1982 6404.8390811020299225 111746.951889245916 +1983 0.1983 6393.6742266240626122 111550.137670106895 +1984 0.1984 6382.5290345869789235 111353.703071572294 +1985 0.1985 6371.4034670711835133 111157.647244334003 +1986 0.1986 6360.2974862419005149 110961.969341328600 +1987 0.1987 6349.2110543489479824 110766.668517729500 +1988 0.1988 6338.1441337265141556 110571.743930938595 +1989 0.1989 6327.0966867929382715 110377.194740582097 +1990 0.1990 6316.0686760504841004 110183.020108500103 +1991 0.1991 6305.0600640851216667 109989.219198742096 +1992 0.1992 6294.0708135663062421 109795.791177560008 +1993 0.1993 6283.1008872467582478 109602.735213402688 +1994 0.1994 6272.1502479622431565 109410.050476904406 +1995 0.1995 6261.2188586313541236 109217.736140882698 +1996 0.1996 6250.3066822552937083 109025.791380331197 +1997 0.1997 6239.4136819176565041 108834.215372410006 +1998 0.1998 6228.5398207842135889 108643.007296442287 +1999 0.1999 6217.6850621026960653 108452.166333906804 +2000 0.2000 6206.8493692025795099 108261.691668428204 +2001 0.2001 6196.0327054948693331 108071.582485775594 +2002 0.2002 6185.2350344718879569 107881.837973852496 +2003 0.2003 6174.4563197070610840 107692.457322690607 +2004 0.2004 6163.6965248547039664 107503.439724444688 +2005 0.2005 6152.9556136498122214 107314.784373383183 +2006 0.2006 6142.2335499078490102 107126.490465887618 +2007 0.2007 6131.5302975245331254 106938.557200437906 +2008 0.2008 6120.8458204756307168 106750.983777612404 +2009 0.2009 6110.1800828167461077 106563.769400080404 +2010 0.2010 6099.5330486831126109 106376.913272592006 +2011 0.2011 6088.9046822893842545 106190.414601975310 +2012 0.2012 6078.2949479294293269 106004.272597130592 +2013 0.2013 6067.7038099761221019 105818.486469022406 +2014 0.2014 6057.1312328811372936 105633.055430670312 +2015 0.2015 6046.5771811747463289 105447.978697150204 +2016 0.2016 6036.0416194656099833 105263.255485578891 +2017 0.2017 6025.5245124405755632 105078.885015116917 +2018 0.2018 6015.0258248644722698 104894.866506954597 +2019 0.2019 6004.5455215799092912 104711.199184311190 +2020 0.2020 5994.0835675070720754 104527.882272426097 +2021 0.2021 5983.6399276435231513 104344.914998553009 +2022 0.2022 5973.2145670639974924 104162.296591953200 +2023 0.2023 5962.8074509202051559 103980.026283893094 +2024 0.2024 5952.4185444406284660 103798.103307632686 +2025 0.2025 5942.0478129303255628 103616.526898422715 +2026 0.2026 5931.6952217707294039 103435.296293499312 +2027 0.2027 5921.3607364194504044 103254.410732076300 +2028 0.2028 5911.0443224100799853 103073.869455337684 +2029 0.2029 5900.7459453519913950 102893.671706435998 +2030 0.2030 5890.4655709301450770 102713.816730483391 +2031 0.2031 5880.2031649048940380 102534.303774545886 +2032 0.2032 5869.9586931117846689 102355.132087637699 +2033 0.2033 5859.7321214613666598 102176.300920716705 +2034 0.2034 5849.5234159389974593 101997.809526674901 +2035 0.2035 5839.3325426046467328 101819.657160337112 +2036 0.2036 5829.1594675927071876 101641.843078452192 +2037 0.2037 5819.0041571117999410 101464.366539688199 +2038 0.2038 5808.8665774445844363 101287.226804627600 +2039 0.2039 5798.7466949475656293 101110.423135757403 +2040 0.2040 5788.6444760509039043 100933.954797468017 +2041 0.2041 5778.5598872582277181 100757.821056047600 +2042 0.2042 5768.4928951464416969 100582.021179672302 +2043 0.2043 5758.4434663655383702 100406.554438402207 +2044 0.2044 5748.4115676384089966 100231.420104178920 +2045 0.2045 5738.3971657606589361 100056.617450814898 +2046 0.2046 5728.4002276004184750 99882.145753991193 +2047 0.2047 5718.4207200981563801 99708.004291252000 +2048 0.2048 5708.4586102664943610 99534.192341994509 +2049 0.2049 5698.5138651900206241 99360.709187471104 +2050 0.2050 5688.5864520251079739 99187.554110775600 +2051 0.2051 5678.6763379997273660 99014.726396843893 +2052 0.2052 5668.7834904132632801 98842.225332444606 +2053 0.2053 5658.9078766363318209 98670.050206176806 +2054 0.2054 5649.0494641105997289 98498.200308459986 +2055 0.2055 5639.2082203485997525 98326.674931534595 +2056 0.2056 5629.3841129335505684 98155.473369450192 +2057 0.2057 5619.5771095191748827 97984.594918067000 +2058 0.2058 5609.7871778295193508 97814.038875042097 +2059 0.2059 5600.0142856587754068 97643.804539832709 +2060 0.2060 5590.2584008710991839 97473.891213683994 +2061 0.2061 5580.5194914004332531 97304.298199628291 +2062 0.2062 5570.7975252503283627 97135.024802477114 +2063 0.2063 5561.0924704937633578 96966.070328815709 +2064 0.2064 5551.4042952729723766 96797.434087000904 +2065 0.2065 5541.7329677992647703 96629.115387151207 +2066 0.2066 5532.0784563528495710 96461.113541146391 +2067 0.2067 5522.4407292826608682 96293.427862618599 +2068 0.2068 5512.8197550061822767 96126.057666947498 +2069 0.2069 5503.2155020092723134 95959.002271257297 +2070 0.2070 5493.6279388459888651 95792.260994410404 +2071 0.2071 5484.0570341384182029 95625.833157000816 +2072 0.2072 5474.5027565765003601 95459.718081351501 +2073 0.2073 5464.9650749178572369 95293.915091505609 +2074 0.2074 5455.4439579876207063 95128.423513226109 +2075 0.2075 5445.9393746782598100 94963.242673988891 +2076 0.2076 5436.4512939494115926 94798.371902974090 +2077 0.2077 5426.9796848277092067 94633.810531065697 +2078 0.2078 5417.5245164066136567 94469.557890846292 +2079 0.2079 5408.0857578462419042 94305.613316587187 +2080 0.2080 5398.6633783732004304 94141.976144248300 +2081 0.2081 5389.2573472804142511 93978.645711474208 +2082 0.2082 5379.8676339269613891 93815.621357582291 +2083 0.2083 5370.4942077379037073 93652.902423563588 +2084 0.2084 5361.1370382041213816 93490.488252078590 +2085 0.2085 5351.7960948821446436 93328.378187447888 +2086 0.2086 5342.4713473939900723 93166.571575648311 +2087 0.2087 5333.1627654269923369 93005.067764311709 +2088 0.2088 5323.8703187336413976 92843.866102715503 +2089 0.2089 5314.5939771314169775 92682.965941781804 +2090 0.2090 5305.3337105026248537 92522.366634068690 +2091 0.2091 5296.0894887942331479 92362.067533768713 +2092 0.2092 5286.8612820177095273 92202.067996700018 +2093 0.2093 5277.6490602488593140 92042.367380308890 +2094 0.2094 5268.4527936276608671 91882.965043655000 +2095 0.2095 5259.2724523581073299 91723.860347415801 +2096 0.2096 5250.1080067080429217 91565.052653876002 +2097 0.2097 5240.9594270090028658 91406.541326925100 +2098 0.2098 5231.8266836560542288 91248.325732052312 +2099 0.2099 5222.7097471076349393 91090.405236341816 +2100 0.2100 5213.6085878853946269 90932.779208468113 +2101 0.2101 5204.5231765740363699 90775.447018691309 +2102 0.2102 5195.4534838211593524 90618.408038852212 +2103 0.2103 5186.3994803370978843 90461.661642369407 +2104 0.2104 5177.3611368947676965 90305.207204230304 +2105 0.2105 5168.3384243295067790 90149.044100992091 +2106 0.2106 5159.3313135389180388 89993.171710773895 +2107 0.2107 5150.3397754827165045 89837.589413251189 +2108 0.2108 5141.3637811825710742 89682.296589655904 +2109 0.2109 5132.4033017219499015 89527.292622765090 +2110 0.2110 5123.4583082459666912 89372.576896902392 +2111 0.2111 5114.5287719612251749 89218.148797932285 +2112 0.2112 5105.6146641356663167 89064.007713251005 +2113 0.2113 5096.7159560984146083 88910.153031790120 +2114 0.2114 5087.8326192396252736 88756.584144002903 +2115 0.2115 5078.9646250103314742 88603.300441868007 +2116 0.2116 5070.1119449222942421 88450.301318879283 +2117 0.2117 5061.2745505478478663 88297.586170046896 +2118 0.2118 5052.4524135197516443 88145.154391884716 +2119 0.2119 5043.6455055310370881 87993.005382415184 +2120 0.2120 5034.8537983348587659 87841.138541158405 +2121 0.2121 5026.0772637443442363 87689.553269130192 +2122 0.2122 5017.3158736324458005 87538.248968838307 +2123 0.2123 5008.5695999317904352 87387.225044276493 +2124 0.2124 4999.8384146345306362 87236.480900922194 +2125 0.2125 4991.1222897921979893 87086.015945728912 +2126 0.2126 4982.4211975155549226 86935.829587125685 +2127 0.2127 4973.7351099744482781 86785.921235011192 +2128 0.2128 4965.0639993976601545 86636.290300748995 +2129 0.2129 4956.4078380727642070 86486.936197163595 +2130 0.2130 4947.7665983459792187 86337.858338536287 +2131 0.2131 4939.1402526220226719 86189.056140602494 +2132 0.2132 4930.5287733639652288 86040.529020543399 +2133 0.2133 4921.9321330930888507 85892.276396985806 +2134 0.2134 4913.3503043887394597 85744.297689998406 +2135 0.2135 4904.7832598881850572 85596.592321082499 +2136 0.2136 4896.2309722864720243 85449.159713173591 +2137 0.2137 4887.6934143362814211 85301.999290633903 +2138 0.2138 4879.1705588477871061 85155.110479248804 +2139 0.2139 4870.6623786885138543 85008.492706223507 +2140 0.2140 4862.1688467831936578 84862.145400178109 +2141 0.2141 4853.6899361136274820 84716.067991144999 +2142 0.2142 4845.2256197185424753 84570.259910562803 +2143 0.2143 4836.7758706934509974 84424.720591274105 +2144 0.2144 4828.3406621905114662 84279.449467517494 +2145 0.2145 4819.9199674183892057 84134.445974931397 +2146 0.2146 4811.5137596421154740 83989.709550541214 +2147 0.2147 4803.1220121829501295 83845.239632761601 +2148 0.2148 4794.7446984182424785 83701.035661388800 +2149 0.2149 4786.3817917812930318 83557.097077599188 +2150 0.2150 4778.0332657612161711 83413.423323943396 +2151 0.2151 4769.6990939028019056 83270.013844344809 +2152 0.2152 4761.3792498063803578 83126.868084091897 +2153 0.2153 4753.0737071276835195 82983.985489838000 +2154 0.2154 4744.7824395777115569 82841.365509593612 +2155 0.2155 4736.5054209225954764 82699.007592727212 +2156 0.2156 4728.2426249834616101 82556.911189958410 +2157 0.2157 4719.9940256362961009 82415.075753352488 +2158 0.2158 4711.7595968118121164 82273.500736320202 +2159 0.2159 4703.5393124953152437 82132.185593613118 +2160 0.2160 4695.3331467265688843 81991.129781317912 +2161 0.2161 4687.1410735996605581 81850.332756852193 +2162 0.2162 4678.9630672628700268 81709.793978965710 +2163 0.2163 4670.7991019185355981 81569.512907728305 +2164 0.2164 4662.6491518229222493 81429.489004535601 +2165 0.2165 4654.5131912860906596 81289.721732097110 +2166 0.2166 4646.3911946717644241 81150.210554436082 +2167 0.2167 4638.2831363971981773 81010.954936887094 +2168 0.2168 4630.1889909330493538 80871.954346090104 +2169 0.2169 4622.1087328032454025 80733.208249985299 +2170 0.2170 4614.0423365848555477 80594.716117814110 +2171 0.2171 4605.9897769079589125 80456.477420111900 +2172 0.2172 4597.9510284555180988 80318.491628705087 +2173 0.2173 4589.9260659632473107 80180.758216705290 +2174 0.2174 4581.9148642194859349 80043.276658513292 +2175 0.2175 4573.9173980650703015 79906.046429803799 +2176 0.2176 4565.9336423932036269 79769.067007532896 +2177 0.2177 4557.9635721493305027 79632.337869926516 +2178 0.2178 4550.0071623310104769 79495.858496482600 +2179 0.2179 4542.0643879877879954 79359.628367962097 +2180 0.2180 4534.1352242210705299 79223.646966388711 +2181 0.2181 4526.2196461839985204 79087.913775046589 +2182 0.2182 4518.3176290813225933 78952.428278471998 +2183 0.2183 4510.4291481692762318 78817.189962454213 +2184 0.2184 4502.5541787554520852 78682.198314030786 +2185 0.2185 4494.6926961986764582 78547.452821483195 +2186 0.2186 4486.8446759088856197 78412.952974331696 +2187 0.2187 4479.0100933470021118 78278.698263336817 +2188 0.2188 4471.1889240248110582 78144.688180491095 +2189 0.2189 4463.3811435048355634 78010.922219018408 +2190 0.2190 4455.5867274002166596 77877.399873368704 +2191 0.2191 4447.8056513745877965 77744.120639215398 +2192 0.2192 4440.0378911419547876 77611.084013451487 +2193 0.2193 4432.2834224665730289 77478.289494188110 +2194 0.2194 4424.5422211628265359 77345.736580747282 +2195 0.2195 4416.8142630951060710 77213.424773662511 +2196 0.2196 4409.0995241776890907 77081.353574671899 +2197 0.2197 4401.3979803746196922 76949.522486716596 +2198 0.2198 4393.7096076995867406 76817.931013939407 +2199 0.2199 4386.0343822158056355 76686.578661676103 +2200 0.2200 4378.3722800358991663 76555.464936456483 +2201 0.2201 4370.7232773217765498 76424.589346001099 +2202 0.2202 4363.0873502845161056 76293.951399213198 +2203 0.2203 4355.4644751842461119 76163.550606182791 +2204 0.2204 4347.8546283300283903 76033.386478175598 +2205 0.2205 4340.2577860797382527 75903.458527634910 +2206 0.2206 4332.6739248399480857 75773.766268177103 +2207 0.2207 4325.1030210658100259 75644.309214589099 +2208 0.2208 4317.5450512609395446 75515.086882820498 +2209 0.2209 4309.9999919772990324 75386.098789985903 +2210 0.2210 4302.4678198150813841 75257.344454361606 +2211 0.2211 4294.9485114225944926 75128.823395376385 +2212 0.2212 4287.4420434961448336 75000.535133614379 +2213 0.2213 4279.9483927799237790 74872.479190809900 +2214 0.2214 4272.4675360658911814 74744.655089843407 +2215 0.2215 4264.9994501936616871 74617.062354738999 +2216 0.2216 4257.5441120503919592 74489.700510659706 +2217 0.2217 4250.1014985706633524 74362.569083909097 +2218 0.2218 4242.6715867363718644 74235.667601921799 +2219 0.2219 4235.2543535766126297 74108.995593264306 +2220 0.2220 4227.8497761675680522 73982.552587629500 +2221 0.2221 4220.4578316323950276 73856.338115837600 +2222 0.2222 4213.0784971411121660 73730.351709828188 +2223 0.2223 4205.7117499104879244 73604.592902658085 +2224 0.2224 4198.3575672039296478 73479.061228502702 +2225 0.2225 4191.0159263313726115 73353.756222645112 +2226 0.2226 4183.6868046491663335 73228.677421480694 +2227 0.2227 4176.3701795599663456 73103.824362511194 +2228 0.2228 4169.0660285126241433 72979.196584336605 +2229 0.2229 4161.7743290020744098 72854.793626662387 +2230 0.2230 4154.4950585692267850 72730.615030286295 +2231 0.2231 4147.2281948008576364 72606.660337101508 +2232 0.2232 4139.9737153294981908 72482.929090092308 +2233 0.2233 4132.7315978333272142 72359.420833329597 +2234 0.2234 4125.5018200360618721 72236.135111968790 +2235 0.2235 4118.2843597068513191 72113.071472248397 +2236 0.2236 4111.0791946601648306 71990.229461483308 +2237 0.2237 4103.8863027556872112 71867.608628065107 +2238 0.2238 4096.7056618982114742 71745.208521458291 +2239 0.2239 4089.5372500375292475 71623.028692195192 +2240 0.2240 4082.3810451683257270 71501.068691878187 +2241 0.2241 4075.2370253300732656 71379.328073170400 +2242 0.2242 4068.1051686069249627 71257.806389797202 +2243 0.2243 4060.9854531276082525 71136.503196540216 +2244 0.2244 4053.8778570653194038 71015.418049238811 +2245 0.2245 4046.7823586376184721 70894.550504780418 +2246 0.2246 4039.6989361063242541 70773.900121106213 +2247 0.2247 4032.6275677774087853 70653.466457199393 +2248 0.2248 4025.5682320008945680 70533.249073089391 +2249 0.2249 4018.5209071707477051 70413.247529845001 +2250 0.2250 4011.4855717247769462 70293.461389572403 +2251 0.2251 4004.4622041445277318 70173.890215412510 +2252 0.2252 3997.4507829551803297 70054.533571539083 +2253 0.2253 3990.4512867254456978 69935.391023154385 +2254 0.2254 3983.4636940674636207 69816.462136485992 +2255 0.2255 3976.4879836366999371 69697.746478786794 +2256 0.2256 3969.5241341318442210 69579.243618327499 +2257 0.2257 3962.5721242947079190 69460.953124400898 +2258 0.2258 3955.6319329101224866 69342.874567309686 +2259 0.2259 3948.7035388058384342 69225.007518373706 +2260 0.2260 3941.7869208524239184 69107.351549917410 +2261 0.2261 3934.8820579631642431 68989.906235275499 +2262 0.2262 3927.9889290939609054 68872.671148786991 +2263 0.2263 3921.1075132432320061 68755.645865788101 +2264 0.2264 3914.2377894518117500 68638.829962616917 +2265 0.2265 3907.3797368028504025 68522.223016605712 +2266 0.2266 3900.5333344217160629 68405.824606081587 +2267 0.2267 3893.6985614758941665 68289.634310359892 +2268 0.2268 3886.8753971748888034 68173.651709743484 +2269 0.2269 3880.0638207701254032 68057.876385521289 +2270 0.2270 3873.2638115548511450 67942.307919963903 +2271 0.2271 3866.4753488640367323 67826.945896321195 +2272 0.2272 3859.6984120742795312 67711.789898819916 +2273 0.2273 3852.9329806037053459 67596.839512660998 +2274 0.2274 3846.1790339118715565 67482.094324018588 +2275 0.2275 3839.4365514996688944 67367.553920031409 +2276 0.2276 3832.7055129092268544 67253.217888808795 +2277 0.2277 3825.9858977238154694 67139.085819420405 +2278 0.2278 3819.2776855677493586 67025.157301899715 +2279 0.2279 3812.5808561062926856 66911.431927236117 +2280 0.2280 3805.8953890455622968 66797.909287375413 +2281 0.2281 3799.2212641324326796 66684.588975217499 +2282 0.2282 3792.5584611544413747 66571.470584611307 +2283 0.2283 3785.9069599396930244 66458.553710356005 +2284 0.2284 3779.2667403567656947 66345.837948192609 +2285 0.2285 3772.6377823146158335 66233.322894808196 +2286 0.2286 3766.0200657624841369 66121.008147828587 +2287 0.2287 3759.4135706898018725 66008.893305817503 +2288 0.2288 3752.8182771260972004 65896.977968274208 +2289 0.2289 3746.2341651409019505 65785.261735629596 +2290 0.2290 3739.6612148436583993 65673.744209245095 +2291 0.2291 3733.0994063836255918 65562.424991409993 +2292 0.2292 3726.5487199497879374 65451.303685339706 +2293 0.2293 3720.0091357707624411 65340.379895170103 +2294 0.2294 3713.4806341147059356 65229.653225958697 +2295 0.2295 3706.9631952892241316 65119.123283679510 +2296 0.2296 3700.4567996412793036 65008.789675221313 +2297 0.2297 3693.9614275570988866 64898.652008387595 +2298 0.2298 3687.4770594620849806 64788.709891889404 +2299 0.2299 3681.0036758207229468 64678.962935348507 +2300 0.2300 3674.5412571364909127 64569.410749289105 +2301 0.2301 3668.0897839517692773 64460.052945139396 +2302 0.2302 3661.6492368477511263 64350.889135226898 +2303 0.2303 3655.2195964443508274 64241.918932780085 +2304 0.2304 3648.8008434001158093 64133.141951920203 +2305 0.2305 3642.3929584121365224 64024.557807661506 +2306 0.2306 3635.9959222159577621 63916.166115910703 +2307 0.2307 3629.6097155854890843 63807.966493460801 +2308 0.2308 3623.2343193329165842 63699.958557993596 +2309 0.2309 3616.8697143086133110 63592.141928071593 +2310 0.2310 3610.5158814010528658 63484.516223138795 +2311 0.2311 3604.1728015367198168 63377.081063520105 +2312 0.2312 3597.8404556800228420 63269.836070416204 +2313 0.2313 3591.5188248332069634 63162.780865899302 +2314 0.2314 3585.2078900362662353 63055.915072916396 +2315 0.2315 3578.9076323668564328 62949.238315282200 +2316 0.2316 3572.6180329402081952 62842.750217679000 +2317 0.2317 3566.3390729090415334 62736.450405655400 +2318 0.2318 3560.0707334634776089 62630.338505618711 +2319 0.2319 3553.8129958309546055 62524.414144841008 +2320 0.2320 3547.5658412761399632 62418.676951447502 +2321 0.2321 3541.3292511008462498 62313.126554423303 +2322 0.2322 3535.1032066439447590 62207.762583603297 +2323 0.2323 3528.8876892812809274 62102.584669675096 +2324 0.2324 3522.6826804255883872 61997.592444175098 +2325 0.2325 3516.4881615264052925 61892.785539484394 +2326 0.2326 3510.3041140699897369 61788.163588830896 +2327 0.2327 3504.1305195792342602 61683.726226282204 +2328 0.2328 3497.9673596135826301 61579.473086747807 +2329 0.2329 3491.8146157689466236 61475.403805971000 +2330 0.2330 3485.6722696776214434 61371.518020534597 +2331 0.2331 3479.5403030082020450 61267.815367850810 +2332 0.2332 3473.4186974655012818 61164.295486164498 +2333 0.2333 3467.3074347904657770 61060.958014548800 +2334 0.2334 3461.2064967600931595 60957.802592902211 +2335 0.2335 3455.1158651873506642 60854.828861949092 +2336 0.2336 3449.0355219210914584 60752.036463235199 +2337 0.2337 3442.9654488459736967 60649.425039123904 +2338 0.2338 3436.9056278823777575 60546.994232798897 +2339 0.2339 3430.8560409863248424 60444.743688258095 +2340 0.2340 3424.8166701493964865 60342.673050312791 +2341 0.2341 3418.7874973986513396 60240.781964585694 +2342 0.2342 3412.7685047965464946 60139.070077507597 +2343 0.2343 3406.7596744408551785 60037.537036316906 +2344 0.2344 3400.7609884645867169 59936.182489056009 +2345 0.2345 3394.7724290359055885 59835.006084569395 +2346 0.2346 3388.7939783580518451 59734.007472504600 +2347 0.2347 3382.8256186692615302 59633.186303303199 +2348 0.2348 3376.8673322426861887 59532.542228207298 +2349 0.2349 3370.9191013863132866 59432.074899249099 +2350 0.2350 3364.9809084428879942 59331.783969255499 +2351 0.2351 3359.0527357898331502 59231.669091843505 +2352 0.2352 3353.1345658391701363 59131.729921413804 +2353 0.2353 3347.2263810374415698 59031.966113157905 +2354 0.2354 3341.3281638656312680 58932.377323047491 +2355 0.2355 3335.4398968390869413 58832.963207837704 +2356 0.2356 3329.5615625074419768 58733.723425062104 +2357 0.2357 3323.6931434545372213 58634.657633032395 +2358 0.2358 3317.8346222983436746 58535.765490834005 +2359 0.2359 3311.9859816908856374 58437.046658327796 +2360 0.2360 3306.1472043181620393 58338.500796144595 +2361 0.2361 3300.3182729000704967 58240.127565685994 +2362 0.2362 3294.4991701903304602 58141.926629118207 +2363 0.2363 3288.6898789764059075 58043.897649375198 +2364 0.2364 3282.8903820794294006 57946.040290151803 +2365 0.2365 3277.1006623541265981 57848.354215907202 +2366 0.2366 3271.3207026887384927 57750.839091856302 +2367 0.2367 3265.5504860049468334 57653.494583973807 +2368 0.2368 3259.7899952577986369 57556.320358987403 +2369 0.2369 3254.0392134356302449 57459.316084380807 +2370 0.2370 3248.2981235599918364 57362.481428385807 +2371 0.2371 3242.5667086855733032 57265.816059985707 +2372 0.2372 3236.8449519001283079 57169.319648910998 +2373 0.2373 3231.1328363244010689 57072.991865635704 +2374 0.2374 3225.4303451120504178 56976.832381379492 +2375 0.2375 3219.7374614495761307 56880.840868102401 +2376 0.2376 3214.0541685562457133 56785.016998503597 +2377 0.2377 3208.3804496840193679 56689.360446021303 +2378 0.2378 3202.7162881174767790 56593.870884825992 +2379 0.2379 3197.0616671737443539 56498.547989827006 +2380 0.2380 3191.4165702024201892 56403.391436660597 +2381 0.2381 3185.7809805855022205 56308.400901696994 +2382 0.2382 3180.1548817373159181 56213.576062030501 +2383 0.2383 3174.5382571044401629 56118.916595484501 +2384 0.2384 3168.9310901656358510 56024.422180605092 +2385 0.2385 3163.3333644317726794 55930.092496660807 +2386 0.2386 3157.7450634457577507 55835.927223641607 +2387 0.2387 3152.1661707824628138 55741.926042255203 +2388 0.2388 3146.5966700486537775 55648.088633925494 +2389 0.2389 3141.0365448829179513 55554.414680791204 +2390 0.2390 3135.4857789555931049 55460.903865704502 +2391 0.2391 3129.9443559686965273 55367.555872229903 +2392 0.2392 3124.4122596558531768 55274.370384638802 +2393 0.2393 3118.8894737822256502 55181.347087911607 +2394 0.2394 3113.3759821444432419 55088.485667732901 +2395 0.2395 3107.8717685705319127 54995.785810491194 +2396 0.2396 3102.3768169198433498 54903.247203279301 +2397 0.2397 3096.8911110829849349 54810.869533886595 +2398 0.2398 3091.4146349817506234 54718.652490801906 +2399 0.2399 3085.9473725690500032 54626.595763213008 +2400 0.2400 3080.4893078288396282 54534.699040998094 +2401 0.2401 3075.0404247760529870 54442.962014731602 +2402 0.2402 3069.6007074565327457 54351.384375676702 +2403 0.2403 3064.1701399469598073 54259.965815786403 +2404 0.2404 3058.7487063547855541 54168.706027703003 +2405 0.2405 3053.3363908181627266 54077.604704751699 +2406 0.2406 3047.9331775058781204 53986.661540943802 +2407 0.2407 3042.5390506172825553 53895.876230969705 +2408 0.2408 3037.1539943822240275 53805.248470205006 +2409 0.2409 3031.7779930609790426 53714.777954699202 +2410 0.2410 3026.4110309441848585 53624.464381181097 +2411 0.2411 3021.0530923527730920 53534.307447053601 +2412 0.2412 3015.7041616379005973 53444.306850394503 +2413 0.2413 3010.3642231808835277 53354.462289950905 +2414 0.2414 3005.0332613931291235 53264.773465141203 +2415 0.2415 2999.7112607160693187 53175.240076053502 +2416 0.2416 2994.3982056210948031 53085.861823438296 +2417 0.2417 2989.0940806094872642 52996.638408712999 +2418 0.2418 2983.7988702123534495 52907.569533960697 +2419 0.2419 2978.5125589905592278 52818.654901920796 +2420 0.2420 2973.2351315346631964 52729.894215995701 +2421 0.2421 2967.9665724648511969 52641.287180244297 +2422 0.2422 2962.7068664308699226 52552.833499381995 +2423 0.2423 2957.4559981119618897 52464.532878779304 +2424 0.2424 2952.2139522167999530 52376.385024458694 +2425 0.2425 2946.9807134834222779 52288.389643094008 +2426 0.2426 2941.7562666791673109 52200.546442009203 +2427 0.2427 2936.5405966006082963 52112.855129175194 +2428 0.2428 2931.3336880734891565 52025.315413209799 +2429 0.2429 2926.1355259526599184 51937.927003374003 +2430 0.2430 2920.9460951220125935 51850.689609573805 +2431 0.2431 2915.7653804944161493 51763.602942354606 +2432 0.2432 2910.5933670116532994 51676.666712901999 +2433 0.2433 2905.4300396443563841 51589.880633038709 +2434 0.2434 2900.2753833919432509 51503.244415225607 +2435 0.2435 2895.1293832825540449 51416.757772556099 +2436 0.2436 2889.9920243729884533 51330.420418757996 +2437 0.2437 2884.8632917486411316 51244.232068190409 +2438 0.2438 2879.7431705234394030 51158.192435841898 +2439 0.2439 2874.6316458397809583 51072.301237328495 +2440 0.2440 2869.5287028684697361 50986.558188893199 +2441 0.2441 2864.4343268086549870 50900.963007405691 +2442 0.2442 2859.3485028877666991 50815.515410357591 +2443 0.2443 2854.2712163614555720 50730.215115860905 +2444 0.2444 2849.2024525135298063 50645.061842650393 +2445 0.2445 2844.1421966558932581 50560.055310078096 +2446 0.2446 2839.0904341284835937 50475.195238114095 +2447 0.2447 2834.0471502992108981 50390.481347342393 +2448 0.2448 2829.0123305638958300 50305.913358961196 +2449 0.2449 2823.9859603462086852 50221.490994783097 +2450 0.2450 2818.9680250976080060 50137.213977229301 +2451 0.2451 2813.9585102972800996 50053.082029330297 +2452 0.2452 2808.9574014520771925 49969.094874724695 +2453 0.2453 2803.9646840964578587 49885.252237659493 +2454 0.2454 2798.9803437924256286 49801.553842982008 +2455 0.2455 2794.0043661294694175 49717.999416145503 +2456 0.2456 2789.0367367245021342 49634.588683204303 +2457 0.2457 2784.0774412218011094 49551.321370811900 +2458 0.2458 2779.1264652929494332 49468.197206221193 +2459 0.2459 2774.1837946367741097 49385.215917281603 +2460 0.2460 2769.2494149792878488 49302.377232439292 +2461 0.2461 2764.3233120736294950 49219.680880731205 +2462 0.2462 2759.4054717000035453 49137.126591790395 +2463 0.2463 2754.4958796656219420 49054.714095837509 +2464 0.2464 2749.5945218046458649 48972.443123684905 +2465 0.2465 2744.7013839781247952 48890.313406732996 +2466 0.2466 2739.8164520739396721 48808.324676966702 +2467 0.2467 2734.9397120067433207 48726.476666958304 +2468 0.2468 2730.0711497179022444 48644.769109860303 +2469 0.2469 2725.2107511754384177 48563.201739412500 +2470 0.2470 2720.3585023739715325 48481.774289928202 +2471 0.2471 2715.5143893346598816 48400.486496306803 +2472 0.2472 2710.6783981051435148 48319.338094020408 +2473 0.2473 2705.8505147594864866 48238.328819120099 +2474 0.2474 2701.0307253981191025 48157.458408229504 +2475 0.2475 2696.2190161477801666 48076.726598546695 +2476 0.2476 2691.4153731614605931 47996.133127842899 +2477 0.2477 2686.6197826183456527 47915.677734455705 +2478 0.2478 2681.8322307237581299 47835.360157296396 +2479 0.2479 2677.0527037091014790 47755.180135840208 +2480 0.2480 2672.2811878318029812 47675.137410130999 +2481 0.2481 2667.5176693752578103 47595.231720775002 +2482 0.2482 2662.7621346487717346 47515.462808942604 +2483 0.2483 2658.0145699875060927 47435.830416367091 +2484 0.2484 2653.2749617524204950 47356.334285341603 +2485 0.2485 2648.5432963302177996 47276.974158715799 +2486 0.2486 2643.8195601332868137 47197.749779900900 +2487 0.2487 2639.1037395996486339 47118.660892861495 +2488 0.2488 2634.3958211928998026 47039.707242118697 +2489 0.2489 2629.6957914021563738 46960.888572745607 +2490 0.2490 2625.0036367420007082 46882.204630368098 +2491 0.2491 2620.3193437524241745 46803.655161162395 +2492 0.2492 2615.6428989987734894 46725.239911855104 +2493 0.2493 2610.9742890716947841 46646.958629718196 +2494 0.2494 2606.3135005870803980 46568.811062572298 +2495 0.2495 2601.6605201860124907 46490.796958782208 +2496 0.2496 2597.0153345347102913 46412.916067258309 +2497 0.2497 2592.3779303244750736 46335.168137450499 +2498 0.2498 2587.7482942716351317 46257.552919351801 +2499 0.2499 2583.1264131174930299 46180.070163493096 +2500 0.2500 2578.5122736282710321 46102.719620946293 +2501 0.2501 2573.9058625950578971 46025.501043318305 +2502 0.2502 2569.3071668337543088 45948.414182752800 +2503 0.2503 2564.7161731850205797 45871.458791925696 +2504 0.2504 2560.1328685142216273 45794.634624049708 +2505 0.2505 2555.5572397113760417 45717.941432865307 +2506 0.2506 2550.9892736911006068 45641.378972644598 +2507 0.2507 2546.4289573925589139 45564.946998190797 +2508 0.2508 2541.8762777794077010 45488.645264830899 +2509 0.2509 2537.3312218397450124 45412.473528423296 +2510 0.2510 2532.7937765860565378 45336.431545345607 +2511 0.2511 2528.2639290551642262 45260.519072504707 +2512 0.2512 2523.7416663081726256 45184.735867326002 +2513 0.2513 2519.2269754304184062 45109.081687759004 +2514 0.2514 2514.7198435314171547 45033.556292270499 +2515 0.2515 2510.2202577448110787 44958.159439847099 +2516 0.2516 2505.7282052283189842 44882.890889992304 +2517 0.2517 2501.2436731636830700 44807.750402727906 +2518 0.2518 2496.7666487566175419 44732.737738586598 +2519 0.2519 2492.2971192367572257 44657.852658616903 +2520 0.2520 2487.8350718576075451 44583.094924379795 +2521 0.2521 2483.3804938964913163 44508.464297944804 +2522 0.2522 2478.9333726544991805 44433.960541894907 +2523 0.2523 2474.4936954564386724 44359.583419316696 +2524 0.2524 2470.0614496507823787 44285.332693808101 +2525 0.2525 2465.6366226096183709 44211.208129472303 +2526 0.2526 2461.2192017285992733 44137.209490913890 +2527 0.2527 2456.8091744268913317 44063.336543244193 +2528 0.2528 2452.4065281471253002 43989.589052074101 +2529 0.2529 2448.0112503553455099 43915.966783518801 +2530 0.2530 2443.6233285409598466 43842.469504190398 +2531 0.2531 2439.2427502166901832 43769.096981199298 +2532 0.2532 2434.8695029185223575 43695.848982154908 +2533 0.2533 2430.5035742056566050 43622.725275160294 +2534 0.2534 2426.1449516604579912 43549.725628815402 +2535 0.2535 2421.7936228884063894 43476.849812213404 +2536 0.2536 2417.4495755180487322 43404.097594938306 +2537 0.2537 2413.1127972009485347 43331.468747065606 +2538 0.2538 2408.7832756116372366 43258.963039161194 +2539 0.2539 2404.4609984475650890 43186.580242281205 +2540 0.2540 2400.1459534290529518 43114.320127965395 +2541 0.2541 2395.8381282992427259 43042.182468243103 +2542 0.2542 2391.5375108240491500 42970.167035627703 +2543 0.2543 2387.2440887921120520 42898.273603115304 +2544 0.2544 2382.9578500147467821 42826.501944186399 +2545 0.2545 2378.6787823258973731 42754.851832802698 +2546 0.2546 2374.4068735820869733 42683.323043403994 +2547 0.2547 2370.1421116623710077 42611.915350912997 +2548 0.2548 2365.8844844682889743 42540.628530727903 +2549 0.2549 2361.6339799238162414 42469.462358722500 +2550 0.2550 2357.3905859753176628 42398.416611250410 +2551 0.2551 2353.1542905914984658 42327.491065134702 +2552 0.2552 2348.9250817633578663 42256.685497675295 +2553 0.2553 2344.7029475041417754 42185.999686643503 +2554 0.2554 2340.4878758492955058 42115.433410280406 +2555 0.2555 2336.2798548564164776 42044.986447297691 +2556 0.2556 2332.0788726052078346 41974.658576875998 +2557 0.2557 2327.8849171974306955 41904.449578663502 +2558 0.2558 2323.6979767568586794 41834.359232773393 +2559 0.2559 2319.5180394292306119 41764.387319785608 +2560 0.2560 2315.3450933822041407 41694.533620743801 +2561 0.2561 2311.1791268053093518 41624.797917154108 +2562 0.2562 2307.0201279099023850 41555.179990984892 +2563 0.2563 2302.8680849291199593 41485.679624665296 +2564 0.2564 2298.7229861178325336 41416.296601083704 +2565 0.2565 2294.5848197525988326 41347.030703587108 +2566 0.2566 2290.4535741316203712 41277.881715980198 +2567 0.2567 2286.3292375746950711 41208.849422523002 +2568 0.2568 2282.2117984231722403 41139.933607931496 +2569 0.2569 2278.1012450399070985 41071.134057375304 +2570 0.2570 2273.9975658092143931 41002.450556476993 +2571 0.2571 2269.9007491368251976 40933.882891310590 +2572 0.2572 2265.8107834498396187 40865.430848401702 +2573 0.2573 2261.7276571966831398 40797.094214724399 +2574 0.2574 2257.6513588470616014 40728.872777702003 +2575 0.2575 2253.5818768919161812 40660.766325205201 +2576 0.2576 2249.5191998433783738 40592.774645550504 +2577 0.2577 2245.4633162347258803 40524.897527500296 +2578 0.2578 2241.4142146203380435 40457.134760260400 +2579 0.2579 2237.3718835756508270 40389.486133480394 +2580 0.2580 2233.3363116971140698 40321.951437251795 +2581 0.2581 2229.3074876021460113 40254.530462106304 +2582 0.2582 2225.2853999290900902 40187.222999016405 +2583 0.2583 2221.2700373371694695 40120.028839392602 +2584 0.2584 2217.2613885064456554 40052.947775084096 +2585 0.2585 2213.2594421377725666 39985.979598375292 +2586 0.2586 2209.2641869527542440 39919.124101987894 +2587 0.2587 2205.2756116937011939 39852.381079076695 +2588 0.2588 2201.2937051235858235 39785.750323231201 +2589 0.2589 2197.3184560260006037 39719.231628472306 +2590 0.2590 2193.3498532051144139 39652.824789253107 +2591 0.2591 2189.3878854856288854 39586.529600456597 +2592 0.2592 2185.4325417127361106 39520.345857395303 +2593 0.2593 2181.4838107520758967 39454.273355809702 +2594 0.2594 2177.5416814896921096 39388.311891868507 +2595 0.2595 2173.6061428319903825 39322.461262165401 +2596 0.2596 2169.6771837056962795 39256.721263719905 +2597 0.2597 2165.7547930578116393 39191.091693975497 +2598 0.2598 2161.8389598555727389 39125.572350799390 +2599 0.2599 2157.9296730864089113 39060.163032479802 +2600 0.2600 2154.0269217578984353 38994.863537727193 +2601 0.2601 2150.1306948977285174 38929.673665671195 +2602 0.2602 2146.2409815536520910 38864.593215861401 +2603 0.2603 2142.3577707934459795 38799.621988264706 +2604 0.2604 2138.4810517048695147 38734.759783265603 +2605 0.2605 2134.6108133956231541 38670.006401663995 +2606 0.2606 2130.7470449933061900 38605.361644675795 +2607 0.2607 2126.8897356453758221 38540.825313929905 +2608 0.2608 2123.0388745191057751 38476.397211469397 +2609 0.2609 2119.1944508015449173 38412.077139748406 +2610 0.2610 2115.3564536994758782 38347.864901632805 +2611 0.2611 2111.5248724393741213 38283.760300398208 +2612 0.2612 2107.6996962673679263 38219.763139729796 +2613 0.2613 2103.8809144491956431 38155.873223720395 +2614 0.2614 2100.0685162701661284 38092.090356869907 +2615 0.2615 2096.2624910351182734 38028.414344085097 +2616 0.2616 2092.4628280683800767 37964.844990677302 +2617 0.2617 2088.6695167137281715 37901.382102362200 +2618 0.2618 2084.8825463343468982 37838.025485259095 +2619 0.2619 2081.1019063127896516 37774.774945889003 +2620 0.2620 2077.3275860509365884 37711.630291174704 +2621 0.2621 2073.5595749699559747 37648.591328439499 +2622 0.2622 2069.7978625102637125 37585.657865405294 +2623 0.2623 2066.0424381314837774 37522.829710193393 +2624 0.2624 2062.2932913124082006 37460.106671322195 +2625 0.2625 2058.5504115509565963 37397.488557706703 +2626 0.2626 2054.8137883641384178 37334.975178657405 +2627 0.2627 2051.0834112880115754 37272.566343879604 +2628 0.2628 2047.3592698776440102 37210.261863472399 +2629 0.2629 2043.6413537070741313 37148.061547927195 +2630 0.2630 2039.9296523692712526 37085.965208128306 +2631 0.2631 2036.2241554760973941 37023.972655349600 +2632 0.2632 2032.5248526582670365 36962.083701255899 +2633 0.2633 2028.8317335653091504 36900.298157900899 +2634 0.2634 2025.1447878655278600 36838.615837726109 +2635 0.2635 2021.4640052459635626 36777.036553560596 +2636 0.2636 2017.7893754123545023 36715.560118619498 +2637 0.2637 2014.1208880890983437 36654.186346503200 +2638 0.2638 2010.4585330192132915 36592.915051196891 +2639 0.2639 2006.8022999642998911 36531.746047069195 +2640 0.2640 2003.1521787045028304 36470.679148871197 +2641 0.2641 1999.5081590384725132 36409.714171735599 +2642 0.2642 1995.8702307833268605 36348.850931176305 +2643 0.2643 1992.2383837746137942 36288.089243086899 +2644 0.2644 1988.6126078662723557 36227.428923739797 +2645 0.2645 1984.9928929305960992 36166.869789785793 +2646 0.2646 1981.3792288581942103 36106.411658252597 +2647 0.2647 1977.7716055579544445 36046.054346544697 +2648 0.2648 1974.1700129570051558 35985.797672441404 +2649 0.2649 1970.5744410006782346 35925.641454097000 +2650 0.2650 1966.9848796524713634 35865.585510039295 +2651 0.2651 1963.4013188940109558 35805.629659168699 +2652 0.2652 1959.8237487250146387 35745.773720757599 +2653 0.2653 1956.2521591632541913 35686.017514449697 +2654 0.2654 1952.6865402445187101 35626.360860258006 +2655 0.2655 1949.1268820225775471 35566.803578565705 +2656 0.2656 1945.5731745691430206 35507.345490123706 +2657 0.2657 1942.0254079738342625 35447.986416050597 +2658 0.2658 1938.4835723441401569 35388.726177831704 +2659 0.2659 1934.9476578053827325 35329.564597318094 +2660 0.2660 1931.4176545006805554 35270.501496725505 +2661 0.2661 1927.8935525909125772 35211.536698634103 +2662 0.2662 1924.3753422546815273 35152.670025986605 +2663 0.2663 1920.8630136882777606 35093.901302088903 +2664 0.2664 1917.3565571056428780 35035.230350607693 +2665 0.2665 1913.8559627383340285 34976.656995570600 +2666 0.2666 1910.3612208354873019 34918.181061364696 +2667 0.2667 1906.8723216637822588 34859.802372736594 +2668 0.2668 1903.3892555074060056 34801.520754790101 +2669 0.2669 1899.9120126680170415 34743.336032987201 +2670 0.2670 1896.4405834647104712 34685.248033145595 +2671 0.2671 1892.9749582339811695 34627.256581438902 +2672 0.2672 1889.5151273296894487 34569.361504395092 +2673 0.2673 1886.0610811230249055 34511.562628896398 +2674 0.2674 1882.6128100024711784 34453.859782177904 +2675 0.2675 1879.1703043737709322 34396.252791827101 +2676 0.2676 1875.7335546598903875 34338.741485782499 +2677 0.2677 1872.3025513009845326 34281.325692333601 +2678 0.2678 1868.8772847543618809 34224.005240119601 +2679 0.2679 1865.4577454944494548 34166.779958128100 +2680 0.2680 1862.0439240127582252 34109.649675695502 +2681 0.2681 1858.6358108178480961 34052.614222505399 +2682 0.2682 1855.2333964352935709 33995.673428587303 +2683 0.2683 1851.8366714076482822 33938.827124317009 +2684 0.2684 1848.4456262944117952 33882.075140414905 +2685 0.2685 1845.0602516719936830 33825.417307945499 +2686 0.2686 1841.6805381336805567 33768.853458316502 +2687 0.2687 1838.3064762896008233 33712.383423278196 +2688 0.2688 1834.9380567666908064 33656.007034922201 +2689 0.2689 1831.5752702086606405 33599.724125681394 +2690 0.2690 1828.2181072759601648 33543.534528328295 +2691 0.2691 1824.8665586457450445 33487.438075975100 +2692 0.2692 1821.5206150118426649 33431.434602072099 +2693 0.2693 1818.1802670847187073 33375.523940407598 +2694 0.2694 1814.8455055914430432 33319.705925106296 +2695 0.2695 1811.5163212756563098 33263.980390629797 +2696 0.2696 1808.1927048975360321 33208.347171774003 +2697 0.2697 1804.8746472337638806 33152.806103670009 +2698 0.2698 1801.5621390774913380 33097.357021782802 +2699 0.2699 1798.2551712383067297 33041.999761909894 +2700 0.2700 1794.9537345422022554 32986.734160181099 +2701 0.2701 1791.6578198315403370 32931.560053057903 +2702 0.2702 1788.3674179650208771 32876.477277332109 +2703 0.2703 1785.0825198176480626 32821.485670125803 +2704 0.2704 1781.8031162806973953 32766.585068889704 +2705 0.2705 1778.5291982616827227 32711.775311403500 +2706 0.2706 1775.2607566843239510 32657.056235773802 +2707 0.2707 1771.9977824885136215 32602.427680434710 +2708 0.2708 1768.7402666302846228 32547.889484145904 +2709 0.2709 1765.4882000817776770 32493.441485992706 +2710 0.2710 1762.2415738312088251 32439.083525384500 +2711 0.2711 1759.0003788828369125 32384.815442054991 +2712 0.2712 1755.7646062569310743 32330.637076061001 +2713 0.2713 1752.5342469897389037 32276.548267781101 +2714 0.2714 1749.3092921334539369 32222.548857916001 +2715 0.2715 1746.0897327561838210 32168.638687486804 +2716 0.2716 1742.8755599419177997 32114.817597834997 +2717 0.2717 1739.6667647904948808 32061.085430621199 +2718 0.2718 1736.4633384175726860 32007.442027824596 +2719 0.2719 1733.2652719545942546 31953.887231742607 +2720 0.2720 1730.0725565487575750 31900.420884989202 +2721 0.2721 1726.8851833629832981 31847.042830494902 +2722 0.2722 1723.7031435758831321 31793.752911506497 +2723 0.2723 1720.5264283817284650 31740.550971584897 +2724 0.2724 1717.3550289904189867 31687.436854605403 +2725 0.2725 1714.1889366274508575 31634.410404757298 +2726 0.2726 1711.0281425338857844 31581.471466541901 +2727 0.2727 1707.8726379663200987 31528.619884772808 +2728 0.2728 1704.7224141968526965 31475.855504575404 +2729 0.2729 1701.5774625130545701 31423.178171384890 +2730 0.2730 1698.4377742179378856 31370.587730946798 +2731 0.2731 1695.3033406299248327 31318.084029315905 +2732 0.2732 1692.1741530828162468 31265.666912854998 +2733 0.2733 1689.0502029257618233 31213.336228235101 +2734 0.2734 1685.9314815232282854 31161.091822433904 +2735 0.2735 1682.8179802549698252 31108.933542735402 +2736 0.2736 1679.7096905159964990 31056.861236729805 +2737 0.2737 1676.6066037165444413 31004.874752311101 +2738 0.2738 1673.5087112820449420 30952.973937678697 +2739 0.2739 1670.4160046530942054 30901.158641334994 +2740 0.2740 1667.3284752854231101 30849.428712085006 +2741 0.2741 1664.2461146498669677 30797.783999036103 +2742 0.2742 1661.1689142323352826 30746.224351597004 +2743 0.2743 1658.0968655337815107 30694.749619477298 +2744 0.2744 1655.0299600701732743 30643.359652686609 +2745 0.2745 1651.9681893724623478 30592.054301533499 +2746 0.2746 1648.9115449865544178 30540.833416626003 +2747 0.2747 1645.8600184732797516 30489.696848869105 +2748 0.2748 1642.8136014083629561 30438.644449466206 +2749 0.2749 1639.7722853823938749 30387.676069916401 +2750 0.2750 1636.7360620007973466 30336.791562015409 +2751 0.2751 1633.7049228838038744 30285.990777853694 +2752 0.2752 1630.6788596664202942 30235.273569816600 +2753 0.2753 1627.6578639984002166 30184.639790583307 +2754 0.2754 1624.6419275442146954 30134.089293126301 +2755 0.2755 1621.6310419830228966 30083.621930710397 +2756 0.2756 1618.6251990086427668 30033.237556892796 +2757 0.2757 1615.6243903295221571 29982.936025521398 +2758 0.2758 1612.6286076687092645 29932.717190735006 +2759 0.2759 1609.6378427638244375 29882.580906962205 +2760 0.2760 1606.6520873670303899 29832.527028920900 +2761 0.2761 1603.6713332450035523 29782.555411617497 +2762 0.2762 1600.6955721789054223 29732.665910346608 +2763 0.2763 1597.7247959643536888 29682.858380689300 +2764 0.2764 1594.7589964113935821 29633.132678514601 +2765 0.2765 1591.7981653444689982 29583.488659976094 +2766 0.2766 1588.8422946023945315 29533.926181513598 +2767 0.2767 1585.8913760383263707 29484.445099851604 +2768 0.2768 1582.9454015197338776 29435.045271997697 +2769 0.2769 1580.0043629283718474 29385.726555244000 +2770 0.2770 1577.0682521602514043 29336.488807164395 +2771 0.2771 1574.1370611256124903 29287.331885615604 +2772 0.2772 1571.2107817488949877 29238.255648735394 +2773 0.2773 1568.2894059687112076 29189.259954942099 +2774 0.2774 1565.3729257378174680 29140.344662934898 +2775 0.2775 1562.4613330230861266 29091.509631691704 +2776 0.2776 1559.5546198054780689 29042.754720470206 +2777 0.2777 1556.6527780800142864 28994.079788805400 +2778 0.2778 1553.7557998557485917 28945.484696510495 +2779 0.2779 1550.8636771557391967 28896.969303675505 +2780 0.2780 1547.9764020170221102 28848.533470667106 +2781 0.2781 1545.0939664905824884 28800.177058127301 +2782 0.2782 1542.2163626413273505 28751.899926973398 +2783 0.2783 1539.3435825480587482 28703.701938397004 +2784 0.2784 1536.4756183034457990 28655.582953864105 +2785 0.2785 1533.6124620139969466 28607.542835113403 +2786 0.2786 1530.7541058000333578 28559.581444156400 +2787 0.2787 1527.9005417956616384 28511.698643276803 +2788 0.2788 1525.0517621487463202 28463.894295029502 +2789 0.2789 1522.2077590208828042 28416.168262239895 +2790 0.2790 1519.3685245873705298 28368.520408004595 +2791 0.2791 1516.5340510371859182 28320.950595688206 +2792 0.2792 1513.7043305729553140 28273.458688925908 +2793 0.2793 1510.8793554109279285 28226.044551620100 +2794 0.2794 1508.0591177809499186 28178.708047941400 +2795 0.2795 1505.2436099264364202 28131.449042327404 +2796 0.2796 1502.4328241043458547 28084.267399482298 +2797 0.2797 1499.6267525851528717 28037.162984376104 +2798 0.2798 1496.8253876528217461 27990.135662244596 +2799 0.2799 1494.0287216047802303 27943.185298587494 +2800 0.2800 1491.2367467518922695 27896.311759169599 +2801 0.2801 1488.4494554184327626 27849.514910018399 +2802 0.2802 1485.6668399420605056 27802.794617424806 +2803 0.2803 1482.8888926737922702 27756.150747942091 +2804 0.2804 1480.1156059779759744 27709.583168385092 +2805 0.2805 1477.3469722322652160 27663.091745830199 +2806 0.2806 1474.5829838275931252 27616.676347613706 +2807 0.2807 1471.8236331681457614 27570.336841332704 +2808 0.2808 1469.0689126713368751 27524.073094842999 +2809 0.2809 1466.3188147677817597 27477.884976259804 +2810 0.2810 1463.5733319012708762 27431.772353956403 +2811 0.2811 1460.8324565287448422 27385.735096563498 +2812 0.2812 1458.0961811202682838 27339.773072969401 +2813 0.2813 1455.3644981590039151 27293.886152318293 +2814 0.2814 1452.6374001411875270 27248.074204010998 +2815 0.2815 1449.9148795761018391 27202.337097703108 +2816 0.2816 1447.1969289860514891 27156.674703305493 +2817 0.2817 1444.4835409063371117 27111.086890982901 +2818 0.2818 1441.7747078852303275 27065.573531153896 +2819 0.2819 1439.0704224839480503 27020.134494490194 +2820 0.2820 1436.3706772766277027 26974.769651915805 +2821 0.2821 1433.6754648503015233 26929.478874607303 +2822 0.2822 1430.9847778048715554 26884.262033991698 +2823 0.2823 1428.2986087530846362 26839.119001747691 +2824 0.2824 1425.6169503205071578 26794.049649803594 +2825 0.2825 1422.9397951455000566 26749.053850337994 +2826 0.2826 1420.2671358791942566 26704.131475778406 +2827 0.2827 1417.5989651854652038 26659.282398800991 +2828 0.2828 1414.9352757409087644 26614.506492329507 +2829 0.2829 1412.2760602348155317 26569.803629536196 +2830 0.2830 1409.6213113691467242 26525.173683839203 +2831 0.2831 1406.9710218585096300 26480.616528903600 +2832 0.2832 1404.3251844301323672 26436.132038640295 +2833 0.2833 1401.6837918238400107 26391.720087205293 +2834 0.2834 1399.0468367920298078 26347.380548999397 +2835 0.2835 1396.4143120996463949 26303.113298667806 +2836 0.2836 1393.7862105241581503 26258.918211099000 +2837 0.2837 1391.1625248555319558 26214.795161425005 +2838 0.2838 1388.5432478962097775 26170.744025020103 +2839 0.2839 1385.9283724610836543 26126.764677500600 +2840 0.2840 1383.3178913774725061 26082.856994724592 +2841 0.2841 1380.7117974850966675 26039.020852790898 +2842 0.2842 1378.1100836360551511 25995.256128038607 +2843 0.2843 1375.5127426948008633 25951.562697047200 +2844 0.2844 1372.9197675381167301 25907.940436634897 +2845 0.2845 1370.3311510550920502 25864.389223859303 +2846 0.2846 1367.7468861470983938 25820.908936015694 +2847 0.2847 1365.1669657277657279 25777.499450637893 +2848 0.2848 1362.5913827229589970 25734.160645496100 +2849 0.2849 1360.0201300707542487 25690.892398598000 +2850 0.2850 1357.4532007214149871 25647.694588186896 +2851 0.2851 1354.8905876373685260 25604.567092741992 +2852 0.2852 1352.3322837931825688 25561.509790977805 +2853 0.2853 1349.7782821755415625 25518.522561842998 +2854 0.2854 1347.2285757832232775 25475.605284520709 +2855 0.2855 1344.6831576270758433 25432.757838427591 +2856 0.2856 1342.1420207299938738 25389.980103213304 +2857 0.2857 1339.6051581268952759 25347.271958760008 +2858 0.2858 1337.0725628646982841 25304.633285181801 +2859 0.2859 1334.5442280022980412 25262.063962824795 +2860 0.2860 1332.0201466105436339 25219.563872265600 +2861 0.2861 1329.5003117722146726 25177.132894311595 +2862 0.2862 1326.9847165819990096 25134.770909999694 +2863 0.2863 1324.4733541464690916 25092.477800597000 +2864 0.2864 1321.9662175840592226 25050.253447598996 +2865 0.2865 1319.4633000250428267 25008.097732730093 +2866 0.2866 1316.9645946115092556 24966.010537942209 +2867 0.2867 1314.4700944973415062 24923.991745414991 +2868 0.2868 1311.9797928481930285 24882.041237555197 +2869 0.2869 1309.4936828414654428 24840.158896995599 +2870 0.2870 1307.0117576662858028 24798.344606595303 +2871 0.2871 1304.5340105234840848 24756.598249438706 +2872 0.2872 1302.0604346255704513 24714.919708835201 +2873 0.2873 1299.5910231967127402 24673.308868318702 +2874 0.2874 1297.1257694727144099 24631.765611647097 +2875 0.2875 1294.6646667009920293 24590.289822801802 +2876 0.2876 1292.2077081405525405 24548.881385986904 +2877 0.2877 1289.7548870619716581 24507.540185629397 +2878 0.2878 1287.3061967473713594 24466.266106378105 +2879 0.2879 1284.8616304903973742 24425.059033103396 +2880 0.2880 1282.4211815961973571 24383.918850896800 +2881 0.2881 1279.9848433813990596 24342.845445070001 +2882 0.2882 1277.5526091740878201 24301.838701155204 +2883 0.2883 1275.1244723137849633 24260.898504904195 +2884 0.2884 1272.7004261514252903 24220.024742287307 +2885 0.2885 1270.2804640493361603 24179.217299494296 +2886 0.2886 1267.8645793812147531 24138.476062932394 +2887 0.2887 1265.4527655321066959 24097.800919226698 +2888 0.2888 1263.0450158983844631 24057.191755219901 +2889 0.2889 1260.6413238877248659 24016.648457970492 +2890 0.2890 1258.2416829190885892 23976.170914754504 +2891 0.2891 1255.8460864226976810 23935.759013062299 +2892 0.2892 1253.4545278400146344 23895.412640600603 +2893 0.2893 1251.0670006237201051 23855.131685290798 +2894 0.2894 1248.6834982376922198 23814.916035267910 +2895 0.2895 1246.3040141569847492 23774.765578881699 +2896 0.2896 1243.9285418678059614 23734.680204694800 +2897 0.2897 1241.5570748674970218 23694.659801483103 +2898 0.2898 1239.1896066645110750 23654.704258234997 +2899 0.2899 1236.8261307783918710 23614.813464150502 +2900 0.2900 1234.4666407397521652 23574.987308641605 +2901 0.2901 1232.1111300902534822 23535.225681331307 +2902 0.2902 1229.7595923825842874 23495.528472053098 +2903 0.2903 1227.4120211804390692 23455.895570850800 +2904 0.2904 1225.0684100584976477 23416.326867977696 +2905 0.2905 1222.7287526024040289 23376.822253896797 +2906 0.2906 1220.3930424087452593 23337.381619279600 +2907 0.2907 1218.0612730850309617 23298.004855005696 +2908 0.2908 1215.7334382496724174 23258.691852163196 +2909 0.2909 1213.4095315319618749 23219.442502047197 +2910 0.2910 1211.0895465720514039 23180.256696160010 +2911 0.2911 1208.7734770209328872 23141.134326210304 +2912 0.2912 1206.4613165404166466 23102.075284112900 +2913 0.2913 1204.1530588031116622 23063.079461988404 +2914 0.2914 1201.8486974924041988 23024.146752162495 +2915 0.2915 1199.5482263024377971 22985.277047165495 +2916 0.2916 1197.2516389380928103 22946.470239732495 +2917 0.2917 1194.9589291149661676 22907.726222801699 +2918 0.2918 1192.6700905593502284 22869.044889515302 +2919 0.2919 1190.3851170082134558 22830.426133218600 +2920 0.2920 1188.1040022091794981 22791.869847458904 +2921 0.2921 1185.8267399205071797 22753.375925985907 +2922 0.2922 1183.5533239110702652 22714.944262750796 +2923 0.2923 1181.2837479603374504 22676.574751906410 +2924 0.2924 1179.0180058583518985 22638.267287805895 +2925 0.2925 1176.7560914057114587 22600.021765002995 +2926 0.2926 1174.4979984135486575 22561.838078251400 +2927 0.2927 1172.2437207035109168 22523.716122504004 +2928 0.2928 1169.9932521077400907 22485.655792913094 +2929 0.2929 1167.7465864688529109 22447.656984829497 +2930 0.2930 1165.5037176399214331 22409.719593802198 +2931 0.2931 1163.2646394844523456 22371.843515577697 +2932 0.2932 1161.0293458763685521 22334.028646100400 +2933 0.2933 1158.7978306999880260 22296.274881510893 +2934 0.2934 1156.5700878500051658 22258.582118147198 +2935 0.2935 1154.3461112314707862 22220.950252542396 +2936 0.2936 1152.1258947597723363 22183.379181425895 +2937 0.2937 1149.9094323606150283 22145.868801722107 +2938 0.2938 1147.6967179700013730 22108.419010550104 +2939 0.2939 1145.4877455342127632 22071.029705223402 +2940 0.2940 1143.2825090097890097 22033.700783249689 +2941 0.2941 1141.0810023635099242 21996.432142329904 +2942 0.2942 1138.8832195723755376 21959.223680358395 +2943 0.2943 1136.6891546235865462 21922.075295421906 +2944 0.2944 1134.4988015145254394 21884.986885799706 +2945 0.2945 1132.3121542527374004 21847.958349962697 +2946 0.2946 1130.1292068559105246 21810.989586573698 +2947 0.2947 1127.9499533518576300 21774.080494485999 +2948 0.2948 1125.7743877784960205 21737.230972744001 +2949 0.2949 1123.6025041838297511 21700.440920581997 +2950 0.2950 1121.4342966259293917 21663.710237424202 +2951 0.2951 1119.2697591729140640 21627.038822884606 +2952 0.2952 1117.1088859029316609 21590.426576765603 +2953 0.2953 1114.9516709041404283 21553.873399058597 +2954 0.2954 1112.7981082746903212 21517.379189943109 +2955 0.2955 1110.6481921227039038 21480.943849786192 +2956 0.2956 1108.5019165662574778 21444.567279142808 +2957 0.2957 1106.3592757333626651 21408.249378754495 +2958 0.2958 1104.2202637619475354 21371.990049549408 +2959 0.2959 1102.0848747998379622 21335.789192641801 +2960 0.2960 1099.9531030047392051 21299.646709332294 +2961 0.2961 1097.8249425442172651 21263.562501106295 +2962 0.2962 1095.7003875956802403 21227.536469634397 +2963 0.2963 1093.5794323463599085 21191.568516771702 +2964 0.2964 1091.4620709932935370 21155.658544557708 +2965 0.2965 1089.3482977433047836 21119.806455215505 +2966 0.2966 1087.2381068129864161 21084.012151151801 +2967 0.2967 1085.1314924286809855 21048.275534956098 +2968 0.2968 1083.0284488264630909 21012.596509400799 +2969 0.2969 1080.9289702521209620 20976.974977440201 +2970 0.2970 1078.8330509611384969 20941.410842210797 +2971 0.2971 1076.7406852186763899 20905.904007030193 +2972 0.2972 1074.6518672995550787 20870.454375397603 +2973 0.2973 1072.5665914882356446 20835.061850992402 +2974 0.2974 1070.4848520788023052 20799.726337674198 +2975 0.2975 1068.4066433749444514 20764.447739483301 +2976 0.2976 1066.3319596899384578 20729.225960638396 +2977 0.2977 1064.2607953466297204 20694.060905538397 +2978 0.2978 1062.1931446774146934 20658.952478760504 +2979 0.2979 1060.1290020242236096 20623.900585060299 +2980 0.2980 1058.0683617385020625 20588.905129371196 +2981 0.2981 1056.0112181811932714 20553.966016804603 +2982 0.2982 1053.9575657227205738 20519.083152649095 +2983 0.2983 1051.9073987429696899 20484.256442369908 +2984 0.2984 1049.8607116312707603 20449.485791608902 +2985 0.2985 1047.8174987863810657 20414.771106184300 +2986 0.2986 1045.7777546164672913 20380.112292089398 +2987 0.2987 1043.7414735390882470 20345.509255493700 +2988 0.2988 1041.7086499811764497 20310.961902741205 +2989 0.2989 1039.6792783790217527 20276.470140350699 +2990 0.2990 1037.6533531782533828 20242.033875014895 +2991 0.2991 1035.6308688338226602 20207.653013600895 +2992 0.2992 1033.6118198099852634 20173.327463149100 +2993 0.2993 1031.5962005802841759 20139.057130873094 +2994 0.2994 1029.5840056275326333 20104.841924159002 +2995 0.2995 1027.5752294437963883 20070.681750566000 +2996 0.2996 1025.5698665303768848 20036.576517824404 +2997 0.2997 1023.5679113977937504 20002.526133836800 +2998 0.2998 1021.5693585657680842 19968.530506677002 +2999 0.2999 1019.5742025632047216 19934.589544590097 +3000 0.3000 1017.5824379281756364 19900.703155990996 +3001 0.3001 1015.5940592079027738 19866.871249465505 +3002 0.3002 1013.6090609587409972 19833.093733768997 +3003 0.3003 1011.6274377461612630 19799.370517826697 +3004 0.3004 1009.6491841447333400 19765.701510732397 +3005 0.3005 1007.6742947381092108 19732.086621749200 +3006 0.3006 1005.7027641190063605 19698.525760308701 +3007 0.3007 1003.7345868891903820 19665.018836009905 +3008 0.3008 1001.7697576594588327 19631.565758620403 +3009 0.3009 999.8082710496240679 19598.166438074702 +3010 0.3010 997.8501216884966425 19564.820784474199 +3011 0.3011 995.8953042138685987 19531.528708087404 +3012 0.3012 993.9438132724967545 19498.290119348705 +3013 0.3013 991.9956435200863325 19465.104928858804 +3014 0.3014 990.0507896212742480 19431.973047383901 +3015 0.3015 988.1092462496122835 19398.894385855405 +3016 0.3016 986.1710080875510585 19365.868855369699 +3017 0.3017 984.2360698264232042 19332.896367187699 +3018 0.3018 982.3044261664271062 19299.976832734603 +3019 0.3019 980.3760718166104198 19267.110163599398 +3020 0.3020 978.4510014948536991 19234.296271534702 +3021 0.3021 976.5292099278541400 19201.535068456295 +3022 0.3022 974.6106918511092090 19168.826466442901 +3023 0.3023 972.6954420089002724 19136.170377735602 +3024 0.3024 970.7834551542765666 19103.566714737703 +3025 0.3025 968.8747260490389408 19071.015390014101 +3026 0.3026 966.9692494637235995 19038.516316291898 +3027 0.3027 965.0670201775860733 19006.069406458402 +3028 0.3028 963.1680329785850745 18973.674573562297 +3029 0.3029 961.2722826633663544 18941.331730812701 +3030 0.3030 959.3797640372467868 18909.040791578598 +3031 0.3031 957.4904719141984515 18876.801669389199 +3032 0.3032 955.6044011168323777 18844.614277932604 +3033 0.3033 953.7215464763829686 18812.478531056702 +3034 0.3034 951.8419028326917442 18780.394342767504 +3035 0.3035 949.9654650341918796 18748.361627229802 +3036 0.3036 948.0922279378920621 18716.380298766904 +3037 0.3037 946.2221864093608019 18684.450271859001 +3038 0.3038 944.3553353227106300 18652.571461144697 +3039 0.3039 942.4916695605824088 18620.743781418896 +3040 0.3040 940.6311840141297580 18588.967147634197 +3041 0.3041 938.7738735830031374 18557.241474898801 +3042 0.3042 936.9197331753342723 18525.566678477706 +3043 0.3043 935.0687577077208061 18493.942673791098 +3044 0.3044 933.2209421052104972 18462.369376415496 +3045 0.3045 931.3762813012856441 18430.846702082199 +3046 0.3046 929.5347702378477379 18399.374566676801 +3047 0.3047 927.6964038652018871 18367.952886240295 +3048 0.3048 925.8611771420414698 18336.581576967401 +3049 0.3049 924.0290850354327858 18305.260555206805 +3050 0.3050 922.2001225207993684 18273.989737461001 +3051 0.3051 920.3742845819070908 18242.769040385203 +3052 0.3052 918.5515662108484776 18211.598380788004 +3053 0.3053 916.7319624080275844 18180.477675630202 +3054 0.3054 914.9154681821447639 18149.406842025499 +3055 0.3055 913.1020785501815453 18118.385797238996 +3056 0.3056 911.2917885373851732 18087.414458687497 +3057 0.3057 909.4845931772538279 18056.492743939401 +3058 0.3058 907.6804875115211644 18025.620570713996 +3059 0.3059 905.8794665901414191 17994.797856881196 +3060 0.3060 904.0815254712742899 17964.024520461600 +3061 0.3061 902.2866592212699288 17933.300479625403 +3062 0.3062 900.4948629146540497 17902.625652693001 +3063 0.3063 898.7061316341126940 17871.999958133900 +3064 0.3064 896.9204604704776784 17841.423314567197 +3065 0.3065 895.1378445227112479 17810.895640760398 +3066 0.3066 893.3582788978917506 17780.416855629599 +3067 0.3067 891.5817587111982903 17749.986878239302 +3068 0.3068 889.8082790858961744 17719.605627801902 +3069 0.3069 888.0378351533222485 17689.273023677102 +3070 0.3070 886.2704220528697761 17658.988985372300 +3071 0.3071 884.5060349319741135 17628.753432541700 +3072 0.3072 882.7446689460977041 17598.566284986104 +3073 0.3073 880.9863192587157528 17568.427462652595 +3074 0.3074 879.2309810413013338 17538.336885634999 +3075 0.3075 877.4786494733109521 17508.294474172006 +3076 0.3076 875.7293197421698778 17478.300148648399 +3077 0.3077 873.9829870432577081 17448.353829593907 +3078 0.3078 872.2396465798938152 17418.455437683297 +3079 0.3079 870.4992935633229081 17388.604893735603 +3080 0.3080 868.7619232127003670 17358.802118714200 +3081 0.3081 867.0275307550783737 17329.047033726798 +3082 0.3082 865.2961114253907908 17299.339560024498 +3083 0.3083 863.5676604664395200 17269.679619001705 +3084 0.3084 861.8421731288796082 17240.067132196098 +3085 0.3085 860.1196446712053785 17210.502021288004 +3086 0.3086 858.4000703597359916 17180.984208100497 +3087 0.3087 856.6834454686010076 17151.513614598298 +3088 0.3088 854.9697652797266301 17122.090162888700 +3089 0.3089 853.2590250828211538 17092.713775220196 +3090 0.3090 851.5512201753609816 17063.384373982699 +3091 0.3091 849.8463458625765270 17034.101881707196 +3092 0.3092 848.1443974574378899 17004.866221065298 +3093 0.3093 846.4453702806412139 16975.677314869201 +3094 0.3094 844.7492596605942481 16946.535086071097 +3095 0.3095 843.0560609334024775 16917.439457763197 +3096 0.3096 841.3657694428554805 16888.390353177398 +3097 0.3097 839.6783805404123768 16859.387695684498 +3098 0.3098 837.9938895851884126 16830.431408794699 +3099 0.3099 836.3122919439408633 16801.521416156800 +3100 0.3100 834.6335829910551638 16772.657641557904 +3101 0.3101 832.9577581085311522 16743.840008923398 +3102 0.3102 831.2848126859692002 16715.068442316500 +3103 0.3103 829.6147421205564569 16686.342865937906 +3104 0.3104 827.9475418170532066 16657.663204126002 +3105 0.3105 826.2832071877791122 16629.029381355700 +3106 0.3106 824.6217336525993460 16600.441322238999 +3107 0.3107 822.9631166389111741 16571.898951523995 +3108 0.3108 821.3073515816302006 16543.402194095601 +3109 0.3109 819.6544339231767253 16514.950974973806 +3110 0.3110 818.0043591134623284 16486.545219314903 +3111 0.3111 816.3571226098761144 16458.184852410101 +3112 0.3112 814.7127198772712973 16429.869799685897 +3113 0.3113 813.0711463879517851 16401.599986703499 +3114 0.3114 811.4323976216586516 16373.375339158702 +3115 0.3115 809.7964690655566073 16345.195782881303 +3116 0.3116 808.1633562142208120 16317.061243835298 +3117 0.3117 806.5330545696231184 16288.971648118495 +3118 0.3118 804.9055596411191118 16260.926921961596 +3119 0.3119 803.2808669454345818 16232.926991728898 +3120 0.3120 801.6589720066522204 16204.971783917499 +3121 0.3121 800.0398703561985485 16177.061225156896 +3122 0.3122 798.4235575328302730 16149.195242209200 +3123 0.3123 796.8100290826214405 16121.373761968302 +3124 0.3124 795.1992805589500222 16093.596711459897 +3125 0.3125 793.5913075224849536 16065.864017841603 +3126 0.3126 791.9861055411728330 16038.175608401500 +3127 0.3127 790.3836701902247341 16010.531410559503 +3128 0.3128 788.7839970521034729 15982.931351865795 +3129 0.3129 787.1870817165100789 15955.375360001002 +3130 0.3130 785.5929197803712896 15927.863362775897 +3131 0.3131 784.0015068478259082 15900.395288131404 +3132 0.3132 782.4128385302124116 15872.971064138001 +3133 0.3133 780.8269104460557628 15845.590618995302 +3134 0.3134 779.2437182210543369 15818.253881032397 +3135 0.3135 777.6632574880674156 15790.960778706998 +3136 0.3136 776.0855238871017718 15763.711240605502 +3137 0.3137 774.5105130652993921 15736.505195442704 +3138 0.3138 772.9382206769241748 15709.342572061199 +3139 0.3139 771.3686423833495382 15682.223299431804 +3140 0.3140 769.8017738530453471 15655.147306652594 +3141 0.3141 768.2376107615652927 15628.114522949094 +3142 0.3142 766.6761487915341604 15601.124877673596 +3143 0.3143 765.1173836326352102 15574.178300305502 +3144 0.3144 763.5613109815974440 15547.274720450601 +3145 0.3145 762.0079265421828723 15520.414067840895 +3146 0.3146 760.4572260251741227 15493.596272334398 +3147 0.3147 758.9092051483615933 15466.821263915102 +3148 0.3148 757.3638596365312878 15440.088972692000 +3149 0.3149 755.8211852214517421 15413.399328899599 +3150 0.3150 754.2811776418618592 15386.752262897702 +3151 0.3151 752.7438326434584042 15360.147705170501 +3152 0.3152 751.2091459788834982 15333.585586326502 +3153 0.3153 749.6771134077122269 15307.065837098802 +3154 0.3154 748.1477306964400213 15280.588388344295 +3155 0.3155 746.6209936184706066 15254.153171043698 +3156 0.3156 745.0968979541033832 15227.760116300902 +3157 0.3157 743.5754394905211484 15201.409155343601 +3158 0.3158 742.0566140217779321 15175.100219521795 +3159 0.3159 740.5404173487863773 15148.833240308799 +3160 0.3160 739.0268452793059168 15122.608149300002 +3161 0.3161 737.5158936279302679 15096.424878212994 +3162 0.3162 736.0075582160752674 15070.283358887900 +3163 0.3163 734.5018348719665937 15044.183523285901 +3164 0.3164 732.9987194306278298 15018.125303489898 +3165 0.3165 731.4982077338680710 14992.108631704301 +3166 0.3166 730.0002956302701023 14966.133440254300 +3167 0.3167 728.5049789751781191 14940.199661585801 +3168 0.3168 727.0122536306855636 14914.307228265097 +3169 0.3169 725.5221154656233011 14888.456072979301 +3170 0.3170 724.0345603555475691 14862.646128534601 +3171 0.3171 722.5495841827279264 14836.877327858405 +3172 0.3172 721.0671828361352027 14811.149603996004 +3173 0.3173 719.5873522114297884 14785.462890113296 +3174 0.3174 718.1100882109493568 14759.817119494503 +3175 0.3175 716.6353867436974951 14734.212225542899 +3176 0.3176 715.1632437253313128 14708.648141780497 +3177 0.3177 713.6936550781499591 14683.124801847400 +3178 0.3178 712.2266167310824585 14657.642139501804 +3179 0.3179 710.7621246196763423 14632.200088620200 +3180 0.3180 709.3001746860854837 14606.798583196098 +3181 0.3181 707.8407628790586159 14581.437557340803 +3182 0.3182 706.3838851539273946 14556.116945282796 +3183 0.3183 704.9295374725949159 14530.836681367298 +3184 0.3184 703.4777158035237790 14505.596700055998 +3185 0.3185 702.0284161217246037 14480.396935927703 +3186 0.3186 700.5816344087443213 14455.237323676898 +3187 0.3187 699.1373666526548050 14430.117798114195 +3188 0.3188 697.6956088480408198 14405.038294165999 +3189 0.3189 696.2563569959887673 14379.998746874400 +3190 0.3190 694.8196071040752031 14354.999091396297 +3191 0.3191 693.3853551863551274 14330.039263004197 +3192 0.3192 691.9535972633506162 14305.119197084896 +3193 0.3193 690.5243293620393388 14280.238829140304 +3194 0.3194 689.0975475158429617 14255.398094786404 +3195 0.3195 687.6732477646160078 14230.596929753301 +3196 0.3196 686.2514261546340322 14205.835269885298 +3197 0.3197 684.8320787385828226 14181.113051139997 +3198 0.3198 683.4152015755463481 14156.430209588601 +3199 0.3199 682.0007907309960729 14131.786681415804 +3200 0.3200 680.5888422767793600 14107.182402918901 +3201 0.3201 679.1793522911079890 14082.617310508002 +3202 0.3202 677.7723168585472422 14058.091340706203 +3203 0.3203 676.3677320700045357 14033.604430148298 +3204 0.3204 674.9655940227180508 14009.156515581803 +3205 0.3205 673.5658988202457067 13984.747533865600 +3206 0.3206 672.1686425724539049 13960.377421970399 +3207 0.3207 670.7738213955065021 13936.046116978599 +3208 0.3208 669.3814314118534412 13911.753556083298 +3209 0.3209 667.9914687502198376 13887.499676589097 +3210 0.3210 666.6039295455948377 13863.284415911097 +3211 0.3211 665.2188099392205913 13839.107711574798 +3212 0.3212 663.8361060785809968 13814.969501216401 +3213 0.3213 662.4558141173911281 13790.869722581694 +3214 0.3214 661.0779302155856385 13766.808313527101 +3215 0.3215 659.7024505393084155 13742.785212017996 +3216 0.3216 658.3293712609009845 13718.800356129505 +3217 0.3217 656.9586885588921632 13694.853684046000 +3218 0.3218 655.5903986179868070 13670.945134060799 +3219 0.3219 654.2244976290550085 13647.074644575900 +3220 0.3220 652.8609817891210696 13623.242154102300 +3221 0.3221 651.4998473013530429 13599.447601258602 +3222 0.3222 650.1410903750514763 13575.690924772600 +3223 0.3223 648.7847072256389538 13551.972063478905 +3224 0.3224 647.4306940746489545 13528.290956320794 +3225 0.3225 646.0790471497155067 13504.647542348401 +3226 0.3226 644.7297626845621608 13481.041760719396 +3227 0.3227 643.3828369189913019 13457.473550698604 +3228 0.3228 642.0382660988734642 13433.942851657601 +3229 0.3229 640.6960464761368712 13410.449603074303 +3230 0.3230 639.3561743087564082 13386.993744533902 +3231 0.3231 638.0186458607433906 13363.575215727004 +3232 0.3232 636.6834574021345361 13340.193956450799 +3233 0.3233 635.3506052089816194 13316.849906607604 +3234 0.3234 634.0200855633408992 13293.543006206099 +3235 0.3235 632.6918947532625452 13270.273195359900 +3236 0.3236 631.3660290727801794 13247.040414288000 +3237 0.3237 630.0424848219000751 13223.844603314101 +3238 0.3238 628.7212583065910394 13200.685702866998 +3239 0.3239 627.4023458387737264 13177.563653479701 +3240 0.3240 626.0857437363102918 13154.478395790000 +3241 0.3241 624.7714483229938196 13131.429870539403 +3242 0.3242 623.4594559285382047 13108.418018573699 +3243 0.3243 622.1497628885674658 13085.442780842102 +3244 0.3244 620.8423655446055136 13062.504098397498 +3245 0.3245 619.5372602440658056 13039.601912396203 +3246 0.3246 618.2344433402411141 13016.736164097601 +3247 0.3247 616.9339111922930670 12993.906794863600 +3248 0.3248 615.6356601652419158 12971.113746159703 +3249 0.3249 614.3396866299563044 12948.356959552701 +3250 0.3250 613.0459869631430365 12925.636376713002 +3251 0.3251 611.7545575473368444 12902.951939411898 +3252 0.3252 610.4653947708900432 12880.303589523704 +3253 0.3253 609.1784950279626401 12857.691269023300 +3254 0.3254 607.8938547185121024 12835.114919988300 +3255 0.3255 606.6114702482828989 12812.574484596604 +3256 0.3256 605.3313380287967220 12790.069905127704 +3257 0.3257 604.0534544773422567 12767.601123961904 +3258 0.3258 602.7778160169651755 12745.168083580102 +3259 0.3259 601.5044190764580208 12722.770726563700 +3260 0.3260 600.2332600903500861 12700.408995594800 +3261 0.3261 598.9643354988976398 12678.082833455097 +3262 0.3262 597.6976417480735790 12655.792183026395 +3263 0.3263 596.4331752895577665 12633.536987290405 +3264 0.3264 595.1709325807267987 12611.317189328001 +3265 0.3265 593.9109100846444562 12589.132732319595 +3266 0.3266 592.6531042700512444 12566.983559544999 +3267 0.3267 591.3975116113548438 12544.869614382304 +3268 0.3268 590.1441285886203332 12522.790840308997 +3269 0.3269 588.8929516875598438 12500.747180900500 +3270 0.3270 587.6439773995232372 12478.738579831101 +3271 0.3271 586.3972022214879871 12456.764980873100 +3272 0.3272 585.1526226560495161 12434.826327896597 +3273 0.3273 583.9102352114111909 12412.922564869703 +3274 0.3274 582.6700364013747730 12391.053635857905 +3275 0.3275 581.4320227453306416 12369.219485024303 +3276 0.3276 580.1961907682480160 12347.420056629002 +3277 0.3277 578.9625370006650655 12325.655295029101 +3278 0.3278 577.7310579786797007 12303.925144678702 +3279 0.3279 576.5017502439393411 12282.229550128599 +3280 0.3280 575.2746103436315934 12260.568456025598 +3281 0.3281 574.0496348304747016 12238.941807113297 +3282 0.3282 572.8268202627075425 12217.349548231003 +3283 0.3283 571.6061632040803033 12195.791624313999 +3284 0.3284 570.3876602238449323 12174.267980393197 +3285 0.3285 569.1713078967454749 12152.778561595194 +3286 0.3286 567.9571028030086381 12131.323313141598 +3287 0.3287 566.7450415283341272 12109.902180349600 +3288 0.3288 565.5351206638850954 12088.515108631000 +3289 0.3289 564.3273368062789359 12067.162043492201 +3290 0.3290 563.1216865575776183 12045.842930534702 +3291 0.3291 561.9181665252781386 12024.557715453899 +3292 0.3292 560.7167733223034247 12003.306344039600 +3293 0.3293 559.5175035669926729 11982.088762175801 +3294 0.3294 558.3203538830919115 11960.904915840001 +3295 0.3295 557.1253208997446791 11939.754751103697 +3296 0.3296 555.9324012514829292 11918.638214131199 +3297 0.3297 554.7415915782172533 11897.555251181198 +3298 0.3298 553.5528885252280133 11876.505808604503 +3299 0.3299 552.3662887431555646 11855.489832845298 +3300 0.3300 551.1817888879912744 11834.507270440401 +3301 0.3301 549.9993856210683134 11813.558068019294 +3302 0.3302 548.8190756090521063 11792.642172303902 +3303 0.3303 547.6408555239314637 11771.759530108000 +3304 0.3304 546.4647220430091465 11750.910088337798 +3305 0.3305 545.2906718488926572 11730.093793991102 +3306 0.3306 544.1187016294852583 11709.310594157199 +3307 0.3307 542.9488080779765369 11688.560436017804 +3308 0.3308 541.7809878928334228 11667.843266844604 +3309 0.3309 540.6152377777910942 11647.159034001597 +3310 0.3310 539.4515544418438822 11626.507684942801 +3311 0.3311 538.2899345992360622 11605.889167213696 +3312 0.3312 537.1303749694528733 11585.303428450199 +3313 0.3313 535.9728722772114224 11564.750416378301 +3314 0.3314 534.8174232524518175 11544.230078814697 +3315 0.3315 533.6640246303278445 11523.742363665900 +3316 0.3316 532.5126731511981006 11503.287218928403 +3317 0.3317 531.3633655606172397 11482.864592688602 +3318 0.3318 530.2160986093266501 11462.474433122195 +3319 0.3319 529.0708690532458149 11442.116688494199 +3320 0.3320 527.9276736534631027 11421.791307159096 +3321 0.3321 526.7865091762271277 11401.498237560496 +3322 0.3322 525.6473723929375410 11381.237428230299 +3323 0.3323 524.5102600801365043 11361.008827789694 +3324 0.3324 523.3751690194995945 11340.812384948200 +3325 0.3325 522.2420959978270503 11320.648048503506 +3326 0.3326 521.1110378070347906 11300.515767341800 +3327 0.3327 519.9819912441458882 11280.415490437001 +3328 0.3328 518.8549531112814748 11260.347166851097 +3329 0.3329 517.7299202156522142 11240.310745733295 +3330 0.3330 516.6068893695495490 11220.306176320897 +3331 0.3331 515.4858573903366050 11200.333407938298 +3332 0.3332 514.3668211004398927 11180.392389996799 +3333 0.3333 513.2497773273403254 11160.483071995106 +3334 0.3334 512.1347229035646933 11140.605403518399 +3335 0.3335 511.0216546666768522 11120.759334238704 +3336 0.3336 509.9105694592691975 11100.944813914597 +3337 0.3337 508.8014641289539099 11081.161792390703 +3338 0.3338 507.6943355283544861 11061.410219598103 +3339 0.3339 506.5891805150969276 11041.690045553602 +3340 0.3340 505.4859959518012147 11022.001220360195 +3341 0.3341 504.3847787060728933 11002.343694206196 +3342 0.3342 503.2855256504943213 10982.717417365500 +3343 0.3343 502.1882336626161987 10963.122340197406 +3344 0.3344 501.0928996249490410 10943.558413146195 +3345 0.3345 499.9995204249546532 10924.025586741504 +3346 0.3346 498.9080929550377164 10904.523811597399 +3347 0.3347 497.8186141125372046 10885.053038412800 +3348 0.3348 496.7310807997179722 10865.613217971397 +3349 0.3349 495.6454899237623408 10846.204301140802 +3350 0.3350 494.5618383967616865 10826.826238872804 +3351 0.3351 493.4801231357078564 10807.478982203698 +3352 0.3352 492.4003410624849835 10788.162482253298 +3353 0.3353 491.3224891038610735 10768.876690225094 +3354 0.3354 490.2465641914795356 10749.621557406201 +3355 0.3355 489.1725632618508826 10730.397035167094 +3356 0.3356 488.1004832563444324 10711.203074961493 +3357 0.3357 487.0303211211800658 10692.039628326202 +3358 0.3358 485.9620738074196993 10672.906646880903 +3359 0.3359 484.8957382709592707 10653.804082327901 +3360 0.3360 483.8313114725202695 10634.731886452304 +3361 0.3361 482.7687903776416078 10615.690011121405 +3362 0.3362 481.7081719566712650 10596.678408285203 +3363 0.3363 480.6494531847582721 10577.697029975199 +3364 0.3364 479.5926310418442426 10558.745828305095 +3365 0.3365 478.5377025126554713 10539.824755470698 +3366 0.3366 477.4846645866944641 10520.933763749199 +3367 0.3367 476.4335142582320373 10502.072805498996 +3368 0.3368 475.3842485262990749 10483.241833160399 +3369 0.3369 474.3368643946783436 10464.440799254298 +3370 0.3370 473.2913588718964775 10445.669656383099 +3371 0.3371 472.2477289712158495 10426.928357229801 +3372 0.3372 471.2059717106264429 10408.216854558195 +3373 0.3373 470.1660841128378934 10389.535101212299 +3374 0.3374 469.1280632052714168 10370.883050117402 +3375 0.3375 468.0919060200516810 10352.260654277794 +3376 0.3376 467.0576095939988477 10333.667866779200 +3377 0.3377 466.0251709686206141 10315.104640785903 +3378 0.3378 464.9945871901041414 10296.570929543304 +3379 0.3379 463.9658553093082105 10278.066686375401 +3380 0.3380 462.9389723817550930 10259.591864686394 +3381 0.3381 461.9139354676228209 10241.146417959098 +3382 0.3382 460.8907416317370576 10222.730299756200 +3383 0.3383 459.8693879435633107 10204.343463719102 +3384 0.3384 458.8498714771989171 10185.985863568203 +3385 0.3385 457.8321893113654255 10167.657453102198 +3386 0.3386 456.8163385294003547 10149.358186198995 +3387 0.3387 455.8023162192496898 10131.088016814596 +3388 0.3388 454.7901194734598107 10112.846898983196 +3389 0.3389 453.7797453891697614 10094.634786817303 +3390 0.3390 452.7711910681035192 10076.451634507401 +3391 0.3391 451.7644536165620366 10058.297396321701 +3392 0.3392 450.7595301454156242 10040.172026606197 +3393 0.3393 449.7564177700961068 10022.075479784304 +3394 0.3394 448.7551136105890350 10004.007710357000 +3395 0.3395 447.7556147914260691 9985.968672902105 +3396 0.3396 446.7579184416771909 9967.958322075101 +3397 0.3397 445.7620216949430301 9949.976612608305 +3398 0.3398 444.7679216893470766 9932.023499310199 +3399 0.3399 443.7756155675282344 9914.098937066599 +3400 0.3400 442.7851004766329197 9896.202880839905 +3401 0.3401 441.7963735683075015 9878.335285668196 +3402 0.3402 440.8094319986907408 9860.496106666702 +3403 0.3403 439.8242729284061170 9842.685299025499 +3404 0.3404 438.8408935225542677 9824.902818012000 +3405 0.3405 437.8592909507052582 9807.148618968400 +3406 0.3406 436.8794623868911913 9789.422657312803 +3407 0.3407 435.9014050095985908 9771.724888539000 +3408 0.3408 434.9251160017608413 9754.055268216005 +3409 0.3409 433.9505925507506277 9736.413751988097 +3410 0.3410 432.9778318483724888 9718.800295574394 +3411 0.3411 432.0068310908553144 9701.214854769300 +3412 0.3412 431.0375874788447845 9683.657385441802 +3413 0.3413 430.0700982173959233 9666.127843535600 +3414 0.3414 429.1043605159657091 9648.626185068795 +3415 0.3415 428.1403715884055714 9631.152366133902 +3416 0.3416 427.1781286529540012 9613.706342898004 +3417 0.3417 426.2176289322290472 9596.288071601601 +3418 0.3418 425.2588696532209838 9578.897508559807 +3419 0.3419 424.3018480472849205 9561.534610160903 +3420 0.3420 423.3465613501335270 9544.199332867502 +3421 0.3421 422.3930068018294151 9526.891633215200 +3422 0.3422 421.4411816467779772 9509.611467813200 +3423 0.3423 420.4910831337201103 9492.358793344101 +3424 0.3424 419.5427085157247689 9475.133566563200 +3425 0.3425 418.5960550501816329 9457.935744299204 +3426 0.3426 417.6511199987940017 9440.765283453402 +3427 0.3427 416.7079006275713482 9423.622141000000 +3428 0.3428 415.7663942068220990 9406.506273985404 +3429 0.3429 414.8265980111463591 9389.417639528896 +3430 0.3430 413.8885093194288061 9372.356194821601 +3431 0.3431 412.9521254148313574 9355.321897127105 +3432 0.3432 412.0174435847859513 9338.314703780903 +3433 0.3433 411.0844611209873847 9321.334572190397 +3434 0.3434 410.1531753193861505 9304.381459834600 +3435 0.3435 409.2235834801812189 9287.455324264294 +3436 0.3436 408.2956829078129317 9270.556123101902 +3437 0.3437 407.3694709109557834 9253.683814040705 +3438 0.3438 406.4449448025114862 9236.838354845706 +3439 0.3439 405.5221018996015800 9220.019703352504 +3440 0.3440 404.6009395235605552 9203.227817468098 +3441 0.3441 403.6814549999286328 9186.462655169897 +3442 0.3442 402.7636456584448297 9169.724174506198 +3443 0.3443 401.8475088330397398 9153.012333595900 +3444 0.3444 400.9330418618285421 9136.327090627994 +3445 0.3445 400.0202420871040090 9119.668403862102 +3446 0.3446 399.1091068553295145 9103.036231628001 +3447 0.3447 398.1996335171318719 9086.430532325001 +3448 0.3448 397.2918194272944561 9069.851264422905 +3449 0.3449 396.3856619447502680 9053.298386460599 +3450 0.3450 395.4811584325748868 9036.771857047504 +3451 0.3451 394.5783062579794205 9020.271634861601 +3452 0.3452 393.6771027923037991 9003.797678650895 +3453 0.3453 392.7775454110096689 8987.349947231902 +3454 0.3454 391.8796314936735143 8970.928399491204 +3455 0.3455 390.9833584239797801 8954.532994383502 +3456 0.3456 390.0887235897139931 8938.163690932794 +3457 0.3457 389.1957243827557704 8921.820448231701 +3458 0.3458 388.3043581990721123 8905.503225441098 +3459 0.3459 387.4146224387105235 8889.211981791101 +3460 0.3460 386.5265145057920222 8872.946676579202 +3461 0.3461 385.6400318085044887 8856.707269171799 +3462 0.3462 384.7551717590957310 8840.493719002996 +3463 0.3463 383.8719317738668337 8824.305985574996 +3464 0.3464 382.9903092731651668 8808.144028457806 +3465 0.3465 382.1103016813778481 8792.007807289097 +3466 0.3466 381.2319064269246951 8775.897281774000 +3467 0.3467 380.3551209422517445 8759.812411685394 +3468 0.3468 379.4799426638243176 8743.753156862898 +3469 0.3469 378.6063690321204831 8727.719477214196 +3470 0.3470 377.7343974916241223 8711.711332713101 +3471 0.3471 376.8640254908184488 8695.728683400797 +3472 0.3472 375.9952504821791308 8679.771489385399 +3473 0.3473 375.1280699221677537 8663.839710841698 +3474 0.3474 374.2624812712251128 8647.933308010797 +3475 0.3475 373.3984819937645625 8632.052241200305 +3476 0.3476 372.5360695581653658 8616.196470784002 +3477 0.3477 371.6752414367660435 8600.365957202703 +3478 0.3478 370.8159951058578372 8584.560660961899 +3479 0.3479 369.9583280456780017 8568.780542634304 +3480 0.3480 369.1022377404033818 8553.025562857605 +3481 0.3481 368.2477216781437050 8537.295682335702 +3482 0.3482 367.3947773509350441 8521.590861837802 +3483 0.3483 366.5434022547332233 8505.911062198800 +3484 0.3484 365.6935938894073388 8490.256244318400 +3485 0.3485 364.8453497587333345 8474.626369162201 +3486 0.3486 363.9986673703871816 8459.021397760502 +3487 0.3487 363.1535442359387389 8443.441291208699 +3488 0.3488 362.3099778708449321 8427.886010666902 +3489 0.3489 361.4679657944435576 8412.355517360105 +3490 0.3490 360.6275055299466885 8396.849772577705 +3491 0.3491 359.7885946044340812 8381.368737673896 +3492 0.3492 358.9512305488470361 8365.912374066902 +3493 0.3493 358.1154108979816897 8350.480643239498 +3494 0.3494 357.2811331904827625 8335.073506738503 +3495 0.3495 356.4483949688371354 8319.690926174597 +3496 0.3496 355.6171937793673123 8304.332863222400 +3497 0.3497 354.7875271722251682 8288.999279620402 +3498 0.3498 353.9593927013855819 8273.690137170801 +3499 0.3499 353.1327879246400698 8258.405397739203 +3500 0.3500 352.3077104035903631 8243.145023254605 +3501 0.3501 351.4841577036421540 8227.908975709601 +3502 0.3502 350.6621273939987304 8212.697217159402 +3503 0.3503 349.8416170476546085 8197.509709722894 +3504 0.3504 349.0226242413893942 8182.346415581604 +3505 0.3505 348.2051465557613028 8167.207296979897 +3506 0.3506 347.3891815751010768 8152.092316224996 +3507 0.3507 346.5747268875055056 8137.001435686499 +3508 0.3508 345.7617800848313436 8121.934617796702 +3509 0.3509 344.9503387626890003 8106.891825050196 +3510 0.3510 344.1404005204362875 8091.873020004001 +3511 0.3511 343.3319629611722235 8076.878165276794 +3512 0.3512 342.5250236917308939 8061.907223549897 +3513 0.3513 341.7195803226750854 8046.960157566100 +3514 0.3514 340.9156304682902601 8032.036930130300 +3515 0.3515 340.1131717465783026 8017.137504108599 +3516 0.3516 339.3122017792514384 8002.261842429194 +3517 0.3517 338.5127181917258667 7987.409908081696 +3518 0.3518 337.7147186131159629 7972.581664116595 +3519 0.3519 336.9182006762277979 7957.777073646197 +3520 0.3520 336.1231620175533408 7942.996099843396 +3521 0.3521 335.3296002772640350 7928.238705942502 +3522 0.3522 334.5375130992050003 7913.504855238498 +3523 0.3523 333.7468981308887237 7898.794511087304 +3524 0.3524 332.9577530234890901 7884.107636905195 +3525 0.3525 332.1700754318353574 7869.444196169396 +3526 0.3526 331.3838630144060176 7854.804152417499 +3527 0.3527 330.5991134333227706 7840.187469247103 +3528 0.3528 329.8158243543446133 7825.594110316400 +3529 0.3529 329.0339934468616434 7811.024039343400 +3530 0.3530 328.2536183838891475 7796.477220106601 +3531 0.3531 327.4746968420616327 7781.953616443701 +3532 0.3532 326.6972265016268011 7767.453192252797 +3533 0.3533 325.9212050464395816 7752.975911491201 +3534 0.3534 325.1466301639562175 7738.521738176096 +3535 0.3535 324.3734995452281851 7724.090636383997 +3536 0.3536 323.6018108848964516 7709.682570250894 +3537 0.3537 322.8315618811853369 7695.297503971800 +3538 0.3538 322.0627502358967149 7680.935401800802 +3539 0.3539 321.2953736544041021 7666.596228051400 +3540 0.3540 320.5294298456467459 7652.279947095602 +3541 0.3541 319.7649165221237695 7637.986523364300 +3542 0.3542 319.0018313998882036 7623.715921347495 +3543 0.3543 318.2401721985411882 7609.468105593005 +3544 0.3544 317.4799366412261747 7595.243040707697 +3545 0.3545 316.7211224546229573 7581.040691356902 +3546 0.3546 315.9637273689419317 7566.861022263605 +3547 0.3547 315.2077491179182971 7552.703998209501 +3548 0.3548 314.4531854388060879 7538.569584034201 +3549 0.3549 313.7000340723726026 7524.457744635198 +3550 0.3550 312.9482927628924358 7510.368444967600 +3551 0.3551 312.1979592581417933 7496.301650044894 +3552 0.3552 311.4490313093926943 7482.257324937404 +3553 0.3553 310.7015066714071168 7468.235434773604 +3554 0.3554 309.9553831024314832 7454.235944739004 +3555 0.3555 309.2106583641906923 7440.258820076699 +3556 0.3556 308.4673302218825484 7426.304026086698 +3557 0.3557 307.7253964441719063 7412.371528126307 +3558 0.3558 306.9848548031851010 7398.461291609798 +3559 0.3559 306.2457030745042061 7384.573282008503 +3560 0.3560 305.5079390371612931 7370.707464850202 +3561 0.3561 304.7715604736328032 7356.863805719404 +3562 0.3562 304.0365651698339775 7343.042270257502 +3563 0.3563 303.3029509151130014 7329.242824162196 +3564 0.3564 302.5707155022454913 7315.465433187499 +3565 0.3565 301.8398567274289235 7301.710063143804 +3566 0.3566 301.1103723902768365 7287.976679897598 +3567 0.3567 300.3822602938133741 7274.265249371401 +3568 0.3568 299.6555182444676007 7260.575737543903 +3569 0.3569 298.9301440520679307 7246.908110449502 +3570 0.3570 298.2061355298365584 7233.262334178398 +3571 0.3571 297.4834904943838296 7219.638374876198 +3572 0.3572 296.7622067657027856 7206.036198744401 +3573 0.3573 296.0422821671635347 7192.455772040201 +3574 0.3574 295.3237145255077394 7178.897061075397 +3575 0.3575 294.6065016708431017 7165.360032217697 +3576 0.3576 293.8906414366377362 7151.844651889598 +3577 0.3577 293.1761316597148266 7138.350886569002 +3578 0.3578 292.4629701802469413 7124.878702788297 +3579 0.3579 291.7511548417507470 7111.428067135097 +3580 0.3580 291.0406834910813814 7097.998946251701 +3581 0.3581 290.3315539784270527 7084.591306834998 +3582 0.3582 289.6237641573034693 7071.205115636396 +3583 0.3583 288.9173118845485533 7057.840339461698 +3584 0.3584 288.2121950203168694 7044.496945171602 +3585 0.3585 287.5084114280742824 7031.174899680398 +3586 0.3586 286.8059589745924427 7017.874169956700 +3587 0.3587 286.1048355299434434 7004.594723023602 +3588 0.3588 285.4050389674943631 6991.336525957497 +3589 0.3589 284.7065671639020366 6978.099545889199 +3590 0.3590 284.0094179991074270 6964.883750003097 +3591 0.3591 283.3135893563303966 6951.689105537196 +3592 0.3592 282.6190791220643632 6938.515579783001 +3593 0.3593 281.9258851860709001 6925.363140085999 +3594 0.3594 281.2340054413743928 6912.231753844204 +3595 0.3595 280.5434377842566960 6899.121388509800 +3596 0.3596 279.8541801142518466 6886.032011587402 +3597 0.3597 279.1662303341407210 6872.963590635401 +3598 0.3598 278.4795863499456914 6859.916093264699 +3599 0.3599 277.7942460709255101 6846.889487139098 +3600 0.3600 277.1102074095697958 6833.883739975699 +3601 0.3601 276.4274682815938036 6820.898819543603 +3602 0.3602 275.7460266059333662 6807.934693665298 +3603 0.3603 275.0658803047393235 6794.991330214998 +3604 0.3604 274.3870273033725766 6782.068697119899 +3605 0.3605 273.7094655303986315 6769.166762359400 +3606 0.3606 273.0331929175824257 6756.285493965002 +3607 0.3607 272.3582073998831561 6743.424860020499 +3608 0.3608 271.6845069154490488 6730.584828661598 +3609 0.3609 271.0120894056121870 6717.765368076096 +3610 0.3610 270.3409528148832237 6704.966446503502 +3611 0.3611 269.6710950909462667 6692.188032235197 +3612 0.3612 269.0025141846538190 6679.430093614297 +3613 0.3613 268.3352080500213219 6666.692599035297 +3614 0.3614 267.6691746442223234 6653.975516944196 +3615 0.3615 267.0044119275831918 6641.278815838701 +3616 0.3616 266.3409178635778858 6628.602464267402 +3617 0.3617 265.6786904188230096 6615.946430830401 +3618 0.3618 265.0177275630725262 6603.310684178701 +3619 0.3619 264.3580272692128688 6590.695193014501 +3620 0.3620 263.6995875132575975 6578.099926090697 +3621 0.3621 263.0424062743425111 6565.524852211398 +3622 0.3622 262.3864815347203603 6552.969940231098 +3623 0.3623 261.7318112797560730 6540.435159055098 +3624 0.3624 261.0783934979213541 6527.920477639400 +3625 0.3625 260.4262261807898540 6515.425864990098 +3626 0.3626 259.7753073230321661 6502.951290164099 +3627 0.3627 259.1256349224105406 6490.496722268399 +3628 0.3628 258.4772069797741096 6478.062130460003 +3629 0.3629 257.8300214990537711 6465.647483946701 +3630 0.3630 257.1840764872571867 6453.252751985201 +3631 0.3631 256.5393699544637798 6440.877903883302 +3632 0.3632 255.8958999138197328 6428.522908997900 +3633 0.3633 255.2536643815330422 6416.187736735901 +3634 0.3634 254.6126613768685445 6403.872356553802 +3635 0.3635 253.9728889221429711 6391.576737957897 +3636 0.3636 253.3343450427198889 6379.300850503500 +3637 0.3637 252.6970277670049256 6367.044663795899 +3638 0.3638 252.0609351264406826 6354.808147489097 +3639 0.3639 251.4260651555018740 6342.591271286903 +3640 0.3640 250.7924158916904389 6330.394004941703 +3641 0.3641 250.1599853755305674 6318.216318255498 +3642 0.3642 249.5287716505638400 6306.058181078803 +3643 0.3643 248.8987727633443399 6293.919563310999 +3644 0.3644 248.2699867634337636 6281.800434900604 +3645 0.3645 247.6424117033965047 6269.700765844398 +3646 0.3646 247.0160456387948784 6257.620526188199 +3647 0.3647 246.3908866281841767 6245.559686025998 +3648 0.3648 245.7669327331078648 6233.518215500397 +3649 0.3649 245.1441820180927209 6221.496084802300 +3650 0.3650 244.5226325506440617 6209.493264170804 +3651 0.3651 243.9022824012408535 6197.509723893305 +3652 0.3652 243.2831296433309376 6185.545434305099 +3653 0.3653 242.6651723533261986 6173.600365789902 +3654 0.3654 242.0484086105977610 6161.674488778601 +3655 0.3655 241.4328364974712997 6149.767773750802 +3656 0.3656 240.8184540992221230 6137.880191232998 +3657 0.3657 240.2052595040704546 6126.011711800198 +3658 0.3658 239.5932508031767441 6114.162306074002 +3659 0.3659 238.9824260906368067 6102.331944724501 +3660 0.3660 238.3727834634771625 6090.520598468600 +3661 0.3661 237.7643210216502041 6078.728238070598 +3662 0.3662 237.1570368680295644 6066.954834341996 +3663 0.3663 236.5509291084053984 6055.200358141501 +3664 0.3664 235.9459958514795801 6043.464780375100 +3665 0.3665 235.3422352088610410 6031.748071995604 +3666 0.3666 234.7396452950611376 6020.050204002400 +3667 0.3667 234.1382242274889052 6008.371147442198 +3668 0.3668 233.5379701264463961 5996.710873408199 +3669 0.3669 232.9388811151239622 5985.069353040199 +3670 0.3670 232.3409553195957074 5973.446557524701 +3671 0.3671 231.7441908688147407 5961.842458094703 +3672 0.3672 231.1485858946085443 5950.257026029401 +3673 0.3673 230.5541385316743401 5938.690232654499 +3674 0.3674 229.9608469175745142 5927.142049341797 +3675 0.3675 229.3687091927319557 5915.612447509404 +3676 0.3676 228.7777235004254237 5904.101398621300 +3677 0.3677 228.1878879867849719 5892.608874187797 +3678 0.3678 227.5992008007873437 5881.134845764696 +3679 0.3679 227.0116600942514253 5869.679284953800 +3680 0.3680 226.4252640218336126 5858.242163402698 +3681 0.3681 225.8400107410232351 5846.823452804696 +3682 0.3682 225.2558984121380661 5835.423124898596 +3683 0.3683 224.6729251983197173 5824.041151468504 +3684 0.3684 224.0910892655290638 5812.677504344403 +3685 0.3685 223.5103887825417814 5801.332155401302 +3686 0.3686 222.9308219209437425 5790.005076559297 +3687 0.3687 222.3523868551265537 5778.696239784200 +3688 0.3688 221.7750817622830368 5767.405617086399 +3689 0.3689 221.1989048224026249 5756.133180521600 +3690 0.3690 220.6238542182670415 5744.878902190303 +3691 0.3691 220.0499281354456400 5733.642754237804 +3692 0.3692 219.4771247622910266 5722.424708854698 +3693 0.3693 218.9054422899345127 5711.224738275403 +3694 0.3694 218.3348789122817664 5700.042814779699 +3695 0.3695 217.7654328260082082 5688.878910691496 +3696 0.3696 217.1971022305546626 5677.732998379499 +3697 0.3697 216.6298853281228673 5666.605050256603 +3698 0.3698 216.0637803236710397 5655.495038779802 +3699 0.3699 215.4987854249095278 5644.402936450602 +3700 0.3700 214.9348988422962634 5633.328715814598 +3701 0.3701 214.3721187890324416 5622.272349461597 +3702 0.3702 213.8104434810581154 5611.233810025198 +3703 0.3703 213.2498711370477338 5600.213070182705 +3704 0.3704 212.6903999784058215 5589.210102655696 +3705 0.3705 212.1320282292625734 5578.224880209298 +3706 0.3706 211.5747541164694780 5567.257375652498 +3707 0.3707 211.0185758695949687 5556.307561837501 +3708 0.3708 210.4634917209200751 5545.375411660498 +3709 0.3709 209.9094999054340178 5534.460898060803 +3710 0.3710 209.3565986608299170 5523.563994021202 +3711 0.3711 208.8047862275004718 5512.684672567899 +3712 0.3712 208.2540608485335838 5501.822906770001 +3713 0.3713 207.7044207697080651 5490.978669740205 +3714 0.3714 207.1558642394893468 5480.151934633901 +3715 0.3715 206.6083895090251588 5469.342674649699 +3716 0.3716 206.0619948321412096 5458.550863029097 +3717 0.3717 205.5166784653369518 5447.776473056198 +3718 0.3718 204.9724386677812333 5437.019478058301 +3719 0.3719 204.4292737013080625 5426.279851404903 +3720 0.3720 203.8871818304124020 5415.557566508502 +3721 0.3721 203.3461613222457629 5404.852596823999 +3722 0.3722 202.8062104466121127 5394.164915848804 +3723 0.3723 202.2673274759635547 5383.494497122498 +3724 0.3724 201.7295106853960647 5372.841314227502 +3725 0.3725 201.1927583526453134 5362.205340787805 +3726 0.3726 200.6570687580824313 5351.586550470100 +3727 0.3727 200.1224401847097738 5340.984916982798 +3728 0.3728 199.5888709181568004 5330.400414076699 +3729 0.3729 199.0563592466757541 5319.833015544198 +3730 0.3730 198.5249034611375407 5309.282695219801 +3731 0.3731 197.9945018550275506 5298.749426979801 +3732 0.3732 197.4651527244414524 5288.233184741897 +3733 0.3733 196.9368543680810433 5277.733942466002 +3734 0.3734 196.4096050872500996 5267.251674153002 +3735 0.3735 195.8834031858501703 5256.786353845699 +3736 0.3736 195.3582469703764559 5246.337955628303 +3737 0.3737 194.8341347499137441 5235.906453626198 +3738 0.3738 194.3110648361321182 5225.491822006101 +3739 0.3739 193.7890355432830063 5215.094034976202 +3740 0.3740 193.2680451881949182 5204.713066785396 +3741 0.3741 192.7480920902694379 5194.348891724003 +3742 0.3742 192.2291745714770741 5184.001484123200 +3743 0.3743 191.7112909563531673 5173.670818355000 +3744 0.3744 191.1944395719937972 5163.356868832496 +3745 0.3745 190.6786187480516901 5153.059610009397 +3746 0.3746 190.1638268167322110 5142.779016380202 +3747 0.3747 189.6500621127891861 5132.515062480103 +3748 0.3748 189.1373229735209520 5122.267722884601 +3749 0.3749 188.6256077387662344 5112.036972209997 +3750 0.3750 188.1149147509000841 5101.822785112901 +3751 0.3751 187.6052423548299259 5091.625136290302 +3752 0.3752 187.0965888979914382 5081.444000479300 +3753 0.3753 186.5889527303446016 5071.279352457499 +3754 0.3754 186.0823322043696066 5061.131167042597 +3755 0.3755 185.5767256750628746 5050.999419092102 +3756 0.3756 185.0721314999330787 5040.884083503795 +3757 0.3757 184.5685480389971360 5030.785135215196 +3758 0.3758 184.0659736547761725 5020.702549204103 +3759 0.3759 183.5644067122915999 5010.636300487604 +3760 0.3760 183.0638455790610806 5000.586364122602 +3761 0.3761 182.5642886250946617 4990.552715206002 +3762 0.3762 182.0657342228906543 4980.535328874103 +3763 0.3763 181.5681807474318248 4970.534180302300 +3764 0.3764 181.0716265761813872 4960.549244706297 +3765 0.3765 180.5760700890790531 4950.580497340496 +3766 0.3766 180.0815096685370804 4940.627913498800 +3767 0.3767 179.5879436994364085 4930.691468514498 +3768 0.3768 179.0953705691227071 4920.771137759799 +3769 0.3769 178.6037886674023980 4910.866896646297 +3770 0.3770 178.1131963865388457 4900.978720624502 +3771 0.3771 177.6235921212484357 4891.106585183799 +3772 0.3772 177.1349742686966238 4881.250465852598 +3773 0.3773 176.6473412284940991 4871.410338198104 +3774 0.3774 176.1606914026928905 4861.586177826197 +3775 0.3775 175.6750231957825008 4851.777960381802 +3776 0.3776 175.1903350146860134 4841.985661547798 +3777 0.3777 174.7066252687562837 4832.209257046703 +3778 0.3778 174.2238923697720452 4822.448722638303 +3779 0.3779 173.7421347319340441 4812.704034121703 +3780 0.3780 173.2613507718612595 4802.975167333901 +3781 0.3781 172.7815389085870379 4793.262098150601 +3782 0.3782 172.3026975635552560 4783.564802485198 +3783 0.3783 171.8248251606164843 4773.883256290002 +3784 0.3784 171.3479201260242633 4764.217435554496 +3785 0.3785 170.8719808884311817 4754.567316306897 +3786 0.3786 170.3970058788851532 4744.932874613398 +3787 0.3787 169.9229935308256074 4735.314086577502 +3788 0.3788 169.4499422800796822 4725.710928341097 +3789 0.3789 168.9778505648584428 4716.123376083600 +3790 0.3790 168.5067168257531591 4706.551406022201 +3791 0.3791 168.0365395057314686 4696.994994411798 +3792 0.3792 167.5673170501336529 4687.454117544599 +3793 0.3793 167.0990479066688863 4677.928751750696 +3794 0.3794 166.6317305254114842 4668.418873397302 +3795 0.3795 166.1653633587971512 4658.924458889298 +3796 0.3796 165.6999448616192581 4649.445484668398 +3797 0.3797 165.2354734910251466 4639.981927214099 +3798 0.3798 164.7719477065122931 4630.533763042898 +3799 0.3799 164.3093659699247269 4621.100968708397 +3800 0.3800 163.8477267454492505 4611.683520801100 +3801 0.3801 163.3870284996117732 4602.281395948699 +3802 0.3802 162.9272697012735591 4592.894570815803 +3803 0.3803 162.4684488216275895 4583.523022103702 +3804 0.3804 162.0105643341948678 4574.166726550797 +3805 0.3805 161.5536147148207249 4564.825660932001 +3806 0.3806 161.0975984416711810 4555.499802058697 +3807 0.3807 160.6425139952292795 4546.189126779598 +3808 0.3808 160.1883598582913635 4536.893611978998 +3809 0.3809 159.7351345159634946 4527.613234578497 +3810 0.3810 159.2828364556577867 4518.347971535601 +3811 0.3811 158.8314641670887966 4509.097799844400 +3812 0.3812 158.3810161422698002 4499.862696535303 +3813 0.3813 157.9314908755092972 4490.642638674799 +3814 0.3814 157.4828868634072592 4481.437603365703 +3815 0.3815 157.0352026048516336 4472.247567746799 +3816 0.3816 156.5884366010146493 4463.072508992998 +3817 0.3817 156.1425873553492352 4453.912404315102 +3818 0.3818 155.6976533735854673 4444.767230960097 +3819 0.3819 155.2536331637269313 4435.636966210401 +3820 0.3820 154.8105252360471980 4426.521587384399 +3821 0.3821 154.3683281030861565 4417.421071836598 +3822 0.3822 153.9270402796464907 4408.335396956598 +3823 0.3823 153.4866602827901545 4399.264540169999 +3824 0.3824 153.0471866318347622 4390.208478937602 +3825 0.3825 152.6086178483500646 4381.167190756201 +3826 0.3826 152.1709524561543958 4372.140653157399 +3827 0.3827 151.7341889813110924 4363.128843708699 +3828 0.3828 151.2983259521250261 4354.131740012701 +3829 0.3829 150.8633618991390222 4345.149319707099 +3830 0.3830 150.4292953551304208 4336.181560465000 +3831 0.3831 149.9961248551074391 4327.228439994600 +3832 0.3832 149.5638489363057602 4318.289936039098 +3833 0.3833 149.1324661381849808 4309.366026376600 +3834 0.3834 148.7019750024251152 4300.456688820501 +3835 0.3835 148.2723740729231565 4291.561901218502 +3836 0.3836 147.8436618957895519 4282.681641453601 +3837 0.3837 147.4158370193446785 4273.815887443703 +3838 0.3838 146.9888979941154616 4264.964617140700 +3839 0.3839 146.5628433728318214 4256.127808531899 +3840 0.3840 146.1376717104232910 4247.305439638698 +3841 0.3841 145.7133815640154921 4238.497488517201 +3842 0.3842 145.2899714929267247 4229.703933257897 +3843 0.3843 144.8674400586645277 4220.924751985800 +3844 0.3844 144.4457858249222397 4212.159922860203 +3845 0.3845 144.0250073575755039 4203.409424074602 +3846 0.3846 143.6051032246789134 4194.673233857000 +3847 0.3847 143.1860719964626014 4185.951330469299 +3848 0.3848 142.7679122453287732 4177.243692207503 +3849 0.3849 142.3506225458482959 4168.550297401802 +3850 0.3850 141.9342014747573728 4159.871124416401 +3851 0.3851 141.5186476109540763 4151.206151649298 +3852 0.3852 141.1039595354949654 4142.555357532699 +3853 0.3853 140.6901358315917321 4133.918720531998 +3854 0.3854 140.2771750846077907 4125.296219147000 +3855 0.3855 139.8650758820548958 4116.687831910898 +3856 0.3856 139.4538368135898168 4108.093537390600 +3857 0.3857 139.0434564710109555 4099.513314186599 +3858 0.3858 138.6339334482549930 4090.947140932800 +3859 0.3859 138.2252663413935068 4082.394996296898 +3860 0.3860 137.8174537486296742 4073.856858979601 +3861 0.3861 137.4104942702949188 4065.332707715301 +3862 0.3862 137.0043865088455846 4056.822521271602 +3863 0.3863 136.5991290688595541 4048.326278449200 +3864 0.3864 136.1947205570329800 4039.843958082201 +3865 0.3865 135.7911595821769879 4031.375539037599 +3866 0.3866 135.3884447552143229 4022.921000215902 +3867 0.3867 134.9865746891760239 4014.480320550199 +3868 0.3868 134.5855479991981838 4006.053479006699 +3869 0.3869 134.1853633025186241 3997.640454584402 +3870 0.3870 133.7860192184736263 3989.241226315302 +3871 0.3871 133.3875143684946352 3980.855773264400 +3872 0.3872 132.9898473761049615 3972.484074528900 +3873 0.3873 132.5930168669165710 3964.126109239100 +3874 0.3874 132.1970214686267298 3955.781856558002 +3875 0.3875 131.8018598110147934 3947.451295680603 +3876 0.3876 131.4075305259390234 3939.134405834899 +3877 0.3877 131.0140322473332049 3930.831166281499 +3878 0.3878 130.6213636112034919 3922.541556312899 +3879 0.3879 130.2295232556251392 3914.265555254300 +3880 0.3880 129.8385098207392616 3906.003142463200 +3881 0.3881 129.4483219487496513 3897.754297329098 +3882 0.3882 129.0589582839195089 3889.518999273998 +3883 0.3883 128.6704174725682321 3881.297227751602 +3884 0.3884 128.2826981630682610 3873.088962248101 +3885 0.3885 127.8957990058417664 3864.894182281700 +3886 0.3886 127.5097186533575666 3856.712867402199 +3887 0.3887 127.1244557601278871 3848.544997191500 +3888 0.3888 126.7400089827051204 3840.390551263801 +3889 0.3889 126.3563769796787142 3832.249509264202 +3890 0.3890 125.9735584116719878 3824.121850870401 +3891 0.3891 125.5915519413389063 3816.007555791199 +3892 0.3892 125.2103562333609688 3807.906603767598 +3893 0.3893 124.8299699544440244 3799.818974571401 +3894 0.3894 124.4503917733151042 3791.744648006901 +3895 0.3895 124.0716203607193080 3783.683603909099 +3896 0.3896 123.6936543894166078 3775.635822144897 +3897 0.3897 123.3164925341787495 3767.601282612297 +3898 0.3898 122.9401334717860976 3759.579965240700 +3899 0.3899 122.5645758810245241 3751.571849990800 +3900 0.3900 122.1898184426822525 3743.576916854498 +3901 0.3901 121.8158598395467891 3735.595145854899 +3902 0.3902 121.4426987564017395 3727.626517045999 +3903 0.3903 121.0703338800237674 3719.671010513302 +3904 0.3904 120.6987638991794682 3711.728606372799 +3905 0.3905 120.3279875046222429 3703.799284771798 +3906 0.3906 119.9580033890892281 3695.883025888499 +3907 0.3907 119.5888102472982268 3687.979809931501 +3908 0.3908 119.2204067759446104 3680.089617140700 +3909 0.3909 118.8527916736982490 3672.212427786599 +3910 0.3910 118.4859636412003994 3664.348222170302 +3911 0.3911 118.1199213810607063 3656.496980623597 +3912 0.3912 117.7546635978540905 3648.658683508802 +3913 0.3913 117.3901889981177078 3640.833311218899 +3914 0.3914 117.0264962903478931 3633.020844177299 +3915 0.3915 116.6635841849971342 3625.221262837800 +3916 0.3916 116.3014513944710302 3617.434547684399 +3917 0.3917 115.9400966331252079 3609.660679232100 +3918 0.3918 115.5795186172623374 3601.899638025199 +3919 0.3919 115.2197160651291199 3594.151404639098 +3920 0.3920 114.8606876969132315 3586.415959678699 +3921 0.3921 114.5024322347403114 3578.693283779601 +3922 0.3922 114.1449484026709769 3570.983357607100 +3923 0.3923 113.7882349266977968 3563.286161856602 +3924 0.3924 113.4322905347422932 3555.601677253399 +3925 0.3925 113.0771139566519707 3547.929884553101 +3926 0.3926 112.7227039241972761 3540.270764540699 +3927 0.3927 112.3690591710686846 3532.624298031100 +3928 0.3928 112.0161784328736587 3524.990465869301 +3929 0.3929 111.6640604471337070 3517.369248929699 +3930 0.3930 111.3127039532813995 3509.760628116401 +3931 0.3931 110.9621076926574261 3502.164584363200 +3932 0.3932 110.6122704085075981 3494.581098633498 +3933 0.3933 110.2631908459799064 3487.010151920200 +3934 0.3934 109.9148677521216229 3479.451725245599 +3935 0.3935 109.5672998758762589 3471.905799661603 +3936 0.3936 109.2204859680807374 3464.372356248899 +3937 0.3937 108.8744247814623662 3456.851376118502 +3938 0.3938 108.5291150706359531 3449.342840409699 +3939 0.3939 108.1845555921008781 3441.846730291800 +3940 0.3940 107.8407451042381666 3434.363026962503 +3941 0.3941 107.4976823673075756 3426.891711649401 +3942 0.3942 107.1553661434446809 3419.432765608599 +3943 0.3943 106.8137951966579635 3411.986170125700 +3944 0.3944 106.4729682928259535 3404.551906514600 +3945 0.3945 106.1328841996942742 3397.129956118999 +3946 0.3946 105.7935416868727856 3389.720300310699 +3947 0.3947 105.4549395258327138 3382.322920490798 +3948 0.3948 105.1170764899037238 3374.937798089100 +3949 0.3949 104.7799513542710628 3367.564914564002 +3950 0.3950 104.4435628959727325 3360.204251402603 +3951 0.3951 104.1079098938965615 3352.855790120801 +3952 0.3952 103.7729911287773774 3345.519512262799 +3953 0.3953 103.4388053831941363 3338.195399401899 +3954 0.3954 103.1053514415670804 3330.883433139101 +3955 0.3955 102.7726280901548961 3323.583595104599 +3956 0.3956 102.4406341170518431 3316.295866956400 +3957 0.3957 102.1093683121849409 3309.020230381502 +3958 0.3958 101.7788294673111409 3301.756667094403 +3959 0.3959 101.4490163760144981 3294.505158838499 +3960 0.3960 101.1199278337033149 3287.265687385101 +3961 0.3961 100.7915626376073703 3280.038234533902 +3962 0.3962 100.4639195867750487 3272.822782112402 +3963 0.3963 100.1369974820706119 3265.619311976399 +3964 0.3964 99.8107951261713140 3258.427806009699 +3965 0.3965 99.4853113235646447 3251.248246123800 +3966 0.3966 99.1605448805455296 3244.080614258601 +3967 0.3967 98.8364946052135309 3236.924892381499 +3968 0.3968 98.5131593074700618 3229.781062487902 +3969 0.3969 98.1905377990156296 3222.649106600802 +3970 0.3970 97.8686288933470223 3215.529006771299 +3971 0.3971 97.5474314057545513 3208.420745077998 +3972 0.3972 97.2269441533193088 3201.324303626800 +3973 0.3973 96.9071659549103686 3194.239664551900 +3974 0.3974 96.5880956311820569 3187.166810014300 +3975 0.3975 96.2697320045711820 3180.105722203298 +3976 0.3976 95.9520738992942768 3173.056383334802 +3977 0.3977 95.6351201413448848 3166.018775652898 +3978 0.3978 95.3188695584908032 3158.992881428698 +3979 0.3979 95.0033209802713543 3151.978682960398 +3980 0.3980 94.6884732379946286 3144.976162574101 +3981 0.3981 94.3743251647347989 3137.985302622499 +3982 0.3982 94.0608755953293780 3131.006085485802 +3983 0.3983 93.7481233663765181 3124.038493571399 +3984 0.3984 93.4360673162322684 3117.082509313503 +3985 0.3985 93.1247062850079033 3110.138115173901 +3986 0.3986 92.8140391145671799 3103.205293640702 +3987 0.3987 92.5040646485236664 3096.284027229500 +3988 0.3988 92.1947817322380558 3089.374298482602 +3989 0.3989 91.8861892128154665 3082.476089969099 +3990 0.3990 91.5782859391027557 3075.589384285202 +3991 0.3991 91.2710707616858059 3068.714164053701 +3992 0.3992 90.9645425328869095 3061.850411924101 +3993 0.3993 90.6587001067620690 3054.998110572600 +3994 0.3994 90.3535423390983254 3048.157242702197 +3995 0.3995 90.0490680874111007 3041.327791042298 +3996 0.3996 89.7452762109415403 3034.509738349003 +3997 0.3997 89.4421655706538417 3027.703067404902 +3998 0.3998 89.1397350292326536 3020.907761019000 +3999 0.3999 88.8379834510803619 3014.123802026799 +4000 0.4000 88.5369097023145173 3007.351173290197 +4001 0.4001 88.2365126507651496 3000.589857697298 +4002 0.4002 87.9367911659721386 2993.839838162799 +4003 0.4003 87.6377441191826421 2987.101097627197 +4004 0.4004 87.3393703833484096 2980.373619057500 +4005 0.4005 87.0416688331231967 2973.657385446899 +4006 0.4006 86.7446383448601210 2966.952379814702 +4007 0.4007 86.4482777966090765 2960.258585206102 +4008 0.4008 86.1525860681141467 2953.575984692401 +4009 0.4009 85.8575620408109614 2946.904561371201 +4010 0.4010 85.5632045978241251 2940.244298365600 +4011 0.4011 85.2695126239646015 2933.595178824798 +4012 0.4012 84.9764850057271701 2926.957185923799 +4013 0.4013 84.6841206312877972 2920.330302863800 +4014 0.4014 84.3924183905010494 2913.714512871098 +4015 0.4015 84.1013771748975785 2907.109799198199 +4016 0.4016 83.8109958776815063 2900.516145123202 +4017 0.4017 83.5212733937278529 2893.933533949901 +4018 0.4018 83.2322086195799784 2887.361949007598 +4019 0.4019 82.9438004534470394 2880.801373651102 +4020 0.4020 82.6560477952014310 2874.251791261100 +4021 0.4021 82.3689495463762285 2867.713185243003 +4022 0.4022 82.0825046101626441 2861.185539028600 +4023 0.4023 81.7967118914074831 2854.668836074499 +4024 0.4024 81.5115702966106284 2848.163059862698 +4025 0.4025 81.2270787339224682 2841.668193900598 +4026 0.4026 80.9432361131413955 2835.184221720898 +4027 0.4027 80.6600413457112779 2828.711126881499 +4028 0.4028 80.3774933447189284 2822.248892965497 +4029 0.4029 80.0955910248916041 2815.797503581001 +4030 0.4030 79.8143333025944770 2809.356942361599 +4031 0.4031 79.5337190958281326 2802.927192965202 +4032 0.4032 79.2537473242260972 2796.508239075600 +4033 0.4033 78.9744169090522661 2790.100064401002 +4034 0.4034 78.6957267731984729 2783.702652674798 +4035 0.4035 78.4176758411819748 2777.315987655100 +4036 0.4036 78.1402630391429653 2770.940053124999 +4037 0.4037 77.8634872948421020 2764.574832892398 +4038 0.4038 77.5873475376579904 2758.220310789900 +4039 0.4039 77.3118426985847549 2751.876470674903 +4040 0.4040 77.0369717102295368 2745.543296429500 +4041 0.4041 76.7627335068100507 2739.220771960201 +4042 0.4042 76.4891270241521113 2732.908881198600 +4043 0.4043 76.2161511996871610 2726.607608100298 +4044 0.4044 75.9438049724498399 2720.316936646002 +4045 0.4045 75.6720872830755127 2714.036850840399 +4046 0.4046 75.4009970737978534 2707.767334712902 +4047 0.4047 75.1305332884463439 2701.508372317301 +4048 0.4048 74.8606948724439007 2695.259947731698 +4049 0.4049 74.5914807728044025 2689.022045058398 +4050 0.4050 74.3228899381302739 2682.794648424198 +4051 0.4051 74.0549213186100559 2676.577741980200 +4052 0.4052 73.7875738660159755 2670.371309901398 +4053 0.4053 73.5208465337015440 2664.175336387299 +4054 0.4054 73.2547382765991131 2657.989805661200 +4055 0.4055 72.9892480512175155 2651.814701970699 +4056 0.4056 72.7243748156396066 2645.650009587600 +4057 0.4057 72.4601175295198630 2639.495712807202 +4058 0.4058 72.1964751540820373 2633.351795949300 +4059 0.4059 71.9334466521167144 2627.218243357202 +4060 0.4060 71.6710309879789236 2621.095039398500 +4061 0.4061 71.4092271275857939 2614.982168464201 +4062 0.4062 71.1480340384141101 2608.879614969599 +4063 0.4063 70.8874506894979532 2602.787363353400 +4064 0.4064 70.6274760514263846 2596.705398078098 +4065 0.4065 70.3681090963409730 2590.633703629999 +4066 0.4066 70.1093487979335350 2584.572264518800 +4067 0.4067 69.8511941314436768 2578.521065278299 +4068 0.4068 69.5936440736564776 2572.480090465597 +4069 0.4069 69.3366976029001449 2566.449324661000 +4070 0.4070 69.0803536990436555 2560.428752468899 +4071 0.4071 68.8246113434943823 2554.418358516701 +4072 0.4072 68.5694695191957635 2548.418127455599 +4073 0.4073 68.3149272106250010 2542.428043959702 +4074 0.4074 68.0609834037906722 2536.448092727001 +4075 0.4075 67.8076370862304003 2530.478258478401 +4076 0.4076 67.5548872470085655 2524.518525958203 +4077 0.4077 67.3027328767139608 2518.568879934002 +4078 0.4078 67.0511729674574468 2512.629305196402 +4079 0.4079 66.8002065128696501 2506.699786559398 +4080 0.4080 66.5498325080986746 2500.780308860001 +4081 0.4081 66.3000499498077716 2494.870856958103 +4082 0.4082 66.0508578361730230 2488.971415737000 +4083 0.4083 65.8022551668810394 2483.081970102699 +4084 0.4084 65.5542409431266861 2477.202504984300 +4085 0.4085 65.3068141676107814 2471.333005333701 +4086 0.4086 65.0599738445377938 2465.473456126103 +4087 0.4087 64.8137189796135402 2459.623842358898 +4088 0.4088 64.5680485800429551 2453.784149052699 +4089 0.4089 64.3229616545277594 2447.954361251101 +4090 0.4090 64.0784572132642154 2442.134464019902 +4091 0.4091 63.8345342679408105 2436.324442448102 +4092 0.4092 63.5911918317360616 2430.524281646900 +4093 0.4093 63.3484289193161914 2424.733966750500 +4094 0.4094 63.1062445468328832 2418.953482915600 +4095 0.4095 62.8646377319210359 2413.182815321299 +4096 0.4096 62.6236074936964968 2407.421949169500 +4097 0.4097 62.3831528527538097 2401.670869684200 +4098 0.4098 62.1432728311639977 2395.929562112098 +4099 0.4099 61.9039664524722610 2390.198011722601 +4100 0.4100 61.6652327416958030 2384.476203806600 +4101 0.4101 61.4270707253215562 2378.764123678302 +4102 0.4102 61.1894794313039725 2373.061756673400 +4103 0.4103 60.9524578890627708 2367.369088150601 +4104 0.4104 60.7160051294807346 2361.686103490098 +4105 0.4105 60.4801201849014802 2356.012788095002 +4106 0.4106 60.2448020891272336 2350.349127390000 +4107 0.4107 60.0100498774166340 2344.695106821997 +4108 0.4108 59.7758625864825177 2339.050711860302 +4109 0.4109 59.5422392544897150 2333.415927995800 +4110 0.4110 59.3091789210528333 2327.790740741897 +4111 0.4111 59.0766806272340617 2322.175135633603 +4112 0.4112 58.8447434155409894 2316.569098227901 +4113 0.4113 58.6133663299243963 2310.972614103899 +4114 0.4114 58.3825484157760926 2305.385668862200 +4115 0.4115 58.1522887199266947 2299.808248125697 +4116 0.4116 57.9225862906434870 2294.240337538500 +4117 0.4117 57.6934401776282044 2288.681922767097 +4118 0.4118 57.4648494320148870 2283.132989499201 +4119 0.4119 57.2368131063676913 2277.593523444699 +4120 0.4120 57.0093302546787299 2272.063510334498 +4121 0.4121 56.7823999323659123 2266.542935921800 +4122 0.4122 56.5560211962707697 2261.031785980998 +4123 0.4123 56.3301931046563311 2255.530046307798 +4124 0.4124 56.1049147172049416 2250.037702720001 +4125 0.4125 55.8801850950161096 2244.554741056600 +4126 0.4126 55.6560033006043895 2239.081147177800 +4127 0.4127 55.4323683978972070 2233.616906965799 +4128 0.4128 55.2092794522327424 2228.162006323499 +4129 0.4129 54.9867355303577838 2222.716431175602 +4130 0.4130 54.7647357004256037 2217.280167467998 +4131 0.4131 54.5432790319938263 2211.853201167600 +4132 0.4132 54.3223645960222967 2206.435518263002 +4133 0.4133 54.1019914648709701 2201.027104763598 +4134 0.4134 53.8821587122977803 2195.627946700202 +4135 0.4135 53.6628654134565437 2190.238030124601 +4136 0.4136 53.4441106448948275 2184.857341109699 +4137 0.4137 53.2258934845518610 2179.485865749699 +4138 0.4138 53.0082130117564034 2174.123590159397 +4139 0.4139 52.7910683072246911 2168.770500474900 +4140 0.4140 52.5744584530582841 2163.426582853303 +4141 0.4141 52.3583825327419987 2158.091823472398 +4142 0.4142 52.1428396311418254 2152.766208531000 +4143 0.4143 51.9278288345028329 2147.449724248800 +4144 0.4144 51.7133492304470792 2142.142356866298 +4145 0.4145 51.4993999079715294 2136.844092644700 +4146 0.4146 51.2859799574459885 2131.554917866099 +4147 0.4147 51.0730884706110260 2126.274818833201 +4148 0.4148 50.8607245405758945 2121.003781869400 +4149 0.4149 50.6488872618164763 2115.741793319001 +4150 0.4150 50.4375757301732008 2110.488839546502 +4151 0.4151 50.2267890428490134 2105.244906937300 +4152 0.4152 50.0165262984072854 2100.009981897198 +4153 0.4153 49.8067865967697969 2094.784050852602 +4154 0.4154 49.5975690392146333 2089.567100250602 +4155 0.4155 49.3888727283741957 2084.359116558102 +4156 0.4156 49.1806967682331262 2079.160086263302 +4157 0.4157 48.9730402641262685 2073.969995873900 +4158 0.4158 48.7659023227366362 2068.788831918697 +4159 0.4159 48.5592820520933728 2063.616580946600 +4160 0.4160 48.3531785615697203 2058.453229526400 +4161 0.4161 48.1475909618810149 2053.298764247698 +4162 0.4162 47.9425183650826341 2048.153171719900 +4163 0.4163 47.7379598845679922 2043.016438572999 +4164 0.4164 47.5339146350664947 2037.888551456897 +4165 0.4165 47.3303817326415768 2032.769497041500 +4166 0.4166 47.1273602946886427 2027.659262017198 +4167 0.4167 46.9248494399330767 2022.557833094103 +4168 0.4168 46.7228482884282457 2017.465197002501 +4169 0.4169 46.5213559615534891 2012.381340492600 +4170 0.4170 46.3203715820121147 2007.306250334903 +4171 0.4171 46.1198942738294164 2002.239913319099 +4172 0.4172 45.9199231623506847 1997.182316255603 +4173 0.4173 45.7204573742391958 1992.133445974199 +4174 0.4174 45.5214960374742432 1987.093289324799 +4175 0.4175 45.3230382813491701 1982.061833176700 +4176 0.4176 45.1250832364693579 1977.039064419499 +4177 0.4177 44.9276300347502655 1972.024969962302 +4178 0.4178 44.7306778094154680 1967.019536733602 +4179 0.4179 44.5342256949946744 1962.022751682198 +4180 0.4180 44.3382728273217595 1957.034601776100 +4181 0.4181 44.1428183435328165 1952.055074002797 +4182 0.4182 43.9478613820641684 1947.084155370103 +4183 0.4183 43.7534010826504414 1942.121832904402 +4184 0.4184 43.5594365863226045 1937.168093652399 +4185 0.4185 43.3659670354060012 1932.222924679700 +4186 0.4186 43.1729915735184164 1927.286313072000 +4187 0.4187 42.9805093455681302 1922.358245933698 +4188 0.4188 42.7885194977519987 1917.438710389000 +4189 0.4189 42.5970211775534651 1912.527693581698 +4190 0.4190 42.4060135337406621 1907.625182674397 +4191 0.4191 42.2154957163644795 1902.731164849301 +4192 0.4192 42.0254668767566244 1897.845627307797 +4193 0.4193 41.8359261675277097 1892.968557270498 +4194 0.4194 41.6468727425653071 1888.099941977500 +4195 0.4195 41.4583057570320577 1883.239768687501 +4196 0.4196 41.2702243673637312 1878.388024678999 +4197 0.4197 41.0826277312673298 1873.544697248999 +4198 0.4198 40.8955150077191760 1868.709773714098 +4199 0.4199 40.7088853569629805 1863.883241409800 +4200 0.4200 40.5227379405079660 1859.065087690498 +4201 0.4201 40.3370719211269702 1854.255299929402 +4202 0.4202 40.1518864628545344 1849.453865519299 +4203 0.4203 39.9671807309850067 1844.660771871298 +4204 0.4204 39.7829538920706582 1839.876006415700 +4205 0.4205 39.5992051139197869 1835.099556601701 +4206 0.4206 39.4159335655948340 1830.331409897299 +4207 0.4207 39.2331384174105153 1825.571553789101 +4208 0.4208 39.0508188409319175 1820.819975782902 +4209 0.4209 38.8689740089726357 1816.076663402702 +4210 0.4210 38.6876030955929124 1811.341604191799 +4211 0.4211 38.5067052760977404 1806.614785711699 +4212 0.4212 38.3262797270349935 1801.896195543199 +4213 0.4213 38.1463256261936010 1797.185821284700 +4214 0.4214 37.9668421526016431 1792.483650554401 +4215 0.4215 37.7878284865245249 1787.789670988001 +4216 0.4216 37.6092838094631006 1783.103870240499 +4217 0.4217 37.4312073041518190 1778.426235985102 +4218 0.4218 37.2535981545568902 1773.756755913502 +4219 0.4219 37.0764555458744240 1769.095417735800 +4220 0.4220 36.8997786645285970 1764.442209180801 +4221 0.4221 36.7235666981697975 1759.797117995200 +4222 0.4222 36.5478188356728069 1755.160131944602 +4223 0.4223 36.3725342671349523 1750.531238812498 +4224 0.4224 36.1977121838742733 1745.910426401100 +4225 0.4225 36.0233517784276955 1741.297682530399 +4226 0.4226 35.8494522445492194 1736.692995039099 +4227 0.4227 35.6760127772080722 1732.096351783901 +4228 0.4228 35.5030325725868892 1727.507740639699 +4229 0.4229 35.3305108280799161 1722.927149499701 +4230 0.4230 35.1584467422911828 1718.354566274898 +4231 0.4231 34.9868395150327061 1713.789978894700 +4232 0.4232 34.8156883473226415 1709.233375306601 +4233 0.4233 34.6449924413835220 1704.684743475798 +4234 0.4234 34.4747510006404312 1700.144071385999 +4235 0.4235 34.3049632297192062 1695.611347038503 +4236 0.4236 34.1356283344446467 1691.086558452698 +4237 0.4237 33.9667455218387246 1686.569693665802 +4238 0.4238 33.7983140001187721 1682.060740733301 +4239 0.4239 33.6303329786957050 1677.559687728000 +4240 0.4240 33.4628016681722542 1673.066522740999 +4241 0.4241 33.2957192803411530 1668.581233880999 +4242 0.4242 33.1290850281833755 1664.103809274500 +4243 0.4243 32.9628981258663600 1659.634237065802 +4244 0.4244 32.7971577887422114 1655.172505417100 +4245 0.4245 32.6318632333459675 1650.718602507801 +4246 0.4246 32.4670136773937941 1646.272516535599 +4247 0.4247 32.3026083397812513 1641.834235715298 +4248 0.4248 32.1386464405815033 1637.403748279703 +4249 0.4249 31.9751272010435628 1632.981042479099 +4250 0.4250 31.8120498435905539 1628.566106581100 +4251 0.4251 31.6494135918179325 1624.158928871300 +4252 0.4252 31.4872176704917521 1619.759497652303 +4253 0.4253 31.3254613055469129 1615.367801244502 +4254 0.4254 31.1641437240853989 1610.983827985798 +4255 0.4255 31.0032641543745449 1606.607566231301 +4256 0.4256 30.8428218258453057 1602.239004353502 +4257 0.4257 30.6828159690905018 1597.878130742600 +4258 0.4258 30.5232458158630884 1593.524933805700 +4259 0.4259 30.3641105990744329 1589.179401967402 +4260 0.4260 30.2054095527925810 1584.841523669602 +4261 0.4261 30.0471419122405194 1580.511287371599 +4262 0.4262 29.8893069137944636 1576.188681549498 +4263 0.4263 29.7319037949821343 1571.873694697100 +4264 0.4264 29.5749317944810244 1567.566315325101 +4265 0.4265 29.4183901521167002 1563.266531961399 +4266 0.4266 29.2622781088610786 1558.974333151000 +4267 0.4267 29.1065949068307397 1554.689707455800 +4268 0.4268 28.9513397892851856 1550.412643455300 +4269 0.4269 28.7965120006251389 1546.143129745600 +4270 0.4270 28.6421107863908624 1541.881154939903 +4271 0.4271 28.4881353932604533 1537.626707668300 +4272 0.4272 28.3345850690481278 1533.379776578200 +4273 0.4273 28.1814590627025439 1529.140350333499 +4274 0.4274 28.0287566243051103 1524.908417615203 +4275 0.4275 27.8764770050682813 1520.683967121400 +4276 0.4276 27.7246194573338869 1516.466987566502 +4277 0.4277 27.5731832345714523 1512.257467682201 +4278 0.4278 27.4221675913765033 1508.055396216798 +4279 0.4279 27.2715717834688824 1503.860761935597 +4280 0.4280 27.1213950676910933 1499.673553620200 +4281 0.4281 26.9716367020066130 1495.493760069403 +4282 0.4282 26.8222959454982330 1491.321370098201 +4283 0.4283 26.6733720583663896 1487.156372538699 +4284 0.4284 26.5248643019274830 1482.998756239402 +4285 0.4285 26.3767719386122330 1478.848510065600 +4286 0.4286 26.2290942319640088 1474.705622898902 +4287 0.4287 26.0818304466371771 1470.570083637700 +4288 0.4288 25.9349798483954537 1466.441881196799 +4289 0.4289 25.7885417041102301 1462.321004507699 +4290 0.4290 25.6425152817589463 1458.207442518000 +4291 0.4291 25.4968998504234357 1454.101184192201 +4292 0.4292 25.3516946802882863 1450.002218510799 +4293 0.4293 25.2068990426391863 1445.910534471201 +4294 0.4294 25.0625122098612927 1441.826121086699 +4295 0.4295 24.9185334554375970 1437.748967387201 +4296 0.4296 24.7749620539472986 1433.679062418800 +4297 0.4297 24.6317972810641521 1429.616395244098 +4298 0.4298 24.4890384135548516 1425.560954941899 +4299 0.4299 24.3466847292774133 1421.512730606901 +4300 0.4300 24.2047355071795387 1417.471711350601 +4301 0.4301 24.0631900272970043 1413.437886300100 +4302 0.4302 23.9220475707520350 1409.411244599301 +4303 0.4303 23.7813074197516805 1405.391775407799 +4304 0.4304 23.6409688575862162 1401.379467901501 +4305 0.4305 23.5010311686275344 1397.374311272102 +4306 0.4306 23.3614936383275342 1393.376294727899 +4307 0.4307 23.2223555532165058 1389.385407492700 +4308 0.4308 23.0836162009015311 1385.401638806798 +4309 0.4309 22.9452748700648925 1381.424977925999 +4310 0.4310 22.8073308504624670 1377.455414122498 +4311 0.4311 22.6697834329221237 1373.492936684401 +4312 0.4312 22.5326319093421432 1369.537534915202 +4313 0.4313 22.3958755726896399 1365.589198134898 +4314 0.4314 22.2595137169989385 1361.647915679099 +4315 0.4315 22.1235456373700146 1357.713676899399 +4316 0.4316 21.9879706299668953 1353.786471162999 +4317 0.4317 21.8527879920160970 1349.866287853001 +4318 0.4318 21.7179970218050364 1345.953116368200 +4319 0.4319 21.5835970186804573 1342.046946123402 +4320 0.4320 21.4495872830468528 1338.147766548700 +4321 0.4321 21.3159671163649094 1334.255567090200 +4322 0.4322 21.1827358211499259 1330.370337209501 +4323 0.4323 21.0498927009702470 1326.492066384097 +4324 0.4324 20.9174370604457032 1322.620744106800 +4325 0.4325 20.7853682052460584 1318.756359886098 +4326 0.4326 20.6536854420894400 1314.898903246300 +4327 0.4327 20.5223880787407786 1311.048363726899 +4328 0.4328 20.3914754240102738 1307.204730883201 +4329 0.4329 20.2609467877518306 1303.367994285698 +4330 0.4330 20.1308014808615141 1299.538143520600 +4331 0.4331 20.0010388152760150 1295.715168189403 +4332 0.4332 19.8716581039710753 1291.899057909402 +4333 0.4333 19.7426586609599646 1288.089802312799 +4334 0.4334 19.6140398012919555 1284.287391047397 +4335 0.4335 19.4858008410507715 1280.491813776302 +4336 0.4336 19.3579410973530521 1276.703060178101 +4337 0.4337 19.2304598883468323 1272.921119946302 +4338 0.4338 19.1033565332099968 1269.145982790400 +4339 0.4339 18.9766303521487671 1265.377638434198 +4340 0.4340 18.8502806663961806 1261.616076617498 +4341 0.4341 18.7243067982105522 1257.861287095100 +4342 0.4342 18.5987080708739576 1254.113259636801 +4343 0.4343 18.4734838086907374 1250.371984027599 +4344 0.4344 18.3486333369859658 1246.637450067799 +4345 0.4345 18.2241559821039374 1242.909647572800 +4346 0.4346 18.1000510714066465 1239.188566372999 +4347 0.4347 17.9763179332723126 1235.474196313698 +4348 0.4348 17.8529558970938425 1231.766527255702 +4349 0.4349 17.7299642932773409 1228.065549074301 +4350 0.4350 17.6073424532406193 1224.371251660101 +4351 0.4351 17.4850897094116853 1220.683624918602 +4352 0.4352 17.3632053952272365 1217.002658770398 +4353 0.4353 17.2416888451311863 1213.328343150599 +4354 0.4354 17.1205393945731750 1209.660668009597 +4355 0.4355 16.9997563800070637 1205.999623312600 +4356 0.4356 16.8793391388894527 1202.345199039599 +4357 0.4357 16.7592870096782143 1198.697385185202 +4358 0.4358 16.6395993318309827 1195.056171759403 +4359 0.4359 16.5202754458036978 1191.421548786300 +4360 0.4360 16.4013146930491232 1187.793506305199 +4361 0.4361 16.2827164160153579 1184.172034370102 +4362 0.4362 16.1644799581443728 1180.557123049599 +4363 0.4363 16.0466046638705464 1176.948762426899 +4364 0.4364 15.9290898786191981 1173.346942600099 +4365 0.4365 15.8119349488050975 1169.751653681902 +4366 0.4366 15.6951392218310328 1166.162885799396 +4367 0.4367 15.5787020460863381 1162.580629094500 +4368 0.4368 15.4626227709454280 1159.004873723701 +4369 0.4369 15.3469007467663427 1155.435609858003 +4370 0.4370 15.2315353248893022 1151.872827682801 +4371 0.4371 15.1165258576352475 1148.316517398300 +4372 0.4372 15.0018716983043827 1144.766669219000 +4373 0.4373 14.8875722011747520 1141.223273373598 +4374 0.4374 14.7736267215007775 1137.686320105899 +4375 0.4375 14.6600346155118082 1134.155799673499 +4376 0.4376 14.5467952404106988 1130.631702348699 +4377 0.4377 14.4339079543723585 1127.114018418099 +4378 0.4378 14.3213721165423191 1123.602738182697 +4379 0.4379 14.2091870870352945 1120.097851957798 +4380 0.4380 14.0973522269337597 1116.599350072902 +4381 0.4381 13.9858668982865204 1113.107222871899 +4382 0.4382 13.8747304641072713 1109.621460713097 +4383 0.4383 13.7639422883731868 1106.142053968601 +4384 0.4384 13.6535017360234967 1102.668993025200 +4385 0.4385 13.5434081729580562 1099.202268283600 +4386 0.4386 13.4336609660359354 1095.741870158799 +4387 0.4387 13.3242594830739947 1092.287789080001 +4388 0.4388 13.2152030928454849 1088.840015490201 +4389 0.4389 13.1064911650786247 1085.398539846999 +4390 0.4390 12.9981230704551898 1081.963352621700 +4391 0.4391 12.8900981806091153 1078.534444299799 +4392 0.4392 12.7824158681250797 1075.111805380900 +4393 0.4393 12.6750755065371088 1071.695426378501 +4394 0.4394 12.5680764703271741 1068.285297820203 +4395 0.4395 12.4614181349237896 1064.881410247497 +4396 0.4396 12.3550998767006206 1061.483754215900 +4397 0.4397 12.2491210729750861 1058.092320294800 +4398 0.4398 12.1434811020069713 1054.707099067498 +4399 0.4399 12.0381793429970312 1051.328081131302 +4400 0.4400 11.9332151760856107 1047.955257097099 +4401 0.4401 11.8285879823512499 1044.588617590100 +4402 0.4402 11.7242971438093004 1041.228153248900 +4403 0.4403 11.6203420434105560 1037.873854726000 +4404 0.4404 11.5167220650398665 1034.525712687799 +4405 0.4405 11.4134365935147564 1031.183717814398 +4406 0.4406 11.3104850145840619 1027.847860799502 +4407 0.4407 11.2078667149265474 1024.518132350800 +4408 0.4408 11.1055810821495271 1021.194523189599 +4409 0.4409 11.0036275047875129 1017.877024050700 +4410 0.4410 10.9020053723008488 1014.565625682601 +4411 0.4411 10.8007140750743336 1011.260318847701 +4412 0.4412 10.6997530044158626 1007.961094321701 +4413 0.4413 10.5991215525550722 1004.667942894099 +4414 0.4414 10.4988191126419874 1001.380855367603 +4415 0.4415 10.3988450787456568 998.099822559001 +4416 0.4416 10.2991988458527874 994.824835298401 +4417 0.4417 10.1998798098664132 991.555884429101 +4418 0.4418 10.1008873676045425 988.292960808303 +4419 0.4419 10.0022209167988123 985.036055306300 +4420 0.4420 9.9038798560931323 981.785158807299 +4421 0.4421 9.8058635850423368 978.540262208600 +4422 0.4422 9.7081715041108669 975.301356420801 +4423 0.4423 9.6108030146714114 972.068432368298 +4424 0.4424 9.5137575190035708 968.841480988500 +4425 0.4425 9.4170344202925413 965.620493232098 +4426 0.4426 9.3206331226277612 962.405460063503 +4427 0.4427 9.2245530310015909 959.196372459901 +4428 0.4428 9.1287935513079805 955.993221412300 +4429 0.4429 9.0333540903411311 952.795997924699 +4430 0.4430 8.9382340557941955 949.604693014000 +4431 0.4431 8.8434328562579463 946.419297711000 +4432 0.4432 8.7489499012194418 943.239803059099 +4433 0.4433 8.6547846010607277 940.066200115201 +4434 0.4434 8.5609363670574972 936.898479949403 +4435 0.4435 8.4674046113777965 933.736633644599 +4436 0.4436 8.3741887470807121 930.580652297100 +4437 0.4437 8.2812881881150417 927.430527016302 +4438 0.4438 8.1887023493180067 924.286248924400 +4439 0.4439 8.0964306464139320 921.147809157101 +4440 0.4440 8.0044724960129479 918.015198862598 +4441 0.4441 7.9128273156096922 914.888409202500 +4442 0.4442 7.8214945235820075 911.767431351200 +4443 0.4443 7.7304735391896271 908.652256496400 +4444 0.4444 7.6397637825729019 905.542875838102 +4445 0.4445 7.5493646747515015 902.439280589901 +4446 0.4446 7.4592756376231062 899.341461978001 +4447 0.4447 7.3694960939621259 896.249411241599 +4448 0.4448 7.2800254674184206 893.163119632500 +4449 0.4449 7.1908631825160052 890.082578415801 +4450 0.4450 7.1020086646517706 887.007778868898 +4451 0.4451 7.0134613400941959 883.938712282601 +4452 0.4452 6.9252206359820558 880.875369960198 +4453 0.4453 6.8372859803231707 877.817743217500 +4454 0.4454 6.7496568019931154 874.765823383601 +4455 0.4455 6.6623325307339405 871.719601799898 +4456 0.4456 6.5753125971529105 868.679069820697 +4457 0.4457 6.4885964327212253 865.644218812999 +4458 0.4458 6.4021834697727549 862.615040156401 +4459 0.4459 6.3160731415027698 859.591525243301 +4460 0.4460 6.2302648819666802 856.573665478500 +4461 0.4461 6.1447581260787700 853.561452279697 +4462 0.4462 6.0595523096109352 850.554877077000 +4463 0.4463 5.9746468691914298 847.553931313101 +4464 0.4464 5.8900412423036199 844.558606443101 +4465 0.4465 5.8057348672847047 841.568893935200 +4466 0.4466 5.7217271833244645 838.584785269599 +4467 0.4467 5.6380176304640344 835.606271938999 +4468 0.4468 5.5546056495946399 832.633345448899 +4469 0.4469 5.4714906824563396 829.665997317101 +4470 0.4470 5.3886721716367996 826.704219073697 +4471 0.4471 5.3061495605700451 823.748002261400 +4472 0.4472 5.2239222935352103 820.797338435303 +4473 0.4473 5.1419898156553048 817.852219162800 +4474 0.4474 5.0603515728959749 814.912636023801 +4475 0.4475 4.9790070120642644 811.978580610401 +4476 0.4476 4.8979555808073947 809.050044526997 +4477 0.4477 4.8171967276115151 806.127019390602 +4478 0.4478 4.7367299018004800 803.209496830103 +4479 0.4479 4.6565545535346295 800.297468486900 +4480 0.4480 4.5766701338095501 797.390926014697 +4481 0.4481 4.4970760944548456 794.489861079401 +4482 0.4482 4.4177718881329309 791.594265358901 +4483 0.4483 4.3387569683378109 788.704130543501 +4484 0.4484 4.2600307893938512 785.819448335700 +4485 0.4485 4.1815928064545611 782.940210450099 +4486 0.4486 4.1034424755013861 780.066408613402 +4487 0.4487 4.0255792533424959 777.198034564401 +4488 0.4488 3.9480025976115711 774.335080054097 +4489 0.4489 3.8707119667665912 771.477536845498 +4490 0.4490 3.7937068200886213 768.625396713898 +4491 0.4491 3.7169866176806114 765.778651446301 +4492 0.4492 3.6405508204661965 762.937292842002 +4493 0.4493 3.5643988901884964 760.101312711999 +4494 0.4494 3.4885302894089114 757.270702879701 +4495 0.4495 3.4129444815059213 754.445455180099 +4496 0.4496 3.3376409306738912 751.625561460500 +4497 0.4497 3.2626191019218762 748.811013579798 +4498 0.4498 3.1878784610724362 746.001803409003 +4499 0.4499 3.1134184747604312 743.197922831099 +4500 0.4500 3.0392386104318363 740.399363740802 +4501 0.4501 2.9653383363425663 737.606118044601 +4502 0.4502 2.8917171215572814 734.818177661098 +4503 0.4503 2.8183744359482015 732.035534520503 +4504 0.4504 2.7453097501939214 729.258180565099 +4505 0.4505 2.6725225357782465 726.486107748402 +4506 0.4506 2.6000122649889965 723.719308036601 +4507 0.4507 2.5277784109168313 720.957773406699 +4508 0.4508 2.4558204474540863 718.201495848200 +4509 0.4509 2.3841378492935963 715.450467361599 +4510 0.4510 2.3127300919275262 712.704679959799 +4511 0.4511 2.2415966516461912 709.964125666898 +4512 0.4512 2.1707370055368962 707.228796519001 +4513 0.4513 2.1001506314827760 704.498684563401 +4514 0.4514 2.0298370081616208 701.773781859702 +4515 0.4515 1.9597956150447156 699.054080478400 +4516 0.4516 1.8900259323956905 696.339572502100 +4517 0.4517 1.8205274412693555 693.630250024602 +4518 0.4518 1.7512996235105454 690.926105151600 +4519 0.4519 1.6823419617529554 688.227130000199 +4520 0.4520 1.6136539394179954 685.533316698999 +4521 0.4521 1.5452350407136406 682.844657388097 +4522 0.4522 1.4770847506332756 680.161144219201 +4523 0.4523 1.4092025549545504 677.482769355302 +4524 0.4524 1.3415879402382402 674.809524970900 +4525 0.4525 1.2742403938270903 672.141403252099 +4526 0.4526 1.2071594038446753 669.478396396200 +4527 0.4527 1.1403444591942602 666.820496612101 +4528 0.4528 1.0737950495576700 664.167696119701 +4529 0.4529 1.0075106653941399 661.519987150899 +4530 0.4530 0.9414907979391700 658.877361948500 +4531 0.4531 0.8757349392034199 656.239812766500 +4532 0.4532 0.8102425819715550 653.607331870800 +4533 0.4533 0.7450132198011200 650.979911537899 +4534 0.4534 0.6800463470214201 648.357544056100 +4535 0.4535 0.6153414587323752 645.740221724798 +4536 0.4536 0.5508980508034153 643.127936854402 +4537 0.4537 0.4867156198723400 640.520681767102 +4538 0.4538 0.4227936633441998 637.918448795703 +4539 0.4539 0.3591316793901846 635.321230284600 +4540 0.4540 0.2957291669464996 632.729018589100 +4541 0.4541 0.2325856257132497 630.141806075899 +4542 0.4542 0.1697005561533197 627.559585122701 +4543 0.4543 0.1070734594912645 624.982348118403 +4544 0.4544 0.0447038377121944 622.410087462998 +4545 0.4545 -0.0174088064393305 619.842795567500 +4546 0.4546 -0.0792649694604106 617.280464854102 +4547 0.4547 -0.1408651470909106 614.723087755898 +4548 0.4548 -0.2022098343145706 612.170656717302 +4549 0.4549 -0.2632995253601056 609.623164193399 +4550 0.4550 -0.3241347137023056 607.080602650600 +4551 0.4551 -0.3847158920631406 604.542964566099 +4552 0.4552 -0.4450435524128505 602.010242428099 +4553 0.4553 -0.5051181859710505 599.482428735901 +4554 0.4554 -0.5649402832078304 596.959515999697 +4555 0.4555 -0.6245103338448305 594.441496740303 +4556 0.4556 -0.6838288268563406 591.928363489900 +4557 0.4557 -0.7428962504704056 589.420108791401 +4558 0.4558 -0.8017130921698908 586.916725198302 +4559 0.4559 -0.8602798386935759 584.418205275400 +4560 0.4560 -0.9185969760372460 581.924541598000 +4561 0.4561 -0.9766649894547760 579.435726752599 +4562 0.4562 -1.0344843634592058 576.951753335998 +4563 0.4563 -1.0920555818238158 574.472613956201 +4564 0.4564 -1.1493791275832210 571.998301231903 +4565 0.4565 -1.2064554830344314 569.528807792303 +4566 0.4566 -1.2632851297379366 567.064126277801 +4567 0.4567 -1.3198685485187767 564.604249339001 +4568 0.4568 -1.3762062194676119 562.149169637702 +4569 0.4569 -1.4322986219418019 559.698879846099 +4570 0.4570 -1.4881462345664669 557.253372647199 +4571 0.4571 -1.5437495352355568 554.812640734599 +4572 0.4572 -1.5991090011129068 552.376676812401 +4573 0.4573 -1.6542251086333168 549.945473595802 +4574 0.4574 -1.7090983335036070 547.519023810000 +4575 0.4575 -1.7637291507036719 545.097320191300 +4576 0.4576 -1.8181180344875518 542.680355486300 +4577 0.4577 -1.8722654583844818 540.268122452300 +4578 0.4578 -1.9261718951999516 537.860613857098 +4579 0.4579 -1.9798378170167514 535.457822478900 +4580 0.4580 -2.0332636951960366 533.059741106801 +4581 0.4581 -2.0864500003783717 530.666362539901 +4582 0.4582 -2.1393972024847816 528.277679588300 +4583 0.4583 -2.1921057707178018 525.893685072100 +4584 0.4584 -2.2445761735625118 523.514371822101 +4585 0.4585 -2.2968088787875920 521.139732679501 +4586 0.4586 -2.3488043534463618 518.769760495899 +4587 0.4587 -2.4005630638778319 516.404448133500 +4588 0.4588 -2.4520854757077317 514.043788464500 +4589 0.4589 -2.5033720538495516 511.687774371901 +4590 0.4590 -2.5544232625055767 509.336398748601 +4591 0.4591 -2.6052395651679219 506.989654498298 +4592 0.4592 -2.6558214246195719 504.647534534703 +4593 0.4593 -2.7061693029354119 502.310031782101 +4594 0.4594 -2.7562836614832520 499.977139174698 +4595 0.4595 -2.8061649609248569 497.648849657402 +4596 0.4596 -2.8558136612169820 495.325156185099 +4597 0.4597 -2.9052302216123866 493.006051722998 +4598 0.4598 -2.9544151006608668 490.691529246600 +4599 0.4599 -3.0033687562102820 488.381581741702 +4600 0.4600 -3.0520916454075673 486.076202204000 +4601 0.4601 -3.1005842246997526 483.775383639702 +4602 0.4602 -3.1488469498349829 481.479119064901 +4603 0.4603 -3.1968802758635428 479.187401506300 +4604 0.4604 -3.2446846571388579 476.900224000001 +4605 0.4605 -3.2922605473185178 474.617579593199 +4606 0.4606 -3.3396083993652828 472.339461342101 +4607 0.4607 -3.3867286655480879 470.065862314001 +4608 0.4608 -3.4336217974430832 467.796775585903 +4609 0.4609 -3.4802882459345983 465.532194244399 +4610 0.4610 -3.5267284612161731 463.272111387101 +4611 0.4611 -3.5729428927915681 461.016520120800 +4612 0.4612 -3.6189319894757328 458.765413562498 +4613 0.4613 -3.6646961993958427 456.518784839700 +4614 0.4614 -3.7102359699922927 454.276627089301 +4615 0.4615 -3.7555517480196827 452.038933458502 +4616 0.4616 -3.8006439795478277 449.805697104402 +4617 0.4617 -3.8455131099627380 447.576911193799 +4618 0.4618 -3.8901595839676180 445.352568903803 +4619 0.4619 -3.9345838455838633 443.132663421100 +4620 0.4620 -3.9787863381520583 440.917187942800 +4621 0.4621 -4.0227675043329532 438.706135675100 +4622 0.4622 -4.0665277861084483 436.499499834801 +4623 0.4623 -4.1100676247825980 434.297273648201 +4624 0.4624 -4.1533874609825778 432.099450351398 +4625 0.4625 -4.1964877346596730 429.906023190499 +4626 0.4626 -4.2393688850902675 427.716985421401 +4627 0.4627 -4.2820313508768129 425.532330309503 +4628 0.4628 -4.3244755699488175 423.352051130598 +4629 0.4629 -4.3667019795638229 421.176141169501 +4630 0.4630 -4.4087110163083629 419.004593721300 +4631 0.4631 -4.4505031160989628 416.837402090699 +4632 0.4632 -4.4920787141830978 414.674559592000 +4633 0.4633 -4.5334382451401680 412.516059549398 +4634 0.4634 -4.5745821428824680 410.361895296603 +4635 0.4635 -4.6155108406561531 408.212060177102 +4636 0.4636 -4.6562247710422131 406.066547544098 +4637 0.4637 -4.6967243659574383 403.925350760397 +4638 0.4638 -4.7370100566553628 401.788463198100 +4639 0.4639 -4.7770822737272525 399.655878239701 +4640 0.4640 -4.8169414471030674 397.527589276600 +4641 0.4641 -4.8565880060523927 395.403589709902 +4642 0.4642 -4.8960223791854283 393.283872950800 +4643 0.4643 -4.9352449944539378 391.168432419399 +4644 0.4644 -4.9742562791521880 389.057261545600 +4645 0.4645 -5.0130566599179183 386.950353769000 +4646 0.4646 -5.0516465627332883 384.847702538402 +4647 0.4647 -5.0900264129258330 382.749301312499 +4648 0.4648 -5.1281966351694175 380.655143559197 +4649 0.4649 -5.1661576534851728 378.565222755900 +4650 0.4650 -5.2039098912424429 376.479532389501 +4651 0.4651 -5.2414537711597324 374.398065956299 +4652 0.4652 -5.2787897153056624 372.320816962299 +4653 0.4653 -5.3159181450999071 370.247778922600 +4654 0.4654 -5.3528394813141320 368.178945361902 +4655 0.4655 -5.3895541440729273 366.114309814002 +4656 0.4656 -5.4260625528547521 364.053865822498 +4657 0.4657 -5.4623651264928821 361.997606940098 +4658 0.4658 -5.4984622831763321 359.945526728898 +4659 0.4659 -5.5343544404507865 357.897618760198 +4660 0.4660 -5.5700420152195464 355.853876614998 +4661 0.4661 -5.6055254237444565 353.814293883202 +4662 0.4662 -5.6408050816468265 351.778864164200 +4663 0.4663 -5.6758814039083765 349.747581066800 +4664 0.4664 -5.7107548048721410 347.720438208500 +4665 0.4665 -5.7454256982434115 345.697429216903 +4666 0.4666 -5.7798944970906714 343.678547728301 +4667 0.4667 -5.8141616138464913 341.663787388101 +4668 0.4668 -5.8482274603084567 339.653141851199 +4669 0.4669 -5.8820924476401064 337.646604781803 +4670 0.4670 -5.9157569863718411 335.644169852898 +4671 0.4671 -5.9492214864018411 333.645830747100 +4672 0.4672 -5.9824863569969766 331.651581155602 +4673 0.4673 -6.0155520067937314 329.661414779501 +4674 0.4674 -6.0484188437991211 327.675325328299 +4675 0.4675 -6.0810872753915861 325.693306521003 +4676 0.4676 -6.1135577083219212 323.715352085699 +4677 0.4677 -6.1458305487141711 321.741455759300 +4678 0.4678 -6.1779062020665414 319.771611288099 +4679 0.4679 -6.2097850732523163 317.805812427399 +4680 0.4680 -6.2414675665207566 315.844052941400 +4681 0.4681 -6.2729540854979966 313.886326603402 +4682 0.4682 -6.3042450331879563 311.932627195798 +4683 0.4683 -6.3353408119732357 309.982948509798 +4684 0.4684 -6.3662418236160203 308.037284345901 +4685 0.4685 -6.3969484692589855 306.095628513398 +4686 0.4686 -6.4274611494261755 304.157974830399 +4687 0.4687 -6.4577802640239108 302.224317124299 +4688 0.4688 -6.4879062123416960 300.294649231400 +4689 0.4689 -6.5178393930530811 298.368964996298 +4690 0.4690 -6.5475802042165663 296.447258273398 +4691 0.4691 -6.5771290432765159 294.529522925601 +4692 0.4692 -6.6064863070640207 292.615752824498 +4693 0.4693 -6.6356523917977910 290.705941850902 +4694 0.4694 -6.6646276930850465 288.800083894203 +4695 0.4695 -6.6934126059223962 286.898172852798 +4696 0.4696 -6.7220075246967363 285.000202634001 +4697 0.4697 -6.7504128431861163 283.106167153597 +4698 0.4698 -6.7786289545606309 281.216060336701 +4699 0.4699 -6.8066562513832958 279.329876116597 +4700 0.4700 -6.8344951256109203 277.447608435898 +4701 0.4701 -6.8621459685950006 275.569251245703 +4702 0.4702 -6.8896091710825811 273.694798505901 +4703 0.4703 -6.9168851232171367 271.824244185202 +4704 0.4704 -6.9439742145394421 269.957582260900 +4705 0.4705 -6.9708768339884468 268.094806719200 +4706 0.4706 -6.9975933699021420 266.235911554701 +4707 0.4707 -7.0241242100184271 264.380890771001 +4708 0.4708 -7.0504697414759923 262.529738380301 +4709 0.4709 -7.0766303508151820 260.682448403499 +4710 0.4710 -7.1026064239788420 258.839014869700 +4711 0.4711 -7.1283983463131975 256.999431817403 +4712 0.4712 -7.1540065025687225 255.163693293100 +4713 0.4713 -7.1794312769009876 253.331793352201 +4714 0.4714 -7.2046730528715379 251.503726058800 +4715 0.4715 -7.2297322134487327 249.679485485100 +4716 0.4716 -7.2546091410086078 247.859065712400 +4717 0.4717 -7.2793042173357430 246.042460830300 +4718 0.4718 -7.3038178236241080 244.229664937000 +4719 0.4719 -7.3281503404779231 242.420672139302 +4720 0.4720 -7.3523021479125035 240.615476552302 +4721 0.4721 -7.3762736253551182 238.814072300000 +4722 0.4722 -7.4000651516458387 237.016453514403 +4723 0.4723 -7.4236771050383838 235.222614336497 +4724 0.4724 -7.4471098632009740 233.432548915302 +4725 0.4725 -7.4703638032171638 231.646251408500 +4726 0.4726 -7.4934393015867133 229.863715982498 +4727 0.4727 -7.5163367342264085 228.084936811400 +4728 0.4728 -7.5390564764708987 226.309908078398 +4729 0.4729 -7.5615989030735689 224.538623974997 +4730 0.4730 -7.5839643882073586 222.771078700800 +4731 0.4731 -7.6061533054655941 221.007266463901 +4732 0.4732 -7.6281660278628438 219.247181481100 +4733 0.4733 -7.6500029278357538 217.490817977101 +4734 0.4734 -7.6716643772438635 215.738170185101 +4735 0.4735 -7.6931507473704537 213.989232346699 +4736 0.4736 -7.7144624089233833 212.243998711900 +4737 0.4737 -7.7355997320359133 210.502463538698 +4738 0.4738 -7.7565630862675334 208.764621093698 +4739 0.4739 -7.7773528406048085 207.030465651802 +4740 0.4740 -7.7979693634621832 205.299991495700 +4741 0.4741 -7.8184130226828179 203.573192917000 +4742 0.4742 -7.8386841855394280 201.850064215199 +4743 0.4743 -7.8587832187350930 200.130599698103 +4744 0.4744 -7.8787104884040735 198.414793681502 +4745 0.4745 -7.8984663601126437 196.702640489901 +4746 0.4746 -7.9180511988599189 194.994134455599 +4747 0.4747 -7.9374653690786587 193.289269919202 +4748 0.4748 -7.9567092346360884 191.588041229399 +4749 0.4749 -7.9757831588347230 189.890442743301 +4750 0.4750 -7.9946875044131831 188.196468825903 +4751 0.4751 -8.0134226335469982 186.506113850402 +4752 0.4752 -8.0319889078494242 184.819372198101 +4753 0.4753 -8.0503866883722637 183.136238258699 +4754 0.4754 -8.0686163356066736 181.456706429497 +4755 0.4755 -8.0866782094839635 179.780771116300 +4756 0.4756 -8.1045726693764184 178.108426732801 +4757 0.4757 -8.1223000740980975 176.439667700797 +4758 0.4758 -8.1398607819056465 174.774488450199 +4759 0.4759 -8.1572551504990969 173.112883418802 +4760 0.4760 -8.1744835370226578 171.454847052402 +4761 0.4761 -8.1915462980655427 169.800373805301 +4762 0.4762 -8.2084437896627680 168.149458139200 +4763 0.4763 -8.2251763672959282 166.502094523999 +4764 0.4764 -8.2417443858940125 164.858277437699 +4765 0.4765 -8.2581481998342081 163.218001366200 +4766 0.4766 -8.2743881629426834 161.581260803297 +4767 0.4767 -8.2904646284953980 159.948050251001 +4768 0.4768 -8.3063779492188825 158.318364218700 +4769 0.4769 -8.3221284772910273 156.692197224198 +4770 0.4770 -8.3377165643419016 155.069543793299 +4771 0.4771 -8.3531425614545167 153.450398458997 +4772 0.4772 -8.3684068191656173 151.834755763000 +4773 0.4773 -8.3835096874664874 150.222610254397 +4774 0.4774 -8.3984515158037230 148.613956490299 +4775 0.4775 -8.4132326530800228 147.008789035699 +4776 0.4776 -8.4278534476549734 145.407102463301 +4777 0.4777 -8.4423142473458288 143.808891353801 +4778 0.4778 -8.4566153994282995 142.214150295602 +4779 0.4779 -8.4707572506373197 140.622873884800 +4780 0.4780 -8.4847401471678499 139.035056725801 +4781 0.4781 -8.4985644346756448 137.450693430101 +4782 0.4782 -8.5122304582780153 135.869778617300 +4783 0.4783 -8.5257385625546309 134.292306915000 +4784 0.4784 -8.5390890915482860 132.718272958098 +4785 0.4785 -8.5522823887656667 131.147671389499 +4786 0.4786 -8.5653187971781275 129.580496859699 +4787 0.4787 -8.5781986592224673 128.016744027098 +4788 0.4788 -8.5909223168016968 126.456407557502 +4789 0.4789 -8.6034901112858115 124.899482124800 +4790 0.4790 -8.6159023835125623 123.345962410202 +4791 0.4791 -8.6281594737882124 121.795843102800 +4792 0.4792 -8.6402617218883115 120.249118899201 +4793 0.4793 -8.6522094670584622 118.705784503800 +4794 0.4794 -8.6640030480150827 117.165834628600 +4795 0.4795 -8.6756428029461681 115.629263993100 +4796 0.4796 -8.6871290695120535 114.096067324601 +4797 0.4797 -8.6984621848461732 112.566239357800 +4798 0.4798 -8.7096424855558183 111.039774835101 +4799 0.4799 -8.7206703077229086 109.516668506700 +4800 0.4800 -8.7315459869047327 107.996915129799 +4801 0.4801 -8.7422698581347120 106.480509469800 +4802 0.4802 -8.7528422559231522 104.967446299001 +4803 0.4803 -8.7632635142580018 103.457720398001 +4804 0.4804 -8.7735339666056120 101.951326554201 +4805 0.4805 -8.7836539459114675 100.448259562900 +4806 0.4806 -8.7936237846009533 98.948514226800 +4807 0.4807 -8.8034438145800991 97.452085356101 +4808 0.4808 -8.8131143672363343 95.958967768600 +4809 0.4809 -8.8226357734392344 94.469156289400 +4810 0.4810 -8.8320083635412541 92.982645750999 +4811 0.4811 -8.8412324673784788 91.499430993499 +4812 0.4812 -8.8503084142713835 90.019506864599 +4813 0.4813 -8.8592365330255589 88.542868218899 +4814 0.4814 -8.8680171519324489 87.069509918900 +4815 0.4815 -8.8766505987701088 85.599426834300 +4816 0.4816 -8.8851372008039391 84.132613842299 +4817 0.4817 -8.8934772847874193 82.669065827300 +4818 0.4818 -8.9016711769628447 81.208777681199 +4819 0.4819 -8.9097192030620693 79.751744303299 +4820 0.4820 -8.9176216883072392 78.297960600099 +4821 0.4821 -8.9253789574115245 76.847421485600 +4822 0.4822 -8.9329913345798495 75.400121880899 +4823 0.4823 -8.9404591435096297 73.956056714700 +4824 0.4824 -8.9477827073915090 72.515220922900 +4825 0.4825 -8.9549623489100796 71.077609448501 +4826 0.4826 -8.9619983902446148 69.643217242199 +4827 0.4827 -8.9688911530697943 68.212039261400 +4828 0.4828 -8.9756409585564239 66.784070471200 +4829 0.4829 -8.9822481273721788 65.359305843900 +4830 0.4830 -8.9887129796823189 63.937740358901 +4831 0.4831 -8.9950358351504143 62.519369003001 +4832 0.4832 -9.0012170129390690 61.104186770101 +4833 0.4833 -9.0072568317106345 59.692188661200 +4834 0.4834 -9.0131556096279297 58.283369684701 +4835 0.4835 -9.0189136643549705 56.877724856100 +4836 0.4836 -9.0245313130576861 55.475249198200 +4837 0.4837 -9.0300088724046308 54.075937740699 +4838 0.4838 -9.0353466585677058 52.679785520801 +4839 0.4839 -9.0405449872228711 51.286787582501 +4840 0.4840 -9.0456041735508510 49.896938977101 +4841 0.4841 -9.0505245322378602 48.510234763100 +4842 0.4842 -9.0553063774763149 47.126670006000 +4843 0.4843 -9.0599500229655447 45.746239778600 +4844 0.4844 -9.0644557819124891 44.368939160300 +4845 0.4845 -9.0688239670324098 42.994763238101 +4846 0.4846 -9.0730548905496100 41.623707105900 +4847 0.4847 -9.0771488641981399 40.255765864700 +4848 0.4848 -9.0811061992224893 38.890934622301 +4849 0.4849 -9.0849272063782998 37.529208493901 +4850 0.4850 -9.0886121959330755 36.170582601600 +4851 0.4851 -9.0921614776668704 34.815052074300 +4852 0.4852 -9.0955753608730063 33.462612048401 +4853 0.4853 -9.0988541543587669 32.113257666801 +4854 0.4854 -9.1019981664460872 30.766984079599 +4855 0.4855 -9.1050077049722677 29.423786443998 +4856 0.4856 -9.1078830772906620 28.083659923899 +4857 0.4857 -9.1106245902713727 26.746599690299 +4858 0.4858 -9.1132325503019533 25.412600921300 +4859 0.4859 -9.1157072632880940 24.081658801500 +4860 0.4860 -9.1180490346543284 22.753768523200 +4861 0.4861 -9.1202581693447229 21.428925284701 +4862 0.4862 -9.1223349718235482 20.107124291801 +4863 0.4863 -9.1242797460759881 18.788360757000 +4864 0.4864 -9.1260927956088285 17.472629899799 +4865 0.4865 -9.1277744234511431 16.159926946500 +4866 0.4866 -9.1293249321549830 14.850247130300 +4867 0.4867 -9.1307446237960530 13.543585691101 +4868 0.4868 -9.1320337999744083 12.239937876000 +4869 0.4869 -9.1331927618151330 10.939298938501 +4870 0.4870 -9.1342218099690236 9.641664139299 +4871 0.4871 -9.1351212446132735 8.347028745700 +4872 0.4872 -9.1358913654521476 7.055388031800 +4873 0.4873 -9.1365324717176772 5.766737278800 +4874 0.4874 -9.1370448621703275 4.481071774200 +4875 0.4875 -9.1374288350996729 3.198386812699 +4876 0.4876 -9.1376846883250931 1.918677695699 +4877 0.4877 -9.1378127191964236 0.641939730900 +4878 0.4878 -9.1378132245946428 -0.631831766499 +4879 0.4879 -9.1376865009325581 -1.902641475199 +4880 0.4880 -9.1374328441554589 -3.170494066799 +4881 0.4881 -9.1370525497418047 -4.435394206299 +4882 0.4882 -9.1365459127038946 -5.697346551900 +4883 0.4883 -9.1359132275885244 -6.956355755501 +4884 0.4884 -9.1351547884776600 -8.212426461800 +4885 0.4885 -9.1342708889891195 -9.465563308999 +4886 0.4886 -9.1332618222772339 -10.715770928700 +4887 0.4887 -9.1321278810335080 -11.963053945801 +4888 0.4888 -9.1308693574872937 -13.207416978499 +4889 0.4889 -9.1294865434064434 -14.448864638500 +4890 0.4890 -9.1279797300979784 -15.687401530800 +4891 0.4891 -9.1263492084087634 -16.923032253500 +4892 0.4892 -9.1245952687261589 -18.155761398599 +4893 0.4893 -9.1227182009786745 -19.385593551100 +4894 0.4894 -9.1207182946366387 -20.612533289599 +4895 0.4895 -9.1185958387128530 -21.836585186100 +4896 0.4896 -9.1163511217632482 -23.057753806001 +4897 0.4897 -9.1139844318875483 -24.276043708000 +4898 0.4898 -9.1114960567299281 -25.491459444400 +4899 0.4899 -9.1088862834796576 -26.704005561000 +4900 0.4900 -9.1061553988717581 -27.913686596999 +4901 0.4901 -9.1033036891876584 -29.120507085001 +4902 0.4902 -9.1003314402558484 -30.324471551201 +4903 0.4903 -9.0972389374525182 -31.525584515401 +4904 0.4904 -9.0940264657022283 -32.723850490400 +4905 0.4905 -9.0906943094785486 -33.919273983200 +4906 0.4906 -9.0872427528046984 -35.111859493800 +4907 0.4907 -9.0836720792542138 -36.301611515901 +4908 0.4908 -9.0799825719515734 -37.488534536900 +4909 0.4909 -9.0761745135728589 -38.672633037400 +4910 0.4910 -9.0722481863463891 -39.853911492000 +4911 0.4911 -9.0682038720533598 -41.032374368600 +4912 0.4912 -9.0640418520285042 -42.208026128501 +4913 0.4913 -9.0597624071607239 -43.380871227100 +4914 0.4914 -9.0553658178937244 -44.550914112899 +4915 0.4915 -9.0508523642266638 -45.718159228300 +4916 0.4916 -9.0462223257147887 -46.882611009200 +4917 0.4917 -9.0414759814700734 -48.044273885102 +4918 0.4918 -9.0366136101618526 -49.203152279300 +4919 0.4919 -9.0316354900174627 -50.359250608501 +4920 0.4920 -9.0265418988228685 -51.512573283400 +4921 0.4921 -9.0213331139233084 -52.663124707798 +4922 0.4922 -9.0160094122239283 -53.810909279799 +4923 0.4923 -9.0105710701903980 -54.955931390799 +4924 0.4924 -9.0050183638495582 -56.098195425999 +4925 0.4925 -8.9993515687900381 -57.237705764399 +4926 0.4926 -8.9935709601628986 -58.374466778399 +4927 0.4927 -8.9876768126822579 -59.508482834399 +4928 0.4928 -8.9816694006259183 -60.639758292398 +4929 0.4929 -8.9755489978359932 -61.768297506100 +4930 0.4930 -8.9693158777195237 -62.894104823299 +4931 0.4931 -8.9629703132491034 -64.017184585100 +4932 0.4932 -8.9565125769635241 -65.137541126500 +4933 0.4933 -8.9499429409683842 -66.255178776300 +4934 0.4934 -8.9432616769367037 -67.370101857299 +4935 0.4935 -8.9364690561095532 -68.482314685700 +4936 0.4936 -8.9295653492966878 -69.591821571599 +4937 0.4937 -8.9225508268771527 -70.698626819099 +4938 0.4938 -8.9154257587998931 -71.802734726100 +4939 0.4939 -8.9081904145843875 -72.904149584001 +4940 0.4940 -8.9008450633212668 -74.002875678401 +4941 0.4941 -8.8933899736729067 -75.098917288800 +4942 0.4942 -8.8858254138740662 -76.192278688000 +4943 0.4943 -8.8781516517325016 -77.282964143300 +4944 0.4944 -8.8703689546295621 -78.370977915500 +4945 0.4945 -8.8624775895208163 -79.456324259399 +4946 0.4946 -8.8544778229366621 -80.539007423700 +4947 0.4947 -8.8463699209829425 -81.619031650700 +4948 0.4948 -8.8381541493415430 -82.696401177300 +4949 0.4949 -8.8298307732709933 -83.771120233700 +4950 0.4950 -8.8214000576071037 -84.843193044100 +4951 0.4951 -8.8128622667635543 -85.912623826900 +4952 0.4952 -8.8042176647325050 -86.979416794100 +4953 0.4953 -8.7954665150852005 -88.043576152000 +4954 0.4954 -8.7866090809725605 -89.105106100800 +4955 0.4955 -8.7776456251258104 -90.164010834200 +4956 0.4956 -8.7685764098570704 -91.220294540599 +4957 0.4957 -8.7594016970599498 -92.273961401801 +4958 0.4958 -8.7501217482101605 -93.325015594000 +4959 0.4959 -8.7407368243661061 -94.373461287099 +4960 0.4960 -8.7312471861694956 -95.419302645101 +4961 0.4961 -8.7216530938459300 -96.462543826199 +4962 0.4962 -8.7119548072054993 -97.503188982400 +4963 0.4963 -8.7021525856433843 -98.541242259900 +4964 0.4964 -8.6922466881404485 -99.576707798800 +4965 0.4965 -8.6822373732638436 -100.609589733300 +4966 0.4966 -8.6721248991675939 -101.639892191701 +4967 0.4967 -8.6619095235931880 -102.667619296399 +4968 0.4968 -8.6515915038701774 -103.692775163800 +4969 0.4969 -8.6411710969167572 -104.715363904599 +4970 0.4970 -8.6306485592403721 -105.735389623100 +4971 0.4971 -8.6200241469383023 -106.752856418299 +4972 0.4972 -8.6092981156982376 -107.767768383001 +4973 0.4973 -8.5984707207988773 -108.780129604200 +4974 0.4974 -8.5875422171105171 -109.789944163000 +4975 0.4975 -8.5765128590956419 -110.797216134501 +4976 0.4976 -8.5653829008095066 -111.801949588200 +4977 0.4977 -8.5541525959007068 -112.804148587800 +4978 0.4978 -8.5428221976117769 -113.803817190799 +4979 0.4979 -8.5313919587797766 -114.800959449200 +4980 0.4980 -8.5198621318368666 -115.795579408999 +4981 0.4981 -8.5082329688108871 -116.787681110600 +4982 0.4982 -8.4965047213259375 -117.777268588401 +4983 0.4983 -8.4846776406029623 -118.764345871101 +4984 0.4984 -8.4727519774603319 -119.748916981502 +4985 0.4985 -8.4607279823144115 -120.730985936900 +4986 0.4986 -8.4486059051801412 -121.710556748500 +4987 0.4987 -8.4363859956716158 -122.687633422000 +4988 0.4988 -8.4240685030026601 -123.662219957099 +4989 0.4989 -8.4116536759874059 -124.634320348001 +4990 0.4990 -8.3991417630408467 -125.603938583199 +4991 0.4991 -8.3865330121794326 -126.571078645100 +4992 0.4992 -8.3738276710216422 -127.535744510700 +4993 0.4993 -8.3610259867885421 -128.497940151301 +4994 0.4994 -8.3481282063043629 -129.457669532299 +4995 0.4995 -8.3351345759970634 -130.414936613701 +4996 0.4996 -8.3220453418989031 -131.369745349501 +4997 0.4997 -8.3088607496470175 -132.322099688199 +4998 0.4998 -8.2955810444839724 -133.272003572700 +4999 0.4999 -8.2822064712583323 -134.219460940099 +5000 0.5000 -8.2687372744252468 -135.164475721600 +5001 0.5001 -8.2551736980469919 -136.107051843501 +5002 0.5002 -8.2415159857935318 -137.047193225701 +5003 0.5003 -8.2277643809431016 -137.984903782899 +5004 0.5004 -8.2139191263827520 -138.920187424101 +5005 0.5005 -8.1999804646089220 -139.853048052501 +5006 0.5006 -8.1859486377279964 -140.783489566000 +5007 0.5007 -8.1718238874568616 -141.711515856699 +5008 0.5008 -8.1576064551234673 -142.637130811201 +5009 0.5009 -8.1432965816673821 -143.560338310501 +5010 0.5010 -8.1288945076403518 -144.481142230099 +5011 0.5011 -8.1144004732068620 -145.399546439699 +5012 0.5012 -8.0998147181446924 -146.315554803699 +5013 0.5013 -8.0851374818454627 -147.229171180899 +5014 0.5014 -8.0703690033152036 -148.140399424299 +5015 0.5015 -8.0555095211748942 -149.049243381900 +5016 0.5016 -8.0405592736610139 -149.955706895700 +5017 0.5017 -8.0255184986261092 -150.859793802400 +5018 0.5018 -8.0103874335393286 -151.761507933201 +5019 0.5019 -7.9951663154869834 -152.660853113699 +5020 0.5020 -7.9798553811730883 -153.557833164199 +5021 0.5021 -7.9644548669199233 -154.452451899098 +5022 0.5022 -7.9489650086685781 -155.344713127801 +5023 0.5023 -7.9333860419794879 -156.234620654001 +5024 0.5024 -7.9177182020329875 -157.122178276000 +5025 0.5025 -7.9019617236298521 -158.007389786701 +5026 0.5026 -7.8861168411918472 -158.890258973401 +5027 0.5027 -7.8701837887622768 -159.770789618000 +5028 0.5028 -7.8541628000065220 -160.648985497099 +5029 0.5029 -7.8380541082125772 -161.524850381800 +5030 0.5030 -7.8218579462915923 -162.398388037900 +5031 0.5031 -7.8055745467784226 -163.269602225500 +5032 0.5032 -7.7892041418321627 -164.138496699701 +5033 0.5033 -7.7727469632366830 -165.005075209900 +5034 0.5034 -7.7562032424011882 -165.869341500000 +5035 0.5035 -7.7395732103607235 -166.731299309300 +5036 0.5036 -7.7228570977767284 -167.590952370601 +5037 0.5037 -7.7060551349375785 -168.448304412401 +5038 0.5038 -7.6891675517591036 -169.303359157100 +5039 0.5039 -7.6721945777851337 -170.156120322299 +5040 0.5040 -7.6551364421880335 -171.006591619700 +5041 0.5041 -7.6379933737692385 -171.854776756199 +5042 0.5042 -7.6207656009597837 -172.700679432899 +5043 0.5043 -7.6034533518208285 -173.544303346200 +5044 0.5044 -7.5860568540441884 -174.385652186600 +5045 0.5045 -7.5685763349528736 -175.224729639700 +5046 0.5046 -7.5510120215016086 -176.061539385601 +5047 0.5047 -7.5333641402773681 -176.896085099201 +5048 0.5048 -7.5156329174999081 -177.728370449999 +5049 0.5049 -7.4978185790222778 -178.558399102601 +5050 0.5050 -7.4799213503313577 -179.386174715801 +5051 0.5051 -7.4619414565483924 -180.211700943501 +5052 0.5052 -7.4438791224294922 -181.034981434499 +5053 0.5053 -7.4257345723661672 -181.856019831999 +5054 0.5054 -7.4075080303858618 -182.674819774100 +5055 0.5055 -7.3891997201524715 -183.491384893701 +5056 0.5056 -7.3708098649668568 -184.305718818599 +5057 0.5057 -7.3523386877673671 -185.117825171201 +5058 0.5058 -7.3337864111303617 -185.927707568901 +5059 0.5059 -7.3151532572707367 -186.735369623600 +5060 0.5060 -7.2964394480424364 -187.540814942400 +5061 0.5061 -7.2776452049389615 -188.344047127101 +5062 0.5062 -7.2587707490939017 -189.145069774098 +5063 0.5063 -7.2398163012814472 -189.943886474999 +5064 0.5064 -7.2207820819169024 -190.740500815898 +5065 0.5065 -7.2016683110572126 -191.534916377899 +5066 0.5066 -7.1824752084014625 -192.327136737100 +5067 0.5067 -7.1632029932913879 -193.117165464400 +5068 0.5068 -7.1438518847119026 -193.905006125300 +5069 0.5069 -7.1244221012916027 -194.690662280700 +5070 0.5070 -7.1049138613032774 -195.474137485800 +5071 0.5071 -7.0853273826644276 -196.255435291199 +5072 0.5072 -7.0656628829377572 -197.034559242200 +5073 0.5073 -7.0459205793317023 -197.811512878900 +5074 0.5074 -7.0261006887009376 -198.586299736400 +5075 0.5075 -7.0062034275468630 -199.358923345100 +5076 0.5076 -6.9862290120181276 -200.129387229599 +5077 0.5077 -6.9661776579111478 -200.897694910000 +5078 0.5078 -6.9460495806705875 -201.663849901199 +5079 0.5079 -6.9258449953898724 -202.427855713100 +5080 0.5080 -6.9055641168116972 -203.189715850400 +5081 0.5081 -6.8852071593285222 -203.949433813101 +5082 0.5082 -6.8647743369830874 -204.707013095600 +5083 0.5083 -6.8442658634689071 -205.462457187999 +5084 0.5084 -6.8236819521307668 -206.215769574799 +5085 0.5085 -6.8030228159652317 -206.966953735900 +5086 0.5086 -6.7822886676211418 -207.716013145899 +5087 0.5087 -6.7614797194001115 -208.462951274701 +5088 0.5088 -6.7405961832570211 -209.207771587100 +5089 0.5089 -6.7196382708005258 -209.950477542801 +5090 0.5090 -6.6986061932935561 -210.691072596601 +5091 0.5091 -6.6775001616537963 -211.429560198600 +5092 0.5092 -6.6563203864541913 -212.165943793501 +5093 0.5093 -6.6350670779234413 -212.900226821501 +5094 0.5094 -6.6137404459464912 -213.632412717499 +5095 0.5095 -6.5923407000650309 -214.362504911700 +5096 0.5096 -6.5708680494779808 -215.090506829300 +5097 0.5097 -6.5493227030419812 -215.816421890700 +5098 0.5098 -6.5277048692718909 -216.540253511101 +5099 0.5099 -6.5060147563412762 -217.262005101200 +5100 0.5100 -6.4842525720828963 -217.981680066399 +5101 0.5101 -6.4624185239892062 -218.699281807400 +5102 0.5102 -6.4405128192128265 -219.414813720199 +5103 0.5103 -6.4185356645670364 -220.128279195600 +5104 0.5104 -6.3964872665262664 -220.839681619800 +5105 0.5105 -6.3743678312265768 -221.549024374001 +5106 0.5106 -6.3521775644661469 -222.256310834600 +5107 0.5107 -6.3299166717057673 -222.961544373000 +5108 0.5108 -6.3075853580693177 -223.664728356000 +5109 0.5109 -6.2851838283442429 -224.365866145499 +5110 0.5110 -6.2627122869820484 -225.064961098400 +5111 0.5111 -6.2401709380987738 -225.762016567100 +5112 0.5112 -6.2175599854754786 -226.457035898798 +5113 0.5113 -6.1948796325587185 -227.150022436401 +5114 0.5114 -6.1721300824610283 -227.840979517399 +5115 0.5115 -6.1493115379614087 -228.529910474999 +5116 0.5116 -6.1264242015057890 -229.216818637400 +5117 0.5117 -6.1034682752075140 -229.901707328099 +5118 0.5118 -6.0804439608478242 -230.584579865701 +5119 0.5119 -6.0573514598763296 -231.265439564200 +5120 0.5120 -6.0341909734114845 -231.944289732701 +5121 0.5121 -6.0109627022410592 -232.621133675801 +5122 0.5122 -5.9876668468226146 -233.295974693099 +5123 0.5123 -5.9643036072839895 -233.968816079399 +5124 0.5124 -5.9408731834237596 -234.639661125200 +5125 0.5125 -5.9173757747117142 -235.308513115700 +5126 0.5126 -5.8938115802893343 -235.975375331900 +5127 0.5127 -5.8701807989702495 -236.640251049801 +5128 0.5128 -5.8464836292407192 -237.303143540799 +5129 0.5129 -5.8227202692601043 -237.964056071500 +5130 0.5130 -5.7988909168613292 -238.622991904002 +5131 0.5131 -5.7749957695513494 -239.279954295600 +5132 0.5132 -5.7510350245116291 -239.934946498801 +5133 0.5133 -5.7270088785986042 -240.587971761701 +5134 0.5134 -5.7029175283441393 -241.239033327600 +5135 0.5135 -5.6787611699560046 -241.888134435099 +5136 0.5136 -5.6545399993183398 -242.535278318199 +5137 0.5137 -5.6302542119921144 -243.180468206301 +5138 0.5138 -5.6059040032155947 -243.823707324100 +5139 0.5139 -5.5814895679048000 -244.464998891801 +5140 0.5140 -5.5570111006539751 -245.104346124699 +5141 0.5141 -5.5324687957360554 -245.741752233700 +5142 0.5142 -5.5078628471031106 -246.377220425200 +5143 0.5143 -5.4831934483868103 -247.010753900800 +5144 0.5144 -5.4584607928989000 -247.642355857401 +5145 0.5145 -5.4336650736316496 -248.272029487600 +5146 0.5146 -5.4088064832583100 -248.899777979199 +5147 0.5147 -5.3838852141335654 -249.525604515700 +5148 0.5148 -5.3589014582939951 -250.149512275699 +5149 0.5149 -5.3338554074585405 -250.771504433400 +5150 0.5150 -5.3087472530289554 -251.391584158300 +5151 0.5151 -5.2835771860902554 -252.009754615699 +5152 0.5152 -5.2583453974111753 -252.626018965901 +5153 0.5153 -5.2330520774446203 -253.240380365200 +5154 0.5154 -5.2076974163281307 -253.852841964601 +5155 0.5155 -5.1822816038843253 -254.463406911500 +5156 0.5156 -5.1568048296213451 -255.072078348099 +5157 0.5157 -5.1312672827333250 -255.678859412301 +5158 0.5158 -5.1056691521008348 -256.283753237500 +5159 0.5159 -5.0800106262913296 -256.886762952599 +5160 0.5160 -5.0542918935595900 -257.487891682200 +5161 0.5161 -5.0285131418481797 -258.087142546001 +5162 0.5162 -5.0026745587878994 -258.684518659600 +5163 0.5163 -4.9767763316982192 -259.280023133999 +5164 0.5164 -4.9508186475877389 -259.873659075600 +5165 0.5165 -4.9248016931546390 -260.465429586400 +5166 0.5166 -4.8987256547871194 -261.055337763999 +5167 0.5167 -4.8725907185638295 -261.643386701800 +5168 0.5168 -4.8463970702543246 -262.229579488299 +5169 0.5169 -4.8201448953195145 -262.813919207902 +5170 0.5170 -4.7938343789120994 -263.396408940400 +5171 0.5171 -4.7674657058770293 -263.977051761000 +5172 0.5172 -4.7410390607519242 -264.555850741101 +5173 0.5173 -4.7145546277675141 -265.132808947099 +5174 0.5174 -4.6880125908480990 -265.707929441200 +5175 0.5175 -4.6614131336119788 -266.281215281200 +5176 0.5176 -4.6347564393718885 -266.852669520600 +5177 0.5177 -4.6080426911354433 -267.422295208300 +5178 0.5178 -4.5812720716055733 -267.990095389101 +5179 0.5179 -4.5544447631809630 -268.556073103100 +5180 0.5180 -4.5275609479564878 -269.120231386400 +5181 0.5181 -4.5006208077236476 -269.682573270400 +5182 0.5182 -4.4736245239710080 -270.243101782400 +5183 0.5183 -4.4465722778846279 -270.801819945202 +5184 0.5184 -4.4194642503484980 -271.358730777400 +5185 0.5185 -4.3923006219449832 -271.913837292899 +5186 0.5186 -4.3650815729552432 -272.467142501899 +5187 0.5187 -4.3378072833596537 -273.018649409900 +5188 0.5188 -4.3104779328382641 -273.568361017900 +5189 0.5189 -4.2830937007712286 -274.116280322800 +5190 0.5190 -4.2556547662392132 -274.662410317500 +5191 0.5191 -4.2281613080238429 -275.206753989900 +5192 0.5192 -4.2006135046081283 -275.749314324399 +5193 0.5193 -4.1730115341768883 -276.290094300401 +5194 0.5194 -4.1453555746171880 -276.829096893602 +5195 0.5195 -4.1176458035187631 -277.366325074900 +5196 0.5196 -4.0898823981744430 -277.901781811501 +5197 0.5197 -4.0620655355805830 -278.435470065700 +5198 0.5198 -4.0341953924374883 -278.967392796199 +5199 0.5199 -4.0062721451498282 -279.497552957000 +5200 0.5200 -3.9782959698270783 -280.025953498000 +5201 0.5201 -3.9502670422839286 -280.552597365000 +5202 0.5202 -3.9221855380407233 -281.077487499100 +5203 0.5203 -3.8940516323238783 -281.600626837801 +5204 0.5204 -3.8658655000662883 -282.122018313999 +5205 0.5205 -3.8376273159077683 -282.641664856399 +5206 0.5206 -3.8093372541954684 -283.159569389600 +5207 0.5207 -3.7809954889842885 -283.675734834000 +5208 0.5208 -3.7526021940373036 -284.190164105699 +5209 0.5209 -3.7241575428261786 -284.702860116799 +5210 0.5210 -3.6956617085315937 -285.213825774901 +5211 0.5211 -3.6671148640436586 -285.723063983800 +5212 0.5212 -3.6385171819623285 -286.230577642800 +5213 0.5213 -3.6098688345978287 -286.736369647200 +5214 0.5214 -3.5811699939710535 -287.240442888300 +5215 0.5215 -3.5524208318139987 -287.742800252799 +5216 0.5216 -3.5236215195701637 -288.243444623900 +5217 0.5217 -3.4947722283949787 -288.742378879799 +5218 0.5218 -3.4658731291562286 -289.239605895200 +5219 0.5219 -3.4369243924344337 -289.735128540700 +5220 0.5220 -3.4079261885232786 -290.228949682401 +5221 0.5221 -3.3788786874300287 -290.721072182600 +5222 0.5222 -3.3497820588759386 -291.211498899200 +5223 0.5223 -3.3206364722966635 -291.700232686300 +5224 0.5224 -3.2914420968426685 -292.187276393599 +5225 0.5225 -3.2621991013796383 -292.672632867001 +5226 0.5226 -3.2329076544888884 -293.156304948001 +5227 0.5227 -3.2035679244677682 -293.638295474400 +5228 0.5228 -3.1741800793300783 -294.118607279399 +5229 0.5229 -3.1447442868064783 -294.597243192598 +5230 0.5230 -3.1152607143448736 -295.074206039500 +5231 0.5231 -3.0857295291108437 -295.549498641099 +5232 0.5232 -3.0561508979880387 -296.023123814999 +5233 0.5233 -3.0265249875785889 -296.495084373999 +5234 0.5234 -2.9968519642035139 -296.965383127499 +5235 0.5235 -2.9671319939031089 -297.434022880601 +5236 0.5236 -2.9373652424373589 -297.901006434400 +5237 0.5237 -2.9075518752863441 -298.366336585899 +5238 0.5238 -2.8776920576506440 -298.830016128100 +5239 0.5239 -2.8477859544517341 -299.292047850100 +5240 0.5240 -2.8178337303323842 -299.752434536900 +5241 0.5241 -2.7878355496570593 -300.211178969599 +5242 0.5242 -2.7577915765123295 -300.668283924999 +5243 0.5243 -2.7277019747072644 -301.123752176300 +5244 0.5244 -2.6975669077738296 -301.577586492400 +5245 0.5245 -2.6673865389672846 -302.029789638500 +5246 0.5246 -2.6371610312665745 -302.480364375700 +5247 0.5247 -2.6068905473747446 -302.929313460902 +5248 0.5248 -2.5765752497193346 -303.376639647300 +5249 0.5249 -2.5462153004527543 -303.822345684301 +5250 0.5250 -2.5158108614526893 -304.266434317000 +5251 0.5251 -2.4853620943225092 -304.708908286600 +5252 0.5252 -2.4548691603916493 -305.149770330599 +5253 0.5253 -2.4243322207160043 -305.589023182300 +5254 0.5254 -2.3937514360783294 -306.026669571200 +5255 0.5255 -2.3631269669886295 -306.462712222801 +5256 0.5256 -2.3324589736845445 -306.897153858899 +5257 0.5257 -2.3017476161317445 -307.329997197099 +5258 0.5258 -2.2709930540243244 -307.761244951300 +5259 0.5259 -2.2401954467851946 -308.190899831299 +5260 0.5260 -2.2093549535664647 -308.618964543299 +5261 0.5261 -2.1784717332498396 -309.045441789200 +5262 0.5262 -2.1475459444470144 -309.470334267300 +5263 0.5263 -2.1165777455000496 -309.893644672000 +5264 0.5264 -2.0855672944817596 -310.315375693801 +5265 0.5265 -2.0545147491961093 -310.735530019201 +5266 0.5266 -2.0234202671785941 -311.154110331099 +5267 0.5267 -1.9922840056966191 -311.571119308401 +5268 0.5268 -1.9611061217499040 -311.986559625901 +5269 0.5269 -1.9298867720708539 -312.400433955099 +5270 0.5270 -1.8986261131249440 -312.812744963101 +5271 0.5271 -1.8673243011111138 -313.223495313501 +5272 0.5272 -1.8359814919621438 -313.632687665900 +5273 0.5273 -1.8045978413450339 -314.040324676300 +5274 0.5274 -1.7731735046613839 -314.446408996699 +5275 0.5275 -1.7417086370477939 -314.850943275100 +5276 0.5276 -1.7102033933762288 -315.253930156199 +5277 0.5277 -1.6786579282543990 -315.655372280400 +5278 0.5278 -1.6470723960261489 -316.055272284601 +5279 0.5279 -1.6154469507718339 -316.453632801700 +5280 0.5280 -1.5837817463086938 -316.850456461099 +5281 0.5281 -1.5520769361912339 -317.245745888100 +5282 0.5282 -1.5203326737116138 -317.639503704300 +5283 0.5283 -1.4885491119000138 -318.031732527701 +5284 0.5284 -1.4567264035250087 -318.422434972401 +5285 0.5285 -1.4248647010939488 -318.811613648799 +5286 0.5286 -1.3929641568533440 -319.199271163299 +5287 0.5287 -1.3610249227892290 -319.585410119000 +5288 0.5288 -1.3290471506275390 -319.970033114800 +5289 0.5289 -1.2970309918344940 -320.353142746100 +5290 0.5290 -1.2649765976169540 -320.734741604701 +5291 0.5291 -1.2328841189228039 -321.114832278301 +5292 0.5292 -1.2007537064413289 -321.493417351199 +5293 0.5293 -1.1685855106035841 -321.870499403700 +5294 0.5294 -1.1363796815827640 -322.246081012701 +5295 0.5295 -1.1041363692945740 -322.620164751099 +5296 0.5296 -1.0718557233976040 -322.992753188300 +5297 0.5297 -1.0395378932936941 -323.363848889900 +5298 0.5298 -1.0071830281283141 -323.733454417699 +5299 0.5299 -0.9747912767909140 -324.101572330301 +5300 0.5300 -0.9423627879153090 -324.468205181800 +5301 0.5301 -0.9098977098800440 -324.833355523499 +5302 0.5302 -0.8773961908087541 -325.197025902300 +5303 0.5303 -0.8448583785705440 -325.559218861901 +5304 0.5304 -0.8122844207803440 -325.919936942100 +5305 0.5305 -0.7796744647992740 -326.279182679300 +5306 0.5306 -0.7470286577350190 -326.636958605801 +5307 0.5307 -0.7143471464421940 -326.993267250700 +5308 0.5308 -0.6816300775226940 -327.348111139299 +5309 0.5309 -0.6488775973260741 -327.701492793100 +5310 0.5310 -0.6160898519499091 -328.053414730201 +5311 0.5311 -0.5832669872401489 -328.403879465001 +5312 0.5312 -0.5504091487914838 -328.752889508300 +5313 0.5313 -0.5175164819477088 -329.100447367200 +5314 0.5314 -0.4845891318020939 -329.446555545099 +5315 0.5315 -0.4516272431977290 -329.791216542200 +5316 0.5316 -0.4186309607278890 -330.134432854600 +5317 0.5317 -0.3856004287363940 -330.476206975300 +5318 0.5318 -0.3525357913179740 -330.816541393100 +5319 0.5319 -0.3194371923186290 -331.155438593800 +5320 0.5320 -0.2863047753359740 -331.492901059300 +5321 0.5321 -0.2531386837196040 -331.828931268099 +5322 0.5322 -0.2199390605714541 -332.163531694900 +5323 0.5323 -0.1867060487461542 -332.496704811099 +5324 0.5324 -0.1534397908513891 -332.828453084201 +5325 0.5325 -0.1201404292482541 -333.158778978499 +5326 0.5326 -0.0868081060515992 -333.487684954600 +5327 0.5327 -0.0534429631303942 -333.815173469500 +5328 0.5328 -0.0200451421080843 -334.141246976698 +5329 0.5329 0.0133852156370656 -334.465907926300 +5330 0.5330 0.0468479689716156 -334.789158764699 +5331 0.5331 0.0803429770065855 -335.111001934700 +5332 0.5332 0.1138700990971105 -335.431439875800 +5333 0.5333 0.1474291948420955 -335.750475023899 +5334 0.5334 0.1810201240838604 -336.068109811400 +5335 0.5335 0.2146427469077805 -336.384346667001 +5336 0.5336 0.2482969236419405 -336.699188016200 +5337 0.5337 0.2819825148567905 -337.012636280799 +5338 0.5338 0.3156993813648005 -337.324693879400 +5339 0.5339 0.3494473842201055 -337.635363226700 +5340 0.5340 0.3832263847181405 -337.944646734000 +5341 0.5341 0.4170362443953155 -338.252546809501 +5342 0.5342 0.4508768250286705 -338.559065857600 +5343 0.5343 0.4847479886355056 -338.864206279100 +5344 0.5344 0.5186495974730406 -339.167970471601 +5345 0.5345 0.5525815140380906 -339.470360829400 +5346 0.5346 0.5865436010667107 -339.771379743001 +5347 0.5347 0.6205357215338407 -340.071029599601 +5348 0.5348 0.6545577386529559 -340.369312782701 +5349 0.5349 0.6886095158757409 -340.666231673000 +5350 0.5350 0.7226909168917460 -340.961788647101 +5351 0.5351 0.7568018056280261 -341.255986078500 +5352 0.5352 0.7909420462488110 -341.548826337199 +5353 0.5353 0.8251115031551660 -341.840311789900 +5354 0.5354 0.8593100409846460 -342.130444799701 +5355 0.5355 0.8935375246109460 -342.419227726299 +5356 0.5356 0.9277938191435711 -342.706662926201 +5357 0.5357 0.9620787899274962 -342.992752752301 +5358 0.5358 0.9963923025428212 -343.277499554200 +5359 0.5359 1.0307342228044412 -343.560905678200 +5360 0.5360 1.0651044167617012 -343.842973466999 +5361 0.5361 1.0995027506980510 -344.123705259999 +5362 0.5362 1.1339290911307109 -344.403103393201 +5363 0.5363 1.1683833048103411 -344.681170199401 +5364 0.5364 1.2028652587207063 -344.957908007900 +5365 0.5365 1.2373748200783363 -345.233319144700 +5366 0.5366 1.2719118563321763 -345.507405932100 +5367 0.5367 1.3064762351632662 -345.780170689699 +5368 0.5368 1.3410678244844161 -346.051615733300 +5369 0.5369 1.3756864924398462 -346.321743375300 +5370 0.5370 1.4103321074048663 -346.590555925100 +5371 0.5371 1.4450045379855514 -346.858055688601 +5372 0.5372 1.4797036530183865 -347.124244968099 +5373 0.5373 1.5144293215699414 -347.389126062999 +5374 0.5374 1.5491814129365564 -347.652701269300 +5375 0.5375 1.5839597966440013 -347.914972879600 +5376 0.5376 1.6187643424471314 -348.175943183001 +5377 0.5377 1.6535949203295566 -348.435614465501 +5378 0.5378 1.6884514005033366 -348.693989010100 +5379 0.5379 1.7233336534086265 -348.951069095699 +5380 0.5380 1.7582415497133566 -349.206856998901 +5381 0.5381 1.7931749603129066 -349.461354992100 +5382 0.5382 1.8281337563297666 -349.714565345101 +5383 0.5383 1.8631178091132217 -349.966490323999 +5384 0.5384 1.8981269902390117 -350.217132191801 +5385 0.5385 1.9331611715090167 -350.466493208300 +5386 0.5386 1.9682202249509266 -350.714575629900 +5387 0.5387 2.0033040228179115 -350.961381709800 +5388 0.5388 2.0384124375882915 -351.206913697801 +5389 0.5389 2.0735453419652163 -351.451173840700 +5390 0.5390 2.1087026088763565 -351.694164382101 +5391 0.5391 2.1438841114735565 -351.935887561900 +5392 0.5392 2.1790897231325164 -352.176345617299 +5393 0.5393 2.2143193174524765 -352.415540781900 +5394 0.5394 2.2495727682558764 -352.653475286101 +5395 0.5395 2.2848499495880565 -352.890151357500 +5396 0.5396 2.3201507357169215 -353.125571219800 +5397 0.5397 2.3554750011326218 -353.359737094201 +5398 0.5398 2.3908226205472318 -353.592651198000 +5399 0.5399 2.4261934688944269 -353.824315745900 +5400 0.5400 2.4615874213291771 -354.054732949100 +5401 0.5401 2.4970043532274069 -354.283905015500 +5402 0.5402 2.5324441401856870 -354.511834150100 +5403 0.5403 2.5679066580209171 -354.738522554500 +5404 0.5404 2.6033917827699922 -354.963972427000 +5405 0.5405 2.6388993906895020 -355.188185963199 +5406 0.5406 2.6744293582554217 -355.411165355199 +5407 0.5407 2.7099815621627665 -355.632912791700 +5408 0.5408 2.7455558793252863 -355.853430458699 +5409 0.5409 2.7811521868751665 -356.072720538901 +5410 0.5410 2.8167703621626914 -356.290785211600 +5411 0.5411 2.8524102827559363 -356.507626653300 +5412 0.5412 2.8880718264404512 -356.723247037000 +5413 0.5413 2.9237548712189412 -356.937648532799 +5414 0.5414 2.9594592953109662 -357.150833307700 +5415 0.5415 2.9951849771526211 -357.362803525401 +5416 0.5416 3.0309317953962212 -357.573561346600 +5417 0.5417 3.0666996289099862 -357.783108928701 +5418 0.5418 3.1024883567777310 -357.991448426199 +5419 0.5419 3.1382978582985559 -358.198581990300 +5420 0.5420 3.1741280129865359 -358.404511769300 +5421 0.5421 3.2099787005704061 -358.609239908101 +5422 0.5422 3.2458498009932462 -358.812768548700 +5423 0.5423 3.2817411944121813 -359.015099830001 +5424 0.5424 3.3176527611980715 -359.216235887801 +5425 0.5425 3.3535843819351916 -359.416178854601 +5426 0.5426 3.3895359374209315 -359.614930860200 +5427 0.5427 3.4255073086654866 -359.812494030901 +5428 0.5428 3.4614983768915515 -360.008870490399 +5429 0.5429 3.4975090235340116 -360.204062358800 +5430 0.5430 3.5335391302396317 -360.398071753600 +5431 0.5431 3.5695885788667518 -360.590900788799 +5432 0.5432 3.6056572514849767 -360.782551575699 +5433 0.5433 3.6417450303748815 -360.973026222400 +5434 0.5434 3.6778517980277017 -361.162326834001 +5435 0.5435 3.7139774371450267 -361.350455512500 +5436 0.5436 3.7501218306384869 -361.537414356701 +5437 0.5437 3.7862848616294618 -361.723205462800 +5438 0.5438 3.8224664134487720 -361.907830923401 +5439 0.5439 3.8586663696363721 -362.091292828600 +5440 0.5440 3.8948846139410622 -362.273593265199 +5441 0.5441 3.9311210303201674 -362.454734316900 +5442 0.5442 3.9673755029392423 -362.634718064601 +5443 0.5443 4.0036479161717775 -362.813546586101 +5444 0.5444 4.0399381545988877 -362.991221956101 +5445 0.5445 4.0762461030090131 -363.167746246399 +5446 0.5446 4.1125716463976278 -363.343121525899 +5447 0.5447 4.1489146699669330 -363.517349860200 +5448 0.5448 4.1852750591255532 -363.690433312200 +5449 0.5449 4.2216526994882431 -363.862373941600 +5450 0.5450 4.2580474768755883 -364.033173805301 +5451 0.5451 4.2944592773137034 -364.202834956999 +5452 0.5452 4.3308879870339378 -364.371359447699 +5453 0.5453 4.3673334924725875 -364.538749325300 +5454 0.5454 4.4037956802705871 -364.705006634700 +5455 0.5455 4.4402744372732075 -364.870133417700 +5456 0.5456 4.4767696505297678 -365.034131713501 +5457 0.5457 4.5132812072933381 -365.197003557900 +5458 0.5458 4.5498089950204479 -365.358750984300 +5459 0.5459 4.5863529013707982 -365.519376022701 +5460 0.5460 4.6229128142069431 -365.678880700199 +5461 0.5461 4.6594886215940177 -365.837267041299 +5462 0.5462 4.6960802117994378 -365.994537067099 +5463 0.5463 4.7326874732925974 -366.150692796100 +5464 0.5464 4.7693102947445878 -366.305736243699 +5465 0.5465 4.8059485650279079 -366.459669422700 +5466 0.5466 4.8426021732161626 -366.612494342400 +5467 0.5467 4.8792710085837729 -366.764213009799 +5468 0.5468 4.9159549606056876 -366.914827428500 +5469 0.5469 4.9526539189570924 -367.064339599599 +5470 0.5470 4.9893677735131119 -367.212751520799 +5471 0.5471 5.0260964143485269 -367.360065187500 +5472 0.5472 5.0628397317374967 -367.506282591901 +5473 0.5473 5.0995976161532468 -367.651405723102 +5474 0.5474 5.1363699582677871 -367.795436567700 +5475 0.5475 5.1731566489516370 -367.938377109300 +5476 0.5476 5.2099575792735271 -368.080229328500 +5477 0.5477 5.2467726405001018 -368.220995203001 +5478 0.5478 5.2836017240956519 -368.360676708000 +5479 0.5479 5.3204447217218220 -368.499275815400 +5480 0.5480 5.3573015252373120 -368.636794494400 +5481 0.5481 5.3941720266976017 -368.773234711402 +5482 0.5482 5.4310561183546664 -368.908598429900 +5483 0.5483 5.4679536926566810 -369.042887610400 +5484 0.5484 5.5048646422477461 -369.176104210899 +5485 0.5485 5.5417888599676060 -369.308250186301 +5486 0.5486 5.5787262388513614 -369.439327488801 +5487 0.5487 5.6156766721291715 -369.569338067400 +5488 0.5488 5.6526400532259915 -369.698283869000 +5489 0.5489 5.6896162757612867 -369.826166836900 +5490 0.5490 5.7266052335487316 -369.952988912000 +5491 0.5491 5.7636068205959514 -370.078752032401 +5492 0.5492 5.8006209311042269 -370.203458133101 +5493 0.5493 5.8376474594682115 -370.327109146599 +5494 0.5494 5.8746863002756617 -370.449707002401 +5495 0.5495 5.9117373483071516 -370.571253627399 +5496 0.5496 5.9488004985357916 -370.691750945400 +5497 0.5497 5.9858756461269413 -370.811200877601 +5498 0.5498 6.0229626864379417 -370.929605342399 +5499 0.5499 6.0600615150178365 -371.046966255501 +5500 0.5500 6.0971720276070869 -371.163285529499 +5501 0.5501 6.1342941201372865 -371.278565074501 +5502 0.5502 6.1714276887309119 -371.392806798000 +5503 0.5503 6.2085726297010222 -371.506012604201 +5504 0.5504 6.2457288395509769 -371.618184394900 +5505 0.5505 6.2828962149741718 -371.729324069000 +5506 0.5506 6.3200746528537621 -371.839433522800 +5507 0.5507 6.3572640502623923 -371.948514649799 +5508 0.5508 6.3944643044619021 -372.056569340399 +5509 0.5509 6.4316753129030673 -372.163599482901 +5510 0.5510 6.4688969732253225 -372.269606962200 +5511 0.5511 6.5061291832564825 -372.374593661001 +5512 0.5512 6.5433718410124726 -372.478561458800 +5513 0.5513 6.5806248446970477 -372.581512232700 +5514 0.5514 6.6178880927015280 -372.683447856900 +5515 0.5515 6.6551614836045232 -372.784370203000 +5516 0.5516 6.6924449161716630 -372.884281139801 +5517 0.5517 6.7297382893553230 -372.983182533399 +5518 0.5518 6.7670415022943482 -373.081076247099 +5519 0.5519 6.8043544543137831 -373.177964141600 +5520 0.5520 6.8416770449246131 -373.273848074999 +5521 0.5521 6.8790091738234835 -373.368729902400 +5522 0.5522 6.9163507408924190 -373.462611476300 +5523 0.5523 6.9537016461985743 -373.555494646800 +5524 0.5524 6.9910617899939593 -373.647381260900 +5525 0.5525 7.0284310727151595 -373.738273163101 +5526 0.5526 7.0658093949830798 -373.828172195299 +5527 0.5527 7.1031966576026697 -373.917080196499 +5528 0.5528 7.1405927615626545 -374.004999003200 +5529 0.5529 7.1779976080352794 -374.091930449300 +5530 0.5530 7.2154110983760340 -374.177876365799 +5531 0.5531 7.2528331341233736 -374.262838581000 +5532 0.5532 7.2902636169984687 -374.346818920900 +5533 0.5533 7.3277024489049385 -374.429819208499 +5534 0.5534 7.3651495319285836 -374.511841264401 +5535 0.5535 7.4026047683371132 -374.592886906201 +5536 0.5536 7.4400680605798835 -374.672957949200 +5537 0.5537 7.4775393112876385 -374.752056205900 +5538 0.5538 7.5150184232722488 -374.830183486301 +5539 0.5539 7.5525052995264392 -374.907341597500 +5540 0.5540 7.5899998432235245 -374.983532344200 +5541 0.5541 7.6275019577171497 -375.058757528299 +5542 0.5542 7.6650115465410300 -375.133018949300 +5543 0.5543 7.7025285134086898 -375.206318403900 +5544 0.5544 7.7400527622131996 -375.278657686300 +5545 0.5545 7.7775841970268997 -375.350038587700 +5546 0.5546 7.8151227221011546 -375.420462897400 +5547 0.5547 7.8526682418660991 -375.489932401500 +5548 0.5548 7.8902206609303640 -375.558448883799 +5549 0.5549 7.9277798840808140 -375.626014125201 +5550 0.5550 7.9653458162822943 -375.692629904399 +5551 0.5551 8.0029183626773790 -375.758297997299 +5552 0.5552 8.0404974285860984 -375.823020177100 +5553 0.5553 8.0780829195056842 -375.886798214600 +5554 0.5554 8.1156747411103147 -375.949633878001 +5555 0.5555 8.1532727992508498 -376.011528932699 +5556 0.5556 8.1908769999545790 -376.072485141900 +5557 0.5557 8.2284872494249690 -376.132504265899 +5558 0.5558 8.2661034540414047 -376.191588062800 +5559 0.5559 8.3037255203589240 -376.249738287601 +5560 0.5560 8.3413533551079642 -376.306956693199 +5561 0.5561 8.3789868651941095 -376.363245029701 +5562 0.5562 8.4166259576978391 -376.418605044899 +5563 0.5563 8.4542705398742690 -376.473038483700 +5564 0.5564 8.4919205191528935 -376.526547088801 +5565 0.5565 8.5295758031373339 -376.579132600000 +5566 0.5566 8.5672362996050797 -376.630796754900 +5567 0.5567 8.6049019165072451 -376.681541288401 +5568 0.5568 8.6425725619683060 -376.731367932800 +5569 0.5569 8.6802481442858568 -376.780278418200 +5570 0.5570 8.7179285719303525 -376.828274471700 +5571 0.5571 8.7556137535448517 -376.875357818300 +5572 0.5572 8.7933035979447709 -376.921530180101 +5573 0.5573 8.8309980141176254 -376.966793277001 +5574 0.5574 8.8686969112227896 -377.011148826299 +5575 0.5575 8.9064001985912391 -377.054598542700 +5576 0.5576 8.9441077857252935 -377.097144138399 +5577 0.5577 8.9818195822983888 -377.138787323500 +5578 0.5578 9.0195354981547986 -377.179529804700 +5579 0.5579 9.0572554433094030 -377.219373287389 +5580 0.5580 9.0949793279474473 -377.258319473482 +5581 0.5581 9.1327070624242648 -377.296370062870 +5582 0.5582 9.1704385572650491 -377.333526752820 +5583 0.5583 9.2081737231646024 -377.369791238230 +5584 0.5584 9.2459124709870864 -377.405165211461 +5585 0.5585 9.2836547117657808 -377.439650362439 +5586 0.5586 9.3214003567028261 -377.473248378470 +5587 0.5587 9.3591493171689759 -377.505960944529 +5588 0.5588 9.3969015047033650 -377.537789743270 +5589 0.5589 9.4346568310132533 -377.568736454490 +5590 0.5590 9.4724152079737749 -377.598802755951 +5591 0.5591 9.5101765476277045 -377.627990322631 +5592 0.5592 9.5479407621852026 -377.656300827341 +5593 0.5593 9.5857077640235833 -377.683735940269 +5594 0.5594 9.6234774656870581 -377.710297329231 +5595 0.5595 9.6612497798864947 -377.735986659500 +5596 0.5596 9.6990246194991716 -377.760805594040 +5597 0.5597 9.7368018975685349 -377.784755793240 +5598 0.5598 9.7745815273039653 -377.807838915369 +5599 0.5599 9.8123634220805283 -377.830056615880 +5600 0.5600 9.8501474954387263 -377.851410548079 +5601 0.5601 9.8879336610842650 -377.871902362691 +5602 0.5602 9.9257218328878078 -377.891533708171 +5603 0.5603 9.9635119248847364 -377.910306230409 +5604 0.5604 10.0013038512749048 -377.928221572960 +5605 0.5605 10.0390975264224060 -377.945281377069 +5606 0.5606 10.0768928648553260 -377.961487281331 +5607 0.5607 10.1146897812655059 -377.976840922271 +5608 0.5608 10.1524881905083078 -377.991343933780 +5609 0.5609 10.1902880076023674 -378.004997947419 +5610 0.5610 10.2280891477293547 -378.017804592320 +5611 0.5611 10.2658915262337391 -378.029765495370 +5612 0.5612 10.3036950586225533 -378.040882280911 +5613 0.5613 10.3414996605651552 -378.051156571131 +5614 0.5614 10.3793052478929813 -378.060589985380 +5615 0.5615 10.4171117365993133 -378.069184141250 +5616 0.5616 10.4549190428390499 -378.076940653480 +5617 0.5617 10.4927270829284573 -378.083861134679 +5618 0.5618 10.5305357733449441 -378.089947195040 +5619 0.5619 10.5683450307268174 -378.095200442440 +5620 0.5620 10.6061547718730527 -378.099622482270 +5621 0.5621 10.6439649137430532 -378.103214917750 +5622 0.5622 10.6817753734564196 -378.105979349571 +5623 0.5623 10.7195860682927080 -378.107917376190 +5624 0.5624 10.7573969156912082 -378.109030593811 +5625 0.5625 10.7952078332506964 -378.109320595950 +5626 0.5626 10.8330187387292085 -378.108788974299 +5627 0.5627 10.8708295500438084 -378.107437317691 +5628 0.5628 10.9086401852703467 -378.105267213081 +5629 0.5629 10.9464505626432356 -378.102280244701 +5630 0.5630 10.9842606005552099 -378.098477994779 +5631 0.5631 11.0220702175571059 -378.093862043141 +5632 0.5632 11.0598793323576192 -378.088433967121 +5633 0.5633 11.0976878638230776 -378.082195342029 +5634 0.5634 11.1354957309772047 -378.075147740510 +5635 0.5635 11.1733028530008962 -378.067292733329 +5636 0.5636 11.2111091492319908 -378.058631888551 +5637 0.5637 11.2489145391650300 -378.049166772240 +5638 0.5638 11.2867189424510332 -378.038898947831 +5639 0.5639 11.3245222788972679 -378.027829976860 +5640 0.5640 11.3623244684670262 -378.015961418290 +5641 0.5641 11.4001254312793936 -378.003294829041 +5642 0.5642 11.4379250876090133 -377.989831763349 +5643 0.5643 11.4757233578858546 -377.975573773490 +5644 0.5644 11.5135201626950021 -377.960522409450 +5645 0.5645 11.5513154227764154 -377.944679218830 +5646 0.5646 11.5891090590247092 -377.928045747030 +5647 0.5647 11.6269009924889168 -377.910623537120 +5648 0.5648 11.6646911443722701 -377.892414129959 +5649 0.5649 11.7024794360319735 -377.873419064110 +5650 0.5650 11.7402657889789737 -377.853639875901 +5651 0.5651 11.7780501248777369 -377.833078099371 +5652 0.5652 11.8158323655460222 -377.811735266348 +5653 0.5653 11.8536124329546588 -377.789612906379 +5654 0.5654 11.8913902492273174 -377.766712546781 +5655 0.5655 11.9291657366402877 -377.743035712630 +5656 0.5656 11.9669388176222533 -377.718583926689 +5657 0.5657 12.0047094147540676 -377.693358709610 +5658 0.5658 12.0424774507685335 -377.667361579710 +5659 0.5659 12.0802428485501760 -377.640594053149 +5660 0.5660 12.1180055311350223 -377.613057643770 +5661 0.5661 12.1557654217103757 -377.584753863290 +5662 0.5662 12.1935224436145973 -377.555684221130 +5663 0.5663 12.2312765203368770 -377.525850224480 +5664 0.5664 12.2690275755170219 -377.495253378420 +5665 0.5665 12.3067755329452293 -377.463895185721 +5666 0.5666 12.3445203165618622 -377.431777146920 +5667 0.5667 12.3822618504572297 -377.398900760441 +5668 0.5668 12.4200000588713753 -377.365267522480 +5669 0.5669 12.4577348661938494 -377.330878926990 +5670 0.5670 12.4954661969634859 -377.295736465740 +5671 0.5671 12.5331939758681887 -377.259841628320 +5672 0.5672 12.5709181277447115 -377.223195902148 +5673 0.5673 12.6086385775784358 -377.185800772349 +5674 0.5674 12.6463552505031540 -377.147657722020 +5675 0.5675 12.6840680718008549 -377.108768231990 +5676 0.5676 12.7217769669014977 -377.069133780869 +5677 0.5677 12.7594818613827989 -377.028755845140 +5678 0.5678 12.7971826809700122 -376.987635899141 +5679 0.5679 12.8348793515357187 -376.945775414999 +5680 0.5680 12.8725717990996014 -376.903175862672 +5681 0.5681 12.9102599498282320 -376.859838709950 +5682 0.5682 12.9479437300348543 -376.815765422500 +5683 0.5683 12.9856230661791692 -376.770957463781 +5684 0.5684 13.0232978848671141 -376.725416295119 +5685 0.5685 13.0609681128506558 -376.679143375721 +5686 0.5686 13.0986336770275695 -376.632140162570 +5687 0.5687 13.1362945044412260 -376.584408110552 +5688 0.5688 13.1739505222803750 -376.535948672430 +5689 0.5689 13.2116016578789335 -376.486763298750 +5690 0.5690 13.2492478387157711 -376.436853438001 +5691 0.5691 13.2868889924144948 -376.386220536489 +5692 0.5692 13.3245250467432399 -376.334866038420 +5693 0.5693 13.3621559296144525 -376.282791385820 +5694 0.5694 13.3997815690846771 -376.229998018660 +5695 0.5695 13.4374018933543464 -376.176487374740 +5696 0.5696 13.4750168307675704 -376.122260889731 +5697 0.5697 13.5126263098119175 -376.067319997219 +5698 0.5698 13.5502302591182104 -376.011666128650 +5699 0.5699 13.5878286074603132 -375.955300713411 +5700 0.5700 13.6254212837549176 -375.898225178689 +5701 0.5701 13.6630082170613338 -375.840440949651 +5702 0.5702 13.7005893365812810 -375.781949449291 +5703 0.5703 13.7381645716586753 -375.722752098611 +5704 0.5704 13.7757338517794246 -375.662850316381 +5705 0.5705 13.8132971065712109 -375.602245519351 +5706 0.5706 13.8508542658032887 -375.540939122191 +5707 0.5707 13.8884052593862712 -375.478932537450 +5708 0.5708 13.9259500173719246 -375.416227175610 +5709 0.5709 13.9634884699529565 -375.352824445039 +5710 0.5710 14.0010205474628133 -375.288725752091 +5711 0.5711 14.0385461803754676 -375.223932500981 +5712 0.5712 14.0760652993052098 -375.158446093870 +5713 0.5713 14.1135778350064456 -375.092267930859 +5714 0.5714 14.1510837183734868 -375.025399409960 +5715 0.5715 14.1885828804403431 -374.957841927151 +5716 0.5716 14.2260752523805163 -374.889596876301 +5717 0.5717 14.2635607655067957 -374.820665649280 +5718 0.5718 14.3010393512710525 -374.751049635841 +5719 0.5719 14.3385109412640315 -374.680750223721 +5720 0.5720 14.3759754672151487 -374.609768798611 +5721 0.5721 14.4134328609922857 -374.538106744121 +5722 0.5722 14.4508830546015830 -374.465765441841 +5723 0.5723 14.4883259801872395 -374.392746271291 +5724 0.5724 14.5257615700313050 -374.319050610020 +5725 0.5725 14.5631897565534771 -374.244679833431 +5726 0.5726 14.6006104723108976 -374.169635314991 +5727 0.5727 14.6380236499979528 -374.093918426111 +5728 0.5728 14.6754292224460627 -374.017530536090 +5729 0.5729 14.7128271226234837 -373.940473012341 +5730 0.5730 14.7502172836351093 -373.862747220170 +5731 0.5731 14.7875996387222610 -373.784354522879 +5732 0.5732 14.8249741212624908 -373.705296281729 +5733 0.5733 14.8623406647693770 -373.625573856008 +5734 0.5734 14.8996992028923270 -373.545188603000 +5735 0.5735 14.9370496694163712 -373.464141877881 +5736 0.5736 14.9743919982619627 -373.382435033940 +5737 0.5737 15.0117261234847810 -373.300069422441 +5738 0.5738 15.0490519792755322 -373.217046392580 +5739 0.5739 15.0863694999597406 -373.133367291601 +5740 0.5740 15.1236786199975590 -373.049033464760 +5741 0.5741 15.1609792739835623 -372.964046255320 +5742 0.5742 15.1982713966465539 -372.878407004529 +5743 0.5743 15.2355549228493636 -372.792117051649 +5744 0.5744 15.2728297875886483 -372.705177734029 +5745 0.5745 15.3100959259946947 -372.617590386910 +5746 0.5746 15.3473532733312243 -372.529356343670 +5747 0.5747 15.3846017649951907 -372.440476935659 +5748 0.5748 15.4218413365165858 -372.350953492240 +5749 0.5749 15.4590719235582394 -372.260787340840 +5750 0.5750 15.4962934619156254 -372.169979806891 +5751 0.5751 15.5335058875166645 -372.078532213900 +5752 0.5752 15.5707091364215273 -371.986445883360 +5753 0.5753 15.6079031448224370 -371.893722134839 +5754 0.5754 15.6450878490434757 -371.800362285940 +5755 0.5755 15.6822631855403873 -371.706367652301 +5756 0.5756 15.7194290909003822 -371.611739547599 +5757 0.5757 15.7565855018419434 -371.516479283620 +5758 0.5758 15.7937323552146331 -371.420588170160 +5759 0.5759 15.8308695879988939 -371.324067515039 +5760 0.5760 15.8679971373058564 -371.226918624201 +5761 0.5761 15.9051149403771461 -371.129142801610 +5762 0.5762 15.9422229345846933 -371.030741349339 +5763 0.5763 15.9793210574305320 -370.931715567451 +5764 0.5764 16.0164092465466119 -370.832066754139 +5765 0.5765 16.0534874396946030 -370.731796205670 +5766 0.5766 16.0905555747657054 -370.630905216391 +5767 0.5767 16.1276135897804558 -370.529395078640 +5768 0.5768 16.1646614228885355 -370.427267082969 +5769 0.5769 16.2016990123685787 -370.324522517889 +5770 0.5770 16.2387262966279771 -370.221162670110 +5771 0.5771 16.2757432142026985 -370.117188824332 +5772 0.5772 16.3127497037570848 -370.012602263410 +5773 0.5773 16.3497457040836700 -369.907404268281 +5774 0.5774 16.3867311541029785 -369.801596117919 +5775 0.5775 16.4237059928633506 -369.695179089509 +5776 0.5776 16.4606701595407365 -369.588154458239 +5777 0.5777 16.4976235934385187 -369.480523497428 +5778 0.5778 16.5345662339873165 -369.372287478540 +5779 0.5779 16.5714980207447979 -369.263447671090 +5780 0.5780 16.6084188933954913 -369.154005342780 +5781 0.5781 16.6453287917505968 -369.043961759309 +5782 0.5782 16.6822276557477949 -368.933318184640 +5783 0.5783 16.7191154254510650 -368.822075880729 +5784 0.5784 16.7559920410504866 -368.710236107729 +5785 0.5785 16.7928574428620685 -368.597800123889 +5786 0.5786 16.8297115713275431 -368.484769185610 +5787 0.5787 16.8665543670141922 -368.371144547371 +5788 0.5788 16.9033857706146513 -368.256927461829 +5789 0.5789 16.9402057229467324 -368.142119179780 +5790 0.5790 16.9770141649532285 -368.026720950129 +5791 0.5791 17.0138110377017320 -367.910734019930 +5792 0.5792 17.0505962823844470 -367.794159634390 +5793 0.5793 17.0873698403180114 -367.676999036888 +5794 0.5794 17.1241316529432979 -367.559253468860 +5795 0.5795 17.1608816618252398 -367.440924169990 +5796 0.5796 17.1976198086526431 -367.322012378081 +5797 0.5797 17.2343460352380013 -367.202519329070 +5798 0.5798 17.2710602835173077 -367.082446257080 +5799 0.5799 17.3077624955498806 -366.961794394370 +5800 0.5800 17.3444526135181682 -366.840564971411 +5801 0.5801 17.3811305797275750 -366.718759216759 +5802 0.5802 17.4177963366062762 -366.596378357241 +5803 0.5803 17.4544498267050265 -366.473423617750 +5804 0.5804 17.4910909926969858 -366.349896221429 +5805 0.5805 17.5277197773775342 -366.225797389561 +5806 0.5806 17.5643361236640949 -366.101128341619 +5807 0.5807 17.6009399745959385 -365.975890295269 +5808 0.5808 17.6375312733340159 -365.850084466301 +5809 0.5809 17.6741099631607703 -365.723712068781 +5810 0.5810 17.7106759874799558 -365.596774314901 +5811 0.5811 17.7472292898164525 -365.469272415061 +5812 0.5812 17.7837698138160967 -365.341207577851 +5813 0.5813 17.8202975032454916 -365.212581010081 +5814 0.5814 17.8568123019918303 -365.083393916721 +5815 0.5815 17.8933141540627147 -364.953647500939 +5816 0.5816 17.9298030035859703 -364.823342964199 +5817 0.5817 17.9662787948094831 -364.692481506021 +5818 0.5818 18.0027414721009968 -364.561064324229 +5819 0.5819 18.0391909799479500 -364.429092614850 +5820 0.5820 18.0756272629572976 -364.296567572130 +5821 0.5821 18.1120502658553306 -364.163490388521 +5822 0.5822 18.1484599334874872 -364.029862254642 +5823 0.5823 18.1848562108181895 -363.895684359410 +5824 0.5824 18.2212390429306588 -363.760957889950 +5825 0.5825 18.2576083750267344 -363.625684031540 +5826 0.5826 18.2939641524266996 -363.489863967781 +5827 0.5827 18.3303063205691110 -363.353498880460 +5828 0.5828 18.3666348250106140 -363.216589949621 +5829 0.5829 18.4029496114257682 -363.079138353480 +5830 0.5830 18.4392506256068707 -362.941145268551 +5831 0.5831 18.4755378134637773 -362.802611869600 +5832 0.5832 18.5118111210237366 -362.663539329591 +5833 0.5833 18.5480704944312009 -362.523928819710 +5834 0.5834 18.5843158799476598 -362.383781509490 +5835 0.5835 18.6205472239514656 -362.243098566649 +5836 0.5836 18.6567644729376525 -362.101881157101 +5837 0.5837 18.6929675735177625 -361.960130445119 +5838 0.5838 18.7291564724196782 -361.817847593189 +5839 0.5839 18.7653311164874417 -361.675033762062 +5840 0.5840 18.8014914526810806 -361.531690110711 +5841 0.5841 18.8376374280764374 -361.387817796451 +5842 0.5842 18.8737689898649990 -361.243417974809 +5843 0.5843 18.9098860853537190 -361.098491799570 +5844 0.5844 18.9459886619648401 -360.953040422841 +5845 0.5845 18.9820766672357308 -360.807064994950 +5846 0.5846 19.0181500488187041 -360.660566664541 +5847 0.5847 19.0542087544808574 -360.513546578490 +5848 0.5848 19.0902527321038846 -360.366005882050 +5849 0.5849 19.1262819296839197 -360.217945718639 +5850 0.5850 19.1622962953313518 -360.069367229991 +5851 0.5851 19.1982957772706619 -359.920271556201 +5852 0.5852 19.2342803238402524 -359.770659835629 +5853 0.5853 19.2702498834922764 -359.620533204830 +5854 0.5854 19.3062044047924566 -359.469892798741 +5855 0.5855 19.3421438364199254 -359.318739750630 +5856 0.5856 19.3780681271670545 -359.167075191981 +5857 0.5857 19.4139772259392842 -359.014900252589 +5858 0.5858 19.4498710817549458 -358.862216060639 +5859 0.5859 19.4857496437451019 -358.709023742511 +5860 0.5860 19.5216128611533755 -358.555324422980 +5861 0.5861 19.5574606833357763 -358.401119225069 +5862 0.5862 19.5932930597605406 -358.246409270190 +5863 0.5863 19.6291099400079503 -358.091195677980 +5864 0.5864 19.6649112737701728 -357.935479566460 +5865 0.5865 19.7006970108510941 -357.779262051970 +5866 0.5866 19.7364671011661486 -357.622544249090 +5867 0.5867 19.7722214947421442 -357.465327270851 +5868 0.5868 19.8079601417171141 -357.307612228531 +5869 0.5869 19.8436829923401277 -357.149400231760 +5870 0.5870 19.8793899969711383 -356.990692388479 +5871 0.5871 19.9150811060808124 -356.831489804988 +5872 0.5872 19.9507562702503591 -356.671793585931 +5873 0.5873 19.9864154401713705 -356.511604834279 +5874 0.5874 20.0220585666456508 -356.350924651320 +5875 0.5875 20.0576856005850530 -356.189754136720 +5876 0.5876 20.0932964930113123 -356.028094388481 +5877 0.5877 20.1288911950558820 -355.865946502929 +5878 0.5878 20.1644696579597671 -355.703311574800 +5879 0.5879 20.2000318330733641 -355.540190697120 +5880 0.5880 20.2355776718562836 -355.376584961290 +5881 0.5881 20.2711071258772009 -355.212495457081 +5882 0.5882 20.3066201468136853 -355.047923272619 +5883 0.5883 20.3421166864520373 -354.882869494390 +5884 0.5884 20.3775966966871174 -354.717335207220 +5885 0.5885 20.4130601295221972 -354.551321494360 +5886 0.5886 20.4485069370687818 -354.384829437340 +5887 0.5887 20.4839370715464568 -354.217860116170 +5888 0.5888 20.5193504852827218 -354.050414609132 +5889 0.5889 20.5547471307128262 -353.882493992949 +5890 0.5890 20.5901269603796102 -353.714099342700 +5891 0.5891 20.6254899269333372 -353.545231731830 +5892 0.5892 20.6608359831315376 -353.375892232199 +5893 0.5893 20.6961650818388492 -353.206081914010 +5894 0.5894 20.7314771760268464 -353.035801845899 +5895 0.5895 20.7667722187738804 -352.865053094800 +5896 0.5896 20.8020501632649299 -352.693836726199 +5897 0.5897 20.8373109627914310 -352.522153803811 +5898 0.5898 20.8725545707511131 -352.350005389839 +5899 0.5899 20.9077809406478465 -352.177392544862 +5900 0.5900 20.9429900260914792 -352.004316327811 +5901 0.5901 20.9781817807976765 -351.830777796120 +5902 0.5902 21.0133561585877580 -351.656778005530 +5903 0.5903 21.0485131133885481 -351.482318010259 +5904 0.5904 21.0836525992322059 -351.307398862878 +5905 0.5905 21.1187745702560683 -351.132021614389 +5906 0.5906 21.1538789807024976 -350.956187314221 +5907 0.5907 21.1889657849187216 -350.779897010250 +5908 0.5908 21.2240349373566666 -350.603151748630 +5909 0.5909 21.2590863925728044 -350.425952574100 +5910 0.5910 21.2941201052279965 -350.248300529709 +5911 0.5911 21.3291360300873336 -350.070196657029 +5912 0.5912 21.3641341220199834 -349.891641995961 +5913 0.5913 21.3991143359990232 -349.712637584860 +5914 0.5914 21.4340766271012946 -349.533184460570 +5915 0.5915 21.4690209505072360 -349.353283658280 +5916 0.5916 21.5039472615007341 -349.172936211649 +5917 0.5917 21.5388555154689598 -348.992143152840 +5918 0.5918 21.5737456679022195 -348.810905512320 +5919 0.5919 21.6086176743937912 -348.629224319091 +5920 0.5920 21.6434714906397758 -348.447100600610 +5921 0.5921 21.6783070724389404 -348.264535382710 +5922 0.5922 21.7131243756925620 -348.081529689721 +5923 0.5923 21.7479233564042680 -347.898084544409 +5924 0.5924 21.7827039706798864 -347.714200967990 +5925 0.5925 21.8174661747272935 -347.529879980129 +5926 0.5926 21.8522099248562469 -347.345122598959 +5927 0.5927 21.8869351774782501 -347.159929841071 +5928 0.5928 21.9216418891063789 -346.974302721491 +5929 0.5929 21.9563300163551389 -346.788242253730 +5930 0.5930 21.9909995159403131 -346.601749449770 +5931 0.5931 22.0256503446788052 -346.414825320039 +5932 0.5932 22.0602824594884801 -346.227470873460 +5933 0.5933 22.0948958173880214 -346.039687117380 +5934 0.5934 22.1294903754967756 -345.851475057671 +5935 0.5935 22.1640660910345915 -345.662835698640 +5936 0.5936 22.1986229213216788 -345.473770043111 +5937 0.5937 22.2331608237784515 -345.284279092341 +5938 0.5938 22.2676797559253750 -345.094363846099 +5939 0.5939 22.3021796753828099 -344.904025302621 +5940 0.5940 22.3366605398708735 -344.713264458659 +5941 0.5941 22.3711223072092764 -344.522082309390 +5942 0.5942 22.4055649353171731 -344.330479848569 +5943 0.5943 22.4399883822130199 -344.138458068370 +5944 0.5944 22.4743926060144119 -343.946017959460 +5945 0.5945 22.5087775649379367 -343.753160511061 +5946 0.5946 22.5431432172990327 -343.559886710830 +5947 0.5947 22.5774895215118221 -343.366197544980 +5948 0.5948 22.6118164360889793 -343.172093998160 +5949 0.5949 22.6461239196415676 -342.977577053589 +5950 0.5950 22.6804119308788934 -342.782647692950 +5951 0.5951 22.7146804286083643 -342.587306896450 +5952 0.5952 22.7489293717353256 -342.391555642800 +5953 0.5953 22.7831587192629250 -342.195394909220 +5954 0.5954 22.8173684302919568 -341.998825671450 +5955 0.5955 22.8515584640207159 -341.801848903760 +5956 0.5956 22.8857287797448485 -341.604465578921 +5957 0.5957 22.9198793368572069 -341.406676668220 +5958 0.5958 22.9540100948476891 -341.208483141450 +5959 0.5959 22.9881210133031111 -341.009885967000 +5960 0.5960 23.0222120519070472 -340.810886111690 +5961 0.5961 23.0562831704396807 -340.611484540949 +5962 0.5962 23.0903343287776615 -340.411682218690 +5963 0.5963 23.1243654868939643 -340.211480107370 +5964 0.5964 23.1583766048577324 -340.010879167970 +5965 0.5965 23.1923676428341317 -339.809880360050 +5966 0.5966 23.2263385610842157 -339.608484641650 +5967 0.5967 23.2602893199647660 -339.406692969380 +5968 0.5968 23.2942198799281535 -339.204506298380 +5969 0.5969 23.3281302015221925 -339.001925582399 +5970 0.5970 23.3620202453899921 -338.798951773621 +5971 0.5971 23.3958899722698135 -338.595585822830 +5972 0.5972 23.4297393429949246 -338.391828679390 +5973 0.5973 23.4635683184934543 -338.187681291220 +5974 0.5974 23.4973768597882504 -337.983144604710 +5975 0.5975 23.5311649279967305 -337.778219564890 +5976 0.5976 23.5649324843307433 -337.572907115340 +5977 0.5977 23.5986794900964192 -337.367208198150 +5978 0.5978 23.6324059066940286 -337.161123754009 +5979 0.5979 23.6661116956178397 -336.954654722190 +5980 0.5980 23.6997968184559724 -336.747802040491 +5981 0.5981 23.7334612368902604 -336.540566645270 +5982 0.5982 23.7671049126960980 -336.332949471499 +5983 0.5983 23.8007278077423088 -336.124951452730 +5984 0.5984 23.8343298839909963 -335.916573521039 +5985 0.5985 23.8679111034974021 -335.707816607090 +5986 0.5986 23.9014714284097636 -335.498681640160 +5987 0.5987 23.9350108209691754 -335.289169548049 +5988 0.5988 23.9685292435094368 -335.079281257200 +5989 0.5989 24.0020266584569271 -334.869017692619 +5990 0.5990 24.0355030283304529 -334.658379777871 +5991 0.5991 24.0689583157411029 -334.447368435121 +5992 0.5992 24.1023924833921157 -334.235984585160 +5993 0.5993 24.1358054940787383 -334.024229147320 +5994 0.5994 24.1691973106880837 -333.812103039560 +5995 0.5995 24.2025678961989819 -333.599607178410 +5996 0.5996 24.2359172136818550 -333.386742479030 +5997 0.5997 24.2692452262985654 -333.173509855160 +5998 0.5998 24.3025518973022798 -332.959910219120 +5999 0.5999 24.3358371900373278 -332.745944481860 +6000 0.6000 24.3691010679390700 -332.531613552960 +6001 0.6001 24.4023434945337456 -332.316918340540 +6002 0.6002 24.4355644334383406 -332.101859751370 +6003 0.6003 24.4687638483604495 -331.886438690830 +6004 0.6004 24.5019417030981366 -331.670656062940 +6005 0.6005 24.5350979615397975 -331.454512770270 +6006 0.6006 24.5682325876640135 -331.238009714039 +6007 0.6007 24.6013455455394201 -331.021147794110 +6008 0.6008 24.6344367993245719 -330.803927908930 +6009 0.6009 24.6675063132677970 -330.586350955580 +6010 0.6010 24.7005540517070656 -330.368417829770 +6011 0.6011 24.7335799790698445 -330.150129425810 +6012 0.6012 24.7665840598729687 -329.931486636710 +6013 0.6013 24.7995662587225034 -329.712490354010 +6014 0.6014 24.8325265403136015 -329.493141467970 +6015 0.6015 24.8654648694303724 -329.273440867420 +6016 0.6016 24.8983812109457361 -329.053389439850 +6017 0.6017 24.9312755298212991 -328.832988071420 +6018 0.6018 24.9641477911072123 -328.612237646859 +6019 0.6019 24.9969979599420355 -328.391139049590 +6020 0.6020 25.0298260015525997 -328.169693161670 +6021 0.6021 25.0626318812538713 -327.947900863780 +6022 0.6022 25.0954155644488246 -327.725763035290 +6023 0.6023 25.1281770166282961 -327.503280554170 +6024 0.6024 25.1609162033708564 -327.280454297070 +6025 0.6025 25.1936330903426757 -327.057285139291 +6026 0.6026 25.2263276432973775 -326.833773954750 +6027 0.6027 25.2589998280759183 -326.609921616090 +6028 0.6028 25.2916496106064521 -326.385728994580 +6029 0.6029 25.3242769569041855 -326.161196960080 +6030 0.6030 25.3568818330712524 -325.936326381230 +6031 0.6031 25.3894642052965764 -325.711118125249 +6032 0.6032 25.4220240398557422 -325.485573058080 +6033 0.6033 25.4545613031108608 -325.259692044279 +6034 0.6034 25.4870759615104276 -325.033475947080 +6035 0.6035 25.5195679815892014 -324.806925628430 +6036 0.6036 25.5520373299680692 -324.580041948900 +6037 0.6037 25.5844839733539011 -324.352825767770 +6038 0.6038 25.6169078785394397 -324.125277942970 +6039 0.6039 25.6493090124031440 -323.897399331130 +6040 0.6040 25.6816873419090754 -323.669190787530 +6041 0.6041 25.7140428341067597 -323.440653166160 +6042 0.6042 25.7463754561310516 -323.211787319710 +6043 0.6043 25.7786851752020105 -322.982594099490 +6044 0.6044 25.8109719586247621 -322.753074355550 +6045 0.6045 25.8432357737893703 -322.523228936620 +6046 0.6046 25.8754765881707058 -322.293058690120 +6047 0.6047 25.9076943693283184 -322.062564462120 +6048 0.6048 25.9398890849062980 -321.831747097490 +6049 0.6049 25.9720607026331578 -321.600607439680 +6050 0.6050 26.0042091903216850 -321.369146330871 +6051 0.6051 26.0363345158688269 -321.137364612000 +6052 0.6052 26.0684366472555595 -320.905263122660 +6053 0.6053 26.1005155525467494 -320.672842701120 +6054 0.6054 26.1325711998910251 -320.440104184399 +6055 0.6055 26.1646035575206568 -320.207048408240 +6056 0.6056 26.1966125937514214 -319.973676207020 +6057 0.6057 26.2285982769824670 -319.739988413880 +6058 0.6058 26.2605605756961928 -319.505985860670 +6059 0.6059 26.2924994584581242 -319.271669377949 +6060 0.6060 26.3244148939167708 -319.037039794970 +6061 0.6061 26.3563068508035059 -318.802097939730 +6062 0.6062 26.3881752979324418 -318.566844638960 +6063 0.6063 26.4200202042002950 -318.331280718079 +6064 0.6064 26.4518415385862582 -318.095407001210 +6065 0.6065 26.4836392701518797 -317.859224311240 +6066 0.6066 26.5154133680409316 -317.622733469800 +6067 0.6067 26.5471638014792823 -317.385935297200 +6068 0.6068 26.5788905397747648 -317.148830612479 +6069 0.6069 26.6105935523170629 -316.911420233469 +6070 0.6070 26.6422728085775695 -316.673704976660 +6071 0.6071 26.6739282781092690 -316.435685657329 +6072 0.6072 26.7055599305466096 -316.197363089450 +6073 0.6073 26.7371677356053716 -315.958738085790 +6074 0.6074 26.7687516630825506 -315.719811457810 +6075 0.6075 26.8003116828562256 -315.480584015690 +6076 0.6076 26.8318477648854312 -315.241056568439 +6077 0.6077 26.8633598792100408 -315.001229923740 +6078 0.6078 26.8948479959506308 -314.761104888040 +6079 0.6079 26.9263120853083606 -314.520682266550 +6080 0.6080 26.9577521175648478 -314.279962863200 +6081 0.6081 26.9891680630820439 -314.038947480710 +6082 0.6082 27.0205598923021064 -313.797636920520 +6083 0.6083 27.0519275757472748 -313.556031982860 +6084 0.6084 27.0832710840197528 -313.314133466690 +6085 0.6085 27.1145903878015737 -313.071942169730 +6086 0.6086 27.1458854578544830 -312.829458888480 +6087 0.6087 27.1771562650198177 -312.586684418209 +6088 0.6088 27.2084027802183712 -312.343619552880 +6089 0.6089 27.2396249744502796 -312.100265085300 +6090 0.6090 27.2708228187948976 -311.856621807050 +6091 0.6091 27.3019962844106701 -311.612690508390 +6092 0.6092 27.3331453425350119 -311.368471978440 +6093 0.6093 27.3642699644841869 -311.123967005040 +6094 0.6094 27.3953701216531833 -310.879176374860 +6095 0.6095 27.4264457855155896 -310.634100873281 +6096 0.6096 27.4574969276234775 -310.388741284491 +6097 0.6097 27.4885235196072770 -310.143098391480 +6098 0.6098 27.5195255331756492 -309.897172975970 +6099 0.6099 27.5505029401153720 -309.650965818500 +6100 0.6100 27.5814557122912163 -309.404477698400 +6101 0.6101 27.6123838216458246 -309.157709393749 +6102 0.6102 27.6432872401995837 -308.910661681440 +6103 0.6103 27.6741659400505142 -308.663335337150 +6104 0.6104 27.7050198933741392 -308.415731135369 +6105 0.6105 27.7358490724233739 -308.167849849330 +6106 0.6106 27.7666534495283948 -307.919692251090 +6107 0.6107 27.7974329970965250 -307.671259111529 +6108 0.6108 27.8281876876121146 -307.422551200270 +6109 0.6109 27.8589174936364152 -307.173569285770 +6110 0.6110 27.8896223878074672 -306.924314135280 +6111 0.6111 27.9203023428399710 -306.674786514830 +6112 0.6112 27.9509573315251778 -306.424987189310 +6113 0.6113 27.9815873267307609 -306.174916922340 +6114 0.6114 28.0121923014006988 -305.924576476440 +6115 0.6115 28.0427722285551617 -305.673966612851 +6116 0.6116 28.0733270812903868 -305.423088091670 +6117 0.6117 28.1038568327785612 -305.171941671811 +6118 0.6118 28.1343614562677011 -304.920528110970 +6119 0.6119 28.1648409250815348 -304.668848165680 +6120 0.6120 28.1952952126193850 -304.416902591310 +6121 0.6121 28.2257242923560483 -304.164692141990 +6122 0.6122 28.2561281378416851 -303.912217570750 +6123 0.6123 28.2865067227016915 -303.659479629359 +6124 0.6124 28.3168600206365824 -303.406479068480 +6125 0.6125 28.3471880054218843 -303.153216637550 +6126 0.6126 28.3774906509080047 -302.899693084870 +6127 0.6127 28.4077679310201248 -302.645909157560 +6128 0.6128 28.4380198197580789 -302.391865601519 +6129 0.6129 28.4682462911962340 -302.137563161580 +6130 0.6130 28.4984473194833789 -301.883002581319 +6131 0.6131 28.5286228788426044 -301.628184603200 +6132 0.6132 28.5587729435711886 -301.373109968470 +6133 0.6133 28.5888974880404767 -301.117779417290 +6134 0.6134 28.6189964866957709 -300.862193688590 +6135 0.6135 28.6490699140562093 -300.606353520170 +6136 0.6136 28.6791177447146524 -300.350259648711 +6137 0.6137 28.7091399533375693 -300.093912809640 +6138 0.6138 28.7391365146649171 -299.837313737330 +6139 0.6139 28.7691074035100307 -299.580463164970 +6140 0.6140 28.7990525947595053 -299.323361824550 +6141 0.6141 28.8289720633730830 -299.066010447000 +6142 0.6142 28.8588657843835321 -298.808409762010 +6143 0.6143 28.8887337328965437 -298.550560498210 +6144 0.6144 28.9185758840906040 -298.292463383010 +6145 0.6145 28.9483922132168914 -298.034119142741 +6146 0.6146 28.9781826955991555 -297.775528502530 +6147 0.6147 29.0079473066336035 -297.516692186410 +6148 0.6148 29.0376860217887867 -297.257610917261 +6149 0.6149 29.0673988166054933 -296.998285416850 +6150 0.6150 29.0970856666966249 -296.738716405770 +6151 0.6151 29.1267465477470857 -296.478904603480 +6152 0.6152 29.1563814355136763 -296.218850728360 +6153 0.6153 29.1859903058249763 -295.958555497620 +6154 0.6154 29.2155731345812235 -295.698019627320 +6155 0.6155 29.2451298977542109 -295.437243832420 +6156 0.6156 29.2746605713871730 -295.176228826800 +6157 0.6157 29.3041651315946687 -294.914975323110 +6158 0.6158 29.3336435545624710 -294.653484032970 +6159 0.6159 29.3630958165474603 -294.391755666850 +6160 0.6160 29.3925218938775075 -294.129790934099 +6161 0.6161 29.4219217629513565 -293.867590542890 +6162 0.6162 29.4512954002385214 -293.605155200400 +6163 0.6163 29.4806427822791726 -293.342485612600 +6164 0.6164 29.5099638856840230 -293.079582484390 +6165 0.6165 29.5392586871342182 -292.816446519500 +6166 0.6166 29.5685271633812263 -292.553078420659 +6167 0.6167 29.5977692912467276 -292.289478889340 +6168 0.6168 29.6269850476224974 -292.025648626050 +6169 0.6169 29.6561744094703066 -291.761588330121 +6170 0.6170 29.6853373538218008 -291.497298699760 +6171 0.6171 29.7144738577783940 -291.232780432110 +6172 0.6172 29.7435838985111616 -290.968034223220 +6173 0.6173 29.7726674532607234 -290.703060768011 +6174 0.6174 29.8017244993371406 -290.437860760310 +6175 0.6175 29.8307550141197986 -290.172434892870 +6176 0.6176 29.8597589750573071 -289.906783857320 +6177 0.6177 29.8887363596673836 -289.640908344240 +6178 0.6178 29.9176871455367497 -289.374809043050 +6179 0.6179 29.9466113103210070 -289.108486642111 +6180 0.6180 29.9755088317445484 -288.841941828730 +6181 0.6181 30.0043796876004407 -288.575175289089 +6182 0.6182 30.0332238557503075 -288.308187708280 +6183 0.6183 30.0620413141242366 -288.040979770320 +6184 0.6184 30.0908320407206631 -287.773552158180 +6185 0.6185 30.1195960136062553 -287.505905553669 +6186 0.6186 30.1483332109158191 -287.238040637580 +6187 0.6187 30.1770436108521771 -286.969958089610 +6188 0.6188 30.2057271916860763 -286.701658588380 +6189 0.6189 30.2343839317560672 -286.433142811420 +6190 0.6190 30.2630138094683971 -286.164411435210 +6191 0.6191 30.2916168032969146 -285.895465135140 +6192 0.6192 30.3201928917829484 -285.626304585540 +6193 0.6193 30.3487420535352079 -285.356930459660 +6194 0.6194 30.3772642672296733 -285.087343429680 +6195 0.6195 30.4057595116094959 -284.817544166740 +6196 0.6196 30.4342277654848772 -284.547533340859 +6197 0.6197 30.4626690077329734 -284.277311621060 +6198 0.6198 30.4910832172977884 -284.006879675260 +6199 0.6199 30.5194703731900674 -283.736238170321 +6200 0.6200 30.5478304544871868 -283.465387772040 +6201 0.6201 30.5761634403330476 -283.194329145200 +6202 0.6202 30.6044693099379828 -282.923062953470 +6203 0.6203 30.6327480425786298 -282.651589859480 +6204 0.6204 30.6609996175978452 -282.379910524830 +6205 0.6205 30.6892240144045871 -282.108025610040 +6206 0.6206 30.7174212124738197 -281.835935774589 +6207 0.6207 30.7455911913463957 -281.563641676920 +6208 0.6208 30.7737339306289641 -281.291143974430 +6209 0.6209 30.8018494099938565 -281.018443323420 +6210 0.6210 30.8299376091789874 -280.745540379190 +6211 0.6211 30.8579985079877481 -280.472435796000 +6212 0.6212 30.8860320862889033 -280.199130227070 +6213 0.6213 30.9140383240164844 -279.925624324520 +6214 0.6214 30.9420172011696870 -279.651918739510 +6215 0.6215 30.9699686978127673 -279.378014122120 +6216 0.6216 30.9978927940749429 -279.103911121420 +6217 0.6217 31.0257894701502828 -278.829610385380 +6218 0.6218 31.0536587062976039 -278.555112561030 +6219 0.6219 31.0815004828403723 -278.280418294310 +6220 0.6220 31.1093147801665921 -278.005528230100 +6221 0.6221 31.1371015787287142 -277.730443012350 +6222 0.6222 31.1648608590435252 -277.455163283890 +6223 0.6223 31.1925926016920485 -277.179689686550 +6224 0.6224 31.2202967873194339 -276.904022861150 +6225 0.6225 31.2479733966348654 -276.628163447490 +6226 0.6226 31.2756224104114544 -276.352112084320 +6227 0.6227 31.3032438094861405 -276.075869409380 +6228 0.6228 31.3308375747595811 -275.799436059429 +6229 0.6229 31.3584036871960592 -275.522812670140 +6230 0.6230 31.3859421278233768 -275.245999876191 +6231 0.6231 31.4134528777327517 -274.968998311300 +6232 0.6232 31.4409359180787220 -274.691808608090 +6233 0.6233 31.4683912300790354 -274.414431398210 +6234 0.6234 31.4958187950145607 -274.136867312320 +6235 0.6235 31.5232185942291778 -273.859116980040 +6236 0.6236 31.5505906091296815 -273.581181029999 +6237 0.6237 31.5779348211856714 -273.303060089790 +6238 0.6238 31.6052512119294633 -273.024754786020 +6239 0.6239 31.6325397629559788 -272.746265744320 +6240 0.6240 31.6598004559226567 -272.467593589260 +6241 0.6241 31.6870332725493427 -272.188738944440 +6242 0.6242 31.7142381946181864 -271.909702432470 +6243 0.6243 31.7414152039735562 -271.630484674960 +6244 0.6244 31.7685642825219290 -271.351086292480 +6245 0.6245 31.7956854122317871 -271.071507904650 +6246 0.6246 31.8227785751335261 -270.791750130110 +6247 0.6247 31.8498437533193552 -270.511813586450 +6248 0.6248 31.8768809289431942 -270.231698890299 +6249 0.6249 31.9038900842205742 -269.951406657309 +6250 0.6250 31.9308712014285447 -269.670937502110 +6251 0.6251 31.9578242629055680 -269.390292038380 +6252 0.6252 31.9847492510514257 -269.109470878790 +6253 0.6253 32.0116461483271166 -268.828474635000 +6254 0.6254 32.0385149372547531 -268.547303917750 +6255 0.6255 32.0653556004174760 -268.265959336750 +6256 0.6256 32.0921681204593483 -267.984441500750 +6257 0.6257 32.1189524800852624 -267.702751017499 +6258 0.6258 32.1457086620608266 -267.420888493800 +6259 0.6259 32.1724366492122869 -267.138854535429 +6260 0.6260 32.1991364244264204 -266.856649747249 +6261 0.6261 32.2258079706504361 -266.574274733110 +6262 0.6262 32.2524512708918891 -266.291730095880 +6263 0.6263 32.2790663082185603 -266.009016437491 +6264 0.6264 32.3056530657583778 -265.726134358900 +6265 0.6265 32.3322115266993251 -265.443084460040 +6266 0.6266 32.3587416742893268 -265.159867339950 +6267 0.6267 32.3852434918361567 -264.876483596689 +6268 0.6268 32.4117169627073523 -264.592933827260 +6269 0.6269 32.4381620703301081 -264.309218627850 +6270 0.6270 32.4645787981911766 -264.025338593579 +6271 0.6271 32.4909671298367897 -263.741294318640 +6272 0.6272 32.5173270488725379 -263.457086396260 +6273 0.6273 32.5436585389632853 -263.172715418710 +6274 0.6274 32.5699615838330843 -262.888181977320 +6275 0.6275 32.5962361672650687 -262.603486662430 +6276 0.6276 32.6224822731013617 -262.318630063470 +6277 0.6277 32.6486998852429764 -262.033612768860 +6278 0.6278 32.6748889876497230 -261.748435366119 +6279 0.6279 32.7010495643401171 -261.463098441790 +6280 0.6280 32.7271815993912796 -261.177602581490 +6281 0.6281 32.7532850769388446 -260.891948369870 +6282 0.6282 32.7793599811768672 -260.606136390610 +6283 0.6283 32.8054062963577238 -260.320167226500 +6284 0.6284 32.8314240067920196 -260.034041459349 +6285 0.6285 32.8574130968484894 -259.747759670050 +6286 0.6286 32.8833735509539196 -259.461322438510 +6287 0.6287 32.9093053535930338 -259.174730343741 +6288 0.6288 32.9352084893084083 -258.887983963800 +6289 0.6289 32.9610829427003864 -258.601083875790 +6290 0.6290 32.9869286984269721 -258.314030655920 +6291 0.6291 33.0127457412037373 -258.026824879430 +6292 0.6292 33.0385340558037370 -257.739467120599 +6293 0.6293 33.0642936270574097 -257.451957952861 +6294 0.6294 33.0900244398524848 -257.164297948651 +6295 0.6295 33.1157264791338903 -256.876487679490 +6296 0.6296 33.1413997299036609 -256.588527715950 +6297 0.6297 33.1670441772208449 -256.300418627739 +6298 0.6298 33.1926598062014122 -256.012160983570 +6299 0.6299 33.2182466020181550 -255.723755351270 +6300 0.6300 33.2438045499006023 -255.435202297730 +6301 0.6301 33.2693336351349345 -255.146502388930 +6302 0.6302 33.2948338430638771 -254.857656189910 +6303 0.6303 33.3203051590866153 -254.568664264800 +6304 0.6304 33.3457475686586946 -254.279527176830 +6305 0.6305 33.3711610572919497 -253.990245488279 +6306 0.6306 33.3965456105543907 -253.700819760540 +6307 0.6307 33.4219012140701182 -253.411250554071 +6308 0.6308 33.4472278535192444 -253.121538428440 +6309 0.6309 33.4725255146377805 -252.831683942300 +6310 0.6310 33.4977941832175645 -252.541687653340 +6311 0.6311 33.5230338451061485 -252.251550118410 +6312 0.6312 33.5482444862067410 -251.961271893420 +6313 0.6313 33.5734260924780799 -251.670853533390 +6314 0.6314 33.5985786499343675 -251.380295592390 +6315 0.6315 33.6237021446451720 -251.089598623670 +6316 0.6316 33.6487965627353276 -250.798763179480 +6317 0.6317 33.6738618903848632 -250.507789811219 +6318 0.6318 33.6988981138288963 -250.216679069390 +6319 0.6319 33.7239052193575475 -249.925431503591 +6320 0.6320 33.7488831933158551 -249.634047662510 +6321 0.6321 33.7738320221036759 -249.342528093930 +6322 0.6322 33.7987516921756139 -249.050873344800 +6323 0.6323 33.8236421900409070 -248.759083961089 +6324 0.6324 33.8485035022633554 -248.467160487900 +6325 0.6325 33.8733356154612224 -248.175103469490 +6326 0.6326 33.8981385163071565 -247.882913449201 +6327 0.6327 33.9229121915280913 -247.590590969440 +6328 0.6328 33.9476566279051539 -247.298136571771 +6329 0.6329 33.9723718122735860 -247.005550796890 +6330 0.6330 33.9970577315226592 -246.712834184540 +6331 0.6331 34.0217143725955680 -246.419987273630 +6332 0.6332 34.0463417224893590 -246.127010602210 +6333 0.6333 34.0709397682548385 -245.833904707360 +6334 0.6334 34.0955084969964730 -245.540670125390 +6335 0.6335 34.1200478958723252 -245.247307391610 +6336 0.6336 34.1445579520939333 -244.953817040560 +6337 0.6337 34.1690386529262540 -244.660199605841 +6338 0.6338 34.1934899856875560 -244.366455620170 +6339 0.6339 34.2179119377493350 -244.072585615460 +6340 0.6340 34.2423044965362422 -243.778590122670 +6341 0.6341 34.2666676495259708 -243.484469671930 +6342 0.6342 34.2910013842491921 -243.190224792480 +6343 0.6343 34.3153056882894489 -242.895856012720 +6344 0.6344 34.3395805492830917 -242.601363860130 +6345 0.6345 34.3638259549191645 -242.306748861371 +6346 0.6346 34.3880418929393414 -242.012011542221 +6347 0.6347 34.4122283511378342 -241.717152427580 +6348 0.6348 34.4363853173612853 -241.422172041500 +6349 0.6349 34.4605127795087185 -241.127070907170 +6350 0.6350 34.4846107255314251 -240.831849546910 +6351 0.6351 34.5086791434328788 -240.536508482150 +6352 0.6352 34.5327180212686642 -240.241048233540 +6353 0.6353 34.5567273471463849 -239.945469320820 +6354 0.6354 34.5807071092255711 -239.649772262840 +6355 0.6355 34.6046572957175940 -239.353957577650 +6356 0.6356 34.6285778948856020 -239.058025782450 +6357 0.6357 34.6524688950444002 -238.761977393549 +6358 0.6358 34.6763302845604002 -238.465812926400 +6359 0.6359 34.7001620518514997 -238.169532895659 +6360 0.6360 34.7239641853870324 -237.873137815060 +6361 0.6361 34.7477366736876618 -237.576628197560 +6362 0.6362 34.7714795053253027 -237.280004555209 +6363 0.6363 34.7951926689230291 -236.983267399250 +6364 0.6364 34.8188761531549957 -236.686417240050 +6365 0.6365 34.8425299467463603 -236.389454587170 +6366 0.6366 34.8661540384731836 -236.092379949299 +6367 0.6367 34.8897484171623660 -235.795193834280 +6368 0.6368 34.9133130716915403 -235.497896749151 +6369 0.6369 34.9368479909890013 -235.200489200080 +6370 0.6370 34.9603531640336271 -234.902971692391 +6371 0.6371 34.9838285798547801 -234.605344730600 +6372 0.6372 35.0072742275322284 -234.307608818360 +6373 0.6373 35.0306900961960750 -234.009764458519 +6374 0.6374 35.0540761750266512 -233.711812153050 +6375 0.6375 35.0774324532544597 -233.413752403130 +6376 0.6376 35.1007589201600680 -233.115585709090 +6377 0.6377 35.1240555650740447 -232.817312570441 +6378 0.6378 35.1473223773768595 -232.518933485850 +6379 0.6379 35.1705593464988127 -232.220448953160 +6380 0.6380 35.1937664619199424 -231.921859469400 +6381 0.6381 35.2169437131699539 -231.623165530760 +6382 0.6382 35.2400910898281197 -231.324367632600 +6383 0.6383 35.2632085815232230 -231.025466269460 +6384 0.6384 35.2862961779334512 -230.726461935100 +6385 0.6385 35.3093538687863244 -230.427355122421 +6386 0.6386 35.3323816438586178 -230.128146323460 +6387 0.6387 35.3553794929762688 -229.828836029520 +6388 0.6388 35.3783474060142993 -229.529424731040 +6389 0.6389 35.4012853728967372 -229.229912917670 +6390 0.6390 35.4241933835965312 -228.930301078180 +6391 0.6391 35.4470714281354731 -228.630589700610 +6392 0.6392 35.4699194965841116 -228.330779272160 +6393 0.6393 35.4927375790616750 -228.030870279161 +6394 0.6394 35.5155256657359928 -227.730863207210 +6395 0.6395 35.5382837468234101 -227.430758541071 +6396 0.6396 35.5610118125886956 -227.130556764670 +6397 0.6397 35.5837098533449847 -226.830258361150 +6398 0.6398 35.6063778594536871 -226.529863812880 +6399 0.6399 35.6290158213244013 -226.229373601340 +6400 0.6400 35.6516237294148297 -225.928788207280 +6401 0.6401 35.6742015742307217 -225.628108110610 +6402 0.6402 35.6967493463257739 -225.327333790490 +6403 0.6403 35.7192670363015594 -225.026465725180 +6404 0.6404 35.7417546348074282 -224.725504392241 +6405 0.6405 35.7642121325404574 -224.424450268380 +6406 0.6406 35.7866395202453518 -224.123303829540 +6407 0.6407 35.8090367887143728 -223.822065550819 +6408 0.6408 35.8314039287872390 -223.520735906571 +6409 0.6409 35.8537409313510835 -223.219315370320 +6410 0.6410 35.8760477873403403 -222.917804414819 +6411 0.6411 35.8983244877366801 -222.616203512030 +6412 0.6412 35.9205710235689395 -222.314513133110 +6413 0.6413 35.9427873859130145 -222.012733748420 +6414 0.6414 35.9649735658918104 -221.710865827539 +6415 0.6415 35.9871295546751497 -221.408909839300 +6416 0.6416 36.0092553434797011 -221.106866251700 +6417 0.6417 36.0313509235688798 -220.804735531940 +6418 0.6418 36.0534162862527978 -220.502518146481 +6419 0.6419 36.0754514228881717 -220.200214560979 +6420 0.6420 36.0974563248782374 -219.897825240300 +6421 0.6421 36.1194309836726788 -219.595350648560 +6422 0.6422 36.1413753907675570 -219.292791249060 +6423 0.6423 36.1632895377052250 -218.990147504320 +6424 0.6424 36.1851734160742495 -218.687419876120 +6425 0.6425 36.2070270175093256 -218.384608825439 +6426 0.6426 36.2288503336912200 -218.081714812490 +6427 0.6427 36.2506433563466786 -217.778738296670 +6428 0.6428 36.2724060772483483 -217.475679736670 +6429 0.6429 36.2941384882146991 -217.172539590360 +6430 0.6430 36.3158405811099598 -216.869318314860 +6431 0.6431 36.3375123478440258 -216.566016366521 +6432 0.6432 36.3591537803723952 -216.262634200881 +6433 0.6433 36.3807648706960762 -215.959172272790 +6434 0.6434 36.4023456108615306 -215.655631036270 +6435 0.6435 36.4238959929605741 -215.352010944590 +6436 0.6436 36.4454160091303194 -215.048312450260 +6437 0.6437 36.4669056515530841 -214.744536005040 +6438 0.6438 36.4883649124563334 -214.440682059881 +6439 0.6439 36.5097937841125812 -214.136751065030 +6440 0.6440 36.5311922588393259 -213.832743469930 +6441 0.6441 36.5525603289989860 -213.528659723290 +6442 0.6442 36.5738979869988015 -213.224500273030 +6443 0.6443 36.5952052252907691 -212.920265566370 +6444 0.6444 36.6164820363715720 -212.615956049700 +6445 0.6445 36.6377284127824936 -212.311572168720 +6446 0.6446 36.6589443471093475 -212.007114368320 +6447 0.6447 36.6801298319823985 -211.702583092700 +6448 0.6448 36.7012848600762922 -211.397978785210 +6449 0.6449 36.7224094241099834 -211.093301888570 +6450 0.6450 36.7435035168466442 -210.788552844660 +6451 0.6451 36.7645671310936066 -210.483732094660 +6452 0.6452 36.7856002597022851 -210.178840078950 +6453 0.6453 36.8066028955680906 -209.873877237220 +6454 0.6454 36.8275750316303743 -209.568844008390 +6455 0.6455 36.8485166608723276 -209.263740830620 +6456 0.6456 36.8694277763209257 -208.958568141340 +6457 0.6457 36.8903083710468565 -208.653326377241 +6458 0.6458 36.9111584381644349 -208.348015974270 +6459 0.6459 36.9319779708315323 -208.042637367630 +6460 0.6460 36.9527669622495054 -207.737190991790 +6461 0.6461 36.9735254056631177 -207.431677280470 +6462 0.6462 36.9942532943604760 -207.126096666640 +6463 0.6463 37.0149506216729378 -206.820449582580 +6464 0.6464 37.0356173809750544 -206.514736459790 +6465 0.6465 37.0562535656844929 -206.208957729041 +6466 0.6466 37.0768591692619651 -205.903113820380 +6467 0.6467 37.0974341852111422 -205.597205163151 +6468 0.6468 37.1179786070785980 -205.291232185900 +6469 0.6469 37.1384924284537163 -204.985195316490 +6470 0.6470 37.1589756429686418 -204.679094982050 +6471 0.6471 37.1794282442981938 -204.372931608949 +6472 0.6472 37.1998502261597821 -204.066705622859 +6473 0.6473 37.2202415823133634 -203.760417448740 +6474 0.6474 37.2406023065613425 -203.454067510790 +6475 0.6475 37.2609323927485079 -203.147656232491 +6476 0.6476 37.2812318347619609 -202.841184036600 +6477 0.6477 37.3015006265310518 -202.534651345180 +6478 0.6478 37.3217387620272874 -202.228058579540 +6479 0.6479 37.3419462352642810 -201.921406160280 +6480 0.6480 37.3621230402976607 -201.614694507280 +6481 0.6481 37.3822691712250119 -201.307924039690 +6482 0.6482 37.4023846221857923 -201.001095175960 +6483 0.6483 37.4224693873612821 -200.694208333811 +6484 0.6484 37.4425234609744848 -200.387263930280 +6485 0.6485 37.4625468372900770 -200.080262381611 +6486 0.6486 37.4825395106143304 -199.773204103441 +6487 0.6487 37.5025014752950341 -199.466089510600 +6488 0.6488 37.5224327257214298 -199.158919017270 +6489 0.6489 37.5423332563241345 -198.851693036891 +6490 0.6490 37.5622030615750901 -198.544411982190 +6491 0.6491 37.5820421359874572 -198.237076265210 +6492 0.6492 37.6018504741155795 -197.929686297250 +6493 0.6493 37.6216280705548911 -197.622242488960 +6494 0.6494 37.6413749199418461 -197.314745250210 +6495 0.6495 37.6610910169538684 -197.007194990230 +6496 0.6496 37.6807763563092522 -196.699592117500 +6497 0.6497 37.7004309327671194 -196.391937039850 +6498 0.6498 37.7200547411273277 -196.084230164341 +6499 0.6499 37.7396477762304130 -195.776471897370 +6500 0.6500 37.7592100329575118 -195.468662644640 +6501 0.6501 37.7787415062303040 -195.160802811140 +6502 0.6502 37.7982421910109210 -194.852892801190 +6503 0.6503 37.8177120823018953 -194.544933018360 +6504 0.6504 37.8371511751460901 -194.236923865560 +6505 0.6505 37.8565594646266206 -193.928865745000 +6506 0.6506 37.8759369458667834 -193.620759058220 +6507 0.6507 37.8952836140299922 -193.312604206010 +6508 0.6508 37.9145994643197213 -193.004401588500 +6509 0.6509 37.9338844919794056 -192.696151605151 +6510 0.6510 37.9531386922923986 -192.387854654690 +6511 0.6511 37.9723620605818937 -192.079511135190 +6512 0.6512 37.9915545922108535 -191.771121444011 +6513 0.6513 38.0107162825819458 -191.462685977850 +6514 0.6514 38.0298471271374723 -191.154205132681 +6515 0.6515 38.0489471213592978 -190.845679303820 +6516 0.6516 38.0680162607687862 -190.537108885920 +6517 0.6517 38.0870545409267294 -190.228494272890 +6518 0.6518 38.1060619574332762 -189.919835858010 +6519 0.6519 38.1250385059278685 -189.611134033859 +6520 0.6520 38.1439841820891772 -189.302389192320 +6521 0.6521 38.1628989816350241 -188.993601724620 +6522 0.6522 38.1817829003223181 -188.684772021300 +6523 0.6523 38.2006359339469981 -188.375900472230 +6524 0.6524 38.2194580783439406 -188.066987466560 +6525 0.6525 38.2382493293869103 -187.758033392840 +6526 0.6526 38.2570096829884960 -187.449038638870 +6527 0.6527 38.2757391351000322 -187.140003591850 +6528 0.6528 38.2944376817115355 -186.830928638210 +6529 0.6529 38.3131053188516333 -186.521814163811 +6530 0.6530 38.3317420425875142 -186.212660553790 +6531 0.6531 38.3503478490248355 -185.903468192580 +6532 0.6532 38.3689227343076666 -185.594237464020 +6533 0.6533 38.3874666946184320 -185.284968751250 +6534 0.6534 38.4059797261778328 -184.975662436700 +6535 0.6535 38.4244618252447765 -184.666318902190 +6536 0.6536 38.4429129881163263 -184.356938528870 +6537 0.6537 38.4613332111276307 -184.047521697200 +6538 0.6538 38.4797224906518380 -183.738068786960 +6539 0.6539 38.4980808231000537 -183.428580177320 +6540 0.6540 38.5164082049212553 -183.119056246750 +6541 0.6541 38.5347046326022493 -182.809497373079 +6542 0.6542 38.5529701026675724 -182.499903933441 +6543 0.6543 38.5712046116794625 -182.190276304380 +6544 0.6544 38.5894081562377664 -181.880614861700 +6545 0.6545 38.6075807329798835 -181.570919980581 +6546 0.6546 38.6257223385806938 -181.261192035580 +6547 0.6547 38.6438329697525020 -180.951431400550 +6548 0.6548 38.6619126232449659 -180.641638448720 +6549 0.6549 38.6799612958450325 -180.331813552630 +6550 0.6550 38.6979789843768742 -180.021957084220 +6551 0.6551 38.7159656857018248 -179.712069414730 +6552 0.6552 38.7339213967183014 -179.402150914781 +6553 0.6553 38.7518461143617543 -179.092201954310 +6554 0.6554 38.7697398356046037 -178.782222902630 +6555 0.6555 38.7876025574561538 -178.472214128430 +6556 0.6556 38.8054342769625578 -178.162175999680 +6557 0.6557 38.8232349912067320 -177.852108883781 +6558 0.6558 38.8410046973082927 -177.542013147430 +6559 0.6559 38.8587433924234986 -177.231889156710 +6560 0.6560 38.8764510737451872 -176.921737277050 +6561 0.6561 38.8941277385027036 -176.611557873250 +6562 0.6562 38.9117733839618367 -176.301351309449 +6563 0.6563 38.9293880074247625 -175.991117949130 +6564 0.6564 38.9469716062299796 -175.680858155200 +6565 0.6565 38.9645241777522315 -175.370572289869 +6566 0.6566 38.9820457194024641 -175.060260714720 +6567 0.6567 38.9995362286277327 -174.749923790680 +6568 0.6568 39.0169957029111742 -174.439561878110 +6569 0.6569 39.0344241397719145 -174.129175336670 +6570 0.6570 39.0518215367650185 -173.818764525380 +6571 0.6571 39.0691878914814197 -173.508329802660 +6572 0.6572 39.0865232015478696 -173.197871526310 +6573 0.6573 39.1038274646268604 -172.887390053440 +6574 0.6574 39.1211006784165605 -172.576885740560 +6575 0.6575 39.1383428406507647 -172.266358943580 +6576 0.6576 39.1555539490988309 -171.955810017750 +6577 0.6577 39.1727340015656011 -171.645239317660 +6578 0.6578 39.1898829958913524 -171.334647197340 +6579 0.6579 39.2070009299517253 -171.024034010130 +6580 0.6580 39.2240878016576744 -170.713400108800 +6581 0.6581 39.2411436089553831 -170.402745845440 +6582 0.6582 39.2581683498262350 -170.092071571570 +6583 0.6583 39.2751620222867146 -169.781377638021 +6584 0.6584 39.2921246243883715 -169.470664395070 +6585 0.6585 39.3090561542177426 -169.159932192330 +6586 0.6586 39.3259566098963020 -168.849181378830 +6587 0.6587 39.3428259895803905 -168.538412302901 +6588 0.6588 39.3596642914611508 -168.227625312360 +6589 0.6589 39.3764715137644856 -167.916820754310 +6590 0.6590 39.3932476547509651 -167.605998975310 +6591 0.6591 39.4099927127157912 -167.295160321270 +6592 0.6592 39.4267066859887265 -166.984305137480 +6593 0.6593 39.4433895729340307 -166.673433768600 +6594 0.6594 39.4600413719503962 -166.362546558740 +6595 0.6595 39.4766620814708986 -166.051643851310 +6596 0.6596 39.4932516999629257 -165.740725989210 +6597 0.6597 39.5098102259281134 -165.429793314610 +6598 0.6598 39.5263376579023031 -165.118846169170 +6599 0.6599 39.5428339944554565 -164.807884893880 +6600 0.6600 39.5592992341916059 -164.496909829150 +6601 0.6601 39.5757333757488041 -164.185921314780 +6602 0.6602 39.5921364177990398 -163.874919689940 +6603 0.6603 39.6085083590482014 -163.563905293230 +6604 0.6604 39.6248491982359923 -163.252878462599 +6605 0.6605 39.6411589341358948 -162.941839535450 +6606 0.6606 39.6574375655550924 -162.630788848520 +6607 0.6607 39.6736850913344199 -162.319726737990 +6608 0.6608 39.6899015103482924 -162.008653539420 +6609 0.6609 39.7060868215046554 -161.697569587770 +6610 0.6610 39.7222410237449139 -161.386475217390 +6611 0.6611 39.7383641160438827 -161.075370762050 +6612 0.6612 39.7544560974097294 -160.764256554909 +6613 0.6613 39.7705169668839034 -160.453132928530 +6614 0.6614 39.7865467235410719 -160.142000214881 +6615 0.6615 39.8025453664890847 -159.830858745330 +6616 0.6616 39.8185128948688813 -159.519708850640 +6617 0.6617 39.8344493078544630 -159.208550861030 +6618 0.6618 39.8503546046528143 -158.897385106050 +6619 0.6619 39.8662287845038534 -158.586211914710 +6620 0.6620 39.8820718466803612 -158.275031615410 +6621 0.6621 39.8978837904879313 -157.963844535951 +6622 0.6622 39.9136646152649064 -157.652651003560 +6623 0.6623 39.9294143203823282 -157.341451344900 +6624 0.6624 39.9451329052438737 -157.030245885951 +6625 0.6625 39.9608203692857842 -156.719034952210 +6626 0.6626 39.9764767119768223 -156.407818868520 +6627 0.6627 39.9921019328182084 -156.096597959199 +6628 0.6628 40.0076960313435634 -155.785372547890 +6629 0.6629 40.0232590071188454 -155.474142957740 +6630 0.6630 40.0387908597422992 -155.162909511280 +6631 0.6631 40.0542915888443858 -154.851672530440 +6632 0.6632 40.0697611940877394 -154.540432336570 +6633 0.6633 40.0851996751670896 -154.229189250470 +6634 0.6634 40.1006070318092327 -153.917943592350 +6635 0.6635 40.1159832637729394 -153.606695681779 +6636 0.6636 40.1313283708489195 -153.295445837840 +6637 0.6637 40.1466423528597645 -152.984194379010 +6638 0.6638 40.1619252096598700 -152.672941623140 +6639 0.6639 40.1771769411354072 -152.361687887550 +6640 0.6640 40.1923975472042372 -152.050433488990 +6641 0.6641 40.2075870278158689 -151.739178743600 +6642 0.6642 40.2227453829513948 -151.427923966950 +6643 0.6643 40.2378726126234483 -151.116669474100 +6644 0.6644 40.2529687168761257 -150.805415579450 +6645 0.6645 40.2680336957849434 -150.494162596860 +6646 0.6646 40.2830675494567672 -150.182910839650 +6647 0.6647 40.2980702780297761 -149.871660620551 +6648 0.6648 40.3130418816733922 -149.560412251700 +6649 0.6649 40.3279823605882086 -149.249166044680 +6650 0.6650 40.3428917150059689 -148.937922310550 +6651 0.6651 40.3577699451894816 -148.626681359729 +6652 0.6652 40.3726170514325773 -148.315443502120 +6653 0.6653 40.3874330340600380 -148.004209047030 +6654 0.6654 40.4022178934275544 -147.692978303250 +6655 0.6655 40.4169716299216617 -147.381751578930 +6656 0.6656 40.4316942439596971 -147.070529181729 +6657 0.6657 40.4463857359897219 -146.759311418720 +6658 0.6658 40.4610461064904783 -146.448098596410 +6659 0.6659 40.4756753559713331 -146.136891020720 +6660 0.6660 40.4902734849722208 -145.825688997060 +6661 0.6661 40.5048404940635862 -145.514492830270 +6662 0.6662 40.5193763838463283 -145.203302824591 +6663 0.6663 40.5338811549517430 -144.892119283770 +6664 0.6664 40.5483548080414806 -144.580942510930 +6665 0.6665 40.5627973438074605 -144.269772808701 +6666 0.6666 40.5772087629718499 -143.958610479100 +6667 0.6667 40.5915890662869856 -143.647455823640 +6668 0.6668 40.6059382545353316 -143.336309143259 +6669 0.6669 40.6202563285294076 -143.025170738330 +6670 0.6670 40.6345432891117611 -142.714040908700 +6671 0.6671 40.6487991371548745 -142.402919953621 +6672 0.6672 40.6630238735611513 -142.091808171870 +6673 0.6673 40.6772174992628237 -141.780705861600 +6674 0.6674 40.6913800152219238 -141.469613320450 +6675 0.6675 40.7055114224302201 -141.158530845500 +6676 0.6676 40.7196117219091605 -140.847458733289 +6677 0.6677 40.7336809147098151 -140.536397279820 +6678 0.6678 40.7477190019128344 -140.225346780530 +6679 0.6679 40.7617259846283773 -139.914307530320 +6680 0.6680 40.7757018639960691 -139.603279823549 +6681 0.6681 40.7896466411849445 -139.292263954020 +6682 0.6682 40.8035603173933978 -138.981260215040 +6683 0.6683 40.8174428938491118 -138.670268899269 +6684 0.6684 40.8312943718090224 -138.359290298950 +6685 0.6685 40.8451147525592546 -138.048324705710 +6686 0.6686 40.8589040374150727 -137.737372410660 +6687 0.6687 40.8726622277208236 -137.426433704360 +6688 0.6688 40.8863893248498869 -137.115508876840 +6689 0.6689 40.9000853302046110 -136.804598217610 +6690 0.6690 40.9137502452162707 -136.493702015610 +6691 0.6691 40.9273840713450170 -136.182820559270 +6692 0.6692 40.9409868100798064 -135.871954136450 +6693 0.6693 40.9545584629383583 -135.561103034540 +6694 0.6694 40.9680990314670979 -135.250267540320 +6695 0.6695 40.9816085172411206 -134.939447940100 +6696 0.6696 40.9950869218641074 -134.628644519610 +6697 0.6697 41.0085342469682885 -134.317857564080 +6698 0.6698 41.0219504942144013 -134.007087358200 +6699 0.6699 41.0353356652916190 -133.696334186150 +6700 0.6700 41.0486897619175011 -133.385598331530 +6701 0.6701 41.0620127858379504 -133.074880077430 +6702 0.6702 41.0753047388271426 -132.764179706480 +6703 0.6703 41.0885656226875042 -132.453497500690 +6704 0.6704 41.1017954392496137 -132.142833741560 +6705 0.6705 41.1149941903722009 -131.832188710140 +6706 0.6706 41.1281618779420484 -131.521562686860 +6707 0.6707 41.1412985038739762 -131.210955951699 +6708 0.6708 41.1544040701107647 -130.900368784050 +6709 0.6709 41.1674785786231112 -130.589801462830 +6710 0.6710 41.1805220314095735 -130.279254266420 +6711 0.6711 41.1935344304965270 -129.968727472680 +6712 0.6712 41.2065157779381082 -129.658221358930 +6713 0.6713 41.2194660758161575 -129.347736202030 +6714 0.6714 41.2323853262401698 -129.037272278240 +6715 0.6715 41.2452735313472516 -128.726829863350 +6716 0.6716 41.2581306933020500 -128.416409232650 +6717 0.6717 41.2709568142967242 -128.106010660880 +6718 0.6718 41.2837518965508821 -127.795634422239 +6719 0.6719 41.2965159423115153 -127.485280790470 +6720 0.6720 41.3092489538529790 -127.174950038790 +6721 0.6721 41.3219509334769128 -126.864642439870 +6722 0.6722 41.3346218835121988 -126.554358265880 +6723 0.6723 41.3472618063149184 -126.244097788500 +6724 0.6724 41.3598707042682889 -125.933861278890 +6725 0.6725 41.3724485797826134 -125.623649007650 +6726 0.6726 41.3849954352952452 -125.313461244949 +6727 0.6727 41.3975112732705099 -125.003298260400 +6728 0.6728 41.4099960961996842 -124.693160323120 +6729 0.6729 41.4224499066009244 -124.383047701710 +6730 0.6730 41.4348727070192240 -124.072960664271 +6731 0.6731 41.4472645000263569 -123.762899478380 +6732 0.6732 41.4596252882208347 -123.452864411151 +6733 0.6733 41.4719550742278500 -123.142855729140 +6734 0.6734 41.4842538606992264 -122.832873698439 +6735 0.6735 41.4965216503133760 -122.522918584620 +6736 0.6736 41.5087584457752428 -122.212990652730 +6737 0.6737 41.5209642498162452 -121.903090167370 +6738 0.6738 41.5331390651942414 -121.593217392590 +6739 0.6739 41.5452828946934645 -121.283372591940 +6740 0.6740 41.5573957411244876 -120.973556028520 +6741 0.6741 41.5694776073241599 -120.663767964870 +6742 0.6742 41.5815284961555562 -120.354008663070 +6743 0.6743 41.5935484105079425 -120.044278384679 +6744 0.6744 41.6055373532967181 -119.734577390780 +6745 0.6745 41.6174953274633523 -119.424905941950 +6746 0.6746 41.6294223359753630 -119.115264298251 +6747 0.6747 41.6413183818262382 -118.805652719270 +6748 0.6748 41.6531834680354081 -118.496071464110 +6749 0.6749 41.6650175976481805 -118.186520791370 +6750 0.6750 41.6768207737357059 -117.877000959131 +6751 0.6751 41.6885929993949134 -117.567512225020 +6752 0.6752 41.7003342777484747 -117.258054846170 +6753 0.6753 41.7120446119447408 -116.948629079170 +6754 0.6754 41.7237240051577061 -116.639235180180 +6755 0.6755 41.7353724605869587 -116.329873404860 +6756 0.6756 41.7469899814576166 -116.020544008340 +6757 0.6757 41.7585765710202992 -115.711247245310 +6758 0.6758 41.7701322325510631 -115.401983369959 +6759 0.6759 41.7816569693513600 -115.092752635979 +6760 0.6760 41.7931507847479864 -114.783555296560 +6761 0.6761 41.8046136820930343 -114.474391604450 +6762 0.6762 41.8160456647638483 -114.165261811881 +6763 0.6763 41.8274467361629689 -113.856166170600 +6764 0.6764 41.8388168997180969 -113.547104931890 +6765 0.6765 41.8501561588820223 -113.238078346561 +6766 0.6766 41.8614645171325961 -112.929086664870 +6767 0.6767 41.8727419779726731 -112.620130136690 +6768 0.6768 41.8839885449300766 -112.311209011340 +6769 0.6769 41.8952042215575275 -112.002323537690 +6770 0.6770 41.9063890114326156 -111.693473964130 +6771 0.6771 41.9175429181577499 -111.384660538580 +6772 0.6772 41.9286659453601018 -111.075883508461 +6773 0.6773 41.9397580966915626 -110.767143120700 +6774 0.6774 41.9508193758286865 -110.458439621801 +6775 0.6775 41.9618497864726621 -110.149773257770 +6776 0.6776 41.9728493323492557 -109.841144274120 +6777 0.6777 41.9838180172087547 -109.532552915880 +6778 0.6778 41.9947558448259315 -109.223999427650 +6779 0.6779 42.0056628189999941 -108.915484053550 +6780 0.6780 42.0165389435545293 -108.607007037171 +6781 0.6781 42.0273842223374743 -108.298568621690 +6782 0.6782 42.0381986592210453 -107.990169049800 +6783 0.6783 42.0489822581017236 -107.681808563710 +6784 0.6784 42.0597350229001634 -107.373487405151 +6785 0.6785 42.0704569575611913 -107.065205815440 +6786 0.6786 42.0811480660537285 -106.756964035350 +6787 0.6787 42.0918083523707551 -106.448762305230 +6788 0.6788 42.1024378205292678 -106.140600864960 +6789 0.6789 42.1130364745702153 -105.832479953940 +6790 0.6790 42.1236043185584705 -105.524399811120 +6791 0.6791 42.1341413565827736 -105.216360674970 +6792 0.6792 42.1446475927556961 -104.908362783510 +6793 0.6793 42.1551230312135843 -104.600406374269 +6794 0.6794 42.1655676761165168 -104.292491684350 +6795 0.6795 42.1759815316482545 -103.984618950360 +6796 0.6796 42.1863646020161980 -103.676788408460 +6797 0.6797 42.1967168914513380 -103.369000294359 +6798 0.6798 42.2070384042082196 -103.061254843280 +6799 0.6799 42.2173291445648857 -102.753552290020 +6800 0.6800 42.2275891168228341 -102.445892868880 +6801 0.6801 42.2378183253069608 -102.138276813710 +6802 0.6802 42.2480167743655457 -101.830704357930 +6803 0.6803 42.2581844683701675 -101.523175734500 +6804 0.6804 42.2683214117156894 -101.215691175870 +6805 0.6805 42.2784276088201878 -100.908250914081 +6806 0.6806 42.2885030641249244 -100.600855180720 +6807 0.6807 42.2985477820943032 -100.293504206909 +6808 0.6808 42.3085617672158136 -99.986198223300 +6809 0.6809 42.3185450239999881 -99.678937460119 +6810 0.6810 42.3284975569803521 -99.371722147120 +6811 0.6811 42.3384193707133889 -99.064552513610 +6812 0.6812 42.3483104697784896 -98.757428788450 +6813 0.6813 42.3581708587779104 -98.450351200030 +6814 0.6814 42.3680005423367305 -98.143319976330 +6815 0.6815 42.3777995251027875 -97.836335344849 +6816 0.6816 42.3875678117466634 -97.529397532620 +6817 0.6817 42.3973054069616069 -97.222506766290 +6818 0.6818 42.4070123154635183 -96.915663271990 +6819 0.6819 42.4166885419908866 -96.608867275420 +6820 0.6820 42.4263340913047529 -96.302119001890 +6821 0.6821 42.4359489681886544 -95.995418676201 +6822 0.6822 42.4455331774486027 -95.688766522710 +6823 0.6823 42.4550867239130056 -95.382162765380 +6824 0.6824 42.4646096124326604 -95.075607627670 +6825 0.6825 42.4741018478806751 -94.769101332639 +6826 0.6826 42.4835634351524547 -94.462644102889 +6827 0.6827 42.4929943791656299 -94.156236160580 +6828 0.6828 42.5023946848600289 -93.849877727411 +6829 0.6829 42.5117643571976345 -93.543569024680 +6830 0.6830 42.5211034011625273 -93.237310273210 +6831 0.6831 42.5304118217608575 -92.931101693420 +6832 0.6832 42.5396896240207880 -92.624943505240 +6833 0.6833 42.5489368129924586 -92.318835928199 +6834 0.6834 42.5581533937479364 -92.012779181399 +6835 0.6835 42.5673393713811805 -91.706773483450 +6836 0.6836 42.5764947510079850 -91.400819052590 +6837 0.6837 42.5856195377659432 -91.094916106580 +6838 0.6838 42.5947137368144126 -90.789064862760 +6839 0.6839 42.6037773533344506 -90.483265538040 +6840 0.6840 42.6128103925287931 -90.177518348870 +6841 0.6841 42.6218128596218051 -89.871823511309 +6842 0.6842 42.6307847598594165 -89.566181240951 +6843 0.6843 42.6397260985091151 -89.260591752970 +6844 0.6844 42.6486368808598684 -88.955055262079 +6845 0.6845 42.6575171122221022 -88.649571982640 +6846 0.6846 42.6663667979276582 -88.344142128480 +6847 0.6847 42.6751859433297369 -88.038765913070 +6848 0.6848 42.6839745538028623 -87.733443549440 +6849 0.6849 42.6927326347428462 -87.428175250170 +6850 0.6850 42.7014601915667242 -87.122961227420 +6851 0.6851 42.7101572297127419 -86.817801692941 +6852 0.6852 42.7188237546402902 -86.512696858030 +6853 0.6853 42.7274597718298708 -86.207646933580 +6854 0.6854 42.7360652867830524 -85.902652130039 +6855 0.6855 42.7446403050224291 -85.597712657450 +6856 0.6856 42.7531848320915699 -85.292828725420 +6857 0.6857 42.7616988735549981 -84.988000543121 +6858 0.6858 42.7701824349981194 -84.683228319360 +6859 0.6859 42.7786355220272085 -84.378512262440 +6860 0.6860 42.7870581402693446 -84.073852580280 +6861 0.6861 42.7954502953723761 -83.769249480380 +6862 0.6862 42.8038119930048850 -83.464703169860 +6863 0.6863 42.8121432388561445 -83.160213855310 +6864 0.6864 42.8204440386360616 -82.855781743020 +6865 0.6865 42.8287143980751495 -82.551407038780 +6866 0.6866 42.8369543229244911 -82.247089948019 +6867 0.6867 42.8451638189556760 -81.942830675700 +6868 0.6868 42.8533428919607786 -81.638629426399 +6869 0.6869 42.8614915477523084 -81.334486404250 +6870 0.6870 42.8696097921631747 -81.030401813020 +6871 0.6871 42.8776976310466225 -80.726375856000 +6872 0.6872 42.8857550702762254 -80.422408736120 +6873 0.6873 42.8937821157458217 -80.118500655860 +6874 0.6874 42.9017787733694789 -79.814651817280 +6875 0.6875 42.9097450490814438 -79.510862422080 +6876 0.6876 42.9176809488361215 -79.207132671490 +6877 0.6877 42.9255864786080110 -78.903462766350 +6878 0.6878 42.9334616443916843 -78.599852907099 +6879 0.6879 42.9413064522017294 -78.296303293761 +6880 0.6880 42.9491209080727145 -77.992814125950 +6881 0.6881 42.9569050180591532 -77.689385602840 +6882 0.6882 42.9646587882354609 -77.386017923251 +6883 0.6883 42.9723822246958989 -77.082711285570 +6884 0.6884 42.9800753335545664 -76.779465887750 +6885 0.6885 42.9877381209453233 -76.476281927379 +6886 0.6886 42.9953705930217751 -76.173159601610 +6887 0.6887 43.0029727559572166 -75.870099107209 +6888 0.6888 43.0105446159446032 -75.567100640530 +6889 0.6889 43.0180861791965086 -75.264164397509 +6890 0.6890 43.0255974519450675 -74.961290573710 +6891 0.6891 43.0330784404419688 -74.658479364261 +6892 0.6892 43.0405291509583776 -74.355730963890 +6893 0.6893 43.0479495897849205 -74.053045566960 +6894 0.6894 43.0553397632316361 -73.750423367390 +6895 0.6895 43.0626996776279398 -73.447864558690 +6896 0.6896 43.0700293393225735 -73.145369334040 +6897 0.6897 43.0773287546835846 -72.842937886130 +6898 0.6898 43.0845979300982549 -72.540570407330 +6899 0.6899 43.0918368719731006 -72.238267089529 +6900 0.6900 43.0990455867337943 -71.936028124310 +6901 0.6901 43.1062240808251502 -71.633853702780 +6902 0.6902 43.1133723607110753 -71.331744015691 +6903 0.6903 43.1204904328745258 -71.029699253379 +6904 0.6904 43.1275783038174865 -70.727719605819 +6905 0.6905 43.1346359800609065 -70.425805262540 +6906 0.6906 43.1416634681446709 -70.123956412690 +6907 0.6907 43.1486607746275581 -69.822173245069 +6908 0.6908 43.1556279060872114 -69.520455948011 +6909 0.6909 43.1625648691200894 -69.218804709520 +6910 0.6910 43.1694716703414230 -68.917219717170 +6911 0.6911 43.1763483163851873 -68.615701158150 +6912 0.6912 43.1831948139040591 -68.314249219280 +6913 0.6913 43.1900111695693667 -68.012864086940 +6914 0.6914 43.1967973900710689 -67.711545947170 +6915 0.6915 43.2035534821177052 -67.410294985601 +6916 0.6916 43.2102794524363603 -67.109111387470 +6917 0.6917 43.2169753077726142 -66.807995337640 +6918 0.6918 43.2236410548905212 -66.506947020550 +6919 0.6919 43.2302767005725599 -66.205966620289 +6920 0.6920 43.2368822516196047 -65.905054320560 +6921 0.6921 43.2434577148508623 -65.604210304660 +6922 0.6922 43.2500030971038711 -65.303434755500 +6923 0.6923 43.2565184052344236 -65.002727855610 +6924 0.6924 43.2630036461165588 -64.702089787150 +6925 0.6925 43.2694588266425129 -64.401520731880 +6926 0.6926 43.2758839537226621 -64.101020871170 +6927 0.6927 43.2822790342855228 -63.800590386030 +6928 0.6928 43.2886440752776807 -63.500229457060 +6929 0.6929 43.2949790836637618 -63.199938264510 +6930 0.6930 43.3012840664263976 -62.899716988210 +6931 0.6931 43.3075590305661891 -62.599565807650 +6932 0.6932 43.3138039831016641 -62.299484901921 +6933 0.6933 43.3200189310692423 -61.999474449700 +6934 0.6934 43.3262038815231918 -61.699534629340 +6935 0.6935 43.3323588415356014 -61.399665618820 +6936 0.6936 43.3384838181963232 -61.099867595661 +6937 0.6937 43.3445788186129590 -60.800140737090 +6938 0.6938 43.3506438499108100 -60.500485219920 +6939 0.6939 43.3566789192328343 -60.200901220600 +6940 0.6940 43.3626840337396260 -59.901388915180 +6941 0.6941 43.3686592006093505 -59.601948479370 +6942 0.6942 43.3746044270377453 -59.302580088480 +6943 0.6943 43.3805197202380413 -59.003283917440 +6944 0.6944 43.3864050874409557 -58.704060140830 +6945 0.6945 43.3922605358946427 -58.404908932850 +6946 0.6946 43.3980860728646505 -58.105830467300 +6947 0.6947 43.4038817056338999 -57.806824917649 +6948 0.6948 43.4096474415026279 -57.507892456980 +6949 0.6949 43.4153832877883730 -57.209033257980 +6950 0.6950 43.4210892518259186 -56.910247492990 +6951 0.6951 43.4267653409672647 -56.611535333980 +6952 0.6952 43.4324115625815921 -56.312896952570 +6953 0.6953 43.4380279240552198 -56.014332519940 +6954 0.6954 43.4436144327915628 -55.715842206980 +6955 0.6955 43.4491710962111242 -55.417426184190 +6956 0.6956 43.4546979217514178 -55.119084621670 +6957 0.6957 43.4601949168669606 -54.820817689190 +6958 0.6958 43.4656620890292231 -54.522625556129 +6959 0.6959 43.4710994457266082 -54.224508391530 +6960 0.6960 43.4765069944643869 -53.926466364051 +6961 0.6961 43.4818847427646915 -53.628499641970 +6962 0.6962 43.4872326981664514 -53.330608393230 +6963 0.6963 43.4925508682253792 -53.032792785390 +6964 0.6964 43.4978392605139348 -52.735052985660 +6965 0.6965 43.5030978826212618 -52.437389160889 +6966 0.6966 43.5083267421531801 -52.139801477540 +6967 0.6967 43.5135258467321435 -51.842290101740 +6968 0.6968 43.5186952039971899 -51.544855199230 +6969 0.6969 43.5238348216039270 -51.247496935450 +6970 0.6970 43.5289447072244684 -50.950215475380 +6971 0.6971 43.5340248685474265 -50.653010983719 +6972 0.6972 43.5390753132778485 -50.355883624789 +6973 0.6973 43.5440960491372167 -50.058833562551 +6974 0.6974 43.5490870838633768 -49.761860960600 +6975 0.6975 43.5540484252105173 -49.464965982170 +6976 0.6976 43.5589800809491337 -49.168148790160 +6977 0.6977 43.5638820588659996 -48.871409547100 +6978 0.6978 43.5687543667641108 -48.574748415160 +6979 0.6979 43.5735970124626775 -48.278165556149 +6980 0.6980 43.5784100037970603 -47.981661131560 +6981 0.6981 43.5831933486187637 -47.685235302470 +6982 0.6982 43.5879470547953716 -47.388888229640 +6983 0.6983 43.5926711302105261 -47.092620073500 +6984 0.6984 43.5973655827639064 -46.796430994070 +6985 0.6985 43.6020304203711646 -46.500321151050 +6986 0.6986 43.6066656509639046 -46.204290703810 +6987 0.6987 43.6112712824896605 -45.908339811310 +6988 0.6988 43.6158473229118400 -45.612468632210 +6989 0.6989 43.6203937802096888 -45.316677324800 +6990 0.6990 43.6249106623782836 -45.020966047030 +6991 0.6991 43.6293979774284608 -44.725334956500 +6992 0.6992 43.6338557333868096 -44.429784210440 +6993 0.6993 43.6382839382956220 -44.134313965750 +6994 0.6994 43.6426826002128578 -43.838924378990 +6995 0.6995 43.6470517272121228 -43.543615606330 +6996 0.6996 43.6513913273826191 -43.248387803660 +6997 0.6997 43.6557014088291240 -42.953241126490 +6998 0.6998 43.6599819796719473 -42.658175729960 +6999 0.6999 43.6642330480468885 -42.363191768900 +7000 0.7000 43.6684546221052230 -42.068289397780 +7001 0.7001 43.6726467100136517 -41.773468770740 +7002 0.7002 43.6768093199542662 -41.478730041540 +7003 0.7003 43.6809424601245269 -41.184073363650 +7004 0.7004 43.6850461387372206 -40.889498890170 +7005 0.7005 43.6891203640204182 -40.595006773840 +7006 0.7006 43.6931651442174669 -40.300597167070 +7007 0.7007 43.6971804875869196 -40.006270221959 +7008 0.7008 43.7011664024025279 -39.712026090220 +7009 0.7009 43.7051228969531991 -39.417864923250 +7010 0.7010 43.7090499795429679 -39.123786872120 +7011 0.7011 43.7129476584909469 -38.829792087530 +7012 0.7012 43.7168159421313121 -38.535880719840 +7013 0.7013 43.7206548388132603 -38.242052919120 +7014 0.7014 43.7244643569009668 -37.948308835051 +7015 0.7015 43.7282445047735706 -37.654648616990 +7016 0.7016 43.7319952908251182 -37.361072413980 +7017 0.7017 43.7357167234645487 -37.067580374700 +7018 0.7018 43.7394088111156591 -36.774172647500 +7019 0.7019 43.7430715622170538 -36.480849380399 +7020 0.7020 43.7467049852221308 -36.187610721080 +7021 0.7021 43.7503090885990318 -35.894456816900 +7022 0.7022 43.7538838808306210 -35.601387814871 +7023 0.7023 43.7574293704144495 -35.308403861670 +7024 0.7024 43.7609455658627127 -35.015505103640 +7025 0.7025 43.7644324757022360 -34.722691686820 +7026 0.7026 43.7678901084744183 -34.429963756860 +7027 0.7027 43.7713184727352171 -34.137321459149 +7028 0.7028 43.7747175770551067 -33.844764938680 +7029 0.7029 43.7780874300190490 -33.552294340160 +7030 0.7030 43.7814280402264515 -33.259909807950 +7031 0.7031 43.7847394162911527 -32.967611486069 +7032 0.7032 43.7880215668413655 -32.675399518240 +7033 0.7033 43.7912745005196697 -32.383274047820 +7034 0.7034 43.7944982259829558 -32.091235217870 +7035 0.7035 43.7976927519024031 -31.799283171090 +7036 0.7036 43.8008580869634514 -31.507418049880 +7037 0.7037 43.8039942398657587 -31.215639996311 +7038 0.7038 43.8071012193231795 -30.923949152120 +7039 0.7039 43.8101790340637223 -30.632345658710 +7040 0.7040 43.8132276928295141 -30.340829657180 +7041 0.7041 43.8162472043767863 -30.049401288290 +7042 0.7042 43.8192375774758247 -29.758060692480 +7043 0.7043 43.8221988209109412 -29.466808009870 +7044 0.7044 43.8251309434804455 -29.175643380230 +7045 0.7045 43.8280339539966093 -28.884566943039 +7046 0.7046 43.8309078612856382 -28.593578837470 +7047 0.7047 43.8337526741876289 -28.302679202300 +7048 0.7048 43.8365684015565478 -28.011868176060 +7049 0.7049 43.8393550522601956 -27.721145896940 +7050 0.7050 43.8421126351801789 -27.430512502789 +7051 0.7051 43.8448411592118745 -27.139968131140 +7052 0.7052 43.8475406332643942 -26.849512919230 +7053 0.7053 43.8502110662605560 -26.559147003960 +7054 0.7054 43.8528524671368487 -26.268870521910 +7055 0.7055 43.8554648448434108 -25.978683609340 +7056 0.7056 43.8580482083439875 -25.688586402211 +7057 0.7057 43.8606025666159027 -25.398579036140 +7058 0.7058 43.8631279286500302 -25.108661646450 +7059 0.7059 43.8656243034507582 -24.818834368140 +7060 0.7060 43.8680917000359614 -24.529097335901 +7061 0.7061 43.8705301274369575 -24.239450684080 +7062 0.7062 43.8729395946985008 -23.949894546730 +7063 0.7063 43.8753201108787181 -23.660429057610 +7064 0.7064 43.8776716850491013 -23.371054350120 +7065 0.7065 43.8799943262944723 -23.081770557370 +7066 0.7066 43.8822880437129470 -22.792577812181 +7067 0.7067 43.8845528464159074 -22.503476247010 +7068 0.7068 43.8867887435279584 -22.214465994050 +7069 0.7069 43.8889957441869214 -21.925547185140 +7070 0.7070 43.8911738575437695 -21.636719951870 +7071 0.7071 43.8933230927626354 -21.347984425420 +7072 0.7072 43.8954434590207470 -21.059340736750 +7073 0.7073 43.8975349655084059 -20.770789016479 +7074 0.7074 43.8995976214289740 -20.482329394910 +7075 0.7075 43.9016314359988229 -20.193962002040 +7076 0.7076 43.9036364184473058 -19.905686967561 +7077 0.7077 43.9056125780167292 -19.617504420870 +7078 0.7078 43.9075599239623244 -19.329414491010 +7079 0.7079 43.9094784655522119 -19.041417306790 +7080 0.7080 43.9113682120673801 -18.753512996640 +7081 0.7081 43.9132291728016497 -18.465701688729 +7082 0.7082 43.9150613570616315 -18.177983510890 +7083 0.7083 43.9168647741667115 -17.890358590690 +7084 0.7084 43.9186394334490160 -17.602827055351 +7085 0.7085 43.9203853442533756 -17.315389031830 +7086 0.7086 43.9221025159373042 -17.028044646720 +7087 0.7087 43.9237909578709562 -16.740794026379 +7088 0.7088 43.9254506794371196 -16.453637296820 +7089 0.7089 43.9270816900311516 -16.166574583750 +7090 0.7090 43.9286839990609721 -15.879606012610 +7091 0.7091 43.9302576159470277 -15.592731708520 +7092 0.7092 43.9318025501222635 -15.305951796260 +7093 0.7093 43.9333188110320947 -15.019266400400 +7094 0.7094 43.9348064081343708 -14.732675645090 +7095 0.7095 43.9362653508993404 -14.446179654300 +7096 0.7096 43.9376956488096369 -14.159778551600 +7097 0.7097 43.9390973113602357 -13.873472460350 +7098 0.7098 43.9404703480584331 -13.587261503530 +7099 0.7099 43.9418147684238036 -13.301145803860 +7100 0.7100 43.9431305819881857 -13.015125483780 +7101 0.7101 43.9444177982956461 -12.729200665420 +7102 0.7102 43.9456764269024447 -12.443371470569 +7103 0.7103 43.9469064773770128 -12.157638020790 +7104 0.7104 43.9481079592999180 -11.872000437300 +7105 0.7105 43.9492808822638352 -11.586458841050 +7106 0.7106 43.9504252558735189 -11.301013352650 +7107 0.7107 43.9515410897457741 -11.015664092491 +7108 0.7108 43.9526283935094284 -10.730411180611 +7109 0.7109 43.9536871768052961 -10.445254736740 +7110 0.7110 43.9547174492861501 -10.160194880390 +7111 0.7111 43.9557192206167073 -9.875231730701 +7112 0.7112 43.9566925004735722 -9.590365406590 +7113 0.7113 43.9576372985452295 -9.305596026589 +7114 0.7114 43.9585536245320085 -9.020923709050 +7115 0.7115 43.9594414881460551 -8.736348571950 +7116 0.7116 43.9603008991113029 -8.451870732990 +7117 0.7117 43.9611318671634308 -8.167490309630 +7118 0.7118 43.9619344020498630 -7.883207418980 +7119 0.7119 43.9627085135297051 -7.599022177880 +7120 0.7120 43.9634542113737439 -7.314934702890 +7121 0.7121 43.9641715053644049 -7.030945110300 +7122 0.7122 43.9648604052957239 -6.747053516060 +7123 0.7123 43.9655209209733187 -6.463260035860 +7124 0.7124 43.9661530622143673 -6.179564785110 +7125 0.7125 43.9667568388475658 -5.895967878930 +7126 0.7126 43.9673322607131212 -5.612469432140 +7127 0.7127 43.9678793376626942 -5.329069559270 +7128 0.7128 43.9683980795593854 -5.045768374620 +7129 0.7129 43.9688884962777209 -4.762565992120 +7130 0.7130 43.9693505977036025 -4.479462525470 +7131 0.7131 43.9697843937342796 -4.196458088069 +7132 0.7132 43.9701898942783345 -3.913552793050 +7133 0.7133 43.9705671092556472 -3.630746753221 +7134 0.7134 43.9709160485973669 -3.348040081150 +7135 0.7135 43.9712367222458766 -3.065432889111 +7136 0.7136 43.9715291401547859 -2.782925289061 +7137 0.7137 43.9717933122888738 -2.500517392730 +7138 0.7138 43.9720292486240893 -2.218209311541 +7139 0.7139 43.9722369591474944 -1.936001156620 +7140 0.7140 43.9724164538572637 -1.653893038821 +7141 0.7141 43.9725677427626422 -1.371885068750 +7142 0.7142 43.9726908358839168 -1.089977356690 +7143 0.7143 43.9727857432523876 -0.808170012660 +7144 0.7144 43.9728524749103400 -0.526463146401 +7145 0.7145 43.9728910409110298 -0.244856867370 +7146 0.7146 43.9729014513186343 0.036648715231 +7147 0.7147 43.9728837162082442 0.318053492500 +7148 0.7148 43.9728378456658291 0.599357355820 +7149 0.7149 43.9727638497881941 0.880560196830 +7150 0.7150 43.9726617386829801 1.161661907470 +7151 0.7151 43.9725315224686071 1.442662379920 +7152 0.7152 43.9723732112742809 1.723561506669 +7153 0.7153 43.9721868152399225 2.004359180461 +7154 0.7154 43.9719723445161819 2.285055294330 +7155 0.7155 43.9717298092643887 2.565649741590 +7156 0.7156 43.9714592196565235 2.846142415780 +7157 0.7157 43.9711605858751966 3.126533210800 +7158 0.7158 43.9708339181136196 3.406822020730 +7159 0.7159 43.9704792265755842 3.687008739980 +7160 0.7160 43.9700965214754262 3.967093263241 +7161 0.7161 43.9696858130379908 4.247075485430 +7162 0.7162 43.9692471114986319 4.526955301750 +7163 0.7163 43.9687804271031553 4.806732607711 +7164 0.7164 43.9682857701078191 5.086407299050 +7165 0.7165 43.9677631507792768 5.365979271810 +7166 0.7166 43.9672125793945696 5.645448422270 +7167 0.7167 43.9666340662411059 5.924814647001 +7168 0.7168 43.9660276216166110 6.204077842840 +7169 0.7169 43.9653932558291274 6.483237906899 +7170 0.7170 43.9647309791969576 6.762294736530 +7171 0.7171 43.9640408020486646 7.041248229370 +7172 0.7172 43.9633227347230289 7.320098283360 +7173 0.7173 43.9625767875690272 7.598844796640 +7174 0.7174 43.9618029709458114 7.877487667681 +7175 0.7175 43.9610012952226654 8.156026795170 +7176 0.7176 43.9601717707789987 8.434462078099 +7177 0.7177 43.9593144080043103 8.712793415680 +7178 0.7178 43.9584292172981534 8.991020707470 +7179 0.7179 43.9575162090701212 9.269143853190 +7180 0.7180 43.9565753937398185 9.547162752910 +7181 0.7181 43.9556067817368259 9.825077306899 +7182 0.7182 43.9546103835006932 10.102887415740 +7183 0.7183 43.9535862094808962 10.380592980260 +7184 0.7184 43.9525342701368089 10.658193901540 +7185 0.7185 43.9514545759376816 10.935690080950 +7186 0.7186 43.9503471373626269 11.213081420090 +7187 0.7187 43.9492119649005843 11.490367820820 +7188 0.7188 43.9480490690502776 11.767549185320 +7189 0.7189 43.9468584603202146 12.044625415960 +7190 0.7190 43.9456401492286446 12.321596415410 +7191 0.7191 43.9443941463035443 12.598462086580 +7192 0.7192 43.9431204620825824 12.875222332650 +7193 0.7193 43.9418191071130977 13.151877057080 +7194 0.7194 43.9404900919520642 13.428426163549 +7195 0.7195 43.9391334271660838 13.704869556011 +7196 0.7196 43.9377491233313506 13.981207138690 +7197 0.7197 43.9363371910336156 14.257438816060 +7198 0.7198 43.9348976408681722 14.533564492840 +7199 0.7199 43.9334304834398282 14.809584074050 +7200 0.7200 43.9319357293628769 15.085497464910 +7201 0.7201 43.9304133892610835 15.361304570920 +7202 0.7202 43.9288634737676489 15.637005297830 +7203 0.7203 43.9272859935251745 15.912599551681 +7204 0.7204 43.9256809591856552 16.188087238720 +7205 0.7205 43.9240483814104437 16.463468265460 +7206 0.7206 43.9223882708702362 16.738742538710 +7207 0.7207 43.9207006382450302 17.013909965480 +7208 0.7208 43.9189854942241027 17.288970453061 +7209 0.7209 43.9172428495060032 17.563923908991 +7210 0.7210 43.9154727147984971 17.838770241070 +7211 0.7211 43.9136751008185797 18.113509357319 +7212 0.7212 43.9118500182924123 18.388141166060 +7213 0.7213 43.9099974779553150 18.662665575820 +7214 0.7214 43.9081174905517528 18.937082495410 +7215 0.7215 43.9062100668352855 19.211391833890 +7216 0.7216 43.9042752175685607 19.485593500540 +7217 0.7217 43.9023129535232854 19.759687404940 +7218 0.7218 43.9003232854801979 20.033673456860 +7219 0.7219 43.8983062242290387 20.307551566370 +7220 0.7220 43.8962617805685298 20.581321643770 +7221 0.7221 43.8941899653063601 20.854983599610 +7222 0.7222 43.8920907892591430 21.128537344680 +7223 0.7223 43.8899642632524092 21.401982790030 +7224 0.7224 43.8878103981205570 21.675319846951 +7225 0.7225 43.8856292047068592 21.948548426990 +7226 0.7226 43.8834206938634139 22.221668441930 +7227 0.7227 43.8811848764511296 22.494679803810 +7228 0.7228 43.8789217633396902 22.767582424910 +7229 0.7229 43.8766313654075546 23.040376217750 +7230 0.7230 43.8743136935419145 23.313061095110 +7231 0.7231 43.8719687586386584 23.585636970010 +7232 0.7232 43.8695965716023721 23.858103755700 +7233 0.7233 43.8671971433463028 24.130461365690 +7234 0.7234 43.8647704847923308 24.402709713740 +7235 0.7235 43.8623166068709551 24.674848713830 +7236 0.7236 43.8598355205212513 24.946878280210 +7237 0.7237 43.8573272366908711 25.218798327360 +7238 0.7238 43.8547917663360067 25.490608769990 +7239 0.7239 43.8522291204213559 25.762309523080 +7240 0.7240 43.8496393099201143 26.033900501820 +7241 0.7241 43.8470223458139401 26.305381621680 +7242 0.7242 43.8443782390929400 26.576752798340 +7243 0.7243 43.8417070007556404 26.848013947710 +7244 0.7244 43.8390086418089524 27.119164985990 +7245 0.7245 43.8362831732681713 27.390205829570 +7246 0.7246 43.8335306061569341 27.661136395110 +7247 0.7247 43.8307509515072056 27.931956599510 +7248 0.7248 43.8279442203592353 28.202666359890 +7249 0.7249 43.8251104237615579 28.473265593600 +7250 0.7250 43.8222495727709642 28.743754218260 +7251 0.7251 43.8193616784524664 29.014132151710 +7252 0.7252 43.8164467518792762 29.284399312050 +7253 0.7253 43.8135048041327977 29.554555617560 +7254 0.7254 43.8105358463025780 29.824600986820 +7255 0.7255 43.8075398894863071 30.094535338630 +7256 0.7256 43.8045169447897749 30.364358591980 +7257 0.7257 43.8014670233268646 30.634070666160 +7258 0.7258 43.7983901362195240 30.903671480680 +7259 0.7259 43.7952862945977301 31.173160955240 +7260 0.7260 43.7921555095994748 31.442539009820 +7261 0.7261 43.7889977923707505 31.711805564640 +7262 0.7262 43.7858131540655151 31.980960540110 +7263 0.7263 43.7826016058456631 32.250003856910 +7264 0.7264 43.7793631588810186 32.518935435940 +7265 0.7265 43.7760978243493071 32.787755198350 +7266 0.7266 43.7728056134361125 33.056463065490 +7267 0.7267 43.7694865373348918 33.325058958960 +7268 0.7268 43.7661406072469106 33.593542800620 +7269 0.7269 43.7627678343812576 33.861914512480 +7270 0.7270 43.7593682299547879 34.130174016890 +7271 0.7271 43.7559418051921227 34.398321236350 +7272 0.7272 43.7524885713256211 34.666356093620 +7273 0.7273 43.7490085395953585 34.934278511670 +7274 0.7274 43.7455017212490915 35.202088413740 +7275 0.7275 43.7419681275422434 35.469785723260 +7276 0.7276 43.7384077697378828 35.737370363910 +7277 0.7277 43.7348206591067097 36.004842259580 +7278 0.7278 43.7312068069270126 36.272201334420 +7279 0.7279 43.7275662244846544 36.539447512790 +7280 0.7280 43.7238989230730510 36.806580719250 +7281 0.7281 43.7202049139931574 37.073600878630 +7282 0.7282 43.7164842085534247 37.340507915980 +7283 0.7283 43.7127368180697999 37.607301756560 +7284 0.7284 43.7089627538656771 37.873982325850 +7285 0.7285 43.7051620272719035 38.140549549590 +7286 0.7286 43.7013346496267374 38.407003353730 +7287 0.7287 43.6974806322758269 38.673343664410 +7288 0.7288 43.6935999865722025 38.939570408060 +7289 0.7289 43.6896927238762345 39.205683511270 +7290 0.7290 43.6857588555556262 39.471682900900 +7291 0.7291 43.6817983929853781 39.737568504020 +7292 0.7292 43.6778113475477809 40.003340247920 +7293 0.7293 43.6737977306323799 40.268998060100 +7294 0.7294 43.6697575536359608 40.534541868310 +7295 0.7295 43.6656908279625213 40.799971600520 +7296 0.7296 43.6615975650232500 41.065287184890 +7297 0.7297 43.6574777762365116 41.330488549840 +7298 0.7298 43.6533314730278192 41.595575623990 +7299 0.7299 43.6491586668298126 41.860548336190 +7300 0.7300 43.6449593690822297 42.125406615500 +7301 0.7301 43.6407335912318928 42.390150391220 +7302 0.7302 43.6364813447326867 42.654779592840 +7303 0.7303 43.6322026410455379 42.919294150110 +7304 0.7304 43.6278974916383859 43.183693992980 +7305 0.7305 43.6235659079861549 43.447979051580 +7306 0.7306 43.6192079015707606 43.712149256330 +7307 0.7307 43.6148234838810538 43.976204537820 +7308 0.7308 43.6104126664128202 44.240144826870 +7309 0.7309 43.6059754606687520 44.503970054540 +7310 0.7310 43.6015118781584192 44.767680152060 +7311 0.7311 43.5970219303982702 45.031275050920 +7312 0.7312 43.5925056289115815 45.294754682810 +7313 0.7313 43.5879629852284580 45.558118979650 +7314 0.7314 43.5833940108857973 45.821367873530 +7315 0.7315 43.5787987174272828 46.084501296820 +7316 0.7316 43.5741771164033409 46.347519182060 +7317 0.7317 43.5695292193711339 46.610421462040 +7318 0.7318 43.5648550378945458 46.873208069720 +7319 0.7319 43.5601545835441470 47.135878938320 +7320 0.7320 43.5554278678971656 47.398434001250 +7321 0.7321 43.5506749025374944 47.660873192120 +7322 0.7322 43.5458956990556487 47.923196444800 +7323 0.7323 43.5410902690487447 48.185403693330 +7324 0.7324 43.5362586241204781 48.447494871970 +7325 0.7325 43.5314007758811172 48.709469915210 +7326 0.7326 43.5265167359474674 48.971328757740 +7327 0.7327 43.5216065159428567 49.233071334480 +7328 0.7328 43.5166701274971075 49.494697580520 +7329 0.7329 43.5117075822465225 49.756207431200 +7330 0.7330 43.5067188918338630 50.017600822060 +7331 0.7331 43.5017040679083209 50.278877688850 +7332 0.7332 43.4966631221255042 50.540037967520 +7333 0.7333 43.4915960661474159 50.801081594240 +7334 0.7334 43.4865029116424324 51.062008505400 +7335 0.7335 43.4813836702852825 51.322818637580 +7336 0.7336 43.4762383537570258 51.583511927570 +7337 0.7337 43.4710669737450246 51.844088312390 +7338 0.7338 43.4658695419429435 52.104547729260 +7339 0.7339 43.4606460700507000 52.364890115580 +7340 0.7340 43.4553965697744715 52.625115408990 +7341 0.7341 43.4501210528266526 52.885223547330 +7342 0.7342 43.4448195309258551 53.145214468640 +7343 0.7343 43.4394920157968656 53.405088111180 +7344 0.7344 43.4341385191706379 53.664844413390 +7345 0.7345 43.4287590527842724 53.924483313950 +7346 0.7346 43.4233536283809869 54.184004751730 +7347 0.7347 43.4179222577101100 54.443408665790 +7348 0.7348 43.4124649525270456 54.702694995430 +7349 0.7349 43.4069817245932654 54.961863680120 +7350 0.7350 43.4014725856762809 55.220914659550 +7351 0.7351 43.3959375475496216 55.479847873630 +7352 0.7352 43.3903766219928144 55.738663262450 +7353 0.7353 43.3847898207913758 55.997360766300 +7354 0.7354 43.3791771557367767 56.255940325690 +7355 0.7355 43.3735386386264281 56.514401881350 +7356 0.7356 43.3678742812636528 56.772745374160 +7357 0.7357 43.3621840954576854 57.030970745240 +7358 0.7358 43.3564680930236293 57.289077935930 +7359 0.7359 43.3507262857824500 57.547066887710 +7360 0.7360 43.3449586855609468 57.804937542320 +7361 0.7361 43.3391653041917451 58.062689841680 +7362 0.7362 43.3333461535132685 58.320323727910 +7363 0.7363 43.3275012453697101 58.577839143320 +7364 0.7364 43.3216305916110187 58.835236030440 +7365 0.7365 43.3157342040928981 59.092514331990 +7366 0.7366 43.3098120946767509 59.349673990890 +7367 0.7367 43.3038642752296923 59.606714950250 +7368 0.7368 43.2978907576245078 59.863637153400 +7369 0.7369 43.2918915537396458 60.120440543860 +7370 0.7370 43.2858666754591823 60.377125065340 +7371 0.7371 43.2798161346728278 60.633690661750 +7372 0.7372 43.2737399432758778 60.890137277210 +7373 0.7373 43.2676381131692125 61.146464856030 +7374 0.7374 43.2615106562592757 61.402673342700 +7375 0.7375 43.2553575844580465 61.658762681940 +7376 0.7376 43.2491789096830175 61.914732818650 +7377 0.7377 43.2429746438571883 62.170583697910 +7378 0.7378 43.2367447989090437 62.426315265020 +7379 0.7379 43.2304893867725184 62.681927465480 +7380 0.7380 43.2242084193869971 62.937420244950 +7381 0.7381 43.2179019086972858 63.192793549320 +7382 0.7382 43.2115698666535835 63.448047324670 +7383 0.7383 43.2052123052114894 63.703181517260 +7384 0.7384 43.1988292363319530 63.958196073520 +7385 0.7385 43.1924206719812673 64.213090940160 +7386 0.7386 43.1859866241310613 64.467866064000 +7387 0.7387 43.1795271047582574 64.722521392070 +7388 0.7388 43.1730421258450718 64.977056871630 +7389 0.7389 43.1665316993789858 65.231472450100 +7390 0.7390 43.1599958373527244 65.485768075080 +7391 0.7391 43.1534345517642492 65.739943694390 +7392 0.7392 43.1468478546167304 65.993999256050 +7393 0.7393 43.1402357579185178 66.247934708240 +7394 0.7394 43.1335982736831411 66.501749999350 +7395 0.7395 43.1269354139292744 66.755445077950 +7396 0.7396 43.1202471906807361 67.009019892810 +7397 0.7397 43.1135336159664533 67.262474392890 +7398 0.7398 43.1067947018204407 67.515808527340 +7399 0.7399 43.1000304602818005 67.769022245490 +7400 0.7400 43.0932409033946797 68.022115496860 +7401 0.7401 43.0864260432082773 68.275088231190 +7402 0.7402 43.0795858917768015 68.527940398360 +7403 0.7403 43.0727204611594630 68.780671948460 +7404 0.7404 43.0658297634204530 69.033282831800 +7405 0.7405 43.0589138106289226 69.285772998810 +7406 0.7406 43.0519726148589754 69.538142400170 +7407 0.7407 43.0450061881896318 69.790390986730 +7408 0.7408 43.0380145427048220 70.042518709500 +7409 0.7409 43.0309976904933649 70.294525519710 +7410 0.7410 43.0239556436489394 70.546411368750 +7411 0.7411 43.0168884142700918 70.798176208230 +7412 0.7412 43.0097960144601856 71.049819989920 +7413 0.7413 43.0026784563274020 71.301342665760 +7414 0.7414 42.9955357519847183 71.552744187930 +7415 0.7415 42.9883679135498866 71.804024508740 +7416 0.7416 42.9811749531454126 72.055183580710 +7417 0.7417 42.9739568828985483 72.306221356530 +7418 0.7418 42.9667137149412639 72.557137789110 +7419 0.7419 42.9594454614102332 72.807932831490 +7420 0.7420 42.9521521344468127 73.058606436950 +7421 0.7421 42.9448337461970198 73.309158558910 +7422 0.7422 42.9374903088115261 73.559589150990 +7423 0.7423 42.9301218344456288 73.809898166990 +7424 0.7424 42.9227283352592366 74.060085560890 +7425 0.7425 42.9153098234168482 74.310151286860 +7426 0.7426 42.9078663110875453 74.560095299250 +7427 0.7427 42.9003978104449502 74.809917552590 +7428 0.7428 42.8929043336672393 75.059618001580 +7429 0.7429 42.8853858929371015 75.309196601110 +7430 0.7430 42.8778425004417301 75.558653306270 +7431 0.7431 42.8702741683728021 75.807988072300 +7432 0.7432 42.8626809089264569 76.057200854640 +7433 0.7433 42.8550627343032815 76.306291608890 +7434 0.7434 42.8474196567082970 76.555260290840 +7435 0.7435 42.8397516883509297 76.804106856490 +7436 0.7436 42.8320588414450043 77.052831261960 +7437 0.7437 42.8243411282087294 77.301433463570 +7438 0.7438 42.8165985608646551 77.549913417870 +7439 0.7439 42.8088311516396871 77.798271081520 +7440 0.7440 42.8010389127650441 78.046506411380 +7441 0.7441 42.7932218564762508 78.294619364500 +7442 0.7442 42.7853799950131233 78.542609898080 +7443 0.7443 42.7775133406197412 78.790477969540 +7444 0.7444 42.7696219055444402 79.038223536450 +7445 0.7445 42.7617057020397908 79.285846556550 +7446 0.7446 42.7537647423625771 79.533346987760 +7447 0.7447 42.7457990387737823 79.780724788190 +7448 0.7448 42.7378086035385678 80.027979916110 +7449 0.7449 42.7297934489262659 80.275112329980 +7450 0.7450 42.7217535872103440 80.522121988420 +7451 0.7451 42.7136890306684123 80.769008850230 +7452 0.7452 42.7055997915821806 81.015772874410 +7453 0.7453 42.6974858822374586 81.262414020080 +7454 0.7454 42.6893473149241274 81.508932246580 +7455 0.7455 42.6811841019361253 81.755327513400 +7456 0.7456 42.6729962555714408 82.001599780240 +7457 0.7457 42.6647837881320839 82.247749006900 +7458 0.7458 42.6565467119240651 82.493775153430 +7459 0.7459 42.6482850392573951 82.739678180020 +7460 0.7460 42.6399987824460425 82.985458047030 +7461 0.7461 42.6316879538079405 83.231114714980 +7462 0.7462 42.6233525656649590 83.476648144590 +7463 0.7463 42.6149926303428899 83.722058296760 +7464 0.7464 42.6066081601714259 83.967345132500 +7465 0.7465 42.5981991674841467 84.212508613050 +7466 0.7466 42.5897656646185041 84.457548699810 +7467 0.7467 42.5813076639157941 84.702465354330 +7468 0.7468 42.5728251777211568 84.947258538350 +7469 0.7469 42.5643182183835478 85.191928213780 +7470 0.7470 42.5557867982557241 85.436474342670 +7471 0.7471 42.5472309296942299 85.680896887280 +7472 0.7472 42.5386506250593683 85.925195810020 +7473 0.7473 42.5300458967151940 86.169371073470 +7474 0.7474 42.5214167570294990 86.413422640370 +7475 0.7475 42.5127632183737987 86.657350473640 +7476 0.7476 42.5040852931232962 86.901154536370 +7477 0.7477 42.4953829936568894 87.144834791810 +7478 0.7478 42.4866563323571285 87.388391203380 +7479 0.7479 42.4779053216102227 87.631823734680 +7480 0.7480 42.4691299738060195 87.875132349440 +7481 0.7481 42.4603303013379687 88.118317011600 +7482 0.7482 42.4515063166031297 88.361377685250 +7483 0.7483 42.4426580320021358 88.604314334630 +7484 0.7484 42.4337854599391946 88.847126924170 +7485 0.7485 42.4248886128220661 89.089815418440 +7486 0.7486 42.4159675030620349 89.332379782230 +7487 0.7487 42.4070221430739025 89.574819980410 +7488 0.7488 42.3980525452759736 89.817135978110 +7489 0.7489 42.3890587220900414 90.059327740520 +7490 0.7490 42.3800406859413599 90.301395233120 +7491 0.7491 42.3709984492586358 90.543338421410 +7492 0.7492 42.3619320244740081 90.785157271180 +7493 0.7493 42.3528414240230333 91.026851748310 +7494 0.7494 42.3437266603446716 91.268421818890 +7495 0.7495 42.3345877458812723 91.509867449120 +7496 0.7496 42.3254246930785456 91.751188605400 +7497 0.7497 42.3162375143855627 91.992385254300 +7498 0.7498 42.3070262222547200 92.233457362510 +7499 0.7499 42.2977908291417464 92.474404896930 +7500 0.7500 42.2885313475056677 92.715227824610 +7501 0.7501 42.2792477898087995 92.955926112720 +7502 0.7502 42.2699401685167331 93.196499728650 +7503 0.7503 42.2606084960983068 93.436948639900 +7504 0.7504 42.2512527850255992 93.677272814190 +7505 0.7505 42.2418730477739217 93.917472219330 +7506 0.7506 42.2324692968217903 94.157546823340 +7507 0.7507 42.2230415446509042 94.397496594410 +7508 0.7508 42.2135898037461459 94.637321500820 +7509 0.7509 42.2041140865955526 94.877021511090 +7510 0.7510 42.1946144056903023 95.116596593850 +7511 0.7511 42.1850907735247134 95.356046717920 +7512 0.7512 42.1755432025962023 95.595371852240 +7513 0.7513 42.1659717054052905 95.834571965950 +7514 0.7514 42.1563762944555762 96.073647028310 +7515 0.7515 42.1467569822537200 96.312597008790 +7516 0.7516 42.1371137813094307 96.551421876930 +7517 0.7517 42.1274467041354583 96.790121602540 +7518 0.7518 42.1177557632475583 97.028696155510 +7519 0.7519 42.1080409711644919 97.267145505890 +7520 0.7520 42.0983023404080043 97.505469623920 +7521 0.7521 42.0885398835028113 97.743668479980 +7522 0.7522 42.0787536129765840 97.981742044600 +7523 0.7523 42.0689435413599284 98.219690288470 +7524 0.7524 42.0591096811863849 98.457513182440 +7525 0.7525 42.0492520449923859 98.695210697530 +7526 0.7526 42.0393706453172626 98.932782804870 +7527 0.7527 42.0294654947032313 99.170229475800 +7528 0.7528 42.0195366056953503 99.407550681770 +7529 0.7529 42.0095839908415414 99.644746394410 +7530 0.7530 41.9996076626925472 99.881816585510 +7531 0.7531 41.9896076338019242 100.118761226980 +7532 0.7532 41.9795839167260283 100.355580290910 +7533 0.7533 41.9695365240240079 100.592273749550 +7534 0.7534 41.9594654682577684 100.828841575280 +7535 0.7535 41.9493707619919718 101.065283740650 +7536 0.7536 41.9392524177940231 101.301600218350 +7537 0.7537 41.9291104482340415 101.537790981260 +7538 0.7538 41.9189448658848605 101.773856002340 +7539 0.7539 41.9087556833220063 102.009795254760 +7540 0.7540 41.8985429131236771 102.245608711850 +7541 0.7541 41.8883065678707354 102.481296347030 +7542 0.7542 41.8780466601466870 102.716858133940 +7543 0.7543 41.8677632025376738 102.952294046310 +7544 0.7544 41.8574562076324526 103.187604058080 +7545 0.7545 41.8471256880223805 103.422788143300 +7546 0.7546 41.8367716563014085 103.657846276200 +7547 0.7547 41.8263941250660451 103.892778431100 +7548 0.7548 41.8159931069153643 104.127584582540 +7549 0.7549 41.8055686144509764 104.362264705190 +7550 0.7550 41.7951206602770284 104.596818773840 +7551 0.7551 41.7846492570001615 104.831246763460 +7552 0.7552 41.7741544172295320 105.065548649160 +7553 0.7553 41.7636361535767620 105.299724406200 +7554 0.7554 41.7530944786559530 105.533774009980 +7555 0.7555 41.7425294050836513 105.767697436050 +7556 0.7556 41.7319409454788399 106.001494660130 +7557 0.7557 41.7213291124629322 106.235165658050 +7558 0.7558 41.7106939186597359 106.468710405820 +7559 0.7559 41.7000353766954674 106.702128879570 +7560 0.7560 41.6893534991987096 106.935421055610 +7561 0.7561 41.6786482988004110 107.168586910380 +7562 0.7562 41.6679197881338723 107.401626420450 +7563 0.7563 41.6571679798347247 107.634539562550 +7564 0.7564 41.6463928865409159 107.867326313570 +7565 0.7565 41.6355945208927096 108.099986650530 +7566 0.7566 41.6247728955326508 108.332520550590 +7567 0.7567 41.6139280231055650 108.564927991080 +7568 0.7568 41.6030599162585375 108.797208949430 +7569 0.7569 41.5921685876409057 109.029363403270 +7570 0.7570 41.5812540499042242 109.261391330350 +7571 0.7571 41.5703163157022786 109.493292708550 +7572 0.7572 41.5593553976910570 109.725067515910 +7573 0.7573 41.5483713085287292 109.956715730620 +7574 0.7574 41.5373640608756460 110.188237330980 +7575 0.7575 41.5263336673943257 110.419632295480 +7576 0.7576 41.5152801407494181 110.650900602740 +7577 0.7577 41.5042034936077044 110.882042231500 +7578 0.7578 41.4931037386380979 111.113057160640 +7579 0.7579 41.4819808885116075 111.343945369230 +7580 0.7580 41.4708349559013243 111.574706836440 +7581 0.7581 41.4596659534824212 111.805341541600 +7582 0.7582 41.4484738939321318 112.035849464150 +7583 0.7583 41.4372587899297358 112.266230583740 +7584 0.7584 41.4260206541565452 112.496484880090 +7585 0.7585 41.4147594992958830 112.726612333100 +7586 0.7586 41.4034753380330898 112.956612922790 +7587 0.7587 41.3921681830554817 113.186486629360 +7588 0.7588 41.3808380470523574 113.416233433080 +7589 0.7589 41.3694849427149833 113.645853314430 +7590 0.7590 41.3581088827365591 113.875346254010 +7591 0.7591 41.3467098798122308 114.104712232520 +7592 0.7592 41.3352879466390633 114.333951230870 +7593 0.7593 41.3238430959160183 114.563063230040 +7594 0.7594 41.3123753403439551 114.792048211200 +7595 0.7595 41.3008846926256155 115.020906155620 +7596 0.7596 41.2893711654655959 115.249637044750 +7597 0.7597 41.2778347715703475 115.478240860160 +7598 0.7598 41.2662755236481615 115.706717583510 +7599 0.7599 41.2546934344091483 115.935067196690 +7600 0.7600 41.2430885165652299 116.163289681660 +7601 0.7601 41.2314607828301192 116.391385020550 +7602 0.7602 41.2198102459193123 116.619353195590 +7603 0.7603 41.2081369185500748 116.847194189210 +7604 0.7604 41.1964408134414199 117.074907983900 +7605 0.7605 41.1847219433141092 117.302494562350 +7606 0.7606 41.1729803208906233 117.529953907340 +7607 0.7607 41.1612159588951627 117.757286001830 +7608 0.7608 41.1494288700536259 117.984490828900 +7609 0.7609 41.1376190670935955 118.211568371730 +7610 0.7610 41.1257865627443238 118.438518613680 +7611 0.7611 41.1139313697367257 118.665341538250 +7612 0.7612 41.1020535008033647 118.892037129020 +7613 0.7613 41.0901529686784244 119.118605369770 +7614 0.7614 41.0782297860977152 119.345046244370 +7615 0.7615 41.0662839657986538 119.571359736850 +7616 0.7616 41.0543155205202410 119.797545831350 +7617 0.7617 41.0423244630030624 120.023604512160 +7618 0.7618 41.0303108059892665 120.249535763720 +7619 0.7619 41.0182745622225511 120.475339570560 +7620 0.7620 41.0062157444481556 120.701015917380 +7621 0.7621 40.9941343654128332 120.926564789010 +7622 0.7622 40.9820304378648643 121.151986170390 +7623 0.7623 40.9699039745540148 121.377280046610 +7624 0.7624 40.9577549882315424 121.602446402890 +7625 0.7625 40.9455834916501686 121.827485224590 +7626 0.7626 40.9333894975640789 122.052396497190 +7627 0.7627 40.9211730187289078 122.277180206290 +7628 0.7628 40.9089340679017113 122.501836337670 +7629 0.7629 40.8966726578409663 122.726364877170 +7630 0.7630 40.8843888013065637 122.950765810830 +7631 0.7631 40.8720825110597801 123.175039124780 +7632 0.7632 40.8597537998632774 123.399184805270 +7633 0.7633 40.8474026804810748 123.623202838740 +7634 0.7634 40.8350291656785558 123.847093211700 +7635 0.7635 40.8226332682224324 124.070855910810 +7636 0.7636 40.8102150008807456 124.294490922860 +7637 0.7637 40.7977743764228649 124.517998234780 +7638 0.7638 40.7853114076194458 124.741377833630 +7639 0.7639 40.7728261072424374 124.964629706580 +7640 0.7640 40.7603184880650602 125.187753840920 +7641 0.7641 40.7477885628618068 125.410750224110 +7642 0.7642 40.7352363444084133 125.633618843730 +7643 0.7643 40.7226618454818521 125.856359687450 +7644 0.7644 40.7100650788603247 126.078972743090 +7645 0.7645 40.6974460573232406 126.301457998610 +7646 0.7646 40.6848047936512032 126.523815442100 +7647 0.7647 40.6721413006260093 126.746045061750 +7648 0.7648 40.6594555910306283 126.968146845900 +7649 0.7649 40.6467476776491807 127.190120783010 +7650 0.7650 40.6340175732669451 127.411966861660 +7651 0.7651 40.6212652906703369 127.633685070570 +7652 0.7652 40.6084908426468800 127.855275398600 +7653 0.7653 40.5956942419852140 128.076737834680 +7654 0.7654 40.5828755014750868 128.298072367930 +7655 0.7655 40.5700346339073121 128.519278987550 +7656 0.7656 40.5571716520737908 128.740357682900 +7657 0.7657 40.5442865687674754 128.961308443440 +7658 0.7658 40.5313793967823628 129.182131258760 +7659 0.7659 40.5184501489134945 129.402826118610 +7660 0.7660 40.5054988379569210 129.623393012800 +7661 0.7661 40.4925254767097158 129.843831931300 +7662 0.7662 40.4795300779699403 130.064142864230 +7663 0.7663 40.4665126545366363 130.284325801780 +7664 0.7664 40.4534732192098332 130.504380734320 +7665 0.7665 40.4404117847905056 130.724307652280 +7666 0.7666 40.4273283640805801 130.944106546290 +7667 0.7667 40.4142229698829141 131.163777407030 +7668 0.7668 40.4010956150012959 131.383320225350 +7669 0.7669 40.3879463122404161 131.602734992200 +7670 0.7670 40.3747750744058749 131.822021698670 +7671 0.7671 40.3615819143041463 132.041180335960 +7672 0.7672 40.3483668447425785 132.260210895400 +7673 0.7673 40.3351298785293864 132.479113368440 +7674 0.7674 40.3218710284736304 132.697887746640 +7675 0.7675 40.3085903073852165 132.916534021680 +7676 0.7676 40.2952877280748609 133.135052185400 +7677 0.7677 40.2819633033541038 133.353442229730 +7678 0.7678 40.2686170460352812 133.571704146710 +7679 0.7679 40.2552489689315180 133.789837928520 +7680 0.7680 40.2418590848567206 134.007843567490 +7681 0.7681 40.2284474066255484 134.225721055990 +7682 0.7682 40.2150139470534214 134.443470386580 +7683 0.7683 40.2015587189564982 134.661091551930 +7684 0.7684 40.1880817351516626 134.878584544810 +7685 0.7685 40.1745830084565156 135.095949358090 +7686 0.7686 40.1610625516893691 135.313185984830 +7687 0.7687 40.1475203776692240 135.530294418140 +7688 0.7688 40.1339564992157491 135.747274651290 +7689 0.7689 40.1203709291493027 135.964126677640 +7690 0.7690 40.1067636802908822 136.180850490700 +7691 0.7691 40.0931347654621462 136.397446084060 +7692 0.7692 40.0794841974853711 136.613913451470 +7693 0.7693 40.0658119891834588 136.830252586770 +7694 0.7694 40.0521181533799222 137.046463483930 +7695 0.7695 40.0384027028988712 137.262546137030 +7696 0.7696 40.0246656505650051 137.478500540260 +7697 0.7697 40.0109070092035921 137.694326687970 +7698 0.7698 39.9971267916404685 137.910024574560 +7699 0.7699 39.9833250107020106 138.125594194610 +7700 0.7700 39.9695016792151421 138.341035542770 +7701 0.7701 39.9556568100073122 138.556348613840 +7702 0.7702 39.9417904159064818 138.771533402710 +7703 0.7703 39.9279025097411235 138.986589904410 +7704 0.7704 39.9139931043402001 139.201518114060 +7705 0.7705 39.9000622125331503 139.416318026940 +7706 0.7706 39.8861098471498821 139.630989638380 +7707 0.7707 39.8721360210207720 139.845532943880 +7708 0.7708 39.8581407469766233 140.059947939030 +7709 0.7709 39.8441240378486938 140.274234619540 +7710 0.7710 39.8300859064686534 140.488392981240 +7711 0.7711 39.8160263656685913 140.702423020060 +7712 0.7712 39.8019454282809875 140.916324732080 +7713 0.7713 39.7878431071387126 141.130098113440 +7714 0.7714 39.7737194150750213 141.343743160440 +7715 0.7715 39.7595743649235231 141.557259869470 +7716 0.7716 39.7454079695181974 141.770648237040 +7717 0.7717 39.7312202416933573 141.983908259780 +7718 0.7718 39.7170111942836499 142.197039934430 +7719 0.7719 39.7027808401240350 142.410043257830 +7720 0.7720 39.6885291920497991 142.622918226930 +7721 0.7721 39.6742562628965132 142.835664838830 +7722 0.7722 39.6599620655000322 143.048283090720 +7723 0.7723 39.6456466126965026 143.260772979870 +7724 0.7724 39.6313099173223193 143.473134503730 +7725 0.7725 39.6169519922141404 143.685367659810 +7726 0.7726 39.6025728502088654 143.897472445730 +7727 0.7727 39.5881725041436141 144.109448859250 +7728 0.7728 39.5737509668557408 144.321296898230 +7729 0.7729 39.5593082511827987 144.533016560640 +7730 0.7730 39.5448443699625400 144.744607844560 +7731 0.7731 39.5303593360329018 144.956070748170 +7732 0.7732 39.5158531622320055 145.167405269800 +7733 0.7733 39.5013258613981222 145.378611407840 +7734 0.7734 39.4867774463696861 145.589689160820 +7735 0.7735 39.4722079299852737 145.800638527380 +7736 0.7736 39.4576173250835893 146.011459506250 +7737 0.7737 39.4430056445034651 146.222152096280 +7738 0.7738 39.4283729010838329 146.432716296430 +7739 0.7739 39.4137191076637237 146.643152105790 +7740 0.7740 39.3990442770822611 146.853459523530 +7741 0.7741 39.3843484221786397 147.063638548930 +7742 0.7742 39.3696315557921253 147.273689181410 +7743 0.7743 39.3548936907620330 147.483611420450 +7744 0.7744 39.3401348399277282 147.693405265680 +7745 0.7745 39.3253550161286043 147.903070716820 +7746 0.7746 39.3105542322040762 148.112607773710 +7747 0.7747 39.2957325009935801 148.322016436260 +7748 0.7748 39.2808898353365379 148.531296704540 +7749 0.7749 39.2660262480723787 148.740448578710 +7750 0.7750 39.2511417520404962 148.949472059000 +7751 0.7751 39.2362363600802553 149.158367145800 +7752 0.7752 39.2213100850309857 149.367133839600 +7753 0.7753 39.2063629397319602 149.575772140940 +7754 0.7754 39.1913949370223875 149.784282050540 +7755 0.7755 39.1764060897413984 149.992663569180 +7756 0.7756 39.1613964107280523 150.200916697770 +7757 0.7757 39.1463659128212953 150.409041437310 +7758 0.7758 39.1313146088599879 150.617037788900 +7759 0.7759 39.1162425116828558 150.824905753780 +7760 0.7760 39.1011496341285039 151.032645333260 +7761 0.7761 39.0860359890354019 151.240256528770 +7762 0.7762 39.0709015892418705 151.447739341840 +7763 0.7763 39.0557464475860741 151.655093774120 +7764 0.7764 39.0405705769059992 151.862319827340 +7765 0.7765 39.0253739900394621 152.069417503350 +7766 0.7766 39.0101566998240870 152.276386804110 +7767 0.7767 38.9949187190972992 152.483227731660 +7768 0.7768 38.9796600606963111 152.689940288170 +7769 0.7769 38.9643807374581073 152.896524475910 +7770 0.7770 38.9490807622194524 153.102980297250 +7771 0.7771 38.9337601478168551 153.309307754630 +7772 0.7772 38.9184189070865898 153.515506850640 +7773 0.7773 38.9030570528646606 153.721577587980 +7774 0.7774 38.8876745979867948 153.927519969400 +7775 0.7775 38.8722715552884353 154.133333997800 +7776 0.7776 38.8568479376047407 154.339019676150 +7777 0.7777 38.8414037577705571 154.544577007550 +7778 0.7778 38.8259390286204180 154.750005995190 +7779 0.7779 38.8104537629885442 154.955306642350 +7780 0.7780 38.7949479737088012 155.160478952440 +7781 0.7781 38.7794216736147348 155.365522928940 +7782 0.7782 38.7638748755395142 155.570438575440 +7783 0.7783 38.7483075923159603 155.775225895670 +7784 0.7784 38.7327198367765035 155.979884893400 +7785 0.7785 38.7171116217532045 156.184415572540 +7786 0.7786 38.7014829600777261 156.388817937080 +7787 0.7787 38.6858338645813120 156.593091991140 +7788 0.7788 38.6701643480948078 156.797237738920 +7789 0.7789 38.6544744234486259 157.001255184720 +7790 0.7790 38.6387641034727451 157.205144332920 +7791 0.7791 38.6230334009966967 157.408905188050 +7792 0.7792 38.6072823288495570 157.612537754700 +7793 0.7793 38.5915108998599408 157.816042037580 +7794 0.7794 38.5757191268559865 158.019418041480 +7795 0.7795 38.5599070226653495 158.222665771300 +7796 0.7796 38.5440746001151808 158.425785232050 +7797 0.7797 38.5282218720321339 158.628776428820 +7798 0.7798 38.5123488512423506 158.831639366810 +7799 0.7799 38.4964555505714472 159.034374051310 +7800 0.7800 38.4805419828444926 159.236980487720 +7801 0.7801 38.4646081608860300 159.439458681540 +7802 0.7802 38.4486540975200342 159.641808638330 +7803 0.7803 38.4326798055699257 159.844030363800 +7804 0.7804 38.4166852978585496 160.046123863750 +7805 0.7805 38.4006705872081611 160.248089144030 +7806 0.7806 38.3846356864404257 160.449926210650 +7807 0.7807 38.3685806083764120 160.651635069660 +7808 0.7808 38.3525053658365636 160.853215727260 +7809 0.7809 38.3364099716407125 161.054668189700 +7810 0.7810 38.3202944386080588 161.255992463360 +7811 0.7811 38.3041587795571559 161.457188554710 +7812 0.7812 38.2880030073059032 161.658256470290 +7813 0.7813 38.2718271346715468 161.859196216770 +7814 0.7814 38.2556311744706647 162.060007800910 +7815 0.7815 38.2394151395191386 162.260691229550 +7816 0.7816 38.2231790426321822 162.461246509640 +7817 0.7817 38.2069228966242918 162.661673648220 +7818 0.7818 38.1906467143092598 162.861972652410 +7819 0.7819 38.1743505085001686 163.062143529450 +7820 0.7820 38.1580342920093614 163.262186286680 +7821 0.7821 38.1416980776484493 163.462100931490 +7822 0.7822 38.1253418782283049 163.661887471430 +7823 0.7823 38.1089657065590259 163.861545914080 +7824 0.7824 38.0925695754499642 164.061076267170 +7825 0.7825 38.0761534977096829 164.260478538470 +7826 0.7826 38.0597174861459635 164.459752735890 +7827 0.7827 38.0432615535657987 164.658898867410 +7828 0.7828 38.0267857127753715 164.857916941110 +7829 0.7829 38.0102899765800544 165.056806965170 +7830 0.7830 37.9937743577844032 165.255568947840 +7831 0.7831 37.9772388691921350 165.454202897500 +7832 0.7832 37.9606835236061286 165.652708822590 +7833 0.7833 37.9441083338284173 165.851086731660 +7834 0.7834 37.9275133126601673 166.049336633340 +7835 0.7835 37.9108984729016854 166.247458536360 +7836 0.7836 37.8942638273523897 166.445452449560 +7837 0.7837 37.8776093888108178 166.643318381830 +7838 0.7838 37.8609351700746188 166.841056342210 +7839 0.7839 37.8442411839405182 167.038666339760 +7840 0.7840 37.8275274432043460 167.236148383710 +7841 0.7841 37.8107939606609946 167.433502483300 +7842 0.7842 37.7940407491044326 167.630728647940 +7843 0.7843 37.7772678213276834 167.827826887080 +7844 0.7844 37.7604751901228184 168.024797210270 +7845 0.7845 37.7436628682809499 168.221639627170 +7846 0.7846 37.7268308685922165 168.418354147510 +7847 0.7847 37.7099792038457835 168.614940781110 +7848 0.7848 37.6931078868298357 168.811399537900 +7849 0.7849 37.6762169303315488 169.007730427890 +7850 0.7850 37.6593063471370968 169.203933461180 +7851 0.7851 37.6423761500316374 169.400008647940 +7852 0.7852 37.6254263517993195 169.595955998470 +7853 0.7853 37.6084569652232403 169.791775523130 +7854 0.7854 37.5914680030854669 169.987467232380 +7855 0.7855 37.5744594781670074 170.183031136770 +7856 0.7856 37.5574314032478256 170.378467246920 +7857 0.7857 37.5403837911067981 170.573775573580 +7858 0.7858 37.5233166545217429 170.768956127530 +7859 0.7859 37.5062300062693836 170.964008919700 +7860 0.7860 37.4891238591253426 171.158933961070 +7861 0.7861 37.4719982258641551 171.353731262740 +7862 0.7862 37.4548531192592264 171.548400835840 +7863 0.7863 37.4376885520828537 171.742942691660 +7864 0.7864 37.4205045371061971 171.937356841520 +7865 0.7865 37.4033010870992797 172.131643296860 +7866 0.7866 37.3860782148309738 172.325802069210 +7867 0.7867 37.3688359330690076 172.519833170170 +7868 0.7868 37.3515742545799299 172.713736611410 +7869 0.7869 37.3342931921291239 172.907512404740 +7870 0.7870 37.3169927584807866 173.101160562020 +7871 0.7871 37.2996729663979281 173.294681095200 +7872 0.7872 37.2823338286423507 173.488074016320 +7873 0.7873 37.2649753579746630 173.681339337500 +7874 0.7874 37.2475975671542372 173.874477070990 +7875 0.7875 37.2302004689392376 174.067487229050 +7876 0.7876 37.2127840760865851 174.260369824070 +7877 0.7877 37.1953484013519571 174.453124868540 +7878 0.7878 37.1778934574897804 174.645752375010 +7879 0.7879 37.1604192572532241 174.838252356120 +7880 0.7880 37.1429258133941858 175.030624824590 +7881 0.7881 37.1254131386632906 175.222869793270 +7882 0.7882 37.1078812458098781 175.414987275010 +7883 0.7883 37.0903301475819873 175.606977282830 +7884 0.7884 37.0727598567263570 175.798839829770 +7885 0.7885 37.0551703859884185 175.990574929010 +7886 0.7886 37.0375617481122816 176.182182593770 +7887 0.7887 37.0199339558407274 176.373662837380 +7888 0.7888 37.0022870219151940 176.565015673250 +7889 0.7889 36.9846209590757908 176.756241114860 +7890 0.7890 36.9669357800612559 176.947339175780 +7891 0.7891 36.9492314976089844 177.138309869690 +7892 0.7892 36.9315081244549859 177.329153210320 +7893 0.7893 36.9137656733338986 177.519869211470 +7894 0.7894 36.8960041569789681 177.710457887090 +7895 0.7895 36.8782235881220544 177.900919251150 +7896 0.7896 36.8604239794936106 178.091253317710 +7897 0.7897 36.8426053438226759 178.281460100950 +7898 0.7898 36.8247676938368755 178.471539615120 +7899 0.7899 36.8069110422623922 178.661491874500 +7900 0.7900 36.7890354018239876 178.851316893530 +7901 0.7901 36.7711407852449739 179.041014686680 +7902 0.7902 36.7532272052472138 179.230585268540 +7903 0.7903 36.7352946745510991 179.420028653730 +7904 0.7904 36.7173432058755651 179.609344857010 +7905 0.7905 36.6993728119380549 179.798533893170 +7906 0.7906 36.6813835054545407 179.987595777130 +7907 0.7907 36.6633752991394957 180.176530523840 +7908 0.7908 36.6453482057058864 180.365338148380 +7909 0.7909 36.6273022378651731 180.554018665900 +7910 0.7910 36.6092374083273029 180.742572091570 +7911 0.7911 36.5911537298006877 180.930998440750 +7912 0.7912 36.5730512149922120 181.119297728780 +7913 0.7913 36.5549298766072184 181.307469971150 +7914 0.7914 36.5367897273494933 181.495515183380 +7915 0.7915 36.5186307799212670 181.683433381110 +7916 0.7916 36.5004530470232069 181.871224580030 +7917 0.7917 36.4822565413544098 182.058888795920 +7918 0.7918 36.4640412756123808 182.246426044660 +7919 0.7919 36.4458072624930409 182.433836342170 +7920 0.7920 36.4275545146907049 182.621119704490 +7921 0.7921 36.4092830448980962 182.808276147710 +7922 0.7922 36.3909928658063109 182.995305688010 +7923 0.7923 36.3726839901048251 183.182208341650 +7924 0.7924 36.3543564304814950 183.368984124960 +7925 0.7925 36.3360101996225282 183.555633054370 +7926 0.7926 36.3176453102124910 183.742155146380 +7927 0.7927 36.2992617749342941 183.928550417530 +7928 0.7928 36.2808596064691926 184.114818884510 +7929 0.7929 36.2624388174967649 184.300960564030 +7930 0.7930 36.2439994206949194 184.486975472890 +7931 0.7931 36.2255414287398736 184.672863627980 +7932 0.7932 36.2070648543061608 184.858625046280 +7933 0.7933 36.1885697100666093 185.044259744820 +7934 0.7934 36.1700560086923346 185.229767740710 +7935 0.7935 36.1515237628527402 185.415149051160 +7936 0.7936 36.1329729852155097 185.600403693430 +7937 0.7937 36.1144036884465933 185.785531684870 +7938 0.7938 36.0958158852102073 185.970533042910 +7939 0.7939 36.0772095881688060 186.155407785060 +7940 0.7940 36.0585848099831097 186.340155928890 +7941 0.7941 36.0399415633120626 186.524777492060 +7942 0.7942 36.0212798608128466 186.709272492300 +7943 0.7943 36.0025997151408603 186.893640947420 +7944 0.7944 35.9839011389497259 187.077882875300 +7945 0.7945 35.9651841448912677 187.261998293910 +7946 0.7946 35.9464487456155055 187.445987221290 +7947 0.7947 35.9276949537706614 187.629849675530 +7948 0.7948 35.9089227820031454 187.813585674830 +7949 0.7949 35.8901322429575345 187.997195237450 +7950 0.7950 35.8713233492765724 188.180678381740 +7951 0.7951 35.8524961136011839 188.364035126100 +7952 0.7952 35.8336505485704251 188.547265489020 +7953 0.7953 35.8147866668215187 188.730369489060 +7954 0.7954 35.7959044809898188 188.913347144870 +7955 0.7955 35.7770040037088179 189.096198475140 +7956 0.7956 35.7580852476101256 189.278923498660 +7957 0.7957 35.7391482253234756 189.461522234310 +7958 0.7958 35.7201929494767114 189.643994701010 +7959 0.7959 35.7012194326957726 189.826340917760 +7960 0.7960 35.6822276876047013 190.008560903670 +7961 0.7961 35.6632177268256214 190.190654677860 +7962 0.7962 35.6441895629787524 190.372622259580 +7963 0.7963 35.6251432086823669 190.554463668120 +7964 0.7964 35.6060786765528192 190.736178922870 +7965 0.7965 35.5869959792045094 190.917768043280 +7966 0.7966 35.5678951292499050 191.099231048850 +7967 0.7967 35.5487761392995054 191.280567959200 +7968 0.7968 35.5296390219618488 191.461778793980 +7969 0.7969 35.5104837898435051 191.642863572940 +7970 0.7970 35.4913104555490619 191.823822315880 +7971 0.7971 35.4721190316811317 192.004655042690 +7972 0.7972 35.4529095308403299 192.185361773330 +7973 0.7973 35.4336819656252686 192.365942527830 +7974 0.7974 35.4144363486325631 192.546397326300 +7975 0.7975 35.3951726924568035 192.726726188880 +7976 0.7976 35.3758910096905694 192.906929135850 +7977 0.7977 35.3565913129244009 193.087006187500 +7978 0.7978 35.3372736147468132 193.266957364230 +7979 0.7979 35.3179379277442749 193.446782686500 +7980 0.7980 35.2985842645012085 193.626482174830 +7981 0.7981 35.2792126375999757 193.806055849830 +7982 0.7982 35.2598230596208779 193.985503732160 +7983 0.7983 35.2404155431421415 194.164825842560 +7984 0.7984 35.2209901007399182 194.344022201870 +7985 0.7985 35.2015467449882777 194.523092830930 +7986 0.7986 35.1820854884591938 194.702037750720 +7987 0.7987 35.1626063437225440 194.880856982270 +7988 0.7988 35.1431093233460956 195.059550546650 +7989 0.7989 35.1235944398955127 195.238118465040 +7990 0.7990 35.1040617059343276 195.416560758650 +7991 0.7991 35.0845111340239555 195.594877448820 +7992 0.7992 35.0649427367236726 195.773068556890 +7993 0.7993 35.0453565265906093 195.951134104320 +7994 0.7994 35.0257525161797645 196.129074112600 +7995 0.7995 35.0061307180439698 196.306888603340 +7996 0.7996 34.9864911447338969 196.484577598160 +7997 0.7997 34.9668338087980501 196.662141118780 +7998 0.7998 34.9471587227827598 196.839579187010 +7999 0.7999 34.9274658992321747 197.016891824680 +8000 0.8000 34.9077553506882552 197.194079053720 +8001 0.8001 34.8880270896907660 197.371140896130 +8002 0.8002 34.8682811287772623 197.548077373970 +8003 0.8003 34.8485174804830962 197.724888509350 +8004 0.8004 34.8287361573414032 197.901574324480 +8005 0.8005 34.8089371718830947 198.078134841620 +8006 0.8006 34.7891205366368581 198.254570083110 +8007 0.8007 34.7692862641291356 198.430880071340 +8008 0.8008 34.7494343668841310 198.607064828780 +8009 0.8009 34.7295648574237958 198.783124377960 +8010 0.8010 34.7096777482678220 198.959058741470 +8011 0.8011 34.6897730519336491 199.134867942000 +8012 0.8012 34.6698507809364358 199.310552002270 +8013 0.8013 34.6499109477890670 199.486110945090 +8014 0.8014 34.6299535650021468 199.661544793320 +8015 0.8015 34.6099786450839844 199.836853569900 +8016 0.8016 34.5899862005406007 200.012037297830 +8017 0.8017 34.5699762438757006 200.187096000180 +8018 0.8018 34.5499487875906865 200.362029700080 +8019 0.8019 34.5299038441846449 200.536838420730 +8020 0.8020 34.5098414261543383 200.711522185400 +8021 0.8021 34.4897615459941989 200.886081017400 +8022 0.8022 34.4696642161963211 201.060514940160 +8023 0.8023 34.4495494492504548 201.234823977120 +8024 0.8024 34.4294172576440047 201.409008151820 +8025 0.8025 34.4092676538620239 201.583067487830 +8026 0.8026 34.3891006503871921 201.757002008840 +8027 0.8027 34.3689162596998230 201.930811738560 +8028 0.8028 34.3487144942778571 202.104496700780 +8029 0.8029 34.3284953665968544 202.278056919340 +8030 0.8030 34.3082588891299807 202.451492418170 +8031 0.8031 34.2880050743480069 202.624803221250 +8032 0.8032 34.2677339347193097 202.797989352630 +8033 0.8033 34.2474454827098569 202.971050836410 +8034 0.8034 34.2271397307832004 203.143987696780 +8035 0.8035 34.2068166914004621 203.316799957970 +8036 0.8036 34.1864763770203481 203.489487644270 +8037 0.8037 34.1661188000991274 203.662050780080 +8038 0.8038 34.1457439730906316 203.834489389800 +8039 0.8039 34.1253519084462411 204.006803497940 +8040 0.8040 34.1049426186148921 204.178993129050 +8041 0.8041 34.0845161160430550 204.351058307750 +8042 0.8042 34.0640724131747277 204.522999058730 +8043 0.8043 34.0436115224514566 204.694815406740 +8044 0.8044 34.0231334563122942 204.866507376570 +8045 0.8045 34.0026382271938132 205.038074993100 +8046 0.8046 33.9821258475300922 205.209518281300 +8047 0.8047 33.9615963297527230 205.380837266120 +8048 0.8048 33.9410496862907820 205.552031972640 +8049 0.8049 33.9204859295708516 205.723102425980 +8050 0.8050 33.8999050720169848 205.894048651330 +8051 0.8051 33.8793071260507190 206.064870673940 +8052 0.8052 33.8586921040910696 206.235568519100 +8053 0.8053 33.8380600185545006 206.406142212210 +8054 0.8054 33.8174108818549541 206.576591778670 +8055 0.8055 33.7967447064038211 206.746917243990 +8056 0.8056 33.7760615046099346 206.917118633730 +8057 0.8057 33.7553612888795698 207.087195973510 +8058 0.8058 33.7346440716164437 207.257149288990 +8059 0.8059 33.7139098652216944 207.426978605930 +8060 0.8060 33.6931586820938946 207.596683950100 +8061 0.8061 33.6723905346290167 207.766265347390 +8062 0.8062 33.6516054352204605 207.935722823720 +8063 0.8063 33.6308033962590187 208.105056405050 +8064 0.8064 33.6099844301328901 208.274266117460 +8065 0.8065 33.5891485492276658 208.443351987010 +8066 0.8066 33.5682957659263224 208.612314039890 +8067 0.8067 33.5474260926092143 208.781152302330 +8068 0.8068 33.5265395416540670 208.949866800590 +8069 0.8069 33.5056361254359842 209.118457561040 +8070 0.8070 33.4847158563274263 209.286924610060 +8071 0.8071 33.4637787466982175 209.455267974130 +8072 0.8072 33.4428248089155247 209.623487679760 +8073 0.8073 33.4218540553438572 209.791583753550 +8074 0.8074 33.4008664983450743 209.959556222130 +8075 0.8075 33.3798621502783561 210.127405112200 +8076 0.8076 33.3588410235002186 210.295130450520 +8077 0.8077 33.3378031303644988 210.462732263920 +8078 0.8078 33.3167484832223408 210.630210579260 +8079 0.8079 33.2956770944222029 210.797565423490 +8080 0.8080 33.2745889763098504 210.964796823600 +8081 0.8081 33.2534841412283413 211.131904806650 +8082 0.8082 33.2323626015180196 211.298889399760 +8083 0.8083 33.2112243695165290 211.465750630070 +8084 0.8084 33.1900694575587849 211.632488524830 +8085 0.8085 33.1688978779769741 211.799103111340 +8086 0.8086 33.1477096431005620 211.965594416920 +8087 0.8087 33.1265047652562643 212.131962468990 +8088 0.8088 33.1052832567680682 212.298207295000 +8089 0.8089 33.0840451299571967 212.464328922480 +8090 0.8090 33.0627903971421233 212.630327378980 +8091 0.8091 33.0415190706385644 212.796202692160 +8092 0.8092 33.0202311627594725 212.961954889710 +8093 0.8093 32.9989266858150216 213.127583999360 +8094 0.8094 32.9776056521126080 213.293090048920 +8095 0.8095 32.9562680739568492 213.458473066270 +8096 0.8096 32.9349139636495707 213.623733079300 +8097 0.8097 32.9135433334898053 213.788870116010 +8098 0.8098 32.8921561957737865 213.953884204410 +8099 0.8099 32.8707525627949337 214.118775372600 +8100 0.8100 32.8493324468438672 214.283543648720 +8101 0.8101 32.8278958602083790 214.448189060980 +8102 0.8102 32.8064428151734475 214.612711637630 +8103 0.8103 32.7849733240212160 214.777111406980 +8104 0.8104 32.7634873990309998 214.941388397410 +8105 0.8105 32.7419850524792651 215.105542637330 +8106 0.8106 32.7204662966396356 215.269574155230 +8107 0.8107 32.6989311437828931 215.433482979640 +8108 0.8108 32.6773796061769559 215.597269139160 +8109 0.8109 32.6558116960868787 215.760932662430 +8110 0.8110 32.6342274257748528 215.924473578150 +8111 0.8111 32.6126268075001917 216.087891915090 +8112 0.8112 32.5910098535193384 216.251187702040 +8113 0.8113 32.5693765760858440 216.414360967900 +8114 0.8114 32.5477269874503676 216.577411741560 +8115 0.8115 32.5260610998606907 216.740340052010 +8116 0.8116 32.5043789255616744 216.903145928270 +8117 0.8117 32.4826804767952879 217.065829399450 +8118 0.8118 32.4609657658005801 217.228390494670 +8119 0.8119 32.4392348048136867 217.390829243140 +8120 0.8120 32.4174876060678230 217.553145674090 +8121 0.8121 32.3957241817932768 217.715339816830 +8122 0.8122 32.3739445442174016 217.877411700720 +8123 0.8123 32.3521487055646091 218.039361355170 +8124 0.8124 32.3303366780563692 218.201188809640 +8125 0.8125 32.3085084739112034 218.362894093660 +8126 0.8126 32.2866641053446841 218.524477236780 +8127 0.8127 32.2648035845694139 218.685938268640 +8128 0.8128 32.2429269237950393 218.847277218920 +8129 0.8129 32.2210341352282228 219.008494117340 +8130 0.8130 32.1991252310726708 219.169588993690 +8131 0.8131 32.1772002235290984 219.330561877810 +8132 0.8132 32.1552591247952293 219.491412799580 +8133 0.8133 32.1333019470658030 219.652141788950 +8134 0.8134 32.1113287025325604 219.812748875920 +8135 0.8135 32.0893394033842370 219.973234090520 +8136 0.8136 32.0673340618065694 220.133597462880 +8137 0.8137 32.0453126899822678 220.293839023120 +8138 0.8138 32.0232753000910364 220.453958801460 +8139 0.8139 32.0012219043095527 220.613956828170 +8140 0.8140 31.9791525148114637 220.773833133540 +8141 0.8141 31.9570671437673894 220.933587747920 +8142 0.8142 31.9349658033449053 221.093220701760 +8143 0.8143 31.9128485057085420 221.252732025490 +8144 0.8144 31.8907152630197857 221.412121749640 +8145 0.8145 31.8685660874370633 221.571389904790 +8146 0.8146 31.8464009911157468 221.730536521520 +8147 0.8147 31.8242199862081421 221.889561630550 +8148 0.8148 31.8020230848634853 222.048465262560 +8149 0.8149 31.7798102992279397 222.207247448340 +8150 0.8150 31.7575816414445882 222.365908218710 +8151 0.8151 31.7353371236534230 222.524447604560 +8152 0.8152 31.7130767579913559 222.682865636780 +8153 0.8153 31.6908005565921975 222.841162346370 +8154 0.8154 31.6685085315866601 222.999337764360 +8155 0.8155 31.6462006951023511 223.157391921820 +8156 0.8156 31.6238770592637657 223.315324849860 +8157 0.8157 31.6015376361922904 223.473136579670 +8158 0.8158 31.5791824380061819 223.630827142480 +8159 0.8159 31.5568114768205810 223.788396569570 +8160 0.8160 31.5344247647474916 223.945844892250 +8161 0.8161 31.5120223138957840 224.103172141910 +8162 0.8162 31.4896041363711880 224.260378349980 +8163 0.8163 31.4671702442762928 224.417463547930 +8164 0.8164 31.4447206497105327 224.574427767280 +8165 0.8165 31.4222553647701872 224.731271039600 +8166 0.8166 31.3997744015483811 224.887993396530 +8167 0.8167 31.3772777721350664 225.044594869750 +8168 0.8168 31.3547654886170299 225.201075490960 +8169 0.8169 31.3322375630778858 225.357435291940 +8170 0.8170 31.3096940075980648 225.513674304500 +8171 0.8171 31.2871348342548146 225.669792560530 +8172 0.8172 31.2645600551221925 225.825790091940 +8173 0.8173 31.2419696822710620 225.981666930690 +8174 0.8174 31.2193637277690890 226.137423108790 +8175 0.8175 31.1967422036807349 226.293058658310 +8176 0.8176 31.1741051220672496 226.448573611370 +8177 0.8177 31.1514524949866747 226.603968000120 +8178 0.8178 31.1287843344938295 226.759241856770 +8179 0.8179 31.1061006526403112 226.914395213570 +8180 0.8180 31.0834014614744909 227.069428102840 +8181 0.8181 31.0606867730415033 227.224340556910 +8182 0.8182 31.0379565993832500 227.379132608180 +8183 0.8183 31.0152109525383857 227.533804289110 +8184 0.8184 30.9924498445423211 227.688355632200 +8185 0.8185 30.9696732874272129 227.842786669960 +8186 0.8186 30.9468812932219635 227.997097435010 +8187 0.8187 30.9240738739522136 228.151287959970 +8188 0.8188 30.9012510416403394 228.305358277530 +8189 0.8189 30.8784128083054412 228.459308420420 +8190 0.8190 30.8555591859633509 228.613138421400 +8191 0.8191 30.8326901866266141 228.766848313310 +8192 0.8192 30.8098058223044973 228.920438129020 +8193 0.8193 30.7869061050029735 229.073907901440 +8194 0.8194 30.7639910467247262 229.227257663540 +8195 0.8195 30.7410606594691309 229.380487448330 +8196 0.8196 30.7181149552322736 229.533597288840 +8197 0.8197 30.6951539460069220 229.686587218200 +8198 0.8198 30.6721776437825326 229.839457269570 +8199 0.8199 30.6491860605452473 229.992207476110 +8200 0.8200 30.6261792082778861 230.144837871080 +8201 0.8201 30.6031570989599437 230.297348487750 +8202 0.8202 30.5801197445675825 230.449739359470 +8203 0.8203 30.5570671570736287 230.602010519610 +8204 0.8204 30.5339993484475691 230.754162001590 +8205 0.8205 30.5109163306555473 230.906193838870 +8206 0.8206 30.4878181156603532 231.058106064990 +8207 0.8207 30.4647047154214299 231.209898713480 +8208 0.8208 30.4415761418948598 231.361571817950 +8209 0.8209 30.4184324070333609 231.513125412060 +8210 0.8210 30.3952735227862831 231.664559529500 +8211 0.8211 30.3720995010996084 231.815874204000 +8212 0.8212 30.3489103539159402 231.967069469340 +8213 0.8213 30.3257060931745031 232.118145359370 +8214 0.8214 30.3024867308111361 232.269101907940 +8215 0.8215 30.2792522787582890 232.419939148980 +8216 0.8216 30.2560027489450185 232.570657116450 +8217 0.8217 30.2327381532969781 232.721255844340 +8218 0.8218 30.2094585037364247 232.871735366710 +8219 0.8219 30.1861638121822047 233.022095717660 +8220 0.8220 30.1628540905497573 233.172336931320 +8221 0.8221 30.1395293507510971 233.322459041860 +8222 0.8222 30.1161896046948279 233.472462083540 +8223 0.8223 30.0928348642861216 233.622346090600 +8224 0.8224 30.0694651414267256 233.772111097350 +8225 0.8225 30.0460804480149513 233.921757138150 +8226 0.8226 30.0226807959456714 234.071284247430 +8227 0.8227 29.9992661971103196 234.220692459590 +8228 0.8228 29.9758366633968834 234.369981809140 +8229 0.8229 29.9523922066898969 234.519152330590 +8230 0.8230 29.9289328388704412 234.668204058530 +8231 0.8231 29.9054585718161370 234.817137027570 +8232 0.8232 29.8819694174011410 234.965951272370 +8233 0.8233 29.8584653874961425 235.114646827620 +8234 0.8234 29.8349464939683564 235.263223728080 +8235 0.8235 29.8114127486815264 235.411682008520 +8236 0.8236 29.7878641634959109 235.560021703770 +8237 0.8237 29.7643007502682870 235.708242848710 +8238 0.8238 29.7407225208519392 235.856345478250 +8239 0.8239 29.7171294870966598 236.004329627350 +8240 0.8240 29.6935216608487416 236.152195330990 +8241 0.8241 29.6698990539509815 236.299942624230 +8242 0.8242 29.6462616782426629 236.447571542130 +8243 0.8243 29.6226095455595662 236.595082119830 +8244 0.8244 29.5989426677339509 236.742474392490 +8245 0.8245 29.5752610565945595 236.889748395310 +8246 0.8246 29.5515647239666173 237.036904163550 +8247 0.8247 29.5278536816718145 237.183941732480 +8248 0.8248 29.5041279415283171 237.330861137450 +8249 0.8249 29.4803875153507526 237.477662413830 +8250 0.8250 29.4566324149502101 237.624345597030 +8251 0.8251 29.4328626521342329 237.770910722490 +8252 0.8252 29.4090782387068224 237.917357825730 +8253 0.8253 29.3852791864684235 238.063686942270 +8254 0.8254 29.3614655072159252 238.209898107690 +8255 0.8255 29.3376372127426599 238.355991357630 +8256 0.8256 29.3137943148383933 238.501966727700 +8257 0.8257 29.2899368252893275 238.647824253650 +8258 0.8258 29.2660647558780838 238.793563971190 +8259 0.8259 29.2421781183837197 238.939185916100 +8260 0.8260 29.2182769245817049 239.084690124210 +8261 0.8261 29.1943611862439241 239.230076631380 +8262 0.8262 29.1704309151386774 239.375345473520 +8263 0.8263 29.1464861230306731 239.520496686530 +8264 0.8264 29.1225268216810242 239.665530306440 +8265 0.8265 29.0985530228472413 239.810446369250 +8266 0.8266 29.0745647382832288 239.955244911020 +8267 0.8267 29.0505619797392853 240.099925967840 +8268 0.8268 29.0265447589620997 240.244489575870 +8269 0.8269 29.0025130876947408 240.388935771280 +8270 0.8270 28.9784669776766641 240.533264590280 +8271 0.8271 28.9544064406436945 240.677476069130 +8272 0.8272 28.9303314883280329 240.821570244130 +8273 0.8273 28.9062421324582459 240.965547151630 +8274 0.8274 28.8821383847592656 241.109406827990 +8275 0.8275 28.8580202569523863 241.253149309620 +8276 0.8276 28.8338877607552568 241.396774632980 +8277 0.8277 28.8097409078818814 241.540282834560 +8278 0.8278 28.7855797100426081 241.683673950900 +8279 0.8279 28.7614041789441366 241.826948018550 +8280 0.8280 28.7372143262895037 241.970105074130 +8281 0.8281 28.7130101637780832 242.113145154290 +8282 0.8282 28.6887917031055828 242.256068295700 +8283 0.8283 28.6645589559640435 242.398874535100 +8284 0.8284 28.6403119340418257 242.541563909230 +8285 0.8285 28.6160506490236166 242.684136454920 +8286 0.8286 28.5917751125904225 242.826592208970 +8287 0.8287 28.5674853364195620 242.968931208270 +8288 0.8288 28.5431813321846626 243.111153489750 +8289 0.8289 28.5188631115556568 243.253259090350 +8290 0.8290 28.4945306861987859 243.395248047040 +8291 0.8291 28.4701840677765894 243.537120396860 +8292 0.8292 28.4458232679479011 243.678876176880 +8293 0.8293 28.4214482983678458 243.820515424190 +8294 0.8294 28.3970591706878395 243.962038175940 +8295 0.8295 28.3726558965555782 244.103444469290 +8296 0.8296 28.3482384876150419 244.244734341460 +8297 0.8297 28.3238069555064840 244.385907829700 +8298 0.8298 28.2993613118664342 244.526964971290 +8299 0.8299 28.2749015683276923 244.667905803570 +8300 0.8300 28.2504277365193204 244.808730363890 +8301 0.8301 28.2259398280666431 244.949438689640 +8302 0.8302 28.2014378545912479 245.090030818250 +8303 0.8303 28.1769218277109736 245.230506787220 +8304 0.8304 28.1523917590399115 245.370866634020 +8305 0.8305 28.1278476601884009 245.511110396220 +8306 0.8306 28.1032895427630187 245.651238111400 +8307 0.8307 28.0787174183665904 245.791249817150 +8308 0.8308 28.0541312985981754 245.931145551150 +8309 0.8309 28.0295311950530639 246.070925351060 +8310 0.8310 28.0049171193227799 246.210589254630 +8311 0.8311 27.9802890829950677 246.350137299600 +8312 0.8312 27.9556470976538982 246.489569523780 +8313 0.8313 27.9309911748794590 246.628885965000 +8314 0.8314 27.9063213262481540 246.768086661120 +8315 0.8315 27.8816375633325961 246.907171650030 +8316 0.8316 27.8569398977016078 247.046140969710 +8317 0.8317 27.8322283409202171 247.184994658090 +8318 0.8318 27.8075029045496507 247.323732753210 +8319 0.8319 27.7827636001473373 247.462355293080 +8320 0.8320 27.7580104392668936 247.600862315810 +8321 0.8321 27.7332434334581279 247.739253859510 +8322 0.8322 27.7084625942670364 247.877529962320 +8323 0.8323 27.6836679332357996 248.015690662420 +8324 0.8324 27.6588594619027752 248.153735998040 +8325 0.8325 27.6340371918025021 248.291666007440 +8326 0.8326 27.6092011344656854 248.429480728890 +8327 0.8327 27.5843513014192041 248.567180200730 +8328 0.8328 27.5594877041861039 248.704764461300 +8329 0.8329 27.5346103542855900 248.842233549000 +8330 0.8330 27.5097192632330270 248.979587502270 +8331 0.8331 27.4848144425399354 249.116826359560 +8332 0.8332 27.4598959037139885 249.253950159360 +8333 0.8333 27.4349636582590115 249.390958940200 +8334 0.8334 27.4100177176749682 249.527852740650 +8335 0.8335 27.3850580934579710 249.664631599300 +8336 0.8336 27.3600847971002672 249.801295554790 +8337 0.8337 27.3350978400902385 249.937844645770 +8338 0.8338 27.3100972339124013 250.074278910960 +8339 0.8339 27.2850829900473997 250.210598389070 +8340 0.8340 27.2600551199720016 250.346803118880 +8341 0.8341 27.2350136351590990 250.482893139180 +8342 0.8342 27.2099585470776972 250.618868488820 +8343 0.8343 27.1848898671929255 250.754729206640 +8344 0.8344 27.1598076069660159 250.890475331550 +8345 0.8345 27.1347117778543137 251.026106902490 +8346 0.8346 27.1096023913112667 251.161623958420 +8347 0.8347 27.0844794587864293 251.297026538330 +8348 0.8348 27.0593429917254475 251.432314681270 +8349 0.8349 27.0341930015700704 251.567488426290 +8350 0.8350 27.0090294997581317 251.702547812480 +8351 0.8351 26.9838524977235572 251.837492878990 +8352 0.8352 26.9586620068963576 251.972323664970 +8353 0.8353 26.9334580387026286 252.107040209610 +8354 0.8354 26.9082406045645399 252.241642552160 +8355 0.8355 26.8830097159003394 252.376130731840 +8356 0.8356 26.8577653841243489 252.510504787980 +8357 0.8357 26.8325076206469575 252.644764759880 +8358 0.8358 26.8072364368746179 252.778910686910 +8359 0.8359 26.7819518442098499 252.912942608450 +8360 0.8360 26.7566538540512298 253.046860563920 +8361 0.8361 26.7313424777933939 253.180664592790 +8362 0.8362 26.7060177268270280 253.314354734510 +8363 0.8363 26.6806796125388708 253.447931028640 +8364 0.8364 26.6553281463117031 253.581393514680 +8365 0.8365 26.6299633395243553 253.714742232240 +8366 0.8366 26.6045852035516965 253.847977220930 +8367 0.8367 26.5791937497646309 253.981098520370 +8368 0.8368 26.5537889895300978 254.114106170260 +8369 0.8369 26.5283709342110718 254.247000210290 +8370 0.8370 26.5029395951665485 254.379780680190 +8371 0.8371 26.4774949837515514 254.512447619740 +8372 0.8372 26.4520371113171286 254.645001068740 +8373 0.8373 26.4265659892103422 254.777441067020 +8374 0.8374 26.4010816287742713 254.909767654410 +8375 0.8375 26.3755840413480094 255.041980870840 +8376 0.8376 26.3500732382666563 255.174080756220 +8377 0.8377 26.3245492308613223 255.306067350480 +8378 0.8378 26.2990120304591173 255.437940693630 +8379 0.8379 26.2734616483831509 255.569700825690 +8380 0.8380 26.2478980959525323 255.701347786670 +8381 0.8381 26.2223213844823668 255.832881616670 +8382 0.8382 26.1967315252837452 255.964302355780 +8383 0.8383 26.1711285296637470 256.095610044160 +8384 0.8384 26.1455124089254412 256.226804721950 +8385 0.8385 26.1198831743678745 256.357886429350 +8386 0.8386 26.0942408372860761 256.488855206600 +8387 0.8387 26.0685854089710496 256.619711093930 +8388 0.8388 26.0429169007097698 256.750454131650 +8389 0.8389 26.0172353237851830 256.881084360070 +8390 0.8390 25.9915406894762029 257.011601819520 +8391 0.8391 25.9658330090577074 257.142006550390 +8392 0.8392 25.9401122938005351 257.272298593070 +8393 0.8393 25.9143785549714813 257.402477988010 +8394 0.8394 25.8886318038332988 257.532544775650 +8395 0.8395 25.8628720516446897 257.662498996510 +8396 0.8396 25.8370993096603101 257.792340691100 +8397 0.8397 25.8113135891307550 257.922069899970 +8398 0.8398 25.7855149013025731 258.051686663680 +8399 0.8399 25.7597032574182450 258.181191022880 +8400 0.8400 25.7338786687161942 258.310583018170 +8401 0.8401 25.7080411464307730 258.439862690250 +8402 0.8402 25.6821907017922726 258.569030079780 +8403 0.8403 25.6563273460269059 258.698085227520 +8404 0.8404 25.6304510903568215 258.827028174200 +8405 0.8405 25.6045619460000822 258.955858960600 +8406 0.8406 25.5786599241706760 259.084577627550 +8407 0.8407 25.5527450360785053 259.213184215870 +8408 0.8408 25.5268172929293904 259.341678766440 +8409 0.8409 25.5008767059250623 259.470061320140 +8410 0.8410 25.4749232862631594 259.598331917930 +8411 0.8411 25.4489570451372273 259.726490600720 +8412 0.8412 25.4229779937367155 259.854537409510 +8413 0.8413 25.3969861432469735 259.982472385300 +8414 0.8414 25.3709815048492509 260.110295569150 +8415 0.8415 25.3449640897206905 260.238007002090 +8416 0.8416 25.3189339090343246 260.365606725240 +8417 0.8417 25.2928909739590786 260.493094779700 +8418 0.8418 25.2668352956597637 260.620471206630 +8419 0.8419 25.2407668852970701 260.747736047210 +8420 0.8420 25.2146857540275775 260.874889342630 +8421 0.8421 25.1885919130037408 261.001931134130 +8422 0.8422 25.1624853733738867 261.128861462950 +8423 0.8423 25.1363661462822208 261.255680370400 +8424 0.8424 25.1102342428688097 261.382387897790 +8425 0.8425 25.0840896742695989 261.508984086430 +8426 0.8426 25.0579324516163915 261.635468977720 +8427 0.8427 25.0317625860368551 261.761842613040 +8428 0.8428 25.0055800886545114 261.888105033810 +8429 0.8429 24.9793849705887467 262.014256281480 +8430 0.8430 24.9531772429547942 262.140296397540 +8431 0.8431 24.9269569168637446 262.266225423460 +8432 0.8432 24.9007240034225319 262.392043400800 +8433 0.8433 24.8744785137339370 262.517750371080 +8434 0.8434 24.8482204588965878 262.643346375920 +8435 0.8435 24.8219498500049482 262.768831456900 +8436 0.8436 24.7956666981493186 262.894205655670 +8437 0.8437 24.7693710144158423 263.019469013880 +8438 0.8438 24.7430628098864851 263.144621573230 +8439 0.8439 24.7167420956390522 263.269663375430 +8440 0.8440 24.6904088827471710 263.394594462210 +8441 0.8441 24.6640631822802945 263.519414875330 +8442 0.8442 24.6377050053036974 263.644124656610 +8443 0.8443 24.6113343628784733 263.768723847840 +8444 0.8444 24.5849512660615375 263.893212490880 +8445 0.8445 24.5585557259056131 264.017590627600 +8446 0.8446 24.5321477534592383 264.141858299880 +8447 0.8447 24.5057273597667624 264.266015549650 +8448 0.8448 24.4792945558683357 264.390062418870 +8449 0.8449 24.4528493527999160 264.513998949490 +8450 0.8450 24.4263917615932655 264.637825183520 +8451 0.8451 24.3999217932759400 264.761541162990 +8452 0.8452 24.3734394588712924 264.885146929930 +8453 0.8453 24.3469447693984762 265.008642526420 +8454 0.8454 24.3204377358724280 265.132027994560 +8455 0.8455 24.2939183693038743 265.255303376490 +8456 0.8456 24.2673866806993317 265.378468714330 +8457 0.8457 24.2408426810610997 265.501524050280 +8458 0.8458 24.2142863813872573 265.624469426540 +8459 0.8459 24.1877177926716662 265.747304885310 +8460 0.8460 24.1611369259039570 265.870030468850 +8461 0.8461 24.1345437920695431 265.992646219440 +8462 0.8462 24.1079384021496033 266.115152179380 +8463 0.8463 24.0813207671210847 266.237548390990 +8464 0.8464 24.0546908979567036 266.359834896600 +8465 0.8465 24.0280488056249446 266.482011738610 +8466 0.8466 24.0013945010900436 266.604078959410 +8467 0.8467 23.9747279953120014 266.726036601410 +8468 0.8468 23.9480492992465770 266.847884707070 +8469 0.8469 23.9213584238452803 266.969623318850 +8470 0.8470 23.8946553800553758 267.091252479230 +8471 0.8471 23.8679401788198753 267.212772230750 +8472 0.8472 23.8412128310775415 267.334182615950 +8473 0.8473 23.8144733477628741 267.455483677390 +8474 0.8474 23.7877217398061198 267.576675457670 +8475 0.8475 23.7609580181332660 267.697757999380 +8476 0.8476 23.7341821936660402 267.818731345170 +8477 0.8477 23.7073942773218960 267.939595537710 +8478 0.8478 23.6805942800140272 268.060350619680 +8479 0.8479 23.6537822126513539 268.180996633780 +8480 0.8480 23.6269580861385258 268.301533622760 +8481 0.8481 23.6001219113759220 268.421961629350 +8482 0.8482 23.5732736992596372 268.542280696350 +8483 0.8483 23.5464134606814923 268.662490866560 +8484 0.8484 23.5195412065290235 268.782592182790 +8485 0.8485 23.4926569476854894 268.902584687900 +8486 0.8486 23.4657606950298572 269.022468424760 +8487 0.8487 23.4388524594368057 269.142243436280 +8488 0.8488 23.4119322517767259 269.261909765350 +8489 0.8489 23.3850000829157132 269.381467454920 +8490 0.8490 23.3580559637155680 269.500916547980 +8491 0.8491 23.3310999050337955 269.620257087470 +8492 0.8492 23.3041319177236019 269.739489116430 +8493 0.8493 23.2771520126338842 269.858612677890 +8494 0.8494 23.2501602006092440 269.977627814900 +8495 0.8495 23.2231564924899736 270.096534570540 +8496 0.8496 23.1961408991120521 270.215332987900 +8497 0.8497 23.1691134313071494 270.334023110120 +8498 0.8498 23.1420740999026258 270.452604980320 +8499 0.8499 23.1150229157215250 270.571078641690 +8500 0.8500 23.0879598895825708 270.689444137410 +8501 0.8501 23.0608850323002592 270.807701508821 +8502 0.8502 23.0337983546860734 270.925850774897 +8503 0.8503 23.0066998675517382 271.043891911833 +8504 0.8504 22.9795895817135722 271.161824851482 +8505 0.8505 22.9524675079969178 271.279649481576 +8506 0.8506 22.9253336572405395 271.397365645986 +8507 0.8507 22.8981880403009903 271.514973145028 +8508 0.8508 22.8710306680569566 271.632471735667 +8509 0.8509 22.8438615514135819 271.749861131803 +8510 0.8510 22.8166807013067654 271.867141004540 +8511 0.8511 22.7894881287074149 271.984310982441 +8512 0.8512 22.7622838446257028 272.101370651793 +8513 0.8513 22.7350678601152723 272.218319556841 +8514 0.8514 22.7078401862774264 272.335157200091 +8515 0.8515 22.6806008342652952 272.451883042538 +8516 0.8516 22.6533498152879709 272.568496503946 +8517 0.8517 22.6260871406146187 272.684996963124 +8518 0.8518 22.5988128215785586 272.801383758101 +8519 0.8519 22.5715268695813265 272.917656186509 +8520 0.8520 22.5442292960967130 273.033813505774 +8521 0.8521 22.5169201126747573 273.149854933367 +8522 0.8522 22.4895993309457332 273.265779647092 +8523 0.8523 22.4622669626241098 273.381586785360 +8524 0.8524 22.4349230195124711 273.497275447394 +8525 0.8525 22.4075675135054233 273.612844693546 +8526 0.8526 22.3802004565934709 273.728293545531 +8527 0.8527 22.3528218608668610 273.843620986670 +8528 0.8528 22.3254317385194163 273.958825962208 +8529 0.8529 22.2980301018523299 274.073907379509 +8530 0.8530 22.2706169632779378 274.188864108335 +8531 0.8531 22.2431923353234637 274.303694981147 +8532 0.8532 22.2157562306347423 274.418398793279 +8533 0.8533 22.1883086619799137 274.532974303284 +8534 0.8534 22.1608496422530905 274.647420233160 +8535 0.8535 22.1333791844780023 274.761735268585 +8536 0.8536 22.1058973018116127 274.875918059204 +8537 0.8537 22.0784040075477073 274.989967218872 +8538 0.8538 22.0508993151204642 275.103881325958 +8539 0.8539 22.0233832381079893 275.217658923509 +8540 0.8540 21.9958557902358329 275.331298519603 +8541 0.8541 21.9683169853804756 275.444798587557 +8542 0.8542 21.9407668375727880 275.558157566188 +8543 0.8543 21.9132053610014736 275.671373860089 +8544 0.8544 21.8856325700164760 275.784445839886 +8545 0.8545 21.8580484791323570 275.897371842465 +8546 0.8546 21.8304531030316724 276.010150171250 +8547 0.8547 21.8028464565682860 276.122779096490 +8548 0.8548 21.7752285547706919 276.235256855425 +8549 0.8549 21.7475994128452861 276.347581652670 +8550 0.8550 21.7199590461796355 276.459751660346 +8551 0.8551 21.6923074703456962 276.571765018423 +8552 0.8552 21.6646447011030290 276.683619834945 +8553 0.8553 21.6369707544019683 276.795314186268 +8554 0.8554 21.6092856463867875 276.906846117334 +8555 0.8555 21.5815893933988221 277.018213641975 +8556 0.8556 21.5538820119795709 277.129414743060 +8557 0.8557 21.5261635188737763 277.240447372798 +8558 0.8558 21.4984339310324835 277.351309453062 +8559 0.8559 21.4706932656160525 277.461998875526 +8560 0.8560 21.4429415399971752 277.572513502033 +8561 0.8561 21.4151787717638378 277.682851164715 +8562 0.8562 21.3874049787222837 277.793009666385 +8563 0.8563 21.3596201788999274 277.902986780722 +8564 0.8564 21.3318243905482667 278.012780252468 +8565 0.8565 21.3040176321457508 278.122387797818 +8566 0.8566 21.2761999224006324 278.231807104557 +8567 0.8567 21.2483712802537852 278.341035832354 +8568 0.8568 21.2205317248815177 278.450071613010 +8569 0.8569 21.1926812756983338 278.558912050700 +8570 0.8570 21.1648199523596858 278.667554722267 +8571 0.8571 21.1369477747647032 278.775997177398 +8572 0.8572 21.1090647630588890 278.884236938919 +8573 0.8573 21.0811709376367880 278.992271503081 +8574 0.8574 21.0532663191446474 279.100098339723 +8575 0.8575 21.0253509284830322 279.207714892591 +8576 0.8576 20.9974247868094253 279.315118579566 +8577 0.8577 20.9694879155408032 279.422306792902 +8578 0.8578 20.9415403363561836 279.529276899478 +8579 0.8579 20.9135820711991549 279.636026241072 +8580 0.8580 20.8856131422803735 279.742552134583 +8581 0.8581 20.8576335720800330 279.848851872254 +8582 0.8582 20.8296433833503194 279.954922721994 +8583 0.8583 20.8016425991178409 280.060761927551 +8584 0.8584 20.7736312426860223 280.166366708811 +8585 0.8585 20.7456093376374824 280.271734261961 +8586 0.8586 20.7175769078363885 280.376861759889 +8587 0.8587 20.6895339774307807 280.481746352256 +8588 0.8588 20.6614805708548772 280.586385165833 +8589 0.8589 20.6334167128313481 280.690775304774 +8590 0.8590 20.6053424283735716 280.794913850782 +8591 0.8591 20.5772577427878645 280.898797863393 +8592 0.8592 20.5491626816756856 281.002424380207 +8593 0.8593 20.5210572709358168 281.105790417164 +8594 0.8594 20.4929415367665193 281.208892968754 +8595 0.8595 20.4648155056676693 281.311729008255 +8596 0.8596 20.4366792044428571 281.414295488006 +8597 0.8597 20.4085326602014767 281.516589339618 +8598 0.8598 20.3803759003607858 281.618607474230 +8599 0.8599 20.3522089526479384 281.720346782738 +8600 0.8600 20.3240318451019988 281.821804136061 +8601 0.8601 20.2958446060759279 281.922976385379 +8602 0.8602 20.2676472642385441 282.023860362307 +8603 0.8603 20.2394398485764668 282.124452879235 +8604 0.8604 20.2112223883960311 282.224750729486 +8605 0.8605 20.1829949133251745 282.324750687613 +8606 0.8606 20.1547574533153160 282.424449509567 +8607 0.8607 20.1265100386431861 282.523843933027 +8608 0.8608 20.0982526999126563 282.622930677546 +8609 0.8609 20.0699854680565366 282.721706444844 +8610 0.8610 20.0417083743383415 282.820167919032 +8611 0.8611 20.0134214503540484 282.918311766856 +8612 0.8612 19.9851247280338136 283.016134637867 +8613 0.8613 19.9568182396436811 283.113633164782 +8614 0.8614 19.9285020177872632 283.210803963589 +8615 0.8615 19.9001760954073923 283.307643633851 +8616 0.8616 19.8718405057877519 283.404148758942 +8617 0.8617 19.8434952825544926 283.500315906254 +8618 0.8618 19.8151404596778065 283.596141627437 +8619 0.8619 19.7867760714735041 283.691622458625 +8620 0.8620 19.7584021526045390 283.786754920683 +8621 0.8621 19.7300187380825314 283.881535519453 +8622 0.8622 19.7016258632692640 283.975960745916 +8623 0.8623 19.6732235638781425 284.070027076496 +8624 0.8624 19.6448118759756554 284.163730973253 +8625 0.8625 19.6163908359827843 284.257068884151 +8626 0.8626 19.5879604806764149 284.350037243218 +8627 0.8627 19.5595208471907149 284.442632470817 +8628 0.8628 19.5310719730184807 284.534850973900 +8629 0.8629 19.5026138960124769 284.626689146174 +8630 0.8630 19.4741466543867503 284.718143368368 +8631 0.8631 19.4456702867179096 284.809210008454 +8632 0.8632 19.4171848319463933 284.899885421882 +8633 0.8633 19.3886903293777095 284.990165951759 +8634 0.8634 19.3601868186836654 285.080047929121 +8635 0.8635 19.3316743399035502 285.169527673158 +8636 0.8636 19.3031529334453218 285.258601491398 +8637 0.8637 19.2746226400867542 285.347265679970 +8638 0.8638 19.2460835009765638 285.435516523817 +8639 0.8639 19.2175355576355287 285.523350296886 +8640 0.8640 19.1889788519575646 285.610763262402 +8641 0.8641 19.1604134262107912 285.697751673041 +8642 0.8642 19.1318393230385801 285.784311771204 +8643 0.8643 19.1032565854605600 285.870439789174 +8644 0.8644 19.0746652568736330 285.956131949370 +8645 0.8645 19.0460653810529337 286.041384464582 +8646 0.8646 19.0174570021527956 286.126193538153 +8647 0.8647 18.9888401647076783 286.210555364221 +8648 0.8648 18.9602149136330702 286.294466127934 +8649 0.8649 18.9315812942263904 286.377922005640 +8650 0.8650 18.9029393521678521 286.460919165159 +8651 0.8651 18.8742891335212981 286.543453765922 +8652 0.8652 18.8456306847350383 286.625521959274 +8653 0.8653 18.8169640526426427 286.707119888611 +8654 0.8654 18.7882892844637297 286.788243689641 +8655 0.8655 18.7596064278047194 286.868889490558 +8656 0.8656 18.7309155306595763 286.949053412340 +8657 0.8657 18.7022166414105193 287.028731568832 +8658 0.8658 18.6735098088287259 287.107920067055 +8659 0.8659 18.6447950820750030 287.186615007395 +8660 0.8660 18.6160725107004446 287.264812483794 +8661 0.8661 18.5873421446470566 287.342508583999 +8662 0.8662 18.5586040342483720 287.419699389691 +8663 0.8663 18.5298582302300474 287.496380976796 +8664 0.8664 18.5011047837104243 287.572549415632 +8665 0.8665 18.4723437462010871 287.648200771135 +8666 0.8666 18.4435751696073780 287.723331103050 +8667 0.8667 18.4147991062289194 287.797936466145 +8668 0.8668 18.3860156087600899 287.872012910436 +8669 0.8669 18.3572247302905005 287.945556481362 +8670 0.8670 18.3284265243054314 288.018563220016 +8671 0.8671 18.2996210446862619 288.091029163339 +8672 0.8672 18.2708083457108792 288.162950344294 +8673 0.8673 18.2419884820540581 288.234322792117 +8674 0.8674 18.2131615087878274 288.305142532523 +8675 0.8675 18.1843274813818105 288.375405587835 +8676 0.8676 18.1554864557035565 288.445107977264 +8677 0.8677 18.1266384880188376 288.514245717085 +8678 0.8678 18.0977836349919450 288.582814820779 +8679 0.8679 18.0689219536859369 288.650811299369 +8680 0.8680 18.0400535015628947 288.718231161443 +8681 0.8681 18.0111783364841465 288.785070413509 +8682 0.8682 17.9822965167104662 288.851325060092 +8683 0.8683 17.9534081009022621 288.916991103975 +8684 0.8684 17.9245131481197433 288.982064546390 +8685 0.8685 17.8956117178230656 289.046541387194 +8686 0.8686 17.8667038698724525 289.110417625080 +8687 0.8687 17.8377896645283087 289.173689257771 +8688 0.8688 17.8088691624513089 289.236352282223 +8689 0.8689 17.7799424247024582 289.298402694794 +8690 0.8690 17.7510095127431455 289.359836491446 +8691 0.8691 17.7220704884351754 289.420649667955 +8692 0.8692 17.6931254140407752 289.480838220047 +8693 0.8693 17.6641743522225880 289.540398143676 +8694 0.8694 17.6352173660436478 289.599325435141 +8695 0.8695 17.6062545189673259 289.657616091308 +8696 0.8696 17.5772858748572709 289.715266109770 +8697 0.8697 17.5483114979773305 289.772271489071 +8698 0.8698 17.5193314529914339 289.828628228884 +8699 0.8699 17.4903458049634821 289.884332330172 +8700 0.8700 17.4613546193572020 289.939379795405 +8701 0.8701 17.4323579620359972 289.993766628716 +8702 0.8702 17.4033558992627562 290.047488836116 +8703 0.8703 17.3743484976996676 290.100542425664 +8704 0.8704 17.3453358244080036 290.152923407628 +8705 0.8705 17.3163179468478852 290.204627794725 +8706 0.8706 17.2872949328780372 290.255651602239 +8707 0.8707 17.2582668507555148 290.305990848237 +8708 0.8708 17.2292337691354156 290.355641553741 +8709 0.8709 17.2001957570705848 290.404599742910 +8710 0.8710 17.1711528840112777 290.452861443215 +8711 0.8711 17.1421052198048365 290.500422685642 +8712 0.8712 17.1130528346953135 290.547279504825 +8713 0.8713 17.0839957993231124 290.593427939231 +8714 0.8714 17.0549341847245799 290.638864031416 +8715 0.8715 17.0258680623316074 290.683583828059 +8716 0.8716 16.9967975039711909 290.727583380274 +8717 0.8717 16.9677225818649902 290.770858743707 +8718 0.8718 16.9386433686288704 290.813405978703 +8719 0.8719 16.9095599372724088 290.855221150549 +8720 0.8720 16.8804723611984038 290.896300329568 +8721 0.8721 16.8513807142023602 290.936639591336 +8722 0.8722 16.8222850704719527 290.976235016849 +8723 0.8723 16.7931855045864751 291.015082692686 +8724 0.8724 16.7640820915162827 291.053178711151 +8725 0.8725 16.7349749066221989 291.090519170494 +8726 0.8726 16.7058640256549218 291.127100175059 +8727 0.8727 16.6767495247543991 291.162917835424 +8728 0.8728 16.6476314804491956 291.197968268632 +8729 0.8729 16.6185099696558503 291.232247598266 +8730 0.8730 16.5893850696782010 291.265751954693 +8731 0.8731 16.5602568582067065 291.298477475193 +8732 0.8732 16.5311254133177385 291.330420304139 +8733 0.8733 16.5019908134728723 291.361576593150 +8734 0.8734 16.4728531375181539 291.391942501230 +8735 0.8735 16.4437124646833439 291.421514194990 +8736 0.8736 16.4145688745811569 291.450287848768 +8737 0.8737 16.3854224472064800 291.478259644777 +8738 0.8738 16.3562732629355772 291.505425773302 +8739 0.8739 16.3271214025252718 291.531782432822 +8740 0.8740 16.2979669471121191 291.557325830228 +8741 0.8741 16.2688099782115643 291.582052180871 +8742 0.8742 16.2396505777170788 291.605957708867 +8743 0.8743 16.2104888278992796 291.629038647126 +8744 0.8744 16.1813248114050445 291.651291237557 +8745 0.8745 16.1521586112566062 291.672711731241 +8746 0.8746 16.1229903108506178 291.693296388547 +8747 0.8747 16.0938199939572257 291.713041479315 +8748 0.8748 16.0646477447191103 291.731943283009 +8749 0.8749 16.0354736476505195 291.749998088836 +8750 0.8750 16.0062977876362815 291.767202195914 +8751 0.8751 15.9771202499308114 291.783551913467 +8752 0.8752 15.9479411201570933 291.799043560903 +8753 0.8753 15.9187604843056487 291.813673467982 +8754 0.8754 15.8895784287334969 291.827437975045 +8755 0.8755 15.8603950401630946 291.840333432988 +8756 0.8756 15.8312104056812650 291.852356203622 +8757 0.8757 15.8020246127381014 291.863502659659 +8758 0.8758 15.7728377491458733 291.873769184900 +8759 0.8759 15.7436499030779071 291.883152174421 +8760 0.8760 15.7144611630674529 291.891648034678 +8761 0.8761 15.6852716180065368 291.899253183653 +8762 0.8762 15.6560813571448048 291.905964051000 +8763 0.8763 15.6268904700883446 291.911777078203 +8764 0.8764 15.5976990467984997 291.916688718685 +8765 0.8765 15.5685071775906660 291.920695437976 +8766 0.8766 15.5393149531330739 291.923793713857 +8767 0.8767 15.5101224644455584 291.925980036466 +8768 0.8768 15.4809298028983111 291.927250908465 +8769 0.8769 15.4517370602106308 291.927602845152 +8770 0.8770 15.4225443284496411 291.927032374645 +8771 0.8771 15.3933517000290117 291.925536037945 +8772 0.8772 15.3641592677076577 291.923110389137 +8773 0.8773 15.3349671245884256 291.919751995519 +8774 0.8774 15.3057753641167658 291.915457437682 +8775 0.8775 15.2765840800793971 291.910223309677 +8776 0.8776 15.2473933666029549 291.904046219169 +8777 0.8777 15.2182033181526197 291.896922787550 +8778 0.8778 15.1890140295307390 291.888849650060 +8779 0.8779 15.1598255958754411 291.879823455895 +8780 0.8780 15.1306381126592253 291.869840868407 +8781 0.8781 15.1014516756875476 291.858898565163 +8782 0.8782 15.0722663810973820 291.846993238132 +8783 0.8783 15.0430823253557886 291.834121593745 +8784 0.8784 15.0138996052584481 291.820280353066 +8785 0.8785 14.9847183179281984 291.805466251922 +8786 0.8786 14.9555385608135509 291.789676041017 +8787 0.8787 14.9263604316871987 291.772906486024 +8788 0.8788 14.8971840286445101 291.755154367762 +8789 0.8789 14.8680094501020079 291.736416482292 +8790 0.8790 14.8388367947958422 291.716689641029 +8791 0.8791 14.8096661617802461 291.695970670892 +8792 0.8792 14.7804976504259820 291.674256414384 +8793 0.8793 14.7513313604187744 291.651543729753 +8794 0.8794 14.7221673917577327 291.627829491089 +8795 0.8795 14.6930058447537562 291.603110588454 +8796 0.8796 14.6638468200279348 291.577383927958 +8797 0.8797 14.6346904185099387 291.550646431948 +8798 0.8798 14.6055367414363886 291.522895039056 +8799 0.8799 14.5763858903492167 291.494126704369 +8800 0.8800 14.5472379670940253 291.464338399465 +8801 0.8801 14.5180930738184202 291.433527112653 +8802 0.8802 14.4889513129703396 291.401689848963 +8803 0.8803 14.4598127872963769 291.368823630290 +8804 0.8804 14.4306775998400845 291.334925495552 +8805 0.8805 14.4015458539402683 291.299992500785 +8806 0.8806 14.3724176532292702 291.264021719187 +8807 0.8807 14.3432931016312448 291.227010241324 +8808 0.8808 14.3141723033604205 291.188955175164 +8809 0.8809 14.2850553629193513 291.149853646233 +8810 0.8810 14.2559423850971569 291.109702797657 +8811 0.8811 14.2268334749677567 291.068499790364 +8812 0.8812 14.1977287378880828 291.026241803130 +8813 0.8813 14.1686282794962928 290.982926032665 +8814 0.8814 14.1395322057099726 290.938549693735 +8815 0.8815 14.1104406227243206 290.893110019316 +8816 0.8816 14.0813536370103236 290.846604260616 +8817 0.8817 14.0522713553129321 290.799029687226 +8818 0.8818 14.0231938846492099 290.750383587224 +8819 0.8819 13.9941213323064879 290.700663267218 +8820 0.8820 13.9650538058405012 290.649866052522 +8821 0.8821 13.9359914130735145 290.597989287204 +8822 0.8822 13.9069342620924452 290.545030334187 +8823 0.8823 13.8778824612469656 290.490986575394 +8824 0.8824 13.8488361191476077 290.435855411771 +8825 0.8825 13.8197953446638486 290.379634263421 +8826 0.8826 13.7907602469221917 290.322320569721 +8827 0.8827 13.7617309353042376 290.263911789364 +8828 0.8828 13.7327075194447445 290.204405400504 +8829 0.8829 13.7036901092296795 290.143798900790 +8830 0.8830 13.6746788147942624 290.082089807540 +8831 0.8831 13.6456737465209983 290.019275657732 +8832 0.8832 13.6166750150377034 289.955354008177 +8833 0.8833 13.5876827312155157 289.890322435563 +8834 0.8834 13.5586970061669092 289.824178536559 +8835 0.8835 13.5297179512436845 289.756919927927 +8836 0.8836 13.5007456780349617 289.688544246537 +8837 0.8837 13.4717802983651573 289.619049149544 +8838 0.8838 13.4428219242919607 289.548432314383 +8839 0.8839 13.4138706681042930 289.476691438957 +8840 0.8840 13.3849266423202646 289.403824241596 +8841 0.8841 13.3559899596851217 289.329828461272 +8842 0.8842 13.3270607331691782 289.254701857586 +8843 0.8843 13.2981390759657536 289.178442210894 +8844 0.8844 13.2692251014890914 289.101047322360 +8845 0.8845 13.2403189233722713 289.022515014051 +8846 0.8846 13.2114206554651172 288.942843129046 +8847 0.8847 13.1825304118320918 288.862029531467 +8848 0.8848 13.1536483067501901 288.780072106577 +8849 0.8849 13.1247744547068184 288.696968760855 +8850 0.8850 13.0959089703976730 288.612717422068 +8851 0.8851 13.0670519687246003 288.527316039378 +8852 0.8852 13.0382035647934629 288.440762583377 +8853 0.8853 13.0093638739119850 288.353055046173 +8854 0.8854 12.9805330115876032 288.264191441469 +8855 0.8855 12.9517110935252990 288.174169804632 +8856 0.8856 12.9228982356254285 288.082988192789 +8857 0.8857 12.8940945539815477 287.990644684835 +8858 0.8858 12.8653001648782261 287.897137381587 +8859 0.8859 12.8365151847888583 287.802464405776 +8860 0.8860 12.8077397303734610 287.706623902180 +8861 0.8861 12.7789739184764706 287.609614037636 +8862 0.8862 12.7502178661245296 287.511433001171 +8863 0.8863 12.7214716905242717 287.412079003999 +8864 0.8864 12.6927355090600891 287.311550279637 +8865 0.8865 12.6640094392919096 287.209845083948 +8866 0.8866 12.6352935989529502 287.106961695238 +8867 0.8867 12.6065881059474769 287.002898414241 +8868 0.8868 12.5778930783485503 286.897653564277 +8869 0.8869 12.5492086343957734 286.791225491261 +8870 0.8870 12.5205348924930213 286.683612563786 +8871 0.8871 12.4918719712061748 286.574813173144 +8872 0.8872 12.4632199892608444 286.464825733448 +8873 0.8873 12.4345790655400901 286.353648681626 +8874 0.8874 12.4059493190821311 286.241280477547 +8875 0.8875 12.3773308690780528 286.127719604020 +8876 0.8876 12.3487238348695083 286.012964566881 +8877 0.8877 12.3201283359464107 285.897013895057 +8878 0.8878 12.2915444919446291 285.779866140579 +8879 0.8879 12.2629724226436654 285.661519878696 +8880 0.8880 12.2344122479643360 285.541973707879 +8881 0.8881 12.2058640879664466 285.421226249899 +8882 0.8882 12.1773280628464580 285.299276149869 +8883 0.8883 12.1488042929351483 285.176122076340 +8884 0.8884 12.1202928986952685 285.051762721251 +8885 0.8885 12.0917940007192009 284.926196800094 +8886 0.8886 12.0633077197266019 284.799423051875 +8887 0.8887 12.0348341765620468 284.671440239230 +8888 0.8888 12.0063734921926635 284.542247148431 +8889 0.8889 11.9779257877057699 284.411842589453 +8890 0.8890 11.9494911843064973 284.280225395989 +8891 0.8891 11.9210698033154205 284.147394425548 +8892 0.8892 11.8926617661661709 284.013348559455 +8893 0.8893 11.8642671944030518 283.878086702923 +8894 0.8894 11.8358862096786517 283.741607785092 +8895 0.8895 11.8075189337514441 283.603910759044 +8896 0.8896 11.7791654884833985 283.464994601884 +8897 0.8897 11.7508259958375660 283.324858314773 +8898 0.8898 11.7225005778756799 283.183500922947 +8899 0.8899 11.6941893567557429 283.040921475788 +8900 0.8900 11.6658924547296134 282.897119046818 +8901 0.8901 11.6376099941405826 282.752092733808 +8902 0.8902 11.6093420974209547 282.605841658736 +8903 0.8903 11.5810888870896243 282.458364967886 +8904 0.8904 11.5528504857496372 282.309661831860 +8905 0.8905 11.5246270160857645 282.159731445595 +8906 0.8906 11.4964186008620626 282.008573028449 +8907 0.8907 11.4682253629194317 281.856185824177 +8908 0.8908 11.4400474251731712 281.702569101025 +8909 0.8909 11.4118849106105351 281.547722151683 +8910 0.8910 11.3837379422882812 281.391644293413 +8911 0.8911 11.3556066433302103 281.234334868006 +8912 0.8912 11.3274911369247189 281.075793241832 +8913 0.8913 11.2993915463223331 280.916018805885 +8914 0.8914 11.2713079948332471 280.755010975827 +8915 0.8915 11.2432406058248588 280.592769191948 +8916 0.8916 11.2151895027192978 280.429292919279 +8917 0.8917 11.1871548089909556 280.264581647551 +8918 0.8918 11.1591366481640151 280.098634891274 +8919 0.8919 11.1311351438099653 279.931452189718 +8920 0.8920 11.1031504195451305 279.763033106965 +8921 0.8921 11.0751825990281851 279.593377231933 +8922 0.8922 11.0472318059576686 279.422484178391 +8923 0.8923 11.0192981640695002 279.250353584974 +8924 0.8924 10.9913817971344905 279.076985115230 +8925 0.8925 10.9634828289558488 278.902378457615 +8926 0.8926 10.9356013833666914 278.726533325525 +8927 0.8927 10.9077375842275472 278.549449457347 +8928 0.8928 10.8798915554238604 278.371126616396 +8929 0.8929 10.8520634208634910 278.191564591008 +8930 0.8930 10.8242533044742117 278.010763194568 +8931 0.8931 10.7964613302012111 277.828722265442 +8932 0.8932 10.7686876220045846 277.645441667085 +8933 0.8933 10.7409323038568303 277.460921287994 +8934 0.8934 10.7131954997403440 277.275161041749 +8935 0.8935 10.6854773336449043 277.088160867046 +8936 0.8936 10.6577779295651673 276.899920727676 +8937 0.8937 10.6300974114981557 276.710440612551 +8938 0.8938 10.6024359034407425 276.519720535718 +8939 0.8939 10.5747935293871382 276.327760536367 +8940 0.8940 10.5471704133263771 276.134560678869 +8941 0.8941 10.5195666792397979 275.940121052718 +8942 0.8942 10.4919824510985293 275.744441772638 +8943 0.8943 10.4644178528609721 275.547522978488 +8944 0.8944 10.4368730084702790 275.349364835361 +8945 0.8945 10.4093480418518354 275.149967533528 +8946 0.8946 10.3818430769107355 274.949331288487 +8947 0.8947 10.3543582375292651 274.747456340920 +8948 0.8948 10.3268936475643809 274.544342956767 +8949 0.8949 10.2994494308451845 274.339991427161 +8950 0.8950 10.2720257111704019 274.134402068491 +8951 0.8951 10.2446226123058590 273.927575222368 +8952 0.8952 10.2172402579819597 273.719511255619 +8953 0.8953 10.1898787718911610 273.510210560340 +8954 0.8954 10.1625382776854529 273.299673553833 +8955 0.8955 10.1352188989738270 273.087900678671 +8956 0.8956 10.1079207593197609 272.874892402646 +8957 0.8957 10.0806439822386888 272.660649218799 +8958 0.8958 10.0533886911954795 272.445171645388 +8959 0.8959 10.0261550096019132 272.228460225948 +8960 0.8960 9.9989430608141561 272.010515529206 +8961 0.8961 9.9717529681302395 271.791338149129 +8962 0.8962 9.9445848547875375 271.570928704912 +8963 0.8963 9.9174388439602428 271.349287840988 +8964 0.8964 9.8903150587568440 271.126416226983 +8965 0.8965 9.8632136222176090 270.902314557726 +8966 0.8966 9.8361346573120585 270.676983553281 +8967 0.8967 9.8090782869364510 270.450423958875 +8968 0.8968 9.7820446339112603 270.222636544942 +8969 0.8969 9.7550338209786585 269.993622107082 +8970 0.8970 9.7280459708000002 269.763381466087 +8971 0.8971 9.7010812059533027 269.531915467874 +8972 0.8972 9.6741396489307316 269.299224983534 +8973 0.8973 9.6472214221360897 269.065310909314 +8974 0.8974 9.6203266478822975 268.830174166532 +8975 0.8975 9.5934554483888874 268.593815701663 +8976 0.8976 9.5666079457794915 268.356236486266 +8977 0.8977 9.5397842620793281 268.117437516991 +8978 0.8978 9.5129845192126989 267.877419815581 +8979 0.8979 9.4862088390004811 267.636184428779 +8980 0.8980 9.4594573431576201 267.393732428423 +8981 0.8981 9.4327301532906311 267.150064911357 +8982 0.8982 9.4060273908950904 266.905182999441 +8983 0.8983 9.3793491773531432 266.659087839492 +8984 0.8984 9.3526956339310008 266.411780603345 +8985 0.8985 9.3260668817764447 266.163262487766 +8986 0.8986 9.2994630419163347 265.913534714443 +8987 0.8987 9.2728842352541125 265.662598529993 +8988 0.8988 9.2463305825673174 265.410455205919 +8989 0.8989 9.2198022045050916 265.157106038590 +8990 0.8990 9.1932992215857006 264.902552349236 +8991 0.8991 9.1668217541940429 264.646795483909 +8992 0.8992 9.1403699225791755 264.389836813455 +8993 0.8993 9.1139438468518286 264.131677733492 +8994 0.8994 9.0875436469819331 263.872319664430 +8995 0.8995 9.0611694427961442 263.611764051343 +8996 0.8996 9.0348213539753743 263.350012364064 +8997 0.8997 9.0084995000523165 263.087066097087 +8998 0.8998 8.9822040004089843 262.822926769546 +8999 0.8999 8.9559349742742480 262.557595925194 +9000 0.9000 8.9296925407213692 262.291075132388 +9001 0.9001 8.9034768186655473 262.023365984047 +9002 0.9002 8.8772879268614648 261.754470097610 +9003 0.9003 8.8511259839008325 261.484389115035 +9004 0.9004 8.8249911082099430 261.213124702761 +9005 0.9005 8.7988834180472235 260.940678551647 +9006 0.9006 8.7728030315007928 260.667052376985 +9007 0.9007 8.7467500664860225 260.392247918421 +9008 0.9008 8.7207246407431036 260.116266939953 +9009 0.9009 8.6947268718346109 259.839111229897 +9010 0.9010 8.6687568771430730 259.560782600848 +9011 0.9011 8.6428147738685492 259.281282889632 +9012 0.9012 8.6169006790262035 259.000613957290 +9013 0.9013 8.5910147094438880 258.718777689007 +9014 0.9014 8.5651569817597313 258.435775994144 +9015 0.9015 8.5393276124197186 258.151610806113 +9016 0.9016 8.5135267176752922 257.866284082405 +9017 0.9017 8.4877544135809444 257.579797804549 +9018 0.9018 8.4620108159918175 257.292153978003 +9019 0.9019 8.4362960405613059 257.003354632217 +9020 0.9020 8.4106102027386687 256.713401820512 +9021 0.9021 8.3849534177666403 256.422297620058 +9022 0.9022 8.3593258006790432 256.130044131877 +9023 0.9023 8.3337274662984129 255.836643480742 +9024 0.9024 8.3081585292336175 255.542097815166 +9025 0.9025 8.2826191038774919 255.246409307346 +9026 0.9026 8.2571093044044677 254.949580153124 +9027 0.9027 8.2316292447682144 254.651612571945 +9028 0.9028 8.2061790386992755 254.352508806818 +9029 0.9029 8.1807587997027209 254.052271124264 +9030 0.9030 8.1553686410557944 253.750901814263 +9031 0.9031 8.1300086758055716 253.448403190189 +9032 0.9032 8.1046790167666209 253.144777588836 +9033 0.9033 8.0793797765186639 252.840027370299 +9034 0.9034 8.0541110674042518 252.534154917932 +9035 0.9035 8.0288730015264385 252.227162638318 +9036 0.9036 8.0036656907464589 251.919052961263 +9037 0.9037 7.9784892466814146 251.609828339633 +9038 0.9038 7.9533437807019620 251.299491249423 +9039 0.9039 7.9282294039300103 250.988044189619 +9040 0.9040 7.9031462272364195 250.675489682202 +9041 0.9041 7.8780943612387055 250.361830272078 +9042 0.9042 7.8530739162987517 250.047068526992 +9043 0.9043 7.8280850025205249 249.731207037541 +9044 0.9044 7.8031277297477946 249.414248417060 +9045 0.9045 7.7782022075618622 249.096195301596 +9046 0.9046 7.7533085452792898 248.777050349860 +9047 0.9047 7.7284468519496388 248.456816243160 +9048 0.9048 7.7036172363532147 248.135495685317 +9049 0.9049 7.6788198069988152 247.813091402670 +9050 0.9050 7.6540546721214824 247.489606143985 +9051 0.9051 7.6293219396802643 247.165042680370 +9052 0.9052 7.6046217173559816 246.839403805278 +9053 0.9053 7.5799541125489984 246.512692334387 +9054 0.9054 7.5553192323769984 246.184911105608 +9055 0.9055 7.5307171836727713 245.856062978935 +9056 0.9056 7.5061480729819996 245.526150836495 +9057 0.9057 7.4816120065610558 245.195177582380 +9058 0.9058 7.4571090903748045 244.863146142655 +9059 0.9059 7.4326394300944072 244.530059465295 +9060 0.9060 7.4082031310951395 244.195920520063 +9061 0.9061 7.3838002984542097 243.860732298539 +9062 0.9062 7.3594310369485854 243.524497813953 +9063 0.9063 7.3350954510528270 243.187220101217 +9064 0.9064 7.3107936449369264 242.848902216801 +9065 0.9065 7.2865257224641518 242.509547238691 +9066 0.9066 7.2622917871889028 242.169158266293 +9067 0.9067 7.2380919423545658 241.827738420443 +9068 0.9068 7.2139262908913810 241.485290843254 +9069 0.9069 7.1897949354143140 241.141818698079 +9070 0.9070 7.1656979782209360 240.797325169482 +9071 0.9071 7.1416355212893059 240.451813463126 +9072 0.9072 7.1176076662758652 240.105286805689 +9073 0.9073 7.0936145145133374 239.757748444872 +9074 0.9074 7.0696561670086311 239.409201649249 +9075 0.9075 7.0457327244407564 239.059649708246 +9076 0.9076 7.0218442871587428 238.709095932035 +9077 0.9077 6.9979909551795654 238.357543651505 +9078 0.9078 6.9741728281860818 238.004996218160 +9079 0.9079 6.9503900055249703 237.651457004060 +9080 0.9080 6.9266425862046805 237.296929401733 +9081 0.9081 6.9029306688933874 236.941416824137 +9082 0.9082 6.8792543519169538 236.584922704538 +9083 0.9083 6.8556137332569023 236.227450496490 +9084 0.9084 6.8320089105483923 235.869003673716 +9085 0.9085 6.8084399810782035 235.509585730060 +9086 0.9086 6.7849070417827306 235.149200179395 +9087 0.9087 6.7614101892459821 234.787850555567 +9088 0.9088 6.7379495196975876 234.425540412319 +9089 0.9089 6.7145251290108128 234.062273323177 +9090 0.9090 6.6911371127005825 233.698052881424 +9091 0.9091 6.6677855659215126 233.332882699983 +9092 0.9092 6.6444705834659450 232.966766411370 +9093 0.9093 6.6211922597619965 232.599707667591 +9094 0.9094 6.5979506888716122 232.231710140098 +9095 0.9095 6.5747459644886250 231.862777519647 +9096 0.9096 6.5515781799368273 231.492913516308 +9097 0.9097 6.5284474281680476 231.122121859283 +9098 0.9098 6.5053538017602381 230.750406296908 +9099 0.9099 6.4822973929155658 230.377770596545 +9100 0.9100 6.4592782934585138 230.004218544500 +9101 0.9101 6.4362965948339932 229.629753945913 +9102 0.9102 6.4133523881054604 229.254380624743 +9103 0.9103 6.3904457639530436 228.878102423595 +9104 0.9104 6.3675768126716772 228.500923203734 +9105 0.9105 6.3447456241692439 228.122846844935 +9106 0.9106 6.3219522879647263 227.743877245424 +9107 0.9107 6.2991968931863660 227.364018321781 +9108 0.9108 6.2764795285698334 226.983274008869 +9109 0.9109 6.2538002824564023 226.601648259753 +9110 0.9110 6.2311592427911355 226.219145045577 +9111 0.9111 6.2085564971210792 225.835768355548 +9112 0.9112 6.1859921325934630 225.451522196780 +9113 0.9113 6.1634662359539121 225.066410594238 +9114 0.9114 6.1409788935446672 224.680437590652 +9115 0.9115 6.1185301913028134 224.293607246430 +9116 0.9116 6.0961202147585132 223.905923639574 +9117 0.9117 6.0737490490332569 223.517390865559 +9118 0.9118 6.0514167788381146 223.128013037281 +9119 0.9119 6.0291234884720017 222.737794284977 +9120 0.9120 6.0068692618199480 222.346738756092 +9121 0.9121 5.9846541823513828 221.954850615208 +9122 0.9122 5.9624783331184235 221.562134043987 +9123 0.9123 5.9403417967541730 221.168593241015 +9124 0.9124 5.9182446554710335 220.774232421776 +9125 0.9125 5.8961869910590190 220.379055818513 +9126 0.9126 5.8741688848840843 219.983067680176 +9127 0.9127 5.8521904178864599 219.586272272308 +9128 0.9128 5.8302516705789991 219.188673876911 +9129 0.9129 5.8083527230455312 218.790276792452 +9130 0.9130 5.7864936549392239 218.391085333690 +9131 0.9131 5.7646745454809594 217.991103831603 +9132 0.9132 5.7428954734577147 217.590336633298 +9133 0.9133 5.7211565172209538 217.188788101920 +9134 0.9134 5.6994577546850298 216.786462616563 +9135 0.9135 5.6777992633255945 216.383364572139 +9136 0.9136 5.6561811201780214 215.979498379327 +9137 0.9137 5.6346034018358315 215.574868464468 +9138 0.9138 5.6130661844491367 215.169479269429 +9139 0.9139 5.5915695437230859 214.763335251579 +9140 0.9140 5.5701135549163263 214.356440883608 +9141 0.9141 5.5486982928394708 213.948800653496 +9142 0.9142 5.5273238318535762 213.540419064393 +9143 0.9143 5.5059902458686310 213.131300634509 +9144 0.9144 5.4846976083420538 212.721449897038 +9145 0.9145 5.4634459922772001 212.310871400038 +9146 0.9146 5.4422354702218811 211.899569706342 +9147 0.9147 5.4210661142668899 211.487549393479 +9148 0.9148 5.3999379960445397 211.074815053517 +9149 0.9149 5.3788511867272124 210.661371293034 +9150 0.9150 5.3578057570259121 210.247222732976 +9151 0.9151 5.3368017771888354 209.832374008562 +9152 0.9152 5.3158393169999485 209.416829769180 +9153 0.9153 5.2949184457775749 209.000594678292 +9154 0.9154 5.2740392323729930 208.583673413345 +9155 0.9155 5.2532017451690427 208.166070665654 +9156 0.9156 5.2324060520787459 207.747791140286 +9157 0.9157 5.2116522205439324 207.328839555990 +9158 0.9158 5.1909403175338795 206.909220645068 +9159 0.9159 5.1702704095439609 206.488939153298 +9160 0.9160 5.1496425625943063 206.067999839792 +9161 0.9161 5.1290568422284704 205.646407476931 +9162 0.9162 5.1085133135121117 205.224166850248 +9163 0.9163 5.0880120410316847 204.801282758298 +9164 0.9164 5.0675530888931402 204.377760012593 +9165 0.9165 5.0471365207206356 203.953603437495 +9166 0.9166 5.0267623996552580 203.528817870055 +9167 0.9167 5.0064307883537555 203.103408159990 +9168 0.9168 4.9861417489872801 202.677379169515 +9169 0.9169 4.9658953432401409 202.250735773265 +9170 0.9170 4.9456916323085691 201.823482858168 +9171 0.9171 4.9255306768994931 201.395625323360 +9172 0.9172 4.9054125372293207 200.967168080092 +9173 0.9173 4.8853372730227385 200.538116051557 +9174 0.9174 4.8653049435115170 200.108474172869 +9175 0.9175 4.8453156074333297 199.678247390883 +9176 0.9176 4.8253693230305785 199.247440664136 +9177 0.9177 4.8054661480492369 198.816058962699 +9178 0.9178 4.7856061397376957 198.384107268117 +9179 0.9179 4.7657893548456274 197.951590573245 +9180 0.9180 4.7460158496228555 197.518513882184 +9181 0.9181 4.7262856798182389 197.084882210147 +9182 0.9182 4.7065989006785633 196.650700583364 +9183 0.9183 4.6869555669474474 196.215974038948 +9184 0.9184 4.6673557328642596 195.780707624816 +9185 0.9185 4.6477994521630404 195.344906399571 +9186 0.9186 4.6282867780714438 194.908575432357 +9187 0.9187 4.6088177633096858 194.471719802808 +9188 0.9188 4.5893924600895009 194.034344600886 +9189 0.9189 4.5700109201131172 193.596454926792 +9190 0.9190 4.5506731945722345 193.158055890855 +9191 0.9191 4.5313793341470205 192.719152613427 +9192 0.9192 4.5121293890051124 192.279750224733 +9193 0.9193 4.4929234088006353 191.839853864807 +9194 0.9194 4.4737614426732275 191.399468683355 +9195 0.9195 4.4546435392470771 190.958599839644 +9196 0.9196 4.4355697466299748 190.517252502401 +9197 0.9197 4.4165401124123713 190.075431849678 +9198 0.9198 4.3975546836664492 189.633143068757 +9199 0.9199 4.3786135069452099 189.190391356028 +9200 0.9200 4.3597166282815643 188.747181916886 +9201 0.9201 4.3408640931874398 188.303519965598 +9202 0.9202 4.3220559466528989 187.859410725213 +9203 0.9203 4.3032922331452674 187.414859427411 +9204 0.9204 4.2845729966082748 186.969871312446 +9205 0.9205 4.2658982804612036 186.524451628972 +9206 0.9206 4.2472681275980566 186.078605633959 +9207 0.9207 4.2286825803867298 185.632338592577 +9208 0.9208 4.2101416806681975 185.185655778067 +9209 0.9209 4.1916454697557120 184.738562471646 +9210 0.9210 4.1731939884340115 184.291063962368 +9211 0.9211 4.1547872769585412 183.843165547033 +9212 0.9212 4.1364253750546878 183.394872530042 +9213 0.9213 4.1181083219170205 182.946190223305 +9214 0.9214 4.0998361562085490 182.497123946126 +9215 0.9215 4.0816089160599907 182.047679025047 +9216 0.9216 4.0634266390690490 181.597860793784 +9217 0.9217 4.0452893622997053 181.147674593087 +9218 0.9218 4.0271971222815202 180.697125770614 +9219 0.9219 4.0091499550089482 180.246219680818 +9220 0.9220 3.9911478959406654 179.794961684846 +9221 0.9221 3.9731909799989036 179.343357150393 +9222 0.9222 3.9552792415688032 178.891411451617 +9223 0.9223 3.9374127144977731 178.439129968988 +9224 0.9224 3.9195914320948639 177.986518089197 +9225 0.9225 3.9018154271301526 177.533581205026 +9226 0.9226 3.8840847318341400 177.080324715226 +9227 0.9227 3.8663993778971593 176.626754024392 +9228 0.9228 3.8487593964687954 176.172874542883 +9229 0.9229 3.8311648181573186 175.718691686649 +9230 0.9230 3.8136156730291288 175.264210877144 +9231 0.9231 3.7961119906082108 174.809437541213 +9232 0.9232 3.7786537998756033 174.354377110936 +9233 0.9233 3.7612411292688783 173.899035023564 +9234 0.9234 3.7438740066816329 173.443416721343 +9235 0.9235 3.7265524594629937 172.987527651438 +9236 0.9236 3.7092765144171334 172.531373265769 +9237 0.9237 3.6920461978027972 172.074959020956 +9238 0.9238 3.6748615353328433 171.618290378123 +9239 0.9239 3.6577225521737957 171.161372802827 +9240 0.9240 3.6406292729454068 170.704211764948 +9241 0.9241 3.6235817217202340 170.246812738509 +9242 0.9242 3.6065799220232280 169.789181201613 +9243 0.9243 3.5896238968313323 169.331322636297 +9244 0.9244 3.5727136685730962 168.873242528426 +9245 0.9245 3.5558492591282973 168.414946367550 +9246 0.9246 3.5390306898275798 167.956439646797 +9247 0.9247 3.5222579814521020 167.497727862759 +9248 0.9248 3.5055311542331968 167.038816515345 +9249 0.9249 3.4888502278520446 166.579711107701 +9250 0.9250 3.4722152214393569 166.120417146050 +9251 0.9251 3.4556261535750754 165.660940139576 +9252 0.9252 3.4390830422880798 165.201285600339 +9253 0.9253 3.4225859050559082 164.741459043091 +9254 0.9254 3.4061347588044923 164.281465985222 +9255 0.9255 3.3897296199079014 163.821311946593 +9256 0.9256 3.3733705041881010 163.361002449414 +9257 0.9257 3.3570574269147224 162.900543018156 +9258 0.9258 3.3407904028048447 162.439939179397 +9259 0.9259 3.3245694460227893 161.979196461709 +9260 0.9260 3.3083945701799271 161.518320395536 +9261 0.9261 3.2922657883344955 161.057316513099 +9262 0.9262 3.2761831129914305 160.596190348201 +9263 0.9263 3.2601465561022103 160.134947436200 +9264 0.9264 3.2441561290647098 159.673593313808 +9265 0.9265 3.2282118427230690 159.212133519011 +9266 0.9266 3.2123137073675720 158.750573590930 +9267 0.9267 3.1964617327345399 158.288919069711 +9268 0.9268 3.1806559280062348 157.827175496391 +9269 0.9269 3.1648963018107770 157.365348412766 +9270 0.9270 3.1491828622220734 156.903443361301 +9271 0.9271 3.1335156167597593 156.441465884978 +9272 0.9272 3.1178945723891509 155.979421527189 +9273 0.9273 3.1023197355212120 155.517315831591 +9274 0.9274 3.0867911120125311 155.055154342023 +9275 0.9275 3.0713087071653131 154.592942602339 +9276 0.9276 3.0558725257273802 154.130686156319 +9277 0.9277 3.0404825718921882 153.668390547519 +9278 0.9278 3.0251388492988531 153.206061319184 +9279 0.9279 3.0098413610321901 152.743704014077 +9280 0.9280 2.9945901096227661 152.281324174403 +9281 0.9281 2.9793850970469635 151.818927341647 +9282 0.9282 2.9642263247270568 151.356519056489 +9283 0.9283 2.9491137935313008 150.894104858636 +9284 0.9284 2.9340475037740315 150.431690286749 +9285 0.9285 2.9190274552157800 149.969280878277 +9286 0.9286 2.9040536470633982 149.506882169361 +9287 0.9287 2.8891260779701948 149.044499694704 +9288 0.9288 2.8742447460360876 148.582138987438 +9289 0.9289 2.8594096488077656 148.119805579005 +9290 0.9290 2.8446207832788626 147.657504999055 +9291 0.9291 2.8298781458901452 147.195242775292 +9292 0.9292 2.8151817325297119 146.733024433369 +9293 0.9293 2.8005315385332055 146.270855496761 +9294 0.9294 2.7859275586840351 145.808741486644 +9295 0.9295 2.7713697872136147 145.346687921759 +9296 0.9296 2.7568582178016108 144.884700318323 +9297 0.9297 2.7423928435762019 144.422784189856 +9298 0.9298 2.7279736571143536 143.960945047109 +9299 0.9299 2.7136006504421033 143.499188397898 +9300 0.9300 2.6992738150348572 143.037519747021 +9301 0.9301 2.6849931418177015 142.575944596092 +9302 0.9302 2.6707586211657239 142.114468443457 +9303 0.9303 2.6565702429043481 141.653096784061 +9304 0.9304 2.6424279963096802 141.191835109298 +9305 0.9305 2.6283318701088692 140.730688906926 +9306 0.9306 2.6142818524804761 140.269663660935 +9307 0.9307 2.6002779310548592 139.808764851404 +9308 0.9308 2.5863200929145695 139.347997954392 +9309 0.9309 2.5724083245947584 138.887368441829 +9310 0.9310 2.5585426120835981 138.426881781378 +9311 0.9311 2.5447229408227137 137.966543436308 +9312 0.9312 2.5309492957076292 137.506358865384 +9313 0.9313 2.5172216610882225 137.046333522748 +9314 0.9314 2.5035400207691967 136.586472857772 +9315 0.9315 2.4899043580105595 136.126782314974 +9316 0.9316 2.4763146555281179 135.667267333857 +9317 0.9317 2.4627708954939842 135.207933348816 +9318 0.9318 2.4492730595370928 134.748785789008 +9319 0.9319 2.4358211287437315 134.289830078218 +9320 0.9320 2.4224150836580827 133.831071634762 +9321 0.9321 2.4090549042827778 133.372515871339 +9322 0.9322 2.3957405700794649 132.914168194921 +9323 0.9323 2.3824720599693872 132.456034006634 +9324 0.9324 2.3692493523339730 131.998118701645 +9325 0.9325 2.3560724250154399 131.540427669019 +9326 0.9326 2.3429412553174083 131.082966291614 +9327 0.9327 2.3298558200055299 130.625739945956 +9328 0.9328 2.3168160953081265 130.168754002112 +9329 0.9329 2.3038220569168417 129.712013823582 +9330 0.9330 2.2908736799873042 129.255524767173 +9331 0.9331 2.2779709391398022 128.799292182869 +9332 0.9332 2.2651138084599727 128.343321413725 +9333 0.9333 2.2523022614994996 127.887617795734 +9334 0.9334 2.2395362712768270 127.432186657715 +9335 0.9335 2.2268158102778810 126.977033321204 +9336 0.9336 2.2141408504568059 126.522163100295 +9337 0.9337 2.2015113632367131 126.067581301560 +9338 0.9338 2.1889273195104391 125.613293223922 +9339 0.9339 2.1763886896413167 125.159304158521 +9340 0.9340 2.1638954434639608 124.705619388601 +9341 0.9341 2.1514475502850612 124.252244189394 +9342 0.9342 2.1390449788841917 123.799183827996 +9343 0.9343 2.1266876975146287 123.346443563260 +9344 0.9344 2.1143756739041826 122.894028645659 +9345 0.9345 2.1021088752560413 122.441944317168 +9346 0.9346 2.0898872682496239 121.990195811183 +9347 0.9347 2.0777108190414482 121.538788352335 +9348 0.9348 2.0655794932660094 121.087727156442 +9349 0.9349 2.0534932560366705 120.637017430337 +9350 0.9350 2.0414520719465643 120.186664371786 +9351 0.9351 2.0294559050695073 119.736673169350 +9352 0.9352 2.0175047189609265 119.287049002269 +9353 0.9353 2.0055984766587951 118.837797040360 +9354 0.9354 1.9937371406845834 118.388922443870 +9355 0.9355 1.9819206730442198 117.940430363401 +9356 0.9356 1.9701490352290623 117.492325939748 +9357 0.9357 1.9584221882168837 117.044614303821 +9358 0.9358 1.9467400924728679 116.597300576497 +9359 0.9359 1.9351027079506165 116.150389868531 +9360 0.9360 1.9235099940931697 115.703887280404 +9361 0.9361 1.9119619098340368 115.257797902255 +9362 0.9362 1.9004584135982376 114.812126813730 +9363 0.9363 1.8889994633033580 114.366879083865 +9364 0.9364 1.8775850163606151 113.922059770994 +9365 0.9365 1.8662150296759343 113.477673922621 +9366 0.9366 1.8548894596510386 113.033726575295 +9367 0.9367 1.8436082621845484 112.590222754509 +9368 0.9368 1.8323713926730933 112.147167474592 +9369 0.9369 1.8211788060124354 111.704565738568 +9370 0.9370 1.8100304565986038 111.262422538064 +9371 0.9371 1.7989262983290408 110.820742853195 +9372 0.9372 1.7878662846037592 110.379531652436 +9373 0.9373 1.7768503683265116 109.938793892515 +9374 0.9374 1.7658785019059702 109.498534518313 +9375 0.9375 1.7549506372569177 109.058758462738 +9376 0.9376 1.7440667258014508 108.619470646598 +9377 0.9377 1.7332267184701948 108.180675978522 +9378 0.9378 1.7224305657035277 107.742379354819 +9379 0.9379 1.7116782174528180 107.304585659375 +9380 0.9380 1.7009696231816716 106.867299763554 +9381 0.9381 1.6903047318671907 106.430526526062 +9382 0.9382 1.6796834920012451 105.994270792849 +9383 0.9383 1.6691058515917525 105.558537397002 +9384 0.9384 1.6585717581639712 105.123331158624 +9385 0.9385 1.6480811587618036 104.688656884727 +9386 0.9386 1.6376339999491110 104.254519369126 +9387 0.9387 1.6272302278110387 103.820923392319 +9388 0.9388 1.6168697879553533 103.387873721386 +9389 0.9389 1.6065526255137903 102.955375109876 +9390 0.9390 1.5962786851434119 102.523432297691 +9391 0.9391 1.5860479110279775 102.092050010997 +9392 0.9392 1.5758602468793237 101.661232962079 +9393 0.9393 1.5657156359387558 101.230985849279 +9394 0.9394 1.5556140209784497 100.801313356843 +9395 0.9395 1.5455553443028656 100.372220154841 +9396 0.9396 1.5355395477501712 99.943710899047 +9397 0.9397 1.5255665726936769 99.515790230840 +9398 0.9398 1.5156363600432805 99.088462777089 +9399 0.9399 1.5057488502469238 98.661733150044 +9400 0.9400 1.4959039832920598 98.235605947237 +9401 0.9401 1.4861016987071289 97.810085751379 +9402 0.9402 1.4763419355630485 97.385177130232 +9403 0.9403 1.4666246324747103 96.960884636533 +9404 0.9404 1.4569497276024908 96.537212807859 +9405 0.9405 1.4473171586537705 96.114166166546 +9406 0.9406 1.4377268628844648 95.691749219570 +9407 0.9407 1.4281787771005638 95.269966458451 +9408 0.9408 1.4186728376596844 94.848822359136 +9409 0.9409 1.4092089804726322 94.428321381907 +9410 0.9410 1.3997871410049731 94.008467971275 +9411 0.9411 1.3904072542786163 93.589266555863 +9412 0.9412 1.3810692548734067 93.170721548331 +9413 0.9413 1.3717730769287277 92.752837345250 +9414 0.9414 1.3625186541451155 92.335618326995 +9415 0.9415 1.3533059197858823 91.919068857669 +9416 0.9416 1.3441348066787502 91.503193284975 +9417 0.9417 1.3350052472174949 91.087995940131 +9418 0.9418 1.3259171733636004 90.673481137760 +9419 0.9419 1.3168705166479227 90.259653175794 +9420 0.9420 1.3078652081723647 89.846516335364 +9421 0.9421 1.2989011786115605 89.434074880721 +9422 0.9422 1.2899783582145687 89.022333059115 +9423 0.9423 1.2810966768065781 88.611295100697 +9424 0.9424 1.2722560637906215 88.200965218434 +9425 0.9425 1.2634564481493000 87.791347607994 +9426 0.9426 1.2546977584465169 87.382446447668 +9427 0.9427 1.2459799228292212 86.974265898247 +9428 0.9428 1.2373028690291619 86.566810102941 +9429 0.9429 1.2286665243646513 86.160083187272 +9430 0.9430 1.2200708157423379 85.754089258996 +9431 0.9431 1.2115156696589895 85.348832407973 +9432 0.9432 1.2030010122032855 84.944316706105 +9433 0.9433 1.1945267690576196 84.540546207215 +9434 0.9434 1.1860928654999106 84.137524946967 +9435 0.9435 1.1776992264054240 83.735256942765 +9436 0.9436 1.1693457762486028 83.333746193659 +9437 0.9437 1.1610324391049076 82.932996680245 +9438 0.9438 1.1527591386526665 82.533012364574 +9439 0.9439 1.1445257981749344 82.133797190071 +9440 0.9440 1.1363323405613597 81.735355081424 +9441 0.9441 1.1281786883100637 81.337689944493 +9442 0.9442 1.1200647635295276 80.940805666230 +9443 0.9443 1.1119904879404872 80.544706114578 +9444 0.9444 1.1039557828778392 80.149395138379 +9445 0.9445 1.0959605692925560 79.754876567284 +9446 0.9446 1.0880047677536089 79.361154211659 +9447 0.9447 1.0800882984499007 78.968231862505 +9448 0.9448 1.0722110811922079 78.576113291351 +9449 0.9449 1.0643730354151311 78.184802250186 +9450 0.9450 1.0565740801790546 77.794302471344 +9451 0.9451 1.0488141341721153 77.404617667441 +9452 0.9452 1.0410931157121801 77.015751531265 +9453 0.9453 1.0334109427488316 76.627707735704 +9454 0.9454 1.0257675328653642 76.240489933645 +9455 0.9455 1.0181628032807870 75.854101757896 +9456 0.9456 1.0105966708518372 75.468546821100 +9457 0.9457 1.0030690520750003 75.083828715640 +9458 0.9458 0.9955798630885403 74.699951013559 +9459 0.9459 0.9881290196745385 74.316917266478 +9460 0.9460 0.9807164372609395 73.934731005502 +9461 0.9461 0.9733420309236073 73.553395741143 +9462 0.9462 0.9660057153883885 73.172914963232 +9463 0.9463 0.9587074050331853 72.793292140833 +9464 0.9464 0.9514470138900353 72.414530722168 +9465 0.9465 0.9442244556472005 72.036634134527 +9466 0.9466 0.9370396436512648 71.659605784186 +9467 0.9467 0.9298924909092389 71.283449056332 +9468 0.9468 0.9227829100906737 70.908167314971 +9469 0.9469 0.9157108135297825 70.533763902855 +9470 0.9470 0.9086761132275699 70.160242141395 +9471 0.9471 0.9016787208539707 69.787605330590 +9472 0.9472 0.8947185477499942 69.415856748942 +9473 0.9473 0.8877955049298785 69.044999653372 +9474 0.9474 0.8809095030832524 68.675037279148 +9475 0.9475 0.8740604525773047 68.305972839808 +9476 0.9476 0.8672482634589602 67.937809527082 +9477 0.9477 0.8604728454570659 67.570550510803 +9478 0.9478 0.8537341079845838 67.204198938840 +9479 0.9479 0.8470319601407901 66.838757937035 +9480 0.9480 0.8403663107134833 66.474230609100 +9481 0.9481 0.8337370681812006 66.110620036553 +9482 0.9482 0.8271441407154402 65.747929278656 +9483 0.9483 0.8205874361828912 65.386161372324 +9484 0.9484 0.8140668621476721 65.025319332058 +9485 0.9485 0.8075823258735757 64.665406149870 +9486 0.9486 0.8011337343263215 64.306424795213 +9487 0.9487 0.7947209941758158 63.948378214902 +9488 0.9488 0.7883440117984181 63.591269333052 +9489 0.9489 0.7820026932792156 63.235101050998 +9490 0.9490 0.7756969444143043 62.879876247229 +9491 0.9491 0.7694266707130770 62.525597777316 +9492 0.9492 0.7631917774005189 62.172268473846 +9493 0.9493 0.7569921694195094 61.819891146344 +9494 0.9494 0.7508277514331316 61.468468581212 +9495 0.9495 0.7446984278269883 61.118003541656 +9496 0.9496 0.7386041027115240 60.768498767629 +9497 0.9497 0.7325446799243551 60.419956975748 +9498 0.9498 0.7265200630326059 60.072380859237 +9499 0.9499 0.7205301553352511 59.725773087859 +9500 0.9500 0.7145748598654657 59.380136307850 +9501 0.9501 0.7086540793929804 59.035473141855 +9502 0.9502 0.7027677164264444 58.691786188864 +9503 0.9503 0.6969156732157941 58.349078024143 +9504 0.9504 0.6910978517546278 58.007351199182 +9505 0.9505 0.6853141537825876 57.666608241620 +9506 0.9506 0.6795644807877473 57.326851655187 +9507 0.9507 0.6738487340090060 56.988083919640 +9508 0.9508 0.6681668144384885 56.650307490712 +9509 0.9509 0.6625186228239507 56.313524800043 +9510 0.9510 0.6569040596711929 55.977738255112 +9511 0.9511 0.6513230252464774 55.642950239198 +9512 0.9512 0.6457754195789523 55.309163111303 +9513 0.9513 0.6402611424630822 54.976379206100 +9514 0.9514 0.6347800934610831 54.644600833882 +9515 0.9515 0.6293321719053647 54.313830280486 +9516 0.9516 0.6239172769009773 53.984069807262 +9517 0.9517 0.6185353073280646 53.655321650993 +9518 0.9518 0.6131861618443221 53.327588023857 +9519 0.9519 0.6078697388874612 53.000871113360 +9520 0.9520 0.6025859366776787 52.675173082290 +9521 0.9521 0.5973346532201311 52.350496068660 +9522 0.9522 0.5921157863074156 52.026842185652 +9523 0.9523 0.5869292335220545 51.704213521570 +9524 0.9524 0.5817748922389867 51.382612139785 +9525 0.9525 0.5766526596280633 51.062040078683 +9526 0.9526 0.5715624326565484 50.742499351616 +9527 0.9527 0.5665041080916250 50.423991946852 +9528 0.9528 0.5614775825029065 50.106519827519 +9529 0.9529 0.5564827522649520 49.790084931570 +9530 0.9530 0.5515195135597873 49.474689171723 +9531 0.9531 0.5465877623794307 49.160334435410 +9532 0.9532 0.5416873945284227 48.847022584749 +9533 0.9533 0.5368183056263616 48.534755456475 +9534 0.9534 0.5319803911104426 48.223534861905 +9535 0.9535 0.5271735462380026 47.913362586895 +9536 0.9536 0.5223976660890685 47.604240391789 +9537 0.9537 0.5176526455689099 47.296170011383 +9538 0.9538 0.5129383794105973 46.989153154870 +9539 0.9539 0.5082547621775634 46.683191505809 +9540 0.9540 0.5036016882661692 46.378286722073 +9541 0.9541 0.4989790519082746 46.074440435819 +9542 0.9542 0.4943867471738119 45.771654253435 +9543 0.9543 0.4898246679733649 45.469929755506 +9544 0.9544 0.4852927080607508 45.169268496776 +9545 0.9545 0.4807907610356067 44.869672006105 +9546 0.9546 0.4763187203459799 44.571141786431 +9547 0.9547 0.4718764792909215 44.273679314736 +9548 0.9548 0.4674639310230844 43.977286042007 +9549 0.9549 0.4630809685513241 43.681963393199 +9550 0.9550 0.4587274847433043 43.387712767197 +9551 0.9551 0.4544033723281050 43.094535536789 +9552 0.9552 0.4501085238988345 42.802433048620 +9553 0.9553 0.4458428319152447 42.511406623176 +9554 0.9554 0.4416061887063497 42.221457554724 +9555 0.9555 0.4373984864730481 41.932587111308 +9556 0.9556 0.4332196172907477 41.644796534700 +9557 0.9557 0.4290694731119942 41.358087040371 +9558 0.9558 0.4249479457691019 41.072459817473 +9559 0.9559 0.4208549269767889 40.787916028787 +9560 0.9560 0.4167903083348138 40.504456810716 +9561 0.9561 0.4127539813306159 40.222083273243 +9562 0.9562 0.4087458373419582 39.940796499911 +9563 0.9563 0.4047657676395731 39.660597547791 +9564 0.9564 0.4008136633898107 39.381487447457 +9565 0.9565 0.3968894156572898 39.103467202960 +9566 0.9566 0.3929929154075513 38.826537791809 +9567 0.9567 0.3891240535097139 38.550700164940 +9568 0.9568 0.3852827207391321 38.275955246695 +9569 0.9569 0.3814688077800575 38.002303934796 +9570 0.9570 0.3776822052283014 37.729747100326 +9571 0.9571 0.3739228035938993 37.458285587716 +9572 0.9572 0.3701904933037783 37.187920214705 +9573 0.9573 0.3664851647044262 36.918651772338 +9574 0.9574 0.3628067080645624 36.650481024937 +9575 0.9575 0.3591550135778112 36.383408710087 +9576 0.9576 0.3555299713653763 36.117435538612 +9577 0.9577 0.3519314714787171 35.852562194571 +9578 0.9578 0.3483594039022272 35.588789335226 +9579 0.9579 0.3448136585559141 35.326117591038 +9580 0.9580 0.3412941252980800 35.064547565643 +9581 0.9581 0.3378006939280058 34.804079835842 +9582 0.9582 0.3343332541886336 34.544714951601 +9583 0.9583 0.3308916957692531 34.286453436010 +9584 0.9584 0.3274759083081881 34.029295785291 +9585 0.9585 0.3240857813954841 33.773242468788 +9586 0.9586 0.3207212045755974 33.518293928945 +9587 0.9587 0.3173820673500851 33.264450581302 +9588 0.9588 0.3140682591802955 33.011712814491 +9589 0.9589 0.3107796694900600 32.760080990218 +9590 0.9590 0.3075161876683860 32.509555443264 +9591 0.9591 0.3042777030721491 32.260136481472 +9592 0.9592 0.3010641050287883 32.011824385745 +9593 0.9593 0.2978752828389990 31.764619410040 +9594 0.9594 0.2947111257794289 31.518521781361 +9595 0.9595 0.2915715231053727 31.273531699764 +9596 0.9596 0.2884563640534676 31.029649338337 +9597 0.9597 0.2853655378443899 30.786874843216 +9598 0.9598 0.2822989336855505 30.545208333573 +9599 0.9599 0.2792564407737907 30.304649901622 +9600 0.9600 0.2762379482980791 30.065199612611 +9601 0.9601 0.2732433454422071 29.826857504828 +9602 0.9602 0.2702725213874857 29.589623589601 +9603 0.9603 0.2673253653154400 29.353497851312 +9604 0.9604 0.2644017664105058 29.118480247372 +9605 0.9605 0.2615016138627244 28.884570708257 +9606 0.9606 0.2586247968704367 28.651769137496 +9607 0.9607 0.2557712046429781 28.420075411676 +9608 0.9608 0.2529407264033717 28.189489380452 +9609 0.9609 0.2501332513910212 27.960010866558 +9610 0.9610 0.2473486688644029 27.731639665807 +9611 0.9611 0.2445868681037572 27.504375547107 +9612 0.9612 0.2418477384137786 27.278218252466 +9613 0.9613 0.2391311691263052 27.053167497001 +9614 0.9614 0.2364370496030073 26.829222968958 +9615 0.9615 0.2337652692380737 26.606384329714 +9616 0.9616 0.2311157174608982 26.384651213795 +9617 0.9617 0.2284882837387640 26.164023228890 +9618 0.9618 0.2258828575795263 25.944499955863 +9619 0.9619 0.2232993285342949 25.726080948766 +9620 0.9620 0.2207375862001134 25.508765734864 +9621 0.9621 0.2181975202226379 25.292553814645 +9622 0.9622 0.2156790202988138 25.077444661837 +9623 0.9623 0.2131819761795504 24.863437723431 +9624 0.9624 0.2107062776723941 24.650532419696 +9625 0.9625 0.2082518146441991 24.438728144203 +9626 0.9626 0.2058184770237967 24.228024263845 +9627 0.9627 0.2034061548046617 24.018420118855 +9628 0.9628 0.2010147380475772 23.809915022836 +9629 0.9629 0.1986441168832964 23.602508262779 +9630 0.9630 0.1962941815152031 23.396199099088 +9631 0.9631 0.1939648222219683 23.190986765608 +9632 0.9632 0.1916559293602055 22.986870469648 +9633 0.9633 0.1893673933671225 22.783849392011 +9634 0.9634 0.1870991047631711 22.581922687018 +9635 0.9635 0.1848509541546932 22.381089482540 +9636 0.9636 0.1826228322365648 22.181348880028 +9637 0.9637 0.1804146297948364 21.982699954538 +9638 0.9638 0.1782262377093710 21.785141754770 +9639 0.9639 0.1760575469564779 21.588673303092 +9640 0.9640 0.1739084486115443 21.393293595580 +9641 0.9641 0.1717788338516630 21.199001602046 +9642 0.9642 0.1696685939582567 21.005796266081 +9643 0.9643 0.1675776203196989 20.813676505075 +9644 0.9644 0.1655058044339313 20.622641210276 +9645 0.9645 0.1634530379110773 20.432689246805 +9646 0.9646 0.1614192124760516 20.243819453709 +9647 0.9647 0.1594042199711666 20.056030643990 +9648 0.9648 0.1574079523587342 19.869321604658 +9649 0.9649 0.1554303017236635 19.683691096756 +9650 0.9650 0.1534711602760550 19.499137855415 +9651 0.9651 0.1515304203537901 19.315660589883 +9652 0.9652 0.1496079744251164 19.133257983589 +9653 0.9653 0.1477037150912288 18.951928694164 +9654 0.9654 0.1458175350888455 18.771671353502 +9655 0.9655 0.1439493272927803 18.592484567802 +9656 0.9656 0.1420989847185095 18.414366917614 +9657 0.9657 0.1402664005247347 18.237316957882 +9658 0.9658 0.1384514680159401 18.061333218010 +9659 0.9659 0.1366540806449453 17.886414201886 +9660 0.9660 0.1348741320154529 17.712558387961 +9661 0.9661 0.1331115158845913 17.539764229272 +9662 0.9662 0.1313661261654515 17.368030153523 +9663 0.9663 0.1296378569296198 17.197354563111 +9664 0.9664 0.1279266024097039 17.027735835208 +9665 0.9665 0.1262322570018540 16.859172321789 +9666 0.9666 0.1245547152682791 16.691662349709 +9667 0.9667 0.1228938719397564 16.525204220746 +9668 0.9668 0.1212496219181355 16.359796211672 +9669 0.9669 0.1196218602788368 16.195436574302 +9670 0.9670 0.1180104822733438 16.032123535558 +9671 0.9671 0.1164153833316896 15.869855297526 +9672 0.9672 0.1148364590649370 15.708630037526 +9673 0.9673 0.1132736052676525 15.548445908163 +9674 0.9674 0.1117267179203743 15.389301037401 +9675 0.9675 0.1101956931920730 15.231193528625 +9676 0.9676 0.1086804274426067 15.074121460702 +9677 0.9677 0.1071808172251691 14.918082888050 +9678 0.9678 0.1056967592887310 14.763075840712 +9679 0.9679 0.1042281505804749 14.609098324409 +9680 0.9680 0.1027748882482233 14.456148320624 +9681 0.9681 0.1013368696428586 14.304223786670 +9682 0.9682 0.0999139923207376 14.153322655749 +9683 0.9683 0.0985061540460979 14.003442837045 +9684 0.9684 0.0971132527934569 13.854582215775 +9685 0.9685 0.0957351867500044 13.706738653275 +9686 0.9686 0.0943718543179866 13.559909987082 +9687 0.9687 0.0930231541170829 13.414094030992 +9688 0.9688 0.0916889849867757 13.269288575151 +9689 0.9689 0.0903692459887119 13.125491386126 +9690 0.9690 0.0890638364090562 12.982700206988 +9691 0.9691 0.0877726557608372 12.840912757391 +9692 0.9692 0.0864956037862851 12.700126733652 +9693 0.9693 0.0852325804591609 12.560339808832 +9694 0.9694 0.0839834859870784 12.421549632817 +9695 0.9695 0.0827482208138169 12.283753832413 +9696 0.9696 0.0815266856216256 12.146950011413 +9697 0.9697 0.0803187813335201 12.011135750698 +9698 0.9698 0.0791244091155692 11.876308608320 +9699 0.9699 0.0779434703791743 11.742466119578 +9700 0.9700 0.0767758667833389 11.609605797130 +9701 0.9701 0.0756215002369294 11.477725131059 +9702 0.9702 0.0744802729009276 11.346821588978 +9703 0.9703 0.0733520871906727 11.216892616119 +9704 0.9704 0.0722368457780957 11.087935635422 +9705 0.9705 0.0711344515939431 10.959948047630 +9706 0.9706 0.0700448078299920 10.832927231391 +9707 0.9707 0.0689678179412551 10.706870543347 +9708 0.9708 0.0679033856481765 10.581775318225 +9709 0.9709 0.0668514149388178 10.457638868950 +9710 0.9710 0.0658118100710338 10.334458486730 +9711 0.9711 0.0647844755746393 10.212231441160 +9712 0.9712 0.0637693162535648 10.090954980329 +9713 0.9713 0.0627662371880025 9.970626330918 +9714 0.9714 0.0617751437365419 9.851242698293 +9715 0.9715 0.0607959415382960 9.732801266625 +9716 0.9716 0.0598285365150153 9.615299198989 +9717 0.9717 0.0588728348731928 9.498733637462 +9718 0.9718 0.0579287431061577 9.383101703240 +9719 0.9719 0.0569961679961585 9.268400496743 +9720 0.9720 0.0560750166164350 9.154627097727 +9721 0.9721 0.0551651963332795 9.041778565383 +9722 0.9722 0.0542666148080871 8.929851938466 +9723 0.9723 0.0533791799993944 8.818844235387 +9724 0.9724 0.0525028001649079 8.708752454343 +9725 0.9725 0.0516373838635198 8.599573573419 +9726 0.9726 0.0507828399573130 8.491304550717 +9727 0.9727 0.0499390776135541 8.383942324462 +9728 0.9728 0.0491060063066753 8.277483813114 +9729 0.9729 0.0482835358202444 8.171925915504 +9730 0.9730 0.0474715762489221 8.067265510941 +9731 0.9731 0.0466700380004085 7.963499459332 +9732 0.9732 0.0458788317973763 7.860624601311 +9733 0.9733 0.0450978686793931 7.758637758354 +9734 0.9734 0.0443270600048298 7.657535732912 +9735 0.9735 0.0435663174527578 7.557315308527 +9736 0.9736 0.0428155530248335 7.457973249960 +9737 0.9737 0.0420746790471696 7.359506303317 +9738 0.9738 0.0413436081721943 7.261911196190 +9739 0.9739 0.0406222533804967 7.165184637762 +9740 0.9740 0.0399105279826605 7.069323318961 +9741 0.9741 0.0392083456210835 6.974323912579 +9742 0.9742 0.0385156202717846 6.880183073400 +9743 0.9743 0.0378322662461973 6.786897438346 +9744 0.9744 0.0371581981929502 6.694463626596 +9745 0.9745 0.0364933310996330 6.602878239747 +9746 0.9746 0.0358375802945495 6.512137861923 +9747 0.9747 0.0351908614484574 6.422239059920 +9748 0.9748 0.0345530905762931 6.333178383365 +9749 0.9749 0.0339241840388839 6.244952364820 +9750 0.9750 0.0333040585446449 6.157557519959 +9751 0.9751 0.0326926311512623 6.070990347694 +9752 0.9752 0.0320898192673623 5.985247330305 +9753 0.9753 0.0314955406541667 5.900324933607 +9754 0.9754 0.0309097134271320 5.816219607088 +9755 0.9755 0.0303322560575750 5.732927784052 +9756 0.9756 0.0297630873742839 5.650445881770 +9757 0.9757 0.0292021265651144 5.568770301619 +9758 0.9758 0.0286492931785710 5.487897429249 +9759 0.9759 0.0281045071253721 5.407823634729 +9760 0.9760 0.0275676886800018 5.328545272677 +9761 0.9761 0.0270387584822453 5.250058682454 +9762 0.9762 0.0265176375387084 5.172360188283 +9763 0.9763 0.0260042472243232 5.095446099421 +9764 0.9764 0.0254985092838368 5.019312710308 +9765 0.9765 0.0250003458332846 4.943956300736 +9766 0.9766 0.0245096793614482 4.869373135991 +9767 0.9767 0.0240264327312968 4.795559467037 +9768 0.9768 0.0235505291814127 4.722511530645 +9769 0.9769 0.0230818923274012 4.650225549585 +9770 0.9770 0.0226204461632834 4.578697732772 +9771 0.9771 0.0221661150628725 4.507924275446 +9772 0.9772 0.0217188237811347 4.437901359310 +9773 0.9773 0.0212784974555328 4.368625152727 +9774 0.9774 0.0208450616073529 4.300091810872 +9775 0.9775 0.0204184421430140 4.232297475906 +9776 0.9776 0.0199985653553617 4.165238277139 +9777 0.9777 0.0195853579249440 4.098910331215 +9778 0.9778 0.0191787469212699 4.033309742267 +9779 0.9779 0.0187786598040510 3.968432602111 +9780 0.9780 0.0183850244244256 3.904274990398 +9781 0.9781 0.0179977690261652 3.840832974810 +9782 0.9782 0.0176168222468633 3.778102611228 +9783 0.9783 0.0172421131191065 3.716079943908 +9784 0.9784 0.0168735710716275 3.654761005672 +9785 0.9785 0.0165111259304407 3.594141818063 +9786 0.9786 0.0161547079199592 3.534218391567 +9787 0.9787 0.0158042476640931 3.474986725756 +9788 0.9788 0.0154596761873304 3.416442809497 +9789 0.9789 0.0151209249157993 3.358582621126 +9790 0.9790 0.0147879256783107 3.301402128645 +9791 0.9791 0.0144606107073841 3.244897289888 +9792 0.9792 0.0141389126402525 3.189064052743 +9793 0.9793 0.0138227645198497 3.133898355314 +9794 0.9794 0.0135120997957782 3.079396126116 +9795 0.9795 0.0132068523252582 3.025553284283 +9796 0.9796 0.0129069563740563 2.972365739755 +9797 0.9797 0.0126123466173960 2.919829393452 +9798 0.9798 0.0123229581408483 2.867940137501 +9799 0.9799 0.0120387264412023 2.816693855420 +9800 0.9800 0.0117595874273158 2.766086422310 +9801 0.9801 0.0114854774209473 2.716113705060 +9802 0.9802 0.0112163331575666 2.666771562553 +9803 0.9803 0.0109520917871459 2.618055845862 +9804 0.9804 0.0106926908749305 2.569962398445 +9805 0.9805 0.0104380684021898 2.522487056370 +9806 0.9806 0.0101881627669461 2.475625648503 +9807 0.9807 0.0099429127846849 2.429373996721 +9808 0.9808 0.0097022576890428 2.383727916122 +9809 0.9809 0.0094661371324754 2.338683215226 +9810 0.9810 0.0092344911869044 2.294235696193 +9811 0.9811 0.0090072603443432 2.250381155031 +9812 0.9812 0.0087843855175007 2.207115381819 +9813 0.9813 0.0085658080403649 2.164434160897 +9814 0.9814 0.0083514696687645 2.122333271111 +9815 0.9815 0.0081413125809089 2.080808486001 +9816 0.9816 0.0079352793779068 2.039855574042 +9817 0.9817 0.0077333130842621 1.999470298852 +9818 0.9818 0.0075353571483490 1.959648419409 +9819 0.9819 0.0073413554428648 1.920385690275 +9820 0.9820 0.0071512522652599 1.881677861823 +9821 0.9821 0.0069649923381456 1.843520680463 +9822 0.9822 0.0067825208096798 1.805909888853 +9823 0.9823 0.0066037832539302 1.768841226140 +9824 0.9824 0.0064287256712143 1.732310428177 +9825 0.9825 0.0062572944884176 1.696313227758 +9826 0.9826 0.0060894365592875 1.660845354844 +9827 0.9827 0.0059250991647052 1.625902536802 +9828 0.9828 0.0057642300129340 1.591480498622 +9829 0.9829 0.0056067772398442 1.557574963174 +9830 0.9830 0.0054526894091150 1.524181651411 +9831 0.9831 0.0053019155124126 1.491296282637 +9832 0.9832 0.0051544049695444 1.458914574727 +9833 0.9833 0.0050101076285894 1.427032244372 +9834 0.9834 0.0048689737660052 1.395645007313 +9835 0.9835 0.0047309540867103 1.364748578584 +9836 0.9836 0.0045959997241432 1.334338672759 +9837 0.9837 0.0044640622402956 1.304411004193 +9838 0.9838 0.0043350936257231 1.274961287256 +9839 0.9839 0.0042090462995297 1.245985236613 +9840 0.9840 0.0040858731093279 1.217478567422 +9841 0.9841 0.0039655273311753 1.189436995630 +9842 0.9842 0.0038479626694844 1.161856238188 +9843 0.9843 0.0037331332569091 1.134732013319 +9844 0.9844 0.0036209936542043 1.108060040776 +9845 0.9845 0.0035114988500616 1.081836042078 +9846 0.9846 0.0034046042609189 1.056055740776 +9847 0.9847 0.0033002657307443 1.030714862717 +9848 0.9848 0.0031984395307944 1.005809136281 +9849 0.9849 0.0030990823593472 0.981334292663 +9850 0.9850 0.0030021513414088 0.957286066105 +9851 0.9851 0.0029076040283939 0.933660194193 +9852 0.9852 0.0028153983977799 0.910452418087 +9853 0.9853 0.0027254928527345 0.887658482820 +9854 0.9854 0.0026378462217182 0.865274137507 +9855 0.9855 0.0025524177580587 0.843295135682 +9856 0.9856 0.0024691671394987 0.821717235518 +9857 0.9857 0.0023880544677176 0.800536200104 +9858 0.9858 0.0023090402678260 0.779747797728 +9859 0.9859 0.0022320854878327 0.759347802139 +9860 0.9860 0.0021571514980844 0.739331992827 +9861 0.9861 0.0020842000906788 0.719696155285 +9862 0.9862 0.0020131934788496 0.700436081298 +9863 0.9863 0.0019440942963234 0.681547569226 +9864 0.9864 0.0018768655966499 0.663026424244 +9865 0.9865 0.0018114708525038 0.644868458679 +9866 0.9866 0.0017478739549579 0.627069492239 +9867 0.9867 0.0016860392127290 0.609625352338 +9868 0.9868 0.0016259313513951 0.592531874341 +9869 0.9869 0.0015675155125847 0.575784901867 +9870 0.9870 0.0015107572531370 0.559380287086 +9871 0.9871 0.0014556225442327 0.543313891001 +9872 0.9872 0.0014020777704974 0.527581583705 +9873 0.9873 0.0013500897290759 0.512179244724 +9874 0.9874 0.0012996256286765 0.497102763264 +9875 0.9875 0.0012506530885863 0.482348038540 +9876 0.9876 0.0012031401376574 0.467910980038 +9877 0.9877 0.0011570552132644 0.453787507822 +9878 0.9878 0.0011123671602307 0.439973552853 +9879 0.9879 0.0010690452297255 0.426465057250 +9880 0.9880 0.0010270590781328 0.413257974605 +9881 0.9881 0.0009863787658876 0.400348270299 +9882 0.9882 0.0009469747562834 0.387731921785 +9883 0.9883 0.0009088179142494 0.375404918894 +9884 0.9884 0.0008718795050975 0.363363264145 +9885 0.9885 0.0008361311932378 0.351602973049 +9886 0.9886 0.0008015450408639 0.340120074429 +9887 0.9887 0.0007680935066077 0.328910610695 +9888 0.9888 0.0007357494441632 0.317970638194 +9889 0.9889 0.0007044861008789 0.307296227493 +9890 0.9890 0.0006742771163189 0.296883463706 +9891 0.9891 0.0006450965207929 0.286728446814 +9892 0.9892 0.0006169187338550 0.276827291945 +9893 0.9893 0.0005897185627703 0.267176129748 +9894 0.9894 0.0005634712009500 0.257771106659 +9895 0.9895 0.0005381522263542 0.248608385257 +9896 0.9896 0.0005137375998637 0.239684144553 +9897 0.9897 0.0004902036636182 0.230994580356 +9898 0.9898 0.0004675271393236 0.222535905536 +9899 0.9899 0.0004456851265260 0.214304350415 +9900 0.9900 0.0004246551008535 0.206296163036 +9901 0.9901 0.0004044149122242 0.198507609550 +9902 0.9902 0.0003849427830235 0.190934974464 +9903 0.9903 0.0003662173062468 0.183574561070 +9904 0.9904 0.0003482174436089 0.176422691688 +9905 0.9905 0.0003309225236213 0.169475708063 +9906 0.9906 0.0003143122396353 0.162729971658 +9907 0.9907 0.0002983666478514 0.156181864019 +9908 0.9908 0.0002830661652962 0.149827787085 +9909 0.9909 0.0002683915677636 0.143664163567 +9910 0.9910 0.0002543239877238 0.137687437229 +9911 0.9911 0.0002408449121972 0.131894073303 +9912 0.9912 0.0002279361805940 0.126280558761 +9913 0.9913 0.0002155799825210 0.120843402699 +9914 0.9914 0.0002037588555519 0.115579136683 +9915 0.9915 0.0001924556829634 0.110484315088 +9916 0.9916 0.0001816536914373 0.105555515433 +9917 0.9917 0.0001713364487277 0.100789338760 +9918 0.9918 0.0001614878612914 0.096182409967 +9919 0.9919 0.0001520921718853 0.091731378155 +9920 0.9920 0.0001431339571278 0.087432916993 +9921 0.9921 0.0001345981250243 0.083283725077 +9922 0.9922 0.0001264699124563 0.079280526284 +9923 0.9923 0.0001187348826360 0.075420070122 +9924 0.9924 0.0001113789225259 0.071699132080 +9925 0.9925 0.0001043882402198 0.068114514042 +9926 0.9926 0.0000977493622886 0.064663044582 +9927 0.9927 0.0000914491310918 0.061341579353 +9928 0.9928 0.0000854747020498 0.058147001488 +9929 0.9929 0.0000798135408796 0.055076221917 +9930 0.9930 0.0000744534207963 0.052126179747 +9931 0.9931 0.0000693824196764 0.049293842651 +9932 0.9932 0.0000645889171825 0.046576207228 +9933 0.9933 0.0000600615918528 0.043970299366 +9934 0.9934 0.0000557894181535 0.041473174620 +9935 0.9935 0.0000517616634915 0.039081918619 +9936 0.9936 0.0000479678851917 0.036793647378 +9937 0.9937 0.0000443979274358 0.034605507740 +9938 0.9938 0.0000410419181630 0.032514677717 +9939 0.9939 0.0000378902659329 0.030518366884 +9940 0.9940 0.0000349336567502 0.028613816770 +9941 0.9941 0.0000321630508513 0.026798301208 +9942 0.9942 0.0000295696794518 0.025069126783 +9943 0.9943 0.0000271450414556 0.023423633141 +9944 0.9944 0.0000248809001268 0.021859193434 +9945 0.9945 0.0000227692797206 0.020373214690 +9946 0.9946 0.0000208024620754 0.018963138215 +9947 0.9947 0.0000189729831670 0.017626439953 +9948 0.9948 0.0000172736296227 0.016360630932 +9949 0.9949 0.0000156974351959 0.015163257604 +9950 0.9950 0.0000142376772015 0.014031902284 +9951 0.9951 0.0000128878729113 0.012964183520 +9952 0.9952 0.0000116417759091 0.011957756525 +9953 0.9953 0.0000104933724057 0.011010313542 +9954 0.9954 0.0000094368775155 0.010119584263 +9955 0.9955 0.0000084667314907 0.009283336232 +9956 0.9956 0.0000075775959158 0.008499375266 +9957 0.9957 0.0000067643498613 0.007765545825 +9958 0.9958 0.0000060220859969 0.007079731463 +9959 0.9959 0.0000053461066640 0.006439855194 +9960 0.9960 0.0000047319199066 0.005843879955 +9961 0.9961 0.0000041752354607 0.005289808962 +9962 0.9962 0.0000036719607039 0.004775686173 +9963 0.9963 0.0000032181965615 0.004299596676 +9964 0.9964 0.0000028102333724 0.003859667105 +9965 0.9965 0.0000024445467136 0.003454066072 +9966 0.9966 0.0000021177931802 0.003081004596 +9967 0.9967 0.0000018268061264 0.002738736479 +9968 0.9968 0.0000015685913626 0.002425558798 +9969 0.9969 0.0000013403228094 0.002139812266 +9970 0.9970 0.0000011393381119 0.001879881684 +9971 0.9971 0.0000009631342090 0.001644196375 +9972 0.9972 0.0000008093628600 0.001431230605 +9973 0.9973 0.0000006758261288 0.001239504018 +9974 0.9974 0.0000005604718253 0.001067582053 +9975 0.9975 0.0000004613889024 0.000914076405 +9976 0.9976 0.0000003768028111 0.000777645421 +9977 0.9977 0.0000003050708110 0.000656994580 +9978 0.9978 0.0000002446772376 0.000550876888 +9979 0.9979 0.0000001942287250 0.000458093365 +9980 0.9980 0.0000001524493857 0.000377493421 +9981 0.9981 0.0000001181759455 0.000307975382 +9982 0.9982 0.0000000903528342 0.000248486845 +9983 0.9983 0.0000000680272320 0.000198025199 +9984 0.9984 0.0000000503440708 0.000155638024 +9985 0.9985 0.0000000365409926 0.000120423540 +9986 0.9986 0.0000000259432605 0.000091531102 +9987 0.9987 0.0000000179586256 0.000068161597 +9988 0.9988 0.0000000120721492 0.000049567931 +9989 0.9989 0.0000000078409804 0.000035055444 +9990 0.9990 0.0000000048890860 0.000023982445 +9991 0.9991 0.0000000029019359 0.000015760555 +9992 0.9992 0.0000000016211434 0.000009855295 +9993 0.9993 0.0000000008390583 0.000005786407 +9994 0.9994 0.0000000003933154 0.000003128451 +9995 0.9995 0.0000000001613347 0.000001511164 +9996 0.9996 0.0000000000547778 0.000000619975 +9997 0.9997 0.0000000000139549 0.000000196483 +9998 0.9998 0.0000000000021871 0.000000038872 +9999 0.9999 0.0000000000001218 0.000000002435 +10000 1.0000 0.0000000000000000 0.000000000000 +#Correcting potential for cireaxFF CH + +CH_cireaxFF +N 11000 R 0.0001 1.1 + +1 0.0001 22788987.6637434661388397 199238099992.029479980469 +2 0.0002 10336611.1345401313155890 49809430592.037185668945 +3 0.0003 6739266.8620063066482544 22137454858.639308929443 +4 0.0004 5009780.9482329245656729 12452263416.828327178955 +5 0.0005 3988697.6058115381747484 7969403431.599391937256 +6 0.0006 3313513.9513340918347239 5534269657.949536323547 +7 0.0007 2833502.4266478852368891 4065960835.774597644806 +8 0.0008 2474555.7862776964902878 3112971971.629174709320 +9 0.0009 2195926.8889475101605058 2459605974.974547863007 +10 0.0010 1973333.7327434658072889 1992257149.106339931488 +11 0.0011 1791397.2804171298630536 1646471897.420378446579 +12 0.0012 1639899.9915898663457483 1383473879.124892950058 +13 0.0013 1511786.3175989524461329 1178799600.693382978439 +14 0.0014 1402026.4952315052505583 1016396846.655561327934 +15 0.0015 1306937.7223516637459397 885378610.941268205643 +16 0.0016 1223761.3016378467436880 778149803.335073471069 +17 0.0017 1150389.7510724726598710 689281207.972409963608 +18 0.0018 1085185.2668474747333676 614808476.527548670769 +19 0.0019 1026855.7319258453790098 551782221.905036926270 +20 0.0020 974368.0487277822103351 497971442.056226730347 +21 0.0021 926886.3098315270617604 451663335.868877112865 +22 0.0022 883726.8779995965305716 411525300.769733726978 +23 0.0023 844325.2140232791425660 376507978.756615102291 +24 0.0024 808211.0167119457619265 345775967.470053136349 +25 0.0025 774989.3418865720741451 318657529.037420809269 +26 0.0026 744326.0869959178380668 294607568.775664985180 +27 0.0027 715936.7071602429496124 273180027.937833368778 +28 0.0028 689577.3532223893562332 254007050.819239288568 +29 0.0029 665037.8461339290952310 236783090.949965804815 +30 0.0030 642136.0584822519449517 221252662.083577007055 +31 0.0031 620713.3849218469113111 207200809.124524354935 +32 0.0032 600631.0629648580215871 194445630.015254348516 +33 0.0033 581767.1635053578065708 182832359.174749493599 +34 0.0034 564014.1130141892936081 172228650.648620545864 +35 0.0035 547276.6409419992705807 162520790.795180559158 +36 0.0036 531470.0695571007672697 153610636.902788937092 +37 0.0037 516518.8813636678969488 145413126.965869009495 +38 0.0038 502355.5129151503788307 137854242.004481703043 +39 0.0039 488919.3343488158425316 130869329.322209432721 +40 0.0040 476155.7821105973562226 124401715.442160859704 +41 0.0041 464015.6186931638512760 118401552.906509667635 +42 0.0042 452454.2982009176630527 112824856.938414454460 +43 0.0043 441431.4205007779528387 107632697.064379543066 +44 0.0044 430910.2598550287657417 102790515.850603893399 +45 0.0045 420857.3564418723690324 98267552.412524193525 +46 0.0046 411242.1611873022629879 94036352.678877964616 +47 0.0047 402036.7259631411870942 90072351.804343208671 +48 0.0048 393215.4325312200817280 86353516.834078595042 +49 0.0049 384754.7546952290576883 82860039.885741680861 +50 0.0050 376633.0490085032652132 79574073.848774015903 +51 0.0051 368830.3701161467470229 76479503.998356267810 +52 0.0052 361328.3074135820497759 73561750.052937105298 +53 0.0053 354109.8402047193958424 70807594.124316170812 +54 0.0054 347159.2089604748180136 68205030.760575905442 +55 0.0055 340461.8006275387597270 65743135.898145407438 +56 0.0056 334004.0462303177919239 63411952.046273477376 +57 0.0057 327773.3292557020904496 61202387.446040719748 +58 0.0058 321757.9035187344416045 59106127.293312758207 +59 0.0059 315946.8193838708102703 57115555.403960004449 +60 0.0060 310329.8573666301672347 55223684.940852820873 +61 0.0061 304897.4682683818391524 53424097.024114072323 +62 0.0062 299640.7191063871723600 51710886.215779535472 +63 0.0063 294551.2441949496278539 50078612.012970924377 +64 0.0064 289621.2008140769321471 48522255.604483112693 +65 0.0065 284843.2289714504731819 47037181.248045973480 +66 0.0066 280210.4148234236636199 45619101.712490074337 +67 0.0067 275716.2573726424598135 44264047.303134165704 +68 0.0068 271354.6381048863404430 42968338.051987938583 +69 0.0069 267119.7932668602443300 41728558.708533637226 +70 0.0070 263006.2885207664803602 40541536.213342189789 +71 0.0071 259008.9957412610237952 39404319.376766681671 +72 0.0072 255123.0717464510817081 38314160.519431941211 +73 0.0073 251343.9387774284114130 37268498.861021690071 +74 0.0074 247667.2665608946117572 36264945.469654418528 +75 0.0075 244088.9558070864004549 35301269.606509663165 +76 0.0076 240605.1230107700685039 34375386.319817088544 +77 0.0077 237212.0864368163456675 33485345.159257300198 +78 0.0078 233906.3531840230280068 32629319.896608810872 +79 0.0079 230684.6072316228819545 31805599.151394251734 +80 0.0080 227543.6983824731141794 31012577.831601154059 +81 0.0081 224480.6320254191814456 30248749.309477727860 +82 0.0082 221492.5596468886651564 29512698.261132575572 +83 0.0083 218576.7700285146420356 28803094.106348071247 +84 0.0084 215730.6810736078477930 28118684.991787753999 +85 0.0085 212951.8322106804698706 27458292.266759824008 +86 0.0086 210237.8773270430974662 26820805.405987534672 +87 0.0087 207586.5781898176937830 26205177.338520292193 +88 0.0088 204995.7983155878027901 25610420.146077439189 +89 0.0089 202463.4972533936670516 25035601.097805149853 +90 0.0090 199987.7252489178790711 24479838.991710845381 +91 0.0091 197566.6182605341018643 23942300.775964848697 +92 0.0092 195198.3933004425198305 23422198.425867021084 +93 0.0093 192881.3440764189581387 22918786.054604131728 +94 0.0094 190613.8369117882684804 22431357.238009363413 +95 0.0095 188394.3069231179542840 21959242.535397209227 +96 0.0096 186221.2544368370436132 21501807.190220955759 +97 0.0097 184093.2416275359864812 21058448.995799891651 +98 0.0098 182008.8893621105526108 20628596.312708813697 +99 0.0099 179966.8742351931869052 20211706.225638397038 +100 0.0100 177965.9257824800151866 19807262.828625004739 +101 0.0101 176004.8238596221490297 19414775.628532290459 +102 0.0102 174082.3961753177572973 19033778.057555798441 +103 0.0103 172197.5159681237128098 18663826.086325231940 +104 0.0104 170349.0998173122934531 18304496.929903090000 +105 0.0105 168536.1055788353842217 17955387.839635033160 +106 0.0106 166757.5304381333407946 17616114.974405597895 +107 0.0107 165012.4090721436368767 17286312.345388192683 +108 0.0108 163299.8119134306325577 16965630.828871779144 +109 0.0109 161618.8435098774498329 16653737.242192005739 +110 0.0110 159968.6409738580696285 16350313.478195458651 +111 0.0111 158348.3725152462429833 16055055.694041298702 +112 0.0112 156757.2360530204896349 15767673.550473842770 +113 0.0113 155194.4579005963169038 15487889.498009558767 +114 0.0114 153659.2915203577722423 15215438.106761369854 +115 0.0115 152151.0163431758119259 14950065.436877654865 +116 0.0116 150668.9366489915992133 14691528.446806840599 +117 0.0117 149212.3805048106296454 14439594.436812501401 +118 0.0118 147780.6987567020405550 14194040.525359258056 +119 0.0119 146373.2640726255776826 13954653.156169982627 +120 0.0120 144989.4700331212661695 13721227.633915985003 +121 0.0121 143628.7302670925855637 13493567.686657618731 +122 0.0122 142290.4776300953817554 13271485.053286185488 +123 0.0123 140974.1634227136091795 13054799.094349212945 +124 0.0124 139679.2566467583528720 12843336.424755681306 +125 0.0125 138405.2432971721864305 12636930.566967403516 +126 0.0126 137151.6256876547995489 12435421.623380124569 +127 0.0127 135917.9218081512372009 12238655.966691028327 +128 0.0128 134703.6647124600713141 12046485.947132334113 +129 0.0129 133508.4019343269465026 11858769.615529989824 +130 0.0130 132331.6949304896115791 11675370.461216779426 +131 0.0131 131173.1185492340009660 11496157.163895610720 +132 0.0132 130032.2605231086199638 11321003.358612034470 +133 0.0133 128908.7209845255274558 11149787.413049913943 +134 0.0134 127802.1120030521997251 10982392.216416653246 +135 0.0135 126712.0571432696160628 10818704.979234978557 +136 0.0136 125638.1910421378415776 10658617.043400641531 +137 0.0137 124580.1590048722864594 10502023.701910419390 +138 0.0138 123537.6166183917521266 10348824.027700318024 +139 0.0139 122510.2293814531003591 10198920.711072660983 +140 0.0140 121497.6723506383423228 10052219.905222501606 +141 0.0141 120499.6298014069470810 9908631.079405346885 +142 0.0142 119515.7949034707853571 9768066.879317935556 +143 0.0143 118545.8694097904372029 9630442.994288949296 +144 0.0144 117589.5633585308096372 9495678.030903607607 +145 0.0145 116646.5947873502445873 9363693.392707681283 +146 0.0146 115716.6894594318873715 9234413.165659498423 +147 0.0147 114799.5806006980274105 9107764.009017735720 +148 0.0148 113895.0086476785072591 8983675.051372559741 +149 0.0149 113002.7210055326431757 8862077.791544625536 +150 0.0150 112122.4718157507450087 8742906.004093339667 +151 0.0151 111254.0217330865416443 8626095.649190869182 +152 0.0152 110397.1377112953487085 8511584.786633092910 +153 0.0153 109551.5927972751087509 8399313.493771657348 +154 0.0154 108717.1659332283161348 8289223.787164182402 +155 0.0155 107893.6417664825276006 8181259.547751543112 +156 0.0156 107080.8104666258732323 8075366.449381573126 +157 0.0157 106278.4675496313138865 7971491.890509480610 +158 0.0158 105486.4137086601112969 7869584.928914608434 +159 0.0159 104704.4546512502711266 7769596.219282128848 +160 0.0160 103932.4009426108095795 7671477.953507028520 +161 0.0161 103170.0678547561838059 7575183.803585435264 +162 0.0162 102417.2752212286141003 7480668.866965977475 +163 0.0163 101673.8472971682786010 7387889.614240696654 +164 0.0164 100939.6126245031482540 7296803.839061981067 +165 0.0165 100214.4039020411728416 7207370.610177553259 +166 0.0166 99498.0578602581808809 7119550.225482173264 +167 0.0167 98790.4151405846059788 7033304.167989372276 +168 0.0168 98091.3201790035236627 6948595.063632249832 +169 0.0169 97400.6210937815631041 6865386.640806972980 +170 0.0170 96718.1695771623490145 6783643.691577250138 +171 0.0171 96043.8207908603799297 6703332.034462166019 +172 0.0172 95377.4332652005687123 6624418.478734144010 +173 0.0173 94718.8688017560052685 6546870.790157235228 +174 0.0174 94067.9923793431516970 6470657.658099768683 +175 0.0175 93424.6720632402284537 6395748.663958749734 +176 0.0176 92788.7789175004581921 6322114.250836570747 +177 0.0177 92160.1869202379602939 6249725.694413391873 +178 0.0178 91538.7728817691968288 6178555.074961925857 +179 0.0179 90924.4163654984295135 6108575.250453427434 +180 0.0180 90316.9996114404202672 6039759.830706712790 +181 0.0181 89716.4074622783809900 5972083.152534125373 +182 0.0182 89122.5272918596310774 5905520.255840793252 +183 0.0183 88535.2489360358158592 5840046.860635651276 +184 0.0184 87954.4646257583081024 5775639.344914568588 +185 0.0185 87380.0689223436784232 5712274.723378166556 +186 0.0186 86811.9586548273509834 5649930.626948376186 +187 0.0187 86250.0328593274462037 5588585.283049616963 +188 0.0188 85694.1927203438535798 5528217.496622358449 +189 0.0189 85144.3415139208373148 5468806.631837919354 +190 0.0190 84600.3845526046789018 5410332.594485185109 +191 0.0191 84062.2291321303637233 5352775.815001153387 +192 0.0192 83529.7844797743746312 5296117.232118505053 +193 0.0193 83002.9617043132166145 5240338.277104726993 +194 0.0194 82481.6737475295522017 5185420.858568533324 +195 0.0195 81965.8353372106212191 5131347.347810166888 +196 0.0196 81455.3629415854375111 5078100.564693652093 +197 0.0197 80950.1747251497727120 5025663.764019752853 +198 0.0198 80450.1905058298143558 4974020.622379438020 +199 0.0199 79955.3317134374083253 4923155.225468670018 +200 0.0200 79465.5213493716728408 4873052.055846039206 +201 0.0201 78980.6839475235901773 4823695.981115681119 +202 0.0202 78500.7455363418703200 4775072.242518653162 +203 0.0203 78025.6336020200978965 4727166.443916803226 +204 0.0204 77555.2770527665707050 4679964.541153670289 +205 0.0205 77089.6061841199989431 4633452.831777757034 +206 0.0206 76628.5526452753983904 4587617.945114245638 +207 0.0207 76172.0494063861115137 4542446.832671517506 +208 0.0208 75720.0307268090400612 4497926.758869871497 +209 0.0209 75272.4321242615551455 4454045.292079949751 +210 0.0210 74829.1903448595985537 4410790.295959160663 +211 0.0211 74390.2433340079005575 4368149.921074891463 +212 0.0212 73955.5302081139816437 4326112.596803579479 +213 0.0213 73524.9912270990316756 4284667.023495471105 +214 0.0214 73098.5677676795021398 4243802.164895007387 +215 0.0215 72676.2022973943821853 4203507.240807446651 +216 0.0216 72257.8383493538858602 4163771.720002557151 +217 0.0217 71843.4204976864275523 4124585.313346728217 +218 0.0218 71432.8943336613301653 4085937.967155077960 +219 0.0219 71026.2064424658019561 4047819.856755586807 +220 0.0220 70623.3043806151399622 4010221.380257511046 +221 0.0221 70224.1366539764276240 3973133.152516770642 +222 0.0222 69828.6526963860378601 3936545.999291122425 +223 0.0223 69436.8028488425625255 3900450.951578463893 +224 0.0224 69048.5383392570511205 3864839.240131650586 +225 0.0225 68663.8112627433001762 3829702.290143489838 +226 0.0226 68282.5745624313130975 3795031.716096154880 +227 0.0227 67904.7820107880543219 3760819.316768941469 +228 0.0228 67530.3881914296507603 3727057.070399051066 +229 0.0229 67159.3484814101975644 3693737.129989877343 +230 0.0230 66791.6190339726163074 3660851.818761860486 +231 0.0231 66427.1567617474793224 3628393.625740860589 +232 0.0232 66065.9193203864706447 3596355.201479325537 +233 0.0233 65707.8650926172122126 3564729.353905783035 +234 0.0234 65352.9531727070134366 3533509.044298208784 +235 0.0235 65001.1433513232477708 3502687.383377046790 +236 0.0236 64652.3961007787002018 3472257.627513889689 +237 0.0237 64306.6725606504114694 3442213.175051939208 +238 0.0238 63963.9345237610905315 3412547.562734413892 +239 0.0239 63624.1444225125014782 3383254.462237342261 +240 0.0240 63287.2653155604712083 3354327.676803309005 +241 0.0241 62953.2608748216662207 3325761.137972739059 +242 0.0242 62622.0953728025488090 3297548.902409553062 +243 0.0243 62293.7336702411703300 3269685.148818052839 +244 0.0244 61968.1412040528593934 3242164.174948144704 +245 0.0245 61645.2839755711611360 3214980.394685824867 +246 0.0246 61325.1285390755510889 3188128.335226407740 +247 0.0247 61007.6419905978473253 3161602.634327672888 +248 0.0248 60692.7919569994483027 3135398.037640320603 +249 0.0249 60380.5465853117639199 3109509.396113428287 +250 0.0250 60070.8745323324765195 3083931.663472308312 +251 0.0251 59763.7449544705305016 3058659.893766653724 +252 0.0252 59459.1274978328729048 3033689.238986563403 +253 0.0253 59156.9922885463165585 3009014.946744495071 +254 0.0254 58857.3099233080502017 2984632.358020891901 +255 0.0255 58560.0514601584218326 2960536.904971605632 +256 0.0256 58265.1884094700799324 2936724.108795195352 +257 0.0257 57972.6927251474189688 2913189.577658087015 +258 0.0258 57682.5367960307121393 2889929.004676083568 +259 0.0259 57394.6934374994016252 2866938.165950146504 +260 0.0260 57109.1358832691403222 2844212.918655102141 +261 0.0261 56825.8377773774118396 2821749.199179425836 +262 0.0262 56544.7731663527083583 2799543.021314680111 +263 0.0263 56265.9164915623259731 2777590.474492982496 +264 0.0264 55989.2425817341136280 2755887.722071218770 +265 0.0265 55714.7266456475335872 2734430.999660402071 +266 0.0266 55442.3442649895659997 2713216.613498961087 +267 0.0267 55172.0713873711865745 2692240.938868572935 +268 0.0268 54903.8843195001900312 2671500.418551350944 +269 0.0269 54637.7597205062702415 2650991.561327003408 +270 0.0270 54373.6745954144716961 2630710.940508958418 +271 0.0271 54111.6062887631123886 2610655.192518258933 +272 0.0272 53851.5324783625037526 2590821.015493964776 +273 0.0273 53593.4311691908442299 2571205.167939272244 +274 0.0274 53337.2806874237794545 2551804.467402064707 +275 0.0275 53083.0596745942239068 2532615.789188981988 +276 0.0276 52830.7470818791698548 2513636.065112130716 +277 0.0277 52580.3221645102021284 2494862.282267282717 +278 0.0278 52331.7644763046919252 2476291.481842917856 +279 0.0279 52085.0538643145991955 2457920.757958980743 +280 0.0280 51840.1704635899150162 2439747.256534695625 +281 0.0281 51597.0946920539572602 2421768.174184448086 +282 0.0282 51355.8072454876746633 2403980.757141174749 +283 0.0283 51116.2890926203108393 2386382.300206145737 +284 0.0284 50878.5214703237652429 2368970.145724718459 +285 0.0285 50642.4858789081699797 2351741.682587187272 +286 0.0286 50408.1640775161140482 2334694.345254000742 +287 0.0287 50175.5380796131794341 2317825.612804746255 +288 0.0288 49944.5901485724316444 2301133.008010194171 +289 0.0289 49715.3027933505800320 2284614.096426784992 +290 0.0290 49487.6587642535960185 2268266.485512940679 +291 0.0291 49261.6410487896209816 2252087.823766603600 +292 0.0292 49037.2328676071192604 2236075.799883380067 +293 0.0293 48814.4176705162099097 2220228.141934811603 +294 0.0294 48593.1791325911617605 2204542.616566108074 +295 0.0295 48373.5011503522036946 2189017.028212983627 +296 0.0296 48155.3678380247074529 2173649.218336909078 +297 0.0297 47938.7635238739458146 2158437.064678370953 +298 0.0298 47723.6727466136435396 2143378.480527611449 +299 0.0299 47510.0802518866330502 2128471.414012539666 +300 0.0300 47297.9709888158540707 2113713.847403059248 +301 0.0301 47087.3301066241183435 2099103.796431661118 +302 0.0302 46878.1429513210532605 2084639.309629680589 +303 0.0303 46670.3950624556237017 2070318.467678939691 +304 0.0304 46464.0721699327696115 2056139.382778186584 +305 0.0305 46259.1601908926531905 2042100.198024144163 +306 0.0306 46055.6452266511114431 2028199.086806621868 +307 0.0307 45853.5135596999025438 2014434.252217484638 +308 0.0308 45652.7516507653854205 2000803.926472923253 +309 0.0309 45453.3461359242937760 1987306.370348884026 +310 0.0310 45255.2838237753894646 1973939.872629199177 +311 0.0311 45058.5516926656273426 1960702.749566066545 +312 0.0312 44863.1368879696892691 1947593.344352709129 +313 0.0313 44669.0267194216648932 1934610.026607716689 +314 0.0314 44476.2086584977296297 1921751.191870953422 +315 0.0315 44284.6703358486556681 1909015.261110539781 +316 0.0316 44094.3995387810864486 1896400.680240851827 +317 0.0317 43905.3842087864904897 1883905.919651091099 +318 0.0318 43717.6124391167249996 1871529.473744204501 +319 0.0319 43531.0724724052197416 1859269.860485924641 +320 0.0320 43345.7526983327406924 1847125.620963659603 +321 0.0321 43161.6416513368094456 1835095.318955012830 +322 0.0322 42978.7280083637815551 1823177.540505573852 +323 0.0323 42797.0005866627034266 1811370.893515997333 +324 0.0324 42616.4483416200091597 1799674.007337833289 +325 0.0325 42437.0603646342060529 1788085.532378156669 +326 0.0326 42258.8258810296683805 1776604.139712609351 +327 0.0327 42081.7342480086954311 1765228.520706777228 +328 0.0328 41905.7749526410771068 1753957.386645572493 +329 0.0329 41730.9376098902721424 1742789.468370502349 +330 0.0330 41557.2119606755150016 1731723.515924669104 +331 0.0331 41384.5878699690219946 1720758.298205191037 +332 0.0332 41213.0553249276126735 1709892.602623021696 +333 0.0333 41042.6044330579679809 1699125.234769819537 +334 0.0334 40873.2254204148848657 1688455.018091898877 +335 0.0335 40704.9086298317488399 1677880.793570828624 +336 0.0336 40537.6445191826642258 1667401.419410884148 +337 0.0337 40371.4236596754853963 1657015.770732765319 +338 0.0338 40206.2367341751596541 1646722.739273797721 +339 0.0339 40042.0745355567560182 1636521.233094271272 +340 0.0340 39878.9279650875541847 1626410.176289772615 +341 0.0341 39716.7880308375897584 1616388.508709492395 +342 0.0342 39555.6458461181027815 1606455.185680247610 +343 0.0343 39395.4926279472856550 1596609.177736069309 +344 0.0344 39236.3196955428065849 1586849.470353444805 +345 0.0345 39078.1184688405483030 1577175.063691735966 +346 0.0346 38920.8804670390163665 1567584.972338960273 +347 0.0347 38764.5973071689295466 1558078.225062710466 +348 0.0348 38609.2607026874975418 1548653.864565934287 +349 0.0349 38454.8624620968112140 1539310.947247793898 +350 0.0350 38301.3944875859669992 1530048.542969138594 +351 0.0351 38148.8487736963725183 1520865.734822760569 +352 0.0352 37997.2174060098259361 1511761.618908138946 +353 0.0353 37846.4925598588815774 1502735.304110727506 +354 0.0354 37696.6664990590725210 1493785.911885474110 +355 0.0355 37547.7315746625608881 1484912.576044723159 +356 0.0356 37399.6802237328156480 1476114.442550244043 +357 0.0357 37252.5049681398377288 1467390.669309289893 +358 0.0358 37106.1984133756341180 1458740.425974710844 +359 0.0359 36960.7532473894534633 1450162.893748871051 +360 0.0360 36816.1622394424339291 1441657.265191489598 +361 0.0361 36672.4182389813067857 1433222.744031080976 +362 0.0362 36529.5141745307482779 1424858.544980105013 +363 0.0363 36387.4430526040596305 1416563.893553666538 +364 0.0364 36246.1979566317895660 1408338.025891725207 +365 0.0365 36105.7720459079719149 1400180.188584615244 +366 0.0366 35966.1585545536436257 1392089.638502017595 +367 0.0367 35827.3507904972866527 1384065.642625086010 +368 0.0368 35689.3421344719390618 1376107.477881861152 +369 0.0369 35552.1260390285606263 1368214.430985697545 +370 0.0370 35415.6960275654346333 1360385.798276845599 +371 0.0371 35280.0456933732493781 1352620.885566920275 +372 0.0372 35145.1686986955828615 1344919.007986381184 +373 0.0373 35011.0587738045214792 1337279.489834823878 +374 0.0374 34877.7097160910780076 1329701.664434047882 +375 0.0375 34745.1153891701760585 1322184.873983938713 +376 0.0376 34613.2697219999317895 1314728.469420936424 +377 0.0377 34482.1667080149272806 1307331.810279215686 +378 0.0378 34351.8004042732500238 1299994.264554376481 +379 0.0379 34222.1649306170511409 1292715.208569654031 +380 0.0380 34093.2544688463385683 1285494.026844628388 +381 0.0381 33965.0632619057942065 1278330.111966294236 +382 0.0382 33837.5856130843530991 1271222.864462511614 +383 0.0383 33710.8158852273409138 1264171.692677784944 +384 0.0384 33584.7484999608859653 1257176.012651284458 +385 0.0385 33459.3779369284675340 1250235.247997065075 +386 0.0386 33334.6987330392876174 1243348.829786475748 +387 0.0387 33210.7054817283278680 1236516.196432731580 +388 0.0388 33087.3928322278152336 1229736.793577451957 +389 0.0389 32964.7554888499726076 1223010.073979381472 +390 0.0390 32842.7882102807561751 1216335.497404999333 +391 0.0391 32721.4858088844484882 1209712.530521129956 +392 0.0392 32600.8431500189217331 1203140.646789432270 +393 0.0393 32480.8551513613092538 1196619.326362841064 +394 0.0394 32361.5167822439798329 1190148.055983764818 +395 0.0395 32242.8230630005855346 1183726.328884127783 +396 0.0396 32124.7690643220230413 1177353.644687158521 +397 0.0397 32007.3499066221193061 1171029.509310931200 +398 0.0398 31890.5607594128960045 1164753.434873563936 +399 0.0399 31774.3968406892090570 1158524.939600150799 +400 0.0400 31658.8534163226431701 1152343.547731189756 +401 0.0401 31543.9257994644467544 1146208.789432754274 +402 0.0402 31429.6093499574017187 1140120.200708152493 +403 0.0403 31315.8994737564389652 1134077.323311087443 +404 0.0404 31202.7916223578649806 1128079.704660407268 +405 0.0405 31090.2812922370321758 1122126.897756264312 +406 0.0406 30978.3640242943329213 1116218.461097696563 +407 0.0407 30867.0354033093608450 1110353.958601726685 +408 0.0408 30756.2910574030865973 1104532.959523731610 +409 0.0409 30646.1266575079389440 1098755.038379254052 +410 0.0410 30536.5379168456202024 1093019.774867100641 +411 0.0411 30427.5205904125796224 1087326.753793743672 +412 0.0412 30319.0704744729373488 1081675.564999099821 +413 0.0413 30211.1834060588116699 1076065.803283400368 +414 0.0414 30103.8552624778676545 1070497.068335452816 +415 0.0415 29997.0819608279925887 1064968.964662037324 +416 0.0416 29890.8594575189672469 1059481.101518460782 +417 0.0417 29785.1837478010238556 1054033.092840373982 +418 0.0418 29680.0508653001743369 1048624.557176602772 +419 0.0419 29575.4568815601815004 1043255.117623237660 +420 0.0420 29471.3979055910858733 1037924.401758664753 +421 0.0421 29367.8700834241608391 1032632.041579853743 +422 0.0422 29264.8695976731905830 1027377.673439529957 +423 0.0423 29162.3926671019908099 1022160.937984493678 +424 0.0424 29060.4355461980194377 1016981.480094949249 +425 0.0425 28958.9945247520336125 1011838.948824766441 +426 0.0426 28858.0659274436584383 1006732.997342770104 +427 0.0427 28757.6461134327691980 1001663.282875029370 +428 0.0428 28657.7314759566179418 996629.466647997964 +429 0.0429 28558.3184419325880299 991631.213832634850 +430 0.0430 28459.4034715664856776 986668.193489444093 +431 0.0431 28360.9830579662921082 981740.078514403896 +432 0.0432 28263.0537267612853611 976846.545585717889 +433 0.0433 28165.6120357264262566 971987.275111473980 +434 0.0434 28068.6545744119430310 967161.951178175281 +435 0.0435 27972.1779637780346093 962370.261500009452 +436 0.0436 27876.1788558345833735 957611.897369018989 +437 0.0437 27780.6539332858301350 952886.553606024245 +438 0.0438 27685.5999091799130838 948193.928512311657 +439 0.0439 27591.0135265631906805 943533.723822160042 +440 0.0440 27496.8915581392793683 938905.644656051998 +441 0.0441 27403.2308059327442606 934309.399474662379 +442 0.0442 27310.0281009573336632 929744.700033567264 +443 0.0443 27217.2803028887210530 925211.261338664917 +444 0.0444 27124.9842997416744765 920708.801602299674 +445 0.0445 27033.1370075515551434 916237.042200081632 +446 0.0446 26941.7353700601306628 911795.707628374686 +447 0.0447 26850.7763584055901447 907384.525462453137 +448 0.0448 26760.2569708167029603 903003.226315311156 +449 0.0449 26670.1742323110811412 898651.543797116727 +450 0.0450 26580.5251943974617461 894329.214475290384 +451 0.0451 26491.3069347819364339 890035.977835204685 +452 0.0452 26402.5165570781027782 885771.576241493807 +453 0.0453 26314.1511905210318218 881535.754899958265 +454 0.0454 26226.2079896850300429 877328.261820055544 +455 0.0455 26138.6841342051302490 873148.847777971299 +456 0.0456 26051.5768285022204509 868997.266280252137 +457 0.0457 25964.8833015118070762 864873.273527997080 +458 0.0458 25878.6008064163288509 860776.628381594317 +459 0.0459 25792.7266203809485887 856707.092325998936 +460 0.0460 25707.2580442928228877 852664.429436530918 +461 0.0461 25622.1924025037369574 848648.406345203868 +462 0.0462 25537.5270425761009392 844658.792207548162 +463 0.0463 25453.2593350322276819 840695.358669949695 +464 0.0464 25369.3866731068555964 836757.879837470944 +465 0.0465 25285.9064725028729299 832846.132242159569 +466 0.0466 25202.8161711501743412 828959.894811835024 +467 0.0467 25120.1132289676170330 825098.948839333141 +468 0.0468 25037.7951276280400634 821263.077952224878 +469 0.0469 24955.8593703262813506 817452.068082977086 +470 0.0470 24874.3034815501559933 813665.707439549849 +471 0.0471 24793.1250068543558882 809903.786476453766 +472 0.0472 24712.3215126372233499 806166.097866207361 +473 0.0473 24631.8905859203514410 802452.436471241061 +474 0.0474 24551.8298341309782700 798762.599316198844 +475 0.0475 24472.1368848871352384 795096.385560656316 +476 0.0476 24392.8093857854910311 791453.596472238773 +477 0.0477 24313.8450041918731586 787834.035400127992 +478 0.0478 24235.2414270344197575 784237.507748960634 +479 0.0479 24156.9963605993143574 780663.820953115355 +480 0.0480 24079.1075303290926968 777112.784451352200 +481 0.0481 24001.5726806234342803 773584.209661848377 +482 0.0482 23924.3895746424641402 770077.909957577940 +483 0.0483 23847.5559941124811303 766593.700642047217 +484 0.0484 23771.0697391341091134 763131.398925399873 +485 0.0485 23694.9286279927982832 759690.823900838965 +486 0.0486 23619.1304969716875348 756271.796521409531 +487 0.0487 23543.6732001667623990 752874.139577108435 +488 0.0488 23468.5546093042903522 749497.677672316320 +489 0.0489 23393.7726135604971205 746142.237203563447 +490 0.0490 23319.3251193834403239 742807.646337598097 +491 0.0491 23245.2100503170695447 739493.734989784891 +492 0.0492 23171.4253468274400802 736200.334802794969 +493 0.0493 23097.9689661310185329 732927.279125606758 +494 0.0494 23024.8388820250984281 729674.402992800577 +495 0.0495 22952.0330847202494624 726441.543104148353 +496 0.0496 22879.5495806748185714 723228.537804489373 +497 0.0497 22807.3863924313991447 720035.227063887054 +498 0.0498 22735.5415584553011286 716861.452458070824 +499 0.0499 22664.0131329749419820 713707.057149145519 +500 0.0500 22592.7991858241548471 710571.885866570519 +501 0.0501 22521.8978022864066588 707455.784888415248 +502 0.0502 22451.3070829408425197 704358.602022858337 +503 0.0503 22381.0251435101999959 701280.186589956167 +504 0.0504 22311.0501147105205746 698220.389403666952 +505 0.0505 22241.3801421026328171 695179.062754108803 +506 0.0506 22172.0133859454217600 692156.060390078579 +507 0.0507 22102.9480210508263553 689151.237501805183 +508 0.0508 22034.1822366405394860 686164.450703937095 +509 0.0509 21965.7142362044032780 683195.558018772514 +510 0.0510 21897.5422373604778841 680244.418859708589 +511 0.0511 21829.6644717167473573 677310.894014926860 +512 0.0512 21762.0791847344371490 674394.845631298609 +513 0.0513 21694.7846355929468700 671496.137198502198 +514 0.0514 21627.7790970563546580 668614.633533367771 +515 0.0515 21561.0608553414640483 665750.200764430803 +516 0.0516 21494.6282099874078995 662902.706316687749 +517 0.0517 21428.4794737267438904 660072.018896569032 +518 0.0518 21362.6129723580597783 657258.008477108669 +519 0.0519 21297.0270446200374863 654460.546283312258 +520 0.0520 21231.7200420669869345 651679.504777727183 +521 0.0521 21166.6903289457914070 648914.757646204205 +522 0.0522 21101.9362820742899203 646166.179783845320 +523 0.0523 21037.4562907210420235 643433.647281146143 +524 0.0524 20973.2487564864677552 640717.037410320365 +525 0.0525 20909.3120931853627553 638016.228611805825 +526 0.0526 20845.6447267307230504 635331.100480952067 +527 0.0527 20782.2450950189304422 632661.533754881937 +528 0.0528 20719.1116478162111889 630007.410299527110 +529 0.0529 20656.2428466463934456 627368.613096838235 +530 0.0530 20593.6371646799416339 624745.026232163887 +531 0.0531 20531.2930866242422780 622136.534881787142 +532 0.0532 20469.2091086151194759 619543.025300641311 +533 0.0533 20407.3837381095800083 616964.384810169926 +534 0.0534 20345.8154937797517050 614400.501786360168 +535 0.0535 20284.5029054080368951 611851.265647925436 +536 0.0536 20223.4445137834081834 609316.566844638088 +537 0.0537 20162.6388705988865695 606796.296845825505 +538 0.0538 20102.0845383501437027 604290.348129005637 +539 0.0539 20041.7800902352610137 601798.614168678876 +540 0.0540 19981.7241100555656885 599320.989425250213 +541 0.0541 19921.9151921175980533 596857.369334115996 +542 0.0542 19862.3519411361485254 594407.650294870371 +543 0.0543 19803.0329721383714059 591971.729660666431 +544 0.0544 19743.9569103689536860 589549.505727704964 +545 0.0545 19685.1223911963243154 587140.877724863472 +546 0.0546 19626.5280600199075707 584745.745803450933 +547 0.0547 19568.1725721783805056 582364.011027104105 +548 0.0548 19510.0545928589344840 579995.575361803407 +549 0.0549 19452.1727970075444318 577640.341666020569 +550 0.0550 19394.5258692401948792 575298.213680989342 +551 0.0551 19337.1125037550918933 572969.096021102509 +552 0.0552 19279.9314042458136100 570652.894164429512 +553 0.0553 19222.9812838154248311 568349.514443350490 +554 0.0554 19166.2608648914902005 566058.864035314065 +555 0.0555 19109.7688791420405323 563780.850953705958 +556 0.0556 19053.5040673924122530 561515.384038841235 +557 0.0557 18997.4651795430181664 559262.372949057724 +558 0.0558 18941.6509744879695063 557021.728151931078 +559 0.0559 18886.0602200345929305 554793.360915594618 +560 0.0560 18830.6916928238060791 552577.183300168370 +561 0.0561 18775.5441782513335056 550373.108149297070 +562 0.0562 18720.6164703897775325 548181.049081790145 +563 0.0563 18665.9073719115185668 546000.920483369497 +564 0.0564 18611.4156940124230459 543832.637498514028 +565 0.0565 18557.1402563363772060 541676.116022413713 +566 0.0566 18503.0798869006066525 539531.272693011328 +567 0.0567 18449.2334220217999246 537398.024883154896 +568 0.0568 18395.5997062429996731 535276.290692836745 +569 0.0569 18342.1775922612796421 533165.988941535237 +570 0.0570 18288.9659408561710734 531067.039160642307 +571 0.0571 18235.9636208188385353 528979.361585994717 +572 0.0572 18183.1695088820160890 526902.877150487155 +573 0.0573 18130.5824896506528603 524837.507476778352 +574 0.0574 18078.2014555333080352 522783.174870089337 +575 0.0575 18026.0253066742479859 520739.802311081847 +576 0.0576 17974.0529508862528019 518707.313448835164 +577 0.0577 17922.2833035841176752 516685.632593894145 +578 0.0578 17870.7152877188527782 514674.684711412119 +579 0.0579 17819.3478337125634425 512674.395414368541 +580 0.0580 17768.1798793939997267 510684.690956880106 +581 0.0581 17717.2103699347753718 508705.498227574455 +582 0.0582 17666.4382577862452308 506736.744743063522 +583 0.0583 17615.8625026170193451 504778.358641478291 +584 0.0584 17565.4820712511391321 502830.268676092383 +585 0.0585 17515.2959376068829442 500892.404209016124 +586 0.0586 17465.3030826361828076 498964.695204968448 +587 0.0587 17415.5024942646778072 497047.072225118638 +588 0.0588 17365.8931673323713767 495139.466421009914 +589 0.0589 17316.4741035348924925 493241.809528544953 +590 0.0590 17267.2443113653644104 491354.033862052893 +591 0.0591 17218.2028060568409273 489476.072308415314 +592 0.0592 17169.3486095253574604 487607.858321272361 +593 0.0593 17120.6807503135278239 485749.325915290276 +594 0.0594 17072.1982635347376345 483900.409660498961 +595 0.0595 17023.9001908178761369 482061.044676696009 +596 0.0596 16975.7855802526464686 480231.166627917555 +597 0.0597 16927.8534863354034314 478410.711716968566 +598 0.0598 16880.1029699155551498 476599.616680025007 +599 0.0599 16832.5330981424885977 474797.818781294394 +600 0.0600 16785.1429444130371849 473005.255807736889 +601 0.0601 16737.9315883194576600 471221.866063852911 +602 0.0602 16690.8981155979381583 469447.588366526295 +603 0.0603 16644.0416180776155670 467682.362039934378 +604 0.0604 16597.3611936300949310 465926.126910504303 +605 0.0605 16550.8559461194709002 464178.823301943892 +606 0.0606 16504.5249853528584936 462440.392030313262 +607 0.0607 16458.3674270313858869 460710.774399170303 +608 0.0608 16412.3823927016892412 458989.912194756907 +609 0.0609 16366.5690097078877443 457277.747681248002 +610 0.0610 16320.9264111440224951 455574.223596055293 +611 0.0611 16275.4537358069610491 453879.283145183872 +612 0.0612 16230.1501281497694436 452192.869998638169 +613 0.0613 16185.0147382355426089 450514.928285885311 +614 0.0614 16140.0467216916804318 448845.402591369580 +615 0.0615 16095.2452396646076522 447184.237950076000 +616 0.0616 16050.6094587749466882 445531.379843141185 +617 0.0617 16006.1385510731124668 443886.774193525605 +618 0.0618 15961.8316939953510882 442250.367361720128 +619 0.0619 15917.6880703201895813 440622.106141507335 +620 0.0620 15873.7068681253258546 439001.937755778723 +621 0.0621 15829.8872807449170068 437389.809852382925 +622 0.0622 15786.2285067272969172 435785.670500035631 +623 0.0623 15742.7297497930812824 434189.468184264319 +624 0.0624 15699.3902187936982955 432601.151803405723 +625 0.0625 15656.2091276702958567 431020.670664646081 +626 0.0626 15613.1856954130580561 429447.974480102421 +627 0.0627 15570.3191460209054640 427883.013362951111 +628 0.0628 15527.6087084615774074 426325.737823600648 +629 0.0629 15485.0536166321016935 424776.098765901639 +630 0.0630 15442.6531093196372240 423234.047483405797 +631 0.0631 15400.4064301626840461 421699.535655658576 +632 0.0632 15358.3128276126735727 420172.515344541811 +633 0.0633 15316.3715548959135049 418652.938990647905 +634 0.0634 15274.5818699758965522 417140.759409699764 +635 0.0635 15232.9430355159602186 415635.929789009911 +636 0.0636 15191.4543188423103857 414138.403683971905 +637 0.0637 15150.1149919073814090 412648.135014603729 +638 0.0638 15108.9243312535454606 411165.078062114888 +639 0.0639 15067.8816179771638417 409689.187465517316 +640 0.0640 15026.9861376929748076 408220.418218276813 +641 0.0641 14986.2371804988106305 406758.725664992118 +642 0.0642 14945.6340409406548133 405304.065498120151 +643 0.0643 14905.1760179780121689 403856.393754729652 +644 0.0644 14864.8624149496117752 402415.666813291900 +645 0.0645 14824.6925395394209772 400981.841390508635 +646 0.0646 14784.6657037429868069 399554.874538172910 +647 0.0647 14744.7812238340757176 398134.723640057782 +648 0.0648 14705.0384203316298226 396721.346408853598 +649 0.0649 14665.4366179670305428 395314.700883121230 +650 0.0650 14625.9751456516605685 393914.745424289955 +651 0.0651 14586.6533364447623171 392521.438713681302 +652 0.0652 14547.4705275216001610 391134.739749570261 +653 0.0653 14508.4260601419082377 389754.607844268496 +654 0.0654 14469.5192796186329360 388381.002621252381 +655 0.0655 14430.7495352869555063 387013.884012309252 +656 0.0656 14392.1161804736038903 385653.212254721962 +657 0.0657 14353.6185724664446752 384298.947888476076 +658 0.0658 14315.2560724843460775 382951.051753508276 +659 0.0659 14277.0280456473228696 381609.484986972413 +660 0.0660 14238.9338609469468793 380274.209020538314 +661 0.0661 14200.9728912170339754 378945.185577722965 +662 0.0662 14163.1445131045857124 377622.376671245438 +663 0.0663 14125.4481070410038228 376305.744600409584 +664 0.0664 14087.8830572135575494 374995.251948518970 +665 0.0665 14050.4487515371165500 373690.861580314697 +666 0.0666 14013.1445816261293658 372392.536639441154 +667 0.0667 13975.9699427668601857 371100.240545935696 +668 0.0668 13938.9242338898748130 369813.936993754120 +669 0.0669 13902.0068575427721953 368533.589948308829 +670 0.0670 13865.2172198631542415 367259.163644042797 +671 0.0671 13828.5547305518502981 365990.622582023731 +672 0.0672 13792.0188028463708179 364727.931527564593 +673 0.0673 13755.6088534945993160 363471.055507873418 +674 0.0674 13719.3243027287189761 362219.959809715394 +675 0.0675 13683.1645742393775436 360974.609977113025 +676 0.0676 13647.1290951500686788 359734.971809061302 +677 0.0677 13611.2172959917515982 358501.011357269890 +678 0.0678 13575.4286106776908127 357272.694923929463 +679 0.0679 13539.7624764785196021 356049.989059495798 +680 0.0680 13504.2183339975199488 354832.860560504661 +681 0.0681 13468.7956271461243887 353621.276467400079 +682 0.0682 13433.4938031196343218 352415.204062394216 +683 0.0683 13398.3123123731475062 351214.610867342097 +684 0.0684 13363.2506085976983741 350019.464641641185 +685 0.0685 13328.3081486966093507 348829.733380150166 +686 0.0686 13293.4843927620458999 347645.385311134509 +687 0.0687 13258.7788040517771151 346466.388894224947 +688 0.0688 13224.1908489661454951 345292.712818403495 +689 0.0689 13189.7199970252258936 344124.326000004075 +690 0.0690 13155.3657208461881964 342961.197580740089 +691 0.0691 13121.1274961208637251 341803.296925746836 +692 0.0692 13087.0048015934935393 340650.593621645647 +693 0.0693 13052.9971190386804665 339503.057474625297 +694 0.0694 13019.1039332395212114 338360.658508546650 +695 0.0695 12985.3247319659403729 337223.366963064473 +696 0.0696 12951.6590059531990846 336091.153291768162 +697 0.0697 12918.1062488805946487 334963.988160338718 +698 0.0698 12884.6659573503420688 333841.842444729700 +699 0.0699 12851.3376308666374825 332724.687229358940 +700 0.0700 12818.1207718149034918 331612.493805327802 +701 0.0701 12785.0148854412054789 330505.233668650500 +702 0.0702 12752.0194798318480025 329402.878518501064 +703 0.0703 12719.1340658931494545 328305.400255482935 +704 0.0704 12686.3581573313804256 327212.770979914465 +705 0.0705 12653.6912706328785134 326124.962990125292 +706 0.0706 12621.1329250443322962 325041.948780781298 +707 0.0707 12588.6826425532326539 323963.701041210501 +708 0.0708 12556.3399478684841597 322890.192653760198 +709 0.0709 12524.1043684011874575 321821.396692163660 +710 0.0710 12491.9754342455835285 320757.286419920740 +711 0.0711 12459.9526781601525727 319697.835288698901 +712 0.0712 12428.0356355488802365 318643.016936751315 +713 0.0713 12396.2238444426748174 317592.805187339021 +714 0.0714 12364.5168454809481773 316547.174047186680 +715 0.0715 12332.9141818933421746 315506.097704936634 +716 0.0716 12301.4153994816133491 314469.550529628759 +717 0.0717 12270.0200466016722203 313437.507069190266 +718 0.0718 12238.7276741457662865 312409.942048940109 +719 0.0719 12207.5378355248139997 311386.830370113719 +720 0.0720 12176.4500866508878971 310368.147108390986 +721 0.0721 12145.4639859198450722 309353.867512451601 +722 0.0722 12114.5790941940958874 308343.967002533725 +723 0.0723 12083.7949747855182068 307338.421169013716 +724 0.0724 12053.1111934385171480 306337.205770994013 +725 0.0725 12022.5273183132212580 305340.296734908479 +726 0.0726 11992.0429199688187509 304347.670153140964 +727 0.0727 11961.6575713470283517 303359.302282656019 +728 0.0728 11931.3708477557138394 302375.169543640804 +729 0.0729 11901.1823268526241009 301395.248518165201 +730 0.0730 11871.0915886292732466 300419.515948850196 +731 0.0731 11841.0982153949535132 299447.948737549828 +732 0.0732 11811.2017917608736752 298480.523944049608 +733 0.0733 11781.4019046244320634 297517.218784769299 +734 0.0734 11751.6981431536187301 296558.010631488753 +735 0.0735 11722.0900987715413066 295602.877010075259 +736 0.0736 11692.5773651410763705 294651.795599230332 +737 0.0737 11663.1595381496517803 293704.744229245291 +738 0.0738 11633.8362158941508824 292761.700880771503 +739 0.0739 11604.6069986659331335 291822.643683594069 +740 0.0740 11575.4714889359820518 290887.550915429601 +741 0.0741 11546.4292913401750411 289956.401000726619 +742 0.0742 11517.4800126646641729 289029.172509476310 +743 0.0743 11488.6232618313879357 288105.844156041974 +744 0.0744 11459.8586498836866667 287186.394797994173 +745 0.0745 11431.1857899720398564 286270.803434956819 +746 0.0746 11402.6042973399180482 285359.049207463046 +747 0.0747 11374.1137893097529741 284451.111395828077 +748 0.0748 11345.7138852690095518 283546.969419026806 +749 0.0749 11317.4042066563797562 282646.602833581273 +750 0.0750 11289.1843769480783521 281749.991332462698 +751 0.0751 11261.0540216442550445 280857.114744001592 +752 0.0752 11233.0127682555139472 279967.953030808887 +753 0.0753 11205.0602462895385543 279082.486288701766 +754 0.0754 11177.1960872378203931 278200.694745651679 +755 0.0755 11149.4199245625022741 277322.558760726301 +756 0.0756 11121.7313936833124899 276448.058823056810 +757 0.0757 11094.1301319646190677 275577.175550801679 +758 0.0758 11066.6157787025731523 274709.889690127398 +759 0.0759 11039.1879751123560709 273846.182114197989 +760 0.0760 11011.8463643155373575 272986.033822171856 +761 0.0761 10984.5905913275182684 272129.425938210567 +762 0.0762 10957.4203030450826191 271276.339710489206 +763 0.0763 10930.3351482340476650 270426.756510227977 +764 0.0764 10903.3347775170004752 269580.657830723329 +765 0.0765 10876.4188433611452638 268738.025286389282 +766 0.0766 10849.5870000662343955 267898.840611813124 +767 0.0767 10822.8389037526030734 267063.085660810408 +768 0.0768 10796.1742123492876999 266230.742405498109 +769 0.0769 10769.5925855822442827 265401.792935370351 +770 0.0770 10743.0936849626559706 264576.219456381921 +771 0.0771 10716.6771737753351772 263754.004290045472 +772 0.0772 10690.3427170672057400 262935.129872531630 +773 0.0773 10664.0899816358905809 262119.578753780690 +774 0.0774 10637.9186360183703073 261307.333596619719 +775 0.0775 10611.8283504797454952 260498.377175887232 +776 0.0776 10585.8187970020717330 259692.692377572588 +777 0.0777 10559.8896492732947081 258890.262197952077 +778 0.0778 10534.0405826762598736 258091.069742742868 +779 0.0779 10508.2712742778094253 257295.098226255010 +780 0.0780 10482.5814028179684101 256502.330970564275 +781 0.0781 10456.9706486992072314 255712.751404675510 +782 0.0782 10431.4386939757878281 254926.343063711218 +783 0.0783 10405.9852223431971652 254143.089588089788 +784 0.0784 10380.6099191276571219 253362.974722727726 +785 0.0785 10355.3124712757089583 252585.982316235197 +786 0.0786 10330.0925673438905505 251812.096320127370 +787 0.0787 10304.9498974884827476 251041.300788040884 +788 0.0788 10279.8841534553339443 250273.579874953110 +789 0.0789 10254.8950285697646905 249508.917836416396 +790 0.0790 10229.9822177265541541 248747.299027789588 +791 0.0791 10205.1454173799902492 247988.707903484115 +792 0.0792 10180.3843255340052565 247233.129016213410 +793 0.0793 10155.6986417323823844 246480.547016245691 +794 0.0794 10131.0880670490369084 245730.946650674479 +795 0.0795 10106.5523040783700708 244984.312762680463 +796 0.0796 10082.0910569256957388 244240.630290810019 +797 0.0797 10057.7040311977416422 243499.884268259804 +798 0.0798 10033.3909339932197327 242762.059822161886 +799 0.0799 10009.1514738934674824 242027.142172878695 +800 0.0800 9984.9853609531583061 241295.116633306316 +801 0.0801 9960.8923066910847410 240565.968608179770 +802 0.0802 9936.8720240810071118 239839.683593385096 +803 0.0803 9912.9242275425731350 239116.247175282217 +804 0.0804 9889.0486329323084647 238395.645030023821 +805 0.0805 9865.2449575346618076 237677.862922892906 +806 0.0806 9841.5129200531355309 236962.886707632832 +807 0.0807 9817.8522406014635635 236250.702325795399 +808 0.0808 9794.2626406948693329 235541.295806086186 +809 0.0809 9770.7438432413800911 234834.653263716609 +810 0.0810 9747.2955725332067232 234130.760899768007 +811 0.0811 9723.9175542381908599 233429.605000549869 +812 0.0812 9700.6095153913138347 232731.171936976520 +813 0.0813 9677.3711843862674868 232035.448163939989 +814 0.0814 9654.2022909670868103 231342.420219690597 +815 0.0815 9631.1025662198408099 230652.074725222541 +816 0.0816 9608.0717425643961178 229964.398383668711 +817 0.0817 9585.1095537462279026 229279.377979695273 +818 0.0818 9562.2157348282980820 228597.000378905301 +819 0.0819 9539.3900221829899237 227917.252527241770 +820 0.0820 9516.6321534841081302 227240.121450404404 +821 0.0821 9493.9418676989243977 226565.594253266376 +822 0.0822 9471.3189050802957354 225893.658119293104 +823 0.0823 9448.7630071588318970 225224.300309971994 +824 0.0824 9426.2739167351210199 224557.508164244296 +825 0.0825 9403.8513778720116534 223893.269097942102 +826 0.0826 9381.4951358869529940 223231.570603227097 +827 0.0827 9359.2049373443896911 222572.400248041027 +828 0.0828 9336.9805300482094026 221915.745675551385 +829 0.0829 9314.8216630342503777 221261.594603612320 +830 0.0830 9292.7280865628581523 220609.934824222990 +831 0.0831 9270.6995521114968142 219960.754202990589 +832 0.0832 9248.7358123674166563 219314.040678599296 +833 0.0833 9226.8366212203727628 218669.782262287103 +834 0.0834 9205.0017337553927064 218027.967037321388 +835 0.0835 9183.2309062456024549 217388.583158483088 +836 0.0836 9161.5238961451013893 216751.618851550622 +837 0.0837 9139.8804620818846161 216117.062412792817 +838 0.0838 9118.3003638508216682 215484.902208465210 +839 0.0839 9096.7833624066824996 214855.126674307598 +840 0.0840 9075.3292198572144116 214227.724315050611 +841 0.0841 9053.9376994562662730 213602.683703916991 +842 0.0842 9032.6085655969636719 212979.993482142308 +843 0.0843 9011.3415838049331796 212359.642358484416 +844 0.0844 8990.1365207315720909 211741.619108746003 +845 0.0845 8968.9931441473690938 211125.912575298978 +846 0.0846 8947.9112229352740542 210512.511666610109 +847 0.0847 8926.8905270841041784 209901.405356775096 +848 0.0848 8905.9308276820120227 209292.582685051893 +849 0.0849 8885.0318969099898823 208686.032755403488 +850 0.0850 8864.1935080354178353 208081.744736038730 +851 0.0851 8843.4154354056681768 207479.707858958485 +852 0.0852 8822.6974544417444122 206879.911419509008 +853 0.0853 8802.0393416319730022 206282.344775935286 +854 0.0854 8781.4408745257296687 205686.997348938196 +855 0.0855 8760.9018317272202694 205093.858621237276 +856 0.0856 8740.4219928893016913 204502.918137134286 +857 0.0857 8720.0011387073409423 203914.165502085903 +858 0.0858 8699.6390509131233557 203327.590382271213 +859 0.0859 8679.3355122688008123 202743.182504170691 +860 0.0860 8659.0903065608854376 202160.931654145621 +861 0.0861 8638.9032185942778597 201580.827678017813 +862 0.0862 8618.7740341863445792 201002.860480659292 +863 0.0863 8598.7025401610335393 200427.020025578298 +864 0.0864 8578.6885243430278933 199853.296334517101 +865 0.0865 8558.7317755519507045 199281.679487039713 +866 0.0866 8538.8320835965914739 198712.159620139806 +867 0.0867 8518.9892392691926943 198144.726927840617 +868 0.0868 8499.2030343397600518 197579.371660796576 +869 0.0869 8479.4732615504253772 197016.084125906491 +870 0.0870 8459.7997146098332450 196454.854685926897 +871 0.0871 8440.1821881875821418 195895.673759081605 +872 0.0872 8420.6204779086929193 195338.531818685471 +873 0.0873 8401.1143803481209034 194783.419392761483 +874 0.0874 8381.6636930252989259 194230.327063670702 +875 0.0875 8362.2682143987294694 193679.245467731991 +876 0.0876 8342.9277438606004580 193130.165294857899 +877 0.0877 8323.6420817314483429 192583.077288189699 +878 0.0878 8304.4110292548521102 192037.972243724798 +879 0.0879 8285.2343885921673063 191494.841009966796 +880 0.0880 8266.1119628172909870 190953.674487558310 +881 0.0881 8247.0435559114666830 190414.463628931087 +882 0.0882 8228.0289727581221086 189877.199437953299 +883 0.0883 8209.0680191377450683 189341.872969577496 +884 0.0884 8190.1605017227911958 188808.475329495210 +885 0.0885 8171.3062280726271638 188276.997673793288 +886 0.0886 8152.5050066285066350 187747.431208612572 +887 0.0887 8133.7566467085853219 187219.767189808306 +888 0.0888 8115.0609585029642403 186693.996922614198 +889 0.0889 8096.4177530687684339 186170.111761310778 +890 0.0890 8077.8268423252584398 185648.103108893381 +891 0.0891 8059.2880390489763158 185127.962416743714 +892 0.0892 8040.8011568689244086 184609.681184303103 +893 0.0893 8022.3660102617714074 184093.250958753604 +894 0.0894 8003.9824145470993244 183578.663334695098 +895 0.0895 7985.6501858826732132 183065.909953825903 +896 0.0896 7967.3691412597509043 182554.982504627900 +897 0.0897 7949.1390984984163879 182045.872722057800 +898 0.0898 7930.9598762429523049 181538.572387229098 +899 0.0899 7912.8312939572351752 181033.073327111400 +900 0.0900 7894.7531719201688247 180529.367414218723 +901 0.0901 7876.7253312211423690 180027.446566310100 +902 0.0902 7858.7475937555227574 179527.302746084490 +903 0.0903 7840.8197822201736926 179028.927960888715 +904 0.0904 7822.9417201090082017 178532.314262413798 +905 0.0905 7805.1132317085675822 178037.453746403917 +906 0.0906 7787.3341420936294526 177544.338552367612 +907 0.0907 7769.6042771228467245 177052.960863281187 +908 0.0908 7751.9234634344174992 176563.312905309693 +909 0.0909 7734.2915284417758812 176075.386947514722 +910 0.0910 7716.7083003293209913 175589.175301574491 +911 0.0911 7699.1736080481668978 175104.670321505400 +912 0.0912 7681.6872813119225611 174621.864403376792 +913 0.0913 7664.2491505925017918 174140.749985042377 +914 0.0914 7646.8590471159568551 173661.319545859093 +915 0.0915 7629.5168028583429987 173183.565606421791 +916 0.0916 7612.2222505416075364 172707.480728284921 +917 0.0917 7594.9752236295080365 172233.057513700798 +918 0.0918 7577.7755563235550653 171760.288605351176 +919 0.0919 7560.6230835589831258 171289.166686083772 +920 0.0920 7543.5176410007461527 170819.684478647920 +921 0.0921 7526.4590650395421108 170351.834745438595 +922 0.0922 7509.4471927878585120 169885.610288235592 +923 0.0923 7492.4818620760497652 169421.003947947203 +924 0.0924 7475.5629114484345337 168958.008604357805 +925 0.0925 7458.6901801594231074 168496.617175872991 +926 0.0926 7441.8635081696656925 168036.822619273706 +927 0.0927 7425.0827361422288959 167578.617929462198 +928 0.0928 7408.3477054387949465 167121.996139218390 +929 0.0929 7391.6582581158863832 166666.950318957213 +930 0.0930 7375.0142369211143887 166213.473576481105 +931 0.0931 7358.4154852894534997 165761.559056742291 +932 0.0932 7341.8618473395363253 165311.199941602012 +933 0.0933 7325.3531678699764598 164862.389449594601 +934 0.0934 7308.8892923557123140 164415.120835688896 +935 0.0935 7292.4700669443745937 163969.387391057884 +936 0.0936 7276.0953384526792433 163525.182442843710 +937 0.0937 7259.7649543628403990 163082.499353929918 +938 0.0938 7243.4787628190088071 162641.331522708089 +939 0.0939 7227.2366126237302524 162201.672382858407 +940 0.0940 7211.0383532344312698 161763.515403115802 +941 0.0941 7194.8838347599230474 161326.854087053012 +942 0.0942 7178.7729079569280657 160891.681972854509 +943 0.0943 7162.7054242266303845 160457.992633097689 +944 0.0944 7146.6812356112486668 160025.779674534395 +945 0.0945 7130.7001947906283021 159595.036737874500 +946 0.0946 7114.7621550788562672 159165.757497568615 +947 0.0947 7098.8669704208978146 158737.935661592899 +948 0.0948 7083.0144953892558988 158311.564971243701 +949 0.0949 7067.2045851806478822 157886.639200917707 +950 0.0950 7051.4370956127067984 157463.152157908713 +951 0.0951 7035.7118831207017138 157041.097682199004 +952 0.0952 7020.0288047542790082 156620.469646250887 +953 0.0953 7004.3877181742263929 156201.261954806396 +954 0.0954 6988.7884816492523896 155783.468544678413 +955 0.0955 6973.2309540527903664 155367.083384553320 +956 0.0956 6957.7149948598234914 154952.100474790815 +957 0.0957 6942.2404641437224200 154538.513847223803 +958 0.0958 6926.8072225731129947 154126.317564959405 +959 0.0959 6911.4151314087557694 153715.505722189409 +960 0.0960 6896.0640525004473602 153306.072443986312 +961 0.0961 6880.7538482839418066 152898.011886121705 +962 0.0962 6865.4843817778928496 152491.318234863604 +963 0.0963 6850.2555165808098536 152085.985706794221 +964 0.0964 6835.0671168680391929 151682.008548619226 +965 0.0965 6819.9190473887592816 151279.381036977196 +966 0.0966 6804.8111734629974308 150878.097478257783 +967 0.0967 6789.7433609786639863 150478.152208416286 +968 0.0968 6774.7154763886037472 150079.539592784597 +969 0.0969 6759.7273867076692113 149682.254025899922 +970 0.0970 6744.7789595098083737 149286.289931312902 +971 0.0971 6729.8700629251716236 148891.641761416977 +972 0.0972 6715.0005656372377416 148498.303997263894 +973 0.0973 6700.1703368799553573 148106.271148389613 +974 0.0974 6685.3792464349035072 147715.537752641278 +975 0.0975 6670.6271646284712915 147326.098375996109 +976 0.0976 6655.9139623290520831 146937.947612396500 +977 0.0977 6641.2395109442541070 146551.080083571404 +978 0.0978 6626.6036824181319389 146165.490438869019 +979 0.0979 6612.0063492284343738 145781.173355086794 +980 0.0980 6597.4473843838650282 145398.123536305007 +981 0.0981 6582.9266614213638604 145016.335713715409 +982 0.0982 6568.4440544034050617 144635.804645460215 +983 0.0983 6553.9994379153085902 144256.525116462901 +984 0.0984 6539.5926870625717129 143878.491938271094 +985 0.0985 6525.2236774682141913 143501.699948886322 +986 0.0986 6510.8922852701389274 143126.144012611010 +987 0.0987 6496.5983871185144380 142751.819019882183 +988 0.0988 6482.3418601731646049 142378.719887114014 +989 0.0989 6468.1225821009820720 142006.841556544416 +990 0.0990 6453.9404310733516468 141636.178996072180 +991 0.0991 6439.7952857635928012 141266.727199105080 +992 0.0992 6425.6870253444176342 140898.481184406584 +993 0.0993 6411.6155294854006570 140531.435995938198 +994 0.0994 6397.5806783504685882 140165.586702711298 +995 0.0995 6383.5823525954010620 139800.928398634016 +996 0.0996 6369.6204333653513459 139437.456202362606 +997 0.0997 6355.6948022923761528 139075.165257149987 +998 0.0998 6341.8053414929836435 138714.050730699993 +999 0.0999 6327.9519335656978001 138354.107815018622 +1000 0.1000 6314.1344615886337124 137995.331726269418 +1001 0.1001 6300.3528091170883272 137637.717704629991 +1002 0.1002 6286.6068601811493863 137281.261014143878 +1003 0.1003 6272.8964992833134602 136925.956942580524 +1004 0.1004 6259.2216113961194424 136571.800801293197 +1005 0.1005 6245.5820819598011440 136218.787925079087 +1006 0.1006 6231.9777968799453447 135866.913672036404 +1007 0.1007 6218.4086425251716719 135516.173423428292 +1008 0.1008 6204.8745057248233934 135166.562583542516 +1009 0.1009 6191.3752737666682151 134818.076579555112 +1010 0.1010 6177.9108343946209061 134470.710861396801 +1011 0.1011 6164.4810758064704714 134124.460901614395 +1012 0.1012 6151.0858866516282433 133779.322195237590 +1013 0.1013 6137.7251560288841574 133435.290259647794 +1014 0.1014 6124.3987734841794008 133092.360634442797 +1015 0.1015 6111.1066290083917920 132750.528881306003 +1016 0.1016 6097.8486130351329848 132409.790583876602 +1017 0.1017 6084.6246164385584052 132070.141347621189 +1018 0.1018 6071.4345305311926495 131731.576799701987 +1019 0.1019 6058.2782470617648869 131394.092588852101 +1020 0.1020 6045.1556582130597235 131057.684385244793 +1021 0.1021 6032.0666565997789803 130722.347880371090 +1022 0.1022 6019.0111352664143851 130388.078786912200 +1023 0.1023 6005.9889876851375448 130054.872838616997 +1024 0.1024 5993.0001077536981029 129722.725790176599 +1025 0.1025 5980.0443897933346307 129391.633417101897 +1026 0.1026 5967.1217285466991598 129061.591515602719 +1027 0.1027 5954.2320191757953580 128732.595902466914 +1028 0.1028 5941.3751572599248902 128404.642414937392 +1029 0.1029 5928.5510387936483312 128077.726910596801 +1030 0.1030 5915.7595601847560829 127751.845267247088 +1031 0.1031 5903.0006182522538438 127426.993382788802 +1032 0.1032 5890.2741102243589921 127103.167175111812 +1033 0.1033 5877.5799337365051542 126780.362581967594 +1034 0.1034 5864.9179868293631444 126458.575560866899 +1035 0.1035 5852.2881679468719085 126137.802088954413 +1036 0.1036 5839.6903759342794729 125818.038162900804 +1037 0.1037 5827.1245100361948062 125499.279798786389 +1038 0.1038 5814.5904698946560529 125181.523031993114 +1039 0.1039 5802.0881555472024047 124864.763917087388 +1040 0.1040 5789.6174674249623422 124548.998527714706 +1041 0.1041 5777.1783063507527913 124234.222956483805 +1042 0.1042 5764.7705735371855553 123920.433314864087 +1043 0.1043 5752.3941705847882986 123607.625733072215 +1044 0.1044 5740.0489994801364446 123295.796359962813 +1045 0.1045 5727.7349625939914404 122984.941362928308 +1046 0.1046 5715.4519626794553915 122675.056927784404 +1047 0.1047 5703.1999028701329735 122366.139258672702 +1048 0.1048 5690.9786866783024379 122058.184577945503 +1049 0.1049 5678.7882179931011706 121751.189126070822 +1050 0.1050 5666.6284010787212537 121445.149161525012 +1051 0.1051 5654.4991405726104858 121140.060960688803 +1052 0.1052 5642.4003414836888624 120835.920817746912 +1053 0.1053 5630.3319091905723326 120532.725044584891 +1054 0.1054 5618.2937494398083800 120230.469970690610 +1055 0.1055 5606.2857683441216068 119929.151943049612 +1056 0.1056 5594.3078723806665948 119628.767326051806 +1057 0.1057 5582.3599683892944086 119329.312501389009 +1058 0.1058 5570.4419635708272835 119030.783867952909 +1059 0.1059 5558.5537654853424101 118733.177841746510 +1060 0.1060 5546.6952820504657211 118436.490855779703 +1061 0.1061 5534.8664215396775035 118140.719359976312 +1062 0.1062 5523.0670925806252853 117845.859821076388 +1063 0.1063 5511.2972041534439995 117551.908722542983 +1064 0.1064 5499.5566655890934271 117258.862564467301 +1065 0.1065 5487.8453865676965506 116966.717863474289 +1066 0.1066 5476.1632771168915497 116675.471152631202 +1067 0.1067 5464.5102476101919819 116385.118981351203 +1068 0.1068 5452.8862087653587878 116095.657915306801 +1069 0.1069 5441.2910716427768421 115807.084536333088 +1070 0.1070 5429.7247476438433296 115519.395442341585 +1071 0.1071 5418.1871485093652154 115232.587247224903 +1072 0.1072 5406.6781863179649008 114946.656580773299 +1073 0.1073 5395.1977734844967927 114661.600088582694 +1074 0.1074 5383.7458227584693304 114377.414431962607 +1075 0.1075 5372.3222472224779267 114094.096287856810 +1076 0.1076 5360.9269602906479122 113811.642348746202 +1077 0.1077 5349.5598757070820284 113530.049322570499 +1078 0.1078 5338.2209075443215625 113249.313932638019 +1079 0.1079 5326.9099702018129392 112969.432917540515 +1080 0.1080 5315.6269784043824984 112690.403031066206 +1081 0.1081 5304.3718472007230957 112412.221042120596 +1082 0.1082 5293.1444919618852509 112134.883734637609 +1083 0.1083 5281.9448283797783006 111858.387907499986 +1084 0.1084 5270.7727724656806458 111582.730374451086 +1085 0.1085 5259.6282405487572760 111307.907964019585 +1086 0.1086 5248.5111492745845680 111033.917519430193 +1087 0.1087 5237.4214156036869099 110760.755898530711 +1088 0.1088 5226.3589568100751421 110488.419973702985 +1089 0.1089 5215.3236904798004616 110216.906631788093 +1090 0.1090 5204.3155345095110533 109946.212774005107 +1091 0.1091 5193.3344071050169077 109676.335315872304 +1092 0.1092 5182.3802267798664616 109407.271187128004 +1093 0.1093 5171.4529123539277862 109139.017331651718 +1094 0.1094 5160.5523829519761421 108871.570707386898 +1095 0.1095 5149.6785580022933573 108604.928286266397 +1096 0.1096 5138.8313572352735719 108339.087054129908 +1097 0.1097 5128.0107006820344395 108074.044010655402 +1098 0.1098 5117.2165086730383337 107809.796169275811 +1099 0.1099 5106.4487018367190103 107546.340557109594 +1100 0.1100 5095.7072010981191852 107283.674214882805 +1101 0.1101 5084.9919276775326580 107021.794196856092 +1102 0.1102 5074.3028030891528033 106760.697570749806 +1103 0.1103 5063.6397491397319754 106500.381417672907 +1104 0.1104 5053.0026879272463702 106240.842832046110 +1105 0.1105 5042.3915418395672532 105982.078921536406 +1106 0.1106 5031.8062335531412828 105724.086806975014 +1107 0.1107 5021.2466860316781094 105466.863622296194 +1108 0.1108 5010.7128225248407034 105210.406514458286 +1109 0.1109 5000.2045665669484151 104954.712643380015 +1110 0.1110 4989.7218419756864023 104699.779181863007 +1111 0.1111 4979.2645728508168759 104445.603315527114 +1112 0.1112 4968.8326835729030790 104192.182242740484 +1113 0.1113 4958.4260988020387231 103939.513174550404 +1114 0.1114 4948.0447434765801518 103687.593334613019 +1115 0.1115 4937.6885428118930577 103436.419959128893 +1116 0.1116 4927.3574222990982889 103185.990296770906 +1117 0.1117 4917.0513077038285701 102936.301608621696 +1118 0.1118 4906.7701250649924987 102687.351168105510 +1119 0.1119 4896.5138006935412704 102439.136260918312 +1120 0.1120 4886.2822611712472280 102191.654184968691 +1121 0.1121 4876.0754333494833190 101944.902250307088 +1122 0.1122 4865.8932443480152870 101698.877779061178 +1123 0.1123 4855.7356215537938624 101453.578105374007 +1124 0.1124 4845.6024926197578679 101209.000575337603 +1125 0.1125 4835.4937854636445991 100965.142546930205 +1126 0.1126 4825.4094282668002052 100722.001389951402 +1127 0.1127 4815.3493494730046223 100479.574485961697 +1128 0.1128 4805.3134777872955965 100237.859228215093 +1129 0.1129 4795.3017421748045308 99996.853021602597 +1130 0.1130 4785.3140718595950602 99756.553282587411 +1131 0.1131 4775.3503963235089032 99516.957439140897 +1132 0.1132 4765.4106453050171694 99278.062930688902 +1133 0.1133 4755.4947487980807637 99039.867208042109 +1134 0.1134 4745.6026370510116976 98802.367733341598 +1135 0.1135 4735.7342405653444075 98565.561979996710 +1136 0.1136 4725.8894900947134374 98329.447432625806 +1137 0.1137 4716.0683166437320324 98094.021586997595 +1138 0.1138 4706.2706514668834643 97859.281949972006 +1139 0.1139 4696.4964260674132674 97625.226039439091 +1140 0.1140 4686.7455721962278403 97391.851384266309 +1141 0.1141 4677.0180218508030521 97159.155524233996 +1142 0.1142 4667.3137072740919393 96927.136009984199 +1143 0.1143 4657.6325609534451360 96695.790402959698 +1144 0.1144 4647.9745156195294840 96465.116275348788 +1145 0.1145 4638.3395042452602866 96235.111210027011 +1146 0.1146 4628.7274600447335615 96005.772800503895 +1147 0.1147 4619.1383164721646608 95777.098650865504 +1148 0.1148 4609.5720072208350757 95549.086375718893 +1149 0.1149 4600.0284662220419705 95321.733600137508 +1150 0.1150 4590.5076276440549918 95095.037959606998 +1151 0.1151 4581.0094258910758072 94868.997099970205 +1152 0.1152 4571.5337956022085564 94643.608677372307 +1153 0.1153 4562.0806716504293945 94418.870358209591 +1154 0.1154 4552.6499891415651291 94194.779819073796 +1155 0.1155 4543.2416834132764052 93971.334746698805 +1156 0.1156 4533.8556900340463471 93748.532837909705 +1157 0.1157 4524.4919448021719290 93526.371799569810 +1158 0.1158 4515.1503837447671685 93304.849348526797 +1159 0.1159 4505.8309431167626826 93083.963211564595 +1160 0.1160 4496.5335593999170669 92863.711125346395 +1161 0.1161 4487.2581693018310034 92644.090836370699 +1162 0.1162 4478.0047097549668251 92425.100100912008 +1163 0.1163 4468.7731179156726284 92206.736684978401 +1164 0.1164 4459.5633311632109326 91988.998364256200 +1165 0.1165 4450.3752870987955248 91771.882924059799 +1166 0.1166 4441.2089235446283055 91555.388159287002 +1167 0.1167 4432.0641785429461379 91339.511874362899 +1168 0.1168 4422.9409903550686067 91124.251883195902 +1169 0.1169 4413.8392974604521442 90909.606009126612 +1170 0.1170 4404.7590385557514310 90695.572084881802 +1171 0.1171 4395.7001525538817077 90482.147952520798 +1172 0.1172 4386.6625785830856330 90269.331463394105 +1173 0.1173 4377.6462559860110559 90057.120478092489 +1174 0.1174 4368.6511243187860600 89845.512866399004 +1175 0.1175 4359.6771233501040115 89634.506507243088 +1176 0.1176 4350.7241930603095170 89424.099288654295 +1177 0.1177 4341.7922736404907482 89214.289107714692 +1178 0.1178 4332.8813054915790417 89005.073870514490 +1179 0.1179 4323.9912292234484994 88796.451492102293 +1180 0.1180 4315.1219856540210458 88588.419896444000 +1181 0.1181 4306.2735158083796705 88380.977016374702 +1182 0.1182 4297.4457609178834900 88174.120793552996 +1183 0.1183 4288.6386624192846284 87967.849178418706 +1184 0.1184 4279.8521619538560117 87762.160130146905 +1185 0.1185 4271.0862013665182531 87557.051616603101 +1186 0.1186 4262.3407227049729045 87352.521614298894 +1187 0.1187 4253.6156682188402556 87148.568108349602 +1188 0.1188 4244.9109803588007708 86945.189092431508 +1189 0.1189 4236.2266017757428926 86742.382568734291 +1190 0.1190 4227.5624753199099359 86540.146547921206 +1191 0.1191 4218.9185440400597145 86338.479049088404 +1192 0.1192 4210.2947511826196205 86137.378099717695 +1193 0.1193 4201.6910401908517088 85936.841735636292 +1194 0.1194 4193.1073547040214180 85736.868000975403 +1195 0.1195 4184.5436385565662931 85537.454948128812 +1196 0.1196 4175.9998357772747113 85338.600637708601 +1197 0.1197 4167.4758905884636988 85140.303138507297 +1198 0.1198 4158.9717474051658428 84942.560527454494 +1199 0.1199 4150.4873508343143840 84745.370889577287 +1200 0.1200 4142.0226456739374044 84548.732317958304 +1201 0.1201 4133.5775769123547434 84352.642913696298 +1202 0.1202 4125.1520897273767332 84157.100785867398 +1203 0.1203 4116.7461294855093001 83962.104051481088 +1204 0.1204 4108.3596417411627044 83767.650835446402 +1205 0.1205 4099.9925722358639177 83573.739270527294 +1206 0.1206 4091.6448668974721841 83380.367497306695 +1207 0.1207 4083.3164718393995827 83187.533664144299 +1208 0.1208 4075.0073333598352292 82995.235927141694 +1209 0.1209 4066.7173979409731146 82803.472450102301 +1210 0.1210 4058.4466122482435821 82612.241404492393 +1211 0.1211 4050.1949231295488971 82421.540969403402 +1212 0.1212 4041.9622776145029093 82231.369331513095 +1213 0.1213 4033.7486229136748079 82041.724685050605 +1214 0.1214 4025.5539064178342414 81852.605231756606 +1215 0.1215 4017.3780756972041672 81664.009180848007 +1216 0.1216 4009.2210785007127924 81475.934748978209 +1217 0.1217 4001.0828627552537000 81288.380160202898 +1218 0.1218 3992.9633765649464294 81101.343645944100 +1219 0.1219 3984.8625682104016050 80914.823444948503 +1220 0.1220 3976.7803861479910665 80728.817803259793 +1221 0.1221 3968.7167790091193638 80543.324974174408 +1222 0.1222 3960.6716955995002536 80358.343218212103 +1223 0.1223 3952.6450848984359254 80173.870803075697 +1224 0.1224 3944.6368960581012288 79989.906003619995 +1225 0.1225 3936.6470784028297203 79806.447101812606 +1226 0.1226 3928.6755814284038024 79623.492386703001 +1227 0.1227 3920.7223548013494110 79441.040154383809 +1228 0.1228 3912.7873483582320659 79259.088707959105 +1229 0.1229 3904.8705121049583795 79077.636357510404 +1230 0.1230 3896.9717962160798379 78896.681420060893 +1231 0.1231 3889.0911510340997665 78716.222219539501 +1232 0.1232 3881.2285270687852972 78536.257086754311 +1233 0.1233 3873.3838749964802446 78356.784359349404 +1234 0.1234 3865.5571456594238953 78177.802381780290 +1235 0.1235 3857.7482900650711599 77999.309505275305 +1236 0.1236 3849.9572593854172737 77821.304087804499 +1237 0.1237 3842.1840049563247703 77643.784494046995 +1238 0.1238 3834.4284782768545483 77466.749095357096 +1239 0.1239 3826.6906310086001213 77290.196269733497 +1240 0.1240 3818.9704149750241413 77114.124401786408 +1241 0.1241 3811.2677821607994701 76938.531882704498 +1242 0.1242 3803.5826847111529787 76763.417110225593 +1243 0.1243 3795.9150749312116204 76588.778488602504 +1244 0.1244 3788.2649052853530520 76414.614428569999 +1245 0.1245 3780.6321283965585280 76240.923347320393 +1246 0.1246 3773.0166970457694333 76067.703668463801 +1247 0.1247 3765.4185641712460892 75894.953822003095 +1248 0.1248 3757.8376828679306527 75722.672244301299 +1249 0.1249 3750.2740063868131983 75550.857378048502 +1250 0.1250 3742.7274881342991648 75379.507672236301 +1251 0.1251 3735.1980816715813489 75208.621582123989 +1252 0.1252 3727.6857407140146279 75038.197569208904 +1253 0.1253 3720.1904191304943197 74868.234101196111 +1254 0.1254 3712.7120709428359078 74698.729651972099 +1255 0.1255 3705.2506503251588583 74529.682701568803 +1256 0.1256 3697.8061116032731661 74361.091736140690 +1257 0.1257 3690.3784092540695383 74192.955247930600 +1258 0.1258 3682.9674979049109425 74025.271735243907 +1259 0.1259 3675.5733323330277926 73858.039702416398 +1260 0.1260 3668.1958674649176828 73691.257659789509 +1261 0.1261 3660.8350583757442109 73524.924123677803 +1262 0.1262 3653.4908602887430789 73359.037616342699 +1263 0.1263 3646.1632285746277375 73193.596665961901 +1264 0.1264 3638.8521187509995798 73028.599806604587 +1265 0.1265 3631.5574864817590424 72864.045578202611 +1266 0.1266 3624.2792875765230747 72699.932526517994 +1267 0.1267 3617.0174779900412432 72536.259203122609 +1268 0.1268 3609.7720138216168380 72373.024165363793 +1269 0.1269 3602.5428513145316174 72210.225976342699 +1270 0.1270 3595.3299468554705527 72047.863204882611 +1271 0.1271 3588.1332569739511200 71885.934425503990 +1272 0.1272 3580.9527383417562305 71724.438218397190 +1273 0.1273 3573.7883477723667056 71563.373169395403 +1274 0.1274 3566.6400422203996641 71402.737869948192 +1275 0.1275 3559.5077787810473637 71242.530917095093 +1276 0.1276 3552.3915146895205908 71082.750913438998 +1277 0.1277 3545.2912073204925036 70923.396467119892 +1278 0.1278 3538.2068141875470246 70764.466191788815 +1279 0.1279 3531.1382929426285955 70605.958706582285 +1280 0.1280 3524.0856013754946616 70447.872636096101 +1281 0.1281 3517.0486974131717943 70290.206610359790 +1282 0.1282 3510.0275391194131771 70132.959264810896 +1283 0.1283 3503.0220846941592754 69976.129240270093 +1284 0.1284 3496.0322924729998704 69819.715182915606 +1285 0.1285 3489.0581209266410951 69663.715744258196 +1286 0.1286 3482.0995286603724708 69508.129581115907 +1287 0.1287 3475.1564744135371257 69352.955355589685 +1288 0.1288 3468.2289170590056528 69198.191735038592 +1289 0.1289 3461.3168156026508768 69043.837392055008 +1290 0.1290 3454.4201291828262583 68889.891004440404 +1291 0.1291 3447.5388170698452086 68736.351255181100 +1292 0.1292 3440.6728386654649512 68583.216832423612 +1293 0.1293 3433.8221535023712931 68430.486429451601 +1294 0.1294 3426.9867212436656700 68278.158744660701 +1295 0.1295 3420.1665016823558290 68126.232481536194 +1296 0.1296 3413.3614547408474209 67974.706348627893 +1297 0.1297 3406.5715404704396860 67823.579059527794 +1298 0.1298 3399.7967190508211388 67672.849332846105 +1299 0.1299 3393.0369507895693459 67522.515892188007 +1300 0.1300 3386.2921961216534328 67372.577466130606 +1301 0.1301 3379.5624156089370445 67223.032788200100 +1302 0.1302 3372.8475699396844902 67073.880596848903 +1303 0.1303 3366.1476199280705259 66925.119635431998 +1304 0.1304 3359.4625265136896815 66776.748652185910 +1305 0.1305 3352.7922507610701359 66628.766400204491 +1306 0.1306 3346.1367538591889570 66481.171637417705 +1307 0.1307 3339.4959971209896139 66333.963126569201 +1308 0.1308 3332.8699419829013095 66187.139635193103 +1309 0.1309 3326.2585500043619504 66040.699935593395 +1310 0.1310 3319.6617828673411168 65894.642804821502 +1311 0.1311 3313.0796023758675801 65748.967024653510 +1312 0.1312 3306.5119704555563658 65603.671381570297 +1313 0.1313 3299.9588491531412728 65458.754666734501 +1314 0.1314 3293.4202006360060295 65314.215675969404 +1315 0.1315 3286.8959871917204509 65170.053209737707 +1316 0.1316 3280.3861712275775062 65026.266073120889 +1317 0.1317 3273.8907152701317500 64882.853075796796 +1318 0.1318 3267.4095819647409371 64739.813032019607 +1319 0.1319 3260.9427340751099109 64597.144760598705 +1320 0.1320 3254.4901344828358560 64454.847084878100 +1321 0.1321 3248.0517461869562794 64312.918832715106 +1322 0.1322 3241.6275323034974463 64171.358836460196 +1323 0.1323 3235.2174560650278181 64030.165932936798 +1324 0.1324 3228.8214808202101267 63889.338963420596 +1325 0.1325 3222.4395700333579953 63748.876773619406 +1326 0.1326 3216.0716872839943790 63608.778213652804 +1327 0.1327 3209.7177962664100050 63469.042138032593 +1328 0.1328 3203.3778607892263608 63329.667405642598 +1329 0.1329 3197.0518447749582265 63190.652879718400 +1330 0.1330 3190.7397122595807559 63051.997427828792 +1331 0.1331 3184.4414273920965570 62913.699921854903 +1332 0.1332 3178.1569544341050459 62775.759237971492 +1333 0.1333 3171.8862577593749847 62638.174256627295 +1334 0.1334 3165.6293018534174735 62500.943862525601 +1335 0.1335 3159.3860513130607615 62364.066944605205 +1336 0.1336 3153.1564708460296060 62227.542396021396 +1337 0.1337 3146.9405252705223575 62091.369114126901 +1338 0.1338 3140.7381795147935009 61955.546000452698 +1339 0.1339 3134.5493986167361982 61820.071960689696 +1340 0.1340 3128.3741477234680133 61684.945904669701 +1341 0.1341 3122.2123920909170920 61550.166746346906 +1342 0.1342 3116.0640970834106156 61415.733403779297 +1343 0.1343 3109.9292281732659831 61281.644799110392 +1344 0.1344 3103.8077509403829026 61147.899858550998 +1345 0.1345 3097.6996310718373024 61014.497512360700 +1346 0.1346 3091.6048343614779697 60881.436694829899 +1347 0.1347 3085.5233267095231895 60748.716344261891 +1348 0.1348 3079.4550741221623866 60616.335402954603 +1349 0.1349 3073.4000427111554927 60484.292817183094 +1350 0.1350 3067.3581986934373163 60352.587537181898 +1351 0.1351 3061.3295083907219123 60221.218517126690 +1352 0.1352 3055.3139382291096808 60090.184715117706 +1353 0.1353 3049.3114547386958293 59959.485093161100 +1354 0.1354 3043.3220245531801993 59829.118617152802 +1355 0.1355 3037.3456144094793672 59699.084256860297 +1356 0.1356 3031.3821911473410182 59569.380985905605 +1357 0.1357 3025.4317217089583210 59440.007781748696 +1358 0.1358 3019.4941731385874846 59310.963625669800 +1359 0.1359 3013.5695125821662259 59182.247502752798 +1360 0.1360 3007.6577072869349649 59053.858401868201 +1361 0.1361 3001.7587246010589297 58925.795315656695 +1362 0.1362 2995.8725319732507160 58798.057240511902 +1363 0.1363 2989.9990969523969397 58670.643176564699 +1364 0.1364 2984.1383871871853444 58543.552127665404 +1365 0.1365 2978.2903704257337267 58416.783101368499 +1366 0.1366 2972.4550145152193181 58290.335108916101 +1367 0.1367 2966.6322874015122579 58164.207165221102 +1368 0.1368 2960.8221571288086125 58038.398288851298 +1369 0.1369 2955.0245918392652129 57912.907502013695 +1370 0.1370 2949.2395597726376764 57787.733830538200 +1371 0.1371 2943.4670292659175175 57662.876303861296 +1372 0.1372 2937.7069687529738076 57538.333955010894 +1373 0.1373 2931.9593467641939242 57414.105820590310 +1374 0.1374 2926.2241319261261197 57290.190940762106 +1375 0.1375 2920.5012929611261825 57166.588359233392 +1376 0.1376 2914.7907986870027344 57043.297123239507 +1377 0.1377 2909.0926180166643462 56920.316283528802 +1378 0.1378 2903.4067199577707470 56797.644894347701 +1379 0.1379 2897.7330736123822135 56675.282013425007 +1380 0.1380 2892.0716481766130528 56553.226701956199 +1381 0.1381 2886.4224129402859944 56431.478024589509 +1382 0.1382 2880.7853372865861274 56310.035049409897 +1383 0.1383 2875.1603906917193854 56188.896847924392 +1384 0.1384 2869.5475427245710307 56068.062495047197 +1385 0.1385 2863.9467630463645946 55947.531069084594 +1386 0.1386 2858.3580214103244543 55827.301651720896 +1387 0.1387 2852.7812876613384105 55707.373328003006 +1388 0.1388 2847.2165317356220839 55587.745186326007 +1389 0.1389 2841.6637236603846759 55468.416318418997 +1390 0.1390 2836.1228335534970029 55349.385819329997 +1391 0.1391 2830.5938316231599856 55230.652787412400 +1392 0.1392 2825.0766881675740478 55112.216324309702 +1393 0.1393 2819.5713735746112434 54994.075534941992 +1394 0.1394 2814.0778583214896571 54876.229527491596 +1395 0.1395 2808.5961129744455320 54758.677413388505 +1396 0.1396 2803.1261081884113082 54641.418307297296 +1397 0.1397 2797.6678147066913880 54524.451327102302 +1398 0.1398 2792.2212033606415389 54407.775593893995 +1399 0.1399 2786.7862450693492065 54291.390231955607 +1400 0.1400 2781.3629108393138267 54175.294368748502 +1401 0.1401 2775.9511717641312316 54059.487134899297 +1402 0.1402 2770.5509990241771447 53943.967664186101 +1403 0.1403 2765.1623638862915868 53828.735093524301 +1404 0.1404 2759.7852377034678284 53713.788562953894 +1405 0.1405 2754.4195919145386142 53599.127215625995 +1406 0.1406 2749.0653980438678445 53484.750197788904 +1407 0.1407 2743.7226277010395279 53370.656658775406 +1408 0.1408 2738.3912525805512814 53256.845750989291 +1409 0.1409 2733.0712444615073764 53143.316629892593 +1410 0.1410 2727.7625752073131480 53030.068453991604 +1411 0.1411 2722.4652167653721335 52917.100384825098 +1412 0.1412 2717.1791411667832108 52804.411586950097 +1413 0.1413 2711.9043205260391005 52692.001227930101 +1414 0.1414 2706.6407270407266878 52579.868478321892 +1415 0.1415 2701.3883329912273439 52468.012511662098 +1416 0.1416 2696.1471107404213399 52356.432504455894 +1417 0.1417 2690.9170327333904424 52245.127636162601 +1418 0.1418 2685.6980714971232374 52134.097089184899 +1419 0.1419 2680.4901996402213626 52023.340048855105 +1420 0.1420 2675.2933898526075609 51912.855703423309 +1421 0.1421 2670.1076149052341862 51802.643244044390 +1422 0.1422 2664.9328476497935299 51692.701864766699 +1423 0.1423 2659.7690610184290563 51583.030762518792 +1424 0.1424 2654.6162280234480022 51473.629137097894 +1425 0.1425 2649.4743217570353409 51364.496191157101 +1426 0.1426 2644.3433153909677458 51255.631130194102 +1427 0.1427 2639.2231821763311927 51147.033162538602 +1428 0.1428 2634.1138954432371975 51038.701499340496 +1429 0.1429 2629.0154286005422364 50930.635354557991 +1430 0.1430 2623.9277551355671676 50822.833944945800 +1431 0.1431 2618.8508486138175613 50715.296490043103 +1432 0.1432 2613.7846826787072132 50608.022212162308 +1433 0.1433 2608.7292310512802942 50501.010336376901 +1434 0.1434 2603.6844675299357732 50394.260090510099 +1435 0.1435 2598.6503659901541141 50287.770705122894 +1436 0.1436 2593.6269003842226084 50181.541413503401 +1437 0.1437 2588.6140447409648004 50075.571451654396 +1438 0.1438 2583.6117731654680938 49969.860058282502 +1439 0.1439 2578.6200598388145409 49864.406474787000 +1440 0.1440 2573.6388790178129966 49759.209945248098 +1441 0.1441 2568.6682050347299082 49654.269716415802 +1442 0.1442 2563.7080122970241973 49549.585037698998 +1443 0.1443 2558.7582752870816876 49445.155161154195 +1444 0.1444 2553.8189685619504417 49340.979341474194 +1445 0.1445 2548.8900667530779174 49237.056835978001 +1446 0.1446 2543.9715445660490332 49133.386904598105 +1447 0.1447 2539.0633767803255978 49029.968809871891 +1448 0.1448 2534.1655382489857402 48926.801816928491 +1449 0.1449 2529.2780038984651583 48823.885193480004 +1450 0.1450 2524.4007487283006412 48721.218209809107 +1451 0.1451 2519.5337478108722280 48618.800138759601 +1452 0.1452 2514.6769762911480939 48516.630255724594 +1453 0.1453 2509.8304093864298920 48414.707838637303 +1454 0.1454 2504.9940223860999140 48313.032167959100 +1455 0.1455 2500.1677906513682501 48211.602526670409 +1456 0.1456 2495.3516896150217690 48110.418200258704 +1457 0.1457 2490.5456947811735517 48009.478476709701 +1458 0.1458 2485.7497817250132357 47908.782646495907 +1459 0.1459 2480.9639260925600865 47808.330002566800 +1460 0.1460 2476.1881036004147063 47708.119840338302 +1461 0.1461 2471.4222900355134698 47608.151457683205 +1462 0.1462 2466.6664612548834157 47508.424154920402 +1463 0.1463 2461.9205931853971379 47408.937234804791 +1464 0.1464 2457.1846618235308597 47309.690002517804 +1465 0.1465 2452.4586432351220537 47210.681765656802 +1466 0.1466 2447.7425135551279709 47111.911834225502 +1467 0.1467 2443.0362489873855338 47013.379520623908 +1468 0.1468 2438.3398258043725946 46915.084139638595 +1469 0.1469 2433.6532203469691922 46817.025008432705 +1470 0.1470 2428.9764090242206294 46719.201446536201 +1471 0.1471 2424.3093683131019134 46621.612775836591 +1472 0.1472 2419.6520747582817421 46524.258320568500 +1473 0.1473 2415.0045049718878545 46427.137407304705 +1474 0.1474 2410.3666356332751093 46330.249364946299 +1475 0.1475 2405.7384434887921998 46233.593524713200 +1476 0.1476 2401.1199053515497326 46137.169220134507 +1477 0.1477 2396.5109981011910349 46040.975787039497 +1478 0.1478 2391.9116986836615979 45945.012563547498 +1479 0.1479 2387.3219841109812478 45849.278890059402 +1480 0.1480 2382.7418314610158632 45753.774109247795 +1481 0.1481 2378.1712178772509105 45658.497566047794 +1482 0.1482 2373.6101205685663444 45563.448607647799 +1483 0.1483 2369.0585168090101433 45468.626583480698 +1484 0.1484 2364.5163839375754833 45374.030845214103 +1485 0.1485 2359.9836993579779119 45279.660746741793 +1486 0.1486 2355.4604405384320671 45185.515644174200 +1487 0.1487 2350.9465850114320347 45091.594895830203 +1488 0.1488 2346.4421103735289762 44997.897862227197 +1489 0.1489 2341.9469942851137603 44904.423906072596 +1490 0.1490 2337.4612144701973193 44811.172392255205 +1491 0.1491 2332.9847487161928257 44718.142687836298 +1492 0.1492 2328.5175748736987771 44625.334162040192 +1493 0.1493 2324.0596708562843560 44532.746186246397 +1494 0.1494 2319.6110146402729697 44440.378133980397 +1495 0.1495 2315.1715842645285193 44348.229380905206 +1496 0.1496 2310.7413578302425776 44256.299304812295 +1497 0.1497 2306.3203135007211131 44164.587285613699 +1498 0.1498 2301.9084295011739414 44073.092705332994 +1499 0.1499 2297.5056841185023586 43981.814948096697 +1500 0.1500 2293.1120557010913217 43890.753400126399 +1501 0.1501 2288.7275226585984456 43799.907449729493 +1502 0.1502 2284.3520634617475480 43709.276487291609 +1503 0.1503 2279.9856566421194657 43618.859905267505 +1504 0.1504 2275.6282807919474180 43528.657098173499 +1505 0.1505 2271.2799145639096423 43438.667462578800 +1506 0.1506 2266.9405366709256668 43348.890397097093 +1507 0.1507 2262.6101258859516747 43259.325302378405 +1508 0.1508 2258.2886610417776865 43169.971581101796 +1509 0.1509 2253.9761210308242880 43080.828637965998 +1510 0.1510 2249.6724848049420871 42991.895879681892 +1511 0.1511 2245.3777313752098053 42903.172714964603 +1512 0.1512 2241.0918398117350989 42814.658554525304 +1513 0.1513 2236.8147892434558344 42726.352811063407 +1514 0.1514 2232.5465588579395444 42638.254899258303 +1515 0.1515 2228.2871279011883416 42550.364235761808 +1516 0.1516 2224.0364756774406487 42462.680239190100 +1517 0.1517 2219.7945815489752022 42375.202330116095 +1518 0.1518 2215.5614249359164205 42287.929931061299 +1519 0.1519 2211.3369853160388629 42200.862466488601 +1520 0.1520 2207.1212422245748712 42113.999362793998 +1521 0.1521 2202.9141752540203925 42027.340048299098 +1522 0.1522 2198.7157640539430759 41940.883953243996 +1523 0.1523 2194.5259883307917335 41854.630509778603 +1524 0.1524 2190.3448278477048916 41768.579151956197 +1525 0.1525 2186.1722624243207065 41682.729315724995 +1526 0.1526 2182.0082719365882440 41597.080438921403 +1527 0.1527 2177.8528363165792143 41511.631961261701 +1528 0.1528 2173.7059355522992519 41426.383324335504 +1529 0.1529 2169.5675496875023782 41341.333971597502 +1530 0.1530 2165.4376588215045558 41256.483348360896 +1531 0.1531 2161.3162431089972415 41171.830901789595 +1532 0.1532 2157.2032827598632139 41087.376080890899 +1533 0.1533 2153.0987580389933100 41003.118336508400 +1534 0.1534 2149.0026492661022530 40919.057121314596 +1535 0.1535 2144.9149368155462980 40835.191889804002 +1536 0.1536 2140.8356011161417882 40751.522098285495 +1537 0.1537 2136.7646226509837106 40668.047204875700 +1538 0.1538 2132.7019819572651613 40584.766669491495 +1539 0.1539 2128.6476596260986298 40501.679953842999 +1540 0.1540 2124.6016363023350095 40418.786521426700 +1541 0.1541 2120.5638926843876106 40336.085837518593 +1542 0.1542 2116.5344095240534443 40253.577369166596 +1543 0.1543 2112.5131676263358713 40171.260585184202 +1544 0.1544 2108.5001478492695242 40089.134956143302 +1545 0.1545 2104.4953311037438652 40007.199954367505 +1546 0.1546 2100.4986983533294733 39925.455053924699 +1547 0.1547 2096.5102306141020563 39843.899730621299 +1548 0.1548 2092.5299089544714661 39762.533461994397 +1549 0.1549 2088.5577144950066213 39681.355727305694 +1550 0.1550 2084.5936284082645216 39600.366007534205 +1551 0.1551 2080.6376319186192632 39519.563785370396 +1552 0.1552 2076.6897063020901442 39438.948545208499 +1553 0.1553 2072.7498328861724985 39358.519773140702 +1554 0.1554 2068.8179930496680754 39278.276956950402 +1555 0.1555 2064.8941682225154182 39198.219586104802 +1556 0.1556 2060.9783398856225176 39118.347151749796 +1557 0.1557 2057.0704895706999196 39038.659146702194 +1558 0.1558 2053.1705988600924684 38959.155065443905 +1559 0.1559 2049.2786493866146884 38879.834404115500 +1560 0.1560 2045.3946228333836643 38800.696660508998 +1561 0.1561 2041.5185009336551047 38721.741334062797 +1562 0.1562 2037.6502654706591784 38642.967925854100 +1563 0.1563 2033.7898982774368051 38564.375938593003 +1564 0.1564 2029.9373812366764014 38485.964876616505 +1565 0.1565 2026.0926962805515359 38407.734245882006 +1566 0.1566 2022.2558253905594938 38329.683553960407 +1567 0.1567 2018.4267505973598418 38251.812310031193 +1568 0.1568 2014.6054539806145840 38174.120024874908 +1569 0.1569 2010.7919176688274092 38096.606210867802 +1570 0.1570 2006.9861238391852112 38019.270381975599 +1571 0.1571 2003.1880547173991545 37942.112053746896 +1572 0.1572 1999.3976925775464224 37865.130743307804 +1573 0.1573 1995.6150197419133292 37788.325969355297 +1574 0.1574 1991.8400185808379774 37711.697252151200 +1575 0.1575 1988.0726715125545070 37635.244113516601 +1576 0.1576 1984.3129610030373442 37558.966076825702 +1577 0.1577 1980.5608695658461329 37482.862666999303 +1578 0.1578 1976.8163797619711204 37406.933410500096 +1579 0.1579 1973.0794741996799075 37331.177835325201 +1580 0.1580 1969.3501355343635169 37255.595471001499 +1581 0.1581 1965.6283464683845068 37180.185848579698 +1582 0.1582 1961.9140897509241768 37104.948500627601 +1583 0.1583 1958.2073481778315909 37029.882961225303 +1584 0.1584 1954.5081045914723745 36954.988765958697 +1585 0.1585 1950.8163418805786478 36880.265451914398 +1586 0.1586 1947.1320429800991860 36805.712557673498 +1587 0.1587 1943.4551908710502630 36731.329623305995 +1588 0.1588 1939.7857685803667209 36657.116190365203 +1589 0.1589 1936.1237591807544050 36583.071801882201 +1590 0.1590 1932.4691457905423704 36509.196002359706 +1591 0.1591 1928.8219115735359992 36435.488337767194 +1592 0.1592 1925.1820397388707988 36361.948355535096 +1593 0.1593 1921.5495135408666556 36288.575604548605 +1594 0.1594 1917.9243162788820882 36215.369635143201 +1595 0.1595 1914.3064312971700929 36142.329999098300 +1596 0.1596 1910.6958419847335335 36069.456249632298 +1597 0.1597 1907.0925317751821240 35996.747941396898 +1598 0.1598 1903.4964841465887275 35924.204630471606 +1599 0.1599 1899.9076826213472486 35851.825874358605 +1600 0.1600 1896.3261107660305242 35779.611231977200 +1601 0.1601 1892.7517521912486700 35707.560263658299 +1602 0.1602 1889.1845905515087907 35635.672531139397 +1603 0.1603 1885.6246095450737812 35563.947597559105 +1604 0.1604 1882.0717929138231739 35492.385027451804 +1605 0.1605 1878.5261244431135310 35420.984386742697 +1606 0.1606 1874.9875879616392922 35349.745242742007 +1607 0.1607 1871.4561673412952132 35278.667164140301 +1608 0.1608 1867.9318464970381228 35207.749721003202 +1609 0.1609 1864.4146093867495892 35136.992484765702 +1610 0.1610 1860.9044400110999504 35066.395028227700 +1611 0.1611 1857.4013224134112079 34995.956925548497 +1612 0.1612 1853.9052406795217394 34925.677752241900 +1613 0.1613 1850.4161789376510114 34855.557085170905 +1614 0.1614 1846.9341213582654291 34785.594502542699 +1615 0.1615 1843.4590521539430483 34715.789583903897 +1616 0.1616 1839.9909555792410174 34646.141910134902 +1617 0.1617 1836.5298159305618810 34576.651063445795 +1618 0.1618 1833.0756175460210216 34507.316627370703 +1619 0.1619 1829.6283448053143275 34438.138186762801 +1620 0.1620 1826.1879821295867714 34369.115327789899 +1621 0.1621 1822.7545139813007609 34300.247637929104 +1622 0.1622 1819.3279248641063077 34231.534705962098 +1623 0.1623 1815.9081993227096063 34162.976121970205 +1624 0.1624 1812.4953219427445674 34094.571477329693 +1625 0.1625 1809.0892773506427602 34026.320364706800 +1626 0.1626 1805.6900502135047191 33958.222378053004 +1627 0.1627 1802.2976252389721594 33890.277112600001 +1628 0.1628 1798.9119871750992843 33822.484164855501 +1629 0.1629 1795.5331208102265919 33754.843132597802 +1630 0.1630 1792.1610109728530915 33687.353614871608 +1631 0.1631 1788.7956425315103388 33620.015211983198 +1632 0.1632 1785.4370003946364704 33552.827525495595 +1633 0.1633 1782.0850695104504666 33485.790158223797 +1634 0.1634 1778.7398348668277777 33418.902714230600 +1635 0.1635 1775.4012814911752685 33352.164798821599 +1636 0.1636 1772.0693944503070725 33285.576018540596 +1637 0.1637 1768.7441588503218100 33219.135981165397 +1638 0.1638 1765.4255598364784419 33152.844295702700 +1639 0.1639 1762.1135825930741703 33086.700572383808 +1640 0.1640 1758.8082123433218840 33020.704422660499 +1641 0.1641 1755.5094343492289681 32954.855459199694 +1642 0.1642 1752.2172339114749775 32889.153295879696 +1643 0.1643 1748.9315963692918103 32823.597547785401 +1644 0.1644 1745.6525071003422909 32758.187831203802 +1645 0.1645 1742.3799515206010255 32692.923763620001 +1646 0.1646 1739.1139150842343497 32627.804963711900 +1647 0.1647 1735.8543832834814111 32562.831051346999 +1648 0.1648 1732.6013416485352536 32498.001647577101 +1649 0.1649 1729.3547757474245827 32433.316374634396 +1650 0.1650 1726.1146711858964409 32368.774855926597 +1651 0.1651 1722.8810136072984278 32304.376716033799 +1652 0.1652 1719.6537886924616032 32240.121580702598 +1653 0.1653 1716.4329821595842986 32176.009076843300 +1654 0.1654 1713.2185797641159297 32112.038832524497 +1655 0.1655 1710.0105672986412628 32048.210476969802 +1656 0.1656 1706.8089305927651367 31984.523640552699 +1657 0.1657 1703.6136555129978660 31920.977954793001 +1658 0.1658 1700.4247279626406453 31857.573052352400 +1659 0.1659 1697.2421338816714069 31794.308567030504 +1660 0.1660 1694.0658592466318169 31731.184133760100 +1661 0.1661 1690.8958900705135875 31668.199388604102 +1662 0.1662 1687.7322124026459278 31605.353968750296 +1663 0.1663 1684.5748123285829934 31542.647512507803 +1664 0.1664 1681.4236759699924733 31480.079659302701 +1665 0.1665 1678.2787894845434948 31417.650049674801 +1666 0.1666 1675.1401390657961201 31355.358325272500 +1667 0.1667 1672.0077109430899327 31293.204128849196 +1668 0.1668 1668.8814913814344436 31231.187104259399 +1669 0.1669 1665.7614666813988151 31169.306896454800 +1670 0.1670 1662.6476231790020393 31107.563151480001 +1671 0.1671 1659.5399472456047079 31045.955516468297 +1672 0.1672 1656.4384252877994186 30984.483639638802 +1673 0.1673 1653.3430437473029997 30923.147170291399 +1674 0.1674 1650.2537891008482802 30861.945758803300 +1675 0.1675 1647.1706478600767696 30800.879056624999 +1676 0.1676 1644.0936065714315646 30739.946716276900 +1677 0.1677 1641.0226518160504838 30679.148391344497 +1678 0.1678 1637.9577702096594294 30618.483736475398 +1679 0.1679 1634.8989484024668855 30557.952407375196 +1680 0.1680 1631.8461730790579622 30497.554060803403 +1681 0.1681 1628.7994309582893493 30437.288354570002 +1682 0.1682 1625.7587087931842689 30377.154947531599 +1683 0.1683 1622.7239933708283388 30317.153499587301 +1684 0.1684 1619.6952715122652080 30257.283671675603 +1685 0.1685 1616.6725300723928740 30197.545125770095 +1686 0.1686 1613.6557559398604553 30137.937524876001 +1687 0.1687 1610.6449360369654187 30078.460533026202 +1688 0.1688 1607.6400573195501238 30019.113815278000 +1689 0.1689 1604.6411067769008696 29959.897037709099 +1690 0.1690 1601.6480714316446665 29900.809867414202 +1691 0.1691 1598.6609383396489648 29841.851972500801 +1692 0.1692 1595.6796945899195634 29783.023022086298 +1693 0.1693 1592.7043273045005662 29724.322686293901 +1694 0.1694 1589.7348236383734275 29665.750636249300 +1695 0.1695 1586.7711707793571350 29607.306544076600 +1696 0.1696 1583.8133559480086205 29548.990082895398 +1697 0.1697 1580.8613663975229429 29490.800926817097 +1698 0.1698 1577.9151894136350620 29432.738750940698 +1699 0.1699 1574.9748123145204772 29374.803231350001 +1700 0.1700 1572.0402224506974562 29316.994045109997 +1701 0.1701 1569.1114072049288097 29259.310870262900 +1702 0.1702 1566.1883539921243482 29201.753385825305 +1703 0.1703 1563.2710502592437933 29144.321271784498 +1704 0.1704 1560.3594834851999167 29087.014209094501 +1705 0.1705 1557.4536411807614513 29029.831879673202 +1706 0.1706 1554.5535108884578221 28972.773966399000 +1707 0.1707 1551.6590801824825121 28915.840153107099 +1708 0.1708 1548.7703366685977926 28859.030124585697 +1709 0.1709 1545.8872679840399087 28802.343566573800 +1710 0.1710 1543.0098617974233548 28745.780165756700 +1711 0.1711 1540.1381058086474241 28689.339609763301 +1712 0.1712 1537.2719877488011662 28633.021587162100 +1713 0.1713 1534.4114953800701642 28576.825787458703 +1714 0.1714 1531.5566164956426292 28520.751901092004 +1715 0.1715 1528.7073389196164044 28464.799619431000 +1716 0.1716 1525.8636505069061968 28408.968634771401 +1717 0.1717 1523.0255391431510361 28353.258640332395 +1718 0.1718 1520.1929927446217334 28297.669330253502 +1719 0.1719 1517.3659992581294773 28242.200399591104 +1720 0.1720 1514.5445466609342020 28186.851544315803 +1721 0.1721 1511.7286229606529560 28131.622461308103 +1722 0.1722 1508.9182161951696344 28076.512848356495 +1723 0.1723 1506.1133144325442572 28021.522404153104 +1724 0.1724 1503.3139057709220197 27966.650828291400 +1725 0.1725 1500.5199783384443890 27911.897821262399 +1726 0.1726 1497.7315202931586100 27857.263084451803 +1727 0.1727 1494.9485198229292564 27802.746320136903 +1728 0.1728 1492.1709651453481911 27748.347231483498 +1729 0.1729 1489.3988445076467997 27694.065522542100 +1730 0.1730 1486.6321461866073150 27639.900898246098 +1731 0.1731 1483.8708584884745960 27585.853064407402 +1732 0.1732 1481.1149697488685888 27531.921727714100 +1733 0.1733 1478.3644683326965605 27478.106595727299 +1734 0.1734 1475.6193426340662427 27424.407376877600 +1735 0.1735 1472.8795810761992016 27370.823780462699 +1736 0.1736 1470.1451721113437543 27317.355516644002 +1737 0.1737 1467.4161042206892489 27264.002296443901 +1738 0.1738 1464.6923659142798897 27210.763831742202 +1739 0.1739 1461.9739457309290174 27157.639835273498 +1740 0.1740 1459.2608322381340713 27104.630020624401 +1741 0.1741 1456.5530140319913244 27051.734102230199 +1742 0.1742 1453.8504797371113000 26998.951795372002 +1743 0.1743 1451.1532180065339617 26946.282816173902 +1744 0.1744 1448.4612175216452670 26893.726881600101 +1745 0.1745 1445.7744669920925844 26841.283709451502 +1746 0.1746 1443.0929551557019295 26788.953018363500 +1747 0.1747 1440.4166707783936090 26736.734527802400 +1748 0.1748 1437.7456026541003666 26684.627958063204 +1749 0.1749 1435.0797396046839367 26632.633030266301 +1750 0.1750 1432.4190704798529623 26580.749466354599 +1751 0.1751 1429.7635841570806861 26528.976989090599 +1752 0.1752 1427.1132695415233229 26477.315322054495 +1753 0.1753 1424.4681155659386604 26425.764189639602 +1754 0.1754 1421.8281111906042042 26374.323317051203 +1755 0.1755 1419.1932454032364603 26322.992430302602 +1756 0.1756 1416.5635072189106722 26271.771256213200 +1757 0.1757 1413.9388856799796486 26220.659522404996 +1758 0.1758 1411.3193698559944096 26169.656957300198 +1759 0.1759 1408.7049488436234697 26118.763290118499 +1760 0.1760 1406.0956117665739384 26067.978250874003 +1761 0.1761 1403.4913477755114855 26017.301570372802 +1762 0.1762 1400.8921460479823509 25966.732980210105 +1763 0.1763 1398.2979957883335373 25916.272212767399 +1764 0.1764 1395.7088862276345935 25865.919001210401 +1765 0.1765 1393.1248066235998522 25815.673079485001 +1766 0.1766 1390.5457462605097589 25765.534182316202 +1767 0.1767 1387.9716944491337927 25715.502045204299 +1768 0.1768 1385.4026405266524762 25665.576404422503 +1769 0.1769 1382.8385738565805241 25615.756997014698 +1770 0.1770 1380.2794838286902177 25566.043560792103 +1771 0.1771 1377.7253598589340982 25516.435834331300 +1772 0.1772 1375.1761913893690235 25466.933556971097 +1773 0.1773 1372.6319678880799984 25417.536468810198 +1774 0.1774 1370.0926788491042316 25368.244310704598 +1775 0.1775 1367.5583137923556478 25319.056824265004 +1776 0.1776 1365.0288622635496267 25269.973751853802 +1777 0.1777 1362.5043138341277427 25220.994836583202 +1778 0.1778 1359.9846581011829585 25172.119822312303 +1779 0.1779 1357.4698846873850471 25123.348453644503 +1780 0.1780 1354.9599832409064675 25074.680475924997 +1781 0.1781 1352.4549434353482411 25026.115635238501 +1782 0.1782 1349.9547549696660553 24977.653678406103 +1783 0.1783 1347.4594075680965943 24929.294352983597 +1784 0.1784 1344.9688909800845522 24881.037407258304 +1785 0.1785 1342.4831949802091913 24832.882590246900 +1786 0.1786 1340.0023093681122646 24784.829651692802 +1787 0.1787 1337.5262239684243468 24736.878342063803 +1788 0.1788 1335.0549286306936665 24689.028412549702 +1789 0.1789 1332.5884132293131188 24641.279615059200 +1790 0.1790 1330.1266676634493251 24593.631702218700 +1791 0.1791 1327.6696818569698735 24546.084427368598 +1792 0.1792 1325.2174457583732874 24498.637544561698 +1793 0.1793 1322.7699493407171758 24451.290808560301 +1794 0.1794 1320.3271826015475199 24404.043974833996 +1795 0.1795 1317.8891355628279598 24356.896799557500 +1796 0.1796 1315.4557982708697637 24309.849039607998 +1797 0.1797 1313.0271607962613416 24262.900452562699 +1798 0.1798 1310.6032132337984422 24216.050796696596 +1799 0.1799 1308.1839457024145759 24169.299830980101 +1800 0.1800 1305.7693483451116663 24122.647315076800 +1801 0.1801 1303.3594113288907010 24076.093009340901 +1802 0.1802 1300.9541248446828376 24029.636674815105 +1803 0.1803 1298.5534791072807366 23983.278073228204 +1804 0.1804 1296.1574643552696671 23937.016966992600 +1805 0.1805 1293.7660708509599772 23890.853119202202 +1806 0.1806 1291.3792888803184269 23844.786293630397 +1807 0.1807 1288.9971087529006581 23798.816254726902 +1808 0.1808 1286.6195208017834375 23752.942767616598 +1809 0.1809 1284.2465153834978082 23707.165598096301 +1810 0.1810 1281.8780828779613330 23661.484512633204 +1811 0.1811 1279.5142136884114734 23615.899278362100 +1812 0.1812 1277.1548982413391968 23570.409663083599 +1813 0.1813 1274.8001269864219012 23525.015435261499 +1814 0.1814 1272.4498903964577039 23479.716364020802 +1815 0.1815 1270.1041789672992763 23434.512219145603 +1816 0.1816 1267.7629832177881326 23389.402771076198 +1817 0.1817 1265.4262936896889187 23344.387790908004 +1818 0.1818 1263.0941009476241561 23299.467050388499 +1819 0.1819 1260.7663955790089858 23254.640321915202 +1820 0.1820 1258.4431681939865939 23209.907378533902 +1821 0.1821 1256.1244094253631829 23165.267993935995 +1822 0.1822 1253.8101099285436248 23120.721942456505 +1823 0.1823 1251.5002603814671147 23076.268999072199 +1824 0.1824 1249.1948514845435056 23031.908939398902 +1825 0.1825 1246.8938739605889623 22987.641539689801 +1826 0.1826 1244.5973185547627509 22943.466576833398 +1827 0.1827 1242.3051760345035746 22899.383828351100 +1828 0.1828 1240.0174371894663636 22855.393072394800 +1829 0.1829 1237.7340928314592929 22811.494087745898 +1830 0.1830 1235.4551337943814815 22767.686653812099 +1831 0.1831 1233.1805509341595553 22723.970550625701 +1832 0.1832 1230.9103351286862562 22680.345558841596 +1833 0.1833 1228.6444772777574599 22636.811459735403 +1834 0.1834 1226.3829683030105571 22593.368035200700 +1835 0.1835 1224.1257991478630629 22550.015067748096 +1836 0.1836 1221.8729607774505439 22506.752340501796 +1837 0.1837 1219.6244441785654544 22463.579637198902 +1838 0.1838 1217.3802403595962005 22420.496742186504 +1839 0.1839 1215.1403403504659764 22377.503440420001 +1840 0.1840 1212.9047352025718283 22334.599517461098 +1841 0.1841 1210.6734159887250826 22291.784759475704 +1842 0.1842 1208.4463738030897275 22249.058953231903 +1843 0.1843 1206.2235997611232960 22206.421886098200 +1844 0.1844 1204.0050849995163844 22163.873346041000 +1845 0.1845 1201.7908206761330803 22121.413121623700 +1846 0.1846 1199.5807979699516181 22079.041002003298 +1847 0.1847 1197.3750080810050349 22036.756776929600 +1848 0.1848 1195.1734422303213705 21994.560236742800 +1849 0.1849 1192.9760916598656877 21952.451172371500 +1850 0.1850 1190.7829476324805000 21910.429375330696 +1851 0.1851 1188.5940014318280191 21868.494637720403 +1852 0.1852 1186.4092443623308100 21826.646752222900 +1853 0.1853 1184.2286677491144928 21784.885512101602 +1854 0.1854 1182.0522629379495356 21743.210711198597 +1855 0.1855 1179.8800212951930462 21701.622143933102 +1856 0.1856 1177.7119342077314741 21660.119605299300 +1857 0.1857 1175.5479930829233126 21618.702890864603 +1858 0.1858 1173.3881893485418004 21577.371796767697 +1859 0.1859 1171.2325144527176235 21536.126119716802 +1860 0.1860 1169.0809598638822990 21494.965656987799 +1861 0.1861 1166.9335170707117868 21453.890206422100 +1862 0.1862 1164.7901775820694183 21412.899566425102 +1863 0.1863 1162.6509329269499631 21371.993535964302 +1864 0.1864 1160.5157746544234669 21331.171914567396 +1865 0.1865 1158.3846943335790911 21290.434502320400 +1866 0.1866 1156.2576835534698603 21249.781099865802 +1867 0.1867 1154.1347339230565012 21209.211508401102 +1868 0.1868 1152.0158370711526459 21168.725529676300 +1869 0.1869 1149.9009846463691247 21128.322965992800 +1870 0.1870 1147.7901683170593969 21088.003620201704 +1871 0.1871 1145.6833797712642991 21047.767295700898 +1872 0.1872 1143.5806107166574748 21007.613796434500 +1873 0.1873 1141.4818528804912603 20967.542926890495 +1874 0.1874 1139.3870980095416598 20927.554492099302 +1875 0.1875 1137.2963378700551402 20887.648297631597 +1876 0.1876 1135.2095642476938337 20847.824149596505 +1877 0.1877 1133.1267689474818781 20808.081854640699 +1878 0.1878 1131.0479437937526654 20768.421219945700 +1879 0.1879 1128.9730806300940458 20728.842053226497 +1880 0.1880 1126.9021713192962579 20689.344162730100 +1881 0.1881 1124.8352077432980423 20649.927357233300 +1882 0.1882 1122.7721818031343446 20610.591446041100 +1883 0.1883 1120.7130854188831108 20571.336238985601 +1884 0.1884 1118.6579105296127636 20532.161546423300 +1885 0.1885 1116.6066490933299065 20493.067179234098 +1886 0.1886 1114.5592930869272550 20454.052948819699 +1887 0.1887 1112.5158345061311138 20415.118667101000 +1888 0.1888 1110.4762653654502174 20376.264146517700 +1889 0.1889 1108.4405776981229792 20337.489200025604 +1890 0.1890 1106.4087635560670151 20298.793641095399 +1891 0.1891 1104.3808150098266196 20260.177283711200 +1892 0.1892 1102.3567241485227441 20221.639942368001 +1893 0.1893 1100.3364830798007006 20183.181432071600 +1894 0.1894 1098.3200839297803668 20144.801568335199 +1895 0.1895 1096.3075188430045728 20106.500167178798 +1896 0.1896 1094.2987799823893056 20068.277045127801 +1897 0.1897 1092.2938595291723232 20030.132019210301 +1898 0.1898 1090.2927496828640415 19992.064906956504 +1899 0.1899 1088.2954426611963754 19954.075526396598 +1900 0.1900 1086.3019307000736262 19916.163696059597 +1901 0.1901 1084.3122060535220044 19878.329234970795 +1902 0.1902 1082.3262609936409717 19840.571962651396 +1903 0.1903 1080.3440878105525371 19802.891699115997 +1904 0.1904 1078.3656788123530532 19765.288264871597 +1905 0.1905 1076.3910263250636490 19727.761480915502 +1906 0.1906 1074.4201226925811170 19690.311168734301 +1907 0.1907 1072.4529602766292555 19652.937150301805 +1908 0.1908 1070.4895314567102105 19615.639248077703 +1909 0.1909 1068.5298286300560449 19578.417285006202 +1910 0.1910 1066.5738442115800808 19541.271084514501 +1911 0.1911 1064.6215706338289237 19504.200470510299 +1912 0.1912 1062.6730003469342591 19467.205267381800 +1913 0.1913 1060.7281258185653314 19430.285299994903 +1914 0.1914 1058.7869395338809682 19393.440393692497 +1915 0.1915 1056.8494339954818315 19356.670374292404 +1916 0.1916 1054.9156017233628972 19319.975068086103 +1917 0.1917 1052.9854352548666157 19283.354301837397 +1918 0.1918 1051.0589271446356179 19246.807902780300 +1919 0.1919 1049.1360699645656496 19210.335698618499 +1920 0.1920 1047.2168563037585045 19173.937517522998 +1921 0.1921 1045.3012787684758678 19137.613188130901 +1922 0.1922 1043.3893299820920220 19101.362539544203 +1923 0.1923 1041.4810025850483726 19065.185401328097 +1924 0.1924 1039.5762892348066089 19029.081603509101 +1925 0.1925 1037.6751826058023198 18993.050976574697 +1926 0.1926 1035.7776753893999739 18957.093351470601 +1927 0.1927 1033.8837602938465352 18921.208559600302 +1928 0.1928 1031.9934300442253061 18885.396432822799 +1929 0.1929 1030.1066773824115899 18849.656803452002 +1930 0.1930 1028.2234950670263061 18813.989504254401 +1931 0.1931 1026.3438758733911982 18778.394368448600 +1932 0.1932 1024.4678125934835862 18742.871229702898 +1933 0.1933 1022.5952980358916875 18707.419922134799 +1934 0.1934 1020.7263250257694835 18672.040280308902 +1935 0.1935 1018.8608864047922680 18636.732139235795 +1936 0.1936 1016.9989750311119678 18601.495334370600 +1937 0.1937 1015.1405837793129194 18566.329701611397 +1938 0.1938 1013.2857055403674167 18531.235077298399 +1939 0.1939 1011.4343332215919418 18496.211298211900 +1940 0.1940 1009.5864597466028272 18461.258201571003 +1941 0.1941 1007.7420780552726001 18426.375625032899 +1942 0.1942 1005.9011811036864401 18391.563406690402 +1943 0.1943 1004.0637618640982964 18356.821385071598 +1944 0.1944 1002.2298133248878003 18322.149399137805 +1945 0.1945 1000.3993284905167229 18287.547288282698 +1946 0.1946 998.5723003814861158 18253.014892330302 +1947 0.1947 996.7487220342928822 18218.552051534498 +1948 0.1948 994.9285865013872581 18184.158606577003 +1949 0.1949 993.1118868511300661 18149.834398566200 +1950 0.1950 991.2986161677499695 18115.579269035901 +1951 0.1951 989.4887675513009526 18081.393059944297 +1952 0.1952 987.6823341176201438 18047.275613671802 +1953 0.1953 985.8793089982855236 18013.226773020502 +1954 0.1954 984.0796853405738602 17979.246381212601 +1955 0.1955 982.2834563074187599 17945.334281888998 +1956 0.1956 980.4906150773689433 17911.490319108001 +1957 0.1957 978.7011548445462950 17877.714337344500 +1958 0.1958 976.9150688186047091 17844.006181487501 +1959 0.1959 975.1323502246883663 17810.365696840399 +1960 0.1960 973.3529923033904652 17776.792729118402 +1961 0.1961 971.5769883107121814 17743.287124447899 +1962 0.1962 969.8043315180215131 17709.848729364800 +1963 0.1963 968.0350152120125813 17676.477390813900 +1964 0.1964 966.2690326946645882 17643.172956146700 +1965 0.1965 964.5063772832012319 17609.935273120900 +1966 0.1966 962.7470423100502330 17576.764189898902 +1967 0.1967 960.9910211228029766 17543.659555046303 +1968 0.1968 959.2383070841741528 17510.621217531101 +1969 0.1969 957.4888935719615120 17477.649026721901 +1970 0.1970 955.7427739790060741 17444.742832387201 +1971 0.1971 953.9999417131519976 17411.902484693899 +1972 0.1972 952.2603901972070162 17379.127834206200 +1973 0.1973 950.5241128689025345 17346.418731883798 +1974 0.1974 948.7911031808542930 17313.775029081702 +1975 0.1975 947.0613546005228045 17281.196577548097 +1976 0.1976 945.3348606101742462 17248.683229423597 +1977 0.1977 943.6116147068411237 17216.234837239903 +1978 0.1978 941.8916104022831632 17183.851253918299 +1979 0.1979 940.1748412229487712 17151.532332769500 +1980 0.1980 938.4613007099358128 17119.277927490701 +1981 0.1981 936.7509824189529581 17087.087892166201 +1982 0.1982 935.0438799202813698 17054.962081264999 +1983 0.1983 933.3399867987361631 17022.900349640102 +1984 0.1984 931.6392966536277527 16990.902552527205 +1985 0.1985 929.9418030987242219 16958.968545543597 +1986 0.1986 928.2474997622126693 16927.098184687002 +1987 0.1987 926.5563802866615788 16895.291326334001 +1988 0.1988 924.8684383289828475 16863.547827239599 +1989 0.1989 923.1836675603940421 16831.867544535598 +1990 0.1990 921.5020616663807687 16800.250335729601 +1991 0.1991 919.8236143466591557 16768.696058703397 +1992 0.1992 918.1483193151383375 16737.204571712704 +1993 0.1993 916.4761702998833925 16705.775733385100 +1994 0.1994 914.8071610430781675 16674.409402719302 +1995 0.1995 913.1412853009879882 16643.105439084600 +1996 0.1996 911.4785368439228250 16611.863702218296 +1997 0.1997 909.8189094562005721 16580.684052226101 +1998 0.1998 908.1623969361102127 16549.566349580000 +1999 0.1999 906.5089930958753257 16518.510455117499 +2000 0.2000 904.8586917616173650 16487.516230040703 +2001 0.2001 903.2114867733196206 16456.583535914604 +2002 0.2002 901.5673719847906114 16425.712234666600 +2003 0.2003 899.9263412636280464 16394.902188585202 +2004 0.2004 898.2883884911829000 16364.153260318602 +2005 0.2005 896.6535075625232594 16333.465312873999 +2006 0.2006 895.0216923863987404 16302.838209616300 +2007 0.2007 893.3929368852045627 16272.271814267100 +2008 0.2008 891.7672349949460795 16241.765990903699 +2009 0.2009 890.1445806652030797 16211.320603957400 +2010 0.2010 888.5249678590945450 16180.935518213602 +2011 0.2011 886.9083905532434073 16150.610598809602 +2012 0.2012 885.2948427377411917 16120.345711234095 +2013 0.2013 883.6843184161132285 16090.140721325999 +2014 0.2014 882.0768116052832966 16059.995495273401 +2015 0.2015 880.4723163355390625 16029.909899612201 +2016 0.2016 878.8708266504971789 15999.883801225602 +2017 0.2017 877.2723366070687234 15969.917067342896 +2018 0.2018 875.6768402754246381 15940.009565537799 +2019 0.2019 874.0843317389612821 15910.161163728695 +2020 0.2020 872.4948050942660984 15880.371730175797 +2021 0.2021 870.9082544510831667 15850.641133482102 +2022 0.2022 869.3246739322795520 15820.969242590600 +2023 0.2023 867.7440576738107438 15791.355926784599 +2024 0.2024 866.1663998246872325 15761.801055685701 +2025 0.2025 864.5916945469402890 15732.304499253500 +2026 0.2026 863.0199360155884278 15702.866127783902 +2027 0.2027 861.4511184186037553 15673.485811908999 +2028 0.2028 859.8852359568785459 15644.163422594898 +2029 0.2029 858.3222828441917045 15614.898831141800 +2030 0.2030 856.7622533071754560 15585.691909182398 +2031 0.2031 855.2051415852822629 15556.542528681002 +2032 0.2032 853.6509419307516282 15527.450561932503 +2033 0.2033 852.0996486085768993 15498.415881561403 +2034 0.2034 850.5512558964727532 15469.438360521002 +2035 0.2035 849.0057580848421139 15440.517872091903 +2036 0.2036 847.4631494767434106 15411.654289881899 +2037 0.2037 845.9234243878580628 15382.847487824001 +2038 0.2038 844.3865771464580803 15354.097340176100 +2039 0.2039 842.8526020933733207 15325.403721520001 +2040 0.2040 841.3214935819593165 15296.766506759901 +2041 0.2041 839.7932459780652152 15268.185571122198 +2042 0.2042 838.2678536600013786 15239.660790153601 +2043 0.2043 836.7453110185076639 15211.192039721202 +2044 0.2044 835.2256124567210236 15182.779196010801 +2045 0.2045 833.7087523901441273 15154.422135526002 +2046 0.2046 832.1947252466134159 15126.120735087701 +2047 0.2047 830.6835254662673833 15097.874871832602 +2048 0.2048 829.1751475015150845 15069.684423212700 +2049 0.2049 827.6695858170047586 15041.549266994003 +2050 0.2050 826.1668348895922236 15013.469281255802 +2051 0.2051 824.6668892083099536 14985.444344389998 +2052 0.2052 823.1697432743354739 14957.474335099101 +2053 0.2053 821.6753916009606655 14929.559132397000 +2054 0.2054 820.1838287135605015 14901.698615606299 +2055 0.2055 818.6950491495622373 14873.892664358700 +2056 0.2056 817.2090474584146023 14846.141158593400 +2057 0.2057 815.7258182015571037 14818.443978556101 +2058 0.2058 814.2453559523893318 14790.801004798901 +2059 0.2059 812.7676552962404912 14763.212118178300 +2060 0.2060 811.2927108303388195 14735.677199855199 +2061 0.2061 809.8205171637813464 14708.196131293502 +2062 0.2062 808.3510689175037669 14680.768794259202 +2063 0.2063 806.8843607242498592 14653.395070819701 +2064 0.2064 805.4203872285416992 14626.074843342900 +2065 0.2065 803.9591430866497603 14598.807994496099 +2066 0.2066 802.5006229665626734 14571.594407245600 +2067 0.2067 801.0448215479576675 14544.433964854899 +2068 0.2068 799.5917335221706708 14517.326550884900 +2069 0.2069 798.1413535921667517 14490.272049192397 +2070 0.2070 796.6936764725106741 14463.270343928900 +2071 0.2071 795.2486968893372250 14436.321319540897 +2072 0.2072 793.8064095803217697 14409.424860767598 +2073 0.2073 792.3668092946513752 14382.580852641000 +2074 0.2074 790.9298907929950246 14355.789180484899 +2075 0.2075 789.4956488474750813 14329.049729913801 +2076 0.2076 788.0640782416378443 14302.362386832003 +2077 0.2077 786.6351737704245579 14275.727037433000 +2078 0.2078 785.2089302401429904 14249.143568198499 +2079 0.2079 783.7853424684382162 14222.611865897699 +2080 0.2080 782.3644052842640804 14196.131817586000 +2081 0.2081 780.9461135278545498 14169.703310605000 +2082 0.2082 779.5304620506952915 14143.326232580603 +2083 0.2083 778.1174457154951369 14117.000471423100 +2084 0.2084 776.7070593961576606 14090.725915326002 +2085 0.2085 775.2992979777530991 14064.502452764798 +2086 0.2086 773.8941563564900434 14038.329972496798 +2087 0.2087 772.4916294396872445 14012.208363559803 +2088 0.2088 771.0917121457456460 13986.137515271701 +2089 0.2089 769.6943994041206452 13960.117317229400 +2090 0.2090 768.2996861552937844 13934.147659307699 +2091 0.2091 766.9075673507454667 13908.228431659099 +2092 0.2092 765.5180379529268748 13882.359524712800 +2093 0.2093 764.1310929352325729 13856.540829173602 +2094 0.2094 762.7467272819728805 13830.772236020999 +2095 0.2095 761.3649359883463603 13805.053636509401 +2096 0.2096 759.9857140604125334 13779.384922166100 +2097 0.2097 758.6090565150647080 13753.765984790600 +2098 0.2098 757.2349583800024675 13728.196716455102 +2099 0.2099 755.8634146937046125 13702.677009502098 +2100 0.2100 754.4944205054023314 13677.206756544500 +2101 0.2101 753.1279708750519148 13651.785850464599 +2102 0.2102 751.7640608733080398 13626.414184413199 +2103 0.2103 750.4026855814969394 13601.091651809100 +2104 0.2104 749.0438400915895727 13575.818146338199 +2105 0.2105 747.6875195061750219 13550.593561952399 +2106 0.2106 746.3337189384338899 13525.417792869397 +2107 0.2107 744.9824335121118111 13500.290733571401 +2108 0.2108 743.6336583614929623 13475.212278804600 +2109 0.2109 742.2873886313738012 13450.182323578600 +2110 0.2110 740.9436194770365773 13425.200763165198 +2111 0.2111 739.6023460642234113 13400.267493097901 +2112 0.2112 738.2635635691099196 13375.382409171198 +2113 0.2113 736.9272671782794077 13350.545407439600 +2114 0.2114 735.5934520886966084 13325.756384217100 +2115 0.2115 734.2621135076819883 13301.015236076200 +2116 0.2116 732.9332466528858276 13276.321859847503 +2117 0.2117 731.6068467522625269 13251.676152618700 +2118 0.2118 730.2829090440449136 13227.078011733698 +2119 0.2119 728.9614287767186624 13202.527334792299 +2120 0.2120 727.6424012089966027 13178.024019648899 +2121 0.2121 726.3258216097935929 13153.567964412399 +2122 0.2122 725.0116852582007141 13129.159067445100 +2123 0.2123 723.6999874434603726 13104.797227361800 +2124 0.2124 722.3907234649408338 13080.482343029300 +2125 0.2125 721.0838886321110976 13056.214313566099 +2126 0.2126 719.7794782645157738 13031.993038340501 +2127 0.2127 718.4774876917501842 13007.818416971197 +2128 0.2128 717.1779122534353519 12983.690349325600 +2129 0.2129 715.8807472991931036 12959.608735519898 +2130 0.2130 714.5859881886212861 12935.573475917401 +2131 0.2131 713.2936302912689825 12911.584471128699 +2132 0.2132 712.0036689866120696 12887.641622010698 +2133 0.2133 710.7160996640283201 12863.744829665298 +2134 0.2134 709.4309177227730743 12839.893995439899 +2135 0.2135 708.1481185719547966 12816.089020925603 +2136 0.2136 706.8676976305106336 12792.329807956901 +2137 0.2137 705.5896503271821985 12768.616258611000 +2138 0.2138 704.3139721004912417 12744.948275207302 +2139 0.2139 703.0406583987155500 12721.325760306499 +2140 0.2140 701.7697046798647307 12697.748616709599 +2141 0.2141 700.5011064116563375 12674.216747457998 +2142 0.2142 699.2348590714918828 12650.730055832000 +2143 0.2143 697.9709581464327357 12627.288445350401 +2144 0.2144 696.7093991331767029 12603.891819770301 +2145 0.2145 695.4501775380339268 12580.540083085501 +2146 0.2146 694.1932888769033525 12557.233139526799 +2147 0.2147 692.9387286752489672 12533.970893560299 +2148 0.2148 691.6864924680766080 12510.753249887803 +2149 0.2149 690.4365757999099742 12487.580113445201 +2150 0.2150 689.1889742247675485 12464.451389402400 +2151 0.2151 687.9436833061392917 12441.366983162299 +2152 0.2152 686.7006986169631091 12418.326800360699 +2153 0.2153 685.4600157396018858 12395.330746864702 +2154 0.2154 684.2216302658199538 12372.378728772899 +2155 0.2155 682.9855377967605818 12349.470652414200 +2156 0.2156 681.7517339429224421 12326.606424347599 +2157 0.2157 680.5202143241369868 12303.785951361100 +2158 0.2158 679.2909745695453694 12281.009140471300 +2159 0.2159 678.0640103175757076 12258.275898922702 +2160 0.2160 676.8393172159202322 12235.586134187000 +2161 0.2161 675.6168909215127769 12212.939753962501 +2162 0.2162 674.3967271005059274 12190.336666173700 +2163 0.2163 673.1788214282487388 12167.776778970001 +2164 0.2164 671.9631695892639982 12145.260000725701 +2165 0.2165 670.7497672772257147 12122.786240039100 +2166 0.2166 669.5386101949371778 12100.355405731900 +2167 0.2167 668.3296940543081064 12077.967406848700 +2168 0.2168 667.1230145763328210 12055.622152656102 +2169 0.2169 665.9185674910679609 12033.319552642000 +2170 0.2170 664.7163485376100880 12011.059516515701 +2171 0.2171 663.5163534640739726 11988.841954206100 +2172 0.2172 662.3185780275705383 11966.666775862499 +2173 0.2173 661.1230179941848064 11944.533891852399 +2174 0.2174 659.9296691389540683 11922.443212762300 +2175 0.2175 658.7385272458461714 11900.394649396101 +2176 0.2176 657.5495881077375770 11878.388112774999 +2177 0.2177 656.3628475263919881 11856.423514137001 +2178 0.2178 655.1783013124384070 11834.500764935499 +2179 0.2179 653.9959452853496487 11812.619776839601 +2180 0.2180 652.8157752734209680 11790.780461733000 +2181 0.2181 651.6377871137486864 11768.982731713499 +2182 0.2182 650.4619766522083637 11747.226499092500 +2183 0.2183 649.2883397434339940 11725.511676394299 +2184 0.2184 648.1168722507965185 11703.838176355301 +2185 0.2185 646.9475700463825660 11682.205911923800 +2186 0.2186 645.7804290109734211 11660.614796259199 +2187 0.2187 644.6154450340238782 11639.064742731400 +2188 0.2188 643.4526140136413233 11617.555664920201 +2189 0.2189 642.2919318565645881 11596.087476614701 +2190 0.2190 641.1333944781432592 11574.660091813003 +2191 0.2191 639.9769978023165322 11553.273424720901 +2192 0.2192 638.8227377615928617 11531.927389752298 +2193 0.2193 637.6706102970288157 11510.621901527598 +2194 0.2194 636.5206113582087255 11489.356874874200 +2195 0.2195 635.3727369032237675 11468.132224824598 +2196 0.2196 634.2269828986517268 11446.947866617298 +2197 0.2197 633.0833453195360789 11425.803715695101 +2198 0.2198 631.9418201493660945 11404.699687704902 +2199 0.2199 630.8024033800560346 11383.635698497203 +2200 0.2200 629.6650910119249147 11362.611664125599 +2201 0.2201 628.5298790536763818 11341.627500845898 +2202 0.2202 627.3967635223782509 11320.683125115998 +2203 0.2203 626.2657404434427235 11299.778453594599 +2204 0.2204 625.1368058506059242 11278.913403141800 +2205 0.2205 624.0099557859080051 11258.087890817400 +2206 0.2206 622.8851862996731370 11237.301833880900 +2207 0.2207 621.7624934504896146 11216.555149790602 +2208 0.2208 620.6418733051898471 11195.847756203901 +2209 0.2209 619.5233219388309180 11175.179570975499 +2210 0.2210 618.4068354346742353 11154.550512157799 +2211 0.2211 617.2924098841663181 11133.960498000000 +2212 0.2212 616.1800413869189015 11113.409446947600 +2213 0.2213 615.0697260506893826 11092.897277641801 +2214 0.2214 613.9614599913613802 11072.423908918900 +2215 0.2215 612.8552393329249526 11051.989259810000 +2216 0.2216 611.7510602074573853 11031.593249540301 +2217 0.2217 610.6489187551039777 11011.235797528598 +2218 0.2218 609.5488111240582612 10990.916823386402 +2219 0.2219 608.4507334705430139 10970.636246918299 +2220 0.2220 607.3546819587910477 10950.393988120299 +2221 0.2221 606.2606527610259946 10930.189967180300 +2222 0.2222 605.1686420574430940 10910.024104476601 +2223 0.2223 604.0786460361903210 10889.896320578402 +2224 0.2224 602.9906608933491725 10869.806536244301 +2225 0.2225 601.9046828329157961 10849.754672422698 +2226 0.2226 600.8207080667821174 10829.740650250198 +2227 0.2227 599.7387328147169683 10809.764391052200 +2228 0.2228 598.6587533043473286 10789.825816341699 +2229 0.2229 597.5807657711393404 10769.924847818802 +2230 0.2230 596.5047664583798905 10750.061407370400 +2231 0.2231 595.4307516171578527 10730.235417069700 +2232 0.2232 594.3587175063455561 10710.446799175501 +2233 0.2233 593.2886603925801410 10690.695476131801 +2234 0.2234 592.2205765502451413 10670.981370567100 +2235 0.2235 591.1544622614520677 10651.304405294599 +2236 0.2236 590.0903138160218759 10631.664503310300 +2237 0.2237 589.0281275114666641 10612.061587794202 +2238 0.2238 587.9678996529714823 10592.495582108402 +2239 0.2239 586.9096265533761425 10572.966409797500 +2240 0.2240 585.8533045331569156 10553.473994587199 +2241 0.2241 584.7989299204083409 10534.018260384999 +2242 0.2242 583.7464990508251503 10514.599131278599 +2243 0.2243 582.6960082676844195 10495.216531535900 +2244 0.2244 581.6474539218273776 10475.870385604700 +2245 0.2245 580.6008323716415589 10456.560618111702 +2246 0.2246 579.5561399830428400 10437.287153862200 +2247 0.2247 578.5133731294577046 10418.049917840201 +2248 0.2248 577.4725281918053952 10398.848835206702 +2249 0.2249 576.4336015584800634 10379.683831300299 +2250 0.2250 575.3965896253332630 10360.554831636200 +2251 0.2251 574.3614887956561006 10341.461761905999 +2252 0.2252 573.3282954801619553 10322.404547976799 +2253 0.2253 572.2970060969685164 10303.383115891000 +2254 0.2254 571.2676170715806165 10284.397391866099 +2255 0.2255 570.2401248368726101 10265.447302293498 +2256 0.2256 569.2145258330709794 10246.532773738700 +2257 0.2257 568.1908165077370541 10227.653732940500 +2258 0.2258 567.1689933157495034 10208.810106810499 +2259 0.2259 566.1490527192872833 10190.001822432798 +2260 0.2260 565.1309911878124694 10171.228807063399 +2261 0.2261 564.1148051980527498 10152.490988129999 +2262 0.2262 563.1004912339847124 10133.788293230900 +2263 0.2263 562.0880457868164513 10115.120650135101 +2264 0.2264 561.0774653549706272 10096.487986781902 +2265 0.2265 560.0687464440675285 10077.890231280100 +2266 0.2266 559.0618855669081313 10059.327311907400 +2267 0.2267 558.0568792434572742 10040.799157110501 +2268 0.2268 557.0537240008264916 10022.305695504199 +2269 0.2269 556.0524163732577563 10003.846855871299 +2270 0.2270 555.0529529021060853 9985.422567161499 +2271 0.2271 554.0553301358233966 9967.032758491599 +2272 0.2272 553.0595446299415698 9948.677359144998 +2273 0.2273 552.0655929470557339 9930.356298570598 +2274 0.2274 551.0734716568080103 9912.069506383299 +2275 0.2275 550.0831773358706869 9893.816912362900 +2276 0.2276 549.0947065679298476 9875.598446453499 +2277 0.2277 548.1080559436690010 9857.414038764002 +2278 0.2278 547.1232220607524823 9839.263619566400 +2279 0.2279 546.1402015238093099 9821.147119296302 +2280 0.2280 545.1589909444169280 9803.064468552000 +2281 0.2281 544.1795869410846080 9785.015598094498 +2282 0.2282 543.2019861392375333 9767.000438846399 +2283 0.2283 542.2261851712006546 9749.018921891999 +2284 0.2284 541.2521806761822063 9731.070978476599 +2285 0.2285 540.2799693002580170 9713.156540006299 +2286 0.2286 539.3095476963553665 9695.275538047399 +2287 0.2287 538.3409125242367281 9677.427904325601 +2288 0.2288 537.3740604504840803 9659.613570726598 +2289 0.2289 536.4089881484829903 9641.832469294601 +2290 0.2290 535.4456922984066978 9624.084532232300 +2291 0.2291 534.4841695872000855 9606.369691900600 +2292 0.2292 533.5244167085641038 9588.687880818099 +2293 0.2293 532.5664303629401957 9571.039031660299 +2294 0.2294 531.6102072574941531 9553.423077259902 +2295 0.2295 530.6557441061008831 9535.839950605799 +2296 0.2296 529.7030376293284917 9518.289584842802 +2297 0.2297 528.7520845544228223 9500.771913271201 +2298 0.2298 527.8028816152918807 9483.286869346599 +2299 0.2299 526.8554255524906011 9465.834386679198 +2300 0.2300 525.9097131132049299 9448.414399033400 +2301 0.2301 524.9657410512368187 9431.026840327799 +2302 0.2302 524.0235061269887638 9413.671644633900 +2303 0.2303 523.0830051074482299 9396.348746176700 +2304 0.2304 522.1442347661727581 9379.058079333601 +2305 0.2305 521.2071918832743904 9361.799578634398 +2306 0.2306 520.2718732454046631 9344.573178760900 +2307 0.2307 519.3382756457393725 9327.378814545602 +2308 0.2308 518.4063958839634552 9310.216420972798 +2309 0.2309 517.4762307662559806 9293.085933176901 +2310 0.2310 516.5477771052750313 9275.987286442802 +2311 0.2311 515.6210317201426960 9258.920416205001 +2312 0.2312 514.6959914364300630 9241.885258047501 +2313 0.2313 513.7726530861425545 9224.881747703101 +2314 0.2314 512.8510135077046925 9207.909821053701 +2315 0.2315 511.9310695459456042 9190.969414129000 +2316 0.2316 511.0128180520838441 9174.060463106398 +2317 0.2317 510.0962558837129563 9157.182904311001 +2318 0.2318 509.1813799047866382 9140.336674215001 +2319 0.2319 508.2681869856040748 9123.521709436802 +2320 0.2320 507.3566740027951596 9106.737946741601 +2321 0.2321 506.4468378393060561 9089.985323040100 +2322 0.2322 505.5386753843846463 9073.263775388301 +2323 0.2323 504.6321835335658648 9056.573240987798 +2324 0.2324 503.7273591886572603 9039.913657184299 +2325 0.2325 502.8241992577246151 9023.284961468402 +2326 0.2326 501.9227006550775059 9006.687091474101 +2327 0.2327 501.0228603012548092 8990.119984979399 +2328 0.2328 500.1246751230106042 8973.583579905102 +2329 0.2329 499.2281420532996208 8957.077814314798 +2330 0.2330 498.3332580312631421 8940.602626414800 +2331 0.2331 497.4400200022147374 8924.157954553100 +2332 0.2332 496.5484249176261073 8907.743737219600 +2333 0.2333 495.6584697351128739 8891.359913045299 +2334 0.2334 494.7701514184204825 8875.006420802201 +2335 0.2335 493.8834669374102191 8858.683199402702 +2336 0.2336 492.9984132680451125 8842.390187899500 +2337 0.2337 492.1149873923758946 8826.127325484900 +2338 0.2338 491.2331862985270732 8809.894551490999 +2339 0.2339 490.3530069806831193 8793.691805388300 +2340 0.2340 489.4744464390743701 8777.519026786500 +2341 0.2341 488.5975016799633863 8761.376155433600 +2342 0.2342 487.7221697156309688 8745.263131215199 +2343 0.2343 486.8484475643624592 8729.179894154700 +2344 0.2344 485.9763322504340977 8713.126384412799 +2345 0.2345 485.1058208040990962 8697.102542286901 +2346 0.2346 484.2369102615742236 8681.108308210898 +2347 0.2347 483.3695976650259354 8665.143622755000 +2348 0.2348 482.5038800625569593 8649.208426625002 +2349 0.2349 481.6397545081925955 8633.302660662099 +2350 0.2350 480.7772180618673588 8617.426265842701 +2351 0.2351 479.9162677894113358 8601.579183278000 +2352 0.2352 479.0569007625367703 8585.761354213002 +2353 0.2353 478.1991140588247617 8569.972720027501 +2354 0.2354 477.3429047617116794 8554.213222234301 +2355 0.2355 476.4882699604759750 8538.482802479799 +2356 0.2356 475.6352067502248246 8522.781402543500 +2357 0.2357 474.7837122318808269 8507.108964336900 +2358 0.2358 473.9337835121687590 8491.465429904500 +2359 0.2359 473.0854177036024453 8475.850741422000 +2360 0.2360 472.2386119244714564 8460.264841197300 +2361 0.2361 471.3933632988281488 8444.707671668901 +2362 0.2362 470.5496689564743633 8429.179175406700 +2363 0.2363 469.7075260329484649 8413.679295110800 +2364 0.2364 468.8669316695123257 8398.207973611601 +2365 0.2365 468.0278830131383074 8382.765153869299 +2366 0.2366 467.1903772164961310 8367.350778973700 +2367 0.2367 466.3544114379402572 8351.964792143401 +2368 0.2368 465.5199828414967556 8336.607136726499 +2369 0.2369 464.6870885968504581 8321.277756198901 +2370 0.2370 463.8557258793322262 8305.976594165200 +2371 0.2371 463.0258918699061041 8290.703594357299 +2372 0.2372 462.1975837551564723 8275.458700635001 +2373 0.2373 461.3707987272754849 8260.241856985100 +2374 0.2374 460.5455339840501665 8245.053007521201 +2375 0.2375 459.7217867288499065 8229.892096483602 +2376 0.2376 458.8995541706137828 8214.759068238302 +2377 0.2377 458.0788335238380000 8199.653867277499 +2378 0.2378 457.2596220085631558 8184.576438218901 +2379 0.2379 456.4419168503619630 8169.526725805299 +2380 0.2380 455.6257152803264603 8154.504674904201 +2381 0.2381 454.8110145350558469 8139.510230507898 +2382 0.2382 453.9978118566438070 8124.543337732801 +2383 0.2383 453.1861044926662316 8109.603941819101 +2384 0.2384 452.3758896961687697 8094.691988130502 +2385 0.2385 451.5671647256545498 8079.807422154301 +2386 0.2386 450.7599268450718455 8064.950189500301 +2387 0.2387 449.9541733238017969 8050.120235901100 +2388 0.2388 449.1499014366461893 8035.317507211599 +2389 0.2389 448.3471084638151751 8020.541949408500 +2390 0.2390 447.5457916909152232 8005.793508590301 +2391 0.2391 446.7459484089368402 7991.072130976898 +2392 0.2392 445.9475759142425204 7976.377762909000 +2393 0.2393 445.1506715085546375 7961.710350848101 +2394 0.2394 444.3552324989433941 7947.069841376198 +2395 0.2395 443.5612561978148278 7932.456181195099 +2396 0.2396 442.7687399228987601 7917.869317126801 +2397 0.2397 441.9776809972368028 7903.309196112399 +2398 0.2398 441.1880767491705910 7888.775765212200 +2399 0.2399 440.3999245123296760 7874.268971605601 +2400 0.2400 439.6132216256198717 7859.788762590200 +2401 0.2401 438.8279654332112614 7845.335085581901 +2402 0.2402 438.0441532845264305 7830.907888114598 +2403 0.2403 437.2617825342287006 7816.507117840099 +2404 0.2404 436.4808505422103622 7802.132722527002 +2405 0.2405 435.7013546735809655 7787.784650061201 +2406 0.2406 434.9232922986556673 7773.462848445201 +2407 0.2407 434.1466607929435213 7759.167265798198 +2408 0.2408 433.3714575371358819 7744.897850355001 +2409 0.2409 432.5976799170948084 7730.654550466801 +2410 0.2410 431.8253253238414686 7716.437314599800 +2411 0.2411 431.0543911535446568 7702.246091335899 +2412 0.2412 430.2848748075093113 7688.080829371302 +2413 0.2413 429.5167736921648611 7673.941477517501 +2414 0.2414 428.7500852190539717 7659.827984699799 +2415 0.2415 427.9848068048210621 7645.740299958001 +2416 0.2416 427.2209358712008793 7631.678372445302 +2417 0.2417 426.4584698450071869 7617.642151428399 +2418 0.2418 425.6974061581213959 7603.631586287400 +2419 0.2419 424.9377422474812533 7589.646626514899 +2420 0.2420 424.1794755550697005 7575.687221716600 +2421 0.2421 423.4226035279033908 7561.753321609800 +2422 0.2422 422.6671236180216624 7547.844876024499 +2423 0.2423 421.9130332824753395 7533.961834902002 +2424 0.2424 421.1603299833154779 7520.104148295201 +2425 0.2425 420.4090111875823368 7506.271766368000 +2426 0.2426 419.6590743672941812 7492.464639395301 +2427 0.2427 418.9105169994363109 7478.682717762600 +2428 0.2428 418.1633365659499191 7464.925951965699 +2429 0.2429 417.4175305537211216 7451.194292610200 +2430 0.2430 416.6730964545700431 7437.487690411799 +2431 0.2431 415.9300317652396757 7423.806096195400 +2432 0.2432 415.1883339873851355 7410.149460895000 +2433 0.2433 414.4480006275626920 7396.517735553798 +2434 0.2434 413.7090291972188538 7382.910871323400 +2435 0.2435 412.9714172126795120 7369.328819463801 +2436 0.2436 412.2351621951391394 7355.771531343200 +2437 0.2437 411.5002616706501044 7342.238958437199 +2438 0.2438 410.7667131701117569 7328.731052329598 +2439 0.2439 410.0345142292597416 7315.247764710599 +2440 0.2440 409.3036623886553116 7301.789047377899 +2441 0.2441 408.5741551936746419 7288.354852236002 +2442 0.2442 407.8459901944980857 7274.945131295501 +2443 0.2443 407.1191649460996587 7261.559836673201 +2444 0.2444 406.3936770082364092 7248.198920592100 +2445 0.2445 405.6695239454377884 7234.862335380500 +2446 0.2446 404.9467033269951344 7221.550033472100 +2447 0.2447 404.2252127269512130 7208.261967405799 +2448 0.2448 403.5050497240896448 7194.998089825200 +2449 0.2449 402.7862119019244460 7181.758353478399 +2450 0.2450 402.0686968486896262 7168.542711218002 +2451 0.2451 401.3525021573286722 7155.351116000600 +2452 0.2452 400.6376254254843161 7142.183520886399 +2453 0.2453 399.9240642554880196 7129.039879039101 +2454 0.2454 399.2118162543497988 7115.920143725800 +2455 0.2455 398.5008790337477080 7102.824268316301 +2456 0.2456 397.7912502100177221 7089.752206283500 +2457 0.2457 397.0829274041434473 7076.703911202500 +2458 0.2458 396.3759082417457762 7063.679336750398 +2459 0.2459 395.6701903530729396 7050.678436706801 +2460 0.2460 394.9657713729899911 7037.701164952399 +2461 0.2461 394.2626489409688588 7024.747475469701 +2462 0.2462 393.5608207010782849 7011.817322342100 +2463 0.2463 392.8602843019734792 6998.910659754200 +2464 0.2464 392.1610373968862291 6986.027441990898 +2465 0.2465 391.4630776436147812 6973.167623438001 +2466 0.2466 390.7664027045138369 6960.331158580801 +2467 0.2467 390.0710102464845477 6947.518002004899 +2468 0.2468 389.3768979409645112 6934.728108395799 +2469 0.2469 388.6840634639178234 6921.961432537801 +2470 0.2470 387.9925044958251874 6909.217929314600 +2471 0.2471 387.3022187216740235 6896.497553708998 +2472 0.2472 386.6132038309484642 6883.800260802100 +2473 0.2473 385.9254575176196909 6871.126005773600 +2474 0.2474 385.2389774801359295 6858.474743901499 +2475 0.2475 384.5537614214127871 6845.846430561198 +2476 0.2476 383.8698070488234180 6833.241021226298 +2477 0.2477 383.1871120741887466 6820.658471467501 +2478 0.2478 382.5056742137677475 6808.098736952699 +2479 0.2479 381.8254911882477813 6795.561773446901 +2480 0.2480 381.1465607227348755 6783.047536811699 +2481 0.2481 380.4688805467440602 6770.555983004901 +2482 0.2482 379.7924483941897620 6758.087068080800 +2483 0.2483 379.1172620033762541 6745.640748189600 +2484 0.2484 378.4433191169879365 6733.216979577099 +2485 0.2485 377.7706174820798424 6720.815718584699 +2486 0.2486 377.0991548500681461 6708.436921648899 +2487 0.2487 376.4289289767206128 6696.080545301300 +2488 0.2488 375.7599376221471061 6683.746546168299 +2489 0.2489 375.0921785507901518 6671.434880970801 +2490 0.2490 374.4256495314154449 6659.145506523901 +2491 0.2491 373.7603483371024140 6646.878379736800 +2492 0.2492 373.0962727452349554 6634.633457612501 +2493 0.2493 372.4334205374919406 6622.410697247698 +2494 0.2494 371.7717894998379506 6610.210055832398 +2495 0.2495 371.1113774225138400 6598.031490649499 +2496 0.2496 370.4521821000275850 6585.874959075200 +2497 0.2497 369.7942013311449045 6573.740418577898 +2498 0.2498 369.1374329188800516 6561.627826718799 +2499 0.2499 368.4818746704865475 6549.537141151202 +2500 0.2500 367.8275243974479736 6537.468319620000 +2501 0.2501 367.1743799154688190 6525.421319962601 +2502 0.2502 366.5224390444653295 6513.396100106902 +2503 0.2503 365.8716996085563551 6501.392618073100 +2504 0.2504 365.2221594360540848 6489.410831971900 +2505 0.2505 364.5738163594552361 6477.450700004600 +2506 0.2506 363.9266682154318460 6465.512180463700 +2507 0.2507 363.2807128448220624 6453.595231731701 +2508 0.2508 362.6359480926213905 6441.699812281200 +2509 0.2509 361.9923718079735977 6429.825880675102 +2510 0.2510 361.3499818441615616 6417.973395565701 +2511 0.2511 360.7087760585985166 6406.142315694698 +2512 0.2512 360.0687523128191287 6394.332599893301 +2513 0.2513 359.4299084724704016 6382.544207081699 +2514 0.2514 358.7922424073028651 6370.777096268699 +2515 0.2515 358.1557519911618215 6359.031226552099 +2516 0.2516 357.5204351019783644 6347.306557117501 +2517 0.2517 356.8862896217605112 6335.603047239401 +2518 0.2518 356.2533134365845626 6323.920656279599 +2519 0.2519 355.6215044365861786 6312.259343687900 +2520 0.2520 354.9908605159516810 6300.619069001499 +2521 0.2521 354.3613795729093567 6288.999791845199 +2522 0.2522 353.7330595097205901 6277.401471930300 +2523 0.2523 353.1058982326712794 6265.824069055701 +2524 0.2524 352.4798936520631969 6254.267543106298 +2525 0.2525 351.8550436822051779 6242.731854053602 +2526 0.2526 351.2313462414047081 6231.216961955601 +2527 0.2527 350.6087992519591126 6219.722826956102 +2528 0.2528 349.9874006401470865 6208.249409284599 +2529 0.2529 349.3671483362200547 6196.796669256300 +2530 0.2530 348.7480402743936452 6185.364567271901 +2531 0.2531 348.1300743928392194 6173.953063816800 +2532 0.2532 347.5132486336752891 6162.562119462002 +2533 0.2533 346.8975609429590463 6151.191694862800 +2534 0.2534 346.2830092706779510 6139.841750759200 +2535 0.2535 345.6695915707412041 6128.512247975401 +2536 0.2536 345.0573058009714487 6117.203147419899 +2537 0.2537 344.4461499230961863 6105.914410084803 +2538 0.2538 343.8361219027396487 6094.645997046398 +2539 0.2539 343.2272197094141006 6083.397869464099 +2540 0.2540 342.6194413165118817 6072.169988580701 +2541 0.2541 342.0127847012967663 6060.962315722099 +2542 0.2542 341.4072478448957781 6049.774812297201 +2543 0.2543 340.8028287322910614 6038.607439797401 +2544 0.2544 340.1995253523113547 6027.460159796701 +2545 0.2545 339.5973356976239756 6016.332933951400 +2546 0.2546 338.9962577647264084 6005.225723999700 +2547 0.2547 338.3962895539383453 5994.138491761902 +2548 0.2548 337.7974290693932744 5983.071199139998 +2549 0.2549 337.1996743190304073 5972.023808116999 +2550 0.2550 336.6030233145866646 5960.996280758000 +2551 0.2551 336.0074740715883195 5949.988579208399 +2552 0.2552 335.4130246093431538 5939.000665695001 +2553 0.2553 334.8196729509321585 5928.032502524899 +2554 0.2554 334.2274171232016329 5917.084052085900 +2555 0.2555 333.6362551567549986 5906.155276846299 +2556 0.2556 333.0461850859449555 5895.246139354002 +2557 0.2557 332.4572049488654102 5884.356602237200 +2558 0.2558 331.8693127873433468 5873.486628203600 +2559 0.2559 331.2825066469311537 5862.636180040399 +2560 0.2560 330.6967845768984375 5851.805220614402 +2561 0.2561 330.1121446302241793 5840.993712871199 +2562 0.2562 329.5285848635888328 5830.201619835301 +2563 0.2563 328.9461033373665373 5819.428904610300 +2564 0.2564 328.3646981156171023 5808.675530378099 +2565 0.2565 327.7843672660782772 5797.941460398701 +2566 0.2566 327.2051088601577931 5787.226658010901 +2567 0.2567 326.6269209729256886 5776.531086630901 +2568 0.2568 326.0498016831064660 5765.854709753101 +2569 0.2569 325.4737490730713603 5755.197490949000 +2570 0.2570 324.8987612288304945 5744.559393868098 +2571 0.2571 324.3248362400252631 5733.940382236698 +2572 0.2572 323.7519721999204876 5723.340419858301 +2573 0.2573 323.1801672053969128 5712.759470612998 +2574 0.2574 322.6094193569433628 5702.197498458099 +2575 0.2575 322.0397267586491239 5691.654467426799 +2576 0.2576 321.4710875181963274 5681.130341628801 +2577 0.2577 320.9034997468523898 5670.625085250002 +2578 0.2578 320.3369615594622815 5660.138662552299 +2579 0.2579 319.7714710744410240 5649.671037872798 +2580 0.2580 319.2070264137661297 5639.222175624898 +2581 0.2581 318.6436257029700414 5628.792040296699 +2582 0.2582 318.0812670711326291 5618.380596452000 +2583 0.2583 317.5199486508735731 5607.987808729200 +2584 0.2584 316.9596685783450312 5597.613641841899 +2585 0.2585 316.4004249932240214 5587.258060578002 +2586 0.2586 315.8422160387051463 5576.921029800000 +2587 0.2587 315.2850398614929190 5566.602514444799 +2588 0.2588 314.7288946117945443 5556.302479523198 +2589 0.2589 314.1737784433123579 5546.020890120102 +2590 0.2590 313.6196895132366649 5535.757711393999 +2591 0.2591 313.0666259822381221 5525.512908576900 +2592 0.2592 312.5145860144605194 5515.286446974602 +2593 0.2593 311.9635677775135036 5505.078291965601 +2594 0.2594 311.4135694424651319 5494.888409001698 +2595 0.2595 310.8645891838346529 5484.716763607701 +2596 0.2596 310.3166251795852304 5474.563321380800 +2597 0.2597 309.7696756111166678 5464.428047990699 +2598 0.2598 309.2237386632581320 5454.310909179700 +2599 0.2599 308.6788125242610477 5444.211870762101 +2600 0.2600 308.1348953857917081 5434.130898624200 +2601 0.2601 307.5919854429242832 5424.067958724199 +2602 0.2602 307.0500808941334867 5414.023017091700 +2603 0.2603 306.5091799412875275 5403.996039827998 +2604 0.2604 305.9692807896408340 5393.986993105702 +2605 0.2605 305.4303816478271187 5383.995843168501 +2606 0.2606 304.8924807278521598 5374.022556330801 +2607 0.2607 304.3555762450866951 5364.067098978399 +2608 0.2608 303.8196664182594304 5354.129437567000 +2609 0.2609 303.2847494694499346 5344.209538623101 +2610 0.2610 302.7508236240815904 5334.307368743499 +2611 0.2611 302.2178871109146598 5324.422894595100 +2612 0.2612 301.6859381620391787 5314.556082914798 +2613 0.2613 301.1549750128679648 5304.706900509000 +2614 0.2614 300.6249959021297968 5294.875314254001 +2615 0.2615 300.0959990718623089 5285.061291095401 +2616 0.2616 299.5679827674051126 5275.264798048100 +2617 0.2617 299.0409452373929184 5265.485802196299 +2618 0.2618 298.5148847337484881 5255.724270692599 +2619 0.2619 297.9897995116759262 5245.980170759100 +2620 0.2620 297.4656878296536888 5236.253469686002 +2621 0.2621 296.9425479494277624 5226.544134832002 +2622 0.2622 296.4203781360049561 5216.852133624601 +2623 0.2623 295.8991766576457962 5207.177433558601 +2624 0.2624 295.3789417858579895 5197.520002197502 +2625 0.2625 294.8596717953894881 5187.879807172099 +2626 0.2626 294.3413649642218388 5178.256816181098 +2627 0.2627 293.8240195735632483 5168.650996990802 +2628 0.2628 293.3076339078419892 5159.062317434400 +2629 0.2629 292.7922062546996358 5149.490745412500 +2630 0.2630 292.2777349049843565 5139.936248892900 +2631 0.2631 291.7642181527442062 5130.398795909799 +2632 0.2632 291.2516542952204759 5120.878354564402 +2633 0.2633 290.7400416328410415 5111.374893024402 +2634 0.2634 290.2293784692136569 5101.888379523702 +2635 0.2635 289.7196631111193597 5092.418782362500 +2636 0.2636 289.2108938685058774 5082.966069907301 +2637 0.2637 288.7030690544810341 5073.530210589801 +2638 0.2638 288.1961869853061557 5064.111172908299 +2639 0.2639 287.6902459803894203 5054.708925426001 +2640 0.2640 287.1852443622795477 5045.323436771800 +2641 0.2641 286.6811804566589785 5035.954675640000 +2642 0.2642 286.1780525923375080 5026.602610789700 +2643 0.2643 285.6758591012457487 5017.267211045200 +2644 0.2644 285.1745983184287070 5007.948445295602 +2645 0.2645 284.6742685820391898 4998.646282494299 +2646 0.2646 284.1748682333314946 4989.360691659802 +2647 0.2647 283.6763956166547587 4980.091641874498 +2648 0.2648 283.1788490794467634 4970.839102285101 +2649 0.2649 282.6822269722273973 4961.603042102299 +2650 0.2650 282.1865276485922323 4952.383430600998 +2651 0.2651 281.6917494652062146 4943.180237119299 +2652 0.2652 281.1978907817972981 4933.993431059300 +2653 0.2653 280.7049499611500210 4924.822981886498 +2654 0.2654 280.2129253690992527 4915.668859129401 +2655 0.2655 279.7218153745237714 4906.531032380000 +2656 0.2656 279.2316183493401240 4897.409471293200 +2657 0.2657 278.7423326684961467 4888.304145586599 +2658 0.2658 278.2539567099647684 4879.215025040599 +2659 0.2659 277.7664888547378155 4870.142079497899 +2660 0.2660 277.2799274868197017 4861.085278864299 +2661 0.2661 276.7942709932211187 4852.044593106901 +2662 0.2662 276.3095177639530107 4843.019992255600 +2663 0.2663 275.8256661920201509 4834.011446402101 +2664 0.2664 275.3427146734150597 4825.018925699702 +2665 0.2665 274.8606616071119220 4816.042400363602 +2666 0.2666 274.3795053950602210 4807.081840670400 +2667 0.2667 273.8992444421787695 4798.137216958201 +2668 0.2668 273.4198771563495711 4789.208499626100 +2669 0.2669 272.9414019484115101 4780.295659134601 +2670 0.2670 272.4638172321545539 4771.398666005001 +2671 0.2671 271.9871214243133295 4762.517490819298 +2672 0.2672 271.5113129445613254 4753.652104220300 +2673 0.2673 271.0363902155047526 4744.802476911298 +2674 0.2674 270.5623516626764058 4735.968579655701 +2675 0.2675 270.0891957145297511 4727.150383277800 +2676 0.2676 269.6169208024327872 4718.347858661402 +2677 0.2677 269.1455253606621909 4709.560976750301 +2678 0.2678 268.6750078263972341 4700.789708548400 +2679 0.2679 268.2053666397138727 4692.034025119101 +2680 0.2680 267.7366002435786640 4683.293897585299 +2681 0.2681 267.2687070838429122 4674.569297129501 +2682 0.2682 266.8016856092368130 4665.860194993000 +2683 0.2683 266.3355342713633149 4657.166562476699 +2684 0.2684 265.8702515246924918 4648.488370940300 +2685 0.2685 265.4058358265553466 4639.825591802399 +2686 0.2686 264.9422856371382409 4631.178196540101 +2687 0.2687 264.4795994194767559 4622.546156689199 +2688 0.2688 264.0177756394501216 4613.929443844001 +2689 0.2689 263.5568127657750779 4605.328029657001 +2690 0.2690 263.0967092700003036 4596.741885838701 +2691 0.2691 262.6374636265004483 4588.170984158201 +2692 0.2692 262.1790743124704477 4579.615296441702 +2693 0.2693 261.7215398079196689 4571.074794573800 +2694 0.2694 261.2648585956661691 4562.549450496301 +2695 0.2695 260.8090291613309546 4554.039236208500 +2696 0.2696 260.3540499933321257 4545.544123767599 +2697 0.2697 259.8999195828793631 4537.064085287100 +2698 0.2698 259.4466364239680729 4528.599092938301 +2699 0.2699 258.9941990133737022 4520.149118949399 +2700 0.2700 258.5426058506459981 4511.714135605000 +2701 0.2701 258.0918554381034369 4503.294115246599 +2702 0.2702 257.6419462808274830 4494.889030272301 +2703 0.2703 257.1928768866570181 4486.498853136600 +2704 0.2704 256.7446457661826571 4478.123556350500 +2705 0.2705 256.2972514327411204 4469.763112480599 +2706 0.2706 255.8506924024095781 4461.417494150101 +2707 0.2707 255.4049671940001929 4453.086674037801 +2708 0.2708 254.9600743290543789 4444.770624878200 +2709 0.2709 254.5160123318373735 4436.469319461801 +2710 0.2710 254.0727797293325807 4428.182730634200 +2711 0.2711 253.6303750512360295 4419.910831296700 +2712 0.2712 253.1887968299509168 4411.653594405700 +2713 0.2713 252.7480436005820081 4403.410992972500 +2714 0.2714 252.3081139009301808 4395.183000064100 +2715 0.2715 251.8690062714869100 4386.969588801499 +2716 0.2716 251.4307192554287838 4378.770732360999 +2717 0.2717 250.9932513986120455 4370.586403973501 +2718 0.2718 250.5566012495671657 4362.416576924001 +2719 0.2719 250.1207673594933567 4354.261224552301 +2720 0.2720 249.6857482822531153 4346.120320252299 +2721 0.2721 249.2515425743669084 4337.993837471999 +2722 0.2722 248.8181487950076587 4329.881749713100 +2723 0.2723 248.3855655059954302 4321.784030531700 +2724 0.2724 247.9537912717919710 4313.700653537200 +2725 0.2725 247.5228246594954555 4305.631592393100 +2726 0.2726 247.0926642388350274 4297.576820815601 +2727 0.2727 246.6633085821654845 4289.536312575101 +2728 0.2728 246.2347562644619927 4281.510041494701 +2729 0.2729 245.8070058633147141 4273.497981451101 +2730 0.2730 245.3800559589234922 4265.500106373300 +2731 0.2731 244.9539051340926221 4257.516390244000 +2732 0.2732 244.5285519742255360 4249.546807098000 +2733 0.2733 244.1039950673194880 4241.591331023101 +2734 0.2734 243.6802330039603817 4233.649936159300 +2735 0.2735 243.2572643773174548 4225.722596699499 +2736 0.2736 242.8350877831380501 4217.809286888400 +2737 0.2737 242.4137018197424709 4209.909981023000 +2738 0.2738 241.9931050880186945 4202.024653452301 +2739 0.2739 241.5732961914171995 4194.153278577500 +2740 0.2740 241.1542737359457647 4186.295830851201 +2741 0.2741 240.7360363301643247 4178.452284777801 +2742 0.2742 240.3185825851797688 4170.622614913500 +2743 0.2743 239.9019111146408250 4162.806795865399 +2744 0.2744 239.4860205347329156 4155.004802292598 +2745 0.2745 239.0709094641730417 4147.216608904700 +2746 0.2746 238.6565765242046666 4139.442190463000 +2747 0.2747 238.2430203385925438 4131.681521779501 +2748 0.2748 237.8302395336177142 4123.934577717000 +2749 0.2749 237.4182327380724189 4116.201333188999 +2750 0.2750 237.0069985832549833 4108.481763159900 +2751 0.2751 236.5965357029647862 4100.775842644300 +2752 0.2752 236.1868427334972012 4093.083546707399 +2753 0.2753 235.7779183136385939 4085.404850464500 +2754 0.2754 235.3697610846613202 4077.739729081199 +2755 0.2755 234.9623696903186101 4070.088157772900 +2756 0.2756 234.5557427768397076 4062.450111805299 +2757 0.2757 234.1498789929247550 4054.825566493699 +2758 0.2758 233.7447769897399041 4047.214497203100 +2759 0.2759 233.3404354209123426 4039.616879347999 +2760 0.2760 232.9368529425252916 4032.032688392799 +2761 0.2761 232.5340282131131175 4024.461899850599 +2762 0.2762 232.1319598936563864 4016.904489284199 +2763 0.2763 231.7306466475768900 4009.360432305601 +2764 0.2764 231.3300871407328430 4001.829704575501 +2765 0.2765 230.9302800414138801 3994.312281803601 +2766 0.2766 230.5312240203362535 3986.808139748699 +2767 0.2767 230.1329177506379153 3979.317254217900 +2768 0.2768 229.7353599078736579 3971.839601067099 +2769 0.2769 229.3385491700102818 3964.375156200600 +2770 0.2770 228.9424842174217076 3956.923895571001 +2771 0.2771 228.5471637328842007 3949.485795179300 +2772 0.2772 228.1525864015715115 3942.060831074599 +2773 0.2773 227.7587509110501003 3934.648979353900 +2774 0.2774 227.3656559512743058 3927.250216162100 +2775 0.2775 226.9733002145815703 3919.864517692400 +2776 0.2776 226.5816823956876931 3912.491860185000 +2777 0.2777 226.1908011916820556 3905.132219927998 +2778 0.2778 225.8006553020227898 3897.785573257301 +2779 0.2779 225.4112434285321456 3890.451896555600 +2780 0.2780 225.0225642753916873 3883.131166253299 +2781 0.2781 224.6346165491376325 3875.823358827700 +2782 0.2782 224.2473989586560776 3868.528450803400 +2783 0.2783 223.8609102151783077 3861.246418751802 +2784 0.2784 223.4751490322761640 3853.977239291200 +2785 0.2785 223.0901141258572693 3846.720889086600 +2786 0.2786 222.7058042141604517 3839.477344849600 +2787 0.2787 222.3222180177510552 3832.246583338399 +2788 0.2788 221.9393542595162501 3825.028581357699 +2789 0.2789 221.5572116646604570 3817.823315758200 +2790 0.2790 221.1757889607006859 3810.630763437201 +2791 0.2791 220.7950848774619317 3803.450901337899 +2792 0.2792 220.4150981470725696 3796.283706449502 +2793 0.2793 220.0358275039597231 3789.129155807301 +2794 0.2794 219.6572716848447726 3781.987226491899 +2795 0.2795 219.2794294287386663 3774.857895630301 +2796 0.2796 218.9022994769374293 3767.741140394499 +2797 0.2797 218.5258805730175879 3760.636938002301 +2798 0.2798 218.1501714628316222 3753.545265716801 +2799 0.2799 217.7751708945034750 3746.466100846201 +2800 0.2800 217.4008776184239480 3739.399420744301 +2801 0.2801 217.0272903872462393 3732.345202809600 +2802 0.2802 216.6544079558814815 3725.303424485699 +2803 0.2803 216.2822290814941368 3718.274063261200 +2804 0.2804 215.9107525234976208 3711.257096669100 +2805 0.2805 215.5399770435497828 3704.252502287700 +2806 0.2806 215.1699014055484440 3697.260257739199 +2807 0.2807 214.8005243756269351 3690.280340690701 +2808 0.2808 214.4318447221497195 3683.312728853602 +2809 0.2809 214.0638612157078740 3676.357399983399 +2810 0.2810 213.6965726291147121 3669.414331880100 +2811 0.2811 213.3299777374013502 3662.483502387400 +2812 0.2812 212.9640753178123305 3655.564889393199 +2813 0.2813 212.5988641498012157 3648.658470829299 +2814 0.2814 212.2343430150261838 3641.764224671100 +2815 0.2815 211.8705106973457362 3634.882128937799 +2816 0.2816 211.5073659828142354 3628.012161692301 +2817 0.2817 211.1449076596775853 3621.154301040700 +2818 0.2818 210.7831345183689109 3614.308525132701 +2819 0.2819 210.4220453515042095 3607.474812161199 +2820 0.2820 210.0616389538780311 3600.653140362401 +2821 0.2821 209.7019141224591294 3593.843488015500 +2822 0.2822 209.3428696563862275 3587.045833442600 +2823 0.2823 208.9845043569636402 3580.260155009100 +2824 0.2824 208.6268170276570402 3573.486431122701 +2825 0.2825 208.2698064740891937 3566.724640234001 +2826 0.2826 207.9134715040356696 3559.974760836400 +2827 0.2827 207.5578109274205474 3553.236771465799 +2828 0.2828 207.2028235563122394 3546.510650700100 +2829 0.2829 206.8485082049192272 3539.796377160101 +2830 0.2830 206.4948636895857987 3533.093929508399 +2831 0.2831 206.1418888287878701 3526.403286450099 +2832 0.2832 205.7895824431287508 3519.724426732100 +2833 0.2833 205.4379433553349941 3513.057329143199 +2834 0.2834 205.0869703902521053 3506.401972514401 +2835 0.2835 204.7366623748404777 3499.758335718001 +2836 0.2836 204.3870181381711575 3493.126397668400 +2837 0.2837 204.0380365114216659 3486.506137321399 +2838 0.2838 203.6897163278718779 3479.897533674301 +2839 0.2839 203.3420564228998728 3473.300565765701 +2840 0.2840 202.9950556339778132 3466.715212675699 +2841 0.2841 202.6487128006677381 3460.141453525601 +2842 0.2842 202.3030267646175844 3453.579267477500 +2843 0.2843 201.9579963695569518 3447.028633734901 +2844 0.2844 201.6136204612930953 3440.489531542100 +2845 0.2845 201.2698978877067759 3433.961940184199 +2846 0.2846 200.9268274987482243 3427.445838987100 +2847 0.2847 200.5844081464329918 3420.941207317501 +2848 0.2848 200.2426386848379991 3414.448024582400 +2849 0.2849 199.9015179700973874 3407.966270229599 +2850 0.2850 199.5610448603985674 3401.495923746899 +2851 0.2851 199.2212182159780696 3395.036964662799 +2852 0.2852 198.8820368991176224 3388.589372545901 +2853 0.2853 198.5434997741400878 3382.153127004800 +2854 0.2854 198.2056057074054536 3375.728207688100 +2855 0.2855 197.8683535673068263 3369.314594284700 +2856 0.2856 197.5317422242664520 3362.912266522999 +2857 0.2857 197.1957705507317371 3356.521204171200 +2858 0.2858 196.8604374211712980 3350.141387037500 +2859 0.2859 196.5257417120709533 3343.772794969400 +2860 0.2860 196.1916823019297738 3337.415407854000 +2861 0.2861 195.8582580712561878 3331.069205617701 +2862 0.2862 195.5254679025639746 3324.734168226600 +2863 0.2863 195.1933106803683700 3318.410275685601 +2864 0.2864 194.8617852911821444 3312.097508039000 +2865 0.2865 194.5308906235116808 3305.795845370101 +2866 0.2866 194.2006255678531090 3299.505267801400 +2867 0.2867 193.8709890166883554 3293.225755493901 +2868 0.2868 193.5419798644812772 3286.957288647800 +2869 0.2869 193.2135970076737976 3280.699847501899 +2870 0.2870 192.8858393446820401 3274.453412333402 +2871 0.2871 192.5587057758924345 3268.217963458499 +2872 0.2872 192.2321952036579376 3261.993481231601 +2873 0.2873 191.9063065322940815 3255.779946045501 +2874 0.2874 191.5810386680752515 3249.577338331299 +2875 0.2875 191.2563905192307629 3243.385638558500 +2876 0.2876 190.9323609959411101 3237.204827234500 +2877 0.2877 190.6089490103341291 3231.034884905001 +2878 0.2878 190.2861534764812177 3224.875792153300 +2879 0.2879 189.9639733103934987 3218.727529601001 +2880 0.2880 189.6424074300180678 3212.590077907400 +2881 0.2881 189.3214547552342424 3206.463417769099 +2882 0.2882 189.0011142078497244 3200.347529921100 +2883 0.2883 188.6813847115969054 3194.242395135099 +2884 0.2884 188.3622651921290867 3188.147994220999 +2885 0.2885 188.0437545770167560 3182.064308025700 +2886 0.2886 187.7258517957438073 3175.991317433500 +2887 0.2887 187.4085557797038462 3169.929003365800 +2888 0.2888 187.0918654621964947 3163.877346781499 +2889 0.2889 186.7757797784236118 3157.836328676101 +2890 0.2890 186.4602976654856832 3151.805930082401 +2891 0.2891 186.1454180623780701 3145.786132070099 +2892 0.2892 185.8311399099872858 3139.776915745400 +2893 0.2893 185.5174621510874431 3133.778262251601 +2894 0.2894 185.2043837303364455 3127.790152768501 +2895 0.2895 184.8919035942724065 3121.812568512400 +2896 0.2896 184.5800206913099828 3115.845490736299 +2897 0.2897 184.2687339717366797 3109.888900729600 +2898 0.2898 183.9580423877093267 3103.942779817700 +2899 0.2899 183.6479448932502976 3098.007109362599 +2900 0.2900 183.3384404442440427 3092.081870762500 +2901 0.2901 183.0295279984333376 3086.167045451401 +2902 0.2902 182.7212065154157870 3080.262614899599 +2903 0.2903 182.4134749566401581 3074.368560613200 +2904 0.2904 182.1063322854028002 3068.484864134200 +2905 0.2905 181.7997774668440627 3062.611507040501 +2906 0.2906 181.4938094679447715 3056.748470945398 +2907 0.2907 181.1884272575225907 3050.895737498100 +2908 0.2908 180.8836298062285266 3045.053288383300 +2909 0.2909 180.5794160865432900 3039.221105321300 +2910 0.2910 180.2757850727738571 3033.399170067300 +2911 0.2911 179.9727357410498598 3027.587464412500 +2912 0.2912 179.6702670693200901 3021.785970182800 +2913 0.2913 179.3683780373489753 3015.994669239499 +2914 0.2914 179.0670676267130546 3010.213543479000 +2915 0.2915 178.7663348207974821 3004.442574832699 +2916 0.2916 178.4661786047925034 2998.681745266900 +2917 0.2917 178.1665979656900163 2992.931036782600 +2918 0.2918 177.8675918922800747 2987.190431416000 +2919 0.2919 177.5691593751473931 2981.459911237600 +2920 0.2920 177.2712994066678789 2975.739458352800 +2921 0.2921 176.9740109810051649 2970.029054901299 +2922 0.2922 176.6772930941072275 2964.328683057700 +2923 0.2923 176.3811447437028050 2958.638325030499 +2924 0.2924 176.0855649292981582 2952.957963062699 +2925 0.2925 175.7905526521734316 2947.287579432001 +2926 0.2926 175.4961069153793574 2941.627156449500 +2927 0.2927 175.2022267237338156 2935.976676461200 +2928 0.2928 174.9089110838184240 2930.336121846400 +2929 0.2929 174.6161590039751559 2924.705475019100 +2930 0.2930 174.3239694943028724 2919.084718426599 +2931 0.2931 174.0323415666540257 2913.473834550199 +2932 0.2932 173.7412742346312768 2907.872805905001 +2933 0.2933 173.4507665135840284 2902.281615039801 +2934 0.2934 173.1608174206051842 2896.700244536900 +2935 0.2935 172.8714259745277104 2891.128677012301 +2936 0.2936 172.5825911959213386 2885.566895115100 +2937 0.2937 172.2943121070891834 2880.014881528001 +2938 0.2938 172.0065877320644177 2874.472618967100 +2939 0.2939 171.7194170966069748 2868.940090181601 +2940 0.2940 171.4327992282001958 2863.417277953900 +2941 0.2941 171.1467331560475316 2857.904165099400 +2942 0.2942 170.8612179110692182 2852.400734466601 +2943 0.2943 170.5762525258990365 2846.906968937199 +2944 0.2944 170.2918360348809301 2841.422851425199 +2945 0.2945 170.0079674740657651 2835.948364877901 +2946 0.2946 169.7246458812081187 2830.483492275000 +2947 0.2947 169.4418702957628966 2825.028216629300 +2948 0.2948 169.1596397588821503 2819.582520985801 +2949 0.2949 168.8779533134117514 2814.146388422001 +2950 0.2950 168.5968100038882369 2808.719802048201 +2951 0.2951 168.3162088765354838 2803.302745006800 +2952 0.2952 168.0361489792615259 2797.895200472500 +2953 0.2953 167.7566293616552855 2792.497151652500 +2954 0.2954 167.4776490749833613 2787.108581786000 +2955 0.2955 167.1992071721868456 2781.729474144300 +2956 0.2956 166.9213027078781124 2776.359812030600 +2957 0.2957 166.6439347383375491 2770.999578780400 +2958 0.2958 166.3671023215104867 2765.648757760899 +2959 0.2959 166.0908045170038747 2760.307332371100 +2960 0.2960 165.8150403860832398 2754.975286041799 +2961 0.2961 165.5398089916693607 2749.652602235699 +2962 0.2962 165.2651093983352268 2744.339264446699 +2963 0.2963 164.9909406723028837 2739.035256200401 +2964 0.2964 164.7173018814401360 2733.740561054388 +2965 0.2965 164.4441920952575629 2728.455162596971 +2966 0.2966 164.1716103849053070 2723.179044448028 +2967 0.2967 163.8995558231699476 2717.912190259070 +2968 0.2968 163.6280274844713745 2712.654583712381 +2969 0.2969 163.3570244448596611 2707.406208521630 +2970 0.2970 163.0865457820119957 2702.167048431491 +2971 0.2971 162.8165905752295259 2696.937087217719 +2972 0.2972 162.5471579054342897 2691.716308687010 +2973 0.2973 162.2782468551660884 2686.504696676880 +2974 0.2974 162.0098565085794462 2681.302235055760 +2975 0.2975 161.7419859514405118 2676.108907722770 +2976 0.2976 161.4746342711239890 2670.924698607680 +2977 0.2977 161.2078005566100671 2665.749591670979 +2978 0.2978 160.9414838984813230 2660.583570903820 +2979 0.2979 160.6756833889197651 2655.426620327440 +2980 0.2980 160.4103981217036790 2650.278723993999 +2981 0.2981 160.1456271922046994 2645.139865985610 +2982 0.2982 159.8813696973846561 2640.010030415069 +2983 0.2983 159.6176247357926457 2634.889201425111 +2984 0.2984 159.3543914075619625 2629.777363188559 +2985 0.2985 159.0916688144070861 2624.674499908870 +2986 0.2986 158.8294560596206964 2619.580595818879 +2987 0.2987 158.5677522480706614 2614.495635181751 +2988 0.2988 158.3065564861970529 2609.419602290560 +2989 0.2989 158.0458678820091052 2604.352481468259 +2990 0.2990 157.7856855450823161 2599.294257067349 +2991 0.2991 157.5260085865554345 2594.244913470349 +2992 0.2992 157.2668361191274471 2589.204435089221 +2993 0.2993 157.0081672570547084 2584.172806365650 +2994 0.2994 156.7500011161478994 2579.150011770771 +2995 0.2995 156.4923368137691000 2574.136035805101 +2996 0.2996 156.2351734688288900 2569.130862998840 +2997 0.2997 155.9785102017833651 2564.134477911390 +2998 0.2998 155.7223461346312376 2559.146865131199 +2999 0.2999 155.4666803909108523 2554.168009276380 +3000 0.3000 155.2115120956973442 2549.197894993911 +3001 0.3001 154.9568403755996542 2544.236506959851 +3002 0.3002 154.7026643587576871 2539.283829879440 +3003 0.3003 154.4489831748393840 2534.339848486719 +3004 0.3004 154.1957959550377950 2529.404547544831 +3005 0.3005 153.9431018320682654 2524.477911845679 +3006 0.3006 153.6908999401654796 2519.559926209951 +3007 0.3007 153.4391894150806195 2514.650575486990 +3008 0.3008 153.1879693940785216 2509.749844554819 +3009 0.3009 152.9372390159347788 2504.857718320280 +3010 0.3010 152.6869974209328404 2499.974181718530 +3011 0.3011 152.4372437508612563 2495.099219713280 +3012 0.3012 152.1879771490107487 2490.232817296659 +3013 0.3013 151.9391967601714555 2485.374959489089 +3014 0.3014 151.6909017306300314 2480.525631339411 +3015 0.3015 151.4430912081668339 2475.684817924821 +3016 0.3016 151.1957643420530815 2470.852504350240 +3017 0.3017 150.9489202830480963 2466.028675749269 +3018 0.3018 150.7025581833964623 2461.213317283209 +3019 0.3019 150.4566771968252397 2456.406414141480 +3020 0.3020 150.2112764785410945 2451.607951541420 +3021 0.3021 149.9663551852275987 2446.817914728370 +3022 0.3022 149.7219124750424157 2442.036288975291 +3023 0.3023 149.4779475076144877 2437.263059583220 +3024 0.3024 149.2344594440413061 2432.498211880420 +3025 0.3025 148.9914474468861272 2427.741731223330 +3026 0.3026 148.7489106801751859 2422.993602995610 +3027 0.3027 148.5068483093949681 2418.253812608731 +3028 0.3028 148.2652595014894530 2413.522345501389 +3029 0.3029 148.0241434248573853 2408.799187139921 +3030 0.3030 147.7834992493494894 2404.084323017720 +3031 0.3031 147.5433261462657981 2399.377738655920 +3032 0.3032 147.3036232883528669 2394.679419602549 +3033 0.3033 147.0643898498011026 2389.989351432891 +3034 0.3034 146.8256250062419781 2385.307519749571 +3035 0.3035 146.5873279347453888 2380.633910181959 +3036 0.3036 146.3494978138169529 2375.968508386670 +3037 0.3037 146.1121338233952542 2371.311300047260 +3038 0.3038 145.8752351448491993 2366.662270874040 +3039 0.3039 145.6388009609752885 2362.021406604459 +3040 0.3040 145.4028304559949447 2357.388693002400 +3041 0.3041 145.1673228155518984 2352.764115858781 +3042 0.3042 144.9322772267094024 2348.147660991061 +3043 0.3043 144.6976928779477021 2343.539314243151 +3044 0.3044 144.4635689591612504 2338.939061485931 +3045 0.3045 144.2299046616561213 2334.346888616519 +3046 0.3046 143.9966991781473666 2329.762781558509 +3047 0.3047 143.7639517027563443 2325.186726262020 +3048 0.3048 143.5316614310080752 2320.618708703210 +3049 0.3049 143.2998275598286568 2316.058714884970 +3050 0.3050 143.0684492875425917 2311.506730836049 +3051 0.3051 142.8375258138702009 2306.962742611591 +3052 0.3052 142.6070563399249806 2302.426736292759 +3053 0.3053 142.3770400682109880 2297.898697986850 +3054 0.3054 142.1474762026202825 2293.378613827110 +3055 0.3055 141.9183639484302830 2288.866469972860 +3056 0.3056 141.6897025123011815 2284.362252609099 +3057 0.3057 141.4614911022733850 2279.865947947021 +3058 0.3058 141.2337289277648722 2275.377542223239 +3059 0.3059 141.0064151995686927 2270.897021700430 +3060 0.3060 140.7795491298503237 2266.424372666819 +3061 0.3061 140.5531299321451684 2261.959581436140 +3062 0.3062 140.3271568213559704 2257.502634348009 +3063 0.3063 140.1016290137501983 2253.053517767330 +3064 0.3064 139.8765457269576018 2248.612218084520 +3065 0.3065 139.6519061799675967 2244.178721715631 +3066 0.3066 139.4277095931267354 2239.753015101711 +3067 0.3067 139.2039551881361774 2235.335084709410 +3068 0.3068 138.9806421880491882 2230.924917030579 +3069 0.3069 138.7577698172685530 2226.522498582150 +3070 0.3070 138.5353373015441321 2222.127815906550 +3071 0.3071 138.3133438679702749 2217.740855570861 +3072 0.3072 138.0917887449833472 2213.361604167561 +3073 0.3073 137.8706711623592582 2208.990048313979 +3074 0.3074 137.6499903512109313 2204.626174652431 +3075 0.3075 137.4297455439858027 2200.269969850109 +3076 0.3076 137.2099359744633489 2195.921420599079 +3077 0.3077 136.9905608777525856 2191.580513616240 +3078 0.3078 136.7716194902896234 2187.247235643161 +3079 0.3079 136.5531110498351666 2182.921573446170 +3080 0.3080 136.3350347954720405 2178.603513816130 +3081 0.3081 136.1173899676028043 2174.293043568550 +3082 0.3082 135.9001758079471927 2169.990149543470 +3083 0.3083 135.6833915595397571 2165.694818605420 +3084 0.3084 135.4670364667273077 2161.407037643521 +3085 0.3085 135.2511097751665829 2157.126793570980 +3086 0.3086 135.0356107318217482 2152.854073325519 +3087 0.3087 134.8205385849620086 2148.588863869150 +3088 0.3088 134.6058925841591360 2144.331152188090 +3089 0.3089 134.3916719802851105 2140.080925292679 +3090 0.3090 134.1778760255095904 2135.838170217479 +3091 0.3091 133.9645039732976670 2131.602874021150 +3092 0.3092 133.7515550784073071 2127.375023786220 +3093 0.3093 133.5390285968870216 2123.154606619451 +3094 0.3094 133.3269237860734791 2118.941609651230 +3095 0.3095 133.1152399045891173 2114.736020036280 +3096 0.3096 132.9039762123396713 2110.537824952600 +3097 0.3097 132.6931319705119279 2106.347011602369 +3098 0.3098 132.4827064415712528 2102.163567211359 +3099 0.3099 132.2726988892592317 2097.987479029141 +3100 0.3100 132.0631085785913399 2093.818734328761 +3101 0.3101 131.8539347758545546 2089.657320406941 +3102 0.3102 131.6451767486049960 2085.503224583981 +3103 0.3103 131.4368337656656252 2081.356434203590 +3104 0.3104 131.2289050971237998 2077.216936632960 +3105 0.3105 131.0213900143290005 2073.084719262790 +3106 0.3106 130.8142877898905283 2068.959769506831 +3107 0.3107 130.6075976976750610 2064.842074802400 +3108 0.3108 130.4013190128044357 2060.731622609970 +3109 0.3109 130.1954510116532902 2056.628400413179 +3110 0.3110 129.9899929718466751 2052.532395718970 +3111 0.3111 129.7849441722578661 2048.443596057261 +3112 0.3112 129.5803038930059472 2044.361988980920 +3113 0.3113 129.3760714154535947 2040.287562066169 +3114 0.3114 129.1722460222046891 2036.220302911850 +3115 0.3115 128.9688269971020986 2032.160199139829 +3116 0.3116 128.7658136252253485 2028.107238394930 +3117 0.3117 128.5632051928883470 2024.061408344880 +3118 0.3118 128.3610009876371123 2020.022696679800 +3119 0.3119 128.1592002982474696 2015.991091112881 +3120 0.3120 127.9578024147228348 2011.966579379890 +3121 0.3121 127.7568066282918835 2007.949149239270 +3122 0.3122 127.5562122314063203 2003.938788472011 +3123 0.3123 127.3560185177386330 1999.935484881611 +3124 0.3124 127.1562247821798479 1995.939226294209 +3125 0.3125 126.9568303208372271 1991.950000558150 +3126 0.3126 126.7578344310320944 1987.967795544369 +3127 0.3127 126.5592364112975758 1983.992599146111 +3128 0.3128 126.3610355613763261 1980.024399278940 +3129 0.3129 126.1632311822183397 1976.063183880751 +3130 0.3130 125.9658225759787342 1972.108940911481 +3131 0.3131 125.7688090460154910 1968.161658353391 +3132 0.3132 125.5721898968872807 1964.221324210859 +3133 0.3133 125.3759644343512178 1960.287926510331 +3134 0.3134 125.1801319653607010 1956.361453300140 +3135 0.3135 124.9846917980631531 1952.441892650850 +3136 0.3136 124.7896432417978616 1948.529232654899 +3137 0.3137 124.5949856070937898 1944.623461426570 +3138 0.3138 124.4007182056673599 1940.724567101970 +3139 0.3139 124.2068403504203076 1936.832537839189 +3140 0.3140 124.0133513554374503 1932.947361817980 +3141 0.3141 123.8202505359845702 1929.069027239759 +3142 0.3142 123.6275372085061974 1925.197522327649 +3143 0.3143 123.4352106906234923 1921.332835326579 +3144 0.3144 123.2432703011320285 1917.474954502830 +3145 0.3145 123.0517153599996618 1913.623868144388 +3146 0.3146 122.8605451883644122 1909.779564560660 +3147 0.3147 122.6697591085322472 1905.942032082570 +3148 0.3148 122.4793564439749929 1902.111259062391 +3149 0.3149 122.2893365193281880 1898.287233873771 +3150 0.3150 122.0996986603889098 1894.469944911891 +3151 0.3151 121.9104421941136707 1890.659380592930 +3152 0.3152 121.7215664486163007 1886.855529354450 +3153 0.3153 121.5330707531658163 1883.058379655171 +3154 0.3154 121.3449544381843026 1879.267919975020 +3155 0.3155 121.1572168352448102 1875.484138814902 +3156 0.3156 120.9698572770692238 1871.707024696960 +3157 0.3157 120.7828750975261585 1867.936566164350 +3158 0.3158 120.5962696316288856 1864.172751781140 +3159 0.3159 120.4100402155332148 1860.415570132202 +3160 0.3160 120.2241861865354196 1856.665009823630 +3161 0.3161 120.0387068830701338 1852.921059482089 +3162 0.3162 119.8536016447082631 1849.183707755259 +3163 0.3163 119.6688698121549237 1845.452943311409 +3164 0.3164 119.4845107272473683 1841.728754839609 +3165 0.3165 119.3005237329528967 1838.011131049749 +3166 0.3166 119.1169081733668094 1834.300060672042 +3167 0.3167 118.9336633937103187 1830.595532457730 +3168 0.3168 118.7507887403285167 1826.897535178321 +3169 0.3169 118.5682835606883145 1823.206057625750 +3170 0.3170 118.3861472033763960 1819.521088612761 +3171 0.3171 118.2043790180971428 1815.842616972299 +3172 0.3172 118.0229783556706309 1812.170631557821 +3173 0.3173 117.8419445680305842 1808.505121242979 +3174 0.3174 117.6612770082223420 1804.846074921881 +3175 0.3175 117.4809750304007991 1801.193481508850 +3176 0.3176 117.3010379898284299 1797.547329938510 +3177 0.3177 117.1214652428732279 1793.907609165481 +3178 0.3178 116.9422561470067166 1790.274308164719 +3179 0.3179 116.7634100608019168 1786.647415931198 +3180 0.3180 116.5849263439313575 1783.026921480059 +3181 0.3181 116.4068043571650435 1779.412813846311 +3182 0.3182 116.2290434623684803 1775.805082085039 +3183 0.3183 116.0516430225006701 1772.203715271269 +3184 0.3184 115.8746024016121083 1768.608702499921 +3185 0.3185 115.6979209648428224 1765.020032885781 +3186 0.3186 115.5215980784203680 1761.437695563440 +3187 0.3187 115.3456331096578396 1757.861679687239 +3188 0.3188 115.1700254269519093 1754.291974431480 +3189 0.3189 114.9947743997808516 1750.728568989711 +3190 0.3190 114.8198793987025823 1747.171452575731 +3191 0.3191 114.6453397953526689 1743.620614422420 +3192 0.3192 114.4711549624424123 1740.076043782579 +3193 0.3193 114.2973242737568569 1736.537729928390 +3194 0.3194 114.1238471041528442 1733.005662151751 +3195 0.3195 113.9507228295570798 1729.479829763650 +3196 0.3196 113.7779508269641440 1725.960222094940 +3197 0.3197 113.6055304744346159 1722.446828495569 +3198 0.3198 113.4334611510930984 1718.939638334870 +3199 0.3199 113.2617422371262847 1715.438641001470 +3200 0.3200 113.0903731137810411 1711.943825903480 +3201 0.3201 112.9193531633624588 1708.455182468060 +3202 0.3202 112.7486817692319789 1704.972700141461 +3203 0.3203 112.5783583158054455 1701.496368389320 +3204 0.3204 112.4083821885511725 1698.026176696219 +3205 0.3205 112.2387527739880682 1694.562114565879 +3206 0.3206 112.0694694596837167 1691.104171521070 +3207 0.3207 111.9005316342524878 1687.652337103611 +3208 0.3208 111.7319386873536047 1684.206600874131 +3209 0.3209 111.5636900096892816 1680.766952412290 +3210 0.3210 111.3957849930028345 1677.333381316710 +3211 0.3211 111.2282230300767623 1673.905877204630 +3212 0.3212 111.0610035147309134 1670.484429712309 +3213 0.3213 110.8941258418205678 1667.069028494660 +3214 0.3214 110.7275894072345608 1663.659663225450 +3215 0.3215 110.5613936078934358 1660.256323596990 +3216 0.3216 110.3955378417475686 1656.858999320370 +3217 0.3217 110.2300215077752910 1653.467680125221 +3218 0.3218 110.0648440059810440 1650.082355759780 +3219 0.3219 109.9000047373935018 1646.703015990930 +3220 0.3220 109.7355031040637670 1643.329650603861 +3221 0.3221 109.5713385090634517 1639.962249402530 +3222 0.3222 109.4075103564828737 1636.600802208899 +3223 0.3223 109.2440180514292365 1633.245298863789 +3224 0.3224 109.0808610000247398 1629.895729226178 +3225 0.3225 108.9180386094047748 1626.552083173210 +3226 0.3226 108.7555502877160762 1623.214350600660 +3227 0.3227 108.5933954441149325 1619.882521422200 +3228 0.3228 108.4315734887653235 1616.556585569930 +3229 0.3229 108.2700838328371162 1613.236532994129 +3230 0.3230 108.1089258885042454 1609.922353663280 +3231 0.3231 107.9480990689428950 1606.614037563639 +3232 0.3232 107.7876027883297212 1603.311574699879 +3233 0.3233 107.6274364618400057 1600.014955094561 +3234 0.3234 107.4675995056458646 1596.724168788360 +3235 0.3235 107.3080913369144582 1593.439205839652 +3236 0.3236 107.1489113738062287 1590.160056325061 +3237 0.3237 106.9900590354730383 1586.886710338871 +3238 0.3238 106.8315337420564362 1583.619157993289 +3239 0.3239 106.6733349146858529 1580.357389418399 +3240 0.3240 106.5154619754768390 1577.101394761950 +3241 0.3241 106.3579143475292597 1573.851164189589 +3242 0.3242 106.2006914549255470 1570.606687884581 +3243 0.3243 106.0437927227289236 1567.367956047910 +3244 0.3244 105.8872175769816266 1564.134958897990 +3245 0.3245 105.7309654447031591 1560.907686671251 +3246 0.3246 105.5750357538885282 1557.686129621370 +3247 0.3247 105.4194279335064692 1554.470278019680 +3248 0.3248 105.2641414134977396 1551.260122154968 +3249 0.3249 105.1091756247733144 1548.055652333520 +3250 0.3250 104.9545299992126814 1544.856858879060 +3251 0.3251 104.8002039696620926 1541.663732132680 +3252 0.3252 104.6461969699328165 1538.476262452868 +3253 0.3253 104.4925084347994044 1535.294440215430 +3254 0.3254 104.3391377999979568 1532.118255813441 +3255 0.3255 104.1860845022244177 1528.947699657281 +3256 0.3256 104.0333479791328273 1525.782762174500 +3257 0.3257 103.8809276693336017 1522.623433809891 +3258 0.3258 103.7288230123918424 1519.469705025369 +3259 0.3259 103.5770334488255742 1516.321566299970 +3260 0.3260 103.4255584201040818 1513.179008129840 +3261 0.3261 103.2743973686461771 1510.042021028190 +3262 0.3262 103.1235497378185073 1506.910595525220 +3263 0.3263 102.9730149719338357 1503.784722168130 +3264 0.3264 102.8227925162493790 1500.664391521070 +3265 0.3265 102.6728818169650737 1497.549594165090 +3266 0.3266 102.5232823212219131 1494.440320698199 +3267 0.3267 102.3739934771002424 1491.336561735179 +3268 0.3268 102.2250147336180959 1488.238307907670 +3269 0.3269 102.0763455407295055 1485.145549864081 +3270 0.3270 101.9279853493228245 1482.058278269589 +3271 0.3271 101.7799336112190360 1478.976483806100 +3272 0.3272 101.6321897791701190 1475.900157172140 +3273 0.3273 101.4847533068573568 1472.829289083011 +3274 0.3274 101.3376236488896893 1469.763870270481 +3275 0.3275 101.1908002608020070 1466.703891483061 +3276 0.3276 101.0442825990535738 1463.649343485709 +3277 0.3277 100.8980701210262936 1460.600217059951 +3278 0.3278 100.7521622850231040 1457.556503003791 +3279 0.3279 100.6065585502663282 1454.518192131662 +3280 0.3280 100.4612583768960263 1451.485275274490 +3281 0.3281 100.3162612259683186 1448.457743279549 +3282 0.3282 100.1715665594538223 1445.435587010450 +3283 0.3283 100.0271738402359460 1442.418797347169 +3284 0.3284 99.8830825321092846 1439.407365185989 +3285 0.3285 99.7392920997780124 1436.401281439401 +3286 0.3286 99.5958020088542355 1433.400537036170 +3287 0.3287 99.4526117258563573 1430.405122921260 +3288 0.3288 99.3097207182075010 1427.415030055759 +3289 0.3289 99.1671284542338611 1424.430249416961 +3290 0.3290 99.0248344031630978 1421.450771998201 +3291 0.3291 98.8828380351227452 1418.476588808919 +3292 0.3292 98.7411388211385770 1415.507690874560 +3293 0.3293 98.5997362331330152 1412.544069236619 +3294 0.3294 98.4586297439235523 1409.585714952531 +3295 0.3295 98.3178188272211457 1406.632619095721 +3296 0.3296 98.1773029576285836 1403.684772755500 +3297 0.3297 98.0370816106389498 1400.742167037060 +3298 0.3298 97.8971542626340323 1397.804793061419 +3299 0.3299 97.7575203908826893 1394.872641965470 +3300 0.3300 97.6181794735393282 1391.945704901869 +3301 0.3301 97.4791309896422860 1389.023973039019 +3302 0.3302 97.3403744191122797 1386.107437561080 +3303 0.3303 97.2019092427508298 1383.196089667860 +3304 0.3304 97.0637349422386961 1380.289920574870 +3305 0.3305 96.9258510001342870 1377.388921513240 +3306 0.3306 96.7882568998721382 1374.493083729731 +3307 0.3307 96.6509521257613216 1371.602398486660 +3308 0.3308 96.5139361629838959 1368.716857061851 +3309 0.3309 96.3772084975933723 1365.836450748699 +3310 0.3310 96.2407686165131366 1362.961170856021 +3311 0.3311 96.1046160075349292 1360.091008708149 +3312 0.3312 95.9687501593172811 1357.225955644820 +3313 0.3313 95.8331705613839802 1354.366003021089 +3314 0.3314 95.6978767041225495 1351.511142207481 +3315 0.3315 95.5628680787826852 1348.661364589781 +3316 0.3316 95.4281441774747350 1345.816661569081 +3317 0.3317 95.2937044931681925 1342.977024561800 +3318 0.3318 95.1595485196901336 1340.142444999500 +3319 0.3319 95.0256757517237105 1337.312914329030 +3320 0.3320 94.8920856848066450 1334.488424012400 +3321 0.3321 94.7587778153296796 1331.668965526770 +3322 0.3322 94.6257516405351140 1328.854530364410 +3323 0.3323 94.4930066585152559 1326.045110032699 +3324 0.3324 94.3605423682109148 1323.240696054079 +3325 0.3325 94.2283582694099096 1320.441279966020 +3326 0.3326 94.0964538627455624 1317.646853321001 +3327 0.3327 93.9648286496951926 1314.857407686450 +3328 0.3328 93.8334821325786379 1312.072934644740 +3329 0.3329 93.7024138145567349 1309.293425793229 +3330 0.3330 93.5716231996298689 1306.518872744090 +3331 0.3331 93.4411097926364391 1303.749267124369 +3332 0.3332 93.3108730992514239 1300.984600575961 +3333 0.3333 93.1809126259848455 1298.224864755541 +3334 0.3334 93.0512278801803348 1295.470051334559 +3335 0.3335 92.9218183700136393 1292.720151999220 +3336 0.3336 92.7926836044911596 1289.975158450439 +3337 0.3337 92.6638230934484426 1287.235062403779 +3338 0.3338 92.5352363475487749 1284.499855589551 +3339 0.3339 92.4069228782816623 1281.769529752570 +3340 0.3340 92.2788821979614227 1279.044076652351 +3341 0.3341 92.1511138197256656 1276.323488062930 +3342 0.3342 92.0236172575338713 1273.607755772880 +3343 0.3343 91.8963920261659553 1270.896871585351 +3344 0.3344 91.7694376412207902 1268.190827317911 +3345 0.3345 91.6427536191147709 1265.489614802589 +3346 0.3346 91.5163394770803507 1262.793225885909 +3347 0.3347 91.3901947331646198 1260.101652428711 +3348 0.3348 91.2643189062278708 1257.414886306270 +3349 0.3349 91.1387115159421484 1254.732919408169 +3350 0.3350 91.0133720827898287 1252.055743638331 +3351 0.3351 90.8883001280621556 1249.383350914991 +3352 0.3352 90.7634951738578764 1246.715733170589 +3353 0.3353 90.6389567430817493 1244.052882351831 +3354 0.3354 90.5146843594431800 1241.394790419629 +3355 0.3355 90.3906775474547430 1238.741449349091 +3356 0.3356 90.2669358324308178 1236.092851129440 +3357 0.3357 90.1434587404861389 1233.448987764060 +3358 0.3358 90.0202457985344182 1230.809851270390 +3359 0.3359 89.8972965342868946 1228.175433679980 +3360 0.3360 89.7746104762509702 1225.545727038410 +3361 0.3361 89.6521871537287893 1222.920723405249 +3362 0.3362 89.5300260968158170 1220.300414854099 +3363 0.3363 89.4081268363994894 1217.684793472489 +3364 0.3364 89.2864889041577641 1215.073851361890 +3365 0.3365 89.1651118325577841 1212.467580637689 +3366 0.3366 89.0439951548544428 1209.865973429160 +3367 0.3367 88.9231384050890199 1207.269021879400 +3368 0.3368 88.8025411180877882 1204.676718145331 +3369 0.3369 88.6822028294606355 1202.089054397720 +3370 0.3370 88.5621230755997004 1199.506022821080 +3371 0.3371 88.4423013936779654 1196.927615613650 +3372 0.3372 88.3227373216479066 1194.353824987410 +3373 0.3373 88.2034303982401298 1191.784643168060 +3374 0.3374 88.0843801629619776 1189.220062394909 +3375 0.3375 87.9655861560961796 1186.660074920940 +3376 0.3376 87.8470479186994879 1184.104673012761 +3377 0.3377 87.7287649926013273 1181.553848950530 +3378 0.3378 87.6107369204024025 1179.007595028000 +3379 0.3379 87.4929632454733763 1176.465903552449 +3380 0.3380 87.3754435119535202 1173.928766844660 +3381 0.3381 87.2581772647493352 1171.396177238909 +3382 0.3382 87.1411640495332449 1168.868127082910 +3383 0.3383 87.0244034127422026 1166.344608737811 +3384 0.3384 86.9078949015763982 1163.825614578210 +3385 0.3385 86.7916380639978939 1161.311136992011 +3386 0.3386 86.6756324487292602 1158.801168380531 +3387 0.3387 86.5598776052523107 1156.295701158399 +3388 0.3388 86.4443730838067097 1153.794727753520 +3389 0.3389 86.3291184353886791 1151.298240607111 +3390 0.3390 86.2141132117496483 1148.806232173619 +3391 0.3391 86.0993569653949322 1146.318694920719 +3392 0.3392 85.9848492495824388 1143.835621329289 +3393 0.3393 85.8705896183213042 1141.357003893400 +3394 0.3394 85.7565776263706283 1138.882835120240 +3395 0.3395 85.6428128292381103 1136.413107530150 +3396 0.3396 85.5292947831787700 1133.947813656519 +3397 0.3397 85.4160230451936542 1131.486946045900 +3398 0.3398 85.3029971730284728 1129.030497257801 +3399 0.3399 85.1902167251723483 1126.578459864830 +3400 0.3400 85.0776812608564796 1124.130826452521 +3401 0.3401 84.9653903400528776 1121.687589619420 +3402 0.3402 84.8533435234730575 1119.248741977030 +3403 0.3403 84.7415403725667176 1116.814276149779 +3404 0.3404 84.6299804495204739 1114.384184774970 +3405 0.3405 84.5186633172565820 1111.958460502799 +3406 0.3406 84.4075885394316288 1109.537095996300 +3407 0.3407 84.2967556804352540 1107.120083931330 +3408 0.3408 84.1861643053888571 1104.707416996570 +3409 0.3409 84.0758139801443605 1102.299087893449 +3410 0.3410 83.9657042712828741 1099.895089336151 +3411 0.3411 83.8558347461134872 1097.495414051610 +3412 0.3412 83.7462049726719329 1095.100054779420 +3413 0.3413 83.6368145197193655 1092.709004271929 +3414 0.3414 83.5276629567410680 1090.322255294040 +3415 0.3415 83.4187498539452008 1087.939800623371 +3416 0.3416 83.3100747822615233 1085.561633050081 +3417 0.3417 83.2016373133401714 1083.187745376950 +3418 0.3418 83.0934370195503647 1080.818130419321 +3419 0.3419 82.9854734739791411 1078.452781005029 +3420 0.3420 82.8777462504301639 1076.091689974460 +3421 0.3421 82.7702549234224136 1073.734850180450 +3422 0.3422 82.6629990681889808 1071.382254488341 +3423 0.3423 82.5559782606757722 1069.033895775869 +3424 0.3424 82.4491920775403173 1066.689766933209 +3425 0.3425 82.3426400961505038 1064.349860862920 +3426 0.3426 82.2363218945833552 1062.014170479920 +3427 0.3427 82.1302370516237801 1059.682688711490 +3428 0.3428 82.0243851467633505 1057.355408497209 +3429 0.3429 81.9187657601990367 1055.032322788950 +3430 0.3430 81.8133784728320421 1052.713424550891 +3431 0.3431 81.7082228662665244 1050.398706759409 +3432 0.3432 81.6032985228084016 1048.088162403150 +3433 0.3433 81.4986050254641015 1045.781784482971 +3434 0.3434 81.3941419579393539 1043.479566011840 +3435 0.3435 81.2899089046380112 1041.181500014970 +3436 0.3436 81.1859054506607833 1038.887579529620 +3437 0.3437 81.0821311818040442 1036.597797605230 +3438 0.3438 80.9785856845586238 1034.312147303280 +3439 0.3439 80.8752685461085861 1032.030621697339 +3440 0.3440 80.7721793543300635 1029.753213873030 +3441 0.3441 80.6693176977900208 1027.479916927939 +3442 0.3442 80.5666831657450331 1025.210723971681 +3443 0.3443 80.4642753481401485 1022.945628125870 +3444 0.3444 80.3620938356076522 1020.684622524020 +3445 0.3445 80.2601382194658726 1018.427700311620 +3446 0.3446 80.1584080917179875 1016.174854646010 +3447 0.3447 80.0569030450508592 1013.926078696431 +3448 0.3448 79.9556226728338402 1011.681365644030 +3449 0.3449 79.8545665691175515 1009.440708681711 +3450 0.3450 79.7537343286327598 1007.204101014249 +3451 0.3451 79.6531255467891413 1004.971535858171 +3452 0.3452 79.5527398196741444 1002.743006441829 +3453 0.3453 79.4525767440517825 1000.518506005270 +3454 0.3454 79.3526359173615106 998.298027800280 +3455 0.3455 79.2529169377169751 996.081565090350 +3456 0.3456 79.1534194039049197 993.869111150640 +3457 0.3457 79.0541429153839914 991.660659267990 +3458 0.3458 78.9550870722835469 989.456202740849 +3459 0.3459 78.8562514754025443 987.255734879330 +3460 0.3460 78.7576357262083206 985.059249005060 +3461 0.3461 78.6592394268354980 982.866738451290 +3462 0.3462 78.5610621800847895 980.678196562820 +3463 0.3463 78.4631035894218485 978.493616695940 +3464 0.3464 78.3653632589761315 976.312992218491 +3465 0.3465 78.2678407935397189 974.136316509740 +3466 0.3466 78.1705357985662062 971.963582960460 +3467 0.3467 78.0734478801695388 969.794784972871 +3468 0.3468 77.9765766451228615 967.629915960541 +3469 0.3469 77.8799217008574090 965.468969348520 +3470 0.3470 77.7834826554613272 963.311938573170 +3471 0.3471 77.6872591176785647 961.158817082220 +3472 0.3472 77.5912506969077214 959.009598334760 +3473 0.3473 77.4954570032009258 956.864275801169 +3474 0.3474 77.3998776472627128 954.722842963090 +3475 0.3475 77.3045122404488865 952.585293313459 +3476 0.3476 77.2093603947653833 950.451620356480 +3477 0.3477 77.1144217228671778 948.321817607550 +3478 0.3478 77.0196958380571317 946.195878593239 +3479 0.3479 76.9251823542848996 944.073796851371 +3480 0.3480 76.8308808861457919 941.955565930861 +3481 0.3481 76.7367910488796525 939.841179391850 +3482 0.3482 76.6429124583697785 937.730630805509 +3483 0.3483 76.5492447311417976 935.623913754160 +3484 0.3484 76.4557874843625314 933.521021831169 +3485 0.3485 76.3625403358389292 931.421948640989 +3486 0.3486 76.2695029040169317 929.326687799099 +3487 0.3487 76.1766748079803762 927.235232931991 +3488 0.3488 76.0840556674499169 925.147577677119 +3489 0.3489 75.9916451027819164 923.063715682980 +3490 0.3490 75.8994427349673231 920.983640608969 +3491 0.3491 75.8074481856306051 918.907346125411 +3492 0.3492 75.7156610770286562 916.834825913580 +3493 0.3493 75.6240810320497019 914.766073665610 +3494 0.3494 75.5327076742121903 912.701083084519 +3495 0.3495 75.4415406276637555 910.639847884179 +3496 0.3496 75.3505795171800798 908.582361789270 +3497 0.3497 75.2598239681638574 906.528618535301 +3498 0.3498 75.1692736066436709 904.478611868560 +3499 0.3499 75.0789280592729398 902.432335546110 +3500 0.3500 74.9887869533288409 900.389783335751 +3501 0.3501 74.8988499167112565 898.350949016040 +3502 0.3502 74.8091165779416514 896.315826376200 +3503 0.3503 74.7195865661620360 894.284409216190 +3504 0.3504 74.6302595111339002 892.256691346581 +3505 0.3505 74.5411350432371336 890.232666588650 +3506 0.3506 74.4522127934689877 888.212328774241 +3507 0.3507 74.3634923934429821 886.195671745870 +3508 0.3508 74.2749734753878528 884.182689356590 +3509 0.3509 74.1866556721465145 882.173375470040 +3510 0.3510 74.0985386171749951 880.167723960430 +3511 0.3511 74.0106219445413558 878.165728712450 +3512 0.3512 73.9229052889246674 876.167383621350 +3513 0.3513 73.8353882856139592 874.172682592830 +3514 0.3514 73.7480705705071671 872.181619543090 +3515 0.3515 73.6609517801100679 870.194188398760 +3516 0.3516 73.5740315515352847 868.210383096890 +3517 0.3517 73.4873095225011923 866.230197584980 +3518 0.3518 73.4007853313308942 864.253625820880 +3519 0.3519 73.3144586169512138 862.280661772850 +3520 0.3520 73.2283290188915998 860.311299419470 +3521 0.3521 73.1423961772831461 858.345532749670 +3522 0.3522 73.0566597328575256 856.383355762680 +3523 0.3523 72.9711193269459955 854.424762468040 +3524 0.3524 72.8857746014783174 852.469746885580 +3525 0.3525 72.8006251989817770 850.518303045340 +3526 0.3526 72.7156707625801317 848.570424987630 +3527 0.3527 72.6309109359926026 846.626106762980 +3528 0.3528 72.5463453635328506 844.685342432091 +3529 0.3529 72.4619736901079534 842.748126065881 +3530 0.3530 72.3777955612173827 840.814451745410 +3531 0.3531 72.2938106229520230 838.884313561880 +3532 0.3532 72.2100185219930921 836.957705616610 +3533 0.3533 72.1264189056112031 835.034622021030 +3534 0.3534 72.0430114216653124 833.115056896660 +3535 0.3535 71.9597957186017254 831.199004375080 +3536 0.3536 71.8767714454530733 829.286458597910 +3537 0.3537 71.7939382518373321 827.377413716830 +3538 0.3538 71.7112957879568143 825.471863893480 +3539 0.3539 71.6288437045971591 823.569803299540 +3540 0.3540 71.5465816531263528 821.671226116639 +3541 0.3541 71.4645092854937047 819.776126536360 +3542 0.3542 71.3826262542288816 817.884498760230 +3543 0.3543 71.3009322124408840 815.996336999689 +3544 0.3544 71.2194268138170941 814.111635476070 +3545 0.3545 71.1381097126222670 812.230388420610 +3546 0.3546 71.0569805636975218 810.352590074381 +3547 0.3547 70.9760390224593891 808.478234688300 +3548 0.3548 70.8952847448988166 806.607316523130 +3549 0.3549 70.8147173875801883 804.739829849430 +3550 0.3550 70.7343366076403441 802.875768947541 +3551 0.3551 70.6541420627875851 801.015128107580 +3552 0.3552 70.5741334113007355 799.157901629430 +3553 0.3553 70.4943103120281336 797.304083822691 +3554 0.3554 70.4146724243866657 795.453669006701 +3555 0.3555 70.3352194083608140 793.606651510449 +3556 0.3556 70.2559509245016613 791.763025672670 +3557 0.3557 70.1768666339259397 789.922785841701 +3558 0.3558 70.0979661983150777 788.085926375560 +3559 0.3559 70.0192492799142059 786.252441641920 +3560 0.3560 69.9407155415312189 784.422326017950 +3561 0.3561 69.8623646465357950 782.595573890540 +3562 0.3562 69.7841962588584579 780.772179656080 +3563 0.3563 69.7062100429896248 778.952137720550 +3564 0.3564 69.6284056639786257 777.135442499450 +3565 0.3565 69.5507827874327660 775.322088417780 +3566 0.3566 69.4733410795163735 773.512069910081 +3567 0.3567 69.3960802069498470 771.705381420360 +3568 0.3568 69.3189998370087181 769.902017402090 +3569 0.3569 69.2420996375226991 768.101972318210 +3570 0.3570 69.1653792768747309 766.305240641070 +3571 0.3571 69.0888384240000590 764.511816852440 +3572 0.3572 69.0124767483852679 762.721695443510 +3573 0.3573 68.9362939200673566 760.934870914820 +3574 0.3574 68.8602896096328010 759.151337776279 +3575 0.3575 68.7844634882166304 757.371090547151 +3576 0.3576 68.7088152275014750 755.594123756020 +3577 0.3577 68.6333444997166282 753.820431940791 +3578 0.3578 68.5580509776371514 752.050009648670 +3579 0.3579 68.4829343345829074 750.282851436110 +3580 0.3580 68.4079942444176652 748.518951868830 +3581 0.3581 68.3332303815481339 746.758305521830 +3582 0.3582 68.2586424209230813 745.000906979290 +3583 0.3583 68.1842300380323820 743.246750834610 +3584 0.3584 68.1099929089061362 741.495831690390 +3585 0.3585 68.0359307101136892 739.748144158410 +3586 0.3586 67.9620431187627929 738.003682859600 +3587 0.3587 67.8883298124986112 736.262442424010 +3588 0.3588 67.8147904695028672 734.524417490840 +3589 0.3589 67.7414247684929052 732.789602708380 +3590 0.3590 67.6682323887207815 731.057992734050 +3591 0.3591 67.5952130099723689 729.329582234280 +3592 0.3592 67.5223663125664189 727.604365884620 +3593 0.3593 67.4496919773537087 725.882338369590 +3594 0.3594 67.3771896857160897 724.163494382800 +3595 0.3595 67.3048591195656059 722.447828626840 +3596 0.3596 67.2326999613435987 720.735335813270 +3597 0.3597 67.1607118940197978 719.026010662659 +3598 0.3598 67.0888946010914395 717.319847904500 +3599 0.3599 67.0172477665823578 715.616842277270 +3600 0.3600 66.9457710750420745 713.916988528320 +3601 0.3601 66.8744642115449608 712.220281413940 +3602 0.3602 66.8033268616892997 710.526715699310 +3603 0.3603 66.7323587115964045 708.836286158470 +3604 0.3604 66.6615594479097666 707.148987574340 +3605 0.3605 66.5909287577941171 705.464814738650 +3606 0.3606 66.5204663289345888 703.783762451981 +3607 0.3607 66.4501718495358062 702.105825523740 +3608 0.3608 66.3800450083210194 700.430998772060 +3609 0.3609 66.3100854945312221 698.759277023940 +3610 0.3610 66.2402929979242714 697.090655115100 +3611 0.3611 66.1706672087740202 695.425127889970 +3612 0.3612 66.1012078178694367 693.762690201780 +3613 0.3613 66.0319145165137229 692.103336912420 +3614 0.3614 65.9627869965234765 690.447062892490 +3615 0.3615 65.8938249502277813 688.793863021290 +3616 0.3616 65.8250280704673827 687.143732186760 +3617 0.3617 65.7563960505937644 685.496665285510 +3618 0.3618 65.6879285844683523 683.852657222770 +3619 0.3619 65.6196253664615909 682.211702912390 +3620 0.3620 65.5514860914521336 680.573797276830 +3621 0.3621 65.4835104548259324 678.938935247140 +3622 0.3622 65.4156981524754286 677.307111762911 +3623 0.3623 65.3480488807986717 675.678321772330 +3624 0.3624 65.2805623366984520 674.052560232100 +3625 0.3625 65.2132382175814769 672.429822107460 +3626 0.3626 65.1460762213575038 670.810102372140 +3627 0.3627 65.0790760464384732 669.193396008350 +3628 0.3628 65.0122373917377132 667.579698006850 +3629 0.3629 64.9455599566690296 665.969003366760 +3630 0.3630 64.8790434411459103 664.361307095741 +3631 0.3631 64.8126875455806299 662.756604209810 +3632 0.3632 64.7464919708834685 661.154889733440 +3633 0.3633 64.6804564184618158 659.556158699500 +3634 0.3634 64.6145805902193757 657.960406149230 +3635 0.3635 64.5488641885552994 656.367627132240 +3636 0.3636 64.4833069163633610 654.777816706520 +3637 0.3637 64.4179084770311192 653.190969938350 +3638 0.3638 64.3526685744390790 651.607081902401 +3639 0.3639 64.2875869129598811 650.026147681590 +3640 0.3640 64.2226631974574502 648.448162367160 +3641 0.3641 64.1578971332861556 646.873121058639 +3642 0.3642 64.0932884262900302 645.301018863780 +3643 0.3643 64.0288367828019176 643.731850898600 +3644 0.3644 63.9645419096426124 642.165612287380 +3645 0.3645 63.9004035141201143 640.602298162590 +3646 0.3646 63.8364213040287396 639.041903664900 +3647 0.3647 63.7725949876483327 637.484423943190 +3648 0.3648 63.7089242737434489 635.929854154479 +3649 0.3649 63.6454088715625304 634.378189463960 +3650 0.3650 63.5820484908370815 632.829425045000 +3651 0.3651 63.5188428417808808 631.283556079060 +3652 0.3652 63.4557916350891418 629.740577755710 +3653 0.3653 63.3928945819377248 628.200485272650 +3654 0.3654 63.3301513939823124 626.663273835629 +3655 0.3655 63.2675617833576069 625.128938658489 +3656 0.3656 63.2051254626765271 623.597474963120 +3657 0.3657 63.1428421450293982 622.068877979460 +3658 0.3658 63.0807115439831492 620.543142945450 +3659 0.3659 63.0187333735805240 619.020265107080 +3660 0.3660 62.9569073483392572 617.500239718290 +3661 0.3661 62.8952331832512925 615.983062041030 +3662 0.3662 62.8337105937819800 614.468727345239 +3663 0.3663 62.7723392958692799 612.957230908750 +3664 0.3664 62.7111190059229742 611.448568017389 +3665 0.3665 62.6500494408238637 609.942733964870 +3666 0.3666 62.5891303179229794 608.439724052841 +3667 0.3667 62.5283613550407935 606.939533590830 +3668 0.3668 62.4677422704664380 605.442157896270 +3669 0.3669 62.4072727829569018 603.947592294410 +3670 0.3670 62.3469526117362633 602.455832118429 +3671 0.3671 62.2867814764948804 600.966872709259 +3672 0.3672 62.2267590973886300 599.480709415720 +3673 0.3673 62.1668851950381267 597.997337594400 +3674 0.3674 62.1071594905279198 596.516752609720 +3675 0.3675 62.0475817054057401 595.038949833880 +3676 0.3676 61.9881515616817040 593.563924646790 +3677 0.3677 61.9288687818275534 592.091672436180 +3678 0.3678 61.8697330887758739 590.622188597480 +3679 0.3679 61.8107442059193062 589.155468533880 +3680 0.3680 61.7519018571098002 587.691507656260 +3681 0.3681 61.6932057666578260 586.230301383181 +3682 0.3682 61.6346556593316208 584.771845140930 +3683 0.3683 61.5762512603564005 583.316134363410 +3684 0.3684 61.5179922954136202 581.863164492240 +3685 0.3685 61.4598784906401789 580.412930976630 +3686 0.3686 61.4019095726276731 578.965429273439 +3687 0.3687 61.3440852684216438 577.520654847151 +3688 0.3688 61.2864053055207947 576.078603169850 +3689 0.3689 61.2288694118762464 574.639269721160 +3690 0.3690 61.1714773158907690 573.202649988350 +3691 0.3691 61.1142287464180427 571.768739466180 +3692 0.3692 61.0571234327618839 570.337533657021 +3693 0.3693 61.0001611046754988 568.909028070740 +3694 0.3694 60.9433414923607231 567.483218224710 +3695 0.3695 60.8866643264672973 566.060099643840 +3696 0.3696 60.8301293380920782 564.639667860500 +3697 0.3697 60.7737362587783210 563.221918414580 +3698 0.3698 60.7174848205149260 561.806846853380 +3699 0.3699 60.6613747557356717 560.394448731720 +3700 0.3700 60.6054057973184968 558.984719611780 +3701 0.3701 60.5495776785847468 557.577655063220 +3702 0.3702 60.4938901332984287 556.173250663090 +3703 0.3703 60.4383428956654853 554.771501995840 +3704 0.3704 60.3829357003330287 553.372404653310 +3705 0.3705 60.3276682823886290 551.975954234700 +3706 0.3706 60.2725403773595687 550.582146346570 +3707 0.3707 60.2175517212120965 549.190976602839 +3708 0.3708 60.1627020503507168 547.802440624740 +3709 0.3709 60.1079911016174364 546.416534040841 +3710 0.3710 60.0534186122910469 545.033252486990 +3711 0.3711 59.9989843200863788 543.652591606340 +3712 0.3712 59.9446879631535978 542.274547049339 +3713 0.3713 59.8905292800774447 540.899114473670 +3714 0.3714 59.8365080098765461 539.526289544279 +3715 0.3715 59.7826238920026611 538.156067933390 +3716 0.3716 59.7288766663399713 536.788445320380 +3717 0.3717 59.6752660732043552 535.423417391889 +3718 0.3718 59.6217918533426712 534.060979841740 +3719 0.3719 59.5684537479320326 532.701128370980 +3720 0.3720 59.5152514985790972 531.343858687780 +3721 0.3721 59.4621848473193353 529.989166507490 +3722 0.3722 59.4092535366163332 528.637047552620 +3723 0.3723 59.3564573093610619 527.287497552820 +3724 0.3724 59.3037959088711801 525.940512244840 +3725 0.3725 59.2512690788903100 524.596087372550 +3726 0.3726 59.1988765635873335 523.254218686920 +3727 0.3727 59.1466181075556889 521.914901946000 +3728 0.3728 59.0944934558126391 520.578132914940 +3729 0.3729 59.0425023537985965 519.243907365900 +3730 0.3730 58.9906445473763910 517.912221078150 +3731 0.3731 58.9389197828305882 516.583069837910 +3732 0.3732 58.8873278068667645 515.256449438520 +3733 0.3733 58.8358683666108249 513.932355680240 +3734 0.3734 58.7845412096082924 512.610784370390 +3735 0.3735 58.7333460838236121 511.291731323240 +3736 0.3736 58.6822827376394471 509.975192360030 +3737 0.3737 58.6313509198559970 508.661163309000 +3738 0.3738 58.5805503796902798 507.349640005290 +3739 0.3739 58.5298808667754642 506.040618290989 +3740 0.3740 58.4793421311601591 504.734094015120 +3741 0.3741 58.4289339233077243 503.430063033600 +3742 0.3742 58.3786559940955811 502.128521209260 +3743 0.3743 58.3285080948145307 500.829464411780 +3744 0.3744 58.2784899771680571 499.532888517761 +3745 0.3745 58.2286013932716386 498.238789410620 +3746 0.3746 58.1788420956520724 496.947162980669 +3747 0.3747 58.1292118372467925 495.658005125000 +3748 0.3748 58.0797103714031664 494.371311747580 +3749 0.3749 58.0303374518778270 493.087078759149 +3750 0.3750 57.9810928328360049 491.805302077290 +3751 0.3751 57.9319762688508249 490.525977626310 +3752 0.3752 57.8829875149026449 489.249101337350 +3753 0.3753 57.8341263263783674 487.974669148270 +3754 0.3754 57.7853924590707706 486.702677003710 +3755 0.3755 57.7367856691778343 485.433120855039 +3756 0.3756 57.6883057133020642 484.165996660360 +3757 0.3757 57.6399523484498246 482.901300384480 +3758 0.3758 57.5917253320306557 481.639027998890 +3759 0.3759 57.5436244218566202 480.379175481820 +3760 0.3760 57.4956493761416212 479.121738818150 +3761 0.3761 57.4477999535007413 477.866713999430 +3762 0.3762 57.4000759129495748 476.614097023859 +3763 0.3763 57.3524770139035667 475.363883896270 +3764 0.3764 57.3050030161773449 474.116070628181 +3765 0.3765 57.2576536799840525 472.870653237650 +3766 0.3766 57.2104287659347008 471.627627749420 +3767 0.3767 57.1633280350374946 470.386990194759 +3768 0.3768 57.1163512486971783 469.148736611580 +3769 0.3769 57.0694981687143823 467.912863044330 +3770 0.3770 57.0227685572849623 466.679365544040 +3771 0.3771 56.9761621769993454 465.448240168270 +3772 0.3772 56.9296787908418764 464.219482981141 +3773 0.3773 56.8833181621901574 462.993090053260 +3774 0.3774 56.8370800548144075 461.769057461790 +3775 0.3775 56.7909642328767958 460.547381290399 +3776 0.3776 56.7449704609308156 459.328057629200 +3777 0.3777 56.6990985039206166 458.111082574840 +3778 0.3778 56.6533481271803581 456.896452230380 +3779 0.3779 56.6077190964335699 455.684162705400 +3780 0.3780 56.5622111777925056 454.474210115870 +3781 0.3781 56.5168241377575029 453.266590584220 +3782 0.3782 56.4715577432163300 452.061300239300 +3783 0.3783 56.4264117614435463 450.858335216360 +3784 0.3784 56.3813859600998768 449.657691657079 +3785 0.3785 56.3364801072315515 448.459365709480 +3786 0.3786 56.2916939712696802 447.263353528000 +3787 0.3787 56.2470273210296057 446.069651273420 +3788 0.3788 56.2024799257102927 444.878255112910 +3789 0.3789 56.1580515548936532 443.689161219921 +3790 0.3790 56.1137419785439420 442.502365774310 +3791 0.3791 56.0695509670071175 441.317864962180 +3792 0.3792 56.0254782910102094 440.135654975999 +3793 0.3793 55.9815237216606860 438.955732014510 +3794 0.3794 55.9376870304458222 437.778092282751 +3795 0.3795 55.8939679892320811 436.602731992040 +3796 0.3796 55.8503663702644815 435.429647359930 +3797 0.3797 55.8068819461659729 434.258834610280 +3798 0.3798 55.7635144899368029 433.090289973130 +3799 0.3799 55.7202637749539065 431.924009684800 +3800 0.3800 55.6771295749702730 430.759989987810 +3801 0.3801 55.6341116641143358 429.598227130910 +3802 0.3802 55.5912098168893394 428.438717369010 +3803 0.3803 55.5484238081727284 427.281456963250 +3804 0.3804 55.5057534132155226 426.126442180910 +3805 0.3805 55.4631984076417055 424.973669295469 +3806 0.3806 55.4207585674476064 423.823134586540 +3807 0.3807 55.3784336690012822 422.674834339879 +3808 0.3808 55.3362234890419202 421.528764847380 +3809 0.3809 55.2941278046791993 420.384922407070 +3810 0.3810 55.2521463933926924 419.243303323080 +3811 0.3811 55.2102790330312558 418.103903905650 +3812 0.3812 55.1685255018124181 416.966720471060 +3813 0.3813 55.1268855783217759 415.831749341750 +3814 0.3814 55.0853590415123762 414.698986846181 +3815 0.3815 55.0439456707041259 413.568429318851 +3816 0.3816 55.0026452455831674 412.440073100380 +3817 0.3817 54.9614575462012809 411.313914537351 +3818 0.3818 54.9203823529752952 410.189949982400 +3819 0.3819 54.8794194466864624 409.068175794190 +3820 0.3820 54.8385686084798820 407.948588337360 +3821 0.3821 54.7978296198638830 406.831183982590 +3822 0.3822 54.7572022627094270 405.715959106470 +3823 0.3823 54.7166863192495185 404.602910091650 +3824 0.3824 54.6762815720786008 403.492033326670 +3825 0.3825 54.6359878041519664 402.383325206070 +3826 0.3826 54.5958047987851458 401.276782130300 +3827 0.3827 54.5557323396533391 400.172400505770 +3828 0.3828 54.5157702107908122 399.070176744770 +3829 0.3829 54.4759181965902997 397.970107265550 +3830 0.3830 54.4361760818024081 396.872188492221 +3831 0.3831 54.3965436515350547 395.776416854800 +3832 0.3832 54.3570206912528562 394.682788789180 +3833 0.3833 54.3176069867765392 393.591300737130 +3834 0.3834 54.2783023242823717 392.501949146261 +3835 0.3835 54.2391064903015589 391.414730470050 +3836 0.3836 54.2000192717196683 390.329641167780 +3837 0.3837 54.1610404557760461 389.246677704620 +3838 0.3838 54.1221698300632426 388.165836551510 +3839 0.3839 54.0834071825264076 387.087114185190 +3840 0.3840 54.0447523014627365 386.010507088240 +3841 0.3841 54.0062049755208733 384.936011748990 +3842 0.3842 53.9677649937003423 383.863624661581 +3843 0.3843 53.9294321453509724 382.793342325860 +3844 0.3844 53.8912062201723074 381.725161247489 +3845 0.3845 53.8530870082130377 380.659077937850 +3846 0.3846 53.8150742998704388 379.595088914090 +3847 0.3847 53.7771678858897815 378.533190699030 +3848 0.3848 53.7393675573637708 377.473379821249 +3849 0.3849 53.7016731057319561 376.415652815040 +3850 0.3850 53.6640843227801838 375.360006220340 +3851 0.3851 53.6266010006400293 374.306436582820 +3852 0.3852 53.5892229317881998 373.254940453800 +3853 0.3853 53.5519499090459945 372.205514390301 +3854 0.3854 53.5147817255787288 371.158154954950 +3855 0.3855 53.4777181748951804 370.112858716060 +3856 0.3856 53.4407590508469994 369.069622247560 +3857 0.3857 53.4039041476281682 368.028442129030 +3858 0.3858 53.3671532597744331 366.989314945640 +3859 0.3859 53.3305061821627433 365.952237288160 +3860 0.3860 53.2939627100106819 364.917205753010 +3861 0.3861 53.2575226388759262 363.884216942140 +3862 0.3862 53.2211857646556652 362.853267463081 +3863 0.3863 53.1849518835860593 361.824353928990 +3864 0.3864 53.1488207922416862 360.797472958510 +3865 0.3865 53.1127922875349654 359.772621175870 +3866 0.3866 53.0768661667156323 358.749795210850 +3867 0.3867 53.0410422273701556 357.728991698729 +3868 0.3868 53.0053202674212045 356.710207280300 +3869 0.3869 52.9697000851270943 355.693438601920 +3870 0.3870 52.9341814790812322 354.678682315380 +3871 0.3871 52.8987642482115632 353.665935077990 +3872 0.3872 52.8634481917800372 352.655193552550 +3873 0.3873 52.8282331093820403 351.646454407331 +3874 0.3874 52.7931188009458694 350.639714316040 +3875 0.3875 52.7581050667321705 349.634969957890 +3876 0.3876 52.7231917073334060 348.632218017440 +3877 0.3877 52.6883785236732933 347.631455184780 +3878 0.3878 52.6536653170062863 346.632678155400 +3879 0.3879 52.6190518889170065 345.635883630151 +3880 0.3880 52.5845380413197319 344.641068315360 +3881 0.3881 52.5501235764578283 343.648228922721 +3882 0.3882 52.5158082969032307 342.657362169281 +3883 0.3883 52.4815920055558891 341.668464777520 +3884 0.3884 52.4474745056432496 340.681533475240 +3885 0.3885 52.4134556007197077 339.696564995630 +3886 0.3886 52.3795350946660676 338.713556077219 +3887 0.3887 52.3457127916890101 337.732503463870 +3888 0.3888 52.3119884963205806 336.753403904790 +3889 0.3889 52.2783620134176132 335.776254154490 +3890 0.3890 52.2448331481612485 334.801050972780 +3891 0.3891 52.2114017060563711 333.827791124821 +3892 0.3892 52.1780674929310777 332.856471381010 +3893 0.3893 52.1448303149361720 331.887088517090 +3894 0.3894 52.1116899785446179 330.919639314010 +3895 0.3895 52.0786462905510135 329.954120558020 +3896 0.3896 52.0456990580710794 328.990529040650 +3897 0.3897 52.0128480885411193 328.028861558620 +3898 0.3898 51.9800931897174934 327.069114913960 +3899 0.3899 51.9474341696761002 326.111285913840 +3900 0.3900 51.9148708368118719 325.155371370730 +3901 0.3901 51.8824029998382201 324.201368102280 +3902 0.3902 51.8500304677865387 323.249272931320 +3903 0.3903 51.8177530500056776 322.299082685910 +3904 0.3904 51.7855705561614172 321.350794199260 +3905 0.3905 51.7534827962359643 320.404404309790 +3906 0.3906 51.7214895805274253 319.459909861060 +3907 0.3907 51.6895907196492814 318.517307701800 +3908 0.3908 51.6577860245298979 317.576594685870 +3909 0.3909 51.6260753064119911 316.637767672290 +3910 0.3910 51.5944583768521170 315.700823525180 +3911 0.3911 51.5629350477201669 314.765759113840 +3912 0.3912 51.5315051311988412 313.832571312611 +3913 0.3913 51.5001684397831596 312.901257000990 +3914 0.3914 51.4689247862799348 311.971813063529 +3915 0.3915 51.4377739838072614 311.044236389890 +3916 0.3916 51.4067158457940252 310.118523874840 +3917 0.3917 51.3757501859793777 309.194672418141 +3918 0.3918 51.3448768184122386 308.272678924661 +3919 0.3919 51.3140955574507913 307.352540304330 +3920 0.3920 51.2834062177619714 306.434253472080 +3921 0.3921 51.2528086143209691 305.517815347910 +3922 0.3922 51.2223025624107322 304.603222856840 +3923 0.3923 51.1918878776214470 303.690472928860 +3924 0.3924 51.1615643758500482 302.779562499050 +3925 0.3925 51.1313318732997288 301.870488507400 +3926 0.3926 51.1011901864794069 300.963247898970 +3927 0.3927 51.0711391322032711 300.057837623730 +3928 0.3928 51.0411785275902474 299.154254636680 +3929 0.3929 51.0113081900635237 298.252495897740 +3930 0.3930 50.9815279373500445 297.352558371810 +3931 0.3931 50.9518375874800142 296.454439028730 +3932 0.3932 50.9222369587864137 295.558134843280 +3933 0.3933 50.8927258699044884 294.663642795171 +3934 0.3934 50.8633041397712802 293.770959869020 +3935 0.3935 50.8339715876251077 292.880083054391 +3936 0.3936 50.8047280330051052 291.991009345710 +3937 0.3937 50.7755732957507036 291.103735742310 +3938 0.3938 50.7465071960011684 290.218259248450 +3939 0.3939 50.7175295541950817 289.334576873221 +3940 0.3940 50.6886401910698936 288.452685630590 +3941 0.3941 50.6598389276613901 287.572582539410 +3942 0.3942 50.6311255853032520 286.694264623370 +3943 0.3943 50.6024999856265296 285.817728911020 +3944 0.3944 50.5739619505591946 284.942972435710 +3945 0.3945 50.5455113023256288 284.069992235660 +3946 0.3946 50.5171478634461479 283.198785353900 +3947 0.3947 50.4888714567365398 282.329348838250 +3948 0.3948 50.4606819053075597 281.461679741370 +3949 0.3949 50.4325790325644547 280.595775120660 +3950 0.3950 50.4045626622065015 279.731632038370 +3951 0.3951 50.3766326182265090 278.869247561500 +3952 0.3952 50.3487887249103423 278.008618761801 +3953 0.3953 50.3210308068364611 277.149742715810 +3954 0.3954 50.2933586888754292 276.292616504830 +3955 0.3955 50.2657721961894453 275.437237214880 +3956 0.3956 50.2382711542318603 274.583601936750 +3957 0.3957 50.2108553887467295 273.731707765920 +3958 0.3958 50.1835247257683008 272.881551802609 +3959 0.3959 50.1562789916205816 272.033131151760 +3960 0.3960 50.1291180129168410 271.186442923030 +3961 0.3961 50.1020416165591556 270.341484230729 +3962 0.3962 50.0750496297379257 269.498252193910 +3963 0.3963 50.0481418799314142 268.656743936260 +3964 0.3964 50.0213181949052910 267.816956586150 +3965 0.3965 49.9945784027121505 266.978887276670 +3966 0.3966 49.9679223316910424 266.142533145480 +3967 0.3967 49.9413498104670239 265.307891334950 +3968 0.3968 49.9148606679506699 264.474958992070 +3969 0.3969 49.8884547333376460 263.643733268470 +3970 0.3970 49.8621318361082047 262.814211320399 +3971 0.3971 49.8358918060267513 261.986390308720 +3972 0.3972 49.8097344731413685 261.160267398910 +3973 0.3973 49.7836596677833683 260.335839761050 +3974 0.3974 49.7576672205668231 259.513104569810 +3975 0.3975 49.7317569623881113 258.692059004450 +3976 0.3976 49.7059287244254477 257.872700248810 +3977 0.3977 49.6801823381384438 257.055025491281 +3978 0.3978 49.6545176352676378 256.239031924840 +3979 0.3979 49.6289344478340482 255.424716747009 +3980 0.3980 49.6034326081387036 254.612077159861 +3981 0.3981 49.5780119487622102 253.801110369970 +3982 0.3982 49.5526723025642895 252.991813588510 +3983 0.3983 49.5274135026833093 252.184184031110 +3984 0.3984 49.5022353825358579 251.378218917979 +3985 0.3985 49.4771377758162672 250.573915473779 +3986 0.3986 49.4521205164961941 249.771270927680 +3987 0.3987 49.4271834388241444 248.970282513370 +3988 0.3988 49.4023263773250250 248.170947469020 +3989 0.3989 49.3775491667997102 247.373263037250 +3990 0.3990 49.3528516423245875 246.577226465160 +3991 0.3991 49.3282336392511098 245.782835004330 +3992 0.3992 49.3036949932053545 244.990085910770 +3993 0.3993 49.2792355400875692 244.198976444940 +3994 0.3994 49.2548551160717309 243.409503871761 +3995 0.3995 49.2305535576051128 242.621665460550 +3996 0.3996 49.2063307014078291 241.835458485099 +3997 0.3997 49.1821863844723950 241.050880223550 +3998 0.3998 49.1581204440632931 240.267927958500 +3999 0.3999 49.1341327177165255 239.486598976920 +4000 0.4000 49.1102230432391664 238.706890570200 +4001 0.4001 49.0863912587089501 237.928800034100 +4002 0.4002 49.0626372024738089 237.152324668769 +4003 0.4003 49.0389607131514325 236.377461778699 +4004 0.4004 49.0153616296288561 235.604208672780 +4005 0.4005 48.9918397910620058 234.832562664250 +4006 0.4006 48.9683950368752576 234.062521070670 +4007 0.4007 48.9450272067610257 233.294081213970 +4008 0.4008 48.9217361406793074 232.527240420411 +4009 0.4009 48.8985216788572572 231.761996020560 +4010 0.4010 48.8753836617887600 230.998345349321 +4011 0.4011 48.8523219302339982 230.236285745920 +4012 0.4012 48.8293363252190105 229.475814553861 +4013 0.4013 48.8064266880352733 228.716929120940 +4014 0.4014 48.7835928602392599 227.959626799300 +4015 0.4015 48.7608346836520283 227.203904945270 +4016 0.4016 48.7381520003587880 226.449760919540 +4017 0.4017 48.7155446527084592 225.697192087060 +4018 0.4018 48.6930124833132609 224.946195816970 +4019 0.4019 48.6705553350482774 224.196769482740 +4020 0.4020 48.6481730510510388 223.448910462020 +4021 0.4021 48.6258654747210954 222.702616136780 +4022 0.4022 48.6036324497195977 221.957883893150 +4023 0.4023 48.5814738199688634 221.214711121510 +4024 0.4024 48.5593894296519650 220.473095216460 +4025 0.4025 48.5373791232123040 219.733033576819 +4026 0.4026 48.5154427453531838 218.994523605580 +4027 0.4027 48.4935801410374054 218.257562709950 +4028 0.4028 48.4717911554868408 217.522148301330 +4029 0.4029 48.4500756341820136 216.788277795280 +4030 0.4030 48.4284334228616729 216.055948611560 +4031 0.4031 48.4068643675223882 215.325158174090 +4032 0.4032 48.3853683144181375 214.595903910929 +4033 0.4033 48.3639451100598734 213.868183254310 +4034 0.4034 48.3425946012151257 213.141993640620 +4035 0.4035 48.3213166349075749 212.417332510360 +4036 0.4036 48.3001110584166469 211.694197308170 +4037 0.4037 48.2789777192770941 210.972585482850 +4038 0.4038 48.2579164652785906 210.252494487260 +4039 0.4039 48.2369271444653052 209.533921778399 +4040 0.4040 48.2160096051355183 208.816864817381 +4041 0.4041 48.1951636958411811 208.101321069390 +4042 0.4042 48.1743892653875250 207.387288003731 +4043 0.4043 48.1536861628326491 206.674763093761 +4044 0.4044 48.1330542374871158 205.963743816940 +4045 0.4045 48.1124933389135307 205.254227654780 +4046 0.4046 48.0920033169261458 204.546212092860 +4047 0.4047 48.0715840215904606 203.839694620809 +4048 0.4048 48.0512353032228035 203.134672732320 +4049 0.4049 48.0309570123899334 202.431143925110 +4050 0.4050 48.0107489999086283 201.729105700950 +4051 0.4051 47.9906111168453009 201.028555565590 +4052 0.4052 47.9705432145155797 200.329491028891 +4053 0.4053 47.9505451444839039 199.631909604650 +4054 0.4054 47.9306167585631400 198.935808810690 +4055 0.4055 47.9107579088141620 198.241186168850 +4056 0.4056 47.8909684475454682 197.548039204959 +4057 0.4057 47.8712482273127833 196.856365448810 +4058 0.4058 47.8515971009186316 196.166162434230 +4059 0.4059 47.8320149214119752 195.477427698940 +4060 0.4060 47.8125015420877943 194.790158784710 +4061 0.4061 47.7930568164866969 194.104353237220 +4062 0.4062 47.7736805983945274 193.420008606109 +4063 0.4063 47.7543727418419763 192.737122444970 +4064 0.4064 47.7351331011041609 192.055692311350 +4065 0.4065 47.7159615307002554 191.375715766710 +4066 0.4066 47.6968578853931007 190.697190376450 +4067 0.4067 47.6778220201887848 190.020113709860 +4068 0.4068 47.6588537903362806 189.344483340210 +4069 0.4069 47.6399530513270406 188.670296844590 +4070 0.4070 47.6211196588946066 187.997551804070 +4071 0.4071 47.6023534690142256 187.326245803540 +4072 0.4072 47.5836543379024590 186.656376431861 +4073 0.4073 47.5650221220167779 185.987941281700 +4074 0.4074 47.5464566780552076 185.320937949640 +4075 0.4075 47.5279578629559225 184.655364036110 +4076 0.4076 47.5095255338968485 183.991217145430 +4077 0.4077 47.4911595482952933 183.328494885740 +4078 0.4078 47.4728597638075556 182.667194869030 +4079 0.4079 47.4546260383285485 182.007314711161 +4080 0.4080 47.4364582299914019 181.348852031810 +4081 0.4081 47.4183561971670855 180.691804454490 +4082 0.4082 47.4003197984640323 180.036169606510 +4083 0.4083 47.3823488927277552 179.381945119030 +4084 0.4084 47.3644433390404558 178.729128627000 +4085 0.4085 47.3466029967206481 178.077717769190 +4086 0.4086 47.3288277253227818 177.427710188140 +4087 0.4087 47.3111173846368658 176.779103530180 +4088 0.4088 47.2934718346880842 176.131895445469 +4089 0.4089 47.2758909357364132 175.486083587900 +4090 0.4090 47.2583745482762581 174.841665615140 +4091 0.4091 47.2409225330360698 174.198639188640 +4092 0.4092 47.2235347509779615 173.557001973590 +4093 0.4093 47.2062110632973315 172.916751638961 +4094 0.4094 47.1889513314225155 172.277885857410 +4095 0.4095 47.1717554170143742 171.640402305410 +4096 0.4096 47.1546231819659454 171.004298663120 +4097 0.4097 47.1375544884020670 170.369572614411 +4098 0.4098 47.1205491986790008 169.736221846920 +4099 0.4099 47.1036071753840559 169.104244051990 +4100 0.4100 47.0867282813352261 168.473636924630 +4101 0.4101 47.0699123795808134 167.844398163600 +4102 0.4102 47.0531593333990656 167.216525471320 +4103 0.4103 47.0364690062978070 166.590016553920 +4104 0.4104 47.0198412620140473 165.964869121221 +4105 0.4105 47.0032759645136551 165.341080886689 +4106 0.4106 46.9867729779909453 164.718649567490 +4107 0.4107 46.9703321668683458 164.097572884440 +4108 0.4108 46.9539533957960202 163.477848562000 +4109 0.4109 46.9376365296515061 162.859474328339 +4110 0.4110 46.9213814335393309 162.242447915201 +4111 0.4111 46.9051879727906709 161.626767058000 +4112 0.4112 46.8890560129629819 161.012429495810 +4113 0.4113 46.8729854198396296 160.399432971300 +4114 0.4114 46.8569760594295275 159.787775230760 +4115 0.4115 46.8410277979667811 159.177454024120 +4116 0.4116 46.8251405019103331 158.568467104890 +4117 0.4117 46.8093140379435795 157.960812230201 +4118 0.4118 46.7935482729740286 157.354487160790 +4119 0.4119 46.7778430741329387 156.749489660970 +4120 0.4120 46.7621983087749555 156.145817498650 +4121 0.4121 46.7466138444777570 155.543468445290 +4122 0.4122 46.7310895490416911 154.942440275980 +4123 0.4123 46.7156252904894274 154.342730769310 +4124 0.4124 46.7002209370655876 153.744337707480 +4125 0.4125 46.6848763572364049 153.147258876230 +4126 0.4126 46.6695914196893540 152.551492064860 +4127 0.4127 46.6543659933328030 151.957035066181 +4128 0.4128 46.6391999472956655 151.363885676569 +4129 0.4129 46.6240931509270382 150.772041695950 +4130 0.4130 46.6090454737958524 150.181500927720 +4131 0.4131 46.5940567856905261 149.592261178840 +4132 0.4132 46.5791269566185946 149.004320259781 +4133 0.4133 46.5642558568063833 148.417675984510 +4134 0.4134 46.5494433566986316 147.832326170500 +4135 0.4135 46.5346893269581727 147.248268638719 +4136 0.4136 46.5199936384655572 146.665501213620 +4137 0.4137 46.5053561623187193 146.084021723160 +4138 0.4138 46.4907767698326211 145.503827998749 +4139 0.4139 46.4762553325389192 144.924917875291 +4140 0.4140 46.4617917221855947 144.347289191171 +4141 0.4141 46.4473858107366269 143.770939788180 +4142 0.4142 46.4330374703716373 143.195867511599 +4143 0.4143 46.4187465734855493 142.622070210190 +4144 0.4144 46.4045129926882325 142.049545736110 +4145 0.4145 46.3903366008041758 141.478291944970 +4146 0.4146 46.3762172708721323 140.908306695840 +4147 0.4147 46.3621548761447855 140.339587851160 +4148 0.4148 46.3481492900883865 139.772133276851 +4149 0.4149 46.3342003863824345 139.205940842209 +4150 0.4150 46.3203080389193289 138.641008419951 +4151 0.4151 46.3064721218040205 138.077333886200 +4152 0.4152 46.2926925093536852 137.514915120500 +4153 0.4153 46.2789690760973755 136.953750005760 +4154 0.4154 46.2653016967756727 136.393836428280 +4155 0.4155 46.2516902463403738 135.835172277740 +4156 0.4156 46.2381345999541296 135.277755447190 +4157 0.4157 46.2246346329901172 134.721583833070 +4158 0.4158 46.2111902210317069 134.166655335180 +4159 0.4159 46.1978012398721134 133.612967856670 +4160 0.4160 46.1844675655140762 133.060519304050 +4161 0.4161 46.1711890741695115 132.509307587190 +4162 0.4162 46.1579656422591924 131.959330619250 +4163 0.4163 46.1447971464123938 131.410586316790 +4164 0.4164 46.1316834634665724 130.863072599690 +4165 0.4165 46.1186244704670329 130.316787391100 +4166 0.4166 46.1056200446666011 129.771728617559 +4167 0.4167 46.0926700635252757 129.227894208881 +4168 0.4168 46.0797744047099229 128.685282098219 +4169 0.4169 46.0669329460939139 128.143890221981 +4170 0.4170 46.0541455657568193 127.603716519930 +4171 0.4171 46.0414121419840683 127.064758935069 +4172 0.4172 46.0287325532666287 126.527015413741 +4173 0.4173 46.0161066783006660 125.990483905530 +4174 0.4174 46.0035343959872236 125.455162363310 +4175 0.4175 45.9910155854318958 124.921048743210 +4176 0.4176 45.9785501259445013 124.388141004670 +4177 0.4177 45.9661378970387489 123.856437110340 +4178 0.4178 45.9537787784319249 123.325935026140 +4179 0.4179 45.9414726500445525 122.796632721250 +4180 0.4180 45.9292193920000855 122.268528168070 +4181 0.4181 45.9170188846245679 121.741619342290 +4182 0.4182 45.9048710084463139 121.215904222759 +4183 0.4183 45.8927756441955950 120.691380791601 +4184 0.4184 45.8807326728043066 120.168047034170 +4185 0.4185 45.8687419754056478 119.645900938999 +4186 0.4186 45.8568034333338019 119.124940497860 +4187 0.4187 45.8449169281236237 118.605163705721 +4188 0.4188 45.8330823415102984 118.086568560760 +4189 0.4189 45.8212995554290430 117.569153064320 +4190 0.4190 45.8095684520147799 117.052915221000 +4191 0.4191 45.7978889136018026 116.537853038500 +4192 0.4192 45.7862608227234915 116.023964527770 +4193 0.4193 45.7746840621119588 115.511247702890 +4194 0.4194 45.7631585146977571 114.999700581130 +4195 0.4195 45.7516840636095523 114.489321182910 +4196 0.4196 45.7402605921738186 113.980107531829 +4197 0.4197 45.7288879839144968 113.472057654621 +4198 0.4198 45.7175661225527108 112.965169581160 +4199 0.4199 45.7062948920064258 112.459441344510 +4200 0.4200 45.6950741763901576 111.954870980800 +4201 0.4201 45.6839038600146523 111.451456529360 +4202 0.4202 45.6727838273865530 110.949196032620 +4203 0.4203 45.6617139632081148 110.448087536111 +4204 0.4204 45.6506941523768859 109.948129088501 +4205 0.4205 45.6397242799853800 109.449318741580 +4206 0.4206 45.6288042313207924 108.951654550230 +4207 0.4207 45.6179338918646593 108.455134572439 +4208 0.4208 45.6071131472925728 107.959756869290 +4209 0.4209 45.5963418834738619 107.465519504950 +4210 0.4210 45.5856199864712792 106.972420546700 +4211 0.4211 45.5749473425407032 106.480458064850 +4212 0.4212 45.5643238381308180 105.989630132840 +4213 0.4213 45.5537493598828220 105.499934827149 +4214 0.4214 45.5432237946300944 105.011370227340 +4215 0.4215 45.5327470293979246 104.523934416010 +4216 0.4216 45.5223189514031787 104.037625478850 +4217 0.4217 45.5119394480540080 103.552441504570 +4218 0.4218 45.5016084069495292 103.068380584940 +4219 0.4219 45.4913257158795403 102.585440814770 +4220 0.4220 45.4810912628242079 102.103620291879 +4221 0.4221 45.4709049359537545 101.622917117160 +4222 0.4222 45.4607666236281673 101.143329394520 +4223 0.4223 45.4506762143968999 100.664855230860 +4224 0.4224 45.4406335969985520 100.187492736110 +4225 0.4225 45.4306386603605858 99.711240023230 +4226 0.4226 45.4206912935990204 99.236095208150 +4227 0.4227 45.4107913860181185 98.762056409850 +4228 0.4228 45.4009388271101173 98.289121750240 +4229 0.4229 45.3911335065548940 97.817289354280 +4230 0.4230 45.3813753142196816 97.346557349900 +4231 0.4231 45.3716641401587850 96.876923867971 +4232 0.4232 45.3619998746132680 96.408387042400 +4233 0.4233 45.3523824080106479 95.940945010039 +4234 0.4234 45.3428116309646114 95.474595910669 +4235 0.4235 45.3332874342747232 95.009337887110 +4236 0.4236 45.3238097089261132 94.545169085070 +4237 0.4237 45.3143783460891996 94.082087653240 +4238 0.4238 45.3049932371193762 93.620091743251 +4239 0.4239 45.2956542735567282 93.159179509660 +4240 0.4240 45.2863613471257480 92.699349110010 +4241 0.4241 45.2771143497350081 92.240598704720 +4242 0.4242 45.2679131734769129 91.782926457170 +4243 0.4243 45.2587577106273713 91.326330533640 +4244 0.4244 45.2496478536455200 90.870809103340 +4245 0.4245 45.2405834951734320 90.416360338410 +4246 0.4246 45.2315645280358183 89.962982413859 +4247 0.4247 45.2225908452397434 89.510673507630 +4248 0.4248 45.2136623399743343 89.059431800550 +4249 0.4249 45.2047789056104889 88.609255476360 +4250 0.4250 45.1959404357005923 88.160142721640 +4251 0.4251 45.1871468239782175 87.712091725900 +4252 0.4252 45.1783979643578490 87.265100681539 +4253 0.4253 45.1696937509345844 86.819167783799 +4254 0.4254 45.1610340779838566 86.374291230791 +4255 0.4255 45.1524188399611432 85.930469223510 +4256 0.4256 45.1438479315016750 85.487699965800 +4257 0.4257 45.1353212474201655 85.045981664371 +4258 0.4258 45.1268386827105061 84.605312528770 +4259 0.4259 45.1184001325454958 84.165690771410 +4260 0.4260 45.1100054922765494 83.727114607510 +4261 0.4261 45.1016546574334143 83.289582255170 +4262 0.4262 45.0933475237238923 82.853091935300 +4263 0.4263 45.0850839870335491 82.417641871630 +4264 0.4264 45.0768639434254297 81.983230290731 +4265 0.4265 45.0686872891397954 81.549855421990 +4266 0.4266 45.0605539205938186 81.117515497580 +4267 0.4267 45.0524637343813126 80.686208752530 +4268 0.4268 45.0444166272724544 80.255933424630 +4269 0.4269 45.0364124962135008 79.826687754510 +4270 0.4270 45.0284512383264968 79.398469985550 +4271 0.4271 45.0205327509090196 78.971278363960 +4272 0.4272 45.0126569314338880 78.545111138730 +4273 0.4273 45.0048236775488704 78.119966561610 +4274 0.4274 44.9970328870764362 77.695842887140 +4275 0.4275 44.9892844580134508 77.272738372640 +4276 0.4276 44.9815782885309119 76.850651278191 +4277 0.4277 44.9739142769736731 76.429579866630 +4278 0.4278 44.9662923218601662 76.009522403570 +4279 0.4279 44.9587123218821176 75.590477157361 +4280 0.4280 44.9511741759042920 75.172442399100 +4281 0.4281 44.9436777829642011 74.755416402671 +4282 0.4282 44.9362230422718341 74.339397444650 +4283 0.4283 44.9288098532093798 73.924383804369 +4284 0.4284 44.9214381153309645 73.510373763890 +4285 0.4285 44.9141077283623673 73.097365608000 +4286 0.4286 44.9068185922007572 72.685357624230 +4287 0.4287 44.8995706069144092 72.274348102780 +4288 0.4288 44.8923636727424409 71.864335336640 +4289 0.4289 44.8851976900945360 71.455317621420 +4290 0.4290 44.8780725595506880 71.047293255519 +4291 0.4291 44.8709881818609162 70.640260539960 +4292 0.4292 44.8639444579449886 70.234217778530 +4293 0.4293 44.8569412888921804 69.829163277680 +4294 0.4294 44.8499785759609679 69.425095346541 +4295 0.4295 44.8430562205787950 69.022012296920 +4296 0.4296 44.8361741243417811 68.619912443320 +4297 0.4297 44.8293321890144654 68.218794102950 +4298 0.4298 44.8225303165295372 67.818655595610 +4299 0.4299 44.8157684089875659 67.419495243830 +4300 0.4300 44.8090463686567375 67.021311372800 +4301 0.4301 44.8023640979725855 66.624102310300 +4302 0.4302 44.7957214995377271 66.227866386860 +4303 0.4303 44.7891184761216081 65.832601935580 +4304 0.4304 44.7825549306602184 65.438307292240 +4305 0.4305 44.7760307662558432 65.044980795260 +4306 0.4306 44.7695458861767932 64.652620785680 +4307 0.4307 44.7631001938571487 64.261225607180 +4308 0.4308 44.7566935928964895 63.870793606070 +4309 0.4309 44.7503259870596253 63.481323131270 +4310 0.4310 44.7439972802763464 63.092812534340 +4311 0.4311 44.7377073766411542 62.705260169440 +4312 0.4312 44.7314561804130122 62.318664393330 +4313 0.4313 44.7252435960150763 61.933023565390 +4314 0.4314 44.7190695280344244 61.548336047600 +4315 0.4315 44.7129338812218151 61.164600204540 +4316 0.4316 44.7068365604914177 60.781814403360 +4317 0.4317 44.7007774709205563 60.399977013830 +4318 0.4318 44.6947565177494539 60.019086408280 +4319 0.4319 44.6887736063809555 59.639140961641 +4320 0.4320 44.6828286423803007 59.260139051390 +4321 0.4321 44.6769215314748536 58.882079057610 +4322 0.4322 44.6710521795538256 58.504959362930 +4323 0.4323 44.6652204926680483 58.128778352550 +4324 0.4324 44.6594263770297104 57.753534414210 +4325 0.4325 44.6536697390120878 57.379225938250 +4326 0.4326 44.6479504851493019 57.005851317510 +4327 0.4327 44.6422685221360567 56.633408947410 +4328 0.4328 44.6366237568273903 56.261897225900 +4329 0.4329 44.6310160962384188 55.891314553470 +4330 0.4330 44.6254454475440880 55.521659333140 +4331 0.4331 44.6199117180789102 55.152929970460 +4332 0.4332 44.6144148153367084 54.785124873530 +4333 0.4333 44.6089546469703819 54.418242452930 +4334 0.4334 44.6035311207916436 54.052281121790 +4335 0.4335 44.5981441447707638 53.687239295740 +4336 0.4336 44.5927936270363290 53.323115392930 +4337 0.4337 44.5874794758749857 52.959907833991 +4338 0.4338 44.5822015997311851 52.597615042090 +4339 0.4339 44.5769599072069411 52.236235442860 +4340 0.4340 44.5717543070615747 51.875767464450 +4341 0.4341 44.5665847082114794 51.516209537500 +4342 0.4342 44.5614510197298515 51.157560095100 +4343 0.4343 44.5563531508464550 50.799817572860 +4344 0.4344 44.5512910109473665 50.442980408860 +4345 0.4345 44.5462645095747405 50.087047043640 +4346 0.4346 44.5412735564265461 49.732015920211 +4347 0.4347 44.5363180613563330 49.377885484050 +4348 0.4348 44.5313979343729756 49.024654183100 +4349 0.4349 44.5265130856404312 48.672320467760 +4350 0.4350 44.5216634254774988 48.320882790880 +4351 0.4351 44.5168488643575628 47.970339607790 +4352 0.4352 44.5120693129083662 47.620689376180 +4353 0.4353 44.5073246819117401 47.271930556280 +4354 0.4354 44.5026148823033907 46.924061610700 +4355 0.4355 44.4979398251726295 46.577081004490 +4356 0.4356 44.4932994217621456 46.230987205160 +4357 0.4357 44.4886935834677573 45.885778682590 +4358 0.4358 44.4841222218381702 45.541453909131 +4359 0.4359 44.4795852485747361 45.198011359540 +4360 0.4360 44.4750825755312107 44.855449510960 +4361 0.4361 44.4706141147135128 44.513766842990 +4362 0.4362 44.4661797782794821 44.172961837590 +4363 0.4363 44.4617794785386451 43.833032979150 +4364 0.4364 44.4574131279519662 43.493978754440 +4365 0.4365 44.4530806391316133 43.155797652649 +4366 0.4366 44.4487819248407163 42.818488165340 +4367 0.4367 44.4445168979931253 42.482048786450 +4368 0.4368 44.4402854716531905 42.146478012310 +4369 0.4369 44.4360875590354922 41.811774341641 +4370 0.4370 44.4319230735046347 41.477936275541 +4371 0.4371 44.4277919285749832 41.144962317439 +4372 0.4372 44.4236940379104510 40.812850973181 +4373 0.4373 44.4196293153242436 40.481600750941 +4374 0.4374 44.4155976747786312 40.151210161270 +4375 0.4375 44.4115990303847141 39.821677717070 +4376 0.4376 44.4076332964021816 39.493001933600 +4377 0.4377 44.4037003872390770 39.165181328440 +4378 0.4378 44.3998002174515776 38.838214421570 +4379 0.4379 44.3959327017437388 38.512099735250 +4380 0.4380 44.3920977549672671 38.186835794120 +4381 0.4381 44.3882952921213061 37.862421125121 +4382 0.4382 44.3845252283521745 37.538854257560 +4383 0.4383 44.3807874789531454 37.216133723020 +4384 0.4384 44.3770819593642187 36.894258055450 +4385 0.4385 44.3734085851718945 36.573225791100 +4386 0.4386 44.3697672721089162 36.253035468520 +4387 0.4387 44.3661579360540586 35.933685628601 +4388 0.4388 44.3625804930319063 35.615174814499 +4389 0.4389 44.3590348592125920 35.297501571720 +4390 0.4390 44.3555209509116040 34.980664448050 +4391 0.4391 44.3520386845895231 34.664661993540 +4392 0.4392 44.3485879768518174 34.349492760600 +4393 0.4393 44.3451687444485927 34.035155303850 +4394 0.4394 44.3417809042743869 33.721648180240 +4395 0.4395 44.3384243733679284 33.408969949000 +4396 0.4396 44.3350990689118944 33.097119171621 +4397 0.4397 44.3318049082327192 32.786094411900 +4398 0.4398 44.3285418088003311 32.475894235849 +4399 0.4399 44.3253096882279465 32.166517211780 +4400 0.4400 44.3221084642718424 31.857961910300 +4401 0.4401 44.3189380548311149 31.550226904190 +4402 0.4402 44.3157983779474804 31.243310768560 +4403 0.4403 44.3126893518050124 30.937212080729 +4404 0.4404 44.3096108947299641 30.631929420299 +4405 0.4405 44.3065629251904980 30.327461369090 +4406 0.4406 44.3035453617964876 30.023806511170 +4407 0.4407 44.3005581232992895 29.720963432840 +4408 0.4408 44.2976011285915163 29.418930722631 +4409 0.4409 44.2946742967068161 29.117706971330 +4410 0.4410 44.2917775468196524 28.817290771920 +4411 0.4411 44.2889107982450767 28.517680719610 +4412 0.4412 44.2860739704385011 28.218875411860 +4413 0.4413 44.2832669829954924 27.920873448290 +4414 0.4414 44.2804897556515371 27.623673430779 +4415 0.4415 44.2777422082818291 27.327273963399 +4416 0.4416 44.2750242609010414 27.031673652400 +4417 0.4417 44.2723358336631065 26.736871106290 +4418 0.4418 44.2696768468610031 26.442864935730 +4419 0.4419 44.2670472209265355 26.149653753590 +4420 0.4420 44.2644468764301067 25.857236174930 +4421 0.4421 44.2618757340805118 25.565610816980 +4422 0.4422 44.2593337147247041 25.274776299180 +4423 0.4423 44.2568207393475888 24.984731243150 +4424 0.4424 44.2543367290717953 24.695474272659 +4425 0.4425 44.2518816051574788 24.407004013670 +4426 0.4426 44.2494552890020785 24.119319094310 +4427 0.4427 44.2470577021401184 23.832418144861 +4428 0.4428 44.2446887662429873 23.546299797810 +4429 0.4429 44.2423484031187115 23.260962687730 +4430 0.4430 44.2400365347117557 22.976405451430 +4431 0.4431 44.2377530831027954 22.692626727800 +4432 0.4432 44.2354979705085114 22.409625157929 +4433 0.4433 44.2332711192813619 22.127399385040 +4434 0.4434 44.2310724519093839 21.845948054470 +4435 0.4435 44.2289018910159726 21.565269813730 +4436 0.4436 44.2267593593596615 21.285363312450 +4437 0.4437 44.2246447798339233 21.006227202380 +4438 0.4438 44.2225580754669352 20.727860137429 +4439 0.4439 44.2204991694213803 20.450260773600 +4440 0.4440 44.2184679849942484 20.173427769020 +4441 0.4441 44.2164644456166016 19.897359783980 +4442 0.4442 44.2144884748533613 19.622055480790 +4443 0.4443 44.2125399964031232 19.347513523981 +4444 0.4444 44.2106189340979157 19.073732580110 +4445 0.4445 44.2087252119030154 18.800711317880 +4446 0.4446 44.2068587539167197 18.528448408080 +4447 0.4447 44.2050194843701334 18.256942523591 +4448 0.4448 44.2032073276269841 17.986192339409 +4449 0.4449 44.2014222081833807 17.716196532599 +4450 0.4450 44.1996640506676357 17.446953782330 +4451 0.4451 44.1979327798400305 17.178462769840 +4452 0.4452 44.1962283205926170 16.910722178460 +4453 0.4453 44.1945505979490179 16.643730693590 +4454 0.4454 44.1928995370641999 16.377487002700 +4455 0.4455 44.1912750632242961 16.111989795360 +4456 0.4456 44.1896771018463710 15.847237763151 +4457 0.4457 44.1881055784782220 15.583229599780 +4458 0.4458 44.1865604187981873 15.319964000980 +4459 0.4459 44.1850415486149117 15.057439664551 +4460 0.4460 44.1835488938671688 14.795655290341 +4461 0.4461 44.1820823806236405 14.534609580251 +4462 0.4462 44.1806419350827184 14.274301238230 +4463 0.4463 44.1792274835722907 14.014728970270 +4464 0.4464 44.1778389525495570 13.755891484420 +4465 0.4465 44.1764762686008012 13.497787490740 +4466 0.4466 44.1751393584412000 13.240415701350 +4467 0.4467 44.1738281489146161 12.983774830370 +4468 0.4468 44.1725425669933998 12.727863593990 +4469 0.4469 44.1712825397781828 12.472680710390 +4470 0.4470 44.1700479944976721 12.218224899770 +4471 0.4471 44.1688388585084653 11.964494884390 +4472 0.4472 44.1676550592948232 11.711489388480 +4473 0.4473 44.1664965244684851 11.459207138290 +4474 0.4474 44.1653631817684627 11.207646862100 +4475 0.4475 44.1642549590608482 10.956807290180 +4476 0.4476 44.1631717843386014 10.706687154800 +4477 0.4477 44.1621135857213503 10.457285190240 +4478 0.4478 44.1610802914551996 10.208600132780 +4479 0.4479 44.1600718299125248 9.960630720660 +4480 0.4480 44.1590881295917868 9.713375694140 +4481 0.4481 44.1581291191173051 9.466833795460 +4482 0.4482 44.1571947272390872 9.221003768840 +4483 0.4483 44.1562848828326224 8.975884360470 +4484 0.4484 44.1553995148986687 8.731474318540 +4485 0.4485 44.1545385525630820 8.487772393200 +4486 0.4486 44.1537019250765965 8.244777336570 +4487 0.4487 44.1528895618146322 8.002487902740 +4488 0.4488 44.1521013922771033 7.760902847770 +4489 0.4489 44.1513373460882335 7.520020929660 +4490 0.4490 44.1505973529963285 7.279840908380 +4491 0.4491 44.1498813428736128 7.040361545870 +4492 0.4492 44.1491892457160162 6.801581606000 +4493 0.4493 44.1485209916429895 6.563499854600 +4494 0.4494 44.1478765108972908 6.326115059440 +4495 0.4495 44.1472557338448084 6.089425990240 +4496 0.4496 44.1466585909743614 5.853431418660 +4497 0.4497 44.1460850128975153 5.618130118260 +4498 0.4498 44.1455349303483757 5.383520864590 +4499 0.4499 44.1450082741833896 5.149602435090 +4500 0.4500 44.1445049753811745 4.916373609150 +4501 0.4501 44.1440249650423127 4.683833168080 +4502 0.4502 44.1435681743891521 4.451979895080 +4503 0.4503 44.1431345347656361 4.220812575310 +4504 0.4504 44.1427239776370826 3.990329995820 +4505 0.4505 44.1423364345900140 3.760530945580 +4506 0.4506 44.1419718373319583 3.531414215480 +4507 0.4507 44.1416301176912711 3.302978598270 +4508 0.4508 44.1413112076169227 3.075222888660 +4509 0.4509 44.1410150391783276 2.848145883230 +4510 0.4510 44.1407415445651452 2.621746380470 +4511 0.4511 44.1404906560870884 2.396023180730 +4512 0.4512 44.1402623061737387 2.170975086290 +4513 0.4513 44.1400564273743612 1.946600901300 +4514 0.4514 44.1398729523577060 1.722899431790 +4515 0.4515 44.1397118139118305 1.499869485690 +4516 0.4516 44.1395729449439074 1.277509872790 +4517 0.4517 44.1394562784800328 1.055819404750 +4518 0.4518 44.1393617476650419 0.834796895130 +4519 0.4519 44.1392892857623167 0.614441159340 +4520 0.4520 44.1392388261536155 0.394751014660 +4521 0.4521 44.1392103023388742 0.175725280220 +4522 0.4522 44.1392036479360144 -0.042637222970 +4523 0.4523 44.1392187966807654 -0.260337672040 +4524 0.4524 44.1392556824264801 -0.477377242290 +4525 0.4525 44.1393142391439497 -0.693757107130 +4526 0.4526 44.1393944009212120 -0.909478438170 +4527 0.4527 44.1394961019633740 -1.124542405130 +4528 0.4528 44.1396192765924269 -1.338950175920 +4529 0.4529 44.1397638592470543 -1.552702916580 +4530 0.4530 44.1399297844824474 -1.765801791330 +4531 0.4531 44.1401169869701420 -1.978247962570 +4532 0.4532 44.1403254014978117 -2.190042590850 +4533 0.4533 44.1405549629690981 -2.401186834870 +4534 0.4534 44.1408056064034184 -2.611681851560 +4535 0.4535 44.1410772669357954 -2.821528795980 +4536 0.4536 44.1413698798166649 -3.030728821400 +4537 0.4537 44.1416833804116990 -3.239283079250 +4538 0.4538 44.1420177042016206 -3.447192719160 +4539 0.4539 44.1423727867820261 -3.654458888950 +4540 0.4540 44.1427485638632078 -3.861082734630 +4541 0.4541 44.1431449712699617 -4.067065400400 +4542 0.4542 44.1435619449414176 -4.272408028650 +4543 0.4543 44.1439994209308537 -4.477111760010 +4544 0.4544 44.1444573354055194 -4.681177733260 +4545 0.4545 44.1449356246464504 -4.884607085420 +4546 0.4546 44.1454342250483052 -5.087400951710 +4547 0.4547 44.1459530731191663 -5.289560465550 +4548 0.4548 44.1464921054803767 -5.491086758600 +4549 0.4549 44.1470512588663411 -5.691980960730 +4550 0.4550 44.1476304701243762 -5.892244200010 +4551 0.4551 44.1482296762145126 -6.091877602760 +4552 0.4552 44.1488488142093232 -6.290882293520 +4553 0.4553 44.1494878212937536 -6.489259395040 +4554 0.4554 44.1501466347649227 -6.687010028310 +4555 0.4555 44.1508251920319665 -6.884135312580 +4556 0.4556 44.1515234306158604 -7.080636365300 +4557 0.4557 44.1522412881492343 -7.276514302190 +4558 0.4558 44.1529787023762026 -7.471770237190 +4559 0.4559 44.1537356111521859 -7.666405282490 +4560 0.4560 44.1545119524437411 -7.860420548550 +4561 0.4561 44.1553076643283688 -8.053817144060 +4562 0.4562 44.1561226849943722 -8.246596175960 +4563 0.4563 44.1569569527406429 -8.438758749470 +4564 0.4564 44.1578104059765195 -8.630305968050 +4565 0.4565 44.1586829832215955 -8.821238933420 +4566 0.4566 44.1595746231055415 -9.011558745570 +4567 0.4567 44.1604852643679564 -9.201266502790 +4568 0.4568 44.1614148458581752 -9.390363301570 +4569 0.4569 44.1623633065350916 -9.578850236750 +4570 0.4570 44.1633305854670013 -9.766728401400 +4571 0.4571 44.1643166218314178 -9.953998886860 +4572 0.4572 44.1653213549149015 -10.140662782790 +4573 0.4573 44.1663447241128964 -10.326721177110 +4574 0.4574 44.1673866689295522 -10.512175156020 +4575 0.4575 44.1684471289775544 -10.697025804050 +4576 0.4576 44.1695260439779531 -10.881274203960 +4577 0.4577 44.1706233537599928 -11.064921436860 +4578 0.4578 44.1717389982609419 -11.247968582120 +4579 0.4579 44.1728729175259218 -11.430416717430 +4580 0.4580 44.1740250517077300 -11.612266918790 +4581 0.4581 44.1751953410666971 -11.793520260500 +4582 0.4582 44.1763837259704815 -11.974177815140 +4583 0.4583 44.1775901468939196 -12.154240653640 +4584 0.4584 44.1788145444188629 -12.333709845230 +4585 0.4585 44.1800568592339999 -12.512586457440 +4586 0.4586 44.1813170321346789 -12.690871556150 +4587 0.4587 44.1825950040227653 -12.868566205530 +4588 0.4588 44.1838907159064433 -13.045671468100 +4589 0.4589 44.1852041089000807 -13.222188404690 +4590 0.4590 44.1865351242240365 -13.398118074470 +4591 0.4591 44.1878837032045055 -13.573461534940 +4592 0.4592 44.1892497872733472 -13.748219841930 +4593 0.4593 44.1906333179679223 -13.922394049620 +4594 0.4594 44.1920342369309296 -14.095985210510 +4595 0.4595 44.1934524859102282 -14.268994375460 +4596 0.4596 44.1948880067586813 -14.441422593670 +4597 0.4597 44.1963407414339997 -14.613270912680 +4598 0.4598 44.1978106319985500 -14.784540378390 +4599 0.4599 44.1992976206192196 -14.955232035070 +4600 0.4600 44.2008016495672393 -15.125346925290 +4601 0.4601 44.2023226612180054 -15.294886090050 +4602 0.4602 44.2038605980509374 -15.463850568650 +4603 0.4603 44.2054154026493080 -15.632241398800 +4604 0.4604 44.2069870177000794 -15.800059616560 +4605 0.4605 44.2085753859937256 -15.967306256330 +4606 0.4606 44.2101804504240903 -16.133982350930 +4607 0.4607 44.2118021539882093 -16.300088931510 +4608 0.4608 44.2134404397861687 -16.465627027630 +4609 0.4609 44.2150952510209123 -16.630597667220 +4610 0.4610 44.2167665309981004 -16.795001876570 +4611 0.4611 44.2184542231259456 -16.958840680380 +4612 0.4612 44.2201582709150500 -17.122115101740 +4613 0.4613 44.2218786179782413 -17.284826162100 +4614 0.4614 44.2236152080304095 -17.446974881320 +4615 0.4615 44.2253679848883579 -17.608562277650 +4616 0.4616 44.2271368924706252 -17.769589367750 +4617 0.4617 44.2289218747973436 -17.930057166670 +4618 0.4618 44.2307228759900681 -18.089966687850 +4619 0.4619 44.2325398402716203 -18.249318943160 +4620 0.4620 44.2343727119659178 -18.408114942850 +4621 0.4621 44.2362214354978391 -18.566355695590 +4622 0.4622 44.2380859553930392 -18.724042208470 +4623 0.4623 44.2399662162778142 -18.881175486980 +4624 0.4624 44.2418621628789168 -19.037756535060 +4625 0.4625 44.2437737400234212 -19.193786355010 +4626 0.4626 44.2457008926385527 -19.349265947590 +4627 0.4627 44.2476435657515310 -19.504196312010 +4628 0.4628 44.2496017044894216 -19.658578445830 +4629 0.4629 44.2515752540789720 -19.812413345120 +4630 0.4630 44.2535641598464480 -19.965702004350 +4631 0.4631 44.2555683672174851 -20.118445416400 +4632 0.4632 44.2575878217169389 -20.270644572630 +4633 0.4633 44.2596224689687077 -20.422300462790 +4634 0.4634 44.2616722546956041 -20.573414075130 +4635 0.4635 44.2637371247191780 -20.723986396300 +4636 0.4636 44.2658170249595599 -20.874018411400 +4637 0.4637 44.2679119014353333 -21.023511104000 +4638 0.4638 44.2700217002633423 -21.172465456120 +4639 0.4639 44.2721463676585572 -21.320882448190 +4640 0.4640 44.2742858499339249 -21.468763059170 +4641 0.4641 44.2764400935002058 -21.616108266410 +4642 0.4642 44.2786090448658172 -21.762919045760 +4643 0.4643 44.2807926506366840 -21.909196371520 +4644 0.4644 44.2829908575160829 -22.054941216460 +4645 0.4645 44.2852036123044996 -22.200154551820 +4646 0.4646 44.2874308618994590 -22.344837347310 +4647 0.4647 44.2896725532953823 -22.488990571100 +4648 0.4648 44.2919286335834315 -22.632615189860 +4649 0.4649 44.2941990499513594 -22.775712168700 +4650 0.4650 44.2964837496833610 -22.918282471270 +4651 0.4651 44.2987826801599098 -23.060327059650 +4652 0.4652 44.3010957888576158 -23.201846894410 +4653 0.4653 44.3034230233490689 -23.342842934650 +4654 0.4654 44.3057643313026972 -23.483316137890 +4655 0.4655 44.3081196604826033 -23.623267460200 +4656 0.4656 44.3104889587484223 -23.762697856140 +4657 0.4657 44.3128721740551654 -23.901608278730 +4658 0.4658 44.3152692544530780 -24.039999679530 +4659 0.4659 44.3176801480874829 -24.177873008570 +4660 0.4660 44.3201048031986318 -24.315229214410 +4661 0.4661 44.3225431681215554 -24.452069244100 +4662 0.4662 44.3249951912859217 -24.588394043190 +4663 0.4663 44.3274608212158725 -24.724204555770 +4664 0.4664 44.3299400065298812 -24.859501724420 +4665 0.4665 44.3324326959406108 -24.994286490240 +4666 0.4666 44.3349388382547644 -25.128559792860 +4667 0.4667 44.3374583823729296 -25.262322570410 +4668 0.4668 44.3399912772894282 -25.395575759550 +4669 0.4669 44.3425374720921823 -25.528320295480 +4670 0.4670 44.3450969159625501 -25.660557111920 +4671 0.4671 44.3476695581751983 -25.792287141090 +4672 0.4672 44.3502553480979387 -25.923511313770 +4673 0.4673 44.3528542351915931 -26.054230559310 +4674 0.4674 44.3554661690098371 -26.184445805510 +4675 0.4675 44.3580910991990507 -26.314157978770 +4676 0.4676 44.3607289754981906 -26.443368004040 +4677 0.4677 44.3633797477386267 -26.572076804750 +4678 0.4678 44.3660433658440141 -26.700285302950 +4679 0.4679 44.3687197798301227 -26.827994419190 +4680 0.4680 44.3714089398047093 -26.955205072580 +4681 0.4681 44.3741107959673755 -27.081918180780 +4682 0.4682 44.3768252986094183 -27.208134660030 +4683 0.4683 44.3795523981136739 -27.333855425100 +4684 0.4684 44.3822920449543972 -27.459081389310 +4685 0.4685 44.3850441896970906 -27.583813464580 +4686 0.4686 44.3878087829983912 -27.708052561360 +4687 0.4687 44.3905857756058921 -27.831799588680 +4688 0.4688 44.3933751183580299 -27.955055454130 +4689 0.4689 44.3961767621839272 -28.077821063880 +4690 0.4690 44.3989906581032514 -28.200097322670 +4691 0.4691 44.4018167572260793 -28.321885133820 +4692 0.4692 44.4046550107527338 -28.443185399210 +4693 0.4693 44.4075053699736628 -28.563999019320 +4694 0.4694 44.4103677862692905 -28.684326893180 +4695 0.4695 44.4132422111098748 -28.804169918440 +4696 0.4696 44.4161285960553656 -28.923528991330 +4697 0.4697 44.4190268927552623 -29.042405006630 +4698 0.4698 44.4219370529484792 -29.160798857770 +4699 0.4699 44.4248590284632030 -29.278711436720 +4700 0.4700 44.4277927712167440 -29.396143634080 +4701 0.4701 44.4307382332154006 -29.513096339040 +4702 0.4702 44.4336953665543177 -29.629570439360 +4703 0.4703 44.4366641234173585 -29.745566821430 +4704 0.4704 44.4396444560769410 -29.861086370260 +4705 0.4705 44.4426363168939247 -29.976129969420 +4706 0.4706 44.4456396583174538 -30.090698501110 +4707 0.4707 44.4486544328848154 -30.204792846150 +4708 0.4708 44.4516805932213188 -30.318413883960 +4709 0.4709 44.4547180920401459 -30.431562492590 +4710 0.4710 44.4577668821422094 -30.544239548670 +4711 0.4711 44.4608269164160177 -30.656445927500 +4712 0.4712 44.4638981478375399 -30.768182502950 +4713 0.4713 44.4669805294700637 -30.879450147540 +4714 0.4714 44.4700740144640605 -30.990249732430 +4715 0.4715 44.4731785560570501 -31.100582127380 +4716 0.4716 44.4762941075734588 -31.210448200770 +4717 0.4717 44.4794206224244775 -31.319848819650 +4718 0.4718 44.4825580541079475 -31.428784849680 +4719 0.4719 44.4857063562081905 -31.537257155160 +4720 0.4720 44.4888654823959016 -31.645266599020 +4721 0.4721 44.4920353864279932 -31.752814042850 +4722 0.4722 44.4952160221474813 -31.859900346880 +4723 0.4723 44.4984073434833221 -31.966526369930 +4724 0.4724 44.5016093044502981 -32.072692969550 +4725 0.4725 44.5048218591488691 -32.178401001880 +4726 0.4726 44.5080449617650515 -32.283651321740 +4727 0.4727 44.5112785665702688 -32.388444782590 +4728 0.4728 44.5145226279212238 -32.492782236540 +4729 0.4729 44.5177771002597709 -32.596664534380 +4730 0.4730 44.5210419381127664 -32.700092525520 +4731 0.4731 44.5243170960919485 -32.803067058060 +4732 0.4732 44.5276025288937873 -32.905588978780 +4733 0.4733 44.5308981912993787 -33.007659133090 +4734 0.4734 44.5342040381742876 -33.109278365070 +4735 0.4735 44.5375200244684137 -33.210447517490 +4736 0.4736 44.5408461052158771 -33.311167431770 +4737 0.4737 44.5441822355348691 -33.411438948030 +4738 0.4738 44.5475283706275249 -33.511262905040 +4739 0.4739 44.5508844657797880 -33.610640140250 +4740 0.4740 44.5542504763612897 -33.709571489820 +4741 0.4741 44.5576263578252068 -33.808057788550 +4742 0.4742 44.5610120657081339 -33.906099869960 +4743 0.4743 44.5644075556299413 -34.003698566210 +4744 0.4744 44.5678127832936610 -34.100854708200 +4745 0.4745 44.5712277044853451 -34.197569125510 +4746 0.4746 44.5746522750739373 -34.293842646370 +4747 0.4747 44.5780864510111456 -34.389676097740 +4748 0.4748 44.5815301883312998 -34.485070305290 +4749 0.4749 44.5849834431512306 -34.580026093330 +4750 0.4750 44.5884461716701423 -34.674544284950 +4751 0.4751 44.5919183301694844 -34.768625701870 +4752 0.4752 44.5953998750128022 -34.862271164550 +4753 0.4753 44.5988907626456381 -34.955481492160 +4754 0.4754 44.6023909495953745 -35.048257502550 +4755 0.4755 44.6059003924711206 -35.140600012310 +4756 0.4756 44.6094190479635699 -35.232509836740 +4757 0.4757 44.6129468728449012 -35.323987789820 +4758 0.4758 44.6164838239686077 -35.415034684280 +4759 0.4759 44.6200298582693975 -35.505651331580 +4760 0.4760 44.6235849327630660 -35.595838541850 +4761 0.4761 44.6271490045463608 -35.685597124000 +4762 0.4762 44.6307220307968393 -35.774927885610 +4763 0.4763 44.6343039687727696 -35.863831633020 +4764 0.4764 44.6378947758129883 -35.952309171290 +4765 0.4765 44.6414944093367652 -36.040361304220 +4766 0.4766 44.6451028268436900 -36.127988834320 +4767 0.4767 44.6487199859135515 -36.215192562850 +4768 0.4768 44.6523458442061809 -36.301973289800 +4769 0.4769 44.6559803594613669 -36.388331813900 +4770 0.4770 44.6596234894986921 -36.474268932620 +4771 0.4771 44.6632751922174336 -36.559785442190 +4772 0.4772 44.6669354255964208 -36.644882137530 +4773 0.4773 44.6706041476939149 -36.729559812370 +4774 0.4774 44.6742813166474875 -36.813819259140 +4775 0.4775 44.6779668906739005 -36.897661269060 +4776 0.4776 44.6816608280689564 -36.981086632060 +4777 0.4777 44.6853630872074064 -37.064096136870 +4778 0.4778 44.6890736265427932 -37.146690570910 +4779 0.4779 44.6927924046073599 -37.228870720430 +4780 0.4780 44.6965193800118996 -37.310637370400 +4781 0.4781 44.7002545114456495 -37.391991304550 +4782 0.4782 44.7039977576761487 -37.472933305380 +4783 0.4783 44.7077490775491242 -37.553464154150 +4784 0.4784 44.7115084299883776 -37.633584630910 +4785 0.4785 44.7152757739956428 -37.713295514450 +4786 0.4786 44.7190510686504794 -37.792597582350 +4787 0.4787 44.7228342731101449 -37.871491610940 +4788 0.4788 44.7266253466094597 -37.949978375360 +4789 0.4789 44.7304242484607002 -38.028058649500 +4790 0.4790 44.7342309380534786 -38.105733206010 +4791 0.4791 44.7380453748546003 -38.183002816390 +4792 0.4792 44.7418675184079646 -38.259868250840 +4793 0.4793 44.7456973283344297 -38.336330278400 +4794 0.4794 44.7495347643316919 -38.412389666860 +4795 0.4795 44.7533797861741789 -38.488047182840 +4796 0.4796 44.7572323537129080 -38.563303591690 +4797 0.4797 44.7610924268753720 -38.638159657630 +4798 0.4798 44.7649599656654331 -38.712616143590 +4799 0.4799 44.7688349301631803 -38.786673811360 +4800 0.4800 44.7727172805248230 -38.860333421490 +4801 0.4801 44.7766069769825634 -38.933595733360 +4802 0.4802 44.7805039798444895 -39.006461505110 +4803 0.4803 44.7844082494944331 -39.078931493710 +4804 0.4804 44.7883197463918634 -39.151006454930 +4805 0.4805 44.7922384310717803 -39.222687143350 +4806 0.4806 44.7961642641445650 -39.293974312360 +4807 0.4807 44.8000972062958880 -39.364868714140 +4808 0.4808 44.8040372182865809 -39.435371099710 +4809 0.4809 44.8079842609525087 -39.505482218900 +4810 0.4810 44.8119382952044703 -39.575202820320 +4811 0.4811 44.8158992820280559 -39.644533651430 +4812 0.4812 44.8198671824835557 -39.713475458510 +4813 0.4813 44.8238419577058167 -39.782028986660 +4814 0.4814 44.8278235689041367 -39.850194979780 +4815 0.4815 44.8318119773621575 -39.917974180630 +4816 0.4816 44.8358071444377302 -39.985367330770 +4817 0.4817 44.8398090315628011 -40.052375170600 +4818 0.4818 44.8438176002432982 -40.118998439340 +4819 0.4819 44.8478328120590177 -40.185237875060 +4820 0.4820 44.8518546286635029 -40.251094214650 +4821 0.4821 44.8558830117839307 -40.316568193840 +4822 0.4822 44.8599179232209835 -40.381660547190 +4823 0.4823 44.8639593248487500 -40.446372008100 +4824 0.4824 44.8680071786145973 -40.510703308830 +4825 0.4825 44.8720614465390639 -40.574655180470 +4826 0.4826 44.8761220907157323 -40.638228352940 +4827 0.4827 44.8801890733111293 -40.701423555050 +4828 0.4828 44.8842623565645980 -40.764241514390 +4829 0.4829 44.8883419027881914 -40.826682957460 +4830 0.4830 44.8924276743665445 -40.888748609600 +4831 0.4831 44.8965196337567747 -40.950439194980 +4832 0.4832 44.9006177434883540 -41.011755436630 +4833 0.4833 44.9047219661630095 -41.072698056460 +4834 0.4834 44.9088322644545954 -41.133267775240 +4835 0.4835 44.9129486011089867 -41.193465312540 +4836 0.4836 44.9170709389439580 -41.253291386890 +4837 0.4837 44.9211992408490843 -41.312746715600 +4838 0.4838 44.9253334697856062 -41.371832014890 +4839 0.4839 44.9294735887863439 -41.430547999830 +4840 0.4840 44.9336195609555560 -41.488895384370 +4841 0.4841 44.9377713494688393 -41.546874881320 +4842 0.4842 44.9419289175730228 -41.604487202380 +4843 0.4843 44.9460922285860462 -41.661733058100 +4844 0.4844 44.9502612458968471 -41.718613157930 +4845 0.4845 44.9544359329652536 -41.775128210190 +4846 0.4846 44.9586162533218641 -41.831278922060 +4847 0.4847 44.9628021705679473 -41.887065999630 +4848 0.4848 44.9669936483753219 -41.942490147870 +4849 0.4849 44.9711906504862426 -41.997552070610 +4850 0.4850 44.9753931407133010 -42.052252470600 +4851 0.4851 44.9796010829393040 -42.106592049470 +4852 0.4852 44.9838144411171612 -42.160571507700 +4853 0.4853 44.9880331792697845 -42.214191544720 +4854 0.4854 44.9922572614899607 -42.267452858820 +4855 0.4855 44.9964866519402591 -42.320356147190 +4856 0.4856 45.0007213148529175 -42.372902105930 +4857 0.4857 45.0049612145297147 -42.425091430010 +4858 0.4858 45.0092063153418849 -42.476924813340 +4859 0.4859 45.0134565817299901 -42.528402948710 +4860 0.4860 45.0177119782038133 -42.579526527790 +4861 0.4861 45.0219724693422663 -42.630296241200 +4862 0.4862 45.0262380197932472 -42.680712778440 +4863 0.4863 45.0305085942735630 -42.730776827940 +4864 0.4864 45.0347841575688079 -42.780489077000 +4865 0.4865 45.0390646745332504 -42.829850211880 +4866 0.4866 45.0433501100897331 -42.878860917710 +4867 0.4867 45.0476404292295456 -42.927521878590 +4868 0.4868 45.0519355970123456 -42.975833777470 +4869 0.4869 45.0562355785660316 -43.023797296280 +4870 0.4870 45.0605403390866357 -43.071413115830 +4871 0.4871 45.0648498438382177 -43.118681915880 +4872 0.4872 45.0691640581527651 -43.165604375070 +4873 0.4873 45.0734829474300724 -43.212181171030 +4874 0.4874 45.0778064771376350 -43.258412980260 +4875 0.4875 45.0821346128105560 -43.304300478220 +4876 0.4876 45.0864673200514332 -43.349844339290 +4877 0.4877 45.0908045645302380 -43.395045236780 +4878 0.4878 45.0951463119842231 -43.439903842930 +4879 0.4879 45.0994925282178158 -43.484420828940 +4880 0.4880 45.1038431791025118 -43.528596864930 +4881 0.4881 45.1081982305767539 -43.572432619940 +4882 0.4882 45.1125576486458471 -43.615928761980 +4883 0.4883 45.1169213993818445 -43.659085957990 +4884 0.4884 45.1212894489234344 -43.701904873850 +4885 0.4885 45.1256617634758470 -43.744386174380 +4886 0.4886 45.1300383093107342 -43.786530523380 +4887 0.4887 45.1344190527660842 -43.828338583550 +4888 0.4888 45.1388039602460864 -43.869811016560 +4889 0.4889 45.1431929982210676 -43.910948483070 +4890 0.4890 45.1475861332273496 -43.951751642630 +4891 0.4891 45.1519833318671715 -43.992221153770 +4892 0.4892 45.1563845608085614 -44.032357673990 +4893 0.4893 45.1607897867852515 -44.072161859740 +4894 0.4894 45.1651989765965567 -44.111634366420 +4895 0.4895 45.1696120971072972 -44.150775848410 +4896 0.4896 45.1740291152476701 -44.189586959030 +4897 0.4897 45.1784499980131500 -44.228068350580 +4898 0.4898 45.1828747124643968 -44.266220674320 +4899 0.4899 45.1873032257271348 -44.304044580470 +4900 0.4900 45.1917355049920673 -44.341540718250 +4901 0.4901 45.1961715175147702 -44.378709735810 +4902 0.4902 45.2006112306155785 -44.415552280300 +4903 0.4903 45.2050546116794862 -44.452068997830 +4904 0.4904 45.2095016281560547 -44.488260533490 +4905 0.4905 45.2139522475592983 -44.524127531360 +4906 0.4906 45.2184064374675927 -44.559670634480 +4907 0.4907 45.2228641655235606 -44.594890484870 +4908 0.4908 45.2273253994339797 -44.629787723540 +4909 0.4909 45.2317901069696831 -44.664362990480 +4910 0.4910 45.2362582559654385 -44.698616924690 +4911 0.4911 45.2407298143198773 -44.732550164100 +4912 0.4912 45.2452047499953665 -44.766163345680 +4913 0.4913 45.2496830310179163 -44.799457105360 +4914 0.4914 45.2541646254770882 -44.832432078080 +4915 0.4915 45.2586495015258805 -44.865088897760 +4916 0.4916 45.2631376273806367 -44.897428197320 +4917 0.4917 45.2676289713209385 -44.929450608670 +4918 0.4918 45.2721235016895065 -44.961156762730 +4919 0.4919 45.2766211868921147 -44.992547289400 +4920 0.4920 45.2811219953974629 -45.023622817600 +4921 0.4921 45.2856258957371054 -45.054383975230 +4922 0.4922 45.2901328565053305 -45.084831389230 +4923 0.4923 45.2946428463590678 -45.114965685480 +4924 0.4924 45.2991558340177889 -45.144787488950 +4925 0.4925 45.3036717882634150 -45.174297423540 +4926 0.4926 45.3081906779402033 -45.203496112220 +4927 0.4927 45.3127124719546615 -45.232384176930 +4928 0.4928 45.3172371392754414 -45.260962238650 +4929 0.4929 45.3217646489332395 -45.289230917360 +4930 0.4930 45.3262949700207116 -45.317190832050 +4931 0.4931 45.3308280716923520 -45.344842600740 +4932 0.4932 45.3353639231644152 -45.372186840460 +4933 0.4933 45.3399024937148027 -45.399224167260 +4934 0.4934 45.3444437526829773 -45.425955196220 +4935 0.4935 45.3489876694698637 -45.452380541450 +4936 0.4936 45.3535342135377419 -45.478500816050 +4937 0.4937 45.3580833544101552 -45.504316632190 +4938 0.4938 45.3626350616718170 -45.529828601030 +4939 0.4939 45.3671893049685053 -45.555037332780 +4940 0.4940 45.3717460540069766 -45.579943436680 +4941 0.4941 45.3763052785548595 -45.604547521000 +4942 0.4942 45.3808669484405627 -45.628850193030 +4943 0.4943 45.3854310335531679 -45.652852059100 +4944 0.4944 45.3899975038423520 -45.676553724610 +4945 0.4945 45.3945663293182804 -45.699955793960 +4946 0.4946 45.3991374800515075 -45.723058870590 +4947 0.4947 45.4037109261728844 -45.745863556990 +4948 0.4948 45.4082866378734664 -45.768370454700 +4949 0.4949 45.4128645854044137 -45.790580164300 +4950 0.4950 45.4174447390768989 -45.812493285420 +4951 0.4951 45.4220270692620076 -45.834110416700 +4952 0.4952 45.4266115463906388 -45.855432155890 +4953 0.4953 45.4311981409534198 -45.876459099740 +4954 0.4954 45.4357868235006137 -45.897191844070 +4955 0.4955 45.4403775646420058 -45.917630983750 +4956 0.4956 45.4449703350468255 -45.937777112700 +4957 0.4957 45.4495651054436536 -45.957630823910 +4958 0.4958 45.4541618466203232 -45.977192709420 +4959 0.4959 45.4587605294238131 -45.996463360310 +4960 0.4960 45.4633611247601621 -46.015443366740 +4961 0.4961 45.4679636035943986 -46.034133317930 +4962 0.4962 45.4725679369504050 -46.052533802160 +4963 0.4963 45.4771740959108541 -46.070645406770 +4964 0.4964 45.4817820516171025 -46.088468718160 +4965 0.4965 45.4863917752690980 -46.106004321820 +4966 0.4966 45.4910032381253018 -46.123252802300 +4967 0.4967 45.4956164115025743 -46.140214743190 +4968 0.4968 45.5002312667760904 -46.156890727180 +4969 0.4969 45.5048477753792540 -46.173281336050 +4970 0.4970 45.5094659088035840 -46.189387150610 +4971 0.4971 45.5140856385986510 -46.205208750760 +4972 0.4972 45.5187069363719630 -46.220746715510 +4973 0.4973 45.5233297737888805 -46.236001622900 +4974 0.4974 45.5279541225725310 -46.250974050070 +4975 0.4975 45.5325799545036958 -46.265664573270 +4976 0.4976 45.5372072414207452 -46.280073767770 +4977 0.4977 45.5418359552195327 -46.294202207980 +4978 0.4978 45.5464660678533022 -46.308050467380 +4979 0.4979 45.5510975513325960 -46.321619118520 +4980 0.4980 45.5557303777251761 -46.334908733040 +4981 0.4981 45.5603645191559110 -46.347919881710 +4982 0.4982 45.5649999478067116 -46.360653134320 +4983 0.4983 45.5696366359164173 -46.373109059820 +4984 0.4984 45.5742745557807183 -46.385288226210 +4985 0.4985 45.5789136797520626 -46.397191200620 +4986 0.4986 45.5835539802395573 -46.408818549240 +4987 0.4987 45.5881954297088896 -46.420170837370 +4988 0.4988 45.5928380006822280 -46.431248629440 +4989 0.4989 45.5974816657381439 -46.442052488930 +4990 0.4990 45.6021263975115119 -46.452582978450 +4991 0.4991 45.6067721686934178 -46.462840659710 +4992 0.4992 45.6114189520310802 -46.472826093540 +4993 0.4993 45.6160667203277512 -46.482539839840 +4994 0.4994 45.6207154464426239 -46.491982457660 +4995 0.4995 45.6253651032907612 -46.501154505120 +4996 0.4996 45.6300156638429897 -46.510056539460 +4997 0.4997 45.6346671011258138 -46.518689117050 +4998 0.4998 45.6393193882213382 -46.527052793370 +4999 0.4999 45.6439724982671535 -46.535148122980 +5000 0.5000 45.6486264044562802 -46.542975659600 +5001 0.5001 45.6532810800370612 -46.550535956050 +5002 0.5002 45.6579364983130773 -46.557829564250 +5003 0.5003 45.6625926326430545 -46.564857035270 +5004 0.5004 45.6672494564407785 -46.571618919270 +5005 0.5005 45.6719069431750171 -46.578115765560 +5006 0.5006 45.6765650663694203 -46.584348122570 +5007 0.5007 45.6812237996024422 -46.590316537820 +5008 0.5008 45.6858831165072345 -46.596021558020 +5009 0.5009 45.6905429907715828 -46.601463728950 +5010 0.5010 45.6952033961378064 -46.606643595530 +5011 0.5011 45.6998643064026737 -46.611561701840 +5012 0.5012 45.7045256954173169 -46.616218591060 +5013 0.5013 45.7091875370871463 -46.620614805520 +5014 0.5014 45.7138498053717584 -46.624750886670 +5015 0.5015 45.7185124742848501 -46.628627375110 +5016 0.5016 45.7231755178941341 -46.632244810570 +5017 0.5017 45.7278389103212604 -46.635603731930 +5018 0.5018 45.7325026257417164 -46.638704677190 +5019 0.5019 45.7371666383847497 -46.641548183490 +5020 0.5020 45.7418309225332820 -46.644134787140 +5021 0.5021 45.7464954525238170 -46.646465023560 +5022 0.5022 45.7511602027463624 -46.648539427340 +5023 0.5023 45.7558251476443374 -46.650358532190 +5024 0.5024 45.7604902617144944 -46.651922871020 +5025 0.5025 45.7651555195068340 -46.653232975800 +5026 0.5026 45.7698208956245125 -46.654289377740 +5027 0.5027 45.7744863647237565 -46.655092607160 +5028 0.5028 45.7791519015137922 -46.655643193510 +5029 0.5029 45.7838174807567384 -46.655941665440 +5030 0.5030 45.7884830772675500 -46.655988550730 +5031 0.5031 45.7931486659139040 -46.655784376320 +5032 0.5032 45.7978142216161359 -46.655329668310 +5033 0.5033 45.8024797193471471 -46.654624951960 +5034 0.5034 45.8071451341323268 -46.653670751670 +5035 0.5035 45.8118104410494595 -46.652467591040 +5036 0.5036 45.8164756152286543 -46.651015992810 +5037 0.5037 45.8211406318522378 -46.649316478870 +5038 0.5038 45.8258054661546979 -46.647369570310 +5039 0.5039 45.8304700934225835 -46.645175787350 +5040 0.5040 45.8351344889944201 -46.642735649410 +5041 0.5041 45.8397986282606453 -46.640049675060 +5042 0.5042 45.8444624866635024 -46.637118382030 +5043 0.5043 45.8491260396969693 -46.633942287250 +5044 0.5044 45.8537892629066732 -46.630521906820 +5045 0.5045 45.8584521318898126 -46.626857755980 +5046 0.5046 45.8631146222950719 -46.622950349190 +5047 0.5047 45.8677767098225360 -46.618800200070 +5048 0.5048 45.8724383702236125 -46.614407821390 +5049 0.5049 45.8770995793009391 -46.609773725130 +5050 0.5050 45.8817603129083196 -46.604898422450 +5051 0.5051 45.8864205469506246 -46.599782423680 +5052 0.5052 45.8910802573837273 -46.594426238340 +5053 0.5053 45.8957394202143973 -46.588830375130 +5054 0.5054 45.9003980115002506 -46.582995341950 +5055 0.5055 45.9050560073496428 -46.576921645850 +5056 0.5056 45.9097133839215914 -46.570609793110 +5057 0.5057 45.9143701174257046 -46.564060289170 +5058 0.5058 45.9190261841220959 -46.557273638680 +5059 0.5059 45.9236815603213060 -46.550250345480 +5060 0.5060 45.9283362223842104 -46.542990912580 +5061 0.5061 45.9329901467219486 -46.535495842200 +5062 0.5062 45.9376433097958454 -46.527765635760 +5063 0.5063 45.9422956881173263 -46.519800793870 +5064 0.5064 45.9469472582478389 -46.511601816350 +5065 0.5065 45.9515979967987676 -46.503169202190 +5066 0.5066 45.9562478804313557 -46.494503449620 +5067 0.5067 45.9608968858566413 -46.485605056030 +5068 0.5068 45.9655449898353439 -46.476474518020 +5069 0.5069 45.9701921691778139 -46.467112331440 +5070 0.5070 45.9748384007439483 -46.457518991300 +5071 0.5071 45.9794836614431048 -46.447694991820 +5072 0.5072 45.9841279282340167 -46.437640826430 +5073 0.5073 45.9887711781247290 -46.427356987770 +5074 0.5074 45.9934133881725060 -46.416843967710 +5075 0.5075 45.9980545354837531 -46.406102257300 +5076 0.5076 46.0026945972139600 -46.395132346840 +5077 0.5077 46.0073335505675942 -46.383934725780 +5078 0.5078 46.0119713727980226 -46.372509882850 +5079 0.5079 46.0166080412074621 -46.360858305970 +5080 0.5080 46.0212435331468726 -46.348980482270 +5081 0.5081 46.0258778260158934 -46.336876898100 +5082 0.5082 46.0305108972627508 -46.324548039040 +5083 0.5083 46.0351427243841940 -46.311994389880 +5084 0.5084 46.0397732849254169 -46.299216434640 +5085 0.5085 46.0444025564799801 -46.286214656560 +5086 0.5086 46.0490305166897116 -46.272989538110 +5087 0.5087 46.0536571432446635 -46.259541560950 +5088 0.5088 46.0582824138830134 -46.245871206040 +5089 0.5089 46.0629063063909925 -46.231978953490 +5090 0.5090 46.0675287986028010 -46.217865282670 +5091 0.5091 46.0721498684005439 -46.203530672200 +5092 0.5092 46.0767694937141457 -46.188975599900 +5093 0.5093 46.0813876525212791 -46.174200542840 +5094 0.5094 46.0860043228472875 -46.159205977320 +5095 0.5095 46.0906194827650992 -46.143992378860 +5096 0.5096 46.0952331103951565 -46.128560222240 +5097 0.5097 46.0998451839053445 -46.112909981450 +5098 0.5098 46.1044556815109061 -46.097042129750 +5099 0.5099 46.1090645814743780 -46.080957139630 +5100 0.5100 46.1136718621054982 -46.064655482790 +5101 0.5101 46.1182775017611490 -46.048137630210 +5102 0.5102 46.1228814788452652 -46.031404052090 +5103 0.5103 46.1274837718087625 -46.014455217880 +5104 0.5104 46.1320843591494736 -45.997291596280 +5105 0.5105 46.1366832194120491 -45.979913655240 +5106 0.5106 46.1412803311879074 -45.962321861930 +5107 0.5107 46.1458756731151425 -45.944516682810 +5108 0.5108 46.1504692238784600 -45.926498583540 +5109 0.5109 46.1550609622090917 -45.908268029080 +5110 0.5110 46.1596508668847250 -45.889825483620 +5111 0.5111 46.1642389167294382 -45.871171410590 +5112 0.5112 46.1688250906136020 -45.852306272700 +5113 0.5113 46.1734093674538286 -45.833230531890 +5114 0.5114 46.1779917262128876 -45.813944649360 +5115 0.5115 46.1825721458996341 -45.794449085610 +5116 0.5116 46.1871506055689309 -45.774744300350 +5117 0.5117 46.1917270843215775 -45.754830752540 +5118 0.5118 46.1963015613042245 -45.734708900450 +5119 0.5119 46.2008740157093243 -45.714379201590 +5120 0.5120 46.2054444267750384 -45.693842112710 +5121 0.5121 46.2100127737851665 -45.673098089850 +5122 0.5122 46.2145790360690754 -45.652147588320 +5123 0.5123 46.2191431930016279 -45.630991062680 +5124 0.5124 46.2237052240030977 -45.609628966770 +5125 0.5125 46.2282651085391194 -45.588061753680 +5126 0.5126 46.2328228261205965 -45.566289875800 +5127 0.5127 46.2373783563036227 -45.544313784750 +5128 0.5128 46.2419316786894328 -45.522133931450 +5129 0.5129 46.2464827729243098 -45.499750766110 +5130 0.5130 46.2510316186995212 -45.477164738170 +5131 0.5131 46.2555781957512480 -45.454376296370 +5132 0.5132 46.2601224838604992 -45.431385888720 +5133 0.5133 46.2646644628530623 -45.408193962530 +5134 0.5134 46.2692041125994038 -45.384800964350 +5135 0.5135 46.2737414130146263 -45.361207340050 +5136 0.5136 46.2782763440583693 -45.337413534740 +5137 0.5137 46.2828088857347453 -45.313419992830 +5138 0.5138 46.2873390180922897 -45.289227158020 +5139 0.5139 46.2918667212238546 -45.264835473310 +5140 0.5140 46.2963919752665660 -45.240245380930 +5141 0.5141 46.3009147604017315 -45.215457322450 +5142 0.5142 46.3054350568547903 -45.190471738710 +5143 0.5143 46.3099528448952142 -45.165289069810 +5144 0.5144 46.3144681048364646 -45.139909755210 +5145 0.5145 46.3189808170359001 -45.114334233570 +5146 0.5146 46.3234909618947270 -45.088562942910 +5147 0.5147 46.3279985198578999 -45.062596320510 +5148 0.5148 46.3325034714140713 -45.036434802970 +5149 0.5149 46.3370057970955287 -45.010078826150 +5150 0.5150 46.3415054774780941 -44.983528825220 +5151 0.5151 46.3460024931810892 -44.956785234680 +5152 0.5152 46.3504968248672355 -44.929848488260 +5153 0.5153 46.3549884532426049 -44.902719019060 +5154 0.5154 46.3594773590565268 -44.875397259430 +5155 0.5155 46.3639635231015532 -44.847883641040 +5156 0.5156 46.3684469262133518 -44.820178594870 +5157 0.5157 46.3729275492706563 -44.792282551180 +5158 0.5158 46.3774053731951952 -44.764195939560 +5159 0.5159 46.3818803789516210 -44.735919188890 +5160 0.5160 46.3863525475474319 -44.707452727360 +5161 0.5161 46.3908218600329221 -44.678796982470 +5162 0.5162 46.3952882975010965 -44.649952381040 +5163 0.5163 46.3997518410876069 -44.620919349150 +5164 0.5164 46.4042124719706734 -44.591698312250 +5165 0.5165 46.4086701713710426 -44.562289695080 +5166 0.5166 46.4131249205518799 -44.532693921680 +5167 0.5167 46.4175767008187350 -44.502911415420 +5168 0.5168 46.4220254935194561 -44.472942598980 +5169 0.5169 46.4264712800441259 -44.442787894350 +5170 0.5170 46.4309140418249839 -44.412447722850 +5171 0.5171 46.4353537603363833 -44.381922505100 +5172 0.5172 46.4397904170946916 -44.351212661050 +5173 0.5173 46.4442239936582411 -44.320318609970 +5174 0.5174 46.4486544716272647 -44.289240770460 +5175 0.5175 46.4530818326438109 -44.257979560420 +5176 0.5176 46.4575060583916866 -44.226535397080 +5177 0.5177 46.4619271305963935 -44.194908697000 +5178 0.5178 46.4663450310250496 -44.163099876060 +5179 0.5179 46.4707597414863258 -44.131109349480 +5180 0.5180 46.4751712438303883 -44.098937531790 +5181 0.5181 46.4795795199488211 -44.066584836860 +5182 0.5182 46.4839845517745545 -44.034051677870 +5183 0.5183 46.4883863212818156 -44.001338467360 +5184 0.5184 46.4927848104860431 -43.968445617170 +5185 0.5185 46.4971800014438230 -43.935373538490 +5186 0.5186 46.5015718762528394 -43.902122641850 +5187 0.5187 46.5059604170517886 -43.868693337100 +5188 0.5188 46.5103456060203158 -43.835086033420 +5189 0.5189 46.5147274253789504 -43.801301139340 +5190 0.5190 46.5191058573890572 -43.767339062730 +5191 0.5191 46.5234808843527290 -43.733200210770 +5192 0.5192 46.5278524886127656 -43.698884990020 +5193 0.5193 46.5322206525525814 -43.664393806360 +5194 0.5194 46.5365853585961489 -43.629727064990 +5195 0.5195 46.5409465892079197 -43.594885170490 +5196 0.5196 46.5453043268927829 -43.559868526770 +5197 0.5197 46.5496585541959789 -43.524677537080 +5198 0.5198 46.5540092537030290 -43.489312603990 +5199 0.5199 46.5583564080396997 -43.453774129470 +5200 0.5200 46.5626999998719100 -43.418062514800 +5201 0.5201 46.5670400119056822 -43.382178160620 +5202 0.5202 46.5713764268870563 -43.346121466910 +5203 0.5203 46.5757092276020543 -43.309892833000 +5204 0.5204 46.5800383968765814 -43.273492657590 +5205 0.5205 46.5843639175763968 -43.236921338710 +5206 0.5206 46.5886857726070218 -43.200179273760 +5207 0.5207 46.5930039449136828 -43.163266859470 +5208 0.5208 46.5973184174812545 -43.126184491960 +5209 0.5209 46.6016291733341887 -43.088932566680 +5210 0.5210 46.6059361955364437 -43.051511478430 +5211 0.5211 46.6102394671914340 -43.013921621400 +5212 0.5212 46.6145389714419593 -42.976163389110 +5213 0.5213 46.6188346914701341 -42.938237174450 +5214 0.5214 46.6231266104973372 -42.900143369670 +5215 0.5215 46.6274147117841409 -42.861882366400 +5216 0.5216 46.6316989786302400 -42.823454555590 +5217 0.5217 46.6359793943744023 -42.784860327590 +5218 0.5218 46.6402559423943899 -42.746100072100 +5219 0.5219 46.6445286061069027 -42.707174178190 +5220 0.5220 46.6487973689675286 -42.668083034310 +5221 0.5221 46.6530622144706584 -42.628827028230 +5222 0.5222 46.6573231261494286 -42.589406547150 +5223 0.5223 46.6615800875756648 -42.549821977600 +5224 0.5224 46.6658330823598178 -42.510073705490 +5225 0.5225 46.6700820941508994 -42.470162116110 +5226 0.5226 46.6743271066364116 -42.430087594090 +5227 0.5227 46.6785681035422897 -42.389850523490 +5228 0.5228 46.6828050686328524 -42.349451287700 +5229 0.5229 46.6870379857107096 -42.308890269480 +5230 0.5230 46.6912668386167340 -42.268167851000 +5231 0.5231 46.6954916112299756 -42.227284413790 +5232 0.5232 46.6997122874676052 -42.186240338750 +5233 0.5233 46.7039288512848501 -42.145036006170 +5234 0.5234 46.7081412866749446 -42.103671795710 +5235 0.5235 46.7123495776690518 -42.062148086430 +5236 0.5236 46.7165537083362068 -42.020465256740 +5237 0.5237 46.7207536627832667 -41.978623684470 +5238 0.5238 46.7249494251548327 -41.936623746810 +5239 0.5239 46.7291409796331862 -41.894465820320 +5240 0.5240 46.7333283104382531 -41.852150280980 +5241 0.5241 46.7375114018275113 -41.809677504140 +5242 0.5242 46.7416902380959485 -41.767047864540 +5243 0.5243 46.7458648035759907 -41.724261736290 +5244 0.5244 46.7500350826374529 -41.681319492930 +5245 0.5245 46.7542010596874675 -41.638221507340 +5246 0.5246 46.7583627191704281 -41.594968151830 +5247 0.5247 46.7625200455679249 -41.551559798080 +5248 0.5248 46.7666730233986883 -41.507996817170 +5249 0.5249 46.7708216372185248 -41.464279579580 +5250 0.5250 46.7749658716202603 -41.420408455170 +5251 0.5251 46.7791057112336759 -41.376383813210 +5252 0.5252 46.7832411407254511 -41.332206022350 +5253 0.5253 46.7873721447991002 -41.287875450670 +5254 0.5254 46.7914987081949150 -41.243392465600 +5255 0.5255 46.7956208156898938 -41.198757434000 +5256 0.5256 46.7997384520976993 -41.153970722130 +5257 0.5257 46.8038516022685869 -41.109032695650 +5258 0.5258 46.8079602510893480 -41.063943719600 +5259 0.5259 46.8120643834832535 -41.018704158460 +5260 0.5260 46.8161639844099824 -40.973314376080 +5261 0.5261 46.8202590388655722 -40.927774735720 +5262 0.5262 46.8243495318823619 -40.882085600080 +5263 0.5263 46.8284354485289285 -40.836247331210 +5264 0.5264 46.8325167739100223 -40.790260290610 +5265 0.5265 46.8365934931665109 -40.744124839170 +5266 0.5266 46.8406655914753287 -40.697841337210 +5267 0.5267 46.8447330540494136 -40.651410144430 +5268 0.5268 46.8487958661376354 -40.604831619950 +5269 0.5269 46.8528540130247464 -40.558106122310 +5270 0.5270 46.8569074800313388 -40.511234009470 +5271 0.5271 46.8609562525137520 -40.464215638760 +5272 0.5272 46.8650003158640374 -40.417051366990 +5273 0.5273 46.8690396555099014 -40.369741550340 +5274 0.5274 46.8730742569146415 -40.322286544400 +5275 0.5275 46.8771041055770752 -40.274686704230 +5276 0.5276 46.8811291870314975 -40.226942384230 +5277 0.5277 46.8851494868476237 -40.179053938280 +5278 0.5278 46.8891649906305190 -40.131021719670 +5279 0.5279 46.8931756840205551 -40.082846081080 +5280 0.5280 46.8971815526933398 -40.034527374660 +5281 0.5281 46.9011825823596666 -39.986065951920 +5282 0.5282 46.9051787587654516 -39.937462163850 +5283 0.5283 46.9091700676916830 -39.888716360820 +5284 0.5284 46.9131564949543574 -39.839828892680 +5285 0.5285 46.9171380264044231 -39.790800108630 +5286 0.5286 46.9211146479277232 -39.741630357370 +5287 0.5287 46.9250863454449387 -39.692319986980 +5288 0.5288 46.9290531049115387 -39.642869344980 +5289 0.5289 46.9330149123177023 -39.593278778330 +5290 0.5290 46.9369717536882902 -39.543548633400 +5291 0.5291 46.9409236150827596 -39.493679256030 +5292 0.5292 46.9448704825951353 -39.443670991440 +5293 0.5293 46.9488123423539250 -39.393524184310 +5294 0.5294 46.9527491805220762 -39.343239178750 +5295 0.5295 46.9566809832969270 -39.292816318310 +5296 0.5296 46.9606077369101413 -39.242255945970 +5297 0.5297 46.9645294276276459 -39.191558404150 +5298 0.5298 46.9684460417495870 -39.140724034680 +5299 0.5299 46.9723575656102668 -39.089753178880 +5300 0.5300 46.9762639855780861 -39.038646177460 +5301 0.5301 46.9801652880554883 -38.987403370590 +5302 0.5302 46.9840614594789088 -38.936025097880 +5303 0.5303 46.9879524863187186 -38.884511698380 +5304 0.5304 46.9918383550791674 -38.832863510570 +5305 0.5305 46.9957190522983126 -38.781080872390 +5306 0.5306 46.9995945645479907 -38.729164121220 +5307 0.5307 47.0034648784337463 -38.677113593880 +5308 0.5308 47.0073299805947755 -38.624929626640 +5309 0.5309 47.0111898577038687 -38.572612555200 +5310 0.5310 47.0150444964673682 -38.520162714730 +5311 0.5311 47.0188938836250969 -38.467580439830 +5312 0.5312 47.0227380059503162 -38.414866064550 +5313 0.5313 47.0265768502496613 -38.362019922420 +5314 0.5314 47.0304104033630992 -38.309042346370 +5315 0.5315 47.0342386521638574 -38.255933668800 +5316 0.5316 47.0380615835583740 -38.202694221580 +5317 0.5317 47.0418791844862554 -38.149324336030 +5318 0.5318 47.0456914419201979 -38.095824342890 +5319 0.5319 47.0494983428659594 -38.042194572400 +5320 0.5320 47.0532998743622883 -37.988435354220 +5321 0.5321 47.0570960234808737 -37.934547017480 +5322 0.5322 47.0608867773262887 -37.880529890760 +5323 0.5323 47.0646721230359333 -37.826384302110 +5324 0.5324 47.0684520477799921 -37.772110579040 +5325 0.5325 47.0722265387613703 -37.717709048490 +5326 0.5326 47.0759955832156365 -37.663180036890 +5327 0.5327 47.0797591684109875 -37.608523870140 +5328 0.5328 47.0835172816481702 -37.553740873540 +5329 0.5329 47.0872699102604457 -37.498831371930 +5330 0.5330 47.0910170416135188 -37.443795689570 +5331 0.5331 47.0947586631055088 -37.388634150190 +5332 0.5332 47.0984947621668653 -37.333347076990 +5333 0.5333 47.1022253262603456 -37.277934792630 +5334 0.5334 47.1059503428809379 -37.222397619230 +5335 0.5335 47.1096697995558173 -37.166735878410 +5336 0.5336 47.1133836838442974 -37.110949891200 +5337 0.5337 47.1170919833377653 -37.055039978180 +5338 0.5338 47.1207946856596394 -36.999006459300 +5339 0.5339 47.1244917784653055 -36.942849654080 +5340 0.5340 47.1281832494420811 -36.886569881440 +5341 0.5341 47.1318690863091447 -36.830167459790 +5342 0.5342 47.1355492768174855 -36.773642707050 +5343 0.5343 47.1392238087498683 -36.716995940550 +5344 0.5344 47.1428926699207551 -36.660227477140 +5345 0.5345 47.1465558481762699 -36.603337633130 +5346 0.5346 47.1502133313941414 -36.546326724330 +5347 0.5347 47.1538651074836537 -36.489195065970 +5348 0.5348 47.1575111643855962 -36.431942972820 +5349 0.5349 47.1611514900721929 -36.374570759090 +5350 0.5350 47.1647860725470736 -36.317078738480 +5351 0.5351 47.1684148998452031 -36.259467224170 +5352 0.5352 47.1720379600328528 -36.201736528830 +5353 0.5353 47.1756552412075223 -36.143886964600 +5354 0.5354 47.1792667314979042 -36.085918843080 +5355 0.5355 47.1828724190638269 -36.027832475410 +5356 0.5356 47.1864722920962052 -35.969628172170 +5357 0.5357 47.1900663388169832 -35.911306243420 +5358 0.5358 47.1936545474790918 -35.852866998750 +5359 0.5359 47.1972369063663919 -35.794310747190 +5360 0.5360 47.2008134037936173 -35.735637797280 +5361 0.5361 47.2043840281063325 -35.676848457030 +5362 0.5362 47.2079487676808824 -35.617943033960 +5363 0.5363 47.2115076109243361 -35.558921835080 +5364 0.5364 47.2150605462744366 -35.499785166860 +5365 0.5365 47.2186075621995442 -35.440533335290 +5366 0.5366 47.2221486471986012 -35.381166645830 +5367 0.5367 47.2256837898010673 -35.321685403460 +5368 0.5368 47.2292129785668706 -35.262089912630 +5369 0.5369 47.2327362020863646 -35.202380477290 +5370 0.5370 47.2362534489802712 -35.142557400890 +5371 0.5371 47.2397647078996314 -35.082620986360 +5372 0.5372 47.2432699675257552 -35.022571536150 +5373 0.5373 47.2467692165701720 -34.962409352170 +5374 0.5374 47.2502624437745737 -34.902134735880 +5375 0.5375 47.2537496379107793 -34.841747988180 +5376 0.5376 47.2572307877806637 -34.781249409530 +5377 0.5377 47.2607058822161292 -34.720639299830 +5378 0.5378 47.2641749100790491 -34.659917958520 +5379 0.5379 47.2676378602612033 -34.599085684540 +5380 0.5380 47.2710947216842428 -34.538142776310 +5381 0.5381 47.2745454832996472 -34.477089531760 +5382 0.5382 47.2779901340886539 -34.415926248330 +5383 0.5383 47.2814286630622220 -34.354653222970 +5384 0.5384 47.2848610592609759 -34.293270752120 +5385 0.5385 47.2882873117551696 -34.231779131750 +5386 0.5386 47.2917074096446228 -34.170178657290 +5387 0.5387 47.2951213420586711 -34.108469623730 +5388 0.5388 47.2985290981561377 -34.046652325540 +5389 0.5389 47.3019306671252480 -33.984727056700 +5390 0.5390 47.3053260381836154 -33.922694110710 +5391 0.5391 47.3087152005781775 -33.860553780570 +5392 0.5392 47.3120981435851462 -33.798306358790 +5393 0.5393 47.3154748565099581 -33.735952137410 +5394 0.5394 47.3188453286872246 -33.673491407940 +5395 0.5395 47.3222095494806965 -33.610924461460 +5396 0.5396 47.3255675082831928 -33.548251588530 +5397 0.5397 47.3289191945165797 -33.485473079220 +5398 0.5398 47.3322645976316991 -33.422589223130 +5399 0.5399 47.3356037071083264 -33.359600309380 +5400 0.5400 47.3389365124551276 -33.296506626580 +5401 0.5401 47.3422630032096023 -33.233308462890 +5402 0.5402 47.3455831689380489 -33.170006105970 +5403 0.5403 47.3488969992354995 -33.106599843010 +5404 0.5404 47.3522044837256857 -33.043089960700 +5405 0.5405 47.3555056120609876 -32.979476745270 +5406 0.5406 47.3588003739223709 -32.915760482460 +5407 0.5407 47.3620887590193718 -32.851941457540 +5408 0.5408 47.3653707570900124 -32.788019955300 +5409 0.5409 47.3686463579007793 -32.723996260040 +5410 0.5410 47.3719155512465591 -32.659870655620 +5411 0.5411 47.3751783269506106 -32.595643425380 +5412 0.5412 47.3784346748644936 -32.531314852220 +5413 0.5413 47.3816845848680330 -32.466885218530 +5414 0.5414 47.3849280468692697 -32.402354806260 +5415 0.5415 47.3881650508044245 -32.337723896880 +5416 0.5416 47.3913955866378416 -32.272992771390 +5417 0.5417 47.3946196443619243 -32.208161710300 +5418 0.5418 47.3978372139971214 -32.143230993670 +5419 0.5419 47.4010482855918553 -32.078200901080 +5420 0.5420 47.4042528492224946 -32.013071711650 +5421 0.5421 47.4074508949932820 -31.947843704030 +5422 0.5422 47.4106424130362996 -31.882517156390 +5423 0.5423 47.4138273935114398 -31.817092346450 +5424 0.5424 47.4170058266063350 -31.751569551440 +5425 0.5425 47.4201777025363143 -31.685949048160 +5426 0.5426 47.4233430115443682 -31.620231112900 +5427 0.5427 47.4265017439010919 -31.554416021540 +5428 0.5428 47.4296538899046425 -31.488504049450 +5429 0.5429 47.4327994398806965 -31.422495471570 +5430 0.5430 47.4359383841823927 -31.356390562350 +5431 0.5431 47.4390707131902971 -31.290189595800 +5432 0.5432 47.4421964173123598 -31.223892845460 +5433 0.5433 47.4453154869838514 -31.157500584410 +5434 0.5434 47.4484279126673343 -31.091013085280 +5435 0.5435 47.4515336848526132 -31.024430620230 +5436 0.5436 47.4546327940566712 -30.957753460960 +5437 0.5437 47.4577252308236552 -30.890981878720 +5438 0.5438 47.4608109857248053 -30.824116144310 +5439 0.5439 47.4638900493584259 -30.757156528070 +5440 0.5440 47.4669624123498224 -30.690103299870 +5441 0.5441 47.4700280653512721 -30.622956729140 +5442 0.5442 47.4730869990419748 -30.555717084880 +5443 0.5443 47.4761392041279962 -30.488384635570 +5444 0.5444 47.4791846713422387 -30.420959649300 +5445 0.5445 47.4822233914443856 -30.353442393680 +5446 0.5446 47.4852553552208647 -30.285833135880 +5447 0.5447 47.4882805534847918 -30.218132142630 +5448 0.5448 47.4912989770759353 -30.150339680170 +5449 0.5449 47.4943106168606590 -30.082456014330 +5450 0.5450 47.4973154637319013 -30.014481410480 +5451 0.5451 47.5003135086091035 -29.946416133540 +5452 0.5452 47.5033047424381820 -29.878260447980 +5453 0.5453 47.5062891561914711 -29.810014617830 +5454 0.5454 47.5092667408676945 -29.741678906670 +5455 0.5455 47.5122374874919089 -29.673253577640 +5456 0.5456 47.5152013871154608 -29.604738893420 +5457 0.5457 47.5181584308159444 -29.536135116280 +5458 0.5458 47.5211086096971584 -29.467442508010 +5459 0.5459 47.5240519148890570 -29.398661329990 +5460 0.5460 47.5269883375477136 -29.329791843130 +5461 0.5461 47.5299178688552644 -29.260834307920 +5462 0.5462 47.5328405000198799 -29.191788984390 +5463 0.5463 47.5357562222757082 -29.122656132140 +5464 0.5464 47.5386650268828319 -29.053436010340 +5465 0.5465 47.5415669051272332 -28.984128877720 +5466 0.5466 47.5444618483207506 -28.914734992560 +5467 0.5467 47.5473498478010157 -28.845254612690 +5468 0.5468 47.5502308949314312 -28.775687995560 +5469 0.5469 47.5531049811011144 -28.706035398120 +5470 0.5470 47.5559720977248688 -28.636297076930 +5471 0.5471 47.5588322362431200 -28.566473288080 +5472 0.5472 47.5616853881218873 -28.496564287250 +5473 0.5473 47.5645315448527342 -28.426570329690 +5474 0.5474 47.5673706979527253 -28.356491670190 +5475 0.5475 47.5702028389643914 -28.286328563150 +5476 0.5476 47.5730279594556720 -28.216081262500 +5477 0.5477 47.5758460510198873 -28.145750021740 +5478 0.5478 47.5786571052756742 -28.075335093990 +5479 0.5479 47.5814611138669648 -28.004836731890 +5480 0.5480 47.5842580684629439 -27.934255187660 +5481 0.5481 47.5870479607579853 -27.863590713100 +5482 0.5482 47.5898307824716227 -27.792843559590 +5483 0.5483 47.5926065253485078 -27.722013978070 +5484 0.5484 47.5953751811583672 -27.651102219070 +5485 0.5485 47.5981367416959529 -27.580108532670 +5486 0.5486 47.6008911987810137 -27.509033168530 +5487 0.5487 47.6036385442582386 -27.437876375930 +5488 0.5488 47.6063787699972210 -27.366638403660 +5489 0.5489 47.6091118678924090 -27.295319500120 +5490 0.5490 47.6118378298630773 -27.223919913300 +5491 0.5491 47.6145566478532771 -27.152439890760 +5492 0.5492 47.6172683138317936 -27.080879679610 +5493 0.5493 47.6199728197921033 -27.009239526580 +5494 0.5494 47.6226701577523315 -26.937519677960 +5495 0.5495 47.6253603197552096 -26.865720379630 +5496 0.5496 47.6280432978680395 -26.793841877030 +5497 0.5497 47.6307190841826511 -26.721884415210 +5498 0.5498 47.6333876708153525 -26.649848238790 +5499 0.5499 47.6360490499068945 -26.577733591980 +5500 0.5500 47.6387032136224207 -26.505540718570 +5501 0.5501 47.6413501541514464 -26.433269861920 +5502 0.5502 47.6439898637077945 -26.360921264990 +5503 0.5503 47.6466223345295603 -26.288495170340 +5504 0.5504 47.6492475588790825 -26.215991820080 +5505 0.5505 47.6518655290428867 -26.143411455950 +5506 0.5506 47.6544762373316502 -26.070754319250 +5507 0.5507 47.6570796760801585 -25.998020650860 +5508 0.5508 47.6596758376472636 -25.925210691270 +5509 0.5509 47.6622647144158549 -25.852324680560 +5510 0.5510 47.6648462987928028 -25.779362858400 +5511 0.5511 47.6674205832089228 -25.706325464030 +5512 0.5512 47.6699875601189405 -25.633212736300 +5513 0.5513 47.6725472220014339 -25.560024913640 +5514 0.5514 47.6750995613588202 -25.486762234090 +5515 0.5515 47.6776445707172911 -25.413424935280 +5516 0.5516 47.6801822426267776 -25.340013254410 +5517 0.5517 47.6827125696609144 -25.266527428300 +5518 0.5518 47.6852355444169973 -25.192967693370 +5519 0.5519 47.6877511595159476 -25.119334285610 +5520 0.5520 47.6902594076022623 -25.045627440620 +5521 0.5521 47.6927602813439719 -24.971847393600 +5522 0.5522 47.6952537734326185 -24.897994379340 +5523 0.5523 47.6977398765831992 -24.824068632240 +5524 0.5524 47.7002185835341237 -24.750070386280 +5525 0.5525 47.7026898870471925 -24.675999875040 +5526 0.5526 47.7051537799075334 -24.601857331740 +5527 0.5527 47.7076102549235799 -24.527642989150 +5528 0.5528 47.7100593049270216 -24.453357079670 +5529 0.5529 47.7125009227727688 -24.378999835290 +5530 0.5530 47.7149351013389165 -24.304571487610 +5531 0.5531 47.7173618335266880 -24.230072267830 +5532 0.5532 47.7197811122604136 -24.155502406720 +5533 0.5533 47.7221929304874877 -24.080862134740 +5534 0.5534 47.7245972811783190 -24.006151681870 +5535 0.5535 47.7269941573262955 -23.931371277730 +5536 0.5536 47.7293835519477554 -23.856521151530 +5537 0.5537 47.7317654580819379 -23.781601532120 +5538 0.5538 47.7341398687909404 -23.706612647940 +5539 0.5539 47.7365067771596898 -23.631554727000 +5540 0.5540 47.7388661762958861 -23.556427996990 +5541 0.5541 47.7412180593299951 -23.481232685160 +5542 0.5542 47.7435624194151700 -23.405969018360 +5543 0.5543 47.7458992497272448 -23.330637223080 +5544 0.5544 47.7482285434646698 -23.255237525430 +5545 0.5545 47.7505502938484980 -23.179770151080 +5546 0.5546 47.7528644941223206 -23.104235325380 +5547 0.5547 47.7551711375522530 -23.028633273220 +5548 0.5548 47.7574702174268708 -22.952964219160 +5549 0.5549 47.7597617270571959 -22.877228387340 +5550 0.5550 47.7620456597766392 -22.801426001540 +5551 0.5551 47.7643220089409724 -22.725557285140 +5552 0.5552 47.7665907679282853 -22.649622461120 +5553 0.5553 47.7688519301389434 -22.573621752100 +5554 0.5554 47.7711054889955662 -22.497555380320 +5555 0.5555 47.7733514379429636 -22.421423567610 +5556 0.5556 47.7755897704481143 -22.345226535440 +5557 0.5557 47.7778204800001305 -22.268964504890 +5558 0.5558 47.7800435601102080 -22.192637696670 +5559 0.5559 47.7822590043115980 -22.116246331080 +5560 0.5560 47.7844668061595570 -22.039790628060 +5561 0.5561 47.7866669592313187 -21.963270807180 +5562 0.5562 47.7888594571260583 -21.886687087630 +5563 0.5563 47.7910442934648501 -21.810039688180 +5564 0.5564 47.7932214618906244 -21.733328827280 +5565 0.5565 47.7953909560681396 -21.656554722970 +5566 0.5566 47.7975527696839322 -21.579717592910 +5567 0.5567 47.7997068964462954 -21.502817654410 +5568 0.5568 47.8018533300852368 -21.425855124370 +5569 0.5569 47.8039920643524212 -21.348830219340 +5570 0.5570 47.8061230930211636 -21.271743155500 +5571 0.5571 47.8082464098863724 -21.194594148620 +5572 0.5572 47.8103620087645069 -21.117383414140 +5573 0.5573 47.8124698834935700 -21.040111167100 +5574 0.5574 47.8145700279330370 -20.962777622180 +5575 0.5575 47.8166624359638277 -20.885382993670 +5576 0.5576 47.8187471014882846 -20.807927495510 +5577 0.5577 47.8208240184301232 -20.730411341280 +5578 0.5578 47.8228931807343969 -20.652834744140 +5579 0.5579 47.8249545823674538 -20.575197916950 +5580 0.5580 47.8270082173169087 -20.497501072120 +5581 0.5581 47.8290540795916002 -20.419744421760 +5582 0.5582 47.8310921632215695 -20.341928177580 +5583 0.5583 47.8331224622579967 -20.264052550940 +5584 0.5584 47.8351449707731859 -20.186117752810 +5585 0.5585 47.8371596828605163 -20.108123993810 +5586 0.5586 47.8391665926344203 -20.030071484200 +5587 0.5587 47.8411656942303267 -19.951960433860 +5588 0.5588 47.8431569818046327 -19.873791052310 +5589 0.5589 47.8451404495346821 -19.795563548710 +5590 0.5590 47.8471160916187088 -19.717278131840 +5591 0.5591 47.8490839022758081 -19.638935010140 +5592 0.5592 47.8510438757459013 -19.560534391690 +5593 0.5593 47.8529960062896933 -19.482076484190 +5594 0.5594 47.8549402881886508 -19.403561494970 +5595 0.5595 47.8568767157449528 -19.324989631030 +5596 0.5596 47.8588052832814554 -19.246361099000 +5597 0.5597 47.8607259851416629 -19.167676105130 +5598 0.5598 47.8626388156896851 -19.088934855320 +5599 0.5599 47.8645437693102096 -19.010137555150 +5600 0.5600 47.8664408404084583 -18.931284409770 +5601 0.5601 47.8683300234101452 -18.852375624030 +5602 0.5602 47.8702113127614695 -18.773411402400 +5603 0.5603 47.8720847029290368 -18.694391949000 +5604 0.5604 47.8739501883998670 -18.615317467590 +5605 0.5605 47.8758077636813226 -18.536188161570 +5606 0.5606 47.8776574233011019 -18.457004234010 +5607 0.5607 47.8794991618071819 -18.377765887590 +5608 0.5608 47.8813329737677975 -18.298473324660 +5609 0.5609 47.8831588537713913 -18.219126747200 +5610 0.5610 47.8849767964265922 -18.139726356860 +5611 0.5611 47.8867867963621805 -18.060272354930 +5612 0.5612 47.8885888482270445 -17.980764942320 +5613 0.5613 47.8903829466901385 -17.901204319630 +5614 0.5614 47.8921690864404752 -17.821590687080 +5615 0.5615 47.8939472621870550 -17.741924244570 +5616 0.5616 47.8957174686588658 -17.662205191620 +5617 0.5617 47.8974797006048192 -17.582433727400 +5618 0.5618 47.8992339527937290 -17.502610050760 +5619 0.5619 47.9009802200142758 -17.422734360190 +5620 0.5620 47.9027184970749786 -17.342806853820 +5621 0.5621 47.9044487788041380 -17.262827729420 +5622 0.5622 47.9061710600498358 -17.182797184480 +5623 0.5623 47.9078853356798646 -17.102715416070 +5624 0.5624 47.9095916005817131 -17.022582620950 +5625 0.5625 47.9112898496625377 -16.942398995530 +5626 0.5626 47.9129800778491060 -16.862164735860 +5627 0.5627 47.9146622800877822 -16.781880037690 +5628 0.5628 47.9163364513444847 -16.701545096360 +5629 0.5629 47.9180025866046506 -16.621160106940 +5630 0.5630 47.9196606808732000 -16.540725264100 +5631 0.5631 47.9213107291745146 -16.460240762190 +5632 0.5632 47.9229527265523885 -16.379706795230 +5633 0.5633 47.9245866680699919 -16.299123556870 +5634 0.5634 47.9262125488098576 -16.218491240460 +5635 0.5635 47.9278303638738308 -16.137810038970 +5636 0.5636 47.9294401083830337 -16.057080145060 +5637 0.5637 47.9310417774778372 -15.976301751030 +5638 0.5638 47.9326353663178324 -15.895475048860 +5639 0.5639 47.9342208700817878 -15.814600230180 +5640 0.5640 47.9357982839676069 -15.733677486270 +5641 0.5641 47.9373676031923281 -15.652707008120 +5642 0.5642 47.9389288229920538 -15.571688986330 +5643 0.5643 47.9404819386219287 -15.490623611190 +5644 0.5644 47.9420269453561190 -15.409511072680 +5645 0.5645 47.9435638384877691 -15.328351560370 +5646 0.5646 47.9450926133289670 -15.247145263590 +5647 0.5647 47.9466132652107078 -15.165892371250 +5648 0.5648 47.9481257894828659 -15.084593071980 +5649 0.5649 47.9496301815141663 -15.003247554080 +5650 0.5650 47.9511264366921424 -14.921856005480 +5651 0.5651 47.9526145504231067 -14.840418613820 +5652 0.5652 47.9540945181321163 -14.758935566370 +5653 0.5653 47.9555663352629367 -14.677407050090 +5654 0.5654 47.9570299972780205 -14.595833251620 +5655 0.5655 47.9584854996584653 -14.514214357240 +5656 0.5656 47.9599328379039775 -14.432550552940 +5657 0.5657 47.9613720075328445 -14.350842024330 +5658 0.5658 47.9628030040818985 -14.269088956740 +5659 0.5659 47.9642258231064957 -14.187291535150 +5660 0.5660 47.9656404601804667 -14.105449944220 +5661 0.5661 47.9670469108960944 -14.023564368280 +5662 0.5662 47.9684451708640722 -13.941634991310 +5663 0.5663 47.9698352357134894 -13.859661997020 +5664 0.5664 47.9712171010917743 -13.777645568740 +5665 0.5665 47.9725907626646872 -13.695585889510 +5666 0.5666 47.9739562161162638 -13.613483142030 +5667 0.5667 47.9753134571488005 -13.531337508670 +5668 0.5668 47.9766624814828049 -13.449149171480 +5669 0.5669 47.9780032848569888 -13.366918312210 +5670 0.5670 47.9793358630282114 -13.284645112260 +5671 0.5671 47.9806602117714576 -13.202329752720 +5672 0.5672 47.9819763268798098 -13.119972414360 +5673 0.5673 47.9832842041644057 -13.037573277610 +5674 0.5674 47.9845838394544160 -12.955132522610 +5675 0.5675 47.9858752285970027 -12.872650329160 +5676 0.5676 47.9871583674572975 -12.790126876740 +5677 0.5677 47.9884332519183587 -12.707562344520 +5678 0.5678 47.9896998778811508 -12.624956911360 +5679 0.5679 47.9909582412645079 -12.542310755780 +5680 0.5680 47.9922083380050992 -12.459624055980 +5681 0.5681 47.9934501640573927 -12.376896989870 +5682 0.5682 47.9946837153936343 -12.294129735020 +5683 0.5683 47.9959089880038192 -12.211322468690 +5684 0.5684 47.9971259778956423 -12.128475367840 +5685 0.5685 47.9983346810944909 -12.045588609090 +5686 0.5686 47.9995350936433809 -11.962662368740 +5687 0.5687 48.0007272116029569 -11.879696822820 +5688 0.5688 48.0019110310514492 -11.796692147010 +5689 0.5689 48.0030865480846316 -11.713648516670 +5690 0.5690 48.0042537588158069 -11.630566106860 +5691 0.5691 48.0054126593757644 -11.547445092360 +5692 0.5692 48.0065632459127585 -11.464285647580 +5693 0.5693 48.0077055145924660 -11.381087946640 +5694 0.5694 48.0088394615979652 -11.297852163370 +5695 0.5695 48.0099650831296998 -11.214578471280 +5696 0.5696 48.0110823754054437 -11.131267043550 +5697 0.5697 48.0121913346602724 -11.047918053060 +5698 0.5698 48.0132919571465422 -10.964531672400 +5699 0.5699 48.0143842391338538 -10.881108073820 +5700 0.5700 48.0154681769090104 -10.797647429280 +5701 0.5701 48.0165437667759960 -10.714149910450 +5702 0.5702 48.0176110050559544 -10.630615688650 +5703 0.5703 48.0186698880871319 -10.547044934910 +5704 0.5704 48.0197204122248777 -10.463437819990 +5705 0.5705 48.0207625738415942 -10.379794514290 +5706 0.5706 48.0217963693267080 -10.296115187930 +5707 0.5707 48.0228217950866423 -10.212400010730 +5708 0.5708 48.0238388475447877 -10.128649152200 +5709 0.5709 48.0248475231414744 -10.044862781540 +5710 0.5710 48.0258478183339363 -9.961041067630 +5711 0.5711 48.0268397295962757 -9.877184179100 +5712 0.5712 48.0278232534194416 -9.793292284230 +5713 0.5713 48.0287983863112018 -9.709365551000 +5714 0.5714 48.0297651247961070 -9.625404147120 +5715 0.5715 48.0307234654154627 -9.541408239970 +5716 0.5716 48.0316734047272931 -9.457377996640 +5717 0.5717 48.0326149393063204 -9.373313583910 +5718 0.5718 48.0335480657439291 -9.289215168270 +5719 0.5719 48.0344727806481373 -9.205082915910 +5720 0.5720 48.0353890806435686 -9.120916992730 +5721 0.5721 48.0362969623714235 -9.036717564300 +5722 0.5722 48.0371964224894370 -8.952484795910 +5723 0.5723 48.0380874576718639 -8.868218852580 +5724 0.5724 48.0389700646094440 -8.783919898980 +5725 0.5725 48.0398442400093657 -8.699588099510 +5726 0.5726 48.0407099805952527 -8.615223618290 +5727 0.5727 48.0415672831071205 -8.530826619120 +5728 0.5728 48.0424161443013489 -8.446397265500 +5729 0.5729 48.0432565609506597 -8.361935720670 +5730 0.5730 48.0440885298440676 -8.277442147520 +5731 0.5731 48.0449120477868803 -8.192916708700 +5732 0.5732 48.0457271116006410 -8.108359566530 +5733 0.5733 48.0465337181231220 -8.023770883050 +5734 0.5734 48.0473318642082745 -7.939150820020 +5735 0.5735 48.0481215467262217 -7.854499538890 +5736 0.5736 48.0489027625632090 -7.769817200820 +5737 0.5737 48.0496755086215828 -7.685103966670 +5738 0.5738 48.0504397818197688 -7.600359997040 +5739 0.5739 48.0511955790922300 -7.515585452190 +5740 0.5740 48.0519428973894449 -7.430780492140 +5741 0.5741 48.0526817336778791 -7.345945276610 +5742 0.5742 48.0534120849399571 -7.261079964990 +5743 0.5743 48.0541339481740266 -7.176184716420 +5744 0.5744 48.0548473203943374 -7.091259689750 +5745 0.5745 48.0555521986309984 -7.006305043520 +5746 0.5746 48.0562485799299779 -6.921320936020 +5747 0.5747 48.0569364613530396 -6.836307525190 +5748 0.5748 48.0576158399777356 -6.751264968750 +5749 0.5749 48.0582867128973774 -6.666193424090 +5750 0.5750 48.0589490772210013 -6.581093048340 +5751 0.5751 48.0596029300733321 -6.495963998340 +5752 0.5752 48.0602482685947763 -6.410806430610 +5753 0.5753 48.0608850899413795 -6.325620501440 +5754 0.5754 48.0615133912847909 -6.240406366790 +5755 0.5755 48.0621331698122489 -6.155164182370 +5756 0.5756 48.0627444227265457 -6.069894103590 +5757 0.5757 48.0633471472460059 -5.984596285560 +5758 0.5758 48.0639413406044440 -5.899270883160 +5759 0.5759 48.0645270000511502 -5.813918050920 +5760 0.5760 48.0651041228508547 -5.728537943150 +5761 0.5761 48.0656727062837064 -5.643130713830 +5762 0.5762 48.0662327476452305 -5.557696516680 +5763 0.5763 48.0667842442463211 -5.472235505160 +5764 0.5764 48.0673271934131989 -5.386747832410 +5765 0.5765 48.0678615924873824 -5.301233651320 +5766 0.5766 48.0683874388256740 -5.215693114480 +5767 0.5767 48.0689047298001100 -5.130126374230 +5768 0.5768 48.0694134627979537 -5.044533582600 +5769 0.5769 48.0699136352216527 -4.958914891350 +5770 0.5770 48.0704052444888177 -4.873270451980 +5771 0.5771 48.0708882880322008 -4.787600415700 +5772 0.5772 48.0713627632996605 -4.701904933440 +5773 0.5773 48.0718286677541258 -4.616184155850 +5774 0.5774 48.0722859988735820 -4.530438233320 +5775 0.5775 48.0727347541510426 -4.444667315960 +5776 0.5776 48.0731749310945204 -4.358871553600 +5777 0.5777 48.0736065272269926 -4.273051095800 +5778 0.5778 48.0740295400863715 -4.187206091830 +5779 0.5779 48.0744439672254984 -4.101336690700 +5780 0.5780 48.0748498062120930 -4.015443041160 +5781 0.5781 48.0752470546287327 -3.929525291650 +5782 0.5782 48.0756357100728309 -3.843583590370 +5783 0.5783 48.0760157701566158 -3.757618085260 +5784 0.5784 48.0763872325070736 -3.671628923920 +5785 0.5785 48.0767500947659556 -3.585616253770 +5786 0.5786 48.0771043545897356 -3.499580221880 +5787 0.5787 48.0774500096495814 -3.413520975090 +5788 0.5788 48.0777870576313333 -3.327438659980 +5789 0.5789 48.0781154962354762 -3.241333422830 +5790 0.5790 48.0784353231771036 -3.155205409650 +5791 0.5791 48.0787465361858963 -3.069054766220 +5792 0.5792 48.0790491330061087 -2.982881638000 +5793 0.5793 48.0793431113965184 -2.896686170230 +5794 0.5794 48.0796284691304194 -2.810468507850 +5795 0.5795 48.0799052039955868 -2.724228795550 +5796 0.5796 48.0801733137942477 -2.637967177740 +5797 0.5797 48.0804327963430609 -2.551683798560 +5798 0.5798 48.0806836494730874 -2.465378801910 +5799 0.5799 48.0809258710297556 -2.379052331390 +5800 0.5800 48.0811594588728468 -2.292704530370 +5801 0.5801 48.0813844108764599 -2.206335541930 +5802 0.5802 48.0816007249290038 -2.119945508880 +5803 0.5803 48.0818083989331413 -2.033534573810 +5804 0.5804 48.0820074308057812 -1.947102878980 +5805 0.5805 48.0821978184780505 -1.860650566440 +5806 0.5806 48.0823795598952728 -1.774177777960 +5807 0.5807 48.0825526530169256 -1.687684655040 +5808 0.5808 48.0827170958166263 -1.601171338910 +5809 0.5809 48.0828728862821038 -1.514637970580 +5810 0.5810 48.0830200224151696 -1.428084690750 +5811 0.5811 48.0831585022317043 -1.341511639890 +5812 0.5812 48.0832883237616073 -1.254918958190 +5813 0.5813 48.0834094850487972 -1.168306785600 +5814 0.5814 48.0835219841511687 -1.081675261780 +5815 0.5815 48.0836258191405648 -0.995024526180 +5816 0.5816 48.0837209881027690 -0.908354717930 +5817 0.5817 48.0838074891374632 -0.821665975960 +5818 0.5818 48.0838853203582062 -0.734958438890 +5819 0.5819 48.0839544798924052 -0.648232245110 +5820 0.5820 48.0840149658812948 -0.561487532750 +5821 0.5821 48.0840667764799150 -0.474724439700 +5822 0.5822 48.0841099098570766 -0.387943103550 +5823 0.5823 48.0841443641953390 -0.301143661660 +5824 0.5824 48.0841701376909825 -0.214326251140 +5825 0.5825 48.0841872285539793 -0.127491008840 +5826 0.5826 48.0841956350079869 -0.040638071350 +5827 0.5827 48.0841953552903050 0.046232425000 +5828 0.5828 48.0841863876518474 0.133120344140 +5829 0.5829 48.0841687303571277 0.220025550210 +5830 0.5830 48.0841423816842379 0.306947907650 +5831 0.5831 48.0841073399247989 0.393887281140 +5832 0.5832 48.0840636033839601 0.480843535610 +5833 0.5833 48.0840111703803643 0.567816536260 +5834 0.5834 48.0839500392461261 0.654806148500 +5835 0.5835 48.0838802083268035 0.741812238020 +5836 0.5836 48.0838016759813627 0.828834670790 +5837 0.5837 48.0837144405821775 0.915873312960 +5838 0.5838 48.0836185005149801 1.002928031000 +5839 0.5839 48.0835138541788538 1.089998691590 +5840 0.5840 48.0834004999861904 1.177085161670 +5841 0.5841 48.0832784363626828 1.264187308440 +5842 0.5842 48.0831476617472973 1.351304999320 +5843 0.5843 48.0830081745922300 1.438438102010 +5844 0.5844 48.0828599733629076 1.525586484450 +5845 0.5845 48.0827030565379445 1.612750014820 +5846 0.5846 48.0825374226091284 1.699928561560 +5847 0.5847 48.0823630700813851 1.787121993330 +5848 0.5848 48.0821799974727639 1.874330179070 +5849 0.5849 48.0819882033144097 1.961552987960 +5850 0.5850 48.0817876861505411 2.048790289400 +5851 0.5851 48.0815784445384153 2.136041953080 +5852 0.5852 48.0813604770483138 2.223307848880 +5853 0.5853 48.0811337822635210 2.310587846970 +5854 0.5854 48.0808983587802814 2.397881817760 +5855 0.5855 48.0806542052078001 2.485189631870 +5856 0.5856 48.0804013201681926 2.572511160220 +5857 0.5857 48.0801397022964849 2.659846273920 +5858 0.5858 48.0798693502405712 2.747194844330 +5859 0.5859 48.0795902626611991 2.834556743100 +5860 0.5860 48.0793024382319416 2.921931842070 +5861 0.5861 48.0790058756391687 3.009320013350 +5862 0.5862 48.0787005735820401 3.096721129280 +5863 0.5863 48.0783865307724554 3.184135062440 +5864 0.5864 48.0780637459350473 3.271561685670 +5865 0.5865 48.0777322178071600 3.359000872020 +5866 0.5866 48.0773919451388210 3.446452494810 +5867 0.5867 48.0770429266926982 3.533916427590 +5868 0.5868 48.0766851612441144 3.621392544140 +5869 0.5869 48.0763186475809832 3.708880718480 +5870 0.5870 48.0759433845038160 3.796380824880 +5871 0.5871 48.0755593708256797 3.883892737830 +5872 0.5872 48.0751666053721820 3.971416332100 +5873 0.5873 48.0747650869814436 4.058951482650 +5874 0.5874 48.0743548145040762 4.146498064700 +5875 0.5875 48.0739357868031547 4.234055953690 +5876 0.5876 48.0735080027542026 4.321625025330 +5877 0.5877 48.0730714612451564 4.409205155530 +5878 0.5878 48.0726261611763590 4.496796220470 +5879 0.5879 48.0721721014605095 4.584398096540 +5880 0.5880 48.0717092810226632 4.672010660380 +5881 0.5881 48.0712376988002035 4.759633788830 +5882 0.5882 48.0707573537428132 4.847267359020 +5883 0.5883 48.0702682448124463 4.934911248280 +5884 0.5884 48.0697703709833206 5.022565334180 +5885 0.5885 48.0692637312418896 5.110229494510 +5886 0.5886 48.0687483245867995 5.197903607350 +5887 0.5887 48.0682241500288825 5.285587550920 +5888 0.5888 48.0676912065911495 5.373281203750 +5889 0.5889 48.0671494933087331 5.460984444560 +5890 0.5890 48.0665990092288880 5.548697152340 +5891 0.5891 48.0660397534109549 5.636419206260 +5892 0.5892 48.0654717249263541 5.724150485780 +5893 0.5893 48.0648949228585352 5.811890870530 +5894 0.5894 48.0643093463029913 5.899640240400 +5895 0.5895 48.0637149943671957 5.987398475540 +5896 0.5896 48.0631118661706083 6.075165456270 +5897 0.5897 48.0624999608446331 6.162941063190 +5898 0.5898 48.0618792775326185 6.250725177090 +5899 0.5899 48.0612498153898144 6.338517679020 +5900 0.5900 48.0606115735833512 6.426318450240 +5901 0.5901 48.0599645512922251 6.514127372240 +5902 0.5902 48.0593087477072771 6.601944326740 +5903 0.5903 48.0586441620311575 6.689769195700 +5904 0.5904 48.0579707934783116 6.777601861270 +5905 0.5905 48.0572886412749511 6.865442205870 +5906 0.5906 48.0565977046590547 6.953290112130 +5907 0.5907 48.0558979828803032 7.041145462890 +5908 0.5908 48.0551894752000948 7.129008141240 +5909 0.5909 48.0544721808915085 7.216878030490 +5910 0.5910 48.0537460992392766 7.304755014150 +5911 0.5911 48.0530112295397700 7.392638975970 +5912 0.5912 48.0522675711009768 7.480529799950 +5913 0.5913 48.0515151232424671 7.568427370290 +5914 0.5914 48.0507538852953857 7.656331571390 +5915 0.5915 48.0499838566024167 7.744242287930 +5916 0.5916 48.0492050365177832 7.832159404750 +5917 0.5917 48.0484174244071980 7.920082806960 +5918 0.5918 48.0476210196478561 8.008012379890 +5919 0.5919 48.0468158216284067 8.095948009050 +5920 0.5920 48.0460018297489455 8.183889580210 +5921 0.5921 48.0451790434209656 8.271836979360 +5922 0.5922 48.0443474620673641 8.359790092690 +5923 0.5923 48.0435070851223998 8.447748806620 +5924 0.5924 48.0426579120316788 8.535713007800 +5925 0.5925 48.0417999422521333 8.623682583080 +5926 0.5926 48.0409331752520004 8.711657419560 +5927 0.5927 48.0400576105107930 8.799637404520 +5928 0.5928 48.0391732475192939 8.887622425500 +5929 0.5929 48.0382800857795047 8.975612370220 +5930 0.5930 48.0373781248046612 9.063607126630 +5931 0.5931 48.0364673641191828 9.151606582920 +5932 0.5932 48.0355478032586589 9.239610627490 +5933 0.5933 48.0346194417698413 9.327619148930 +5934 0.5934 48.0336822792105949 9.415632036070 +5935 0.5935 48.0327363151498972 9.503649177950 +5936 0.5936 48.0317815491678104 9.591670463830 +5937 0.5937 48.0308179808554598 9.679695783200 +5938 0.5938 48.0298456098150126 9.767725025720 +5939 0.5939 48.0288644356596635 9.855758081310 +5940 0.5940 48.0278744580135921 9.943794840100 +5941 0.5941 48.0268756765119704 10.031835192400 +5942 0.5942 48.0258680908009126 10.119879028780 +5943 0.5943 48.0248517005374751 10.207926239990 +5944 0.5944 48.0238265053896214 10.295976717020 +5945 0.5945 48.0227925050362145 10.384030351050 +5946 0.5946 48.0217496991669890 10.472087033480 +5947 0.5947 48.0206980874825220 10.560146655920 +5948 0.5948 48.0196376696942124 10.648209110230 +5949 0.5949 48.0185684455242807 10.736274288400 +5950 0.5950 48.0174904147057262 10.824342082730 +5951 0.5951 48.0164035769823059 10.912412385650 +5952 0.5952 48.0153079321085343 11.000485089840 +5953 0.5953 48.0142034798496340 11.088560088190 +5954 0.5954 48.0130902199815353 11.176637273800 +5955 0.5955 48.0119681522908479 11.264716539970 +5956 0.5956 48.0108372765748399 11.352797780210 +5957 0.5957 48.0096975926414160 11.440880888240 +5958 0.5958 48.0085491003091036 11.528965758020 +5959 0.5959 48.0073917994070172 11.617052283660 +5960 0.5960 48.0062256897748583 11.705140359530 +5961 0.5961 48.0050507712628729 11.793229880190 +5962 0.5962 48.0038670437318444 11.881320740390 +5963 0.5963 48.0026745070530723 11.969412835120 +5964 0.5964 48.0014731611083363 12.057506059560 +5965 0.5965 48.0002630057899040 12.145600309100 +5966 0.5966 47.9990440410004808 12.233695479320 +5967 0.5967 47.9978162666532100 12.321791466050 +5968 0.5968 47.9965796826716442 12.409888165280 +5969 0.5969 47.9953342889897172 12.497985473210 +5970 0.5970 47.9940800855517438 12.586083286290 +5971 0.5971 47.9928170723123699 12.674181501120 +5972 0.5972 47.9915452492365873 12.762280014540 +5973 0.5973 47.9902646162996831 12.850378723580 +5974 0.5974 47.9889751734872263 12.938477525490 +5975 0.5975 47.9876769207950673 13.026576317680 +5976 0.5976 47.9863698582292884 13.114674997830 +5977 0.5977 47.9850539858062106 13.202773463770 +5978 0.5978 47.9837293035523444 13.290871613570 +5979 0.5979 47.9823958115043965 13.378969345450 +5980 0.5980 47.9810535097092270 13.467066557890 +5981 0.5981 47.9797023982238571 13.555163149550 +5982 0.5982 47.9783424771154188 13.643259019270 +5983 0.5983 47.9769737464611481 13.731354066120 +5984 0.5984 47.9755962063483707 13.819448189380 +5985 0.5985 47.9742098568744737 13.907541288500 +5986 0.5986 47.9728146981468910 13.995633263150 +5987 0.5987 47.9714107302830755 14.083724013170 +5988 0.5988 47.9699979534104841 14.171813438650 +5989 0.5989 47.9685763676665573 14.259901439850 +5990 0.5990 47.9671459731987042 14.347987917220 +5991 0.5991 47.9657067701642745 14.436072771430 +5992 0.5992 47.9642587587305371 14.524155903340 +5993 0.5993 47.9628019390746658 14.612237214020 +5994 0.5994 47.9613363113837323 14.700316604690 +5995 0.5995 47.9598618758546564 14.788393976850 +5996 0.5996 47.9583786326942061 14.876469232120 +5997 0.5997 47.9568865821189831 14.964542272370 +5998 0.5998 47.9553857243553807 15.052612999630 +5999 0.5999 47.9538760596395903 15.140681316160 +6000 0.6000 47.9523575882175663 15.228747124390 +6001 0.6001 47.9508303103449975 15.316810326950 +6002 0.6002 47.9492942262873143 15.404870826670 +6003 0.6003 47.9477493363196530 15.492928526600 +6004 0.6004 47.9461956407268275 15.580983329930 +6005 0.6005 47.9446331398033294 15.669035140080 +6006 0.6006 47.9430618338532923 15.757083860680 +6007 0.6007 47.9414817231904848 15.845129395530 +6008 0.6008 47.9398928081382749 15.933171648610 +6009 0.6009 47.9382950890296371 16.021210524140 +6010 0.6010 47.9366885662071027 16.109245926490 +6011 0.6011 47.9350732400227670 16.197277760230 +6012 0.6012 47.9334491108382466 16.285305930160 +6013 0.6013 47.9318161790246791 16.373330341210 +6014 0.6014 47.9301744449626881 16.461350898560 +6015 0.6015 47.9285239090423829 16.549367507560 +6016 0.6016 47.9268645716633159 16.637380073730 +6017 0.6017 47.9251964332344897 16.725388502820 +6018 0.6018 47.9235194941743146 16.813392700750 +6019 0.6019 47.9218337549105939 16.901392573610 +6020 0.6020 47.9201392158805248 16.989388027730 +6021 0.6021 47.9184358775306549 17.077378969600 +6022 0.6022 47.9167237403168826 17.165365305900 +6023 0.6023 47.9150028047044145 17.253346943490 +6024 0.6024 47.9132730711677652 17.341323789440 +6025 0.6025 47.9115345401907433 17.429295751010 +6026 0.6026 47.9097872122664086 17.517262735640 +6027 0.6027 47.9080310878970792 17.605224650950 +6028 0.6028 47.9062661675942962 17.693181404750 +6029 0.6029 47.9044924518788022 17.781132905060 +6030 0.6030 47.9027099412805484 17.869079060080 +6031 0.6031 47.9009186363386377 17.957019778160 +6032 0.6032 47.8991185376013320 18.044954967890 +6033 0.6033 47.8973096456260379 18.132884538010 +6034 0.6034 47.8954919609792640 18.220808397460 +6035 0.6035 47.8936654842366210 18.308726455370 +6036 0.6036 47.8918302159828002 18.396638621060 +6037 0.6037 47.8899861568115455 18.484544804020 +6038 0.6038 47.8881333073256457 18.572444913920 +6039 0.6039 47.8862716681369207 18.660338860640 +6040 0.6040 47.8844012398661789 18.748226554240 +6041 0.6041 47.8825220231432169 18.836107904940 +6042 0.6042 47.8806340186068127 18.923982823170 +6043 0.6043 47.8787372269046756 19.011851219520 +6044 0.6044 47.8768316486934609 19.099713004810 +6045 0.6045 47.8749172846387197 19.187568089990 +6046 0.6046 47.8729941354149062 19.275416386220 +6047 0.6047 47.8710622017053566 19.363257804830 +6048 0.6048 47.8691214842022461 19.451092257350 +6049 0.6049 47.8671719836066032 19.538919655480 +6050 0.6050 47.8652137006282743 19.626739911100 +6051 0.6051 47.8632466359859023 19.714552936290 +6052 0.6052 47.8612707904069268 19.802358643280 +6053 0.6053 47.8592861646275338 19.890156944510 +6054 0.6054 47.8572927593926778 19.977947752590 +6055 0.6055 47.8552905754560314 20.065730980300 +6056 0.6056 47.8532796135799856 20.153506540620 +6057 0.6057 47.8512598745356215 20.241274346690 +6058 0.6058 47.8492313591026956 20.329034311850 +6059 0.6059 47.8471940680696193 20.416786349610 +6060 0.6060 47.8451480022334579 20.504530373670 +6061 0.6061 47.8430931623998816 20.592266297870 +6062 0.6062 47.8410295493831725 20.679994036280 +6063 0.6063 47.8389571640062030 20.767713503120 +6064 0.6064 47.8368760071004075 20.855424612780 +6065 0.6065 47.8347860795057755 20.943127279860 +6066 0.6066 47.8326873820708300 21.030821419100 +6067 0.6067 47.8305799156525993 21.118506945470 +6068 0.6068 47.8284636811166237 21.206183774040 +6069 0.6069 47.8263386793369136 21.293851820130 +6070 0.6070 47.8242049111959489 21.381510999200 +6071 0.6071 47.8220623775846434 21.469161226890 +6072 0.6072 47.8199110794023454 21.556802419010 +6073 0.6073 47.8177510175568159 21.644434491580 +6074 0.6074 47.8155821929642002 21.732057360740 +6075 0.6075 47.8134046065490210 21.819670942860 +6076 0.6076 47.8112182592441570 21.907275154440 +6077 0.6077 47.8090231519908286 21.994869912190 +6078 0.6078 47.8068192857385696 22.082455132980 +6079 0.6079 47.8046066614452272 22.170030733830 +6080 0.6080 47.8023852800769333 22.257596631990 +6081 0.6081 47.8001551426080908 22.345152744830 +6082 0.6082 47.7979162500213519 22.432698989920 +6083 0.6083 47.7956686033076039 22.520235285000 +6084 0.6084 47.7934122034659552 22.607761547980 +6085 0.6085 47.7911470515037067 22.695277696930 +6086 0.6086 47.7888731484363518 22.782783650140 +6087 0.6087 47.7865904952875482 22.870279325980 +6088 0.6088 47.7842990930890963 22.957764643100 +6089 0.6089 47.7819989428809322 23.045239520250 +6090 0.6090 47.7796900457110993 23.132703876370 +6091 0.6091 47.7773724026357485 23.220157630580 +6092 0.6092 47.7750460147191092 23.307600702160 +6093 0.6093 47.7727108830334757 23.395033010550 +6094 0.6094 47.7703670086591785 23.482454475400 +6095 0.6095 47.7680143926845844 23.569865016480 +6096 0.6096 47.7656530362060678 23.657264553780 +6097 0.6097 47.7632829403280113 23.744653007410 +6098 0.6098 47.7609041061627551 23.832030297670 +6099 0.6099 47.7585165348306191 23.919396345050 +6100 0.6100 47.7561202274598600 24.006751070170 +6101 0.6101 47.7537151851866568 24.094094393870 +6102 0.6102 47.7513014091551113 24.181426237100 +6103 0.6103 47.7488789005172052 24.268746521000 +6104 0.6104 47.7464476604328070 24.356055166900 +6105 0.6105 47.7440076900696511 24.443352096260 +6106 0.6106 47.7415589906033020 24.530637230740 +6107 0.6107 47.7391015632171545 24.617910492150 +6108 0.6108 47.7366354091024263 24.705171802480 +6109 0.6109 47.7341605294581086 24.792421083850 +6110 0.6110 47.7316769254909872 24.879658258600 +6111 0.6111 47.7291845984155998 24.966883249190 +6112 0.6112 47.7266835494542292 25.054095978280 +6113 0.6113 47.7241737798368817 25.141296368670 +6114 0.6114 47.7216552908012801 25.228484343330 +6115 0.6115 47.7191280835928424 25.315659825410 +6116 0.6116 47.7165921594646605 25.402822738200 +6117 0.6117 47.7140475196774929 25.489973005180 +6118 0.6118 47.7114941654997367 25.577110549970 +6119 0.6119 47.7089320982074199 25.664235296390 +6120 0.6120 47.7063613190841806 25.751347168370 +6121 0.6121 47.7037818294212599 25.838446090040 +6122 0.6122 47.7011936305174729 25.925531985710 +6123 0.6123 47.6985967236791950 26.012604779800 +6124 0.6124 47.6959911102203620 26.099664396930 +6125 0.6125 47.6933767914624198 26.186710761890 +6126 0.6126 47.6907537687343464 26.273743799600 +6127 0.6127 47.6881220433726085 26.360763435160 +6128 0.6128 47.6854816167211553 26.447769593840 +6129 0.6129 47.6828324901314105 26.534762201040 +6130 0.6130 47.6801746649622444 26.621741182350 +6131 0.6131 47.6775081425799527 26.708706463530 +6132 0.6132 47.6748329243582560 26.795657970460 +6133 0.6133 47.6721490116782718 26.882595629220 +6134 0.6134 47.6694564059285071 26.969519366020 +6135 0.6135 47.6667551085048444 27.056429107250 +6136 0.6136 47.6640451208105063 27.143324779470 +6137 0.6137 47.6613264442560620 27.230206309370 +6138 0.6138 47.6585990802594068 27.317073623800 +6139 0.6139 47.6558630302457260 27.403926649800 +6140 0.6140 47.6531182956475092 27.490765314530 +6141 0.6141 47.6503648779045150 27.577589545360 +6142 0.6142 47.6476027784637566 27.664399269750 +6143 0.6143 47.6448319987795017 27.751194415380 +6144 0.6144 47.6420525403132302 27.837974910060 +6145 0.6145 47.6392644045336411 27.924740681740 +6146 0.6146 47.6364675929166239 28.011491658570 +6147 0.6147 47.6336621069452519 28.098227768830 +6148 0.6148 47.6308479481097606 28.184948940940 +6149 0.6149 47.6280251179075407 28.271655103520 +6150 0.6150 47.6251936178431023 28.358346185310 +6151 0.6151 47.6223534494280756 28.445022115240 +6152 0.6152 47.6195046141811957 28.531682822340 +6153 0.6153 47.6166471136282823 28.618328235870 +6154 0.6154 47.6137809493022317 28.704958285170 +6155 0.6155 47.6109061227429819 28.791572899800 +6156 0.6156 47.6080226354975196 28.878172009440 +6157 0.6157 47.6051304891198512 28.964755543920 +6158 0.6158 47.6022296851709967 29.051323433230 +6159 0.6159 47.5993202252189604 29.137875607560 +6160 0.6160 47.5964021108387243 29.224411997160 +6161 0.6161 47.5934753436122406 29.310932532510 +6162 0.6162 47.5905399251284038 29.397437144230 +6163 0.6163 47.5875958569830360 29.483925763070 +6164 0.6164 47.5846431407788870 29.570398319950 +6165 0.6165 47.5816817781255921 29.656854745940 +6166 0.6166 47.5787117706396785 29.743294972270 +6167 0.6167 47.5757331199445517 29.829718930300 +6168 0.6168 47.5727458276704596 29.916126551560 +6169 0.6169 47.5697498954544926 30.002517767730 +6170 0.6170 47.5667453249405767 30.088892510650 +6171 0.6171 47.5637321177794306 30.175250712290 +6172 0.6172 47.5607102756285798 30.261592304770 +6173 0.6173 47.5576798001523215 30.347917220390 +6174 0.6174 47.5546406930217245 30.434225391580 +6175 0.6175 47.5515929559146002 30.520516750920 +6176 0.6176 47.5485365905154964 30.606791231160 +6177 0.6177 47.5454715985156824 30.693048765150 +6178 0.6178 47.5423979816131279 30.779289285950 +6179 0.6179 47.5393157415124961 30.865512726750 +6180 0.6180 47.5362248799251148 30.951719020860 +6181 0.6181 47.5331253985689841 31.037908101770 +6182 0.6182 47.5300172991687404 31.124079903120 +6183 0.6183 47.5269005834556495 31.210234358680 +6184 0.6184 47.5237752531675994 31.296371402380 +6185 0.6185 47.5206413100490650 31.382490968290 +6186 0.6186 47.5174987558511219 31.468592990640 +6187 0.6187 47.5143475923313972 31.554677403800 +6188 0.6188 47.5111878212540901 31.640744142290 +6189 0.6189 47.5080194443899373 31.726793140770 +6190 0.6190 47.5048424635161979 31.812824334040 +6191 0.6191 47.5016568804166397 31.898837657100 +6192 0.6192 47.4984626968815320 31.984833045020 +6193 0.6193 47.4952599147076242 32.070810433070 +6194 0.6194 47.4920485356981388 32.156769756640 +6195 0.6195 47.4888285616627428 32.242710951270 +6196 0.6196 47.4855999944175480 32.328633952660 +6197 0.6197 47.4823628357850822 32.414538696660 +6198 0.6198 47.4791170875942896 32.500425119210 +6199 0.6199 47.4758627516805021 32.586293156470 +6200 0.6200 47.4725998298854464 32.672142744700 +6201 0.6201 47.4693283240571944 32.757973820310 +6202 0.6202 47.4660482360501845 32.843786319880 +6203 0.6203 47.4627595677251861 32.929580180080 +6204 0.6204 47.4594623209492923 33.015355337790 +6205 0.6205 47.4561564975959058 33.101111729980 +6206 0.6206 47.4528420995447178 33.186849293790 +6207 0.6207 47.4495191286817004 33.272567966500 +6208 0.6208 47.4461875868991001 33.358267685530 +6209 0.6209 47.4428474760954018 33.443948388440 +6210 0.6210 47.4394987981753360 33.529610012940 +6211 0.6211 47.4361415550498435 33.615252496880 +6212 0.6212 47.4327757486360895 33.700875778250 +6213 0.6213 47.4294013808574206 33.786479795180 +6214 0.6214 47.4260184536433655 33.872064485930 +6215 0.6215 47.4226269689296203 33.957629788950 +6216 0.6216 47.4192269286580341 34.043175642770 +6217 0.6217 47.4158183347765885 34.128701986090 +6218 0.6218 47.4124011892393966 34.214208757750 +6219 0.6219 47.4089754940066683 34.299695896750 +6220 0.6220 47.4055412510447240 34.385163342190 +6221 0.6221 47.4020984623259451 34.470611033330 +6222 0.6222 47.3986471298288023 34.556038909570 +6223 0.6223 47.3951872555377989 34.641446910450 +6224 0.6224 47.3917188414434918 34.726834975660 +6225 0.6225 47.3882418895424564 34.812203045010 +6226 0.6226 47.3847564018372864 34.897551058450 +6227 0.6227 47.3812623803365582 34.982878956100 +6228 0.6228 47.3777598270548452 35.068186678160 +6229 0.6229 47.3742487440126823 35.153474165040 +6230 0.6230 47.3707291332365656 35.238741357230 +6231 0.6231 47.3672009967589318 35.323988195380 +6232 0.6232 47.3636643366181502 35.409214620290 +6233 0.6233 47.3601191548584950 35.494420572880 +6234 0.6234 47.3565654535301377 35.579605994200 +6235 0.6235 47.3530032346891545 35.664770825470 +6236 0.6236 47.3494325003974836 35.749915008010 +6237 0.6237 47.3458532527229181 35.835038483310 +6238 0.6238 47.3422654937391059 35.920141192980 +6239 0.6239 47.3386692255255213 36.005223078750 +6240 0.6240 47.3350644501674580 36.090284082510 +6241 0.6241 47.3314511697560150 36.175324146280 +6242 0.6242 47.3278293863880890 36.260343212230 +6243 0.6243 47.3241991021663466 36.345341222620 +6244 0.6244 47.3205603191992239 36.430318119900 +6245 0.6245 47.3169130396008981 36.515273846610 +6246 0.6246 47.3132572654912948 36.600208345470 +6247 0.6247 47.3095929989960595 36.685121559290 +6248 0.6248 47.3059202422465432 36.770013431030 +6249 0.6249 47.3022389973798028 36.854883903820 +6250 0.6250 47.2985492665385721 36.939732920860 +6251 0.6251 47.2948510518712553 37.024560425530 +6252 0.6252 47.2911443555319124 37.109366361330 +6253 0.6253 47.2874291796802524 37.194150671900 +6254 0.6254 47.2837055264816044 37.278913300990 +6255 0.6255 47.2799733981069323 37.363654192520 +6256 0.6256 47.2762327967327778 37.448373290500 +6257 0.6257 47.2724837245412957 37.533070539120 +6258 0.6258 47.2687261837202044 37.617745882660 +6259 0.6259 47.2649601764627931 37.702399265560 +6260 0.6260 47.2611857049678932 37.787030632370 +6261 0.6261 47.2574027714398852 37.871639927800 +6262 0.6262 47.2536113780886637 37.956227096680 +6263 0.6263 47.2498115271296300 38.040792083940 +6264 0.6264 47.2460032207836989 38.125334834680 +6265 0.6265 47.2421864612772566 38.209855294130 +6266 0.6266 47.2383612508421677 38.294353407640 +6267 0.6267 47.2345275917157537 38.378829120680 +6268 0.6268 47.2306854861407786 38.463282378850 +6269 0.6269 47.2268349363654423 38.547713127910 +6270 0.6270 47.2229759446433590 38.632121313730 +6271 0.6271 47.2191085132335573 38.716506882320 +6272 0.6272 47.2152326444004515 38.800869779780 +6273 0.6273 47.2113483404138421 38.885209952390 +6274 0.6274 47.2074556035488939 38.969527346550 +6275 0.6275 47.2035544360861294 39.053821908760 +6276 0.6276 47.1996448403114073 39.138093585660 +6277 0.6277 47.1957268185159222 39.222342324050 +6278 0.6278 47.1918003729961768 39.306568070820 +6279 0.6279 47.1878655060539884 39.390770773000 +6280 0.6280 47.1839222199964539 39.474950377760 +6281 0.6281 47.1799705171359491 39.559106832370 +6282 0.6282 47.1760103997901155 39.643240084270 +6283 0.6283 47.1720418702818520 39.727350080990 +6284 0.6284 47.1680649309392948 39.811436770200 +6285 0.6285 47.1640795840958020 39.895500099690 +6286 0.6286 47.1600858320899476 39.979540017390 +6287 0.6287 47.1560836772655136 40.063556471360 +6288 0.6288 47.1520731219714548 40.147549409760 +6289 0.6289 47.1480541685619201 40.231518780920 +6290 0.6290 47.1440268193962098 40.315464533240 +6291 0.6291 47.1399910768387826 40.399386615290 +6292 0.6292 47.1359469432592277 40.483284975750 +6293 0.6293 47.1318944210322712 40.567159563430 +6294 0.6294 47.1278335125377410 40.651010327240 +6295 0.6295 47.1237642201605667 40.734837216260 +6296 0.6296 47.1196865462907724 40.818640179670 +6297 0.6297 47.1156004933234485 40.902419166770 +6298 0.6298 47.1115060636587586 40.986174126980 +6299 0.6299 47.1074032597019183 41.069905009880 +6300 0.6300 47.1032920838631668 41.153611765130 +6301 0.6301 47.0991725385577809 41.237294342540 +6302 0.6302 47.0950446262060538 41.320952692030 +6303 0.6303 47.0909083492332670 41.404586763660 +6304 0.6304 47.0867637100697038 41.488196507600 +6305 0.6305 47.0826107111506147 41.571781874150 +6306 0.6306 47.0784493549162235 41.655342813710 +6307 0.6307 47.0742796438116926 41.738879276850 +6308 0.6308 47.0701015802871368 41.822391214220 +6309 0.6309 47.0659151667975948 41.905878576610 +6310 0.6310 47.0617204058030154 41.989341314940 +6311 0.6311 47.0575172997682571 42.072779380220 +6312 0.6312 47.0533058511630671 42.156192723620 +6313 0.6313 47.0490860624620666 42.239581296410 +6314 0.6314 47.0448579361447443 42.322945049990 +6315 0.6315 47.0406214746954490 42.406283935880 +6316 0.6316 47.0363766806033681 42.489597905700 +6317 0.6317 47.0321235563625208 42.572886911230 +6318 0.6318 47.0278621044717440 42.656150904350 +6319 0.6319 47.0235923274346774 42.739389837050 +6320 0.6320 47.0193142277597502 42.822603661460 +6321 0.6321 47.0150278079601875 42.905792329820 +6322 0.6322 47.0107330705539752 42.988955794490 +6323 0.6323 47.0064300180638526 43.072094007940 +6324 0.6324 47.0021186530173196 43.155206922790 +6325 0.6325 46.9977989779465943 43.238294491760 +6326 0.6326 46.9934709953886198 43.321356667670 +6327 0.6327 46.9891347078850643 43.404393403490 +6328 0.6328 46.9847901179822713 43.487404652310 +6329 0.6329 46.9804372282312883 43.570390367290 +6330 0.6330 46.9760760411878309 43.653350501790 +6331 0.6331 46.9717065594122829 43.736285009210 +6332 0.6332 46.9673287854696682 43.819193843110 +6333 0.6333 46.9629427219296574 43.902076957160 +6334 0.6334 46.9585483713665397 43.984934305150 +6335 0.6335 46.9541457363592372 44.067765840970 +6336 0.6336 46.9497348194912547 44.150571518660 +6337 0.6337 46.9453156233507016 44.233351292350 +6338 0.6338 46.9408881505302702 44.316105116300 +6339 0.6339 46.9364524036272144 44.398832944850 +6340 0.6340 46.9320083852433427 44.481534732550 +6341 0.6341 46.9275560979850184 44.564210433950 +6342 0.6342 46.9230955444631306 44.646860003810 +6343 0.6343 46.9186267272930948 44.729483396940 +6344 0.6344 46.9141496490948313 44.812080568310 +6345 0.6345 46.9096643124927652 44.894651472980 +6346 0.6346 46.9051707201158052 44.977196066150 +6347 0.6347 46.9006688745973435 45.059714303110 +6348 0.6348 46.8961587785752272 45.142206139260 +6349 0.6349 46.8916404346917588 45.224671530160 +6350 0.6350 46.8871138455936816 45.307110431450 +6351 0.6351 46.8825790139321654 45.389522798870 +6352 0.6352 46.8780359423628070 45.471908588310 +6353 0.6353 46.8734846335456012 45.554267755760 +6354 0.6354 46.8689250901449483 45.636600257320 +6355 0.6355 46.8643573148296184 45.718906049210 +6356 0.6356 46.8597813102727727 45.801185087750 +6357 0.6357 46.8551970791519139 45.883437329400 +6358 0.6358 46.8506046241489074 45.965662730710 +6359 0.6359 46.8460039479499528 46.047861248340 +6360 0.6360 46.8413950532455843 46.130032839090 +6361 0.6361 46.8367779427306345 46.212177459860 +6362 0.6362 46.8321526191042565 46.294295067640 +6363 0.6363 46.8275190850698948 46.376385619580 +6364 0.6364 46.8228773433352714 46.458449072890 +6365 0.6365 46.8182273966123788 46.540485384940 +6366 0.6366 46.8135692476174725 46.622494513160 +6367 0.6367 46.8089028990710574 46.704476415150 +6368 0.6368 46.8042283536978729 46.786431048570 +6369 0.6369 46.7995456142268864 46.868358371230 +6370 0.6370 46.7948546833912715 46.950258341020 +6371 0.6371 46.7901555639284226 47.032130915970 +6372 0.6372 46.7854482585799119 47.113976054210 +6373 0.6373 46.7807327700915039 47.195793713970 +6374 0.6374 46.7760091012131269 47.277583853600 +6375 0.6375 46.7712772546988660 47.359346431550 +6376 0.6376 46.7665372333069698 47.441081406410 +6377 0.6377 46.7617890397998082 47.522788736840 +6378 0.6378 46.7570326769438864 47.604468381650 +6379 0.6379 46.7522681475098167 47.686120299720 +6380 0.6380 46.7474954542723253 47.767744450070 +6381 0.6381 46.7427146000102312 47.849340791810 +6382 0.6382 46.7379255875064317 47.930909284190 +6383 0.6383 46.7331284195478958 48.012449886520 +6384 0.6384 46.7283230989256566 48.093962558250 +6385 0.6385 46.7235096284347975 48.175447258950 +6386 0.6386 46.7186880108744376 48.256903948280 +6387 0.6387 46.7138582490477248 48.338332586000 +6388 0.6388 46.7090203457618216 48.419733132000 +6389 0.6389 46.7041743038279051 48.501105546260 +6390 0.6390 46.6993201260611457 48.582449788880 +6391 0.6391 46.6944578152806997 48.663765820070 +6392 0.6392 46.6895873743096885 48.745053600130 +6393 0.6393 46.6847088059752053 48.826313089480 +6394 0.6394 46.6798221131083011 48.907544248660 +6395 0.6395 46.6749272985439561 48.988747038280 +6396 0.6396 46.6700243651210869 49.069921419100 +6397 0.6397 46.6651133156825324 49.151067351950 +6398 0.6398 46.6601941530750466 49.232184797790 +6399 0.6399 46.6552668801492700 49.313273717700 +6400 0.6400 46.6503314997597442 49.394334072810 +6401 0.6401 46.6453880147648832 49.475365824410 +6402 0.6402 46.6404364280269661 49.556368933870 +6403 0.6403 46.6354767424121377 49.637343362700 +6404 0.6404 46.6305089607903795 49.718289072450 +6405 0.6405 46.6255330860355173 49.799206024840 +6406 0.6406 46.6205491210251921 49.880094181660 +6407 0.6407 46.6155570686408680 49.960953504810 +6408 0.6408 46.6105569317678103 50.041783956320 +6409 0.6409 46.6055487132950788 50.122585498280 +6410 0.6410 46.6005324161155201 50.203358092930 +6411 0.6411 46.5955080431257471 50.284101702570 +6412 0.6412 46.5904755972261384 50.364816289660 +6413 0.6413 46.5854350813208171 50.445501816700 +6414 0.6414 46.5803864983176652 50.526158246340 +6415 0.6415 46.5753298511282807 50.606785541320 +6416 0.6416 46.5702651426679921 50.687383664470 +6417 0.6417 46.5651923758558297 50.767952578760 +6418 0.6418 46.5601115536145329 50.848492247220 +6419 0.6419 46.5550226788705217 50.929002633020 +6420 0.6420 46.5499257545539038 51.009483699400 +6421 0.6421 46.5448207835984462 51.089935409720 +6422 0.6422 46.5397077689415894 51.170357727440 +6423 0.6423 46.5345867135244120 51.250750616140 +6424 0.6424 46.5294576202916303 51.331114039480 +6425 0.6425 46.5243204921915918 51.411447961220 +6426 0.6426 46.5191753321762675 51.491752345220 +6427 0.6427 46.5140221432012311 51.572027155480 +6428 0.6428 46.5088609282256513 51.652272356060 +6429 0.6429 46.5036916902122925 51.732487911130 +6430 0.6430 46.4985144321274859 51.812673784980 +6431 0.6431 46.4933291569411367 51.892829941960 +6432 0.6432 46.4881358676267098 51.972956346590 +6433 0.6433 46.4829345671612089 52.053052963420 +6434 0.6434 46.4777252585251830 52.133119757130 +6435 0.6435 46.4725079447026985 52.213156692520 +6436 0.6436 46.4672826286813461 52.293163734460 +6437 0.6437 46.4620493134522263 52.373140847930 +6438 0.6438 46.4568080020099288 52.453087998020 +6439 0.6439 46.4515586973525316 52.533005149900 +6440 0.6440 46.4463014024815948 52.612892268860 +6441 0.6441 46.4410361204021385 52.692749320270 +6442 0.6442 46.4357628541226433 52.772576269620 +6443 0.6443 46.4304816066550359 52.852373082500 +6444 0.6444 46.4251923810146820 52.932139724570 +6445 0.6445 46.4198951802203723 53.011876161620 +6446 0.6446 46.4145900072943149 53.091582359530 +6447 0.6447 46.4092768652621288 53.171258284260 +6448 0.6448 46.4039557571528221 53.250903901890 +6449 0.6449 46.3986266859987992 53.330519178610 +6450 0.6450 46.3932896548358329 53.410104080660 +6451 0.6451 46.3879446667030777 53.489658574430 +6452 0.6452 46.3825917246430350 53.569182626390 +6453 0.6453 46.3772308317015600 53.648676203080 +6454 0.6454 46.3718619909278473 53.728139271180 +6455 0.6455 46.3664852053744170 53.807571797470 +6456 0.6456 46.3611004780971072 53.886973748760 +6457 0.6457 46.3557078121550674 53.966345092030 +6458 0.6458 46.3503072106107510 54.045685794340 +6459 0.6459 46.3448986765298940 54.124995822820 +6460 0.6460 46.3394822129815154 54.204275144730 +6461 0.6461 46.3340578230379094 54.283523727390 +6462 0.6462 46.3286255097746249 54.362741538250 +6463 0.6463 46.3231852762704719 54.441928544860 +6464 0.6464 46.3177371256074863 54.521084714820 +6465 0.6465 46.3122810608709514 54.600210015870 +6466 0.6466 46.3068170851493690 54.679304415830 +6467 0.6467 46.3013452015344456 54.758367882610 +6468 0.6468 46.2958654131211063 54.837400384240 +6469 0.6469 46.2903777230074525 54.916401888820 +6470 0.6470 46.2848821342947829 54.995372364550 +6471 0.6471 46.2793786500875655 55.074311779730 +6472 0.6472 46.2738672734934440 55.153220102750 +6473 0.6473 46.2683480076232030 55.232097302090 +6474 0.6474 46.2628208555907818 55.310943346350 +6475 0.6475 46.2572858205132533 55.389758204200 +6476 0.6476 46.2517429055108238 55.468541844410 +6477 0.6477 46.2461921137068117 55.547294235830 +6478 0.6478 46.2406334482276478 55.626015347450 +6479 0.6479 46.2350669122028606 55.704705148300 +6480 0.6480 46.2294925087650697 55.783363607540 +6481 0.6481 46.2239102410499711 55.861990694400 +6482 0.6482 46.2183201121963378 55.940586378210 +6483 0.6483 46.2127221253460050 56.019150628410 +6484 0.6484 46.2071162836438560 56.097683414510 +6485 0.6485 46.2015025902378227 56.176184706130 +6486 0.6486 46.1958810482788707 56.254654472970 +6487 0.6487 46.1902516609209783 56.333092684820 +6488 0.6488 46.1846144313211582 56.411499311600 +6489 0.6489 46.1789693626394140 56.489874323260 +6490 0.6490 46.1733164580387552 56.568217689890 +6491 0.6491 46.1676557206851754 56.646529381670 +6492 0.6492 46.1619871537476527 56.724809368840 +6493 0.6493 46.1563107603981209 56.803057621760 +6494 0.6494 46.1506265438114909 56.881274110860 +6495 0.6495 46.1449345071656154 56.959458806690 +6496 0.6496 46.1392346536412887 57.037611679870 +6497 0.6497 46.1335269864222397 57.115732701110 +6498 0.6498 46.1278115086951246 57.193821841240 +6499 0.6499 46.1220882236495058 57.271879071140 +6500 0.6500 46.1163571344778589 57.349904361800 +6501 0.6501 46.1106182443755515 57.427897684300 +6502 0.6502 46.1048715565408429 57.505859009820 +6503 0.6503 46.0991170741748704 57.583788309620 +6504 0.6504 46.0933548004816345 57.661685555040 +6505 0.6505 46.0875847386680064 57.739550717530 +6506 0.6506 46.0818068919436996 57.817383768620 +6507 0.6507 46.0760212635212696 57.895184679930 +6508 0.6508 46.0702278566161141 57.972953423160 +6509 0.6509 46.0644266744464517 58.050689970130 +6510 0.6510 46.0586177202333076 58.128394292730 +6511 0.6511 46.0528009972005279 58.206066362920 +6512 0.6512 46.0469765085747440 58.283706152770 +6513 0.6513 46.0411442575853798 58.361313634460 +6514 0.6514 46.0353042474646443 58.438888780210 +6515 0.6515 46.0294564814475180 58.516431562360 +6516 0.6516 46.0236009627717308 58.593941953340 +6517 0.6517 46.0177376946777841 58.671419925650 +6518 0.6518 46.0118666804089074 58.748865451910 +6519 0.6519 46.0059879232110731 58.826278504780 +6520 0.6520 46.0001014263329822 58.903659057050 +6521 0.6521 45.9942071930260497 58.981007081580 +6522 0.6522 45.9883052265444050 59.058322551330 +6523 0.6523 45.9823955301448706 59.135605439330 +6524 0.6524 45.9764781070869688 59.212855718690 +6525 0.6525 45.9705529606329009 59.290073362650 +6526 0.6526 45.9646200940475467 59.367258344500 +6527 0.6527 45.9586795105984436 59.444410637620 +6528 0.6528 45.9527312135557864 59.521530215490 +6529 0.6529 45.9467752061924273 59.598617051670 +6530 0.6530 45.9408114917838546 59.675671119790 +6531 0.6531 45.9348400736081857 59.752692393620 +6532 0.6532 45.9288609549461597 59.829680846950 +6533 0.6533 45.9228741390811237 59.906636453700 +6534 0.6534 45.9168796292990464 59.983559187840 +6535 0.6535 45.9108774288884831 60.060449023490 +6536 0.6536 45.9048675411405682 60.137305934770 +6537 0.6537 45.8988499693490297 60.214129895940 +6538 0.6538 45.8928247168101677 60.290920881350 +6539 0.6539 45.8867917868228332 60.367678865410 +6540 0.6540 45.8807511826884351 60.444403822620 +6541 0.6541 45.8747029077109261 60.521095727590 +6542 0.6542 45.8686469651967954 60.597754554960 +6543 0.6543 45.8625833584550691 60.674380279520 +6544 0.6544 45.8565120907972883 60.750972876120 +6545 0.6545 45.8504331655375026 60.827532319650 +6546 0.6546 45.8443465859922625 60.904058585150 +6547 0.6547 45.8382523554806198 60.980551647710 +6548 0.6548 45.8321504773241060 61.057011482520 +6549 0.6549 45.8260409548467393 61.133438064850 +6550 0.6550 45.8199237913749968 61.209831370030 +6551 0.6551 45.8137989902378209 61.286191373500 +6552 0.6552 45.8076665547666053 61.362518050790 +6553 0.6553 45.8015264882951953 61.438811377480 +6554 0.6554 45.7953787941598591 61.515071329270 +6555 0.6555 45.7892234756993020 61.591297881930 +6556 0.6556 45.7830605362546450 61.667491011280 +6557 0.6557 45.7768899791694182 61.743650693280 +6558 0.6558 45.7707118077895601 61.819776903930 +6559 0.6559 45.7645260254633968 61.895869619350 +6560 0.6560 45.7583326355416418 61.971928815700 +6561 0.6561 45.7521316413773960 62.047954469240 +6562 0.6562 45.7459230463261193 62.123946556330 +6563 0.6563 45.7397068537456306 62.199905053400 +6564 0.6564 45.7334830669961150 62.275829936940 +6565 0.6565 45.7272516894400880 62.351721183550 +6566 0.6566 45.7210127244424172 62.427578769900 +6567 0.6567 45.7147661753702863 62.503402672760 +6568 0.6568 45.7085120455932028 62.579192868950 +6569 0.6569 45.7022503384829832 62.654949335390 +6570 0.6570 45.6959810574137606 62.730672049090 +6571 0.6571 45.6897042057619487 62.806360987110 +6572 0.6572 45.6834197869062635 62.882016126630 +6573 0.6573 45.6771278042276876 62.957637444860 +6574 0.6574 45.6708282611094845 63.033224919160 +6575 0.6575 45.6645211609371842 63.108778526910 +6576 0.6576 45.6582065070985621 63.184298245600 +6577 0.6577 45.6518843029836390 63.259784052800 +6578 0.6578 45.6455545519846950 63.335235926140 +6579 0.6579 45.6392172574962203 63.410653843340 +6580 0.6580 45.6328724229149429 63.486037782220 +6581 0.6581 45.6265200516398011 63.561387720660 +6582 0.6582 45.6201601470719353 63.636703636620 +6583 0.6583 45.6137927126146963 63.711985508130 +6584 0.6584 45.6074177516736228 63.787233313330 +6585 0.6585 45.6010352676564352 63.862447030400 +6586 0.6586 45.5946452639730353 63.937626637650 +6587 0.6587 45.5882477440354847 64.012772113410 +6588 0.6588 45.5818427112580054 64.087883436150 +6589 0.6589 45.5754301690569790 64.162960584350 +6590 0.6590 45.5690101208509333 64.238003536630 +6591 0.6591 45.5625825700605205 64.313012271660 +6592 0.6592 45.5561475201085315 64.387986768190 +6593 0.6593 45.5497049744198677 64.462927005050 +6594 0.6594 45.5432549364215546 64.537832961160 +6595 0.6595 45.5367974095427215 64.612704615490 +6596 0.6596 45.5303323972145932 64.687541947100 +6597 0.6597 45.5238599028704840 64.762344935150 +6598 0.6598 45.5173799299457826 64.837113558860 +6599 0.6599 45.5108924818779670 64.911847797520 +6600 0.6600 45.5043975621065684 64.986547630510 +6601 0.6601 45.4978951740731787 65.061213037280 +6602 0.6602 45.4913853212214505 65.135843997350 +6603 0.6603 45.4848680069970683 65.210440490350 +6604 0.6604 45.4783432348477561 65.285002495940 +6605 0.6605 45.4718110082232627 65.359529993890 +6606 0.6606 45.4652713305753693 65.434022964040 +6607 0.6607 45.4587242053578535 65.508481386300 +6608 0.6608 45.4521696360265040 65.582905240660 +6609 0.6609 45.4456076260391129 65.657294507190 +6610 0.6610 45.4390381788554549 65.731649166030 +6611 0.6611 45.4324612979372873 65.805969197390 +6612 0.6612 45.4258769867483423 65.880254581570 +6613 0.6613 45.4192852487543135 65.954505298940 +6614 0.6614 45.4126860874228697 66.028721329960 +6615 0.6615 45.4060795062236124 66.102902655130 +6616 0.6616 45.3994655086281043 66.177049255050 +6617 0.6617 45.3928440981098333 66.251161110400 +6618 0.6618 45.3862152781442134 66.325238201930 +6619 0.6619 45.3795790522085909 66.399280510450 +6620 0.6620 45.3729354237822236 66.473288016880 +6621 0.6621 45.3662843963462734 66.547260702160 +6622 0.6622 45.3596259733837996 66.621198547360 +6623 0.6623 45.3529601583797515 66.695101533580 +6624 0.6624 45.3462869548209682 66.768969642040 +6625 0.6625 45.3396063661961648 66.842802854010 +6626 0.6626 45.3329183959959252 66.916601150810 +6627 0.6627 45.3262230477126877 66.990364513880 +6628 0.6628 45.3195203248407594 67.064092924710 +6629 0.6629 45.3128102308762806 67.137786364850 +6630 0.6630 45.3060927693172388 67.211444815960 +6631 0.6631 45.2993679436634551 67.285068259750 +6632 0.6632 45.2926357574165692 67.358656677980 +6633 0.6633 45.2858962140800401 67.432210052560 +6634 0.6634 45.2791493171591455 67.505728365390 +6635 0.6635 45.2723950701609539 67.579211598480 +6636 0.6636 45.2656334765943313 67.652659733920 +6637 0.6637 45.2588645399699416 67.726072753850 +6638 0.6638 45.2520882638002249 67.799450640500 +6639 0.6639 45.2453046515993904 67.872793376180 +6640 0.6640 45.2385137068834169 67.946100943260 +6641 0.6641 45.2317154331700451 68.019373324170 +6642 0.6642 45.2249098339787636 68.092610501430 +6643 0.6643 45.2180969128308092 68.165812457630 +6644 0.6644 45.2112766732491593 68.238979175430 +6645 0.6645 45.2044491187585109 68.312110637570 +6646 0.6646 45.1976142528852876 68.385206826850 +6647 0.6647 45.1907720791576395 68.458267726120 +6648 0.6648 45.1839226011054151 68.531293318380 +6649 0.6649 45.1770658222601682 68.604283586600 +6650 0.6650 45.1702017461551435 68.677238513880 +6651 0.6651 45.1633303763252769 68.750158083410 +6652 0.6652 45.1564517163071883 68.823042278390 +6653 0.6653 45.1495657696391604 68.895891082150 +6654 0.6654 45.1426725398611524 68.968704478050 +6655 0.6655 45.1357720305147723 69.041482449530 +6656 0.6656 45.1288642451432906 69.114224980110 +6657 0.6657 45.1219491872916123 69.186932053390 +6658 0.6658 45.1150268605062905 69.259603653020 +6659 0.6659 45.1080972683355057 69.332239762720 +6660 0.6660 45.1011604143290512 69.404840366300 +6661 0.6661 45.0942163020383546 69.477405447610 +6662 0.6662 45.0872649350164423 69.549934990620 +6663 0.6663 45.0803063168179463 69.622428979300 +6664 0.6664 45.0733404509990905 69.694887397760 +6665 0.6665 45.0663673411176973 69.767310230130 +6666 0.6666 45.0593869907331595 69.839697460630 +6667 0.6667 45.0523994034064543 69.912049073540 +6668 0.6668 45.0454045827001153 69.984365053230 +6669 0.6669 45.0384025321782460 70.056645384120 +6670 0.6670 45.0313932554065062 70.128890050700 +6671 0.6671 45.0243767559520975 70.201099037540 +6672 0.6672 45.0173530373837565 70.273272329270 +6673 0.6673 45.0103221032717613 70.345409910590 +6674 0.6674 45.0032839571879180 70.417511766270 +6675 0.6675 44.9962386027055459 70.489577881140 +6676 0.6676 44.9891860433994850 70.561608240120 +6677 0.6677 44.9821262828460675 70.633602828180 +6678 0.6678 44.9750593246231389 70.705561630360 +6679 0.6679 44.9679851723100299 70.777484631770 +6680 0.6680 44.9609038294875631 70.849371817610 +6681 0.6681 44.9538152997380251 70.921223173100 +6682 0.6682 44.9467195866451945 70.993038683570 +6683 0.6683 44.9396166937942994 71.064818334390 +6684 0.6684 44.9325066247720315 71.136562111020 +6685 0.6685 44.9253893831665323 71.208269998990 +6686 0.6686 44.9182649725673926 71.279941983870 +6687 0.6687 44.9111333965656314 71.351578051300 +6688 0.6688 44.9039946587537173 71.423178187030 +6689 0.6689 44.8968487627255257 71.494742376830 +6690 0.6690 44.8896957120763602 71.566270606540 +6691 0.6691 44.8825355104029242 71.637762862110 +6692 0.6692 44.8753681613033422 71.709219129500 +6693 0.6693 44.8681936683771312 71.780639394780 +6694 0.6694 44.8610120352251869 71.852023644060 +6695 0.6695 44.8538232654498046 71.923371863540 +6696 0.6696 44.8466273626546581 71.994684039460 +6697 0.6697 44.8394243304447784 72.065960158140 +6698 0.6698 44.8322141724265748 72.137200205970 +6699 0.6699 44.8249968922078068 72.208404169400 +6700 0.6700 44.8177724933975909 72.279572034950 +6701 0.6701 44.8105409796063867 72.350703789190 +6702 0.6702 44.8033023544459894 72.421799418780 +6703 0.6703 44.7960566215295302 72.492858910430 +6704 0.6704 44.7888037844714617 72.563882250910 +6705 0.6705 44.7815438468875655 72.634869427080 +6706 0.6706 44.7742768123949233 72.705820425830 +6707 0.6707 44.7670026846119242 72.776735234160 +6708 0.6708 44.7597214671582648 72.847613839090 +6709 0.6709 44.7524331636549277 72.918456227720 +6710 0.6710 44.7451377777241817 72.989262387240 +6711 0.6711 44.7378353129895743 73.060032304870 +6712 0.6712 44.7305257730759322 73.130765967910 +6713 0.6713 44.7232091616093541 73.201463363720 +6714 0.6714 44.7158854822171818 73.272124479730 +6715 0.6715 44.7085547385280222 73.342749303430 +6716 0.6716 44.7012169341717325 73.413337822380 +6717 0.6717 44.6938720727794063 73.483890024190 +6718 0.6718 44.6865201579833666 73.554405896550 +6719 0.6719 44.6791611934171797 73.624885427210 +6720 0.6720 44.6717951827156199 73.695328603980 +6721 0.6721 44.6644221295146835 73.765735414730 +6722 0.6722 44.6570420374515749 73.836105847400 +6723 0.6723 44.6496549101647062 73.906439889980 +6724 0.6724 44.6422607512936764 73.976737530560 +6725 0.6725 44.6348595644792852 74.046998757240 +6726 0.6726 44.6274513533635115 74.117223558240 +6727 0.6727 44.6200361215895072 74.187411921780 +6728 0.6728 44.6126138728016102 74.257563836210 +6729 0.6729 44.6051846106453027 74.327679289890 +6730 0.6730 44.5977483387672464 74.397758271260 +6731 0.6731 44.5903050608152398 74.467800768840 +6732 0.6732 44.5828547804382396 74.537806771190 +6733 0.6733 44.5753975012863322 74.607776266930 +6734 0.6734 44.5679332270107480 74.677709244770 +6735 0.6735 44.5604619612638402 74.747605693450 +6736 0.6736 44.5529837076990773 74.817465601780 +6737 0.6737 44.5454984699710579 74.887288958670 +6738 0.6738 44.5380062517354745 74.957075753020 +6739 0.6739 44.5305070566491281 75.026825973860 +6740 0.6740 44.5230008883699213 75.096539610240 +6741 0.6741 44.5154877505568436 75.166216651280 +6742 0.6742 44.5079676468699716 75.235857086190 +6743 0.6743 44.5004405809704551 75.305460904200 +6744 0.6744 44.4929065565205164 75.375028094620 +6745 0.6745 44.4853655771834440 75.444558646810 +6746 0.6746 44.4778176466235919 75.514052550230 +6747 0.6747 44.4702627685063661 75.583509794340 +6748 0.6748 44.4627009464982166 75.652930368720 +6749 0.6749 44.4551321842666312 75.722314262970 +6750 0.6750 44.4475564854801419 75.791661466760 +6751 0.6751 44.4399738538083113 75.860971969830 +6752 0.6752 44.4323842929217179 75.930245761980 +6753 0.6753 44.4247878064919632 75.999482833060 +6754 0.6754 44.4171843981916652 76.068683172970 +6755 0.6755 44.4095740716944292 76.137846771730 +6756 0.6756 44.4019568306748766 76.206973619330 +6757 0.6757 44.3943326788086168 76.276063705900 +6758 0.6758 44.3867016197722393 76.345117021580 +6759 0.6759 44.3790636572433286 76.414133556580 +6760 0.6760 44.3714187949004426 76.483113301190 +6761 0.6761 44.3637670364230985 76.552056245740 +6762 0.6762 44.3561083854917797 76.620962380610 +6763 0.6763 44.3484428457879361 76.689831696270 +6764 0.6764 44.3407704209939624 76.758664183230 +6765 0.6765 44.3330911147931985 76.827459832060 +6766 0.6766 44.3254049308699294 76.896218633380 +6767 0.6767 44.3177118729093635 76.964940577910 +6768 0.6768 44.3100119445976475 77.033625656380 +6769 0.6769 44.3023051496218514 77.102273859590 +6770 0.6770 44.2945914916699479 77.170885178420 +6771 0.6771 44.2868709744308404 77.239459603780 +6772 0.6772 44.2791436015943205 77.307997126670 +6773 0.6773 44.2714093768510821 77.376497738130 +6774 0.6774 44.2636683038927146 77.444961429250 +6775 0.6775 44.2559203864116952 77.513388191190 +6776 0.6776 44.2481656281013755 77.581778015180 +6777 0.6777 44.2404040326559951 77.650130892490 +6778 0.6778 44.2326356037706461 77.718446814430 +6779 0.6779 44.2248603451413018 77.786725772420 +6780 0.6780 44.2170782604647883 77.854967757900 +6781 0.6781 44.2092893534387770 77.923172762360 +6782 0.6782 44.2014936277617920 77.991340777380 +6783 0.6783 44.1936910871331960 78.059471794580 +6784 0.6784 44.1858817352531830 78.127565805620 +6785 0.6785 44.1780655758227923 78.195622802260 +6786 0.6786 44.1702426125438663 78.263642776270 +6787 0.6787 44.1624128491190788 78.331625719510 +6788 0.6788 44.1545762892519065 78.399571623900 +6789 0.6789 44.1467329366466430 78.467480481370 +6790 0.6790 44.1388827950083780 78.535352283970 +6791 0.6791 44.1310258680429897 78.603187023760 +6792 0.6792 44.1231621594571592 78.670984692880 +6793 0.6793 44.1152916729583424 78.738745283510 +6794 0.6794 44.1074144122547693 78.806468787910 +6795 0.6795 44.0995303810554518 78.874155198380 +6796 0.6796 44.0916395830701688 78.941804507270 +6797 0.6797 44.0837420220094529 79.009416707000 +6798 0.6798 44.0758377015846037 79.076991790040 +6799 0.6799 44.0679266255076598 79.144529748900 +6800 0.6800 44.0600087974914061 79.212030576200 +6801 0.6801 44.0520842212493662 79.279494264540 +6802 0.6802 44.0441529004958099 79.346920806640 +6803 0.6803 44.0362148389457175 79.414310195240 +6804 0.6804 44.0282700403148013 79.481662423140 +6805 0.6805 44.0203185083194839 79.548977483200 +6806 0.6806 44.0123602466769057 79.616255368350 +6807 0.6807 44.0043952591049106 79.683496071540 +6808 0.6808 43.9964235493220457 79.750699585800 +6809 0.6809 43.9884451210475476 79.817865904230 +6810 0.6810 43.9804599780013419 79.884995019940 +6811 0.6811 43.9724681239040365 79.952086926150 +6812 0.6812 43.9644695624769284 80.019141616070 +6813 0.6813 43.9564642974419755 80.086159083010 +6814 0.6814 43.9484523325218106 80.153139320350 +6815 0.6815 43.9404336714397203 80.220082321470 +6816 0.6816 43.9324083179196521 80.286988079840 +6817 0.6817 43.9243762756862139 80.353856588990 +6818 0.6818 43.9163375484646394 80.420687842470 +6819 0.6819 43.9082921399808228 80.487481833920 +6820 0.6820 43.9002400539612765 80.554238557020 +6821 0.6821 43.8921812941331524 80.620958005490 +6822 0.6822 43.8841158642242206 80.687640173140 +6823 0.6823 43.8760437679628765 80.754285053790 +6824 0.6824 43.8679650090781195 80.820892641340 +6825 0.6825 43.8598795912995669 80.887462929750 +6826 0.6826 43.8517875183574262 80.953995913010 +6827 0.6827 43.8436887939825155 81.020491585180 +6828 0.6828 43.8355834219062359 81.086949940370 +6829 0.6829 43.8274714058605781 81.153370972730 +6830 0.6830 43.8193527495781154 81.219754676480 +6831 0.6831 43.8112274567919968 81.286101045890 +6832 0.6832 43.8030955312359396 81.352410075280 +6833 0.6833 43.7949569766442224 81.418681759030 +6834 0.6834 43.7868117967516923 81.484916091560 +6835 0.6835 43.7786599952937436 81.551113067350 +6836 0.6836 43.7705015760063318 81.617272680920 +6837 0.6837 43.7623365426259454 81.683394926870 +6838 0.6838 43.7541648988896128 81.749479799830 +6839 0.6839 43.7459866485348954 81.815527294498 +6840 0.6840 43.7378017952998874 81.881537405591 +6841 0.6841 43.7296103429232090 81.947510127929 +6842 0.6842 43.7214122951439990 82.013445456333 +6843 0.6843 43.7132076557018934 82.079343385717 +6844 0.6844 43.7049964283370542 82.145203911021 +6845 0.6845 43.6967786167901409 82.211027027253 +6846 0.6846 43.6885542248023029 82.276812729467 +6847 0.6847 43.6803232561151944 82.342561012753 +6848 0.6848 43.6720857144709456 82.408271872269 +6849 0.6849 43.6638416036121697 82.473945303232 +6850 0.6850 43.6555909272819633 82.539581300902 +6851 0.6851 43.6473336892238919 82.605179860580 +6852 0.6852 43.6390698931819827 82.670740977621 +6853 0.6853 43.6307995429007320 82.736264647449 +6854 0.6854 43.6225226421250838 82.801750865516 +6855 0.6855 43.6142391946004437 82.867199627350 +6856 0.6856 43.6059492040726511 82.932610928499 +6857 0.6857 43.5976526742879997 82.997984764594 +6858 0.6858 43.5893496089932029 83.063321131287 +6859 0.6859 43.5810400119354213 83.128620024308 +6860 0.6860 43.5727238868622351 83.193881439403 +6861 0.6861 43.5644012375216434 83.259105372417 +6862 0.6862 43.5560720676620647 83.324291819195 +6863 0.6863 43.5477363810323226 83.389440775667 +6864 0.6864 43.5393941813816525 83.454552237791 +6865 0.6865 43.5310454724596809 83.519626201606 +6866 0.6866 43.5226902580164463 83.584662663157 +6867 0.6867 43.5143285418023567 83.649661618567 +6868 0.6868 43.5059603275682250 83.714623064010 +6869 0.6869 43.4975856190652408 83.779546995706 +6870 0.6870 43.4892044200449632 83.844433409913 +6871 0.6871 43.4808167342593208 83.909282302952 +6872 0.6872 43.4724225654606116 83.974093671200 +6873 0.6873 43.4640219174014959 84.038867511049 +6874 0.6874 43.4556147938349966 84.103603818988 +6875 0.6875 43.4472011985144704 84.168302591507 +6876 0.6876 43.4387811351936364 84.232963825191 +6877 0.6877 43.4303546076265476 84.297587516651 +6878 0.6878 43.4219216195675912 84.362173662537 +6879 0.6879 43.4134821747714881 84.426722259558 +6880 0.6880 43.4050362769932860 84.491233304487 +6881 0.6881 43.3965839299883527 84.555706794121 +6882 0.6882 43.3881251375123824 84.620142725319 +6883 0.6883 43.3796599033213681 84.684541094987 +6884 0.6884 43.3711882311716153 84.748901900083 +6885 0.6885 43.3627101248197278 84.813225137606 +6886 0.6886 43.3542255880226151 84.877510804590 +6887 0.6887 43.3457346245374779 84.941758898165 +6888 0.6888 43.3372372381217943 85.005969415455 +6889 0.6889 43.3287334325333404 85.070142353658 +6890 0.6890 43.3202232115301555 85.134277710019 +6891 0.6891 43.3117065788705631 85.198375481837 +6892 0.6892 43.3031835383131494 85.262435666438 +6893 0.6893 43.2946540936167636 85.326458261210 +6894 0.6894 43.2861182485405251 85.390443263591 +6895 0.6895 43.2775760068437947 85.454390671068 +6896 0.6896 43.2690273722861818 85.518300481160 +6897 0.6897 43.2604723486275518 85.582172691448 +6898 0.6898 43.2519109396280044 85.646007299549 +6899 0.6899 43.2433431490478668 85.709804303144 +6900 0.6900 43.2347689806477149 85.773563699946 +6901 0.6901 43.2261884381883306 85.837285487725 +6902 0.6902 43.2176015254307302 85.900969664287 +6903 0.6903 43.2090082461361433 85.964616227504 +6904 0.6904 43.2004086040660056 86.028225175263 +6905 0.6905 43.1918026029819657 86.091796505530 +6906 0.6906 43.1831902466458715 86.155330216302 +6907 0.6907 43.1745715388197766 86.218826305628 +6908 0.6908 43.1659464832659125 86.282284771599 +6909 0.6909 43.1573150837467168 86.345705612347 +6910 0.6910 43.1486773440247973 86.409088826064 +6911 0.6911 43.1400332678629468 86.472434410986 +6912 0.6912 43.1313828590241286 86.535742365390 +6913 0.6913 43.1227261212714765 86.599012687594 +6914 0.6914 43.1140630583682949 86.662245375979 +6915 0.6915 43.1053936740780514 86.725440428945 +6916 0.6916 43.0967179721643561 86.788597844978 +6917 0.6917 43.0880359563909821 86.851717622562 +6918 0.6918 43.0793476305218377 86.914799760268 +6919 0.6919 43.0706529983209876 86.977844256683 +6920 0.6920 43.0619520635526314 87.040851110473 +6921 0.6921 43.0532448299810895 87.103820320301 +6922 0.6922 43.0445313013708315 87.166751884926 +6923 0.6923 43.0358114814864265 87.229645803126 +6924 0.6924 43.0270853740925858 87.292502073714 +6925 0.6925 43.0183529829541200 87.355320695575 +6926 0.6926 43.0096143118359606 87.418101667626 +6927 0.6927 43.0008693645031386 87.480844988830 +6928 0.6928 42.9921181447207914 87.543550658176 +6929 0.6929 42.9833606562541419 87.606218674743 +6930 0.6930 42.9745969028685266 87.668849037618 +6931 0.6931 42.9658268883293459 87.731441745936 +6932 0.6932 42.9570506164021069 87.793996798901 +6933 0.6933 42.9482680908523733 87.856514195721 +6934 0.6934 42.9394793154458014 87.918993935688 +6935 0.6935 42.9306842939481115 87.981436018117 +6936 0.6936 42.9218830301250875 88.043840442366 +6937 0.6937 42.9130755277425777 88.106207207868 +6938 0.6938 42.9042617905664798 88.168536314048 +6939 0.6939 42.8954418223627556 88.230827760415 +6940 0.6940 42.8866156268974095 88.293081546511 +6941 0.6941 42.8777832079364885 88.355297671923 +6942 0.6942 42.8689445692460822 88.417476136272 +6943 0.6943 42.8600997145923088 88.479616939241 +6944 0.6944 42.8512486477413219 88.541720080540 +6945 0.6945 42.8423913724592964 88.603785559940 +6946 0.6946 42.8335278925124356 88.665813377227 +6947 0.6947 42.8246582116669643 88.727803532264 +6948 0.6948 42.8157823336891070 88.789756024932 +6949 0.6949 42.8069002623451027 88.851670855183 +6950 0.6950 42.7980120014011973 88.913548022971 +6951 0.6951 42.7891175546236298 88.975387528332 +6952 0.6952 42.7802169257786460 89.037189371330 +6953 0.6953 42.7713101186324778 89.098953552071 +6954 0.6954 42.7623971369513356 89.160680070709 +6955 0.6955 42.7534779845014299 89.222368927419 +6956 0.6956 42.7445526650489356 89.284020122462 +6957 0.6957 42.7356211823600063 89.345633656105 +6958 0.6958 42.7266835402007672 89.407209528669 +6959 0.6959 42.7177397423373080 89.468747740521 +6960 0.6960 42.7087897925356756 89.530248292062 +6961 0.6961 42.6998336945618817 89.591711183760 +6962 0.6962 42.6908714521818879 89.653136416085 +6963 0.6963 42.6819030691616064 89.714523989585 +6964 0.6964 42.6729285492668851 89.775873904823 +6965 0.6965 42.6639478962635224 89.837186162437 +6966 0.6966 42.6549611139172455 89.898460763082 +6967 0.6967 42.6459682059937180 89.959697707444 +6968 0.6968 42.6369691762585319 90.020896996290 +6969 0.6969 42.6279640284771943 90.082058630399 +6970 0.6970 42.6189527664151413 90.143182610599 +6971 0.6971 42.6099353938377234 90.204268937752 +6972 0.6972 42.6009119145101991 90.265317612787 +6973 0.6973 42.5918823321977271 90.326328636656 +6974 0.6974 42.5828466506653740 90.387302010343 +6975 0.6975 42.5738048736781138 90.448237734891 +6976 0.6976 42.5647570050007999 90.509135811375 +6977 0.6977 42.5557030483981862 90.569996240925 +6978 0.6978 42.5466430076349056 90.630819024693 +6979 0.6979 42.5375768864754775 90.691604163882 +6980 0.6980 42.5285046886842935 90.752351659733 +6981 0.6981 42.5194264180256312 90.813061513539 +6982 0.6982 42.5103420782636263 90.873733726623 +6983 0.6983 42.5012516731622796 90.934368300351 +6984 0.6984 42.4921552064854566 90.994965236119 +6985 0.6985 42.4830526819968810 91.055524535401 +6986 0.6986 42.4739441034601271 91.116046199654 +6987 0.6987 42.4648294746386199 91.176530230435 +6988 0.6988 42.4557087992956355 91.236976629296 +6989 0.6989 42.4465820811942791 91.297385397849 +6990 0.6990 42.4374493240974999 91.357756537759 +6991 0.6991 42.4283105317680764 91.418090050703 +6992 0.6992 42.4191657079686237 91.478385938412 +6993 0.6993 42.4100148564615722 91.538644202675 +6994 0.6994 42.4008579810091746 91.598864845279 +6995 0.6995 42.3916950853735059 91.659047868100 +6996 0.6996 42.3825261733164496 91.719193273008 +6997 0.6997 42.3733512485997039 91.779301061955 +6998 0.6998 42.3641703149847615 91.839371236896 +6999 0.6999 42.3549833762329229 91.899403799857 +7000 0.7000 42.3457904361052826 91.959398752883 +7001 0.7001 42.3365914983627363 92.019356098057 +7002 0.7002 42.3273865667659592 92.079275837520 +7003 0.7003 42.3181756450754136 92.139157973439 +7004 0.7004 42.3089587370513414 92.199002508024 +7005 0.7005 42.2997358464537641 92.258809443523 +7006 0.7006 42.2905069770424760 92.318578782226 +7007 0.7007 42.2812721325770440 92.378310526457 +7008 0.7008 42.2720313168167934 92.438004678588 +7009 0.7009 42.2627845335208150 92.497661241020 +7010 0.7010 42.2535317864479509 92.557280216198 +7011 0.7011 42.2442730793568089 92.616861606608 +7012 0.7012 42.2350084160057406 92.676405414772 +7013 0.7013 42.2257378001528423 92.735911643252 +7014 0.7014 42.2164612355559470 92.795380294647 +7015 0.7015 42.2071787259726321 92.854811371598 +7016 0.7016 42.1978902751602121 92.914204876780 +7017 0.7017 42.1885958868757243 92.973560812910 +7018 0.7018 42.1792955648759431 93.032879182746 +7019 0.7019 42.1699893129173518 93.092159989077 +7020 0.7020 42.1606771347561633 93.151403234736 +7021 0.7021 42.1513590341482995 93.210608922592 +7022 0.7022 42.1420350148493910 93.269777055555 +7023 0.7023 42.1327050806147838 93.328907636571 +7024 0.7024 42.1233692351995259 93.388000668623 +7025 0.7025 42.1140274823583596 93.447056154733 +7026 0.7026 42.1046798258457216 93.506074097962 +7027 0.7027 42.0953262694157502 93.565054501407 +7028 0.7028 42.0859668168222711 93.623997368206 +7029 0.7029 42.0766014718187833 93.682902701532 +7030 0.7030 42.0672302381584799 93.741770504597 +7031 0.7031 42.0578531195942205 93.800600780650 +7032 0.7032 42.0484701198785373 93.859393532976 +7033 0.7033 42.0390812427636433 93.918148764902 +7034 0.7034 42.0296864920014102 93.976866479787 +7035 0.7035 42.0202858713433685 94.035546681032 +7036 0.7036 42.0108793845407149 94.094189372071 +7037 0.7037 42.0014670353442909 94.152794556379 +7038 0.7038 41.9920488275045969 94.211362237468 +7039 0.7039 41.9826247647717778 94.269892418884 +7040 0.7040 41.9731948508956236 94.328385104212 +7041 0.7041 41.9637590896255617 94.386840297074 +7042 0.7042 41.9543174847106499 94.445258001129 +7043 0.7043 41.9448700398995911 94.503638220072 +7044 0.7044 41.9354167589407041 94.561980957636 +7045 0.7045 41.9259576455819456 94.620286217589 +7046 0.7046 41.9164927035708814 94.678554003737 +7047 0.7047 41.9070219366547008 94.736784319924 +7048 0.7048 41.8975453485802021 94.794977170031 +7049 0.7049 41.8880629430938001 94.853132557966 +7050 0.7050 41.8785747239415187 94.911250487685 +7051 0.7051 41.8690806948689769 94.969330963176 +7052 0.7052 41.8595808596213956 95.027373988462 +7053 0.7053 41.8500752219435910 95.085379567606 +7054 0.7054 41.8405637855799739 95.143347704702 +7055 0.7055 41.8310465542745433 95.201278403885 +7056 0.7056 41.8215235317708860 95.259171669322 +7057 0.7057 41.8119947218121624 95.317027505216 +7058 0.7058 41.8024601281411137 95.374845915812 +7059 0.7059 41.7929197545000548 95.432626905384 +7060 0.7060 41.7833736046308744 95.490370478243 +7061 0.7061 41.7738216822750275 95.548076638738 +7062 0.7062 41.7642639911735287 95.605745391253 +7063 0.7063 41.7547005350669522 95.663376740206 +7064 0.7064 41.7451313176954386 95.720970690051 +7065 0.7065 41.7355563427986738 95.778527245280 +7066 0.7066 41.7259756141158888 95.836046410415 +7067 0.7067 41.7163891353858673 95.893528190018 +7068 0.7068 41.7067969103469309 95.950972588688 +7069 0.7069 41.6971989427369465 96.008379611053 +7070 0.7070 41.6875952362933049 96.065749261779 +7071 0.7071 41.6779857947529351 96.123081545569 +7072 0.7072 41.6683706218522971 96.180376467159 +7073 0.7073 41.6587497213273750 96.237634031316 +7074 0.7074 41.6491230969136694 96.294854242853 +7075 0.7075 41.6394907523461981 96.352037106607 +7076 0.7076 41.6298526913594955 96.409182627452 +7077 0.7077 41.6202089176876058 96.466290810302 +7078 0.7078 41.6105594350640828 96.523361660099 +7079 0.7079 41.6009042472219832 96.580395181825 +7080 0.7080 41.5912433578938661 96.637391380493 +7081 0.7081 41.5815767708117860 96.694350261151 +7082 0.7082 41.5719044897072862 96.751271828882 +7083 0.7083 41.5622265183114052 96.808156088804 +7084 0.7084 41.5525428603546629 96.865003046067 +7085 0.7085 41.5428535195670676 96.921812705858 +7086 0.7086 41.5331584996781018 96.978585073397 +7087 0.7087 41.5234578044167364 97.035320153936 +7088 0.7088 41.5137514375114023 97.092017952767 +7089 0.7089 41.5040394026900046 97.148678475206 +7090 0.7090 41.4943217036799155 97.205301726613 +7091 0.7091 41.4845983442079671 97.261887712377 +7092 0.7092 41.4748693280004517 97.318436437920 +7093 0.7093 41.4651346587831213 97.374947908699 +7094 0.7094 41.4553943402811740 97.431422130207 +7095 0.7095 41.4456483762192676 97.487859107965 +7096 0.7096 41.4358967703214915 97.544258847534 +7097 0.7097 41.4261395263113883 97.600621354505 +7098 0.7098 41.4163766479119388 97.656946634500 +7099 0.7099 41.4066081388455558 97.713234693179 +7100 0.7100 41.3968340028340833 97.769485536235 +7101 0.7101 41.3870542435988042 97.825699169390 +7102 0.7102 41.3772688648604117 97.881875598402 +7103 0.7103 41.3674778703390373 97.938014829064 +7104 0.7104 41.3576812637542233 97.994116867198 +7105 0.7105 41.3478790488249288 98.050181718662 +7106 0.7106 41.3380712292695307 98.106209389346 +7107 0.7107 41.3282578088058017 98.162199885173 +7108 0.7108 41.3184387911509390 98.218153212097 +7109 0.7109 41.3086141800215287 98.274069376107 +7110 0.7110 41.2987839791335603 98.329948383225 +7111 0.7111 41.2889481922024260 98.385790239506 +7112 0.7112 41.2791068229429001 98.441594951033 +7113 0.7113 41.2692598750691531 98.497362523927 +7114 0.7114 41.2594073522947369 98.553092964339 +7115 0.7115 41.2495492583325998 98.608786278452 +7116 0.7116 41.2396855968950504 98.664442472483 +7117 0.7117 41.2298163716937935 98.720061552682 +7118 0.7118 41.2199415864398944 98.775643525327 +7119 0.7119 41.2100612448437928 98.831188396730 +7120 0.7120 41.2001753506152966 98.886696173239 +7121 0.7121 41.1902839074635736 98.942166861229 +7122 0.7122 41.1803869190971596 98.997600467108 +7123 0.7123 41.1704843892239367 99.052996997321 +7124 0.7124 41.1605763215511544 99.108356458336 +7125 0.7125 41.1506627197854016 99.163678856660 +7126 0.7126 41.1407435876326275 99.218964198830 +7127 0.7127 41.1308189287981136 99.274212491414 +7128 0.7128 41.1208887469864948 99.329423741011 +7129 0.7129 41.1109530459017307 99.384597954252 +7130 0.7130 41.1010118292471276 99.439735137801 +7131 0.7131 41.0910651007253165 99.494835298352 +7132 0.7132 41.0811128640382677 99.549898442631 +7133 0.7133 41.0711551228872693 99.604924577395 +7134 0.7134 41.0611918809729275 99.659913709433 +7135 0.7135 41.0512231419951803 99.714865845564 +7136 0.7136 41.0412489096532695 99.769780992639 +7137 0.7137 41.0312691876457620 99.824659157542 +7138 0.7138 41.0212839796705282 99.879500347184 +7139 0.7139 41.0112932894247422 99.934304568512 +7140 0.7140 41.0012971206048888 99.989071828499 +7141 0.7141 40.9912954769067568 100.043802134151 +7142 0.7142 40.9812883620254240 100.098495492507 +7143 0.7143 40.9712757796552651 100.153151910634 +7144 0.7144 40.9612577334899512 100.207771395629 +7145 0.7145 40.9512342272224359 100.262353954623 +7146 0.7146 40.9412052645449691 100.316899594776 +7147 0.7147 40.9311708491490691 100.371408323279 +7148 0.7148 40.9211309847255365 100.425880147352 +7149 0.7149 40.9110856749644540 100.480315074247 +7150 0.7150 40.9010349235551800 100.534713111248 +7151 0.7151 40.8909787341863336 100.589074265662 +7152 0.7152 40.8809171105458091 100.643398544837 +7153 0.7153 40.8708500563207622 100.697685956143 +7154 0.7154 40.8607775751976092 100.751936506983 +7155 0.7155 40.8506996708620207 100.806150204794 +7156 0.7156 40.8406163469989281 100.860327057035 +7157 0.7157 40.8305276072925167 100.914467071202 +7158 0.7158 40.8204334554262189 100.968570254817 +7159 0.7159 40.8103338950827066 101.022636615436 +7160 0.7160 40.8002289299439056 101.076666160638 +7161 0.7161 40.7901185636909744 101.130658898038 +7162 0.7162 40.7800028000043113 101.184614835278 +7163 0.7163 40.7698816425635471 101.238533980032 +7164 0.7164 40.7597550950475451 101.292416340002 +7165 0.7165 40.7496231611344015 101.346261922918 +7166 0.7166 40.7394858445014307 101.400070736543 +7167 0.7167 40.7293431488251727 101.453842788666 +7168 0.7168 40.7191950777813858 101.507578087109 +7169 0.7169 40.7090416350450468 101.561276639722 +7170 0.7170 40.6988828242903438 101.614938454382 +7171 0.7171 40.6887186491906760 101.668563538997 +7172 0.7172 40.6785491134186543 101.722151901506 +7173 0.7173 40.6683742206460863 101.775703549876 +7174 0.7174 40.6581939745439840 101.829218492100 +7175 0.7175 40.6480083787825706 101.882696736206 +7176 0.7176 40.6378174370312450 101.936138290244 +7177 0.7177 40.6276211529586178 101.989543162300 +7178 0.7178 40.6174195302324819 102.042911360483 +7179 0.7179 40.6072125725198134 102.096242892938 +7180 0.7180 40.5970002834867785 102.149537767829 +7181 0.7181 40.5867826667987188 102.202795993356 +7182 0.7182 40.5765597261201663 102.256017577746 +7183 0.7183 40.5663314651148141 102.309202529254 +7184 0.7184 40.5560978874455458 102.362350856166 +7185 0.7185 40.5458589967743990 102.415462566790 +7186 0.7186 40.5356147967625873 102.468537669471 +7187 0.7187 40.5253652910704858 102.521576172576 +7188 0.7188 40.5151104833576312 102.574578084505 +7189 0.7189 40.5048503772827218 102.627543413683 +7190 0.7190 40.4945849765036101 102.680472168563 +7191 0.7191 40.4843142846773034 102.733364357629 +7192 0.7192 40.4740383054599491 102.786219989390 +7193 0.7193 40.4637570425068631 102.839039072388 +7194 0.7194 40.4534704994724876 102.891821615185 +7195 0.7195 40.4431786800104121 102.944567626381 +7196 0.7196 40.4328815877733660 102.997277114597 +7197 0.7197 40.4225792264132124 103.049950088483 +7198 0.7198 40.4122715995809543 103.102586556718 +7199 0.7199 40.4019587109267206 103.155186528011 +7200 0.7200 40.3916405640997667 103.207750011092 +7201 0.7201 40.3813171627484735 103.260277014725 +7202 0.7202 40.3709885105203554 103.312767547699 +7203 0.7203 40.3606546110620314 103.365221618830 +7204 0.7204 40.3503154680192395 103.417639236965 +7205 0.7205 40.3399710850368436 103.470020410975 +7206 0.7206 40.3296214657588052 103.522365149761 +7207 0.7207 40.3192666138282050 103.574673462247 +7208 0.7208 40.3089065328872209 103.626945357392 +7209 0.7209 40.2985412265771430 103.679180844173 +7210 0.7210 40.2881706985383516 103.731379931602 +7211 0.7211 40.2777949524103391 103.783542628713 +7212 0.7212 40.2674139918316740 103.835668944570 +7213 0.7213 40.2570278204400296 103.887758888265 +7214 0.7214 40.2466364418721696 103.939812468912 +7215 0.7215 40.2362398597639412 103.991829695660 +7216 0.7216 40.2258380777502751 104.043810577674 +7217 0.7217 40.2154310994651851 104.095755124157 +7218 0.7218 40.2050189285417616 104.147663344334 +7219 0.7219 40.1946015686121711 104.199535247456 +7220 0.7220 40.1841790233076566 104.251370842800 +7221 0.7221 40.1737512962585299 104.303170139673 +7222 0.7222 40.1633183910941725 104.354933147407 +7223 0.7223 40.1528803114430346 104.406659875358 +7224 0.7224 40.1424370609326218 104.458350332914 +7225 0.7225 40.1319886431895014 104.510004529486 +7226 0.7226 40.1215350618393032 104.561622474512 +7227 0.7227 40.1110763205067045 104.613204177454 +7228 0.7228 40.1006124228154448 104.664749647807 +7229 0.7229 40.0901433723882974 104.716258895085 +7230 0.7230 40.0796691728471046 104.767731928831 +7231 0.7231 40.0691898278127354 104.819168758615 +7232 0.7232 40.0587053409050995 104.870569394034 +7233 0.7233 40.0482157157431615 104.921933844708 +7234 0.7234 40.0377209559449128 104.973262120284 +7235 0.7235 40.0272210651273781 105.024554230439 +7236 0.7236 40.0167160469066161 105.075810184869 +7237 0.7237 40.0062059048977048 105.127029993304 +7238 0.7238 39.9956906427147629 105.178213665491 +7239 0.7239 39.9851702639709288 105.229361211210 +7240 0.7240 39.9746447722783529 105.280472640264 +7241 0.7241 39.9641141712482124 105.331547962481 +7242 0.7242 39.9535784644907039 105.382587187715 +7243 0.7243 39.9430376556150293 105.433590325846 +7244 0.7244 39.9324917482293955 105.484557386779 +7245 0.7245 39.9219407459410363 105.535488380446 +7246 0.7246 39.9113846523561762 105.586383316805 +7247 0.7247 39.9008234710800451 105.637242205837 +7248 0.7248 39.8902572057168783 105.688065057548 +7249 0.7249 39.8796858598699018 105.738851881973 +7250 0.7250 39.8691094371413470 105.789602689167 +7251 0.7251 39.8585279411324294 105.840317489217 +7252 0.7252 39.8479413754433551 105.890996292229 +7253 0.7253 39.8373497436733288 105.941639108336 +7254 0.7254 39.8267530494205246 105.992245947697 +7255 0.7255 39.8161512962821149 106.042816820496 +7256 0.7256 39.8055444878542417 106.093351736943 +7257 0.7257 39.7949326277320310 106.143850707271 +7258 0.7258 39.7843157195095785 106.194313741737 +7259 0.7259 39.7736937667799637 106.244740850625 +7260 0.7260 39.7630667731352219 106.295132044244 +7261 0.7261 39.7524347421663649 106.345487332926 +7262 0.7262 39.7417976774633672 106.395806727029 +7263 0.7263 39.7311555826151661 106.446090236936 +7264 0.7264 39.7205084612096684 106.496337873052 +7265 0.7265 39.7098563168337222 106.546549645811 +7266 0.7266 39.6991991530731454 106.596725565668 +7267 0.7267 39.6885369735127043 106.646865643102 +7268 0.7268 39.6778697817361206 106.696969888619 +7269 0.7269 39.6671975813260502 106.747038312749 +7270 0.7270 39.6565203758641118 106.797070926046 +7271 0.7271 39.6458381689308581 106.847067739088 +7272 0.7272 39.6351509641057831 106.897028762474 +7273 0.7273 39.6244587649673150 106.946954006833 +7274 0.7274 39.6137615750928305 106.996843482814 +7275 0.7275 39.6030593980586332 107.046697201095 +7276 0.7276 39.5923522374399610 107.096515172372 +7277 0.7277 39.5816400968109718 107.146297407369 +7278 0.7278 39.5709229797447648 107.196043916831 +7279 0.7279 39.5602008898133448 107.245754711531 +7280 0.7280 39.5494738305876581 107.295429802262 +7281 0.7281 39.5387418056375495 107.345069199842 +7282 0.7282 39.5280048185318051 107.394672915115 +7283 0.7283 39.5172628728381028 107.444240958945 +7284 0.7284 39.5065159721230472 107.493773342222 +7285 0.7285 39.4957641199521419 107.543270075859 +7286 0.7286 39.4850073198898102 107.592731170795 +7287 0.7287 39.4742455754993742 107.642156637988 +7288 0.7288 39.4634788903430547 107.691546488422 +7289 0.7289 39.4527072679819781 107.740900733105 +7290 0.7290 39.4419307119761697 107.790219383071 +7291 0.7291 39.4311492258845462 107.839502449370 +7292 0.7292 39.4203628132649229 107.888749943079 +7293 0.7293 39.4095714776740067 107.937961875304 +7294 0.7294 39.3987752226673820 107.987138257164 +7295 0.7295 39.3879740517995316 108.036279099808 +7296 0.7296 39.3771679686238230 108.085384414407 +7297 0.7297 39.3663569766924937 108.134454212155 +7298 0.7298 39.3555410795566729 108.183488504267 +7299 0.7299 39.3447202807663601 108.232487301986 +7300 0.7300 39.3338945838704319 108.281450616571 +7301 0.7301 39.3230639924166354 108.330378459310 +7302 0.7302 39.3122285099515949 108.379270841508 +7303 0.7303 39.3013881400207978 108.428127774501 +7304 0.7304 39.2905428861685877 108.476949269640 +7305 0.7305 39.2796927519381924 108.525735338306 +7306 0.7306 39.2688377408716818 108.574485991894 +7307 0.7307 39.2579778565099957 108.623201241828 +7308 0.7308 39.2471131023929232 108.671881099553 +7309 0.7309 39.2362434820591162 108.720525576539 +7310 0.7310 39.2253689990460757 108.769134684273 +7311 0.7311 39.2144896568901515 108.817708434268 +7312 0.7312 39.2036054591265355 108.866246838059 +7313 0.7313 39.1927164092892752 108.914749907205 +7314 0.7314 39.1818225109112532 108.963217653284 +7315 0.7315 39.1709237675241937 109.011650087900 +7316 0.7316 39.1600201826586627 109.060047222677 +7317 0.7317 39.1491117598440681 109.108409069262 +7318 0.7318 39.1381985026086383 109.156735639322 +7319 0.7319 39.1272804144794435 109.205026944550 +7320 0.7320 39.1163574989823815 109.253282996661 +7321 0.7321 39.1054297596421776 109.301503807386 +7322 0.7322 39.0944971999823849 109.349689388484 +7323 0.7323 39.0835598235253769 109.397839751735 +7324 0.7324 39.0726176337923405 109.445954908942 +7325 0.7325 39.0616706343032973 109.494034871923 +7326 0.7326 39.0507188285770752 109.542079652527 +7327 0.7327 39.0397622201313155 109.590089262620 +7328 0.7328 39.0288008124824799 109.638063714091 +7329 0.7329 39.0178346091458295 109.686003018849 +7330 0.7330 39.0068636136354456 109.733907188827 +7331 0.7331 38.9958878294642020 109.781776235978 +7332 0.7332 38.9849072601437925 109.829610172277 +7333 0.7333 38.9739219091846891 109.877409009723 +7334 0.7334 38.9629317800961843 109.925172760334 +7335 0.7335 38.9519368763863625 109.972901436147 +7336 0.7336 38.9409372015620932 110.020595049226 +7337 0.7337 38.9299327591290520 110.068253611652 +7338 0.7338 38.9189235525916928 110.115877135530 +7339 0.7339 38.9079095854532682 110.163465632986 +7340 0.7340 38.8968908612158089 110.211019116164 +7341 0.7341 38.8858673833801376 110.258537597234 +7342 0.7342 38.8748391554458550 110.306021088385 +7343 0.7343 38.8638061809113466 110.353469601824 +7344 0.7344 38.8527684632737689 110.400883149788 +7345 0.7345 38.8417260060290559 110.448261744525 +7346 0.7346 38.8306788126719127 110.495605398310 +7347 0.7347 38.8196268866958221 110.542914123436 +7348 0.7348 38.8085702315930376 110.590187932220 +7349 0.7349 38.7975088508545767 110.637426836998 +7350 0.7350 38.7864427479702201 110.684630850127 +7351 0.7351 38.7753719264285124 110.731799983983 +7352 0.7352 38.7642963897167618 110.778934250966 +7353 0.7353 38.7532161413210403 110.826033663495 +7354 0.7354 38.7421311847261620 110.873098234009 +7355 0.7355 38.7310415234157119 110.920127974971 +7356 0.7356 38.7199471608720174 110.967122898862 +7357 0.7357 38.7088481005761622 111.014083018182 +7358 0.7358 38.6977443460079797 111.061008345457 +7359 0.7359 38.6866359006460456 111.107898893225 +7360 0.7360 38.6755227679676850 111.154754674055 +7361 0.7361 38.6644049514489581 111.201575700525 +7362 0.7362 38.6532824545646676 111.248361985243 +7363 0.7363 38.6421552807883657 111.295113540832 +7364 0.7364 38.6310234335923255 111.341830379937 +7365 0.7365 38.6198869164475695 111.388512515223 +7366 0.7366 38.6087457328238415 111.435159959376 +7367 0.7367 38.5975998861896201 111.481772725101 +7368 0.7368 38.5864493800121053 111.528350825124 +7369 0.7369 38.5752942177572393 111.574894272189 +7370 0.7370 38.5641344028896782 111.621403079063 +7371 0.7371 38.5529699388727991 111.667877258531 +7372 0.7372 38.5418008291687002 111.714316823399 +7373 0.7373 38.5306270772382078 111.760721786494 +7374 0.7374 38.5194486865408479 111.807092160659 +7375 0.7375 38.5082656605348745 111.853427958762 +7376 0.7376 38.4970780026772488 111.899729193686 +7377 0.7377 38.4858857164236454 111.945995878336 +7378 0.7378 38.4746888052284461 111.992228025640 +7379 0.7379 38.4634872725447394 112.038425648537 +7380 0.7380 38.4522811218243135 112.084588759994 +7381 0.7381 38.4410703565176632 112.130717372996 +7382 0.7382 38.4298549800739835 112.176811500544 +7383 0.7383 38.4186349959411757 112.222871155660 +7384 0.7384 38.4074104075658198 112.268896351390 +7385 0.7385 38.3961812183932096 112.314887100792 +7386 0.7386 38.3849474318673245 112.360843416950 +7387 0.7387 38.3737090514308292 112.406765312962 +7388 0.7388 38.3624660805250812 112.452652801950 +7389 0.7389 38.3512185225901305 112.498505897052 +7390 0.7390 38.3399663810647056 112.544324611427 +7391 0.7391 38.3287096593862202 112.590108958252 +7392 0.7392 38.3174483609907739 112.635858950727 +7393 0.7393 38.3061824893131373 112.681574602062 +7394 0.7394 38.2949120477867595 112.727255925497 +7395 0.7395 38.2836370398437680 112.772902934285 +7396 0.7396 38.2723574689149686 112.818515641698 +7397 0.7397 38.2610733384298314 112.864094061032 +7398 0.7398 38.2497846518164977 112.909638205594 +7399 0.7399 38.2384914125017801 112.955148088717 +7400 0.7400 38.2271936239111554 113.000623723749 +7401 0.7401 38.2158912894687646 113.046065124056 +7402 0.7402 38.2045844125974128 113.091472303030 +7403 0.7403 38.1932729967185551 113.136845274070 +7404 0.7404 38.1819570452523180 113.182184050606 +7405 0.7405 38.1706365616174850 113.227488646077 +7406 0.7406 38.1593115492314823 113.272759073946 +7407 0.7407 38.1479820115104005 113.317995347695 +7408 0.7408 38.1366479518689729 113.363197480821 +7409 0.7409 38.1253093737205901 113.408365486840 +7410 0.7410 38.1139662804772854 113.453499379290 +7411 0.7411 38.1026186755497349 113.498599171724 +7412 0.7412 38.0912665623472648 113.543664877715 +7413 0.7413 38.0799099442778370 113.588696510857 +7414 0.7414 38.0685488247480563 113.633694084755 +7415 0.7415 38.0571832071631633 113.678657613041 +7416 0.7416 38.0458130949270412 113.723587109358 +7417 0.7417 38.0344384914422022 113.768482587372 +7418 0.7418 38.0230594001097941 113.813344060767 +7419 0.7419 38.0116758243295934 113.858171543240 +7420 0.7420 38.0002877675000050 113.902965048513 +7421 0.7421 37.9888952330180629 113.947724590323 +7422 0.7422 37.9774982242794223 113.992450182425 +7423 0.7423 37.9660967446783744 114.037141838589 +7424 0.7424 37.9546907976078174 114.081799572610 +7425 0.7425 37.9432803864592714 114.126423398295 +7426 0.7426 37.9318655146228849 114.171013329474 +7427 0.7427 37.9204461854874140 114.215569379988 +7428 0.7428 37.9090224024402289 114.260091563702 +7429 0.7429 37.8975941688673217 114.304579894495 +7430 0.7430 37.8861614881532844 114.349034386267 +7431 0.7431 37.8747243636813238 114.393455052936 +7432 0.7432 37.8632827988332537 114.437841908431 +7433 0.7433 37.8518367969894953 114.482194966705 +7434 0.7434 37.8403863615290703 114.526514241730 +7435 0.7435 37.8289314958296075 114.570799747490 +7436 0.7436 37.8174722032673358 114.615051497990 +7437 0.7437 37.8060084872170705 114.659269507252 +7438 0.7438 37.7945403510522411 114.703453789315 +7439 0.7439 37.7830677981448630 114.747604358235 +7440 0.7440 37.7715908318655451 114.791721228087 +7441 0.7441 37.7601094555834962 114.835804412962 +7442 0.7442 37.7486236726664970 114.879853926971 +7443 0.7443 37.7371334864809356 114.923869784237 +7444 0.7444 37.7256389003917789 114.967851998905 +7445 0.7445 37.7141399177625800 115.011800585138 +7446 0.7446 37.7026365419554708 115.055715557108 +7447 0.7447 37.6911287763311620 115.099596929016 +7448 0.7448 37.6796166242489576 115.143444715071 +7449 0.7449 37.6681000890667264 115.187258929503 +7450 0.7450 37.6565791741409228 115.231039586560 +7451 0.7451 37.6450538828265664 115.274786700503 +7452 0.7452 37.6335242184772625 115.318500285611 +7453 0.7453 37.6219901844451741 115.362180356186 +7454 0.7454 37.6104517840810360 115.405826926540 +7455 0.7455 37.5989090207341619 115.449440011004 +7456 0.7456 37.5873618977524160 115.493019623926 +7457 0.7457 37.5758104184822344 115.536565779671 +7458 0.7458 37.5642545862686177 115.580078492620 +7459 0.7459 37.5526944044551314 115.623557777172 +7460 0.7460 37.5411298763838843 115.667003647743 +7461 0.7461 37.5295610053955571 115.710416118764 +7462 0.7462 37.5179877948293878 115.753795204682 +7463 0.7463 37.5064102480231583 115.797140919963 +7464 0.7464 37.4948283683132075 115.840453279090 +7465 0.7465 37.4832421590344254 115.883732296560 +7466 0.7466 37.4716516235202519 115.926977986886 +7467 0.7467 37.4600567651026779 115.970190364602 +7468 0.7468 37.4484575871122374 116.013369444255 +7469 0.7469 37.4368540928780078 116.056515240407 +7470 0.7470 37.4252462857276029 116.099627767640 +7471 0.7471 37.4136341689871941 116.142707040553 +7472 0.7472 37.4020177459814818 116.185753073753 +7473 0.7473 37.3903970200337028 116.228765881873 +7474 0.7474 37.3787719944656303 116.271745479558 +7475 0.7475 37.3671426725975806 116.314691881472 +7476 0.7476 37.3555090577483924 116.357605102290 +7477 0.7477 37.3438711532354404 116.400485156705 +7478 0.7478 37.3322289623746357 116.443332059430 +7479 0.7479 37.3205824884804045 116.486145825190 +7480 0.7480 37.3089317348657090 116.528926468727 +7481 0.7481 37.2972767048420337 116.571674004799 +7482 0.7482 37.2856174017193851 116.614388448181 +7483 0.7483 37.2739538288062917 116.657069813662 +7484 0.7484 37.2622859894098042 116.699718116050 +7485 0.7485 37.2506138868354952 116.742333370165 +7486 0.7486 37.2389375243874454 116.784915590846 +7487 0.7487 37.2272569053682574 116.827464792945 +7488 0.7488 37.2155720330790416 116.869980991333 +7489 0.7489 37.2038829108194307 116.912464200894 +7490 0.7490 37.1921895418875579 116.954914436528 +7491 0.7491 37.1804919295800715 116.997331713153 +7492 0.7492 37.1687900771921278 117.039716045700 +7493 0.7493 37.1570839880173835 117.082067449117 +7494 0.7494 37.1453736653480107 117.124385938368 +7495 0.7495 37.1336591124746676 117.166671528430 +7496 0.7496 37.1219403326865347 117.208924234298 +7497 0.7497 37.1102173292712720 117.251144070983 +7498 0.7498 37.0984901055150473 117.293331053507 +7499 0.7499 37.0867586647025291 117.335485196914 +7500 0.7500 37.0750230101168725 117.377606516259 +7501 0.7501 37.0632831450397262 117.419695026613 +7502 0.7502 37.0515390727512397 117.461750743062 +7503 0.7503 37.0397907965300490 117.503773680708 +7504 0.7504 37.0280383196532767 117.545763854669 +7505 0.7505 37.0162816453965391 117.587721280075 +7506 0.7506 37.0045207770339317 117.629645972077 +7507 0.7507 36.9927557178380368 117.671537945835 +7508 0.7508 36.9809864710799161 117.713397216528 +7509 0.7509 36.9692130400291248 117.755223799348 +7510 0.7510 36.9574354279536834 117.797017709504 +7511 0.7511 36.9456536381200991 117.838778962219 +7512 0.7512 36.9338676737933511 117.880507572730 +7513 0.7513 36.9220775382368984 117.922203556289 +7514 0.7514 36.9102832347126721 117.963866928166 +7515 0.7515 36.8984847664810829 118.005497703643 +7516 0.7516 36.8866821368009994 118.047095898017 +7517 0.7517 36.8748753489297698 118.088661526601 +7518 0.7518 36.8630644061232005 118.130194604722 +7519 0.7519 36.8512493116355770 118.171695147721 +7520 0.7520 36.8394300687196434 118.213163170956 +7521 0.7521 36.8276066806266087 118.254598689797 +7522 0.7522 36.8157791506061400 118.296001719631 +7523 0.7523 36.8039474819063628 118.337372275860 +7524 0.7524 36.7921116777738746 118.378710373897 +7525 0.7525 36.7802717414537241 118.420016029173 +7526 0.7526 36.7684276761894111 118.461289257133 +7527 0.7527 36.7565794852228933 118.502530073234 +7528 0.7528 36.7447271717945867 118.543738492953 +7529 0.7529 36.7328707391433511 118.584914531773 +7530 0.7530 36.7210101905065045 118.626058205199 +7531 0.7531 36.7091455291198088 118.667169528749 +7532 0.7532 36.6972767582174768 118.708248517953 +7533 0.7533 36.6854038810321583 118.749295188355 +7534 0.7534 36.6735269007949682 118.790309555516 +7535 0.7535 36.6616458207354441 118.831291635010 +7536 0.7536 36.6497606440815744 118.872241442426 +7537 0.7537 36.6378713740597846 118.913158993363 +7538 0.7538 36.6259780138949438 118.954044303442 +7539 0.7539 36.6140805668103582 118.994897388290 +7540 0.7540 36.6021790360277635 119.035718263555 +7541 0.7541 36.5902734247673393 119.076506944893 +7542 0.7542 36.5783637362476952 119.117263447981 +7543 0.7543 36.5664499736858701 119.157987788503 +7544 0.7544 36.5545321402973400 119.198679982158 +7545 0.7545 36.5426102392959962 119.239340044665 +7546 0.7546 36.5306842738941739 119.279967991753 +7547 0.7547 36.5187542473026312 119.320563839160 +7548 0.7548 36.5068201627305413 119.361127602648 +7549 0.7549 36.4948820233855074 119.401659297985 +7550 0.7550 36.4829398324735621 119.442158940955 +7551 0.7551 36.4709935931991467 119.482626547357 +7552 0.7552 36.4590433087651320 119.523062133003 +7553 0.7553 36.4470889823727973 119.563465713719 +7554 0.7554 36.4351306172218443 119.603837305342 +7555 0.7555 36.4231682165103905 119.644176923728 +7556 0.7556 36.4112017834349686 119.684484584741 +7557 0.7557 36.3992313211905199 119.724760304263 +7558 0.7558 36.3872568329703938 119.765004098187 +7559 0.7559 36.3752783219663627 119.805215982420 +7560 0.7560 36.3632957913685999 119.845395972882 +7561 0.7561 36.3513092443656802 119.885544085509 +7562 0.7562 36.3393186841445939 119.925660336249 +7563 0.7563 36.3273241138907252 119.965744741061 +7564 0.7564 36.3153255367878742 120.005797315923 +7565 0.7565 36.3033229560182349 120.045818076819 +7566 0.7566 36.2913163747624097 120.085807039754 +7567 0.7567 36.2793057961993881 120.125764220739 +7568 0.7568 36.2672912235065610 120.165689635803 +7569 0.7569 36.2552726598597204 120.205583300990 +7570 0.7570 36.2432501084330525 120.245445232350 +7571 0.7571 36.2312235723991378 120.285275445953 +7572 0.7572 36.2191930549289438 120.325073957881 +7573 0.7573 36.2071585591918392 120.364840784224 +7574 0.7574 36.1951200883555728 120.404575941091 +7575 0.7575 36.1830776455862875 120.444279444603 +7576 0.7576 36.1710312340485132 120.483951310892 +7577 0.7577 36.1589808569051669 120.523591556103 +7578 0.7578 36.1469265173175387 120.563200196397 +7579 0.7579 36.1348682184453196 120.602777247944 +7580 0.7580 36.1228059634465737 120.642322726930 +7581 0.7581 36.1107397554777521 120.681836649555 +7582 0.7582 36.0986695976936716 120.721319032028 +7583 0.7583 36.0865954932475432 120.760769890570 +7584 0.7584 36.0745174452909438 120.800189241421 +7585 0.7585 36.0624354569738301 120.839577100828 +7586 0.7586 36.0503495314445388 120.878933485054 +7587 0.7587 36.0382596718497652 120.918258410374 +7588 0.7588 36.0261658813345917 120.957551893074 +7589 0.7589 36.0140681630424666 120.996813949454 +7590 0.7590 36.0019665201152037 121.036044595829 +7591 0.7591 35.9898609556929827 121.075243848523 +7592 0.7592 35.9777514729143633 121.114411723873 +7593 0.7593 35.9656380749162565 121.153548238230 +7594 0.7594 35.9535207648339465 121.192653407958 +7595 0.7595 35.9413995458010760 121.231727249432 +7596 0.7596 35.9292744209496533 121.270769779039 +7597 0.7597 35.9171453934100455 121.309781013180 +7598 0.7598 35.9050124663109713 121.348760968269 +7599 0.7599 35.8928756427795221 121.387709660729 +7600 0.7600 35.8807349259411339 121.426627107000 +7601 0.7601 35.8685903189196083 121.465513323532 +7602 0.7602 35.8564418248370913 121.504368326784 +7603 0.7603 35.8442894468140878 121.543192133233 +7604 0.7604 35.8321331879694611 121.581984759366 +7605 0.7605 35.8199730514204120 121.620746221682 +7606 0.7606 35.8078090402824927 121.659476536691 +7607 0.7607 35.7956411576696141 121.698175720917 +7608 0.7608 35.7834694066940244 121.736843790896 +7609 0.7609 35.7712937904663235 121.775480763175 +7610 0.7610 35.7591143120954484 121.814086654317 +7611 0.7611 35.7469309746886879 121.852661480890 +7612 0.7612 35.7347437813516677 121.891205259479 +7613 0.7613 35.7225527351883585 121.929718006678 +7614 0.7614 35.7103578393010679 121.968199739098 +7615 0.7615 35.6981590967904481 122.006650473358 +7616 0.7616 35.6859565107554744 122.045070226089 +7617 0.7617 35.6737500842934736 122.083459013934 +7618 0.7618 35.6615398205001028 122.121816853551 +7619 0.7619 35.6493257224693423 122.160143761604 +7620 0.7620 35.6371077932935236 122.198439754777 +7621 0.7621 35.6248860360632946 122.236704849756 +7622 0.7622 35.6126604538676474 122.274939063247 +7623 0.7623 35.6004310497938903 122.313142411962 +7624 0.7624 35.5881978269276615 122.351314912630 +7625 0.7625 35.5759607883529299 122.389456581987 +7626 0.7626 35.5637199371519941 122.427567436783 +7627 0.7627 35.5514752764054691 122.465647493779 +7628 0.7628 35.5392268091922929 122.503696769748 +7629 0.7629 35.5269745385897338 122.541715281474 +7630 0.7630 35.5147184676733758 122.579703045754 +7631 0.7631 35.5024585995171194 122.617660079395 +7632 0.7632 35.4901949371931877 122.655586399215 +7633 0.7633 35.4779274837721275 122.693482022045 +7634 0.7634 35.4656562423227868 122.731346964728 +7635 0.7635 35.4533812159123443 122.769181244115 +7636 0.7636 35.4411024076062873 122.806984877073 +7637 0.7637 35.4288198204684122 122.844757880478 +7638 0.7638 35.4165334575608242 122.882500271215 +7639 0.7639 35.4042433219439516 122.920212066185 +7640 0.7640 35.3919494166765247 122.957893282296 +7641 0.7641 35.3796517448155896 122.995543936473 +7642 0.7642 35.3673503094164872 123.033164045643 +7643 0.7643 35.3550451135328672 123.070753626755 +7644 0.7644 35.3427361602166883 123.108312696761 +7645 0.7645 35.3304234525182181 123.145841272627 +7646 0.7646 35.3181069934860190 123.183339371332 +7647 0.7647 35.3057867861669621 123.220807009863 +7648 0.7648 35.2934628336062062 123.258244205218 +7649 0.7649 35.2811351388472261 123.295650974412 +7650 0.7650 35.2688037049317842 123.333027334462 +7651 0.7651 35.2564685348999376 123.370373302402 +7652 0.7652 35.2441296317900523 123.407688895277 +7653 0.7653 35.2317869986387819 123.444974130139 +7654 0.7654 35.2194406384810748 123.482229024055 +7655 0.7655 35.2070905543501667 123.519453594099 +7656 0.7656 35.1947367492775953 123.556647857360 +7657 0.7657 35.1823792262931789 123.593811830937 +7658 0.7658 35.1700179884250375 123.630945531936 +7659 0.7659 35.1576530386995643 123.668048977480 +7660 0.7660 35.1452843801414545 123.705122184697 +7661 0.7661 35.1329120157736838 123.742165170729 +7662 0.7662 35.1205359486175084 123.779177952727 +7663 0.7663 35.1081561816924790 123.816160547855 +7664 0.7664 35.0957727180164198 123.853112973284 +7665 0.7665 35.0833855606054428 123.890035246201 +7666 0.7666 35.0709947124739401 123.926927383798 +7667 0.7667 35.0586001766345845 123.963789403281 +7668 0.7668 35.0462019560983293 124.000621321867 +7669 0.7669 35.0338000538743941 124.037423156781 +7670 0.7670 35.0213944729702931 124.074194925258 +7671 0.7671 35.0089852163917996 124.110936644547 +7672 0.7672 34.9965722871429747 124.147648331908 +7673 0.7673 34.9841556882261457 124.184330004606 +7674 0.7674 34.9717354226419204 124.220981679921 +7675 0.7675 34.9593114933891655 124.257603375140 +7676 0.7676 34.9468839034650287 124.294195107566 +7677 0.7677 34.9344526558649235 124.330756894506 +7678 0.7678 34.9220177535825371 124.367288753283 +7679 0.7679 34.9095791996098086 124.403790701224 +7680 0.7680 34.8971369969369647 124.440262755671 +7681 0.7681 34.8846911485524842 124.476704933975 +7682 0.7682 34.8722416574431122 124.513117253499 +7683 0.7683 34.8597885265938601 124.549499731612 +7684 0.7684 34.8473317589879912 124.585852385695 +7685 0.7685 34.8348713576070494 124.622175233142 +7686 0.7686 34.8224073254308237 124.658468291353 +7687 0.7687 34.8099396654373692 124.694731577740 +7688 0.7688 34.7974683806029930 124.730965109728 +7689 0.7689 34.7849934739022686 124.767168904745 +7690 0.7690 34.7725149483080216 124.803342980237 +7691 0.7691 34.7600328067913296 124.839487353652 +7692 0.7692 34.7475470523215222 124.875602042456 +7693 0.7693 34.7350576878661954 124.911687064120 +7694 0.7694 34.7225647163911830 124.947742436125 +7695 0.7695 34.7100681408605780 124.983768175963 +7696 0.7696 34.6975679642367254 125.019764301136 +7697 0.7697 34.6850641894802081 125.055730829156 +7698 0.7698 34.6725568195498752 125.091667777545 +7699 0.7699 34.6600458574028067 125.127575163834 +7700 0.7700 34.6475313059943346 125.163453005565 +7701 0.7701 34.6350131682780429 125.199301320286 +7702 0.7702 34.6224914472057534 125.235120125562 +7703 0.7703 34.6099661457275261 125.270909438962 +7704 0.7704 34.5974372667916725 125.306669278064 +7705 0.7705 34.5849048133447496 125.342399660460 +7706 0.7706 34.5723687883315378 125.378100603747 +7707 0.7707 34.5598291946950766 125.413772125537 +7708 0.7708 34.5472860353766293 125.449414243449 +7709 0.7709 34.5347393133157041 125.485026975109 +7710 0.7710 34.5221890314500399 125.520610338155 +7711 0.7711 34.5096351927156206 125.556164350236 +7712 0.7712 34.4970778000466609 125.591689029009 +7713 0.7713 34.4845168563756062 125.627184392138 +7714 0.7714 34.4719523646331325 125.662650457301 +7715 0.7715 34.4593843277481611 125.698087242183 +7716 0.7716 34.4468127486478295 125.733494764477 +7717 0.7717 34.4342376302575133 125.768873041890 +7718 0.7718 34.4216589755008116 125.804222092135 +7719 0.7719 34.4090767872995613 125.839541932933 +7720 0.7720 34.3964910685738161 125.874832582018 +7721 0.7721 34.3839018222418602 125.910094057131 +7722 0.7722 34.3713090512202015 125.945326376022 +7723 0.7723 34.3587127584235787 125.980529556453 +7724 0.7724 34.3461129467649471 126.015703616190 +7725 0.7725 34.3335096191554854 126.050848573015 +7726 0.7726 34.3209027785045961 126.085964444714 +7727 0.7727 34.3082924277199055 126.121051249082 +7728 0.7728 34.2956785697072561 126.156109003930 +7729 0.7729 34.2830612073707073 126.191137727069 +7730 0.7730 34.2704403436125347 126.226137436325 +7731 0.7731 34.2578159813332448 126.261108149532 +7732 0.7732 34.2451881234315394 126.296049884530 +7733 0.7733 34.2325567728043509 126.330962659173 +7734 0.7734 34.2199219323468284 126.365846491319 +7735 0.7735 34.2072836049523232 126.400701398840 +7736 0.7736 34.1946417935124032 126.435527399612 +7737 0.7737 34.1819965009168456 126.470324511524 +7738 0.7738 34.1693477300536443 126.505092752471 +7739 0.7739 34.1566954838090027 126.539832140360 +7740 0.7740 34.1440397650673262 126.574542693103 +7741 0.7741 34.1313805767112370 126.609224428626 +7742 0.7742 34.1187179216215597 126.643877364856 +7743 0.7743 34.1060518026773281 126.678501519737 +7744 0.7744 34.0933822227557783 126.713096911218 +7745 0.7745 34.0807091847323562 126.747663557256 +7746 0.7746 34.0680326914807026 126.782201475821 +7747 0.7747 34.0553527458726677 126.816710684883 +7748 0.7748 34.0426693507783042 126.851191202431 +7749 0.7749 34.0299825090658601 126.885643046456 +7750 0.7750 34.0172922236017925 126.920066234960 +7751 0.7751 34.0045984972507469 126.954460785955 +7752 0.7752 33.9919013328755781 126.988826717457 +7753 0.7753 33.9792007333373292 127.023164047493 +7754 0.7754 33.9664967014952524 127.057472794103 +7755 0.7755 33.9537892402067811 127.091752975329 +7756 0.7756 33.9410783523275512 127.126004609223 +7757 0.7757 33.9283640407114007 127.160227713848 +7758 0.7758 33.9156463082103414 127.194422307276 +7759 0.7759 33.9029251576746020 127.228588407582 +7760 0.7760 33.8902005919525777 127.262726032856 +7761 0.7761 33.8774726138908733 127.296835201192 +7762 0.7762 33.8647412263342815 127.330915930694 +7763 0.7763 33.8520064321257763 127.364968239474 +7764 0.7764 33.8392682341065196 127.398992145653 +7765 0.7765 33.8265266351158687 127.432987667359 +7766 0.7766 33.8137816379913616 127.466954822730 +7767 0.7767 33.8010332455687319 127.500893629910 +7768 0.7768 33.7882814606818869 127.534804107056 +7769 0.7769 33.7755262861629149 127.568686272327 +7770 0.7770 33.7627677248421065 127.602540143895 +7771 0.7771 33.7500057795479123 127.636365739937 +7772 0.7772 33.7372404531069847 127.670163078641 +7773 0.7773 33.7244717483441434 127.703932178201 +7774 0.7774 33.7116996680823888 127.737673056821 +7775 0.7775 33.6989242151429096 127.771385732711 +7776 0.7776 33.6861453923450682 127.805070224089 +7777 0.7777 33.6733632025064011 127.838726549185 +7778 0.7778 33.6605776484426329 127.872354726232 +7779 0.7779 33.6477887329676477 127.905954773474 +7780 0.7780 33.6349964588935180 127.939526709165 +7781 0.7781 33.6222008290304828 127.973070551559 +7782 0.7782 33.6094018461869553 128.006586318928 +7783 0.7783 33.5965995131695294 128.040074029544 +7784 0.7784 33.5837938327829661 128.073533701693 +7785 0.7785 33.5709848078302002 128.106965353664 +7786 0.7786 33.5581724411123261 128.140369003757 +7787 0.7787 33.5453567354286264 128.173744670278 +7788 0.7788 33.5325376935765362 128.207092371544 +7789 0.7789 33.5197153183516647 128.240412125875 +7790 0.7790 33.5068896125477877 128.273703951604 +7791 0.7791 33.4940605789568551 128.306967867066 +7792 0.7792 33.4812282203689691 128.340203890609 +7793 0.7793 33.4683925395724060 128.373412040585 +7794 0.7794 33.4555535393536090 128.406592335359 +7795 0.7795 33.4427112224971737 128.439744793297 +7796 0.7796 33.4298655917858696 128.472869432775 +7797 0.7797 33.4170166500006189 128.505966272180 +7798 0.7798 33.4041643999205178 128.539035329902 +7799 0.7799 33.3913088443228077 128.572076624343 +7800 0.7800 33.3784499859828969 128.605090173909 +7801 0.7801 33.3655878276743536 128.638075997015 +7802 0.7802 33.3527223721688983 128.671034112083 +7803 0.7803 33.3398536222364186 128.703964537545 +7804 0.7804 33.3269815806449472 128.736867291838 +7805 0.7805 33.3141062501606839 128.769742393405 +7806 0.7806 33.3012276335479811 128.802589860700 +7807 0.7807 33.2883457335693365 128.835409712182 +7808 0.7808 33.2754605529854146 128.868201966319 +7809 0.7809 33.2625720945550185 128.900966641588 +7810 0.7810 33.2496803610351179 128.933703756469 +7811 0.7811 33.2367853551808210 128.966413329452 +7812 0.7812 33.2238870797453956 128.999095379034 +7813 0.7813 33.2109855374802549 129.031749923720 +7814 0.7814 33.1980807311349650 129.064376982023 +7815 0.7815 33.1851726634572444 129.096976572459 +7816 0.7816 33.1722613371929427 129.129548713555 +7817 0.7817 33.1593467550860694 129.162093423846 +7818 0.7818 33.1464289198787867 129.194610721873 +7819 0.7819 33.1335078343113807 129.227100626183 +7820 0.7820 33.1205835011223044 129.259563155332 +7821 0.7821 33.1076559230481422 129.291998327881 +7822 0.7822 33.0947251028236309 129.324406162400 +7823 0.7823 33.0817910431816387 129.356786677468 +7824 0.7824 33.0688537468531791 129.389139891667 +7825 0.7825 33.0559132165674185 129.421465823587 +7826 0.7826 33.0429694550516473 129.453764491829 +7827 0.7827 33.0300224650313083 129.486035914996 +7828 0.7828 33.0170722492299760 129.518280111702 +7829 0.7829 33.0041188103693628 129.550497100565 +7830 0.7830 32.9911621511693269 129.582686900210 +7831 0.7831 32.9782022743478507 129.614849529272 +7832 0.7832 32.9652391826210689 129.646985006392 +7833 0.7833 32.9522728787032406 129.679093350216 +7834 0.7834 32.9393033653067633 129.711174579398 +7835 0.7835 32.9263306451421656 129.743228712599 +7836 0.7836 32.9133547209181145 129.775255768487 +7837 0.7837 32.9003755953414014 129.807255765739 +7838 0.7838 32.8873932711169630 129.839228723034 +7839 0.7839 32.8744077509478601 129.871174659061 +7840 0.7840 32.8614190375352777 129.903093592517 +7841 0.7841 32.8484271335785465 129.934985542102 +7842 0.7842 32.8354320417751140 129.966850526526 +7843 0.7843 32.8224337648205591 129.998688564506 +7844 0.7844 32.8094323054085990 130.030499674763 +7845 0.7845 32.7964276662310610 130.062283876025 +7846 0.7846 32.7834198499779106 130.094041187030 +7847 0.7847 32.7704088593372305 130.125771626520 +7848 0.7848 32.7573946969952416 130.157475213244 +7849 0.7849 32.7443773656362822 130.189151965959 +7850 0.7850 32.7313568679428144 130.220801903426 +7851 0.7851 32.7183332065954247 130.252425044415 +7852 0.7852 32.7053063842728164 130.284021407702 +7853 0.7853 32.6922764036518245 130.315591012069 +7854 0.7854 32.6792432674074078 130.347133876304 +7855 0.7855 32.6662069782126352 130.378650019207 +7856 0.7856 32.6531675387386997 130.410139459572 +7857 0.7857 32.6401249516549115 130.441602216215 +7858 0.7858 32.6270792196287047 130.473038307947 +7859 0.7859 32.6140303453256308 130.504447753590 +7860 0.7860 32.6009783314093511 130.535830571972 +7861 0.7861 32.5879231805416580 130.567186781930 +7862 0.7862 32.5748648953824471 130.598516402300 +7863 0.7863 32.5618034785897379 130.629819451933 +7864 0.7864 32.5487389328196599 130.661095949680 +7865 0.7865 32.5356712607264527 130.692345914403 +7866 0.7866 32.5226004649624869 130.723569364966 +7867 0.7867 32.5095265481782292 130.754766320243 +7868 0.7868 32.4964495130222630 130.785936799114 +7869 0.7869 32.4833693621412820 130.817080820462 +7870 0.7870 32.4702860981800967 130.848198403179 +7871 0.7871 32.4571997237816277 130.879289566162 +7872 0.7872 32.4441102415869054 130.910354328318 +7873 0.7873 32.4310176542350632 130.941392708553 +7874 0.7874 32.4179219643633445 130.972404725786 +7875 0.7875 32.4048231746071096 131.003390398938 +7876 0.7876 32.3917212875998146 131.034349746938 +7877 0.7877 32.3786163059730328 131.065282788723 +7878 0.7878 32.3655082323564329 131.096189543229 +7879 0.7879 32.3523970693778011 131.127070029408 +7880 0.7880 32.3392828196630191 131.157924266211 +7881 0.7881 32.3261654858360785 131.188752272596 +7882 0.7882 32.3130450705190739 131.219554067531 +7883 0.7883 32.2999215763321956 131.250329669985 +7884 0.7884 32.2867950058937510 131.281079098936 +7885 0.7885 32.2736653618201359 131.311802373368 +7886 0.7886 32.2605326467258564 131.342499512270 +7887 0.7887 32.2473968632235142 131.373170534635 +7888 0.7888 32.2342580139238066 131.403815459468 +7889 0.7889 32.2211161014355412 131.434434305773 +7890 0.7890 32.2079711283656209 131.465027092565 +7891 0.7891 32.1948230973190519 131.495593838861 +7892 0.7892 32.1816720108989216 131.526134563688 +7893 0.7893 32.1685178717064346 131.556649286075 +7894 0.7894 32.1553606823408771 131.587138025058 +7895 0.7895 32.1422004453996379 131.617600799683 +7896 0.7896 32.1290371634782019 131.648037628994 +7897 0.7897 32.1158708391701495 131.678448532048 +7898 0.7898 32.1027014750671498 131.708833527902 +7899 0.7899 32.0895290737589747 131.739192635624 +7900 0.7900 32.0763536378334777 131.769525874283 +7901 0.7901 32.0631751698766152 131.799833262957 +7902 0.7902 32.0499936724724321 131.830114820728 +7903 0.7903 32.0368091482030621 131.860370566687 +7904 0.7904 32.0236215996487346 131.890600519924 +7905 0.7905 32.0104310293877603 131.920804699541 +7906 0.7906 31.9972374399965531 131.950983124643 +7907 0.7907 31.9840408340496047 131.981135814341 +7908 0.7908 31.9708412141194991 132.011262787750 +7909 0.7909 31.9576385827769123 132.041364063994 +7910 0.7910 31.9444329425906020 132.071439662200 +7911 0.7911 31.9312242961274180 132.101489601502 +7912 0.7912 31.9180126459522917 132.131513901038 +7913 0.7913 31.9047979946282432 132.161512579952 +7914 0.7914 31.8915803447163775 132.191485657395 +7915 0.7915 31.8783596987758813 132.221433152520 +7916 0.7916 31.8651360593640298 132.251355084491 +7917 0.7917 31.8519094290361835 132.281251472470 +7918 0.7918 31.8386798103457771 132.311122335633 +7919 0.7919 31.8254472058443376 132.340967693153 +7920 0.7920 31.8122116180814700 132.370787564216 +7921 0.7921 31.7989730496048573 132.400581968008 +7922 0.7922 31.7857315029602709 132.430350923723 +7923 0.7923 31.7724869806915571 132.460094450558 +7924 0.7924 31.7592394853406432 132.489812567720 +7925 0.7925 31.7459890194475349 132.519505294414 +7926 0.7926 31.7327355855503228 132.549172649857 +7927 0.7927 31.7194791861851648 132.578814653269 +7928 0.7928 31.7062198238863076 132.608431323874 +7929 0.7929 31.6929575011860685 132.638022680903 +7930 0.7930 31.6796922206148430 132.667588743592 +7931 0.7931 31.6664239847011046 132.697129531181 +7932 0.7932 31.6531527959714012 132.726645062915 +7933 0.7933 31.6398786569503514 132.756135358048 +7934 0.7934 31.6266015701606555 132.785600435834 +7935 0.7935 31.6133215381230883 132.815040315535 +7936 0.7936 31.6000385633564917 132.844455016419 +7937 0.7937 31.5867526483777823 132.873844557755 +7938 0.7938 31.5734637957019544 132.903208958822 +7939 0.7939 31.5601720078420698 132.932548238903 +7940 0.7940 31.5468772873092611 132.961862417281 +7941 0.7941 31.5335796366127354 132.991151513252 +7942 0.7942 31.5202790582597672 133.020415546111 +7943 0.7943 31.5069755547557051 133.049654535162 +7944 0.7944 31.4936691286039618 133.078868499710 +7945 0.7945 31.4803597823060244 133.108057459069 +7946 0.7946 31.4670475183614435 133.137221432554 +7947 0.7947 31.4537323392678410 133.166360439490 +7948 0.7948 31.4404142475209056 133.195474499201 +7949 0.7949 31.4270932456143939 133.224563631023 +7950 0.7950 31.4137693360401293 133.253627854288 +7951 0.7951 31.4004425212879994 133.282667188340 +7952 0.7952 31.3871128038459553 133.311681652527 +7953 0.7953 31.3737801862000190 133.340671266199 +7954 0.7954 31.3604446708342728 133.369636048713 +7955 0.7955 31.3471062602308663 133.398576019431 +7956 0.7956 31.3337649568700094 133.427491197717 +7957 0.7957 31.3204207632299756 133.456381602943 +7958 0.7958 31.3070736817871058 133.485247254485 +7959 0.7959 31.2937237150157941 133.514088171723 +7960 0.7960 31.2803708653885053 133.542904374042 +7961 0.7961 31.2670151353757610 133.571695880832 +7962 0.7962 31.2536565274461466 133.600462711488 +7963 0.7963 31.2402950440663005 133.629204885408 +7964 0.7964 31.2269306877009285 133.657922421999 +7965 0.7965 31.2135634608127965 133.686615340668 +7966 0.7966 31.2001933658627202 133.715283660827 +7967 0.7967 31.1868204053095823 133.743927401896 +7968 0.7968 31.1734445816103225 133.772546583298 +7969 0.7969 31.1600658972199334 133.801141224458 +7970 0.7970 31.1466843545914713 133.829711344810 +7971 0.7971 31.1332999561760424 133.858256963790 +7972 0.7972 31.1199127044228128 133.886778100838 +7973 0.7973 31.1065226017790017 133.915274775401 +7974 0.7974 31.0931296506898853 133.943747006928 +7975 0.7975 31.0797338535987961 133.972194814875 +7976 0.7976 31.0663352129471164 134.000618218700 +7977 0.7977 31.0529337311742886 134.029017237868 +7978 0.7978 31.0395294107178046 134.057391891847 +7979 0.7979 31.0261222540132060 134.085742200108 +7980 0.7980 31.0127122634940946 134.114068182130 +7981 0.7981 30.9992994415921181 134.142369857393 +7982 0.7982 30.9858837907369811 134.170647245383 +7983 0.7983 30.9724653133564338 134.198900365591 +7984 0.7984 30.9590440118762800 134.227129237513 +7985 0.7985 30.9456198887203726 134.255333880647 +7986 0.7986 30.9321929463106144 134.283514314496 +7987 0.7987 30.9187631870669613 134.311670558568 +7988 0.7988 30.9053306134074148 134.339802632375 +7989 0.7989 30.8918952277480230 134.367910555434 +7990 0.7990 30.8784570325028866 134.395994347266 +7991 0.7991 30.8650160300841527 134.424054027395 +7992 0.7992 30.8515722229020142 134.452089615351 +7993 0.7993 30.8381256133647135 134.480101130668 +7994 0.7994 30.8246762038785356 134.508088592884 +7995 0.7995 30.8112239968478150 134.536052021540 +7996 0.7996 30.7977689946749287 134.563991436183 +7997 0.7997 30.7843111997602996 134.591906856364 +7998 0.7998 30.7708506145024003 134.619798301636 +7999 0.7999 30.7573872412977423 134.647665791559 +8000 0.8000 30.7439210825408793 134.675509345696 +8001 0.8001 30.7304521406244149 134.703328983613 +8002 0.8002 30.7169804179389914 134.731124724883 +8003 0.8003 30.7035059168732936 134.758896589079 +8004 0.8004 30.6900286398140487 134.786644595784 +8005 0.8005 30.6765485891460301 134.814368764578 +8006 0.8006 30.6630657672520499 134.842069115052 +8007 0.8007 30.6495801765129592 134.869745666794 +8008 0.8008 30.6360918193076479 134.897398439401 +8009 0.8009 30.6226006980130556 134.925027452475 +8010 0.8010 30.6091068150041501 134.952632725616 +8011 0.8011 30.5956101726539487 134.980214278434 +8012 0.8012 30.5821107733335005 135.007772130541 +8013 0.8013 30.5686086194118971 135.035306301552 +8014 0.8014 30.5551037132562655 135.062816811086 +8015 0.8015 30.5415960572317715 135.090303678766 +8016 0.8016 30.5280856537016234 135.117766924222 +8017 0.8017 30.5145725050270578 135.145206567084 +8018 0.8018 30.5010566135673535 135.172622626986 +8019 0.8019 30.4875379816798251 135.200015123570 +8020 0.8020 30.4740166117198221 135.227384076476 +8021 0.8021 30.4604925060407297 135.254729505353 +8022 0.8022 30.4469656669939681 135.282051429852 +8023 0.8023 30.4334360969289932 135.309349869625 +8024 0.8024 30.4199037981932960 135.336624844332 +8025 0.8025 30.4063687731323959 135.363876373636 +8026 0.8026 30.3928310240898547 135.391104477202 +8027 0.8027 30.3792905534072588 135.418309174699 +8028 0.8028 30.3657473634242336 135.445490485801 +8029 0.8029 30.3522014564784328 135.472648430186 +8030 0.8030 30.3386528349055453 135.499783027534 +8031 0.8031 30.3251015010392919 135.526894297530 +8032 0.8032 30.3115474572114216 135.553982259862 +8033 0.8033 30.2979907057517188 135.581046934222 +8034 0.8034 30.2844312489879925 135.608088340307 +8035 0.8035 30.2708690892460872 135.635106497815 +8036 0.8036 30.2573042288498755 135.662101426449 +8037 0.8037 30.2437366701212582 135.689073145917 +8038 0.8038 30.2301664153801646 135.716021675927 +8039 0.8039 30.2165934669445591 135.742947036193 +8040 0.8040 30.2030178271304273 135.769849246435 +8041 0.8041 30.1894394982517866 135.796728326371 +8042 0.8042 30.1758584826206828 135.823584295728 +8043 0.8043 30.1622747825471862 135.850417174232 +8044 0.8044 30.1486884003393953 135.877226981617 +8045 0.8045 30.1350993383034336 135.904013737616 +8046 0.8046 30.1215075987434560 135.930777461969 +8047 0.8047 30.1079131839616352 135.957518174418 +8048 0.8048 30.0943160962581793 135.984235894707 +8049 0.8049 30.0807163379313138 136.010930642588 +8050 0.8050 30.0671139112772927 136.037602437811 +8051 0.8051 30.0535088185903945 136.064251300133 +8052 0.8052 30.0399010621629223 136.090877249313 +8053 0.8053 30.0262906442852007 136.117480305116 +8054 0.8054 30.0126775672455786 136.144060487305 +8055 0.8055 29.9990618333304297 136.170617815651 +8056 0.8056 29.9854434448241491 136.197152309929 +8057 0.8057 29.9718224040091563 136.223663989911 +8058 0.8058 29.9581987131658920 136.250152875381 +8059 0.8059 29.9445723745728181 136.276618986119 +8060 0.8060 29.9309433905064175 136.303062341913 +8061 0.8061 29.9173117632411945 136.329482962552 +8062 0.8062 29.9036774950496742 136.355880867830 +8063 0.8063 29.8900405882024067 136.382256077541 +8064 0.8064 29.8764010449679560 136.408608611487 +8065 0.8065 29.8627588676129072 136.434938489468 +8066 0.8066 29.8491140584018702 136.461245731294 +8067 0.8067 29.8354666195974652 136.487530356771 +8068 0.8068 29.8218165534603408 136.513792385711 +8069 0.8069 29.8081638622491596 136.540031837933 +8070 0.8070 29.7945085482206018 136.566248733252 +8071 0.8071 29.7808506136293651 136.592443091492 +8072 0.8072 29.7671900607281650 136.618614932477 +8073 0.8073 29.7535268917677378 136.644764276038 +8074 0.8074 29.7398611089968341 136.670891142004 +8075 0.8075 29.7261927146622220 136.696995550209 +8076 0.8076 29.7125217110086872 136.723077520494 +8077 0.8077 29.6988481002790294 136.749137072696 +8078 0.8078 29.6851718847140624 136.775174226660 +8079 0.8079 29.6714930665526175 136.801189002235 +8080 0.8080 29.6578116480315437 136.827181419268 +8081 0.8081 29.6441276313857003 136.853151497615 +8082 0.8082 29.6304410188479643 136.879099257128 +8083 0.8083 29.6167518126492233 136.905024717670 +8084 0.8084 29.6030600150183858 136.930927899101 +8085 0.8085 29.5893656281823674 136.956808821288 +8086 0.8086 29.5756686543660976 136.982667504096 +8087 0.8087 29.5619690957925236 137.008503967399 +8088 0.8088 29.5482669546825996 137.034318231070 +8089 0.8089 29.5345622332552971 137.060110314985 +8090 0.8090 29.5208549337275983 137.085880239025 +8091 0.8091 29.5071450583144923 137.111628023072 +8092 0.8092 29.4934326092289893 137.137353687012 +8093 0.8093 29.4797175886821030 137.163057250735 +8094 0.8094 29.4659999988828609 137.188738734129 +8095 0.8095 29.4522798420383012 137.214398157092 +8096 0.8096 29.4385571203534688 137.240035539520 +8097 0.8097 29.4248318360314265 137.265650901312 +8098 0.8098 29.4111039912732437 137.291244262371 +8099 0.8099 29.3973735882779934 137.316815642604 +8100 0.8100 29.3836406292427661 137.342365061918 +8101 0.8101 29.3699051163626592 137.367892540225 +8102 0.8102 29.3561670518307771 137.393398097439 +8103 0.8103 29.3424264378382311 137.418881753478 +8104 0.8104 29.3286832765741430 137.444343528260 +8105 0.8105 29.3149375702256449 137.469783441708 +8106 0.8106 29.3011893209778727 137.495201513748 +8107 0.8107 29.2874385310139687 137.520597764305 +8108 0.8108 29.2736852025150895 137.545972213312 +8109 0.8109 29.2599293376603882 137.571324880702 +8110 0.8110 29.2461709386270314 137.596655786409 +8111 0.8111 29.2324100075901931 137.621964950372 +8112 0.8112 29.2186465467230470 137.647252392535 +8113 0.8113 29.2048805581967770 137.672518132839 +8114 0.8114 29.1911120441805743 137.697762191232 +8115 0.8115 29.1773410068416297 137.722984587662 +8116 0.8116 29.1635674483451410 137.748185342082 +8117 0.8117 29.1497913708543130 137.773364474444 +8118 0.8118 29.1360127765303538 137.798522004707 +8119 0.8119 29.1222316675324784 137.823657952831 +8120 0.8120 29.1084480460178980 137.848772338775 +8121 0.8121 29.0946619141418346 137.873865182507 +8122 0.8122 29.0808732740575095 137.898936503993 +8123 0.8123 29.0670821279161515 137.923986323201 +8124 0.8124 29.0532884778669853 137.949014660105 +8125 0.8125 29.0394923260572462 137.974021534679 +8126 0.8126 29.0256936746321657 137.999006966900 +8127 0.8127 29.0118925257349822 138.023970976749 +8128 0.8128 28.9980888815069342 138.048913584206 +8129 0.8129 28.9842827440872597 138.073834809258 +8130 0.8130 28.9704741156132037 138.098734671888 +8131 0.8131 28.9566629982200041 138.123613192091 +8132 0.8132 28.9428493940409055 138.148470389855 +8133 0.8133 28.9290333052071524 138.173306285175 +8134 0.8134 28.9152147338479928 138.198120898048 +8135 0.8135 28.9013936820906672 138.222914248472 +8136 0.8136 28.8875701520604196 138.247686356450 +8137 0.8137 28.8737441458804973 138.272437241985 +8138 0.8138 28.8599156656721441 138.297166925084 +8139 0.8139 28.8460847135546032 138.321875425754 +8140 0.8140 28.8322512916451146 138.346562764005 +8141 0.8141 28.8184154020589212 138.371228959853 +8142 0.8142 28.8045770469092624 138.395874033312 +8143 0.8143 28.7907362283073773 138.420498004400 +8144 0.8144 28.7768929483625016 138.445100893136 +8145 0.8145 28.7630472091818667 138.469682719542 +8146 0.8146 28.7491990128707080 138.494243503645 +8147 0.8147 28.7353483615322531 138.518783265470 +8148 0.8148 28.7214952572677262 138.543302025045 +8149 0.8149 28.7076397021763547 138.567799802402 +8150 0.8150 28.6937816983553553 138.592276617576 +8151 0.8151 28.6799212478999479 138.616732490601 +8152 0.8152 28.6660583529033417 138.641167441514 +8153 0.8153 28.6521930154567492 138.665581490357 +8154 0.8154 28.6383252376493722 138.689974657171 +8155 0.8155 28.6244550215684121 138.714346962000 +8156 0.8156 28.6105823692990668 138.738698424891 +8157 0.8157 28.5967072829245268 138.763029065894 +8158 0.8158 28.5828297645259788 138.787338905056 +8159 0.8159 28.5689498161826059 138.811627962432 +8160 0.8160 28.5550674399715803 138.835896258078 +8161 0.8161 28.5411826379680740 138.860143812050 +8162 0.8162 28.5272954122452518 138.884370644405 +8163 0.8163 28.5134057648742711 138.908576775208 +8164 0.8164 28.4995136979242858 138.932762224520 +8165 0.8165 28.4856192134624386 138.956927012406 +8166 0.8166 28.4717223135538724 138.981071158932 +8167 0.8167 28.4578230002617190 139.005194684171 +8168 0.8168 28.4439212756470994 139.029297608191 +8169 0.8169 28.4300171417691381 139.053379951065 +8170 0.8170 28.4161106006849415 139.077441732871 +8171 0.8171 28.4022016544496125 139.101482973684 +8172 0.8172 28.3882903051162501 139.125503693584 +8173 0.8173 28.3743765547359388 139.149503912653 +8174 0.8174 28.3604604053577560 139.173483650973 +8175 0.8175 28.3465418590287754 139.197442928629 +8176 0.8176 28.3326209177940598 139.221381765708 +8177 0.8177 28.3186975836966610 139.245300182298 +8178 0.8178 28.3047718587776203 139.269198198492 +8179 0.8179 28.2908437450759749 139.293075834380 +8180 0.8180 28.2769132446287514 139.316933110058 +8181 0.8181 28.2629803594709692 139.340770045622 +8182 0.8182 28.2490450916356295 139.364586661170 +8183 0.8183 28.2351074431537299 139.388382976802 +8184 0.8184 28.2211674160542572 139.412159012621 +8185 0.8185 28.2072250123641908 139.435914788729 +8186 0.8186 28.1932802341084923 139.459650325234 +8187 0.8187 28.1793330833101194 139.483365642241 +8188 0.8188 28.1653835619900157 139.507060759859 +8189 0.8189 28.1514316721671136 139.530735698199 +8190 0.8190 28.1374774158583350 139.554390477376 +8191 0.8191 28.1235207950785906 139.578025117502 +8192 0.8192 28.1095618118407806 139.601639638693 +8193 0.8193 28.0956004681557943 139.625234061068 +8194 0.8194 28.0816367660325028 139.648808404747 +8195 0.8195 28.0676707074777738 139.672362689849 +8196 0.8196 28.0537022944964569 139.695896936500 +8197 0.8197 28.0397315290913909 139.719411164824 +8198 0.8198 28.0257584132634037 139.742905394946 +8199 0.8199 28.0117829490113053 139.766379646995 +8200 0.8200 27.9978051383319020 139.789833941099 +8201 0.8201 27.9838249832199786 139.813268297392 +8202 0.8202 27.9698424856683090 139.836682736006 +8203 0.8203 27.9558576476676564 139.860077277076 +8204 0.8204 27.9418704712067658 139.883451940737 +8205 0.8205 27.9278809582723717 139.906806747127 +8206 0.8206 27.9138891108491976 139.930141716388 +8207 0.8207 27.8998949309199453 139.953456868659 +8208 0.8208 27.8858984204653098 139.976752224081 +8209 0.8209 27.8718995814639641 140.000027802801 +8210 0.8210 27.8578984158925742 140.023283624963 +8211 0.8211 27.8438949257257917 140.046519710717 +8212 0.8212 27.8298891129362467 140.069736080209 +8213 0.8213 27.8158809794945583 140.092932753590 +8214 0.8214 27.8018705273693278 140.116109751013 +8215 0.8215 27.7878577585271458 140.139267092630 +8216 0.8216 27.7738426749325846 140.162404798595 +8217 0.8217 27.7598252785482025 140.185522889069 +8218 0.8218 27.7458055713345395 140.208621384203 +8219 0.8219 27.7317835552501215 140.231700304163 +8220 0.8220 27.7177592322514599 140.254759669104 +8221 0.8221 27.7037326042930445 140.277799499192 +8222 0.8222 27.6897036733273545 140.300819814589 +8223 0.8223 27.6756724413048509 140.323820635461 +8224 0.8224 27.6616389101739806 140.346801981974 +8225 0.8225 27.6476030818811687 140.369763874295 +8226 0.8226 27.6335649583708225 140.392706332596 +8227 0.8227 27.6195245415853421 140.415629377045 +8228 0.8228 27.6054818334650989 140.438533027813 +8229 0.8229 27.5914368359484534 140.461417305076 +8230 0.8230 27.5773895509717484 140.484282229009 +8231 0.8231 27.5633399804693084 140.507127819785 +8232 0.8232 27.5492881263734404 140.529954097584 +8233 0.8233 27.5352339906144330 140.552761082584 +8234 0.8234 27.5211775751205572 140.575548794965 +8235 0.8235 27.5071188818180623 140.598317254908 +8236 0.8236 27.4930579126311869 140.621066482596 +8237 0.8237 27.4789946694821481 140.643796498213 +8238 0.8238 27.4649291542911413 140.666507321943 +8239 0.8239 27.4508613689763443 140.689198973974 +8240 0.8240 27.4367913154539202 140.711871474494 +8241 0.8241 27.4227189956380109 140.734524843690 +8242 0.8242 27.4086444114407399 140.757159101753 +8243 0.8243 27.3945675647722098 140.779774268875 +8244 0.8244 27.3804884575405048 140.802370365248 +8245 0.8245 27.3664070916516877 140.824947411066 +8246 0.8246 27.3523234690098072 140.847505426524 +8247 0.8247 27.3382375915168900 140.870044431819 +8248 0.8248 27.3241494610729418 140.892564447146 +8249 0.8249 27.3100590795759501 140.915065492705 +8250 0.8250 27.2959664489218810 140.937547588696 +8251 0.8251 27.2818715710046789 140.960010755318 +8252 0.8252 27.2677744477162740 140.982455012775 +8253 0.8253 27.2536750809465715 141.004880381270 +8254 0.8254 27.2395734725834586 141.027286881006 +8255 0.8255 27.2254696245127974 141.049674532189 +8256 0.8256 27.2113635386184356 141.072043355026 +8257 0.8257 27.1972552167821995 141.094393369724 +8258 0.8258 27.1831446608838903 141.116724596489 +8259 0.8259 27.1690318728012876 141.139037055534 +8260 0.8260 27.1549168544101569 141.161330767069 +8261 0.8261 27.1407996075842384 141.183605751304 +8262 0.8262 27.1266801341952508 141.205862028453 +8263 0.8263 27.1125584361128915 141.228099618730 +8264 0.8264 27.0984345152048363 141.250318542349 +8265 0.8265 27.0843083733367429 141.272518819526 +8266 0.8266 27.0701800123722442 141.294700470479 +8267 0.8267 27.0560494341729481 141.316863515424 +8268 0.8268 27.0419166405984477 141.339007974581 +8269 0.8269 27.0277816335063115 141.361133868170 +8270 0.8270 27.0136444147520827 141.383241216410 +8271 0.8271 26.9995049861892866 141.405330039524 +8272 0.8272 26.9853633496694236 141.427400357735 +8273 0.8273 26.9712195070419725 141.449452191265 +8274 0.8274 26.9570734601543940 141.471485560339 +8275 0.8275 26.9429252108521169 141.493500485184 +8276 0.8276 26.9287747609785555 141.515496986024 +8277 0.8277 26.9146221123750991 141.537475083087 +8278 0.8278 26.9004672668811153 141.559434796600 +8279 0.8279 26.8863102263339471 141.581376146794 +8280 0.8280 26.8721509925689119 141.603299153899 +8281 0.8281 26.8579895674193097 141.625203838143 +8282 0.8282 26.8438259527164149 141.647090219760 +8283 0.8283 26.8296601502894774 141.668958318981 +8284 0.8284 26.8154921619657252 141.690808156039 +8285 0.8285 26.8013219895703649 141.712639751169 +8286 0.8286 26.7871496349265747 141.734453124606 +8287 0.8287 26.7729750998555147 141.756248296585 +8288 0.8288 26.7587983861763199 141.778025287342 +8289 0.8289 26.7446194957060968 141.799784117113 +8290 0.8290 26.7304384302599338 141.821524806140 +8291 0.8291 26.7162551916508946 141.843247374658 +8292 0.8292 26.7020697816900174 141.864951842907 +8293 0.8293 26.6878822021863158 141.886638231130 +8294 0.8294 26.6736924549467815 141.908306559565 +8295 0.8295 26.6595005417763815 141.929956848455 +8296 0.8296 26.6453064644780575 141.951589118041 +8297 0.8297 26.6311102248527263 141.973203388569 +8298 0.8298 26.6169118246992831 141.994799680281 +8299 0.8299 26.6027112658145981 142.016378013421 +8300 0.8300 26.5885085499935165 142.037938408235 +8301 0.8301 26.5743036790288549 142.059480884968 +8302 0.8302 26.5600966547114119 142.081005463869 +8303 0.8303 26.5458874788299610 142.102512165182 +8304 0.8304 26.5316761531712437 142.124001009158 +8305 0.8305 26.5174626795199835 142.145472016043 +8306 0.8306 26.5032470596588787 142.166925206087 +8307 0.8307 26.4890292953685957 142.188360599540 +8308 0.8308 26.4748093884277864 142.209778216653 +8309 0.8309 26.4605873406130705 142.231178077676 +8310 0.8310 26.4463631536990427 142.252560202861 +8311 0.8311 26.4321368294582761 142.273924612459 +8312 0.8312 26.4179083696613155 142.295271326724 +8313 0.8313 26.4036777760766839 142.316600365910 +8314 0.8314 26.3894450504708757 142.337911750270 +8315 0.8315 26.3752101946083606 142.359205500058 +8316 0.8316 26.3609732102515828 142.380481635529 +8317 0.8317 26.3467340991609582 142.401740176939 +8318 0.8318 26.3324928630948847 142.422981144544 +8319 0.8319 26.3182495038097279 142.444204558601 +8320 0.8320 26.3040040230598287 142.465410439365 +8321 0.8321 26.2897564225975060 142.486598807097 +8322 0.8322 26.2755067041730470 142.507769682052 +8323 0.8323 26.2612548695347208 142.528923084489 +8324 0.8324 26.2470009204287642 142.550059034668 +8325 0.8325 26.2327448585993892 142.571177552848 +8326 0.8326 26.2184866857887826 142.592278659290 +8327 0.8327 26.2042264037371062 142.613362374253 +8328 0.8328 26.1899640141824932 142.634428717998 +8329 0.8329 26.1756995188610553 142.655477710784 +8330 0.8330 26.1614329195068720 142.676509372878 +8331 0.8331 26.1471642178520014 142.697523724537 +8332 0.8332 26.1328934156264729 142.718520786027 +8333 0.8333 26.1186205145582910 142.739500577609 +8334 0.8334 26.1043455163734350 142.760463119546 +8335 0.8335 26.0900684227958521 142.781408432102 +8336 0.8336 26.0757892355474716 142.802336535541 +8337 0.8337 26.0615079563481871 142.823247450130 +8338 0.8338 26.0472245869158741 142.844141196128 +8339 0.8339 26.0329391289663761 142.865017793805 +8340 0.8340 26.0186515842135151 142.885877263424 +8341 0.8341 26.0043619543690809 142.906719625252 +8342 0.8342 25.9900702411428419 142.927544899555 +8343 0.8343 25.9757764462425342 142.948353106598 +8344 0.8344 25.9614805713738726 142.969144266648 +8345 0.8345 25.9471826182405430 142.989918399972 +8346 0.8346 25.9328825885442029 143.010675526839 +8347 0.8347 25.9185804839844849 143.031415667514 +8348 0.8348 25.9042763062589962 143.052138842267 +8349 0.8349 25.8899700570633158 143.072845071363 +8350 0.8350 25.8756617380909937 143.093534375073 +8351 0.8351 25.8613513510335551 143.114206773665 +8352 0.8352 25.8470388975805001 143.134862287407 +8353 0.8353 25.8327243794193002 143.155500936568 +8354 0.8354 25.8184077982354019 143.176122741418 +8355 0.8355 25.8040891557122194 143.196727722226 +8356 0.8356 25.7897684535311456 143.217315899261 +8357 0.8357 25.7754456933715446 143.237887292794 +8358 0.8358 25.7611208769107485 143.258441923094 +8359 0.8359 25.7467940058240714 143.278979810430 +8360 0.8360 25.7324650817847953 143.299500975076 +8361 0.8361 25.7181341064641771 143.320005437300 +8362 0.8362 25.7038010815314450 143.340493217372 +8363 0.8363 25.6894660086537989 143.360964335565 +8364 0.8364 25.6751288894964134 143.381418812148 +8365 0.8365 25.6607897257224380 143.401856667392 +8366 0.8366 25.6464485189929903 143.422277921570 +8367 0.8367 25.6321052709671626 143.442682594951 +8368 0.8368 25.6177599833020260 143.463070707809 +8369 0.8369 25.6034126576526155 143.483442280412 +8370 0.8370 25.5890632956719415 143.503797333035 +8371 0.8371 25.5747118990109925 143.524135885948 +8372 0.8372 25.5603584693187251 143.544457959422 +8373 0.8373 25.5460030082420673 143.564763573732 +8374 0.8374 25.5316455174259218 143.585052749145 +8375 0.8375 25.5172859985131666 143.605325505936 +8376 0.8376 25.5029244531446508 143.625581864378 +8377 0.8377 25.4885608829591952 143.645821844739 +8378 0.8378 25.4741952895935952 143.666045467294 +8379 0.8379 25.4598276746826144 143.686252752315 +8380 0.8380 25.4454580398589947 143.706443720073 +8381 0.8381 25.4310863867534493 143.726618390840 +8382 0.8382 25.4167127169946632 143.746776784888 +8383 0.8383 25.4023370322092958 143.766918922490 +8384 0.8384 25.3879593340219749 143.787044823917 +8385 0.8385 25.3735796240553064 143.807154509439 +8386 0.8386 25.3591979039298678 143.827247999333 +8387 0.8387 25.3448141752642080 143.847325313865 +8388 0.8388 25.3304284396748507 143.867386473311 +8389 0.8389 25.3160406987762876 143.887431497940 +8390 0.8390 25.3016509541809889 143.907460408025 +8391 0.8391 25.2872592074993960 143.927473223839 +8392 0.8392 25.2728654603399221 143.947469965650 +8393 0.8393 25.2584697143089514 143.967450653731 +8394 0.8394 25.2440719710108468 143.987415308354 +8395 0.8395 25.2296722320479390 144.007363949790 +8396 0.8396 25.2152704990205336 144.027296598307 +8397 0.8397 25.2008667735269078 144.047213274181 +8398 0.8398 25.1864610571633136 144.067113997679 +8399 0.8399 25.1720533515239744 144.086998789073 +8400 0.8400 25.1576436582010885 144.106867668634 +8401 0.8401 25.1432319787848257 144.126720656631 +8402 0.8402 25.1288183148633273 144.146557773334 +8403 0.8403 25.1144026680227093 144.166379039015 +8404 0.8404 25.0999850398470628 144.186184473941 +8405 0.8405 25.0855654319184467 144.205974098385 +8406 0.8406 25.0711438458168985 144.225747932613 +8407 0.8407 25.0567202831204234 144.245505996896 +8408 0.8408 25.0422947454050018 144.265248311502 +8409 0.8409 25.0278672342445923 144.284974896701 +8410 0.8410 25.0134377512111179 144.304685772762 +8411 0.8411 24.9990062978744838 144.324380959950 +8412 0.8412 24.9845728758025594 144.344060478536 +8413 0.8413 24.9701374865611925 144.363724348789 +8414 0.8414 24.9557001317142060 144.383372590973 +8415 0.8415 24.9412608128233906 144.403005225357 +8416 0.8416 24.9268195314485119 144.422622272208 +8417 0.8417 24.9123762891473106 144.442223751792 +8418 0.8418 24.8979310874755022 144.461809684378 +8419 0.8419 24.8834839279867701 144.481380090229 +8420 0.8420 24.8690348122327798 144.500934989613 +8421 0.8421 24.8545837417631610 144.520474402794 +8422 0.8422 24.8401307181255184 144.539998350037 +8423 0.8423 24.8256757428654353 144.559506851609 +8424 0.8424 24.8112188175264663 144.578999927773 +8425 0.8425 24.7967599436501374 144.598477598793 +8426 0.8426 24.7822991227759495 144.617939884935 +8427 0.8427 24.7678363564413786 144.637386806460 +8428 0.8428 24.7533716461818756 144.656818383631 +8429 0.8429 24.7389049935308591 144.676234636714 +8430 0.8430 24.7244364000197265 144.695635585968 +8431 0.8431 24.7099658671778464 144.715021251656 +8432 0.8432 24.6954933965325623 144.734391654041 +8433 0.8433 24.6810189896091927 144.753746813382 +8434 0.8434 24.6665426479310277 144.773086749942 +8435 0.8435 24.6520643730193321 144.792411483980 +8436 0.8436 24.6375841663933457 144.811721035756 +8437 0.8437 24.6231020295702798 144.831015425530 +8438 0.8438 24.6086179640653242 144.850294673562 +8439 0.8439 24.5941319713916400 144.869558800109 +8440 0.8440 24.5796440530603633 144.888807825430 +8441 0.8441 24.5651542105806016 144.908041769783 +8442 0.8442 24.5506624454594409 144.927260653425 +8443 0.8443 24.5361687592019386 144.946464496613 +8444 0.8444 24.5216731533111272 144.965653319601 +8445 0.8445 24.5071756292880139 144.984827142648 +8446 0.8446 24.4926761886315809 145.003985986010 +8447 0.8447 24.4781748328387820 145.023129869940 +8448 0.8448 24.4636715634045494 145.042258814692 +8449 0.8449 24.4491663818217901 145.061372840520 +8450 0.8450 24.4346592895813792 145.080471967678 +8451 0.8451 24.4201502881721737 145.099556216420 +8452 0.8452 24.4056393790810020 145.118625606995 +8453 0.8453 24.3911265637926711 145.137680159657 +8454 0.8454 24.3766118437899557 145.156719894657 +8455 0.8455 24.3620952205536092 145.175744832244 +8456 0.8456 24.3475766955623634 145.194754992669 +8457 0.8457 24.3330562702929214 145.213750396183 +8458 0.8458 24.3185339462199615 145.232731063033 +8459 0.8459 24.3040097248161366 145.251697013468 +8460 0.8460 24.2894836075520750 145.270648267735 +8461 0.8461 24.2749555958963832 145.289584846083 +8462 0.8462 24.2604256913156426 145.308506768755 +8463 0.8463 24.2458938952744063 145.327414056001 +8464 0.8464 24.2313602092352021 145.346306728062 +8465 0.8465 24.2168246346585398 145.365184805185 +8466 0.8466 24.2022871730029010 145.384048307615 +8467 0.8467 24.1877478257247418 145.402897255593 +8468 0.8468 24.1732065942784935 145.421731669363 +8469 0.8469 24.1586634801165658 145.440551569167 +8470 0.8470 24.1441184846893435 145.459356975244 +8471 0.8471 24.1295716094451898 145.478147907839 +8472 0.8472 24.1150228558304391 145.496924387189 +8473 0.8473 24.1004722252894013 145.515686433534 +8474 0.8474 24.0859197192643677 145.534434067113 +8475 0.8475 24.0713653391956051 145.553167308162 +8476 0.8476 24.0568090865213513 145.571886176920 +8477 0.8477 24.0422509626778229 145.590590693623 +8478 0.8478 24.0276909690992149 145.609280878507 +8479 0.8479 24.0131291072177007 145.627956751808 +8480 0.8480 23.9985653784634216 145.646618333758 +8481 0.8481 23.9839997842645047 145.665265644592 +8482 0.8482 23.9694323260470483 145.683898704543 +8483 0.8483 23.9548630052351292 145.702517533842 +8484 0.8484 23.9402918232508028 145.721122152721 +8485 0.8485 23.9257187815140959 145.739712581410 +8486 0.8486 23.9111438814430173 145.758288840140 +8487 0.8487 23.8965671244535542 145.776850949139 +8488 0.8488 23.8819885119596655 145.795398928636 +8489 0.8489 23.8674080453732920 145.813932798857 +8490 0.8490 23.8528257261043493 145.832452580029 +8491 0.8491 23.8382415555607281 145.850958292378 +8492 0.8492 23.8236555351483013 145.869449956129 +8493 0.8493 23.8090676662709200 145.887927591507 +8494 0.8494 23.7944779503304069 145.906391218733 +8495 0.8495 23.7798863887265703 145.924840858032 +8496 0.8496 23.7652929828571864 145.943276529623 +8497 0.8497 23.7506977341180203 145.961698253729 +8498 0.8498 23.7361006439028053 145.980106050569 +8499 0.8499 23.7215017136032600 145.998499940362 +8500 0.8500 23.7069009446090746 146.016879943327 +8501 0.8501 23.6922983383079249 146.035246079679 +8502 0.8502 23.6776938960854579 146.053598369636 +8503 0.8503 23.6630876193253066 146.071936833414 +8504 0.8504 23.6484795094090750 146.090261491228 +8505 0.8505 23.6338695677163493 146.108572363288 +8506 0.8506 23.6192577956246943 146.126869469811 +8507 0.8507 23.6046441945096532 146.145152831008 +8508 0.8508 23.5900287657447478 146.163422467090 +8509 0.8509 23.5754115107014783 146.181678398265 +8510 0.8510 23.5607924307493271 146.199920644743 +8511 0.8511 23.5461715272557548 146.218149226733 +8512 0.8512 23.5315488015861973 146.236364164442 +8513 0.8513 23.5169242551040725 146.254565478075 +8514 0.8514 23.5022978891707766 146.272753187839 +8515 0.8515 23.4876697051456880 146.290927313938 +8516 0.8516 23.4730397043861636 146.309087876573 +8517 0.8517 23.4584078882475389 146.327234895949 +8518 0.8518 23.4437742580831276 146.345368392267 +8519 0.8519 23.4291388152442295 146.363488385726 +8520 0.8520 23.4145015610801153 146.381594896526 +8521 0.8521 23.3998624969380451 146.399687944866 +8522 0.8522 23.3852216241632540 146.417767550942 +8523 0.8523 23.3705789440989591 146.435833734952 +8524 0.8524 23.3559344580863559 146.453886517089 +8525 0.8525 23.3412881674646258 146.471925917549 +8526 0.8526 23.3266400735709212 146.489951956525 +8527 0.8527 23.3119901777403840 146.507964654208 +8528 0.8528 23.2973384813061344 146.525964030791 +8529 0.8529 23.2826849855992712 146.543950106462 +8530 0.8530 23.2680296919488789 146.561922901410 +8531 0.8531 23.2533726016820168 146.579882435825 +8532 0.8532 23.2387137161237298 146.597828729891 +8533 0.8533 23.2240530365970450 146.615761803796 +8534 0.8534 23.2093905644229679 146.633681677723 +8535 0.8535 23.1947263009204896 146.651588371856 +8536 0.8536 23.1800602474065762 146.669481906378 +8537 0.8537 23.1653924051961830 146.687362301470 +8538 0.8538 23.1507227756022438 146.705229577311 +8539 0.8539 23.1360513599356743 146.723083754082 +8540 0.8540 23.1213781595053725 146.740924851959 +8541 0.8541 23.1067031756182182 146.758752891121 +8542 0.8542 23.0920264095790735 146.776567891741 +8543 0.8543 23.0773478626907860 146.794369873994 +8544 0.8544 23.0626675362541818 146.812158858055 +8545 0.8545 23.0479854315680726 146.829934864094 +8546 0.8546 23.0333015499292522 146.847697912284 +8547 0.8547 23.0186158926325000 146.865448022793 +8548 0.8548 23.0039284609705703 146.883185215790 +8549 0.8549 22.9892392562342103 146.900909511445 +8550 0.8550 22.9745482797121419 146.918620929921 +8551 0.8551 22.9598555326910763 146.936319491383 +8552 0.8552 22.9451610164557067 146.954005215996 +8553 0.8553 22.9304647322887121 146.971678123922 +8554 0.8554 22.9157666814707497 146.989338235323 +8555 0.8555 22.9010668652804661 147.006985570360 +8556 0.8556 22.8863652849944899 147.024620149189 +8557 0.8557 22.8716619418874316 147.042241991971 +8558 0.8558 22.8569568372318912 147.059851118860 +8559 0.8559 22.8422499722984469 147.077447550012 +8560 0.8560 22.8275413483556662 147.095031305581 +8561 0.8561 22.8128309666701021 147.112602405720 +8562 0.8562 22.7981188285062863 147.130160870578 +8563 0.8563 22.7834049351267431 147.147706720309 +8564 0.8564 22.7686892877919753 147.165239975058 +8565 0.8565 22.7539718877604749 147.182760654975 +8566 0.8566 22.7392527362887158 147.200268780205 +8567 0.8567 22.7245318346311613 147.217764370894 +8568 0.8568 22.7098091840402567 147.235247447185 +8569 0.8569 22.6950847857664364 147.252718029220 +8570 0.8570 22.6803586410581168 147.270176137141 +8571 0.8571 22.6656307511617072 147.287621791086 +8572 0.8572 22.6509011173215917 147.305055011193 +8573 0.8573 22.6361697407801508 147.322475817601 +8574 0.8574 22.6214366227777468 147.339884230446 +8575 0.8575 22.6067017645527315 147.357280269859 +8576 0.8576 22.5919651673414386 147.374663955975 +8577 0.8577 22.5772268323781944 147.392035308928 +8578 0.8578 22.5624867608953075 147.409394348843 +8579 0.8579 22.5477449541230719 147.426741095853 +8580 0.8580 22.5330014132897745 147.444075570083 +8581 0.8581 22.5182561396216876 147.461397791660 +8582 0.8582 22.5035091343430693 147.478707780709 +8583 0.8583 22.4887603986761668 147.496005557352 +8584 0.8584 22.4740099338412129 147.513291141713 +8585 0.8585 22.4592577410564331 147.530564553909 +8586 0.8586 22.4445038215380350 147.547825814062 +8587 0.8587 22.4297481765002189 147.565074942289 +8588 0.8588 22.4149908071551707 147.582311958705 +8589 0.8589 22.4002317147130654 147.599536883426 +8590 0.8590 22.3854709003820673 147.616749736565 +8591 0.8591 22.3707083653683263 147.633950538232 +8592 0.8592 22.3559441108759884 147.651139308541 +8593 0.8593 22.3411781381071819 147.668316067597 +8594 0.8594 22.3264104482620276 147.685480835510 +8595 0.8595 22.3116410425386320 147.702633632385 +8596 0.8596 22.2968699221330979 147.719774478327 +8597 0.8597 22.2820970882395102 147.736903393439 +8598 0.8598 22.2673225420499463 147.754020397823 +8599 0.8599 22.2525462847544766 147.771125511576 +8600 0.8600 22.2377683175411569 147.788218754801 +8601 0.8601 22.2229886415960358 147.805300147592 +8602 0.8602 22.2082072581031547 147.822369710045 +8603 0.8603 22.1934241682445403 147.839427462254 +8604 0.8604 22.1786393732002125 147.856473424312 +8605 0.8605 22.1638528741481799 147.873507616309 +8606 0.8606 22.1490646722644478 147.890530058336 +8607 0.8607 22.1342747687230066 147.907540770480 +8608 0.8608 22.1194831646958399 147.924539772828 +8609 0.8609 22.1046898613529237 147.941527085461 +8610 0.8610 22.0898948598622269 147.958502728468 +8611 0.8611 22.0750981613897075 147.975466721926 +8612 0.8612 22.0602997670993162 147.992419085918 +8613 0.8613 22.0454996781529928 148.009359840520 +8614 0.8614 22.0306978957106772 148.026289005810 +8615 0.8615 22.0158944209302945 148.043206601864 +8616 0.8616 22.0010892549677628 148.060112648755 +8617 0.8617 21.9862823989769964 148.077007166555 +8618 0.8618 21.9714738541099024 148.093890175335 +8619 0.8619 21.9566636215163768 148.110761695163 +8620 0.8620 21.9418517023443123 148.127621746107 +8621 0.8621 21.9270380977395938 148.144470348232 +8622 0.8622 21.9122228088461029 148.161307521602 +8623 0.8623 21.8974058368057101 148.178133286282 +8624 0.8624 21.8825871827582787 148.194947662328 +8625 0.8625 21.8677668478416720 148.211750669802 +8626 0.8626 21.8529448331917422 148.228542328762 +8627 0.8627 21.8381211399423414 148.245322659261 +8628 0.8628 21.8232957692253109 148.262091681356 +8629 0.8629 21.8084687221704883 148.278849415097 +8630 0.8630 21.7936399999057073 148.295595880538 +8631 0.8631 21.7788096035567946 148.312331097724 +8632 0.8632 21.7639775342475730 148.329055086705 +8633 0.8633 21.7491437930998615 148.345767867527 +8634 0.8634 21.7343083812334719 148.362469460231 +8635 0.8635 21.7194712997662158 148.379159884863 +8636 0.8636 21.7046325498139012 148.395839161461 +8637 0.8637 21.6897921324903251 148.412507310066 +8638 0.8638 21.6749500489072879 148.429164350712 +8639 0.8639 21.6601063001745793 148.445810303438 +8640 0.8640 21.6452608873999921 148.462445188275 +8641 0.8641 21.6304138116893157 148.479069025256 +8642 0.8642 21.6155650741463319 148.495681834411 +8643 0.8643 21.6007146758728226 148.512283635768 +8644 0.8644 21.5858626179685658 148.528874449354 +8645 0.8645 21.5710089015313393 148.545454295195 +8646 0.8646 21.5561535276569138 148.562023193313 +8647 0.8647 21.5412964974390633 148.578581163730 +8648 0.8648 21.5264378119695543 148.595128226464 +8649 0.8649 21.5115774723381534 148.611664401534 +8650 0.8650 21.4967154796326305 148.628189708958 +8651 0.8651 21.4818518349387446 148.644704168746 +8652 0.8652 21.4669865393402617 148.661207800914 +8653 0.8653 21.4521195939189440 148.677700625470 +8654 0.8654 21.4372509997545500 148.694182662425 +8655 0.8655 21.4223807579248380 148.710653931785 +8656 0.8656 21.4075088695055697 148.727114453555 +8657 0.8657 21.3926353355705068 148.743564247738 +8658 0.8658 21.3777601571914033 148.760003334338 +8659 0.8659 21.3628833354380205 148.776431733351 +8660 0.8660 21.3480048713781159 148.792849464777 +8661 0.8661 21.3331247660774466 148.809256548612 +8662 0.8662 21.3182430205997733 148.825653004849 +8663 0.8663 21.3033596360068564 148.842038853480 +8664 0.8664 21.2884746133584564 148.858414114499 +8665 0.8665 21.2735879537123367 148.874778807889 +8666 0.8666 21.2586996581242609 148.891132953642 +8667 0.8667 21.2438097276479922 148.907476571738 +8668 0.8668 21.2289181633352975 148.923809682163 +8669 0.8669 21.2140249662359430 148.940132304896 +8670 0.8670 21.1991301373977024 148.956444459919 +8671 0.8671 21.1842336778663451 148.972746167206 +8672 0.8672 21.1693355886856480 148.989037446733 +8673 0.8673 21.1544358708973874 149.005318318474 +8674 0.8674 21.1395345255413432 149.021588802400 +8675 0.8675 21.1246315536552984 149.037848918481 +8676 0.8676 21.1097269562750398 149.054098686684 +8677 0.8677 21.0948207344343572 149.070338126975 +8678 0.8678 21.0799128891650440 149.086567259317 +8679 0.8679 21.0650034214968933 149.102786103672 +8680 0.8680 21.0500923324577087 149.118994680000 +8681 0.8681 21.0351796230732973 149.135193008259 +8682 0.8682 21.0202652943674657 149.151381108405 +8683 0.8683 21.0053493473620243 149.167559000390 +8684 0.8684 20.9904317830767972 149.183726704168 +8685 0.8685 20.9755126025296050 149.199884239688 +8686 0.8686 20.9605918067362751 149.216031626898 +8687 0.8687 20.9456693967106418 149.232168885744 +8688 0.8688 20.9307453734645463 149.248296036170 +8689 0.8689 20.9158197380078335 149.264413098118 +8690 0.8690 20.9008924913483511 149.280520091528 +8691 0.8691 20.8859636344919579 149.296617036337 +8692 0.8692 20.8710331684425157 149.312703952481 +8693 0.8693 20.8561010942018967 149.328780859894 +8694 0.8694 20.8411674127699769 149.344847778509 +8695 0.8695 20.8262321251446387 149.360904728255 +8696 0.8696 20.8112952323217719 149.376951729059 +8697 0.8697 20.7963567352952765 149.392988800847 +8698 0.8698 20.7814166350570559 149.409015963544 +8699 0.8699 20.7664749325970242 149.425033237069 +8700 0.8700 20.7515316289031020 149.441040641343 +8701 0.8701 20.7365867249612208 149.457038196285 +8702 0.8702 20.7216402217553153 149.473025921808 +8703 0.8703 20.7066921202673342 149.489003837825 +8704 0.8704 20.6917424214772296 149.504971964250 +8705 0.8705 20.6767911263629678 149.520930320990 +8706 0.8706 20.6618382359005217 149.536878927952 +8707 0.8707 20.6468837510638714 149.552817805041 +8708 0.8708 20.6319276728250109 149.568746972161 +8709 0.8709 20.6169700021539413 149.584666449211 +8710 0.8710 20.6020107400186774 149.600576256091 +8711 0.8711 20.5870498873852377 149.616476412698 +8712 0.8712 20.5720874452176581 149.632366938924 +8713 0.8713 20.5571234144779780 149.648247854663 +8714 0.8714 20.5421577961262543 149.664119179803 +8715 0.8715 20.5271905911205508 149.679980934236 +8716 0.8716 20.5122218004169454 149.695833137843 +8717 0.8717 20.4972514249695266 149.711675810511 +8718 0.8718 20.4822794657303966 149.727508972121 +8719 0.8719 20.4673059236496613 149.743332642551 +8720 0.8720 20.4523307996754511 149.759146841679 +8721 0.8721 20.4373540947538999 149.774951589380 +8722 0.8722 20.4223758098291555 149.790746905526 +8723 0.8723 20.4073959458433798 149.806532809988 +8724 0.8724 20.3924145037367488 149.822309322636 +8725 0.8725 20.3774314844474489 149.838076463333 +8726 0.8726 20.3624468889116841 149.853834251946 +8727 0.8727 20.3474607180636688 149.869582708336 +8728 0.8728 20.3324729728356353 149.885321852362 +8729 0.8729 20.3174836541578223 149.901051703881 +8730 0.8730 20.3024927629584901 149.916772282749 +8731 0.8731 20.2875003001639129 149.932483608818 +8732 0.8732 20.2725062666983753 149.948185701941 +8733 0.8733 20.2575106634841795 149.963878581964 +8734 0.8734 20.2425134914416454 149.979562268735 +8735 0.8735 20.2275147514891032 149.995236782096 +8736 0.8736 20.2125144445429044 150.010902141891 +8737 0.8737 20.1975125715174109 150.026558367958 +8738 0.8738 20.1825091333250057 150.042205480133 +8739 0.8739 20.1675041308760861 150.057843498255 +8740 0.8740 20.1524975650790665 150.073472442152 +8741 0.8741 20.1374894368403758 150.089092331658 +8742 0.8742 20.1224797470644639 150.104703186599 +8743 0.8743 20.1074684966537944 150.120305026802 +8744 0.8744 20.0924556865088491 150.135897872090 +8745 0.8745 20.0774413175281303 150.151481742284 +8746 0.8746 20.0624253906081549 150.167056657203 +8747 0.8747 20.0474079066434605 150.182622636665 +8748 0.8748 20.0323888665266026 150.198179700482 +8749 0.8749 20.0173682711481540 150.213727868467 +8750 0.8750 20.0023461213967089 150.229267160430 +8751 0.8751 19.9873224181588789 150.244797596178 +8752 0.8752 19.9722971623192933 150.260319195517 +8753 0.8753 19.9572703547606061 150.275831978247 +8754 0.8754 19.9422419963634852 150.291335964172 +8755 0.8755 19.9272120880066232 150.306831173088 +8756 0.8756 19.9121806305667306 150.322317624790 +8757 0.8757 19.8971476249185386 150.337795339071 +8758 0.8758 19.8821130719347998 150.353264335724 +8759 0.8759 19.8670769724862879 150.368724634536 +8760 0.8760 19.8520393274417977 150.384176255293 +8761 0.8761 19.8370001376681451 150.399619217781 +8762 0.8762 19.8219594040301672 150.415053541778 +8763 0.8763 19.8069171273907259 150.430479247064 +8764 0.8764 19.7918733086107004 150.445896353417 +8765 0.8765 19.7768279485489984 150.461304880611 +8766 0.8766 19.7617810480625486 150.476704848417 +8767 0.8767 19.7467326080062975 150.492096276604 +8768 0.8768 19.7316826292332195 150.507479184940 +8769 0.8769 19.7166311125943139 150.522853593190 +8770 0.8770 19.7015780589385976 150.538219521114 +8771 0.8771 19.6865234691131192 150.553576988473 +8772 0.8772 19.6714673439629451 150.568926015024 +8773 0.8773 19.6564096843311660 150.584266620523 +8774 0.8774 19.6413504910589047 150.599598824720 +8775 0.8775 19.6262897649853016 150.614922647367 +8776 0.8776 19.6112275069475217 150.630238108210 +8777 0.8777 19.5961637177807617 150.645545226995 +8778 0.8778 19.5810983983182396 150.660844023465 +8779 0.8779 19.5660315493911980 150.676134517359 +8780 0.8780 19.5509631718289079 150.691416728414 +8781 0.8781 19.5358932664586682 150.706690676367 +8782 0.8782 19.5208218341058028 150.721956380949 +8783 0.8783 19.5057488755936603 150.737213861891 +8784 0.8784 19.4906743917436209 150.752463138921 +8785 0.8785 19.4755983833750861 150.767704231762 +8786 0.8786 19.4605208513054926 150.782937160139 +8787 0.8787 19.4454417963502983 150.798161943771 +8788 0.8788 19.4303612193229895 150.813378602377 +8789 0.8789 19.4152791210350877 150.828587155670 +8790 0.8790 19.4001955022961354 150.843787623364 +8791 0.8791 19.3851103639137072 150.858980025168 +8792 0.8792 19.3700237066934093 150.874164380790 +8793 0.8793 19.3549355314388727 150.889340709935 +8794 0.8794 19.3398458389517600 150.904509032305 +8795 0.8795 19.3247546300317659 150.919669367602 +8796 0.8796 19.3096619054766094 150.934821735521 +8797 0.8797 19.2945676660820453 150.949966155756 +8798 0.8798 19.2794719126418563 150.965102648002 +8799 0.8799 19.2643746459478606 150.980231231946 +8800 0.8800 19.2492758667899011 150.995351927277 +8801 0.8801 19.2341755759558524 151.010464753678 +8802 0.8802 19.2190737742316280 151.025569730831 +8803 0.8803 19.2039704624011662 151.040666878417 +8804 0.8804 19.1888656412464407 151.055756216110 +8805 0.8805 19.1737593115474567 151.070837763586 +8806 0.8806 19.1586514740822516 151.085911540516 +8807 0.8807 19.1435421296268977 151.100977566570 +8808 0.8808 19.1284312789554996 151.116035861413 +8809 0.8809 19.1133189228401932 151.131086444707 +8810 0.8810 19.0982050620511536 151.146129336115 +8811 0.8811 19.0830896973565842 151.161164555297 +8812 0.8812 19.0679728295227235 151.176192121906 +8813 0.8813 19.0528544593138491 151.191212055596 +8814 0.8814 19.0377345874922668 151.206224376017 +8815 0.8815 19.0226132148183247 151.221229102818 +8816 0.8816 19.0074903420504029 151.236226255644 +8817 0.8817 18.9923659699449132 151.251215854136 +8818 0.8818 18.9772400992563099 151.266197917934 +8819 0.8819 18.9621127307370791 151.281172466677 +8820 0.8820 18.9469838651377458 151.296139519998 +8821 0.8821 18.9318535032068702 151.311099097531 +8822 0.8822 18.9167216456910481 151.326051218902 +8823 0.8823 18.9015882933349175 151.340995903740 +8824 0.8824 18.8864534468811485 151.355933171667 +8825 0.8825 18.8713171070704497 151.370863042304 +8826 0.8826 18.8561792746415726 151.385785535271 +8827 0.8827 18.8410399503313002 151.400700670184 +8828 0.8828 18.8258991348744580 151.415608466652 +8829 0.8829 18.8107568290039104 151.430508944290 +8830 0.8830 18.7956130334505609 151.445402122703 +8831 0.8831 18.7804677489433516 151.460288021496 +8832 0.8832 18.7653209762092636 151.475166660273 +8833 0.8833 18.7501727159733171 151.490038058629 +8834 0.8834 18.7350229689585781 151.504902236165 +8835 0.8835 18.7198717358861479 151.519759212472 +8836 0.8836 18.7047190174751670 151.534609007144 +8837 0.8837 18.6895648144428215 151.549451639765 +8838 0.8838 18.6744091275043367 151.564287129925 +8839 0.8839 18.6592519573729803 151.579115497204 +8840 0.8840 18.6440933047600623 151.593936761182 +8841 0.8841 18.6289331703749319 151.608750941438 +8842 0.8842 18.6137715549249840 151.623558057546 +8843 0.8843 18.5986084591156526 151.638358129076 +8844 0.8844 18.5834438836504177 151.653151175599 +8845 0.8845 18.5682778292308051 151.667937216680 +8846 0.8846 18.5531102965563761 151.682716271883 +8847 0.8847 18.5379412863247452 151.697488360768 +8848 0.8848 18.5227707992315622 151.712253502892 +8849 0.8849 18.5075988359705264 151.727011717811 +8850 0.8850 18.4924253972333830 151.741763025077 +8851 0.8851 18.4772504837099163 151.756507444239 +8852 0.8852 18.4620740960879637 151.771244994843 +8853 0.8853 18.4468962350534014 151.785975696434 +8854 0.8854 18.4317169012901516 151.800699568550 +8855 0.8855 18.4165360954801862 151.815416630732 +8856 0.8856 18.4013538183035230 151.830126902512 +8857 0.8857 18.3861700704382258 151.844830403426 +8858 0.8858 18.3709848525604045 151.859527153001 +8859 0.8859 18.3557981653442148 151.874217170762 +8860 0.8860 18.3406100094618658 151.888900476235 +8861 0.8861 18.3254203855836053 151.903577088940 +8862 0.8862 18.3102292943777378 151.918247028395 +8863 0.8863 18.2950367365106139 151.932910314115 +8864 0.8864 18.2798427126466265 151.947566965613 +8865 0.8865 18.2646472234482253 151.962217002396 +8866 0.8866 18.2494502695759060 151.976860443972 +8867 0.8867 18.2342518516882137 151.991497309844 +8868 0.8868 18.2190519704417468 152.006127619512 +8869 0.8869 18.2038506264911462 152.020751392475 +8870 0.8870 18.1886478204891127 152.035368648226 +8871 0.8871 18.1734435530863898 152.049979406259 +8872 0.8872 18.1582378249317742 152.064583686060 +8873 0.8873 18.1430306366721155 152.079181507118 +8874 0.8874 18.1278219889523129 152.093772888913 +8875 0.8875 18.1126118824153224 152.108357850928 +8876 0.8876 18.0974003177021459 152.122936412637 +8877 0.8877 18.0821872954518383 152.137508593516 +8878 0.8878 18.0669728163015115 152.152074413036 +8879 0.8879 18.0517568808863267 152.166633890666 +8880 0.8880 18.0365394898394982 152.181187045871 +8881 0.8881 18.0213206437923006 152.195733898111 +8882 0.8882 18.0061003433740510 152.210274466849 +8883 0.8883 17.9908785892121301 152.224808771539 +8884 0.8884 17.9756553819319720 152.239336831636 +8885 0.8885 17.9604307221570600 152.253858666588 +8886 0.8886 17.9452046105089380 152.268374295845 +8887 0.8887 17.9299770476072027 152.282883738850 +8888 0.8888 17.9147480340695076 152.297387015044 +8889 0.8889 17.8995175705115628 152.311884143867 +8890 0.8890 17.8842856575471316 152.326375144754 +8891 0.8891 17.8690522957880376 152.340860037138 +8892 0.8892 17.8538174858441572 152.355338840446 +8893 0.8893 17.8385812283234308 152.369811574106 +8894 0.8894 17.8233435238318485 152.384278257542 +8895 0.8895 17.8081043729734638 152.398738910173 +8896 0.8896 17.7928637763503836 152.413193551418 +8897 0.8897 17.7776217345627785 152.427642200689 +8898 0.8898 17.7623782482088757 152.442084877397 +8899 0.8899 17.7471333178849591 152.456521600954 +8900 0.8900 17.7318869441853728 152.470952390762 +8901 0.8901 17.7166391277025248 152.485377266223 +8902 0.8902 17.7013898690268761 152.499796246736 +8903 0.8903 17.6861391687469549 152.514209351698 +8904 0.8904 17.6708870274493464 152.528616600502 +8905 0.8905 17.6556334457186956 152.543018012536 +8906 0.8906 17.6403784241377082 152.557413607188 +8907 0.8907 17.6251219632871567 152.571803403841 +8908 0.8908 17.6098640637458708 152.586187421876 +8909 0.8909 17.5946047260907434 152.600565680670 +8910 0.8910 17.5793439508967317 152.614938199598 +8911 0.8911 17.5640817387368493 152.629304998030 +8912 0.8912 17.5488180901821806 152.643666095335 +8913 0.8913 17.5335530058018705 152.658021510876 +8914 0.8914 17.5182864861631273 152.672371264018 +8915 0.8915 17.5030185318312199 152.686715374118 +8916 0.8916 17.4877491433694878 152.701053860531 +8917 0.8917 17.4724783213393309 152.715386742611 +8918 0.8918 17.4572060663002162 152.729714039704 +8919 0.8919 17.4419323788096747 152.744035771161 +8920 0.8920 17.4266572594233011 152.758351956322 +8921 0.8921 17.4113807086947574 152.772662614527 +8922 0.8922 17.3961027271757764 152.786967765112 +8923 0.8923 17.3808233154161513 152.801267427413 +8924 0.8924 17.3655424739637425 152.815561620759 +8925 0.8925 17.3502602033644813 152.829850364476 +8926 0.8926 17.3349765041623627 152.844133677889 +8927 0.8927 17.3196913768994527 152.858411580319 +8928 0.8928 17.3044048221158810 152.872684091084 +8929 0.8929 17.2891168403498519 152.886951229498 +8930 0.8930 17.2738274321376331 152.901213014873 +8931 0.8931 17.2585365980135634 152.915469466514 +8932 0.8932 17.2432443385100527 152.929720603729 +8933 0.8933 17.2279506541575742 152.943966445820 +8934 0.8934 17.2126555454846795 152.958207012083 +8935 0.8935 17.1973590130179836 152.972442321815 +8936 0.8936 17.1820610572821764 152.986672394306 +8937 0.8937 17.1667616788000181 153.000897248847 +8938 0.8938 17.1514608780923403 153.015116904723 +8939 0.8939 17.1361586556780452 153.029331381215 +8940 0.8940 17.1208550120741059 153.043540697602 +8941 0.8941 17.1055499477955664 153.057744873163 +8942 0.8942 17.0902434633555487 153.071943927166 +8943 0.8943 17.0749355592652456 153.086137878884 +8944 0.8944 17.0596262360339210 153.100326747580 +8945 0.8945 17.0443154941689166 153.114510552518 +8946 0.8946 17.0290033341756413 153.128689312959 +8947 0.8947 17.0136897565575858 153.142863048157 +8948 0.8948 16.9983747618163079 153.157031777367 +8949 0.8949 16.9830583504514472 153.171195519836 +8950 0.8950 16.9677405229607139 153.185354294812 +8951 0.8951 16.9524212798398963 153.199508121537 +8952 0.8952 16.9371006215828572 153.213657019253 +8953 0.8953 16.9217785486815337 153.227801007196 +8954 0.8954 16.9064550616259446 153.241940104596 +8955 0.8955 16.8911301609041793 153.256074330685 +8956 0.8956 16.8758038470024090 153.270203704690 +8957 0.8957 16.8604761204048827 153.284328245834 +8958 0.8958 16.8451469815939241 153.298447973336 +8959 0.8959 16.8298164310499381 153.312562906413 +8960 0.8960 16.8144844692514042 153.326673064279 +8961 0.8961 16.7991510966748834 153.340778466142 +8962 0.8962 16.7838163137950147 153.354879131211 +8963 0.8963 16.7684801210845187 153.368975078687 +8964 0.8964 16.7531425190141974 153.383066327770 +8965 0.8965 16.7378035080529273 153.397152897658 +8966 0.8966 16.7224630886676664 153.411234807542 +8967 0.8967 16.7071212613234579 153.425312076614 +8968 0.8968 16.6917780264834228 153.439384724058 +8969 0.8969 16.6764333846087673 153.453452769059 +8970 0.8970 16.6610873361587757 153.467516230796 +8971 0.8971 16.6457398815908135 153.481575128443 +8972 0.8972 16.6303910213603316 153.495629481177 +8973 0.8973 16.6150407559208659 153.509679308164 +8974 0.8974 16.5996890857240302 153.523724628571 +8975 0.8975 16.5843360112195235 153.537765461561 +8976 0.8976 16.5689815328551298 153.551801826293 +8977 0.8977 16.5536256510767181 153.565833741923 +8978 0.8978 16.5382683663282428 153.579861227601 +8979 0.8979 16.5229096790517396 153.593884302480 +8980 0.8980 16.5075495896873292 153.607902985703 +8981 0.8981 16.4921880986732248 153.621917296412 +8982 0.8982 16.4768252064457172 153.635927253747 +8983 0.8983 16.4614609134391863 153.649932876842 +8984 0.8984 16.4460952200861037 153.663934184829 +8985 0.8985 16.4307281268170193 153.677931196836 +8986 0.8986 16.4153596340605787 153.691923931989 +8987 0.8987 16.3999897422435090 153.705912409408 +8988 0.8988 16.3846184517906295 153.719896648211 +8989 0.8989 16.3692457631248445 153.733876667514 +8990 0.8990 16.3538716766671470 153.747852486427 +8991 0.8991 16.3384961928366224 153.761824124057 +8992 0.8992 16.3231193120504443 153.775791599508 +8993 0.8993 16.3077410347238754 153.789754931881 +8994 0.8994 16.2923613612702667 153.803714140272 +8995 0.8995 16.2769802921010651 153.817669243778 +8996 0.8996 16.2615978276258026 153.831620261484 +8997 0.8997 16.2462139682521034 153.845567212479 +8998 0.8998 16.2308287143856873 153.859510115847 +8999 0.8999 16.2154420664303629 153.873448990666 +9000 0.9000 16.2000540247880274 153.887383856012 +9001 0.9001 16.1846645898586949 153.901314730622 +9002 0.9002 16.1692737620407030 153.915241629199 +9003 0.9003 16.1538815417313053 153.929164558746 +9004 0.9004 16.1384879293274537 153.943083518271 +9005 0.9005 16.1230929252265973 153.956998498837 +9006 0.9006 16.1076965298274750 153.970909483599 +9007 0.9007 16.0922987435309039 153.984816447856 +9008 0.9008 16.0768995667405576 153.998719359089 +9009 0.9009 16.0614989998637512 154.012618177006 +9010 0.9010 16.0460970433122228 154.026512853594 +9011 0.9011 16.0306936975028869 154.040403333151 +9012 0.9012 16.0152889628586124 154.054289552340 +9013 0.9013 15.9998828398089845 154.068171440224 +9014 0.9014 15.9844753287910581 154.082048918320 +9015 0.9015 15.9690664302501109 154.095921900636 +9016 0.9016 15.9536561446403944 154.109790293710 +9017 0.9017 15.9382444724258754 154.123653996666 +9018 0.9018 15.9228314140809797 154.137512901250 +9019 0.9019 15.9074169700913242 154.151366891870 +9020 0.9020 15.8920011409544486 154.165215845647 +9021 0.9021 15.8765839271805440 154.179059632451 +9022 0.9022 15.8611653292931738 154.192898114947 +9023 0.9023 15.8457453478299950 154.206731148644 +9024 0.9024 15.8303239833434670 154.220558581926 +9025 0.9025 15.8149012364015658 154.234380256103 +9026 0.9026 15.7994771075884888 154.248196005451 +9027 0.9027 15.7840515975053535 154.262005657255 +9028 0.9028 15.7686247067708987 154.275809031853 +9029 0.9029 15.7531964360221721 154.289605942673 +9030 0.9030 15.7377667859152250 154.303396196284 +9031 0.9031 15.7223357571257889 154.317179592428 +9032 0.9032 15.7069033503499647 154.330955924073 +9033 0.9033 15.6914695663048889 154.344724977445 +9034 0.9034 15.6760344057294123 154.358486532080 +9035 0.9035 15.6605978693847661 154.372240360850 +9036 0.9036 15.6451599580552223 154.385986230025 +9037 0.9037 15.6297206725487570 154.399723899299 +9038 0.9038 15.6142800136976998 154.413453121840 +9039 0.9039 15.5988379823593917 154.427173644328 +9040 0.9040 15.5833945794168258 154.440885206993 +9041 0.9041 15.5679498057792927 154.454587543667 +9042 0.9042 15.5525036623830193 154.468280381812 +9043 0.9043 15.5370561501918001 154.481963442572 +9044 0.9044 15.5216072701976309 154.495636440808 +9045 0.9045 15.5061570234213342 154.509299085139 +9046 0.9046 15.4907054109131774 154.522951077983 +9047 0.9047 15.4752524337534982 154.536592115606 +9048 0.9048 15.4597980930533101 154.550221888147 +9049 0.9049 15.4443423899549188 154.563840079673 +9050 0.9050 15.4288853256325247 154.577446368210 +9051 0.9051 15.4134269012928247 154.591040425787 +9052 0.9052 15.3979671181756110 154.604621918480 +9053 0.9053 15.3825059775543647 154.618190506443 +9054 0.9054 15.3670434807368448 154.631745843959 +9055 0.9055 15.3515796290656734 154.645287579466 +9056 0.9056 15.3361144239189198 154.658815355616 +9057 0.9057 15.3206478667106740 154.672328809295 +9058 0.9058 15.3051799588916246 154.685827571678 +9059 0.9059 15.2897107019496286 154.699311268257 +9060 0.9060 15.2742400974102708 154.712779518891 +9061 0.9061 15.2587681468374345 154.726231937839 +9062 0.9062 15.2432948518338520 154.739668133797 +9063 0.9063 15.2278202140416656 154.753087709943 +9064 0.9064 15.2123442351429699 154.766490263978 +9065 0.9065 15.1968669168603636 154.779875388157 +9066 0.9066 15.1813882609574886 154.793242669330 +9067 0.9067 15.1659082692395728 154.806591688991 +9068 0.9068 15.1504269435539580 154.819922023300 +9069 0.9069 15.1349442857906364 154.833233243138 +9070 0.9070 15.1194602978827728 154.846524914132 +9071 0.9071 15.1039749818072302 154.859796596703 +9072 0.9072 15.0884883395850906 154.873047846101 +9073 0.9073 15.0730003732821629 154.886278212443 +9074 0.9074 15.0575110850095033 154.899487240749 +9075 0.9075 15.0420204769239163 154.912674470988 +9076 0.9076 15.0265285512284610 154.925839438108 +9077 0.9077 15.0110353101729519 154.938981672074 +9078 0.9078 14.9955407560544529 154.952100697915 +9079 0.9079 14.9800448912177693 154.965196035750 +9080 0.9080 14.9645477180559396 154.978267200836 +9081 0.9081 14.9490492390107175 154.991313703594 +9082 0.9082 14.9335494565730542 155.004335049661 +9083 0.9083 14.9180483732835754 155.017330739915 +9084 0.9084 14.9025459917330529 155.030300270517 +9085 0.9085 14.8870423145628799 155.043243132952 +9086 0.9086 14.8715373444655299 155.056158814056 +9087 0.9087 14.8560310841850232 155.069046796066 +9088 0.9088 14.8405235365173880 155.081906556648 +9089 0.9089 14.8250147043111085 155.094737568934 +9090 0.9090 14.8095045904675828 155.107539301566 +9091 0.9091 14.7939931979415693 155.120311218722 +9092 0.9092 14.7784805297416248 155.133052780162 +9093 0.9093 14.7629665889305546 155.145763441260 +9094 0.9094 14.7474513786258399 155.158442653043 +9095 0.9095 14.7319349020000772 155.171089862221 +9096 0.9096 14.7164171622814042 155.183704511233 +9097 0.9097 14.7008981627539281 155.196286038275 +9098 0.9098 14.6853779067581467 155.208833877341 +9099 0.9099 14.6698563976913672 155.221347458253 +9100 0.9100 14.6543336390081187 155.233826206704 +9101 0.9101 14.6388096342205696 155.246269544291 +9102 0.9102 14.6232843868989271 155.258676888551 +9103 0.9103 14.6077579006718494 155.271047652990 +9104 0.9104 14.5922301792268438 155.283381247134 +9105 0.9105 14.5767012263106608 155.295677076544 +9106 0.9106 14.5611710457296901 155.307934542871 +9107 0.9107 14.5456396413503519 155.320153043877 +9108 0.9108 14.5301070170994837 155.332331973478 +9109 0.9109 14.5145731769647206 155.344470721777 +9110 0.9110 14.4990381249948772 155.356568675096 +9111 0.9111 14.4835018653003225 155.368625216016 +9112 0.9112 14.4679644020533509 155.380639723405 +9113 0.9113 14.4524257394885574 155.392611572461 +9114 0.9114 14.4368858819031978 155.404540134743 +9115 0.9115 14.4213448336575514 155.416424778200 +9116 0.9116 14.4058025991752814 155.428264867214 +9117 0.9117 14.3902591829437885 155.440059762631 +9118 0.9118 14.3747145895145678 155.451808821792 +9119 0.9119 14.3591688235035502 155.463511398573 +9120 0.9120 14.3436218895914500 155.475166843413 +9121 0.9121 14.3280737925241120 155.486774503354 +9122 0.9122 14.3125245371128411 155.498333722070 +9123 0.9123 14.2969741282347425 155.509843839903 +9124 0.9124 14.2814225708330529 155.521304193897 +9125 0.9125 14.2658698699174664 155.532714117831 +9126 0.9126 14.2503160305644627 155.544072942251 +9127 0.9127 14.2347610579176251 155.555379994505 +9128 0.9128 14.2192049571879604 155.566634598779 +9129 0.9129 14.2036477336542148 155.577836076122 +9130 0.9130 14.1880893926631835 155.588983744493 +9131 0.9131 14.1725299396300208 155.600076918775 +9132 0.9132 14.1569693800385412 155.611114910829 +9133 0.9133 14.1414077194415242 155.622097029509 +9134 0.9134 14.1258449634610130 155.633022580705 +9135 0.9135 14.1102811177886096 155.643890867373 +9136 0.9136 14.0947161881857621 155.654701189568 +9137 0.9137 14.0791501804840600 155.665452844473 +9138 0.9138 14.0635831005855145 155.676145126439 +9139 0.9139 14.0480149544628414 155.686777327012 +9140 0.9140 14.0324457481597431 155.697348734962 +9141 0.9141 14.0168754877911788 155.707858636324 +9142 0.9142 14.0013041795436415 155.718306314422 +9143 0.9143 13.9857318296754247 155.728691049906 +9144 0.9144 13.9701584445168905 155.739012120783 +9145 0.9145 13.9545840304707287 155.749268802446 +9146 0.9146 13.9390085940122201 155.759460367709 +9147 0.9147 13.9234321416894922 155.769586086835 +9148 0.9148 13.9078546801237710 155.779645227573 +9149 0.9149 13.8922762160096323 155.789637055185 +9150 0.9150 13.8766967561152494 155.799560832478 +9151 0.9151 13.8611163072826340 155.809415819836 +9152 0.9152 13.8455348764278803 155.819201275253 +9153 0.9153 13.8299524705414001 155.828916454360 +9154 0.9154 13.8143690966881589 155.838560610458 +9155 0.9155 13.7987847620079087 155.848132994551 +9156 0.9156 13.7831994737154133 155.857632855371 +9157 0.9157 13.7676132391006742 155.867059439417 +9158 0.9158 13.7520260655291544 155.876411990981 +9159 0.9159 13.7364379604419966 155.885689752176 +9160 0.9160 13.7208489313562385 155.894891962971 +9161 0.9161 13.7052589858650293 155.904017861216 +9162 0.9162 13.6896681316378341 155.913066682683 +9163 0.9163 13.6740763764206452 155.922037661083 +9164 0.9164 13.6584837280361864 155.930930028107 +9165 0.9165 13.6428901943841083 155.939743013446 +9166 0.9166 13.6272957834411947 155.948475844829 +9167 0.9167 13.6117005032615506 155.957127748050 +9168 0.9168 13.5961043619767974 155.965697946999 +9169 0.9169 13.5805073677962636 155.974185663688 +9170 0.9170 13.5649095290071653 155.982590118281 +9171 0.9171 13.5493108539747951 155.990910529133 +9172 0.9172 13.5337113511426974 155.999146112805 +9173 0.9173 13.5181110290328519 156.007296084101 +9174 0.9174 13.5025098962458419 156.015359656102 +9175 0.9175 13.4869079614610285 156.023336040181 +9176 0.9176 13.4713052334367163 156.031224446048 +9177 0.9177 13.4557017210103247 156.039024081767 +9178 0.9178 13.4400974330985470 156.046734153791 +9179 0.9179 13.4244923786975079 156.054353866990 +9180 0.9180 13.4088865668829254 156.061882424678 +9181 0.9181 13.3932800068102598 156.069319028644 +9182 0.9182 13.3776727077148685 156.076662879174 +9183 0.9183 13.3620646789121551 156.083913175091 +9184 0.9184 13.3464559297977114 156.091069113773 +9185 0.9185 13.3308464698474634 156.098129891187 +9186 0.9186 13.3152363086178092 156.105094701913 +9187 0.9187 13.2996254557457547 156.111962739176 +9188 0.9188 13.2840139209490520 156.118733194872 +9189 0.9189 13.2684017140263286 156.125405259597 +9190 0.9190 13.2527888448572160 156.131978122672 +9191 0.9191 13.2371753234024734 156.138450972174 +9192 0.9192 13.2215611597041161 156.144822994964 +9193 0.9193 13.2059463638855323 156.151093376710 +9194 0.9194 13.1903309461516010 156.157261301919 +9195 0.9195 13.1747149167888065 156.163325953963 +9196 0.9196 13.1590982861653529 156.169286515106 +9197 0.9197 13.1434810647312705 156.175142166531 +9198 0.9198 13.1278632630185257 156.180892088369 +9199 0.9199 13.1122448916411205 156.186535459721 +9200 0.9200 13.0966259612951994 156.192071458691 +9201 0.9201 13.0810064827591450 156.197499262412 +9202 0.9202 13.0653864668936706 156.202818047068 +9203 0.9203 13.0497659246419211 156.208026987925 +9204 0.9204 13.0341448670295570 156.213125259358 +9205 0.9205 13.0185233051648463 156.218112034872 +9206 0.9206 13.0029012502387467 156.222986487136 +9207 0.9207 12.9872787135249901 156.227747788004 +9208 0.9208 12.9716557063801634 156.232395108544 +9209 0.9209 12.9560322402437826 156.236927619062 +9210 0.9210 12.9404083266383729 156.241344489130 +9211 0.9211 12.9247839771695361 156.245644887612 +9212 0.9212 12.9091592035260216 156.249827982688 +9213 0.9213 12.8935340174797926 156.253892941881 +9214 0.9214 12.8779084308860945 156.257838932083 +9215 0.9215 12.8622824556835109 156.261665119579 +9216 0.9216 12.8466561038940288 156.265370670077 +9217 0.9217 12.8310293876230883 156.268954748731 +9218 0.9218 12.8154023190596433 156.272416520159 +9219 0.9219 12.7997749104762111 156.275755148484 +9220 0.9220 12.7841471742289201 156.278969797344 +9221 0.9221 12.7685191227575565 156.282059629925 +9222 0.9222 12.7528907685856101 156.285023808989 +9223 0.9223 12.7372621243203170 156.287861496888 +9224 0.9224 12.7216332026526935 156.290571855600 +9225 0.9225 12.7060040163575767 156.293154046749 +9226 0.9226 12.6903745782936586 156.295607231627 +9227 0.9227 12.6747449014035158 156.297930571224 +9228 0.9228 12.6591149987136422 156.300123226250 +9229 0.9229 12.6434848833344713 156.302184357160 +9230 0.9230 12.6278545684604051 156.304113124176 +9231 0.9231 12.6122240673698300 156.305908687317 +9232 0.9232 12.5965933934251435 156.307570206415 +9233 0.9233 12.5809625600727646 156.309096841150 +9234 0.9234 12.5653315808431536 156.310487751061 +9235 0.9235 12.5497004693508210 156.311742095578 +9236 0.9236 12.5340692392943396 156.312859034049 +9237 0.9237 12.5184379044563485 156.313837725756 +9238 0.9238 12.5028064787035635 156.314677329942 +9239 0.9239 12.4871749759867754 156.315377005836 +9240 0.9240 12.4715434103408498 156.315935912674 +9241 0.9241 12.4559117958847292 156.316353209723 +9242 0.9242 12.4402801468214275 156.316628056309 +9243 0.9243 12.4246484774380210 156.316759611832 +9244 0.9244 12.4090168021056400 156.316747035794 +9245 0.9245 12.3933851352794591 156.316589487825 +9246 0.9246 12.3777534914986820 156.316286127699 +9247 0.9247 12.3621218853865287 156.315836115363 +9248 0.9248 12.3464903316502124 156.315238610956 +9249 0.9249 12.3308588450809236 156.314492774833 +9250 0.9250 12.3152274405538016 156.313597767593 +9251 0.9251 12.2995961330279169 156.312552750088 +9252 0.9252 12.2839649375462390 156.311356883461 +9253 0.9253 12.2683338692356081 156.310009329159 +9254 0.9254 12.2527029433067014 156.308509248959 +9255 0.9255 12.2370721750540046 156.306855804986 +9256 0.9256 12.2214415798557674 156.305048159745 +9257 0.9257 12.2058111731739736 156.303085476130 +9258 0.9258 12.1901809705542945 156.300966917457 +9259 0.9259 12.1745509876260485 156.298691647478 +9260 0.9260 12.1589212401021545 156.296258830410 +9261 0.9261 12.1432917437790859 156.293667630950 +9262 0.9262 12.1276625145368229 156.290917214305 +9263 0.9263 12.1120335683387967 156.288006746202 +9264 0.9264 12.0964049212318407 156.284935392919 +9265 0.9265 12.0807765893461294 156.281702321306 +9266 0.9266 12.0651485888951235 156.278306698801 +9267 0.9267 12.0495209361755116 156.274747693456 +9268 0.9268 12.0338936475671403 156.271024473954 +9269 0.9269 12.0182667395329617 156.267136209635 +9270 0.9270 12.0026402286189544 156.263082070514 +9271 0.9271 11.9870141314540639 156.258861227302 +9272 0.9272 11.9713884647501274 156.254472851429 +9273 0.9273 11.9557632453018030 156.249916115062 +9274 0.9274 11.9401384899864933 156.245190191128 +9275 0.9275 11.9245142157642707 156.240294253332 +9276 0.9276 11.9088904396777959 156.235227476180 +9277 0.9277 11.8932671788522377 156.229989035001 +9278 0.9278 11.8776444504951897 156.224578105962 +9279 0.9279 11.8620222718965866 156.218993866093 +9280 0.9280 11.8464006604286158 156.213235493306 +9281 0.9281 11.8307796335456299 156.207302166413 +9282 0.9282 11.8151592087840509 156.201193065151 +9283 0.9283 11.7995394037622834 156.194907370195 +9284 0.9284 11.7839202361806148 156.188444263186 +9285 0.9285 11.7683017238211178 156.181802926743 +9286 0.9286 11.7526838845475563 156.174982544490 +9287 0.9287 11.7370667363052785 156.167982301067 +9288 0.9288 11.7214502971211179 156.160801382162 +9289 0.9289 11.7058345851032843 156.153438974515 +9290 0.9290 11.6902196184412617 156.145894265951 +9291 0.9291 11.6746054154056935 156.138166445395 +9292 0.9292 11.6589919943482787 156.130254702884 +9293 0.9293 11.6433793737016540 156.122158229600 +9294 0.9294 11.6277675719792803 156.113876217874 +9295 0.9295 11.6121566077753258 156.105407861219 +9296 0.9296 11.5965464997645480 156.096752354341 +9297 0.9297 11.5809372667021737 156.087908893156 +9298 0.9298 11.5653289274237743 156.078876674816 +9299 0.9299 11.5497215008451466 156.069654897722 +9300 0.9300 11.5341150059621835 156.060242761544 +9301 0.9301 11.5185094618507442 156.050639467243 +9302 0.9302 11.5029048876665279 156.040844217084 +9303 0.9303 11.4873013026449406 156.030856214657 +9304 0.9304 11.4716987261009624 156.020674664897 +9305 0.9305 11.4560971774290135 156.010298774098 +9306 0.9306 11.4404966761028124 155.999727749938 +9307 0.9307 11.4248972416752412 155.988960801487 +9308 0.9308 11.4092988937782049 155.977997139234 +9309 0.9309 11.3937016521224876 155.966835975104 +9310 0.9310 11.3781055364976087 155.955476522468 +9311 0.9311 11.3625105667716770 155.943917996171 +9312 0.9312 11.3469167628912420 155.932159612541 +9313 0.9313 11.3313241448811439 155.920200589415 +9314 0.9314 11.3157327328443653 155.908040146149 +9315 0.9315 11.3001425469618759 155.895677503639 +9316 0.9316 11.2845536074924766 155.883111884339 +9317 0.9317 11.2689659347726465 155.870342512277 +9318 0.9318 11.2533795492163797 155.857368613070 +9319 0.9319 11.2377944713150288 155.844189413948 +9320 0.9320 11.2222107216371434 155.830804143762 +9321 0.9321 11.2066283208283046 155.817212033011 +9322 0.9322 11.1910472896109621 155.803412313849 +9323 0.9323 11.1754676487842648 155.789404220106 +9324 0.9324 11.1598894192238944 155.775186987309 +9325 0.9325 11.1443126218818946 155.760759852693 +9326 0.9326 11.1287372777864988 155.746122055218 +9327 0.9327 11.1131634080419577 155.731272835590 +9328 0.9328 11.0975910338283654 155.716211436271 +9329 0.9329 11.0820201764014765 155.700937101498 +9330 0.9330 11.0664508570925371 155.685449077308 +9331 0.9331 11.0508830973080947 155.669746611536 +9332 0.9332 11.0353169185298263 155.653828953845 +9333 0.9333 11.0197523423143462 155.637695355743 +9334 0.9334 11.0041893902930301 155.621345070588 +9335 0.9335 10.9886280841718200 155.604777353615 +9336 0.9336 10.9730684457310428 155.587991461942 +9337 0.9337 10.9575104968252166 155.570986654598 +9338 0.9338 10.9419542593828609 155.553762192525 +9339 0.9339 10.9263997554063046 155.536317338603 +9340 0.9340 10.9108470069714905 155.518651357665 +9341 0.9341 10.8952960362277818 155.500763516503 +9342 0.9342 10.8797468653977614 155.482653083898 +9343 0.9343 10.8641995167770347 155.464319330625 +9344 0.9344 10.8486540127340305 155.445761529471 +9345 0.9345 10.8331103757097953 155.426978955251 +9346 0.9346 10.8175686282177921 155.407970884819 +9347 0.9347 10.8020287928436964 155.388736597091 +9348 0.9348 10.7864908922451885 155.369275373052 +9349 0.9349 10.7709549491517471 155.349586495775 +9350 0.9350 10.7554209863644363 155.329669250435 +9351 0.9351 10.7398890267556979 155.309522924324 +9352 0.9352 10.7243590932691379 155.289146806864 +9353 0.9353 10.7088312089193138 155.268540189623 +9354 0.9354 10.6933053967915157 155.247702366329 +9355 0.9355 10.6777816800415550 155.226632632884 +9356 0.9356 10.6622600818955426 155.205330287381 +9357 0.9357 10.6467406256496684 155.183794630113 +9358 0.9358 10.6312233346699827 155.162024963594 +9359 0.9359 10.6157082323921745 155.140020592566 +9360 0.9360 10.6001953423213457 155.117780824017 +9361 0.9361 10.5846846880317855 155.095304967197 +9362 0.9362 10.5691762931667448 155.072592333625 +9363 0.9363 10.5536701814382088 155.049642237110 +9364 0.9364 10.5381663766266644 155.026453993763 +9365 0.9365 10.5226649025808765 155.003026922005 +9366 0.9366 10.5071657832176459 154.979360342589 +9367 0.9367 10.4916690425215862 154.955453578608 +9368 0.9368 10.4761747045448796 154.931305955507 +9369 0.9369 10.4606827934070488 154.906916801105 +9370 0.9370 10.4451933332947142 154.882285445599 +9371 0.9371 10.4297063484613552 154.857411221581 +9372 0.9372 10.4142218632270733 154.832293464052 +9373 0.9373 10.3987399019783489 154.806931510433 +9374 0.9374 10.3832604891677978 154.781324700580 +9375 0.9375 10.3677836493139282 154.755472376795 +9376 0.9376 10.3523094070008970 154.729373883839 +9377 0.9377 10.3368377868782577 154.703028568948 +9378 0.9378 10.3213688136607189 154.676435781842 +9379 0.9379 10.3059025121278900 154.649594874737 +9380 0.9380 10.2904389071240345 154.622505202363 +9381 0.9381 10.2749780235578179 154.595166121971 +9382 0.9382 10.2595198864020514 154.567576993346 +9383 0.9383 10.2440645206934438 154.539737178823 +9384 0.9384 10.2286119515323382 154.511646043298 +9385 0.9385 10.2131622040824617 154.483302954234 +9386 0.9386 10.1977153035706660 154.454707281683 +9387 0.9387 10.1822712752866664 154.425858398292 +9388 0.9388 10.1668301445827858 154.396755679317 +9389 0.9389 10.1513919368736882 154.367398502631 +9390 0.9390 10.1359566776361198 154.337786248743 +9391 0.9391 10.1205243924086421 154.307918300807 +9392 0.9392 10.1050951067913708 154.277794044625 +9393 0.9393 10.0896688464457061 154.247412868674 +9394 0.9394 10.0742456370940676 154.216774164107 +9395 0.9395 10.0588255045196249 154.185877324765 +9396 0.9396 10.0434084745660268 154.154721747194 +9397 0.9397 10.0279945731371338 154.123306830654 +9398 0.9398 10.0125838261967441 154.091631977122 +9399 0.9399 9.9971762597683220 154.059696591319 +9400 0.9400 9.9817718999347207 154.027500080708 +9401 0.9401 9.9663707728379105 153.995041855511 +9402 0.9402 9.9509729046786983 153.962321328717 +9403 0.9403 9.9355783217164575 153.929337916097 +9404 0.9404 9.9201870502688418 153.896091036210 +9405 0.9405 9.9047991167115104 153.862580110419 +9406 0.9406 9.8894145474778448 153.828804562897 +9407 0.9407 9.8740333690586688 153.794763820640 +9408 0.9408 9.8586556080019623 153.760457313475 +9409 0.9409 9.8432812909125840 153.725884474079 +9410 0.9410 9.8279104444519820 153.691044737973 +9411 0.9411 9.8125430953379063 153.655937543553 +9412 0.9412 9.7971792703441238 153.620562332082 +9413 0.9413 9.7818189963001334 153.584918547713 +9414 0.9414 9.7664623000908737 153.549005637491 +9415 0.9415 9.7511092086564304 153.512823051368 +9416 0.9416 9.7357597489917520 153.476370242208 +9417 0.9417 9.7204139481463514 153.439646665803 +9418 0.9418 9.7050718332240162 153.402651780883 +9419 0.9419 9.6897334313825159 153.365385049117 +9420 0.9420 9.6743987698333029 153.327845935128 +9421 0.9421 9.6590678758412203 153.290033906512 +9422 0.9422 9.6437407767242025 153.251948433830 +9423 0.9423 9.6284174998529792 153.213588990629 +9424 0.9424 9.6130980726507751 153.174955053453 +9425 0.9425 9.5977825225930111 153.136046101842 +9426 0.9426 9.5824708772070011 153.096861618350 +9427 0.9427 9.5671631640716566 153.057401088555 +9428 0.9428 9.5518594108171762 153.017664001060 +9429 0.9429 9.5365596451247470 152.977649847511 +9430 0.9430 9.5212638947262409 152.937358122600 +9431 0.9431 9.5059721874039074 152.896788324079 +9432 0.9432 9.4906845509900659 152.855939952763 +9433 0.9433 9.4754010133668007 152.814812512546 +9434 0.9434 9.4601216024656534 152.773405510401 +9435 0.9435 9.4448463462673136 152.731718456395 +9436 0.9436 9.4295752728013085 152.689750863701 +9437 0.9437 9.4143084101456935 152.647502248598 +9438 0.9438 9.3990457864267398 152.604972130481 +9439 0.9439 9.3837874298186215 152.562160031877 +9440 0.9440 9.3685333685431047 152.519065478444 +9441 0.9441 9.3532836308692335 152.475687998988 +9442 0.9442 9.3380382451130117 152.432027125462 +9443 0.9443 9.3227972396370902 152.388082392982 +9444 0.9444 9.3075606428504489 152.343853339832 +9445 0.9445 9.2923284832080846 152.299339507470 +9446 0.9446 9.2771007892106834 152.254540440543 +9447 0.9447 9.2618775894043122 152.209455686885 +9448 0.9448 9.2466589123800915 152.164084797533 +9449 0.9449 9.2314447867738778 152.118427326730 +9450 0.9450 9.2162352412659452 152.072482831938 +9451 0.9451 9.2010303045806570 152.026250873838 +9452 0.9452 9.1858300054861477 151.979731016344 +9453 0.9453 9.1706343727939998 151.932922826608 +9454 0.9454 9.1554434353589187 151.885825875030 +9455 0.9455 9.1402572220784037 151.838439735257 +9456 0.9456 9.1250757618924307 151.790763984205 +9457 0.9457 9.1098990837831177 151.742798202053 +9458 0.9458 9.0947272167744018 151.694541972253 +9459 0.9459 9.0795601899317120 151.645994881546 +9460 0.9460 9.0643980323616375 151.597156519956 +9461 0.9461 9.0492407732115989 151.548026480808 +9462 0.9462 9.0340884416695229 151.498604360725 +9463 0.9463 9.0189410669635048 151.448889759647 +9464 0.9464 9.0037986783614805 151.398882280827 +9465 0.9465 8.9886613051708970 151.348581530840 +9466 0.9466 8.9735289767383755 151.297987119596 +9467 0.9467 8.9584017224493788 151.247098660338 +9468 0.9468 8.9432795717278797 151.195915769656 +9469 0.9469 8.9281625540360228 151.144438067489 +9470 0.9470 8.9130506988737910 151.092665177133 +9471 0.9471 8.8979440357786714 151.040596725245 +9472 0.9472 8.8828425943253162 150.988232341855 +9473 0.9473 8.8677464041252048 150.935571660365 +9474 0.9474 8.8526554948263083 150.882614317563 +9475 0.9475 8.8375698961127487 150.829359953620 +9476 0.9476 8.8224896377044626 150.775808212105 +9477 0.9477 8.8074147493568589 150.721958739985 +9478 0.9478 8.7923452608604773 150.667811187633 +9479 0.9479 8.7772812020406530 150.613365208837 +9480 0.9480 8.7622226027571717 150.558620460798 +9481 0.9481 8.7471694929039252 150.503576604142 +9482 0.9482 8.7321219024085721 150.448233302926 +9483 0.9483 8.7170798612321931 150.392590224641 +9484 0.9484 8.7020433993689501 150.336647040216 +9485 0.9485 8.6870125468457378 150.280403424027 +9486 0.9486 8.6719873337218409 150.223859053906 +9487 0.9487 8.6569677900885882 150.167013611132 +9488 0.9488 8.6419539460690089 150.109866780456 +9489 0.9489 8.6269458318174816 150.052418250089 +9490 0.9490 8.6119434775193913 149.994667711719 +9491 0.9491 8.5969469133907808 149.936614860508 +9492 0.9492 8.5819561696779996 149.878259395103 +9493 0.9493 8.5669712766573625 149.819601017638 +9494 0.9494 8.5519922646347943 149.760639433741 +9495 0.9495 8.5370191639454802 149.701374352533 +9496 0.9496 8.5220520049535207 149.641805486644 +9497 0.9497 8.5070908180515783 149.581932552206 +9498 0.9498 8.4921356336605243 149.521755268862 +9499 0.9499 8.4771864822290919 149.461273359779 +9500 0.9500 8.4622433942335213 149.400486551634 +9501 0.9501 8.4473064001772080 149.339394574640 +9502 0.9502 8.4323755305903489 149.277997162535 +9503 0.9503 8.4174508160295929 149.216294052591 +9504 0.9504 8.4025322870776833 149.154284985618 +9505 0.9505 8.3876199743431030 149.091969705973 +9506 0.9506 8.3727139084597262 149.029347961558 +9507 0.9507 8.3578141200864575 148.966419503827 +9508 0.9508 8.3429206399068772 148.903184087788 +9509 0.9509 8.3280334986288871 148.839641472012 +9510 0.9510 8.3131527269843559 148.775791418629 +9511 0.9511 8.2982783557287565 148.711633693342 +9512 0.9512 8.2834104156408177 148.647168065420 +9513 0.9513 8.2685489375221604 148.582394307711 +9514 0.9514 8.2536939521969437 148.517312196640 +9515 0.9515 8.2388454905115012 148.451921512218 +9516 0.9516 8.2240035833339888 148.386222038036 +9517 0.9517 8.2091682615540229 148.320213561282 +9518 0.9518 8.1943395560823227 148.253895872734 +9519 0.9519 8.1795174978503482 148.187268766765 +9520 0.9520 8.1647021178099415 148.120332041354 +9521 0.9521 8.1498934469329694 148.053085498076 +9522 0.9522 8.1350915162109594 147.985528942118 +9523 0.9523 8.1202963566547393 147.917662182280 +9524 0.9524 8.1055079992940762 147.849485030967 +9525 0.9525 8.0907264751773180 147.780997304207 +9526 0.9526 8.0759518153710257 147.712198821644 +9527 0.9527 8.0611840509596160 147.643089406548 +9528 0.9528 8.0464232130449975 147.573668885811 +9529 0.9529 8.0316693327462101 147.503937089955 +9530 0.9530 8.0169224411990552 147.433893853133 +9531 0.9531 8.0021825695557425 147.363539013131 +9532 0.9532 7.9874497489845169 147.292872411372 +9533 0.9533 7.9727240106693023 147.221893892920 +9534 0.9534 7.9580053858093320 147.150603306479 +9535 0.9535 7.9432939056187886 147.079000504397 +9536 0.9536 7.9285896013264354 147.007085342669 +9537 0.9537 7.9138925041752550 146.934857680942 +9538 0.9538 7.8992026454220827 146.862317382512 +9539 0.9539 7.8845200563372408 146.789464314329 +9540 0.9540 7.8698447682041746 146.716298347001 +9541 0.9541 7.8551768123190850 146.642819354794 +9542 0.9542 7.8405162199905636 146.569027215631 +9543 0.9543 7.8258630225392265 146.494921811103 +9544 0.9544 7.8112172512973483 146.420503026463 +9545 0.9545 7.7965789376084933 146.345770750631 +9546 0.9546 7.7819481128271519 146.270724876194 +9547 0.9547 7.7673248083183717 146.195365299413 +9548 0.9548 7.7527090554573901 146.119691920220 +9549 0.9549 7.7381008856292679 146.043704642218 +9550 0.9550 7.7235003302285223 145.967403372691 +9551 0.9551 7.7089074206587576 145.890788022596 +9552 0.9552 7.6943221883322996 145.813858506571 +9553 0.9553 7.6797446646698244 145.736614742934 +9554 0.9554 7.6651748810999933 145.659056653685 +9555 0.9555 7.6506128690590840 145.581184164507 +9556 0.9556 7.6360586599906206 145.502997204769 +9557 0.9557 7.6215122853450055 145.424495707525 +9558 0.9558 7.6069737765791530 145.345679609518 +9559 0.9559 7.5924431651561184 145.266548851177 +9560 0.9560 7.5779204825447284 145.187103376622 +9561 0.9561 7.5634057602192142 145.107343133666 +9562 0.9562 7.5488990296588403 145.027268073809 +9563 0.9563 7.5344003223475378 144.946878152248 +9564 0.9564 7.5199096697735319 144.866173327873 +9565 0.9565 7.5054271034289748 144.785153563267 +9566 0.9566 7.4909526548095755 144.703818824711 +9567 0.9567 7.4764863554142309 144.622169082180 +9568 0.9568 7.4620282367446542 144.540204309346 +9569 0.9569 7.4475783303050074 144.457924483582 +9570 0.9570 7.4331366676015307 144.375329585956 +9571 0.9571 7.4187032801421715 144.292419601236 +9572 0.9572 7.4042781994362157 144.209194517888 +9573 0.9573 7.3898614569939172 144.125654328081 +9574 0.9574 7.3754530843261294 144.041799027682 +9575 0.9575 7.3610531129439325 143.957628616257 +9576 0.9576 7.3466615743582659 143.873143097079 +9577 0.9577 7.3322785000795561 143.788342477114 +9578 0.9578 7.3179039216173489 143.703226767034 +9579 0.9579 7.3035378704799365 143.617795981215 +9580 0.9580 7.2891803781739890 143.532050137727 +9581 0.9581 7.2748314762041852 143.445989258350 +9582 0.9582 7.2604911960728398 143.359613368560 +9583 0.9583 7.2461595692795351 143.272922497537 +9584 0.9584 7.2318366273207504 143.185916678160 +9585 0.9585 7.2175224016894921 143.098595947014 +9586 0.9586 7.2032169238749226 143.010960344379 +9587 0.9587 7.1889202253619917 142.923009914240 +9588 0.9588 7.1746323376310652 142.834744704283 +9589 0.9589 7.1603532921575566 142.746164765891 +9590 0.9590 7.1460831204115545 142.657270154147 +9591 0.9591 7.1318218538574554 142.568060927837 +9592 0.9592 7.1175695239535912 142.478537149441 +9593 0.9593 7.1033261621518626 142.388698885138 +9594 0.9594 7.0890917998973650 142.298546204809 +9595 0.9595 7.0748664686280236 142.208079182026 +9596 0.9596 7.0606501997742193 142.117297894060 +9597 0.9597 7.0464430247584220 142.026202421877 +9598 0.9598 7.0322449749948213 141.934792850136 +9599 0.9599 7.0180560818889548 141.843069267193 +9600 0.9600 7.0038763768373409 141.751031765094 +9601 0.9601 6.9897058912271071 141.658680439575 +9602 0.9602 6.9755446564356252 141.566015390068 +9603 0.9603 6.9613927038301373 141.473036719689 +9604 0.9604 6.9472500647673909 141.379744535246 +9605 0.9605 6.9331167705932666 141.286138947233 +9606 0.9606 6.9189928526424138 141.192220069830 +9607 0.9607 6.9048783422378772 141.097988020904 +9608 0.9608 6.8907732706907323 141.003442922002 +9609 0.9609 6.8766776692997142 140.908584898353 +9610 0.9610 6.8625915693508528 140.813414078870 +9611 0.9611 6.8485150021171020 140.717930596145 +9612 0.9612 6.8344479988579723 140.622134586444 +9613 0.9613 6.8203905908191649 140.526026189712 +9614 0.9614 6.8063428092322011 140.429605549569 +9615 0.9615 6.7923046853140576 140.332872813306 +9616 0.9616 6.7782762502667984 140.235828131885 +9617 0.9617 6.7642575352772072 140.138471659939 +9618 0.9618 6.7502485715164218 140.040803555769 +9619 0.9619 6.7362493901395668 139.942823981338 +9620 0.9620 6.7222600222853863 139.844533102277 +9621 0.9621 6.7082804990758786 139.745931087879 +9622 0.9622 6.6943108516159304 139.647018111091 +9623 0.9623 6.6803511109929499 139.547794348524 +9624 0.9624 6.6664013082765017 139.448259980444 +9625 0.9625 6.6524614745179411 139.348415190767 +9626 0.9626 6.6385316407500499 139.248260167064 +9627 0.9627 6.6246118379866692 139.147795100553 +9628 0.9628 6.6107020972223367 139.047020186102 +9629 0.9629 6.5968024494319204 138.945935622217 +9630 0.9630 6.5829129255702572 138.844541611054 +9631 0.9631 6.5690335565717843 138.742838358404 +9632 0.9632 6.5551643733501797 138.640826073697 +9633 0.9633 6.5413054067979948 138.538504969996 +9634 0.9634 6.5274566877862954 138.435875263998 +9635 0.9635 6.5136182471642945 138.332937176028 +9636 0.9636 6.4997901157589908 138.229690930042 +9637 0.9637 6.4859723243748082 138.126136753614 +9638 0.9638 6.4721649037932307 138.022274877944 +9639 0.9639 6.4583678847724411 137.918105537850 +9640 0.9640 6.4445812980469608 137.813628971764 +9641 0.9641 6.4308051743272863 137.708845421733 +9642 0.9642 6.4170395442995289 137.603755133413 +9643 0.9643 6.4032844386250547 137.498358356070 +9644 0.9644 6.3895398879401224 137.392655342568 +9645 0.9645 6.3758059228555251 137.286646349376 +9646 0.9646 6.3620825739562283 137.180331636562 +9647 0.9647 6.3483698718010109 137.073711467786 +9648 0.9648 6.3346678469221063 136.966786110302 +9649 0.9649 6.3209765298248435 136.859555834950 +9650 0.9650 6.3072959509872879 136.752020916156 +9651 0.9651 6.2936261408598835 136.644181631927 +9652 0.9652 6.2799671298650948 136.536038263849 +9653 0.9653 6.2663189483970481 136.427591097084 +9654 0.9654 6.2526816268211753 136.318840420365 +9655 0.9655 6.2390551954738580 136.209786525989 +9656 0.9656 6.2254396846620672 136.100429709824 +9657 0.9657 6.2118351246630112 135.990770271292 +9658 0.9658 6.1982415457237776 135.880808513377 +9659 0.9659 6.1846589780609778 135.770544742615 +9660 0.9660 6.1710874518603926 135.659979269092 +9661 0.9661 6.1575269972766158 135.549112406438 +9662 0.9662 6.1439776444327023 135.437944471827 +9663 0.9663 6.1304394234198121 135.326475785970 +9664 0.9664 6.1169123642968577 135.214706673114 +9665 0.9665 6.1033964970901504 135.102637461035 +9666 0.9666 6.0898918517930465 134.990268481035 +9667 0.9667 6.0763984583655981 134.877600067940 +9668 0.9668 6.0629163467341964 134.764632560094 +9669 0.9669 6.0494455467912243 134.651366299355 +9670 0.9670 6.0359860883947016 134.537801631089 +9671 0.9671 6.0225380013679386 134.423938904170 +9672 0.9672 6.0091013154991817 134.309778470975 +9673 0.9673 5.9956760605412640 134.195320687374 +9674 0.9674 5.9822622662112588 134.080565912733 +9675 0.9675 5.9688599621901268 133.965514509907 +9676 0.9676 5.9554691781223701 133.850166845232 +9677 0.9677 5.9420899436156818 133.734523288529 +9678 0.9678 5.9287222882406008 133.618584213087 +9679 0.9679 5.9153662415301627 133.502349995674 +9680 0.9680 5.9020218329795533 133.385821016517 +9681 0.9681 5.8886890920457624 133.268997659308 +9682 0.9682 5.8753680481472372 133.151880311196 +9683 0.9683 5.8620587306635379 133.034469362782 +9684 0.9684 5.8487611689349936 132.916765208110 +9685 0.9685 5.8354753922623548 132.798768244675 +9686 0.9686 5.8222014299064506 132.680478873402 +9687 0.9687 5.8089393110878476 132.561897498653 +9688 0.9688 5.7956890649865036 132.443024528218 +9689 0.9689 5.7824507207414273 132.323860373308 +9690 0.9690 5.7692243074503340 132.204405448553 +9691 0.9691 5.7560098541693065 132.084660171997 +9692 0.9692 5.7428073899124525 131.964624965090 +9693 0.9693 5.7296169436515640 131.844300252687 +9694 0.9694 5.7164385443157775 131.723686463040 +9695 0.9695 5.7032722207912361 131.602784027792 +9696 0.9696 5.6901180019207480 131.481593381976 +9697 0.9697 5.6769759165034488 131.360114964005 +9698 0.9698 5.6638459932944647 131.238349215669 +9699 0.9699 5.6507282610045744 131.116296582131 +9700 0.9700 5.6376227482998722 130.993957511917 +9701 0.9701 5.6245294838014308 130.871332456918 +9702 0.9702 5.6114484960849662 130.748421872374 +9703 0.9703 5.5983798136805039 130.625226216881 +9704 0.9704 5.5853234650720411 130.501745952374 +9705 0.9705 5.5722794786972161 130.377981544129 +9706 0.9706 5.5592478829469716 130.253933460756 +9707 0.9707 5.5462287061652242 130.129602174188 +9708 0.9708 5.5332219766485302 130.004988159685 +9709 0.9709 5.5202277226457550 129.880091895818 +9710 0.9710 5.5072459723577403 129.754913864471 +9711 0.9711 5.4942767539369752 129.629454550830 +9712 0.9712 5.4813200954872645 129.503714443381 +9713 0.9713 5.4683760250634004 129.377694033903 +9714 0.9714 5.4554445706708323 129.251393817460 +9715 0.9715 5.4425257602653394 129.124814292396 +9716 0.9716 5.4296196217527033 128.997955960329 +9717 0.9717 5.4167261829883788 128.870819326152 +9718 0.9718 5.4038454717771707 128.743404898012 +9719 0.9719 5.3909775158729039 128.615713187316 +9720 0.9720 5.3781223429781022 128.487744708722 +9721 0.9721 5.3652799807436597 128.359499980131 +9722 0.9722 5.3524504567685192 128.230979522682 +9723 0.9723 5.3396337985993476 128.102183860744 +9724 0.9724 5.3268300337302144 127.973113521915 +9725 0.9725 5.3140391896022683 127.843769037006 +9726 0.9726 5.3012612936034156 127.714150940047 +9727 0.9727 5.2884963730679999 127.584259768271 +9728 0.9728 5.2757444552764809 127.454096062109 +9729 0.9729 5.2630055674551164 127.323660365186 +9730 0.9730 5.2502797367756413 127.192953224319 +9731 0.9731 5.2375669903549502 127.061975189496 +9732 0.9732 5.2248673552547809 126.930726813885 +9733 0.9733 5.2121808584813953 126.799208653820 +9734 0.9734 5.1995075269852649 126.667421268793 +9735 0.9735 5.1868473876607526 126.535365221451 +9736 0.9736 5.1742004673458002 126.403041077589 +9737 0.9737 5.1615667928216142 126.270449406139 +9738 0.9738 5.1489463908123492 126.137590779168 +9739 0.9739 5.1363392879847973 126.004465771872 +9740 0.9740 5.1237455109480754 125.871074962559 +9741 0.9741 5.1111650862533144 125.737418932659 +9742 0.9742 5.0985980403933464 125.603498266700 +9743 0.9743 5.0860443998023959 125.469313552314 +9744 0.9744 5.0735041908557692 125.334865380222 +9745 0.9745 5.0609774398695464 125.200154344229 +9746 0.9746 5.0484641731002737 125.065181041220 +9747 0.9747 5.0359644167446556 124.929946071150 +9748 0.9748 5.0234781969392461 124.794450037034 +9749 0.9749 5.0110055397601467 124.658693544948 +9750 0.9750 4.9985464712226984 124.522677204013 +9751 0.9751 4.9861010172811779 124.386401626393 +9752 0.9752 4.9736692038284938 124.249867427287 +9753 0.9753 4.9612510566958834 124.113075224921 +9754 0.9754 4.9488466016526100 123.976025640540 +9755 0.9755 4.9364558644056631 123.838719298401 +9756 0.9756 4.9240788705994545 123.701156825766 +9757 0.9757 4.9117156458155211 123.563338852897 +9758 0.9758 4.8993662155722246 123.425266013041 +9759 0.9759 4.8870306053244512 123.286938942432 +9760 0.9760 4.8747088404633159 123.148358280276 +9761 0.9761 4.8624009463158648 123.009524668748 +9762 0.9762 4.8501069481447781 122.870438752981 +9763 0.9763 4.8378268711480761 122.731101181063 +9764 0.9764 4.8255607404588217 122.591512604021 +9765 0.9765 4.8133085811448293 122.451673675826 +9766 0.9766 4.8010704182083694 122.311585053370 +9767 0.9767 4.7888462765858772 122.171247396472 +9768 0.9768 4.7766361811476603 122.030661367862 +9769 0.9769 4.7644401566976082 121.889827633175 +9770 0.9770 4.7522582279729022 121.748746860945 +9771 0.9771 4.7400904196437255 121.607419722594 +9772 0.9772 4.7279367563129746 121.465846892426 +9773 0.9773 4.7157972625159719 121.324029047620 +9774 0.9774 4.7036719627201800 121.181966868220 +9775 0.9775 4.6915608813249126 121.039661037127 +9776 0.9776 4.6794640426610519 120.897112240092 +9777 0.9777 4.6673814709907617 120.754321165710 +9778 0.9778 4.6553131905072060 120.611288505404 +9779 0.9779 4.6432592253342646 120.468014953427 +9780 0.9780 4.6312195995262506 120.324501206848 +9781 0.9781 4.6191943370676309 120.180747965543 +9782 0.9782 4.6071834618727445 120.036755932190 +9783 0.9783 4.5951869977855218 119.892525812260 +9784 0.9784 4.5832049685792082 119.748058314007 +9785 0.9785 4.5712373979560850 119.603354148460 +9786 0.9786 4.5592843095471913 119.458414029416 +9787 0.9787 4.5473457269120487 119.313238673432 +9788 0.9788 4.5354216735383863 119.167828799813 +9789 0.9789 4.5235121728418655 119.022185130608 +9790 0.9790 4.5116172481658054 118.876308390599 +9791 0.9791 4.4997369227809108 118.730199307293 +9792 0.9792 4.4878712198850002 118.583858610911 +9793 0.9793 4.4760201626027349 118.437287034387 +9794 0.9794 4.4641837739853480 118.290485313348 +9795 0.9795 4.4523620770103749 118.143454186118 +9796 0.9796 4.4405550945813843 117.996194393696 +9797 0.9797 4.4287628495277112 117.848706679760 +9798 0.9798 4.4169853646041908 117.700991790649 +9799 0.9799 4.4052226624908899 117.553050475360 +9800 0.9800 4.3934747657928455 117.404883485535 +9801 0.9801 4.3817416970397955 117.256491575456 +9802 0.9802 4.3700234786859209 117.107875502032 +9803 0.9803 4.3583201331095793 116.959036024794 +9804 0.9804 4.3466316826130456 116.809973905885 +9805 0.9805 4.3349581494222491 116.660689910049 +9806 0.9806 4.3232995556865159 116.511184804623 +9807 0.9807 4.3116559234783081 116.361459359531 +9808 0.9808 4.3000272747929680 116.211514347273 +9809 0.9809 4.2884136315484591 116.061350542911 +9810 0.9810 4.2768150155851101 115.910968724070 +9811 0.9811 4.2652314486653609 115.760369670919 +9812 0.9812 4.2536629524735066 115.609554166170 +9813 0.9813 4.2421095486154448 115.458522995063 +9814 0.9814 4.2305712586184239 115.307276945358 +9815 0.9815 4.2190481039307892 115.155816807331 +9816 0.9816 4.2075401059217352 115.004143373755 +9817 0.9817 4.1960472858810522 114.852257439898 +9818 0.9818 4.1845696650188815 114.700159803516 +9819 0.9819 4.1731072644654637 114.547851264835 +9820 0.9820 4.1616601052708946 114.395332626547 +9821 0.9821 4.1502282084048767 114.242604693802 +9822 0.9822 4.1388115947564765 114.089668274196 +9823 0.9823 4.1274102851338785 113.936524177760 +9824 0.9824 4.1160243002641428 113.783173216954 +9825 0.9825 4.1046536607929625 113.629616206658 +9826 0.9826 4.0932983872844213 113.475853964158 +9827 0.9827 4.0819585002207566 113.321887309140 +9828 0.9828 4.0706340200021156 113.167717063682 +9829 0.9829 4.0593249669463196 113.013344052239 +9830 0.9830 4.0480313612886256 112.858769101636 +9831 0.9831 4.0367532231814911 112.703993041063 +9832 0.9832 4.0254905726943351 112.549016702058 +9833 0.9833 4.0142434298133072 112.393840918500 +9834 0.9834 4.0030118144410523 112.238466526603 +9835 0.9835 3.9917957463964773 112.082894364900 +9836 0.9836 3.9805952454145204 111.927125274237 +9837 0.9837 3.9694103311459203 111.771160097765 +9838 0.9838 3.9582410231569858 111.614999680925 +9839 0.9839 3.9470873409293676 111.458644871440 +9840 0.9840 3.9359493038598301 111.302096519311 +9841 0.9841 3.9248269312600246 111.145355476797 +9842 0.9842 3.9137202423562640 110.988422598413 +9843 0.9843 3.9026292562892975 110.831298740918 +9844 0.9844 3.8915539921140865 110.673984763303 +9845 0.9845 3.8804944687995824 110.516481526781 +9846 0.9846 3.8694507052285041 110.358789894782 +9847 0.9847 3.8584227201971180 110.200910732939 +9848 0.9848 3.8474105324150174 110.042844909075 +9849 0.9849 3.8364141605049036 109.884593293199 +9850 0.9850 3.8254336230023691 109.726156757494 +9851 0.9851 3.8144689383556791 109.567536176304 +9852 0.9852 3.8035201249255577 109.408732426127 +9853 0.9853 3.7925872009849710 109.249746385605 +9854 0.9854 3.7816701847189154 109.090578935511 +9855 0.9855 3.7707690942242027 108.931230958741 +9856 0.9856 3.7598839475092505 108.771703340304 +9857 0.9857 3.7490147624938697 108.611996967309 +9858 0.9858 3.7381615570090561 108.452112728960 +9859 0.9859 3.7273243487967811 108.292051516538 +9860 0.9860 3.7165031555097841 108.131814223399 +9861 0.9861 3.7056979947113664 107.971401744958 +9862 0.9862 3.6949088838751845 107.810814978681 +9863 0.9863 3.6841358403850468 107.650054824074 +9864 0.9864 3.6733788815347097 107.489122182672 +9865 0.9865 3.6626380245276748 107.328017958029 +9866 0.9866 3.6519132864769879 107.166743055709 +9867 0.9867 3.6412046844050390 107.005298383273 +9868 0.9868 3.6305122352433616 106.843684850270 +9869 0.9869 3.6198359558324369 106.681903368228 +9870 0.9870 3.6091758629214934 106.519954850638 +9871 0.9871 3.5985319731683139 106.357840212950 +9872 0.9872 3.5879043031390383 106.195560372560 +9873 0.9873 3.5772928693079704 106.033116248797 +9874 0.9874 3.5666976880573849 105.870508762915 +9875 0.9875 3.5561187756773349 105.707738838082 +9876 0.9876 3.5455561483654625 105.544807399369 +9877 0.9877 3.5350098222268072 105.381715373739 +9878 0.9878 3.5244798132736181 105.218463690037 +9879 0.9879 3.5139661374251672 105.055053278979 +9880 0.9880 3.5034688105075613 104.891485073141 +9881 0.9881 3.4929878482535570 104.727760006948 +9882 0.9882 3.4825232663023766 104.563879016663 +9883 0.9883 3.4720750801995246 104.399843040380 +9884 0.9884 3.4616433053966054 104.235653018006 +9885 0.9885 3.4512279572511422 104.071309891257 +9886 0.9886 3.4408290510263972 103.906814603642 +9887 0.9887 3.4304466018911923 103.742168100457 +9888 0.9888 3.4200806249197311 103.577371328769 +9889 0.9889 3.4097311350914223 103.412425237409 +9890 0.9890 3.3993981472907038 103.247330776958 +9891 0.9891 3.3890816763068687 103.082088899740 +9892 0.9892 3.3787817368338913 102.916700559807 +9893 0.9893 3.3684983434702542 102.751166712931 +9894 0.9894 3.3582315107187783 102.585488316590 +9895 0.9895 3.3479812529864508 102.419666329961 +9896 0.9896 3.3377475845842577 102.253701713903 +9897 0.9897 3.3275305197270151 102.087595430953 +9898 0.9898 3.3173300725332022 101.921348445307 +9899 0.9899 3.3071462570247960 101.754961722820 +9900 0.9900 3.2969790871271059 101.588436230982 +9901 0.9901 3.2868285766686109 101.421772938915 +9902 0.9902 3.2766947393807970 101.254972817363 +9903 0.9903 3.2665775888979955 101.088036838671 +9904 0.9904 3.2564771387572229 100.920965976786 +9905 0.9905 3.2463934023980219 100.753761207238 +9906 0.9906 3.2363263931623032 100.586423507133 +9907 0.9907 3.2262761242941900 100.418953855135 +9908 0.9908 3.2162426089398601 100.251353231466 +9909 0.9909 3.2062258601473927 100.083622617882 +9910 0.9910 3.1962258908666152 99.915762997672 +9911 0.9911 3.1862427139489498 99.747775355642 +9912 0.9912 3.1762763421472626 99.579660678100 +9913 0.9913 3.1663267881157147 99.411419952856 +9914 0.9914 3.1563940644096120 99.243054169198 +9915 0.9915 3.1464781834852578 99.074564317887 +9916 0.9916 3.1365791576998059 98.905951391147 +9917 0.9917 3.1266969993111160 98.737216382649 +9918 0.9918 3.1168317204776086 98.568360287502 +9919 0.9919 3.1069833332581211 98.399384102243 +9920 0.9920 3.0971518496117678 98.230288824821 +9921 0.9921 3.0873372813977973 98.061075454592 +9922 0.9922 3.0775396403754525 97.891744992301 +9923 0.9923 3.0677589382038337 97.722298440073 +9924 0.9924 3.0579951864417598 97.552736801406 +9925 0.9925 3.0482483965476321 97.383061081151 +9926 0.9926 3.0385185798792995 97.213272285505 +9927 0.9927 3.0288057476939243 97.043371422002 +9928 0.9928 3.0191099111478494 96.873359499496 +9929 0.9929 3.0094310812964671 96.703237528154 +9930 0.9930 2.9997692690940876 96.533006519440 +9931 0.9931 2.9901244853938103 96.362667486107 +9932 0.9932 2.9804967409473959 96.192221442184 +9933 0.9933 2.9708860464051385 96.021669402963 +9934 0.9934 2.9612924123157409 95.851012384991 +9935 0.9935 2.9517158491261886 95.680251406053 +9936 0.9936 2.9421563671816275 95.509387485168 +9937 0.9937 2.9326139767252410 95.338421642566 +9938 0.9938 2.9230886878981281 95.167354899688 +9939 0.9939 2.9135805107391857 94.996188279165 +9940 0.9940 2.9040894551849865 94.824922804816 +9941 0.9941 2.8946155310696646 94.653559501624 +9942 0.9942 2.8851587481247969 94.482099395734 +9943 0.9943 2.8757191159792881 94.310543514438 +9944 0.9944 2.8662966441592581 94.138892886161 +9945 0.9945 2.8568913420879274 93.967148540454 +9946 0.9946 2.8475032190855059 93.795311507977 +9947 0.9947 2.8381322843690824 93.623382820490 +9948 0.9948 2.8287785470525160 93.451363510842 +9949 0.9949 2.8194420161463261 93.279254612954 +9950 0.9950 2.8101227005575877 93.107057161816 +9951 0.9951 2.8008206090898238 92.934772193465 +9952 0.9952 2.7915357504429017 92.762400744981 +9953 0.9953 2.7822681332129293 92.589943854470 +9954 0.9954 2.7730177658921531 92.417402561057 +9955 0.9955 2.7637846568688569 92.244777904868 +9956 0.9956 2.7545688144272624 92.072070927022 +9957 0.9957 2.7453702467474304 91.899282669619 +9958 0.9958 2.7361889619051634 91.726414175725 +9959 0.9959 2.7270249678719090 91.553466489364 +9960 0.9960 2.7178782725146653 91.380440655505 +9961 0.9961 2.7087488835958879 91.207337720045 +9962 0.9962 2.6996368087733953 91.034158729805 +9963 0.9963 2.6905420556002793 90.860904732512 +9964 0.9964 2.6814646315248143 90.687576776789 +9965 0.9965 2.6724045438903676 90.514175912144 +9966 0.9966 2.6633617999353127 90.340703188954 +9967 0.9967 2.6543364067929422 90.167159658457 +9968 0.9968 2.6453283714913827 89.993546372739 +9969 0.9969 2.6363377009535096 89.819864384721 +9970 0.9970 2.6273644019968661 89.646114748148 +9971 0.9971 2.6184084813335802 89.472298517573 +9972 0.9972 2.6094699455702841 89.298416748350 +9973 0.9973 2.6005488012080358 89.124470496619 +9974 0.9974 2.5916450546422398 88.950460819297 +9975 0.9975 2.5827587121625721 88.776388774059 +9976 0.9976 2.5738897799529026 88.602255419334 +9977 0.9977 2.5650382640912217 88.428061814287 +9978 0.9978 2.5562041705495671 88.253809018807 +9979 0.9979 2.5473875051939516 88.079498093500 +9980 0.9980 2.5385882737842933 87.905130099670 +9981 0.9981 2.5298064819743442 87.730706099314 +9982 0.9982 2.5210421353116237 87.556227155100 +9983 0.9983 2.5122952392373503 87.381694330365 +9984 0.9984 2.5035657990863771 87.207108689098 +9985 0.9985 2.4948538200871262 87.032471295923 +9986 0.9986 2.4861593073615254 86.857783216098 +9987 0.9987 2.4774822659249458 86.683045515493 +9988 0.9988 2.4688227006861423 86.508259260580 +9989 0.9989 2.4601806164471922 86.333425518422 +9990 0.9990 2.4515560179034379 86.158545356665 +9991 0.9991 2.4429489096434289 85.983619843513 +9992 0.9992 2.4343592961488669 85.808650047729 +9993 0.9993 2.4257871817945498 85.633637038617 +9994 0.9994 2.4172325708483187 85.458581886007 +9995 0.9995 2.4086954674710057 85.283485660250 +9996 0.9996 2.4001758757163834 85.108349432194 +9997 0.9997 2.3916737995311141 84.933174273187 +9998 0.9998 2.3831892427547023 84.757961255052 +9999 0.9999 2.3747222091194460 84.582711450078 +10000 1.0000 2.3662727022503915 84.407425931012 +10001 1.0001 2.3578407256652891 84.232105771038 +10002 1.0002 2.3494262827745485 84.056752043776 +10003 1.0003 2.3410293768811967 83.881365823259 +10004 1.0004 2.3326500111808377 83.705948183924 +10005 1.0005 2.3242881887616114 83.530500200605 +10006 1.0006 2.3159439126041557 83.355022948513 +10007 1.0007 2.3076171855815688 83.179517503225 +10008 1.0008 2.2993080104593737 83.003984940675 +10009 1.0009 2.2910163898954830 82.828426337140 +10010 1.0010 2.2827423264401645 82.652842769226 +10011 1.0011 2.2744858225360103 82.477235313856 +10012 1.0012 2.2662468805179046 82.301605048261 +10013 1.0013 2.2580255026129934 82.125953049960 +10014 1.0014 2.2498216909406574 81.950280396756 +10015 1.0015 2.2416354475124836 81.774588166719 +10016 1.0016 2.2334667742322392 81.598877438171 +10017 1.0017 2.2253156728958468 81.423149289681 +10018 1.0018 2.2171821451913605 81.247404800043 +10019 1.0019 2.2090661926989448 81.071645048274 +10020 1.0020 2.2009678168908513 80.895871113592 +10021 1.0021 2.1928870191314012 80.720084075409 +10022 1.0022 2.1848238006769649 80.544285013316 +10023 1.0023 2.1767781626759453 80.368475007073 +10024 1.0024 2.1687501061687620 80.192655136592 +10025 1.0025 2.1607396320878358 80.016826481930 +10026 1.0026 2.1527467412575758 79.840990123271 +10027 1.0027 2.1447714343943662 79.665147140919 +10028 1.0028 2.1368137121065565 79.489298615280 +10029 1.0029 2.1288735748944498 79.313445626854 +10030 1.0030 2.1209510231502962 79.137589256218 +10031 1.0031 2.1130460571582845 78.961730584018 +10032 1.0032 2.1051586770945359 78.785870690953 +10033 1.0033 2.0972888830271001 78.610010657763 +10034 1.0034 2.0894366749159512 78.434151565218 +10035 1.0035 2.0816020526129853 78.258294494105 +10036 1.0036 2.0737850158620192 78.082440525213 +10037 1.0037 2.0659855642987925 77.906590739324 +10038 1.0038 2.0582036974509665 77.730746217196 +10039 1.0039 2.0504394147381291 77.554908039556 +10040 1.0040 2.0426927154717971 77.379077287082 +10041 1.0041 2.0349635988554233 77.203255040394 +10042 1.0042 2.0272520639844016 77.027442380040 +10043 1.0043 2.0195581098460753 76.851640386483 +10044 1.0044 2.0118817353197467 76.675850140088 +10045 1.0045 2.0042229391766866 76.500072721113 +10046 1.0046 1.9965817200801463 76.324309209690 +10047 1.0047 1.9889580765853709 76.148560685818 +10048 1.0048 1.9813520071396125 75.972828229350 +10049 1.0049 1.9737635100821462 75.797112919974 +10050 1.0050 1.9661925836442871 75.621415837210 +10051 1.0051 1.9586392259494072 75.445738060388 +10052 1.0052 1.9511034350129557 75.270080668643 +10053 1.0053 1.9435852087424785 75.094444740898 +10054 1.0054 1.9360845449376409 74.918831355852 +10055 1.0055 1.9286014412902499 74.743241591968 +10056 1.0056 1.9211358953842783 74.567676527462 +10057 1.0057 1.9136879046958910 74.392137240285 +10058 1.0058 1.9062574665934708 74.216624808117 +10059 1.0059 1.8988445783376475 74.041140308350 +10060 1.0060 1.8914492370813263 73.865684818075 +10061 1.0061 1.8840714398697189 73.690259414073 +10062 1.0062 1.8767111836403751 73.514865172801 +10063 1.0063 1.8693684652232163 73.339503170377 +10064 1.0064 1.8620432813405690 73.164174482568 +10065 1.0065 1.8547356286072016 72.988880184780 +10066 1.0066 1.8474455035303605 72.813621352044 +10067 1.0067 1.8401729025098084 72.638399059001 +10068 1.0068 1.8329178218378637 72.463214379893 +10069 1.0069 1.8256802576994415 72.288068388548 +10070 1.0070 1.8184602061720956 72.112962158369 +10071 1.0071 1.8112576632260611 71.937896762319 +10072 1.0072 1.8040726247242995 71.762873272910 +10073 1.0073 1.7969050864225444 71.587892762190 +10074 1.0074 1.7897550439693484 71.412956301732 +10075 1.0075 1.7826224929061310 71.238064962618 +10076 1.0076 1.7755074286672285 71.063219815428 +10077 1.0077 1.7684098465799456 70.888421930229 +10078 1.0078 1.7613297418646061 70.713672376560 +10079 1.0079 1.7542671096346072 70.538972223420 +10080 1.0080 1.7472219448964734 70.364322539255 +10081 1.0081 1.7401942425499133 70.189724391948 +10082 1.0082 1.7331839973878758 70.015178848803 +10083 1.0083 1.7261912040966090 69.840686976532 +10084 1.0084 1.7192158572557201 69.666249841246 +10085 1.0085 1.7122579513382359 69.491868508441 +10086 1.0086 1.7053174807106646 69.317544042983 +10087 1.0087 1.6983944396330606 69.143277509097 +10088 1.0088 1.6914888222590878 68.969069970357 +10089 1.0089 1.6846006226360866 68.794922489667 +10090 1.0090 1.6777298347051404 68.620836129256 +10091 1.0091 1.6708764523011446 68.446811950660 +10092 1.0092 1.6640404691528761 68.272851014710 +10093 1.0093 1.6572218788830644 68.098954381522 +10094 1.0094 1.6504206750084642 67.925123110482 +10095 1.0095 1.6436368509399284 67.751358260234 +10096 1.0096 1.6368703999824832 67.577660888669 +10097 1.0097 1.6301213153354044 67.404032052909 +10098 1.0098 1.6233895900922941 67.230472809298 +10099 1.0099 1.6166752172411598 67.056984213387 +10100 1.0100 1.6099781896644942 66.883567319923 +10101 1.0101 1.6032985001393565 66.710223182833 +10102 1.0102 1.5966361413374539 66.536952855218 +10103 1.0103 1.5899911058252263 66.363757389334 +10104 1.0104 1.5833633860639305 66.190637836583 +10105 1.0105 1.5767529744097264 66.017595247498 +10106 1.0106 1.5701598631137648 65.844630671734 +10107 1.0107 1.5635840443222755 65.671745158050 +10108 1.0108 1.5570255100766579 65.498939754303 +10109 1.0109 1.5504842523135713 65.326215507430 +10110 1.0110 1.5439602628650280 65.153573463439 +10111 1.0111 1.5374535334584862 64.981014667395 +10112 1.0112 1.5309640557169462 64.808540163405 +10113 1.0113 1.5244918211590452 64.636150994612 +10114 1.0114 1.5180368211991560 64.463848203175 +10115 1.0115 1.5115990471474841 64.291632830263 +10116 1.0116 1.5051784902101690 64.119505916036 +10117 1.0117 1.4987751414893853 63.947468499640 +10118 1.0118 1.4923889919834439 63.775521619188 +10119 1.0119 1.4860200325868971 63.603666311750 +10120 1.0120 1.4796682540906425 63.431903613340 +10121 1.0121 1.4733336471820302 63.260234558906 +10122 1.0122 1.4670162024449691 63.088660182315 +10123 1.0123 1.4607159103600362 62.917181516341 +10124 1.0124 1.4544327613045867 62.745799592651 +10125 1.0125 1.4481667455528644 62.574515441796 +10126 1.0126 1.4419178532761148 62.403330093197 +10127 1.0127 1.4356860745426985 62.232244575130 +10128 1.0128 1.4294713993182060 62.061259914720 +10129 1.0129 1.4232738174655739 61.890377137920 +10130 1.0130 1.4170933187452026 61.719597269506 +10131 1.0131 1.4109298928150744 61.548921333060 +10132 1.0132 1.4047835292308735 61.378350350961 +10133 1.0133 1.3986542174461070 61.207885344369 +10134 1.0134 1.3925419468122278 61.037527333216 +10135 1.0135 1.3864467065787573 60.867277336192 +10136 1.0136 1.3803684858934111 60.697136370731 +10137 1.0137 1.3743072738022244 60.527105453003 +10138 1.0138 1.3682630592496794 60.357185597896 +10139 1.0139 1.3622358310788341 60.187377819010 +10140 1.0140 1.3562255780314516 60.017683128639 +10141 1.0141 1.3502322887481315 59.848102537763 +10142 1.0142 1.3442559517684418 59.678637056031 +10143 1.0143 1.3382965555310526 59.509287691754 +10144 1.0144 1.3323540883738705 59.340055451890 +10145 1.0145 1.3264285385341745 59.170941342030 +10146 1.0146 1.3205198941487535 59.001946366389 +10147 1.0147 1.3146281432540445 58.833071527792 +10148 1.0148 1.3087532737862719 58.664317827662 +10149 1.0149 1.3028952735815884 58.495686266009 +10150 1.0150 1.2970541303762173 58.327177841414 +10151 1.0151 1.2912298318065956 58.158793551021 +10152 1.0152 1.2854223654095183 57.990534390524 +10153 1.0153 1.2796317186222843 57.822401354153 +10154 1.0154 1.2738578787828436 57.654395434662 +10155 1.0155 1.2681008331299446 57.486517623318 +10156 1.0156 1.2623605688032842 57.318768909889 +10157 1.0157 1.2566370728436582 57.151150282632 +10158 1.0158 1.2509303321931127 56.983662728277 +10159 1.0159 1.2452403336950977 56.816307232021 +10160 1.0160 1.2395670640946210 56.649084777512 +10161 1.0161 1.2339105100384036 56.481996346837 +10162 1.0162 1.2282706580750362 56.315042920510 +10163 1.0163 1.2226474946551376 56.148225477463 +10164 1.0164 1.2170410061315129 55.981544995029 +10165 1.0165 1.2114511787593147 55.815002448933 +10166 1.0166 1.2058779986962040 55.648598813280 +10167 1.0167 1.2003214520025129 55.482335060541 +10168 1.0168 1.1947815246414089 55.316212161543 +10169 1.0169 1.1892582024790590 55.150231085455 +10170 1.0170 1.1837514712847972 54.984392799780 +10171 1.0171 1.1782613167312912 54.818698270338 +10172 1.0172 1.1727877243947116 54.653148461255 +10173 1.0173 1.1673306797549010 54.487744334955 +10174 1.0174 1.1618901681955460 54.322486852143 +10175 1.0175 1.1564661750043490 54.157376971796 +10176 1.0176 1.1510586853732017 53.992415651152 +10177 1.0177 1.1456676843983593 53.827603845693 +10178 1.0178 1.1402931570806176 53.662942509140 +10179 1.0179 1.1349350883254889 53.498432593435 +10180 1.0180 1.1295934629433806 53.334075048734 +10181 1.0181 1.1242682656497744 53.169870823391 +10182 1.0182 1.1189594810654075 53.005820863949 +10183 1.0183 1.1136670937164539 52.841926115126 +10184 1.0184 1.1083910880347072 52.678187519807 +10185 1.0185 1.1031314483577654 52.514606019027 +10186 1.0186 1.0978881589292160 52.351182551964 +10187 1.0187 1.0926612038988217 52.187918055922 +10188 1.0188 1.0874505673227093 52.024813466325 +10189 1.0189 1.0822562331635579 51.861869716701 +10190 1.0190 1.0770781852907891 51.699087738673 +10191 1.0191 1.0719164074807583 51.536468461945 +10192 1.0192 1.0667708834169465 51.374012814292 +10193 1.0193 1.0616415966901547 51.211721721546 +10194 1.0194 1.0565285307986980 51.049596107588 +10195 1.0195 1.0514316691486019 50.887636894334 +10196 1.0196 1.0463509950537990 50.725845001723 +10197 1.0197 1.0412864917363276 50.564221347706 +10198 1.0198 1.0362381423265306 50.402766848235 +10199 1.0199 1.0312059298632563 50.241482417251 +10200 1.0200 1.0261898372940603 50.080368966671 +10201 1.0201 1.0211898474754078 49.919427406380 +10202 1.0202 1.0162059431728780 49.758658644214 +10203 1.0203 1.0112381070613696 49.598063585955 +10204 1.0204 1.0062863217253062 49.437643135313 +10205 1.0205 1.0013505696588445 49.277398193922 +10206 1.0206 0.9964308332660824 49.117329661318 +10207 1.0207 0.9915270948612696 48.957438434939 +10208 1.0208 0.9866393366690173 48.797725410106 +10209 1.0209 0.9817675408245112 48.638191480015 +10210 1.0210 0.9769116893737244 48.478837535722 +10211 1.0211 0.9720717642736315 48.319664466137 +10212 1.0212 0.9672477473924243 48.160673158009 +10213 1.0213 0.9624396205097281 48.001864495914 +10214 1.0214 0.9576473653168202 47.843239362245 +10215 1.0215 0.9528709634168477 47.684798637203 +10216 1.0216 0.9481103963250486 47.526543198781 +10217 1.0217 0.9433656454689717 47.368473922755 +10218 1.0218 0.9386366921887002 47.210591682676 +10219 1.0219 0.9339235177370737 47.052897349853 +10220 1.0220 0.9292261032799138 46.895391793344 +10221 1.0221 0.9245444298962493 46.738075879946 +10222 1.0222 0.9198784785785428 46.580950474184 +10223 1.0223 0.9152282302329188 46.424016438297 +10224 1.0224 0.9105936656793924 46.267274632231 +10225 1.0225 0.9059747656520997 46.110725913623 +10226 1.0226 0.9013715107995288 45.954371137795 +10227 1.0227 0.8967838816847522 45.798211157738 +10228 1.0228 0.8922118587856601 45.642246824104 +10229 1.0229 0.8876554224951951 45.486478985196 +10230 1.0230 0.8831145531215876 45.330908486954 +10231 1.0231 0.8785892308885926 45.175536172944 +10232 1.0232 0.8740794359357278 45.020362884352 +10233 1.0233 0.8695851483185120 44.865389459964 +10234 1.0234 0.8651063480087056 44.710616736165 +10235 1.0235 0.8606430148945512 44.556045546923 +10236 1.0236 0.8561951287810163 44.401676723775 +10237 1.0237 0.8517626693900364 44.247511095823 +10238 1.0238 0.8473456163607593 44.093549489718 +10239 1.0239 0.8429439492497908 43.939792729654 +10240 1.0240 0.8385576475314406 43.786241637350 +10241 1.0241 0.8341866905979707 43.632897032047 +10242 1.0242 0.8298310577598438 43.479759730492 +10243 1.0243 0.8254907282459728 43.326830546928 +10244 1.0244 0.8211656812039722 43.174110293085 +10245 1.0245 0.8168558957004094 43.021599778170 +10246 1.0246 0.8125613507210582 42.869299808854 +10247 1.0247 0.8082820251711526 42.717211189259 +10248 1.0248 0.8040178978756418 42.565334720956 +10249 1.0249 0.7997689475794467 42.413671202945 +10250 1.0250 0.7955351529477170 42.262221431648 +10251 1.0251 0.7913164925660895 42.110986200903 +10252 1.0252 0.7871129449409472 41.959966301943 +10253 1.0253 0.7829244884996802 41.809162523397 +10254 1.0254 0.7787511015909467 41.658575651272 +10255 1.0255 0.7745927624849359 41.508206468945 +10256 1.0256 0.7704494493736310 41.358055757152 +10257 1.0257 0.7663211403710745 41.208124293979 +10258 1.0258 0.7622078135136331 41.058412854848 +10259 1.0259 0.7581094467602650 40.908922212513 +10260 1.0260 0.7540260179927873 40.759653137041 +10261 1.0261 0.7499575050161448 40.610606395810 +10262 1.0262 0.7459038855586795 40.461782753496 +10263 1.0263 0.7418651372724018 40.313182972057 +10264 1.0264 0.7378412377332624 40.164807810732 +10265 1.0265 0.7338321644414245 40.016658026025 +10266 1.0266 0.7298378948215384 39.868734371697 +10267 1.0267 0.7258584062230159 39.721037598753 +10268 1.0268 0.7218936759203064 39.573568455437 +10269 1.0269 0.7179436811131737 39.426327687215 +10270 1.0270 0.7140083989269744 39.279316036771 +10271 1.0271 0.7100878064129360 39.132534243997 +10272 1.0272 0.7061818805484374 38.985983045974 +10273 1.0273 0.7022905982372900 38.839663176975 +10274 1.0274 0.6984139363100190 38.693575368445 +10275 1.0275 0.6945518715241469 38.547720348997 +10276 1.0276 0.6907043805644771 38.402098844397 +10277 1.0277 0.6868714400433793 38.256711577560 +10278 1.0278 0.6830530265010746 38.111559268534 +10279 1.0279 0.6792491164059232 37.966642634494 +10280 1.0280 0.6754596861547120 37.821962389732 +10281 1.0281 0.6716847120729431 37.677519245645 +10282 1.0282 0.6679241704151244 37.533313910729 +10283 1.0283 0.6641780373650598 37.389347090564 +10284 1.0284 0.6604462890361410 37.245619487811 +10285 1.0285 0.6567289014716406 37.102131802195 +10286 1.0286 0.6530258506450058 36.958884730500 +10287 1.0287 0.6493371124601529 36.815878966558 +10288 1.0288 0.6456626627517630 36.673115201241 +10289 1.0289 0.6420024772855785 36.530594122450 +10290 1.0290 0.6383565317587008 36.388316415104 +10291 1.0291 0.6347248017998889 36.246282761133 +10292 1.0292 0.6311072629698589 36.104493839467 +10293 1.0293 0.6275038907615842 35.962950326027 +10294 1.0294 0.6239146606005970 35.821652893718 +10295 1.0295 0.6203395478452903 35.680602212415 +10296 1.0296 0.6167785277872218 35.539798948956 +10297 1.0297 0.6132315756514173 35.399243767133 +10298 1.0298 0.6096986665966765 35.258937327683 +10299 1.0299 0.6061797757158784 35.118880288277 +10300 1.0300 0.6026748780362889 34.979073303513 +10301 1.0301 0.5991839485198681 34.839517024904 +10302 1.0302 0.5957069620635793 34.700212100872 +10303 1.0303 0.5922438934996990 34.561159176736 +10304 1.0304 0.5887947175961270 34.422358894704 +10305 1.0305 0.5853594090566985 34.283811893866 +10306 1.0306 0.5819379425214961 34.145518810181 +10307 1.0307 0.5785302925671636 34.007480276470 +10308 1.0308 0.5751364337072197 33.869696922409 +10309 1.0309 0.5717563403923734 33.732169374516 +10310 1.0310 0.5683899870108404 33.594898256144 +10311 1.0311 0.5650373478886596 33.457884187474 +10312 1.0312 0.5616983972900107 33.321127785504 +10313 1.0313 0.5583731094175336 33.184629664038 +10314 1.0314 0.5550614584126476 33.048390433682 +10315 1.0315 0.5517634183558719 32.912410701833 +10316 1.0316 0.5484789632671468 32.776691072669 +10317 1.0317 0.5452080671061562 32.641232147143 +10318 1.0318 0.5419507037726505 32.506034522971 +10319 1.0319 0.5387068471067706 32.371098794628 +10320 1.0320 0.5354764708893726 32.236425553333 +10321 1.0321 0.5322595488423536 32.102015387046 +10322 1.0322 0.5290560546289784 31.967868880458 +10323 1.0323 0.5258659618542064 31.833986614983 +10324 1.0324 0.5226892440650202 31.700369168743 +10325 1.0325 0.5195258747507544 31.567017116573 +10326 1.0326 0.5163758273434258 31.433931029999 +10327 1.0327 0.5132390752180640 31.301111477237 +10328 1.0328 0.5101155916930429 31.168559023186 +10329 1.0329 0.5070053500304130 31.036274229411 +10330 1.0330 0.5039083234362353 30.904257654144 +10331 1.0331 0.5008244850609144 30.772509852274 +10332 1.0332 0.4977538079995340 30.641031375333 +10333 1.0333 0.4946962652921926 30.509822771495 +10334 1.0334 0.4916518299243398 30.378884585562 +10335 1.0335 0.4886204748271135 30.248217358964 +10336 1.0336 0.4856021728776783 30.117821629739 +10337 1.0337 0.4825968968995645 29.987697932538 +10338 1.0338 0.4796046196630073 29.857846798606 +10339 1.0339 0.4766253138852879 29.728268755781 +10340 1.0340 0.4736589522310746 29.598964328484 +10341 1.0341 0.4707055073127649 29.469934037711 +10342 1.0342 0.4677649516908280 29.341178401026 +10343 1.0343 0.4648372578741493 29.212697932549 +10344 1.0344 0.4619223983203741 29.084493142956 +10345 1.0345 0.4590203454362530 28.956564539466 +10346 1.0346 0.4561310715779881 28.828912625832 +10347 1.0347 0.4532545490515795 28.701537902339 +10348 1.0348 0.4503907501131731 28.574440865790 +10349 1.0349 0.4475396469694083 28.447622009506 +10350 1.0350 0.4447012117777676 28.321081823309 +10351 1.0351 0.4418754166469260 28.194820793523 +10352 1.0352 0.4390622336371018 28.068839402961 +10353 1.0353 0.4362616347604076 27.943138130922 +10354 1.0354 0.4334735919812025 27.817717453181 +10355 1.0355 0.4306980772164445 27.692577841979 +10356 1.0356 0.4279350623360443 27.567719766024 +10357 1.0357 0.4251845191632194 27.443143690474 +10358 1.0358 0.4224464194748488 27.318850076938 +10359 1.0359 0.4197207350018289 27.194839383461 +10360 1.0360 0.4170074374294295 27.071112064526 +10361 1.0361 0.4143064983976514 26.947668571037 +10362 1.0362 0.4116178895015835 26.824509350320 +10363 1.0363 0.4089415822917618 26.701634846114 +10364 1.0364 0.4062775482745281 26.579045498561 +10365 1.0365 0.4036257589123900 26.456741744200 +10366 1.0366 0.4009861856243818 26.334724015965 +10367 1.0367 0.3983587997864250 26.212992743170 +10368 1.0368 0.3957435727316911 26.091548351509 +10369 1.0369 0.3931404757509632 25.970391263048 +10370 1.0370 0.3905494800930001 25.849521896215 +10371 1.0371 0.3879705569648996 25.728940665795 +10372 1.0372 0.3854036775324636 25.608647982925 +10373 1.0373 0.3828488129205630 25.488644255087 +10374 1.0374 0.3803059342135037 25.368929886099 +10375 1.0375 0.3777750124553931 25.249505276113 +10376 1.0376 0.3752560186505074 25.130370821601 +10377 1.0377 0.3727489237636594 25.011526915358 +10378 1.0378 0.3702536987205672 24.892973946487 +10379 1.0379 0.3677703144082228 24.774712300401 +10380 1.0380 0.3652987416752623 24.656742358809 +10381 1.0381 0.3628389513323361 24.539064499714 +10382 1.0382 0.3603909141524801 24.421679097405 +10383 1.0383 0.3579546008714872 24.304586522454 +10384 1.0384 0.3555299821882791 24.187787141707 +10385 1.0385 0.3531170287652799 24.071281318277 +10386 1.0386 0.3507157112287891 23.955069411539 +10387 1.0387 0.3483260001693557 23.839151777129 +10388 1.0388 0.3459478661421528 23.723528766929 +10389 1.0389 0.3435812796673530 23.608200729068 +10390 1.0390 0.3412262112305039 23.493168007914 +10391 1.0391 0.3388826312829049 23.378430944067 +10392 1.0392 0.3365505102419837 23.263989874355 +10393 1.0393 0.3342298184916746 23.149845131828 +10394 1.0394 0.3319205263827956 23.035997045752 +10395 1.0395 0.3296226042334279 22.922445941603 +10396 1.0396 0.3273360223292946 22.809192141063 +10397 1.0397 0.3250607509241409 22.696235962010 +10398 1.0398 0.3227967602401144 22.583577718521 +10399 1.0399 0.3205440204681455 22.471217720858 +10400 1.0400 0.3183025017683292 22.359156275467 +10401 1.0401 0.3160721742703073 22.247393684970 +10402 1.0402 0.3138530080736506 22.135930248165 +10403 1.0403 0.3116449732482416 22.024766260015 +10404 1.0404 0.3094480398346585 21.913902011646 +10405 1.0405 0.3072621778445593 21.803337790339 +10406 1.0406 0.3050873572610659 21.693073879529 +10407 1.0407 0.3029235480391496 21.583110558797 +10408 1.0408 0.3007707201060165 21.473448103866 +10409 1.0409 0.2986288433614934 21.364086786595 +10410 1.0410 0.2964978876784149 21.255026874976 +10411 1.0411 0.2943778229030097 21.146268633127 +10412 1.0412 0.2922686188552888 21.037812321291 +10413 1.0413 0.2901702453294331 20.929658195824 +10414 1.0414 0.2880826720941818 20.821806509201 +10415 1.0415 0.2860058688932219 20.714257509997 +10416 1.0416 0.2839398054455771 20.607011442900 +10417 1.0417 0.2818844514459976 20.500068548690 +10418 1.0418 0.2798397765653509 20.393429064244 +10419 1.0419 0.2778057504510121 20.287093222530 +10420 1.0420 0.2757823427272556 20.181061252601 +10421 1.0421 0.2737695229956460 20.075333379591 +10422 1.0422 0.2717672608354310 19.969909824710 +10423 1.0423 0.2697755258039332 19.864790805245 +10424 1.0424 0.2677942874369436 19.759976534547 +10425 1.0425 0.2658235152491146 19.655467222034 +10426 1.0426 0.2638631787343537 19.551263073184 +10427 1.0427 0.2619132473662178 19.447364289532 +10428 1.0428 0.2599736905983080 19.343771068664 +10429 1.0429 0.2580444778646641 19.240483604216 +10430 1.0430 0.2561255785801599 19.137502085867 +10431 1.0431 0.2542169621408996 19.034826699339 +10432 1.0432 0.2523185979246133 18.932457626387 +10433 1.0433 0.2504304552910536 18.830395044806 +10434 1.0434 0.2485525035823926 18.728639128414 +10435 1.0435 0.2466847121236190 18.627190047058 +10436 1.0436 0.2448270502229357 18.526047966609 +10437 1.0437 0.2429794871721576 18.425213048953 +10438 1.0438 0.2411419922471102 18.324685451994 +10439 1.0439 0.2393145347080281 18.224465329649 +10440 1.0440 0.2374970837999535 18.124552831843 +10441 1.0441 0.2356896087531362 18.024948104503 +10442 1.0442 0.2338920787834328 17.925651289565 +10443 1.0443 0.2321044630927066 17.826662524958 +10444 1.0444 0.2303267308692281 17.727981944611 +10445 1.0445 0.2285588512880754 17.629609678443 +10446 1.0446 0.2268007935115350 17.531545852365 +10447 1.0447 0.2250525266895031 17.433790588274 +10448 1.0448 0.2233140199598868 17.336344004051 +10449 1.0449 0.2215852424490063 17.239206213559 +10450 1.0450 0.2198661632719965 17.142377326639 +10451 1.0451 0.2181567515332092 17.045857449107 +10452 1.0452 0.2164569763266163 16.949646682751 +10453 1.0453 0.2147668067362120 16.853745125334 +10454 1.0454 0.2130862118364162 16.758152870582 +10455 1.0455 0.2114151606924777 16.662870008188 +10456 1.0456 0.2097536223608779 16.567896623808 +10457 1.0457 0.2081015658897345 16.473232799060 +10458 1.0458 0.2064589603192056 16.378878611519 +10459 1.0459 0.2048257746818940 16.284834134713 +10460 1.0460 0.2032019780032519 16.191099438128 +10461 1.0461 0.2015875393019855 16.097674587200 +10462 1.0462 0.1999824275904598 16.004559643315 +10463 1.0463 0.1983866118751038 15.911754663805 +10464 1.0464 0.1968000611568161 15.819259701948 +10465 1.0465 0.1952227444313703 15.727074806968 +10466 1.0466 0.1936546306898206 15.635200024027 +10467 1.0467 0.1920956889189078 15.543635394229 +10468 1.0468 0.1905458881014655 15.452380954617 +10469 1.0469 0.1890051972168263 15.361436738167 +10470 1.0470 0.1874735852412282 15.270802773794 +10471 1.0471 0.1859510211482213 15.180479086344 +10472 1.0472 0.1844374739090743 15.090465696595 +10473 1.0473 0.1829329124931817 15.000762621257 +10474 1.0474 0.1814373058684706 14.911369872966 +10475 1.0475 0.1799506230018079 14.822287460288 +10476 1.0476 0.1784728328594076 14.733515387717 +10477 1.0477 0.1770039044072383 14.645053655669 +10478 1.0478 0.1755438066114306 14.556902260486 +10479 1.0479 0.1740925084386846 14.469061194433 +10480 1.0480 0.1726499788566782 14.381530445696 +10481 1.0481 0.1712161868344742 14.294309998384 +10482 1.0482 0.1697911013429287 14.207399832525 +10483 1.0483 0.1683746913550992 14.120799924066 +10484 1.0484 0.1669669258466520 14.034510244877 +10485 1.0485 0.1655677737962712 13.948530762740 +10486 1.0486 0.1641772041860662 13.862861441359 +10487 1.0487 0.1627951860019807 13.777502240352 +10488 1.0488 0.1614216882342003 13.692453115256 +10489 1.0489 0.1600566798775613 13.607714017523 +10490 1.0490 0.1587001299319593 13.523284894518 +10491 1.0491 0.1573520074027571 13.439165689526 +10492 1.0492 0.1560122813011935 13.355356341746 +10493 1.0493 0.1546809206447918 13.271856786287 +10494 1.0494 0.1533578944577684 13.188666954181 +10495 1.0495 0.1520431717714409 13.105786772370 +10496 1.0496 0.1507367216246369 13.023216163709 +10497 1.0497 0.1494385130641029 12.940955046973 +10498 1.0498 0.1481485151449118 12.859003336849 +10499 1.0499 0.1468666969308724 12.777360943939 +10500 1.0500 0.1455930274949372 12.696027774764 +10501 1.0501 0.1443274759196112 12.615003731757 +10502 1.0502 0.1430700112973598 12.534288713271 +10503 1.0503 0.1418206027310177 12.453882613571 +10504 1.0504 0.1405792193341968 12.373785322846 +10505 1.0505 0.1393458302316945 12.293996727200 +10506 1.0506 0.1381204045599018 12.214516708654 +10507 1.0507 0.1369029114672116 12.135345145150 +10508 1.0508 0.1356933201144264 12.056481910554 +10509 1.0509 0.1344915996751663 11.977926874648 +10510 1.0510 0.1332977193362769 11.899679903140 +10511 1.0511 0.1321116482982369 11.821740857660 +10512 1.0512 0.1309333557755658 11.744109595763 +10513 1.0513 0.1297628109972312 11.666785970928 +10514 1.0514 0.1285999832070566 11.589769832565 +10515 1.0515 0.1274448416641279 11.513061026009 +10516 1.0516 0.1262973556432012 11.436659392525 +10517 1.0517 0.1251574944351094 11.360564769310 +10518 1.0518 0.1240252273471691 11.284776989495 +10519 1.0519 0.1229005237035873 11.209295882142 +10520 1.0520 0.1217833528458677 11.134121272251 +10521 1.0521 0.1206736841332171 11.059252980760 +10522 1.0522 0.1195714869429518 10.984690824547 +10523 1.0523 0.1184767306709029 10.910434616430 +10524 1.0524 0.1173893847318228 10.836484165173 +10525 1.0525 0.1163094185597901 10.762839275481 +10526 1.0526 0.1152368016086155 10.689499748011 +10527 1.0527 0.1141715033522465 10.616465379368 +10528 1.0528 0.1131134932851727 10.543735962109 +10529 1.0529 0.1120627409228300 10.471311284745 +10530 1.0530 0.1110192158020054 10.399191131746 +10531 1.0531 0.1099828874812413 10.327375283537 +10532 1.0532 0.1089537255412389 10.255863516510 +10533 1.0533 0.1079316995852625 10.184655603018 +10534 1.0534 0.1069167792395425 10.113751311382 +10535 1.0535 0.1059089341536788 10.043150405893 +10536 1.0536 0.1049081340010433 9.972852646816 +10537 1.0537 0.1039143484791831 9.902857790388 +10538 1.0538 0.1029275473102222 9.833165588830 +10539 1.0539 0.1019477002412638 9.763775790339 +10540 1.0540 0.1009747770447917 9.694688139103 +10541 1.0541 0.1000087475190719 9.625902375293 +10542 1.0542 0.0990495814885536 9.557418235073 +10543 1.0543 0.0980972488042697 9.489235450604 +10544 1.0544 0.0971517193442373 9.421353750044 +10545 1.0545 0.0962129630138576 9.353772857551 +10546 1.0546 0.0952809497463155 9.286492493291 +10547 1.0547 0.0943556495029791 9.219512373437 +10548 1.0548 0.0934370322737984 9.152832210176 +10549 1.0549 0.0925250680777039 9.086451711714 +10550 1.0550 0.0916197269630046 9.020370582272 +10551 1.0551 0.0907209790077859 8.954588522102 +10552 1.0552 0.0898287943203068 8.889105227480 +10553 1.0553 0.0889431430393970 8.823920390717 +10554 1.0554 0.0880639953348530 8.759033700163 +10555 1.0555 0.0871913214078346 8.694444840204 +10556 1.0556 0.0863250914912606 8.630153491276 +10557 1.0557 0.0854652758502036 8.566159329865 +10558 1.0558 0.0846118447822847 8.502462028513 +10559 1.0559 0.0837647686180682 8.439061255817 +10560 1.0560 0.0829240177214552 8.375956676442 +10561 1.0561 0.0820895624900770 8.313147951122 +10562 1.0562 0.0812613733556878 8.250634736663 +10563 1.0563 0.0804394207845571 8.188416685951 +10564 1.0564 0.0796236752778617 8.126493447957 +10565 1.0565 0.0788141073720770 8.064864667737 +10566 1.0566 0.0780106876393677 8.003529986448 +10567 1.0567 0.0772133866879784 7.942489041338 +10568 1.0568 0.0764221751626230 7.881741465769 +10569 1.0569 0.0756370237448743 7.821286889206 +10570 1.0570 0.0748579031535525 7.761124937231 +10571 1.0571 0.0740847841451133 7.701255231552 +10572 1.0572 0.0733176375140357 7.641677390001 +10573 1.0573 0.0725564340932086 7.582391026541 +10574 1.0574 0.0718011447543176 7.523395751279 +10575 1.0575 0.0710517404082305 7.464691170461 +10576 1.0576 0.0703081920053831 7.406276886488 +10577 1.0577 0.0695704705361629 7.348152497916 +10578 1.0578 0.0688385470312938 7.290317599466 +10579 1.0579 0.0681123925622192 7.232771782026 +10580 1.0580 0.0673919782414849 7.175514632660 +10581 1.0581 0.0666772752231210 7.118545734617 +10582 1.0582 0.0659682547030236 7.061864667332 +10583 1.0583 0.0652648879193352 7.005471006435 +10584 1.0584 0.0645671461528253 6.949364323763 +10585 1.0585 0.0638750007272694 6.893544187355 +10586 1.0586 0.0631884230098281 6.838010161471 +10587 1.0587 0.0625073844114250 6.782761806592 +10588 1.0588 0.0618318563871240 6.727798679428 +10589 1.0589 0.0611618104365061 6.673120332929 +10590 1.0590 0.0604972181040453 6.618726316288 +10591 1.0591 0.0598380509794835 6.564616174947 +10592 1.0592 0.0591842806982057 6.510789450609 +10593 1.0593 0.0585358789416131 6.457245681244 +10594 1.0594 0.0578928174374960 6.403984401098 +10595 1.0595 0.0572550679604064 6.351005140694 +10596 1.0596 0.0566226023320293 6.298307426849 +10597 1.0597 0.0559953924215531 6.245890782674 +10598 1.0598 0.0553734101460400 6.193754727588 +10599 1.0599 0.0547566274707945 6.141898777323 +10600 1.0600 0.0541450164097317 6.090322443933 +10601 1.0601 0.0535385490257451 6.039025235799 +10602 1.0602 0.0529371974310730 5.988006657643 +10603 1.0603 0.0523409337876641 5.937266210534 +10604 1.0604 0.0517497303075428 5.886803391892 +10605 1.0605 0.0511635592531729 5.836617695506 +10606 1.0606 0.0505823929378210 5.786708611533 +10607 1.0607 0.0500062037259187 5.737075626513 +10608 1.0608 0.0494349640334241 5.687718223378 +10609 1.0609 0.0488686463281825 5.638635881455 +10610 1.0610 0.0483072231302857 5.589828076480 +10611 1.0611 0.0477506670124314 5.541294280607 +10612 1.0612 0.0471989506002801 5.493033962418 +10613 1.0613 0.0466520465728129 5.445046586926 +10614 1.0614 0.0461099276626869 5.397331615594 +10615 1.0615 0.0455725666565903 5.349888506338 +10616 1.0616 0.0450399363955967 5.302716713534 +10617 1.0617 0.0445120097755180 5.255815688040 +10618 1.0618 0.0439887597472564 5.209184877192 +10619 1.0619 0.0434701593171557 5.162823724821 +10620 1.0620 0.0429561815473516 5.116731671262 +10621 1.0621 0.0424467995561203 5.070908153364 +10622 1.0622 0.0419419865182272 5.025352604498 +10623 1.0623 0.0414417156652737 4.980064454572 +10624 1.0624 0.0409459602860432 4.935043130039 +10625 1.0625 0.0404546937268461 4.890288053902 +10626 1.0626 0.0399678893918642 4.845798645736 +10627 1.0627 0.0394855207434931 4.801574321687 +10628 1.0628 0.0390075613026842 4.757614494491 +10629 1.0629 0.0385339846492854 4.713918573484 +10630 1.0630 0.0380647644223809 4.670485964607 +10631 1.0631 0.0375998743206295 4.627316070421 +10632 1.0632 0.0371392881026023 4.584408290122 +10633 1.0633 0.0366829795871191 4.541762019542 +10634 1.0634 0.0362309226535832 4.499376651177 +10635 1.0635 0.0357830912423154 4.457251574178 +10636 1.0636 0.0353394593548877 4.415386174376 +10637 1.0637 0.0349000010544542 4.373779834293 +10638 1.0638 0.0344646904660821 4.332431933150 +10639 1.0639 0.0340335017770806 4.291341846880 +10640 1.0640 0.0336064092373296 4.250508948139 +10641 1.0641 0.0331833871596067 4.209932606320 +10642 1.0642 0.0327644099199124 4.169612187566 +10643 1.0643 0.0323494519577953 4.129547054775 +10644 1.0644 0.0319384877766754 4.089736567624 +10645 1.0645 0.0315314919441655 4.050180082574 +10646 1.0646 0.0311284390923927 4.010876952882 +10647 1.0647 0.0307293039183177 3.971826528617 +10648 1.0648 0.0303340611840532 3.933028156674 +10649 1.0649 0.0299426857171807 3.894481180776 +10650 1.0650 0.0295551524110666 3.856184941506 +10651 1.0651 0.0291714362251762 3.818138776302 +10652 1.0652 0.0287915121853871 3.780342019480 +10653 1.0653 0.0284153553843008 3.742794002246 +10654 1.0654 0.0280429409815530 3.705494052710 +10655 1.0655 0.0276742442041230 3.668441495890 +10656 1.0656 0.0273092403466414 3.631635653741 +10657 1.0657 0.0269479047716964 3.595075845160 +10658 1.0658 0.0265902129101385 3.558761385998 +10659 1.0659 0.0262361402613846 3.522691589080 +10660 1.0660 0.0258856623937199 3.486865764213 +10661 1.0661 0.0255387549445989 3.451283218208 +10662 1.0662 0.0251953936209442 3.415943254886 +10663 1.0663 0.0248555541994451 3.380845175096 +10664 1.0664 0.0245192125268539 3.345988276728 +10665 1.0665 0.0241863445202810 3.311371854730 +10666 1.0666 0.0238569261674882 3.276995201125 +10667 1.0667 0.0235309335271811 3.242857605018 +10668 1.0668 0.0232083427292995 3.208958352614 +10669 1.0669 0.0228891299753068 3.175296727239 +10670 1.0670 0.0225732715384775 3.141872009348 +10671 1.0671 0.0222607437641829 3.108683476543 +10672 1.0672 0.0219515230701764 3.075730403587 +10673 1.0673 0.0216455859468760 3.043012062421 +10674 1.0674 0.0213429089576460 3.010527722179 +10675 1.0675 0.0210434687390768 2.978276649206 +10676 1.0676 0.0207472420012632 2.946258107066 +10677 1.0677 0.0204542055280816 2.914471356566 +10678 1.0678 0.0201643361774645 2.882915655775 +10679 1.0679 0.0198776108816746 2.851590260024 +10680 1.0680 0.0195940066475763 2.820494421941 +10681 1.0681 0.0193135005569065 2.789627391455 +10682 1.0682 0.0190360697665428 2.758988415819 +10683 1.0683 0.0187616915087708 2.728576739621 +10684 1.0684 0.0184903430915494 2.698391604808 +10685 1.0685 0.0182220018987743 2.668432250694 +10686 1.0686 0.0179566453905403 2.638697913985 +10687 1.0687 0.0176942511034014 2.609187828793 +10688 1.0688 0.0174347966506294 2.579901226648 +10689 1.0689 0.0171782597224706 2.550837336527 +10690 1.0690 0.0169246180864015 2.521995384855 +10691 1.0691 0.0166738495873818 2.493374595540 +10692 1.0692 0.0164259321481057 2.464974189982 +10693 1.0693 0.0161808437692524 2.436793387084 +10694 1.0694 0.0159385625297338 2.408831403287 +10695 1.0695 0.0156990665869409 2.381087452571 +10696 1.0696 0.0154623341769884 2.353560746480 +10697 1.0697 0.0152283436149571 2.326250494145 +10698 1.0698 0.0149970732951353 2.299155902291 +10699 1.0699 0.0147685016912572 2.272276175272 +10700 1.0700 0.0145426073567402 2.245610515067 +10701 1.0701 0.0143193689249209 2.219158121320 +10702 1.0702 0.0140987651092873 2.192918191351 +10703 1.0703 0.0138807747037115 2.166889920165 +10704 1.0704 0.0136653765826789 2.141072500488 +10705 1.0705 0.0134525497015156 2.115465122777 +10706 1.0706 0.0132422730966151 2.090066975234 +10707 1.0707 0.0130345258856614 2.064877243840 +10708 1.0708 0.0128292872678512 2.039895112363 +10709 1.0709 0.0126265365241140 2.015119762381 +10710 1.0710 0.0124262530173300 1.990550373299 +10711 1.0711 0.0122284161925464 1.966186122374 +10712 1.0712 0.0120330055771910 1.942026184734 +10713 1.0713 0.0118400007812846 1.918069733393 +10714 1.0714 0.0116493814976511 1.894315939277 +10715 1.0715 0.0114611275021252 1.870763971243 +10716 1.0716 0.0112752186537581 1.847412996098 +10717 1.0717 0.0110916348950223 1.824262178619 +10718 1.0718 0.0109103562520126 1.801310681573 +10719 1.0719 0.0107313628346465 1.778557665749 +10720 1.0720 0.0105546348368612 1.756002289959 +10721 1.0721 0.0103801525368095 1.733643711074 +10722 1.0722 0.0102078962970537 1.711481084043 +10723 1.0723 0.0100378465647558 1.689513561915 +10724 1.0724 0.0098699838718676 1.667740295849 +10725 1.0725 0.0097042888353176 1.646160435151 +10726 1.0726 0.0095407421571954 1.624773127293 +10727 1.0727 0.0093793246249346 1.603577517922 +10728 1.0728 0.0092200171114936 1.582572750899 +10729 1.0729 0.0090628005755333 1.561757968307 +10730 1.0730 0.0089076560615937 1.541132310484 +10731 1.0731 0.0087545647002673 1.520694916044 +10732 1.0732 0.0086035077083707 1.500444921889 +10733 1.0733 0.0084544663891142 1.480381463241 +10734 1.0734 0.0083074221322687 1.460503673669 +10735 1.0735 0.0081623564143303 1.440810685098 +10736 1.0736 0.0080192507986833 1.421301627843 +10737 1.0737 0.0078780869357596 1.401975630630 +10738 1.0738 0.0077388465631973 1.382831820617 +10739 1.0739 0.0076015115059954 1.363869323421 +10740 1.0740 0.0074660636766676 1.345087263135 +10741 1.0741 0.0073324850753930 1.326484762356 +10742 1.0742 0.0072007577901645 1.308060942215 +10743 1.0743 0.0070708639969343 1.289814922389 +10744 1.0744 0.0069427859597585 1.271745821127 +10745 1.0745 0.0068165060309377 1.253852755289 +10746 1.0746 0.0066920066511557 1.236134840351 +10747 1.0747 0.0065692703496163 1.218591190437 +10748 1.0748 0.0064482797441769 1.201220918350 +10749 1.0749 0.0063290175414800 1.184023135589 +10750 1.0750 0.0062114665370820 1.166996952370 +10751 1.0751 0.0060956096155803 1.150141477664 +10752 1.0752 0.0059814297507363 1.133455819216 +10753 1.0753 0.0058689100055975 1.116939083561 +10754 1.0754 0.0057580335326161 1.100590376067 +10755 1.0755 0.0056487835737656 1.084408800942 +10756 1.0756 0.0055411434606546 1.068393461278 +10757 1.0757 0.0054350966146375 1.052543459064 +10758 1.0758 0.0053306265469237 1.036857895211 +10759 1.0759 0.0052277168586837 1.021335869590 +10760 1.0760 0.0051263512411516 1.005976481052 +10761 1.0761 0.0050265134757268 0.990778827444 +10762 1.0762 0.0049281874340719 0.975742005655 +10763 1.0763 0.0048313570782079 0.960865111625 +10764 1.0764 0.0047360064606075 0.946147240382 +10765 1.0765 0.0046421197242849 0.931587486071 +10766 1.0766 0.0045496811028828 0.917184941969 +10767 1.0767 0.0044586749207582 0.902938700523 +10768 1.0768 0.0043690855930633 0.888847853375 +10769 1.0769 0.0042808976258253 0.874911491386 +10770 1.0770 0.0041940956160226 0.861128704668 +10771 1.0771 0.0041086642516587 0.847498582610 +10772 1.0772 0.0040245883118330 0.834020213903 +10773 1.0773 0.0039418526668094 0.820692686569 +10774 1.0774 0.0038604422780810 0.807515087999 +10775 1.0775 0.0037803421984325 0.794486504971 +10776 1.0776 0.0037015375720005 0.781606023670 +10777 1.0777 0.0036240136343299 0.768872729743 +10778 1.0778 0.0035477557124276 0.756285708302 +10779 1.0779 0.0034727492248142 0.743844043967 +10780 1.0780 0.0033989796815715 0.731546820887 +10781 1.0781 0.0033264326843881 0.719393122780 +10782 1.0782 0.0032550939266016 0.707382032950 +10783 1.0783 0.0031849491932377 0.695512634328 +10784 1.0784 0.0031159843610471 0.683784009485 +10785 1.0785 0.0030481853985386 0.672195240684 +10786 1.0786 0.0029815383660096 0.660745409896 +10787 1.0787 0.0029160294155733 0.649433598830 +10788 1.0788 0.0028516447911837 0.638258888962 +10789 1.0789 0.0027883708286568 0.627220361576 +10790 1.0790 0.0027261939556886 0.616317097789 +10791 1.0791 0.0026651006918706 0.605548178571 +10792 1.0792 0.0026050776487022 0.594912684797 +10793 1.0793 0.0025461115295996 0.584409697255 +10794 1.0794 0.0024881891299019 0.574038296699 +10795 1.0795 0.0024312973368741 0.563797563857 +10796 1.0796 0.0023754231297069 0.553686579486 +10797 1.0797 0.0023205535795131 0.543704424390 +10798 1.0798 0.0022666758493212 0.533850179448 +10799 1.0799 0.0022137771940656 0.524122925664 +10800 1.0800 0.0021618449605738 0.514521744172 +10801 1.0801 0.0021108665875506 0.505045716293 +10802 1.0802 0.0020608296055578 0.495693923563 +10803 1.0803 0.0020117216369922 0.486465447748 +10804 1.0804 0.0019635303960603 0.477359370891 +10805 1.0805 0.0019162436887484 0.468374775347 +10806 1.0806 0.0018698494127906 0.459510743809 +10807 1.0807 0.0018243355576327 0.450766359348 +10808 1.0808 0.0017796902043936 0.442140705434 +10809 1.0809 0.0017359015258228 0.433632865983 +10810 1.0810 0.0016929577862545 0.425241925382 +10811 1.0811 0.0016508473415590 0.416966968528 +10812 1.0812 0.0016095586390897 0.408807080858 +10813 1.0813 0.0015690802176278 0.400761348381 +10814 1.0814 0.0015294007073227 0.392828857720 +10815 1.0815 0.0014905088296297 0.385008696140 +10816 1.0816 0.0014523933972435 0.377299951584 +10817 1.0817 0.0014150433140288 0.369701712711 +10818 1.0818 0.0013784475749471 0.362213068922 +10819 1.0819 0.0013425952659805 0.354833110410 +10820 1.0820 0.0013074755640514 0.347560928172 +10821 1.0821 0.0012730777369392 0.340395614072 +10822 1.0822 0.0012393911431929 0.333336260855 +10823 1.0823 0.0012064052320405 0.326381962192 +10824 1.0824 0.0011741095432952 0.319531812714 +10825 1.0825 0.0011424937072572 0.312784908047 +10826 1.0826 0.0011115474446122 0.306140344852 +10827 1.0827 0.0010812605663269 0.299597220855 +10828 1.0828 0.0010516229735397 0.293154634889 +10829 1.0829 0.0010226246574491 0.286811686921 +10830 1.0830 0.0009942556991976 0.280567478110 +10831 1.0831 0.0009665062697512 0.274421110818 +10832 1.0832 0.0009393666297772 0.268371688663 +10833 1.0833 0.0009128271295165 0.262418316551 +10834 1.0834 0.0008868782086531 0.256560100717 +10835 1.0835 0.0008615103961794 0.250796148757 +10836 1.0836 0.0008367143102582 0.245125569667 +10837 1.0837 0.0008124806580803 0.239547473891 +10838 1.0838 0.0007888002357185 0.234060973344 +10839 1.0839 0.0007656639279785 0.228665181457 +10840 1.0840 0.0007430627082448 0.223359213216 +10841 1.0841 0.0007209876383239 0.218142185203 +10842 1.0842 0.0006994298682825 0.213013215624 +10843 1.0843 0.0006783806362830 0.207971424366 +10844 1.0844 0.0006578312684139 0.203015933017 +10845 1.0845 0.0006377731785172 0.198145864916 +10846 1.0846 0.0006181978680119 0.193360345191 +10847 1.0847 0.0005990969257125 0.188658500797 +10848 1.0848 0.0005804620276449 0.184039460555 +10849 1.0849 0.0005622849368572 0.179502355198 +10850 1.0850 0.0005445575032274 0.175046317398 +10851 1.0851 0.0005272716632662 0.170670481827 +10852 1.0852 0.0005104194399165 0.166373985167 +10853 1.0853 0.0004939929423488 0.162155966187 +10854 1.0854 0.0004779843657518 0.158015565753 +10855 1.0855 0.0004623859911197 0.153951926889 +10856 1.0856 0.0004471901850352 0.149964194801 +10857 1.0857 0.0004323893994483 0.146051516936 +10858 1.0858 0.0004179761714509 0.142213043013 +10859 1.0859 0.0004039431230473 0.138447925058 +10860 1.0860 0.0003902829609210 0.134755317469 +10861 1.0861 0.0003769884761960 0.131134377031 +10862 1.0862 0.0003640525441954 0.127584262980 +10863 1.0863 0.0003514681241949 0.124104137030 +10864 1.0864 0.0003392282591727 0.120693163414 +10865 1.0865 0.0003273260755543 0.117350508954 +10866 1.0866 0.0003157547829535 0.114075343062 +10867 1.0867 0.0003045076739095 0.110866837818 +10868 1.0868 0.0002935781236189 0.107724167994 +10869 1.0869 0.0002829595896640 0.104646511105 +10870 1.0870 0.0002726456117360 0.101633047454 +10871 1.0871 0.0002626298113548 0.098682960170 +10872 1.0872 0.0002529058915840 0.095795435247 +10873 1.0873 0.0002434676367412 0.092969661608 +10874 1.0874 0.0002343089121044 0.090204831129 +10875 1.0875 0.0002254236636133 0.087500138693 +10876 1.0876 0.0002168059175669 0.084854782235 +10877 1.0877 0.0002084497803163 0.082267962776 +10878 1.0878 0.0002003494379531 0.079738884489 +10879 1.0879 0.0001924991559926 0.077266754721 +10880 1.0880 0.0001848932790538 0.074850784055 +10881 1.0881 0.0001775262305334 0.072490186352 +10882 1.0882 0.0001703925122766 0.070184178785 +10883 1.0883 0.0001634867042423 0.067931981900 +10884 1.0884 0.0001568034641644 0.065732819658 +10885 1.0885 0.0001503375272079 0.063585919473 +10886 1.0886 0.0001440837056206 0.061490512273 +10887 1.0887 0.0001380368883804 0.059445832530 +10888 1.0888 0.0001321920408378 0.057451118322 +10889 1.0889 0.0001265442043530 0.055505611374 +10890 1.0890 0.0001210884959298 0.053608557091 +10891 1.0891 0.0001158201078430 0.051759204644 +10892 1.0892 0.0001107343072624 0.049956806968 +10893 1.0893 0.0001058264358719 0.048200620843 +10894 1.0894 0.0001010919094829 0.046489906937 +10895 1.0895 0.0000965262176438 0.044823929845 +10896 1.0896 0.0000921249232441 0.043201958148 +10897 1.0897 0.0000878836621143 0.041623264449 +10898 1.0898 0.0000837981426202 0.040087125432 +10899 1.0899 0.0000798641452531 0.038592821910 +10900 1.0900 0.0000760775222143 0.037139638866 +10901 1.0901 0.0000724341969954 0.035726865513 +10902 1.0902 0.0000689301639531 0.034353795333 +10903 1.0903 0.0000655614878794 0.033019726141 +10904 1.0904 0.0000623243035668 0.031723960111 +10905 1.0905 0.0000592148153684 0.030465803857 +10906 1.0906 0.0000562292967526 0.029244568458 +10907 1.0907 0.0000533640898539 0.028059569516 +10908 1.0908 0.0000506156050177 0.026910127209 +10909 1.0909 0.0000479803203400 0.025795566344 +10910 1.0910 0.0000454547812025 0.024715216407 +10911 1.0911 0.0000430355998020 0.023668411603 +10912 1.0912 0.0000407194546760 0.022654490917 +10913 1.0913 0.0000385030902213 0.021672798176 +10914 1.0914 0.0000363833162086 0.020722682078 +10915 1.0915 0.0000343570072916 0.019803496262 +10916 1.0916 0.0000324211025110 0.018914599350 +10917 1.0917 0.0000305726047935 0.018055355001 +10918 1.0918 0.0000288085804450 0.017225131969 +10919 1.0919 0.0000271261586386 0.016423304158 +10920 1.0920 0.0000255225308978 0.015649250658 +10921 1.0921 0.0000239949505744 0.014902355811 +10922 1.0922 0.0000225407323202 0.014182009273 +10923 1.0923 0.0000211572515542 0.013487606046 +10924 1.0924 0.0000198419439246 0.012818546546 +10925 1.0925 0.0000185923047646 0.012174236655 +10926 1.0926 0.0000174058885430 0.011554087776 +10927 1.0927 0.0000162803083101 0.010957516881 +10928 1.0928 0.0000152132351372 0.010383946578 +10929 1.0929 0.0000142023975512 0.009832805142 +10930 1.0930 0.0000132455809640 0.009303526601 +10931 1.0931 0.0000123406270956 0.008795550768 +10932 1.0932 0.0000114854333918 0.008308323307 +10933 1.0933 0.0000106779524373 0.007841295783 +10934 1.0934 0.0000099161913620 0.007393925723 +10935 1.0935 0.0000091982112426 0.006965676665 +10936 1.0936 0.0000085221264982 0.006556018223 +10937 1.0937 0.0000078861042801 0.006164426141 +10938 1.0938 0.0000072883638560 0.005790382341 +10939 1.0939 0.0000067271759896 0.005433374986 +10940 1.0940 0.0000062008623133 0.005092898541 +10941 1.0941 0.0000057077946946 0.004768453831 +10942 1.0942 0.0000052463945990 0.004459548082 +10943 1.0943 0.0000048151324451 0.004165694997 +10944 1.0944 0.0000044125269547 0.003886414811 +10945 1.0945 0.0000040371444973 0.003621234336 +10946 1.0946 0.0000036875984288 0.003369687033 +10947 1.0947 0.0000033625484234 0.003131313075 +10948 1.0948 0.0000030606998009 0.002905659376 +10949 1.0949 0.0000027808028475 0.002692279692 +10950 1.0950 0.0000025216521309 0.002490734641 +10951 1.0951 0.0000022820858090 0.002300591796 +10952 1.0952 0.0000020609849337 0.002121425711 +10953 1.0953 0.0000018572727477 0.001952818009 +10954 1.0954 0.0000016699139756 0.001794357432 +10955 1.0955 0.0000014979141091 0.001645639898 +10956 1.0956 0.0000013403186865 0.001506268554 +10957 1.0957 0.0000011962125655 0.001375853866 +10958 1.0958 0.0000010647191904 0.001254013637 +10959 1.0959 0.0000009449998532 0.001140373105 +10960 1.0960 0.0000008362529484 0.001034564991 +10961 1.0961 0.0000007377132216 0.000936229546 +10962 1.0962 0.0000006486510122 0.000845014642 +10963 1.0963 0.0000005683714894 0.000760575813 +10964 1.0964 0.0000004962138834 0.000682576309 +10965 1.0965 0.0000004315507083 0.000610687192 +10966 1.0966 0.0000003737869807 0.000544587361 +10967 1.0967 0.0000003223594303 0.000483963647 +10968 1.0968 0.0000002767357060 0.000428510838 +10969 1.0969 0.0000002364135746 0.000377931790 +10970 1.0970 0.0000002009201127 0.000331937448 +10971 1.0971 0.0000001698108937 0.000290246931 +10972 1.0972 0.0000001426691673 0.000252587597 +10973 1.0973 0.0000001191050332 0.000218695086 +10974 1.0974 0.0000000987546079 0.000188313420 +10975 1.0975 0.0000000812791854 0.000161195030 +10976 1.0976 0.0000000663643913 0.000137100852 +10977 1.0977 0.0000000537193301 0.000115800371 +10978 1.0978 0.0000000430757274 0.000097071684 +10979 1.0979 0.0000000341870639 0.000080701586 +10980 1.0980 0.0000000268277032 0.000066485628 +10981 1.0981 0.0000000207920133 0.000054228171 +10982 1.0982 0.0000000158934821 0.000043742451 +10983 1.0983 0.0000000119638259 0.000034850674 +10984 1.0984 0.0000000088520896 0.000027384052 +10985 1.0985 0.0000000064237434 0.000021182871 +10986 1.0986 0.0000000045597703 0.000016096591 +10987 1.0987 0.0000000031557477 0.000011983863 +10988 1.0988 0.0000000021209224 0.000008712642 +10989 1.0989 0.0000000013772786 0.000006160234 +10990 1.0990 0.0000000008585994 0.000004213351 +10991 1.0991 0.0000000005095214 0.000002768207 +10992 1.0992 0.0000000002845824 0.000001730574 +10993 1.0993 0.0000000001472622 0.000001015831 +10994 1.0994 0.0000000000690166 0.000000549080 +10995 1.0995 0.0000000000283044 0.000000265164 +10996 1.0996 0.0000000000096082 0.000000108760 +10997 1.0997 0.0000000000024472 0.000000034461 +10998 1.0998 0.0000000000003834 0.000000006815 +10999 1.0999 0.0000000000000213 0.000000000426 +11000 1.1000 0.0000000000000000 0.000000000000 +#Correcting potential for cireaxFF HH + +HH_cireaxFF +N 6000 R 0.0001 0.60 + +1 0.0001 3797890.9392291540279984 33206349399.138427734375 +2 0.0002 1722494.9110903698019683 8301571163.637251853943 +3 0.0003 1122937.5926132882013917 3689575205.904382228851 +4 0.0004 834690.0008127633482218 2075376630.106112480164 +5 0.0005 664509.5044536795467138 1328233297.075562715530 +6 0.0006 551978.9563009395496920 922377665.979238033295 +7 0.0007 471977.0966619757236913 677659526.800038814545 +8 0.0008 412152.7179571118904278 518828047.297237277031 +9 0.0009 365714.6299731913604774 409933712.381173670292 +10 0.0010 328615.8323907385347411 332042239.267882823944 +11 0.0011 298293.1523345073219389 274411361.856740832329 +12 0.0012 273043.6664075446315110 230578356.682512432337 +13 0.0013 251691.4498322109866422 196465974.824161022902 +14 0.0014 233398.2087391692330129 169398847.036673963070 +15 0.0015 217550.1427719162311405 147562472.308386147022 +16 0.0016 203687.4690429928014055 129691002.270082563162 +17 0.0017 191458.9405489375349134 114879567.611022695899 +18 0.0018 180591.5899878731579520 102467443.610265031457 +19 0.0019 170870.0645197642443236 91963065.751913383603 +20 0.0020 162122.1812141085101757 82994600.361201152205 +21 0.0021 154208.6221667436766438 75276580.586095467210 +22 0.0022 147015.4478375526086893 68586905.997725889087 +23 0.0023 140448.5683578797033988 62750683.595732025802 +24 0.0024 134429.6001954161911272 57628679.653538167477 +25 0.0025 128892.7193197872402379 53108937.859040811658 +26 0.0026 123782.2419719153112965 49100609.098397634923 +27 0.0027 119050.7440046396513935 45529350.247115477920 +28 0.0028 114657.5838912299659569 42333852.021078258753 +29 0.0029 110567.7317897445173003 39463190.008630804718 +30 0.0030 106750.8331308781198459 36874783.168697230518 +31 0.0031 103180.4536898424703395 34532805.652015879750 +32 0.0032 99833.4663847921474371 32406940.448990609497 +33 0.0033 96689.5496975369314896 30471393.296113744378 +34 0.0034 93730.7747060154651990 28704106.534315660596 +35 0.0035 90941.2629848008509725 27086127.889976661652 +36 0.0036 88306.9015780777990585 25601100.244484253228 +37 0.0037 85815.1042360084247775 24234846.596903316677 +38 0.0038 83454.6103836347028846 22975030.450571224093 +39 0.0039 81215.3150433022092329 21810876.356078684330 +40 0.0040 79088.1242888014239725 20732938.733937062323 +41 0.0041 77064.8318683794641402 19732909.674502246082 +42 0.0042 75138.0134655730071245 18803458.381626948714 +43 0.0043 73300.9357243389240466 17938096.443054690957 +44 0.0044 71547.4776878622797085 17131064.286478303373 +45 0.0045 69872.0627186485507991 16377235.097796306014 +46 0.0046 68269.5993038358574267 15672033.198457607999 +47 0.0047 66735.4294215345871635 15011364.447567705065 +48 0.0048 65265.2833648572850507 14391556.685978462920 +49 0.0049 63855.2401005604333477 13809308.599958522245 +50 0.0050 62501.6923870088357944 13261645.671073490754 +51 0.0051 61201.3159978628827957 12745882.111845636740 +52 0.0052 59951.0424985035206191 12259587.875341583043 +53 0.0053 58748.0351057271182071 11800559.980186514556 +54 0.0054 57589.6672308318229625 11366797.517719358206 +55 0.0055 56473.5033644123541308 10956479.810670090839 +56 0.0056 55397.2820100169192301 10567947.277238540351 +57 0.0057 54358.9004149418324232 10199684.624263165519 +58 0.0058 53356.4008811763487756 9850306.051046444103 +59 0.0059 52387.9584689461044036 9518542.193558432162 +60 0.0060 51451.8699303213943494 9203228.578935710713 +61 0.0061 50546.5437316817624378 8903295.393856944516 +62 0.0062 49670.4910420562737272 8617758.398652873933 +63 0.0063 48822.3175799818709493 8345710.842835226096 +64 0.0064 48000.7162249470493407 8086316.257861227728 +65 0.0065 47204.4603110534590087 7838802.020010582171 +66 0.0066 46432.3975305156127433 7602453.590746403672 +67 0.0067 45683.4443832643009955 7376609.354279844090 +68 0.0068 44956.5811164201149950 7160655.982603823766 +69 0.0069 44250.8471039254218340 6954024.267290038057 +70 0.0070 43565.3366223063421785 6756185.365091556683 +71 0.0071 42899.1949834988408838 6566647.411058522761 +72 0.0072 42251.6149900149321184 6384952.458619666286 +73 0.0073 41621.8336815316069988 6210673.711046861485 +74 0.0074 41009.1293453283797135 6043413.013017731719 +75 0.0075 40412.8187659414834343 5882798.574720124714 +76 0.0076 39832.2546919962987886 5728482.904183511622 +77 0.0077 39266.8235004698290140 5580140.926345888525 +78 0.0078 38715.9430406611209037 5437468.269828204997 +79 0.0079 38179.0606419426039793 5300179.704542100430 +80 0.0080 37655.6512709583330434 5168007.715143349953 +81 0.0081 37145.2158253512752708 5040701.196997836232 +82 0.0082 36647.2795523623062763 4918024.262781535275 +83 0.0083 36161.3905817674312857 4799755.149116020650 +84 0.0084 35687.1185636231457465 4685685.213769730181 +85 0.0085 35224.0534021870626020 4575618.014951894991 +86 0.0086 34771.8040781840900308 4469368.465107540600 +87 0.0087 34329.9975523085740861 4366762.052402776666 +88 0.0088 33898.2777434993331553 4267634.123782012612 +89 0.0089 33476.3045761055254843 4171829.224094125908 +90 0.0090 33063.7530905842431821 4079200.486331530847 +91 0.0091 32660.3126128419717134 3989609.068513828795 +92 0.0092 32265.6859777571735322 3902923.633182167541 +93 0.0093 31879.5888028051194851 3819019.865858890116 +94 0.0094 31501.7488080534712935 3737780.029174046591 +95 0.0095 31131.9051791112069623 3659092.549671253655 +96 0.0096 30769.8079698984438437 3582851.634583971929 +97 0.0097 30415.2175423630833393 3508956.916123266798 +98 0.0098 30067.9040405047780951 3437313.121042810380 +99 0.0099 29727.6468962801882299 3367829.763448988087 +100 0.0100 29394.2343651574519754 3300420.859005731065 +101 0.0101 29067.4630892647546716 3235004.658848212566 +102 0.0102 28747.1376862389952294 3171503.401666941587 +103 0.0103 28433.0703620277417940 3109843.082558151335 +104 0.0104 28125.0805460319934355 3049953.237356806640 +105 0.0105 27822.9945471002283739 2991766.741278477944 +106 0.0106 27526.6452289965454838 2935219.620795187540 +107 0.0107 27235.8717040687661211 2880250.877760431264 +108 0.0108 26950.5190439367252111 2826802.324880378786 +109 0.0109 26670.4380061075971753 2774818.431702210568 +110 0.0110 26395.4847755045666418 2724246.180358372163 +111 0.0111 26125.5207199683136423 2675034.930366700049 +112 0.0112 25860.4121588578527735 2627136.291842553765 +113 0.0113 25600.0301439392242173 2580504.006530004088 +114 0.0114 25344.2502518074288673 2535093.836105915252 +115 0.0115 25092.9523871394812886 2490863.457253013272 +116 0.0116 24846.0205961249594111 2447772.363037394360 +117 0.0117 24603.3428894650387520 2405781.770161029417 +118 0.0118 24364.8110743723518681 2364854.531692738645 +119 0.0119 24130.3205950421615853 2324955.054911054671 +120 0.0120 23899.7703811006467731 2286049.223919261713 +121 0.0121 23673.0627035687430180 2248104.326718825381 +122 0.0122 23450.1030379103140149 2211088.986449721735 +123 0.0123 23230.7999337614310207 2174973.096527959686 +124 0.0124 23015.0648909635419841 2139727.759429817088 +125 0.0125 22802.8122415475299931 2105325.228890395258 +126 0.0126 22593.9590373379905941 2071738.855300423456 +127 0.0127 22388.4249428679249831 2038943.034100894816 +128 0.0128 22186.1321333134474116 2006913.156988691539 +129 0.0129 21987.0051971760294691 1975625.565759636927 +130 0.0130 21790.9710434566804906 1945057.508627335075 +131 0.0131 21597.9588130819574872 1915187.098867130466 +132 0.0132 21407.8997943563590525 1885993.275644818088 +133 0.0133 21220.7273422291546012 1857455.766899243696 +134 0.0134 21036.3768011763677350 1829555.054156522499 +135 0.0135 20854.7854315104414127 1802272.339162001619 +136 0.0136 20675.8923389411793323 1775589.512223207159 +137 0.0137 20499.6384072217915673 1749489.122164525557 +138 0.0138 20325.9662337235531595 1723954.347800214309 +139 0.0139 20154.8200677915956476 1698968.970838940004 +140 0.0140 19986.1457517427406856 1674517.350138149690 +141 0.0141 19819.8906643742302549 1650584.397232070565 +142 0.0142 19656.0036668595384981 1627155.553061789367 +143 0.0143 19494.4350509144278476 1604216.765840423526 +144 0.0144 19335.1364891228840861 1581754.469990479527 +145 0.0145 19178.0609873186294863 1559755.566094624344 +146 0.0146 19023.1628389236866497 1538207.401804244379 +147 0.0147 18870.3975811507662002 1517097.753654155647 +148 0.0148 18719.7219529813373811 1496414.809734444367 +149 0.0149 18571.0938548359335982 1476147.153173595900 +150 0.0150 18424.4723098577560449 1456283.746389925713 +151 0.0151 18279.8174267347349087 1436813.916070528561 +152 0.0152 18137.0903639892167121 1417727.338839818956 +153 0.0153 17996.2532956681498035 1399014.027581501054 +154 0.0154 17857.2693783700597123 1380664.318380307872 +155 0.0155 17720.1027195484675758 1362668.858051502844 +156 0.0156 17584.7183470344825764 1345018.592228198191 +157 0.0157 17451.0821797241660533 1327704.753978095716 +158 0.0158 17319.1609993791171291 1310718.852922896855 +159 0.0159 17188.9224234912071552 1294052.664835321717 +160 0.0160 17060.3348791649550549 1277698.221689730417 +161 0.0161 16933.3675779732693627 1261647.802143992623 +162 0.0162 16807.9904917444982857 1245893.922431436367 +163 0.0163 16684.1743292407954868 1230429.327642629389 +164 0.0164 16561.8905136897519697 1215246.983378208475 +165 0.0165 16441.1111611331070890 1200340.067754710326 +166 0.0166 16321.8090595580470108 1185701.963746519992 +167 0.0167 16203.9576487783288030 1171326.251847842243 +168 0.0168 16087.5310010339635483 1157206.703039470362 +169 0.0169 15972.5038022796870791 1143337.272046067519 +170 0.0170 15858.8513341338712053 1129712.090870235115 +171 0.0171 15746.5494564608343353 1116325.462590484647 +172 0.0172 15635.5745905607673194 1103171.855410865974 +173 0.0173 15525.9037029426854133 1090245.896950758062 +174 0.0174 15417.5142896569686854 1077542.368763569044 +175 0.0175 15310.3843611650809180 1065056.201074176002 +176 0.0176 15204.4924277251211606 1052782.467725025257 +177 0.0177 15099.8174852727934194 1040716.381321541499 +178 0.0178 14996.3390017783203803 1028853.288567928714 +179 0.0179 14894.0369040606838098 1017188.665784800309 +180 0.0180 14792.8915650414055563 1005718.114600747707 +181 0.0181 14692.8837914208706934 994437.357809931855 +182 0.0182 14593.9948117609401379 983342.235388665460 +183 0.0183 14496.2062649583112943 972428.700663912809 +184 0.0184 14399.5001890937583084 961692.816627136664 +185 0.0185 14303.8590106430383457 951130.752387271146 +186 0.0186 14209.2655340358342073 940738.779756810400 +187 0.0187 14115.7029315497256903 930513.269965347252 +188 0.0188 14023.1547335267005110 920450.690495161572 +189 0.0189 13931.6048189002576692 910547.602033683565 +190 0.0190 13841.0374060216763610 900800.655537953018 +191 0.0191 13751.4370437744601077 891206.589406373678 +192 0.0192 13662.7886029664769012 881762.226753307506 +193 0.0193 13575.0772679896981572 872464.472782266093 +194 0.0194 13488.2885287379031070 863310.312253641896 +195 0.0195 13402.4081727730663260 854296.807043093839 +196 0.0196 13317.4222777315644635 845421.093786924961 +197 0.0197 13233.3172039616729307 836680.381610908546 +198 0.0198 13150.0795873841670982 828071.949939193903 +199 0.0199 13067.6963325682008872 819593.146380113903 +200 0.0200 12986.1546060149066761 811241.384685778175 +201 0.0201 12905.4418296414896759 803014.142782570096 +202 0.0202 12825.5456744588755100 794908.960869705305 +203 0.0203 12746.4540544362298533 786923.439583210624 +204 0.0204 12668.1551205459327321 779055.238222738379 +205 0.0205 12590.6372549828574847 771302.073038782924 +206 0.0206 12513.8890655520208384 763661.715577960364 +207 0.0207 12437.8993802189179405 756131.991084102541 +208 0.0208 12362.6572418170599121 748710.776953040273 +209 0.0209 12288.1519029074570426 741396.001239002682 +210 0.0210 12214.3728207849726459 734185.641210696078 +211 0.0211 12141.3096526266799629 727077.721955164568 +212 0.0212 12068.9522507775400300 720070.315027646720 +213 0.0213 11997.2906581688730512 713161.537145687966 +214 0.0214 11926.3151038652940770 706349.548925882671 +215 0.0215 11856.0159987359184015 699632.553661636543 +216 0.0216 11786.3839312458130735 693008.796140454360 +217 0.0217 11717.4096633638255298 686476.561499288655 +218 0.0218 11649.0841265830331395 680034.174116562121 +219 0.0219 11581.3984180502284289 673679.996539516840 +220 0.0220 11514.3437968009711767 667412.428445621277 +221 0.0221 11447.9116800968495227 661229.905636797659 +222 0.0222 11382.0936398617450322 655130.899065289646 +223 0.0223 11316.8813992139785114 649113.913890042342 +224 0.0224 11252.2668290913516103 643177.488562501385 +225 0.0225 11188.2419449661865656 637320.193940789090 +226 0.0226 11124.7989036475846660 631540.632431264035 +227 0.0227 11061.9300001681967842 625837.437156488304 +228 0.0228 10999.6276647529375623 620209.271148678847 +229 0.0229 10937.8844598671148560 614654.826567770680 +230 0.0230 10876.6930773415660951 609172.823943215539 +231 0.0231 10816.0463355724696157 603762.011438712478 +232 0.0232 10755.9371767935808748 598421.164139074157 +233 0.0233 10696.3586644187034835 593149.083358470700 +234 0.0234 10637.3039804523141356 587944.595969322603 +235 0.0235 10578.7664229662914295 582806.553751141066 +236 0.0236 10520.7394036408022657 577733.832758645411 +237 0.0237 10463.2164453674449760 572725.332708496600 +238 0.0238 10406.1911799128174607 567779.976384037058 +239 0.0239 10349.6573456407440972 562896.709057426779 +240 0.0240 10293.6087852914424730 558074.497928592842 +241 0.0241 10238.0394438159910351 553312.331580449129 +242 0.0242 10182.9433662644769356 548609.219449837692 +243 0.0243 10128.3146957263015793 543964.191313675372 +244 0.0244 10074.1476713211268361 539376.296789824031 +245 0.0245 10020.4366262390267366 534844.604852175224 +246 0.0246 9967.1759858284422080 530368.203359515872 +247 0.0247 9914.3602657305800676 525946.198597722105 +248 0.0248 9861.9840700589520566 521577.714834837010 +249 0.0249 9810.0420896227788035 517261.893888643535 +250 0.0250 9758.5291001930308994 512997.894706310530 +251 0.0251 9707.4399608099283796 508784.892955745687 +252 0.0252 9656.7696121307271824 504622.080628273543 +253 0.0253 9606.5130748166993726 500508.665652283933 +254 0.0254 9556.6654479582084605 496443.871517517080 +255 0.0255 9507.2219075368520862 492426.936909621581 +256 0.0256 9458.1777049236352468 488457.115354706591 +257 0.0257 9409.5281654122227337 484533.674873543438 +258 0.0258 9361.2686867862885265 480655.897645138903 +259 0.0259 9313.3947379200635623 476823.079679376213 +260 0.0260 9265.9018574111723865 473034.530498457083 +261 0.0261 9218.7856522449055774 469289.572826871474 +262 0.0262 9172.0417964890802978 465587.542289632780 +263 0.0263 9125.6660300186722452 461927.787118529668 +264 0.0264 9079.6541572694386559 458309.667866153468 +265 0.0265 9034.0020460197574721 454732.557127462584 +266 0.0266 8988.7056261999514390 451195.839268662035 +267 0.0267 8943.7608887283586228 447698.910163181077 +268 0.0268 8899.1638843734726834 444241.176934524265 +269 0.0269 8854.9107226414562319 440822.057705812913 +270 0.0270 8810.9975706883760722 437440.981355801225 +271 0.0271 8767.4206522565273190 434097.387281184027 +272 0.0272 8724.1762466342170228 430790.725165011594 +273 0.0273 8681.2606876384143106 427520.454751028272 +274 0.0274 8638.6703626196740515 424286.045623773185 +275 0.0275 8596.4017114887719799 421086.976994260505 +276 0.0276 8554.4512257645055797 417922.737491083797 +277 0.0277 8512.8154476421113941 414792.824956804106 +278 0.0278 8471.4909690818003583 411696.746249434771 +279 0.0279 8430.4744309168836480 408634.017048916605 +280 0.0280 8389.7625219810179260 405604.161668412504 +281 0.0281 8349.3519782540824963 402606.712870297022 +282 0.0282 8309.2395820262318011 399641.211686701921 +283 0.0283 8269.4221610796721507 396707.207244501391 +284 0.0284 8229.8965878877170326 393804.256594596838 +285 0.0285 8190.6597788307171868 390931.924545384187 +286 0.0286 8151.7086934284334347 388089.783500298625 +287 0.0287 8113.0403335884529952 385277.413299310661 +288 0.0288 8074.6517428702745747 382494.401064265287 +289 0.0289 8036.5400057646629648 379740.341047962662 +290 0.0290 7998.7022469879211712 377014.834486879641 +291 0.0291 7961.1356307907062728 374317.489457421761 +292 0.0292 7923.8373602810543161 371647.920735618740 +293 0.0293 7886.8046767612650001 369005.749660162895 +294 0.0294 7850.0348590783214604 366390.603998709412 +295 0.0295 7813.5252229875186458 363802.117817338614 +296 0.0296 7777.2731205289965146 361239.931353097141 +297 0.0297 7741.2759394168642757 358703.690889546939 +298 0.0298 7705.5311024406255456 356193.048635229468 +299 0.0299 7670.0360668786161114 353707.662604961544 +300 0.0300 7634.7883239231723564 351247.196503909014 +301 0.0301 7599.7853981172593194 348811.319614349399 +302 0.0302 7565.0248468022900852 346399.706685042300 +303 0.0303 7530.5042595768791216 344012.037823172985 +304 0.0304 7496.2212577662821786 341647.998388757696 +305 0.0305 7462.1734939022699109 339307.278891487280 +306 0.0306 7428.3586512131996642 336989.574889911804 +307 0.0307 7394.7744431240571430 334694.586892931722 +308 0.0308 7361.4186127662351282 332422.020263517683 +309 0.0309 7328.2889324968291476 330171.585124605917 +310 0.0310 7295.3832034272427336 327942.996267125709 +311 0.0311 7262.6992549608821719 325735.973060077988 +312 0.0312 7230.2349443397461073 323550.239362646767 +313 0.0313 7197.9881561997008248 321385.523438253556 +314 0.0314 7165.9568021342611246 319241.557870541175 +315 0.0315 7134.1388202666739744 317118.079481209570 +316 0.0316 7102.5321748301294065 315014.829249676259 +317 0.0317 7071.1348557559203982 312931.552234507049 +318 0.0318 7039.9448782693661997 310867.997496569238 +319 0.0319 7008.9602824933444936 308823.918023872888 +320 0.0320 6978.1791330592486702 306799.070658051991 +321 0.0321 6947.5995187252237884 304793.216022445762 +322 0.0322 6917.2195520015147849 302806.118451742514 +323 0.0323 6887.0373687827704998 300837.545923143101 +324 0.0324 6857.0511279871625447 298887.269989015476 +325 0.0325 6827.2590112021625828 296955.065710989409 +326 0.0326 6797.6592223368397754 295040.711595467408 +327 0.0327 6768.2499872805401537 293143.989530517720 +328 0.0328 6739.0295535678087617 291264.684724107734 +329 0.0329 6709.9961900494208749 289402.585643650207 +330 0.0330 6681.1481865693967848 287557.483956830285 +331 0.0331 6652.4838536478710012 285729.174473683524 +332 0.0332 6624.0015221696921799 283917.455089892494 +333 0.0333 6595.6995430786337238 282122.126731268479 +334 0.0334 6567.5762870770995505 280342.993299406895 +335 0.0335 6539.6301443312058836 278579.861618462426 +336 0.0336 6511.8595241811308370 276832.541383042291 +337 0.0337 6484.2628548566199242 275100.845107175875 +338 0.0338 6456.8385831975447218 273384.588074336876 +339 0.0339 6429.5851743794028152 271683.588288502593 +340 0.0340 6402.5011116436671728 269997.666426213400 +341 0.0341 6375.5848960328758039 268326.645789619943 +342 0.0342 6348.8350461303707561 266670.352260480518 +343 0.0343 6322.2500978045909505 265028.614255112305 +344 0.0344 6295.8286039578233613 263401.262680239393 +345 0.0345 6269.5691342793234071 261788.130889750697 +346 0.0346 6243.4702750027199727 260189.054642318690 +347 0.0347 6217.5306286676095624 258603.872059885209 +348 0.0348 6191.7488138852668271 257032.423586966324 +349 0.0349 6166.1234651083796052 255474.551950786379 +350 0.0350 6140.6532324047302609 253930.102122199372 +351 0.0351 6115.3367812347505605 252398.921277389309 +352 0.0352 6090.1727922328645946 250880.858760333562 +353 0.0353 6065.1599609925469849 249375.766046012985 +354 0.0354 6040.2969978550299857 247883.496704335703 +355 0.0355 6015.5826277015739834 246403.906364788214 +356 0.0356 5991.0155897492459189 244936.852681767195 +357 0.0357 5966.5946373501274138 243482.195300596883 +358 0.0358 5942.3185377938871170 242039.795824207686 +359 0.0359 5918.1860721136536085 240609.517780463502 +360 0.0360 5894.1960348951242850 239191.226590125298 +361 0.0361 5870.3472340888465624 237784.789535432705 +362 0.0362 5846.6384908256104609 236390.075729293516 +363 0.0363 5823.0686392348925438 235006.956085067795 +364 0.0364 5799.6365262662930036 233635.303286930110 +365 0.0365 5776.3410115139067784 232274.991760797304 +366 0.0366 5753.1809670435759472 230925.897645818506 +367 0.0367 5730.1552772229651964 229587.898766401282 +368 0.0368 5707.2628385544066987 228260.874604775396 +369 0.0369 5684.5025595104643799 226944.706274066091 +370 0.0370 5661.8733603721666441 225639.276491892000 +371 0.0371 5639.3741730698502579 224344.469554441806 +372 0.0372 5617.0039410265753759 223060.171311054786 +373 0.0373 5594.7616190040589572 221786.269139269600 +374 0.0374 5572.6461729510783698 220522.651920336095 +375 0.0375 5550.6565798543024357 219269.210015191376 +376 0.0376 5528.7918275914989863 218025.835240880318 +377 0.0377 5507.0509147870843663 216792.420847409609 +378 0.0378 5485.4328506699621357 215568.861495032528 +379 0.0379 5463.9366549336127719 214355.053231954807 +380 0.0380 5442.5613575983925330 213150.893472446391 +381 0.0381 5421.3059988760023771 211956.280975355621 +382 0.0382 5400.1696290360832791 210771.115823022119 +383 0.0383 5379.1513082749042951 209595.299400565797 +384 0.0384 5358.2501065860978997 208428.734375559114 +385 0.0385 5337.4651036334162200 207271.324678068690 +386 0.0386 5316.7953886254599638 206122.975481052708 +387 0.0387 5296.2400601923518479 204983.593181118398 +388 0.0388 5275.7982262643145077 203853.085379624623 +389 0.0389 5255.4690039521274230 202731.360864120419 +390 0.0390 5235.2515194294155663 201618.329590123205 +391 0.0391 5215.1449078167488551 200513.902663215820 +392 0.0392 5195.1483130675151187 199417.992321466503 +393 0.0393 5175.2608878555338379 198330.511918162607 +394 0.0394 5155.4817934643833723 197251.375904848013 +395 0.0395 5135.8101996784080256 196180.499814658891 +396 0.0396 5116.2452846753767517 195117.800245962891 +397 0.0397 5096.7862349207644002 194063.194846275903 +398 0.0398 5077.4322450636273061 193016.602296464203 +399 0.0399 5058.1825178340423008 191977.942295230401 +400 0.0400 5039.0362639420882260 190947.135543857410 +401 0.0401 5019.9927019783335709 189924.103731232521 +402 0.0402 5001.0510583158156805 188908.769519123598 +403 0.0403 4982.2105670134742468 187901.056527708512 +404 0.0404 4963.4704697210208906 186900.889321363793 +405 0.0405 4944.8300155852184616 185908.193394692207 +406 0.0406 4926.2884611575445888 184922.895158791798 +407 0.0407 4907.8450703032167439 183944.921927760006 +408 0.0408 4889.4991141115569917 182974.201905434893 +409 0.0409 4871.2498708076673211 182010.664172355406 +410 0.0410 4853.0966256654019162 181054.238672945299 +411 0.0411 4835.0386709216081726 180104.856202922296 +412 0.0412 4817.0753056916164496 179162.448396911874 +413 0.0413 4799.2058358859567306 178226.947716274706 +414 0.0414 4781.4295741282858216 177298.287437139690 +415 0.0415 4763.7458396744968923 176376.401638641197 +416 0.0416 4746.1539583329977177 175461.225191345118 +417 0.0417 4728.6532623861367028 174552.693745879398 +418 0.0418 4711.2430905127548613 173650.743721751584 +419 0.0419 4693.9227877118501056 172755.312296346587 +420 0.0420 4676.6917052273265654 171866.337394116475 +421 0.0421 4659.5492004738234755 170983.757675945119 +422 0.0422 4642.4946369635918018 170107.512528690218 +423 0.0423 4625.5273842344122386 169237.542054897116 +424 0.0424 4608.6468177785327498 168373.787062684598 +425 0.0425 4591.8523189726092824 167516.189055792696 +426 0.0426 4575.1432750086296437 166664.690223798825 +427 0.0427 4558.5190788258150860 165819.233432492794 +428 0.0428 4541.9791290434704933 164979.762214406888 +429 0.0429 4525.5228298947749863 164146.220759498625 +430 0.0430 4509.1495911615002115 163318.553905994806 +431 0.0431 4492.8588281096317587 162496.707131370786 +432 0.0432 4476.6499614258891597 161680.626543487393 +433 0.0433 4460.5224171551217296 160870.258871862694 +434 0.0434 4444.4756266385738854 160065.551459085895 +435 0.0435 4428.5090264530008426 159266.452252375020 +436 0.0436 4412.6220583506192270 158472.909795265179 +437 0.0437 4396.8141691998844180 157684.873219428002 +438 0.0438 4381.0848109270818895 156902.292236623383 +439 0.0439 4365.4334404587116296 156125.117130786792 +440 0.0440 4349.8595196646610930 155353.298750224814 +441 0.0441 4334.3625153021521328 154586.788499957591 +442 0.0442 4318.9418989604464514 153825.538334160607 +443 0.0443 4303.5971470063013840 153069.500748739694 +444 0.0444 4288.3277405301632825 152318.628774015204 +445 0.0445 4273.1331652930857672 151572.875967531581 +446 0.0446 4258.0129116743610211 150832.196406962204 +447 0.0447 4242.9664746198559442 150096.544683145214 +448 0.0448 4227.9933535910377032 149365.875893212418 +449 0.0449 4213.0930525146850414 148640.145633832086 +450 0.0450 4198.2650797332653383 147919.309994559822 +451 0.0451 4183.5089479559728716 147203.325551281509 +452 0.0452 4168.8241742104200966 146492.149359771516 +453 0.0453 4154.2102797949646629 145785.738949338702 +454 0.0454 4139.6667902316685286 145084.052316579124 +455 0.0455 4125.1932352198791705 144387.047919215198 +456 0.0456 4110.7891485904165165 143694.684670041082 +457 0.0457 4096.4540682603665118 143006.921930951008 +458 0.0458 4082.1875361884663107 142323.719507061702 +459 0.0459 4067.9890983310669981 141645.037640927214 +460 0.0460 4053.8583045986788420 140970.837006836111 +461 0.0461 4039.7947088130767952 140301.078705203283 +462 0.0462 4025.7978686649648807 139635.724257037102 +463 0.0463 4011.8673456721880939 138974.735598497209 +464 0.0464 3998.0027051384868173 138318.075075530593 +465 0.0465 3984.2035161127805623 137665.705438592006 +466 0.0466 3970.4693513489792167 137017.589837436215 +467 0.0467 3956.7997872663072485 136373.691816001607 +468 0.0468 3943.1944039101394992 135733.975307351706 +469 0.0469 3929.6527849133362906 135098.404628710909 +470 0.0470 3916.1745174580728417 134466.944476561417 +471 0.0471 3902.7591922381539007 133839.559921816399 +472 0.0472 3889.4064034218095003 133216.216405068204 +473 0.0473 3876.1157486149609213 132596.879731900379 +474 0.0474 3862.8868288249523175 131981.516068276193 +475 0.0475 3849.7192484247393622 131370.091935986100 +476 0.0476 3836.6126151175312771 130762.574208174192 +477 0.0477 3823.5665399018766948 130158.930104914805 +478 0.0478 3810.5806370371874436 129559.127188870698 +479 0.0479 3797.6545240096938869 128963.133361000000 +480 0.0480 3784.7878214988272703 128370.916856334414 +481 0.0481 3771.9801533440195271 127782.446239815996 +482 0.0482 3759.2311465119191780 127197.690402194989 +483 0.0483 3746.5404310640101357 126616.618555985508 +484 0.0484 3733.9076401246366004 126039.200231481605 +485 0.0485 3721.3324098494208556 125465.405272828997 +486 0.0486 3708.8143793940716932 124895.203834155793 +487 0.0487 3696.3531908835761897 124328.566375758615 +488 0.0488 3683.9484893817716511 123765.463660336201 +489 0.0489 3671.5999228612904517 123205.866749289082 +490 0.0490 3659.3071421738727622 122649.746999061885 +491 0.0491 3647.0698010210426219 122097.076057543905 +492 0.0492 3634.8875559251396226 121547.825860515688 +493 0.0493 3622.7600662007062056 121001.968628151400 +494 0.0494 3610.6869939262201115 120459.476861566305 +495 0.0495 3598.6680039161710738 119920.323339417504 +496 0.0496 3586.7027636934731163 119384.481114546099 +497 0.0497 3574.7909434622119988 118851.923510671899 +498 0.0498 3562.9322160807214459 118322.624119135202 +499 0.0499 3551.1262570349808811 117796.556795678407 +500 0.0500 3539.3727444123328496 117273.695657280594 +501 0.0501 3527.6713588755173987 116754.015079026300 +502 0.0502 3516.0217836370147779 116237.489691030307 +503 0.0503 3504.4237044336937288 115724.094375392902 +504 0.0504 3492.8768095017640007 115213.804263205908 +505 0.0505 3481.3807895520239981 114706.594731596502 +506 0.0506 3469.9353377454035581 114202.441400813201 +507 0.0507 3458.5401496687954932 113701.320131348999 +508 0.0508 3447.1949233111722606 113203.207021111593 +509 0.0509 3435.8993590399854838 112708.078402620697 +510 0.0510 3424.6531595778415067 112215.910840257697 +511 0.0511 3413.4560299794516141 111726.681127540491 +512 0.0512 3402.3076776088523729 111240.366284443095 +513 0.0513 3391.2078121168929101 110756.943554748403 +514 0.0514 3380.1561454189832148 110276.390403441299 +515 0.0515 3369.1523916731048303 109798.684514128501 +516 0.0516 3358.1962672580730214 109323.803786503893 +517 0.0517 3347.2874907520558736 108851.726333840896 +518 0.0518 3336.4257829113375919 108382.430480521405 +519 0.0519 3325.6108666493319106 107915.894759596791 +520 0.0520 3314.8424670158328809 107452.097910383702 +521 0.0521 3304.1203111765094036 106991.018876088390 +522 0.0522 3293.4441283926316828 106532.636801470508 +523 0.0523 3282.8136500010318741 106076.931030525200 +524 0.0524 3272.2286093942948355 105623.881104211905 +525 0.0525 3261.6887420011739778 105173.466758200710 +526 0.0526 3251.1937852672313056 104725.667920653999 +527 0.0527 3240.7434786356966470 104280.464710036700 +528 0.0528 3230.3375635285469798 103837.837432959204 +529 0.0529 3219.9757833277972168 103397.766582040102 +530 0.0530 3209.6578833570047209 102960.232833805901 +531 0.0531 3199.3836108629839146 102525.217046613194 +532 0.0532 3189.1527149977232511 102092.700258601195 +533 0.0533 3178.9649468005095514 101662.663685669395 +534 0.0534 3168.8200591802519739 101235.088719480002 +535 0.0535 3158.7178068980033459 100809.956925493389 +536 0.0536 3148.6579465496779449 100387.250041016800 +537 0.0537 3138.6402365489625481 99966.949973295399 +538 0.0538 3128.6644371104171114 99549.038797609304 +539 0.0539 3118.7303102327659872 99133.498755413690 +540 0.0540 3108.8376196823710416 98720.312252485601 +541 0.0541 3098.9861309768912179 98309.461857110102 +542 0.0542 3089.1756113691217251 97900.930298279200 +543 0.0543 3079.4058298310119426 97494.700463916903 +544 0.0544 3069.6765570378593111 97090.755399133006 +545 0.0545 3059.9875653526783026 96689.078304486597 +546 0.0546 3050.3386288107399196 96289.652534285400 +547 0.0547 3040.7295231042808155 95892.461594900291 +548 0.0548 3031.1600255673811262 95497.489143095998 +549 0.0549 3021.6299151610064655 95104.718984397608 +550 0.0550 3012.1389724582136296 94714.135071462399 +551 0.0551 3002.6869796295163724 94325.721502481407 +552 0.0552 2993.2737204284121617 93939.462519600100 +553 0.0553 2983.8989801770644590 93555.342507355497 +554 0.0554 2974.5625457521396129 93173.345991137699 +555 0.0555 2965.2642055707992768 92793.457635665793 +556 0.0556 2956.0037495768415283 92415.662243489103 +557 0.0557 2946.7809692269920561 92039.944753500298 +558 0.0558 2937.5956574773435932 91666.290239472699 +559 0.0559 2928.4476087699395066 91294.683908613209 +560 0.0560 2919.3366190195019954 90925.111100133901 +561 0.0561 2910.2624856003030800 90557.557283840506 +562 0.0562 2901.2250073331738349 90192.008058743304 +563 0.0563 2892.2239844726527735 89828.449151673893 +564 0.0564 2883.2592186942724766 89466.866415933808 +565 0.0565 2874.3305130819780970 89107.245829949898 +566 0.0566 2865.4376721156831991 88749.573495947800 +567 0.0567 2856.5805016589533807 88393.835638644508 +568 0.0568 2847.7588089468235921 88040.018603955294 +569 0.0569 2838.9724025737400552 87688.108857716492 +570 0.0570 2830.2210924816331499 87338.092984424511 +571 0.0571 2821.5046899481126275 86989.957685989706 +572 0.0572 2812.8230075747878800 86643.689780506102 +573 0.0573 2804.1758592757109909 86299.276201035798 +574 0.0574 2795.5630602659389297 85956.703994407901 +575 0.0575 2786.9844270502167092 85615.960320032595 +576 0.0576 2778.4397774117787776 85277.032448729500 +577 0.0577 2769.9289304012636421 84939.907761570110 +578 0.0578 2761.4517063257485461 84604.573748733892 +579 0.0579 2753.0079267378928307 84271.018008379106 +580 0.0580 2744.5974144251977123 83939.228245526392 +581 0.0581 2736.2199933993733794 83609.192270955900 +582 0.0582 2727.8754888858197774 83280.898000118497 +583 0.0583 2719.5637273132110749 82954.333452058592 +584 0.0584 2711.2845363031906345 82629.486748351410 +585 0.0585 2703.0377446601705742 82306.346112052299 +586 0.0586 2694.8231823612350126 81984.899866657594 +587 0.0587 2686.6406805461483600 81665.136435079796 +588 0.0588 2678.4900715074627442 81347.044338633204 +589 0.0589 2670.3711886807295741 81030.612196033209 +590 0.0590 2662.2838666348075094 80715.828722405698 +591 0.0591 2654.2279410622718387 80402.682728309199 +592 0.0592 2646.2032487699179910 80091.163118768993 +593 0.0593 2638.2096276693632717 79781.258892321493 +594 0.0594 2630.2469167677436417 79472.959140070947 +595 0.0595 2622.3149561585023548 79166.253044755809 +596 0.0596 2614.4135870122731831 78861.129879828150 +597 0.0597 2606.5426515678545911 78557.579008541652 +598 0.0598 2598.7019931232748604 78255.589883052293 +599 0.0599 2590.8914560269458889 77955.152043527560 +600 0.0600 2583.1108856689061213 77656.255117267618 +601 0.0601 2575.3601284721507909 77358.888817836021 +602 0.0602 2567.6390318840490181 77063.042944200439 +603 0.0603 2559.9474443678445823 76768.707379883854 +604 0.0604 2552.2852153942440054 76475.872092124846 +605 0.0605 2544.6521954330851258 76184.527131048526 +606 0.0606 2537.0482359450902550 75894.662628845719 +607 0.0607 2529.4731893736998245 75606.268798963472 +608 0.0608 2521.9269091369865237 75319.335935302617 +609 0.0609 2514.4092496196499269 75033.854411426786 +610 0.0610 2506.9200661650897928 74749.814679778734 +611 0.0611 2499.4592150675553057 74467.207270906831 +612 0.0612 2492.0265535643748080 74186.022792699412 +613 0.0613 2484.6219398282582915 73906.251929628474 +614 0.0614 2477.2452329596767413 73627.885442002560 +615 0.0615 2469.8962929793151488 73350.914165226437 +616 0.0616 2462.5749808206001035 73075.329009070818 +617 0.0617 2455.2811583222992340 72801.120956949555 +618 0.0618 2448.0146882211915909 72528.281065205156 +619 0.0619 2440.7754341448112427 72256.800462402665 +620 0.0620 2433.5632606042595398 71986.670348630636 +621 0.0621 2426.3780329870874084 71717.881994811658 +622 0.0622 2419.2196175502458573 71450.426742018375 +623 0.0623 2412.0878814131051513 71184.296000799222 +624 0.0624 2404.9826925505394684 70919.481250510740 +625 0.0625 2397.9039197860811328 70655.974038657121 +626 0.0626 2390.8514327851362395 70393.765980237920 +627 0.0627 2383.8251020482694003 70132.848757102445 +628 0.0628 2376.8247989045485156 69873.214117311829 +629 0.0629 2369.8503955049577598 69614.853874507331 +630 0.0630 2362.9017648158678639 69357.759907286818 +631 0.0631 2355.9787806125741554 69101.924158587179 +632 0.0632 2349.0813174728909871 68847.338635074135 +633 0.0633 2342.2092507708102858 68593.995406538481 +634 0.0634 2335.3624566702183074 68341.886605299340 +635 0.0635 2328.5408121186728749 68091.004425613588 +636 0.0636 2321.7441948412374586 67841.341123091712 +637 0.0637 2314.9724833343766477 67592.889014121087 +638 0.0638 2308.2255568599057369 67345.640475293985 +639 0.0639 2301.5032954389989754 67099.587942843282 +640 0.0640 2294.8055798462528401 66854.723912083238 +641 0.0641 2288.1322916038056974 66611.040936857127 +642 0.0642 2281.4833129755133996 66368.531628991012 +643 0.0643 2274.8585269611762669 66127.188657751933 +644 0.0644 2268.2578172908229135 65887.004749314467 +645 0.0645 2261.6810684190454594 65647.972686230991 +646 0.0646 2255.1281655193884035 65410.085306908266 +647 0.0647 2248.5989944787884269 65173.335505090348 +648 0.0648 2242.0934418920664939 64937.716229346421 +649 0.0649 2235.6113950564708830 64703.220482563738 +650 0.0650 2229.1527419662702414 64469.841321447631 +651 0.0651 2222.7173713073966610 64237.571856024762 +652 0.0652 2216.3051724521378674 64006.405249153417 +653 0.0653 2209.9160354538780666 63776.334716038182 +654 0.0654 2203.5498510418888145 63547.353523750251 +655 0.0655 2197.2065106161635413 63319.454990752158 +656 0.0656 2190.8859062423043724 63092.632486428774 +657 0.0657 2184.5879306464516958 62866.879430621761 +658 0.0658 2178.3124772102619318 62642.189293170457 +659 0.0659 2172.0594399659307783 62418.555593456593 +660 0.0660 2165.8287135912601116 62195.971899954537 +661 0.0661 2159.6201934047730902 61974.431829785521 +662 0.0662 2153.4337753608697312 61753.929048277496 +663 0.0663 2147.2693560450293262 61534.457268528786 +664 0.0664 2141.1268326690542381 61316.010250976942 +665 0.0665 2135.0061030663568999 61098.581802971908 +666 0.0666 2128.9070656872904692 60882.165778353694 +667 0.0667 2122.8296195945208638 60666.756077033991 +668 0.0668 2116.7736644584401802 60452.346644583442 +669 0.0669 2110.7391005526201297 60238.931471821677 +670 0.0670 2104.7258287493082207 60026.504594412996 +671 0.0671 2098.7337505149644130 59815.060092464846 +672 0.0672 2092.7627679058346075 59604.592090132202 +673 0.0673 2086.8127835635668816 59395.094755224258 +674 0.0674 2080.8837007108650141 59186.562298816811 +675 0.0675 2074.9754231471806634 58978.988974867236 +676 0.0676 2069.0878552444455636 58772.369079834811 +677 0.0677 2063.2209019428387364 58566.696952303704 +678 0.0678 2057.3744687465928109 58361.966972610564 +679 0.0679 2051.5484617198385422 58158.173562476164 +680 0.0680 2045.7427874824827541 57955.311184640268 +681 0.0681 2039.9573532061258447 57753.374342500028 +682 0.0682 2034.1920666100131712 57552.357579753101 +683 0.0683 2028.4468359570232678 57352.255480043961 +684 0.0684 2022.7215700496903992 57153.062666612801 +685 0.0685 2017.0161782262623547 56954.773801950047 +686 0.0686 2011.3305703567921228 56757.383587452656 +687 0.0687 2005.6646568392652625 56560.886763084374 +688 0.0688 2000.0183485957591074 56365.278107040052 +689 0.0689 1994.3915570686365299 56170.552435412843 +690 0.0690 1988.7841942167726756 55976.704601864716 +691 0.0691 1983.1961725118144386 55783.729497300243 +692 0.0692 1977.6274049344722243 55591.622049544487 +693 0.0693 1972.0778049708437720 55400.377223022959 +694 0.0694 1966.5472866087702641 55209.990018445678 +695 0.0695 1961.0357643342233587 55020.455472494272 +696 0.0696 1955.5431531277231443 54831.768657511348 +697 0.0697 1950.0693684607879277 54643.924681194570 +698 0.0698 1944.6143262924135797 54456.918686292505 +699 0.0699 1939.1779430655838041 54270.745850304040 +700 0.0700 1933.7601357038095102 54085.401385180412 +701 0.0701 1928.3608216076988811 53900.880537031080 +702 0.0702 1922.9799186515558631 53717.178585831418 +703 0.0703 1917.6173451800075327 53534.290845133888 +704 0.0704 1912.2730200046617028 53352.212661782563 +705 0.0705 1906.9468624007911330 53170.939415629371 +706 0.0706 1901.6387921040470701 52990.466519253998 +707 0.0707 1896.3487293072000739 52810.789417686334 +708 0.0708 1891.0765946569092648 52631.903588131521 +709 0.0709 1885.8223092505177192 52453.804539697856 +710 0.0710 1880.5857946328765138 52276.487813127562 +711 0.0711 1875.3669727931935540 52099.948980529465 +712 0.0712 1870.1657661619112787 51924.183645115401 +713 0.0713 1864.9820976076086936 51749.187440938367 +714 0.0714 1859.8158904339300079 51574.956032633410 +715 0.0715 1854.6670683765403282 51401.485115161551 +716 0.0716 1849.5355556001045443 51228.770413555016 +717 0.0717 1844.4212766952934999 51056.807682666637 +718 0.0718 1839.3241566758142653 50885.592706920143 +719 0.0719 1834.2441209754649663 50715.121300064064 +720 0.0720 1829.1810954452153055 50545.389304927026 +721 0.0721 1824.1350063503100500 50376.392593175893 +722 0.0722 1819.1057803673973012 50208.127065076827 +723 0.0723 1814.0933445816806397 50040.588649257377 +724 0.0724 1809.0976264840942349 49873.773302471986 +725 0.0725 1804.1185539685020558 49707.677009369334 +726 0.0726 1799.1560553289205018 49542.295782261608 +727 0.0727 1794.2100592567626336 49377.625660896978 +728 0.0728 1789.2804948381060512 49213.662712232632 +729 0.0729 1784.3672915509837367 49050.403030211943 +730 0.0730 1779.4703792626960421 48887.842735542195 +731 0.0731 1774.5896882271451886 48725.977975474911 +732 0.0732 1769.7251490821920470 48564.804923589225 +733 0.0733 1764.8766928470338371 48404.319779575591 +734 0.0734 1760.0442509196038827 48244.518769022579 +735 0.0735 1755.2277550739925118 48085.398143206214 +736 0.0736 1750.4271374578881932 47926.954178880129 +737 0.0737 1745.6423305900407286 47769.183178068204 +738 0.0738 1740.8732673577442256 47612.081467859622 +739 0.0739 1736.1198810143409901 47455.645400205220 +740 0.0740 1731.3821051767449717 47299.871351715869 +741 0.0741 1726.6598738229859009 47144.755723463430 +742 0.0742 1721.9531212897736623 46990.294940782347 +743 0.0743 1717.2617822700808574 46836.485453074383 +744 0.0744 1712.5857918107465139 46683.323733614598 +745 0.0745 1707.9250853100977565 46530.806279358563 +746 0.0746 1703.2795985155921699 46378.929610752923 +747 0.0747 1698.6492675214772134 46227.690271546060 +748 0.0748 1694.0340287664698735 46077.084828601626 +749 0.0749 1689.4338190314540498 45927.109871713503 +750 0.0750 1684.8485754371972689 45777.762013422289 +751 0.0751 1680.2782354420844513 45629.037888833554 +752 0.0752 1675.7227368398707767 45480.934155438321 +753 0.0753 1671.1820177574520585 45333.447492934487 +754 0.0754 1666.6560166526528519 45186.574603050016 +755 0.0755 1662.1446723120318438 45040.312209368392 +756 0.0756 1657.6479238487056591 44894.657057155040 +757 0.0757 1653.1657107001885834 44749.605913185420 +758 0.0758 1648.6979726262504755 44605.155565575027 +759 0.0759 1644.2446497067912787 44461.302823610720 +760 0.0760 1639.8056823397314474 44318.044517583716 +761 0.0761 1635.3810112389210190 44175.377498623959 +762 0.0762 1630.9705774320630098 44033.298638536377 +763 0.0763 1626.5743222586543197 43891.804829637775 +764 0.0764 1622.1921873679425516 43750.892984596503 +765 0.0765 1617.8241147168989755 43610.560036272771 +766 0.0766 1613.4700465682074082 43470.802937560125 +767 0.0767 1609.1299254882678724 43331.618661229200 +768 0.0768 1604.8036943452177638 43193.004199772455 +769 0.0769 1600.4912963069666603 43054.956565250483 +770 0.0770 1596.1926748392472746 42917.472789139072 +771 0.0771 1591.9077737036814142 42780.549922178965 +772 0.0772 1587.6365369558611746 42644.185034225426 +773 0.0773 1583.3789089434449124 42508.375214100757 +774 0.0774 1579.1348343042675424 42373.117569446411 +775 0.0775 1574.9042579644662965 42238.409226578267 +776 0.0776 1570.6871251366203524 42104.247330341561 +777 0.0777 1566.4833813179047866 41970.629043968278 +778 0.0778 1562.2929722882595343 41837.551548935488 +779 0.0779 1558.1158441085715367 41705.012044824565 +780 0.0780 1553.9519431188712133 41573.007749182216 +781 0.0781 1549.8012159365430307 41441.535897382259 +782 0.0782 1545.6636094545494871 41310.593742489436 +783 0.0783 1541.5390708396687387 41180.178555123290 +784 0.0784 1537.4275475307463239 41050.287623324301 +785 0.0785 1533.3289872369591649 40920.918252420532 +786 0.0786 1529.2433379360934396 40792.067764895983 +787 0.0787 1525.1705478728356411 40663.733500259514 +788 0.0788 1521.1105655570768249 40535.912814915515 +789 0.0789 1517.0633397622293614 40408.603082035595 +790 0.0790 1513.0288195235559670 40281.801691430919 +791 0.0791 1509.0069541365130590 40155.506049426433 +792 0.0792 1504.9976931551050257 40029.713578735296 +793 0.0793 1501.0009863902514553 39904.421718335638 +794 0.0794 1497.0167839081673264 39779.627923347085 +795 0.0795 1493.0450360287545664 39655.329664909295 +796 0.0796 1489.0856933240061153 39531.524430061167 +797 0.0797 1485.1387066164220414 39408.209721621424 +798 0.0798 1481.2040269774374792 39285.383058069361 +799 0.0799 1477.2816057258626188 39163.041973428277 +800 0.0800 1473.3713944263338362 39041.184017147985 +801 0.0801 1469.4733448877768751 38919.806753989869 +802 0.0802 1465.5874091618818511 38798.907763912255 +803 0.0803 1461.7135395415884886 38678.484641956995 +804 0.0804 1457.8516885595838630 38558.534998136674 +805 0.0805 1454.0018089868108291 38439.056457323284 +806 0.0806 1450.1638538309878186 38320.046659137559 +807 0.0807 1446.3377763351388694 38201.503257839518 +808 0.0808 1442.5235299761359329 38083.423922219568 +809 0.0809 1438.7210684632505036 37965.806335491085 +810 0.0810 1434.9303457367168448 37848.648195183116 +811 0.0811 1431.1513159663059014 37731.947213035150 +812 0.0812 1427.3839335499096705 37615.701114891730 +813 0.0813 1423.6281531121351236 37499.907640598278 +814 0.0814 1419.8839295029101777 37384.564543898545 +815 0.0815 1416.1512177960987628 37269.669592331549 +816 0.0816 1412.4299732881256659 37155.220567130928 +817 0.0817 1408.7201514966129707 37041.215263123660 +818 0.0818 1405.0217081590251382 36927.651488631149 +819 0.0819 1401.3345992313250008 36814.527065369715 +820 0.0820 1397.6587808866388514 36701.839828352931 +821 0.0821 1393.9942095139315370 36589.587625794942 +822 0.0822 1390.3408417166911022 36477.768319013070 +823 0.0823 1386.6986343116238913 36366.379782333344 +824 0.0824 1383.0675443273573819 36255.419902995040 +825 0.0825 1379.4475290031548411 36144.886581057654 +826 0.0826 1375.8385457876365763 36034.777729306683 +827 0.0827 1372.2405523375130088 35925.091273162587 +828 0.0828 1368.6535065163254785 35815.825150588091 +829 0.0829 1365.0773663931961437 35706.977311998373 +830 0.0830 1361.5120902415876571 35598.545720170441 +831 0.0831 1357.9576365380714833 35490.528350154316 +832 0.0832 1354.4139639611046277 35382.923189184177 +833 0.0833 1350.8810313898159166 35275.728236591058 +834 0.0834 1347.3587979028006885 35168.941503715490 +835 0.0835 1343.8472227769238998 35062.561013821498 +836 0.0836 1340.3462654861323244 34956.584802010744 +837 0.0837 1336.8558857002749392 34851.010915138038 +838 0.0838 1333.3760432839317218 34745.837411726970 +839 0.0839 1329.9066982952510898 34641.062361886696 +840 0.0840 1326.4478109847952965 34536.683847228931 +841 0.0841 1322.9993417943944678 34432.699960786143 +842 0.0842 1319.5612513560085972 34329.108806930075 +843 0.0843 1316.1335004905974984 34225.908501291298 +844 0.0844 1312.7160502069989434 34123.097170678702 +845 0.0845 1309.3088617008149868 34020.672953000714 +846 0.0846 1305.9118963533055648 33918.633997186240 +847 0.0847 1302.5251157302909633 33816.978463106629 +848 0.0848 1299.1484815810606506 33715.704521498541 +849 0.0849 1295.7819558372914344 33614.810353886845 +850 0.0850 1292.4255006119717564 33514.294152508832 +851 0.0851 1289.0790781983344004 33414.154120238338 +852 0.0852 1285.7426510687969312 33314.388470511280 +853 0.0853 1282.4161818739087266 33214.995427250760 +854 0.0854 1279.0996334413064233 33115.973224794216 +855 0.0855 1275.7929687746757281 33017.320107819804 +856 0.0856 1272.4961510527209612 32919.034331273884 +857 0.0857 1269.2091436281423285 32821.114160299614 +858 0.0858 1265.9319100266191072 32723.557870165278 +859 0.0859 1262.6644139458012432 32626.363746193572 +860 0.0860 1259.4066192543068610 32529.530083691858 +861 0.0861 1256.1584899907281851 32433.055187881990 +862 0.0862 1252.9199903626424657 32336.937373832072 +863 0.0863 1249.6910847456315423 32241.174966387312 +864 0.0864 1246.4717376823070936 32145.766300102587 +865 0.0865 1243.2619138813431618 32050.709719174854 +866 0.0866 1240.0615782165154997 31956.003577376796 +867 0.0867 1236.8706957257472823 31861.646237989822 +868 0.0868 1233.6892316101607321 31767.636073739031 +869 0.0869 1230.5171512331373833 31673.971466727722 +870 0.0870 1227.3544201193824392 31580.650808372993 +871 0.0871 1224.2010039539966328 31487.672499340988 +872 0.0872 1221.0568685815553636 31395.034949484114 +873 0.0873 1217.9219800051923812 31302.736577777163 +874 0.0874 1214.7963043856907461 31210.775812255102 +875 0.0875 1211.6798080405803830 31119.151089950923 +876 0.0876 1208.5724574432410918 31027.860856834050 +877 0.0877 1205.4742192220119250 30936.903567749090 +878 0.0878 1202.3850601593067040 30846.277686355254 +879 0.0879 1199.3049471907356747 30755.981685066010 +880 0.0880 1196.2338474042328471 30666.014044989926 +881 0.0881 1193.1717280391897020 30576.373255870989 +882 0.0882 1190.1185564855945813 30487.057816029977 +883 0.0883 1187.0743002831777630 30398.066232306228 +884 0.0884 1184.0389271205624482 30309.397020000062 +885 0.0885 1181.0124048344216590 30221.048702814853 +886 0.0886 1177.9947014086408217 30133.019812800820 +887 0.0887 1174.9857849734858064 30045.308890297973 +888 0.0888 1171.9856238047768784 29957.914483880704 +889 0.0889 1168.9941863230676518 29870.835150301544 +890 0.0890 1166.0114410928306370 29784.069454436562 +891 0.0891 1163.0373568216473359 29697.615969230777 +892 0.0892 1160.0719023594035662 29611.473275643002 +893 0.0893 1157.1150466974918345 29525.639962593341 +894 0.0894 1154.1667589680166657 29440.114626908522 +895 0.0895 1151.2270084430076622 29354.895873269663 +896 0.0896 1148.2957645336362020 29269.982314159563 +897 0.0897 1145.3729967894378206 29185.372569810090 +898 0.0898 1142.4586748975398223 29101.065268150945 +899 0.0899 1139.5527686818943494 29017.059044758342 +900 0.0900 1136.6552481025162251 28933.352542803252 +901 0.0901 1133.7660832547260270 28849.944413001685 +902 0.0902 1130.8852443683977071 28766.833313564402 +903 0.0903 1128.0127018072121245 28684.017910146409 +904 0.0904 1125.1484260679148974 28601.496875798577 +905 0.0905 1122.2923877795790304 28519.268890917727 +906 0.0906 1119.4445577028732259 28437.332643198599 +907 0.0907 1116.6049067293340613 28355.686827585210 +908 0.0908 1113.7734058806436224 28274.330146223088 +909 0.0909 1110.9500263079119122 28193.261308411944 +910 0.0910 1108.1347392909633527 28112.479030558119 +911 0.0911 1105.3275162376289700 28031.982036127971 +912 0.0912 1102.5283286830424458 27951.769055601639 +913 0.0913 1099.7371482889409435 27871.838826426523 +914 0.0914 1096.9539468429709359 27792.190092971927 +915 0.0915 1094.1786962579981264 27712.821606483580 +916 0.0916 1091.4113685714219173 27633.732125038419 +917 0.0917 1088.6519359444951078 27554.920413500025 +918 0.0918 1085.9003706616463205 27476.385243474469 +919 0.0919 1083.1566451298092488 27398.125393265993 +920 0.0920 1080.4207318777541786 27320.139647833294 +921 0.0921 1077.6926035554251939 27242.426798746637 +922 0.0922 1074.9722329332805657 27164.985644144137 +923 0.0923 1072.2595929016388254 27087.814988689883 +924 0.0924 1069.5546564700277941 27010.913643530832 +925 0.0925 1066.8573967665383861 26934.280426255107 +926 0.0926 1064.1677870371831887 26857.914160850261 +927 0.0927 1061.4858006452575410 26781.813677661856 +928 0.0928 1058.8114110707067539 26705.977813352401 +929 0.0929 1056.1445919094960573 26630.405410860127 +930 0.0930 1053.4853168729850950 26555.095319359301 +931 0.0931 1050.8335597873060578 26480.046394219338 +932 0.0932 1048.1892945927468190 26405.257496965223 +933 0.0933 1045.5524953431365702 26330.727495237850 +934 0.0934 1042.9231362052369150 26256.455262754913 +935 0.0935 1040.3011914581356905 26182.439679271432 +936 0.0936 1037.6866354926451095 26108.679630541781 +937 0.0937 1035.0794428107039948 26035.174008280592 +938 0.0938 1032.4795880247836521 25961.921710125160 +939 0.0939 1029.8870458572976077 25888.921639596989 +940 0.0940 1027.3017911400145294 25816.172706065088 +941 0.0941 1024.7237988134759235 25743.673824707828 +942 0.0942 1022.1530439264167853 25671.423916476509 +943 0.0943 1019.5895016351900040 25599.421908058150 +944 0.0944 1017.0331472031950852 25527.666731839839 +945 0.0945 1014.4839560003094903 25456.157325871609 +946 0.0946 1011.9419035023244078 25384.892633830925 +947 0.0947 1009.4069652903834822 25313.871604987398 +948 0.0948 1006.8791170504257479 25243.093194166562 +949 0.0949 1004.3583345726316338 25172.556361715753 +950 0.0950 1001.8445937508724910 25102.260073468078 +951 0.0951 999.3378705821636458 25032.203300709061 +952 0.0952 996.8381411661210905 24962.385020141151 +953 0.0953 994.3453817044214702 24892.804213850512 +954 0.0954 991.8595685002653681 24823.459869272378 +955 0.0955 989.3806779578438864 24754.350979158069 +956 0.0956 986.9086865818088654 24685.476541541400 +957 0.0957 984.4435709767465141 24616.835559705502 +958 0.0958 981.9853078466537681 24548.427042149950 +959 0.0959 979.5338739944183999 24480.250002558201 +960 0.0960 977.0892463213021983 24412.303459765259 +961 0.0961 974.6514018264276729 24344.586437725171 +962 0.0962 972.2203176062674856 24277.097965479559 +963 0.0963 969.7959708541371810 24209.837077125590 +964 0.0964 967.3783388596916666 24142.802811784772 +965 0.0965 964.9673990084238540 24075.994213571383 +966 0.0966 962.5631287811671655 24009.410331561558 +967 0.0967 960.1655057536008826 23943.050219763012 +968 0.0968 957.7745075957585641 23876.912937083478 +969 0.0969 955.3901120715393063 23810.997547301402 +970 0.0970 953.0122970382225276 23745.303119035030 +971 0.0971 950.6410404459851407 23679.828725713010 +972 0.0972 948.2763203374222485 23614.573445544240 +973 0.0973 945.9181148470705693 23549.536361488790 +974 0.0974 943.5664022009347036 23484.716561228590 +975 0.0975 941.2211607160163567 23420.113137138040 +976 0.0976 938.8823687998466312 23355.725186255568 +977 0.0977 936.5500049500211617 23291.551810254721 +978 0.0978 934.2240477537376364 23227.592115415791 +979 0.0979 931.9044758873369574 23163.845212597520 +980 0.0980 929.5912681158465602 23100.310217209357 +981 0.0981 927.2844032925269175 23036.986249183068 +982 0.0982 924.9838603584204293 22973.872432945882 +983 0.0983 922.6896183419034969 22910.967897392249 +984 0.0984 920.4016563582409844 22848.271775856931 +985 0.0985 918.1199536091437494 22785.783206088381 +986 0.0986 915.8444893823283337 22723.501330220883 +987 0.0987 913.5752430510798376 22661.425294749028 +988 0.0988 911.3121940738174089 22599.554250500252 +989 0.0989 909.0553219936618916 22537.887352609188 +990 0.0990 906.8046064380068856 22476.423760491518 +991 0.0991 904.5600271180913978 22415.162637817339 +992 0.0992 902.3215638285762452 22354.103152486590 +993 0.0993 900.0891964471218216 22293.244476602420 +994 0.0994 897.8629049339693893 22232.585786446420 +995 0.0995 895.6426693315244165 22172.126262453312 +996 0.0996 893.4284697639424166 22111.865089185809 +997 0.0997 891.2202864367176289 22051.801455309702 +998 0.0998 889.0180996362736323 21991.934553569590 +999 0.0999 886.8218897295569150 21932.263580763931 +1000 0.1000 884.6316371636327176 21872.787737720901 +1001 0.1001 882.4473224652829231 21813.506229274259 +1002 0.1002 880.2689262406072430 21754.418264239390 +1003 0.1003 878.0964291746257686 21695.523055389240 +1004 0.1004 875.9298120308847047 21636.819819431032 +1005 0.1005 873.7690556510640363 21578.307776982518 +1006 0.1006 871.6141409545874694 21519.986152548550 +1007 0.1007 869.4650489382350997 21461.854174498279 +1008 0.1008 867.3217606757581279 21403.911075041960 +1009 0.1009 865.1842573174956215 21346.156090207980 +1010 0.1010 863.0525200899942320 21288.588459820199 +1011 0.1011 860.9265302956293908 21231.207427475758 +1012 0.1012 858.8062693122294604 21174.012240522319 +1013 0.1013 856.6917185927015908 21117.002150035922 +1014 0.1014 854.5828596646598498 21060.176410798980 +1015 0.1015 852.4796741300559688 21003.534281278440 +1016 0.1016 850.3821436648119061 20947.075023603909 +1017 0.1017 848.2902500184544579 20890.797903546110 +1018 0.1018 846.2039750137523697 20834.702190495231 +1019 0.1019 844.1233005463556083 20778.787157439801 +1020 0.1020 842.0482085844363382 20723.052080945701 +1021 0.1021 839.9786811683322867 20667.496241134580 +1022 0.1022 837.9147004101923812 20612.118921663372 +1023 0.1023 835.8562484936239798 20556.919409703631 +1024 0.1024 833.8033076733427151 20501.896995920710 +1025 0.1025 831.7558602748240446 20447.050974453261 +1026 0.1026 829.7138886939567328 20392.380642893149 +1027 0.1027 827.6773753966988352 20337.885302265189 +1028 0.1028 825.6463029187352731 20283.564257006881 +1029 0.1029 823.6206538651374558 20229.416814949051 +1030 0.1030 821.6004109100252890 20175.442287295278 +1031 0.1031 819.5855567962303212 20121.639988603030 +1032 0.1032 817.5760743349619588 20068.009236763599 +1033 0.1033 815.5719464054745913 20014.549352983347 +1034 0.1034 813.5731559547372171 19961.259661763572 +1035 0.1035 811.5796859971048889 19908.139490882262 +1036 0.1036 809.5915196139920909 19855.188171374732 +1037 0.1037 807.6086399535475948 19802.405037514571 +1038 0.1038 805.6310302303320441 19749.789426795447 +1039 0.1039 803.6586737249966745 19697.340679911969 +1040 0.1040 801.6915537839639683 19645.058140741588 +1041 0.1041 799.7296538191105810 19592.941156326149 +1042 0.1042 797.7729573074516338 19540.989076853362 +1043 0.1043 795.8214477908270510 19489.201255639160 +1044 0.1044 793.8751088755896035 19437.577049109583 +1045 0.1045 791.9339242322949985 19386.115816782720 +1046 0.1046 789.9978775953933336 19334.816921251142 +1047 0.1047 788.0669527629225968 19283.679728164141 +1048 0.1048 786.1411335962038720 19232.703606210409 +1049 0.1049 784.2204040195383641 19181.887927100513 +1050 0.1050 782.3047480199059009 19131.232065549571 +1051 0.1051 780.3941496466653689 19080.735399260400 +1052 0.1052 778.4885930112570804 19030.397308906020 +1053 0.1053 776.5880622869061654 18980.217178112987 +1054 0.1054 774.6925417083282355 18930.194393444719 +1055 0.1055 772.8020155714367547 18880.328344384270 +1056 0.1056 770.9164682330516598 18830.618423318399 +1057 0.1057 769.0358841106096861 18781.064025520533 +1058 0.1058 767.1602476818769674 18731.664549134770 +1059 0.1059 765.2895434846623175 18682.419395159268 +1060 0.1060 763.4237561165327861 18633.327967430290 +1061 0.1061 761.5628702345309193 18584.389672606238 +1062 0.1062 759.7068705548930438 18535.603920151530 +1063 0.1063 757.8557418527694836 18486.970122320759 +1064 0.1064 756.0094689619462542 18438.487694143030 +1065 0.1065 754.1680367745688045 18390.156053406219 +1066 0.1066 752.3314302408664389 18341.974620641733 +1067 0.1067 750.4996343688789011 18293.942819108452 +1068 0.1068 748.6726342241845487 18246.060074778157 +1069 0.1069 746.8504149296296646 18198.325816319830 +1070 0.1070 745.0329616650594744 18150.739475084571 +1071 0.1071 743.2202596670507546 18103.300485090622 +1072 0.1072 741.4122942286458056 18056.008283008581 +1073 0.1073 739.6090506990880158 18008.862308146352 +1074 0.1074 737.8105144835590181 17961.862002434209 +1075 0.1075 736.0166710429167551 17915.006810410800 +1076 0.1076 734.2275058934358185 17868.296179208082 +1077 0.1077 732.4430046065485840 17821.729558536779 +1078 0.1078 730.6631528085881655 17775.306400672529 +1079 0.1079 728.8879361805325061 17729.026160441052 +1080 0.1080 727.1173404577501742 17682.888295204619 +1081 0.1081 725.3513514297476377 17636.892264847040 +1082 0.1082 723.5899549399172201 17591.037531760790 +1083 0.1083 721.8331368852875585 17545.323560832250 +1084 0.1084 720.0808832162745148 17499.749819427991 +1085 0.1085 718.3331799364340213 17454.315777381740 +1086 0.1086 716.5900131022159485 17409.020906979771 +1087 0.1087 714.8513688227195644 17363.864682948231 +1088 0.1088 713.1172332594502450 17318.846582438848 +1089 0.1089 711.3875926260774349 17273.966085016269 +1090 0.1090 709.6624331881944272 17229.222672644632 +1091 0.1091 707.9417412630784838 17184.615829673829 +1092 0.1092 706.2255032194534579 17140.145042827018 +1093 0.1093 704.5137054772527563 17095.809801187421 +1094 0.1094 702.8063345073841219 17051.609596185142 +1095 0.1095 701.1033768314956660 17007.543921584518 +1096 0.1096 699.4048190217429237 16963.612273471372 +1097 0.1097 697.7106477005573879 16919.814150240039 +1098 0.1098 696.0208495404162932 16876.149052581022 +1099 0.1099 694.3354112636138780 16832.616483468351 +1100 0.1100 692.6543196420331014 16789.215948147161 +1101 0.1101 690.9775614969196340 16745.946954121078 +1102 0.1102 689.3051236986565300 16702.809011140278 +1103 0.1103 687.6369931665400372 16659.801631188951 +1104 0.1104 685.9731568685568845 16616.924328473477 +1105 0.1105 684.3136018211627061 16574.176619409798 +1106 0.1106 682.6583150890616025 16531.558022612291 +1107 0.1107 681.0072837849869529 16489.068058880708 +1108 0.1108 679.3604950694834770 16446.706251189553 +1109 0.1109 677.7179361506902069 16404.472124675391 +1110 0.1110 676.0795942841251644 16362.365206625538 +1111 0.1111 674.4454567724706067 16320.385026466281 +1112 0.1112 672.8155109653597492 16278.531115751543 +1113 0.1113 671.1897442591646268 16236.803008151261 +1114 0.1114 669.5681440967850904 16195.200239440179 +1115 0.1115 667.9506979674388276 16153.722347485969 +1116 0.1116 666.3373934064526338 16112.368872238669 +1117 0.1117 664.7282179950547061 16071.139355718980 +1118 0.1118 663.1231593601684153 16030.033342007500 +1119 0.1119 661.5222051742064195 15989.050377233141 +1120 0.1120 659.9253431548665958 15948.190009563041 +1121 0.1121 658.3325610649288819 15907.451789190749 +1122 0.1122 656.7438467120530277 15866.835268325740 +1123 0.1123 655.1591879485775962 15826.340001182882 +1124 0.1124 653.5785726713198756 15785.965543971179 +1125 0.1125 652.0019888213771537 15745.711454883680 +1126 0.1126 650.4294243839286764 15705.577294086601 +1127 0.1127 648.8608673880388551 15665.562623708738 +1128 0.1128 647.2963059064618392 15625.667007831260 +1129 0.1129 645.7357280554464296 15585.890012477168 +1130 0.1130 644.1791219945424700 15546.231205601021 +1131 0.1131 642.6264759264084887 15506.690157078752 +1132 0.1132 641.0777780966196815 15467.266438697179 +1133 0.1133 639.5330167934776000 15427.959624144471 +1134 0.1134 637.9921803478204083 15388.769288999280 +1135 0.1135 636.4552571328343902 15349.695010721458 +1136 0.1136 634.9222355638662521 15310.736368641808 +1137 0.1137 633.3931040982365630 15271.892943952047 +1138 0.1138 631.8678512350542178 15233.164319695390 +1139 0.1139 630.3464655150315821 15194.550080756231 +1140 0.1140 628.8289355203012292 15156.049813851268 +1141 0.1141 627.3152498742326770 15117.663107518831 +1142 0.1142 625.8053972412512849 15079.389552110108 +1143 0.1143 624.2993663266568092 15041.228739779461 +1144 0.1144 622.7971458764441195 15003.180264474438 +1145 0.1145 621.2987246771240279 14965.243721927291 +1146 0.1146 619.8040915555454831 14927.418709644631 +1147 0.1147 618.3132353787183320 14889.704826898971 +1148 0.1148 616.8261450536374468 14852.101674719011 +1149 0.1149 615.3428095271074199 14814.608855880500 +1150 0.1150 613.8632177855685086 14777.225974897308 +1151 0.1151 612.3873588549230362 14739.952638012212 +1152 0.1152 610.9152218003630423 14702.788453187921 +1153 0.1153 609.4467957261987294 14665.733030098090 +1154 0.1154 607.9820697756879326 14628.785980118391 +1155 0.1155 606.5210331308661580 14591.946916317771 +1156 0.1156 605.0636750123777574 14555.215453449700 +1157 0.1157 603.6099846793081269 14518.591207943191 +1158 0.1158 602.1599514290162460 14482.073797894180 +1159 0.1159 600.7135645969686948 14445.662843057191 +1160 0.1160 599.2708135565740122 14409.357964836261 +1161 0.1161 597.8316877190183050 14373.158786276752 +1162 0.1162 596.3961765331016522 14337.064932056690 +1163 0.1163 594.9642694850748512 14301.076028478768 +1164 0.1164 593.5359560984778682 14265.191703461000 +1165 0.1165 592.1112259339782895 14229.411586529539 +1166 0.1166 590.6900685892113643 14193.735308809719 +1167 0.1167 589.2724736986200469 14158.162503017678 +1168 0.1168 587.8584309332965177 14122.692803452923 +1169 0.1169 586.4479300008243854 14087.325845989420 +1170 0.1170 585.0409606451215723 14052.061268067780 +1171 0.1171 583.6375126462837670 14016.898708687639 +1172 0.1172 582.2375758204294698 13981.837808398937 +1173 0.1173 580.8411400195448095 13946.878209294522 +1174 0.1174 579.4481951313299533 13912.019555001980 +1175 0.1175 578.0587310790460833 13877.261490675992 +1176 0.1176 576.6727378213627162 13842.603662990379 +1177 0.1177 575.2902053522067263 13808.045720130322 +1178 0.1178 573.9111237006109150 13773.587311784930 +1179 0.1179 572.5354829305647399 13739.228089139200 +1180 0.1180 571.1632731408644759 13704.967704866662 +1181 0.1181 569.7944844649650804 13670.805813121811 +1182 0.1182 568.4291070708324014 13636.742069532291 +1183 0.1183 567.0671311607961798 13602.776131191829 +1184 0.1184 565.7085469714039618 13568.907656652502 +1185 0.1185 564.3533447732754667 13535.136305917527 +1186 0.1186 563.0015148709578625 13501.461740433679 +1187 0.1187 561.6530476027819532 13467.883623084221 +1188 0.1188 560.3079333407187050 13434.401618181671 +1189 0.1189 558.9661624902365702 13401.015391460091 +1190 0.1190 557.6277254901601736 13367.724610068741 +1191 0.1191 556.2926128125285459 13334.528942564182 +1192 0.1192 554.9608149624551743 13301.428058903490 +1193 0.1193 553.6323224779881684 13268.421630437400 +1194 0.1194 552.3071259299711073 13235.509329902899 +1195 0.1195 550.9852159219051373 13202.690831416570 +1196 0.1196 549.6665830898109562 13169.965810467400 +1197 0.1197 548.3512181020920480 13137.333943910191 +1198 0.1198 547.0391116593985998 13104.794909958520 +1199 0.1199 545.7302544944917599 13072.348388177892 +1200 0.1200 544.4246373721089185 13039.994059479141 +1201 0.1201 543.1222510888293300 13007.731606111589 +1202 0.1202 541.8230864729409859 12975.560711656291 +1203 0.1203 540.5271343843071463 12943.481061019567 +1204 0.1204 539.2343857142348043 12911.492340426181 +1205 0.1205 537.9448313853428090 12879.594237413203 +1206 0.1206 536.6584623514310124 12847.786440822740 +1207 0.1207 535.3752695973500977 12816.068640795991 +1208 0.1208 534.0952441388719762 12784.440528766641 +1209 0.1209 532.8183770225608669 12752.901797454631 +1210 0.1210 531.5446593256451706 12721.452140859381 +1211 0.1211 530.2740821558895732 12690.091254253599 +1212 0.1212 529.0066366514680567 12658.818834177258 +1213 0.1213 527.7423139808377073 12627.634578430800 +1214 0.1214 526.4811053426127501 12596.538186069371 +1215 0.1215 525.2230019654394937 12565.529357396270 +1216 0.1216 523.9679951078718432 12534.607793957082 +1217 0.1217 522.7160760582472676 12503.773198533299 +1218 0.1218 521.4672361345637910 12473.025275136451 +1219 0.1219 520.2214666843568693 12442.363729001760 +1220 0.1220 518.9787590845776322 12411.788266582262 +1221 0.1221 517.7391047414713512 12381.298595542929 +1222 0.1222 516.5024950904564776 12350.894424754661 +1223 0.1223 515.2689215960043612 12320.575464287998 +1224 0.1224 514.0383757515195384 12290.341425408018 +1225 0.1225 512.8108490792208158 12260.192020567421 +1226 0.1226 511.5863331300223535 12230.126963401817 +1227 0.1227 510.3648194834161131 12200.145968723031 +1228 0.1228 509.1462997473542487 12170.248752513851 +1229 0.1229 507.9307655581324639 12140.435031922239 +1230 0.1230 506.7182085802735969 12110.704525255589 +1231 0.1231 505.5086205064120577 12081.056951974722 +1232 0.1232 504.3019930571788905 12051.492032688981 +1233 0.1233 503.0983179810869501 12022.009489150130 +1234 0.1234 501.8975870544171016 11992.609044246761 +1235 0.1235 500.6997920811048175 11963.290421999109 +1236 0.1236 499.5049248926272298 11934.053347553168 +1237 0.1237 498.3129773478908078 11904.897547175462 +1238 0.1238 497.1239413331196602 11875.822748247661 +1239 0.1239 495.9378087617442361 11846.828679260940 +1240 0.1240 494.7545715742906509 11817.915069810599 +1241 0.1241 493.5742217382705803 11789.081650591110 +1242 0.1242 492.3967512480714959 11760.328153390357 +1243 0.1243 491.2221521248477529 11731.654311084480 +1244 0.1244 490.0504164164119061 11703.059857632868 +1245 0.1245 488.8815361971266498 11674.544528072562 +1246 0.1246 487.7155035677973842 11646.108058513131 +1247 0.1247 486.5523106555651225 11617.750186131740 +1248 0.1248 485.3919496138001364 11589.470649167848 +1249 0.1249 484.2344126219958298 11561.269186917998 +1250 0.1250 483.0796918856633511 11533.145539731071 +1251 0.1251 481.9277796362266599 11505.099449002699 +1252 0.1252 480.7786681309179926 11477.130657170761 +1253 0.1253 479.6323496526739518 11449.238907710031 +1254 0.1254 478.4888165100320521 11421.423945127663 +1255 0.1255 477.3480610370277759 11393.685514957420 +1256 0.1256 476.2100755930921423 11366.023363755590 +1257 0.1257 475.0748525629495589 11338.437239095951 +1258 0.1258 473.9423843565165271 11310.926889564300 +1259 0.1259 472.8126634088005744 11283.492064754300 +1260 0.1260 471.6856821797997554 11256.132515262580 +1261 0.1261 470.5614331544024367 11228.847992683528 +1262 0.1262 469.4399088422879913 11201.638249604968 +1263 0.1263 468.3211017778275504 11174.503039603342 +1264 0.1264 467.2050045199854367 11147.442117238741 +1265 0.1265 466.0916096522209386 11120.455238050719 +1266 0.1266 464.9809097823907678 11093.542158553149 +1267 0.1267 463.8728975426516286 11066.702636229978 +1268 0.1268 462.7675655893636417 11039.936429530289 +1269 0.1269 461.6649066029939377 11013.243297864090 +1270 0.1270 460.5649132880208754 10986.623001597540 +1271 0.1271 459.4675783728386023 10960.075302048481 +1272 0.1272 458.3728946096620689 10933.599961481728 +1273 0.1273 457.2808547744327257 10907.196743105242 +1274 0.1274 456.1914516667242196 10880.865411064871 +1275 0.1275 455.1046781096489440 10854.605730440389 +1276 0.1276 454.0205269497648715 10828.417467241208 +1277 0.1277 452.9389910569827293 10802.300388401498 +1278 0.1278 451.8600633244738560 10776.254261776328 +1279 0.1279 450.7837366685781717 10750.278856137211 +1280 0.1280 449.7100040287129445 10724.373941167531 +1281 0.1281 448.6388583672816139 10698.539287458672 +1282 0.1282 447.5702926695834094 10672.774666505540 +1283 0.1283 446.5042999437230264 10647.079850702139 +1284 0.1284 445.4408732205210413 10621.454613338041 +1285 0.1285 444.3800055534244962 10595.898728593200 +1286 0.1286 443.3216900184181100 10570.411971534621 +1287 0.1287 442.2659197139357730 10544.994118112012 +1288 0.1288 441.2126877607724964 10519.644945153310 +1289 0.1289 440.1619873019967599 10494.364230361001 +1290 0.1290 439.1138115028633138 10469.151752307940 +1291 0.1291 438.0681535507262652 10444.007290433068 +1292 0.1292 437.0250066549527332 10418.930625037810 +1293 0.1293 435.9843640468367880 10393.921537281542 +1294 0.1294 434.9462189795137874 10368.979809178159 +1295 0.1295 433.9105647278752826 10344.105223591601 +1296 0.1296 432.8773945884840941 10319.297564232300 +1297 0.1297 431.8467018794898422 10294.556615653040 +1298 0.1298 430.8184799405449326 10269.882163245151 +1299 0.1299 429.7927221327209395 10245.273993234452 +1300 0.1300 428.7694218384253304 10220.731892677841 +1301 0.1301 427.7485724613184743 10196.255649458721 +1302 0.1302 426.7301674262313327 10171.845052284010 +1303 0.1303 425.7142001790831500 10147.499890679588 +1304 0.1304 424.7006641867998269 10123.219954987180 +1305 0.1305 423.6895529372324631 10099.005036360211 +1306 0.1306 422.6808599390764698 10074.854926759868 +1307 0.1307 421.6745787217908514 10050.769418952139 +1308 0.1308 420.6707028355180569 10026.748306503190 +1309 0.1309 419.6692258510040574 10002.791383776388 +1310 0.1310 418.6701413595188228 9978.898445928460 +1311 0.1311 417.6734429727771385 9955.069288905681 +1312 0.1312 416.6791243228598205 9931.303709440130 +1313 0.1313 415.6871790621354990 9907.601505046830 +1314 0.1314 414.6976008631821742 9883.962474019179 +1315 0.1315 413.7103834187099096 9860.386415426088 +1316 0.1316 412.7255204414831837 9836.873129108411 +1317 0.1317 411.7430056642440377 9813.422415674740 +1318 0.1318 410.7628328396353368 9790.034076499020 +1319 0.1319 409.7849957401246002 9766.707913715740 +1320 0.1320 408.8094881579279445 9743.443730217808 +1321 0.1321 407.8363039049344252 9720.241329652019 +1322 0.1322 406.8654368126310032 9697.100516416369 +1323 0.1323 405.8968807320273982 9674.021095655920 +1324 0.1324 404.9306295335815662 9651.002873260280 +1325 0.1325 403.9666771071255766 9628.045655859591 +1326 0.1326 403.0050173617915448 9605.149250821061 +1327 0.1327 402.0456442259381902 9582.313466246431 +1328 0.1328 401.0885516470774519 9559.538110967789 +1329 0.1329 400.1337335918018425 9536.822994544491 +1330 0.1330 399.1811840457115750 9514.167927260409 +1331 0.1331 398.2308970133425419 9491.572720119801 +1332 0.1332 397.2828665180942949 9469.037184844759 +1333 0.1333 396.3370866021584789 9446.561133871612 +1334 0.1334 395.3935513264474935 9424.144380347749 +1335 0.1335 394.4522547705236661 9401.786738128529 +1336 0.1336 393.5131910325285389 9379.488021774039 +1337 0.1337 392.5763542291125532 9357.248046545939 +1338 0.1338 391.6417384953650753 9335.066628404038 +1339 0.1339 390.7093379847447068 9312.943584003800 +1340 0.1340 389.7791468690098782 9290.878730692431 +1341 0.1341 388.8511593381499551 9268.871886506491 +1342 0.1342 387.9253696003162304 9246.922870168421 +1343 0.1343 387.0017718817536547 9225.031501083200 +1344 0.1344 386.0803604267326818 9203.197599336170 +1345 0.1345 385.1611294974814541 9181.420985688950 +1346 0.1346 384.2440733741181589 9159.701481577360 +1347 0.1347 383.3291863545838964 9138.038909107539 +1348 0.1348 382.4164627545758322 9116.433091053670 +1349 0.1349 381.5058969074804054 9094.883850854581 +1350 0.1350 380.5974831643071070 9073.391012610959 +1351 0.1351 379.6912158936224273 9051.954401082490 +1352 0.1352 378.7870894814840881 9030.573841684491 +1353 0.1353 377.8850983313755592 9009.249160485619 +1354 0.1354 376.9852368641410862 8987.980184204349 +1355 0.1355 376.0874995179205484 8966.766740206580 +1356 0.1356 375.1918807480851115 8945.608656502600 +1357 0.1357 374.2983750271727672 8924.505761744131 +1358 0.1358 373.4069768448244986 8903.457885221509 +1359 0.1359 372.5176807077203875 8882.464856861079 +1360 0.1360 371.6304811395162346 8861.526507221999 +1361 0.1361 370.7453726807804628 8840.642667493859 +1362 0.1362 369.8623498889310781 8819.813169493451 +1363 0.1363 368.9814073381732555 8799.037845662511 +1364 0.1364 368.1025396194369250 8778.316529064559 +1365 0.1365 367.2257413403145847 8757.649053382360 +1366 0.1366 366.3510071249997395 8737.035252914990 +1367 0.1367 365.4783316142252261 8716.474962575350 +1368 0.1368 364.6077094652021060 8695.968017887451 +1369 0.1369 363.7391353515585593 8675.514254983560 +1370 0.1370 362.8726039632792890 8655.113510601801 +1371 0.1371 362.0081100066450404 8634.765622083101 +1372 0.1372 361.1456482041724598 8614.470427368840 +1373 0.1373 360.2852132945541257 8594.227764998279 +1374 0.1374 359.4268000325989192 8574.037474105660 +1375 0.1375 358.5704031891727368 8553.899394417811 +1376 0.1376 357.7160175511392595 8533.813366251570 +1377 0.1377 356.8636379213011196 8513.779230510940 +1378 0.1378 356.0132591183412956 8493.796828685048 +1379 0.1379 355.1648759767647903 8473.866002845021 +1380 0.1380 354.3184833468404236 8453.986595641760 +1381 0.1381 353.4740760945431930 8434.158450303210 +1382 0.1382 352.6316491014964072 8414.381410632370 +1383 0.1383 351.7911972649146151 8394.655321004031 +1384 0.1384 350.9527154975462508 8374.980026362951 +1385 0.1385 350.1161987276170748 8355.355372220711 +1386 0.1386 349.2816418987733300 8335.781204654082 +1387 0.1387 348.4490399700255239 8316.257370301930 +1388 0.1388 347.6183879156922671 8296.783716362901 +1389 0.1389 346.7896807253444535 8277.360090593220 +1390 0.1390 345.9629134037496101 8257.986341304011 +1391 0.1391 345.1380809708164747 8238.662317359260 +1392 0.1392 344.3151784615398583 8219.387868172840 +1393 0.1393 343.4942009259459041 8200.162843706741 +1394 0.1394 342.6751434290371208 8180.987094468390 +1395 0.1395 341.8580010507382667 8161.860471508259 +1396 0.1396 341.0427688858419515 8142.782826417661 +1397 0.1397 340.2294420439547480 8123.754011326400 +1398 0.1398 339.4180156494434186 8104.773878900500 +1399 0.1399 338.6084848413814257 8085.842282339750 +1400 0.1400 337.8008447734956690 8066.959075375431 +1401 0.1401 336.9950906141135079 8048.124112268109 +1402 0.1402 336.1912175461098400 8029.337247805570 +1403 0.1403 335.3892207668545780 8010.598337299961 +1404 0.1404 334.5890954881602966 7991.907236586221 +1405 0.1405 333.7908369362299936 7973.263802019301 +1406 0.1406 332.9944403516054194 7954.667890472430 +1407 0.1407 332.1999009891150649 7936.119359334551 +1408 0.1408 331.4072141178229458 7917.618066507859 +1409 0.1409 330.6163750209772161 7899.163870406610 +1410 0.1410 329.8273789959591795 7880.756629953680 +1411 0.1411 329.0402213542325285 7862.396204579400 +1412 0.1412 328.2548974212926396 7844.082454218760 +1413 0.1413 327.4714025366162105 7825.815239309660 +1414 0.1414 326.6897320536112375 7807.594420790320 +1415 0.1415 325.9098813395668230 7789.419860097740 +1416 0.1416 325.1318457756036651 7771.291419165191 +1417 0.1417 324.3556207566243756 7753.208960420180 +1418 0.1418 323.5812016912642548 7735.172346782109 +1419 0.1419 322.8085840018421209 7717.181441660870 +1420 0.1420 322.0377631243113683 7699.236108954061 +1421 0.1421 321.2687345082114234 7681.336213045190 +1422 0.1422 320.5014936166190864 7663.481618801750 +1423 0.1423 319.7360359261003282 7645.672191573040 +1424 0.1424 318.9723569266622576 7627.907797187971 +1425 0.1425 318.2104521217052024 7610.188301953360 +1426 0.1426 317.4503170279749611 7592.513572651720 +1427 0.1427 316.6919471755153950 7574.883476539269 +1428 0.1428 315.9353381076212486 7557.297881343949 +1429 0.1429 315.1804853807908557 7539.756655263369 +1430 0.1430 314.4273845646795280 7522.259666963179 +1431 0.1431 313.6760312420526589 7504.806785574420 +1432 0.1432 312.9264210087393394 7487.397880692241 +1433 0.1433 312.1785494735860311 7470.032822373630 +1434 0.1434 311.4324122584105794 7452.711481135630 +1435 0.1435 310.6880049979561704 7435.433727952930 +1436 0.1436 309.9453233398456860 7418.199434256820 +1437 0.1437 309.2043629445362285 7401.008471932299 +1438 0.1438 308.4651194852737603 7383.860713317191 +1439 0.1439 307.7275886480479699 7366.756031199099 +1440 0.1440 306.9917661315473083 7349.694298814680 +1441 0.1441 306.2576476471142541 7332.675389846861 +1442 0.1442 305.5252289187007477 7315.699178423610 +1443 0.1443 304.7945056828237966 7298.765539115630 +1444 0.1444 304.0654736885213083 7281.874346934661 +1445 0.1445 303.3381286973079796 7265.025477331940 +1446 0.1446 302.6124664831315840 7248.218806195790 +1447 0.1447 301.8884828323292595 7231.454209850419 +1448 0.1448 301.1661735435840797 7214.731565053529 +1449 0.1449 300.4455344278816256 7198.050748995030 +1450 0.1450 299.7265613084671259 7181.411639294851 +1451 0.1451 299.0092500208023125 7164.814114001280 +1452 0.1452 298.2935964125227883 7148.258051589451 +1453 0.1453 297.5795963433953375 7131.743330959199 +1454 0.1454 296.8672456852756909 7115.269831433410 +1455 0.1455 296.1565403220662347 7098.837432756230 +1456 0.1456 295.4474761496738324 7082.446015091789 +1457 0.1457 294.7400490759681588 7066.095459021510 +1458 0.1458 294.0342550207399199 7049.785645543549 +1459 0.1459 293.3300899156592436 7033.516456069960 +1460 0.1460 292.6275497042344682 7017.287772425860 +1461 0.1461 291.9266303417708173 7001.099476847149 +1462 0.1462 291.2273277953294723 6984.951451979271 +1463 0.1463 290.5296380436867594 6968.843580875000 +1464 0.1464 289.8335570772933352 6952.775746993429 +1465 0.1465 289.1390808982337717 6936.747834197570 +1466 0.1466 288.4462055201862540 6920.759726753279 +1467 0.1467 287.7549269683822217 6904.811309327420 +1468 0.1468 287.0652412795665782 6888.902466985890 +1469 0.1469 286.3771445019576731 6873.033085192720 +1470 0.1470 285.6906326952076824 6857.203049807570 +1471 0.1471 285.0057019303630454 6841.412247084921 +1472 0.1472 284.3223482898252428 6825.660563671679 +1473 0.1473 283.6405678673113471 6809.947886606319 +1474 0.1474 282.9603567678151990 6794.274103316689 +1475 0.1475 282.2817111075684124 6778.639101618900 +1476 0.1476 281.6046270140017214 6763.042769715300 +1477 0.1477 280.9291006257063259 6747.484996193150 +1478 0.1478 280.2551280923955233 6731.965670023171 +1479 0.1479 279.5827055748665089 6716.484680557581 +1480 0.1480 278.9118292449621777 6701.041917528991 +1481 0.1481 278.2424952855333231 6685.637271048460 +1482 0.1482 277.5746998904006659 6670.270631604350 +1483 0.1483 276.9084392643174510 6654.941890060441 +1484 0.1484 276.2437096229317035 6639.650937654631 +1485 0.1485 275.5805071927491099 6624.397665997401 +1486 0.1486 274.9188282110957289 6609.181967070131 +1487 0.1487 274.2586689260810431 6594.003733223721 +1488 0.1488 273.6000255965610108 6578.862857177151 +1489 0.1489 272.9428944921013453 6563.759232015931 +1490 0.1490 272.2872718929410212 6548.692751190691 +1491 0.1491 271.6331540899557240 6533.663308515429 +1492 0.1492 270.9805373846216412 6518.670798166340 +1493 0.1493 270.3294180889793097 6503.715114680320 +1494 0.1494 269.6797925255976338 6488.796152953551 +1495 0.1495 269.0316570275379604 6473.913808239580 +1496 0.1496 268.3850079383185516 6459.067976148830 +1497 0.1497 267.7398416118788305 6444.258552645991 +1498 0.1498 267.0961544125440810 6429.485434049560 +1499 0.1499 266.4539427149900916 6414.748517030059 +1500 0.1500 265.8132029042081399 6400.047698608450 +1501 0.1501 265.1739313754699765 6385.382876154949 +1502 0.1502 264.5361245342928669 6370.753947387600 +1503 0.1503 263.8997787964049735 6356.160810370820 +1504 0.1504 263.2648905877107381 6341.603363514160 +1505 0.1505 262.6314563442564918 6327.081505570600 +1506 0.1506 261.9994725121961778 6312.595135635621 +1507 0.1507 261.3689355477571326 6298.144153145270 +1508 0.1508 260.7398419172060926 6283.728457875530 +1509 0.1509 260.1121880968153164 6269.347949940161 +1510 0.1510 259.4859705728288191 6255.002529790131 +1511 0.1511 258.8611858414287212 6240.692098211531 +1512 0.1512 258.2378304087018819 6226.416556324800 +1513 0.1513 257.6159007906064744 6212.175805583220 +1514 0.1514 256.9953935129387332 6197.969747771359 +1515 0.1515 256.3763051112999278 6183.798285004311 +1516 0.1516 255.7586321310634219 6169.661319725531 +1517 0.1517 255.1423711273418178 6155.558754706431 +1518 0.1518 254.5275186649542718 6141.490493044671 +1519 0.1519 253.9140713183939226 6127.456438162460 +1520 0.1520 253.3020256717954908 6113.456493806179 +1521 0.1521 252.6913783189029630 6099.490564044250 +1522 0.1522 252.0821258630374189 6085.558553266470 +1523 0.1523 251.4742649170649997 6071.660366182170 +1524 0.1524 250.8677921033649056 6057.795907819570 +1525 0.1525 250.2627040537977336 6043.965083523890 +1526 0.1526 249.6589974096737024 6030.167798956669 +1527 0.1527 249.0566688217211606 6016.403960094091 +1528 0.1528 248.4557149500551532 6002.673473226060 +1529 0.1529 247.8561324641460999 5988.976244954801 +1530 0.1530 247.2579180427886740 5975.312182193459 +1531 0.1531 246.6610683740707373 5961.681192165250 +1532 0.1532 246.0655801553423885 5948.083182401941 +1533 0.1533 245.4714500931851546 5934.518060742890 +1534 0.1534 244.8786749033813237 5920.985735333481 +1535 0.1535 244.2872513108834198 5907.486114624399 +1536 0.1536 243.6971760497837067 5894.019107369971 +1537 0.1537 243.1084458632838619 5880.584622627080 +1538 0.1538 242.5210575036647924 5867.182569754490 +1539 0.1539 241.9350077322565369 5853.812858410820 +1540 0.1540 241.3502933194083084 5840.475398553869 +1541 0.1541 240.7669110444586238 5827.170100439690 +1542 0.1542 240.1848576957056025 5813.896874620711 +1543 0.1543 239.6041300703772947 5800.655631945209 +1544 0.1544 239.0247249746022362 5787.446283555770 +1545 0.1545 238.4466392233800320 5774.268740888380 +1546 0.1546 237.8698696405520536 5761.122915671370 +1547 0.1547 237.2944130587723066 5748.008719923590 +1548 0.1548 236.7202663194784122 5734.926065954370 +1549 0.1549 236.1474262728626172 5721.874866361351 +1550 0.1550 235.5758897778430594 5708.855034030061 +1551 0.1551 235.0056537020349197 5695.866482132571 +1552 0.1552 234.4367149217219719 5682.909124126200 +1553 0.1553 233.8690703218280476 5669.982873752539 +1554 0.1554 233.3027167958885855 5657.087645036780 +1555 0.1555 232.7376512460224660 5644.223352285620 +1556 0.1556 232.1738705829038167 5631.389910087290 +1557 0.1557 231.6113717257339601 5618.587233309590 +1558 0.1558 231.0501516022135036 5605.815237099370 +1559 0.1559 230.4902071485144859 5593.073836881179 +1560 0.1560 229.9315353092526095 5580.362948356130 +1561 0.1561 229.3741330374597567 5567.682487501101 +1562 0.1562 228.8179972945563350 5555.032370567480 +1563 0.1563 228.2631250503239642 5542.412514080110 +1564 0.1564 227.7095132828781345 5529.822834836311 +1565 0.1565 227.1571589786410925 5517.263249904790 +1566 0.1566 226.6060591323146127 5504.733676624620 +1567 0.1567 226.0562107468531678 5492.234032604079 +1568 0.1568 225.5076108334369849 5479.764235719809 +1569 0.1569 224.9602564114452150 5467.324204115740 +1570 0.1570 224.4141445084293309 5454.913856201751 +1571 0.1571 223.8692721600865809 5442.533110653150 +1572 0.1572 223.3256364102334430 5430.181886409500 +1573 0.1573 222.7832343107793065 5417.860102673149 +1574 0.1574 222.2420629217002102 5405.567678908949 +1575 0.1575 221.7021193110126376 5393.304534842720 +1576 0.1576 221.1634005547474828 5381.070590460540 +1577 0.1577 220.6259037369240730 5368.865766007410 +1578 0.1578 220.0896259495243612 5356.689981986810 +1579 0.1579 219.5545642924670631 5344.543159159199 +1580 0.1580 219.0207158735820485 5332.425218541221 +1581 0.1581 218.4880778085847624 5320.336081404710 +1582 0.1582 217.9566472210507300 5308.275669275990 +1583 0.1583 217.4264212423902052 5296.243903934369 +1584 0.1584 216.8973970118229033 5284.240707411530 +1585 0.1585 216.3695716763527912 5272.266001990571 +1586 0.1586 215.8429423907430191 5260.319710205060 +1587 0.1587 215.3175063174908814 5248.401754837681 +1588 0.1588 214.7932606268030042 5236.512058920070 +1589 0.1589 214.2702024965704481 5224.650545730980 +1590 0.1590 213.7483291123440949 5212.817138796050 +1591 0.1591 213.2276376673099776 5201.011761886501 +1592 0.1592 212.7081253622647523 5189.234339018270 +1593 0.1593 212.1897894055912843 5177.484794451270 +1594 0.1594 211.6726270132343188 5165.763052688009 +1595 0.1595 211.1566354086762658 5154.069038473269 +1596 0.1596 210.6418118229129561 5142.402676792671 +1597 0.1597 210.1281534944297107 5130.763892872210 +1598 0.1598 209.6156576691772671 5119.152612176850 +1599 0.1599 209.1043216005479053 5107.568760410109 +1600 0.1600 208.5941425493517443 5096.012263512929 +1601 0.1601 208.0851177837929527 5084.483047662709 +1602 0.1602 207.5772445794461873 5072.981039272519 +1603 0.1603 207.0705202192330603 5061.506164990230 +1604 0.1604 206.5649419933986621 5050.058351697620 +1605 0.1605 206.0605071994883133 5038.637526509450 +1606 0.1606 205.5572131423242013 5027.243616772599 +1607 0.1607 205.0550571339823023 5015.876550065229 +1608 0.1608 204.5540364937692459 5004.536254195810 +1609 0.1609 204.0541485481993220 4993.222657202509 +1610 0.1610 203.5553906309716012 4981.935687351910 +1611 0.1611 203.0577600829470839 4970.675273138680 +1612 0.1612 202.5612542521259343 4959.441343284300 +1613 0.1613 202.0658704936249137 4948.233826736239 +1614 0.1614 201.5716061696547285 4937.052652667590 +1615 0.1615 201.0784586494975770 4925.897750475539 +1616 0.1616 200.5864253094847527 4914.769049780871 +1617 0.1617 200.0955035329743339 4903.666480427401 +1618 0.1618 199.6056907103289291 4892.589972480499 +1619 0.1619 199.1169842388935649 4881.539456226800 +1620 0.1620 198.6293815229735458 4870.514862173310 +1621 0.1621 198.1428799738125690 4859.516121046340 +1622 0.1622 197.6574770095707265 4848.543163790740 +1623 0.1623 197.1731700553027054 4837.595921569431 +1624 0.1624 196.6899565429361303 4826.674325762159 +1625 0.1625 196.2078339112497645 4815.778307964980 +1626 0.1626 195.7267996058520509 4804.907799989151 +1627 0.1627 195.2468510791595691 4794.062733860760 +1628 0.1628 194.7679857903755476 4783.243041819589 +1629 0.1629 194.2902012054686338 4772.448656318510 +1630 0.1630 193.8134947971515771 4761.679510022349 +1631 0.1631 193.3378640448600834 4750.935535807780 +1632 0.1632 192.8633064347316122 4740.216666761830 +1633 0.1633 192.3898194595844586 4729.522836181499 +1634 0.1634 191.9174006188967496 4718.853977572900 +1635 0.1635 191.4460474187855823 4708.210024650440 +1636 0.1636 190.9757573719862478 4697.590911336110 +1637 0.1637 190.5065279978315118 4686.996571758690 +1638 0.1638 190.0383568222309236 4676.426940252991 +1639 0.1639 189.5712413776503240 4665.881951359080 +1640 0.1640 189.1051792030912964 4655.361539821560 +1641 0.1641 188.6401678440707883 4644.865640588810 +1642 0.1642 188.1762048526007334 4634.394188812180 +1643 0.1643 187.7132877871678716 4623.947119845340 +1644 0.1644 187.2514142127134278 4613.524369243430 +1645 0.1645 186.7905817006131315 4603.125872762470 +1646 0.1646 186.3307878286570940 4592.751566358411 +1647 0.1647 185.8720301810298565 4582.401386186611 +1648 0.1648 185.4143063482904665 4572.075268600970 +1649 0.1649 184.9576139273527531 4561.773150153261 +1650 0.1650 184.5019505214654600 4551.494967592381 +1651 0.1651 184.0473137401926635 4541.240657863670 +1652 0.1652 183.5937011993940757 4531.010158108121 +1653 0.1653 183.1411105212055759 4520.803405661751 +1654 0.1654 182.6895393340197415 4510.620338054810 +1655 0.1655 182.2389852724664365 4500.460893011120 +1656 0.1656 181.7894459773935125 4490.325008447349 +1657 0.1657 181.3409190958475392 4480.212622472350 +1658 0.1658 180.8934022810545912 4470.123673386410 +1659 0.1659 180.4468931924012338 4460.058099680541 +1660 0.1660 180.0013894954154239 4450.015840035830 +1661 0.1661 179.5568888617474954 4439.996833322770 +1662 0.1662 179.1133889691513446 4430.001018600471 +1663 0.1663 178.6708875014655291 4420.028335116101 +1664 0.1664 178.2293821485945102 4410.078722304109 +1665 0.1665 177.7888706064900362 4400.152119785551 +1666 0.1666 177.3493505771323839 4390.248467367490 +1667 0.1667 176.9108197685118853 4380.367705042250 +1668 0.1668 176.4732758946104241 4370.509772986770 +1669 0.1669 176.0367166753829906 4360.674611561921 +1670 0.1670 175.6011398367392928 4350.862161311900 +1671 0.1671 175.1665431105255379 4341.072362963420 +1672 0.1672 174.7329242345061004 4331.305157425240 +1673 0.1673 174.3002809523454744 4321.560485787380 +1674 0.1674 173.8686110135900833 4311.838289320530 +1675 0.1675 173.4379121736502896 4302.138509475340 +1676 0.1676 173.0081821937824316 4292.461087881839 +1677 0.1677 172.5794188410709182 4282.805966348710 +1678 0.1678 172.1516198884103517 4273.173086862720 +1679 0.1679 171.7247831144878205 4263.562391588060 +1680 0.1680 171.2989063037651363 4253.973822865679 +1681 0.1681 170.8739872464612120 4244.407323212660 +1682 0.1682 170.4500237385344974 4234.862835321600 +1683 0.1683 170.0270135816654147 4225.340302059981 +1684 0.1684 169.6049545832389356 4215.839666469529 +1685 0.1685 169.1838445563271875 4206.360871765591 +1686 0.1686 168.7636813196720880 4196.903861336550 +1687 0.1687 168.3444626976680922 4187.468578743099 +1688 0.1688 167.9261865203450554 4178.054967717769 +1689 0.1689 167.5088506233509520 4168.662972164210 +1690 0.1690 167.0924528479349078 4159.292536156611 +1691 0.1691 166.6769910409301190 4149.943603939110 +1692 0.1692 166.2624630547369122 4140.616119925121 +1693 0.1693 165.8488667473058058 4131.310028696840 +1694 0.1694 165.4361999821207405 4122.025275004539 +1695 0.1695 165.0244606281822257 4112.761803766020 +1696 0.1696 164.6136465599906273 4103.519560066001 +1697 0.1697 164.2037556575295412 4094.298489155510 +1698 0.1698 163.7947858062491946 4085.098536451349 +1699 0.1699 163.3867348970498483 4075.919647535429 +1700 0.1700 162.9796008262653686 4066.761768154220 +1701 0.1701 162.5733814956467427 4057.624844218180 +1702 0.1702 162.1680748123457647 4048.508821801159 +1703 0.1703 161.7636786888987217 4039.413647139790 +1704 0.1704 161.3601910432100794 4030.339266632960 +1705 0.1705 160.9576097985363674 4021.285626841210 +1706 0.1706 160.5559328834700068 4012.252674486170 +1707 0.1707 160.1551582319231954 4003.240356449961 +1708 0.1708 159.7552837831119632 3994.248619774669 +1709 0.1709 159.3563074815401421 3985.277411661781 +1710 0.1710 158.9582272769834788 3976.326679471521 +1711 0.1711 158.5610411244737747 3967.396370722479 +1712 0.1712 158.1647469842831129 3958.486433090861 +1713 0.1713 157.7693428219080829 3949.596814410011 +1714 0.1714 157.3748266080540930 3940.727462669931 +1715 0.1715 156.9811963186197659 3931.878326016581 +1716 0.1716 156.5884499346813641 3923.049352751440 +1717 0.1717 156.1965854424772431 3914.240491330900 +1718 0.1718 155.8056008333924183 3905.451690365770 +1719 0.1719 155.4154941039431037 3896.682898620699 +1720 0.1720 155.0262632557613927 3887.934065013640 +1721 0.1721 154.6379062955799384 3879.205138615311 +1722 0.1722 154.2504212352167485 3870.496068648671 +1723 0.1723 153.8638060915598942 3861.806804488350 +1724 0.1724 153.4780588865524749 3853.137295660171 +1725 0.1725 153.0931776471774413 3844.487491840599 +1726 0.1726 152.7091604054426170 3835.857342856160 +1727 0.1727 152.3260051983656638 3827.246798683030 +1728 0.1728 151.9437100679591879 3818.655809446399 +1729 0.1729 151.5622730612158762 3810.084325419959 +1730 0.1730 151.1816922300936028 3801.532297025521 +1731 0.1731 150.8019656315007069 3792.999674832300 +1732 0.1732 150.4230913272812700 3784.486409556550 +1733 0.1733 150.0450673842003937 3775.992452060989 +1734 0.1734 149.6678918739296194 3767.517753354280 +1735 0.1735 149.2915628730323760 3759.062264590530 +1736 0.1736 148.9160784629494003 3750.625937068831 +1737 0.1737 148.5414367299843263 3742.208722232690 +1738 0.1738 148.1676357652892193 3733.810571669561 +1739 0.1739 147.7946736648502224 3725.431437110340 +1740 0.1740 147.4225485294732607 3717.071270428841 +1741 0.1741 147.0512584647697452 3708.730023641320 +1742 0.1742 146.6808015811423900 3700.407648906009 +1743 0.1743 146.3111759937709735 3692.104098522590 +1744 0.1744 145.9423798225982694 3683.819324931700 +1745 0.1745 145.5744111923159494 3675.553280714420 +1746 0.1746 145.2072682323506285 3667.305918591880 +1747 0.1747 144.8409490768497960 3659.077191424691 +1748 0.1748 144.4754518646679458 3650.867052212450 +1749 0.1749 144.1107747393526495 3642.675454093350 +1750 0.1750 143.7469158491308008 3634.502350343610 +1751 0.1751 143.3838733468947737 3626.347694377030 +1752 0.1752 143.0216453901886950 3618.211439744550 +1753 0.1753 142.6602301411947735 3610.093540133709 +1754 0.1754 142.2996257667196858 3601.993949368260 +1755 0.1755 141.9398304381809055 3593.912621407590 +1756 0.1756 141.5808423315932032 3585.849510346351 +1757 0.1757 141.2226596275552026 3577.804570413939 +1758 0.1758 140.8652805112357953 3569.777755974070 +1759 0.1759 140.5087031723608675 3561.769021524281 +1760 0.1760 140.1529258051998852 3553.778321695479 +1761 0.1761 139.7979466085525360 3545.805611251530 +1762 0.1762 139.4437637857355128 3537.850845088679 +1763 0.1763 139.0903755445693264 3529.913978235241 +1764 0.1764 138.7377800973650039 3521.994965851080 +1765 0.1765 138.3859756609111002 3514.093763227120 +1766 0.1766 138.0349604564604817 3506.210325785000 +1767 0.1767 137.6847327097173945 3498.344609076509 +1768 0.1768 137.3352906508244189 3490.496568783230 +1769 0.1769 136.9866325143494521 3482.666160716040 +1770 0.1770 136.6387565392729186 3474.853340814690 +1771 0.1771 136.2916609689748100 3467.058065147369 +1772 0.1772 135.9453440512219231 3459.280289910291 +1773 0.1773 135.5998040381550425 3451.519971427169 +1774 0.1774 135.2550391862762353 3443.777066148869 +1775 0.1775 134.9110477564361474 3436.051530652951 +1776 0.1776 134.5678280138213267 3428.343321643200 +1777 0.1777 134.2253782279416896 3420.652395949271 +1778 0.1778 133.8836966726179298 3412.978710526200 +1779 0.1779 133.5427816259689280 3405.322222453970 +1780 0.1780 133.2026313703993594 3397.682888937121 +1781 0.1781 132.8632441925872740 3390.060667304339 +1782 0.1782 132.5246183834716476 3382.455515007980 +1783 0.1783 132.1867522382400750 3374.867389623720 +1784 0.1784 131.8496440563163787 3367.296248850040 +1785 0.1785 131.5132921413484723 3359.742050507920 +1786 0.1786 131.1776948011960542 3352.204752540340 +1787 0.1787 130.8428503479184428 3344.684313011900 +1788 0.1788 130.5087570977624409 3337.180690108410 +1789 0.1789 130.1754133711501993 3329.693842136480 +1790 0.1790 129.8428174926672227 3322.223727523100 +1791 0.1791 129.5109677910503194 3314.770304815240 +1792 0.1792 129.1798625991755785 3307.333532679430 +1793 0.1793 128.8495002540465464 3299.913369901399 +1794 0.1794 128.5198790967822049 3292.509775385600 +1795 0.1795 128.1909974726051757 3285.122708154910 +1796 0.1796 127.8628537308299116 3277.752127350120 +1797 0.1797 127.5354462248509293 3270.397992229629 +1798 0.1798 127.2087733121310009 3263.060262168970 +1799 0.1799 126.8828333541895290 3255.738896660499 +1800 0.1800 126.5576247165908512 3248.433855312930 +1801 0.1801 126.2331457689326584 3241.145097850980 +1802 0.1802 125.9093948848343558 3233.872584114980 +1803 0.1803 125.5863704419255811 3226.616274060450 +1804 0.1804 125.2640708218346646 3219.376127757760 +1805 0.1805 124.9424944101771899 3212.152105391730 +1806 0.1806 124.6216395965445400 3204.944167261229 +1807 0.1807 124.3015047744925425 3197.752273778819 +1808 0.1808 123.9820883415300870 3190.576385470320 +1809 0.1809 123.6633886991078413 3183.416462974510 +1810 0.1810 123.3454042526069827 3176.272467042701 +1811 0.1811 123.0281334113279286 3169.144358538339 +1812 0.1812 122.7115745884791806 3162.032098436720 +1813 0.1813 122.3957262011661271 3154.935647824470 +1814 0.1814 122.0805866703799438 3147.854967899310 +1815 0.1815 121.7661544209864957 3140.790019969631 +1816 0.1816 121.4524278817153089 3133.740765454140 +1817 0.1817 121.1394054851485294 3126.707165881420 +1818 0.1818 120.8270856677099800 3119.689182889690 +1819 0.1819 120.5154668696541762 3112.686778226321 +1820 0.1820 120.2045475350554824 3105.699913747560 +1821 0.1821 119.8943261117971986 3098.728551418110 +1822 0.1822 119.5848010515607598 3091.772653310780 +1823 0.1823 119.2759708098149076 3084.832181606181 +1824 0.1824 118.9678338458049893 3077.907098592290 +1825 0.1825 118.6603886225421718 3070.997366664110 +1826 0.1826 118.3536336067927977 3064.102948323370 +1827 0.1827 118.0475672690677271 3057.223806178110 +1828 0.1828 117.7421880836117083 3050.359902942340 +1829 0.1829 117.4374945283928042 3043.511201435750 +1830 0.1830 117.1334850850918485 3036.677664583240 +1831 0.1831 116.8301582390919577 3029.859255414690 +1832 0.1832 116.5275124794680011 3023.055937064560 +1833 0.1833 116.2255462989761980 3016.267672771500 +1834 0.1834 115.9242581940437162 3009.494425878120 +1835 0.1835 115.6236466647582830 3002.736159830560 +1836 0.1836 115.3237102148578543 2995.992838178140 +1837 0.1837 115.0244473517202977 2989.264424573060 +1838 0.1838 114.7258565863531459 2982.550882770071 +1839 0.1839 114.4279364333833371 2975.852176626080 +1840 0.1840 114.1306854110470397 2969.168270099880 +1841 0.1841 113.8341020411794631 2962.499127251780 +1842 0.1842 113.5381848492047112 2955.844712243230 +1843 0.1843 113.2429323641257213 2949.204989336600 +1844 0.1844 112.9483431185141598 2942.579922894720 +1845 0.1845 112.6544156485003896 2935.969477380610 +1846 0.1846 112.3611484937634941 2929.373617357230 +1847 0.1847 112.0685401975212869 2922.792307486970 +1848 0.1848 111.7765893065203642 2916.225512531480 +1849 0.1849 111.4852943710262281 2909.673197351280 +1850 0.1850 111.1946539448133962 2903.135326905450 +1851 0.1851 110.9046665851555531 2896.611866251300 +1852 0.1852 110.6153308528157879 2890.102780544060 +1853 0.1853 110.3266453120367601 2883.608035036510 +1854 0.1854 110.0386085305309933 2877.127595078790 +1855 0.1855 109.7512190794711557 2870.661426117889 +1856 0.1856 109.4644755334803818 2864.209493697500 +1857 0.1857 109.1783764706226236 2857.771763457630 +1858 0.1858 108.8929204723930297 2851.348201134260 +1859 0.1859 108.6081061237083674 2844.938772559110 +1860 0.1860 108.3239320128974441 2838.543443659270 +1861 0.1861 108.0403967316916436 2832.162180456870 +1862 0.1862 107.7574988752153615 2825.794949068820 +1863 0.1863 107.4752370419765981 2819.441715706490 +1864 0.1864 107.1936098338575079 2813.102446675401 +1865 0.1865 106.9126158561049920 2806.777108374909 +1866 0.1866 106.6322537173213476 2800.465667297860 +1867 0.1867 106.3525220294549314 2794.168090030390 +1868 0.1868 106.0734194077908370 2787.884343251540 +1869 0.1869 105.7949444709416156 2781.614393732970 +1870 0.1870 105.5170958408380386 2775.358208338680 +1871 0.1871 105.2398721427198751 2769.115754024680 +1872 0.1872 104.9632720051267114 2762.886997838690 +1873 0.1873 104.6872940598887851 2756.671906919920 +1874 0.1874 104.4119369421178618 2750.470448498661 +1875 0.1875 104.1371992901981258 2744.282589896070 +1876 0.1876 103.8630797457771280 2738.108298523810 +1877 0.1877 103.5895769537567475 2731.947541883849 +1878 0.1878 103.3166895622841537 2725.800287568090 +1879 0.1879 103.0444162227428393 2719.666503258110 +1880 0.1880 102.7727555897436957 2713.546156724860 +1881 0.1881 102.5017063211160320 2707.439215828390 +1882 0.1882 102.2312670778987354 2701.345648517550 +1883 0.1883 101.9614365243313756 2695.265422829731 +1884 0.1884 101.6922133278453657 2689.198506890520 +1885 0.1885 101.4235961590551653 2683.144868913480 +1886 0.1886 101.1555836917494986 2677.104477199850 +1887 0.1887 100.8881746028826001 2671.077300138209 +1888 0.1888 100.6213675725654753 2665.063306204300 +1889 0.1889 100.3551612840572318 2659.062463960649 +1890 0.1890 100.0895544237563826 2653.074742056330 +1891 0.1891 99.8245456811922338 2647.100109226680 +1892 0.1892 99.5601337490162450 2641.138534293060 +1893 0.1893 99.2963173229934597 2635.189986162520 +1894 0.1894 99.0330951019939505 2629.254433827550 +1895 0.1895 98.7704657879842784 2623.331846365800 +1896 0.1896 98.5084280860189949 2617.422192939830 +1897 0.1897 98.2469807042321577 2611.525442796809 +1898 0.1898 97.9861223538289039 2605.641565268280 +1899 0.1899 97.7258517490769947 2599.770529769840 +1900 0.1900 97.4661676072984591 2593.912305800910 +1901 0.1901 97.2070686488611955 2588.066862944441 +1902 0.1902 96.9485535971706440 2582.234170866680 +1903 0.1903 96.6906211786614591 2576.414199316890 +1904 0.1904 96.4332701227892670 2570.606918127070 +1905 0.1905 96.1764991620223242 2564.812297211710 +1906 0.1906 95.9203070318333602 2559.030306567520 +1907 0.1907 95.6646924706913211 2553.260916273150 +1908 0.1908 95.4096542200532127 2547.504096488980 +1909 0.1909 95.1551910243559291 2541.759817456799 +1910 0.1910 94.9013016310081099 2536.028049499610 +1911 0.1911 94.6479847903820684 2530.308763021299 +1912 0.1912 94.3952392558056772 2524.601928506450 +1913 0.1913 94.1430637835543536 2518.907516520039 +1914 0.1914 93.8914571328429872 2513.225497707181 +1915 0.1915 93.6404180658179826 2507.555842792930 +1916 0.1916 93.3899453475492436 2501.898522581930 +1917 0.1917 93.1400377460222302 2496.253507958260 +1918 0.1918 92.8906940321300567 2490.620769885160 +1919 0.1919 92.6419129796655625 2485.000279404680 +1920 0.1920 92.3936933653134531 2479.392007637610 +1921 0.1921 92.1460339686424135 2473.795925783050 +1922 0.1922 91.8989335720973486 2468.212005118289 +1923 0.1923 91.6523909609915108 2462.640216998519 +1924 0.1924 91.4064049234987550 2457.080532856550 +1925 0.1925 91.1609742506457934 2451.532924202640 +1926 0.1926 90.9160977363044509 2445.997362624190 +1927 0.1927 90.6717741771839627 2440.473819785500 +1928 0.1928 90.4280023728233147 2434.962267427580 +1929 0.1929 90.1847811255835410 2429.462677367860 +1930 0.1930 89.9421092406401499 2423.975021499960 +1931 0.1931 89.6999855259754781 2418.499271793490 +1932 0.1932 89.4584087923711166 2413.035400293730 +1933 0.1933 89.2173778534003645 2407.583379121440 +1934 0.1934 88.9768915254206547 2402.143180472660 +1935 0.1935 88.7369486275661075 2396.714776618411 +1936 0.1936 88.4975479817399560 2391.298139904490 +1937 0.1937 88.2586884126071709 2385.893242751200 +1938 0.1938 88.0203687475869572 2380.500057653190 +1939 0.1939 87.7825878168453357 2375.118557179160 +1940 0.1940 87.5453444532877967 2369.748713971610 +1941 0.1941 87.3086374925518811 2364.390500746710 +1942 0.1942 87.0724657729998484 2359.043890293950 +1943 0.1943 86.8368281357113574 2353.708855475989 +1944 0.1944 86.6017234244761340 2348.385369228400 +1945 0.1945 86.3671504857867376 2343.073404559430 +1946 0.1946 86.1331081688312707 2337.772934549810 +1947 0.1947 85.8995953254861604 2332.483932352500 +1948 0.1948 85.6666108103089101 2327.206371192440 +1949 0.1949 85.4341534805309664 2321.940224366391 +1950 0.1950 85.2022221960505135 2316.685465242660 +1951 0.1951 84.9708158194253400 2311.442067260899 +1952 0.1952 84.7399332158657046 2306.210003931870 +1953 0.1953 84.5095732532272450 2300.989248837200 +1954 0.1954 84.2797348020039294 2295.779775629250 +1955 0.1955 84.0504167353209226 2290.581558030800 +1956 0.1956 83.8216179289276369 2285.394569834841 +1957 0.1957 83.5933372611906691 2280.218784904430 +1958 0.1958 83.3655736130868235 2275.054177172399 +1959 0.1959 83.1383258681961479 2269.900720641151 +1960 0.1960 82.9115929126949709 2264.758389382460 +1961 0.1961 82.6853736353489808 2259.627157537280 +1962 0.1962 82.4596669275063476 2254.506999315459 +1963 0.1963 82.2344716830907885 2249.397888995601 +1964 0.1964 82.0097867985947744 2244.299800924810 +1965 0.1965 81.7856111730726099 2239.212709518470 +1966 0.1966 81.5619437081336827 2234.136589260070 +1967 0.1967 81.3387833079356284 2229.071414700979 +1968 0.1968 81.1161288791775661 2224.017160460240 +1969 0.1969 80.8939793310933339 2218.973801224321 +1970 0.1970 80.6723335754447675 2213.941311746950 +1971 0.1971 80.4511905265149778 2208.919666848930 +1972 0.1972 80.2305491011016443 2203.908841417850 +1973 0.1973 80.0104082185103493 2198.908810407979 +1974 0.1974 79.7907668005479564 2193.919548839950 +1975 0.1975 79.5716237715159309 2188.941031800650 +1976 0.1976 79.3529780582037461 2183.973234442990 +1977 0.1977 79.1348285898823178 2179.016131985690 +1978 0.1978 78.9171742982973825 2174.069699713040 +1979 0.1979 78.7000141176629882 2169.133912974770 +1980 0.1980 78.4833469846549576 2164.208747185820 +1981 0.1981 78.2671718384043658 2159.294177826130 +1982 0.1982 78.0514876204910308 2154.390180440430 +1983 0.1983 77.8362932749371055 2149.496730638090 +1984 0.1984 77.6215877482005538 2144.613804092850 +1985 0.1985 77.4073699891687710 2139.741376542700 +1986 0.1986 77.1936389491521595 2134.879423789610 +1987 0.1987 76.9803935818777063 2130.027921699400 +1988 0.1988 76.7676328434826587 2125.186846201490 +1989 0.1989 76.5553556925081438 2120.356173288740 +1990 0.1990 76.3435610898928445 2115.535879017270 +1991 0.1991 76.1322479989666761 2110.725939506170 +1992 0.1992 75.9214153854444902 2105.926330937450 +1993 0.1993 75.7110622174198369 2101.137029555740 +1994 0.1994 75.5011874653586403 2096.358011668151 +1995 0.1995 75.2917901020930316 2091.589253644080 +1996 0.1996 75.0828691028150814 2086.830731914940 +1997 0.1997 74.8744234450706330 2082.082422974159 +1998 0.1998 74.6664521087530915 2077.344303376750 +1999 0.1999 74.4589540760972852 2072.616349739330 +2000 0.2000 74.2519283316733265 2067.898538739800 +2001 0.2001 74.0453738623804725 2063.190847117250 +2002 0.2002 73.8392896574410287 2058.493251671680 +2003 0.2003 73.6336747083942527 2053.805729263900 +2004 0.2004 73.4285280090903001 2049.128256815280 +2005 0.2005 73.2238485556841567 2044.460811307630 +2006 0.2006 73.0196353466296273 2039.803369782940 +2007 0.2007 72.8158873826733100 2035.155909343291 +2008 0.2008 72.6126036668486137 2030.518407150560 +2009 0.2009 72.4097832044697611 2025.890840426360 +2010 0.2010 72.2074250031258487 2021.273186451750 +2011 0.2011 72.0055280726749061 2016.665422567120 +2012 0.2012 71.8040914252379565 2012.067526172010 +2013 0.2013 71.6031140751931048 2007.479474724910 +2014 0.2014 71.4025950391697108 2002.901245743060 +2015 0.2015 71.2025333360424355 1998.332816802340 +2016 0.2016 71.0029279869254708 1993.774165537020 +2017 0.2017 70.8037780151666425 1989.225269639620 +2018 0.2018 70.6050824463416262 1984.686106860770 +2019 0.2019 70.4068403082481353 1980.156655008950 +2020 0.2020 70.2090506309001654 1975.636891950359 +2021 0.2021 70.0117124465222105 1971.126795608780 +2022 0.2022 69.8148247895435077 1966.626343965349 +2023 0.2023 69.6183866965923244 1962.135515058400 +2024 0.2024 69.4223972064902455 1957.654286983280 +2025 0.2025 69.2268553602464749 1953.182637892230 +2026 0.2026 69.0317602010521512 1948.720545994140 +2027 0.2027 68.8371107742747199 1944.267989554441 +2028 0.2028 68.6429061274522496 1939.824946894900 +2029 0.2029 68.4491453102878324 1935.391396393450 +2030 0.2030 68.2558273746439568 1930.967316484050 +2031 0.2031 68.0629513745369366 1926.552685656480 +2032 0.2032 67.8705163661312980 1922.147482456220 +2033 0.2033 67.6785214077342800 1917.751685484201 +2034 0.2034 67.4869655597902351 1913.365273396750 +2035 0.2035 67.2958478848751298 1908.988224905329 +2036 0.2036 67.1051674476910449 1904.620518776450 +2037 0.2037 66.9149233150606477 1900.262133831420 +2038 0.2038 66.7251145559217633 1895.913048946230 +2039 0.2039 66.5357402413218750 1891.573243051420 +2040 0.2040 66.3467994444127100 1887.242695131870 +2041 0.2041 66.1582912404447825 1882.921384226630 +2042 0.2042 65.9702147067620075 1878.609289428800 +2043 0.2043 65.7825689227963011 1874.306389885330 +2044 0.2044 65.5953529700621942 1870.012664796890 +2045 0.2045 65.4085659321514612 1865.728093417700 +2046 0.2046 65.2222068947278046 1861.452655055360 +2047 0.2047 65.0362749455214981 1857.186329070670 +2048 0.2048 64.8507691743240855 1852.929094877540 +2049 0.2049 64.6656886729830660 1848.680931942790 +2050 0.2050 64.4810325353966221 1844.441819785970 +2051 0.2051 64.2967998575083612 1840.211737979240 +2052 0.2052 64.1129897373020441 1835.990666147170 +2053 0.2053 63.9296012747963474 1831.778583966690 +2054 0.2054 63.7466335720396700 1827.575471166790 +2055 0.2055 63.5640857331049105 1823.381307528440 +2056 0.2056 63.3819568640842661 1819.196072884470 +2057 0.2057 63.2002460730840738 1815.019747119340 +2058 0.2058 63.0189524702196522 1810.852310169060 +2059 0.2059 62.8380751676101497 1806.693742020960 +2060 0.2060 62.6576132793734217 1802.544022713600 +2061 0.2061 62.4775659216209149 1798.403132336600 +2062 0.2062 62.2979322124525581 1794.271051030480 +2063 0.2063 62.1187112719517103 1790.147758986520 +2064 0.2064 61.9399022221800521 1786.033236446610 +2065 0.2065 61.7615041871725694 1781.927463703069 +2066 0.2066 61.5835162929324866 1777.830421098570 +2067 0.2067 61.4059376674262651 1773.742089025900 +2068 0.2068 61.2287674405785722 1769.662447927890 +2069 0.2069 61.0520047442673146 1765.591478297210 +2070 0.2070 60.8756487123186432 1761.529160676270 +2071 0.2071 60.6996984805019792 1757.475475657031 +2072 0.2072 60.5241531865250835 1753.430403880880 +2073 0.2073 60.3490119700291174 1749.393926038480 +2074 0.2074 60.1742739725837126 1745.366022869630 +2075 0.2075 59.9999383376820745 1741.346675163140 +2076 0.2076 59.8260042107360874 1737.335863756630 +2077 0.2077 59.6524707390714326 1733.333569536440 +2078 0.2078 59.4793370719227354 1729.339773437480 +2079 0.2079 59.3066023604287125 1725.354456443019 +2080 0.2080 59.1342657576273254 1721.377599584690 +2081 0.2081 58.9623264184509850 1717.409183942170 +2082 0.2082 58.7907834997217194 1713.449190643180 +2083 0.2083 58.6196361601463991 1709.497600863270 +2084 0.2084 58.4488835603119483 1705.554395825720 +2085 0.2085 58.2785248626805981 1701.619556801340 +2086 0.2086 58.1085592315851116 1697.693065108420 +2087 0.2087 57.9389858332240664 1693.774902112510 +2088 0.2088 57.7698038356571288 1689.865049226310 +2089 0.2089 57.6010124088003366 1685.963487909580 +2090 0.2090 57.4326107244214157 1682.070199668890 +2091 0.2091 57.2645979561350913 1678.185166057619 +2092 0.2092 57.0969732793984264 1674.308368675700 +2093 0.2093 56.9297358715061605 1670.439789169570 +2094 0.2094 56.7628849115860845 1666.579409231970 +2095 0.2095 56.5964195805943930 1662.727210601880 +2096 0.2096 56.4303390613110878 1658.883175064290 +2097 0.2097 56.2646425383353659 1655.047284450170 +2098 0.2098 56.0993291980810440 1651.219520636250 +2099 0.2099 55.9343982287719825 1647.399865544950 +2100 0.2100 55.7698488204375238 1643.588301144200 +2101 0.2101 55.6056801649079446 1639.784809447350 +2102 0.2102 55.4418914558099303 1635.989372512980 +2103 0.2103 55.2784818885620410 1632.201972444840 +2104 0.2104 55.1154506603702146 1628.422591391670 +2105 0.2105 54.9527969702232753 1624.651211547090 +2106 0.2106 54.7905200188884507 1620.887815149420 +2107 0.2107 54.6286190089068953 1617.132384481650 +2108 0.2108 54.4670931445892492 1613.384901871230 +2109 0.2109 54.3059416320111907 1609.645349689960 +2110 0.2110 54.1451636790090021 1605.913710353870 +2111 0.2111 53.9847584951751571 1602.189966323080 +2112 0.2112 53.8247252918539161 1598.474100101690 +2113 0.2113 53.6650632821369484 1594.766094237660 +2114 0.2114 53.5057716808589348 1591.065931322630 +2115 0.2115 53.3468497045932111 1587.373593991830 +2116 0.2116 53.1882965716474203 1583.689064924010 +2117 0.2117 53.0301115020591638 1580.012326841190 +2118 0.2118 52.8722937175916741 1576.343362508650 +2119 0.2119 52.7148424417295018 1572.682154734740 +2120 0.2120 52.5577568996742244 1569.028686370760 +2121 0.2121 52.4010363183401395 1565.382940310900 +2122 0.2122 52.2446799263499955 1561.744899492000 +2123 0.2123 52.0886869540307202 1558.114546893550 +2124 0.2124 51.9330566334091657 1554.491865537500 +2125 0.2125 51.7777881982078867 1550.876838488120 +2126 0.2126 51.6228808838408852 1547.269448851930 +2127 0.2127 51.4683339274094109 1543.669679777559 +2128 0.2128 51.3141465676977475 1540.077514455640 +2129 0.2129 51.1603180451690349 1536.492936118620 +2130 0.2130 51.0068476019610699 1532.915928040730 +2131 0.2131 50.8537344818821424 1529.346473537810 +2132 0.2132 50.7009779304068928 1525.784555967220 +2133 0.2133 50.5485771946721485 1522.230158727680 +2134 0.2134 50.3965315234728024 1518.683265259210 +2135 0.2135 50.2448401672576921 1515.143859042960 +2136 0.2136 50.0935023781254856 1511.611923601110 +2137 0.2137 49.9425174098205886 1508.087442496770 +2138 0.2138 49.7918845177290592 1504.570399333830 +2139 0.2139 49.6416029588745218 1501.060777756860 +2140 0.2140 49.4916719919141244 1497.558561451030 +2141 0.2141 49.3420908771344742 1494.063734141910 +2142 0.2142 49.1928588764476089 1490.576279595410 +2143 0.2143 49.0439752533869537 1487.096181617720 +2144 0.2144 48.8954392731033138 1483.623424055030 +2145 0.2145 48.7472502023608811 1480.157990793590 +2146 0.2146 48.5994073095332269 1476.699865759530 +2147 0.2147 48.4519098645993154 1473.249032918700 +2148 0.2148 48.3047571391395465 1469.805476276610 +2149 0.2149 48.1579484063317977 1466.369179878320 +2150 0.2150 48.0114829409474666 1462.940127808310 +2151 0.2151 47.8653600193475341 1459.518304190340 +2152 0.2152 47.7195789194786428 1456.103693187420 +2153 0.2153 47.5741389208691956 1452.696279001590 +2154 0.2154 47.4290393046254195 1449.296045873910 +2155 0.2155 47.2842793534275074 1445.902978084300 +2156 0.2156 47.1398583515257243 1442.517059951409 +2157 0.2157 46.9957755847365277 1439.138275832550 +2158 0.2158 46.8520303404387235 1435.766610123570 +2159 0.2159 46.7086219075696079 1432.402047258730 +2160 0.2160 46.5655495766211374 1429.044571710610 +2161 0.2161 46.4228126396361063 1425.694167990030 +2162 0.2162 46.2804103902043096 1422.350820645870 +2163 0.2163 46.1383421234587630 1419.014514265030 +2164 0.2164 45.9966071360719013 1415.685233472250 +2165 0.2165 45.8552047262517846 1412.362962930120 +2166 0.2166 45.7141341937383388 1409.047687338840 +2167 0.2167 45.5733948397995832 1405.739391436210 +2168 0.2168 45.4329859672278999 1402.438059997470 +2169 0.2169 45.2929068803362682 1399.143677835210 +2170 0.2170 45.1531568849545408 1395.856229799290 +2171 0.2171 45.0137352884257425 1392.575700776680 +2172 0.2172 44.8746413996023392 1389.302075691400 +2173 0.2173 44.7358745288425439 1386.035339504440 +2174 0.2174 44.5974339880066424 1382.775477213560 +2175 0.2175 44.4593190904532989 1379.522473853270 +2176 0.2176 44.3215291510359037 1376.276314494700 +2177 0.2177 44.1840634860988928 1373.036984245530 +2178 0.2178 44.0469214134741236 1369.804468249810 +2179 0.2179 43.9101022524772375 1366.578751687940 +2180 0.2180 43.7736053239040146 1363.359819776480 +2181 0.2181 43.6374299500267853 1360.147657768170 +2182 0.2182 43.5015754545907924 1356.942250951690 +2183 0.2183 43.3660411628106246 1353.743584651690 +2184 0.2184 43.2308264013666133 1350.551644228590 +2185 0.2185 43.0959304984012590 1347.366415078520 +2186 0.2186 42.9613527835156717 1344.187882633210 +2187 0.2187 42.8270925877660176 1341.016032359920 +2188 0.2188 42.6931492436599598 1337.850849761300 +2189 0.2189 42.5595220851531266 1334.692320375330 +2190 0.2190 42.4262104476456017 1331.540429775150 +2191 0.2191 42.2932136679783923 1328.395163569060 +2192 0.2192 42.1605310844299197 1325.256507400350 +2193 0.2193 42.0281620367125441 1322.124446947230 +2194 0.2194 41.8961058659690480 1318.998967922740 +2195 0.2195 41.7643619147691822 1315.880056074600 +2196 0.2196 41.6329295271061923 1312.767697185190 +2197 0.2197 41.5018080483933645 1309.661877071410 +2198 0.2198 41.3709968254605656 1306.562581584590 +2199 0.2199 41.2404952065508184 1303.469796610370 +2200 0.2200 41.1103025413168695 1300.383508068660 +2201 0.2201 40.9804181808177574 1297.303701913520 +2202 0.2202 40.8508414775154307 1294.230364133010 +2203 0.2203 40.7215717852713226 1291.163480749180 +2204 0.2204 40.5926084593429692 1288.103037817930 +2205 0.2205 40.4639508563806274 1285.049021428940 +2206 0.2206 40.3355983344239064 1282.001417705530 +2207 0.2207 40.2075502528984003 1278.960212804620 +2208 0.2208 40.0798059726123412 1275.925392916600 +2209 0.2209 39.9523648557532454 1272.896944265270 +2210 0.2210 39.8252262658845950 1269.874853107700 +2211 0.2211 39.6983895679424990 1266.859105734210 +2212 0.2212 39.5718541282323812 1263.849688468180 +2213 0.2213 39.4456193144256702 1260.846587666050 +2214 0.2214 39.3196844955565084 1257.849789717161 +2215 0.2215 39.1940490420184631 1254.859281043730 +2216 0.2216 39.0687123255612434 1251.875048100720 +2217 0.2217 38.9436737192874247 1248.897077375690 +2218 0.2218 38.8189325976491943 1245.925355388850 +2219 0.2219 38.6944883364451115 1242.959868692830 +2220 0.2220 38.5703403128168389 1240.000603872670 +2221 0.2221 38.4464879052459167 1237.047547545710 +2222 0.2222 38.3229304935505581 1234.100686361479 +2223 0.2223 38.1996674588824021 1231.160007001660 +2224 0.2224 38.0766981837233232 1228.225496179940 +2225 0.2225 37.9540220518822267 1225.297140641950 +2226 0.2226 37.8316384484918729 1222.374927165190 +2227 0.2227 37.7095467600056651 1219.458842558920 +2228 0.2228 37.5877463741945164 1216.548873664090 +2229 0.2229 37.4662366801436519 1213.645007353211 +2230 0.2230 37.3450170682494758 1210.747230530340 +2231 0.2231 37.2240869302164157 1207.855530130930 +2232 0.2232 37.1034456590537829 1204.969893121779 +2233 0.2233 36.9830926490726526 1202.090306500890 +2234 0.2234 36.8630272958827305 1199.216757297490 +2235 0.2235 36.7432489963892621 1196.349232571840 +2236 0.2236 36.6237571487899132 1193.487719415200 +2237 0.2237 36.5045511525716648 1190.632204949740 +2238 0.2238 36.3856304085077582 1187.782676328450 +2239 0.2239 36.2669943186545822 1184.939120735030 +2240 0.2240 36.1486422863486396 1182.101525383860 +2241 0.2241 36.0305737162034561 1179.269877519880 +2242 0.2242 35.9127880141065390 1176.444164418510 +2243 0.2243 35.7952845872163365 1173.624373385579 +2244 0.2244 35.6780628439591965 1170.810491757210 +2245 0.2245 35.5611221940263462 1168.002506899780 +2246 0.2246 35.4444620483708661 1165.200406209810 +2247 0.2247 35.3280818192046837 1162.404177113870 +2248 0.2248 35.2119809199955611 1159.613807068580 +2249 0.2249 35.0961587654641107 1156.829283560390 +2250 0.2250 34.9806147715808109 1154.050594105600 +2251 0.2251 34.8653483555630146 1151.277726250260 +2252 0.2252 34.7503589358719935 1148.510667570090 +2253 0.2253 34.6356459322099681 1145.749405670350 +2254 0.2254 34.5212087655171587 1142.993928185840 +2255 0.2255 34.4070468579688296 1140.244222780760 +2256 0.2256 34.2931596329723618 1137.500277148630 +2257 0.2257 34.1795465151643185 1134.762079012280 +2258 0.2258 34.0662069304075175 1132.029616123670 +2259 0.2259 33.9531403057881391 1129.302876263850 +2260 0.2260 33.8403460696127993 1126.581847242970 +2261 0.2261 33.7278236514056502 1123.866516900020 +2262 0.2262 33.6155724819055024 1121.156873102930 +2263 0.2263 33.5035919930629404 1118.452903748370 +2264 0.2264 33.3918816180374378 1115.754596761720 +2265 0.2265 33.2804407911945006 1113.061940097020 +2266 0.2266 33.1692689481028111 1110.374921736830 +2267 0.2267 33.0583655255313573 1107.693529692190 +2268 0.2268 32.9477299614466190 1105.017752002540 +2269 0.2269 32.8373616950097116 1102.347576735650 +2270 0.2270 32.7272601665735507 1099.682991987500 +2271 0.2271 32.6174248176800603 1097.023985882260 +2272 0.2272 32.5078550910573369 1094.370546572190 +2273 0.2273 32.3985504306168508 1091.722662237560 +2274 0.2274 32.2895102814506458 1089.080321086580 +2275 0.2275 32.1807340898285545 1086.443511355300 +2276 0.2276 32.0722213031954126 1083.812221307600 +2277 0.2277 31.9639713701682808 1081.186439235030 +2278 0.2278 31.8559837405336879 1078.566153456809 +2279 0.2279 31.7482578652448630 1075.951352319700 +2280 0.2280 31.6407931964189792 1073.342024197960 +2281 0.2281 31.5335891873344174 1070.738157493251 +2282 0.2282 31.4266452924280237 1068.139740634600 +2283 0.2283 31.3199609672923813 1065.546762078270 +2284 0.2284 31.2135356686730816 1062.959210307740 +2285 0.2285 31.1073688544660136 1060.377073833610 +2286 0.2286 31.0014599837146569 1057.800341193500 +2287 0.2287 30.8958085166073815 1055.229000952020 +2288 0.2288 30.7904139144747475 1052.663041700690 +2289 0.2289 30.6852756397868198 1050.102452057880 +2290 0.2290 30.5803931561504960 1047.547220668630 +2291 0.2291 30.4757659283068243 1044.997336204780 +2292 0.2292 30.3713934221283495 1042.452787364710 +2293 0.2293 30.2672751046164450 1039.913562873360 +2294 0.2294 30.1634104438986697 1037.379651482140 +2295 0.2295 30.0597989092261209 1034.851041968870 +2296 0.2296 29.9564399709707914 1032.327723137691 +2297 0.2297 29.8533331006229581 1029.809683818990 +2298 0.2298 29.7504777707885388 1027.296912869380 +2299 0.2299 29.6478734551864918 1024.789399171560 +2300 0.2300 29.5455196286462005 1022.287131634270 +2301 0.2301 29.4434157671048737 1019.790099192260 +2302 0.2302 29.3415613476049515 1017.298290806190 +2303 0.2303 29.2399558482915154 1014.811695462510 +2304 0.2304 29.1385987484097164 1012.330302173490 +2305 0.2305 29.0374895283021885 1009.854099977090 +2306 0.2306 28.9366276694064872 1007.383077936910 +2307 0.2307 28.8360126542525386 1004.917225142080 +2308 0.2308 28.7356439664600707 1002.456530707280 +2309 0.2309 28.6355210907360771 1000.000983772580 +2310 0.2310 28.5356435128722765 997.550573503410 +2311 0.2311 28.4360107197425798 995.105289090520 +2312 0.2312 28.3366221993005603 992.665119749870 +2313 0.2313 28.2374774405769351 990.230054722600 +2314 0.2314 28.1385759336770604 987.800083274879 +2315 0.2315 28.0399171697784197 985.375194697970 +2316 0.2316 27.9415006411281155 982.955378308080 +2317 0.2317 27.8433258410403965 980.540623446280 +2318 0.2318 27.7453922638941570 978.130919478490 +2319 0.2319 27.6476994051304636 975.726255795390 +2320 0.2320 27.5502467612500759 973.326621812340 +2321 0.2321 27.4530338298109911 970.932006969360 +2322 0.2322 27.3560601094259752 968.542400730980 +2323 0.2323 27.2593250997601118 966.157792586280 +2324 0.2324 27.1628283015283607 963.778172048740 +2325 0.2325 27.0665692164931109 961.403528656240 +2326 0.2326 26.9705473474617534 959.033851970940 +2327 0.2327 26.8747621982842446 956.669131579230 +2328 0.2328 26.7792132738506972 954.309357091710 +2329 0.2329 26.6839000800889572 951.954518143060 +2330 0.2330 26.5888221239622027 949.604604392030 +2331 0.2331 26.4939789134665347 947.259605521330 +2332 0.2332 26.3993699576285863 944.919511237620 +2333 0.2333 26.3049947665031354 942.584311271400 +2334 0.2334 26.2108528511707171 940.253995376960 +2335 0.2335 26.1169437237352540 937.928553332320 +2336 0.2336 26.0232668973216796 935.607974939200 +2337 0.2337 25.9298218860735759 933.292250022880 +2338 0.2338 25.8366082051508208 930.981368432230 +2339 0.2339 25.7436253707272300 928.675320039570 +2340 0.2340 25.6508728999882187 926.374094740640 +2341 0.2341 25.5583503111284571 924.077682454570 +2342 0.2342 25.4660571233495396 921.786073123760 +2343 0.2343 25.3739928568576580 919.499256713850 +2344 0.2344 25.2821570328612815 917.217223213650 +2345 0.2345 25.1905491735688436 914.939962635100 +2346 0.2346 25.0991688021864299 912.667465013180 +2347 0.2347 25.0080154429154788 910.399720405870 +2348 0.2348 24.9170886209504800 908.136718894079 +2349 0.2349 24.8263878624766967 905.878450581580 +2350 0.2350 24.7359126946678707 903.624905594960 +2351 0.2351 24.6456626456839452 901.376074083570 +2352 0.2352 24.5556372446687945 899.131946219450 +2353 0.2353 24.4658360217479611 896.892512197250 +2354 0.2354 24.3762585080263854 894.657762234230 +2355 0.2355 24.2869042355861673 892.427686570130 +2356 0.2356 24.1977727374843035 890.202275467170 +2357 0.2357 24.1088635477504454 887.981519209960 +2358 0.2358 24.0201762013846754 885.765408105430 +2359 0.2359 23.9317102343552648 883.553932482811 +2360 0.2360 23.8434651835964466 881.347082693560 +2361 0.2361 23.7554405870062055 879.144849111251 +2362 0.2362 23.6676359834440611 876.947222131630 +2363 0.2363 23.5800509127288578 874.754192172440 +2364 0.2364 23.4926849156365627 872.565749673440 +2365 0.2365 23.4055375338980767 870.381885096300 +2366 0.2366 23.3186083101970318 868.202588924580 +2367 0.2367 23.2318967881676208 866.027851663670 +2368 0.2368 23.1454025123924048 863.857663840680 +2369 0.2369 23.0591250284001461 861.692016004461 +2370 0.2370 22.9730638826636486 859.530898725520 +2371 0.2371 22.8872186225975760 857.374302595900 +2372 0.2372 22.8015887965563202 855.222218229250 +2373 0.2373 22.7161739538318272 853.074636260631 +2374 0.2374 22.6309736446514655 850.931547346600 +2375 0.2375 22.5459874201758872 848.792942164990 +2376 0.2376 22.4612148324968857 846.658811415040 +2377 0.2377 22.3766554346352748 844.529145817200 +2378 0.2378 22.2923087805387610 842.403936113100 +2379 0.2379 22.2081744250798288 840.283173065560 +2380 0.2380 22.1242519240536275 838.166847458450 +2381 0.2381 22.0405408341758680 836.054950096720 +2382 0.2382 21.9570407130807190 833.947471806290 +2383 0.2383 21.8737511193187046 831.844403433980 +2384 0.2384 21.7906716123546289 829.745735847500 +2385 0.2385 21.7078017525654836 827.651459935400 +2386 0.2386 21.6251411012383663 825.561566606970 +2387 0.2387 21.5426892205684091 823.476046792200 +2388 0.2388 21.4604456736567109 821.394891441780 +2389 0.2389 21.3784100245082733 819.318091526970 +2390 0.2390 21.2965818380299439 817.245638039620 +2391 0.2391 21.2149606800283621 815.177521992010 +2392 0.2392 21.1335461172079135 813.113734416930 +2393 0.2393 21.0523377171686903 811.054266367530 +2394 0.2394 20.9713350484044483 808.999108917320 +2395 0.2395 20.8905376803005787 806.948253160090 +2396 0.2396 20.8099451831320827 804.901690209840 +2397 0.2397 20.7295571280615505 802.859411200790 +2398 0.2398 20.6493730871371461 800.821407287290 +2399 0.2399 20.5693926332905974 798.787669643710 +2400 0.2400 20.4896153403351846 796.758189464540 +2401 0.2401 20.4100407829637511 794.732957964150 +2402 0.2402 20.3306685367466962 792.711966376920 +2403 0.2403 20.2514981781299994 790.695205957040 +2404 0.2404 20.1725292844332209 788.682667978550 +2405 0.2405 20.0937614338475292 786.674343735270 +2406 0.2406 20.0151942054337297 784.670224540700 +2407 0.2407 19.9368271791202929 782.670301728050 +2408 0.2408 19.8586599357013824 780.674566650130 +2409 0.2409 19.7806920568349085 778.683010679330 +2410 0.2410 19.7029231250405665 776.695625207530 +2411 0.2411 19.6253527236978833 774.712401646120 +2412 0.2412 19.5479804370442842 772.733331425870 +2413 0.2413 19.4708058501731429 770.758405996950 +2414 0.2414 19.3938285490318556 768.787616828800 +2415 0.2415 19.3170481204199049 766.820955410200 +2416 0.2416 19.2404641519869415 764.858413249100 +2417 0.2417 19.1640762322308547 762.899981872610 +2418 0.2418 19.0878839504958755 760.945652827000 +2419 0.2419 19.0118868969706440 758.995417677600 +2420 0.2420 18.9360846626863264 757.049268008750 +2421 0.2421 18.8604768395146998 755.107195423770 +2422 0.2422 18.7850630201662661 753.169191544930 +2423 0.2423 18.7098427981883511 751.235248013340 +2424 0.2424 18.6348157679632358 749.305356488980 +2425 0.2425 18.5599815247062594 747.379508650560 +2426 0.2426 18.4853396644639538 745.457696195580 +2427 0.2427 18.4108897841121646 743.539910840190 +2428 0.2428 18.3366314813541962 741.626144319200 +2429 0.2429 18.2625643547189362 739.716388385990 +2430 0.2430 18.1886880035590117 737.810634812490 +2431 0.2431 18.1150020280489308 735.908875389150 +2432 0.2432 18.0415060291832319 734.011101924840 +2433 0.2433 17.9681996087746469 732.117306246830 +2434 0.2434 17.8950823694522647 730.227480200780 +2435 0.2435 17.8221539146596939 728.341615650610 +2436 0.2436 17.7494138486532371 726.459704478550 +2437 0.2437 17.6768617765000577 724.581738585020 +2438 0.2438 17.6044973040763750 722.707709888610 +2439 0.2439 17.5323200380656417 720.837610326040 +2440 0.2440 17.4603295859567353 718.971431852090 +2441 0.2441 17.3885255560421506 717.109166439620 +2442 0.2442 17.3169075574161972 715.250806079420 +2443 0.2443 17.2454751999732139 713.396342780230 +2444 0.2444 17.1742280944057661 711.545768568730 +2445 0.2445 17.1031658522028600 709.699075489380 +2446 0.2446 17.0322880856481653 707.856255604500 +2447 0.2447 16.9615944078182324 706.017300994150 +2448 0.2448 16.8910844325807190 704.182203756100 +2449 0.2449 16.8207577745926251 702.350956005770 +2450 0.2450 16.7506140492985232 700.523549876250 +2451 0.2451 16.6806528729287997 698.699977518190 +2452 0.2452 16.6108738624979040 696.880231099750 +2453 0.2453 16.5412766358025856 695.064302806620 +2454 0.2454 16.4718608114201608 693.252184841910 +2455 0.2455 16.4026260087067577 691.443869426150 +2456 0.2456 16.3335718477955893 689.639348797210 +2457 0.2457 16.2646979495952131 687.838615210280 +2458 0.2458 16.1960039357878074 686.041660937860 +2459 0.2459 16.1274894288274346 684.248478269600 +2460 0.2460 16.0591540519383322 682.459059512420 +2461 0.2461 15.9909974291131949 680.673396990310 +2462 0.2462 15.9230191851114586 678.891483044400 +2463 0.2463 15.8552189454575956 677.113310032860 +2464 0.2464 15.7875963364394085 675.338870330880 +2465 0.2465 15.7201509851063328 673.568156330620 +2466 0.2466 15.6528825192677452 671.801160441140 +2467 0.2467 15.5857905674912676 670.037875088410 +2468 0.2468 15.5188747591010845 668.278292715250 +2469 0.2469 15.4521347241762594 666.522405781250 +2470 0.2470 15.3855700935490578 664.770206762770 +2471 0.2471 15.3191804988032736 663.021688152900 +2472 0.2472 15.2529655722725614 661.276842461360 +2473 0.2473 15.1869249470387651 659.535662214560 +2474 0.2474 15.1210582569302634 657.798139955460 +2475 0.2475 15.0553651365203116 656.064268243560 +2476 0.2476 14.9898452211253890 654.334039654890 +2477 0.2477 14.9244981468035469 652.607446781950 +2478 0.2478 14.8593235503527676 650.884482233630 +2479 0.2479 14.7943210693093228 649.165138635250 +2480 0.2480 14.7294903419461392 647.449408628420 +2481 0.2481 14.6648310072711645 645.737284871080 +2482 0.2482 14.6003427050257386 644.028760037420 +2483 0.2483 14.5360250756829732 642.323826817880 +2484 0.2484 14.4718777604461284 640.622477919010 +2485 0.2485 14.4079004012469998 638.924706063560 +2486 0.2486 14.3440926407443037 637.230503990370 +2487 0.2487 14.2804541223220696 635.539864454300 +2488 0.2488 14.2169844900880413 633.852780226260 +2489 0.2489 14.1536833888720714 632.169244093140 +2490 0.2490 14.0905504642245276 630.489248857750 +2491 0.2491 14.0275853624146993 628.812787338820 +2492 0.2492 13.9647877304292134 627.139852370890 +2493 0.2493 13.9021572159704494 625.470436804380 +2494 0.2494 13.8396934674549588 623.804533505440 +2495 0.2495 13.7773961340118856 622.142135356010 +2496 0.2496 13.7152648654814016 620.483235253680 +2497 0.2497 13.6532993124131306 618.827826111730 +2498 0.2498 13.5914991260645923 617.175900859050 +2499 0.2499 13.5298639583996341 615.527452440120 +2500 0.2500 13.4683934620868797 613.882473814980 +2501 0.2501 13.4070872904981719 612.240957959160 +2502 0.2502 13.3459450977070322 610.602897863640 +2503 0.2503 13.2849665384871063 608.968286534880 +2504 0.2504 13.2241512683106279 607.337116994670 +2505 0.2505 13.1634989433468856 605.709382280190 +2506 0.2506 13.1030092204606774 604.085075443960 +2507 0.2507 13.0426817572107936 602.464189553710 +2508 0.2508 12.9825162118484858 600.846717692450 +2509 0.2509 12.9225122433159427 599.232652958410 +2510 0.2510 12.8626695112447749 597.621988464940 +2511 0.2511 12.8029876759545012 596.014717340550 +2512 0.2512 12.7434663984510337 594.410832728810 +2513 0.2513 12.6841053404251749 592.810327788370 +2514 0.2514 12.6249041642511131 591.213195692870 +2515 0.2515 12.5658625329849230 589.619429630940 +2516 0.2516 12.5069801103630684 588.029022806150 +2517 0.2517 12.4482565608009121 586.441968436980 +2518 0.2518 12.3896915493912250 584.858259756750 +2519 0.2519 12.3312847419027065 583.277890013630 +2520 0.2520 12.2730358047784947 581.700852470590 +2521 0.2521 12.2149444051346983 580.127140405340 +2522 0.2522 12.1570102107589140 578.556747110330 +2523 0.2523 12.0992328901087642 576.989665892650 +2524 0.2524 12.0416121123104265 575.425890074090 +2525 0.2525 11.9841475471571712 573.865412991020 +2526 0.2526 11.9268388651079000 572.308227994400 +2527 0.2527 11.8696857372856943 570.754328449710 +2528 0.2528 11.8126878354763605 569.203707736960 +2529 0.2529 11.7558448321269822 567.656359250610 +2530 0.2530 11.6991564003444743 566.112276399550 +2531 0.2531 11.6426222138941426 564.571452607090 +2532 0.2532 11.5862419471982445 563.033881310880 +2533 0.2533 11.5300152753345557 561.499555962900 +2534 0.2534 11.4739418740349404 559.968470029420 +2535 0.2535 11.4180214196839209 558.440616990970 +2536 0.2536 11.3622535893172572 556.915990342300 +2537 0.2537 11.3066380606205250 555.394583592350 +2538 0.2538 11.2511745119276974 553.876390264200 +2539 0.2539 11.1958626222197335 552.361403895070 +2540 0.2540 11.1407020711231688 550.849618036220 +2541 0.2541 11.0856925389087078 549.341026252990 +2542 0.2542 11.0308337064898225 547.835622124730 +2543 0.2543 10.9761252554213478 546.333399244780 +2544 0.2544 10.9215668678980897 544.834351220370 +2545 0.2545 10.8671582267534355 543.338471672720 +2546 0.2546 10.8128990154579583 541.845754236840 +2547 0.2547 10.7587889181180323 540.356192561670 +2548 0.2548 10.7048276194744538 538.869780309900 +2549 0.2549 10.6510148049010596 537.386511158000 +2550 0.2550 10.5973501604033498 535.906378796190 +2551 0.2551 10.5438333726171205 534.429376928410 +2552 0.2552 10.4904641288070870 532.955499272260 +2553 0.2553 10.4372421168655247 531.484739558970 +2554 0.2554 10.3841670253109069 530.017091533400 +2555 0.2555 10.3312385432865383 528.552548953980 +2556 0.2556 10.2784563605592059 527.091105592670 +2557 0.2557 10.2258201675178260 525.632755234930 +2558 0.2558 10.1733296551720933 524.177491679720 +2559 0.2559 10.1209845151511360 522.725308739430 +2560 0.2560 10.0687844397021724 521.276200239850 +2561 0.2561 10.0167291216891723 519.830160020160 +2562 0.2562 9.9648182545915205 518.387181932880 +2563 0.2563 9.9130515325026831 516.947259843850 +2564 0.2564 9.8614286501288824 515.510387632170 +2565 0.2565 9.8099493027877642 514.076559190200 +2566 0.2566 9.7586131864070786 512.645768423510 +2567 0.2567 9.7074199975233597 511.218009250870 +2568 0.2568 9.6563694332806076 509.793275604170 +2569 0.2569 9.6054611914289758 508.371561428450 +2570 0.2570 9.5546949703234620 506.952860681810 +2571 0.2571 9.5040704689226008 505.537167335420 +2572 0.2572 9.4535873867871558 504.124475373480 +2573 0.2573 9.4032454240788237 502.714778793160 +2574 0.2574 9.3530442815589367 501.308071604590 +2575 0.2575 9.3029836605871630 499.904347830880 +2576 0.2576 9.2530632631202199 498.503601507970 +2577 0.2577 9.2032827917105848 497.105826684720 +2578 0.2578 9.1536419495052090 495.711017422780 +2579 0.2579 9.1041404402442385 494.319167796630 +2580 0.2580 9.0547779682597298 492.930271893530 +2581 0.2581 9.0055542384743816 491.544323813450 +2582 0.2582 8.9564689564002542 490.161317669110 +2583 0.2583 8.9075218281375044 488.781247585900 +2584 0.2584 8.8587125603731174 487.404107701840 +2585 0.2585 8.8100408603796456 486.029892167580 +2586 0.2586 8.7615064360139474 484.658595146380 +2587 0.2587 8.7131089957159258 483.290210814040 +2588 0.2588 8.6648482485072797 481.924733358870 +2589 0.2589 8.6167239039902501 480.562156981720 +2590 0.2590 8.5687356723463708 479.202475895880 +2591 0.2591 8.5208832643352235 477.845684327070 +2592 0.2592 8.4731663912931978 476.491776513440 +2593 0.2593 8.4255847651322497 475.140746705530 +2594 0.2594 8.3781380983386633 473.792589166190 +2595 0.2595 8.3308261039718232 472.447298170610 +2596 0.2596 8.2836484956629786 471.104868006270 +2597 0.2597 8.2366049876140206 469.765292972900 +2598 0.2598 8.1896952945962518 468.428567382470 +2599 0.2599 8.1429191319491707 467.094685559140 +2600 0.2600 8.0962762155792500 465.763641839260 +2601 0.2601 8.0497662619587214 464.435430571310 +2602 0.2602 8.0033889881243621 463.110046115870 +2603 0.2603 7.9571441116762873 461.787482845620 +2604 0.2604 7.9110313507767414 460.467735145300 +2605 0.2605 7.8650504241488948 459.150797411640 +2606 0.2606 7.8192010510756411 457.836664053430 +2607 0.2607 7.7734829513984005 456.525329491380 +2608 0.2608 7.7278958455159250 455.216788158130 +2609 0.2609 7.6824394543831049 453.911034498270 +2610 0.2610 7.6371134995097787 452.608062968260 +2611 0.2611 7.5919177029595462 451.307868036390 +2612 0.2612 7.5468517873485865 450.010444182810 +2613 0.2613 7.5019154758444744 448.715785899430 +2614 0.2614 7.4571084921650046 447.423887689970 +2615 0.2615 7.4124305605770129 446.134744069870 +2616 0.2616 7.3678814058952060 444.848349566270 +2617 0.2617 7.3234607534809921 443.564698718010 +2618 0.2618 7.2791683292413119 442.283786075590 +2619 0.2619 7.2350038596274757 441.005606201140 +2620 0.2620 7.1909670716340006 439.730153668360 +2621 0.2621 7.1470576927974534 438.457423062580 +2622 0.2622 7.1032754511952936 437.187408980610 +2623 0.2623 7.0596200754447214 435.920106030840 +2624 0.2624 7.0160912947015239 434.655508833110 +2625 0.2625 6.9726888386589305 433.393612018750 +2626 0.2626 6.9294124375464685 432.134410230490 +2627 0.2627 6.8862618221288185 430.877898122510 +2628 0.2628 6.8432367237046767 429.624070360330 +2629 0.2629 6.8003368741056160 428.372921620880 +2630 0.2630 6.7575620056949548 427.124446592350 +2631 0.2631 6.7149118513666224 425.878639974300 +2632 0.2632 6.6723861445440322 424.635496477510 +2633 0.2633 6.6299846191789555 423.395010824030 +2634 0.2634 6.5877070097503978 422.157177747120 +2635 0.2635 6.5455530512634796 420.921991991250 +2636 0.2636 6.5035224792483151 419.689448312050 +2637 0.2637 6.4616150297588995 418.459541476260 +2638 0.2638 6.4198304393719967 417.232266261800 +2639 0.2639 6.3781684451860263 416.007617457610 +2640 0.2640 6.3366287848199585 414.785589863740 +2641 0.2641 6.2952111964122093 413.566178291250 +2642 0.2642 6.2539154186195374 412.349377562190 +2643 0.2643 6.2127411906159455 411.135182509650 +2644 0.2644 6.1716882520915819 409.923587977630 +2645 0.2645 6.1307563432516474 408.714588821060 +2646 0.2646 6.0899452048153044 407.508179905800 +2647 0.2647 6.0492545780145850 406.304356108590 +2648 0.2648 6.0086842045933055 405.103112316990 +2649 0.2649 5.9682338268059842 403.904443429430 +2650 0.2650 5.9279031874167574 402.708344355100 +2651 0.2651 5.8876920296983020 401.514810014000 +2652 0.2652 5.8476000974307585 400.323835336870 +2653 0.2653 5.8076271349006570 399.135415265160 +2654 0.2654 5.7677728868998468 397.949544751050 +2655 0.2655 5.7280370987244256 396.766218757370 +2656 0.2656 5.6884195161736759 395.585432257620 +2657 0.2657 5.6489198855490006 394.407180235890 +2658 0.2658 5.6095379536528602 393.231457686910 +2659 0.2659 5.5702734677877164 392.058259615970 +2660 0.2660 5.5311261757549737 390.887581038890 +2661 0.2661 5.4920958258539265 389.719416982050 +2662 0.2662 5.4531821668807083 388.553762482310 +2663 0.2663 5.4143849481272435 387.390612586990 +2664 0.2664 5.3757039193801992 386.229962353900 +2665 0.2665 5.3371388309199421 385.071806851240 +2666 0.2666 5.2986894335194989 383.916141157630 +2667 0.2667 5.2603554784435138 382.762960362070 +2668 0.2668 5.2221367174472162 381.612259563890 +2669 0.2669 5.1840329027753835 380.464033872760 +2670 0.2670 5.1460437871613118 379.318278408680 +2671 0.2671 5.1081691238257836 378.174988301890 +2672 0.2672 5.0704086664760446 377.034158692890 +2673 0.2673 5.0327621693047773 375.895784732450 +2674 0.2674 4.9952293869890800 374.759861581500 +2675 0.2675 4.9578100746894451 373.626384411190 +2676 0.2676 4.9205039880487460 372.495348402800 +2677 0.2677 4.8833108831912169 371.366748747780 +2678 0.2678 4.8462305167214454 370.240580647650 +2679 0.2679 4.8092626457233605 369.116839314050 +2680 0.2680 4.7724070277592245 367.995519968670 +2681 0.2681 4.7356634208686277 366.876617843270 +2682 0.2682 4.6990315835674865 365.760128179560 +2683 0.2683 4.6625112748470423 364.646046229320 +2684 0.2684 4.6261022541728627 363.534367254270 +2685 0.2685 4.5898042814838460 362.425086526060 +2686 0.2686 4.5536171171912292 361.318199326280 +2687 0.2687 4.5175405221775939 360.213700946430 +2688 0.2688 4.4815742577958781 359.111586687890 +2689 0.2689 4.4457180858683909 358.011851861850 +2690 0.2690 4.4099717686858284 356.914491789400 +2691 0.2691 4.3743350690062890 355.819501801390 +2692 0.2692 4.3388077500542961 354.726877238470 +2693 0.2693 4.3033895755198195 353.636613451060 +2694 0.2694 4.2680803095573019 352.548705799300 +2695 0.2695 4.2328797167846828 351.463149653080 +2696 0.2696 4.1977875622824312 350.379940391950 +2697 0.2697 4.1628036115925768 349.299073405140 +2698 0.2698 4.1279276307177417 348.220544091570 +2699 0.2699 4.0931593861201776 347.144347859720 +2700 0.2700 4.0584986447208049 346.070480127730 +2701 0.2701 4.0239451738982535 344.998936323290 +2702 0.2702 3.9894987414879051 343.929711883680 +2703 0.2703 3.9551591157809360 342.862802255700 +2704 0.2704 3.9209260655233686 341.798202895650 +2705 0.2705 3.8867993599151189 340.735909269340 +2706 0.2706 3.8527787686090482 339.675916852070 +2707 0.2707 3.8188640617100167 338.618221128560 +2708 0.2708 3.7850550097739406 337.562817592960 +2709 0.2709 3.7513513838068500 336.509701748850 +2710 0.2710 3.7177529552639488 335.458869109170 +2711 0.2711 3.6842594960486794 334.410315196220 +2712 0.2712 3.6508707785117842 333.364035541680 +2713 0.2713 3.6175865754503760 332.320025686480 +2714 0.2714 3.5844066601070055 331.278281180930 +2715 0.2715 3.5513308061687319 330.238797584540 +2716 0.2716 3.5183587877661990 329.201570466120 +2717 0.2717 3.4854903794727079 328.166595403700 +2718 0.2718 3.4527253563032980 327.133867984500 +2719 0.2719 3.4200634937138239 326.103383804980 +2720 0.2720 3.3875045676000388 325.075138470720 +2721 0.2721 3.3550483542966791 324.049127596470 +2722 0.2722 3.3226946305765512 323.025346806090 +2723 0.2723 3.2904431736496176 322.003791732580 +2724 0.2724 3.2582937611620890 320.984458017990 +2725 0.2725 3.2262461711955175 319.967341313440 +2726 0.2726 3.1943001822658905 318.952437279100 +2727 0.2727 3.1624555733227275 317.939741584160 +2728 0.2728 3.1307121237481792 316.929249906810 +2729 0.2729 3.0990696133561277 315.920957934220 +2730 0.2730 3.0675278223912912 314.914861362510 +2731 0.2731 3.0360865315283285 313.910955896740 +2732 0.2732 3.0047455218709467 312.909237250900 +2733 0.2733 2.9735045749510074 311.909701147890 +2734 0.2734 2.9423634727276413 310.912343319430 +2735 0.2735 2.9113219975863620 309.917159506160 +2736 0.2736 2.8803799323381787 308.924145457510 +2737 0.2737 2.8495370602187151 307.933296931760 +2738 0.2738 2.8187931648873286 306.944609695970 +2739 0.2739 2.7881480304262327 305.958079525950 +2740 0.2740 2.7576014413396197 304.973702206310 +2741 0.2741 2.7271531825527853 303.991473530380 +2742 0.2742 2.6968030394112574 303.011389300180 +2743 0.2743 2.6665507976799261 302.033445326450 +2744 0.2744 2.6363962435421739 301.057637428590 +2745 0.2745 2.6063391635990110 300.083961434670 +2746 0.2746 2.5763793448682084 299.112413181380 +2747 0.2747 2.5465165747834377 298.142988514030 +2748 0.2748 2.5167506411934095 297.175683286530 +2749 0.2749 2.4870813323610150 296.210493361360 +2750 0.2750 2.4575084369624691 295.247414609560 +2751 0.2751 2.4280317440864563 294.286442910700 +2752 0.2752 2.3986510432332784 293.327574152860 +2753 0.2753 2.3693661243140034 292.370804232640 +2754 0.2754 2.3401767776496163 291.416129055100 +2755 0.2755 2.3110827939701735 290.463544533760 +2756 0.2756 2.2820839644139568 289.513046590570 +2757 0.2757 2.2531800805266320 288.564631155930 +2758 0.2758 2.2243709342604054 287.618294168600 +2759 0.2759 2.1956563179731865 286.674031575780 +2760 0.2760 2.1670360244277509 285.731839332930 +2761 0.2761 2.1385098467909058 284.791713403970 +2762 0.2762 2.1100775786326547 283.853649761050 +2763 0.2763 2.0817390139253673 282.917644384700 +2764 0.2764 2.0534939470429490 281.983693263670 +2765 0.2765 2.0253421727600149 281.051792395010 +2766 0.2766 1.9972834862510631 280.121937784030 +2767 0.2767 1.9693176830896497 279.194125444240 +2768 0.2768 1.9414445592475693 278.268351397370 +2769 0.2769 1.9136639110940332 277.344611673350 +2770 0.2770 1.8859755353948522 276.422902310270 +2771 0.2771 1.8583792293116197 275.503219354380 +2772 0.2772 1.8308747904008962 274.585558860090 +2773 0.2773 1.8034620166133981 273.669916889870 +2774 0.2774 1.7761407062931875 272.756289514340 +2775 0.2775 1.7489106581768621 271.844672812170 +2776 0.2776 1.7217716713927476 270.935062870120 +2777 0.2777 1.6947235454600926 270.027455782980 +2778 0.2778 1.6677660802882672 269.121847653530 +2779 0.2779 1.6408990761759596 268.218234592620 +2780 0.2780 1.6141223338103761 267.316612719050 +2781 0.2781 1.5874356542664436 266.416978159600 +2782 0.2782 1.5608388390060151 265.519327048970 +2783 0.2783 1.5343316898770731 264.623655529870 +2784 0.2784 1.5079140091129366 263.729959752860 +2785 0.2785 1.4815855993314726 262.838235876420 +2786 0.2786 1.4553462635343071 261.948480066890 +2787 0.2787 1.4291958051060361 261.060688498530 +2788 0.2788 1.4031340278134405 260.174857353380 +2789 0.2789 1.3771607358047051 259.290982821330 +2790 0.2790 1.3512757336086332 258.409061100110 +2791 0.2791 1.3254788261338686 257.529088395180 +2792 0.2792 1.2997698186681181 256.651060919830 +2793 0.2793 1.2741485168773732 255.774974895070 +2794 0.2794 1.2486147268051362 254.900826549670 +2795 0.2795 1.2231682548716467 254.028612120120 +2796 0.2796 1.1978089078731111 253.158327850590 +2797 0.2797 1.1725364929809337 252.289969992960 +2798 0.2798 1.1473508177409466 251.423534806780 +2799 0.2799 1.1222516900726460 250.559018559230 +2800 0.2800 1.0972389182684275 249.696417525140 +2801 0.2801 1.0723123109928225 248.835727986960 +2802 0.2802 1.0474716772817376 247.976946234740 +2803 0.2803 1.0227168265416966 247.120068566080 +2804 0.2804 0.9980475685490831 246.265091286190 +2805 0.2805 0.9734637134493825 245.412010707820 +2806 0.2806 0.9489650717564311 244.560823151210 +2807 0.2807 0.9245514543516621 243.711524944170 +2808 0.2808 0.9002226724833541 242.864112421990 +2809 0.2809 0.8759785377658841 242.018581927410 +2810 0.2810 0.8518188621789801 241.174929810670 +2811 0.2811 0.8277434580669750 240.333152429430 +2812 0.2812 0.8037521381380630 239.493246148810 +2813 0.2813 0.7798447154635565 238.655207341320 +2814 0.2814 0.7560210034771470 237.819032386870 +2815 0.2815 0.7322808159741655 236.984717672760 +2816 0.2816 0.7086239671108455 236.152259593640 +2817 0.2817 0.6850502714035875 235.321654551520 +2818 0.2818 0.6615595437282250 234.492898955730 +2819 0.2819 0.6381515993192930 233.665989222910 +2820 0.2820 0.6148262537692974 232.840921777000 +2821 0.2821 0.5915833230279854 232.017693049240 +2822 0.2822 0.5684226234016170 231.196299478130 +2823 0.2823 0.5453439715522415 230.376737509380 +2824 0.2824 0.5223471844969739 229.559003595970 +2825 0.2825 0.4994320796072704 228.743094198100 +2826 0.2826 0.4765984746082089 227.929005783130 +2827 0.2827 0.4538461875777699 227.116734825650 +2828 0.2828 0.4311750369461189 226.306277807370 +2829 0.2829 0.4085848414948899 225.497631217210 +2830 0.2830 0.3860754203564709 224.690791551170 +2831 0.2831 0.3636465930132919 223.885755312410 +2832 0.2832 0.3412981792971144 223.082519011140 +2833 0.2833 0.3190299993883209 222.281079164730 +2834 0.2834 0.2968418738152064 221.481432297560 +2835 0.2835 0.2747336234532739 220.683574941090 +2836 0.2836 0.2527050695245274 219.887503633840 +2837 0.2837 0.2307560335967704 219.093214921300 +2838 0.2838 0.2088863375829039 218.300705356030 +2839 0.2839 0.1870958037402259 217.509971497530 +2840 0.2840 0.1653842546697334 216.721009912320 +2841 0.2841 0.1437515133154249 215.933817173850 +2842 0.2842 0.1221974029636059 215.148389862530 +2843 0.2843 0.1007217472421934 214.364724565720 +2844 0.2844 0.0793243701200249 213.582817877650 +2845 0.2845 0.0580050959061689 212.802666399470 +2846 0.2846 0.0367637492492339 212.024266739230 +2847 0.2847 0.0156001551366809 211.247615511830 +2848 0.2848 -0.0054858611058626 210.472709339040 +2849 0.2849 -0.0264944738152871 209.699544849450 +2850 0.2850 -0.0474258569916836 208.928118678480 +2851 0.2851 -0.0682801842990256 208.158427468360 +2852 0.2852 -0.0890576290658491 207.390467868110 +2853 0.2853 -0.1097583642859311 206.624236533530 +2854 0.2854 -0.1303825626189666 205.859730127180 +2855 0.2855 -0.1509303963912441 205.096945318370 +2856 0.2856 -0.1714020375963201 204.335878783150 +2857 0.2857 -0.1917976578956906 203.576527204260 +2858 0.2858 -0.2121174286194616 202.818887271160 +2859 0.2859 -0.2323615207670207 202.062955680020 +2860 0.2860 -0.2525301050077037 201.308729133640 +2861 0.2861 -0.2726233516814607 200.556204341500 +2862 0.2862 -0.2926414307995222 199.805378019730 +2863 0.2863 -0.3125845120450627 199.056246891080 +2864 0.2864 -0.3324527647738617 198.308807684900 +2865 0.2865 -0.3522463580149652 197.563057137170 +2866 0.2866 -0.3719654604713447 196.818991990420 +2867 0.2867 -0.3916102405205542 196.076608993770 +2868 0.2868 -0.4111808662153872 195.335904902890 +2869 0.2869 -0.4306775052845312 194.596876479990 +2870 0.2870 -0.4501003251332217 193.859520493820 +2871 0.2871 -0.4694494928438937 193.123833719620 +2872 0.2872 -0.4887251751768317 192.389812939140 +2873 0.2873 -0.5079275385708182 191.657454940590 +2874 0.2874 -0.5270567491437816 190.926756518680 +2875 0.2875 -0.5461129726934446 190.197714474580 +2876 0.2876 -0.5650963746979656 189.470325615840 +2877 0.2877 -0.5840071203165831 188.744586756510 +2878 0.2878 -0.6028453743902591 188.020494717010 +2879 0.2879 -0.6216113014423176 187.298046324160 +2880 0.2880 -0.6403050656790841 186.577238411170 +2881 0.2881 -0.6589268309905236 185.858067817620 +2882 0.2882 -0.6774767609508762 185.140531389430 +2883 0.2883 -0.6959550188192917 184.424625978880 +2884 0.2884 -0.7143617675404647 183.710348444580 +2885 0.2885 -0.7326971697452647 182.997695651420 +2886 0.2886 -0.7509613877513667 182.286664470620 +2887 0.2887 -0.7691545835638822 181.577251779690 +2888 0.2888 -0.7872769188759863 180.869454462390 +2889 0.2889 -0.8053285550695418 180.163269408720 +2890 0.2890 -0.8233096532157268 179.458693514980 +2891 0.2891 -0.8412203740756588 178.755723683660 +2892 0.2892 -0.8590608781010147 178.054356823460 +2893 0.2893 -0.8768313254346527 177.354589849300 +2894 0.2894 -0.8945318759112327 176.656419682300 +2895 0.2895 -0.9121626890578337 175.959843249720 +2896 0.2896 -0.9297239240945707 175.264857485020 +2897 0.2897 -0.9472157399352102 174.571459327770 +2898 0.2898 -0.9646382951877848 173.879645723720 +2899 0.2899 -0.9819917481552047 173.189413624680 +2900 0.2900 -0.9992762568358702 172.500759988630 +2901 0.2901 -1.0164919789242817 171.813681779600 +2902 0.2902 -1.0336390718116477 171.128175967720 +2903 0.2903 -1.0507176925864932 170.444239529190 +2904 0.2904 -1.0677279980352652 169.761869446250 +2905 0.2905 -1.0846701446429377 169.081062707200 +2906 0.2906 -1.1015442885936146 168.401816306340 +2907 0.2907 -1.1183505857711322 167.724127244010 +2908 0.2908 -1.1350891917596602 167.047992526550 +2909 0.2909 -1.1517602618442997 166.373409166240 +2910 0.2910 -1.1683639510116828 165.700374181420 +2911 0.2911 -1.1849004139505703 165.028884596330 +2912 0.2912 -1.2013698050524444 164.358937441150 +2913 0.2913 -1.2177722784121043 163.690529752050 +2914 0.2914 -1.2341079878282608 163.023658571080 +2915 0.2915 -1.2503770868041253 162.358320946210 +2916 0.2916 -1.2665797285480014 161.694513931310 +2917 0.2917 -1.2827160659738734 161.032234586130 +2918 0.2918 -1.2987862517019944 160.371479976290 +2919 0.2919 -1.3147904380594719 159.712247173260 +2920 0.2920 -1.3307287770808549 159.054533254400 +2921 0.2921 -1.3466014205087165 158.398335302830 +2922 0.2922 -1.3624085197942351 157.743650407540 +2923 0.2923 -1.3781502260977780 157.090475663320 +2924 0.2924 -1.3938266902894816 156.438808170750 +2925 0.2925 -1.4094380629498280 155.788645036180 +2926 0.2926 -1.4249844943702239 155.139983371740 +2927 0.2927 -1.4404661345535770 154.492820295320 +2928 0.2928 -1.4558831332148705 153.847152930550 +2929 0.2929 -1.4712356397817381 153.202978406800 +2930 0.2930 -1.4865238033950336 152.560293859110 +2931 0.2931 -1.5017477729094051 151.919096428320 +2932 0.2932 -1.5169076968938646 151.279383260870 +2933 0.2933 -1.5320037236323547 150.641151508930 +2934 0.2934 -1.5470360011243187 150.004398330350 +2935 0.2935 -1.5620046770852647 149.369120888570 +2936 0.2936 -1.5769098989473311 148.735316352760 +2937 0.2937 -1.5917518138598532 148.102981897680 +2938 0.2938 -1.6065305686899232 147.472114703720 +2939 0.2939 -1.6212463100229513 146.842711956840 +2940 0.2940 -1.6358991841632253 146.214770848640 +2941 0.2941 -1.6504893371344718 145.588288576290 +2942 0.2942 -1.6650169146804132 144.963262342540 +2943 0.2943 -1.6794820622653241 144.339689355680 +2944 0.2944 -1.6938849250745862 143.717566829560 +2945 0.2945 -1.7082256480152422 143.096891983560 +2946 0.2946 -1.7225043757165492 142.477662042580 +2947 0.2947 -1.7367212525305307 141.859874237050 +2948 0.2948 -1.7508764225325257 141.243525802850 +2949 0.2949 -1.7649700295217392 140.628613981420 +2950 0.2950 -1.7790022170217912 140.015136019620 +2951 0.2951 -1.7929731282812618 139.403089169790 +2952 0.2952 -1.8068829062742369 138.792470689710 +2953 0.2953 -1.8207316937008533 138.183277842620 +2954 0.2954 -1.8345196329878437 137.575507897190 +2955 0.2955 -1.8482468662890768 136.969158127470 +2956 0.2956 -1.8619135354860983 136.364225812960 +2957 0.2957 -1.8755197821886718 135.760708238510 +2958 0.2958 -1.8890657477353159 135.158602694370 +2959 0.2959 -1.9025515731938438 134.557906476190 +2960 0.2960 -1.9159773993618998 133.958616884930 +2961 0.2961 -1.9293433667674917 133.360731226910 +2962 0.2962 -1.9426496156695268 132.764246813790 +2963 0.2963 -1.9558962860583449 132.169160962570 +2964 0.2964 -1.9690835176562484 131.575470995500 +2965 0.2965 -1.9822114499180350 130.983174240230 +2966 0.2966 -1.9952802220315264 130.392268029600 +2967 0.2967 -2.0082899729180954 129.802749701780 +2968 0.2968 -2.0212408412331939 129.214616600190 +2969 0.2969 -2.0341329653668798 128.627866073530 +2970 0.2970 -2.0469664834443408 128.042495475690 +2971 0.2971 -2.0597415333264180 127.458502165850 +2972 0.2972 -2.0724582526101294 126.875883508380 +2973 0.2973 -2.0851167786291902 126.294636872840 +2974 0.2974 -2.0977172484545337 125.714759634030 +2975 0.2975 -2.1102597988948313 125.136249171920 +2976 0.2976 -2.1227445664970093 124.559102871640 +2977 0.2977 -2.1351716875467663 123.983318123500 +2978 0.2978 -2.1475412980690898 123.408892322970 +2979 0.2979 -2.1598535338287692 122.835822870620 +2980 0.2980 -2.1721085303309118 122.264107172230 +2981 0.2981 -2.1843064228214546 121.693742638630 +2982 0.2982 -2.1964473462876750 121.124726685780 +2983 0.2983 -2.2085314354587013 120.557056734750 +2984 0.2984 -2.2205588248060222 119.990730211670 +2985 0.2985 -2.2325296485439945 119.425744547780 +2986 0.2986 -2.2444440406303516 118.862097179360 +2987 0.2987 -2.2563021347667078 118.299785547760 +2988 0.2988 -2.2681040643990635 117.738807099350 +2989 0.2989 -2.2798499627183095 117.179159285570 +2990 0.2990 -2.2915399626607305 116.620839562850 +2991 0.2991 -2.3031741969085053 116.063845392650 +2992 0.2992 -2.3147527978902080 115.508174241400 +2993 0.2993 -2.3262758977813061 114.953823580560 +2994 0.2994 -2.3377436285046618 114.400790886550 +2995 0.2995 -2.3491561217310264 113.849073640740 +2996 0.2996 -2.3605135088795386 113.298669329500 +2997 0.2997 -2.3718159211182197 112.749575444120 +2998 0.2998 -2.3830634893644662 112.201789480810 +2999 0.2999 -2.3942563442855436 111.655308940740 +3000 0.3000 -2.4053946162990791 111.110131329970 +3001 0.3001 -2.4164784355735520 110.566254159490 +3002 0.3002 -2.4275079320287842 110.023674945150 +3003 0.3003 -2.4384832353364274 109.482391207710 +3004 0.3004 -2.4494044749204531 108.942400472800 +3005 0.3005 -2.4602717799576377 108.403700270890 +3006 0.3006 -2.4710852793780491 107.866288137340 +3007 0.3007 -2.4818451018655323 107.330161612320 +3008 0.3008 -2.4925513758581910 106.795318240850 +3009 0.3009 -2.5032042295488721 106.261755572770 +3010 0.3010 -2.5138037908856465 105.729471162720 +3011 0.3011 -2.5243501875722894 105.198462570140 +3012 0.3012 -2.5348435470687605 104.668727359280 +3013 0.3013 -2.5452839965916816 104.140263099140 +3014 0.3014 -2.5556716631148153 103.613067363530 +3015 0.3015 -2.5660066733695408 103.087137730980 +3016 0.3016 -2.5762891538453294 102.562471784790 +3017 0.3017 -2.5865192307902194 102.039067113010 +3018 0.3018 -2.5966970302112888 101.516921308380 +3019 0.3019 -2.6068226778751282 100.996031968410 +3020 0.3020 -2.6168962993083129 100.476396695280 +3021 0.3021 -2.6269180197978712 99.958013095890 +3022 0.3022 -2.6368879643917569 99.440878781820 +3023 0.3023 -2.6468062578993155 98.924991369350 +3024 0.3024 -2.6566730248917518 98.410348479380 +3025 0.3025 -2.6664883897025971 97.896947737520 +3026 0.3026 -2.6762524764281737 97.384786774010 +3027 0.3027 -2.6859654089280607 96.873863223730 +3028 0.3028 -2.6956273108255568 96.364174726190 +3029 0.3029 -2.7052383055081419 95.855718925510 +3030 0.3030 -2.7147985161279395 95.348493470440 +3031 0.3031 -2.7243080656021781 94.842496014330 +3032 0.3032 -2.7337670766136482 94.337724215070 +3033 0.3033 -2.7431756716111626 93.834175735220 +3034 0.3034 -2.7525339728100162 93.331848241850 +3035 0.3035 -2.7618421021924373 92.830739406570 +3036 0.3036 -2.7711001815080456 92.330846905600 +3037 0.3037 -2.7803083322743101 91.832168419690 +3038 0.3038 -2.7894666757769984 91.334701634080 +3039 0.3039 -2.7985753330706320 90.838444238590 +3040 0.3040 -2.8076344249789371 90.343393927510 +3041 0.3041 -2.8166440720952943 89.849548399630 +3042 0.3042 -2.8256043947831904 89.356905358290 +3043 0.3043 -2.8345155131766675 88.865462511250 +3044 0.3044 -2.8433775471807690 88.375217570780 +3045 0.3045 -2.8521906164719879 87.886168253600 +3046 0.3046 -2.8609548404987133 87.398312280910 +3047 0.3047 -2.8696703384816749 86.911647378320 +3048 0.3048 -2.8783372294143863 86.426171275910 +3049 0.3049 -2.8869556320635898 85.941881708160 +3050 0.3050 -2.8955256649696985 85.458776414010 +3051 0.3051 -2.9040474464472363 84.976853136750 +3052 0.3052 -2.9125210945852800 84.496109624120 +3053 0.3053 -2.9209467272478968 84.016543628220 +3054 0.3054 -2.9293244620745855 83.538152905550 +3055 0.3055 -2.9376544164807119 83.060935216980 +3056 0.3056 -2.9459367076579475 82.584888327730 +3057 0.3057 -2.9541714525747031 82.110010007380 +3058 0.3058 -2.9623587679765646 81.636298029850 +3059 0.3059 -2.9704987703867283 81.163750173420 +3060 0.3060 -2.9785915761064321 80.692364220660 +3061 0.3061 -2.9866373012153886 80.222137958470 +3062 0.3062 -2.9946360615722161 79.753069178080 +3063 0.3063 -3.0025879728148688 79.285155674970 +3064 0.3064 -3.0104931503610652 78.818395248960 +3065 0.3065 -3.0183517094087198 78.352785704130 +3066 0.3066 -3.0261637649363662 77.888324848800 +3067 0.3067 -3.0339294317035872 77.425010495620 +3068 0.3068 -3.0416488242514403 76.962840461440 +3069 0.3069 -3.0493220569028812 76.501812567380 +3070 0.3070 -3.0569492437631887 76.041924638770 +3071 0.3071 -3.0645304987203872 75.583174505200 +3072 0.3072 -3.0720659354456692 75.125560000440 +3073 0.3073 -3.0795556673938163 74.669078962500 +3074 0.3074 -3.0869998078036209 74.213729233590 +3075 0.3075 -3.0943984696983042 73.759508660080 +3076 0.3076 -3.1017517658859366 73.306415092570 +3077 0.3077 -3.1090598089598540 72.854446385780 +3078 0.3078 -3.1163227112990746 72.403600398630 +3079 0.3079 -3.1235405850687159 71.953874994200 +3080 0.3080 -3.1307135422204104 71.505268039690 +3081 0.3081 -3.1378416944927179 71.057777406460 +3082 0.3082 -3.1449251534115406 70.611400969990 +3083 0.3083 -3.1519640302905341 70.166136609880 +3084 0.3084 -3.1589584362315213 69.721982209860 +3085 0.3085 -3.1659084821249013 69.278935657740 +3086 0.3086 -3.1728142786500606 68.836994845450 +3087 0.3087 -3.1796759362757818 68.396157668970 +3088 0.3088 -3.1864935652606499 67.956422028390 +3089 0.3089 -3.1932672756534632 67.517785827880 +3090 0.3090 -3.1999971772936386 67.080246975630 +3091 0.3091 -3.2066833798116168 66.643803383930 +3092 0.3092 -3.2133259926292657 66.208452969050 +3093 0.3093 -3.2199251249602860 65.774193651360 +3094 0.3094 -3.2264808858106160 65.341023355240 +3095 0.3095 -3.2329933839788310 64.908940009060 +3096 0.3096 -3.2394627280565453 64.477941545230 +3097 0.3097 -3.2458890264288143 64.048025900150 +3098 0.3098 -3.2522723872745334 63.619191014230 +3099 0.3099 -3.2586129185668362 63.191434831830 +3100 0.3100 -3.2649107280734939 62.764755301320 +3101 0.3101 -3.2711659233573109 62.339150375020 +3102 0.3102 -3.2773786117765238 61.914618009240 +3103 0.3103 -3.2835489004851954 61.491156164190 +3104 0.3104 -3.2896768964336083 61.068762804070 +3105 0.3105 -3.2957627063686621 60.647435897010 +3106 0.3106 -3.3018064368342634 60.227173415020 +3107 0.3107 -3.3078081941717192 59.807973334100 +3108 0.3108 -3.3137680845201292 59.389833634100 +3109 0.3109 -3.3196862138167758 58.972752298830 +3110 0.3110 -3.3255626877975137 58.556727315930 +3111 0.3111 -3.3313976119971591 58.141756676980 +3112 0.3112 -3.3371910917498790 57.727838377420 +3113 0.3113 -3.3429432321895773 57.314970416550 +3114 0.3114 -3.3486541382502817 56.903150797540 +3115 0.3115 -3.3543239146665300 56.492377527430 +3116 0.3116 -3.3599526659737551 56.082648617070 +3117 0.3117 -3.3655404965086673 55.673962081170 +3118 0.3118 -3.3710875104096409 55.266315938300 +3119 0.3119 -3.3765938116170955 54.859708210790 +3120 0.3120 -3.3820595038738768 54.454136924840 +3121 0.3121 -3.3874846907256391 54.049600110410 +3122 0.3122 -3.3928694755212248 53.646095801300 +3123 0.3123 -3.3982139614130431 53.243622035070 +3124 0.3124 -3.4035182513574505 52.842176853080 +3125 0.3125 -3.4087824481151268 52.441758300450 +3126 0.3126 -3.4140066542514531 52.042364426080 +3127 0.3127 -3.4191909721368887 51.643993282630 +3128 0.3128 -3.4243355039473453 51.246642926500 +3129 0.3129 -3.4294403516645628 50.850311417850 +3130 0.3130 -3.4345056170764829 50.454996820550 +3131 0.3131 -3.4395314017776215 50.060697202220 +3132 0.3132 -3.4445178071694427 49.667410634200 +3133 0.3133 -3.4494649344607287 49.275135191520 +3134 0.3134 -3.4543728846679516 48.883868952940 +3135 0.3135 -3.4592417586156445 48.493610000920 +3136 0.3136 -3.4640716569367691 48.104356421570 +3137 0.3137 -3.4688626800730842 47.716106304730 +3138 0.3138 -3.4736149282755151 47.328857743890 +3139 0.3139 -3.4783285016045191 46.942608836190 +3140 0.3140 -3.4830034999304527 46.557357682480 +3141 0.3141 -3.4876400229339373 46.173102387210 +3142 0.3142 -3.4922381701062224 45.789841058490 +3143 0.3143 -3.4967980407495505 45.407571808070 +3144 0.3144 -3.5013197339775219 45.026292751360 +3145 0.3145 -3.5058033487154558 44.646002007320 +3146 0.3146 -3.5102489837007509 44.266697698580 +3147 0.3147 -3.5146567374832478 43.888377951360 +3148 0.3148 -3.5190267084255886 43.511040895460 +3149 0.3149 -3.5233589947035777 43.134684664320 +3150 0.3150 -3.5276536943065402 42.759307394930 +3151 0.3151 -3.5319109050376789 42.384907227840 +3152 0.3152 -3.5361307245144316 42.011482307210 +3153 0.3153 -3.5403132501688277 41.639030780710 +3154 0.3154 -3.5444585792478449 41.267550799630 +3155 0.3155 -3.5485668088137645 40.897040518760 +3156 0.3156 -3.5526380357445242 40.527498096430 +3157 0.3157 -3.5566723567340728 40.158921694540 +3158 0.3158 -3.5606698682927229 39.791309478460 +3159 0.3159 -3.5646306667475023 39.424659617130 +3160 0.3160 -3.5685548482425071 39.058970282970 +3161 0.3161 -3.5724425087392513 38.694239651910 +3162 0.3162 -3.5762937440170157 38.330465903380 +3163 0.3163 -3.5801086496732002 37.967647220310 +3164 0.3164 -3.5838873211236693 37.605781789070 +3165 0.3165 -3.5876298536030999 37.244867799540 +3166 0.3166 -3.5913363421653308 36.884903445080 +3167 0.3167 -3.5950068816837084 36.525886922470 +3168 0.3168 -3.5986415668514309 36.167816431980 +3169 0.3169 -3.6022404921818949 35.810690177300 +3170 0.3170 -3.6058037520090385 35.454506365570 +3171 0.3171 -3.6093314404876851 35.099263207360 +3172 0.3172 -3.6128236515938870 34.744958916680 +3173 0.3173 -3.6162804791252663 34.391591710910 +3174 0.3174 -3.6197020167013569 34.039159810900 +3175 0.3175 -3.6230883577639452 33.687661440870 +3176 0.3176 -3.6264395955774109 33.337094828440 +3177 0.3177 -3.6297558232290648 32.987458204640 +3178 0.3178 -3.6330371336294887 32.638749803840 +3179 0.3179 -3.6362836195128727 32.290967863840 +3180 0.3180 -3.6394953734373532 31.944110625770 +3181 0.3181 -3.6426724877853478 31.598176334120 +3182 0.3182 -3.6458150547638928 31.253163236780 +3183 0.3183 -3.6489231664049777 30.909069584920 +3184 0.3184 -3.6519969145658790 30.565893633110 +3185 0.3185 -3.6550363909294958 30.223633639230 +3186 0.3186 -3.6580416870046815 29.882287864480 +3187 0.3187 -3.6610128941265758 29.541854573410 +3188 0.3188 -3.6639501034569393 29.202332033860 +3189 0.3189 -3.6668534059844804 28.863718516960 +3190 0.3190 -3.6697228925251872 28.526012297180 +3191 0.3191 -3.6725586537226595 28.189211652270 +3192 0.3192 -3.6753607800484360 27.853314863260 +3193 0.3193 -3.6781293618023221 27.518320214460 +3194 0.3194 -3.6808644891127176 27.184225993450 +3195 0.3195 -3.6835662519369445 26.851030491090 +3196 0.3196 -3.6862347400615740 26.518732001500 +3197 0.3197 -3.6888700431027512 26.187328822040 +3198 0.3198 -3.6914722505065196 25.856819253330 +3199 0.3199 -3.6940414515491460 25.527201599200 +3200 0.3200 -3.6965777353374443 25.198474166770 +3201 0.3201 -3.6990811908090997 24.870635266340 +3202 0.3202 -3.7015519067329885 24.543683211440 +3203 0.3203 -3.7039899717095017 24.217616318820 +3204 0.3204 -3.7063954741708649 23.892432908440 +3205 0.3205 -3.7087685023814596 23.568131303450 +3206 0.3206 -3.7111091444381428 23.244709830210 +3207 0.3207 -3.7134174882705651 22.922166818240 +3208 0.3208 -3.7156936216414906 22.600500600270 +3209 0.3209 -3.7179376321471143 22.279709512200 +3210 0.3210 -3.7201496072173783 21.959791893080 +3211 0.3211 -3.7223296341162886 21.640746085130 +3212 0.3212 -3.7244777999422314 21.322570433730 +3213 0.3213 -3.7265941916282888 21.005263287420 +3214 0.3214 -3.7286788959425516 20.688822997840 +3215 0.3215 -3.7307319994884347 20.373247919820 +3216 0.3216 -3.7327535887049903 20.058536411290 +3217 0.3217 -3.7347437498672198 19.744686833300 +3218 0.3218 -3.7367025690863866 19.431697550040 +3219 0.3219 -3.7386301323103268 19.119566928760 +3220 0.3220 -3.7405265253237583 18.808293339870 +3221 0.3221 -3.7423918337485951 18.497875156870 +3222 0.3222 -3.7442261430442541 18.188310756310 +3223 0.3223 -3.7460295385079632 17.879598517870 +3224 0.3224 -3.7478021052750705 17.571736824280 +3225 0.3225 -3.7495439283193530 17.264724061370 +3226 0.3226 -3.7512550924533219 16.958558618010 +3227 0.3227 -3.7529356823285296 16.653238886140 +3228 0.3228 -3.7545857824358744 16.348763260760 +3229 0.3229 -3.7562054771059072 16.045130139900 +3230 0.3230 -3.7577948505091352 15.742337924660 +3231 0.3231 -3.7593539866563259 15.440385019150 +3232 0.3232 -3.7608829693988093 15.139269830520 +3233 0.3233 -3.7623818824287816 14.838990768930 +3234 0.3234 -3.7638508092796075 14.539546247590 +3235 0.3235 -3.7652898333261211 14.240934682680 +3236 0.3236 -3.7666990377849254 13.943154493410 +3237 0.3237 -3.7680785057146955 13.646204101990 +3238 0.3238 -3.7694283200164747 13.350081933590 +3239 0.3239 -3.7707485634339752 13.054786416420 +3240 0.3240 -3.7720393185538783 12.760315981640 +3241 0.3241 -3.7733006678061285 12.466669063360 +3242 0.3242 -3.7745326934642311 12.173844098690 +3243 0.3243 -3.7757354776455516 11.881839527720 +3244 0.3244 -3.7769091023116101 11.590653793450 +3245 0.3245 -3.7780536492683758 11.300285341860 +3246 0.3246 -3.7791692001665624 11.010732621870 +3247 0.3247 -3.7802558365019214 10.721994085310 +3248 0.3248 -3.7813136396155369 10.434068187000 +3249 0.3249 -3.7823426906941191 10.146953384640 +3250 0.3250 -3.7833430707702944 9.860648138870 +3251 0.3251 -3.7843148607228998 9.575150913240 +3252 0.3252 -3.7852581412772719 9.290460174200 +3253 0.3253 -3.7861729930055370 9.006574391100 +3254 0.3254 -3.7870594963269029 8.723492036220 +3255 0.3255 -3.7879177315079491 8.441211584700 +3256 0.3256 -3.7887477786629127 8.159731514570 +3257 0.3257 -3.7895497177539785 7.879050306750 +3258 0.3258 -3.7903236285915667 7.599166445010 +3259 0.3259 -3.7910695908346188 7.320078416030 +3260 0.3260 -3.7917876839908855 7.041784709300 +3261 0.3261 -3.7924779874172119 6.764283817230 +3262 0.3262 -3.7931405803198235 6.487574235000 +3263 0.3263 -3.7937755417546084 6.211654460700 +3264 0.3264 -3.7943829506274058 5.936522995250 +3265 0.3265 -3.7949628856942863 5.662178342360 +3266 0.3266 -3.7955154255618360 5.388619008630 +3267 0.3267 -3.7960406486874385 5.115843503420 +3268 0.3268 -3.7965386333795572 4.843850338950 +3269 0.3269 -3.7970094577980174 4.572638030250 +3270 0.3270 -3.7974531999542855 4.302205095110 +3271 0.3271 -3.7978699377117500 4.032550054180 +3272 0.3272 -3.7982597487860010 3.763671430840 +3273 0.3273 -3.7986227107451098 3.495567751340 +3274 0.3274 -3.7989589010099079 3.228237544620 +3275 0.3275 -3.7992683968542620 2.961679342460 +3276 0.3276 -3.7995512754053542 2.695891679380 +3277 0.3277 -3.7998076136439582 2.430873092700 +3278 0.3278 -3.8000374884047159 2.166622122450 +3279 0.3279 -3.8002409763764113 1.903137311460 +3280 0.3280 -3.8004181541022488 1.640417205290 +3281 0.3281 -3.8005690979801252 1.378460352240 +3282 0.3282 -3.8006938842629041 1.117265303340 +3283 0.3283 -3.8007925890586898 0.856830612370 +3284 0.3284 -3.8008652883311007 0.597154835850 +3285 0.3285 -3.8009120578995419 0.338236532970 +3286 0.3286 -3.8009329734394748 0.080074265690 +3287 0.3287 -3.8009281104826917 -0.177333401350 +3288 0.3288 -3.8008975444175848 -0.433987900790 +3289 0.3289 -3.8008413504894163 -0.689890662580 +3290 0.3290 -3.8007596038005884 -0.945043113980 +3291 0.3291 -3.8006523793109119 -1.199446679550 +3292 0.3292 -3.8005197518378759 -1.453102781170 +3293 0.3293 -3.8003617960569152 -1.706012838050 +3294 0.3294 -3.8001785865016773 -1.958178266710 +3295 0.3295 -3.7999701975642908 -2.209600481020 +3296 0.3296 -3.7997367034956309 -2.460280892180 +3297 0.3297 -3.7994781784055847 -2.710220908740 +3298 0.3298 -3.7991946962633181 -2.959421936590 +3299 0.3299 -3.7988863308975400 -3.207885378970 +3300 0.3300 -3.7985531559967662 -3.455612636510 +3301 0.3301 -3.7981952451095826 -3.702605107160 +3302 0.3302 -3.7978126716449112 -3.948864186270 +3303 0.3303 -3.7974055088722696 -4.194391266560 +3304 0.3304 -3.7969738299220355 -4.439187738120 +3305 0.3305 -3.7965177077857075 -4.683254988440 +3306 0.3306 -3.7960372153161654 -4.926594402400 +3307 0.3307 -3.7955324252279321 -5.169207362270 +3308 0.3308 -3.7950034100974337 -5.411095247700 +3309 0.3309 -3.7944502423632587 -5.652259435800 +3310 0.3310 -3.7938729943264162 -5.892701301050 +3311 0.3311 -3.7932717381505956 -6.132422215360 +3312 0.3312 -3.7926465458624254 -6.371423548040 +3313 0.3313 -3.7919974893517296 -6.609706665880 +3314 0.3314 -3.7913246403717835 -6.847272933040 +3315 0.3315 -3.7906280705395741 -7.084123711150 +3316 0.3316 -3.7899078513360509 -7.320260359310 +3317 0.3317 -3.7891640541063847 -7.555684234010 +3318 0.3318 -3.7883967500602225 -7.790396689230 +3319 0.3319 -3.7876060102719413 -8.024399076390 +3320 0.3320 -3.7867919056809018 -8.257692744400 +3321 0.3321 -3.7859545070917018 -8.490279039600 +3322 0.3322 -3.7850938851744309 -8.722159305820 +3323 0.3323 -3.7842101104649197 -8.953334884400 +3324 0.3324 -3.7833032533649944 -9.183807114110 +3325 0.3325 -3.7823733841427267 -9.413577331240 +3326 0.3326 -3.7814205729326869 -9.642646869560 +3327 0.3327 -3.7804448897361915 -9.871017060350 +3328 0.3328 -3.7794464044215546 -10.098689232390 +3329 0.3329 -3.7784251867243372 -10.325664711960 +3330 0.3330 -3.7773813062475967 -10.551944822850 +3331 0.3331 -3.7763148324621341 -10.777530886400 +3332 0.3332 -3.7752258347067431 -11.002424221420 +3333 0.3333 -3.7741143821884573 -11.226626144300 +3334 0.3334 -3.7729805439827953 -11.450137968940 +3335 0.3335 -3.7718243890340100 -11.672961006770 +3336 0.3336 -3.7706459861553325 -11.895096566780 +3337 0.3337 -3.7694454040292196 -12.116545955480 +3338 0.3338 -3.7682227112075970 -12.337310476970 +3339 0.3339 -3.7669779761121038 -12.557391432890 +3340 0.3340 -3.7657112670343382 -12.776790122420 +3341 0.3341 -3.7644226521360999 -12.995507842350 +3342 0.3342 -3.7631121994496315 -13.213545887020 +3343 0.3343 -3.7617799768778646 -13.430905548320 +3344 0.3344 -3.7604260521946595 -13.647588115780 +3345 0.3345 -3.7590504930450477 -13.863594876460 +3346 0.3346 -3.7576533669454721 -14.078927115050 +3347 0.3347 -3.7562347412840285 -14.293586113820 +3348 0.3348 -3.7547946833207058 -14.507573152630 +3349 0.3349 -3.7533332601876253 -14.720889508980 +3350 0.3350 -3.7518505388892791 -14.933536457940 +3351 0.3351 -3.7503465863027716 -15.145515272210 +3352 0.3352 -3.7488214691780546 -15.356827222130 +3353 0.3353 -3.7472752541381662 -15.567473575640 +3354 0.3354 -3.7457080076794691 -15.777455598300 +3355 0.3355 -3.7441197961718871 -15.986774553340 +3356 0.3356 -3.7425106858591399 -16.195431701600 +3357 0.3357 -3.7408807428589821 -16.403428301560 +3358 0.3358 -3.7392300331634347 -16.610765609390 +3359 0.3359 -3.7375586226390225 -16.817444878850 +3360 0.3360 -3.7358665770270099 -17.023467361400 +3361 0.3361 -3.7341539619436315 -17.228834306170 +3362 0.3362 -3.7324208428803280 -17.433546959900 +3363 0.3363 -3.7306672852039799 -17.637606567060 +3364 0.3364 -3.7288933541571381 -17.841014369780 +3365 0.3365 -3.7270991148582566 -18.043771607850 +3366 0.3366 -3.7252846323019262 -18.245879518760 +3367 0.3367 -3.7234499713591034 -18.447339337700 +3368 0.3368 -3.7215951967773417 -18.648152297530 +3369 0.3369 -3.7197203731810236 -18.848319628830 +3370 0.3370 -3.7178255650715890 -19.047842559860 +3371 0.3371 -3.7159108368277654 -19.246722316610 +3372 0.3372 -3.7139762527057960 -19.444960122780 +3373 0.3373 -3.7120218768396680 -19.642557199780 +3374 0.3374 -3.7100477732413419 -19.839514766740 +3375 0.3375 -3.7080540058009799 -20.035834040500 +3376 0.3376 -3.7060406382871713 -20.231516235670 +3377 0.3377 -3.7040077343471594 -20.426562564570 +3378 0.3378 -3.7019553575070683 -20.620974237250 +3379 0.3379 -3.6998835711721298 -20.814752461520 +3380 0.3380 -3.6977924386269070 -21.007898442940 +3381 0.3381 -3.6956820230355198 -21.200413384800 +3382 0.3382 -3.6935523874418714 -21.392298488170 +3383 0.3383 -3.6914035947698682 -21.583554951890 +3384 0.3384 -3.6892357078236468 -21.774183972540 +3385 0.3385 -3.6870487892877968 -21.964186744460 +3386 0.3386 -3.6848429017275834 -22.153564459810 +3387 0.3387 -3.6826181075891684 -22.342318308490 +3388 0.3388 -3.6803744691998332 -22.530449478210 +3389 0.3389 -3.6781120487682011 -22.717959154430 +3390 0.3390 -3.6758309083844565 -22.904848520460 +3391 0.3391 -3.6735311100205661 -23.091118757350 +3392 0.3392 -3.6712127155304999 -23.276771043970 +3393 0.3393 -3.6688757866504504 -23.461806557020 +3394 0.3394 -3.6665203849990506 -23.646226470980 +3395 0.3395 -3.6641465720775943 -23.830031958150 +3396 0.3396 -3.6617544092702548 -24.013224188640 +3397 0.3397 -3.6593439578443023 -24.195804330410 +3398 0.3398 -3.6569152789503208 -24.377773549220 +3399 0.3399 -3.6544684336224265 -24.559133008670 +3400 0.3400 -3.6520034827784831 -24.739883870200 +3401 0.3401 -3.6495204872203186 -24.920027293090 +3402 0.3402 -3.6470195076339422 -25.099564434440 +3403 0.3403 -3.6445006045897586 -25.278496449230 +3404 0.3404 -3.6419638385427833 -25.456824490280 +3405 0.3405 -3.6394092698328566 -25.634549708250 +3406 0.3406 -3.6368369586848592 -25.811673251700 +3407 0.3407 -3.6342469652089249 -25.988196266990 +3408 0.3408 -3.6316393494006536 -26.164119898440 +3409 0.3409 -3.6290141711413240 -26.339445288150 +3410 0.3410 -3.6263714901981086 -26.514173576160 +3411 0.3411 -3.6237113662242817 -26.688305900380 +3412 0.3412 -3.6210338587594344 -26.861843396570 +3413 0.3413 -3.6183390272296845 -27.034787198430 +3414 0.3414 -3.6156269309478875 -27.207138437510 +3415 0.3415 -3.6128976291138470 -27.378898243300 +3416 0.3416 -3.6101511808145244 -27.550067743150 +3417 0.3417 -3.6073876450242492 -27.720648062350 +3418 0.3418 -3.6046070806049273 -27.890640324090 +3419 0.3419 -3.6018095463062498 -28.060045649460 +3420 0.3420 -3.5989951007659022 -28.228865157490 +3421 0.3421 -3.5961638025097717 -28.397099965120 +3422 0.3422 -3.5933157099521553 -28.564751187210 +3423 0.3423 -3.5904508813959657 -28.731819936580 +3424 0.3424 -3.5875693750329392 -28.898307323950 +3425 0.3425 -3.5846712489438417 -29.064214458000 +3426 0.3426 -3.5817565610986741 -29.229542445350 +3427 0.3427 -3.5788253693568786 -29.394292390560 +3428 0.3428 -3.5758777314675432 -29.558465396150 +3429 0.3429 -3.5729137050696065 -29.722062562580 +3430 0.3430 -3.5699333476920629 -29.885084988290 +3431 0.3431 -3.5669367167541655 -30.047533769660 +3432 0.3432 -3.5639238695656297 -30.209410001060 +3433 0.3433 -3.5608948633268356 -30.370714774820 +3434 0.3434 -3.5578497551290327 -30.531449181240 +3435 0.3435 -3.5547886019545403 -30.691614308610 +3436 0.3436 -3.5517114606769500 -30.851211243200 +3437 0.3437 -3.5486183880613278 -31.010241069240 +3438 0.3438 -3.5455094407644152 -31.168704869010 +3439 0.3439 -3.5423846753348291 -31.326603722710 +3440 0.3440 -3.5392441482132635 -31.483938708600 +3441 0.3441 -3.5360879157326877 -31.640710902920 +3442 0.3442 -3.5329160341185455 -31.796921379920 +3443 0.3443 -3.5297285594889574 -31.952571211840 +3444 0.3444 -3.5265255478549178 -32.107661468950 +3445 0.3445 -3.5233070551204926 -32.262193219550 +3446 0.3446 -3.5200731370830169 -32.416167529960 +3447 0.3447 -3.5168238494332944 -32.569585464490 +3448 0.3448 -3.5135592477557940 -32.722448085520 +3449 0.3449 -3.5102793875288452 -32.874756453460 +3450 0.3450 -3.5069843241248360 -33.026511626720 +3451 0.3451 -3.5036741128104105 -33.177714661790 +3452 0.3452 -3.5003488087466605 -33.328366613210 +3453 0.3453 -3.4970084669893242 -33.478468533520 +3454 0.3454 -3.4936531424889807 -33.628021473350 +3455 0.3455 -3.4902828900912426 -33.777026481410 +3456 0.3456 -3.4868977645369528 -33.925484604390 +3457 0.3457 -3.4834978204623761 -34.073396887140 +3458 0.3458 -3.4800831123993934 -34.220764372510 +3459 0.3459 -3.4766536947756963 -34.367588101430 +3460 0.3460 -3.4732096219149780 -34.513869112940 +3461 0.3461 -3.4697509480371251 -34.659608444120 +3462 0.3462 -3.4662777272584102 -34.804807130180 +3463 0.3463 -3.4627900135916843 -34.949466204340 +3464 0.3464 -3.4592878609465676 -35.093586697990 +3465 0.3465 -3.4557713231296394 -35.237169640570 +3466 0.3466 -3.4522404538446301 -35.380216059620 +3467 0.3467 -3.4486953066926094 -35.522726980790 +3468 0.3468 -3.4451359351721775 -35.664703427850 +3469 0.3469 -3.4415623926796530 -35.806146422640 +3470 0.3470 -3.4379747325092636 -35.947056985150 +3471 0.3471 -3.4343730078533330 -36.087436133460 +3472 0.3472 -3.4307572718024710 -36.227284883780 +3473 0.3473 -3.4271275773457597 -36.366604250450 +3474 0.3474 -3.4234839773709411 -36.505395245920 +3475 0.3475 -3.4198265246646056 -36.643658880790 +3476 0.3476 -3.4161552719123769 -36.781396163780 +3477 0.3477 -3.4124702716991009 -36.918608101740 +3478 0.3478 -3.4087715765090283 -37.055295699710 +3479 0.3479 -3.4050592387260035 -37.191459960790 +3480 0.3480 -3.4013333106336483 -37.327101886310 +3481 0.3481 -3.3975938444155469 -37.462222475720 +3482 0.3482 -3.3938408921554313 -37.596822726590 +3483 0.3483 -3.3900745058373647 -37.730903634740 +3484 0.3484 -3.3862947373459256 -37.864466194040 +3485 0.3485 -3.3825016384663922 -37.997511396630 +3486 0.3486 -3.3786952608849230 -38.130040232750 +3487 0.3487 -3.3748756561887436 -38.262053690840 +3488 0.3488 -3.3710428758663253 -38.393552757530 +3489 0.3489 -3.3671969713075698 -38.524538417580 +3490 0.3490 -3.3633379938039902 -38.655011654010 +3491 0.3491 -3.3594659945488918 -38.784973447960 +3492 0.3492 -3.3555810246375537 -38.914424778800 +3493 0.3493 -3.3516831350674092 -39.043366624090 +3494 0.3494 -3.3477723767382268 -39.171799959560 +3495 0.3495 -3.3438488004522897 -39.299725759180 +3496 0.3496 -3.3399124569145751 -39.427144995110 +3497 0.3497 -3.3359633967329345 -39.554058637700 +3498 0.3498 -3.3320016704182724 -39.680467655540 +3499 0.3499 -3.3280273283847239 -39.806373015430 +3500 0.3500 -3.3240404209498338 -39.931775682370 +3501 0.3501 -3.3200409983347350 -40.056676619610 +3502 0.3502 -3.3160291106643238 -40.181076788610 +3503 0.3503 -3.3120048079674413 -40.304977149040 +3504 0.3504 -3.3079681401770467 -40.428378658850 +3505 0.3505 -3.3039191571303945 -40.551282274190 +3506 0.3506 -3.2998579085692117 -40.673688949470 +3507 0.3507 -3.2957844441398727 -40.795599637310 +3508 0.3508 -3.2916988133935767 -40.917015288610 +3509 0.3509 -3.2876010657865202 -41.037936852520 +3510 0.3510 -3.2834912506800733 -41.158365276420 +3511 0.3511 -3.2793694173409542 -41.278301505960 +3512 0.3512 -3.2752356149414030 -41.397746485060 +3513 0.3513 -3.2710898925593561 -41.516701155880 +3514 0.3514 -3.2669322991786189 -41.635166458860 +3515 0.3515 -3.2627628836890410 -41.753143332700 +3516 0.3516 -3.2585816948866864 -41.870632714390 +3517 0.3517 -3.2543887814740069 -41.987635539200 +3518 0.3518 -3.2501841920600145 -42.104152740650 +3519 0.3519 -3.2459679751604535 -42.220185250570 +3520 0.3520 -3.2417401791979721 -42.335733999060 +3521 0.3521 -3.2375008525022926 -42.450799914530 +3522 0.3522 -3.2332500433103828 -42.565383923670 +3523 0.3523 -3.2289877997666268 -42.679486951450 +3524 0.3524 -3.2247141699229958 -42.793109921170 +3525 0.3525 -3.2204292017392158 -42.906253754430 +3526 0.3526 -3.2161329430829384 -43.018919371120 +3527 0.3527 -3.2118254417299110 -43.131107689430 +3528 0.3528 -3.2075067453641450 -43.242819625890 +3529 0.3529 -3.2031769015780833 -43.354056095340 +3530 0.3530 -3.1988359578727699 -43.464818010930 +3531 0.3531 -3.1944839616580163 -43.575106284140 +3532 0.3532 -3.1901209602525706 -43.684921824770 +3533 0.3533 -3.1857470008842848 -43.794265540950 +3534 0.3534 -3.1813621306902804 -43.903138339140 +3535 0.3535 -3.1769663967171162 -44.011541124140 +3536 0.3536 -3.1725598459209543 -44.119474799100 +3537 0.3537 -3.1681425251677253 -44.226940265480 +3538 0.3538 -3.1637144812332947 -44.333938423130 +3539 0.3539 -3.1592757608036286 -44.440470170190 +3540 0.3540 -3.1548264104749584 -44.546536403210 +3541 0.3541 -3.1503664767539448 -44.652138017060 +3542 0.3542 -3.1458960060578423 -44.757275904990 +3543 0.3543 -3.1414150447146643 -44.861950958570 +3544 0.3544 -3.1369236389633475 -44.966164067770 +3545 0.3545 -3.1324218349539126 -45.069916120930 +3546 0.3546 -3.1279096787476290 -45.173208004740 +3547 0.3547 -3.1233872163171790 -45.276040604260 +3548 0.3548 -3.1188544935468174 -45.378414802970 +3549 0.3549 -3.1143115562325354 -45.480331482670 +3550 0.3550 -3.1097584500822228 -45.581791523580 +3551 0.3551 -3.1051952207158289 -45.682795804300 +3552 0.3552 -3.1006219136655235 -45.783345201810 +3553 0.3553 -3.0960385743758585 -45.883440591490 +3554 0.3554 -3.0914452482039283 -45.983082847110 +3555 0.3555 -3.0868419804195306 -46.082272840840 +3556 0.3556 -3.0822288162053253 -46.181011443270 +3557 0.3557 -3.0776058006569942 -46.279299523350 +3558 0.3558 -3.0729729787834028 -46.377137948480 +3559 0.3559 -3.0683303955067562 -46.474527584450 +3560 0.3560 -3.0636780956627603 -46.571469295470 +3561 0.3561 -3.0590161240007787 -46.667963944160 +3562 0.3562 -3.0543445251839922 -46.764012391570 +3563 0.3563 -3.0496633437895557 -46.859615497160 +3564 0.3564 -3.0449726243087563 -46.954774118830 +3565 0.3565 -3.0402724111471700 -47.049489112900 +3566 0.3566 -3.0355627486248196 -47.143761334110 +3567 0.3567 -3.0308436809763313 -47.237591635660 +3568 0.3568 -3.0261152523510892 -47.330980869180 +3569 0.3569 -3.0213775068133941 -47.423929884720 +3570 0.3570 -3.0166304883426180 -47.516439530800 +3571 0.3571 -3.0118742408333596 -47.608510654370 +3572 0.3572 -3.0071088080955990 -47.700144100840 +3573 0.3573 -3.0023342338548540 -47.791340714060 +3574 0.3574 -2.9975505617523335 -47.882101336350 +3575 0.3575 -2.9927578353450914 -47.972426808490 +3576 0.3576 -2.9879560981061819 -48.062317969700 +3577 0.3577 -2.9831453934248122 -48.151775657690 +3578 0.3578 -2.9783257646064971 -48.240800708610 +3579 0.3579 -2.9734972548732115 -48.329393957100 +3580 0.3580 -2.9686599073635427 -48.417556236280 +3581 0.3581 -2.9638137651328429 -48.505288377720 +3582 0.3582 -2.9589588711533823 -48.592591211490 +3583 0.3583 -2.9540952683145010 -48.679465566140 +3584 0.3584 -2.9492229994227595 -48.765912268690 +3585 0.3585 -2.9443421072020919 -48.851932144660 +3586 0.3586 -2.9394526342939549 -48.937526018080 +3587 0.3587 -2.9345546232574802 -49.022694711410 +3588 0.3588 -2.9296481165696258 -49.107439045680 +3589 0.3589 -2.9247331566253227 -49.191759840380 +3590 0.3590 -2.9198097857376282 -49.275657913510 +3591 0.3591 -2.9148780461378743 -49.359134081570 +3592 0.3592 -2.9099379799758172 -49.442189159570 +3593 0.3593 -2.9049896293197861 -49.524823961050 +3594 0.3594 -2.9000330361568327 -49.607039298020 +3595 0.3595 -2.8950682423928793 -49.688835981050 +3596 0.3596 -2.8900952898528658 -49.770214819220 +3597 0.3597 -2.8851142202808999 -49.851176620100 +3598 0.3598 -2.8801250753404037 -49.931722189820 +3599 0.3599 -2.8751278966142606 -50.011852333040 +3600 0.3600 -2.8701227256049631 -50.091567852910 +3601 0.3601 -2.8651096037347594 -50.170869551160 +3602 0.3602 -2.8600885723458003 -50.249758228020 +3603 0.3603 -2.8550596727002846 -50.328234682290 +3604 0.3604 -2.8500229459806059 -50.406299711280 +3605 0.3605 -2.8449784332894983 -50.483954110870 +3606 0.3606 -2.8399261756501804 -50.561198675490 +3607 0.3607 -2.8348662140065013 -50.638034198090 +3608 0.3608 -2.8297985892230879 -50.714461470180 +3609 0.3609 -2.8247233420854858 -50.790481281860 +3610 0.3610 -2.8196405133003055 -50.866094421750 +3611 0.3611 -2.8145501434953655 -50.941301677050 +3612 0.3612 -2.8094522732198381 -51.016103833500 +3613 0.3613 -2.8043469429443904 -51.090501675460 +3614 0.3614 -2.7992341930613280 -51.164495985790 +3615 0.3615 -2.7941140638847397 -51.238087545980 +3616 0.3616 -2.7889865956506386 -51.311277136040 +3617 0.3617 -2.7838518285171054 -51.384065534620 +3618 0.3618 -2.7787098025644288 -51.456453518910 +3619 0.3619 -2.7735605577952502 -51.528441864660 +3620 0.3620 -2.7684041341347032 -51.600031346280 +3621 0.3621 -2.7632405714305546 -51.671222736690 +3622 0.3622 -2.7580699094533476 -51.742016807450 +3623 0.3623 -2.7528921878965411 -51.812414328680 +3624 0.3624 -2.7477074463766504 -51.882416069130 +3625 0.3625 -2.7425157244333880 -51.952022796120 +3626 0.3626 -2.7373170615298017 -52.021235275610 +3627 0.3627 -2.7321114970524158 -52.090054272110 +3628 0.3628 -2.7268990703113718 -52.158480548770 +3629 0.3629 -2.7216798205405661 -52.226514867340 +3630 0.3630 -2.7164537868977892 -52.294157988200 +3631 0.3631 -2.7112210084648631 -52.361410670320 +3632 0.3632 -2.7059815242477820 -52.428273671300 +3633 0.3633 -2.7007353731768489 -52.494747747360 +3634 0.3634 -2.6954825941068146 -52.560833653330 +3635 0.3635 -2.6902232258170136 -52.626532142690 +3636 0.3636 -2.6849573070115036 -52.691843967510 +3637 0.3637 -2.6796848763192007 -52.756769878550 +3638 0.3638 -2.6744059722940166 -52.821310625130 +3639 0.3639 -2.6691206334149968 -52.885466955260 +3640 0.3640 -2.6638288980864560 -52.949239615560 +3641 0.3641 -2.6585308046381124 -53.012629351310 +3642 0.3642 -2.6532263913252265 -53.075636906410 +3643 0.3643 -2.6479156963287340 -53.138263023440 +3644 0.3644 -2.6425987577553824 -53.200508443590 +3645 0.3645 -2.6372756136378670 -53.262373906720 +3646 0.3646 -2.6319463019349629 -53.323860151360 +3647 0.3647 -2.6266108605316618 -53.384967914660 +3648 0.3648 -2.6212693272393062 -53.445697932450 +3649 0.3649 -2.6159217397957226 -53.506050939220 +3650 0.3650 -2.6105681358653552 -53.566027668130 +3651 0.3651 -2.6052085530393994 -53.625628850990 +3652 0.3652 -2.5998430288359353 -53.684855218290 +3653 0.3653 -2.5944716007000617 -53.743707499180 +3654 0.3654 -2.5890943060040272 -53.802186421510 +3655 0.3655 -2.5837111820473631 -53.860292711770 +3656 0.3656 -2.5783222660570169 -53.918027095150 +3657 0.3657 -2.5729275951874824 -53.975390295540 +3658 0.3658 -2.5675272065209325 -54.032383035460 +3659 0.3659 -2.5621211370673516 -54.089006036160 +3660 0.3660 -2.5567094237646644 -54.145260017580 +3661 0.3661 -2.5512921034788696 -54.201145698320 +3662 0.3662 -2.5458692130041682 -54.256663795710 +3663 0.3663 -2.5404407890630956 -54.311815025740 +3664 0.3664 -2.5350068683066511 -54.366600103150 +3665 0.3665 -2.5295674873144285 -54.421019741300 +3666 0.3666 -2.5241226825947467 -54.475074652340 +3667 0.3667 -2.5186724905847755 -54.528765547080 +3668 0.3668 -2.5132169476506698 -54.582093135030 +3669 0.3669 -2.5077560900876956 -54.635058124450 +3670 0.3670 -2.5022899541203598 -54.687661222270 +3671 0.3671 -2.4968185759025379 -54.739903134170 +3672 0.3672 -2.4913419915176025 -54.791784564540 +3673 0.3673 -2.4858602369785521 -54.843306216470 +3674 0.3674 -2.4803733482281385 -54.894468791800 +3675 0.3675 -2.4748813611389946 -54.945272991080 +3676 0.3676 -2.4693843115137617 -54.995719513580 +3677 0.3677 -2.4638822350852161 -55.045809057330 +3678 0.3678 -2.4583751675163965 -55.095542319060 +3679 0.3679 -2.4528631444007307 -55.144919994260 +3680 0.3680 -2.4473462012621598 -55.193942777160 +3681 0.3681 -2.4418243735552680 -55.242611360680 +3682 0.3682 -2.4362976966654064 -55.290926436550 +3683 0.3683 -2.4307662059088191 -55.338888695200 +3684 0.3684 -2.4252299365327672 -55.386498825840 +3685 0.3685 -2.4196889237156562 -55.433757516380 +3686 0.3686 -2.4141432025671601 -55.480665453540 +3687 0.3687 -2.4085928081283461 -55.527223322740 +3688 0.3688 -2.4030377753717986 -55.573431808210 +3689 0.3689 -2.3974781392017448 -55.619291592870 +3690 0.3690 -2.3919139344541769 -55.664803358490 +3691 0.3691 -2.3863451958969764 -55.709967785520 +3692 0.3692 -2.3807719582300391 -55.754785553230 +3693 0.3693 -2.3751942560853956 -55.799257339640 +3694 0.3694 -2.3696121240273369 -55.843383821530 +3695 0.3695 -2.3640255965525374 -55.887165674460 +3696 0.3696 -2.3584347080901757 -55.930603572770 +3697 0.3697 -2.3528394930020582 -55.973698189580 +3698 0.3698 -2.3472399855827404 -56.016450196780 +3699 0.3699 -2.3416362200596490 -56.058860265050 +3700 0.3700 -2.3360282305932043 -56.100929063840 +3701 0.3701 -2.3304160512769423 -56.142657261400 +3702 0.3702 -2.3247997161376333 -56.184045524780 +3703 0.3703 -2.3191792591354052 -56.225094519780 +3704 0.3704 -2.3135547141638644 -56.265804911040 +3705 0.3705 -2.3079261150502135 -56.306177361980 +3706 0.3706 -2.3022934955553747 -56.346212534800 +3707 0.3707 -2.2966568893741091 -56.385911090510 +3708 0.3708 -2.2910163301351365 -56.425273688940 +3709 0.3709 -2.2853718514012544 -56.464300988700 +3710 0.3710 -2.2797234866694582 -56.502993647220 +3711 0.3711 -2.2740712693710612 -56.541352320720 +3712 0.3712 -2.2684152328718108 -56.579377664290 +3713 0.3713 -2.2627554104720082 -56.617070331760 +3714 0.3714 -2.2570918354066301 -56.654430975800 +3715 0.3715 -2.2514245408454436 -56.691460247930 +3716 0.3716 -2.2457535598931244 -56.728158798450 +3717 0.3717 -2.2400789255893767 -56.764527276500 +3718 0.3718 -2.2344006709090496 -56.800566330040 +3719 0.3719 -2.2287188287622537 -56.836276605880 +3720 0.3720 -2.2230334319944793 -56.871658749610 +3721 0.3721 -2.2173445133867142 -56.906713405690 +3722 0.3722 -2.2116521056555589 -56.941441217420 +3723 0.3723 -2.2059562414533431 -56.975842826900 +3724 0.3724 -2.2002569533682435 -57.009918875090 +3725 0.3725 -2.1945542739243993 -57.043670001790 +3726 0.3726 -2.1888482355820278 -57.077096845640 +3727 0.3727 -2.1831388707375399 -57.110200044120 +3728 0.3728 -2.1774262117236547 -57.142980233580 +3729 0.3729 -2.1717102908095165 -57.175438049180 +3730 0.3730 -2.1659911402008105 -57.207574124940 +3731 0.3731 -2.1602687920398749 -57.239389093770 +3732 0.3732 -2.1545432784058174 -57.270883587380 +3733 0.3733 -2.1488146313146284 -57.302058236400 +3734 0.3734 -2.1430828827192951 -57.332913670260 +3735 0.3735 -2.1373480645099177 -57.363450517290 +3736 0.3736 -2.1316102085138207 -57.393669404650 +3737 0.3737 -2.1258693464956675 -57.423570958410 +3738 0.3738 -2.1201255101575729 -57.453155803480 +3739 0.3739 -2.1143787311392175 -57.482424563630 +3740 0.3740 -2.1086290410179589 -57.511377861540 +3741 0.3741 -2.1028764713089454 -57.540016318730 +3742 0.3742 -2.0971210534652283 -57.568340555610 +3743 0.3743 -2.0913628188778741 -57.596351191470 +3744 0.3744 -2.0856017988760778 -57.624048844460 +3745 0.3745 -2.0798380247272719 -57.651434131660 +3746 0.3746 -2.0740715276372397 -57.678507668980 +3747 0.3747 -2.0683023387502284 -57.705270071250 +3748 0.3748 -2.0625304891490566 -57.731721952190 +3749 0.3749 -2.0567560098552282 -57.757863924380 +3750 0.3750 -2.0509789318290421 -57.783696599340 +3751 0.3751 -2.0451992859697028 -57.809220587450 +3752 0.3752 -2.0394171031154298 -57.834436498010 +3753 0.3753 -2.0336324140435700 -57.859344939190 +3754 0.3754 -2.0278452494707064 -57.883946518080 +3755 0.3755 -2.0220556400527676 -57.908241840700 +3756 0.3756 -2.0162636163851371 -57.932231511910 +3757 0.3757 -2.0104692090027645 -57.955916135540 +3758 0.3758 -2.0046724483802718 -57.979296314310 +3759 0.3759 -1.9988733649320642 -58.002372649840 +3760 0.3760 -1.9930719890124393 -58.025145742660 +3761 0.3761 -1.9872683509156943 -58.047616192240 +3762 0.3762 -1.9814624808762342 -58.069784596960 +3763 0.3763 -1.9756544090686812 -58.091651554100 +3764 0.3764 -1.9698441656079817 -58.113217659890 +3765 0.3765 -1.9640317805495142 -58.134483509460 +3766 0.3766 -1.9582172838891967 -58.155449696890 +3767 0.3767 -1.9524007055635937 -58.176116815170 +3768 0.3768 -1.9465820754500247 -58.196485456210 +3769 0.3769 -1.9407614233666701 -58.216556210880 +3770 0.3770 -1.9349387790726771 -58.236329668980 +3771 0.3771 -1.9291141722682676 -58.255806419210 +3772 0.3772 -1.9232876325948443 -58.274987049260 +3773 0.3773 -1.9174591896350957 -58.293872145710 +3774 0.3774 -1.9116288729131037 -58.312462294130 +3775 0.3775 -1.9057967118944477 -58.330758078990 +3776 0.3776 -1.8999627359863112 -58.348760083740 +3777 0.3777 -1.8941269745375862 -58.366468890760 +3778 0.3778 -1.8882894568389796 -58.383885081370 +3779 0.3779 -1.8824502121231177 -58.401009235870 +3780 0.3780 -1.8766092695646492 -58.417841933500 +3781 0.3781 -1.8707666582803517 -58.434383752450 +3782 0.3782 -1.8649224073292368 -58.450635269850 +3783 0.3783 -1.8590765457126517 -58.466597061850 +3784 0.3784 -1.8532291023743841 -58.482269703500 +3785 0.3785 -1.8473801062007675 -58.497653768830 +3786 0.3786 -1.8415295860207825 -58.512749830870 +3787 0.3787 -1.8356775706061610 -58.527558461560 +3788 0.3788 -1.8298240886714905 -58.542080231850 +3789 0.3789 -1.8239691688743160 -58.556315711640 +3790 0.3790 -1.8181128398152431 -58.570265469820 +3791 0.3791 -1.8122551300380396 -58.583930074250 +3792 0.3792 -1.8063960680297391 -58.597310091760 +3793 0.3793 -1.8005356822207430 -58.610406088160 +3794 0.3794 -1.7946740009849229 -58.623218628240 +3795 0.3795 -1.7888110526397210 -58.635748275800 +3796 0.3796 -1.7829468654462530 -58.647995593560 +3797 0.3797 -1.7770814676094100 -58.659961143300 +3798 0.3798 -1.7712148872779585 -58.671645485730 +3799 0.3799 -1.7653471525446420 -58.683049180600 +3800 0.3800 -1.7594782914462814 -58.694172786610 +3801 0.3801 -1.7536083319638769 -58.705016861480 +3802 0.3802 -1.7477373020227074 -58.715581961910 +3803 0.3803 -1.7418652294924319 -58.725868643600 +3804 0.3804 -1.7359921421871884 -58.735877461270 +3805 0.3805 -1.7301180678656944 -58.745608968610 +3806 0.3806 -1.7242430342313464 -58.755063718350 +3807 0.3807 -1.7183670689323205 -58.764242262170 +3808 0.3808 -1.7124901995616715 -58.773145150810 +3809 0.3809 -1.7066124536574305 -58.781772934010 +3810 0.3810 -1.7007338587027054 -58.790126160490 +3811 0.3811 -1.6948544421257805 -58.798205378010 +3812 0.3812 -1.6889742313002130 -58.806011133340 +3813 0.3813 -1.6830932535449330 -58.813543972260 +3814 0.3814 -1.6772115361243416 -58.820804439570 +3815 0.3815 -1.6713291062484090 -58.827793079080 +3816 0.3816 -1.6654459910727719 -58.834510433660 +3817 0.3817 -1.6595622176988309 -58.840957045160 +3818 0.3818 -1.6536778131738499 -58.847133454460 +3819 0.3819 -1.6477928044910519 -58.853040201500 +3820 0.3820 -1.6419072185897170 -58.858677825200 +3821 0.3821 -1.6360210823552790 -58.864046863560 +3822 0.3822 -1.6301344226194210 -58.869147853600 +3823 0.3823 -1.6242472661601746 -58.873981331330 +3824 0.3824 -1.6183596397020155 -58.878547831850 +3825 0.3825 -1.6124715699159589 -58.882847889280 +3826 0.3826 -1.6065830834196553 -58.886882036790 +3827 0.3827 -1.6006942067774883 -58.890650806550 +3828 0.3828 -1.5948049665006698 -58.894154729820 +3829 0.3829 -1.5889153890473344 -58.897394336890 +3830 0.3830 -1.5830255008226359 -58.900370157080 +3831 0.3831 -1.5771353281788418 -58.903082718800 +3832 0.3832 -1.5712448974154289 -58.905532549460 +3833 0.3833 -1.5653542347791780 -58.907720175560 +3834 0.3834 -1.5594633664642685 -58.909646122630 +3835 0.3835 -1.5535723186123735 -58.911310915270 +3836 0.3836 -1.5476811173127536 -58.912715077130 +3837 0.3837 -1.5417897886023506 -58.913859130930 +3838 0.3838 -1.5358983584658825 -58.914743598430 +3839 0.3839 -1.5300068528359376 -58.915369000470 +3840 0.3840 -1.5241152975930661 -58.915735856960 +3841 0.3841 -1.5182237185658751 -58.915844686860 +3842 0.3842 -1.5123321415311231 -58.915696008180 +3843 0.3843 -1.5064405922138107 -58.915290338070 +3844 0.3844 -1.5005490962872741 -58.914628192660 +3845 0.3845 -1.4946576793732800 -58.913710087220 +3846 0.3846 -1.4887663670421150 -58.912536536080 +3847 0.3847 -1.4828751848126804 -58.911108052610 +3848 0.3848 -1.4769841581525840 -58.909425149320 +3849 0.3849 -1.4710933124782304 -58.907488337750 +3850 0.3850 -1.4652026731549164 -58.905298128530 +3851 0.3851 -1.4593122654969199 -58.902855031400 +3852 0.3852 -1.4534221147675925 -58.900159555150 +3853 0.3853 -1.4475322461794504 -58.897212207690 +3854 0.3854 -1.4416426848942665 -58.894013495990 +3855 0.3855 -1.4357534560231604 -58.890563926130 +3856 0.3856 -1.4298645846266909 -58.886864003260 +3857 0.3857 -1.4239760957149454 -58.882914231650 +3858 0.3858 -1.4180880142476304 -58.878715114650 +3859 0.3859 -1.4122003651341630 -58.874267154700 +3860 0.3860 -1.4063131732337599 -58.869570853360 +3861 0.3861 -1.4004264633555279 -58.864626711280 +3862 0.3862 -1.3945402602585548 -58.859435228180 +3863 0.3863 -1.3886545886519983 -58.853996902950 +3864 0.3864 -1.3827694731951743 -58.848312233530 +3865 0.3865 -1.3768849384976483 -58.842381716990 +3866 0.3866 -1.3710010091193237 -58.836205849500 +3867 0.3867 -1.3651177095705316 -58.829785126340 +3868 0.3868 -1.3592350643121185 -58.823120041920 +3869 0.3869 -1.3533530977555359 -58.816211089730 +3870 0.3870 -1.3474718342629288 -58.809058762410 +3871 0.3871 -1.3415912981472238 -58.801663551690 +3872 0.3872 -1.3357115136722177 -58.794025948430 +3873 0.3873 -1.3298325050526651 -58.786146442620 +3874 0.3874 -1.3239542964543671 -58.778025523340 +3875 0.3875 -1.3180769119942586 -58.769663678830 +3876 0.3876 -1.3122003757404956 -58.761061396430 +3877 0.3877 -1.3063247117125432 -58.752219162620 +3878 0.3878 -1.3004499438812616 -58.743137463010 +3879 0.3879 -1.2945760961689956 -58.733816782310 +3880 0.3880 -1.2887031924496597 -58.724257604410 +3881 0.3881 -1.2828312565488247 -58.714460412290 +3882 0.3882 -1.2769603122438062 -58.704425688080 +3883 0.3883 -1.2710903832637492 -58.694153913060 +3884 0.3884 -1.2652214932897143 -58.683645567640 +3885 0.3885 -1.2593536659547653 -58.672901131340 +3886 0.3886 -1.2534869248440548 -58.661921082870 +3887 0.3887 -1.2476212934949094 -58.650705900040 +3888 0.3888 -1.2417567953969153 -58.639256059840 +3889 0.3889 -1.2358934539920052 -58.627572038360 +3890 0.3890 -1.2300312926745423 -58.615654310900 +3891 0.3891 -1.2241703347914048 -58.603503351850 +3892 0.3892 -1.2183106036420732 -58.591119634780 +3893 0.3893 -1.2124521224787137 -58.578503632410 +3894 0.3894 -1.2065949145062627 -58.565655816610 +3895 0.3895 -1.2007390028825116 -58.552576658410 +3896 0.3896 -1.1948844107181926 -58.539266627970 +3897 0.3897 -1.1890311610770616 -58.525726194650 +3898 0.3898 -1.1831792769759817 -58.511955826950 +3899 0.3899 -1.1773287813850082 -58.497955992520 +3900 0.3900 -1.1714796972274732 -58.483727158180 +3901 0.3901 -1.1656320473800672 -58.469269789940 +3902 0.3902 -1.1597858546729227 -58.454584352950 +3903 0.3903 -1.1539411418897003 -58.439671311500 +3904 0.3904 -1.1480979317676687 -58.424531129130 +3905 0.3905 -1.1422562469977893 -58.409164268460 +3906 0.3906 -1.1364161102247994 -58.393571191340 +3907 0.3907 -1.1305775440472929 -58.377752358790 +3908 0.3908 -1.1247405710178049 -58.361708230970 +3909 0.3909 -1.1189052136428934 -58.345439267260 +3910 0.3910 -1.1130714943832218 -58.328945926170 +3911 0.3911 -1.1072394356536408 -58.312228665450 +3912 0.3912 -1.1014090598232693 -58.295287941980 +3913 0.3913 -1.0955803892155782 -58.278124211840 +3914 0.3914 -1.0897534461084708 -58.260737930310 +3915 0.3915 -1.0839282527343639 -58.243129551830 +3916 0.3916 -1.0781048312802703 -58.225299530040 +3917 0.3917 -1.0722832038878798 -58.207248317770 +3918 0.3918 -1.0664633926536398 -58.188976367030 +3919 0.3919 -1.0606454196288357 -58.170484129050 +3920 0.3920 -1.0548293068196728 -58.151772054210 +3921 0.3921 -1.0490150761873569 -58.132840592110 +3922 0.3922 -1.0432027496481728 -58.113690191570 +3923 0.3923 -1.0373923490735668 -58.094321300550 +3924 0.3924 -1.0315838962902264 -58.074734366260 +3925 0.3925 -1.0257774130801589 -58.054929835090 +3926 0.3926 -1.0199729211807733 -58.034908152620 +3927 0.3927 -1.0141704422849589 -58.014669763670 +3928 0.3928 -1.0083699980411649 -57.994215112210 +3929 0.3929 -1.0025716100534798 -57.973544641490 +3930 0.3930 -0.9967752998817099 -57.952658793910 +3931 0.3931 -0.9909810890414599 -57.931558011090 +3932 0.3932 -0.9851889990042119 -57.910242733870 +3933 0.3933 -0.9793990511974033 -57.888713402300 +3934 0.3934 -0.9736112670045053 -57.866970455660 +3935 0.3935 -0.9678256677651018 -57.845014332410 +3936 0.3936 -0.9620422747749683 -57.822845470260 +3937 0.3937 -0.9562611092861498 -57.800464306110 +3938 0.3938 -0.9504821925070388 -57.777871276110 +3939 0.3939 -0.9447055456024533 -57.755066815600 +3940 0.3940 -0.9389311896937148 -57.732051359170 +3941 0.3941 -0.9331591458587253 -57.708825340620 +3942 0.3942 -0.9273894351320453 -57.685389192980 +3943 0.3943 -0.9216220785049714 -57.661743348500 +3944 0.3944 -0.9158570969256129 -57.637888238670 +3945 0.3945 -0.9100945112989705 -57.613824294180 +3946 0.3946 -0.9043343424870119 -57.589551944990 +3947 0.3947 -0.8985766113087480 -57.565071620290 +3948 0.3948 -0.8928213385403105 -57.540383748460 +3949 0.3949 -0.8870685449150291 -57.515488757170 +3950 0.3950 -0.8813182511235066 -57.490387073280 +3951 0.3951 -0.8755704778136961 -57.465079122930 +3952 0.3952 -0.8698252455909761 -57.439565331470 +3953 0.3953 -0.8640825750182271 -57.413846123510 +3954 0.3954 -0.8583424866159075 -57.387921922880 +3955 0.3955 -0.8526050008621295 -57.361793152680 +3956 0.3956 -0.8468701381927345 -57.335460235220 +3957 0.3957 -0.8411379190013685 -57.308923592100 +3958 0.3958 -0.8354083636395565 -57.282183644140 +3959 0.3959 -0.8296814924167785 -57.255240811420 +3960 0.3960 -0.8239573256005445 -57.228095513260 +3961 0.3961 -0.8182358834164695 -57.200748168240 +3962 0.3962 -0.8125171860483474 -57.173199194200 +3963 0.3963 -0.8068012536382264 -57.145449008220 +3964 0.3964 -0.8010881062864834 -57.117498026640 +3965 0.3965 -0.7953777640518979 -57.089346665070 +3966 0.3966 -0.7896702469517264 -57.060995338360 +3967 0.3967 -0.7839655749617769 -57.032444460630 +3968 0.3968 -0.7782637680164813 -57.003694445280 +3969 0.3969 -0.7725648460089704 -56.974745704940 +3970 0.3970 -0.7668688287911478 -56.945598651510 +3971 0.3971 -0.7611757361737628 -56.916253696190 +3972 0.3972 -0.7554855879264832 -56.886711249400 +3973 0.3973 -0.7497984037779702 -56.856971720860 +3974 0.3974 -0.7441142034159492 -56.827035519560 +3975 0.3975 -0.7384330064872853 -56.796903053720 +3976 0.3976 -0.7327548325980537 -56.766574730910 +3977 0.3977 -0.7270797013136138 -56.736050957890 +3978 0.3978 -0.7214076321586818 -56.705332140750 +3979 0.3979 -0.7157386446174028 -56.674418684830 +3980 0.3980 -0.7100727581334227 -56.643310994770 +3981 0.3981 -0.7044099921099607 -56.612009474470 +3982 0.3982 -0.6987503659098812 -56.580514527120 +3983 0.3983 -0.6930938988557661 -56.548826555180 +3984 0.3984 -0.6874406102299866 -56.516945960410 +3985 0.3985 -0.6817905192747736 -56.484873143850 +3986 0.3986 -0.6761436451922901 -56.452608505820 +3987 0.3987 -0.6705000071447030 -56.420152445920 +3988 0.3988 -0.6648596242542540 -56.387505363060 +3989 0.3989 -0.6592225156033306 -56.354667655410 +3990 0.3990 -0.6535887002345365 -56.321639720470 +3991 0.3991 -0.6479581971507630 -56.288421955000 +3992 0.3992 -0.6423310253152600 -56.255014755060 +3993 0.3993 -0.6367072036517055 -56.221418516030 +3994 0.3994 -0.6310867510442765 -56.187633632550 +3995 0.3995 -0.6254696863377209 -56.153660498560 +3996 0.3996 -0.6198560283374259 -56.119499507340 +3997 0.3997 -0.6142457958094885 -56.085151051410 +3998 0.3998 -0.6086390074807855 -56.050615522650 +3999 0.3999 -0.6030356820390425 -56.015893312210 +4000 0.4000 -0.5974358381329045 -55.980984810550 +4001 0.4001 -0.5918394943720060 -55.945890407420 +4002 0.4002 -0.5862466693270395 -55.910610491910 +4003 0.4003 -0.5806573815298240 -55.875145452400 +4004 0.4004 -0.5750716494733761 -55.839495676560 +4005 0.4005 -0.5694894916119776 -55.803661551410 +4006 0.4006 -0.5639109263612451 -55.767643463240 +4007 0.4007 -0.5583359720981981 -55.731441797700 +4008 0.4008 -0.5527646471613276 -55.695056939710 +4009 0.4009 -0.5471969698506660 -55.658489273520 +4010 0.4010 -0.5416329584278550 -55.621739182700 +4011 0.4011 -0.5360726311162125 -55.584807050150 +4012 0.4012 -0.5305160061008020 -55.547693258060 +4013 0.4013 -0.5249631015285010 -55.510398187960 +4014 0.4014 -0.5194139355080670 -55.472922220720 +4015 0.4015 -0.5138685261102071 -55.435265736480 +4016 0.4016 -0.5083268913676451 -55.397429114760 +4017 0.4017 -0.5027890492751891 -55.359412734360 +4018 0.4018 -0.4972550177897991 -55.321216973440 +4019 0.4019 -0.4917248148306531 -55.282842209480 +4020 0.4020 -0.4861984582792150 -55.244288819280 +4021 0.4021 -0.4806759659793031 -55.205557178960 +4022 0.4022 -0.4751573557371546 -55.166647664010 +4023 0.4023 -0.4696426453214931 -55.127560649220 +4024 0.4024 -0.4641318524635961 -55.088296508720 +4025 0.4025 -0.4586249948573611 -55.048855615980 +4026 0.4026 -0.4531220901593716 -55.009238343810 +4027 0.4027 -0.4476231559889641 -54.969445064340 +4028 0.4028 -0.4421282099282941 -54.929476149060 +4029 0.4029 -0.4366372695224016 -54.889331968790 +4030 0.4030 -0.4311503522792776 -54.849012893690 +4031 0.4031 -0.4256674756699296 -54.808519293270 +4032 0.4032 -0.4201886571284471 -54.767851536380 +4033 0.4033 -0.4147139140520676 -54.727009991210 +4034 0.4034 -0.4092432638012421 -54.685995025300 +4035 0.4035 -0.4037767236997001 -54.644807005540 +4036 0.4036 -0.3983143110345146 -54.603446298170 +4037 0.4037 -0.3928560430561686 -54.561913268750 +4038 0.4038 -0.3874019369786181 -54.520208282260 +4039 0.4039 -0.3819520099793571 -54.478331702960 +4040 0.4040 -0.3765062791994842 -54.436283894500 +4041 0.4041 -0.3710647617437661 -54.394065219860 +4042 0.4042 -0.3656274746807021 -54.351676041420 +4043 0.4043 -0.3601944350425876 -54.309116720870 +4044 0.4044 -0.3547656598255801 -54.266387619280 +4045 0.4045 -0.3493411659897616 -54.223489097090 +4046 0.4046 -0.3439209704592041 -54.180421514060 +4047 0.4047 -0.3385050901220326 -54.137185229370 +4048 0.4048 -0.3330935418304891 -54.093780601500 +4049 0.4049 -0.3276863424009961 -54.050207988360 +4050 0.4050 -0.3222835086142201 -54.006467747160 +4051 0.4051 -0.3168850572151366 -53.962560234510 +4052 0.4052 -0.3114910049130911 -53.918485806400 +4053 0.4053 -0.3061013683818636 -53.874244818150 +4054 0.4054 -0.3007161642597311 -53.829837624500 +4055 0.4055 -0.2953354091495307 -53.785264579510 +4056 0.4056 -0.2899591196187227 -53.740526036650 +4057 0.4057 -0.2845873121994537 -53.695622348730 +4058 0.4058 -0.2792200033886186 -53.650553867970 +4059 0.4059 -0.2738572096479236 -53.605320945930 +4060 0.4060 -0.2684989474039471 -53.559923933600 +4061 0.4061 -0.2631452330482036 -53.514363181270 +4062 0.4062 -0.2577960829372066 -53.468639038670 +4063 0.4063 -0.2524515133925286 -53.422751854890 +4064 0.4064 -0.2471115407008636 -53.376701978410 +4065 0.4065 -0.2417761811140891 -53.330489757080 +4066 0.4066 -0.2364454508493281 -53.284115538140 +4067 0.4067 -0.2311193660890116 -53.237579668190 +4068 0.4068 -0.2257979429809381 -53.190882493280 +4069 0.4069 -0.2204811976383357 -53.144024358770 +4070 0.4070 -0.2151691461399242 -53.097005609460 +4071 0.4071 -0.2098618045299747 -53.049826589530 +4072 0.4072 -0.2045591888183722 -53.002487642520 +4073 0.4073 -0.1992613149806756 -52.954989111410 +4074 0.4074 -0.1939681989581787 -52.907331338530 +4075 0.4075 -0.1886798566579712 -52.859514665620 +4076 0.4076 -0.1833963039529992 -52.811539433820 +4077 0.4077 -0.1781175566821247 -52.763405983670 +4078 0.4078 -0.1728436306501877 -52.715114655070 +4079 0.4079 -0.1675745416280652 -52.666665787380 +4080 0.4080 -0.1623103053527317 -52.618059719290 +4081 0.4081 -0.1570509375273192 -52.569296788960 +4082 0.4082 -0.1517964538211767 -52.520377333890 +4083 0.4083 -0.1465468698699317 -52.471301691010 +4084 0.4084 -0.1413022012755477 -52.422070196670 +4085 0.4085 -0.1360624636063842 -52.372683186600 +4086 0.4086 -0.1308276723972576 -52.323140995930 +4087 0.4087 -0.1255978431494996 -52.273443959230 +4088 0.4088 -0.1203729913310166 -52.223592410430 +4089 0.4089 -0.1151531323763491 -52.173586682920 +4090 0.4090 -0.1099382816867296 -52.123427109470 +4091 0.4091 -0.1047284546301436 -52.073114022250 +4092 0.4092 -0.0995236665413866 -52.022647752890 +4093 0.4093 -0.0943239327221231 -51.972028632380 +4094 0.4094 -0.0891292684409461 -51.921256991160 +4095 0.4095 -0.0839396889334351 -51.870333159060 +4096 0.4096 -0.0787552094022151 -51.819257465340 +4097 0.4097 -0.0735758450170136 -51.768030238690 +4098 0.4098 -0.0684016109147186 -51.716651807210 +4099 0.4099 -0.0632325221994391 -51.665122498380 +4100 0.4100 -0.0580685939425616 -51.613442639170 +4101 0.4101 -0.0529098411828076 -51.561612555910 +4102 0.4102 -0.0477562789262916 -51.509632574410 +4103 0.4103 -0.0426079221465786 -51.457503019850 +4104 0.4104 -0.0374647857847421 -51.405224216880 +4105 0.4105 -0.0323268847494211 -51.352796489540 +4106 0.4106 -0.0271942339168786 -51.300220161310 +4107 0.4107 -0.0220668481310576 -51.247495555110 +4108 0.4108 -0.0169447422036376 -51.194622993290 +4109 0.4109 -0.0118279309140931 -51.141602797600 +4110 0.4110 -0.0067164290097511 -51.088435289240 +4111 0.4111 -0.0016102512058461 -51.035120788860 +4112 0.4112 0.0034905878144224 -50.981659616510 +4113 0.4113 0.0085860733998334 -50.928052091710 +4114 0.4114 0.0136761909310884 -50.874298533390 +4115 0.4115 0.0187609258207539 -50.820399259920 +4116 0.4116 0.0238402635132054 -50.766354589110 +4117 0.4117 0.0289141894845714 -50.712164838210 +4118 0.4118 0.0339826892426774 -50.657830323910 +4119 0.4119 0.0390457483269894 -50.603351362330 +4120 0.4120 0.0441033523085594 -50.548728269070 +4121 0.4121 0.0491554867899689 -50.493961359120 +4122 0.4122 0.0542021374052724 -50.439050946950 +4123 0.4123 0.0592432898199424 -50.383997346450 +4124 0.4124 0.0642789297308129 -50.328800870960 +4125 0.4125 0.0693090428660264 -50.273461833310 +4126 0.4126 0.0743336149849769 -50.217980545700 +4127 0.4127 0.0793526318782549 -50.162357319860 +4128 0.4128 0.0843660793675929 -50.106592466900 +4129 0.4129 0.0893739433058099 -50.050686297440 +4130 0.4130 0.0943762095767569 -49.994639121500 +4131 0.4131 0.0993728640952609 -49.938451248580 +4132 0.4132 0.1043638928070724 -49.882122987650 +4133 0.4133 0.1093492816888089 -49.825654647080 +4134 0.4134 0.1143290167479014 -49.769046534770 +4135 0.4135 0.1193030840225404 -49.712298958010 +4136 0.4136 0.1242714695816199 -49.655412223580 +4137 0.4137 0.1292341595246844 -49.598386637710 +4138 0.4138 0.1341911399818759 -49.541222506120 +4139 0.4139 0.1391423971138789 -49.483920133940 +4140 0.4140 0.1440879171118654 -49.426479825790 +4141 0.4141 0.1490276861974424 -49.368901885750 +4142 0.4142 0.1539616906225980 -49.311186617360 +4143 0.4143 0.1588899166696480 -49.253334323640 +4144 0.4144 0.1638123506511825 -49.195345307050 +4145 0.4145 0.1687289789100115 -49.137219869530 +4146 0.4146 0.1736397878191130 -49.078958312500 +4147 0.4147 0.1785447637815790 -49.020560936820 +4148 0.4148 0.1834438932305625 -48.962028042850 +4149 0.4149 0.1883371626292245 -48.903359930390 +4150 0.4150 0.1932245584706815 -48.844556898750 +4151 0.4151 0.1981060672779525 -48.785619246670 +4152 0.4152 0.2029816756039055 -48.726547272390 +4153 0.4153 0.2078513700312060 -48.667341273620 +4154 0.4154 0.2127151371722635 -48.608001547530 +4155 0.4155 0.2175729636691804 -48.548528390810 +4156 0.4156 0.2224248361936994 -48.488922099570 +4157 0.4157 0.2272707414471494 -48.429182969430 +4158 0.4158 0.2321106661603954 -48.369311295490 +4159 0.4159 0.2369445970937859 -48.309307372320 +4160 0.4160 0.2417725210371009 -48.249171493980 +4161 0.4161 0.2465944248095004 -48.188903954010 +4162 0.4162 0.2514102952594721 -48.128505045423 +4163 0.4163 0.2562201192647799 -48.067975060735 +4164 0.4164 0.2610238837324128 -48.007314291922 +4165 0.4165 0.2658215755985324 -47.946523030469 +4166 0.4166 0.2706131818284226 -47.885601567337 +4167 0.4167 0.2753986894164380 -47.824550192969 +4168 0.4168 0.2801780853859518 -47.763369197308 +4169 0.4169 0.2849513567893066 -47.702058869788 +4170 0.4170 0.2897184907077622 -47.640619499324 +4171 0.4171 0.2944794742514448 -47.579051374328 +4172 0.4172 0.2992342945592958 -47.517354782692 +4173 0.4173 0.3039829387990219 -47.455530011829 +4174 0.4174 0.3087253941670440 -47.393577348613 +4175 0.4175 0.3134616478884472 -47.331497079451 +4176 0.4176 0.3181916872169299 -47.269289490203 +4177 0.4177 0.3229154994347527 -47.206954866254 +4178 0.4178 0.3276330718526902 -47.144493492496 +4179 0.4179 0.3323443918099792 -47.081905653283 +4180 0.4180 0.3370494466742681 -47.019191632494 +4181 0.4181 0.3417482238415687 -46.956351713519 +4182 0.4182 0.3464407107362059 -46.893386179225 +4183 0.4183 0.3511268948107668 -46.830295311993 +4184 0.4184 0.3558067635460514 -46.767079393699 +4185 0.4185 0.3604803044510240 -46.703738705752 +4186 0.4186 0.3651475050627633 -46.640273529035 +4187 0.4187 0.3698083529464122 -46.576684143942 +4188 0.4188 0.3744628356951282 -46.512970830379 +4189 0.4189 0.3791109409300357 -46.449133867770 +4190 0.4190 0.3837526563001760 -46.385173535037 +4191 0.4191 0.3883879694824584 -46.321090110610 +4192 0.4192 0.3930168681816103 -46.256883872429 +4193 0.4193 0.3976393401301300 -46.192555097965 +4194 0.4194 0.4022553730882367 -46.128104064168 +4195 0.4195 0.4068649548438208 -46.063531047516 +4196 0.4196 0.4114680732123983 -45.998836324032 +4197 0.4197 0.4160647160370596 -45.934020169195 +4198 0.4198 0.4206548711884222 -45.869082858058 +4199 0.4199 0.4252385265645825 -45.804024665148 +4200 0.4200 0.4298156700910668 -45.738845864538 +4201 0.4201 0.4343862897207835 -45.673546729796 +4202 0.4202 0.4389503734339750 -45.608127534033 +4203 0.4203 0.4435079092381697 -45.542588549862 +4204 0.4204 0.4480588851681344 -45.476930049430 +4205 0.4205 0.4526032892858256 -45.411152304395 +4206 0.4206 0.4571411096803429 -45.345255585951 +4207 0.4207 0.4616723344678805 -45.279240164802 +4208 0.4208 0.4661969517916798 -45.213106311183 +4209 0.4209 0.4707149498219824 -45.146854294868 +4210 0.4210 0.4752263167559821 -45.080484385126 +4211 0.4211 0.4797310408177777 -45.013996850786 +4212 0.4212 0.4842291102583266 -44.947391960193 +4213 0.4213 0.4887205133553971 -44.880669981218 +4214 0.4214 0.4932052384135207 -44.813831181253 +4215 0.4215 0.4976832737639454 -44.746875827243 +4216 0.4216 0.5021546077645900 -44.679804185648 +4217 0.4217 0.5066192287999957 -44.612616522465 +4218 0.4218 0.5110771252812810 -44.545313103243 +4219 0.4219 0.5155282856460943 -44.477894193024 +4220 0.4220 0.5199726983585667 -44.410360056425 +4221 0.4221 0.5244103519092665 -44.342710957571 +4222 0.4222 0.5288412348151520 -44.274947160139 +4223 0.4223 0.5332653356195265 -44.207068927350 +4224 0.4224 0.5376826428919915 -44.139076521951 +4225 0.4225 0.5420931452284007 -44.070970206233 +4226 0.4226 0.5464968312508133 -44.002750242018 +4227 0.4227 0.5508936896074478 -43.934416890673 +4228 0.4228 0.5552837089726377 -43.865970413126 +4229 0.4229 0.5596668780467857 -43.797411069834 +4230 0.4230 0.5640431855563162 -43.728739120774 +4231 0.4231 0.5684126202536305 -43.659954825512 +4232 0.4232 0.5727751709170624 -43.591058443127 +4233 0.4233 0.5771308263508316 -43.522050232256 +4234 0.4234 0.5814795753849986 -43.452930451084 +4235 0.4235 0.5858214068754196 -43.383699357337 +4236 0.4236 0.5901563097037013 -43.314357208296 +4237 0.4237 0.5944842727771554 -43.244904260787 +4238 0.4238 0.5988052850287544 -43.175340771192 +4239 0.4239 0.6031193354170858 -43.105666995437 +4240 0.4240 0.6074264129263079 -43.035883189004 +4241 0.4241 0.6117265065661045 -42.965989606927 +4242 0.4242 0.6160196053716405 -42.895986503793 +4243 0.4243 0.6203056984035175 -42.825874133747 +4244 0.4244 0.6245847747477290 -42.755652750483 +4245 0.4245 0.6288568235156159 -42.685322607254 +4246 0.4246 0.6331218338438221 -42.614883956871 +4247 0.4247 0.6373797948942508 -42.544337051701 +4248 0.4248 0.6416306958540194 -42.473682143671 +4249 0.4249 0.6458745259354163 -42.402919484266 +4250 0.4250 0.6501112743758560 -42.332049324530 +4251 0.4251 0.6543409304378361 -42.261071915072 +4252 0.4252 0.6585634834088925 -42.189987506055 +4253 0.4253 0.6627789226015559 -42.118796347214 +4254 0.4254 0.6669872373533086 -42.047498687840 +4255 0.4255 0.6711884170265402 -41.976094776793 +4256 0.4256 0.6753824510085045 -41.904584862492 +4257 0.4257 0.6795693287112754 -41.832969192927 +4258 0.4258 0.6837490395717043 -41.761248015651 +4259 0.4259 0.6879215730513762 -41.689421577789 +4260 0.4260 0.6920869186365671 -41.617490126028 +4261 0.4261 0.6962450658382000 -41.545453906630 +4262 0.4262 0.7003960041918025 -41.473313165420 +4263 0.4263 0.7045397232574633 -41.401068147796 +4264 0.4264 0.7086762126197896 -41.328719098732 +4265 0.4265 0.7128054618878646 -41.256266262768 +4266 0.4266 0.7169274606952040 -41.183709884019 +4267 0.4267 0.7210421986997136 -41.111050206174 +4268 0.4268 0.7251496655836470 -41.038287472493 +4269 0.4269 0.7292498510535625 -40.965421925817 +4270 0.4270 0.7333427448402813 -40.892453808558 +4271 0.4271 0.7374283366988444 -40.819383362706 +4272 0.4272 0.7415066164084713 -40.746210829830 +4273 0.4273 0.7455775737725167 -40.672936451077 +4274 0.4274 0.7496411986184288 -40.599560467167 +4275 0.4275 0.7536974807977078 -40.526083118412 +4276 0.4276 0.7577464101858631 -40.452504644693 +4277 0.4277 0.7617879766823716 -40.378825285477 +4278 0.4278 0.7658221702106363 -40.305045279816 +4279 0.4279 0.7698489807179438 -40.231164866336 +4280 0.4280 0.7738683981754235 -40.157184283257 +4281 0.4281 0.7778804125780052 -40.083103768376 +4282 0.4282 0.7818850139443779 -40.008923559079 +4283 0.4283 0.7858821923169488 -39.934643892337 +4284 0.4284 0.7898719377618009 -39.860265004705 +4285 0.4285 0.7938542403686526 -39.785787132330 +4286 0.4286 0.7978290902508164 -39.711210510945 +4287 0.4287 0.8017964775451573 -39.636535375872 +4288 0.4288 0.8057563924120519 -39.561761962020 +4289 0.4289 0.8097088250353476 -39.486890503894 +4290 0.4290 0.8136537656223215 -39.411921235585 +4291 0.4291 0.8175912044036397 -39.336854390780 +4292 0.4292 0.8215211316333165 -39.261690202755 +4293 0.4293 0.8254435375886734 -39.186428904383 +4294 0.4294 0.8293584125702989 -39.111070728127 +4295 0.4295 0.8332657469020076 -39.035615906049 +4296 0.4296 0.8371655309308003 -38.960064669805 +4297 0.4297 0.8410577550268229 -38.884417250648 +4298 0.4298 0.8449424095833264 -38.808673879423 +4299 0.4299 0.8488194850166269 -38.732834786584 +4300 0.4300 0.8526889717660646 -38.656900202172 +4301 0.4301 0.8565508602939650 -38.580870355835 +4302 0.4302 0.8604051410855976 -38.504745476817 +4303 0.4303 0.8642518046491369 -38.428525793967 +4304 0.4304 0.8680908415156218 -38.352211535731 +4305 0.4305 0.8719222422389162 -38.275802930158 +4306 0.4306 0.8757459973956693 -38.199300204903 +4307 0.4307 0.8795620975852755 -38.122703587222 +4308 0.4308 0.8833705334298355 -38.046013303978 +4309 0.4309 0.8871712955741161 -37.969229581635 +4310 0.4310 0.8909643746855112 -37.892352646265 +4311 0.4311 0.8947497614540021 -37.815382723553 +4312 0.4312 0.8985274465921187 -37.738320038780 +4313 0.4313 0.9022974208348998 -37.661164816842 +4314 0.4314 0.9060596749398541 -37.583917282243 +4315 0.4315 0.9098141996869210 -37.506577659096 +4316 0.4316 0.9135609858784320 -37.429146171124 +4317 0.4317 0.9173000243390713 -37.351623041661 +4318 0.4318 0.9210313059158370 -37.274008493654 +4319 0.4319 0.9247548214780028 -37.196302749661 +4320 0.4320 0.9284705619170784 -37.118506031851 +4321 0.4321 0.9321785181467717 -37.040618562013 +4322 0.4322 0.9358786811029495 -36.962640561543 +4323 0.4323 0.9395710417435996 -36.884572251459 +4324 0.4324 0.9432555910487921 -36.806413852390 +4325 0.4325 0.9469323200206408 -36.728165584583 +4326 0.4326 0.9506012196832652 -36.649827667905 +4327 0.4327 0.9542622810827524 -36.571400321838 +4328 0.4328 0.9579154952871184 -36.492883765483 +4329 0.4329 0.9615608533862706 -36.414278217562 +4330 0.4330 0.9651983464919696 -36.335583896416 +4331 0.4331 0.9688279657377907 -36.256801020007 +4332 0.4332 0.9724497022790870 -36.177929805918 +4333 0.4333 0.9760635472929506 -36.098970471355 +4334 0.4334 0.9796694919781758 -36.019923233147 +4335 0.4335 0.9832675275552205 -35.940788307748 +4336 0.4336 0.9868576452661695 -35.861565911231 +4337 0.4337 0.9904398363746961 -35.782256259301 +4338 0.4338 0.9940140921660254 -35.702859567285 +4339 0.4339 0.9975804039468964 -35.623376050135 +4340 0.4340 1.0011387630455248 -35.543805922433 +4341 0.4341 1.0046891608115658 -35.464149398387 +4342 0.4342 1.0082315886160769 -35.384406691835 +4343 0.4343 1.0117660378514808 -35.304578016243 +4344 0.4344 1.0152924999315283 -35.224663584706 +4345 0.4345 1.0188109662912610 -35.144663609951 +4346 0.4346 1.0223214283869753 -35.064578304336 +4347 0.4347 1.0258238776961845 -34.984407879850 +4348 0.4348 1.0293183057175828 -34.904152548112 +4349 0.4349 1.0328047039710073 -34.823812520381 +4350 0.4350 1.0362830639974037 -34.743388007547 +4351 0.4351 1.0397533773587873 -34.662879220127 +4352 0.4352 1.0432156356382078 -34.582286368287 +4353 0.4353 1.0466698304397131 -34.501609661817 +4354 0.4354 1.0501159533883113 -34.420849310150 +4355 0.4355 1.0535539961299365 -34.340005522354 +4356 0.4356 1.0569839503314109 -34.259078507134 +4357 0.4357 1.0604058076804095 -34.178068472836 +4358 0.4358 1.0638195598854234 -34.096975627442 +4359 0.4359 1.0672251986757244 -34.015800178579 +4360 0.4360 1.0706227158013288 -33.934542333509 +4361 0.4361 1.0740121030329612 -33.853202299138 +4362 0.4362 1.0773933521620187 -33.771780282013 +4363 0.4363 1.0807664550005356 -33.690276488324 +4364 0.4364 1.0841314033811469 -33.608691123904 +4365 0.4365 1.0874881891570536 -33.527024394230 +4366 0.4366 1.0908368042019863 -33.445276504423 +4367 0.4367 1.0941772404101699 -33.363447659251 +4368 0.4368 1.0975094896962887 -33.281538063124 +4369 0.4369 1.1008335439954500 -33.199547920102 +4370 0.4370 1.1041493952631496 -33.117477433891 +4371 0.4371 1.1074570354752362 -33.035326807843 +4372 0.4372 1.1107564566278765 -32.953096244961 +4373 0.4373 1.1140476507375194 -32.870785947896 +4374 0.4374 1.1173306098408615 -32.788396118946 +4375 0.4375 1.1206053259948121 -32.705926960066 +4376 0.4376 1.1238717912764582 -32.623378672856 +4377 0.4377 1.1271299977830294 -32.540751458568 +4378 0.4378 1.1303799376318633 -32.458045518110 +4379 0.4379 1.1336216029603707 -32.375261052038 +4380 0.4380 1.1368549859260011 -32.292398260567 +4381 0.4381 1.1400800787062075 -32.209457343562 +4382 0.4382 1.1432968734984128 -32.126438500544 +4383 0.4383 1.1465053625199744 -32.043341930689 +4384 0.4384 1.1497055380081502 -31.960167832830 +4385 0.4385 1.1528973922200645 -31.876916405456 +4386 0.4386 1.1560809174326729 -31.793587846713 +4387 0.4387 1.1592561059427289 -31.710182354407 +4388 0.4388 1.1624229500667493 -31.626700126001 +4389 0.4389 1.1655814421409800 -31.543141358614 +4390 0.4390 1.1687315745213624 -31.459506249033 +4391 0.4391 1.1718733395834990 -31.375794993698 +4392 0.4392 1.1750067297226197 -31.292007788713 +4393 0.4393 1.1781317373535476 -31.208144829844 +4394 0.4394 1.1812483549106656 -31.124206312518 +4395 0.4395 1.1843565748478828 -31.040192431826 +4396 0.4396 1.1874563896386003 -30.956103382523 +4397 0.4397 1.1905477917756777 -30.871939359026 +4398 0.4398 1.1936307737714000 -30.787700555420 +4399 0.4399 1.1967053281574438 -30.703387165454 +4400 0.4400 1.1997714474848435 -30.618999382539 +4401 0.4401 1.2028291243239586 -30.534537399761 +4402 0.4402 1.2058783512644400 -30.450001409867 +4403 0.4403 1.2089191209151970 -30.365391605273 +4404 0.4404 1.2119514259043640 -30.280708178066 +4405 0.4405 1.2149752588792673 -30.195951320000 +4406 0.4406 1.2179906125063922 -30.111121222498 +4407 0.4407 1.2209974794713498 -30.026218076655 +4408 0.4408 1.2239958524788443 -29.941242073235 +4409 0.4409 1.2269857242526399 -29.856193402677 +4410 0.4410 1.2299670875355282 -29.771072255088 +4411 0.4411 1.2329399350892951 -29.685878820250 +4412 0.4412 1.2359042596946885 -29.600613287619 +4413 0.4413 1.2388600541513857 -29.515275846325 +4414 0.4414 1.2418073112779604 -29.429866685171 +4415 0.4415 1.2447460239118506 -29.344385992633 +4416 0.4416 1.2476761849093256 -29.258833956868 +4417 0.4417 1.2505977871454543 -29.173210765707 +4418 0.4418 1.2535108235140726 -29.087516606659 +4419 0.4419 1.2564152869277510 -29.001751666907 +4420 0.4420 1.2593111703177620 -28.915916133315 +4421 0.4421 1.2621984666340491 -28.830010192426 +4422 0.4422 1.2650771688451936 -28.744034030462 +4423 0.4423 1.2679472699383829 -28.657987833322 +4424 0.4424 1.2708087629193787 -28.571871786592 +4425 0.4425 1.2736616408124850 -28.485686075533 +4426 0.4426 1.2765058966605161 -28.399430885088 +4427 0.4427 1.2793415235247647 -28.313106399886 +4428 0.4428 1.2821685144849708 -28.226712804238 +4429 0.4429 1.2849868626392895 -28.140250282135 +4430 0.4430 1.2877965611042592 -28.053719017258 +4431 0.4431 1.2905976030147703 -27.967119192964 +4432 0.4432 1.2933899815240337 -27.880450992304 +4433 0.4433 1.2961736898035494 -27.793714598010 +4434 0.4434 1.2989487210430750 -27.706910192502 +4435 0.4435 1.3017150684505943 -27.620037957885 +4436 0.4436 1.3044727252522861 -27.533098075951 +4437 0.4437 1.3072216846924929 -27.446090728185 +4438 0.4438 1.3099619400336899 -27.359016095757 +4439 0.4439 1.3126934845564542 -27.271874359526 +4440 0.4440 1.3154163115594326 -27.184665700041 +4441 0.4441 1.3181304143593120 -27.097390297545 +4442 0.4442 1.3208357862907874 -27.010048331963 +4443 0.4443 1.3235324207065315 -26.922639982923 +4444 0.4444 1.3262203109771646 -26.835165429737 +4445 0.4445 1.3288994504912222 -26.747624851413 +4446 0.4446 1.3315698326551253 -26.660018426650 +4447 0.4447 1.3342314508931499 -26.572346333843 +4448 0.4448 1.3368842986473959 -26.484608751079 +4449 0.4449 1.3395283693777571 -26.396805856144 +4450 0.4450 1.3421636565618900 -26.308937826515 +4451 0.4451 1.3447901536951841 -26.221004839367 +4452 0.4452 1.3474078542907311 -26.133007071573 +4453 0.4453 1.3500167518792947 -26.044944699700 +4454 0.4454 1.3526168400092804 -25.956817900013 +4455 0.4455 1.3552081122467052 -25.868626848482 +4456 0.4456 1.3577905621751676 -25.780371720767 +4457 0.4457 1.3603641833958173 -25.692052692229 +4458 0.4458 1.3629289695273255 -25.603669937934 +4459 0.4459 1.3654849142058543 -25.515223632644 +4460 0.4460 1.3680320110850277 -25.426713950823 +4461 0.4461 1.3705702538359008 -25.338141066640 +4462 0.4462 1.3730996361469308 -25.249505153959 +4463 0.4463 1.3756201517239464 -25.160806386352 +4464 0.4464 1.3781317942901188 -25.072044937095 +4465 0.4465 1.3806345575859318 -24.983220979164 +4466 0.4466 1.3831284353691522 -24.894334685244 +4467 0.4467 1.3856134214148004 -24.805386227719 +4468 0.4468 1.3880895095151204 -24.716375778683 +4469 0.4469 1.3905566934795512 -24.627303509934 +4470 0.4470 1.3930149671346970 -24.538169592979 +4471 0.4471 1.3954643243242975 -24.448974199029 +4472 0.4472 1.3979047589091991 -24.359717499003 +4473 0.4473 1.4003362647673256 -24.270399663529 +4474 0.4474 1.4027588357936494 -24.181020862946 +4475 0.4475 1.4051724659001614 -24.091581267296 +4476 0.4476 1.4075771490158431 -24.002081046339 +4477 0.4477 1.4099728790866370 -23.912520369539 +4478 0.4478 1.4123596500754176 -23.822899406072 +4479 0.4479 1.4147374559619625 -23.733218324827 +4480 0.4480 1.4171062907429242 -23.643477294405 +4481 0.4481 1.4194661484318003 -23.553676483116 +4482 0.4482 1.4218170230589056 -23.463816058989 +4483 0.4483 1.4241589086713431 -23.373896189762 +4484 0.4484 1.4264917993329755 -23.283917042886 +4485 0.4485 1.4288156891243964 -23.193878785530 +4486 0.4486 1.4311305721429017 -23.103781584577 +4487 0.4487 1.4334364425024619 -23.013625606626 +4488 0.4488 1.4357332943336927 -22.923411017989 +4489 0.4489 1.4380211217838272 -22.833137984700 +4490 0.4490 1.4402999190166874 -22.742806672503 +4491 0.4491 1.4425696802126560 -22.652417246870 +4492 0.4492 1.4448303995686487 -22.561969872982 +4493 0.4493 1.4470820712980850 -22.471464715742 +4494 0.4494 1.4493246896308607 -22.380901939774 +4495 0.4495 1.4515582488133203 -22.290281709418 +4496 0.4496 1.4537827431082280 -22.199604188737 +4497 0.4497 1.4559981667947406 -22.108869541515 +4498 0.4498 1.4582045141683793 -22.018077931257 +4499 0.4499 1.4604017795410016 -21.927229521189 +4500 0.4500 1.4625899572407739 -21.836324474257 +4501 0.4501 1.4647690416121362 -21.745362952987 +4502 0.4502 1.4669390270156772 -21.654345117834 +4503 0.4503 1.4690999078278497 -21.563271125616 +4504 0.4504 1.4712516784406031 -21.472141129452 +4505 0.4505 1.4733943332610195 -21.380955278875 +4506 0.4506 1.4755278667109604 -21.289713719941 +4507 0.4507 1.4776522732267230 -21.198416595310 +4508 0.4508 1.4797675472587069 -21.107064044367 +4509 0.4509 1.4818736832710908 -21.015656203312 +4510 0.4510 1.4839706757415196 -20.924193205265 +4511 0.4511 1.4860585191608009 -20.832675180359 +4512 0.4512 1.4881372080326114 -20.741102255849 +4513 0.4513 1.4902067368732137 -20.649474556197 +4514 0.4514 1.4922671002111823 -20.557792203176 +4515 0.4515 1.4943182925871397 -20.466055315973 +4516 0.4516 1.4963603085535018 -20.374264011267 +4517 0.4517 1.4983931426742325 -20.282418403346 +4518 0.4518 1.5004167895246088 -20.190518604179 +4519 0.4519 1.5024312436909943 -20.098564723531 +4520 0.4520 1.5044364997706230 -20.006556869040 +4521 0.4521 1.5064325523713908 -19.914495146318 +4522 0.4522 1.5084193961116585 -19.822379659037 +4523 0.4523 1.5103970256200618 -19.730210509029 +4524 0.4524 1.5123654355353318 -19.637987796369 +4525 0.4525 1.5143246205061232 -19.545711619461 +4526 0.4526 1.5162745751908533 -19.453382075141 +4527 0.4527 1.5182152942575478 -19.360999258749 +4528 0.4528 1.5201467723836970 -19.268563264234 +4529 0.4529 1.5220690042561198 -19.176074184223 +4530 0.4530 1.5239819845708371 -19.083532110123 +4531 0.4531 1.5258857080329531 -18.990937132197 +4532 0.4532 1.5277801693565454 -18.898289339648 +4533 0.4533 1.5296653632645638 -18.805588820719 +4534 0.4534 1.5315412844887375 -18.712835662756 +4535 0.4535 1.5334079277694905 -18.620029952303 +4536 0.4536 1.5352652878558648 -18.527171775182 +4537 0.4537 1.5371133595054527 -18.434261216577 +4538 0.4538 1.5389521374843369 -18.341298361108 +4539 0.4539 1.5407816165670385 -18.248283292923 +4540 0.4540 1.5426017915364729 -18.155216095765 +4541 0.4541 1.5444126571839143 -18.062096853064 +4542 0.4542 1.5462142083089676 -17.968925648002 +4543 0.4543 1.5480064397195479 -17.875702563603 +4544 0.4544 1.5497893462318684 -17.782427682807 +4545 0.4545 1.5515629226704355 -17.689101088537 +4546 0.4546 1.5533271638680517 -17.595722863789 +4547 0.4547 1.5550820646658261 -17.502293091697 +4548 0.4548 1.5568276199131919 -17.408811855618 +4549 0.4549 1.5585638244679325 -17.315279239194 +4550 0.4550 1.5602906731962138 -17.221695326433 +4551 0.4551 1.5620081609726242 -17.128060201775 +4552 0.4552 1.5637162826802218 -17.034373950179 +4553 0.4553 1.5654150332105896 -16.940636657176 +4554 0.4554 1.5671044074638960 -16.846848408951 +4555 0.4555 1.5687844003489639 -16.753009292409 +4556 0.4556 1.5704550067833467 -16.659119395248 +4557 0.4557 1.5721162216934101 -16.565178806022 +4558 0.4558 1.5737680400144221 -16.471187614215 +4559 0.4559 1.5754104566906482 -16.377145910309 +4560 0.4560 1.5770434666754558 -16.283053785844 +4561 0.4561 1.5786670649314225 -16.188911333492 +4562 0.4562 1.5802812464304530 -16.094718647117 +4563 0.4563 1.5818860061539011 -16.000475821845 +4564 0.4564 1.5834813390926996 -15.906182954124 +4565 0.4565 1.5850672402474955 -15.811840141795 +4566 0.4566 1.5866437046287925 -15.717447484143 +4567 0.4567 1.5882107272570982 -15.623005081973 +4568 0.4568 1.5897683031630800 -15.528513037662 +4569 0.4569 1.5913164273877243 -15.433971455224 +4570 0.4570 1.5928550949825044 -15.339380440379 +4571 0.4571 1.5943843010095531 -15.244740100593 +4572 0.4572 1.5959040405418405 -15.150050545156 +4573 0.4573 1.5974143086633601 -15.055311885237 +4574 0.4574 1.5989151004693187 -14.960524233935 +4575 0.4575 1.6004064110663325 -14.865687706342 +4576 0.4576 1.6018882355726298 -14.770802419605 +4577 0.4577 1.6033605691182584 -14.675868492968 +4578 0.4578 1.6048234068452991 -14.580886047847 +4579 0.4579 1.6062767439080847 -14.485855207867 +4580 0.4580 1.6077205754734245 -14.390776098928 +4581 0.4581 1.6091548967208338 -14.295648849258 +4582 0.4582 1.6105797028427697 -14.200473589460 +4583 0.4583 1.6119949890448713 -14.105250452572 +4584 0.4584 1.6134007505462058 -14.009979574118 +4585 0.4585 1.6147969825795192 -13.914661092151 +4586 0.4586 1.6161836803914928 -13.819295147321 +4587 0.4587 1.6175608392430043 -13.723881882908 +4588 0.4588 1.6189284544093938 -13.628421444880 +4589 0.4589 1.6202865211807351 -13.532913981948 +4590 0.4590 1.6216350348621125 -13.437359645601 +4591 0.4591 1.6229739907739007 -13.341758590163 +4592 0.4592 1.6243033842520511 -13.246110972846 +4593 0.4593 1.6256232106483823 -13.150416953779 +4594 0.4594 1.6269334653308751 -13.054676696075 +4595 0.4595 1.6282341436839718 -12.958890365859 +4596 0.4596 1.6295252411088812 -12.863058132330 +4597 0.4597 1.6308067530238872 -12.767180167789 +4598 0.4598 1.6320786748646614 -12.671256647693 +4599 0.4599 1.6333410020845811 -12.575287750701 +4600 0.4600 1.6345937301550515 -12.479273658706 +4601 0.4601 1.6358368545658313 -12.383214556888 +4602 0.4602 1.6370703708253631 -12.287110633749 +4603 0.4603 1.6382942744611084 -12.190962081156 +4604 0.4604 1.6395085610198856 -12.094769094388 +4605 0.4605 1.6407132260682131 -11.998531872160 +4606 0.4606 1.6419082651926551 -11.902250616681 +4607 0.4607 1.6430936740001731 -11.805925533682 +4608 0.4608 1.6442694481184803 -11.709556832459 +4609 0.4609 1.6454355831963985 -11.613144725904 +4610 0.4610 1.6465920749042213 -11.516689430551 +4611 0.4611 1.6477389189340792 -11.420191166608 +4612 0.4612 1.6488761110003092 -11.323650157993 +4613 0.4613 1.6500036468398274 -11.227066632372 +4614 0.4614 1.6511215222125055 -11.130440821192 +4615 0.4615 1.6522297329015507 -11.033772959714 +4616 0.4616 1.6533282747138891 -10.937063287052 +4617 0.4617 1.6544171434805519 -10.840312046203 +4618 0.4618 1.6554963350570662 -10.743519484080 +4619 0.4619 1.6565658453238474 -10.646685851545 +4620 0.4620 1.6576256701865966 -10.549811403437 +4621 0.4621 1.6586758055766990 -10.452896398612 +4622 0.4622 1.6597162474516278 -10.355941099965 +4623 0.4623 1.6607469917953495 -10.258945774466 +4624 0.4624 1.6617680346187320 -10.161910693184 +4625 0.4625 1.6627793719599575 -10.064836131324 +4626 0.4626 1.6637809998849360 -9.967722368245 +4627 0.4627 1.6647729144877232 -9.870569687502 +4628 0.4628 1.6657551118909411 -9.773378376856 +4629 0.4629 1.6667275882461998 -9.676148728320 +4630 0.4630 1.6676903397345244 -9.578881038171 +4631 0.4631 1.6686433625667820 -9.481575606981 +4632 0.4632 1.6695866529841132 -9.384232739645 +4633 0.4633 1.6705202072583656 -9.286852745403 +4634 0.4634 1.6714440216925288 -9.189435937863 +4635 0.4635 1.6723580926211736 -9.091982635032 +4636 0.4636 1.6732624164108916 -8.994493159328 +4637 0.4637 1.6741569894607387 -8.896967837615 +4638 0.4638 1.6750418082026801 -8.799407001214 +4639 0.4639 1.6759168691020376 -8.701810985936 +4640 0.4640 1.6767821686579394 -8.604180132097 +4641 0.4641 1.6776377034037711 -8.506514784536 +4642 0.4642 1.6784834699076303 -8.408815292648 +4643 0.4643 1.6793194647727820 -8.311082010385 +4644 0.4644 1.6801456846381160 -8.213315296293 +4645 0.4645 1.6809621261786067 -8.115515513521 +4646 0.4646 1.6817687861057748 -8.017683029841 +4647 0.4647 1.6825656611681505 -7.919818217673 +4648 0.4648 1.6833527481517387 -7.821921454089 +4649 0.4649 1.6841300438804852 -7.723993120841 +4650 0.4650 1.6848975452167461 -7.626033604376 +4651 0.4651 1.6856552490617571 -7.528043295846 +4652 0.4652 1.6864031523561060 -7.430022591131 +4653 0.4653 1.6871412520802052 -7.331971890850 +4654 0.4654 1.6878695452547663 -7.233891600373 +4655 0.4655 1.6885880289412771 -7.135782129845 +4656 0.4656 1.6892967002424788 -7.037643894188 +4657 0.4657 1.6899955563028441 -6.939477313120 +4658 0.4658 1.6906845943090585 -6.841282811167 +4659 0.4659 1.6913638114905007 -6.743060817677 +4660 0.4660 1.6920332051197260 -6.644811766829 +4661 0.4661 1.6926927725129497 -6.546536097646 +4662 0.4662 1.6933425110305320 -6.448234254001 +4663 0.4663 1.6939824180774641 -6.349906684639 +4664 0.4664 1.6946124911038547 -6.251553843174 +4665 0.4665 1.6952327276054187 -6.153176188106 +4666 0.4666 1.6958431251239652 -6.054774182824 +4667 0.4667 1.6964436812478880 -5.956348295631 +4668 0.4668 1.6970343936126560 -5.857898999727 +4669 0.4669 1.6976152599013039 -5.759426773231 +4670 0.4670 1.6981862778449253 -5.660932099196 +4671 0.4671 1.6987474452231650 -5.562415465599 +4672 0.4672 1.6992987598647127 -5.463877365355 +4673 0.4673 1.6998402196477966 -5.365318296326 +4674 0.4674 1.7003718225006792 -5.266738761326 +4675 0.4675 1.7008935664021512 -5.168139268115 +4676 0.4676 1.7014054493820281 -5.069520329423 +4677 0.4677 1.7019074695216461 -4.970882462935 +4678 0.4678 1.7023996249543583 -4.872226191310 +4679 0.4679 1.7028819138660323 -4.773552042171 +4680 0.4680 1.7033543344955469 -4.674860548119 +4681 0.4681 1.7038168851352895 -4.576152246733 +4682 0.4682 1.7042695641316545 -4.477427680566 +4683 0.4683 1.7047123698855406 -4.378687397154 +4684 0.4684 1.7051453008528490 -4.279931949014 +4685 0.4685 1.7055683555449819 -4.181161893644 +4686 0.4686 1.7059815325293404 -4.082377793525 +4687 0.4687 1.7063848304298226 -3.983580216121 +4688 0.4688 1.7067782479273228 -3.884769733882 +4689 0.4689 1.7071617837602284 -3.785946924231 +4690 0.4690 1.7075354367249191 -3.687112369582 +4691 0.4691 1.7078992056762643 -3.588266657319 +4692 0.4692 1.7082530895281207 -3.489410379808 +4693 0.4693 1.7085970872538307 -3.390544134392 +4694 0.4694 1.7089311978867192 -3.291668523378 +4695 0.4695 1.7092554205205905 -3.192784154049 +4696 0.4696 1.7095697543102255 -3.093891638649 +4697 0.4697 1.7098741984718773 -2.994991594385 +4698 0.4698 1.7101687522837676 -2.896084643424 +4699 0.4699 1.7104534150865829 -2.797171412880 +4700 0.4700 1.7107281862839678 -2.698252534817 +4701 0.4701 1.7109930653430205 -2.599328646239 +4702 0.4702 1.7112480517947872 -2.500400389094 +4703 0.4703 1.7114931452347544 -2.401468410248 +4704 0.4704 1.7117283453233416 -2.302533361497 +4705 0.4705 1.7119536517863942 -2.203595899554 +4706 0.4706 1.7121690644156740 -2.104656686038 +4707 0.4707 1.7123745830693493 -2.005716387471 +4708 0.4708 1.7125702076724865 -1.906775675271 +4709 0.4709 1.7127559382175368 -1.807835225737 +4710 0.4710 1.7129317747648261 -1.708895720046 +4711 0.4711 1.7130977174430404 -1.609957844240 +4712 0.4712 1.7132537664497134 -1.511022289221 +4713 0.4713 1.7133999220517115 -1.412089750741 +4714 0.4714 1.7135361845857178 -1.313160929385 +4715 0.4715 1.7136625544587154 -1.214236530568 +4716 0.4716 1.7137790321484696 -1.115317264518 +4717 0.4717 1.7138856182040090 -1.016403846271 +4718 0.4718 1.7139823132461054 -0.917496995659 +4719 0.4719 1.7140691179677527 -0.818597437290 +4720 0.4720 1.7141460331346445 -0.719705900544 +4721 0.4721 1.7142130595856497 -0.620823119558 +4722 0.4722 1.7142701982332882 -0.521949833211 +4723 0.4723 1.7143174500642044 -0.423086785115 +4724 0.4724 1.7143548161396400 -0.324234723598 +4725 0.4725 1.7143822975959044 -0.225394401690 +4726 0.4726 1.7143998956448445 -0.126566577112 +4727 0.4727 1.7144076115743130 -0.027752012259 +4728 0.4728 1.7144054467486349 0.071048525820 +4729 0.4729 1.7143934026090728 0.169834265423 +4730 0.4730 1.7143714806742905 0.268604430226 +4731 0.4731 1.7143396825408146 0.367358239290 +4732 0.4732 1.7142980098834961 0.466094907078 +4733 0.4733 1.7142464644559685 0.564813643476 +4734 0.4734 1.7141850480911045 0.663513653802 +4735 0.4735 1.7141137627014726 0.762194138833 +4736 0.4736 1.7140326102797905 0.860854294812 +4737 0.4737 1.7139415928993760 0.959493313476 +4738 0.4738 1.7138407127145989 1.058110382065 +4739 0.4739 1.7137299719613284 1.156704683346 +4740 0.4740 1.7136093729573798 1.255275395627 +4741 0.4741 1.7134789181029593 1.353821692782 +4742 0.4742 1.7133386098811070 1.452342744266 +4743 0.4743 1.7131884508581370 1.550837715132 +4744 0.4744 1.7130284436840775 1.649305766057 +4745 0.4745 1.7128585910931067 1.747746053358 +4746 0.4746 1.7126788959039878 1.846157729018 +4747 0.4747 1.7124893610205023 1.944539940693 +4748 0.4748 1.7122899894318802 2.042891831749 +4749 0.4749 1.7120807842132288 2.141212541275 +4750 0.4750 1.7118617485259600 2.239501204102 +4751 0.4751 1.7116328856182133 2.337756950831 +4752 0.4752 1.7113941988252790 2.435978907855 +4753 0.4753 1.7111456915700176 2.534166197373 +4754 0.4754 1.7108873673632778 2.632317937422 +4755 0.4755 1.7106192298043121 2.730433241894 +4756 0.4756 1.7103412825811892 2.828511220563 +4757 0.4757 1.7100535294712058 2.926550979107 +4758 0.4758 1.7097559743412942 3.024551619125 +4759 0.4759 1.7094486211484294 3.122512238173 +4760 0.4760 1.7091314739400318 3.220431929781 +4761 0.4761 1.7088045368543689 3.318309783475 +4762 0.4762 1.7084678141209548 3.416144884807 +4763 0.4763 1.7081213100609454 3.513936315381 +4764 0.4764 1.7077650290875328 3.611683152871 +4765 0.4765 1.7073989757063368 3.709384471050 +4766 0.4766 1.7070231545157935 3.807039339817 +4767 0.4767 1.7066375702075416 3.904646825222 +4768 0.4768 1.7062422275668059 4.002205989494 +4769 0.4769 1.7058371314727783 4.099715891060 +4770 0.4770 1.7054222868989961 4.197175584581 +4771 0.4771 1.7049976989137186 4.294584120971 +4772 0.4772 1.7045633726802984 4.391940547432 +4773 0.4773 1.7041193134575532 4.489243907474 +4774 0.4774 1.7036655266001324 4.586493240942 +4775 0.4775 1.7032020175588822 4.683687584060 +4776 0.4776 1.7027287918812080 4.780825969426 +4777 0.4777 1.7022458552114328 4.877907426077 +4778 0.4778 1.7017532132911544 4.974930979490 +4779 0.4779 1.7012508719595985 5.071895651629 +4780 0.4780 1.7007388371539689 5.168800460962 +4781 0.4781 1.7002171149097962 5.265644422491 +4782 0.4782 1.6996857113612822 5.362426547789 +4783 0.4783 1.6991446327416415 5.459145845023 +4784 0.4784 1.6985938853834412 5.555801318983 +4785 0.4785 1.6980334757189364 5.652391971116 +4786 0.4786 1.6974634102804029 5.748916799553 +4787 0.4787 1.6968836957004680 5.845374799144 +4788 0.4788 1.6962943387124370 5.941764961479 +4789 0.4789 1.6956953461506166 6.038086274930 +4790 0.4790 1.6950867249506365 6.134337724672 +4791 0.4791 1.6944684821497669 6.230518292720 +4792 0.4792 1.6938406248872329 6.326626957958 +4793 0.4793 1.6932031604045261 6.422662696175 +4794 0.4794 1.6925560960457131 6.518624480085 +4795 0.4795 1.6918994392577404 6.614511279370 +4796 0.4796 1.6912331975907362 6.710322060713 +4797 0.4797 1.6905573786983097 6.806055787817 +4798 0.4798 1.6898719903378463 6.901711421453 +4799 0.4799 1.6891770403707997 6.997287919480 +4800 0.4800 1.6884725367629814 7.092784236886 +4801 0.4801 1.6877584875848461 7.188199325819 +4802 0.4802 1.6870349010117744 7.283532135615 +4803 0.4803 1.6863017853243518 7.378781612838 +4804 0.4804 1.6855591489086446 7.473946701308 +4805 0.4805 1.6848070002564721 7.569026342142 +4806 0.4806 1.6840453479656763 7.664019473775 +4807 0.4807 1.6832742007403869 7.758925032011 +4808 0.4808 1.6824935673912844 7.853741950037 +4809 0.4809 1.6817034568358589 7.948469158474 +4810 0.4810 1.6809038780986649 8.043105585407 +4811 0.4811 1.6800948403115741 8.137650156412 +4812 0.4812 1.6792763527140235 8.232101794597 +4813 0.4813 1.6784484246532616 8.326459420641 +4814 0.4814 1.6776110655845886 8.420721952817 +4815 0.4815 1.6767642850715958 8.514888307039 +4816 0.4816 1.6759080927863994 8.608957396889 +4817 0.4817 1.6750424985098720 8.702928133659 +4818 0.4818 1.6741675121318702 8.796799426377 +4819 0.4819 1.6732831436514586 8.890570181854 +4820 0.4820 1.6723894031771303 8.984239304712 +4821 0.4821 1.6714863009270235 9.077805697424 +4822 0.4822 1.6705738472291352 9.171268260344 +4823 0.4823 1.6696520525215304 9.264625891753 +4824 0.4824 1.6687209273525485 9.357877487884 +4825 0.4825 1.6677804823810058 9.451021942971 +4826 0.4826 1.6668307283763937 9.544058149271 +4827 0.4827 1.6658716762190744 9.636984997114 +4828 0.4828 1.6649033369004720 9.729801374933 +4829 0.4829 1.6639257215232603 9.822506169300 +4830 0.4830 1.6629388413015471 9.915098264965 +4831 0.4831 1.6619427075610540 10.007576544897 +4832 0.4832 1.6609373317392935 10.099939890313 +4833 0.4833 1.6599227253857416 10.192187180724 +4834 0.4834 1.6588989001620074 10.284317293962 +4835 0.4835 1.6578658678419980 10.376329106228 +4836 0.4836 1.6568236403120802 10.468221492129 +4837 0.4837 1.6557722295712385 10.559993324703 +4838 0.4838 1.6547116477312296 10.651643475475 +4839 0.4839 1.6536419070167319 10.743170814481 +4840 0.4840 1.6525630197654924 10.834574210310 +4841 0.4841 1.6514749984284693 10.925852530150 +4842 0.4842 1.6503778555699711 11.017004639814 +4843 0.4843 1.6492716038677910 11.108029403786 +4844 0.4844 1.6481562561133389 11.198925685257 +4845 0.4845 1.6470318252117679 11.289692346164 +4846 0.4846 1.6458983241820984 11.380328247227 +4847 0.4847 1.6447557661573375 11.470832247991 +4848 0.4848 1.6436041643845947 11.561203206866 +4849 0.4849 1.6424435322251936 11.651439981155 +4850 0.4850 1.6412738831547804 11.741541427110 +4851 0.4851 1.6400952307634271 11.831506399954 +4852 0.4852 1.6389075887557327 11.921333753936 +4853 0.4853 1.6377109709509183 12.011022342354 +4854 0.4854 1.6365053912829202 12.100571017609 +4855 0.4855 1.6352908638004779 12.189978631235 +4856 0.4856 1.6340674026672191 12.279244033942 +4857 0.4857 1.6328350221617394 12.368366075652 +4858 0.4858 1.6315937366776794 12.457343605546 +4859 0.4859 1.6303435607237973 12.546175472096 +4860 0.4860 1.6290845089240371 12.634860523105 +4861 0.4861 1.6278165960175941 12.723397605754 +4862 0.4862 1.6265398368589747 12.811785566635 +4863 0.4863 1.6252542464180535 12.900023251790 +4864 0.4864 1.6239598397801260 12.988109506758 +4865 0.4865 1.6226566321459577 13.076043176607 +4866 0.4866 1.6213446388318282 13.163823105980 +4867 0.4867 1.6200238752695726 13.251448139131 +4868 0.4868 1.6186943570066177 13.338917119966 +4869 0.4869 1.6173560997060150 13.426228892087 +4870 0.4870 1.6160091191464694 13.513382298825 +4871 0.4871 1.6146534312223639 13.600376183285 +4872 0.4872 1.6132890519437804 13.687209388388 +4873 0.4873 1.6119159974365158 13.773880756905 +4874 0.4874 1.6105342839420953 13.860389131504 +4875 0.4875 1.6091439278177808 13.946733354784 +4876 0.4876 1.6077449455365755 14.032912269321 +4877 0.4877 1.6063373536872243 14.118924717705 +4878 0.4878 1.6049211689742098 14.204769542584 +4879 0.4879 1.6034964082177456 14.290445586698 +4880 0.4880 1.6020630883537645 14.375951692926 +4881 0.4881 1.6006212264339019 14.461286704326 +4882 0.4882 1.5991708396254773 14.546449464167 +4883 0.4883 1.5977119452114696 14.631438815985 +4884 0.4884 1.5962445605904900 14.716253603606 +4885 0.4885 1.5947687032767497 14.800892671202 +4886 0.4886 1.5932843909000234 14.885354863322 +4887 0.4887 1.5917916412056106 14.969639024935 +4888 0.4888 1.5902904720542901 15.053744001474 +4889 0.4889 1.5887809014222729 15.137668638871 +4890 0.4890 1.5872629474011493 15.221411783604 +4891 0.4891 1.5857366281978325 15.304972282731 +4892 0.4892 1.5842019621344992 15.388348983935 +4893 0.4893 1.5826589676485241 15.471540735565 +4894 0.4894 1.5811076632924121 15.554546386674 +4895 0.4895 1.5795480677337255 15.637364787061 +4896 0.4896 1.5779801997550067 15.719994787316 +4897 0.4897 1.5764040782536985 15.802435238849 +4898 0.4898 1.5748197222420590 15.884684993942 +4899 0.4899 1.5732271508470725 15.966742905789 +4900 0.4900 1.5716263833103568 16.048607828528 +4901 0.4901 1.5700174389880657 16.130278617293 +4902 0.4902 1.5684003373507889 16.211754128241 +4903 0.4903 1.5667750979834463 16.293033218610 +4904 0.4904 1.5651417405851786 16.374114746742 +4905 0.4905 1.5635002849692345 16.454997572138 +4906 0.4906 1.5618507510628532 16.535680555489 +4907 0.4907 1.5601931589071427 16.616162558720 +4908 0.4908 1.5585275286569549 16.696442445035 +4909 0.4909 1.5568538805807559 16.776519078944 +4910 0.4910 1.5551722350604926 16.856391326323 +4911 0.4911 1.5534826125914547 16.936058054437 +4912 0.4912 1.5517850337821333 17.015518131991 +4913 0.4913 1.5500795193540753 17.094770429170 +4914 0.4914 1.5483660901417335 17.173813817667 +4915 0.4915 1.5466447670923131 17.252647170743 +4916 0.4916 1.5449155712656135 17.331269363250 +4917 0.4917 1.5431785238338667 17.409679271688 +4918 0.4918 1.5414336460815710 17.487875774224 +4919 0.4919 1.5396809594053222 17.565857750752 +4920 0.4920 1.5379204853136383 17.643624082925 +4921 0.4921 1.5361522454267824 17.721173654192 +4922 0.4922 1.5343762614765803 17.798505349848 +4923 0.4923 1.5325925553062349 17.875618057059 +4924 0.4924 1.5308011488701361 17.952510664917 +4925 0.4925 1.5290020642336664 18.029182064476 +4926 0.4926 1.5271953235730034 18.105631148783 +4927 0.4927 1.5253809491749177 18.181856812931 +4928 0.4928 1.5235589634365667 18.257857954088 +4929 0.4929 1.5217293888652850 18.333633471545 +4930 0.4930 1.5198922480783701 18.409182266753 +4931 0.4931 1.5180475638028648 18.484503243355 +4932 0.4932 1.5161953588753350 18.559595307243 +4933 0.4933 1.5143356562416439 18.634457366577 +4934 0.4934 1.5124684789567229 18.709088331845 +4935 0.4935 1.5105938501843366 18.783487115882 +4936 0.4936 1.5087117931968461 18.857652633926 +4937 0.4937 1.5068223313749673 18.931583803650 +4938 0.4938 1.5049254882075247 19.005279545205 +4939 0.4939 1.5030212872912021 19.078738781247 +4940 0.4940 1.5011097523302899 19.151960436998 +4941 0.4941 1.4991909071364267 19.224943440264 +4942 0.4942 1.4972647756283390 19.297686721487 +4943 0.4943 1.4953313818315757 19.370189213780 +4944 0.4944 1.4933907498782386 19.442449852962 +4945 0.4945 1.4914429040067103 19.514467577603 +4946 0.4946 1.4894878685613770 19.586241329064 +4947 0.4947 1.4875256679923476 19.657770051522 +4948 0.4948 1.4855563268551701 19.729052692029 +4949 0.4949 1.4835798698105420 19.800088200535 +4950 0.4950 1.4815963216240189 19.870875529929 +4951 0.4951 1.4796057071657183 19.941413636084 +4952 0.4952 1.4776080514100196 20.011701477889 +4953 0.4953 1.4756033794352605 20.081738017291 +4954 0.4954 1.4735917164234296 20.151522219328 +4955 0.4955 1.4715730876598545 20.221053052173 +4956 0.4956 1.4695475185328875 20.290329487168 +4957 0.4957 1.4675150345335859 20.359350498861 +4958 0.4958 1.4654756612553903 20.428115065051 +4959 0.4959 1.4634294243937969 20.496622166816 +4960 0.4960 1.4613763497460284 20.564870788554 +4961 0.4961 1.4593164632106994 20.632859918025 +4962 0.4962 1.4572497907874791 20.700588546382 +4963 0.4963 1.4551763585767494 20.768055668211 +4964 0.4964 1.4530961927792603 20.835260281571 +4965 0.4965 1.4510093196957805 20.902201388023 +4966 0.4966 1.4489157657267455 20.968877992677 +4967 0.4967 1.4468155573719006 21.035289104220 +4968 0.4968 1.4447087212299417 21.101433734958 +4969 0.4969 1.4425952839981511 21.167310900855 +4970 0.4970 1.4404752724720304 21.232919621559 +4971 0.4971 1.4383487135449300 21.298258920451 +4972 0.4972 1.4362156342076737 21.363327824672 +4973 0.4973 1.4340760615481818 21.428125365166 +4974 0.4974 1.4319300227510880 21.492650576708 +4975 0.4975 1.4297775450973551 21.556902497949 +4976 0.4976 1.4276186559638853 21.620880171448 +4977 0.4977 1.4254533828231277 21.684582643705 +4978 0.4978 1.4232817532426825 21.748008965200 +4979 0.4979 1.4211037948849010 21.811158190428 +4980 0.4980 1.4189195355064830 21.874029377935 +4981 0.4981 1.4167290029580686 21.936621590351 +4982 0.4982 1.4145322251838297 21.998933894425 +4983 0.4983 1.4123292302210551 22.060965361066 +4984 0.4984 1.4101200461997332 22.122715065370 +4985 0.4985 1.4079047013421317 22.184182086657 +4986 0.4986 1.4056832239623733 22.245365508513 +4987 0.4987 1.4034556424660072 22.306264418812 +4988 0.4988 1.4012219853495786 22.366877909760 +4989 0.4989 1.3989822812001944 22.427205077926 +4990 0.4990 1.3967365586950842 22.487245024277 +4991 0.4991 1.3944848466011599 22.546996854210 +4992 0.4992 1.3922271737745699 22.606459677587 +4993 0.4993 1.3899635691602521 22.665632608769 +4994 0.4994 1.3876940617914810 22.724514766653 +4995 0.4995 1.3854186807894135 22.783105274698 +4996 0.4996 1.3831374553626303 22.841403260966 +4997 0.4997 1.3808504148066747 22.899407858148 +4998 0.4998 1.3785575885035872 22.957118203603 +4999 0.4999 1.3762590059214377 23.014533439390 +5000 0.5000 1.3739546966138534 23.071652712298 +5001 0.5001 1.3716446902195445 23.128475173879 +5002 0.5002 1.3693290164618264 23.184999980484 +5003 0.5003 1.3670077051481375 23.241226293292 +5004 0.5004 1.3646807861695558 23.297153278344 +5005 0.5005 1.3623482895003098 23.352780106574 +5006 0.5006 1.3600102451972891 23.408105953841 +5007 0.5007 1.3576666833995490 23.463130000962 +5008 0.5008 1.3553176343278139 23.517851433741 +5009 0.5009 1.3529631282839767 23.572269443006 +5010 0.5010 1.3506031956505948 23.626383224632 +5011 0.5011 1.3482378668903843 23.680191979581 +5012 0.5012 1.3458671725457090 23.733694913925 +5013 0.5013 1.3434911432380687 23.786891238882 +5014 0.5014 1.3411098096675822 23.839780170847 +5015 0.5015 1.3387232026124689 23.892360931420 +5016 0.5016 1.3363313529285261 23.944632747436 +5017 0.5017 1.3339342915486043 23.996594851000 +5018 0.5018 1.3315320494820788 24.048246479510 +5019 0.5019 1.3291246578143188 24.099586875693 +5020 0.5020 1.3267121477061525 24.150615287630 +5021 0.5021 1.3242945503933314 24.201330968791 +5022 0.5022 1.3218718971859889 24.251733178062 +5023 0.5023 1.3194442194680973 24.301821179769 +5024 0.5024 1.3170115486969232 24.351594243714 +5025 0.5025 1.3145739164024770 24.401051645207 +5026 0.5026 1.3121313541869626 24.450192665080 +5027 0.5027 1.3096838937242219 24.499016589736 +5028 0.5028 1.3072315667591772 24.547522711158 +5029 0.5029 1.3047744051072721 24.595710326946 +5030 0.5030 1.3023124406539071 24.643578740355 +5031 0.5031 1.2998457053538743 24.691127260301 +5032 0.5032 1.2973742312307888 24.738355201409 +5033 0.5033 1.2948980503765168 24.785261884028 +5034 0.5034 1.2924171949506023 24.831846634264 +5035 0.5035 1.2899316971796888 24.878108784007 +5036 0.5036 1.2874415893569409 24.924047670954 +5037 0.5037 1.2849469038414609 24.969662638645 +5038 0.5038 1.2824476730577048 25.014953036476 +5039 0.5039 1.2799439294948940 25.059918219741 +5040 0.5040 1.2774357057064247 25.104557549645 +5041 0.5041 1.2749230343092754 25.148870393339 +5042 0.5042 1.2724059479834116 25.192856123939 +5043 0.5043 1.2698844794711865 25.236514120560 +5044 0.5044 1.2673586615767416 25.279843768337 +5045 0.5045 1.2648285271654025 25.322844458447 +5046 0.5046 1.2622941091630731 25.365515588142 +5047 0.5047 1.2597554405556277 25.407856560766 +5048 0.5048 1.2572125543883002 25.449866785787 +5049 0.5049 1.2546654837650697 25.491545678820 +5050 0.5050 1.2521142618480463 25.532892661647 +5051 0.5051 1.2495589218568517 25.573907162247 +5052 0.5052 1.2469994970679985 25.614588614815 +5053 0.5053 1.2444360208142682 25.654936459791 +5054 0.5054 1.2418685264840845 25.694950143883 +5055 0.5055 1.2392970475208862 25.734629120084 +5056 0.5056 1.2367216174224969 25.773972847705 +5057 0.5057 1.2341422697404920 25.812980792392 +5058 0.5058 1.2315590380795649 25.851652426152 +5059 0.5059 1.2289719560968886 25.889987227373 +5060 0.5060 1.2263810575014775 25.927984680849 +5061 0.5061 1.2237863760535452 25.965644277798 +5062 0.5062 1.2211879455638606 26.002965515897 +5063 0.5063 1.2185857998931016 26.039947899284 +5064 0.5064 1.2159799729512075 26.076590938598 +5065 0.5065 1.2133704986967280 26.112894150991 +5066 0.5066 1.2107574111361710 26.148857060150 +5067 0.5067 1.2081407443233472 26.184479196325 +5068 0.5068 1.2055205323587139 26.219760096339 +5069 0.5069 1.2028968093887160 26.254699303619 +5070 0.5070 1.2002696096051244 26.289296368214 +5071 0.5071 1.1976389672443735 26.323550846807 +5072 0.5072 1.1950049165868957 26.357462302750 +5073 0.5073 1.1923674919564544 26.391030306073 +5074 0.5074 1.1897267277194754 26.424254433507 +5075 0.5075 1.1870826582843748 26.457134268504 +5076 0.5076 1.1844353181008866 26.489669401257 +5077 0.5077 1.1817847416593878 26.521859428718 +5078 0.5078 1.1791309634902210 26.553703954618 +5079 0.5079 1.1764740181630160 26.585202589483 +5080 0.5080 1.1738139402860090 26.616354950658 +5081 0.5081 1.1711507645053600 26.647160662323 +5082 0.5082 1.1684845255044687 26.677619355504 +5083 0.5083 1.1658152580032881 26.707730668106 +5084 0.5084 1.1631429967576370 26.737494244917 +5085 0.5085 1.1604677765585096 26.766909737632 +5086 0.5086 1.1577896322313845 26.795976804870 +5087 0.5087 1.1551085986355316 26.824695112190 +5088 0.5088 1.1524247106633168 26.853064332106 +5089 0.5089 1.1497380032395059 26.881084144111 +5090 0.5090 1.1470485113205662 26.908754234684 +5091 0.5091 1.1443562698939664 26.936074297312 +5092 0.5092 1.1416613139774756 26.963044032506 +5093 0.5093 1.1389636786184596 26.989663147816 +5094 0.5094 1.1362633988931767 27.015931357842 +5095 0.5095 1.1335605099060715 27.041848384261 +5096 0.5096 1.1308550467890670 27.067413955829 +5097 0.5097 1.1281470447008553 27.092627808408 +5098 0.5098 1.1254365388261864 27.117489684967 +5099 0.5099 1.1227235643751576 27.141999335610 +5100 0.5100 1.1200081565824980 27.166156517585 +5101 0.5101 1.1172903507068539 27.189960995296 +5102 0.5102 1.1145701820300731 27.213412540320 +5103 0.5103 1.1118476858564861 27.236510931418 +5104 0.5104 1.1091228975121876 27.259255954551 +5105 0.5105 1.1063958523443154 27.281647402894 +5106 0.5106 1.1036665857203285 27.303685076844 +5107 0.5107 1.1009351330272843 27.325368784040 +5108 0.5108 1.0982015296711138 27.346698339369 +5109 0.5109 1.0954658110758964 27.367673564981 +5110 0.5110 1.0927280126831320 27.388294290304 +5111 0.5111 1.0899881699510143 27.408560352052 +5112 0.5112 1.0872463183536998 27.428471594237 +5113 0.5113 1.0845024933805789 27.448027868182 +5114 0.5114 1.0817567305355431 27.467229032533 +5115 0.5115 1.0790090653362532 27.486074953267 +5116 0.5116 1.0762595333134046 27.504565503706 +5117 0.5117 1.0735081700099929 27.522700564527 +5118 0.5118 1.0707550109805781 27.540480023767 +5119 0.5119 1.0680000917905474 27.557903776845 +5120 0.5120 1.0652434480153772 27.574971726560 +5121 0.5121 1.0624851152398940 27.591683783105 +5122 0.5122 1.0597251290575347 27.608039864079 +5123 0.5123 1.0569635250696061 27.624039894494 +5124 0.5124 1.0542003388845422 27.639683806784 +5125 0.5125 1.0514356061171624 27.654971540812 +5126 0.5126 1.0486693623879275 27.669903043883 +5127 0.5127 1.0459016433221959 27.684478270749 +5128 0.5128 1.0431324845494776 27.698697183616 +5129 0.5129 1.0403619217026889 27.712559752158 +5130 0.5130 1.0375899904174051 27.726065953518 +5131 0.5131 1.0348167263311132 27.739215772317 +5132 0.5132 1.0320421650824643 27.752009200664 +5133 0.5133 1.0292663423105231 27.764446238160 +5134 0.5134 1.0264892936540198 27.776526891907 +5135 0.5135 1.0237110547505988 27.788251176512 +5136 0.5136 1.0209316612360684 27.799619114096 +5137 0.5137 1.0181511487436488 27.810630734296 +5138 0.5138 1.0153695529032201 27.821286074277 +5139 0.5139 1.0125869093405695 27.831585178733 +5140 0.5140 1.0098032536766381 27.841528099892 +5141 0.5141 1.0070186215267674 27.851114897523 +5142 0.5142 1.0042330484999442 27.860345638942 +5143 0.5143 1.0014465701980464 27.869220399013 +5144 0.5144 0.9986592222150877 27.877739260158 +5145 0.5145 0.9958710401364621 27.885902312354 +5146 0.5146 0.9930820595381874 27.893709653140 +5147 0.5147 0.9902923159861491 27.901161387627 +5148 0.5148 0.9875018450353431 27.908257628492 +5149 0.5149 0.9847106822291193 27.914998495984 +5150 0.5150 0.9819188630984234 27.921384117934 +5151 0.5151 0.9791264231610395 27.927414629744 +5152 0.5152 0.9763333979208321 27.933090174405 +5153 0.5153 0.9735398228669875 27.938410902487 +5154 0.5154 0.9707457334732557 27.943376972149 +5155 0.5155 0.9679511651971913 27.947988549138 +5156 0.5156 0.9651561534793950 27.952245806788 +5157 0.5157 0.9623607337427542 27.956148926027 +5158 0.5158 0.9595649413916842 27.959698095372 +5159 0.5159 0.9567688118113687 27.962893510938 +5160 0.5160 0.9539723803670004 27.965735376429 +5161 0.5161 0.9511756824030216 27.968223903146 +5162 0.5162 0.9483787532423652 27.970359309983 +5163 0.5163 0.9455816281856945 27.972141823432 +5164 0.5164 0.9427843425106442 27.973571677572 +5165 0.5165 0.9399869314710614 27.974649114085 +5166 0.5166 0.9371894302962451 27.975374382240 +5167 0.5167 0.9343918741901882 27.975747738899 +5168 0.5168 0.9315942983308173 27.975769448518 +5169 0.5169 0.9287967378692344 27.975439783139 +5170 0.5170 0.9259992279289578 27.974759022394 +5171 0.5171 0.9232018036051631 27.973727453501 +5172 0.5172 0.9204044999639249 27.972345371263 +5173 0.5173 0.9176073520414587 27.970613078062 +5174 0.5174 0.9148103948433626 27.968530883861 +5175 0.5175 0.9120136633438596 27.966099106199 +5176 0.5176 0.9092171924850402 27.963318070189 +5177 0.5177 0.9064210171761052 27.960188108511 +5178 0.5178 0.9036251722926090 27.956709561415 +5179 0.5179 0.9008296926757026 27.952882776713 +5180 0.5180 0.8980346131313782 27.948708109773 +5181 0.5181 0.8952399684297134 27.944185923522 +5182 0.5182 0.8924457933041158 27.939316588432 +5183 0.5183 0.8896521224505679 27.934100482525 +5184 0.5184 0.8868589905268737 27.928537991360 +5185 0.5185 0.8840664321519041 27.922629508033 +5186 0.5186 0.8812744819048440 27.916375433168 +5187 0.5187 0.8784831743244398 27.909776174916 +5188 0.5188 0.8756925439082467 27.902832148946 +5189 0.5189 0.8729026251118776 27.895543778436 +5190 0.5190 0.8701134523482521 27.887911494074 +5191 0.5191 0.8673250599868462 27.879935734044 +5192 0.5192 0.8645374823529427 27.871616944026 +5193 0.5193 0.8617507537268823 27.862955577183 +5194 0.5194 0.8589649083433153 27.853952094156 +5195 0.5195 0.8561799803904545 27.844606963059 +5196 0.5196 0.8533960040093281 27.834920659468 +5197 0.5197 0.8506130132930341 27.824893666413 +5198 0.5198 0.8478310422859948 27.814526474373 +5199 0.5199 0.8450501249832131 27.803819581262 +5200 0.5200 0.8422702953295286 27.792773492429 +5201 0.5201 0.8394915872188752 27.781388720638 +5202 0.5202 0.8367140344935398 27.769665786071 +5203 0.5203 0.8339376709434209 27.757605216308 +5204 0.5204 0.8311625303052894 27.745207546322 +5205 0.5205 0.8283886462620499 27.732473318469 +5206 0.5206 0.8256160524420024 27.719403082480 +5207 0.5207 0.8228447824181060 27.705997395448 +5208 0.5208 0.8200748697072429 27.692256821815 +5209 0.5209 0.8173063477694836 27.678181933369 +5210 0.5210 0.8145392500073539 27.663773309225 +5211 0.5211 0.8117736097651017 27.649031535819 +5212 0.5212 0.8090094603279661 27.633957206895 +5213 0.5213 0.8062468349214469 27.618550923489 +5214 0.5214 0.8034857667105761 27.602813293925 +5215 0.5215 0.8007262887991899 27.586744933798 +5216 0.5216 0.7979684342292018 27.570346465964 +5217 0.5217 0.7952122359798776 27.553618520521 +5218 0.5218 0.7924577269671111 27.536561734808 +5219 0.5219 0.7897049400427018 27.519176753379 +5220 0.5220 0.7869539079936329 27.501464227999 +5221 0.5221 0.7842046635413515 27.483424817627 +5222 0.5222 0.7814572393410500 27.465059188404 +5223 0.5223 0.7787116679809482 27.446368013633 +5224 0.5224 0.7759679819815779 27.427351973773 +5225 0.5225 0.7732262137950683 27.408011756419 +5226 0.5226 0.7704863958044328 27.388348056292 +5227 0.5227 0.7677485603228573 27.368361575218 +5228 0.5228 0.7650127395929904 27.348053022120 +5229 0.5229 0.7622789657862348 27.327423112994 +5230 0.5230 0.7595472710020399 27.306472570904 +5231 0.5231 0.7568176872671969 27.285202125955 +5232 0.5232 0.7540902465351348 27.263612515287 +5233 0.5233 0.7513649806852178 27.241704483052 +5234 0.5234 0.7486419215220452 27.219478780400 +5235 0.5235 0.7459211007747520 27.196936165464 +5236 0.5236 0.7432025500963119 27.174077403340 +5237 0.5237 0.7404863010628414 27.150903266068 +5238 0.5238 0.7377723851729069 27.127414532623 +5239 0.5239 0.7350608338468312 27.103611988891 +5240 0.5240 0.7323516784260042 27.079496427649 +5241 0.5241 0.7296449501721941 27.055068648554 +5242 0.5242 0.7269406802668604 27.030329458119 +5243 0.5243 0.7242388998104696 27.005279669698 +5244 0.5244 0.7215396398218115 26.979920103465 +5245 0.5245 0.7188429312373185 26.954251586395 +5246 0.5246 0.7161488049103862 26.928274952249 +5247 0.5247 0.7134572916106964 26.901991041548 +5248 0.5248 0.7107684220235410 26.875400701560 +5249 0.5249 0.7080822267491491 26.848504786276 +5250 0.5250 0.7053987363020159 26.821304156389 +5251 0.5251 0.7027179811102325 26.793799679279 +5252 0.5252 0.7000399915148192 26.765992228988 +5253 0.5253 0.6973647977690597 26.737882686202 +5254 0.5254 0.6946924300378382 26.709471938227 +5255 0.5255 0.6920229183969783 26.680760878971 +5256 0.5256 0.6893562928325836 26.651750408922 +5257 0.5257 0.6866925832403813 26.622441435124 +5258 0.5258 0.6840318194250671 26.592834871160 +5259 0.5259 0.6813740310996528 26.562931637126 +5260 0.5260 0.6787192478848161 26.532732659609 +5261 0.5261 0.6760674993082523 26.502238871667 +5262 0.5262 0.6734188148040287 26.471451212805 +5263 0.5263 0.6707732237119408 26.440370628952 +5264 0.5264 0.6681307552768713 26.408998072439 +5265 0.5265 0.6654914386481506 26.377334501974 +5266 0.5266 0.6628553028789209 26.345380882621 +5267 0.5267 0.6602223769255012 26.313138185772 +5268 0.5268 0.6575926896467561 26.280607389131 +5269 0.5269 0.6549662698034655 26.247789476681 +5270 0.5270 0.6523431460576982 26.214685438665 +5271 0.5271 0.6497233469721869 26.181296271559 +5272 0.5272 0.6471069010097065 26.147622978051 +5273 0.5273 0.6444938365324533 26.113666567013 +5274 0.5274 0.6418841818014289 26.079428053474 +5275 0.5275 0.6392779649758251 26.044908458601 +5276 0.5276 0.6366752141124117 26.010108809667 +5277 0.5277 0.6340759571649269 25.975030140028 +5278 0.5278 0.6314802219834705 25.939673489099 +5279 0.5279 0.6288880363138993 25.904039902324 +5280 0.5280 0.6262994277972256 25.868130431152 +5281 0.5281 0.6237144239690174 25.831946133011 +5282 0.5282 0.6211330522588030 25.795488071278 +5283 0.5283 0.6185553399894763 25.758757315256 +5284 0.5284 0.6159813143767062 25.721754940145 +5285 0.5285 0.6134110025283481 25.684482027016 +5286 0.5286 0.6108444314438585 25.646939662777 +5287 0.5287 0.6082816280137117 25.609128940159 +5288 0.5288 0.6057226190188201 25.571050957672 +5289 0.5289 0.6031674311299571 25.532706819587 +5290 0.5290 0.6006160909071824 25.494097635907 +5291 0.5291 0.5980686247992704 25.455224522334 +5292 0.5292 0.5955250591431415 25.416088600244 +5293 0.5293 0.5929854201632964 25.376690996657 +5294 0.5294 0.5904497339712531 25.337032844207 +5295 0.5295 0.5879180265649872 25.297115281112 +5296 0.5296 0.5853903238283740 25.256939451151 +5297 0.5297 0.5828666515306352 25.216506503623 +5298 0.5298 0.5803470353257877 25.175817593328 +5299 0.5299 0.5778315007520948 25.134873880531 +5300 0.5300 0.5753200732315217 25.093676530932 +5301 0.5301 0.5728127780691933 25.052226715636 +5302 0.5302 0.5703096404528551 25.010525611126 +5303 0.5303 0.5678106854523376 24.968574399226 +5304 0.5304 0.5653159380190226 24.926374267075 +5305 0.5305 0.5628254229853142 24.883926407092 +5306 0.5306 0.5603391650641123 24.841232016947 +5307 0.5307 0.5578571888482884 24.798292299531 +5308 0.5308 0.5553795188101659 24.755108462919 +5309 0.5309 0.5529061793010028 24.711681720342 +5310 0.5310 0.5504371945504779 24.668013290157 +5311 0.5311 0.5479725886661798 24.624104395805 +5312 0.5312 0.5455123856330999 24.579956265793 +5313 0.5313 0.5430566093131278 24.535570133649 +5314 0.5314 0.5406052834445507 24.490947237893 +5315 0.5315 0.5381584316415556 24.446088822008 +5316 0.5316 0.5357160773937352 24.400996134401 +5317 0.5317 0.5332782440655965 24.355670428371 +5318 0.5318 0.5308449548960740 24.310112962081 +5319 0.5319 0.5284162329980442 24.264324998515 +5320 0.5320 0.5259921013578459 24.218307805451 +5321 0.5321 0.5235725828348021 24.172062655424 +5322 0.5322 0.5211577001607464 24.125590825692 +5323 0.5323 0.5187474759395515 24.078893598205 +5324 0.5324 0.5163419326466631 24.031972259563 +5325 0.5325 0.5139410926286354 23.984828100989 +5326 0.5326 0.5115449781026714 23.937462418290 +5327 0.5327 0.5091536111561659 23.889876511820 +5328 0.5328 0.5067670137462522 23.842071686452 +5329 0.5329 0.5043852076993529 23.794049251535 +5330 0.5330 0.5020082147107332 23.745810520860 +5331 0.5331 0.4996360563440589 23.697356812627 +5332 0.5332 0.4972687540309572 23.648689449408 +5333 0.5333 0.4949063290705812 23.599809758110 +5334 0.5334 0.4925488026291788 23.550719069939 +5335 0.5335 0.4901961957396637 23.501418720362 +5336 0.5336 0.4878485293011918 23.451910049076 +5337 0.5337 0.4855058240787399 23.402194399963 +5338 0.5338 0.4831681007026888 23.352273121059 +5339 0.5339 0.4808353796684099 23.302147564518 +5340 0.5340 0.4785076813358557 23.251819086567 +5341 0.5341 0.4761850259291535 23.201289047478 +5342 0.5342 0.4738674335362033 23.150558811525 +5343 0.5343 0.4715549241082798 23.099629746945 +5344 0.5344 0.4692475174596373 23.048503225906 +5345 0.5345 0.4669452332671188 22.997180624464 +5346 0.5346 0.4646480910697693 22.945663322526 +5347 0.5347 0.4623561102684524 22.893952703813 +5348 0.5348 0.4600693101254707 22.842050155820 +5349 0.5349 0.4577877097641908 22.789957069779 +5350 0.5350 0.4555113281686709 22.737674840618 +5351 0.5351 0.4532401841832938 22.685204866924 +5352 0.5352 0.4509742965124024 22.632548550904 +5353 0.5353 0.4487136837199400 22.579707298344 +5354 0.5354 0.4464583642290942 22.526682518571 +5355 0.5355 0.4442083563219449 22.473475624415 +5356 0.5356 0.4419636781391160 22.420088032163 +5357 0.5357 0.4397243476794313 22.366521161531 +5358 0.5358 0.4374903827995743 22.312776435610 +5359 0.5359 0.4352618012137519 22.258855280838 +5360 0.5360 0.4330386204933623 22.204759126952 +5361 0.5361 0.4308208580666671 22.150489406952 +5362 0.5362 0.4286085312184666 22.096047557058 +5363 0.5363 0.4264016570897802 22.041435016670 +5364 0.5364 0.4242002526775303 21.986653228330 +5365 0.5365 0.4220043348342299 21.931703637676 +5366 0.5366 0.4198139202676758 21.876587693406 +5367 0.5367 0.4176290255406439 21.821306847233 +5368 0.5368 0.4154496670705900 21.765862553845 +5369 0.5369 0.4132758611293543 21.710256270868 +5370 0.5370 0.4111076238428701 21.654489458816 +5371 0.5371 0.4089449711908765 21.598563581056 +5372 0.5372 0.4067879190066355 21.542480103764 +5373 0.5373 0.4046364829766531 21.486240495884 +5374 0.5374 0.4024906786404048 21.429846229082 +5375 0.5375 0.4003505213900651 21.373298777713 +5376 0.5376 0.3982160264702411 21.316599618767 +5377 0.5377 0.3960872089777110 21.259750231835 +5378 0.5378 0.3939640838611660 21.202752099065 +5379 0.5379 0.3918466659209570 21.145606705116 +5380 0.5380 0.3897349698088451 21.088315537121 +5381 0.5381 0.3876290100277572 21.030880084637 +5382 0.5382 0.3855288009315450 20.973301839609 +5383 0.5383 0.3834343567247485 20.915582296321 +5384 0.5384 0.3813456914623645 20.857722951359 +5385 0.5385 0.3792628190496184 20.799725303561 +5386 0.5386 0.3771857532417415 20.741590853979 +5387 0.5387 0.3751145076437509 20.683321105833 +5388 0.5388 0.3730490957102359 20.624917564467 +5389 0.5389 0.3709895307451472 20.566381737306 +5390 0.5390 0.3689358259015912 20.507715133815 +5391 0.5391 0.3668879941816280 20.448919265448 +5392 0.5392 0.3648460484360751 20.389995645611 +5393 0.5393 0.3628100013643138 20.330945789615 +5394 0.5394 0.3607798655141015 20.271771214631 +5395 0.5395 0.3587556532813876 20.212473439646 +5396 0.5396 0.3567373769101344 20.153053985420 +5397 0.5397 0.3547250484921413 20.093514374442 +5398 0.5398 0.3527186799668752 20.033856130880 +5399 0.5399 0.3507182831213040 19.974080780544 +5400 0.5400 0.3487238695897351 19.914189850835 +5401 0.5401 0.3467354508536581 19.854184870704 +5402 0.5402 0.3447530382415928 19.794067370603 +5403 0.5403 0.3427766429289403 19.733838882446 +5404 0.5404 0.3408062759378402 19.673500939556 +5405 0.5405 0.3388419481370311 19.613055076627 +5406 0.5406 0.3368836702417161 19.552502829674 +5407 0.5407 0.3349314528134329 19.491845735989 +5408 0.5408 0.3329853062599286 19.431085334097 +5409 0.5409 0.3310452408350384 19.370223163708 +5410 0.5410 0.3291112666385695 19.309260765670 +5411 0.5411 0.3271833936161895 19.248199681929 +5412 0.5412 0.3252616315593192 19.187041455478 +5413 0.5413 0.3233459901050297 19.125787630312 +5414 0.5414 0.3214364787359448 19.064439751385 +5415 0.5415 0.3195331067801477 19.002999364558 +5416 0.5416 0.3176358834110918 18.941468016559 +5417 0.5417 0.3157448176475172 18.879847254934 +5418 0.5418 0.3138599183533705 18.818138628000 +5419 0.5419 0.3119811942377305 18.756343684799 +5420 0.5420 0.3101086538547378 18.694463975055 +5421 0.5421 0.3082423056035290 18.632501049121 +5422 0.5422 0.3063821577281760 18.570456457939 +5423 0.5423 0.3045282183176297 18.508331752987 +5424 0.5424 0.3026804953056684 18.446128486240 +5425 0.5425 0.3008389964708507 18.383848210114 +5426 0.5426 0.2990037294364735 18.321492477429 +5427 0.5427 0.2971747016705344 18.259062841354 +5428 0.5428 0.2953519204856985 18.196560855363 +5429 0.5429 0.2935353930392709 18.133988073190 +5430 0.5430 0.2917251263331723 18.071346048781 +5431 0.5431 0.2899211272139210 18.008636336244 +5432 0.5432 0.2881234023726186 17.945860489804 +5433 0.5433 0.2863319583449406 17.883020063757 +5434 0.5434 0.2845468015111317 17.820116612421 +5435 0.5435 0.2827679380960061 17.757151690089 +5436 0.5436 0.2809953741689526 17.694126850982 +5437 0.5437 0.2792291156439434 17.631043649202 +5438 0.5438 0.2774691682795491 17.567903638683 +5439 0.5439 0.2757155376789576 17.504708373146 +5440 0.5440 0.2739682292899980 17.441459406047 +5441 0.5441 0.2722272484051689 17.378158290535 +5442 0.5442 0.2704926001616720 17.314806579402 +5443 0.5443 0.2687642895414503 17.251405825033 +5444 0.5444 0.2670423213712305 17.187957579363 +5445 0.5445 0.2653267003225711 17.124463393825 +5446 0.5446 0.2636174309119145 17.060924819305 +5447 0.5447 0.2619145175006447 16.997343406091 +5448 0.5448 0.2602179642951486 16.933720703831 +5449 0.5449 0.2585277753468831 16.870058261478 +5450 0.5450 0.2568439545524469 16.806357627248 +5451 0.5451 0.2551665056536560 16.742620348570 +5452 0.5452 0.2534954322376257 16.678847972036 +5453 0.5453 0.2518307377368560 16.615042043356 +5454 0.5454 0.2501724254293228 16.551204107309 +5455 0.5455 0.2485204984385726 16.487335707694 +5456 0.5456 0.2468749597338236 16.423438387286 +5457 0.5457 0.2452358121300703 16.359513687780 +5458 0.5458 0.2436030582881936 16.295563149753 +5459 0.5459 0.2419767007150757 16.231588312607 +5460 0.5460 0.2403567417637190 16.167590714527 +5461 0.5461 0.2387431836333712 16.103571892428 +5462 0.5462 0.2371360283696541 16.039533381914 +5463 0.5463 0.2355352778646973 15.975476717222 +5464 0.5464 0.2339409338572772 15.911403431179 +5465 0.5465 0.2323529979329608 15.847315055150 +5466 0.5466 0.2307714715242535 15.783213118995 +5467 0.5467 0.2291963559107529 15.719099151018 +5468 0.5468 0.2276276522193062 15.654974677916 +5469 0.5469 0.2260653614241736 15.590841224736 +5470 0.5470 0.2245094843471955 15.526700314825 +5471 0.5471 0.2229600216579652 15.462553469781 +5472 0.5472 0.2214169738740059 15.398402209405 +5473 0.5473 0.2198803413609531 15.334248051652 +5474 0.5474 0.2183501243327410 15.270092512589 +5475 0.5475 0.2168263228517947 15.205937106337 +5476 0.5476 0.2153089368292263 15.141783345031 +5477 0.5477 0.2137979660250364 15.077632738768 +5478 0.5478 0.2122934100483200 15.013486795560 +5479 0.5479 0.2107952683574777 14.949347021286 +5480 0.5480 0.2093035402604311 14.885214919645 +5481 0.5481 0.2078182249148436 14.821091992105 +5482 0.5482 0.2063393213283455 14.756979737858 +5483 0.5483 0.2048668283587640 14.692879653771 +5484 0.5484 0.2034007447143585 14.628793234338 +5485 0.5485 0.2019410689540600 14.564721971632 +5486 0.5486 0.2004877994877156 14.500667355256 +5487 0.5487 0.1990409345763378 14.436630872300 +5488 0.5488 0.1976004723323586 14.372614007285 +5489 0.5489 0.1961664107198882 14.308618242123 +5490 0.5490 0.1947387475549788 14.244645056065 +5491 0.5491 0.1933174805058928 14.180695925654 +5492 0.5492 0.1919026070933763 14.116772324678 +5493 0.5493 0.1904941246909363 14.052875724121 +5494 0.5494 0.1890920305251244 13.989007592117 +5495 0.5495 0.1876963216758234 13.925169393902 +5496 0.5496 0.1863069950765400 13.861362591766 +5497 0.5497 0.1849240475147015 13.797588645005 +5498 0.5498 0.1835474756319575 13.733849009875 +5499 0.5499 0.1821772759244865 13.670145139544 +5500 0.5500 0.1808134447433072 13.606478484043 +5501 0.5501 0.1794559782945939 13.542850490223 +5502 0.5502 0.1781048726399977 13.479262601701 +5503 0.5503 0.1767601236969716 13.415716258821 +5504 0.5504 0.1754217272391005 13.352212898599 +5505 0.5505 0.1740896788964365 13.288753954681 +5506 0.5506 0.1727639741558376 13.225340857297 +5507 0.5507 0.1714446083613125 13.161975033206 +5508 0.5508 0.1701315767143692 13.098657905660 +5509 0.5509 0.1688248742743688 13.035390894347 +5510 0.5510 0.1675244959588838 12.972175415354 +5511 0.5511 0.1662304365440605 12.909012881111 +5512 0.5512 0.1649426906649874 12.845904700352 +5513 0.5513 0.1636612528160667 12.782852278062 +5514 0.5514 0.1623861173513918 12.719857015435 +5515 0.5515 0.1611172784851287 12.656920309827 +5516 0.5516 0.1598547302919019 12.594043554709 +5517 0.5517 0.1585984667071856 12.531228139617 +5518 0.5518 0.1573484815276991 12.468475450114 +5519 0.5519 0.1561047684118065 12.405786867737 +5520 0.5520 0.1548673208799220 12.343163769953 +5521 0.5521 0.1536361323149187 12.280607530114 +5522 0.5522 0.1524111959625425 12.218119517408 +5523 0.5523 0.1511925049318311 12.155701096820 +5524 0.5524 0.1499800521955363 12.093353629078 +5525 0.5525 0.1487738305905517 12.031078470613 +5526 0.5526 0.1475738328183455 11.968876973512 +5527 0.5527 0.1463800514453963 11.906750485472 +5528 0.5528 0.1451924789036350 11.844700349753 +5529 0.5529 0.1440111074908904 11.782727905140 +5530 0.5530 0.1428359293713390 11.720834485888 +5531 0.5531 0.1416669365759605 11.659021421682 +5532 0.5532 0.1405041210029966 11.597290037596 +5533 0.5533 0.1393474744184149 11.535641654038 +5534 0.5534 0.1381969884563772 11.474077586716 +5535 0.5535 0.1370526546197120 11.412599146587 +5536 0.5536 0.1359144642803921 11.351207639812 +5537 0.5537 0.1347824086800156 11.289904367718 +5538 0.5538 0.1336564789302923 11.228690626747 +5539 0.5539 0.1325366660135343 11.167567708414 +5540 0.5540 0.1314229607831504 11.106536899264 +5541 0.5541 0.1303153539641458 11.045599480827 +5542 0.5542 0.1292138361536257 10.984756729576 +5543 0.5543 0.1281183978213029 10.924009916880 +5544 0.5544 0.1270290293100106 10.863360308964 +5545 0.5545 0.1259457208362193 10.802809166863 +5546 0.5546 0.1248684624905572 10.742357746378 +5547 0.5547 0.1237972442383364 10.682007298039 +5548 0.5548 0.1227320559200818 10.621759067052 +5549 0.5549 0.1216728872520660 10.561614293265 +5550 0.5550 0.1206197278268466 10.501574211122 +5551 0.5551 0.1195725671138097 10.441640049616 +5552 0.5552 0.1185313944597161 10.381813032256 +5553 0.5553 0.1174961990892525 10.322094377016 +5554 0.5554 0.1164669701055870 10.262485296295 +5555 0.5555 0.1154436964909283 10.202986996879 +5556 0.5556 0.1144263671070896 10.143600679894 +5557 0.5557 0.1134149706960567 10.084327540765 +5558 0.5558 0.1124094958805595 10.025168769179 +5559 0.5559 0.1114099311646487 9.966125549037 +5560 0.5560 0.1104162649342760 9.907199058417 +5561 0.5561 0.1094284854578786 9.848390469531 +5562 0.5562 0.1084465808869678 9.789700948684 +5563 0.5563 0.1074705392567219 9.731131656235 +5564 0.5564 0.1065003484865824 9.672683746555 +5565 0.5565 0.1055359963808555 9.614358367983 +5566 0.5566 0.1045774706293167 9.556156662793 +5567 0.5567 0.1036247588078196 9.498079767148 +5568 0.5568 0.1026778483789091 9.440128811062 +5569 0.5569 0.1017367266924381 9.382304918358 +5570 0.5570 0.1008013809861886 9.324609206633 +5571 0.5571 0.0998717983864963 9.267042787213 +5572 0.5572 0.0989479659088797 9.209606765119 +5573 0.5573 0.0980298704586727 9.152302239020 +5574 0.5574 0.0971174988316615 9.095130301205 +5575 0.5575 0.0962108377147245 9.038092037534 +5576 0.5576 0.0953098736864776 8.981188527404 +5577 0.5577 0.0944145932179218 8.924420843712 +5578 0.5578 0.0935249826730957 8.867790052811 +5579 0.5579 0.0926410283097312 8.811297214479 +5580 0.5580 0.0917627162799134 8.754943381876 +5581 0.5581 0.0908900326307442 8.698729601509 +5582 0.5582 0.0900229633050091 8.642656913192 +5583 0.5583 0.0891614941418490 8.586726350011 +5584 0.5584 0.0883056108774342 8.530938938285 +5585 0.5585 0.0874552991456434 8.475295697531 +5586 0.5586 0.0866105444787454 8.419797640428 +5587 0.5587 0.0857713323080853 8.364445772774 +5588 0.5588 0.0849376479647737 8.309241093458 +5589 0.5589 0.0841094766803799 8.254184594419 +5590 0.5590 0.0832868035876283 8.199277260613 +5591 0.5591 0.0824696137210989 8.144520069974 +5592 0.5592 0.0816578920179312 8.089913993380 +5593 0.5593 0.0808516233185313 8.035459994618 +5594 0.5594 0.0800507923672829 7.981159030350 +5595 0.5595 0.0792553838132616 7.927012050077 +5596 0.5596 0.0784653822109526 7.873019996103 +5597 0.5597 0.0776807720209724 7.819183803501 +5598 0.5598 0.0769015376107932 7.765504400083 +5599 0.5599 0.0761276632554710 7.711982706360 +5600 0.5600 0.0753591331383773 7.658619635514 +5601 0.5601 0.0745959313519338 7.605416093357 +5602 0.5602 0.0738380418983506 7.552372978307 +5603 0.5603 0.0730854486903678 7.499491181348 +5604 0.5604 0.0723381355520005 7.446771585999 +5605 0.5605 0.0715960862192864 7.394215068283 +5606 0.5606 0.0708592843410376 7.341822496693 +5607 0.5607 0.0701277134795949 7.289594732161 +5608 0.5608 0.0694013571115855 7.237532628026 +5609 0.5609 0.0686801986286842 7.185637030000 +5610 0.5610 0.0679642213383772 7.133908776141 +5611 0.5611 0.0672534084647292 7.082348696818 +5612 0.5612 0.0665477431491541 7.030957614684 +5613 0.5613 0.0658472084511879 6.979736344640 +5614 0.5614 0.0651517873492654 6.928685693810 +5615 0.5615 0.0644614627414995 6.877806461508 +5616 0.5616 0.0637762174464637 6.827099439209 +5617 0.5617 0.0630960342039773 6.776565410519 +5618 0.5618 0.0624208956758939 6.726205151149 +5619 0.5619 0.0617507844468926 6.676019428877 +5620 0.5620 0.0610856830252723 6.626009003529 +5621 0.5621 0.0604255738437484 6.576174626949 +5622 0.5622 0.0597704392602528 6.526517042963 +5623 0.5623 0.0591202615587366 6.477036987361 +5624 0.5624 0.0584750229499754 6.427735187862 +5625 0.5625 0.0578347055723778 6.378612364091 +5626 0.5626 0.0571992914927957 6.329669227550 +5627 0.5627 0.0565687627073387 6.280906481591 +5628 0.5628 0.0559431011421896 6.232324821391 +5629 0.5629 0.0553222886544239 6.183924933922 +5630 0.5630 0.0547063070328313 6.135707497930 +5631 0.5631 0.0540951379987395 6.087673183906 +5632 0.5632 0.0534887632068411 6.039822654063 +5633 0.5633 0.0528871642460226 5.992156562306 +5634 0.5634 0.0522903226401967 5.944675554212 +5635 0.5635 0.0516982198491358 5.897380267006 +5636 0.5636 0.0511108372693089 5.850271329532 +5637 0.5637 0.0505281562347207 5.803349362233 +5638 0.5638 0.0499501580177527 5.756614977126 +5639 0.5639 0.0493768238300075 5.710068777779 +5640 0.5640 0.0488081348231542 5.663711359287 +5641 0.5641 0.0482440720897773 5.617543308250 +5642 0.5642 0.0476846166642272 5.571565202752 +5643 0.5643 0.0471297495234728 5.525777612336 +5644 0.5644 0.0465794515879567 5.480181097986 +5645 0.5645 0.0460337037224524 5.434776212101 +5646 0.5646 0.0454924867369234 5.389563498478 +5647 0.5647 0.0449557813873852 5.344543492286 +5648 0.5648 0.0444235683767682 5.299716720055 +5649 0.5649 0.0438958283557833 5.255083699643 +5650 0.5650 0.0433725419237898 5.210644940227 +5651 0.5651 0.0428536896296645 5.166400942278 +5652 0.5652 0.0423392519726734 5.122352197545 +5653 0.5653 0.0418292094033446 5.078499189030 +5654 0.5654 0.0413235423243442 5.034842390979 +5655 0.5655 0.0408222310913525 4.991382268854 +5656 0.5656 0.0403252560139436 4.948119279324 +5657 0.5657 0.0398325973564654 4.905053870240 +5658 0.5658 0.0393442353389223 4.862186480622 +5659 0.5659 0.0388601501378591 4.819517540642 +5660 0.5660 0.0383803218872466 4.777047471608 +5661 0.5661 0.0379047306793691 4.734776685942 +5662 0.5662 0.0374333565657133 4.692705587175 +5663 0.5663 0.0369661795578585 4.650834569920 +5664 0.5664 0.0365031796283691 4.609164019869 +5665 0.5665 0.0360443367116874 4.567694313765 +5666 0.5666 0.0355896307050292 4.526425819399 +5667 0.5667 0.0351390414692798 4.485358895589 +5668 0.5668 0.0346925488298918 4.444493892170 +5669 0.5669 0.0342501325777842 4.403831149982 +5670 0.5670 0.0338117724702426 4.363371000850 +5671 0.5671 0.0333774482318211 4.323113767580 +5672 0.5672 0.0329471395552450 4.283059763943 +5673 0.5673 0.0325208261023148 4.243209294660 +5674 0.5674 0.0320984875048119 4.203562655398 +5675 0.5675 0.0316801033654044 4.164120132753 +5676 0.5676 0.0312656532585545 4.124882004244 +5677 0.5677 0.0308551167314276 4.085848538295 +5678 0.5678 0.0304484733048010 4.047019994236 +5679 0.5679 0.0300457024739750 4.008396622284 +5680 0.5680 0.0296467837096838 3.969978663540 +5681 0.5681 0.0292516964590079 3.931766349979 +5682 0.5682 0.0288604201462871 3.893759904436 +5683 0.5683 0.0284729341740349 3.855959540609 +5684 0.5684 0.0280892179238524 3.818365463041 +5685 0.5685 0.0277092507573443 3.780977867121 +5686 0.5686 0.0273330120170347 3.743796939070 +5687 0.5687 0.0269604810272841 3.706822855942 +5688 0.5688 0.0265916370952064 3.670055785612 +5689 0.5689 0.0262264595115871 3.633495886774 +5690 0.5690 0.0258649275518017 3.597143308934 +5691 0.5691 0.0255070204767346 3.560998192408 +5692 0.5692 0.0251527175336984 3.525060668317 +5693 0.5693 0.0248019979573536 3.489330858578 +5694 0.5694 0.0244548409706293 3.453808875908 +5695 0.5695 0.0241112257856430 3.418494823818 +5696 0.5696 0.0237711316046216 3.383388796611 +5697 0.5697 0.0234345376208222 3.348490879376 +5698 0.5698 0.0231014230194538 3.313801147993 +5699 0.5699 0.0227717669785978 3.279319669126 +5700 0.5700 0.0224455486701301 3.245046500227 +5701 0.5701 0.0221227472606423 3.210981689530 +5702 0.5702 0.0218033419123630 3.177125276056 +5703 0.5703 0.0214873117840796 3.143477289611 +5704 0.5704 0.0211746360320597 3.110037750787 +5705 0.5705 0.0208652938109721 3.076806670965 +5706 0.5706 0.0205592642748082 3.043784052314 +5707 0.5707 0.0202565265778026 3.010969887797 +5708 0.5708 0.0199570598753544 2.978364161168 +5709 0.5709 0.0196608433249468 2.945966846983 +5710 0.5710 0.0193678560870678 2.913777910597 +5711 0.5711 0.0190780773261295 2.881797308170 +5712 0.5712 0.0187914862113874 2.850024986671 +5713 0.5713 0.0185080619178595 2.818460883888 +5714 0.5714 0.0182277836272438 2.787104928425 +5715 0.5715 0.0179506305288369 2.755957039713 +5716 0.5716 0.0176765818204504 2.725017128017 +5717 0.5717 0.0174056167093276 2.694285094440 +5718 0.5718 0.0171377144130590 2.663760830931 +5719 0.5719 0.0168728541604977 2.633444220296 +5720 0.5720 0.0166110151926728 2.603335136202 +5721 0.5721 0.0163521767637034 2.573433443186 +5722 0.5722 0.0160963181417106 2.543738996669 +5723 0.5723 0.0158434186097292 2.514251642960 +5724 0.5724 0.0155934574666178 2.484971219268 +5725 0.5725 0.0153464140279687 2.455897553713 +5726 0.5726 0.0151022676270161 2.427030465340 +5727 0.5727 0.0148609976155428 2.398369764125 +5728 0.5728 0.0146225833647870 2.369915250992 +5729 0.5729 0.0143870042663463 2.341666717821 +5730 0.5730 0.0141542397330820 2.313623947467 +5731 0.5731 0.0139242692000202 2.285786713767 +5732 0.5732 0.0136970721252539 2.258154781561 +5733 0.5733 0.0134726279908408 2.230727906700 +5734 0.5734 0.0132509163037025 2.203505836067 +5735 0.5735 0.0130319165965197 2.176488307587 +5736 0.5736 0.0128156084286280 2.149675050247 +5737 0.5737 0.0126019713869101 2.123065784112 +5738 0.5738 0.0123909850866873 2.096660220344 +5739 0.5739 0.0121826291726095 2.070458061212 +5740 0.5740 0.0119768833195428 2.044459000121 +5741 0.5741 0.0117737272334557 2.018662721623 +5742 0.5742 0.0115731406523025 1.993068901439 +5743 0.5743 0.0113751033469067 1.967677206479 +5744 0.5744 0.0111795951218398 1.942487294859 +5745 0.5745 0.0109865958163003 1.917498815930 +5746 0.5746 0.0107960853049894 1.892711410288 +5747 0.5747 0.0106080434989848 1.868124709805 +5748 0.5748 0.0104224503466121 1.843738337648 +5749 0.5749 0.0102392858343146 1.819551908301 +5750 0.5750 0.0100585299875201 1.795565027591 +5751 0.5751 0.0098801628715049 1.771777292711 +5752 0.5752 0.0097041645922572 1.748188292243 +5753 0.5753 0.0095305152973359 1.724797606183 +5754 0.5754 0.0093591951767281 1.701604805973 +5755 0.5755 0.0091901844637036 1.678609454518 +5756 0.5756 0.0090234634356667 1.655811106220 +5757 0.5757 0.0088590124150057 1.633209307000 +5758 0.5758 0.0086968117699392 1.610803594329 +5759 0.5759 0.0085368419153598 1.588593497259 +5760 0.5760 0.0083790833136747 1.566578536443 +5761 0.5761 0.0082235164756437 1.544758224177 +5762 0.5762 0.0080701219612139 1.523132064419 +5763 0.5763 0.0079188803803516 1.501699552828 +5764 0.5764 0.0077697723938708 1.480460176787 +5765 0.5765 0.0076227787142592 1.459413415445 +5766 0.5766 0.0074778801065001 1.438558739738 +5767 0.5767 0.0073350573888914 1.417895612436 +5768 0.5768 0.0071942914338616 1.397423488159 +5769 0.5769 0.0070555631687822 1.377141813429 +5770 0.5770 0.0069188535767762 1.357050026691 +5771 0.5771 0.0067841436975237 1.337147558360 +5772 0.5772 0.0066514146280635 1.317433830843 +5773 0.5773 0.0065206475235919 1.297908258590 +5774 0.5774 0.0063918235982563 1.278570248121 +5775 0.5775 0.0062649241259468 1.259419198069 +5776 0.5776 0.0061399304410825 1.240454499217 +5777 0.5777 0.0060168239393950 1.221675534534 +5778 0.5778 0.0058955860787073 1.203081679220 +5779 0.5779 0.0057761983797093 1.184672300740 +5780 0.5780 0.0056586424267287 1.166446758871 +5781 0.5781 0.0055428998684984 1.148404405737 +5782 0.5782 0.0054289524189186 1.130544585858 +5783 0.5783 0.0053167818578164 1.112866636186 +5784 0.5784 0.0052063700316994 1.095369886153 +5785 0.5785 0.0050976988545064 1.078053657707 +5786 0.5786 0.0049907503083525 1.060917265371 +5787 0.5787 0.0048855064442703 1.043960016273 +5788 0.5788 0.0047819493829467 1.027181210200 +5789 0.5789 0.0046800613154546 1.010580139641 +5790 0.5790 0.0045798245039808 0.994156089836 +5791 0.5791 0.0044812212825479 0.977908338821 +5792 0.5792 0.0043842340577328 0.961836157481 +5793 0.5793 0.0042888453093791 0.945938809593 +5794 0.5794 0.0041950375913056 0.930215551877 +5795 0.5795 0.0041027935320093 0.914665634049 +5796 0.5796 0.0040120958353633 0.899288298872 +5797 0.5797 0.0039229272813097 0.884082782200 +5798 0.5798 0.0038352707265478 0.869048313038 +5799 0.5799 0.0037491091052162 0.854184113594 +5800 0.5800 0.0036644254295701 0.839489399327 +5801 0.5801 0.0035812027906536 0.824963379004 +5802 0.5802 0.0034994243589655 0.810605254757 +5803 0.5803 0.0034190733851208 0.796414222137 +5804 0.5804 0.0033401332005058 0.782389470164 +5805 0.5805 0.0032625872179279 0.768530181393 +5806 0.5806 0.0031864189322599 0.754835531967 +5807 0.5807 0.0031116119210779 0.741304691673 +5808 0.5808 0.0030381498452941 0.727936824004 +5809 0.5809 0.0029660164497831 0.714731086215 +5810 0.5810 0.0028951955640031 0.701686629386 +5811 0.5811 0.0028256711026098 0.688802598479 +5812 0.5812 0.0027574270660655 0.676078132407 +5813 0.5813 0.0026904475412409 0.663512364085 +5814 0.5814 0.0026247167020116 0.651104420501 +5815 0.5815 0.0025602188098478 0.638853422775 +5816 0.5816 0.0024969382143977 0.626758486227 +5817 0.5817 0.0024348593540645 0.614818720438 +5818 0.5818 0.0023739667565768 0.603033229315 +5819 0.5819 0.0023142450395530 0.591401111162 +5820 0.5820 0.0022556789110579 0.579921458740 +5821 0.5821 0.0021982531701537 0.568593359343 +5822 0.5822 0.0021419527074437 0.557415894857 +5823 0.5823 0.0020867625056091 0.546388141836 +5824 0.5824 0.0020326676399389 0.535509171567 +5825 0.5825 0.0019796532788535 0.524778050142 +5826 0.5826 0.0019277046844198 0.514193838531 +5827 0.5827 0.0018768072128608 0.503755592650 +5828 0.5828 0.0018269463150565 0.493462363436 +5829 0.5829 0.0017781075370387 0.483313196921 +5830 0.5830 0.0017302765204776 0.473307134300 +5831 0.5831 0.0016834390031619 0.463443212013 +5832 0.5832 0.0016375808194705 0.453720461817 +5833 0.5833 0.0015926879008364 0.444137910864 +5834 0.5834 0.0015487462762046 0.434694581772 +5835 0.5835 0.0015057420724806 0.425389492709 +5836 0.5836 0.0014636615149717 0.416221657467 +5837 0.5837 0.0014224909278211 0.407190085546 +5838 0.5838 0.0013822167344327 0.398293782222 +5839 0.5839 0.0013428254578891 0.389531748649 +5840 0.5840 0.0013043037213610 0.380902981914 +5841 0.5841 0.0012666382485083 0.372406475140 +5842 0.5842 0.0012298158638734 0.364041217557 +5843 0.5843 0.0011938234932663 0.355806194587 +5844 0.5844 0.0011586481641402 0.347700387935 +5845 0.5845 0.0011242770059602 0.339722775665 +5846 0.5846 0.0010906972505625 0.331872332288 +5847 0.5847 0.0010578962325053 0.324148028857 +5848 0.5848 0.0010258613894105 0.316548833039 +5849 0.5849 0.0009945802622977 0.309073709216 +5850 0.5850 0.0009640404959088 0.301721618563 +5851 0.5851 0.0009342298390232 0.294491519149 +5852 0.5852 0.0009051361447649 0.287382366017 +5853 0.5853 0.0008767473708998 0.280393111285 +5854 0.5854 0.0008490515801244 0.273522704222 +5855 0.5855 0.0008220369403454 0.266770091359 +5856 0.5856 0.0007956917249489 0.260134216571 +5857 0.5857 0.0007700043130617 0.253614021172 +5858 0.5858 0.0007449631898025 0.247208444013 +5859 0.5859 0.0007205569465230 0.240916421577 +5860 0.5860 0.0006967742810405 0.234736888073 +5861 0.5861 0.0006736039978601 0.228668775535 +5862 0.5862 0.0006510350083873 0.222711013920 +5863 0.5863 0.0006290563311309 0.216862531208 +5864 0.5864 0.0006076570918958 0.211122253494 +5865 0.5865 0.0005868265239659 0.205489105104 +5866 0.5866 0.0005665539682768 0.199962008678 +5867 0.5867 0.0005468288735786 0.194539885287 +5868 0.5868 0.0005276407965881 0.189221654523 +5869 0.5869 0.0005089794021313 0.184006234612 +5870 0.5870 0.0004908344632749 0.178892542516 +5871 0.5871 0.0004731958614473 0.173879494037 +5872 0.5872 0.0004560535865494 0.168966003920 +5873 0.5873 0.0004393977370551 0.164150985966 +5874 0.5874 0.0004232185201000 0.159433353136 +5875 0.5875 0.0004075062515602 0.154812017660 +5876 0.5876 0.0003922513561198 0.150285891148 +5877 0.5877 0.0003774443673278 0.145853884692 +5878 0.5878 0.0003630759276436 0.141514908993 +5879 0.5879 0.0003491367884712 0.137267874454 +5880 0.5880 0.0003356178101833 0.133111691305 +5881 0.5881 0.0003225099621323 0.129045269714 +5882 0.5882 0.0003098043226517 0.125067519898 +5883 0.5883 0.0002974920790448 0.121177352240 +5884 0.5884 0.0002855645275626 0.117373677404 +5885 0.5885 0.0002740130733697 0.113655406454 +5886 0.5886 0.0002628292304983 0.110021450974 +5887 0.5887 0.0002520046217911 0.106470723171 +5888 0.5888 0.0002415309788316 0.103002136019 +5889 0.5889 0.0002314001418629 0.099614603355 +5890 0.5890 0.0002216040596943 0.096307040016 +5891 0.5891 0.0002121347895957 0.093078361957 +5892 0.5892 0.0002029844971796 0.089927486364 +5893 0.5893 0.0001941454562717 0.086853331794 +5894 0.5894 0.0001856100487678 0.083854818285 +5895 0.5895 0.0001773707644789 0.080930867493 +5896 0.5896 0.0001694202009641 0.078080402803 +5897 0.5897 0.0001617510633501 0.075302349477 +5898 0.5898 0.0001543561641385 0.072595634755 +5899 0.5899 0.0001472284230001 0.069959188012 +5900 0.5900 0.0001403608665563 0.067391940864 +5901 0.5901 0.0001337466281472 0.064892827319 +5902 0.5902 0.0001273789475872 0.062460783881 +5903 0.5903 0.0001212511709073 0.060094749716 +5904 0.5904 0.0001153567500837 0.057793666756 +5905 0.5905 0.0001096892427533 0.055556479852 +5906 0.5906 0.0001042423119160 0.053382136895 +5907 0.5907 0.0000990097256231 0.051269588963 +5908 0.5908 0.0000939853566525 0.049217790448 +5909 0.5909 0.0000891631821699 0.047225699205 +5910 0.5910 0.0000845372833759 0.045292276674 +5911 0.5911 0.0000801018451402 0.043416488041 +5912 0.5912 0.0000758511556204 0.041597302354 +5913 0.5913 0.0000717796058688 0.039833692678 +5914 0.5914 0.0000678816894229 0.038124636241 +5915 0.5915 0.0000641520018825 0.036469114567 +5916 0.5916 0.0000605852404732 0.034866113619 +5917 0.5917 0.0000571762035945 0.033314623955 +5918 0.5918 0.0000539197903535 0.031813640865 +5919 0.5919 0.0000508110000845 0.030362164515 +5920 0.5920 0.0000478449318538 0.028959200099 +5921 0.5921 0.0000450167839493 0.027603757991 +5922 0.5922 0.0000423218533553 0.026294853888 +5923 0.5923 0.0000397555352129 0.025031508961 +5924 0.5924 0.0000373133222647 0.023812750002 +5925 0.5925 0.0000349908042850 0.022637609593 +5926 0.5926 0.0000327836674933 0.021505126240 +5927 0.5927 0.0000306876939549 0.020414344528 +5928 0.5928 0.0000286987609638 0.019364315294 +5929 0.5929 0.0000268128404110 0.018354095762 +5930 0.5930 0.0000250259981374 0.017382749709 +5931 0.5931 0.0000233343932709 0.016449347622 +5932 0.5932 0.0000217342775469 0.015552966857 +5933 0.5933 0.0000202219946143 0.014692691796 +5934 0.5934 0.0000187939793241 0.013867614007 +5935 0.5935 0.0000174467570030 0.013076832415 +5936 0.5936 0.0000161769427100 0.012319453445 +5937 0.5937 0.0000149812404775 0.011594591205 +5938 0.5938 0.0000138564425353 0.010901367639 +5939 0.5939 0.0000127994285187 0.010238912694 +5940 0.5940 0.0000118071646594 0.009606364491 +5941 0.5941 0.0000108767029609 0.009002869480 +5942 0.5942 0.0000100051803554 0.008427582629 +5943 0.5943 0.0000091898178456 0.007879667567 +5944 0.5944 0.0000084279196287 0.007358296772 +5945 0.5945 0.0000077168722031 0.006862651740 +5946 0.5946 0.0000070541434585 0.006391923152 +5947 0.5947 0.0000064372817488 0.005945311043 +5948 0.5948 0.0000058639149470 0.005522024993 +5949 0.5949 0.0000053317494834 0.005121284279 +5950 0.5950 0.0000048385693660 0.004742318068 +5951 0.5951 0.0000043822351834 0.004384365584 +5952 0.5952 0.0000039606830894 0.004046676296 +5953 0.5953 0.0000035719237704 0.003728510085 +5954 0.5954 0.0000032140413947 0.003429137428 +5955 0.5955 0.0000028851925443 0.003147839580 +5956 0.5956 0.0000025836051272 0.002883908762 +5957 0.5957 0.0000023075772728 0.002636648327 +5958 0.5958 0.0000020554762083 0.002405372962 +5959 0.5959 0.0000018257371175 0.002189408855 +5960 0.5960 0.0000016168619797 0.001988093901 +5961 0.5961 0.0000014274183913 0.001800777867 +5962 0.5962 0.0000012560383680 0.001626822598 +5963 0.5963 0.0000011014171283 0.001465602195 +5964 0.5964 0.0000009623118584 0.001316503204 +5965 0.5965 0.0000008375404574 0.001178924815 +5966 0.5966 0.0000007259802642 0.001052279049 +5967 0.5967 0.0000006265667647 0.000935990942 +5968 0.5968 0.0000005382922795 0.000829498762 +5969 0.5969 0.0000004602046326 0.000732254177 +5970 0.5970 0.0000003914058004 0.000643722466 +5971 0.5971 0.0000003310505415 0.000563382712 +5972 0.5972 0.0000002783450059 0.000490728000 +5973 0.5973 0.0000002325453249 0.000425265619 +5974 0.5974 0.0000001929561812 0.000366517256 +5975 0.5975 0.0000001589293584 0.000314019201 +5976 0.5976 0.0000001298622712 0.000267322543 +5977 0.5977 0.0000001051964747 0.000225993387 +5978 0.5978 0.0000000844161535 0.000189613036 +5979 0.5979 0.0000000670465907 0.000157778221 +5980 0.5980 0.0000000526526156 0.000130101281 +5981 0.5981 0.0000000408370316 0.000106210399 +5982 0.5982 0.0000000312390227 0.000085749779 +5983 0.5983 0.0000000235325395 0.000068379884 +5984 0.5984 0.0000000174246640 0.000053777626 +5985 0.5985 0.0000000126539537 0.000041636579 +5986 0.5986 0.0000000089887644 0.000031667209 +5987 0.5987 0.0000000062255506 0.000023597067 +5988 0.5988 0.0000000041871465 0.000017171015 +5989 0.5989 0.0000000027210244 0.000012151426 +5990 0.5990 0.0000000016975314 0.000008318434 +5991 0.5991 0.0000000010081044 0.000005470106 +5992 0.5992 0.0000000005634638 0.000003422706 +5993 0.5993 0.0000000002917849 0.000002010872 +5994 0.5994 0.0000000001368474 0.000001087878 +5995 0.5995 0.0000000000561625 0.000000525820 +5996 0.5996 0.0000000000190784 0.000000215861 +5997 0.5997 0.0000000000048627 0.000000068454 +5998 0.5998 0.0000000000007625 0.000000013551 +5999 0.5999 0.0000000000000424 0.000000000849 +6000 0.6000 0.0000000000000000 0.000000000000 diff --git a/potentials/ffield.ci-reax.CH b/potentials/ffield.ci-reax.CH new file mode 100644 index 0000000000..6882da5d58 --- /dev/null +++ b/potentials/ffield.ci-reax.CH @@ -0,0 +1,78 @@ +DATE: 2017-11-20 CONTRIBUTOR: Michal Kanski michal.kanski@uj.edu.pl CITATION: Michal Kanski, Dawid Maciazek, Zbigniew Postawa, Adri C.T. van Duin, Chowdhury Ashraf, and Barbara J. Garrison Development of a Charge-Implicit ReaxFF Potential for Hydrocarbon Systems, J. Phys. Chem. Lett., 2018, 9, pp 359–363, DOI: 10.1021/acs.jpclett.7b03155 + 39 ! Number of general parameters + 50.0000 !p(boc1) + 9.5469 !p(boc2) + 26.5405 !p(coa2) + 1.5105 !p(trip4) + 6.6630 !p(trip3) + 70.0000 !kc2 + 1.0588 !p(ovun6) + 4.6000 !p(trip2) + 12.1176 !p(ovun7) + 13.3056 !p(ovun8) + -70.1292 !p(trip1) + 0.0000 !Lower Taper-radius (swa) + 7.0000 !Upper Taper-radius (swb) + 0.0000 !not used + 33.8667 !p(val7) + 6.0891 !p(lp1) + 1.0563 !p(val9) + 2.0384 !p(val10) + 6.1431 !not used + 6.9290 !p(pen2) + 0.3989 !p(pen3) + 3.9954 !p(pen4) + 0.0000 !not used + 5.7796 !p(tor2) + 10.0000 !p(tor3) + 1.9487 !p(tor4) + 0.0000 !not used + 2.1645 !p(cot2) + 1.5591 !p(vdW1) + 0.1000 !Cutoff for bond order*100 (cutoff) + 2.1365 !p(coa4) + 0.6991 !p(ovun4) + 50.0000 !p(ovun3) + 1.8512 !p(val8) + 0.0000 !not used + 0.0000 !not used + 0.0000 !not used + 0.0000 !not used + 2.6962 !p(coa3) + 2 ! Nr of atoms; atomID;ro(sigma); Val;atom mass;Rvdw;Dij;gamma + alfa;gamma(w);Val(angle);p(ovun5);n.u.;chiEEM;etaEEM;n.u. + ro(pipi);p(lp2);Heat increment;p(boc4);p(boc3);p(boc5),n.u.;n.u. + p(ovun2);p(val3);n.u.;Val(boc);p(val5);n.u.;n.u.;n.u. + C 1.5807 4.0000 12.0000 2.1339 0.2705 0.9000 1.3561 4.0000 + 7.0578 2.2030 4.0000 33.2433 79.5548 1.0000 7.0000 0.0000 + 1.2857 0.0000 199.0303 25.5946 34.7987 33.8858 0.8563 0.0000 + -3.2763 4.0000 1.0564 4.0000 1.1829 1.8737 0.9340 10.7610 + H 0.8431 1.0000 1.0080 1.7993 0.0531 1.0206 -0.1000 1.0000 + 5.1365 2.3597 1.0000 0.0000 121.1250 1.0000 7.0000 1.0000 + -0.1000 0.0000 62.4879 1.7831 10.0956 1.5343 1.0698 0.0000 + -39.1433 2.0000 1.0338 1.0000 1.4937 1.4730 0.2395 9.1813 + 3 ! Nr of bonds; at1;at2;De(sigma);De(pi);De(pipi);p(be1);p(b + p(be2);p(bo3);p(bo4);n.u.;p(bo1);p(bo2) + 1 1 143.8966 78.5316 96.1991 -0.6337 -1.0884 1.0000 19.6513 0.4644 + 1.0466 -0.6287 8.3354 1.0000 -0.1410 7.4059 1.0000 0.0000 + 1 2 142.2786 0.0000 0.0000 -0.7910 0.0000 1.0000 7.6804 0.6354 + 8.9091 1.0000 0.0000 1.0000 -0.1759 9.1526 0.0000 0.0000 + 2 2 166.9928 0.0000 0.0000 -0.2894 0.0000 1.0000 9.0000 0.7986 + 22.4216 1.0000 0.0000 1.0000 -0.1025 5.0250 0.0000 0.0000 + 1 ! Nr of off-diagonal terms. at1;at2;Dij;RvdW;alfa;ro(sigma);r + 1 2 0.0384 1.4571 8.0036 1.4872 -1.0000 -1.0000 + 6 ! Nr of angles. at1;at2;at3;Thetao,o;p(val1);p(val2);p(coa1); + 1 1 1 66.9930 26.8666 1.3549 -0.9012 4.6851 18.8775 1.8087 + 1 1 2 65.9137 8.8776 9.1600 0.0000 0.3144 0.0000 4.3449 + 2 1 2 70.6653 32.2568 1.7885 0.0000 2.1528 0.0000 9.9760 + 1 2 2 0.0000 40.0000 1.0000 0.0000 3.2849 0.0000 9.0719 + 1 2 1 0.0000 33.4427 5.0679 0.0000 1.1188 0.0000 10.0000 + 2 2 2 0.0000 27.9213 5.8635 0.0000 0.0000 0.0000 1.0400 + 6 ! Nr of torsions. at1;at2;at3;at4;;V1;V2;V3;p(tor1);p(cot1);n + 1 1 1 1 0.0500 17.1779 0.1145 -3.7630 -1.4900 0.0000 0.0000 + 1 1 1 2 -0.4619 27.8830 0.2611 -3.8205 -2.0485 0.0000 0.0000 + 2 1 1 2 0.1629 22.7282 0.3893 -2.9569 -7.8729 0.0000 0.0000 + 0 1 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 2 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 0 1 1 0 0.0000 50.0000 0.3000 -4.0000 -2.0000 0.0000 0.0000 + 0 ! Nr of hydrogen bonds. at1;at2;at3;r(hb);p(hb1);p(hb2);p(hb3 diff --git a/python/examples/simple.py b/python/examples/simple.py index da07a69997..ff777c8a09 100755 --- a/python/examples/simple.py +++ b/python/examples/simple.py @@ -88,8 +88,6 @@ lmp.command("run 10"); # uncomment if running in parallel via Pypar #print("Proc %d out of %d procs has" % (me,nprocs), lmp) -#pypar.finalize() # uncomment if running in parallel via mpi4py -#print "Proc %d out of %d procs has" % (me,nprocs), lmp -#MPI.Finalize() +#print("Proc %d out of %d procs has" % (me,nprocs), lmp) diff --git a/python/lammps.py b/python/lammps.py index a512efdcda..fdb898488a 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -32,6 +32,13 @@ import select import re import sys +def get_ctypes_int(size): + if size == 4: + return c_int32 + elif size == 8: + return c_int64 + return c_int + class MPIAbortException(Exception): def __init__(self, message): self.message = message @@ -39,17 +46,15 @@ class MPIAbortException(Exception): def __str__(self): return repr(self.message) - class lammps(object): # detect if Python is using version of mpi4py that can pass a communicator - has_mpi4py_v2 = False + has_mpi4py = False try: from mpi4py import MPI from mpi4py import __version__ as mpi4py_version - if mpi4py_version.split('.')[0] == '2': - has_mpi4py_v2 = True + if mpi4py_version.split('.')[0] in ['2','3']: has_mpi4py = True except: pass @@ -104,7 +109,9 @@ class lammps(object): # need to adjust for type of MPI communicator object # allow for int (like MPICH) or void* (like OpenMPI) - if lammps.has_mpi4py_v2 and comm != None: + if comm: + if not lammps.has_mpi4py: + raise Exception('Python mpi4py version is not 2 or 3') if lammps.MPI._sizeof(lammps.MPI.Comm) == sizeof(c_int): MPI_Comm = c_int else: @@ -162,6 +169,14 @@ class lammps(object): pythonapi.PyCObject_AsVoidPtr.argtypes = [py_object] self.lmp = c_void_p(pythonapi.PyCObject_AsVoidPtr(ptr)) + # optional numpy support (lazy loading) + self._numpy = None + + # set default types + self.c_bigint = get_ctypes_int(self.extract_setting("bigint")) + self.c_tagint = get_ctypes_int(self.extract_setting("tagint")) + self.c_imageint = get_ctypes_int(self.extract_setting("imageint")) + def __del__(self): if self.lmp and self.opened: self.lib.lammps_close(self.lmp) @@ -236,6 +251,64 @@ class lammps(object): ptr = self.lib.lammps_extract_atom(self.lmp,name) return ptr + # extract lammps type byte sizes + + def extract_setting(self, name): + if name: name = name.encode() + self.lib.lammps_extract_atom.restype = c_int + return int(self.lib.lammps_extract_setting(self.lmp,name)) + + @property + def numpy(self): + if not self._numpy: + import numpy as np + class LammpsNumpyWrapper: + def __init__(self, lmp): + self.lmp = lmp + + def _ctype_to_numpy_int(self, ctype_int): + if ctype_int == c_int32: + return np.int32 + elif ctype_int == c_int64: + return np.int64 + return np.intc + + def extract_atom_iarray(self, name, nelem, dim=1): + if name in ['id', 'molecule']: + c_int_type = self.lmp.c_tagint + elif name in ['image']: + c_int_type = self.lmp.c_imageint + else: + c_int_type = c_int + + np_int_type = self._ctype_to_numpy_int(c_int_type) + + if dim == 1: + tmp = self.lmp.extract_atom(name, 0) + ptr = cast(tmp, POINTER(c_int_type * nelem)) + else: + tmp = self.lmp.extract_atom(name, 1) + ptr = cast(tmp[0], POINTER(c_int_type * nelem * dim)) + + a = np.frombuffer(ptr.contents, dtype=np_int_type) + a.shape = (nelem, dim) + return a + + def extract_atom_darray(self, name, nelem, dim=1): + if dim == 1: + tmp = self.lmp.extract_atom(name, 2) + ptr = cast(tmp, POINTER(c_double * nelem)) + else: + tmp = self.lmp.extract_atom(name, 3) + ptr = cast(tmp[0], POINTER(c_double * nelem * dim)) + + a = np.frombuffer(ptr.contents) + a.shape = (nelem, dim) + return a + + self._numpy = LammpsNumpyWrapper(self) + return self._numpy + # extract compute info def extract_compute(self,id,style,type): @@ -333,7 +406,7 @@ class lammps(object): # returned data is a 1d vector - doc how it is ordered? # NOTE: how could we insure are converting to correct Python type # e.g. for Python list or NumPy, etc - # ditto for extact_atom() above + # ditto for extract_atom() above def gather_atoms(self,name,type,count): if name: name = name.encode() @@ -546,6 +619,30 @@ class Atom2D(Atom): self.lmp.eval("fy[%d]" % self.index)) +class variable_set: + def __init__(self, name, variable_dict): + self._name = name + array_pattern = re.compile(r"(?P.+)\[(?P[0-9]+)\]") + + for key, value in variable_dict.items(): + m = array_pattern.match(key) + if m: + g = m.groupdict() + varname = g['arr'] + idx = int(g['index']) + if varname not in self.__dict__: + self.__dict__[varname] = {} + self.__dict__[varname][idx] = value + else: + self.__dict__[key] = value + + def __str__(self): + return "{}({})".format(self._name, ','.join(["{}={}".format(k, self.__dict__[k]) for k in self.__dict__.keys() if not k.startswith('_')])) + + def __repr__(self): + return self.__str__() + + def get_thermo_data(output): """ traverse output of runs and extract thermo data columns """ if isinstance(output, str): @@ -573,7 +670,7 @@ def get_thermo_data(output): elif line.startswith("Loop time of "): in_run = False columns = None - thermo_data = namedtuple('ThermoData', list(current_run.keys()))(*list(current_run.values())) + thermo_data = variable_set('ThermoData', current_run) r = {'thermo' : thermo_data } runs.append(namedtuple('Run', list(r.keys()))(*list(r.values()))) elif in_run and len(columns) > 0: @@ -804,6 +901,19 @@ class PyLammps(object): """ needed for Python2 compatibility, since print is a reserved keyword """ return self.__getattr__("print")(s) + def __dir__(self): + return ['angle_coeff', 'angle_style', 'atom_modify', 'atom_style', 'atom_style', + 'bond_coeff', 'bond_style', 'boundary', 'change_box', 'communicate', 'compute', + 'create_atoms', 'create_box', 'delete_atoms', 'delete_bonds', 'dielectric', + 'dihedral_coeff', 'dihedral_style', 'dimension', 'dump', 'fix', 'fix_modify', + 'group', 'improper_coeff', 'improper_style', 'include', 'kspace_modify', + 'kspace_style', 'lattice', 'mass', 'minimize', 'min_style', 'neighbor', + 'neigh_modify', 'newton', 'nthreads', 'pair_coeff', 'pair_modify', + 'pair_style', 'processors', 'read', 'read_data', 'read_restart', 'region', + 'replicate', 'reset_timestep', 'restart', 'run', 'run_style', 'thermo', + 'thermo_modify', 'thermo_style', 'timestep', 'undump', 'unfix', 'units', + 'variable', 'velocity', 'write_restart'] + def __getattr__(self, name): def handler(*args, **kwargs): cmd_args = [name] + [str(x) for x in args] diff --git a/src/.gitignore b/src/.gitignore index e26f3c6ca0..659ae557a8 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -11,9 +11,12 @@ /*_intel.h /*_intel.cpp /*_kokkos.h +/*_kokkos_impl.h /*_kokkos.cpp /*_omp.h /*_omp.cpp +/*_opt.h +/*_opt.cpp /*_tally.h /*_tally.cpp /*_rx.h @@ -25,6 +28,7 @@ /kokkos.h /kokkos_type.h /kokkos_few.h +/kokkos_base.h /manifold*.cpp /manifold*.h @@ -46,6 +50,7 @@ /colvarproxy_lammps.cpp /colvarproxy_lammps.h +/colvarproxy_lammps_version.h /fix_colvars.cpp /fix_colvars.h /dump_molfile.cpp @@ -57,9 +62,39 @@ /intel_buffers.cpp /intel_buffers.h /intel_intrinsics.h +/intel_intrinsics_airebo.h /intel_preprocess.h /intel_simd.h +/atom_vec_edpd.cpp +/atom_vec_edpd.h +/atom_vec_mdpd.cpp +/atom_vec_mdpd.h +/atom_vec_tdpd.cpp +/atom_vec_tdpd.h +/compute_edpd_temp_atom.cpp +/compute_edpd_temp_atom.h +/compute_tdpd_cc_atom.cpp +/compute_tdpd_cc_atom.h +/fix_edpd_source.cpp +/fix_edpd_source.h +/fix_mvv_dpd.cpp +/fix_mvv_dpd.h +/fix_mvv_edpd.cpp +/fix_mvv_edpd.h +/fix_mvv_tdpd.cpp +/fix_mvv_tdpd.h +/fix_tdpd_source.cpp +/fix_tdpd_source.h +/pair_edpd.cpp +/pair_edpd.h +/pair_mdpd.cpp +/pair_mdpd.h +/pair_mdpd_rhosum.cpp +/pair_mdpd_rhosum.h +/pair_tdpd.cpp +/pair_tdpd.h + /compute_sna_atom.cpp /compute_sna_atom.h /compute_snad_atom.cpp @@ -72,6 +107,15 @@ /sna.cpp /sna.h +/uef_*.cpp +/uef_*.h +/compute_*uef.cpp +/compute_*uef.h +/dump_*uef.cpp +/dump_*uef.h +/fix_*uef.cpp +/fix_*uef.h + /atom_vec_wavepacket.cpp /atom_vec_wavepacket.h /fix_nve_awpmd.cpp @@ -92,6 +136,10 @@ /angle_charmm.h /angle_class2.cpp /angle_class2.h +/angle_class2_p6.cpp +/angle_class2_p6.h +/angle_cosine_buck6d.cpp +/angle_cosine_buck6d.h /angle_cosine.cpp /angle_cosine.h /angle_cosine_delta.cpp @@ -154,6 +202,8 @@ /bond_fene.h /bond_fene_expand.cpp /bond_fene_expand.h +/bond_gromos.cpp +/bond_gromos.h /bond_harmonic.cpp /bond_harmonic.h /bond_harmonic_shift.cpp @@ -374,6 +424,8 @@ /fix_lambdah_calc.h /fix_langevin_eff.cpp /fix_langevin_eff.h +/fix_latte.cpp +/fix_latte.h /fix_lb_fluid.cpp /fix_lb_fluid.h /fix_lb_momentum.cpp @@ -472,6 +524,8 @@ /fix_reaxc_bonds.h /fix_reaxc_species.cpp /fix_reaxc_species.h +/fix_rhok.cpp +/fix_rhok.h /fix_rigid.cpp /fix_rigid.h /fix_rigid_nh.cpp @@ -500,6 +554,7 @@ /fix_shake.h /fix_shardlow.cpp /fix_shardlow.h +/random_external_state.h /fix_smd.cpp /fix_smd.h /fix_species.cpp @@ -555,6 +610,8 @@ /improper_harmonic.h /improper_hybrid.cpp /improper_hybrid.h +/improper_inversion_harmonic.cpp +/improper_inversion_harmonic.h /improper_ring.cpp /improper_ring.h /improper_umbrella.cpp @@ -600,6 +657,10 @@ /pair_buck_coul.h /pair_buck_long_coul_long.cpp /pair_buck_long_coul_long.h +/pair_buck6d_coul_gauss_dsf.cpp +/pair_buck6d_coul_gauss_dsf.h +/pair_buck6d_coul_gauss_long.cpp +/pair_buck6d_coul_gauss_long.h /pair_cdeam.cpp /pair_cdeam.h /pair_cg_cmm.cpp @@ -634,16 +695,10 @@ /pair_dsmc.h /pair_eam.cpp /pair_eam.h -/pair_eam_opt.cpp -/pair_eam_opt.h /pair_eam_alloy.cpp /pair_eam_alloy.h -/pair_eam_alloy_opt.cpp -/pair_eam_alloy_opt.h /pair_eam_fs.cpp /pair_eam_fs.h -/pair_eam_fs_opt.cpp -/pair_eam_fs_opt.h /pair_edip.cpp /pair_edip.h /pair_edip_multi.cpp @@ -687,8 +742,6 @@ /pair_lj_charmm_coul_charmm_implicit.h /pair_lj_charmm_coul_long.cpp /pair_lj_charmm_coul_long.h -/pair_lj_charmm_coul_long_opt.cpp -/pair_lj_charmm_coul_long_opt.h /pair_lj_charmm_coul_long_soft.cpp /pair_lj_charmm_coul_long_soft.h /pair_lj_charmm_coul_msm.cpp @@ -711,8 +764,6 @@ /pair_lj_cut_tip4p_cut.h /pair_lj_cut_coul_long.cpp /pair_lj_cut_coul_long.h -/pair_lj_cut_coul_long_opt.cpp -/pair_lj_cut_coul_long_opt.h /pair_lj_cut_coul_long_soft.cpp /pair_lj_cut_coul_long_soft.h /pair_lj_cut_coul_msm.cpp @@ -727,20 +778,14 @@ /pair_lj_cut_soft.h /pair_lj_cut_tip4p_long.cpp /pair_lj_cut_tip4p_long.h -/pair_lj_cut_tip4p_long_opt.cpp -/pair_lj_cut_tip4p_long_opt.h /pair_lj_cut_tip4p_long_soft.cpp /pair_lj_cut_tip4p_long_soft.h /pair_lj_long_coul_long.cpp /pair_lj_long_coul_long.h -/pair_lj_long_coul_long_opt.cpp -/pair_lj_long_coul_long_opt.h /pair_lj_long_dipole_long.cpp /pair_lj_long_dipole_long.h /pair_lj_long_tip4p_long.cpp /pair_lj_long_tip4p_long.h -/pair_lj_cut_opt.cpp -/pair_lj_cut_opt.h /pair_lj_cut_tgpu.cpp /pair_lj_cut_tgpu.h /pair_lj_sdk.cpp @@ -765,8 +810,6 @@ /pair_meam_spline.h /pair_meam_sw_spline.cpp /pair_meam_sw_spline.h -/pair_morse_opt.cpp -/pair_morse_opt.h /pair_morse_soft.cpp /pair_morse_soft.h /pair_nb3b_harmonic.cpp @@ -790,6 +833,8 @@ /pair_peri_pmb.h /pair_peri_ves.cpp /pair_peri_ves.h +/pair_quip.cpp +/pair_quip.h /pair_reax.cpp /pair_reax.h /pair_reax_fortran.h @@ -860,8 +905,10 @@ /python_impl.cpp /python_impl.h /python_compat.h -/fix_python.cpp -/fix_python.h +/fix_python_move.cpp +/fix_python_move.h +/fix_python_invoke.cpp +/fix_python_invoke.h /pair_python.cpp /pair_python.h /reader_molfile.cpp @@ -926,6 +973,8 @@ /temper.h /temper_grem.cpp /temper_grem.h +/temper_npt.cpp +/temper_npt.h /thr_data.cpp /thr_data.h /verlet_split.cpp @@ -1033,10 +1082,16 @@ /pair_born_coul_long_cs.h /pair_born_coul_dsf_cs.cpp /pair_born_coul_dsf_cs.h +/pair_born_coul_wolf_cs.cpp +/pair_born_coul_wolf_cs.h /pair_buck_coul_long_cs.cpp /pair_buck_coul_long_cs.h /pair_coul_long_cs.cpp /pair_coul_long_cs.h +/pair_coul_wolf_cs.cpp +/pair_coul_wolf_cs.h +/pair_extep.cpp +/pair_extep.h /pair_lj_cut_thole_long.cpp /pair_lj_cut_thole_long.h /pair_plum_hb.cpp diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index 5d2ae891d0..9278703e2a 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -66,6 +66,7 @@ PairLJClass2CoulLong::~PairLJClass2CoulLong() memory->destroy(offset); } } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ diff --git a/src/COLLOID/fix_wall_colloid.cpp b/src/COLLOID/fix_wall_colloid.cpp index 7c0203ac5f..651e0da4f8 100644 --- a/src/COLLOID/fix_wall_colloid.cpp +++ b/src/COLLOID/fix_wall_colloid.cpp @@ -81,6 +81,7 @@ void FixWallColloid::wall_particle(int m, int which, double coord) double r3,rinv3,r2inv3,r4inv3; double rad,rad2,rad4,rad8,diam,new_coeff2; double eoffset; + double vn; double **x = atom->x; double **f = atom->f; @@ -151,6 +152,12 @@ void FixWallColloid::wall_particle(int m, int which, double coord) ewall[0] -= eoffset; ewall[m+1] += fwall; + + if (evflag) { + if (side < 0) vn = -fwall*delta; + else vn = fwall*delta; + v_tally(dim, i, vn); + } } if (onflag) error->one(FLERR,"Particle on or inside fix wall surface"); diff --git a/src/CORESHELL/Install.sh b/src/CORESHELL/Install.sh index 7c0b7a02a2..93c8fe8132 100644 --- a/src/CORESHELL/Install.sh +++ b/src/CORESHELL/Install.sh @@ -30,13 +30,19 @@ action () { action compute_temp_cs.cpp action compute_temp_cs.h -action pair_born_coul_long_cs.cpp pair_born_coul_long.cpp -action pair_born_coul_dsf_cs.cpp pair_born_coul_dsf.cpp -action pair_buck_coul_long_cs.cpp pair_buck_coul_long.cpp -action pair_born_coul_long_cs.h pair_born_coul_long.h -action pair_born_coul_dsf_cs.h pair_born_coul_dsf.h -action pair_buck_coul_long_cs.h pair_buck_coul_long.h -action pair_coul_long_cs.cpp pair_coul_long.cpp -action pair_coul_long_cs.h pair_coul_long.h + +action pair_born_coul_long_cs.cpp pair_born_coul_long.cpp +action pair_born_coul_dsf_cs.cpp pair_born_coul_dsf.cpp +action pair_buck_coul_long_cs.cpp pair_buck_coul_long.cpp +action pair_born_coul_long_cs.h pair_born_coul_long.h +action pair_born_coul_dsf_cs.h pair_born_coul_dsf.h +action pair_buck_coul_long_cs.h pair_buck_coul_long.h +action pair_coul_long_cs.cpp pair_coul_long.cpp +action pair_coul_long_cs.h pair_coul_long.h action pair_lj_cut_coul_long_cs.cpp pair_lj_cut_coul_long.cpp -action pair_lj_cut_coul_long_cs.h pair_lj_cut_coul_long.h +action pair_lj_cut_coul_long_cs.h pair_lj_cut_coul_long.h + +action pair_born_coul_wolf_cs.cpp pair_born_coul_wolf.cpp +action pair_born_coul_wolf_cs.h pair_born_coul_wolf.h +action pair_coul_wolf_cs.cpp pair_coul_wolf.cpp +action pair_coul_wolf_cs.h pair_coul_wolf.h diff --git a/src/CORESHELL/pair_born_coul_wolf_cs.cpp b/src/CORESHELL/pair_born_coul_wolf_cs.cpp new file mode 100644 index 0000000000..3c98f5bf77 --- /dev/null +++ b/src/CORESHELL/pair_born_coul_wolf_cs.cpp @@ -0,0 +1,169 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + + +#include +#include +#include +#include +#include "pair_born_coul_wolf_cs.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define EPSILON 1.0e-20 + +/* ---------------------------------------------------------------------- */ + +PairBornCoulWolfCS::PairBornCoulWolfCS(LAMMPS *lmp) : PairBornCoulWolf(lmp) +{ + single_enable = 0; +} + +/* ---------------------------------------------------------------------- */ + +void PairBornCoulWolfCS::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double rsq,r2inv,r6inv,forcecoul,forceborn,factor_coul,factor_lj; + double prefactor; + double r,rexp; + int *ilist,*jlist,*numneigh,**firstneigh; + double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_coul = force->special_coul; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + // self and shifted coulombic energy + + e_self = v_sh = 0.0; + e_shift = erfc(alf*cut_coul)/cut_coul; + f_shift = -(e_shift+ 2.0*alf/MY_PIS * exp(-alf*alf*cut_coul*cut_coul)) / cut_coul; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + qisq = qtmp*qtmp; + e_self = -(e_shift/2.0 + alf/MY_PIS) * qisq*qqrd2e; + if (eflag) ev_tally(i,i,nlocal,0,0.0,e_self,0.0,0.0,0.0,0.0); + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + rsq += EPSILON; + // Add EPISLON for case: r = 0; Interaction must be removed + // by special bond + r2inv = 1.0/rsq; + + if (rsq < cut_coulsq) { + r = sqrt(rsq); + prefactor = qqrd2e*qtmp*q[j]/r; + erfcc = erfc(alf*r); + erfcd = exp(-alf*alf*r*r); + v_sh = (erfcc - e_shift*r) * prefactor; + dvdrr = (erfcc/rsq + 2.0*alf/MY_PIS * erfcd/r) + f_shift; + forcecoul = dvdrr*rsq*prefactor; + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + } else forcecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + r = sqrt(rsq); + rexp = exp((sigma[itype][jtype]-r)*rhoinv[itype][jtype]); + forceborn = born1[itype][jtype]*r*rexp - born2[itype][jtype]*r6inv + + born3[itype][jtype]*r2inv*r6inv; + } else forceborn = 0.0; + + fpair = (forcecoul + factor_lj*forceborn) * r2inv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + if (rsq < cut_coulsq) { + ecoul = v_sh; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = a[itype][jtype]*rexp - c[itype][jtype]*r6inv + + d[itype][jtype]*r6inv*r2inv - offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,ecoul,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* +Using erfc and expmsq provided by math_special.h + +See: http://lammps.sandia.gov/threads/msg61934.html +*/ diff --git a/src/CORESHELL/pair_born_coul_wolf_cs.h b/src/CORESHELL/pair_born_coul_wolf_cs.h new file mode 100644 index 0000000000..00bbd5874c --- /dev/null +++ b/src/CORESHELL/pair_born_coul_wolf_cs.h @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(born/coul/wolf/cs,PairBornCoulWolfCS) + +#else + +#ifndef LMP_PAIR_BORN_COUL_WOLF_CS_H +#define LMP_PAIR_BORN_COUL_WOLF_CS_H + +#include "pair_born_coul_wolf.h" + +namespace LAMMPS_NS { + +class PairBornCoulWolfCS : public PairBornCoulWolf { + public: + PairBornCoulWolfCS(class LAMMPS *); + virtual void compute(int, int); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Pair style born/coul/wolf/cs requires atom attribute q + +An atom style that defines this attribute must be used. + + +*/ diff --git a/src/CORESHELL/pair_coul_wolf_cs.cpp b/src/CORESHELL/pair_coul_wolf_cs.cpp new file mode 100644 index 0000000000..15de7c6777 --- /dev/null +++ b/src/CORESHELL/pair_coul_wolf_cs.cpp @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + + +#include +#include +#include +#include +#include "pair_coul_wolf_cs.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define EPSILON 1.0e-20 + +/* ---------------------------------------------------------------------- */ + +PairCoulWolfCS::PairCoulWolfCS(LAMMPS *lmp) : PairCoulWolf( lmp ) +{ + single_enable = 0; +} + +/* ---------------------------------------------------------------------- */ + +void PairCoulWolfCS::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,ecoul,fpair; + double rsq,forcecoul,factor_coul; + double prefactor; + double r; + int *ilist,*jlist,*numneigh,**firstneigh; + double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; + + ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int nlocal = atom->nlocal; + double *special_coul = force->special_coul; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + // self and shifted coulombic energy + + e_self = v_sh = 0.0; + e_shift = erfc(alf*cut_coul)/cut_coul; + f_shift = -(e_shift+ 2.0*alf/MY_PIS * exp(-alf*alf*cut_coul*cut_coul)) / + cut_coul; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + qisq = qtmp*qtmp; + e_self = -(e_shift/2.0 + alf/MY_PIS) * qisq*qqrd2e; + if (evflag) ev_tally(i,i,nlocal,0,0.0,e_self,0.0,0.0,0.0,0.0); + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cut_coulsq) { + rsq += EPSILON; + // Add EPISLON for case: r = 0; Interaction must be removed + // by special bond + r = sqrt(rsq); + prefactor = qqrd2e*qtmp*q[j]/r; + erfcc = erfc(alf*r); + erfcd = exp(-alf*alf*r*r); + v_sh = (erfcc - e_shift*r) * prefactor; + dvdrr = (erfcc/rsq + 2.0*alf/MY_PIS * erfcd/r) + f_shift; + forcecoul = dvdrr*rsq*prefactor; + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + fpair = forcecoul / rsq; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + ecoul = v_sh; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + 0.0,ecoul,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* NOTES +Using erfc and expmsq provided by math_special.h + +See: http://lammps.sandia.gov/threads/msg61934.html +*/ diff --git a/src/CORESHELL/pair_coul_wolf_cs.h b/src/CORESHELL/pair_coul_wolf_cs.h new file mode 100644 index 0000000000..8d98b1bbc6 --- /dev/null +++ b/src/CORESHELL/pair_coul_wolf_cs.h @@ -0,0 +1,54 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(coul/wolf/cs,PairCoulWolfCS) + +#else + +#ifndef LMP_PAIR_COUL_WOLF_CS_H_ +#define LMP_PAIR_COUL_WOLF_CS_H_ + +#include "pair_coul_wolf.h" + +namespace LAMMPS_NS { + +class PairCoulWolfCS : public PairCoulWolf { + public: + PairCoulWolfCS( class LAMMPS *); + virtual void compute( int, int); +}; + +} + +#endif +#endif /* LMP_PAIR_COUL_WOLF_CS_H_ */ + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair coul/wolf/cs requires atom attribute q + +The atom style defined does not have this attribute. + +*/ diff --git a/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp b/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp index e2ffda148f..d418cf20af 100644 --- a/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp +++ b/src/CORESHELL/pair_lj_cut_coul_long_cs.cpp @@ -225,10 +225,10 @@ void PairLJCutCoulLongCS::compute_inner() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -311,10 +311,10 @@ void PairLJCutCoulLongCS::compute_middle() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -412,10 +412,10 @@ void PairLJCutCoulLongCS::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; diff --git a/src/DIPOLE/pair_lj_long_dipole_long.cpp b/src/DIPOLE/pair_lj_long_dipole_long.cpp index b833b250d4..c9b2b3f4af 100644 --- a/src/DIPOLE/pair_lj_long_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_long_dipole_long.cpp @@ -263,22 +263,6 @@ void PairLJLongDipoleLong::init_style() if (force->kspace) g_ewald = force->kspace->g_ewald; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJLongDipoleLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; - - if (id) - error->all(FLERR,"Pair style lj/long/dipole/long does not currently support respa"); -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/DIPOLE/pair_lj_long_dipole_long.h b/src/DIPOLE/pair_lj_long_dipole_long.h index f9fa10af11..2ace9ca301 100644 --- a/src/DIPOLE/pair_lj_long_dipole_long.h +++ b/src/DIPOLE/pair_lj_long_dipole_long.h @@ -34,7 +34,6 @@ class PairLJLongDipoleLong : public Pair { virtual void settings(int, char **); void coeff(int, char **); void init_style(); - void init_list(int, class NeighList *); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/Depend.sh b/src/Depend.sh index 0962dace51..a83a99ffb5 100644 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -109,12 +109,24 @@ if (test $1 = "RIGID") then depend USER-OMP fi +if (test $1 = "SNAP") then + depend KOKKOS +fi + if (test $1 = "USER-CGSDK") then depend GPU depend KOKKOS depend USER-OMP fi +if (test $1 = "USER-DPD") then + depend KOKKOS +fi + +if (test $1 = "USER-DRUDE") then + depend USER-OMP +fi + if (test $1 = "USER-FEP") then depend USER-OMP fi diff --git a/src/GPU/Install.sh b/src/GPU/Install.sh index f4aeaa2706..88f47a3dc4 100644 --- a/src/GPU/Install.sh +++ b/src/GPU/Install.sh @@ -131,6 +131,8 @@ action pair_zbl_gpu.cpp action pair_zbl_gpu.h action pppm_gpu.cpp pppm.cpp action pppm_gpu.h pppm.cpp +action pair_ufm_gpu.cpp +action pair_ufm_gpu.h # edit 2 Makefile.package files to include/exclude package info diff --git a/src/GPU/fix_gpu.cpp b/src/GPU/fix_gpu.cpp index 22ec8dde3b..87db73bd12 100644 --- a/src/GPU/fix_gpu.cpp +++ b/src/GPU/fix_gpu.cpp @@ -71,6 +71,22 @@ static const char cite_gpu_package[] = " year = 2013,\n" " volume = 184,\n" " pages = {2785--2793}\n" + "}\n\n" + "@Article{Trung15,\n" + " author = {T. D. Nguyen, S. J. Plimpton},\n" + " title = {Accelerating dissipative particle dynamics simulations for soft matter systems},\n" + " journal = {Comput.~Mater.~Sci.},\n" + " year = 2015,\n" + " volume = 100,\n" + " pages = {173--180}\n" + "}\n\n" + "@Article{Trung17,\n" + " author = {T. D. Nguyen},\n" + " title = {GPU-accelerated Tersoff potentials for massively parallel Molecular Dynamics simulations},\n" + " journal = {Comp.~Phys.~Comm.},\n" + " year = 2017,\n" + " volume = 212,\n" + " pages = {113--122}\n" "}\n\n"; /* ---------------------------------------------------------------------- */ diff --git a/src/GPU/pair_eam_alloy_gpu.cpp b/src/GPU/pair_eam_alloy_gpu.cpp index ab0f499a98..9b42b0a14f 100644 --- a/src/GPU/pair_eam_alloy_gpu.cpp +++ b/src/GPU/pair_eam_alloy_gpu.cpp @@ -28,6 +28,7 @@ #include "error.h" #include "neigh_request.h" #include "gpu_extra.h" +#include "domain.h" using namespace LAMMPS_NS; diff --git a/src/GPU/pair_eam_fs_gpu.cpp b/src/GPU/pair_eam_fs_gpu.cpp index a2b339db9a..c29b49631c 100644 --- a/src/GPU/pair_eam_fs_gpu.cpp +++ b/src/GPU/pair_eam_fs_gpu.cpp @@ -28,6 +28,7 @@ #include "error.h" #include "neigh_request.h" #include "gpu_extra.h" +#include "domain.h" using namespace LAMMPS_NS; diff --git a/src/GPU/pair_gauss_gpu.cpp b/src/GPU/pair_gauss_gpu.cpp index a8cb695b3a..01cc63a9f9 100644 --- a/src/GPU/pair_gauss_gpu.cpp +++ b/src/GPU/pair_gauss_gpu.cpp @@ -43,7 +43,7 @@ int gauss_gpu_init(const int ntypes, double **cutsq, double **host_a, double **b, double **offset, double *special_lj, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen); -int gauss_gpu_reinit(const int ntypes, double **cutsq, double **host_a, +void gauss_gpu_reinit(const int ntypes, double **cutsq, double **host_a, double **b, double **offset); void gauss_gpu_clear(); int ** gauss_gpu_compute_n(const int ago, const int inum, diff --git a/src/GPU/pair_lj_cut_coul_long_gpu.cpp b/src/GPU/pair_lj_cut_coul_long_gpu.cpp index 8ea7a7f07b..0c09cb1d51 100644 --- a/src/GPU/pair_lj_cut_coul_long_gpu.cpp +++ b/src/GPU/pair_lj_cut_coul_long_gpu.cpp @@ -56,7 +56,7 @@ int ljcl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, double **host_cut_ljsq, double host_cut_coulsq, double *host_special_coul, const double qqrd2e, const double g_ewald); -int ljcl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, +void ljcl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, double **host_lj2, double **host_lj3, double **host_lj4, double **offset, double **host_lj_cutsq); void ljcl_gpu_clear(); diff --git a/src/GPU/pair_lj_cut_gpu.cpp b/src/GPU/pair_lj_cut_gpu.cpp index ef97269772..feba9ed88b 100644 --- a/src/GPU/pair_lj_cut_gpu.cpp +++ b/src/GPU/pair_lj_cut_gpu.cpp @@ -45,7 +45,7 @@ int ljl_gpu_init(const int ntypes, double **cutsq, double **host_lj1, const int nall, const int max_nbors, const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen); -int ljl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, +void ljl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, double **host_lj2, double **host_lj3, double **host_lj4, double **offset); diff --git a/src/GPU/pair_lj_expand_gpu.cpp b/src/GPU/pair_lj_expand_gpu.cpp index 33bbf60600..43ec1ec45a 100644 --- a/src/GPU/pair_lj_expand_gpu.cpp +++ b/src/GPU/pair_lj_expand_gpu.cpp @@ -45,7 +45,7 @@ int lje_gpu_init(const int ntypes, double **cutsq, double **host_lj1, const int nlocal, const int nall, const int max_nbors, const int maxspecial, const double cell_size, int &gpu_mode, FILE *screen); -int lje_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, +void lje_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1, double **host_lj2, double **host_lj3, double **host_lj4, double **offset, double **shift); void lje_gpu_clear(); diff --git a/src/GPU/pair_ufm_gpu.cpp b/src/GPU/pair_ufm_gpu.cpp new file mode 100644 index 0000000000..96af0dc069 --- /dev/null +++ b/src/GPU/pair_ufm_gpu.cpp @@ -0,0 +1,240 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_ufm_gpu.h" +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "integrate.h" +#include "memory.h" +#include "error.h" +#include "neigh_request.h" +#include "universe.h" +#include "update.h" +#include "domain.h" +#include +#include "gpu_extra.h" + +using namespace LAMMPS_NS; + +// External functions from cuda library for atom decomposition + +int ufml_gpu_init(const int ntypes, double **cutsq, double **host_uf1, + double **host_uf2, double **host_uf3, double **host_uf4, + double **offset, double *special_lj, const int nlocal, + const int nall, const int max_nbors, const int maxspecial, + const double cell_size, int &gpu_mode, FILE *screen); + +int ufml_gpu_reinit(const int ntypes, double **cutsq, double **host_uf1, + double **host_uf2, double **host_uf3, double **host_uf4, + double **offset); + +void ufml_gpu_clear(); +int ** ufml_gpu_compute_n(const int ago, const int inum, + const int nall, double **host_x, int *host_type, + double *sublo, double *subhi, tagint *tag, int **nspecial, + tagint **special, const bool eflag, const bool vflag, + const bool eatom, const bool vatom, int &host_start, + int **ilist, int **jnum, + const double cpu_time, bool &success); +void ufml_gpu_compute(const int ago, const int inum, const int nall, + double **host_x, int *host_type, int *ilist, int *numj, + int **firstneigh, const bool eflag, const bool vflag, + const bool eatom, const bool vatom, int &host_start, + const double cpu_time, bool &success); +double ufml_gpu_bytes(); + +/* ---------------------------------------------------------------------- */ + +PairUFMGPU::PairUFMGPU(LAMMPS *lmp) : PairUFM(lmp), gpu_mode(GPU_FORCE) +{ + respa_enable = 0; + cpu_time = 0.0; + GPU_EXTRA::gpu_ready(lmp->modify, lmp->error); +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairUFMGPU::~PairUFMGPU() +{ + ufml_gpu_clear(); +} + +/* ---------------------------------------------------------------------- */ + +void PairUFMGPU::compute(int eflag, int vflag) +{ + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + int nall = atom->nlocal + atom->nghost; + int inum, host_start; + + bool success = true; + int *ilist, *numneigh, **firstneigh; + if (gpu_mode != GPU_FORCE) { + inum = atom->nlocal; + firstneigh = ufml_gpu_compute_n(neighbor->ago, inum, nall, + atom->x, atom->type, domain->sublo, + domain->subhi, atom->tag, atom->nspecial, + atom->special, eflag, vflag, eflag_atom, + vflag_atom, host_start, + &ilist, &numneigh, cpu_time, success); + } else { + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + ufml_gpu_compute(neighbor->ago, inum, nall, atom->x, atom->type, + ilist, numneigh, firstneigh, eflag, vflag, eflag_atom, + vflag_atom, host_start, cpu_time, success); + } + if (!success) + error->one(FLERR,"Insufficient memory on accelerator"); + + if (host_startnewton_pair) + error->all(FLERR,"Cannot use newton pair with ufm/gpu pair style"); + + // Repeat cutsq calculation because done after call to init_style + double maxcut = -1.0; + double cut; + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { + if (setflag[i][j] != 0 || (setflag[i][i] != 0 && setflag[j][j] != 0)) { + cut = init_one(i,j); + cut *= cut; + if (cut > maxcut) + maxcut = cut; + cutsq[i][j] = cutsq[j][i] = cut; + } else + cutsq[i][j] = cutsq[j][i] = 0.0; + } + } + double cell_size = sqrt(maxcut) + neighbor->skin; + + int maxspecial=0; + if (atom->molecular) + maxspecial=atom->maxspecial; + int success = ufml_gpu_init(atom->ntypes+1, cutsq, uf1, uf2, uf3, uf4, + offset, force->special_lj, atom->nlocal, + atom->nlocal+atom->nghost, 300, maxspecial, + cell_size, gpu_mode, screen); + GPU_EXTRA::check_flag(success,error,world); + + if (gpu_mode == GPU_FORCE) { + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + } +} + +/* ---------------------------------------------------------------------- */ + +void PairUFMGPU::reinit() +{ + Pair::reinit(); + + ufml_gpu_reinit(atom->ntypes+1, cutsq, uf1, uf2, uf3, uf4, offset); +} + +/* ---------------------------------------------------------------------- */ + +double PairUFMGPU::memory_usage() +{ + double bytes = Pair::memory_usage(); + return bytes + ufml_gpu_bytes(); +} + +/* ---------------------------------------------------------------------- */ + +void PairUFMGPU::cpu_compute(int start, int inum, int eflag, int vflag, + int *ilist, int *numneigh, int **firstneigh) { + int i,j,ii,jj,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,expuf,factor_lj; + int *jlist; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + double *special_lj = force->special_lj; + + + // loop over neighbors of my atoms + + for (ii = start; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + expuf = exp(- rsq * uf2[itype][jtype]); + fpair = factor_lj * uf1[itype][jtype] * expuf /(1.0 - expuf); + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + + if (eflag) { + evdwl = -factor_lj * uf3[itype][jtype] * log(1.0 - expuf) - offset[itype][jtype]; + } + + if (evflag) ev_tally_full(i,evdwl,0.0,fpair,delx,dely,delz); + } + } + } +} diff --git a/src/GPU/pair_ufm_gpu.h b/src/GPU/pair_ufm_gpu.h new file mode 100644 index 0000000000..59b883f3aa --- /dev/null +++ b/src/GPU/pair_ufm_gpu.h @@ -0,0 +1,65 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(ufm/gpu,PairUFMGPU) + +#else + +#ifndef LMP_PAIR_UFM_GPU_H +#define LMP_PAIR_UFM_GPU_H + +#include "pair_ufm.h" + +namespace LAMMPS_NS { + +class PairUFMGPU : public PairUFM { + public: + PairUFMGPU(LAMMPS *lmp); + ~PairUFMGPU(); + void cpu_compute(int, int, int, int, int *, int *, int **); + void compute(int, int); + void init_style(); + void reinit(); + double memory_usage(); + + enum { GPU_FORCE, GPU_NEIGH, GPU_HYB_NEIGH }; + + private: + int gpu_mode; + double cpu_time; +}; + +} +#endif +#endif + +/* ERROR/WARNING messages: + +E: Insufficient memory on accelerator + +There is insufficient memory on one of the devices specified for the gpu +package + +E: Cannot use newton pair with ufm/gpu pair style + +Self-explanatory. + +*/ diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index eeec94fdf7..033c35dbac 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -30,6 +30,7 @@ #include "math_const.h" #include "memory.h" #include "error.h" +#include "neighbor.h" using namespace LAMMPS_NS; using namespace FixConst; diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index a09b9dfa42..d1c5d4c9c7 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -30,6 +30,8 @@ #include "math_const.h" #include "memory.h" #include "error.h" +#include "comm.h" +#include "neighbor.h" using namespace LAMMPS_NS; using namespace FixConst; diff --git a/src/GRANULAR/pair_gran_hertz_history.cpp b/src/GRANULAR/pair_gran_hertz_history.cpp index e52aac10db..9723531625 100644 --- a/src/GRANULAR/pair_gran_hertz_history.cpp +++ b/src/GRANULAR/pair_gran_hertz_history.cpp @@ -24,6 +24,7 @@ #include "update.h" #include "force.h" #include "fix.h" +#include "fix_neigh_history.h" #include "neighbor.h" #include "neigh_list.h" #include "comm.h" @@ -95,8 +96,8 @@ void PairGranHertzHistory::compute(int eflag, int vflag) ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; // loop over neighbors of my atoms @@ -407,7 +408,7 @@ double PairGranHertzHistory::single(int i, int j, int itype, int jtype, int jnum = list->numneigh[i]; int *jlist = list->firstneigh[i]; - double *allshear = list->listhistory->firstdouble[i]; + double *allshear = fix_history->firstvalue[i]; for (int jj = 0; jj < jnum; jj++) { neighprev++; diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index e9662c9e73..4f120150de 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -27,7 +27,7 @@ #include "update.h" #include "modify.h" #include "fix.h" -#include "fix_shear_history.h" +#include "fix_neigh_history.h" #include "comm.h" #include "neighbor.h" #include "neigh_list.h" @@ -64,7 +64,7 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) PairGranHookeHistory::~PairGranHookeHistory() { delete [] svector; - if (fix_history) modify->delete_fix("SHEAR_HISTORY"); + if (fix_history) modify->delete_fix("NEIGH_HISTORY"); if (allocated) { memory->destroy(setflag); @@ -137,8 +137,8 @@ void PairGranHookeHistory::compute(int eflag, int vflag) ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; // loop over neighbors of my atoms @@ -400,35 +400,28 @@ void PairGranHookeHistory::init_style() if (comm->ghost_velocity == 0) error->all(FLERR,"Pair granular requires ghost atoms store velocity"); - // need a granular neigh list and optionally a granular history neigh list + // need a granular neigh list int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->size = 1; - if (history) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->history = 1; - neighbor->requests[irequest]->dnum = 3; - } + if (history) neighbor->requests[irequest]->history = 1; dt = update->dt; - // if shear history is stored: // if first init, create Fix needed for storing shear history if (history && fix_history == NULL) { char dnumstr[16]; sprintf(dnumstr,"%d",3); char **fixarg = new char*[4]; - fixarg[0] = (char *) "SHEAR_HISTORY"; + fixarg[0] = (char *) "NEIGH_HISTORY"; fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "SHEAR_HISTORY"; + fixarg[2] = (char *) "NEIGH_HISTORY"; fixarg[3] = dnumstr; - modify->add_fix(4,fixarg); + modify->add_fix(4,fixarg,1); delete [] fixarg; - fix_history = (FixShearHistory *) modify->fix[modify->nfix-1]; + fix_history = (FixNeighHistory *) modify->fix[modify->nfix-1]; fix_history->pair = this; - neighbor->requests[irequest]->fix_history = fix_history; } // check for FixFreeze and set freeze_group_bit @@ -494,23 +487,12 @@ void PairGranHookeHistory::init_style() // set fix which stores history info if (history) { - int ifix = modify->find_fix("SHEAR_HISTORY"); - if (ifix < 0) error->all(FLERR,"Could not find pair fix ID"); - fix_history = (FixShearHistory *) modify->fix[ifix]; + int ifix = modify->find_fix("NEIGH_HISTORY"); + if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); + fix_history = (FixNeighHistory *) modify->fix[ifix]; } } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - optional granular history list -------------------------------------------------------------------------- */ - -void PairGranHookeHistory::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listhistory = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ @@ -704,7 +686,7 @@ double PairGranHookeHistory::single(int i, int j, int itype, int jtype, int jnum = list->numneigh[i]; int *jlist = list->firstneigh[i]; - double *allshear = list->listhistory->firstdouble[i]; + double *allshear = fix_history->firstvalue[i]; for (int jj = 0; jj < jnum; jj++) { neighprev++; @@ -797,14 +779,3 @@ double PairGranHookeHistory::memory_usage() double bytes = nmax * sizeof(double); return bytes; } - -/* ---------------------------------------------------------------------- - return ptr to FixShearHistory class - called by Neighbor when setting up neighbor lists -------------------------------------------------------------------------- */ - -void *PairGranHookeHistory::extract(const char *str, int &dim) -{ - if (strcmp(str,"history") == 0) return (void *) fix_history; - return NULL; -} diff --git a/src/GRANULAR/pair_gran_hooke_history.h b/src/GRANULAR/pair_gran_hooke_history.h index afeab93413..f02cccd55e 100644 --- a/src/GRANULAR/pair_gran_hooke_history.h +++ b/src/GRANULAR/pair_gran_hooke_history.h @@ -32,7 +32,6 @@ class PairGranHookeHistory : public Pair { virtual void settings(int, char **); void coeff(int, char **); void init_style(); - void init_list(int, class NeighList *); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); @@ -43,7 +42,6 @@ class PairGranHookeHistory : public Pair { int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); double memory_usage(); - void *extract(const char *, int &); protected: double kn,kt,gamman,gammat,xmu; @@ -56,7 +54,7 @@ class PairGranHookeHistory : public Pair { double *onerad_dynamic,*onerad_frozen; double *maxrad_dynamic,*maxrad_frozen; - class FixShearHistory *fix_history; + class FixNeighHistory *fix_history; // storage of rigid body masses for use in granular interactions diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 790b9224c2..c6fab2a1b1 100644 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -28,8 +28,20 @@ action () { # force rebuild of files with LMP_KOKKOS switch -touch ../accelerator_kokkos.h -touch ../memory.h +KOKKOS_INSTALLED=0 +if (test -e ../Makefile.package) then + KOKKOS_INSTALLED=`grep DLMP_KOKKOS ../Makefile.package | wc -l` +fi + +if (test $mode = 1) then + if (test $KOKKOS_INSTALLED = 0) then + touch ../accelerator_kokkos.h + fi +elif (test $mode = 0) then + if (test $KOKKOS_INSTALLED = 1) then + touch ../accelerator_kokkos.h + fi +fi # list of files with optional dependcies @@ -49,8 +61,12 @@ action atom_vec_bond_kokkos.cpp atom_vec_bond.cpp action atom_vec_bond_kokkos.h atom_vec_bond.h action atom_vec_charge_kokkos.cpp action atom_vec_charge_kokkos.h +action atom_vec_dpd_kokkos.cpp atom_vec_dpd.cpp +action atom_vec_dpd_kokkos.h atom_vec_dpd.h action atom_vec_full_kokkos.cpp atom_vec_full.cpp action atom_vec_full_kokkos.h atom_vec_full.h +action atom_vec_hybrid_kokkos.cpp +action atom_vec_hybrid_kokkos.h action atom_vec_kokkos.cpp action atom_vec_kokkos.h action atom_vec_molecular_kokkos.cpp atom_vec_molecular.cpp @@ -77,6 +93,8 @@ action domain_kokkos.cpp action domain_kokkos.h action fix_deform_kokkos.cpp action fix_deform_kokkos.h +action fix_eos_table_rx_kokkos.cpp fix_eos_table_rx.cpp +action fix_eos_table_rx_kokkos.h fix_eos_table_rx.h action fix_langevin_kokkos.cpp action fix_langevin_kokkos.h action fix_nh_kokkos.cpp @@ -89,6 +107,8 @@ action fix_nve_kokkos.cpp action fix_nve_kokkos.h action fix_nvt_kokkos.cpp action fix_nvt_kokkos.h +action fix_property_atom_kokkos.cpp +action fix_property_atom_kokkos.h action fix_qeq_reax_kokkos.cpp fix_qeq_reax.cpp action fix_qeq_reax_kokkos.h fix_qeq_reax.h action fix_reaxc_bonds_kokkos.cpp fix_reaxc_bonds.cpp @@ -97,10 +117,18 @@ action fix_reaxc_species_kokkos.cpp fix_reaxc_species.cpp action fix_reaxc_species_kokkos.h fix_reaxc_species.h action fix_setforce_kokkos.cpp action fix_setforce_kokkos.h +action fix_shardlow_kokkos.cpp fix_shardlow.cpp +action fix_shardlow_kokkos.h fix_shardlow.h action fix_momentum_kokkos.cpp action fix_momentum_kokkos.h +action fix_wall_lj93_kokkos.cpp +action fix_wall_lj93_kokkos.h action fix_wall_reflect_kokkos.cpp action fix_wall_reflect_kokkos.h +action fix_dpd_energy_kokkos.cpp fix_dpd_energy.cpp +action fix_dpd_energy_kokkos.h fix_dpd_energy.h +action fix_rx_kokkos.cpp fix_rx.cpp +action fix_rx_kokkos.h fix_rx.h action gridcomm_kokkos.cpp gridcomm.cpp action gridcomm_kokkos.h gridcomm.h action improper_class2_kokkos.cpp improper_class2.cpp @@ -109,8 +137,9 @@ action improper_harmonic_kokkos.cpp improper_harmonic.cpp action improper_harmonic_kokkos.h improper_harmonic.h action kokkos.cpp action kokkos.h -action kokkos_type.h +action kokkos_base.h action kokkos_few.h +action kokkos_type.h action memory_kokkos.h action modify_kokkos.cpp action modify_kokkos.h @@ -122,10 +151,18 @@ action neighbor_kokkos.cpp action neighbor_kokkos.h action npair_copy_kokkos.cpp action npair_copy_kokkos.h +action npair_halffull_kokkos.cpp +action npair_halffull_kokkos.h +action npair_skip_kokkos.cpp +action npair_skip_kokkos.h action npair_kokkos.cpp action npair_kokkos.h +action npair_ssa_kokkos.cpp npair_half_bin_newton_ssa.cpp +action npair_ssa_kokkos.h npair_half_bin_newton_ssa.h action nbin_kokkos.cpp action nbin_kokkos.h +action nbin_ssa_kokkos.cpp nbin_ssa.cpp +action nbin_ssa_kokkos.h nbin_ssa.h action math_special_kokkos.cpp action math_special_kokkos.h action pair_buck_coul_cut_kokkos.cpp @@ -144,12 +181,20 @@ action pair_coul_long_kokkos.cpp pair_coul_long.cpp action pair_coul_long_kokkos.h pair_coul_long.h action pair_coul_wolf_kokkos.cpp action pair_coul_wolf_kokkos.h +action pair_dpd_fdt_energy_kokkos.cpp pair_dpd_fdt_energy.cpp +action pair_dpd_fdt_energy_kokkos.h pair_dpd_fdt_energy.h action pair_eam_kokkos.cpp pair_eam.cpp action pair_eam_kokkos.h pair_eam.h action pair_eam_alloy_kokkos.cpp pair_eam_alloy.cpp action pair_eam_alloy_kokkos.h pair_eam_alloy.h action pair_eam_fs_kokkos.cpp pair_eam_fs.cpp action pair_eam_fs_kokkos.h pair_eam_fs.h +action pair_exp6_rx_kokkos.cpp pair_exp6_rx.cpp +action pair_exp6_rx_kokkos.h pair_exp6_rx.h +action pair_hybrid_kokkos.cpp +action pair_hybrid_kokkos.h +action pair_hybrid_overlay_kokkos.cpp +action pair_hybrid_overlay_kokkos.h action pair_kokkos.h action pair_lj_charmm_coul_charmm_implicit_kokkos.cpp pair_lj_charmm_coul_charmm_implicit.cpp action pair_lj_charmm_coul_charmm_implicit_kokkos.h pair_lj_charmm_coul_charmm_implicit.h @@ -183,24 +228,39 @@ action pair_lj_sdk_kokkos.cpp pair_lj_sdk.cpp action pair_lj_sdk_kokkos.h pair_lj_sdk.h action pair_morse_kokkos.cpp action pair_morse_kokkos.h +action pair_multi_lucy_rx_kokkos.cpp pair_multi_lucy_rx.cpp +action pair_multi_lucy_rx_kokkos.h pair_multi_lucy_rx.h action pair_reaxc_kokkos.cpp pair_reaxc.cpp action pair_reaxc_kokkos.h pair_reaxc.h +action pair_snap_kokkos.cpp pair_snap.cpp +action pair_snap_kokkos.h pair_snap.h +action pair_snap_kokkos_impl.h pair_snap.cpp action pair_sw_kokkos.cpp pair_sw.cpp action pair_sw_kokkos.h pair_sw.h action pair_vashishta_kokkos.cpp pair_vashishta.cpp action pair_vashishta_kokkos.h pair_vashishta.h action pair_table_kokkos.cpp action pair_table_kokkos.h +action pair_table_rx_kokkos.cpp pair_table_rx.cpp +action pair_table_rx_kokkos.h pair_table_rx.h action pair_tersoff_kokkos.cpp pair_tersoff.cpp action pair_tersoff_kokkos.h pair_tersoff.h action pair_tersoff_mod_kokkos.cpp pair_tersoff_mod.cpp action pair_tersoff_mod_kokkos.h pair_tersoff_mod.h action pair_tersoff_zbl_kokkos.cpp pair_tersoff_zbl.cpp action pair_tersoff_zbl_kokkos.h pair_tersoff_zbl.h +action pair_yukawa_kokkos.cpp +action pair_yukawa_kokkos.h +action pair_zbl_kokkos.cpp +action pair_zbl_kokkos.h action pppm_kokkos.cpp pppm.cpp action pppm_kokkos.h pppm.h +action rand_pool_wrap_kokkos.cpp +action rand_pool_wrap_kokkos.h action region_block_kokkos.cpp action region_block_kokkos.h +action sna_kokkos.h sna.h +action sna_kokkos_impl.h sna.cpp action verlet_kokkos.cpp action verlet_kokkos.h diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp index 8dd22022d8..59a20c25df 100644 --- a/src/KOKKOS/angle_charmm_kokkos.cpp +++ b/src/KOKKOS/angle_charmm_kokkos.cpp @@ -24,7 +24,7 @@ #include "comm.h" #include "force.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -51,8 +51,8 @@ template AngleCharmmKokkos::~AngleCharmmKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -71,15 +71,15 @@ void AngleCharmmKokkos::compute(int eflag_in, int vflag_in) if (eflag_atom) { //if(k_eatom.dimension_0()destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); d_eatom = k_eatom.template view(); //} } if (vflag_atom) { //if(k_vatom.dimension_0()destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); d_vatom = k_vatom.template view(); //} } @@ -271,10 +271,10 @@ void AngleCharmmKokkos::coeff(int narg, char **arg) Kokkos::DualView k_k_ub("AngleCharmm::k_ub",n+1); Kokkos::DualView k_r_ub("AngleCharmm::r_ub",n+1); - d_k = k_k.d_view; - d_theta0 = k_theta0.d_view; - d_k_ub = k_k_ub.d_view; - d_r_ub = k_r_ub.d_view; + d_k = k_k.template view(); + d_theta0 = k_theta0.template view(); + d_k_ub = k_k_ub.template view(); + d_r_ub = k_r_ub.template view(); for (int i = 1; i <= n; i++) { k_k.h_view[i] = k[i]; diff --git a/src/KOKKOS/angle_class2_kokkos.cpp b/src/KOKKOS/angle_class2_kokkos.cpp index e851e9d500..108b4f48f2 100644 --- a/src/KOKKOS/angle_class2_kokkos.cpp +++ b/src/KOKKOS/angle_class2_kokkos.cpp @@ -24,7 +24,7 @@ #include "comm.h" #include "force.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -51,8 +51,8 @@ template AngleClass2Kokkos::~AngleClass2Kokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -70,13 +70,13 @@ void AngleClass2Kokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom"); d_eatom = k_eatom.template view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom"); d_vatom = k_vatom.template view(); } diff --git a/src/KOKKOS/angle_harmonic_kokkos.cpp b/src/KOKKOS/angle_harmonic_kokkos.cpp index 9fd237ddb3..dd5a1e26c7 100644 --- a/src/KOKKOS/angle_harmonic_kokkos.cpp +++ b/src/KOKKOS/angle_harmonic_kokkos.cpp @@ -24,7 +24,7 @@ #include "comm.h" #include "force.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -51,8 +51,8 @@ template AngleHarmonicKokkos::~AngleHarmonicKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -70,13 +70,13 @@ void AngleHarmonicKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom"); d_eatom = k_eatom.template view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom"); d_vatom = k_vatom.template view(); } diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index 577eff2364..4ecead5b1d 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -19,7 +19,7 @@ #include "update.h" #include "domain.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "kokkos.h" @@ -33,46 +33,60 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) {} AtomKokkos::~AtomKokkos() { - memory->destroy_kokkos(k_tag, tag); - memory->destroy_kokkos(k_mask, mask); - memory->destroy_kokkos(k_type, type); - memory->destroy_kokkos(k_image, image); - memory->destroy_kokkos(k_molecule, molecule); + memoryKK->destroy_kokkos(k_tag, tag); + memoryKK->destroy_kokkos(k_mask, mask); + memoryKK->destroy_kokkos(k_type, type); + memoryKK->destroy_kokkos(k_image, image); + memoryKK->destroy_kokkos(k_molecule, molecule); - memory->destroy_kokkos(k_x, x); - memory->destroy_kokkos(k_v, v); - memory->destroy_kokkos(k_f, f); + memoryKK->destroy_kokkos(k_x, x); + memoryKK->destroy_kokkos(k_v, v); + memoryKK->destroy_kokkos(k_f, f); - memory->destroy_kokkos(k_mass, mass); - memory->destroy_kokkos(k_q, q); + memoryKK->destroy_kokkos(k_mass, mass); + memoryKK->destroy_kokkos(k_q, q); - memory->destroy_kokkos(k_radius, radius); - memory->destroy_kokkos(k_rmass, rmass); - memory->destroy_kokkos(k_omega, omega); - memory->destroy_kokkos(k_torque, torque); + memoryKK->destroy_kokkos(k_radius, radius); + memoryKK->destroy_kokkos(k_rmass, rmass); + memoryKK->destroy_kokkos(k_omega, omega); + memoryKK->destroy_kokkos(k_angmom, angmom); + memoryKK->destroy_kokkos(k_torque, torque); - memory->destroy_kokkos(k_nspecial, nspecial); - memory->destroy_kokkos(k_special, special); - memory->destroy_kokkos(k_num_bond, num_bond); - memory->destroy_kokkos(k_bond_type, bond_type); - memory->destroy_kokkos(k_bond_atom, bond_atom); - memory->destroy_kokkos(k_num_angle, num_angle); - memory->destroy_kokkos(k_angle_type, angle_type); - memory->destroy_kokkos(k_angle_atom1, angle_atom1); - memory->destroy_kokkos(k_angle_atom2, angle_atom2); - memory->destroy_kokkos(k_angle_atom3, angle_atom3); - memory->destroy_kokkos(k_num_dihedral, num_dihedral); - memory->destroy_kokkos(k_dihedral_type, dihedral_type); - memory->destroy_kokkos(k_dihedral_atom1, dihedral_atom1); - memory->destroy_kokkos(k_dihedral_atom2, dihedral_atom2); - memory->destroy_kokkos(k_dihedral_atom3, dihedral_atom3); - memory->destroy_kokkos(k_dihedral_atom4, dihedral_atom4); - memory->destroy_kokkos(k_num_improper, num_improper); - memory->destroy_kokkos(k_improper_type, improper_type); - memory->destroy_kokkos(k_improper_atom1, improper_atom1); - memory->destroy_kokkos(k_improper_atom2, improper_atom2); - memory->destroy_kokkos(k_improper_atom3, improper_atom3); - memory->destroy_kokkos(k_improper_atom4, improper_atom4); + memoryKK->destroy_kokkos(k_nspecial, nspecial); + memoryKK->destroy_kokkos(k_special, special); + memoryKK->destroy_kokkos(k_num_bond, num_bond); + memoryKK->destroy_kokkos(k_bond_type, bond_type); + memoryKK->destroy_kokkos(k_bond_atom, bond_atom); + memoryKK->destroy_kokkos(k_num_angle, num_angle); + memoryKK->destroy_kokkos(k_angle_type, angle_type); + memoryKK->destroy_kokkos(k_angle_atom1, angle_atom1); + memoryKK->destroy_kokkos(k_angle_atom2, angle_atom2); + memoryKK->destroy_kokkos(k_angle_atom3, angle_atom3); + memoryKK->destroy_kokkos(k_num_dihedral, num_dihedral); + memoryKK->destroy_kokkos(k_dihedral_type, dihedral_type); + memoryKK->destroy_kokkos(k_dihedral_atom1, dihedral_atom1); + memoryKK->destroy_kokkos(k_dihedral_atom2, dihedral_atom2); + memoryKK->destroy_kokkos(k_dihedral_atom3, dihedral_atom3); + memoryKK->destroy_kokkos(k_dihedral_atom4, dihedral_atom4); + memoryKK->destroy_kokkos(k_num_improper, num_improper); + memoryKK->destroy_kokkos(k_improper_type, improper_type); + memoryKK->destroy_kokkos(k_improper_atom1, improper_atom1); + memoryKK->destroy_kokkos(k_improper_atom2, improper_atom2); + memoryKK->destroy_kokkos(k_improper_atom3, improper_atom3); + memoryKK->destroy_kokkos(k_improper_atom4, improper_atom4); + + // USER-DPD package + memoryKK->destroy_kokkos(k_uCond,uCond); + memoryKK->destroy_kokkos(k_uMech,uMech); + memoryKK->destroy_kokkos(k_uChem,uChem); + memoryKK->destroy_kokkos(k_uCG,uCG); + memoryKK->destroy_kokkos(k_uCGnew,uCGnew); + memoryKK->destroy_kokkos(k_rho,rho); + memoryKK->destroy_kokkos(k_dpdTheta,dpdTheta); + memoryKK->destroy_kokkos(k_duChem,duChem); + + memoryKK->destroy_kokkos(k_dvector,dvector); + dvector = NULL; } /* ---------------------------------------------------------------------- */ @@ -218,38 +232,95 @@ void AtomKokkos::sort() void AtomKokkos::grow(unsigned int mask){ if (mask & SPECIAL_MASK){ - memory->destroy_kokkos(k_special, special); + memoryKK->destroy_kokkos(k_special, special); sync(Device, mask); modified(Device, mask); - memory->grow_kokkos(k_special,special,nmax,maxspecial,"atom:special"); + memoryKK->grow_kokkos(k_special,special,nmax,maxspecial,"atom:special"); avec->grow_reset(); sync(Host, mask); } } +/* ---------------------------------------------------------------------- + add a custom variable with name of type flag = 0/1 for int/double + assumes name does not already exist + return index in ivector or dvector of its location +------------------------------------------------------------------------- */ + +int AtomKokkos::add_custom(const char *name, int flag) +{ + int index; + + if (flag == 0) { + index = nivector; + nivector++; + iname = (char **) memory->srealloc(iname,nivector*sizeof(char *), + "atom:iname"); + int n = strlen(name) + 1; + iname[index] = new char[n]; + strcpy(iname[index],name); + ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *), + "atom:ivector"); + memory->create(ivector[index],nmax,"atom:ivector"); + } else { + index = ndvector; + ndvector++; + dname = (char **) memory->srealloc(dname,ndvector*sizeof(char *), + "atom:dname"); + int n = strlen(name) + 1; + dname[index] = new char[n]; + strcpy(dname[index],name); + memoryKK->grow_kokkos(k_dvector,dvector,ndvector,nmax, + "atom:dvector"); + } + + return index; +} + +/* ---------------------------------------------------------------------- + remove a custom variable of type flag = 0/1 for int/double at index + free memory for vector and name and set ptrs to NULL + ivector/dvector and iname/dname lists never shrink +------------------------------------------------------------------------- */ + +void AtomKokkos::remove_custom(int flag, int index) +{ + if (flag == 0) { + memory->destroy(ivector[index]); + ivector[index] = NULL; + delete [] iname[index]; + iname[index] = NULL; + } else { + //memoryKK->destroy_kokkos(dvector); + dvector[index] = NULL; + delete [] dname[index]; + dname[index] = NULL; + } +} + /* ---------------------------------------------------------------------- */ void AtomKokkos::deallocate_topology() { - memory->destroy_kokkos(k_bond_type, bond_type); - memory->destroy_kokkos(k_bond_atom, bond_atom); + memoryKK->destroy_kokkos(k_bond_type, bond_type); + memoryKK->destroy_kokkos(k_bond_atom, bond_atom); - memory->destroy_kokkos(k_angle_type, angle_type); - memory->destroy_kokkos(k_angle_atom1, angle_atom1); - memory->destroy_kokkos(k_angle_atom2, angle_atom2); - memory->destroy_kokkos(k_angle_atom3, angle_atom3); + memoryKK->destroy_kokkos(k_angle_type, angle_type); + memoryKK->destroy_kokkos(k_angle_atom1, angle_atom1); + memoryKK->destroy_kokkos(k_angle_atom2, angle_atom2); + memoryKK->destroy_kokkos(k_angle_atom3, angle_atom3); - memory->destroy_kokkos(k_dihedral_type, dihedral_type); - memory->destroy_kokkos(k_dihedral_atom1, dihedral_atom1); - memory->destroy_kokkos(k_dihedral_atom2, dihedral_atom2); - memory->destroy_kokkos(k_dihedral_atom3, dihedral_atom3); - memory->destroy_kokkos(k_dihedral_atom4, dihedral_atom4); + memoryKK->destroy_kokkos(k_dihedral_type, dihedral_type); + memoryKK->destroy_kokkos(k_dihedral_atom1, dihedral_atom1); + memoryKK->destroy_kokkos(k_dihedral_atom2, dihedral_atom2); + memoryKK->destroy_kokkos(k_dihedral_atom3, dihedral_atom3); + memoryKK->destroy_kokkos(k_dihedral_atom4, dihedral_atom4); - memory->destroy_kokkos(k_improper_type, improper_type); - memory->destroy_kokkos(k_improper_atom1, improper_atom1); - memory->destroy_kokkos(k_improper_atom2, improper_atom2); - memory->destroy_kokkos(k_improper_atom3, improper_atom3); - memory->destroy_kokkos(k_improper_atom4, improper_atom4); + memoryKK->destroy_kokkos(k_improper_type, improper_type); + memoryKK->destroy_kokkos(k_improper_atom1, improper_atom1); + memoryKK->destroy_kokkos(k_improper_atom2, improper_atom2); + memoryKK->destroy_kokkos(k_improper_atom3, improper_atom3); + memoryKK->destroy_kokkos(k_improper_atom4, improper_atom4); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index 05aae712d9..2245023189 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -34,6 +34,7 @@ class AtomKokkos : public Atom { DAT::tdual_float_1d k_radius; DAT::tdual_float_1d k_rmass; DAT::tdual_v_array k_omega; + DAT::tdual_v_array k_angmom; DAT::tdual_f_array k_torque; DAT::tdual_tagint_1d k_molecule; DAT::tdual_int_2d k_nspecial; @@ -51,6 +52,14 @@ class AtomKokkos : public Atom { DAT::tdual_int_2d k_improper_type; DAT::tdual_tagint_2d k_improper_atom1, k_improper_atom2, k_improper_atom3, k_improper_atom4; + DAT::tdual_float_2d k_dvector; + + +// USER-DPD package + DAT::tdual_efloat_1d k_uCond, k_uMech, k_uChem, k_uCG, k_uCGnew, + k_rho,k_dpdTheta,k_duChem; + + AtomKokkos(class LAMMPS *); ~AtomKokkos(); @@ -60,6 +69,8 @@ class AtomKokkos : public Atom { void sync_overlapping_device(const ExecutionSpace space, unsigned int mask); virtual void sort(); virtual void grow(unsigned int mask); + int add_custom(const char *, int); + void remove_custom(int, int); virtual void deallocate_topology(); void sync_modify(ExecutionSpace, unsigned int, unsigned int); private: diff --git a/src/KOKKOS/atom_vec_angle_kokkos.cpp b/src/KOKKOS/atom_vec_angle_kokkos.cpp index 34b868aadc..a9e55f530a 100644 --- a/src/KOKKOS/atom_vec_angle_kokkos.cpp +++ b/src/KOKKOS/atom_vec_angle_kokkos.cpp @@ -19,7 +19,7 @@ #include "modify.h" #include "fix.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" using namespace LAMMPS_NS; @@ -68,33 +68,33 @@ void AtomVecAngleKokkos::grow(int n) sync(Device,ALL_MASK); modified(Device,ALL_MASK); - memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); - memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); - memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); - memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); - memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); - memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); - memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); - memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); - memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); - memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial, + memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); + memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); + memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial, "atom:special"); - memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); - memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom, + memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); + memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom, "atom:bond_type"); - memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom, + memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom, "atom:bond_atom"); - memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle"); - memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle"); + memoryKK->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom, "atom:angle_type"); - memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom, "atom:angle_atom1"); - memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom, "atom:angle_atom2"); - memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom, "atom:angle_atom3"); grow_reset(); @@ -308,7 +308,6 @@ int AtomVecAngleKokkos::pack_comm_kokkos(const int &n, Kokkos::parallel_for(n,f); } } - LMPHostType::fence(); } else { sync(Device,X_MASK); if(pbc_flag) { @@ -336,7 +335,6 @@ int AtomVecAngleKokkos::pack_comm_kokkos(const int &n, Kokkos::parallel_for(n,f); } } - LMPDeviceType::fence(); } return n*size_forward; @@ -430,7 +428,6 @@ int AtomVecAngleKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &li Kokkos::parallel_for(n,f); } } - LMPHostType::fence(); } else { sync(Device,X_MASK); modified(Device,X_MASK); @@ -463,7 +460,6 @@ int AtomVecAngleKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &li Kokkos::parallel_for(n,f); } } - LMPDeviceType::fence(); } return n*3; } @@ -501,13 +497,11 @@ void AtomVecAngleKokkos::unpack_comm_kokkos(const int &n, const int &first, modified(Host,X_MASK); struct AtomVecAngleKokkos_UnpackComm f(atomKK->k_x,buf,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } else { sync(Device,X_MASK); modified(Device,X_MASK); struct AtomVecAngleKokkos_UnpackComm f(atomKK->k_x,buf,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -753,13 +747,11 @@ int AtomVecAngleKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecAngleKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } else { @@ -769,13 +761,11 @@ int AtomVecAngleKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecAngleKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } return n*size_border; @@ -977,12 +967,10 @@ void AtomVecAngleKokkos::unpack_border_kokkos(const int &n, const int &first, struct AtomVecAngleKokkos_UnpackBorder f(buf.view(),h_x,h_tag,h_type,h_mask,h_molecule,first); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { struct AtomVecAngleKokkos_UnpackBorder f(buf.view(),d_x,d_tag,d_type,d_mask,d_molecule,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -1241,13 +1229,11 @@ int AtomVecAngleKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_ AtomVecAngleKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPHostType::fence(); return nsend*elements; } else { AtomVecAngleKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPDeviceType::fence(); return nsend*elements; } } @@ -1405,7 +1391,6 @@ int AtomVecAngleKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int n AtomVecAngleKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPHostType::fence(); return k_count.h_view(0); } else { k_count.h_view(0) = nlocal; @@ -1414,7 +1399,6 @@ int AtomVecAngleKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int n AtomVecAngleKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPDeviceType::fence(); k_count.modify(); k_count.sync(); diff --git a/src/KOKKOS/atom_vec_angle_kokkos.h b/src/KOKKOS/atom_vec_angle_kokkos.h index 0a477b0386..abdd48fce5 100644 --- a/src/KOKKOS/atom_vec_angle_kokkos.h +++ b/src/KOKKOS/atom_vec_angle_kokkos.h @@ -14,6 +14,8 @@ #ifdef ATOM_CLASS AtomStyle(angle/kk,AtomVecAngleKokkos) +AtomStyle(angle/kk/device,AtomVecAngleKokkos) +AtomStyle(angle/kk/host,AtomVecAngleKokkos) #else diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.cpp b/src/KOKKOS/atom_vec_atomic_kokkos.cpp index d040bd3553..f021c45db6 100644 --- a/src/KOKKOS/atom_vec_atomic_kokkos.cpp +++ b/src/KOKKOS/atom_vec_atomic_kokkos.cpp @@ -19,7 +19,7 @@ #include "modify.h" #include "fix.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" using namespace LAMMPS_NS; @@ -64,14 +64,14 @@ void AtomVecAtomicKokkos::grow(int n) sync(Device,ALL_MASK); modified(Device,ALL_MASK); - memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); - memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); - memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); - memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); - memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); - memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); - memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); grow_reset(); sync(Host,ALL_MASK); @@ -136,456 +136,6 @@ void AtomVecAtomicKokkos::copy(int i, int j, int delflag) /* ---------------------------------------------------------------------- */ -template -struct AtomVecAtomicKokkos_PackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_xfloat_2d_um _buf; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecAtomicKokkos_PackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - const size_t maxsend = (buf.view().dimension_0()*buf.view().dimension_1())/3; - const size_t elements = 3; - buffer_view(_buf,buf,maxsend,elements); - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _buf(i,0) = _x(j,0); - _buf(i,1) = _x(j,1); - _buf(i,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecAtomicKokkos::pack_comm_kokkos(const int &n, - const DAT::tdual_int_2d &list, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, - const int* const pbc) -{ - // Check whether to always run forward communication on the host - // Choose correct forward PackComm kernel - - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - - return n*size_forward; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecAtomicKokkos_PackCommSelf { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_x_array _xw; - int _nfirst; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecAtomicKokkos_PackCommSelf( - const typename DAT::tdual_x_array &x, - const int &nfirst, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_xw(x.view()),_nfirst(nfirst),_list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _xw(i+_nfirst,0) = _x(j,0); - _xw(i+_nfirst,1) = _x(j,1); - _xw(i+_nfirst,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecAtomicKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, - const int nfirst, const int &pbc_flag, const int* const pbc) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecAtomicKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - return n*3; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecAtomicKokkos_UnpackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array _x; - typename ArrayTypes::t_xfloat_2d_const _buf; - int _first; - - AtomVecAtomicKokkos_UnpackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const int& first):_x(x.view()),_buf(buf.view()), - _first(first) {}; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - _x(i+_first,0) = _buf(i,0); - _x(i+_first,1) = _buf(i,1); - _x(i+_first,2) = _buf(i,2); - } -}; - -/* ---------------------------------------------------------------------- */ - -void AtomVecAtomicKokkos::unpack_comm_kokkos(const int &n, const int &first, - const DAT::tdual_xfloat_2d &buf ) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - struct AtomVecAtomicKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - struct AtomVecAtomicKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecAtomicKokkos::pack_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecAtomicKokkos::pack_comm_vel(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz,dvx,dvy,dvz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - if (!deform_vremap) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; - dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; - dvz = pbc[2]*h_rate[2]; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - if (mask[i] & deform_groupbit) { - buf[m++] = h_v(j,0) + dvx; - buf[m++] = h_v(j,1) + dvy; - buf[m++] = h_v(j,2) + dvz; - } else { - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecAtomicKokkos::unpack_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecAtomicKokkos::unpack_comm_vel(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - h_v(i,0) = buf[m++]; - h_v(i,1) = buf[m++]; - h_v(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecAtomicKokkos::pack_reverse(int n, int first, double *buf) -{ - if(n > 0) - sync(Host,F_MASK); - - int m = 0; - const int last = first + n; - for (int i = first; i < last; i++) { - buf[m++] = h_f(i,0); - buf[m++] = h_f(i,1); - buf[m++] = h_f(i,2); - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecAtomicKokkos::unpack_reverse(int n, int *list, double *buf) -{ - if(n > 0) { - sync(Host,F_MASK); - modified(Host,F_MASK); - } - - int m = 0; - for (int i = 0; i < n; i++) { - const int j = list[i]; - h_f(j,0) += buf[m++]; - h_f(j,1) += buf[m++]; - h_f(j,2) += buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - template struct AtomVecAtomicKokkos_PackBorder { typedef DeviceType device_type; @@ -655,13 +205,11 @@ int AtomVecAtomicKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecAtomicKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } else { @@ -671,13 +219,11 @@ int AtomVecAtomicKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecAtomicKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } return n*6; @@ -853,11 +399,9 @@ void AtomVecAtomicKokkos::unpack_border_kokkos(const int &n, const int &first, if(space==Host) { struct AtomVecAtomicKokkos_UnpackBorder f(buf.view(),h_x,h_tag,h_type,h_mask,first); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { struct AtomVecAtomicKokkos_UnpackBorder f(buf.view(),d_x,d_tag,d_type,d_mask,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -1009,12 +553,10 @@ int AtomVecAtomicKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat if(space == Host) { AtomVecAtomicKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPHostType::fence(); return nsend*11; } else { AtomVecAtomicKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPDeviceType::fence(); return nsend*11; } } @@ -1106,7 +648,6 @@ int AtomVecAtomicKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int k_count.h_view(0) = nlocal; AtomVecAtomicKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/11,f); - LMPHostType::fence(); return k_count.h_view(0); } else { k_count.h_view(0) = nlocal; @@ -1114,7 +655,6 @@ int AtomVecAtomicKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int k_count.sync(); AtomVecAtomicKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/11,f); - LMPDeviceType::fence(); k_count.modify(); k_count.sync(); diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.h b/src/KOKKOS/atom_vec_atomic_kokkos.h index 0c3e24f9d9..e4d2654e2c 100644 --- a/src/KOKKOS/atom_vec_atomic_kokkos.h +++ b/src/KOKKOS/atom_vec_atomic_kokkos.h @@ -14,6 +14,8 @@ #ifdef ATOM_CLASS AtomStyle(atomic/kk,AtomVecAtomicKokkos) +AtomStyle(atomic/kk/device,AtomVecAtomicKokkos) +AtomStyle(atomic/kk/host,AtomVecAtomicKokkos) #else @@ -31,12 +33,6 @@ class AtomVecAtomicKokkos : public AtomVecKokkos { virtual ~AtomVecAtomicKokkos() {} void grow(int); void copy(int, int, int); - int pack_comm(int, int *, double *, int, int *); - int pack_comm_vel(int, int *, double *, int, int *); - void unpack_comm(int, int, double *); - void unpack_comm_vel(int, int, double *); - int pack_reverse(int, int, double *); - void unpack_reverse(int, int *, double *); int pack_border(int, int *, double *, int, int *); int pack_border_vel(int, int *, double *, int, int *); void unpack_border(int, int, double *); @@ -53,15 +49,6 @@ class AtomVecAtomicKokkos : public AtomVecKokkos { bigint memory_usage(); void grow_reset(); - int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, const int pbc[]); - void unpack_comm_kokkos(const int &n, const int &nfirst, - const DAT::tdual_xfloat_2d &buf); - int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, - const int & iswap, const int nfirst, - const int &pbc_flag, const int pbc[]); int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, int pbc_flag, int *pbc, ExecutionSpace space); @@ -97,9 +84,6 @@ class AtomVecAtomicKokkos : public AtomVecKokkos { DAT::t_x_array d_x; DAT::t_v_array d_v; DAT::t_f_array d_f; - HAT::t_x_array h_x; - HAT::t_v_array h_v; - HAT::t_f_array h_f; DAT::tdual_int_1d k_count; }; diff --git a/src/KOKKOS/atom_vec_bond_kokkos.cpp b/src/KOKKOS/atom_vec_bond_kokkos.cpp index c46c49cb29..bf682c507f 100644 --- a/src/KOKKOS/atom_vec_bond_kokkos.cpp +++ b/src/KOKKOS/atom_vec_bond_kokkos.cpp @@ -19,7 +19,7 @@ #include "modify.h" #include "fix.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" using namespace LAMMPS_NS; @@ -65,21 +65,21 @@ void AtomVecBondKokkos::grow(int n) sync(Device,ALL_MASK); modified(Device,ALL_MASK); - memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); - memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); - memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); - memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); - memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); - memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); - memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); - memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); - memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); - memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,"atom:special"); - memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); - memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,"atom:bond_type"); - memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,"atom:bond_atom"); + memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); + memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); + memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,"atom:special"); + memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); + memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,"atom:bond_type"); + memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,"atom:bond_atom"); grow_reset(); sync(Host,ALL_MASK); @@ -178,454 +178,6 @@ void AtomVecBondKokkos::copy(int i, int j, int delflag) /* ---------------------------------------------------------------------- */ -template -struct AtomVecBondKokkos_PackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_xfloat_2d_um _buf; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecBondKokkos_PackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - const size_t maxsend = (buf.view().dimension_0()*buf.view().dimension_1())/3; - const size_t elements = 3; - buffer_view(_buf,buf,maxsend,elements); - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _buf(i,0) = _x(j,0); - _buf(i,1) = _x(j,1); - _buf(i,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecBondKokkos::pack_comm_kokkos(const int &n, - const DAT::tdual_int_2d &list, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, - const int* const pbc) -{ - // Check whether to always run forward communication on the host - // Choose correct forward PackComm kernel - - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - - return n*size_forward; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecBondKokkos_PackCommSelf { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_x_array _xw; - int _nfirst; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecBondKokkos_PackCommSelf( - const typename DAT::tdual_x_array &x, - const int &nfirst, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_xw(x.view()),_nfirst(nfirst),_list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _xw(i+_nfirst,0) = _x(j,0); - _xw(i+_nfirst,1) = _x(j,1); - _xw(i+_nfirst,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecBondKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, - const int nfirst, const int &pbc_flag, const int* const pbc) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecBondKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - return n*3; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecBondKokkos_UnpackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array _x; - typename ArrayTypes::t_xfloat_2d_const _buf; - int _first; - - AtomVecBondKokkos_UnpackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const int& first):_x(x.view()),_buf(buf.view()), - _first(first) {}; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - _x(i+_first,0) = _buf(i,0); - _x(i+_first,1) = _buf(i,1); - _x(i+_first,2) = _buf(i,2); - } -}; - -/* ---------------------------------------------------------------------- */ - -void AtomVecBondKokkos::unpack_comm_kokkos(const int &n, const int &first, - const DAT::tdual_xfloat_2d &buf ) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - struct AtomVecBondKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - struct AtomVecBondKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecBondKokkos::pack_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecBondKokkos::pack_comm_vel(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz,dvx,dvy,dvz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - if (!deform_vremap) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; - dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; - dvz = pbc[2]*h_rate[2]; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - if (mask[i] & deform_groupbit) { - buf[m++] = h_v(j,0) + dvx; - buf[m++] = h_v(j,1) + dvy; - buf[m++] = h_v(j,2) + dvz; - } else { - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecBondKokkos::unpack_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecBondKokkos::unpack_comm_vel(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - h_v(i,0) = buf[m++]; - h_v(i,1) = buf[m++]; - h_v(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecBondKokkos::pack_reverse(int n, int first, double *buf) -{ - if(n > 0) - sync(Host,F_MASK); - - int m = 0; - const int last = first + n; - for (int i = first; i < last; i++) { - buf[m++] = h_f(i,0); - buf[m++] = h_f(i,1); - buf[m++] = h_f(i,2); - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecBondKokkos::unpack_reverse(int n, int *list, double *buf) -{ - if(n > 0) - modified(Host,F_MASK); - - int m = 0; - for (int i = 0; i < n; i++) { - const int j = list[i]; - h_f(j,0) += buf[m++]; - h_f(j,1) += buf[m++]; - h_f(j,2) += buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - template struct AtomVecBondKokkos_PackBorder { typedef DeviceType device_type; @@ -701,13 +253,11 @@ int AtomVecBondKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecBondKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } else { @@ -717,13 +267,11 @@ int AtomVecBondKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecBondKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } return n*size_border; @@ -925,12 +473,10 @@ void AtomVecBondKokkos::unpack_border_kokkos(const int &n, const int &first, struct AtomVecBondKokkos_UnpackBorder f(buf.view(),h_x,h_tag,h_type,h_mask,h_molecule,first); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { struct AtomVecBondKokkos_UnpackBorder f(buf.view(),d_x,d_tag,d_type,d_mask,d_molecule,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -1157,13 +703,11 @@ int AtomVecBondKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2 AtomVecBondKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPHostType::fence(); return nsend*elements; } else { AtomVecBondKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPDeviceType::fence(); return nsend*elements; } } @@ -1299,7 +843,6 @@ int AtomVecBondKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int nr AtomVecBondKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPHostType::fence(); return k_count.h_view(0); } else { k_count.h_view(0) = nlocal; @@ -1308,7 +851,6 @@ int AtomVecBondKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int nr AtomVecBondKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPDeviceType::fence(); k_count.modify(); k_count.sync(); diff --git a/src/KOKKOS/atom_vec_bond_kokkos.h b/src/KOKKOS/atom_vec_bond_kokkos.h index e64017c99b..7ec15450ef 100644 --- a/src/KOKKOS/atom_vec_bond_kokkos.h +++ b/src/KOKKOS/atom_vec_bond_kokkos.h @@ -14,6 +14,8 @@ #ifdef ATOM_CLASS AtomStyle(bond/kk,AtomVecBondKokkos) +AtomStyle(bond/kk/device,AtomVecBondKokkos) +AtomStyle(bond/kk/host,AtomVecBondKokkos) #else @@ -30,12 +32,6 @@ class AtomVecBondKokkos : public AtomVecKokkos { virtual ~AtomVecBondKokkos() {} void grow(int); void copy(int, int, int); - int pack_comm(int, int *, double *, int, int *); - int pack_comm_vel(int, int *, double *, int, int *); - void unpack_comm(int, int, double *); - void unpack_comm_vel(int, int, double *); - int pack_reverse(int, int, double *); - void unpack_reverse(int, int *, double *); int pack_border(int, int *, double *, int, int *); int pack_border_vel(int, int *, double *, int, int *); int pack_border_hybrid(int, int *, double *); @@ -57,15 +53,6 @@ class AtomVecBondKokkos : public AtomVecKokkos { bigint memory_usage(); void grow_reset(); - int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, const int pbc[]); - void unpack_comm_kokkos(const int &n, const int &nfirst, - const DAT::tdual_xfloat_2d &buf); - int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, - const int & iswap, const int nfirst, - const int &pbc_flag, const int pbc[]); int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, int pbc_flag, int *pbc, ExecutionSpace space); @@ -110,9 +97,6 @@ class AtomVecBondKokkos : public AtomVecKokkos { DAT::t_x_array d_x; DAT::t_v_array d_v; DAT::t_f_array d_f; - HAT::t_x_array h_x; - HAT::t_v_array h_v; - HAT::t_f_array h_f; DAT::t_tagint_1d d_molecule; DAT::t_int_2d d_nspecial; diff --git a/src/KOKKOS/atom_vec_charge_kokkos.cpp b/src/KOKKOS/atom_vec_charge_kokkos.cpp index 856660d1e9..a9ae5cc2d1 100644 --- a/src/KOKKOS/atom_vec_charge_kokkos.cpp +++ b/src/KOKKOS/atom_vec_charge_kokkos.cpp @@ -19,7 +19,7 @@ #include "modify.h" #include "fix.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" using namespace LAMMPS_NS; @@ -67,16 +67,16 @@ void AtomVecChargeKokkos::grow(int n) sync(Device,ALL_MASK); modified(Device,ALL_MASK); - memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); - memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); - memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); - memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); - memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); - memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); - memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); - memory->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); + memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); grow_reset(); sync(Host,ALL_MASK); @@ -199,403 +199,6 @@ struct AtomVecChargeKokkos_PackComm { /* ---------------------------------------------------------------------- */ -int AtomVecChargeKokkos::pack_comm_kokkos(const int &n, - const DAT::tdual_int_2d &list, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, - const int* const pbc) -{ - // Check whether to always run forward communication on the host - // Choose correct forward PackComm kernel - - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackComm f(atomKK->k_x,buf,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - - return n*size_forward; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecChargeKokkos_PackCommSelf { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_x_array _xw; - int _nfirst; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecChargeKokkos_PackCommSelf( - const typename DAT::tdual_x_array &x, - const int &nfirst, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_xw(x.view()),_nfirst(nfirst),_list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _xw(i+_nfirst,0) = _x(j,0); - _xw(i+_nfirst,1) = _x(j,1); - _xw(i+_nfirst,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecChargeKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, - const int nfirst, const int &pbc_flag, const int* const pbc) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecChargeKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - return n*3; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecChargeKokkos_UnpackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array _x; - typename ArrayTypes::t_xfloat_2d_const _buf; - int _first; - - AtomVecChargeKokkos_UnpackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const int& first):_x(x.view()),_buf(buf.view()), - _first(first) {}; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - _x(i+_first,0) = _buf(i,0); - _x(i+_first,1) = _buf(i,1); - _x(i+_first,2) = _buf(i,2); - } -}; - -/* ---------------------------------------------------------------------- */ - -void AtomVecChargeKokkos::unpack_comm_kokkos(const int &n, const int &first, - const DAT::tdual_xfloat_2d &buf ) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - struct AtomVecChargeKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - struct AtomVecChargeKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecChargeKokkos::pack_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecChargeKokkos::pack_comm_vel(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz,dvx,dvy,dvz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - if (!deform_vremap) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; - dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; - dvz = pbc[2]*h_rate[2]; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - if (mask[i] & deform_groupbit) { - buf[m++] = h_v(j,0) + dvx; - buf[m++] = h_v(j,1) + dvy; - buf[m++] = h_v(j,2) + dvz; - } else { - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecChargeKokkos::unpack_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecChargeKokkos::unpack_comm_vel(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - h_v(i,0) = buf[m++]; - h_v(i,1) = buf[m++]; - h_v(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecChargeKokkos::pack_reverse(int n, int first, double *buf) -{ - if(n > 0) - sync(Host,F_MASK); - - int m = 0; - const int last = first + n; - for (int i = first; i < last; i++) { - buf[m++] = h_f(i,0); - buf[m++] = h_f(i,1); - buf[m++] = h_f(i,2); - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecChargeKokkos::unpack_reverse(int n, int *list, double *buf) -{ - if(n > 0) - modified(Host,F_MASK); - - int m = 0; - for (int i = 0; i < n; i++) { - const int j = list[i]; - h_f(j,0) += buf[m++]; - h_f(j,1) += buf[m++]; - h_f(j,2) += buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - template struct AtomVecChargeKokkos_PackBorder { typedef DeviceType device_type; @@ -669,13 +272,11 @@ int AtomVecChargeKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_q,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecChargeKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_q,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } else { @@ -685,13 +286,11 @@ int AtomVecChargeKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_q,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecChargeKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_q,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } return n*size_border; @@ -890,12 +489,10 @@ void AtomVecChargeKokkos::unpack_border_kokkos(const int &n, const int &first, struct AtomVecChargeKokkos_UnpackBorder f(buf.view(),h_x,h_tag,h_type,h_mask,h_q,first); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { struct AtomVecChargeKokkos_UnpackBorder f(buf.view(),d_x,d_tag,d_type,d_mask,d_q,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|Q_MASK); } @@ -1078,13 +675,11 @@ int AtomVecChargeKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat AtomVecChargeKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPHostType::fence(); return nsend*12; } else { AtomVecChargeKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPDeviceType::fence(); return nsend*12; } } @@ -1181,7 +776,6 @@ int AtomVecChargeKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int k_count.h_view(0) = nlocal; AtomVecChargeKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/12,f); - LMPHostType::fence(); return k_count.h_view(0); } else { k_count.h_view(0) = nlocal; @@ -1190,7 +784,6 @@ int AtomVecChargeKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int AtomVecChargeKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/12,f); - LMPDeviceType::fence(); k_count.modify(); k_count.sync(); diff --git a/src/KOKKOS/atom_vec_charge_kokkos.h b/src/KOKKOS/atom_vec_charge_kokkos.h index 38e32458c6..e9ff70bbe1 100644 --- a/src/KOKKOS/atom_vec_charge_kokkos.h +++ b/src/KOKKOS/atom_vec_charge_kokkos.h @@ -14,6 +14,8 @@ #ifdef ATOM_CLASS AtomStyle(charge/kk,AtomVecChargeKokkos) +AtomStyle(charge/kk/device,AtomVecChargeKokkos) +AtomStyle(charge/kk/host,AtomVecChargeKokkos) #else @@ -31,12 +33,6 @@ class AtomVecChargeKokkos : public AtomVecKokkos { virtual ~AtomVecChargeKokkos() {} void grow(int); void copy(int, int, int); - int pack_comm(int, int *, double *, int, int *); - int pack_comm_vel(int, int *, double *, int, int *); - void unpack_comm(int, int, double *); - void unpack_comm_vel(int, int, double *); - int pack_reverse(int, int, double *); - void unpack_reverse(int, int *, double *); int pack_border(int, int *, double *, int, int *); int pack_border_vel(int, int *, double *, int, int *); int pack_border_hybrid(int, int *, double *); @@ -58,15 +54,6 @@ class AtomVecChargeKokkos : public AtomVecKokkos { bigint memory_usage(); void grow_reset(); - int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, const int pbc[]); - void unpack_comm_kokkos(const int &n, const int &nfirst, - const DAT::tdual_xfloat_2d &buf); - int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, - const int & iswap, const int nfirst, - const int &pbc_flag, const int pbc[]); int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, int pbc_flag, int *pbc, ExecutionSpace space); @@ -106,9 +93,6 @@ class AtomVecChargeKokkos : public AtomVecKokkos { DAT::t_x_array d_x; DAT::t_v_array d_v; DAT::t_f_array d_f; - HAT::t_x_array h_x; - HAT::t_v_array h_v; - HAT::t_f_array h_f; DAT::t_float_1d d_q; diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.cpp b/src/KOKKOS/atom_vec_dpd_kokkos.cpp new file mode 100644 index 0000000000..9c54ffccc5 --- /dev/null +++ b/src/KOKKOS/atom_vec_dpd_kokkos.cpp @@ -0,0 +1,2002 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale AtomicKokkos/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include "atom_vec_dpd_kokkos.h" +#include "atom_kokkos.h" +#include "comm_kokkos.h" +#include "domain.h" +#include "modify.h" +#include "fix.h" +#include "atom_masks.h" +#include "memory_kokkos.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define DELTA 10000 + +/* ---------------------------------------------------------------------- */ + +AtomVecDPDKokkos::AtomVecDPDKokkos(LAMMPS *lmp) : AtomVecKokkos(lmp) +{ + molecular = 0; + mass_type = 1; + + comm_x_only = comm_f_only = 0; + size_forward = 7; + size_reverse = 3; + size_border = 12; + size_velocity = 3; + size_data_atom = 6; + size_data_vel = 4; + xcol_data = 4; + + atom->rho_flag = 1; + atom->dpd_flag = 1; + + k_count = DAT::tdual_int_1d("atom::k_count",1); + atomKK = (AtomKokkos *) atom; + commKK = (CommKokkos *) comm; +} + +/* ---------------------------------------------------------------------- + grow atom arrays + n = 0 grows arrays by DELTA + n > 0 allocates arrays to size n +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::grow(int n) +{ + if (n == 0) nmax += DELTA; + else nmax = n; + atomKK->nmax = nmax; + if (nmax < 0 || nmax > MAXSMALLINT) + error->one(FLERR,"Per-processor system is too big"); + + sync(Device,ALL_MASK); + modified(Device,ALL_MASK); + + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + + + memoryKK->grow_kokkos(atomKK->k_rho,atomKK->rho,nmax,"atom:rho"); + memoryKK->grow_kokkos(atomKK->k_dpdTheta,atomKK->dpdTheta,nmax,"atom:dpdTheta"); + memoryKK->grow_kokkos(atomKK->k_uCond,atomKK->uCond,nmax,"atom:uCond"); + memoryKK->grow_kokkos(atomKK->k_uMech,atomKK->uMech,nmax,"atom:uMech"); + memoryKK->grow_kokkos(atomKK->k_uChem,atomKK->uChem,nmax,"atom:uChem"); + memoryKK->grow_kokkos(atomKK->k_uCG,atomKK->uCG,nmax,"atom:uCG"); + memoryKK->grow_kokkos(atomKK->k_uCGnew,atomKK->uCGnew,nmax,"atom:uCGnew"); + memoryKK->grow_kokkos(atomKK->k_duChem,atomKK->duChem,nmax,"atom:duChem"); + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax); + + grow_reset(); + sync(Host,ALL_MASK); +} + +/* ---------------------------------------------------------------------- + reset local array ptrs +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::grow_reset() +{ + tag = atomKK->tag; + d_tag = atomKK->k_tag.d_view; + h_tag = atomKK->k_tag.h_view; + + type = atomKK->type; + d_type = atomKK->k_type.d_view; + h_type = atomKK->k_type.h_view; + mask = atomKK->mask; + d_mask = atomKK->k_mask.d_view; + h_mask = atomKK->k_mask.h_view; + image = atomKK->image; + d_image = atomKK->k_image.d_view; + h_image = atomKK->k_image.h_view; + + x = atomKK->x; + d_x = atomKK->k_x.d_view; + h_x = atomKK->k_x.h_view; + v = atomKK->v; + d_v = atomKK->k_v.d_view; + h_v = atomKK->k_v.h_view; + f = atomKK->f; + d_f = atomKK->k_f.d_view; + h_f = atomKK->k_f.h_view; + + rho = atomKK->rho; + d_rho = atomKK->k_rho.d_view; + h_rho = atomKK->k_rho.h_view; + dpdTheta = atomKK->dpdTheta; + d_dpdTheta = atomKK->k_dpdTheta.d_view; + h_dpdTheta = atomKK->k_dpdTheta.h_view; + uCond = atomKK->uCond; + d_uCond = atomKK->k_uCond.d_view;; + h_uCond = atomKK->k_uCond.h_view; + uMech = atomKK->uMech; + d_uMech = atomKK->k_uMech.d_view;; + h_uMech = atomKK->k_uMech.h_view; + uChem = atomKK->uChem; + d_uChem = atomKK->k_uChem.d_view;; + h_uChem = atomKK->k_uChem.h_view; + uCG = atomKK->uCG; + d_uCG = atomKK->k_uCG.d_view;; + h_uCG = atomKK->k_uCG.h_view; + uCGnew = atomKK->uCGnew; + d_uCGnew = atomKK->k_uCGnew.d_view;; + h_uCGnew = atomKK->k_uCGnew.h_view; + duChem = atomKK->duChem; + d_duChem = atomKK->k_duChem.d_view;; + h_duChem = atomKK->k_duChem.h_view; +} + +/* ---------------------------------------------------------------------- + copy atom I info to atom J +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::copy(int i, int j, int delflag) +{ + sync(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK | DPDTHETA_MASK | + UCOND_MASK | UMECH_MASK | UCHEM_MASK | DVECTOR_MASK); + + h_tag[j] = h_tag[i]; + h_type[j] = h_type[i]; + mask[j] = mask[i]; + h_image[j] = h_image[i]; + h_x(j,0) = h_x(i,0); + h_x(j,1) = h_x(i,1); + h_x(j,2) = h_x(i,2); + h_v(j,0) = h_v(i,0); + h_v(j,1) = h_v(i,1); + h_v(j,2) = h_v(i,2); + h_dpdTheta[j] = h_dpdTheta[i]; + h_uCond[j] = h_uCond[i]; + h_uMech[j] = h_uMech[i]; + h_uChem[j] = h_uChem[i]; + h_uCG[j] = h_uCG[i]; + h_uCGnew[j] = h_uCGnew[i]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag); + + modified(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK | DPDTHETA_MASK | + UCOND_MASK | UMECH_MASK | UCHEM_MASK | DVECTOR_MASK); +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_PackComm { + typedef DeviceType device_type; + + typename ArrayTypes::t_x_array_randomread _x; + typename ArrayTypes::t_efloat_1d _dpdTheta,_uCond,_uMech,_uChem; + typename ArrayTypes::t_xfloat_2d_um _buf; + typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; + X_FLOAT _pbc[6]; + + AtomVecDPDKokkos_PackComm( + const typename DAT::tdual_x_array &x, + const typename DAT::tdual_efloat_1d &dpdTheta, + const typename DAT::tdual_efloat_1d &uCond, + const typename DAT::tdual_efloat_1d &uMech, + const typename DAT::tdual_efloat_1d &uChem, + const typename DAT::tdual_xfloat_2d &buf, + const typename DAT::tdual_int_2d &list, + const int & iswap, + const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, + const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): + _x(x.view()), + _dpdTheta(dpdTheta.view()), + _uCond(uCond.view()), + _uMech(uMech.view()), + _uChem(uChem.view()), + _list(list.view()),_iswap(iswap), + _xprd(xprd),_yprd(yprd),_zprd(zprd), + _xy(xy),_xz(xz),_yz(yz) { + const size_t maxsend = (buf.view().dimension_0()*buf.view().dimension_1())/3; + const size_t elements = 3; + buffer_view(_buf,buf,maxsend,elements); + _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; + _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; + }; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + if (PBC_FLAG == 0) { + _buf(i,0) = _x(j,0); + _buf(i,1) = _x(j,1); + _buf(i,2) = _x(j,2); + } else { + if (TRICLINIC == 0) { + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + } else { + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + } + } + _buf(i,3) = _dpdTheta(j); + _buf(i,4) = _uCond(j); + _buf(i,5) = _uMech(j); + _buf(i,6) = _uChem(j); + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_comm_kokkos(const int &n, + const DAT::tdual_int_2d &list, + const int & iswap, + const DAT::tdual_xfloat_2d &buf, + const int &pbc_flag, + const int* const pbc) +{ + // Check whether to always run forward communication on the host + // Choose correct forward PackComm kernel + + if(commKK->forward_comm_on_host) { + sync(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } else { + sync(Device,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } + + return n*size_forward; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_PackCommSelf { + typedef DeviceType device_type; + + typename ArrayTypes::t_x_array_randomread _x; + typename ArrayTypes::t_x_array _xw; + typename ArrayTypes::t_efloat_1d _dpdTheta,_uCond,_uMech,_uChem; + int _nfirst; + typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; + X_FLOAT _pbc[6]; + + AtomVecDPDKokkos_PackCommSelf( + const typename DAT::tdual_x_array &x, + const typename DAT::tdual_efloat_1d &dpdTheta, + const typename DAT::tdual_efloat_1d &uCond, + const typename DAT::tdual_efloat_1d &uMech, + const typename DAT::tdual_efloat_1d &uChem, + const int &nfirst, + const typename DAT::tdual_int_2d &list, + const int & iswap, + const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, + const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): + _x(x.view()),_xw(x.view()), + _dpdTheta(dpdTheta.view()), + _uCond(uCond.view()), + _uMech(uMech.view()), + _uChem(uChem.view()), + _nfirst(nfirst),_list(list.view()),_iswap(iswap), + _xprd(xprd),_yprd(yprd),_zprd(zprd), + _xy(xy),_xz(xz),_yz(yz) { + _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; + _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; + }; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + if (PBC_FLAG == 0) { + _xw(i+_nfirst,0) = _x(j,0); + _xw(i+_nfirst,1) = _x(j,1); + _xw(i+_nfirst,2) = _x(j,2); + } else { + if (TRICLINIC == 0) { + _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; + _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; + _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; + } else { + _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; + } + } + _dpdTheta(i+_nfirst) = _dpdTheta(j); + _uCond(i+_nfirst) = _uCond(j); + _uMech(i+_nfirst) = _uMech(j); + _uChem(i+_nfirst) = _uChem(j); + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, + const int nfirst, const int &pbc_flag, const int* const pbc) { + if(commKK->forward_comm_on_host) { + sync(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + modified(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } else { + sync(Device,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + modified(Device,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_PackCommSelf f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } + return n*3; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_UnpackComm { + typedef DeviceType device_type; + + typename ArrayTypes::t_x_array _x; + typename ArrayTypes::t_efloat_1d _dpdTheta,_uCond,_uMech,_uChem; + typename ArrayTypes::t_xfloat_2d_const _buf; + int _first; + + AtomVecDPDKokkos_UnpackComm( + const typename DAT::tdual_x_array &x, + const typename DAT::tdual_efloat_1d &dpdTheta, + const typename DAT::tdual_efloat_1d &uCond, + const typename DAT::tdual_efloat_1d &uMech, + const typename DAT::tdual_efloat_1d &uChem, + const typename DAT::tdual_xfloat_2d &buf, + const int& first):_x(x.view()), + _dpdTheta(dpdTheta.view()), + _uCond(uCond.view()), + _uMech(uMech.view()), + _uChem(uChem.view()), + _buf(buf.view()), + _first(first) {}; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + _x(i+_first,0) = _buf(i,0); + _x(i+_first,1) = _buf(i,1); + _x(i+_first,2) = _buf(i,2); + _dpdTheta(i+_first) = _buf(i,3); + _uCond(i+_first) = _buf(i,4); + _uMech(i+_first) = _buf(i,5); + _uChem(i+_first) = _buf(i,6); + } +}; + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_comm_kokkos(const int &n, const int &first, + const DAT::tdual_xfloat_2d &buf ) { + if(commKK->forward_comm_on_host) { + sync(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + modified(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + struct AtomVecDPDKokkos_UnpackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,first); + Kokkos::parallel_for(n,f); + } else { + sync(Device,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + modified(Device,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + struct AtomVecDPDKokkos_UnpackComm f(atomKK->k_x, + atomKK->k_dpdTheta,atomKK->k_uCond,atomKK->k_uMech,atomKK->k_uChem, + buf,first); + Kokkos::parallel_for(n,f); + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz; + + sync(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = h_dpdTheta[j]; + buf[m++] = h_uCond[j]; + buf[m++] = h_uMech[j]; + buf[m++] = h_uChem[j]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = h_dpdTheta[j]; + buf[m++] = h_uCond[j]; + buf[m++] = h_uMech[j]; + buf[m++] = h_uChem[j]; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_comm_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + sync(Host,X_MASK|V_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + buf[m++] = h_dpdTheta[j]; + buf[m++] = h_uCond[j]; + buf[m++] = h_uMech[j]; + buf[m++] = h_uChem[j]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + buf[m++] = h_dpdTheta[j]; + buf[m++] = h_uCond[j]; + buf[m++] = h_uMech[j]; + buf[m++] = h_uChem[j]; + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + if (mask[i] & deform_groupbit) { + buf[m++] = h_v(j,0) + dvx; + buf[m++] = h_v(j,1) + dvy; + buf[m++] = h_v(j,2) + dvz; + } else { + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + buf[m++] = h_dpdTheta(j); + buf[m++] = h_uCond(j); + buf[m++] = h_uMech(j); + buf[m++] = h_uChem(j); + } + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_dpdTheta[i] = buf[m++]; + h_uCond[i] = buf[m++]; + h_uMech[i] = buf[m++]; + h_uChem[i] = buf[m++]; + } + + modified(Host,X_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_comm_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_v(i,0) = buf[m++]; + h_v(i,1) = buf[m++]; + h_v(i,2) = buf[m++]; + h_dpdTheta[i] = buf[m++]; + h_uCond[i] = buf[m++]; + h_uMech[i] = buf[m++]; + h_uChem[i] = buf[m++]; + } + + modified(Host,X_MASK|V_MASK|DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_reverse(int n, int first, double *buf) +{ + if(n > 0) + sync(Host,F_MASK); + + int m = 0; + const int last = first + n; + for (int i = first; i < last; i++) { + buf[m++] = h_f(i,0); + buf[m++] = h_f(i,1); + buf[m++] = h_f(i,2); + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_reverse(int n, int *list, double *buf) +{ + if(n > 0) { + sync(Host,F_MASK); + modified(Host,F_MASK); + } + + int m = 0; + for (int i = 0; i < n; i++) { + const int j = list[i]; + h_f(j,0) += buf[m++]; + h_f(j,1) += buf[m++]; + h_f(j,2) += buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_PackBorder { + typedef DeviceType device_type; + + typename ArrayTypes::t_xfloat_2d _buf; + const typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + const typename ArrayTypes::t_x_array_randomread _x; + const typename ArrayTypes::t_tagint_1d _tag; + const typename ArrayTypes::t_int_1d _type; + const typename ArrayTypes::t_int_1d _mask; + typename ArrayTypes::t_efloat_1d _dpdTheta,_uCond,_uMech,_uChem,_uCG,_uCGnew; + X_FLOAT _dx,_dy,_dz; + + AtomVecDPDKokkos_PackBorder( + const typename ArrayTypes::t_xfloat_2d &buf, + const typename ArrayTypes::t_int_2d_const &list, + const int & iswap, + const typename ArrayTypes::t_x_array &x, + const typename ArrayTypes::t_tagint_1d &tag, + const typename ArrayTypes::t_int_1d &type, + const typename ArrayTypes::t_int_1d &mask, + const typename ArrayTypes::t_efloat_1d &dpdTheta, + const typename ArrayTypes::t_efloat_1d &uCond, + const typename ArrayTypes::t_efloat_1d &uMech, + const typename ArrayTypes::t_efloat_1d &uChem, + const typename ArrayTypes::t_efloat_1d &uCG, + const typename ArrayTypes::t_efloat_1d &uCGnew, + const X_FLOAT &dx, const X_FLOAT &dy, const X_FLOAT &dz): + _buf(buf),_list(list),_iswap(iswap), + _x(x),_tag(tag),_type(type),_mask(mask), + _dpdTheta(dpdTheta), + _uCond(uCond), + _uMech(uMech), + _uChem(uChem), + _uCG(uCGnew), + _uCGnew(uCGnew), + _dx(dx),_dy(dy),_dz(dz) {} + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + if (PBC_FLAG == 0) { + _buf(i,0) = _x(j,0); + _buf(i,1) = _x(j,1); + _buf(i,2) = _x(j,2); + } else { + _buf(i,0) = _x(j,0) + _dx; + _buf(i,1) = _x(j,1) + _dy; + _buf(i,2) = _x(j,2) + _dz; + } + _buf(i,3) = _tag(j); + _buf(i,4) = _type(j); + _buf(i,5) = _mask(j); + _buf(i,6) = _dpdTheta(j); + _buf(i,7) = _uCond(j); + _buf(i,8) = _uMech(j); + _buf(i,9) = _uChem(j); + _buf(i,10) = _uCG(j); + _buf(i,11) = _uCGnew(j); + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, + int pbc_flag, int *pbc, ExecutionSpace space) +{ + X_FLOAT dx,dy,dz; + + sync(space,ALL_MASK); + + if (pbc_flag != 0) { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + if(space==Host) { + AtomVecDPDKokkos_PackBorder f( + buf.view(), k_sendlist.view(), + iswap,h_x,h_tag,h_type,h_mask, + h_dpdTheta,h_uCond,h_uMech,h_uChem,h_uCG,h_uCGnew, + dx,dy,dz); + Kokkos::parallel_for(n,f); + } else { + AtomVecDPDKokkos_PackBorder f( + buf.view(), k_sendlist.view(), + iswap,d_x,d_tag,d_type,d_mask, + d_dpdTheta,d_uCond,d_uMech,d_uChem,d_uCG,d_uCGnew, + dx,dy,dz); + Kokkos::parallel_for(n,f); + } + + } else { + dx = dy = dz = 0; + if(space==Host) { + AtomVecDPDKokkos_PackBorder f( + buf.view(), k_sendlist.view(), + iswap,h_x,h_tag,h_type,h_mask, + h_dpdTheta,h_uCond,h_uMech,h_uChem,h_uCG,h_uCGnew, + dx,dy,dz); + Kokkos::parallel_for(n,f); + } else { + AtomVecDPDKokkos_PackBorder f( + buf.view(), k_sendlist.view(), + iswap,d_x,d_tag,d_type,d_mask, + d_dpdTheta,d_uCond,d_uMech,d_uChem,d_uCG,d_uCGnew, + dx,dy,dz); + Kokkos::parallel_for(n,f); + } + } + return n*6; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_border(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz; + + sync(Host,ALL_MASK); + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = ubuf(h_tag(j)).d; + buf[m++] = ubuf(h_type(j)).d; + buf[m++] = ubuf(h_mask(j)).d; + buf[m++] = h_dpdTheta(j); + buf[m++] = h_uCond(j); + buf[m++] = h_uMech(j); + buf[m++] = h_uChem(j); + buf[m++] = h_uCG(j); + buf[m++] = h_uCGnew(j); + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = ubuf(h_tag(j)).d; + buf[m++] = ubuf(h_type(j)).d; + buf[m++] = ubuf(h_mask(j)).d; + buf[m++] = h_dpdTheta(j); + buf[m++] = h_uCond(j); + buf[m++] = h_uMech(j); + buf[m++] = h_uChem(j); + buf[m++] = h_uCG(j); + buf[m++] = h_uCGnew(j); + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_border_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + sync(Host,ALL_MASK); + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = ubuf(h_tag(j)).d; + buf[m++] = ubuf(h_type(j)).d; + buf[m++] = ubuf(h_mask(j)).d; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + buf[m++] = h_dpdTheta(j); + buf[m++] = h_uCond(j); + buf[m++] = h_uMech(j); + buf[m++] = h_uChem(j); + buf[m++] = h_uCG(j); + buf[m++] = h_uCGnew(j); + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = ubuf(h_tag(j)).d; + buf[m++] = ubuf(h_type(j)).d; + buf[m++] = ubuf(h_mask(j)).d; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + buf[m++] = h_dpdTheta(j); + buf[m++] = h_uCond(j); + buf[m++] = h_uMech(j); + buf[m++] = h_uChem(j); + buf[m++] = h_uCG(j); + buf[m++] = h_uCGnew(j); + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = ubuf(h_tag(j)).d; + buf[m++] = ubuf(h_type(j)).d; + buf[m++] = ubuf(h_mask(j)).d; + if (mask[i] & deform_groupbit) { + buf[m++] = h_v(j,0) + dvx; + buf[m++] = h_v(j,1) + dvy; + buf[m++] = h_v(j,2) + dvz; + } else { + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + buf[m++] = h_dpdTheta(j); + buf[m++] = h_uCond(j); + buf[m++] = h_uMech(j); + buf[m++] = h_uChem(j); + buf[m++] = h_uCG(j); + buf[m++] = h_uCGnew(j); + } + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_comm_hybrid(int n, int *list, double *buf) +{ + int i,j,m; + + sync(Host,DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_dpdTheta[j]; + buf[m++] = h_uCond[j]; + buf[m++] = h_uMech[j]; + buf[m++] = h_uChem[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_border_hybrid(int n, int *list, double *buf) +{ + int i,j,m; + + sync(Host,DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_dpdTheta[j]; + buf[m++] = h_uCond[j]; + buf[m++] = h_uMech[j]; + buf[m++] = h_uChem[j]; + buf[m++] = h_uCG[j]; + buf[m++] = h_uCGnew[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_UnpackBorder { + typedef DeviceType device_type; + + const typename ArrayTypes::t_xfloat_2d_const _buf; + typename ArrayTypes::t_x_array _x; + typename ArrayTypes::t_tagint_1d _tag; + typename ArrayTypes::t_int_1d _type; + typename ArrayTypes::t_int_1d _mask; + typename ArrayTypes::t_efloat_1d _dpdTheta,_uCond,_uMech,_uChem,_uCG,_uCGnew; + int _first; + + + AtomVecDPDKokkos_UnpackBorder( + const typename ArrayTypes::t_xfloat_2d_const &buf, + typename ArrayTypes::t_x_array &x, + typename ArrayTypes::t_tagint_1d &tag, + typename ArrayTypes::t_int_1d &type, + typename ArrayTypes::t_int_1d &mask, + const typename ArrayTypes::t_efloat_1d &dpdTheta, + const typename ArrayTypes::t_efloat_1d &uCond, + const typename ArrayTypes::t_efloat_1d &uMech, + const typename ArrayTypes::t_efloat_1d &uChem, + const typename ArrayTypes::t_efloat_1d &uCG, + const typename ArrayTypes::t_efloat_1d &uCGnew, + const int& first): + _buf(buf),_x(x),_tag(tag),_type(type),_mask(mask), + _dpdTheta(dpdTheta), + _uCond(uCond), + _uMech(uMech), + _uChem(uChem), + _uCG(uCGnew), + _uCGnew(uCGnew), + _first(first) {}; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + _x(i+_first,0) = _buf(i,0); + _x(i+_first,1) = _buf(i,1); + _x(i+_first,2) = _buf(i,2); + _tag(i+_first) = static_cast (_buf(i,3)); + _type(i+_first) = static_cast (_buf(i,4)); + _mask(i+_first) = static_cast (_buf(i,5)); + _dpdTheta(i+_first) = _buf(i,6); + _uCond(i+_first) = _buf(i,7); + _uMech(i+_first) = _buf(i,8); + _uChem(i+_first) = _buf(i,9); + _uCG(i+_first) = _buf(i,10); + _uCGnew(i+_first) = _buf(i,11); +// printf("%i %i %lf %lf %lf %i BORDER\n",_tag(i+_first),i+_first,_x(i+_first,0),_x(i+_first,1),_x(i+_first,2),_type(i+_first)); + } +}; + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_border_kokkos(const int &n, const int &first, + const DAT::tdual_xfloat_2d &buf,ExecutionSpace space) { + modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK| + DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK| + UCG_MASK|UCGNEW_MASK); + while (first+n >= nmax) grow(0); + modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK| + DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK| + UCG_MASK|UCGNEW_MASK|DVECTOR_MASK); + if(space==Host) { + struct AtomVecDPDKokkos_UnpackBorder f(buf.view(), + h_x,h_tag,h_type,h_mask, + h_dpdTheta,h_uCond,h_uMech,h_uChem,h_uCG,h_uCGnew, + first); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecDPDKokkos_UnpackBorder f(buf.view(), + d_x,d_tag,d_type,d_mask, + d_dpdTheta,d_uCond,d_uMech,d_uChem,d_uCG,d_uCGnew, + first); + Kokkos::parallel_for(n,f); + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_border(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_tag(i) = (tagint) ubuf(buf[m++]).i; + h_type(i) = (int) ubuf(buf[m++]).i; + h_mask(i) = (int) ubuf(buf[m++]).i; + h_dpdTheta(i) = buf[m++]; + h_uCond(i) = buf[m++]; + h_uMech(i) = buf[m++]; + h_uChem(i) = buf[m++]; + h_uCG(i) = buf[m++]; + h_uCGnew(i) = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); + + modified(Host,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK| + DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK| + UCG_MASK|UCGNEW_MASK|DVECTOR_MASK); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::unpack_border_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_tag(i) = (tagint) ubuf(buf[m++]).i; + h_type(i) = (int) ubuf(buf[m++]).i; + h_mask(i) = (int) ubuf(buf[m++]).i; + h_v(i,0) = buf[m++]; + h_v(i,1) = buf[m++]; + h_v(i,2) = buf[m++]; + h_dpdTheta(i) = buf[m++]; + h_uCond(i) = buf[m++]; + h_uMech(i) = buf[m++]; + h_uChem(i) = buf[m++]; + h_uCG(i) = buf[m++]; + h_uCGnew(i) = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); + + modified(Host,X_MASK|V_MASK|TAG_MASK|TYPE_MASK|MASK_MASK| + DPDTHETA_MASK|UCOND_MASK|UMECH_MASK|UCHEM_MASK| + UCG_MASK|UCGNEW_MASK|DVECTOR_MASK); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::unpack_comm_hybrid(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_dpdTheta(i) = buf[m++]; + h_uCond(i) = buf[m++]; + h_uMech(i) = buf[m++]; + h_uChem(i) = buf[m++]; + } + + modified(Host,DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::unpack_border_hybrid(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_dpdTheta(i) = buf[m++]; + h_uCond(i) = buf[m++]; + h_uMech(i) = buf[m++]; + h_uChem(i) = buf[m++]; + h_uCG(i) = buf[m++]; + h_uCGnew(i) = buf[m++]; + } + + modified(Host,DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_PackExchangeFunctor { + typedef DeviceType device_type; + typedef ArrayTypes AT; + typename AT::t_x_array_randomread _x; + typename AT::t_v_array_randomread _v; + typename AT::t_tagint_1d_randomread _tag; + typename AT::t_int_1d_randomread _type; + typename AT::t_int_1d_randomread _mask; + typename AT::t_imageint_1d_randomread _image; + typename AT::t_efloat_1d_randomread _dpdTheta,_uCond,_uMech,_uChem,_uCG,_uCGnew; + typename AT::t_x_array _xw; + typename AT::t_v_array _vw; + typename AT::t_tagint_1d _tagw; + typename AT::t_int_1d _typew; + typename AT::t_int_1d _maskw; + typename AT::t_imageint_1d _imagew; + typename AT::t_efloat_1d _dpdThetaw,_uCondw,_uMechw,_uChemw,_uCGw,_uCGneww; + + typename AT::t_xfloat_2d_um _buf; + typename AT::t_int_1d_const _sendlist; + typename AT::t_int_1d_const _copylist; + int _nlocal,_dim; + X_FLOAT _lo,_hi; + + AtomVecDPDKokkos_PackExchangeFunctor( + const AtomKokkos* atom, + const typename AT::tdual_xfloat_2d buf, + typename AT::tdual_int_1d sendlist, + typename AT::tdual_int_1d copylist,int nlocal, int dim, + X_FLOAT lo, X_FLOAT hi): + _x(atom->k_x.view()), + _v(atom->k_v.view()), + _tag(atom->k_tag.view()), + _type(atom->k_type.view()), + _mask(atom->k_mask.view()), + _image(atom->k_image.view()), + _dpdTheta(atom->k_dpdTheta.view()), + _uCond(atom->k_uCond.view()), + _uMech(atom->k_uMech.view()), + _uChem(atom->k_uChem.view()), + _uCG(atom->k_uCG.view()), + _uCGnew(atom->k_uCGnew.view()), + _xw(atom->k_x.view()), + _vw(atom->k_v.view()), + _tagw(atom->k_tag.view()), + _typew(atom->k_type.view()), + _maskw(atom->k_mask.view()), + _imagew(atom->k_image.view()), + _dpdThetaw(atom->k_dpdTheta.view()), + _uCondw(atom->k_uCond.view()), + _uMechw(atom->k_uMech.view()), + _uChemw(atom->k_uChem.view()), + _uCGw(atom->k_uCG.view()), + _uCGneww(atom->k_uCGnew.view()), + _sendlist(sendlist.template view()), + _copylist(copylist.template view()), + _nlocal(nlocal),_dim(dim), + _lo(lo),_hi(hi){ + const size_t elements = 17; + const int maxsendlist = (buf.template view().dimension_0()*buf.template view().dimension_1())/elements; + + buffer_view(_buf,buf,maxsendlist,elements); + } + + KOKKOS_INLINE_FUNCTION + void operator() (const int &mysend) const { + const int i = _sendlist(mysend); + _buf(mysend,0) = 17; + _buf(mysend,1) = _x(i,0); + _buf(mysend,2) = _x(i,1); + _buf(mysend,3) = _x(i,2); + _buf(mysend,4) = _v(i,0); + _buf(mysend,5) = _v(i,1); + _buf(mysend,6) = _v(i,2); + _buf(mysend,7) = _tag[i]; + _buf(mysend,8) = _type[i]; + _buf(mysend,9) = _mask[i]; + _buf(mysend,10) = _image[i]; + _buf(mysend,11) = _dpdTheta[i]; + _buf(mysend,12) = _uCond[i]; + _buf(mysend,13) = _uMech[i]; + _buf(mysend,14) = _uChem[i]; + _buf(mysend,15) = _uCG[i]; + _buf(mysend,16) = _uCGnew[i]; + const int j = _copylist(mysend); + + if(j>-1) { + _xw(i,0) = _x(j,0); + _xw(i,1) = _x(j,1); + _xw(i,2) = _x(j,2); + _vw(i,0) = _v(j,0); + _vw(i,1) = _v(j,1); + _vw(i,2) = _v(j,2); + _tagw[i] = _tag(j); + _typew[i] = _type(j); + _maskw[i] = _mask(j); + _imagew[i] = _image(j); + _dpdThetaw[i] = _dpdTheta(j); + _uCondw[i] = _uCond(j); + _uMechw[i] = _uMech(j); + _uChemw[i] = _uChem(j); + _uCGw[i] = _uCG(j); + _uCGneww[i] = _uCGnew(j); + } + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &k_buf, DAT::tdual_int_1d k_sendlist,DAT::tdual_int_1d k_copylist,ExecutionSpace space,int dim,X_FLOAT lo,X_FLOAT hi ) +{ + if(nsend > (int) (k_buf.view().dimension_0()*k_buf.view().dimension_1())/17) { + int newsize = nsend*17/k_buf.view().dimension_1()+1; + k_buf.resize(newsize,k_buf.view().dimension_1()); + } + sync(space,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK| DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK | + DVECTOR_MASK); + if(space == Host) { + AtomVecDPDKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); + Kokkos::parallel_for(nsend,f); + } else { + AtomVecDPDKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); + Kokkos::parallel_for(nsend,f); + } + return nsend*17; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_exchange(int i, double *buf) +{ + sync(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK| DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK | + DVECTOR_MASK); + + int m = 1; + buf[m++] = h_x(i,0); + buf[m++] = h_x(i,1); + buf[m++] = h_x(i,2); + buf[m++] = h_v(i,0); + buf[m++] = h_v(i,1); + buf[m++] = h_v(i,2); + buf[m++] = ubuf(h_tag(i)).d; + buf[m++] = ubuf(h_type(i)).d; + buf[m++] = ubuf(h_mask(i)).d; + buf[m++] = ubuf(h_image(i)).d; + buf[m++] = h_dpdTheta[i]; + buf[m++] = h_uCond[i]; + buf[m++] = h_uMech[i]; + buf[m++] = h_uChem[i]; + buf[m++] = h_uCG[i]; + buf[m++] = h_uCGnew[i]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecDPDKokkos_UnpackExchangeFunctor { + typedef DeviceType device_type; + typedef ArrayTypes AT; + typename AT::t_x_array _x; + typename AT::t_v_array _v; + typename AT::t_tagint_1d _tag; + typename AT::t_int_1d _type; + typename AT::t_int_1d _mask; + typename AT::t_imageint_1d _image; + typename AT::t_efloat_1d _dpdTheta; + typename AT::t_efloat_1d _uCond; + typename AT::t_efloat_1d _uMech; + typename AT::t_efloat_1d _uChem; + typename AT::t_efloat_1d _uCG; + typename AT::t_efloat_1d _uCGnew; + + typename AT::t_xfloat_2d_um _buf; + typename AT::t_int_1d _nlocal; + int _dim; + X_FLOAT _lo,_hi; + + AtomVecDPDKokkos_UnpackExchangeFunctor( + const AtomKokkos* atom, + const typename AT::tdual_xfloat_2d buf, + typename AT::tdual_int_1d nlocal, + int dim, X_FLOAT lo, X_FLOAT hi): + _x(atom->k_x.view()), + _v(atom->k_v.view()), + _tag(atom->k_tag.view()), + _type(atom->k_type.view()), + _mask(atom->k_mask.view()), + _image(atom->k_image.view()), + _nlocal(nlocal.template view()),_dim(dim), + _lo(lo),_hi(hi){ + const size_t elements = 17; + const int maxsendlist = (buf.template view().dimension_0()*buf.template view().dimension_1())/elements; + + buffer_view(_buf,buf,maxsendlist,elements); + } + + KOKKOS_INLINE_FUNCTION + void operator() (const int &myrecv) const { + X_FLOAT x = _buf(myrecv,_dim+1); + if (x >= _lo && x < _hi) { + int i = Kokkos::atomic_fetch_add(&_nlocal(0),1); + _x(i,0) = _buf(myrecv,1); + _x(i,1) = _buf(myrecv,2); + _x(i,2) = _buf(myrecv,3); + _v(i,0) = _buf(myrecv,4); + _v(i,1) = _buf(myrecv,5); + _v(i,2) = _buf(myrecv,6); + _tag[i] = _buf(myrecv,7); + _type[i] = _buf(myrecv,8); + _mask[i] = _buf(myrecv,9); + _image[i] = _buf(myrecv,10); + _dpdTheta[i] = _buf(myrecv,11); + _uCond[i] = _buf(myrecv,12); + _uMech[i] = _buf(myrecv,13); + _uChem[i] = _buf(myrecv,14); + _uCG[i] = _buf(myrecv,15); + _uCGnew[i] = _buf(myrecv,16); + } + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int nrecv,int nlocal,int dim,X_FLOAT lo,X_FLOAT hi,ExecutionSpace space) { + if(space == Host) { + k_count.h_view(0) = nlocal; + AtomVecDPDKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); + Kokkos::parallel_for(nrecv/17,f); + } else { + k_count.h_view(0) = nlocal; + k_count.modify(); + k_count.sync(); + AtomVecDPDKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); + Kokkos::parallel_for(nrecv/17,f); + k_count.modify(); + k_count.sync(); + } + + modified(space,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK| DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK | + DVECTOR_MASK); + + return k_count.h_view(0); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::unpack_exchange(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + int m = 1; + h_x(nlocal,0) = buf[m++]; + h_x(nlocal,1) = buf[m++]; + h_x(nlocal,2) = buf[m++]; + h_v(nlocal,0) = buf[m++]; + h_v(nlocal,1) = buf[m++]; + h_v(nlocal,2) = buf[m++]; + h_tag(nlocal) = (tagint) ubuf(buf[m++]).i; + h_type(nlocal) = (int) ubuf(buf[m++]).i; + h_mask(nlocal) = (int) ubuf(buf[m++]).i; + h_image(nlocal) = (imageint) ubuf(buf[m++]).i; + h_dpdTheta[nlocal] = buf[m++]; + h_uCond[nlocal] = buf[m++]; + h_uMech[nlocal] = buf[m++]; + h_uChem[nlocal] = buf[m++]; + h_uCG[nlocal] = buf[m++]; + h_uCGnew[nlocal] = buf[m++]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]-> + unpack_exchange(nlocal,&buf[m]); + + modified(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK| DPDTHETA_MASK | UCOND_MASK | + UMECH_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK | + DVECTOR_MASK); + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + size of restart data for all atoms owned by this proc + include extra data stored by fixes +------------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::size_restart() +{ + int i; + + int nlocal = atom->nlocal; + int n = 15 * nlocal; // 11 + dpdTheta + uCond + uMech + uChem + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + for (i = 0; i < nlocal; i++) + n += modify->fix[atom->extra_restart[iextra]]->size_restart(i); + + return n; +} + +/* ---------------------------------------------------------------------- + pack atom I's data for restart file including extra quantities + xyz must be 1st 3 values, so that read_restart can test on them + molecular types may be negative, but write as positive +------------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_restart(int i, double *buf) +{ + sync(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK | DPDTHETA_MASK | + UCOND_MASK | UMECH_MASK | UCHEM_MASK | DVECTOR_MASK); + + int m = 1; + buf[m++] = h_x(i,0); + buf[m++] = h_x(i,1); + buf[m++] = h_x(i,2); + buf[m++] = ubuf(h_tag(i)).d; + buf[m++] = ubuf(h_type(i)).d; + buf[m++] = ubuf(h_mask(i)).d; + buf[m++] = ubuf(h_image(i)).d; + buf[m++] = h_v(i,0); + buf[m++] = h_v(i,1); + buf[m++] = h_v(i,2); + buf[m++] = h_dpdTheta[i]; + buf[m++] = h_uCond[i]; + buf[m++] = h_uMech[i]; + buf[m++] = h_uChem[i]; + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- + unpack data for one atom from restart file including extra quantities +------------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::unpack_restart(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) { + grow(0); + if (atom->nextra_store) + memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra"); + } + + int m = 1; + h_x(nlocal,0) = buf[m++]; + h_x(nlocal,1) = buf[m++]; + h_x(nlocal,2) = buf[m++]; + h_tag(nlocal) = (tagint) ubuf(buf[m++]).i; + h_type(nlocal) = (int) ubuf(buf[m++]).i; + h_mask(nlocal) = (int) ubuf(buf[m++]).i; + h_image(nlocal) = (imageint) ubuf(buf[m++]).i; + h_v(nlocal,0) = buf[m++]; + h_v(nlocal,1) = buf[m++]; + h_v(nlocal,2) = buf[m++]; + h_dpdTheta[nlocal] = buf[m++]; + h_uCond[nlocal] = buf[m++]; + h_uMech[nlocal] = buf[m++]; + h_uChem[nlocal] = buf[m++]; + + double **extra = atom->extra; + if (atom->nextra_store) { + int size = static_cast (buf[0]) - m; + for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++]; + } + + modified(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK | + MASK_MASK | IMAGE_MASK | DPDTHETA_MASK | + UCOND_MASK | UMECH_MASK | UCHEM_MASK | DVECTOR_MASK); + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + create one atom of itype at coord + set other values to defaults +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::create_atom(int itype, double *coord) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) { + //if(nlocal>2) printf("typeA: %i %i\n",type[0],type[1]); + atomKK->modified(Host,ALL_MASK); + grow(0); + //if(nlocal>2) printf("typeB: %i %i\n",type[0],type[1]); + } + atomKK->modified(Host,ALL_MASK); + + tag[nlocal] = 0; + type[nlocal] = itype; + h_x(nlocal,0) = coord[0]; + h_x(nlocal,1) = coord[1]; + h_x(nlocal,2) = coord[2]; + h_mask[nlocal] = 1; + h_image[nlocal] = ((tagint) IMGMAX << IMG2BITS) | + ((tagint) IMGMAX << IMGBITS) | IMGMAX; + h_v(nlocal,0) = 0.0; + h_v(nlocal,1) = 0.0; + h_v(nlocal,2) = 0.0; + h_rho[nlocal] = 0.0; + h_dpdTheta[nlocal] = 0.0; + h_uCond[nlocal] = 0.0; + h_uMech[nlocal] = 0.0; + h_uChem[nlocal] = 0.0; + h_uCG[nlocal] = 0.0; + h_uCGnew[nlocal] = 0.0; + h_duChem[nlocal] = 0.0; + + //atomKK->modified(Host,TAG_MASK|TYPE_MASK|DPDTHETA_MASK|X_MASK|IMAGE_MASK| + // MASK_MASK|V_MASK|DPDRHO_MASK|UCOND_MASK|UMECH_MASK| + // UCHEM_MASK|UCG_MASK|UCGNEW_MASK); + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack one line from Atoms section of data file + initialize other atom quantities +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::data_atom(double *coord, tagint imagetmp, + char **values) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + h_tag[nlocal] = ATOTAGINT(values[0]); + h_type[nlocal] = atoi(values[1]); + if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes) + error->one(FLERR,"Invalid atom type in Atoms section of data file"); + + h_dpdTheta[nlocal] = atof(values[2]); + if (h_dpdTheta[nlocal] <= 0) + error->one(FLERR,"Internal temperature in Atoms section of date file must be > zero"); + + h_x(nlocal,0) = coord[0]; + h_x(nlocal,1) = coord[1]; + h_x(nlocal,2) = coord[2]; + + h_image[nlocal] = imagetmp; + + h_mask[nlocal] = 1; + h_v(nlocal,0) = 0.0; + h_v(nlocal,1) = 0.0; + h_v(nlocal,2) = 0.0; + + h_rho[nlocal] = 0.0; + h_uCond[nlocal] = 0.0; + h_uMech[nlocal] = 0.0; + h_uChem[nlocal] = 0.0; + h_uCG[nlocal] = 0.0; + h_uCGnew[nlocal] = 0.0; + + atomKK->modified(Host,ALL_MASK); + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack hybrid quantities from one line in Atoms section of data file + initialize other atom quantities for this sub-style +------------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::data_atom_hybrid(int nlocal, char **values) +{ + h_dpdTheta(nlocal) = atof(values[0]); + + atomKK->modified(Host,DPDTHETA_MASK); + + return 1; +} + +/* ---------------------------------------------------------------------- + pack atom info for data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::pack_data(double **buf) +{ + atomKK->sync(Host,TAG_MASK|TYPE_MASK|DPDTHETA_MASK|X_MASK|IMAGE_MASK); + + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + buf[i][0] = ubuf(h_tag(i)).d; + buf[i][1] = ubuf(h_type(i)).d; + buf[i][2] = h_dpdTheta(i); + buf[i][3] = h_x(i,0); + buf[i][4] = h_x(i,1); + buf[i][5] = h_x(i,2); + buf[i][6] = (h_image[i] & IMGMASK) - IMGMAX; + buf[i][7] = (h_image[i] >> IMGBITS & IMGMASK) - IMGMAX; + buf[i][8] = (h_image[i] >> IMG2BITS) - IMGMAX; + } +} + +/* ---------------------------------------------------------------------- + pack hybrid atom info for data file +------------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::pack_data_hybrid(int i, double *buf) +{ + atomKK->sync(Host,DPDTHETA_MASK); + + buf[0] = h_dpdTheta(i); + return 1; +} + +/* ---------------------------------------------------------------------- + write atom info to data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::write_data(FILE *fp, int n, double **buf) +{ + for (int i = 0; i < n; i++) + fprintf(fp,TAGINT_FORMAT " %d %-1.16e %-1.16e %-1.16e %-1.16e %d %d %d\n", + (tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i, + buf[i][2],buf[i][3],buf[i][4],buf[i][5], + (int) ubuf(buf[i][6]).i,(int) ubuf(buf[i][7]).i, + (int) ubuf(buf[i][8]).i); +} + +/* ---------------------------------------------------------------------- + write hybrid atom info to data file +------------------------------------------------------------------------- */ + +int AtomVecDPDKokkos::write_data_hybrid(FILE *fp, double *buf) +{ + fprintf(fp," %-1.16e",buf[0]); + return 1; +} + +/* ---------------------------------------------------------------------- + return # of bytes of allocated memory +------------------------------------------------------------------------- */ + +bigint AtomVecDPDKokkos::memory_usage() +{ + bigint bytes = 0; + + if (atom->memcheck("tag")) bytes += memory->usage(tag,nmax); + if (atom->memcheck("type")) bytes += memory->usage(type,nmax); + if (atom->memcheck("mask")) bytes += memory->usage(mask,nmax); + if (atom->memcheck("image")) bytes += memory->usage(image,nmax); + if (atom->memcheck("x")) bytes += memory->usage(x,nmax,3); + if (atom->memcheck("v")) bytes += memory->usage(v,nmax,3); + if (atom->memcheck("f")) bytes += memory->usage(f,nmax*commKK->nthreads,3); + if (atom->memcheck("rho")) bytes += memory->usage(rho,nmax); + if (atom->memcheck("dpdTheta")) bytes += memory->usage(dpdTheta,nmax); + if (atom->memcheck("uCond")) bytes += memory->usage(uCond,nmax); + if (atom->memcheck("uMech")) bytes += memory->usage(uMech,nmax); + if (atom->memcheck("uChem")) bytes += memory->usage(uChem,nmax); + if (atom->memcheck("uCG")) bytes += memory->usage(uCG,nmax); + if (atom->memcheck("uCGnew")) bytes += memory->usage(uCGnew,nmax); + if (atom->memcheck("duChem")) bytes += memory->usage(duChem,nmax); + + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::sync(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if (mask & X_MASK) atomKK->k_x.sync(); + if (mask & V_MASK) atomKK->k_v.sync(); + if (mask & F_MASK) atomKK->k_f.sync(); + if (mask & TAG_MASK) atomKK->k_tag.sync(); + if (mask & TYPE_MASK) atomKK->k_type.sync(); + if (mask & MASK_MASK) atomKK->k_mask.sync(); + if (mask & IMAGE_MASK) atomKK->k_image.sync(); + if (mask & DPDRHO_MASK) atomKK->k_rho.sync(); + if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.sync(); + if (mask & UCOND_MASK) atomKK->k_uCond.sync(); + if (mask & UMECH_MASK) atomKK->k_uMech.sync(); + if (mask & UCHEM_MASK) atomKK->k_uChem.sync(); + if (mask & UCG_MASK) atomKK->k_uCG.sync(); + if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); + if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); + if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); + } else { + if (mask & X_MASK) atomKK->k_x.sync(); + if (mask & V_MASK) atomKK->k_v.sync(); + if (mask & F_MASK) atomKK->k_f.sync(); + if (mask & TAG_MASK) atomKK->k_tag.sync(); + if (mask & TYPE_MASK) atomKK->k_type.sync(); + if (mask & MASK_MASK) atomKK->k_mask.sync(); + if (mask & IMAGE_MASK) atomKK->k_image.sync(); + if (mask & DPDRHO_MASK) atomKK->k_rho.sync(); + if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.sync(); + if (mask & UCOND_MASK) atomKK->k_uCond.sync(); + if (mask & UMECH_MASK) atomKK->k_uMech.sync(); + if (mask & UCHEM_MASK) atomKK->k_uChem.sync(); + if (mask & UCG_MASK) atomKK->k_uCG.sync(); + if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); + if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); + if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::sync_overlapping_device(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if ((mask & X_MASK) && atomKK->k_x.need_sync()) + perform_async_copy(atomKK->k_x,space); + if ((mask & V_MASK) && atomKK->k_v.need_sync()) + perform_async_copy(atomKK->k_v,space); + if ((mask & F_MASK) && atomKK->k_f.need_sync()) + perform_async_copy(atomKK->k_f,space); + if ((mask & TAG_MASK) && atomKK->k_tag.need_sync()) + perform_async_copy(atomKK->k_tag,space); + if ((mask & TYPE_MASK) && atomKK->k_type.need_sync()) + perform_async_copy(atomKK->k_type,space); + if ((mask & MASK_MASK) && atomKK->k_mask.need_sync()) + perform_async_copy(atomKK->k_mask,space); + if ((mask & IMAGE_MASK) && atomKK->k_image.need_sync()) + perform_async_copy(atomKK->k_image,space); + if ((mask & DPDRHO_MASK) && atomKK->k_rho.need_sync()) + perform_async_copy(atomKK->k_rho,space); + if ((mask & DPDTHETA_MASK) && atomKK->k_dpdTheta.need_sync()) + perform_async_copy(atomKK->k_dpdTheta,space); + if ((mask & UCOND_MASK) && atomKK->k_uCond.need_sync()) + perform_async_copy(atomKK->k_uCond,space); + if ((mask & UMECH_MASK) && atomKK->k_uMech.need_sync()) + perform_async_copy(atomKK->k_uMech,space); + if ((mask & UCHEM_MASK) && atomKK->k_uChem.need_sync()) + perform_async_copy(atomKK->k_uChem,space); + if ((mask & UCG_MASK) && atomKK->k_uCG.need_sync()) + perform_async_copy(atomKK->k_uCG,space); + if ((mask & UCGNEW_MASK) && atomKK->k_uCGnew.need_sync()) + perform_async_copy(atomKK->k_uCGnew,space); + if ((mask & DUCHEM_MASK) && atomKK->k_duChem.need_sync()) + perform_async_copy(atomKK->k_duChem,space); + if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) + perform_async_copy(atomKK->k_dvector,space); + } else { + if ((mask & X_MASK) && atomKK->k_x.need_sync()) + perform_async_copy(atomKK->k_x,space); + if ((mask & V_MASK) && atomKK->k_v.need_sync()) + perform_async_copy(atomKK->k_v,space); + if ((mask & F_MASK) && atomKK->k_f.need_sync()) + perform_async_copy(atomKK->k_f,space); + if ((mask & TAG_MASK) && atomKK->k_tag.need_sync()) + perform_async_copy(atomKK->k_tag,space); + if ((mask & TYPE_MASK) && atomKK->k_type.need_sync()) + perform_async_copy(atomKK->k_type,space); + if ((mask & MASK_MASK) && atomKK->k_mask.need_sync()) + perform_async_copy(atomKK->k_mask,space); + if ((mask & IMAGE_MASK) && atomKK->k_image.need_sync()) + perform_async_copy(atomKK->k_image,space); + if ((mask & DPDRHO_MASK) && atomKK->k_rho.need_sync()) + perform_async_copy(atomKK->k_rho,space); + if ((mask & DPDTHETA_MASK) && atomKK->k_dpdTheta.need_sync()) + perform_async_copy(atomKK->k_dpdTheta,space); + if ((mask & UCOND_MASK) && atomKK->k_uCond.need_sync()) + perform_async_copy(atomKK->k_uCond,space); + if ((mask & UMECH_MASK) && atomKK->k_uMech.need_sync()) + perform_async_copy(atomKK->k_uMech,space); + if ((mask & UCHEM_MASK) && atomKK->k_uChem.need_sync()) + perform_async_copy(atomKK->k_uChem,space); + if ((mask & UCG_MASK) && atomKK->k_uCG.need_sync()) + perform_async_copy(atomKK->k_uCG,space); + if ((mask & UCGNEW_MASK) && atomKK->k_uCGnew.need_sync()) + perform_async_copy(atomKK->k_uCGnew,space); + if ((mask & DUCHEM_MASK) && atomKK->k_duChem.need_sync()) + perform_async_copy(atomKK->k_duChem,space); + if ((mask & DVECTOR_MASK) && atomKK->k_dvector.need_sync()) + perform_async_copy(atomKK->k_dvector,space); + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecDPDKokkos::modified(ExecutionSpace space, unsigned int mask) +{ + if (space == Device) { + if (mask & X_MASK) atomKK->k_x.modify(); + if (mask & V_MASK) atomKK->k_v.modify(); + if (mask & F_MASK) atomKK->k_f.modify(); + if (mask & TAG_MASK) atomKK->k_tag.modify(); + if (mask & TYPE_MASK) atomKK->k_type.modify(); + if (mask & MASK_MASK) atomKK->k_mask.modify(); + if (mask & IMAGE_MASK) atomKK->k_image.modify(); + if (mask & DPDRHO_MASK) atomKK->k_rho.modify(); + if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.modify(); + if (mask & UCOND_MASK) atomKK->k_uCond.modify(); + if (mask & UMECH_MASK) atomKK->k_uMech.modify(); + if (mask & UCHEM_MASK) atomKK->k_uChem.modify(); + if (mask & UCG_MASK) atomKK->k_uCG.modify(); + if (mask & UCGNEW_MASK) atomKK->k_uCGnew.modify(); + if (mask & DUCHEM_MASK) atomKK->k_duChem.modify(); + if (mask & DVECTOR_MASK) atomKK->k_dvector.modify(); + } else { + if (mask & X_MASK) atomKK->k_x.modify(); + if (mask & V_MASK) atomKK->k_v.modify(); + if (mask & F_MASK) atomKK->k_f.modify(); + if (mask & TAG_MASK) atomKK->k_tag.modify(); + if (mask & TYPE_MASK) atomKK->k_type.modify(); + if (mask & MASK_MASK) atomKK->k_mask.modify(); + if (mask & IMAGE_MASK) atomKK->k_image.modify(); + if (mask & DPDRHO_MASK) atomKK->k_rho.modify(); + if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.modify(); + if (mask & UCOND_MASK) atomKK->k_uCond.modify(); + if (mask & UMECH_MASK) atomKK->k_uMech.modify(); + if (mask & UCHEM_MASK) atomKK->k_uChem.modify(); + if (mask & UCG_MASK) atomKK->k_uCG.modify(); + if (mask & UCGNEW_MASK) atomKK->k_uCGnew.modify(); + if (mask & DUCHEM_MASK) atomKK->k_duChem.modify(); + if (mask & DVECTOR_MASK) atomKK->k_dvector.modify(); + } +} + diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.h b/src/KOKKOS/atom_vec_dpd_kokkos.h new file mode 100644 index 0000000000..cec1b82357 --- /dev/null +++ b/src/KOKKOS/atom_vec_dpd_kokkos.h @@ -0,0 +1,134 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale AtomicKokkos/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ATOM_CLASS + +AtomStyle(dpd/kk,AtomVecDPDKokkos) +AtomStyle(dpd/kk/device,AtomVecDPDKokkos) +AtomStyle(dpd/kk/host,AtomVecDPDKokkos) + +#else + +#ifndef LMP_ATOM_VEC_DPD_KOKKOS_H +#define LMP_ATOM_VEC_DPD_KOKKOS_H + +#include "atom_vec_kokkos.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +class AtomVecDPDKokkos : public AtomVecKokkos { + public: + AtomVecDPDKokkos(class LAMMPS *); + virtual ~AtomVecDPDKokkos() {} + void grow(int); + void copy(int, int, int); + int pack_comm(int, int *, double *, int, int *); + int pack_comm_vel(int, int *, double *, int, int *); + int pack_comm_hybrid(int, int *, double *); + void unpack_comm(int, int, double *); + void unpack_comm_vel(int, int, double *); + int unpack_comm_hybrid(int, int, double *); + int pack_reverse(int, int, double *); + void unpack_reverse(int, int *, double *); + int pack_border(int, int *, double *, int, int *); + int pack_border_vel(int, int *, double *, int, int *); + int pack_border_hybrid(int, int *, double *); + void unpack_border(int, int, double *); + void unpack_border_vel(int, int, double *); + int unpack_border_hybrid(int, int, double *); + int pack_exchange(int, double *); + int unpack_exchange(double *); + int size_restart(); + int pack_restart(int, double *); + int unpack_restart(double *); + void create_atom(int, double *); + void data_atom(double *, tagint, char **); + int data_atom_hybrid(int, char **); + void pack_data(double **); + int pack_data_hybrid(int, double *); + void write_data(FILE *, int, double **); + int write_data_hybrid(FILE *, double *); + bigint memory_usage(); + + void grow_reset(); + int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, + const int & iswap, + const DAT::tdual_xfloat_2d &buf, + const int &pbc_flag, const int pbc[]); + void unpack_comm_kokkos(const int &n, const int &nfirst, + const DAT::tdual_xfloat_2d &buf); + int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, + const int & iswap, const int nfirst, + const int &pbc_flag, const int pbc[]); + int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, + DAT::tdual_xfloat_2d buf,int iswap, + int pbc_flag, int *pbc, ExecutionSpace space); + void unpack_border_kokkos(const int &n, const int &nfirst, + const DAT::tdual_xfloat_2d &buf, + ExecutionSpace space); + int pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf, + DAT::tdual_int_1d k_sendlist, + DAT::tdual_int_1d k_copylist, + ExecutionSpace space, int dim, + X_FLOAT lo, X_FLOAT hi); + int unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int nrecv, + int nlocal, int dim, X_FLOAT lo, X_FLOAT hi, + ExecutionSpace space); + + void sync(ExecutionSpace space, unsigned int mask); + void modified(ExecutionSpace space, unsigned int mask); + void sync_overlapping_device(ExecutionSpace space, unsigned int mask); + double *uCond,*uMech,*uChem,*uCG,*uCGnew,*rho,*dpdTheta; + double *duChem; + + protected: + DAT::t_efloat_1d d_uCond, d_uMech, d_uChem, d_uCG, d_uCGnew,d_rho,d_dpdTheta,d_duChem; + HAT::t_efloat_1d h_uCond, h_uMech, h_uChem, h_uCG, h_uCGnew,h_rho,h_dpdTheta,h_duChem; + + tagint *tag; + imageint *image; + int *type,*mask; + double **x,**v,**f; + + DAT::t_tagint_1d d_tag; + HAT::t_tagint_1d h_tag; + DAT::t_imageint_1d d_image; + HAT::t_imageint_1d h_image; + DAT::t_int_1d d_type, d_mask; + HAT::t_int_1d h_type, h_mask; + + DAT::t_x_array d_x; + DAT::t_v_array d_v; + DAT::t_f_array d_f; + + DAT::tdual_int_1d k_count; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Per-processor system is too big + +The number of owned atoms plus ghost atoms on a single +processor must fit in 32-bit integer. + +E: Invalid atom type in Atoms section of data file + +Atom types must range from 1 to specified # of types. + +*/ diff --git a/src/KOKKOS/atom_vec_full_kokkos.cpp b/src/KOKKOS/atom_vec_full_kokkos.cpp index fa4cf18ae3..9369d7e844 100644 --- a/src/KOKKOS/atom_vec_full_kokkos.cpp +++ b/src/KOKKOS/atom_vec_full_kokkos.cpp @@ -19,7 +19,7 @@ #include "modify.h" #include "fix.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" using namespace LAMMPS_NS; @@ -67,59 +67,59 @@ void AtomVecFullKokkos::grow(int n) sync(Device,ALL_MASK); modified(Device,ALL_MASK); - memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); - memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); - memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); - memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); - memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); - memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); - memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); - memory->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); - memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); + memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q"); + memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); - memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); - memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial, + memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); + memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial, "atom:special"); - memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); - memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom, + memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); + memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom, "atom:bond_type"); - memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom, + memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom, "atom:bond_atom"); - memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle"); - memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle"); + memoryKK->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom, "atom:angle_type"); - memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom, "atom:angle_atom1"); - memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom, "atom:angle_atom2"); - memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom, "atom:angle_atom3"); - memory->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral"); - memory->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax, + memoryKK->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral"); + memoryKK->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax, atomKK->dihedral_per_atom,"atom:dihedral_type"); - memory->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom1"); - memory->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom2"); - memory->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom3"); - memory->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom4"); - memory->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper"); - memory->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax, + memoryKK->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper"); + memoryKK->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax, atomKK->improper_per_atom,"atom:improper_type"); - memory->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax, atomKK->improper_per_atom,"atom:improper_atom1"); - memory->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax, atomKK->improper_per_atom,"atom:improper_atom2"); - memory->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax, atomKK->improper_per_atom,"atom:improper_atom3"); - memory->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax, atomKK->improper_per_atom,"atom:improper_atom4"); grow_reset(); @@ -307,458 +307,6 @@ void AtomVecFullKokkos::copy(int i, int j, int delflag) /* ---------------------------------------------------------------------- */ -template -struct AtomVecFullKokkos_PackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_xfloat_2d_um _buf; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecFullKokkos_PackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - const size_t maxsend = (buf.view().dimension_0() - *buf.view().dimension_1())/3; - const size_t elements = 3; - buffer_view(_buf,buf,maxsend,elements); - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _buf(i,0) = _x(j,0); - _buf(i,1) = _x(j,1); - _buf(i,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecFullKokkos::pack_comm_kokkos(const int &n, - const DAT::tdual_int_2d &list, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, - const int* const pbc) -{ - // Check whether to always run forward communication on the host - // Choose correct forward PackComm kernel - - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackComm - f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - - return n*size_forward; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecFullKokkos_PackCommSelf { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array_randomread _x; - typename ArrayTypes::t_x_array _xw; - int _nfirst; - typename ArrayTypes::t_int_2d_const _list; - const int _iswap; - X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - X_FLOAT _pbc[6]; - - AtomVecFullKokkos_PackCommSelf( - const typename DAT::tdual_x_array &x, - const int &nfirst, - const typename DAT::tdual_int_2d &list, - const int & iswap, - const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, - const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): - _x(x.view()),_xw(x.view()),_nfirst(nfirst), - _list(list.view()),_iswap(iswap), - _xprd(xprd),_yprd(yprd),_zprd(zprd), - _xy(xy),_xz(xz),_yz(yz) { - _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; - _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; - }; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - const int j = _list(_iswap,i); - if (PBC_FLAG == 0) { - _xw(i+_nfirst,0) = _x(j,0); - _xw(i+_nfirst,1) = _x(j,1); - _xw(i+_nfirst,2) = _x(j,2); - } else { - if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; - } - } - - } -}; - -/* ---------------------------------------------------------------------- */ - -int AtomVecFullKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, - const int & iswap, - const int nfirst, const int &pbc_flag, - const int* const pbc) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPHostType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - if(pbc_flag) { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } else { - if(domain->triclinic) { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } else { - struct AtomVecFullKokkos_PackCommSelf - f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); - } - } - LMPDeviceType::fence(); - } - return n*3; -} - -/* ---------------------------------------------------------------------- */ - -template -struct AtomVecFullKokkos_UnpackComm { - typedef DeviceType device_type; - - typename ArrayTypes::t_x_array _x; - typename ArrayTypes::t_xfloat_2d_const _buf; - int _first; - - AtomVecFullKokkos_UnpackComm( - const typename DAT::tdual_x_array &x, - const typename DAT::tdual_xfloat_2d &buf, - const int& first):_x(x.view()),_buf(buf.view()), - _first(first) {}; - - KOKKOS_INLINE_FUNCTION - void operator() (const int& i) const { - _x(i+_first,0) = _buf(i,0); - _x(i+_first,1) = _buf(i,1); - _x(i+_first,2) = _buf(i,2); - } -}; - -/* ---------------------------------------------------------------------- */ - -void AtomVecFullKokkos::unpack_comm_kokkos(const int &n, const int &first, - const DAT::tdual_xfloat_2d &buf ) { - if(commKK->forward_comm_on_host) { - sync(Host,X_MASK); - modified(Host,X_MASK); - struct AtomVecFullKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } else { - sync(Device,X_MASK); - modified(Device,X_MASK); - struct AtomVecFullKokkos_UnpackComm f(atomKK->k_x,buf,first); - Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecFullKokkos::pack_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecFullKokkos::pack_comm_vel(int n, int *list, double *buf, - int pbc_flag, int *pbc) -{ - int i,j,m; - double dx,dy,dz,dvx,dvy,dvz; - - m = 0; - if (pbc_flag == 0) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0); - buf[m++] = h_x(j,1); - buf[m++] = h_x(j,2); - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - if (domain->triclinic == 0) { - dx = pbc[0]*domain->xprd; - dy = pbc[1]*domain->yprd; - dz = pbc[2]*domain->zprd; - } else { - dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; - dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; - dz = pbc[2]*domain->zprd; - } - if (!deform_vremap) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } else { - dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; - dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; - dvz = pbc[2]*h_rate[2]; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = h_x(j,0) + dx; - buf[m++] = h_x(j,1) + dy; - buf[m++] = h_x(j,2) + dz; - if (mask[i] & deform_groupbit) { - buf[m++] = h_v(j,0) + dvx; - buf[m++] = h_v(j,1) + dvy; - buf[m++] = h_v(j,2) + dvz; - } else { - buf[m++] = h_v(j,0); - buf[m++] = h_v(j,1); - buf[m++] = h_v(j,2); - } - } - } - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecFullKokkos::unpack_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecFullKokkos::unpack_comm_vel(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) { - h_x(i,0) = buf[m++]; - h_x(i,1) = buf[m++]; - h_x(i,2) = buf[m++]; - h_v(i,0) = buf[m++]; - h_v(i,1) = buf[m++]; - h_v(i,2) = buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - -int AtomVecFullKokkos::pack_reverse(int n, int first, double *buf) -{ - if(n > 0) - sync(Host,F_MASK); - - int m = 0; - const int last = first + n; - for (int i = first; i < last; i++) { - buf[m++] = h_f(i,0); - buf[m++] = h_f(i,1); - buf[m++] = h_f(i,2); - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void AtomVecFullKokkos::unpack_reverse(int n, int *list, double *buf) -{ - if(n > 0) - modified(Host,F_MASK); - - int m = 0; - for (int i = 0; i < n; i++) { - const int j = list[i]; - h_f(j,0) += buf[m++]; - h_f(j,1) += buf[m++]; - h_f(j,2) += buf[m++]; - } -} - -/* ---------------------------------------------------------------------- */ - template struct AtomVecFullKokkos_PackBorder { typedef DeviceType device_type; @@ -838,13 +386,11 @@ int AtomVecFullKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_q,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecFullKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_q,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } else { @@ -854,13 +400,11 @@ int AtomVecFullKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_q,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecFullKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_q,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } return n*size_border; @@ -1071,12 +615,10 @@ void AtomVecFullKokkos::unpack_border_kokkos(const int &n, const int &first, struct AtomVecFullKokkos_UnpackBorder f(buf.view(),h_x,h_tag,h_type,h_mask,h_q,h_molecule,first); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { struct AtomVecFullKokkos_UnpackBorder f(buf.view(),d_x,d_tag,d_type,d_mask,d_q,d_molecule,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -1422,13 +964,11 @@ int AtomVecFullKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2 AtomVecFullKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPHostType::fence(); return nsend*elements; } else { AtomVecFullKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPDeviceType::fence(); return nsend*elements; } } @@ -1643,7 +1183,6 @@ int AtomVecFullKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int nr AtomVecFullKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPHostType::fence(); return k_count.h_view(0); } else { k_count.h_view(0) = nlocal; @@ -1652,7 +1191,6 @@ int AtomVecFullKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int nr AtomVecFullKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPDeviceType::fence(); k_count.modify(); k_count.sync(); diff --git a/src/KOKKOS/atom_vec_full_kokkos.h b/src/KOKKOS/atom_vec_full_kokkos.h index 841707b338..33760a8b5f 100644 --- a/src/KOKKOS/atom_vec_full_kokkos.h +++ b/src/KOKKOS/atom_vec_full_kokkos.h @@ -14,6 +14,8 @@ #ifdef ATOM_CLASS AtomStyle(full/kk,AtomVecFullKokkos) +AtomStyle(full/kk/device,AtomVecFullKokkos) +AtomStyle(full/kk/host,AtomVecFullKokkos) #else @@ -30,12 +32,6 @@ class AtomVecFullKokkos : public AtomVecKokkos { virtual ~AtomVecFullKokkos() {} void grow(int); void copy(int, int, int); - int pack_comm(int, int *, double *, int, int *); - int pack_comm_vel(int, int *, double *, int, int *); - void unpack_comm(int, int, double *); - void unpack_comm_vel(int, int, double *); - int pack_reverse(int, int, double *); - void unpack_reverse(int, int *, double *); int pack_border(int, int *, double *, int, int *); int pack_border_vel(int, int *, double *, int, int *); int pack_border_hybrid(int, int *, double *); @@ -57,15 +53,6 @@ class AtomVecFullKokkos : public AtomVecKokkos { bigint memory_usage(); void grow_reset(); - int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, - const int & iswap, - const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, const int pbc[]); - void unpack_comm_kokkos(const int &n, const int &nfirst, - const DAT::tdual_xfloat_2d &buf); - int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, - const int & iswap, const int nfirst, - const int &pbc_flag, const int pbc[]); int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, int pbc_flag, int *pbc, ExecutionSpace space); @@ -123,9 +110,6 @@ class AtomVecFullKokkos : public AtomVecKokkos { DAT::t_x_array d_x; DAT::t_v_array d_v; DAT::t_f_array d_f; - HAT::t_x_array h_x; - HAT::t_v_array h_v; - HAT::t_f_array h_f; DAT::t_float_1d d_q; HAT::t_float_1d h_q; diff --git a/src/KOKKOS/atom_vec_hybrid_kokkos.cpp b/src/KOKKOS/atom_vec_hybrid_kokkos.cpp new file mode 100644 index 0000000000..67dce07b80 --- /dev/null +++ b/src/KOKKOS/atom_vec_hybrid_kokkos.cpp @@ -0,0 +1,1223 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "atom_vec_hybrid_kokkos.h" +#include "atom_kokkos.h" +#include "domain.h" +#include "modify.h" +#include "fix.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +AtomVecHybridKokkos::AtomVecHybridKokkos(LAMMPS *lmp) : AtomVecKokkos(lmp) {} + +/* ---------------------------------------------------------------------- */ + +AtomVecHybridKokkos::~AtomVecHybridKokkos() +{ + for (int k = 0; k < nstyles; k++) delete styles[k]; + delete [] styles; + for (int k = 0; k < nstyles; k++) delete [] keywords[k]; + delete [] keywords; +} + +/* ---------------------------------------------------------------------- + process sub-style args +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::process_args(int narg, char **arg) +{ + // build list of all known atom styles + + build_styles(); + + // allocate list of sub-styles as big as possibly needed if no extra args + + styles = new AtomVec*[narg]; + keywords = new char*[narg]; + + // allocate each sub-style + // call process_args() with set of args that are not atom style names + // use known_style() to determine which args these are + + int i,jarg,dummy; + + int iarg = 0; + nstyles = 0; + while (iarg < narg) { + if (strcmp(arg[iarg],"hybrid") == 0) + error->all(FLERR,"Atom style hybrid cannot have hybrid as an argument"); + for (i = 0; i < nstyles; i++) + if (strcmp(arg[iarg],keywords[i]) == 0) + error->all(FLERR,"Atom style hybrid cannot use same atom style twice"); + styles[nstyles] = atom->new_avec(arg[iarg],1,dummy); + keywords[nstyles] = new char[strlen(arg[iarg])+1]; + strcpy(keywords[nstyles],arg[iarg]); + jarg = iarg + 1; + while (jarg < narg && !known_style(arg[jarg])) jarg++; + styles[nstyles]->process_args(jarg-iarg-1,&arg[iarg+1]); + iarg = jarg; + nstyles++; + } + + // free allstyles created by build_styles() + + for (int i = 0; i < nallstyles; i++) delete [] allstyles[i]; + delete [] allstyles; + + // hybrid settings are MAX or MIN of sub-style settings + // hybrid sizes are minimal values plus extra values for each sub-style + + molecular = 0; + comm_x_only = comm_f_only = 1; + + size_forward = 3; + size_reverse = 3; + size_border = 6; + size_data_atom = 5; + size_data_vel = 4; + xcol_data = 3; + + for (int k = 0; k < nstyles; k++) { + if ((styles[k]->molecular == 1 && molecular == 2) || + (styles[k]->molecular == 2 && molecular == 1)) + error->all(FLERR,"Cannot mix molecular and molecule template " + "atom styles"); + molecular = MAX(molecular,styles[k]->molecular); + + bonds_allow = MAX(bonds_allow,styles[k]->bonds_allow); + angles_allow = MAX(angles_allow,styles[k]->angles_allow); + dihedrals_allow = MAX(dihedrals_allow,styles[k]->dihedrals_allow); + impropers_allow = MAX(impropers_allow,styles[k]->impropers_allow); + mass_type = MAX(mass_type,styles[k]->mass_type); + dipole_type = MAX(dipole_type,styles[k]->dipole_type); + forceclearflag = MAX(forceclearflag,styles[k]->forceclearflag); + + if (styles[k]->molecular == 2) onemols = styles[k]->onemols; + + comm_x_only = MIN(comm_x_only,styles[k]->comm_x_only); + comm_f_only = MIN(comm_f_only,styles[k]->comm_f_only); + size_forward += styles[k]->size_forward - 3; + size_reverse += styles[k]->size_reverse - 3; + size_border += styles[k]->size_border - 6; + size_data_atom += styles[k]->size_data_atom - 5; + size_data_vel += styles[k]->size_data_vel - 4; + } + + size_velocity = 3; + if (atom->omega_flag) size_velocity += 3; + if (atom->angmom_flag) size_velocity += 3; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::init() +{ + AtomVec::init(); + for (int k = 0; k < nstyles; k++) styles[k]->init(); +} + +/* ---------------------------------------------------------------------- + grow atom arrays + n = 0 grows arrays by a chunk + n > 0 allocates arrays to size n +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::grow(int n) +{ + if (n == 0) grow_nmax(); + else nmax = n; + atom->nmax = nmax; + if (nmax < 0 || nmax > MAXSMALLINT) + error->one(FLERR,"Per-processor system is too big"); + + // sub-styles perform all reallocation + // turn off nextra_grow so hybrid can do that once below + + int tmp = atom->nextra_grow; + atom->nextra_grow = 0; + for (int k = 0; k < nstyles; k++) styles[k]->grow(nmax); + atom->nextra_grow = tmp; + + // insure hybrid local ptrs and sub-style ptrs are up to date + // for sub-styles, do this in case + // multiple sub-style reallocs of same array occurred + + grow_reset(); + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax); +} + +/* ---------------------------------------------------------------------- + reset local array ptrs +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::grow_reset() +{ + tag = atomKK->tag; + d_tag = atomKK->k_tag.d_view; + h_tag = atomKK->k_tag.h_view; + + type = atomKK->type; + d_type = atomKK->k_type.d_view; + h_type = atomKK->k_type.h_view; + + mask = atomKK->mask; + d_mask = atomKK->k_mask.d_view; + h_mask = atomKK->k_mask.h_view; + + image = atomKK->image; + d_image = atomKK->k_image.d_view; + h_image = atomKK->k_image.h_view; + + x = atomKK->x; + d_x = atomKK->k_x.d_view; + h_x = atomKK->k_x.h_view; + + v = atomKK->v; + d_v = atomKK->k_v.d_view; + h_v = atomKK->k_v.h_view; + + f = atomKK->f; + d_f = atomKK->k_f.d_view; + h_f = atomKK->k_f.h_view; + + v = atomKK->v; + d_v = atomKK->k_v.d_view; + h_v = atomKK->k_v.h_view; + + omega = atomKK->omega; + d_omega = atomKK->k_omega.d_view; + h_omega = atomKK->k_omega.h_view; + + angmom = atomKK->angmom; + d_angmom = atomKK->k_angmom.d_view; + h_angmom = atomKK->k_angmom.h_view; + + for (int k = 0; k < nstyles; k++) styles[k]->grow_reset(); +} + +/* ---------------------------------------------------------------------- + copy atom I info to atom J for all sub-styles +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::copy(int i, int j, int delflag) +{ + int tmp = atom->nextra_grow; + atom->nextra_grow = 0; + for (int k = 0; k < nstyles; k++) styles[k]->copy(i,j,delflag); + atom->nextra_grow = tmp; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::clear_bonus() +{ + for (int k = 0; k < nstyles; k++) styles[k]->clear_bonus(); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::force_clear(int n, size_t nbytes) +{ + for (int k = 0; k < nstyles; k++) + if (styles[k]->forceclearflag) styles[k]->force_clear(n,nbytes); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, + const int & iswap, + const DAT::tdual_xfloat_2d &buf, + const int &pbc_flag, const int pbc[]) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); + return 0; +} +void AtomVecHybridKokkos::unpack_comm_kokkos(const int &n, const int &nfirst, + const DAT::tdual_xfloat_2d &buf) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); +} +int AtomVecHybridKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, + const int & iswap, const int nfirst, + const int &pbc_flag, const int pbc[]) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); + return 0; +} +int AtomVecHybridKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, + DAT::tdual_xfloat_2d buf,int iswap, + int pbc_flag, int *pbc, ExecutionSpace space) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); + return 0; +} +void AtomVecHybridKokkos::unpack_border_kokkos(const int &n, const int &nfirst, + const DAT::tdual_xfloat_2d &buf, + ExecutionSpace space) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); +} +int AtomVecHybridKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf, + DAT::tdual_int_1d k_sendlist, + DAT::tdual_int_1d k_copylist, + ExecutionSpace space, int dim, + X_FLOAT lo, X_FLOAT hi) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); + return 0; +} +int AtomVecHybridKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int nrecv, + int nlocal, int dim, X_FLOAT lo, X_FLOAT hi, + ExecutionSpace space) +{ + error->all(FLERR,"AtomVecHybridKokkos doesn't yet support threaded comm"); + return 0; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + sync(Host,X_MASK); + + int i,j,k,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + } + } + + // pack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_comm_hybrid(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_comm_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + sync(Host,X_MASK|V_MASK|OMEGA_MASK/*|ANGMOM_MASK*/); + + int i,j,k,m; + double dx,dy,dz,dvx,dvy,dvz; + int omega_flag = atom->omega_flag; + int angmom_flag = atom->angmom_flag; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + if (omega_flag) { + buf[m++] = h_omega(j,0); + buf[m++] = h_omega(j,1); + buf[m++] = h_omega(j,2); + } + if (angmom_flag) { + buf[m++] = h_angmom(j,0); + buf[m++] = h_angmom(j,1); + buf[m++] = h_angmom(j,2); + } + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + if (omega_flag) { + buf[m++] = h_omega(j,0); + buf[m++] = h_omega(j,1); + buf[m++] = h_omega(j,2); + } + if (angmom_flag) { + buf[m++] = h_angmom(j,0); + buf[m++] = h_angmom(j,1); + buf[m++] = h_angmom(j,2); + } + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + if (h_mask[i] & deform_groupbit) { + buf[m++] = h_v(j,0) + dvx; + buf[m++] = h_v(j,1) + dvy; + buf[m++] = h_v(j,2) + dvz; + } else { + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + if (omega_flag) { + buf[m++] = h_omega(j,0); + buf[m++] = h_omega(j,1); + buf[m++] = h_omega(j,2); + } + if (angmom_flag) { + buf[m++] = h_angmom(j,0); + buf[m++] = h_angmom(j,1); + buf[m++] = h_angmom(j,2); + } + } + } + } + + // pack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_comm_hybrid(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::unpack_comm(int n, int first, double *buf) +{ + int i,k,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + } + + modified(Host,X_MASK); + + // unpack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->unpack_comm_hybrid(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::unpack_comm_vel(int n, int first, double *buf) +{ + int i,k,m,last; + int omega_flag = atom->omega_flag; + int angmom_flag = atom->angmom_flag; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_v(i,0) = buf[m++]; + h_v(i,1) = buf[m++]; + h_v(i,2) = buf[m++]; + if (omega_flag) { + h_omega(i,0) = buf[m++]; + h_omega(i,1) = buf[m++]; + h_omega(i,2) = buf[m++]; + } + if (angmom_flag) { + h_angmom(i,0) = buf[m++]; + h_angmom(i,1) = buf[m++]; + h_angmom(i,2) = buf[m++]; + } + } + + modified(Host,X_MASK|V_MASK|OMEGA_MASK/*|ANGMOM_MASK*/); + + // unpack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->unpack_comm_hybrid(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_reverse(int n, int first, double *buf) +{ + sync(Host,F_MASK); + + int i,k,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = h_f(i,0); + buf[m++] = h_f(i,1); + buf[m++] = h_f(i,2); + } + + // pack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_reverse_hybrid(n,first,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::unpack_reverse(int n, int *list, double *buf) +{ + int i,j,k,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + h_f(j,0) += buf[m++]; + h_f(j,1) += buf[m++]; + h_f(j,2) += buf[m++]; + } + + modified(Host,F_MASK); + + // unpack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->unpack_reverse_hybrid(n,list,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_border(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + sync(Host,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK); + + int i,j,k,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = ubuf(h_tag[j]).d; + buf[m++] = ubuf(h_type[j]).d; + buf[m++] = ubuf(h_mask[j]).d; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = ubuf(h_tag[j]).d; + buf[m++] = ubuf(h_type[j]).d; + buf[m++] = ubuf(h_mask[j]).d; + } + } + + // pack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_border_hybrid(n,list,&buf[m]); + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_border_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + sync(Host,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|V_MASK|OMEGA_MASK/*|ANGMOM_MASK*/); + int i,j,k,m; + double dx,dy,dz,dvx,dvy,dvz; + int omega_flag = atom->omega_flag; + int angmom_flag = atom->angmom_flag; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = ubuf(h_tag[j]).d; + buf[m++] = ubuf(h_type[j]).d; + buf[m++] = ubuf(h_mask[j]).d; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + if (omega_flag) { + buf[m++] = h_omega(j,0); + buf[m++] = h_omega(j,1); + buf[m++] = h_omega(j,2); + } + if (angmom_flag) { + buf[m++] = h_angmom(j,0); + buf[m++] = h_angmom(j,1); + buf[m++] = h_angmom(j,2); + } + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = ubuf(h_tag[j]).d; + buf[m++] = ubuf(h_type[j]).d; + buf[m++] = ubuf(h_mask[j]).d; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + if (omega_flag) { + buf[m++] = h_omega(j,0); + buf[m++] = h_omega(j,1); + buf[m++] = h_omega(j,2); + } + if (angmom_flag) { + buf[m++] = h_angmom(j,0); + buf[m++] = h_angmom(j,1); + buf[m++] = h_angmom(j,2); + } + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = ubuf(h_tag[j]).d; + buf[m++] = ubuf(h_type[j]).d; + buf[m++] = ubuf(h_mask[j]).d; + if (h_mask[i] & deform_groupbit) { + buf[m++] = h_v(j,0) + dvx; + buf[m++] = h_v(j,1) + dvy; + buf[m++] = h_v(j,2) + dvz; + } else { + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + if (omega_flag) { + buf[m++] = h_omega(j,0); + buf[m++] = h_omega(j,1); + buf[m++] = h_omega(j,2); + } + if (angmom_flag) { + buf[m++] = h_angmom(j,0); + buf[m++] = h_angmom(j,1); + buf[m++] = h_angmom(j,2); + } + } + } + } + + // pack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_border_hybrid(n,list,&buf[m]); + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::unpack_border(int n, int first, double *buf) +{ + int i,k,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_tag[i] = (tagint) ubuf(buf[m++]).i; + h_type[i] = (int) ubuf(buf[m++]).i; + h_mask[i] = (int) ubuf(buf[m++]).i; + } + + modified(Host,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK); + + // unpack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->unpack_border_hybrid(n,first,&buf[m]); + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::unpack_border_vel(int n, int first, double *buf) +{ + int i,k,m,last; + int omega_flag = atom->omega_flag; + int angmom_flag = atom->angmom_flag; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_tag[i] = (tagint) ubuf(buf[m++]).i; + h_type[i] = (int) ubuf(buf[m++]).i; + h_mask[i] = (int) ubuf(buf[m++]).i; + h_v(i,0) = buf[m++]; + h_v(i,1) = buf[m++]; + h_v(i,2) = buf[m++]; + if (omega_flag) { + h_omega(i,0) = buf[m++]; + h_omega(i,1) = buf[m++]; + h_omega(i,2) = buf[m++]; + } + if (angmom_flag) { + h_angmom(i,0) = buf[m++]; + h_angmom(i,1) = buf[m++]; + h_angmom(i,2) = buf[m++]; + } + } + + modified(Host,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|V_MASK|OMEGA_MASK/*|ANGMOM_MASK*/); + + // unpack sub-style contributions as contiguous chunks + + for (k = 0; k < nstyles; k++) + m += styles[k]->unpack_border_hybrid(n,first,&buf[m]); + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- + pack data for atom I for sending to another proc + pack each sub-style one after the other +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_exchange(int i, double *buf) +{ + int k,m; + + int tmp = atom->nextra_grow; + atom->nextra_grow = 0; + + m = 0; + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_exchange(i,&buf[m]); + + atom->nextra_grow = tmp; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- + unpack data for single atom received from another proc + unpack each sub-style one after the other + grow() occurs here so arrays for all sub-styles are grown +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::unpack_exchange(double *buf) +{ + int k,m; + + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + int tmp = atom->nextra_grow; + atom->nextra_grow = 0; + + m = 0; + for (k = 0; k < nstyles; k++) { + m += styles[k]->unpack_exchange(&buf[m]); + atom->nlocal--; + } + + atom->nextra_grow = tmp; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]-> + unpack_exchange(nlocal,&buf[m]); + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + size of restart data for all atoms owned by this proc + include extra data stored by fixes +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::size_restart() +{ + int tmp = atom->nextra_restart; + atom->nextra_restart = 0; + + int n = 0; + for (int k = 0; k < nstyles; k++) + n += styles[k]->size_restart(); + + atom->nextra_restart = tmp; + + int nlocal = atom->nlocal; + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + for (int i = 0; i < nlocal; i++) + n += modify->fix[atom->extra_restart[iextra]]->size_restart(i); + + return n; +} + +/* ---------------------------------------------------------------------- + pack atom I's data for restart file including extra quantities + xyz must be 1st 3 values, so that read_restart can test on them + pack each sub-style one after the other +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::pack_restart(int i, double *buf) +{ + int tmp = atom->nextra_restart; + atom->nextra_restart = 0; + + int m = 0; + for (int k = 0; k < nstyles; k++) + m += styles[k]->pack_restart(i,&buf[m]); + + atom->nextra_restart = tmp; + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- + unpack data for one atom from restart file including extra quantities + unpack each sub-style one after the other + grow() occurs here so arrays for all sub-styles are grown +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::unpack_restart(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) { + grow(0); + if (atom->nextra_store) + memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra"); + } + + int tmp = atom->nextra_store; + atom->nextra_store = 0; + + int m = 0; + for (int k = 0; k < nstyles; k++) { + m += styles[k]->unpack_restart(&buf[m]); + atom->nlocal--; + } + atom->nextra_store = tmp; + + double **extra = atom->extra; + if (atom->nextra_store) { + int size = static_cast (buf[0]) - m; + for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++]; + } + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + create one atom of itype at coord + create each sub-style one after the other + grow() occurs here so arrays for all sub-styles are grown +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::create_atom(int itype, double *coord) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + for (int k = 0; k < nstyles; k++) { + styles[k]->create_atom(itype,coord); + atom->nlocal--; + } + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack one line from Atoms section of data file + grow() occurs here so arrays for all sub-styles are grown +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::data_atom(double *coord, imageint imagetmp, char **values) +{ + sync(Host,X_MASK|TAG_MASK|TYPE_MASK|IMAGE_MASK|MASK_MASK|V_MASK|OMEGA_MASK/*|ANGMOM_MASK*/); + + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + h_tag[nlocal] = ATOTAGINT(values[0]); + h_type[nlocal] = atoi(values[1]); + if (h_type[nlocal] <= 0 || h_type[nlocal] > atom->ntypes) + error->one(FLERR,"Invalid atom h_type in Atoms section of data file"); + + h_x(nlocal,0) = coord[0]; + h_x(nlocal,1) = coord[1]; + h_x(nlocal,2) = coord[2]; + + h_image[nlocal] = imagetmp; + h_mask[nlocal] = 1; + + h_v(nlocal,0) = 0.0; + h_v(nlocal,1) = 0.0; + h_v(nlocal,2) = 0.0; + if (atom->omega_flag) { + h_omega(nlocal,0) = 0.0; + h_omega(nlocal,1) = 0.0; + h_omega(nlocal,2) = 0.0; + } + if (atom->angmom_flag) { + h_angmom(nlocal,0) = 0.0; + h_angmom(nlocal,1) = 0.0; + h_angmom(nlocal,2) = 0.0; + } + + modified(Host,X_MASK|TAG_MASK|TYPE_MASK|IMAGE_MASK|MASK_MASK|V_MASK|OMEGA_MASK/*|ANGMOM_MASK*/); + + // each sub-style parses sub-style specific values + + int m = 5; + for (int k = 0; k < nstyles; k++) + m += styles[k]->data_atom_hybrid(nlocal,&values[m]); + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack one line from Velocities section of data file +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::data_vel(int m, char **values) +{ + sync(Host,V_MASK); + + h_v(m,0) = atof(values[0]); + h_v(m,1) = atof(values[1]); + h_v(m,2) = atof(values[2]); + + modified(Host,V_MASK); + + // each sub-style parses sub-style specific values + + int n = 3; + for (int k = 0; k < nstyles; k++) + n += styles[k]->data_vel_hybrid(m,&values[n]); +} + +/* ---------------------------------------------------------------------- + pack atom info for data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::pack_data(double **buf) +{ + sync(Host,TAG_MASK|TYPE_MASK|X_MASK); + + int k,m; + + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + buf[i][0] = ubuf(h_tag[i]).d; + buf[i][1] = ubuf(h_type[i]).d; + buf[i][2] = h_x(i,0); + buf[i][3] = h_x(i,1); + buf[i][4] = h_x(i,2); + + m = 5; + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_data_hybrid(i,&buf[i][m]); + + buf[i][m] = ubuf((h_image[i] & IMGMASK) - IMGMAX).d; + buf[i][m+1] = ubuf((h_image[i] >> IMGBITS & IMGMASK) - IMGMAX).d; + buf[i][m+2] = ubuf((h_image[i] >> IMG2BITS) - IMGMAX).d; + } +} + +/* ---------------------------------------------------------------------- + write atom info to data file including 3 h_image flags +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::write_data(FILE *fp, int n, double **buf) +{ + int k,m; + + for (int i = 0; i < n; i++) { + fprintf(fp,TAGINT_FORMAT " %d %-1.16e %-1.16e %-1.16e", + (tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i, + buf[i][2],buf[i][3],buf[i][4]); + + m = 5; + for (k = 0; k < nstyles; k++) + m += styles[k]->write_data_hybrid(fp,&buf[i][m]); + + fprintf(fp," %d %d %d\n", + (int) ubuf(buf[i][m]).i,(int) ubuf(buf[i][m+1]).i, + (int) ubuf(buf[i][m+2]).i); + } +} + +/* ---------------------------------------------------------------------- + pack velocity info for data file +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::pack_vel(double **buf) +{ + sync(Host,V_MASK); + + int k,m; + + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + buf[i][0] = ubuf(h_tag[i]).d; + buf[i][1] = h_v(i,0); + buf[i][2] = h_v(i,1); + buf[i][3] = h_v(i,2); + + m = 4; + for (k = 0; k < nstyles; k++) + m += styles[k]->pack_vel_hybrid(i,&buf[i][m]); + } +} + +/* ---------------------------------------------------------------------- + write velocity info to data file +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::write_vel(FILE *fp, int n, double **buf) +{ + int k,m; + + for (int i = 0; i < n; i++) { + fprintf(fp,TAGINT_FORMAT " %g %g %g", + (tagint) ubuf(buf[i][0]).i,buf[i][1],buf[i][2],buf[i][3]); + + m = 4; + for (k = 0; k < nstyles; k++) + m += styles[k]->write_vel_hybrid(fp,&buf[i][m]); + + fprintf(fp,"\n"); + } +} + +/* ---------------------------------------------------------------------- + assign an index to named atom property and return index + returned value encodes which sub-style and index returned by sub-style + return -1 if name is unknown to any sub-styles +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::property_atom(char *name) +{ + for (int k = 0; k < nstyles; k++) { + int index = styles[k]->property_atom(name); + if (index >= 0) return index*nstyles + k; + } + return -1; +} + +/* ---------------------------------------------------------------------- + pack per-atom data into buf for ComputePropertyAtom + index maps to data specific to this atom style +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::pack_property_atom(int multiindex, double *buf, + int nvalues, int groupbit) +{ + int k = multiindex % nstyles; + int index = multiindex/nstyles; + styles[k]->pack_property_atom(index,buf,nvalues,groupbit); +} + +/* ---------------------------------------------------------------------- + allstyles = list of all atom styles in this LAMMPS executable +------------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::build_styles() +{ + nallstyles = 0; +#define ATOM_CLASS +#define AtomStyle(key,Class) nallstyles++; +#include "style_atom.h" +#undef AtomStyle +#undef ATOM_CLASS + + allstyles = new char*[nallstyles]; + + int n; + nallstyles = 0; +#define ATOM_CLASS +#define AtomStyle(key,Class) \ + n = strlen(#key) + 1; \ + allstyles[nallstyles] = new char[n]; \ + strcpy(allstyles[nallstyles],#key); \ + nallstyles++; +#include "style_atom.h" +#undef AtomStyle +#undef ATOM_CLASS +} + +/* ---------------------------------------------------------------------- + allstyles = list of all known atom styles +------------------------------------------------------------------------- */ + +int AtomVecHybridKokkos::known_style(char *str) +{ + for (int i = 0; i < nallstyles; i++) + if (strcmp(str,allstyles[i]) == 0) return 1; + return 0; +} + +/* ---------------------------------------------------------------------- + return # of bytes of allocated memory +------------------------------------------------------------------------- */ + +bigint AtomVecHybridKokkos::memory_usage() +{ + bigint bytes = 0; + for (int k = 0; k < nstyles; k++) bytes += styles[k]->memory_usage(); + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::sync(ExecutionSpace space, unsigned int h_mask) +{ + for (int k = 0; k < nstyles; k++) ((AtomVecKokkos*) styles[k])->sync(space,h_mask); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::sync_overlapping_device(ExecutionSpace space, unsigned int h_mask) +{ + for (int k = 0; k < nstyles; k++) ((AtomVecKokkos*) styles[k])->sync_overlapping_device(space,h_mask); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecHybridKokkos::modified(ExecutionSpace space, unsigned int h_mask) +{ + for (int k = 0; k < nstyles; k++) ((AtomVecKokkos*) styles[k])->modified(space,h_mask); +} diff --git a/src/KOKKOS/atom_vec_hybrid_kokkos.h b/src/KOKKOS/atom_vec_hybrid_kokkos.h new file mode 100644 index 0000000000..fcf48f6c74 --- /dev/null +++ b/src/KOKKOS/atom_vec_hybrid_kokkos.h @@ -0,0 +1,161 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ATOM_CLASS + +AtomStyle(hybrid/kk,AtomVecHybridKokkos) + +#else + +#ifndef LMP_ATOM_VEC_HYBRID_KOKKOS_H +#define LMP_ATOM_VEC_HYBRID_KOKKOS_H + +#include +#include "atom_vec_kokkos.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +class AtomVecHybridKokkos : public AtomVecKokkos { + public: + int nstyles; + class AtomVec **styles; + char **keywords; + + AtomVecHybridKokkos(class LAMMPS *); + ~AtomVecHybridKokkos(); + void process_args(int, char **); + void init(); + void grow(int); + void grow_reset(); + void copy(int, int, int); + void clear_bonus(); + void force_clear(int, size_t); + int pack_comm(int, int *, double *, int, int *); + int pack_comm_vel(int, int *, double *, int, int *); + void unpack_comm(int, int, double *); + void unpack_comm_vel(int, int, double *); + int pack_reverse(int, int, double *); + void unpack_reverse(int, int *, double *); + int pack_border(int, int *, double *, int, int *); + int pack_border_vel(int, int *, double *, int, int *); + void unpack_border(int, int, double *); + void unpack_border_vel(int, int, double *); + int pack_exchange(int, double *); + int unpack_exchange(double *); + int size_restart(); + int pack_restart(int, double *); + int unpack_restart(double *); + void create_atom(int, double *); + void data_atom(double *, imageint, char **); + int data_atom_hybrid(int, char **) {return 0;} + void data_vel(int, char **); + void pack_data(double **); + void write_data(FILE *, int, double **); + void pack_vel(double **); + void write_vel(FILE *, int, double **); + int property_atom(char *); + void pack_property_atom(int, double *, int, int); + bigint memory_usage(); + + int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &k_sendlist, + const int & iswap, + const DAT::tdual_xfloat_2d &buf, + const int &pbc_flag, const int pbc[]); + void unpack_comm_kokkos(const int &n, const int &nfirst, + const DAT::tdual_xfloat_2d &buf); + int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, + const int & iswap, const int nfirst, + const int &pbc_flag, const int pbc[]); + int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, + DAT::tdual_xfloat_2d buf,int iswap, + int pbc_flag, int *pbc, ExecutionSpace space); + void unpack_border_kokkos(const int &n, const int &nfirst, + const DAT::tdual_xfloat_2d &buf, + ExecutionSpace space); + int pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf, + DAT::tdual_int_1d k_sendlist, + DAT::tdual_int_1d k_copylist, + ExecutionSpace space, int dim, + X_FLOAT lo, X_FLOAT hi); + int unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int nrecv, + int nlocal, int dim, X_FLOAT lo, X_FLOAT hi, + ExecutionSpace space); + + void sync(ExecutionSpace space, unsigned int mask); + void modified(ExecutionSpace space, unsigned int mask); + void sync_overlapping_device(ExecutionSpace space, unsigned int mask); + + private: + tagint *tag; + int *type,*mask; + imageint *image; + double **x,**v,**f; + double **omega,**angmom; + + DAT::t_tagint_1d d_tag; + DAT::t_int_1d d_type, d_mask; + HAT::t_tagint_1d h_tag; + HAT::t_int_1d h_type, h_mask; + + DAT::t_imageint_1d d_image; + HAT::t_imageint_1d h_image; + + DAT::t_x_array d_x; + DAT::t_v_array d_v; + DAT::t_f_array d_f; + HAT::t_x_array h_x; + HAT::t_v_array h_v; + HAT::t_f_array h_f; + + DAT::t_v_array d_omega, d_angmom; + HAT::t_v_array h_omega, h_angmom; + + DAT::tdual_int_1d k_count; + + int nallstyles; + char **allstyles; + + void build_styles(); + int known_style(char *); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Atom style hybrid cannot have hybrid as an argument + +Self-explanatory. + +E: Atom style hybrid cannot use same atom style twice + +Self-explanatory. + +E: Cannot mix molecular and molecule template atom styles + +Self-explanatory. + +E: Per-processor system is too big + +The number of owned atoms plus ghost atoms on a single +processor must fit in 32-bit integer. + +E: Invalid atom type in Atoms section of data file + +Atom types must range from 1 to specified # of types. + +*/ diff --git a/src/KOKKOS/atom_vec_kokkos.cpp b/src/KOKKOS/atom_vec_kokkos.cpp index 5542991395..03fb2a4ead 100644 --- a/src/KOKKOS/atom_vec_kokkos.cpp +++ b/src/KOKKOS/atom_vec_kokkos.cpp @@ -12,6 +12,10 @@ ------------------------------------------------------------------------- */ #include "atom_vec_kokkos.h" +#include "atom_kokkos.h" +#include "comm_kokkos.h" +#include "domain.h" +#include "atom_masks.h" using namespace LAMMPS_NS; @@ -24,3 +28,585 @@ AtomVecKokkos::AtomVecKokkos(LAMMPS *lmp) : AtomVec(lmp) buffer_size = 0; } +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecKokkos_PackComm { + typedef DeviceType device_type; + + typename ArrayTypes::t_x_array_randomread _x; + typename ArrayTypes::t_xfloat_2d_um _buf; + typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; + X_FLOAT _pbc[6]; + + AtomVecKokkos_PackComm( + const typename DAT::tdual_x_array &x, + const typename DAT::tdual_xfloat_2d &buf, + const typename DAT::tdual_int_2d &list, + const int & iswap, + const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, + const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): + _x(x.view()),_list(list.view()),_iswap(iswap), + _xprd(xprd),_yprd(yprd),_zprd(zprd), + _xy(xy),_xz(xz),_yz(yz) { + const size_t maxsend = (buf.view().dimension_0()*buf.view().dimension_1())/3; + const size_t elements = 3; + buffer_view(_buf,buf,maxsend,elements); + _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; + _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; + }; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + if (PBC_FLAG == 0) { + _buf(i,0) = _x(j,0); + _buf(i,1) = _x(j,1); + _buf(i,2) = _x(j,2); + } else { + if (TRICLINIC == 0) { + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + } else { + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + } + } + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::pack_comm_kokkos(const int &n, + const DAT::tdual_int_2d &list, + const int & iswap, + const DAT::tdual_xfloat_2d &buf, + const int &pbc_flag, + const int* const pbc) +{ + // Check whether to always run forward communication on the host + // Choose correct forward PackComm kernel + + if(commKK->forward_comm_on_host) { + sync(Host,X_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } else { + sync(Device,X_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackComm f(atomKK->k_x,buf,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } + + return n*size_forward; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecKokkos_PackCommSelf { + typedef DeviceType device_type; + + typename ArrayTypes::t_x_array_randomread _x; + typename ArrayTypes::t_x_array _xw; + int _nfirst; + typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; + X_FLOAT _pbc[6]; + + AtomVecKokkos_PackCommSelf( + const typename DAT::tdual_x_array &x, + const int &nfirst, + const typename DAT::tdual_int_2d &list, + const int & iswap, + const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, + const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc): + _x(x.view()),_xw(x.view()),_nfirst(nfirst),_list(list.view()),_iswap(iswap), + _xprd(xprd),_yprd(yprd),_zprd(zprd), + _xy(xy),_xz(xz),_yz(yz) { + _pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2]; + _pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5]; + }; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + if (PBC_FLAG == 0) { + _xw(i+_nfirst,0) = _x(j,0); + _xw(i+_nfirst,1) = _x(j,1); + _xw(i+_nfirst,2) = _x(j,2); + } else { + if (TRICLINIC == 0) { + _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; + _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; + _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; + } else { + _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; + } + } + + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, + const int nfirst, const int &pbc_flag, const int* const pbc) { + if(commKK->forward_comm_on_host) { + sync(Host,X_MASK); + modified(Host,X_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } else { + sync(Device,X_MASK); + modified(Device,X_MASK); + if(pbc_flag) { + if(domain->triclinic) { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } else { + if(domain->triclinic) { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } else { + struct AtomVecKokkos_PackCommSelf f(atomKK->k_x,nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); + } + } + } + return n*3; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecKokkos_UnpackComm { + typedef DeviceType device_type; + + typename ArrayTypes::t_x_array _x; + typename ArrayTypes::t_xfloat_2d_const _buf; + int _first; + + AtomVecKokkos_UnpackComm( + const typename DAT::tdual_x_array &x, + const typename DAT::tdual_xfloat_2d &buf, + const int& first):_x(x.view()),_buf(buf.view()), + _first(first) {}; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + _x(i+_first,0) = _buf(i,0); + _x(i+_first,1) = _buf(i,1); + _x(i+_first,2) = _buf(i,2); + } +}; + +/* ---------------------------------------------------------------------- */ + +void AtomVecKokkos::unpack_comm_kokkos(const int &n, const int &first, + const DAT::tdual_xfloat_2d &buf ) { + if(commKK->forward_comm_on_host) { + sync(Host,X_MASK); + modified(Host,X_MASK); + struct AtomVecKokkos_UnpackComm f(atomKK->k_x,buf,first); + Kokkos::parallel_for(n,f); + } else { + sync(Device,X_MASK); + modified(Device,X_MASK); + struct AtomVecKokkos_UnpackComm f(atomKK->k_x,buf,first); + Kokkos::parallel_for(n,f); + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::pack_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::pack_comm_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0); + buf[m++] = h_x(j,1); + buf[m++] = h_x(j,2); + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_x(j,0) + dx; + buf[m++] = h_x(j,1) + dy; + buf[m++] = h_x(j,2) + dz; + if (atom->mask[i] & deform_groupbit) { + buf[m++] = h_v(j,0) + dvx; + buf[m++] = h_v(j,1) + dvy; + buf[m++] = h_v(j,2) + dvz; + } else { + buf[m++] = h_v(j,0); + buf[m++] = h_v(j,1); + buf[m++] = h_v(j,2); + } + } + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecKokkos::unpack_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecKokkos::unpack_comm_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + h_x(i,0) = buf[m++]; + h_x(i,1) = buf[m++]; + h_x(i,2) = buf[m++]; + h_v(i,0) = buf[m++]; + h_v(i,1) = buf[m++]; + h_v(i,2) = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecKokkos_PackReverse { + typedef DeviceType device_type; + + typename ArrayTypes::t_f_array_randomread _f; + typename ArrayTypes::t_ffloat_2d _buf; + int _first; + + AtomVecKokkos_PackReverse( + const typename DAT::tdual_f_array &f, + const typename DAT::tdual_ffloat_2d &buf, + const int& first):_f(f.view()),_buf(buf.view()), + _first(first) {}; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + _buf(i,0) = _f(i+_first,0); + _buf(i,1) = _f(i+_first,1); + _buf(i,2) = _f(i+_first,2); + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::pack_reverse_kokkos(const int &n, const int &first, + const DAT::tdual_ffloat_2d &buf ) { + if(commKK->reverse_comm_on_host) { + sync(Host,F_MASK); + struct AtomVecKokkos_PackReverse f(atomKK->k_f,buf,first); + Kokkos::parallel_for(n,f); + } else { + sync(Device,F_MASK); + struct AtomVecKokkos_PackReverse f(atomKK->k_f,buf,first); + Kokkos::parallel_for(n,f); + } + + return n*size_reverse; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecKokkos_UnPackReverseSelf { + typedef DeviceType device_type; + + typename ArrayTypes::t_f_array_randomread _f; + typename ArrayTypes::t_f_array _fw; + int _nfirst; + typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + + AtomVecKokkos_UnPackReverseSelf( + const typename DAT::tdual_f_array &f, + const int &nfirst, + const typename DAT::tdual_int_2d &list, + const int & iswap): + _f(f.view()),_fw(f.view()),_nfirst(nfirst),_list(list.view()),_iswap(iswap) { + }; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + _fw(j,0) += _f(i+_nfirst,0); + _fw(j,1) += _f(i+_nfirst,1); + _fw(j,2) += _f(i+_nfirst,2); + } +}; + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::unpack_reverse_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, + const int nfirst) { + if(commKK->reverse_comm_on_host) { + sync(Host,F_MASK); + struct AtomVecKokkos_UnPackReverseSelf f(atomKK->k_f,nfirst,list,iswap); + Kokkos::parallel_for(n,f); + modified(Host,F_MASK); + } else { + sync(Device,F_MASK); + struct AtomVecKokkos_UnPackReverseSelf f(atomKK->k_f,nfirst,list,iswap); + Kokkos::parallel_for(n,f); + modified(Device,F_MASK); + } + return n*3; +} + +/* ---------------------------------------------------------------------- */ + +template +struct AtomVecKokkos_UnPackReverse { + typedef DeviceType device_type; + + typename ArrayTypes::t_f_array _f; + typename ArrayTypes::t_ffloat_2d_const _buf; + typename ArrayTypes::t_int_2d_const _list; + const int _iswap; + + AtomVecKokkos_UnPackReverse( + const typename DAT::tdual_f_array &f, + const typename DAT::tdual_ffloat_2d &buf, + const typename DAT::tdual_int_2d &list, + const int & iswap): + _f(f.view()),_list(list.view()),_iswap(iswap) { + const size_t maxsend = (buf.view().dimension_0()*buf.view().dimension_1())/3; + const size_t elements = 3; + buffer_view(_buf,buf,maxsend,elements); + }; + + KOKKOS_INLINE_FUNCTION + void operator() (const int& i) const { + const int j = _list(_iswap,i); + _f(j,0) += _buf(i,0); + _f(j,1) += _buf(i,1); + _f(j,2) += _buf(i,2); + } +}; + +/* ---------------------------------------------------------------------- */ + +void AtomVecKokkos::unpack_reverse_kokkos(const int &n, + const DAT::tdual_int_2d &list, + const int & iswap, + const DAT::tdual_ffloat_2d &buf) +{ + // Check whether to always run reverse communication on the host + // Choose correct reverse UnPackReverse kernel + + if(commKK->reverse_comm_on_host) { + struct AtomVecKokkos_UnPackReverse f(atomKK->k_f,buf,list,iswap); + Kokkos::parallel_for(n,f); + modified(Host,F_MASK); + } else { + struct AtomVecKokkos_UnPackReverse f(atomKK->k_f,buf,list,iswap); + Kokkos::parallel_for(n,f); + modified(Device,F_MASK); + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecKokkos::pack_reverse(int n, int first, double *buf) +{ + if(n > 0) + sync(Host,F_MASK); + + int m = 0; + const int last = first + n; + for (int i = first; i < last; i++) { + buf[m++] = h_f(i,0); + buf[m++] = h_f(i,1); + buf[m++] = h_f(i,2); + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecKokkos::unpack_reverse(int n, int *list, double *buf) +{ + int m = 0; + for (int i = 0; i < n; i++) { + const int j = list[i]; + h_f(j,0) += buf[m++]; + h_f(j,1) += buf[m++]; + h_f(j,2) += buf[m++]; + } + + if(n > 0) + modified(Host,F_MASK); +} diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index 7f593f235f..20a07ec443 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -35,29 +35,48 @@ class AtomVecKokkos : public AtomVec { public: AtomVecKokkos(class LAMMPS *); virtual ~AtomVecKokkos() {} + virtual int pack_comm(int, int *, double *, int, int *); + virtual int pack_comm_vel(int, int *, double *, int, int *); + virtual void unpack_comm(int, int, double *); + virtual void unpack_comm_vel(int, int, double *); + virtual int pack_reverse(int, int, double *); + virtual void unpack_reverse(int, int *, double *); virtual void sync(ExecutionSpace space, unsigned int mask) = 0; virtual void modified(ExecutionSpace space, unsigned int mask) = 0; - virtual void sync_overlapping_device(ExecutionSpace space, unsigned int mask) {}; + virtual void sync_overlapping_device(ExecutionSpace space, unsigned int mask) = 0; virtual int pack_comm_self(const int &n, const DAT::tdual_int_2d &list, const int & iswap, const int nfirst, - const int &pbc_flag, const int pbc[]) = 0; - //{return 0;} + const int &pbc_flag, const int pbc[]); + virtual int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &list, const int & iswap, const DAT::tdual_xfloat_2d &buf, - const int &pbc_flag, const int pbc[]) = 0; - //{return 0;} + const int &pbc_flag, const int pbc[]); + virtual void unpack_comm_kokkos(const int &n, const int &nfirst, - const DAT::tdual_xfloat_2d &buf) = 0; + const DAT::tdual_xfloat_2d &buf); + + virtual int + unpack_reverse_self(const int &n, const DAT::tdual_int_2d &list, + const int & iswap, const int nfirst); + + virtual int + pack_reverse_kokkos(const int &n, const int &nfirst, + const DAT::tdual_ffloat_2d &buf); + + virtual void + unpack_reverse_kokkos(const int &n, const DAT::tdual_int_2d &list, + const int & iswap, const DAT::tdual_ffloat_2d &buf); + virtual int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist, DAT::tdual_xfloat_2d buf,int iswap, int pbc_flag, int *pbc, ExecutionSpace space) = 0; - //{return 0;}; + virtual void unpack_border_kokkos(const int &n, const int &nfirst, const DAT::tdual_xfloat_2d &buf, @@ -68,15 +87,19 @@ class AtomVecKokkos : public AtomVec { DAT::tdual_int_1d k_sendlist, DAT::tdual_int_1d k_copylist, ExecutionSpace space, int dim, X_FLOAT lo, X_FLOAT hi) = 0; - //{return 0;}; + virtual int unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int nrecv, int nlocal, int dim, X_FLOAT lo, X_FLOAT hi, ExecutionSpace space) = 0; - //{return 0;}; + protected: + HAT::t_x_array h_x; + HAT::t_v_array h_v; + HAT::t_f_array h_f; + class CommKokkos *commKK; size_t buffer_size; void* buffer; diff --git a/src/KOKKOS/atom_vec_molecular_kokkos.cpp b/src/KOKKOS/atom_vec_molecular_kokkos.cpp index 5c16ac1513..6f232a319b 100644 --- a/src/KOKKOS/atom_vec_molecular_kokkos.cpp +++ b/src/KOKKOS/atom_vec_molecular_kokkos.cpp @@ -19,7 +19,7 @@ #include "modify.h" #include "fix.h" #include "atom_masks.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" using namespace LAMMPS_NS; @@ -67,57 +67,57 @@ void AtomVecMolecularKokkos::grow(int n) sync(Device,ALL_MASK); modified(Device,ALL_MASK); - memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); - memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); - memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); - memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); + memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag"); + memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type"); + memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask"); + memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image"); - memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); - memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); - memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); + memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x"); + memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v"); + memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f"); - memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); - memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); - memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial, + memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule"); + memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial"); + memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial, "atom:special"); - memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); - memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom, + memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond"); + memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom, "atom:bond_type"); - memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom, + memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom, "atom:bond_atom"); - memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle"); - memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle"); + memoryKK->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom, "atom:angle_type"); - memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom, "atom:angle_atom1"); - memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom, "atom:angle_atom2"); - memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom, + memoryKK->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom, "atom:angle_atom3"); - memory->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral"); - memory->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax, + memoryKK->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral"); + memoryKK->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax, atomKK->dihedral_per_atom,"atom:dihedral_type"); - memory->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom1"); - memory->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom2"); - memory->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom3"); - memory->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax, + memoryKK->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax, atomKK->dihedral_per_atom,"atom:dihedral_atom4"); - memory->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper"); - memory->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax, + memoryKK->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper"); + memoryKK->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax, atomKK->improper_per_atom,"atom:improper_type"); - memory->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax, atomKK->improper_per_atom,"atom:improper_atom1"); - memory->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax, atomKK->improper_per_atom,"atom:improper_atom2"); - memory->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax, atomKK->improper_per_atom,"atom:improper_atom3"); - memory->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax, + memoryKK->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax, atomKK->improper_per_atom,"atom:improper_atom4"); grow_reset(); @@ -387,7 +387,6 @@ int AtomVecMolecularKokkos::pack_comm_kokkos(const int &n, Kokkos::parallel_for(n,f); } } - LMPHostType::fence(); } else { sync(Device,X_MASK); if(pbc_flag) { @@ -415,7 +414,6 @@ int AtomVecMolecularKokkos::pack_comm_kokkos(const int &n, Kokkos::parallel_for(n,f); } } - LMPDeviceType::fence(); } return n*size_forward; @@ -506,7 +504,6 @@ int AtomVecMolecularKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d Kokkos::parallel_for(n,f); } } - LMPHostType::fence(); } else { sync(Device,X_MASK); modified(Device,X_MASK); @@ -535,7 +532,6 @@ int AtomVecMolecularKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d Kokkos::parallel_for(n,f); } } - LMPDeviceType::fence(); } return n*3; } @@ -573,13 +569,11 @@ void AtomVecMolecularKokkos::unpack_comm_kokkos(const int &n, const int &first, modified(Host,X_MASK); struct AtomVecMolecularKokkos_UnpackComm f(atomKK->k_x,buf,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } else { sync(Device,X_MASK); modified(Device,X_MASK); struct AtomVecMolecularKokkos_UnpackComm f(atomKK->k_x,buf,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -825,13 +819,11 @@ int AtomVecMolecularKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendli buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecMolecularKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } else { @@ -841,13 +833,11 @@ int AtomVecMolecularKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendli buf.view(), k_sendlist.view(), iswap,h_x,h_tag,h_type,h_mask,h_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { AtomVecMolecularKokkos_PackBorder f( buf.view(), k_sendlist.view(), iswap,d_x,d_tag,d_type,d_mask,d_molecule,dx,dy,dz); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } return n*size_border; @@ -1049,12 +1039,10 @@ void AtomVecMolecularKokkos::unpack_border_kokkos(const int &n, const int &first struct AtomVecMolecularKokkos_UnpackBorder f(buf.view(),h_x,h_tag,h_type,h_mask,h_molecule,first); Kokkos::parallel_for(n,f); - LMPHostType::fence(); } else { struct AtomVecMolecularKokkos_UnpackBorder f(buf.view(),d_x,d_tag,d_type,d_mask,d_molecule,first); Kokkos::parallel_for(n,f); - LMPDeviceType::fence(); } } @@ -1389,13 +1377,11 @@ int AtomVecMolecularKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfl AtomVecMolecularKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPHostType::fence(); return nsend*elements; } else { AtomVecMolecularKokkos_PackExchangeFunctor f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi); Kokkos::parallel_for(nsend,f); - LMPDeviceType::fence(); return nsend*elements; } } @@ -1608,7 +1594,6 @@ int AtomVecMolecularKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,i AtomVecMolecularKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPHostType::fence(); return k_count.h_view(0); } else { k_count.h_view(0) = nlocal; @@ -1617,7 +1602,6 @@ int AtomVecMolecularKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,i AtomVecMolecularKokkos_UnpackExchangeFunctor f(atomKK,k_buf,k_count,dim,lo,hi); Kokkos::parallel_for(nrecv/elements,f); - LMPDeviceType::fence(); k_count.modify(); k_count.sync(); diff --git a/src/KOKKOS/atom_vec_molecular_kokkos.h b/src/KOKKOS/atom_vec_molecular_kokkos.h index 4ec26621cc..06444510e0 100644 --- a/src/KOKKOS/atom_vec_molecular_kokkos.h +++ b/src/KOKKOS/atom_vec_molecular_kokkos.h @@ -14,6 +14,8 @@ #ifdef ATOM_CLASS AtomStyle(molecular/kk,AtomVecMolecularKokkos) +AtomStyle(molecular/kk/device,AtomVecMolecularKokkos) +AtomStyle(molecular/kk/host,AtomVecMolecularKokkos) #else diff --git a/src/KOKKOS/bond_class2_kokkos.cpp b/src/KOKKOS/bond_class2_kokkos.cpp index b3c11c9a06..df2f2c1e9b 100644 --- a/src/KOKKOS/bond_class2_kokkos.cpp +++ b/src/KOKKOS/bond_class2_kokkos.cpp @@ -23,7 +23,7 @@ #include "domain.h" #include "comm.h" #include "force.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -47,8 +47,8 @@ template BondClass2Kokkos::~BondClass2Kokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -67,15 +67,15 @@ void BondClass2Kokkos::compute(int eflag_in, int vflag_in) if (eflag_atom) { //if(k_eatom.dimension_0()destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); d_eatom = k_eatom.template view(); //} } if (vflag_atom) { //if(k_vatom.dimension_0()destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); d_vatom = k_vatom.template view(); //} } diff --git a/src/KOKKOS/bond_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp index 025838340b..20c2054208 100644 --- a/src/KOKKOS/bond_fene_kokkos.cpp +++ b/src/KOKKOS/bond_fene_kokkos.cpp @@ -23,7 +23,7 @@ #include "domain.h" #include "comm.h" #include "force.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -56,8 +56,8 @@ template BondFENEKokkos::~BondFENEKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -75,13 +75,13 @@ void BondFENEKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"bond:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"bond:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"bond:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"bond:vatom"); d_vatom = k_vatom.view(); } @@ -253,10 +253,10 @@ void BondFENEKokkos::allocate() k_epsilon = DAT::tdual_ffloat_1d("BondFene::epsilon",n+1); k_sigma = DAT::tdual_ffloat_1d("BondFene::sigma",n+1); - d_k = k_k.d_view; - d_r0 = k_r0.d_view; - d_epsilon = k_epsilon.d_view; - d_sigma = k_sigma.d_view; + d_k = k_k.template view(); + d_r0 = k_r0.template view(); + d_epsilon = k_epsilon.template view(); + d_sigma = k_sigma.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/bond_fene_kokkos.h b/src/KOKKOS/bond_fene_kokkos.h index c630abcafc..094685d0cf 100644 --- a/src/KOKKOS/bond_fene_kokkos.h +++ b/src/KOKKOS/bond_fene_kokkos.h @@ -85,10 +85,10 @@ class BondFENEKokkos : public BondFENE { DAT::tdual_ffloat_1d k_epsilon; DAT::tdual_ffloat_1d k_sigma; - DAT::t_ffloat_1d d_k; - DAT::t_ffloat_1d d_r0; - DAT::t_ffloat_1d d_epsilon; - DAT::t_ffloat_1d d_sigma; + typename AT::t_ffloat_1d d_k; + typename AT::t_ffloat_1d d_r0; + typename AT::t_ffloat_1d d_epsilon; + typename AT::t_ffloat_1d d_sigma; virtual void allocate(); }; diff --git a/src/KOKKOS/bond_harmonic_kokkos.cpp b/src/KOKKOS/bond_harmonic_kokkos.cpp index da45c70d6c..c4e0c3a817 100644 --- a/src/KOKKOS/bond_harmonic_kokkos.cpp +++ b/src/KOKKOS/bond_harmonic_kokkos.cpp @@ -23,7 +23,7 @@ #include "domain.h" #include "comm.h" #include "force.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -48,8 +48,8 @@ template BondHarmonicKokkos::~BondHarmonicKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -68,15 +68,15 @@ void BondHarmonicKokkos::compute(int eflag_in, int vflag_in) if (eflag_atom) { //if(k_eatom.dimension_0()destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); d_eatom = k_eatom.template view(); //} } if (vflag_atom) { //if(k_vatom.dimension_0()destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); d_vatom = k_vatom.template view(); //} } diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index f38a6c21c9..de35431eb9 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -20,7 +20,7 @@ #include "domain.h" #include "atom_masks.h" #include "error.h" -#include "memory.h" +#include "memory_kokkos.h" #include "force.h" #include "pair.h" #include "fix.h" @@ -28,6 +28,7 @@ #include "dump.h" #include "output.h" #include "modify.h" +#include "kokkos_base.h" using namespace LAMMPS_NS; @@ -46,7 +47,8 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp) if (sendlist) for (int i = 0; i < maxswap; i++) memory->destroy(sendlist[i]); memory->sfree(sendlist); sendlist = NULL; - k_sendlist = ArrayTypes::tdual_int_2d(); + k_sendlist = DAT::tdual_int_2d(); + k_total_send = DAT::tdual_int_scalar("comm::k_total_send"); // error check for disallow of OpenMP threads? @@ -57,12 +59,12 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp) memory->destroy(buf_recv); buf_recv = NULL; - k_exchange_sendlist = ArrayTypes:: + k_exchange_sendlist = DAT:: tdual_int_1d("comm:k_exchange_sendlist",100); - k_exchange_copylist = ArrayTypes:: + k_exchange_copylist = DAT:: tdual_int_1d("comm:k_exchange_copylist",100); - k_count = ArrayTypes::tdual_int_1d("comm:k_count",1); - k_sendflag = ArrayTypes::tdual_int_1d("comm:k_sendflag",100); + k_count = DAT::tdual_int_scalar("comm:k_count"); + k_sendflag = DAT::tdual_int_1d("comm:k_sendflag",100); memory->destroy(maxsendlist); maxsendlist = NULL; @@ -70,7 +72,7 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp) for (int i = 0; i < maxswap; i++) { maxsendlist[i] = BUFMIN; } - memory->create_kokkos(k_sendlist,sendlist,maxswap,BUFMIN,"comm:sendlist"); + memoryKK->create_kokkos(k_sendlist,sendlist,maxswap,BUFMIN,"comm:sendlist"); max_buf_pair = 0; k_buf_send_pair = DAT::tdual_xfloat_1d("comm:k_buf_send_pair",1); @@ -81,11 +83,11 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp) CommKokkos::~CommKokkos() { - memory->destroy_kokkos(k_sendlist,sendlist); + memoryKK->destroy_kokkos(k_sendlist,sendlist); sendlist = NULL; - memory->destroy_kokkos(k_buf_send,buf_send); + memoryKK->destroy_kokkos(k_buf_send,buf_send); buf_send = NULL; - memory->destroy_kokkos(k_buf_recv,buf_recv); + memoryKK->destroy_kokkos(k_buf_recv,buf_recv); buf_recv = NULL; } @@ -102,8 +104,10 @@ void CommKokkos::init() atomKK = (AtomKokkos *) atom; exchange_comm_classic = lmp->kokkos->exchange_comm_classic; forward_comm_classic = lmp->kokkos->forward_comm_classic; + reverse_comm_classic = lmp->kokkos->reverse_comm_classic; exchange_comm_on_host = lmp->kokkos->exchange_comm_on_host; forward_comm_on_host = lmp->kokkos->forward_comm_on_host; + reverse_comm_on_host = lmp->kokkos->reverse_comm_on_host; CommBrick::init(); @@ -132,8 +136,11 @@ void CommKokkos::init() if (force->newton == 0) check_reverse = 0; if (force->pair) check_reverse += force->pair->comm_reverse_off; - if(check_reverse || check_forward) + if (ghost_velocity) forward_comm_classic = true; + + if (!comm_f_only) // not all Kokkos atom_vec styles have reverse pack/unpack routines yet + reverse_comm_classic = true; } /* ---------------------------------------------------------------------- @@ -173,7 +180,6 @@ void CommKokkos::forward_comm_device(int dummy) int n; MPI_Request request; AtomVecKokkos *avec = (AtomVecKokkos *) atom->avec; - double **x = atom->x; double *buf; // exchange data with another proc @@ -181,32 +187,30 @@ void CommKokkos::forward_comm_device(int dummy) // if comm_x_only set, exchange or copy directly to x, don't unpack k_sendlist.sync(); + atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); for (int iswap = 0; iswap < nswap; iswap++) { - if (sendproc[iswap] != me) { if (comm_x_only) { - atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); - if (size_forward_recv[iswap]) buf = x[firstrecv[iswap]]; - else buf = NULL; - if (size_forward_recv[iswap]) { buf = atomKK->k_x.view().ptr_on_device() + firstrecv[iswap]*atomKK->k_x.view().dimension_1(); MPI_Irecv(buf,size_forward_recv[iswap],MPI_DOUBLE, - recvproc[iswap],0,world,&request); + recvproc[iswap],0,world,&request); } n = avec->pack_comm_kokkos(sendnum[iswap],k_sendlist, iswap,k_buf_send,pbc_flag[iswap],pbc[iswap]); - + DeviceType::fence(); if (n) { MPI_Send(k_buf_send.view().ptr_on_device(), n,MPI_DOUBLE,sendproc[iswap],0,world); } - if (size_forward_recv[iswap]) MPI_Wait(&request,MPI_STATUS_IGNORE); - atomKK->modified(ExecutionSpaceFromDevice:: - space,X_MASK); + if (size_forward_recv[iswap]) { + MPI_Wait(&request,MPI_STATUS_IGNORE); + atomKK->modified(ExecutionSpaceFromDevice:: + space,X_MASK); + } } else if (ghost_velocity) { error->all(FLERR,"Ghost velocity forward comm not yet " "implemented with Kokkos"); @@ -226,11 +230,13 @@ void CommKokkos::forward_comm_device(int dummy) recvproc[iswap],0,world,&request); n = avec->pack_comm_kokkos(sendnum[iswap],k_sendlist,iswap, k_buf_send,pbc_flag[iswap],pbc[iswap]); + DeviceType::fence(); if (n) MPI_Send(k_buf_send.view().ptr_on_device(),n, MPI_DOUBLE,sendproc[iswap],0,world); if (size_forward_recv[iswap]) MPI_Wait(&request,MPI_STATUS_IGNORE); avec->unpack_comm_kokkos(recvnum[iswap],firstrecv[iswap],k_buf_recv); + DeviceType::fence(); } } else { @@ -248,21 +254,95 @@ void CommKokkos::forward_comm_device(int dummy) } } } + +/* ---------------------------------------------------------------------- + reverse communication of forces on atoms every timestep + other per-atom attributes may also be sent via pack/unpack routines +------------------------------------------------------------------------- */ + void CommKokkos::reverse_comm() { + if (!reverse_comm_classic) { + if (reverse_comm_on_host) reverse_comm_device(); + else reverse_comm_device(); + return; + } + k_sendlist.sync(); + if (comm_f_only) atomKK->sync(Host,F_MASK); else atomKK->sync(Host,ALL_MASK); + CommBrick::reverse_comm(); + if (comm_f_only) atomKK->modified(Host,F_MASK); else atomKK->modified(Host,ALL_MASK); - atomKK->sync(Device,ALL_MASK); + + //atomKK->sync(Device,ALL_MASK); // is this needed? } +template +void CommKokkos::reverse_comm_device() +{ + int n; + MPI_Request request; + AtomVecKokkos *avec = (AtomVecKokkos *) atom->avec; + double *buf; + + // exchange data with another proc + // if other proc is self, just copy + // if comm_f_only set, exchange or copy directly from f, don't pack + + k_sendlist.sync(); + atomKK->sync(ExecutionSpaceFromDevice::space,F_MASK); + + for (int iswap = nswap-1; iswap >= 0; iswap--) { + if (sendproc[iswap] != me) { + if (comm_f_only) { + if (size_reverse_recv[iswap]) + MPI_Irecv(k_buf_recv.view().ptr_on_device(),size_reverse_recv[iswap],MPI_DOUBLE, + sendproc[iswap],0,world,&request); + if (size_reverse_send[iswap]) { + buf = atomKK->k_f.view().ptr_on_device() + + firstrecv[iswap]*atomKK->k_f.view().dimension_1(); + + MPI_Send(buf,size_reverse_send[iswap],MPI_DOUBLE, + recvproc[iswap],0,world); + } + if (size_reverse_recv[iswap]) { + MPI_Wait(&request,MPI_STATUS_IGNORE); + atomKK->modified(ExecutionSpaceFromDevice:: + space,F_MASK); + } + } else { + if (size_reverse_recv[iswap]) + MPI_Irecv(k_buf_recv.view().ptr_on_device(), + size_reverse_recv[iswap],MPI_DOUBLE, + sendproc[iswap],0,world,&request); + n = avec->pack_reverse_kokkos(recvnum[iswap],firstrecv[iswap],k_buf_send); + DeviceType::fence(); + if (n) + MPI_Send(k_buf_send.view().ptr_on_device(),n, + MPI_DOUBLE,recvproc[iswap],0,world); + if (size_reverse_recv[iswap]) MPI_Wait(&request,MPI_STATUS_IGNORE); + } + avec->unpack_reverse_kokkos(sendnum[iswap],k_sendlist,iswap, + k_buf_recv); + DeviceType::fence(); + } else { + if (sendnum[iswap]) + n = avec->unpack_reverse_self(sendnum[iswap],k_sendlist,iswap, + firstrecv[iswap]); + } + } +} + +/* ---------------------------------------------------------------------- */ + void CommKokkos::forward_comm_fix(Fix *fix, int size) { k_sendlist.sync(); @@ -305,6 +385,7 @@ void CommKokkos::forward_comm_pair_device(Pair *pair) MPI_Request request; int nsize = pair->comm_forward; + KokkosBase* pairKKBase = dynamic_cast(pair); for (iswap = 0; iswap < nswap; iswap++) { int n = MAX(max_buf_pair,nsize*sendnum[iswap]); @@ -317,8 +398,9 @@ void CommKokkos::forward_comm_pair_device(Pair *pair) // pack buffer - n = pair->pack_forward_comm_kokkos(sendnum[iswap],k_sendlist, + n = pairKKBase->pack_forward_comm_kokkos(sendnum[iswap],k_sendlist, iswap,k_buf_send_pair,pbc_flag[iswap],pbc[iswap]); + DeviceType::fence(); // exchange with another proc // if self, set recv buffer to send buffer @@ -334,7 +416,8 @@ void CommKokkos::forward_comm_pair_device(Pair *pair) // unpack buffer - pair->unpack_forward_comm_kokkos(recvnum[iswap],firstrecv[iswap],k_buf_recv_pair); + pairKKBase->unpack_forward_comm_kokkos(recvnum[iswap],firstrecv[iswap],k_buf_recv_pair); + DeviceType::fence(); } } @@ -379,8 +462,8 @@ void CommKokkos::exchange() if(!exchange_comm_classic) { static int print = 1; if(print && comm->me==0) { - error->warning(FLERR,"Fixes cannot send data in Kokkos communication, " - "switching to classic communication"); + error->warning(FLERR,"Fixes cannot yet send data in Kokkos communication, " + "switching to classic communication"); } print = 0; exchange_comm_classic = true; @@ -408,7 +491,7 @@ struct BuildExchangeListFunctor { typename AT::t_x_array _x; int _nlocal,_dim; - typename AT::t_int_1d _nsend; + typename AT::t_int_scalar _nsend; typename AT::t_int_1d _sendlist; typename AT::t_int_1d _sendflag; @@ -416,7 +499,7 @@ struct BuildExchangeListFunctor { BuildExchangeListFunctor( const typename AT::tdual_x_array x, const typename AT::tdual_int_1d sendlist, - typename AT::tdual_int_1d nsend, + typename AT::tdual_int_scalar nsend, typename AT::tdual_int_1d sendflag,int nlocal, int dim, X_FLOAT lo, X_FLOAT hi): _x(x.template view()), @@ -430,7 +513,7 @@ struct BuildExchangeListFunctor { KOKKOS_INLINE_FUNCTION void operator() (int i) const { if (_x(i,_dim) < _lo || _x(i,_dim) >= _hi) { - const int mysend=Kokkos::atomic_fetch_add(&_nsend(0),1); + const int mysend=Kokkos::atomic_fetch_add(&_nsend(),1); if(mysend<_sendlist.dimension_0()) { _sendlist(mysend) = i; _sendflag(i) = 1; @@ -488,9 +571,10 @@ void CommKokkos::exchange_device() if (true) { if (k_sendflag.h_view.dimension_0()=k_exchange_sendlist.h_view.dimension_0()) { - k_count.h_view(0) = 0; + k_sendflag.sync(); + k_count.h_view() = k_exchange_sendlist.h_view.dimension_0(); + while (k_count.h_view()>=k_exchange_sendlist.h_view.dimension_0()) { + k_count.h_view() = 0; k_count.modify(); k_count.sync(); @@ -498,16 +582,15 @@ void CommKokkos::exchange_device() f(atomKK->k_x,k_exchange_sendlist,k_count,k_sendflag, nlocal,dim,lo,hi); Kokkos::parallel_for(nlocal,f); - DeviceType::fence(); k_exchange_sendlist.modify(); k_sendflag.modify(); k_count.modify(); k_count.sync(); - if (k_count.h_view(0)>=k_exchange_sendlist.h_view.dimension_0()) { - k_exchange_sendlist.resize(k_count.h_view(0)*1.1); - k_exchange_copylist.resize(k_count.h_view(0)*1.1); - k_count.h_view(0)=k_exchange_sendlist.h_view.dimension_0(); + if (k_count.h_view()>=k_exchange_sendlist.h_view.dimension_0()) { + k_exchange_sendlist.resize(k_count.h_view()*1.1); + k_exchange_copylist.resize(k_count.h_view()*1.1); + k_count.h_view()=k_exchange_sendlist.h_view.dimension_0(); } } k_exchange_copylist.sync(); @@ -515,22 +598,22 @@ void CommKokkos::exchange_device() k_sendflag.sync(); int sendpos = nlocal-1; - nlocal -= k_count.h_view(0); - for(int i = 0; i < k_count.h_view(0); i++) { + nlocal -= k_count.h_view(); + for(int i = 0; i < k_count.h_view(); i++) { if (k_exchange_sendlist.h_view(i)(); k_exchange_copylist.sync(); - nsend = k_count.h_view(0); + nsend = k_count.h_view(); if (nsend > maxsend) grow_send_kokkos(nsend,1); nsend = - avec->pack_exchange_kokkos(k_count.h_view(0),k_buf_send, + avec->pack_exchange_kokkos(k_count.h_view(),k_buf_send, k_exchange_sendlist,k_exchange_copylist, ExecutionSpaceFromDevice:: space,dim,lo,hi); @@ -623,6 +706,19 @@ void CommKokkos::exchange_device() void CommKokkos::borders() { + if (!exchange_comm_classic) { + static int print = 1; + + if (style != SINGLE || bordergroup || ghost_velocity) { + if (print && comm->me==0) { + error->warning(FLERR,"Required border comm not yet implemented in Kokkos communication, " + "switching to classic communication"); + } + print = 0; + exchange_comm_classic = true; + } + } + if (!exchange_comm_classic) { if (exchange_comm_on_host) borders_device(); else borders_device(); @@ -630,9 +726,7 @@ void CommKokkos::borders() } atomKK->sync(Host,ALL_MASK); - atomKK->modified(Host,ALL_MASK); k_sendlist.sync(); - k_sendlist.modify(); CommBrick::borders(); k_sendlist.modify(); atomKK->modified(Host,ALL_MASK); @@ -649,11 +743,11 @@ struct BuildBorderListFunctor { int iswap,maxsendlist; int nfirst,nlast,dim; typename AT::t_int_2d sendlist; - typename AT::t_int_1d nsend; + typename AT::t_int_scalar nsend; BuildBorderListFunctor(typename AT::tdual_x_array _x, typename AT::tdual_int_2d _sendlist, - typename AT::tdual_int_1d _nsend,int _nfirst, + typename AT::tdual_int_scalar _nsend,int _nfirst, int _nlast, int _dim, X_FLOAT _lo, X_FLOAT _hi, int _iswap, int _maxsendlist): @@ -674,7 +768,7 @@ struct BuildBorderListFunctor { for (int i=teamstart + dev.team_rank(); i= lo && x(i,dim) <= hi) mysend++; } - const int my_store_pos = dev.team_scan(mysend,&nsend(0)); + const int my_store_pos = dev.team_scan(mysend,&nsend()); if (my_store_pos+mysend < maxsendlist) { mysend = my_store_pos; @@ -703,7 +797,7 @@ void CommKokkos::borders_device() { AtomVecKokkos *avec = (AtomVecKokkos *) atom->avec; ExecutionSpace exec_space = ExecutionSpaceFromDevice::space; - k_sendlist.modify(); + k_sendlist.sync(); atomKK->sync(exec_space,ALL_MASK); // do swaps over all 3 dimensions @@ -753,39 +847,38 @@ void CommKokkos::borders_device() { if (sendflag) { if (!bordergroup || ineed >= 2) { if (style == SINGLE) { - typename ArrayTypes::tdual_int_1d total_send("TS",1); - total_send.h_view(0) = 0; - if(exec_space == Device) { - total_send.template modify(); - total_send.template sync(); - } + k_total_send.h_view() = 0; + k_total_send.template modify(); + k_total_send.template sync(); BuildBorderListFunctor f(atomKK->k_x,k_sendlist, - total_send,nfirst,nlast,dim,lo,hi,iswap,maxsendlist[iswap]); + k_total_send,nfirst,nlast,dim,lo,hi,iswap,maxsendlist[iswap]); Kokkos::TeamPolicy config((nlast-nfirst+127)/128,128); Kokkos::parallel_for(config,f); - DeviceType::fence(); - total_send.template modify(); - total_send.template sync(); + k_total_send.template modify(); + k_total_send.template sync(); + + k_sendlist.modify(); + + if(k_total_send.h_view() >= maxsendlist[iswap]) { + grow_list(iswap,k_total_send.h_view()); + + k_total_send.h_view() = 0; + k_total_send.template modify(); + k_total_send.template sync(); - if(total_send.h_view(0) >= maxsendlist[iswap]) { - grow_list(iswap,total_send.h_view(0)); - k_sendlist.modify(); - total_send.h_view(0) = 0; - if(exec_space == Device) { - total_send.template modify(); - total_send.template sync(); - } BuildBorderListFunctor f(atomKK->k_x,k_sendlist, - total_send,nfirst,nlast,dim,lo,hi,iswap,maxsendlist[iswap]); + k_total_send,nfirst,nlast,dim,lo,hi,iswap,maxsendlist[iswap]); Kokkos::TeamPolicy config((nlast-nfirst+127)/128,128); Kokkos::parallel_for(config,f); - DeviceType::fence(); - total_send.template modify(); - total_send.template sync(); + + k_total_send.template modify(); + k_total_send.template sync(); + + k_sendlist.modify(); } - nsend = total_send.h_view(0); + nsend = k_total_send.h_view(); } else { error->all(FLERR,"Required border comm not yet " "implemented with Kokkos"); @@ -843,10 +936,12 @@ void CommKokkos::borders_device() { n = avec->pack_border_vel(nsend,sendlist[iswap],buf_send, pbc_flag[iswap],pbc[iswap]); } - else + else { n = avec-> pack_border_kokkos(nsend,k_sendlist,k_buf_send,iswap, pbc_flag[iswap],pbc[iswap],exec_space); + DeviceType::fence(); + } // swap atoms with other proc // no MPI calls except SendRecv if nsend/nrecv = 0 @@ -877,12 +972,15 @@ void CommKokkos::borders_device() { avec->unpack_border_vel(nrecv,atom->nlocal+atom->nghost,buf); } else - if (sendproc[iswap] != me) + if (sendproc[iswap] != me) { avec->unpack_border_kokkos(nrecv,atom->nlocal+atom->nghost, k_buf_recv,exec_space); - else + DeviceType::fence(); + } else { avec->unpack_border_kokkos(nrecv,atom->nlocal+atom->nghost, k_buf_send,exec_space); + DeviceType::fence(); + } // set all pointers & counters @@ -908,11 +1006,11 @@ void CommKokkos::borders_device() { // reset global->local map - if (exec_space == Host) k_sendlist.sync(); atomKK->modified(exec_space,ALL_MASK); - DeviceType::fence(); - atomKK->sync(Host,TAG_MASK); - if (map_style) atom->map_set(); + if (map_style) { + atomKK->sync(Host,TAG_MASK); + atom->map_set(); + } } /* ---------------------------------------------------------------------- realloc the size of the send buffer as needed with BUFFACTOR and bufextra @@ -954,7 +1052,7 @@ void CommKokkos::grow_send_kokkos(int n, int flag, ExecutionSpace space) buf_send = k_buf_send.view().ptr_on_device(); } else { - k_buf_send = ArrayTypes:: + k_buf_send = DAT:: tdual_xfloat_2d("comm:k_buf_send",maxsend_border,atom->avec->size_border); buf_send = k_buf_send.view().ptr_on_device(); } @@ -968,7 +1066,7 @@ void CommKokkos::grow_recv_kokkos(int n, ExecutionSpace space) { maxrecv = static_cast (BUFFACTOR * n); int maxrecv_border = (maxrecv+BUFEXTRA+5)/atom->avec->size_border + 2; - k_buf_recv = ArrayTypes:: + k_buf_recv = DAT:: tdual_xfloat_2d("comm:k_buf_recv",maxrecv_border,atom->avec->size_border); buf_recv = k_buf_recv.view().ptr_on_device(); } @@ -981,7 +1079,12 @@ void CommKokkos::grow_list(int iswap, int n) { int size = static_cast (BUFFACTOR * n); - memory->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist"); + if (exchange_comm_classic) { // force realloc on Host + k_sendlist.sync(); + k_sendlist.modify(); + } + + memoryKK->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist"); for(int i=0;i()(i,0); @@ -1004,7 +1107,12 @@ void CommKokkos::grow_swap(int n) maxswap = n; int size = MAX(k_sendlist.d_view.dimension_1(),BUFMIN); - memory->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist"); + if (exchange_comm_classic) { // force realloc on Host + k_sendlist.sync(); + k_sendlist.modify(); + } + + memoryKK->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist"); memory->grow(maxsendlist,n,"comm:maxsendlist"); for (int i=0;i void forward_comm_device(int dummy); + template void reverse_comm_device(); template void forward_comm_pair_device(Pair *pair); template void exchange_device(); template void borders_device(); protected: DAT::tdual_int_2d k_sendlist; + DAT::tdual_int_scalar k_total_send; DAT::tdual_xfloat_2d k_buf_send,k_buf_recv; DAT::tdual_int_1d k_exchange_sendlist,k_exchange_copylist,k_sendflag; - DAT::tdual_int_1d k_count; + DAT::tdual_int_scalar k_count; //double *buf_send; // send buffer for all comm //double *buf_recv; // recv buffer for all comm @@ -82,9 +86,14 @@ E: Ghost velocity forward comm not yet implemented with Kokkos This is a current restriction. -W: Fixes cannot send data in Kokkos communication, switching to classic communication +W: Fixes cannot yet send data in Kokkos communication, switching to classic communication -This is current restriction with Kokkos. +This is a current restriction with Kokkos. + +W: Required border comm not yet implemented in Kokkos communication, switching to classic communication + +There are various limitations in the communication options supported +by Kokkos. E: Required border comm not yet implemented with Kokkos diff --git a/src/KOKKOS/comm_tiled_kokkos.cpp b/src/KOKKOS/comm_tiled_kokkos.cpp index adcc634aa1..33cd8eaa6e 100644 --- a/src/KOKKOS/comm_tiled_kokkos.cpp +++ b/src/KOKKOS/comm_tiled_kokkos.cpp @@ -25,7 +25,7 @@ #include "compute.h" #include "output.h" #include "dump.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" diff --git a/src/KOKKOS/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp index a8a8aade60..71635ec76c 100644 --- a/src/KOKKOS/dihedral_charmm_kokkos.cpp +++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp @@ -25,7 +25,7 @@ #include "force.h" #include "pair.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -56,8 +56,8 @@ template DihedralCharmmKokkos::~DihedralCharmmKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -81,8 +81,8 @@ void DihedralCharmmKokkos::compute(int eflag_in, int vflag_in) if (eflag_atom) { //if(k_eatom.dimension_0()destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom"); d_eatom = k_eatom.template view(); k_eatom_pair = Kokkos::DualView("dihedral:eatom_pair",maxeatom); d_eatom_pair = k_eatom.template view(); @@ -90,8 +90,8 @@ void DihedralCharmmKokkos::compute(int eflag_in, int vflag_in) } if (vflag_atom) { //if(k_vatom.dimension_0()destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom"); d_vatom = k_vatom.template view(); k_vatom_pair = Kokkos::DualView("dihedral:vatom_pair",maxvatom); d_vatom_pair = k_vatom.template view(); @@ -432,12 +432,12 @@ void DihedralCharmmKokkos::coeff(int narg, char **arg) Kokkos::DualView k_sin_shift("DihedralCharmm::sin_shift",nd+1); Kokkos::DualView k_weight("DihedralCharmm::weight",nd+1); - d_k = k_k.d_view; - d_multiplicity = k_multiplicity.d_view; - d_shift = k_shift.d_view; - d_cos_shift = k_cos_shift.d_view; - d_sin_shift = k_sin_shift.d_view; - d_weight = k_weight.d_view; + d_k = k_k.template view(); + d_multiplicity = k_multiplicity.template view(); + d_shift = k_shift.template view(); + d_cos_shift = k_cos_shift.template view(); + d_sin_shift = k_sin_shift.template view(); + d_weight = k_weight.template view(); int n = atom->ndihedraltypes; for (int i = 1; i <= n; i++) { @@ -479,10 +479,10 @@ void DihedralCharmmKokkos::init_style() Kokkos::DualView k_lj14_3("DihedralCharmm:lj14_3",n+1,n+1); Kokkos::DualView k_lj14_4("DihedralCharmm:lj14_4",n+1,n+1); - d_lj14_1 = k_lj14_1.d_view; - d_lj14_2 = k_lj14_2.d_view; - d_lj14_3 = k_lj14_3.d_view; - d_lj14_4 = k_lj14_4.d_view; + d_lj14_1 = k_lj14_1.template view(); + d_lj14_2 = k_lj14_2.template view(); + d_lj14_3 = k_lj14_3.template view(); + d_lj14_4 = k_lj14_4.template view(); if (weightflag) { diff --git a/src/KOKKOS/dihedral_class2_kokkos.cpp b/src/KOKKOS/dihedral_class2_kokkos.cpp index 89e42c6f83..d32ea4a461 100644 --- a/src/KOKKOS/dihedral_class2_kokkos.cpp +++ b/src/KOKKOS/dihedral_class2_kokkos.cpp @@ -24,7 +24,7 @@ #include "domain.h" #include "force.h" #include "update.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -56,8 +56,8 @@ template DihedralClass2Kokkos::~DihedralClass2Kokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -75,13 +75,13 @@ void DihedralClass2Kokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom"); d_eatom = k_eatom.template view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom"); d_vatom = k_vatom.template view(); } diff --git a/src/KOKKOS/dihedral_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp index e37d4d2ef5..4349aff48d 100644 --- a/src/KOKKOS/dihedral_opls_kokkos.cpp +++ b/src/KOKKOS/dihedral_opls_kokkos.cpp @@ -24,7 +24,7 @@ #include "domain.h" #include "force.h" #include "update.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -56,8 +56,8 @@ template DihedralOPLSKokkos::~DihedralOPLSKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -75,13 +75,13 @@ void DihedralOPLSKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom"); d_vatom = k_vatom.view(); } @@ -348,10 +348,10 @@ void DihedralOPLSKokkos::allocate() k_k3 = DAT::tdual_ffloat_1d("DihedralOPLS::k3",n+1); k_k4 = DAT::tdual_ffloat_1d("DihedralOPLS::k4",n+1); - d_k1 = k_k1.d_view; - d_k2 = k_k2.d_view; - d_k3 = k_k3.d_view; - d_k4 = k_k4.d_view; + d_k1 = k_k1.template view(); + d_k2 = k_k2.template view(); + d_k3 = k_k3.template view(); + d_k4 = k_k4.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/dihedral_opls_kokkos.h b/src/KOKKOS/dihedral_opls_kokkos.h index 0a8860c87c..2594f5e74d 100644 --- a/src/KOKKOS/dihedral_opls_kokkos.h +++ b/src/KOKKOS/dihedral_opls_kokkos.h @@ -83,10 +83,10 @@ class DihedralOPLSKokkos : public DihedralOPLS { DAT::tdual_ffloat_1d k_k3; DAT::tdual_ffloat_1d k_k4; - DAT::t_ffloat_1d d_k1; - DAT::t_ffloat_1d d_k2; - DAT::t_ffloat_1d d_k3; - DAT::t_ffloat_1d d_k4; + typename AT::t_ffloat_1d d_k1; + typename AT::t_ffloat_1d d_k2; + typename AT::t_ffloat_1d d_k3; + typename AT::t_ffloat_1d d_k4; virtual void allocate(); }; diff --git a/src/KOKKOS/domain_kokkos.cpp b/src/KOKKOS/domain_kokkos.cpp index 4bf8dc9841..d9c1332778 100644 --- a/src/KOKKOS/domain_kokkos.cpp +++ b/src/KOKKOS/domain_kokkos.cpp @@ -99,7 +99,6 @@ void DomainKokkos::reset_box() DomainResetBoxFunctor f(atomKK->k_x); Kokkos::parallel_reduce(nlocal,f,result); - LMPDeviceType::fence(); double (*extent)[2] = result.value; double all[3][2]; @@ -384,7 +383,6 @@ void DomainKokkos::pbc() Kokkos::parallel_for(nlocal,f); } } - LMPDeviceType::fence(); atomKK->modified(Device,X_MASK|V_MASK|IMAGE_MASK); } @@ -424,7 +422,6 @@ void DomainKokkos::remap_all() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - LMPDeviceType::fence(); copymode = 0; atomKK->modified(Device,X_MASK | IMAGE_MASK); @@ -528,7 +525,6 @@ void DomainKokkos::image_flip(int m_in, int n_in, int p_in) copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - LMPDeviceType::fence(); copymode = 0; atomKK->modified(Device,IMAGE_MASK); @@ -561,7 +557,6 @@ void DomainKokkos::lamda2x(int n) copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - LMPDeviceType::fence(); copymode = 0; atomKK->modified(Device,X_MASK); @@ -587,7 +582,6 @@ void DomainKokkos::x2lamda(int n) copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - LMPDeviceType::fence(); copymode = 0; atomKK->modified(Device,X_MASK); diff --git a/src/KOKKOS/fix_deform_kokkos.h b/src/KOKKOS/fix_deform_kokkos.h index 8fa12a2e37..69f65fbcf4 100644 --- a/src/KOKKOS/fix_deform_kokkos.h +++ b/src/KOKKOS/fix_deform_kokkos.h @@ -14,6 +14,8 @@ #ifdef FIX_CLASS FixStyle(deform/kk,FixDeformKokkos) +FixStyle(deform/kk/device,FixDeformKokkos) +FixStyle(deform/kk/host,FixDeformKokkos) #else diff --git a/src/KOKKOS/fix_dpd_energy_kokkos.cpp b/src/KOKKOS/fix_dpd_energy_kokkos.cpp new file mode 100644 index 0000000000..e6878afed4 --- /dev/null +++ b/src/KOKKOS/fix_dpd_energy_kokkos.cpp @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_dpd_energy_kokkos.h" +#include "atom_masks.h" +#include "atom_kokkos.h" +#include "force.h" +#include "update.h" +#include "respa.h" +#include "modify.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +template +FixDPDenergyKokkos::FixDPDenergyKokkos(LAMMPS *lmp, int narg, char **arg) : + FixDPDenergy(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + pairDPDEKK = dynamic_cast(pairDPDE); + if (!pairDPDEKK) + error->all(FLERR,"Must use pair_style dpd/fdt/energy/kk with fix dpd/energy/kk"); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixDPDenergyKokkos::take_half_step() +{ + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + using AT = ArrayTypes; + + atomKK->sync(execution_space, UCOND_MASK); + typename AT::t_efloat_1d uCond = atomKK->k_uCond.view(); + atomKK->sync(execution_space, UMECH_MASK); + typename AT::t_efloat_1d uMech = atomKK->k_uMech.view(); + + pairDPDEKK->k_duCond.template sync(); + typename AT::t_efloat_1d_const duCond = pairDPDEKK->k_duCond.template view(); + pairDPDEKK->k_duMech.template sync(); + typename AT::t_efloat_1d_const duMech = pairDPDEKK->k_duMech.template view(); + + auto dt = update->dt; + + Kokkos::parallel_for(nlocal, LAMMPS_LAMBDA(int i) { + uCond(i) += 0.5*dt*duCond(i); + uMech(i) += 0.5*dt*duMech(i); + }); + + atomKK->modified(execution_space, UCOND_MASK); + atomKK->modified(execution_space, UMECH_MASK); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixDPDenergyKokkos::initial_integrate(int) +{ + take_half_step(); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixDPDenergyKokkos::final_integrate() +{ + take_half_step(); +} + +namespace LAMMPS_NS { +template class FixDPDenergyKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class FixDPDenergyKokkos; +#endif +} diff --git a/src/KOKKOS/fix_dpd_energy_kokkos.h b/src/KOKKOS/fix_dpd_energy_kokkos.h new file mode 100644 index 0000000000..ebf3a796fe --- /dev/null +++ b/src/KOKKOS/fix_dpd_energy_kokkos.h @@ -0,0 +1,54 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(dpd/energy/kk,FixDPDenergyKokkos) +FixStyle(dpd/energy/kk/device,FixDPDenergyKokkos) +FixStyle(dpd/energy/kk/host,FixDPDenergyKokkos) + +#else + +#ifndef LMP_FIX_DPDE_KOKKOS_H +#define LMP_FIX_DPDE_KOKKOS_H + +#include "fix_dpd_energy.h" +#include "pair_dpd_fdt_energy_kokkos.h" + +namespace LAMMPS_NS { + +template +class FixDPDenergyKokkos : public FixDPDenergy { + public: + FixDPDenergyKokkos(class LAMMPS *, int, char **); + virtual ~FixDPDenergyKokkos() {} + virtual void initial_integrate(int); + virtual void final_integrate(); + + void take_half_step(); + protected: + PairDPDfdtEnergyKokkos* pairDPDEKK; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Must use pair_style dpd/fdt/energy/kk with fix dpd/energy/kk + +Self-explanatory. + +*/ diff --git a/src/KOKKOS/fix_eos_table_rx_kokkos.cpp b/src/KOKKOS/fix_eos_table_rx_kokkos.cpp new file mode 100644 index 0000000000..5c106c19f3 --- /dev/null +++ b/src/KOKKOS/fix_eos_table_rx_kokkos.cpp @@ -0,0 +1,569 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (Sandia) +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_eos_table_rx_kokkos.h" +#include "atom_kokkos.h" +#include "error.h" +#include "force.h" +#include "memory_kokkos.h" +#include "comm.h" +#include +#include "modify.h" +#include "atom_masks.h" + +#define MAXLINE 1024 + +#ifdef DBL_EPSILON + #define MY_EPSILON (10.0*DBL_EPSILON) +#else + #define MY_EPSILON (10.0*2.220446049250313e-16) +#endif + + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +template +FixEOStableRXKokkos::FixEOStableRXKokkos(LAMMPS *lmp, int narg, char **arg) : + FixEOStableRX(lmp, narg, arg) +{ + kokkosable = 1; + + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + update_table = 1; + h_table = new TableHost(); + d_table = new TableDevice(); + + k_error_flag = DAT::tdual_int_scalar("fix:error_flag"); + k_warning_flag = DAT::tdual_int_scalar("fix:warning_flag"); + + k_dHf = DAT::tdual_float_1d("fix:dHf",nspecies); + k_energyCorr = DAT::tdual_float_1d("fix:energyCorr",nspecies); + k_tempCorrCoeff = DAT::tdual_float_1d("fix:tempCorrCoeff",nspecies); + k_moleculeCorrCoeff = DAT::tdual_float_1d("fix:moleculeCorrCoeff",nspecies); + for (int n = 0; n < nspecies; n++) { + k_dHf.h_view(n) = dHf[n]; + k_energyCorr.h_view(n) = energyCorr[n]; + k_tempCorrCoeff.h_view(n) = tempCorrCoeff[n]; + k_moleculeCorrCoeff.h_view(n) = moleculeCorrCoeff[n]; + } + + k_dHf.modify(); + k_dHf.sync(); + d_dHf = k_dHf.view(); + + k_energyCorr.modify(); + k_energyCorr.sync(); + d_energyCorr = k_energyCorr.view(); + + k_tempCorrCoeff.modify(); + k_tempCorrCoeff.sync(); + d_tempCorrCoeff = k_tempCorrCoeff.view(); + + k_moleculeCorrCoeff.modify(); + k_moleculeCorrCoeff.sync(); + d_moleculeCorrCoeff = k_moleculeCorrCoeff.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +FixEOStableRXKokkos::~FixEOStableRXKokkos() +{ + if (copymode) return; + + delete h_table; + delete d_table; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::setup(int vflag) +{ + if (update_table) + create_kokkos_tables(); + + copymode = 1; + + int nlocal = atom->nlocal; + boltz = force->boltz; + mask = atomKK->k_mask.view(); + uCond = atomKK->k_uCond.view(); + uMech = atomKK->k_uMech.view(); + uChem = atomKK->k_uChem.view(); + dpdTheta= atomKK->k_dpdTheta.view(); + uCG = atomKK->k_uCG.view(); + uCGnew = atomKK->k_uCGnew.view(); + dvector = atomKK->k_dvector.view(); + + if (!this->restart_reset) { + atomKK->sync(execution_space,MASK_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + } + + // Communicate the updated momenta and velocities to all nodes + atomKK->sync(Host,UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + comm->forward_comm_fix(this); + atomKK->modified(Host,UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + atomKK->sync(execution_space,MASK_MASK | UCOND_MASK | UMECH_MASK | UCHEM_MASK | DPDTHETA_MASK | DVECTOR_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,DPDTHETA_MASK); + + error_check(); + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void FixEOStableRXKokkos::operator()(TagFixEOStableRXSetup, const int &i) const { + if (mask[i] & groupbit) { + const double duChem = uCG[i] - uCGnew[i]; + uChem[i] += duChem; + uCG[i] = 0.0; + uCGnew[i] = 0.0; + } +} + +template +KOKKOS_INLINE_FUNCTION +void FixEOStableRXKokkos::operator()(TagFixEOStableRXTemperatureLookup, const int &i) const { + if (mask[i] & groupbit) + temperature_lookup(i,uCond[i]+uMech[i]+uChem[i],dpdTheta[i]); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::init() +{ + if (update_table) + create_kokkos_tables(); + + copymode = 1; + + int nlocal = atom->nlocal; + boltz = force->boltz; + mask = atomKK->k_mask.view(); + uCond = atomKK->k_uCond.view(); + uMech = atomKK->k_uMech.view(); + uChem = atomKK->k_uChem.view(); + dpdTheta= atomKK->k_dpdTheta.view(); + dvector = atomKK->k_dvector.view(); + + if (this->restart_reset) { + atomKK->sync(execution_space,MASK_MASK | UCOND_MASK | UMECH_MASK | UCHEM_MASK | DPDTHETA_MASK | DVECTOR_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,DPDTHETA_MASK); + } else { + atomKK->sync(execution_space,MASK_MASK | UCOND_MASK | UMECH_MASK | UCHEM_MASK | DPDTHETA_MASK | DVECTOR_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,UCOND_MASK | UMECH_MASK | UCHEM_MASK); + } + + error_check(); + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void FixEOStableRXKokkos::operator()(TagFixEOStableRXInit, const int &i) const { + double tmp; + if (mask[i] & groupbit) { + if(dpdTheta[i] <= 0.0) + k_error_flag.template view()() = 1; + energy_lookup(i,dpdTheta[i],tmp); + uCond[i] = 0.0; + uMech[i] = tmp; + uChem[i] = 0.0; + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::post_integrate() +{ + if (update_table) + create_kokkos_tables(); + + copymode = 1; + + int nlocal = atom->nlocal; + boltz = force->boltz; + mask = atomKK->k_mask.view(); + uCond = atomKK->k_uCond.view(); + uMech = atomKK->k_uMech.view(); + uChem = atomKK->k_uChem.view(); + dpdTheta= atomKK->k_dpdTheta.view(); + dvector = atomKK->k_dvector.view(); + + atomKK->sync(execution_space,MASK_MASK | UCOND_MASK | UMECH_MASK | UCHEM_MASK | DPDTHETA_MASK | DVECTOR_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,DPDTHETA_MASK); + + error_check(); + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void FixEOStableRXKokkos::operator()(TagFixEOStableRXTemperatureLookup2, const int &i) const { + if (mask[i] & groupbit){ + temperature_lookup(i,uCond[i]+uMech[i]+uChem[i],dpdTheta[i]); + if (dpdTheta[i] <= 0.0) + k_error_flag.template view()() = 1; + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::end_of_step() +{ + if (update_table) + create_kokkos_tables(); + + copymode = 1; + + int nlocal = atom->nlocal; + boltz = force->boltz; + mask = atomKK->k_mask.view(); + uCond = atomKK->k_uCond.view(); + uMech = atomKK->k_uMech.view(); + uChem = atomKK->k_uChem.view(); + dpdTheta= atomKK->k_dpdTheta.view(); + uCG = atomKK->k_uCG.view(); + uCGnew = atomKK->k_uCGnew.view(); + dvector = atomKK->k_dvector.view(); + + + // Communicate the ghost uCGnew + atomKK->sync(Host,UCG_MASK | UCGNEW_MASK); + comm->reverse_comm_fix(this); + atomKK->modified(Host,UCG_MASK | UCGNEW_MASK); + + atomKK->sync(execution_space,MASK_MASK | UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + // Communicate the updated momenta and velocities to all nodes + atomKK->sync(Host,UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + comm->forward_comm_fix(this); + atomKK->modified(Host,UCHEM_MASK | UCG_MASK | UCGNEW_MASK); + + atomKK->sync(execution_space,MASK_MASK | UCOND_MASK | UMECH_MASK | UCHEM_MASK | DPDTHETA_MASK | DVECTOR_MASK); + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + atomKK->modified(execution_space,DPDTHETA_MASK); + + error_check(); + + copymode = 0; +} + +/* ---------------------------------------------------------------------- + calculate potential ui at temperature thetai +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixEOStableRXKokkos::energy_lookup(int id, double thetai, double &ui) const +{ + int itable, nPG; + double fraction, uTmp, nMolecules, nTotal, nTotalPG; + double tolerance = 1.0e-10; + + ui = 0.0; + nTotal = 0.0; + nTotalPG = 0.0; + nPG = 0; + + if (rx_flag) { + for (int ispecies = 0; ispecies < nspecies; ispecies++ ) { + nTotal += dvector(ispecies,id); + if (fabs(d_moleculeCorrCoeff[ispecies]) > tolerance) { + nPG++; + nTotalPG += dvector(ispecies,id); + } + } + } else { + nTotal = 1.0; + } + + for(int ispecies=0;ispecieslo); + thetai = MAX(thetai,d_table_const.lo(ispecies)); + //thetai = MIN(thetai,tb->hi); + thetai = MIN(thetai,d_table_const.hi(ispecies)); + + if (tabstyle == LINEAR) { + //itable = static_cast ((thetai - tb->lo) * tb->invdelta); + itable = static_cast ((thetai - d_table_const.lo(ispecies)) * d_table_const.invdelta(ispecies)); + //fraction = (thetai - tb->r[itable]) * tb->invdelta; + fraction = (thetai - d_table_const.r(ispecies,itable)) * d_table_const.invdelta(ispecies); + //uTmp = tb->e[itable] + fraction*tb->de[itable]; + uTmp = d_table_const.e(ispecies,itable) + fraction*d_table_const.de(ispecies,itable); + + uTmp += d_dHf[ispecies]; + uTmp += d_tempCorrCoeff[ispecies]*thetai; // temperature correction + uTmp += d_energyCorr[ispecies]; // energy correction + if (nPG > 0) ui += d_moleculeCorrCoeff[ispecies]*nTotalPG/double(nPG); // molecule correction + + if (rx_flag) nMolecules = dvector(ispecies,id); + else nMolecules = 1.0; + ui += nMolecules*uTmp; + } + } + ui = ui - double(nTotal+1.5)*boltz*thetai; +} + +/* ---------------------------------------------------------------------- + calculate temperature thetai at energy ui +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixEOStableRXKokkos::temperature_lookup(int id, double ui, double &thetai) const +{ + //Table *tb = &tables[0]; + + int it; + double t1,t2,u1,u2,f1,f2; + double maxit = 100; + double temp; + double delta = 0.001; + double tolerance = 1.0e-10; + int lo = d_table_const.lo(0); + int hi = d_table_const.hi(0); + + // Store the current thetai in t1 + t1 = MAX(thetai,lo); + t1 = MIN(t1,hi); + if(t1==hi) delta = -delta; + + // Compute u1 at thetai + energy_lookup(id,t1,u1); + + // Compute f1 + f1 = u1 - ui; + + // Compute guess of t2 + t2 = (1.0 + delta)*t1; + + // Compute u2 at t2 + energy_lookup(id,t2,u2); + + // Compute f1 + f2 = u2 - ui; + + // Apply the Secant Method + for(it=0; it()() = 2; + temp = t1; + temp = MAX(temp,lo); + temp = MIN(temp,hi); + k_warning_flag.template view()() = 1; + break; + } + temp = t2 - f2*(t2-t1)/(f2-f1); + if(fabs(temp-t2) < tolerance) break; + f1 = f2; + t1 = t2; + t2 = temp; + energy_lookup(id,t2,u2); + f2 = u2 - ui; + } + if(it==maxit){ + if(isnan(f1) || isnan(f2) || isnan(ui) || isnan(thetai) || isnan(t1) || isnan(t2)) + k_error_flag.template view()() = 2; + else + k_error_flag.template view()() = 3; + } + thetai = temp; +} + +/* ---------------------------------------------------------------------- */ + +template +int FixEOStableRXKokkos::pack_forward_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) +{ + int ii,jj,m; + HAT::t_efloat_1d h_uChem = atomKK->k_uChem.h_view; + HAT::t_efloat_1d h_uCG = atomKK->k_uCG.h_view; + HAT::t_efloat_1d h_uCGnew = atomKK->k_uCGnew.h_view; + + m = 0; + for (ii = 0; ii < n; ii++) { + jj = list[ii]; + buf[m++] = h_uChem[jj]; + buf[m++] = h_uCG[jj]; + buf[m++] = h_uCGnew[jj]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::unpack_forward_comm(int n, int first, double *buf) +{ + int ii,m,last; + HAT::t_efloat_1d h_uChem = atomKK->k_uChem.h_view; + HAT::t_efloat_1d h_uCG = atomKK->k_uCG.h_view; + HAT::t_efloat_1d h_uCGnew = atomKK->k_uCGnew.h_view; + + m = 0; + last = first + n ; + for (ii = first; ii < last; ii++){ + h_uChem[ii] = buf[m++]; + h_uCG[ii] = buf[m++]; + h_uCGnew[ii] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +int FixEOStableRXKokkos::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + HAT::t_efloat_1d h_uCG = atomKK->k_uCG.h_view; + HAT::t_efloat_1d h_uCGnew = atomKK->k_uCGnew.h_view; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = h_uCG[i]; + buf[m++] = h_uCGnew[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + HAT::t_efloat_1d h_uCG = atomKK->k_uCG.h_view; + HAT::t_efloat_1d h_uCGnew = atomKK->k_uCGnew.h_view; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + + h_uCG[j] += buf[m++]; + h_uCGnew[j] += buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::error_check() +{ + k_error_flag.template modify(); + k_error_flag.template sync(); + if (k_error_flag.h_view() == 1) + error->one(FLERR,"Internal temperature <= zero"); + else if (k_error_flag.h_view() == 2) + error->one(FLERR,"NaN detected in secant solver."); + else if (k_error_flag.h_view() == 3) + error->one(FLERR,"Maxit exceeded in secant solver."); + + k_warning_flag.template modify(); + k_warning_flag.template sync(); + if (k_warning_flag.h_view()) { + error->warning(FLERR,"Secant solver did not converge because table bounds were exceeded."); + k_warning_flag.h_view() = 0; + k_warning_flag.template modify(); + k_warning_flag.template sync(); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixEOStableRXKokkos::create_kokkos_tables() +{ + const int tlm1 = tablength-1; + + memoryKK->create_kokkos(d_table->lo,h_table->lo,ntables,"Table::lo"); + memoryKK->create_kokkos(d_table->hi,h_table->hi,ntables,"Table::hi"); + memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); + + if(tabstyle == LINEAR) { + memoryKK->create_kokkos(d_table->r,h_table->r,ntables,tablength,"Table::r"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de"); + } + + for(int i=0; i < ntables; i++) { + Table* tb = &tables[i]; + + h_table->lo[i] = tb->lo; + h_table->hi[i] = tb->hi; + h_table->invdelta[i] = tb->invdelta; + + for(int j = 0; jr.dimension_1(); j++) + h_table->r(i,j) = tb->r[j]; + for(int j = 0; je.dimension_1(); j++) + h_table->e(i,j) = tb->e[j]; + for(int j = 0; jde.dimension_1(); j++) + h_table->de(i,j) = tb->de[j]; + } + + Kokkos::deep_copy(d_table->lo,h_table->lo); + Kokkos::deep_copy(d_table->hi,h_table->hi); + Kokkos::deep_copy(d_table->invdelta,h_table->invdelta); + Kokkos::deep_copy(d_table->r,h_table->r); + Kokkos::deep_copy(d_table->e,h_table->e); + Kokkos::deep_copy(d_table->de,h_table->de); + + d_table_const.lo = d_table->lo; + d_table_const.hi = d_table->hi; + d_table_const.invdelta = d_table->invdelta; + d_table_const.r = d_table->r; + d_table_const.e = d_table->e; + d_table_const.de = d_table->de; + + update_table = 0; +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class FixEOStableRXKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class FixEOStableRXKokkos; +#endif +} diff --git a/src/KOKKOS/fix_eos_table_rx_kokkos.h b/src/KOKKOS/fix_eos_table_rx_kokkos.h new file mode 100644 index 0000000000..91d73f1036 --- /dev/null +++ b/src/KOKKOS/fix_eos_table_rx_kokkos.h @@ -0,0 +1,212 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(eos/table/rx/kk,FixEOStableRXKokkos) +FixStyle(eos/table/rx/kk/device,FixEOStableRXKokkos) +FixStyle(eos/table/rx/kk/host,FixEOStableRXKokkos) + +#else + +#ifndef LMP_FIX_EOS_TABLE_RX_KOKKOS_H +#define LMP_FIX_EOS_TABLE_RX_KOKKOS_H + +#include "fix_eos_table_rx.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct TagFixEOStableRXInit{}; +struct TagFixEOStableRXSetup{}; +struct TagFixEOStableRXTemperatureLookup{}; +struct TagFixEOStableRXTemperatureLookup2{}; + +template +class FixEOStableRXKokkos : public FixEOStableRX { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef EV_FLOAT value_type; + + FixEOStableRXKokkos(class LAMMPS *, int, char **); + virtual ~FixEOStableRXKokkos(); + void setup(int); + void init(); + void post_integrate(); + void end_of_step(); + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEOStableRXInit, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEOStableRXSetup, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEOStableRXTemperatureLookup, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixEOStableRXTemperatureLookup2, const int&) const; + + KOKKOS_INLINE_FUNCTION + void energy_lookup(int, double, double &) const; + + KOKKOS_INLINE_FUNCTION + void temperature_lookup(int, double, double &) const; + + protected: + //struct Table { + // int ninput; + // double lo,hi; + // double *rfile,*efile; + // double *e2file; + // double delta,invdelta,deltasq6; + // double *r,*e,*de,*e2; + //}; + //Table *tables, *tables2; + + /*struct TableDeviceConst { + typename ArrayTypes::t_int_1d_randomread lo,hi; + typename ArrayTypes::t_ffloat_1d_randomread invdelta; + typename ArrayTypes::t_ffloat_2d_randomread r,e,de; + };*/ + //Its faster not to use texture fetch if the number of tables is less than 32! + struct TableDeviceConst { + typename ArrayTypes::t_int_1d lo,hi; + typename ArrayTypes::t_ffloat_1d invdelta; + typename ArrayTypes::t_ffloat_2d_randomread r,e,de; + }; + + struct TableDevice { + typename ArrayTypes::t_int_1d lo,hi; + typename ArrayTypes::t_ffloat_1d invdelta; + typename ArrayTypes::t_ffloat_2d r,e,de; + }; + + struct TableHost { + typename ArrayTypes::t_int_1d lo,hi; + typename ArrayTypes::t_ffloat_1d invdelta; + typename ArrayTypes::t_ffloat_2d r,e,de; + }; + + TableDeviceConst d_table_const; + TableDevice* d_table; + TableHost* h_table; + + int **tabindex; + + double boltz; + + void allocate(); + void error_check(); + int update_table; + void create_kokkos_tables(); + + DAT::tdual_float_1d k_dHf,k_energyCorr,k_tempCorrCoeff,k_moleculeCorrCoeff; + typename AT::t_float_1d d_dHf,d_energyCorr,d_tempCorrCoeff,d_moleculeCorrCoeff; + + typename AT::t_int_1d mask; + typename AT::t_efloat_1d uCond,uMech,uChem,uCG,uCGnew,rho,dpdTheta,duChem; + typename AT::t_float_2d dvector; + + DAT::tdual_int_scalar k_error_flag; + DAT::tdual_int_scalar k_warning_flag; + + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + int pack_forward_comm(int , int *, double *, int, int *); + void unpack_forward_comm(int , int , double *); + + }; +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: FixEOStableRXKokkos requires a fix rx command. + +The fix rx command must come before the pair style command in the input file + +E: There are no rx species specified + +There must be at least one species specified through the fix rx command + +E: Invalid eos/table/rx length + +The eos/table/rx table must have more than one entry. + +E: eos/table/rx values are not increasing + +The equation-of-state must an increasing function + +E: FixEOStableRX requires atom_style with internal temperature and energies (e.g. dpd) + +Self-explanatory. + +E: Internal temperature <= zero. + +Self-explanatory. + +E: Cannot open eos table/rx potential file %s + +Self-explanatory. + +E: Incorrect format in eos table/rx file + +Self-explanatory. + +E: Cannot open file %s + +Self-explanatory. + +E: Did not find keyword in table file + +Self-explanatory. + +E: Illegal fix eos/table/rx command + +Incorrect number of arguments specified for the fix eos/table/rx command. + +E: Invalid keyword in fix eos/table/rx parameters + +Self-explanatory. + +E: The number of columns in fix eos/table/rx does not match the number of species. + +Self-explanatory. Check format for fix eos/table/rx file. + +E: fix eos/table/rx parameters did not set N + +The number of table entries was not set in the eos/table/rx file + +W: Secant solver did not converge because table bounds were exceeded + +The secant solver failed to converge, resulting in the lower or upper table bound temperature to be returned + +E: NaN detected in secant solver. + +Self-explanatory. + +E: Maxit exceeded in secant solver + +The maximum number of interations was exceeded in the secant solver + +*/ diff --git a/src/KOKKOS/fix_langevin_kokkos.cpp b/src/KOKKOS/fix_langevin_kokkos.cpp index fb0f329a91..108c3b692a 100644 --- a/src/KOKKOS/fix_langevin_kokkos.cpp +++ b/src/KOKKOS/fix_langevin_kokkos.cpp @@ -21,7 +21,7 @@ #include "update.h" #include "respa.h" #include "error.h" -#include "memory.h" +#include "memory_kokkos.h" #include "group.h" #include "random_mars.h" #include "compute.h" @@ -49,9 +49,9 @@ FixLangevinKokkos::FixLangevinKokkos(LAMMPS *lmp, int narg, char **a int ntypes = atomKK->ntypes; // allocate per-type arrays for force prefactors - memory->create_kokkos(k_gfactor1,gfactor1,ntypes+1,"langevin:gfactor1"); - memory->create_kokkos(k_gfactor2,gfactor2,ntypes+1,"langevin:gfactor2"); - memory->create_kokkos(k_ratio,ratio,ntypes+1,"langevin:ratio"); + memoryKK->create_kokkos(k_gfactor1,gfactor1,ntypes+1,"langevin:gfactor1"); + memoryKK->create_kokkos(k_gfactor2,gfactor2,ntypes+1,"langevin:gfactor2"); + memoryKK->create_kokkos(k_ratio,ratio,ntypes+1,"langevin:ratio"); d_gfactor1 = k_gfactor1.template view(); h_gfactor1 = k_gfactor1.template view(); d_gfactor2 = k_gfactor2.template view(); @@ -92,12 +92,12 @@ FixLangevinKokkos::FixLangevinKokkos(LAMMPS *lmp, int narg, char **a template FixLangevinKokkos::~FixLangevinKokkos() { - memory->destroy_kokkos(k_gfactor1,gfactor1); - memory->destroy_kokkos(k_gfactor2,gfactor2); - memory->destroy_kokkos(k_ratio,ratio); - memory->destroy_kokkos(k_flangevin,flangevin); - if(gjfflag) memory->destroy_kokkos(k_franprev,franprev); - memory->destroy_kokkos(k_tforce,tforce); + memoryKK->destroy_kokkos(k_gfactor1,gfactor1); + memoryKK->destroy_kokkos(k_gfactor2,gfactor2); + memoryKK->destroy_kokkos(k_ratio,ratio); + memoryKK->destroy_kokkos(k_flangevin,flangevin); + if(gjfflag) memoryKK->destroy_kokkos(k_franprev,franprev); + memoryKK->destroy_kokkos(k_tforce,tforce); } /* ---------------------------------------------------------------------- */ @@ -121,7 +121,7 @@ void FixLangevinKokkos::init() template void FixLangevinKokkos::grow_arrays(int nmax) { - memory->grow_kokkos(k_franprev,franprev,nmax,3,"langevin:franprev"); + memoryKK->grow_kokkos(k_franprev,franprev,nmax,3,"langevin:franprev"); d_franprev = k_franprev.template view(); h_franprev = k_franprev.template view(); } @@ -167,9 +167,9 @@ void FixLangevinKokkos::post_force(int vflag) // reallocate flangevin if necessary if (tallyflag) { if (nlocal > maxatom1) { - memory->destroy_kokkos(k_flangevin,flangevin); + memoryKK->destroy_kokkos(k_flangevin,flangevin); maxatom1 = atomKK->nmax; - memory->create_kokkos(k_flangevin,flangevin,maxatom1,3,"langevin:flangevin"); + memoryKK->create_kokkos(k_flangevin,flangevin,maxatom1,3,"langevin:flangevin"); d_flangevin = k_flangevin.template view(); h_flangevin = k_flangevin.template view(); } @@ -671,8 +671,8 @@ void FixLangevinKokkos::compute_target() } else { if (atom->nmax > maxatom2) { maxatom2 = atom->nmax; - memory->destroy_kokkos(k_tforce,tforce); - memory->create_kokkos(k_tforce,tforce,maxatom2,"langevin:tforce"); + memoryKK->destroy_kokkos(k_tforce,tforce); + memoryKK->create_kokkos(k_tforce,tforce,maxatom2,"langevin:tforce"); d_tforce = k_tforce.template view(); h_tforce = k_tforce.template view(); } diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index fb03bf68c6..345259e355 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -33,7 +33,7 @@ #include "update.h" #include "respa.h" #include "domain_kokkos.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" #include "atom_kokkos.h" @@ -80,7 +80,7 @@ void FixNHKokkos::init() FixNH::init(); atomKK->k_mass.modify(); - atomKK->k_mass.sync(); + atomKK->k_mass.sync(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/fix_nve_kokkos.cpp b/src/KOKKOS/fix_nve_kokkos.cpp index eb41443bab..c071447eb7 100644 --- a/src/KOKKOS/fix_nve_kokkos.cpp +++ b/src/KOKKOS/fix_nve_kokkos.cpp @@ -46,7 +46,7 @@ void FixNVEKokkos::init() FixNVE::init(); atomKK->k_mass.modify(); - atomKK->k_mass.sync(); + atomKK->k_mass.sync(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp new file mode 100644 index 0000000000..9e29b6c35d --- /dev/null +++ b/src/KOKKOS/fix_property_atom_kokkos.cpp @@ -0,0 +1,73 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_property_atom_kokkos.h" +#include "atom_kokkos.h" +#include "comm.h" +#include "memory_kokkos.h" +#include "error.h" +#include "update.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum{MOLECULE,CHARGE,RMASS,INTEGER,DOUBLE}; + +/* ---------------------------------------------------------------------- */ + +FixPropertyAtomKokkos::FixPropertyAtomKokkos(LAMMPS *lmp, int narg, char **arg) : + FixPropertyAtom(lmp, narg, arg) +{ + atomKK = (AtomKokkos *) atom; + grow_arrays(atom->nmax); +} + +/* ---------------------------------------------------------------------- + allocate atom-based arrays + initialize new values to 0, + since AtomVec class won't do it as atoms are added, + e.g. in create_atom() or data_atom() +------------------------------------------------------------------------- */ + +void FixPropertyAtomKokkos::grow_arrays(int nmax) +{ + for (int m = 0; m < nvalue; m++) { + if (style[m] == MOLECULE) { + memory->grow(atom->molecule,nmax,"atom:molecule"); + size_t nbytes = (nmax-nmax_old) * sizeof(tagint); + memset(&atom->molecule[nmax_old],0,nbytes); + } else if (style[m] == CHARGE) { + memory->grow(atom->q,nmax,"atom:q"); + size_t nbytes = (nmax-nmax_old) * sizeof(double); + memset(&atom->q[nmax_old],0,nbytes); + } else if (style[m] == RMASS) { + memory->grow(atom->rmass,nmax,"atom:rmass"); + size_t nbytes = (nmax-nmax_old) * sizeof(double); + memset(&atom->rmass[nmax_old],0,nbytes); + } else if (style[m] == INTEGER) { + memory->grow(atom->ivector[index[m]],nmax,"atom:ivector"); + size_t nbytes = (nmax-nmax_old) * sizeof(int); + memset(&atom->ivector[index[m]][nmax_old],0,nbytes); + } else if (style[m] == DOUBLE) { + memoryKK->grow_kokkos(atomKK->k_dvector,atomKK->dvector,atomKK->k_dvector.dimension_0(),nmax, + "atom:dvector"); + //memory->grow(atom->dvector[index[m]],nmax,"atom:dvector"); + //size_t nbytes = (nmax-nmax_old) * sizeof(double); + //memset(&atom->dvector[index[m]][nmax_old],0,nbytes); + } + } + + nmax_old = nmax; +} diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h new file mode 100644 index 0000000000..ed1e4d7cfb --- /dev/null +++ b/src/KOKKOS/fix_property_atom_kokkos.h @@ -0,0 +1,90 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(property/atom/kk,FixPropertyAtomKokkos) + +#else + +#ifndef LMP_FIX_PROPERTY_ATOM_KOKKOS_H +#define LMP_FIX_PROPERTY_ATOM_KOKKOS_H + +#include "fix_property_atom.h" + +namespace LAMMPS_NS { + +class FixPropertyAtomKokkos : public FixPropertyAtom { + public: + FixPropertyAtomKokkos(class LAMMPS *, int, char **); + virtual ~FixPropertyAtomKokkos() {} + + void grow_arrays(int); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Fix property/atom mol when atom_style already has molecule attribute + +Self-explanatory. + +E: Fix property/atom cannot specify mol twice + +Self-explanatory. + +E: Fix property/atom q when atom_style already has charge attribute + +Self-explanatory. + +E: Fix property/atom cannot specify q twice + +Self-explanatory. + +E: Fix property/atom vector name already exists + +The name for an integer or floating-point vector must be unique. + +W: Fix property/atom mol or charge w/out ghost communication + +A model typically needs these properties defined for ghost atoms. + +E: Atom style was redefined after using fix property/atom + +This is not allowed. + +E: Incorrect %s format in data file + +A section of the data file being read by fix property/atom does +not have the correct number of values per line. + +E: Too few lines in %s section of data file + +Self-explanatory. + +E: Invalid atom ID in %s section of data file + +An atom in a section of the data file being read by fix property/atom +has an invalid atom ID that is <= 0 or > the maximum existing atom ID. + +*/ diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index cef003222a..ebf270bd78 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -35,7 +35,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "pair_reaxc_kokkos.h" @@ -63,6 +63,11 @@ FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg) : nmax = nmax = m_cap = 0; allocated_flag = 0; + nprev = 4; + + memory->destroy(s_hist); + memory->destroy(t_hist); + grow_arrays(atom->nmax); } /* ---------------------------------------------------------------------- */ @@ -71,6 +76,9 @@ template FixQEqReaxKokkos::~FixQEqReaxKokkos() { if (copymode) return; + + memoryKK->destroy_kokkos(k_s_hist,s_hist); + memoryKK->destroy_kokkos(k_t_hist,t_hist); } /* ---------------------------------------------------------------------- */ @@ -79,7 +87,7 @@ template void FixQEqReaxKokkos::init() { atomKK->k_q.modify(); - atomKK->k_q.sync(); + atomKK->k_q.sync(); FixQEqReax::init(); @@ -156,25 +164,11 @@ void FixQEqReaxKokkos::init_shielding_k() template void FixQEqReaxKokkos::init_hist() { - int i,j; - - k_s_hist = DAT::tdual_ffloat_2d("qeq/kk:s_hist",atom->nmax,5); - d_s_hist = k_s_hist.template view(); - h_s_hist = k_s_hist.h_view; - k_t_hist = DAT::tdual_ffloat_2d("qeq/kk:t_hist",atom->nmax,5); - d_t_hist = k_t_hist.template view(); - h_t_hist = k_t_hist.h_view; - - for( i = 0; i < atom->nmax; i++ ) - for( j = 0; j < 5; j++ ) - k_s_hist.h_view(i,j) = k_t_hist.h_view(i,j) = 0.0; - - k_s_hist.template modify(); - k_s_hist.template sync(); - - k_t_hist.template modify(); - k_t_hist.template sync(); + Kokkos::deep_copy(d_s_hist,0.0); + Kokkos::deep_copy(d_t_hist,0.0); + k_s_hist.template modify(); + k_t_hist.template modify(); } /* ---------------------------------------------------------------------- */ @@ -234,6 +228,8 @@ void FixQEqReaxKokkos::pre_force(int vflag) Kokkos::parallel_scan(inum,computeH_functor); // init_matvec + k_s_hist.template sync(); + k_t_hist.template sync(); FixQEqReaxKokkosMatVecFunctor matvec_functor(this); Kokkos::parallel_for(inum,matvec_functor); @@ -261,6 +257,8 @@ void FixQEqReaxKokkos::pre_force(int vflag) // calculate_Q(); calculate_q(); + k_s_hist.template modify(); + k_t_hist.template modify(); copymode = 0; @@ -333,14 +331,6 @@ void FixQEqReaxKokkos::allocate_array() k_d = DAT::tdual_ffloat_1d("qeq/kk:h_d",nmax); d_d = k_d.template view(); h_d = k_d.h_view; - - k_s_hist = DAT::tdual_ffloat_2d("qeq/kk:s_hist",nmax,5); - d_s_hist = k_s_hist.template view(); - h_s_hist = k_s_hist.h_view; - - k_t_hist = DAT::tdual_ffloat_2d("qeq/kk:t_hist",nmax,5); - d_t_hist = k_t_hist.template view(); - h_t_hist = k_t_hist.h_view; } // init_storage @@ -368,8 +358,6 @@ void FixQEqReaxKokkos::zero_item(int ii) const d_o[i] = 0.0; d_r[i] = 0.0; d_d[i] = 0.0; - //for( int j = 0; j < 5; j++ ) - //d_s_hist(i,j) = d_t_hist(i,j) = 0.0; } } @@ -404,19 +392,19 @@ void FixQEqReaxKokkos::compute_h_item(int ii, int &m_fill, const boo const X_FLOAT delz = x(j,2) - ztmp; if (neighflag != FULL) { + // skip half of the interactions const tagint jtag = tag(j); - flag = 0; - if (j < nlocal) flag = 1; - else if (itag < jtag) flag = 1; - else if (itag == jtag) { - if (delz > SMALL) flag = 1; - else if (fabs(delz) < SMALL) { - if (dely > SMALL) flag = 1; - else if (fabs(dely) < SMALL && delx > SMALL) - flag = 1; + if (j >= nlocal) { + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp && x(j,1) < ytmp) continue; + if (x(j,2) == ztmp && x(j,1) == ytmp && x(j,0) < xtmp) continue; } } - if (!flag) continue; } const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; @@ -461,7 +449,7 @@ double FixQEqReaxKokkos::calculate_H_k(const F_FLOAT &r, const F_FLO template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::mat_vec_item(int ii) const +void FixQEqReaxKokkos::matvec_item(int ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1087,7 +1075,7 @@ void FixQEqReaxKokkos::calculate_q_item(int ii) const if (mask[i] & groupbit) { q(i) = d_s[i] - delta * d_t[i]; - for (int k = 4; k > 0; --k) { + for (int k = nprev-1; k > 0; --k) { d_s_hist(i,k) = d_s_hist(i,k-1); d_t_hist(i,k) = d_t_hist(i,k-1); } @@ -1173,7 +1161,7 @@ double FixQEqReaxKokkos::memory_usage() { double bytes; - bytes = atom->nmax*5*2 * sizeof(F_FLOAT); // s_hist & t_hist + bytes = atom->nmax*nprev*2 * sizeof(F_FLOAT); // s_hist & t_hist bytes += atom->nmax*8 * sizeof(F_FLOAT); // storage bytes += n_cap*2 * sizeof(int); // matrix... bytes += m_cap * sizeof(int); @@ -1182,7 +1170,77 @@ double FixQEqReaxKokkos::memory_usage() return bytes; } -/* ---------------------------------------------------------------------- */\ +/* ---------------------------------------------------------------------- + allocate fictitious charge arrays +------------------------------------------------------------------------- */ + +template +void FixQEqReaxKokkos::grow_arrays(int nmax) +{ + k_s_hist.template sync(); // force reallocation on host + k_t_hist.template sync(); + + memoryKK->grow_kokkos(k_s_hist,s_hist,nmax,nprev,"qeq:s_hist"); + memoryKK->grow_kokkos(k_t_hist,t_hist,nmax,nprev,"qeq:t_hist"); + + d_s_hist = k_s_hist.template view(); + d_t_hist = k_t_hist.template view(); + + k_s_hist.template modify(); + k_t_hist.template modify(); +} + +/* ---------------------------------------------------------------------- + copy values within fictitious charge arrays +------------------------------------------------------------------------- */ + +template +void FixQEqReaxKokkos::copy_arrays(int i, int j, int delflag) +{ + k_s_hist.template sync(); + k_t_hist.template sync(); + + for (int m = 0; m < nprev; m++) { + s_hist[j][m] = s_hist[i][m]; + t_hist[j][m] = t_hist[i][m]; + } + + k_s_hist.template modify(); + k_t_hist.template modify(); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixQEqReaxKokkos::pack_exchange(int i, double *buf) +{ + k_s_hist.template sync(); + k_t_hist.template sync(); + + for (int m = 0; m < nprev; m++) buf[m] = s_hist[i][m]; + for (int m = 0; m < nprev; m++) buf[nprev+m] = t_hist[i][m]; + return nprev*2; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixQEqReaxKokkos::unpack_exchange(int nlocal, double *buf) +{ + for (int m = 0; m < nprev; m++) s_hist[nlocal][m] = buf[m]; + for (int m = 0; m < nprev; m++) t_hist[nlocal][m] = buf[nprev+m]; + + k_s_hist.template modify(); + k_t_hist.template modify(); + + return nprev*2; +} + +/* ---------------------------------------------------------------------- */ namespace LAMMPS_NS { template class FixQEqReaxKokkos; diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.h b/src/KOKKOS/fix_qeq_reax_kokkos.h index 9014e20b8e..517b541f6f 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.h +++ b/src/KOKKOS/fix_qeq_reax_kokkos.h @@ -57,7 +57,7 @@ class FixQEqReaxKokkos : public FixQEqReax { void compute_h_item(int, int &, const bool &) const; KOKKOS_INLINE_FUNCTION - void mat_vec_item(int) const; + void matvec_item(int) const; KOKKOS_INLINE_FUNCTION void sparse12_item(int) const; @@ -145,7 +145,7 @@ class FixQEqReaxKokkos : public FixQEqReax { void unpack_reverse_comm(int, int *, double *); double memory_usage(); - protected: + private: int inum; int allocated_flag; @@ -210,6 +210,10 @@ class FixQEqReaxKokkos : public FixQEqReax { typename AT::t_int_2d d_sendlist; typename AT::t_xfloat_1d_um v_buf; + void grow_arrays(int); + void copy_arrays(int, int, int); + int pack_exchange(int, double *); + int unpack_exchange(int, double *); }; template @@ -235,7 +239,7 @@ struct FixQEqReaxKokkosMatVecFunctor { }; KOKKOS_INLINE_FUNCTION void operator()(const int ii) const { - c.mat_vec_item(ii); + c.matvec_item(ii); } }; diff --git a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp b/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp index e4fb9385a5..586daadd55 100644 --- a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp +++ b/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp @@ -31,7 +31,7 @@ #include "compute.h" #include "input.h" #include "variable.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "reaxc_list.h" #include "reaxc_types.h" @@ -64,7 +64,7 @@ FixReaxCBondsKokkos::~FixReaxCBondsKokkos() void FixReaxCBondsKokkos::init() { - Pair *pair_kk = force->pair_match("reax/c/kk",1); + Pair *pair_kk = force->pair_match("reax/c/kk",0); if (pair_kk == NULL) error->all(FLERR,"Cannot use fix reax/c/bonds without " "pair_style reax/c/kk"); @@ -95,7 +95,7 @@ void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint ntimestep, FILE *fp) MPI_Allreduce(&nlocal,&nlocal_max,1,MPI_INT,MPI_MAX,world); nbuf = 1+(numbonds_max*2+10)*nlocal_max; - memory->create_kokkos(k_buf,buf,nbuf,"reax/c/bonds:buf"); + memoryKK->create_kokkos(k_buf,buf,nbuf,"reax/c/bonds:buf"); // Pass information to buffer if (reaxc->execution_space == Device) @@ -107,7 +107,7 @@ void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint ntimestep, FILE *fp) // Receive information from buffer for output RecvBuffer(buf, nbuf, nbuf_local, nlocal_tot, numbonds_max); - memory->destroy_kokkos(k_buf,buf); + memoryKK->destroy_kokkos(k_buf,buf); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/fix_reaxc_bonds_kokkos.h b/src/KOKKOS/fix_reaxc_bonds_kokkos.h index e85a7988f3..55adb6f8d9 100644 --- a/src/KOKKOS/fix_reaxc_bonds_kokkos.h +++ b/src/KOKKOS/fix_reaxc_bonds_kokkos.h @@ -14,6 +14,8 @@ #ifdef FIX_CLASS FixStyle(reax/c/bonds/kk,FixReaxCBondsKokkos) +FixStyle(reax/c/bonds/kk/device,FixReaxCBondsKokkos) +FixStyle(reax/c/bonds/kk/host,FixReaxCBondsKokkos) #else diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.cpp b/src/KOKKOS/fix_reaxc_species_kokkos.cpp index 8b778ecf65..a676c7ef27 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.cpp +++ b/src/KOKKOS/fix_reaxc_species_kokkos.cpp @@ -33,7 +33,7 @@ #include "compute.h" #include "input.h" #include "variable.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "reaxc_list.h" #include "atom_masks.h" @@ -66,7 +66,7 @@ FixReaxCSpeciesKokkos::~FixReaxCSpeciesKokkos() void FixReaxCSpeciesKokkos::init() { - Pair* pair_kk = force->pair_match("reax/c/kk",1); + Pair* pair_kk = force->pair_match("reax/c/kk",0); if (pair_kk == NULL) error->all(FLERR,"Cannot use fix reax/c/species/kk without " "pair_style reax/c/kk"); diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.h b/src/KOKKOS/fix_reaxc_species_kokkos.h index 64de060006..7c163b23b5 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.h +++ b/src/KOKKOS/fix_reaxc_species_kokkos.h @@ -14,6 +14,8 @@ #ifdef FIX_CLASS FixStyle(reax/c/species/kk,FixReaxCSpeciesKokkos) +FixStyle(reax/c/species/kk/device,FixReaxCSpeciesKokkos) +FixStyle(reax/c/species/kk/host,FixReaxCSpeciesKokkos) #else diff --git a/src/KOKKOS/fix_rx_kokkos.cpp b/src/KOKKOS/fix_rx_kokkos.cpp new file mode 100644 index 0000000000..61290ece33 --- /dev/null +++ b/src/KOKKOS/fix_rx_kokkos.cpp @@ -0,0 +1,2282 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_rx_kokkos.h" +#include "atom_masks.h" +#include "atom_kokkos.h" +#include "force.h" +#include "memory_kokkos.h" +#include "update.h" +#include "respa.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list_kokkos.h" +#include "neigh_request.h" +#include "error.h" +#include "math_special_kokkos.h" +#include "comm.h" +#include "domain.h" +#include "kokkos.h" + +#include // DBL_EPSILON + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathSpecialKokkos; + +#ifdef DBL_EPSILON + #define MY_EPSILON (10.0*DBL_EPSILON) +#else + #define MY_EPSILON (10.0*2.220446049250313e-16) +#endif + +#define SparseKinetics_enableIntegralReactions (true) +#define SparseKinetics_invalidIndex (-1) + +// From fix_rx.cpp ... this should be lifted into fix_rx.h or fix_rx_kokkos.h? +enum{NONE,HARMONIC}; +enum{LUCY}; + +namespace /* anonymous */ +{ + +typedef double TimerType; +TimerType getTimeStamp(void) { return MPI_Wtime(); } +double getElapsedTime( const TimerType &t0, const TimerType &t1) { return t1-t0; } + +} // end namespace + +/* ---------------------------------------------------------------------- */ + +template +FixRxKokkos::FixRxKokkos(LAMMPS *lmp, int narg, char **arg) : + FixRX(lmp, narg, arg), + pairDPDEKK(NULL), + update_kinetics_data(true) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + k_error_flag = DAT::tdual_int_scalar("FixRxKokkos::k_error_flag"); + + //printf("Inside FixRxKokkos::FixRxKokkos\n"); +} + +template +FixRxKokkos::~FixRxKokkos() +{ + //printf("Inside FixRxKokkos::~FixRxKokkos copymode= %d\n", copymode); + if (copymode) return; + + if (localTempFlag) + memoryKK->destroy_kokkos(k_dpdThetaLocal, dpdThetaLocal); + + memoryKK->destroy_kokkos(k_sumWeights, sumWeights); + //memoryKK->destroy_kokkos(k_sumWeights); + + //delete [] scratchSpace; + memoryKK->destroy_kokkos(d_scratchSpace); + + memoryKK->destroy_kokkos(k_cutsq); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::post_constructor() +{ + // Run the parents and then reset one value. + FixRX::post_constructor(); + + // Need a copy of this + this->my_restartFlag = modify->fix[modify->nfix-1]->restart_reset; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::init() +{ + //printf("Inside FixRxKokkos::init\n"); + + // Call the parent's version. + //FixRX::init(); + + pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy",1); + if (pairDPDE == NULL) + pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy/kk",1); + + if (pairDPDE == NULL) + error->all(FLERR,"Must use pair_style dpd/fdt/energy with fix rx"); + + pairDPDEKK = dynamic_cast(pairDPDE); + if (pairDPDEKK == NULL) + error->all(FLERR,"Must use pair_style dpd/fdt/energy/kk with fix rx/kk"); + + bool eos_flag = false; + for (int i = 0; i < modify->nfix; i++) + if (strncmp(modify->fix[i]->style,"eos/table/rx",3) == 0) eos_flag = true; + if(!eos_flag) error->all(FLERR,"fix rx requires fix eos/table/rx to be specified"); + + if (update_kinetics_data) + create_kinetics_data(); + + // From FixRX::init() + // need a half neighbor list + // built whenever re-neighboring occurs + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->fix = 1; + + // Update the neighbor data for Kokkos. + int neighflag = lmp->kokkos->neighflag; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else { //if (neighflag == HALF || neighflag == HALFTHREAD) + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::init_list(int, class NeighList* ptr) +{ + //printf("Inside FixRxKokkos::init_list\n"); + this->list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::rk4(const double t_stop, double *y, double *rwork, void* v_params) const +{ + double *k1 = rwork; + double *k2 = k1 + nspecies; + double *k3 = k2 + nspecies; + double *k4 = k3 + nspecies; + double *yp = k4 + nspecies; + + const int numSteps = minSteps; + + const double h = t_stop / double(numSteps); + + // Run the requested steps with h. + for (int step = 0; step < numSteps; step++) + { + // k1 + rhs(0.0,y,k1,v_params); + + // k2 + for (int ispecies = 0; ispecies < nspecies; ispecies++) + yp[ispecies] = y[ispecies] + 0.5*h*k1[ispecies]; + + rhs(0.0,yp,k2,v_params); + + // k3 + for (int ispecies = 0; ispecies < nspecies; ispecies++) + yp[ispecies] = y[ispecies] + 0.5*h*k2[ispecies]; + + rhs(0.0,yp,k3,v_params); + + // k4 + for (int ispecies = 0; ispecies < nspecies; ispecies++) + yp[ispecies] = y[ispecies] + h*k3[ispecies]; + + rhs(0.0,yp,k4,v_params); + + for (int ispecies = 0; ispecies < nspecies; ispecies++) + y[ispecies] += h*(k1[ispecies]/6.0 + k2[ispecies]/3.0 + k3[ispecies]/3.0 + k4[ispecies]/6.0); + + } // end for (int step... + +} + +/* ---------------------------------------------------------------------- */ + +template + template +void FixRxKokkos::k_rk4(const double t_stop, VectorType& y, VectorType& rwork, UserDataType& userData) const +{ + VectorType k1( rwork ); + VectorType k2( &k1[nspecies] ); + VectorType k3( &k2[nspecies] ); + VectorType k4( &k3[nspecies] ); + VectorType yp( &k4[nspecies] ); + + const int numSteps = minSteps; + + const double h = t_stop / double(numSteps); + + // Run the requested steps with h. + for (int step = 0; step < numSteps; step++) + { + // k1 + k_rhs(0.0,y,k1, userData); + + // k2 + for (int ispecies = 0; ispecies < nspecies; ispecies++) + yp[ispecies] = y[ispecies] + 0.5*h*k1[ispecies]; + + k_rhs(0.0,yp,k2, userData); + + // k3 + for (int ispecies = 0; ispecies < nspecies; ispecies++) + yp[ispecies] = y[ispecies] + 0.5*h*k2[ispecies]; + + k_rhs(0.0,yp,k3, userData); + + // k4 + for (int ispecies = 0; ispecies < nspecies; ispecies++) + yp[ispecies] = y[ispecies] + h*k3[ispecies]; + + k_rhs(0.0,yp,k4, userData); + + for (int ispecies = 0; ispecies < nspecies; ispecies++) + y[ispecies] += h*(k1[ispecies]/6.0 + k2[ispecies]/3.0 + k3[ispecies]/3.0 + k4[ispecies]/6.0); + + } // end for (int step... + +} + +/* ---------------------------------------------------------------------- */ + +// f1 = dt*f(t,x) +// f2 = dt*f(t+ c20*dt,x + c21*f1) +// f3 = dt*f(t+ c30*dt,x + c31*f1 + c32*f2) +// f4 = dt*f(t+ c40*dt,x + c41*f1 + c42*f2 + c43*f3) +// f5 = dt*f(t+dt,x + c51*f1 + c52*f2 + c53*f3 + c54*f4) +// f6 = dt*f(t+ c60*dt,x + c61*f1 + c62*f2 + c63*f3 + c64*f4 + c65*f5) +// +// fifth-order runge-kutta integration +// x5 = x + b1*f1 + b3*f3 + b4*f4 + b5*f5 + b6*f6 +// fourth-order runge-kutta integration +// x = x + a1*f1 + a3*f3 + a4*f4 + a5*f5 + +template + template +void FixRxKokkos::k_rkf45_step (const int neq, const double h, VectorType& y, VectorType& y_out, VectorType& rwk, UserDataType& userData) const +{ + const double c21=0.25; + const double c31=0.09375; + const double c32=0.28125; + const double c41=0.87938097405553; + const double c42=-3.2771961766045; + const double c43=3.3208921256258; + const double c51=2.0324074074074; + const double c52=-8.0; + const double c53=7.1734892787524; + const double c54=-0.20589668615984; + const double c61=-0.2962962962963; + const double c62=2.0; + const double c63=-1.3816764132554; + const double c64=0.45297270955166; + const double c65=-0.275; + const double a1=0.11574074074074; + const double a3=0.54892787524366; + const double a4=0.5353313840156; + const double a5=-0.2; + const double b1=0.11851851851852; + const double b3=0.51898635477583; + const double b4=0.50613149034201; + const double b5=-0.18; + const double b6=0.036363636363636; + + // local dependent variables (5 total) + VectorType& f1 = rwk; + VectorType f2( &rwk[ neq] ); + VectorType f3( &rwk[2*neq] ); + VectorType f4( &rwk[3*neq] ); + VectorType f5( &rwk[4*neq] ); + VectorType f6( &rwk[5*neq] ); + + // scratch for the intermediate solution. + VectorType& ytmp = y_out; + + // 1) + k_rhs (0.0, y, f1, userData); + + for (int k = 0; k < neq; k++){ + f1[k] *= h; + ytmp[k] = y[k] + c21 * f1[k]; + } + + // 2) + k_rhs(0.0, ytmp, f2, userData); + + for (int k = 0; k < neq; k++){ + f2[k] *= h; + ytmp[k] = y[k] + c31 * f1[k] + c32 * f2[k]; + } + + // 3) + k_rhs(0.0, ytmp, f3, userData); + + for (int k = 0; k < neq; k++) { + f3[k] *= h; + ytmp[k] = y[k] + c41 * f1[k] + c42 * f2[k] + c43 * f3[k]; + } + + // 4) + k_rhs(0.0, ytmp, f4, userData); + + for (int k = 0; k < neq; k++) { + f4[k] *= h; + ytmp[k] = y[k] + c51 * f1[k] + c52 * f2[k] + c53 * f3[k] + c54 * f4[k]; + } + + // 5) + k_rhs(0.0, ytmp, f5, userData); + + for (int k = 0; k < neq; k++) { + f5[k] *= h; + ytmp[k] = y[k] + c61*f1[k] + c62*f2[k] + c63*f3[k] + c64*f4[k] + c65*f5[k]; + } + + // 6) + k_rhs(0.0, ytmp, f6, userData); + + for (int k = 0; k < neq; k++) + { + //const double f6 = h * ydot[k]; + f6[k] *= h; + + // 5th-order solution. + const double r5 = b1*f1[k] + b3*f3[k] + b4*f4[k] + b5*f5[k] + b6*f6[k]; + + // 4th-order solution. + const double r4 = a1*f1[k] + a3*f3[k] + a4*f4[k] + a5*f5[k]; + + // Truncation error: difference between 4th and 5th-order solutions. + rwk[k] = fabs(r5 - r4); + + // Update solution. + //y_out[k] = y[k] + r5; // Local extrapolation + y_out[k] = y[k] + r4; + } + + return; +} + +template + template +int FixRxKokkos::k_rkf45_h0 + (const int neq, const double t, const double t_stop, + const double hmin, const double hmax, + double& h0, VectorType& y, VectorType& rwk, UserDataType& userData) const +{ + // Set lower and upper bounds on h0, and take geometric mean as first trial value. + // Exit with this value if the bounds cross each other. + + // Adjust upper bound based on ydot ... + double hg = sqrt(hmin*hmax); + + //if (hmax < hmin) + //{ + // h0 = hg; + // return; + //} + + // Start iteration to find solution to ... {WRMS norm of (h0^2 y'' / 2)} = 1 + + VectorType& ydot = rwk; + VectorType y1 ( &ydot[ neq] ); + VectorType ydot1 ( &ydot[2*neq] ); + + const int max_iters = 10; + bool hnew_is_ok = false; + double hnew = hg; + int iter = 0; + + // compute ydot at t=t0 + k_rhs (t, y, ydot, userData); + + while(1) + { + // Estimate y'' with finite-difference ... + + for (int k = 0; k < neq; k++) + y1[k] = y[k] + hg * ydot[k]; + + // compute y' at t1 + k_rhs (t + hg, y1, ydot1, userData); + + // Compute WRMS norm of y'' + double yddnrm = 0.0; + for (int k = 0; k < neq; k++){ + double ydd = (ydot1[k] - ydot[k]) / hg; + double wterr = ydd / (relTol * fabs( y[k] ) + absTol); + yddnrm += wterr * wterr; + } + + yddnrm = sqrt( yddnrm / double(neq) ); + + //std::cout << "iter " << _iter << " hg " << hg << " y'' " << yddnrm << std::endl; + //std::cout << "ydot " << ydot[neq-1] << std::endl; + + // should we accept this? + if (hnew_is_ok || iter == max_iters){ + hnew = hg; + //if (iter == max_iters) + // fprintf(stderr, "ERROR_HIN_MAX_ITERS\n"); + break; + } + + // Get the new value of h ... + hnew = (yddnrm*hmax*hmax > 2.0) ? sqrt(2.0 / yddnrm) : sqrt(hg * hmax); + + // test the stopping conditions. + double hrat = hnew / hg; + + // Accept this value ... the bias factor should bring it within range. + if ( (hrat > 0.5) && (hrat < 2.0) ) + hnew_is_ok = true; + + // If y'' is still bad after a few iterations, just accept h and give up. + if ( (iter > 1) && hrat > 2.0 ) { + hnew = hg; + hnew_is_ok = true; + } + + //printf("iter=%d, yddnrw=%e, hnew=%e, hmin=%e, hmax=%e\n", iter, yddnrm, hnew, hmin, hmax); + + hg = hnew; + iter ++; + } + + // bound and bias estimate + h0 = hnew * 0.5; + h0 = fmax(h0, hmin); + h0 = fmin(h0, hmax); + //printf("h0=%e, hmin=%e, hmax=%e\n", h0, hmin, hmax); + + return (iter + 1); +} + +template + template +void FixRxKokkos::k_rkf45(const int neq, const double t_stop, VectorType& y, VectorType& rwork, UserDataType& userData, CounterType& counter) const +{ + // Rounding coefficient. + const double uround = DBL_EPSILON; + + // Adaption limit (shrink or grow) + const double adaption_limit = 4.0; + + // Safety factor on the adaption. very specific but not necessary .. 0.9 is common. + const double hsafe = 0.840896415; + + // Time rounding factor. + const double tround = t_stop * uround; + + // Counters for diagnostics. + int nst = 0; // # of steps (accepted) + int nit = 0; // # of iterations total + int nfe = 0; // # of RHS evaluations + + // Min/Max step-size limits. + const double h_min = 100.0 * tround; + const double h_max = (minSteps > 0) ? t_stop / double(minSteps) : t_stop; + + // Set the initial step-size. 0 forces an internal estimate ... stable Euler step size. + double h = (minSteps > 0) ? t_stop / double(minSteps) : 0.0; + + double t = 0.0; + + if (h < h_min){ + //fprintf(stderr,"hin not implemented yet\n"); + //exit(-1); + nfe = k_rkf45_h0 (neq, t, t_stop, h_min, h_max, h, y, rwork, userData); + } + + //printf("t= %e t_stop= %e h= %e\n", t, t_stop, h); + + // Integrate until we reach the end time. + while (fabs(t - t_stop) > tround) + { + VectorType& yout = rwork; + VectorType eout ( &yout[neq] ); + + // Take a trial step. + k_rkf45_step (neq, h, y, yout, eout, userData); + + // Estimate the solution error. + // ... weighted 2-norm of the error. + double err2 = 0.0; + for (int k = 0; k < neq; k++){ + const double wterr = eout[k] / (relTol * fabs( y[k] ) + absTol); + err2 += wterr * wterr; + } + + double err = fmax( uround, sqrt( err2 / double(nspecies) )); + + // Accept the solution? + if (err <= 1.0 || h <= h_min){ + t += h; + nst++; + + for (int k = 0; k < neq; k++) + y[k] = yout[k]; + } + + // Adjust h for the next step. + double hfac = hsafe * sqrt( sqrt( 1.0 / err ) ); + + // Limit the adaption. + hfac = fmax( hfac, 1.0 / adaption_limit ); + hfac = fmin( hfac, adaption_limit ); + + // Apply the adaption factor... + h *= hfac; + + // Limit h. + h = fmin( h, h_max ); + h = fmax( h, h_min ); + + // Stretch h if we're within 5% ... and we didn't just fail. + if (err <= 1.0 && (t + 1.05*h) > t_stop) + h = t_stop - t; + + // And don't overshoot the end. + if (t + h > t_stop) + h = t_stop - t; + + nit++; + nfe += 6; + + if (maxIters && nit > maxIters){ + //fprintf(stderr,"atom[%d] took too many iterations in rkf45 %d %e %e\n", id, nit, t, t_stop); + counter.nFails ++; + break; + // We should set an error here so that the solution is not used! + } + + } // end while + + counter.nSteps += nst; + counter.nIters += nit; + counter.nFuncs += nfe; + + //printf("id= %d nst= %d nit= %d\n", id, nst, nit); +} +/* ---------------------------------------------------------------------- */ + +// f1 = dt*f(t,x) +// f2 = dt*f(t+ c20*dt,x + c21*f1) +// f3 = dt*f(t+ c30*dt,x + c31*f1 + c32*f2) +// f4 = dt*f(t+ c40*dt,x + c41*f1 + c42*f2 + c43*f3) +// f5 = dt*f(t+dt,x + c51*f1 + c52*f2 + c53*f3 + c54*f4) +// f6 = dt*f(t+ c60*dt,x + c61*f1 + c62*f2 + c63*f3 + c64*f4 + c65*f5) +// +// fifth-order runge-kutta integration +// x5 = x + b1*f1 + b3*f3 + b4*f4 + b5*f5 + b6*f6 +// fourth-order runge-kutta integration +// x = x + a1*f1 + a3*f3 + a4*f4 + a5*f5 + +template +void FixRxKokkos::rkf45_step (const int neq, const double h, double y[], double y_out[], double rwk[], void* v_param) const +{ + const double c21=0.25; + const double c31=0.09375; + const double c32=0.28125; + const double c41=0.87938097405553; + const double c42=-3.2771961766045; + const double c43=3.3208921256258; + const double c51=2.0324074074074; + const double c52=-8.0; + const double c53=7.1734892787524; + const double c54=-0.20589668615984; + const double c61=-0.2962962962963; + const double c62=2.0; + const double c63=-1.3816764132554; + const double c64=0.45297270955166; + const double c65=-0.275; + const double a1=0.11574074074074; + const double a3=0.54892787524366; + const double a4=0.5353313840156; + const double a5=-0.2; + const double b1=0.11851851851852; + const double b3=0.51898635477583; + const double b4=0.50613149034201; + const double b5=-0.18; + const double b6=0.036363636363636; + + // local dependent variables (5 total) + double* f1 = &rwk[ 0]; + double* f2 = &rwk[ neq]; + double* f3 = &rwk[2*neq]; + double* f4 = &rwk[3*neq]; + double* f5 = &rwk[4*neq]; + double* f6 = &rwk[5*neq]; + + // scratch for the intermediate solution. + //double* ytmp = &rwk[6*neq]; + double* ytmp = y_out; + + // 1) + rhs (0.0, y, f1, v_param); + + for (int k = 0; k < neq; k++){ + f1[k] *= h; + ytmp[k] = y[k] + c21 * f1[k]; + } + + // 2) + rhs(0.0, ytmp, f2, v_param); + + for (int k = 0; k < neq; k++){ + f2[k] *= h; + ytmp[k] = y[k] + c31 * f1[k] + c32 * f2[k]; + } + + // 3) + rhs(0.0, ytmp, f3, v_param); + + for (int k = 0; k < neq; k++) { + f3[k] *= h; + ytmp[k] = y[k] + c41 * f1[k] + c42 * f2[k] + c43 * f3[k]; + } + + // 4) + rhs(0.0, ytmp, f4, v_param); + + for (int k = 0; k < neq; k++) { + f4[k] *= h; + ytmp[k] = y[k] + c51 * f1[k] + c52 * f2[k] + c53 * f3[k] + c54 * f4[k]; + } + + // 5) + rhs(0.0, ytmp, f5, v_param); + + for (int k = 0; k < neq; k++) { + f5[k] *= h; + ytmp[k] = y[k] + c61*f1[k] + c62*f2[k] + c63*f3[k] + c64*f4[k] + c65*f5[k]; + } + + // 6) + rhs(0.0, ytmp, f6, v_param); + + for (int k = 0; k < neq; k++) + { + //const double f6 = h * ydot[k]; + f6[k] *= h; + + // 5th-order solution. + const double r5 = b1*f1[k] + b3*f3[k] + b4*f4[k] + b5*f5[k] + b6*f6[k]; + + // 4th-order solution. + const double r4 = a1*f1[k] + a3*f3[k] + a4*f4[k] + a5*f5[k]; + + // Truncation error: difference between 4th and 5th-order solutions. + rwk[k] = fabs(r5 - r4); + + // Update solution. + //y_out[k] = y[k] + r5; // Local extrapolation + y_out[k] = y[k] + r4; + } + + return; +} + +template +int FixRxKokkos::rkf45_h0 + (const int neq, const double t, const double t_stop, + const double hmin, const double hmax, + double& h0, double y[], double rwk[], void* v_params) const +{ + // Set lower and upper bounds on h0, and take geometric mean as first trial value. + // Exit with this value if the bounds cross each other. + + // Adjust upper bound based on ydot ... + double hg = sqrt(hmin*hmax); + + //if (hmax < hmin) + //{ + // h0 = hg; + // return; + //} + + // Start iteration to find solution to ... {WRMS norm of (h0^2 y'' / 2)} = 1 + + double *ydot = rwk; + double *y1 = ydot + neq; + double *ydot1 = y1 + neq; + + const int max_iters = 10; + bool hnew_is_ok = false; + double hnew = hg; + int iter = 0; + + // compute ydot at t=t0 + rhs (t, y, ydot, v_params); + + while(1) + { + // Estimate y'' with finite-difference ... + + for (int k = 0; k < neq; k++) + y1[k] = y[k] + hg * ydot[k]; + + // compute y' at t1 + rhs (t + hg, y1, ydot1, v_params); + + // Compute WRMS norm of y'' + double yddnrm = 0.0; + for (int k = 0; k < neq; k++){ + double ydd = (ydot1[k] - ydot[k]) / hg; + double wterr = ydd / (relTol * fabs( y[k] ) + absTol); + yddnrm += wterr * wterr; + } + + yddnrm = sqrt( yddnrm / double(neq) ); + + //std::cout << "iter " << _iter << " hg " << hg << " y'' " << yddnrm << std::endl; + //std::cout << "ydot " << ydot[neq-1] << std::endl; + + // should we accept this? + if (hnew_is_ok || iter == max_iters){ + hnew = hg; + if (iter == max_iters) + fprintf(stderr, "ERROR_HIN_MAX_ITERS\n"); + break; + } + + // Get the new value of h ... + hnew = (yddnrm*hmax*hmax > 2.0) ? sqrt(2.0 / yddnrm) : sqrt(hg * hmax); + + // test the stopping conditions. + double hrat = hnew / hg; + + // Accept this value ... the bias factor should bring it within range. + if ( (hrat > 0.5) && (hrat < 2.0) ) + hnew_is_ok = true; + + // If y'' is still bad after a few iterations, just accept h and give up. + if ( (iter > 1) && hrat > 2.0 ) { + hnew = hg; + hnew_is_ok = true; + } + + //printf("iter=%d, yddnrw=%e, hnew=%e, hmin=%e, hmax=%e\n", iter, yddnrm, hnew, hmin, hmax); + + hg = hnew; + iter ++; + } + + // bound and bias estimate + h0 = hnew * 0.5; + h0 = fmax(h0, hmin); + h0 = fmin(h0, hmax); + //printf("h0=%e, hmin=%e, hmax=%e\n", h0, hmin, hmax); + + return (iter + 1); +} + +template +void FixRxKokkos::rkf45(const int neq, const double t_stop, double *y, double *rwork, void *v_param, CounterType& counter) const +{ + // Rounding coefficient. + const double uround = DBL_EPSILON; + + // Adaption limit (shrink or grow) + const double adaption_limit = 4.0; + + // Safety factor on the adaption. very specific but not necessary .. 0.9 is common. + const double hsafe = 0.840896415; + + // Time rounding factor. + const double tround = t_stop * uround; + + // Counters for diagnostics. + int nst = 0; // # of steps (accepted) + int nit = 0; // # of iterations total + int nfe = 0; // # of RHS evaluations + + // Min/Max step-size limits. + const double h_min = 100.0 * tround; + const double h_max = (minSteps > 0) ? t_stop / double(minSteps) : t_stop; + + // Set the initial step-size. 0 forces an internal estimate ... stable Euler step size. + double h = (minSteps > 0) ? t_stop / double(minSteps) : 0.0; + + double t = 0.0; + + if (h < h_min){ + //fprintf(stderr,"hin not implemented yet\n"); + //exit(-1); + nfe = rkf45_h0 (neq, t, t_stop, h_min, h_max, h, y, rwork, v_param); + } + + //printf("t= %e t_stop= %e h= %e\n", t, t_stop, h); + + // Integrate until we reach the end time. + while (fabs(t - t_stop) > tround){ + double *yout = rwork; + double *eout = yout + neq; + + // Take a trial step. + rkf45_step (neq, h, y, yout, eout, v_param); + + // Estimate the solution error. + // ... weighted 2-norm of the error. + double err2 = 0.0; + for (int k = 0; k < neq; k++){ + const double wterr = eout[k] / (relTol * fabs( y[k] ) + absTol); + err2 += wterr * wterr; + } + + double err = fmax( uround, sqrt( err2 / double(nspecies) )); + + // Accept the solution? + if (err <= 1.0 || h <= h_min){ + t += h; + nst++; + + for (int k = 0; k < neq; k++) + y[k] = yout[k]; + } + + // Adjust h for the next step. + double hfac = hsafe * sqrt( sqrt( 1.0 / err ) ); + + // Limit the adaption. + hfac = fmax( hfac, 1.0 / adaption_limit ); + hfac = fmin( hfac, adaption_limit ); + + // Apply the adaption factor... + h *= hfac; + + // Limit h. + h = fmin( h, h_max ); + h = fmax( h, h_min ); + + // Stretch h if we're within 5% ... and we didn't just fail. + if (err <= 1.0 && (t + 1.05*h) > t_stop) + h = t_stop - t; + + // And don't overshoot the end. + if (t + h > t_stop) + h = t_stop - t; + + nit++; + nfe += 6; + + if (maxIters && nit > maxIters){ + //fprintf(stderr,"atom[%d] took too many iterations in rkf45 %d %e %e\n", id, nit, t, t_stop); + counter.nFails ++; + break; + // We should set an error here so that the solution is not used! + } + + } // end while + + counter.nSteps += nst; + counter.nIters += nit; + counter.nFuncs += nfe; + + //printf("id= %d nst= %d nit= %d\n", id, nst, nit); +} + +/* ---------------------------------------------------------------------- */ + +template +int FixRxKokkos::rhs(double t, const double *y, double *dydt, void *params) const +{ + // Use the sparse format instead. + if (useSparseKinetics) + return this->rhs_sparse( t, y, dydt, params); + else + return this->rhs_dense ( t, y, dydt, params); +} + +/* ---------------------------------------------------------------------- */ + +template +int FixRxKokkos::rhs_dense(double t, const double *y, double *dydt, void *params) const +{ + UserRHSData *userData = (UserRHSData *) params; + + double *rxnRateLaw = userData->rxnRateLaw; + double *kFor = userData->kFor; + + //const double VDPD = domain->xprd * domain->yprd * domain->zprd / atom->natoms; + //const int nspecies = atom->nspecies_dpd; + + for(int ispecies=0; ispecies +int FixRxKokkos::rhs_sparse(double t, const double *y, double *dydt, void *v_params) const +{ + UserRHSData *userData = (UserRHSData *) v_params; + + //const double VDPD = domain->xprd * domain->yprd * domain->zprd / atom->natoms; + + #define kFor (userData->kFor) + #define kRev (NULL) + #define rxnRateLaw (userData->rxnRateLaw) + #define conc (dydt) + #define maxReactants (this->sparseKinetics_maxReactants) + #define maxSpecies (this->sparseKinetics_maxSpecies) + #define nuk (this->d_kineticsData.nuk) + #define nu (this->d_kineticsData.nu) + #define inu (this->d_kineticsData.inu) + #define isIntegral(idx) ( SparseKinetics_enableIntegralReactions \ + && this->d_kineticsData.isIntegral(idx) ) + + for (int k = 0; k < nspecies; ++k) + conc[k] = y[k] / VDPD; + + // Construct the reaction rate laws + for (int i = 0; i < nreactions; ++i) + { + double rxnRateLawForward; + if (isIntegral(i)){ + rxnRateLawForward = kFor[i] * powint( conc[ nuk(i,0) ], inu(i,0) ); + for (int kk = 1; kk < maxReactants; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + rxnRateLawForward *= powint( conc[k], inu(i,kk) ); + } + } else { + rxnRateLawForward = kFor[i] * pow( conc[ nuk(i,0) ], nu(i,0) ); + for (int kk = 1; kk < maxReactants; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + rxnRateLawForward *= pow( conc[k], nu(i,kk) ); + } + } + + rxnRateLaw[i] = rxnRateLawForward; + } + + // Construct the reaction rates for each species from the + // Stoichiometric matrix and ROP vector. + for (int k = 0; k < nspecies; ++k) + dydt[k] = 0.0; + + for (int i = 0; i < nreactions; ++i){ + // Reactants ... + dydt[ nuk(i,0) ] -= nu(i,0) * rxnRateLaw[i]; + for (int kk = 1; kk < maxReactants; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + dydt[k] -= nu(i,kk) * rxnRateLaw[i]; + } + + // Products ... + dydt[ nuk(i,maxReactants) ] += nu(i,maxReactants) * rxnRateLaw[i]; + for (int kk = maxReactants+1; kk < maxSpecies; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + dydt[k] += nu(i,kk) * rxnRateLaw[i]; + } + } + + // Add in the volume factor to convert to the proper units. + for (int k = 0; k < nspecies; ++k) + dydt[k] *= VDPD; + + #undef kFor + #undef kRev + #undef rxnRateLaw + #undef conc + #undef maxReactants + #undef maxSpecies + #undef nuk + #undef nu + #undef inu + #undef isIntegral + //#undef invalidIndex + + return 0; +} + +/* ---------------------------------------------------------------------- */ + +template + template +int FixRxKokkos::k_rhs(double t, const VectorType& y, VectorType& dydt, UserDataType& userData) const +{ + // Use the sparse format instead. + if (useSparseKinetics) + return this->k_rhs_sparse( t, y, dydt, userData); + else + return this->k_rhs_dense ( t, y, dydt, userData); +} + +/* ---------------------------------------------------------------------- */ + +template + template +int FixRxKokkos::k_rhs_dense(double t, const VectorType& y, VectorType& dydt, UserDataType& userData) const +{ + #define rxnRateLaw (userData.rxnRateLaw) + #define kFor (userData.kFor ) + + //const double VDPD = domain->xprd * domain->yprd * domain->zprd / atom->natoms; + //const int nspecies = atom->nspecies_dpd; + + for(int ispecies=0; ispecies + template +int FixRxKokkos::k_rhs_sparse(double t, const VectorType& y, VectorType& dydt, UserDataType& userData) const +{ + #define kFor (userData.kFor) + #define kRev (NULL) + #define rxnRateLaw (userData.rxnRateLaw) + #define conc (dydt) + #define maxReactants (this->sparseKinetics_maxReactants) + #define maxSpecies (this->sparseKinetics_maxSpecies) + #define nuk (this->d_kineticsData.nuk) + #define nu (this->d_kineticsData.nu) + #define inu (this->d_kineticsData.inu) + #define isIntegral(idx) ( SparseKinetics_enableIntegralReactions \ + && this->d_kineticsData.isIntegral(idx) ) + + for (int k = 0; k < nspecies; ++k) + conc[k] = y[k] / VDPD; + + // Construct the reaction rate laws + for (int i = 0; i < nreactions; ++i) + { + double rxnRateLawForward; + if (isIntegral(i)){ + rxnRateLawForward = kFor[i] * powint( conc[ nuk(i,0) ], inu(i,0) ); + for (int kk = 1; kk < maxReactants; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + rxnRateLawForward *= powint( conc[k], inu(i,kk) ); + } + } else { + rxnRateLawForward = kFor[i] * pow( conc[ nuk(i,0) ], nu(i,0) ); + for (int kk = 1; kk < maxReactants; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + rxnRateLawForward *= pow( conc[k], nu(i,kk) ); + } + } + + rxnRateLaw[i] = rxnRateLawForward; + } + + // Construct the reaction rates for each species from the + // Stoichiometric matrix and ROP vector. + for (int k = 0; k < nspecies; ++k) + dydt[k] = 0.0; + + for (int i = 0; i < nreactions; ++i){ + // Reactants ... + dydt[ nuk(i,0) ] -= nu(i,0) * rxnRateLaw[i]; + for (int kk = 1; kk < maxReactants; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + dydt[k] -= nu(i,kk) * rxnRateLaw[i]; + } + + // Products ... + dydt[ nuk(i,maxReactants) ] += nu(i,maxReactants) * rxnRateLaw[i]; + for (int kk = maxReactants+1; kk < maxSpecies; ++kk){ + const int k = nuk(i,kk); + if (k == SparseKinetics_invalidIndex) break; + //if (k != SparseKinetics_invalidIndex) + dydt[k] += nu(i,kk) * rxnRateLaw[i]; + } + } + + // Add in the volume factor to convert to the proper units. + for (int k = 0; k < nspecies; ++k) + dydt[k] *= VDPD; + + #undef kFor + #undef kRev + #undef rxnRateLaw + #undef conc + #undef maxReactants + #undef maxSpecies + #undef nuk + #undef nu + #undef inu + #undef isIntegral + //#undef invalidIndex + + return 0; +} + +/* ---------------------------------------------------------------------- */ + +/*template + template + KOKKOS_INLINE_FUNCTION +void FixRxKokkos::operator()(SolverType, const int &i) const +{ + if (atom->mask[i] & groupbit) + { + double *rwork = new double[8*nspecies]; + + UserRHSData userData; + userData.kFor = new double[nreactions]; + userData.rxnRateLaw = new double[nreactions]; + + int ode_counter[4] = { 0 }; + + const double theta = (localTempFlag) ? dpdThetaLocal[i] : atom->dpdTheta[i]; + + //Compute the reaction rate constants + for (int irxn = 0; irxn < nreactions; irxn++) + { + if (SolverType::setToZero) + userData.kFor[irxn] = 0.0; + else + userData.kFor[irxn] = Arr[irxn]*pow(theta,nArr[irxn])*exp(-Ea[irxn]/force->boltz/theta); + } + + if (odeIntegrationFlag == ODE_LAMMPS_RK4) + rk4(i, rwork, &userData); + else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) + rkf45(i, rwork, &userData, ode_counter); + + delete [] rwork; + delete [] userData.kFor; + delete [] userData.rxnRateLaw; + } +} */ + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::create_kinetics_data(void) +{ + //printf("Inside FixRxKokkos::create_kinetics_data\n"); + + memoryKK->create_kokkos( d_kineticsData.Arr, h_kineticsData.Arr, nreactions, "KineticsType::Arr"); + memoryKK->create_kokkos( d_kineticsData.nArr, h_kineticsData.nArr, nreactions, "KineticsType::nArr"); + memoryKK->create_kokkos( d_kineticsData.Ea, h_kineticsData.Ea, nreactions, "KineticsType::Ea"); + + for (int i = 0; i < nreactions; ++i) + { + h_kineticsData.Arr[i] = Arr[i]; + h_kineticsData.nArr[i] = nArr[i]; + h_kineticsData.Ea[i] = Ea[i]; + } + + Kokkos::deep_copy( d_kineticsData.Arr, h_kineticsData.Arr ); + Kokkos::deep_copy( d_kineticsData.nArr, h_kineticsData.nArr ); + Kokkos::deep_copy( d_kineticsData.Ea, h_kineticsData.Ea ); + + if (useSparseKinetics) + { + + memoryKK->create_kokkos( d_kineticsData.nu , h_kineticsData.nu , nreactions, sparseKinetics_maxSpecies, "KineticsType::nu"); + memoryKK->create_kokkos( d_kineticsData.nuk, h_kineticsData.nuk, nreactions, sparseKinetics_maxSpecies, "KineticsType::nuk"); + + for (int i = 0; i < nreactions; ++i) + for (int k = 0; k < sparseKinetics_maxSpecies; ++k) + { + h_kineticsData.nu (i,k) = sparseKinetics_nu [i][k]; + h_kineticsData.nuk(i,k) = sparseKinetics_nuk[i][k]; + } + + Kokkos::deep_copy( d_kineticsData.nu, h_kineticsData.nu ); + Kokkos::deep_copy( d_kineticsData.nuk, h_kineticsData.nuk ); + + if (SparseKinetics_enableIntegralReactions) + { + memoryKK->create_kokkos( d_kineticsData.inu, h_kineticsData.inu, nreactions, sparseKinetics_maxSpecies, "KineticsType::inu"); + memoryKK->create_kokkos( d_kineticsData.isIntegral, h_kineticsData.isIntegral, nreactions, "KineticsType::isIntegral"); + + for (int i = 0; i < nreactions; ++i) + { + h_kineticsData.isIntegral(i) = sparseKinetics_isIntegralReaction[i]; + + for (int k = 0; k < sparseKinetics_maxSpecies; ++k) + h_kineticsData.inu(i,k) = sparseKinetics_inu[i][k]; + } + + Kokkos::deep_copy( d_kineticsData.inu, h_kineticsData.inu ); + Kokkos::deep_copy( d_kineticsData.isIntegral, h_kineticsData.isIntegral ); + } + } + + //else + //{ + + // Dense option + memoryKK->create_kokkos( d_kineticsData.stoich, h_kineticsData.stoich, nreactions, nspecies, "KineticsType::stoich"); + memoryKK->create_kokkos( d_kineticsData.stoichReactants, h_kineticsData.stoichReactants, nreactions, nspecies, "KineticsType::stoichReactants"); + memoryKK->create_kokkos( d_kineticsData.stoichProducts, h_kineticsData.stoichProducts, nreactions, nspecies, "KineticsType::stoichProducts"); + + for (int i = 0; i < nreactions; ++i) + for (int k = 0; k < nspecies; ++k) + { + h_kineticsData.stoich(i,k) = stoich[i][k]; + h_kineticsData.stoichReactants(i,k) = stoichReactants[i][k]; + h_kineticsData.stoichProducts(i,k) = stoichProducts[i][k]; + } + + Kokkos::deep_copy( d_kineticsData.stoich, h_kineticsData.stoich ); + Kokkos::deep_copy( d_kineticsData.stoichReactants, h_kineticsData.stoichReactants ); + Kokkos::deep_copy( d_kineticsData.stoichProducts, h_kineticsData.stoichProducts ); + + //} + + update_kinetics_data = false; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::setup_pre_force(int vflag) +{ + //printf("Inside FixRxKokkos::setup_pre_force restartFlag= %d\n", my_restartFlag); + + if (my_restartFlag) + my_restartFlag = 0; + else + this->solve_reactions( vflag, false ); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::pre_force(int vflag) +{ + //printf("Inside FixRxKokkos::pre_force localTempFlag= %d\n", localTempFlag); + + this->solve_reactions( vflag, true ); +} + +/* ---------------------------------------------------------------------- */ + +template + KOKKOS_INLINE_FUNCTION +void FixRxKokkos::operator()(Tag_FixRxKokkos_zeroCounterViews, const int& i) const +{ + d_diagnosticCounterPerODEnSteps(i) = 0; + d_diagnosticCounterPerODEnFuncs(i) = 0; +} + +/* ---------------------------------------------------------------------- */ + +template + template + KOKKOS_INLINE_FUNCTION +void FixRxKokkos::operator()(Tag_FixRxKokkos_solveSystems, const int& i, CounterType& counter) const +{ + if (d_mask(i) & groupbit) + { + StridedArrayType y( d_scratchSpace.ptr_on_device() + scratchSpaceSize * i ); + StridedArrayType rwork( &y[nspecies] ); + + UserRHSDataKokkos<1> userData; + userData.kFor.m_data = &( rwork[7*nspecies] ); + userData.rxnRateLaw.m_data = &( userData.kFor[ nreactions ] ); + + CounterType counter_i; + + const double theta = (localTempFlag) ? d_dpdThetaLocal(i) : d_dpdTheta(i); + + //Compute the reaction rate constants + for (int irxn = 0; irxn < nreactions; irxn++) + { + if (ZERO_RATES) + userData.kFor[irxn] = 0.0; + else + { + userData.kFor[irxn] = d_kineticsData.Arr(irxn) * + pow(theta, d_kineticsData.nArr(irxn)) * + exp(-d_kineticsData.Ea(irxn) / boltz / theta); + } + } + + // Update ConcOld and initialize the ODE solution vector y[]. + for (int ispecies = 0; ispecies < nspecies; ispecies++) + { + const double tmp = d_dvector(ispecies, i); + d_dvector(ispecies+nspecies, i) = tmp; + y[ispecies] = tmp; + } + + // Solver the ODE system. + if (odeIntegrationFlag == ODE_LAMMPS_RK4) + { + k_rk4(t_stop, y, rwork, userData); + } + else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) + { + k_rkf45(nspecies, t_stop, y, rwork, userData, counter_i); + + if (diagnosticFrequency == 1) + { + d_diagnosticCounterPerODEnSteps(i) = counter_i.nSteps; + d_diagnosticCounterPerODEnFuncs(i) = counter_i.nFuncs; + } + } + + // Store the solution back in dvector. + for (int ispecies = 0; ispecies < nspecies; ispecies++) + { + if (y[ispecies] < -1.0e-10) + { + //error->one(FLERR,"Computed concentration in RK solver is < -1.0e-10"); + k_error_flag.template view()() = 2; + // This should be an atomic update. + } + else if (y[ispecies] < MY_EPSILON) + y[ispecies] = 0.0; + + d_dvector(ispecies,i) = y[ispecies]; + } + + // Update the iteration statistics counter. Is this unique for each iteration? + counter += counter_i; + + } // if +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::solve_reactions(const int vflag, const bool isPreForce) +{ + //printf("Inside FixRxKokkos::solve_reactions localTempFlag= %d isPreForce= %s\n", localTempFlag, isPreForce ? "True" : "false"); + + copymode = 1; + + if (update_kinetics_data) + create_kinetics_data(); + + TimerType timer_start = getTimeStamp(); + + //const int nlocal = atom->nlocal; + this->nlocal = atom->nlocal; + const int nghost = atom->nghost; + const int newton_pair = force->newton_pair; + + // Set the forward rates to zero if acting as setup_pre_force. + const bool setRatesToZero = (isPreForce == false); + + if (localTempFlag) + { + const int count = nlocal + (newton_pair ? nghost : 0); + + if (count > k_dpdThetaLocal.template view().dimension_0()) { + memoryKK->destroy_kokkos (k_dpdThetaLocal, dpdThetaLocal); + memoryKK->create_kokkos (k_dpdThetaLocal, dpdThetaLocal, count, "FixRxKokkos::dpdThetaLocal"); + this->d_dpdThetaLocal = k_dpdThetaLocal.template view(); + this->h_dpdThetaLocal = k_dpdThetaLocal.h_view; + } + + const int neighflag = lmp->kokkos->neighflag; + +#define _template_switch(_wtflag, _localTempFlag) { \ + if (neighflag == HALF) \ + if (newton_pair) \ + computeLocalTemperature<_wtflag, _localTempFlag, true , HALF> (); \ + else \ + computeLocalTemperature<_wtflag, _localTempFlag, false, HALF> (); \ + else if (neighflag == HALFTHREAD) \ + if (newton_pair) \ + computeLocalTemperature<_wtflag, _localTempFlag, true , HALFTHREAD> (); \ + else \ + computeLocalTemperature<_wtflag, _localTempFlag, false, HALFTHREAD> (); \ + else if (neighflag == FULL) \ + if (newton_pair) \ + computeLocalTemperature<_wtflag, _localTempFlag, true , FULL> (); \ + else \ + computeLocalTemperature<_wtflag, _localTempFlag, false, FULL> (); \ + } + + // Are there is no other options than wtFlag = (0)LUCY and localTempFlag = NONE : HARMONIC? + if (localTempFlag == HARMONIC) { + _template_switch(LUCY, HARMONIC) + } + else { + _template_switch(LUCY, NONE) + } +#undef _template_switch + } + + TimerType timer_localTemperature = getTimeStamp(); + + // Total counters from the ODE solvers. + CounterType TotalCounters; + + // Set data needed in the operators. + // ... + + // Local references to the atomKK objects. + //typename ArrayTypes::t_efloat_1d d_dpdTheta = atomKK->k_dpdTheta.view(); + //typename ArrayTypes::t_float_2d d_dvector = atomKK->k_dvector.view(); + //typename ArrayTypes::t_int_1d d_mask = atomKK->k_mask.view(); + this->d_dpdTheta = atomKK->k_dpdTheta.view(); + this->d_dvector = atomKK->k_dvector.view(); + this->d_mask = atomKK->k_mask.view(); + + // Get up-to-date data. + atomKK->sync( execution_space, MASK_MASK | DVECTOR_MASK | DPDTHETA_MASK ); + + // Set some constants outside of the parallel_for + //const double boltz = force->boltz; + //const double t_stop = update->dt; // DPD time-step and integration length. + this->boltz = force->boltz; + this->t_stop = update->dt; // DPD time-step and integration length. + + // Average DPD volume. Used in the RHS function. + this->VDPD = domain->xprd * domain->yprd * domain->zprd / atom->natoms; + + if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency == 1) + { + memoryKK->create_kokkos (k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps, nlocal, "FixRxKokkos::diagnosticCounterPerODEnSteps"); + memoryKK->create_kokkos (k_diagnosticCounterPerODEnFuncs, diagnosticCounterPerODEnFuncs, nlocal, "FixRxKokkos::diagnosticCounterPerODEnFuncs"); + + d_diagnosticCounterPerODEnSteps = k_diagnosticCounterPerODEnSteps.template view(); + d_diagnosticCounterPerODEnFuncs = k_diagnosticCounterPerODEnFuncs.template view(); + + Kokkos::parallel_for ( Kokkos::RangePolicy(0,nlocal), *this); + //Kokkos::parallel_for ( nlocal, + // LAMMPS_LAMBDA(const int i) + // { + // d_diagnosticCounterPerODEnSteps(i) = 0; + // d_diagnosticCounterPerODEnFuncs(i) = 0; + // } + // ); + } + + // Error flag for any failures. + //DAT::tdual_int_scalar k_error_flag("pair:error_flag"); + + // Initialize and sync the device flag. + k_error_flag.h_view() = 0; + k_error_flag.template modify(); + k_error_flag.template sync(); + + // Create scratch array space. + //const size_t scratchSpaceSize = (8*nspecies + 2*nreactions); + this->scratchSpaceSize = (8*nspecies + 2*nreactions); + //double *scratchSpace = new double[ scratchSpaceSize * nlocal ]; + + //typename ArrayTypes::t_double_1d d_scratchSpace("d_scratchSpace", scratchSpaceSize * nlocal); + if (nlocal*scratchSpaceSize > d_scratchSpace.dimension_0()) { + memoryKK->destroy_kokkos (d_scratchSpace); + memoryKK->create_kokkos (d_scratchSpace, nlocal*scratchSpaceSize, "FixRxKokkos::d_scratchSpace"); + } + +#if 0 + Kokkos::parallel_reduce( nlocal, LAMMPS_LAMBDA(int i, CounterType &counter) + { + if (d_mask(i) & groupbit) + { + //double *y = new double[8*nspecies]; + //double *rwork = y + nspecies; + + //StridedArrayType _y( y ); + //StridedArrayType _rwork( rwork ); + + StridedArrayType y( d_scratchSpace.ptr_on_device() + scratchSpaceSize * i ); + StridedArrayType rwork( &y[nspecies] ); + + //UserRHSData userData; + //userData.kFor = new double[nreactions]; + //userData.rxnRateLaw = new double[nreactions]; + + //UserRHSDataKokkos<1> userDataKokkos; + //userDataKokkos.kFor.m_data = userData.kFor; + //userDataKokkos.rxnRateLaw.m_data = userData.rxnRateLaw; + + UserRHSDataKokkos<1> userData; + userData.kFor.m_data = &( rwork[7*nspecies] ); + userData.rxnRateLaw.m_data = &( userData.kFor[ nreactions ] ); + + CounterType counter_i; + + const double theta = (localTempFlag) ? d_dpdThetaLocal(i) : d_dpdTheta(i); + + //Compute the reaction rate constants + for (int irxn = 0; irxn < nreactions; irxn++) + { + if (setRatesToZero) + userData.kFor[irxn] = 0.0; + else + { + userData.kFor[irxn] = d_kineticsData.Arr(irxn) * + pow(theta, d_kineticsData.nArr(irxn)) * + exp(-d_kineticsData.Ea(irxn) / boltz / theta); + } + } + + // Update ConcOld and initialize the ODE solution vector y[]. + for (int ispecies = 0; ispecies < nspecies; ispecies++) + { + const double tmp = d_dvector(ispecies, i); + d_dvector(ispecies+nspecies, i) = tmp; + y[ispecies] = tmp; + } + + // Solver the ODE system. + if (odeIntegrationFlag == ODE_LAMMPS_RK4) + { + k_rk4(t_stop, y, rwork, userData); + } + else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) + { + k_rkf45(nspecies, t_stop, y, rwork, userData, counter_i); + + if (diagnosticFrequency == 1) + { + d_diagnosticCounterPerODEnSteps(i) = counter_i.nSteps; + d_diagnosticCounterPerODEnFuncs(i) = counter_i.nFuncs; + } + } + + // Store the solution back in dvector. + for (int ispecies = 0; ispecies < nspecies; ispecies++) + { + if (y[ispecies] < -1.0e-10) + { + //error->one(FLERR,"Computed concentration in RK solver is < -1.0e-10"); + k_error_flag.template view()() = 2; + // This should be an atomic update. + } + else if (y[ispecies] < MY_EPSILON) + y[ispecies] = 0.0; + + d_dvector(ispecies,i) = y[ispecies]; + } + + //delete [] y; + //delete [] userData.kFor; + //delete [] userData.rxnRateLaw; + + // Update the iteration statistics counter. Is this unique for each iteration? + counter += counter_i; + + } // if + } // parallel_for lambda-body + + , TotalCounters // reduction value for all iterations. + ); +#else + if (setRatesToZero) + Kokkos::parallel_reduce( Kokkos::RangePolicy >(0,nlocal), *this, TotalCounters); + else + Kokkos::parallel_reduce( Kokkos::RangePolicy >(0,nlocal), *this, TotalCounters); +#endif + + TimerType timer_ODE = getTimeStamp(); + + // Check the error flag for any failures. + k_error_flag.template modify(); + k_error_flag.template sync(); + if (k_error_flag.h_view() == 2) + error->one(FLERR,"Computed concentration in RK solver is < -1.0e-10"); + + // Signal that dvector has been modified on this execution space. + atomKK->modified( execution_space, DVECTOR_MASK ); + + // Communicate the updated species data to all nodes + atomKK->sync ( Host, DVECTOR_MASK ); + + comm->forward_comm_fix(this); + + atomKK->modified ( Host, DVECTOR_MASK ); + + TimerType timer_stop = getTimeStamp(); + + double time_ODE = getElapsedTime(timer_localTemperature, timer_ODE); + + //printf("me= %d kokkos total= %g temp= %g ode= %g comm= %g nlocal= %d nfc= %d %d\n", comm->me, + // getElapsedTime(timer_start, timer_stop), + // getElapsedTime(timer_start, timer_localTemperature), + // getElapsedTime(timer_localTemperature, timer_ODE), + // getElapsedTime(timer_ODE, timer_stop), nlocal, TotalCounters.nFuncs, TotalCounters.nSteps); + + // Warn the user if a failure was detected in the ODE solver. + if (TotalCounters.nFails > 0){ + char sbuf[128]; + sprintf(sbuf,"in FixRX::pre_force, ODE solver failed for %d atoms.", TotalCounters.nFails); + error->warning(FLERR, sbuf); + } + + // Compute and report ODE diagnostics, if requested. + if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency != 0) + { + // Update the counters. + diagnosticCounter[StepSum] += TotalCounters.nSteps; + diagnosticCounter[FuncSum] += TotalCounters.nFuncs; + diagnosticCounter[TimeSum] += time_ODE; + diagnosticCounter[AtomSum] += nlocal; + diagnosticCounter[numDiagnosticCounters-1] ++; + + if ( (diagnosticFrequency > 0 && + ((update->ntimestep - update->firststep) % diagnosticFrequency) == 0) || + (diagnosticFrequency < 0 && update->ntimestep == update->laststep) ) + this->odeDiagnostics(); + } + + copymode = 0; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::odeDiagnostics(void) +{ + TimerType timer_start = getTimeStamp(); + + // Compute: + // 1) Average # of ODE integrator steps and RHS evaluations per atom globally. + // 2) RMS # of ... + // 3) Average # of ODE steps and RHS evaluations per MPI task. + // 4) RMS # of ODE steps and RHS evaluations per MPI task. + // 5) MAX # of ODE steps and RHS evaluations per MPI task. + // + // ... 1,2 are for ODE control diagnostics. + // ... 3-5 are for load balancing diagnostics. + // + // To do this, we'll need to + // a) Allreduce (sum) the sum of nSteps / nFuncs. Dividing by atom->natoms + // gives the avg # of steps/funcs per atom globally. + // b) Reduce (sum) to root the sum of squares of the differences. + // i) Sum_i (steps_i - avg_steps_global)^2 + // ii) Sum_i (funcs_i - avg_funcs_global)^2 + // iii) (avg_steps_local - avg_steps_global)^2 + // iv) (avg_funcs_local - avg_funcs_global)^2 + + const int numCounters = numDiagnosticCounters-1; + + // # of time-steps for averaging. + const int nTimes = this->diagnosticCounter[numDiagnosticCounters-1]; + + // # of ODE's per time-step (on average). + //const int nODEs = this->diagnosticCounter[AtomSum] / nTimes; + + // Sum up the sums from each task. + double sums[numCounters]; + double my_vals[numCounters]; + double max_per_proc[numCounters]; + double min_per_proc[numCounters]; + + // Compute counters per dpd time-step. + for (int i = 0; i < numCounters; ++i){ + my_vals[i] = this->diagnosticCounter[i] / nTimes; + //printf("my sum[%d] = %f %d\n", i, my_vals[i], comm->me); + } + + MPI_Allreduce (my_vals, sums, numCounters, MPI_DOUBLE, MPI_SUM, world); + + MPI_Reduce (my_vals, max_per_proc, numCounters, MPI_DOUBLE, MPI_MAX, 0, world); + MPI_Reduce (my_vals, min_per_proc, numCounters, MPI_DOUBLE, MPI_MIN, 0, world); + + const double nODEs = sums[numCounters-1]; + + double avg_per_atom[numCounters], avg_per_proc[numCounters]; + + // Averages per-ODE and per-proc per time-step. + for (int i = 0; i < numCounters; ++i){ + avg_per_atom[i] = sums[i] / nODEs; + avg_per_proc[i] = sums[i] / comm->nprocs; + } + + // Sum up the differences from each task. + double sum_sq[2*numCounters]; + double my_sum_sq[2*numCounters]; + for (int i = 0; i < numCounters; ++i){ + double diff_i = my_vals[i] - avg_per_proc[i]; + my_sum_sq[i] = diff_i * diff_i; + } + + double max_per_ODE[numCounters], min_per_ODE[numCounters]; + + // Process the per-ODE RMS of the # of steps/funcs + if (diagnosticFrequency == 1) + { + h_diagnosticCounterPerODEnSteps = k_diagnosticCounterPerODEnSteps.h_view; + h_diagnosticCounterPerODEnFuncs = k_diagnosticCounterPerODEnFuncs.h_view; + + Kokkos::deep_copy( h_diagnosticCounterPerODEnSteps, d_diagnosticCounterPerODEnSteps ); + Kokkos::deep_copy( h_diagnosticCounterPerODEnFuncs, d_diagnosticCounterPerODEnFuncs ); + + double my_max[numCounters], my_min[numCounters]; + + //const int nlocal = atom->nlocal; + nlocal = atom->nlocal; + HAT::t_int_1d h_mask = atomKK->k_mask.h_view; + + for (int i = 0; i < numCounters; ++i) + { + my_sum_sq[i+numCounters] = 0; + my_max[i] = 0; + my_min[i] = DBL_MAX; + } + + for (int j = 0; j < nlocal; ++j) + if (h_mask(j) & groupbit) + { + int nSteps = h_diagnosticCounterPerODEnSteps(j); + double diff_nSteps = double( nSteps ) - avg_per_atom[StepSum]; + my_sum_sq[StepSum+numCounters] += diff_nSteps*diff_nSteps; + my_max[StepSum] = std::max( my_max[StepSum], (double)nSteps ); + my_min[StepSum] = std::min( my_min[StepSum], (double)nSteps ); + + int nFuncs = h_diagnosticCounterPerODEnFuncs(j); + double diff_nFuncs = double( nFuncs ) - avg_per_atom[FuncSum]; + my_sum_sq[FuncSum+numCounters] += diff_nFuncs*diff_nFuncs; + + my_max[FuncSum] = std::max( my_max[FuncSum], (double)nFuncs ); + my_min[FuncSum] = std::min( my_min[FuncSum], (double)nFuncs ); + } + + memoryKK->destroy_kokkos( k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps ); + memoryKK->destroy_kokkos( k_diagnosticCounterPerODEnFuncs, diagnosticCounterPerODEnFuncs ); + + MPI_Reduce (my_sum_sq, sum_sq, 2*numCounters, MPI_DOUBLE, MPI_SUM, 0, world); + + MPI_Reduce (my_max, max_per_ODE, numCounters, MPI_DOUBLE, MPI_MAX, 0, world); + MPI_Reduce (my_min, min_per_ODE, numCounters, MPI_DOUBLE, MPI_MIN, 0, world); + } + else + MPI_Reduce (my_sum_sq, sum_sq, numCounters, MPI_DOUBLE, MPI_SUM, 0, world); + + TimerType timer_stop = getTimeStamp(); + double time_local = getElapsedTime( timer_start, timer_stop ); + + if (comm->me == 0){ + char smesg[128]; + +#define print_mesg(smesg) {\ + if (screen) fprintf(screen,"%s\n", smesg); \ + if (logfile) fprintf(logfile,"%s\n", smesg); } + + sprintf(smesg, "FixRX::ODE Diagnostics: # of iters |# of rhs evals| run-time (sec) | # atoms"); + print_mesg(smesg); + + sprintf(smesg, " AVG per ODE : %-12.5g | %-12.5g | %-12.5g", avg_per_atom[0], avg_per_atom[1], avg_per_atom[2]); + print_mesg(smesg); + + // only valid for single time-step! + if (diagnosticFrequency == 1){ + double rms_per_ODE[numCounters]; + for (int i = 0; i < numCounters; ++i) + rms_per_ODE[i] = sqrt( sum_sq[i+numCounters] / nODEs ); + + sprintf(smesg, " RMS per ODE : %-12.5g | %-12.5g ", rms_per_ODE[0], rms_per_ODE[1]); + print_mesg(smesg); + + sprintf(smesg, " MAX per ODE : %-12.5g | %-12.5g ", max_per_ODE[0], max_per_ODE[1]); + print_mesg(smesg); + + sprintf(smesg, " MIN per ODE : %-12.5g | %-12.5g ", min_per_ODE[0], min_per_ODE[1]); + print_mesg(smesg); + } + + sprintf(smesg, " AVG per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", avg_per_proc[StepSum], avg_per_proc[FuncSum], avg_per_proc[TimeSum], avg_per_proc[AtomSum]); + print_mesg(smesg); + + if (comm->nprocs > 1){ + double rms_per_proc[numCounters]; + for (int i = 0; i < numCounters; ++i) + rms_per_proc[i] = sqrt( sum_sq[i] / comm->nprocs ); + + sprintf(smesg, " RMS per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", rms_per_proc[0], rms_per_proc[1], rms_per_proc[2], rms_per_proc[AtomSum]); + print_mesg(smesg); + + sprintf(smesg, " MAX per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", max_per_proc[0], max_per_proc[1], max_per_proc[2], max_per_proc[AtomSum]); + print_mesg(smesg); + + sprintf(smesg, " MIN per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", min_per_proc[0], min_per_proc[1], min_per_proc[2], min_per_proc[AtomSum]); + print_mesg(smesg); + } + + sprintf(smesg, " AVG'd over %d time-steps", nTimes); + print_mesg(smesg); + sprintf(smesg, " AVG'ing took %g sec", time_local); + print_mesg(smesg); + +#undef print_mesg + + } + + // Reset the counters. + for (int i = 0; i < numDiagnosticCounters; ++i) + diagnosticCounter[i] = 0; + + return; +} + +/* ---------------------------------------------------------------------- */ + +template + KOKKOS_INLINE_FUNCTION +void FixRxKokkos::operator()(Tag_FixRxKokkos_zeroTemperatureViews, const int& i) const +{ + d_sumWeights(i) = 0.0; + d_dpdThetaLocal(i) = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +template + template + KOKKOS_INLINE_FUNCTION +void FixRxKokkos::operator()(Tag_FixRxKokkos_firstPairOperator, const int& ii) const +{ + // Create an atomic view of sumWeights and dpdThetaLocal. Only needed + // for Half/thread scenarios. + typedef Kokkos::View< E_FLOAT*, typename DAT::t_efloat_1d::array_layout, DeviceType, Kokkos::MemoryTraits< AtomicF< NEIGHFLAG >::value> > AtomicViewType; + + AtomicViewType a_dpdThetaLocal = d_dpdThetaLocal; + AtomicViewType a_sumWeights = d_sumWeights; + + // Local scalar accumulators. + double i_dpdThetaLocal = 0.0; + double i_sumWeights = 0.0; + + const int i = d_ilist(ii); + + const double xtmp = d_x(i,0); + const double ytmp = d_x(i,1); + const double ztmp = d_x(i,2); + const int itype = d_type(i); + + const int jnum = d_numneigh(i); + + for (int jj = 0; jj < jnum; jj++) + { + const int j = (d_neighbors(i,jj) & NEIGHMASK); + const int jtype = d_type(j); + + const double delx = xtmp - d_x(j,0); + const double dely = ytmp - d_x(j,1); + const double delz = ztmp - d_x(j,2); + const double rsq = delx*delx + dely*dely + delz*delz; + + const double cutsq_ij = d_cutsq(itype,jtype); + + if (rsq < cutsq_ij) + { + const double rcut = sqrt( cutsq_ij ); + double rij = sqrt(rsq); + double ratio = rij/rcut; + + double wij = 0.0; + + // Lucy's Weight Function + if (WT_FLAG == LUCY) + { + wij = (1.0+3.0*ratio) * (1.0-ratio)*(1.0-ratio)*(1.0-ratio); + i_dpdThetaLocal += wij / d_dpdTheta(j); + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + a_dpdThetaLocal(j) += wij / d_dpdTheta(i); + } + + i_sumWeights += wij; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + a_sumWeights(j) += wij; + } + } + + // Update, don't assign, the array value (because another iteration may have hit it). + a_dpdThetaLocal(i) += i_dpdThetaLocal; + a_sumWeights(i) += i_sumWeights; +} + +/* ---------------------------------------------------------------------- */ + +template + template + KOKKOS_INLINE_FUNCTION +void FixRxKokkos::operator()(Tag_FixRxKokkos_2ndPairOperator, const int& i) const +{ + double wij = 0.0; + + // Lucy Weight Function + if (WT_FLAG == LUCY) + { + wij = 1.0; + d_dpdThetaLocal(i) += wij / d_dpdTheta(i); + } + d_sumWeights(i) += wij; + + // Normalized local temperature + d_dpdThetaLocal(i) = d_dpdThetaLocal(i) / d_sumWeights(i); + + if (LOCAL_TEMP_FLAG == HARMONIC) + d_dpdThetaLocal(i) = 1.0 / d_dpdThetaLocal(i); +} + +/* ---------------------------------------------------------------------- */ + +template + template +void FixRxKokkos::computeLocalTemperature() +{ + //typename ArrayTypes::t_x_array_randomread d_x = atomKK->k_x.view(); + //typename ArrayTypes::t_int_1d_randomread d_type = atomKK->k_type.view(); + //typename ArrayTypes::t_efloat_1d d_dpdTheta = atomKK->k_dpdTheta.view(); + d_x = atomKK->k_x.view(); + d_type = atomKK->k_type.view(); + d_dpdTheta = atomKK->k_dpdTheta.view(); + + atomKK->sync(execution_space, X_MASK | TYPE_MASK | DPDTHETA_MASK ); + + //const int nlocal = atom->nlocal; + nlocal = atom->nlocal; + const int nghost = atom->nghost; + + //printf("Inside FixRxKokkos::computeLocalTemperature: %d %d %d %d %d %d %d\n", WT_FLAG, LOCAL_TEMP_FLAG, NEWTON_PAIR, (int)lmp->kokkos->neighflag, NEIGHFLAG, nlocal, nghost); + + // Pull from pairDPDE. The pairDPDEKK objects are protected so recreate here for now. + //pairDPDEKK->k_cutsq.template sync(); + //typename ArrayTypes::t_ffloat_2d d_cutsq = pairDPDEKK->k_cutsq.template view::tdual_ffloat_2d k_cutsq; + //typename ArrayTypes::t_ffloat_2d d_cutsq; + //double **h_cutsq; + + { + const int ntypes = atom->ntypes; + + //memoryKK->create_kokkos (k_cutsq, h_cutsq, ntypes+1, ntypes+1, "pair:cutsq"); + if (ntypes+1 > k_cutsq.dimension_0()) { + memoryKK->destroy_kokkos (k_cutsq); + memoryKK->create_kokkos (k_cutsq, ntypes+1, ntypes+1, "FixRxKokkos::k_cutsq"); + d_cutsq = k_cutsq.template view(); + } + + for (int i = 1; i <= ntypes; ++i) + for (int j = i; j <= ntypes; ++j) + { + k_cutsq.h_view(i,j) = pairDPDE->cutsq[i][j]; + k_cutsq.h_view(j,i) = k_cutsq.h_view(i,j); + } + + k_cutsq.template modify(); + k_cutsq.template sync(); + } + + // Initialize the local temperature weight array + int sumWeightsCt = nlocal + (NEWTON_PAIR ? nghost : 0); + + //memoryKK->create_kokkos (k_sumWeights, sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights"); + if (sumWeightsCt > k_sumWeights.template view().dimension_0()) { + memoryKK->destroy_kokkos(k_sumWeights, sumWeights); + memoryKK->create_kokkos (k_sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights"); + d_sumWeights = k_sumWeights.template view(); + h_sumWeights = k_sumWeights.h_view; + } + + // Initialize the accumulator to zero ... + //Kokkos::parallel_for (sumWeightsCt, + // LAMMPS_LAMBDA(const int i) + // { + // d_sumWeights(i) = 0.0; + // } + // ); + + Kokkos::parallel_for (Kokkos::RangePolicy(0, sumWeightsCt), *this); + + // Local list views. (This isn't working!) + NeighListKokkos* k_list = static_cast*>(list); + if (not(list->kokkos)) + error->one(FLERR,"list is not a Kokkos list\n"); + + //typename ArrayTypes::t_neighbors_2d d_neighbors = k_list->d_neighbors; + //typename ArrayTypes::t_int_1d d_ilist = k_list->d_ilist; + //typename ArrayTypes::t_int_1d d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + d_numneigh = k_list->d_numneigh; + + const int inum = list->inum; + + // loop over neighbors of my atoms +#if 0 + Kokkos::parallel_for ( inum, + LAMMPS_LAMBDA(const int ii) + { + // Create an atomic view of sumWeights and dpdThetaLocal. Only needed + // for Half/thread scenarios. + //typedef Kokkos::View< E_FLOAT*, typename DAT::t_efloat_1d::array_layout, DeviceType, Kokkos::MemoryTraits< AtomicF< NEIGHFLAG >::value> > AtomicViewType; + typedef Kokkos::View< E_FLOAT*, typename DAT::t_efloat_1d::array_layout, DeviceType, Kokkos::MemoryTraits< AtomicF< NEIGHFLAG >::value> > AtomicViewType; + + AtomicViewType a_dpdThetaLocal = d_dpdThetaLocal; + AtomicViewType a_sumWeights = d_sumWeights; + + // Local scalar accumulators. + double i_dpdThetaLocal = 0.0; + double i_sumWeights = 0.0; + + const int i = d_ilist(ii); + + const double xtmp = d_x(i,0); + const double ytmp = d_x(i,1); + const double ztmp = d_x(i,2); + const int itype = d_type(i); + + const int jnum = d_numneigh(i); + + for (int jj = 0; jj < jnum; jj++) + { + const int j = (d_neighbors(i,jj) & NEIGHMASK); + const int jtype = d_type(j); + + const double delx = xtmp - d_x(j,0); + const double dely = ytmp - d_x(j,1); + const double delz = ztmp - d_x(j,2); + const double rsq = delx*delx + dely*dely + delz*delz; + + const double cutsq_ij = d_cutsq(itype,jtype); + + if (rsq < cutsq_ij) + { + const double rcut = sqrt( cutsq_ij ); + double rij = sqrt(rsq); + double ratio = rij/rcut; + + double wij = 0.0; + + // Lucy's Weight Function + if (WT_FLAG == LUCY) + { + wij = (1.0+3.0*ratio) * (1.0-ratio)*(1.0-ratio)*(1.0-ratio); + i_dpdThetaLocal += wij / d_dpdTheta(j); + if (NEWTON_PAIR || j < nlocal) + a_dpdThetaLocal(j) += wij / d_dpdTheta(i); + } + + i_sumWeights += wij; + if (NEWTON_PAIR || j < nlocal) + a_sumWeights(j) += wij; + } + } + + // Update, don't assign, the array value (because another iteration may have hit it). + a_dpdThetaLocal(i) += i_dpdThetaLocal; + a_sumWeights(i) += i_sumWeights; + } + ); +#else + Kokkos::parallel_for (Kokkos::RangePolicy >(0, inum), *this); +#endif + + // Signal that dpdThetaLocal and sumWeights have been modified. + k_dpdThetaLocal.template modify(); + k_sumWeights. template modify(); + + // Communicate the sum dpdTheta and the weights on the host. + if (NEWTON_PAIR) comm->reverse_comm_fix(this); + + // Update the device view in case they got changed. + k_dpdThetaLocal.template sync(); + k_sumWeights. template sync(); + + // self-interaction for local temperature +#if 0 + Kokkos::parallel_for ( nlocal, + LAMMPS_LAMBDA(const int i) + { + double wij = 0.0; + + // Lucy Weight Function + if (WT_FLAG == LUCY) + { + wij = 1.0; + d_dpdThetaLocal(i) += wij / d_dpdTheta(i); + } + d_sumWeights(i) += wij; + + // Normalized local temperature + d_dpdThetaLocal(i) = d_dpdThetaLocal(i) / d_sumWeights(i); + + if (LOCAL_TEMP_FLAG == HARMONIC) + d_dpdThetaLocal(i) = 1.0 / d_dpdThetaLocal(i); + } + ); +#else + Kokkos::parallel_for (Kokkos::RangePolicy >(0, nlocal), *this); +#endif + +} + +/* ---------------------------------------------------------------------- */ + +template +int FixRxKokkos::pack_forward_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) +{ + //printf("inside FixRxKokkos::pack_forward_comm %d\n", comm->me); + + HAT::t_float_2d h_dvector = atomKK->k_dvector.h_view; + + int m = 0; + for (int ii = 0; ii < n; ii++) { + const int jj = list[ii]; + for(int ispecies = 0; ispecies < nspecies; ispecies++){ + buf[m++] = h_dvector(ispecies,jj); + buf[m++] = h_dvector(ispecies+nspecies,jj); + } + } + + //printf("done with FixRxKokkos::pack_forward_comm %d\n", comm->me); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::unpack_forward_comm(int n, int first, double *buf) +{ + //printf("inside FixRxKokkos::unpack_forward_comm %d\n", comm->me); + + HAT::t_float_2d h_dvector = atomKK->k_dvector.h_view; + + const int last = first + n ; + int m = 0; + for (int ii = first; ii < last; ii++){ + for (int ispecies = 0; ispecies < nspecies; ispecies++){ + h_dvector(ispecies,ii) = buf[m++]; + h_dvector(ispecies+nspecies,ii) = buf[m++]; + } + } + + //printf("done with FixRxKokkos::unpack_forward_comm %d\n", comm->me); +} + +/* ---------------------------------------------------------------------- */ + +template +int FixRxKokkos::pack_reverse_comm(int n, int first, double *buf) +{ + //printf("inside FixRxKokkos::pack_reverse_comm %d %d %d\n", comm->me, first, n); + // Sync the host view. + k_dpdThetaLocal.template sync(); + k_sumWeights. template sync(); + + const int last = first + n; + int m = 0; + for (int i = first; i < last; ++i) + { + buf[m++] = h_dpdThetaLocal(i); + buf[m++] = h_sumWeights(i); + } + //printf("done with FixRxKokkos::pack_reverse_comm %d\n", comm->me); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRxKokkos::unpack_reverse_comm(int n, int *list, double *buf) +{ + // printf("inside FixRxKokkos::unpack_reverse_comm %d\n", comm->me); + int m = 0; + for (int i = 0; i < n; i++) { + const int j = list[i]; + + h_dpdThetaLocal(j) += buf[m++]; + h_sumWeights(j) += buf[m++]; + } + + // Signal that the host view has been modified. + k_dpdThetaLocal.template modify(); + k_sumWeights. template modify(); + + // printf("done with FixRxKokkos::unpack_reverse_comm %d\n", comm->me); +} + +namespace LAMMPS_NS { +template class FixRxKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class FixRxKokkos; +#endif +} diff --git a/src/KOKKOS/fix_rx_kokkos.h b/src/KOKKOS/fix_rx_kokkos.h new file mode 100644 index 0000000000..92b715f34d --- /dev/null +++ b/src/KOKKOS/fix_rx_kokkos.h @@ -0,0 +1,282 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(rx/kk,FixRxKokkos) +FixStyle(rx/kk/device,FixRxKokkos) +FixStyle(rx/kk/host,FixRxKokkos) + +#else + +#ifndef LMP_FIX_RX_KOKKOS_H +#define LMP_FIX_RX_KOKKOS_H + +#include "fix_rx.h" +#include "pair_dpd_fdt_energy_kokkos.h" +#include "kokkos_type.h" +#include "neigh_list.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +struct Tag_FixRxKokkos_zeroTemperatureViews {}; +struct Tag_FixRxKokkos_zeroCounterViews {}; + +template +struct Tag_FixRxKokkos_firstPairOperator {}; + +template +struct Tag_FixRxKokkos_2ndPairOperator {}; + +template +struct Tag_FixRxKokkos_solveSystems {}; + +struct s_CounterType +{ + int nSteps, nIters, nFuncs, nFails; + + KOKKOS_INLINE_FUNCTION + s_CounterType() : nSteps(0), nIters(0), nFuncs(0), nFails(0) {}; + + KOKKOS_INLINE_FUNCTION + s_CounterType& operator+=(const s_CounterType &rhs) + { + nSteps += rhs.nSteps; + nIters += rhs.nIters; + nFuncs += rhs.nFuncs; + nFails += rhs.nFails; + return *this; + } + + KOKKOS_INLINE_FUNCTION + volatile s_CounterType& operator+=(const volatile s_CounterType &rhs) volatile + { + nSteps += rhs.nSteps; + nIters += rhs.nIters; + nFuncs += rhs.nFuncs; + nFails += rhs.nFails; + return *this; + } +}; +typedef struct s_CounterType CounterType; + +template +class FixRxKokkos : public FixRX { + public: + typedef ArrayTypes AT; + + FixRxKokkos(class LAMMPS *, int, char **); + virtual ~FixRxKokkos(); + virtual void init(); + void init_list(int, class NeighList *); + void post_constructor(); + virtual void setup_pre_force(int); + virtual void pre_force(int); + + // Define a value_type here for the reduction operator on CounterType. + typedef CounterType value_type; + + KOKKOS_INLINE_FUNCTION + void operator()(Tag_FixRxKokkos_zeroCounterViews, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(Tag_FixRxKokkos_zeroTemperatureViews, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(Tag_FixRxKokkos_firstPairOperator, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(Tag_FixRxKokkos_2ndPairOperator, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(Tag_FixRxKokkos_solveSystems, const int&, CounterType&) const; + + //protected: + PairDPDfdtEnergyKokkos* pairDPDEKK; + double VDPD; + + double boltz; + double t_stop; + + template + struct StridedArrayType + { + typedef T value_type; + enum { Stride = stride }; + + value_type *m_data; + + KOKKOS_INLINE_FUNCTION + StridedArrayType() : m_data(NULL) {} + KOKKOS_INLINE_FUNCTION + StridedArrayType(value_type *ptr) : m_data(ptr) {} + + KOKKOS_INLINE_FUNCTION value_type& operator()(const int idx) { return m_data[Stride*idx]; } + KOKKOS_INLINE_FUNCTION const value_type& operator()(const int idx) const { return m_data[Stride*idx]; } + KOKKOS_INLINE_FUNCTION value_type& operator[](const int idx) { return m_data[Stride*idx]; } + KOKKOS_INLINE_FUNCTION const value_type& operator[](const int idx) const { return m_data[Stride*idx]; } + }; + + template + struct UserRHSDataKokkos + { + StridedArrayType kFor; + StridedArrayType rxnRateLaw; + }; + + void solve_reactions(const int vflag, const bool isPreForce); + + int rhs (double, const double *, double *, void *) const; + int rhs_dense (double, const double *, double *, void *) const; + int rhs_sparse(double, const double *, double *, void *) const; + + template + KOKKOS_INLINE_FUNCTION + int k_rhs (double, const VectorType&, VectorType&, UserDataType& ) const; + + template + KOKKOS_INLINE_FUNCTION + int k_rhs_dense (double, const VectorType&, VectorType&, UserDataType& ) const; + + template + KOKKOS_INLINE_FUNCTION + int k_rhs_sparse(double, const VectorType&, VectorType&, UserDataType& ) const; + + //!< Classic Runge-Kutta 4th-order stepper. + void rk4(const double t_stop, double *y, double *rwork, void *v_params) const; + + //!< Runge-Kutta-Fehlberg ODE Solver. + void rkf45(const int neq, const double t_stop, double *y, double *rwork, void *v_params, CounterType& counter) const; + + //!< Runge-Kutta-Fehlberg ODE stepper function. + void rkf45_step (const int neq, const double h, double y[], double y_out[], + double rwk[], void *) const; + + //!< Initial step size estimation for the Runge-Kutta-Fehlberg ODE solver. + int rkf45_h0 (const int neq, const double t, const double t_stop, + const double hmin, const double hmax, + double& h0, double y[], double rwk[], void *v_params) const; + + //!< Classic Runge-Kutta 4th-order stepper. + template + KOKKOS_INLINE_FUNCTION + void k_rk4(const double t_stop, VectorType& y, VectorType& rwork, UserDataType& userData) const; + + //!< Runge-Kutta-Fehlberg ODE Solver. + template + KOKKOS_INLINE_FUNCTION + void k_rkf45(const int neq, const double t_stop, VectorType& y, VectorType& rwork, UserDataType& userData, CounterType& counter) const; + + //!< Runge-Kutta-Fehlberg ODE stepper function. + template + KOKKOS_INLINE_FUNCTION + void k_rkf45_step (const int neq, const double h, VectorType& y, VectorType& y_out, + VectorType& rwk, UserDataType& userData) const; + + //!< Initial step size estimation for the Runge-Kutta-Fehlberg ODE solver. + template + KOKKOS_INLINE_FUNCTION + int k_rkf45_h0 (const int neq, const double t, const double t_stop, + const double hmin, const double hmax, + double& h0, VectorType& y, VectorType& rwk, UserDataType& userData) const; + + //!< ODE Solver diagnostics. + void odeDiagnostics(void); + + //!< Special counters per-ode. + int *diagnosticCounterPerODEnSteps; + int *diagnosticCounterPerODEnFuncs; + DAT::tdual_int_1d k_diagnosticCounterPerODEnSteps; + DAT::tdual_int_1d k_diagnosticCounterPerODEnFuncs; + //typename ArrayTypes::t_int_1d d_diagnosticCounterPerODEnSteps; + //typename ArrayTypes::t_int_1d d_diagnosticCounterPerODEnFuncs; + typename AT::t_int_1d d_diagnosticCounterPerODEnSteps; + typename AT::t_int_1d d_diagnosticCounterPerODEnFuncs; + HAT::t_int_1d h_diagnosticCounterPerODEnSteps; + HAT::t_int_1d h_diagnosticCounterPerODEnFuncs; + + template + struct KineticsType + { + // Arrhenius rate coefficients. + typename ArrayTypes::t_float_1d Arr, nArr, Ea; + + // Dense versions. + typename ArrayTypes::t_float_2d stoich, stoichReactants, stoichProducts; + + // Sparse versions. + typename ArrayTypes::t_int_2d nuk, inu; + typename ArrayTypes::t_float_2d nu; + typename ArrayTypes::t_int_1d isIntegral; + }; + + //!< Kokkos versions of the kinetics data. + KineticsType h_kineticsData; + KineticsType d_kineticsData; + + bool update_kinetics_data; + + void create_kinetics_data(void); + + // Need a dual-view and device-view for dpdThetaLocal and sumWeights since they're used in several callbacks. + DAT::tdual_efloat_1d k_dpdThetaLocal, k_sumWeights; + //typename ArrayTypes::t_efloat_1d d_dpdThetaLocal, d_sumWeights; + typename AT::t_efloat_1d d_dpdThetaLocal, d_sumWeights; + HAT::t_efloat_1d h_dpdThetaLocal, h_sumWeights; + + typename ArrayTypes::t_x_array_randomread d_x ; + typename ArrayTypes::t_int_1d_randomread d_type ; + typename ArrayTypes::t_efloat_1d d_dpdTheta; + + typename ArrayTypes::tdual_ffloat_2d k_cutsq; + typename ArrayTypes::t_ffloat_2d d_cutsq; + //double **h_cutsq; + + typename ArrayTypes::t_neighbors_2d d_neighbors; + typename ArrayTypes::t_int_1d d_ilist ; + typename ArrayTypes::t_int_1d d_numneigh ; + + typename ArrayTypes::t_float_2d d_dvector; + typename ArrayTypes::t_int_1d d_mask ; + + typename ArrayTypes::t_double_1d d_scratchSpace; + size_t scratchSpaceSize; + + // Error flag for any failures. + DAT::tdual_int_scalar k_error_flag; + + template + void computeLocalTemperature(); + + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + int pack_forward_comm(int , int *, double *, int, int *); + void unpack_forward_comm(int , int , double *); + + //private: // replicate a few from FixRX + int my_restartFlag; + int nlocal; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/fix_setforce_kokkos.cpp b/src/KOKKOS/fix_setforce_kokkos.cpp index 5e26ef3610..e991609894 100644 --- a/src/KOKKOS/fix_setforce_kokkos.cpp +++ b/src/KOKKOS/fix_setforce_kokkos.cpp @@ -22,10 +22,11 @@ #include "respa.h" #include "input.h" #include "variable.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "force.h" #include "atom_masks.h" +#include "kokkos_base.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -45,7 +46,7 @@ FixSetForceKokkos::FixSetForceKokkos(LAMMPS *lmp, int narg, char **a datamask_modify = EMPTY_MASK; memory->destroy(sforce); - memory->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce"); + memoryKK->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce"); } /* ---------------------------------------------------------------------- */ @@ -55,7 +56,7 @@ FixSetForceKokkos::~FixSetForceKokkos() { if (copymode) return; - memory->destroy_kokkos(k_sforce,sforce); + memoryKK->destroy_kokkos(k_sforce,sforce); sforce = NULL; } @@ -89,16 +90,19 @@ void FixSetForceKokkos::post_force(int vflag) if (iregion >= 0) { region = domain->regions[iregion]; region->prematch(); - d_match = DAT::t_int_1d("setforce:d_match",nlocal); - region->match_all_kokkos(groupbit,d_match); + DAT::tdual_int_1d k_match = DAT::tdual_int_1d("setforce:k_match",nlocal); + KokkosBase* regionKKBase = dynamic_cast(region); + regionKKBase->match_all_kokkos(groupbit,k_match); + k_match.template sync(); + d_match = k_match.template view(); } // reallocate sforce array if necessary if (varflag == ATOM && atom->nmax > maxatom) { maxatom = atom->nmax; - memory->destroy_kokkos(k_sforce,sforce); - memory->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce"); + memoryKK->destroy_kokkos(k_sforce,sforce); + memoryKK->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce"); } foriginal[0] = foriginal[1] = foriginal[2] = 0.0; diff --git a/src/KOKKOS/fix_setforce_kokkos.h b/src/KOKKOS/fix_setforce_kokkos.h index dffa22c93a..3cbf3d3720 100644 --- a/src/KOKKOS/fix_setforce_kokkos.h +++ b/src/KOKKOS/fix_setforce_kokkos.h @@ -75,8 +75,8 @@ class FixSetForceKokkos : public FixSetForce { private: DAT::tdual_ffloat_2d k_sforce; - DAT::t_ffloat_2d_randomread d_sforce; - DAT::t_int_1d d_match; + typename AT::t_ffloat_2d_randomread d_sforce; + typename AT::t_int_1d d_match; typename AT::t_x_array_randomread x; typename AT::t_f_array f; diff --git a/src/KOKKOS/fix_shardlow_kokkos.cpp b/src/KOKKOS/fix_shardlow_kokkos.cpp new file mode 100644 index 0000000000..571f488023 --- /dev/null +++ b/src/KOKKOS/fix_shardlow_kokkos.cpp @@ -0,0 +1,815 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: + James Larentzos (U.S. Army Research Laboratory) + and Timothy I. Mattox (Engility Corporation) + + Martin Lisal (Institute of Chemical Process Fundamentals + of the Czech Academy of Sciences and J. E. Purkinje University) + + John Brennan, Joshua Moore and William Mattson (Army Research Lab) + + Please cite the related publications: + J. P. Larentzos, J. K. Brennan, J. D. Moore, M. Lisal, W. D. Mattson, + "Parallel implementation of isothermal and isoenergetic Dissipative + Particle Dynamics using Shardlow-like splitting algorithms", + Computer Physics Communications, 2014, 185, pp 1987--1998. + + M. Lisal, J. K. Brennan, J. Bonet Avalos, "Dissipative particle dynamics + at isothermal, isobaric, isoenergetic, and isoenthalpic conditions using + Shardlow-like splitting algorithms", Journal of Chemical Physics, 2011, + 135, 204105. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "fix_shardlow_kokkos.h" +#include "atom.h" +#include "atom_masks.h" +#include "atom_kokkos.h" +#include "force.h" +#include "update.h" +#include "respa.h" +#include "error.h" +#include +#include "atom_vec.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list_kokkos.h" +#include "neigh_request.h" +#include "memory_kokkos.h" +#include "domain.h" +#include "modify.h" +// #include "pair_dpd_fdt.h" +#include "pair_dpd_fdt_energy_kokkos.h" +#include "pair.h" +#include "npair_ssa_kokkos.h" +#include "citeme.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace random_external_state; + +#define EPSILON 1.0e-10 +#define EPSILON_SQUARED ((EPSILON) * (EPSILON)) + + +/* ---------------------------------------------------------------------- */ + +template +FixShardlowKokkos::FixShardlowKokkos(LAMMPS *lmp, int narg, char **arg) : + FixShardlow(lmp, narg, arg), k_pairDPDE(NULL), ghostmax(0), nlocal(0) , nghost(0) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + if (narg != 3) error->all(FLERR,"Illegal fix shardlow command"); + +// k_pairDPD = NULL; + k_pairDPDE = NULL; +// k_pairDPD = (PairDPDfdtKokkos *) force->pair_match("dpd/fdt",1); + k_pairDPDE = dynamic_cast *>(force->pair_match("dpd/fdt/energy",0)); + +// if(k_pairDPDE){ + comm_forward = 3; + comm_reverse = 5; +// } else { +// comm_forward = 3; +// comm_reverse = 3; +// } + + + if(/* k_pairDPD == NULL &&*/ k_pairDPDE == NULL) + error->all(FLERR,"Must use pair_style "/*"dpd/fdt/kk or "*/"dpd/fdt/energy/kk with fix shardlow/kk"); + +#ifdef DEBUG_SSA_PAIR_CT + d_counters = typename AT::t_int_2d("FixShardlowKokkos::d_counters", 2, 3); + d_hist = typename AT::t_int_1d("FixShardlowKokkos::d_hist", 32); +#ifndef KOKKOS_USE_CUDA_UVM + h_counters = Kokkos::create_mirror_view(d_counters); + h_hist = Kokkos::create_mirror_view(d_hist); +#else + h_counters = d_counters; + h_hist = d_hist; +#endif +#endif +} + +/* ---------------------------------------------------------------------- */ + +template +FixShardlowKokkos::~FixShardlowKokkos() +{ + ghostmax = 0; +} + +/* ---------------------------------------------------------------------- */ + +template +int FixShardlowKokkos::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE | PRE_NEIGHBOR; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixShardlowKokkos::init() +{ + FixShardlow::init(); + + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + +// neighbor->requests[irequest]->pair = 0; +// neighbor->requests[irequest]->fix = 1; +// neighbor->requests[irequest]->ghost= 1; +// neighbor->requests[irequest]->ssa = 1; + + int ntypes = atom->ntypes; + k_params = Kokkos::DualView + ("FixShardlowKokkos::params",ntypes+1,ntypes+1); + params = k_params.template view(); + k_pairDPDE->k_cutsq.template sync(); + d_cutsq = k_pairDPDE->k_cutsq.template view(); + + const double boltz2 = 2.0*force->boltz; + for (int i = 1; i <= ntypes; i++) { + for (int j = i; j <= ntypes; j++) { + F_FLOAT cutone = k_pairDPDE->cut[i][j]; + if (cutone > EPSILON) k_params.h_view(i,j).cutinv = 1.0/cutone; + else k_params.h_view(i,j).cutinv = FLT_MAX; + k_params.h_view(i,j).halfsigma = 0.5*k_pairDPDE->sigma[i][j]; + k_params.h_view(i,j).kappa = k_pairDPDE->kappa[i][j]; + k_params.h_view(i,j).alpha = sqrt(boltz2*k_pairDPDE->kappa[i][j]); + + k_params.h_view(j,i) = k_params.h_view(i,j); + + if(ik_cutsq.h_view(i,j); + } + } + } + + k_params.template modify(); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixShardlowKokkos::init_list(int id, NeighList *ptr) +{ + FixShardlow::init_list(id, ptr); + k_list = static_cast*>(ptr); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixShardlowKokkos::pre_neighbor() +{ + // NOTE: this logic is specific to orthogonal boxes, not triclinic + + // Enforce the constraint that ghosts must be contained in the nearest sub-domains + double bbx = domain->subhi[0] - domain->sublo[0]; + double bby = domain->subhi[1] - domain->sublo[1]; + double bbz = domain->subhi[2] - domain->sublo[2]; + + double rcut = 2.0*neighbor->cutneighmax; + + if (domain->triclinic) + error->all(FLERR,"Fix shardlow does not yet support triclinic geometries"); + + if(rcut >= bbx || rcut >= bby || rcut>= bbz ) + { + char fmt[] = {"Shardlow algorithm requires sub-domain length > 2*(rcut+skin). Either reduce the number of processors requested, or change the cutoff/skin: rcut= %e bbx= %e bby= %e bbz= %e\n"}; + char *msg = (char *) malloc(sizeof(fmt) + 4*15); + sprintf(msg, fmt, rcut, bbx, bby, bbz); + error->one(FLERR, msg); + } + + nlocal = atomKK->nlocal; + nghost = atomKK->nghost; + + // Allocate memory for h_v_t0 to hold the initial velocities for the ghosts + if (nghost > ghostmax) { + ghostmax = nghost; + k_v_t0 = DAT::tdual_v_array("FixShardlowKokkos:v_t0", ghostmax); + // d_v_t0 = k_v_t0.template view(); + h_v_t0 = k_v_t0.h_view; + } + + // Setup views of relevant data + x = atomKK->k_x.template view(); + v = atomKK->k_v.template view(); + h_v = atomKK->k_v.h_view; + uCond = atomKK->k_uCond.template view(); + h_uCond = atomKK->k_uCond.h_view; + uMech = atomKK->k_uMech.template view(); + h_uMech = atomKK->k_uMech.h_view; + type = atomKK->k_type.view(); + if (atomKK->rmass) { + massPerI = true; + masses = atomKK->k_rmass.view(); + } else { + massPerI = false; + masses = atomKK->k_mass.view(); + } +// if(k_pairDPDE){ + dpdTheta = atomKK->k_dpdTheta.view(); + +//} else { +//} +} + +template +void FixShardlowKokkos::setup_pre_neighbor() +{ + pre_neighbor(); +} + +/* ---------------------------------------------------------------------- */ + +#ifdef ENABLE_KOKKOS_DPD_CONSTANT_TEMPERATURE +#error "FixShardlowKokkos::ssa_update_dpd() is not functional yet - TIM 20170830" +/* ---------------------------------------------------------------------- + Perform the stochastic integration and Shardlow update for constant temperature + Allow for both per-type and per-atom mass + + NOTE: only implemented for orthogonal boxes, not triclinic +------------------------------------------------------------------------- */ +template +template +void FixShardlowKokkos::ssa_update_dpd( + int start_ii, int count, int id +) +{ + es_RNG_t RNGstate = d_rand_state(id); + + int ct = count; + int ii = start_ii; + + while (ct-- > 0) { + const int i = d_ilist(ii); + const int jlen = d_numneigh(ii); + + const double xtmp = x(i, 0); + const double ytmp = x(i, 1); + const double ztmp = x(i, 2); + + // load velocity for i from memory + double vxi = v(i, 0); + double vyi = v(i, 1); + double vzi = v(i, 2); + + const int itype = type(i); + + const double mass_i = masses(massPerI ? i : itype); + const double massinv_i = 1.0 / mass_i; + + // Loop over Directional Neighbors only + for (int jj = 0; jj < jlen; jj++) { + const int j = d_neighbors(ii,jj) & NEIGHMASK; + int jtype = type[j]; + + const X_FLOAT delx = xtmp - x(j, 0); + const X_FLOAT dely = ytmp - x(j, 1); + const X_FLOAT delz = ztmp - x(j, 2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) Kokkos::atomic_increment(&(d_counters(0, 0))); + else Kokkos::atomic_increment(&(d_counters(0, 1))); + Kokkos::atomic_increment(&(d_counters(0, 2))); + int rsqi = rsq / 8; + if (rsqi < 0) rsqi = 0; + else if (rsqi > 31) rsqi = 31; + Kokkos::atomic_increment(&(d_hist(rsqi))); +#endif + + // NOTE: r can be 0.0 in DPD systems, so do EPSILON_SQUARED test + if ((rsq < (STACKPARAMS?m_cutsq[itype][jtype]:d_cutsq(itype,jtype))) + && (rsq >= EPSILON_SQUARED)) { +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) Kokkos::atomic_increment(&(d_counters(1, 0))); + else Kokkos::atomic_increment(&(d_counters(1, 1))); + Kokkos::atomic_increment(&(d_counters(1, 2))); +#endif + double r = sqrt(rsq); + double rinv = 1.0/r; + double delx_rinv = delx*rinv; + double dely_rinv = dely*rinv; + double delz_rinv = delz*rinv; + + double wr = 1.0 - r*(STACKPARAMS?m_params[itype][jtype].cutinv:params(itype,jtype).cutinv); + double wdt = wr*wr*dt; + + double halfsigma_ij = STACKPARAMS?m_params[itype][jtype].halfsigma:params(itype,jtype).halfsigma; + double halfgamma_ij = halfsigma_ij*halfsigma_ij*boltz_inv*theta_ij_inv; + + double sigmaRand = halfsigma_ij*wr*dtsqrt*ftm2v * es_normal(RNGstate); + + const double mass_j = masses(massPerI ? j : jtype); + double massinv_j = 1.0 / mass_j; + + double gammaFactor = halfgamma_ij*wdt*ftm2v; + double inv_1p_mu_gammaFactor = 1.0/(1.0 + (massinv_i + massinv_j)*gammaFactor); + + double vxj = v(j, 0); + double vyj = v(j, 1); + double vzj = v(j, 2); + + // Compute the initial velocity difference between atom i and atom j + double delvx = vxi - vxj; + double delvy = vyi - vyj; + double delvz = vzi - vzj; + double dot_rinv = (delx_rinv*delvx + dely_rinv*delvy + delz_rinv*delvz); + + // Compute momentum change between t and t+dt + double factorA = sigmaRand - gammaFactor*dot_rinv; + + // Update the velocity on i + vxi += delx_rinv*factorA*massinv_i; + vyi += dely_rinv*factorA*massinv_i; + vzi += delz_rinv*factorA*massinv_i; + + // Update the velocity on j + vxj -= delx_rinv*factorA*massinv_j; + vyj -= dely_rinv*factorA*massinv_j; + vzj -= delz_rinv*factorA*massinv_j; + + //ii. Compute the new velocity diff + delvx = vxi - vxj; + delvy = vyi - vyj; + delvz = vzi - vzj; + dot_rinv = delx_rinv*delvx + dely_rinv*delvy + delz_rinv*delvz; + + // Compute the new momentum change between t and t+dt + double factorB = (sigmaRand - gammaFactor*dot_rinv)*inv_1p_mu_gammaFactor; + + // Update the velocity on i + vxi += delx_rinv*factorB*massinv_i; + vyi += dely_rinv*factorB*massinv_i; + vzi += delz_rinv*factorB*massinv_i; + + // Update the velocity on j + vxj -= delx_rinv*factorB*massinv_j; + vyj -= dely_rinv*factorB*massinv_j; + vzj -= delz_rinv*factorB*massinv_j; + + // Store updated velocity for j + v(j, 0) = vxj; + v(j, 1) = vyj; + v(j, 2) = vzj; + } + } + // store updated velocity for i + v(i, 0) = vxi; + v(i, 1) = vyi; + v(i, 2) = vzi; + } + + d_rand_state(id) = RNGstate; +} +#endif + +/* ---------------------------------------------------------------------- + Perform the stochastic integration and Shardlow update for constant energy + Allow for both per-type and per-atom mass + + NOTE: only implemented for orthogonal boxes, not triclinic +------------------------------------------------------------------------- */ +template +template +KOKKOS_INLINE_FUNCTION +void FixShardlowKokkos::ssa_update_dpde( + int start_ii, int count, int id +) const +{ + es_RNG_t RNGstate = d_rand_state(id); + + int ct = count; + int ii = start_ii; + + while (ct-- > 0) { + const int i = d_ilist(ii); + const int jlen = d_numneigh(ii); + + const double xtmp = x(i, 0); + const double ytmp = x(i, 1); + const double ztmp = x(i, 2); + + // load velocity for i from memory + double vxi = v(i, 0); + double vyi = v(i, 1); + double vzi = v(i, 2); + + double uMech_i = uMech(i); + double uCond_i = uCond(i); + const int itype = type(i); + + const double theta_i_inv = 1.0/dpdTheta(i); + const double mass_i = masses(massPerI ? i : itype); + const double massinv_i = 1.0 / mass_i; + const double mass_i_div_neg4_ftm2v = mass_i*(-0.25)/ftm2v; + + // Loop over Directional Neighbors only + for (int jj = 0; jj < jlen; jj++) { + const int j = d_neighbors(ii,jj) & NEIGHMASK; + const int jtype = type(j); + + const X_FLOAT delx = xtmp - x(j, 0); + const X_FLOAT dely = ytmp - x(j, 1); + const X_FLOAT delz = ztmp - x(j, 2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) Kokkos::atomic_increment(&(d_counters(0, 0))); + else Kokkos::atomic_increment(&(d_counters(0, 1))); + Kokkos::atomic_increment(&(d_counters(0, 2))); + int rsqi = rsq / 8; + if (rsqi < 0) rsqi = 0; + else if (rsqi > 31) rsqi = 31; + Kokkos::atomic_increment(&(d_hist(rsqi))); +#endif + + // NOTE: r can be 0.0 in DPD systems, so do EPSILON_SQUARED test + if ((rsq < (STACKPARAMS?m_cutsq[itype][jtype]:d_cutsq(itype,jtype))) + && (rsq >= EPSILON_SQUARED)) { +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) Kokkos::atomic_increment(&(d_counters(1, 0))); + else Kokkos::atomic_increment(&(d_counters(1, 1))); + Kokkos::atomic_increment(&(d_counters(1, 2))); +#endif + + double r = sqrt(rsq); + double rinv = 1.0/r; + double delx_rinv = delx*rinv; + double dely_rinv = dely*rinv; + double delz_rinv = delz*rinv; + + double wr = 1.0 - r*(STACKPARAMS?m_params[itype][jtype].cutinv:params(itype,jtype).cutinv); + double wdt = wr*wr*dt; + + // Compute the current temperature + double theta_j_inv = 1.0/dpdTheta(j); + double theta_ij_inv = 0.5*(theta_i_inv + theta_j_inv); + + double halfsigma_ij = STACKPARAMS?m_params[itype][jtype].halfsigma:params(itype,jtype).halfsigma; + double halfgamma_ij = halfsigma_ij*halfsigma_ij*boltz_inv*theta_ij_inv; + + double sigmaRand = halfsigma_ij*wr*dtsqrt*ftm2v * es_normal(RNGstate); + + const double mass_j = masses(massPerI ? j : jtype); + double mass_ij_div_neg4_ftm2v = mass_j*mass_i_div_neg4_ftm2v; + double massinv_j = 1.0 / mass_j; + + // Compute uCond + double kappa_ij = STACKPARAMS?m_params[itype][jtype].kappa:params(itype,jtype).kappa; + double alpha_ij = STACKPARAMS?m_params[itype][jtype].alpha:params(itype,jtype).alpha; + double del_uCond = alpha_ij*wr*dtsqrt * es_normal(RNGstate); + + del_uCond += kappa_ij*(theta_i_inv - theta_j_inv)*wdt; + uCond[j] -= del_uCond; + uCond_i += del_uCond; + + double gammaFactor = halfgamma_ij*wdt*ftm2v; + double inv_1p_mu_gammaFactor = 1.0/(1.0 + (massinv_i + massinv_j)*gammaFactor); + + double vxj = v(j, 0); + double vyj = v(j, 1); + double vzj = v(j, 2); + double dot4 = vxj*vxj + vyj*vyj + vzj*vzj; + double dot3 = vxi*vxi + vyi*vyi + vzi*vzi; + + // Compute the initial velocity difference between atom i and atom j + double delvx = vxi - vxj; + double delvy = vyi - vyj; + double delvz = vzi - vzj; + double dot_rinv = (delx_rinv*delvx + dely_rinv*delvy + delz_rinv*delvz); + + // Compute momentum change between t and t+dt + double factorA = sigmaRand - gammaFactor*dot_rinv; + + // Update the velocity on i + vxi += delx_rinv*factorA*massinv_i; + vyi += dely_rinv*factorA*massinv_i; + vzi += delz_rinv*factorA*massinv_i; + + // Update the velocity on j + vxj -= delx_rinv*factorA*massinv_j; + vyj -= dely_rinv*factorA*massinv_j; + vzj -= delz_rinv*factorA*massinv_j; + + //ii. Compute the new velocity diff + delvx = vxi - vxj; + delvy = vyi - vyj; + delvz = vzi - vzj; + dot_rinv = delx_rinv*delvx + dely_rinv*delvy + delz_rinv*delvz; + + // Compute the new momentum change between t and t+dt + double factorB = (sigmaRand - gammaFactor*dot_rinv)*inv_1p_mu_gammaFactor; + + // Update the velocity on i + vxi += delx_rinv*factorB*massinv_i; + vyi += dely_rinv*factorB*massinv_i; + vzi += delz_rinv*factorB*massinv_i; + double partial_uMech = (vxi*vxi + vyi*vyi + vzi*vzi - dot3)*massinv_j; + + // Update the velocity on j + vxj -= delx_rinv*factorB*massinv_j; + vyj -= dely_rinv*factorB*massinv_j; + vzj -= delz_rinv*factorB*massinv_j; + partial_uMech += (vxj*vxj + vyj*vyj + vzj*vzj - dot4)*massinv_i; + + // Store updated velocity for j + v(j, 0) = vxj; + v(j, 1) = vyj; + v(j, 2) = vzj; + + // Compute uMech + double del_uMech = partial_uMech*mass_ij_div_neg4_ftm2v; + uMech_i += del_uMech; + uMech(j) += del_uMech; + } + } + // store updated velocity for i + v(i, 0) = vxi; + v(i, 1) = vyi; + v(i, 2) = vzi; + // store updated uMech and uCond for i + uMech(i) = uMech_i; + uCond(i) = uCond_i; + ii++; + } + + d_rand_state(id) = RNGstate; +} + + +template +void FixShardlowKokkos::initial_integrate(int vflag) +{ + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + + copymode = 1; + + dtsqrt = sqrt(update->dt); + + NPairSSAKokkos *np_ssa = dynamic_cast*>(list->np); + if (!np_ssa) error->one(FLERR, "NPair wasn't a NPairSSAKokkos object"); + ssa_phaseCt = np_ssa->ssa_phaseCt; + ssa_phaseLen = np_ssa->ssa_phaseLen; + ssa_itemLoc = np_ssa->ssa_itemLoc; + ssa_itemLen = np_ssa->ssa_itemLen; + ssa_gphaseCt = np_ssa->ssa_gphaseCt; + ssa_gphaseLen = np_ssa->ssa_gphaseLen; + ssa_gitemLoc = np_ssa->ssa_gitemLoc; + ssa_gitemLen = np_ssa->ssa_gitemLen; + + np_ssa->k_ssa_itemLoc.template sync(); + np_ssa->k_ssa_itemLen.template sync(); + np_ssa->k_ssa_gitemLoc.template sync(); + np_ssa->k_ssa_gitemLen.template sync(); + + np_ssa->k_ssa_phaseLen.template sync(); + np_ssa->k_ssa_gphaseLen.template sync(); + auto h_ssa_phaseLen = np_ssa->k_ssa_phaseLen.h_view; + auto h_ssa_gphaseLen = np_ssa->k_ssa_gphaseLen.h_view; + + int maxWorkItemCt = (int) ssa_itemLoc.dimension_1(); + if (maxWorkItemCt < (int) ssa_gitemLoc.dimension_1()) { + maxWorkItemCt = (int) ssa_gitemLoc.dimension_1(); + } + if (maxWorkItemCt > maxRNG) { + es_RNG_t serial_rand_state; + es_init(serial_rand_state, pairDPDE->seed + comm->me); + + d_rand_state = es_RNGs_type("Kokkos::fix_shardlow::rand_state",maxWorkItemCt); + typename es_RNGs_type::HostMirror h_rand_state = create_mirror_view(d_rand_state); + for (int i = 0; i < maxWorkItemCt; ++i) { + es_genNextParallelState(serial_rand_state, h_rand_state(i)); + } + deep_copy(d_rand_state,h_rand_state); + + maxRNG = maxWorkItemCt; + } + +#ifdef DEBUG_SSA_PAIR_CT + for (int i = 0; i < 2; ++i) + for (int j = 0; j < 3; ++j) + h_counters(i,j) = 0; + for (int i = 0; i < 32; ++i) h_hist[i] = 0; + deep_copy(d_counters, h_counters); + deep_copy(d_hist, h_hist); +#endif + + //theta_ij_inv = 1.0/k_pairDPD->temperature; // independent of i,j + boltz_inv = 1.0/force->boltz; + ftm2v = force->ftm2v; + dt = update->dt; + + k_params.template sync(); + + // process neighbors in the local AIR + atomKK->sync(execution_space,X_MASK | V_MASK | TYPE_MASK | RMASS_MASK | UCOND_MASK | UMECH_MASK | DPDTHETA_MASK); + for (workPhase = 0; workPhase < ssa_phaseCt; ++workPhase) { + int workItemCt = h_ssa_phaseLen[workPhase]; + + if(atom->ntypes > MAX_TYPES_STACKPARAMS) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,workItemCt),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,workItemCt),*this); + } + atomKK->modified(execution_space,V_MASK | UCOND_MASK | UMECH_MASK); + + //Loop over all 13 outward directions (7 stages) + for (workPhase = 0; workPhase < ssa_gphaseCt; ++workPhase) { + // int airnum = workPhase + 1; + int workItemCt = h_ssa_gphaseLen[workPhase]; + + // Communicate the updated velocities to all nodes + atomKK->sync(Host,V_MASK); + comm->forward_comm_fix(this); + atomKK->modified(Host,V_MASK); + + if(k_pairDPDE){ + // Zero out the ghosts' uCond & uMech to be used as delta accumulators +// memset(&(atom->uCond[nlocal]), 0, sizeof(double)*nghost); +// memset(&(atom->uMech[nlocal]), 0, sizeof(double)*nghost); + + // must capture local variables, not class variables + atomKK->sync(execution_space,UCOND_MASK | UMECH_MASK); + auto l_uCond = uCond; + auto l_uMech = uMech; + Kokkos::parallel_for(Kokkos::RangePolicy(nlocal,nlocal+nghost), LAMMPS_LAMBDA (const int i) { + l_uCond(i) = 0.0; + l_uMech(i) = 0.0; + }); + atomKK->modified(execution_space,UCOND_MASK | UMECH_MASK); + } + + // process neighbors in this AIR + atomKK->sync(execution_space,X_MASK | V_MASK | TYPE_MASK | RMASS_MASK | UCOND_MASK | UMECH_MASK | DPDTHETA_MASK); + if(atom->ntypes > MAX_TYPES_STACKPARAMS) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,workItemCt),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,workItemCt),*this); + atomKK->modified(execution_space,V_MASK | UCOND_MASK | UMECH_MASK); + + // Communicate the ghost deltas to the atom owners + atomKK->sync(Host,V_MASK | UCOND_MASK | UMECH_MASK); + comm->reverse_comm_fix(this); + atomKK->modified(Host,V_MASK | UCOND_MASK | UMECH_MASK); + + } //End Loop over all directions For airnum = Top, Top-Right, Right, Bottom-Right, Back + +#ifdef DEBUG_SSA_PAIR_CT +deep_copy(h_counters, d_counters); +deep_copy(h_hist, d_hist); +for (int i = 0; i < 32; ++i) fprintf(stdout, "%8d", h_hist[i]); +fprintf(stdout, "\n%6d %6d,%6d %6d: " + ,h_counters(0, 2) + ,h_counters(1, 2) + ,h_counters(0, 1) + ,h_counters(1, 1) +); +#endif + + copymode = 0; +} + +template +template +KOKKOS_INLINE_FUNCTION +void FixShardlowKokkos::operator()(TagFixShardlowSSAUpdateDPDE, const int &workItem) const { + const int ct = ssa_itemLen(workPhase, workItem); + const int ii = ssa_itemLoc(workPhase, workItem); + ssa_update_dpde(ii, ct, workItem); +} + +template +template +KOKKOS_INLINE_FUNCTION +void FixShardlowKokkos::operator()(TagFixShardlowSSAUpdateDPDEGhost, const int &workItem) const { + const int ct = ssa_gitemLen(workPhase, workItem); + const int ii = ssa_gitemLoc(workPhase, workItem); + ssa_update_dpde(ii, ct, workItem); +} + +/* ---------------------------------------------------------------------- */ + +template +int FixShardlowKokkos::pack_forward_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) +{ + int ii,jj,m; + + m = 0; + for (ii = 0; ii < n; ii++) { + jj = list[ii]; + buf[m++] = h_v(jj, 0); + buf[m++] = h_v(jj, 1); + buf[m++] = h_v(jj, 2); + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixShardlowKokkos::unpack_forward_comm(int n, int first, double *buf) +{ + int ii,m,last; + + m = 0; + last = first + n ; + for (ii = first; ii < last; ii++) { + h_v_t0(ii - nlocal, 0) = h_v(ii, 0) = buf[m++]; + h_v_t0(ii - nlocal, 1) = h_v(ii, 1) = buf[m++]; + h_v_t0(ii - nlocal, 2) = h_v(ii, 2) = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +template +int FixShardlowKokkos::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = h_v(i, 0) - h_v_t0(i - nlocal, 0); + buf[m++] = h_v(i, 1) - h_v_t0(i - nlocal, 1); + buf[m++] = h_v(i, 2) - h_v_t0(i - nlocal, 2); + if(k_pairDPDE){ + buf[m++] = h_uCond(i); // for ghosts, this is an accumulated delta + buf[m++] = h_uMech(i); // for ghosts, this is an accumulated delta + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixShardlowKokkos::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + + h_v(j, 0) += buf[m++]; + h_v(j, 1) += buf[m++]; + h_v(j, 2) += buf[m++]; + if(k_pairDPDE){ + h_uCond(j) += buf[m++]; // add in the accumulated delta + h_uMech(j) += buf[m++]; // add in the accumulated delta + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +double FixShardlowKokkos::memory_usage() +{ + double bytes = 0.0; + bytes += sizeof(double)*3*ghostmax; // v_t0[] + return bytes; +} + +namespace LAMMPS_NS { +template class FixShardlowKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class FixShardlowKokkos; +#endif +} diff --git a/src/KOKKOS/fix_shardlow_kokkos.h b/src/KOKKOS/fix_shardlow_kokkos.h new file mode 100644 index 0000000000..4e87de6910 --- /dev/null +++ b/src/KOKKOS/fix_shardlow_kokkos.h @@ -0,0 +1,189 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(shardlow/kk,FixShardlowKokkos) +FixStyle(shardlow/kk/device,FixShardlowKokkos) +FixStyle(shardlow/kk/host,FixShardlowKokkos) + +#else + +#ifndef LMP_FIX_SHARDLOW_KOKKOS_H +#define LMP_FIX_SHARDLOW_KOKKOS_H + +#include "float.h" +#include "fix_shardlow.h" +#include "kokkos_type.h" +#include "neigh_list_kokkos.h" +#ifdef ENABLE_KOKKOS_DPD_CONSTANT_TEMPERATURE +#include "pair_dpd_fdt_kokkos.h" +#endif +#include "pair_dpd_fdt_energy_kokkos.h" + +namespace LAMMPS_NS { + +template +struct TagFixShardlowSSAUpdateDPDE{}; + +template +struct TagFixShardlowSSAUpdateDPDEGhost{}; + +template +class FixShardlowKokkos : public FixShardlow { + public: + typedef ArrayTypes AT; + NeighListKokkos *k_list; // The SSA specific neighbor list + + FixShardlowKokkos(class LAMMPS *, int, char **); + ~FixShardlowKokkos(); + int setmask(); + virtual void init(); + virtual void init_list(int, class NeighList *); + virtual void initial_integrate(int); + void setup_pre_neighbor(); + void pre_neighbor(); + + double memory_usage(); + + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + int pack_forward_comm(int , int *, double *, int, int *); + void unpack_forward_comm(int , int , double *); + + struct params_ssa { + KOKKOS_INLINE_FUNCTION + params_ssa(){cutinv=FLT_MAX;halfsigma=0;kappa=0;alpha=0;}; + KOKKOS_INLINE_FUNCTION + params_ssa(int i){cutinv=FLT_MAX;halfsigma=0;kappa=0;alpha=0;}; + F_FLOAT cutinv,halfsigma,kappa,alpha; + }; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagFixShardlowSSAUpdateDPDE, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagFixShardlowSSAUpdateDPDEGhost, const int&) const; + +#ifdef DEBUG_SSA_PAIR_CT + typename AT::t_int_2d d_counters; + typename HAT::t_int_2d h_counters; + typename AT::t_int_1d d_hist; + typename HAT::t_int_1d h_hist; +#endif + + protected: + int workPhase; + double theta_ij_inv,boltz_inv,ftm2v,dt; + +#ifdef ENABLE_KOKKOS_DPD_CONSTANT_TEMPERATURE +// class PairDPDfdt *pairDPD; FIXME as per k_pairDPDE below +#endif + PairDPDfdtEnergyKokkos *k_pairDPDE; + + Kokkos::DualView k_params; + typename Kokkos::DualView::t_dev_const_um params; + // hardwired to space for MAX_TYPES_STACKPARAMS (12) atom types + params_ssa m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + typename ArrayTypes::t_ffloat_2d d_cutsq; + + typename DAT::tdual_v_array k_v_t0; + // typename AT::t_v_array d_v_t0; v_t0 only used in comm routines (on host) + typename HAT::t_v_array h_v_t0; + + typename AT::t_x_array x; + typename AT::t_v_array v; + typename HAT::t_v_array h_v; + typename AT::t_efloat_1d uCond, uMech; + typename HAT::t_efloat_1d h_uCond, h_uMech; + typename AT::t_int_1d type; + bool massPerI; + typename AT::t_float_1d_randomread masses; + typename AT::t_efloat_1d dpdTheta; + + // Storage for the es_RNG state variables + typedef Kokkos::View es_RNGs_type; + es_RNGs_type d_rand_state; + + double dtsqrt; // = sqrt(update->dt); + int ghostmax; + int nlocal, nghost; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d_randomread d_ilist, d_numneigh; + + int ssa_phaseCt; + typename AT::t_int_1d ssa_phaseLen; + typename AT::t_int_2d ssa_itemLoc, ssa_itemLen; + + int ssa_gphaseCt; + typename AT::t_int_1d ssa_gphaseLen; + typename AT::t_int_2d ssa_gitemLoc, ssa_gitemLen; + + +#ifdef ENABLE_KOKKOS_DPD_CONSTANT_TEMPERATURE + template + KOKKOS_INLINE_FUNCTION + void ssa_update_dpd(int, int, int) const; // Constant Temperature +#endif + template + KOKKOS_INLINE_FUNCTION + void ssa_update_dpde(int, int, int) const; // Constant Energy + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Must use dpd/fdt pair_style with fix shardlow + +Self-explanatory. + +E: Must use pair_style dpd/fdt or dpd/fdt/energy with fix shardlow + +E: A deterministic integrator must be specified after fix shardlow in input +file (e.g. fix nve or fix nph). + +Self-explanatory. + +E: Cannot use constant temperature integration routines with DPD + +Self-explanatory. Must use deterministic integrators such as nve or nph + +E: Fix shardlow does not yet support triclinic geometries + +Self-explanatory. + +E: Shardlow algorithm requires sub-domain length > 2*(rcut+skin). Either +reduce the number of processors requested, or change the cutoff/skin + +The Shardlow splitting algorithm requires the size of the sub-domain lengths +to be are larger than twice the cutoff+skin. Generally, the domain decomposition +is dependant on the number of processors requested. + +*/ diff --git a/src/KOKKOS/fix_wall_lj93_kokkos.cpp b/src/KOKKOS/fix_wall_lj93_kokkos.cpp new file mode 100644 index 0000000000..602922d0ec --- /dev/null +++ b/src/KOKKOS/fix_wall_lj93_kokkos.cpp @@ -0,0 +1,104 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include "fix_wall_lj93_kokkos.h" +#include "atom_kokkos.h" +#include "error.h" +#include "atom_masks.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +template +FixWallLJ93Kokkos::FixWallLJ93Kokkos(LAMMPS *lmp, int narg, char **arg) : + FixWallLJ93(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + virial_flag = 0; +} + +/* ---------------------------------------------------------------------- + interaction of all particles in group with a wall + m = index of wall coeffs + which = xlo,xhi,ylo,yhi,zlo,zhi + error if any particle is on or behind wall +------------------------------------------------------------------------- */ + +template +void FixWallLJ93Kokkos::wall_particle(int m_in, int which, double coord_in) +{ + m = m_in; + coord = coord_in; + + atomKK->sync(execution_space, X_MASK|F_MASK|MASK_MASK); + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + mask = atomKK->k_mask.view(); + DAT::tdual_int_scalar k_oneflag = DAT::tdual_int_scalar("fix:oneflag"); + d_oneflag = k_oneflag.view(); + + int nlocal = atom->nlocal; + + dim = which / 2; + side = which % 2; + if (side == 0) side = -1; + + copymode = 1; + FixWallLJ93KokkosFunctor wp_functor(this); + Kokkos::parallel_reduce(nlocal,wp_functor,ewall); + copymode = 0; + + atomKK->modified(execution_space, F_MASK); + + k_oneflag.template modify(); + k_oneflag.template sync(); + if (k_oneflag.h_view()) error->one(FLERR,"Particle on or inside fix wall surface"); +} + +template +KOKKOS_INLINE_FUNCTION +void FixWallLJ93Kokkos::wall_particle_item(int i, value_type ewall) const { + if (mask(i) & groupbit) { + double delta; + if (side < 0) delta = x(i,dim) - coord; + else delta = coord - x(i,dim); + if (delta >= cutoff[m]) return; + if (delta <= 0.0) { + d_oneflag() = 1; + return; + } + double rinv = 1.0/delta; + double r2inv = rinv*rinv; + double r4inv = r2inv*r2inv; + double r10inv = r4inv*r4inv*r2inv; + double fwall = side * (coeff1[m]*r10inv - coeff2[m]*r4inv); + f(i,dim) -= fwall; + ewall[0] += coeff3[m]*r4inv*r4inv*rinv - + coeff4[m]*r2inv*rinv - offset[m]; + ewall[m+1] += fwall; + } +} + +namespace LAMMPS_NS { +template class FixWallLJ93Kokkos; +#ifdef KOKKOS_HAVE_CUDA +template class FixWallLJ93Kokkos; +#endif +} diff --git a/src/KOKKOS/fix_wall_lj93_kokkos.h b/src/KOKKOS/fix_wall_lj93_kokkos.h new file mode 100644 index 0000000000..64f3c59a62 --- /dev/null +++ b/src/KOKKOS/fix_wall_lj93_kokkos.h @@ -0,0 +1,83 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(wall/lj93/kk,FixWallLJ93Kokkos) +FixStyle(wall/lj93/kk/device,FixWallLJ93Kokkos) +FixStyle(wall/lj93/kk/host,FixWallLJ93Kokkos) + +#else + +#ifndef LMP_FIX_WALL_LJ93_KOKKOS_H +#define LMP_FIX_WALL_LJ93_KOKKOS_H + +#include "fix_wall_lj93.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixWallLJ93Kokkos : public FixWallLJ93 { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef double value_type[]; + + FixWallLJ93Kokkos(class LAMMPS *, int, char **); + void wall_particle(int, int, double); + + int m; + + KOKKOS_INLINE_FUNCTION + void wall_particle_item(int, value_type) const; + + private: + int dim,side; + double coord; + + typename AT::t_x_array x; + typename AT::t_f_array f; + typename AT::t_int_1d mask; + typename AT::t_int_scalar d_oneflag; +}; + +template +struct FixWallLJ93KokkosFunctor { + typedef DeviceType device_type ; + typedef double value_type[]; + const int value_count; + + FixWallLJ93Kokkos c; + FixWallLJ93KokkosFunctor(FixWallLJ93Kokkos* c_ptr): + c(*c_ptr), + value_count(c_ptr->m+1) {} + KOKKOS_INLINE_FUNCTION + void operator()(const int i, value_type ewall) const { + c.wall_particle_item(i,ewall); + } +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Particle on or inside fix wall surface + +Particles must be "exterior" to the wall in order for energy/force to +be calculated. + +*/ diff --git a/src/KOKKOS/gridcomm_kokkos.cpp b/src/KOKKOS/gridcomm_kokkos.cpp index 6871ef67ae..f107370514 100644 --- a/src/KOKKOS/gridcomm_kokkos.cpp +++ b/src/KOKKOS/gridcomm_kokkos.cpp @@ -15,8 +15,9 @@ #include "gridcomm_kokkos.h" #include "comm.h" #include "kspace.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" +#include "kokkos_base.h" using namespace LAMMPS_NS; @@ -126,8 +127,8 @@ template GridCommKokkos::~GridCommKokkos() { for (int i = 0; i < nswap; i++) { - //memory->destroy_kokkos(swap[i].k_packlist,swap[i].packlist); - //memory->destroy_kokkos(swap[i].k_unpacklist,swap[i].unpacklist); + //memoryKK->destroy_kokkos(swap[i].k_packlist,swap[i].packlist); + //memoryKK->destroy_kokkos(swap[i].k_unpacklist,swap[i].unpacklist); } memory->sfree(swap); @@ -515,11 +516,14 @@ void GridCommKokkos::forward_comm(KSpace *kspace, int which) k_packlist.sync(); k_unpacklist.sync(); + KokkosBase* kspaceKKBase = dynamic_cast(kspace); + for (int m = 0; m < nswap; m++) { if (swap[m].sendproc == me) - kspace->pack_forward_kokkos(which,k_buf2,swap[m].npack,k_packlist,m); + kspaceKKBase->pack_forward_kspace_kokkos(which,k_buf2,swap[m].npack,k_packlist,m); else - kspace->pack_forward_kokkos(which,k_buf1,swap[m].npack,k_packlist,m); + kspaceKKBase->pack_forward_kspace_kokkos(which,k_buf1,swap[m].npack,k_packlist,m); + DeviceType::fence(); if (swap[m].sendproc != me) { MPI_Irecv(k_buf2.view().ptr_on_device(),nforward*swap[m].nunpack,MPI_FFT_SCALAR, @@ -529,7 +533,8 @@ void GridCommKokkos::forward_comm(KSpace *kspace, int which) MPI_Wait(&request,MPI_STATUS_IGNORE); } - kspace->unpack_forward_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m); + kspaceKKBase->unpack_forward_kspace_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m); + DeviceType::fence(); } } @@ -544,11 +549,14 @@ void GridCommKokkos::reverse_comm(KSpace *kspace, int which) k_packlist.sync(); k_unpacklist.sync(); + KokkosBase* kspaceKKBase = dynamic_cast(kspace); + for (int m = nswap-1; m >= 0; m--) { if (swap[m].recvproc == me) - kspace->pack_reverse_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m); + kspaceKKBase->pack_reverse_kspace_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m); else - kspace->pack_reverse_kokkos(which,k_buf1,swap[m].nunpack,k_unpacklist,m); + kspaceKKBase->pack_reverse_kspace_kokkos(which,k_buf1,swap[m].nunpack,k_unpacklist,m); + DeviceType::fence(); if (swap[m].recvproc != me) { MPI_Irecv(k_buf2.view().ptr_on_device(),nreverse*swap[m].npack,MPI_FFT_SCALAR, @@ -558,7 +566,8 @@ void GridCommKokkos::reverse_comm(KSpace *kspace, int which) MPI_Wait(&request,MPI_STATUS_IGNORE); } - kspace->unpack_reverse_kokkos(which,k_buf2,swap[m].npack,k_packlist,m); + kspaceKKBase->unpack_reverse_kspace_kokkos(which,k_buf2,swap[m].npack,k_packlist,m); + DeviceType::fence(); } } diff --git a/src/KOKKOS/improper_class2_kokkos.cpp b/src/KOKKOS/improper_class2_kokkos.cpp index c2cb7dfe2b..d2d465a250 100644 --- a/src/KOKKOS/improper_class2_kokkos.cpp +++ b/src/KOKKOS/improper_class2_kokkos.cpp @@ -26,7 +26,7 @@ #include "force.h" #include "update.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -58,8 +58,8 @@ template ImproperClass2Kokkos::~ImproperClass2Kokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -78,15 +78,15 @@ void ImproperClass2Kokkos::compute(int eflag_in, int vflag_in) if (eflag_atom) { //if(k_eatom.dimension_0()destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); d_eatom = k_eatom.template view(); //} } if (vflag_atom) { //if(k_vatom.dimension_0()destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); d_vatom = k_vatom.template view(); //} } diff --git a/src/KOKKOS/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp index 1e58e18c51..49dd36ed19 100644 --- a/src/KOKKOS/improper_harmonic_kokkos.cpp +++ b/src/KOKKOS/improper_harmonic_kokkos.cpp @@ -26,7 +26,7 @@ #include "force.h" #include "update.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -58,8 +58,8 @@ template ImproperHarmonicKokkos::~ImproperHarmonicKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -78,15 +78,15 @@ void ImproperHarmonicKokkos::compute(int eflag_in, int vflag_in) if (eflag_atom) { //if(k_eatom.dimension_0()destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom"); d_eatom = k_eatom.template view(); //} } if (vflag_atom) { //if(k_vatom.dimension_0()destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom"); d_vatom = k_vatom.template view(); //} } @@ -309,8 +309,8 @@ void ImproperHarmonicKokkos::allocate() k_k = Kokkos::DualView("ImproperHarmonic::k",n+1); k_chi = Kokkos::DualView("ImproperHarmonic::chi",n+1); - d_k = k_k.d_view; - d_chi = k_chi.d_view; + d_k = k_k.template view(); + d_chi = k_chi.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index b8be74ac1e..5a74223353 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -23,6 +23,7 @@ #include "neighbor_kokkos.h" #include "neigh_list_kokkos.h" #include "error.h" +#include "memory_kokkos.h" using namespace LAMMPS_NS; @@ -33,6 +34,10 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) kokkos_exists = 1; lmp->kokkos = this; + delete memory; + memory = new MemoryKokkos(lmp); + memoryKK = (MemoryKokkos*) memory; + auto_sync = 1; int me = 0; @@ -123,8 +128,10 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) neighflag_qeq_set = 0; exchange_comm_classic = 0; forward_comm_classic = 0; + reverse_comm_classic = 0; exchange_comm_on_host = 0; forward_comm_on_host = 0; + reverse_comm_on_host = 0; #ifdef KILL_KOKKOS_ON_SIGSEGV signal(SIGSEGV, my_signal_handler); @@ -158,8 +165,8 @@ void KokkosLMP::accelerator(int narg, char **arg) neighflag_qeq_set = 0; int newtonflag = 0; double binsize = 0.0; - exchange_comm_classic = forward_comm_classic = 0; - exchange_comm_on_host = forward_comm_on_host = 0; + exchange_comm_classic = forward_comm_classic = reverse_comm_classic = 0; + exchange_comm_on_host = forward_comm_on_host = reverse_comm_on_host = 0; int iarg = 0; while (iarg < narg) { @@ -200,13 +207,13 @@ void KokkosLMP::accelerator(int narg, char **arg) } else if (strcmp(arg[iarg],"comm") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal package kokkos command"); if (strcmp(arg[iarg+1],"no") == 0) { - exchange_comm_classic = forward_comm_classic = 1; + exchange_comm_classic = forward_comm_classic = reverse_comm_classic = 1; } else if (strcmp(arg[iarg+1],"host") == 0) { - exchange_comm_classic = forward_comm_classic = 0; - exchange_comm_on_host = forward_comm_on_host = 1; + exchange_comm_classic = forward_comm_classic = reverse_comm_classic = 0; + exchange_comm_on_host = forward_comm_on_host = reverse_comm_on_host = 1; } else if (strcmp(arg[iarg+1],"device") == 0) { - exchange_comm_classic = forward_comm_classic = 0; - exchange_comm_on_host = forward_comm_on_host = 0; + exchange_comm_classic = forward_comm_classic = reverse_comm_classic = 0; + exchange_comm_on_host = forward_comm_on_host = reverse_comm_on_host = 0; } else error->all(FLERR,"Illegal package kokkos command"); iarg += 2; } else if (strcmp(arg[iarg],"comm/exchange") == 0) { @@ -231,6 +238,17 @@ void KokkosLMP::accelerator(int narg, char **arg) forward_comm_on_host = 0; } else error->all(FLERR,"Illegal package kokkos command"); iarg += 2; + } else if (strcmp(arg[iarg],"comm/reverse") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal package kokkos command"); + if (strcmp(arg[iarg+1],"no") == 0) reverse_comm_classic = 1; + else if (strcmp(arg[iarg+1],"host") == 0) { + reverse_comm_classic = 0; + reverse_comm_on_host = 1; + } else if (strcmp(arg[iarg+1],"device") == 0) { + reverse_comm_classic = 0; + reverse_comm_on_host = 0; + } else error->all(FLERR,"Illegal package kokkos command"); + iarg += 2; } else error->all(FLERR,"Illegal package kokkos command"); } @@ -293,4 +311,4 @@ void KokkosLMP::my_signal_handler(int sig) if (sig == SIGSEGV) { kill(getpid(),SIGABRT); } -} \ No newline at end of file +} diff --git a/src/KOKKOS/kokkos.h b/src/KOKKOS/kokkos.h index 8e28b38cbf..7b7848f1f0 100644 --- a/src/KOKKOS/kokkos.h +++ b/src/KOKKOS/kokkos.h @@ -27,8 +27,10 @@ class KokkosLMP : protected Pointers { int neighflag_qeq_set; int exchange_comm_classic; int forward_comm_classic; + int reverse_comm_classic; int exchange_comm_on_host; int forward_comm_on_host; + int reverse_comm_on_host; int num_threads,ngpu; int numa; int auto_sync; diff --git a/src/KOKKOS/kokkos_base.h b/src/KOKKOS/kokkos_base.h new file mode 100644 index 0000000000..3279cb2947 --- /dev/null +++ b/src/KOKKOS/kokkos_base.h @@ -0,0 +1,47 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef KOKKOS_BASE_H +#define KOKKOS_BASE_H + +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +class KokkosBase { + public: + KokkosBase() {} + + //Kspace + virtual void pack_forward_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; + virtual void unpack_forward_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; + virtual void pack_reverse_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; + virtual void unpack_reverse_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; + + // Pair + virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, + int, DAT::tdual_xfloat_1d &, + int, int *) {return 0;}; + virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d &) {} + + // Region + virtual void match_all_kokkos(int, DAT::tdual_int_1d) {} +}; + +} + +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index 5b53b8ed05..6b6fc8610a 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -106,6 +106,71 @@ typedef double FFT_SCALAR; } }; +template +struct t_scalar3 { + Scalar x,y,z; + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3() { + x = 0; y = 0; z = 0; + } + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3(const t_scalar3& rhs) { + x = rhs.x; y = rhs.y; z = rhs.z; + } + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3(const Scalar& x_, const Scalar& y_, const Scalar& z_ ) { + x = x_; y = y_; z = z_; + } + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3 operator= (const t_scalar3& rhs) { + x = rhs.x; y = rhs.y; z = rhs.z; + return *this; + } + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3 operator= (const volatile t_scalar3& rhs) { + x = rhs.x; y = rhs.y; z = rhs.z; + return *this; + } + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3 operator+= (const t_scalar3& rhs) { + x += rhs.x; y += rhs.y; z += rhs.z; + return *this; + } + + KOKKOS_FORCEINLINE_FUNCTION + t_scalar3 operator+= (const volatile t_scalar3& rhs) volatile { + x += rhs.x; y += rhs.y; z += rhs.z; + return *this; + } +}; + +template +KOKKOS_FORCEINLINE_FUNCTION +t_scalar3 operator + + (const t_scalar3& a, const t_scalar3& b) { + return t_scalar3(a.x+b.x,a.y+b.y,a.z+b.z); +} + +template +KOKKOS_FORCEINLINE_FUNCTION +t_scalar3 operator * + (const t_scalar3& a, const Scalar& b) { + return t_scalar3(a.x*b,a.y*b,a.z*b); +} + +template +KOKKOS_FORCEINLINE_FUNCTION +t_scalar3 operator * + (const Scalar& b, const t_scalar3& a) { + return t_scalar3(a.x*b,a.y*b,a.z*b); +} + #if !defined(__CUDACC__) && !defined(__VECTOR_TYPES_H__) struct double2 { double x, y; @@ -324,6 +389,8 @@ typedef double2 K_FLOAT2; typedef double4 K_FLOAT4; #endif +typedef int T_INT; + // ------------------------------------------------------------------------ // LAMMPS types diff --git a/src/KOKKOS/memory_kokkos.h b/src/KOKKOS/memory_kokkos.h index 8ade198c40..9f930faae2 100644 --- a/src/KOKKOS/memory_kokkos.h +++ b/src/KOKKOS/memory_kokkos.h @@ -11,6 +11,18 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +#ifndef LMP_MEMORY_KOKKOS_H +#define LMP_MEMORY_KOKKOS_H + +#include "memory.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +class MemoryKokkos : public Memory { + public: + MemoryKokkos(class LAMMPS *lmp) : Memory(lmp) {} + /* ---------------------------------------------------------------------- Kokkos versions of create/grow/destroy multi-dimensional arrays ------------------------------------------------------------------------- */ @@ -279,3 +291,10 @@ void destroy_kokkos(TYPE data, typename TYPE::value_type** &array) sfree(array); array = NULL; } + +}; + +} + +#endif + diff --git a/src/KOKKOS/nbin_kokkos.cpp b/src/KOKKOS/nbin_kokkos.cpp index 5e41787247..95ea105ad9 100644 --- a/src/KOKKOS/nbin_kokkos.cpp +++ b/src/KOKKOS/nbin_kokkos.cpp @@ -75,6 +75,10 @@ void NBinKokkos::bin_atoms_setup(int nall) k_bincount = DAT::tdual_int_1d("Neighbor::d_bincount",mbins); bincount = k_bincount.view(); } + if (nall > k_atom2bin.d_view.dimension_0()) { + k_atom2bin = DAT::tdual_int_1d("Neighbor::d_atom2bin",nall); + atom2bin = k_atom2bin.view(); + } } /* ---------------------------------------------------------------------- @@ -86,6 +90,10 @@ void NBinKokkos::bin_atoms() { last_bin = update->ntimestep; + k_bins.template sync(); + k_bincount.template sync(); + k_atom2bin.template sync(); + h_resize() = 1; while(h_resize() > 0) { @@ -95,7 +103,6 @@ void NBinKokkos::bin_atoms() MemsetZeroFunctor f_zero; f_zero.ptr = (void*) k_bincount.view().ptr_on_device(); Kokkos::parallel_for(mbins, f_zero); - DeviceType::fence(); atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); x = atomKK->k_x.view(); @@ -106,7 +113,6 @@ void NBinKokkos::bin_atoms() NPairKokkosBinAtomsFunctor f(*this); Kokkos::parallel_for(atom->nlocal+atom->nghost, f); - DeviceType::fence(); deep_copy(h_resize, d_resize); if(h_resize()) { @@ -117,6 +123,10 @@ void NBinKokkos::bin_atoms() c_bins = bins; } } + + k_bins.template modify(); + k_bincount.template modify(); + k_atom2bin.template modify(); } /* ---------------------------------------------------------------------- */ @@ -127,6 +137,7 @@ void NBinKokkos::binatomsItem(const int &i) const { const int ibin = coord2bin(x(i, 0), x(i, 1), x(i, 2)); + atom2bin(i) = ibin; const int ac = Kokkos::atomic_fetch_add(&bincount[ibin], (int)1); if(ac < bins.dimension_1()) { bins(ibin, ac) = i; diff --git a/src/KOKKOS/nbin_kokkos.h b/src/KOKKOS/nbin_kokkos.h index de3cf41d19..bf2ccc5908 100644 --- a/src/KOKKOS/nbin_kokkos.h +++ b/src/KOKKOS/nbin_kokkos.h @@ -44,11 +44,13 @@ class NBinKokkos : public NBinStandard { int atoms_per_bin; DAT::tdual_int_1d k_bincount; DAT::tdual_int_2d k_bins; + DAT::tdual_int_1d k_atom2bin; typename AT::t_int_1d bincount; const typename AT::t_int_1d_const c_bincount; typename AT::t_int_2d bins; typename AT::t_int_2d_const c_bins; + typename AT::t_int_1d atom2bin; typename AT::t_int_scalar d_resize; typename ArrayTypes::t_int_scalar h_resize; typename AT::t_x_array_randomread x; diff --git a/src/KOKKOS/nbin_ssa_kokkos.cpp b/src/KOKKOS/nbin_ssa_kokkos.cpp new file mode 100644 index 0000000000..1a88165856 --- /dev/null +++ b/src/KOKKOS/nbin_ssa_kokkos.cpp @@ -0,0 +1,307 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: + James Larentzos (ARL) and Timothy I. Mattox (Engility Corporation) +------------------------------------------------------------------------- */ + +#include "nbin_ssa_kokkos.h" +#include "neighbor.h" +#include "atom_kokkos.h" +#include "group.h" +#include "domain.h" +#include "comm.h" +#include "update.h" +#include "error.h" +#include "atom_masks.h" + +// #include "memory_kokkos.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +NBinSSAKokkos::NBinSSAKokkos(LAMMPS *lmp) : NBinStandard(lmp) +{ + atoms_per_bin = ghosts_per_gbin = 16; + + d_resize = typename AT::t_int_scalar("NBinSSAKokkos::d_resize"); + d_lbinxlo = typename AT::t_int_scalar("NBinSSAKokkos::d_lbinxlo"); + d_lbinylo = typename AT::t_int_scalar("NBinSSAKokkos::d_lbinylo"); + d_lbinzlo = typename AT::t_int_scalar("NBinSSAKokkos::d_lbinzlo"); + d_lbinxhi = typename AT::t_int_scalar("NBinSSAKokkos::d_lbinxhi"); + d_lbinyhi = typename AT::t_int_scalar("NBinSSAKokkos::d_lbinyhi"); + d_lbinzhi = typename AT::t_int_scalar("NBinSSAKokkos::d_lbinzhi"); +#ifndef KOKKOS_USE_CUDA_UVM + h_resize = Kokkos::create_mirror_view(d_resize); + h_lbinxlo = Kokkos::create_mirror_view(d_lbinxlo); + h_lbinylo = Kokkos::create_mirror_view(d_lbinylo); + h_lbinzlo = Kokkos::create_mirror_view(d_lbinzlo); + h_lbinxhi = Kokkos::create_mirror_view(d_lbinxhi); + h_lbinyhi = Kokkos::create_mirror_view(d_lbinyhi); + h_lbinzhi = Kokkos::create_mirror_view(d_lbinzhi); +#else + h_resize = d_resize; + h_lbinxlo = d_lbinxlo; + h_lbinylo = d_lbinylo; + h_lbinzlo = d_lbinzlo; + h_lbinxhi = d_lbinxhi; + h_lbinyhi = d_lbinyhi; + h_lbinzhi = d_lbinzhi; +#endif + h_resize() = 1; + + k_gbincount = DAT::tdual_int_1d("NBinSSAKokkos::gbincount",8); + gbincount = k_gbincount.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +void NBinSSAKokkos::bin_atoms_setup(int nall) +{ + if (mbins > (int) k_bins.h_view.dimension_0()) { + k_bins = DAT::tdual_int_2d("NBinSSAKokkos::bins",mbins,atoms_per_bin); + bins = k_bins.view(); + + k_bincount = DAT::tdual_int_1d("NBinSSAKokkos::bincount",mbins); + bincount = k_bincount.view(); + } + + ghosts_per_gbin = atom->nghost / 7; // estimate needed size + + if (ghosts_per_gbin > (int) k_gbins.h_view.dimension_1()) { + k_gbins = DAT::tdual_int_2d("NBinSSAKokkos::gbins",8,ghosts_per_gbin); + gbins = k_gbins.view(); + } + + // Clear the local bin extent bounding box. + h_lbinxlo() = mbinx - 1; // Safe to = stencil->sx + 1 + h_lbinylo() = mbiny - 1; // Safe to = stencil->sy + 1 + h_lbinzlo() = mbinz - 1; // Safe to = stencil->sz + 1 + h_lbinxhi() = 0; // Safe to = mbinx - stencil->sx - 1 + h_lbinyhi() = 0; // Safe to = mbiny - stencil->sy - 1 + h_lbinzhi() = 0; // Safe to = mbinz - stencil->sz - 1 + deep_copy(d_lbinxlo, h_lbinxlo); + deep_copy(d_lbinylo, h_lbinylo); + deep_copy(d_lbinzlo, h_lbinzlo); + deep_copy(d_lbinxhi, h_lbinxhi); + deep_copy(d_lbinyhi, h_lbinyhi); + deep_copy(d_lbinzhi, h_lbinzhi); +} + +/* ---------------------------------------------------------------------- + bin owned and ghost atoms for the Shardlow Splitting Algorithm (SSA) + local atoms are in distinct bins (binhead[]) from the ghosts + ghost atoms are "binned" in gairhead_ssa[] instead + ghosts which are not in an Active Interaction Region (AIR) are skipped +------------------------------------------------------------------------- */ + +template +void NBinSSAKokkos::bin_atoms() +{ + last_bin = update->ntimestep; + + int nlocal = atom->nlocal; + int nghost = atom->nghost; + int nall = nlocal + nghost; + + atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); + x = atomKK->k_x.view(); + + sublo_[0] = domain->sublo[0]; + sublo_[1] = domain->sublo[1]; + sublo_[2] = domain->sublo[2]; + subhi_[0] = domain->subhi[0]; + subhi_[1] = domain->subhi[1]; + subhi_[2] = domain->subhi[2]; + + bboxlo_[0] = bboxlo[0]; bboxlo_[1] = bboxlo[1]; bboxlo_[2] = bboxlo[2]; + bboxhi_[0] = bboxhi[0]; bboxhi_[1] = bboxhi[1]; bboxhi_[2] = bboxhi[2]; + + k_binID = DAT::tdual_int_1d("NBinSSAKokkos::binID",nall); + binID = k_binID.view(); + + // find each local atom's binID + { + atoms_per_bin = 0; + NPairSSAKokkosBinIDAtomsFunctor f(*this); + Kokkos::parallel_reduce(nlocal, f, atoms_per_bin); + } + deep_copy(h_lbinxlo, d_lbinxlo); + deep_copy(h_lbinylo, d_lbinylo); + deep_copy(h_lbinzlo, d_lbinzlo); + deep_copy(h_lbinxhi, d_lbinxhi); + deep_copy(h_lbinyhi, d_lbinyhi); + deep_copy(h_lbinzhi, d_lbinzhi); + + // find each ghost's binID (AIR number) + { + for (int i = 0; i < 8; i++) k_gbincount.h_view(i) = 0; + k_gbincount.modify(); + k_gbincount.sync(); + ghosts_per_gbin = 0; + NPairSSAKokkosBinIDGhostsFunctor f(*this); + Kokkos::parallel_reduce(Kokkos::RangePolicy(nlocal,nall), f, ghosts_per_gbin); + } + + // actually bin the ghost atoms + { + if(ghosts_per_gbin > (int) gbins.dimension_1()) { + k_gbins = DAT::tdual_int_2d("gbins", 8, ghosts_per_gbin); + gbins = k_gbins.view(); + } + for (int i = 0; i < 8; i++) k_gbincount.h_view(i) = 0; + k_gbincount.modify(); + k_gbincount.sync(); + + auto binID_ = binID; + auto gbincount_ = gbincount; + auto gbins_ = gbins; + + Kokkos::parallel_for(Kokkos::RangePolicy(nlocal,nall), + LAMMPS_LAMBDA (const int i) { + const int iAIR = binID_(i); + if (iAIR > 0) { // include only ghost atoms in an AIR + const int ac = Kokkos::atomic_fetch_add(&gbincount_[iAIR], (int)1); + gbins_(iAIR, ac) = i; + } + }); + Kokkos::parallel_for(Kokkos::RangePolicy(1,8), + LAMMPS_LAMBDA (const int i) { + sortBin(gbincount_, gbins_, i); + }); + } + c_gbins = gbins; // gbins won't change until the next bin_atoms + + // actually bin the local atoms + { + if ((mbins > (int) bins.dimension_0()) || + (atoms_per_bin > (int) bins.dimension_1())) { + k_bins = DAT::tdual_int_2d("bins", mbins, atoms_per_bin); + bins = k_bins.view(); + } + MemsetZeroFunctor f_zero; + f_zero.ptr = (void*) k_bincount.view().ptr_on_device(); + Kokkos::parallel_for(mbins, f_zero); + + auto bincount_ = bincount; + auto bins_ = bins; + + NPairSSAKokkosBinAtomsFunctor f(*this); + Kokkos::parallel_for(nlocal, f); + + Kokkos::parallel_for(mbins, + LAMMPS_LAMBDA (const int i) { + sortBin(bincount_, bins_, i); + }); + } + k_bins.modify(); + k_bincount.modify(); + c_bins = bins; // bins won't change until the next bin_atoms + + k_gbins.modify(); + k_gbincount.modify(); + +//now dispose of the k_binID array + k_binID = DAT::tdual_int_1d("NBinSSAKokkos::binID",0); + binID = k_binID.view(); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void NBinSSAKokkos::binAtomsItem(const int &i) const +{ + const int ibin = binID(i); + const int ac = Kokkos::atomic_fetch_add(&(bincount[ibin]), (int)1); + bins(ibin, ac) = i; +} + +template +KOKKOS_INLINE_FUNCTION +void NBinSSAKokkos::binIDAtomsItem(const int &i, int &update) const +{ + int loc[3]; + const int ibin = coord2bin(x(i, 0), x(i, 1), x(i, 2), &(loc[0])); + binID(i) = ibin; + + // Find the bounding box of the local atoms in the bins + if (loc[0] < d_lbinxlo()) Kokkos::atomic_fetch_min(&d_lbinxlo(),loc[0]); + if (loc[0] >= d_lbinxhi()) Kokkos::atomic_fetch_max(&d_lbinxhi(),loc[0] + 1); + if (loc[1] < d_lbinylo()) Kokkos::atomic_fetch_min(&d_lbinylo(),loc[1]); + if (loc[1] >= d_lbinyhi()) Kokkos::atomic_fetch_max(&d_lbinyhi(),loc[1] + 1); + if (loc[2] < d_lbinzlo()) Kokkos::atomic_fetch_min(&d_lbinzlo(),loc[2]); + if (loc[2] >= d_lbinzhi()) Kokkos::atomic_fetch_max(&d_lbinzhi(),loc[2] + 1); + + const int ac = Kokkos::atomic_fetch_add(&(bincount[ibin]), (int)1); + if (update <= ac) update = ac + 1; +} + +template +KOKKOS_INLINE_FUNCTION +void NBinSSAKokkos::binIDGhostsItem(const int &i, int &update) const +{ + const int iAIR = coord2ssaAIR(x(i, 0), x(i, 1), x(i, 2)); + binID(i) = iAIR; + if (iAIR > 0) { // include only ghost atoms in an AIR + const int ac = Kokkos::atomic_fetch_add(&gbincount[iAIR], (int)1); + if (update <= ac) update = ac + 1; + } +} + +// An implementation of heapsort without recursion +template +KOKKOS_INLINE_FUNCTION +void NBinSSAKokkos::sortBin( + typename AT::t_int_1d gbincount, + typename AT::t_int_2d gbins, + const int &ibin) +{ + int n = gbincount(ibin); + int i = n/2; + int t; + + do { /* Loops until bin is sorted */ + if (i > 0) { /* First stage - Sorting the heap */ + i--; /* Save its index to i */ + t = gbins(ibin, i); /* Save parent value to t */ + } else { /* Second stage - Extracting elements in-place */ + if ((--n) <= 0) return; /* When the heap is empty, we are done */ + t = gbins(ibin, n); /* Save last value (it will be overwritten) */ + gbins(ibin, n) = gbins(ibin, 0); /* Save largest value at the end of the bin */ + } + int parent = i; /* We will start pushing down t from parent */ + int child = i*2 + 1; /* parent's left child */ + /* Sift operation - pushing the value of t down the heap */ + while (child < n) { + /* Choose the largest child */ + if ((child + 1 < n) && (gbins(ibin, child + 1) > gbins(ibin, child))) ++child; + if (gbins(ibin, child) <= t) break; /* t's place is found */ + gbins(ibin, parent) = gbins(ibin, child); /* Move the largest child up */ + parent = child; /* Move parent pointer to this child */ + child = parent*2+1; /* Find the next child */ + } + gbins(ibin, parent) = t; /* We save t in the heap */ + } while(1); +} + +namespace LAMMPS_NS { +template class NBinSSAKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class NBinSSAKokkos; +#endif +} diff --git a/src/KOKKOS/nbin_ssa_kokkos.h b/src/KOKKOS/nbin_ssa_kokkos.h new file mode 100644 index 0000000000..cc98859913 --- /dev/null +++ b/src/KOKKOS/nbin_ssa_kokkos.h @@ -0,0 +1,246 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef NBIN_CLASS + +NBinStyle(ssa/kk/host, + NBinSSAKokkos, + NB_SSA | NB_KOKKOS_HOST) + +NBinStyle(ssa/kk/device, + NBinSSAKokkos, + NB_SSA | NB_KOKKOS_DEVICE) + +#else + +#ifndef LMP_NBIN_SSA_KOKKOS_H +#define LMP_NBIN_SSA_KOKKOS_H + +#include "nbin_standard.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class NBinSSAKokkos : public NBinStandard { + public: + typedef ArrayTypes AT; + + NBinSSAKokkos(class LAMMPS *); + ~NBinSSAKokkos() {} + void bin_atoms_setup(int); + void bin_atoms(); + + // temporary array to hold the binID for each atom + DAT::tdual_int_1d k_binID; + typename AT::t_int_1d binID; + typename AT::t_int_1d_const c_binID; + + int atoms_per_bin; + DAT::tdual_int_1d k_bincount; + DAT::tdual_int_2d k_bins; + typename AT::t_int_1d bincount; + typename AT::t_int_2d bins; + typename AT::t_int_2d_const c_bins; + + int ghosts_per_gbin; + DAT::tdual_int_1d k_gbincount; + DAT::tdual_int_2d k_gbins; + typename AT::t_int_1d gbincount; + typename AT::t_int_2d gbins; + typename AT::t_int_2d_const c_gbins; + + typename AT::t_int_scalar d_resize; + typename ArrayTypes::t_int_scalar h_resize; + typename AT::t_x_array_randomread x; + + // Bounds of the local atoms in the bins array + typename AT::t_int_scalar d_lbinxlo; // lowest local bin x-dim coordinate + typename AT::t_int_scalar d_lbinylo; // lowest local bin y-dim coordinate + typename AT::t_int_scalar d_lbinzlo; // lowest local bin z-dim coordinate + typename AT::t_int_scalar d_lbinxhi; // highest local bin x-dim coordinate + typename AT::t_int_scalar d_lbinyhi; // highest local bin y-dim coordinate + typename AT::t_int_scalar d_lbinzhi; // highest local bin z-dim coordinate + typename ArrayTypes::t_int_scalar h_lbinxlo; + typename ArrayTypes::t_int_scalar h_lbinylo; + typename ArrayTypes::t_int_scalar h_lbinzlo; + typename ArrayTypes::t_int_scalar h_lbinxhi; + typename ArrayTypes::t_int_scalar h_lbinyhi; + typename ArrayTypes::t_int_scalar h_lbinzhi; + + + KOKKOS_INLINE_FUNCTION + void binAtomsItem(const int &i) const; + + KOKKOS_INLINE_FUNCTION + void binIDAtomsItem(const int &i, int &update) const; + + KOKKOS_INLINE_FUNCTION + void binIDGhostsItem(const int &i, int &update) const; + + static KOKKOS_INLINE_FUNCTION + void sortBin( + typename AT::t_int_1d gbincount, + typename AT::t_int_2d gbins, + const int &ibin); + +/* ---------------------------------------------------------------------- + convert atom coords into the ssa active interaction region number +------------------------------------------------------------------------- */ + KOKKOS_INLINE_FUNCTION + int coord2ssaAIR(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z) const + { + int ix, iy, iz; + ix = iy = iz = 0; + if (z < sublo_[2]) iz = -1; + if (z >= subhi_[2]) iz = 1; + if (y < sublo_[1]) iy = -1; + if (y >= subhi_[1]) iy = 1; + if (x < sublo_[0]) ix = -1; + if (x >= subhi_[0]) ix = 1; + if(iz < 0){ + return -1; + } else if(iz == 0){ + if( iy<0 ) return -1; // bottom left/middle/right + if( (iy==0) && (ix<0) ) return -1; // left atoms + if( (iy==0) && (ix==0) ) return 0; // Locally owned atoms + if( (iy==0) && (ix>0) ) return 2; // Right atoms + if( (iy>0) && (ix==0) ) return 1; // Top-middle atoms + if( (iy>0) && (ix!=0) ) return 3; // Top-right and top-left atoms + } else { // iz > 0 + if((ix==0) && (iy==0)) return 4; // Back atoms + if((ix==0) && (iy!=0)) return 5; // Top-back and bottom-back atoms + if((ix!=0) && (iy==0)) return 6; // Left-back and right-back atoms + if((ix!=0) && (iy!=0)) return 7; // Back corner atoms + } + return -2; + } + + KOKKOS_INLINE_FUNCTION + int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const + { + int ix,iy,iz; + + if (x >= bboxhi_[0]) + ix = static_cast ((x-bboxhi_[0])*bininvx) + nbinx; + else if (x >= bboxlo_[0]) { + ix = static_cast ((x-bboxlo_[0])*bininvx); + ix = MIN(ix,nbinx-1); + } else + ix = static_cast ((x-bboxlo_[0])*bininvx) - 1; + + if (y >= bboxhi_[1]) + iy = static_cast ((y-bboxhi_[1])*bininvy) + nbiny; + else if (y >= bboxlo_[1]) { + iy = static_cast ((y-bboxlo_[1])*bininvy); + iy = MIN(iy,nbiny-1); + } else + iy = static_cast ((y-bboxlo_[1])*bininvy) - 1; + + if (z >= bboxhi_[2]) + iz = static_cast ((z-bboxhi_[2])*bininvz) + nbinz; + else if (z >= bboxlo_[2]) { + iz = static_cast ((z-bboxlo_[2])*bininvz); + iz = MIN(iz,nbinz-1); + } else + iz = static_cast ((z-bboxlo_[2])*bininvz) - 1; + + i[0] = ix - mbinxlo; + i[1] = iy - mbinylo; + i[2] = iz - mbinzlo; + + return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo); + } + + private: + double bboxlo_[3],bboxhi_[3]; + double sublo_[3], subhi_[3]; +}; + +template +struct NPairSSAKokkosBinAtomsFunctor { + typedef DeviceType device_type; + + const NBinSSAKokkos c; + + NPairSSAKokkosBinAtomsFunctor(const NBinSSAKokkos &_c): + c(_c) {}; + ~NPairSSAKokkosBinAtomsFunctor() {} + KOKKOS_INLINE_FUNCTION + void operator() (const int & i) const { + c.binAtomsItem(i); + } +}; + +template +struct NPairSSAKokkosBinIDAtomsFunctor { + typedef DeviceType device_type; + typedef int value_type; + + const NBinSSAKokkos c; + + NPairSSAKokkosBinIDAtomsFunctor(const NBinSSAKokkos &_c): + c(_c) {}; + ~NPairSSAKokkosBinIDAtomsFunctor() {} + KOKKOS_INLINE_FUNCTION + void operator() (const int & i, value_type& update) const { + c.binIDAtomsItem(i, update); + } + + KOKKOS_INLINE_FUNCTION + void join (volatile value_type& dst, + const volatile value_type& src) const { + if (dst < src) dst = src; + } + + KOKKOS_INLINE_FUNCTION + void init (value_type& dst) const { + dst = INT_MIN; + } +}; + +template +struct NPairSSAKokkosBinIDGhostsFunctor { + typedef DeviceType device_type; + typedef int value_type; + + const NBinSSAKokkos c; + + NPairSSAKokkosBinIDGhostsFunctor(const NBinSSAKokkos &_c): + c(_c) {}; + ~NPairSSAKokkosBinIDGhostsFunctor() {} + KOKKOS_INLINE_FUNCTION + void operator() (const int & i, value_type& update) const { + c.binIDGhostsItem(i, update); + } + + KOKKOS_INLINE_FUNCTION + void join (volatile value_type& dst, + const volatile value_type& src) const { + if (dst < src) dst = src; + } + + KOKKOS_INLINE_FUNCTION + void init (value_type& dst) const { + dst = INT_MIN; + } +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/neigh_bond_kokkos.cpp b/src/KOKKOS/neigh_bond_kokkos.cpp index 767def70c2..3ecc8b5e51 100644 --- a/src/KOKKOS/neigh_bond_kokkos.cpp +++ b/src/KOKKOS/neigh_bond_kokkos.cpp @@ -24,7 +24,7 @@ #include "domain_kokkos.h" #include "output.h" #include "thermo.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "modify.h" #include "fix.h" @@ -80,27 +80,27 @@ void NeighBondKokkos::init_topology_kk() { if (atom->molecular && atom->nbonds && maxbond == 0) { if (nprocs == 1) maxbond = atom->nbonds; else maxbond = static_cast (LB_FACTOR * atom->nbonds / nprocs); - memory->create_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neigh:neighbor->bondlist"); + memoryKK->create_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neigh:neighbor->bondlist"); } if (atom->molecular && atom->nangles && maxangle == 0) { if (nprocs == 1) maxangle = atom->nangles; else maxangle = static_cast (LB_FACTOR * atom->nangles / nprocs); - memory->create_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neigh:neighbor->anglelist"); + memoryKK->create_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neigh:neighbor->anglelist"); } if (atom->molecular && atom->ndihedrals && maxdihedral == 0) { if (nprocs == 1) maxdihedral = atom->ndihedrals; else maxdihedral = static_cast (LB_FACTOR * atom->ndihedrals / nprocs); - memory->create_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neigh:neighbor->dihedrallist"); + memoryKK->create_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neigh:neighbor->dihedrallist"); } if (atom->molecular && atom->nimpropers && maximproper == 0) { if (nprocs == 1) maximproper = atom->nimpropers; else maximproper = static_cast (LB_FACTOR * atom->nimpropers / nprocs); - memory->create_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neigh:neighbor->improperlist"); + memoryKK->create_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neigh:neighbor->improperlist"); } // set flags that determine which topology neighboring routines to use @@ -274,7 +274,6 @@ void NeighBondKokkos::bond_all() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -284,7 +283,7 @@ void NeighBondKokkos::bond_all() k_fail_flag.template sync(); if (h_fail_flag()) { maxbond = neighbor->nbondlist + BONDDELTA; - memory->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist"); + memoryKK->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist"); v_bondlist = k_bondlist.view(); } } while (h_fail_flag()); @@ -307,6 +306,8 @@ void NeighBondKokkos::bond_all() "Bond atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_bondlist.modify(); } template @@ -368,7 +369,6 @@ void NeighBondKokkos::bond_partial() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -378,7 +378,7 @@ void NeighBondKokkos::bond_partial() k_fail_flag.template sync(); if (h_fail_flag()) { maxbond = neighbor->nbondlist + BONDDELTA; - memory->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist"); + memoryKK->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist"); v_bondlist = k_bondlist.view(); } } while (h_fail_flag()); @@ -401,6 +401,8 @@ void NeighBondKokkos::bond_partial() "Bond atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_bondlist.modify(); } template @@ -435,9 +437,10 @@ void NeighBondKokkos::bond_check() int flag = 0; update_domain_variables(); + atomKK->sync(execution_space, X_MASK); + k_bondlist.sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,neighbor->nbondlist),*this,flag); - DeviceType::fence(); int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); @@ -488,7 +491,6 @@ void NeighBondKokkos::angle_all() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -498,7 +500,7 @@ void NeighBondKokkos::angle_all() k_fail_flag.template sync(); if (h_fail_flag()) { maxangle = neighbor->nanglelist + BONDDELTA; - memory->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist"); + memoryKK->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist"); v_anglelist = k_anglelist.view(); } } while (h_fail_flag()); @@ -521,6 +523,8 @@ void NeighBondKokkos::angle_all() "Angle atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_anglelist.modify(); } template @@ -589,7 +593,6 @@ void NeighBondKokkos::angle_partial() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -599,7 +602,7 @@ void NeighBondKokkos::angle_partial() k_fail_flag.template sync(); if (h_fail_flag()) { maxangle = neighbor->nanglelist + BONDDELTA; - memory->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist"); + memoryKK->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist"); v_anglelist = k_anglelist.view(); } } while (h_fail_flag()); @@ -622,6 +625,8 @@ void NeighBondKokkos::angle_partial() "Angle atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_anglelist.modify(); } template @@ -664,9 +669,10 @@ void NeighBondKokkos::angle_check() // in case angle potential computes any of them update_domain_variables(); + atomKK->sync(execution_space, X_MASK); + k_anglelist.sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,neighbor->nanglelist),*this,flag); - DeviceType::fence(); int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); @@ -729,7 +735,6 @@ void NeighBondKokkos::dihedral_all() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -739,7 +744,7 @@ void NeighBondKokkos::dihedral_all() k_fail_flag.template sync(); if (h_fail_flag()) { maxdihedral = neighbor->ndihedrallist + BONDDELTA; - memory->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist"); + memoryKK->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist"); v_dihedrallist = k_dihedrallist.view(); } } while (h_fail_flag()); @@ -762,6 +767,8 @@ void NeighBondKokkos::dihedral_all() "Dihedral atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_dihedrallist.modify(); } template @@ -835,7 +842,6 @@ void NeighBondKokkos::dihedral_partial() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -845,7 +851,7 @@ void NeighBondKokkos::dihedral_partial() k_fail_flag.template sync(); if (h_fail_flag()) { maxdihedral = neighbor->ndihedrallist + BONDDELTA; - memory->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist"); + memoryKK->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist"); v_dihedrallist = k_dihedrallist.view(); } } while (h_fail_flag()); @@ -868,6 +874,8 @@ void NeighBondKokkos::dihedral_partial() "Dihedral atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_dihedrallist.modify(); } template @@ -915,9 +923,10 @@ void NeighBondKokkos::dihedral_check(int nlist, typename AT::t_int_2 // in case dihedral/improper potential computes any of them update_domain_variables(); + atomKK->sync(execution_space, X_MASK); + k_dihedrallist.sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlist),*this,flag); - DeviceType::fence(); int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); @@ -997,7 +1006,6 @@ void NeighBondKokkos::improper_all() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -1007,7 +1015,7 @@ void NeighBondKokkos::improper_all() k_fail_flag.template sync(); if (h_fail_flag()) { maximproper = neighbor->nimproperlist + BONDDELTA; - memory->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist"); + memoryKK->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist"); v_improperlist = k_improperlist.view(); } } while (h_fail_flag()); @@ -1030,6 +1038,8 @@ void NeighBondKokkos::improper_all() "Improper atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_improperlist.modify(); } template @@ -1103,7 +1113,6 @@ void NeighBondKokkos::improper_partial() k_fail_flag.template sync(); Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,nmissing); - DeviceType::fence(); k_nlist.template modify(); k_nlist.template sync(); @@ -1113,7 +1122,7 @@ void NeighBondKokkos::improper_partial() k_fail_flag.template sync(); if (h_fail_flag()) { maximproper = neighbor->nimproperlist + BONDDELTA; - memory->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist"); + memoryKK->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist"); v_improperlist = k_improperlist.view(); } } while (h_fail_flag()); @@ -1136,6 +1145,8 @@ void NeighBondKokkos::improper_partial() "Improper atoms missing at step " BIGINT_FORMAT,update->ntimestep); if (me == 0) error->warning(FLERR,str); } + + k_improperlist.modify(); } template diff --git a/src/KOKKOS/neigh_list_kokkos.cpp b/src/KOKKOS/neigh_list_kokkos.cpp index caf2dfee56..98294a802a 100644 --- a/src/KOKKOS/neigh_list_kokkos.cpp +++ b/src/KOKKOS/neigh_list_kokkos.cpp @@ -13,7 +13,7 @@ #include "neigh_list_kokkos.h" #include "atom.h" -#include "memory.h" +#include "memory_kokkos.h" using namespace LAMMPS_NS; @@ -49,15 +49,6 @@ void NeighListKokkos::grow(int nmax) d_neighbors = typename ArrayTypes::t_neighbors_2d("neighlist:neighbors", maxatoms,maxneighs); - - memory->sfree(firstneigh); - memory->sfree(firstdouble); - - firstneigh = (int **) memory->smalloc(maxatoms*sizeof(int *), - "neighlist:firstneigh"); - if (dnum) - firstdouble = (double **) memory->smalloc(maxatoms*sizeof(double *), - "neighlist:firstdouble"); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/neigh_list_kokkos.h b/src/KOKKOS/neigh_list_kokkos.h index c887bd13b7..1c433f321c 100644 --- a/src/KOKKOS/neigh_list_kokkos.h +++ b/src/KOKKOS/neigh_list_kokkos.h @@ -48,7 +48,7 @@ class AtomNeighborsConst const int num_neighs; KOKKOS_INLINE_FUNCTION - AtomNeighborsConst(int* const & firstneigh, const int & _num_neighs, + AtomNeighborsConst(const int* const & firstneigh, const int & _num_neighs, const int & stride): _firstneigh(firstneigh), num_neighs(_num_neighs), _stride(stride) {}; KOKKOS_INLINE_FUNCTION @@ -82,6 +82,14 @@ public: &d_neighbors(i,1)-&d_neighbors(i,0)); } + KOKKOS_INLINE_FUNCTION + static AtomNeighborsConst static_neighbors_const(int i, + typename ArrayTypes::t_neighbors_2d_const const& d_neighbors, + typename ArrayTypes::t_int_1d_const const& d_numneigh) { + return AtomNeighborsConst(&d_neighbors(i,0),d_numneigh(i), + &d_neighbors(i,1)-&d_neighbors(i,0)); + } + KOKKOS_INLINE_FUNCTION AtomNeighborsConst get_neighbors_const(const int &i) const { return AtomNeighborsConst(&d_neighbors(i,0),d_numneigh(i), diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp index e40e6a238c..8d36add10b 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -12,11 +12,11 @@ ------------------------------------------------------------------------- */ #include "neighbor_kokkos.h" -#include "atom.h" +#include "atom_kokkos.h" #include "pair.h" #include "fix.h" #include "neigh_request.h" -#include "memory.h" +#include "memory_kokkos.h" #include "update.h" #include "atom_masks.h" #include "error.h" @@ -52,24 +52,24 @@ NeighborKokkos::NeighborKokkos(LAMMPS *lmp) : Neighbor(lmp), NeighborKokkos::~NeighborKokkos() { if (!copymode) { - memory->destroy_kokkos(k_cutneighsq,cutneighsq); + memoryKK->destroy_kokkos(k_cutneighsq,cutneighsq); cutneighsq = NULL; - memory->destroy_kokkos(k_ex_type,ex_type); - memory->destroy_kokkos(k_ex1_type,ex1_type); - memory->destroy_kokkos(k_ex2_type,ex2_type); - memory->destroy_kokkos(k_ex1_group,ex1_group); - memory->destroy_kokkos(k_ex2_group,ex2_group); - memory->destroy_kokkos(k_ex_mol_group,ex_mol_group); - memory->destroy_kokkos(k_ex1_bit,ex1_bit); - memory->destroy_kokkos(k_ex2_bit,ex2_bit); - memory->destroy_kokkos(k_ex_mol_bit,ex_mol_bit); - memory->destroy_kokkos(k_ex_mol_intra,ex_mol_intra); + memoryKK->destroy_kokkos(k_ex_type,ex_type); + memoryKK->destroy_kokkos(k_ex1_type,ex1_type); + memoryKK->destroy_kokkos(k_ex2_type,ex2_type); + memoryKK->destroy_kokkos(k_ex1_group,ex1_group); + memoryKK->destroy_kokkos(k_ex2_group,ex2_group); + memoryKK->destroy_kokkos(k_ex_mol_group,ex_mol_group); + memoryKK->destroy_kokkos(k_ex1_bit,ex1_bit); + memoryKK->destroy_kokkos(k_ex2_bit,ex2_bit); + memoryKK->destroy_kokkos(k_ex_mol_bit,ex_mol_bit); + memoryKK->destroy_kokkos(k_ex_mol_intra,ex_mol_intra); - memory->destroy_kokkos(k_bondlist,bondlist); - memory->destroy_kokkos(k_anglelist,anglelist); - memory->destroy_kokkos(k_dihedrallist,dihedrallist); - memory->destroy_kokkos(k_improperlist,improperlist); + memoryKK->destroy_kokkos(k_bondlist,bondlist); + memoryKK->destroy_kokkos(k_anglelist,anglelist); + memoryKK->destroy_kokkos(k_dihedrallist,dihedrallist); + memoryKK->destroy_kokkos(k_improperlist,improperlist); } } @@ -90,7 +90,7 @@ void NeighborKokkos::init() void NeighborKokkos::init_cutneighsq_kokkos(int n) { - memory->create_kokkos(k_cutneighsq,cutneighsq,n+1,n+1,"neigh:cutneighsq"); + memoryKK->create_kokkos(k_cutneighsq,cutneighsq,n+1,n+1,"neigh:cutneighsq"); k_cutneighsq.modify(); } @@ -112,7 +112,7 @@ void NeighborKokkos::create_kokkos_list(int i) void NeighborKokkos::init_ex_type_kokkos(int n) { - memory->create_kokkos(k_ex_type,ex_type,n+1,n+1,"neigh:ex_type"); + memoryKK->create_kokkos(k_ex_type,ex_type,n+1,n+1,"neigh:ex_type"); k_ex_type.modify(); } @@ -120,9 +120,9 @@ void NeighborKokkos::init_ex_type_kokkos(int n) void NeighborKokkos::init_ex_bit_kokkos() { - memory->create_kokkos(k_ex1_bit, ex1_bit, nex_group, "neigh:ex1_bit"); + memoryKK->create_kokkos(k_ex1_bit, ex1_bit, nex_group, "neigh:ex1_bit"); k_ex1_bit.modify(); - memory->create_kokkos(k_ex2_bit, ex2_bit, nex_group, "neigh:ex2_bit"); + memoryKK->create_kokkos(k_ex2_bit, ex2_bit, nex_group, "neigh:ex2_bit"); k_ex2_bit.modify(); } @@ -130,7 +130,7 @@ void NeighborKokkos::init_ex_bit_kokkos() void NeighborKokkos::init_ex_mol_bit_kokkos() { - memory->create_kokkos(k_ex_mol_bit, ex_mol_bit, nex_mol, "neigh:ex_mol_bit"); + memoryKK->create_kokkos(k_ex_mol_bit, ex_mol_bit, nex_mol, "neigh:ex_mol_bit"); k_ex_mol_bit.modify(); } @@ -138,7 +138,7 @@ void NeighborKokkos::init_ex_mol_bit_kokkos() void NeighborKokkos::grow_ex_mol_intra_kokkos() { - memory->grow_kokkos(k_ex_mol_intra, ex_mol_intra, maxex_mol, "neigh:ex_mol_intra"); + memoryKK->grow_kokkos(k_ex_mol_intra, ex_mol_intra, maxex_mol, "neigh:ex_mol_intra"); k_ex_mol_intra.modify(); } @@ -206,7 +206,6 @@ int NeighborKokkos::check_distance_kokkos() int flag = 0; copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,flag); - DeviceType::fence(); copymode = 0; int flagall; @@ -273,7 +272,6 @@ void NeighborKokkos::build_kokkos(int topoflag) } copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); - DeviceType::fence(); copymode = 0; xhold.modify(); if (boxcheck) { @@ -312,9 +310,9 @@ void NeighborKokkos::build_kokkos(int topoflag) // build pairwise lists for all perpetual NPair/NeighList // grow() with nlocal/nall args so that only realloc if have to - atomKK->sync(Host,ALL_MASK); for (i = 0; i < npair_perpetual; i++) { m = plist[i]; + if (!lists[m]->kokkos) atomKK->sync(Host,ALL_MASK); if (!lists[m]->copy) lists[m]->grow(nlocal,nall); neigh_pair[m]->build_setup(); neigh_pair[m]->build(lists[m]); @@ -337,29 +335,29 @@ void NeighborKokkos::operator()(TagNeighborXhold, const int &i) cons /* ---------------------------------------------------------------------- */ void NeighborKokkos::modify_ex_type_grow_kokkos(){ - memory->grow_kokkos(k_ex1_type,ex1_type,maxex_type,"neigh:ex1_type"); + memoryKK->grow_kokkos(k_ex1_type,ex1_type,maxex_type,"neigh:ex1_type"); k_ex1_type.modify(); - memory->grow_kokkos(k_ex2_type,ex2_type,maxex_type,"neigh:ex2_type"); + memoryKK->grow_kokkos(k_ex2_type,ex2_type,maxex_type,"neigh:ex2_type"); k_ex2_type.modify(); } /* ---------------------------------------------------------------------- */ void NeighborKokkos::modify_ex_group_grow_kokkos(){ - memory->grow_kokkos(k_ex1_group,ex1_group,maxex_group,"neigh:ex1_group"); + memoryKK->grow_kokkos(k_ex1_group,ex1_group,maxex_group,"neigh:ex1_group"); k_ex1_group.modify(); - memory->grow_kokkos(k_ex2_group,ex2_group,maxex_group,"neigh:ex2_group"); + memoryKK->grow_kokkos(k_ex2_group,ex2_group,maxex_group,"neigh:ex2_group"); k_ex2_group.modify(); } /* ---------------------------------------------------------------------- */ void NeighborKokkos::modify_mol_group_grow_kokkos(){ - memory->grow_kokkos(k_ex_mol_group,ex_mol_group,maxex_mol,"neigh:ex_mol_group"); + memoryKK->grow_kokkos(k_ex_mol_group,ex_mol_group,maxex_mol,"neigh:ex_mol_group"); k_ex_mol_group.modify(); } /* ---------------------------------------------------------------------- */ void NeighborKokkos::modify_mol_intra_grow_kokkos(){ - memory->grow_kokkos(k_ex_mol_intra,ex_mol_intra,maxex_mol,"neigh:ex_mol_intra"); + memoryKK->grow_kokkos(k_ex_mol_intra,ex_mol_intra,maxex_mol,"neigh:ex_mol_intra"); k_ex_mol_intra.modify(); } @@ -387,16 +385,6 @@ void NeighborKokkos::build_topology() { k_dihedrallist = neighbond_device.k_dihedrallist; k_improperlist = neighbond_device.k_improperlist; - k_bondlist.sync(); - k_anglelist.sync(); - k_dihedrallist.sync(); - k_improperlist.sync(); - - k_bondlist.modify(); - k_anglelist.modify(); - k_dihedrallist.modify(); - k_improperlist.modify(); - // Transfer topology neighbor lists to Host for non-Kokkos styles if (force->bond && force->bond->execution_space == Host) @@ -415,15 +403,5 @@ void NeighborKokkos::build_topology() { k_anglelist = neighbond_host.k_anglelist; k_dihedrallist = neighbond_host.k_dihedrallist; k_improperlist = neighbond_host.k_improperlist; - - k_bondlist.sync(); - k_anglelist.sync(); - k_dihedrallist.sync(); - k_improperlist.sync(); - - k_bondlist.modify(); - k_anglelist.modify(); - k_dihedrallist.modify(); - k_improperlist.modify(); } } diff --git a/src/KOKKOS/npair_copy_kokkos.cpp b/src/KOKKOS/npair_copy_kokkos.cpp index 6835d8c1b5..8702816033 100644 --- a/src/KOKKOS/npair_copy_kokkos.cpp +++ b/src/KOKKOS/npair_copy_kokkos.cpp @@ -41,10 +41,7 @@ void NPairCopyKokkos::build(NeighList *list) list->gnum = listcopy->gnum; list->ilist = listcopy->ilist; list->numneigh = listcopy->numneigh; - list->firstneigh = listcopy->firstneigh; - list->firstdouble = listcopy->firstdouble; list->ipage = listcopy->ipage; - list->dpage = listcopy->dpage; NeighListKokkos* list_kk = (NeighListKokkos*) list; NeighListKokkos* listcopy_kk = (NeighListKokkos*) list->listcopy; diff --git a/src/KOKKOS/npair_halffull_kokkos.cpp b/src/KOKKOS/npair_halffull_kokkos.cpp new file mode 100644 index 0000000000..67481985da --- /dev/null +++ b/src/KOKKOS/npair_halffull_kokkos.cpp @@ -0,0 +1,128 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "npair_halffull_kokkos.h" +#include "neighbor.h" +#include "neigh_list_kokkos.h" +#include "atom_kokkos.h" +#include "atom_vec.h" +#include "molecule.h" +#include "domain.h" +#include "my_page.h" +#include "error.h" +#include "atom_masks.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +NPairHalffullKokkos::NPairHalffullKokkos(LAMMPS *lmp) : NPair(lmp) { + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; +} + +/* ---------------------------------------------------------------------- + build half list from full list + pair stored once if i,j are both owned and i < j + pair stored by me if j is ghost (also stored by proc owning j) + works if full list is a skip list + works for owned (non-ghost) list, also for ghost list + if ghost, also store neighbors of ghost atoms & set inum,gnum correctly +------------------------------------------------------------------------- */ + +template +void NPairHalffullKokkos::build(NeighList *list) +{ + if (NEWTON) { + x = atomKK->k_x.view(); + atomKK->sync(execution_space,X_MASK); + } + nlocal = atom->nlocal; + + NeighListKokkos* k_list_full = static_cast*>(list->listfull); + d_ilist_full = k_list_full->d_ilist; + d_numneigh_full = k_list_full->d_numneigh; + d_neighbors_full = k_list_full->d_neighbors; + int inum_full = list->listfull->inum; + if (list->ghost) inum_full += list->listfull->gnum; + + NeighListKokkos* k_list = static_cast*>(list); + k_list->maxneighs = k_list_full->maxneighs; // simple, but could be made more memory efficient + k_list->grow(atom->nmax); + d_ilist = k_list->d_ilist; + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + + // loop over parent full list + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_full),*this); + + list->inum = k_list_full->inum; + list->gnum = k_list_full->gnum; + k_list->k_ilist.template modify(); + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void NPairHalffullKokkos::operator()(TagNPairHalffullCompute, const int &ii) const { + int n = 0; + + const int i = d_ilist_full(ii); + F_FLOAT xtmp,ytmp,ztmp; + if (NEWTON) { + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + } + + // loop over full neighbor list + + const int jnum = d_numneigh_full(i); + const AtomNeighbors neighbors_i = AtomNeighbors(&d_neighbors(i,0),d_numneigh(i), + &d_neighbors(i,1)-&d_neighbors(i,0)); + + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = d_neighbors_full(i,jj); + const int j = joriginal & NEIGHMASK; + if (NEWTON) { + if (j < nlocal) { + if (i > j) continue; + } else { + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp) { + if (x(j,1) < ytmp) continue; + if (x(j,1) == ytmp && x(j,0) < xtmp) continue; + } + } + neighbors_i(n++) = joriginal; + } else { + if (j > i) neighbors_i(n++) = joriginal; + } + } + + d_numneigh(i) = n; + d_ilist(ii) = i; +} + +namespace LAMMPS_NS { +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class NPairHalffullKokkos; +template class NPairHalffullKokkos; +#endif +} diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h new file mode 100644 index 0000000000..15505a376c --- /dev/null +++ b/src/KOKKOS/npair_halffull_kokkos.h @@ -0,0 +1,168 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef NPAIR_CLASS + +// Newton + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; +NPairStyle(halffull/newton/kk/device, + NPairKokkosHalffullNewtonDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +NPairStyle(halffull/newton/kk/host, + NPairKokkosHalffullNewtonHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_HOST) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonDevice; +NPairStyle(halffull/newton/skip/kk/device, + NPairKokkosHalffullNewtonDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +NPairStyle(halffull/newton/skip/kk/host, + NPairKokkosHalffullNewtonHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_HOST) + +// Newtoff + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; +NPairStyle(halffull/newtoff/kk/device, + NPairKokkosHalffullNewtoffDevice, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +NPairStyle(halffull/newtoff/kk/host, + NPairKokkosHalffullNewtoffHost, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_KOKKOS_HOST) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffDevice; +NPairStyle(halffull/newtoff/skip/kk/device, + NPairKokkosHalffullNewtoffDevice, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +NPairStyle(halffull/newtoff/skip/kk/host, + NPairKokkosHalffullNewtoffHost, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_HOST) + +//************ Ghost ************** + +// Newton + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostDevice; +NPairStyle(halffull/newton/ghost/kk/device, + NPairKokkosHalffullNewtonGhostDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +NPairStyle(halffull/newton/ghost/kk/host, + NPairKokkosHalffullNewtonHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonGhostDevice; +NPairStyle(halffull/newton/skip/ghost/kk/device, + NPairKokkosHalffullNewtonGhostDevice, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtonHost; +NPairStyle(halffull/newton/skip/ghost/kk/host, + NPairKokkosHalffullNewtonHost, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST) + +// Newtoff + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostDevice; +NPairStyle(halffull/newtoff/ghost/kk/device, + NPairKokkosHalffullNewtoffGhostDevice, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +NPairStyle(halffull/newtoff/ghost/kk/host, + NPairKokkosHalffullNewtoffHost, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffGhostDevice; +NPairStyle(halffull/newtoff/skip/ghost/kk/device, + NPairKokkosHalffullNewtoffGhostDevice, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE) + +typedef NPairHalffullKokkos NPairKokkosHalffullNewtoffHost; +NPairStyle(halffull/newtoff/skip/ghost/kk/host, + NPairKokkosHalffullNewtoffHost, + NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST) + +#else + +#ifndef LMP_NPAIR_HALFFULL_KOKKOS_H +#define LMP_NPAIR_HALFFULL_KOKKOS_H + +#include "npair.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct TagNPairHalffullCompute{}; + +template +class NPairHalffullKokkos : public NPair { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + + NPairHalffullKokkos(class LAMMPS *); + ~NPairHalffullKokkos() {} + void build(class NeighList *); + + KOKKOS_INLINE_FUNCTION + void operator()(TagNPairHalffullCompute, const int&) const; + + private: + int nlocal; + + typename AT::t_x_array_randomread x; + + typename AT::t_neighbors_2d_const d_neighbors_full; + typename AT::t_int_1d_const d_ilist_full; + typename AT::t_int_1d_const d_numneigh_full; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d d_ilist; + typename AT::t_int_1d d_numneigh; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index b7b550369d..d3cdcb0680 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -73,6 +73,7 @@ void NPairKokkos::copy_bin_info() atoms_per_bin = nbKK->atoms_per_bin; k_bincount = nbKK->k_bincount; k_bins = nbKK->k_bins; + k_atom2bin = nbKK->k_atom2bin; } /* ---------------------------------------------------------------------- @@ -88,13 +89,15 @@ void NPairKokkos::copy_stencil_info() int maxstencil = ns->get_maxstencil(); - k_stencil = DAT::tdual_int_1d("neighlist:stencil",maxstencil); + if (maxstencil > k_stencil.dimension_0()) + k_stencil = DAT::tdual_int_1d("neighlist:stencil",maxstencil); for (int k = 0; k < maxstencil; k++) k_stencil.h_view(k) = ns->stencil[k]; k_stencil.modify(); k_stencil.sync(); if (GHOST) { - k_stencilxyz = DAT::tdual_int_1d_3("neighlist:stencilxyz",maxstencil); + if (maxstencil > k_stencilxyz.dimension_0()) + k_stencilxyz = DAT::tdual_int_1d_3("neighlist:stencilxyz",maxstencil); for (int k = 0; k < maxstencil; k++) { k_stencilxyz.h_view(k,0) = ns->stencilxyz[k][0]; k_stencilxyz.h_view(k,1) = ns->stencilxyz[k][1]; @@ -122,6 +125,7 @@ void NPairKokkos::build(NeighList *list_) k_cutneighsq.view(), k_bincount.view(), k_bins.view(), + k_atom2bin.view(), nstencil, k_stencil.view(), k_stencilxyz.view(), @@ -164,8 +168,9 @@ void NPairKokkos::build(NeighList *list_) k_ex_mol_group.sync(); k_ex_mol_bit.sync(); k_ex_mol_intra.sync(); - k_bincount.sync(), - k_bins.sync(), + k_bincount.sync(); + k_bins.sync(); + k_atom2bin.sync(); atomKK->sync(Device,X_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK); data.special_flag[0] = special_flag[0]; @@ -173,19 +178,13 @@ void NPairKokkos::build(NeighList *list_) data.special_flag[2] = special_flag[2]; data.special_flag[3] = special_flag[3]; - if(list->d_neighbors.dimension_0()d_neighbors = typename ArrayTypes::t_neighbors_2d("neighbors", nall*1.1, list->maxneighs); - list->d_numneigh = typename ArrayTypes::t_int_1d("numneigh", nall*1.1); - data.neigh_list.d_neighbors = list->d_neighbors; - data.neigh_list.d_numneigh = list->d_numneigh; - } data.h_resize()=1; while(data.h_resize()) { data.h_new_maxneighs() = list->maxneighs; - data.h_resize() = 0; + data.h_resize() = 0; - Kokkos::deep_copy(data.resize, data.h_resize); - Kokkos::deep_copy(data.new_maxneighs, data.h_new_maxneighs); + Kokkos::deep_copy(data.resize, data.h_resize); + Kokkos::deep_copy(data.new_maxneighs, data.h_new_maxneighs); #ifdef KOKKOS_HAVE_CUDA #define BINS_PER_BLOCK 2 const int factor = atoms_per_bin<64?2:1; @@ -194,27 +193,32 @@ void NPairKokkos::build(NeighList *list_) const int factor = 1; #endif -if (GHOST) { - NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); - Kokkos::parallel_for(nall, f); -} else { - if (newton_pair) { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + if (GHOST) { + NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + Kokkos::parallel_for(nall, f); + } else { + if (newton_pair) { + NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef KOKKOS_HAVE_CUDA - Kokkos::parallel_for(config, f); + if (ExecutionSpaceFromDevice::space == Device) + Kokkos::parallel_for(config, f); + else + Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + } else { + NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef KOKKOS_HAVE_CUDA - Kokkos::parallel_for(config, f); + if (ExecutionSpaceFromDevice::space == Device) + Kokkos::parallel_for(config, f); + else + Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } -} - DeviceType::fence(); + } + } deep_copy(data.h_resize, data.resize); if(data.h_resize()) { @@ -318,7 +322,7 @@ void NeighborKokkosExecute:: const X_FLOAT ztmp = x(i, 2); const int itype = type(i); - const int ibin = coord2bin(xtmp, ytmp, ztmp); + const int ibin = c_atom2bin(i); const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; @@ -429,10 +433,10 @@ void NeighborKokkosExecute:: neigh_list.d_numneigh(i) = n; - if(n >= neigh_list.maxneighs) { + if(n > neigh_list.maxneighs) { resize() = 1; - if(n >= new_maxneighs()) new_maxneighs() = n; + if(n > new_maxneighs()) new_maxneighs() = n; // avoid atomics, safe because in while loop } neigh_list.d_ilist(i) = i; @@ -639,10 +643,10 @@ void NeighborKokkosExecute::build_ItemCuda(typename Kokkos::TeamPoli neigh_list.d_ilist(i) = i; } - if(n >= neigh_list.maxneighs) { + if(n > neigh_list.maxneighs) { resize() = 1; - if(n >= new_maxneighs()) new_maxneighs() = n; + if(n > new_maxneighs()) new_maxneighs() = n; // avoid atomics, safe because in while loop } } } @@ -679,7 +683,7 @@ void NeighborKokkosExecute:: // no molecular test when i = ghost atom if (i < nlocal) { - const int ibin = coord2bin(xtmp, ytmp, ztmp); + const int ibin = c_atom2bin(i); for (int k = 0; k < nstencil; k++) { const int jbin = ibin + stencil[k]; for(int m = 0; m < c_bincount(jbin); m++) { @@ -731,9 +735,9 @@ void NeighborKokkosExecute:: const int ybin = binxyz[1]; const int zbin = binxyz[2]; for (int k = 0; k < nstencil; k++) { - const X_FLOAT xbin2 = xbin + stencilxyz(k,0); - const X_FLOAT ybin2 = ybin + stencilxyz(k,1); - const X_FLOAT zbin2 = zbin + stencilxyz(k,2); + const int xbin2 = xbin + stencilxyz(k,0); + const int ybin2 = ybin + stencilxyz(k,1); + const int zbin2 = zbin + stencilxyz(k,2); if (xbin2 < 0 || xbin2 >= mbinx || ybin2 < 0 || ybin2 >= mbiny || zbin2 < 0 || zbin2 >= mbinz) continue; @@ -762,10 +766,10 @@ void NeighborKokkosExecute:: neigh_list.d_numneigh(i) = n; - if(n >= neigh_list.maxneighs) { + if(n > neigh_list.maxneighs) { resize() = 1; - if(n >= new_maxneighs()) new_maxneighs() = n; + if(n > new_maxneighs()) new_maxneighs() = n; // avoid atomics, safe because in while loop } neigh_list.d_ilist(i) = i; } diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 53183114d3..6c1c0e958b 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -105,6 +105,7 @@ class NPairKokkos : public NPair { int atoms_per_bin; DAT::tdual_int_1d k_bincount; DAT::tdual_int_2d k_bins; + DAT::tdual_int_1d k_atom2bin; // data from NStencil class @@ -148,6 +149,8 @@ class NeighborKokkosExecute const typename AT::t_int_1d_const c_bincount; typename AT::t_int_2d bins; typename AT::t_int_2d_const c_bins; + const typename AT::t_int_1d atom2bin; + const typename AT::t_int_1d_const c_atom2bin; // data from NStencil class @@ -190,6 +193,7 @@ class NeighborKokkosExecute const typename AT::t_xfloat_2d_randomread &_cutneighsq, const typename AT::t_int_1d &_bincount, const typename AT::t_int_2d &_bins, + const typename AT::t_int_1d &_atom2bin, const int _nstencil, const typename AT::t_int_1d &_d_stencil, const typename AT::t_int_1d_3 &_d_stencilxyz, @@ -224,6 +228,7 @@ class NeighborKokkosExecute const int & _xprd_half, const int & _yprd_half, const int & _zprd_half): neigh_list(_neigh_list), cutneighsq(_cutneighsq), bincount(_bincount),c_bincount(_bincount),bins(_bins),c_bins(_bins), + atom2bin(_atom2bin),c_atom2bin(_atom2bin), nstencil(_nstencil),d_stencil(_d_stencil),d_stencilxyz(_d_stencilxyz), nlocal(_nlocal), x(_x),type(_type),mask(_mask),molecule(_molecule), @@ -281,41 +286,6 @@ class NeighborKokkosExecute void build_ItemCuda(typename Kokkos::TeamPolicy::member_type dev) const; #endif - KOKKOS_INLINE_FUNCTION - void binatomsItem(const int &i) const; - - KOKKOS_INLINE_FUNCTION - int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z) const - { - int ix,iy,iz; - - if (x >= bboxhi[0]) - ix = static_cast ((x-bboxhi[0])*bininvx) + nbinx; - else if (x >= bboxlo[0]) { - ix = static_cast ((x-bboxlo[0])*bininvx); - ix = MIN(ix,nbinx-1); - } else - ix = static_cast ((x-bboxlo[0])*bininvx) - 1; - - if (y >= bboxhi[1]) - iy = static_cast ((y-bboxhi[1])*bininvy) + nbiny; - else if (y >= bboxlo[1]) { - iy = static_cast ((y-bboxlo[1])*bininvy); - iy = MIN(iy,nbiny-1); - } else - iy = static_cast ((y-bboxlo[1])*bininvy) - 1; - - if (z >= bboxhi[2]) - iz = static_cast ((z-bboxhi[2])*bininvz) + nbinz; - else if (z >= bboxlo[2]) { - iz = static_cast ((z-bboxlo[2])*bininvz); - iz = MIN(iz,nbinz-1); - } else - iz = static_cast ((z-bboxlo[2])*bininvz) - 1; - - return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo); - } - KOKKOS_INLINE_FUNCTION int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const { @@ -409,7 +379,7 @@ struct NPairKokkosBuildFunctor { c.template build_Item(i); } - void operator() (typename Kokkos::TeamPolicy::member_type dev) const {} + void operator() (typename Kokkos::TeamPolicy::member_type dev) const {} // Should error out }; template diff --git a/src/KOKKOS/npair_skip_kokkos.cpp b/src/KOKKOS/npair_skip_kokkos.cpp new file mode 100644 index 0000000000..c537afaa6b --- /dev/null +++ b/src/KOKKOS/npair_skip_kokkos.cpp @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "npair_skip_kokkos.h" +#include "neighbor.h" +#include "neigh_list_kokkos.h" +#include "atom_kokkos.h" +#include "atom_vec.h" +#include "molecule.h" +#include "domain.h" +#include "my_page.h" +#include "error.h" +#include "atom_masks.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +NPairSkipKokkos::NPairSkipKokkos(LAMMPS *lmp) : NPair(lmp) { + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + d_inum = typename AT::t_int_scalar("npair_skip:inum"); +} + +/* ---------------------------------------------------------------------- + build skip list for subset of types from parent list + works for half and full lists + works for owned (non-ghost) list, also for ghost list + iskip and ijskip flag which atom types and type pairs to skip + if ghost, also store neighbors of ghost atoms & set inum,gnum correctly +------------------------------------------------------------------------- */ + +template +void NPairSkipKokkos::build(NeighList *list) +{ + atomKK->sync(execution_space,TYPE_MASK); + type = atomKK->k_type.view(); + nlocal = atom->nlocal; + + + NeighListKokkos* k_list_skip = static_cast*>(list->listskip); + d_ilist_skip = k_list_skip->d_ilist; + d_numneigh_skip = k_list_skip->d_numneigh; + d_neighbors_skip = k_list_skip->d_neighbors; + + num_skip = list->listskip->inum; + if (list->ghost) num_skip += list->listskip->gnum; + + NeighListKokkos* k_list = static_cast*>(list); + k_list->maxneighs = k_list_skip->maxneighs; // simple, but could be made more memory efficient + k_list->grow(atom->nmax); + d_ilist = k_list->d_ilist; + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + + int ntypes = atom->ntypes; + + k_iskip = DAT::tdual_int_1d("npair_skip:iskip",ntypes+1); + k_ijskip = DAT::tdual_int_2d("npair_skip:ijskip",ntypes+1,ntypes+1); + d_iskip = k_iskip.view(); + d_ijskip = k_ijskip.view(); + + for (int itype = 1; itype <= ntypes; itype++) { + k_iskip.h_view(itype) = list->iskip[itype]; + for (int jtype = 1; jtype <= ntypes; jtype++) { + k_ijskip.h_view(itype,jtype) = list->ijskip[itype][jtype]; + } + } + k_iskip.modify(); + k_ijskip.modify(); + + k_iskip.sync(); + k_ijskip.sync(); + + // loop over atoms in other list + // skip I atom entirely if iskip is set for type[I] + // skip I,J pair if ijskip is set for type[I],type[J] + + copymode = 1; + Kokkos::parallel_scan(Kokkos::RangePolicy(0,num_skip),*this); + + auto h_inum = Kokkos::create_mirror_view(d_inum); + Kokkos::deep_copy(h_inum,d_inum); + const int inum = h_inum(); + list->inum = inum; + if (list->ghost) { + int num = 0; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,inum),*this,num); + list->inum = num; + list->gnum = inum - num; + } + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void NPairSkipKokkos::operator()(TagNPairSkipCompute, const int &ii, int &inum, const bool &final) const { + + const int i = d_ilist_skip(ii); + const int itype = type(i); + + if (!d_iskip(itype)) { + + if (final) { + + int n = 0; + + // loop over parent non-skip list + + const int jnum = d_numneigh_skip(i); + const AtomNeighbors neighbors_i = AtomNeighbors(&d_neighbors(i,0),d_numneigh(i), + &d_neighbors(i,1)-&d_neighbors(i,0)); + + for (int jj = 0; jj < jnum; jj++) { + const int joriginal = d_neighbors_skip(i,jj); + int j = joriginal & NEIGHMASK; + if (d_ijskip(itype,type(j))) continue; + neighbors_i(n++) = joriginal; + } + + d_numneigh(i) = n; + d_ilist(inum) = i; + } + + inum++; + } + + if (final) { + if (ii == num_skip-1) + d_inum() = inum; + } +} + +template +KOKKOS_INLINE_FUNCTION +void NPairSkipKokkos::operator()(TagNPairSkipCountLocal, const int &i, int &num) const { + if (d_ilist[i] < nlocal) num++; +} + + +namespace LAMMPS_NS { +template class NPairSkipKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class NPairSkipKokkos; +#endif +} diff --git a/src/KOKKOS/npair_skip_kokkos.h b/src/KOKKOS/npair_skip_kokkos.h new file mode 100644 index 0000000000..a274c1738c --- /dev/null +++ b/src/KOKKOS/npair_skip_kokkos.h @@ -0,0 +1,102 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef NPAIR_CLASS + +typedef NPairSkipKokkos NPairKokkosSkipDevice; +NPairStyle(skip/kk/device, + NPairKokkosSkipDevice, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE) + +typedef NPairSkipKokkos NPairKokkosSkipGhostDevice; +NPairStyle(skip/ghost/kk/device, + NPairKokkosSkipGhostDevice, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE) + +typedef NPairSkipKokkos NPairKokkosSkipHost; +NPairStyle(skip/kk/host, + NPairKokkosSkipHost, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_KOKKOS_HOST) + +typedef NPairSkipKokkos NPairKokkosSkipGhostHost; +NPairStyle(skip/ghost/kk/host, + NPairKokkosSkipGhostHost, + NP_SKIP | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST) + +#else + +#ifndef LMP_NPAIR_SKIP_KOKKOS_H +#define LMP_NPAIR_SKIP_KOKKOS_H + +#include "npair.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct TagNPairSkipCompute{}; +struct TagNPairSkipCountLocal{}; + +template +class NPairSkipKokkos : public NPair { + public: + typedef DeviceType device_type; + typedef int value_type; + typedef ArrayTypes AT; + + NPairSkipKokkos(class LAMMPS *); + ~NPairSkipKokkos() {} + void build(class NeighList *); + + KOKKOS_INLINE_FUNCTION + void operator()(TagNPairSkipCompute, const int&, int&, const bool&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagNPairSkipCountLocal, const int&, int&) const; + + private: + int nlocal,num_skip; + + typename AT::t_int_1d_randomread type; + + typename AT::t_int_scalar d_inum; + + typename AT::t_neighbors_2d_const d_neighbors_skip; + typename AT::t_int_1d_const d_ilist_skip; + typename AT::t_int_1d_const d_numneigh_skip; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d d_ilist; + typename AT::t_int_1d d_numneigh; + + DAT::tdual_int_1d k_iskip; + DAT::tdual_int_2d k_ijskip; + typename AT::t_int_1d d_iskip; + typename AT::t_int_2d d_ijskip; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/npair_ssa_kokkos.cpp b/src/KOKKOS/npair_ssa_kokkos.cpp new file mode 100644 index 0000000000..9f447bda1a --- /dev/null +++ b/src/KOKKOS/npair_ssa_kokkos.cpp @@ -0,0 +1,757 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: + James Larentzos and Timothy I. Mattox (Engility Corporation) +------------------------------------------------------------------------- */ + +#include "npair_ssa_kokkos.h" +#include "neigh_list.h" +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "domain_kokkos.h" +#include "neighbor_kokkos.h" +#include "nbin_ssa_kokkos.h" +#include "nstencil_ssa.h" +#include "error.h" +#include "comm.h" + +namespace LAMMPS_NS { + +/* ---------------------------------------------------------------------- */ + +template +NPairSSAKokkos::NPairSSAKokkos(LAMMPS *lmp) : NPair(lmp), ssa_phaseCt(27), ssa_gphaseCt(7) +{ + const int gphaseLenEstimate = 1; //FIXME make this 4 eventually + k_ssa_gphaseLen = DAT::tdual_int_1d("NPairSSAKokkos:ssa_gphaseLen",ssa_gphaseCt); + ssa_gphaseLen = k_ssa_gphaseLen.view(); + + k_ssa_gitemLoc = DAT::tdual_int_2d("NPairSSAKokkos::ssa_gitemLoc",ssa_gphaseCt,gphaseLenEstimate); + ssa_gitemLoc = k_ssa_gitemLoc.view(); + k_ssa_gitemLen = DAT::tdual_int_2d("NPairSSAKokkos::ssa_gitemLen",ssa_gphaseCt,gphaseLenEstimate); + ssa_gitemLen = k_ssa_gitemLen.view(); +} + +/* ---------------------------------------------------------------------- + copy needed info from Neighbor class to this build class + ------------------------------------------------------------------------- */ + +template +void NPairSSAKokkos::copy_neighbor_info() +{ + NPair::copy_neighbor_info(); + + NeighborKokkos* neighborKK = (NeighborKokkos*) neighbor; + + // general params + + k_cutneighsq = neighborKK->k_cutneighsq; + + // exclusion info + + k_ex1_type = neighborKK->k_ex1_type; + k_ex2_type = neighborKK->k_ex2_type; + k_ex_type = neighborKK->k_ex_type; + k_ex1_group = neighborKK->k_ex1_group; + k_ex2_group = neighborKK->k_ex2_group; + k_ex1_bit = neighborKK->k_ex1_bit; + k_ex2_bit = neighborKK->k_ex2_bit; + k_ex_mol_group = neighborKK->k_ex_mol_group; + k_ex_mol_bit = neighborKK->k_ex_mol_bit; + k_ex_mol_intra = neighborKK->k_ex_mol_intra; +} + +/* ---------------------------------------------------------------------- + copy per-atom and per-bin vectors from NBinSSAKokkos class to this build class + ------------------------------------------------------------------------- */ + +template +void NPairSSAKokkos::copy_bin_info() +{ + NPair::copy_bin_info(); + + NBinSSAKokkos* nbKK = dynamic_cast*>(nb); + if (!nbKK) error->one(FLERR, "NBin wasn't a NBinSSAKokkos object"); + + atoms_per_bin = nbKK->atoms_per_bin; + k_bincount = nbKK->k_bincount; + k_bins = nbKK->k_bins; + + ghosts_per_gbin = nbKK->ghosts_per_gbin; + k_gbincount = nbKK->k_gbincount; + k_gbins = nbKK->k_gbins; + + lbinxlo = nbKK->h_lbinxlo(); + lbinxhi = nbKK->h_lbinxhi(); + lbinylo = nbKK->h_lbinylo(); + lbinyhi = nbKK->h_lbinyhi(); + lbinzlo = nbKK->h_lbinzlo(); + lbinzhi = nbKK->h_lbinzhi(); +} + +/* ---------------------------------------------------------------------- + copy needed info from NStencil class to this build class + ------------------------------------------------------------------------- */ + +template +void NPairSSAKokkos::copy_stencil_info() +{ + NPair::copy_stencil_info(); + + nstencil = ns->nstencil; + + int maxstencil = ns->get_maxstencil(); + + k_stencil = DAT::tdual_int_1d("NPairSSAKokkos:stencil",maxstencil); + for (int k = 0; k < maxstencil; k++) { + k_stencil.h_view(k) = ns->stencil[k]; + } + k_stencil.modify(); + k_stencil.sync(); + k_stencilxyz = DAT::tdual_int_1d_3("NPairSSAKokkos:stencilxyz",maxstencil); + for (int k = 0; k < maxstencil; k++) { + k_stencilxyz.h_view(k,0) = ns->stencilxyz[k][0]; + k_stencilxyz.h_view(k,1) = ns->stencilxyz[k][1]; + k_stencilxyz.h_view(k,2) = ns->stencilxyz[k][2]; + } + k_stencilxyz.modify(); + k_stencilxyz.sync(); + + NStencilSSA *ns_ssa = dynamic_cast(ns); + if (!ns_ssa) error->one(FLERR, "NStencil wasn't a NStencilSSA object"); + + k_nstencil_ssa = DAT::tdual_int_1d("NPairSSAKokkos:nstencil_ssa",5); + for (int k = 0; k < 5; ++k) { + k_nstencil_ssa.h_view(k) = ns_ssa->nstencil_ssa[k]; + } + k_nstencil_ssa.modify(); + k_nstencil_ssa.sync(); + sx1 = ns_ssa->sx + 1; + sy1 = ns_ssa->sy + 1; + sz1 = ns_ssa->sz + 1; + + // Setup the phases of the workplan for locals + ssa_phaseCt = sz1*sy1*sx1; + if (ssa_phaseCt > (int) k_ssa_phaseLen.dimension_0()) { + k_ssa_phaseLen = DAT::tdual_int_1d("NPairSSAKokkos:ssa_phaseLen",ssa_phaseCt); + ssa_phaseLen = k_ssa_phaseLen.view(); + k_ssa_phaseOff = DAT::tdual_int_1d_3("NPairSSAKokkos:ssa_phaseOff",ssa_phaseCt); + ssa_phaseOff = k_ssa_phaseOff.view(); + } + auto h_ssa_phaseOff = k_ssa_phaseOff.h_view; + k_ssa_phaseOff.sync(); + int workPhase = 0; + for (int zoff = sz1 - 1; zoff >= 0; --zoff) { + for (int yoff = sy1 - 1; yoff >= 0; --yoff) { + for (int xoff = sx1 - 1; xoff >= 0; --xoff) { + h_ssa_phaseOff(workPhase, 0) = xoff; + h_ssa_phaseOff(workPhase, 1) = yoff; + h_ssa_phaseOff(workPhase, 2) = zoff; + workPhase++; + } + } + } + k_ssa_phaseOff.modify(); + k_ssa_phaseOff.sync(); + +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +int NPairSSAKokkosExecute::find_special(const int &i, const int &j) const +{ + const int n1 = nspecial(i,0); + const int n2 = nspecial(i,1); + const int n3 = nspecial(i,2); + + for (int k = 0; k < n3; k++) { + if (special(i,k) == tag(j)) { + if (k < n1) { + if (special_flag[1] == 0) return -1; + else if (special_flag[1] == 1) return 0; + else return 1; + } else if (k < n2) { + if (special_flag[2] == 0) return -1; + else if (special_flag[2] == 1) return 0; + else return 2; + } else { + if (special_flag[3] == 0) return -1; + else if (special_flag[3] == 1) return 0; + else return 3; + } + } + } + return 0; +}; + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +int NPairSSAKokkosExecute::exclusion(const int &i,const int &j, + const int &itype,const int &jtype) const +{ + int m; + + if (nex_type && ex_type(itype,jtype)) return 1; + + if (nex_group) { + for (m = 0; m < nex_group; m++) { + if (mask(i) & ex1_bit(m) && mask(j) & ex2_bit(m)) return 1; + if (mask(i) & ex2_bit(m) && mask(j) & ex1_bit(m)) return 1; + } + } + + if (nex_mol) { + for (m = 0; m < nex_mol; m++) + if (ex_mol_intra[m]) { // intra-chain: exclude i-j pair if on same molecule + if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && + molecule[i] == molecule[j]) return 1; + } else // exclude i-j pair if on different molecules + if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && + molecule[i] != molecule[j]) return 1; + } + + return 0; +} + +/* ---------------------------------------------------------------------- */ + + +/* ---------------------------------------------------------------------- + binned neighbor list construction with full Newton's 3rd law + for use by Shardlow Spliting Algorithm + each owned atom i checks its own bin and other bins in Newton stencil + every pair stored exactly once by some processor +------------------------------------------------------------------------- */ + +template +void NPairSSAKokkos::build(NeighList *list_) +{ + NeighListKokkos* list = (NeighListKokkos*) list_; + const int nlocal = includegroup?atom->nfirst:atom->nlocal; + int nl_size; + + int xbinCt = (lbinxhi - lbinxlo + sx1 - 1) / sx1 + 1; + int ybinCt = (lbinyhi - lbinylo + sy1 - 1) / sy1 + 1; + int zbinCt = (lbinzhi - lbinzlo + sz1 - 1) / sz1 + 1; + int phaseLenEstimate = xbinCt*ybinCt*zbinCt; + + if ((ssa_phaseCt > (int) k_ssa_itemLoc.dimension_0()) || + (phaseLenEstimate > (int) k_ssa_itemLoc.dimension_1())) { + k_ssa_itemLoc = DAT::tdual_int_2d("NPairSSAKokkos::ssa_itemLoc",ssa_phaseCt,phaseLenEstimate); + ssa_itemLoc = k_ssa_itemLoc.view(); + k_ssa_itemLen = DAT::tdual_int_2d("NPairSSAKokkos::ssa_itemLen",ssa_phaseCt,phaseLenEstimate); + ssa_itemLen = k_ssa_itemLen.view(); + } + + k_ssa_itemLoc.sync(); + k_ssa_itemLen.sync(); + k_ssa_gitemLoc.sync(); + k_ssa_gitemLen.sync(); + k_ssa_phaseOff.sync(); + k_ssa_phaseLen.sync(); + auto h_ssa_itemLoc = k_ssa_itemLoc.h_view; + auto h_ssa_itemLen = k_ssa_itemLen.h_view; + auto h_ssa_gitemLoc = k_ssa_gitemLoc.h_view; + auto h_ssa_gitemLen = k_ssa_gitemLen.h_view; + auto h_ssa_phaseOff = k_ssa_phaseOff.h_view; + auto h_ssa_phaseLen = k_ssa_phaseLen.h_view; + +{ // Preflight the neighbor list workplan + k_bincount.sync(); + auto h_bincount = k_bincount.h_view; + k_stencil.sync(); + auto h_stencil = k_stencil.h_view; + k_nstencil_ssa.sync(); + auto h_nstencil_ssa = k_nstencil_ssa.h_view; + int inum = 0; + + // loop over bins with local atoms, counting half of the neighbors + for (int workPhase = 0; workPhase < ssa_phaseCt; ++workPhase) { + int zoff = h_ssa_phaseOff(workPhase, 2); + int yoff = h_ssa_phaseOff(workPhase, 1); + int xoff = h_ssa_phaseOff(workPhase, 0); + int workItem = 0; + for (int zbin = lbinzlo + zoff; zbin < lbinzhi; zbin += sz1) { + for (int ybin = lbinylo + yoff - sy1 + 1; ybin < lbinyhi; ybin += sy1) { + for (int xbin = lbinxlo + xoff - sx1 + 1; xbin < lbinxhi; xbin += sx1) { + int inum_start = inum; +// if (workItem >= phaseLenEstimate) error->one(FLERR,"phaseLenEstimate was too small"); + + for (int subphase = 0; subphase < 4; subphase++) { + int s_ybin = ybin + ((subphase & 0x2) ? sy1 - 1 : 0); + int s_xbin = xbin + ((subphase & 0x1) ? sx1 - 1 : 0); + if ((s_ybin < lbinylo) || (s_ybin >= lbinyhi)) continue; + if ((s_xbin < lbinxlo) || (s_xbin >= lbinxhi)) continue; + + const int ibin = zbin*mbiny*mbinx + s_ybin*mbinx + s_xbin; + const int ibinCt = h_bincount(ibin); + if (ibinCt > 0) { + int base_n = 0; + bool include_same = false; + // count all local atoms in the current stencil "subphase" as potential neighbors + for (int k = h_nstencil_ssa(subphase); k < h_nstencil_ssa(subphase+1); k++) { + const int jbin = ibin+h_stencil(k); + if (jbin != ibin) base_n += h_bincount(jbin); + else include_same = true; + } + // Calculate how many ibin particles would have had some neighbors + if (base_n > 0) inum += ibinCt; + else if (include_same) inum += ibinCt - 1; + } + } + h_ssa_itemLoc(workPhase,workItem) = inum_start; // record where workItem starts in ilist + h_ssa_itemLen(workPhase,workItem) = inum - inum_start; // record workItem length +#ifdef DEBUG_SSA_BUILD_LOCALS +if (h_ssa_itemLen(workPhase,workItem) < 0) fprintf(stdout, "undr%03d phase (%3d,%3d) inum %d - inum_start %d UNDERFLOW\n" + ,comm->me + ,workPhase + ,workItem + ,inum + ,inum_start +); +#endif + workItem++; + } + } + } + +#ifdef DEBUG_SSA_BUILD_LOCALS +fprintf(stdout, "phas%03d phase %3d could use %6d inums, expected %6d inums. maxworkItems = %3d, inums/workItems = %g\n" + ,comm->me + ,workPhase + ,inum - h_ssa_itemLoc(workPhase, 0) + ,(nlocal*4 + ssa_phaseCt - 1) / ssa_phaseCt + ,workItem + ,(inum - h_ssa_itemLoc(workPhase, 0)) / (double) workItem +); +#endif + // record where workPhase ends + h_ssa_phaseLen(workPhase) = workItem; + } +#ifdef DEBUG_SSA_BUILD_LOCALS +fprintf(stdout, "tota%03d total %3d could use %6d inums, expected %6d inums. inums/phase = %g\n" + ,comm->me + ,workPhase + ,inum + ,nlocal*4 + ,inum / (double) workPhase +); +#endif + nl_size = inum; // record how much space is needed for the local work plan +} + + // count how many ghosts might have neighbors, and increase the work plan storage + k_gbincount.sync(); + for (int workPhase = 0; workPhase < ssa_gphaseCt; workPhase++) { + int len = k_gbincount.h_view(workPhase + 1); + h_ssa_gitemLoc(workPhase,0) = nl_size; // record where workItem starts in ilist + h_ssa_gitemLen(workPhase,0) = len; + nl_size += len; + } + list->grow(nl_size); // Make special larger SSA neighbor list + + k_ssa_itemLoc.modify(); + k_ssa_itemLen.modify(); + k_ssa_gitemLoc.modify(); + k_ssa_gitemLen.modify(); + k_ssa_phaseLen.modify(); + k_ssa_itemLoc.sync(); + k_ssa_itemLen.sync(); + k_ssa_gitemLen.sync(); + k_ssa_gitemLoc.sync(); + k_ssa_phaseOff.sync(); + k_ssa_phaseLen.sync(); + k_ssa_gphaseLen.sync(); + + NPairSSAKokkosExecute + data(*list, + k_cutneighsq.view(), + k_bincount.view(), + k_bins.view(), + k_gbincount.view(), + k_gbins.view(), + lbinxlo, lbinxhi, lbinylo, lbinyhi, lbinzlo, lbinzhi, + nstencil, sx1, sy1, sz1, + k_stencil.view(), + k_stencilxyz.view(), + k_nstencil_ssa.view(), + ssa_phaseCt, + k_ssa_phaseLen.view(), + k_ssa_phaseOff.view(), + k_ssa_itemLoc.view(), + k_ssa_itemLen.view(), + ssa_gphaseCt, + k_ssa_gphaseLen.view(), + k_ssa_gitemLoc.view(), + k_ssa_gitemLen.view(), + nlocal, + atomKK->k_x.view(), + atomKK->k_type.view(), + atomKK->k_mask.view(), + atomKK->k_molecule.view(), + atomKK->k_tag.view(), + atomKK->k_special.view(), + atomKK->k_nspecial.view(), + atomKK->molecular, + nbinx,nbiny,nbinz,mbinx,mbiny,mbinz,mbinxlo,mbinylo,mbinzlo, + bininvx,bininvy,bininvz, + exclude, nex_type, + k_ex1_type.view(), + k_ex2_type.view(), + k_ex_type.view(), + nex_group, + k_ex1_group.view(), + k_ex2_group.view(), + k_ex1_bit.view(), + k_ex2_bit.view(), + nex_mol, + k_ex_mol_group.view(), + k_ex_mol_bit.view(), + k_ex_mol_intra.view(), + bboxhi,bboxlo, + domain->xperiodic,domain->yperiodic,domain->zperiodic, + domain->xprd_half,domain->yprd_half,domain->zprd_half); + + k_cutneighsq.sync(); + k_ex1_type.sync(); + k_ex2_type.sync(); + k_ex_type.sync(); + k_ex1_group.sync(); + k_ex2_group.sync(); + k_ex1_bit.sync(); + k_ex2_bit.sync(); + k_ex_mol_group.sync(); + k_ex_mol_bit.sync(); + k_ex_mol_intra.sync(); + k_bincount.sync(); + k_bins.sync(); + k_gbincount.sync(); + k_gbins.sync(); + atomKK->sync(Device,X_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK); + + data.special_flag[0] = special_flag[0]; + data.special_flag[1] = special_flag[1]; + data.special_flag[2] = special_flag[2]; + data.special_flag[3] = special_flag[3]; + + bool firstTry = true; + data.h_resize()=1; + while(data.h_resize()) { + data.h_new_maxneighs() = list->maxneighs; + data.h_resize() = 0; + + Kokkos::deep_copy(data.resize, data.h_resize); + Kokkos::deep_copy(data.new_maxneighs, data.h_new_maxneighs); + + // loop over bins with local atoms, storing half of the neighbors + Kokkos::parallel_for(ssa_phaseCt, LAMMPS_LAMBDA (const int workPhase) { + data.build_locals_onePhase(firstTry, comm->me, workPhase); + }); + k_ssa_itemLoc.modify(); + k_ssa_itemLen.modify(); + k_ssa_phaseLen.modify(); + k_ssa_itemLoc.sync(); + k_ssa_itemLen.sync(); + k_ssa_phaseLen.sync(); + data.neigh_list.inum = h_ssa_itemLoc(ssa_phaseCt-1,h_ssa_phaseLen(ssa_phaseCt-1)-1) + + h_ssa_itemLen(ssa_phaseCt-1,h_ssa_phaseLen(ssa_phaseCt-1)-1); + + // loop over AIR ghost atoms, storing their local neighbors + Kokkos::parallel_for(ssa_gphaseCt, LAMMPS_LAMBDA (const int workPhase) { + data.build_ghosts_onePhase(workPhase); + }); + k_ssa_gitemLoc.modify(); + k_ssa_gitemLen.modify(); + k_ssa_gphaseLen.modify(); + k_ssa_gitemLoc.sync(); + k_ssa_gitemLen.sync(); + k_ssa_gphaseLen.sync(); + auto h_ssa_gphaseLen = k_ssa_gphaseLen.h_view; + data.neigh_list.gnum = h_ssa_gitemLoc(ssa_gphaseCt-1,h_ssa_gphaseLen(ssa_gphaseCt-1)-1) + + h_ssa_gitemLen(ssa_gphaseCt-1,h_ssa_gphaseLen(ssa_gphaseCt-1)-1) - data.neigh_list.inum; + firstTry = false; + + deep_copy(data.h_resize, data.resize); + + if(data.h_resize()) { + deep_copy(data.h_new_maxneighs, data.new_maxneighs); + list->maxneighs = data.h_new_maxneighs() * 1.2; + list->d_neighbors = typename ArrayTypes::t_neighbors_2d("neighbors", list->d_neighbors.dimension_0(), list->maxneighs); + data.neigh_list.d_neighbors = list->d_neighbors; + data.neigh_list.maxneighs = list->maxneighs; + } + } + + //k_ssa_phaseLen.modify(); + //k_ssa_itemLoc.modify(); + //k_ssa_itemLen.modify(); + //k_ssa_gphaseLen.modify(); + //k_ssa_gitemLoc.modify(); + //k_ssa_gitemLen.modify(); + + list->inum = data.neigh_list.inum; //FIXME once the above is in a parallel_for + list->gnum = data.neigh_list.gnum; // it will need a deep_copy or something + +#ifdef DEBUG_SSA_BUILD_LOCALS +fprintf(stdout, "Fina%03d %6d inum %6d gnum, total used %6d, allocated %6d\n" + ,comm->me + ,list->inum + ,list->gnum + ,list->inum + list->gnum + ,nl_size +); +#endif + + list->k_ilist.template modify(); +} + + +template +void NPairSSAKokkosExecute::build_locals_onePhase(const bool firstTry, int me, int workPhase) const +{ + const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; + int which = 0; + + int zoff = d_ssa_phaseOff(workPhase, 2); + int yoff = d_ssa_phaseOff(workPhase, 1); + int xoff = d_ssa_phaseOff(workPhase, 0); + int workItem = 0; + int skippedItems = 0; + for (int zbin = lbinzlo + zoff; zbin < lbinzhi; zbin += sz1) { + for (int ybin = lbinylo + yoff - sy1 + 1; ybin < lbinyhi; ybin += sy1) { + for (int xbin = lbinxlo + xoff - sx1 + 1; xbin < lbinxhi; xbin += sx1) { + if (d_ssa_itemLen(workPhase, workItem + skippedItems) == 0) { + if (firstTry) ++skippedItems; + else ++workItem; // phase is done,should break out of three loops here if we could... + continue; + } + int inum_start = d_ssa_itemLoc(workPhase, workItem + skippedItems); + int inum = inum_start; + + for (int subphase = 0; subphase < 4; subphase++) { + int s_ybin = ybin + ((subphase & 0x2) ? sy1 - 1 : 0); + int s_xbin = xbin + ((subphase & 0x1) ? sx1 - 1 : 0); + if ((s_ybin < lbinylo) || (s_ybin >= lbinyhi)) continue; + if ((s_xbin < lbinxlo) || (s_xbin >= lbinxhi)) continue; + + int ibin = zbin*mbiny*mbinx + s_ybin*mbinx + s_xbin; + for (int il = 0; il < c_bincount(ibin); ++il) { + const int i = c_bins(ibin, il); + int n = 0; + + const AtomNeighbors neighbors_i = neigh_list.get_neighbors(inum); + const X_FLOAT xtmp = x(i, 0); + const X_FLOAT ytmp = x(i, 1); + const X_FLOAT ztmp = x(i, 2); + const int itype = type(i); + + // loop over all local atoms in the current stencil "subphase" + for (int k = d_nstencil_ssa(subphase); k < d_nstencil_ssa(subphase+1); k++) { + const int jbin = ibin+stencil(k); + int jl; + if (jbin != ibin) jl = 0; + else jl = il + 1; // same bin as i, so start just past i in the bin + for (; jl < c_bincount(jbin); ++jl) { + const int j = c_bins(jbin, jl); + const int jtype = type(j); + if(exclude && exclusion(i,j,itype,jtype)) continue; + + const X_FLOAT delx = xtmp - x(j, 0); + const X_FLOAT dely = ytmp - x(j, 1); + const X_FLOAT delz = ztmp - x(j, 2); + const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; + if(rsq <= cutneighsq(itype,jtype)) { + if (molecular) { + if (!moltemplate) + which = find_special(i,j); + /* else if (imol >= 0) */ + /* which = find_special(onemols[imol]->special[iatom], */ + /* onemols[imol]->nspecial[iatom], */ + /* tag[j]-tagprev); */ + /* else which = 0; */ + if (which == 0){ + if(n 0) { + if(n 0) { + neigh_list.d_numneigh(inum) = n; + neigh_list.d_ilist(inum++) = i; + if(n > neigh_list.maxneighs) { + resize() = 1; + if(n > new_maxneighs()) Kokkos::atomic_fetch_max(&new_maxneighs(),n); + } + } + } + } + int len = inum - inum_start; +#ifdef DEBUG_SSA_BUILD_LOCALS + if (len != d_ssa_itemLen(workPhase, workItem + skippedItems)) { +fprintf(stdout, "Leng%03d workphase (%2d,%3d,%3d): len = %4d, but ssa_itemLen = %4d%s\n" + ,me + ,workPhase + ,workItem + ,workItem + skippedItems + ,len + ,d_ssa_itemLen(workPhase, workItem + skippedItems) + ,(len > d_ssa_itemLen(workPhase, workItem + skippedItems)) ? " OVERFLOW" : "" +); + } +#endif + if (inum > inum_start) { + d_ssa_itemLoc(workPhase,workItem) = inum_start; // record where workItem starts in ilist + d_ssa_itemLen(workPhase,workItem) = inum - inum_start; // record actual workItem length + workItem++; + } else if (firstTry) ++skippedItems; + } + } + } + +#ifdef DEBUG_SSA_BUILD_LOCALS +fprintf(stdout, "Phas%03d phase %3d used %6d inums, workItems = %3d, skipped = %3d, inums/workItems = %g\n" + ,me + ,workPhase + ,inum - d_ssa_itemLoc(workPhase, 0) + ,workItem + ,skippedItems + ,(inum - d_ssa_itemLoc(workPhase, 0)) / (double) workItem +); +#endif + // record where workPhase actually ends + if (firstTry) { + d_ssa_phaseLen(workPhase) = workItem; + while (workItem < (int) d_ssa_itemLen.dimension_1()) { + d_ssa_itemLen(workPhase,workItem++) = 0; + } + } + +} + + +template +void NPairSSAKokkosExecute::build_ghosts_onePhase(int workPhase) const +{ + const typename ArrayTypes::t_int_1d_const_um stencil = d_stencil; + int which = 0; + + // since these are ghosts, must check if stencil bin is out of bounds + int airnum = workPhase + 1; + //FIXME for now, there is only 1 workItem for each ghost AIR + int workItem; + for (workItem = 0; workItem < 1; ++workItem) { + int gNdx = d_ssa_gitemLoc(workPhase, workItem); // record where workItem starts in ilist + for (int il = 0; il < c_gbincount(airnum); ++il) { + const int i = c_gbins(airnum, il); + int n = 0; + + const AtomNeighbors neighbors_i = neigh_list.get_neighbors(gNdx); + const X_FLOAT xtmp = x(i, 0); + const X_FLOAT ytmp = x(i, 1); + const X_FLOAT ztmp = x(i, 2); + const int itype = type(i); + + int loc[3]; + const int ibin = coord2bin(x(i, 0), x(i, 1), x(i, 2), &(loc[0])); + + // loop over AIR ghost atoms in all bins in "full" stencil + // Note: the non-AIR ghost atoms have already been filtered out + for (int k = 0; k < nstencil; k++) { + int xbin2 = loc[0] + d_stencilxyz(k,0); + int ybin2 = loc[1] + d_stencilxyz(k,1); + int zbin2 = loc[2] + d_stencilxyz(k,2); + // Skip it if this bin is outside the extent of local bins + if (xbin2 < lbinxlo || xbin2 >= lbinxhi || + ybin2 < lbinylo || ybin2 >= lbinyhi || + zbin2 < lbinzlo || zbin2 >= lbinzhi) continue; + const int jbin = ibin+stencil(k); + for (int jl = 0; jl < c_bincount(jbin); ++jl) { + const int j = c_bins(jbin, jl); + const int jtype = type(j); + if(exclude && exclusion(i,j,itype,jtype)) continue; + + const X_FLOAT delx = xtmp - x(j, 0); + const X_FLOAT dely = ytmp - x(j, 1); + const X_FLOAT delz = ztmp - x(j, 2); + const X_FLOAT rsq = delx*delx + dely*dely + delz*delz; + if(rsq <= cutneighsq(itype,jtype)) { + if (molecular) { + if (!moltemplate) + which = find_special(j,i); + /* else if (jmol >= 0) */ + /* which = find_special(onemols[jmol]->special[jatom], */ + /* onemols[jmol]->nspecial[jatom], */ + /* tag[i]-jtagprev); */ + /* else which = 0; */ + if (which == 0){ + if(n 0) { + if(n 0) { + neigh_list.d_numneigh(gNdx) = n; + neigh_list.d_ilist(gNdx++) = i; + if(n > neigh_list.maxneighs) { + resize() = 1; + if(n > new_maxneighs()) Kokkos::atomic_fetch_max(&new_maxneighs(),n); + } + } + } + // record where workItem ends in ilist + d_ssa_gitemLen(workPhase,workItem) = gNdx - d_ssa_gitemLoc(workPhase,workItem); + // if (d_ssa_gitemLen(workPhase,workItem) > 0) workItem++; + } + d_ssa_gphaseLen(workPhase) = workItem; +} + +} + +namespace LAMMPS_NS { +template class NPairSSAKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class NPairSSAKokkos; +#endif +} diff --git a/src/KOKKOS/npair_ssa_kokkos.h b/src/KOKKOS/npair_ssa_kokkos.h new file mode 100644 index 0000000000..17a23b2811 --- /dev/null +++ b/src/KOKKOS/npair_ssa_kokkos.h @@ -0,0 +1,366 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef NPAIR_CLASS + +typedef NPairSSAKokkos NPairSSAKokkosHost; +NPairStyle(half/bin/newton/ssa/kk/host, + NPairSSAKokkosHost, + NP_HALF | NP_BIN | NP_NEWTON | NP_ORTHO | NP_SSA | NP_GHOST | NP_KOKKOS_HOST) + +typedef NPairSSAKokkos NPairSSAKokkosDevice; +NPairStyle(half/bin/newton/ssa/kk/device, + NPairSSAKokkosDevice, + NP_HALF | NP_BIN | NP_NEWTON | NP_ORTHO | NP_SSA | NP_GHOST | NP_KOKKOS_DEVICE) + +#else + +#ifndef LMP_NPAIR_SSA_KOKKOS_H +#define LMP_NPAIR_SSA_KOKKOS_H + +#include "npair.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +template +class NPairSSAKokkos : public NPair { + public: + typedef ArrayTypes AT; + + // SSA Work plan data structures + int ssa_phaseCt; + DAT::tdual_int_1d k_ssa_phaseLen; + DAT::tdual_int_1d_3 k_ssa_phaseOff; + DAT::tdual_int_2d k_ssa_itemLoc; + DAT::tdual_int_2d k_ssa_itemLen; + typename AT::t_int_1d ssa_phaseLen; + typename AT::t_int_1d_3 ssa_phaseOff; + typename AT::t_int_2d ssa_itemLoc; + typename AT::t_int_2d ssa_itemLen; + + const int ssa_gphaseCt; + DAT::tdual_int_1d k_ssa_gphaseLen; + DAT::tdual_int_2d k_ssa_gitemLoc; + DAT::tdual_int_2d k_ssa_gitemLen; + typename AT::t_int_1d ssa_gphaseLen; + typename AT::t_int_2d ssa_gitemLoc; + typename AT::t_int_2d ssa_gitemLen; + + NPairSSAKokkos(class LAMMPS *); + ~NPairSSAKokkos() {} + void copy_neighbor_info(); + void copy_bin_info(); + void copy_stencil_info(); + void build(class NeighList *); + private: + // data from Neighbor class + + DAT::tdual_xfloat_2d k_cutneighsq; + + // exclusion data from Neighbor class + + DAT::tdual_int_1d k_ex1_type,k_ex2_type; + DAT::tdual_int_2d k_ex_type; + DAT::tdual_int_1d k_ex1_group,k_ex2_group; + DAT::tdual_int_1d k_ex1_bit,k_ex2_bit; + DAT::tdual_int_1d k_ex_mol_group; + DAT::tdual_int_1d k_ex_mol_bit; + DAT::tdual_int_1d k_ex_mol_intra; + + // data from NBinSSA class + + int atoms_per_bin; + DAT::tdual_int_1d k_bincount; + DAT::tdual_int_2d k_bins; + int ghosts_per_gbin; + DAT::tdual_int_1d k_gbincount; + DAT::tdual_int_2d k_gbins; + int lbinxlo, lbinxhi, lbinylo, lbinyhi, lbinzlo, lbinzhi; + + // data from NStencilSSA class + + int nstencil; + DAT::tdual_int_1d k_stencil; // # of J neighs for each I + DAT::tdual_int_1d_3 k_stencilxyz; + DAT::tdual_int_1d k_nstencil_ssa; + int sx1, sy1, sz1; +}; + +template +class NPairSSAKokkosExecute +{ + typedef ArrayTypes AT; + + public: + NeighListKokkos neigh_list; + + // data from Neighbor class + + const typename AT::t_xfloat_2d_randomread cutneighsq; + + // exclusion data from Neighbor class + + const int exclude; + + const int nex_type; + const typename AT::t_int_1d_const ex1_type,ex2_type; + const typename AT::t_int_2d_const ex_type; + + const int nex_group; + const typename AT::t_int_1d_const ex1_group,ex2_group; + const typename AT::t_int_1d_const ex1_bit,ex2_bit; + + const int nex_mol; + const typename AT::t_int_1d_const ex_mol_group; + const typename AT::t_int_1d_const ex_mol_bit; + const typename AT::t_int_1d_const ex_mol_intra; + + // data from NBinSSA class + + const typename AT::t_int_1d bincount; + const typename AT::t_int_1d_const c_bincount; + typename AT::t_int_2d bins; + typename AT::t_int_2d_const c_bins; + const typename AT::t_int_1d gbincount; + const typename AT::t_int_1d_const c_gbincount; + typename AT::t_int_2d gbins; + typename AT::t_int_2d_const c_gbins; + const int lbinxlo, lbinxhi, lbinylo, lbinyhi, lbinzlo, lbinzhi; + + + // data from NStencil class + + const int nstencil; + const int sx1, sy1, sz1; + typename AT::t_int_1d d_stencil; // # of J neighs for each I + typename AT::t_int_1d_3 d_stencilxyz; + typename AT::t_int_1d d_nstencil_ssa; + + // data from Atom class + + const typename AT::t_x_array_randomread x; + const typename AT::t_int_1d_const type,mask; + const typename AT::t_tagint_1d_const molecule; + const typename AT::t_tagint_1d_const tag; + const typename AT::t_tagint_2d_const special; + const typename AT::t_int_2d_const nspecial; + const int molecular; + int moltemplate; + + int special_flag[4]; + + const int nbinx,nbiny,nbinz; + const int mbinx,mbiny,mbinz; + const int mbinxlo,mbinylo,mbinzlo; + const X_FLOAT bininvx,bininvy,bininvz; + X_FLOAT bboxhi[3],bboxlo[3]; + + const int nlocal; + + typename AT::t_int_scalar resize; + typename AT::t_int_scalar new_maxneighs; + typename ArrayTypes::t_int_scalar h_resize; + typename ArrayTypes::t_int_scalar h_new_maxneighs; + + const int xperiodic, yperiodic, zperiodic; + const int xprd_half, yprd_half, zprd_half; + + // SSA Work plan data structures + int ssa_phaseCt; + typename AT::t_int_1d d_ssa_phaseLen; + typename AT::t_int_1d_3_const d_ssa_phaseOff; + typename AT::t_int_2d d_ssa_itemLoc; + typename AT::t_int_2d d_ssa_itemLen; + int ssa_gphaseCt; + typename AT::t_int_1d d_ssa_gphaseLen; + typename AT::t_int_2d d_ssa_gitemLoc; + typename AT::t_int_2d d_ssa_gitemLen; + + NPairSSAKokkosExecute( + const NeighListKokkos &_neigh_list, + const typename AT::t_xfloat_2d_randomread &_cutneighsq, + const typename AT::t_int_1d &_bincount, + const typename AT::t_int_2d &_bins, + const typename AT::t_int_1d &_gbincount, + const typename AT::t_int_2d &_gbins, + const int _lbinxlo, const int _lbinxhi, + const int _lbinylo, const int _lbinyhi, + const int _lbinzlo, const int _lbinzhi, + const int _nstencil, const int _sx1, const int _sy1, const int _sz1, + const typename AT::t_int_1d &_d_stencil, + const typename AT::t_int_1d_3 &_d_stencilxyz, + const typename AT::t_int_1d &_d_nstencil_ssa, + const int _ssa_phaseCt, + const typename AT::t_int_1d &_d_ssa_phaseLen, + const typename AT::t_int_1d_3 &_d_ssa_phaseOff, + const typename AT::t_int_2d &_d_ssa_itemLoc, + const typename AT::t_int_2d &_d_ssa_itemLen, + const int _ssa_gphaseCt, + const typename AT::t_int_1d &_d_ssa_gphaseLen, + const typename AT::t_int_2d &_d_ssa_gitemLoc, + const typename AT::t_int_2d &_d_ssa_gitemLen, + const int _nlocal, + const typename AT::t_x_array_randomread &_x, + const typename AT::t_int_1d_const &_type, + const typename AT::t_int_1d_const &_mask, + const typename AT::t_tagint_1d_const &_molecule, + const typename AT::t_tagint_1d_const &_tag, + const typename AT::t_tagint_2d_const &_special, + const typename AT::t_int_2d_const &_nspecial, + const int &_molecular, + const int & _nbinx,const int & _nbiny,const int & _nbinz, + const int & _mbinx,const int & _mbiny,const int & _mbinz, + const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo, + const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz, + const int & _exclude,const int & _nex_type, + const typename AT::t_int_1d_const & _ex1_type, + const typename AT::t_int_1d_const & _ex2_type, + const typename AT::t_int_2d_const & _ex_type, + const int & _nex_group, + const typename AT::t_int_1d_const & _ex1_group, + const typename AT::t_int_1d_const & _ex2_group, + const typename AT::t_int_1d_const & _ex1_bit, + const typename AT::t_int_1d_const & _ex2_bit, + const int & _nex_mol, + const typename AT::t_int_1d_const & _ex_mol_group, + const typename AT::t_int_1d_const & _ex_mol_bit, + const typename AT::t_int_1d_const & _ex_mol_intra, + const X_FLOAT *_bboxhi, const X_FLOAT* _bboxlo, + const int & _xperiodic, const int & _yperiodic, const int & _zperiodic, + const int & _xprd_half, const int & _yprd_half, const int & _zprd_half): + neigh_list(_neigh_list), cutneighsq(_cutneighsq), + bincount(_bincount),c_bincount(_bincount),bins(_bins),c_bins(_bins), + gbincount(_gbincount),c_gbincount(_gbincount),gbins(_gbins),c_gbins(_gbins), + lbinxlo(_lbinxlo),lbinxhi(_lbinxhi), + lbinylo(_lbinylo),lbinyhi(_lbinyhi), + lbinzlo(_lbinzlo),lbinzhi(_lbinzhi), + nstencil(_nstencil),sx1(_sx1),sy1(_sy1),sz1(_sz1), + d_stencil(_d_stencil),d_stencilxyz(_d_stencilxyz),d_nstencil_ssa(_d_nstencil_ssa), + ssa_phaseCt(_ssa_phaseCt), + d_ssa_phaseLen(_d_ssa_phaseLen), + d_ssa_phaseOff(_d_ssa_phaseOff), + d_ssa_itemLoc(_d_ssa_itemLoc), + d_ssa_itemLen(_d_ssa_itemLen), + ssa_gphaseCt(_ssa_gphaseCt), + d_ssa_gphaseLen(_d_ssa_gphaseLen), + d_ssa_gitemLoc(_d_ssa_gitemLoc), + d_ssa_gitemLen(_d_ssa_gitemLen), + nlocal(_nlocal), + x(_x),type(_type),mask(_mask),molecule(_molecule), + tag(_tag),special(_special),nspecial(_nspecial),molecular(_molecular), + nbinx(_nbinx),nbiny(_nbiny),nbinz(_nbinz), + mbinx(_mbinx),mbiny(_mbiny),mbinz(_mbinz), + mbinxlo(_mbinxlo),mbinylo(_mbinylo),mbinzlo(_mbinzlo), + bininvx(_bininvx),bininvy(_bininvy),bininvz(_bininvz), + exclude(_exclude),nex_type(_nex_type), + ex1_type(_ex1_type),ex2_type(_ex2_type),ex_type(_ex_type), + nex_group(_nex_group), + ex1_group(_ex1_group),ex2_group(_ex2_group), + ex1_bit(_ex1_bit),ex2_bit(_ex2_bit),nex_mol(_nex_mol), + ex_mol_group(_ex_mol_group),ex_mol_bit(_ex_mol_bit), + ex_mol_intra(_ex_mol_intra), + xperiodic(_xperiodic),yperiodic(_yperiodic),zperiodic(_zperiodic), + xprd_half(_xprd_half),yprd_half(_yprd_half),zprd_half(_zprd_half) { + + if (molecular == 2) moltemplate = 1; + else moltemplate = 0; + + bboxlo[0] = _bboxlo[0]; bboxlo[1] = _bboxlo[1]; bboxlo[2] = _bboxlo[2]; + bboxhi[0] = _bboxhi[0]; bboxhi[1] = _bboxhi[1]; bboxhi[2] = _bboxhi[2]; + + resize = typename AT::t_int_scalar("NPairSSAKokkosExecute::resize"); +#ifndef KOKKOS_USE_CUDA_UVM + h_resize = Kokkos::create_mirror_view(resize); +#else + h_resize = resize; +#endif + h_resize() = 1; + new_maxneighs = typename AT:: + t_int_scalar("NPairSSAKokkosExecute::new_maxneighs"); +#ifndef KOKKOS_USE_CUDA_UVM + h_new_maxneighs = Kokkos::create_mirror_view(new_maxneighs); +#else + h_new_maxneighs = new_maxneighs; +#endif + h_new_maxneighs() = neigh_list.maxneighs; + }; + + ~NPairSSAKokkosExecute() {neigh_list.copymode = 1;}; + + KOKKOS_FUNCTION + void build_locals_onePhase(const bool firstTry, int me, int workPhase) const; + + KOKKOS_FUNCTION + void build_ghosts_onePhase(int workPhase) const; + + KOKKOS_INLINE_FUNCTION + int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const + { + int ix,iy,iz; + + if (x >= bboxhi[0]) + ix = static_cast ((x-bboxhi[0])*bininvx) + nbinx; + else if (x >= bboxlo[0]) { + ix = static_cast ((x-bboxlo[0])*bininvx); + ix = MIN(ix,nbinx-1); + } else + ix = static_cast ((x-bboxlo[0])*bininvx) - 1; + + if (y >= bboxhi[1]) + iy = static_cast ((y-bboxhi[1])*bininvy) + nbiny; + else if (y >= bboxlo[1]) { + iy = static_cast ((y-bboxlo[1])*bininvy); + iy = MIN(iy,nbiny-1); + } else + iy = static_cast ((y-bboxlo[1])*bininvy) - 1; + + if (z >= bboxhi[2]) + iz = static_cast ((z-bboxhi[2])*bininvz) + nbinz; + else if (z >= bboxlo[2]) { + iz = static_cast ((z-bboxlo[2])*bininvz); + iz = MIN(iz,nbinz-1); + } else + iz = static_cast ((z-bboxlo[2])*bininvz) - 1; + + i[0] = ix - mbinxlo; + i[1] = iy - mbinylo; + i[2] = iz - mbinzlo; + + return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo); + } + + KOKKOS_INLINE_FUNCTION + int exclusion(const int &i,const int &j, const int &itype,const int &jtype) const; + + KOKKOS_INLINE_FUNCTION + int find_special(const int &i, const int &j) const; + + KOKKOS_INLINE_FUNCTION + int minimum_image_check(double dx, double dy, double dz) const { + if (xperiodic && fabs(dx) > xprd_half) return 1; + if (yperiodic && fabs(dy) > yprd_half) return 1; + if (zperiodic && fabs(dz) > zprd_half) return 1; + return 0; + } + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp index 34fd427226..ba3eda64dd 100644 --- a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -65,8 +65,8 @@ PairBuckCoulCutKokkos::~PairBuckCoulCutKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_ljsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); @@ -98,13 +98,13 @@ void PairBuckCoulCutKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -252,16 +252,16 @@ void PairBuckCoulCutKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); memory->destroy(cut_coulsq); - memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairBuckCoulCut::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp index 243bac5ab7..19af349a63 100644 --- a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -73,8 +73,8 @@ template PairBuckCoulLongKokkos::~PairBuckCoulLongKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_ljsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); @@ -117,13 +117,13 @@ void PairBuckCoulLongKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -308,18 +308,18 @@ void PairBuckCoulLongKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairBuckCoulLong::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_buck_kokkos.cpp b/src/KOKKOS/pair_buck_kokkos.cpp index d8534f7900..fcf14533dc 100644 --- a/src/KOKKOS/pair_buck_kokkos.cpp +++ b/src/KOKKOS/pair_buck_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -61,8 +61,8 @@ template PairBuckKokkos::~PairBuckKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); memory->sfree(cutsq); eatom = NULL; @@ -87,13 +87,13 @@ void PairBuckKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -194,10 +194,10 @@ void PairBuckKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairBuck::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_coul_cut_kokkos.cpp b/src/KOKKOS/pair_coul_cut_kokkos.cpp index 80ab01d91a..e20e243c09 100644 --- a/src/KOKKOS/pair_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_coul_cut_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -55,7 +55,7 @@ template PairCoulCutKokkos::~PairCoulCutKokkos() { if (allocated) - memory->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); } /* ---------------------------------------------------------------------- */ @@ -86,13 +86,13 @@ void PairCoulCutKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -190,7 +190,7 @@ void PairCoulCutKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_cut_ljsq = typename ArrayTypes::tdual_ffloat_2d("pair:cut_ljsq",n+1,n+1); @@ -199,7 +199,7 @@ void PairCoulCutKokkos::allocate() d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairCoulCut::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_coul_debye_kokkos.cpp b/src/KOKKOS/pair_coul_debye_kokkos.cpp index 0771572e46..4cac18cacf 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -62,7 +62,7 @@ template PairCoulDebyeKokkos::~PairCoulDebyeKokkos() { if (!copymode) { - memory->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); } } @@ -93,13 +93,13 @@ void PairCoulDebyeKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -218,10 +218,10 @@ void PairCoulDebyeKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairCoulDebye::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_coul_dsf_kokkos.cpp index e6f5407f2d..f77e63bbf0 100644 --- a/src/KOKKOS/pair_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_dsf_kokkos.cpp @@ -27,7 +27,7 @@ #include "neighbor.h" #include "neigh_list_kokkos.h" #include "neigh_request.h" -#include "memory.h" +#include "memory_kokkos.h" #include "update.h" #include "integrate.h" #include "respa.h" @@ -65,8 +65,8 @@ template PairCoulDSFKokkos::~PairCoulDSFKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -86,13 +86,13 @@ void PairCoulDSFKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } diff --git a/src/KOKKOS/pair_coul_long_kokkos.cpp b/src/KOKKOS/pair_coul_long_kokkos.cpp index 7dbadf4834..f2ade3f367 100644 --- a/src/KOKKOS/pair_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_coul_long_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -72,8 +72,8 @@ template PairCoulLongKokkos::~PairCoulLongKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); memory->sfree(cutsq); @@ -110,13 +110,13 @@ void PairCoulLongKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -272,14 +272,14 @@ void PairCoulLongKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairCoulLong::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.cpp b/src/KOKKOS/pair_coul_wolf_kokkos.cpp index 75177e2d81..0f3e9b9429 100644 --- a/src/KOKKOS/pair_coul_wolf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_wolf_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -60,8 +60,8 @@ template PairCoulWolfKokkos::~PairCoulWolfKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -81,13 +81,13 @@ void PairCoulWolfKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp new file mode 100644 index 0000000000..7d71719e0a --- /dev/null +++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp @@ -0,0 +1,797 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (Sandia) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "atom_kokkos.h" +#include "atom_vec.h" +#include "comm.h" +#include "update.h" +#include "fix.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory_kokkos.h" +#include "modify.h" +#include "pair_dpd_fdt_energy_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "kokkos.h" + +using namespace LAMMPS_NS; + +#define EPSILON 1.0e-10 + +/* ---------------------------------------------------------------------- */ + +template +PairDPDfdtEnergyKokkos::PairDPDfdtEnergyKokkos(LAMMPS *lmp) : + PairDPDfdtEnergy(lmp), +#ifdef DPD_USE_RAN_MARS + rand_pool(0 /* unused */, lmp) +#else + rand_pool() +#endif +{ + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +PairDPDfdtEnergyKokkos::~PairDPDfdtEnergyKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + + if (allocated) { + memoryKK->destroy_kokkos(k_duCond,duCond); + memoryKK->destroy_kokkos(k_duMech,duMech); + } + + memoryKK->destroy_kokkos(k_cutsq,cutsq); + +#ifdef DPD_USE_RAN_MARS + rand_pool.destroy(); +#endif +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairDPDfdtEnergyKokkos::init_style() +{ + PairDPDfdtEnergy::init_style(); + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with dpd/fdt/energy/kk"); + } + +#ifdef DPD_USE_RAN_MARS + rand_pool.init(random,seed); +#else + rand_pool.init(seed + comm->me,DeviceType::max_hardware_threads()); +#endif +} + +#if defined(KOKKOS_ENABLE_CUDA) && defined(__CUDACC__) +// CUDA specialization of init_style to properly call rand_pool.init() +template<> +void PairDPDfdtEnergyKokkos::init_style() +{ + PairDPDfdtEnergy::init_style(); + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with dpd/fdt/energy/kk"); + } + +#ifdef DPD_USE_RAN_MARS + rand_pool.init(random,seed); +#else + rand_pool.init(seed + comm->me,4*32768 /*fake max_hardware_threads()*/); +#endif +} +#endif + +/* ---------------------------------------------------------------------- */ + +template +void PairDPDfdtEnergyKokkos::compute(int eflag_in, int vflag_in) +{ + copymode = 1; + + eflag = eflag_in; + vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.template view(); + } + + x = atomKK->k_x.view(); + v = atomKK->k_v.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + mass = atomKK->k_mass.view(); + rmass = atomKK->rmass; + dpdTheta = atomKK->k_dpdTheta.view(); + + k_cutsq.template sync(); + k_params.template sync(); + atomKK->sync(execution_space,X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK); + if (evflag) atomKK->modified(execution_space,F_MASK | ENERGY_MASK | VIRIAL_MASK); + else atomKK->modified(execution_space,F_MASK); + + special_lj[0] = force->special_lj[0]; + special_lj[1] = force->special_lj[1]; + special_lj[2] = force->special_lj[2]; + special_lj[3] = force->special_lj[3]; + + nlocal = atom->nlocal; + int nghost = atom->nghost; + int newton_pair = force->newton_pair; + dtinvsqrt = 1.0/sqrt(update->dt); + + int inum = list->inum; + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + + boltz = force->boltz; + ftm2v = force->ftm2v; + + // loop over neighbors of my atoms + + EV_FLOAT ev; + + if (splitFDT_flag) { + if (!a0_is_zero) { + if(atom->ntypes > MAX_TYPES_STACKPARAMS) { + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + } else { + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + } + } + } else { + + // Allocate memory for duCond and duMech + if (allocated) { + memoryKK->destroy_kokkos(k_duCond,duCond); + memoryKK->destroy_kokkos(k_duMech,duMech); + } + memoryKK->create_kokkos(k_duCond,duCond,nlocal+nghost,"pair:duCond"); + memoryKK->create_kokkos(k_duMech,duMech,nlocal+nghost,"pair:duMech"); + d_duCond = k_duCond.view(); + d_duMech = k_duMech.view(); + h_duCond = k_duCond.h_view; + h_duMech = k_duMech.h_view; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal+nghost),*this); + + atomKK->sync(execution_space,V_MASK | DPDTHETA_MASK | RMASS_MASK); + atomKK->k_mass.sync(); + + // loop over neighbors of my atoms + + if(atom->ntypes > MAX_TYPES_STACKPARAMS) { + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + } else { + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + } + + // Communicate the ghost delta energies to the locally owned atoms + + // this memory transfer can be removed when fix_dpd_fdt_energy_kokkos is added + k_duCond.template modify(); + k_duCond.template sync(); + k_duMech.template modify(); + k_duMech.template sync(); + comm->reverse_comm_pair(this); + } + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } + + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void PairDPDfdtEnergyKokkos::operator()(TagPairDPDfdtEnergyZero, const int &ii) const { + d_duCond[ii] = 0.0; + d_duMech[ii] = 0.0; +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairDPDfdtEnergyKokkos::operator()(TagPairDPDfdtEnergyComputeSplit, const int &ii, EV_FLOAT& ev) const { + + // The f array is atomic for Half/Thread neighbor style + Kokkos::View::value> > a_f = f; + + int i,j,jj,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,r,rinv,wd,wr,factor_dpd; + + i = d_ilist[ii]; + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + itype = type[i]; + jnum = d_numneigh[i]; + + double fx_i = 0.0; + double fy_i = 0.0; + double fz_i = 0.0; + + for (jj = 0; jj < jnum; jj++) { + j = d_neighbors(i,jj); + factor_dpd = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x(j,0); + dely = ytmp - x(j,1); + delz = ztmp - x(j,2); + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + double cutsq_ij = STACKPARAMS?m_cutsq[itype][jtype]:d_cutsq(itype,jtype); + if (rsq < cutsq_ij) { + r = sqrt(rsq); + if (r < EPSILON) continue; // r can be 0.0 in DPD systems + rinv = 1.0/r; + double cut_ij = STACKPARAMS?m_params[itype][jtype].cut:params(itype,jtype).cut; + wr = 1.0 - r/cut_ij; + wd = wr*wr; + + // conservative force = a0 * wr + double a0_ij = STACKPARAMS?m_params[itype][jtype].a0:params(itype,jtype).a0; + fpair = a0_ij*wr; + fpair *= factor_dpd*rinv; + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + a_f(j,0) -= delx*fpair; + a_f(j,1) -= dely*fpair; + a_f(j,2) -= delz*fpair; + } + + if (eflag) { + // unshifted eng of conservative term: + // evdwl = -a0[itype][jtype]*r * (1.0-0.5*r/d_cut(itype,jtype)); + // eng shifted to 0.0 at cutoff + evdwl = 0.5*a0_ij*cut_ij * wd; + evdwl *= factor_dpd; + if (EVFLAG) + ev.evdwl += (((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR||(jtemplate ev_tally(ev,i,j,evdwl,fpair,delx,dely,delz); + } + } + + a_f(i,0) += fx_i; + a_f(i,1) += fy_i; + a_f(i,2) += fz_i; +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairDPDfdtEnergyKokkos::operator()(TagPairDPDfdtEnergyComputeSplit, const int &ii) const { + EV_FLOAT ev; + this->template operator()(TagPairDPDfdtEnergyComputeSplit(), ii, ev); +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairDPDfdtEnergyKokkos::operator()(TagPairDPDfdtEnergyComputeNoSplit, const int &ii, EV_FLOAT& ev) const { + + // These array are atomic for Half/Thread neighbor style + Kokkos::View::value> > a_f = f; + Kokkos::View::value> > a_duCond = d_duCond; + Kokkos::View::value> > a_duMech = d_duMech; + + int i,j,jj,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double vxtmp,vytmp,vztmp,delvx,delvy,delvz; + double rsq,r,rinv,wd,wr,factor_dpd,uTmp; + double dot,randnum; + + double kappa_ij, alpha_ij, theta_ij, gamma_ij; + double mass_i, mass_j; + double massinv_i, massinv_j; + double randPair, mu_ij; + + rand_type rand_gen = rand_pool.get_state(); + + i = d_ilist[ii]; + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + vxtmp = v(i,0); + vytmp = v(i,1); + vztmp = v(i,2); + itype = type[i]; + jnum = d_numneigh[i]; + + double fx_i = 0.0; + double fy_i = 0.0; + double fz_i = 0.0; + + for (jj = 0; jj < jnum; jj++) { + j = d_neighbors(i,jj); + factor_dpd = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x(j,0); + dely = ytmp - x(j,1); + delz = ztmp - x(j,2); + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + double cutsq_ij = STACKPARAMS?m_cutsq[itype][jtype]:d_cutsq(itype,jtype); + if (rsq < cutsq_ij) { + r = sqrt(rsq); + if (r < EPSILON) continue; // r can be 0.0 in DPD systems + rinv = 1.0/r; + double cut_ij = STACKPARAMS?m_params[itype][jtype].cut:params(itype,jtype).cut; + wr = 1.0 - r/cut_ij; + wd = wr*wr; + + delvx = vxtmp - v(j,0); + delvy = vytmp - v(j,1); + delvz = vztmp - v(j,2); + dot = delx*delvx + dely*delvy + delz*delvz; + randnum = rand_gen.normal(); + + // Compute the current temperature + theta_ij = 0.5*(1.0/dpdTheta[i] + 1.0/dpdTheta[j]); + theta_ij = 1.0/theta_ij; + + double sigma_ij = STACKPARAMS?m_params[itype][jtype].sigma:params(itype,jtype).sigma; + gamma_ij = sigma_ij*sigma_ij + / (2.0*boltz*theta_ij); + + // conservative force = a0 * wr + // drag force = -gamma * wr^2 * (delx dot delv) / r + // random force = sigma * wr * rnd * dtinvsqrt; + + double a0_ij = STACKPARAMS?m_params[itype][jtype].a0:params(itype,jtype).a0; + fpair = a0_ij*wr; + fpair -= gamma_ij*wd*dot*rinv; + fpair += sigma_ij*wr*randnum*dtinvsqrt; + fpair *= factor_dpd*rinv; + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + a_f(j,0) -= delx*fpair; + a_f(j,1) -= dely*fpair; + a_f(j,2) -= delz*fpair; + } + + if (rmass) { + mass_i = rmass[i]; + mass_j = rmass[j]; + } else { + mass_i = mass[itype]; + mass_j = mass[jtype]; + } + massinv_i = 1.0 / mass_i; + massinv_j = 1.0 / mass_j; + + // Compute the mechanical and conductive energy, uMech and uCond + mu_ij = massinv_i + massinv_j; + mu_ij *= ftm2v; + + uTmp = gamma_ij*wd*rinv*rinv*dot*dot + - 0.5*sigma_ij*sigma_ij*mu_ij*wd; + uTmp -= sigma_ij*wr*rinv*dot*randnum*dtinvsqrt; + uTmp *= 0.5; + + a_duMech[i] += uTmp; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + a_duMech[j] += uTmp; + } + + // Compute uCond + randnum = rand_gen.normal(); + kappa_ij = STACKPARAMS?m_params[itype][jtype].kappa:params(itype,jtype).kappa; + alpha_ij = sqrt(2.0*boltz*kappa_ij); + randPair = alpha_ij*wr*randnum*dtinvsqrt; + + uTmp = kappa_ij*(1.0/dpdTheta[i] - 1.0/dpdTheta[j])*wd; + uTmp += randPair; + + a_duCond[i] += uTmp; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + a_duCond[j] -= uTmp; + } + + if (eflag) { + // unshifted eng of conservative term: + // evdwl = -a0[itype][jtype]*r * (1.0-0.5*r/d_cut(itype,jtype)); + // eng shifted to 0.0 at cutoff + evdwl = 0.5*a0_ij*cut_ij * wd; + evdwl *= factor_dpd; + if (EVFLAG) + ev.evdwl += (((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR||(jtemplate ev_tally(ev,i,j,evdwl,fpair,delx,dely,delz); + } + } + + a_f(i,0) += fx_i; + a_f(i,1) += fy_i; + a_f(i,2) += fz_i; + + rand_pool.free_state(rand_gen); +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairDPDfdtEnergyKokkos::operator()(TagPairDPDfdtEnergyComputeNoSplit, const int &ii) const { + EV_FLOAT ev; + this->template operator()(TagPairDPDfdtEnergyComputeNoSplit(), ii, ev); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairDPDfdtEnergyKokkos::allocate() +{ + PairDPDfdtEnergy::allocate(); + + int n = atom->ntypes; + int nlocal = atom->nlocal; + int nghost = atom->nghost; + + memory->destroy(cutsq); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + + k_params = Kokkos::DualView("PairDPDfdtEnergy::params",n+1,n+1); + params = k_params.template view(); + + if (!splitFDT_flag) { + memory->destroy(duCond); + memory->destroy(duMech); + memoryKK->create_kokkos(k_duCond,duCond,nlocal+nghost+1,"pair:duCond"); + memoryKK->create_kokkos(k_duMech,duMech,nlocal+nghost+1,"pair:duMech"); + d_duCond = k_duCond.view(); + d_duMech = k_duMech.view(); + h_duCond = k_duCond.h_view; + h_duMech = k_duMech.h_view; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +template +double PairDPDfdtEnergyKokkos::init_one(int i, int j) +{ + double cutone = PairDPDfdtEnergy::init_one(i,j); + + k_params.h_view(i,j).cut = cut[i][j]; + k_params.h_view(i,j).a0 = a0[i][j]; + k_params.h_view(i,j).sigma = sigma[i][j]; + k_params.h_view(i,j).kappa = kappa[i][j]; + k_params.h_view(j,i) = k_params.h_view(i,j); + if(i(); + k_params.template modify(); + + return cutone; +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairDPDfdtEnergyKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, + const F_FLOAT &dely, const F_FLOAT &delz) const +{ + const int EFLAG = eflag; + const int VFLAG = vflag_either; + + // The eatom and vatom arrays are atomic for Half/Thread neighbor style + Kokkos::View::value> > v_eatom = k_eatom.view(); + Kokkos::View::value> > v_vatom = k_vatom.view(); + + if (EFLAG) { + if (eflag_atom) { + const E_FLOAT epairhalf = 0.5 * epair; + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) v_eatom[i] += epairhalf; + if (NEWTON_PAIR || j < nlocal) v_eatom[j] += epairhalf; + } else { + v_eatom[i] += epairhalf; + } + } + } + + if (VFLAG) { + const E_FLOAT v0 = delx*delx*fpair; + const E_FLOAT v1 = dely*dely*fpair; + const E_FLOAT v2 = delz*delz*fpair; + const E_FLOAT v3 = delx*dely*fpair; + const E_FLOAT v4 = delx*delz*fpair; + const E_FLOAT v5 = dely*delz*fpair; + + if (vflag_global) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } else { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } + + if (vflag_atom) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + v_vatom(j,0) += 0.5*v0; + v_vatom(j,1) += 0.5*v1; + v_vatom(j,2) += 0.5*v2; + v_vatom(j,3) += 0.5*v3; + v_vatom(j,4) += 0.5*v4; + v_vatom(j,5) += 0.5*v5; + } + } else { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +int PairDPDfdtEnergyKokkos::sbmask(const int& j) const { + return j >> SBBITS & 3; +} + +namespace LAMMPS_NS { +template class PairDPDfdtEnergyKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairDPDfdtEnergyKokkos; +#endif +} diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h new file mode 100644 index 0000000000..424779f839 --- /dev/null +++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h @@ -0,0 +1,182 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(dpd/fdt/energy/kk,PairDPDfdtEnergyKokkos) +PairStyle(dpd/fdt/energy/kk/device,PairDPDfdtEnergyKokkos) +PairStyle(dpd/fdt/energy/kk/host,PairDPDfdtEnergyKokkos) + +#else + +#ifndef LMP_PAIR_DPD_FDT_ENERGY_KOKKOS_H +#define LMP_PAIR_DPD_FDT_ENERGY_KOKKOS_H + +#if !defined(DPD_USE_RAN_MARS) && !defined(DPD_USE_Random_XorShift64) && !defined(Random_XorShift1024) +#define DPD_USE_Random_XorShift64 +#endif + +#include "pair_dpd_fdt_energy.h" +#include "pair_kokkos.h" +#include "kokkos_type.h" +#ifdef DPD_USE_RAN_MARS +#include "rand_pool_wrap_kokkos.h" +#else +#include "Kokkos_Random.hpp" +#endif + +namespace LAMMPS_NS { + +struct TagPairDPDfdtEnergyZero{}; + +template +struct TagPairDPDfdtEnergyComputeSplit{}; + +template +struct TagPairDPDfdtEnergyComputeNoSplit{}; + +template +class PairDPDfdtEnergyKokkos : public PairDPDfdtEnergy { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef EV_FLOAT value_type; + + PairDPDfdtEnergyKokkos(class LAMMPS *); + virtual ~PairDPDfdtEnergyKokkos(); + virtual void compute(int, int); + void init_style(); + double init_one(int, int); + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairDPDfdtEnergyZero, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairDPDfdtEnergyComputeSplit, const int&, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairDPDfdtEnergyComputeSplit, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairDPDfdtEnergyComputeNoSplit, const int&, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairDPDfdtEnergyComputeNoSplit, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void ev_tally(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, + const F_FLOAT &dely, const F_FLOAT &delz) const; + + KOKKOS_INLINE_FUNCTION + int sbmask(const int& j) const; + + struct params_dpd { + KOKKOS_INLINE_FUNCTION + params_dpd(){cut=0;a0=0;sigma=0;kappa=0;}; + KOKKOS_INLINE_FUNCTION + params_dpd(int i){cut=0;a0=0;sigma=0;kappa=0;}; + F_FLOAT cut,a0,sigma,kappa; + }; + + DAT::tdual_efloat_1d k_duCond,k_duMech; + +#ifdef DPD_USE_RAN_MARS + RandPoolWrap rand_pool; + typedef RandWrap rand_type; +#elif defined(DPD_USE_Random_XorShift64) + Kokkos::Random_XorShift64_Pool rand_pool; + typedef typename Kokkos::Random_XorShift64_Pool::generator_type rand_type; +#elif defined(DPD_USE_Random_XorShift1024) + Kokkos::Random_XorShift1024_Pool rand_pool; + typedef typename Kokkos::Random_XorShift1024_Pool::generator_type rand_type; +#endif + + typename ArrayTypes::tdual_ffloat_2d k_cutsq; + typename ArrayTypes::t_ffloat_2d d_cutsq; + + protected: + int eflag,vflag; + int nlocal,neighflag; + double dtinvsqrt; + double boltz,ftm2v; + double special_lj[4]; + + virtual void allocate(); + + Kokkos::DualView k_params; + typename Kokkos::DualView::t_dev_const_um params; + // hardwired to space for MAX_TYPES_STACKPARAMS (12) atom types + params_dpd m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + typename ArrayTypes::t_x_array_randomread x; + typename ArrayTypes::t_x_array c_x; + typename ArrayTypes::t_v_array_randomread v; + typename ArrayTypes::t_f_array f; + typename ArrayTypes::t_int_1d_randomread type; + typename ArrayTypes::t_float_1d_randomread mass; + double *rmass; + typename AT::t_efloat_1d dpdTheta; + typename AT::t_efloat_1d d_duCond,d_duMech; + HAT::t_efloat_1d h_duCond,h_duMech; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d_randomread d_ilist; + typename AT::t_int_1d_randomread d_numneigh; + + friend void pair_virial_fdotr_compute(PairDPDfdtEnergyKokkos*); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dpd/fdt/energy requires ghost atoms store velocity + +Use the communicate vel yes command to enable this. + +E: Pair dpd/fdt/energy requires newton pair on + +Self-explanatory. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +*/ diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index f8b7a69d60..f263cbb6d9 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -28,7 +28,7 @@ #include "neighbor.h" #include "neigh_list_kokkos.h" #include "neigh_request.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -59,8 +59,8 @@ template PairEAMAlloyKokkos::~PairEAMAlloyKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -80,13 +80,13 @@ void PairEAMAlloyKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -101,8 +101,8 @@ void PairEAMAlloyKokkos::compute(int eflag_in, int vflag_in) nmax = atom->nmax; k_rho = DAT::tdual_ffloat_1d("pair:rho",nmax); k_fp = DAT::tdual_ffloat_1d("pair:fp",nmax); - d_rho = k_rho.d_view; - d_fp = k_fp.d_view; + d_rho = k_rho.template view(); + d_fp = k_fp.template view(); h_rho = k_rho.h_view; h_fp = k_fp.h_view; } @@ -322,9 +322,9 @@ void PairEAMAlloyKokkos::file2array() k_type2z2r.template modify(); k_type2z2r.template sync(); - d_type2frho = k_type2frho.d_view; - d_type2rhor = k_type2rhor.d_view; - d_type2z2r = k_type2z2r.d_view; + d_type2frho = k_type2frho.template view(); + d_type2rhor = k_type2rhor.template view(); + d_type2z2r = k_type2z2r.template view(); } /* ---------------------------------------------------------------------- */ @@ -358,9 +358,9 @@ void PairEAMAlloyKokkos::array2spline() k_z2r_spline.template modify(); k_z2r_spline.template sync(); - d_frho_spline = k_frho_spline.d_view; - d_rhor_spline = k_rhor_spline.d_view; - d_z2r_spline = k_z2r_spline.d_view; + d_frho_spline = k_frho_spline.template view(); + d_rhor_spline = k_rhor_spline.template view(); + d_z2r_spline = k_z2r_spline.template view(); } /* ---------------------------------------------------------------------- */ @@ -405,7 +405,7 @@ int PairEAMAlloyKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_i d_sendlist = k_sendlist.view(); iswap = iswap_in; v_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); return n; } @@ -423,7 +423,7 @@ void PairEAMAlloyKokkos::unpack_forward_comm_kokkos(int n, int first { first = first_in; v_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); } template diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.h b/src/KOKKOS/pair_eam_alloy_kokkos.h index d8c745b230..a962f55908 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.h +++ b/src/KOKKOS/pair_eam_alloy_kokkos.h @@ -24,6 +24,7 @@ PairStyle(eam/alloy/kk/host,PairEAMAlloyKokkos) #define LMP_PAIR_EAM_ALLOY_KOKKOS_H #include +#include "kokkos_base.h" #include "pair_kokkos.h" #include "pair_eam.h" #include "neigh_list_kokkos.h" @@ -49,7 +50,7 @@ struct TagPairEAMAlloyKernelC{}; // Cannot use virtual inheritance on the GPU template -class PairEAMAlloyKokkos : public PairEAM { +class PairEAMAlloyKokkos : public PairEAM, public KokkosBase { public: enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; enum {COUL_FLAG=0}; @@ -59,7 +60,7 @@ class PairEAMAlloyKokkos : public PairEAM { PairEAMAlloyKokkos(class LAMMPS *); virtual ~PairEAMAlloyKokkos(); - virtual void compute(int, int); + void compute(int, int); void init_style(); void *extract(const char *, int &) { return NULL; } void coeff(int, char **); @@ -107,11 +108,11 @@ class PairEAMAlloyKokkos : public PairEAM { const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const; - virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, - int, int *); - virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); - virtual int pack_forward_comm(int, int *, double *, int, int *); - virtual void unpack_forward_comm(int, int, double *); + int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, + int, int *); + void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); int pack_reverse_comm(int, int, double *); void unpack_reverse_comm(int, int *, double *); @@ -130,15 +131,15 @@ class PairEAMAlloyKokkos : public PairEAM { DAT::tdual_ffloat_1d k_rho; DAT::tdual_ffloat_1d k_fp; - DAT::t_ffloat_1d d_rho; + typename AT::t_ffloat_1d d_rho; typename AT::t_ffloat_1d v_rho; - DAT::t_ffloat_1d d_fp; + typename AT::t_ffloat_1d d_fp; HAT::t_ffloat_1d h_rho; HAT::t_ffloat_1d h_fp; - DAT::t_int_1d_randomread d_type2frho; - DAT::t_int_2d_randomread d_type2rhor; - DAT::t_int_2d_randomread d_type2z2r; + typename AT::t_int_1d_randomread d_type2frho; + typename AT::t_int_2d_randomread d_type2rhor; + typename AT::t_int_2d_randomread d_type2z2r; typedef Kokkos::DualView tdual_ffloat_2d_n7; typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread; @@ -148,7 +149,7 @@ class PairEAMAlloyKokkos : public PairEAM { t_ffloat_2d_n7_randomread d_rhor_spline; t_ffloat_2d_n7_randomread d_z2r_spline; - virtual void file2array(); + void file2array(); void file2array_alloy(); void array2spline(); void interpolate(int, double, double *, t_host_ffloat_2d_n7, int); diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index 57820afb26..05ec1a644b 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -28,7 +28,7 @@ #include "neighbor.h" #include "neigh_list_kokkos.h" #include "neigh_request.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -59,8 +59,8 @@ template PairEAMFSKokkos::~PairEAMFSKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -80,13 +80,13 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -101,8 +101,8 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) nmax = atom->nmax; k_rho = DAT::tdual_ffloat_1d("pair:rho",nmax); k_fp = DAT::tdual_ffloat_1d("pair:fp",nmax); - d_rho = k_rho.d_view; - d_fp = k_fp.d_view; + d_rho = k_rho.template view(); + d_fp = k_fp.template view(); h_rho = k_rho.h_view; h_fp = k_fp.h_view; } @@ -322,9 +322,9 @@ void PairEAMFSKokkos::file2array() k_type2z2r.template modify(); k_type2z2r.template sync(); - d_type2frho = k_type2frho.d_view; - d_type2rhor = k_type2rhor.d_view; - d_type2z2r = k_type2z2r.d_view; + d_type2frho = k_type2frho.template view(); + d_type2rhor = k_type2rhor.template view(); + d_type2z2r = k_type2z2r.template view(); } /* ---------------------------------------------------------------------- */ @@ -358,9 +358,9 @@ void PairEAMFSKokkos::array2spline() k_z2r_spline.template modify(); k_z2r_spline.template sync(); - d_frho_spline = k_frho_spline.d_view; - d_rhor_spline = k_rhor_spline.d_view; - d_z2r_spline = k_z2r_spline.d_view; + d_frho_spline = k_frho_spline.template view(); + d_rhor_spline = k_rhor_spline.template view(); + d_z2r_spline = k_z2r_spline.template view(); } /* ---------------------------------------------------------------------- */ @@ -405,7 +405,7 @@ int PairEAMFSKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_int_ d_sendlist = k_sendlist.view(); iswap = iswap_in; v_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); return n; } @@ -423,7 +423,7 @@ void PairEAMFSKokkos::unpack_forward_comm_kokkos(int n, int first_in { first = first_in; v_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); } template diff --git a/src/KOKKOS/pair_eam_fs_kokkos.h b/src/KOKKOS/pair_eam_fs_kokkos.h index 40375af066..ec87e44ece 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.h +++ b/src/KOKKOS/pair_eam_fs_kokkos.h @@ -24,6 +24,7 @@ PairStyle(eam/fs/kk/host,PairEAMFSKokkos) #define LMP_PAIR_EAM_FS_KOKKOS_H #include +#include "kokkos_base.h" #include "pair_kokkos.h" #include "pair_eam.h" #include "neigh_list_kokkos.h" @@ -49,7 +50,7 @@ struct TagPairEAMFSKernelC{}; // Cannot use virtual inheritance on the GPU template -class PairEAMFSKokkos : public PairEAM { +class PairEAMFSKokkos : public PairEAM, public KokkosBase { public: enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; enum {COUL_FLAG=0}; @@ -59,7 +60,7 @@ class PairEAMFSKokkos : public PairEAM { PairEAMFSKokkos(class LAMMPS *); virtual ~PairEAMFSKokkos(); - virtual void compute(int, int); + void compute(int, int); void init_style(); void *extract(const char *, int &) { return NULL; } void coeff(int, char **); @@ -107,11 +108,11 @@ class PairEAMFSKokkos : public PairEAM { const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const; - virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, - int, int *); - virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); - virtual int pack_forward_comm(int, int *, double *, int, int *); - virtual void unpack_forward_comm(int, int, double *); + int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, + int, int *); + void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); int pack_reverse_comm(int, int, double *); void unpack_reverse_comm(int, int *, double *); @@ -130,15 +131,15 @@ class PairEAMFSKokkos : public PairEAM { DAT::tdual_ffloat_1d k_rho; DAT::tdual_ffloat_1d k_fp; - DAT::t_ffloat_1d d_rho; + typename AT::t_ffloat_1d d_rho; typename AT::t_ffloat_1d v_rho; - DAT::t_ffloat_1d d_fp; + typename AT::t_ffloat_1d d_fp; HAT::t_ffloat_1d h_rho; HAT::t_ffloat_1d h_fp; - DAT::t_int_1d_randomread d_type2frho; - DAT::t_int_2d_randomread d_type2rhor; - DAT::t_int_2d_randomread d_type2z2r; + typename AT::t_int_1d_randomread d_type2frho; + typename AT::t_int_2d_randomread d_type2rhor; + typename AT::t_int_2d_randomread d_type2z2r; typedef Kokkos::DualView tdual_ffloat_2d_n7; typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread; @@ -148,7 +149,7 @@ class PairEAMFSKokkos : public PairEAM { t_ffloat_2d_n7_randomread d_rhor_spline; t_ffloat_2d_n7_randomread d_z2r_spline; - virtual void file2array(); + void file2array(); void file2array_fs(); void array2spline(); void interpolate(int, double, double *, t_host_ffloat_2d_n7, int); diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index e848669947..0aa43b26b2 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -28,7 +28,7 @@ #include "neighbor.h" #include "neigh_list_kokkos.h" #include "neigh_request.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -54,8 +54,8 @@ template PairEAMKokkos::~PairEAMKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -75,13 +75,13 @@ void PairEAMKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -96,8 +96,8 @@ void PairEAMKokkos::compute(int eflag_in, int vflag_in) nmax = atom->nmax; k_rho = DAT::tdual_ffloat_1d("pair:rho",nmax); k_fp = DAT::tdual_ffloat_1d("pair:fp",nmax); - d_rho = k_rho.d_view; - d_fp = k_fp.d_view; + d_rho = k_rho.template view(); + d_fp = k_fp.template view(); h_rho = k_rho.h_view; h_fp = k_fp.h_view; } @@ -322,9 +322,9 @@ void PairEAMKokkos::file2array() k_type2z2r.template modify(); k_type2z2r.template sync(); - d_type2frho = k_type2frho.d_view; - d_type2rhor = k_type2rhor.d_view; - d_type2z2r = k_type2z2r.d_view; + d_type2frho = k_type2frho.template view(); + d_type2rhor = k_type2rhor.template view(); + d_type2z2r = k_type2z2r.template view(); } /* ---------------------------------------------------------------------- */ @@ -358,9 +358,9 @@ void PairEAMKokkos::array2spline() k_z2r_spline.template modify(); k_z2r_spline.template sync(); - d_frho_spline = k_frho_spline.d_view; - d_rhor_spline = k_rhor_spline.d_view; - d_z2r_spline = k_z2r_spline.d_view; + d_frho_spline = k_frho_spline.template view(); + d_rhor_spline = k_rhor_spline.template view(); + d_z2r_spline = k_z2r_spline.template view(); } /* ---------------------------------------------------------------------- */ @@ -405,7 +405,7 @@ int PairEAMKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_int_2d d_sendlist = k_sendlist.view(); iswap = iswap_in; v_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); return n; } @@ -423,7 +423,7 @@ void PairEAMKokkos::unpack_forward_comm_kokkos(int n, int first_in, { first = first_in; v_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); } template diff --git a/src/KOKKOS/pair_eam_kokkos.h b/src/KOKKOS/pair_eam_kokkos.h index 229b16471d..34a4795ec5 100644 --- a/src/KOKKOS/pair_eam_kokkos.h +++ b/src/KOKKOS/pair_eam_kokkos.h @@ -24,6 +24,7 @@ PairStyle(eam/kk/host,PairEAMKokkos) #define LMP_PAIR_EAM_KOKKOS_H #include +#include "kokkos_base.h" #include "pair_kokkos.h" #include "pair_eam.h" #include "neigh_list_kokkos.h" @@ -47,7 +48,7 @@ template struct TagPairEAMKernelC{}; template -class PairEAMKokkos : public PairEAM { +class PairEAMKokkos : public PairEAM, public KokkosBase { public: enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; enum {COUL_FLAG=0}; @@ -57,7 +58,7 @@ class PairEAMKokkos : public PairEAM { PairEAMKokkos(class LAMMPS *); virtual ~PairEAMKokkos(); - virtual void compute(int, int); + void compute(int, int); void init_style(); void *extract(const char *, int &) { return NULL; } @@ -104,11 +105,11 @@ class PairEAMKokkos : public PairEAM { const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const; - virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, - int, int *); - virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); - virtual int pack_forward_comm(int, int *, double *, int, int *); - virtual void unpack_forward_comm(int, int, double *); + int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, + int, int *); + void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); int pack_reverse_comm(int, int, double *); void unpack_reverse_comm(int, int *, double *); @@ -127,15 +128,15 @@ class PairEAMKokkos : public PairEAM { DAT::tdual_ffloat_1d k_rho; DAT::tdual_ffloat_1d k_fp; - DAT::t_ffloat_1d d_rho; + typename AT::t_ffloat_1d d_rho; typename AT::t_ffloat_1d v_rho; - DAT::t_ffloat_1d d_fp; + typename AT::t_ffloat_1d d_fp; HAT::t_ffloat_1d h_rho; HAT::t_ffloat_1d h_fp; - DAT::t_int_1d_randomread d_type2frho; - DAT::t_int_2d_randomread d_type2rhor; - DAT::t_int_2d_randomread d_type2z2r; + typename AT::t_int_1d_randomread d_type2frho; + typename AT::t_int_2d_randomread d_type2rhor; + typename AT::t_int_2d_randomread d_type2z2r; typedef Kokkos::DualView tdual_ffloat_2d_n7; typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread; @@ -146,7 +147,7 @@ class PairEAMKokkos : public PairEAM { t_ffloat_2d_n7_randomread d_z2r_spline; void interpolate(int, double, double *, t_host_ffloat_2d_n7, int); - virtual void file2array(); + void file2array(); void array2spline(); typename AT::t_neighbors_2d d_neighbors; diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp new file mode 100644 index 0000000000..a09a1d27e3 --- /dev/null +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -0,0 +1,2646 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (Sandia) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_exp6_rx_kokkos.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neigh_list.h" +#include "math_const.h" +#include "math_special_kokkos.h" +#include "memory_kokkos.h" +#include "error.h" +#include "modify.h" +#include "fix.h" +#include +#include "atom_masks.h" +#include "neigh_request.h" +#include "atom_kokkos.h" +#include "kokkos.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecialKokkos; + +#define MAXLINE 1024 +#define DELTA 4 + +#ifdef DBL_EPSILON + #define MY_EPSILON (10.0*DBL_EPSILON) +#else + #define MY_EPSILON (10.0*2.220446049250313e-16) +#endif + +#define oneFluidApproxParameter (-1) +#define isOneFluidApprox(_site) ( (_site) == oneFluidApproxParameter ) + +#define exp6PotentialType (1) +#define isExp6PotentialType(_type) ( (_type) == exp6PotentialType ) + +namespace /* anonymous */ +{ + +//typedef double TimerType; +//TimerType getTimeStamp(void) { return MPI_Wtime(); } +//double getElapsedTime( const TimerType &t0, const TimerType &t1) { return t1-t0; } + +typedef struct timespec TimerType; +TimerType getTimeStamp(void) { TimerType tick; clock_gettime( CLOCK_MONOTONIC, &tick); return tick; } +double getElapsedTime( const TimerType &t0, const TimerType &t1) +{ + return (t1.tv_sec - t0.tv_sec) + 1e-9*(t1.tv_nsec - t0.tv_nsec); +} + +} // end namespace + +/* ---------------------------------------------------------------------- */ + +template +PairExp6rxKokkos::PairExp6rxKokkos(LAMMPS *lmp) : PairExp6rx(lmp) +{ + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + k_error_flag = DAT::tdual_int_scalar("pair:error_flag"); +} + +/* ---------------------------------------------------------------------- */ + +template +PairExp6rxKokkos::~PairExp6rxKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + + memoryKK->destroy_kokkos(k_cutsq,cutsq); + + for (int i=0; i < nparams; ++i) { + delete[] params[i].name; + delete[] params[i].potential; + } + memoryKK->destroy_kokkos(k_params,params); + + memoryKK->destroy_kokkos(k_mol2param,mol2param); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairExp6rxKokkos::init_style() +{ + PairExp6rx::init_style(); + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with exp6/rx/kk"); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairExp6rxKokkos::compute(int eflag_in, int vflag_in) +{ + TimerType t_start = getTimeStamp(); + + copymode = 1; + + eflag = eflag_in; + vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.template view(); + } + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + uCG = atomKK->k_uCG.view(); + uCGnew = atomKK->k_uCGnew.view(); + dvector = atomKK->k_dvector.view(); + nlocal = atom->nlocal; + special_lj[0] = force->special_lj[0]; + special_lj[1] = force->special_lj[1]; + special_lj[2] = force->special_lj[2]; + special_lj[3] = force->special_lj[3]; + newton_pair = force->newton_pair; + + atomKK->sync(execution_space,X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK | UCG_MASK | UCGNEW_MASK | DVECTOR_MASK); + if (evflag) atomKK->modified(execution_space,F_MASK | ENERGY_MASK | VIRIAL_MASK | UCG_MASK | UCGNEW_MASK); + else atomKK->modified(execution_space,F_MASK | UCG_MASK | UCGNEW_MASK); + k_cutsq.template sync(); + + // Initialize the Exp6 parameter data for both the local + // and ghost atoms. Make the parameter data persistent + // and exchange like any other atom property later. + + TimerType t_mix_start = getTimeStamp(); + { + const int np_total = nlocal + atom->nghost; + + if (np_total > PairExp6ParamData.epsilon1.dimension_0()) { + PairExp6ParamData.epsilon1 = typename AT::t_float_1d("PairExp6ParamData.epsilon1" ,np_total); + PairExp6ParamData.alpha1 = typename AT::t_float_1d("PairExp6ParamData.alpha1" ,np_total); + PairExp6ParamData.rm1 = typename AT::t_float_1d("PairExp6ParamData.rm1" ,np_total); + PairExp6ParamData.mixWtSite1 = typename AT::t_float_1d("PairExp6ParamData.mixWtSite1" ,np_total); + PairExp6ParamData.epsilon2 = typename AT::t_float_1d("PairExp6ParamData.epsilon2" ,np_total); + PairExp6ParamData.alpha2 = typename AT::t_float_1d("PairExp6ParamData.alpha2" ,np_total); + PairExp6ParamData.rm2 = typename AT::t_float_1d("PairExp6ParamData.rm2" ,np_total); + PairExp6ParamData.mixWtSite2 = typename AT::t_float_1d("PairExp6ParamData.mixWtSite2" ,np_total); + PairExp6ParamData.epsilonOld1 = typename AT::t_float_1d("PairExp6ParamData.epsilonOld1" ,np_total); + PairExp6ParamData.alphaOld1 = typename AT::t_float_1d("PairExp6ParamData.alphaOld1" ,np_total); + PairExp6ParamData.rmOld1 = typename AT::t_float_1d("PairExp6ParamData.rmOld1" ,np_total); + PairExp6ParamData.mixWtSite1old = typename AT::t_float_1d("PairExp6ParamData.mixWtSite1old",np_total); + PairExp6ParamData.epsilonOld2 = typename AT::t_float_1d("PairExp6ParamData.epsilonOld2" ,np_total); + PairExp6ParamData.alphaOld2 = typename AT::t_float_1d("PairExp6ParamData.alphaOld2" ,np_total); + PairExp6ParamData.rmOld2 = typename AT::t_float_1d("PairExp6ParamData.rmOld2" ,np_total); + PairExp6ParamData.mixWtSite2old = typename AT::t_float_1d("PairExp6ParamData.mixWtSite2old",np_total); + + PairExp6ParamDataVect.epsilon = typename AT::t_float_1d("PairExp6ParamDataVect.epsilon" ,np_total); + PairExp6ParamDataVect.rm3 = typename AT::t_float_1d("PairExp6ParamDataVect.rm3" ,np_total); + PairExp6ParamDataVect.alpha = typename AT::t_float_1d("PairExp6ParamDataVect.alpha" ,np_total); + PairExp6ParamDataVect.xMolei = typename AT::t_float_1d("PairExp6ParamDataVect.xMolei" ,np_total); + PairExp6ParamDataVect.epsilon_old = typename AT::t_float_1d("PairExp6ParamDataVect.epsilon_old" ,np_total); + PairExp6ParamDataVect.rm3_old = typename AT::t_float_1d("PairExp6ParamDataVect.rm3_old" ,np_total); + PairExp6ParamDataVect.alpha_old = typename AT::t_float_1d("PairExp6ParamDataVect.alpha_old" ,np_total); + PairExp6ParamDataVect.xMolei_old = typename AT::t_float_1d("PairExp6ParamDataVect.xMolei_old" ,np_total); + PairExp6ParamDataVect.fractionOFA = typename AT::t_float_1d("PairExp6ParamDataVect.fractionOFA" ,np_total); + PairExp6ParamDataVect.fraction1 = typename AT::t_float_1d("PairExp6ParamDataVect.fraction1" ,np_total); + PairExp6ParamDataVect.fraction2 = typename AT::t_float_1d("PairExp6ParamDataVect.fraction2" ,np_total); + PairExp6ParamDataVect.nMoleculesOFA = typename AT::t_float_1d("PairExp6ParamDataVect.nMoleculesOFA" ,np_total); + PairExp6ParamDataVect.nMolecules1 = typename AT::t_float_1d("PairExp6ParamDataVect.nMolecules1" ,np_total); + PairExp6ParamDataVect.nMolecules2 = typename AT::t_float_1d("PairExp6ParamDataVect.nMolecules2" ,np_total); + PairExp6ParamDataVect.nTotal = typename AT::t_float_1d("PairExp6ParamDataVect.nTotal" ,np_total); + PairExp6ParamDataVect.fractionOFAold = typename AT::t_float_1d("PairExp6ParamDataVect.fractionOFAold" ,np_total); + PairExp6ParamDataVect.fractionOld1 = typename AT::t_float_1d("PairExp6ParamDataVect.fractionOld1" ,np_total); + PairExp6ParamDataVect.fractionOld2 = typename AT::t_float_1d("PairExp6ParamDataVect.fractionOld2" ,np_total); + PairExp6ParamDataVect.nMoleculesOFAold = typename AT::t_float_1d("PairExp6ParamDataVect.nMoleculesOFAold",np_total); + PairExp6ParamDataVect.nMoleculesOld1 = typename AT::t_float_1d("PairExp6ParamDataVect.nMoleculesOld1" ,np_total); + PairExp6ParamDataVect.nMoleculesOld2 = typename AT::t_float_1d("PairExp6ParamDataVect.nMoleculesOld2" ,np_total); + PairExp6ParamDataVect.nTotalold = typename AT::t_float_1d("PairExp6ParamDataVect.nTotalold" ,np_total); + } else + Kokkos::parallel_for(Kokkos::RangePolicy(0,np_total),*this); + +#ifdef KOKKOS_HAVE_CUDA + Kokkos::parallel_for(Kokkos::RangePolicy(0,np_total),*this); +#else + int errorFlag = 0; + getMixingWeightsVect (np_total, errorFlag, PairExp6ParamData.epsilon1, + PairExp6ParamData.alpha1, + PairExp6ParamData.rm1, + PairExp6ParamData.mixWtSite1, + PairExp6ParamData.epsilon2, + PairExp6ParamData.alpha2, + PairExp6ParamData.rm2, + PairExp6ParamData.mixWtSite2, + PairExp6ParamData.epsilonOld1, + PairExp6ParamData.alphaOld1, + PairExp6ParamData.rmOld1, + PairExp6ParamData.mixWtSite1old, + PairExp6ParamData.epsilonOld2, + PairExp6ParamData.alphaOld2, + PairExp6ParamData.rmOld2, + PairExp6ParamData.mixWtSite2old); + if (errorFlag == 1) + error->all(FLERR,"The number of molecules in CG particle is less than 10*DBL_EPSILON."); + else if (errorFlag == 2) + error->all(FLERR,"Computed fraction less than -10*DBL_EPSILON"); +#endif + } + TimerType t_mix_stop = getTimeStamp(); + + k_error_flag.template modify(); + k_error_flag.template sync(); + if (k_error_flag.h_view() == 1) + error->all(FLERR,"The number of molecules in CG particle is less than 10*DBL_EPSILON."); + else if (k_error_flag.h_view() == 2) + error->all(FLERR,"Computed fraction less than -10*DBL_EPSILON"); + + int inum = list->inum; + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + + // loop over neighbors of my atoms + + EV_FLOAT ev; + +#ifdef KOKKOS_HAVE_CUDA // Use atomics + + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + +#else // No atomics + + num_threads = lmp->kokkos->num_threads; + int nmax = f.dimension_0(); + if (nmax > t_f.dimension_1()) { + t_f = t_f_array_thread("pair_exp6_rx:t_f",num_threads,nmax); + t_uCG = t_efloat_1d_thread("pair_exp6_rx:t_uCG",num_threads,nmax); + t_uCGnew = t_efloat_1d_thread("pair_exp6_rx:t_UCGnew",num_threads,nmax); + } + + Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); + + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + + Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); + +#endif + + k_error_flag.template modify(); + k_error_flag.template sync(); + if (k_error_flag.h_view()) + error->all(FLERR,"alpha_ij is 6.0 in pair exp6"); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } + + copymode = 0; + + //TimerType t_stop = getTimeStamp(); + //printf("PairExp6rxKokkos::compute %f %f\n", getElapsedTime(t_start, t_stop), getElapsedTime(t_mix_start, t_mix_stop)); +} + +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxZeroMixingWeights, const int &i) const { + PairExp6ParamData.epsilon1[i] = 0.0; + PairExp6ParamData.alpha1[i] = 0.0; + PairExp6ParamData.rm1[i] = 0.0; + PairExp6ParamData.mixWtSite1[i] = 0.0; + PairExp6ParamData.epsilon2[i] = 0.0; + PairExp6ParamData.alpha2[i] = 0.0; + PairExp6ParamData.rm2[i] = 0.0; + PairExp6ParamData.mixWtSite2[i] = 0.0; + PairExp6ParamData.epsilonOld1[i] = 0.0; + PairExp6ParamData.alphaOld1[i] = 0.0; + PairExp6ParamData.rmOld1[i] = 0.0; + PairExp6ParamData.mixWtSite1old[i] = 0.0; + PairExp6ParamData.epsilonOld2[i] = 0.0; + PairExp6ParamData.alphaOld2[i] = 0.0; + PairExp6ParamData.rmOld2[i] = 0.0; + PairExp6ParamData.mixWtSite2old[i] = 0.0; +} + +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxgetMixingWeights, const int &i) const { + getMixingWeights (i, PairExp6ParamData.epsilon1[i], + PairExp6ParamData.alpha1[i], + PairExp6ParamData.rm1[i], + PairExp6ParamData.mixWtSite1[i], + PairExp6ParamData.epsilon2[i], + PairExp6ParamData.alpha2[i], + PairExp6ParamData.rm2[i], + PairExp6ParamData.mixWtSite2[i], + PairExp6ParamData.epsilonOld1[i], + PairExp6ParamData.alphaOld1[i], + PairExp6ParamData.rmOld1[i], + PairExp6ParamData.mixWtSite1old[i], + PairExp6ParamData.epsilonOld2[i], + PairExp6ParamData.alphaOld2[i], + PairExp6ParamData.rmOld2[i], + PairExp6ParamData.mixWtSite2old[i]); +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxCompute, const int &ii, EV_FLOAT& ev) const { + + { + const bool one_type = (ntypes == 1); + if (isite1 == isite2) + if (one_type) + this->vectorized_operator(ii, ev); + else + this->vectorized_operator(ii, ev); + else + if (one_type) + this->vectorized_operator(ii, ev); + else + this->vectorized_operator(ii, ev); + return; + } + + // These arrays are atomic for Half/Thread neighbor style + Kokkos::View::value> > a_f = f; + Kokkos::View::value> > a_uCG = uCG; + Kokkos::View::value> > a_uCGnew = uCGnew; + + int i,jj,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,evdwlOld,fpair; + double rsq,r2inv,r6inv,forceExp6,factor_lj; + double rCut,rCutInv,rCut2inv,rCut6inv,rCutExp,urc,durc; + double rm2ij,rm6ij; + double r,rexp; + + double alphaOld12_ij, rmOld12_ij, epsilonOld12_ij; + double alphaOld21_ij, rmOld21_ij, epsilonOld21_ij; + double alpha12_ij, rm12_ij, epsilon12_ij; + double alpha21_ij, rm21_ij, epsilon21_ij; + double rminv, buck1, buck2; + double epsilonOld1_i,alphaOld1_i,rmOld1_i; + double epsilonOld1_j,alphaOld1_j,rmOld1_j; + double epsilonOld2_i,alphaOld2_i,rmOld2_i; + double epsilonOld2_j,alphaOld2_j,rmOld2_j; + double epsilon1_i,alpha1_i,rm1_i; + double epsilon1_j,alpha1_j,rm1_j; + double epsilon2_i,alpha2_i,rm2_i; + double epsilon2_j,alpha2_j,rm2_j; + double evdwlOldEXP6_12, evdwlOldEXP6_21, fpairOldEXP6_12, fpairOldEXP6_21; + double evdwlEXP6_12, evdwlEXP6_21; + double mixWtSite1old_i, mixWtSite1old_j; + double mixWtSite2old_i, mixWtSite2old_j; + double mixWtSite1_i, mixWtSite1_j; + double mixWtSite2_i, mixWtSite2_j; + + const int nRep = 12; + const double shift = 1.05; + double rin1, aRep, uin1, win1, uin1rep, rin1exp, rin6, rin6inv; + + evdwlOld = 0.0; + evdwl = 0.0; + + i = d_ilist[ii]; + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + itype = type[i]; + jnum = d_numneigh[i]; + + double fx_i = 0.0; + double fy_i = 0.0; + double fz_i = 0.0; + double uCG_i = 0.0; + double uCGnew_i = 0.0; + + { + epsilon1_i = PairExp6ParamData.epsilon1[i]; + alpha1_i = PairExp6ParamData.alpha1[i]; + rm1_i = PairExp6ParamData.rm1[i]; + mixWtSite1_i = PairExp6ParamData.mixWtSite1[i]; + epsilon2_i = PairExp6ParamData.epsilon2[i]; + alpha2_i = PairExp6ParamData.alpha2[i]; + rm2_i = PairExp6ParamData.rm2[i]; + mixWtSite2_i = PairExp6ParamData.mixWtSite2[i]; + epsilonOld1_i = PairExp6ParamData.epsilonOld1[i]; + alphaOld1_i = PairExp6ParamData.alphaOld1[i]; + rmOld1_i = PairExp6ParamData.rmOld1[i]; + mixWtSite1old_i = PairExp6ParamData.mixWtSite1old[i]; + epsilonOld2_i = PairExp6ParamData.epsilonOld2[i]; + alphaOld2_i = PairExp6ParamData.alphaOld2[i]; + rmOld2_i = PairExp6ParamData.rmOld2[i]; + mixWtSite2old_i = PairExp6ParamData.mixWtSite2old[i]; + } + + for (jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x(j,0); + dely = ytmp - x(j,1); + delz = ztmp - x(j,2); + + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < d_cutsq(itype,jtype)) { // optimize + r2inv = 1.0/rsq; + r6inv = r2inv*r2inv*r2inv; + + r = sqrt(rsq); + rCut2inv = 1.0/d_cutsq(itype,jtype); + rCut6inv = rCut2inv*rCut2inv*rCut2inv; + rCut = sqrt(d_cutsq(itype,jtype)); + rCutInv = 1.0/rCut; + + // + // A. Compute the exp-6 potential + // + + // A1. Get alpha, epsilon and rm for particle j + + { + epsilon1_j = PairExp6ParamData.epsilon1[j]; + alpha1_j = PairExp6ParamData.alpha1[j]; + rm1_j = PairExp6ParamData.rm1[j]; + mixWtSite1_j = PairExp6ParamData.mixWtSite1[j]; + epsilon2_j = PairExp6ParamData.epsilon2[j]; + alpha2_j = PairExp6ParamData.alpha2[j]; + rm2_j = PairExp6ParamData.rm2[j]; + mixWtSite2_j = PairExp6ParamData.mixWtSite2[j]; + epsilonOld1_j = PairExp6ParamData.epsilonOld1[j]; + alphaOld1_j = PairExp6ParamData.alphaOld1[j]; + rmOld1_j = PairExp6ParamData.rmOld1[j]; + mixWtSite1old_j = PairExp6ParamData.mixWtSite1old[j]; + epsilonOld2_j = PairExp6ParamData.epsilonOld2[j]; + alphaOld2_j = PairExp6ParamData.alphaOld2[j]; + rmOld2_j = PairExp6ParamData.rmOld2[j]; + mixWtSite2old_j = PairExp6ParamData.mixWtSite2old[j]; + } + + // A2. Apply Lorentz-Berthelot mixing rules for the i-j pair + alphaOld12_ij = sqrt(alphaOld1_i*alphaOld2_j); + rmOld12_ij = 0.5*(rmOld1_i + rmOld2_j); + epsilonOld12_ij = sqrt(epsilonOld1_i*epsilonOld2_j); + alphaOld21_ij = sqrt(alphaOld2_i*alphaOld1_j); + rmOld21_ij = 0.5*(rmOld2_i + rmOld1_j); + epsilonOld21_ij = sqrt(epsilonOld2_i*epsilonOld1_j); + + alpha12_ij = sqrt(alpha1_i*alpha2_j); + rm12_ij = 0.5*(rm1_i + rm2_j); + epsilon12_ij = sqrt(epsilon1_i*epsilon2_j); + alpha21_ij = sqrt(alpha2_i*alpha1_j); + rm21_ij = 0.5*(rm2_i + rm1_j); + epsilon21_ij = sqrt(epsilon2_i*epsilon1_j); + + evdwlOldEXP6_12 = 0.0; + evdwlOldEXP6_21 = 0.0; + evdwlEXP6_12 = 0.0; + evdwlEXP6_21 = 0.0; + fpairOldEXP6_12 = 0.0; + fpairOldEXP6_21 = 0.0; + + if(rmOld12_ij!=0.0 && rmOld21_ij!=0.0){ + if(alphaOld21_ij == 6.0 || alphaOld12_ij == 6.0) + k_error_flag.template view()() = 1; + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rmOld12_ij; + buck1 = epsilonOld12_ij / (alphaOld12_ij - 6.0); + rexp = expValue(alphaOld12_ij*(1.0-r*rminv)); + rm2ij = rmOld12_ij*rmOld12_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alphaOld12_ij*(1.0-rCut*rminv)); + buck2 = 6.0*alphaOld12_ij; + urc = buck1*(6.0*rCutExp - alphaOld12_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp* rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rmOld12_ij*func_rin(alphaOld12_ij); + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alphaOld12_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alphaOld12_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + forceExp6 = double(nRep)*aRep/powint(r,nRep); + fpairOldEXP6_12 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_12 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + forceExp6 = buck1*buck2*(r*rexp*rminv - rm6ij*r6inv) + r*durc; + fpairOldEXP6_12 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_12 = buck1*(6.0*rexp - alphaOld12_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rmOld21_ij; + buck1 = epsilonOld21_ij / (alphaOld21_ij - 6.0); + buck2 = 6.0*alphaOld21_ij; + rexp = expValue(alphaOld21_ij*(1.0-r*rminv)); + rm2ij = rmOld21_ij*rmOld21_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alphaOld21_ij*(1.0-rCut*rminv)); + buck2 = 6.0*alphaOld21_ij; + urc = buck1*(6.0*rCutExp - alphaOld21_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp* rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rmOld21_ij*func_rin(alphaOld21_ij); + + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alphaOld21_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alphaOld21_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + forceExp6 = double(nRep)*aRep/powint(r,nRep); + fpairOldEXP6_21 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_21 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + forceExp6 = buck1*buck2*(r*rexp*rminv - rm6ij*r6inv) + r*durc; + fpairOldEXP6_21 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_21 = buck1*(6.0*rexp - alphaOld21_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + if (isite1 == isite2) + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwlOldEXP6_12; + else + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwlOldEXP6_12 + sqrt(mixWtSite2old_i*mixWtSite1old_j)*evdwlOldEXP6_21; + + evdwlOld *= factor_lj; + + uCG_i += 0.5*evdwlOld; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + a_uCG[j] += 0.5*evdwlOld; + } + + if(rm12_ij!=0.0 && rm21_ij!=0.0){ + if(alpha21_ij == 6.0 || alpha12_ij == 6.0) + k_error_flag.template view()() = 1; + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rm12_ij; + buck1 = epsilon12_ij / (alpha12_ij - 6.0); + buck2 = 6.0*alpha12_ij; + rexp = expValue(alpha12_ij*(1.0-r*rminv)); + rm2ij = rm12_ij*rm12_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alpha12_ij*(1.0-rCut*rminv)); + urc = buck1*(6.0*rCutExp - alpha12_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp*rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rm12_ij*func_rin(alpha12_ij); + + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alpha12_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alpha12_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + evdwlEXP6_12 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + evdwlEXP6_12 = buck1*(6.0*rexp - alpha12_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + rminv = 1.0/rm21_ij; + buck1 = epsilon21_ij / (alpha21_ij - 6.0); + buck2 = 6.0*alpha21_ij; + rexp = expValue(alpha21_ij*(1.0-r*rminv)); + rm2ij = rm21_ij*rm21_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alpha21_ij*(1.0-rCut*rminv)); + urc = buck1*(6.0*rCutExp - alpha21_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp*rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rm21_ij*func_rin(alpha21_ij); + + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alpha21_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alpha21_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + evdwlEXP6_21 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + evdwlEXP6_21 = buck1*(6.0*rexp - alpha21_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + } + + // + // Apply Mixing Rule to get the overall force for the CG pair + // + if (isite1 == isite2) fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpairOldEXP6_12; + else fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpairOldEXP6_12 + sqrt(mixWtSite2old_i*mixWtSite1old_j)*fpairOldEXP6_21; + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + a_f(j,0) -= delx*fpair; + a_f(j,1) -= dely*fpair; + a_f(j,2) -= delz*fpair; + } + + if (isite1 == isite2) evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwlEXP6_12; + else evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwlEXP6_12 + sqrt(mixWtSite2_i*mixWtSite1_j)*evdwlEXP6_21; + evdwl *= factor_lj; + + uCGnew_i += 0.5*evdwl; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + a_uCGnew[j] += 0.5*evdwl; + evdwl = evdwlOld; + if (EVFLAG) + ev.evdwl += (((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR||(jtemplate ev_tally(ev,i,j,evdwl,fpair,delx,dely,delz); + } + } + + a_f(i,0) += fx_i; + a_f(i,1) += fy_i; + a_f(i,2) += fz_i; + a_uCG[i] += uCG_i; + a_uCGnew[i] += uCGnew_i; +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxCompute, const int &ii) const { + EV_FLOAT ev; + this->template operator()(TagPairExp6rxCompute(), ii, ev); +} + +// Experimental thread-safety using duplicated data instead of atomics + +template +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxComputeNoAtomics, const int &ii, EV_FLOAT& ev) const { + + { + const bool one_type = (ntypes == 1); + if (isite1 == isite2) + if (one_type) + this->vectorized_operator(ii, ev); + else + this->vectorized_operator(ii, ev); + else + if (one_type) + this->vectorized_operator(ii, ev); + else + this->vectorized_operator(ii, ev); + return; + } + + int tid = 0; +#ifndef KOKKOS_HAVE_CUDA + tid = DeviceType::hardware_thread_id(); +#endif + + int i,jj,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,evdwlOld,fpair; + double rsq,r2inv,r6inv,forceExp6,factor_lj; + double rCut,rCutInv,rCut2inv,rCut6inv,rCutExp,urc,durc; + double rm2ij,rm6ij; + double r,rexp; + + double alphaOld12_ij, rmOld12_ij, epsilonOld12_ij; + double alphaOld21_ij, rmOld21_ij, epsilonOld21_ij; + double alpha12_ij, rm12_ij, epsilon12_ij; + double alpha21_ij, rm21_ij, epsilon21_ij; + double rminv, buck1, buck2; + double epsilonOld1_i,alphaOld1_i,rmOld1_i; + double epsilonOld1_j,alphaOld1_j,rmOld1_j; + double epsilonOld2_i,alphaOld2_i,rmOld2_i; + double epsilonOld2_j,alphaOld2_j,rmOld2_j; + double epsilon1_i,alpha1_i,rm1_i; + double epsilon1_j,alpha1_j,rm1_j; + double epsilon2_i,alpha2_i,rm2_i; + double epsilon2_j,alpha2_j,rm2_j; + double evdwlOldEXP6_12, evdwlOldEXP6_21, fpairOldEXP6_12, fpairOldEXP6_21; + double evdwlEXP6_12, evdwlEXP6_21; + double mixWtSite1old_i, mixWtSite1old_j; + double mixWtSite2old_i, mixWtSite2old_j; + double mixWtSite1_i, mixWtSite1_j; + double mixWtSite2_i, mixWtSite2_j; + + const int nRep = 12; + const double shift = 1.05; + double rin1, aRep, uin1, win1, uin1rep, rin1exp, rin6, rin6inv; + + evdwlOld = 0.0; + evdwl = 0.0; + + i = d_ilist[ii]; + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + itype = type[i]; + jnum = d_numneigh[i]; + + double fx_i = 0.0; + double fy_i = 0.0; + double fz_i = 0.0; + double uCG_i = 0.0; + double uCGnew_i = 0.0; + + { + epsilon1_i = PairExp6ParamData.epsilon1[i]; + alpha1_i = PairExp6ParamData.alpha1[i]; + rm1_i = PairExp6ParamData.rm1[i]; + mixWtSite1_i = PairExp6ParamData.mixWtSite1[i]; + epsilon2_i = PairExp6ParamData.epsilon2[i]; + alpha2_i = PairExp6ParamData.alpha2[i]; + rm2_i = PairExp6ParamData.rm2[i]; + mixWtSite2_i = PairExp6ParamData.mixWtSite2[i]; + epsilonOld1_i = PairExp6ParamData.epsilonOld1[i]; + alphaOld1_i = PairExp6ParamData.alphaOld1[i]; + rmOld1_i = PairExp6ParamData.rmOld1[i]; + mixWtSite1old_i = PairExp6ParamData.mixWtSite1old[i]; + epsilonOld2_i = PairExp6ParamData.epsilonOld2[i]; + alphaOld2_i = PairExp6ParamData.alphaOld2[i]; + rmOld2_i = PairExp6ParamData.rmOld2[i]; + mixWtSite2old_i = PairExp6ParamData.mixWtSite2old[i]; + } + + for (jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x(j,0); + dely = ytmp - x(j,1); + delz = ztmp - x(j,2); + + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < d_cutsq(itype,jtype)) { // optimize + r2inv = 1.0/rsq; + r6inv = r2inv*r2inv*r2inv; + + r = sqrt(rsq); + rCut2inv = 1.0/d_cutsq(itype,jtype); + rCut6inv = rCut2inv*rCut2inv*rCut2inv; + rCut = sqrt(d_cutsq(itype,jtype)); + rCutInv = 1.0/rCut; + + // + // A. Compute the exp-6 potential + // + + // A1. Get alpha, epsilon and rm for particle j + + { + epsilon1_j = PairExp6ParamData.epsilon1[j]; + alpha1_j = PairExp6ParamData.alpha1[j]; + rm1_j = PairExp6ParamData.rm1[j]; + mixWtSite1_j = PairExp6ParamData.mixWtSite1[j]; + epsilon2_j = PairExp6ParamData.epsilon2[j]; + alpha2_j = PairExp6ParamData.alpha2[j]; + rm2_j = PairExp6ParamData.rm2[j]; + mixWtSite2_j = PairExp6ParamData.mixWtSite2[j]; + epsilonOld1_j = PairExp6ParamData.epsilonOld1[j]; + alphaOld1_j = PairExp6ParamData.alphaOld1[j]; + rmOld1_j = PairExp6ParamData.rmOld1[j]; + mixWtSite1old_j = PairExp6ParamData.mixWtSite1old[j]; + epsilonOld2_j = PairExp6ParamData.epsilonOld2[j]; + alphaOld2_j = PairExp6ParamData.alphaOld2[j]; + rmOld2_j = PairExp6ParamData.rmOld2[j]; + mixWtSite2old_j = PairExp6ParamData.mixWtSite2old[j]; + } + + // A2. Apply Lorentz-Berthelot mixing rules for the i-j pair + alphaOld12_ij = sqrt(alphaOld1_i*alphaOld2_j); + rmOld12_ij = 0.5*(rmOld1_i + rmOld2_j); + epsilonOld12_ij = sqrt(epsilonOld1_i*epsilonOld2_j); + alphaOld21_ij = sqrt(alphaOld2_i*alphaOld1_j); + rmOld21_ij = 0.5*(rmOld2_i + rmOld1_j); + epsilonOld21_ij = sqrt(epsilonOld2_i*epsilonOld1_j); + + alpha12_ij = sqrt(alpha1_i*alpha2_j); + rm12_ij = 0.5*(rm1_i + rm2_j); + epsilon12_ij = sqrt(epsilon1_i*epsilon2_j); + alpha21_ij = sqrt(alpha2_i*alpha1_j); + rm21_ij = 0.5*(rm2_i + rm1_j); + epsilon21_ij = sqrt(epsilon2_i*epsilon1_j); + + evdwlOldEXP6_12 = 0.0; + evdwlOldEXP6_21 = 0.0; + evdwlEXP6_12 = 0.0; + evdwlEXP6_21 = 0.0; + fpairOldEXP6_12 = 0.0; + fpairOldEXP6_21 = 0.0; + + if(rmOld12_ij!=0.0 && rmOld21_ij!=0.0){ + if(alphaOld21_ij == 6.0 || alphaOld12_ij == 6.0) + k_error_flag.template view()() = 1; + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rmOld12_ij; + buck1 = epsilonOld12_ij / (alphaOld12_ij - 6.0); + rexp = expValue(alphaOld12_ij*(1.0-r*rminv)); + rm2ij = rmOld12_ij*rmOld12_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alphaOld12_ij*(1.0-rCut*rminv)); + buck2 = 6.0*alphaOld12_ij; + urc = buck1*(6.0*rCutExp - alphaOld12_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp* rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rmOld12_ij*func_rin(alphaOld12_ij); + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alphaOld12_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alphaOld12_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + forceExp6 = double(nRep)*aRep/powint(r,nRep); + fpairOldEXP6_12 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_12 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + forceExp6 = buck1*buck2*(r*rexp*rminv - rm6ij*r6inv) + r*durc; + fpairOldEXP6_12 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_12 = buck1*(6.0*rexp - alphaOld12_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rmOld21_ij; + buck1 = epsilonOld21_ij / (alphaOld21_ij - 6.0); + buck2 = 6.0*alphaOld21_ij; + rexp = expValue(alphaOld21_ij*(1.0-r*rminv)); + rm2ij = rmOld21_ij*rmOld21_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alphaOld21_ij*(1.0-rCut*rminv)); + buck2 = 6.0*alphaOld21_ij; + urc = buck1*(6.0*rCutExp - alphaOld21_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp* rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rmOld21_ij*func_rin(alphaOld21_ij); + + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alphaOld21_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alphaOld21_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + forceExp6 = double(nRep)*aRep/powint(r,nRep); + fpairOldEXP6_21 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_21 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + forceExp6 = buck1*buck2*(r*rexp*rminv - rm6ij*r6inv) + r*durc; + fpairOldEXP6_21 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_21 = buck1*(6.0*rexp - alphaOld21_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + if (isite1 == isite2) + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwlOldEXP6_12; + else + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwlOldEXP6_12 + sqrt(mixWtSite2old_i*mixWtSite1old_j)*evdwlOldEXP6_21; + + evdwlOld *= factor_lj; + + uCG_i += 0.5*evdwlOld; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + t_uCG(tid,j) += 0.5*evdwlOld; + } + + if(rm12_ij!=0.0 && rm21_ij!=0.0){ + if(alpha21_ij == 6.0 || alpha12_ij == 6.0) + k_error_flag.template view()() = 1; + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rm12_ij; + buck1 = epsilon12_ij / (alpha12_ij - 6.0); + buck2 = 6.0*alpha12_ij; + rexp = expValue(alpha12_ij*(1.0-r*rminv)); + rm2ij = rm12_ij*rm12_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alpha12_ij*(1.0-rCut*rminv)); + urc = buck1*(6.0*rCutExp - alpha12_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp*rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rm12_ij*func_rin(alpha12_ij); + + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alpha12_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alpha12_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + evdwlEXP6_12 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + evdwlEXP6_12 = buck1*(6.0*rexp - alpha12_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + rminv = 1.0/rm21_ij; + buck1 = epsilon21_ij / (alpha21_ij - 6.0); + buck2 = 6.0*alpha21_ij; + rexp = expValue(alpha21_ij*(1.0-r*rminv)); + rm2ij = rm21_ij*rm21_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alpha21_ij*(1.0-rCut*rminv)); + urc = buck1*(6.0*rCutExp - alpha21_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp*rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rm21_ij*func_rin(alpha21_ij); + + if(r < rin1){ + rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + rin6inv = 1.0/rin6; + + rin1exp = expValue(alpha21_ij*(1.0-rin1*rminv)); + + uin1 = buck1*(6.0*rin1exp - alpha21_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + aRep = win1*powint(rin1,nRep)/nRep; + + uin1rep = aRep/powint(rin1,nRep); + + evdwlEXP6_21 = uin1 - uin1rep + aRep/powint(r,nRep); + } else { + evdwlEXP6_21 = buck1*(6.0*rexp - alpha21_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + } + + // + // Apply Mixing Rule to get the overall force for the CG pair + // + if (isite1 == isite2) fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpairOldEXP6_12; + else fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpairOldEXP6_12 + sqrt(mixWtSite2old_i*mixWtSite1old_j)*fpairOldEXP6_21; + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + t_f(tid,j,0) -= delx*fpair; + t_f(tid,j,1) -= dely*fpair; + t_f(tid,j,2) -= delz*fpair; + } + + if (isite1 == isite2) evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwlEXP6_12; + else evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwlEXP6_12 + sqrt(mixWtSite2_i*mixWtSite1_j)*evdwlEXP6_21; + evdwl *= factor_lj; + + uCGnew_i += 0.5*evdwl; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + t_uCGnew(tid,j) += 0.5*evdwl; + evdwl = evdwlOld; + if (EVFLAG) + ev.evdwl += (((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR||(jtemplate ev_tally(ev,i,j,evdwl,fpair,delx,dely,delz); + } + } + + t_f(tid,i,0) += fx_i; + t_f(tid,i,1) += fy_i; + t_f(tid,i,2) += fz_i; + t_uCG(tid,i) += uCG_i; + t_uCGnew(tid,i) += uCGnew_i; +} + +// Experimental thread-safe approach using duplicated data instead of atomics and +// temporary local short vector arrays for the inner j-loop to increase vectorization. + +template + KOKKOS_INLINE_FUNCTION +double __powint(const double& x, const int) +{ + static_assert(n == 12, "__powint<> only supports specific integer powers."); + + if (n == 12) + { + // Do x^12 here ... x^12 = (x^3)^4 + double x3 = x*x*x; + return x3*x3*x3*x3; + } +} + +template + template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::vectorized_operator(const int &ii, EV_FLOAT& ev) const +{ + // These arrays are atomic for Half/Thread neighbor style + Kokkos::View::value> > a_f = f; + Kokkos::View::value> > a_uCG = uCG; + Kokkos::View::value> > a_uCGnew = uCGnew; + + int tid = 0; +#ifndef KOKKOS_HAVE_CUDA + tid = DeviceType::hardware_thread_id(); +#endif + + const int nRep = 12; + const double shift = 1.05; + + const int i = d_ilist[ii]; + const double xtmp = x(i,0); + const double ytmp = x(i,1); + const double ztmp = x(i,2); + const int itype = type[i]; + const int jnum = d_numneigh[i]; + + double fx_i = 0.0; + double fy_i = 0.0; + double fz_i = 0.0; + double uCG_i = 0.0; + double uCGnew_i = 0.0; + + // Constant values for this atom. + const double epsilon1_i = PairExp6ParamData.epsilon1[i]; + const double alpha1_i = PairExp6ParamData.alpha1[i]; + const double rm1_i = PairExp6ParamData.rm1[i]; + const double mixWtSite1_i = PairExp6ParamData.mixWtSite1[i]; + const double epsilon2_i = PairExp6ParamData.epsilon2[i]; + const double alpha2_i = PairExp6ParamData.alpha2[i]; + const double rm2_i = PairExp6ParamData.rm2[i]; + const double mixWtSite2_i = PairExp6ParamData.mixWtSite2[i]; + const double epsilonOld1_i = PairExp6ParamData.epsilonOld1[i]; + const double alphaOld1_i = PairExp6ParamData.alphaOld1[i]; + const double rmOld1_i = PairExp6ParamData.rmOld1[i]; + const double mixWtSite1old_i = PairExp6ParamData.mixWtSite1old[i]; + const double epsilonOld2_i = PairExp6ParamData.epsilonOld2[i]; + const double alphaOld2_i = PairExp6ParamData.alphaOld2[i]; + const double rmOld2_i = PairExp6ParamData.rmOld2[i]; + const double mixWtSite2old_i = PairExp6ParamData.mixWtSite2old[i]; + + const double cutsq_type11 = d_cutsq(1,1); + const double rCut2inv_type11 = 1.0/ cutsq_type11; + const double rCut6inv_type11 = rCut2inv_type11*rCut2inv_type11*rCut2inv_type11; + const double rCut_type11 = sqrt( cutsq_type11 ); + const double rCutInv_type11 = 1.0/rCut_type11; + + // Do error testing locally. + bool hasError = false; + + // Process this many neighbors concurrently -- if possible. + const int batchSize = 8; + + int neigh_j[batchSize]; + double evdwlOld_j[batchSize]; + double uCGnew_j[batchSize]; + double fpair_j[batchSize]; + double delx_j[batchSize]; + double dely_j[batchSize]; + double delz_j[batchSize]; + double cutsq_j[batchSize]; + + for (int jptr = 0; jptr < jnum; ) + { + // The core computation here is very expensive so let's only bother with + // those that pass rsq < cutsq. + + for (int j = 0; j < batchSize; ++j) + { + evdwlOld_j[j] = 0.0; + uCGnew_j[j] = 0.0; + fpair_j[j] = 0.0; + //delx_j[j] = 0.0; + //dely_j[j] = 0.0; + //delz_j[j] = 0.0; + //cutsq_j[j] = 0.0; + } + + int niters = 0; + + for (; (jptr < jnum) && (niters < batchSize); ++jptr) + { + const int j = d_neighbors(i,jptr) & NEIGHMASK; + + const double delx = xtmp - x(j,0); + const double dely = ytmp - x(j,1); + const double delz = ztmp - x(j,2); + + const double rsq = delx*delx + dely*dely + delz*delz; + const int jtype = type[j]; + + const double cutsq_ij = (OneType) ? cutsq_type11 : d_cutsq(itype,jtype); + + if (rsq < cutsq_ij) + { + delx_j [niters] = delx; + dely_j [niters] = dely; + delz_j [niters] = delz; + if (OneType == false) + cutsq_j[niters] = cutsq_ij; + + neigh_j[niters] = d_neighbors(i,jptr); + + ++niters; + } + } + + // reduction here. + #pragma simd reduction(+: fx_i, fy_i, fz_i, uCG_i, uCGnew_i) reduction(|: hasError) + for (int jlane = 0; jlane < niters; jlane++) + { + int j = neigh_j[jlane]; + const double factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + const double delx = delx_j[jlane]; + const double dely = dely_j[jlane]; + const double delz = delz_j[jlane]; + + const double rsq = delx*delx + dely*dely + delz*delz; + // const int jtype = type[j]; + + // if (rsq < d_cutsq(itype,jtype)) // optimize + { + const double r2inv = 1.0/rsq; + const double r6inv = r2inv*r2inv*r2inv; + + const double r = sqrt(rsq); + const double rCut2inv = (OneType) ? rCut2inv_type11 : (1.0/ cutsq_j[jlane]); + const double rCut6inv = (OneType) ? rCut6inv_type11 : (rCut2inv*rCut2inv*rCut2inv); + const double rCut = (OneType) ? rCut_type11 : (sqrt( cutsq_j[jlane] )); + const double rCutInv = (OneType) ? rCutInv_type11 : (1.0/rCut); + + // + // A. Compute the exp-6 potential + // + + // A1. Get alpha, epsilon and rm for particle j + + const double epsilon1_j = PairExp6ParamData.epsilon1[j]; + const double alpha1_j = PairExp6ParamData.alpha1[j]; + const double rm1_j = PairExp6ParamData.rm1[j]; + const double mixWtSite1_j = PairExp6ParamData.mixWtSite1[j]; + const double epsilon2_j = PairExp6ParamData.epsilon2[j]; + const double alpha2_j = PairExp6ParamData.alpha2[j]; + const double rm2_j = PairExp6ParamData.rm2[j]; + const double mixWtSite2_j = PairExp6ParamData.mixWtSite2[j]; + const double epsilonOld1_j = PairExp6ParamData.epsilonOld1[j]; + const double alphaOld1_j = PairExp6ParamData.alphaOld1[j]; + const double rmOld1_j = PairExp6ParamData.rmOld1[j]; + const double mixWtSite1old_j = PairExp6ParamData.mixWtSite1old[j]; + const double epsilonOld2_j = PairExp6ParamData.epsilonOld2[j]; + const double alphaOld2_j = PairExp6ParamData.alphaOld2[j]; + const double rmOld2_j = PairExp6ParamData.rmOld2[j]; + const double mixWtSite2old_j = PairExp6ParamData.mixWtSite2old[j]; + + // A2. Apply Lorentz-Berthelot mixing rules for the i-j pair + const double alphaOld12_ij = sqrt(alphaOld1_i*alphaOld2_j); + const double rmOld12_ij = 0.5*(rmOld1_i + rmOld2_j); + const double epsilonOld12_ij = sqrt(epsilonOld1_i*epsilonOld2_j); + const double alphaOld21_ij = sqrt(alphaOld2_i*alphaOld1_j); + const double rmOld21_ij = 0.5*(rmOld2_i + rmOld1_j); + const double epsilonOld21_ij = sqrt(epsilonOld2_i*epsilonOld1_j); + + const double alpha12_ij = sqrt(alpha1_i*alpha2_j); + const double rm12_ij = 0.5*(rm1_i + rm2_j); + const double epsilon12_ij = sqrt(epsilon1_i*epsilon2_j); + const double alpha21_ij = sqrt(alpha2_i*alpha1_j); + const double rm21_ij = 0.5*(rm2_i + rm1_j); + const double epsilon21_ij = sqrt(epsilon2_i*epsilon1_j); + + double evdwlOldEXP6_12 = 0.0; + double evdwlOldEXP6_21 = 0.0; + double evdwlEXP6_12 = 0.0; + double evdwlEXP6_21 = 0.0; + double fpairOldEXP6_12 = 0.0; + double fpairOldEXP6_21 = 0.0; + + if(rmOld12_ij!=0.0 && rmOld21_ij!=0.0) + { + hasError |= (alphaOld21_ij == 6.0 || alphaOld12_ij == 6.0); + + // A3. Compute some convenient quantities for evaluating the force + double rminv = 1.0/rmOld12_ij; + double buck1 = epsilonOld12_ij / (alphaOld12_ij - 6.0); + double rexp = expValue(alphaOld12_ij*(1.0-r*rminv)); + double rm2ij = rmOld12_ij*rmOld12_ij; + double rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + double rCutExp = expValue(alphaOld12_ij*(1.0-rCut*rminv)); + double buck2 = 6.0*alphaOld12_ij; + double urc = buck1*(6.0*rCutExp - alphaOld12_ij*rm6ij*rCut6inv); + double durc = -buck1*buck2*(rCutExp* rminv - rCutInv*rm6ij*rCut6inv); + double rin1 = shift*rmOld12_ij*func_rin(alphaOld12_ij); + + if(r < rin1){ + const double rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + const double rin6inv = 1.0/rin6; + + const double rin1exp = expValue(alphaOld12_ij*(1.0-rin1*rminv)); + + const double uin1 = buck1*(6.0*rin1exp - alphaOld12_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + const double win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + const double aRep = win1*__powint<12>(rin1,nRep)/nRep; + + const double uin1rep = aRep/__powint<12>(rin1,nRep); + + const double forceExp6 = double(nRep)*aRep/__powint<12>(r,nRep); + fpairOldEXP6_12 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_12 = uin1 - uin1rep + aRep/__powint<12>(r,nRep); + } else { + const double forceExp6 = buck1*buck2*(r*rexp*rminv - rm6ij*r6inv) + r*durc; + fpairOldEXP6_12 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_12 = buck1*(6.0*rexp - alphaOld12_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + // A3. Compute some convenient quantities for evaluating the force + rminv = 1.0/rmOld21_ij; + buck1 = epsilonOld21_ij / (alphaOld21_ij - 6.0); + buck2 = 6.0*alphaOld21_ij; + rexp = expValue(alphaOld21_ij*(1.0-r*rminv)); + rm2ij = rmOld21_ij*rmOld21_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alphaOld21_ij*(1.0-rCut*rminv)); + buck2 = 6.0*alphaOld21_ij; + urc = buck1*(6.0*rCutExp - alphaOld21_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp* rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rmOld21_ij*func_rin(alphaOld21_ij); + + if(r < rin1){ + const double rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + const double rin6inv = 1.0/rin6; + + const double rin1exp = expValue(alphaOld21_ij*(1.0-rin1*rminv)); + + const double uin1 = buck1*(6.0*rin1exp - alphaOld21_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + const double win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + const double aRep = win1*__powint<12>(rin1,nRep)/nRep; + + const double uin1rep = aRep/__powint<12>(rin1,nRep); + + const double forceExp6 = double(nRep)*aRep/__powint<12>(r,nRep); + fpairOldEXP6_21 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_21 = uin1 - uin1rep + aRep/__powint<12>(r,nRep); + } else { + const double forceExp6 = buck1*buck2*(r*rexp*rminv - rm6ij*r6inv) + r*durc; + fpairOldEXP6_21 = factor_lj*forceExp6*r2inv; + + evdwlOldEXP6_21 = buck1*(6.0*rexp - alphaOld21_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + double evdwlOld; + if (Site1EqSite2) + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwlOldEXP6_12; + else + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwlOldEXP6_12 + sqrt(mixWtSite2old_i*mixWtSite1old_j)*evdwlOldEXP6_21; + + evdwlOld *= factor_lj; + + uCG_i += 0.5*evdwlOld; + + evdwlOld_j[jlane] = evdwlOld; + } + + if(rm12_ij!=0.0 && rm21_ij!=0.0) + { + hasError |= (alpha21_ij == 6.0 || alpha12_ij == 6.0); + + // A3. Compute some convenient quantities for evaluating the force + double rminv = 1.0/rm12_ij; + double buck1 = epsilon12_ij / (alpha12_ij - 6.0); + double buck2 = 6.0*alpha12_ij; + double rexp = expValue(alpha12_ij*(1.0-r*rminv)); + double rm2ij = rm12_ij*rm12_ij; + double rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + double rCutExp = expValue(alpha12_ij*(1.0-rCut*rminv)); + double urc = buck1*(6.0*rCutExp - alpha12_ij*rm6ij*rCut6inv); + double durc = -buck1*buck2*(rCutExp*rminv - rCutInv*rm6ij*rCut6inv); + double rin1 = shift*rm12_ij*func_rin(alpha12_ij); + + if(r < rin1){ + const double rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + const double rin6inv = 1.0/rin6; + + const double rin1exp = expValue(alpha12_ij*(1.0-rin1*rminv)); + + const double uin1 = buck1*(6.0*rin1exp - alpha12_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + const double win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + const double aRep = win1*__powint<12>(rin1,nRep)/nRep; + + const double uin1rep = aRep/__powint<12>(rin1,nRep); + + evdwlEXP6_12 = uin1 - uin1rep + aRep/__powint<12>(r,nRep); + } else { + evdwlEXP6_12 = buck1*(6.0*rexp - alpha12_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + + rminv = 1.0/rm21_ij; + buck1 = epsilon21_ij / (alpha21_ij - 6.0); + buck2 = 6.0*alpha21_ij; + rexp = expValue(alpha21_ij*(1.0-r*rminv)); + rm2ij = rm21_ij*rm21_ij; + rm6ij = rm2ij*rm2ij*rm2ij; + + // Compute the shifted potential + rCutExp = expValue(alpha21_ij*(1.0-rCut*rminv)); + urc = buck1*(6.0*rCutExp - alpha21_ij*rm6ij*rCut6inv); + durc = -buck1*buck2*(rCutExp*rminv - rCutInv*rm6ij*rCut6inv); + rin1 = shift*rm21_ij*func_rin(alpha21_ij); + + if(r < rin1){ + const double rin6 = rin1*rin1*rin1*rin1*rin1*rin1; + const double rin6inv = 1.0/rin6; + + const double rin1exp = expValue(alpha21_ij*(1.0-rin1*rminv)); + + const double uin1 = buck1*(6.0*rin1exp - alpha21_ij*rm6ij*rin6inv) - urc - durc*(rin1-rCut); + + const double win1 = buck1*buck2*(rin1*rin1exp*rminv - rm6ij*rin6inv) + rin1*durc; + + const double aRep = win1*__powint<12>(rin1,nRep)/nRep; + + const double uin1rep = aRep/__powint<12>(rin1,nRep); + + evdwlEXP6_21 = uin1 - uin1rep + aRep/__powint<12>(r,nRep); + } else { + evdwlEXP6_21 = buck1*(6.0*rexp - alpha21_ij*rm6ij*r6inv) - urc - durc*(r-rCut); + } + } + + // + // Apply Mixing Rule to get the overall force for the CG pair + // + double fpair; + if (Site1EqSite2) + fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpairOldEXP6_12; + else + fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpairOldEXP6_12 + sqrt(mixWtSite2old_i*mixWtSite1old_j)*fpairOldEXP6_21; + + double evdwl; + if (Site1EqSite2) + evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwlEXP6_12; + else + evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwlEXP6_12 + sqrt(mixWtSite2_i*mixWtSite1_j)*evdwlEXP6_21; + + evdwl *= factor_lj; + + fpair_j[jlane] = fpair; + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + + uCGnew_i += 0.5*evdwl; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD)) + uCGnew_j[jlane] = 0.5*evdwl; + + } // if rsq < cutsq + + } // end jlane loop. + + for (int jlane = 0; jlane < niters; jlane++) + { + const int j = neigh_j[jlane] & NEIGHMASK; + + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + if (UseAtomics) + a_uCG(j) += 0.5*evdwlOld_j[jlane]; + else + t_uCG(tid,j) += 0.5*evdwlOld_j[jlane]; + + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + if (UseAtomics) + a_uCGnew(j) += uCGnew_j[jlane]; + else + t_uCGnew(tid,j) += uCGnew_j[jlane]; + + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + if (UseAtomics) + { + a_f(j,0) -= delx_j[jlane]*fpair_j[jlane]; + a_f(j,1) -= dely_j[jlane]*fpair_j[jlane]; + a_f(j,2) -= delz_j[jlane]*fpair_j[jlane]; + } + else + { + t_f(tid,j,0) -= delx_j[jlane]*fpair_j[jlane]; + t_f(tid,j,1) -= dely_j[jlane]*fpair_j[jlane]; + t_f(tid,j,2) -= delz_j[jlane]*fpair_j[jlane]; + } + } + + double evdwl = evdwlOld_j[jlane]; + if (EVFLAG) + ev.evdwl += (((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR||(jtemplate ev_tally(ev,i,j,evdwl,fpair_j[jlane],delx_j[jlane],dely_j[jlane],delz_j[jlane]); + } + } + + if (hasError) + k_error_flag.template view()() = 1; + + if (UseAtomics) + { + a_f(i,0) += fx_i; + a_f(i,1) += fy_i; + a_f(i,2) += fz_i; + a_uCG(i) += uCG_i; + a_uCGnew(i) += uCGnew_i; + } + else + { + t_f(tid,i,0) += fx_i; + t_f(tid,i,1) += fy_i; + t_f(tid,i,2) += fz_i; + t_uCG(tid,i) += uCG_i; + t_uCGnew(tid,i) += uCGnew_i; + } +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxComputeNoAtomics, const int &ii) const { + EV_FLOAT ev; + this->template operator()(TagPairExp6rxComputeNoAtomics(), ii, ev); +} + +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxCollapseDupViews, const int &i) const { + for (int n = 0; n < num_threads; n++) { + f(i,0) += t_f(n,i,0); + f(i,1) += t_f(n,i,1); + f(i,2) += t_f(n,i,2); + uCG(i) += t_uCG(n,i); + uCGnew(i) += t_uCGnew(n,i); + } +} + +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::operator()(TagPairExp6rxZeroDupViews, const int &i) const { + for (int n = 0; n < num_threads; n++) { + t_f(n,i,0) = 0.0; + t_f(n,i,1) = 0.0; + t_f(n,i,2) = 0.0; + t_uCG(n,i) = 0.0; + t_uCGnew(n,i) = 0.0; + } +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairExp6rxKokkos::allocate() +{ + allocated = 1; + ntypes = atom->ntypes; + + memory->create(setflag,ntypes+1,ntypes+1,"pair:setflag"); + for (int i = 1; i <= ntypes; i++) + for (int j = i; j <= ntypes; j++) + setflag[i][j] = 0; + + memoryKK->create_kokkos(k_cutsq,cutsq,ntypes+1,ntypes+1,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + k_cutsq.template modify(); + + memory->create(cut,ntypes+1,ntypes+1,"pair:cut_lj"); +} + + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +template +void PairExp6rxKokkos::coeff(int narg, char **arg) +{ + PairExp6rx::coeff(narg,arg); + + if (scalingFlag == POLYNOMIAL) + for (int i = 0; i < 6; i++) { + s_coeffAlpha[i] = coeffAlpha[i]; + s_coeffEps[i] = coeffEps[i]; + s_coeffRm[i] = coeffRm[i]; + } + + k_params.template modify(); + k_params.template sync(); + d_params = k_params.template view(); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairExp6rxKokkos::read_file(char *file) +{ + int params_per_line = 5; + char **words = new char*[params_per_line+1]; + + memoryKK->destroy_kokkos(k_params,params); + params = NULL; + nparams = maxparam = 0; + + // open file on proc 0 + + FILE *fp; + fp = NULL; + if (comm->me == 0) { + fp = force->open_potential(file); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open exp6/rx potential file %s",file); + error->one(FLERR,str); + } + } + + // read each set of params from potential file + // one set of params can span multiple lines + + int n,nwords,ispecies; + char line[MAXLINE],*ptr; + int eof = 0; + + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + // concatenate additional lines until have params_per_line words + + while (nwords < params_per_line) { + n = strlen(line); + if (comm->me == 0) { + ptr = fgets(&line[n],MAXLINE-n,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + } + + if (nwords != params_per_line) + error->all(FLERR,"Incorrect format in exp6/rx potential file"); + + // words = ptrs to all words in line + + nwords = 0; + words[nwords++] = strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + for (ispecies = 0; ispecies < nspecies; ispecies++) + if (strcmp(words[0],&atom->dname[ispecies][0]) == 0) break; + if (ispecies == nspecies) continue; + + // load up parameter settings and error check their values + + if (nparams == maxparam) { + k_params.template modify(); + maxparam += DELTA; + memoryKK->grow_kokkos(k_params,params,maxparam, + "pair:params"); + } + + params[nparams].ispecies = ispecies; + + n = strlen(&atom->dname[ispecies][0]) + 1; + params[nparams].name = new char[n]; + strcpy(params[nparams].name,&atom->dname[ispecies][0]); + + n = strlen(words[1]) + 1; + params[nparams].potential = new char[n]; + strcpy(params[nparams].potential,words[1]); + if (strcmp(params[nparams].potential,"exp6") == 0){ + params[nparams].alpha = atof(words[2]); + params[nparams].epsilon = atof(words[3]); + params[nparams].rm = atof(words[4]); + if (params[nparams].epsilon <= 0.0 || params[nparams].rm <= 0.0 || + params[nparams].alpha < 0.0) + error->all(FLERR,"Illegal exp6/rx parameters. Rm and Epsilon must be greater than zero. Alpha cannot be negative."); + } else { + error->all(FLERR,"Illegal exp6/rx parameters. Interaction potential does not exist."); + } + nparams++; + } + + delete [] words; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairExp6rxKokkos::setup() +{ + int i,j,n; + + // set mol2param for all combinations + // must be a single exact match to lines read from file + + memoryKK->destroy_kokkos(k_mol2param,mol2param); + memoryKK->create_kokkos(k_mol2param,mol2param,nspecies,"pair:mol2param"); + + for (i = 0; i < nspecies; i++) { + n = -1; + for (j = 0; j < nparams; j++) { + if (i == params[j].ispecies) { + if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + n = j; + } + } + mol2param[i] = n; + } + + k_mol2param.template modify(); + k_mol2param.template sync(); + d_mol2param = k_mol2param.template view(); + + neighflag = lmp->kokkos->neighflag; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::getMixingWeights(int id,double &epsilon1,double &alpha1,double &rm1, double &mixWtSite1,double &epsilon2,double &alpha2,double &rm2,double &mixWtSite2,double &epsilon1_old,double &alpha1_old,double &rm1_old, double &mixWtSite1old,double &epsilon2_old,double &alpha2_old,double &rm2_old,double &mixWtSite2old) const +{ + int iparam, jparam; + double rmi, rmj, rmij, rm3ij; + double epsiloni, epsilonj, epsilonij; + double alphai, alphaj, alphaij; + double epsilon_old, rm3_old, alpha_old; + double epsilon, rm3, alpha; + double xMolei, xMolej, xMolei_old, xMolej_old; + + double fractionOFAold, fractionOFA; + double fractionOld1, fraction1; + double fractionOld2, fraction2; + double nMoleculesOFAold, nMoleculesOFA; + double nMoleculesOld1, nMolecules1; + double nMoleculesOld2, nMolecules2; + double nTotal, nTotalold; + + rm3 = 0.0; + epsilon = 0.0; + alpha = 0.0; + epsilon_old = 0.0; + rm3_old = 0.0; + alpha_old = 0.0; + fractionOFA = 0.0; + fractionOFAold = 0.0; + nMoleculesOFA = 0.0; + nMoleculesOFAold = 0.0; + nTotal = 0.0; + nTotalold = 0.0; + + // Compute the total number of molecules in the old and new CG particle as well as the total number of molecules in the fluid portion of the old and new CG particle + for (int ispecies = 0; ispecies < nspecies; ispecies++){ + nTotal += dvector(ispecies,id); + nTotalold += dvector(ispecies+nspecies,id); + + iparam = d_mol2param[ispecies]; + + if (iparam < 0 || d_params[iparam].potentialType != exp6PotentialType ) continue; + if (isOneFluidApprox(isite1) || isOneFluidApprox(isite2)) { + if (isite1 == d_params[iparam].ispecies || isite2 == d_params[iparam].ispecies) continue; + nMoleculesOFAold += dvector(ispecies+nspecies,id); + nMoleculesOFA += dvector(ispecies,id); + } + } + if(nTotal < MY_EPSILON || nTotalold < MY_EPSILON) + k_error_flag.template view()() = 1; + + // Compute the mole fraction of molecules within the fluid portion of the particle (One Fluid Approximation) + fractionOFAold = nMoleculesOFAold / nTotalold; + fractionOFA = nMoleculesOFA / nTotal; + + for (int ispecies = 0; ispecies < nspecies; ispecies++) { + iparam = d_mol2param[ispecies]; + if (iparam < 0 || d_params[iparam].potentialType != exp6PotentialType ) continue; + + // If Site1 matches a pure species, then grab the parameters + if (isite1 == d_params[iparam].ispecies){ + rm1_old = d_params[iparam].rm; + rm1 = d_params[iparam].rm; + epsilon1_old = d_params[iparam].epsilon; + epsilon1 = d_params[iparam].epsilon; + alpha1_old = d_params[iparam].alpha; + alpha1 = d_params[iparam].alpha; + + // Compute the mole fraction of Site1 + nMoleculesOld1 = dvector(ispecies+nspecies,id); + nMolecules1 = dvector(ispecies,id); + fractionOld1 = nMoleculesOld1/nTotalold; + fraction1 = nMolecules1/nTotal; + } + + // If Site2 matches a pure species, then grab the parameters + if (isite2 == d_params[iparam].ispecies){ + rm2_old = d_params[iparam].rm; + rm2 = d_params[iparam].rm; + epsilon2_old = d_params[iparam].epsilon; + epsilon2 = d_params[iparam].epsilon; + alpha2_old = d_params[iparam].alpha; + alpha2 = d_params[iparam].alpha; + + // Compute the mole fraction of Site2 + nMoleculesOld2 = dvector(ispecies+nspecies,id); + nMolecules2 = dvector(ispecies,id); + fractionOld2 = dvector(ispecies+nspecies,id)/nTotalold; + fraction2 = nMolecules2/nTotal; + } + + // If Site1 or Site2 matches is a fluid, then compute the paramters + if (isOneFluidApprox(isite1) || isOneFluidApprox(isite2)) { + if (isite1 == d_params[iparam].ispecies || isite2 == d_params[iparam].ispecies) continue; + rmi = d_params[iparam].rm; + epsiloni = d_params[iparam].epsilon; + alphai = d_params[iparam].alpha; + if(nMoleculesOFA 0.0){ + rm3_old += xMolei_old*xMolej_old*rm3ij; + epsilon_old += xMolei_old*xMolej_old*rm3ij*epsilonij; + alpha_old += xMolei_old*xMolej_old*rm3ij*epsilonij*alphaij; + } + if(fractionOFA > 0.0){ + rm3 += xMolei*xMolej*rm3ij; + epsilon += xMolei*xMolej*rm3ij*epsilonij; + alpha += xMolei*xMolej*rm3ij*epsilonij*alphaij; + } + } + } + } + + if (isOneFluidApprox(isite1)){ + rm1 = cbrt(rm3); + if(rm1 < MY_EPSILON) { + rm1 = 0.0; + epsilon1 = 0.0; + alpha1 = 0.0; + } else { + epsilon1 = epsilon / rm3; + alpha1 = alpha / epsilon1 / rm3; + } + nMolecules1 = 1.0-(nTotal-nMoleculesOFA); + fraction1 = fractionOFA; + + rm1_old = cbrt(rm3_old); + if(rm1_old < MY_EPSILON) { + rm1_old = 0.0; + epsilon1_old = 0.0; + alpha1_old = 0.0; + } else { + epsilon1_old = epsilon_old / rm3_old; + alpha1_old = alpha_old / epsilon1_old / rm3_old; + } + nMoleculesOld1 = 1.0-(nTotalold-nMoleculesOFAold); + fractionOld1 = fractionOFAold; + + if(scalingFlag == EXPONENT){ + exponentScaling(nMoleculesOFA,epsilon1,rm1); + exponentScaling(nMoleculesOFAold,epsilon1_old,rm1_old); + } else if(scalingFlag == POLYNOMIAL){ + polynomialScaling(nMoleculesOFA,alpha1,epsilon1,rm1); + polynomialScaling(nMoleculesOFAold,alpha1_old,epsilon1_old,rm1_old); + } + } + + if (isOneFluidApprox(isite2)){ + rm2 = cbrt(rm3); + if(rm2 < MY_EPSILON) { + rm2 = 0.0; + epsilon2 = 0.0; + alpha2 = 0.0; + } else { + epsilon2 = epsilon / rm3; + alpha2 = alpha / epsilon2 / rm3; + } + nMolecules2 = 1.0-(nTotal-nMoleculesOFA); + fraction2 = fractionOFA; + + rm2_old = cbrt(rm3_old); + if(rm2_old < MY_EPSILON) { + rm2_old = 0.0; + epsilon2_old = 0.0; + alpha2_old = 0.0; + } else { + epsilon2_old = epsilon_old / rm3_old; + alpha2_old = alpha_old / epsilon2_old / rm3_old; + } + nMoleculesOld2 = 1.0-(nTotalold-nMoleculesOFAold); + fractionOld2 = fractionOFAold; + + if(scalingFlag == EXPONENT){ + exponentScaling(nMoleculesOFA,epsilon2,rm2); + exponentScaling(nMoleculesOFAold,epsilon2_old,rm2_old); + } else if(scalingFlag == POLYNOMIAL){ + polynomialScaling(nMoleculesOFA,alpha2,epsilon2,rm2); + polynomialScaling(nMoleculesOFAold,alpha2_old,epsilon2_old,rm2_old); + } + } + + // Check that no fractions are less than zero + if(fraction1 < 0.0 || nMolecules1 < 0.0){ + if(fraction1 < -MY_EPSILON || nMolecules1 < -MY_EPSILON){ + k_error_flag.template view()() = 2; + } + nMolecules1 = 0.0; + fraction1 = 0.0; + } + if(fraction2 < 0.0 || nMolecules2 < 0.0){ + if(fraction2 < -MY_EPSILON || nMolecules2 < -MY_EPSILON){ + k_error_flag.template view()() = 2; + } + nMolecules2 = 0.0; + fraction2 = 0.0; + } + if(fractionOld1 < 0.0 || nMoleculesOld1 < 0.0){ + if(fractionOld1 < -MY_EPSILON || nMoleculesOld1 < -MY_EPSILON){ + k_error_flag.template view()() = 2; + } + nMoleculesOld1 = 0.0; + fractionOld1 = 0.0; + } + if(fractionOld2 < 0.0 || nMoleculesOld2 < 0.0){ + if(fractionOld2 < -MY_EPSILON || nMoleculesOld2 < -MY_EPSILON){ + k_error_flag.template view()() = 2; + } + nMoleculesOld2 = 0.0; + fractionOld2 = 0.0; + } + + if(fractionalWeighting){ + mixWtSite1old = fractionOld1; + mixWtSite1 = fraction1; + mixWtSite2old = fractionOld2; + mixWtSite2 = fraction2; + } else { + mixWtSite1old = nMoleculesOld1; + mixWtSite1 = nMolecules1; + mixWtSite2old = nMoleculesOld2; + mixWtSite2 = nMolecules2; + } +} + +#ifdef _OPENMP +void partition_range( const int begin, const int end, int &thread_begin, int &thread_end, const int chunkSize = 1) +{ + int threadId = omp_get_thread_num(); + int nThreads = omp_get_num_threads(); + + const int len = end - begin; + const int nBlocks = (len + (chunkSize - 1)) / chunkSize; + const int nBlocksPerThread = nBlocks / nThreads; + const int nRemaining = nBlocks - nBlocksPerThread * nThreads; + int block_lo, block_hi; + if (threadId < nRemaining) + { + block_lo = threadId * nBlocksPerThread + threadId; + block_hi = block_lo + nBlocksPerThread + 1; + } + else + { + block_lo = threadId * nBlocksPerThread + nRemaining; + block_hi = block_lo + nBlocksPerThread; + } + + thread_begin = std::min(begin + block_lo * chunkSize, end); + thread_end = std::min(begin + block_hi * chunkSize, end); + //printf("tid: %d %d %d %d %d\n", threadId, block_lo, block_hi, thread_begin, thread_end); +} +#endif + +/* ---------------------------------------------------------------------- */ + +#ifndef KOKKOS_HAVE_CUDA +template + template +void PairExp6rxKokkos::getMixingWeightsVect(const int np_total, int errorFlag, + ArrayT &epsilon1, ArrayT &alpha1, ArrayT &rm1, ArrayT &mixWtSite1, ArrayT &epsilon2, ArrayT &alpha2, ArrayT &rm2, ArrayT &mixWtSite2, ArrayT &epsilon1_old, ArrayT &alpha1_old, ArrayT &rm1_old, ArrayT &mixWtSite1old, ArrayT &epsilon2_old, ArrayT &alpha2_old, ArrayT &rm2_old, ArrayT &mixWtSite2old) const +{ + ArrayT epsilon = PairExp6ParamDataVect.epsilon ; + ArrayT rm3 = PairExp6ParamDataVect.rm3 ; + ArrayT alpha = PairExp6ParamDataVect.alpha ; + ArrayT xMolei = PairExp6ParamDataVect.xMolei ; + + ArrayT epsilon_old = PairExp6ParamDataVect.epsilon_old ; + ArrayT rm3_old = PairExp6ParamDataVect.rm3_old ; + ArrayT alpha_old = PairExp6ParamDataVect.alpha_old ; + ArrayT xMolei_old = PairExp6ParamDataVect.xMolei_old ; + + ArrayT fractionOFA = PairExp6ParamDataVect.fractionOFA ; + ArrayT fraction1 = PairExp6ParamDataVect.fraction1 ; + ArrayT fraction2 = PairExp6ParamDataVect.fraction2 ; + ArrayT nMoleculesOFA = PairExp6ParamDataVect.nMoleculesOFA ; + ArrayT nMolecules1 = PairExp6ParamDataVect.nMolecules1 ; + ArrayT nMolecules2 = PairExp6ParamDataVect.nMolecules2 ; + ArrayT nTotal = PairExp6ParamDataVect.nTotal ; + + ArrayT fractionOFAold = PairExp6ParamDataVect.fractionOFAold ; + ArrayT fractionOld1 = PairExp6ParamDataVect.fractionOld1 ; + ArrayT fractionOld2 = PairExp6ParamDataVect.fractionOld2 ; + ArrayT nMoleculesOFAold = PairExp6ParamDataVect.nMoleculesOFAold; + ArrayT nMoleculesOld1 = PairExp6ParamDataVect.nMoleculesOld1 ; + ArrayT nMoleculesOld2 = PairExp6ParamDataVect.nMoleculesOld2 ; + ArrayT nTotalold = PairExp6ParamDataVect.nTotalold ; + + int errorFlag1 = 0, errorFlag2 = 0; + +#ifdef _OPENMP + #pragma omp parallel reduction(+: errorFlag1, errorFlag2) +#endif + { + int idx_begin = 0, idx_end = np_total; +#ifdef _OPENMP + partition_range( 0, np_total, idx_begin, idx_end, 16 ); +#endif + + // Zero out all of the terms first. + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + rm3[id] = 0.0; + epsilon[id] = 0.0; + alpha[id] = 0.0; + epsilon_old[id] = 0.0; + rm3_old[id] = 0.0; + alpha_old[id] = 0.0; + fractionOFA[id] = 0.0; + fractionOFAold[id] = 0.0; + nMoleculesOFA[id] = 0.0; + nMoleculesOFAold[id] = 0.0; + nTotal[id] = 0.0; + nTotalold[id] = 0.0; + } + + // Compute the total number of molecules in the old and new CG particle as well as the total number of molecules in the fluid portion of the old and new CG particle + for (int ispecies = 0; ispecies < nspecies; ispecies++) + { + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + nTotal[id] += dvector(ispecies,id); + nTotalold[id] += dvector(ispecies+nspecies,id); + } + + const int iparam = d_mol2param[ispecies]; + + if (iparam < 0 || d_params[iparam].potentialType != exp6PotentialType ) continue; + if (isOneFluidApprox(isite1) || isOneFluidApprox(isite2)) { + if (isite1 == d_params[iparam].ispecies || isite2 == d_params[iparam].ispecies) continue; + + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + nMoleculesOFAold[id] += dvector(ispecies+nspecies,id); + nMoleculesOFA[id] += dvector(ispecies,id); + } + } + } + + // Make a reduction. + #pragma omp simd reduction(+:errorFlag1) + for (int id = idx_begin; id < idx_end; ++id) + { + if ( nTotal[id] < MY_EPSILON || nTotalold[id] < MY_EPSILON ) + errorFlag1 = 1; + + // Compute the mole fraction of molecules within the fluid portion of the particle (One Fluid Approximation) + fractionOFAold[id] = nMoleculesOFAold[id] / nTotalold[id]; + fractionOFA[id] = nMoleculesOFA[id] / nTotal[id]; + } + + for (int ispecies = 0; ispecies < nspecies; ispecies++) { + const int iparam = d_mol2param[ispecies]; + if (iparam < 0 || d_params[iparam].potentialType != exp6PotentialType ) continue; + + // If Site1 matches a pure species, then grab the parameters + if (isite1 == d_params[iparam].ispecies) + { + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + rm1_old[id] = d_params[iparam].rm; + rm1[id] = d_params[iparam].rm; + epsilon1_old[id] = d_params[iparam].epsilon; + epsilon1[id] = d_params[iparam].epsilon; + alpha1_old[id] = d_params[iparam].alpha; + alpha1[id] = d_params[iparam].alpha; + + // Compute the mole fraction of Site1 + nMoleculesOld1[id] = dvector(ispecies+nspecies,id); + nMolecules1[id] = dvector(ispecies,id); + fractionOld1[id] = nMoleculesOld1[id]/nTotalold[id]; + fraction1[id] = nMolecules1[id]/nTotal[id]; + } + } + + // If Site2 matches a pure species, then grab the parameters + if (isite2 == d_params[iparam].ispecies) + { + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + rm2_old[id] = d_params[iparam].rm; + rm2[id] = d_params[iparam].rm; + epsilon2_old[id] = d_params[iparam].epsilon; + epsilon2[id] = d_params[iparam].epsilon; + alpha2_old[id] = d_params[iparam].alpha; + alpha2[id] = d_params[iparam].alpha; + + // Compute the mole fraction of Site2 + nMoleculesOld2[id] = dvector(ispecies+nspecies,id); + nMolecules2[id] = dvector(ispecies,id); + fractionOld2[id] = nMoleculesOld2[id]/nTotalold[id]; + fraction2[id] = nMolecules2[id]/nTotal[id]; + } + } + + // If Site1 or Site2 matches is a fluid, then compute the paramters + if (isOneFluidApprox(isite1) || isOneFluidApprox(isite2)) { + if (isite1 == d_params[iparam].ispecies || isite2 == d_params[iparam].ispecies) continue; + + const double rmi = d_params[iparam].rm; + const double epsiloni = d_params[iparam].epsilon; + const double alphai = d_params[iparam].alpha; + + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + if(nMoleculesOFA[id] 0.0){ + rm3_old[id] += xMolei_old[id]*xMolej_old*rm3ij; + epsilon_old[id] += xMolei_old[id]*xMolej_old*rm3ij*epsilonij; + alpha_old[id] += xMolei_old[id]*xMolej_old*rm3ij*epsilonij*alphaij; + } + if(fractionOFA[id] > 0.0){ + rm3[id] += xMolei[id]*xMolej*rm3ij; + epsilon[id] += xMolei[id]*xMolej*rm3ij*epsilonij; + alpha[id] += xMolei[id]*xMolej*rm3ij*epsilonij*alphaij; + } + } + } + } + } + + if (isOneFluidApprox(isite1)) + { + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + rm1[id] = cbrt(rm3[id]); + if(rm1[id] < MY_EPSILON) { + rm1[id] = 0.0; + epsilon1[id] = 0.0; + alpha1[id] = 0.0; + } else { + epsilon1[id] = epsilon[id] / rm3[id]; + alpha1[id] = alpha[id] / epsilon1[id] / rm3[id]; + } + nMolecules1[id] = 1.0-(nTotal[id]-nMoleculesOFA[id]); + fraction1[id] = fractionOFA[id]; + + rm1_old[id] = cbrt(rm3_old[id]); + if(rm1_old[id] < MY_EPSILON) { + rm1_old[id] = 0.0; + epsilon1_old[id] = 0.0; + alpha1_old[id] = 0.0; + } else { + epsilon1_old[id] = epsilon_old[id] / rm3_old[id]; + alpha1_old[id] = alpha_old[id] / epsilon1_old[id] / rm3_old[id]; + } + nMoleculesOld1[id] = 1.0-(nTotalold[id]-nMoleculesOFAold[id]); + fractionOld1[id] = fractionOFAold[id]; + } + + if(scalingFlag == EXPONENT) { + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + exponentScaling(nMoleculesOFA[id],epsilon1[id],rm1[id]); + exponentScaling(nMoleculesOFAold[id],epsilon1_old[id],rm1_old[id]); + } + } + else if(scalingFlag == POLYNOMIAL){ + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + polynomialScaling(nMoleculesOFA[id],alpha1[id],epsilon1[id],rm1[id]); + polynomialScaling(nMoleculesOFAold[id],alpha1_old[id],epsilon1_old[id],rm1_old[id]); + } + } + } + + if (isOneFluidApprox(isite2)) + { + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + rm2[id] = cbrt(rm3[id]); + if(rm2[id] < MY_EPSILON) { + rm2[id] = 0.0; + epsilon2[id] = 0.0; + alpha2[id] = 0.0; + } else { + epsilon2[id] = epsilon[id] / rm3[id]; + alpha2[id] = alpha[id] / epsilon2[id] / rm3[id]; + } + nMolecules2[id] = 1.0-(nTotal[id]-nMoleculesOFA[id]); + fraction2[id] = fractionOFA[id]; + + rm2_old[id] = cbrt(rm3_old[id]); + if(rm2_old[id] < MY_EPSILON) { + rm2_old[id] = 0.0; + epsilon2_old[id] = 0.0; + alpha2_old[id] = 0.0; + } else { + epsilon2_old[id] = epsilon_old[id] / rm3_old[id]; + alpha2_old[id] = alpha_old[id] / epsilon2_old[id] / rm3_old[id]; + } + nMoleculesOld2[id] = 1.0-(nTotalold[id]-nMoleculesOFAold[id]); + fractionOld2[id] = fractionOFAold[id]; + } + + if(scalingFlag == EXPONENT){ + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + exponentScaling(nMoleculesOFA[id],epsilon2[id],rm2[id]); + exponentScaling(nMoleculesOFAold[id],epsilon2_old[id],rm2_old[id]); + } + } + else if(scalingFlag == POLYNOMIAL){ + #pragma ivdep + for (int id = idx_begin; id < idx_end; ++id) + { + polynomialScaling(nMoleculesOFA[id],alpha2[id],epsilon2[id],rm2[id]); + polynomialScaling(nMoleculesOFAold[id],alpha2_old[id],epsilon2_old[id],rm2_old[id]); + } + } + } + + // Check that no fractions are less than zero + #pragma omp simd reduction(+:errorFlag2) + for (int id = idx_begin; id < idx_end; ++id) + { + if(fraction1[id] < 0.0 || nMolecules1[id] < 0.0){ + if(fraction1[id] < -MY_EPSILON || nMolecules1[id] < -MY_EPSILON){ + errorFlag2 = 2; + } + nMolecules1[id] = 0.0; + fraction1[id] = 0.0; + } + if(fraction2[id] < 0.0 || nMolecules2[id] < 0.0){ + if(fraction2[id] < -MY_EPSILON || nMolecules2[id] < -MY_EPSILON){ + errorFlag2 = 2; + } + nMolecules2[id] = 0.0; + fraction2[id] = 0.0; + } + if(fractionOld1[id] < 0.0 || nMoleculesOld1[id] < 0.0){ + if(fractionOld1[id] < -MY_EPSILON || nMoleculesOld1[id] < -MY_EPSILON){ + errorFlag2 = 2; + } + nMoleculesOld1[id] = 0.0; + fractionOld1[id] = 0.0; + } + if(fractionOld2[id] < 0.0 || nMoleculesOld2[id] < 0.0){ + if(fractionOld2[id] < -MY_EPSILON || nMoleculesOld2[id] < -MY_EPSILON){ + errorFlag2 = 2; + } + nMoleculesOld2[id] = 0.0; + fractionOld2[id] = 0.0; + } + + if(fractionalWeighting){ + mixWtSite1old[id] = fractionOld1[id]; + mixWtSite1[id] = fraction1[id]; + mixWtSite2old[id] = fractionOld2[id]; + mixWtSite2[id] = fraction2[id]; + } else { + mixWtSite1old[id] = nMoleculesOld1[id]; + mixWtSite1[id] = nMolecules1[id]; + mixWtSite2old[id] = nMoleculesOld2[id]; + mixWtSite2[id] = nMolecules2[id]; + } + } + + } // end parallel region + + if (errorFlag1 > 0) + errorFlag = 1; + + if (errorFlag2 > 0) + errorFlag = 2; +} +#endif + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::exponentScaling(double phi, double &epsilon, double &rm) const +{ + double powfuch; + + if(exponentEpsilon < 0.0){ + powfuch = pow(phi,-exponentEpsilon); + if(powfuch +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::polynomialScaling(double phi, double &alpha, double &epsilon, double &rm) const +{ + double phi2 = phi*phi; + double phi3 = phi2*phi; + double phi4 = phi2*phi2; + double phi5 = phi2*phi3; + + alpha = (s_coeffAlpha[0]*phi5 + s_coeffAlpha[1]*phi4 + s_coeffAlpha[2]*phi3 + s_coeffAlpha[3]*phi2 + s_coeffAlpha[4]*phi + s_coeffAlpha[5]); + epsilon *= (s_coeffEps[0]*phi5 + s_coeffEps[1]*phi4 + s_coeffEps[2]*phi3 + s_coeffEps[3]*phi2 + s_coeffEps[4]*phi + s_coeffEps[5]); + rm *= (s_coeffRm[0]*phi5 + s_coeffRm[1]*phi4 + s_coeffRm[2]*phi3 + s_coeffRm[3]*phi2 + s_coeffRm[4]*phi + s_coeffRm[5]); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double PairExp6rxKokkos::func_rin(const double &alpha) const +{ + double function; + + const double a = 3.7682065; + const double b = -1.4308614; + + function = a+b*sqrt(alpha); + function = expValue(function); + + return function; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double PairExp6rxKokkos::expValue(double value) const +{ + double returnValue; + if(value < DBL_MIN_EXP) returnValue = 0.0; + else returnValue = exp(value); + + return returnValue; +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairExp6rxKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, + const F_FLOAT &dely, const F_FLOAT &delz) const +{ + const int EFLAG = eflag; + const int VFLAG = vflag_either; + + // The eatom and vatom arrays are atomic for Half/Thread neighbor style + Kokkos::View::value> > v_eatom = k_eatom.view(); + Kokkos::View::value> > v_vatom = k_vatom.view(); + + if (EFLAG) { + if (eflag_atom) { + const E_FLOAT epairhalf = 0.5 * epair; + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) v_eatom[i] += epairhalf; + if (NEWTON_PAIR || j < nlocal) v_eatom[j] += epairhalf; + } else { + v_eatom[i] += epairhalf; + } + } + } + + if (VFLAG) { + const E_FLOAT v0 = delx*delx*fpair; + const E_FLOAT v1 = dely*dely*fpair; + const E_FLOAT v2 = delz*delz*fpair; + const E_FLOAT v3 = delx*dely*fpair; + const E_FLOAT v4 = delx*delz*fpair; + const E_FLOAT v5 = dely*delz*fpair; + + if (vflag_global) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } else { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } + + if (vflag_atom) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + v_vatom(j,0) += 0.5*v0; + v_vatom(j,1) += 0.5*v1; + v_vatom(j,2) += 0.5*v2; + v_vatom(j,3) += 0.5*v3; + v_vatom(j,4) += 0.5*v4; + v_vatom(j,5) += 0.5*v5; + } + } else { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +int PairExp6rxKokkos::sbmask(const int& j) const { + return j >> SBBITS & 3; +} + +namespace LAMMPS_NS { +template class PairExp6rxKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairExp6rxKokkos; +#endif +} diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.h b/src/KOKKOS/pair_exp6_rx_kokkos.h new file mode 100644 index 0000000000..5e44048ae2 --- /dev/null +++ b/src/KOKKOS/pair_exp6_rx_kokkos.h @@ -0,0 +1,280 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(exp6/rx/kk,PairExp6rxKokkos) +PairStyle(exp6/rx/kk/device,PairExp6rxKokkos) +PairStyle(exp6/rx/kk/host,PairExp6rxKokkos) + +#else + +#ifndef LMP_PAIR_EXP6_RX_KOKKOS_H +#define LMP_PAIR_EXP6_RX_KOKKOS_H + +#include "pair_exp6_rx.h" +#include "kokkos_type.h" +#include "pair_kokkos.h" + +namespace LAMMPS_NS { + +// Create a structure to hold the parameter data for all +// local and neighbor particles. Pack inside this struct +// to avoid any name clashes. + +template +struct PairExp6ParamDataTypeKokkos +{ + typedef ArrayTypes AT; + + int n; + typename AT::t_float_1d epsilon1, alpha1, rm1, mixWtSite1, + epsilon2, alpha2, rm2, mixWtSite2, + epsilonOld1, alphaOld1, rmOld1, mixWtSite1old, + epsilonOld2, alphaOld2, rmOld2, mixWtSite2old; + + // Default constructor -- nullify everything. + PairExp6ParamDataTypeKokkos(void) + : n(0), epsilon1(NULL), alpha1(NULL), rm1(NULL), mixWtSite1(NULL), + epsilon2(NULL), alpha2(NULL), rm2(NULL), mixWtSite2(NULL), + epsilonOld1(NULL), alphaOld1(NULL), rmOld1(NULL), mixWtSite1old(NULL), + epsilonOld2(NULL), alphaOld2(NULL), rmOld2(NULL), mixWtSite2old(NULL) + {} +}; + +template +struct PairExp6ParamDataTypeKokkosVect +{ + typedef ArrayTypes AT; + + typename AT::t_float_1d epsilon, rm3, alpha, xMolei, epsilon_old, rm3_old, + alpha_old, xMolei_old, fractionOFA, fraction1, + fraction2, nMoleculesOFA, nMolecules1, nMolecules2, + nTotal, fractionOFAold, fractionOld1, fractionOld2, + nMoleculesOFAold, nMoleculesOld1, nMoleculesOld2, + nTotalold; + + // Default constructor -- nullify everything. + PairExp6ParamDataTypeKokkosVect(void) + : epsilon(NULL), rm3(NULL), alpha(NULL), xMolei(NULL), epsilon_old(NULL), rm3_old(NULL), + alpha_old(NULL), xMolei_old(NULL), fractionOFA(NULL), fraction1(NULL), + fraction2(NULL), nMoleculesOFA(NULL), nMolecules1(NULL), nMolecules2(NULL), + nTotal(NULL), fractionOFAold(NULL), fractionOld1(NULL), fractionOld2(NULL), + nMoleculesOFAold(NULL), nMoleculesOld1(NULL), nMoleculesOld2(NULL), + nTotalold(NULL) + {} +}; + +struct TagPairExp6rxZeroMixingWeights{}; +struct TagPairExp6rxgetMixingWeights{}; + +template +struct TagPairExp6rxCompute{}; + +template +struct TagPairExp6rxComputeNoAtomics{}; + +struct TagPairExp6rxCollapseDupViews{}; +struct TagPairExp6rxZeroDupViews{}; + +template +class PairExp6rxKokkos : public PairExp6rx { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef EV_FLOAT value_type; + + PairExp6rxKokkos(class LAMMPS *); + virtual ~PairExp6rxKokkos(); + void compute(int, int); + void coeff(int, char **); + void init_style(); + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxZeroMixingWeights, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxgetMixingWeights, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxCompute, const int&, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxCompute, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxComputeNoAtomics, const int&, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void vectorized_operator(const int&, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxComputeNoAtomics, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxCollapseDupViews, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairExp6rxZeroDupViews, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void ev_tally(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, + const F_FLOAT &dely, const F_FLOAT &delz) const; + + KOKKOS_INLINE_FUNCTION + int sbmask(const int& j) const; + + protected: + int eflag,vflag; + int nlocal,newton_pair,neighflag; + double special_lj[4]; + int num_threads,ntypes; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + typename AT::t_efloat_1d uCG, uCGnew; + typename AT::t_float_2d dvector; + + typedef Kokkos::View t_f_array_thread; + typedef Kokkos::View t_efloat_1d_thread; + + t_f_array_thread t_f; + t_efloat_1d_thread t_uCG, t_uCGnew; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + DAT::tdual_int_scalar k_error_flag; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d_randomread d_ilist; + typename AT::t_int_1d_randomread d_numneigh; + + PairExp6ParamDataTypeKokkos PairExp6ParamData; + PairExp6ParamDataTypeKokkosVect PairExp6ParamDataVect; + + void allocate(); + DAT::tdual_int_1d k_mol2param; // mapping from molecule to parameters + typename AT::t_int_1d_randomread d_mol2param; + + typedef Kokkos::DualView tdual_param_1d; + typedef typename tdual_param_1d::t_dev_const_randomread t_param_1d_randomread; + + tdual_param_1d k_params; // parameter set for an I-J-K interaction + t_param_1d_randomread d_params; // parameter set for an I-J-K interaction + + typename ArrayTypes::tdual_ffloat_2d k_cutsq; + typename ArrayTypes::t_ffloat_2d d_cutsq; + + void read_file(char *); + void setup(); + + KOKKOS_INLINE_FUNCTION + void getMixingWeights(int, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &, double &) const; + + template + void getMixingWeightsVect(const int, int, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &, ArrayT &) const; + + KOKKOS_INLINE_FUNCTION + void exponentScaling(double, double &, double &) const; + + KOKKOS_INLINE_FUNCTION + void polynomialScaling(double, double &, double &, double &) const; + + double s_coeffAlpha[6],s_coeffEps[6],s_coeffRm[6]; + + KOKKOS_INLINE_FUNCTION + double func_rin(const double &) const; + + KOKKOS_INLINE_FUNCTION + double expValue(const double) const; + + friend void pair_virial_fdotr_compute(PairExp6rxKokkos*); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: alpha_ij is 6.0 in pair exp6 + +Self-explanatory + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: PairExp6rxKokkos requires a fix rx command + +The fix rx command must come before the pair style command in the input file + +E: There are no rx species specified + +There must be at least one species specified through the fix rx command + +E: Site1 name not recognized in pair coefficients + +The site1 keyword does not match the species keywords specified throug the fix rx command + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Cannot open exp6/rx potential file %s + +Self-explanatory + +E: Incorrect format in exp6/rx potential file + +Self-explanatory + +E: Illegal exp6/rx parameters. Rm and Epsilon must be greater than zero. Alpha cannot be negative. + +Self-explanatory + +E: Illegal exp6/rx parameters. Interaction potential does not exist. + +Self-explanatory + +E: Potential file has duplicate entry. + +Self-explanatory + +E: The number of molecules in CG particle is less than 10*DBL_EPSILON. + +Self-explanatory. Check the species concentrations have been properly set +and check the reaction kinetic solver parameters in fix rx to more for +sufficient accuracy. + + +*/ diff --git a/src/KOKKOS/pair_hybrid_kokkos.cpp b/src/KOKKOS/pair_hybrid_kokkos.cpp new file mode 100644 index 0000000000..db757f6ce1 --- /dev/null +++ b/src/KOKKOS/pair_hybrid_kokkos.cpp @@ -0,0 +1,160 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_hybrid_kokkos.h" +#include "atom_kokkos.h" +#include "force.h" +#include "pair.h" +#include "neighbor.h" +#include "neigh_request.h" +#include "update.h" +#include "comm.h" +#include "memory_kokkos.h" +#include "error.h" +#include "respa.h" +#include "atom_masks.h" +#include "kokkos.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairHybridKokkos::PairHybridKokkos(LAMMPS *lmp) : PairHybrid(lmp) +{ + atomKK = (AtomKokkos *) atom; + + // prevent overlapping host/device computation, which isn't + // yet supported by pair_hybrid_kokkos + execution_space = Device; + + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; +} + +/* ---------------------------------------------------------------------- */ + +PairHybridKokkos::~PairHybridKokkos() +{ + +} + +/* ---------------------------------------------------------------------- + call each sub-style's compute() or compute_outer() function + accumulate sub-style global/peratom energy/virial in hybrid + for global vflag = 1: + each sub-style computes own virial[6] + sum sub-style virial[6] to hybrid's virial[6] + for global vflag = 2: + call sub-style with adjusted vflag to prevent it calling + virial_fdotr_compute() + hybrid calls virial_fdotr_compute() on final accumulated f +------------------------------------------------------------------------- */ + +void PairHybridKokkos::compute(int eflag, int vflag) +{ + int i,j,m,n; + + // if no_virial_fdotr_compute is set and global component of + // incoming vflag = 2, then + // reset vflag as if global component were 1 + // necessary since one or more sub-styles cannot compute virial as F dot r + + int neighflag = lmp->kokkos->neighflag; + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + if (no_virial_fdotr_compute && vflag % 4 == 2) vflag = 1 + vflag/4 * 4; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + // check if global component of incoming vflag = 2 + // if so, reset vflag passed to substyle as if it were 0 + // necessary so substyle will not invoke virial_fdotr_compute() + + int vflag_substyle; + if (vflag % 4 == 2) vflag_substyle = vflag/4 * 4; + else vflag_substyle = vflag; + + double *saved_special = save_special(); + + // check if we are running with r-RESPA using the hybrid keyword + + Respa *respa = NULL; + respaflag = 0; + if (strstr(update->integrate_style,"respa")) { + respa = (Respa *) update->integrate; + if (respa->nhybrid_styles > 0) respaflag = 1; + } + + for (m = 0; m < nstyles; m++) { + + set_special(m); + + if (!respaflag || (respaflag && respa->hybrid_compute[m])) { + + // invoke compute() unless compute flag is turned off or + // outerflag is set and sub-style has a compute_outer() method + + if (styles[m]->compute_flag == 0) continue; + atomKK->sync(styles[m]->execution_space,styles[m]->datamask_read); + if (outerflag && styles[m]->respa_enable) + styles[m]->compute_outer(eflag,vflag_substyle); + else styles[m]->compute(eflag,vflag_substyle); + atomKK->modified(styles[m]->execution_space,styles[m]->datamask_modify); + } + + restore_special(saved_special); + + // jump to next sub-style if r-RESPA does not want global accumulated data + + if (respaflag && !respa->tally_global) continue; + + if (eflag_global) { + eng_vdwl += styles[m]->eng_vdwl; + eng_coul += styles[m]->eng_coul; + } + if (vflag_global) { + for (n = 0; n < 6; n++) virial[n] += styles[m]->virial[n]; + } + if (eflag_atom) { + n = atom->nlocal; + if (force->newton_pair) n += atom->nghost; + double *eatom_substyle = styles[m]->eatom; + for (i = 0; i < n; i++) eatom[i] += eatom_substyle[i]; + } + if (vflag_atom) { + n = atom->nlocal; + if (force->newton_pair) n += atom->nghost; + double **vatom_substyle = styles[m]->vatom; + for (i = 0; i < n; i++) + for (j = 0; j < 6; j++) + vatom[i][j] += vatom_substyle[i][j]; + } + } + + delete [] saved_special; + + // perform virial_fdotr on device + + atomKK->sync(Device,X_MASK|F_MASK); + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + + if (vflag_fdotr) + pair_virial_fdotr_compute(this); +} diff --git a/src/KOKKOS/pair_hybrid_kokkos.h b/src/KOKKOS/pair_hybrid_kokkos.h new file mode 100644 index 0000000000..62d325925b --- /dev/null +++ b/src/KOKKOS/pair_hybrid_kokkos.h @@ -0,0 +1,118 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(hybrid/kk,PairHybridKokkos) + +#else + +#ifndef LMP_PAIR_HYBRID_KOKKOS_H +#define LMP_PAIR_HYBRID_KOKKOS_H + +#include +#include "pair_hybrid.h" +#include "pair_kokkos.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +class PairHybridKokkos : public PairHybrid { + friend class FixGPU; + friend class FixIntel; + friend class FixOMP; + friend class Force; + friend class Respa; + friend class Info; + public: + typedef LMPDeviceType device_type; + + PairHybridKokkos(class LAMMPS *); + virtual ~PairHybridKokkos(); + void compute(int, int); + + private: + DAT::t_x_array_randomread x; + DAT::t_f_array f; + friend void pair_virial_fdotr_compute(PairHybridKokkos*); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Pair style hybrid cannot have hybrid as an argument + +Self-explanatory. + +E: Pair style hybrid cannot have none as an argument + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair coeff for hybrid has invalid style + +Style in pair coeff must have been listed in pair_style command. + +E: Pair hybrid sub-style is not used + +No pair_coeff command used a sub-style specified in the pair_style +command. + +E: Pair_modify special setting for pair hybrid incompatible with global special_bonds setting + +Cannot override a setting of 0.0 or 1.0 or change a setting between +0.0 and 1.0. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Invoked pair single on pair style none + +A command (e.g. a dump) attempted to invoke the single() function on a +pair style none, which is illegal. You are probably attempting to +compute per-atom quantities with an undefined pair style. + +E: Pair hybrid sub-style does not support single call + +You are attempting to invoke a single() call on a pair style +that doesn't support it. + +E: Pair hybrid single calls do not support per sub-style special bond values + +Self-explanatory. + +E: Unknown pair_modify hybrid sub-style + +The choice of sub-style is unknown. + +E: Coulomb cutoffs of pair hybrid sub-styles do not match + +If using a Kspace solver, all Coulomb cutoffs of long pair styles must +be the same. + +*/ diff --git a/src/KOKKOS/pair_hybrid_overlay_kokkos.cpp b/src/KOKKOS/pair_hybrid_overlay_kokkos.cpp new file mode 100644 index 0000000000..aa5d895155 --- /dev/null +++ b/src/KOKKOS/pair_hybrid_overlay_kokkos.cpp @@ -0,0 +1,107 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_hybrid_overlay_kokkos.h" +#include "atom.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_request.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairHybridOverlayKokkos::PairHybridOverlayKokkos(LAMMPS *lmp) : PairHybridKokkos(lmp) {} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairHybridOverlayKokkos::coeff(int narg, char **arg) +{ + if (narg < 3) error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + // 3rd arg = pair sub-style name + // 4th arg = pair sub-style index if name used multiple times + // allow for "none" as valid sub-style name + + int multflag; + int m; + + for (m = 0; m < nstyles; m++) { + multflag = 0; + if (strcmp(arg[2],keywords[m]) == 0) { + if (multiple[m]) { + multflag = 1; + if (narg < 4) error->all(FLERR,"Incorrect args for pair coefficients"); + if (!isdigit(arg[3][0])) + error->all(FLERR,"Incorrect args for pair coefficients"); + int index = force->inumeric(FLERR,arg[3]); + if (index == multiple[m]) break; + else continue; + } else break; + } + } + + int none = 0; + if (m == nstyles) { + if (strcmp(arg[2],"none") == 0) none = 1; + else error->all(FLERR,"Pair coeff for hybrid has invalid style"); + } + + // move 1st/2nd args to 2nd/3rd args + // if multflag: move 1st/2nd args to 3rd/4th args + // just copy ptrs, since arg[] points into original input line + + arg[2+multflag] = arg[1]; + arg[1+multflag] = arg[0]; + + // invoke sub-style coeff() starting with 1st remaining arg + + if (!none) styles[m]->coeff(narg-1-multflag,&arg[1+multflag]); + + // set setflag and which type pairs map to which sub-style + // if sub-style is none: set hybrid subflag, wipe out map + // else: set hybrid setflag & map only if substyle setflag is set + // if sub-style is new for type pair, add as multiple mapping + // if sub-style exists for type pair, don't add, just update coeffs + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + if (none) { + setflag[i][j] = 1; + nmap[i][j] = 0; + count++; + } else if (styles[m]->setflag[i][j]) { + int k; + for (k = 0; k < nmap[i][j]; k++) + if (map[i][j][k] == m) break; + if (k == nmap[i][j]) map[i][j][nmap[i][j]++] = m; + setflag[i][j] = 1; + count++; + } + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} diff --git a/src/KOKKOS/pair_hybrid_overlay_kokkos.h b/src/KOKKOS/pair_hybrid_overlay_kokkos.h new file mode 100644 index 0000000000..6bec57c453 --- /dev/null +++ b/src/KOKKOS/pair_hybrid_overlay_kokkos.h @@ -0,0 +1,49 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(hybrid/overlay/kk,PairHybridOverlayKokkos) + +#else + +#ifndef LMP_PAIR_HYBRID_OVERLAY_KOKKOS_H +#define LMP_PAIR_HYBRID_OVERLAY_KOKKOS_H + +#include "pair_hybrid_kokkos.h" + +namespace LAMMPS_NS { + +class PairHybridOverlayKokkos : public PairHybridKokkos { + public: + PairHybridOverlayKokkos(class LAMMPS *); + virtual ~PairHybridOverlayKokkos() {} + void coeff(int, char **); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair coeff for hybrid has invalid style + +Style in pair coeff must have been listed in pair_style command. + +*/ diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index b0614a934b..6257566ba7 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -20,6 +20,7 @@ #include "Kokkos_Macros.hpp" #include "pair.h" +#include "neighbor_kokkos.h" #include "neigh_list_kokkos.h" #include "Kokkos_Vectorization.hpp" @@ -246,8 +247,8 @@ struct PairComputeFunctor { if (EFLAG) { if (c.eflag_atom) { const E_FLOAT epairhalf = 0.5 * epair; - if (NEWTON_PAIR || i < c.nlocal) c.d_eatom[i] += epairhalf; - if ((NEWTON_PAIR || j < c.nlocal) && NEIGHFLAG != FULL) c.d_eatom[j] += epairhalf; + if (NEWTON_PAIR || i < c.nlocal) eatom[i] += epairhalf; + if ((NEWTON_PAIR || j < c.nlocal) && NEIGHFLAG != FULL) eatom[j] += epairhalf; } } @@ -298,20 +299,20 @@ struct PairComputeFunctor { if (c.vflag_atom) { if (NEWTON_PAIR || i < c.nlocal) { - c.d_vatom(i,0) += 0.5*v0; - c.d_vatom(i,1) += 0.5*v1; - c.d_vatom(i,2) += 0.5*v2; - c.d_vatom(i,3) += 0.5*v3; - c.d_vatom(i,4) += 0.5*v4; - c.d_vatom(i,5) += 0.5*v5; + vatom(i,0) += 0.5*v0; + vatom(i,1) += 0.5*v1; + vatom(i,2) += 0.5*v2; + vatom(i,3) += 0.5*v3; + vatom(i,4) += 0.5*v4; + vatom(i,5) += 0.5*v5; } if ((NEWTON_PAIR || j < c.nlocal) && NEIGHFLAG != FULL) { - c.d_vatom(j,0) += 0.5*v0; - c.d_vatom(j,1) += 0.5*v1; - c.d_vatom(j,2) += 0.5*v2; - c.d_vatom(j,3) += 0.5*v3; - c.d_vatom(j,4) += 0.5*v4; - c.d_vatom(j,5) += 0.5*v5; + vatom(j,0) += 0.5*v0; + vatom(j,1) += 0.5*v1; + vatom(j,2) += 0.5*v2; + vatom(j,3) += 0.5*v3; + vatom(j,4) += 0.5*v4; + vatom(j,5) += 0.5*v5; } } } @@ -513,6 +514,7 @@ EV_FLOAT pair_compute (PairStyle* fpair, NeighListKokkos struct PairVirialFDotRCompute { + typedef DeviceType device_type; typedef ArrayTypes AT; typedef EV_FLOAT value_type; typename AT::t_x_array_const_um x; diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp index c00b1fbae4..7d395cb3b4 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -73,8 +73,8 @@ template PairLJCharmmCoulCharmmImplicitKokkos::~PairLJCharmmCoulCharmmImplicitKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_ljsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); @@ -118,13 +118,13 @@ void PairLJCharmmCoulCharmmImplicitKokkos::compute(int eflag_in, int // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -315,18 +315,18 @@ void PairLJCharmmCoulCharmmImplicitKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); //memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCharmmCoulCharmmImplicit::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp index c88c7db2e3..2663d71a1f 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -73,8 +73,8 @@ template PairLJCharmmCoulCharmmKokkos::~PairLJCharmmCoulCharmmKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_ljsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); @@ -118,13 +118,13 @@ void PairLJCharmmCoulCharmmKokkos::compute(int eflag_in, int vflag_i // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -316,18 +316,18 @@ void PairLJCharmmCoulCharmmKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); //memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCharmmCoulCharmm::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp index 8ebc5f87f3..81271c7d8a 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -73,8 +73,8 @@ template PairLJCharmmCoulLongKokkos::~PairLJCharmmCoulLongKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_ljsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); @@ -118,13 +118,13 @@ void PairLJCharmmCoulLongKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -336,18 +336,18 @@ void PairLJCharmmCoulLongKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); //memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCharmmCoulLong::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp index 936eae79d5..3f355b1b16 100644 --- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -60,9 +60,9 @@ template PairLJClass2CoulCutKokkos::~PairLJClass2CoulCutKokkos() { if (!copymode) { - memory->destroy_kokkos(k_cutsq, cutsq); - memory->destroy_kokkos(k_cut_ljsq, cut_ljsq); - memory->destroy_kokkos(k_cut_coulsq, cut_coulsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq); + memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq); } } @@ -95,13 +95,13 @@ void PairLJClass2CoulCutKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -255,16 +255,16 @@ void PairLJClass2CoulCutKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); memory->destroy(cut_coulsq); - memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJClass2CoulCut::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp index 268213cdbc..47976ec610 100644 --- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -69,8 +69,8 @@ template PairLJClass2CoulLongKokkos::~PairLJClass2CoulLongKokkos() { if (!copymode){ - memory->destroy_kokkos(k_cutsq, cutsq); - memory->destroy_kokkos(k_cut_ljsq, cut_ljsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq); } } @@ -103,13 +103,13 @@ void PairLJClass2CoulLongKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -307,16 +307,16 @@ void PairLJClass2CoulLongKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJClass2CoulLong::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_lj_class2_kokkos.cpp b/src/KOKKOS/pair_lj_class2_kokkos.cpp index c899327d7c..5beb520c00 100644 --- a/src/KOKKOS/pair_lj_class2_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -95,13 +95,13 @@ void PairLJClass2Kokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -200,10 +200,10 @@ void PairLJClass2Kokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairLJClass2::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp index f4de48f176..86e37bea77 100644 --- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -60,9 +60,9 @@ template PairLJCutCoulCutKokkos::~PairLJCutCoulCutKokkos() { if (allocated){ - memory->destroy_kokkos(k_cutsq, cutsq); - memory->destroy_kokkos(k_cut_ljsq, cut_ljsq); - memory->destroy_kokkos(k_cut_coulsq, cut_coulsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq); + memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq); } } @@ -95,13 +95,13 @@ void PairLJCutCoulCutKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -247,16 +247,16 @@ void PairLJCutCoulCutKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); memory->destroy(cut_coulsq); - memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCutCoulCut::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp index ad51dd0a88..76e488c686 100644 --- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -64,9 +64,9 @@ template PairLJCutCoulDebyeKokkos::~PairLJCutCoulDebyeKokkos() { if (!copymode) { - memory->destroy_kokkos(k_cutsq, cutsq); - memory->destroy_kokkos(k_cut_ljsq, cut_ljsq); - memory->destroy_kokkos(k_cut_coulsq, cut_coulsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq); + memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq); } } @@ -99,13 +99,13 @@ void PairLJCutCoulDebyeKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -261,16 +261,16 @@ void PairLJCutCoulDebyeKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); memory->destroy(cut_coulsq); - memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCutCoulDebye::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp index 89f263113e..0da5e7f5f5 100644 --- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -72,9 +72,9 @@ template PairLJCutCoulDSFKokkos::~PairLJCutCoulDSFKokkos() { if (!copymode) { - memory->destroy_kokkos(k_cutsq, cutsq); - memory->destroy_kokkos(k_cut_ljsq, cut_ljsq); - //memory->destroy_kokkos(k_cut_coulsq, cut_coulsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq); + //memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq); } } @@ -107,13 +107,13 @@ void PairLJCutCoulDSFKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -279,16 +279,16 @@ void PairLJCutCoulDSFKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); //memory->destroy(cut_coulsq); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCutCoulDSF::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp index 4de51ca8d2..77a604534e 100644 --- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -68,13 +68,13 @@ PairLJCutCoulLongKokkos::PairLJCutCoulLongKokkos(LAMMPS *lmp):PairLJ template PairLJCutCoulLongKokkos::~PairLJCutCoulLongKokkos() { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); eatom = NULL; vatom = NULL; if (allocated){ - memory->destroy_kokkos(k_cutsq, cutsq); - memory->destroy_kokkos(k_cut_ljsq, cut_ljsq); + memoryKK->destroy_kokkos(k_cutsq, cutsq); + memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq); } } @@ -108,13 +108,13 @@ void PairLJCutCoulLongKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -304,16 +304,16 @@ void PairLJCutCoulLongKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJCutCoulLong::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_lj_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_kokkos.cpp index ea78b73711..2a228fb168 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -57,8 +57,8 @@ template PairLJCutKokkos::~PairLJCutKokkos() { if (allocated) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); memory->sfree(cutsq); eatom = NULL; @@ -95,13 +95,13 @@ void PairLJCutKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -195,10 +195,10 @@ void PairLJCutKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairLJCut::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_expand_kokkos.cpp b/src/KOKKOS/pair_lj_expand_kokkos.cpp index 6b62150632..aca7202b78 100644 --- a/src/KOKKOS/pair_lj_expand_kokkos.cpp +++ b/src/KOKKOS/pair_lj_expand_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -94,13 +94,13 @@ void PairLJExpandKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -202,10 +202,10 @@ void PairLJExpandKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairLJExpand::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp index 0c492131dd..bf269288e0 100644 --- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -64,8 +64,8 @@ template PairLJGromacsCoulGromacsKokkos::~PairLJGromacsCoulGromacsKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_ljsq = DAT::tdual_ffloat_2d(); k_cut_coulsq = DAT::tdual_ffloat_2d(); @@ -109,13 +109,13 @@ void PairLJGromacsCoulGromacsKokkos::compute(int eflag_in, int vflag // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -299,18 +299,18 @@ void PairLJGromacsCoulGromacsKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); //memory->destroy(cut_ljsq); - memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq"); d_cut_ljsq = k_cut_ljsq.template view(); - memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); + memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq"); d_cut_coulsq = k_cut_coulsq.template view(); k_params = Kokkos::DualView("PairLJGromacsCoulGromacs::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } template diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp index 76d7abbe28..f24ff718c1 100644 --- a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -64,8 +64,8 @@ template PairLJGromacsKokkos::~PairLJGromacsKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); k_cut_inner_sq = DAT::tdual_ffloat_2d(); memory->sfree(cutsq); @@ -106,13 +106,13 @@ void PairLJGromacsKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -240,19 +240,19 @@ void PairLJGromacsKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); memory->destroy(cut_inner); - memory->create_kokkos(k_cut_inner,cut_inner,n+1,n+1,"pair:cut_inner"); + memoryKK->create_kokkos(k_cut_inner,cut_inner,n+1,n+1,"pair:cut_inner"); d_cut_inner = k_cut_inner.template view(); memory->destroy(cut_inner_sq); - memory->create_kokkos(k_cut_inner_sq,cut_inner_sq,n+1,n+1,"pair:cut_inner_sq"); + memoryKK->create_kokkos(k_cut_inner_sq,cut_inner_sq,n+1,n+1,"pair:cut_inner_sq"); d_cut_inner_sq = k_cut_inner_sq.template view(); k_params = Kokkos::DualView("PairLJGromacs::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.cpp b/src/KOKKOS/pair_lj_sdk_kokkos.cpp index 41561c2988..aa579d5dc1 100644 --- a/src/KOKKOS/pair_lj_sdk_kokkos.cpp +++ b/src/KOKKOS/pair_lj_sdk_kokkos.cpp @@ -27,7 +27,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -94,13 +94,13 @@ void PairLJSDKKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -231,10 +231,10 @@ void PairLJSDKKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairLJSDK::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_morse_kokkos.cpp b/src/KOKKOS/pair_morse_kokkos.cpp index 3201fad215..5768d7e42c 100644 --- a/src/KOKKOS/pair_morse_kokkos.cpp +++ b/src/KOKKOS/pair_morse_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -61,8 +61,8 @@ template PairMorseKokkos::~PairMorseKokkos() { if (allocated) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); k_cutsq = DAT::tdual_ffloat_2d(); memory->sfree(cutsq); eatom = NULL; @@ -99,13 +99,13 @@ void PairMorseKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -209,10 +209,10 @@ void PairMorseKokkos::allocate() int n = atom->ntypes; memory->destroy(cutsq); - memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); d_cutsq = k_cutsq.template view(); k_params = Kokkos::DualView("PairMorse::params",n+1,n+1); - params = k_params.d_view; + params = k_params.template view(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp new file mode 100644 index 0000000000..0961cf44eb --- /dev/null +++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp @@ -0,0 +1,999 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------------------------- + Contributing authors: + Stan Moore (Sandia) + + Please cite the related publications: + J.D. Moore, B.C. Barnes, S. Izvekov, M. Lisal, M.S. Sellers, D.E. Taylor & J.K. Brennan + "A coarse-grain force field for RDX: Density dependent and energy conserving" + The Journal of Chemical Physics, 2016, 144, 104501. +------------------------------------------------------------------------------------------- */ + +#include +#include +#include "math_const.h" +#include +#include +#include "pair_multi_lucy_rx_kokkos.h" +#include "atom_kokkos.h" +#include "force.h" +#include "comm.h" +#include "neigh_list.h" +#include "memory_kokkos.h" +#include "error.h" +#include "citeme.h" +#include "modify.h" +#include "fix.h" +#include "atom_masks.h" +#include "neigh_request.h" +#include "kokkos.h" + +using namespace LAMMPS_NS; + +enum{NONE,RLINEAR,RSQ}; + +#define MAXLINE 1024 + +#ifdef DBL_EPSILON + #define MY_EPSILON (10.0*DBL_EPSILON) +#else + #define MY_EPSILON (10.0*2.220446049250313e-16) +#endif + +#define oneFluidParameter (-1) +#define isOneFluid(_site) ( (_site) == oneFluidParameter ) + +/* ---------------------------------------------------------------------- */ + +template +PairMultiLucyRXKokkos::PairMultiLucyRXKokkos(LAMMPS *lmp) : PairMultiLucyRX(lmp) +{ + respa_enable = 0; + + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + update_table = 1; + h_table = new TableHost(); + d_table = new TableDevice(); + + k_error_flag = DAT::tdual_int_scalar("pair:error_flag"); +} + +/* ---------------------------------------------------------------------- */ + +template +PairMultiLucyRXKokkos::~PairMultiLucyRXKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + + memoryKK->destroy_kokkos(k_cutsq,cutsq); + + delete h_table; + delete d_table; + tabindex = NULL; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::init_style() +{ + PairMultiLucyRX::init_style(); + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with multi/lucy/rx/kk"); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::compute(int eflag_in, int vflag_in) +{ + copymode = 1; + + if (update_table) + create_kokkos_tables(); + + if (tabstyle == LOOKUP) + compute_style(eflag_in,vflag_in); + else if(tabstyle == LINEAR) + compute_style(eflag_in,vflag_in); + + copymode = 0; +} + +/* ---------------------------------------------------------------------- */ + +template +template +void PairMultiLucyRXKokkos::compute_style(int eflag_in, int vflag_in) +{ + eflag = eflag_in; + vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.template view(); + } + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + rho = atomKK->k_rho.view(); + uCG = atomKK->k_uCG.view(); + uCGnew = atomKK->k_uCGnew.view(); + dvector = atomKK->k_dvector.view(); + + atomKK->sync(execution_space,X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK | DPDRHO_MASK | UCG_MASK | UCGNEW_MASK | DVECTOR_MASK); + k_cutsq.template sync(); + + nlocal = atom->nlocal; + int nghost = atom->nghost; + int newton_pair = force->newton_pair; + + { + const int ntotal = nlocal + nghost; + if (ntotal > d_mixWtSite1.dimension_0()) { + d_mixWtSite1old = typename AT::t_float_1d("PairMultiLucyRX::mixWtSite1old",ntotal); + d_mixWtSite2old = typename AT::t_float_1d("PairMultiLucyRX::mixWtSite2old",ntotal); + d_mixWtSite1 = typename AT::t_float_1d("PairMultiLucyRX::mixWtSite1",ntotal); + d_mixWtSite2 = typename AT::t_float_1d("PairMultiLucyRX::mixWtSite2",ntotal); + } + + Kokkos::parallel_for(Kokkos::RangePolicy(0,ntotal),*this); + } + + const int inum = list->inum; + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + + computeLocalDensity(); + + // loop over neighbors of my atoms + + EV_FLOAT ev; + + if (neighflag == HALF) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == HALFTHREAD) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } else if (neighflag == FULL) { + if (newton_pair) { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else { + if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + } + + if (evflag) atomKK->modified(execution_space,F_MASK | ENERGY_MASK | VIRIAL_MASK | UCG_MASK | UCGNEW_MASK); + else atomKK->modified(execution_space,F_MASK | UCG_MASK | UCGNEW_MASK); + + k_error_flag.template modify(); + k_error_flag.template sync(); + if (k_error_flag.h_view() == 1) + error->one(FLERR,"Density < table inner cutoff"); + else if (k_error_flag.h_view() == 2) + error->one(FLERR,"Density > table outer cutoff"); + else if (k_error_flag.h_view() == 3) + error->one(FLERR,"Only LOOKUP and LINEAR table styles have been implemented for pair multi/lucy/rx"); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } +} + +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXgetMixingWeights, const int &i) const { + getMixingWeights(i, d_mixWtSite1old[i], d_mixWtSite2old[i], d_mixWtSite1[i], d_mixWtSite2[i]); +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXCompute, const int &ii, EV_FLOAT& ev) const { + + // The f array is atomic for Half/Thread neighbor style + Kokkos::View::value> > a_f = f; + + int i,jj,jnum,itype,jtype,itable; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,evdwlOld,fpair; + double rsq; + + double mixWtSite1old_i,mixWtSite1old_j; + double mixWtSite2old_i,mixWtSite2old_j; + double mixWtSite1_i; + + double pi = MathConst::MY_PI; + double A_i, A_j; + double fraction_i,fraction_j; + int jtable; + + int tlm1 = tablength - 1; + + i = d_ilist[ii]; + xtmp = x(i,0); + ytmp = x(i,1); + ztmp = x(i,2); + itype = type[i]; + jnum = d_numneigh[i]; + + double fx_i = 0.0; + double fy_i = 0.0; + double fz_i = 0.0; + + mixWtSite1old_i = d_mixWtSite1old[i]; + mixWtSite2old_i = d_mixWtSite2old[i]; + mixWtSite1_i = d_mixWtSite1[i]; + + for (jj = 0; jj < jnum; jj++) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + + delx = xtmp - x(j,0); + dely = ytmp - x(j,1); + delz = ztmp - x(j,2); + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < d_cutsq(itype,jtype)) { // optimize + fpair = 0.0; + + mixWtSite1old_j = d_mixWtSite1old[j]; + mixWtSite2old_j = d_mixWtSite2old[j]; + + //tb = &tables[tabindex[itype][jtype]]; + const int tidx = d_table_const.tabindex(itype,jtype); + + //if (rho[i]*rho[i] < tb->innersq || rho[j]*rho[j] < tb->innersq){ + if (rho[i]*rho[i] < d_table_const.innersq(tidx) || rho[j]*rho[j] < d_table_const.innersq(tidx)){ + k_error_flag.template view()() = 1; + } + + if (TABSTYLE == LOOKUP) { + //itable = static_cast (((rho[i]*rho[i]) - tb->innersq) * tb->invdelta); + itable = static_cast (((rho[i]*rho[i]) - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + //jtable = static_cast (((rho[j]*rho[j]) - tb->innersq) * tb->invdelta); + jtable = static_cast (((rho[j]*rho[j]) - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + if (itable >= tlm1 || jtable >= tlm1){ + k_error_flag.template view()() = 2; + } + //A_i = tb->f[itable]; + A_i = d_table_const.f(tidx,itable); + //A_j = tb->f[jtable]; + A_j = d_table_const.f(tidx,jtable); + + const double rfactor = 1.0-sqrt(rsq/d_cutsq(itype,jtype)); + fpair = 0.5*(A_i + A_j)*(4.0-3.0*rfactor)*rfactor*rfactor*rfactor; + fpair /= sqrt(rsq); + + } else if (TABSTYLE == LINEAR) { + + //itable = static_cast ((rho[i]*rho[i] - tb->innersq) * tb->invdelta); + itable = static_cast ((rho[i]*rho[i] - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + //jtable = static_cast (((rho[j]*rho[j]) - tb->innersq) * tb->invdelta); + jtable = static_cast ((rho[j]*rho[j] - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + if (itable >= tlm1 || jtable >= tlm1){ + k_error_flag.template view()() = 2; + } + if(itable<0) itable=0; + if(itable>=tlm1) itable=tlm1; + if(jtable<0) jtable=0; + if(jtable>=tlm1)jtable=tlm1; + + //fraction_i = (((rho[i]*rho[i]) - tb->rsq[itable]) * tb->invdelta); + fraction_i = (((rho[i]*rho[i]) - d_table_const.rsq(tidx,itable)) * d_table_const.invdelta(tidx)); + //fraction_j = (((rho[j]*rho[j]) - tb->rsq[jtable]) * tb->invdelta); + fraction_j = (((rho[j]*rho[j]) - d_table_const.rsq(tidx,jtable)) * d_table_const.invdelta(tidx)); + if(itable==0) fraction_i=0.0; + if(itable==tlm1) fraction_i=0.0; + if(jtable==0) fraction_j=0.0; + if(jtable==tlm1) fraction_j=0.0; + + //A_i = tb->f[itable] + fraction_i*tb->df[itable]; + A_i = d_table_const.f(tidx,itable) + fraction_i*d_table_const.df(tidx,itable); + //A_j = tb->f[jtable] + fraction_j*tb->df[jtable]; + A_j = d_table_const.f(tidx,jtable) + fraction_j*d_table_const.df(tidx,jtable); + + const double rfactor = 1.0-sqrt(rsq/d_cutsq(itype,jtype)); + fpair = 0.5*(A_i + A_j)*(4.0-3.0*rfactor)*rfactor*rfactor*rfactor; + fpair /= sqrt(rsq); + + } else k_error_flag.template view()() = 3; + + if (isite1 == isite2) fpair = sqrt(mixWtSite1old_i*mixWtSite2old_j)*fpair; + else fpair = (sqrt(mixWtSite1old_i*mixWtSite2old_j) + sqrt(mixWtSite2old_i*mixWtSite1old_j))*fpair; + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) { + a_f(j,0) -= delx*fpair; + a_f(j,1) -= dely*fpair; + a_f(j,2) -= delz*fpair; + } + //if (evflag) ev_tally(i,j,nlocal,newton_pair,0.0,0.0,fpair,delx,dely,delz); + if (EVFLAG) this->template ev_tally(ev,i,j,0.0,fpair,delx,dely,delz); + } + } + + a_f(i,0) += fx_i; + a_f(i,1) += fy_i; + a_f(i,2) += fz_i; + + //tb = &tables[tabindex[itype][itype]]; + const int tidx = d_table_const.tabindex(itype,itype); + //itable = static_cast (((rho[i]*rho[i]) - tb->innersq) * tb->invdelta); + itable = static_cast (((rho[i]*rho[i]) - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + //if (TABSTYLE == LOOKUP) evdwl = tb->e[itable]; + if (TABSTYLE == LOOKUP) { + evdwl = d_table_const.e(tidx,itable); + } else if (TABSTYLE == LINEAR) { + if (itable >= tlm1){ + k_error_flag.template view()() = 2; + } + if(itable==0) fraction_i=0.0; + //else fraction_i = (((rho[i]*rho[i]) - tb->rsq[itable]) * tb->invdelta); + else fraction_i = (((rho[i]*rho[i]) - d_table_const.rsq(tidx,itable)) * d_table_const.invdelta(tidx)); + //evdwl = tb->e[itable] + fraction_i*tb->de[itable]; + evdwl = d_table_const.e(tidx,itable) + fraction_i*d_table_const.de(tidx,itable); + } else k_error_flag.template view()() = 3; + + evdwl *=(pi*d_cutsq(itype,itype)*d_cutsq(itype,itype))/84.0; + evdwlOld = mixWtSite1old_i*evdwl; + evdwl = mixWtSite1_i*evdwl; + + uCG[i] += evdwlOld; + uCGnew[i] += evdwl; + + evdwl = evdwlOld; + + //if (evflag) ev_tally(0,0,nlocal,newton_pair,evdwl,0.0,0.0,0.0,0.0,0.0); + if (EVFLAG) + ev.evdwl += ((/*FIXME??? (NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && */ NEWTON_PAIR)?1.0:0.5)*evdwl; +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXCompute, const int &ii) const { + EV_FLOAT ev; + this->template operator()(TagPairMultiLucyRXCompute(), ii, ev); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::computeLocalDensity() +{ + x = atomKK->k_x.view(); + type = atomKK->k_type.view(); + rho = atomKK->k_rho.view(); + h_rho = atomKK->k_rho.h_view; + nlocal = atom->nlocal; + + atomKK->sync(execution_space,X_MASK | TYPE_MASK | DPDRHO_MASK); + + const int inum = list->inum; + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + + const double pi = MathConst::MY_PI; + + const bool newton_pair = force->newton_pair; + const bool one_type = (atom->ntypes == 1); + + // Special cut-off values for when there's only one type. + cutsq_type11 = cutsq[1][1]; + rcut_type11 = sqrt(cutsq_type11); + factor_type11 = 84.0/(5.0*pi*rcut_type11*rcut_type11*rcut_type11); + + // zero out density + int m = nlocal; + if (newton_pair) m += atom->nghost; + Kokkos::parallel_for(Kokkos::RangePolicy(0,m),*this); + + // rho = density at each atom + // loop over neighbors of my atoms + + if (neighflag == HALF) { + if (newton_pair) + if (one_type) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + if (one_type) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else if (neighflag == HALFTHREAD) { + if (newton_pair) + if (one_type) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + if (one_type) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } else if (neighflag == FULL) { + if (newton_pair) + if (one_type) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + if (one_type) + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + else + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + } + + atomKK->modified(execution_space,DPDRHO_MASK); + + // communicate and sum densities (on the host) + + if (newton_pair) + comm->reverse_comm_pair(this); + + comm->forward_comm_pair(this); +} + +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXZero, const int &i) const { + rho[i] = 0.0; +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXComputeLocalDensity, const int &ii) const { + + + // The rho array is atomic for Half/Thread neighbor style + Kokkos::View::value> > a_rho = rho; + + const int i = d_ilist[ii]; + + const double xtmp = x(i,0); + const double ytmp = x(i,1); + const double ztmp = x(i,2); + + double rho_i_contrib = 0.0; + + const int itype = type[i]; + const int jnum = d_numneigh[i]; + + const double pi = MathConst::MY_PI; + + for (int jj = 0; jj < jnum; jj++){ + const int j = (d_neighbors(i,jj) & NEIGHMASK); + const int jtype = type[j]; + + const double delx = xtmp - x(j,0); + const double dely = ytmp - x(j,1); + const double delz = ztmp - x(j,2); + const double rsq = delx*delx + dely*dely + delz*delz; + + if (ONE_TYPE) { + if (rsq < cutsq_type11) { + const double rcut = rcut_type11; + const double r_over_rcut = sqrt(rsq) / rcut; + const double tmpFactor = 1.0 - r_over_rcut; + const double tmpFactor4 = tmpFactor*tmpFactor*tmpFactor*tmpFactor; + const double factor = factor_type11*(1.0 + 1.5*r_over_rcut)*tmpFactor4; + rho_i_contrib += factor; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + a_rho[j] += factor; + } + } else if (rsq < d_cutsq(itype,jtype)) { + const double rcut = sqrt(d_cutsq(itype,jtype)); + const double tmpFactor = 1.0-sqrt(rsq)/rcut; + const double tmpFactor4 = tmpFactor*tmpFactor*tmpFactor*tmpFactor; + const double factor = (84.0/(5.0*pi*rcut*rcut*rcut))*(1.0+3.0*sqrt(rsq)/(2.0*rcut))*tmpFactor4; + rho_i_contrib += factor; + if ((NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && (NEWTON_PAIR || j < nlocal)) + a_rho[j] += factor; + } + } + + a_rho[i] += rho_i_contrib; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::getMixingWeights(int id, double &mixWtSite1old, double &mixWtSite2old, double &mixWtSite1, double &mixWtSite2) const +{ + double fractionOFAold, fractionOFA; + double fractionOld1, fraction1; + double fractionOld2, fraction2; + double nMoleculesOFAold, nMoleculesOFA; + double nMoleculesOld1, nMolecules1; + double nMoleculesOld2, nMolecules2; + double nTotal, nTotalOld; + + + nTotal = 0.0; + nTotalOld = 0.0; + for (int ispecies = 0; ispecies < nspecies; ispecies++){ + nTotal += dvector(ispecies,id); + nTotalOld += dvector(ispecies+nspecies,id); + } + + if (isOneFluid(isite1) == false){ + nMoleculesOld1 = dvector(isite1+nspecies,id); + nMolecules1 = dvector(isite1,id); + fractionOld1 = nMoleculesOld1/nTotalOld; + fraction1 = nMolecules1/nTotal; + } + if (isOneFluid(isite2) == false){ + nMoleculesOld2 = dvector(isite2+nspecies,id); + nMolecules2 = dvector(isite2,id); + fractionOld2 = nMoleculesOld2/nTotalOld; + fraction2 = nMolecules2/nTotal; + } + + if (isOneFluid(isite1) || isOneFluid(isite2)){ + nMoleculesOFAold = 0.0; + nMoleculesOFA = 0.0; + fractionOFAold = 0.0; + fractionOFA = 0.0; + + for (int ispecies = 0; ispecies < nspecies; ispecies++){ + if (isite1 == ispecies || isite2 == ispecies) continue; + nMoleculesOFAold += dvector(ispecies+nspecies,id); + nMoleculesOFA += dvector(ispecies,id); + fractionOFAold += dvector(ispecies+nspecies,id) / nTotalOld; + fractionOFA += dvector(ispecies,id) / nTotal; + } + if (isOneFluid(isite1)){ + nMoleculesOld1 = 1.0-(nTotalOld-nMoleculesOFAold); + nMolecules1 = 1.0-(nTotal-nMoleculesOFA); + fractionOld1 = fractionOFAold; + fraction1 = fractionOFA; + } + if (isOneFluid(isite2)){ + nMoleculesOld2 = 1.0-(nTotalOld-nMoleculesOFAold); + nMolecules2 = 1.0-(nTotal-nMoleculesOFA); + fractionOld2 = fractionOFAold; + fraction2 = fractionOFA; + } + } + + if(fractionalWeighting){ + mixWtSite1old = fractionOld1; + mixWtSite1 = fraction1; + mixWtSite2old = fractionOld2; + mixWtSite2 = fraction2; + } else { + mixWtSite1old = nMoleculesOld1; + mixWtSite1 = nMolecules1; + mixWtSite2old = nMoleculesOld2; + mixWtSite2 = nMolecules2; + } +} + +/* ---------------------------------------------------------------------- */ + +template +int PairMultiLucyRXKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_int_2d k_sendlist, int iswap_in, DAT::tdual_xfloat_1d &buf, + int pbc_flag, int *pbc) +{ + atomKK->sync(execution_space,DPDRHO_MASK); + + d_sendlist = k_sendlist.view(); + iswap = iswap_in; + v_buf = buf.view(); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + return n; +} + +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXPackForwardComm, const int &i) const { + int j = d_sendlist(iswap, i); + v_buf[i] = rho[j]; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::unpack_forward_comm_kokkos(int n, int first_in, DAT::tdual_xfloat_1d &buf) +{ + first = first_in; + v_buf = buf.view(); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + + atomKK->modified(execution_space,DPDRHO_MASK); +} + +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::operator()(TagPairMultiLucyRXUnpackForwardComm, const int &i) const { + rho[i + first] = v_buf[i]; +} + +/* ---------------------------------------------------------------------- */ + +template +int PairMultiLucyRXKokkos::pack_forward_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) +{ + int i,j,m; + + atomKK->sync(Host,DPDRHO_MASK); + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = h_rho[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) h_rho[i] = buf[m++]; + + atomKK->modified(Host,DPDRHO_MASK); +} + +/* ---------------------------------------------------------------------- */ + +template +int PairMultiLucyRXKokkos::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + atomKK->sync(Host,DPDRHO_MASK); + + m = 0; + last = first + n; + for (i = first; i < last; i++) buf[m++] = h_rho[i]; + return m; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + h_rho[j] += buf[m++]; + } + + atomKK->modified(Host,DPDRHO_MASK); +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairMultiLucyRXKokkos::ev_tally(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, + const F_FLOAT &dely, const F_FLOAT &delz) const +{ + const int EFLAG = eflag; + const int VFLAG = vflag_either; + + // The eatom and vatom arrays are atomic for Half/Thread neighbor style + Kokkos::View::value> > v_eatom = k_eatom.view(); + Kokkos::View::value> > v_vatom = k_vatom.view(); + + if (EFLAG) { + if (eflag_atom) { + const E_FLOAT epairhalf = 0.5 * epair; + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) v_eatom[i] += epairhalf; + if (NEWTON_PAIR || j < nlocal) v_eatom[j] += epairhalf; + } else { + v_eatom[i] += epairhalf; + } + } + } + + if (VFLAG) { + const E_FLOAT v0 = delx*delx*fpair; + const E_FLOAT v1 = dely*dely*fpair; + const E_FLOAT v2 = delz*delz*fpair; + const E_FLOAT v3 = delx*dely*fpair; + const E_FLOAT v4 = delx*delz*fpair; + const E_FLOAT v5 = dely*delz*fpair; + + if (vflag_global) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } else { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } + + if (vflag_atom) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + v_vatom(j,0) += 0.5*v0; + v_vatom(j,1) += 0.5*v1; + v_vatom(j,2) += 0.5*v2; + v_vatom(j,3) += 0.5*v3; + v_vatom(j,4) += 0.5*v4; + v_vatom(j,5) += 0.5*v5; + } + } else { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::create_kokkos_tables() +{ + const int tlm1 = tablength-1; + + memoryKK->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq"); + memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); + + if(tabstyle == LOOKUP) { + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f"); + } + + if(tabstyle == LINEAR) { + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); + memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de"); + memoryKK->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df"); + } + + for(int i=0; i < ntables; i++) { + Table* tb = &tables[i]; + + h_table->innersq[i] = tb->innersq; + h_table->invdelta[i] = tb->invdelta; + + for(int j = 0; jrsq.dimension_1(); j++) + h_table->rsq(i,j) = tb->rsq[j]; + for(int j = 0; je.dimension_1(); j++) + h_table->e(i,j) = tb->e[j]; + for(int j = 0; jde.dimension_1(); j++) + h_table->de(i,j) = tb->de[j]; + for(int j = 0; jf.dimension_1(); j++) + h_table->f(i,j) = tb->f[j]; + for(int j = 0; jdf.dimension_1(); j++) + h_table->df(i,j) = tb->df[j]; + } + + + Kokkos::deep_copy(d_table->innersq,h_table->innersq); + Kokkos::deep_copy(d_table->invdelta,h_table->invdelta); + Kokkos::deep_copy(d_table->rsq,h_table->rsq); + Kokkos::deep_copy(d_table->e,h_table->e); + Kokkos::deep_copy(d_table->de,h_table->de); + Kokkos::deep_copy(d_table->f,h_table->f); + Kokkos::deep_copy(d_table->df,h_table->df); + Kokkos::deep_copy(d_table->tabindex,h_table->tabindex); + + d_table_const.innersq = d_table->innersq; + d_table_const.invdelta = d_table->invdelta; + d_table_const.rsq = d_table->rsq; + d_table_const.e = d_table->e; + d_table_const.de = d_table->de; + d_table_const.f = d_table->f; + d_table_const.df = d_table->df; + + update_table = 0; +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::allocate() +{ + allocated = 1; + const int nt = atom->ntypes + 1; + + memory->create(setflag,nt,nt,"pair:setflag"); + + memoryKK->create_kokkos(k_cutsq,cutsq,nt,nt,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + k_cutsq.template modify(); + + memoryKK->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex"); + d_table_const.tabindex = d_table->tabindex; + + memset(&setflag[0][0],0,nt*nt*sizeof(int)); + memset(&cutsq[0][0],0,nt*nt*sizeof(double)); + memset(&tabindex[0][0],0,nt*nt*sizeof(int)); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +template +void PairMultiLucyRXKokkos::settings(int narg, char **arg) +{ + if (narg < 2) error->all(FLERR,"Illegal pair_style command"); + + // new settings + + if (strcmp(arg[0],"lookup") == 0) tabstyle = LOOKUP; + else if (strcmp(arg[0],"linear") == 0) tabstyle = LINEAR; + else error->all(FLERR,"Unknown table style in pair_style command"); + + tablength = force->inumeric(FLERR,arg[1]); + if (tablength < 2) error->all(FLERR,"Illegal number of pair table entries"); + + // optional keywords + + int iarg = 2; + while (iarg < narg) { + if (strcmp(arg[iarg],"fractional") == 0) fractionalWeighting = true; + else if (strcmp(arg[iarg],"molecular") == 0) fractionalWeighting = false; + else error->all(FLERR,"Illegal pair_style command"); + iarg++; + } + + // delete old tables, since cannot just change settings + + for (int m = 0; m < ntables; m++) free_table(&tables[m]); + memory->sfree(tables); + + if (allocated) { + memory->destroy(setflag); + + d_table_const.tabindex = d_table->tabindex = typename ArrayTypes::t_int_2d(); + h_table->tabindex = typename ArrayTypes::t_int_2d(); + } + allocated = 0; + + ntables = 0; + tables = NULL; +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class PairMultiLucyRXKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairMultiLucyRXKokkos; +#endif +} diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h new file mode 100644 index 0000000000..aee1763b06 --- /dev/null +++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h @@ -0,0 +1,267 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(multi/lucy/rx/kk,PairMultiLucyRXKokkos) +PairStyle(multi/lucy/rx/kk/device,PairMultiLucyRXKokkos) +PairStyle(multi/lucy/rx/kk/host,PairMultiLucyRXKokkos) + +#else + +#ifndef LMP_PAIR_MULTI_LUCY_RX_KOKKOS_H +#define LMP_PAIR_MULTI_LUCY_RX_KOKKOS_H + + +#include "pair_multi_lucy_rx.h" +#include "pair_kokkos.h" +#include "kokkos_base.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct TagPairMultiLucyRXPackForwardComm{}; +struct TagPairMultiLucyRXUnpackForwardComm{}; + +struct TagPairMultiLucyRXgetMixingWeights{}; + +template +struct TagPairMultiLucyRXCompute{}; + +struct TagPairMultiLucyRXZero{}; + +template +struct TagPairMultiLucyRXComputeLocalDensity{}; + +template +class PairMultiLucyRXKokkos : public PairMultiLucyRX, public KokkosBase { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef EV_FLOAT value_type; + + PairMultiLucyRXKokkos(class LAMMPS *); + virtual ~PairMultiLucyRXKokkos(); + + void compute(int, int); + void settings(int, char **); + + template + void compute_style(int, int); + + void init_style(); + int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&, + int, int *); + void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + void computeLocalDensity(); + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXPackForwardComm, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXUnpackForwardComm, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXgetMixingWeights, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXCompute, const int&, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXCompute, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXZero, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagPairMultiLucyRXComputeLocalDensity, const int&) const; + + template + KOKKOS_INLINE_FUNCTION + void ev_tally(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, + const F_FLOAT &dely, const F_FLOAT &delz) const; + + private: + int nlocal; + int neighflag; + int eflag,vflag; + + double cutsq_type11; + double rcut_type11; + double factor_type11; + + enum{LOOKUP,LINEAR,SPLINE,BITMAP}; + + //struct Table { + // int ninput,rflag,fpflag,match; + // double rlo,rhi,fplo,fphi,cut; + // double *rfile,*efile,*ffile; + // double *e2file,*f2file; + // double innersq,delta,invdelta,deltasq6; + // double *rsq,*drsq,*e,*de,*f,*df,*e2,*f2; + //}; + + /*struct TableDeviceConst { + typename AT::t_int_2d_randomread tabindex; + typename AT::t_ffloat_1d_randomread innersq,invdelta; + typename AT::t_ffloat_2d_randomread rsq,e,de,f,df; + };*/ + //Its faster not to use texture fetch if the number of tables is less than 32! + struct TableDeviceConst { + typename AT::t_int_2d tabindex; + typename AT::t_ffloat_1d innersq,invdelta; + typename AT::t_ffloat_2d_randomread rsq,e,de,f,df; + }; + + struct TableDevice { + typename AT::t_int_2d tabindex; + typename AT::t_ffloat_1d innersq,invdelta; + typename AT::t_ffloat_2d rsq,e,de,f,df; + }; + + struct TableHost { + HAT::t_int_2d tabindex; + HAT::t_ffloat_1d innersq,invdelta; + HAT::t_ffloat_2d rsq,e,de,f,df; + }; + + TableDeviceConst d_table_const; + TableDevice* d_table; + TableHost* h_table; + + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + + void allocate(); + int update_table; + void create_kokkos_tables(); + + KOKKOS_INLINE_FUNCTION + void getMixingWeights(int, double &, double &, double &, double &) const; + + typename AT::t_float_1d d_mixWtSite1old,d_mixWtSite2old,d_mixWtSite1,d_mixWtSite2; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + typename AT::t_efloat_1d rho; + typename HAT::t_efloat_1d h_rho; + typename AT::t_efloat_1d uCG, uCGnew; + typename AT::t_float_2d dvector; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d_randomread d_ilist; + typename AT::t_int_1d_randomread d_numneigh; + + DAT::tdual_int_scalar k_error_flag; + + typename AT::tdual_ffloat_2d k_cutsq; + typename AT::t_ffloat_2d d_cutsq; + + int iswap; + int first; + typename AT::t_int_2d d_sendlist; + typename AT::t_xfloat_1d_um v_buf; + + friend void pair_virial_fdotr_compute(PairMultiLucyRXKokkos*); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Pair multi/lucy/rx command requires atom_style with density (e.g. dpd, meso) + +Self-explanatory + +E: Density < table inner cutoff + +The local density inner is smaller than the inner cutoff + +E: Density > table inner cutoff + +The local density inner is greater than the inner cutoff + +E: Only LOOKUP and LINEAR table styles have been implemented for pair multi/lucy/rx + +Self-explanatory + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Unknown table style in pair_style command + +Self-explanatory + +E: Illegal number of pair table entries + +There must be at least 2 table entries. + +E: Illegal pair_coeff command + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: PairMultiLucyRXKokkos requires a fix rx command + +The fix rx command must come before the pair style command in the input file + +E: There are no rx species specified + +There must be at least one species specified through the fix rx command + +E: Invalid pair table length + +Length of read-in pair table is invalid + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Cannot open file %s + +The specified file cannot be opened. Check that the path and name are +correct. + +E: Did not find keyword in table file + +Keyword used in pair_coeff command was not found in table file. + +E: Invalid keyword in pair table parameters + +Keyword used in list of table parameters is not recognized. + +E: Pair table parameters did not set N + +List of pair table parameters must include N setting. + +*/ diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 841b7fbea9..032e428162 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -32,12 +32,13 @@ #include "respa.h" #include "math_const.h" #include "math_special.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" #include "reaxc_defs.h" #include "reaxc_lookup.h" #include "reaxc_tool_box.h" +#include "modify.h" #define TEAMSIZE 128 @@ -81,12 +82,12 @@ PairReaxCKokkos::~PairReaxCKokkos() { if (copymode) return; - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); - memory->destroy_kokkos(k_tmpid,tmpid); + memoryKK->destroy_kokkos(k_tmpid,tmpid); tmpid = NULL; - memory->destroy_kokkos(k_tmpbo,tmpbo); + memoryKK->destroy_kokkos(k_tmpbo,tmpbo); tmpbo = NULL; } @@ -99,26 +100,26 @@ void PairReaxCKokkos::allocate() k_params_sing = Kokkos::DualView ("PairReaxC::params_sing",n+1); - paramssing = k_params_sing.d_view; + paramssing = k_params_sing.template view(); k_params_twbp = Kokkos::DualView ("PairReaxC::params_twbp",n+1,n+1); - paramstwbp = k_params_twbp.d_view; + paramstwbp = k_params_twbp.template view(); k_params_thbp = Kokkos::DualView ("PairReaxC::params_thbp",n+1,n+1,n+1); - paramsthbp = k_params_thbp.d_view; + paramsthbp = k_params_thbp.template view(); k_params_fbp = Kokkos::DualView ("PairReaxC::params_fbp",n+1,n+1,n+1,n+1); - paramsfbp = k_params_fbp.d_view; + paramsfbp = k_params_fbp.template view(); k_params_hbp = Kokkos::DualView ("PairReaxC::params_hbp",n+1,n+1,n+1); - paramshbp = k_params_hbp.d_view; + paramshbp = k_params_hbp.template view(); k_tap = DAT::tdual_ffloat_1d("pair:tap",8); - d_tap = k_tap.d_view; + d_tap = k_tap.template view(); h_tap = k_tap.h_view; } @@ -131,6 +132,8 @@ template void PairReaxCKokkos::init_style() { PairReaxC::init_style(); + if (fix_reax) modify->delete_fix("REAXC"); // not needed in the Kokkos version + fix_reax = NULL; // irequest = neigh request made by parent class @@ -355,7 +358,7 @@ void PairReaxCKokkos::init_md() k_tap.h_view(3) = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; k_tap.h_view(2) =-210.0 * (swa3*swb2 + swa2*swb3) / d7; k_tap.h_view(1) = 140.0 * swa3 * swb3 / d7; - k_tap.h_view(0) = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + k_tap.h_view(0) = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; k_tap.template modify(); @@ -367,7 +370,7 @@ void PairReaxCKokkos::init_md() Init_Lookup_Tables(); k_LR = tdual_LR_lookup_table_kk_2d("lookup:LR",ntypes+1,ntypes+1); - d_LR = k_LR.d_view; + d_LR = k_LR.template view(); for (int i = 1; i <= ntypes; ++i) { for (int j = i; j <= ntypes; ++j) { @@ -382,19 +385,19 @@ void PairReaxCKokkos::init_md() k_LR.h_view(i,j).m = LR[i][j].m; k_LR.h_view(i,j).c = LR[i][j].c; - tdual_LR_data_1d k_y = tdual_LR_data_1d("lookup:LR[i,j].y",n); - tdual_cubic_spline_coef_1d k_H = tdual_cubic_spline_coef_1d("lookup:LR[i,j].H",n); - tdual_cubic_spline_coef_1d k_vdW = tdual_cubic_spline_coef_1d("lookup:LR[i,j].vdW",n); - tdual_cubic_spline_coef_1d k_CEvd = tdual_cubic_spline_coef_1d("lookup:LR[i,j].CEvd",n); - tdual_cubic_spline_coef_1d k_ele = tdual_cubic_spline_coef_1d("lookup:LR[i,j].ele",n); - tdual_cubic_spline_coef_1d k_CEclmb = tdual_cubic_spline_coef_1d("lookup:LR[i,j].CEclmb",n); + typename LR_lookup_table_kk::tdual_LR_data_1d k_y = typename LR_lookup_table_kk::tdual_LR_data_1d("lookup:LR[i,j].y",n); + typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d k_H = typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d("lookup:LR[i,j].H",n); + typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d k_vdW = typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d("lookup:LR[i,j].vdW",n); + typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d k_CEvd = typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d("lookup:LR[i,j].CEvd",n); + typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d k_ele = typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d("lookup:LR[i,j].ele",n); + typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d k_CEclmb = typename LR_lookup_table_kk::tdual_cubic_spline_coef_1d("lookup:LR[i,j].CEclmb",n); - k_LR.h_view(i,j).d_y = k_y.d_view; - k_LR.h_view(i,j).d_H = k_H.d_view; - k_LR.h_view(i,j).d_vdW = k_vdW.d_view; - k_LR.h_view(i,j).d_CEvd = k_CEvd.d_view; - k_LR.h_view(i,j).d_ele = k_ele.d_view; - k_LR.h_view(i,j).d_CEclmb = k_CEclmb.d_view; + k_LR.h_view(i,j).d_y = k_y.template view(); + k_LR.h_view(i,j).d_H = k_H.template view(); + k_LR.h_view(i,j).d_vdW = k_vdW.template view(); + k_LR.h_view(i,j).d_CEvd = k_CEvd.template view(); + k_LR.h_view(i,j).d_ele = k_ele.template view(); + k_LR.h_view(i,j).d_CEclmb = k_CEclmb.template view(); for (int k = 0; k < n; k++) { k_y.h_view(k) = LR[i][j].y[k]; @@ -555,8 +558,8 @@ void PairReaxCKokkos::Deallocate_Lookup_Tables() ntypes = atom->ntypes; - for( i = 0; i < ntypes; ++i ) { - for( j = i; j < ntypes; ++j ) + for( i = 0; i <= ntypes; ++i ) { + for( j = i; j <= ntypes; ++j ) if( LR[i][j].n ) { sfree( LR[i][j].y, "LR[i,j].y" ); sfree( LR[i][j].H, "LR[i,j].H" ); @@ -1213,7 +1216,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeTabulatedLJCoulomb t = d_LR(tmin,tmax); /* Cubic Spline Interpolation */ @@ -1337,10 +1340,10 @@ void PairReaxCKokkos::allocate_array() // FixReaxCSpecies if (fixspecies_flag) { - memory->destroy_kokkos(k_tmpid,tmpid); - memory->destroy_kokkos(k_tmpbo,tmpbo); - memory->create_kokkos(k_tmpid,tmpid,nmax,MAXSPECBOND,"pair:tmpid"); - memory->create_kokkos(k_tmpbo,tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); + memoryKK->destroy_kokkos(k_tmpid,tmpid); + memoryKK->destroy_kokkos(k_tmpbo,tmpbo); + memoryKK->create_kokkos(k_tmpid,tmpid,nmax,MAXSPECBOND,"pair:tmpid"); + memoryKK->create_kokkos(k_tmpbo,tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); } // FixReaxCBonds @@ -1446,6 +1449,8 @@ void PairReaxCKokkos::operator()(PairReaxBuildListsFull, const int & } } + if (rsq > cut_bosq) continue; + // bond_list const F_FLOAT rij = sqrt(rsq); const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; @@ -1633,6 +1638,8 @@ void PairReaxCKokkos::operator()(PairReaxBuildListsHalf, } } + if (rsq > cut_bosq) continue; + // bond_list const F_FLOAT rij = sqrt(rsq); const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; @@ -1854,6 +1861,8 @@ void PairReaxCKokkos::operator()(PairReaxBuildListsHalf_LessAtomics< } } + if (rsq > cut_bosq) continue; + // bond_list const F_FLOAT rij = sqrt(rsq); const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1; @@ -3903,14 +3912,14 @@ void PairReaxCKokkos::ev_setup(int eflag, int vflag) if (eflag_atom && atom->nmax > maxeatom) { maxeatom = atom->nmax; - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); v_eatom = k_eatom.view(); } if (vflag_atom && atom->nmax > maxvatom) { maxvatom = atom->nmax; - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); v_vatom = k_vatom.view(); } diff --git a/src/KOKKOS/pair_reaxc_kokkos.h b/src/KOKKOS/pair_reaxc_kokkos.h index 59c4d196d5..95fd7ced38 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.h +++ b/src/KOKKOS/pair_reaxc_kokkos.h @@ -39,14 +39,15 @@ PairStyle(reax/c/kk/host,PairReaxCKokkos) namespace LAMMPS_NS { -typedef Kokkos::DualView tdual_LR_data_1d; -typedef typename tdual_LR_data_1d::t_dev t_LR_data_1d; - -typedef Kokkos::DualView tdual_cubic_spline_coef_1d; -typedef typename tdual_cubic_spline_coef_1d::t_dev t_cubic_spline_coef_1d; - +template struct LR_lookup_table_kk { + typedef Kokkos::DualView tdual_LR_data_1d; + typedef typename tdual_LR_data_1d::t_dev t_LR_data_1d; + + typedef Kokkos::DualView tdual_cubic_spline_coef_1d; + typedef typename tdual_cubic_spline_coef_1d::t_dev t_cubic_spline_coef_1d; + double xmin, xmax; int n; double dx, inv_dx; @@ -397,7 +398,7 @@ class PairReaxCKokkos : public PairReaxC { HAT::t_virial_array h_vatom; DAT::tdual_float_1d k_tap; - DAT::t_float_1d d_tap; + typename AT::t_float_1d d_tap; HAT::t_float_1d h_tap; typename AT::t_float_1d d_bo_rij, d_hb_rsq, d_Deltap, d_Deltap_boc, d_total_bo; @@ -438,7 +439,9 @@ class PairReaxCKokkos : public PairReaxC { int bocnt,hbcnt; - typedef Kokkos::DualView tdual_LR_lookup_table_kk_2d; + typedef LR_lookup_table_kk LR_lookup_table_kk_DT; + + typedef Kokkos::DualView tdual_LR_lookup_table_kk_2d; typedef typename tdual_LR_lookup_table_kk_2d::t_dev t_LR_lookup_table_kk_2d; tdual_LR_lookup_table_kk_2d k_LR; diff --git a/src/KOKKOS/pair_snap_kokkos.cpp b/src/KOKKOS/pair_snap_kokkos.cpp new file mode 100644 index 0000000000..32510721d3 --- /dev/null +++ b/src/KOKKOS/pair_snap_kokkos.cpp @@ -0,0 +1,23 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "pair_snap_kokkos.h" +#include "pair_snap_kokkos_impl.h" + +namespace LAMMPS_NS { +template class PairSNAPKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairSNAPKokkos; +#endif +} + diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h new file mode 100644 index 0000000000..7bfac00391 --- /dev/null +++ b/src/KOKKOS/pair_snap_kokkos.h @@ -0,0 +1,139 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(snap/kk,PairSNAPKokkos) +PairStyle(snap/kk/device,PairSNAPKokkos) +PairStyle(snap/kk/host,PairSNAPKokkos) + +#else + +#ifndef LMP_PAIR_SNAP_KOKKOS_H +#define LMP_PAIR_SNAP_KOKKOS_H + +#include "pair_snap.h" +#include "kokkos_type.h" +#include "neigh_list_kokkos.h" +#include "sna_kokkos.h" +#include "pair_kokkos.h" + +namespace LAMMPS_NS { + +template +struct TagPairSNAP{}; + +template +class PairSNAPKokkos : public PairSNAP { +public: + enum {EnabledNeighFlags=FULL|HALF|HALFTHREAD}; + enum {COUL_FLAG=0}; + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef EV_FLOAT value_type; + + PairSNAPKokkos(class LAMMPS *); + ~PairSNAPKokkos(); + + void coeff(int, char**); + void init_style(); + double init_one(int, int); + void compute(int, int); + double memory_usage(); + + template + KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAP,const typename Kokkos::TeamPolicy >::member_type& team) const; + + template + KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAP,const typename Kokkos::TeamPolicy >::member_type& team, EV_FLOAT&) const; + + template + KOKKOS_INLINE_FUNCTION + void v_tally_xyz(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &fx, const F_FLOAT &fy, const F_FLOAT &fz, + const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const; + +protected: + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d_randomread d_ilist; + typename AT::t_int_1d_randomread d_numneigh; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + typedef Kokkos::View t_bvec; + t_bvec bvec; + typedef Kokkos::View t_dbvec; + t_dbvec dbvec; + SNAKokkos snaKK; + + // How much parallelism to use within an interaction + int vector_length; + + int eflag,vflag; + + void allocate(); + //void read_files(char *, char *); + /*template +inline int equal(double* x,double* y); + template +inline double dist2(double* x,double* y); + double extra_cutoff(); + void load_balance(); + void set_sna_to_shared(int snaid,int i); + void build_per_atom_arrays();*/ + + int neighflag; + + Kokkos::View ilistmast; + Kokkos::View ghostilist; + Kokkos::View ghostnumneigh; + Kokkos::View ghostneighs; + Kokkos::View ghostfirstneigh; + + Kokkos::View i_pairs; + Kokkos::View i_rij; + Kokkos::View i_inside; + Kokkos::View i_wj; + Kokkos::Viewi_rcutij; + Kokkos::View i_ninside; + Kokkos::View i_uarraytot_r, i_uarraytot_i; + Kokkos::View i_zarray_r, i_zarray_i; + + Kokkos::View d_radelem; // element radii + Kokkos::View d_wjelem; // elements weights + Kokkos::View d_coeffelem; // element bispectrum coefficients + Kokkos::View d_map; // mapping from atom types to elements + + typedef Kokkos::DualView tdual_fparams; + tdual_fparams k_cutsq; + typedef Kokkos::View > t_fparams_rnd; + t_fparams_rnd rnd_cutsq; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + + friend void pair_virial_fdotr_compute(PairSNAPKokkos*); + +}; + +} + +#endif +#endif diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h new file mode 100644 index 0000000000..6165c3e9f7 --- /dev/null +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -0,0 +1,646 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Christian Trott (SNL), Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_snap_kokkos.h" +#include "atom_kokkos.h" +#include "error.h" +#include "force.h" +#include "atom_masks.h" +#include "memory_kokkos.h" +#include "neigh_request.h" +#include "neighbor_kokkos.h" +#include "kokkos.h" +#include "sna.h" + +#define MAXLINE 1024 +#define MAXWORD 3 + +using namespace LAMMPS_NS; + +// Outstanding issues with quadratic term +// 1. there seems to a problem with compute_optimized energy calc +// it does not match compute_regular, even when quadratic coeffs = 0 + +//static double t1 = 0.0; +//static double t2 = 0.0; +//static double t3 = 0.0; +//static double t4 = 0.0; +//static double t5 = 0.0; +//static double t6 = 0.0; +//static double t7 = 0.0; +/* ---------------------------------------------------------------------- */ + +template +PairSNAPKokkos::PairSNAPKokkos(LAMMPS *lmp) : PairSNAP(lmp) +{ + respa_enable = 0; + + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + vector_length = 8; + k_cutsq = tdual_fparams("PairSNAPKokkos::cutsq",atom->ntypes+1,atom->ntypes+1); + auto d_cutsq = k_cutsq.template view(); + rnd_cutsq = d_cutsq; +} + +/* ---------------------------------------------------------------------- */ + +template +PairSNAPKokkos::~PairSNAPKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); +} + + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairSNAPKokkos::init_style() +{ + if (force->newton_pair == 0) + error->all(FLERR,"Pair style SNAP requires newton pair on"); + + if (diagonalstyle != 3) + error->all(FLERR,"Must use diagonal style = 3 with pair snap/kk"); + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->request(this,instance_me); + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == HALF || neighflag == HALFTHREAD) { // still need atomics, even though using a full neigh list + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else { + error->all(FLERR,"Must use half neighbor list style with pair snap/kk"); + } +} + +/* ---------------------------------------------------------------------- */ + +template +struct FindMaxNumNeighs { + typedef DeviceType device_type; + NeighListKokkos k_list; + + FindMaxNumNeighs(NeighListKokkos* nl): k_list(*nl) {} + ~FindMaxNumNeighs() {k_list.copymode = 1;} + + KOKKOS_INLINE_FUNCTION + void operator() (const int& ii, int& max_neighs) const { + const int i = k_list.d_ilist[ii]; + const int num_neighs = k_list.d_numneigh[i]; + if (max_neighs +void PairSNAPKokkos::compute(int eflag_in, int vflag_in) +{ + eflag = eflag_in; + vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.view(); + } + + copymode = 1; + int newton_pair = force->newton_pair; + if (newton_pair == false) + error->all(FLERR,"PairSNAPKokkos requires 'newton on'"); + + atomKK->sync(execution_space,X_MASK|F_MASK|TYPE_MASK); + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + k_cutsq.template sync(); + + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + int inum = list->inum; + + /* + for (int i = 0; i < nlocal; i++) { + typename t_neigh_list::t_neighs neighs_i = neigh_list.get_neighs(i); + const int num_neighs = neighs_i.get_num_neighs(); + if (max_neighs(k_list), Kokkos::Experimental::Max(max_neighs)); + + snaKK.nmax = max_neighs; + + T_INT team_scratch_size = snaKK.size_team_scratch_arrays(); + T_INT thread_scratch_size = snaKK.size_thread_scratch_arrays(); + + //printf("Sizes: %i %i\n",team_scratch_size/1024,thread_scratch_size/1024); + int team_size_max = Kokkos::TeamPolicy::team_size_max(*this); + int vector_length = 8; +#ifdef KOKKOS_ENABLE_CUDA + int team_size = 32;//max_neighs; + if (team_size*vector_length > team_size_max) + team_size = team_size_max/vector_length; +#else + int team_size = 1; +#endif + + EV_FLOAT ev; + + if (eflag) { + if (neighflag == HALF) { + typename Kokkos::TeamPolicy > policy(inum,team_size,vector_length); + Kokkos::parallel_reduce(policy + .set_scratch_size(1,Kokkos::PerThread(thread_scratch_size)) + .set_scratch_size(1,Kokkos::PerTeam(team_scratch_size)) + ,*this,ev); + } else if (neighflag == HALFTHREAD) { + typename Kokkos::TeamPolicy > policy(inum,team_size,vector_length); + Kokkos::parallel_reduce(policy + .set_scratch_size(1,Kokkos::PerThread(thread_scratch_size)) + .set_scratch_size(1,Kokkos::PerTeam(team_scratch_size)) + ,*this,ev); + } + } else { + if (neighflag == HALF) { + typename Kokkos::TeamPolicy > policy(inum,team_size,vector_length); + Kokkos::parallel_for(policy + .set_scratch_size(1,Kokkos::PerThread(thread_scratch_size)) + .set_scratch_size(1,Kokkos::PerTeam(team_scratch_size)) + ,*this); + } else if (neighflag == HALFTHREAD) { + typename Kokkos::TeamPolicy > policy(inum,team_size,vector_length); + Kokkos::parallel_for(policy + .set_scratch_size(1,Kokkos::PerThread(thread_scratch_size)) + .set_scratch_size(1,Kokkos::PerTeam(team_scratch_size)) + ,*this); + } + } + +//static int step =0; +//step++; +//if (step%10==0) +// printf(" %e %e %e %e %e (%e %e): %e\n",t1,t2,t3,t4,t5,t6,t7,t1+t2+t3+t4+t5); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } + + atomKK->modified(execution_space,F_MASK); + copymode = 0; +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairSNAPKokkos::allocate() +{ + PairSNAP::allocate(); + + int n = atom->ntypes; + d_map = Kokkos::View("PairSNAPKokkos::map",n+1); +} + + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +template +double PairSNAPKokkos::init_one(int i, int j) +{ + double cutone = PairSNAP::init_one(i,j); + k_cutsq.h_view(i,j) = k_cutsq.h_view(j,i) = cutone*cutone; + k_cutsq.template modify(); + + return cutone; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +template +void PairSNAPKokkos::coeff(int narg, char **arg) +{ + PairSNAP::coeff(narg,arg); + + // Set up element lists + + d_radelem = Kokkos::View("pair:radelem",nelements); + d_wjelem = Kokkos::View("pair:wjelem",nelements); + d_coeffelem = Kokkos::View("pair:coeffelem",nelements,ncoeffall); + + auto h_radelem = Kokkos::create_mirror_view(d_radelem); + auto h_wjelem = Kokkos::create_mirror_view(d_wjelem); + auto h_coeffelem = Kokkos::create_mirror_view(d_coeffelem); + auto h_map = Kokkos::create_mirror_view(d_map); + + for (int ielem = 0; ielem < nelements; ielem++) { + h_radelem(ielem) = radelem[ielem]; + h_wjelem(ielem) = wjelem[ielem]; + for (int jcoeff = 0; jcoeff < ncoeffall; jcoeff++) { + h_coeffelem(ielem,jcoeff) = coeffelem[ielem][jcoeff]; + } + } + + for (int i = 1; i <= atom->ntypes; i++) { + h_map(i) = map[i]; + } + + Kokkos::deep_copy(d_radelem,h_radelem); + Kokkos::deep_copy(d_wjelem,h_wjelem); + Kokkos::deep_copy(d_coeffelem,h_coeffelem); + Kokkos::deep_copy(d_map,h_map); + + // deallocate non-kokkos sna + + if (sna) { + for (int tid = 0; tid(rfac0,twojmax, + diagonalstyle,use_shared_arrays, + rmin0,switchflag,bzeroflag); + //if (!use_shared_arrays) + snaKK.grow_rij(nmax); + snaKK.init(); +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAP,const typename Kokkos::TeamPolicy >::member_type& team, EV_FLOAT& ev) const { + // The f array is atomic for Half/Thread neighbor style + Kokkos::View::value> > a_f = f; + + const int ii = team.league_rank(); + const int i = d_ilist[ii]; + SNAKokkos my_sna(snaKK,team); + const double x_i = x(i,0); + const double y_i = x(i,1); + const double z_i = x(i,2); + const int type_i = type[i]; + const int elem_i = d_map[type_i]; + const double radi = d_radelem[elem_i]; + + const int num_neighs = d_numneigh[i]; + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // wj = weights for neighbors of I within cutoff + // rcutij = cutoffs for neighbors of I within cutoff + // note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi + + //Kokkos::Timer timer; + int ninside = 0; + Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team,num_neighs), + [&] (const int jj, int& count) { + Kokkos::single(Kokkos::PerThread(team), [&] (){ + T_INT j = d_neighbors(i,jj); + const F_FLOAT dx = x(j,0) - x_i; + const F_FLOAT dy = x(j,1) - y_i; + const F_FLOAT dz = x(j,2) - z_i; + + const int type_j = type(j); + const F_FLOAT rsq = dx*dx + dy*dy + dz*dz; + const int elem_j = d_map[type_j]; + + if ( rsq < rnd_cutsq(type_i,type_j) ) + count++; + }); + },ninside); + + //t1 += timer.seconds(); timer.reset(); + + if (team.team_rank() == 0) + Kokkos::parallel_scan(Kokkos::ThreadVectorRange(team,num_neighs), + [&] (const int jj, int& offset, bool final){ + //for (int jj = 0; jj < num_neighs; jj++) { + T_INT j = d_neighbors(i,jj); + const F_FLOAT dx = x(j,0) - x_i; + const F_FLOAT dy = x(j,1) - y_i; + const F_FLOAT dz = x(j,2) - z_i; + + const int type_j = type(j); + const F_FLOAT rsq = dx*dx + dy*dy + dz*dz; + const int elem_j = d_map[type_j]; + + if ( rsq < rnd_cutsq(type_i,type_j) ) { + if (final) { + my_sna.rij(offset,0) = dx; + my_sna.rij(offset,1) = dy; + my_sna.rij(offset,2) = dz; + my_sna.inside[offset] = j; + my_sna.wj[offset] = d_wjelem[elem_j]; + my_sna.rcutij[offset] = (radi + d_radelem[elem_j])*rcutfac; + } + offset++; + } + }); + + //t2 += timer.seconds(); timer.reset(); + + team.team_barrier(); + // compute Ui, Zi, and Bi for atom I + my_sna.compute_ui(team,ninside); + //t3 += timer.seconds(); timer.reset(); + team.team_barrier(); + my_sna.compute_zi(team); + //t4 += timer.seconds(); timer.reset(); + team.team_barrier(); + + // for neighbors of I within cutoff: + // compute dUi/drj and dBi/drj + // Fij = dEi/dRj = -dEi/dRi => add to Fi, subtract from Fj + + Kokkos::View> + d_coeffi(d_coeffelem,elem_i,Kokkos::ALL); + + Kokkos::parallel_for (Kokkos::TeamThreadRange(team,ninside), + [&] (const int jj) { + //for (int jj = 0; jj < ninside; jj++) { + int j = my_sna.inside[jj]; + + //Kokkos::Timer timer2; + my_sna.compute_duidrj(team,&my_sna.rij(jj,0), + my_sna.wj[jj],my_sna.rcutij[jj]); + //t6 += timer2.seconds(); timer2.reset(); + my_sna.compute_dbidrj(team); + //t7 += timer2.seconds(); timer2.reset(); + my_sna.copy_dbi2dbvec(team); + if (quadraticflag) { + my_sna.compute_bi(team); + my_sna.copy_bi2bvec(team); + } + + Kokkos::single(Kokkos::PerThread(team), [&] (){ + F_FLOAT fij[3]; + + fij[0] = 0.0; + fij[1] = 0.0; + fij[2] = 0.0; + + // linear contributions + + for (int k = 1; k <= ncoeff; k++) { + double bgb = d_coeffi[k]; + fij[0] += bgb*my_sna.dbvec(k-1,0); + fij[1] += bgb*my_sna.dbvec(k-1,1); + fij[2] += bgb*my_sna.dbvec(k-1,2); + } + + if (quadraticflag) { + + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = my_sna.bvec[icoeff]; + double fack = d_coeffi[k]*bveci; + double dbvecix = my_sna.dbvec(icoeff,0); + double dbveciy = my_sna.dbvec(icoeff,1); + double dbveciz = my_sna.dbvec(icoeff,2); + fij[0] += fack*dbvecix; + fij[1] += fack*dbveciy; + fij[2] += fack*dbveciz; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + double facki = d_coeffi[k]*bveci; + double fackj = d_coeffi[k]*my_sna.bvec[jcoeff]; + fij[0] += facki*my_sna.dbvec(jcoeff,0)+fackj*dbvecix; + fij[1] += facki*my_sna.dbvec(jcoeff,1)+fackj*dbveciy; + fij[2] += facki*my_sna.dbvec(jcoeff,2)+fackj*dbveciz; + k++; + } + } + } + + // Hard-coded ZBL potential + //const double dx = my_sna.rij(jj,0); + //const double dy = my_sna.rij(jj,1); + //const double dz = my_sna.rij(jj,2); + //const double fdivr = -1.5e6/pow(dx*dx + dy*dy + dz*dz,7.0); + //fij[0] += dx*fdivr; + //fij[1] += dy*fdivr; + //fij[2] += dz*fdivr; + + //OK + //printf("%lf %lf %lf %lf %lf %lf %lf %lf %lf SNAP-COMPARE: FIJ\n" + // ,x(i,0),x(i,1),x(i,2),x(j,0),x(j,1),x(j,2),fij[0],fij[1],fij[2] ); + a_f(i,0) += fij[0]; + a_f(i,1) += fij[1]; + a_f(i,2) += fij[2]; + a_f(j,0) -= fij[0]; + a_f(j,1) -= fij[1]; + a_f(j,2) -= fij[2]; + + // tally per-atom virial contribution + + if (EVFLAG) { + if (vflag) { + v_tally_xyz(ev,i,j, + fij[0],fij[1],fij[2], + -my_sna.rij(jj,0),-my_sna.rij(jj,1), + -my_sna.rij(jj,2)); + } + } + + }); + }); + //t5 += timer.seconds(); timer.reset(); + + // tally energy contribution + + if (EVFLAG) { + if (eflag) { + + if (!quadraticflag) { + my_sna.compute_bi(team); + my_sna.copy_bi2bvec(team); + } + + // E = beta.B + 0.5*B^t.alpha.B + // coeff[k] = beta[k-1] or + // coeff[k] = alpha_ii or + // coeff[k] = alpha_ij = alpha_ji, j != i + + if (team.team_rank() == 0) + Kokkos::single(Kokkos::PerThread(team), [&] () { + + // evdwl = energy of atom I, sum over coeffs_k * Bi_k + + double evdwl = d_coeffi[0]; + + // linear contributions + for (int k = 1; k <= ncoeff; k++) + evdwl += d_coeffi[k]*my_sna.bvec[k-1]; + + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = my_sna.bvec[icoeff]; + evdwl += 0.5*d_coeffi[k++]*bveci*bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + evdwl += d_coeffi[k++]*bveci*my_sna.bvec[jcoeff]; + } + } + } +// ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0); + if (eflag_either) { + if (eflag_global) ev.evdwl += evdwl; + if (eflag_atom) d_eatom[i] += evdwl; + } + }); + } + } +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAP,const typename Kokkos::TeamPolicy >::member_type& team) const { + EV_FLOAT ev; + this->template operator()(TagPairSNAP(), team, ev); +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::v_tally_xyz(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &fx, const F_FLOAT &fy, const F_FLOAT &fz, + const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const +{ + // The vatom array is atomic for Half/Thread neighbor style + Kokkos::View::value> > v_vatom = k_vatom.view(); + + const E_FLOAT v0 = delx*fx; + const E_FLOAT v1 = dely*fy; + const E_FLOAT v2 = delz*fz; + const E_FLOAT v3 = delx*fy; + const E_FLOAT v4 = delx*fz; + const E_FLOAT v5 = dely*fz; + + if (vflag_global) { + ev.v[0] += v0; + ev.v[1] += v1; + ev.v[2] += v2; + ev.v[3] += v3; + ev.v[4] += v4; + ev.v[5] += v5; + } + + if (vflag_atom) { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + v_vatom(j,0) += 0.5*v0; + v_vatom(j,1) += 0.5*v1; + v_vatom(j,2) += 0.5*v2; + v_vatom(j,3) += 0.5*v3; + v_vatom(j,4) += 0.5*v4; + v_vatom(j,5) += 0.5*v5; + } +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +template +double PairSNAPKokkos::memory_usage() +{ + double bytes = Pair::memory_usage(); + int n = atom->ntypes+1; + bytes += n*n*sizeof(int); + bytes += n*n*sizeof(double); + bytes += 3*nmax*sizeof(double); + bytes += nmax*sizeof(int); + bytes += (2*ncoeffall)*sizeof(double); + bytes += (ncoeff*3)*sizeof(double); + bytes += snaKK.memory_usage(); + return bytes; +} diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index e5c947cc8e..63b4c19ae1 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -27,10 +27,10 @@ #include "neigh_request.h" #include "force.h" #include "comm.h" -#include "memory.h" +#include "memory_kokkos.h" #include "neighbor.h" #include "neigh_list_kokkos.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" #include "math_const.h" @@ -63,8 +63,8 @@ template PairSWKokkos::~PairSWKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); eatom = NULL; vatom = NULL; } @@ -86,13 +86,13 @@ void PairSWKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -572,7 +572,7 @@ void PairSWKokkos::coeff(int narg, char **arg) k_map.template modify(); k_map.template sync(); - d_map = k_map.d_view; + d_map = k_map.template view(); } /* ---------------------------------------------------------------------- @@ -637,8 +637,8 @@ void PairSWKokkos::setup_params() k_params.template modify(); k_params.template sync(); - d_elem2param = k_elem2param.d_view; - d_params = k_params.d_view; + d_elem2param = k_elem2param.template view(); + d_params = k_params.template view(); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/pair_sw_kokkos.h b/src/KOKKOS/pair_sw_kokkos.h index b94e39335f..3152fb6e94 100644 --- a/src/KOKKOS/pair_sw_kokkos.h +++ b/src/KOKKOS/pair_sw_kokkos.h @@ -103,7 +103,7 @@ class PairSWKokkos : public PairSW { typedef typename tdual_int_3d::t_host t_host_int_3d; t_int_3d_randomread d_elem2param; - DAT::t_int_1d_randomread d_map; + typename AT::t_int_1d_randomread d_map; typedef Kokkos::DualView tdual_param_1d; typedef typename tdual_param_1d::t_dev t_param_1d; @@ -125,12 +125,12 @@ class PairSWKokkos : public PairSW { DAT::tdual_efloat_1d k_eatom; DAT::tdual_virial_array k_vatom; - typename ArrayTypes::t_efloat_1d d_eatom; - typename ArrayTypes::t_virial_array d_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; - DAT::t_int_1d_randomread d_type2frho; - DAT::t_int_2d_randomread d_type2rhor; - DAT::t_int_2d_randomread d_type2z2r; + typename AT::t_int_1d_randomread d_type2frho; + typename AT::t_int_2d_randomread d_type2rhor; + typename AT::t_int_2d_randomread d_type2z2r; typename AT::t_neighbors_2d d_neighbors; typename AT::t_int_1d_randomread d_ilist; diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp index 7f763baae6..957214915b 100644 --- a/src/KOKKOS/pair_table_kokkos.cpp +++ b/src/KOKKOS/pair_table_kokkos.cpp @@ -27,7 +27,7 @@ #include "neighbor.h" #include "neigh_list.h" #include "neigh_request.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -92,13 +92,13 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -141,8 +141,8 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) } else if (neighflag == N2) { PairComputeFunctor,N2,false,S_TableCompute > f(this,(NeighListKokkos*) list); - if (eflag || vflag) Kokkos::parallel_reduce(nlocal,f,ev); - else Kokkos::parallel_for(nlocal,f); + if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); + else Kokkos::parallel_for(list->inum,f); } } else { if (neighflag == FULL) { @@ -163,8 +163,8 @@ void PairTableKokkos::compute_style(int eflag_in, int vflag_in) } else if (neighflag == N2) { PairComputeFunctor,N2,true,S_TableCompute > f(this,(NeighListKokkos*) list); - if (eflag || vflag) Kokkos::parallel_reduce(nlocal,f,ev); - else Kokkos::parallel_for(nlocal,f); + if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev); + else Kokkos::parallel_for(list->inum,f); } } @@ -265,41 +265,41 @@ void PairTableKokkos::create_kokkos_tables() { const int tlm1 = tablength-1; - memory->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits"); - memory->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask"); - memory->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq"); - memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); - memory->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6"); + memoryKK->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits"); + memoryKK->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask"); + memoryKK->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq"); + memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); + memoryKK->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6"); if(tabstyle == LOOKUP) { - memory->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e"); - memory->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f"); } if(tabstyle == LINEAR) { - memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); - memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); - memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); - memory->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de"); - memory->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df"); + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); + memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de"); + memoryKK->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df"); } if(tabstyle == SPLINE) { - memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); - memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); - memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); - memory->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2"); - memory->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2"); + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); + memoryKK->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2"); + memoryKK->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2"); } if(tabstyle == BITMAP) { int ntable = 1 << tablength; - memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq"); - memory->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e"); - memory->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f"); - memory->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de"); - memory->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df"); - memory->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq"); + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f"); + memoryKK->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de"); + memoryKK->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df"); + memoryKK->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq"); } @@ -410,8 +410,8 @@ void PairTableKokkos::allocate() const int nt = atom->ntypes + 1; memory->create(setflag,nt,nt,"pair:setflag"); - memory->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq"); - memory->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex"); + memoryKK->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq"); + memoryKK->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex"); d_table_const.cutsq = d_table->cutsq; d_table_const.tabindex = d_table->tabindex; diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp new file mode 100644 index 0000000000..7bc5198d8c --- /dev/null +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -0,0 +1,1309 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Dan Ibanez (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_table_rx_kokkos.h" +#include "kokkos.h" +#include "atom.h" +#include "force.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "fix.h" +#include "kokkos_few.h" +#include "kokkos.h" +#include "modify.h" +#include + +using namespace LAMMPS_NS; + +enum{NONE,RLINEAR,RSQ,BMP}; + +#ifdef DBL_EPSILON + #define MY_EPSILON (10.0*DBL_EPSILON) +#else + #define MY_EPSILON (10.0*2.220446049250313e-16) +#endif + +#define OneFluidValue (-1) +#define isOneFluid(_site_) ( (_site_) == OneFluidValue ) + +template +KOKKOS_INLINE_FUNCTION +void getMixingWeights( + typename ArrayTypes::t_float_2d_randomread dvector, + int nspecies, + int isite1, int isite2, + bool fractionalWeighting, + int id, + double &mixWtSite1old, double &mixWtSite2old, + double &mixWtSite1, double &mixWtSite2) { + double fractionOFAold, fractionOFA; + double fractionOld1, fraction1; + double fractionOld2, fraction2; + double nMoleculesOFAold, nMoleculesOFA; + double nMoleculesOld1, nMolecules1; + double nMoleculesOld2, nMolecules2; + double nTotal, nTotalOld; + + nTotal = 0.0; + nTotalOld = 0.0; + assert(id >= 0); + assert(id < dvector.dimension_1()); + for (int ispecies = 0; ispecies < nspecies; ++ispecies){ + assert(ispecies < dvector.dimension_0()); + nTotal += dvector(ispecies,id); + assert(ispecies+nspecies < dvector.dimension_0()); + nTotalOld += dvector(ispecies+nspecies,id); + } + + assert(isite1 >= 0); + assert(isite1 < nspecies); + assert(isite2 >= 0); + assert(isite2 < nspecies); + if (isOneFluid(isite1) == false){ + nMoleculesOld1 = dvector(isite1+nspecies,id); + nMolecules1 = dvector(isite1,id); + fractionOld1 = nMoleculesOld1/nTotalOld; + fraction1 = nMolecules1/nTotal; + } + if (isOneFluid(isite2) == false){ + nMoleculesOld2 = dvector(isite2+nspecies,id); + nMolecules2 = dvector(isite2,id); + fractionOld2 = nMoleculesOld2/nTotalOld; + fraction2 = nMolecules2/nTotal; + } + + if (isOneFluid(isite1) || isOneFluid(isite2)){ + nMoleculesOFAold = 0.0; + nMoleculesOFA = 0.0; + fractionOFAold = 0.0; + fractionOFA = 0.0; + + for (int ispecies = 0; ispecies < nspecies; ispecies++){ + if (isite1 == ispecies || isite2 == ispecies) continue; + nMoleculesOFAold += dvector(ispecies+nspecies,id); + nMoleculesOFA += dvector(ispecies,id); + fractionOFAold += dvector(ispecies+nspecies,id)/nTotalOld; + fractionOFA += dvector(ispecies,id)/nTotal; + } + if(isOneFluid(isite1)){ + nMoleculesOld1 = 1.0-(nTotalOld-nMoleculesOFAold); + nMolecules1 = 1.0-(nTotal-nMoleculesOFA); + fractionOld1 = fractionOFAold; + fraction1 = fractionOFA; + } + if(isOneFluid(isite2)){ + nMoleculesOld2 = 1.0-(nTotalOld-nMoleculesOFAold); + nMolecules2 = 1.0-(nTotal-nMoleculesOFA); + fractionOld2 = fractionOFAold; + fraction2 = fractionOFA; + } + } + + if(fractionalWeighting){ + mixWtSite1old = fractionOld1; + mixWtSite1 = fraction1; + mixWtSite2old = fractionOld2; + mixWtSite2 = fraction2; + } else { + mixWtSite1old = nMoleculesOld1; + mixWtSite1 = nMolecules1; + mixWtSite2old = nMoleculesOld2; + mixWtSite2 = nMolecules2; + } +} + +/* ---------------------------------------------------------------------- */ + +template +PairTableRXKokkos::PairTableRXKokkos(LAMMPS *lmp) : PairTable(lmp) +{ + update_table = 0; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK | + DVECTOR_MASK | UCG_MASK | UCGNEW_MASK; + datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK | UCG_MASK | UCGNEW_MASK; + h_table = new TableHost(); + d_table = new TableDevice(); + fractionalWeighting = true; + + site1 = nullptr; + site2 = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +template +PairTableRXKokkos::~PairTableRXKokkos() +{ + if (copymode) return; + + delete [] site1; + delete [] site2; + + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + + if (allocated) { + memoryKK->destroy_kokkos(d_table->cutsq, cutsq); + memoryKK->destroy_kokkos(d_table->tabindex, tabindex); + } + + delete h_table; + h_table = nullptr; + delete d_table; + d_table = nullptr; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairTableRXKokkos::compute(int eflag_in, int vflag_in) +{ + if(update_table) + create_kokkos_tables(); + if(tabstyle == LOOKUP) + compute_style(eflag_in,vflag_in); + if(tabstyle == LINEAR) + compute_style(eflag_in,vflag_in); + if(tabstyle == SPLINE) + compute_style(eflag_in,vflag_in); + if(tabstyle == BITMAP) + compute_style(eflag_in,vflag_in); +} + +KOKKOS_INLINE_FUNCTION static int sbmask(const int& j) +{ + return j >> SBBITS & 3; +} + +template +KOKKOS_INLINE_FUNCTION +static F_FLOAT +compute_fpair(F_FLOAT rsq, + int itype, int jtype, + typename PairTableRXKokkos::TableDeviceConst const& d_table_const + ) { + Pair::union_int_float_t rsq_lookup; + double fpair; + const int tidx = d_table_const.tabindex(itype,jtype); + if (TABSTYLE == PairTable::LOOKUP) { + const int itable = static_cast ((rsq - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + fpair = d_table_const.f(tidx,itable); + } else if (TABSTYLE == PairTable::LINEAR) { + const int itable = static_cast ((rsq - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + const double fraction = (rsq - d_table_const.rsq(tidx,itable)) * d_table_const.invdelta(tidx); + fpair = d_table_const.f(tidx,itable) + fraction*d_table_const.df(tidx,itable); + } else if (TABSTYLE == PairTable::SPLINE) { + const int itable = static_cast ((rsq - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + const double b = (rsq - d_table_const.rsq(tidx,itable)) * d_table_const.invdelta(tidx); + const double a = 1.0 - b; + fpair = a * d_table_const.f(tidx,itable) + b * d_table_const.f(tidx,itable+1) + + ((a*a*a-a)*d_table_const.f2(tidx,itable) + (b*b*b-b)*d_table_const.f2(tidx,itable+1)) * + d_table_const.deltasq6(tidx); + } else { + rsq_lookup.f = rsq; + int itable = rsq_lookup.i & d_table_const.nmask(tidx); + itable >>= d_table_const.nshiftbits(tidx); + const double fraction = (rsq_lookup.f - d_table_const.rsq(tidx,itable)) * d_table_const.drsq(tidx,itable); + fpair = d_table_const.f(tidx,itable) + fraction*d_table_const.df(tidx,itable); + } + return fpair; +} + +template +KOKKOS_INLINE_FUNCTION +static F_FLOAT +compute_evdwl( + F_FLOAT rsq, + int itype, int jtype, + typename PairTableRXKokkos::TableDeviceConst const& d_table_const + ) { + double evdwl; + Pair::union_int_float_t rsq_lookup; + const int tidx = d_table_const.tabindex(itype,jtype); + if (TABSTYLE == PairTable::LOOKUP) { + const int itable = static_cast ((rsq - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + evdwl = d_table_const.e(tidx,itable); + } else if (TABSTYLE == PairTable::LINEAR) { + const int itable = static_cast ((rsq - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + const double fraction = (rsq - d_table_const.rsq(tidx,itable)) * d_table_const.invdelta(tidx); + evdwl = d_table_const.e(tidx,itable) + fraction*d_table_const.de(tidx,itable); + } else if (TABSTYLE == PairTable::SPLINE) { + const int itable = static_cast ((rsq - d_table_const.innersq(tidx)) * d_table_const.invdelta(tidx)); + const double b = (rsq - d_table_const.rsq(tidx,itable)) * d_table_const.invdelta(tidx); + const double a = 1.0 - b; + evdwl = a * d_table_const.e(tidx,itable) + b * d_table_const.e(tidx,itable+1) + + ((a*a*a-a)*d_table_const.e2(tidx,itable) + (b*b*b-b)*d_table_const.e2(tidx,itable+1)) * + d_table_const.deltasq6(tidx); + } else { + rsq_lookup.f = rsq; + int itable = rsq_lookup.i & d_table_const.nmask(tidx); + itable >>= d_table_const.nshiftbits(tidx); + const double fraction = (rsq_lookup.f - d_table_const.rsq(tidx,itable)) * d_table_const.drsq(tidx,itable); + evdwl = d_table_const.e(tidx,itable) + fraction*d_table_const.de(tidx,itable); + } + return evdwl; +} + +template +KOKKOS_INLINE_FUNCTION +void +ev_tally( + int eflag, + int eflag_atom, + int vflag, + int vflag_global, + int vflag_atom, + int nlocal, + int i, int j, + EV_FLOAT& ev, + F_FLOAT epair, F_FLOAT fpair, + F_FLOAT delx, F_FLOAT dely, F_FLOAT delz, + Kokkos::View::t_virial_array::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& v_vatom, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& v_eatom) +{ + if (eflag) { + if (eflag_atom) { + auto epairhalf = 0.5 * epair; + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) v_eatom[i] += epairhalf; + if (NEWTON_PAIR || j < nlocal) v_eatom[j] += epairhalf; + } else { + v_eatom[i] += epairhalf; + } + } + } + + if (vflag) { + auto v0 = delx*delx*fpair; + auto v1 = dely*dely*fpair; + auto v2 = delz*delz*fpair; + auto v3 = delx*dely*fpair; + auto v4 = delx*delz*fpair; + auto v5 = dely*delz*fpair; + + if (vflag_global) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR) { + ev.v[0] += v0; + ev.v[1] += v1; + ev.v[2] += v2; + ev.v[3] += v3; + ev.v[4] += v4; + ev.v[5] += v5; + } else { + if (i < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + if (j < nlocal) { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } + } else { + ev.v[0] += 0.5*v0; + ev.v[1] += 0.5*v1; + ev.v[2] += 0.5*v2; + ev.v[3] += 0.5*v3; + ev.v[4] += 0.5*v4; + ev.v[5] += 0.5*v5; + } + } + + if (vflag_atom) { + if (NEIGHFLAG!=FULL) { + if (NEWTON_PAIR || i < nlocal) { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + if (NEWTON_PAIR || j < nlocal) { + v_vatom(j,0) += 0.5*v0; + v_vatom(j,1) += 0.5*v1; + v_vatom(j,2) += 0.5*v2; + v_vatom(j,3) += 0.5*v3; + v_vatom(j,4) += 0.5*v4; + v_vatom(j,5) += 0.5*v5; + } + } else { + v_vatom(i,0) += 0.5*v0; + v_vatom(i,1) += 0.5*v1; + v_vatom(i,2) += 0.5*v2; + v_vatom(i,3) += 0.5*v3; + v_vatom(i,4) += 0.5*v4; + v_vatom(i,5) += 0.5*v5; + } + } + } +} + +template +KOKKOS_INLINE_FUNCTION +static EV_FLOAT +compute_item( + int ii, + int nlocal, + typename ArrayTypes::t_int_1d_const const& d_ilist, + typename ArrayTypes::t_neighbors_2d_const const& d_neighbors, + typename ArrayTypes::t_int_1d_const const& d_numneigh, + typename ArrayTypes::t_x_array_randomread const& x, + typename ArrayTypes::t_int_1d_randomread const& type, + Kokkos::View const& mixWtSite1old, + Kokkos::View const& mixWtSite2old, + Kokkos::View const& mixWtSite1, + Kokkos::View const& mixWtSite2, + Few const& special_lj, + Few, MAX_TYPES_STACKPARAMS+1> const& m_cutsq, + typename ArrayTypes::t_ffloat_2d const& d_cutsq, + Kokkos::View::t_f_array::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& f, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& uCG, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& uCGnew, + int isite1, int isite2, + typename PairTableRXKokkos::TableDeviceConst const& d_table_const, + int eflag, + int eflag_atom, + int vflag, + int vflag_global, + int vflag_atom, + Kokkos::View::t_virial_array::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& v_vatom, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > const& v_eatom) { + EV_FLOAT ev; + auto i = d_ilist(ii); + auto xtmp = x(i,0); + auto ytmp = x(i,1); + auto ztmp = x(i,2); + auto itype = type(i); + + auto jlist = NeighListKokkos::static_neighbors_const(i, + d_neighbors, d_numneigh); + auto jnum = d_numneigh(i); + + double uCG_i = 0.0; + double uCGnew_i = 0.0; + double fx_i = 0.0, fy_i = 0.0, fz_i = 0.0; + + auto mixWtSite1old_i = mixWtSite1old(i); + auto mixWtSite2old_i = mixWtSite2old(i); + auto mixWtSite1_i = mixWtSite1(i); + auto mixWtSite2_i = mixWtSite2(i); + + for (int jj = 0; jj < jnum; jj++) { + auto j = jlist(jj); + const F_FLOAT factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + auto delx = xtmp - x(j,0); + auto dely = ytmp - x(j,1); + auto delz = ztmp - x(j,2); + auto rsq = delx*delx + dely*dely + delz*delz; + auto jtype = type(j); + + if(rsq < (STACKPARAMS ? m_cutsq[itype][jtype] : d_cutsq(itype,jtype))) { + auto mixWtSite1old_j = mixWtSite1old(j); + auto mixWtSite2old_j = mixWtSite2old(j); + auto mixWtSite1_j = mixWtSite1(j); + auto mixWtSite2_j = mixWtSite2(j); + + auto fpair = factor_lj * compute_fpair( + rsq,itype,jtype,d_table_const); + + if (isite1 == isite2) fpair *= sqrt(mixWtSite1old_i * mixWtSite2old_j); + else fpair *= (sqrt(mixWtSite1old_i * mixWtSite2old_j) + + sqrt(mixWtSite2old_i * mixWtSite1old_j)); + + fx_i += delx*fpair; + fy_i += dely*fpair; + fz_i += delz*fpair; + + auto do_half = (NEIGHFLAG==HALF || NEIGHFLAG==HALFTHREAD) && + (NEWTON_PAIR || j < nlocal); + if (do_half) { + f(j,0) -= delx*fpair; + f(j,1) -= dely*fpair; + f(j,2) -= delz*fpair; + } + + auto evdwl = compute_evdwl( + rsq,itype,jtype,d_table_const); + + double evdwlOld; + if (isite1 == isite2) { + evdwlOld = sqrt(mixWtSite1old_i*mixWtSite2old_j)*evdwl; + evdwl = sqrt(mixWtSite1_i*mixWtSite2_j)*evdwl; + } else { + evdwlOld = (sqrt(mixWtSite1old_i*mixWtSite2old_j) + + sqrt(mixWtSite2old_i*mixWtSite1old_j))*evdwl; + evdwl = (sqrt(mixWtSite1_i*mixWtSite2_j) + + sqrt(mixWtSite2_i*mixWtSite1_j))*evdwl; + } + evdwlOld *= factor_lj; + evdwl *= factor_lj; + + uCG_i += 0.5*evdwlOld; + if (do_half) uCG(j) += 0.5*evdwlOld; + + uCGnew_i += 0.5*evdwl; + if (do_half) uCGnew(j) += 0.5*evdwl; + evdwl = evdwlOld; + + ev.evdwl += (do_half ? 1.0 : 0.5)*evdwl; + + if (EVFLAG) { + ev_tally( + eflag,eflag_atom, + vflag,vflag_global,vflag_atom, + nlocal,i,j,ev,evdwl,fpair,delx,dely,delz, + v_vatom, v_eatom); + } + } + } + + uCG(i) += uCG_i; + uCGnew(i) += uCGnew_i; + + f(i,0) += fx_i; + f(i,1) += fy_i; + f(i,2) += fz_i; + + return ev; +} + +template +static void compute_all_items( + EV_FLOAT& ev, + int nlocal, + int inum, + typename ArrayTypes::t_int_1d_const d_ilist, + typename ArrayTypes::t_neighbors_2d_const d_neighbors, + typename ArrayTypes::t_int_1d_const d_numneigh, + typename ArrayTypes::t_x_array_randomread x, + typename ArrayTypes::t_int_1d_randomread type, + Kokkos::View const& mixWtSite1old, + Kokkos::View const& mixWtSite2old, + Kokkos::View const& mixWtSite1, + Kokkos::View const& mixWtSite2, + Few special_lj, + Few, MAX_TYPES_STACKPARAMS+1> m_cutsq, + typename ArrayTypes::t_ffloat_2d d_cutsq, + Kokkos::View::t_f_array::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > f, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType,Kokkos::MemoryTraits::value> > uCG, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType,Kokkos::MemoryTraits::value> > uCGnew, + int isite1, int isite2, + typename PairTableRXKokkos::TableDeviceConst d_table_const, + int eflag, + int eflag_atom, + int vflag, + int vflag_global, + int vflag_atom, + Kokkos::View::t_virial_array::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > v_vatom, + Kokkos::View::t_efloat_1d::array_layout, + DeviceType, + Kokkos::MemoryTraits::value> > v_eatom) { + if (eflag || vflag) { + Kokkos::parallel_reduce(inum, + LAMMPS_LAMBDA(int i, EV_FLOAT& energy_virial) { + energy_virial += + compute_item( + i, nlocal, d_ilist, d_neighbors, d_numneigh, x, type, + mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, v_vatom, v_eatom); + }, ev); + } else { + Kokkos::parallel_for(inum, + LAMMPS_LAMBDA(int i) { + compute_item( + i, nlocal, d_ilist, d_neighbors, d_numneigh, x, type, + mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, v_vatom, v_eatom); + }); + } +} + +template +static void getAllMixingWeights( + int ntotal, + typename ArrayTypes::t_float_2d_randomread dvector, + int nspecies, + int isite1, int isite2, + bool fractionalWeighting, + Kokkos::View const& mixWtSite1old, + Kokkos::View const& mixWtSite2old, + Kokkos::View const& mixWtSite1, + Kokkos::View const& mixWtSite2) { + Kokkos::parallel_for(ntotal, + LAMMPS_LAMBDA(int i) { + getMixingWeights(dvector,nspecies,isite1,isite2,fractionalWeighting, + i, mixWtSite1old(i), mixWtSite2old(i), mixWtSite1(i), mixWtSite2(i)); + }); +} + +template +template +void PairTableRXKokkos::compute_style(int eflag_in, int vflag_in) +{ + auto eflag = eflag_in; + auto vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.template view(); + } + + atomKK->sync(execution_space,datamask_read); + if (eflag || vflag) atomKK->modified(execution_space,datamask_modify); + else atomKK->modified(execution_space,F_MASK); + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + auto type = atomKK->k_type.view(); + auto uCG = atomKK->k_uCG.view(); + auto uCGnew = atomKK->k_uCGnew.view(); + auto nlocal = atom->nlocal; + Few special_lj_local; + special_lj_local[0] = force->special_lj[0]; + special_lj_local[1] = force->special_lj[1]; + special_lj_local[2] = force->special_lj[2]; + special_lj_local[3] = force->special_lj[3]; + auto newton_pair = force->newton_pair; + d_cutsq = d_table->cutsq; + // loop over neighbors of my atoms + + const int ntotal = atom->nlocal + atom->nghost; + if (ntotal > mixWtSite1.dimension_0()) { + mixWtSite1old = Kokkos::View("PairTableRXKokkos::mixWtSite1old", ntotal); + mixWtSite2old = Kokkos::View("PairTableRXKokkos::mixWtSite2old", ntotal); + mixWtSite1 = Kokkos::View("PairTableRXKokkos::mixWtSite1", ntotal); + mixWtSite2 = Kokkos::View("PairTableRXKokkos::mixWtSite2", ntotal); + } + + getAllMixingWeights(ntotal, atomKK->k_dvector.template view(), + nspecies, isite1, isite2, fractionalWeighting, + mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2); + + if (neighflag == N2) error->all(FLERR,"pair table/rx/kk can't handle N2 yet\n"); + + NeighListKokkos* l = + dynamic_cast*>(list); + + EV_FLOAT ev; + if(atom->ntypes > MAX_TYPES_STACKPARAMS) { + if (neighflag == HALFTHREAD) { + if (newton_pair) { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } else { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } + } else if (neighflag == HALF) { + if (newton_pair) { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } else { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } + } else if (neighflag == FULL) { + if (newton_pair) { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } else { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } + } + } else { + if (neighflag == HALFTHREAD) { + if (newton_pair) { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } else { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } + } else if (neighflag == HALF) { + if (newton_pair) { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } else { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } + } else if (neighflag == FULL) { + if (newton_pair) { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } else { + compute_all_items( + ev, nlocal, l->inum, l->d_ilist, l->d_neighbors, l->d_numneigh, + x, type, mixWtSite1old, mixWtSite2old, mixWtSite1, mixWtSite2, + special_lj_local, m_cutsq, d_cutsq, f, uCG, uCGnew, isite1, isite2, + d_table_const, eflag, eflag_atom, + vflag, vflag_global, vflag_atom, d_vatom, d_eatom); + } + } + } + + if (eflag) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } +} + +template +void PairTableRXKokkos::create_kokkos_tables() +{ + const int tlm1 = tablength-1; + + memoryKK->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits"); + memoryKK->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask"); + memoryKK->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq"); + memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); + memoryKK->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6"); + + if(tabstyle == LOOKUP) { + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f"); + } + + if(tabstyle == LINEAR) { + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); + memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de"); + memoryKK->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df"); + } + + if(tabstyle == SPLINE) { + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f"); + memoryKK->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2"); + memoryKK->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2"); + } + + if(tabstyle == BITMAP) { + int ntable = 1 << tablength; + memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq"); + memoryKK->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e"); + memoryKK->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f"); + memoryKK->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de"); + memoryKK->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df"); + memoryKK->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq"); + } + + + + for(int i=0; i < ntables; i++) { + Table* tb = &tables[i]; + + h_table->nshiftbits[i] = tb->nshiftbits; + h_table->nmask[i] = tb->nmask; + h_table->innersq[i] = tb->innersq; + h_table->invdelta[i] = tb->invdelta; + h_table->deltasq6[i] = tb->deltasq6; + + for(int j = 0; jrsq.dimension_1(); j++) + h_table->rsq(i,j) = tb->rsq[j]; + for(int j = 0; jdrsq.dimension_1(); j++) + h_table->drsq(i,j) = tb->drsq[j]; + for(int j = 0; je.dimension_1(); j++) + h_table->e(i,j) = tb->e[j]; + for(int j = 0; jde.dimension_1(); j++) + h_table->de(i,j) = tb->de[j]; + for(int j = 0; jf.dimension_1(); j++) + h_table->f(i,j) = tb->f[j]; + for(int j = 0; jdf.dimension_1(); j++) + h_table->df(i,j) = tb->df[j]; + for(int j = 0; je2.dimension_1(); j++) + h_table->e2(i,j) = tb->e2[j]; + for(int j = 0; jf2.dimension_1(); j++) + h_table->f2(i,j) = tb->f2[j]; + } + + + Kokkos::deep_copy(d_table->nshiftbits,h_table->nshiftbits); + d_table_const.nshiftbits = d_table->nshiftbits; + Kokkos::deep_copy(d_table->nmask,h_table->nmask); + d_table_const.nmask = d_table->nmask; + Kokkos::deep_copy(d_table->innersq,h_table->innersq); + d_table_const.innersq = d_table->innersq; + Kokkos::deep_copy(d_table->invdelta,h_table->invdelta); + d_table_const.invdelta = d_table->invdelta; + Kokkos::deep_copy(d_table->deltasq6,h_table->deltasq6); + d_table_const.deltasq6 = d_table->deltasq6; + + if(tabstyle == LOOKUP) { + Kokkos::deep_copy(d_table->e,h_table->e); + d_table_const.e = d_table->e; + Kokkos::deep_copy(d_table->f,h_table->f); + d_table_const.f = d_table->f; + } + + if(tabstyle == LINEAR) { + Kokkos::deep_copy(d_table->rsq,h_table->rsq); + d_table_const.rsq = d_table->rsq; + Kokkos::deep_copy(d_table->e,h_table->e); + d_table_const.e = d_table->e; + Kokkos::deep_copy(d_table->f,h_table->f); + d_table_const.f = d_table->f; + Kokkos::deep_copy(d_table->de,h_table->de); + d_table_const.de = d_table->de; + Kokkos::deep_copy(d_table->df,h_table->df); + d_table_const.df = d_table->df; + } + + if(tabstyle == SPLINE) { + Kokkos::deep_copy(d_table->rsq,h_table->rsq); + d_table_const.rsq = d_table->rsq; + Kokkos::deep_copy(d_table->e,h_table->e); + d_table_const.e = d_table->e; + Kokkos::deep_copy(d_table->f,h_table->f); + d_table_const.f = d_table->f; + Kokkos::deep_copy(d_table->e2,h_table->e2); + d_table_const.e2 = d_table->e2; + Kokkos::deep_copy(d_table->f2,h_table->f2); + d_table_const.f2 = d_table->f2; + } + + if(tabstyle == BITMAP) { + Kokkos::deep_copy(d_table->rsq,h_table->rsq); + d_table_const.rsq = d_table->rsq; + Kokkos::deep_copy(d_table->e,h_table->e); + d_table_const.e = d_table->e; + Kokkos::deep_copy(d_table->f,h_table->f); + d_table_const.f = d_table->f; + Kokkos::deep_copy(d_table->de,h_table->de); + d_table_const.de = d_table->de; + Kokkos::deep_copy(d_table->df,h_table->df); + d_table_const.df = d_table->df; + Kokkos::deep_copy(d_table->drsq,h_table->drsq); + d_table_const.drsq = d_table->drsq; + } + + Kokkos::deep_copy(d_table->cutsq,h_table->cutsq); + d_table_const.cutsq = d_table->cutsq; + Kokkos::deep_copy(d_table->tabindex,h_table->tabindex); + d_table_const.tabindex = d_table->tabindex; + + update_table = 0; +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairTableRXKokkos::allocate() +{ + allocated = 1; + const int nt = atom->ntypes + 1; + + memory->create(setflag,nt,nt,"pair:setflag"); + memoryKK->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq"); + memoryKK->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex"); + d_table_const.cutsq = d_table->cutsq; + d_table_const.tabindex = d_table->tabindex; + + memset(&setflag[0][0],0,nt*nt*sizeof(int)); + memset(&cutsq[0][0],0,nt*nt*sizeof(double)); + memset(&tabindex[0][0],0,nt*nt*sizeof(int)); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +template +void PairTableRXKokkos::settings(int narg, char **arg) +{ + if (narg < 2) error->all(FLERR,"Illegal pair_style command"); + + // new settings + + if (strcmp(arg[0],"lookup") == 0) tabstyle = LOOKUP; + else if (strcmp(arg[0],"linear") == 0) tabstyle = LINEAR; + else if (strcmp(arg[0],"spline") == 0) tabstyle = SPLINE; + else if (strcmp(arg[0],"bitmap") == 0) tabstyle = BITMAP; + else error->all(FLERR,"Unknown table style in pair_style command"); + + tablength = force->inumeric(FLERR,arg[1]); + if (tablength < 2) error->all(FLERR,"Illegal number of pair table entries"); + + // optional keywords + // assert the tabulation is compatible with a specific long-range solver + + int iarg = 2; + while (iarg < narg) { + if (strcmp(arg[iarg],"ewald") == 0) ewaldflag = 1; + else if (strcmp(arg[iarg],"pppm") == 0) pppmflag = 1; + else if (strcmp(arg[iarg],"msm") == 0) msmflag = 1; + else if (strcmp(arg[iarg],"dispersion") == 0) dispersionflag = 1; + else if (strcmp(arg[iarg],"tip4p") == 0) tip4pflag = 1; + else if (strcmp(arg[iarg],"fractional") == 0) fractionalWeighting = true; + else if (strcmp(arg[iarg],"molecular") == 0) fractionalWeighting = false; + else error->all(FLERR,"Illegal pair_style command"); + iarg++; + } + + // delete old tables, since cannot just change settings + + for (int m = 0; m < ntables; m++) free_table(&tables[m]); + memory->sfree(tables); + ntables = 0; + tables = NULL; + + if (allocated) { + memory->destroy(setflag); + + d_table_const.tabindex = d_table->tabindex = typename ArrayTypes::t_int_2d(); + h_table->tabindex = typename ArrayTypes::t_int_2d(); + + d_table_const.cutsq = d_table->cutsq = typename ArrayTypes::t_ffloat_2d(); + h_table->cutsq = typename ArrayTypes::t_ffloat_2d(); + allocated = 0; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +template +void PairTableRXKokkos::coeff(int narg, char **arg) +{ + if (narg != 6 && narg != 7) error->all(FLERR,"Illegal pair_coeff command"); + if (!allocated) allocate(); + + bool rx_flag = false; + for (int i = 0; i < modify->nfix; i++) + if (strncmp(modify->fix[i]->style,"rx",2) == 0) rx_flag = true; + if (!rx_flag) error->all(FLERR,"PairTableRX requires a fix rx command."); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + int me; + MPI_Comm_rank(world,&me); + tables = (Table *) + memory->srealloc(tables,(ntables+1)*sizeof(Table),"pair:tables"); + Table *tb = &tables[ntables]; + null_table(tb); + if (me == 0) read_table(tb,arg[2],arg[3]); + bcast_table(tb); + + nspecies = atom->nspecies_dpd; + if(nspecies==0) error->all(FLERR,"There are no rx species specified."); + int n; + n = strlen(arg[4]) + 1; + site1 = new char[n]; + strcpy(site1,arg[4]); + + int ispecies; + for (ispecies = 0; ispecies < nspecies; ispecies++){ + if (strcmp(site1,&atom->dname[ispecies][0]) == 0) break; + } + if (ispecies == nspecies && strcmp(site1,"1fluid") != 0) + error->all(FLERR,"Site1 name not recognized in pair coefficients"); + + n = strlen(arg[5]) + 1; + site2 = new char[n]; + strcpy(site2,arg[5]); + + for (ispecies = 0; ispecies < nspecies; ispecies++){ + if (strcmp(site2,&atom->dname[ispecies][0]) == 0) break; + } + if (ispecies == nspecies && strcmp(site2,"1fluid") != 0) + error->all(FLERR,"Site2 name not recognized in pair coefficients"); + + // set table cutoff + + if (narg == 7) tb->cut = force->numeric(FLERR,arg[6]); + else if (tb->rflag) tb->cut = tb->rhi; + else tb->cut = tb->rfile[tb->ninput-1]; + + // error check on table parameters + // insure cutoff is within table + // for BITMAP tables, file values can be in non-ascending order + + if (tb->ninput <= 1) error->one(FLERR,"Invalid pair table length"); + double rlo,rhi; + if (tb->rflag == 0) { + rlo = tb->rfile[0]; + rhi = tb->rfile[tb->ninput-1]; + } else { + rlo = tb->rlo; + rhi = tb->rhi; + } + if (tb->cut <= rlo || tb->cut > rhi) + error->all(FLERR,"Invalid pair table cutoff"); + if (rlo <= 0.0) error->all(FLERR,"Invalid pair table cutoff"); + + // match = 1 if don't need to spline read-in tables + // this is only the case if r values needed by final tables + // exactly match r values read from file + // for tabstyle SPLINE, always need to build spline tables + + tb->match = 0; + if (tabstyle == LINEAR && tb->ninput == tablength && + tb->rflag == RSQ && tb->rhi == tb->cut) tb->match = 1; + if (tabstyle == BITMAP && tb->ninput == 1 << tablength && + tb->rflag == BMP && tb->rhi == tb->cut) tb->match = 1; + if (tb->rflag == BMP && tb->match == 0) + error->all(FLERR,"Bitmapped table in file does not match requested table"); + + // spline read-in values and compute r,e,f vectors within table + + if (tb->match == 0) spline_table(tb); + compute_table(tb); + + // store ptr to table in tabindex + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + tabindex[i][j] = ntables; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Illegal pair_coeff command"); + ntables++; + + { + if ( strcmp(site1,"1fluid") == 0 ) + isite1 = OneFluidValue; + else { + isite1 = nspecies; + + for (int k = 0; k < nspecies; k++){ + if (strcmp(site1, atom->dname[k]) == 0){ + isite1 = k; + break; + } + } + + if (isite1 == nspecies) error->all(FLERR,"isite1 == nspecies"); + } + + if ( strcmp(site2,"1fluid") == 0 ) + isite2 = OneFluidValue; + else { + isite2 = nspecies; + + for (int k = 0; k < nspecies; k++){ + if (strcmp(site2, atom->dname[k]) == 0){ + isite2 = ispecies; + break; + } + } + + if (isite2 == nspecies) + error->all(FLERR,"isite2 == nspecies"); + } + } + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +template +double PairTableRXKokkos::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + tabindex[j][i] = tabindex[i][j]; + + if(i +double PairTableRXKokkos::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + int itable; + double fraction,value,a,b,phi; + int tlm1 = tablength - 1; + + Table *tb = &tables[tabindex[itype][jtype]]; + double mixWtSite1_i, mixWtSite1_j; + double mixWtSite2_i, mixWtSite2_j; + double mixWtSite1old_i, mixWtSite1old_j; + double mixWtSite2old_i, mixWtSite2old_j; + + fraction = 0.0; + a = 0.0; + b = 0.0; + + atomKK->k_dvector.template sync(); + typename ArrayTypes::t_float_2d_randomread h_dvector = + atomKK->k_dvector.view(); + getMixingWeights(h_dvector, + nspecies, isite1, isite2, fractionalWeighting, + i,mixWtSite1old_i,mixWtSite2old_i, + mixWtSite1_i,mixWtSite2_i); + getMixingWeights(h_dvector, + nspecies, isite1, isite2, fractionalWeighting, + j,mixWtSite1old_j,mixWtSite2old_j, + mixWtSite1_j,mixWtSite2_j); + + if (rsq < tb->innersq) error->one(FLERR,"Pair distance < table inner cutoff"); + + if (tabstyle == LOOKUP) { + itable = static_cast ((rsq-tb->innersq) * tb->invdelta); + if (itable >= tlm1) error->one(FLERR,"Pair distance > table outer cutoff"); + fforce = factor_lj * tb->f[itable]; + } else if (tabstyle == LINEAR) { + itable = static_cast ((rsq-tb->innersq) * tb->invdelta); + if (itable >= tlm1) error->one(FLERR,"Pair distance > table outer cutoff"); + fraction = (rsq - tb->rsq[itable]) * tb->invdelta; + value = tb->f[itable] + fraction*tb->df[itable]; + fforce = factor_lj * value; + } else if (tabstyle == SPLINE) { + itable = static_cast ((rsq-tb->innersq) * tb->invdelta); + if (itable >= tlm1) error->one(FLERR,"Pair distance > table outer cutoff"); + b = (rsq - tb->rsq[itable]) * tb->invdelta; + a = 1.0 - b; + value = a * tb->f[itable] + b * tb->f[itable+1] + + ((a*a*a-a)*tb->f2[itable] + (b*b*b-b)*tb->f2[itable+1]) * + tb->deltasq6; + fforce = factor_lj * value; + } else { + Pair::union_int_float_t rsq_lookup; + rsq_lookup.f = rsq; + itable = rsq_lookup.i & tb->nmask; + itable >>= tb->nshiftbits; + fraction = (rsq_lookup.f - tb->rsq[itable]) * tb->drsq[itable]; + value = tb->f[itable] + fraction*tb->df[itable]; + fforce = factor_lj * value; + } + + if (isite1 == isite2) fforce = sqrt(mixWtSite1_i*mixWtSite2_j)*fforce; + else fforce = (sqrt(mixWtSite1_i*mixWtSite2_j) + sqrt(mixWtSite2_i*mixWtSite1_j))*fforce; + + if (tabstyle == LOOKUP) + phi = tb->e[itable]; + else if (tabstyle == LINEAR || tabstyle == BITMAP) + phi = tb->e[itable] + fraction*tb->de[itable]; + else + phi = a * tb->e[itable] + b * tb->e[itable+1] + + ((a*a*a-a)*tb->e2[itable] + (b*b*b-b)*tb->e2[itable+1]) * tb->deltasq6; + + if (isite1 == isite2) phi = sqrt(mixWtSite1_i*mixWtSite2_j)*phi; + else phi = (sqrt(mixWtSite1_i*mixWtSite2_j) + sqrt(mixWtSite2_i*mixWtSite1_j))*phi; + + return factor_lj*phi; +} + +/* ---------------------------------------------------------------------- + compute r,e,f vectors from splined values +------------------------------------------------------------------------- */ + +template +void PairTableRXKokkos::compute_table(Table *tb) +{ + update_table = 1; + PairTable::compute_table(tb); +} + +template +void PairTableRXKokkos::init_style() +{ + neighbor->request(this,instance_me); + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else if (neighflag == N2) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 0; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/kk"); + } +} + +template +void PairTableRXKokkos::cleanup_copy() { + // WHY needed: this prevents parent copy from deallocating any arrays + allocated = 0; + cutsq = NULL; + eatom = NULL; + vatom = NULL; + h_table=NULL; d_table=NULL; +} + +namespace LAMMPS_NS { +template class PairTableRXKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairTableRXKokkos; +#endif + +} + diff --git a/src/KOKKOS/pair_table_rx_kokkos.h b/src/KOKKOS/pair_table_rx_kokkos.h new file mode 100644 index 0000000000..4230263dc9 --- /dev/null +++ b/src/KOKKOS/pair_table_rx_kokkos.h @@ -0,0 +1,122 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(table/rx/kk,PairTableRXKokkos) +PairStyle(table/rx/kk/device,PairTableRXKokkos) +PairStyle(table/rx/kk/host,PairTableRXKokkos) + +#else + +#ifndef LMP_PAIR_TABLE_RX_KOKKOS_H +#define LMP_PAIR_TABLE_RX_KOKKOS_H + +#include "pair_table_kokkos.h" +#include "kokkos_few.h" + +namespace LAMMPS_NS { + +template +class PairTableRXKokkos : public PairTable { + public: + enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2}; + typedef DeviceType device_type; + + PairTableRXKokkos(class LAMMPS *); + virtual ~PairTableRXKokkos(); + + virtual void compute(int, int); + + template + void compute_style(int, int); + + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + virtual double single(int, int, int, int, double, double, double, double &); + + void init_style(); + + struct TableDeviceConst { + typename ArrayTypes::t_ffloat_2d cutsq; + typename ArrayTypes::t_int_2d tabindex; + typename ArrayTypes::t_int_1d nshiftbits,nmask; + typename ArrayTypes::t_ffloat_1d innersq,invdelta,deltasq6; + typename ArrayTypes::t_ffloat_2d_randomread rsq,drsq,e,de,f,df,e2,f2; + }; + + struct TableDevice { + typename ArrayTypes::t_ffloat_2d cutsq; + typename ArrayTypes::t_int_2d tabindex; + typename ArrayTypes::t_int_1d nshiftbits,nmask; + typename ArrayTypes::t_ffloat_1d innersq,invdelta,deltasq6; + typename ArrayTypes::t_ffloat_2d rsq,drsq,e,de,f,df,e2,f2; + }; + + struct TableHost { + typename ArrayTypes::t_ffloat_2d cutsq; + typename ArrayTypes::t_int_2d tabindex; + typename ArrayTypes::t_int_1d nshiftbits,nmask; + typename ArrayTypes::t_ffloat_1d innersq,invdelta,deltasq6; + typename ArrayTypes::t_ffloat_2d rsq,drsq,e,de,f,df,e2,f2; + }; + + TableDeviceConst d_table_const; + TableDevice* d_table; + TableHost* h_table; + + Few, MAX_TYPES_STACKPARAMS+1> m_cutsq; + + typename ArrayTypes::t_ffloat_2d d_cutsq; + + virtual void allocate(); + void compute_table(Table *); + + typename ArrayTypes::t_x_array_randomread x; + typename ArrayTypes::t_f_array f; + + int neighflag; + + int update_table; + void create_kokkos_tables(); + void cleanup_copy(); + + friend void pair_virial_fdotr_compute(PairTableRXKokkos*); + + /* PairTableRX members */ + + Kokkos::View mixWtSite1old; + Kokkos::View mixWtSite2old; + Kokkos::View mixWtSite1; + Kokkos::View mixWtSite2; + + int nspecies; + char *site1, *site2; + int isite1, isite2; + bool fractionalWeighting; + + typename ArrayTypes::tdual_efloat_1d k_eatom; + typename ArrayTypes::tdual_virial_array k_vatom; + typename ArrayTypes::t_efloat_1d d_eatom; + typename ArrayTypes::t_virial_array d_vatom; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + + */ diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp index 833c815ad9..c585da6029 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -60,8 +60,8 @@ template PairTersoffKokkos::~PairTersoffKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -76,7 +76,7 @@ void PairTersoffKokkos::allocate() k_params = Kokkos::DualView ("PairTersoff::paramskk",n+1,n+1,n+1); - paramskk = k_params.d_view; + paramskk = k_params.template view(); } /* ---------------------------------------------------------------------- @@ -170,13 +170,13 @@ void PairTersoffKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index d77ba2f141..8e718fbf6f 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -60,8 +60,8 @@ template PairTersoffMODKokkos::~PairTersoffMODKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -76,7 +76,7 @@ void PairTersoffMODKokkos::allocate() k_params = Kokkos::DualView ("PairTersoffMOD::paramskk",n+1,n+1,n+1); - paramskk = k_params.d_view; + paramskk = k_params.template view(); } /* ---------------------------------------------------------------------- @@ -170,13 +170,13 @@ void PairTersoffMODKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index 040d8c5230..11a5ff1007 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -31,7 +31,7 @@ #include "integrate.h" #include "respa.h" #include "math_const.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" @@ -71,8 +71,8 @@ template PairTersoffZBLKokkos::~PairTersoffZBLKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); } } @@ -87,7 +87,7 @@ void PairTersoffZBLKokkos::allocate() k_params = Kokkos::DualView ("PairTersoffZBL::paramskk",n+1,n+1,n+1); - paramskk = k_params.d_view; + paramskk = k_params.template view(); } /* ---------------------------------------------------------------------- @@ -184,13 +184,13 @@ void PairTersoffZBLKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } diff --git a/src/KOKKOS/pair_vashishta_kokkos.cpp b/src/KOKKOS/pair_vashishta_kokkos.cpp index abdcfac89e..e7dd01bfe4 100644 --- a/src/KOKKOS/pair_vashishta_kokkos.cpp +++ b/src/KOKKOS/pair_vashishta_kokkos.cpp @@ -27,10 +27,10 @@ #include "neigh_request.h" #include "force.h" #include "comm.h" -#include "memory.h" +#include "memory_kokkos.h" #include "neighbor.h" #include "neigh_list_kokkos.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" #include "math_const.h" @@ -62,8 +62,8 @@ template PairVashishtaKokkos::~PairVashishtaKokkos() { if (!copymode) { - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); eatom = NULL; vatom = NULL; } @@ -85,13 +85,13 @@ void PairVashishtaKokkos::compute(int eflag_in, int vflag_in) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -573,7 +573,7 @@ void PairVashishtaKokkos::coeff(int narg, char **arg) k_map.template modify(); k_map.template sync(); - d_map = k_map.d_view; + d_map = k_map.template view(); } /* ---------------------------------------------------------------------- @@ -638,8 +638,8 @@ void PairVashishtaKokkos::setup_params() k_params.template modify(); k_params.template sync(); - d_elem2param = k_elem2param.d_view; - d_params = k_params.d_view; + d_elem2param = k_elem2param.template view(); + d_params = k_params.template view(); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/pair_vashishta_kokkos.h b/src/KOKKOS/pair_vashishta_kokkos.h index 174db2cb94..c5595bbd8a 100644 --- a/src/KOKKOS/pair_vashishta_kokkos.h +++ b/src/KOKKOS/pair_vashishta_kokkos.h @@ -103,7 +103,7 @@ class PairVashishtaKokkos : public PairVashishta { typedef typename tdual_int_3d::t_host t_host_int_3d; t_int_3d_randomread d_elem2param; - DAT::t_int_1d_randomread d_map; + typename AT::t_int_1d_randomread d_map; typedef Kokkos::DualView tdual_param_1d; typedef typename tdual_param_1d::t_dev t_param_1d; @@ -128,9 +128,9 @@ class PairVashishtaKokkos : public PairVashishta { typename ArrayTypes::t_efloat_1d d_eatom; typename ArrayTypes::t_virial_array d_vatom; - DAT::t_int_1d_randomread d_type2frho; - DAT::t_int_2d_randomread d_type2rhor; - DAT::t_int_2d_randomread d_type2z2r; + typename AT::t_int_1d_randomread d_type2frho; + typename AT::t_int_2d_randomread d_type2rhor; + typename AT::t_int_2d_randomread d_type2z2r; typename AT::t_neighbors_2d d_neighbors; typename AT::t_int_1d_randomread d_ilist; diff --git a/src/KOKKOS/pair_yukawa_kokkos.cpp b/src/KOKKOS/pair_yukawa_kokkos.cpp new file mode 100644 index 0000000000..6560ec9684 --- /dev/null +++ b/src/KOKKOS/pair_yukawa_kokkos.cpp @@ -0,0 +1,301 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Stefan Paquay (Brandeis University) +------------------------------------------------------------------------- */ +#include +#include +#include "pair_yukawa_kokkos.h" +#include "kokkos.h" +#include "atom_kokkos.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "respa.h" +#include "math_const.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define KOKKOS_CUDA_MAX_THREADS 256 +#define KOKKOS_CUDA_MIN_BLOCKS 8 + +/* ---------------------------------------------------------------------- */ + +template +PairYukawaKokkos::PairYukawaKokkos(LAMMPS *lmp) : PairYukawa(lmp) +{ + respa_enable = 0; + + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK; + datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK; + cutsq = NULL; +} + +/* ---------------------------------------------------------------------- */ + +template +PairYukawaKokkos::~PairYukawaKokkos() +{ + if (allocated) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + k_cutsq = DAT::tdual_ffloat_2d(); + memory->sfree(cutsq); + eatom = NULL; + vatom = NULL; + cutsq = NULL; + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairYukawaKokkos::cleanup_copy() { + // WHY needed: this prevents parent copy from deallocating any arrays + allocated = 0; + cutsq = NULL; + eatom = NULL; + vatom = NULL; +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairYukawaKokkos::allocate() +{ + PairYukawa::allocate(); + + int n = atom->ntypes; + memory->destroy(cutsq); + memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + k_params = Kokkos::DualView( + "PairYukawa::params",n+1,n+1); + + params = k_params.template view(); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairYukawaKokkos::init_style() +{ + PairYukawa::init_style(); + + // error if rRESPA with inner levels + + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { + int respa = 0; + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + if (respa) + error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle"); + } + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with yukawa/kk"); + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ +// Rewrite this. +template +double PairYukawaKokkos::init_one(int i, int j) +{ + double cutone = PairYukawa::init_one(i,j); + + k_params.h_view(i,j).a = a[i][j]; + k_params.h_view(i,j).offset = offset[i][j]; + k_params.h_view(i,j).cutsq = cutone*cutone; + k_params.h_view(j,i) = k_params.h_view(i,j); + + if(i(); + k_params.template modify(); + + return cutone; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairYukawaKokkos::compute(int eflag_in, int vflag_in) +{ + eflag = eflag_in; + vflag = vflag_in; + + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.view(); + } + + atomKK->sync(execution_space,datamask_read); + k_cutsq.template sync(); + k_params.template sync(); + if (eflag || vflag) atomKK->modified(execution_space,datamask_modify); + else atomKK->modified(execution_space,F_MASK); + + x = atomKK->k_x.view(); + c_x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + tag = atomKK->k_tag.view(); + nlocal = atom->nlocal; + nall = atom->nlocal + atom->nghost; + newton_pair = force->newton_pair; + special_lj[0] = force->special_lj[0]; + special_lj[1] = force->special_lj[1]; + special_lj[2] = force->special_lj[2]; + special_lj[3] = force->special_lj[3]; + + // loop over neighbors of my atoms + + EV_FLOAT ev = pair_compute,void >( + this,(NeighListKokkos*)list); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } +} + + + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairYukawaKokkos:: +compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT rr = sqrt(rsq); + // Fetch the params either off the stack or from some mapped memory? + const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a + : params(itype,jtype).a; + + // U = a * exp(-kappa*r) / r + // f = (kappa * a * exp(-kappa*r) / r + a*exp(-kappa*r)/r^2)*grad(r) + // = (kappa + 1/r) * (a * exp(-kappa*r) / r) + // f/r = (kappa + 1/r) * (a * exp(-kappa*r) / r^2) + const F_FLOAT rinv = 1.0 / rr; + const F_FLOAT rinv2 = rinv*rinv; + const F_FLOAT screening = exp(-kappa*rr); + const F_FLOAT forceyukawa = aa * screening * (kappa + rinv); + const F_FLOAT fpair = forceyukawa * rinv2; + + return fpair; +} + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairYukawaKokkos:: +compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT rr = sqrt(rsq); + const F_FLOAT aa = STACKPARAMS ? m_params[itype][jtype].a + : params(itype,jtype).a; + const F_FLOAT offset = STACKPARAMS ? m_params[itype][jtype].offset + : params(itype,jtype).offset; + + // U = a * exp(-kappa*r) / r + // f = (kappa * a * exp(-kappa*r) / r + a*exp(-kappa*r)/r^2)*grad(r) + // = (kappa + 1/r) * (a * exp(-kappa*r) / r) + // f/r = (kappa + 1/r) * (a * exp(-kappa*r) / r^2) + const F_FLOAT rinv = 1.0 / rr; + const F_FLOAT screening = exp(-kappa*rr); + + return aa * screening * rinv - offset; +} + + +namespace LAMMPS_NS { +template class PairYukawaKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairYukawaKokkos; +#endif +} diff --git a/src/KOKKOS/pair_yukawa_kokkos.h b/src/KOKKOS/pair_yukawa_kokkos.h new file mode 100644 index 0000000000..a4c8cf05b7 --- /dev/null +++ b/src/KOKKOS/pair_yukawa_kokkos.h @@ -0,0 +1,146 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(yukawa/kk,PairYukawaKokkos) +PairStyle(yukawa/kk/device,PairYukawaKokkos) +PairStyle(yukawa/kk/host,PairYukawaKokkos) + +#else + +#ifndef LMP_PAIR_YUKAWA_KOKKOS_H +#define LMP_PAIR_YUKAWA_KOKKOS_H + +#include "pair_kokkos.h" +#include "pair_yukawa.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +template +class PairYukawaKokkos : public PairYukawa { + public: + enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; + enum {COUL_FLAG=0}; + typedef DeviceType device_type; + typedef ArrayTypes AT; + + PairYukawaKokkos(class LAMMPS *); + virtual ~PairYukawaKokkos(); + + void compute(int, int); + void init_style(); + double init_one(int,int); + + struct params_yukawa { + KOKKOS_INLINE_FUNCTION + params_yukawa(){ cutsq=0, a = 0; offset = 0; } + KOKKOS_INLINE_FUNCTION + params_yukawa(int i){ cutsq=0, a = 0; offset = 0; } + F_FLOAT cutsq, a, offset; + }; + + + protected: + void cleanup_copy(); + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_ecoul(const F_FLOAT& rsq, const int& i, const int&j, + const int& itype, const int& jtype) const + { + return 0; + } + + + Kokkos::DualView k_params; + typename Kokkos::DualView::t_dev_const_um params; + params_yukawa m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + typename AT::t_x_array_randomread x; + typename AT::t_x_array c_x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + typename AT::t_tagint_1d tag; + + int newton_pair; + double special_lj[4]; + + typename AT::tdual_ffloat_2d k_cutsq; + typename AT::t_ffloat_2d d_cutsq; + + + int neighflag; + int nlocal,nall,eflag,vflag; + + void allocate(); + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend EV_FLOAT pair_compute_neighlist( + PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist( + PairYukawaKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute( + PairYukawaKokkos*,NeighListKokkos*); + friend void pair_virial_fdotr_compute(PairYukawaKokkos*); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Cannot use chosen neighbor list style with yukawa/kk + +That style is not supported by Kokkos. + +*/ diff --git a/src/KOKKOS/pair_zbl_kokkos.cpp b/src/KOKKOS/pair_zbl_kokkos.cpp new file mode 100644 index 0000000000..0ed9e62dff --- /dev/null +++ b/src/KOKKOS/pair_zbl_kokkos.cpp @@ -0,0 +1,439 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_zbl_kokkos.h" +#include "atom_kokkos.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "respa.h" +#include "math_const.h" +#include "memory_kokkos.h" +#include "error.h" +#include "atom_masks.h" +#include "kokkos.h" + +// From J.F. Zeigler, J. P. Biersack and U. Littmark, +// "The Stopping and Range of Ions in Matter" volume 1, Pergamon, 1985. + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace PairZBLConstants; + +/* ---------------------------------------------------------------------- */ + +template +PairZBLKokkos::PairZBLKokkos(LAMMPS *lmp) : PairZBL(lmp) +{ + respa_enable = 0; + + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK; + datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +PairZBLKokkos::~PairZBLKokkos() +{ + if (copymode) return; + + if (allocated) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + memory->sfree(cutsq); + eatom = NULL; + vatom = NULL; + cutsq = NULL; + } +} + + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairZBLKokkos::init_style() +{ + PairZBL::init_style(); + + // error if rRESPA with inner levels + + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { + int respa = 0; + if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + if (respa) + error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle"); + } + + // irequest = neigh request made by parent class + + neighflag = lmp->kokkos->neighflag; + int irequest = neighbor->nrequest - 1; + + neighbor->requests[irequest]-> + kokkos_host = Kokkos::Impl::is_same::value && + !Kokkos::Impl::is_same::value; + neighbor->requests[irequest]-> + kokkos_device = Kokkos::Impl::is_same::value; + + if (neighflag == FULL) { + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->half = 0; + } else if (neighflag == HALF || neighflag == HALFTHREAD) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 1; + } else if (neighflag == N2) { + neighbor->requests[irequest]->full = 0; + neighbor->requests[irequest]->half = 0; + } else { + error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/kk"); + } + + Kokkos::deep_copy(d_cutsq,cut_globalsq); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairZBLKokkos::compute(int eflag_in, int vflag_in) +{ + eflag = eflag_in; + vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + if (eflag || vflag) ev_setup(eflag,vflag,0); + else evflag = vflag_fdotr = 0; + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + d_vatom = k_vatom.view(); + } + + atomKK->sync(execution_space,datamask_read); + if (eflag || vflag) atomKK->modified(execution_space,datamask_modify); + else atomKK->modified(execution_space,F_MASK); + + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + nlocal = atom->nlocal; + nall = atom->nlocal + atom->nghost; + newton_pair = force->newton_pair; + special_lj[0] = force->special_lj[0]; + special_lj[1] = force->special_lj[1]; + special_lj[2] = force->special_lj[2]; + special_lj[3] = force->special_lj[3]; + + k_z.sync(); + k_d1a.sync(); + k_d2a.sync(); + k_d3a.sync(); + k_d4a.sync(); + k_zze.sync(); + k_sw1.sync(); + k_sw2.sync(); + k_sw3.sync(); + k_sw4.sync(); + k_sw5.sync(); + + // loop over neighbors of my atoms + + EV_FLOAT ev = pair_compute,void >(this,(NeighListKokkos*)list); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); +} + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairZBLKokkos:: +compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT r = sqrt(rsq); + F_FLOAT fpair = dzbldr(r, itype, jtype); + + if (rsq > cut_innersq) { + const F_FLOAT t = r - cut_inner; + const F_FLOAT fswitch = t*t * + (d_sw1(itype,jtype) + d_sw2(itype,jtype)*t); + fpair += fswitch; + } + + fpair *= -1.0/r; + return fpair; +} + +template +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairZBLKokkos:: +compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const { + (void) i; + (void) j; + const F_FLOAT r = sqrt(rsq); + F_FLOAT evdwl = e_zbl(r, itype, jtype); + evdwl += d_sw5(itype,jtype); + if (rsq > cut_innersq) { + const F_FLOAT t = r - cut_inner; + const F_FLOAT eswitch = t*t*t * + (d_sw3(itype,jtype) + d_sw4(itype,jtype)*t); + evdwl += eswitch; + } + return evdwl; +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +template +void PairZBLKokkos::allocate() +{ + PairZBL::allocate(); + + int n = atom->ntypes; + + k_z = DAT::tdual_ffloat_1d("pair_zbl:z ",n+1); + k_d1a = DAT::tdual_ffloat_2d_dl("pair_zbl:d1a",n+1,n+1); + k_d2a = DAT::tdual_ffloat_2d_dl("pair_zbl:d2a",n+1,n+1); + k_d3a = DAT::tdual_ffloat_2d_dl("pair_zbl:d3a",n+1,n+1); + k_d4a = DAT::tdual_ffloat_2d_dl("pair_zbl:d4a",n+1,n+1); + k_zze = DAT::tdual_ffloat_2d_dl("pair_zbl:zze",n+1,n+1); + k_sw1 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw1",n+1,n+1); + k_sw2 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw2",n+1,n+1); + k_sw3 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw3",n+1,n+1); + k_sw4 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw4",n+1,n+1); + k_sw5 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw5",n+1,n+1); + + d_z = k_z.view(); + d_d1a = k_d1a.view(); + d_d2a = k_d2a.view(); + d_d3a = k_d3a.view(); + d_d4a = k_d4a.view(); + d_zze = k_zze.view(); + d_sw1 = k_sw1.view(); + d_sw2 = k_sw2.view(); + d_sw3 = k_sw3.view(); + d_sw4 = k_sw4.view(); + d_sw5 = k_sw5.view(); + + d_cutsq = typename AT::t_ffloat_2d_dl("pair_zbl:cutsq",n+1,n+1); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +template +double PairZBLKokkos::init_one(int i, int j) +{ + double cutone = PairZBL::init_one(i,j); + + k_z.h_view(i) = z[i]; + k_z.h_view(j) = z[j]; + k_d1a.h_view(i,j) = k_d1a.h_view(j,i) = d1a[i][j]; + k_d2a.h_view(i,j) = k_d2a.h_view(j,i) = d2a[i][j]; + k_d3a.h_view(i,j) = k_d3a.h_view(j,i) = d3a[i][j]; + k_d4a.h_view(i,j) = k_d4a.h_view(j,i) = d4a[i][j]; + k_zze.h_view(i,j) = k_zze.h_view(j,i) = zze[i][j]; + k_sw1.h_view(i,j) = k_sw1.h_view(j,i) = sw1[i][j]; + k_sw2.h_view(i,j) = k_sw2.h_view(j,i) = sw2[i][j]; + k_sw3.h_view(i,j) = k_sw3.h_view(j,i) = sw3[i][j]; + k_sw4.h_view(i,j) = k_sw4.h_view(j,i) = sw4[i][j]; + k_sw5.h_view(i,j) = k_sw5.h_view(j,i) = sw5[i][j]; + + k_z.modify(); + k_d1a.modify(); + k_d2a.modify(); + k_d3a.modify(); + k_d4a.modify(); + k_zze.modify(); + k_sw1.modify(); + k_sw2.modify(); + k_sw3.modify(); + k_sw4.modify(); + k_sw5.modify(); + + if(i +KOKKOS_INLINE_FUNCTION +F_FLOAT PairZBLKokkos::e_zbl(F_FLOAT r, int i, int j) const { + + const F_FLOAT d1aij = d_d1a(i,j); + const F_FLOAT d2aij = d_d2a(i,j); + const F_FLOAT d3aij = d_d3a(i,j); + const F_FLOAT d4aij = d_d4a(i,j); + const F_FLOAT zzeij = d_zze(i,j); + const F_FLOAT rinv = 1.0/r; + + F_FLOAT sum = c1*exp(-d1aij*r); + sum += c2*exp(-d2aij*r); + sum += c3*exp(-d3aij*r); + sum += c4*exp(-d4aij*r); + + F_FLOAT result = zzeij*sum*rinv; + + return result; +} + +/* ---------------------------------------------------------------------- + compute ZBL first derivative +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairZBLKokkos::dzbldr(F_FLOAT r, int i, int j) const { + + const F_FLOAT d1aij = d_d1a(i,j); + const F_FLOAT d2aij = d_d2a(i,j); + const F_FLOAT d3aij = d_d3a(i,j); + const F_FLOAT d4aij = d_d4a(i,j); + const F_FLOAT zzeij = d_zze(i,j); + const F_FLOAT rinv = 1.0/r; + + const F_FLOAT e1 = exp(-d1aij*r); + const F_FLOAT e2 = exp(-d2aij*r); + const F_FLOAT e3 = exp(-d3aij*r); + const F_FLOAT e4 = exp(-d4aij*r); + + F_FLOAT sum = c1*e1; + sum += c2*e2; + sum += c3*e3; + sum += c4*e4; + + F_FLOAT sum_p = -c1*d1aij*e1; + sum_p -= c2*d2aij*e2; + sum_p -= c3*d3aij*e3; + sum_p -= c4*d4aij*e4; + + F_FLOAT result = zzeij*(sum_p - sum*rinv)*rinv; + + return result; +} + +/* ---------------------------------------------------------------------- + compute ZBL second derivative +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +F_FLOAT PairZBLKokkos::d2zbldr2(F_FLOAT r, int i, int j) const { + + const F_FLOAT d1aij = d_d1a(i,j); + const F_FLOAT d2aij = d_d2a(i,j); + const F_FLOAT d3aij = d_d3a(i,j); + const F_FLOAT d4aij = d_d4a(i,j); + const F_FLOAT zzeij = d_zze(i,j); + const F_FLOAT rinv = 1.0/r; + + const F_FLOAT e1 = exp(-d1aij*r); + const F_FLOAT e2 = exp(-d2aij*r); + const F_FLOAT e3 = exp(-d3aij*r); + const F_FLOAT e4 = exp(-d4aij*r); + + F_FLOAT sum = c1*e1; + sum += c2*e2; + sum += c3*e3; + sum += c4*e4; + + F_FLOAT sum_p = c1*e1*d1aij; + sum_p += c2*e2*d2aij; + sum_p += c3*e3*d3aij; + sum_p += c4*e4*d4aij; + + F_FLOAT sum_pp = c1*e1*d1aij*d1aij; + sum_pp += c2*e2*d2aij*d2aij; + sum_pp += c3*e3*d3aij*d3aij; + sum_pp += c4*e4*d4aij*d4aij; + + F_FLOAT result = zzeij*(sum_pp + 2.0*sum_p*rinv + + 2.0*sum*rinv*rinv)*rinv; + + return result; +} + + +/* ---------------------------------------------------------------------- */ + +template +void PairZBLKokkos::cleanup_copy() { + // WHY needed: this prevents parent copy from deallocating any arrays + allocated = 0; + cutsq = NULL; + eatom = NULL; + vatom = NULL; +} + +namespace LAMMPS_NS { +template class PairZBLKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class PairZBLKokkos; +#endif +} diff --git a/src/KOKKOS/pair_zbl_kokkos.h b/src/KOKKOS/pair_zbl_kokkos.h new file mode 100644 index 0000000000..fc54fa7092 --- /dev/null +++ b/src/KOKKOS/pair_zbl_kokkos.h @@ -0,0 +1,113 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(zbl/kk,PairZBLKokkos) +PairStyle(zbl/kk/device,PairZBLKokkos) +PairStyle(zbl/kk/host,PairZBLKokkos) + +#else + +#ifndef LMP_PAIR_ZBL_KOKKOS_H +#define LMP_PAIR_ZBL_KOKKOS_H + +#include "pair_zbl.h" +#include "pair_kokkos.h" +#include "neigh_list_kokkos.h" + +namespace LAMMPS_NS { + +template +class PairZBLKokkos : public PairZBL { + public: + enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF}; + enum {COUL_FLAG=0}; + typedef DeviceType device_type; + typedef ArrayTypes AT; + + PairZBLKokkos(class LAMMPS *); + virtual ~PairZBLKokkos(); + void compute(int, int); + void init_style(); + F_FLOAT init_one(int, int); + + private: + DAT::tdual_ffloat_1d k_z; + DAT::tdual_ffloat_2d_dl k_d1a,k_d2a,k_d3a,k_d4a,k_zze,k_sw1,k_sw2,k_sw3,k_sw4,k_sw5; + + typename AT::t_ffloat_1d d_z; + typename AT::t_ffloat_2d_dl d_d1a,d_d2a,d_d3a,d_d4a,d_zze,d_sw1,d_sw2,d_sw3,d_sw4,d_sw5; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1]; + typename AT::t_ffloat_2d_dl d_cutsq; + + int newton_pair; + int neighflag; + int nlocal,nall,eflag,vflag; + double special_lj[4]; + + KOKKOS_INLINE_FUNCTION + F_FLOAT e_zbl(F_FLOAT, int, int) const; + KOKKOS_INLINE_FUNCTION + F_FLOAT dzbldr(F_FLOAT, int, int) const; + KOKKOS_INLINE_FUNCTION + F_FLOAT d2zbldr2(F_FLOAT, int, int) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const; + + template + KOKKOS_INLINE_FUNCTION + F_FLOAT compute_ecoul(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const { + return 0; + } + + void cleanup_copy(); + void allocate(); + + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend class PairComputeFunctor; + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute_neighlist(PairZBLKokkos*,NeighListKokkos*); + friend EV_FLOAT pair_compute(PairZBLKokkos*,NeighListKokkos*); + friend void pair_virial_fdotr_compute(PairZBLKokkos*); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index bd3ed3644f..03de42c68c 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -32,9 +32,10 @@ #include "domain.h" #include "fft3d_wrap.h" #include "remap_wrap.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" #include "atom_masks.h" +#include "kokkos.h" #include "math_const.h" #include "math_special_kokkos.h" @@ -162,8 +163,8 @@ PPPMKokkos::~PPPMKokkos() //memory->destroy(part2grid); //memory->destroy(acons); - memory->destroy_kokkos(k_eatom,eatom); - memory->destroy_kokkos(k_vatom,vatom); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); eatom = NULL; vatom = NULL; } @@ -618,13 +619,13 @@ void PPPMKokkos::compute(int eflag, int vflag) // reallocate per-atom arrays if necessary if (eflag_atom) { - memory->destroy_kokkos(k_eatom,eatom); - memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); d_eatom = k_eatom.view(); } if (vflag_atom) { - memory->destroy_kokkos(k_vatom,vatom); - memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom"); d_vatom = k_vatom.view(); } @@ -805,12 +806,12 @@ void PPPMKokkos::allocate() { d_density_brick = typename AT::t_FFT_SCALAR_3d("pppm:density_brick",nzhi_out-nzlo_out+1,nyhi_out-nylo_out+1,nxhi_out-nxlo_out+1); - memory->create_kokkos(k_density_fft,density_fft,nfft_both,"pppm:d_density_fft"); + memoryKK->create_kokkos(k_density_fft,density_fft,nfft_both,"pppm:d_density_fft"); d_density_fft = k_density_fft.view(); d_greensfn = typename AT::t_float_1d("pppm:greensfn",nfft_both); - memory->create_kokkos(k_work1,work1,2*nfft_both,"pppm:work1"); - memory->create_kokkos(k_work2,work2,2*nfft_both,"pppm:work2"); + memoryKK->create_kokkos(k_work1,work1,2*nfft_both,"pppm:work1"); + memoryKK->create_kokkos(k_work2,work2,2*nfft_both,"pppm:work2"); d_work1 = k_work1.view(); d_work2 = k_work2.view(); d_vg = typename AT::t_virial_array("pppm:vg",nfft_both); @@ -878,13 +879,13 @@ void PPPMKokkos::allocate() template void PPPMKokkos::deallocate() { - memory->destroy_kokkos(d_density_fft,density_fft); + memoryKK->destroy_kokkos(d_density_fft,density_fft); density_fft = NULL; - memory->destroy_kokkos(d_greensfn,greensfn); + memoryKK->destroy_kokkos(d_greensfn,greensfn); greensfn = NULL; - memory->destroy_kokkos(d_work1,work1); + memoryKK->destroy_kokkos(d_work1,work1); work1 = NULL; - memory->destroy_kokkos(d_work2,work2); + memoryKK->destroy_kokkos(d_work2,work2); work2 = NULL; delete fft1; @@ -968,6 +969,8 @@ void PPPMKokkos::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; else g_ewald = sqrt(-log(g_ewald)) / cutoff; @@ -1178,6 +1181,7 @@ double PPPMKokkos::final_accuracy() double yprd = domain->yprd; double zprd = domain->zprd; bigint natoms = atomKK->natoms; + if (natoms == 0) natoms = 1; // avoid division by zero double df_kspace = compute_df_kspace(); double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd); @@ -2631,7 +2635,7 @@ void PPPMKokkos::operator()(TagPPPM_fieldforce_peratom, const int &i ------------------------------------------------------------------------- */ template -void PPPMKokkos::pack_forward_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) +void PPPMKokkos::pack_forward_kspace_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) { typename AT::t_int_2d_um d_list = k_list.view(); d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL()); @@ -2687,7 +2691,7 @@ void PPPMKokkos::operator()(TagPPPM_pack_forward2, const int &i) con ------------------------------------------------------------------------- */ template -void PPPMKokkos::unpack_forward_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) +void PPPMKokkos::unpack_forward_kspace_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) { typename AT::t_int_2d_um d_list = k_list.view(); d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL()); @@ -2744,7 +2748,7 @@ void PPPMKokkos::operator()(TagPPPM_unpack_forward2, const int &i) c ------------------------------------------------------------------------- */ template -void PPPMKokkos::pack_reverse_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) +void PPPMKokkos::pack_reverse_kspace_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) { typename AT::t_int_2d_um d_list = k_list.view(); d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL()); @@ -2774,7 +2778,7 @@ void PPPMKokkos::operator()(TagPPPM_pack_reverse, const int &i) cons ------------------------------------------------------------------------- */ template -void PPPMKokkos::unpack_reverse_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) +void PPPMKokkos::unpack_reverse_kspace_kokkos(int flag, Kokkos::DualView &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index) { typename AT::t_int_2d_um d_list = k_list.view(); d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL()); diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index 4e6bb1d74c..c328b488d0 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -24,6 +24,7 @@ KSpaceStyle(pppm/kk/host,PPPMKokkos) #include "pppm.h" #include "gridcomm_kokkos.h" +#include "kokkos_base.h" #include "kokkos_type.h" namespace LAMMPS_NS { @@ -86,7 +87,7 @@ struct TagPPPM_slabcorr4{}; struct TagPPPM_timing_zero{}; template -class PPPMKokkos : public PPPM { +class PPPMKokkos : public PPPM, public KokkosBase { public: typedef DeviceType device_type; typedef ArrayTypes AT; @@ -379,10 +380,10 @@ class PPPMKokkos : public PPPM { // grid communication - virtual void pack_forward_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); - virtual void unpack_forward_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); - virtual void pack_reverse_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); - virtual void unpack_reverse_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); + void pack_forward_kspace_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); + void unpack_forward_kspace_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); + void pack_reverse_kspace_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); + void unpack_reverse_kspace_kokkos(int, Kokkos::DualView &, int, DAT::tdual_int_2d &, int); // triclinic diff --git a/src/KOKKOS/rand_pool_wrap_kokkos.cpp b/src/KOKKOS/rand_pool_wrap_kokkos.cpp new file mode 100644 index 0000000000..c11764640b --- /dev/null +++ b/src/KOKKOS/rand_pool_wrap_kokkos.cpp @@ -0,0 +1,72 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "comm.h" +#include "rand_pool_wrap_kokkos.h" +#include "lammps.h" +#include "kokkos.h" +#include "random_mars.h" +#include "update.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +RandPoolWrap::RandPoolWrap(int, LAMMPS *lmp) : Pointers(lmp) +{ + random_thr = NULL; + nthreads = lmp->kokkos->num_threads; +} + +/* ---------------------------------------------------------------------- */ + +RandPoolWrap::~RandPoolWrap() +{ + +} + +void RandPoolWrap::destroy() +{ + if (random_thr) { + for (int i=1; i < nthreads; ++i) + delete random_thr[i]; + + delete[] random_thr; + random_thr = NULL; + } +} + +void RandPoolWrap::init(RanMars* random, int seed) +{ + // deallocate pool of RNGs + if (random_thr) { + for (int i=1; i < this->nthreads; ++i) + delete random_thr[i]; + + delete[] random_thr; + } + + // allocate pool of RNGs + // generate a random number generator instance for + // all threads != 0. make sure we use unique seeds. + nthreads = lmp->kokkos->num_threads; + random_thr = new RanMars*[nthreads]; + for (int tid = 1; tid < nthreads; ++tid) { + random_thr[tid] = new RanMars(lmp, seed + comm->me + + comm->nprocs*tid); + } + + // to ensure full compatibility with the serial style + // we use the serial random number generator instance for thread 0 + random_thr[0] = random; +} diff --git a/src/KOKKOS/rand_pool_wrap_kokkos.h b/src/KOKKOS/rand_pool_wrap_kokkos.h new file mode 100644 index 0000000000..975ce0c89a --- /dev/null +++ b/src/KOKKOS/rand_pool_wrap_kokkos.h @@ -0,0 +1,83 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef RAND_POOL_WRAP_H +#define RAND_POOL_WRAP_H + +#include "pointers.h" +#include "kokkos_type.h" +#include "random_mars.h" +#include "error.h" + +namespace LAMMPS_NS { + +struct RandWrap { + class RanMars* rng; + + KOKKOS_INLINE_FUNCTION + RandWrap() { + rng = NULL; + } + + KOKKOS_INLINE_FUNCTION + double drand() { + return rng->uniform(); + } + + KOKKOS_INLINE_FUNCTION + double normal() { + return rng->gaussian(); + } +}; + +class RandPoolWrap : protected Pointers { + public: + RandPoolWrap(int, class LAMMPS *); + ~RandPoolWrap(); + void destroy(); + void init(RanMars*, int); + + KOKKOS_INLINE_FUNCTION + RandWrap get_state() const + { +#ifdef KOKKOS_HAVE_CUDA + error->all(FLERR,"Cannot use Marsaglia RNG with GPUs"); +#endif + + RandWrap rand_wrap; + int tid = 0; +#ifndef KOKKOS_HAVE_CUDA + tid = LMPDeviceType::hardware_thread_id(); +#endif + rand_wrap.rng = random_thr[tid]; + return rand_wrap; + } + + KOKKOS_INLINE_FUNCTION + void free_state(RandWrap) const + { + + } + + private: + class RanMars **random_thr; + int nthreads; +}; + +} + +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/KOKKOS/region_block_kokkos.cpp b/src/KOKKOS/region_block_kokkos.cpp index 6734d7fdd1..eed4272f23 100644 --- a/src/KOKKOS/region_block_kokkos.cpp +++ b/src/KOKKOS/region_block_kokkos.cpp @@ -54,10 +54,10 @@ int RegBlockKokkos::k_inside(double x, double y, double z) const } template -void RegBlockKokkos::match_all_kokkos(int groupbit_in, DAT::t_int_1d d_match_in) +void RegBlockKokkos::match_all_kokkos(int groupbit_in, DAT::tdual_int_1d k_match_in) { groupbit = groupbit_in; - d_match = d_match_in; + d_match = k_match_in.template view(); atomKK->sync(Device, X_MASK | MASK_MASK); @@ -67,8 +67,9 @@ void RegBlockKokkos::match_all_kokkos(int groupbit_in, DAT::t_int_1d copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; + + k_match_in.template modify(); } template diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h index f570e3ed33..532bc588e2 100644 --- a/src/KOKKOS/region_block_kokkos.h +++ b/src/KOKKOS/region_block_kokkos.h @@ -23,6 +23,7 @@ RegionStyle(block/kk/host,RegBlockKokkos) #define LMP_REGION_BLOCK_KOKKOS_H #include "region_block.h" +#include "kokkos_base.h" #include "kokkos_type.h" namespace LAMMPS_NS { @@ -30,7 +31,7 @@ namespace LAMMPS_NS { struct TagRegBlockMatchAll{}; template -class RegBlockKokkos : public RegBlock { +class RegBlockKokkos : public RegBlock, public KokkosBase { friend class FixPour; public: @@ -39,14 +40,14 @@ class RegBlockKokkos : public RegBlock { RegBlockKokkos(class LAMMPS *, int, char **); ~RegBlockKokkos(); - void match_all_kokkos(int, DAT::t_int_1d); + void match_all_kokkos(int, DAT::tdual_int_1d); KOKKOS_INLINE_FUNCTION void operator()(TagRegBlockMatchAll, const int&) const; private: int groupbit; - DAT::t_int_1d d_match; + typename AT::t_int_1d d_match; typename AT::t_x_array_randomread x; typename AT::t_int_1d_randomread mask; diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h new file mode 100644 index 0000000000..7a80b262b7 --- /dev/null +++ b/src/KOKKOS/sna_kokkos.h @@ -0,0 +1,211 @@ +/* -*- c++ -*- ------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Christian Trott (SNL), Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#ifndef LMP_SNA_KOKKOS_H +#define LMP_SNA_KOKKOS_H + +#include +#include +#include +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct SNAKK_LOOPINDICES { + int j1, j2, j; +}; + +template +class SNAKokkos { + +public: + typedef Kokkos::View t_sna_1i; + typedef Kokkos::View t_sna_1d; + typedef Kokkos::View t_sna_2d; + typedef Kokkos::View t_sna_3d; + typedef Kokkos::View > t_sna_3d_atomic; + typedef Kokkos::View t_sna_4d; + typedef Kokkos::View t_sna_3d3; + typedef Kokkos::View t_sna_5d; + +inline + SNAKokkos() {}; + KOKKOS_INLINE_FUNCTION + SNAKokkos(const SNAKokkos& sna, const typename Kokkos::TeamPolicy::member_type& team); + +inline + SNAKokkos(double, int, int, int, double, int, int); + + KOKKOS_INLINE_FUNCTION + ~SNAKokkos(); + +inline + void build_indexlist(); // SNAKokkos() + +inline + void init(); // + +inline + T_INT size_team_scratch_arrays(); + +inline + T_INT size_thread_scratch_arrays(); + + double memory_usage(); + + int ncoeff; + + // functions for bispectrum coefficients + + KOKKOS_INLINE_FUNCTION + void compute_ui(const typename Kokkos::TeamPolicy::member_type& team, int); // ForceSNAP + KOKKOS_INLINE_FUNCTION + void compute_zi(const typename Kokkos::TeamPolicy::member_type& team); // ForceSNAP + KOKKOS_INLINE_FUNCTION + void compute_bi(const typename Kokkos::TeamPolicy::member_type& team); // ForceSNAP + KOKKOS_INLINE_FUNCTION + void copy_bi2bvec(const typename Kokkos::TeamPolicy::member_type& team); //ForceSNAP + + // functions for derivatives + + KOKKOS_INLINE_FUNCTION + void compute_duidrj(const typename Kokkos::TeamPolicy::member_type& team, double*, double, double); //ForceSNAP + KOKKOS_INLINE_FUNCTION + void compute_dbidrj(const typename Kokkos::TeamPolicy::member_type& team); //ForceSNAP + KOKKOS_INLINE_FUNCTION + void copy_dbi2dbvec(const typename Kokkos::TeamPolicy::member_type& team); //ForceSNAP + KOKKOS_INLINE_FUNCTION + double compute_sfac(double, double); // add_uarraytot, compute_duarray + KOKKOS_INLINE_FUNCTION + double compute_dsfac(double, double); // compute_duarray + +#ifdef TIMING_INFO + double* timers; + timespec starttime, endtime; + int print; + int counter; +#endif + + //per sna class instance for OMP use + + + // Per InFlight Particle + t_sna_2d rij; + t_sna_1i inside; + t_sna_1d wj; + t_sna_1d rcutij; + int nmax; + + void grow_rij(int); + + int twojmax, diagonalstyle; + // Per InFlight Particle + t_sna_3d barray; + t_sna_3d uarraytot_r, uarraytot_i; + t_sna_3d_atomic uarraytot_r_a, uarraytot_i_a; + t_sna_5d zarray_r, zarray_i; + + // Per InFlight Interaction + t_sna_3d uarray_r, uarray_i; + + Kokkos::View bvec; + + // derivatives of data + Kokkos::View dbvec; + t_sna_4d duarray_r, duarray_i; + t_sna_4d dbarray; + +private: + double rmin0, rfac0; + + //use indexlist instead of loops, constructor generates these + // Same accross all SNAKokkos + Kokkos::View idxj,idxj_full; + int idxj_max,idxj_full_max; + // data for bispectrum coefficients + + // Same accross all SNAKokkos + t_sna_5d cgarray; + t_sna_2d rootpqarray; + + + static const int nmaxfactorial = 167; + KOKKOS_INLINE_FUNCTION + double factorial(int); + + KOKKOS_INLINE_FUNCTION + void create_team_scratch_arrays(const typename Kokkos::TeamPolicy::member_type& team); // SNAKokkos() + KOKKOS_INLINE_FUNCTION + void create_thread_scratch_arrays(const typename Kokkos::TeamPolicy::member_type& team); // SNAKokkos() + +inline + void init_clebsch_gordan(); // init() + +inline + void init_rootpqarray(); // init() + KOKKOS_INLINE_FUNCTION + void zero_uarraytot(const typename Kokkos::TeamPolicy::member_type& team); // compute_ui + KOKKOS_INLINE_FUNCTION + void addself_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, double); // compute_ui + KOKKOS_INLINE_FUNCTION + void add_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, double, double, double); // compute_ui + + KOKKOS_INLINE_FUNCTION + void compute_uarray(const typename Kokkos::TeamPolicy::member_type& team, + double, double, double, + double, double); // compute_ui + KOKKOS_INLINE_FUNCTION + double deltacg(int, int, int); // init_clebsch_gordan + +inline + int compute_ncoeff(); // SNAKokkos() + KOKKOS_INLINE_FUNCTION + void compute_duarray(const typename Kokkos::TeamPolicy::member_type& team, + double, double, double, // compute_duidrj + double, double, double, double, double); + + // if number of atoms are small use per atom arrays + // for twojmax arrays, rij, inside, bvec + // this will increase the memory footprint considerably, + // but allows parallel filling and reuse of these arrays + int use_shared_arrays; + + // Sets the style for the switching function + // 0 = none + // 1 = cosine + int switch_flag; + + // Self-weight + double wself; + + int bzero_flag; // 1 if bzero subtracted from barray + Kokkos::View bzero; // array of B values for isolated atoms +}; + +} + +#include "sna_kokkos_impl.h" +#endif + +/* ERROR/WARNING messages: + +E: Invalid argument to factorial %d + +N must be >= 0 and <= 167, otherwise the factorial result is too +large. + +*/ diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h new file mode 100644 index 0000000000..086802573d --- /dev/null +++ b/src/KOKKOS/sna_kokkos_impl.h @@ -0,0 +1,1289 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Christian Trott (SNL), Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include "sna_kokkos.h" +#include +#include +#include + +using namespace LAMMPS_NS; + +static const double MY_PI = 3.14159265358979323846; // pi + +template +inline +SNAKokkos::SNAKokkos(double rfac0_in, + int twojmax_in, int diagonalstyle_in, int use_shared_arrays_in, + double rmin0_in, int switch_flag_in, int bzero_flag_in) +{ + wself = 1.0; + + use_shared_arrays = use_shared_arrays_in; + rfac0 = rfac0_in; + rmin0 = rmin0_in; + switch_flag = switch_flag_in; + bzero_flag = bzero_flag_in; + + twojmax = twojmax_in; + diagonalstyle = diagonalstyle_in; + + ncoeff = compute_ncoeff(); + + //create_twojmax_arrays(); + + nmax = 0; + + build_indexlist(); + + int jdim = twojmax + 1; + + cgarray = t_sna_5d("SNAKokkos::cgarray",jdim,jdim,jdim,jdim,jdim); + rootpqarray = t_sna_2d("SNAKokkos::rootpqarray",jdim+1,jdim+1); + + if (bzero_flag) { + bzero = Kokkos::View("sna:bzero",jdim); + auto h_bzero = Kokkos::create_mirror_view(bzero); + + double www = wself*wself*wself; + for(int j = 0; j <= twojmax; j++) + h_bzero[j] = www*(j+1); + Kokkos::deep_copy(bzero,h_bzero); + } +} + +template +KOKKOS_INLINE_FUNCTION +SNAKokkos::SNAKokkos(const SNAKokkos& sna, const typename Kokkos::TeamPolicy::member_type& team) { + wself = sna.wself; + + use_shared_arrays = sna.use_shared_arrays; + rfac0 = sna.rfac0; + rmin0 = sna.rmin0; + switch_flag = sna.switch_flag; + bzero_flag = sna.bzero_flag; + + twojmax = sna.twojmax; + diagonalstyle = sna.diagonalstyle; + + ncoeff = sna.ncoeff; + nmax = sna.nmax; + idxj = sna.idxj; + idxj_max = sna.idxj_max; + idxj_full = sna.idxj_full; + idxj_full_max = sna.idxj_full_max; + cgarray = sna.cgarray; + rootpqarray = sna.rootpqarray; + bzero = sna.bzero; + create_team_scratch_arrays(team); + create_thread_scratch_arrays(team); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +SNAKokkos::~SNAKokkos() +{ +} + +template +inline +void SNAKokkos::build_indexlist() +{ + if(diagonalstyle == 3) { + int idxj_count = 0; + int idxj_full_count = 0; + + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + if (j >= j1) idxj_count++; + idxj_full_count++; + } + + // indexList can be changed here + + idxj = Kokkos::View("SNAKokkos::idxj",idxj_count); + idxj_full = Kokkos::View("SNAKokkos::idxj_full",idxj_full_count); + auto h_idxj = Kokkos::create_mirror_view(idxj); + auto h_idxj_full = Kokkos::create_mirror_view(idxj_full); + + idxj_max = idxj_count; + idxj_full_max = idxj_full_count; + + idxj_count = 0; + idxj_full_count = 0; + + for(int j1 = 0; j1 <= twojmax; j1++) + for(int j2 = 0; j2 <= j1; j2++) + for(int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) { + if (j >= j1) { + h_idxj[idxj_count].j1 = j1; + h_idxj[idxj_count].j2 = j2; + h_idxj[idxj_count].j = j; + idxj_count++; + } + h_idxj_full[idxj_full_count].j1 = j1; + h_idxj_full[idxj_full_count].j2 = j2; + h_idxj_full[idxj_full_count].j = j; + idxj_full_count++; + } + Kokkos::deep_copy(idxj,h_idxj); + Kokkos::deep_copy(idxj_full,h_idxj_full); + + } + +} +/* ---------------------------------------------------------------------- */ + +template +inline +void SNAKokkos::init() +{ + init_clebsch_gordan(); + init_rootpqarray(); +} + +template +inline +void SNAKokkos::grow_rij(int newnmax) +{ + if(newnmax <= nmax) return; + nmax = newnmax; +} +/* ---------------------------------------------------------------------- + compute Ui by summing over neighbors j +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_ui(const typename Kokkos::TeamPolicy::member_type& team, int jnum) +{ + double rsq, r, x, y, z, z0, theta0; + + // utot(j,ma,mb) = 0 for all j,ma,ma + // utot(j,ma,ma) = 1 for all j,ma + // for j in neighbors of i: + // compute r0 = (x,y,z,z0) + // utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb + + if(team.team_rank() == 0) { + zero_uarraytot(team); + //Kokkos::single(Kokkos::PerThread(team), [&] (){ + addself_uarraytot(team,wself); + //}); + } + team.team_barrier(); + + Kokkos::parallel_for(Kokkos::TeamThreadRange(team,jnum), + [&] (const int& j) { + //for(int j = 0; j < jnum; j++) { + x = rij(j,0); + y = rij(j,1); + z = rij(j,2); + rsq = x * x + y * y + z * z; + r = sqrt(rsq); + + theta0 = (r - rmin0) * rfac0 * MY_PI / (rcutij[j] - rmin0); + // theta0 = (r - rmin0) * rscale0; + z0 = r / tan(theta0); + + compute_uarray(team,x, y, z, z0, r); + //Kokkos::single(Kokkos::PerThread(team), [&] (){ + add_uarraytot(team,r, wj[j], rcutij[j]); + //}); + }); + +} + +/* ---------------------------------------------------------------------- + compute Zi by summing over products of Ui +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_zi(const typename Kokkos::TeamPolicy::member_type& team) +{ + // for j1 = 0,...,twojmax + // for j2 = 0,twojmax + // for j = |j1-j2|,Min(twojmax,j1+j2),2 + // for ma = 0,...,j + // for mb = 0,...,jmid + // z(j1,j2,j,ma,mb) = 0 + // for ma1 = Max(0,ma+(j1-j2-j)/2),Min(j1,ma+(j1+j2-j)/2) + // sumb1 = 0 + // ma2 = ma-ma1+(j1+j2-j)/2; + // for mb1 = Max(0,mb+(j1-j2-j)/2),Min(j1,mb+(j1+j2-j)/2) + // mb2 = mb-mb1+(j1+j2-j)/2; + // sumb1 += cg(j1,mb1,j2,mb2,j) * + // u(j1,ma1,mb1) * u(j2,ma2,mb2) + // z(j1,j2,j,ma,mb) += sumb1*cg(j1,ma1,j2,ma2,j) + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &starttime); +#endif + + // compute_dbidrj() requires full j1/j2/j chunk of z elements + // use zarray j1/j2 symmetry + + Kokkos::parallel_for(Kokkos::TeamThreadRange(team,idxj_full_max), + [&] (const int& idx) { + const int j1 = idxj_full(idx).j1; + const int j2 = idxj_full(idx).j2; + const int j = idxj_full(idx).j; + + const int bound = (j+2)/2; + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+1)*bound), + [&] (const int mbma ) { + //for(int mb = 0; 2*mb <= j; mb++) + //for(int ma = 0; ma <= j; ma++) { + const int ma = mbma%(j+1); + const int mb = mbma/(j+1); + + //zarray_r(j1,j2,j,ma,mb) = 0.0; + //zarray_i(j1,j2,j,ma,mb) = 0.0; + double z_r = 0.0; + double z_i = 0.0; + + for(int ma1 = MAX(0, (2 * ma - j - j2 + j1) / 2); + ma1 <= MIN(j1, (2 * ma - j + j2 + j1) / 2); ma1++) { + double sumb1_r = 0.0; + double sumb1_i = 0.0; + + const int ma2 = (2 * ma - j - (2 * ma1 - j1) + j2) / 2; + + for(int mb1 = MAX( 0, (2 * mb - j - j2 + j1) / 2); + mb1 <= MIN(j1, (2 * mb - j + j2 + j1) / 2); mb1++) { + + const int mb2 = (2 * mb - j - (2 * mb1 - j1) + j2) / 2; + const double cga = cgarray(j1,j2,j,mb1,mb2); + const double uat1_r = uarraytot_r(j1,ma1,mb1); + const double uat1_i = uarraytot_i(j1,ma1,mb1); + const double uat2_r = uarraytot_r(j2,ma2,mb2); + const double uat2_i = uarraytot_i(j2,ma2,mb2); + sumb1_r += cga * (uat1_r * uat2_r - uat1_i * uat2_i); + sumb1_i += cga * (uat1_r * uat2_i + uat1_i * uat2_r); + /*sumb1_r += cgarray(j1,j2,j,mb1,mb2) * + (uarraytot_r(j1,ma1,mb1) * uarraytot_r(j2,ma2,mb2) - + uarraytot_i(j1,ma1,mb1) * uarraytot_i(j2,ma2,mb2)); + sumb1_i += cgarray(j1,j2,j,mb1,mb2) * + (uarraytot_r(j1,ma1,mb1) * uarraytot_i(j2,ma2,mb2) + + uarraytot_i(j1,ma1,mb1) * uarraytot_r(j2,ma2,mb2));*/ + } // end loop over mb1 + + const double cga = cgarray(j1,j2,j,ma1,ma2); + z_r += sumb1_r * cga;//rray(j1,j2,j,ma1,ma2); + z_i += sumb1_i * cga;//rray(j1,j2,j,ma1,ma2); + } // end loop over ma1 + zarray_r(j1,j2,j,mb,ma) = z_r; + zarray_i(j1,j2,j,mb,ma) = z_i; + }); // end loop over ma, mb + // } + //} + }); + //} // end loop over j + //} // end loop over j1, j2 + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &endtime); + timers[1] += (endtime.tv_sec - starttime.tv_sec + 1.0 * + (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); +#endif +} + + +/* ---------------------------------------------------------------------- + compute Bi by summing conj(Ui)*Zi +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_bi(const typename Kokkos::TeamPolicy::member_type& team) +{ + // for j1 = 0,...,twojmax + // for j2 = 0,twojmax + // for j = |j1-j2|,Min(twojmax,j1+j2),2 + // b(j1,j2,j) = 0 + // for mb = 0,...,jmid + // for ma = 0,...,j + // b(j1,j2,j) += + // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &starttime); +#endif + + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,idxj_max), + [&] (const int& idx) { + const int j1 = idxj(idx).j1; + const int j2 = idxj(idx).j2; + const int j = idxj(idx).j; + double b_j1_j2_j = 0.0; + + for(int mb = 0; 2*mb < j; mb++) + for(int ma = 0; ma <= j; ma++) { + b_j1_j2_j += + uarraytot_r(j,ma,mb) * zarray_r(j1,j2,j,mb,ma) + + uarraytot_i(j,ma,mb) * zarray_i(j1,j2,j,mb,ma); + } // end loop over ma, mb + + // For j even, special treatment for middle column + + if (j%2 == 0) { + const int mb = j/2; + for(int ma = 0; ma < mb; ma++) { + b_j1_j2_j += + uarraytot_r(j,ma,mb) * zarray_r(j1,j2,j,mb,ma) + + uarraytot_i(j,ma,mb) * zarray_i(j1,j2,j,mb,ma); + } + + const int ma = mb; + b_j1_j2_j += + (uarraytot_r(j,ma,mb) * zarray_r(j1,j2,j,mb,ma) + + uarraytot_i(j,ma,mb) * zarray_i(j1,j2,j,mb,ma))*0.5; + } + + b_j1_j2_j *= 2.0; + if (bzero_flag) + b_j1_j2_j -= bzero[j]; + + barray(j1,j2,j) = b_j1_j2_j; + }); + //} // end loop over j + //} // end loop over j1, j2 + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &endtime); + timers[2] += (endtime.tv_sec - starttime.tv_sec + 1.0 * + (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); +#endif + +} + +/* ---------------------------------------------------------------------- + copy Bi derivatives into a vector +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::copy_bi2bvec(const typename Kokkos::TeamPolicy::member_type& team) +{ + /* int ncount, j1, j2, j; + + ncount = 0; + + for(j1 = 0; j1 <= twojmax; j1++) { + for(j2 = 0; j2 <= j1; j2++) + for(j = abs(j1 - j2); + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) {*/ + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,idxj_max), + [&] (const int& JJ) { + //for(int JJ = 0; JJ < idxj_max; JJ++) { + const int j1 = idxj[JJ].j1; + const int j2 = idxj[JJ].j2; + const int j = idxj[JJ].j; + bvec(JJ) = barray(j1,j2,j); + //ncount++; + }); +} + +/* ---------------------------------------------------------------------- + calculate derivative of Ui w.r.t. atom j +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_duidrj(const typename Kokkos::TeamPolicy::member_type& team, + double* rij, double wj, double rcut) +{ + double rsq, r, x, y, z, z0, theta0, cs, sn; + double dz0dr; + + x = rij[0]; + y = rij[1]; + z = rij[2]; + rsq = x * x + y * y + z * z; + r = sqrt(rsq); + double rscale0 = rfac0 * MY_PI / (rcut - rmin0); + theta0 = (r - rmin0) * rscale0; + cs = cos(theta0); + sn = sin(theta0); + z0 = r * cs / sn; + dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq; + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &starttime); +#endif + + compute_duarray(team, x, y, z, z0, r, dz0dr, wj, rcut); + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &endtime); + timers[3] += (endtime.tv_sec - starttime.tv_sec + 1.0 * + (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); +#endif + +} + +/* ---------------------------------------------------------------------- + calculate derivative of Bi w.r.t. atom j + variant using indexlist for j1,j2,j + variant using symmetry relation +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_dbidrj(const typename Kokkos::TeamPolicy::member_type& team) +{ + // for j1 = 0,...,twojmax + // for j2 = 0,twojmax + // for j = |j1-j2|,Min(twojmax,j1+j2),2 + // zdb = 0 + // for mb = 0,...,jmid + // for ma = 0,...,j + // zdb += + // Conj(dudr(j,ma,mb))*z(j1,j2,j,ma,mb) + // dbdr(j1,j2,j) += 2*zdb + // zdb = 0 + // for mb1 = 0,...,j1mid + // for ma1 = 0,...,j1 + // zdb += + // Conj(dudr(j1,ma1,mb1))*z(j,j2,j1,ma1,mb1) + // dbdr(j1,j2,j) += 2*zdb*(j+1)/(j1+1) + // zdb = 0 + // for mb2 = 0,...,j2mid + // for ma2 = 0,...,j2 + // zdb += + // Conj(dudr(j2,ma2,mb2))*z(j1,j,j2,ma2,mb2) + // dbdr(j1,j2,j) += 2*zdb*(j+1)/(j2+1) + + double* dudr_r, *dudr_i; + double jjjmambzarray_r; + double jjjmambzarray_i; + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &starttime); +#endif + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,idxj_max), + [&] (const int& JJ) { + //for(int JJ = 0; JJ < idxj_max; JJ++) { + const int j1 = idxj[JJ].j1; + const int j2 = idxj[JJ].j2; + const int j = idxj[JJ].j; + +// dbdr = &dbarray(j1,j2,j,0); +// dbdr[0] = 0.0; +// dbdr[1] = 0.0; +// dbdr[2] = 0.0; + + t_scalar3 dbdr,sumzdu_r; + // Sum terms Conj(dudr(j,ma,mb))*z(j1,j2,j,ma,mb) + + // use zarray j1/j2 symmetry (optional) + + int j_,j1_,j2_; + if (j1 >= j2) { + //jjjzarray_r = &zarray_r(j1,j2,j); + //jjjzarray_i = &zarray_i(j1,j2,j); + j1_ = j1; + j2_ = j2; + j_ = j; + } else { + j1_ = j2; + j2_ = j1; + j_ = j; + //jjjzarray_r = &zarray_r(j2,j1,j); + //jjjzarray_i = &zarray_i(j2,j1,j); + } + + for(int mb = 0; 2*mb < j; mb++) + for(int ma = 0; ma <= j; ma++) { + + dudr_r = &duarray_r(j,mb,ma,0); + dudr_i = &duarray_i(j,mb,ma,0); + jjjmambzarray_r = zarray_r(j1_,j2_,j_,mb,ma); + jjjmambzarray_i = zarray_i(j1_,j2_,j_,mb,ma); + sumzdu_r.x += (dudr_r[0] * jjjmambzarray_r + dudr_i[0] * jjjmambzarray_i); + sumzdu_r.y += (dudr_r[1] * jjjmambzarray_r + dudr_i[1] * jjjmambzarray_i); + sumzdu_r.z += (dudr_r[2] * jjjmambzarray_r + dudr_i[2] * jjjmambzarray_i); + + } //end loop over ma mb + + // For j even, handle middle column + + if (j%2 == 0) { + int mb = j/2; + for(int ma = 0; ma <= mb; ma++) { + dudr_r = &duarray_r(j,mb,ma,0); + dudr_i = &duarray_i(j,mb,ma,0); + const double factor = ma==mb?0.5:1.0; + jjjmambzarray_r = zarray_r(j1_,j2_,j_,mb,ma) * factor; + jjjmambzarray_i = zarray_i(j1_,j2_,j_,mb,ma) * factor; + sumzdu_r.x += (dudr_r[0] * jjjmambzarray_r + dudr_i[0] * jjjmambzarray_i); + sumzdu_r.y += (dudr_r[1] * jjjmambzarray_r + dudr_i[1] * jjjmambzarray_i); + sumzdu_r.z += (dudr_r[2] * jjjmambzarray_r + dudr_i[2] * jjjmambzarray_i); + } + } // end if jeven + + dbdr += 2.0*sumzdu_r; + + // Sum over Conj(dudr(j1,ma1,mb1))*z(j,j2,j1,ma1,mb1) + + double j1fac = (j+1)/(j1+1.0); + + sumzdu_r.x = 0.0; sumzdu_r.y = 0.0; sumzdu_r.z = 0.0; + + // use zarray j1/j2 symmetry (optional) + + if (j >= j2) { + j1_ = j; + j2_ = j2; + j_ = j1; + + //jjjzarray_r = zarray_r(j,j2,j1); + //jjjzarray_i = zarray_i(j,j2,j1); + } else { + j1_ = j2; + j2_ = j; + j_ = j1; + //jjjzarray_r = zarray_r(j2,j,j1); + //jjjzarray_i = zarray_i(j2,j,j1); + } + + for(int mb1 = 0; 2*mb1 < j1; mb1++) + for(int ma1 = 0; ma1 <= j1; ma1++) { + + dudr_r = &duarray_r(j1,mb1,ma1,0); + dudr_i = &duarray_i(j1,mb1,ma1,0); + jjjmambzarray_r = zarray_r(j1_,j2_,j_,mb1,ma1); + jjjmambzarray_i = zarray_i(j1_,j2_,j_,mb1,ma1); + sumzdu_r.x += (dudr_r[0] * jjjmambzarray_r + dudr_i[0] * jjjmambzarray_i); + sumzdu_r.y += (dudr_r[1] * jjjmambzarray_r + dudr_i[1] * jjjmambzarray_i); + sumzdu_r.z += (dudr_r[2] * jjjmambzarray_r + dudr_i[2] * jjjmambzarray_i); + } //end loop over ma1 mb1 + + // For j1 even, handle middle column + + if (j1%2 == 0) { + const int mb1 = j1/2; + for(int ma1 = 0; ma1 <= mb1; ma1++) { + dudr_r = &duarray_r(j1,mb1,ma1,0); + dudr_i = &duarray_i(j1,mb1,ma1,0); + const double factor = ma1==mb1?0.5:1.0; + jjjmambzarray_r = zarray_r(j1_,j2_,j_,mb1,ma1) * factor; + jjjmambzarray_i = zarray_i(j1_,j2_,j_,mb1,ma1) * factor; + sumzdu_r.x += (dudr_r[0] * jjjmambzarray_r + dudr_i[0] * jjjmambzarray_i); + sumzdu_r.y += (dudr_r[1] * jjjmambzarray_r + dudr_i[1] * jjjmambzarray_i); + sumzdu_r.z += (dudr_r[2] * jjjmambzarray_r + dudr_i[2] * jjjmambzarray_i); + } + } // end if j1even + + dbdr += 2.0*sumzdu_r*j1fac; + + // Sum over Conj(dudr(j2,ma2,mb2))*z(j1,j,j2,ma2,mb2) + + double j2fac = (j+1)/(j2+1.0); + + sumzdu_r.x = 0.0; sumzdu_r.y = 0.0; sumzdu_r.z = 0.0; + + // use zarray j1/j2 symmetry (optional) + + if (j1 >= j) { + j1_ = j1; + j2_ = j; + j_ = j2; + //jjjzarray_r = zarray_r(j1,j,j2); + //jjjzarray_i = zarray_i(j1,j,j2); + } else { + j1_ = j; + j2_ = j1; + j_ = j2; + //jjjzarray_r = zarray_r(j,j1,j2); + //jjjzarray_i = zarray_i(j,j1,j2); + } + + for(int mb2 = 0; 2*mb2 < j2; mb2++) + for(int ma2 = 0; ma2 <= j2; ma2++) { + + dudr_r = &duarray_r(j2,mb2,ma2,0); + dudr_i = &duarray_i(j2,mb2,ma2,0); + jjjmambzarray_r = zarray_r(j1_,j2_,j_,mb2,ma2); + jjjmambzarray_i = zarray_i(j1_,j2_,j_,mb2,ma2); + sumzdu_r.x += (dudr_r[0] * jjjmambzarray_r + dudr_i[0] * jjjmambzarray_i); + sumzdu_r.y += (dudr_r[1] * jjjmambzarray_r + dudr_i[1] * jjjmambzarray_i); + sumzdu_r.z += (dudr_r[2] * jjjmambzarray_r + dudr_i[2] * jjjmambzarray_i); + } //end loop over ma2 mb2 + + // For j2 even, handle middle column + + if (j2%2 == 0) { + const int mb2 = j2/2; + for(int ma2 = 0; ma2 <= mb2; ma2++) { + dudr_r = &duarray_r(j2,mb2,ma2,0); + dudr_i = &duarray_i(j2,mb2,ma2,0); + const double factor = ma2==mb2?0.5:1.0; + jjjmambzarray_r = zarray_r(j1_,j2_,j_,mb2,ma2) * factor; + jjjmambzarray_i = zarray_i(j1_,j2_,j_,mb2,ma2) * factor; + sumzdu_r.x += (dudr_r[0] * jjjmambzarray_r + dudr_i[0] * jjjmambzarray_i); + sumzdu_r.y += (dudr_r[1] * jjjmambzarray_r + dudr_i[1] * jjjmambzarray_i); + sumzdu_r.z += (dudr_r[2] * jjjmambzarray_r + dudr_i[2] * jjjmambzarray_i); + } + } // end if j2even + + dbdr += 2.0*sumzdu_r*j2fac; + dbarray(j1,j2,j,0) = dbdr.x; + dbarray(j1,j2,j,1) = dbdr.y; + dbarray(j1,j2,j,2) = dbdr.z; + }); //end loop over j1 j2 j + +#ifdef TIMING_INFO + clock_gettime(CLOCK_REALTIME, &endtime); + timers[4] += (endtime.tv_sec - starttime.tv_sec + 1.0 * + (endtime.tv_nsec - starttime.tv_nsec) / 1000000000); +#endif + +} + +/* ---------------------------------------------------------------------- + copy Bi derivatives into a vector +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::copy_dbi2dbvec(const typename Kokkos::TeamPolicy::member_type& team) +{ + /* int ncount, j1, j2, j; + + ncount = 0; + + for(j1 = 0; j1 <= twojmax; j1++) { + for(j2 = 0; j2 <= j1; j2++) + for(j = abs(j1 - j2); + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) {*/ + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,idxj_max), + [&] (const int& JJ) { + //for(int JJ = 0; JJ < idxj_max; JJ++) { + const int j1 = idxj[JJ].j1; + const int j2 = idxj[JJ].j2; + const int j = idxj[JJ].j; + dbvec(JJ,0) = dbarray(j1,j2,j,0); + dbvec(JJ,1) = dbarray(j1,j2,j,1); + dbvec(JJ,2) = dbarray(j1,j2,j,2); + //ncount++; + }); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::zero_uarraytot(const typename Kokkos::TeamPolicy::member_type& team) +{ + { + double* const ptr = uarraytot_r.data(); + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,uarraytot_r.span()), + [&] (const int& i) { + ptr[i] = 0.0; + }); + } + { + double* const ptr = uarraytot_i.data(); + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,uarraytot_r.span()), + [&] (const int& i) { + ptr[i] = 0.0; + }); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::addself_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, double wself_in) +{ + //for (int j = 0; j <= twojmax; j++) + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,twojmax+1), + [&] (const int& j) { + for (int ma = 0; ma <= j; ma++) { + uarraytot_r(j,ma,ma) = wself_in; + uarraytot_i(j,ma,ma) = 0.0; + } + }); +} + +/* ---------------------------------------------------------------------- + add Wigner U-functions for one neighbor to the total +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::add_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, double r, double wj, double rcut) +{ + const double sfac = compute_sfac(r, rcut) * wj; + +/* + for (int j = 0; j <= twojmax; j++) + for (int ma = 0; ma <= j; ma++) + for (int mb = 0; mb <= j; mb++) { + uarraytot_r_a(j,ma,mb) += + sfac * uarray_r(j,ma,mb); + uarraytot_i_a(j,ma,mb) += + sfac * uarray_i(j,ma,mb); + }*/ + const double* const ptr_r = uarray_r.data(); + const double* const ptr_i = uarray_i.data(); + double* const ptrtot_r = uarraytot_r.data(); + double* const ptrtot_i = uarraytot_i.data(); + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,uarraytot_r.span()), + [&] (const int& i) { + Kokkos::atomic_add(ptrtot_r+i, sfac * ptr_r[i]); + Kokkos::atomic_add(ptrtot_i+i, sfac * ptr_i[i]); + }); +} + +/* ---------------------------------------------------------------------- + compute Wigner U-functions for one neighbor +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_uarray(const typename Kokkos::TeamPolicy::member_type& team, + double x, double y, double z, + double z0, double r) +{ + double r0inv; + double a_r, b_r, a_i, b_i; + double rootpq; + + // compute Cayley-Klein parameters for unit quaternion + + r0inv = 1.0 / sqrt(r * r + z0 * z0); + a_r = r0inv * z0; + a_i = -r0inv * z; + b_r = r0inv * y; + b_i = -r0inv * x; + + // VMK Section 4.8.2 + + uarray_r(0,0,0) = 1.0; + uarray_i(0,0,0) = 0.0; + + for (int j = 1; j <= twojmax; j++) { + + // fill in left side of matrix layer from previous layer + + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+2)/2), + [&] (const int& mb) { + //const int mb = 2*mb_2; + //for (int mb = 0; 2*mb <= j; mb++) { + uarray_r(j,0,mb) = 0.0; + uarray_i(j,0,mb) = 0.0; + + for (int ma = 0; ma < j; ma++) { + rootpq = rootpqarray(j - ma,j - mb); + uarray_r(j,ma,mb) += + rootpq * + (a_r * uarray_r(j - 1,ma,mb) + + a_i * uarray_i(j - 1,ma,mb)); + uarray_i(j,ma,mb) += + rootpq * + (a_r * uarray_i(j - 1,ma,mb) - + a_i * uarray_r(j - 1,ma,mb)); + + rootpq = rootpqarray(ma + 1,j - mb); + uarray_r(j,ma + 1,mb) = + -rootpq * + (b_r * uarray_r(j - 1,ma,mb) + + b_i * uarray_i(j - 1,ma,mb)); + uarray_i(j,ma + 1,mb) = + -rootpq * + (b_r * uarray_i(j - 1,ma,mb) - + b_i * uarray_r(j - 1,ma,mb)); + } + }); + + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j,mb-j] = (-1)^(ma-mb)*Conj([u[ma,mb)) + + //int mbpar = -1; + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+2)/2), + [&] (const int& mb) { +// for (int mb = 0; 2*mb <= j; mb++) { + int mbpar = (mb)%2==0?1:-1; + int mapar = -mbpar; + for (int ma = 0; ma <= j; ma++) { + mapar = -mapar; + if (mapar == 1) { + uarray_r(j,j-ma,j-mb) = uarray_r(j,ma,mb); + uarray_i(j,j-ma,j-mb) = -uarray_i(j,ma,mb); + } else { + uarray_r(j,j-ma,j-mb) = -uarray_r(j,ma,mb); + uarray_i(j,j-ma,j-mb) = uarray_i(j,ma,mb); + } + //OK + //printf("%lf %lf %lf %lf %lf %lf %lf SNAP-COMPARE: UARRAY\n",x,y,z,z0,r,uarray_r(j,ma,mb),uarray_i(j,ma,mb)); + } + }); + } +} + + +/* ---------------------------------------------------------------------- + compute derivatives of Wigner U-functions for one neighbor + see comments in compute_uarray() +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_duarray(const typename Kokkos::TeamPolicy::member_type& team, + double x, double y, double z, + double z0, double r, double dz0dr, + double wj, double rcut) +{ + double r0inv; + double a_r, a_i, b_r, b_i; + double da_r[3], da_i[3], db_r[3], db_i[3]; + double dz0[3], dr0inv[3], dr0invdr; + double rootpq; + + double rinv = 1.0 / r; + double ux = x * rinv; + double uy = y * rinv; + double uz = z * rinv; + + r0inv = 1.0 / sqrt(r * r + z0 * z0); + a_r = z0 * r0inv; + a_i = -z * r0inv; + b_r = y * r0inv; + b_i = -x * r0inv; + + dr0invdr = -pow(r0inv, 3.0) * (r + z0 * dz0dr); + + dr0inv[0] = dr0invdr * ux; + dr0inv[1] = dr0invdr * uy; + dr0inv[2] = dr0invdr * uz; + + dz0[0] = dz0dr * ux; + dz0[1] = dz0dr * uy; + dz0[2] = dz0dr * uz; + + for (int k = 0; k < 3; k++) { + da_r[k] = dz0[k] * r0inv + z0 * dr0inv[k]; + da_i[k] = -z * dr0inv[k]; + } + + da_i[2] += -r0inv; + + for (int k = 0; k < 3; k++) { + db_r[k] = y * dr0inv[k]; + db_i[k] = -x * dr0inv[k]; + } + + db_i[0] += -r0inv; + db_r[1] += r0inv; + + uarray_r(0,0,0) = 1.0; + duarray_r(0,0,0,0) = 0.0; + duarray_r(0,0,0,1) = 0.0; + duarray_r(0,0,0,2) = 0.0; + uarray_i(0,0,0) = 0.0; + duarray_i(0,0,0,0) = 0.0; + duarray_i(0,0,0,1) = 0.0; + duarray_i(0,0,0,2) = 0.0; + + for (int j = 1; j <= twojmax; j++) { + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+2)/2), + [&] (const int& mb) { + + //for (int mb = 0; 2*mb <= j; mb++) { + uarray_r(j,0,mb) = 0.0; + duarray_r(j,mb,0,0) = 0.0; + duarray_r(j,mb,0,1) = 0.0; + duarray_r(j,mb,0,2) = 0.0; + uarray_i(j,0,mb) = 0.0; + duarray_i(j,mb,0,0) = 0.0; + duarray_i(j,mb,0,1) = 0.0; + duarray_i(j,mb,0,2) = 0.0; + + for (int ma = 0; ma < j; ma++) { + rootpq = rootpqarray(j - ma,j - mb); + uarray_r(j,ma,mb) += rootpq * + (a_r * uarray_r(j - 1,ma,mb) + + a_i * uarray_i(j - 1,ma,mb)); + uarray_i(j,ma,mb) += rootpq * + (a_r * uarray_i(j - 1,ma,mb) - + a_i * uarray_r(j - 1,ma,mb)); + + for (int k = 0; k < 3; k++) { + duarray_r(j,mb,ma,k) += + rootpq * (da_r[k] * uarray_r(j - 1,ma,mb) + + da_i[k] * uarray_i(j - 1,ma,mb) + + a_r * duarray_r(j - 1,mb,ma,k) + + a_i * duarray_i(j - 1,mb,ma,k)); + duarray_i(j,mb,ma,k) += + rootpq * (da_r[k] * uarray_i(j - 1,ma,mb) - + da_i[k] * uarray_r(j - 1,ma,mb) + + a_r * duarray_i(j - 1,mb,ma,k) - + a_i * duarray_r(j - 1,mb,ma,k)); + } + + rootpq = rootpqarray(ma + 1,j - mb); + uarray_r(j,ma + 1,mb) = + -rootpq * (b_r * uarray_r(j - 1,ma,mb) + + b_i * uarray_i(j - 1,ma,mb)); + uarray_i(j,ma + 1,mb) = + -rootpq * (b_r * uarray_i(j - 1,ma,mb) - + b_i * uarray_r(j - 1,ma,mb)); + + for (int k = 0; k < 3; k++) { + duarray_r(j,mb,ma + 1,k) = + -rootpq * (db_r[k] * uarray_r(j - 1,ma,mb) + + db_i[k] * uarray_i(j - 1,ma,mb) + + b_r * duarray_r(j - 1,mb,ma,k) + + b_i * duarray_i(j - 1,mb,ma,k)); + duarray_i(j,mb,ma + 1,k) = + -rootpq * (db_r[k] * uarray_i(j - 1,ma,mb) - + db_i[k] * uarray_r(j - 1,ma,mb) + + b_r * duarray_i(j - 1,mb,ma,k) - + b_i * duarray_r(j - 1,mb,ma,k)); + } + } + }); + + //int mbpar = -1; + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+2)/2), + [&] (const int& mb) { +// for (int mb = 0; 2*mb <= j; mb++) { + int mbpar = (mb)%2==0?1:-1; + int mapar = -mbpar; + for (int ma = 0; ma <= j; ma++) { + mapar = -mapar; + if (mapar == 1) { + uarray_r(j,j-ma,j-mb) = uarray_r(j,ma,mb); + uarray_i(j,j-ma,j-mb) = -uarray_i(j,ma,mb); + for (int k = 0; k < 3; k++) { + duarray_r(j,j-mb,j-ma,k) = duarray_r(j,mb,ma,k); + duarray_i(j,j-mb,j-ma,k) = -duarray_i(j,mb,ma,k); + } + } else { + uarray_r(j,j-ma,j-mb) = -uarray_r(j,ma,mb); + uarray_i(j,j-ma,j-mb) = uarray_i(j,ma,mb); + for (int k = 0; k < 3; k++) { + duarray_r(j,j-mb,j-ma,k) = -duarray_r(j,mb,ma,k); + duarray_i(j,j-mb,j-ma,k) = duarray_i(j,mb,ma,k); + } + } + } + }); + } + + double sfac = compute_sfac(r, rcut); + double dsfac = compute_dsfac(r, rcut); + + sfac *= wj; + dsfac *= wj; + + for (int j = 0; j <= twojmax; j++) + for (int mb = 0; mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + duarray_r(j,mb,ma,0) = dsfac * uarray_r(j,ma,mb) * ux + + sfac * duarray_r(j,mb,ma,0); + duarray_i(j,mb,ma,0) = dsfac * uarray_i(j,ma,mb) * ux + + sfac * duarray_i(j,mb,ma,0); + duarray_r(j,mb,ma,1) = dsfac * uarray_r(j,ma,mb) * uy + + sfac * duarray_r(j,mb,ma,1); + duarray_i(j,mb,ma,1) = dsfac * uarray_i(j,ma,mb) * uy + + sfac * duarray_i(j,mb,ma,1); + duarray_r(j,mb,ma,2) = dsfac * uarray_r(j,ma,mb) * uz + + sfac * duarray_r(j,mb,ma,2); + duarray_i(j,mb,ma,2) = dsfac * uarray_i(j,ma,mb) * uz + + sfac * duarray_i(j,mb,ma,2); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::create_team_scratch_arrays(const typename Kokkos::TeamPolicy::member_type& team) +{ + int jdim = twojmax + 1; + uarraytot_r_a = uarraytot_r = t_sna_3d(team.team_scratch(1),jdim,jdim,jdim); + uarraytot_i_a = uarraytot_i = t_sna_3d(team.team_scratch(1),jdim,jdim,jdim); + zarray_r = t_sna_5d(team.team_scratch(1),jdim,jdim,jdim,jdim,jdim); + zarray_i = t_sna_5d(team.team_scratch(1),jdim,jdim,jdim,jdim,jdim); + + rij = t_sna_2d(team.team_scratch(1),nmax,3); + rcutij = t_sna_1d(team.team_scratch(1),nmax); + wj = t_sna_1d(team.team_scratch(1),nmax); + inside = t_sna_1i(team.team_scratch(1),nmax); +} + + +template +inline +T_INT SNAKokkos::size_team_scratch_arrays() { + T_INT size = 0; + int jdim = twojmax + 1; + + size += t_sna_3d::shmem_size(jdim,jdim,jdim); // uarraytot_r_a + size += t_sna_3d::shmem_size(jdim,jdim,jdim); // uarraytot_i_a + size += t_sna_5d::shmem_size(jdim,jdim,jdim,jdim,jdim); // zarray_r + size += t_sna_5d::shmem_size(jdim,jdim,jdim,jdim,jdim); // zarray_i + + size += t_sna_2d::shmem_size(nmax,3); // rij + size += t_sna_1d::shmem_size(nmax); // rcutij + size += t_sna_1d::shmem_size(nmax); // wj + size += t_sna_1i::shmem_size(nmax); // inside + + return size; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::create_thread_scratch_arrays(const typename Kokkos::TeamPolicy::member_type& team) +{ + int jdim = twojmax + 1; + bvec = Kokkos::View(team.thread_scratch(1),ncoeff); + barray = t_sna_3d(team.thread_scratch(1),jdim,jdim,jdim); + + dbvec = Kokkos::View(team.thread_scratch(1),ncoeff); + dbarray = t_sna_4d(team.thread_scratch(1),jdim,jdim,jdim); + + uarray_r = t_sna_3d(team.thread_scratch(1),jdim,jdim,jdim); + uarray_i = t_sna_3d(team.thread_scratch(1),jdim,jdim,jdim); + duarray_r = t_sna_4d(team.thread_scratch(1),jdim,jdim,jdim); + duarray_i = t_sna_4d(team.thread_scratch(1),jdim,jdim,jdim); +} + +template +inline +T_INT SNAKokkos::size_thread_scratch_arrays() { + T_INT size = 0; + int jdim = twojmax + 1; + size += Kokkos::View::shmem_size(ncoeff); // bvec + size += t_sna_3d::shmem_size(jdim,jdim,jdim); // barray + + size += Kokkos::View::shmem_size(ncoeff); // dbvec + size += t_sna_4d::shmem_size(jdim,jdim,jdim); // dbarray + + size += t_sna_3d::shmem_size(jdim,jdim,jdim); // uarray_r + size += t_sna_3d::shmem_size(jdim,jdim,jdim); // uarray_i + size += t_sna_4d::shmem_size(jdim,jdim,jdim); // duarray_r + size += t_sna_4d::shmem_size(jdim,jdim,jdim); // duarray_i + return size; +} + +/* ---------------------------------------------------------------------- + factorial n +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double SNAKokkos::factorial(int n) +{ + double result = 1.0; + for(int i=1; i<=n; i++) + result *= 1.0*i; + return result; +} + +/* ---------------------------------------------------------------------- + the function delta given by VMK Eq. 8.2(1) +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double SNAKokkos::deltacg(int j1, int j2, int j) +{ + double sfaccg = factorial((j1 + j2 + j) / 2 + 1); + return sqrt(factorial((j1 + j2 - j) / 2) * + factorial((j1 - j2 + j) / 2) * + factorial((-j1 + j2 + j) / 2) / sfaccg); +} + +/* ---------------------------------------------------------------------- + assign Clebsch-Gordan coefficients using + the quasi-binomial formula VMK 8.2.1(3) +------------------------------------------------------------------------- */ + +template +inline +void SNAKokkos::init_clebsch_gordan() +{ + double sum,dcg,sfaccg; + int m, aa2, bb2, cc2; + int ifac; + auto h_cgarray = Kokkos::create_mirror_view(cgarray); + + for (int j1 = 0; j1 <= twojmax; j1++) + for (int j2 = 0; j2 <= twojmax; j2++) + for (int j = abs(j1 - j2); j <= MIN(twojmax, j1 + j2); j += 2) + for (int m1 = 0; m1 <= j1; m1 += 1) { + aa2 = 2 * m1 - j1; + + for (int m2 = 0; m2 <= j2; m2 += 1) { + + // -c <= cc <= c + + bb2 = 2 * m2 - j2; + m = (aa2 + bb2 + j) / 2; + + if(m < 0 || m > j) continue; + + sum = 0.0; + + for (int z = MAX(0, MAX(-(j - j2 + aa2) + / 2, -(j - j1 - bb2) / 2)); + z <= MIN((j1 + j2 - j) / 2, + MIN((j1 - aa2) / 2, (j2 + bb2) / 2)); + z++) { + ifac = z % 2 ? -1 : 1; + sum += ifac / + (factorial(z) * + factorial((j1 + j2 - j) / 2 - z) * + factorial((j1 - aa2) / 2 - z) * + factorial((j2 + bb2) / 2 - z) * + factorial((j - j2 + aa2) / 2 + z) * + factorial((j - j1 - bb2) / 2 + z)); + } + + cc2 = 2 * m - j; + dcg = deltacg(j1, j2, j); + sfaccg = sqrt(factorial((j1 + aa2) / 2) * + factorial((j1 - aa2) / 2) * + factorial((j2 + bb2) / 2) * + factorial((j2 - bb2) / 2) * + factorial((j + cc2) / 2) * + factorial((j - cc2) / 2) * + (j + 1)); + + h_cgarray(j1,j2,j,m1,m2) = sum * dcg * sfaccg; + //printf("SNAP-COMPARE: CG: %i %i %i %i %i %e\n",j1,j2,j,m1,m2,cgarray(j1,j2,j,m1,m2)); + } + } + Kokkos::deep_copy(cgarray,h_cgarray); +} + +/* ---------------------------------------------------------------------- + pre-compute table of sqrt[p/m2], p, q = 1,twojmax + the p = 0, q = 0 entries are allocated and skipped for convenience. +------------------------------------------------------------------------- */ + +template +inline +void SNAKokkos::init_rootpqarray() +{ + auto h_rootpqarray = Kokkos::create_mirror_view(rootpqarray); + for (int p = 1; p <= twojmax; p++) + for (int q = 1; q <= twojmax; q++) + h_rootpqarray(p,q) = sqrt(static_cast(p)/q); + Kokkos::deep_copy(rootpqarray,h_rootpqarray); +} + + +/* ---------------------------------------------------------------------- */ +template +inline +int SNAKokkos::compute_ncoeff() +{ + int ncount; + + ncount = 0; + + for (int j1 = 0; j1 <= twojmax; j1++) + if(diagonalstyle == 0) { + for (int j2 = 0; j2 <= j1; j2++) + for (int j = abs(j1 - j2); + j <= MIN(twojmax, j1 + j2); j += 2) + ncount++; + } else if(diagonalstyle == 1) { + int j2 = j1; + + for (int j = abs(j1 - j2); + j <= MIN(twojmax, j1 + j2); j += 2) + ncount++; + } else if(diagonalstyle == 2) { + ncount++; + } else if(diagonalstyle == 3) { + for (int j2 = 0; j2 <= j1; j2++) + for (int j = abs(j1 - j2); + j <= MIN(twojmax, j1 + j2); j += 2) + if (j >= j1) ncount++; + } + + return ncount; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double SNAKokkos::compute_sfac(double r, double rcut) +{ + if (switch_flag == 0) return 1.0; + if (switch_flag == 1) { + if(r <= rmin0) return 1.0; + else if(r > rcut) return 0.0; + else { + double rcutfac = MY_PI / (rcut - rmin0); + return 0.5 * (cos((r - rmin0) * rcutfac) + 1.0); + } + } + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double SNAKokkos::compute_dsfac(double r, double rcut) +{ + if (switch_flag == 0) return 0.0; + if (switch_flag == 1) { + if(r <= rmin0) return 0.0; + else if(r > rcut) return 0.0; + else { + double rcutfac = MY_PI / (rcut - rmin0); + return -0.5 * sin((r - rmin0) * rcutfac) * rcutfac; + } + } + return 0.0; +} + +/* ---------------------------------------------------------------------- + memory usage of arrays +------------------------------------------------------------------------- */ + +template +double SNAKokkos::memory_usage() +{ + int jdim = twojmax + 1; + double bytes; + bytes = jdim * jdim * jdim * jdim * jdim * sizeof(double); + bytes += 2 * jdim * jdim * jdim * sizeof(std::complex); + bytes += 2 * jdim * jdim * jdim * sizeof(double); + bytes += jdim * jdim * jdim * 3 * sizeof(std::complex); + bytes += jdim * jdim * jdim * 3 * sizeof(double); + bytes += ncoeff * sizeof(double); + bytes += jdim * jdim * jdim * jdim * jdim * sizeof(std::complex); + return bytes; +} diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index e4a3f857d3..b2b107284e 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -32,8 +32,9 @@ #include "compute.h" #include "fix.h" #include "timer.h" -#include "memory.h" +#include "memory_kokkos.h" #include "error.h" +#include "kokkos.h" #include @@ -118,7 +119,7 @@ void VerletKokkos::setup(int flag) atomKK->modified(Host,ALL_MASK); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; // compute all forces @@ -221,7 +222,7 @@ void VerletKokkos::setup_minimal(int flag) atomKK->modified(Host,ALL_MASK); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; } @@ -294,6 +295,7 @@ void VerletKokkos::run(int n) int n_pre_exchange = modify->n_pre_exchange; int n_pre_neighbor = modify->n_pre_neighbor; int n_pre_force = modify->n_pre_force; + int n_pre_reverse = modify->n_pre_reverse; int n_post_force = modify->n_post_force; int n_end_of_step = modify->n_end_of_step; @@ -304,9 +306,9 @@ void VerletKokkos::run(int n) f_merge_copy = DAT::t_f_array("VerletKokkos::f_merge_copy",atomKK->k_f.dimension_0()); - static double time = 0.0; atomKK->sync(Device,ALL_MASK); - Kokkos::Impl::Timer ktimer; + //static double time = 0.0; + //Kokkos::Impl::Timer ktimer; timer->init_timeout(); for (int i = 0; i < n; i++) { @@ -320,10 +322,10 @@ void VerletKokkos::run(int n) // initial time integration - ktimer.reset(); + //ktimer.reset(); timer->stamp(); modify->initial_integrate(vflag); - time += ktimer.seconds(); + //time += ktimer.seconds(); if (n_post_integrate) modify->post_integrate(); timer->stamp(Timer::MODIFY); @@ -376,7 +378,7 @@ void VerletKokkos::run(int n) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } @@ -523,11 +525,18 @@ void VerletKokkos::run(int n) atomKK->k_f.modify(); } + if (n_pre_reverse) { + modify->pre_reverse(eflag,vflag); + timer->stamp(Timer::MODIFY); + } // reverse communication of forces - if (force->newton) comm->reverse_comm(); - timer->stamp(Timer::COMM); + if (force->newton) { + Kokkos::fence(); + comm->reverse_comm(); + timer->stamp(Timer::COMM); + } // force modifications, final time integration, diagnostics diff --git a/src/KOKKOS/verlet_kokkos.h b/src/KOKKOS/verlet_kokkos.h index 6455239204..1e36b1cf6e 100644 --- a/src/KOKKOS/verlet_kokkos.h +++ b/src/KOKKOS/verlet_kokkos.h @@ -14,6 +14,8 @@ #ifdef INTEGRATE_CLASS IntegrateStyle(verlet/kk,VerletKokkos) +IntegrateStyle(verlet/kk/device,VerletKokkos) +IntegrateStyle(verlet/kk/host,VerletKokkos) #else @@ -29,7 +31,7 @@ class VerletKokkos : public Verlet { public: VerletKokkos(class LAMMPS *, int, char **); ~VerletKokkos() {} - void setup(int flag=1); + void setup(int); void setup_minimal(int); void run(int); diff --git a/src/KSPACE/ewald.cpp b/src/KSPACE/ewald.cpp index d41443f02a..c7d242031f 100644 --- a/src/KSPACE/ewald.cpp +++ b/src/KSPACE/ewald.cpp @@ -154,6 +154,8 @@ void Ewald::init() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; else g_ewald = sqrt(-log(g_ewald)) / cutoff; @@ -340,6 +342,7 @@ void Ewald::setup() double Ewald::rms(int km, double prd, bigint natoms, double q2) { + if (natoms == 0) natoms = 1; // avoid division by zero double value = 2.0*q2*g_ewald/prd * sqrt(1.0/(MY_PI*km*natoms)) * exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); diff --git a/src/KSPACE/ewald_disp.cpp b/src/KSPACE/ewald_disp.cpp index 85e3da921b..e0424b0d93 100644 --- a/src/KSPACE/ewald_disp.cpp +++ b/src/KSPACE/ewald_disp.cpp @@ -193,6 +193,10 @@ void EwaldDisp::init() if (!gewaldflag) { if (function[0]) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); g_ewald = accuracy*sqrt(natoms*(*cutoff)*shape_det(domain->h)) / (2.0*q2); if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/(*cutoff); else g_ewald = sqrt(-log(g_ewald)) / (*cutoff); @@ -298,6 +302,7 @@ double EwaldDisp::rms(int km, double prd, bigint natoms, double q2, double b2, double M2) { double value = 0.0; + if (natoms == 0) natoms = 1; // avoid division by zero // Coulombic diff --git a/src/KSPACE/pair_buck_long_coul_long.cpp b/src/KSPACE/pair_buck_long_coul_long.cpp index 4cfb9b7267..7df8ebac68 100644 --- a/src/KSPACE/pair_buck_long_coul_long.cpp +++ b/src/KSPACE/pair_buck_long_coul_long.cpp @@ -233,7 +233,8 @@ void PairBuckLongCoulLong::init_style() if (!atom->q_flag && (ewald_order&(1<<1))) error->all(FLERR, - "Invoking coulombic in pair style buck/long/coul/long requires atom attribute q"); + "Invoking coulombic in pair style buck/long/coul/long " + "requires atom attribute q"); // ensure use of KSpace long-range solver, set two g_ewalds @@ -258,51 +259,25 @@ void PairBuckLongCoulLong::init_style() if (force->kspace->neighrequest_flag) { int irequest; + int respa = 0; if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } + irequest = neighbor->request(this,instance_me); - } else irequest = neighbor->request(this,instance_me); + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; } cut_coulsq = cut_coul * cut_coul; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairBuckLongCoulLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ @@ -651,14 +626,14 @@ void PairBuckLongCoulLong::compute_inner() double qri, *cut_bucksqi, *buck1i, *buck2i, *rhoinvi; vector xi, d; - ineighn = (ineigh = listinner->ilist) + listinner->inum; + ineighn = (ineigh = list->ilist_inner) + list->inum_inner; for (; ineighfirstneigh[i])+listinner->numneigh[i]; + jneighn = (jneigh = list->firstneigh_inner[i])+list->numneigh_inner[i]; for (; jneighilist)+listmiddle->inum; + ineighn = (ineigh = list->ilist_middle)+list->inum_middle; for (; ineighfirstneigh[i])+listmiddle->numneigh[i]; + jneighn = (jneigh = list->firstneigh_middle[i])+list->numneigh_middle[i]; for (; jneighilist)+listouter->inum; + ineighn = (ineigh = list->ilist)+list->inum; for (; ineighfirstneigh[i])+listouter->numneigh[i]; + jneighn = (jneigh = list->firstneigh[i])+list->numneigh[i]; for (; jneighnewton_pair; double qqrd2e = force->qqrd2e; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; // loop over neighbors of my atoms @@ -320,10 +320,10 @@ void PairLJCharmmCoulLong::compute_middle() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; // loop over neighbors of my atoms @@ -417,10 +417,10 @@ void PairLJCharmmCoulLong::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; // loop over neighbors of my atoms @@ -687,36 +687,23 @@ void PairLJCharmmCoulLong::init_style() error->all(FLERR, "Pair style lj/charmm/coul/long requires atom attribute q"); - // request regular or rRESPA neighbor lists + // request regular or rRESPA neighbor list int irequest; + int respa = 0; if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } + irequest = neighbor->request(this,instance_me); - } else irequest = neighbor->request(this,instance_me); + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; // require cut_lj_inner < cut_lj @@ -767,19 +754,6 @@ void PairLJCharmmCoulLong::init_style() if (ncoultablebits) init_tables(cut_coul,cut_respa); } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCharmmCoulLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/KSPACE/pair_lj_charmm_coul_long.h b/src/KSPACE/pair_lj_charmm_coul_long.h index 1544f3bc14..95c6d0d1c7 100644 --- a/src/KSPACE/pair_lj_charmm_coul_long.h +++ b/src/KSPACE/pair_lj_charmm_coul_long.h @@ -33,7 +33,6 @@ class PairLJCharmmCoulLong : public Pair { virtual void settings(int, char **); void coeff(int, char **); virtual void init_style(); - void init_list(int, class NeighList *); virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/KSPACE/pair_lj_charmm_coul_msm.cpp b/src/KSPACE/pair_lj_charmm_coul_msm.cpp index 76c9ef0cc7..00617c0bf2 100644 --- a/src/KSPACE/pair_lj_charmm_coul_msm.cpp +++ b/src/KSPACE/pair_lj_charmm_coul_msm.cpp @@ -278,10 +278,10 @@ void PairLJCharmmCoulMSM::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; diff --git a/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp b/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp index 30d8ab64b6..859f421763 100644 --- a/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp +++ b/src/KSPACE/pair_lj_charmmfsw_coul_long.cpp @@ -274,10 +274,10 @@ void PairLJCharmmfswCoulLong::compute_inner() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -359,10 +359,10 @@ void PairLJCharmmfswCoulLong::compute_middle() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -465,10 +465,10 @@ void PairLJCharmmfswCoulLong::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -824,19 +824,6 @@ void PairLJCharmmfswCoulLong::init_style() if (ncoultablebits) init_tables(cut_coul,cut_respa); } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCharmmfswCoulLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/KSPACE/pair_lj_charmmfsw_coul_long.h b/src/KSPACE/pair_lj_charmmfsw_coul_long.h index 650a908e48..135b82ea72 100644 --- a/src/KSPACE/pair_lj_charmmfsw_coul_long.h +++ b/src/KSPACE/pair_lj_charmmfsw_coul_long.h @@ -33,7 +33,6 @@ class PairLJCharmmfswCoulLong : public Pair { virtual void settings(int, char **); void coeff(int, char **); virtual void init_style(); - void init_list(int, class NeighList *); virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/KSPACE/pair_lj_cut_coul_long.cpp b/src/KSPACE/pair_lj_cut_coul_long.cpp index f8be9fdb79..3096df2b01 100644 --- a/src/KSPACE/pair_lj_cut_coul_long.cpp +++ b/src/KSPACE/pair_lj_cut_coul_long.cpp @@ -224,10 +224,10 @@ void PairLJCutCoulLong::compute_inner() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -309,10 +309,10 @@ void PairLJCutCoulLong::compute_middle() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -410,10 +410,10 @@ void PairLJCutCoulLong::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -656,36 +656,23 @@ void PairLJCutCoulLong::init_style() if (!atom->q_flag) error->all(FLERR,"Pair style lj/cut/coul/long requires atom attribute q"); - // request regular or rRESPA neighbor lists + // request regular or rRESPA neighbor list int irequest; + int respa = 0; if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } + irequest = neighbor->request(this,instance_me); - } else irequest = neighbor->request(this,instance_me); + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; cut_coulsq = cut_coul * cut_coul; @@ -707,19 +694,6 @@ void PairLJCutCoulLong::init_style() if (ncoultablebits) init_tables(cut_coul,cut_respa); } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCutCoulLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/KSPACE/pair_lj_cut_coul_long.h b/src/KSPACE/pair_lj_cut_coul_long.h index 886542d075..e6f97c088d 100644 --- a/src/KSPACE/pair_lj_cut_coul_long.h +++ b/src/KSPACE/pair_lj_cut_coul_long.h @@ -33,7 +33,6 @@ class PairLJCutCoulLong : public Pair { virtual void settings(int, char **); void coeff(int, char **); virtual void init_style(); - void init_list(int, class NeighList *); virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/KSPACE/pair_lj_cut_coul_msm.cpp b/src/KSPACE/pair_lj_cut_coul_msm.cpp index e3b3f58fcb..9f901db9fc 100644 --- a/src/KSPACE/pair_lj_cut_coul_msm.cpp +++ b/src/KSPACE/pair_lj_cut_coul_msm.cpp @@ -265,10 +265,10 @@ void PairLJCutCoulMSM::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; diff --git a/src/KSPACE/pair_lj_long_coul_long.cpp b/src/KSPACE/pair_lj_long_coul_long.cpp index 7c6adfcb41..61b69011f1 100644 --- a/src/KSPACE/pair_lj_long_coul_long.cpp +++ b/src/KSPACE/pair_lj_long_coul_long.cpp @@ -253,51 +253,25 @@ void PairLJLongCoulLong::init_style() if (force->kspace->neighrequest_flag) { int irequest; - + int respa = 0; + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; - - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } - - } else irequest = neighbor->request(this,instance_me); + } + + irequest = neighbor->request(this,instance_me); + + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; } cut_coulsq = cut_coul * cut_coul; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJLongCoulLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ @@ -649,13 +623,13 @@ void PairLJLongCoulLong::compute_inner() double qri, *cut_ljsqi, *lj1i, *lj2i; vector xi, d; - ineighn = (ineigh = listinner->ilist)+listinner->inum; + ineighn = (ineigh = list->ilist_inner)+list->inum_inner; for (; ineighfirstneigh[i])+listinner->numneigh[i]; + jneighn = (jneigh = list->firstneigh_inner[i])+list->numneigh_inner[i]; for (; jneighilist)+listmiddle->inum; + ineighn = (ineigh = list->ilist_middle)+list->inum_middle; for (; ineighfirstneigh[i])+listmiddle->numneigh[i]; + jneighn = (jneigh = list->firstneigh_middle[i])+list->numneigh_middle[i]; for (; jneighilist)+listouter->inum; + ineighn = (ineigh = list->ilist)+list->inum; for (; ineighfirstneigh[i])+listouter->numneigh[i]; + jneighn = (jneigh = list->firstneigh[i])+list->numneigh[i]; for (; jneighinum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; // loop over neighbors of my atoms @@ -769,10 +769,10 @@ void PairLJLongTIP4PLong::compute_middle() int ni; double *lj1i, *lj2i; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; // loop over neighbors of my atoms @@ -1049,10 +1049,10 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) double cut_in_off_sq = cut_in_off*cut_in_off; double cut_in_on_sq = cut_in_on*cut_in_on; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; // loop over neighbors of my atoms diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 6add8b58b7..53ab2e5a9d 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1004,6 +1004,8 @@ void PPPM::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for uncharged system"); g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; else g_ewald = sqrt(-log(g_ewald)) / cutoff; @@ -1268,6 +1270,7 @@ double PPPM::compute_qopt() double PPPM::estimate_ik_error(double h, double prd, bigint natoms) { double sum = 0.0; + if (natoms == 0) return 0.0; for (int m = 0; m < order; m++) sum += acons[order][m] * pow(h*g_ewald,2.0*m); double value = q2 * pow(h*g_ewald,(double)order) * @@ -1345,6 +1348,7 @@ double PPPM::final_accuracy() double yprd = domain->yprd; double zprd = domain->zprd; bigint natoms = atom->natoms; + if (natoms == 0) natoms = 1; // avoid division by zero double df_kspace = compute_df_kspace(); double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd); diff --git a/src/LATTE/Install.sh b/src/LATTE/Install.sh new file mode 100644 index 0000000000..d034774e7a --- /dev/null +++ b/src/LATTE/Install.sh @@ -0,0 +1,67 @@ +# Install/unInstall package files in LAMMPS +# mode = 0/1/2 for uninstall/install/update + +mode=$1 + +# enforce using portable C locale +LC_ALL=C +export LC_ALL + +# arg1 = file, arg2 = file it depends on + +action () { + if (test $mode = 0) then + rm -f ../$1 + elif (! cmp -s $1 ../$1) then + if (test -z "$2" || test -e ../$2) then + cp $1 .. + if (test $mode = 2) then + echo " updating src/$1" + fi + fi + elif (test -n "$2") then + if (test ! -e ../$2) then + rm -f ../$1 + fi + fi +} + +# all package files with no dependencies + +for file in *.cpp *.h; do + action $file +done + +# edit 2 Makefile.package files to include/exclude package info + +if (test $1 = 1) then + + if (test -e ../Makefile.package) then + sed -i -e 's/[^ \t]*latte[^ \t]* //' ../Makefile.package + sed -i -e 's|^PKG_INC =[ \t]*|&-I../../lib/latte/includelink |' ../Makefile.package + sed -i -e 's|^PKG_PATH =[ \t]*|&-L../../lib/latte/liblink |' ../Makefile.package + #sed -i -e 's|^PKG_LIB =[ \t]*|&-llatte |' ../Makefile.package + sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(latte_SYSINC) |' ../Makefile.package + sed -i -e 's|^PKG_SYSLIB =[ \t]*|&$(latte_SYSLIB) |' ../Makefile.package + sed -i -e 's|^PKG_SYSPATH =[ \t]*|&$(latte_SYSPATH) |' ../Makefile.package + fi + + if (test -e ../Makefile.package.settings) then + sed -i -e '/^include.*latte.*$/d' ../Makefile.package.settings + # multiline form needed for BSD sed on Macs + sed -i -e '4 i \ +include ..\/..\/lib\/latte\/Makefile.lammps +' ../Makefile.package.settings + fi + +elif (test $1 = 0) then + + if (test -e ../Makefile.package) then + sed -i -e 's/[^ \t]*latte[^ \t]* //' ../Makefile.package + fi + + if (test -e ../Makefile.package.settings) then + sed -i -e '/^include.*latte.*$/d' ../Makefile.package.settings + fi + +fi diff --git a/src/LATTE/README b/src/LATTE/README new file mode 100644 index 0000000000..d7379f2461 --- /dev/null +++ b/src/LATTE/README @@ -0,0 +1,23 @@ +This package provides a fix latte command which is a wrapper on the +LATTE DFTB code, so that molecular dynamics can be run with LAMMPS +using density-functional tight-binding quantum forces calculated by +LATTE. More information on LATTE can be found at this web site: +https://github.com/lanl/LATTE. Its authors are Marc Cawkwell and +Anders Niklasson and Christian Negre from Los Alamos National +Laboratory (LANL). A brief technical description of LATTE is given +on the fix_latte doc page. + +Using this package requires the LATTE code to first be downloaded and +built as a library on your system. This can be done in lib/latte or +elsewhere on your system. Details of the download and build process +for LATTE are given in the lib/latte/README file and it can also be +done via the make lib-latte command from the LAMMPS src directory. + +Once you have successfully built LAMMPS with this package and the +LATTE library you can test it using an input file from the examples +latte dir, e.g. + +lmp_serial -in lammps/examples/latte/in.latte.water + +This pair style was written in collaboration with the LATTE +developers. diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp new file mode 100644 index 0000000000..4594f26f8f --- /dev/null +++ b/src/LATTE/fix_latte.cpp @@ -0,0 +1,352 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Christian Negre (LANL) +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_latte.h" +#include "atom.h" +#include "comm.h" +#include "update.h" +#include "neighbor.h" +#include "domain.h" +#include "force.h" +#include "neigh_request.h" +#include "neigh_list.h" +#include "modify.h" +#include "compute.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +extern "C" { + void latte(int *, int *, double *, int *, int *, + double *, double *, double *, double *, + double *, double *, double *, int*, + double *, double *, double *, double *, bool *); + int latte_abiversion(); +} + +#define INVOKED_PERATOM 8 + +/* ---------------------------------------------------------------------- */ + +FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Must use units metal with fix latte command"); + + if (comm->nprocs != 1) + error->all(FLERR,"Fix latte currently runs only in serial"); + + if (20180207 != latte_abiversion()) + error->all(FLERR,"LAMMPS is linked against incompatible LATTE library"); + + if (narg != 4) error->all(FLERR,"Illegal fix latte command"); + + scalar_flag = 1; + global_freq = 1; + extscalar = 1; + virial_flag = 1; + thermo_virial = 1; + + // store ID of compute pe/atom used to generate Coulomb potential for LATTE + // NULL means LATTE will compute Coulombic potential + + coulomb = 0; + id_pe = NULL; + + if (strcmp(arg[3],"NULL") != 0) { + coulomb = 1; + error->all(FLERR,"Fix latte does not yet support a LAMMPS calculation " + "of a Coulomb potential"); + + int n = strlen(arg[3]) + 1; + id_pe = new char[n]; + strcpy(id_pe,arg[3]); + + int ipe = modify->find_compute(id_pe); + if (ipe < 0) error->all(FLERR,"Could not find fix latte compute ID"); + if (modify->compute[ipe]->peatomflag == 0) + error->all(FLERR,"Fix latte compute ID does not compute pe/atom"); + } + + // initializations + + nmax = 0; + qpotential = NULL; + flatte = NULL; + + latte_energy = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +FixLatte::~FixLatte() +{ + delete [] id_pe; + memory->destroy(qpotential); + memory->destroy(flatte); +} + +/* ---------------------------------------------------------------------- */ + +int FixLatte::setmask() +{ + int mask = 0; + //mask |= INITIAL_INTEGRATE; + //mask |= FINAL_INTEGRATE; + mask |= PRE_REVERSE; + mask |= POST_FORCE; + mask |= MIN_POST_FORCE; + mask |= THERMO_ENERGY; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::init() +{ + // error checks + + if (domain->dimension == 2) + error->all(FLERR,"Fix latte requires 3d problem"); + + if (coulomb) { + if (atom->q_flag == 0 || force->pair == NULL || force->kspace == NULL) + error->all(FLERR,"Fix latte cannot compute Coulomb potential"); + + int ipe = modify->find_compute(id_pe); + if (ipe < 0) error->all(FLERR,"Could not find fix latte compute ID"); + c_pe = modify->compute[ipe]; + } + + // must be fully periodic or fully non-periodic + + if (domain->nonperiodic == 0) pbcflag = 1; + else if (!domain->xperiodic && !domain->yperiodic && !domain->zperiodic) + pbcflag = 0; + else error->all(FLERR,"Fix latte requires 3d simulation"); + + // create qpotential & flatte if needed + // for now, assume nlocal will never change + + if (coulomb && qpotential == NULL) { + memory->create(qpotential,atom->nlocal,"latte:qpotential"); + memory->create(flatte,atom->nlocal,3,"latte:flatte"); + } + + /* + // warn if any integrate fix comes after this one + // is it actually necessary for q(n) update to come after x,v update ?? + + int after = 0; + int flag = 0; + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(id,modify->fix[i]->id) == 0) after = 1; + else if ((modify->fmask[i] & INITIAL_INTEGRATE) && after) flag = 1; + } + if (flag && comm->me == 0) + error->warning(FLERR,"Fix latte should come after all other " + "integration fixes"); + */ + + /* + // need a full neighbor list + // could we use a half list? + // perpetual list, built whenever re-neighboring occurs + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + */ +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::init_list(int id, NeighList *ptr) +{ + // list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::setup(int vflag) +{ + post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::min_setup(int vflag) +{ + post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::setup_pre_reverse(int eflag, int vflag) +{ + pre_reverse(eflag,vflag); +} + +/* ---------------------------------------------------------------------- + integrate electronic degrees of freedom +------------------------------------------------------------------------- */ + +void FixLatte::initial_integrate(int vflag) {} + +/* ---------------------------------------------------------------------- + store eflag, so can use it in post_force to tally per-atom energies +------------------------------------------------------------------------- */ + +void FixLatte::pre_reverse(int eflag, int vflag) +{ + eflag_caller = eflag; +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::post_force(int vflag) +{ + int eflag = eflag_caller; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = eflag_global = vflag_global = eflag_atom = vflag_atom = 0; + + // compute Coulombic potential = pe[i]/q[i] + // invoke compute pe/atom + // wrap with clear/add and trigger pe/atom calculation every step + + if (coulomb) { + modify->clearstep_compute(); + + if (!(c_pe->invoked_flag & INVOKED_PERATOM)) { + c_pe->compute_peratom(); + c_pe->invoked_flag |= INVOKED_PERATOM; + } + + modify->addstep_compute(update->ntimestep+1); + + double *pe = c_pe->vector_atom; + double *q = atom->q; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) + if (q[i]) qpotential[i] = pe[i]/q[i]; + else qpotential[i] = 0.0; + } + + // hardwire these unsupported flags for now + + int coulombflag = 0; + // pe_peratom = 0; + // virial_global = 1; // set via vflag_global at some point + // virial_peratom = 0; + neighflag = 0; + + // set flags used by LATTE + // NOTE: LATTE does not compute per-atom energies or virials + + int flags[6]; + + flags[0] = pbcflag; // 1 for fully periodic, 0 for fully non-periodic + flags[1] = coulombflag; // 1 for LAMMPS computes Coulombics, 0 for LATTE + flags[2] = eflag_atom; // 1 to return per-atom energies, 0 for no + flags[3] = vflag_global && thermo_virial; // 1 to return global/per-atom + flags[4] = vflag_atom && thermo_virial; // virial, 0 for no + flags[5] = neighflag; // 1 to pass neighbor list to LATTE, 0 for no + + // setup LATTE arguments + + int natoms = atom->nlocal; + double *coords = &atom->x[0][0]; + int *type = atom->type; + int ntypes = atom->ntypes; + double *mass = &atom->mass[1]; + double *boxlo = domain->boxlo; + double *boxhi = domain->boxhi; + double *forces; + bool latteerror = 0; + if (coulomb) forces = &flatte[0][0]; + else forces = &atom->f[0][0]; + int maxiter = -1; + + latte(flags,&natoms,coords,type,&ntypes,mass,boxlo,boxhi,&domain->xy, + &domain->xz,&domain->yz,forces,&maxiter,&latte_energy, + &atom->v[0][0],&update->dt,virial,&latteerror); + + if (latteerror) error->all(FLERR,"Internal LATTE problem"); + + // sum LATTE forces to LAMMPS forces + // e.g. LAMMPS may compute Coulombics at some point + + if (coulomb) { + double **f = atom->f; + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + f[i][0] += flatte[i][0]; + f[i][1] += flatte[i][1]; + f[i][2] += flatte[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::min_post_force(int vflag) +{ + post_force(vflag); +} + +/* ---------------------------------------------------------------------- + integrate electronic degrees of freedom +------------------------------------------------------------------------- */ + +void FixLatte::final_integrate() {} + +/* ---------------------------------------------------------------------- */ + +void FixLatte::reset_dt() +{ + //dtv = update->dt; + //dtf = 0.5 * update->dt * force->ftm2v; +} + +/* ---------------------------------------------------------------------- + DFTB energy from LATTE +------------------------------------------------------------------------- */ + +double FixLatte::compute_scalar() +{ + return latte_energy; +} + +/* ---------------------------------------------------------------------- + memory usage of local arrays +------------------------------------------------------------------------- */ + +double FixLatte::memory_usage() +{ + double bytes = 0.0; + if (coulomb) bytes += nmax * sizeof(double); + if (coulomb) bytes += nmax*3 * sizeof(double); + return bytes; +} diff --git a/src/LATTE/fix_latte.h b/src/LATTE/fix_latte.h new file mode 100644 index 0000000000..86a58fdf3f --- /dev/null +++ b/src/LATTE/fix_latte.h @@ -0,0 +1,73 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(latte,FixLatte) + +#else + +#ifndef LMP_FIX_LATTE_H +#define LMP_FIX_LATTE_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixLatte : public Fix { + public: + FixLatte(class LAMMPS *, int, char **); + virtual ~FixLatte(); + int setmask(); + void init(); + void init_list(int, class NeighList *); + void setup(int); + void min_setup(int); + void setup_pre_reverse(int, int); + void initial_integrate(int); + void pre_reverse(int, int); + void post_force(int); + void min_post_force(int); + void final_integrate(); + void reset_dt(); + double compute_scalar(); + double memory_usage(); + + protected: + char *id_pe; + int coulomb,pbcflag,pe_peratom,virial_global,virial_peratom,neighflag; + int eflag_caller; + + int nmax; + double *qpotential; + double **flatte; + double latte_energy; + + class NeighList *list; + class Compute *c_pe; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +*/ diff --git a/src/MAKE/MACHINES/Makefile.cori2 b/src/MAKE/MACHINES/Makefile.cori2 index a367d54080..45e1ab1f8a 100755 --- a/src/MAKE/MACHINES/Makefile.cori2 +++ b/src/MAKE/MACHINES/Makefile.cori2 @@ -15,13 +15,14 @@ SHELL = /bin/sh CC = CC OPTFLAGS = -xMIC-AVX512 -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -qno-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) -DLMP_INTEL_NO_TBB +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG -DLMP_INTEL_NO_TBB \ + $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M LINK = CC -LINKFLAGS = -g -qopenmp $(OPTFLAGS) +LINKFLAGS = -qopenmp $(OPTFLAGS) LIB = SIZE = size diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpich b/src/MAKE/MACHINES/Makefile.icex similarity index 83% rename from src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpich rename to src/MAKE/MACHINES/Makefile.icex index be0c2d1913..ceeec48870 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpich +++ b/src/MAKE/MACHINES/Makefile.icex @@ -1,4 +1,4 @@ -# kokkos_cuda = KOKKOS/CUDA package, MPICH with nvcc compiler, Kepler GPU +# mpi = MPI with its default compiler SHELL = /bin/sh @@ -6,23 +6,19 @@ SHELL = /bin/sh # compiler/linker settings # specify flags and libraries needed for your compiler -KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) -export MPICH_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper CC = mpicxx -CCFLAGS = -g -O3 -SHFLAGS = -fPIC +CCFLAGS = -g -O3 -Wall -Wextra -frounding-math -fsignaling-nans -march=native +SHFLAGS = -shared -MD -mcmodel=medium -fpic -fPIC DEPFLAGS = -M LINK = mpicxx -LINKFLAGS = -g -O3 +LINKFLAGS = -g -O LIB = SIZE = size ARCHIVE = ar ARFLAGS = -rc SHLIBFLAGS = -shared -KOKKOS_DEVICES = Cuda, OpenMP -KOKKOS_ARCH = Kepler35 # --------------------------------------------------------------------- # LAMMPS-specific settings, all OPTIONAL @@ -33,6 +29,8 @@ KOKKOS_ARCH = Kepler35 # see possible settings in Section 2.2 (step 4) of manual LMP_INC = -DLAMMPS_GZIP +#LMP_INC += -DLAMMPS_JPEG +LMP_INC += -DLAMMPS_MEMALIGN=64 # MPI library # see discussion in Section 2.2 (step 5) of manual @@ -48,7 +46,7 @@ MPI_PATH = MPI_LIB = # FFT library -# see discussion in Section 2.2 (step 6) of manaul +# see discussion in Section 2.2 (step 6) of manual # can be left blank to use provided KISS FFT library # INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings # PATH = path for FFT library @@ -104,13 +102,7 @@ shlib: $(OBJ) $(EXTRA_LINK_DEPENDS) # Compilation rules -%.o:%.cpp $(EXTRA_CPP_DEPENDS) - $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< - -%.d:%.cpp $(EXTRA_CPP_DEPENDS) - $(CC) $(CCFLAGS) $(EXTRA_INC) $(DEPFLAGS) $< > $@ - -%.o:%.cu $(EXTRA_CPP_DEPENDS) +%.o:%.cpp $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< # Individual dependencies diff --git a/src/MAKE/MACHINES/Makefile.white b/src/MAKE/MACHINES/Makefile.white index 53de76e736..42daf850f3 100644 --- a/src/MAKE/MACHINES/Makefile.white +++ b/src/MAKE/MACHINES/Makefile.white @@ -7,7 +7,7 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) -export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper +export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper CC = mpicxx CCFLAGS = -g -O3 SHFLAGS = -fPIC @@ -21,8 +21,8 @@ SIZE = size ARCHIVE = ar ARFLAGS = -rc SHLIBFLAGS = -shared -KOKKOS_DEVICES = Cuda, OpenMP -KOKKOS_ARCH = Kepler35 +KOKKOS_DEVICES = Cuda +KOKKOS_ARCH = Pascal60,Power8 # --------------------------------------------------------------------- # LAMMPS-specific settings, all OPTIONAL diff --git a/src/MAKE/OPTIONS/Makefile.intel_coprocessor b/src/MAKE/OPTIONS/Makefile.intel_coprocessor index 82ad2d30f0..75e4d89170 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_coprocessor +++ b/src/MAKE/OPTIONS/Makefile.intel_coprocessor @@ -9,8 +9,8 @@ SHELL = /bin/sh CC = mpiicpc MIC_OPT = -qoffload-option,mic,compiler,"-fp-model fast=2 -mGLOB_default_function_attrs=\"gather_scatter_loop_unroll=4\"" CCFLAGS = -g -O3 -qopenmp -DLMP_INTEL_OFFLOAD -DLAMMPS_MEMALIGN=64 \ - -xHost -fno-alias -ansi-alias -restrict \ - -qoverride-limits $(MIC_OPT) + -xHost -fno-alias -ansi-alias -restrict -DLMP_INTEL_USELRT \ + -qoverride-limits $(MIC_OPT) -DLMP_USE_MKL_RNG SHFLAGS = -fPIC DEPFLAGS = -M diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu b/src/MAKE/OPTIONS/Makefile.intel_cpu old mode 100755 new mode 100644 index b7db064574..efd8ac288d --- a/src/MAKE/OPTIONS/Makefile.intel_cpu +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu @@ -7,15 +7,16 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler CC = mpiicpc -OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ + -qopt-zmm-usage=high +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M LINK = mpiicpc -LINKFLAGS = -g -qopenmp $(OPTFLAGS) -LIB = -ltbbmalloc -ltbbmalloc_proxy +LINKFLAGS = -qopenmp $(OPTFLAGS) +LIB = -ltbbmalloc SIZE = size ARCHIVE = ar diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi index ac8279949a..9d425bf22a 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi @@ -7,14 +7,15 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler CC = mpiicpc -OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -CCFLAGS = -qopenmp -DLAMMPS_MEMALIGN=64 -qno-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ + -qopt-zmm-usage=high +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M LINK = mpiicpc -LINKFLAGS = -g -qopenmp $(OPTFLAGS) +LINKFLAGS = -qopenmp $(OPTFLAGS) LIB = -ltbbmalloc SIZE = size diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich index 389a578f72..102e66f8bb 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich @@ -7,15 +7,16 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler CC = mpicxx -cxx=icc -OPTFLAGS = -xAVX -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ + -qopt-zmm-usage=high +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M LINK = mpicxx -cxx=icc -LINKFLAGS = -g -qopenmp $(OPTFLAGS) -LIB = +LINKFLAGS = -qopenmp $(OPTFLAGS) +LIB = -ltbbmalloc SIZE = size ARCHIVE = ar diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi index b65905440d..a0dea06aac 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi @@ -8,15 +8,16 @@ SHELL = /bin/sh export OMPI_CXX = icc CC = mpicxx -OPTFLAGS = -xAVX -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \ + -qopt-zmm-usage=high +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M LINK = mpicxx -LINKFLAGS = -g -qopenmp $(OPTFLAGS) -LIB = -ltbbmalloc -ltbbmalloc_proxy +LINKFLAGS = -qopenmp $(OPTFLAGS) +LIB = -ltbbmalloc SIZE = size ARCHIVE = ar diff --git a/src/MAKE/OPTIONS/Makefile.intel_knl_coprocessor b/src/MAKE/OPTIONS/Makefile.intel_knl_coprocessor deleted file mode 100644 index db5de83a06..0000000000 --- a/src/MAKE/OPTIONS/Makefile.intel_knl_coprocessor +++ /dev/null @@ -1,123 +0,0 @@ -# intel_phi = USER-INTEL with Phi x200 (KNL) offload support,Intel MPI,MKL FFT - -SHELL = /bin/sh - -# --------------------------------------------------------------------- -# compiler/linker settings -# specify flags and libraries needed for your compiler - -CC = mpiicpc -MIC_OPT = -qoffload-arch=mic-avx512 -fp-model fast=2 -CCFLAGS = -O3 -qopenmp -DLMP_INTEL_OFFLOAD -DLAMMPS_MEMALIGN=64 \ - -xHost -fno-alias -ansi-alias -restrict \ - -qoverride-limits $(MIC_OPT) -SHFLAGS = -fPIC -DEPFLAGS = -M - -LINK = mpiicpc -LINKFLAGS = -g -O3 -xHost -qopenmp -qoffload $(MIC_OPT) -LIB = -ltbbmalloc -SIZE = size - -ARCHIVE = ar -ARFLAGS = -rc -SHLIBFLAGS = -shared - -# --------------------------------------------------------------------- -# LAMMPS-specific settings, all OPTIONAL -# specify settings for LAMMPS features you will use -# if you change any -D setting, do full re-compile after "make clean" - -# LAMMPS ifdef settings -# see possible settings in Section 2.2 (step 4) of manual - -LMP_INC = -DLAMMPS_GZIP -DLAMMPS_JPEG - -# MPI library -# see discussion in Section 2.2 (step 5) of manual -# MPI wrapper compiler/linker can provide this info -# can point to dummy MPI library in src/STUBS as in Makefile.serial -# use -D MPICH and OMPI settings in INC to avoid C++ lib conflicts -# INC = path for mpi.h, MPI compiler settings -# PATH = path for MPI library -# LIB = name of MPI library - -MPI_INC = -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1 -MPI_PATH = -MPI_LIB = - -# FFT library -# see discussion in Section 2.2 (step 6) of manaul -# can be left blank to use provided KISS FFT library -# INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings -# PATH = path for FFT library -# LIB = name of FFT library - -FFT_INC = -DFFT_MKL -DFFT_SINGLE -FFT_PATH = -FFT_LIB = -L$(MKLROOT)/lib/intel64/ -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core - -# JPEG and/or PNG library -# see discussion in Section 2.2 (step 7) of manual -# only needed if -DLAMMPS_JPEG or -DLAMMPS_PNG listed with LMP_INC -# INC = path(s) for jpeglib.h and/or png.h -# PATH = path(s) for JPEG library and/or PNG library -# LIB = name(s) of JPEG library and/or PNG library - -JPG_INC = -JPG_PATH = -JPG_LIB = -ljpeg - -# --------------------------------------------------------------------- -# build rules and dependencies -# do not edit this section - -include Makefile.package.settings -include Makefile.package - -EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) -EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) -EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) -EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) -EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) - -# Path to src files - -vpath %.cpp .. -vpath %.h .. - -# Link target - -$(EXE): $(OBJ) $(EXTRA_LINK_DEPENDS) - $(LINK) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(EXTRA_LIB) $(LIB) -o $(EXE) - $(SIZE) $(EXE) - -# Library targets - -lib: $(OBJ) $(EXTRA_LINK_DEPENDS) - $(ARCHIVE) $(ARFLAGS) $(EXE) $(OBJ) - -shlib: $(OBJ) $(EXTRA_LINK_DEPENDS) - $(CC) $(CCFLAGS) $(SHFLAGS) $(SHLIBFLAGS) $(EXTRA_PATH) -o $(EXE) \ - $(OBJ) $(EXTRA_LIB) $(LIB) - -# Compilation rules - -%.o:%.cpp $(EXTRA_CPP_DEPENDS) - $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< - -%.d:%.cpp $(EXTRA_CPP_DEPENDS) - $(CC) $(CCFLAGS) $(EXTRA_INC) $(DEPFLAGS) $< > $@ - -%.o:%.cu $(EXTRA_CPP_DEPENDS) - $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< - -# Individual dependencies - -depend : fastdep.exe $(SRC) - @./fastdep.exe $(EXTRA_INC) -- $^ > .depend || exit 1 - -fastdep.exe: ../DEPEND/fastdep.c - cc -O -o $@ $< - -sinclude .depend diff --git a/src/MAKE/OPTIONS/Makefile.knl b/src/MAKE/OPTIONS/Makefile.knl index 881c51f0e4..8e266a4fce 100644 --- a/src/MAKE/OPTIONS/Makefile.knl +++ b/src/MAKE/OPTIONS/Makefile.knl @@ -8,13 +8,13 @@ SHELL = /bin/sh CC = mpiicpc OPTFLAGS = -xMIC-AVX512 -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -CCFLAGS = -qopenmp -DLAMMPS_MEMALIGN=64 -qno-offload \ - -fno-alias -ansi-alias -restrict $(OPTFLAGS) +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M LINK = mpiicpc -LINKFLAGS = -g -qopenmp $(OPTFLAGS) +LINKFLAGS = -qopenmp $(OPTFLAGS) LIB = -ltbbmalloc SIZE = size diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_openmpi b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi similarity index 93% rename from src/MAKE/OPTIONS/Makefile.kokkos_cuda_openmpi rename to src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi index da7046b0b6..54122c1b19 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_openmpi +++ b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi @@ -1,4 +1,4 @@ -# kokkos_cuda = KOKKOS/CUDA package, OpenMPI with nvcc compiler, Kepler GPU +# kokkos_cuda_mpi = KOKKOS/CUDA package, MPICH or OpenMPI with nvcc compiler, Kepler GPU SHELL = /bin/sh @@ -7,7 +7,8 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) -export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper +export MPICH_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper +export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper CC = mpicxx CCFLAGS = -g -O3 SHFLAGS = -fPIC @@ -21,7 +22,7 @@ SIZE = size ARCHIVE = ar ARFLAGS = -rc SHLIBFLAGS = -shared -KOKKOS_DEVICES = Cuda, OpenMP +KOKKOS_DEVICES = Cuda KOKKOS_ARCH = Kepler35 # --------------------------------------------------------------------- diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index b363ad1472..5a56b0cd59 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -52,6 +52,7 @@ using namespace MathSpecial; PairAIREBO::PairAIREBO(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; ghostneigh = 1; ljflag = torflag = 1; diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp index 219acc50af..a934d5a1e8 100644 --- a/src/MANYBODY/pair_bop.cpp +++ b/src/MANYBODY/pair_bop.cpp @@ -61,6 +61,7 @@ using namespace LAMMPS_NS; PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; ghostneigh = 1; diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index fde0342dcc..414f2adb74 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -44,8 +44,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairLCBOP::PairLCBOP(LAMMPS *lmp) : Pair(lmp) { +PairLCBOP::PairLCBOP(LAMMPS *lmp) : Pair(lmp) +{ single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; ghostneigh = 1; diff --git a/src/MANYBODY/pair_nb3b_harmonic.cpp b/src/MANYBODY/pair_nb3b_harmonic.cpp index 231119fe24..d1d5880839 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.cpp +++ b/src/MANYBODY/pair_nb3b_harmonic.cpp @@ -44,6 +44,7 @@ using namespace LAMMPS_NS; PairNb3bHarmonic::PairNb3bHarmonic(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; diff --git a/src/MANYBODY/pair_polymorphic.cpp b/src/MANYBODY/pair_polymorphic.cpp index 2429dd0638..02075ed5b4 100644 --- a/src/MANYBODY/pair_polymorphic.cpp +++ b/src/MANYBODY/pair_polymorphic.cpp @@ -43,6 +43,7 @@ using namespace MathConst; PairPolymorphic::PairPolymorphic(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; nelements = 0; diff --git a/src/MANYBODY/pair_polymorphic.h b/src/MANYBODY/pair_polymorphic.h index 9917bcd96d..18eab46365 100644 --- a/src/MANYBODY/pair_polymorphic.h +++ b/src/MANYBODY/pair_polymorphic.h @@ -21,6 +21,7 @@ PairStyle(polymorphic,PairPolymorphic) #define LMP_PAIR_POLYMORPHIC_H #include "pair.h" +#include namespace LAMMPS_NS { diff --git a/src/MANYBODY/pair_tersoff.cpp b/src/MANYBODY/pair_tersoff.cpp index 062eed3f99..9f976281c8 100644 --- a/src/MANYBODY/pair_tersoff.cpp +++ b/src/MANYBODY/pair_tersoff.cpp @@ -507,14 +507,20 @@ void PairTersoff::read_file(char *file) params[nparams].powermint = int(params[nparams].powerm); - if (params[nparams].c < 0.0 || params[nparams].d < 0.0 || - params[nparams].powern < 0.0 || params[nparams].beta < 0.0 || - params[nparams].lam2 < 0.0 || params[nparams].bigb < 0.0 || - params[nparams].bigr < 0.0 ||params[nparams].bigd < 0.0 || + if (params[nparams].c < 0.0 || + params[nparams].d < 0.0 || + params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 || + params[nparams].bigd < 0.0 || params[nparams].bigd > params[nparams].bigr || - params[nparams].lam1 < 0.0 || params[nparams].biga < 0.0 || + params[nparams].lam1 < 0.0 || + params[nparams].biga < 0.0 || params[nparams].powerm - params[nparams].powermint != 0.0 || - (params[nparams].powermint != 3 && params[nparams].powermint != 1) || + (params[nparams].powermint != 3 && + params[nparams].powermint != 1) || params[nparams].gamma < 0.0) error->all(FLERR,"Illegal Tersoff parameter"); diff --git a/src/MANYBODY/pair_tersoff_mod.cpp b/src/MANYBODY/pair_tersoff_mod.cpp index e554a58fc2..e810130dba 100644 --- a/src/MANYBODY/pair_tersoff_mod.cpp +++ b/src/MANYBODY/pair_tersoff_mod.cpp @@ -162,19 +162,23 @@ void PairTersoffMOD::read_file(char *file) params[nparams].c4 = atof(words[18]); params[nparams].c5 = atof(words[19]); - // currently only allow m exponent of 1 + // currently only allow m exponent of 1 or 3 params[nparams].powermint = int(params[nparams].powerm); - if ( - params[nparams].lam3 < 0.0 || params[nparams].powern < 0.0 || - params[nparams].beta < 0.0 || params[nparams].lam2 < 0.0 || - params[nparams].bigb < 0.0 || params[nparams].bigr < 0.0 || - params[nparams].bigd < 0.0 || - params[nparams].bigd > params[nparams].bigr || - params[nparams].lam3 < 0.0 || params[nparams].biga < 0.0 || - params[nparams].powerm - params[nparams].powermint != 0.0 || - (params[nparams].powermint != 3 && params[nparams].powermint != 1)) + if (params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 || + params[nparams].bigd < 0.0 || + params[nparams].bigd > params[nparams].bigr || + params[nparams].lam1 < 0.0 || + params[nparams].biga < 0.0 || + params[nparams].powerm - params[nparams].powermint != 0.0 || + (params[nparams].powermint != 3 && + params[nparams].powermint != 1) + ) error->all(FLERR,"Illegal Tersoff parameter"); nparams++; diff --git a/src/MANYBODY/pair_tersoff_mod.h b/src/MANYBODY/pair_tersoff_mod.h index 8bc7ed37a8..fea3919be3 100644 --- a/src/MANYBODY/pair_tersoff_mod.h +++ b/src/MANYBODY/pair_tersoff_mod.h @@ -21,6 +21,7 @@ PairStyle(tersoff/mod,PairTersoffMOD) #define LMP_PAIR_TERSOFF_MOD_H #include "pair_tersoff.h" +#include namespace LAMMPS_NS { diff --git a/src/MANYBODY/pair_tersoff_mod_c.cpp b/src/MANYBODY/pair_tersoff_mod_c.cpp index 712e0482a8..0edf2ddef9 100644 --- a/src/MANYBODY/pair_tersoff_mod_c.cpp +++ b/src/MANYBODY/pair_tersoff_mod_c.cpp @@ -158,19 +158,24 @@ void PairTersoffMODC::read_file(char *file) params[nparams].c5 = atof(words[19]); params[nparams].c0 = atof(words[20]); - // currently only allow m exponent of 1 + // currently only allow m exponent of 1 or 3 params[nparams].powermint = int(params[nparams].powerm); if ( - params[nparams].lam3 < 0.0 || params[nparams].powern < 0.0 || - params[nparams].beta < 0.0 || params[nparams].lam2 < 0.0 || - params[nparams].bigb < 0.0 || params[nparams].bigr < 0.0 || - params[nparams].bigd < 0.0 || - params[nparams].bigd > params[nparams].bigr || - params[nparams].lam3 < 0.0 || params[nparams].biga < 0.0 || - params[nparams].powerm - params[nparams].powermint != 0.0 || - (params[nparams].powermint != 3 && params[nparams].powermint != 1)) + params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 || + params[nparams].bigd < 0.0 || + params[nparams].bigd > params[nparams].bigr || + params[nparams].lam1 < 0.0 || + params[nparams].biga < 0.0 || + params[nparams].powerm - params[nparams].powermint != 0.0 || + (params[nparams].powermint != 3 && + params[nparams].powermint != 1) + ) error->all(FLERR,"Illegal Tersoff parameter"); nparams++; diff --git a/src/MANYBODY/pair_tersoff_zbl.cpp b/src/MANYBODY/pair_tersoff_zbl.cpp index b900283ca3..15163c2bf9 100644 --- a/src/MANYBODY/pair_tersoff_zbl.cpp +++ b/src/MANYBODY/pair_tersoff_zbl.cpp @@ -184,19 +184,25 @@ void PairTersoffZBL::read_file(char *file) params[nparams].powermint = int(params[nparams].powerm); - if ( - params[nparams].lam3 < 0.0 || params[nparams].c < 0.0 || - params[nparams].d < 0.0 || params[nparams].powern < 0.0 || - params[nparams].beta < 0.0 || params[nparams].lam2 < 0.0 || - params[nparams].bigb < 0.0 || params[nparams].bigr < 0.0 || + if (params[nparams].c < 0.0 || + params[nparams].d < 0.0 || + params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 || params[nparams].bigd < 0.0 || params[nparams].bigd > params[nparams].bigr || - params[nparams].lam3 < 0.0 || params[nparams].biga < 0.0 || + params[nparams].lam1 < 0.0 || + params[nparams].biga < 0.0 || params[nparams].powerm - params[nparams].powermint != 0.0 || - (params[nparams].powermint != 3 && params[nparams].powermint != 1) || + (params[nparams].powermint != 3 && + params[nparams].powermint != 1) || params[nparams].gamma < 0.0 || - params[nparams].Z_i < 1.0 || params[nparams].Z_j < 1.0 || - params[nparams].ZBLcut < 0.0 || params[nparams].ZBLexpscale < 0.0) + params[nparams].Z_i < 1.0 || + params[nparams].Z_j < 1.0 || + params[nparams].ZBLcut < 0.0 || + params[nparams].ZBLexpscale < 0.0) error->all(FLERR,"Illegal Tersoff parameter"); nparams++; diff --git a/src/MC/fix_atom_swap.cpp b/src/MC/fix_atom_swap.cpp index 80bebefec0..6500707bf3 100644 --- a/src/MC/fix_atom_swap.cpp +++ b/src/MC/fix_atom_swap.cpp @@ -316,7 +316,7 @@ void FixAtomSwap::pre_exchange() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); energy_stored = energy_full(); @@ -366,7 +366,7 @@ int FixAtomSwap::attempt_semi_grand() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } @@ -408,7 +408,7 @@ int FixAtomSwap::attempt_semi_grand() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } @@ -447,7 +447,7 @@ int FixAtomSwap::attempt_swap() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } @@ -489,7 +489,7 @@ int FixAtomSwap::attempt_swap() comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); } else { comm->forward_comm_fix(this); } diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 48ba8ed5cf..61629aa30d 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -64,15 +64,17 @@ using namespace MathConst; #define MAXENERGYTEST 1.0e50 -enum{ATOM,MOLECULE}; +enum{EXCHATOM,EXCHMOL}; // exchmode +enum{MOVEATOM,MOVEMOL}; // movemode /* ---------------------------------------------------------------------- */ FixGCMC::FixGCMC(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), idregion(NULL), full_flag(0), ngroups(0), groupstrings(NULL), ngrouptypes(0), grouptypestrings(NULL), - grouptypebits(NULL), grouptypes(NULL), local_gas_list(NULL), atom_coord(NULL), random_equal(NULL), random_unequal(NULL), - coords(NULL), imageflags(NULL), fixrigid(NULL), fixshake(NULL), idrigid(NULL), idshake(NULL) + grouptypebits(NULL), grouptypes(NULL), local_gas_list(NULL), molcoords(NULL), molq(NULL), molimage(NULL), + random_equal(NULL), random_unequal(NULL), + fixrigid(NULL), fixshake(NULL), idrigid(NULL), idshake(NULL) { if (narg < 11) error->all(FLERR,"Illegal fix gcmc command"); @@ -161,9 +163,9 @@ FixGCMC::FixGCMC(LAMMPS *lmp, int narg, char **arg) : static_cast (attempts); } - // error check and further setup for mode = MOLECULE + // error check and further setup for exchmode = EXCHMOL - if (mode == MOLECULE) { + if (exchmode == EXCHMOL) { if (onemols[imol]->xflag == 0) error->all(FLERR,"Fix gcmc molecule must have coordinates"); if (onemols[imol]->typeflag == 0) @@ -182,9 +184,9 @@ FixGCMC::FixGCMC(LAMMPS *lmp, int narg, char **arg) : if (charge_flag && atom->q == NULL) error->all(FLERR,"Fix gcmc atom has charge, but atom style does not"); - if (rigidflag && mode == ATOM) + if (rigidflag && exchmode == EXCHATOM) error->all(FLERR,"Cannot use fix gcmc rigid and not molecule"); - if (shakeflag && mode == ATOM) + if (shakeflag && exchmode == EXCHATOM) error->all(FLERR,"Cannot use fix gcmc shake and not molecule"); if (rigidflag && shakeflag) error->all(FLERR,"Cannot use fix gcmc rigid and shake"); @@ -193,13 +195,13 @@ FixGCMC::FixGCMC(LAMMPS *lmp, int narg, char **arg) : if (shakeflag && (nmcmoves > 0)) error->all(FLERR,"Cannot use fix gcmc shake with MC moves"); - // setup of coords and imageflags array - - if (mode == ATOM) natoms_per_molecule = 1; + // setup of array of coordinates for molecule insertion + // also used by rotation moves for any molecule + + if (exchmode == EXCHATOM) natoms_per_molecule = 1; else natoms_per_molecule = onemols[imol]->natoms; - memory->create(coords,natoms_per_molecule,3,"gcmc:coords"); - memory->create(imageflags,natoms_per_molecule,"gcmc:imageflags"); - memory->create(atom_coord,natoms_per_molecule,3,"gcmc:atom_coord"); + nmaxmolatoms = natoms_per_molecule; + grow_molecule_arrays(nmaxmolatoms); // compute the number of MC cycles that occur nevery timesteps @@ -235,7 +237,12 @@ void FixGCMC::options(int narg, char **arg) // defaults - mode = ATOM; + exchmode = EXCHATOM; + movemode = MOVEATOM; + patomtrans = 0.0; + pmoltrans = 0.0; + pmolrotate = 0.0; + pmctot = 0.0; max_rotation_angle = 10*MY_PI/180; regionflag = 0; iregion = -1; @@ -277,10 +284,21 @@ void FixGCMC::options(int narg, char **arg) if (atom->molecules[imol]->nset > 1 && comm->me == 0) error->warning(FLERR,"Molecule template for " "fix gcmc has multiple molecules"); - mode = MOLECULE; + exchmode = EXCHMOL; onemols = atom->molecules; nmol = onemols[imol]->nset; iarg += 2; + } else if (strcmp(arg[iarg],"mcmoves") == 0) { + if (iarg+4 > narg) error->all(FLERR,"Illegal fix gcmc command"); + patomtrans = force->numeric(FLERR,arg[iarg+1]); + pmoltrans = force->numeric(FLERR,arg[iarg+2]); + pmolrotate = force->numeric(FLERR,arg[iarg+3]); + if (patomtrans < 0 || pmoltrans < 0 || pmolrotate < 0) + error->all(FLERR,"Illegal fix gcmc command"); + pmctot = patomtrans + pmoltrans + pmolrotate; + if (pmctot <= 0) + error->all(FLERR,"Illegal fix gcmc command"); + iarg += 4; } else if (strcmp(arg[iarg],"region") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command"); iregion = domain->find_region(arg[iarg+1]); @@ -387,9 +405,7 @@ FixGCMC::~FixGCMC() delete random_unequal; memory->destroy(local_gas_list); - memory->destroy(atom_coord); - memory->destroy(coords); - memory->destroy(imageflags); + memory->destroy(molcoords); delete [] idrigid; delete [] idshake; @@ -430,6 +446,30 @@ void FixGCMC::init() triclinic = domain->triclinic; + // set probabilities for MC moves + + if (pmctot == 0.0) + if (exchmode == EXCHATOM) { + movemode = MOVEATOM; + patomtrans = 1.0; + pmoltrans = 0.0; + pmolrotate = 0.0; + } else { + movemode = MOVEMOL; + patomtrans = 0.0; + pmoltrans = 0.5; + pmolrotate = 0.5; + } + else { + if (pmoltrans == 0.0 && pmolrotate == 0.0) + movemode = MOVEATOM; + else + movemode = MOVEMOL; + patomtrans /= pmctot; + pmoltrans /= pmctot; + pmolrotate /= pmctot; + } + // decide whether to switch to the full_energy option if (!full_flag) { @@ -454,14 +494,14 @@ void FixGCMC::init() int *type = atom->type; - if (mode == ATOM) { + if (exchmode == EXCHATOM) { if (ngcmc_type <= 0 || ngcmc_type > atom->ntypes) error->all(FLERR,"Invalid atom type in fix gcmc command"); } - // if mode == ATOM, warn if any deletable atom has a mol ID + // if atoms are exchanged, warn if any deletable atom has a mol ID - if ((mode == ATOM) && atom->molecule_flag) { + if ((exchmode == EXCHATOM) && atom->molecule_flag) { tagint *molecule = atom->molecule; int flag = 0; for (int i = 0; i < atom->nlocal; i++) @@ -474,9 +514,9 @@ void FixGCMC::init() "Fix gcmc cannot exchange individual atoms belonging to a molecule"); } - // if mode == MOLECULE, check for unset mol IDs + // if molecules are exchanged or moved, check for unset mol IDs - if (mode == MOLECULE) { + if (exchmode == EXCHMOL || movemode == MOVEMOL) { tagint *molecule = atom->molecule; int *mask = atom->mask; int flag = 0; @@ -490,11 +530,11 @@ void FixGCMC::init() "All mol IDs should be set for fix gcmc group atoms"); } - if (((mode == MOLECULE) && (atom->molecule_flag == 0)) || - ((mode == MOLECULE) && (!atom->tag_enable || !atom->map_style))) - error->all(FLERR, - "Fix gcmc molecule command requires that " - "atoms have molecule attributes"); + if (exchmode == EXCHMOL || movemode == MOVEMOL) + if (atom->molecule_flag == 0 || !atom->tag_enable || !atom->map_style) + error->all(FLERR, + "Fix gcmc molecule command requires that " + "atoms have molecule attributes"); // if rigidflag defined, check for rigid/small fix // its molecule template must be same as this one @@ -566,7 +606,7 @@ void FixGCMC::init() // create a new group for temporary use with selected molecules - if (mode == MOLECULE) { + if (exchmode == EXCHMOL || movemode == MOVEMOL) { char **group_arg = new char*[3]; // create unique group name for atoms to be rotated int len = strlen(id) + 30; @@ -586,10 +626,10 @@ void FixGCMC::init() delete [] group_arg; } - // get all of the needed molecule data if mode == MOLECULE, - // otherwise just get the gas mass + // get all of the needed molecule data if exchanging + // or moving molecules, otherwise just get the gas mass - if (mode == MOLECULE) { + if (exchmode == EXCHMOL || movemode == MOVEMOL) { onemols[imol]->compute_mass(); onemols[imol]->compute_com(); @@ -644,6 +684,12 @@ void FixGCMC::init() imagezero = ((imageint) IMGMAX << IMG2BITS) | ((imageint) IMGMAX << IMGBITS) | IMGMAX; + // warning if group id is "all" + + if (groupbit & 1) + error->warning(FLERR, "Fix gcmc is being applied " + "to the default group all"); + // construct group bitmask for all new atoms // aggregated over all group keywords @@ -668,6 +714,12 @@ void FixGCMC::init() } } + // Current implementation is broken using + // full_flag on molecules on more than one processor. + // Print error if this is the current mode + if (full_flag && (exchmode == EXCHMOL || movemode == MOVEMOL) && comm->nprocs > 1) + error->all(FLERR,"fix gcmc does currently not support full_energy option with molecules on more than 1 MPI process."); + } /* ---------------------------------------------------------------------- @@ -713,27 +765,21 @@ void FixGCMC::pre_exchange() error->warning(FLERR,"Energy of old configuration in " "fix gcmc is > MAXENERGYTEST."); - if (mode == MOLECULE) { - for (int i = 0; i < ncycles; i++) { - int random_int_fraction = - static_cast(random_equal->uniform()*ncycles) + 1; - if (random_int_fraction <= nmcmoves) { - if (random_equal->uniform() < 0.5) attempt_molecule_translation_full(); - else attempt_molecule_rotation_full(); - } else { - if (random_equal->uniform() < 0.5) attempt_molecule_deletion_full(); - else attempt_molecule_insertion_full(); - } - } - } else { - for (int i = 0; i < ncycles; i++) { - int random_int_fraction = - static_cast(random_equal->uniform()*ncycles) + 1; - if (random_int_fraction <= nmcmoves) { - attempt_atomic_translation_full(); - } else { - if (random_equal->uniform() < 0.5) attempt_atomic_deletion_full(); + for (int i = 0; i < ncycles; i++) { + int ixm = static_cast(random_equal->uniform()*ncycles) + 1; + if (ixm <= nmcmoves) { + double xmcmove = random_equal->uniform(); + if (xmcmove < patomtrans) attempt_atomic_translation_full(); + else if (xmcmove < patomtrans+pmoltrans) attempt_molecule_translation_full(); + else attempt_molecule_rotation_full(); + } else { + double xgcmc = random_equal->uniform(); + if (exchmode == EXCHATOM) { + if (xgcmc < 0.5) attempt_atomic_deletion_full(); else attempt_atomic_insertion_full(); + } else { + if (xgcmc < 0.5) attempt_molecule_deletion_full(); + else attempt_molecule_insertion_full(); } } } @@ -746,27 +792,21 @@ void FixGCMC::pre_exchange() } else { - if (mode == MOLECULE) { - for (int i = 0; i < ncycles; i++) { - int random_int_fraction = - static_cast(random_equal->uniform()*ncycles) + 1; - if (random_int_fraction <= nmcmoves) { - if (random_equal->uniform() < 0.5) attempt_molecule_translation(); - else attempt_molecule_rotation(); - } else { - if (random_equal->uniform() < 0.5) attempt_molecule_deletion(); - else attempt_molecule_insertion(); - } - } - } else { - for (int i = 0; i < ncycles; i++) { - int random_int_fraction = - static_cast(random_equal->uniform()*ncycles) + 1; - if (random_int_fraction <= nmcmoves) { - attempt_atomic_translation(); - } else { - if (random_equal->uniform() < 0.5) attempt_atomic_deletion(); + for (int i = 0; i < ncycles; i++) { + int ixm = static_cast(random_equal->uniform()*ncycles) + 1; + if (ixm <= nmcmoves) { + double xmcmove = random_equal->uniform(); + if (xmcmove < patomtrans) attempt_atomic_translation(); + else if (xmcmove < patomtrans+pmoltrans) attempt_molecule_translation(); + else attempt_molecule_rotation(); + } else { + double xgcmc = random_equal->uniform(); + if (exchmode == EXCHATOM) { + if (xgcmc < 0.5) attempt_atomic_deletion(); else attempt_atomic_insertion(); + } else { + if (xgcmc < 0.5) attempt_molecule_deletion(); + else attempt_molecule_insertion(); } } } @@ -1116,14 +1156,19 @@ void FixGCMC::attempt_molecule_rotation() "fix gcmc is > MAXENERGYTEST."); int *mask = atom->mask; + int nmolcoords = 0; for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == rotation_molecule) { mask[i] |= molecule_group_bit; + nmolcoords++; } else { mask[i] &= molecule_group_inversebit; } } + if (nmolcoords > nmaxmolatoms) + grow_molecule_arrays(nmolcoords); + double com[3]; com[0] = com[1] = com[2] = 0.0; group->xcm(molecule_group,gas_mass,com); @@ -1156,13 +1201,13 @@ void FixGCMC::attempt_molecule_rotation() xtmp[0] -= com[0]; xtmp[1] -= com[1]; xtmp[2] -= com[2]; - MathExtra::matvec(rotmat,xtmp,atom_coord[n]); - atom_coord[n][0] += com[0]; - atom_coord[n][1] += com[1]; - atom_coord[n][2] += com[2]; - xtmp[0] = atom_coord[n][0]; - xtmp[1] = atom_coord[n][1]; - xtmp[2] = atom_coord[n][2]; + MathExtra::matvec(rotmat,xtmp,molcoords[n]); + molcoords[n][0] += com[0]; + molcoords[n][1] += com[1]; + molcoords[n][2] += com[2]; + xtmp[0] = molcoords[n][0]; + xtmp[1] = molcoords[n][1]; + xtmp[2] = molcoords[n][2]; domain->remap(xtmp); if (!domain->inside(xtmp)) error->one(FLERR,"Fix gcmc put atom outside box"); @@ -1181,9 +1226,9 @@ void FixGCMC::attempt_molecule_rotation() for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { image[i] = imagezero; - x[i][0] = atom_coord[n][0]; - x[i][1] = atom_coord[n][1]; - x[i][2] = atom_coord[n][2]; + x[i][0] = molcoords[n][0]; + x[i][1] = molcoords[n][1]; + x[i][2] = molcoords[n][2]; domain->remap(x[i],image[i]); n++; } @@ -1303,18 +1348,18 @@ void FixGCMC::attempt_molecule_insertion() bool procflag[natoms_per_molecule]; for (int i = 0; i < natoms_per_molecule; i++) { - MathExtra::matvec(rotmat,onemols[imol]->x[i],atom_coord[i]); - atom_coord[i][0] += com_coord[0]; - atom_coord[i][1] += com_coord[1]; - atom_coord[i][2] += com_coord[2]; + MathExtra::matvec(rotmat,onemols[imol]->x[i],molcoords[i]); + molcoords[i][0] += com_coord[0]; + molcoords[i][1] += com_coord[1]; + molcoords[i][2] += com_coord[2]; // use temporary variable for remapped position - // so unmapped position is preserved in atom_coord + // so unmapped position is preserved in molcoords double xtmp[3]; - xtmp[0] = atom_coord[i][0]; - xtmp[1] = atom_coord[i][1]; - xtmp[2] = atom_coord[i][2]; + xtmp[0] = molcoords[i][0]; + xtmp[1] = molcoords[i][1]; + xtmp[2] = molcoords[i][2]; domain->remap(xtmp); if (!domain->inside(xtmp)) error->one(FLERR,"Fix gcmc put atom outside box"); @@ -1372,7 +1417,7 @@ void FixGCMC::attempt_molecule_insertion() for (int i = 0; i < natoms_per_molecule; i++) { if (procflag[i]) { - atom->avec->create_atom(onemols[imol]->type[i],atom_coord[i]); + atom->avec->create_atom(onemols[imol]->type[i],molcoords[i]); int m = atom->nlocal - 1; // add to groups @@ -1772,14 +1817,19 @@ void FixGCMC::attempt_molecule_rotation_full() double energy_before = energy_stored; int *mask = atom->mask; + int nmolcoords = 0; for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == rotation_molecule) { mask[i] |= molecule_group_bit; + nmolcoords++; } else { mask[i] &= molecule_group_inversebit; } } + if (nmolcoords > nmaxmolatoms) + grow_molecule_arrays(nmolcoords); + double com[3]; com[0] = com[1] = com[2] = 0.0; group->xcm(molecule_group,gas_mass,com); @@ -1803,14 +1853,14 @@ void FixGCMC::attempt_molecule_rotation_full() double **x = atom->x; imageint *image = atom->image; - imageint image_orig[natoms_per_molecule]; + int n = 0; for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { - atom_coord[n][0] = x[i][0]; - atom_coord[n][1] = x[i][1]; - atom_coord[n][2] = x[i][2]; - image_orig[n] = image[i]; + molcoords[n][0] = x[i][0]; + molcoords[n][1] = x[i][1]; + molcoords[n][2] = x[i][2]; + molimage[n] = image[i]; double xtmp[3]; domain->unmap(x[i],image[i],xtmp); xtmp[0] -= com[0]; @@ -1840,10 +1890,10 @@ void FixGCMC::attempt_molecule_rotation_full() int n = 0; for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { - x[i][0] = atom_coord[n][0]; - x[i][1] = atom_coord[n][1]; - x[i][2] = atom_coord[n][2]; - image[i] = image_orig[n]; + x[i][0] = molcoords[n][0]; + x[i][1] = molcoords[n][1]; + x[i][2] = molcoords[n][2]; + image[i] = molimage[n]; n++; } } @@ -1865,8 +1915,17 @@ void FixGCMC::attempt_molecule_deletion_full() double energy_before = energy_stored; + // check nmolq, grow arrays if necessary + + int nmolq = 0; + for (int i = 0; i < atom->nlocal; i++) + if (atom->molecule[i] == deletion_molecule) + if (atom->q_flag) nmolq++; + + if (nmolq > nmaxmolatoms) + grow_molecule_arrays(nmolq); + int m = 0; - double q_tmp[natoms_per_molecule]; int tmpmask[atom->nlocal]; for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == deletion_molecule) { @@ -1874,7 +1933,7 @@ void FixGCMC::attempt_molecule_deletion_full() atom->mask[i] = exclusion_group_bit; toggle_intramolecular(i); if (atom->q_flag) { - q_tmp[m] = atom->q[i]; + molq[m] = atom->q[i]; m++; atom->q[i] = 0.0; } @@ -1907,7 +1966,7 @@ void FixGCMC::attempt_molecule_deletion_full() atom->mask[i] = tmpmask[i]; toggle_intramolecular(i); if (atom->q_flag) { - atom->q[i] = q_tmp[m]; + atom->q[i] = molq[m]; m++; } } @@ -2140,7 +2199,7 @@ double FixGCMC::energy(int i, int itype, tagint imolecule, double *coord) for (int j = 0; j < nall; j++) { if (i == j) continue; - if (mode == MOLECULE) + if (exchmode == EXCHMOL || movemode == MOVEMOL) if (imolecule == molecule[j]) continue; delx = coord[0] - x[j][0]; @@ -2197,7 +2256,7 @@ double FixGCMC::energy_full() comm->borders(); if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (modify->n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); int eflag = 1; int vflag = 0; @@ -2212,9 +2271,10 @@ double FixGCMC::energy_full() tagint *molecule = atom->molecule; int nall = atom->nlocal + atom->nghost; for (int i = 0; i < atom->nlocal; i++) { - if (mode == MOLECULE) imolecule = molecule[i]; + if (exchmode == EXCHMOL || movemode == MOVEMOL) + imolecule = molecule[i]; for (int j = i+1; j < nall; j++) { - if (mode == MOLECULE) + if (exchmode == EXCHMOL || movemode == MOVEMOL) if (imolecule == molecule[j]) continue; delx = x[i][0] - x[j][0]; @@ -2352,7 +2412,7 @@ void FixGCMC::update_gas_atoms_list() if (regionflag) { - if (mode == MOLECULE) { + if (exchmode == EXCHMOL || movemode == MOVEMOL) { tagint maxmol = 0; for (int i = 0; i < nlocal; i++) maxmol = MAX(maxmol,molecule[i]); @@ -2479,3 +2539,10 @@ void FixGCMC::restart(char *buf) next_reneighbor = static_cast (list[n++]); } + +void FixGCMC::grow_molecule_arrays(int nmolatoms) { + nmaxmolatoms = nmolatoms; + molcoords = memory->grow(molcoords,nmaxmolatoms,3,"gcmc:molcoords"); + molq = memory->grow(molq,nmaxmolatoms,"gcmc:molq"); + molimage = memory->grow(molimage,nmaxmolatoms,"gcmc:molimage"); +} diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h index 3656a1df58..77dda17fda 100644 --- a/src/MC/fix_gcmc.h +++ b/src/MC/fix_gcmc.h @@ -57,17 +57,20 @@ class FixGCMC : public Fix { double memory_usage(); void write_restart(FILE *); void restart(char *); - + void grow_molecule_arrays(int); + private: int molecule_group,molecule_group_bit; int molecule_group_inversebit; int exclusion_group,exclusion_group_bit; int ngcmc_type,nevery,seed; int ncycles,nexchanges,nmcmoves; + double patomtrans, pmoltrans, pmolrotate, pmctot; int ngas; // # of gas atoms on all procs int ngas_local; // # of gas atoms on this proc int ngas_before; // # of gas atoms on procs < this proc - int mode; // ATOM or MOLECULE + int exchmode; // exchange ATOM or MOLECULE + int movemode; // move ATOM or MOLECULE int regionflag; // 0 = anywhere in box, 1 = specific region int iregion; // gcmc region char *idregion; // gcmc region id @@ -75,7 +78,8 @@ class FixGCMC : public Fix { bool charge_flag; // true if user specified atomic charge bool full_flag; // true if doing full system energy calculations - int natoms_per_molecule; // number of atoms in each gas molecule + int natoms_per_molecule; // number of atoms in each inserted molecule + int nmaxmolatoms; // number of atoms allocated for molecule arrays int groupbitall; // group bitmask for inserted atoms int ngroups; // number of group-ids for inserted atoms @@ -110,7 +114,9 @@ class FixGCMC : public Fix { double *sublo,*subhi; int *local_gas_list; double **cutsq; - double **atom_coord; + double **molcoords; + double *molq; + imageint *molimage; imageint imagezero; double overlap_cutoffsq; // square distance cutoff for overlap int overlap_flag; @@ -126,8 +132,6 @@ class FixGCMC : public Fix { class Molecule **onemols; int imol,nmol; - double **coords; - imageint *imageflags; class Fix *fixrigid, *fixshake; int rigidflag, shakeflag; char *idrigid, *idshake; @@ -223,6 +227,12 @@ W: Energy of old configuration in fix gcmc is > MAXENERGYTEST. This probably means that a pair of atoms are closer than the overlap cutoff distance for keyword overlap_cutoff. +W: Fix gcmc is being applied to the default group all + +This is allowed, but it will result in Monte Carlo moves +being performed on all the atoms in the system, which is +often not what is intended. + E: Invalid atom type in fix gcmc command The atom type specified in the gcmc command does not exist. diff --git a/src/MEAM/pair_meam.cpp b/src/MEAM/pair_meam.cpp index ede89a83c2..fa47944cd5 100644 --- a/src/MEAM/pair_meam.cpp +++ b/src/MEAM/pair_meam.cpp @@ -47,6 +47,10 @@ static const char *keywords[] = { PairMEAM::PairMEAM(LAMMPS *lmp) : Pair(lmp) { + if (comm->me == 0) + error->warning(FLERR,"The pair_style meam command is unsupported. " + "Please use pair_style meam/c instead"); + single_enable = 0; restartinfo = 0; one_coeff = 1; diff --git a/src/MISC/dump_xtc.h b/src/MISC/dump_xtc.h index 9be66ca21d..3fcc89f4ba 100644 --- a/src/MISC/dump_xtc.h +++ b/src/MISC/dump_xtc.h @@ -21,13 +21,7 @@ DumpStyle(xtc,DumpXTC) #define LMP_DUMP_XTC_H #include "dump.h" - -#ifdef LAMMPS_XDR #include "xdr_compat.h" -#else -#include "rpc/rpc.h" -#include "rpc/xdr.h" -#endif namespace LAMMPS_NS { diff --git a/src/MISC/fix_efield.cpp b/src/MISC/fix_efield.cpp index 8a6b7937b5..c0384adc41 100644 --- a/src/MISC/fix_efield.cpp +++ b/src/MISC/fix_efield.cpp @@ -55,6 +55,7 @@ FixEfield::FixEfield(LAMMPS *lmp, int narg, char **arg) : extscalar = 1; respa_level_support = 1; ilevel_respa = 0; + virial_flag = 1; qe2f = force->qe2f; xstr = ystr = zstr = NULL; @@ -257,6 +258,11 @@ void FixEfield::post_force(int vflag) imageint *image = atom->image; int nlocal = atom->nlocal; + // energy and virial setup + + if (vflag) v_setup(vflag); + else evflag = 0; + // reallocate efield array if necessary if (varflag == ATOM && atom->nmax > maxatom) { @@ -281,6 +287,7 @@ void FixEfield::post_force(int vflag) double **x = atom->x; double fx,fy,fz; + double v[6]; // constant efield @@ -306,6 +313,15 @@ void FixEfield::post_force(int vflag) fsum[1] += fx; fsum[2] += fy; fsum[3] += fz; + if (evflag) { + v[0] = fx*unwrap[0]; + v[1] = fy*unwrap[1]; + v[2] = fz*unwrap[2]; + v[3] = fx*unwrap[1]; + v[4] = fx*unwrap[2]; + v[5] = fy*unwrap[2]; + v_tally(i, v); + } } } diff --git a/src/MISC/xdr_compat.cpp b/src/MISC/xdr_compat.cpp index 12bc777b90..9483070fee 100644 --- a/src/MISC/xdr_compat.cpp +++ b/src/MISC/xdr_compat.cpp @@ -1,5 +1,3 @@ -#ifdef LAMMPS_XDR - #include #include #include @@ -714,9 +712,3 @@ xdrstdio_putuint32 (XDR *xdrs, xdr_uint32_t *ip) } #endif -#else -/* satisfy compilers that do not like to compile empty files. */ -static void i_am_a_dummy_subroutine(void) { - return; -} -#endif diff --git a/src/MISC/xdr_compat.h b/src/MISC/xdr_compat.h index ac318aa58c..605374c47f 100644 --- a/src/MISC/xdr_compat.h +++ b/src/MISC/xdr_compat.h @@ -60,7 +60,7 @@ extern "C" { typedef int bool_t; -#if defined(__MINGW32__) +#if defined(__MINGW32__) || defined(__APPLE__) typedef char * caddr_t; typedef unsigned int u_int; #endif diff --git a/src/MOLECULE/angle_table.cpp b/src/MOLECULE/angle_table.cpp index 4d9007adb7..6e145efa10 100644 --- a/src/MOLECULE/angle_table.cpp +++ b/src/MOLECULE/angle_table.cpp @@ -609,18 +609,22 @@ double AngleTable::splint(double *xa, double *ya, double *y2a, int n, double x) void AngleTable::uf_lookup(int type, double x, double &u, double &f) { - int itable; - double fraction,a,b; + if (!ISFINITE(x)) { + error->one(FLERR,"Illegal angle in angle style table"); + } - Table *tb = &tables[tabindex[type]]; + double fraction,a,b; + const Table *tb = &tables[tabindex[type]]; + int itable = static_cast (x * tb->invdelta); + + if (itable < 0) itable = 0; + if (itable >= tablength) itable = tablength-1; if (tabstyle == LINEAR) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; f = tb->f[itable] + fraction*tb->df[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; b = (x - tb->ang[itable]) * tb->invdelta; @@ -640,17 +644,21 @@ void AngleTable::uf_lookup(int type, double x, double &u, double &f) void AngleTable::u_lookup(int type, double x, double &u) { - int itable; - double fraction,a,b; + if (!ISFINITE(x)) { + error->one(FLERR,"Illegal angle in angle style table"); + } - Table *tb = &tables[tabindex[type]]; + double fraction,a,b; + const Table *tb = &tables[tabindex[type]]; + int itable = static_cast ( x * tb->invdelta); + + if (itable < 0) itable = 0; + if (itable >= tablength) itable = tablength-1; if (tabstyle == LINEAR) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ( x * tb->invdelta); fraction = (x - tb->ang[itable]) * tb->invdelta; b = (x - tb->ang[itable]) * tb->invdelta; diff --git a/src/MOLECULE/bond_gromos.cpp b/src/MOLECULE/bond_gromos.cpp new file mode 100644 index 0000000000..4e409b7a72 --- /dev/null +++ b/src/MOLECULE/bond_gromos.cpp @@ -0,0 +1,210 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "bond_gromos.h" +#include "atom.h" +#include "neighbor.h" +#include "domain.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +BondGromos::BondGromos(LAMMPS *lmp) : Bond(lmp) +{ + reinitflag = 1; +} + +/* ---------------------------------------------------------------------- */ + +BondGromos::~BondGromos() +{ + if (allocated && !copymode) { + memory->destroy(setflag); + memory->destroy(k); + memory->destroy(r0); + } +} + +/* ---------------------------------------------------------------------- */ + +void BondGromos::compute(int eflag, int vflag) +{ + int i1,i2,n,type; + double delx,dely,delz,ebond,fbond; + + ebond = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = 0; + + double **x = atom->x; + double **f = atom->f; + int **bondlist = neighbor->bondlist; + int nbondlist = neighbor->nbondlist; + int nlocal = atom->nlocal; + int newton_bond = force->newton_bond; + + for (n = 0; n < nbondlist; n++) { + i1 = bondlist[n][0]; + i2 = bondlist[n][1]; + type = bondlist[n][2]; + + delx = x[i1][0] - x[i2][0]; + dely = x[i1][1] - x[i2][1]; + delz = x[i1][2] - x[i2][2]; + + const double rsq = delx*delx + dely*dely + delz*delz; + const double dr = rsq - r0[type]*r0[type]; + const double kdr = k[type]*dr; + + // force & energy + + fbond = -4.0 * kdr; + if (eflag) ebond = kdr*dr; + + // apply force to each of 2 atoms + + if (newton_bond || i1 < nlocal) { + f[i1][0] += delx*fbond; + f[i1][1] += dely*fbond; + f[i1][2] += delz*fbond; + } + + if (newton_bond || i2 < nlocal) { + f[i2][0] -= delx*fbond; + f[i2][1] -= dely*fbond; + f[i2][2] -= delz*fbond; + } + + if (evflag) ev_tally(i1,i2,nlocal,newton_bond,ebond,fbond,delx,dely,delz); + } +} + +/* ---------------------------------------------------------------------- */ + +void BondGromos::allocate() +{ + allocated = 1; + int n = atom->nbondtypes; + + memory->create(k,n+1,"bond:k"); + memory->create(r0,n+1,"bond:r0"); + + memory->create(setflag,n+1,"bond:setflag"); + for (int i = 1; i <= n; i++) setflag[i] = 0; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more types +------------------------------------------------------------------------- */ + +void BondGromos::coeff(int narg, char **arg) +{ + if (narg != 3) error->all(FLERR,"Incorrect args for bond coefficients"); + if (!allocated) allocate(); + + int ilo,ihi; + force->bounds(FLERR,arg[0],atom->nbondtypes,ilo,ihi); + + double k_one = force->numeric(FLERR,arg[1]); + double r0_one = force->numeric(FLERR,arg[2]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + k[i] = k_one; + r0[i] = r0_one; + setflag[i] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for bond coefficients"); +} + +/* ---------------------------------------------------------------------- + return an equilbrium bond length +------------------------------------------------------------------------- */ + +double BondGromos::equilibrium_distance(int i) +{ + return r0[i]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes out coeffs to restart file +------------------------------------------------------------------------- */ + +void BondGromos::write_restart(FILE *fp) +{ + fwrite(&k[1],sizeof(double),atom->nbondtypes,fp); + fwrite(&r0[1],sizeof(double),atom->nbondtypes,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads coeffs from restart file, bcasts them +------------------------------------------------------------------------- */ + +void BondGromos::read_restart(FILE *fp) +{ + allocate(); + + if (comm->me == 0) { + fread(&k[1],sizeof(double),atom->nbondtypes,fp); + fread(&r0[1],sizeof(double),atom->nbondtypes,fp); + } + MPI_Bcast(&k[1],atom->nbondtypes,MPI_DOUBLE,0,world); + MPI_Bcast(&r0[1],atom->nbondtypes,MPI_DOUBLE,0,world); + + for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void BondGromos::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->nbondtypes; i++) + fprintf(fp,"%d %g %g\n",i,k[i],r0[i]); +} + +/* ---------------------------------------------------------------------- */ + +double BondGromos::single(int type, double rsq, int i, int j, + double &fforce) +{ + double dr = rsq - r0[type]*r0[type]; + fforce = -4.0*k[type] * dr; + return k[type]*dr*dr; +} + +/* ---------------------------------------------------------------------- + Return ptr to internal members upon request. +------------------------------------------------------------------------ */ +void *BondGromos::extract( char *str, int &dim ) +{ + dim = 1; + if( strcmp(str,"kappa")==0) return (void*) k; + if( strcmp(str,"r0")==0) return (void*) r0; + return NULL; +} diff --git a/src/MOLECULE/bond_gromos.h b/src/MOLECULE/bond_gromos.h new file mode 100644 index 0000000000..dafe85e92b --- /dev/null +++ b/src/MOLECULE/bond_gromos.h @@ -0,0 +1,58 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef BOND_CLASS + +BondStyle(gromos,BondGromos) + +#else + +#ifndef LMP_BOND_GROMOS_H +#define LMP_BOND_GROMOS_H + +#include +#include "bond.h" + +namespace LAMMPS_NS { + +class BondGromos : public Bond { + public: + BondGromos(class LAMMPS *); + virtual ~BondGromos(); + virtual void compute(int, int); + void coeff(int, char **); + double equilibrium_distance(int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_data(FILE *); + double single(int, double, int, int, double &); + virtual void *extract(char *, int &); + + protected: + double *k,*r0; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args for bond coefficients + +Self-explanatory. Check the input script or data file. + +*/ diff --git a/src/MOLECULE/bond_table.cpp b/src/MOLECULE/bond_table.cpp index 38cbe7e406..4f8db66757 100644 --- a/src/MOLECULE/bond_table.cpp +++ b/src/MOLECULE/bond_table.cpp @@ -590,29 +590,29 @@ double BondTable::splint(double *xa, double *ya, double *y2a, int n, double x) void BondTable::uf_lookup(int type, double x, double &u, double &f) { - int itable; + if (!ISFINITE(x)) { + error->one(FLERR,"Illegal bond in bond style table"); + } + double fraction,a,b; char estr[128]; - - Table *tb = &tables[tabindex[type]]; - if (x < tb->lo) { + const Table *tb = &tables[tabindex[type]]; + const int itable = static_cast ((x - tb->lo) * tb->invdelta); + if (itable < 0) { sprintf(estr,"Bond length < table inner cutoff: " "type %d length %g",type,x); error->one(FLERR,estr); - } - if (x > tb->hi) { + } else if (itable >= tablength) { sprintf(estr,"Bond length > table outer cutoff: " "type %d length %g",type,x); error->one(FLERR,estr); } if (tabstyle == LINEAR) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; f = tb->f[itable] + fraction*tb->df[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; b = (x - tb->r[itable]) * tb->invdelta; @@ -633,19 +633,28 @@ void BondTable::uf_lookup(int type, double x, double &u, double &f) void BondTable::u_lookup(int type, double x, double &u) { - int itable; - double fraction,a,b; + if (!ISFINITE(x)) { + error->one(FLERR,"Illegal bond in bond style table"); + } - Table *tb = &tables[tabindex[type]]; - x = MAX(x,tb->lo); - x = MIN(x,tb->hi); + double fraction,a,b; + char estr[128]; + const Table *tb = &tables[tabindex[type]]; + const int itable = static_cast ((x - tb->lo) * tb->invdelta); + if (itable < 0) { + sprintf(estr,"Bond length < table inner cutoff: " + "type %d length %g",type,x); + error->one(FLERR,estr); + } else if (itable >= tablength) { + sprintf(estr,"Bond length > table outer cutoff: " + "type %d length %g",type,x); + error->one(FLERR,estr); + } if (tabstyle == LINEAR) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; u = tb->e[itable] + fraction*tb->de[itable]; } else if (tabstyle == SPLINE) { - itable = static_cast ((x - tb->lo) * tb->invdelta); fraction = (x - tb->r[itable]) * tb->invdelta; b = (x - tb->r[itable]) * tb->invdelta; diff --git a/src/MOLECULE/fix_cmap.cpp b/src/MOLECULE/fix_cmap.cpp index 551e049238..56106cc3e0 100644 --- a/src/MOLECULE/fix_cmap.cpp +++ b/src/MOLECULE/fix_cmap.cpp @@ -76,6 +76,7 @@ FixCMAP::FixCMAP(LAMMPS *lmp, int narg, char **arg) : restart_peratom = 1; peatom_flag = 1; virial_flag = 1; + thermo_virial = 1; peratom_freq = 1; scalar_flag = 1; global_freq = 1; diff --git a/src/MPIIO/dump_custom_mpiio.cpp b/src/MPIIO/dump_custom_mpiio.cpp index 6e48bfa146..0b282b77ef 100644 --- a/src/MPIIO/dump_custom_mpiio.cpp +++ b/src/MPIIO/dump_custom_mpiio.cpp @@ -542,8 +542,8 @@ void DumpCustomMPIIO::write_string(int n, double *mybuf) #if defined(_OPENMP) int nthreads = omp_get_max_threads(); - if (nthreads > 1) - nsme = convert_string_omp(n,mybuf); + if ((nthreads > 1) && !(lmp->kokkos)) + nsme = convert_string_omp(n,mybuf); // not (yet) compatible with Kokkos else nsme = convert_string(n,mybuf); #else diff --git a/src/MSCG/fix_mscg.cpp b/src/MSCG/fix_mscg.cpp index b5bfa926a1..fba198c814 100644 --- a/src/MSCG/fix_mscg.cpp +++ b/src/MSCG/fix_mscg.cpp @@ -19,6 +19,7 @@ #include #include #include "fix_mscg.h" +#include "mscg.h" #include "atom.h" #include "domain.h" #include "error.h" diff --git a/src/MSCG/fix_mscg.h b/src/MSCG/fix_mscg.h index f6dcf4f0f6..2c235d436a 100644 --- a/src/MSCG/fix_mscg.h +++ b/src/MSCG/fix_mscg.h @@ -21,7 +21,6 @@ FixStyle(mscg,FixMSCG) #define LMP_FIX_MSCG_H #include "fix.h" -#include "mscg.h" namespace LAMMPS_NS { diff --git a/src/Makefile b/src/Makefile index c7b20dcb13..03f4072132 100644 --- a/src/Makefile +++ b/src/Makefile @@ -53,18 +53,19 @@ endif # PACKEXT = subset that require an external (downloaded) library PACKAGE = asphere body class2 colloid compress coreshell dipole gpu \ - granular kim kokkos kspace manybody mc meam misc molecule \ - mpiio mscg opt peri poems \ + granular kim kokkos kspace latte manybody mc meam misc \ + molecule mpiio mscg opt peri poems \ python qeq reax replica rigid shock snap srd voronoi PACKUSER = user-atc user-awpmd user-cgdna user-cgsdk user-colvars \ user-diffraction user-dpd user-drude user-eff user-fep user-h5md \ - user-intel user-lb user-manifold user-meamc user-mgpt user-misc user-molfile \ + user-intel user-lb user-manifold user-meamc user-meso \ + user-mgpt user-misc user-molfile \ user-netcdf user-omp user-phonon user-qmmm user-qtb \ user-quip user-reaxc user-smd user-smtbq user-sph user-tally \ - user-vtk + user-uef user-vtk -PACKLIB = compress gpu kim kokkos meam mpiio mscg poems \ +PACKLIB = compress gpu kim kokkos latte meam mpiio mscg poems \ python reax voronoi \ user-atc user-awpmd user-colvars user-h5md user-lb user-molfile \ user-netcdf user-qmmm user-quip user-smd user-vtk @@ -99,6 +100,7 @@ help: @echo '' @echo 'make package list available packages and their dependencies' @echo 'make package-status (ps) status of all packages' + @echo 'make package-installed (pi) list of installed packages' @echo 'make yes-package install a single pgk in src dir' @echo 'make no-package remove a single pkg from src dir' @echo 'make yes-all install all pgks in src dir' @@ -116,7 +118,8 @@ help: @echo 'make package-overwrite replace package files with src files' @echo 'make package-diff (pd) diff src files against package files' @echo '' - @echo 'make lib-package download/build/install a package library' + @echo 'make lib-package help for download/build/install a package library' + @echo 'make lib-package args="..." download/build/install a package library' @echo 'make purge purge obsolete copies of source files' @echo '' @echo 'make machine build LAMMPS for machine' @@ -223,7 +226,7 @@ mpi-stubs: @cd STUBS; $(MAKE) clean; $(MAKE) # install LAMMPS shared lib and Python wrapper for Python usage -# include python package settings to +# include python package settings to # automatically adapt name of python interpreter sinclude ../lib/python/Makefile.lammps @@ -258,6 +261,7 @@ package: @echo 'make package list available packages' @echo 'make package list available packages' @echo 'make package-status (ps) status of all packages' + @echo 'make package-installed (pi) list of installed packages' @echo 'make yes-package install a single pgk in src dir' @echo 'make no-package remove a single pkg from src dir' @echo 'make yes-all install all pgks in src dir' @@ -338,19 +342,21 @@ no-%: fi; # download/build/install a package library +# update the timestamp on main.cpp to trigger a relink with "make machine" lib-%: @if [ -e ../lib/$(LIBDIR)/Install.py ]; then \ echo "Installing lib $(@:lib-%=%)"; \ - cd ../lib/$(LIBDIR); python Install.py $(args); \ + ( cd ../lib/$(LIBDIR); $(PYTHON) Install.py $(args) ); \ elif [ -e ../lib/$(LIBUSERDIR)/Install.py ]; then \ echo "Installing lib $(@:lib-user-%=%)"; \ - cd ../lib/$(LIBUSERDIR); python Install.py $(args); \ + ( cd ../lib/$(LIBUSERDIR); $(PYTHON) Install.py $(args) ); \ else \ echo "Install script for lib $(@:lib-%=%) does not exist"; \ - fi; + fi; touch main.cpp # status = list src files that differ from package files +# installed = list of installed packages # update = replace src files with newer package files # overwrite = overwrite package files with newer src files # diff = show differences between src and package files @@ -361,12 +367,16 @@ package-status ps: @echo '' @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p status; done -package-update pu: +package-installed pi: + @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p installed; done + @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p installed; done + +package-update pu: purge @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p update; done @echo '' @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p update; done -package-overwrite: +package-overwrite: purge @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p overwrite; done @echo '' @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p overwrite; done diff --git a/src/OPT/Install.sh b/src/OPT/Install.sh index ca1231c615..c6ae2b914b 100644 --- a/src/OPT/Install.sh +++ b/src/OPT/Install.sh @@ -46,3 +46,5 @@ action pair_lj_long_coul_long_opt.cpp pair_lj_long_coul_long.cpp action pair_lj_long_coul_long_opt.h pair_lj_long_coul_long.cpp action pair_morse_opt.cpp action pair_morse_opt.h +action pair_ufm_opt.cpp +action pair_ufm_opt.h diff --git a/src/OPT/pair_lj_long_coul_long_opt.cpp b/src/OPT/pair_lj_long_coul_long_opt.cpp index 9004e5c93c..678d2d8bc4 100644 --- a/src/OPT/pair_lj_long_coul_long_opt.cpp +++ b/src/OPT/pair_lj_long_coul_long_opt.cpp @@ -726,7 +726,7 @@ void PairLJLongCoulLongOpt::eval_outer() double cut_in_off_sq = cut_in_off*cut_in_off; double cut_in_on_sq = cut_in_on*cut_in_on; - ineighn = (ineigh = listouter->ilist)+listouter->inum; + ineighn = (ineigh = list->ilist)+list->inum; for (; ineighfirstneigh[i])+listouter->numneigh[i]; + jneighn = (jneigh = list->firstneigh[i])+list->numneigh[i]; for (; jneigh +#include +#include "pair_ufm_opt.h" +#include "atom.h" +#include "force.h" +#include "neigh_list.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairUFMOpt::PairUFMOpt(LAMMPS *lmp) : PairUFM(lmp) {} + +/* ---------------------------------------------------------------------- */ + +void PairUFMOpt::compute(int eflag, int vflag) +{ + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + if (evflag) { + if (eflag) { + if (force->newton_pair) return eval<1,1,1>(); + else return eval<1,1,0>(); + } else { + if (force->newton_pair) return eval<1,0,1>(); + else return eval<1,0,0>(); + } + } else { + if (force->newton_pair) return eval<0,0,1>(); + else return eval<0,0,0>(); + } +} + +/* ---------------------------------------------------------------------- */ + +template < int EVFLAG, int EFLAG, int NEWTON_PAIR > +void PairUFMOpt::eval() +{ + typedef struct { double x,y,z; } vec3_t; + + typedef struct { + double cutsq,uf1,uf2,uf3,uf4,scale,offset; + double _pad[2]; + } fast_alpha_t; + + int i,j,ii,jj,inum,jnum,itype,jtype,sbindex; + double factor_lj; + double evdwl = 0.0; + + double** _noalias x = atom->x; + double** _noalias f = atom->f; + int* _noalias type = atom->type; + int nlocal = atom->nlocal; + double* _noalias special_lj = force->special_lj; + + inum = list->inum; + int* _noalias ilist = list->ilist; + int** _noalias firstneigh = list->firstneigh; + int* _noalias numneigh = list->numneigh; + + vec3_t* _noalias xx = (vec3_t*)x[0]; + vec3_t* _noalias ff = (vec3_t*)f[0]; + + int ntypes = atom->ntypes; + int ntypes2 = ntypes*ntypes; + + fast_alpha_t* _noalias fast_alpha = + (fast_alpha_t*) malloc(ntypes2*sizeof(fast_alpha_t)); + for (i = 0; i < ntypes; i++) for (j = 0; j < ntypes; j++) { + fast_alpha_t& a = fast_alpha[i*ntypes+j]; + a.cutsq = cutsq[i+1][j+1]; + a.uf1 = uf1[i+1][j+1]; + a.uf2 = uf2[i+1][j+1]; + a.uf3 = uf3[i+1][j+1]; + a.uf4 = uf4[i+1][j+1]; + a.scale = scale[i+1][j+1]; + a.offset = offset[i+1][j+1]; + } + fast_alpha_t* _noalias tabsix = fast_alpha; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + double xtmp = xx[i].x; + double ytmp = xx[i].y; + double ztmp = xx[i].z; + itype = type[i] - 1; + int* _noalias jlist = firstneigh[i]; + jnum = numneigh[i]; + + double tmpfx = 0.0; + double tmpfy = 0.0; + double tmpfz = 0.0; + + fast_alpha_t* _noalias tabsixi = (fast_alpha_t*)&tabsix[itype*ntypes]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + sbindex = sbmask(j); + + if (sbindex == 0) { + double delx = xtmp - xx[j].x; + double dely = ytmp - xx[j].y; + double delz = ztmp - xx[j].z; + double rsq = delx*delx + dely*dely + delz*delz; + + jtype = type[j] - 1; + + fast_alpha_t& a = tabsixi[jtype]; + + if (rsq < a.cutsq) { + double expuf = exp(- rsq * a.uf2); + double fpair = a.scale * a.uf1 * expuf / (1.0 - expuf); + + tmpfx += delx*fpair; + tmpfy += dely*fpair; + tmpfz += delz*fpair; + if (NEWTON_PAIR || j < nlocal) { + ff[j].x -= delx*fpair; + ff[j].y -= dely*fpair; + ff[j].z -= delz*fpair; + } + + if (EFLAG) evdwl = - a.uf3 * log(1.0 - expuf) - a.offset; + + if (EVFLAG) + ev_tally(i,j,nlocal,NEWTON_PAIR, + evdwl,0.0,fpair,delx,dely,delz); + } + + } else { + factor_lj = special_lj[sbindex]; + j &= NEIGHMASK; + + double delx = xtmp - xx[j].x; + double dely = ytmp - xx[j].y; + double delz = ztmp - xx[j].z; + double rsq = delx*delx + dely*dely + delz*delz; + + int jtype1 = type[j]; + jtype = jtype1 - 1; + + fast_alpha_t& a = tabsixi[jtype]; + if (rsq < a.cutsq) { + fast_alpha_t& a = tabsixi[jtype]; + double expuf = exp(- rsq * a.uf2); + double fpair = a.scale * factor_lj * a.uf1 * expuf / (1.0 - expuf); + + tmpfx += delx*fpair; + tmpfy += dely*fpair; + tmpfz += delz*fpair; + if (NEWTON_PAIR || j < nlocal) { + ff[j].x -= delx*fpair; + ff[j].y -= dely*fpair; + ff[j].z -= delz*fpair; + } + + if (EFLAG) { + evdwl = - a.uf3 * log(1.0 - expuf) - a.offset; + evdwl *= factor_lj; + } + + if (EVFLAG) ev_tally(i,j,nlocal,NEWTON_PAIR, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } + + ff[i].x += tmpfx; + ff[i].y += tmpfy; + ff[i].z += tmpfz; + } + + free(fast_alpha); fast_alpha = 0; + + if (vflag_fdotr) virial_fdotr_compute(); +} diff --git a/src/OPT/pair_ufm_opt.h b/src/OPT/pair_ufm_opt.h new file mode 100644 index 0000000000..edac708403 --- /dev/null +++ b/src/OPT/pair_ufm_opt.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(ufm/opt,PairUFMOpt) + +#else + +#ifndef LMP_PAIR_UFM_OPT_H +#define LMP_PAIR_UFM_OPT_H + +#include "pair_ufm.h" + +namespace LAMMPS_NS { + +class PairUFMOpt : public PairUFM { + public: + PairUFMOpt(class LAMMPS *); + void compute(int, int); + + private: + template < int EVFLAG, int EFLAG, int NEWTON_PAIR > void eval(); +}; + +} + +#endif +#endif diff --git a/src/POEMS/fix_poems.cpp b/src/POEMS/fix_poems.cpp index fe2168fcaa..effd06f477 100644 --- a/src/POEMS/fix_poems.cpp +++ b/src/POEMS/fix_poems.cpp @@ -76,6 +76,7 @@ FixPOEMS::FixPOEMS(LAMMPS *lmp, int narg, char **arg) : time_integrate = 1; rigid_flag = 1; virial_flag = 1; + thermo_virial = 1; dof_flag = 1; MPI_Comm_rank(world,&me); @@ -683,12 +684,14 @@ void FixPOEMS::setup(int vflag) // guestimate virial as 2x the set_v contribution - if (vflag_global) - for (n = 0; n < 6; n++) virial[n] *= 2.0; - if (vflag_atom) { - for (i = 0; i < nlocal; i++) - for (n = 0; n < 6; n++) - vatom[i][n] *= 2.0; + if (evflag) { + if (vflag_global) + for (n = 0; n < 6; n++) virial[n] *= 2.0; + if (vflag_atom) { + for (i = 0; i < nlocal; i++) + for (n = 0; n < 6; n++) + vatom[i][n] *= 2.0; + } } // use post_force() to compute initial fcm & torque diff --git a/src/PYTHON/fix_python.cpp b/src/PYTHON/fix_python_invoke.cpp similarity index 86% rename from src/PYTHON/fix_python.cpp rename to src/PYTHON/fix_python_invoke.cpp index ffca66e77c..9a4db51d99 100644 --- a/src/PYTHON/fix_python.cpp +++ b/src/PYTHON/fix_python_invoke.cpp @@ -18,7 +18,7 @@ #include #include #include -#include "fix_python.h" +#include "fix_python_invoke.h" #include "atom.h" #include "force.h" #include "update.h" @@ -32,13 +32,13 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixPython::FixPython(LAMMPS *lmp, int narg, char **arg) : +FixPythonInvoke::FixPythonInvoke(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - if (narg != 6) error->all(FLERR,"Illegal fix python command"); + if (narg != 6) error->all(FLERR,"Illegal fix python/invoke command"); nevery = force->inumeric(FLERR,arg[3]); - if (nevery <= 0) error->all(FLERR,"Illegal fix python command"); + if (nevery <= 0) error->all(FLERR,"Illegal fix python/invoke command"); // ensure Python interpreter is initialized python->init(); @@ -48,7 +48,7 @@ FixPython::FixPython(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[4],"end_of_step") == 0) { selected_callback = END_OF_STEP; } else { - error->all(FLERR,"Unsupported callback name for fix/python"); + error->all(FLERR,"Unsupported callback name for fix python/invoke"); } // get Python function @@ -74,14 +74,14 @@ FixPython::FixPython(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -int FixPython::setmask() +int FixPythonInvoke::setmask() { return selected_callback; } /* ---------------------------------------------------------------------- */ -void FixPython::end_of_step() +void FixPythonInvoke::end_of_step() { PyGILState_STATE gstate = PyGILState_Ensure(); @@ -96,7 +96,7 @@ void FixPython::end_of_step() /* ---------------------------------------------------------------------- */ -void FixPython::post_force(int vflag) +void FixPythonInvoke::post_force(int vflag) { if (update->ntimestep % nevery != 0) return; diff --git a/src/PYTHON/fix_python.h b/src/PYTHON/fix_python_invoke.h similarity index 81% rename from src/PYTHON/fix_python.h rename to src/PYTHON/fix_python_invoke.h index 2e740dedcd..05f0bd08c6 100644 --- a/src/PYTHON/fix_python.h +++ b/src/PYTHON/fix_python_invoke.h @@ -13,21 +13,22 @@ #ifdef FIX_CLASS -FixStyle(python,FixPython) +FixStyle(python,FixPythonInvoke) +FixStyle(python/invoke,FixPythonInvoke) #else -#ifndef LMP_FIX_PYTHON_H -#define LMP_FIX_PYTHON_H +#ifndef LMP_FIX_PYTHON_INVOKE_H +#define LMP_FIX_PYTHON_INVOKE_H #include "fix.h" namespace LAMMPS_NS { -class FixPython : public Fix { +class FixPythonInvoke : public Fix { public: - FixPython(class LAMMPS *, int, char **); - virtual ~FixPython() {} + FixPythonInvoke(class LAMMPS *, int, char **); + virtual ~FixPythonInvoke() {} int setmask(); virtual void end_of_step(); virtual void post_force(int); diff --git a/src/PYTHON/fix_python_move.cpp b/src/PYTHON/fix_python_move.cpp new file mode 100644 index 0000000000..22d3bd065f --- /dev/null +++ b/src/PYTHON/fix_python_move.cpp @@ -0,0 +1,239 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Richard Berger (Temple U) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "fix_python_move.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "neigh_list.h" +#include "python.h" +#include "error.h" +#include "python_compat.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixPythonMove::FixPythonMove(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + dynamic_group_allow = 1; + time_integrate = 1; + + python->init(); + + py_move = NULL; + + PyGILState_STATE gstate = PyGILState_Ensure(); + + // add current directory to PYTHONPATH + PyObject * py_path = PySys_GetObject("path"); + PyList_Append(py_path, PY_STRING_FROM_STRING(".")); + + + // create integrator instance + char * full_cls_name = arg[3]; + char * lastpos = strrchr(full_cls_name, '.'); + + if (lastpos == NULL) { + error->all(FLERR,"Fix python/integrate requires fully qualified class name"); + } + + size_t module_name_length = strlen(full_cls_name) - strlen(lastpos); + size_t cls_name_length = strlen(lastpos)-1; + + char * module_name = new char[module_name_length+1]; + char * cls_name = new char[cls_name_length+1]; + strncpy(module_name, full_cls_name, module_name_length); + module_name[module_name_length] = 0; + + strcpy(cls_name, lastpos+1); + + PyObject * pModule = PyImport_ImportModule(module_name); + if (!pModule) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Loading python integrator module failure"); + } + + // create LAMMPS atom type to potential file type mapping in python class + // by calling 'lammps_pair_style.map_coeff(name,type)' + + PyObject *py_move_type = PyObject_GetAttrString(pModule, cls_name); + if (!py_move_type) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find integrator class in module'"); + } + + delete [] module_name; + delete [] cls_name; + + PyObject * ptr = PY_VOID_POINTER(lmp); + PyObject * arglist = Py_BuildValue("(O)", ptr); + PyObject * py_move_obj = PyObject_CallObject(py_move_type, arglist); + Py_DECREF(arglist); + + if (!py_move_obj) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not instantiate instance of integrator class'"); + } + + // check object interface + py_move = (void *) py_move_obj; + + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +FixPythonMove::~FixPythonMove() +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + if(py_move) Py_DECREF((PyObject*) py_move); + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +int FixPythonMove::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= FINAL_INTEGRATE; + mask |= INITIAL_INTEGRATE_RESPA; + mask |= FINAL_INTEGRATE_RESPA; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonMove::init() +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_move_obj = (PyObject *) py_move; + PyObject *py_init = PyObject_GetAttrString(py_move_obj,"init"); + if (!py_init) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'init' method'"); + } + PyObject * result = PyEval_CallObject(py_init, NULL); + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonMove::initial_integrate(int vflag) +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_move_obj = (PyObject *) py_move; + PyObject *py_initial_integrate = PyObject_GetAttrString(py_move_obj,"initial_integrate"); + if (!py_initial_integrate) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'initial_integrate' method'"); + } + PyObject * arglist = Py_BuildValue("(i)", vflag); + PyObject * result = PyEval_CallObject(py_initial_integrate, arglist); + Py_DECREF(arglist); + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonMove::final_integrate() +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_move_obj = (PyObject *) py_move; + PyObject *py_final_integrate = PyObject_GetAttrString(py_move_obj,"final_integrate"); + if (!py_final_integrate) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'final_integrate' method'"); + } + PyObject * result = PyEval_CallObject(py_final_integrate, NULL); + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonMove::initial_integrate_respa(int vflag, int ilevel, int iloop) +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_move_obj = (PyObject *) py_move; + PyObject *py_initial_integrate_respa = PyObject_GetAttrString(py_move_obj,"initial_integrate_respa"); + if (!py_initial_integrate_respa) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'initial_integrate_respa' method'"); + } + PyObject * arglist = Py_BuildValue("(iii)", vflag, ilevel, iloop); + PyObject * result = PyEval_CallObject(py_initial_integrate_respa, arglist); + Py_DECREF(arglist); + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonMove::final_integrate_respa(int ilevel, int iloop) +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_move_obj = (PyObject *) py_move; + PyObject *py_final_integrate_respa = PyObject_GetAttrString(py_move_obj,"final_integrate_respa"); + if (!py_final_integrate_respa) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'final_integrate_respa' method'"); + } + PyObject * arglist = Py_BuildValue("(ii)", ilevel, iloop); + PyObject * result = PyEval_CallObject(py_final_integrate_respa, arglist); + Py_DECREF(arglist); + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonMove::reset_dt() +{ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_move_obj = (PyObject *) py_move; + PyObject *py_reset_dt = PyObject_GetAttrString(py_move_obj,"reset_dt"); + if (!py_reset_dt) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'reset_dt' method'"); + } + PyObject * result = PyEval_CallObject(py_reset_dt, NULL); + PyGILState_Release(gstate); +} diff --git a/src/PYTHON/fix_python_move.h b/src/PYTHON/fix_python_move.h new file mode 100644 index 0000000000..7f92ecc957 --- /dev/null +++ b/src/PYTHON/fix_python_move.h @@ -0,0 +1,67 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Pair zero is a dummy pair interaction useful for requiring a + force cutoff distance in the absense of pair-interactions or + with hybrid/overlay if a larger force cutoff distance is required. + + This can be used in conjunction with bond/create to create bonds + that are longer than the cutoff of a given force field, or to + calculate radial distribution functions for models without + pair interactions. + +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(python/move,FixPythonMove) + +#else + +#ifndef LMP_FIX_PYTHON_MOVE_H +#define LMP_FIX_PYTHON_MOVE_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixPythonMove : public Fix { + public: + FixPythonMove(LAMMPS *lmp, int narg, char **arg); + virtual ~FixPythonMove(); + + int setmask(); + virtual void init(); + virtual void initial_integrate(int); + virtual void final_integrate(); + virtual void initial_integrate_respa(int, int, int); + virtual void final_integrate_respa(int, int); + virtual void reset_dt(); + + protected: + void * py_move; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +*/ diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index fcec2baaa9..0db987bb63 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -181,6 +181,7 @@ void PairPython::compute(int eflag, int vflag) error->all(FLERR,"Calling 'compute_force' function failed"); } fpair = factor_lj*PyFloat_AsDouble(py_value); + Py_DECREF(py_value); f[i][0] += delx*fpair; f[i][1] += dely*fpair; @@ -194,6 +195,7 @@ void PairPython::compute(int eflag, int vflag) if (eflag) { py_value = PyObject_CallObject(py_compute_energy,py_compute_args); evdwl = factor_lj*PyFloat_AsDouble(py_value); + Py_DECREF(py_value); } else evdwl = 0.0; if (evflag) ev_tally(i,j,nlocal,newton_pair, @@ -467,6 +469,7 @@ double PairPython::single(int i, int j, int itype, int jtype, double rsq, error->all(FLERR,"Calling 'compute_force' function failed"); } fforce = factor_lj*PyFloat_AsDouble(py_value); + Py_DECREF(py_value); py_value = PyObject_CallObject(py_compute_energy,py_compute_args); if (!py_value) { @@ -476,6 +479,7 @@ double PairPython::single(int i, int j, int itype, int jtype, double rsq, error->all(FLERR,"Calling 'compute_energy' function failed"); } double evdwl = factor_lj*PyFloat_AsDouble(py_value); + Py_DECREF(py_value); Py_DECREF(py_compute_args); PyGILState_Release(gstate); diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index daa4952665..cd8e691782 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -326,6 +326,7 @@ void PythonImpl::invoke_function(int ifunc, char *result) pValue = PyObject_CallObject(pFunc,pArgs); if (!pValue) { + PyErr_Print(); PyGILState_Release(gstate); error->one(FLERR,"Python function evaluation failed"); } diff --git a/src/Package.sh b/src/Package.sh index ce3819b590..72e8761e21 100644 --- a/src/Package.sh +++ b/src/Package.sh @@ -34,6 +34,13 @@ if (test $2 = "status") then echo "Installed NO: package $1" fi +# installed, list only if installed + +elif (test $2 = "installed") then + if (test $installed = 1) then + echo "Installed YES: package $1" + fi + # update, only if installed # perform a re-install, but only if the package is already installed diff --git a/src/Purge.list b/src/Purge.list index 340b210b20..d4a824b36c 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -16,6 +16,18 @@ style_region.h style_neigh_bin.h style_neigh_pair.h style_neigh_stencil.h +# deleted on 15 December 2017 +fix_python.cpp +fix_python.h +# deleted on 1 December 2017 +npair_half_bin_newtoff_intel.cpp +npair_half_bin_newtoff_intel.h +# deleted on 11 October 2017 +fix_shear_history_omp.cpp +fix_shear_history_omp.h +# deleted on 5 September 2017 +npair_halffull_newton_ssa.cpp +npair_halffull_newton_ssa.h # deleted on 6 June 2017 pair_lj_sf.cpp pair_lj_sf.h @@ -252,8 +264,6 @@ pair_dipole_sf_omp.cpp pair_dipole_sf_gpu.h pair_dipole_sf_gpu.cpp # deleted on Wed May 8 15:24:36 2013 +0000 -compute_spec_atom.cpp -compute_spec_atom.h fix_species.cpp fix_species.h # deleted on Fri Oct 19 15:27:15 2012 +0000 @@ -420,9 +430,6 @@ atom_vec_granular.h # deleted on Fri Nov 19 12:53:07 2010 -0500 fix_pour_omp.cpp fix_pour_omp.h -# deleted on Thu Aug 19 23:20:14 2010 +0000 -fix_qeq.cpp -fix_qeq.h # deleted on Thu Jun 17 01:34:38 2010 +0000 compute_vsum.cpp compute_vsum.h @@ -441,8 +448,6 @@ pair_buck_coul_omp.h dump_bond.cpp dump_bond.h # deleted on Mon Nov 9 18:20:20 2009 +0000 -atom_vec_dpd.cpp -atom_vec_dpd.h style_dpd.h # deleted on Mon Jun 22 21:11:31 2009 +0000 fix_write_reax_bonds.cpp diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index c5b566eef7..b9dfbdae19 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -362,6 +362,7 @@ int FixQEq::CG( double *b, double *x ) i = ilist[ii]; if (atom->mask[i] & groupbit) d[i] = r[i] * Hdia_inv[i]; + else d[i] = 0.0; } b_norm = parallel_norm( b, inum ); @@ -594,6 +595,7 @@ double FixQEq::parallel_norm( double *v, int n ) ilist = list->ilist; my_sum = 0.0; + norm_sqr = 0.0; for( ii = 0; ii < n; ++ii ) { i = ilist[ii]; if (atom->mask[i] & groupbit) @@ -692,11 +694,13 @@ void FixQEq::vector_add( double* dest, double c, double* v, int k ) void FixQEq::read_file(char *file) { - int itype,ntypes; + int i; int params_per_line = 6; char **words = new char*[params_per_line+1]; - ntypes = atom->ntypes; + int ntypes = atom->ntypes; + int *setflag = new int[ntypes+1]; + for (i=0; i < params_per_line; ++i) setflag[i] = 0; memory->create(chi,ntypes+1,"qeq:chi"); memory->create(eta,ntypes+1,"qeq:eta"); @@ -719,10 +723,10 @@ void FixQEq::read_file(char *file) // read each line out of file, skipping blank lines or leading '#' // store line of params if all 3 element tags are in element list - int n,nwords,ielement,eof; + int n,nwords,eof,nlo,nhi; char line[MAXLINE],*ptr; - eof = ielement = 0; + eof = 0; while (1) { if (comm->me == 0) { @@ -737,28 +741,39 @@ void FixQEq::read_file(char *file) MPI_Bcast(&n,1,MPI_INT,0,world); MPI_Bcast(line,n,MPI_CHAR,0,world); - ielement ++; - if (ielement > ntypes) - error->all(FLERR,"Invalid fix qeq parameter file"); - // strip comment, skip line if blank if ((ptr = strchr(line,'#'))) *ptr = '\0'; nwords = atom->count_words(line); if (nwords == 0) continue; - // words = ptrs to all words in line + // must have 6 parameters per line. - nwords = 0; - words[nwords++] = strtok(line," \t\n\r\f"); - while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + if (nwords < 6) + error->all(FLERR,"Invalid fix qeq parameter file"); - itype = atoi(words[0]); - chi[itype] = atof(words[1]); - eta[itype] = atof(words[2]); - gamma[itype] = atof(words[3]); - zeta[itype] = atof(words[4]); - zcore[itype] = atof(words[5]); + // words = ptrs to first 6 words in line + + for (n=0, words[n] = strtok(line," \t\n\r\f"); + n < 6; + words[++n] = strtok(NULL," \t\n\r\f")); + + force->bounds(FLERR,words[0],ntypes,nlo,nhi); + for (n=nlo; n <=nhi; ++n) { + chi[n] = force->numeric(FLERR,words[1]); + eta[n] = force->numeric(FLERR,words[2]); + gamma[n] = force->numeric(FLERR,words[3]); + zeta[n] = force->numeric(FLERR,words[4]); + zcore[n] = force->numeric(FLERR,words[5]); + setflag[n] = 1; + } } + + // check if all types are set + for (n=1; n <= ntypes; ++n) + if (setflag[n] == 0) + error->all(FLERR,"Invalid fix qeq parameter file"); + delete [] words; + delete [] setflag; } diff --git a/src/QEQ/fix_qeq_shielded.cpp b/src/QEQ/fix_qeq_shielded.cpp index 661dd73f7b..a5e0324d69 100644 --- a/src/QEQ/fix_qeq_shielded.cpp +++ b/src/QEQ/fix_qeq_shielded.cpp @@ -105,7 +105,7 @@ void FixQEqShielded::init_shielding() Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; Tap[1] = 140.0 * swa3 * swb3 / d7; - Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; } diff --git a/src/REAX/pair_reax.cpp b/src/REAX/pair_reax.cpp index fca24a2268..f6217c69a4 100644 --- a/src/REAX/pair_reax.cpp +++ b/src/REAX/pair_reax.cpp @@ -46,8 +46,8 @@ using namespace LAMMPS_NS; PairREAX::PairREAX(LAMMPS *lmp) : Pair(lmp) { if (comm->me == 0) - error->warning(FLERR,"The pair_style reax command will be deprecated " - "soon - users should switch to pair_style reax/c"); + error->warning(FLERR,"The pair_style reax command is unsupported. " + "Please switch to pair_style reax/c instead"); single_enable = 0; restartinfo = 0; @@ -172,10 +172,6 @@ void PairREAX::compute(int eflag, int vflag) FORTRAN(srtbon1, SRTBON1)(&iprune, &ihb, &hbcut, &ihbnew, &itripstaball); - // communicate with other processors for the atomic bond order calculations - - FORTRAN(cbkabo, CBKABO).abo; - // communicate local atomic bond order to ghost atomic bond order packflag = 0; @@ -720,7 +716,7 @@ void PairREAX::taper_setup() swc3= 140.0e0*(swa3*swb+3.0e0*swa2*swb2+swa*swb3)/d7; swc2=-210.0e0*(swa3*swb2+swa2*swb3)/d7; swc1= 140.0e0*swa3*swb3/d7; - swc0=(-35.0e0*swa3*swb2*swb2+21.0e0*swa2*swb3*swb2+ + swc0=(-35.0e0*swa3*swb2*swb2+21.0e0*swa2*swb3*swb2- 7.0e0*swa*swb3*swb3+swb3*swb3*swb)/d7; } @@ -943,7 +939,7 @@ void PairREAX::cg_solve(const int & nlocal, const int & nghost, double aval[], int acol_ind[], int arow_ptr[], double x[], double b[]) { - double one, zero, rho, rho_old, alpha, beta, gamma; + double one, rho, rho_old, alpha, beta, gamma; int iter, maxiter; int n; double sumtmp; @@ -963,7 +959,6 @@ void PairREAX::cg_solve(const int & nlocal, const int & nghost, n = nlocal+nghost+1; one = 1.0; - zero = 0.0; maxiter = 100; for (int i = 0; i < n; i++) w[i] = 0; diff --git a/src/REPLICA/data.peptide b/src/REPLICA/data.peptide new file mode 100644 index 0000000000..f9dfb6e485 --- /dev/null +++ b/src/REPLICA/data.peptide @@ -0,0 +1,6531 @@ +LAMMPS Description + + 2004 atoms + 1365 bonds + 786 angles + 207 dihedrals + 12 impropers + + 14 atom types + 18 bond types + 31 angle types + 21 dihedral types + 2 improper types + + 36.840194 64.211560 xlo xhi + 41.013691 68.385058 ylo yhi + 29.768095 57.139462 zlo zhi + +Masses + + 1 12.0110 + 2 12.0110 + 3 15.9990 + 4 1.0080 + 5 14.0070 + 6 12.0110 + 7 12.0110 + 8 12.0110 + 9 15.9990 + 10 1.0080 + 11 1.0080 + 12 32.0660 + 13 16.0000 + 14 1.0100 + +Pair Coeffs + + 1 0.110000 3.563595 0.110000 3.563595 + 2 0.080000 3.670503 0.010000 3.385415 + 3 0.120000 3.029056 0.120000 2.494516 + 4 0.022000 2.351973 0.022000 2.351973 + 5 0.200000 3.296325 0.200000 2.761786 + 6 0.020000 4.053589 0.010000 3.385415 + 7 0.055000 3.875410 0.010000 3.385415 + 8 0.070000 3.550053 0.070000 3.550053 + 9 0.152100 3.153782 0.152100 3.153782 + 10 0.046000 0.400014 0.046000 0.400014 + 11 0.030000 2.420037 0.030000 2.420037 + 12 0.450000 3.563595 0.450000 3.563595 + 13 0.152100 3.150570 0.152100 3.150570 + 14 0.046000 0.400014 0.046000 0.400014 + +Bond Coeffs + + 1 249.999999 1.490000 + 2 620.000001 1.230000 + 3 370.000000 1.345000 + 4 322.000001 1.111000 + 5 319.999999 1.430000 + 6 440.000000 0.997000 + 7 222.500001 1.538000 + 8 330.000001 1.080000 + 9 230.000000 1.490000 + 10 309.000001 1.111000 + 11 305.000000 1.375000 + 12 340.000001 1.080000 + 13 334.300000 1.411000 + 14 545.000001 0.960000 + 15 222.500001 1.530000 + 16 198.000000 1.818000 + 17 239.999999 1.816000 + 18 450.000000 0.957200 + +Angle Coeffs + + 1 33.000000 109.500000 30.000000 2.163000 + 2 50.000000 120.000000 0.000000 0.000000 + 3 34.000000 123.000000 0.000000 0.000000 + 4 80.000000 121.000000 0.000000 0.000000 + 5 80.000000 116.500000 0.000000 0.000000 + 6 80.000000 122.500000 0.000000 0.000000 + 7 35.500000 108.400000 5.400000 1.802000 + 8 50.000000 107.000000 0.000000 0.000000 + 9 70.000000 113.500000 0.000000 0.000000 + 10 48.000000 108.000000 0.000000 0.000000 + 11 35.000000 117.000000 0.000000 0.000000 + 12 51.800000 107.500000 0.000000 0.000000 + 13 33.430000 110.100000 22.530000 2.179000 + 14 52.000000 108.000000 0.000000 0.000000 + 15 50.000000 109.500000 0.000000 0.000000 + 16 35.000000 111.000000 0.000000 0.000000 + 17 45.800000 122.300000 0.000000 0.000000 + 18 49.300000 107.500000 0.000000 0.000000 + 19 40.000000 120.000000 35.000000 2.416200 + 20 30.000000 120.000000 22.000000 2.152500 + 21 45.200000 120.000000 0.000000 0.000000 + 22 65.000000 108.000000 0.000000 0.000000 + 23 35.500000 109.000000 5.400000 1.802000 + 24 36.000000 115.000000 0.000000 0.000000 + 25 58.350000 113.500000 11.160000 2.561000 + 26 58.000000 114.500000 0.000000 0.000000 + 27 26.500000 110.100000 22.530000 2.179000 + 28 34.000000 95.000000 0.000000 0.000000 + 29 46.100000 111.300000 0.000000 0.000000 + 30 51.500000 109.500000 0.000000 0.000000 + 31 55.000000 104.520000 0.000000 0.000000 + +Dihedral Coeffs + + 1 0.200000 1 180 1.000000 + 2 1.800000 1 0 1.000000 + 3 0.000000 1 0 1.000000 + 4 1.600000 1 0 0.500000 + 5 2.500000 2 180 0.500000 + 6 2.500000 2 180 1.000000 + 7 0.600000 1 0 1.000000 + 8 0.200000 3 0 1.000000 + 9 0.230000 2 180 1.000000 + 10 0.040000 3 0 1.000000 + 11 1.400000 1 0 1.000000 + 12 3.100000 2 180 1.000000 + 13 4.200000 2 180 1.000000 + 14 3.100000 2 180 0.500000 + 15 0.990000 2 180 1.000000 + 16 2.400000 2 180 1.000000 + 17 0.195000 3 0 1.000000 + 18 0.240000 1 180 0.500000 + 19 0.370000 3 0 0.500000 + 20 0.280000 3 0 1.000000 + 21 0.010000 3 0 1.000000 + +Improper Coeffs + + 1 120.000000 0.000000 + 2 20.000000 0.000000 + +Atoms + + 1 1 1 0.510 43.99993 58.52678 36.78550 0 0 0 + 2 1 2 -0.270 45.10395 58.23499 35.86693 0 0 0 + 3 1 3 -0.510 43.81519 59.54928 37.43995 0 0 0 + 4 1 4 0.090 45.71714 57.34797 36.13434 0 0 0 + 5 1 4 0.090 45.72261 59.13657 35.67007 0 0 0 + 6 1 4 0.090 44.66624 58.09539 34.85538 0 0 0 + 7 1 5 -0.470 43.28193 57.47427 36.91953 0 0 0 + 8 1 6 0.070 42.07157 57.45486 37.62418 0 0 0 + 9 1 1 0.510 42.19985 57.57789 39.12163 0 0 0 + 10 1 3 -0.510 41.88641 58.62251 39.70398 0 0 0 + 11 1 7 -0.180 41.25052 56.15304 37.41811 0 0 0 + 12 1 8 0.000 40.88511 55.94638 35.97460 0 0 0 + 13 1 8 -0.115 41.48305 54.96372 35.11223 0 0 0 + 14 1 8 -0.115 39.74003 56.60996 35.46443 0 0 0 + 15 1 8 -0.115 41.02111 54.75715 33.80764 0 0 0 + 16 1 8 -0.115 39.26180 56.39194 34.12024 0 0 0 + 17 1 8 0.110 39.92330 55.46092 33.27135 0 0 0 + 18 1 9 -0.540 39.48164 55.22919 31.91865 0 0 0 + 19 1 10 0.310 43.60633 56.61693 36.52744 0 0 0 + 20 1 4 0.090 41.49619 58.31145 37.30543 0 0 0 + 21 1 4 0.090 41.88498 55.29476 37.72657 0 0 0 + 22 1 4 0.090 40.30899 56.19690 38.00627 0 0 0 + 23 1 11 0.115 42.31528 54.36176 35.44606 0 0 0 + 24 1 11 0.115 39.26330 57.31216 36.13230 0 0 0 + 25 1 11 0.115 41.62695 54.10606 33.19490 0 0 0 + 26 1 11 0.115 38.42147 56.98236 33.78612 0 0 0 + 27 1 10 0.430 38.78233 55.86217 31.74004 0 0 0 + 28 1 5 -0.470 42.79933 56.56370 39.79000 0 0 0 + 29 1 7 -0.020 42.96709 56.75379 41.28116 0 0 0 + 30 1 1 0.510 43.83019 55.68988 41.92255 0 0 0 + 31 1 3 -0.510 44.98521 55.93104 42.21713 0 0 0 + 32 1 10 0.310 43.13466 55.75696 39.30966 0 0 0 + 33 1 4 0.090 42.04692 56.86721 41.83507 0 0 0 + 34 1 4 0.090 43.52938 57.66324 41.43329 0 0 0 + 35 1 5 -0.470 43.26792 54.43342 42.07043 0 0 0 + 36 1 7 -0.020 43.92411 53.28930 42.63327 0 0 0 + 37 1 1 0.510 43.51012 53.02289 44.10510 0 0 0 + 38 1 3 -0.510 42.35086 53.07863 44.50806 0 0 0 + 39 1 10 0.310 42.28859 54.34993 41.90323 0 0 0 + 40 1 4 0.090 44.98464 53.47473 42.54797 0 0 0 + 41 1 4 0.090 43.49715 52.54787 41.97419 0 0 0 + 42 1 5 -0.470 44.51925 52.64535 44.88133 0 0 0 + 43 1 6 0.070 44.47588 52.35054 46.24397 0 0 0 + 44 1 1 0.510 45.40218 53.34579 46.94730 0 0 0 + 45 1 3 -0.510 45.23520 54.55893 46.92038 0 0 0 + 46 1 7 -0.180 44.77960 50.82831 46.50232 0 0 0 + 47 1 8 0.000 43.72184 49.84551 45.98093 0 0 0 + 48 1 8 -0.115 44.14810 49.00477 44.97195 0 0 0 + 49 1 8 -0.115 42.43499 49.66652 46.53541 0 0 0 + 50 1 8 -0.115 43.26154 48.00434 44.46769 0 0 0 + 51 1 8 -0.115 41.54732 48.79670 45.95416 0 0 0 + 52 1 8 -0.115 41.98220 47.90746 44.95574 0 0 0 + 53 1 10 0.310 45.39510 52.50937 44.42482 0 0 0 + 54 1 4 0.090 43.51312 52.58974 46.67092 0 0 0 + 55 1 4 0.090 44.89709 50.54313 47.56965 0 0 0 + 56 1 4 0.090 45.72096 50.49337 46.01654 0 0 0 + 57 1 11 0.115 45.13573 49.07933 44.54134 0 0 0 + 58 1 11 0.115 42.07869 50.34816 47.29358 0 0 0 + 59 1 11 0.115 43.47793 47.29281 43.68456 0 0 0 + 60 1 11 0.115 40.52625 48.76134 46.30425 0 0 0 + 61 1 11 0.115 41.35446 47.13287 44.54059 0 0 0 + 62 1 5 -0.470 46.41448 52.86278 47.68291 0 0 0 + 63 1 6 0.070 47.25136 53.68184 48.51163 0 0 0 + 64 1 1 0.510 48.33905 54.40097 47.73886 0 0 0 + 65 1 3 -0.510 49.27132 53.85220 47.16549 0 0 0 + 66 1 7 -0.180 47.88329 52.75681 49.60227 0 0 0 + 67 1 7 -0.140 48.82515 53.51102 50.61578 0 0 0 + 68 1 12 -0.090 48.12492 55.00373 51.43039 0 0 0 + 69 1 2 -0.220 47.70783 54.12980 53.04072 0 0 0 + 70 1 10 0.310 46.67199 51.90088 47.73231 0 0 0 + 71 1 4 0.090 46.64593 54.43552 48.99310 0 0 0 + 72 1 4 0.090 48.41361 51.90817 49.11968 0 0 0 + 73 1 4 0.090 47.08748 52.35196 50.26341 0 0 0 + 74 1 4 0.090 49.16067 52.81305 51.41238 0 0 0 + 75 1 4 0.090 49.73705 53.67062 50.00155 0 0 0 + 76 1 4 0.090 47.18593 54.84215 53.71488 0 0 0 + 77 1 4 0.090 48.69939 53.91624 53.49408 0 0 0 + 78 1 4 0.090 47.19749 53.18294 52.76264 0 0 0 + 79 1 5 -0.470 48.34472 55.71775 47.80498 0 0 0 + 80 1 2 -0.110 49.37792 56.51754 47.29492 0 0 0 + 81 1 10 0.310 47.51777 56.11617 48.19410 0 0 0 + 82 1 4 0.090 50.41495 56.13038 47.38980 0 0 0 + 83 1 4 0.090 49.23515 57.51193 47.76940 0 0 0 + 84 1 4 0.090 49.28612 56.52094 46.18773 0 0 0 + 85 2 13 -0.834 52.28049 45.72878 41.48140 -1 0 1 + 86 2 14 0.417 51.97210 46.07066 40.64218 -1 0 1 + 87 2 14 0.417 52.43689 44.79855 41.31868 -1 0 1 + 88 3 13 -0.834 43.84472 45.66062 47.17660 -2 -1 -1 + 89 3 14 0.417 43.42120 44.88337 46.81226 -2 -1 -1 + 90 3 14 0.417 44.31099 46.04907 46.43636 -2 -1 -1 + 91 4 13 -0.834 51.27805 50.25403 54.67397 0 0 -1 + 92 4 14 0.417 50.81295 50.23728 53.83753 0 0 -1 + 93 4 14 0.417 52.00273 49.63953 54.55795 0 0 -1 + 94 5 13 -0.834 44.71976 53.72011 56.43834 -1 0 -1 + 95 5 14 0.417 44.56050 53.84218 55.50241 -1 0 -1 + 96 5 14 0.417 44.91937 52.78829 56.52828 -1 0 -1 + 97 6 13 -0.834 37.07074 62.07204 53.35752 -1 -1 -1 + 98 6 14 0.417 64.17057 61.77089 52.49043 -2 -1 -1 + 99 6 14 0.417 37.90147 62.52273 53.20573 -1 -1 -1 + 100 7 13 -0.834 38.31817 66.10834 49.17406 0 -1 0 + 101 7 14 0.417 37.39300 65.93985 48.99534 0 -1 0 + 102 7 14 0.417 38.36506 66.20528 50.12520 0 -1 0 + 103 8 13 -0.834 60.90915 45.97690 35.53863 -1 -1 1 + 104 8 14 0.417 61.19898 46.87819 35.39745 -1 -1 1 + 105 8 14 0.417 59.98680 45.97855 35.28269 -1 -1 1 + 106 9 13 -0.834 54.33913 64.47210 51.00391 -1 -2 0 + 107 9 14 0.417 54.43191 63.71377 50.42724 -1 -2 0 + 108 9 14 0.417 55.16289 64.94980 50.90662 -1 -2 0 + 109 10 13 -0.834 44.58017 54.03749 53.84708 1 0 -1 + 110 10 14 0.417 43.87040 54.43768 53.34476 1 0 -1 + 111 10 14 0.417 45.02999 53.47261 53.21873 1 0 -1 + 112 11 13 -0.834 45.48693 52.12363 34.38241 0 -1 1 + 113 11 14 0.417 45.46898 52.67450 33.59981 0 -1 1 + 114 11 14 0.417 44.61476 52.22113 34.76457 0 -1 1 + 115 12 13 -0.834 60.15770 61.68799 54.74753 1 0 -2 + 116 12 14 0.417 59.23977 61.46439 54.59378 1 0 -2 + 117 12 14 0.417 60.43785 61.08922 55.43980 1 0 -2 + 118 13 13 -0.834 60.74732 66.72156 42.80906 1 -2 0 + 119 13 14 0.417 60.34713 66.21969 42.09898 1 -2 0 + 120 13 14 0.417 60.92444 66.07344 43.49082 1 -2 0 + 121 14 13 -0.834 60.82245 64.17281 50.54212 0 0 0 + 122 14 14 0.417 61.43571 64.88448 50.35863 0 0 0 + 123 14 14 0.417 60.87804 64.04633 51.48930 0 0 0 + 124 15 13 -0.834 36.92704 63.01353 56.05215 0 -1 0 + 125 15 14 0.417 37.10744 62.17054 56.46815 0 -1 0 + 126 15 14 0.417 64.06237 62.79109 55.15157 -1 -1 0 + 127 16 13 -0.834 48.35559 58.70568 56.14001 1 0 0 + 128 16 14 0.417 48.11655 59.48087 55.63191 1 0 0 + 129 16 14 0.417 47.93212 58.83502 56.98865 1 0 0 + 130 17 13 -0.834 58.14651 57.18542 51.08241 0 -1 -1 + 131 17 14 0.417 57.88523 56.72609 51.88052 0 -1 -1 + 132 17 14 0.417 57.35121 57.63116 50.79076 0 -1 -1 + 133 18 13 -0.834 58.09837 59.68005 36.16995 -1 0 0 + 134 18 14 0.417 58.25901 58.76822 36.41283 -1 0 0 + 135 18 14 0.417 58.56239 60.19049 36.83355 -1 0 0 + 136 19 13 -0.834 52.29019 60.51169 50.55611 0 -2 1 + 137 19 14 0.417 52.61972 60.01708 51.30645 0 -2 1 + 138 19 14 0.417 52.55621 59.99722 49.79401 0 -2 1 + 139 20 13 -0.834 41.36642 50.33705 42.98530 0 -1 -1 + 140 20 14 0.417 41.27846 50.09969 43.90844 0 -1 -1 + 141 20 14 0.417 40.99321 51.21659 42.92708 0 -1 -1 + 142 21 13 -0.834 53.76920 67.02645 32.18667 -1 0 1 + 143 21 14 0.417 53.59447 67.18509 31.25901 -1 0 1 + 144 21 14 0.417 54.65308 67.36647 32.32596 -1 0 1 + 145 22 13 -0.834 57.83691 45.33663 46.94671 0 0 -2 + 146 22 14 0.417 57.36287 45.59552 46.15647 0 0 -2 + 147 22 14 0.417 58.62995 44.91017 46.62197 0 0 -2 + 148 23 13 -0.834 60.34518 45.83000 45.57964 -1 0 0 + 149 23 14 0.417 60.61871 44.93757 45.79176 -1 0 0 + 150 23 14 0.417 61.09971 46.21212 45.13141 -1 0 0 + 151 24 13 -0.834 55.97902 46.85046 56.80163 0 1 1 + 152 24 14 0.417 56.57528 46.69952 30.16370 0 1 2 + 153 24 14 0.417 55.81156 47.79276 56.81850 0 1 1 + 154 25 13 -0.834 57.54668 45.52135 31.46139 -1 0 1 + 155 25 14 0.417 58.36291 46.00311 31.32743 -1 0 1 + 156 25 14 0.417 57.54151 45.31312 32.39566 -1 0 1 + 157 26 13 -0.834 58.03029 52.86783 46.33564 -1 -1 0 + 158 26 14 0.417 58.13662 52.56730 47.23820 -1 -1 0 + 159 26 14 0.417 58.81317 52.55269 45.88396 -1 -1 0 + 160 27 13 -0.834 62.89253 60.86549 46.75131 -2 -1 0 + 161 27 14 0.417 63.83924 60.74010 46.81653 -2 -1 0 + 162 27 14 0.417 62.51896 60.12788 47.23361 -2 -1 0 + 163 28 13 -0.834 43.29171 48.58106 31.82206 -1 0 2 + 164 28 14 0.417 43.07532 49.46362 32.12290 -1 0 2 + 165 28 14 0.417 43.82286 48.21072 32.52701 -1 0 2 + 166 29 13 -0.834 64.19867 44.17673 45.81391 -1 1 -1 + 167 29 14 0.417 63.72986 44.44010 45.02202 -1 1 -1 + 168 29 14 0.417 37.02069 43.24876 45.68087 0 1 -1 + 169 30 13 -0.834 50.42749 42.01163 53.60484 0 2 0 + 170 30 14 0.417 51.03177 41.90084 52.87081 0 2 0 + 171 30 14 0.417 50.77279 42.76181 54.08882 0 2 0 + 172 31 13 -0.834 38.63739 61.71113 49.95150 1 0 0 + 173 31 14 0.417 38.55432 62.15607 49.10808 1 0 0 + 174 31 14 0.417 37.81718 61.22751 50.04950 1 0 0 + 175 32 13 -0.834 61.47262 53.02922 33.08309 -1 -1 0 + 176 32 14 0.417 61.21894 52.67931 33.93717 -1 -1 0 + 177 32 14 0.417 61.89351 53.86564 33.28182 -1 -1 0 + 178 33 13 -0.834 54.44545 60.06011 48.63522 -1 0 1 + 179 33 14 0.417 54.80032 60.94424 48.72810 -1 0 1 + 180 33 14 0.417 54.09041 60.03614 47.74662 -1 0 1 + 181 34 13 -0.834 56.34364 60.90201 52.60838 -1 -1 0 + 182 34 14 0.417 56.48857 60.19161 53.23333 -1 -1 0 + 183 34 14 0.417 56.17362 61.67024 53.15351 -1 -1 0 + 184 35 13 -0.834 56.05881 51.84328 55.76103 -1 0 0 + 185 35 14 0.417 55.59060 51.75146 54.93121 -1 0 0 + 186 35 14 0.417 55.46974 52.35732 56.31335 -1 0 0 + 187 36 13 -0.834 39.00621 42.74743 30.97845 0 0 1 + 188 36 14 0.417 39.67620 42.11390 30.72152 0 0 1 + 189 36 14 0.417 39.43456 43.29673 31.63499 0 0 1 + 190 37 13 -0.834 46.77585 55.39774 30.24026 0 1 0 + 191 37 14 0.417 46.10274 54.90237 29.77360 0 1 0 + 192 37 14 0.417 46.39626 56.26890 30.35527 0 1 0 + 193 38 13 -0.834 45.10722 57.60431 31.54688 -1 0 0 + 194 38 14 0.417 44.80783 58.50032 31.70105 -1 0 0 + 195 38 14 0.417 44.44237 57.22463 30.97238 -1 0 0 + 196 39 13 -0.834 43.94230 46.99244 34.45668 -2 1 1 + 197 39 14 0.417 44.62010 46.49140 34.00306 -2 1 1 + 198 39 14 0.417 44.38150 47.79794 34.72964 -2 1 1 + 199 40 13 -0.834 51.39443 50.96507 34.69072 -1 1 0 + 200 40 14 0.417 51.18729 50.42829 35.45570 -1 1 0 + 201 40 14 0.417 51.33198 51.86665 35.00616 -1 1 0 + 202 41 13 -0.834 58.96398 48.19727 42.98856 -2 1 0 + 203 41 14 0.417 58.42587 48.90112 42.62618 -2 1 0 + 204 41 14 0.417 58.82383 48.25054 43.93397 -2 1 0 + 205 42 13 -0.834 62.89335 41.94260 37.40820 0 0 0 + 206 42 14 0.417 62.48690 41.07818 37.46980 0 0 0 + 207 42 14 0.417 63.01802 42.08284 36.46957 0 0 0 + 208 43 13 -0.834 54.19388 47.88689 36.24110 -1 0 1 + 209 43 14 0.417 54.32054 48.63090 35.65235 -1 0 1 + 210 43 14 0.417 53.24370 47.78935 36.30358 -1 0 1 + 211 44 13 -0.834 39.19734 57.40342 41.28495 0 0 -2 + 212 44 14 0.417 39.05428 57.72940 40.39641 0 0 -2 + 213 44 14 0.417 39.30846 56.45861 41.17895 0 0 -2 + 214 45 13 -0.834 52.85483 61.73749 54.63897 0 0 0 + 215 45 14 0.417 53.34938 62.52765 54.42147 0 0 0 + 216 45 14 0.417 53.01046 61.14656 53.90221 0 0 0 + 217 46 13 -0.834 47.09467 62.01384 35.02302 1 0 1 + 218 46 14 0.417 47.54527 61.47644 35.67448 1 0 1 + 219 46 14 0.417 47.10116 62.89626 35.39385 1 0 1 + 220 47 13 -0.834 46.80497 49.60334 37.05700 0 0 1 + 221 47 14 0.417 46.70216 49.79770 36.12540 0 0 1 + 222 47 14 0.417 45.91311 49.45393 37.37084 0 0 1 + 223 48 13 -0.834 63.21969 59.12311 54.43455 -1 -1 -1 + 224 48 14 0.417 63.94585 59.72833 54.28405 -1 -1 -1 + 225 48 14 0.417 63.63016 58.34481 54.81141 -1 -1 -1 + 226 49 13 -0.834 59.88416 59.64215 44.04914 -2 1 0 + 227 49 14 0.417 59.74255 59.14412 44.85422 -2 1 0 + 228 49 14 0.417 59.02635 60.01323 43.84248 -2 1 0 + 229 50 13 -0.834 40.50825 42.85328 50.81112 -1 1 0 + 230 50 14 0.417 40.34650 43.39801 51.58141 -1 1 0 + 231 50 14 0.417 39.63964 42.69867 50.43985 -1 1 0 + 232 51 13 -0.834 63.77522 64.97067 44.83010 -2 0 0 + 233 51 14 0.417 37.00507 65.56132 45.28388 -1 0 0 + 234 51 14 0.417 64.14243 64.88383 43.95041 -2 0 0 + 235 52 13 -0.834 62.47161 67.86189 47.38235 -1 0 -1 + 236 52 14 0.417 61.58819 67.64608 47.08360 -1 0 -1 + 237 52 14 0.417 62.79136 67.05596 47.78790 -1 0 -1 + 238 53 13 -0.834 43.90800 54.16107 50.35199 0 0 0 + 239 53 14 0.417 43.96769 53.24711 50.07388 0 0 0 + 240 53 14 0.417 43.72593 54.64554 49.54677 0 0 0 + 241 54 13 -0.834 63.46829 44.63390 34.73615 -1 1 1 + 242 54 14 0.417 62.63731 45.04623 34.97217 -1 1 1 + 243 54 14 0.417 64.11050 45.03645 35.32075 -1 1 1 + 244 55 13 -0.834 37.30679 58.22047 51.04345 0 0 0 + 245 55 14 0.417 38.18596 58.37862 50.69950 0 0 0 + 246 55 14 0.417 36.85723 59.06017 50.94824 0 0 0 + 247 56 13 -0.834 58.72649 42.45768 31.23820 -1 1 -1 + 248 56 14 0.417 59.43634 42.77561 30.68028 -1 1 -1 + 249 56 14 0.417 58.76581 41.50474 31.15690 -1 1 -1 + 250 57 13 -0.834 52.47101 42.85691 41.60986 0 1 -1 + 251 57 14 0.417 51.62289 42.91562 41.16997 0 1 -1 + 252 57 14 0.417 52.53109 41.94497 41.89448 0 1 -1 + 253 58 13 -0.834 60.63476 59.78356 56.53663 -2 -1 -1 + 254 58 14 0.417 60.87428 58.86269 56.43247 -2 -1 -1 + 255 58 14 0.417 59.72615 59.76269 56.83705 -2 -1 -1 + 256 59 13 -0.834 52.78127 57.47386 30.66786 -1 -1 0 + 257 59 14 0.417 52.55495 58.26092 30.17228 -1 -1 0 + 258 59 14 0.417 53.05203 56.84104 30.00267 -1 -1 0 + 259 60 13 -0.834 46.04848 57.65321 54.89998 0 3 -1 + 260 60 14 0.417 46.96883 57.71336 55.15607 0 3 -1 + 261 60 14 0.417 46.02768 57.98076 54.00081 0 3 -1 + 262 61 13 -0.834 60.39356 51.43705 35.66109 -1 1 -1 + 263 61 14 0.417 60.57739 52.08235 36.34376 -1 1 -1 + 264 61 14 0.417 59.59475 50.99860 35.95414 -1 1 -1 + 265 62 13 -0.834 50.32338 62.46972 35.65752 -1 0 2 + 266 62 14 0.417 51.24156 62.23287 35.52678 -1 0 2 + 267 62 14 0.417 49.89601 61.64851 35.90085 -1 0 2 + 268 63 13 -0.834 38.23983 45.11908 50.02773 0 1 0 + 269 63 14 0.417 38.61336 45.27494 50.89515 0 1 0 + 270 63 14 0.417 38.91224 45.42406 49.41856 0 1 0 + 271 64 13 -0.834 58.93720 57.36605 46.08362 -3 0 0 + 272 64 14 0.417 58.65753 56.63297 46.63190 -3 0 0 + 273 64 14 0.417 58.29914 58.05674 46.26268 -3 0 0 + 274 65 13 -0.834 47.99806 43.44789 47.43046 -1 0 0 + 275 65 14 0.417 48.39580 43.78289 46.62684 -1 0 0 + 276 65 14 0.417 47.85848 44.22523 47.97128 -1 0 0 + 277 66 13 -0.834 51.26744 52.05593 47.09995 -1 0 0 + 278 66 14 0.417 51.36736 52.09873 46.14894 -1 0 0 + 279 66 14 0.417 50.33779 52.22629 47.25149 -1 0 0 + 280 67 13 -0.834 39.06132 52.11517 46.39010 0 0 -1 + 281 67 14 0.417 38.53402 51.36282 46.65876 0 0 -1 + 282 67 14 0.417 39.47133 52.42190 47.19884 0 0 -1 + 283 68 13 -0.834 60.17907 58.95174 50.22759 -1 1 0 + 284 68 14 0.417 60.34080 59.56538 50.94420 -1 1 0 + 285 68 14 0.417 59.41497 58.44908 50.50992 -1 1 0 + 286 69 13 -0.834 40.47698 59.65154 34.92537 0 -1 1 + 287 69 14 0.417 40.89044 60.49055 35.12877 0 -1 1 + 288 69 14 0.417 41.17964 59.12336 34.54648 0 -1 1 + 289 70 13 -0.834 60.12998 66.51474 47.03971 -1 0 -1 + 290 70 14 0.417 59.26620 66.39701 47.43506 -1 0 -1 + 291 70 14 0.417 60.21358 65.78625 46.42443 -1 0 -1 + 292 71 13 -0.834 49.25986 47.27506 43.03372 -1 0 1 + 293 71 14 0.417 49.11810 48.15331 42.68041 -1 0 1 + 294 71 14 0.417 49.86162 47.40550 43.76662 -1 0 1 + 295 72 13 -0.834 41.48105 63.65699 31.84433 0 0 1 + 296 72 14 0.417 41.11022 64.48589 32.14713 0 0 1 + 297 72 14 0.417 40.89461 63.37379 31.14281 0 0 1 + 298 73 13 -0.834 47.82875 47.97039 54.56720 0 2 0 + 299 73 14 0.417 46.99167 47.50633 54.55352 0 2 0 + 300 73 14 0.417 47.60488 48.87558 54.35102 0 2 0 + 301 74 13 -0.834 62.36735 58.64445 48.35778 -2 1 0 + 302 74 14 0.417 62.88767 57.90867 48.68045 -2 1 0 + 303 74 14 0.417 61.65918 58.73544 48.99531 -2 1 0 + 304 75 13 -0.834 52.09508 65.08907 32.87560 0 0 0 + 305 75 14 0.417 52.67402 65.75058 32.49683 0 0 0 + 306 75 14 0.417 52.41855 64.97003 33.76859 0 0 0 + 307 76 13 -0.834 39.06932 41.62988 40.69498 1 1 0 + 308 76 14 0.417 39.51114 41.04433 40.08003 1 1 0 + 309 76 14 0.417 38.93584 42.43936 40.20186 1 1 0 + 310 77 13 -0.834 37.68325 49.50718 46.00750 0 2 0 + 311 77 14 0.417 64.11601 49.67107 45.91568 -1 2 0 + 312 77 14 0.417 37.90845 48.96991 45.24796 0 2 0 + 313 78 13 -0.834 53.00757 59.49351 52.98404 -2 1 -1 + 314 78 14 0.417 52.16721 59.28329 53.39127 -2 1 -1 + 315 78 14 0.417 53.61000 58.83023 53.32076 -2 1 -1 + 316 79 13 -0.834 51.89369 64.75001 56.68467 1 0 0 + 317 79 14 0.417 51.88079 65.63682 56.32462 1 0 0 + 318 79 14 0.417 52.40589 64.82531 30.11841 1 0 1 + 319 80 13 -0.834 48.43261 63.10155 32.63566 0 0 1 + 320 80 14 0.417 47.68021 63.01753 32.04993 0 0 1 + 321 80 14 0.417 48.13916 62.71424 33.46035 0 0 1 + 322 81 13 -0.834 62.41171 68.18251 30.67168 0 -1 2 + 323 81 14 0.417 61.79235 41.16145 30.03143 0 0 2 + 324 81 14 0.417 63.18314 67.94790 30.15584 0 -1 2 + 325 82 13 -0.834 42.57575 41.32197 37.66791 0 0 1 + 326 82 14 0.417 42.98116 41.36016 36.80164 0 0 1 + 327 82 14 0.417 42.32522 42.22654 37.85569 0 0 1 + 328 83 13 -0.834 50.17315 67.44398 36.91606 0 -2 0 + 329 83 14 0.417 50.08765 67.03449 37.77701 0 -2 0 + 330 83 14 0.417 50.35347 66.71621 36.32101 0 -2 0 + 331 84 13 -0.834 39.70163 60.45247 40.03790 0 -2 -1 + 332 84 14 0.417 38.85282 60.01540 40.10676 0 -2 -1 + 333 84 14 0.417 40.20579 60.11563 40.77858 0 -2 -1 + 334 85 13 -0.834 51.74323 42.80814 51.33239 0 0 -1 + 335 85 14 0.417 52.44810 43.22892 51.82466 0 0 -1 + 336 85 14 0.417 51.80961 43.17998 50.45286 0 0 -1 + 337 86 13 -0.834 51.34695 47.68316 36.38089 0 0 1 + 338 86 14 0.417 50.77701 46.92707 36.52138 0 0 1 + 339 86 14 0.417 51.27109 47.87031 35.44523 0 0 1 + 340 87 13 -0.834 62.66950 50.66085 43.15883 -2 0 0 + 341 87 14 0.417 63.57796 50.36318 43.11051 -2 0 0 + 342 87 14 0.417 62.24654 50.26548 42.39659 -2 0 0 + 343 88 13 -0.834 46.37996 60.13914 31.06428 -2 -1 1 + 344 88 14 0.417 46.89125 59.89673 31.83632 -2 -1 1 + 345 88 14 0.417 45.51811 60.37092 31.41028 -2 -1 1 + 346 89 13 -0.834 50.23251 41.17559 46.18435 0 1 2 + 347 89 14 0.417 49.40509 68.16142 45.89628 0 0 2 + 348 89 14 0.417 50.55747 67.94506 46.85395 0 0 2 + 349 90 13 -0.834 56.10446 66.70018 42.60390 0 -2 1 + 350 90 14 0.417 56.27454 67.42915 42.00732 0 -2 1 + 351 90 14 0.417 56.27819 67.05729 43.47483 0 -2 1 + 352 91 13 -0.834 55.53824 48.43866 51.97225 -1 0 1 + 353 91 14 0.417 56.26440 48.96682 52.30388 -1 0 1 + 354 91 14 0.417 55.26306 48.88494 51.17140 -1 0 1 + 355 92 13 -0.834 37.88016 52.62502 33.55552 0 -1 0 + 356 92 14 0.417 37.58757 51.72397 33.41859 0 -1 0 + 357 92 14 0.417 38.51960 52.77804 32.85986 0 -1 0 + 358 93 13 -0.834 50.40592 66.14455 39.40035 -1 -2 -1 + 359 93 14 0.417 49.74974 66.37168 40.05920 -1 -2 -1 + 360 93 14 0.417 50.22642 65.22843 39.18876 -1 -2 -1 + 361 94 13 -0.834 59.56315 43.63477 50.02876 -1 0 0 + 362 94 14 0.417 60.08533 44.36640 50.35782 -1 0 0 + 363 94 14 0.417 60.10101 42.86112 50.19730 -1 0 0 + 364 95 13 -0.834 57.16125 61.75981 55.17964 0 0 -1 + 365 95 14 0.417 56.45534 61.68609 55.82189 0 0 -1 + 366 95 14 0.417 57.38335 62.69087 55.17297 0 0 -1 + 367 96 13 -0.834 54.81274 43.48714 43.13392 -1 2 1 + 368 96 14 0.417 53.88771 43.40698 42.90124 -1 2 1 + 369 96 14 0.417 54.97915 42.74512 43.71525 -1 2 1 + 370 97 13 -0.834 41.23040 49.49766 49.75568 0 -2 0 + 371 97 14 0.417 40.54278 49.43865 49.09241 0 -2 0 + 372 97 14 0.417 41.81904 48.76959 49.55653 0 -2 0 + 373 98 13 -0.834 54.20957 45.39084 54.97428 -1 0 0 + 374 98 14 0.417 54.66721 46.06623 55.47493 -1 0 0 + 375 98 14 0.417 53.74016 44.87996 55.63374 -1 0 0 + 376 99 13 -0.834 61.27515 64.38553 39.98716 -1 0 1 + 377 99 14 0.417 61.56153 64.23410 40.88787 -1 0 1 + 378 99 14 0.417 60.44736 63.91029 39.91542 -1 0 1 + 379 100 13 -0.834 55.67284 58.14856 42.21767 -1 1 2 + 380 100 14 0.417 55.46369 57.24253 42.44485 -1 1 2 + 381 100 14 0.417 56.62771 58.19397 42.26677 -1 1 2 + 382 101 13 -0.834 43.66528 51.07118 53.71174 0 0 0 + 383 101 14 0.417 42.87715 50.89079 53.19934 0 0 0 + 384 101 14 0.417 43.37793 51.68815 54.38481 0 0 0 + 385 102 13 -0.834 39.90899 44.53973 36.42818 0 2 0 + 386 102 14 0.417 39.84006 43.65427 36.07118 0 2 0 + 387 102 14 0.417 40.52179 44.98683 35.84438 0 2 0 + 388 103 13 -0.834 51.24695 66.96031 48.71611 -1 -1 1 + 389 103 14 0.417 50.88275 67.26607 49.54684 -1 -1 1 + 390 103 14 0.417 52.19366 66.95318 48.85726 -1 -1 1 + 391 104 13 -0.834 55.15911 56.17347 57.08906 -1 0 0 + 392 104 14 0.417 55.86241 55.65189 56.70232 -1 0 0 + 393 104 14 0.417 54.93977 55.71619 30.52949 -1 0 1 + 394 105 13 -0.834 37.33282 54.30424 56.96734 0 0 0 + 395 105 14 0.417 64.15558 54.97773 29.99806 -1 0 1 + 396 105 14 0.417 64.13467 53.88397 56.32293 -1 0 0 + 397 106 13 -0.834 53.07827 51.20543 32.31512 -1 0 1 + 398 106 14 0.417 52.39494 50.78813 31.79057 -1 0 1 + 399 106 14 0.417 52.65819 51.38698 33.15584 -1 0 1 + 400 107 13 -0.834 43.06086 51.65229 35.75926 1 1 1 + 401 107 14 0.417 42.70958 52.01746 36.57135 1 1 1 + 402 107 14 0.417 43.42908 50.80682 36.01586 1 1 1 + 403 108 13 -0.834 53.92253 56.24460 34.48089 0 0 1 + 404 108 14 0.417 53.22007 56.39276 35.11401 0 0 1 + 405 108 14 0.417 54.59075 55.76600 34.97147 0 0 1 + 406 109 13 -0.834 61.71524 66.84153 38.60005 -1 -1 0 + 407 109 14 0.417 61.25397 66.04877 38.87388 -1 -1 0 + 408 109 14 0.417 62.23260 67.09437 39.36467 -1 -1 0 + 409 110 13 -0.834 43.52824 62.78695 41.49939 0 -1 -1 + 410 110 14 0.417 43.61050 61.97218 41.00379 0 -1 -1 + 411 110 14 0.417 43.53140 63.47437 40.83330 0 -1 -1 + 412 111 13 -0.834 51.13822 55.54090 53.50461 0 1 -2 + 413 111 14 0.417 50.69587 56.38179 53.62064 0 1 -2 + 414 111 14 0.417 51.43262 55.54828 52.59383 0 1 -2 + 415 112 13 -0.834 46.94709 50.11761 31.92599 0 0 0 + 416 112 14 0.417 47.19652 51.02564 31.75423 0 0 0 + 417 112 14 0.417 46.57462 49.81059 31.09941 0 0 0 + 418 113 13 -0.834 47.96666 45.13049 44.46108 -1 2 -1 + 419 113 14 0.417 47.01871 45.24108 44.53489 -1 2 -1 + 420 113 14 0.417 48.26343 45.91034 43.99202 -1 2 -1 + 421 114 13 -0.834 44.43868 43.44849 32.90814 -1 -1 1 + 422 114 14 0.417 43.86055 43.24165 33.64245 -1 -1 1 + 423 114 14 0.417 45.31670 43.24154 33.22828 -1 -1 1 + 424 115 13 -0.834 61.07172 47.80130 53.14504 -1 1 -1 + 425 115 14 0.417 61.34864 48.71600 53.19864 -1 1 -1 + 426 115 14 0.417 60.72118 47.60538 54.01394 -1 1 -1 + 427 116 13 -0.834 51.38727 44.10864 54.92855 -1 0 -1 + 428 116 14 0.417 50.77962 44.80360 55.18160 -1 0 -1 + 429 116 14 0.417 52.05111 44.10744 55.61815 -1 0 -1 + 430 117 13 -0.834 41.05585 60.12319 49.44785 1 -1 0 + 431 117 14 0.417 41.72702 60.76812 49.67116 1 -1 0 + 432 117 14 0.417 40.24373 60.62784 49.40265 1 -1 0 + 433 118 13 -0.834 50.88548 68.33364 33.37284 -1 0 -1 + 434 118 14 0.417 50.48275 67.46671 33.32310 -1 0 -1 + 435 118 14 0.417 51.82702 68.16119 33.37343 -1 0 -1 + 436 119 13 -0.834 38.79644 59.29061 55.22446 1 1 -1 + 437 119 14 0.417 38.82887 59.83550 56.01077 1 1 -1 + 438 119 14 0.417 39.26097 59.79985 54.56028 1 1 -1 + 439 120 13 -0.834 56.31813 41.68729 51.11871 -2 0 -1 + 440 120 14 0.417 55.45155 41.35580 51.35412 -2 0 -1 + 441 120 14 0.417 56.14879 42.34135 50.44062 -2 0 -1 + 442 121 13 -0.834 45.53697 59.28154 47.22033 -1 0 -1 + 443 121 14 0.417 45.45062 59.55577 46.30733 -1 0 -1 + 444 121 14 0.417 46.00774 59.99977 47.64313 -1 0 -1 + 445 122 13 -0.834 60.47636 43.28130 46.20944 -1 0 -1 + 446 122 14 0.417 60.97762 42.59184 45.77396 -1 0 -1 + 447 122 14 0.417 59.72992 42.82584 46.59884 -1 0 -1 + 448 123 13 -0.834 58.49080 48.18289 45.77215 0 0 -1 + 449 123 14 0.417 58.74342 47.25991 45.74879 0 0 -1 + 450 123 14 0.417 58.17926 48.32386 46.66621 0 0 -1 + 451 124 13 -0.834 50.93473 56.12663 41.58575 -1 0 0 + 452 124 14 0.417 50.36171 56.05214 42.34885 -1 0 0 + 453 124 14 0.417 50.40135 56.57242 40.92771 -1 0 0 + 454 125 13 -0.834 60.55008 41.95542 56.22749 -1 0 -1 + 455 125 14 0.417 59.65163 41.78987 55.94175 -1 0 -1 + 456 125 14 0.417 61.09463 41.59967 55.52524 -1 0 -1 + 457 126 13 -0.834 58.58373 51.69338 48.78985 -1 1 0 + 458 126 14 0.417 58.38773 52.01803 49.66874 -1 1 0 + 459 126 14 0.417 58.66973 50.74614 48.89756 -1 1 0 + 460 127 13 -0.834 37.82769 45.69808 30.85100 0 1 3 + 461 127 14 0.417 38.37007 45.10637 31.37248 0 1 3 + 462 127 14 0.417 37.14646 45.99401 31.45481 0 1 3 + 463 128 13 -0.834 50.96455 60.06361 33.68049 0 0 0 + 464 128 14 0.417 51.72055 60.15430 34.26055 0 0 0 + 465 128 14 0.417 51.05673 60.77997 33.05234 0 0 0 + 466 129 13 -0.834 46.43413 68.11245 51.48833 -1 0 -1 + 467 129 14 0.417 46.82151 41.36005 50.86943 -1 1 -1 + 468 129 14 0.417 47.09847 67.43153 51.59433 -1 0 -1 + 469 130 13 -0.834 61.79997 47.41648 57.05141 -1 -1 0 + 470 130 14 0.417 62.68713 47.23872 56.73898 -1 -1 0 + 471 130 14 0.417 61.48917 46.57417 30.01195 -1 -1 1 + 472 131 13 -0.834 45.30689 46.58119 54.43763 0 1 -1 + 473 131 14 0.417 45.67282 45.73922 54.70859 0 1 -1 + 474 131 14 0.417 44.46622 46.35973 54.03705 0 1 -1 + 475 132 13 -0.834 62.60829 48.56385 49.02640 -1 1 0 + 476 132 14 0.417 62.44761 48.65968 48.08766 -1 1 0 + 477 132 14 0.417 62.98242 47.68753 49.11762 -1 1 0 + 478 133 13 -0.834 63.49107 56.77075 38.74961 -1 0 2 + 479 133 14 0.417 63.12281 56.39554 39.54952 -1 0 2 + 480 133 14 0.417 62.84612 57.42058 38.47033 -1 0 2 + 481 134 13 -0.834 50.74846 48.34849 33.46075 0 0 1 + 482 134 14 0.417 50.75342 49.30521 33.43086 0 0 1 + 483 134 14 0.417 50.91203 48.07929 32.55686 0 0 1 + 484 135 13 -0.834 44.40923 67.37148 56.42156 0 0 0 + 485 135 14 0.417 43.93400 67.78902 29.76856 0 0 1 + 486 135 14 0.417 44.94884 66.70468 56.84633 0 0 0 + 487 136 13 -0.834 44.25343 64.95349 43.22104 0 0 0 + 488 136 14 0.417 44.13229 64.08173 42.84472 0 0 0 + 489 136 14 0.417 44.01188 65.55470 42.51643 0 0 0 + 490 137 13 -0.834 46.68300 67.52863 32.69859 -1 -1 0 + 491 137 14 0.417 46.68369 68.22637 33.35389 -1 -1 0 + 492 137 14 0.417 47.60248 67.43099 32.45106 -1 -1 0 + 493 138 13 -0.834 57.25376 61.01737 33.86507 -2 1 1 + 494 138 14 0.417 57.40827 60.52366 34.67043 -2 1 1 + 495 138 14 0.417 57.35792 60.37307 33.16488 -2 1 1 + 496 139 13 -0.834 57.39946 54.16835 56.70699 0 -1 -1 + 497 139 14 0.417 57.31939 53.23092 56.53080 0 -1 -1 + 498 139 14 0.417 57.32300 54.24112 30.28699 0 -1 0 + 499 140 13 -0.834 52.36697 48.69246 41.49227 -1 1 0 + 500 140 14 0.417 51.78735 47.93629 41.40021 -1 1 0 + 501 140 14 0.417 53.21603 48.31702 41.72547 -1 1 0 + 502 141 13 -0.834 54.69200 49.57915 45.55048 0 0 -1 + 503 141 14 0.417 54.95958 48.66911 45.42211 0 0 -1 + 504 141 14 0.417 55.28513 50.08439 44.99446 0 0 -1 + 505 142 13 -0.834 37.26724 53.17896 42.50469 1 -1 -1 + 506 142 14 0.417 63.93194 53.34801 43.12782 0 -1 -1 + 507 142 14 0.417 36.94831 52.45044 41.97199 1 -1 -1 + 508 143 13 -0.834 42.56283 66.92379 33.49577 -1 0 1 + 509 143 14 0.417 41.71356 66.58931 33.20750 -1 0 1 + 510 143 14 0.417 43.03645 66.14842 33.79697 -1 0 1 + 511 144 13 -0.834 61.43331 45.62855 38.97695 0 1 1 + 512 144 14 0.417 61.20190 45.98514 39.83458 0 1 1 + 513 144 14 0.417 62.31351 45.96414 38.80708 0 1 1 + 514 145 13 -0.834 49.37935 56.26031 56.72879 1 1 0 + 515 145 14 0.417 49.03977 57.11146 56.45221 1 1 0 + 516 145 14 0.417 48.60052 55.75658 56.96530 1 1 0 + 517 146 13 -0.834 63.13959 56.23999 49.92079 -1 0 -1 + 518 146 14 0.417 63.72474 55.58123 50.29478 -1 0 -1 + 519 146 14 0.417 63.40966 57.06154 50.33112 -1 0 -1 + 520 147 13 -0.834 58.55937 66.56287 54.17345 -1 0 0 + 521 147 14 0.417 59.28260 66.81524 53.59945 -1 0 0 + 522 147 14 0.417 58.28559 67.38088 54.58834 -1 0 0 + 523 148 13 -0.834 55.49901 62.14366 46.01274 -1 0 -1 + 524 148 14 0.417 55.08057 61.57956 45.36238 -1 0 -1 + 525 148 14 0.417 55.53371 63.00495 45.59652 -1 0 -1 + 526 149 13 -0.834 48.09589 47.38106 38.97384 0 1 0 + 527 149 14 0.417 47.94178 48.02346 38.28116 0 1 0 + 528 149 14 0.417 47.26125 47.32494 39.43910 0 1 0 + 529 150 13 -0.834 40.27661 53.03711 48.83757 0 0 0 + 530 150 14 0.417 40.32476 53.91333 49.21992 0 0 0 + 531 150 14 0.417 41.18363 52.81848 48.62365 0 0 0 + 532 151 13 -0.834 36.85277 41.68065 44.81488 1 2 0 + 533 151 14 0.417 36.95709 68.34807 45.45504 1 1 0 + 534 151 14 0.417 37.14062 41.29651 43.98673 1 2 0 + 535 152 13 -0.834 37.74881 65.81650 33.58759 -1 0 1 + 536 152 14 0.417 37.69052 65.99217 34.52673 -1 0 1 + 537 152 14 0.417 37.02193 65.21970 33.40951 -1 0 1 + 538 153 13 -0.834 63.01838 46.13766 43.99274 -2 0 0 + 539 153 14 0.417 62.72780 46.33504 43.10232 -2 0 0 + 540 153 14 0.417 63.75125 46.73459 44.14387 -2 0 0 + 541 154 13 -0.834 43.83288 53.92104 38.64974 0 2 1 + 542 154 14 0.417 44.46072 53.30394 39.02556 0 2 1 + 543 154 14 0.417 44.17373 54.10726 37.77488 0 2 1 + 544 155 13 -0.834 54.48021 41.30441 45.39416 1 1 -2 + 545 155 14 0.417 54.42996 67.86451 44.88861 1 0 -2 + 546 155 14 0.417 54.84291 41.03852 46.23914 1 1 -2 + 547 156 13 -0.834 51.26407 63.10699 50.73012 0 0 -2 + 548 156 14 0.417 51.64016 62.23294 50.83411 0 0 -2 + 549 156 14 0.417 51.56733 63.39797 49.87011 0 0 -2 + 550 157 13 -0.834 54.61161 63.67709 53.56970 0 1 1 + 551 157 14 0.417 55.55339 63.81655 53.47054 0 1 1 + 552 157 14 0.417 54.24805 63.87070 52.70565 0 1 1 + 553 158 13 -0.834 46.57444 42.69363 30.13287 -1 0 1 + 554 158 14 0.417 45.93025 42.28051 30.70783 -1 0 1 + 555 158 14 0.417 47.27305 42.04459 30.04973 -1 0 1 + 556 159 13 -0.834 37.92811 50.36816 42.31352 1 1 0 + 557 159 14 0.417 38.62401 50.90050 42.69899 1 1 0 + 558 159 14 0.417 38.11553 50.37135 41.37484 1 1 0 + 559 160 13 -0.834 40.53318 48.69302 33.52502 -1 0 0 + 560 160 14 0.417 40.10720 48.55075 32.67972 -1 0 0 + 561 160 14 0.417 41.22323 49.33057 33.34173 -1 0 0 + 562 161 13 -0.834 58.20095 45.48345 42.83426 1 0 -1 + 563 161 14 0.417 58.76156 46.25356 42.92849 1 0 -1 + 564 161 14 0.417 58.80813 44.74348 42.83158 1 0 -1 + 565 162 13 -0.834 59.85909 67.06752 31.43173 -1 1 0 + 566 162 14 0.417 59.95062 66.12180 31.54782 -1 1 0 + 567 162 14 0.417 60.75672 67.38534 31.33437 -1 1 0 + 568 163 13 -0.834 48.48808 51.17807 55.92072 -2 0 0 + 569 163 14 0.417 49.24951 51.62602 55.55219 -2 0 0 + 570 163 14 0.417 48.81105 50.30745 56.15303 -2 0 0 + 571 164 13 -0.834 47.51169 45.69616 48.99410 0 0 -1 + 572 164 14 0.417 48.36822 46.03425 48.73281 0 0 -1 + 573 164 14 0.417 47.56201 45.62598 49.94740 0 0 -1 + 574 165 13 -0.834 51.10678 64.23082 47.99167 0 -2 -1 + 575 165 14 0.417 51.33188 65.16116 47.98611 0 -2 -1 + 576 165 14 0.417 50.15837 64.21415 48.12002 0 -2 -1 + 577 166 13 -0.834 42.97263 56.29674 30.18230 0 0 0 + 578 166 14 0.417 42.45756 55.50818 30.01170 0 0 0 + 579 166 14 0.417 42.79675 56.86516 56.80386 0 0 -1 + 580 167 13 -0.834 44.45917 53.64338 31.85015 -1 0 0 + 581 167 14 0.417 44.64093 54.17218 31.07325 -1 0 0 + 582 167 14 0.417 43.66299 53.15965 31.63030 -1 0 0 + 583 168 13 -0.834 52.20677 49.92062 48.65330 1 0 0 + 584 168 14 0.417 52.24176 50.63538 49.28902 1 0 0 + 585 168 14 0.417 52.01918 50.35058 47.81890 1 0 0 + 586 169 13 -0.834 45.94013 51.43638 56.49888 0 0 0 + 587 169 14 0.417 46.89200 51.34153 56.53372 0 0 0 + 588 169 14 0.417 45.60504 50.66051 56.94833 0 0 0 + 589 170 13 -0.834 45.61845 41.38709 48.05698 1 0 0 + 590 170 14 0.417 46.42604 41.83441 47.80406 1 0 0 + 591 170 14 0.417 45.31743 41.85685 48.83477 1 0 0 + 592 171 13 -0.834 47.68232 42.84819 52.92728 0 1 0 + 593 171 14 0.417 47.61830 42.41414 52.07654 0 1 0 + 594 171 14 0.417 48.39202 42.39011 53.37758 0 1 0 + 595 172 13 -0.834 37.01774 65.84057 36.39542 1 -1 0 + 596 172 14 0.417 36.84918 65.13561 37.02061 1 -1 0 + 597 172 14 0.417 63.52368 66.19949 36.19938 0 -1 0 + 598 173 13 -0.834 51.52891 58.65207 39.31760 -1 -3 -1 + 599 173 14 0.417 51.57384 59.35596 39.96472 -1 -3 -1 + 600 173 14 0.417 51.00435 59.01522 38.60403 -1 -3 -1 + 601 174 13 -0.834 49.06578 54.25781 44.33488 0 -1 -1 + 602 174 14 0.417 48.81980 55.18018 44.26437 0 -1 -1 + 603 174 14 0.417 49.41695 54.17018 45.22104 0 -1 -1 + 604 175 13 -0.834 47.03819 42.38557 34.31948 -1 -1 0 + 605 175 14 0.417 47.39035 41.82883 35.01393 -1 -1 0 + 606 175 14 0.417 47.47024 43.23019 34.44673 -1 -1 0 + 607 176 13 -0.834 41.64025 43.65472 38.33192 0 1 0 + 608 176 14 0.417 41.17224 44.02383 37.58295 0 1 0 + 609 176 14 0.417 41.46027 44.26142 39.05008 0 1 0 + 610 177 13 -0.834 61.41261 58.14241 37.49312 -2 0 0 + 611 177 14 0.417 61.24368 59.06676 37.67551 -2 0 0 + 612 177 14 0.417 60.57871 57.80631 37.16465 -2 0 0 + 613 178 13 -0.834 48.58355 55.60536 32.34542 0 -2 -2 + 614 178 14 0.417 48.05292 55.64371 31.54969 0 -2 -2 + 615 178 14 0.417 49.00004 56.46561 32.39784 0 -2 -2 + 616 179 13 -0.834 51.18618 52.33768 44.26866 0 -1 0 + 617 179 14 0.417 50.47419 52.97535 44.21659 0 -1 0 + 618 179 14 0.417 51.18053 51.90159 43.41657 0 -1 0 + 619 180 13 -0.834 63.77008 46.64985 53.45124 -2 0 -1 + 620 180 14 0.417 37.25943 46.94040 53.14955 -1 0 -1 + 621 180 14 0.417 63.15834 47.28506 53.07904 -2 0 -1 + 622 181 13 -0.834 37.28071 56.79400 31.30862 1 1 0 + 623 181 14 0.417 37.34297 57.68998 31.63963 1 1 0 + 624 181 14 0.417 36.99543 56.89301 30.40030 1 1 0 + 625 182 13 -0.834 38.98742 57.66608 44.07685 1 0 1 + 626 182 14 0.417 39.04152 57.61214 43.12270 1 0 1 + 627 182 14 0.417 39.46043 56.89430 44.38805 1 0 1 + 628 183 13 -0.834 64.13749 51.25767 48.28997 0 -1 0 + 629 183 14 0.417 64.05120 52.19840 48.13566 0 -1 0 + 630 183 14 0.417 63.26932 50.90255 48.09918 0 -1 0 + 631 184 13 -0.834 41.02949 42.14202 43.02064 0 0 -1 + 632 184 14 0.417 40.60130 42.82178 43.54104 0 0 -1 + 633 184 14 0.417 40.43829 41.99723 42.28189 0 0 -1 + 634 185 13 -0.834 49.87332 48.21836 52.83028 0 1 0 + 635 185 14 0.417 49.13733 48.15035 53.43849 0 1 0 + 636 185 14 0.417 50.32176 47.37567 52.90100 0 1 0 + 637 186 13 -0.834 56.06860 48.51217 38.12813 -1 1 0 + 638 186 14 0.417 56.55702 47.73454 38.39826 -1 1 0 + 639 186 14 0.417 55.52690 48.21357 37.39762 -1 1 0 + 640 187 13 -0.834 54.22718 59.47740 40.22374 -1 0 1 + 641 187 14 0.417 53.93839 59.03820 39.42377 -1 0 1 + 642 187 14 0.417 54.74005 58.81629 40.68868 -1 0 1 + 643 188 13 -0.834 60.09461 46.88146 32.04739 -1 0 -1 + 644 188 14 0.417 60.91535 46.43611 31.83683 -1 0 -1 + 645 188 14 0.417 60.13630 47.02716 32.99253 -1 0 -1 + 646 189 13 -0.834 45.18646 44.57845 41.54076 0 0 0 + 647 189 14 0.417 44.28239 44.89208 41.51774 0 0 0 + 648 189 14 0.417 45.34481 44.23786 40.66033 0 0 0 + 649 190 13 -0.834 42.47099 45.68692 31.56356 1 0 1 + 650 190 14 0.417 43.26152 45.18821 31.76995 1 0 1 + 651 190 14 0.417 42.78187 46.58070 31.41951 1 0 1 + 652 191 13 -0.834 41.23413 47.67043 41.85221 0 1 0 + 653 191 14 0.417 41.04508 48.58329 42.06946 0 1 0 + 654 191 14 0.417 40.84394 47.54379 40.98737 0 1 0 + 655 192 13 -0.834 48.84750 60.39708 36.57115 0 0 0 + 656 192 14 0.417 48.57626 59.48478 36.46920 0 0 0 + 657 192 14 0.417 48.59448 60.62409 37.46597 0 0 0 + 658 193 13 -0.834 56.78263 43.55464 49.12966 -1 0 -1 + 659 193 14 0.417 56.56851 44.25428 48.51250 -1 0 -1 + 660 193 14 0.417 57.66563 43.76469 49.43365 -1 0 -1 + 661 194 13 -0.834 59.52236 53.66894 43.24587 -1 2 0 + 662 194 14 0.417 59.44365 54.61174 43.10041 -1 2 0 + 663 194 14 0.417 59.73284 53.58637 44.17598 -1 2 0 + 664 195 13 -0.834 63.61393 61.54696 40.57053 -1 -1 1 + 665 195 14 0.417 36.90989 60.94398 40.24291 0 -1 1 + 666 195 14 0.417 63.74510 61.55794 41.51864 -1 -1 1 + 667 196 13 -0.834 54.91742 43.16160 33.69639 0 0 -1 + 668 196 14 0.417 55.84062 43.16106 33.94925 0 0 -1 + 669 196 14 0.417 54.73416 44.07060 33.45898 0 0 -1 + 670 197 13 -0.834 41.09699 64.92982 48.38401 0 -1 -1 + 671 197 14 0.417 40.19042 64.83711 48.67687 0 -1 -1 + 672 197 14 0.417 41.27055 64.13206 47.88433 0 -1 -1 + 673 198 13 -0.834 49.09688 60.43369 49.80048 0 0 -1 + 674 198 14 0.417 49.75346 61.03633 50.14971 0 0 -1 + 675 198 14 0.417 49.51718 59.57440 49.83534 0 0 -1 + 676 199 13 -0.834 45.06873 45.25146 44.50830 0 1 0 + 677 199 14 0.417 45.08807 45.11881 43.56053 0 1 0 + 678 199 14 0.417 44.41198 44.63084 44.82413 0 1 0 + 679 200 13 -0.834 37.63886 45.88962 36.45768 0 0 2 + 680 200 14 0.417 38.32892 45.23766 36.58017 0 0 2 + 681 200 14 0.417 37.24627 45.98938 37.32495 0 0 2 + 682 201 13 -0.834 45.25770 47.01692 51.04211 -1 0 -2 + 683 201 14 0.417 45.49830 47.82868 50.59555 -1 0 -2 + 684 201 14 0.417 46.08295 46.68269 51.39354 -1 0 -2 + 685 202 13 -0.834 63.44567 60.77839 50.98507 -2 0 0 + 686 202 14 0.417 62.95029 60.46072 51.74001 -2 0 0 + 687 202 14 0.417 62.77774 61.08133 50.36998 -2 0 0 + 688 203 13 -0.834 48.00038 59.99003 33.31045 0 1 1 + 689 203 14 0.417 48.92391 59.89924 33.54518 0 1 1 + 690 203 14 0.417 47.68314 60.70831 33.85788 0 1 1 + 691 204 13 -0.834 51.29617 53.45952 36.10138 -1 -1 1 + 692 204 14 0.417 50.79623 53.20605 36.87731 -1 -1 1 + 693 204 14 0.417 51.41983 54.40421 36.19363 -1 -1 1 + 694 205 13 -0.834 48.55343 45.13540 34.47517 0 0 0 + 695 205 14 0.417 48.10547 45.97105 34.34382 0 0 0 + 696 205 14 0.417 49.13373 45.28879 35.22081 0 0 0 + 697 206 13 -0.834 48.34844 61.02741 54.77908 1 -1 -1 + 698 206 14 0.417 47.77364 61.75290 55.02301 1 -1 -1 + 699 206 14 0.417 49.14675 61.17253 55.28690 1 -1 -1 + 700 207 13 -0.834 38.97661 48.73541 31.27301 2 -1 0 + 701 207 14 0.417 38.86774 47.99634 30.67453 2 -1 0 + 702 207 14 0.417 38.60214 49.48112 30.80404 2 -1 0 + 703 208 13 -0.834 56.37687 61.69299 40.12439 0 -1 -1 + 704 208 14 0.417 56.35009 61.71409 39.16778 0 -1 -1 + 705 208 14 0.417 55.62486 61.15580 40.37371 0 -1 -1 + 706 209 13 -0.834 47.86700 41.38854 36.76722 -1 0 0 + 707 209 14 0.417 48.79854 41.26117 36.94678 -1 0 0 + 708 209 14 0.417 47.57553 42.00602 37.43804 -1 0 0 + 709 210 13 -0.834 43.22089 60.92576 39.48904 -1 -1 0 + 710 210 14 0.417 42.70029 60.20976 39.85311 -1 -1 0 + 711 210 14 0.417 43.25319 60.74538 38.54954 -1 -1 0 + 712 211 13 -0.834 56.26248 49.03317 34.29585 -1 0 0 + 713 211 14 0.417 56.69244 49.86416 34.09381 -1 0 0 + 714 211 14 0.417 55.61194 48.92467 33.60212 -1 0 0 + 715 212 13 -0.834 47.52063 49.37901 51.21673 1 0 0 + 716 212 14 0.417 48.35964 48.95385 51.03909 1 0 0 + 717 212 14 0.417 47.47856 49.43746 52.17122 1 0 0 + 718 213 13 -0.834 62.35532 56.31018 41.33556 0 0 0 + 719 213 14 0.417 62.07506 57.22150 41.42032 0 0 0 + 720 213 14 0.417 62.92184 56.16192 42.09274 0 0 0 + 721 214 13 -0.834 61.09797 64.53756 45.11003 -1 0 1 + 722 214 14 0.417 61.11801 63.59600 44.93887 -1 0 1 + 723 214 14 0.417 61.95676 64.85132 44.82670 -1 0 1 + 724 215 13 -0.834 51.22661 62.08872 31.93454 0 0 0 + 725 215 14 0.417 51.98994 62.65586 32.04369 0 0 0 + 726 215 14 0.417 50.47877 62.65171 32.13456 0 0 0 + 727 216 13 -0.834 40.65443 48.64853 54.43476 0 0 -1 + 728 216 14 0.417 40.25608 47.97845 54.99023 0 0 -1 + 729 216 14 0.417 41.58025 48.64240 54.67776 0 0 -1 + 730 217 13 -0.834 39.34873 63.07587 52.07209 1 1 -1 + 731 217 14 0.417 39.17266 63.98076 51.81438 1 1 -1 + 732 217 14 0.417 39.29792 62.57948 51.25523 1 1 -1 + 733 218 13 -0.834 45.66307 65.90840 47.75613 -1 0 0 + 734 218 14 0.417 44.99427 65.52542 48.32381 -1 0 0 + 735 218 14 0.417 45.75913 66.80721 48.07102 -1 0 0 + 736 219 13 -0.834 45.83158 51.91442 38.93974 0 0 0 + 737 219 14 0.417 46.07939 51.87422 39.86344 0 0 0 + 738 219 14 0.417 45.49928 51.03877 38.74210 0 0 0 + 739 220 13 -0.834 58.03934 67.88594 44.36036 -1 1 -1 + 740 220 14 0.417 58.69084 68.22520 43.74661 -1 1 -1 + 741 220 14 0.417 58.24719 68.31309 45.19138 -1 1 -1 + 742 221 13 -0.834 57.23319 66.95459 30.42832 0 0 0 + 743 221 14 0.417 56.95316 66.93560 31.34345 0 0 0 + 744 221 14 0.417 58.18154 66.82998 30.46491 0 0 0 + 745 222 13 -0.834 60.87005 44.72970 53.74755 -1 0 -1 + 746 222 14 0.417 60.02694 44.42275 53.41412 -1 0 -1 + 747 222 14 0.417 61.31963 45.07903 52.97808 -1 0 -1 + 748 223 13 -0.834 50.61352 50.44308 31.66369 0 -1 0 + 749 223 14 0.417 50.38691 49.95555 30.87173 0 -1 0 + 750 223 14 0.417 50.16704 51.28387 31.56391 0 -1 0 + 751 224 13 -0.834 42.70363 42.07925 34.73823 0 1 0 + 752 224 14 0.417 42.74630 41.15512 34.49249 0 1 0 + 753 224 14 0.417 41.77538 42.23983 34.90796 0 1 0 + 754 225 13 -0.834 50.34157 43.80796 44.49841 -1 1 0 + 755 225 14 0.417 49.44649 44.14718 44.50119 -1 1 0 + 756 225 14 0.417 50.24323 42.86994 44.66171 -1 1 0 + 757 226 13 -0.834 62.39528 64.92163 33.72829 -3 -1 1 + 758 226 14 0.417 61.94679 64.42233 34.41078 -3 -1 1 + 759 226 14 0.417 61.94061 64.68505 32.91986 -3 -1 1 + 760 227 13 -0.834 46.62188 47.13429 41.79430 0 1 1 + 761 227 14 0.417 46.21721 46.28415 41.62178 0 1 1 + 762 227 14 0.417 47.40198 46.92861 42.30946 0 1 1 + 763 228 13 -0.834 41.35469 54.31275 56.45453 0 0 -1 + 764 228 14 0.417 41.79769 53.47653 56.31055 0 0 -1 + 765 228 14 0.417 40.57273 54.26794 55.90425 0 0 -1 + 766 229 13 -0.834 48.43878 42.20000 49.94999 0 0 0 + 767 229 14 0.417 49.34431 42.29756 50.24447 0 0 0 + 768 229 14 0.417 48.41583 42.63350 49.09688 0 0 0 + 769 230 13 -0.834 37.29829 50.04209 33.34795 0 1 0 + 770 230 14 0.417 36.96213 49.51969 34.07619 0 1 0 + 771 230 14 0.417 37.98470 49.49933 32.96002 0 1 0 + 772 231 13 -0.834 58.91995 56.17895 33.02333 -1 0 0 + 773 231 14 0.417 59.83980 56.43785 32.96791 -1 0 0 + 774 231 14 0.417 58.89269 55.54120 33.73661 -1 0 0 + 775 232 13 -0.834 39.86900 65.81481 43.81866 0 0 -1 + 776 232 14 0.417 40.31483 64.99515 43.60502 0 0 -1 + 777 232 14 0.417 40.41298 66.21397 44.49762 0 0 -1 + 778 233 13 -0.834 62.71324 65.93556 51.55400 -1 0 0 + 779 233 14 0.417 62.38032 66.39597 52.32436 -1 0 0 + 780 233 14 0.417 63.52336 65.52245 51.85285 -1 0 0 + 781 234 13 -0.834 59.23324 49.58642 31.35843 0 0 0 + 782 234 14 0.417 59.28102 48.68976 31.69001 0 0 0 + 783 234 14 0.417 59.95115 50.04304 31.79700 0 0 0 + 784 235 13 -0.834 41.02310 67.21389 51.60243 0 0 0 + 785 235 14 0.417 41.77450 67.79064 51.74021 0 0 0 + 786 235 14 0.417 40.36922 67.76899 51.17753 0 0 0 + 787 236 13 -0.834 41.38918 62.43794 34.42449 0 0 1 + 788 236 14 0.417 41.26665 63.14612 33.79227 0 0 1 + 789 236 14 0.417 42.30454 62.51275 34.69423 0 0 1 + 790 237 13 -0.834 52.28796 56.01034 50.59905 0 -1 -1 + 791 237 14 0.417 53.14113 56.07317 51.02851 0 -1 -1 + 792 237 14 0.417 52.14509 55.07070 50.48548 0 -1 -1 + 793 238 13 -0.834 53.25204 66.52198 39.76351 0 -1 0 + 794 238 14 0.417 52.30774 66.44732 39.62571 0 -1 0 + 795 238 14 0.417 53.47725 67.38617 39.41895 0 -1 0 + 796 239 13 -0.834 59.77604 60.82055 48.12264 -1 -1 -1 + 797 239 14 0.417 59.80699 60.05926 48.70205 -1 -1 -1 + 798 239 14 0.417 58.96049 60.71611 47.63253 -1 -1 -1 + 799 240 13 -0.834 48.99693 51.07559 36.89084 0 -1 1 + 800 240 14 0.417 48.22315 50.55308 37.10175 0 -1 1 + 801 240 14 0.417 48.88824 51.30348 35.96753 0 -1 1 + 802 241 13 -0.834 50.67863 62.63916 55.60559 1 0 -2 + 803 241 14 0.417 51.43406 62.16856 55.25331 1 0 -2 + 804 241 14 0.417 51.05760 63.36945 56.09477 1 0 -2 + 805 242 13 -0.834 41.05301 64.77947 55.72335 1 -1 -1 + 806 242 14 0.417 41.95836 64.58666 55.96711 1 -1 -1 + 807 242 14 0.417 41.07998 65.67647 55.39035 1 -1 -1 + 808 243 13 -0.834 59.16096 63.30207 34.55147 0 -1 2 + 809 243 14 0.417 58.62636 62.51316 34.64131 0 -1 2 + 810 243 14 0.417 59.80830 63.23451 35.25333 0 -1 2 + 811 244 13 -0.834 59.86542 53.52546 55.50419 0 -1 -1 + 812 244 14 0.417 60.26921 53.79963 56.32761 0 -1 -1 + 813 244 14 0.417 58.96256 53.83773 55.56399 0 -1 -1 + 814 245 13 -0.834 56.48528 44.99075 44.65443 1 0 0 + 815 245 14 0.417 55.84854 44.49932 44.13551 1 0 0 + 816 245 14 0.417 57.18258 45.20803 44.03571 1 0 0 + 817 246 13 -0.834 37.25407 54.85866 36.86076 0 -1 -1 + 818 246 14 0.417 37.37951 55.31820 36.03050 0 -1 -1 + 819 246 14 0.417 36.91899 55.52805 37.45731 0 -1 -1 + 820 247 13 -0.834 54.42875 47.21339 48.23883 -1 -1 -1 + 821 247 14 0.417 54.60966 48.13349 48.43097 -1 -1 -1 + 822 247 14 0.417 54.44092 47.16092 47.28312 -1 -1 -1 + 823 248 13 -0.834 42.61226 41.78391 40.84493 1 0 1 + 824 248 14 0.417 41.98531 41.90233 41.55849 1 0 1 + 825 248 14 0.417 42.35866 42.43623 40.19194 1 0 1 + 826 249 13 -0.834 37.83522 41.95649 50.31377 0 0 -2 + 827 249 14 0.417 37.42231 42.81133 50.19124 0 0 -2 + 828 249 14 0.417 37.46684 41.41031 49.61934 0 0 -2 + 829 250 13 -0.834 44.80898 44.15062 49.20688 0 -1 0 + 830 250 14 0.417 44.80289 44.55594 48.33975 0 -1 0 + 831 250 14 0.417 45.29722 44.76463 49.75537 0 -1 0 + 832 251 13 -0.834 37.44321 44.03405 38.75076 1 0 1 + 833 251 14 0.417 37.12277 44.06014 39.65235 1 0 1 + 834 251 14 0.417 64.13547 43.56266 38.26824 0 0 1 + 835 252 13 -0.834 38.82113 46.15070 46.12915 1 0 0 + 836 252 14 0.417 38.96657 46.44867 47.02709 1 0 0 + 837 252 14 0.417 38.09796 45.52731 46.19733 1 0 0 + 838 253 13 -0.834 43.08482 60.65520 45.34135 -1 0 1 + 839 253 14 0.417 42.82882 59.73347 45.30784 -1 0 1 + 840 253 14 0.417 44.00885 60.65685 45.09147 -1 0 1 + 841 254 13 -0.834 45.72190 46.51173 32.51384 1 0 0 + 842 254 14 0.417 46.00925 45.78294 31.96381 1 0 0 + 843 254 14 0.417 46.53186 46.95248 32.77064 1 0 0 + 844 255 13 -0.834 63.64359 44.33728 41.24417 -1 0 0 + 845 255 14 0.417 63.60411 43.61794 41.87443 -1 0 0 + 846 255 14 0.417 62.76926 44.36407 40.85550 -1 0 0 + 847 256 13 -0.834 48.53353 66.27879 51.60437 0 0 -1 + 848 256 14 0.417 49.21611 66.24938 50.93396 0 0 -1 + 849 256 14 0.417 48.67507 65.48862 52.12577 0 0 -1 + 850 257 13 -0.834 54.11962 54.32751 39.83526 -1 1 1 + 851 257 14 0.417 53.37975 54.47391 39.24585 -1 1 1 + 852 257 14 0.417 53.95747 53.46346 40.21391 -1 1 1 + 853 258 13 -0.834 53.72785 66.08707 44.78384 -1 -1 0 + 854 258 14 0.417 54.65423 65.85662 44.85413 -1 -1 0 + 855 258 14 0.417 53.26300 65.26936 44.96130 -1 -1 0 + 856 259 13 -0.834 39.06287 51.40870 53.96063 0 0 -1 + 857 259 14 0.417 39.12854 51.34243 53.00796 0 0 -1 + 858 259 14 0.417 38.38057 52.06341 54.10916 0 0 -1 + 859 260 13 -0.834 58.77064 49.77012 37.45292 0 0 0 + 860 260 14 0.417 59.49652 49.20688 37.72142 0 0 0 + 861 260 14 0.417 57.98575 49.25379 37.63621 0 0 0 + 862 261 13 -0.834 37.94204 48.36591 35.22049 -1 0 0 + 863 261 14 0.417 37.94000 47.48368 35.59187 -1 0 0 + 864 261 14 0.417 38.86901 48.59216 35.14453 -1 0 0 + 865 262 13 -0.834 47.05754 54.06564 40.63628 0 -2 1 + 866 262 14 0.417 47.01965 53.22193 41.08679 0 -2 1 + 867 262 14 0.417 46.68660 54.68838 41.26145 0 -2 1 + 868 263 13 -0.834 46.01283 65.88108 53.59469 0 0 0 + 869 263 14 0.417 45.30729 66.50296 53.77277 0 0 0 + 870 263 14 0.417 46.76378 66.42902 53.36650 0 0 0 + 871 264 13 -0.834 45.32546 67.91008 39.11365 -1 -1 0 + 872 264 14 0.417 44.38981 67.96233 38.91853 -1 -1 0 + 873 264 14 0.417 45.70517 67.47097 38.35257 -1 -1 0 + 874 265 13 -0.834 55.39761 51.53823 53.16553 -1 1 -1 + 875 265 14 0.417 54.64975 52.10179 53.36389 -1 1 -1 + 876 265 14 0.417 55.78119 51.91789 52.37499 -1 1 -1 + 877 266 13 -0.834 57.06415 51.22923 32.75117 -1 -1 0 + 878 266 14 0.417 56.79908 52.11139 32.49079 -1 -1 0 + 879 266 14 0.417 57.98399 51.16910 32.49322 -1 -1 0 + 880 267 13 -0.834 50.05222 47.30342 45.67457 0 0 -2 + 881 267 14 0.417 49.85957 46.82324 46.47990 0 0 -2 + 882 267 14 0.417 50.60617 46.70964 45.16781 0 0 -2 + 883 268 13 -0.834 50.46819 45.47822 52.51129 0 1 -1 + 884 268 14 0.417 50.78823 45.07196 53.31677 0 1 -1 + 885 268 14 0.417 51.03886 45.13243 51.82499 0 1 -1 + 886 269 13 -0.834 47.44130 61.30175 47.80124 0 0 0 + 887 269 14 0.417 48.02715 60.89314 48.43850 0 0 0 + 888 269 14 0.417 47.98636 61.43626 47.02595 0 0 0 + 889 270 13 -0.834 41.31630 52.47434 39.71677 1 0 0 + 890 270 14 0.417 41.07609 52.94514 40.51485 1 0 0 + 891 270 14 0.417 42.05418 52.96849 39.35955 1 0 0 + 892 271 13 -0.834 55.90762 58.63213 50.47814 0 1 0 + 893 271 14 0.417 55.80273 59.37784 51.06903 0 1 0 + 894 271 14 0.417 55.41449 58.87554 49.69468 0 1 0 + 895 272 13 -0.834 42.23424 55.62725 53.35280 0 1 -1 + 896 272 14 0.417 41.62946 55.10926 53.88399 0 1 -1 + 897 272 14 0.417 41.75761 56.43615 53.16647 0 1 -1 + 898 273 13 -0.834 62.31754 63.97065 42.48774 0 0 1 + 899 273 14 0.417 63.27023 64.05391 42.44669 0 0 1 + 900 273 14 0.417 62.16851 63.13573 42.93152 0 0 1 + 901 274 13 -0.834 60.93154 49.79182 56.13812 0 -1 0 + 902 274 14 0.417 61.38991 48.97402 56.33134 0 -1 0 + 903 274 14 0.417 60.29808 49.88575 56.84955 0 -1 0 + 904 275 13 -0.834 50.39572 45.11274 36.60756 0 1 -1 + 905 275 14 0.417 50.88541 44.33834 36.33051 0 1 -1 + 906 275 14 0.417 50.38352 45.05976 37.56322 0 1 -1 + 907 276 13 -0.834 46.57204 43.12189 39.29488 -1 2 -1 + 908 276 14 0.417 46.48449 42.17951 39.43813 -1 2 -1 + 909 276 14 0.417 47.49357 43.30747 39.47547 -1 2 -1 + 910 277 13 -0.834 54.39979 41.37518 38.62483 0 0 1 + 911 277 14 0.417 54.27469 42.27221 38.31511 0 0 1 + 912 277 14 0.417 54.57135 68.24024 37.83080 0 -1 1 + 913 278 13 -0.834 60.57638 52.40343 41.12327 -1 1 -1 + 914 278 14 0.417 60.40196 53.27982 40.78010 -1 1 -1 + 915 278 14 0.417 60.37657 52.46726 42.05721 -1 1 -1 + 916 279 13 -0.834 61.77806 59.06524 41.98029 0 0 0 + 917 279 14 0.417 62.58317 59.36537 42.40214 0 0 0 + 918 279 14 0.417 61.10430 59.16112 42.65342 0 0 0 + 919 280 13 -0.834 43.46789 48.64833 54.88223 0 1 -2 + 920 280 14 0.417 43.60676 49.48200 54.43286 0 1 -2 + 921 280 14 0.417 43.74339 47.98554 54.24895 0 1 -2 + 922 281 13 -0.834 51.98628 58.37454 48.60562 -1 0 0 + 923 281 14 0.417 51.81372 57.54909 49.05852 -1 0 0 + 924 281 14 0.417 52.67545 58.16319 47.97583 -1 0 0 + 925 282 13 -0.834 55.00551 65.64176 56.63926 0 -1 -1 + 926 282 14 0.417 55.59134 66.11131 29.86167 0 -1 0 + 927 282 14 0.417 54.80211 66.27584 55.95165 0 -1 -1 + 928 283 13 -0.834 55.02996 52.59142 50.59986 -1 1 0 + 929 283 14 0.417 54.13615 52.66743 50.26585 -1 1 0 + 930 283 14 0.417 55.48513 53.35419 50.24316 -1 1 0 + 931 284 13 -0.834 37.39245 67.88600 56.81733 0 -1 -1 + 932 284 14 0.417 38.13326 41.09044 56.62787 0 0 -1 + 933 284 14 0.417 37.74351 67.00148 56.71419 0 -1 -1 + 934 285 13 -0.834 42.83234 60.22766 53.36959 0 0 0 + 935 285 14 0.417 43.51497 59.86233 52.80672 0 0 0 + 936 285 14 0.417 43.27782 60.90528 53.87815 0 0 0 + 937 286 13 -0.834 59.24806 43.81265 38.44265 1 0 0 + 938 286 14 0.417 59.12140 43.55748 39.35647 1 0 0 + 939 286 14 0.417 60.07673 44.29174 38.43991 1 0 0 + 940 287 13 -0.834 61.29263 60.52642 52.74164 -1 1 -1 + 941 287 14 0.417 61.73918 60.02180 53.42149 -1 1 -1 + 942 287 14 0.417 60.93759 61.28711 53.20156 -1 1 -1 + 943 288 13 -0.834 63.43980 43.30119 30.90384 -1 1 0 + 944 288 14 0.417 63.34979 42.36405 30.73085 -1 1 0 + 945 288 14 0.417 64.20504 43.56693 30.39393 -1 1 0 + 946 289 13 -0.834 57.11924 59.06522 54.48909 -1 0 0 + 947 289 14 0.417 57.40605 59.83488 54.98062 -1 0 0 + 948 289 14 0.417 57.59698 58.33614 54.88463 -1 0 0 + 949 290 13 -0.834 51.89759 59.82680 44.82923 1 1 -1 + 950 290 14 0.417 51.33588 59.94068 44.06258 1 1 -1 + 951 290 14 0.417 51.32846 60.01914 45.57443 1 1 -1 + 952 291 13 -0.834 57.64696 65.49112 47.86068 -1 0 0 + 953 291 14 0.417 57.31105 65.98457 48.60895 -1 0 0 + 954 291 14 0.417 57.73765 64.59519 48.18521 -1 0 0 + 955 292 13 -0.834 50.35232 57.73892 32.55459 0 1 0 + 956 292 14 0.417 51.07441 57.69034 31.92813 0 1 0 + 957 292 14 0.417 50.48339 58.57180 33.00777 0 1 0 + 958 293 13 -0.834 46.20166 60.82812 38.38269 0 1 1 + 959 293 14 0.417 46.12191 61.76977 38.53504 0 1 1 + 960 293 14 0.417 45.30555 60.53505 38.21735 0 1 1 + 961 294 13 -0.834 41.42660 51.46433 55.94150 1 0 -1 + 962 294 14 0.417 40.58025 51.71240 55.56944 1 0 -1 + 963 294 14 0.417 41.63094 50.62307 55.53311 1 0 -1 + 964 295 13 -0.834 56.72642 53.95840 32.00323 0 -1 0 + 965 295 14 0.417 57.12177 54.49254 32.69216 0 -1 0 + 966 295 14 0.417 55.80349 54.21231 32.00259 0 -1 0 + 967 296 13 -0.834 43.25852 41.40642 31.27656 0 1 0 + 968 296 14 0.417 43.58058 42.21308 31.67880 0 1 0 + 969 296 14 0.417 43.16985 68.16459 32.00619 0 0 0 + 970 297 13 -0.834 54.50477 52.62435 30.30235 -2 1 0 + 971 297 14 0.417 54.04985 52.22243 31.04245 -2 1 0 + 972 297 14 0.417 54.36900 53.56465 30.41915 -2 1 0 + 973 298 13 -0.834 38.11258 59.33341 36.21749 1 0 0 + 974 298 14 0.417 38.95754 58.91929 36.04205 1 0 0 + 975 298 14 0.417 38.14750 60.16192 35.73940 1 0 0 + 976 299 13 -0.834 39.65020 64.70254 40.48616 -1 0 1 + 977 299 14 0.417 39.87581 65.58596 40.19474 -1 0 1 + 978 299 14 0.417 39.66086 64.17611 39.68676 -1 0 1 + 979 300 13 -0.834 63.26661 53.84973 48.10281 -1 1 1 + 980 300 14 0.417 63.38261 54.75210 48.40032 -1 1 1 + 981 300 14 0.417 62.32830 53.68505 48.19603 -1 1 1 + 982 301 13 -0.834 43.65966 61.04202 50.03088 0 0 0 + 983 301 14 0.417 44.11377 60.35973 50.52538 0 0 0 + 984 301 14 0.417 44.30508 61.74317 49.94108 0 0 0 + 985 302 13 -0.834 61.75204 50.20037 32.39414 0 0 0 + 986 302 14 0.417 62.04749 51.09027 32.58663 0 0 0 + 987 302 14 0.417 62.55370 49.67736 32.38826 0 0 0 + 988 303 13 -0.834 53.79071 58.98335 36.25336 -1 -2 -1 + 989 303 14 0.417 53.17711 58.26833 36.42220 -1 -2 -1 + 990 303 14 0.417 54.65389 58.60140 36.41235 -1 -2 -1 + 991 304 13 -0.834 50.47963 50.13918 42.58243 1 -1 -2 + 992 304 14 0.417 51.28111 49.63880 42.42915 1 -1 -2 + 993 304 14 0.417 50.33279 50.61369 41.76419 1 -1 -2 + 994 305 13 -0.834 50.28770 49.02182 56.79391 1 -1 -2 + 995 305 14 0.417 50.66164 48.14920 56.91622 1 -1 -2 + 996 305 14 0.417 50.60501 49.30063 55.93493 1 -1 -2 + 997 306 13 -0.834 41.36930 46.36343 34.87469 1 1 0 + 998 306 14 0.417 42.25704 46.59841 34.60463 1 1 0 + 999 306 14 0.417 40.85961 47.16333 34.74582 1 1 0 + 1000 307 13 -0.834 61.15349 47.47016 41.71779 0 1 0 + 1001 307 14 0.417 61.50139 48.29469 41.37818 0 1 0 + 1002 307 14 0.417 60.28203 47.69385 42.04454 0 1 0 + 1003 308 13 -0.834 58.35337 46.83622 34.81712 0 0 1 + 1004 308 14 0.417 57.63221 46.22391 34.67141 0 0 1 + 1005 308 14 0.417 57.97297 47.69883 34.65146 0 0 1 + 1006 309 13 -0.834 38.79812 57.92803 48.26323 1 -2 -1 + 1007 309 14 0.417 38.67444 56.98130 48.33141 1 -2 -1 + 1008 309 14 0.417 39.70990 58.06987 48.51776 1 -2 -1 + 1009 310 13 -0.834 42.15963 57.96891 45.03230 1 0 0 + 1010 310 14 0.417 42.11698 57.98663 45.98839 1 0 0 + 1011 310 14 0.417 41.83611 57.10021 44.79371 1 0 0 + 1012 311 13 -0.834 55.17551 54.72671 36.49400 0 -1 0 + 1013 311 14 0.417 55.26386 53.77738 36.57890 0 -1 0 + 1014 311 14 0.417 55.36463 55.06457 37.36939 0 -1 0 + 1015 312 13 -0.834 58.64573 63.28550 41.10609 -1 -2 -1 + 1016 312 14 0.417 58.98147 62.66636 41.75429 -1 -2 -1 + 1017 312 14 0.417 57.90273 62.83419 40.70545 -1 -2 -1 + 1018 313 13 -0.834 49.96498 59.98797 42.54359 0 -1 0 + 1019 313 14 0.417 50.57886 60.48612 42.00390 0 -1 0 + 1020 313 14 0.417 49.10600 60.17526 42.16501 0 -1 0 + 1021 314 13 -0.834 57.54750 44.35075 52.12722 -1 -1 -1 + 1022 314 14 0.417 57.86221 43.84739 51.37633 -1 -1 -1 + 1023 314 14 0.417 56.76423 44.79718 51.80558 -1 -1 -1 + 1024 315 13 -0.834 58.07892 59.46258 41.31930 1 -1 0 + 1025 315 14 0.417 58.27344 60.10968 41.99729 1 -1 0 + 1026 315 14 0.417 57.80524 59.98199 40.56328 1 -1 0 + 1027 316 13 -0.834 42.21869 44.49848 55.65511 2 1 0 + 1028 316 14 0.417 42.77458 44.78017 56.38166 2 1 0 + 1029 316 14 0.417 42.83052 44.15513 55.00395 2 1 0 + 1030 317 13 -0.834 56.38334 63.45614 43.52622 -1 -1 0 + 1031 317 14 0.417 55.66283 63.62998 42.92052 -1 -1 0 + 1032 317 14 0.417 56.48976 64.27319 44.01338 -1 -1 0 + 1033 318 13 -0.834 43.21354 46.04700 52.52965 1 1 0 + 1034 318 14 0.417 43.24360 45.09879 52.40226 1 1 0 + 1035 318 14 0.417 43.99839 46.37328 52.08943 1 1 0 + 1036 319 13 -0.834 55.96174 45.94863 35.39660 -1 0 1 + 1037 319 14 0.417 55.64687 46.44680 36.15088 -1 0 1 + 1038 319 14 0.417 55.28305 46.06527 34.73174 -1 0 1 + 1039 320 13 -0.834 47.36406 54.82690 34.84439 -1 -1 2 + 1040 320 14 0.417 47.90093 54.86776 34.05295 -1 -1 2 + 1041 320 14 0.417 47.23152 53.89118 34.99640 -1 -1 2 + 1042 321 13 -0.834 49.62685 50.00229 45.27362 1 0 -2 + 1043 321 14 0.417 49.70876 49.05477 45.38192 1 0 -2 + 1044 321 14 0.417 49.82566 50.15634 44.35005 1 0 -2 + 1045 322 13 -0.834 49.58249 46.02940 55.43310 -1 0 -2 + 1046 322 14 0.417 49.10378 46.80060 55.12924 -1 0 -2 + 1047 322 14 0.417 49.31802 45.92761 56.34739 -1 0 -2 + 1048 323 13 -0.834 51.72150 51.53491 51.55558 0 -1 -1 + 1049 323 14 0.417 51.50292 52.17946 50.88251 0 -1 -1 + 1050 323 14 0.417 52.14568 52.04382 52.24646 0 -1 -1 + 1051 324 13 -0.834 37.98107 56.66338 52.98024 0 1 0 + 1052 324 14 0.417 37.64467 57.53823 52.78607 0 1 0 + 1053 324 14 0.417 38.15999 56.27913 52.12200 0 1 0 + 1054 325 13 -0.834 59.20226 51.55233 53.16877 -1 1 0 + 1055 325 14 0.417 59.68851 51.88535 53.92302 -1 1 0 + 1056 325 14 0.417 58.63621 50.87031 53.53025 -1 1 0 + 1057 326 13 -0.834 45.75783 63.62117 39.24032 1 1 -1 + 1058 326 14 0.417 46.25179 64.38626 39.53508 1 1 -1 + 1059 326 14 0.417 44.85376 63.80686 39.49409 1 1 -1 + 1060 327 13 -0.834 58.00953 52.38584 37.67148 -1 1 1 + 1061 327 14 0.417 58.24242 51.47235 37.50553 -1 1 1 + 1062 327 14 0.417 57.26453 52.33853 38.27062 -1 1 1 + 1063 328 13 -0.834 50.62838 66.20855 42.36072 0 0 -1 + 1064 328 14 0.417 51.45434 66.68250 42.45770 0 0 -1 + 1065 328 14 0.417 49.99531 66.87945 42.10506 0 0 -1 + 1066 329 13 -0.834 53.69444 52.39171 45.41982 1 0 0 + 1067 329 14 0.417 53.84961 51.45739 45.55855 1 0 0 + 1068 329 14 0.417 52.75879 52.45359 45.22750 1 0 0 + 1069 330 13 -0.834 38.34038 60.92162 30.12773 2 0 0 + 1070 330 14 0.417 39.08908 61.47644 29.90887 2 0 0 + 1071 330 14 0.417 38.64185 60.39196 30.86585 2 0 0 + 1072 331 13 -0.834 48.03336 64.84935 43.13262 -1 0 -2 + 1073 331 14 0.417 48.90813 65.00919 43.48682 -1 0 -2 + 1074 331 14 0.417 47.46214 65.43367 43.63114 -1 0 -2 + 1075 332 13 -0.834 39.68760 66.88962 36.60665 2 0 0 + 1076 332 14 0.417 38.74743 66.72116 36.66944 2 0 0 + 1077 332 14 0.417 40.05009 66.08888 36.22764 2 0 0 + 1078 333 13 -0.834 51.94118 65.49897 51.83197 0 -1 -2 + 1079 333 14 0.417 52.71282 65.06165 51.47204 0 -1 -2 + 1080 333 14 0.417 51.22446 64.88225 51.68297 0 -1 -2 + 1081 334 13 -0.834 43.33066 57.53264 55.09930 -1 0 -2 + 1082 334 14 0.417 43.05496 56.76932 54.59178 -1 0 -2 + 1083 334 14 0.417 44.28179 57.55937 54.99503 -1 0 -2 + 1084 335 13 -0.834 47.70128 45.69178 52.17773 -1 3 -1 + 1085 335 14 0.417 47.54566 44.86273 52.63016 -1 3 -1 + 1086 335 14 0.417 48.58530 45.94693 52.44163 -1 3 -1 + 1087 336 13 -0.834 58.71603 41.81571 40.73899 -1 0 0 + 1088 336 14 0.417 57.77048 41.84330 40.88539 -1 0 0 + 1089 336 14 0.417 58.81275 41.43332 39.86682 -1 0 0 + 1090 337 13 -0.834 57.56034 60.98533 43.60766 0 -1 0 + 1091 337 14 0.417 56.67639 60.61816 43.59917 0 -1 0 + 1092 337 14 0.417 57.42830 61.92611 43.72486 0 -1 0 + 1093 338 13 -0.834 44.68088 65.08579 34.27880 -1 0 2 + 1094 338 14 0.417 45.54678 65.09564 34.68668 -1 0 2 + 1095 338 14 0.417 44.45037 64.15818 34.22739 -1 0 2 + 1096 339 13 -0.834 54.98236 48.04093 42.26075 0 0 0 + 1097 339 14 0.417 55.16505 47.86552 43.18384 0 0 0 + 1098 339 14 0.417 55.70493 48.59999 41.97513 0 0 0 + 1099 340 13 -0.834 60.57099 56.88773 56.53671 0 0 1 + 1100 340 14 0.417 60.67151 56.21616 29.83998 0 0 2 + 1101 340 14 0.417 61.34465 56.78824 55.98192 0 0 1 + 1102 341 13 -0.834 48.05045 49.69974 47.93542 -1 0 0 + 1103 341 14 0.417 48.70922 49.23613 48.45249 -1 0 0 + 1104 341 14 0.417 48.26410 49.48583 47.02721 -1 0 0 + 1105 342 13 -0.834 40.63207 55.77589 49.21695 1 0 -1 + 1106 342 14 0.417 40.84917 56.26844 50.00847 1 0 -1 + 1107 342 14 0.417 41.40772 55.85904 48.66226 1 0 -1 + 1108 343 13 -0.834 61.66015 42.71355 39.91223 0 0 0 + 1109 343 14 0.417 61.87748 41.86774 40.30419 0 0 0 + 1110 343 14 0.417 61.98864 42.65380 39.01514 0 0 0 + 1111 344 13 -0.834 38.52157 65.12766 57.04010 0 -1 -1 + 1112 344 14 0.417 38.04157 64.32142 56.85084 0 -1 -1 + 1113 344 14 0.417 39.36310 65.01535 56.59799 0 -1 -1 + 1114 345 13 -0.834 54.26556 44.72348 38.61852 -1 0 0 + 1115 345 14 0.417 54.65781 45.53245 38.94708 -1 0 0 + 1116 345 14 0.417 54.97105 44.29396 38.13473 -1 0 0 + 1117 346 13 -0.834 55.38993 55.61246 43.96322 -1 0 1 + 1118 346 14 0.417 54.74535 54.99107 43.62461 -1 0 1 + 1119 346 14 0.417 55.11835 55.77119 44.86726 -1 0 1 + 1120 347 13 -0.834 56.42023 55.00369 50.06211 -1 -1 0 + 1121 347 14 0.417 55.77599 55.59187 50.45611 -1 -1 0 + 1122 347 14 0.417 56.93756 54.68448 50.80151 -1 -1 0 + 1123 348 13 -0.834 45.79495 66.88952 36.56670 1 1 -1 + 1124 348 14 0.417 45.28578 66.71904 35.77429 1 1 -1 + 1125 348 14 0.417 46.57709 67.34552 36.25591 1 1 -1 + 1126 349 13 -0.834 62.75278 45.54084 32.23733 0 0 0 + 1127 349 14 0.417 62.61586 44.79986 31.64705 0 0 0 + 1128 349 14 0.417 62.96974 45.14017 33.07913 0 0 0 + 1129 350 13 -0.834 57.50625 65.62986 39.74454 0 0 0 + 1130 350 14 0.417 57.73342 64.85584 40.25983 0 0 0 + 1131 350 14 0.417 57.07082 66.21286 40.36642 0 0 0 + 1132 351 13 -0.834 55.96293 62.10636 50.17062 0 1 -1 + 1133 351 14 0.417 56.24333 61.70901 50.99507 0 1 -1 + 1134 351 14 0.417 56.67888 62.69531 49.93234 0 1 -1 + 1135 352 13 -0.834 37.45010 41.11856 53.00894 0 0 0 + 1136 352 14 0.417 37.99062 41.49514 53.70339 0 0 0 + 1137 352 14 0.417 37.83337 41.45341 52.19826 0 0 0 + 1138 353 13 -0.834 40.59344 47.85232 38.52244 1 0 1 + 1139 353 14 0.417 41.31256 47.71502 37.90580 1 0 1 + 1140 353 14 0.417 40.21612 48.69426 38.26747 1 0 1 + 1141 354 13 -0.834 60.77214 62.31711 30.33695 0 2 -1 + 1142 354 14 0.417 59.83662 62.43212 30.17023 0 2 -1 + 1143 354 14 0.417 60.97856 61.45964 29.96496 0 2 -1 + 1144 355 13 -0.834 47.83829 64.26042 48.43592 0 1 -1 + 1145 355 14 0.417 47.12209 64.85952 48.22523 0 1 -1 + 1146 355 14 0.417 47.44823 63.38856 48.37295 0 1 -1 + 1147 356 13 -0.834 38.69679 45.31108 42.13672 1 1 0 + 1148 356 14 0.417 39.20464 45.52138 41.35308 1 1 0 + 1149 356 14 0.417 37.90440 44.89009 41.80335 1 1 0 + 1150 357 13 -0.834 38.90832 47.67164 52.69089 0 1 0 + 1151 357 14 0.417 39.51269 48.14149 53.26554 0 1 0 + 1152 357 14 0.417 38.42834 48.36117 52.23218 0 1 0 + 1153 358 13 -0.834 45.13879 48.98199 29.96256 0 2 1 + 1154 358 14 0.417 44.63649 48.48457 30.60794 0 2 1 + 1155 358 14 0.417 44.70163 48.80464 56.50106 0 2 0 + 1156 359 13 -0.834 54.78460 57.58368 54.24956 1 1 -1 + 1157 359 14 0.417 54.71436 57.34891 55.17486 1 1 -1 + 1158 359 14 0.417 55.60599 58.07122 54.18735 1 1 -1 + 1159 360 13 -0.834 40.77006 67.09387 46.34204 0 0 1 + 1160 360 14 0.417 40.91087 66.51539 47.09156 0 0 1 + 1161 360 14 0.417 41.47386 67.73986 46.40192 0 0 1 + 1162 361 13 -0.834 53.75960 49.21723 54.03526 1 0 -1 + 1163 361 14 0.417 54.17778 50.07537 53.96484 1 0 -1 + 1164 361 14 0.417 54.18187 48.68822 53.35846 1 0 -1 + 1165 362 13 -0.834 46.41755 62.84035 30.52059 0 0 1 + 1166 362 14 0.417 46.37357 61.90548 30.72136 0 0 1 + 1167 362 14 0.417 46.76359 62.87829 57.00030 0 0 0 + 1168 363 13 -0.834 51.27491 42.28113 30.83818 0 -1 0 + 1169 363 14 0.417 51.18814 42.11416 31.77671 0 -1 0 + 1170 363 14 0.417 50.41560 42.60836 30.57220 0 -1 0 + 1171 364 13 -0.834 52.36258 42.54738 46.83477 0 -1 -1 + 1172 364 14 0.417 51.62853 42.02025 46.51928 0 -1 -1 + 1173 364 14 0.417 53.11771 42.22680 46.34158 0 -1 -1 + 1174 365 13 -0.834 40.11442 46.69570 48.71466 3 -2 1 + 1175 365 14 0.417 39.89820 47.61495 48.55824 3 -2 1 + 1176 365 14 0.417 40.87520 46.72352 49.29493 3 -2 1 + 1177 366 13 -0.834 56.56957 65.78976 45.32589 0 -2 -1 + 1178 366 14 0.417 56.86196 65.56407 46.20896 0 -2 -1 + 1179 366 14 0.417 57.34222 66.16870 44.90678 0 -2 -1 + 1180 367 13 -0.834 38.37373 47.63723 43.98242 2 0 0 + 1181 367 14 0.417 38.78516 47.21384 44.73589 2 0 0 + 1182 367 14 0.417 38.73588 47.18051 43.22315 2 0 0 + 1183 368 13 -0.834 45.69445 49.36872 40.50736 -1 0 -2 + 1184 368 14 0.417 44.73771 49.39892 40.51002 -1 0 -2 + 1185 368 14 0.417 45.90701 48.47357 40.77155 -1 0 -2 + 1186 369 13 -0.834 53.93830 54.76570 31.99728 0 -1 0 + 1187 369 14 0.417 53.94849 55.50033 32.61083 0 -1 0 + 1188 369 14 0.417 53.13070 54.29402 32.20107 0 -1 0 + 1189 370 13 -0.834 58.79125 64.07093 37.97498 -1 -1 -2 + 1190 370 14 0.417 58.48296 64.72380 38.60343 -1 -1 -2 + 1191 370 14 0.417 58.20942 64.16977 37.22136 -1 -1 -2 + 1192 371 13 -0.834 51.76123 61.42281 40.82794 0 -1 0 + 1193 371 14 0.417 52.69114 61.24136 40.69160 0 -1 0 + 1194 371 14 0.417 51.74755 62.21395 41.36660 0 -1 0 + 1195 372 13 -0.834 44.28377 63.70509 53.71234 -1 -2 -1 + 1196 372 14 0.417 44.98211 64.35001 53.59994 -1 -2 -1 + 1197 372 14 0.417 43.75271 63.78587 52.92008 -1 -2 -1 + 1198 373 13 -0.834 61.50835 48.76378 34.91047 0 0 -1 + 1199 373 14 0.417 61.23254 49.09753 34.05678 0 0 -1 + 1200 373 14 0.417 61.51672 49.53447 35.47812 0 0 -1 + 1201 374 13 -0.834 61.51337 41.63477 44.26291 -1 -1 0 + 1202 374 14 0.417 62.42662 41.58544 44.54543 -1 -1 0 + 1203 374 14 0.417 61.34749 68.16405 43.83907 -1 -2 0 + 1204 375 13 -0.834 57.73267 43.39213 33.64792 0 -1 0 + 1205 375 14 0.417 58.46456 43.28438 34.25535 0 -1 0 + 1206 375 14 0.417 58.09278 43.15396 32.79362 0 -1 0 + 1207 376 13 -0.834 63.51473 49.31549 51.59705 -1 1 -1 + 1208 376 14 0.417 63.13045 49.03534 50.76631 -1 1 -1 + 1209 376 14 0.417 62.84038 49.86142 52.00137 -1 1 -1 + 1210 377 13 -0.834 58.21462 44.79010 54.73553 -1 -1 -1 + 1211 377 14 0.417 58.08068 43.94884 55.17209 -1 -1 -1 + 1212 377 14 0.417 57.81645 44.67856 53.87224 -1 -1 -1 + 1213 378 13 -0.834 57.08090 55.14561 52.86183 0 -2 1 + 1214 378 14 0.417 57.05215 55.46811 53.76261 0 -2 1 + 1215 378 14 0.417 57.69965 54.41575 52.88786 0 -2 1 + 1216 379 13 -0.834 60.83502 54.45436 45.82182 1 0 -1 + 1217 379 14 0.417 61.05342 55.38616 45.83857 1 0 -1 + 1218 379 14 0.417 60.79443 54.20077 46.74392 1 0 -1 + 1219 380 13 -0.834 60.86442 48.23162 37.95658 0 0 2 + 1220 380 14 0.417 61.77710 48.43881 37.75572 0 0 2 + 1221 380 14 0.417 60.87611 47.30540 38.19788 0 0 2 + 1222 381 13 -0.834 43.21478 43.26953 44.97859 2 1 -1 + 1223 381 14 0.417 42.50778 42.78849 44.54850 2 1 -1 + 1224 381 14 0.417 43.42173 42.74895 45.75474 2 1 -1 + 1225 382 13 -0.834 39.01904 49.57571 48.28198 1 -1 -1 + 1226 382 14 0.417 38.68877 49.32064 47.42052 1 -1 -1 + 1227 382 14 0.417 38.42357 50.26661 48.57234 1 -1 -1 + 1228 383 13 -0.834 47.20253 45.34580 30.26781 0 0 1 + 1229 383 14 0.417 47.05738 44.40526 30.16508 0 0 1 + 1230 383 14 0.417 46.80592 45.73631 56.86044 0 0 0 + 1231 384 13 -0.834 44.57742 55.88746 33.53830 0 -1 0 + 1232 384 14 0.417 45.13093 56.49768 33.05096 0 -1 0 + 1233 384 14 0.417 44.41092 55.17196 32.92464 0 -1 0 + 1234 385 13 -0.834 42.17091 64.36626 51.74369 1 0 0 + 1235 385 14 0.417 41.78583 65.24128 51.69570 1 0 0 + 1236 385 14 0.417 41.41926 63.77568 51.79343 1 0 0 + 1237 386 13 -0.834 43.82615 43.47821 52.97551 0 0 0 + 1238 386 14 0.417 43.64099 42.56407 52.76025 0 0 0 + 1239 386 14 0.417 44.58924 43.43914 53.55207 0 0 0 + 1240 387 13 -0.834 63.58286 63.91035 38.47173 0 -1 -1 + 1241 387 14 0.417 64.14591 63.71296 39.22023 0 -1 -1 + 1242 387 14 0.417 62.70901 64.01191 38.84896 0 -1 -1 + 1243 388 13 -0.834 57.85225 42.19019 46.82252 1 1 -2 + 1244 388 14 0.417 57.61712 42.29475 47.74450 1 1 -2 + 1245 388 14 0.417 57.29406 42.81537 46.36013 1 1 -2 + 1246 389 13 -0.834 57.90802 64.30101 52.26362 1 0 1 + 1247 389 14 0.417 58.43907 64.81717 52.87010 1 0 1 + 1248 389 14 0.417 58.54387 63.78888 51.76396 1 0 1 + 1249 390 13 -0.834 53.18379 66.68791 54.05156 1 -2 0 + 1250 390 14 0.417 52.23394 66.79510 54.00115 1 -2 0 + 1251 390 14 0.417 53.33447 65.77140 53.82015 1 -2 0 + 1252 391 13 -0.834 56.95394 68.26036 36.42711 -1 1 1 + 1253 391 14 0.417 56.91362 41.83232 36.58445 -1 2 1 + 1254 391 14 0.417 57.79173 67.98998 36.80292 -1 1 1 + 1255 392 13 -0.834 64.19252 44.20158 54.88143 0 0 0 + 1256 392 14 0.417 64.09322 45.07899 54.51194 0 0 0 + 1257 392 14 0.417 63.39239 43.74201 54.62684 0 0 0 + 1258 393 13 -0.834 63.10536 65.42626 48.53464 0 0 0 + 1259 393 14 0.417 62.79665 64.63036 48.10166 0 0 0 + 1260 393 14 0.417 62.77768 65.35429 49.43112 0 0 0 + 1261 394 13 -0.834 49.28836 66.20367 32.27628 1 -1 0 + 1262 394 14 0.417 49.46858 65.88738 33.16155 1 -1 0 + 1263 394 14 0.417 49.29197 65.41476 31.73420 1 -1 0 + 1264 395 13 -0.834 46.11216 66.09570 44.77896 0 -1 0 + 1265 395 14 0.417 45.90309 66.07762 45.71287 0 -1 0 + 1266 395 14 0.417 45.36137 65.67813 44.35683 0 -1 0 + 1267 396 13 -0.834 41.43943 50.30026 52.32584 1 0 0 + 1268 396 14 0.417 41.39866 49.93140 51.44351 1 0 0 + 1269 396 14 0.417 40.92759 49.69528 52.86275 1 0 0 + 1270 397 13 -0.834 54.69177 57.80859 32.50623 0 -1 -1 + 1271 397 14 0.417 53.99890 57.66594 31.86139 0 -1 -1 + 1272 397 14 0.417 54.37599 57.37325 33.29806 0 -1 -1 + 1273 398 13 -0.834 43.56781 46.79065 37.17838 0 1 0 + 1274 398 14 0.417 43.18325 46.24795 36.49004 0 1 0 + 1275 398 14 0.417 44.03819 46.17194 37.73711 0 1 0 + 1276 399 13 -0.834 55.33436 45.90772 50.69068 -1 0 0 + 1277 399 14 0.417 55.55455 46.77982 51.01809 -1 0 0 + 1278 399 14 0.417 55.09425 46.04877 49.77488 -1 0 0 + 1279 400 13 -0.834 56.15383 51.87018 43.92178 -1 0 1 + 1280 400 14 0.417 55.25073 52.12373 44.11256 -1 0 1 + 1281 400 14 0.417 56.65027 52.68628 43.98319 -1 0 1 + 1282 401 13 -0.834 62.38946 50.01240 45.94802 0 1 -2 + 1283 401 14 0.417 62.43815 50.07607 44.99418 0 1 -2 + 1284 401 14 0.417 61.47369 50.19932 46.15457 0 1 -2 + 1285 402 13 -0.834 53.60920 58.35575 46.37412 0 0 1 + 1286 402 14 0.417 53.25556 59.03071 45.79481 0 0 1 + 1287 402 14 0.417 53.24753 57.53627 46.03666 0 0 1 + 1288 403 13 -0.834 43.13375 42.07203 50.04429 1 0 0 + 1289 403 14 0.417 43.76099 42.76922 49.85267 1 0 0 + 1290 403 14 0.417 42.35437 42.53016 50.35879 1 0 0 + 1291 404 13 -0.834 47.41498 59.41146 52.77687 -1 -1 0 + 1292 404 14 0.417 47.81303 59.83868 53.53534 -1 -1 0 + 1293 404 14 0.417 48.01011 59.60512 52.05261 -1 -1 0 + 1294 405 13 -0.834 63.75607 47.28104 38.80571 0 2 -1 + 1295 405 14 0.417 63.78573 48.20840 38.57042 0 2 -1 + 1296 405 14 0.417 37.08655 47.17376 39.44769 1 2 -1 + 1297 406 13 -0.834 46.67594 56.20863 44.42866 1 1 0 + 1298 406 14 0.417 45.82140 56.15280 44.00100 1 1 0 + 1299 406 14 0.417 46.48292 56.12468 45.36243 1 1 0 + 1300 407 13 -0.834 62.54251 68.21194 54.20445 0 -1 1 + 1301 407 14 0.417 63.31640 41.15490 53.73696 0 0 1 + 1302 407 14 0.417 62.78865 67.34176 54.51819 0 -1 1 + 1303 408 13 -0.834 60.27010 54.96049 39.87633 0 0 0 + 1304 408 14 0.417 59.62959 55.67175 39.88547 0 0 0 + 1305 408 14 0.417 61.04761 55.33233 40.29281 0 0 0 + 1306 409 13 -0.834 40.02595 44.30132 44.29580 0 -2 0 + 1307 409 14 0.417 39.70595 44.75009 45.07839 0 -2 0 + 1308 409 14 0.417 39.56836 44.72725 43.57092 0 -2 0 + 1309 410 13 -0.834 54.20011 41.08252 35.61017 0 1 0 + 1310 410 14 0.417 55.10396 68.23613 35.83794 0 0 0 + 1311 410 14 0.417 54.27044 41.57221 34.79072 0 1 0 + 1312 411 13 -0.834 60.64478 45.93023 50.84376 1 1 -1 + 1313 411 14 0.417 60.80088 46.54647 51.55941 1 1 -1 + 1314 411 14 0.417 61.20574 46.24077 50.13303 1 1 -1 + 1315 412 13 -0.834 44.55137 44.47403 38.16771 1 0 -1 + 1316 412 14 0.417 45.28189 43.86333 38.26597 1 0 -1 + 1317 412 14 0.417 43.77025 43.93754 38.30281 1 0 -1 + 1318 413 13 -0.834 58.08933 62.76987 30.45191 1 -1 0 + 1319 413 14 0.417 57.64138 63.31997 29.80927 1 -1 0 + 1320 413 14 0.417 57.43674 62.11708 30.70545 1 -1 0 + 1321 414 13 -0.834 55.65273 56.71117 38.74877 1 0 1 + 1322 414 14 0.417 56.53260 56.59636 39.10779 1 0 1 + 1323 414 14 0.417 55.14964 55.98047 39.10825 1 0 1 + 1324 415 13 -0.834 55.50009 51.16952 38.77962 0 0 0 + 1325 415 14 0.417 54.95350 51.23711 37.99672 0 0 0 + 1326 415 14 0.417 55.53220 50.23190 38.96963 0 0 0 + 1327 416 13 -0.834 47.64702 52.79911 31.71446 0 -1 0 + 1328 416 14 0.417 48.52504 53.09556 31.47481 0 -1 0 + 1329 416 14 0.417 47.06032 53.44853 31.32681 0 -1 0 + 1330 417 13 -0.834 49.26727 42.35880 39.18566 1 1 -2 + 1331 417 14 0.417 50.02784 42.93912 39.15429 1 1 -2 + 1332 417 14 0.417 49.46495 41.74196 39.89040 1 1 -2 + 1333 418 13 -0.834 47.22542 64.65021 35.82232 1 -1 0 + 1334 418 14 0.417 46.76114 65.20346 36.45050 1 -1 0 + 1335 418 14 0.417 47.98585 65.16966 35.56120 1 -1 0 + 1336 419 13 -0.834 58.53686 56.85468 40.78587 1 1 0 + 1337 419 14 0.417 58.45283 56.63469 41.71365 1 1 0 + 1338 419 14 0.417 58.36285 57.79507 40.74550 1 1 0 + 1339 420 13 -0.834 50.09436 46.17981 48.16619 -1 -1 -2 + 1340 420 14 0.417 50.67249 45.42897 48.30138 -1 -1 -2 + 1341 420 14 0.417 50.49629 46.88624 48.67183 -1 -1 -2 + 1342 421 13 -0.834 42.30297 57.95379 33.48633 0 -1 1 + 1343 421 14 0.417 41.56921 57.39445 33.23136 0 -1 1 + 1344 421 14 0.417 43.00718 57.34235 33.70193 0 -1 1 + 1345 422 13 -0.834 45.76518 43.79811 54.82490 0 -1 0 + 1346 422 14 0.417 46.45133 43.55343 54.20397 0 -1 0 + 1347 422 14 0.417 45.87205 43.18693 55.55379 0 -1 0 + 1348 423 13 -0.834 59.33326 61.34125 37.96927 -1 -1 1 + 1349 423 14 0.417 59.29007 62.29004 38.08827 -1 -1 1 + 1350 423 14 0.417 59.90006 61.03609 38.67769 -1 -1 1 + 1351 424 13 -0.834 40.95662 63.48104 42.72192 1 -1 0 + 1352 424 14 0.417 40.33618 63.69074 42.02383 1 -1 0 + 1353 424 14 0.417 41.73946 63.17568 42.26346 1 -1 0 + 1354 425 13 -0.834 38.13662 59.25720 46.08402 1 -1 -1 + 1355 425 14 0.417 38.31499 59.03616 46.99811 1 -1 -1 + 1356 425 14 0.417 38.55502 58.55783 45.58196 1 -1 -1 + 1357 426 13 -0.834 48.88681 66.85051 54.82298 1 -2 0 + 1358 426 14 0.417 49.16879 67.45078 54.13275 1 -2 0 + 1359 426 14 0.417 49.42353 66.06836 54.69484 1 -2 0 + 1360 427 13 -0.834 45.88049 57.05477 48.46508 0 0 -1 + 1361 427 14 0.417 45.73709 57.90911 48.05793 0 0 -1 + 1362 427 14 0.417 45.83791 57.22701 49.40569 0 0 -1 + 1363 428 13 -0.834 39.37333 50.31613 37.93447 0 1 0 + 1364 428 14 0.417 39.11456 50.97624 37.29140 0 1 0 + 1365 428 14 0.417 38.97424 50.60960 38.75352 0 1 0 + 1366 429 13 -0.834 37.89753 62.82745 47.39297 0 -1 0 + 1367 429 14 0.417 38.39122 62.78202 46.57414 0 -1 0 + 1368 429 14 0.417 37.01605 63.08963 47.12747 0 -1 0 + 1369 430 13 -0.834 43.16514 41.31420 47.01379 0 1 0 + 1370 430 14 0.417 42.71409 41.22965 47.85382 0 1 0 + 1371 430 14 0.417 44.05112 68.36565 47.18386 0 0 0 + 1372 431 13 -0.834 47.03179 42.44477 42.46475 1 0 0 + 1373 431 14 0.417 46.12350 42.65285 42.24573 1 0 0 + 1374 431 14 0.417 47.53228 43.19970 42.15516 1 0 0 + 1375 432 13 -0.834 55.35894 54.15040 46.85340 0 -1 0 + 1376 432 14 0.417 54.76544 53.43667 46.61975 0 -1 0 + 1377 432 14 0.417 56.17133 53.71318 47.10853 0 -1 0 + 1378 433 13 -0.834 47.00663 55.28313 38.22800 -1 -2 1 + 1379 433 14 0.417 46.53490 56.00706 38.63987 -1 -2 1 + 1380 433 14 0.417 47.07459 54.61953 38.91449 -1 -2 1 + 1381 434 13 -0.834 57.16336 58.62297 32.33349 -1 0 2 + 1382 434 14 0.417 57.63330 57.80350 32.48798 -1 0 2 + 1383 434 14 0.417 56.24209 58.36680 32.29014 -1 0 2 + 1384 435 13 -0.834 37.23245 47.62479 56.34765 0 1 -1 + 1385 435 14 0.417 37.24274 47.21497 55.48268 0 1 -1 + 1386 435 14 0.417 37.36000 46.89905 56.95860 0 1 -1 + 1387 436 13 -0.834 48.77030 41.06015 29.86683 2 1 0 + 1388 436 14 0.417 48.81141 67.97117 56.39997 2 0 -1 + 1389 436 14 0.417 49.05230 67.78232 30.51123 2 0 0 + 1390 437 13 -0.834 49.10149 56.15638 36.66346 0 0 1 + 1391 437 14 0.417 48.50786 55.61659 36.14146 0 0 1 + 1392 437 14 0.417 48.61812 56.33305 37.47053 0 0 1 + 1393 438 13 -0.834 58.15731 59.39698 29.96092 0 -1 1 + 1394 438 14 0.417 58.20240 59.10993 30.87296 0 -1 1 + 1395 438 14 0.417 57.30076 59.81721 29.88367 0 -1 1 + 1396 439 13 -0.834 59.37068 41.03089 37.87324 1 0 0 + 1397 439 14 0.417 59.56889 41.95335 37.71194 1 0 0 + 1398 439 14 0.417 60.22643 67.97433 37.90167 1 -1 0 + 1399 440 13 -0.834 38.32241 55.03397 50.58952 1 0 0 + 1400 440 14 0.417 38.22793 54.19584 50.13692 1 0 0 + 1401 440 14 0.417 39.21785 55.31153 50.39614 1 0 0 + 1402 441 13 -0.834 36.94673 59.01778 33.00159 1 -1 2 + 1403 441 14 0.417 36.95260 59.97305 32.94091 1 -1 2 + 1404 441 14 0.417 63.71798 58.82680 33.72245 0 -1 2 + 1405 442 13 -0.834 62.50746 54.84239 54.03343 0 -1 0 + 1406 442 14 0.417 61.69710 54.35984 54.19681 0 -1 0 + 1407 442 14 0.417 63.09119 54.20097 53.62833 0 -1 0 + 1408 443 13 -0.834 40.59690 62.80012 38.69405 1 -1 1 + 1409 443 14 0.417 41.53881 62.90970 38.82458 1 -1 1 + 1410 443 14 0.417 40.36980 62.03187 39.21794 1 -1 1 + 1411 444 13 -0.834 37.67477 67.71471 42.59127 0 -1 -1 + 1412 444 14 0.417 38.12213 68.13627 41.85751 0 -1 -1 + 1413 444 14 0.417 38.28279 67.03643 42.88534 0 -1 -1 + 1414 445 13 -0.834 42.73681 50.65782 33.30839 1 1 0 + 1415 445 14 0.417 42.84587 51.15085 34.12157 1 1 0 + 1416 445 14 0.417 42.32631 51.27747 32.70527 1 1 0 + 1417 446 13 -0.834 37.13349 57.05842 55.81927 0 0 0 + 1418 446 14 0.417 37.95375 57.53453 55.68979 0 0 0 + 1419 446 14 0.417 36.99014 56.59807 54.99236 0 0 0 + 1420 447 13 -0.834 61.08039 63.50929 36.52096 -1 0 0 + 1421 447 14 0.417 60.44389 63.87414 37.13579 -1 0 0 + 1422 447 14 0.417 61.70642 63.04107 37.07331 -1 0 0 + 1423 448 13 -0.834 57.12289 46.04019 38.75954 0 0 0 + 1424 448 14 0.417 56.81351 45.55997 39.52760 0 0 0 + 1425 448 14 0.417 57.99543 45.68504 38.58988 0 0 0 + 1426 449 13 -0.834 45.45003 49.45347 49.54397 0 0 -1 + 1427 449 14 0.417 45.96611 49.34591 48.74502 0 0 -1 + 1428 449 14 0.417 46.09930 49.60861 50.22999 0 0 -1 + 1429 450 13 -0.834 37.77009 64.51990 42.66941 1 0 0 + 1430 450 14 0.417 38.49339 64.80040 43.23011 1 0 0 + 1431 450 14 0.417 38.14071 64.50928 41.78694 1 0 0 + 1432 451 13 -0.834 45.78323 57.65378 39.37062 1 0 0 + 1433 451 14 0.417 46.03758 58.03295 40.21190 1 0 0 + 1434 451 14 0.417 44.96217 58.09258 39.14803 1 0 0 + 1435 452 13 -0.834 56.96672 60.41636 47.59314 0 -1 1 + 1436 452 14 0.417 56.18373 60.11455 48.05365 0 -1 1 + 1437 452 14 0.417 56.65889 61.13663 47.04297 0 -1 1 + 1438 453 13 -0.834 52.44356 65.82746 35.82081 -1 -1 0 + 1439 453 14 0.417 53.10567 65.14225 35.91211 -1 -1 0 + 1440 453 14 0.417 52.93741 66.64611 35.86748 -1 -1 0 + 1441 454 13 -0.834 50.70912 51.42252 40.30021 0 0 -1 + 1442 454 14 0.417 50.97387 50.70177 39.72866 0 0 -1 + 1443 454 14 0.417 50.17774 51.98938 39.74116 0 0 -1 + 1444 455 13 -0.834 39.22290 45.94023 39.69239 2 1 -1 + 1445 455 14 0.417 39.63836 46.66722 39.22859 2 1 -1 + 1446 455 14 0.417 38.97218 45.32685 39.00164 2 1 -1 + 1447 456 13 -0.834 43.73041 61.86387 55.46954 2 0 0 + 1448 456 14 0.417 43.61274 62.32163 56.30192 2 0 0 + 1449 456 14 0.417 43.90401 62.55964 54.83549 2 0 0 + 1450 457 13 -0.834 61.51877 56.42039 33.84869 0 0 1 + 1451 457 14 0.417 62.17805 55.74211 33.70200 0 0 1 + 1452 457 14 0.417 62.00943 57.15723 34.21276 0 0 1 + 1453 458 13 -0.834 51.72050 63.63199 42.34406 1 0 1 + 1454 458 14 0.417 51.24482 64.43296 42.56407 1 0 1 + 1455 458 14 0.417 52.62118 63.92057 42.19669 1 0 1 + 1456 459 13 -0.834 54.73666 56.51839 51.73687 0 0 -1 + 1457 459 14 0.417 54.77503 56.56844 52.69200 0 0 -1 + 1458 459 14 0.417 54.91702 57.41111 51.44234 0 0 -1 + 1459 460 13 -0.834 50.97984 54.35591 33.27919 0 1 0 + 1460 460 14 0.417 50.47200 55.12727 33.02747 0 1 0 + 1461 460 14 0.417 50.36917 53.82187 33.78725 0 1 0 + 1462 461 13 -0.834 44.82656 54.45280 36.09973 1 0 2 + 1463 461 14 0.417 45.75766 54.23599 36.14740 1 0 2 + 1464 461 14 0.417 44.76968 55.11700 35.41283 1 0 2 + 1465 462 13 -0.834 58.05791 56.64716 55.29041 1 1 0 + 1466 462 14 0.417 58.98499 56.81997 55.45441 1 1 0 + 1467 462 14 0.417 57.82639 55.96338 55.91897 1 1 0 + 1468 463 13 -0.834 55.95112 61.02029 30.79757 1 0 1 + 1469 463 14 0.417 55.28483 61.63344 30.48711 1 0 1 + 1470 463 14 0.417 55.45357 60.27206 31.12748 1 0 1 + 1471 464 13 -0.834 54.80996 46.88659 45.41700 -1 0 0 + 1472 464 14 0.417 55.42348 46.16300 45.28950 -1 0 0 + 1473 464 14 0.417 54.08129 46.68997 44.82826 -1 0 0 + 1474 465 13 -0.834 60.19361 64.43268 31.92053 0 -1 2 + 1475 465 14 0.417 60.05792 63.85315 32.67017 0 -1 2 + 1476 465 14 0.417 60.47170 63.84993 31.21392 0 -1 2 + 1477 466 13 -0.834 45.55496 65.56032 30.88251 0 -1 1 + 1478 466 14 0.417 45.97644 64.70102 30.89691 0 -1 1 + 1479 466 14 0.417 45.82502 65.97384 31.70248 0 -1 1 + 1480 467 13 -0.834 52.92714 44.06759 29.88429 0 1 0 + 1481 467 14 0.417 52.39641 43.38446 30.29405 0 1 0 + 1482 467 14 0.417 53.79372 43.96686 30.27818 0 1 0 + 1483 468 13 -0.834 40.71534 55.31247 44.93070 1 0 0 + 1484 468 14 0.417 39.81994 55.07165 45.16841 1 0 0 + 1485 468 14 0.417 41.16802 54.47609 44.82218 1 0 0 + 1486 469 13 -0.834 64.04777 59.80626 42.91634 0 -1 -1 + 1487 469 14 0.417 37.09051 60.51146 43.41377 1 -1 -1 + 1488 469 14 0.417 37.01609 59.00291 43.31068 1 -1 -1 + 1489 470 13 -0.834 57.05030 49.72625 41.88829 -1 1 1 + 1490 470 14 0.417 56.75150 50.53290 42.30818 -1 1 1 + 1491 470 14 0.417 57.52176 50.02159 41.10935 -1 1 1 + 1492 471 13 -0.834 62.59447 67.67898 41.14714 -2 -2 1 + 1493 471 14 0.417 63.45155 67.57764 41.56112 -2 -2 1 + 1494 471 14 0.417 61.96974 67.40478 41.81854 -2 -2 1 + 1495 472 13 -0.834 62.98029 58.34420 35.34278 0 0 1 + 1496 472 14 0.417 62.45371 58.26151 36.13783 0 0 1 + 1497 472 14 0.417 63.83636 58.64077 35.65169 0 0 1 + 1498 473 13 -0.834 63.44584 56.74146 44.14484 0 1 -2 + 1499 473 14 0.417 64.13590 56.53036 44.77371 0 1 -2 + 1500 473 14 0.417 62.70665 57.02149 44.68470 0 1 -2 + 1501 474 13 -0.834 44.05905 56.56929 51.60681 1 0 -1 + 1502 474 14 0.417 43.57850 56.15764 52.32504 1 0 -1 + 1503 474 14 0.417 43.90344 55.99747 50.85512 1 0 -1 + 1504 475 13 -0.834 37.49588 59.31379 39.05252 0 0 0 + 1505 475 14 0.417 37.07904 58.45297 39.09112 0 0 0 + 1506 475 14 0.417 37.58867 59.49374 38.11696 0 0 0 + 1507 476 13 -0.834 54.75747 41.52122 56.48609 -1 1 0 + 1508 476 14 0.417 54.79987 42.39714 56.86981 -1 1 0 + 1509 476 14 0.417 54.80582 41.67034 55.54179 -1 1 0 + 1510 477 13 -0.834 42.91665 58.39379 47.91495 1 0 0 + 1511 477 14 0.417 43.70923 58.91951 47.80683 1 0 0 + 1512 477 14 0.417 42.28811 58.98861 48.32409 1 0 0 + 1513 478 13 -0.834 60.63731 64.78822 56.03697 -2 1 -1 + 1514 478 14 0.417 60.86485 63.91302 56.35082 -2 1 -1 + 1515 478 14 0.417 60.50973 65.30321 56.83369 -2 1 -1 + 1516 479 13 -0.834 52.85180 54.69512 43.09842 0 0 1 + 1517 479 14 0.417 52.31485 55.13373 42.43846 0 0 1 + 1518 479 14 0.417 53.08000 53.85428 42.70200 0 0 1 + 1519 480 13 -0.834 51.49497 54.97356 38.95012 -2 1 -1 + 1520 480 14 0.417 50.77717 54.34090 38.97811 -2 1 -1 + 1521 480 14 0.417 51.51597 55.35169 39.82923 -2 1 -1 + 1522 481 13 -0.834 40.46924 62.02458 56.36341 1 0 -1 + 1523 481 14 0.417 40.45814 61.65439 55.48076 1 0 -1 + 1524 481 14 0.417 40.81799 62.90856 56.24853 1 0 -1 + 1525 482 13 -0.834 52.26692 56.29032 45.24820 0 2 1 + 1526 482 14 0.417 51.65227 56.79794 44.71834 0 2 1 + 1527 482 14 0.417 52.43092 55.49973 44.73408 0 2 1 + 1528 483 13 -0.834 53.46372 44.63556 52.39623 -1 1 1 + 1529 483 14 0.417 53.51664 45.03502 53.26448 -1 1 1 + 1530 483 14 0.417 54.08491 45.13343 51.86474 -1 1 1 + 1531 484 13 -0.834 42.90202 49.87822 40.32919 0 2 1 + 1532 484 14 0.417 42.40392 49.63281 41.10889 0 2 1 + 1533 484 14 0.417 42.31302 50.45172 39.83885 0 2 1 + 1534 485 13 -0.834 43.07357 64.57931 39.44006 2 1 1 + 1535 485 14 0.417 42.79300 64.80186 38.55237 2 1 1 + 1536 485 14 0.417 43.26869 65.42268 39.84860 2 1 1 + 1537 486 13 -0.834 38.86691 42.35197 55.12826 1 1 -1 + 1538 486 14 0.417 38.06621 42.87541 55.16185 1 1 -1 + 1539 486 14 0.417 39.52681 42.89488 55.55954 1 1 -1 + 1540 487 13 -0.834 59.15412 47.19863 55.46904 0 -1 0 + 1541 487 14 0.417 59.83963 46.99833 56.10636 0 -1 0 + 1542 487 14 0.417 58.74433 46.35364 55.28381 0 -1 0 + 1543 488 13 -0.834 52.12071 45.94110 44.23903 1 1 0 + 1544 488 14 0.417 51.89927 45.05144 44.51416 1 1 0 + 1545 488 14 0.417 52.26697 45.87115 43.29566 1 1 0 + 1546 489 13 -0.834 41.73140 52.23741 31.27732 0 0 1 + 1547 489 14 0.417 40.84403 52.55314 31.44796 0 0 1 + 1548 489 14 0.417 41.81503 52.26011 30.32405 0 0 1 + 1549 490 13 -0.834 38.46034 66.01701 52.27886 1 0 -1 + 1550 490 14 0.417 39.39276 66.02392 52.49517 1 0 -1 + 1551 490 14 0.417 38.11246 66.80769 52.69121 1 0 -1 + 1552 491 13 -0.834 42.13838 67.12262 54.88509 0 0 -3 + 1553 491 14 0.417 42.22460 67.38235 53.96784 0 0 -3 + 1554 491 14 0.417 42.96673 67.38388 55.28736 0 0 -3 + 1555 492 13 -0.834 37.89607 66.86351 46.16867 -1 -1 -1 + 1556 492 14 0.417 38.03129 66.98073 47.10899 -1 -1 -1 + 1557 492 14 0.417 38.75367 66.60168 45.83369 -1 -1 -1 + 1558 493 13 -0.834 40.37538 58.21424 30.88318 0 -1 0 + 1559 493 14 0.417 41.23010 58.63566 30.79307 0 -1 0 + 1560 493 14 0.417 40.45502 57.40101 30.38463 0 -1 0 + 1561 494 13 -0.834 54.56531 48.85249 32.17940 1 -2 2 + 1562 494 14 0.417 54.90082 48.98086 31.29216 1 -2 2 + 1563 494 14 0.417 54.03604 49.63141 32.35086 1 -2 2 + 1564 495 13 -0.834 63.56488 49.70113 37.88594 0 -1 1 + 1565 495 14 0.417 63.93261 49.40780 37.05228 0 -1 1 + 1566 495 14 0.417 63.98151 50.54765 38.04739 0 -1 1 + 1567 496 13 -0.834 39.26126 54.76920 54.71493 2 -1 2 + 1568 496 14 0.417 38.75402 55.21237 54.03483 2 -1 2 + 1569 496 14 0.417 38.67139 54.73109 55.46781 2 -1 2 + 1570 497 13 -0.834 42.78607 47.20625 49.30057 2 -1 0 + 1571 497 14 0.417 42.93670 46.34815 48.90404 2 -1 0 + 1572 497 14 0.417 43.53800 47.33917 49.87780 2 -1 0 + 1573 498 13 -0.834 59.99490 55.30114 50.55687 0 1 -1 + 1574 498 14 0.417 60.84158 55.66821 50.81111 0 1 -1 + 1575 498 14 0.417 59.38335 56.03363 50.63237 0 1 -1 + 1576 499 13 -0.834 57.95276 49.30660 54.37087 1 -1 -1 + 1577 499 14 0.417 57.34184 49.29544 55.10769 1 -1 -1 + 1578 499 14 0.417 58.55272 48.58151 54.54557 1 -1 -1 + 1579 500 13 -0.834 43.43041 64.04345 57.10111 1 -1 -1 + 1580 500 14 0.417 43.03742 64.07155 30.60210 1 -1 0 + 1581 500 14 0.417 44.26016 64.51104 29.82515 1 -1 0 + 1582 501 13 -0.834 40.71066 57.82778 50.85579 1 -1 -1 + 1583 501 14 0.417 41.04411 57.83612 51.75299 1 -1 -1 + 1584 501 14 0.417 40.96886 58.67633 50.49590 1 -1 -1 + 1585 502 13 -0.834 61.21331 60.53661 39.63578 1 -1 0 + 1586 502 14 0.417 61.87151 61.23113 39.61011 1 -1 0 + 1587 502 14 0.417 61.32085 60.13583 40.49837 1 -1 0 + 1588 503 13 -0.834 43.54081 65.33296 49.47114 1 -1 -1 + 1589 503 14 0.417 42.67637 65.41138 49.06762 1 -1 -1 + 1590 503 14 0.417 43.36562 64.99829 50.35065 1 -1 -1 + 1591 504 13 -0.834 50.27329 53.06087 30.87109 -1 0 1 + 1592 504 14 0.417 50.38769 53.42204 29.99204 -1 0 1 + 1593 504 14 0.417 50.86354 53.57620 31.42092 -1 0 1 + 1594 505 13 -0.834 40.29157 66.01889 32.67757 0 -1 0 + 1595 505 14 0.417 40.18198 66.27998 31.76320 0 -1 0 + 1596 505 14 0.417 39.39873 65.90460 33.00317 0 -1 0 + 1597 506 13 -0.834 48.15372 67.97019 44.25255 1 -1 1 + 1598 506 14 0.417 47.34263 67.52534 44.49854 1 -1 1 + 1599 506 14 0.417 47.87159 41.31478 43.68328 1 0 1 + 1600 507 13 -0.834 53.38019 63.98437 38.13827 0 0 -1 + 1601 507 14 0.417 54.19463 63.69976 37.72362 0 0 -1 + 1602 507 14 0.417 53.59582 64.82739 38.53711 0 0 -1 + 1603 508 13 -0.834 40.87597 58.12305 53.50808 0 0 0 + 1604 508 14 0.417 40.17916 58.26636 54.14852 0 0 0 + 1605 508 14 0.417 41.66044 58.48234 53.92256 0 0 0 + 1606 509 13 -0.834 38.19887 52.28056 36.30714 2 0 -1 + 1607 509 14 0.417 38.20463 53.19038 36.60452 2 0 -1 + 1608 509 14 0.417 38.09924 52.33929 35.35695 2 0 -1 + 1609 510 13 -0.834 49.63883 57.32410 43.72359 0 -1 0 + 1610 510 14 0.417 49.72446 58.17232 43.28833 0 -1 0 + 1611 510 14 0.417 48.76183 57.33851 44.10688 0 -1 0 + 1612 511 13 -0.834 42.58791 59.61362 29.86455 1 0 0 + 1613 511 14 0.417 43.07246 58.91969 56.78877 1 0 -1 + 1614 511 14 0.417 42.69535 60.38141 56.67447 1 0 -1 + 1615 512 13 -0.834 50.76111 60.95449 46.98165 -1 0 -1 + 1616 512 14 0.417 50.90477 61.15450 47.90663 -1 0 -1 + 1617 512 14 0.417 50.20825 61.66875 46.66473 -1 0 -1 + 1618 513 13 -0.834 43.18406 55.61939 48.08539 1 0 0 + 1619 513 14 0.417 43.11229 56.55752 47.90932 1 0 0 + 1620 513 14 0.417 44.01330 55.36231 47.68228 1 0 0 + 1621 514 13 -0.834 54.67377 64.76817 41.62522 1 0 1 + 1622 514 14 0.417 54.39407 65.19031 40.81294 1 0 1 + 1623 514 14 0.417 55.29742 65.38243 42.01250 1 0 1 + 1624 515 13 -0.834 53.87383 68.12810 51.72031 0 -1 0 + 1625 515 14 0.417 53.06918 41.24938 51.55887 0 0 0 + 1626 515 14 0.417 53.74278 67.72971 52.58074 0 -1 0 + 1627 516 13 -0.834 38.24785 41.26767 33.50598 2 0 0 + 1628 516 14 0.417 38.16490 67.75301 33.15337 2 -1 0 + 1629 516 14 0.417 37.95757 41.83753 32.79377 2 0 0 + 1630 517 13 -0.834 47.35008 61.96125 42.94580 2 -2 0 + 1631 517 14 0.417 47.46077 62.90828 43.03015 2 -2 0 + 1632 517 14 0.417 47.09087 61.83022 42.03373 2 -2 0 + 1633 518 13 -0.834 40.55210 54.00820 41.89137 1 -1 1 + 1634 518 14 0.417 39.80099 54.24986 41.34946 1 -1 1 + 1635 518 14 0.417 40.19429 53.40377 42.54166 1 -1 1 + 1636 519 13 -0.834 57.17705 64.40362 55.44286 1 -1 -1 + 1637 519 14 0.417 56.34510 64.78670 55.72097 1 -1 -1 + 1638 519 14 0.417 57.64987 65.12814 55.03330 1 -1 -1 + 1639 520 13 -0.834 41.86955 59.84132 42.65268 0 -1 1 + 1640 520 14 0.417 41.72011 59.11980 43.26367 0 -1 1 + 1641 520 14 0.417 42.24995 60.53605 43.19017 0 -1 1 + 1642 521 13 -0.834 61.62566 57.26645 46.18447 0 -1 -1 + 1643 521 14 0.417 60.68119 57.41642 46.22577 0 -1 -1 + 1644 521 14 0.417 61.98987 57.84356 46.85569 0 -1 -1 + 1645 522 13 -0.834 46.82701 65.68647 41.03579 0 0 0 + 1646 522 14 0.417 46.01385 65.85266 41.51264 0 0 0 + 1647 522 14 0.417 47.44009 65.38297 41.70531 0 0 0 + 1648 523 13 -0.834 54.12960 45.94549 32.81485 0 0 1 + 1649 523 14 0.417 53.25962 45.65636 32.53955 0 0 1 + 1650 523 14 0.417 54.18942 46.85072 32.50950 0 0 1 + 1651 524 13 -0.834 43.71268 59.97805 32.34985 1 1 0 + 1652 524 14 0.417 43.46300 59.27568 32.95033 1 1 0 + 1653 524 14 0.417 42.94131 60.10757 31.79808 1 1 0 + 1654 525 13 -0.834 50.10604 48.47250 49.62054 1 0 -2 + 1655 525 14 0.417 50.96037 48.77303 49.31064 1 0 -2 + 1656 525 14 0.417 50.19320 48.44287 50.57331 1 0 -2 + 1657 526 13 -0.834 54.68660 60.38920 43.62499 0 0 0 + 1658 526 14 0.417 54.62862 59.85089 42.83561 0 0 0 + 1659 526 14 0.417 53.78667 60.44045 43.94712 0 0 0 + 1660 527 13 -0.834 56.35115 44.75736 40.87552 0 -1 -1 + 1661 527 14 0.417 56.99705 44.99197 41.54186 0 -1 -1 + 1662 527 14 0.417 55.55387 44.56808 41.37024 0 -1 -1 + 1663 528 13 -0.834 48.77009 62.36934 40.44473 0 -1 0 + 1664 528 14 0.417 49.30266 62.60520 41.20432 0 -1 0 + 1665 528 14 0.417 49.04689 62.97756 39.75939 0 -1 0 + 1666 529 13 -0.834 45.88757 58.55209 41.94547 0 1 0 + 1667 529 14 0.417 46.76719 58.27665 42.20365 0 1 0 + 1668 529 14 0.417 45.35604 57.75963 42.02128 0 1 0 + 1669 530 13 -0.834 39.44116 52.22097 43.65725 1 0 2 + 1670 530 14 0.417 39.30570 52.06689 44.59221 1 0 2 + 1671 530 14 0.417 38.61744 52.60378 43.35530 1 0 2 + 1672 531 13 -0.834 43.95976 66.73852 41.23250 1 0 1 + 1673 531 14 0.417 44.64454 67.13772 40.69588 1 0 1 + 1674 531 14 0.417 43.40678 67.47232 41.50081 1 0 1 + 1675 532 13 -0.834 62.99634 65.50241 54.70446 0 -1 -1 + 1676 532 14 0.417 63.58398 64.98613 55.25617 0 -1 -1 + 1677 532 14 0.417 62.12519 65.14960 54.88585 0 -1 -1 + 1678 533 13 -0.834 62.92898 53.27582 44.77167 0 0 0 + 1679 533 14 0.417 62.08998 53.60880 45.09018 0 0 0 + 1680 533 14 0.417 62.85751 52.32504 44.85618 0 0 0 + 1681 534 13 -0.834 63.31201 43.08081 48.29805 -1 0 -1 + 1682 534 14 0.417 63.01276 42.23705 47.95930 -1 0 -1 + 1683 534 14 0.417 63.67142 43.53221 47.53431 -1 0 -1 + 1684 535 13 -0.834 47.11867 63.34781 55.06249 0 0 -1 + 1685 535 14 0.417 47.19267 64.30022 55.00160 0 0 -1 + 1686 535 14 0.417 46.22495 63.15783 54.77716 0 0 -1 + 1687 536 13 -0.834 60.37216 67.91341 52.27568 -1 0 0 + 1688 536 14 0.417 61.05051 68.14950 52.90839 -1 0 0 + 1689 536 14 0.417 60.81546 67.93922 51.42771 -1 0 0 + 1690 537 13 -0.834 60.04315 43.26291 35.25445 -1 1 1 + 1691 537 14 0.417 60.42501 44.05815 35.62593 -1 1 1 + 1692 537 14 0.417 60.79709 42.72574 35.01102 -1 1 1 + 1693 538 13 -0.834 53.03851 55.52589 47.75769 0 0 -1 + 1694 538 14 0.417 53.93635 55.46537 47.43136 0 0 -1 + 1695 538 14 0.417 52.51527 55.73342 46.98347 0 0 -1 + 1696 539 13 -0.834 37.91895 50.43697 56.37325 0 0 0 + 1697 539 14 0.417 37.51622 49.56884 56.35299 0 0 0 + 1698 539 14 0.417 38.37591 50.50915 55.53527 0 0 0 + 1699 540 13 -0.834 50.50006 63.56852 38.27177 1 1 0 + 1700 540 14 0.417 50.22462 63.18436 37.43944 1 1 0 + 1701 540 14 0.417 51.44083 63.71275 38.16986 1 1 0 + 1702 541 13 -0.834 49.44600 43.95446 42.01861 0 0 1 + 1703 541 14 0.417 49.59639 44.80378 41.60354 0 0 1 + 1704 541 14 0.417 49.73882 44.07372 42.92211 0 0 1 + 1705 542 13 -0.834 50.98365 47.23031 39.51901 1 0 1 + 1706 542 14 0.417 51.18743 48.09631 39.16579 1 0 1 + 1707 542 14 0.417 50.03928 47.13635 39.39410 1 0 1 + 1708 543 13 -0.834 45.54625 60.20130 44.30493 0 0 2 + 1709 543 14 0.417 46.27140 60.62480 43.84553 0 0 2 + 1710 543 14 0.417 45.09838 59.69256 43.62904 0 0 2 + 1711 544 13 -0.834 60.48207 53.69772 48.42686 0 0 1 + 1712 544 14 0.417 60.03677 54.31581 49.00644 0 0 1 + 1713 544 14 0.417 59.89364 52.94407 48.38216 0 0 1 + 1714 545 13 -0.834 63.04952 45.83903 48.97963 -1 1 1 + 1715 545 14 0.417 63.88202 45.63831 49.40729 -1 1 1 + 1716 545 14 0.417 62.76408 45.00498 48.60667 -1 1 1 + 1717 546 13 -0.834 40.62890 44.95273 52.60003 2 -1 -2 + 1718 546 14 0.417 41.29110 45.55853 52.26721 2 -1 -2 + 1719 546 14 0.417 40.33885 45.34348 53.42431 2 -1 -2 + 1720 547 13 -0.834 39.91743 46.12102 55.72693 -1 1 -1 + 1721 547 14 0.417 40.70381 45.68274 56.05216 -1 1 -1 + 1722 547 14 0.417 39.19323 45.65943 56.14967 -1 1 -1 + 1723 548 13 -0.834 42.06829 45.07566 41.79962 0 0 -1 + 1724 548 14 0.417 41.61985 45.91039 41.93531 0 0 -1 + 1725 548 14 0.417 41.86481 44.56390 42.58253 0 0 -1 + 1726 549 13 -0.834 44.17588 49.40877 37.86902 1 1 0 + 1727 549 14 0.417 43.85185 49.35470 38.76808 1 1 0 + 1728 549 14 0.417 43.95346 48.56183 37.48242 1 1 0 + 1729 550 13 -0.834 52.64793 63.92130 45.68237 0 1 0 + 1730 550 14 0.417 52.63502 62.96908 45.58561 0 1 0 + 1731 550 14 0.417 52.43571 64.07178 46.60356 0 1 0 + 1732 551 13 -0.834 51.57615 43.64864 38.83377 1 1 0 + 1733 551 14 0.417 51.74260 43.03820 38.11551 1 1 0 + 1734 551 14 0.417 52.20192 44.35945 38.69449 1 1 0 + 1735 552 13 -0.834 62.02099 63.12241 47.73587 0 1 0 + 1736 552 14 0.417 61.17806 62.75352 47.99973 0 1 0 + 1737 552 14 0.417 62.48263 62.39363 47.32116 0 1 0 + 1738 553 13 -0.834 38.41497 51.40373 50.93034 1 1 0 + 1739 553 14 0.417 37.60807 51.12879 50.49494 1 1 0 + 1740 553 14 0.417 38.99796 51.65996 50.21571 1 1 0 + 1741 554 13 -0.834 51.96339 44.25313 49.02477 0 0 0 + 1742 554 14 0.417 52.81680 44.60151 49.28274 0 0 0 + 1743 554 14 0.417 52.16570 43.57682 48.37831 0 0 0 + 1744 555 13 -0.834 43.58422 51.42052 49.88959 0 1 -1 + 1745 555 14 0.417 42.74054 51.00549 50.06897 0 1 -1 + 1746 555 14 0.417 44.20160 50.69175 49.82657 0 1 -1 + 1747 556 13 -0.834 52.39836 53.43568 49.29165 1 0 -1 + 1748 556 14 0.417 51.88756 52.90169 48.68323 1 0 -1 + 1749 556 14 0.417 52.64451 54.20889 48.78391 1 0 -1 + 1750 557 13 -0.834 57.76885 46.61656 49.32842 0 1 0 + 1751 557 14 0.417 57.83718 46.26991 48.43879 0 1 0 + 1752 557 14 0.417 58.65246 46.53329 49.68694 0 1 0 + 1753 558 13 -0.834 59.20868 56.75211 36.79427 0 1 -1 + 1754 558 14 0.417 59.74268 56.20033 36.22276 0 1 -1 + 1755 558 14 0.417 58.75094 56.13459 37.36470 0 1 -1 + 1756 559 13 -0.834 51.74055 42.45875 36.24184 0 1 1 + 1757 559 14 0.417 51.04879 41.79745 36.22260 0 1 1 + 1758 559 14 0.417 52.52794 41.99055 35.96429 0 1 1 + 1759 560 13 -0.834 56.37631 67.32150 33.05439 -1 0 1 + 1760 560 14 0.417 56.52797 66.39716 33.25152 -1 0 1 + 1761 560 14 0.417 56.88845 67.79399 33.71068 -1 0 1 + 1762 561 13 -0.834 54.61713 62.99597 56.69158 0 1 -1 + 1763 561 14 0.417 54.59393 63.94258 56.83172 0 1 -1 + 1764 561 14 0.417 54.12883 62.86158 55.87934 0 1 -1 + 1765 562 13 -0.834 59.12420 67.78462 34.49420 0 -1 1 + 1766 562 14 0.417 59.61921 67.94665 33.69111 0 -1 1 + 1767 562 14 0.417 59.22686 41.21594 35.00547 0 0 1 + 1768 563 13 -0.834 63.35827 53.14027 38.43168 -1 0 0 + 1769 563 14 0.417 62.48186 53.05933 38.05538 -1 0 0 + 1770 563 14 0.417 63.87715 53.55740 37.74392 -1 0 0 + 1771 564 13 -0.834 50.05518 64.80335 44.94078 1 0 -2 + 1772 564 14 0.417 50.16173 65.71408 44.66608 1 0 -2 + 1773 564 14 0.417 50.94818 64.48993 45.08424 1 0 -2 + 1774 565 13 -0.834 61.91076 61.67486 44.00650 0 -3 0 + 1775 565 14 0.417 61.40514 60.86646 44.09077 0 -3 0 + 1776 565 14 0.417 62.58390 61.60857 44.68380 0 -3 0 + 1777 566 13 -0.834 61.53884 41.33016 50.02212 -1 0 -1 + 1778 566 14 0.417 61.75835 68.35836 49.15591 -1 -1 -1 + 1779 566 14 0.417 62.19075 42.01255 50.18215 -1 0 -1 + 1780 567 13 -0.834 54.81641 49.94673 49.66324 0 -1 -1 + 1781 567 14 0.417 54.81533 50.72359 50.22249 0 -1 -1 + 1782 567 14 0.417 53.94410 49.93341 49.26932 0 -1 -1 + 1783 568 13 -0.834 60.68933 64.00249 53.56679 -1 -1 -1 + 1784 568 14 0.417 60.72666 63.10922 53.90872 -1 -1 -1 + 1785 568 14 0.417 60.37485 64.52808 54.30238 -1 -1 -1 + 1786 569 13 -0.834 55.51605 42.60469 53.96890 0 -1 0 + 1787 569 14 0.417 55.82084 42.66633 53.06360 0 -1 0 + 1788 569 14 0.417 54.99565 43.39708 54.10137 0 -1 0 + 1789 570 13 -0.834 43.79008 68.23755 52.31171 2 -1 1 + 1790 570 14 0.417 43.47705 41.06627 51.42954 2 0 1 + 1791 570 14 0.417 44.72624 68.07073 52.20206 2 -1 1 + 1792 571 13 -0.834 40.19615 44.94623 32.57234 0 0 1 + 1793 571 14 0.417 40.90940 45.49825 32.25173 0 0 1 + 1794 571 14 0.417 40.42796 44.75889 33.48196 0 0 1 + 1795 572 13 -0.834 51.93921 56.60019 36.60262 -1 0 1 + 1796 572 14 0.417 51.78399 56.35099 37.51368 -1 0 1 + 1797 572 14 0.417 51.06469 56.74242 36.24039 -1 0 1 + 1798 573 13 -0.834 61.66916 50.48338 53.29865 -1 0 -2 + 1799 573 14 0.417 61.63036 50.41309 54.25248 -1 0 -2 + 1800 573 14 0.417 60.77283 50.69388 53.03687 -1 0 -2 + 1801 574 13 -0.834 51.74160 54.87485 56.16871 0 -1 0 + 1802 574 14 0.417 50.91429 55.26706 56.44795 0 -1 0 + 1803 574 14 0.417 51.91124 55.25931 55.30869 0 -1 0 + 1804 575 13 -0.834 40.85698 68.18248 30.13155 1 -1 0 + 1805 575 14 0.417 41.30492 67.87357 56.71541 1 -1 -1 + 1806 575 14 0.417 41.55175 41.19073 30.66952 1 0 0 + 1807 576 13 -0.834 50.89809 58.89690 54.50288 -1 0 0 + 1808 576 14 0.417 50.06229 58.64352 54.89466 -1 0 0 + 1809 576 14 0.417 51.37024 59.33797 55.20914 -1 0 0 + 1810 577 13 -0.834 58.37524 67.95427 49.91095 0 1 0 + 1811 577 14 0.417 57.83519 41.29391 50.25604 0 2 0 + 1812 577 14 0.417 59.26942 68.19076 50.15744 0 1 0 + 1813 578 13 -0.834 51.40785 46.48357 30.68744 1 0 1 + 1814 578 14 0.417 52.21871 45.99275 30.55389 1 0 1 + 1815 578 14 0.417 50.76683 45.82189 30.94725 1 0 1 + 1816 579 13 -0.834 57.04032 43.52295 36.91237 0 0 0 + 1817 579 14 0.417 56.97310 44.35969 36.45239 0 0 0 + 1818 579 14 0.417 57.91622 43.53095 37.29833 0 0 0 + 1819 580 13 -0.834 48.05479 47.92450 33.11226 0 0 1 + 1820 580 14 0.417 47.68291 48.79527 32.97186 0 0 1 + 1821 580 14 0.417 48.92592 48.09081 33.47242 0 0 1 + 1822 581 13 -0.834 52.31083 59.89064 56.95945 1 -2 -1 + 1823 581 14 0.417 51.77727 60.32576 30.25310 1 -2 0 + 1824 581 14 0.417 52.84806 60.59010 56.58744 1 -2 -1 + 1825 582 13 -0.834 49.28190 53.14534 38.62511 0 0 1 + 1826 582 14 0.417 48.56647 53.70668 38.92395 0 0 1 + 1827 582 14 0.417 48.86634 52.52585 38.02526 0 0 1 + 1828 583 13 -0.834 48.15214 51.90611 34.43290 2 0 0 + 1829 583 14 0.417 48.57405 51.97443 33.57642 2 0 0 + 1830 583 14 0.417 47.22654 51.76503 34.23389 2 0 0 + 1831 584 13 -0.834 61.27546 54.09168 30.34511 0 1 1 + 1832 584 14 0.417 61.26898 53.84689 31.27046 0 1 1 + 1833 584 14 0.417 62.02427 53.62196 29.97785 0 1 1 + 1834 585 13 -0.834 47.15916 50.47662 53.78471 0 -1 0 + 1835 585 14 0.417 47.32648 50.93912 54.60588 0 -1 0 + 1836 585 14 0.417 46.29671 50.78520 53.50690 0 -1 0 + 1837 586 13 -0.834 58.58091 63.09753 49.23949 0 -1 1 + 1838 586 14 0.417 59.43607 63.50227 49.38484 0 -1 1 + 1839 586 14 0.417 58.76326 62.34843 48.67219 0 -1 1 + 1840 587 13 -0.834 55.82082 49.65937 30.11648 0 1 1 + 1841 587 14 0.417 56.52757 49.92139 30.70647 0 1 1 + 1842 587 14 0.417 55.68213 50.42183 56.92602 0 1 0 + 1843 588 13 -0.834 63.79581 52.53565 53.17702 0 -2 1 + 1844 588 14 0.417 36.89869 52.41207 52.35479 1 -2 1 + 1845 588 14 0.417 63.12882 51.84908 53.17487 0 -2 1 + 1846 589 13 -0.834 58.30874 56.36537 43.52715 0 0 3 + 1847 589 14 0.417 58.58025 56.80205 44.33452 0 0 3 + 1848 589 14 0.417 57.40732 56.09029 43.69457 0 0 3 + 1849 590 13 -0.834 38.42652 61.06904 33.48425 0 -2 -1 + 1850 590 14 0.417 39.08604 61.75763 33.56856 0 -2 -1 + 1851 590 14 0.417 38.90648 60.25628 33.64334 0 -2 -1 + 1852 591 13 -0.834 46.61439 51.58566 41.81121 1 -1 0 + 1853 591 14 0.417 46.97646 51.37067 42.67082 1 -1 0 + 1854 591 14 0.417 46.41089 50.73724 41.41750 1 -1 0 + 1855 592 13 -0.834 60.01555 43.31814 42.71405 1 0 1 + 1856 592 14 0.417 60.52150 42.79903 43.33920 1 0 1 + 1857 592 14 0.417 59.90024 42.74003 41.95989 1 0 1 + 1858 593 13 -0.834 44.88246 59.34852 51.75271 1 0 -1 + 1859 593 14 0.417 45.75263 59.37400 52.15069 1 0 -1 + 1860 593 14 0.417 44.67274 58.41644 51.69374 1 0 -1 + 1861 594 13 -0.834 58.22051 53.10280 51.15729 0 -1 0 + 1862 594 14 0.417 58.53381 52.60654 51.91346 0 -1 0 + 1863 594 14 0.417 58.92607 53.72100 50.96688 0 -1 0 + 1864 595 13 -0.834 52.85332 67.67658 42.66705 0 -1 0 + 1865 595 14 0.417 53.29462 67.40699 41.86157 0 -1 0 + 1866 595 14 0.417 53.28090 67.16860 43.35652 0 -1 0 + 1867 596 13 -0.834 60.42773 53.38162 37.56585 0 0 1 + 1868 596 14 0.417 60.55482 53.97513 38.30601 0 0 1 + 1869 596 14 0.417 59.53313 53.05721 37.66924 0 0 1 + 1870 597 13 -0.834 56.52028 65.87791 50.38146 0 0 1 + 1871 597 14 0.417 56.94337 66.73645 50.39389 0 0 1 + 1872 597 14 0.417 57.02985 65.35034 50.99649 0 0 1 + 1873 598 13 -0.834 54.80064 62.49993 33.68680 1 0 1 + 1874 598 14 0.417 55.58425 61.96146 33.79744 1 0 1 + 1875 598 14 0.417 55.10591 63.27334 33.21259 1 0 1 + 1876 599 13 -0.834 44.11783 61.90196 34.52932 1 1 -1 + 1877 599 14 0.417 44.98641 61.86349 34.92975 1 1 -1 + 1878 599 14 0.417 44.21923 61.44892 33.69223 1 1 -1 + 1879 600 13 -0.834 47.64060 51.80694 44.33090 -1 -1 0 + 1880 600 14 0.417 48.33775 51.24158 44.66345 -1 -1 0 + 1881 600 14 0.417 47.96940 52.69619 44.46262 -1 -1 0 + 1882 601 13 -0.834 56.93644 64.17109 32.73010 0 -2 0 + 1883 601 14 0.417 57.35484 63.79547 31.95543 0 -2 0 + 1884 601 14 0.417 57.46604 63.85913 33.46389 0 -2 0 + 1885 602 13 -0.834 40.19928 60.95715 53.68963 1 0 -1 + 1886 602 14 0.417 41.08822 60.76154 53.39341 1 0 -1 + 1887 602 14 0.417 39.80336 61.43545 52.96114 1 0 -1 + 1888 603 13 -0.834 56.02366 41.52320 41.07986 0 1 0 + 1889 603 14 0.417 55.42766 41.48842 40.33165 0 1 0 + 1890 603 14 0.417 55.93467 42.41489 41.41631 0 1 0 + 1891 604 13 -0.834 52.35261 67.43639 29.83633 -1 0 0 + 1892 604 14 0.417 53.08703 67.77971 56.69878 -1 0 -1 + 1893 604 14 0.417 51.97673 68.20568 30.26426 -1 0 0 + 1894 605 13 -0.834 51.14102 49.90060 37.90539 1 0 1 + 1895 605 14 0.417 51.41236 49.08269 37.48865 1 0 1 + 1896 605 14 0.417 50.32915 50.13989 37.45830 1 0 1 + 1897 606 13 -0.834 48.40753 57.18555 40.43062 0 0 0 + 1898 606 14 0.417 47.74030 57.19949 39.74445 0 0 0 + 1899 606 14 0.417 48.68357 58.09814 40.51553 0 0 0 + 1900 607 13 -0.834 38.43185 54.52830 40.23522 1 -2 1 + 1901 607 14 0.417 37.76601 54.24704 40.86274 1 -2 1 + 1902 607 14 0.417 37.95756 54.62565 39.40951 1 -2 1 + 1903 608 13 -0.834 52.97765 52.38562 41.57118 0 0 0 + 1904 608 14 0.417 52.16773 52.00413 41.23247 0 0 0 + 1905 608 14 0.417 53.62059 51.67937 41.50742 0 0 0 + 1906 609 13 -0.834 52.82978 61.35779 35.40768 0 1 -2 + 1907 609 14 0.417 53.63682 61.71145 35.03372 0 1 -2 + 1908 609 14 0.417 53.10766 60.57217 35.87865 0 1 -2 + 1909 610 13 -0.834 55.37636 43.79165 30.66790 0 0 0 + 1910 610 14 0.417 55.82860 43.25432 31.31827 0 0 0 + 1911 610 14 0.417 55.97415 44.52040 30.50110 0 0 0 + 1912 611 13 -0.834 37.90570 54.55715 45.50029 1 -2 -1 + 1913 611 14 0.417 37.12871 54.09851 45.18066 1 -2 -1 + 1914 611 14 0.417 38.24821 53.99402 46.19441 1 -2 -1 + 1915 612 13 -0.834 60.01324 50.96528 45.16358 1 1 0 + 1916 612 14 0.417 59.85669 51.13906 44.23539 1 1 0 + 1917 612 14 0.417 59.48415 50.19096 45.35532 1 1 0 + 1918 613 13 -0.834 38.84394 52.32942 30.93040 2 1 0 + 1919 613 14 0.417 38.51878 51.61086 30.38802 2 1 0 + 1920 613 14 0.417 38.41000 53.10831 30.58218 2 1 0 + 1921 614 13 -0.834 38.99542 61.66171 44.80992 1 0 2 + 1922 614 14 0.417 38.78488 60.74588 44.99207 1 0 2 + 1923 614 14 0.417 39.68427 61.62223 44.14648 1 0 2 + 1924 615 13 -0.834 57.70791 41.72720 55.47643 0 1 -2 + 1925 615 14 0.417 57.25844 41.36846 56.24163 0 1 -2 + 1926 615 14 0.417 57.00496 41.93588 54.86116 0 1 -2 + 1927 616 13 -0.834 58.08999 54.20225 35.53764 0 -1 0 + 1928 616 14 0.417 58.28608 53.46338 36.11372 0 -1 0 + 1929 616 14 0.417 57.15628 54.11553 35.34551 0 -1 0 + 1930 617 13 -0.834 53.05217 52.71850 54.07873 0 0 -1 + 1931 617 14 0.417 52.72353 53.45661 54.59199 0 0 -1 + 1932 617 14 0.417 52.69237 51.94509 54.51306 0 0 -1 + 1933 618 13 -0.834 49.92059 65.13477 35.13462 0 1 1 + 1934 618 14 0.417 50.86780 65.25694 35.19866 0 1 1 + 1935 618 14 0.417 49.79534 64.18846 35.20565 0 1 1 + 1936 619 13 -0.834 41.32410 62.50943 46.98364 1 -1 0 + 1937 619 14 0.417 40.63048 62.20572 46.39807 1 -1 0 + 1938 619 14 0.417 41.96090 61.79482 46.99226 1 -1 0 + 1939 620 13 -0.834 53.94559 67.39201 49.11860 0 0 0 + 1940 620 14 0.417 54.46912 66.60137 48.98810 0 0 0 + 1941 620 14 0.417 54.03461 67.58755 50.05138 0 0 0 + 1942 621 13 -0.834 62.73724 52.28919 56.37358 -2 0 0 + 1943 621 14 0.417 61.94239 51.76764 56.26203 -2 0 0 + 1944 621 14 0.417 63.44036 51.64333 56.44233 -2 0 0 + 1945 622 13 -0.834 40.38118 67.16060 39.18721 2 1 1 + 1946 622 14 0.417 41.33280 67.21360 39.09858 2 1 1 + 1947 622 14 0.417 40.05780 67.12713 38.28691 2 1 1 + 1948 623 13 -0.834 62.86517 42.00727 34.57539 -1 0 -1 + 1949 623 14 0.417 63.37239 42.81882 34.59420 -1 0 -1 + 1950 623 14 0.417 63.40838 41.39624 34.07760 -1 0 -1 + 1951 624 13 -0.834 45.52270 49.32960 34.34348 1 -1 1 + 1952 624 14 0.417 45.92383 49.19413 33.48500 1 -1 1 + 1953 624 14 0.417 45.24004 50.24407 34.33468 1 -1 1 + 1954 625 13 -0.834 61.03811 44.77668 56.49913 1 1 0 + 1955 625 14 0.417 60.72892 43.87199 56.45248 1 1 0 + 1956 625 14 0.417 60.93423 45.11202 55.60864 1 1 0 + 1957 626 13 -0.834 37.82896 51.65548 39.75440 0 1 1 + 1958 626 14 0.417 37.05574 52.05171 39.35268 0 1 1 + 1959 626 14 0.417 38.46628 52.36806 39.80236 0 1 1 + 1960 627 13 -0.834 57.87448 65.36125 35.56679 -1 -1 0 + 1961 627 14 0.417 58.45940 64.84211 35.01489 -1 -1 0 + 1962 627 14 0.417 58.01580 66.26448 35.28319 -1 -1 0 + 1963 628 13 -0.834 41.02352 64.37669 36.41484 0 0 1 + 1964 628 14 0.417 40.85775 63.95254 37.25679 0 0 1 + 1965 628 14 0.417 41.32667 63.66948 35.84545 0 0 1 + 1966 629 13 -0.834 48.62923 67.86173 41.06030 1 0 1 + 1967 629 14 0.417 48.15680 41.13844 41.58283 1 1 1 + 1968 629 14 0.417 47.94185 67.35115 40.63246 1 0 1 + 1969 630 13 -0.834 57.99331 55.69311 47.88478 1 2 0 + 1970 630 14 0.417 57.70999 55.65425 48.79826 1 2 0 + 1971 630 14 0.417 57.37284 55.13407 47.41709 1 2 0 + 1972 631 13 -0.834 48.67013 62.47689 45.75332 -1 -1 0 + 1973 631 14 0.417 49.00300 63.35392 45.56291 -1 -1 0 + 1974 631 14 0.417 48.17776 62.23177 44.96992 -1 -1 0 + 1975 632 13 -0.834 63.70160 54.96100 33.30497 -1 0 0 + 1976 632 14 0.417 64.21034 55.41699 32.63452 -1 0 0 + 1977 632 14 0.417 36.84822 54.18301 33.51151 0 0 0 + 1978 633 13 -0.834 61.71933 50.02843 40.52579 1 0 -1 + 1979 633 14 0.417 61.89605 49.89083 39.59516 1 0 -1 + 1980 633 14 0.417 61.20325 50.83404 40.55551 1 0 -1 + 1981 634 13 -0.834 49.51254 64.46386 53.41539 0 -1 -1 + 1982 634 14 0.417 48.93704 63.81647 53.00803 0 -1 -1 + 1983 634 14 0.417 49.96102 63.98252 54.11066 0 -1 -1 + 1984 635 13 -0.834 49.54405 44.64373 31.53722 1 2 1 + 1985 635 14 0.417 49.17415 44.45447 32.39954 1 2 1 + 1986 635 14 0.417 48.78808 44.87386 30.99705 1 2 1 + 1987 636 13 -0.834 55.54392 65.92737 37.61921 0 -1 -1 + 1988 636 14 0.417 56.11408 65.75233 38.36791 0 -1 -1 + 1989 636 14 0.417 56.12096 66.32174 36.96519 0 -1 -1 + 1990 637 13 -0.834 55.12269 51.83986 35.86341 1 0 1 + 1991 637 14 0.417 55.56426 51.26412 35.23910 1 0 1 + 1992 637 14 0.417 54.23658 51.93728 35.51477 1 0 1 + 1993 638 13 -0.834 55.63681 62.23759 37.50835 1 -1 0 + 1994 638 14 0.417 55.30920 61.35525 37.33403 1 -1 0 + 1995 638 14 0.417 56.23965 62.41667 36.78672 1 -1 0 + 1996 639 13 -0.834 39.91450 42.04260 35.59226 0 0 0 + 1997 639 14 0.417 39.72903 41.27571 36.13422 0 0 0 + 1998 639 14 0.417 39.23583 42.02933 34.91737 0 0 0 + 1999 640 13 -0.834 48.26433 59.84813 40.16126 0 1 0 + 2000 640 14 0.417 48.74870 60.67004 40.23938 0 1 0 + 2001 640 14 0.417 47.50743 60.06639 39.61748 0 1 0 + 2002 641 13 -0.834 57.35097 49.28414 48.37687 1 1 1 + 2003 641 14 0.417 57.35715 48.51028 48.94022 1 1 1 + 2004 641 14 0.417 56.55074 49.75049 48.61854 1 1 1 + +Velocities + + 1 -0.000671 -0.002823 0.003832 + 2 -0.001597 0.002405 -0.003777 + 3 0.005494 0.003807 -0.002300 + 4 -0.000077 0.004524 -0.000287 + 5 0.003116 -0.007135 -0.034325 + 6 -0.006676 0.004889 -0.001939 + 7 0.003499 -0.004774 0.000159 + 8 -0.003460 0.000694 0.000994 + 9 -0.000065 -0.001353 -0.002848 + 10 -0.001260 -0.002649 0.000699 + 11 -0.002820 -0.002457 -0.005671 + 12 0.005156 -0.005914 0.000984 + 13 -0.002342 -0.001592 0.004306 + 14 0.004397 -0.000231 0.003308 + 15 -0.003258 -0.000006 0.001838 + 16 -0.001637 -0.004429 0.003154 + 17 0.007073 -0.000472 -0.003331 + 18 -0.003380 -0.001390 0.005013 + 19 -0.011019 -0.005332 -0.010451 + 20 -0.005433 0.000844 0.004938 + 21 0.002988 0.000244 -0.009941 + 22 -0.003695 0.006546 -0.007678 + 23 0.009473 0.023276 0.019457 + 24 -0.010016 -0.024193 0.018017 + 25 0.004015 0.008726 -0.000397 + 26 -0.001741 -0.001861 0.007862 + 27 -0.009771 -0.011577 -0.005703 + 28 0.003573 0.006265 -0.005932 + 29 0.004789 0.001987 -0.004620 + 30 0.008858 -0.001064 -0.001455 + 31 -0.001403 0.000613 0.002330 + 32 -0.005808 -0.001620 0.000816 + 33 -0.004160 0.001188 -0.019638 + 34 -0.006899 0.006285 0.013256 + 35 0.000717 -0.000432 -0.006883 + 36 0.002110 0.002628 -0.004683 + 37 0.000765 -0.007298 0.000289 + 38 -0.000128 -0.002893 0.004065 + 39 -0.000411 -0.021741 0.010968 + 40 0.002858 0.000302 0.000042 + 41 0.014233 -0.004599 -0.004060 + 42 -0.001473 -0.003572 -0.006228 + 43 0.009129 -0.002755 0.001456 + 44 0.003931 0.000151 0.003472 + 45 0.001621 0.005391 -0.006087 + 46 -0.004269 -0.001973 0.002735 + 47 -0.006898 -0.001187 -0.003394 + 48 -0.008556 -0.000163 -0.001387 + 49 -0.000633 -0.001754 0.011460 + 50 0.004854 -0.002902 -0.005057 + 51 0.000678 0.003272 0.006218 + 52 0.006502 0.006365 -0.000215 + 53 0.005708 0.012368 0.002955 + 54 0.008627 -0.007839 0.003177 + 55 0.004394 0.000132 0.002346 + 56 -0.004641 0.009426 -0.005548 + 57 -0.004801 -0.024766 0.002851 + 58 -0.002703 0.001589 0.007521 + 59 0.023718 -0.006559 0.003743 + 60 -0.010013 -0.042894 -0.029745 + 61 0.016140 -0.000721 -0.001747 + 62 -0.004871 0.002439 0.001990 + 63 0.009632 0.007144 0.001203 + 64 -0.001150 0.001648 -0.003018 + 65 0.006658 -0.002268 0.006874 + 66 -0.002617 0.003321 0.002230 + 67 -0.000803 0.002802 0.003258 + 68 -0.000984 -0.001579 -0.001813 + 69 0.001316 0.000607 0.003431 + 70 -0.010901 0.000580 -0.004134 + 71 0.005370 -0.003909 0.013130 + 72 -0.012282 0.007114 -0.015100 + 73 0.004641 -0.007554 0.004302 + 74 0.017455 0.013344 0.004896 + 75 0.006200 0.026885 0.020665 + 76 -0.010372 0.000470 -0.005601 + 77 -0.003368 -0.004484 0.010962 + 78 0.012416 -0.004728 0.000719 + 79 -0.005789 0.005198 -0.007541 + 80 0.005480 -0.004049 0.003455 + 81 -0.004935 0.005839 -0.006405 + 82 0.001157 -0.011200 0.018491 + 83 -0.029013 -0.016935 0.021131 + 84 -0.020335 0.020972 0.006071 + 85 0.003304 0.007374 -0.005056 + 86 0.029227 0.010776 -0.013183 + 87 0.001651 0.006570 -0.002085 + 88 0.001533 -0.009172 0.007562 + 89 0.018153 -0.022223 0.015786 + 90 -0.010012 -0.004911 0.002561 + 91 0.000435 0.003941 -0.005468 + 92 0.003301 0.001183 -0.006999 + 93 0.006788 0.011331 -0.004427 + 94 0.001392 0.005663 -0.002907 + 95 -0.001849 -0.002229 -0.003422 + 96 -0.000820 0.005872 0.004561 + 97 -0.003264 0.002461 -0.009257 + 98 0.000160 0.016954 -0.015355 + 99 -0.006597 0.011858 0.000426 + 100 0.001816 -0.005854 -0.001317 + 101 -0.001936 -0.006103 0.018111 + 102 0.024621 -0.022735 -0.000704 + 103 -0.001102 0.008384 -0.003086 + 104 0.012559 0.004375 -0.000361 + 105 0.008377 0.014814 -0.037755 + 106 -0.002851 -0.000200 -0.000722 + 107 0.010701 0.006888 -0.007831 + 108 -0.008490 0.011514 0.009399 + 109 -0.001181 0.001853 0.002176 + 110 -0.018912 -0.023868 0.006706 + 111 -0.000415 -0.001525 0.005751 + 112 -0.001172 0.001329 -0.001270 + 113 -0.006700 -0.006243 -0.006459 + 114 0.000018 0.001429 0.001376 + 115 0.001269 0.002521 0.005249 + 116 -0.002179 0.015666 0.006861 + 117 -0.007158 0.000981 0.007353 + 118 0.001047 0.000840 -0.004404 + 119 0.000974 -0.012527 0.005053 + 120 0.026729 0.008884 -0.003350 + 121 0.001181 -0.004040 -0.002037 + 122 0.006556 -0.007438 0.002656 + 123 0.005056 -0.015002 -0.003727 + 124 -0.002704 -0.003683 -0.001021 + 125 0.025048 0.007258 0.008873 + 126 0.019645 -0.020824 -0.002539 + 127 0.000061 0.001072 0.002612 + 128 0.005132 0.013203 0.018763 + 129 0.033473 0.004804 0.018651 + 130 -0.003459 -0.000309 -0.001348 + 131 -0.008088 0.023660 0.011047 + 132 0.010962 0.031994 0.008711 + 133 0.000181 -0.002894 -0.001677 + 134 0.024049 -0.000711 -0.009405 + 135 0.018702 0.003422 -0.019522 + 136 -0.000836 -0.003270 -0.005700 + 137 0.012246 0.016524 0.001525 + 138 0.006270 -0.011288 0.002224 + 139 -0.005169 0.005097 -0.000688 + 140 -0.006982 0.003044 -0.001383 + 141 0.012227 0.012767 0.004047 + 142 -0.001169 0.006070 -0.007989 + 143 0.005451 0.002569 -0.009841 + 144 0.001825 -0.002822 -0.005341 + 145 0.000911 0.004242 -0.002026 + 146 0.012072 -0.001187 -0.010498 + 147 0.007366 0.005541 0.012099 + 148 0.009820 0.000588 0.001087 + 149 0.013758 0.005140 0.015262 + 150 0.015580 0.003311 0.013079 + 151 0.002031 0.000411 0.003403 + 152 -0.001996 0.003750 0.007387 + 153 0.000790 0.000281 -0.000919 + 154 -0.004168 0.001886 -0.004993 + 155 -0.011049 0.015294 0.001052 + 156 -0.012308 0.010348 -0.003128 + 157 -0.001609 -0.004040 -0.002294 + 158 -0.005715 -0.015529 -0.005700 + 159 0.014489 0.026653 0.004024 + 160 0.004070 0.000866 0.003373 + 161 0.004691 0.005062 0.002569 + 162 0.007082 -0.019961 -0.026174 + 163 0.005501 0.000902 -0.001325 + 164 0.007503 0.001448 -0.001472 + 165 0.013628 0.003649 -0.005952 + 166 -0.000639 0.003162 -0.007271 + 167 0.007342 -0.011001 -0.016849 + 168 -0.018400 -0.004772 0.020839 + 169 0.000214 -0.000386 0.002706 + 170 -0.005862 0.010449 -0.003793 + 171 -0.013612 0.011870 -0.006417 + 172 -0.005485 0.006465 0.005343 + 173 0.001788 0.008428 0.005641 + 174 -0.018354 0.029579 0.010717 + 175 0.002627 -0.000754 0.000071 + 176 -0.018080 0.018546 0.001794 + 177 0.006754 -0.000962 -0.007786 + 178 0.002343 0.002166 0.004945 + 179 -0.001724 0.003155 0.010761 + 180 0.010728 0.003441 0.001544 + 181 -0.000849 -0.002856 0.001461 + 182 0.009366 -0.003672 -0.001935 + 183 0.016615 -0.001746 0.005238 + 184 -0.002730 -0.000316 -0.004583 + 185 -0.014755 -0.011310 0.003338 + 186 0.005862 0.008235 -0.003200 + 187 -0.003189 -0.006285 0.009536 + 188 -0.005114 -0.007060 0.006450 + 189 -0.000516 -0.008757 0.009854 + 190 -0.000859 0.005266 0.001864 + 191 0.003108 -0.007021 0.009190 + 192 -0.015949 -0.002050 0.007021 + 193 -0.007008 0.002608 -0.004583 + 194 -0.020431 -0.004004 0.008047 + 195 -0.000364 0.001236 -0.011425 + 196 0.002420 0.006931 0.002031 + 197 0.007178 0.006129 0.009924 + 198 -0.005981 0.016623 -0.013067 + 199 0.003142 -0.001394 -0.001846 + 200 0.011374 -0.002895 -0.000674 + 201 0.032698 -0.002552 0.007288 + 202 -0.005709 0.000071 0.005037 + 203 -0.013193 -0.012592 -0.008102 + 204 -0.008194 0.014723 0.003840 + 205 -0.003270 -0.006146 0.004301 + 206 0.004399 -0.010132 -0.001197 + 207 -0.030308 0.012803 0.003540 + 208 0.002110 0.002374 0.006075 + 209 -0.000845 -0.004182 -0.002795 + 210 0.002582 -0.004671 0.002224 + 211 -0.003768 0.002130 0.001339 + 212 0.022509 0.017397 0.002782 + 213 0.020609 0.006682 -0.014082 + 214 0.003956 0.004282 -0.005023 + 215 0.007499 0.004128 0.002237 + 216 0.034882 -0.005096 0.008948 + 217 -0.002552 -0.000287 -0.001907 + 218 0.025445 0.005560 -0.016526 + 219 0.002741 0.000814 -0.004654 + 220 0.002162 -0.001203 0.000936 + 221 0.004071 0.004725 0.001938 + 222 0.002393 -0.013063 -0.003950 + 223 -0.001609 -0.003218 -0.004310 + 224 -0.012550 0.009033 -0.007868 + 225 0.014344 0.000886 -0.013005 + 226 0.005863 0.010335 -0.003424 + 227 0.011104 -0.005602 -0.012415 + 228 0.001222 0.002408 0.001546 + 229 -0.002038 0.001858 0.002991 + 230 -0.017517 -0.020932 0.016099 + 231 0.005257 0.011588 -0.018236 + 232 -0.002660 -0.006193 0.003186 + 233 -0.021995 0.012375 0.004372 + 234 -0.013906 0.028004 -0.004997 + 235 0.002339 -0.001255 -0.003548 + 236 0.001689 0.005243 -0.006337 + 237 0.000498 -0.007782 -0.015260 + 238 0.001142 0.002234 0.003408 + 239 0.007521 0.004622 -0.003272 + 240 -0.001154 0.006952 0.006739 + 241 -0.000938 -0.004609 0.002499 + 242 0.004903 0.001117 0.013021 + 243 0.008126 -0.013873 -0.001075 + 244 -0.004097 0.002491 -0.002459 + 245 0.002093 -0.002989 0.010881 + 246 0.008552 0.010436 0.008330 + 247 -0.000211 0.002295 0.001935 + 248 0.004346 0.003486 0.008405 + 249 -0.006182 0.002873 -0.007955 + 250 0.002466 0.001439 -0.002302 + 251 -0.003246 0.007233 0.009469 + 252 -0.002606 0.002646 0.002563 + 253 0.000833 -0.001794 -0.003483 + 254 -0.001066 -0.001277 -0.012569 + 255 -0.003354 -0.002604 -0.016130 + 256 0.007379 0.006324 -0.003535 + 257 0.025411 0.006788 -0.010928 + 258 0.011648 0.000201 0.004051 + 259 -0.000385 -0.000823 -0.000593 + 260 -0.001070 -0.019569 0.006235 + 261 0.011350 0.009136 0.002805 + 262 -0.001688 0.002178 0.004704 + 263 -0.011748 0.007674 0.002198 + 264 -0.005358 0.003728 -0.002879 + 265 -0.004209 0.000686 -0.004990 + 266 0.000586 0.011928 0.008080 + 267 0.004512 -0.002493 -0.000297 + 268 -0.000130 0.007801 -0.005732 + 269 -0.006259 -0.000991 -0.001515 + 270 0.015560 -0.011483 0.001826 + 271 -0.003544 0.003178 0.000326 + 272 0.006639 0.005731 0.008812 + 273 -0.009361 -0.001371 -0.002830 + 274 -0.000226 0.001739 0.001787 + 275 -0.001846 -0.005637 -0.002071 + 276 0.009461 0.005629 -0.001253 + 277 0.003294 -0.005377 -0.000680 + 278 0.027740 0.013288 0.002669 + 279 0.003403 0.012169 -0.019874 + 280 -0.001383 0.000386 -0.006636 + 281 -0.005910 0.003429 -0.006992 + 282 0.002649 -0.004178 -0.006969 + 283 0.004768 -0.001680 0.000104 + 284 -0.012916 0.017467 -0.012201 + 285 0.010278 -0.007970 0.003734 + 286 0.000005 0.000300 0.006224 + 287 0.003150 -0.001535 0.007443 + 288 -0.000547 -0.003737 0.010794 + 289 0.003054 0.005656 0.000426 + 290 0.006673 0.002252 0.007300 + 291 0.004185 0.001696 0.005292 + 292 -0.001277 -0.005156 -0.001765 + 293 0.005969 -0.004326 -0.002540 + 294 -0.026915 -0.005145 0.019233 + 295 -0.003352 -0.000356 -0.001610 + 296 -0.023375 -0.003718 -0.017075 + 297 0.006387 -0.025086 0.000315 + 298 -0.005064 0.001395 0.004436 + 299 -0.004111 0.000853 -0.032909 + 300 0.000933 0.005949 0.017391 + 301 0.000607 0.002490 -0.002786 + 302 0.002638 0.008857 0.008537 + 303 0.001294 0.011357 -0.003275 + 304 -0.001798 -0.003127 -0.000795 + 305 -0.003320 0.000996 0.004122 + 306 -0.008728 -0.000634 0.002033 + 307 -0.003535 -0.002662 -0.002777 + 308 -0.005954 -0.002781 -0.004403 + 309 -0.002147 -0.001477 -0.001223 + 310 -0.002595 -0.001397 0.002359 + 311 -0.003605 -0.000224 0.015269 + 312 -0.014002 -0.002828 0.000027 + 313 0.001583 -0.005357 0.002380 + 314 -0.002955 -0.014106 -0.011581 + 315 0.000151 -0.006411 0.002865 + 316 0.004278 -0.004088 0.000114 + 317 -0.019291 0.001584 0.015204 + 318 -0.013439 -0.000674 0.010987 + 319 0.000024 0.000995 0.005326 + 320 -0.009041 0.020464 0.014139 + 321 0.004208 -0.003482 0.004723 + 322 0.001489 -0.003292 0.000500 + 323 0.000364 0.006211 0.006844 + 324 0.007467 0.021162 -0.001636 + 325 0.009527 -0.000863 -0.005483 + 326 -0.009936 0.006496 -0.014136 + 327 -0.007595 -0.006469 -0.002090 + 328 -0.002856 -0.010388 -0.000678 + 329 -0.026693 -0.007624 -0.001572 + 330 0.029582 -0.010319 0.009090 + 331 -0.009062 0.000913 0.000368 + 332 -0.019327 0.020501 -0.000560 + 333 -0.018764 -0.008632 0.002570 + 334 0.004502 0.001200 -0.008087 + 335 0.008714 -0.005091 -0.008624 + 336 0.004610 0.003623 -0.007048 + 337 0.002461 -0.000759 0.003913 + 338 0.021591 -0.013925 0.009416 + 339 -0.017190 0.002325 0.006138 + 340 0.003361 0.004027 0.006986 + 341 0.006850 0.012752 0.018496 + 342 0.019589 0.009932 -0.004987 + 343 0.000463 0.005037 -0.000723 + 344 0.008333 0.006382 -0.005532 + 345 0.004288 0.006565 0.007800 + 346 -0.001505 -0.001295 0.001190 + 347 -0.015747 0.011253 0.025149 + 348 0.014871 -0.012646 -0.016815 + 349 -0.000186 0.002115 -0.002539 + 350 0.001936 0.000958 -0.003366 + 351 -0.014299 0.007078 -0.001653 + 352 -0.000876 -0.001637 -0.002032 + 353 -0.001168 0.005556 -0.012749 + 354 -0.003162 -0.016318 -0.009468 + 355 -0.000674 -0.001888 -0.003265 + 356 0.017652 -0.009515 0.007889 + 357 0.015313 -0.006079 0.010454 + 358 -0.000964 -0.004354 0.000067 + 359 0.004137 -0.002540 0.004500 + 360 -0.011376 -0.000921 -0.006123 + 361 0.002023 0.003210 -0.000511 + 362 0.012560 -0.011698 0.016109 + 363 -0.013295 -0.009379 -0.009014 + 364 0.003315 0.003249 0.007620 + 365 -0.010739 0.000915 -0.008118 + 366 -0.015293 0.007564 -0.004343 + 367 0.000192 0.002269 -0.000485 + 368 0.002520 -0.012494 -0.004632 + 369 0.010222 0.003093 -0.002247 + 370 0.003953 0.000628 0.004147 + 371 0.001165 -0.005271 0.007550 + 372 -0.013412 -0.019696 0.026961 + 373 0.001883 0.002252 -0.003560 + 374 0.005482 -0.004609 0.002380 + 375 -0.008048 0.004473 -0.008866 + 376 -0.002663 0.001073 0.001951 + 377 0.010178 0.018964 0.000820 + 378 0.007583 -0.018984 0.016464 + 379 0.001136 0.007646 0.002719 + 380 0.006251 0.008125 0.009187 + 381 0.001284 0.011634 -0.004097 + 382 -0.000767 0.000265 -0.000818 + 383 -0.000089 0.001579 -0.002300 + 384 -0.004565 -0.011251 0.008186 + 385 0.004778 -0.000871 0.002405 + 386 0.006618 -0.002801 0.006849 + 387 0.029884 -0.012377 0.019662 + 388 -0.002799 -0.005785 0.000693 + 389 -0.006988 0.014716 -0.008738 + 390 -0.003130 0.004832 0.002982 + 391 0.000036 -0.002467 0.000498 + 392 -0.001382 -0.006847 0.003863 + 393 -0.003623 0.001391 0.001664 + 394 0.004431 0.000182 0.002043 + 395 0.007177 -0.001675 0.008884 + 396 0.000324 0.003728 0.003379 + 397 0.004107 -0.000618 0.000098 + 398 0.019272 -0.008832 -0.013192 + 399 -0.025041 0.027976 -0.020594 + 400 0.002982 -0.002889 -0.005826 + 401 0.010564 -0.003899 -0.002078 + 402 0.005218 -0.003308 -0.010357 + 403 0.002304 -0.003833 -0.008812 + 404 -0.013421 -0.017603 -0.023172 + 405 -0.003134 -0.000582 0.001712 + 406 -0.003398 -0.002176 0.001635 + 407 -0.015813 0.008046 0.010515 + 408 0.003940 -0.004144 -0.002666 + 409 0.008428 -0.002203 -0.004077 + 410 -0.004859 0.004207 -0.016803 + 411 -0.022714 0.005614 0.004119 + 412 -0.000677 -0.000486 0.001019 + 413 0.004137 0.001524 0.004810 + 414 -0.011495 -0.003293 -0.002498 + 415 -0.004277 -0.004620 -0.002973 + 416 0.005727 -0.002611 0.021922 + 417 0.009759 0.016284 -0.017136 + 418 0.001140 -0.003169 0.001021 + 419 0.002072 0.019101 -0.019824 + 420 0.029356 -0.011686 0.004675 + 421 0.001175 0.002540 0.001846 + 422 0.009479 -0.017538 0.002696 + 423 0.008327 0.028039 -0.001246 + 424 0.002971 -0.004730 0.000069 + 425 0.010168 -0.005904 -0.016535 + 426 0.009223 0.011295 0.006248 + 427 -0.003323 0.000861 0.005020 + 428 -0.005244 0.001685 -0.001864 + 429 0.000994 0.014826 0.000976 + 430 -0.002795 0.003958 -0.004848 + 431 0.010698 -0.011688 -0.000537 + 432 0.008158 0.021591 -0.003259 + 433 0.000363 0.002223 0.004053 + 434 -0.002225 0.004315 -0.010042 + 435 -0.000151 -0.000572 0.000675 + 436 0.006996 -0.000559 0.003307 + 437 -0.011410 -0.004708 0.006782 + 438 -0.015909 0.022113 0.004877 + 439 -0.002401 -0.002279 0.002655 + 440 -0.002478 0.000164 0.005849 + 441 -0.003545 0.002314 0.007358 + 442 0.002189 0.006935 -0.001251 + 443 -0.007190 0.031224 0.006804 + 444 0.004661 -0.003296 0.013412 + 445 0.003709 0.001514 -0.003921 + 446 0.015678 0.007604 0.000133 + 447 -0.004648 -0.004474 -0.027064 + 448 0.001807 -0.004146 0.004203 + 449 0.029598 0.003434 0.012408 + 450 -0.004603 -0.006201 0.002287 + 451 -0.003031 -0.004136 -0.006564 + 452 0.009003 0.019264 0.004529 + 453 -0.000188 0.010449 0.001077 + 454 0.003891 0.002752 0.005629 + 455 0.001092 0.012776 0.008682 + 456 -0.002762 0.015371 -0.005857 + 457 0.002697 -0.003406 -0.002865 + 458 0.007823 -0.013511 0.002023 + 459 -0.030492 -0.008107 -0.020624 + 460 0.000483 0.001162 0.002651 + 461 0.002571 -0.007508 -0.009384 + 462 -0.010774 -0.027329 0.003619 + 463 0.005791 0.000086 0.004298 + 464 0.008820 0.016257 -0.002226 + 465 0.000317 -0.014932 -0.013621 + 466 0.003540 0.001551 -0.001349 + 467 0.008241 0.020014 0.019807 + 468 -0.004258 -0.010227 -0.029599 + 469 0.007640 0.001287 -0.003128 + 470 0.004600 -0.001555 -0.010230 + 471 0.007870 0.002461 0.000094 + 472 0.001001 0.005160 -0.001529 + 473 0.006073 0.015127 0.022819 + 474 0.006356 -0.012345 -0.003131 + 475 -0.005549 -0.000151 0.001312 + 476 -0.015747 0.009610 0.004075 + 477 0.009345 0.004620 -0.013632 + 478 -0.005694 -0.004777 0.002781 + 479 -0.015785 0.018249 0.008919 + 480 0.007264 0.001342 -0.012954 + 481 -0.002601 -0.003124 -0.001775 + 482 -0.010924 -0.002942 0.001676 + 483 0.020644 0.001519 0.001050 + 484 -0.003829 -0.001681 0.001973 + 485 -0.009248 -0.008096 0.002166 + 486 -0.004627 -0.003317 0.000426 + 487 0.004750 0.008629 -0.001691 + 488 -0.009177 0.001481 0.019567 + 489 -0.000748 -0.004703 -0.011184 + 490 -0.000930 -0.004032 -0.001796 + 491 -0.007051 -0.001375 -0.004647 + 492 -0.000505 0.005436 -0.004029 + 493 -0.000767 -0.000313 -0.004426 + 494 0.007019 0.022441 0.008035 + 495 0.002030 -0.018016 0.012244 + 496 -0.000430 -0.004092 0.001186 + 497 0.012447 -0.008156 0.016405 + 498 -0.008008 0.011043 -0.000527 + 499 0.001752 0.001451 -0.008850 + 500 -0.001696 0.002950 -0.000035 + 501 0.006054 -0.001180 -0.028952 + 502 0.001434 -0.008124 -0.001958 + 503 0.001762 -0.007034 -0.009244 + 504 -0.008796 -0.004759 -0.009928 + 505 0.000249 0.001170 0.006380 + 506 -0.005081 0.014461 -0.003259 + 507 -0.002522 0.001324 0.007841 + 508 0.003441 0.001538 0.006742 + 509 0.007735 -0.006583 0.003492 + 510 0.009681 0.006088 0.008608 + 511 -0.006695 -0.001970 0.000807 + 512 0.004268 0.004052 0.001263 + 513 -0.004129 -0.012886 -0.007489 + 514 -0.002878 0.001158 0.006535 + 515 -0.007680 -0.001896 0.002953 + 516 -0.000917 -0.006257 -0.002762 + 517 -0.001401 -0.003523 -0.005778 + 518 -0.001854 0.007834 0.015061 + 519 -0.010095 0.007049 -0.021128 + 520 -0.000766 -0.000153 0.007009 + 521 0.009064 -0.003223 0.017921 + 522 0.000864 -0.000043 0.007876 + 523 -0.001025 0.001319 -0.006573 + 524 -0.006395 0.000755 -0.002686 + 525 -0.032670 0.007943 0.004175 + 526 0.002953 0.006520 0.004065 + 527 0.009139 -0.008077 -0.010889 + 528 -0.002820 0.012454 -0.005504 + 529 -0.008727 0.003418 0.002451 + 530 -0.007112 -0.005703 0.023446 + 531 -0.011285 0.014165 -0.019563 + 532 -0.002562 0.003192 -0.002295 + 533 -0.003618 0.007211 0.002298 + 534 0.010325 0.001834 0.002853 + 535 0.002563 0.000345 -0.002878 + 536 0.002396 0.022293 -0.006961 + 537 0.001693 -0.002677 0.010576 + 538 -0.001561 0.000734 0.001793 + 539 -0.008542 0.015338 0.007321 + 540 -0.015880 0.015140 0.014642 + 541 0.001092 0.000090 0.000997 + 542 -0.004522 -0.004004 0.003687 + 543 0.003258 -0.006156 0.000500 + 544 -0.001608 0.002026 0.003790 + 545 -0.010430 -0.004583 0.015482 + 546 0.002628 0.011416 0.004923 + 547 -0.002068 0.005845 0.001850 + 548 0.001194 0.007931 0.007672 + 549 -0.020261 -0.007195 -0.008896 + 550 0.005399 0.001999 0.000211 + 551 0.004420 0.012603 0.006214 + 552 0.007790 0.005534 0.000006 + 553 -0.004249 0.001186 -0.000260 + 554 0.006385 -0.014925 0.000020 + 555 0.009902 0.016988 -0.004080 + 556 0.006637 -0.003469 0.000450 + 557 -0.002010 0.011423 -0.004361 + 558 -0.009074 0.013716 -0.002539 + 559 0.003243 -0.003710 -0.002565 + 560 -0.000480 -0.009433 0.000267 + 561 0.002981 -0.005587 -0.010088 + 562 0.002665 0.008169 0.002667 + 563 -0.001817 0.009035 0.022525 + 564 0.005689 0.010678 0.000603 + 565 0.003217 0.002617 0.001072 + 566 0.025108 0.001061 -0.027288 + 567 -0.003091 0.028727 0.028529 + 568 0.003991 -0.002246 0.002528 + 569 0.011195 -0.007917 0.010511 + 570 -0.006686 -0.007088 -0.000640 + 571 0.005302 0.003751 0.001484 + 572 0.001250 0.007658 -0.006666 + 573 0.018145 -0.005375 0.000139 + 574 -0.003857 0.003583 0.000238 + 575 0.006752 0.001063 0.004538 + 576 -0.006479 0.014326 -0.017669 + 577 0.001793 0.003661 0.002509 + 578 0.010186 -0.003147 0.008687 + 579 -0.001160 -0.005645 -0.003812 + 580 -0.002296 0.006997 0.000837 + 581 -0.031138 0.017223 0.000984 + 582 0.002587 -0.007480 0.015277 + 583 0.000288 -0.000668 0.001548 + 584 0.016041 -0.004051 0.004629 + 585 -0.025116 0.003224 0.009356 + 586 -0.000853 0.003188 0.004014 + 587 -0.001700 -0.004491 0.006716 + 588 -0.008947 -0.009004 -0.023328 + 589 0.005432 -0.003893 -0.001000 + 590 -0.019524 0.021049 -0.035976 + 591 0.009404 0.004475 -0.004525 + 592 -0.006508 -0.002709 0.000481 + 593 0.010852 -0.015643 0.005754 + 594 0.006526 0.026156 0.009018 + 595 -0.004611 -0.001841 0.002205 + 596 -0.013411 -0.011893 -0.011510 + 597 -0.002150 -0.000804 -0.006730 + 598 -0.002593 -0.000356 0.003104 + 599 0.009483 0.002951 -0.001362 + 600 -0.015523 -0.003843 0.010828 + 601 -0.001229 0.003953 0.000471 + 602 -0.017788 0.002114 0.033354 + 603 0.015187 -0.017947 -0.007994 + 604 -0.001335 -0.000196 0.007281 + 605 0.015188 0.007448 0.005030 + 606 -0.001538 0.002386 -0.009662 + 607 -0.001172 0.004261 0.002894 + 608 -0.002229 0.015661 0.009134 + 609 0.017428 0.004976 0.006974 + 610 -0.001490 0.003604 0.004586 + 611 -0.017720 0.006222 -0.023144 + 612 0.010016 -0.015847 -0.004678 + 613 -0.002648 0.000934 0.000698 + 614 -0.011832 0.016782 0.007626 + 615 -0.005427 0.001385 0.015386 + 616 0.003669 -0.001949 0.003946 + 617 0.005164 0.000243 0.009975 + 618 -0.000161 0.003111 0.001353 + 619 0.002976 -0.004733 0.001868 + 620 -0.002832 -0.014197 -0.023534 + 621 -0.003347 -0.011551 0.000693 + 622 0.004912 0.001701 -0.000793 + 623 0.013809 0.007164 -0.016905 + 624 0.024958 -0.010962 -0.008428 + 625 0.007422 -0.002948 -0.001308 + 626 -0.016590 -0.032000 -0.001025 + 627 0.011367 0.004098 0.010259 + 628 -0.002045 -0.000742 0.000577 + 629 -0.030845 0.001448 0.030396 + 630 0.001781 -0.017639 0.014980 + 631 0.002233 -0.004427 -0.002429 + 632 0.018586 -0.001402 0.006993 + 633 -0.012356 0.003736 0.007796 + 634 -0.004338 0.007766 0.000310 + 635 0.001990 0.000209 0.007107 + 636 -0.006343 0.005190 -0.018263 + 637 -0.005455 0.000492 -0.002847 + 638 0.000522 0.006495 0.003755 + 639 -0.001841 -0.009429 -0.001507 + 640 -0.002314 -0.002516 -0.005613 + 641 0.018652 0.002237 -0.015930 + 642 -0.002326 -0.000776 -0.003132 + 643 -0.005512 -0.000623 -0.000619 + 644 -0.001015 0.005882 0.003225 + 645 0.000586 0.023218 -0.004529 + 646 -0.001138 0.000800 0.002687 + 647 0.003627 0.013371 -0.016172 + 648 0.018968 0.017228 -0.000038 + 649 -0.002086 -0.000112 -0.007393 + 650 0.016103 0.035588 0.008775 + 651 -0.038516 0.012158 -0.009536 + 652 0.002958 0.004862 -0.007554 + 653 0.024333 0.013052 -0.023133 + 654 0.002379 -0.000049 -0.006601 + 655 0.003804 -0.003076 -0.001112 + 656 -0.004763 0.002283 -0.025897 + 657 -0.036538 -0.010672 -0.010599 + 658 -0.000713 0.003957 0.002151 + 659 -0.016531 0.001472 0.004862 + 660 -0.009287 0.028134 0.010480 + 661 0.004192 -0.003835 0.000568 + 662 0.011523 0.002433 0.036479 + 663 -0.009197 -0.041577 0.000393 + 664 0.000280 -0.002373 -0.004460 + 665 0.002206 -0.003211 0.000957 + 666 0.006211 0.013469 -0.005353 + 667 -0.000522 0.001664 -0.004748 + 668 0.004459 -0.024042 -0.023029 + 669 0.011377 0.013403 0.030836 + 670 0.003382 -0.002813 0.000451 + 671 0.000766 0.000074 -0.006820 + 672 0.013252 -0.015598 0.024274 + 673 -0.003243 0.006406 -0.002570 + 674 0.019962 -0.008888 -0.019769 + 675 -0.027628 -0.005508 -0.000297 + 676 -0.007770 -0.003882 0.002155 + 677 -0.001777 0.012358 0.000036 + 678 -0.024978 0.005564 -0.015024 + 679 0.000188 0.001017 0.004117 + 680 -0.006440 -0.003105 0.019733 + 681 -0.016780 0.005575 -0.004078 + 682 0.000151 0.001697 -0.001387 + 683 -0.002925 0.000955 -0.004378 + 684 0.000826 0.008069 0.003052 + 685 -0.003543 -0.000321 -0.000587 + 686 -0.012205 0.000432 -0.005990 + 687 0.004010 0.009678 -0.003793 + 688 0.001940 -0.000340 0.003900 + 689 0.005837 0.014815 -0.005621 + 690 -0.008710 -0.017653 0.020395 + 691 -0.001931 -0.003975 -0.002577 + 692 -0.003368 -0.014386 -0.006878 + 693 -0.013782 -0.002984 0.003522 + 694 0.004968 -0.000283 -0.003322 + 695 0.019160 0.006665 -0.007077 + 696 0.022604 -0.000847 -0.016983 + 697 0.002571 0.000550 -0.007379 + 698 -0.001443 -0.002487 -0.007727 + 699 -0.011487 -0.013883 0.019460 + 700 0.001096 -0.004750 0.003965 + 701 -0.016603 -0.010473 0.014272 + 702 0.023559 -0.001392 -0.008500 + 703 -0.002022 -0.005262 -0.004485 + 704 0.002332 -0.014942 -0.004917 + 705 -0.009402 0.006267 -0.002020 + 706 -0.000288 0.003264 -0.003564 + 707 0.004565 0.033122 -0.006655 + 708 -0.018922 -0.009521 0.000208 + 709 -0.003485 0.003285 -0.000556 + 710 0.004587 -0.002798 -0.000984 + 711 -0.006054 0.007231 -0.001425 + 712 0.004718 0.000201 -0.003948 + 713 -0.014114 0.009800 -0.004955 + 714 -0.008099 -0.004168 0.008689 + 715 0.000410 -0.000654 0.009605 + 716 0.008711 0.018707 0.002740 + 717 0.003459 -0.008185 0.010239 + 718 0.003479 0.000757 0.004467 + 719 0.000433 -0.000495 0.007710 + 720 0.012945 0.003286 -0.002052 + 721 -0.010010 -0.003567 0.006956 + 722 0.005307 -0.001615 -0.002198 + 723 -0.012515 0.011984 0.016669 + 724 0.001378 -0.002186 -0.001614 + 725 0.012587 -0.019891 0.012237 + 726 0.012601 0.007024 0.014776 + 727 -0.002983 -0.001722 -0.004228 + 728 0.015268 -0.011359 -0.002815 + 729 -0.003967 0.028638 0.000653 + 730 -0.000313 -0.000495 0.001546 + 731 -0.030938 -0.009463 -0.008649 + 732 -0.033474 -0.019299 0.015331 + 733 0.000845 -0.003919 -0.003202 + 734 -0.027178 0.011071 -0.026350 + 735 -0.007741 0.001470 -0.016184 + 736 -0.001239 0.001989 -0.002789 + 737 0.011285 0.001382 -0.006222 + 738 0.022813 -0.006205 -0.006536 + 739 0.003987 -0.004190 -0.005010 + 740 -0.007915 0.002670 -0.013878 + 741 0.004194 0.006086 -0.010350 + 742 0.006539 -0.005074 0.002196 + 743 0.015306 0.008181 0.005081 + 744 0.007865 0.003022 -0.004716 + 745 -0.001784 -0.010062 0.004309 + 746 -0.002378 -0.011275 0.006933 + 747 -0.008336 -0.001053 0.004620 + 748 -0.002979 0.004768 -0.002497 + 749 -0.000959 0.004004 -0.002600 + 750 -0.019512 -0.002978 0.005044 + 751 -0.004903 -0.000550 0.000659 + 752 -0.005086 0.005639 -0.022167 + 753 -0.008131 0.001631 -0.018889 + 754 -0.001761 -0.001628 0.000503 + 755 -0.003957 -0.007199 -0.006609 + 756 0.003155 -0.001306 0.005143 + 757 0.000937 0.008247 -0.008723 + 758 0.028994 0.004889 0.007225 + 759 -0.000469 -0.025903 0.001925 + 760 -0.001834 -0.000370 -0.001605 + 761 0.007234 -0.001225 -0.019036 + 762 -0.003442 -0.001966 0.000209 + 763 0.000445 0.007510 0.001158 + 764 -0.008348 0.004439 -0.007776 + 765 -0.012793 0.011539 0.019680 + 766 0.000065 -0.000962 -0.004032 + 767 -0.002013 -0.005477 0.003901 + 768 0.003529 0.021570 0.007224 + 769 -0.002661 0.002604 -0.003268 + 770 0.005668 -0.003962 -0.004196 + 771 -0.003633 0.008263 -0.012842 + 772 0.001811 0.001915 0.002764 + 773 0.007995 -0.017893 0.012738 + 774 -0.018466 -0.002519 -0.001997 + 775 -0.002231 0.000080 0.000338 + 776 -0.020092 -0.012422 0.010443 + 777 0.017610 0.006562 -0.019411 + 778 -0.001733 0.005494 0.004582 + 779 0.013495 0.017522 0.004058 + 780 0.014733 0.026971 -0.010419 + 781 0.001950 0.000577 -0.000870 + 782 -0.025830 0.001269 0.005271 + 783 0.007534 -0.015453 0.006553 + 784 0.004959 0.000931 -0.005022 + 785 -0.008754 0.005835 0.049441 + 786 0.010447 0.012462 0.001546 + 787 -0.001107 0.002522 0.000433 + 788 0.009871 0.011686 0.008446 + 789 -0.006988 0.002247 0.021211 + 790 0.004245 0.001822 -0.000253 + 791 0.000153 -0.002603 0.008675 + 792 0.006252 0.003177 -0.013109 + 793 -0.002534 0.003863 0.000617 + 794 -0.000057 0.004391 -0.016346 + 795 0.005974 -0.000584 -0.004834 + 796 0.001827 -0.002339 -0.002010 + 797 -0.023150 0.007693 0.012507 + 798 0.012203 0.000464 -0.020004 + 799 -0.000293 -0.001883 -0.002470 + 800 -0.004248 0.006084 0.002613 + 801 -0.013517 0.015693 0.003574 + 802 -0.009450 0.005229 -0.003400 + 803 -0.015058 -0.007700 0.001796 + 804 -0.000196 -0.003546 0.002537 + 805 0.008758 -0.003257 0.005431 + 806 0.012998 -0.011952 -0.017276 + 807 0.008558 -0.002765 0.006723 + 808 -0.001470 -0.000539 0.002965 + 809 0.024028 -0.019423 -0.012788 + 810 0.003892 0.003966 -0.001573 + 811 0.000254 0.001510 0.000089 + 812 0.024395 0.007424 -0.013783 + 813 0.006830 0.017138 0.017010 + 814 -0.001535 -0.003749 -0.001708 + 815 0.013748 -0.018314 -0.006646 + 816 0.003900 0.002047 0.006451 + 817 0.006585 0.003832 -0.000629 + 818 0.021540 0.003252 0.001280 + 819 0.007897 0.007247 -0.003727 + 820 -0.002115 -0.002434 -0.005025 + 821 -0.016735 0.003360 -0.019137 + 822 0.003237 -0.017804 -0.004111 + 823 -0.003907 0.002878 -0.003988 + 824 -0.005419 -0.002010 -0.004476 + 825 -0.006449 0.003104 -0.002766 + 826 -0.013638 -0.002258 -0.002448 + 827 -0.007838 0.000023 -0.005866 + 828 -0.006633 0.001312 -0.008943 + 829 0.001696 0.003761 -0.002125 + 830 -0.001113 -0.010288 -0.008692 + 831 0.010380 0.008838 -0.015548 + 832 -0.003164 0.004544 -0.002070 + 833 -0.001495 -0.013094 -0.000890 + 834 0.011945 -0.015741 -0.003378 + 835 -0.008802 -0.001939 -0.005442 + 836 -0.002949 -0.007279 -0.004665 + 837 0.008414 -0.021459 -0.000948 + 838 0.001330 0.000622 0.000916 + 839 -0.001965 0.001331 0.006138 + 840 0.003081 -0.004825 0.007272 + 841 0.001557 -0.005770 -0.001563 + 842 0.014285 0.020628 -0.029634 + 843 -0.006815 0.003616 0.008747 + 844 0.001116 -0.003881 -0.003556 + 845 0.008316 -0.005783 -0.005256 + 846 -0.011615 0.015346 0.026431 + 847 0.004309 0.003546 -0.004311 + 848 0.007868 -0.013572 0.000073 + 849 -0.011699 0.005875 0.003604 + 850 0.000505 -0.004069 -0.002113 + 851 0.001211 -0.005770 -0.003436 + 852 -0.004651 0.001028 0.007154 + 853 -0.003913 -0.006795 -0.004733 + 854 -0.004339 -0.014527 -0.023555 + 855 -0.006756 -0.006056 -0.008714 + 856 0.007493 0.001588 -0.006408 + 857 0.020526 0.022065 -0.006921 + 858 0.010862 0.004031 -0.001655 + 859 0.003459 -0.001125 -0.001494 + 860 -0.000710 0.004855 0.022662 + 861 -0.000022 0.009082 0.012428 + 862 -0.000591 0.002648 0.002517 + 863 0.017910 0.003993 0.005847 + 864 -0.004999 0.014284 -0.016199 + 865 -0.001700 -0.002300 0.001206 + 866 -0.016994 -0.008747 -0.012103 + 867 -0.008118 -0.008616 0.003715 + 868 -0.002056 -0.003732 -0.006667 + 869 -0.002586 -0.005666 -0.002032 + 870 -0.002179 -0.001361 -0.001378 + 871 0.001952 0.000747 -0.004175 + 872 -0.000006 -0.004573 0.003592 + 873 -0.004377 -0.012174 0.000091 + 874 -0.006945 -0.004708 0.004295 + 875 -0.011724 -0.010397 0.002368 + 876 0.006805 0.012734 0.019238 + 877 0.004959 0.005871 -0.001277 + 878 -0.012228 -0.000867 -0.006672 + 879 0.014516 0.032640 0.025985 + 880 0.000767 -0.000179 0.004816 + 881 0.006242 0.002132 0.007465 + 882 0.006812 0.003103 0.007707 + 883 0.005120 -0.003059 -0.001062 + 884 -0.008255 -0.016076 -0.002362 + 885 -0.001789 -0.014152 -0.001194 + 886 -0.009000 0.001340 0.001690 + 887 -0.020559 -0.017599 0.000329 + 888 -0.003544 -0.006539 0.004087 + 889 -0.000933 0.000538 -0.001999 + 890 0.032797 0.013397 0.000525 + 891 -0.012354 -0.008526 -0.038077 + 892 0.002953 -0.002317 -0.004454 + 893 -0.029479 -0.014864 0.005868 + 894 0.019223 0.000709 -0.013773 + 895 0.002346 -0.003694 -0.004486 + 896 -0.005275 -0.001221 -0.010755 + 897 0.010883 0.001918 -0.002099 + 898 -0.000263 -0.000830 0.005518 + 899 0.000399 -0.005578 0.011643 + 900 -0.007207 -0.006080 -0.006632 + 901 -0.000868 0.002637 -0.000416 + 902 -0.003601 0.001456 0.001019 + 903 0.003465 0.009000 0.002627 + 904 -0.005492 0.001153 0.005034 + 905 0.008501 0.009963 0.005133 + 906 0.002740 0.005510 0.005387 + 907 0.001230 0.003701 -0.010904 + 908 0.005640 0.000943 -0.026378 + 909 -0.001655 0.006661 0.001080 + 910 0.000417 -0.004485 0.000899 + 911 0.004051 -0.003590 0.002016 + 912 0.010109 -0.002124 0.001500 + 913 0.002439 0.006335 0.003103 + 914 -0.006325 0.005901 0.006397 + 915 0.008058 0.002545 0.004591 + 916 -0.001774 -0.003954 -0.005522 + 917 -0.001697 -0.002110 -0.006988 + 918 0.000641 -0.012660 -0.001878 + 919 0.000840 0.002158 -0.002127 + 920 -0.006972 -0.005865 -0.019536 + 921 -0.009078 -0.009093 0.005319 + 922 -0.002466 0.001612 -0.002348 + 923 -0.007997 0.000173 -0.007016 + 924 -0.005167 0.000122 -0.004809 + 925 0.000182 0.007626 -0.005820 + 926 -0.000187 0.006758 -0.004766 + 927 -0.005146 0.010941 -0.001145 + 928 -0.001035 0.003329 -0.000156 + 929 -0.002925 0.005286 0.005381 + 930 -0.007353 0.014383 0.015446 + 931 0.001566 0.003779 -0.001844 + 932 0.014111 -0.006162 0.016836 + 933 -0.008051 -0.000942 0.006114 + 934 0.000472 0.000581 0.003898 + 935 0.010438 -0.015336 0.026259 + 936 -0.009803 0.018803 -0.011113 + 937 -0.002622 0.001845 -0.004649 + 938 0.000192 0.006195 -0.003034 + 939 -0.004379 0.004856 -0.008876 + 940 0.005312 -0.005320 -0.000644 + 941 0.004197 0.002434 0.005873 + 942 0.001054 -0.002144 -0.009156 + 943 0.001818 0.002764 0.000410 + 944 0.002489 0.005354 -0.014128 + 945 0.003819 0.010472 0.007403 + 946 0.005262 -0.000699 0.001191 + 947 -0.002052 -0.008290 0.017377 + 948 -0.012921 -0.009037 0.007720 + 949 0.002875 -0.000206 -0.005514 + 950 0.004620 -0.003924 -0.007344 + 951 0.004396 0.015332 -0.008395 + 952 -0.001773 -0.005567 0.004807 + 953 0.014650 -0.004337 0.011316 + 954 0.007355 -0.004603 0.004796 + 955 0.001050 0.002663 -0.000049 + 956 -0.000422 0.019759 -0.003121 + 957 -0.011736 0.001700 0.005445 + 958 0.002314 -0.007359 0.001422 + 959 0.000226 -0.009157 0.011161 + 960 0.002971 -0.007641 -0.001658 + 961 0.002025 0.003310 0.000085 + 962 0.003783 0.005544 -0.002440 + 963 -0.003390 -0.001680 0.007759 + 964 -0.000259 -0.001517 -0.001671 + 965 -0.009891 -0.000275 0.002930 + 966 -0.004798 -0.018121 0.000493 + 967 0.002742 0.002196 0.002639 + 968 -0.032110 0.008681 0.017593 + 969 -0.005767 -0.003804 -0.003447 + 970 -0.001025 -0.001901 0.007377 + 971 -0.025416 -0.005633 -0.009650 + 972 -0.002448 -0.002342 0.009184 + 973 0.000510 -0.004313 0.003297 + 974 -0.004244 -0.006185 -0.015114 + 975 0.002817 0.008222 0.025232 + 976 -0.005979 0.000432 0.003264 + 977 0.000348 0.000126 0.007237 + 978 -0.031461 0.008376 -0.002490 + 979 -0.003066 -0.005264 0.001528 + 980 0.000500 -0.005194 -0.000082 + 981 -0.006145 0.003915 -0.013465 + 982 -0.002081 -0.001596 0.001268 + 983 0.004918 -0.004802 -0.009499 + 984 -0.008729 0.005751 0.010881 + 985 0.002456 -0.001947 -0.001558 + 986 -0.006566 -0.000024 0.003315 + 987 0.007532 0.005898 -0.002575 + 988 -0.004247 -0.003264 -0.000409 + 989 0.002165 -0.007499 0.004990 + 990 -0.000419 0.003692 -0.004472 + 991 -0.001571 -0.000159 -0.000431 + 992 0.005413 0.009517 0.004397 + 993 -0.002643 -0.002292 -0.001478 + 994 -0.003884 0.005066 -0.000457 + 995 0.006816 0.009263 -0.003376 + 996 -0.007273 0.011919 0.000514 + 997 0.000030 0.001409 0.005477 + 998 0.005334 -0.020033 0.004464 + 999 0.016228 0.009598 -0.007106 + 1000 -0.002283 -0.004481 0.001317 + 1001 -0.002631 -0.006631 -0.004233 + 1002 0.004184 0.000805 0.014756 + 1003 0.000408 -0.003693 0.003308 + 1004 0.004530 -0.006410 -0.006453 + 1005 -0.004928 -0.003846 0.015168 + 1006 0.003101 -0.001511 0.005308 + 1007 0.014081 -0.002443 0.012313 + 1008 0.002846 0.010440 -0.000376 + 1009 0.003569 -0.002175 -0.006662 + 1010 -0.008368 -0.011644 -0.006989 + 1011 0.019824 -0.004949 -0.018661 + 1012 0.003202 -0.011850 0.003160 + 1013 0.014918 -0.009378 0.018579 + 1014 -0.002594 0.004575 -0.001959 + 1015 -0.002298 0.000413 -0.003910 + 1016 0.012837 -0.003799 -0.015681 + 1017 -0.005955 -0.000660 0.004171 + 1018 0.001582 0.000975 0.000146 + 1019 0.006776 -0.014144 -0.007821 + 1020 0.004234 -0.001693 -0.007198 + 1021 -0.001802 -0.002656 0.003257 + 1022 0.028537 0.012512 0.005966 + 1023 -0.000026 -0.011732 -0.013572 + 1024 0.006685 0.008417 -0.002619 + 1025 -0.018380 0.006240 0.006444 + 1026 0.014195 0.009753 -0.004447 + 1027 -0.000769 -0.006799 -0.003510 + 1028 -0.003532 0.013774 -0.009337 + 1029 0.005263 0.018084 -0.010946 + 1030 0.004102 0.004262 -0.002426 + 1031 -0.003256 -0.005354 0.003498 + 1032 -0.021894 -0.003478 0.016467 + 1033 0.001456 -0.004355 -0.002070 + 1034 -0.005859 -0.004113 -0.005871 + 1035 -0.005758 -0.006886 -0.016585 + 1036 0.001562 0.006459 -0.000209 + 1037 0.001331 0.004667 0.000892 + 1038 0.012898 0.027063 -0.008125 + 1039 0.002117 0.007131 0.002457 + 1040 0.026605 0.010046 0.019045 + 1041 -0.017364 0.007077 -0.014953 + 1042 -0.000452 0.009291 0.004625 + 1043 -0.011059 0.009571 0.015357 + 1044 0.027928 -0.000208 0.009437 + 1045 0.003475 -0.004274 -0.000546 + 1046 0.012160 -0.001385 -0.006922 + 1047 -0.016274 -0.008100 -0.006675 + 1048 -0.003853 -0.003278 -0.001388 + 1049 0.014697 -0.003341 -0.007454 + 1050 0.011346 -0.009086 -0.006461 + 1051 -0.001161 -0.003940 -0.002833 + 1052 0.011182 0.001281 -0.000803 + 1053 -0.001345 -0.002375 -0.003580 + 1054 0.004028 0.002256 0.000990 + 1055 0.013302 0.008212 -0.007566 + 1056 0.029179 -0.014499 0.008878 + 1057 0.000706 0.001652 0.001826 + 1058 0.000498 -0.007266 0.024956 + 1059 0.001324 -0.008155 0.011295 + 1060 0.000971 -0.006253 -0.004688 + 1061 -0.004746 -0.005680 -0.016047 + 1062 -0.000356 -0.009050 -0.006561 + 1063 -0.000866 0.005460 0.000045 + 1064 -0.006882 0.011747 0.020163 + 1065 -0.000733 0.001409 -0.010900 + 1066 -0.003804 0.003558 0.001444 + 1067 0.004513 0.002071 -0.017536 + 1068 -0.000869 -0.002704 -0.014336 + 1069 -0.003015 0.003241 -0.002075 + 1070 0.003734 -0.005456 -0.000879 + 1071 -0.006686 -0.008010 -0.008654 + 1072 -0.000541 -0.003669 -0.004373 + 1073 0.003151 -0.002513 -0.013951 + 1074 0.003979 -0.005557 0.002931 + 1075 -0.005175 -0.004387 0.000228 + 1076 -0.005613 -0.012392 -0.029351 + 1077 0.009704 0.009953 -0.015680 + 1078 -0.000915 0.003660 -0.003078 + 1079 0.002529 0.001465 0.006987 + 1080 0.000880 0.001866 -0.004217 + 1081 0.000835 -0.000410 0.000029 + 1082 0.003324 -0.009356 0.012151 + 1083 -0.000797 0.009753 -0.012613 + 1084 0.004557 -0.006851 0.000257 + 1085 0.014378 -0.010986 -0.004036 + 1086 0.001889 0.001865 0.000904 + 1087 0.003881 0.000306 -0.000266 + 1088 0.006043 -0.030376 0.018797 + 1089 -0.001012 -0.002296 0.000324 + 1090 0.007042 0.008682 0.007323 + 1091 0.010016 0.002442 -0.028255 + 1092 -0.004827 0.009414 -0.012200 + 1093 0.002178 0.003272 0.000190 + 1094 0.003486 0.001815 -0.002585 + 1095 0.006020 0.002953 -0.010998 + 1096 0.002573 -0.000704 0.002051 + 1097 -0.010233 0.004335 0.005568 + 1098 0.003397 0.002649 0.010631 + 1099 -0.000367 -0.008657 0.004003 + 1100 0.006810 -0.008282 0.003316 + 1101 -0.008301 -0.011638 -0.006525 + 1102 -0.001900 -0.008810 0.001531 + 1103 0.003628 0.008111 0.009571 + 1104 0.017147 0.000173 0.003988 + 1105 0.006161 0.005444 0.001389 + 1106 -0.033784 0.028714 -0.002486 + 1107 0.022179 0.015181 0.025221 + 1108 0.002935 0.001125 -0.009560 + 1109 0.013392 0.009490 0.002655 + 1110 0.015380 -0.002935 -0.004728 + 1111 0.002760 -0.001052 0.002516 + 1112 -0.006737 0.002302 0.012384 + 1113 -0.004649 -0.009652 -0.009326 + 1114 -0.003333 0.004385 -0.006004 + 1115 -0.014175 0.007089 0.000199 + 1116 0.009875 0.004925 0.012791 + 1117 -0.004828 0.000366 0.001718 + 1118 0.009618 -0.007069 -0.012330 + 1119 -0.021489 -0.009155 -0.001603 + 1120 -0.001360 0.002089 -0.003585 + 1121 0.003530 -0.001847 0.010254 + 1122 0.016468 0.005240 -0.014692 + 1123 0.001989 -0.000949 0.003286 + 1124 0.022107 -0.012110 -0.007316 + 1125 0.012518 -0.010337 0.015891 + 1126 0.000850 -0.001413 -0.001737 + 1127 -0.014943 0.000360 -0.000490 + 1128 -0.027983 -0.005206 0.004037 + 1129 0.011232 0.000349 -0.006679 + 1130 -0.005484 -0.003095 -0.004430 + 1131 -0.005050 -0.002005 -0.015837 + 1132 -0.000470 0.001924 0.001131 + 1133 -0.016506 0.005240 0.008171 + 1134 0.011977 -0.012388 0.003671 + 1135 -0.000818 0.001081 0.001571 + 1136 0.009956 -0.006601 -0.002667 + 1137 -0.013344 0.009962 -0.000602 + 1138 -0.004379 0.004681 0.005655 + 1139 -0.022717 0.009805 -0.016911 + 1140 -0.017223 0.002867 0.018671 + 1141 -0.000339 -0.000149 -0.001276 + 1142 0.002292 0.016872 -0.004987 + 1143 -0.012964 -0.000693 -0.007140 + 1144 -0.002149 0.004008 -0.001355 + 1145 0.012575 0.018012 -0.011467 + 1146 -0.018572 0.011663 -0.005755 + 1147 0.000951 -0.000232 0.005705 + 1148 0.001030 -0.002411 0.005162 + 1149 -0.004871 0.010528 0.006213 + 1150 -0.003431 0.005236 0.003321 + 1151 -0.006083 0.008172 0.003730 + 1152 0.021201 0.002738 -0.026021 + 1153 -0.000559 -0.001274 0.002074 + 1154 -0.000342 -0.008595 -0.003314 + 1155 -0.004563 0.013150 0.001114 + 1156 0.002547 -0.003346 0.000793 + 1157 -0.004000 0.002915 0.001908 + 1158 0.008526 -0.013385 0.001263 + 1159 0.003331 -0.001629 -0.001592 + 1160 0.012216 0.004263 0.001290 + 1161 -0.024729 0.027722 0.012828 + 1162 -0.004556 0.005331 -0.000790 + 1163 -0.001260 0.004809 0.012624 + 1164 0.009151 0.007740 0.005908 + 1165 0.006739 -0.002486 0.000962 + 1166 0.002801 -0.001010 0.007063 + 1167 0.006266 -0.009780 0.000447 + 1168 -0.001756 -0.006121 -0.000399 + 1169 0.002128 0.011752 0.003187 + 1170 -0.000744 -0.004455 -0.001624 + 1171 -0.003120 -0.007987 0.008768 + 1172 -0.001279 -0.014309 0.014916 + 1173 -0.003496 -0.005392 0.006518 + 1174 -0.005252 -0.000094 0.002610 + 1175 -0.004319 0.000327 0.003799 + 1176 0.014469 -0.001407 -0.023557 + 1177 -0.001733 0.011173 0.001097 + 1178 0.019607 0.000729 -0.008577 + 1179 -0.013430 0.021297 -0.011104 + 1180 0.005550 -0.002953 -0.004489 + 1181 -0.021164 -0.004283 0.009224 + 1182 0.020762 -0.011806 0.008058 + 1183 -0.003934 -0.006346 0.000789 + 1184 -0.004154 -0.012917 -0.000804 + 1185 0.001834 -0.003234 0.006486 + 1186 -0.003359 -0.000166 0.000482 + 1187 -0.010938 -0.009570 0.011838 + 1188 -0.006339 -0.002743 -0.017319 + 1189 -0.002008 -0.000238 -0.002842 + 1190 0.009730 0.002797 -0.000255 + 1191 0.004802 0.018470 -0.005529 + 1192 0.002978 0.003254 0.000406 + 1193 0.001762 -0.016118 0.017481 + 1194 0.009625 0.005549 -0.002833 + 1195 -0.005277 -0.000015 -0.004247 + 1196 0.008535 -0.018189 -0.023760 + 1197 -0.020839 0.008581 0.007193 + 1198 0.001976 -0.001531 0.001386 + 1199 -0.012488 -0.005613 0.004418 + 1200 0.012387 0.001324 -0.002579 + 1201 0.004612 0.001574 0.002430 + 1202 0.004011 0.024078 0.008286 + 1203 0.028635 -0.001749 -0.000378 + 1204 -0.001292 -0.004163 0.001688 + 1205 0.018917 -0.005327 -0.022863 + 1206 -0.021498 0.026796 -0.015481 + 1207 -0.004360 -0.003023 -0.007483 + 1208 0.015222 -0.007834 -0.014901 + 1209 -0.015487 -0.004003 -0.024684 + 1210 0.000162 -0.000232 -0.002511 + 1211 0.005663 0.001759 0.003041 + 1212 -0.026577 0.001752 0.009499 + 1213 -0.002118 -0.004800 0.002106 + 1214 0.012772 0.013880 -0.004149 + 1215 0.008831 0.004495 0.004278 + 1216 -0.001002 0.000396 0.000450 + 1217 0.001493 -0.000300 0.006615 + 1218 0.022789 -0.011336 -0.001626 + 1219 -0.002165 0.002305 -0.004399 + 1220 -0.001727 0.010653 0.006150 + 1221 0.001799 -0.000399 -0.015101 + 1222 -0.002535 -0.001664 0.000167 + 1223 -0.007939 0.009699 -0.003581 + 1224 -0.009214 -0.009452 -0.003331 + 1225 -0.002745 0.003249 0.011490 + 1226 0.010727 -0.015563 0.011870 + 1227 -0.003771 0.013856 -0.015486 + 1228 -0.000932 0.001513 0.000721 + 1229 -0.002528 0.000192 0.015301 + 1230 -0.027023 -0.007231 0.009659 + 1231 -0.005525 0.001099 -0.001369 + 1232 -0.002318 -0.008510 -0.009719 + 1233 -0.005945 -0.008347 0.009845 + 1234 -0.000817 -0.006097 -0.001394 + 1235 0.026844 0.005400 -0.013998 + 1236 -0.019837 0.017329 -0.010038 + 1237 -0.002691 -0.005371 -0.000786 + 1238 -0.007304 -0.006372 0.007409 + 1239 -0.014066 -0.005252 0.014237 + 1240 -0.000660 -0.004157 -0.007445 + 1241 -0.015343 -0.015681 0.000525 + 1242 -0.004856 0.008296 -0.020506 + 1243 -0.000451 -0.006253 0.005274 + 1244 -0.016626 -0.024128 0.003146 + 1245 0.003430 -0.001516 0.006995 + 1246 0.002369 0.000761 -0.000692 + 1247 -0.011034 0.017913 -0.003576 + 1248 0.014886 0.005052 0.010870 + 1249 0.000976 0.003044 0.004043 + 1250 0.002084 0.009119 -0.003484 + 1251 -0.004682 -0.003095 0.024419 + 1252 -0.001872 0.005519 -0.003878 + 1253 0.014045 0.004474 0.006660 + 1254 -0.006683 -0.012923 -0.006357 + 1255 -0.007125 -0.002296 0.002894 + 1256 -0.009126 -0.000293 0.008175 + 1257 -0.005668 -0.002902 -0.000640 + 1258 -0.009805 0.000500 -0.001546 + 1259 -0.007254 -0.007274 0.010849 + 1260 0.005786 0.004719 0.004479 + 1261 0.000767 -0.007091 -0.002809 + 1262 -0.010861 -0.024470 -0.006678 + 1263 0.010352 0.003874 -0.018616 + 1264 -0.001332 -0.000776 -0.001533 + 1265 0.005055 -0.002761 -0.000154 + 1266 0.001293 -0.010766 0.003695 + 1267 0.004101 0.005423 0.004161 + 1268 -0.006495 -0.001645 0.007645 + 1269 0.024277 0.000761 0.018148 + 1270 0.000384 -0.004677 0.001777 + 1271 -0.000305 -0.022286 0.006378 + 1272 0.014900 -0.009298 0.005029 + 1273 -0.002201 -0.002422 -0.001266 + 1274 0.002419 0.000621 -0.006170 + 1275 0.002242 -0.003567 -0.006329 + 1276 0.001155 0.006214 -0.002164 + 1277 -0.025679 0.011598 0.001775 + 1278 -0.016652 0.005061 0.002255 + 1279 -0.000163 0.000193 -0.001041 + 1280 -0.002822 -0.004131 -0.007696 + 1281 -0.007029 0.005316 -0.012422 + 1282 -0.001259 -0.001443 0.001295 + 1283 -0.000992 -0.027820 -0.000474 + 1284 -0.012190 -0.043729 -0.008054 + 1285 -0.001840 -0.001572 0.001104 + 1286 0.008311 0.001263 -0.001841 + 1287 0.001277 0.000429 -0.007113 + 1288 -0.005029 -0.002280 -0.002761 + 1289 -0.024723 0.012515 -0.012864 + 1290 -0.013845 -0.020399 0.001674 + 1291 -0.000161 0.002303 0.004199 + 1292 -0.010956 -0.010528 0.017163 + 1293 0.023554 -0.006815 0.021159 + 1294 0.000772 -0.000829 0.004462 + 1295 0.024106 -0.007189 -0.017980 + 1296 -0.011795 0.000225 0.018351 + 1297 -0.002503 0.000288 -0.000931 + 1298 -0.001901 -0.006775 -0.001166 + 1299 -0.002626 0.004209 -0.000596 + 1300 -0.003248 -0.009856 0.001496 + 1301 -0.008616 0.000206 -0.000660 + 1302 0.012991 -0.001944 0.010735 + 1303 0.000183 0.003767 -0.002207 + 1304 0.002875 0.006021 0.006091 + 1305 -0.003343 -0.008883 0.015455 + 1306 -0.003761 0.009400 -0.007147 + 1307 -0.002601 -0.012510 0.005900 + 1308 -0.013464 0.021935 0.006364 + 1309 0.007717 -0.006568 -0.004280 + 1310 0.004551 -0.013432 0.001741 + 1311 0.016676 -0.009730 -0.005415 + 1312 -0.003518 -0.000115 0.000120 + 1313 -0.018566 -0.004441 0.007076 + 1314 0.011422 0.004168 0.013848 + 1315 -0.002232 0.003004 -0.005210 + 1316 -0.004985 -0.000655 -0.007286 + 1317 -0.004756 0.005461 -0.010032 + 1318 0.003296 -0.000345 0.003797 + 1319 0.000013 0.003387 0.009258 + 1320 -0.001175 0.009021 0.016554 + 1321 0.004610 0.000563 0.001890 + 1322 0.001511 0.004957 0.010795 + 1323 -0.000517 0.009529 0.012695 + 1324 0.003561 -0.002127 -0.002139 + 1325 -0.016355 -0.004573 0.011414 + 1326 0.002437 -0.000969 0.003958 + 1327 -0.003191 0.002772 0.003706 + 1328 0.002188 0.004078 0.024902 + 1329 0.005804 0.008997 0.000514 + 1330 0.000169 -0.001823 0.006601 + 1331 -0.012837 0.016738 0.032499 + 1332 -0.003787 -0.003993 0.005792 + 1333 -0.006500 -0.001952 -0.005568 + 1334 0.004632 0.002607 -0.001417 + 1335 0.007826 -0.018417 0.003893 + 1336 0.001400 0.000629 -0.002329 + 1337 -0.026090 -0.010827 -0.007428 + 1338 0.014757 0.003359 0.005866 + 1339 0.005344 0.002452 0.000637 + 1340 0.002304 0.001516 0.008371 + 1341 0.003116 0.003502 0.000920 + 1342 0.000219 0.006872 -0.006361 + 1343 0.004872 0.004948 -0.015461 + 1344 0.002293 0.008990 -0.007103 + 1345 -0.000248 -0.001405 -0.000404 + 1346 0.016050 0.005473 0.014883 + 1347 0.000661 0.010958 0.009762 + 1348 0.002507 0.004854 0.004016 + 1349 -0.000026 0.005865 -0.004933 + 1350 -0.003541 0.012071 0.011984 + 1351 -0.000388 -0.001662 -0.002624 + 1352 -0.008781 0.002236 0.005933 + 1353 -0.002303 0.010321 -0.013971 + 1354 0.000266 0.005381 0.006218 + 1355 -0.030793 -0.017551 0.006520 + 1356 -0.001710 0.006198 0.003481 + 1357 -0.000575 0.000387 0.003498 + 1358 0.011844 0.006387 0.013823 + 1359 -0.004149 -0.001630 0.001064 + 1360 0.002966 -0.001211 -0.000529 + 1361 0.011026 0.001160 0.001568 + 1362 0.015143 -0.001234 0.000065 + 1363 0.000976 0.001952 -0.002769 + 1364 0.013527 0.011152 0.001594 + 1365 -0.000179 -0.000211 -0.002554 + 1366 -0.005351 -0.004969 -0.002979 + 1367 -0.006889 0.021662 -0.005435 + 1368 -0.002462 0.016113 0.008657 + 1369 -0.000975 0.000751 -0.000755 + 1370 -0.003243 0.006738 -0.001393 + 1371 -0.002267 -0.000779 0.003167 + 1372 0.001566 -0.003190 -0.000583 + 1373 -0.002018 -0.005136 0.012563 + 1374 -0.006828 0.007134 0.011132 + 1375 0.005244 -0.004715 -0.003319 + 1376 -0.010064 -0.001392 0.024842 + 1377 -0.003331 -0.012180 0.011450 + 1378 0.005044 -0.003538 0.000197 + 1379 0.014932 -0.005316 0.014871 + 1380 0.002959 -0.015155 -0.010790 + 1381 0.004288 0.003508 0.003045 + 1382 0.010516 0.006731 0.001181 + 1383 0.003157 0.002004 0.039661 + 1384 -0.003464 -0.000341 -0.002519 + 1385 0.000767 -0.010574 0.002375 + 1386 0.012132 0.009405 0.005728 + 1387 -0.002537 0.005096 -0.000141 + 1388 0.008455 -0.000335 0.003398 + 1389 0.000567 0.012932 0.006368 + 1390 0.007440 -0.002304 0.001444 + 1391 0.003946 0.007849 -0.005030 + 1392 0.012038 -0.016280 0.007159 + 1393 -0.001061 -0.002610 -0.000083 + 1394 0.010905 -0.006613 -0.001941 + 1395 -0.013885 -0.027620 0.005494 + 1396 0.013746 0.003525 0.007163 + 1397 0.003586 0.002644 -0.010792 + 1398 0.018544 0.013850 0.017322 + 1399 0.004571 0.000027 -0.001760 + 1400 0.012220 0.001858 -0.006751 + 1401 0.009850 -0.002003 0.019339 + 1402 -0.001383 0.002281 -0.007042 + 1403 -0.003363 0.001654 -0.017801 + 1404 0.011330 0.009635 0.005470 + 1405 0.000650 -0.001098 -0.005942 + 1406 0.005198 -0.008028 -0.003832 + 1407 0.017668 -0.005738 0.026099 + 1408 -0.001891 0.001162 0.003476 + 1409 -0.003537 0.018838 0.000972 + 1410 0.007980 0.016250 0.030292 + 1411 -0.001348 0.000197 0.004181 + 1412 -0.002255 -0.008393 -0.001355 + 1413 -0.008567 -0.008184 -0.000151 + 1414 -0.001145 0.001777 -0.004250 + 1415 -0.002565 -0.000609 -0.002622 + 1416 0.017182 0.009342 -0.008899 + 1417 -0.000336 -0.000833 -0.006619 + 1418 0.006594 -0.014023 -0.011705 + 1419 -0.010047 -0.002912 -0.003804 + 1420 0.005759 0.000406 0.005233 + 1421 -0.013174 -0.018780 -0.002966 + 1422 -0.003551 -0.005212 0.011087 + 1423 -0.001811 -0.005836 -0.002120 + 1424 -0.008296 0.022099 0.012646 + 1425 0.010130 0.006059 0.033707 + 1426 0.001039 -0.001025 -0.000459 + 1427 0.004468 0.000527 0.001539 + 1428 -0.001728 -0.005304 0.003140 + 1429 -0.000141 -0.003112 0.003400 + 1430 0.007530 -0.026022 0.005020 + 1431 -0.011982 0.032142 -0.001998 + 1432 -0.001642 0.003923 -0.003350 + 1433 0.016086 -0.002664 -0.005695 + 1434 -0.010354 0.000136 0.021071 + 1435 0.001502 -0.001507 0.005856 + 1436 -0.003359 -0.017617 -0.013060 + 1437 -0.001621 -0.013764 -0.008355 + 1438 -0.006074 0.001165 0.001910 + 1439 -0.004946 0.003618 0.011324 + 1440 -0.007761 0.002697 -0.006763 + 1441 -0.009332 0.000898 0.000750 + 1442 -0.017083 -0.010335 0.011191 + 1443 0.020780 0.013466 -0.015083 + 1444 -0.008140 -0.008032 -0.000180 + 1445 -0.001836 -0.008988 0.003973 + 1446 -0.008280 -0.004548 -0.003224 + 1447 0.000996 -0.002062 -0.001184 + 1448 -0.001863 -0.012096 0.003957 + 1449 -0.027050 0.007989 0.002157 + 1450 -0.001321 -0.000325 0.001355 + 1451 -0.006885 -0.000536 -0.022446 + 1452 0.008792 -0.007975 0.003329 + 1453 -0.003682 -0.004782 -0.002567 + 1454 -0.001180 -0.009011 0.018662 + 1455 -0.000958 -0.004899 0.013723 + 1456 0.000545 0.011919 -0.001753 + 1457 0.023799 0.010298 -0.002649 + 1458 0.014717 0.007757 -0.005400 + 1459 -0.004576 -0.007691 0.001365 + 1460 -0.006577 -0.016846 -0.022862 + 1461 -0.005206 0.003687 0.012428 + 1462 0.001923 -0.004758 -0.001993 + 1463 0.006600 0.017503 0.006935 + 1464 -0.006747 -0.003482 -0.000067 + 1465 0.000613 0.004580 0.004038 + 1466 -0.001945 0.022605 -0.000652 + 1467 0.017624 -0.001392 0.003829 + 1468 -0.003065 -0.003003 -0.000747 + 1469 -0.012664 -0.016566 -0.007030 + 1470 0.008660 -0.008358 0.004763 + 1471 -0.004008 0.000421 -0.006040 + 1472 0.003555 0.008566 -0.015842 + 1473 -0.001032 0.001700 -0.010204 + 1474 -0.000556 0.000599 0.003074 + 1475 0.001542 0.002939 0.005269 + 1476 -0.005281 -0.001944 0.003338 + 1477 -0.000195 -0.000293 -0.001004 + 1478 -0.009991 -0.005354 -0.013386 + 1479 -0.000476 -0.017594 0.007900 + 1480 0.000550 -0.000431 0.001422 + 1481 0.018094 -0.005183 0.016234 + 1482 0.010706 0.011668 -0.017772 + 1483 0.001291 0.006499 0.000951 + 1484 0.009985 -0.016962 0.009714 + 1485 0.020849 0.018365 -0.008351 + 1486 0.006940 0.004692 -0.002409 + 1487 0.022308 0.010182 -0.022897 + 1488 0.000269 0.008847 0.011834 + 1489 0.002051 0.007334 -0.000125 + 1490 -0.023048 0.013759 -0.030276 + 1491 0.023523 -0.005817 0.007754 + 1492 -0.001269 0.002979 0.001311 + 1493 -0.005596 0.006174 0.011007 + 1494 -0.009061 0.022719 0.002133 + 1495 -0.001128 0.004307 -0.002381 + 1496 -0.004340 0.013891 -0.003505 + 1497 0.001822 -0.005505 -0.001135 + 1498 -0.000910 0.001437 0.000165 + 1499 0.004510 -0.000360 -0.006425 + 1500 0.003993 0.000498 0.007321 + 1501 -0.002868 -0.000316 -0.000509 + 1502 0.000620 0.011286 0.008461 + 1503 -0.013079 -0.008157 0.007561 + 1504 -0.003002 0.003413 0.004968 + 1505 0.015262 -0.005133 0.012052 + 1506 -0.003968 -0.003643 0.003514 + 1507 0.005087 -0.001882 -0.000518 + 1508 0.000932 -0.002238 0.000800 + 1509 -0.008149 0.000695 -0.000827 + 1510 -0.001261 -0.003375 0.000333 + 1511 -0.001224 -0.004135 -0.003080 + 1512 0.009246 -0.010372 0.026354 + 1513 0.000697 -0.003200 0.001222 + 1514 -0.002319 0.003800 0.022860 + 1515 -0.018205 0.011600 -0.011416 + 1516 -0.001731 -0.001076 0.002612 + 1517 -0.004661 -0.010783 -0.001505 + 1518 0.016208 0.002810 0.004482 + 1519 0.003508 -0.001750 0.002537 + 1520 0.024576 -0.026041 -0.004083 + 1521 -0.019140 0.000844 0.001909 + 1522 -0.000341 0.001152 0.001967 + 1523 -0.020076 0.003364 0.001315 + 1524 -0.000942 0.000692 -0.003283 + 1525 -0.006519 -0.000419 0.000991 + 1526 -0.004033 0.006531 0.004791 + 1527 0.005626 0.012187 -0.014266 + 1528 0.001113 -0.004253 0.011930 + 1529 -0.010144 0.003567 0.009059 + 1530 -0.003464 0.001115 0.011591 + 1531 0.000006 0.000074 0.005751 + 1532 0.003604 0.008464 0.010627 + 1533 -0.004351 -0.009621 -0.000453 + 1534 -0.000196 -0.001160 0.002795 + 1535 -0.006855 0.001414 0.005552 + 1536 -0.000894 -0.002102 0.005053 + 1537 -0.002040 -0.005887 -0.003590 + 1538 -0.006852 -0.011947 -0.023080 + 1539 -0.016070 0.000160 0.010390 + 1540 0.004712 0.002848 -0.002998 + 1541 -0.004259 0.007840 0.008142 + 1542 -0.004861 0.004263 0.011728 + 1543 0.006968 -0.004871 0.004119 + 1544 -0.016558 -0.002046 -0.006090 + 1545 -0.006229 0.004475 0.001436 + 1546 -0.002341 -0.004733 -0.003946 + 1547 0.003563 0.004733 0.009615 + 1548 -0.013018 0.004747 -0.004733 + 1549 0.001703 -0.000331 0.003605 + 1550 0.005459 -0.002653 -0.012447 + 1551 0.013689 0.008625 -0.003301 + 1552 0.003195 0.001205 -0.000779 + 1553 -0.003336 -0.011439 -0.004979 + 1554 0.001015 0.018568 -0.007361 + 1555 -0.001647 -0.003759 0.001214 + 1556 0.015583 -0.016961 0.000384 + 1557 -0.011138 -0.013161 -0.015913 + 1558 0.005848 -0.002193 -0.007682 + 1559 0.009577 -0.005765 0.010025 + 1560 0.006984 0.005858 -0.020668 + 1561 -0.005040 0.001396 0.001932 + 1562 0.007071 0.009231 0.007700 + 1563 0.001743 0.005137 0.005850 + 1564 0.001857 0.002145 -0.004455 + 1565 -0.007462 0.014047 -0.012730 + 1566 0.013730 -0.006385 0.009586 + 1567 -0.002000 0.003453 -0.001882 + 1568 -0.009622 -0.007424 -0.003371 + 1569 -0.006993 -0.018224 -0.006858 + 1570 0.001461 0.001281 -0.002568 + 1571 0.018901 0.002357 0.001811 + 1572 -0.001592 0.019333 -0.002732 + 1573 -0.001308 -0.005730 -0.002519 + 1574 -0.014074 0.007287 0.021518 + 1575 -0.017324 -0.018775 -0.005647 + 1576 0.002340 -0.001593 0.004994 + 1577 -0.000516 0.003608 0.002676 + 1578 -0.014840 -0.017283 -0.001508 + 1579 -0.001557 -0.002471 -0.002555 + 1580 0.016654 -0.033672 0.006595 + 1581 0.013351 -0.030070 0.003443 + 1582 0.003752 0.001449 0.001862 + 1583 -0.011257 -0.002704 0.007355 + 1584 0.002139 0.006577 0.012771 + 1585 0.002251 0.002492 -0.002180 + 1586 0.010691 -0.005615 -0.001517 + 1587 -0.018738 0.016070 0.006914 + 1588 -0.001600 0.000180 0.001378 + 1589 0.004891 -0.007732 -0.013906 + 1590 -0.015149 0.011285 0.002913 + 1591 0.003944 -0.001162 -0.002407 + 1592 -0.013220 -0.006427 -0.006873 + 1593 -0.008388 0.022805 -0.011588 + 1594 0.000621 -0.004836 0.005509 + 1595 0.006148 -0.013451 0.002326 + 1596 -0.001161 -0.012639 -0.002024 + 1597 -0.005042 0.000613 0.003072 + 1598 -0.002560 -0.009516 -0.007164 + 1599 -0.007736 0.003315 0.007824 + 1600 -0.002409 -0.002549 -0.003082 + 1601 -0.002839 0.004415 -0.008830 + 1602 -0.006633 -0.001003 -0.004060 + 1603 -0.004810 -0.007495 -0.004047 + 1604 0.005200 -0.017270 0.009101 + 1605 0.000670 -0.009280 -0.012848 + 1606 -0.003830 0.001924 -0.002728 + 1607 -0.035525 0.007821 -0.020602 + 1608 0.016575 -0.019547 -0.006176 + 1609 0.003828 0.000099 -0.002605 + 1610 0.017387 0.007652 0.014875 + 1611 0.012190 0.014852 0.016071 + 1612 -0.003436 0.002187 -0.001035 + 1613 -0.005586 -0.003901 0.006033 + 1614 -0.005884 -0.005331 -0.011796 + 1615 -0.001799 -0.005019 0.004011 + 1616 0.002094 -0.028579 0.008471 + 1617 0.023334 0.020189 0.016696 + 1618 -0.000653 -0.003079 -0.001689 + 1619 -0.005925 -0.004542 -0.007489 + 1620 0.003980 0.000361 0.005598 + 1621 -0.000999 0.004025 -0.003724 + 1622 0.000058 0.024442 0.006515 + 1623 0.011473 -0.013431 0.004073 + 1624 0.002923 -0.003314 0.001931 + 1625 0.003377 -0.006029 -0.008704 + 1626 0.002413 0.015094 0.010447 + 1627 0.003654 -0.000619 -0.001261 + 1628 -0.004232 -0.000930 0.001384 + 1629 0.019160 0.000313 -0.006734 + 1630 0.003534 0.002394 -0.000501 + 1631 -0.008068 0.002953 0.008451 + 1632 0.014612 0.006975 -0.004278 + 1633 0.001620 0.003004 0.003226 + 1634 -0.007605 -0.007788 0.011245 + 1635 0.020296 -0.014907 -0.003043 + 1636 -0.002678 -0.006261 0.001869 + 1637 -0.007968 -0.013586 -0.003793 + 1638 -0.015202 -0.007224 -0.014352 + 1639 -0.005816 -0.003019 0.006480 + 1640 -0.001607 -0.004084 0.006246 + 1641 0.008520 -0.008049 0.002824 + 1642 -0.000658 -0.004008 -0.000300 + 1643 -0.000444 0.000650 -0.012168 + 1644 -0.006399 -0.006883 0.005254 + 1645 -0.001317 0.006093 0.001522 + 1646 -0.010770 -0.004270 -0.010989 + 1647 -0.005520 0.020979 0.012203 + 1648 -0.004763 0.001957 0.003649 + 1649 -0.010531 0.001095 0.022741 + 1650 0.001695 -0.009764 -0.029750 + 1651 0.000561 0.003660 0.004562 + 1652 0.004814 -0.011887 -0.011791 + 1653 0.015151 -0.017660 -0.020515 + 1654 -0.003720 -0.008154 0.002101 + 1655 -0.006836 0.005342 0.006830 + 1656 -0.008891 -0.005752 0.002656 + 1657 -0.004211 -0.006534 0.001470 + 1658 0.024344 -0.009232 0.001415 + 1659 -0.010793 -0.032076 -0.013330 + 1660 -0.000393 0.010082 -0.000260 + 1661 -0.003386 0.024037 -0.002341 + 1662 0.005231 -0.007154 0.002310 + 1663 0.004778 0.000685 -0.001247 + 1664 0.006845 -0.000146 -0.002439 + 1665 0.002831 0.001509 -0.001312 + 1666 -0.004575 0.002015 0.002231 + 1667 -0.008714 0.004773 0.019310 + 1668 -0.009036 0.006437 0.017025 + 1669 -0.001102 -0.003004 0.003294 + 1670 0.004690 0.016121 0.007181 + 1671 -0.000881 -0.003815 0.001639 + 1672 -0.000053 -0.001708 0.002633 + 1673 -0.004620 0.003536 0.000715 + 1674 -0.002636 -0.005429 0.007498 + 1675 0.002307 0.001406 0.002665 + 1676 -0.005270 -0.001969 0.007587 + 1677 0.001417 -0.009022 -0.021912 + 1678 0.000203 0.002930 -0.002177 + 1679 0.003819 0.012652 -0.002939 + 1680 -0.001040 0.005171 0.022221 + 1681 -0.001765 0.004140 -0.001020 + 1682 0.015888 -0.002384 -0.000464 + 1683 -0.019573 0.014814 -0.003047 + 1684 -0.002840 -0.000626 0.000097 + 1685 0.019011 -0.004434 -0.031132 + 1686 -0.011722 0.011711 0.019623 + 1687 -0.000720 0.008278 0.001232 + 1688 -0.000014 -0.005707 0.005722 + 1689 0.006445 -0.004607 0.004541 + 1690 -0.008451 -0.005406 -0.003097 + 1691 -0.025859 -0.004092 0.011942 + 1692 0.003198 0.017013 -0.015979 + 1693 0.001237 0.005482 0.001012 + 1694 -0.003233 0.012773 -0.012817 + 1695 -0.013658 -0.008102 0.007350 + 1696 0.004867 0.002547 -0.001769 + 1697 0.019074 -0.004173 0.005165 + 1698 0.008487 0.001064 0.000080 + 1699 0.002766 -0.001251 -0.001561 + 1700 -0.019200 0.027169 -0.007481 + 1701 0.006036 -0.028485 -0.009388 + 1702 -0.005460 0.002563 0.001784 + 1703 -0.017462 0.006398 0.005231 + 1704 -0.014453 0.005484 0.004388 + 1705 0.002956 -0.001348 0.006512 + 1706 0.009654 0.004653 0.025184 + 1707 0.006226 -0.001478 -0.018062 + 1708 0.003757 -0.000921 -0.000401 + 1709 0.004307 -0.009700 -0.007768 + 1710 0.003780 -0.012914 0.008582 + 1711 0.004846 -0.002032 -0.000808 + 1712 -0.000823 -0.002500 -0.004619 + 1713 0.014769 -0.010350 0.008970 + 1714 -0.001580 -0.000837 0.000021 + 1715 -0.002003 -0.002972 -0.000158 + 1716 -0.004469 -0.000404 0.001257 + 1717 -0.001782 0.001231 -0.003624 + 1718 -0.009550 0.008477 -0.006010 + 1719 -0.003240 -0.001801 -0.002707 + 1720 -0.003131 -0.002749 -0.002782 + 1721 -0.003319 -0.008008 -0.009572 + 1722 -0.003280 -0.008289 -0.009069 + 1723 -0.006776 0.001807 0.000809 + 1724 0.000630 0.005359 0.003033 + 1725 0.016012 0.013546 0.014364 + 1726 -0.005383 0.003683 -0.001052 + 1727 -0.000343 -0.021814 -0.000655 + 1728 0.015975 0.004809 -0.015863 + 1729 -0.002843 0.002136 0.000031 + 1730 0.008511 0.002265 -0.002748 + 1731 -0.026285 -0.002274 -0.004757 + 1732 0.005294 -0.003565 0.004694 + 1733 -0.002668 0.001103 -0.001112 + 1734 -0.009429 0.006969 -0.008965 + 1735 -0.001634 0.000110 0.001819 + 1736 -0.004942 0.001203 -0.007254 + 1737 -0.002655 0.002573 -0.003610 + 1738 -0.004831 0.005860 0.001407 + 1739 -0.014232 0.009476 0.016389 + 1740 -0.017895 0.005674 -0.009379 + 1741 0.003013 -0.002508 -0.001228 + 1742 0.000746 0.006449 -0.005992 + 1743 0.006650 -0.002762 0.000152 + 1744 0.002550 -0.008457 0.001324 + 1745 -0.001868 -0.010233 -0.023525 + 1746 0.003968 -0.007880 0.008439 + 1747 -0.000591 0.004322 -0.003592 + 1748 -0.014424 0.009132 0.003708 + 1749 0.012052 -0.004950 -0.011581 + 1750 0.001849 0.003842 -0.009164 + 1751 0.009453 -0.005684 -0.004817 + 1752 0.001564 0.018776 -0.004831 + 1753 0.000794 0.000968 -0.001710 + 1754 -0.003816 -0.004723 -0.000498 + 1755 -0.011972 0.005633 -0.006975 + 1756 -0.004635 0.005064 -0.004764 + 1757 -0.010722 0.012077 -0.027297 + 1758 -0.003376 0.000707 0.006078 + 1759 0.001092 0.005159 -0.000557 + 1760 0.014326 0.002844 -0.021424 + 1761 0.019579 -0.002405 -0.009532 + 1762 -0.000565 0.006632 0.002294 + 1763 -0.025047 0.006219 0.001583 + 1764 -0.004637 -0.007484 0.007079 + 1765 0.002563 -0.001616 -0.003316 + 1766 -0.001239 0.014897 -0.002355 + 1767 -0.001256 -0.009226 0.009450 + 1768 0.001056 0.005329 -0.003831 + 1769 -0.012555 0.037676 0.021233 + 1770 -0.005969 -0.003116 -0.014248 + 1771 0.000691 0.001302 0.002405 + 1772 -0.015733 0.001224 -0.004288 + 1773 0.006783 0.015986 -0.003342 + 1774 0.002355 0.002897 -0.002965 + 1775 -0.000435 0.005789 0.007980 + 1776 0.014211 0.000855 -0.014841 + 1777 -0.004596 -0.002169 0.000774 + 1778 0.002630 -0.027237 0.012553 + 1779 -0.000727 -0.003394 -0.009924 + 1780 0.001821 -0.001310 0.000540 + 1781 0.005476 -0.002057 0.001588 + 1782 0.008060 0.013457 -0.013767 + 1783 0.003078 -0.007047 0.009501 + 1784 -0.004392 -0.004982 0.015684 + 1785 -0.021173 -0.003917 -0.003013 + 1786 0.001492 -0.007162 -0.003460 + 1787 0.020179 0.025050 0.005018 + 1788 -0.018378 -0.021938 0.007656 + 1789 -0.000363 0.004076 -0.003991 + 1790 0.012179 0.023942 -0.003853 + 1791 0.002207 0.011773 0.006443 + 1792 0.001993 0.000538 0.002365 + 1793 0.008602 -0.013779 -0.007218 + 1794 0.007374 0.001122 0.001108 + 1795 0.003207 -0.011319 -0.004081 + 1796 0.010332 -0.007827 -0.001929 + 1797 0.001869 0.022609 0.012256 + 1798 0.001101 0.003835 0.002357 + 1799 -0.003624 0.011759 0.002745 + 1800 0.001557 -0.002337 -0.004179 + 1801 0.003327 -0.001910 -0.005250 + 1802 0.011996 0.003017 0.013309 + 1803 -0.013682 -0.002775 -0.008939 + 1804 -0.002064 -0.000934 0.000427 + 1805 -0.012146 0.024406 -0.015171 + 1806 0.005030 -0.019570 0.004311 + 1807 0.003003 0.004365 0.002257 + 1808 0.000823 0.000086 -0.005161 + 1809 -0.003001 0.001206 0.008241 + 1810 0.005602 -0.001423 0.002945 + 1811 0.000330 0.001483 -0.011075 + 1812 0.003652 0.009252 -0.000166 + 1813 0.004531 -0.000860 -0.000170 + 1814 0.018728 0.013621 0.031510 + 1815 0.011579 -0.009257 -0.004100 + 1816 0.002862 0.000330 -0.002342 + 1817 -0.003456 -0.001426 -0.004566 + 1818 -0.006589 0.018593 0.018322 + 1819 -0.001663 0.002113 0.003120 + 1820 0.002523 0.005185 0.010725 + 1821 -0.006456 -0.005159 0.018366 + 1822 -0.000677 -0.000638 0.005530 + 1823 0.006499 0.011396 0.003392 + 1824 0.000945 -0.008826 -0.007441 + 1825 -0.002582 0.001006 0.000170 + 1826 -0.000739 0.010378 -0.012944 + 1827 -0.004082 -0.009693 0.012271 + 1828 -0.002259 -0.002179 0.001812 + 1829 0.004365 0.028602 0.007523 + 1830 -0.001047 0.006781 -0.010318 + 1831 0.003053 0.002227 0.004523 + 1832 -0.004297 -0.007295 0.001900 + 1833 0.002925 0.002066 0.004473 + 1834 0.003171 0.000025 0.002189 + 1835 0.001188 0.002838 0.001014 + 1836 0.006142 0.003073 -0.003689 + 1837 0.009818 0.005253 0.006222 + 1838 0.013907 -0.003607 0.006764 + 1839 -0.000327 0.015573 -0.010930 + 1840 -0.003110 -0.005538 0.000400 + 1841 0.006244 -0.021206 -0.003853 + 1842 -0.010299 0.008474 0.021147 + 1843 -0.001053 -0.000598 0.004581 + 1844 -0.013621 0.002557 -0.003175 + 1845 -0.002495 0.000789 0.011106 + 1846 -0.000137 -0.004006 -0.000014 + 1847 -0.017819 -0.013981 0.011316 + 1848 -0.005844 -0.000863 -0.025248 + 1849 -0.002799 0.002996 -0.002499 + 1850 -0.012455 0.012490 -0.004469 + 1851 0.010514 0.009490 -0.009495 + 1852 -0.000560 -0.004144 -0.000656 + 1853 -0.007255 0.002559 0.003817 + 1854 0.004602 -0.007276 0.003469 + 1855 0.000128 0.001144 -0.008402 + 1856 0.008157 0.001721 -0.014464 + 1857 -0.004034 0.002739 -0.008982 + 1858 0.002856 0.004731 -0.003812 + 1859 0.008481 -0.004184 -0.015612 + 1860 -0.004966 0.006658 -0.006541 + 1861 0.005415 -0.007185 0.002622 + 1862 -0.000791 0.004294 0.012806 + 1863 0.006266 -0.008943 0.000048 + 1864 -0.004891 -0.000259 0.002435 + 1865 0.000775 -0.012600 0.009738 + 1866 -0.000239 0.020688 0.014963 + 1867 0.007752 0.006605 0.003522 + 1868 0.005559 0.005449 0.004823 + 1869 0.001382 0.020031 -0.009484 + 1870 0.000269 -0.000837 -0.001948 + 1871 -0.015324 0.006379 0.032972 + 1872 -0.010895 -0.006739 0.002233 + 1873 0.002406 -0.005817 -0.007929 + 1874 0.011974 0.013774 0.020789 + 1875 -0.005616 -0.012309 -0.023698 + 1876 -0.002712 -0.000118 0.000894 + 1877 -0.000559 -0.018665 -0.005699 + 1878 -0.022904 -0.016730 0.007620 + 1879 -0.006235 -0.000119 -0.005440 + 1880 -0.008616 0.001720 0.002602 + 1881 -0.019263 0.001295 0.018377 + 1882 -0.002493 0.002824 -0.002915 + 1883 0.007384 0.000692 0.003462 + 1884 -0.019228 -0.005451 0.005676 + 1885 0.002956 0.004628 -0.002177 + 1886 0.005617 0.021792 -0.005623 + 1887 -0.010771 -0.007154 -0.002600 + 1888 -0.006932 -0.006388 0.001795 + 1889 -0.026638 0.002211 0.017012 + 1890 -0.006429 -0.013703 0.021233 + 1891 0.004179 0.001508 -0.002942 + 1892 -0.015358 0.009799 -0.025507 + 1893 -0.009827 0.001263 -0.015038 + 1894 0.002515 0.004808 -0.006083 + 1895 -0.001395 -0.005178 0.010798 + 1896 0.005498 0.001296 -0.013456 + 1897 -0.006679 0.000004 0.000833 + 1898 -0.006339 0.003210 0.000555 + 1899 -0.007815 -0.000155 0.006317 + 1900 -0.003334 -0.000730 -0.000139 + 1901 -0.003197 -0.021225 -0.009098 + 1902 0.003310 -0.008203 -0.004863 + 1903 -0.007379 0.001152 -0.003847 + 1904 -0.008175 0.003836 -0.004939 + 1905 -0.007216 0.002039 -0.012076 + 1906 -0.002751 -0.006050 -0.001404 + 1907 -0.005827 0.008129 0.005351 + 1908 0.010377 0.010628 0.018761 + 1909 -0.002571 -0.007065 0.006215 + 1910 -0.004848 -0.014622 0.001577 + 1911 -0.004351 -0.002361 0.020679 + 1912 0.006139 0.001291 0.002464 + 1913 0.004939 0.003608 0.002097 + 1914 0.004274 0.000152 0.002451 + 1915 0.002989 0.000832 -0.000352 + 1916 -0.014159 -0.000914 0.002187 + 1917 0.012237 -0.003167 0.009134 + 1918 -0.004575 -0.001662 0.000082 + 1919 -0.007883 -0.002056 0.002571 + 1920 -0.003336 -0.001305 -0.000658 + 1921 0.004366 0.000439 0.001158 + 1922 -0.000155 0.003368 0.010592 + 1923 -0.014972 -0.009424 -0.018312 + 1924 -0.000613 -0.002374 0.000797 + 1925 0.007460 -0.016336 -0.000977 + 1926 -0.006787 0.004573 0.010255 + 1927 -0.002452 -0.000122 0.000124 + 1928 -0.015584 -0.009431 -0.007285 + 1929 -0.000101 0.008080 -0.015191 + 1930 0.002197 0.002310 -0.001612 + 1931 0.016237 -0.005090 0.018070 + 1932 0.001709 -0.003220 -0.011865 + 1933 -0.001150 0.000898 0.004173 + 1934 0.000323 -0.000312 -0.014495 + 1935 0.000516 -0.000491 -0.011422 + 1936 -0.005815 -0.002965 0.000187 + 1937 0.008195 0.018425 -0.027236 + 1938 -0.010921 -0.007575 -0.002217 + 1939 -0.004740 0.002745 0.006330 + 1940 0.002035 0.006523 0.010880 + 1941 -0.012191 0.004818 0.006605 + 1942 -0.003197 -0.004418 -0.003375 + 1943 0.003590 -0.017196 0.008070 + 1944 0.004548 0.006106 0.016045 + 1945 0.005444 0.002200 0.004561 + 1946 0.004448 0.009092 -0.001577 + 1947 -0.000522 0.006033 0.006559 + 1948 0.005450 0.001267 0.002269 + 1949 0.027952 -0.012604 0.001935 + 1950 -0.004826 -0.018174 0.014813 + 1951 0.005498 -0.000626 0.001156 + 1952 0.001428 -0.010472 0.000805 + 1953 -0.010198 -0.005573 -0.014564 + 1954 0.001605 -0.006572 0.005587 + 1955 -0.002403 -0.004981 0.000460 + 1956 0.010287 -0.003414 0.005774 + 1957 -0.005679 0.003540 -0.003175 + 1958 -0.005054 0.005203 -0.002733 + 1959 -0.006462 0.003843 0.002657 + 1960 -0.006606 -0.002499 -0.001538 + 1961 0.027567 -0.002565 0.034908 + 1962 0.001905 -0.003739 -0.001134 + 1963 -0.000871 0.002779 0.006534 + 1964 -0.013473 -0.002631 0.001200 + 1965 -0.008136 0.003625 0.001725 + 1966 0.002375 -0.002767 -0.000214 + 1967 0.015603 0.001192 0.006785 + 1968 -0.008229 0.002751 0.010337 + 1969 -0.002111 -0.006139 0.006236 + 1970 0.025783 -0.003684 0.015052 + 1971 -0.008026 -0.018580 0.028847 + 1972 -0.001966 -0.005103 0.002533 + 1973 0.025504 -0.012928 0.014439 + 1974 0.015919 0.008653 -0.013047 + 1975 -0.002145 -0.003853 -0.002353 + 1976 0.020573 0.023626 0.033600 + 1977 0.002418 -0.000127 0.000258 + 1978 -0.000168 -0.002747 0.002505 + 1979 0.011847 0.007945 0.003222 + 1980 0.002222 -0.001343 0.005437 + 1981 -0.004734 0.003071 -0.000955 + 1982 0.003752 -0.001882 -0.005052 + 1983 -0.008195 0.007844 0.004577 + 1984 0.007575 0.002209 -0.000466 + 1985 -0.005510 0.009650 -0.004399 + 1986 0.018263 0.019292 -0.008157 + 1987 -0.005098 -0.001581 -0.000328 + 1988 -0.004522 -0.021884 -0.005509 + 1989 -0.001598 -0.001668 0.002704 + 1990 -0.000494 0.002205 0.012458 + 1991 0.003153 0.001522 0.015672 + 1992 -0.000092 -0.002603 0.010098 + 1993 0.001919 -0.007389 0.001539 + 1994 -0.002690 -0.003376 -0.009963 + 1995 -0.005006 0.002932 -0.001670 + 1996 -0.003089 -0.005736 0.003689 + 1997 0.010713 -0.027613 -0.023000 + 1998 -0.006878 0.009457 0.006998 + 1999 -0.001817 0.000266 -0.004238 + 2000 -0.010974 0.005190 0.000117 + 2001 -0.008937 -0.003277 0.004337 + 2002 -0.000987 -0.001334 -0.004265 + 2003 -0.022280 -0.011677 -0.018343 + 2004 -0.010076 -0.005729 -0.026032 + +Bonds + + 1 3 1 7 + 2 2 1 3 + 3 1 1 2 + 4 4 2 5 + 5 4 2 6 + 6 4 2 4 + 7 6 7 19 + 8 5 7 8 + 9 1 8 9 + 10 7 8 11 + 11 8 8 20 + 12 3 9 28 + 13 2 9 10 + 14 10 11 21 + 15 9 11 12 + 16 10 11 22 + 17 11 12 14 + 18 11 12 13 + 19 12 13 23 + 20 11 13 15 + 21 12 14 24 + 22 11 14 16 + 23 11 15 17 + 24 12 15 25 + 25 11 16 17 + 26 12 16 26 + 27 13 17 18 + 28 14 18 27 + 29 5 28 29 + 30 6 28 32 + 31 1 29 30 + 32 8 29 33 + 33 8 29 34 + 34 3 30 35 + 35 2 30 31 + 36 5 35 36 + 37 6 35 39 + 38 1 36 37 + 39 8 36 40 + 40 8 36 41 + 41 2 37 38 + 42 3 37 42 + 43 6 42 53 + 44 5 42 43 + 45 1 43 44 + 46 7 43 46 + 47 8 43 54 + 48 3 44 62 + 49 2 44 45 + 50 10 46 56 + 51 10 46 55 + 52 9 46 47 + 53 11 47 48 + 54 11 47 49 + 55 11 48 50 + 56 12 48 57 + 57 11 49 51 + 58 12 49 58 + 59 11 50 52 + 60 12 50 59 + 61 11 51 52 + 62 12 51 60 + 63 12 52 61 + 64 6 62 70 + 65 5 62 63 + 66 7 63 66 + 67 1 63 64 + 68 8 63 71 + 69 2 64 65 + 70 3 64 79 + 71 15 66 67 + 72 10 66 73 + 73 10 66 72 + 74 10 67 75 + 75 10 67 74 + 76 16 67 68 + 77 17 68 69 + 78 4 69 76 + 79 4 69 78 + 80 4 69 77 + 81 5 79 80 + 82 6 79 81 + 83 4 80 84 + 84 4 80 83 + 85 4 80 82 + 86 18 85 86 + 87 18 85 87 + 88 18 88 90 + 89 18 88 89 + 90 18 91 93 + 91 18 91 92 + 92 18 94 96 + 93 18 94 95 + 94 18 97 98 + 95 18 97 99 + 96 18 100 101 + 97 18 100 102 + 98 18 103 104 + 99 18 103 105 + 100 18 106 107 + 101 18 106 108 + 102 18 109 111 + 103 18 109 110 + 104 18 112 114 + 105 18 112 113 + 106 18 115 116 + 107 18 115 117 + 108 18 118 120 + 109 18 118 119 + 110 18 121 123 + 111 18 121 122 + 112 18 124 126 + 113 18 124 125 + 114 18 127 128 + 115 18 127 129 + 116 18 130 132 + 117 18 130 131 + 118 18 133 134 + 119 18 133 135 + 120 18 136 137 + 121 18 136 138 + 122 18 139 140 + 123 18 139 141 + 124 18 142 144 + 125 18 142 143 + 126 18 145 147 + 127 18 145 146 + 128 18 148 150 + 129 18 148 149 + 130 18 151 152 + 131 18 151 153 + 132 18 154 156 + 133 18 154 155 + 134 18 157 159 + 135 18 157 158 + 136 18 160 162 + 137 18 160 161 + 138 18 163 164 + 139 18 163 165 + 140 18 166 168 + 141 18 166 167 + 142 18 169 171 + 143 18 169 170 + 144 18 172 174 + 145 18 172 173 + 146 18 175 177 + 147 18 175 176 + 148 18 178 180 + 149 18 178 179 + 150 18 181 182 + 151 18 181 183 + 152 18 184 186 + 153 18 184 185 + 154 18 187 188 + 155 18 187 189 + 156 18 190 191 + 157 18 190 192 + 158 18 193 194 + 159 18 193 195 + 160 18 196 197 + 161 18 196 198 + 162 18 199 201 + 163 18 199 200 + 164 18 202 204 + 165 18 202 203 + 166 18 205 206 + 167 18 205 207 + 168 18 208 210 + 169 18 208 209 + 170 18 211 212 + 171 18 211 213 + 172 18 214 215 + 173 18 214 216 + 174 18 217 219 + 175 18 217 218 + 176 18 220 222 + 177 18 220 221 + 178 18 223 224 + 179 18 223 225 + 180 18 226 228 + 181 18 226 227 + 182 18 229 231 + 183 18 229 230 + 184 18 232 233 + 185 18 232 234 + 186 18 235 236 + 187 18 235 237 + 188 18 238 240 + 189 18 238 239 + 190 18 241 242 + 191 18 241 243 + 192 18 244 246 + 193 18 244 245 + 194 18 247 248 + 195 18 247 249 + 196 18 250 251 + 197 18 250 252 + 198 18 253 254 + 199 18 253 255 + 200 18 256 257 + 201 18 256 258 + 202 18 259 261 + 203 18 259 260 + 204 18 262 264 + 205 18 262 263 + 206 18 265 266 + 207 18 265 267 + 208 18 268 269 + 209 18 268 270 + 210 18 271 272 + 211 18 271 273 + 212 18 274 275 + 213 18 274 276 + 214 18 277 279 + 215 18 277 278 + 216 18 280 282 + 217 18 280 281 + 218 18 283 284 + 219 18 283 285 + 220 18 286 287 + 221 18 286 288 + 222 18 289 290 + 223 18 289 291 + 224 18 292 294 + 225 18 292 293 + 226 18 295 296 + 227 18 295 297 + 228 18 298 299 + 229 18 298 300 + 230 18 301 303 + 231 18 301 302 + 232 18 304 305 + 233 18 304 306 + 234 18 307 309 + 235 18 307 308 + 236 18 310 311 + 237 18 310 312 + 238 18 313 314 + 239 18 313 315 + 240 18 316 317 + 241 18 316 318 + 242 18 319 321 + 243 18 319 320 + 244 18 322 323 + 245 18 322 324 + 246 18 325 327 + 247 18 325 326 + 248 18 328 329 + 249 18 328 330 + 250 18 331 332 + 251 18 331 333 + 252 18 334 335 + 253 18 334 336 + 254 18 337 339 + 255 18 337 338 + 256 18 340 341 + 257 18 340 342 + 258 18 343 344 + 259 18 343 345 + 260 18 346 347 + 261 18 346 348 + 262 18 349 350 + 263 18 349 351 + 264 18 352 353 + 265 18 352 354 + 266 18 355 356 + 267 18 355 357 + 268 18 358 359 + 269 18 358 360 + 270 18 361 362 + 271 18 361 363 + 272 18 364 365 + 273 18 364 366 + 274 18 367 369 + 275 18 367 368 + 276 18 370 372 + 277 18 370 371 + 278 18 373 374 + 279 18 373 375 + 280 18 376 378 + 281 18 376 377 + 282 18 379 381 + 283 18 379 380 + 284 18 382 383 + 285 18 382 384 + 286 18 385 386 + 287 18 385 387 + 288 18 388 390 + 289 18 388 389 + 290 18 391 393 + 291 18 391 392 + 292 18 394 395 + 293 18 394 396 + 294 18 397 399 + 295 18 397 398 + 296 18 400 402 + 297 18 400 401 + 298 18 403 405 + 299 18 403 404 + 300 18 406 407 + 301 18 406 408 + 302 18 409 411 + 303 18 409 410 + 304 18 412 413 + 305 18 412 414 + 306 18 415 417 + 307 18 415 416 + 308 18 418 420 + 309 18 418 419 + 310 18 421 422 + 311 18 421 423 + 312 18 424 425 + 313 18 424 426 + 314 18 427 428 + 315 18 427 429 + 316 18 430 432 + 317 18 430 431 + 318 18 433 435 + 319 18 433 434 + 320 18 436 437 + 321 18 436 438 + 322 18 439 440 + 323 18 439 441 + 324 18 442 443 + 325 18 442 444 + 326 18 445 447 + 327 18 445 446 + 328 18 448 449 + 329 18 448 450 + 330 18 451 453 + 331 18 451 452 + 332 18 454 456 + 333 18 454 455 + 334 18 457 458 + 335 18 457 459 + 336 18 460 462 + 337 18 460 461 + 338 18 463 465 + 339 18 463 464 + 340 18 466 467 + 341 18 466 468 + 342 18 469 470 + 343 18 469 471 + 344 18 472 473 + 345 18 472 474 + 346 18 475 476 + 347 18 475 477 + 348 18 478 479 + 349 18 478 480 + 350 18 481 482 + 351 18 481 483 + 352 18 484 485 + 353 18 484 486 + 354 18 487 489 + 355 18 487 488 + 356 18 490 492 + 357 18 490 491 + 358 18 493 495 + 359 18 493 494 + 360 18 496 497 + 361 18 496 498 + 362 18 499 501 + 363 18 499 500 + 364 18 502 503 + 365 18 502 504 + 366 18 505 507 + 367 18 505 506 + 368 18 508 509 + 369 18 508 510 + 370 18 511 513 + 371 18 511 512 + 372 18 514 516 + 373 18 514 515 + 374 18 517 518 + 375 18 517 519 + 376 18 520 521 + 377 18 520 522 + 378 18 523 525 + 379 18 523 524 + 380 18 526 528 + 381 18 526 527 + 382 18 529 530 + 383 18 529 531 + 384 18 532 533 + 385 18 532 534 + 386 18 535 536 + 387 18 535 537 + 388 18 538 540 + 389 18 538 539 + 390 18 541 542 + 391 18 541 543 + 392 18 544 546 + 393 18 544 545 + 394 18 547 549 + 395 18 547 548 + 396 18 550 551 + 397 18 550 552 + 398 18 553 555 + 399 18 553 554 + 400 18 556 557 + 401 18 556 558 + 402 18 559 561 + 403 18 559 560 + 404 18 562 563 + 405 18 562 564 + 406 18 565 567 + 407 18 565 566 + 408 18 568 570 + 409 18 568 569 + 410 18 571 573 + 411 18 571 572 + 412 18 574 575 + 413 18 574 576 + 414 18 577 579 + 415 18 577 578 + 416 18 580 581 + 417 18 580 582 + 418 18 583 585 + 419 18 583 584 + 420 18 586 588 + 421 18 586 587 + 422 18 589 590 + 423 18 589 591 + 424 18 592 594 + 425 18 592 593 + 426 18 595 597 + 427 18 595 596 + 428 18 598 600 + 429 18 598 599 + 430 18 601 602 + 431 18 601 603 + 432 18 604 606 + 433 18 604 605 + 434 18 607 609 + 435 18 607 608 + 436 18 610 611 + 437 18 610 612 + 438 18 613 615 + 439 18 613 614 + 440 18 616 618 + 441 18 616 617 + 442 18 619 620 + 443 18 619 621 + 444 18 622 623 + 445 18 622 624 + 446 18 625 627 + 447 18 625 626 + 448 18 628 629 + 449 18 628 630 + 450 18 631 632 + 451 18 631 633 + 452 18 634 635 + 453 18 634 636 + 454 18 637 639 + 455 18 637 638 + 456 18 640 642 + 457 18 640 641 + 458 18 643 644 + 459 18 643 645 + 460 18 646 647 + 461 18 646 648 + 462 18 649 650 + 463 18 649 651 + 464 18 652 653 + 465 18 652 654 + 466 18 655 657 + 467 18 655 656 + 468 18 658 660 + 469 18 658 659 + 470 18 661 663 + 471 18 661 662 + 472 18 664 665 + 473 18 664 666 + 474 18 667 669 + 475 18 667 668 + 476 18 670 672 + 477 18 670 671 + 478 18 673 674 + 479 18 673 675 + 480 18 676 677 + 481 18 676 678 + 482 18 679 681 + 483 18 679 680 + 484 18 682 684 + 485 18 682 683 + 486 18 685 686 + 487 18 685 687 + 488 18 688 690 + 489 18 688 689 + 490 18 691 693 + 491 18 691 692 + 492 18 694 695 + 493 18 694 696 + 494 18 697 698 + 495 18 697 699 + 496 18 700 701 + 497 18 700 702 + 498 18 703 704 + 499 18 703 705 + 500 18 706 707 + 501 18 706 708 + 502 18 709 710 + 503 18 709 711 + 504 18 712 714 + 505 18 712 713 + 506 18 715 716 + 507 18 715 717 + 508 18 718 719 + 509 18 718 720 + 510 18 721 722 + 511 18 721 723 + 512 18 724 726 + 513 18 724 725 + 514 18 727 728 + 515 18 727 729 + 516 18 730 731 + 517 18 730 732 + 518 18 733 735 + 519 18 733 734 + 520 18 736 737 + 521 18 736 738 + 522 18 739 741 + 523 18 739 740 + 524 18 742 743 + 525 18 742 744 + 526 18 745 746 + 527 18 745 747 + 528 18 748 750 + 529 18 748 749 + 530 18 751 753 + 531 18 751 752 + 532 18 754 756 + 533 18 754 755 + 534 18 757 758 + 535 18 757 759 + 536 18 760 762 + 537 18 760 761 + 538 18 763 764 + 539 18 763 765 + 540 18 766 767 + 541 18 766 768 + 542 18 769 770 + 543 18 769 771 + 544 18 772 774 + 545 18 772 773 + 546 18 775 777 + 547 18 775 776 + 548 18 778 780 + 549 18 778 779 + 550 18 781 783 + 551 18 781 782 + 552 18 784 786 + 553 18 784 785 + 554 18 787 789 + 555 18 787 788 + 556 18 790 791 + 557 18 790 792 + 558 18 793 795 + 559 18 793 794 + 560 18 796 797 + 561 18 796 798 + 562 18 799 801 + 563 18 799 800 + 564 18 802 803 + 565 18 802 804 + 566 18 805 806 + 567 18 805 807 + 568 18 808 809 + 569 18 808 810 + 570 18 811 813 + 571 18 811 812 + 572 18 814 815 + 573 18 814 816 + 574 18 817 818 + 575 18 817 819 + 576 18 820 821 + 577 18 820 822 + 578 18 823 824 + 579 18 823 825 + 580 18 826 828 + 581 18 826 827 + 582 18 829 830 + 583 18 829 831 + 584 18 832 834 + 585 18 832 833 + 586 18 835 837 + 587 18 835 836 + 588 18 838 839 + 589 18 838 840 + 590 18 841 842 + 591 18 841 843 + 592 18 844 845 + 593 18 844 846 + 594 18 847 848 + 595 18 847 849 + 596 18 850 852 + 597 18 850 851 + 598 18 853 854 + 599 18 853 855 + 600 18 856 858 + 601 18 856 857 + 602 18 859 861 + 603 18 859 860 + 604 18 862 863 + 605 18 862 864 + 606 18 865 866 + 607 18 865 867 + 608 18 868 869 + 609 18 868 870 + 610 18 871 873 + 611 18 871 872 + 612 18 874 875 + 613 18 874 876 + 614 18 877 878 + 615 18 877 879 + 616 18 880 882 + 617 18 880 881 + 618 18 883 884 + 619 18 883 885 + 620 18 886 887 + 621 18 886 888 + 622 18 889 891 + 623 18 889 890 + 624 18 892 894 + 625 18 892 893 + 626 18 895 896 + 627 18 895 897 + 628 18 898 899 + 629 18 898 900 + 630 18 901 903 + 631 18 901 902 + 632 18 904 905 + 633 18 904 906 + 634 18 907 908 + 635 18 907 909 + 636 18 910 911 + 637 18 910 912 + 638 18 913 915 + 639 18 913 914 + 640 18 916 917 + 641 18 916 918 + 642 18 919 920 + 643 18 919 921 + 644 18 922 924 + 645 18 922 923 + 646 18 925 927 + 647 18 925 926 + 648 18 928 930 + 649 18 928 929 + 650 18 931 932 + 651 18 931 933 + 652 18 934 935 + 653 18 934 936 + 654 18 937 939 + 655 18 937 938 + 656 18 940 942 + 657 18 940 941 + 658 18 943 945 + 659 18 943 944 + 660 18 946 948 + 661 18 946 947 + 662 18 949 950 + 663 18 949 951 + 664 18 952 953 + 665 18 952 954 + 666 18 955 956 + 667 18 955 957 + 668 18 958 960 + 669 18 958 959 + 670 18 961 963 + 671 18 961 962 + 672 18 964 965 + 673 18 964 966 + 674 18 967 969 + 675 18 967 968 + 676 18 970 972 + 677 18 970 971 + 678 18 973 975 + 679 18 973 974 + 680 18 976 978 + 681 18 976 977 + 682 18 979 981 + 683 18 979 980 + 684 18 982 983 + 685 18 982 984 + 686 18 985 987 + 687 18 985 986 + 688 18 988 989 + 689 18 988 990 + 690 18 991 993 + 691 18 991 992 + 692 18 994 996 + 693 18 994 995 + 694 18 997 998 + 695 18 997 999 + 696 18 1000 1001 + 697 18 1000 1002 + 698 18 1003 1005 + 699 18 1003 1004 + 700 18 1006 1007 + 701 18 1006 1008 + 702 18 1009 1011 + 703 18 1009 1010 + 704 18 1012 1013 + 705 18 1012 1014 + 706 18 1015 1017 + 707 18 1015 1016 + 708 18 1018 1020 + 709 18 1018 1019 + 710 18 1021 1023 + 711 18 1021 1022 + 712 18 1024 1025 + 713 18 1024 1026 + 714 18 1027 1028 + 715 18 1027 1029 + 716 18 1030 1032 + 717 18 1030 1031 + 718 18 1033 1034 + 719 18 1033 1035 + 720 18 1036 1037 + 721 18 1036 1038 + 722 18 1039 1041 + 723 18 1039 1040 + 724 18 1042 1043 + 725 18 1042 1044 + 726 18 1045 1046 + 727 18 1045 1047 + 728 18 1048 1050 + 729 18 1048 1049 + 730 18 1051 1053 + 731 18 1051 1052 + 732 18 1054 1056 + 733 18 1054 1055 + 734 18 1057 1058 + 735 18 1057 1059 + 736 18 1060 1062 + 737 18 1060 1061 + 738 18 1063 1064 + 739 18 1063 1065 + 740 18 1066 1068 + 741 18 1066 1067 + 742 18 1069 1071 + 743 18 1069 1070 + 744 18 1072 1074 + 745 18 1072 1073 + 746 18 1075 1077 + 747 18 1075 1076 + 748 18 1078 1079 + 749 18 1078 1080 + 750 18 1081 1082 + 751 18 1081 1083 + 752 18 1084 1085 + 753 18 1084 1086 + 754 18 1087 1089 + 755 18 1087 1088 + 756 18 1090 1092 + 757 18 1090 1091 + 758 18 1093 1095 + 759 18 1093 1094 + 760 18 1096 1097 + 761 18 1096 1098 + 762 18 1099 1100 + 763 18 1099 1101 + 764 18 1102 1103 + 765 18 1102 1104 + 766 18 1105 1107 + 767 18 1105 1106 + 768 18 1108 1110 + 769 18 1108 1109 + 770 18 1111 1112 + 771 18 1111 1113 + 772 18 1114 1116 + 773 18 1114 1115 + 774 18 1117 1119 + 775 18 1117 1118 + 776 18 1120 1121 + 777 18 1120 1122 + 778 18 1123 1124 + 779 18 1123 1125 + 780 18 1126 1128 + 781 18 1126 1127 + 782 18 1129 1130 + 783 18 1129 1131 + 784 18 1132 1133 + 785 18 1132 1134 + 786 18 1135 1137 + 787 18 1135 1136 + 788 18 1138 1140 + 789 18 1138 1139 + 790 18 1141 1142 + 791 18 1141 1143 + 792 18 1144 1146 + 793 18 1144 1145 + 794 18 1147 1149 + 795 18 1147 1148 + 796 18 1150 1152 + 797 18 1150 1151 + 798 18 1153 1155 + 799 18 1153 1154 + 800 18 1156 1158 + 801 18 1156 1157 + 802 18 1159 1160 + 803 18 1159 1161 + 804 18 1162 1164 + 805 18 1162 1163 + 806 18 1165 1166 + 807 18 1165 1167 + 808 18 1168 1170 + 809 18 1168 1169 + 810 18 1171 1172 + 811 18 1171 1173 + 812 18 1174 1175 + 813 18 1174 1176 + 814 18 1177 1179 + 815 18 1177 1178 + 816 18 1180 1182 + 817 18 1180 1181 + 818 18 1183 1185 + 819 18 1183 1184 + 820 18 1186 1187 + 821 18 1186 1188 + 822 18 1189 1190 + 823 18 1189 1191 + 824 18 1192 1194 + 825 18 1192 1193 + 826 18 1195 1196 + 827 18 1195 1197 + 828 18 1198 1199 + 829 18 1198 1200 + 830 18 1201 1202 + 831 18 1201 1203 + 832 18 1204 1205 + 833 18 1204 1206 + 834 18 1207 1209 + 835 18 1207 1208 + 836 18 1210 1212 + 837 18 1210 1211 + 838 18 1213 1214 + 839 18 1213 1215 + 840 18 1216 1218 + 841 18 1216 1217 + 842 18 1219 1221 + 843 18 1219 1220 + 844 18 1222 1224 + 845 18 1222 1223 + 846 18 1225 1226 + 847 18 1225 1227 + 848 18 1228 1229 + 849 18 1228 1230 + 850 18 1231 1232 + 851 18 1231 1233 + 852 18 1234 1236 + 853 18 1234 1235 + 854 18 1237 1239 + 855 18 1237 1238 + 856 18 1240 1242 + 857 18 1240 1241 + 858 18 1243 1244 + 859 18 1243 1245 + 860 18 1246 1248 + 861 18 1246 1247 + 862 18 1249 1250 + 863 18 1249 1251 + 864 18 1252 1254 + 865 18 1252 1253 + 866 18 1255 1256 + 867 18 1255 1257 + 868 18 1258 1259 + 869 18 1258 1260 + 870 18 1261 1263 + 871 18 1261 1262 + 872 18 1264 1265 + 873 18 1264 1266 + 874 18 1267 1268 + 875 18 1267 1269 + 876 18 1270 1271 + 877 18 1270 1272 + 878 18 1273 1274 + 879 18 1273 1275 + 880 18 1276 1277 + 881 18 1276 1278 + 882 18 1279 1280 + 883 18 1279 1281 + 884 18 1282 1283 + 885 18 1282 1284 + 886 18 1285 1286 + 887 18 1285 1287 + 888 18 1288 1289 + 889 18 1288 1290 + 890 18 1291 1293 + 891 18 1291 1292 + 892 18 1294 1295 + 893 18 1294 1296 + 894 18 1297 1299 + 895 18 1297 1298 + 896 18 1300 1302 + 897 18 1300 1301 + 898 18 1303 1304 + 899 18 1303 1305 + 900 18 1306 1308 + 901 18 1306 1307 + 902 18 1309 1311 + 903 18 1309 1310 + 904 18 1312 1314 + 905 18 1312 1313 + 906 18 1315 1317 + 907 18 1315 1316 + 908 18 1318 1320 + 909 18 1318 1319 + 910 18 1321 1323 + 911 18 1321 1322 + 912 18 1324 1325 + 913 18 1324 1326 + 914 18 1327 1329 + 915 18 1327 1328 + 916 18 1330 1332 + 917 18 1330 1331 + 918 18 1333 1334 + 919 18 1333 1335 + 920 18 1336 1337 + 921 18 1336 1338 + 922 18 1339 1340 + 923 18 1339 1341 + 924 18 1342 1344 + 925 18 1342 1343 + 926 18 1345 1347 + 927 18 1345 1346 + 928 18 1348 1350 + 929 18 1348 1349 + 930 18 1351 1352 + 931 18 1351 1353 + 932 18 1354 1355 + 933 18 1354 1356 + 934 18 1357 1358 + 935 18 1357 1359 + 936 18 1360 1362 + 937 18 1360 1361 + 938 18 1363 1365 + 939 18 1363 1364 + 940 18 1366 1368 + 941 18 1366 1367 + 942 18 1369 1370 + 943 18 1369 1371 + 944 18 1372 1373 + 945 18 1372 1374 + 946 18 1375 1377 + 947 18 1375 1376 + 948 18 1378 1379 + 949 18 1378 1380 + 950 18 1381 1382 + 951 18 1381 1383 + 952 18 1384 1385 + 953 18 1384 1386 + 954 18 1387 1388 + 955 18 1387 1389 + 956 18 1390 1392 + 957 18 1390 1391 + 958 18 1393 1395 + 959 18 1393 1394 + 960 18 1396 1397 + 961 18 1396 1398 + 962 18 1399 1401 + 963 18 1399 1400 + 964 18 1402 1403 + 965 18 1402 1404 + 966 18 1405 1406 + 967 18 1405 1407 + 968 18 1408 1409 + 969 18 1408 1410 + 970 18 1411 1412 + 971 18 1411 1413 + 972 18 1414 1416 + 973 18 1414 1415 + 974 18 1417 1419 + 975 18 1417 1418 + 976 18 1420 1422 + 977 18 1420 1421 + 978 18 1423 1425 + 979 18 1423 1424 + 980 18 1426 1428 + 981 18 1426 1427 + 982 18 1429 1430 + 983 18 1429 1431 + 984 18 1432 1434 + 985 18 1432 1433 + 986 18 1435 1436 + 987 18 1435 1437 + 988 18 1438 1439 + 989 18 1438 1440 + 990 18 1441 1442 + 991 18 1441 1443 + 992 18 1444 1445 + 993 18 1444 1446 + 994 18 1447 1448 + 995 18 1447 1449 + 996 18 1450 1451 + 997 18 1450 1452 + 998 18 1453 1455 + 999 18 1453 1454 + 1000 18 1456 1457 + 1001 18 1456 1458 + 1002 18 1459 1461 + 1003 18 1459 1460 + 1004 18 1462 1463 + 1005 18 1462 1464 + 1006 18 1465 1466 + 1007 18 1465 1467 + 1008 18 1468 1470 + 1009 18 1468 1469 + 1010 18 1471 1472 + 1011 18 1471 1473 + 1012 18 1474 1476 + 1013 18 1474 1475 + 1014 18 1477 1478 + 1015 18 1477 1479 + 1016 18 1480 1482 + 1017 18 1480 1481 + 1018 18 1483 1485 + 1019 18 1483 1484 + 1020 18 1486 1488 + 1021 18 1486 1487 + 1022 18 1489 1491 + 1023 18 1489 1490 + 1024 18 1492 1493 + 1025 18 1492 1494 + 1026 18 1495 1496 + 1027 18 1495 1497 + 1028 18 1498 1499 + 1029 18 1498 1500 + 1030 18 1501 1502 + 1031 18 1501 1503 + 1032 18 1504 1505 + 1033 18 1504 1506 + 1034 18 1507 1509 + 1035 18 1507 1508 + 1036 18 1510 1512 + 1037 18 1510 1511 + 1038 18 1513 1515 + 1039 18 1513 1514 + 1040 18 1516 1518 + 1041 18 1516 1517 + 1042 18 1519 1520 + 1043 18 1519 1521 + 1044 18 1522 1524 + 1045 18 1522 1523 + 1046 18 1525 1526 + 1047 18 1525 1527 + 1048 18 1528 1529 + 1049 18 1528 1530 + 1050 18 1531 1533 + 1051 18 1531 1532 + 1052 18 1534 1536 + 1053 18 1534 1535 + 1054 18 1537 1539 + 1055 18 1537 1538 + 1056 18 1540 1541 + 1057 18 1540 1542 + 1058 18 1543 1545 + 1059 18 1543 1544 + 1060 18 1546 1547 + 1061 18 1546 1548 + 1062 18 1549 1551 + 1063 18 1549 1550 + 1064 18 1552 1553 + 1065 18 1552 1554 + 1066 18 1555 1557 + 1067 18 1555 1556 + 1068 18 1558 1559 + 1069 18 1558 1560 + 1070 18 1561 1562 + 1071 18 1561 1563 + 1072 18 1564 1565 + 1073 18 1564 1566 + 1074 18 1567 1569 + 1075 18 1567 1568 + 1076 18 1570 1571 + 1077 18 1570 1572 + 1078 18 1573 1575 + 1079 18 1573 1574 + 1080 18 1576 1578 + 1081 18 1576 1577 + 1082 18 1579 1581 + 1083 18 1579 1580 + 1084 18 1582 1584 + 1085 18 1582 1583 + 1086 18 1585 1586 + 1087 18 1585 1587 + 1088 18 1588 1590 + 1089 18 1588 1589 + 1090 18 1591 1592 + 1091 18 1591 1593 + 1092 18 1594 1596 + 1093 18 1594 1595 + 1094 18 1597 1598 + 1095 18 1597 1599 + 1096 18 1600 1602 + 1097 18 1600 1601 + 1098 18 1603 1605 + 1099 18 1603 1604 + 1100 18 1606 1608 + 1101 18 1606 1607 + 1102 18 1609 1610 + 1103 18 1609 1611 + 1104 18 1612 1614 + 1105 18 1612 1613 + 1106 18 1615 1617 + 1107 18 1615 1616 + 1108 18 1618 1620 + 1109 18 1618 1619 + 1110 18 1621 1623 + 1111 18 1621 1622 + 1112 18 1624 1625 + 1113 18 1624 1626 + 1114 18 1627 1629 + 1115 18 1627 1628 + 1116 18 1630 1631 + 1117 18 1630 1632 + 1118 18 1633 1635 + 1119 18 1633 1634 + 1120 18 1636 1637 + 1121 18 1636 1638 + 1122 18 1639 1641 + 1123 18 1639 1640 + 1124 18 1642 1643 + 1125 18 1642 1644 + 1126 18 1645 1646 + 1127 18 1645 1647 + 1128 18 1648 1650 + 1129 18 1648 1649 + 1130 18 1651 1653 + 1131 18 1651 1652 + 1132 18 1654 1656 + 1133 18 1654 1655 + 1134 18 1657 1658 + 1135 18 1657 1659 + 1136 18 1660 1661 + 1137 18 1660 1662 + 1138 18 1663 1664 + 1139 18 1663 1665 + 1140 18 1666 1668 + 1141 18 1666 1667 + 1142 18 1669 1670 + 1143 18 1669 1671 + 1144 18 1672 1674 + 1145 18 1672 1673 + 1146 18 1675 1676 + 1147 18 1675 1677 + 1148 18 1678 1680 + 1149 18 1678 1679 + 1150 18 1681 1683 + 1151 18 1681 1682 + 1152 18 1684 1685 + 1153 18 1684 1686 + 1154 18 1687 1688 + 1155 18 1687 1689 + 1156 18 1690 1691 + 1157 18 1690 1692 + 1158 18 1693 1695 + 1159 18 1693 1694 + 1160 18 1696 1697 + 1161 18 1696 1698 + 1162 18 1699 1701 + 1163 18 1699 1700 + 1164 18 1702 1703 + 1165 18 1702 1704 + 1166 18 1705 1707 + 1167 18 1705 1706 + 1168 18 1708 1709 + 1169 18 1708 1710 + 1170 18 1711 1712 + 1171 18 1711 1713 + 1172 18 1714 1716 + 1173 18 1714 1715 + 1174 18 1717 1718 + 1175 18 1717 1719 + 1176 18 1720 1721 + 1177 18 1720 1722 + 1178 18 1723 1724 + 1179 18 1723 1725 + 1180 18 1726 1727 + 1181 18 1726 1728 + 1182 18 1729 1730 + 1183 18 1729 1731 + 1184 18 1732 1734 + 1185 18 1732 1733 + 1186 18 1735 1737 + 1187 18 1735 1736 + 1188 18 1738 1740 + 1189 18 1738 1739 + 1190 18 1741 1743 + 1191 18 1741 1742 + 1192 18 1744 1745 + 1193 18 1744 1746 + 1194 18 1747 1749 + 1195 18 1747 1748 + 1196 18 1750 1751 + 1197 18 1750 1752 + 1198 18 1753 1755 + 1199 18 1753 1754 + 1200 18 1756 1758 + 1201 18 1756 1757 + 1202 18 1759 1760 + 1203 18 1759 1761 + 1204 18 1762 1764 + 1205 18 1762 1763 + 1206 18 1765 1767 + 1207 18 1765 1766 + 1208 18 1768 1769 + 1209 18 1768 1770 + 1210 18 1771 1773 + 1211 18 1771 1772 + 1212 18 1774 1776 + 1213 18 1774 1775 + 1214 18 1777 1779 + 1215 18 1777 1778 + 1216 18 1780 1781 + 1217 18 1780 1782 + 1218 18 1783 1784 + 1219 18 1783 1785 + 1220 18 1786 1787 + 1221 18 1786 1788 + 1222 18 1789 1790 + 1223 18 1789 1791 + 1224 18 1792 1793 + 1225 18 1792 1794 + 1226 18 1795 1796 + 1227 18 1795 1797 + 1228 18 1798 1799 + 1229 18 1798 1800 + 1230 18 1801 1803 + 1231 18 1801 1802 + 1232 18 1804 1806 + 1233 18 1804 1805 + 1234 18 1807 1809 + 1235 18 1807 1808 + 1236 18 1810 1812 + 1237 18 1810 1811 + 1238 18 1813 1815 + 1239 18 1813 1814 + 1240 18 1816 1818 + 1241 18 1816 1817 + 1242 18 1819 1821 + 1243 18 1819 1820 + 1244 18 1822 1823 + 1245 18 1822 1824 + 1246 18 1825 1827 + 1247 18 1825 1826 + 1248 18 1828 1830 + 1249 18 1828 1829 + 1250 18 1831 1832 + 1251 18 1831 1833 + 1252 18 1834 1835 + 1253 18 1834 1836 + 1254 18 1837 1838 + 1255 18 1837 1839 + 1256 18 1840 1842 + 1257 18 1840 1841 + 1258 18 1843 1845 + 1259 18 1843 1844 + 1260 18 1846 1848 + 1261 18 1846 1847 + 1262 18 1849 1851 + 1263 18 1849 1850 + 1264 18 1852 1854 + 1265 18 1852 1853 + 1266 18 1855 1856 + 1267 18 1855 1857 + 1268 18 1858 1859 + 1269 18 1858 1860 + 1270 18 1861 1862 + 1271 18 1861 1863 + 1272 18 1864 1866 + 1273 18 1864 1865 + 1274 18 1867 1869 + 1275 18 1867 1868 + 1276 18 1870 1871 + 1277 18 1870 1872 + 1278 18 1873 1874 + 1279 18 1873 1875 + 1280 18 1876 1877 + 1281 18 1876 1878 + 1282 18 1879 1881 + 1283 18 1879 1880 + 1284 18 1882 1883 + 1285 18 1882 1884 + 1286 18 1885 1886 + 1287 18 1885 1887 + 1288 18 1888 1890 + 1289 18 1888 1889 + 1290 18 1891 1892 + 1291 18 1891 1893 + 1292 18 1894 1896 + 1293 18 1894 1895 + 1294 18 1897 1898 + 1295 18 1897 1899 + 1296 18 1900 1902 + 1297 18 1900 1901 + 1298 18 1903 1905 + 1299 18 1903 1904 + 1300 18 1906 1908 + 1301 18 1906 1907 + 1302 18 1909 1911 + 1303 18 1909 1910 + 1304 18 1912 1913 + 1305 18 1912 1914 + 1306 18 1915 1916 + 1307 18 1915 1917 + 1308 18 1918 1920 + 1309 18 1918 1919 + 1310 18 1921 1923 + 1311 18 1921 1922 + 1312 18 1924 1926 + 1313 18 1924 1925 + 1314 18 1927 1929 + 1315 18 1927 1928 + 1316 18 1930 1932 + 1317 18 1930 1931 + 1318 18 1933 1935 + 1319 18 1933 1934 + 1320 18 1936 1937 + 1321 18 1936 1938 + 1322 18 1939 1940 + 1323 18 1939 1941 + 1324 18 1942 1944 + 1325 18 1942 1943 + 1326 18 1945 1947 + 1327 18 1945 1946 + 1328 18 1948 1950 + 1329 18 1948 1949 + 1330 18 1951 1953 + 1331 18 1951 1952 + 1332 18 1954 1955 + 1333 18 1954 1956 + 1334 18 1957 1959 + 1335 18 1957 1958 + 1336 18 1960 1961 + 1337 18 1960 1962 + 1338 18 1963 1965 + 1339 18 1963 1964 + 1340 18 1966 1967 + 1341 18 1966 1968 + 1342 18 1969 1970 + 1343 18 1969 1971 + 1344 18 1972 1974 + 1345 18 1972 1973 + 1346 18 1975 1977 + 1347 18 1975 1976 + 1348 18 1978 1979 + 1349 18 1978 1980 + 1350 18 1981 1982 + 1351 18 1981 1983 + 1352 18 1984 1986 + 1353 18 1984 1985 + 1354 18 1987 1988 + 1355 18 1987 1989 + 1356 18 1990 1992 + 1357 18 1990 1991 + 1358 18 1993 1995 + 1359 18 1993 1994 + 1360 18 1996 1998 + 1361 18 1996 1997 + 1362 18 1999 2000 + 1363 18 1999 2001 + 1364 18 2002 2004 + 1365 18 2002 2003 + +Angles + + 1 5 2 1 7 + 2 4 2 1 3 + 3 6 3 1 7 + 4 7 4 2 5 + 5 7 5 2 6 + 6 1 1 2 5 + 7 1 1 2 6 + 8 1 1 2 4 + 9 7 4 2 6 + 10 2 1 7 8 + 11 3 1 7 19 + 12 11 8 7 19 + 13 9 7 8 11 + 14 8 7 8 9 + 15 16 11 8 20 + 16 15 9 8 20 + 17 14 9 8 11 + 18 10 7 8 20 + 19 5 8 9 28 + 20 4 8 9 10 + 21 6 10 9 28 + 22 18 12 11 22 + 23 23 21 11 22 + 24 12 8 11 12 + 25 13 8 11 21 + 26 18 12 11 21 + 27 13 8 11 22 + 28 19 13 12 14 + 29 17 11 12 14 + 30 17 11 12 13 + 31 20 15 13 23 + 32 20 12 13 23 + 33 19 12 13 15 + 34 20 12 14 24 + 35 20 16 14 24 + 36 19 12 14 16 + 37 20 13 15 25 + 38 20 17 15 25 + 39 19 13 15 17 + 40 20 14 16 26 + 41 19 14 16 17 + 42 20 17 16 26 + 43 21 15 17 18 + 44 19 15 17 16 + 45 21 16 17 18 + 46 22 17 18 27 + 47 2 9 28 29 + 48 3 9 28 32 + 49 11 29 28 32 + 50 15 30 29 34 + 51 10 28 29 33 + 52 10 28 29 34 + 53 15 30 29 33 + 54 24 33 29 34 + 55 8 28 29 30 + 56 6 31 30 35 + 57 5 29 30 35 + 58 4 29 30 31 + 59 2 30 35 36 + 60 3 30 35 39 + 61 11 36 35 39 + 62 8 35 36 37 + 63 10 35 36 41 + 64 10 35 36 40 + 65 24 40 36 41 + 66 15 37 36 40 + 67 15 37 36 41 + 68 6 38 37 42 + 69 5 36 37 42 + 70 4 36 37 38 + 71 11 43 42 53 + 72 2 37 42 43 + 73 3 37 42 53 + 74 10 42 43 54 + 75 16 46 43 54 + 76 14 44 43 46 + 77 9 42 43 46 + 78 8 42 43 44 + 79 15 44 43 54 + 80 5 43 44 62 + 81 6 45 44 62 + 82 4 43 44 45 + 83 13 43 46 55 + 84 13 43 46 56 + 85 12 43 46 47 + 86 23 55 46 56 + 87 18 47 46 56 + 88 18 47 46 55 + 89 17 46 47 49 + 90 17 46 47 48 + 91 19 48 47 49 + 92 20 50 48 57 + 93 19 47 48 50 + 94 20 47 48 57 + 95 20 51 49 58 + 96 19 47 49 51 + 97 20 47 49 58 + 98 20 48 50 59 + 99 19 48 50 52 + 100 20 52 50 59 + 101 20 52 51 60 + 102 20 49 51 60 + 103 19 49 51 52 + 104 20 50 52 61 + 105 19 50 52 51 + 106 20 51 52 61 + 107 2 44 62 63 + 108 3 44 62 70 + 109 11 63 62 70 + 110 16 66 63 71 + 111 15 64 63 71 + 112 14 64 63 66 + 113 10 62 63 71 + 114 9 62 63 66 + 115 8 62 63 64 + 116 4 63 64 65 + 117 6 65 64 79 + 118 5 63 64 79 + 119 23 72 66 73 + 120 27 67 66 73 + 121 27 67 66 72 + 122 25 63 66 67 + 123 13 63 66 73 + 124 13 63 66 72 + 125 29 68 67 75 + 126 23 74 67 75 + 127 29 68 67 74 + 128 26 66 67 68 + 129 27 66 67 74 + 130 27 66 67 75 + 131 28 67 68 69 + 132 29 68 69 76 + 133 29 68 69 77 + 134 29 68 69 78 + 135 7 76 69 78 + 136 7 76 69 77 + 137 7 77 69 78 + 138 3 64 79 81 + 139 2 64 79 80 + 140 11 80 79 81 + 141 7 83 80 84 + 142 30 79 80 84 + 143 7 82 80 83 + 144 30 79 80 83 + 145 30 79 80 82 + 146 7 82 80 84 + 147 31 86 85 87 + 148 31 89 88 90 + 149 31 92 91 93 + 150 31 95 94 96 + 151 31 98 97 99 + 152 31 101 100 102 + 153 31 104 103 105 + 154 31 107 106 108 + 155 31 110 109 111 + 156 31 113 112 114 + 157 31 116 115 117 + 158 31 119 118 120 + 159 31 122 121 123 + 160 31 125 124 126 + 161 31 128 127 129 + 162 31 131 130 132 + 163 31 134 133 135 + 164 31 137 136 138 + 165 31 140 139 141 + 166 31 143 142 144 + 167 31 146 145 147 + 168 31 149 148 150 + 169 31 152 151 153 + 170 31 155 154 156 + 171 31 158 157 159 + 172 31 161 160 162 + 173 31 164 163 165 + 174 31 167 166 168 + 175 31 170 169 171 + 176 31 173 172 174 + 177 31 176 175 177 + 178 31 179 178 180 + 179 31 182 181 183 + 180 31 185 184 186 + 181 31 188 187 189 + 182 31 191 190 192 + 183 31 194 193 195 + 184 31 197 196 198 + 185 31 200 199 201 + 186 31 203 202 204 + 187 31 206 205 207 + 188 31 209 208 210 + 189 31 212 211 213 + 190 31 215 214 216 + 191 31 218 217 219 + 192 31 221 220 222 + 193 31 224 223 225 + 194 31 227 226 228 + 195 31 230 229 231 + 196 31 233 232 234 + 197 31 236 235 237 + 198 31 239 238 240 + 199 31 242 241 243 + 200 31 245 244 246 + 201 31 248 247 249 + 202 31 251 250 252 + 203 31 254 253 255 + 204 31 257 256 258 + 205 31 260 259 261 + 206 31 263 262 264 + 207 31 266 265 267 + 208 31 269 268 270 + 209 31 272 271 273 + 210 31 275 274 276 + 211 31 278 277 279 + 212 31 281 280 282 + 213 31 284 283 285 + 214 31 287 286 288 + 215 31 290 289 291 + 216 31 293 292 294 + 217 31 296 295 297 + 218 31 299 298 300 + 219 31 302 301 303 + 220 31 305 304 306 + 221 31 308 307 309 + 222 31 311 310 312 + 223 31 314 313 315 + 224 31 317 316 318 + 225 31 320 319 321 + 226 31 323 322 324 + 227 31 326 325 327 + 228 31 329 328 330 + 229 31 332 331 333 + 230 31 335 334 336 + 231 31 338 337 339 + 232 31 341 340 342 + 233 31 344 343 345 + 234 31 347 346 348 + 235 31 350 349 351 + 236 31 353 352 354 + 237 31 356 355 357 + 238 31 359 358 360 + 239 31 362 361 363 + 240 31 365 364 366 + 241 31 368 367 369 + 242 31 371 370 372 + 243 31 374 373 375 + 244 31 377 376 378 + 245 31 380 379 381 + 246 31 383 382 384 + 247 31 386 385 387 + 248 31 389 388 390 + 249 31 392 391 393 + 250 31 395 394 396 + 251 31 398 397 399 + 252 31 401 400 402 + 253 31 404 403 405 + 254 31 407 406 408 + 255 31 410 409 411 + 256 31 413 412 414 + 257 31 416 415 417 + 258 31 419 418 420 + 259 31 422 421 423 + 260 31 425 424 426 + 261 31 428 427 429 + 262 31 431 430 432 + 263 31 434 433 435 + 264 31 437 436 438 + 265 31 440 439 441 + 266 31 443 442 444 + 267 31 446 445 447 + 268 31 449 448 450 + 269 31 452 451 453 + 270 31 455 454 456 + 271 31 458 457 459 + 272 31 461 460 462 + 273 31 464 463 465 + 274 31 467 466 468 + 275 31 470 469 471 + 276 31 473 472 474 + 277 31 476 475 477 + 278 31 479 478 480 + 279 31 482 481 483 + 280 31 485 484 486 + 281 31 488 487 489 + 282 31 491 490 492 + 283 31 494 493 495 + 284 31 497 496 498 + 285 31 500 499 501 + 286 31 503 502 504 + 287 31 506 505 507 + 288 31 509 508 510 + 289 31 512 511 513 + 290 31 515 514 516 + 291 31 518 517 519 + 292 31 521 520 522 + 293 31 524 523 525 + 294 31 527 526 528 + 295 31 530 529 531 + 296 31 533 532 534 + 297 31 536 535 537 + 298 31 539 538 540 + 299 31 542 541 543 + 300 31 545 544 546 + 301 31 548 547 549 + 302 31 551 550 552 + 303 31 554 553 555 + 304 31 557 556 558 + 305 31 560 559 561 + 306 31 563 562 564 + 307 31 566 565 567 + 308 31 569 568 570 + 309 31 572 571 573 + 310 31 575 574 576 + 311 31 578 577 579 + 312 31 581 580 582 + 313 31 584 583 585 + 314 31 587 586 588 + 315 31 590 589 591 + 316 31 593 592 594 + 317 31 596 595 597 + 318 31 599 598 600 + 319 31 602 601 603 + 320 31 605 604 606 + 321 31 608 607 609 + 322 31 611 610 612 + 323 31 614 613 615 + 324 31 617 616 618 + 325 31 620 619 621 + 326 31 623 622 624 + 327 31 626 625 627 + 328 31 629 628 630 + 329 31 632 631 633 + 330 31 635 634 636 + 331 31 638 637 639 + 332 31 641 640 642 + 333 31 644 643 645 + 334 31 647 646 648 + 335 31 650 649 651 + 336 31 653 652 654 + 337 31 656 655 657 + 338 31 659 658 660 + 339 31 662 661 663 + 340 31 665 664 666 + 341 31 668 667 669 + 342 31 671 670 672 + 343 31 674 673 675 + 344 31 677 676 678 + 345 31 680 679 681 + 346 31 683 682 684 + 347 31 686 685 687 + 348 31 689 688 690 + 349 31 692 691 693 + 350 31 695 694 696 + 351 31 698 697 699 + 352 31 701 700 702 + 353 31 704 703 705 + 354 31 707 706 708 + 355 31 710 709 711 + 356 31 713 712 714 + 357 31 716 715 717 + 358 31 719 718 720 + 359 31 722 721 723 + 360 31 725 724 726 + 361 31 728 727 729 + 362 31 731 730 732 + 363 31 734 733 735 + 364 31 737 736 738 + 365 31 740 739 741 + 366 31 743 742 744 + 367 31 746 745 747 + 368 31 749 748 750 + 369 31 752 751 753 + 370 31 755 754 756 + 371 31 758 757 759 + 372 31 761 760 762 + 373 31 764 763 765 + 374 31 767 766 768 + 375 31 770 769 771 + 376 31 773 772 774 + 377 31 776 775 777 + 378 31 779 778 780 + 379 31 782 781 783 + 380 31 785 784 786 + 381 31 788 787 789 + 382 31 791 790 792 + 383 31 794 793 795 + 384 31 797 796 798 + 385 31 800 799 801 + 386 31 803 802 804 + 387 31 806 805 807 + 388 31 809 808 810 + 389 31 812 811 813 + 390 31 815 814 816 + 391 31 818 817 819 + 392 31 821 820 822 + 393 31 824 823 825 + 394 31 827 826 828 + 395 31 830 829 831 + 396 31 833 832 834 + 397 31 836 835 837 + 398 31 839 838 840 + 399 31 842 841 843 + 400 31 845 844 846 + 401 31 848 847 849 + 402 31 851 850 852 + 403 31 854 853 855 + 404 31 857 856 858 + 405 31 860 859 861 + 406 31 863 862 864 + 407 31 866 865 867 + 408 31 869 868 870 + 409 31 872 871 873 + 410 31 875 874 876 + 411 31 878 877 879 + 412 31 881 880 882 + 413 31 884 883 885 + 414 31 887 886 888 + 415 31 890 889 891 + 416 31 893 892 894 + 417 31 896 895 897 + 418 31 899 898 900 + 419 31 902 901 903 + 420 31 905 904 906 + 421 31 908 907 909 + 422 31 911 910 912 + 423 31 914 913 915 + 424 31 917 916 918 + 425 31 920 919 921 + 426 31 923 922 924 + 427 31 926 925 927 + 428 31 929 928 930 + 429 31 932 931 933 + 430 31 935 934 936 + 431 31 938 937 939 + 432 31 941 940 942 + 433 31 944 943 945 + 434 31 947 946 948 + 435 31 950 949 951 + 436 31 953 952 954 + 437 31 956 955 957 + 438 31 959 958 960 + 439 31 962 961 963 + 440 31 965 964 966 + 441 31 968 967 969 + 442 31 971 970 972 + 443 31 974 973 975 + 444 31 977 976 978 + 445 31 980 979 981 + 446 31 983 982 984 + 447 31 986 985 987 + 448 31 989 988 990 + 449 31 992 991 993 + 450 31 995 994 996 + 451 31 998 997 999 + 452 31 1001 1000 1002 + 453 31 1004 1003 1005 + 454 31 1007 1006 1008 + 455 31 1010 1009 1011 + 456 31 1013 1012 1014 + 457 31 1016 1015 1017 + 458 31 1019 1018 1020 + 459 31 1022 1021 1023 + 460 31 1025 1024 1026 + 461 31 1028 1027 1029 + 462 31 1031 1030 1032 + 463 31 1034 1033 1035 + 464 31 1037 1036 1038 + 465 31 1040 1039 1041 + 466 31 1043 1042 1044 + 467 31 1046 1045 1047 + 468 31 1049 1048 1050 + 469 31 1052 1051 1053 + 470 31 1055 1054 1056 + 471 31 1058 1057 1059 + 472 31 1061 1060 1062 + 473 31 1064 1063 1065 + 474 31 1067 1066 1068 + 475 31 1070 1069 1071 + 476 31 1073 1072 1074 + 477 31 1076 1075 1077 + 478 31 1079 1078 1080 + 479 31 1082 1081 1083 + 480 31 1085 1084 1086 + 481 31 1088 1087 1089 + 482 31 1091 1090 1092 + 483 31 1094 1093 1095 + 484 31 1097 1096 1098 + 485 31 1100 1099 1101 + 486 31 1103 1102 1104 + 487 31 1106 1105 1107 + 488 31 1109 1108 1110 + 489 31 1112 1111 1113 + 490 31 1115 1114 1116 + 491 31 1118 1117 1119 + 492 31 1121 1120 1122 + 493 31 1124 1123 1125 + 494 31 1127 1126 1128 + 495 31 1130 1129 1131 + 496 31 1133 1132 1134 + 497 31 1136 1135 1137 + 498 31 1139 1138 1140 + 499 31 1142 1141 1143 + 500 31 1145 1144 1146 + 501 31 1148 1147 1149 + 502 31 1151 1150 1152 + 503 31 1154 1153 1155 + 504 31 1157 1156 1158 + 505 31 1160 1159 1161 + 506 31 1163 1162 1164 + 507 31 1166 1165 1167 + 508 31 1169 1168 1170 + 509 31 1172 1171 1173 + 510 31 1175 1174 1176 + 511 31 1178 1177 1179 + 512 31 1181 1180 1182 + 513 31 1184 1183 1185 + 514 31 1187 1186 1188 + 515 31 1190 1189 1191 + 516 31 1193 1192 1194 + 517 31 1196 1195 1197 + 518 31 1199 1198 1200 + 519 31 1202 1201 1203 + 520 31 1205 1204 1206 + 521 31 1208 1207 1209 + 522 31 1211 1210 1212 + 523 31 1214 1213 1215 + 524 31 1217 1216 1218 + 525 31 1220 1219 1221 + 526 31 1223 1222 1224 + 527 31 1226 1225 1227 + 528 31 1229 1228 1230 + 529 31 1232 1231 1233 + 530 31 1235 1234 1236 + 531 31 1238 1237 1239 + 532 31 1241 1240 1242 + 533 31 1244 1243 1245 + 534 31 1247 1246 1248 + 535 31 1250 1249 1251 + 536 31 1253 1252 1254 + 537 31 1256 1255 1257 + 538 31 1259 1258 1260 + 539 31 1262 1261 1263 + 540 31 1265 1264 1266 + 541 31 1268 1267 1269 + 542 31 1271 1270 1272 + 543 31 1274 1273 1275 + 544 31 1277 1276 1278 + 545 31 1280 1279 1281 + 546 31 1283 1282 1284 + 547 31 1286 1285 1287 + 548 31 1289 1288 1290 + 549 31 1292 1291 1293 + 550 31 1295 1294 1296 + 551 31 1298 1297 1299 + 552 31 1301 1300 1302 + 553 31 1304 1303 1305 + 554 31 1307 1306 1308 + 555 31 1310 1309 1311 + 556 31 1313 1312 1314 + 557 31 1316 1315 1317 + 558 31 1319 1318 1320 + 559 31 1322 1321 1323 + 560 31 1325 1324 1326 + 561 31 1328 1327 1329 + 562 31 1331 1330 1332 + 563 31 1334 1333 1335 + 564 31 1337 1336 1338 + 565 31 1340 1339 1341 + 566 31 1343 1342 1344 + 567 31 1346 1345 1347 + 568 31 1349 1348 1350 + 569 31 1352 1351 1353 + 570 31 1355 1354 1356 + 571 31 1358 1357 1359 + 572 31 1361 1360 1362 + 573 31 1364 1363 1365 + 574 31 1367 1366 1368 + 575 31 1370 1369 1371 + 576 31 1373 1372 1374 + 577 31 1376 1375 1377 + 578 31 1379 1378 1380 + 579 31 1382 1381 1383 + 580 31 1385 1384 1386 + 581 31 1388 1387 1389 + 582 31 1391 1390 1392 + 583 31 1394 1393 1395 + 584 31 1397 1396 1398 + 585 31 1400 1399 1401 + 586 31 1403 1402 1404 + 587 31 1406 1405 1407 + 588 31 1409 1408 1410 + 589 31 1412 1411 1413 + 590 31 1415 1414 1416 + 591 31 1418 1417 1419 + 592 31 1421 1420 1422 + 593 31 1424 1423 1425 + 594 31 1427 1426 1428 + 595 31 1430 1429 1431 + 596 31 1433 1432 1434 + 597 31 1436 1435 1437 + 598 31 1439 1438 1440 + 599 31 1442 1441 1443 + 600 31 1445 1444 1446 + 601 31 1448 1447 1449 + 602 31 1451 1450 1452 + 603 31 1454 1453 1455 + 604 31 1457 1456 1458 + 605 31 1460 1459 1461 + 606 31 1463 1462 1464 + 607 31 1466 1465 1467 + 608 31 1469 1468 1470 + 609 31 1472 1471 1473 + 610 31 1475 1474 1476 + 611 31 1478 1477 1479 + 612 31 1481 1480 1482 + 613 31 1484 1483 1485 + 614 31 1487 1486 1488 + 615 31 1490 1489 1491 + 616 31 1493 1492 1494 + 617 31 1496 1495 1497 + 618 31 1499 1498 1500 + 619 31 1502 1501 1503 + 620 31 1505 1504 1506 + 621 31 1508 1507 1509 + 622 31 1511 1510 1512 + 623 31 1514 1513 1515 + 624 31 1517 1516 1518 + 625 31 1520 1519 1521 + 626 31 1523 1522 1524 + 627 31 1526 1525 1527 + 628 31 1529 1528 1530 + 629 31 1532 1531 1533 + 630 31 1535 1534 1536 + 631 31 1538 1537 1539 + 632 31 1541 1540 1542 + 633 31 1544 1543 1545 + 634 31 1547 1546 1548 + 635 31 1550 1549 1551 + 636 31 1553 1552 1554 + 637 31 1556 1555 1557 + 638 31 1559 1558 1560 + 639 31 1562 1561 1563 + 640 31 1565 1564 1566 + 641 31 1568 1567 1569 + 642 31 1571 1570 1572 + 643 31 1574 1573 1575 + 644 31 1577 1576 1578 + 645 31 1580 1579 1581 + 646 31 1583 1582 1584 + 647 31 1586 1585 1587 + 648 31 1589 1588 1590 + 649 31 1592 1591 1593 + 650 31 1595 1594 1596 + 651 31 1598 1597 1599 + 652 31 1601 1600 1602 + 653 31 1604 1603 1605 + 654 31 1607 1606 1608 + 655 31 1610 1609 1611 + 656 31 1613 1612 1614 + 657 31 1616 1615 1617 + 658 31 1619 1618 1620 + 659 31 1622 1621 1623 + 660 31 1625 1624 1626 + 661 31 1628 1627 1629 + 662 31 1631 1630 1632 + 663 31 1634 1633 1635 + 664 31 1637 1636 1638 + 665 31 1640 1639 1641 + 666 31 1643 1642 1644 + 667 31 1646 1645 1647 + 668 31 1649 1648 1650 + 669 31 1652 1651 1653 + 670 31 1655 1654 1656 + 671 31 1658 1657 1659 + 672 31 1661 1660 1662 + 673 31 1664 1663 1665 + 674 31 1667 1666 1668 + 675 31 1670 1669 1671 + 676 31 1673 1672 1674 + 677 31 1676 1675 1677 + 678 31 1679 1678 1680 + 679 31 1682 1681 1683 + 680 31 1685 1684 1686 + 681 31 1688 1687 1689 + 682 31 1691 1690 1692 + 683 31 1694 1693 1695 + 684 31 1697 1696 1698 + 685 31 1700 1699 1701 + 686 31 1703 1702 1704 + 687 31 1706 1705 1707 + 688 31 1709 1708 1710 + 689 31 1712 1711 1713 + 690 31 1715 1714 1716 + 691 31 1718 1717 1719 + 692 31 1721 1720 1722 + 693 31 1724 1723 1725 + 694 31 1727 1726 1728 + 695 31 1730 1729 1731 + 696 31 1733 1732 1734 + 697 31 1736 1735 1737 + 698 31 1739 1738 1740 + 699 31 1742 1741 1743 + 700 31 1745 1744 1746 + 701 31 1748 1747 1749 + 702 31 1751 1750 1752 + 703 31 1754 1753 1755 + 704 31 1757 1756 1758 + 705 31 1760 1759 1761 + 706 31 1763 1762 1764 + 707 31 1766 1765 1767 + 708 31 1769 1768 1770 + 709 31 1772 1771 1773 + 710 31 1775 1774 1776 + 711 31 1778 1777 1779 + 712 31 1781 1780 1782 + 713 31 1784 1783 1785 + 714 31 1787 1786 1788 + 715 31 1790 1789 1791 + 716 31 1793 1792 1794 + 717 31 1796 1795 1797 + 718 31 1799 1798 1800 + 719 31 1802 1801 1803 + 720 31 1805 1804 1806 + 721 31 1808 1807 1809 + 722 31 1811 1810 1812 + 723 31 1814 1813 1815 + 724 31 1817 1816 1818 + 725 31 1820 1819 1821 + 726 31 1823 1822 1824 + 727 31 1826 1825 1827 + 728 31 1829 1828 1830 + 729 31 1832 1831 1833 + 730 31 1835 1834 1836 + 731 31 1838 1837 1839 + 732 31 1841 1840 1842 + 733 31 1844 1843 1845 + 734 31 1847 1846 1848 + 735 31 1850 1849 1851 + 736 31 1853 1852 1854 + 737 31 1856 1855 1857 + 738 31 1859 1858 1860 + 739 31 1862 1861 1863 + 740 31 1865 1864 1866 + 741 31 1868 1867 1869 + 742 31 1871 1870 1872 + 743 31 1874 1873 1875 + 744 31 1877 1876 1878 + 745 31 1880 1879 1881 + 746 31 1883 1882 1884 + 747 31 1886 1885 1887 + 748 31 1889 1888 1890 + 749 31 1892 1891 1893 + 750 31 1895 1894 1896 + 751 31 1898 1897 1899 + 752 31 1901 1900 1902 + 753 31 1904 1903 1905 + 754 31 1907 1906 1908 + 755 31 1910 1909 1911 + 756 31 1913 1912 1914 + 757 31 1916 1915 1917 + 758 31 1919 1918 1920 + 759 31 1922 1921 1923 + 760 31 1925 1924 1926 + 761 31 1928 1927 1929 + 762 31 1931 1930 1932 + 763 31 1934 1933 1935 + 764 31 1937 1936 1938 + 765 31 1940 1939 1941 + 766 31 1943 1942 1944 + 767 31 1946 1945 1947 + 768 31 1949 1948 1950 + 769 31 1952 1951 1953 + 770 31 1955 1954 1956 + 771 31 1958 1957 1959 + 772 31 1961 1960 1962 + 773 31 1964 1963 1965 + 774 31 1967 1966 1968 + 775 31 1970 1969 1971 + 776 31 1973 1972 1974 + 777 31 1976 1975 1977 + 778 31 1979 1978 1980 + 779 31 1982 1981 1983 + 780 31 1985 1984 1986 + 781 31 1988 1987 1989 + 782 31 1991 1990 1992 + 783 31 1994 1993 1995 + 784 31 1997 1996 1998 + 785 31 2000 1999 2001 + 786 31 2003 2002 2004 + +Dihedrals + + 1 6 3 1 7 8 + 2 6 2 1 7 19 + 3 4 2 1 7 8 + 4 5 2 1 7 8 + 5 6 3 1 7 19 + 6 3 3 1 2 4 + 7 3 3 1 2 6 + 8 3 3 1 2 5 + 9 3 5 2 1 7 + 10 3 4 2 1 7 + 11 3 6 2 1 7 + 12 3 19 7 8 20 + 13 1 1 7 8 9 + 14 3 1 7 8 20 + 15 2 1 7 8 11 + 16 8 9 8 11 22 + 17 3 7 8 9 10 + 18 7 7 8 9 28 + 19 8 7 8 11 21 + 20 8 7 8 11 12 + 21 3 9 8 7 19 + 22 3 11 8 9 28 + 23 8 7 8 11 22 + 24 3 11 8 7 19 + 25 10 9 8 11 12 + 26 3 20 8 9 28 + 27 8 9 8 11 21 + 28 8 20 8 11 22 + 29 8 20 8 11 21 + 30 4 8 9 28 29 + 31 5 8 9 28 29 + 32 6 10 9 28 29 + 33 11 10 9 8 11 + 34 6 10 9 28 32 + 35 3 10 9 8 20 + 36 6 8 9 28 32 + 37 9 8 11 12 13 + 38 8 12 11 8 20 + 39 9 8 11 12 14 + 40 14 14 12 13 15 + 41 13 13 12 14 24 + 42 3 13 12 11 22 + 43 14 13 12 14 16 + 44 3 14 12 11 22 + 45 3 13 12 11 21 + 46 13 11 12 14 24 + 47 12 11 12 14 16 + 48 3 14 12 11 21 + 49 13 11 12 13 23 + 50 13 14 12 13 23 + 51 12 11 12 13 15 + 52 16 23 13 15 25 + 53 13 12 13 15 25 + 54 14 12 13 15 17 + 55 14 12 14 16 17 + 56 13 12 14 16 26 + 57 16 24 14 16 26 + 58 12 13 15 17 18 + 59 13 17 15 13 23 + 60 14 13 15 17 16 + 61 12 14 16 17 18 + 62 13 17 16 14 24 + 63 14 14 16 17 15 + 64 15 16 17 18 27 + 65 13 15 17 16 26 + 66 13 18 17 15 25 + 67 15 15 17 18 27 + 68 13 16 17 15 25 + 69 13 18 17 16 26 + 70 1 9 28 29 30 + 71 3 32 28 29 33 + 72 3 9 28 29 33 + 73 3 9 28 29 34 + 74 3 32 28 29 34 + 75 3 33 29 30 35 + 76 3 30 29 28 32 + 77 3 34 29 30 35 + 78 7 28 29 30 35 + 79 3 28 29 30 31 + 80 6 29 30 35 39 + 81 4 29 30 35 36 + 82 5 29 30 35 36 + 83 3 31 30 29 34 + 84 3 31 30 29 33 + 85 6 31 30 35 39 + 86 6 31 30 35 36 + 87 1 30 35 36 37 + 88 3 39 35 36 41 + 89 3 30 35 36 40 + 90 3 30 35 36 41 + 91 3 39 35 36 40 + 92 3 40 36 37 42 + 93 3 41 36 37 42 + 94 7 35 36 37 42 + 95 3 35 36 37 38 + 96 3 37 36 35 39 + 97 6 38 37 42 53 + 98 3 38 37 36 40 + 99 6 38 37 42 43 + 100 4 36 37 42 43 + 101 6 36 37 42 53 + 102 5 36 37 42 43 + 103 3 38 37 36 41 + 104 3 37 42 43 54 + 105 1 37 42 43 44 + 106 3 53 42 43 54 + 107 2 37 42 43 46 + 108 10 44 43 46 47 + 109 3 44 43 42 53 + 110 8 42 43 46 56 + 111 8 42 43 46 55 + 112 8 42 43 46 47 + 113 3 46 43 42 53 + 114 8 44 43 46 55 + 115 8 54 43 46 56 + 116 7 42 43 44 62 + 117 3 42 43 44 45 + 118 3 46 43 44 62 + 119 3 54 43 44 62 + 120 8 54 43 46 55 + 121 8 44 43 46 56 + 122 5 43 44 62 63 + 123 6 45 44 62 70 + 124 6 43 44 62 70 + 125 4 43 44 62 63 + 126 11 45 44 43 46 + 127 3 45 44 43 54 + 128 6 45 44 62 63 + 129 9 43 46 47 48 + 130 8 47 46 43 54 + 131 9 43 46 47 49 + 132 3 49 47 46 55 + 133 13 46 47 48 57 + 134 14 49 47 48 50 + 135 3 49 47 46 56 + 136 12 46 47 48 50 + 137 12 46 47 49 51 + 138 14 48 47 49 51 + 139 13 46 47 49 58 + 140 3 48 47 46 55 + 141 3 48 47 46 56 + 142 13 48 47 49 58 + 143 13 49 47 48 57 + 144 14 47 48 50 52 + 145 16 57 48 50 59 + 146 13 47 48 50 59 + 147 16 58 49 51 60 + 148 13 47 49 51 60 + 149 14 47 49 51 52 + 150 13 48 50 52 61 + 151 14 48 50 52 51 + 152 16 59 50 52 61 + 153 13 52 50 48 57 + 154 14 49 51 52 50 + 155 13 49 51 52 61 + 156 13 52 51 49 58 + 157 16 60 51 52 61 + 158 13 51 52 50 59 + 159 13 50 52 51 60 + 160 3 70 62 63 71 + 161 2 44 62 63 66 + 162 1 44 62 63 64 + 163 3 44 62 63 71 + 164 8 62 63 66 72 + 165 8 62 63 66 67 + 166 3 71 63 64 79 + 167 3 62 63 64 65 + 168 3 64 63 62 70 + 169 8 62 63 66 73 + 170 7 62 63 64 79 + 171 8 64 63 66 67 + 172 3 66 63 64 79 + 173 8 64 63 66 72 + 174 3 66 63 62 70 + 175 8 71 63 66 73 + 176 8 64 63 66 73 + 177 8 71 63 66 72 + 178 6 63 64 79 81 + 179 6 65 64 79 80 + 180 3 65 64 63 71 + 181 4 63 64 79 80 + 182 6 65 64 79 81 + 183 5 63 64 79 80 + 184 11 65 64 63 66 + 185 8 67 66 63 71 + 186 17 63 66 67 74 + 187 17 72 66 67 75 + 188 17 63 66 67 75 + 189 17 63 66 67 68 + 190 17 73 66 67 74 + 191 17 73 66 67 75 + 192 17 72 66 67 74 + 193 19 66 67 68 69 + 194 21 68 67 66 72 + 195 18 66 67 68 69 + 196 21 68 67 66 73 + 197 20 69 68 67 74 + 198 20 69 68 67 75 + 199 20 67 68 69 77 + 200 20 67 68 69 76 + 201 20 67 68 69 78 + 202 3 81 79 80 83 + 203 3 81 79 80 84 + 204 3 64 79 80 84 + 205 3 81 79 80 82 + 206 3 64 79 80 83 + 207 3 64 79 80 82 + +Impropers + + 1 2 7 1 8 19 + 2 1 1 2 7 3 + 3 1 9 8 28 10 + 4 2 28 9 29 32 + 5 1 30 29 35 31 + 6 2 35 30 36 39 + 7 1 37 36 42 38 + 8 2 42 37 43 53 + 9 1 44 43 62 45 + 10 2 62 44 63 70 + 11 1 64 63 79 65 + 12 2 79 64 80 81 diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 6daaf94710..33f834a140 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -11,6 +11,11 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author for: Emile Maras (CEA, France) + new options for inter-replica forces, first/last replica treatment +------------------------------------------------------------------------- */ + #include #include #include @@ -89,26 +94,26 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : if (iarg+3 > narg) error->all(FLERR,"Illegal fix neb command"); if (strcmp(arg[iarg+1],"first") == 0) { FreeEndIni = true; - kspringIni = force->numeric(FLERR,arg[iarg+2]); + kspringIni = force->numeric(FLERR,arg[iarg+2]); } else if (strcmp(arg[iarg+1],"last") == 0) { FreeEndFinal = true; FinalAndInterWithRespToEIni = false; FreeEndFinalWithRespToEIni = false; - kspringFinal = force->numeric(FLERR,arg[iarg+2]); + kspringFinal = force->numeric(FLERR,arg[iarg+2]); } else if (strcmp(arg[iarg+1],"last/efirst") == 0) { FreeEndFinal = false; FinalAndInterWithRespToEIni = false; FreeEndFinalWithRespToEIni = true; - kspringFinal = force->numeric(FLERR,arg[iarg+2]); + kspringFinal = force->numeric(FLERR,arg[iarg+2]); } else if (strcmp(arg[iarg+1],"last/efirst/middle") == 0) { FreeEndFinal = false; FinalAndInterWithRespToEIni = true; FreeEndFinalWithRespToEIni = true; - kspringFinal = force->numeric(FLERR,arg[iarg+2]); + kspringFinal = force->numeric(FLERR,arg[iarg+2]); } else error->all(FLERR,"Illegal fix neb command"); iarg += 3; - + } else error->all(FLERR,"Illegal fix neb command"); } @@ -293,12 +298,14 @@ void FixNEB::min_post_force(int vflag) if (ireplica == 0) vIni=veng; if (FreeEndFinalWithRespToEIni) { - if (me == 0) { + if (cmode == SINGLE_PROC_DIRECT || cmode == SINGLE_PROC_MAP) { int procFirst; procFirst=universe->root_proc[0]; MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); - } - if (cmode == MULTI_PROC) { + }else { + if (me == 0) + MPI_Bcast(&vIni,1,MPI_DOUBLE,0,rootworld); + MPI_Bcast(&vIni,1,MPI_DOUBLE,0,world); } } @@ -308,8 +315,8 @@ void FixNEB::min_post_force(int vflag) // if (me == 0 ) if (update->ntimestep == 0) { EIniIni = veng; - // if (cmode == MULTI_PROC) - // MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); + // if (cmode == MULTI_PROC) + // MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); } }*/ @@ -355,7 +362,7 @@ void FixNEB::min_post_force(int vflag) tangent[i][2]=delzp; tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; } } @@ -378,9 +385,9 @@ void FixNEB::min_post_force(int vflag) tangent[i][0]=delxn; tangent[i][1]=delyn; tangent[i][2]=delzn; - tlen += tangent[i][0]*tangent[i][0] + + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; } } @@ -418,23 +425,27 @@ void FixNEB::min_post_force(int vflag) tangent[i][0] = vmax*delxn + vmin*delxp; tangent[i][1] = vmax*delyn + vmin*delyp; tangent[i][2] = vmax*delzn + vmin*delzp; - } else { + } else if (vnext < vprev) { tangent[i][0] = vmin*delxn + vmax*delxp; tangent[i][1] = vmin*delyn + vmax*delyp; tangent[i][2] = vmin*delzn + vmax*delzp; + } else { // vnext == vprev, e.g. for potentials that do not compute an energy + tangent[i][0] = delxn + delxp; + tangent[i][1] = delyn + delyp; + tangent[i][2] = delzn + delzp; } } nlen += delxn*delxn + delyn*delyn + delzn*delzn; - tlen += tangent[i][0]*tangent[i][0] + + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; dotpath += delxp*delxn + delyp*delyn + delzp*delzn; - dottangrad += tangent[i][0]*f[i][0] + + dottangrad += tangent[i][0]*f[i][0] + tangent[i][1]*f[i][1] + tangent[i][2]*f[i][2]; - gradnextlen += fnext[i][0]*fnext[i][0] + + gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + + dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + f[i][2]*fnext[i][2]; springF[i][0] = kspringPerp*(delxn-delxp); @@ -509,9 +520,10 @@ void FixNEB::min_post_force(int vflag) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall/tlen; - if (dot<0) prefactor = -dot - kspringFinal*(veng-EFinalIni); - else prefactor = -dot + kspringFinal*(veng-EFinalIni); - + if (vengwhichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); if (temp_flag == 0) { if (universe->iworld == 0) temp_dephase = temperature->compute_scalar(); @@ -310,6 +310,7 @@ void PRD::command(int narg, char **arg) time_dephase = time_dynamics = time_quench = time_comm = time_output = 0.0; bigint clock = 0; + timer->init(); timer->barrier_start(); time_start = timer->get_wall(Timer::TOTAL); @@ -389,7 +390,7 @@ void PRD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); timer->barrier_start(); @@ -544,7 +545,7 @@ void PRD::dynamics(int nsteps, double &time_category) update->nsteps = nsteps; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // this may be needed if don't do full init //modify->addstep_compute_all(update->ntimestep); bigint ncalls = neighbor->ncalls; diff --git a/src/REPLICA/tad.cpp b/src/REPLICA/tad.cpp index 5a4d885224..958a57e4e8 100644 --- a/src/REPLICA/tad.cpp +++ b/src/REPLICA/tad.cpp @@ -264,7 +264,7 @@ void TAD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // main loop: look for events until out of time // (1) dynamics, store state, quench, check event, restore state @@ -274,6 +274,7 @@ void TAD::command(int narg, char **arg) nbuild = ndanger = 0; time_neb = time_dynamics = time_quench = time_comm = time_output = 0.0; + timer->init(); timer->barrier_start(); time_start = timer->get_wall(Timer::TOTAL); @@ -341,7 +342,7 @@ void TAD::command(int narg, char **arg) update->whichflag = 1; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // write restart file of hot coords @@ -447,7 +448,7 @@ void TAD::dynamics() update->nsteps = t_event; lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); // this may be needed if don't do full init //modify->addstep_compute_all(update->ntimestep); int ncalls = neighbor->ncalls; diff --git a/src/REPLICA/temper.cpp b/src/REPLICA/temper.cpp index 667f2893c6..d7e8c981bb 100644 --- a/src/REPLICA/temper.cpp +++ b/src/REPLICA/temper.cpp @@ -212,7 +212,7 @@ void Temper::command(int narg, char **arg) if (me_universe == 0 && universe->uscreen) fprintf(universe->uscreen,"Setting up tempering ...\n"); - update->integrate->setup(); + update->integrate->setup(1); if (me_universe == 0) { if (universe->uscreen) { diff --git a/src/REPLICA/verlet_split.cpp b/src/REPLICA/verlet_split.cpp index 4572170f34..e47965d1c3 100644 --- a/src/REPLICA/verlet_split.cpp +++ b/src/REPLICA/verlet_split.cpp @@ -239,13 +239,13 @@ void VerletSplit::init() servant partition only sets up KSpace calculation ------------------------------------------------------------------------- */ -void VerletSplit::setup() +void VerletSplit::setup(int flag) { if (comm->me == 0 && screen) fprintf(screen,"Setting up Verlet/split run ...\n"); if (!master) force->kspace->setup(); - else Verlet::setup(); + else Verlet::setup(flag); } /* ---------------------------------------------------------------------- @@ -344,7 +344,7 @@ void VerletSplit::run(int n) if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); timer->stamp(Timer::COMM); if (n_pre_neighbor) modify->pre_neighbor(); - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } } diff --git a/src/REPLICA/verlet_split.h b/src/REPLICA/verlet_split.h index 2d25131df3..b3ee87e580 100644 --- a/src/REPLICA/verlet_split.h +++ b/src/REPLICA/verlet_split.h @@ -29,7 +29,7 @@ class VerletSplit : public Verlet { VerletSplit(class LAMMPS *, int, char **); ~VerletSplit(); void init(); - void setup(); + void setup(int); void setup_minimal(int); void run(int); bigint memory_usage(); diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index 9d46968273..33a4b441fd 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -29,6 +29,8 @@ #include "comm.h" #include "random_mars.h" #include "force.h" +#include "input.h" +#include "variable.h" #include "output.h" #include "math_const.h" #include "memory.h" @@ -74,6 +76,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : time_integrate = 1; rigid_flag = 1; virial_flag = 1; + thermo_virial = 1; create_attribute = 1; dof_flag = 1; enforce2d_flag = 1; @@ -126,15 +129,60 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : // nbody = # of non-zero ncount values // use nall as incremented ptr to set body[] values for each atom - } else if (strcmp(arg[3],"molecule") == 0) { + } else if (strcmp(arg[3],"molecule") == 0 || strcmp(arg[3],"custom") == 0) { rstyle = MOLECULE; - iarg = 4; - if (atom->molecule_flag == 0) - error->all(FLERR,"Fix rigid molecule requires atom attribute molecule"); - + tagint *molecule; int *mask = atom->mask; - tagint *molecule = atom->molecule; int nlocal = atom->nlocal; + int custom_flag = strcmp(arg[3],"custom") == 0; + if (custom_flag) { + if (narg < 5) error->all(FLERR,"Illegal fix rigid command"); + + // determine whether atom-style variable or atom property is used. + if (strstr(arg[4],"i_") == arg[4]) { + int is_double=0; + int custom_index = atom->find_custom(arg[4]+2,is_double); + if (custom_index == -1) + error->all(FLERR,"Fix rigid custom requires previously defined property/atom"); + else if (is_double) + error->all(FLERR,"Fix rigid custom requires integer-valued property/atom"); + int minval = INT_MAX; + int *value = atom->ivector[custom_index]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) minval = MIN(minval,value[i]); + int vmin = minval; + MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world); + molecule = new tagint[nlocal]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + molecule[i] = (tagint)(value[i] - minval + 1); + else + molecule[i] = 0; + + } else if (strstr(arg[4],"v_") == arg[4]) { + int ivariable = input->variable->find(arg[4]+2); + if (ivariable < 0) + error->all(FLERR,"Variable name for fix rigid custom does not exist"); + if (input->variable->atomstyle(ivariable) == 0) + error->all(FLERR,"Fix rigid custom variable is no atom-style variable"); + double *value = new double[nlocal]; + input->variable->compute_atom(ivariable,0,value,1,0); + int minval = INT_MAX; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) minval = MIN(minval,(int)value[i]); + int vmin = minval; + MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world); + molecule = new tagint[nlocal]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) molecule[i] = (tagint)((tagint)value[i] - minval + 1); + delete[] value; + } else error->all(FLERR,"Unsupported fix rigid custom property"); + } else { + if (atom->molecule_flag == 0) + error->all(FLERR,"Fix rigid molecule requires atom attribute molecule"); + molecule = atom->molecule; + } + iarg = 4 + custom_flag; tagint maxmol_tag = -1; for (i = 0; i < nlocal; i++) @@ -173,6 +221,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : } memory->destroy(ncount); + if (custom_flag) delete [] molecule; // each listed group is a rigid body // check if all listed groups exist diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 60afeecbf0..e6083f6493 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -29,7 +29,9 @@ #include "group.h" #include "comm.h" #include "force.h" +#include "input.h" #include "output.h" +#include "variable.h" #include "random_mars.h" #include "math_const.h" #include "memory.h" @@ -64,11 +66,12 @@ enum{FULL_BODY,INITIAL,FINAL,FORCE_TORQUE,VCM_ANGMOM,XCM_MASS,ITENSOR,DOF}; FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), step_respa(NULL), - infile(NULL), body(NULL), bodyown(NULL), bodytag(NULL), atom2body(NULL), - xcmimage(NULL), displace(NULL), eflags(NULL), orient(NULL), dorient(NULL), - avec_ellipsoid(NULL), avec_line(NULL), avec_tri(NULL), counts(NULL), - itensor(NULL), mass_body(NULL), langextra(NULL), random(NULL), id_dilate(NULL), - onemols(NULL), hash(NULL), bbox(NULL), ctr(NULL), idclose(NULL), rsqclose(NULL) + infile(NULL), body(NULL), bodyown(NULL), bodytag(NULL), atom2body(NULL), + xcmimage(NULL), displace(NULL), eflags(NULL), orient(NULL), dorient(NULL), + avec_ellipsoid(NULL), avec_line(NULL), avec_tri(NULL), counts(NULL), + itensor(NULL), mass_body(NULL), langextra(NULL), random(NULL), + id_dilate(NULL), onemols(NULL), hash(NULL), bbox(NULL), ctr(NULL), + idclose(NULL), rsqclose(NULL) { int i; @@ -78,6 +81,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : time_integrate = 1; rigid_flag = 1; virial_flag = 1; + thermo_virial = 1; create_attribute = 1; dof_flag = 1; enforce2d_flag = 1; @@ -88,7 +92,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class - extended = orientflag = dorientflag = 0; + extended = orientflag = dorientflag = customflag = 0; bodyown = NULL; bodytag = NULL; atom2body = NULL; @@ -102,24 +106,71 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // parse args for rigid body specification - if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command"); - if (strcmp(arg[3],"molecule") != 0) - error->all(FLERR,"Illegal fix rigid/small command"); + int *mask = atom->mask; + tagint *bodyid = NULL; + int nlocal = atom->nlocal; + + if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command"); + if (strcmp(arg[3],"molecule") == 0) { + if (atom->molecule_flag == 0) + error->all(FLERR,"Fix rigid/small requires atom attribute molecule"); + bodyid = atom->molecule; + + } else if (strcmp(arg[3],"custom") == 0) { + if (narg < 5) error->all(FLERR,"Illegal fix rigid/small command"); + bodyid = new tagint[nlocal]; + customflag = 1; + + // determine whether atom-style variable or atom property is used. + if (strstr(arg[4],"i_") == arg[4]) { + int is_double=0; + int custom_index = atom->find_custom(arg[4]+2,is_double); + if (custom_index == -1) + error->all(FLERR,"Fix rigid/small custom requires previously defined property/atom"); + else if (is_double) + error->all(FLERR,"Fix rigid/small custom requires integer-valued property/atom"); + + int minval = INT_MAX; + int *value = atom->ivector[custom_index]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) minval = MIN(minval,value[i]); + int vmin = minval; + MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world); + + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + bodyid[i] = (tagint)(value[i] - minval + 1); + else bodyid[i] = 0; + + } else if (strstr(arg[4],"v_") == arg[4]) { + int ivariable = input->variable->find(arg[4]+2); + if (ivariable < 0) + error->all(FLERR,"Variable name for fix rigid/small custom does not exist"); + if (input->variable->atomstyle(ivariable) == 0) + error->all(FLERR,"Fix rigid/small custom variable is no atom-style variable"); + double *value = new double[nlocal]; + input->variable->compute_atom(ivariable,0,value,1,0); + int minval = INT_MAX; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) minval = MIN(minval,(int)value[i]); + int vmin = minval; + MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world); + + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + bodyid[i] = (tagint)((tagint)value[i] - minval + 1); + else bodyid[0] = 0; + delete[] value; + } else error->all(FLERR,"Unsupported fix rigid custom property"); + } else error->all(FLERR,"Illegal fix rigid/small command"); - if (atom->molecule_flag == 0) - error->all(FLERR,"Fix rigid/small requires atom attribute molecule"); if (atom->map_style == 0) error->all(FLERR,"Fix rigid/small requires an atom map, see atom_modify"); - // maxmol = largest molecule # - - int *mask = atom->mask; - tagint *molecule = atom->molecule; - int nlocal = atom->nlocal; - + // maxmol = largest bodyid # maxmol = -1; for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) maxmol = MAX(maxmol,molecule[i]); + if (mask[i] & groupbit) maxmol = MAX(maxmol,bodyid[i]); tagint itmp; MPI_Allreduce(&maxmol,&itmp,1,MPI_LMP_TAGINT,MPI_MAX,world); @@ -154,6 +205,8 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : } int iarg = 4; + if (customflag) ++iarg; + while (iarg < narg) { if (strcmp(arg[iarg],"langevin") == 0) { if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid/small command"); @@ -343,11 +396,12 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : if (pcouple == XYZ || (domain->dimension == 2 && pcouple == XY)) pstyle = ISO; else pstyle = ANISO; - // create rigid bodies based on molecule ID + // create rigid bodies based on molecule or custom ID // sets bodytag for owned atoms // body attributes are computed later by setup_bodies() - create_bodies(); + create_bodies(bodyid); + if (customflag) delete [] bodyid; // set nlocal_body and allocate bodies I own @@ -1423,7 +1477,7 @@ void FixRigidSmall::set_v() set bodytag for all owned atoms ------------------------------------------------------------------------- */ -void FixRigidSmall::create_bodies() +void FixRigidSmall::create_bodies(tagint *bodyid) { int i,m,n; double unwrap[3]; @@ -1463,8 +1517,8 @@ void FixRigidSmall::create_bodies() double *buf; memory->create(buf,ncount*percount,"rigid/small:buf"); - // create map hash for storing unique molecule IDs of my atoms - // key = molecule ID + // create map hash for storing unique body IDs of my atoms + // key = body ID // value = index into per-body data structure // n = # of entries in hash @@ -1476,12 +1530,10 @@ void FixRigidSmall::create_bodies() // value = index into N-length data structure // n = count of unique bodies my atoms are part of - tagint *molecule = atom->molecule; - n = 0; for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; - if (hash->find(molecule[i]) == hash->end()) (*hash)[molecule[i]] = n++; + if (hash->find(bodyid[i]) == hash->end()) (*hash)[bodyid[i]] = n++; } // bbox = bounding box of each rigid body my atoms are part of @@ -1493,7 +1545,7 @@ void FixRigidSmall::create_bodies() bbox[i][1] = bbox[i][3] = bbox[i][5] = -BIG; } - // pack my atoms into buffer as molecule ID, unwrapped coords + // pack my atoms into buffer as body ID, unwrapped coords double **x = atom->x; @@ -1501,7 +1553,7 @@ void FixRigidSmall::create_bodies() for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; domain->unmap(x[i],image[i],unwrap); - buf[m++] = molecule[i]; + buf[m++] = bodyid[i]; buf[m++] = unwrap[0]; buf[m++] = unwrap[1]; buf[m++] = unwrap[2]; @@ -1541,7 +1593,7 @@ void FixRigidSmall::create_bodies() for (i = 0; i < n; i++) rsqclose[i] = BIG; - // pack my atoms into buffer as molecule ID, atom ID, unwrapped coords + // pack my atoms into buffer as body ID, atom ID, unwrapped coords tagint *tag = atom->tag; @@ -1549,7 +1601,7 @@ void FixRigidSmall::create_bodies() for (i = 0; i < nlocal; i++) { if (!(mask[i] & groupbit)) continue; domain->unmap(x[i],image[i],unwrap); - buf[m++] = molecule[i]; + buf[m++] = bodyid[i]; buf[m++] = ubuf(tag[i]).d; buf[m++] = unwrap[0]; buf[m++] = unwrap[1]; @@ -1569,7 +1621,7 @@ void FixRigidSmall::create_bodies() for (i = 0; i < nlocal; i++) { bodytag[i] = 0; if (!(mask[i] & groupbit)) continue; - m = hash->find(molecule[i])->second; + m = hash->find(bodyid[i])->second; bodytag[i] = idclose[m]; rsqmax = MAX(rsqmax,rsqclose[m]); } diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index b07dea4f33..22f9b0c16c 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -79,6 +79,7 @@ class FixRigidSmall : public Fix { char *infile; // file to read rigid body attributes from int setupflag; // 1 if body properties are setup, else 0 int commflag; // various modes of forward/reverse comm + int customflag; // 1 if custom property/variable define bodies int nbody; // total # of rigid bodies int nlinear; // total # of linear rigid bodies tagint maxmol; // max mol-ID @@ -187,7 +188,7 @@ class FixRigidSmall : public Fix { void image_shift(); void set_xv(); void set_v(); - void create_bodies(); + void create_bodies(tagint *); void setup_bodies_static(); void setup_bodies_dynamic(); void readfile(int, double **, int *); diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index f08228f3d3..c624fe2fe8 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -60,6 +60,7 @@ FixShake::FixShake(LAMMPS *lmp, int narg, char **arg) : MPI_Comm_size(world,&nprocs); virial_flag = 1; + thermo_virial = 1; create_attribute = 1; dof_flag = 1; diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 696f910a11..e8e57a72a2 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -107,6 +107,8 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) PairSNAP::~PairSNAP() { + if (copymode) return; + if (nelements) { for (int i = 0; i < nelements; i++) delete[] elements[i]; @@ -236,6 +238,10 @@ void PairSNAP::compute_regular(int eflag, int vflag) snaptr->compute_ui(ninside); snaptr->compute_zi(); + if (quadraticflag) { + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); + } // for neighbors of I within cutoff: // compute dUi/drj and dBi/drj @@ -267,8 +273,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) // quadratic contributions if (quadraticflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); int k = ncoeff+1; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { double bveci = snaptr->bvec[icoeff]; @@ -592,6 +596,10 @@ void PairSNAP::compute_optimized(int eflag, int vflag) sna[tid]->compute_zi(); } } + if (quadraticflag) { + sna[tid]->compute_bi(); + sna[tid]->copy_bi2bvec(); + } // for neighbors of I within cutoff: // compute dUi/drj and dBi/drj @@ -626,8 +634,6 @@ void PairSNAP::compute_optimized(int eflag, int vflag) // quadratic contributions if (quadraticflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); int k = ncoeff+1; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { double bveci = sna[tid]->bvec[icoeff]; @@ -677,8 +683,10 @@ void PairSNAP::compute_optimized(int eflag, int vflag) if (eflag&&pairs[iijj][1] == 0) { evdwl = coeffi[0]; - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); + if (!quadraticflag) { + sna[tid]->compute_bi(); + sna[tid]->copy_bi2bvec(); + } // E = beta.B + 0.5*B^t.alpha.B // coeff[k] = beta[k-1] or @@ -1520,9 +1528,9 @@ void PairSNAP::coeff(int narg, char **arg) sna[tid]->grow_rij(nmax); } - printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); - if (ncoeff != sna[0]->ncoeff) { + if (comm->me == 0) printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); + if (ncoeff != sna[0]->ncoeff) { error->all(FLERR,"Incorrect SNAP parameter file"); } diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 9dec211e8e..e0d7c45063 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -28,22 +28,25 @@ class PairSNAP : public Pair { public: PairSNAP(class LAMMPS *); ~PairSNAP(); - void compute(int, int); + virtual void compute(int, int); void compute_regular(int, int); void compute_optimized(int, int); void settings(int, char **); - void coeff(int, char **); - void init_style(); - double init_one(int, int); - double memory_usage(); + virtual void coeff(int, char **); + virtual void init_style(); + virtual double init_one(int, int); + virtual double memory_usage(); + + double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 + int ncoeff; // compiler bug, manifest in KOKKOS package protected: - int ncoeff, ncoeffq, ncoeffall; + int ncoeffq, ncoeffall; double **bvec, ***dbvec; class SNA** sna; int nmax; int nthreads; - void allocate(); + virtual void allocate(); void read_files(char *, char *); inline int equal(double* x,double* y); inline double dist2(double* x,double* y); @@ -97,8 +100,8 @@ protected: double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients int *map; // mapping from atom types to elements - int twojmax, diagonalstyle, switchflag, bzeroflag, quadraticflag; - double rcutfac, rfac0, rmin0, wj1, wj2; + int twojmax, diagonalstyle, switchflag, bzeroflag; + double rfac0, rmin0, wj1, wj2; int rcutfacflag, twojmaxflag; // flags for required parameters }; diff --git a/src/USER-ATC/Install.sh b/src/USER-ATC/Install.sh index f719fe220f..f241f92065 100755 --- a/src/USER-ATC/Install.sh +++ b/src/USER-ATC/Install.sh @@ -26,6 +26,16 @@ action () { fi } +# ATC library has a reference to PairEAM, so we must +# require the MANYBODY package to be installed. + +if (test $1 = 1) then + if (test ! -e ../pair_eam.cpp) then + echo "Must install MANYBODY package with USER-ATC" + exit 1 + fi +fi + # all package files with no dependencies for file in *.cpp *.h; do diff --git a/src/USER-CGDNA/pair_oxdna_hbond.cpp b/src/USER-CGDNA/pair_oxdna_hbond.cpp index 96f86d6059..99f490f3fb 100644 --- a/src/USER-CGDNA/pair_oxdna_hbond.cpp +++ b/src/USER-CGDNA/pair_oxdna_hbond.cpp @@ -38,6 +38,14 @@ using namespace LAMMPS_NS; using namespace MathConst; using namespace MFOxdna; +// sequence-specific base-pairing strength +// A:0 C:1 G:2 T:3, 5'- (i,j) -3' +static const double alpha[4][4] = +{{1.00000,1.00000,1.00000,0.82915}, + {1.00000,1.00000,1.15413,1.00000}, + {1.00000,1.15413,1.00000,1.00000}, + {0.82915,1.00000,1.00000,1.00000}}; + /* ---------------------------------------------------------------------- */ PairOxdnaHbond::PairOxdnaHbond(LAMMPS *lmp) : Pair(lmp) @@ -607,7 +615,7 @@ void PairOxdnaHbond::coeff(int narg, char **arg) { int count; - if (narg != 26) error->all(FLERR,"Incorrect args for pair coefficients in oxdna/hbond"); + if (narg != 27) error->all(FLERR,"Incorrect args for pair coefficients in oxdna/hbond"); if (!allocated) allocate(); int ilo,ihi,jlo,jhi; @@ -638,36 +646,42 @@ void PairOxdnaHbond::coeff(int narg, char **arg) double a_hb8_one, theta_hb8_0_one, dtheta_hb8_ast_one; double b_hb8_one, dtheta_hb8_c_one; - epsilon_hb_one = force->numeric(FLERR,arg[2]); - a_hb_one = force->numeric(FLERR,arg[3]); - cut_hb_0_one = force->numeric(FLERR,arg[4]); - cut_hb_c_one = force->numeric(FLERR,arg[5]); - cut_hb_lo_one = force->numeric(FLERR,arg[6]); - cut_hb_hi_one = force->numeric(FLERR,arg[7]); + if (strcmp(arg[2], "seqav") != 0 && strcmp(arg[2], "seqdep") != 0) { + error->all(FLERR,"Incorrect setting, select seqav or seqdep in oxdna/hbond"); + } + if (strcmp(arg[2],"seqav") == 0) seqdepflag = 0; + if (strcmp(arg[2],"seqdep") == 0) seqdepflag = 1; - a_hb1_one = force->numeric(FLERR,arg[8]); - theta_hb1_0_one = force->numeric(FLERR,arg[9]); - dtheta_hb1_ast_one = force->numeric(FLERR,arg[10]); + epsilon_hb_one = force->numeric(FLERR,arg[3]); + a_hb_one = force->numeric(FLERR,arg[4]); + cut_hb_0_one = force->numeric(FLERR,arg[5]); + cut_hb_c_one = force->numeric(FLERR,arg[6]); + cut_hb_lo_one = force->numeric(FLERR,arg[7]); + cut_hb_hi_one = force->numeric(FLERR,arg[8]); - a_hb2_one = force->numeric(FLERR,arg[11]); - theta_hb2_0_one = force->numeric(FLERR,arg[12]); - dtheta_hb2_ast_one = force->numeric(FLERR,arg[13]); + a_hb1_one = force->numeric(FLERR,arg[9]); + theta_hb1_0_one = force->numeric(FLERR,arg[10]); + dtheta_hb1_ast_one = force->numeric(FLERR,arg[11]); - a_hb3_one = force->numeric(FLERR,arg[14]); - theta_hb3_0_one = force->numeric(FLERR,arg[15]); - dtheta_hb3_ast_one = force->numeric(FLERR,arg[16]); + a_hb2_one = force->numeric(FLERR,arg[12]); + theta_hb2_0_one = force->numeric(FLERR,arg[13]); + dtheta_hb2_ast_one = force->numeric(FLERR,arg[14]); - a_hb4_one = force->numeric(FLERR,arg[17]); - theta_hb4_0_one = force->numeric(FLERR,arg[18]); - dtheta_hb4_ast_one = force->numeric(FLERR,arg[19]); + a_hb3_one = force->numeric(FLERR,arg[15]); + theta_hb3_0_one = force->numeric(FLERR,arg[16]); + dtheta_hb3_ast_one = force->numeric(FLERR,arg[17]); - a_hb7_one = force->numeric(FLERR,arg[20]); - theta_hb7_0_one = force->numeric(FLERR,arg[21]); - dtheta_hb7_ast_one = force->numeric(FLERR,arg[22]); + a_hb4_one = force->numeric(FLERR,arg[18]); + theta_hb4_0_one = force->numeric(FLERR,arg[19]); + dtheta_hb4_ast_one = force->numeric(FLERR,arg[20]); - a_hb8_one = force->numeric(FLERR,arg[23]); - theta_hb8_0_one = force->numeric(FLERR,arg[24]); - dtheta_hb8_ast_one = force->numeric(FLERR,arg[25]); + a_hb7_one = force->numeric(FLERR,arg[21]); + theta_hb7_0_one = force->numeric(FLERR,arg[22]); + dtheta_hb7_ast_one = force->numeric(FLERR,arg[23]); + + a_hb8_one = force->numeric(FLERR,arg[24]); + theta_hb8_0_one = force->numeric(FLERR,arg[25]); + dtheta_hb8_ast_one = force->numeric(FLERR,arg[26]); b_hb_lo_one = 2*a_hb_one*exp(-a_hb_one*(cut_hb_lo_one-cut_hb_0_one))* 2*a_hb_one*exp(-a_hb_one*(cut_hb_lo_one-cut_hb_0_one))* @@ -718,6 +732,7 @@ void PairOxdnaHbond::coeff(int narg, char **arg) for (int j = MAX(jlo,i); j <= jhi; j++) { epsilon_hb[i][j] = epsilon_hb_one; + if (seqdepflag) epsilon_hb[i][j] *= alpha[i-1][j-1]; a_hb[i][j] = a_hb_one; cut_hb_0[i][j] = cut_hb_0_one; cut_hb_c[i][j] = cut_hb_c_one; @@ -728,6 +743,7 @@ void PairOxdnaHbond::coeff(int narg, char **arg) b_hb_lo[i][j] = b_hb_lo_one; b_hb_hi[i][j] = b_hb_hi_one; shift_hb[i][j] = shift_hb_one; + if (seqdepflag) shift_hb[i][j] *= alpha[i-1][j-1]; a_hb1[i][j] = a_hb1_one; theta_hb1_0[i][j] = theta_hb1_0_one; @@ -814,7 +830,12 @@ double PairOxdnaHbond::init_one(int i, int j) error->all(FLERR,"Offset not supported in oxDNA"); } - epsilon_hb[j][i] = epsilon_hb[i][j]; + if (seqdepflag) { + epsilon_hb[j][i] = epsilon_hb[i][j] / alpha[i-1][j-1] * alpha[j-1][i-1]; + } + else { + epsilon_hb[j][i] = epsilon_hb[i][j]; + } a_hb[j][i] = a_hb[i][j]; cut_hb_0[j][i] = cut_hb_0[i][j]; cut_hb_c[j][i] = cut_hb_c[i][j]; @@ -824,7 +845,12 @@ double PairOxdnaHbond::init_one(int i, int j) b_hb_hi[j][i] = b_hb_hi[i][j]; cut_hb_lc[j][i] = cut_hb_lc[i][j]; cut_hb_hc[j][i] = cut_hb_hc[i][j]; - shift_hb[j][i] = shift_hb[i][j]; + if (seqdepflag) { + shift_hb[j][i] = shift_hb[i][j] / alpha[i-1][j-1] * alpha[j-1][i-1]; + } + else { + shift_hb[j][i] = shift_hb[i][j]; + } a_hb1[j][i] = a_hb1[i][j]; theta_hb1_0[j][i] = theta_hb1_0[i][j]; diff --git a/src/USER-CGDNA/pair_oxdna_hbond.h b/src/USER-CGDNA/pair_oxdna_hbond.h index 1c9f37bf50..028853a087 100644 --- a/src/USER-CGDNA/pair_oxdna_hbond.h +++ b/src/USER-CGDNA/pair_oxdna_hbond.h @@ -67,6 +67,8 @@ class PairOxdnaHbond : public Pair { double **a_hb8, **theta_hb8_0, **dtheta_hb8_ast; double **b_hb8, **dtheta_hb8_c; + int seqdepflag; + virtual void allocate(); }; diff --git a/src/USER-CGDNA/pair_oxdna_stk.cpp b/src/USER-CGDNA/pair_oxdna_stk.cpp index 9a5779afad..9c3a11b9b7 100644 --- a/src/USER-CGDNA/pair_oxdna_stk.cpp +++ b/src/USER-CGDNA/pair_oxdna_stk.cpp @@ -38,6 +38,14 @@ using namespace LAMMPS_NS; using namespace MathConst; using namespace MFOxdna; +// sequence-specific stacking strength +// A:0 C:1 G:2 T:3, 5'- (i,j) -3' +static const double alpha[4][4] = +{{1.11960,1.00852,0.96950,0.99632}, + {1.01889,0.97804,1.02681,0.96950}, + {0.98169,1.05913,0.97804,1.00852}, + {0.94694,0.98169,1.01889,0.96383}}; + /* ---------------------------------------------------------------------- */ PairOxdnaStk::PairOxdnaStk(LAMMPS *lmp) : Pair(lmp) @@ -194,6 +202,7 @@ void PairOxdnaStk::compute(int eflag, int vflag) } + // a now in 5' direction, b in 3' direction atype = type[a]; btype = type[b]; @@ -665,7 +674,7 @@ void PairOxdnaStk::coeff(int narg, char **arg) { int count; - if (narg != 21) error->all(FLERR,"Incorrect args for pair coefficients in oxdna/stk"); + if (narg != 22) error->all(FLERR,"Incorrect args for pair coefficients in oxdna/stk"); if (!allocated) allocate(); int ilo,ihi,jlo,jhi; @@ -691,28 +700,34 @@ void PairOxdnaStk::coeff(int narg, char **arg) double a_st1_one, cosphi_st1_ast_one, b_st1_one, cosphi_st1_c_one; double a_st2_one, cosphi_st2_ast_one, b_st2_one, cosphi_st2_c_one; - T = force->numeric(FLERR,arg[2]); + if (strcmp(arg[2], "seqav") != 0 && strcmp(arg[2], "seqdep") != 0) { + error->all(FLERR,"Incorrect setting, select seqav or seqdep in oxdna/stk"); + } + if (strcmp(arg[2],"seqav") == 0) seqdepflag = 0; + if (strcmp(arg[2],"seqdep") == 0) seqdepflag = 1; + + T = force->numeric(FLERR,arg[3]); epsilon_st_one = stacking_strength(T); - a_st_one = force->numeric(FLERR,arg[3]); - cut_st_0_one = force->numeric(FLERR,arg[4]); - cut_st_c_one = force->numeric(FLERR,arg[5]); - cut_st_lo_one = force->numeric(FLERR,arg[6]); - cut_st_hi_one = force->numeric(FLERR,arg[7]); + a_st_one = force->numeric(FLERR,arg[4]); + cut_st_0_one = force->numeric(FLERR,arg[5]); + cut_st_c_one = force->numeric(FLERR,arg[6]); + cut_st_lo_one = force->numeric(FLERR,arg[7]); + cut_st_hi_one = force->numeric(FLERR,arg[8]); - a_st4_one = force->numeric(FLERR,arg[8]); - theta_st4_0_one = force->numeric(FLERR,arg[9]); - dtheta_st4_ast_one = force->numeric(FLERR,arg[10]); - a_st5_one = force->numeric(FLERR,arg[11]); - theta_st5_0_one = force->numeric(FLERR,arg[12]); - dtheta_st5_ast_one = force->numeric(FLERR,arg[13]); - a_st6_one = force->numeric(FLERR,arg[14]); - theta_st6_0_one = force->numeric(FLERR,arg[15]); - dtheta_st6_ast_one = force->numeric(FLERR,arg[16]); - a_st1_one = force->numeric(FLERR,arg[17]); - cosphi_st1_ast_one = force->numeric(FLERR,arg[18]); - a_st2_one = force->numeric(FLERR,arg[19]); - cosphi_st2_ast_one = force->numeric(FLERR,arg[20]); + a_st4_one = force->numeric(FLERR,arg[9]); + theta_st4_0_one = force->numeric(FLERR,arg[10]); + dtheta_st4_ast_one = force->numeric(FLERR,arg[11]); + a_st5_one = force->numeric(FLERR,arg[12]); + theta_st5_0_one = force->numeric(FLERR,arg[13]); + dtheta_st5_ast_one = force->numeric(FLERR,arg[14]); + a_st6_one = force->numeric(FLERR,arg[15]); + theta_st6_0_one = force->numeric(FLERR,arg[16]); + dtheta_st6_ast_one = force->numeric(FLERR,arg[17]); + a_st1_one = force->numeric(FLERR,arg[18]); + cosphi_st1_ast_one = force->numeric(FLERR,arg[19]); + a_st2_one = force->numeric(FLERR,arg[20]); + cosphi_st2_ast_one = force->numeric(FLERR,arg[21]); b_st_lo_one = 2*a_st_one*exp(-a_st_one*(cut_st_lo_one-cut_st_0_one))* 2*a_st_one*exp(-a_st_one*(cut_st_lo_one-cut_st_0_one))* @@ -756,11 +771,11 @@ void PairOxdnaStk::coeff(int narg, char **arg) b_st2_one = a_st2_one*a_st2_one*cosphi_st2_ast_one*cosphi_st2_ast_one/(1-a_st2_one*cosphi_st2_ast_one*cosphi_st2_ast_one); cosphi_st2_c_one=1/(a_st2_one*cosphi_st2_ast_one); - for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { epsilon_st[i][j] = epsilon_st_one; + if (seqdepflag) epsilon_st[i][j] *= alpha[i-1][j-1]; a_st[i][j] = a_st_one; cut_st_0[i][j] = cut_st_0_one; cut_st_c[i][j] = cut_st_c_one; @@ -771,6 +786,7 @@ void PairOxdnaStk::coeff(int narg, char **arg) b_st_lo[i][j] = b_st_lo_one; b_st_hi[i][j] = b_st_hi_one; shift_st[i][j] = shift_st_one; + if (seqdepflag) shift_st[i][j] *= alpha[i-1][j-1]; a_st4[i][j] = a_st4_one; theta_st4_0[i][j] = theta_st4_0_one; @@ -849,7 +865,12 @@ double PairOxdnaStk::init_one(int i, int j) error->all(FLERR,"Offset not supported in oxDNA"); } - epsilon_st[j][i] = epsilon_st[i][j]; + if (seqdepflag) { + epsilon_st[j][i] = epsilon_st[i][j] / alpha[i-1][j-1] * alpha[j-1][i-1]; + } + else { + epsilon_st[j][i] = epsilon_st[i][j]; + } a_st[j][i] = a_st[i][j]; b_st_lo[j][i] = b_st_lo[i][j]; b_st_hi[j][i] = b_st_hi[i][j]; @@ -859,7 +880,12 @@ double PairOxdnaStk::init_one(int i, int j) cut_st_hi[j][i] = cut_st_hi[i][j]; cut_st_lc[j][i] = cut_st_lc[i][j]; cut_st_hc[j][i] = cut_st_hc[i][j]; - shift_st[j][i] = shift_st[i][j]; + if (seqdepflag) { + shift_st[j][i] = shift_st[i][j] / alpha[i-1][j-1] * alpha[j-1][i-1]; + } + else { + shift_st[j][i] = shift_st[i][j]; + } a_st4[j][i] = a_st4[i][j]; theta_st4_0[j][i] = theta_st4_0[i][j]; diff --git a/src/USER-CGDNA/pair_oxdna_stk.h b/src/USER-CGDNA/pair_oxdna_stk.h index 950c276228..74a9a6bf68 100644 --- a/src/USER-CGDNA/pair_oxdna_stk.h +++ b/src/USER-CGDNA/pair_oxdna_stk.h @@ -58,6 +58,8 @@ class PairOxdnaStk : public Pair { double **a_st1, **cosphi_st1_ast, **b_st1, **cosphi_st1_c; double **a_st2, **cosphi_st2_ast, **b_st2, **cosphi_st2_c; + int seqdepflag; + virtual void allocate(); }; diff --git a/src/USER-COLVARS/colvarproxy_lammps.cpp b/src/USER-COLVARS/colvarproxy_lammps.cpp index 17dff30567..c5b9e5a60c 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.cpp +++ b/src/USER-COLVARS/colvarproxy_lammps.cpp @@ -120,12 +120,6 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp, if (restart_output_prefix_str.rfind(".*") != std::string::npos) restart_output_prefix_str.erase(restart_output_prefix_str.rfind(".*"),2); -#if defined(_OPENMP) - if (smp_thread_id() == 0) { - omp_init_lock(&smp_lock_state); - } -#endif - // initialize multi-replica support, if available if (replica_enabled()) { MPI_Comm_rank(inter_comm, &inter_me); @@ -143,7 +137,7 @@ void colvarproxy_lammps::init(const char *conf_file) colvars = new colvarmodule(this); cvm::log("Using LAMMPS interface, version "+ - cvm::to_str(COLVARPROXY_VERSION)+".\n"); + cvm::to_str(COLVARPROXY_VERSION)+".\n"); my_angstrom = _lmp->force->angstrom; my_boltzmann = _lmp->force->boltz; @@ -155,7 +149,8 @@ void colvarproxy_lammps::init(const char *conf_file) colvars->setup_output(); if (_lmp->update->ntimestep != 0) { - cvm::log("Initializing step number as firstTimestep.\n"); + cvm::log("Setting initial step number from LAMMPS: "+ + cvm::to_str(_lmp->update->ntimestep)+"\n"); colvars->it = colvars->it_restart = _lmp->update->ntimestep; } @@ -172,7 +167,6 @@ colvarproxy_lammps::~colvarproxy_lammps() { delete _random; if (colvars != NULL) { - colvars->write_output_files(); delete colvars; colvars = NULL; } @@ -188,10 +182,18 @@ int colvarproxy_lammps::setup() // trigger colvars computation double colvarproxy_lammps::compute() { + if (cvm::debug()) { + log(std::string(cvm::line_marker)+ + "colvarproxy_lammps step no. "+ + cvm::to_str(_lmp->update->ntimestep)+" [first - last = "+ + cvm::to_str(_lmp->update->beginstep)+" - "+ + cvm::to_str(_lmp->update->endstep)+"]\n"); + } + if (first_timestep) { first_timestep = false; } else { - // Use the time step number inherited from LAMMPS + // Use the time step number from LAMMPS Update object if ( _lmp->update->ntimestep - previous_step == 1 ) colvars->it++; // Other cases could mean: @@ -241,6 +243,13 @@ void colvarproxy_lammps::serialize_status(std::string &rst) rst = os.str(); } +void colvarproxy_lammps::write_output_files() +{ + // TODO skip output if undefined + colvars->write_restart_file(cvm::output_prefix()+".colvars.state"); + colvars->write_output_files(); +} + // set status from string bool colvarproxy_lammps::deserialize_status(std::string &rst) { @@ -331,89 +340,6 @@ int colvarproxy_lammps::backup_file(char const *filename) } -#if defined(_OPENMP) - - -// SMP support - -int colvarproxy_lammps::smp_enabled() -{ - if (b_smp_active) { - return COLVARS_OK; - } - return COLVARS_ERROR; -} - - -int colvarproxy_lammps::smp_colvars_loop() -{ - colvarmodule *cv = this->colvars; - colvarproxy_lammps *proxy = (colvarproxy_lammps *) cv->proxy; -#pragma omp parallel for - for (size_t i = 0; i < cv->variables_active_smp()->size(); i++) { - colvar *x = (*(cv->variables_active_smp()))[i]; - int x_item = (*(cv->variables_active_smp_items()))[i]; - if (cvm::debug()) { - cvm::log("["+cvm::to_str(proxy->smp_thread_id())+"/"+cvm::to_str(proxy->smp_num_threads())+ - "]: calc_colvars_items_smp(), i = "+cvm::to_str(i)+", cv = "+ - x->name+", cvc = "+cvm::to_str(x_item)+"\n"); - } - x->calc_cvcs(x_item, 1); - } - return cvm::get_error(); -} - - -int colvarproxy_lammps::smp_biases_loop() -{ - colvarmodule *cv = this->colvars; -#pragma omp parallel for - for (size_t i = 0; i < cv->biases_active()->size(); i++) { - colvarbias *b = (*(cv->biases_active()))[i]; - if (cvm::debug()) { - cvm::log("Calculating bias \""+b->name+"\" on thread "+ - cvm::to_str(smp_thread_id())+"\n"); - } - b->update(); - } - return cvm::get_error(); -} - - -int colvarproxy_lammps::smp_thread_id() -{ - return omp_get_thread_num(); -} - - -int colvarproxy_lammps::smp_num_threads() -{ - return omp_get_max_threads(); -} - - -int colvarproxy_lammps::smp_lock() -{ - omp_set_lock(&smp_lock_state); - return COLVARS_OK; -} - - -int colvarproxy_lammps::smp_trylock() -{ - return omp_test_lock(&smp_lock_state) ? COLVARS_OK : COLVARS_ERROR; -} - - -int colvarproxy_lammps::smp_unlock() -{ - omp_unset_lock(&smp_lock_state); - return COLVARS_OK; -} - -#endif - - // multi-replica support void colvarproxy_lammps::replica_comm_barrier() { diff --git a/src/USER-COLVARS/colvarproxy_lammps.h b/src/USER-COLVARS/colvarproxy_lammps.h index 6cdf0edfe8..af2aa04dfc 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.h +++ b/src/USER-COLVARS/colvarproxy_lammps.h @@ -25,10 +25,6 @@ #include #include -#if defined(_OPENMP) -#include -#endif - /* struct for packed data communication of coordinates and forces. */ struct commdata { int tag,type; @@ -91,7 +87,8 @@ class colvarproxy_lammps : public colvarproxy { // methods for lammps to move data or trigger actions in the proxy public: void set_temperature(double t) { t_target = t; }; - bool total_forces_enabled() const { return total_force_requested; }; + bool total_forces_enabled() const { return total_force_requested; }; + bool total_forces_same_step() const { return true; }; bool want_exit() const { return do_exit; }; // perform colvars computation. returns biasing energy @@ -103,6 +100,10 @@ class colvarproxy_lammps : public colvarproxy { // set status from string bool deserialize_status(std::string &); + // Write files expected from Colvars (called by post_run()) + void write_output_files(); + + // implementation of pure methods from base class public: @@ -140,21 +141,6 @@ class colvarproxy_lammps : public colvarproxy { // implementation of optional methods from base class public: -#if defined(_OPENMP) - // SMP support - int smp_enabled(); - int smp_colvars_loop(); - int smp_biases_loop(); - int smp_thread_id(); - int smp_num_threads(); -protected: - omp_lock_t smp_lock_state; -public: - int smp_lock(); - int smp_trylock(); - int smp_unlock(); -#endif - // Multi-replica support // Indicate if multi-replica support is available and active virtual bool replica_enabled() { return (inter_comm != MPI_COMM_NULL); } diff --git a/src/USER-COLVARS/colvarproxy_lammps_version.h b/src/USER-COLVARS/colvarproxy_lammps_version.h index 834bd1748a..79f77dad4e 100644 --- a/src/USER-COLVARS/colvarproxy_lammps_version.h +++ b/src/USER-COLVARS/colvarproxy_lammps_version.h @@ -1,5 +1,5 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2017-07-15" +#define COLVARPROXY_VERSION "2017-12-01" // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars diff --git a/src/USER-COLVARS/fix_colvars.cpp b/src/USER-COLVARS/fix_colvars.cpp index 59e6c46b76..956ba6498a 100644 --- a/src/USER-COLVARS/fix_colvars.cpp +++ b/src/USER-COLVARS/fix_colvars.cpp @@ -379,6 +379,7 @@ int FixColvars::setmask() mask |= POST_FORCE; mask |= POST_FORCE_RESPA; mask |= END_OF_STEP; + mask |= POST_RUN; return mask; } @@ -913,6 +914,7 @@ void FixColvars::write_restart(FILE *fp) if (me == 0) { std::string rest_text(""); proxy->serialize_status(rest_text); + // TODO call write_output_files() const char *cvm_state = rest_text.c_str(); int len = strlen(cvm_state) + 1; // need to include terminating NULL byte. fwrite(&len,sizeof(int),1,fp); @@ -934,6 +936,15 @@ void FixColvars::restart(char *buf) /* ---------------------------------------------------------------------- */ +void FixColvars::post_run() +{ + if (me == 0) { + proxy->write_output_files(); + } +} + +/* ---------------------------------------------------------------------- */ + double FixColvars::compute_scalar() { return energy; diff --git a/src/USER-COLVARS/fix_colvars.h b/src/USER-COLVARS/fix_colvars.h index c00b18aa46..509eca5de3 100644 --- a/src/USER-COLVARS/fix_colvars.h +++ b/src/USER-COLVARS/fix_colvars.h @@ -56,6 +56,7 @@ class FixColvars : public Fix { virtual void post_force(int); virtual void post_force_respa(int, int, int); virtual void end_of_step(); + virtual void post_run(); virtual double compute_scalar(); virtual double memory_usage(); diff --git a/src/USER-DPD/fix_dpd_energy.cpp b/src/USER-DPD/fix_dpd_energy.cpp index 05907a5fcf..475e12f02f 100644 --- a/src/USER-DPD/fix_dpd_energy.cpp +++ b/src/USER-DPD/fix_dpd_energy.cpp @@ -34,6 +34,8 @@ FixDPDenergy::FixDPDenergy(LAMMPS *lmp, int narg, char **arg) : pairDPDE = NULL; pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy",1); + if (pairDPDE == NULL) + pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy/kk",1); if (pairDPDE == NULL) error->all(FLERR,"Must use pair_style dpd/fdt/energy with fix dpd/energy"); diff --git a/src/USER-DPD/fix_eos_table_rx.cpp b/src/USER-DPD/fix_eos_table_rx.cpp index b90c39ed4e..c9a705446a 100644 --- a/src/USER-DPD/fix_eos_table_rx.cpp +++ b/src/USER-DPD/fix_eos_table_rx.cpp @@ -150,6 +150,8 @@ FixEOStableRX::FixEOStableRX(LAMMPS *lmp, int narg, char **arg) : FixEOStableRX::~FixEOStableRX() { + if (copymode) return; + for (int m = 0; m < ntables; m++) { free_table(&tables[m]); free_table(&tables2[m]); diff --git a/src/USER-DPD/fix_rx.cpp b/src/USER-DPD/fix_rx.cpp index 82bb44a24d..0d0ec2a75b 100644 --- a/src/USER-DPD/fix_rx.cpp +++ b/src/USER-DPD/fix_rx.cpp @@ -220,6 +220,9 @@ FixRX::FixRX(LAMMPS *lmp, int narg, char **arg) : FixRX::~FixRX() { + //printf("Inside FixRX::~FixRX copymode= %d\n", copymode); + if (copymode) return; + // De-Allocate memory to prevent memory leak for (int ii = 0; ii < nreactions; ii++){ delete [] stoich[ii]; @@ -370,11 +373,11 @@ void FixRX::post_constructor() newarg2[nspecies+3] = (char *) "ghost"; newarg2[nspecies+4] = (char *) "yes"; - modify->add_fix(nspecies+5,newarg); + modify->add_fix(nspecies+5,newarg,1); fix_species = (FixPropertyAtom *) modify->fix[modify->nfix-1]; restartFlag = modify->fix[modify->nfix-1]->restart_reset; - modify->add_fix(nspecies+5,newarg2); + modify->add_fix(nspecies+5,newarg2,1); fix_species_old = (FixPropertyAtom *) modify->fix[modify->nfix-1]; if(nspecies==0) error->all(FLERR,"There are no rx species specified."); @@ -634,6 +637,9 @@ int FixRX::setmask() void FixRX::init() { pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy",1); + if (pairDPDE == NULL) + pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy/kk",1); + if (pairDPDE == NULL) error->all(FLERR,"Must use pair_style dpd/fdt/energy with fix rx"); @@ -669,7 +675,17 @@ void FixRX::setup_pre_force(int vflag) if(restartFlag){ restartFlag = 0; - } else { + } + else + { + int ode_counter[4] = {0}; + + UserRHSData userData; + userData.kFor = new double[nreactions]; + userData.rxnRateLaw = new double[nreactions]; + + double *rwork = new double[8*nspecies]; + if(localTempFlag){ int count = nlocal + (newton_pair ? nghost : 0); dpdThetaLocal = new double[count]; @@ -682,22 +698,27 @@ void FixRX::setup_pre_force(int vflag) tmp = atom->dvector[ispecies][id]; atom->dvector[ispecies+nspecies][id] = tmp; } + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit){ // Set the reaction rate constants to zero: no reactions occur at step 0 for(int irxn=0;irxnforward_comm_fix(this); if(localTempFlag) delete [] dpdThetaLocal; + + delete [] userData.kFor; + delete [] userData.rxnRateLaw; + delete [] rwork; } } @@ -705,12 +726,13 @@ void FixRX::setup_pre_force(int vflag) void FixRX::pre_force(int vflag) { + TimerType timer_start = getTimeStamp(); + int nlocal = atom->nlocal; int nghost = atom->nghost; int *mask = atom->mask; double *dpdTheta = atom->dpdTheta; int newton_pair = force->newton_pair; - double theta; if(localTempFlag){ int count = nlocal + (newton_pair ? nghost : 0); @@ -722,7 +744,10 @@ void FixRX::pre_force(int vflag) TimerType timer_localTemperature = getTimeStamp(); // Zero the counters for the ODE solvers. - this->nSteps = this->nIters = this->nFuncs = this->nFails = 0; + int nSteps = 0; + int nIters = 0; + int nFuncs = 0; + int nFails = 0; if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency == 1) { @@ -730,35 +755,66 @@ void FixRX::pre_force(int vflag) memory->create( diagnosticCounterPerODE[FuncSum], nlocal, "FixRX::diagnosticCounterPerODE"); } - double *rwork = new double[8*nspecies + nreactions]; + //#pragma omp parallel \ + // reduction(+: nSteps, nIters, nFuncs, nFails ) + { + double *rwork = new double[8*nspecies]; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit){ - if (localTempFlag) - theta = dpdThetaLocal[i]; - else - theta = dpdTheta[i]; + UserRHSData userData; + userData.kFor = new double[nreactions]; + userData.rxnRateLaw = new double[nreactions]; - //Compute the reaction rate constants - for (int irxn = 0; irxn < nreactions; irxn++) - kR[irxn] = Arr[irxn]*pow(theta,nArr[irxn])*exp(-Ea[irxn]/force->boltz/theta); + int ode_counter[4] = { 0 }; - if (odeIntegrationFlag == ODE_LAMMPS_RK4) - rk4(i,rwork); - else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) - rkf45(i,rwork); + //#pragma omp for schedule(runtime) + for (int i = 0; i < nlocal; i++) + { + if (mask[i] & groupbit) + { + double theta; + if (localTempFlag) + theta = dpdThetaLocal[i]; + else + theta = dpdTheta[i]; + + //Compute the reaction rate constants + for (int irxn = 0; irxn < nreactions; irxn++) + userData.kFor[irxn] = Arr[irxn]*pow(theta,nArr[irxn])*exp(-Ea[irxn]/force->boltz/theta); + + if (odeIntegrationFlag == ODE_LAMMPS_RK4) + rk4(i, rwork, &userData); + else if (odeIntegrationFlag == ODE_LAMMPS_RKF45) + rkf45(i, rwork, &userData, ode_counter); + } } - TimerType timer_ODE = getTimeStamp(); + nSteps += ode_counter[0]; + nIters += ode_counter[1]; + nFuncs += ode_counter[2]; + nFails += ode_counter[3]; - delete [] rwork; + delete [] rwork; + delete [] userData.kFor; + delete [] userData.rxnRateLaw; + + } // end parallel region + + TimerType timer_ODE = getTimeStamp(); // Communicate the updated momenta and velocities to all nodes comm->forward_comm_fix(this); if(localTempFlag) delete [] dpdThetaLocal; + TimerType timer_stop = getTimeStamp(); + double time_ODE = getElapsedTime(timer_localTemperature, timer_ODE); + //printf("me= %d total= %g temp= %g ode= %g comm= %g nlocal= %d nfc= %d %d\n", comm->me, + // getElapsedTime(timer_start, timer_stop), + // getElapsedTime(timer_start, timer_localTemperature), + // getElapsedTime(timer_localTemperature, timer_ODE), + // getElapsedTime(timer_ODE, timer_stop), nlocal, nFuncs, nSteps); + // Warn the user if a failure was detected in the ODE solver. if (nFails > 0){ char sbuf[128]; @@ -954,21 +1010,15 @@ void FixRX::setupParams() /* ---------------------------------------------------------------------- */ -void FixRX::rk4(int id, double *rwork) +void FixRX::rk4(int id, double *rwork, void* v_params) { - double *k1 = NULL; - if (rwork == NULL) - k1 = new double[6*nspecies + nreactions]; - else - k1 = rwork; + double *k1 = rwork; double *k2 = k1 + nspecies; double *k3 = k2 + nspecies; double *k4 = k3 + nspecies; double *y = k4 + nspecies; double *yp = y + nspecies; - double *dummyArray = yp + nspecies; // Passed to the rhs function. - const int numSteps = minSteps; const double h = update->dt / double(numSteps); @@ -985,25 +1035,25 @@ void FixRX::rk4(int id, double *rwork) for (int step = 0; step < numSteps; step++) { // k1 - rhs(0.0,y,k1,dummyArray); + rhs(0.0,y,k1,v_params); // k2 for (int ispecies = 0; ispecies < nspecies; ispecies++) yp[ispecies] = y[ispecies] + 0.5*h*k1[ispecies]; - rhs(0.0,yp,k2,dummyArray); + rhs(0.0,yp,k2,v_params); // k3 for (int ispecies = 0; ispecies < nspecies; ispecies++) yp[ispecies] = y[ispecies] + 0.5*h*k2[ispecies]; - rhs(0.0,yp,k3,dummyArray); + rhs(0.0,yp,k3,v_params); // k4 for (int ispecies = 0; ispecies < nspecies; ispecies++) yp[ispecies] = y[ispecies] + h*k3[ispecies]; - rhs(0.0,yp,k4,dummyArray); + rhs(0.0,yp,k4,v_params); for (int ispecies = 0; ispecies < nspecies; ispecies++) y[ispecies] += h*(k1[ispecies]/6.0 + k2[ispecies]/3.0 + k3[ispecies]/3.0 + k4[ispecies]/6.0); @@ -1018,9 +1068,6 @@ void FixRX::rk4(int id, double *rwork) y[ispecies] = 0.0; atom->dvector[ispecies][id] = y[ispecies]; } - - if (rwork == NULL) - delete [] k1; } /* ---------------------------------------------------------------------- */ @@ -1270,6 +1317,78 @@ void FixRX::odeDiagnostics(void) double max_per_proc[numCounters]; double min_per_proc[numCounters]; + if(1) + { + static bool firstStep = true; + + static TimerType oldTimeStamp (-1); + + TimerType now = getTimeStamp(); + + // Query the fix database and look for rx_weight for the balance fix. + int type_flag = -1; + int rx_weight_index = atom->find_custom( "rx_weight", /*0:int, 1:float*/ type_flag ); + + // Compute the average # of neighbors. + double averageNumNeighbors = 0; + { + const int inum = pairDPDE->list->inum; + const int* ilist = pairDPDE->list->ilist; + const int* numneigh = pairDPDE->list->numneigh; + + for (int ii = 0; ii < inum; ++ii) + { + const int i = ilist[ii]; + averageNumNeighbors += numneigh[i]; + } + + averageNumNeighbors /= inum; + } + + printf("me= %d nst= %g nfc= %g time= %g nlocal= %g lmpnst= %g weight_idx= %d 1st= %d aveNeigh= %g\n", comm->me, this->diagnosticCounter[0], this->diagnosticCounter[1], this->diagnosticCounter[2], this->diagnosticCounter[3], this->diagnosticCounter[4], rx_weight_index, firstStep, averageNumNeighbors); + + if (rx_weight_index != -1 && !firstStep && 0) + { + double *rx_weight = atom->dvector[rx_weight_index]; + + const int nlocal = atom->nlocal; + const int *mask = atom->mask; + + if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency == 1) + { + const double total_time = getElapsedTime( oldTimeStamp, now ); + const double fixrx_time = this->diagnosticCounter[TimeSum]; + const double time_ratio = fixrx_time / total_time; + + double tsum = 0.0; + double tmin = 100000, tmax = 0; + for (int i = 0; i < nlocal; ++i) + if (mask[i] & groupbit) + { + double nfunc_ratio = double( diagnosticCounterPerODE[FuncSum][i] ) / diagnosticCounter[FuncSum]; + rx_weight[i] = nfunc_ratio * fixrx_time + (total_time - fixrx_time) / nlocal; + tmin = fmin( tmin, rx_weight[i] ); + tmax = fmax( tmax, rx_weight[i] ); + tsum += rx_weight[i]; + //rx_weight[i] = (double) diagnosticCounterPerODE[FuncSum][i]; + } + + printf("me= %d total= %g fixrx= %g ratio= %g tsum= %g %g %g %g\n", comm->me, total_time, fixrx_time, time_ratio, tsum, (total_time - fixrx_time) / nlocal, tmin, tmax); + } + else + { + error->warning(FLERR, "Dynamic load balancing enabled but per-atom weights not available."); + + for (int i = 0; i < nlocal; ++i) + if (mask[i] & groupbit) + rx_weight[i] = 1.0; + } + } + + firstStep = false; + oldTimeStamp = now; + } + // Compute counters per dpd time-step. for (int i = 0; i < numCounters; ++i){ my_vals[i] = this->diagnosticCounter[i] / nTimes; @@ -1343,7 +1462,7 @@ void FixRX::odeDiagnostics(void) if (screen) fprintf(screen,"%s\n", smesg); \ if (logfile) fprintf(logfile,"%s\n", smesg); } - sprintf(smesg, "FixRX::ODE Diagnostics: # of steps |# of rhs evals| run-time (sec)"); + sprintf(smesg, "FixRX::ODE Diagnostics: # of iters |# of rhs evals| run-time (sec) | # atoms"); print_mesg(smesg); sprintf(smesg, " AVG per ODE : %-12.5g | %-12.5g | %-12.5g", avg_per_atom[0], avg_per_atom[1], avg_per_atom[2]); @@ -1365,7 +1484,7 @@ void FixRX::odeDiagnostics(void) print_mesg(smesg); } - sprintf(smesg, " AVG per Proc : %-12.5g | %-12.5g | %-12.5g", avg_per_proc[0], avg_per_proc[1], avg_per_proc[2]); + sprintf(smesg, " AVG per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", avg_per_proc[StepSum], avg_per_proc[FuncSum], avg_per_proc[TimeSum], avg_per_proc[AtomSum]); print_mesg(smesg); if (comm->nprocs > 1){ @@ -1373,13 +1492,13 @@ void FixRX::odeDiagnostics(void) for (int i = 0; i < numCounters; ++i) rms_per_proc[i] = sqrt( sum_sq[i] / comm->nprocs ); - sprintf(smesg, " RMS per Proc : %-12.5g | %-12.5g | %-12.5g", rms_per_proc[0], rms_per_proc[1], rms_per_proc[2]); + sprintf(smesg, " RMS per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", rms_per_proc[0], rms_per_proc[1], rms_per_proc[2], rms_per_proc[AtomSum]); print_mesg(smesg); - sprintf(smesg, " MAX per Proc : %-12.5g | %-12.5g | %-12.5g", max_per_proc[0], max_per_proc[1], max_per_proc[2]); + sprintf(smesg, " MAX per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", max_per_proc[0], max_per_proc[1], max_per_proc[2], max_per_proc[AtomSum]); print_mesg(smesg); - sprintf(smesg, " MIN per Proc : %-12.5g | %-12.5g | %-12.5g", min_per_proc[0], min_per_proc[1], min_per_proc[2]); + sprintf(smesg, " MIN per Proc : %-12.5g | %-12.5g | %-12.5g | %-12.5g", min_per_proc[0], min_per_proc[1], min_per_proc[2], min_per_proc[AtomSum]); print_mesg(smesg); } @@ -1399,7 +1518,7 @@ void FixRX::odeDiagnostics(void) return; } -void FixRX::rkf45(int id, double *rwork) +void FixRX::rkf45(int id, double *rwork, void *v_param, int ode_counter[]) { // Rounding coefficient. const double uround = DBL_EPSILON; @@ -1408,12 +1527,7 @@ void FixRX::rkf45(int id, double *rwork) const double adaption_limit = 4.0; //double *y = new double[8*nspecies + nreactions]; - double *y = NULL; - if (rwork == NULL) - y = new double[8*nspecies + nreactions]; - else - y = rwork; - double *rhstmp = y + 8*nspecies; + double *y = rwork; const int neq = nspecies; @@ -1450,7 +1564,7 @@ void FixRX::rkf45(int id, double *rwork) if (h < h_min){ //fprintf(stderr,"hin not implemented yet\n"); //exit(-1); - nfe = rkf45_h0 (neq, t, t_stop, h_min, h_max, h, y, y + neq, rhstmp); + nfe = rkf45_h0 (neq, t, t_stop, h_min, h_max, h, y, y + neq, v_param); } //printf("t= %e t_stop= %e h= %e\n", t, t_stop, h); @@ -1461,7 +1575,7 @@ void FixRX::rkf45(int id, double *rwork) double *eout = yout + neq; // Take a trial step. - rkf45_step (neq, h, y, yout, eout, rhstmp); + rkf45_step (neq, h, y, yout, eout, v_param); // Estimate the solution error. // ... weighted 2-norm of the error. @@ -1509,16 +1623,17 @@ void FixRX::rkf45(int id, double *rwork) if (maxIters && nit > maxIters){ //fprintf(stderr,"atom[%d] took too many iterations in rkf45 %d %e %e\n", id, nit, t, t_stop); - nFails ++; + //nFails ++; + ode_counter[3] ++; break; // We should set an error here so that the solution is not used! } } // end while - nSteps += nst; - nIters += nit; - nFuncs += nfe; + ode_counter[0] += nst; + ode_counter[1] += nit; + ode_counter[2] += nfe; //if (diagnosticFrequency == 1 && diagnosticCounterPerODE[StepSum] != NULL) if (diagnosticCounterPerODE[StepSum] != NULL){ @@ -1535,9 +1650,6 @@ void FixRX::rkf45(int id, double *rwork) y[ispecies] = 0.0; atom->dvector[ispecies][id] = y[ispecies]; } - - if (rwork == NULL) - delete [] y; } /* ---------------------------------------------------------------------- */ @@ -1555,21 +1667,23 @@ int FixRX::rhs(double t, const double *y, double *dydt, void *params) int FixRX::rhs_dense(double t, const double *y, double *dydt, void *params) { - double rxnRateLawForward; - double *rxnRateLaw = (double *) params; - double VDPD = domain->xprd * domain->yprd * domain->zprd / atom->natoms; - double concentration; - int nspecies = atom->nspecies_dpd; + UserRHSData *userData = (UserRHSData *) params; + + double *rxnRateLaw = userData->rxnRateLaw; + double *kFor = userData->kFor; + + const double VDPD = domain->xprd * domain->yprd * domain->zprd / atom->natoms; + const int nspecies = atom->nspecies_dpd; for(int ispecies=0; ispeciesxprd * domain->yprd * domain->zprd / atom->natoms; - #define kFor (this->kR) + #define kFor (userData->kFor) #define kRev (NULL) - #define rxnRateLaw (_rxnRateLaw) + #define rxnRateLaw (userData->rxnRateLaw) #define conc (dydt) #define maxReactants (this->sparseKinetics_maxReactants) #define maxSpecies (this->sparseKinetics_maxSpecies) diff --git a/src/USER-DPD/fix_rx.h b/src/USER-DPD/fix_rx.h index 35998963e2..ca87fc51fd 100644 --- a/src/USER-DPD/fix_rx.h +++ b/src/USER-DPD/fix_rx.h @@ -66,19 +66,19 @@ class FixRX : public Fix { double *kR; //!< Classic Runge-Kutta 4th-order stepper. - void rk4(int,double*); + void rk4(int, double*, void*); //!< Runge-Kutta-Fehlberg ODE Solver. - void rkf45(int,double*); + void rkf45(int, double*, void*, int ode_counter[]); //!< Runge-Kutta-Fehlberg ODE stepper function. void rkf45_step (const int neq, const double h, double y[], double y_out[], - double rwk[], void* v_param); + double rwk[], void *); //!< Initial step size estimation for the Runge-Kutta-Fehlberg ODE solver. int rkf45_h0 (const int neq, const double t, const double t_stop, const double hmin, const double hmax, - double& h0, double y[], double rwk[], void* v_params); + double& h0, double y[], double rwk[], void *v_params); class PairDPDfdtEnergy *pairDPDE; double *dpdThetaLocal; @@ -90,6 +90,13 @@ class FixRX : public Fix { int rhs(double, const double *, double *, void *); int rhs_dense (double, const double *, double *, void *); + // User-defined data container needed in rhs. + struct UserRHSData + { + double *kFor; + double *rxnRateLaw; + }; + // Sparse stoichiometric matrix storage format and methods. bool useSparseKinetics; //SparseKinetics sparseKinetics; @@ -116,10 +123,10 @@ class FixRX : public Fix { double relTol, absTol; //!< Relative and absolute tolerances for the ODE solver(s). // ODE Diagnostics - int nSteps; //!< # of accepted steps taken over all atoms. - int nIters; //!< # of attemped steps for all atoms. - int nFuncs; //!< # of RHS evaluations for all atoms. - int nFails; //!< # of ODE systems that failed (for some reason). + //int nSteps; //!< # of accepted steps taken over all atoms. + //int nIters; //!< # of attemped steps for all atoms. + //int nFuncs; //!< # of RHS evaluations for all atoms. + //int nFails; //!< # of ODE systems that failed (for some reason). int diagnosticFrequency; //!< Frequency (LMP steps) that run-time diagnostics will be printed to the log. enum { numDiagnosticCounters = 5 }; diff --git a/src/USER-DPD/fix_shardlow.cpp b/src/USER-DPD/fix_shardlow.cpp index d14c1e0ddb..cee67cfcf9 100644 --- a/src/USER-DPD/fix_shardlow.cpp +++ b/src/USER-DPD/fix_shardlow.cpp @@ -48,17 +48,18 @@ #include "neighbor.h" #include "neigh_list.h" #include "neigh_request.h" -#include "random_mars.h" #include "memory.h" #include "domain.h" #include "modify.h" #include "pair_dpd_fdt.h" #include "pair_dpd_fdt_energy.h" #include "pair.h" +#include "npair_half_bin_newton_ssa.h" #include "citeme.h" using namespace LAMMPS_NS; using namespace FixConst; +using namespace random_external_state; #define EPSILON 1.0e-10 #define EPSILON_SQUARED ((EPSILON) * (EPSILON)) @@ -86,6 +87,7 @@ static const char cite_fix_shardlow[] = FixShardlow::FixShardlow(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), pairDPD(NULL), pairDPDE(NULL), v_t0(NULL) + ,rand_state(NULL) { if (lmp->citeme) lmp->citeme->add(cite_fix_shardlow); @@ -95,7 +97,10 @@ FixShardlow::FixShardlow(LAMMPS *lmp, int narg, char **arg) : pairDPDE = NULL; pairDPD = (PairDPDfdt *) force->pair_match("dpd/fdt",1); pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy",1); + if (pairDPDE == NULL) + pairDPDE = (PairDPDfdtEnergy *) force->pair_match("dpd/fdt/energy/kk",1); + maxRNG = 0; if(pairDPDE){ comm_forward = 3; comm_reverse = 5; @@ -107,26 +112,14 @@ FixShardlow::FixShardlow(LAMMPS *lmp, int narg, char **arg) : if(pairDPD == NULL && pairDPDE == NULL) error->all(FLERR,"Must use pair_style dpd/fdt or dpd/fdt/energy with fix shardlow"); - // Setup the ssaAIR array - atom->ssaAIR = NULL; - grow_arrays(atom->nmax); - memset(atom->ssaAIR, 0, sizeof(int)*atom->nlocal); - - // Setup callbacks for maintaining atom->ssaAIR[] - atom->add_callback(0); // grow (aka exchange) - atom->add_callback(1); // restart - atom->add_callback(2); // border } /* ---------------------------------------------------------------------- */ FixShardlow::~FixShardlow() { - atom->delete_callback(id, 0); - atom->delete_callback(id, 1); - atom->delete_callback(id, 2); - - memory->destroy(atom->ssaAIR); + memory->destroy(rand_state); + maxRNG = 0; } /* ---------------------------------------------------------------------- */ @@ -135,7 +128,6 @@ int FixShardlow::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; - mask |= PRE_EXCHANGE | MIN_PRE_EXCHANGE; return mask; } @@ -144,9 +136,11 @@ int FixShardlow::setmask() void FixShardlow::init() { int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->pair = 0; - neighbor->requests[irequest]->fix = 1; - neighbor->requests[irequest]->ssa = 1; + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->ghost = 1; + neighbor->requests[irequest]->ssa = 1; + neighbor->requests[irequest]->newton = 1; // SSA requires newton on } /* ---------------------------------------------------------------------- */ @@ -158,27 +152,6 @@ void FixShardlow::init_list(int id, NeighList *ptr) /* ---------------------------------------------------------------------- */ -void FixShardlow::pre_exchange() -{ - memset(atom->ssaAIR, 0, sizeof(int)*atom->nlocal); -} - -/* ---------------------------------------------------------------------- */ - -void FixShardlow::setup_pre_exchange() -{ - memset(atom->ssaAIR, 0, sizeof(int)*atom->nlocal); -} - -/* ---------------------------------------------------------------------- */ - -void FixShardlow::min_pre_exchange() -{ - memset(atom->ssaAIR, 0, sizeof(int)*atom->nlocal); -} - -/* ---------------------------------------------------------------------- */ - void FixShardlow::setup(int vflag) { bool fixShardlow = false; @@ -204,12 +177,12 @@ void FixShardlow::setup(int vflag) NOTE: only implemented for orthogonal boxes, not triclinic ------------------------------------------------------------------------- */ void FixShardlow::ssa_update_dpd( - int i, - int *jlist, - int jlen + int start_ii, + int count, + int id ) { - class RanMars *pRNG; + es_RNG_t RNGstate = rand_state[id]; double **x = atom->x; double **v = atom->v; double *rmass = atom->rmass; @@ -223,6 +196,16 @@ void FixShardlow::ssa_update_dpd( const double dt = update->dt; + int ct = count; + int ii = start_ii; + +while (ct-- > 0) { + const int i = list->ilist[ii]; + const int *jlist = list->firstneigh[ii]; + const int jlen = list->numneigh[ii]; + ii++; + if (jlen <= 0) continue; + const double xtmp = x[i][0]; const double ytmp = x[i][1]; const double ztmp = x[i][2]; @@ -234,7 +217,6 @@ void FixShardlow::ssa_update_dpd( int itype = type[i]; - pRNG = pairDPD->random; cut2_i = pairDPD->cutsq[itype]; cut_i = pairDPD->cut[itype]; sigma_i = pairDPD->sigma[itype]; @@ -243,6 +225,10 @@ void FixShardlow::ssa_update_dpd( const double mass_i = (rmass) ? rmass[i] : mass[itype]; const double massinv_i = 1.0 / mass_i; +#ifdef DEBUG_SSA_PAIR_CT + const int nlocal = atom->nlocal; +#endif + // Loop over Directional Neighbors only for (int jj = 0; jj < jlen; jj++) { int j = jlist[jj] & NEIGHMASK; @@ -252,9 +238,23 @@ void FixShardlow::ssa_update_dpd( double dely = ytmp - x[j][1]; double delz = ztmp - x[j][2]; double rsq = delx*delx + dely*dely + delz*delz; +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) ++(counters[0][0]); + else ++(counters[0][1]); + ++(counters[0][2]); + int rsqi = rsq / 8; + if (rsqi < 0) rsqi = 0; + else if (rsqi > 31) rsqi = 31; + ++(hist[rsqi]); +#endif // NOTE: r can be 0.0 in DPD systems, so do EPSILON_SQUARED test if ((rsq < cut2_i[jtype]) && (rsq >= EPSILON_SQUARED)) { +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) ++(counters[1][0]); + else ++(counters[1][1]); + ++(counters[1][2]); +#endif double r = sqrt(rsq); double rinv = 1.0/r; double delx_rinv = delx*rinv; @@ -267,7 +267,7 @@ void FixShardlow::ssa_update_dpd( double halfsigma_ij = 0.5*sigma_i[jtype]; double halfgamma_ij = halfsigma_ij*halfsigma_ij*boltz_inv*theta_ij_inv; - double sigmaRand = halfsigma_ij*wr*dtsqrt*ftm2v * pRNG->gaussian(); + double sigmaRand = halfsigma_ij*wr*dtsqrt*ftm2v * es_normal(RNGstate); double mass_j = (rmass) ? rmass[j] : mass[jtype]; double massinv_j = 1.0 / mass_j; @@ -329,6 +329,9 @@ void FixShardlow::ssa_update_dpd( v[i][2] = vzi; } + rand_state[id] = RNGstate; +} + /* ---------------------------------------------------------------------- Perform the stochastic integration and Shardlow update for constant energy Allow for both per-type and per-atom mass @@ -336,12 +339,12 @@ void FixShardlow::ssa_update_dpd( NOTE: only implemented for orthogonal boxes, not triclinic ------------------------------------------------------------------------- */ void FixShardlow::ssa_update_dpde( - int i, - int *jlist, - int jlen + int start_ii, + int count, + int id ) { - class RanMars *pRNG; + es_RNG_t RNGstate = rand_state[id]; double **x = atom->x; double **v = atom->v; double *rmass = atom->rmass; @@ -359,6 +362,16 @@ void FixShardlow::ssa_update_dpde( const double dt = update->dt; + int ct = count; + int ii = start_ii; + +while (ct-- > 0) { + const int i = list->ilist[ii]; + const int *jlist = list->firstneigh[ii]; + const int jlen = list->numneigh[ii]; + ii++; + if (jlen <= 0) continue; + const double xtmp = x[i][0]; const double ytmp = x[i][1]; const double ztmp = x[i][2]; @@ -372,7 +385,6 @@ void FixShardlow::ssa_update_dpde( double uCond_i = uCond[i]; int itype = type[i]; - pRNG = pairDPDE->random; cut2_i = pairDPDE->cutsq[itype]; cut_i = pairDPDE->cut[itype]; sigma_i = pairDPDE->sigma[itype]; @@ -382,6 +394,10 @@ void FixShardlow::ssa_update_dpde( const double massinv_i = 1.0 / mass_i; const double mass_i_div_neg4_ftm2v = mass_i*(-0.25)/ftm2v; +#ifdef DEBUG_SSA_PAIR_CT + const int nlocal = atom->nlocal; +#endif + // Loop over Directional Neighbors only for (int jj = 0; jj < jlen; jj++) { int j = jlist[jj] & NEIGHMASK; @@ -391,9 +407,23 @@ void FixShardlow::ssa_update_dpde( double dely = ytmp - x[j][1]; double delz = ztmp - x[j][2]; double rsq = delx*delx + dely*dely + delz*delz; +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) ++(counters[0][0]); + else ++(counters[0][1]); + ++(counters[0][2]); + int rsqi = rsq / 8; + if (rsqi < 0) rsqi = 0; + else if (rsqi > 31) rsqi = 31; + ++(hist[rsqi]); +#endif // NOTE: r can be 0.0 in DPD systems, so do EPSILON_SQUARED test if ((rsq < cut2_i[jtype]) && (rsq >= EPSILON_SQUARED)) { +#ifdef DEBUG_SSA_PAIR_CT + if ((i < nlocal) && (j < nlocal)) ++(counters[1][0]); + else ++(counters[1][1]); + ++(counters[1][2]); +#endif double r = sqrt(rsq); double rinv = 1.0/r; double delx_rinv = delx*rinv; @@ -410,7 +440,7 @@ void FixShardlow::ssa_update_dpde( double halfsigma_ij = 0.5*sigma_i[jtype]; double halfgamma_ij = halfsigma_ij*halfsigma_ij*boltz_inv*theta_ij_inv; - double sigmaRand = halfsigma_ij*wr*dtsqrt*ftm2v * pRNG->gaussian(); + double sigmaRand = halfsigma_ij*wr*dtsqrt*ftm2v * es_normal(RNGstate); double mass_j = (rmass) ? rmass[j] : mass[jtype]; double mass_ij_div_neg4_ftm2v = mass_j*mass_i_div_neg4_ftm2v; @@ -419,7 +449,7 @@ void FixShardlow::ssa_update_dpde( // Compute uCond double kappa_ij = kappa_i[jtype]; double alpha_ij = sqrt(boltz2*kappa_ij); - double del_uCond = alpha_ij*wr*dtsqrt * pRNG->gaussian(); + double del_uCond = alpha_ij*wr*dtsqrt * es_normal(RNGstate); del_uCond += kappa_ij*(theta_i_inv - theta_j_inv)*wdt; uCond[j] -= del_uCond; @@ -494,15 +524,16 @@ void FixShardlow::ssa_update_dpde( uCond[i] = uCond_i; } + rand_state[id] = RNGstate; +} + void FixShardlow::initial_integrate(int vflag) { - int i,ii,inum; - int *ilist; + int ii; - int nlocal = atom->nlocal; - int nghost = atom->nghost; + const int nlocal = atom->nlocal; + const int nghost = atom->nghost; - int airnum; const bool useDPDE = (pairDPDE != NULL); // NOTE: this logic is specific to orthogonal boxes, not triclinic @@ -518,46 +549,97 @@ void FixShardlow::initial_integrate(int vflag) error->all(FLERR,"Fix shardlow does not yet support triclinic geometries"); if(rcut >= bbx || rcut >= bby || rcut>= bbz ) - error->all(FLERR,"Shardlow algorithm requires sub-domain length > 2*(rcut+skin). Either reduce the number of processors requested, or change the cutoff/skin\n"); + { + char fmt[] = {"Shardlow algorithm requires sub-domain length > 2*(rcut+skin). Either reduce the number of processors requested, or change the cutoff/skin: rcut= %e bbx= %e bby= %e bbz= %e\n"}; + char *msg = (char *) malloc(sizeof(fmt) + 4*15); + sprintf(msg, fmt, rcut, bbx, bby, bbz); + error->one(FLERR, msg); + } + + NPairHalfBinNewtonSSA *np_ssa = dynamic_cast(list->np); + if (!np_ssa) error->one(FLERR, "NPair wasn't a NPairHalfBinNewtonSSA object"); + int ssa_phaseCt = np_ssa->ssa_phaseCt; + int *ssa_phaseLen = np_ssa->ssa_phaseLen; + int **ssa_itemLoc = np_ssa->ssa_itemLoc; + int **ssa_itemLen = np_ssa->ssa_itemLen; + int ssa_gphaseCt = np_ssa->ssa_gphaseCt; + int *ssa_gphaseLen = np_ssa->ssa_gphaseLen; + int **ssa_gitemLoc = np_ssa->ssa_gitemLoc; + int **ssa_gitemLen = np_ssa->ssa_gitemLen; + + int maxWorkItemCt = np_ssa->ssa_maxPhaseLen; + if (maxWorkItemCt > maxRNG) { + uint64_t my_seed = comm->me + (useDPDE ? pairDPDE->seed : pairDPD->seed); + es_RNG_t serial_rand_state; + es_init(serial_rand_state, my_seed); + + memory->grow(rand_state, maxWorkItemCt, "FixShardlow:rand_state"); + for (int i = 0; i < maxWorkItemCt; ++i) { + es_genNextParallelState(serial_rand_state, rand_state[i]); + } + + maxRNG = maxWorkItemCt; + } + +#ifdef DEBUG_SSA_PAIR_CT + for (int i = 0; i < 2; ++i) + for (int j = 0; j < 3; ++j) + counters[i][j] = 0; + for (int i = 0; i < 32; ++i) hist[i] = 0; +#endif // Allocate memory for v_t0 to hold the initial velocities for the ghosts v_t0 = (double (*)[3]) memory->smalloc(sizeof(double)*3*nghost, "FixShardlow:v_t0"); - inum = list->inum; - ilist = list->ilist; - dtsqrt = sqrt(update->dt); - //Loop over all 14 directions (8 stages) - for (airnum = 1; airnum <=8; airnum++){ + // process neighbors in the local AIR + for (int workPhase = 0; workPhase < ssa_phaseCt; ++workPhase) { + int workItemCt = ssa_phaseLen[workPhase]; - if (airnum > 1) { - // Communicate the updated velocities to all nodes - comm->forward_comm_fix(this); + for (int workItem = 0; workItem < workItemCt; ++workItem) { + int ct = ssa_itemLen[workPhase][workItem]; + ii = ssa_itemLoc[workPhase][workItem]; + if (useDPDE) ssa_update_dpde(ii, ct, workItem); + else ssa_update_dpd(ii, ct, workItem); + } + } - if(useDPDE){ - // Zero out the ghosts' uCond & uMech to be used as delta accumulators - memset(&(atom->uCond[nlocal]), 0, sizeof(double)*nghost); - memset(&(atom->uMech[nlocal]), 0, sizeof(double)*nghost); - } + //Loop over all 13 outward directions (7 stages) + for (int workPhase = 0; workPhase < ssa_gphaseCt; ++workPhase) { + int workItemCt = ssa_gphaseLen[workPhase]; + + // Communicate the updated velocities to all nodes + comm->forward_comm_fix(this); + + if(useDPDE){ + // Zero out the ghosts' uCond & uMech to be used as delta accumulators + memset(&(atom->uCond[nlocal]), 0, sizeof(double)*nghost); + memset(&(atom->uMech[nlocal]), 0, sizeof(double)*nghost); } - // Loop over neighbors of my atoms - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - int start = (airnum < 2) ? 0 : list->ndxAIR_ssa[i][airnum - 2]; - int len = list->ndxAIR_ssa[i][airnum - 1] - start; - if (len > 0) { - if (useDPDE) ssa_update_dpde(i, &(list->firstneigh[i][start]), len); - else ssa_update_dpd(i, &(list->firstneigh[i][start]), len); - } + for (int workItem = 0; workItem < workItemCt; ++workItem) { + int ct = ssa_gitemLen[workPhase][workItem]; + ii = ssa_gitemLoc[workPhase][workItem]; + if (useDPDE) ssa_update_dpde(ii, ct, workItem); + else ssa_update_dpd(ii, ct, workItem); } // Communicate the ghost deltas to the atom owners - if (airnum > 1) comm->reverse_comm_fix(this); + comm->reverse_comm_fix(this); } //End Loop over all directions For airnum = Top, Top-Right, Right, Bottom-Right, Back +#ifdef DEBUG_SSA_PAIR_CT +for (int i = 0; i < 32; ++i) fprintf(stdout, "%8d", hist[i]); +fprintf(stdout, "\n%6d %6d,%6d %6d: " + ,counters[0][2] + ,counters[1][2] + ,counters[0][1] + ,counters[1][1] +); +#endif + memory->sfree(v_t0); v_t0 = NULL; } @@ -643,92 +725,13 @@ void FixShardlow::unpack_reverse_comm(int n, int *list, double *buf) } } -/* ---------------------------------------------------------------------- - convert atom coords into the ssa active interaction region number -------------------------------------------------------------------------- */ - -int FixShardlow::coord2ssaAIR(double *x) -{ - int ix, iy, iz; - - ix = iy = iz = 0; - if (x[2] < domain->sublo[2]) iz = -1; - if (x[2] >= domain->subhi[2]) iz = 1; - if (x[1] < domain->sublo[1]) iy = -1; - if (x[1] >= domain->subhi[1]) iy = 1; - if (x[0] < domain->sublo[0]) ix = -1; - if (x[0] >= domain->subhi[0]) ix = 1; - - if(iz < 0){ - return -1; - } else if(iz == 0){ - if( iy<0 ) return -1; // bottom left/middle/right - if( (iy==0) && (ix<0) ) return -1; // left atoms - if( (iy==0) && (ix==0) ) return 0; // Locally owned atoms - if( (iy==0) && (ix>0) ) return 3; // Right atoms - if( (iy>0) && (ix==0) ) return 2; // Top-middle atoms - if( (iy>0) && (ix!=0) ) return 4; // Top-right and top-left atoms - } else { // iz > 0 - if((ix==0) && (iy==0)) return 5; // Back atoms - if((ix==0) && (iy!=0)) return 6; // Top-back and bottom-back atoms - if((ix!=0) && (iy==0)) return 7; // Left-back and right-back atoms - if((ix!=0) && (iy!=0)) return 8; // Back corner atoms - } - - return -2; -} - /* ---------------------------------------------------------------------- */ -void FixShardlow::grow_arrays(int nmax) -{ - memory->grow(atom->ssaAIR,nmax,"fix_shardlow:ssaAIR"); -} - -void FixShardlow::copy_arrays(int i, int j, int delflag) -{ - atom->ssaAIR[j] = atom->ssaAIR[i]; -} - -void FixShardlow::set_arrays(int i) -{ - atom->ssaAIR[i] = 0; /* coord2ssaAIR(x[i]) */ -} - -int FixShardlow::pack_border(int n, int *list, double *buf) -{ - for (int i = 0; i < n; i++) { - int j = list[i]; - if (atom->ssaAIR[j] == 0) atom->ssaAIR[j] = 1; // not purely local anymore - } - return 0; -} - -int FixShardlow::unpack_border(int n, int first, double *buf) -{ - int i,last = first + n; - for (i = first; i < last; i++) { - atom->ssaAIR[i] = coord2ssaAIR(atom->x[i]); - } - return 0; -} - -int FixShardlow::unpack_exchange(int i, double *buf) -{ - atom->ssaAIR[i] = 0; /* coord2ssaAIR(x[i]) */ - return 0; -} - -void FixShardlow::unpack_restart(int i, int nth) -{ - atom->ssaAIR[i] = 0; /* coord2ssaAIR(x[i]) */ -} - double FixShardlow::memory_usage() { double bytes = 0.0; - bytes += memory->usage(atom->ssaAIR,atom->nmax); bytes += sizeof(double)*3*atom->nghost; // v_t0[] + bytes += sizeof(*rand_state)*maxRNG; // rand_state[] return bytes; } diff --git a/src/USER-DPD/fix_shardlow.h b/src/USER-DPD/fix_shardlow.h index 2ffb96ae7c..21f7569a23 100644 --- a/src/USER-DPD/fix_shardlow.h +++ b/src/USER-DPD/fix_shardlow.h @@ -21,6 +21,8 @@ FixStyle(shardlow,FixShardlow) #define LMP_FIX_SHARDLOW_H #include "fix.h" +#include "random_external_state.h" +#include namespace LAMMPS_NS { @@ -35,21 +37,14 @@ class FixShardlow : public Fix { virtual void init_list(int, class NeighList *); virtual void setup(int); virtual void initial_integrate(int); - void setup_pre_exchange(); - void pre_exchange(); - void min_pre_exchange(); - - void grow_arrays(int); - void copy_arrays(int, int, int); - void set_arrays(int); - - int pack_border(int, int *, double *); - int unpack_border(int, int, double *); - int unpack_exchange(int, double *); - void unpack_restart(int, int); double memory_usage(); +#ifdef DEBUG_SSA_PAIR_CT + int counters[2][3]; + int hist[32]; +#endif + protected: int pack_reverse_comm(int, int, double *); void unpack_reverse_comm(int, int *, double *); @@ -59,13 +54,14 @@ class FixShardlow : public Fix { class PairDPDfdt *pairDPD; class PairDPDfdtEnergy *pairDPDE; double (*v_t0)[3]; + int maxRNG; private: + random_external_state::es_RNG_t *rand_state; double dtsqrt; // = sqrt(update->dt); - int coord2ssaAIR(double *); // map atom coord to an AIR number - void ssa_update_dpd(int, int *, int); // Constant Temperature - void ssa_update_dpde(int, int *, int); // Constant Energy + void ssa_update_dpd(int, int, int); // Constant Temperature + void ssa_update_dpde(int, int, int); // Constant Energy }; diff --git a/src/USER-DPD/nbin_ssa.cpp b/src/USER-DPD/nbin_ssa.cpp index f65a397e88..4c57a8e70f 100644 --- a/src/USER-DPD/nbin_ssa.cpp +++ b/src/USER-DPD/nbin_ssa.cpp @@ -20,6 +20,7 @@ #include "atom.h" #include "update.h" #include "group.h" +#include "domain.h" #include "memory.h" #include "error.h" @@ -29,24 +30,19 @@ using namespace LAMMPS_NS; NBinSSA::NBinSSA(LAMMPS *lmp) : NBinStandard(lmp) { - maxbin_ssa = 0; - bins_ssa = NULL; - maxhead_ssa = 0; - binhead_ssa = NULL; - gbinhead_ssa = NULL; + for (int i = 0; i < 8; i++) { + gairhead_ssa[i] = -1; + } } NBinSSA::~NBinSSA() { - memory->destroy(bins_ssa); - memory->destroy(binhead_ssa); - memory->destroy(gbinhead_ssa); } /* ---------------------------------------------------------------------- bin owned and ghost atoms for the Shardlow Splitting Algorithm (SSA) - local atoms are in distinct bins (binhead_ssa) from the ghosts - ghost atoms are in distinct bins (gbinhead_ssa) from the locals + local atoms are in distinct bins (binhead[]) from the ghosts + ghost atoms are "binned" in gairhead_ssa[] instead ghosts which are not in an Active Interaction Region (AIR) are skipped ------------------------------------------------------------------------- */ @@ -58,13 +54,19 @@ void NBinSSA::bin_atoms() if (includegroup) nlocal = atom->nfirst; double **x = atom->x; int *mask = atom->mask; - int *ssaAIR = atom->ssaAIR; + int xbin,ybin,zbin; last_bin = update->ntimestep; + bboxlo_[0] = bboxlo[0]; bboxlo_[1] = bboxlo[1]; bboxlo_[2] = bboxlo[2]; + bboxhi_[0] = bboxhi[0]; bboxhi_[1] = bboxhi[1]; bboxhi_[2] = bboxhi[2]; + + for (i = 0; i < 8; i++) { + gairhead_ssa[i] = -1; + } + for (i = 0; i < mbins; i++) { - gbinhead_ssa[i] = -1; - binhead_ssa[i] = -1; + binhead[i] = -1; } // bin in reverse order so linked list will be in forward order @@ -73,29 +75,34 @@ void NBinSSA::bin_atoms() int bitmask = group->bitmask[includegroup]; int nowned = atom->nlocal; // NOTE: nlocal was set to atom->nfirst above for (i = nall-1; i >= nowned; i--) { - if (ssaAIR[i] < 2) continue; // skip ghost atoms not in AIR + ibin = coord2ssaAIR(x[i]); + if (ibin < 1) continue; // skip ghost atoms not in AIR if (mask[i] & bitmask) { - ibin = coord2bin(x[i]); - atom2bin[i] = ibin; - bins_ssa[i] = gbinhead_ssa[ibin]; - gbinhead_ssa[ibin] = i; + bins[i] = gairhead_ssa[ibin]; + gairhead_ssa[ibin] = i; } } } else { for (i = nall-1; i >= nlocal; i--) { - if (ssaAIR[i] < 2) continue; // skip ghost atoms not in AIR - ibin = coord2bin(x[i]); - atom2bin[i] = ibin; - bins_ssa[i] = gbinhead_ssa[ibin]; - gbinhead_ssa[ibin] = i; + ibin = coord2ssaAIR(x[i]); + if (ibin < 1) continue; // skip ghost atoms not in AIR + bins[i] = gairhead_ssa[ibin]; + gairhead_ssa[ibin] = i; } } for (i = nlocal-1; i >= 0; i--) { - ibin = coord2bin(x[i]); - atom2bin[i] = ibin; - bins_ssa[i] = binhead_ssa[ibin]; - binhead_ssa[ibin] = i; + ibin = coord2bin(x[i][0], x[i][1], x[i][2], xbin, ybin, zbin); + // Find the bounding box of the local atoms in the bins + if (xbin < lbinxlo) lbinxlo = xbin; + if (xbin >= lbinxhi) lbinxhi = xbin + 1; + if (ybin < lbinylo) lbinylo = ybin; + if (ybin >= lbinyhi) lbinyhi = ybin + 1; + if (zbin < lbinzlo) lbinzlo = zbin; + if (zbin >= lbinzhi) lbinzhi = zbin + 1; + bins[i] = binhead[ibin]; + binhead[ibin] = i; } + } /* ---------------------------------------------------------------------- */ @@ -104,19 +111,13 @@ void NBinSSA::bin_atoms_setup(int nall) { NBinStandard::bin_atoms_setup(nall); // Setup the parent class's data too - if (mbins > maxhead_ssa) { - maxhead_ssa = mbins; - memory->destroy(gbinhead_ssa); - memory->destroy(binhead_ssa); - memory->create(binhead_ssa,maxhead_ssa,"binhead_ssa"); - memory->create(gbinhead_ssa,maxhead_ssa,"gbinhead_ssa"); - } - - if (nall > maxbin_ssa) { - maxbin_ssa = nall; - memory->destroy(bins_ssa); - memory->create(bins_ssa,maxbin_ssa,"bins_ssa"); - } + // Clear the local bin extent bounding box. + lbinxlo = mbinx - 1; // Safe to = stencil->sx + 1 + lbinylo = mbiny - 1; // Safe to = stencil->sy + 1 + lbinzlo = mbinz - 1; // Safe to = stencil->sz + 1 + lbinxhi = 0; // Safe to = mbinx - stencil->sx - 1 + lbinyhi = 0; // Safe to = mbiny - stencil->sy - 1 + lbinzhi = 0; // Safe to = mbinz - stencil->sz - 1 } /* ---------------------------------------------------------------------- */ @@ -125,10 +126,39 @@ bigint NBinSSA::memory_usage() { bigint bytes = NBinStandard::memory_usage(); // Count the parent's usage too - if (maxbin_ssa) bytes += memory->usage(bins_ssa,maxbin_ssa); - if (maxhead_ssa) { - bytes += memory->usage(binhead_ssa,maxhead_ssa); - bytes += memory->usage(gbinhead_ssa,maxhead_ssa); - } return bytes; } + +/* ---------------------------------------------------------------------- + convert atom coords into the ssa active interaction region number +------------------------------------------------------------------------- */ +int NBinSSA::coord2ssaAIR(const double *x) +{ + int ix, iy, iz; + + ix = iy = iz = 0; + if (x[2] < domain->sublo[2]) iz = -1; + if (x[2] >= domain->subhi[2]) iz = 1; + if (x[1] < domain->sublo[1]) iy = -1; + if (x[1] >= domain->subhi[1]) iy = 1; + if (x[0] < domain->sublo[0]) ix = -1; + if (x[0] >= domain->subhi[0]) ix = 1; + + if(iz < 0){ + return -1; + } else if(iz == 0){ + if( iy<0 ) return -1; // bottom left/middle/right + if( (iy==0) && (ix<0) ) return -1; // left atoms + if( (iy==0) && (ix==0) ) return 0; // Locally owned atoms + if( (iy==0) && (ix>0) ) return 2; // Right atoms + if( (iy>0) && (ix==0) ) return 1; // Top-middle atoms + if( (iy>0) && (ix!=0) ) return 3; // Top-right and top-left atoms + } else { // iz > 0 + if((ix==0) && (iy==0)) return 4; // Back atoms + if((ix==0) && (iy!=0)) return 5; // Top-back and bottom-back atoms + if((ix!=0) && (iy==0)) return 6; // Left-back and right-back atoms + if((ix!=0) && (iy!=0)) return 7; // Back corner atoms + } + + return -2; +} diff --git a/src/USER-DPD/nbin_ssa.h b/src/USER-DPD/nbin_ssa.h index f0699b3a7a..12a572b94c 100644 --- a/src/USER-DPD/nbin_ssa.h +++ b/src/USER-DPD/nbin_ssa.h @@ -23,17 +23,23 @@ NBinStyle(ssa, #define LMP_NBIN_SSA_H #include "nbin_standard.h" +#include "math.h" +#include "error.h" namespace LAMMPS_NS { class NBinSSA : public NBinStandard { public: - int *bins_ssa; // index of next atom in each bin - int maxbin_ssa; // size of bins_ssa array - int *binhead_ssa; // index of 1st local atom in each bin - int *gbinhead_ssa; // index of 1st ghost atom in each bin - int maxhead_ssa; // size of binhead_ssa and gbinhead_ssa arrays + int gairhead_ssa[8]; // index of 1st ghost atom in each AIR + + // Bounds of the local atoms in the binhead array + int lbinxlo; // lowest local bin x-dim coordinate + int lbinylo; // lowest local bin y-dim coordinate + int lbinzlo; // lowest local bin z-dim coordinate + int lbinxhi; // highest local bin x-dim coordinate + int lbinyhi; // highest local bin y-dim coordinate + int lbinzhi; // highest local bin z-dim coordinate NBinSSA(class LAMMPS *); ~NBinSSA(); @@ -42,6 +48,50 @@ class NBinSSA : public NBinStandard { void bin_atoms(); bigint memory_usage(); + + inline + int coord2bin(const double & x,const double & y,const double & z, int &ixo, int &iyo, int &izo) const + { + int ix,iy,iz; + + if (!ISFINITE(x) || !ISFINITE(y) || !ISFINITE(z)) + error->one(FLERR,"Non-numeric positions - simulation unstable"); + + if (x >= bboxhi_[0]) + ix = static_cast ((x-bboxhi_[0])*bininvx) + nbinx; + else if (x >= bboxlo_[0]) { + ix = static_cast ((x-bboxlo_[0])*bininvx); + ix = MIN(ix,nbinx-1); + } else + ix = static_cast ((x-bboxlo_[0])*bininvx) - 1; + + if (y >= bboxhi_[1]) + iy = static_cast ((y-bboxhi_[1])*bininvy) + nbiny; + else if (y >= bboxlo_[1]) { + iy = static_cast ((y-bboxlo_[1])*bininvy); + iy = MIN(iy,nbiny-1); + } else + iy = static_cast ((y-bboxlo_[1])*bininvy) - 1; + + if (z >= bboxhi_[2]) + iz = static_cast ((z-bboxhi_[2])*bininvz) + nbinz; + else if (z >= bboxlo_[2]) { + iz = static_cast ((z-bboxlo_[2])*bininvz); + iz = MIN(iz,nbinz-1); + } else + iz = static_cast ((z-bboxlo_[2])*bininvz) - 1; + + ixo = ix - mbinxlo; + iyo = iy - mbinylo; + izo = iz - mbinzlo; + + return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo); + } + + private: + int coord2ssaAIR(const double *); // map atom coord to an AIR number + double bboxlo_[3],bboxhi_[3]; + }; } diff --git a/src/USER-DPD/npair_half_bin_newton_ssa.cpp b/src/USER-DPD/npair_half_bin_newton_ssa.cpp index e8e4b20a0a..ba90ebc465 100644 --- a/src/USER-DPD/npair_half_bin_newton_ssa.cpp +++ b/src/USER-DPD/npair_half_bin_newton_ssa.cpp @@ -32,15 +32,37 @@ using namespace LAMMPS_NS; -// allocate space for static class variable -// prototype for non-class function +/* ---------------------------------------------------------------------- */ -static int *ssaAIRptr; -static int cmp_ssaAIR(const void *, const void *); +NPairHalfBinNewtonSSA::NPairHalfBinNewtonSSA(LAMMPS *lmp) : NPair(lmp) +{ + ssa_maxPhaseCt = 0; + ssa_maxPhaseLen = 0; + ssa_phaseCt = 0; + ssa_phaseLen = NULL; + ssa_itemLoc = NULL; + ssa_itemLen = NULL; + ssa_gphaseCt = 7; + memory->create(ssa_gphaseLen,ssa_gphaseCt,"NPairHalfBinNewtonSSA:ssa_gphaseLen"); + memory->create(ssa_gitemLoc,ssa_gphaseCt,1,"NPairHalfBinNewtonSSA:ssa_gitemLoc"); + memory->create(ssa_gitemLen,ssa_gphaseCt,1,"NPairHalfBinNewtonSSA:ssa_gitemLen"); +} /* ---------------------------------------------------------------------- */ -NPairHalfBinNewtonSSA::NPairHalfBinNewtonSSA(LAMMPS *lmp) : NPair(lmp) {} +NPairHalfBinNewtonSSA::~NPairHalfBinNewtonSSA() +{ + ssa_maxPhaseCt = 0; + ssa_maxPhaseLen = 0; + ssa_phaseCt = 0; + memory->destroy(ssa_phaseLen); + memory->destroy(ssa_itemLoc); + memory->destroy(ssa_itemLen); + ssa_gphaseCt = 0; + memory->destroy(ssa_gphaseLen); + memory->destroy(ssa_gitemLoc); + memory->destroy(ssa_gitemLen); +} /* ---------------------------------------------------------------------- binned neighbor list construction with full Newton's 3rd law @@ -63,9 +85,6 @@ void NPairHalfBinNewtonSSA::build(NeighList *list) tagint *molecule = atom->molecule; tagint **special = atom->special; int **nspecial = atom->nspecial; - int nlocal = atom->nlocal; - if (includegroup) nlocal = atom->nfirst; - int *ssaAIR = atom->ssaAIR; int *molindex = atom->molindex; int *molatom = atom->molatom; @@ -81,179 +100,220 @@ void NPairHalfBinNewtonSSA::build(NeighList *list) NStencilSSA *ns_ssa = dynamic_cast(ns); if (!ns_ssa) error->one(FLERR, "NStencil wasn't a NStencilSSA object"); - int nstencil_half = ns_ssa->nstencil_half; + int *nstencil_ssa = &(ns_ssa->nstencil_ssa[0]); int nstencil_full = ns_ssa->nstencil; NBinSSA *nb_ssa = dynamic_cast(nb); if (!nb_ssa) error->one(FLERR, "NBin wasn't a NBinSSA object"); - int *bins_ssa = nb_ssa->bins_ssa; - int *binhead_ssa = nb_ssa->binhead_ssa; - int *gbinhead_ssa = nb_ssa->gbinhead_ssa; + int *bins = nb_ssa->bins; + int *binhead = nb_ssa->binhead; + int *gairhead_ssa = &(nb_ssa->gairhead_ssa[0]); int inum = 0; + int gnum = 0; + int xbin,ybin,zbin,xbin2,ybin2,zbin2; + int **stencilxyz = ns_ssa->stencilxyz; + int lbinxlo = nb_ssa->lbinxlo; + int lbinxhi = nb_ssa->lbinxhi; + int lbinylo = nb_ssa->lbinylo; + int lbinyhi = nb_ssa->lbinyhi; + int lbinzlo = nb_ssa->lbinzlo; + int lbinzhi = nb_ssa->lbinzhi; + + int sx1 = ns_ssa->sx + 1; + int sy1 = ns_ssa->sy + 1; + int sz1 = ns_ssa->sz + 1; + + ssa_phaseCt = sz1*sy1*sx1; + + xbin = (lbinxhi - lbinxlo + sx1 - 1) / sx1 + 1; + ybin = (lbinyhi - lbinylo + sy1 - 1) / sy1 + 1; + zbin = (lbinzhi - lbinzlo + sz1 - 1) / sz1 + 1; + + int phaseLenEstimate = xbin*ybin*zbin; + + if (ssa_phaseCt > ssa_maxPhaseCt) { + ssa_maxPhaseCt = ssa_phaseCt; + ssa_maxPhaseLen = 0; + memory->destroy(ssa_phaseLen); + memory->destroy(ssa_itemLoc); + memory->destroy(ssa_itemLen); + memory->create(ssa_phaseLen,ssa_maxPhaseCt,"NPairHalfBinNewtonSSA:ssa_phaseLen"); + } + + if (phaseLenEstimate > ssa_maxPhaseLen) { + ssa_maxPhaseLen = phaseLenEstimate; + memory->destroy(ssa_itemLoc); + memory->destroy(ssa_itemLen); + memory->create(ssa_itemLoc,ssa_maxPhaseCt,ssa_maxPhaseLen,"NPairHalfBinNewtonSSA:ssa_itemLoc"); + memory->create(ssa_itemLen,ssa_maxPhaseCt,ssa_maxPhaseLen,"NPairHalfBinNewtonSSA:ssa_itemLen"); + } ipage->reset(); - // loop over owned atoms, storing half of the neighbors + int workPhase = 0; + // loop over bins with local atoms, storing half of the neighbors + for (int zoff = ns_ssa->sz; zoff >= 0; --zoff) { + for (int yoff = ns_ssa->sy; yoff >= 0; --yoff) { + for (int xoff = ns_ssa->sx; xoff >= 0; --xoff) { + int workItem = 0; + for (zbin = lbinzlo + zoff; zbin < lbinzhi; zbin += sz1) { + for (ybin = lbinylo + yoff - ns_ssa->sy; ybin < lbinyhi; ybin += sy1) { + for (xbin = lbinxlo + xoff - ns_ssa->sx; xbin < lbinxhi; xbin += sx1) { + if (workItem >= phaseLenEstimate) error->one(FLERR,"phaseLenEstimate was too small"); + ssa_itemLoc[workPhase][workItem] = inum; // record where workItem starts in ilist - for (i = 0; i < nlocal; i++) { - int AIRct[8] = { 0 }; - n = 0; - neighptr = ipage->vget(); + for (int subphase = 0; subphase < 4; subphase++) { + int s_ybin = ybin + ((subphase & 0x2) ? ns_ssa->sy : 0); + int s_xbin = xbin + ((subphase & 0x1) ? ns_ssa->sx : 0); + int ibin; - itype = type[i]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - if (moltemplate) { - imol = molindex[i]; - iatom = molatom[i]; - tagprev = tag[i] - iatom - 1; - } + if ((s_ybin < lbinylo) || (s_ybin >= lbinyhi)) continue; + if ((s_xbin < lbinxlo) || (s_xbin >= lbinxhi)) continue; + ibin = zbin*nb_ssa->mbiny*nb_ssa->mbinx + + s_ybin*nb_ssa->mbinx + + s_xbin; - // loop over rest of local atoms in i's bin - // just store them, since j is beyond i in linked list - - for (j = bins_ssa[i]; j >= 0; j = bins_ssa[j]) { - - jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - - ibin = atom2bin[i]; - - // loop over all local atoms in other bins in "half" stencil - - for (k = 0; k < nstencil_half; k++) { - for (j = binhead_ssa[ibin+stencil[k]]; j >= 0; - j = bins_ssa[j]) { - - jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; + for (i = binhead[ibin]; i >= 0; i = bins[i]) { + n = 0; + neighptr = ipage->vget(); + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + if (moltemplate) { + imol = molindex[i]; + iatom = molatom[i]; + tagprev = tag[i] - iatom - 1; } + + // loop over all local atoms in the current stencil "subphase" + for (k = nstencil_ssa[subphase]; k < nstencil_ssa[subphase+1]; k++) { + const int jbin = ibin+stencil[k]; + if (jbin != ibin) j = binhead[jbin]; + else j = bins[i]; // same bin as i, so start just past i in the bin + for (; j >= 0; j = bins[j]) { + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } + + if (n > 0) { + firstneigh[inum] = neighptr; + numneigh[inum] = n; + ilist[inum++] = i; + } + ipage->vgot(n); + if (ipage->status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); } } - AIRct[0] = n; + // record where workItem ends in ilist + ssa_itemLen[workPhase][workItem] = inum - ssa_itemLoc[workPhase][workItem]; + if (ssa_itemLen[workPhase][workItem] > 0) workItem++; + } + } + } - // loop over AIR ghost atoms in all bins in "full" stencil - // Note: the non-AIR ghost atoms have already been filtered out - // That is a significant time savings because of the "full" stencil - // Note2: only non-pure locals can have ghosts as neighbors + // record where workPhase ends + ssa_phaseLen[workPhase++] = workItem; + } + } + } - if (ssaAIR[i] == 1) for (k = 0; k < nstencil_full; k++) { - for (j = gbinhead_ssa[ibin+stencil[k]]; j >= 0; - j = bins_ssa[j]) { + if (ssa_phaseCt != workPhase) error->one(FLERR,"ssa_phaseCt was wrong"); - jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + list->inum = inum; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + // loop over AIR ghost atoms, storing their local neighbors + // since these are ghosts, must check if stencil bin is out of bounds + for (workPhase = 0; workPhase < ssa_gphaseCt; workPhase++) { + int locAIRct = 0; + ssa_gitemLoc[workPhase][0] = inum + gnum; // record where workItem starts in ilist + for (i = gairhead_ssa[workPhase+1]; i >= 0; i = bins[i]) { + n = 0; + neighptr = ipage->vget(); - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) { - neighptr[n++] = j; - ++(AIRct[ssaAIR[j] - 1]); - } else if (domain->minimum_image_check(delx,dely,delz)) { - neighptr[n++] = j; - ++(AIRct[ssaAIR[j] - 1]); - } else if (which > 0) { - neighptr[n++] = j ^ (which << SBBITS); - ++(AIRct[ssaAIR[j] - 1]); - } - } else { - neighptr[n++] = j; - ++(AIRct[ssaAIR[j] - 1]); + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + ibin = coord2bin(x[i],xbin,ybin,zbin); + + // loop over AIR ghost atoms in all bins in "full" stencil + // Note: the non-AIR ghost atoms have already been filtered out + for (k = 0; k < nstencil_full; k++) { + xbin2 = xbin + stencilxyz[k][0]; + ybin2 = ybin + stencilxyz[k][1]; + zbin2 = zbin + stencilxyz[k][2]; + // Skip it if this bin is outside the extent of local bins + if (xbin2 < lbinxlo || xbin2 >= lbinxhi || + ybin2 < lbinylo || ybin2 >= lbinyhi || + zbin2 < lbinzlo || zbin2 >= lbinzhi) continue; + for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular) { + if (!moltemplate) + which = find_special(special[j],nspecial[j],tag[i]); + else { + int jmol = molindex[j]; + if (jmol >= 0) { + int jatom = molatom[j]; + which = find_special(onemols[jmol]->special[jatom], + onemols[jmol]->nspecial[jatom], + tag[i] - (tag[j] - jatom - 1)); + } else which = 0; + } + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; } } } + + if (n > 0) { + firstneigh[inum + gnum] = neighptr; + numneigh[inum + gnum] = n; + ilist[inum + (gnum++)] = i; + ++locAIRct; + } + ipage->vgot(n); + if (ipage->status()) + error->one(FLERR,"Neighbor (ghost) list overflow, boost neigh_modify one"); } - - ilist[inum++] = i; - firstneigh[i] = neighptr; - numneigh[i] = n; - ipage->vgot(n); - if (ipage->status()) - error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - // sort the ghosts in the neighbor list by their ssaAIR number - - ssaAIRptr = atom->ssaAIR; - qsort(&(neighptr[AIRct[0]]), n - AIRct[0], sizeof(int), cmp_ssaAIR); - - // do a prefix sum on the counts to turn them into indexes - - list->ndxAIR_ssa[i][0] = AIRct[0]; - for (int ndx = 1; ndx < 8; ++ndx) { - list->ndxAIR_ssa[i][ndx] = AIRct[ndx] + list->ndxAIR_ssa[i][ndx - 1]; - } + ssa_gitemLen[workPhase][0] = locAIRct; + ssa_gphaseLen[workPhase] = 1; } - - list->inum = inum; + list->gnum = gnum; } - -/* ---------------------------------------------------------------------- - comparison function invoked by qsort() - accesses static class member ssaAIRptr, set before call to qsort() -------------------------------------------------------------------------- */ - -static int cmp_ssaAIR(const void *iptr, const void *jptr) -{ - int i = NEIGHMASK & *((int *) iptr); - int j = NEIGHMASK & *((int *) jptr); - if (ssaAIRptr[i] < ssaAIRptr[j]) return -1; - if (ssaAIRptr[i] > ssaAIRptr[j]) return 1; - return 0; -} - diff --git a/src/USER-DPD/npair_half_bin_newton_ssa.h b/src/USER-DPD/npair_half_bin_newton_ssa.h index 13347b33b0..584d87e3ad 100644 --- a/src/USER-DPD/npair_half_bin_newton_ssa.h +++ b/src/USER-DPD/npair_half_bin_newton_ssa.h @@ -15,7 +15,7 @@ NPairStyle(half/bin/newton/ssa, NPairHalfBinNewtonSSA, - NP_HALF | NP_BIN | NP_NEWTON | NP_ORTHO | NP_SSA) + NP_HALF | NP_BIN | NP_NEWTON | NP_ORTHO | NP_SSA | NP_GHOST) #else @@ -28,9 +28,23 @@ namespace LAMMPS_NS { class NPairHalfBinNewtonSSA : public NPair { public: + // SSA Work plan data structures + int ssa_phaseCt; + int *ssa_phaseLen; + int **ssa_itemLoc; + int **ssa_itemLen; + int ssa_gphaseCt; + int *ssa_gphaseLen; + int **ssa_gitemLoc; + int **ssa_gitemLen; + + int ssa_maxPhaseLen; + NPairHalfBinNewtonSSA(class LAMMPS *); - ~NPairHalfBinNewtonSSA() {} + ~NPairHalfBinNewtonSSA(); void build(class NeighList *); + private: + int ssa_maxPhaseCt; }; } diff --git a/src/USER-DPD/npair_halffull_newton_ssa.cpp b/src/USER-DPD/npair_halffull_newton_ssa.cpp deleted file mode 100644 index 2c9de3e50f..0000000000 --- a/src/USER-DPD/npair_halffull_newton_ssa.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing authors: - James Larentzos and Timothy I. Mattox (Engility Corporation) -------------------------------------------------------------------------- */ - -#include "npair_halffull_newton_ssa.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "atom.h" -#include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "my_page.h" -#include "error.h" - -using namespace LAMMPS_NS; - -// allocate space for static class variable -// prototype for non-class function - -static int *ssaAIRptr; -static int cmp_ssaAIR(const void *, const void *); - -/* ---------------------------------------------------------------------- */ - -NPairHalffullNewtonSSA::NPairHalffullNewtonSSA(LAMMPS *lmp) : NPair(lmp) {} - -/* ---------------------------------------------------------------------- - build half list from full list for use by Shardlow Spliting Algorithm - pair stored once if i,j are both owned and i < j - if j is ghost, only store if j coords are "above and to the right" of i - works if full list is a skip list -------------------------------------------------------------------------- */ - -void NPairHalffullNewtonSSA::build(NeighList *list) -{ - int i,j,ii,jj,n,jnum,joriginal; - int *neighptr,*jlist; - - int nlocal = atom->nlocal; - int *ssaAIR = atom->ssaAIR; - - int *ilist = list->ilist; - int *numneigh = list->numneigh; - int **firstneigh = list->firstneigh; - MyPage *ipage = list->ipage; - - int *ilist_full = list->listfull->ilist; - int *numneigh_full = list->listfull->numneigh; - int **firstneigh_full = list->listfull->firstneigh; - int inum_full = list->listfull->inum; - - int inum = 0; - ipage->reset(); - - // loop over parent full list - - for (ii = 0; ii < inum_full; ii++) { - int AIRct[8] = { 0 }; - n = 0; - neighptr = ipage->vget(); - - i = ilist_full[ii]; - - // loop over full neighbor list - - jlist = firstneigh_full[i]; - jnum = numneigh_full[i]; - - for (jj = 0; jj < jnum; jj++) { - joriginal = jlist[jj]; - j = joriginal & NEIGHMASK; - if (j < nlocal) { - if (i > j) continue; - ++(AIRct[0]); - } else { - if (ssaAIR[j] < 2) continue; // skip ghost atoms not in AIR - ++(AIRct[ssaAIR[j] - 1]); - } - neighptr[n++] = joriginal; - } - - ilist[inum++] = i; - firstneigh[i] = neighptr; - numneigh[i] = n; - ipage->vgot(n); - if (ipage->status()) - error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - // sort the locals+ghosts in the neighbor list by their ssaAIR number - - ssaAIRptr = atom->ssaAIR; - qsort(&(neighptr[0]), n, sizeof(int), cmp_ssaAIR); - - // do a prefix sum on the counts to turn them into indexes - - list->ndxAIR_ssa[i][0] = AIRct[0]; - for (int ndx = 1; ndx < 8; ++ndx) { - list->ndxAIR_ssa[i][ndx] = AIRct[ndx] + list->ndxAIR_ssa[i][ndx - 1]; - } - } - - list->inum = inum; -} - -/* ---------------------------------------------------------------------- - comparison function invoked by qsort() - accesses static class member ssaAIRptr, set before call to qsort() -------------------------------------------------------------------------- */ - -static int cmp_ssaAIR(const void *iptr, const void *jptr) -{ - int i = NEIGHMASK & *((int *) iptr); - int j = NEIGHMASK & *((int *) jptr); - if (ssaAIRptr[i] < ssaAIRptr[j]) return -1; - if (ssaAIRptr[i] > ssaAIRptr[j]) return 1; - return 0; -} - diff --git a/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.cpp b/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.cpp index df379a109a..451381c104 100644 --- a/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.cpp +++ b/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.cpp @@ -42,23 +42,72 @@ NStencilHalfBin2dNewtonSSA::NStencilHalfBin2dNewtonSSA(LAMMPS *lmp) : void NStencilHalfBin2dNewtonSSA::create() { int i,j,pos = 0; + nstencil_ssa[0] = 0; // redundant info, but saves a conditional + // Include the centroid at the start. + // It will be handled as part of Subphase 0. + stencilxyz[pos][0] = 0; + stencilxyz[pos][1] = 0; + stencilxyz[pos][2] = 0; + stencil[pos++] = 0; + + // Subphase 0: upper right front bins (red) for (j = 0; j <= sy; j++) - for (i = -sx; i <= sx; i++) - if (j > 0 || (j == 0 && i > 0)) - if (bin_distance(i,j,0) < cutneighmaxsq) + for (i = 0; i <= sx; i++) + if (j > 0 || i > 0) // skip the centroid + if (bin_distance(i,j,0) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = 0; stencil[pos++] = j*mbinx + i; + } - nstencil_half = pos; // record where normal half stencil ends - - // include additional bins for AIR ghosts only - - for (j = -sy; j <= 0; j++) - for (i = -sx; i <= sx; i++) { - if (j == 0 && i > 0) continue; - if (bin_distance(i,j,0) < cutneighmaxsq) + nstencil_ssa[1] = pos; + // Subphase 1: upper left front bins (light blue) + for (j = 1; j <= sy; j++) + for (i = -sx; i < 0; i++) + if (bin_distance(i,j,0) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = 0; stencil[pos++] = j*mbinx + i; - } + } + + nstencil_ssa[2] = pos; + // Subphase 2: lower right front bins (yellow) + + nstencil_ssa[3] = pos; + // Subphase 3: lower left front bins (blue) + + nstencil_ssa[4] = pos; // record end of half stencil + // Now include additional bins for AIR ghosts, and impure-to-pure locals + // Subphase 4: upper right back bins (pink) + + // nstencil_ssa[5] = pos; + // Subphase 5: upper left back bins (light green) + + // nstencil_ssa[6] = pos; + // Subphase 6: lower right back bins (white) + for (j = -sy; j < 0; j++) + for (i = 0; i <= sx; i++) + if (bin_distance(i,j,0) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = 0; + stencil[pos++] = j*mbinx + i; + } + + // nstencil_ssa[7] = pos; + // Subphase 7: lower left back bins (purple) + for (j = -sy; j <= 0; j++) + for (i = -sx; i < 0; i++) + if (bin_distance(i,j,0) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = 0; + stencil[pos++] = j*mbinx + i; + } + // nstencil_ssa[8] = pos; nstencil = pos; // record where full stencil ends } diff --git a/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.h b/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.h index 30901bb3e2..1d5cc3f6b2 100644 --- a/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.h +++ b/src/USER-DPD/nstencil_half_bin_2d_newton_ssa.h @@ -15,7 +15,7 @@ NStencilStyle(half/bin/2d/newton/ssa, NStencilHalfBin2dNewtonSSA, - NS_HALF | NS_BIN | NS_2D | NS_NEWTON | NS_SSA | NS_ORTHO) + NS_HALF | NS_BIN | NS_2D | NS_NEWTON | NS_SSA | NS_ORTHO | NS_GHOST) #else diff --git a/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.cpp b/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.cpp index 76c9931ab2..cdd3b8856f 100644 --- a/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.cpp +++ b/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.cpp @@ -42,33 +42,112 @@ NStencilHalfBin3dNewtonSSA::NStencilHalfBin3dNewtonSSA(LAMMPS *lmp) : void NStencilHalfBin3dNewtonSSA::create() { int i,j,k,pos = 0; + nstencil_ssa[0] = 0; // redundant info, but saves a conditional + // Include the centroid at the start. + // It will be handled as part of Subphase 0. + stencilxyz[pos][0] = 0; + stencilxyz[pos][1] = 0; + stencilxyz[pos][2] = 0; + stencil[pos++] = 0; + + // Subphase 0: upper right front bins (red) for (k = 0; k <= sz; k++) - for (j = -sy; j <= sy; j++) - for (i = -sx; i <= sx; i++) - if (k > 0 || j > 0 || (j == 0 && i > 0)) - if (bin_distance(i,j,k) < cutneighmaxsq) + for (j = 0; j <= sy; j++) + for (i = 0; i <= sx; i++) + if (k > 0 || j > 0 || i > 0) // skip the centroid + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } - nstencil_half = pos; // record where normal half stencil ends - - // include additional bins for AIR ghosts only - - for (k = -sz; k < 0; k++) - for (j = -sy; j <= sy; j++) - for (i = -sx; i <= sx; i++) - if (bin_distance(i,j,k) < cutneighmaxsq) + nstencil_ssa[1] = pos; + // Subphase 1: upper left front bins (light blue) + for (k = 0; k <= sz; k++) + for (j = 1; j <= sy; j++) + for (i = -sx; i < 0; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } - // For k==0, make sure to skip already included bins + nstencil_ssa[2] = pos; + // Subphase 2: lower right front bins (yellow) + for (k = 1; k <= sz; k++) + for (j = -sy; j < 0; j++) + for (i = 0; i <= sx; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; + stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } - k = 0; - for (j = -sy; j <= 0; j++) - for (i = -sx; i <= sx; i++) { - if (j == 0 && i > 0) continue; - if (bin_distance(i,j,k) < cutneighmaxsq) - stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; - } + nstencil_ssa[3] = pos; + // Subphase 3: lower left front bins (blue) + for (k = 1; k <= sz; k++) + for (j = -sy; j <= 0; j++) + for (i = -sx; i < 0; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; + stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } + + nstencil_ssa[4] = pos; // record end of half stencil + // Now include additional bins for AIR ghosts, and impure-to-pure locals + // Subphase 4: upper right back bins (pink) + for (k = -sz; k < 0; k++) + for (j = 0; j <= sy; j++) + for (i = 0; i <= sx; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; + stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } + + // nstencil_ssa[5] = pos; + // Subphase 5: upper left back bins (light green) + for (k = -sz; k < 0; k++) + for (j = 1; j <= sy; j++) + for (i = -sx; i < 0; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; + stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } + + // nstencil_ssa[6] = pos; + // Subphase 6: lower right back bins (white) + for (k = -sz; k <= 0; k++) + for (j = -sy; j < 0; j++) + for (i = 0; i <= sx; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; + stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } + + // nstencil_ssa[7] = pos; + // Subphase 7: lower left back bins (purple) + for (k = -sz; k <= 0; k++) + for (j = -sy; j <= 0; j++) + for (i = -sx; i < 0; i++) + if (bin_distance(i,j,k) < cutneighmaxsq) { + stencilxyz[pos][0] = i; + stencilxyz[pos][1] = j; + stencilxyz[pos][2] = k; + stencil[pos++] = k*mbiny*mbinx + j*mbinx + i; + } + //nstencil_ssa[8] = pos; nstencil = pos; // record where full stencil ends } diff --git a/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.h b/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.h index 7765b256d3..450a696e46 100644 --- a/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.h +++ b/src/USER-DPD/nstencil_half_bin_3d_newton_ssa.h @@ -15,7 +15,7 @@ NStencilStyle(half/bin/3d/newton/ssa, NStencilHalfBin3dNewtonSSA, - NS_HALF | NS_BIN | NS_3D | NS_NEWTON | NS_SSA | NS_ORTHO) + NS_HALF | NS_BIN | NS_3D | NS_NEWTON | NS_SSA | NS_ORTHO | NS_GHOST) #else diff --git a/src/USER-DPD/nstencil_ssa.h b/src/USER-DPD/nstencil_ssa.h index 9fcd19ee26..f6f91fefde 100644 --- a/src/USER-DPD/nstencil_ssa.h +++ b/src/USER-DPD/nstencil_ssa.h @@ -20,11 +20,12 @@ namespace LAMMPS_NS { class NStencilSSA : public NStencil { public: - NStencilSSA(class LAMMPS *lmp) : NStencil(lmp) { } + NStencilSSA(class LAMMPS *lmp) : NStencil(lmp) { xyzflag = 1; } ~NStencilSSA() {} virtual void create() = 0; - int nstencil_half; // where the half stencil ends + // first stencil index for each subphase, with last index at end + int nstencil_ssa[5]; }; } diff --git a/src/USER-DPD/pair_dpd_fdt.cpp b/src/USER-DPD/pair_dpd_fdt.cpp index 26f5806cf1..95908c556d 100644 --- a/src/USER-DPD/pair_dpd_fdt.cpp +++ b/src/USER-DPD/pair_dpd_fdt.cpp @@ -316,18 +316,17 @@ void PairDPDfdt::init_style() if (comm->ghost_velocity == 0) error->all(FLERR,"Pair dpd/fdt requires ghost atoms store velocity"); - // if newton off, forces between atoms ij will be double computed - // using different random numbers - - if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR, - "Pair dpd/fdt requires newton pair on"); - splitFDT_flag = false; int irequest = neighbor->request(this,instance_me); for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"shardlow") == 0){ + if (strncmp(modify->fix[i]->style,"shardlow", 8) == 0){ splitFDT_flag = true; } + + // if newton off, forces between atoms ij will be double computed + // using different random numbers if splitFDT_flag is false + if (!splitFDT_flag && (force->newton_pair == 0) && (comm->me == 0)) error->warning(FLERR, + "Pair dpd/fdt requires newton pair on if not also using fix shardlow"); } /* ---------------------------------------------------------------------- diff --git a/src/USER-DPD/pair_dpd_fdt.h b/src/USER-DPD/pair_dpd_fdt.h index 5c20f2fc8f..84b09b0fa2 100644 --- a/src/USER-DPD/pair_dpd_fdt.h +++ b/src/USER-DPD/pair_dpd_fdt.h @@ -44,11 +44,11 @@ class PairDPDfdt : public Pair { double **sigma; double temperature; + int seed; class RanMars *random; protected: double cut_global; - int seed; bool splitFDT_flag; bool a0_is_zero; diff --git a/src/USER-DPD/pair_dpd_fdt_energy.cpp b/src/USER-DPD/pair_dpd_fdt_energy.cpp index c3fc7fb3f5..32ac456b0f 100644 --- a/src/USER-DPD/pair_dpd_fdt_energy.cpp +++ b/src/USER-DPD/pair_dpd_fdt_energy.cpp @@ -55,6 +55,8 @@ PairDPDfdtEnergy::PairDPDfdtEnergy(LAMMPS *lmp) : Pair(lmp) PairDPDfdtEnergy::~PairDPDfdtEnergy() { + if (copymode) return; + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); @@ -403,19 +405,18 @@ void PairDPDfdtEnergy::init_style() if (comm->ghost_velocity == 0) error->all(FLERR,"Pair dpd/fdt/energy requires ghost atoms store velocity"); - // if newton off, forces between atoms ij will be double computed - // using different random numbers - - if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR, - "Pair dpd/fdt/energy requires newton pair on"); - splitFDT_flag = false; int irequest = neighbor->request(this,instance_me); for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"shardlow") == 0){ + if (strncmp(modify->fix[i]->style,"shardlow", 8) == 0){ splitFDT_flag = true; } + // if newton off, forces between atoms ij will be double computed + // using different random numbers if splitFDT_flag is false + if (!splitFDT_flag && (force->newton_pair == 0) && (comm->me == 0)) error->warning(FLERR, + "Pair dpd/fdt/energy requires newton pair on if not also using fix shardlow"); + bool eos_flag = false; for (int i = 0; i < modify->nfix; i++) if (strncmp(modify->fix[i]->style,"eos",3) == 0) eos_flag = true; diff --git a/src/USER-DPD/pair_dpd_fdt_energy.h b/src/USER-DPD/pair_dpd_fdt_energy.h index 84ab28aca4..dce39f83f0 100644 --- a/src/USER-DPD/pair_dpd_fdt_energy.h +++ b/src/USER-DPD/pair_dpd_fdt_energy.h @@ -31,8 +31,8 @@ class PairDPDfdtEnergy : public Pair { virtual void compute(int, int); virtual void settings(int, char **); virtual void coeff(int, char **); - void init_style(); - double init_one(int, int); + virtual void init_style(); + virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); virtual void write_restart_settings(FILE *); @@ -46,15 +46,15 @@ class PairDPDfdtEnergy : public Pair { double **sigma,**kappa; double *duCond,*duMech; + int seed; class RanMars *random; protected: double cut_global; - int seed; bool splitFDT_flag; bool a0_is_zero; - void allocate(); + virtual void allocate(); }; diff --git a/src/USER-DPD/pair_exp6_rx.cpp b/src/USER-DPD/pair_exp6_rx.cpp index 61b62efc53..8b6fc9beed 100644 --- a/src/USER-DPD/pair_exp6_rx.cpp +++ b/src/USER-DPD/pair_exp6_rx.cpp @@ -84,11 +84,15 @@ PairExp6rx::PairExp6rx(LAMMPS *lmp) : Pair(lmp) PairExp6rx::~PairExp6rx() { - for (int i=0; i < nparams; ++i) { - delete[] params[i].name; - delete[] params[i].potential; + if (copymode) return; + + if (params != NULL) { + for (int i=0; i < nparams; ++i) { + delete[] params[i].name; + delete[] params[i].potential; + } + memory->destroy(params); } - memory->destroy(params); memory->destroy(mol2param); if (allocated) { diff --git a/src/USER-DPD/pair_exp6_rx.h b/src/USER-DPD/pair_exp6_rx.h index 33bd6e6623..45c046cc07 100644 --- a/src/USER-DPD/pair_exp6_rx.h +++ b/src/USER-DPD/pair_exp6_rx.h @@ -30,13 +30,21 @@ class PairExp6rx : public Pair { virtual ~PairExp6rx(); virtual void compute(int, int); void settings(int, char **); - void coeff(int, char **); + virtual void coeff(int, char **); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); + struct Param { + double epsilon,rm,alpha; + int ispecies; + char *name, *potential; // names of unique molecules and interaction type + char *tablename; // name of interaction table + int potentialType; // enumerated interaction potential type. + }; + protected: enum{LINEAR}; enum{NONE,EXPONENT,POLYNOMIAL}; @@ -45,21 +53,14 @@ class PairExp6rx : public Pair { double **epsilon,**rm,**alpha; double **rminv,**buck1,**buck2,**offset; - void allocate(); + virtual void allocate(); int *mol2param; // mapping from molecule to parameters int nparams; // # of stored parameter sets int maxparam; // max # of parameter sets - struct Param { - double epsilon,rm,alpha; - int ispecies; - char *name, *potential; // names of unique molecules and interaction type - char *tablename; // name of interaction table - int potentialType; // enumerated interaction potential type. - }; Param *params; // parameter set for an I-J-K interaction int nspecies; - void read_file(char *); + virtual void read_file(char *); void read_file2(char *); void setup(); diff --git a/src/USER-DPD/pair_multi_lucy_rx.cpp b/src/USER-DPD/pair_multi_lucy_rx.cpp index 43d4114741..4628edbc12 100644 --- a/src/USER-DPD/pair_multi_lucy_rx.cpp +++ b/src/USER-DPD/pair_multi_lucy_rx.cpp @@ -85,6 +85,8 @@ PairMultiLucyRX::PairMultiLucyRX(LAMMPS *lmp) : Pair(lmp), PairMultiLucyRX::~PairMultiLucyRX() { + if (copymode) return; + for (int m = 0; m < ntables; m++) free_table(&tables[m]); memory->sfree(tables); diff --git a/src/USER-DPD/pair_multi_lucy_rx.h b/src/USER-DPD/pair_multi_lucy_rx.h index 092f40f1d1..2bfa5d20e3 100644 --- a/src/USER-DPD/pair_multi_lucy_rx.h +++ b/src/USER-DPD/pair_multi_lucy_rx.h @@ -30,17 +30,17 @@ class PairMultiLucyRX : public Pair { virtual ~PairMultiLucyRX(); virtual void compute(int, int); - void settings(int, char **); + virtual void settings(int, char **); void coeff(int, char **); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); - int pack_forward_comm(int, int *, double *, int, int *); - void unpack_forward_comm(int, int, double *); - int pack_reverse_comm(int, int, double *); - void unpack_reverse_comm(int, int *, double *); + virtual int pack_forward_comm(int, int *, double *, int, int *); + virtual void unpack_forward_comm(int, int, double *); + virtual int pack_reverse_comm(int, int, double *); + virtual void unpack_reverse_comm(int, int *, double *); void computeLocalDensity(); double rho_0; @@ -64,7 +64,7 @@ class PairMultiLucyRX : public Pair { int **tabindex; - void allocate(); + virtual void allocate(); void read_table(Table *, char *, char *); void param_extract(Table *, char *); void bcast_table(Table *); diff --git a/src/USER-DPD/pair_table_rx.cpp b/src/USER-DPD/pair_table_rx.cpp index 2529d33f91..89d09e7322 100644 --- a/src/USER-DPD/pair_table_rx.cpp +++ b/src/USER-DPD/pair_table_rx.cpp @@ -33,8 +33,6 @@ using namespace LAMMPS_NS; enum{NONE,RLINEAR,RSQ,BMP}; -#define MAXLINE 1024 - #ifdef DBL_EPSILON #define MY_EPSILON (10.0*DBL_EPSILON) #else @@ -46,25 +44,19 @@ enum{NONE,RLINEAR,RSQ,BMP}; /* ---------------------------------------------------------------------- */ -PairTableRX::PairTableRX(LAMMPS *lmp) : Pair(lmp) +PairTableRX::PairTableRX(LAMMPS *lmp) : PairTable(lmp) { - ntables = 0; - tables = NULL; fractionalWeighting = true; + site1 = NULL; + site2 = NULL; } /* ---------------------------------------------------------------------- */ PairTableRX::~PairTableRX() { - for (int m = 0; m < ntables; m++) free_table(&tables[m]); - memory->sfree(tables); - - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(tabindex); - } + delete [] site1; + delete [] site2; } /* ---------------------------------------------------------------------- */ @@ -252,24 +244,6 @@ void PairTableRX::compute(int eflag, int vflag) memory->destroy(mixWtSite2); } -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairTableRX::allocate() -{ - allocated = 1; - const int nt = atom->ntypes + 1; - - memory->create(setflag,nt,nt,"pair:setflag"); - memory->create(cutsq,nt,nt,"pair:cutsq"); - memory->create(tabindex,nt,nt,"pair:tabindex"); - - memset(&setflag[0][0],0,nt*nt*sizeof(int)); - memset(&cutsq[0][0],0,nt*nt*sizeof(double)); - memset(&tabindex[0][0],0,nt*nt*sizeof(int)); -} - /* ---------------------------------------------------------------------- global settings ------------------------------------------------------------------------- */ @@ -299,8 +273,8 @@ void PairTableRX::settings(int narg, char **arg) else if (strcmp(arg[iarg],"msm") == 0) msmflag = 1; else if (strcmp(arg[iarg],"dispersion") == 0) dispersionflag = 1; else if (strcmp(arg[iarg],"tip4p") == 0) tip4pflag = 1; - else if (strcmp(arg[iarg],"fractional") == 0) fractionalWeighting = true; - else if (strcmp(arg[iarg],"molecular") == 0) fractionalWeighting = false; + else if (strcmp(arg[iarg],"fractional") == 0) fractionalWeighting = true; + else if (strcmp(arg[iarg],"molecular") == 0) fractionalWeighting = false; else error->all(FLERR,"Illegal pair_style command"); iarg++; } @@ -462,602 +436,6 @@ void PairTableRX::coeff(int narg, char **arg) } -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairTableRX::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - - tabindex[j][i] = tabindex[i][j]; - - return tables[tabindex[i][j]].cut; -} - -/* ---------------------------------------------------------------------- - read a table section from a tabulated potential file - only called by proc 0 - this function sets these values in Table: - ninput,rfile,efile,ffile,rflag,rlo,rhi,fpflag,fplo,fphi,ntablebits -------------------------------------------------------------------------- */ - -void PairTableRX::read_table(Table *tb, char *file, char *keyword) -{ - char line[MAXLINE]; - - // open file - - FILE *fp = force->open_potential(file); - if (fp == NULL) { - char str[128]; - sprintf(str,"Cannot open file %s",file); - error->one(FLERR,str); - } - - // loop until section found with matching keyword - - while (1) { - if (fgets(line,MAXLINE,fp) == NULL) - error->one(FLERR,"Did not find keyword in table file"); - if (strspn(line," \t\n\r") == strlen(line)) continue; // blank line - if (line[0] == '#') continue; // comment - char *word = strtok(line," \t\n\r"); - if (strcmp(word,keyword) == 0) break; // matching keyword - fgets(line,MAXLINE,fp); // no match, skip section - param_extract(tb,line); - fgets(line,MAXLINE,fp); - for (int i = 0; i < tb->ninput; i++) fgets(line,MAXLINE,fp); - } - - // read args on 2nd line of section - // allocate table arrays for file values - - fgets(line,MAXLINE,fp); - param_extract(tb,line); - memory->create(tb->rfile,tb->ninput,"pair:rfile"); - memory->create(tb->efile,tb->ninput,"pair:efile"); - memory->create(tb->ffile,tb->ninput,"pair:ffile"); - - // setup bitmap parameters for table to read in - - tb->ntablebits = 0; - int masklo,maskhi,nmask,nshiftbits; - if (tb->rflag == BMP) { - while (1 << tb->ntablebits < tb->ninput) tb->ntablebits++; - if (1 << tb->ntablebits != tb->ninput) - error->one(FLERR,"Bitmapped table is incorrect length in table file"); - init_bitmap(tb->rlo,tb->rhi,tb->ntablebits,masklo,maskhi,nmask,nshiftbits); - } - - // read r,e,f table values from file - // if rflag set, compute r - // if rflag not set, use r from file - - int itmp; - double rtmp; - union_int_float_t rsq_lookup; - - fgets(line,MAXLINE,fp); - for (int i = 0; i < tb->ninput; i++) { - fgets(line,MAXLINE,fp); - sscanf(line,"%d %lg %lg %lg",&itmp,&rtmp,&tb->efile[i],&tb->ffile[i]); - - if (tb->rflag == RLINEAR) - rtmp = tb->rlo + (tb->rhi - tb->rlo)*i/(tb->ninput-1); - else if (tb->rflag == RSQ) { - rtmp = tb->rlo*tb->rlo + - (tb->rhi*tb->rhi - tb->rlo*tb->rlo)*i/(tb->ninput-1); - rtmp = sqrt(rtmp); - } else if (tb->rflag == BMP) { - rsq_lookup.i = i << nshiftbits; - rsq_lookup.i |= masklo; - if (rsq_lookup.f < tb->rlo*tb->rlo) { - rsq_lookup.i = i << nshiftbits; - rsq_lookup.i |= maskhi; - } - rtmp = sqrtf(rsq_lookup.f); - } - - tb->rfile[i] = rtmp; - } - - // close file - - fclose(fp); -} - -/* ---------------------------------------------------------------------- - broadcast read-in table info from proc 0 to other procs - this function communicates these values in Table: - ninput,rfile,efile,ffile,rflag,rlo,rhi,fpflag,fplo,fphi -------------------------------------------------------------------------- */ - -void PairTableRX::bcast_table(Table *tb) -{ - MPI_Bcast(&tb->ninput,1,MPI_INT,0,world); - - int me; - MPI_Comm_rank(world,&me); - if (me > 0) { - memory->create(tb->rfile,tb->ninput,"pair:rfile"); - memory->create(tb->efile,tb->ninput,"pair:efile"); - memory->create(tb->ffile,tb->ninput,"pair:ffile"); - } - - MPI_Bcast(tb->rfile,tb->ninput,MPI_DOUBLE,0,world); - MPI_Bcast(tb->efile,tb->ninput,MPI_DOUBLE,0,world); - MPI_Bcast(tb->ffile,tb->ninput,MPI_DOUBLE,0,world); - - MPI_Bcast(&tb->rflag,1,MPI_INT,0,world); - if (tb->rflag) { - MPI_Bcast(&tb->rlo,1,MPI_DOUBLE,0,world); - MPI_Bcast(&tb->rhi,1,MPI_DOUBLE,0,world); - } - MPI_Bcast(&tb->fpflag,1,MPI_INT,0,world); - if (tb->fpflag) { - MPI_Bcast(&tb->fplo,1,MPI_DOUBLE,0,world); - MPI_Bcast(&tb->fphi,1,MPI_DOUBLE,0,world); - } -} - -/* ---------------------------------------------------------------------- - build spline representation of e,f over entire range of read-in table - this function sets these values in Table: e2file,f2file -------------------------------------------------------------------------- */ - -void PairTableRX::spline_table(Table *tb) -{ - memory->create(tb->e2file,tb->ninput,"pair:e2file"); - memory->create(tb->f2file,tb->ninput,"pair:f2file"); - - double ep0 = - tb->ffile[0]; - double epn = - tb->ffile[tb->ninput-1]; - spline(tb->rfile,tb->efile,tb->ninput,ep0,epn,tb->e2file); - - if (tb->fpflag == 0) { - tb->fplo = (tb->ffile[1] - tb->ffile[0]) / (tb->rfile[1] - tb->rfile[0]); - tb->fphi = (tb->ffile[tb->ninput-1] - tb->ffile[tb->ninput-2]) / - (tb->rfile[tb->ninput-1] - tb->rfile[tb->ninput-2]); - } - - double fp0 = tb->fplo; - double fpn = tb->fphi; - spline(tb->rfile,tb->ffile,tb->ninput,fp0,fpn,tb->f2file); -} - -/* ---------------------------------------------------------------------- - extract attributes from parameter line in table section - format of line: N value R/RSQ/BITMAP lo hi FP fplo fphi - N is required, other params are optional -------------------------------------------------------------------------- */ - -void PairTableRX::param_extract(Table *tb, char *line) -{ - tb->ninput = 0; - tb->rflag = NONE; - tb->fpflag = 0; - - char *word = strtok(line," \t\n\r\f"); - while (word) { - if (strcmp(word,"N") == 0) { - word = strtok(NULL," \t\n\r\f"); - tb->ninput = atoi(word); - } else if (strcmp(word,"R") == 0 || strcmp(word,"RSQ") == 0 || - strcmp(word,"BITMAP") == 0) { - if (strcmp(word,"R") == 0) tb->rflag = RLINEAR; - else if (strcmp(word,"RSQ") == 0) tb->rflag = RSQ; - else if (strcmp(word,"BITMAP") == 0) tb->rflag = BMP; - word = strtok(NULL," \t\n\r\f"); - tb->rlo = atof(word); - word = strtok(NULL," \t\n\r\f"); - tb->rhi = atof(word); - } else if (strcmp(word,"FP") == 0) { - tb->fpflag = 1; - word = strtok(NULL," \t\n\r\f"); - tb->fplo = atof(word); - word = strtok(NULL," \t\n\r\f"); - tb->fphi = atof(word); - } else { - printf("WORD: %s\n",word); - error->one(FLERR,"Invalid keyword in pair table parameters"); - } - word = strtok(NULL," \t\n\r\f"); - } - - if (tb->ninput == 0) error->one(FLERR,"Pair table parameters did not set N"); -} - -/* ---------------------------------------------------------------------- - compute r,e,f vectors from splined values -------------------------------------------------------------------------- */ - -void PairTableRX::compute_table(Table *tb) -{ - int tlm1 = tablength-1; - - // inner = inner table bound - // cut = outer table bound - // delta = table spacing in rsq for N-1 bins - - double inner; - if (tb->rflag) inner = tb->rlo; - else inner = tb->rfile[0]; - tb->innersq = double(inner)*double(inner); - tb->delta = double(tb->cut*tb->cut - double(tb->innersq)) / double(tlm1); - tb->invdelta = 1.0/double(tb->delta); - - // direct lookup tables - // N-1 evenly spaced bins in rsq from inner to cut - // e,f = value at midpt of bin - // e,f are N-1 in length since store 1 value at bin midpt - // f is converted to f/r when stored in f[i] - // e,f are never a match to read-in values, always computed via spline interp - - if (tabstyle == LOOKUP) { - memory->create(tb->e,tlm1,"pair:e"); - memory->create(tb->f,tlm1,"pair:f"); - - double r,rsq; - for (int i = 0; i < tlm1; i++) { - rsq = tb->innersq + (i+0.5)*tb->delta; - r = sqrt(rsq); - tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r); - tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r; - } - } - - // linear tables - // N-1 evenly spaced bins in rsq from inner to cut - // rsq,e,f = value at lower edge of bin - // de,df values = delta from lower edge to upper edge of bin - // rsq,e,f are N in length so de,df arrays can compute difference - // f is converted to f/r when stored in f[i] - // e,f can match read-in values, else compute via spline interp - - if (tabstyle == LINEAR) { - memory->create(tb->rsq,tablength,"pair:rsq"); - memory->create(tb->e,tablength,"pair:e"); - memory->create(tb->f,tablength,"pair:f"); - memory->create(tb->de,tlm1,"pair:de"); - memory->create(tb->df,tlm1,"pair:df"); - - double r,rsq; - for (int i = 0; i < tablength; i++) { - rsq = tb->innersq + i*tb->delta; - r = sqrt(rsq); - tb->rsq[i] = rsq; - if (tb->match) { - tb->e[i] = tb->efile[i]; - tb->f[i] = tb->ffile[i]/r; - } else { - tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r); - tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r; - } - } - - for (int i = 0; i < tlm1; i++) { - tb->de[i] = tb->e[i+1] - tb->e[i]; - tb->df[i] = tb->f[i+1] - tb->f[i]; - } - } - - // cubic spline tables - // N-1 evenly spaced bins in rsq from inner to cut - // rsq,e,f = value at lower edge of bin - // e2,f2 = spline coefficient for each bin - // rsq,e,f,e2,f2 are N in length so have N-1 spline bins - // f is converted to f/r after e is splined - // e,f can match read-in values, else compute via spline interp - - if (tabstyle == SPLINE) { - memory->create(tb->rsq,tablength,"pair:rsq"); - memory->create(tb->e,tablength,"pair:e"); - memory->create(tb->f,tablength,"pair:f"); - memory->create(tb->e2,tablength,"pair:e2"); - memory->create(tb->f2,tablength,"pair:f2"); - - tb->deltasq6 = tb->delta*tb->delta / 6.0; - - double r,rsq; - for (int i = 0; i < tablength; i++) { - rsq = tb->innersq + i*tb->delta; - r = sqrt(rsq); - tb->rsq[i] = rsq; - if (tb->match) { - tb->e[i] = tb->efile[i]; - tb->f[i] = tb->ffile[i]/r; - } else { - tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r); - tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r); - } - } - - // ep0,epn = dh/dg at inner and at cut - // h(r) = e(r) and g(r) = r^2 - // dh/dg = (de/dr) / 2r = -f/2r - - double ep0 = - tb->f[0] / (2.0 * sqrt(tb->innersq)); - double epn = - tb->f[tlm1] / (2.0 * tb->cut); - spline(tb->rsq,tb->e,tablength,ep0,epn,tb->e2); - - // fp0,fpn = dh/dg at inner and at cut - // h(r) = f(r)/r and g(r) = r^2 - // dh/dg = (1/r df/dr - f/r^2) / 2r - // dh/dg in secant approx = (f(r2)/r2 - f(r1)/r1) / (g(r2) - g(r1)) - - double fp0,fpn; - double secant_factor = 0.1; - if (tb->fpflag) fp0 = (tb->fplo/sqrt(tb->innersq) - tb->f[0]/tb->innersq) / - (2.0 * sqrt(tb->innersq)); - else { - double rsq1 = tb->innersq; - double rsq2 = rsq1 + secant_factor*tb->delta; - fp0 = (splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,sqrt(rsq2)) / - sqrt(rsq2) - tb->f[0] / sqrt(rsq1)) / (secant_factor*tb->delta); - } - - if (tb->fpflag && tb->cut == tb->rfile[tb->ninput-1]) fpn = - (tb->fphi/tb->cut - tb->f[tlm1]/(tb->cut*tb->cut)) / (2.0 * tb->cut); - else { - double rsq2 = tb->cut * tb->cut; - double rsq1 = rsq2 - secant_factor*tb->delta; - fpn = (tb->f[tlm1] / sqrt(rsq2) - - splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,sqrt(rsq1)) / - sqrt(rsq1)) / (secant_factor*tb->delta); - } - - for (int i = 0; i < tablength; i++) tb->f[i] /= sqrt(tb->rsq[i]); - spline(tb->rsq,tb->f,tablength,fp0,fpn,tb->f2); - } - - // bitmapped linear tables - // 2^N bins from inner to cut, spaced in bitmapped manner - // f is converted to f/r when stored in f[i] - // e,f can match read-in values, else compute via spline interp - - if (tabstyle == BITMAP) { - double r; - union_int_float_t rsq_lookup; - int masklo,maskhi; - - // linear lookup tables of length ntable = 2^n - // stored value = value at lower edge of bin - - init_bitmap(inner,tb->cut,tablength,masklo,maskhi,tb->nmask,tb->nshiftbits); - int ntable = 1 << tablength; - int ntablem1 = ntable - 1; - - memory->create(tb->rsq,ntable,"pair:rsq"); - memory->create(tb->e,ntable,"pair:e"); - memory->create(tb->f,ntable,"pair:f"); - memory->create(tb->de,ntable,"pair:de"); - memory->create(tb->df,ntable,"pair:df"); - memory->create(tb->drsq,ntable,"pair:drsq"); - - union_int_float_t minrsq_lookup; - minrsq_lookup.i = 0 << tb->nshiftbits; - minrsq_lookup.i |= maskhi; - - for (int i = 0; i < ntable; i++) { - rsq_lookup.i = i << tb->nshiftbits; - rsq_lookup.i |= masklo; - if (rsq_lookup.f < tb->innersq) { - rsq_lookup.i = i << tb->nshiftbits; - rsq_lookup.i |= maskhi; - } - r = sqrtf(rsq_lookup.f); - tb->rsq[i] = rsq_lookup.f; - if (tb->match) { - tb->e[i] = tb->efile[i]; - tb->f[i] = tb->ffile[i]/r; - } else { - tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r); - tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r; - } - minrsq_lookup.f = MIN(minrsq_lookup.f,rsq_lookup.f); - } - - tb->innersq = minrsq_lookup.f; - - for (int i = 0; i < ntablem1; i++) { - tb->de[i] = tb->e[i+1] - tb->e[i]; - tb->df[i] = tb->f[i+1] - tb->f[i]; - tb->drsq[i] = 1.0/(tb->rsq[i+1] - tb->rsq[i]); - } - - // get the delta values for the last table entries - // tables are connected periodically between 0 and ntablem1 - - tb->de[ntablem1] = tb->e[0] - tb->e[ntablem1]; - tb->df[ntablem1] = tb->f[0] - tb->f[ntablem1]; - tb->drsq[ntablem1] = 1.0/(tb->rsq[0] - tb->rsq[ntablem1]); - - // get the correct delta values at itablemax - // smallest r is in bin itablemin - // largest r is in bin itablemax, which is itablemin-1, - // or ntablem1 if itablemin=0 - - // deltas at itablemax only needed if corresponding rsq < cut*cut - // if so, compute deltas between rsq and cut*cut - // if tb->match, data at cut*cut is unavailable, so we'll take - // deltas at itablemax-1 as a good approximation - - double e_tmp,f_tmp; - int itablemin = minrsq_lookup.i & tb->nmask; - itablemin >>= tb->nshiftbits; - int itablemax = itablemin - 1; - if (itablemin == 0) itablemax = ntablem1; - int itablemaxm1 = itablemax - 1; - if (itablemax == 0) itablemaxm1 = ntablem1; - rsq_lookup.i = itablemax << tb->nshiftbits; - rsq_lookup.i |= maskhi; - if (rsq_lookup.f < tb->cut*tb->cut) { - if (tb->match) { - tb->de[itablemax] = tb->de[itablemaxm1]; - tb->df[itablemax] = tb->df[itablemaxm1]; - tb->drsq[itablemax] = tb->drsq[itablemaxm1]; - } else { - rsq_lookup.f = tb->cut*tb->cut; - r = sqrtf(rsq_lookup.f); - e_tmp = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r); - f_tmp = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r; - tb->de[itablemax] = e_tmp - tb->e[itablemax]; - tb->df[itablemax] = f_tmp - tb->f[itablemax]; - tb->drsq[itablemax] = 1.0/(rsq_lookup.f - tb->rsq[itablemax]); - } - } - } -} - -/* ---------------------------------------------------------------------- - set all ptrs in a table to NULL, so can be freed safely -------------------------------------------------------------------------- */ - -void PairTableRX::null_table(Table *tb) -{ - tb->rfile = tb->efile = tb->ffile = NULL; - tb->e2file = tb->f2file = NULL; - tb->rsq = tb->drsq = tb->e = tb->de = NULL; - tb->f = tb->df = tb->e2 = tb->f2 = NULL; -} - -/* ---------------------------------------------------------------------- - free all arrays in a table -------------------------------------------------------------------------- */ - -void PairTableRX::free_table(Table *tb) -{ - memory->destroy(tb->rfile); - memory->destroy(tb->efile); - memory->destroy(tb->ffile); - memory->destroy(tb->e2file); - memory->destroy(tb->f2file); - - memory->destroy(tb->rsq); - memory->destroy(tb->drsq); - memory->destroy(tb->e); - memory->destroy(tb->de); - memory->destroy(tb->f); - memory->destroy(tb->df); - memory->destroy(tb->e2); - memory->destroy(tb->f2); -} - -/* ---------------------------------------------------------------------- - spline and splint routines modified from Numerical Recipes -------------------------------------------------------------------------- */ - -void PairTableRX::spline(double *x, double *y, int n, - double yp1, double ypn, double *y2) -{ - int i,k; - double p,qn,sig,un; - double *u = new double[n]; - - if (yp1 > 0.99e30) y2[0] = u[0] = 0.0; - else { - y2[0] = -0.5; - u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0]) / (x[1]-x[0]) - yp1); - } - for (i = 1; i < n-1; i++) { - sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]); - p = sig*y2[i-1] + 2.0; - y2[i] = (sig-1.0) / p; - u[i] = (y[i+1]-y[i]) / (x[i+1]-x[i]) - (y[i]-y[i-1]) / (x[i]-x[i-1]); - u[i] = (6.0*u[i] / (x[i+1]-x[i-1]) - sig*u[i-1]) / p; - } - if (ypn > 0.99e30) qn = un = 0.0; - else { - qn = 0.5; - un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2]) / (x[n-1]-x[n-2])); - } - y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2] + 1.0); - for (k = n-2; k >= 0; k--) y2[k] = y2[k]*y2[k+1] + u[k]; - - delete [] u; -} - -/* ---------------------------------------------------------------------- */ - -double PairTableRX::splint(double *xa, double *ya, double *y2a, int n, double x) -{ - int klo,khi,k; - double h,b,a,y; - - klo = 0; - khi = n-1; - while (khi-klo > 1) { - k = (khi+klo) >> 1; - if (xa[k] > x) khi = k; - else klo = k; - } - h = xa[khi]-xa[klo]; - a = (xa[khi]-x) / h; - b = (x-xa[klo]) / h; - y = a*ya[klo] + b*ya[khi] + - ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0; - return y; -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairTableRX::write_restart(FILE *fp) -{ - write_restart_settings(fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairTableRX::read_restart(FILE *fp) -{ - read_restart_settings(fp); - allocate(); -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairTableRX::write_restart_settings(FILE *fp) -{ - fwrite(&tabstyle,sizeof(int),1,fp); - fwrite(&tablength,sizeof(int),1,fp); - fwrite(&ewaldflag,sizeof(int),1,fp); - fwrite(&pppmflag,sizeof(int),1,fp); - fwrite(&msmflag,sizeof(int),1,fp); - fwrite(&dispersionflag,sizeof(int),1,fp); - fwrite(&tip4pflag,sizeof(int),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairTableRX::read_restart_settings(FILE *fp) -{ - if (comm->me == 0) { - fread(&tabstyle,sizeof(int),1,fp); - fread(&tablength,sizeof(int),1,fp); - fread(&ewaldflag,sizeof(int),1,fp); - fread(&pppmflag,sizeof(int),1,fp); - fread(&msmflag,sizeof(int),1,fp); - fread(&dispersionflag,sizeof(int),1,fp); - fread(&tip4pflag,sizeof(int),1,fp); - } - MPI_Bcast(&tabstyle,1,MPI_INT,0,world); - MPI_Bcast(&tablength,1,MPI_INT,0,world); - MPI_Bcast(&ewaldflag,1,MPI_INT,0,world); - MPI_Bcast(&pppmflag,1,MPI_INT,0,world); - MPI_Bcast(&msmflag,1,MPI_INT,0,world); - MPI_Bcast(&dispersionflag,1,MPI_INT,0,world); - MPI_Bcast(&tip4pflag,1,MPI_INT,0,world); -} - /* ---------------------------------------------------------------------- */ double PairTableRX::single(int i, int j, int itype, int jtype, double rsq, @@ -1129,26 +507,6 @@ double PairTableRX::single(int i, int j, int itype, int jtype, double rsq, return factor_lj*phi; } -/* ---------------------------------------------------------------------- - return the Coulomb cutoff for tabled potentials - called by KSpace solvers which require that all pairwise cutoffs be the same - loop over all tables not just those indexed by tabindex[i][j] since - no way to know which tables are active since pair::init() not yet called -------------------------------------------------------------------------- */ - -void *PairTableRX::extract(const char *str, int &dim) -{ - if (strcmp(str,"cut_coul") != 0) return NULL; - if (ntables == 0) error->all(FLERR,"All pair coeffs are not set"); - - double cut_coul = tables[0].cut; - for (int m = 1; m < ntables; m++) - if (tables[m].cut != cut_coul) - error->all(FLERR,"Pair table cutoffs must all be equal to use with KSpace"); - dim = 0; - return &tables[0].cut; -} - /* ---------------------------------------------------------------------- */ void PairTableRX::getMixingWeights(int id, double &mixWtSite1old, double &mixWtSite2old, double &mixWtSite1, double &mixWtSite2) diff --git a/src/USER-DPD/pair_table_rx.h b/src/USER-DPD/pair_table_rx.h index 34b9fd75ce..da7889e99a 100644 --- a/src/USER-DPD/pair_table_rx.h +++ b/src/USER-DPD/pair_table_rx.h @@ -20,11 +20,11 @@ PairStyle(table/rx,PairTableRX) #ifndef LMP_PAIR_TABLE_RX_H #define LMP_PAIR_TABLE_RX_H -#include "pair.h" +#include "pair_table.h" namespace LAMMPS_NS { -class PairTableRX : public Pair { +class PairTableRX : public PairTable { public: PairTableRX(class LAMMPS *); virtual ~PairTableRX(); @@ -32,42 +32,9 @@ class PairTableRX : public Pair { virtual void compute(int, int); void settings(int, char **); void coeff(int, char **); - double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - double single(int, int, int, int, double, double, double, double &); - void *extract(const char *, int &); + virtual double single(int, int, int, int, double, double, double, double &); protected: - enum{LOOKUP,LINEAR,SPLINE,BITMAP}; - - int tabstyle,tablength; - struct Table { - int ninput,rflag,fpflag,match,ntablebits; - int nshiftbits,nmask; - double rlo,rhi,fplo,fphi,cut; - double *rfile,*efile,*ffile; - double *e2file,*f2file; - double innersq,delta,invdelta,deltasq6; - double *rsq,*drsq,*e,*de,*f,*df,*e2,*f2; - }; - int ntables; - Table *tables; - - int **tabindex; - - void allocate(); - void read_table(Table *, char *, char *); - void param_extract(Table *, char *); - void bcast_table(Table *); - void spline_table(Table *); - void compute_table(Table *); - void null_table(Table *); - void free_table(Table *); - void spline(double *, double *, int, double, double, double *); - double splint(double *, double *, double *, int, double); int nspecies; char *site1, *site2; diff --git a/src/USER-DPD/random_external_state.h b/src/USER-DPD/random_external_state.h new file mode 100644 index 0000000000..d97d5a17ce --- /dev/null +++ b/src/USER-DPD/random_external_state.h @@ -0,0 +1,179 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ +/* + This random_external_state.h file was derrived from the Kokkos + file algorithms/src/Kokkos_Random.hpp and adapted to work + without Kokkos installed, as well as being converted to a form + that has no internal state. All RNG state information is kept + outside this "class", and is passed in by reference by the caller. + */ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 2.0 +// Copyright (2014) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// 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 SANDIA CORPORATION "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 SANDIA CORPORATION 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 H. Carter Edwards (hcedwar@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef LMP_RANDOM_EXTERNALSTATE_H +#define LMP_RANDOM_EXTERNALSTATE_H + +#include +#include "accelerator_kokkos.h" + +#ifdef LMP_KOKKOS +#define RND_INLINE KOKKOS_INLINE_FUNCTION +#else +#define RND_INLINE inline +#endif + + +/// \file random_external_state.h +/// \brief Pseudorandom number generators +/// +/// These generators are based on Vigna, Sebastiano (2014). "An +/// experimental exploration of Marsaglia's xorshift generators, +/// scrambled." See: http://arxiv.org/abs/1402.6246 + +// A replacement for the Kokkos Random_XorShift64 class that uses +// an external state variable, instead of a class member variable. +namespace random_external_state { + typedef uint64_t es_RNG_t; + + enum {MAX_URAND = 0xffffffffU}; + enum {MAX_URAND64 = 0xffffffffffffffffULL-1}; + + RND_INLINE + uint32_t es_urand(es_RNG_t &state_) { + state_ ^= state_ >> 12; + state_ ^= state_ << 25; + state_ ^= state_ >> 27; + + es_RNG_t tmp = state_ * 2685821657736338717ULL; + tmp = tmp>>16; + return static_cast(tmp&MAX_URAND); + } + + RND_INLINE + uint64_t es_urand64(es_RNG_t &state_) { + state_ ^= state_ >> 12; + state_ ^= state_ << 25; + state_ ^= state_ >> 27; + return (state_ * 2685821657736338717ULL) - 1; + } + + RND_INLINE + int es_rand(es_RNG_t &state_) { + return static_cast(es_urand(state_)/2); + } + + RND_INLINE + double es_drand(es_RNG_t &state_) { + return 1.0 * es_urand64(state_)/MAX_URAND64; + } + + //Marsaglia polar method for drawing a standard normal distributed random number + RND_INLINE + double es_normal(es_RNG_t &state_) { + double S, U; + do { + U = 2.0*es_drand(state_) - 1.0; + const double V = 2.0*es_drand(state_) - 1.0; + S = U*U+V*V; + } while ((S >= 1.0) || (S == 0.0)); + return U*sqrt(-2.0*log(S)/S); + } + + RND_INLINE + double es_normalPair(es_RNG_t &state_, double &second) { + double S, U, V; + do { + U = 2.0*es_drand(state_) - 1.0; + V = 2.0*es_drand(state_) - 1.0; + S = U*U+V*V; + } while ((S >= 1.0) || (S == 0.0)); + const double fac = sqrt(-2.0*log(S)/S); + second = V*fac; + return U*fac; + } + + // Use es_init() to init a serial RNG, that is then + // used to generate the initial state of your k parallel + // RNGs with k calls to genNextParallelState() + RND_INLINE + void es_init(es_RNG_t &serial_state, uint64_t seed) { + if(seed==0) seed = uint64_t(1318319); + serial_state = seed; + for(int i = 0; i < 17; i++) es_rand(serial_state); + } + + // Call genNextParallelState() once for each RNG to generate + // the initial state for that RNG. + RND_INLINE + void es_genNextParallelState(es_RNG_t &serial_state, es_RNG_t &new_state) { + int n1 = es_rand(serial_state); + int n2 = es_rand(serial_state); + int n3 = es_rand(serial_state); + int n4 = es_rand(serial_state); + new_state = ((((static_cast(n1)) & 0xffff)<<00) | + (((static_cast(n2)) & 0xffff)<<16) | + (((static_cast(n3)) & 0xffff)<<32) | + (((static_cast(n4)) & 0xffff)<<48)); + } +} + +#endif + +/* ERROR/WARNING messages: + +E: Invalid seed for Marsaglia random # generator + +The initial seed for this random number generator must be a positive +integer less than or equal to 900 million. + +*/ diff --git a/src/USER-DRUDE/README b/src/USER-DRUDE/README index e2d91a671e..0b4913ca5d 100644 --- a/src/USER-DRUDE/README +++ b/src/USER-DRUDE/README @@ -16,6 +16,6 @@ There are example scripts for using this package in examples/USER/drude. The person who created this package is Alain Dequidt at the Chemistry Institute of Clermont-Ferrand, Clermont University, France -(alain.dequidt at univ-bpclermont.fr). Contact him directly if you -have questions. Co-authors: Julien Devémy, Agilio Padua. +(alain.dequidt at uca.fr). Contact him directly if you have questions. +Co-authors: Julien Devémy, Agilio Padua. diff --git a/src/USER-DRUDE/fix_drude.cpp b/src/USER-DRUDE/fix_drude.cpp index 894757baa0..a38f9f1e66 100644 --- a/src/USER-DRUDE/fix_drude.cpp +++ b/src/USER-DRUDE/fix_drude.cpp @@ -355,7 +355,7 @@ void FixDrude::rebuild_special(){ } if (atom->maxspecial < nspecmax) { char str[1024]; - sprintf(str, "Not enough space in special: special_bonds extra should be at least %d", nspecmax - nspecmax_old); + sprintf(str, "Not enough space in special: extra/special/per/atom should be at least %d", nspecmax - nspecmax_old); error->all(FLERR, str); } diff --git a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp index ee9c0744d3..f78ced3d8b 100644 --- a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp +++ b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp @@ -32,6 +32,8 @@ #include "math_const.h" #include "memory.h" #include "error.h" +#include "modify.h" +#include "domain.h" using namespace LAMMPS_NS; using namespace MathConst; @@ -378,19 +380,6 @@ void PairLJCutTholeLong::init_style() if (ncoultablebits) init_tables(cut_coul,cut_respa); } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCutTholeLong::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/USER-DRUDE/pair_lj_cut_thole_long.h b/src/USER-DRUDE/pair_lj_cut_thole_long.h index 894042f6ce..27a917c737 100644 --- a/src/USER-DRUDE/pair_lj_cut_thole_long.h +++ b/src/USER-DRUDE/pair_lj_cut_thole_long.h @@ -34,7 +34,6 @@ class PairLJCutTholeLong : public Pair { virtual void settings(int, char **); void coeff(int, char **); virtual void init_style(); - void init_list(int, class NeighList *); virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/USER-DRUDE/pair_thole.cpp b/src/USER-DRUDE/pair_thole.cpp index abb37b82b7..ace119ce52 100644 --- a/src/USER-DRUDE/pair_thole.cpp +++ b/src/USER-DRUDE/pair_thole.cpp @@ -25,6 +25,8 @@ #include "error.h" #include "fix.h" #include "fix_store.h" +#include "domain.h" +#include "modify.h" using namespace LAMMPS_NS; diff --git a/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp b/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp index d8bfd698be..06285a58d3 100644 --- a/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_charmm_coul_long_soft.cpp @@ -226,10 +226,10 @@ void PairLJCharmmCoulLongSoft::compute_inner() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -315,10 +315,10 @@ void PairLJCharmmCoulLongSoft::compute_middle() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -428,10 +428,10 @@ void PairLJCharmmCoulLongSoft::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -758,19 +758,6 @@ void PairLJCharmmCoulLongSoft::init_style() g_ewald = force->kspace->g_ewald; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCharmmCoulLongSoft::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/USER-FEP/pair_lj_charmm_coul_long_soft.h b/src/USER-FEP/pair_lj_charmm_coul_long_soft.h index 7e52ec54b5..252c9f66f5 100644 --- a/src/USER-FEP/pair_lj_charmm_coul_long_soft.h +++ b/src/USER-FEP/pair_lj_charmm_coul_long_soft.h @@ -33,7 +33,6 @@ class PairLJCharmmCoulLongSoft : public Pair { void settings(int, char **); void coeff(int, char **); void init_style(); - void init_list(int, class NeighList *); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp b/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp index f7c4084fe2..7be2ebabea 100644 --- a/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp @@ -209,10 +209,10 @@ void PairLJCutCoulLongSoft::compute_inner() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -299,10 +299,10 @@ void PairLJCutCoulLongSoft::compute_middle() int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -403,10 +403,10 @@ void PairLJCutCoulLongSoft::compute_outer(int eflag, int vflag) int newton_pair = force->newton_pair; double qqrd2e = force->qqrd2e; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -686,19 +686,6 @@ void PairLJCutCoulLongSoft::init_style() g_ewald = force->kspace->g_ewald; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCutCoulLongSoft::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/USER-FEP/pair_lj_cut_coul_long_soft.h b/src/USER-FEP/pair_lj_cut_coul_long_soft.h index a03be3814a..d49d1c8641 100644 --- a/src/USER-FEP/pair_lj_cut_coul_long_soft.h +++ b/src/USER-FEP/pair_lj_cut_coul_long_soft.h @@ -32,7 +32,6 @@ class PairLJCutCoulLongSoft : public Pair { virtual void settings(int, char **); void coeff(int, char **); virtual void init_style(); - void init_list(int, class NeighList *); virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/USER-FEP/pair_lj_cut_soft.cpp b/src/USER-FEP/pair_lj_cut_soft.cpp index 8b6280a61a..9ae108fa33 100644 --- a/src/USER-FEP/pair_lj_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_soft.cpp @@ -164,10 +164,10 @@ void PairLJCutSoft::compute_inner() double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -242,10 +242,10 @@ void PairLJCutSoft::compute_middle() double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -333,10 +333,10 @@ void PairLJCutSoft::compute_outer(int eflag, int vflag) double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -556,19 +556,6 @@ void PairLJCutSoft::init_style() } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCutSoft::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/USER-FEP/pair_lj_cut_soft.h b/src/USER-FEP/pair_lj_cut_soft.h index 50ce685e5c..46202d78a8 100644 --- a/src/USER-FEP/pair_lj_cut_soft.h +++ b/src/USER-FEP/pair_lj_cut_soft.h @@ -32,7 +32,6 @@ class PairLJCutSoft : public Pair { virtual void settings(int, char **); void coeff(int, char **); virtual void init_style(); - void init_list(int, class NeighList *); virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/USER-INTEL/Install.sh b/src/USER-INTEL/Install.sh index 736059aa06..da553d158a 100644 --- a/src/USER-INTEL/Install.sh +++ b/src/USER-INTEL/Install.sh @@ -26,13 +26,15 @@ action () { # do not install child files if parent does not exist for file in *_intel.cpp; do - dep=`echo $file | sed 's/neigh_full_intel/neigh_full/g' | \ - sed 's/_offload_intel//g' | sed 's/_intel//g'` + dep=`echo $file | sed -e 's/verlet_lrt_intel/pppm/g' \ + -e 's/neigh_full_intel/neigh_full/g' \ + -e 's/_offload_intel//g' -e 's/_intel//g'` action $file $dep done for file in *_intel.h; do - dep=`echo $file | sed 's/_offload_intel//g' | sed 's/_intel//g'` + dep=`echo $file | sed -e 's/verlet_lrt_intel/pppm/g' \ + -e 's/_offload_intel//g' -e 's/_intel//g'` action $file $dep done @@ -44,10 +46,9 @@ action nbin_intel.h action nbin_intel.cpp action npair_intel.h action npair_intel.cpp -action intel_simd.h pair_sw_intel.cpp +action intel_simd.h action intel_intrinsics.h pair_tersoff_intel.cpp -action verlet_lrt_intel.h pppm.cpp -action verlet_lrt_intel.cpp pppm.cpp +action intel_intrinsics_airebo.h pair_airebo_intel.cpp # step 2: handle cases and tasks not handled in step 1. diff --git a/src/USER-INTEL/README b/src/USER-INTEL/README index c02014d0ce..871d881f39 100644 --- a/src/USER-INTEL/README +++ b/src/USER-INTEL/README @@ -4,9 +4,9 @@ -------------------------------- W. Michael Brown (Intel) michael.w.brown at intel.com + Markus Hohnerbach (RWTH Aachen University) William McDoniel (RWTH Aachen University) Rodrigo Canales (RWTH Aachen University) - Markus H�hnerbach (RWTH Aachen University) Stan Moore (Sandia) Ahmed E. Ismail (RWTH Aachen University) Paolo Bientinesi (RWTH Aachen University) @@ -30,28 +30,37 @@ be added or changed in the Makefile depending on the version: 2017 update 2 - No changes needed 2017 updates 3 or 4 - Use -xCOMMON-AVX512 and not -xHost or -xCORE-AVX512 -2018 or newer - Use -xHost or -xCORE-AVX512 and -qopt-zmm-usage=high +2018 inital release - Use -xCOMMON-AVX512 and not -xHost or -xCORE-AVX512 +2018u1 or newer - Use -xHost or -xCORE-AVX512 and -qopt-zmm-usage=high ----------------------------------------------------------------------------- When using the suffix command with "intel", intel styles will be used if they exist. If the suffix command is used with "hybrid intel omp" and the USER-OMP -USER-OMP styles will be used whenever USER-INTEL styles are not available. This -allow for running most styles in LAMMPS with threading. +is installed, USER-OMP styles will be used whenever USER-INTEL styles are not +available. This allow for running most styles in LAMMPS with threading. ----------------------------------------------------------------------------- -The Long-Range Thread mode (LRT) in the Intel package currently uses -pthreads by default. If pthreads are not supported in the build environment, -the compile flag "-DLMP_INTEL_NOLRT" will disable the feature to allow for -builds without pthreads. Alternatively, "-DLMP_INTEL_LRT11" can be used to -build with compilers that support threads using the C++11 standard. When using +The Long-Range Thread mode (LRT) in the Intel package is enabled through the +-DLMP_INTEL_USELRT define at compile time. All intel optimized makefiles +include this define. This feature will use pthreads by default. +Alternatively, "-DLMP_INTEL_LRT11" can be used to build with compilers that +support threads intrinsically using the C++11 standard. When using LRT mode, you might need to disable OpenMP affinity settings (e.g. export KMP_AFFINITY=none). LAMMPS will generate a warning if the settings need to be changed. ----------------------------------------------------------------------------- +Unless Intel Math Kernel Library (MKL) is unavailable, -DLMP_USE_MKL_RNG +should be added to the compile flags. This will enable using the MKL Mersenne +Twister random number generator (RNG) for Dissipative Particle Dynamics +(DPD). This RNG can allow significantly faster performance and it also has a +significantly longer period than the standard RNG for DPD. + +----------------------------------------------------------------------------- + In order to use offload to Intel(R) Xeon Phi(TM) coprocessors, the flag -DLMP_INTEL_OFFLOAD should be set in the Makefile. Offload requires the use of Intel compilers. diff --git a/src/USER-INTEL/TEST/README b/src/USER-INTEL/TEST/README index 758c37bf56..62602d5920 100644 --- a/src/USER-INTEL/TEST/README +++ b/src/USER-INTEL/TEST/README @@ -8,6 +8,8 @@ # in.intel.sw - Silicon benchmark with Stillinger-Weber # in.intel.tersoff - Silicon benchmark with Tersoff # in.intel.water - Coarse-grain water benchmark using Stillinger-Weber +# in.intel.airebo - Polyethelene benchmark with AIREBO +# in.intel.dpd - Dissipative Particle Dynamics # ############################################################################# @@ -15,15 +17,17 @@ # Expected Timesteps/second with turbo on and HT enabled, LAMMPS June-2017 # - Compiled w/ Intel Parallel Studio 2017u2 and Makefile.intel_cpu_intelmpi # -# Xeon E5-2697v4 Xeon Phi 7250 +# Xeon E5-2697v4 Xeon Phi 7250 Xeon Gold 6148 # -# in.intel.lj - 199.5 282.3 -# in.intel.rhodo - 12.4 17.5 -# in.intel.lc - 19.0 25.7 -# in.intel.eam - 59.4 92.8 -# in.intel.sw - 132.4 161.9 -# in.intel.tersoff - 83.3 101.1 -# in.intel.water - 53.4 90.3 +# in.intel.lj - 199.5 282.3 317.3 +# in.intel.rhodo - 12.4 17.5 24.4 +# in.intel.lc - 19.0 25.7 26.8 +# in.intel.eam - 59.4 92.8 105.6 +# in.intel.sw - 132.4 161.9 213.8 +# in.intel.tersoff - 83.3 101.1 109.6 +# in.intel.water - 53.4 90.3 105.5 +# in.intel.airebo - 7.3 11.8 17.6 +# in.intel.dpd - 74.5 100.4 148.1 # ############################################################################# diff --git a/src/USER-INTEL/TEST/in.intel.airebo b/src/USER-INTEL/TEST/in.intel.airebo new file mode 100644 index 0000000000..fcd8af4707 --- /dev/null +++ b/src/USER-INTEL/TEST/in.intel.airebo @@ -0,0 +1,47 @@ +# AIREBO polyethelene benchmark + +variable N index on # Newton Setting +variable w index 10 # Warmup Timesteps +variable t index 550 # Main Run Timesteps +variable m index 1 # Main Run Timestep Multiplier +variable n index 0 # Use NUMA Mapping for Multi-Node +variable p index 0 # Use Power Measurement +variable x index 4 +variable y index 2 +variable z index 2 + +variable xx equal 17*$x +variable yy equal 16*$y +variable zz equal 2*$z +variable rr equal floor($t*$m) +variable root getenv LMP_ROOT + +newton $N +if "$n > 0" then "processors * * * grid numa" + +variable root getenv LMP_ROOT + +units metal +atom_style atomic + +read_data ${root}/examples/airebo/data.airebo + +replicate ${xx} ${yy} ${zz} + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style airebo 3.0 1 1 +pair_coeff * * ${root}/potentials/CH.airebo C H + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 50 + +if "$p > 0" then "run_style verlet/power" + +if "$w > 0" then "run $w" +run ${rr} diff --git a/src/USER-INTEL/TEST/in.intel.dpd b/src/USER-INTEL/TEST/in.intel.dpd new file mode 100644 index 0000000000..e257d91f84 --- /dev/null +++ b/src/USER-INTEL/TEST/in.intel.dpd @@ -0,0 +1,48 @@ +# DPD benchmark + +variable N index on # Newton Setting +variable w index 10 # Warmup Timesteps +variable t index 4000 # Main Run Timesteps +variable m index 1 # Main Run Timestep Multiplier +variable n index 0 # Use NUMA Mapping for Multi-Node +variable p index 0 # Use Power Measurement + +variable x index 4 +variable y index 2 +variable z index 2 + +variable xx equal 20*$x +variable yy equal 20*$y +variable zz equal 20*$z +variable rr equal floor($t*$m) + +newton $N +if "$n > 0" then "processors * * * grid numa" + +units lj +atom_style atomic +comm_modify mode single vel yes + +lattice fcc 3.0 +region box block 0 ${xx} 0 ${yy} 0 ${zz} +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 1.0 87287 loop geom + +pair_style dpd 1.0 1.0 928948 +pair_coeff 1 1 25.0 4.5 + +neighbor 0.5 bin +neigh_modify delay 0 every 1 + +fix 1 all nve +timestep 0.04 + +thermo 1000 + +if "$p > 0" then "run_style verlet/power" + +if "$w > 0" then "run $w" +run ${rr} diff --git a/src/USER-INTEL/TEST/in.intel.eam b/src/USER-INTEL/TEST/in.intel.eam index 5a3b3064af..6486b22ee9 100644 --- a/src/USER-INTEL/TEST/in.intel.eam +++ b/src/USER-INTEL/TEST/in.intel.eam @@ -5,7 +5,6 @@ variable w index 10 # Warmup Timesteps variable t index 3100 # Main Run Timesteps variable m index 1 # Main Run Timestep Multiplier variable n index 0 # Use NUMA Mapping for Multi-Node -variable b index 3 # Neighbor binsize variable p index 0 # Use Power Measurement variable x index 4 diff --git a/src/USER-INTEL/TEST/in.intel.rhodo b/src/USER-INTEL/TEST/in.intel.rhodo index 05145d79c0..7ce7eb4452 100644 --- a/src/USER-INTEL/TEST/in.intel.rhodo +++ b/src/USER-INTEL/TEST/in.intel.rhodo @@ -5,7 +5,6 @@ variable w index 10 # Warmup Timesteps variable t index 520 # Main Run Timesteps variable m index 1 # Main Run Timestep Multiplier variable n index 0 # Use NUMA Mapping for Multi-Node -variable b index 3 # Neighbor binsize variable p index 0 # Use Power Measurement variable c index 0 # 1 to use collectives for PPPM variable d index 1 # 1 to use 'diff ad' for PPPM diff --git a/src/USER-INTEL/angle_charmm_intel.cpp b/src/USER-INTEL/angle_charmm_intel.cpp index d55afd4742..bcaecb4696 100644 --- a/src/USER-INTEL/angle_charmm_intel.cpp +++ b/src/USER-INTEL/angle_charmm_intel.cpp @@ -23,6 +23,7 @@ #include "domain.h" #include "comm.h" #include "force.h" +#include "modify.h" #include "math_const.h" #include "memory.h" #include "suffix.h" @@ -336,7 +337,7 @@ void AngleCharmmIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->nangletypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.fc[i].k = k[i]; fc.fc[i].theta0 = theta0[i]; fc.fc[i].k_ub = k_ub[i]; diff --git a/src/USER-INTEL/angle_harmonic_intel.cpp b/src/USER-INTEL/angle_harmonic_intel.cpp index 47e0add690..ffc81c496d 100644 --- a/src/USER-INTEL/angle_harmonic_intel.cpp +++ b/src/USER-INTEL/angle_harmonic_intel.cpp @@ -23,6 +23,7 @@ #include "domain.h" #include "comm.h" #include "force.h" +#include "modify.h" #include "math_const.h" #include "memory.h" #include "suffix.h" @@ -318,7 +319,7 @@ void AngleHarmonicIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->nangletypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.fc[i].k = k[i]; fc.fc[i].theta0 = theta0[i]; } diff --git a/src/USER-INTEL/bond_fene_intel.cpp b/src/USER-INTEL/bond_fene_intel.cpp index bb96135b2d..004a2e5413 100644 --- a/src/USER-INTEL/bond_fene_intel.cpp +++ b/src/USER-INTEL/bond_fene_intel.cpp @@ -19,6 +19,7 @@ #include #include "bond_fene_intel.h" #include "atom.h" +#include "modify.h" #include "neighbor.h" #include "domain.h" #include "comm.h" @@ -295,7 +296,7 @@ void BondFENEIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->nbondtypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.fc[i].k = k[i]; fc.fc[i].ir0sq = 1.0 / (r0[i] * r0[i]); fc.fc[i].sigma = sigma[i]; diff --git a/src/USER-INTEL/bond_harmonic_intel.cpp b/src/USER-INTEL/bond_harmonic_intel.cpp index beb0ebcdda..0c714edc09 100644 --- a/src/USER-INTEL/bond_harmonic_intel.cpp +++ b/src/USER-INTEL/bond_harmonic_intel.cpp @@ -19,6 +19,7 @@ #include #include "bond_harmonic_intel.h" #include "atom.h" +#include "modify.h" #include "neighbor.h" #include "domain.h" #include "comm.h" @@ -266,7 +267,7 @@ void BondHarmonicIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->nbondtypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.fc[i].k = k[i]; fc.fc[i].r0 = r0[i]; } diff --git a/src/USER-INTEL/dihedral_charmm_intel.cpp b/src/USER-INTEL/dihedral_charmm_intel.cpp index 715cef4d37..c8429dc8ff 100644 --- a/src/USER-INTEL/dihedral_charmm_intel.cpp +++ b/src/USER-INTEL/dihedral_charmm_intel.cpp @@ -21,6 +21,7 @@ #include "atom.h" #include "comm.h" #include "memory.h" +#include "modify.h" #include "neighbor.h" #include "domain.h" #include "force.h" @@ -942,8 +943,8 @@ void DihedralCharmmIntel::pack_force_const(ForceConst &fc, buffers->set_ntypes(tp1); if (weightflag) { - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { fc.ljp[i][j].lj1 = lj14_1[i][j]; fc.ljp[i][j].lj2 = lj14_2[i][j]; fc.ljp[i][j].lj3 = lj14_3[i][j]; @@ -952,7 +953,7 @@ void DihedralCharmmIntel::pack_force_const(ForceConst &fc, } } - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.bp[i].multiplicity = multiplicity[i]; fc.bp[i].cos_shift = cos_shift[i]; fc.bp[i].sin_shift = sin_shift[i]; diff --git a/src/USER-INTEL/dihedral_fourier_intel.cpp b/src/USER-INTEL/dihedral_fourier_intel.cpp new file mode 100644 index 0000000000..772ea5b02f --- /dev/null +++ b/src/USER-INTEL/dihedral_fourier_intel.cpp @@ -0,0 +1,442 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: W. Michael Brown (Intel) +------------------------------------------------------------------------- */ + +#include +#include +#include "dihedral_fourier_intel.h" +#include "atom.h" +#include "comm.h" +#include "memory.h" +#include "modify.h" +#include "neighbor.h" +#include "domain.h" +#include "force.h" +#include "pair.h" +#include "update.h" +#include "error.h" + +#include "suffix.h" +using namespace LAMMPS_NS; + +#define PTOLERANCE (flt_t)1.05 +#define MTOLERANCE (flt_t)-1.05 +typedef struct { int a,b,c,d,t; } int5_t; + +/* ---------------------------------------------------------------------- */ + +DihedralFourierIntel::DihedralFourierIntel(class LAMMPS *lmp) + : DihedralFourier(lmp) +{ + suffix_flag |= Suffix::INTEL; +} + +/* ---------------------------------------------------------------------- */ + +void DihedralFourierIntel::compute(int eflag, int vflag) +{ + #ifdef _LMP_INTEL_OFFLOAD + if (_use_base) { + DihedralFourier::compute(eflag, vflag); + return; + } + #endif + + if (fix->precision() == FixIntel::PREC_MODE_MIXED) + compute(eflag, vflag, fix->get_mixed_buffers(), + force_const_single); + else if (fix->precision() == FixIntel::PREC_MODE_DOUBLE) + compute(eflag, vflag, fix->get_double_buffers(), + force_const_double); + else + compute(eflag, vflag, fix->get_single_buffers(), + force_const_single); +} + +/* ---------------------------------------------------------------------- */ + +template +void DihedralFourierIntel::compute(int eflag, int vflag, + IntelBuffers *buffers, + const ForceConst &fc) +{ + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = 0; + + if (evflag) { + if (vflag && !eflag) { + if (force->newton_bond) + eval<0,1,1>(vflag, buffers, fc); + else + eval<0,1,0>(vflag, buffers, fc); + } else { + if (force->newton_bond) + eval<1,1,1>(vflag, buffers, fc); + else + eval<1,1,0>(vflag, buffers, fc); + } + } else { + if (force->newton_bond) + eval<0,0,1>(vflag, buffers, fc); + else + eval<0,0,0>(vflag, buffers, fc); + } +} + +template +void DihedralFourierIntel::eval(const int vflag, + IntelBuffers *buffers, + const ForceConst &fc) + +{ + const int inum = neighbor->ndihedrallist; + if (inum == 0) return; + + ATOM_T * _noalias const x = buffers->get_x(0); + const int nlocal = atom->nlocal; + const int nall = nlocal + atom->nghost; + + int f_stride; + if (NEWTON_BOND) f_stride = buffers->get_stride(nall); + else f_stride = buffers->get_stride(nlocal); + + int tc; + FORCE_T * _noalias f_start; + acc_t * _noalias ev_global; + IP_PRE_get_buffers(0, buffers, fix, tc, f_start, ev_global); + const int nthreads = tc; + + acc_t oedihedral, ov0, ov1, ov2, ov3, ov4, ov5; + if (EFLAG) oedihedral = (acc_t)0.0; + if (VFLAG && vflag) { + ov0 = ov1 = ov2 = ov3 = ov4 = ov5 = (acc_t)0.0; + } + + #if defined(_OPENMP) + #pragma omp parallel default(none) \ + shared(f_start,f_stride,fc) \ + reduction(+:oedihedral,ov0,ov1,ov2,ov3,ov4,ov5) + #endif + { + int nfrom, npl, nto, tid; + #ifdef LMP_INTEL_USE_SIMDOFF + IP_PRE_omp_range_id(nfrom, nto, tid, inum, nthreads); + #else + IP_PRE_omp_stride_id(nfrom, npl, nto, tid, inum, nthreads); + #endif + + FORCE_T * _noalias const f = f_start + (tid * f_stride); + if (fix->need_zero(tid)) + memset(f, 0, f_stride * sizeof(FORCE_T)); + + const int5_t * _noalias const dihedrallist = + (int5_t *) neighbor->dihedrallist[0]; + + #ifdef LMP_INTEL_USE_SIMDOFF + acc_t sedihedral, sv0, sv1, sv2, sv3, sv4, sv5; + if (EFLAG) sedihedral = (acc_t)0.0; + if (VFLAG && vflag) { + sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; + } + #pragma simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) + for (int n = nfrom; n < nto; n ++) { + #else + for (int n = nfrom; n < nto; n += npl) { + #endif + const int i1 = dihedrallist[n].a; + const int i2 = dihedrallist[n].b; + const int i3 = dihedrallist[n].c; + const int i4 = dihedrallist[n].d; + const int type = dihedrallist[n].t; + + // 1st bond + + const flt_t vb1x = x[i1].x - x[i2].x; + const flt_t vb1y = x[i1].y - x[i2].y; + const flt_t vb1z = x[i1].z - x[i2].z; + + // 2nd bond + + const flt_t vb2xm = x[i2].x - x[i3].x; + const flt_t vb2ym = x[i2].y - x[i3].y; + const flt_t vb2zm = x[i2].z - x[i3].z; + + // 3rd bond + + const flt_t vb3x = x[i4].x - x[i3].x; + const flt_t vb3y = x[i4].y - x[i3].y; + const flt_t vb3z = x[i4].z - x[i3].z; + + // c,s calculation + + const flt_t ax = vb1y*vb2zm - vb1z*vb2ym; + const flt_t ay = vb1z*vb2xm - vb1x*vb2zm; + const flt_t az = vb1x*vb2ym - vb1y*vb2xm; + const flt_t bx = vb3y*vb2zm - vb3z*vb2ym; + const flt_t by = vb3z*vb2xm - vb3x*vb2zm; + const flt_t bz = vb3x*vb2ym - vb3y*vb2xm; + + const flt_t rasq = ax*ax + ay*ay + az*az; + const flt_t rbsq = bx*bx + by*by + bz*bz; + const flt_t rgsq = vb2xm*vb2xm + vb2ym*vb2ym + vb2zm*vb2zm; + const flt_t rg = sqrt(rgsq); + + flt_t rginv, ra2inv, rb2inv; + rginv = ra2inv = rb2inv = (flt_t)0.0; + if (rg > 0) rginv = (flt_t)1.0/rg; + if (rasq > 0) ra2inv = (flt_t)1.0/rasq; + if (rbsq > 0) rb2inv = (flt_t)1.0/rbsq; + const flt_t rabinv = sqrt(ra2inv*rb2inv); + + flt_t c = (ax*bx + ay*by + az*bz)*rabinv; + const flt_t s = rg*rabinv*(ax*vb3x + ay*vb3y + az*vb3z); + + // error check + #ifndef LMP_INTEL_USE_SIMDOFF + if (c > PTOLERANCE || c < MTOLERANCE) { + int me = comm->me; + + if (screen) { + char str[128]; + sprintf(str,"Dihedral problem: %d/%d " BIGINT_FORMAT " " + TAGINT_FORMAT " " TAGINT_FORMAT " " + TAGINT_FORMAT " " TAGINT_FORMAT, + me,tid,update->ntimestep, + atom->tag[i1],atom->tag[i2],atom->tag[i3],atom->tag[i4]); + error->warning(FLERR,str,0); + fprintf(screen," 1st atom: %d %g %g %g\n", + me,x[i1].x,x[i1].y,x[i1].z); + fprintf(screen," 2nd atom: %d %g %g %g\n", + me,x[i2].x,x[i2].y,x[i2].z); + fprintf(screen," 3rd atom: %d %g %g %g\n", + me,x[i3].x,x[i3].y,x[i3].z); + fprintf(screen," 4th atom: %d %g %g %g\n", + me,x[i4].x,x[i4].y,x[i4].z); + } + } + #endif + + if (c > (flt_t)1.0) c = (flt_t)1.0; + if (c < (flt_t)-1.0) c = (flt_t)-1.0; + + flt_t deng; + flt_t df = (flt_t)0.0; + if (EFLAG) deng = (flt_t)0.0; + + for (int j = 0; j < nterms[type]; j++) { + const flt_t tcos_shift = fc.bp[j][type].cos_shift; + const flt_t tsin_shift = fc.bp[j][type].sin_shift; + const flt_t tk = fc.bp[j][type].k; + const int m = fc.bp[j][type].multiplicity; + + flt_t p = (flt_t)1.0; + flt_t ddf1, df1; + ddf1 = df1 = (flt_t)0.0; + + for (int i = 0; i < m; i++) { + ddf1 = p*c - df1*s; + df1 = p*s + df1*c; + p = ddf1; + } + + p = p*tcos_shift + df1*tsin_shift; + df1 = df1*tcos_shift - ddf1*tsin_shift; + df1 *= -m; + p += (flt_t)1.0; + + if (m == 0) { + p = (flt_t)1.0 + tcos_shift; + df1 = (flt_t)0.0; + } + + if (EFLAG) deng += tk * p; + df -= tk * df1; + } + + const flt_t fg = vb1x*vb2xm + vb1y*vb2ym + vb1z*vb2zm; + const flt_t hg = vb3x*vb2xm + vb3y*vb2ym + vb3z*vb2zm; + const flt_t fga = fg*ra2inv*rginv; + const flt_t hgb = hg*rb2inv*rginv; + const flt_t gaa = -ra2inv*rg; + const flt_t gbb = rb2inv*rg; + + const flt_t dtfx = gaa*ax; + const flt_t dtfy = gaa*ay; + const flt_t dtfz = gaa*az; + const flt_t dtgx = fga*ax - hgb*bx; + const flt_t dtgy = fga*ay - hgb*by; + const flt_t dtgz = fga*az - hgb*bz; + const flt_t dthx = gbb*bx; + const flt_t dthy = gbb*by; + const flt_t dthz = gbb*bz; + + const flt_t sx2 = df*dtgx; + const flt_t sy2 = df*dtgy; + const flt_t sz2 = df*dtgz; + + flt_t f1x = df*dtfx; + flt_t f1y = df*dtfy; + flt_t f1z = df*dtfz; + + const flt_t f2x = sx2 - f1x; + const flt_t f2y = sy2 - f1y; + const flt_t f2z = sz2 - f1z; + + flt_t f4x = df*dthx; + flt_t f4y = df*dthy; + flt_t f4z = df*dthz; + + const flt_t f3x = -sx2 - f4x; + const flt_t f3y = -sy2 - f4y; + const flt_t f3z = -sz2 - f4z; + + if (EFLAG || VFLAG) { + #ifdef LMP_INTEL_USE_SIMDOFF + IP_PRE_ev_tally_dihed(EFLAG, VFLAG, eatom, vflag, deng, i1, i2, i3, i4, + f1x, f1y, f1z, f3x, f3y, f3z, f4x, f4y, f4z, + vb1x, vb1y, vb1z, -vb2xm, -vb2ym, -vb2zm, vb3x, + vb3y, vb3z, sedihedral, f, NEWTON_BOND, nlocal, + sv0, sv1, sv2, sv3, sv4, sv5); + #else + IP_PRE_ev_tally_dihed(EFLAG, VFLAG, eatom, vflag, deng, i1, i2, i3, i4, + f1x, f1y, f1z, f3x, f3y, f3z, f4x, f4y, f4z, + vb1x, vb1y, vb1z, -vb2xm, -vb2ym, -vb2zm, vb3x, + vb3y, vb3z, oedihedral, f, NEWTON_BOND, nlocal, + ov0, ov1, ov2, ov3, ov4, ov5); + #endif + } + + #ifdef LMP_INTEL_USE_SIMDOFF + #pragma simdoff + #endif + { + if (NEWTON_BOND || i1 < nlocal) { + f[i1].x += f1x; + f[i1].y += f1y; + f[i1].z += f1z; + } + + if (NEWTON_BOND || i2 < nlocal) { + f[i2].x += f2x; + f[i2].y += f2y; + f[i2].z += f2z; + } + + if (NEWTON_BOND || i3 < nlocal) { + f[i3].x += f3x; + f[i3].y += f3y; + f[i3].z += f3z; + } + + if (NEWTON_BOND || i4 < nlocal) { + f[i4].x += f4x; + f[i4].y += f4y; + f[i4].z += f4z; + } + } + } // for n + #ifdef LMP_INTEL_USE_SIMDOFF + if (EFLAG) oedihedral += sedihedral; + if (VFLAG && vflag) { + ov0 += sv0; ov1 += sv1; ov2 += sv2; + ov3 += sv3; ov4 += sv4; ov5 += sv5; + } + #endif + } // omp parallel + + if (EFLAG) energy += oedihedral; + if (VFLAG && vflag) { + virial[0] += ov0; virial[1] += ov1; virial[2] += ov2; + virial[3] += ov3; virial[4] += ov4; virial[5] += ov5; + } + + fix->set_reduce_flag(); +} + +/* ---------------------------------------------------------------------- */ + +void DihedralFourierIntel::init_style() +{ + DihedralFourier::init_style(); + + int ifix = modify->find_fix("package_intel"); + if (ifix < 0) + error->all(FLERR, + "The 'package intel' command is required for /intel styles"); + fix = static_cast(modify->fix[ifix]); + + #ifdef _LMP_INTEL_OFFLOAD + _use_base = 0; + if (fix->offload_balance() != 0.0) { + _use_base = 1; + return; + } + #endif + + fix->bond_init_check(); + + if (fix->precision() == FixIntel::PREC_MODE_MIXED) + pack_force_const(force_const_single, fix->get_mixed_buffers()); + else if (fix->precision() == FixIntel::PREC_MODE_DOUBLE) + pack_force_const(force_const_double, fix->get_double_buffers()); + else + pack_force_const(force_const_single, fix->get_single_buffers()); +} + +/* ---------------------------------------------------------------------- */ + +template +void DihedralFourierIntel::pack_force_const(ForceConst &fc, + IntelBuffers *buffers) +{ + const int bp1 = atom->ndihedraltypes + 1; + fc.set_ntypes(bp1, setflag, nterms, memory); + + for (int i = 1; i < bp1; i++) { + if (setflag[i]) { + for (int j = 0; j < nterms[i]; j++) { + fc.bp[j][i].cos_shift = cos_shift[i][j]; + fc.bp[j][i].sin_shift = sin_shift[i][j]; + fc.bp[j][i].k = k[i][j]; + fc.bp[j][i].multiplicity = multiplicity[i][j]; + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +void DihedralFourierIntel::ForceConst::set_ntypes(const int nbondtypes, + int *setflag, + int *nterms, + Memory *memory) { + if (nbondtypes != _nbondtypes) { + if (_nbondtypes > 0) + _memory->destroy(bp); + + if (nbondtypes > 0) { + _maxnterms = 1; + for (int i = 1; i <= nbondtypes; i++) + if (setflag[i]) _maxnterms = MAX(_maxnterms, nterms[i]); + + _memory->create(bp, _maxnterms, nbondtypes, "dihedralfourierintel.bp"); + } + } + _nbondtypes = nbondtypes; + _memory = memory; +} diff --git a/src/USER-INTEL/dihedral_fourier_intel.h b/src/USER-INTEL/dihedral_fourier_intel.h new file mode 100644 index 0000000000..a775e129f4 --- /dev/null +++ b/src/USER-INTEL/dihedral_fourier_intel.h @@ -0,0 +1,82 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: W. Michael Brown (Intel) +------------------------------------------------------------------------- */ + +#ifdef DIHEDRAL_CLASS + +DihedralStyle(fourier/intel,DihedralFourierIntel) + +#else + +#ifndef LMP_DIHEDRAL_FOURIER_INTEL_H +#define LMP_DIHEDRAL_FOURIER_INTEL_H + +#include "dihedral_fourier.h" +#include "fix_intel.h" + +namespace LAMMPS_NS { + +class DihedralFourierIntel : public DihedralFourier { + + public: + DihedralFourierIntel(class LAMMPS *lmp); + virtual void compute(int, int); + void init_style(); + + private: + FixIntel *fix; + + template class ForceConst; + template + void compute(int eflag, int vflag, IntelBuffers *buffers, + const ForceConst &fc); + template + void eval(const int vflag, IntelBuffers * buffers, + const ForceConst &fc); + template + void pack_force_const(ForceConst &fc, + IntelBuffers *buffers); + + #ifdef _LMP_INTEL_OFFLOAD + int _use_base; + #endif + + template + class ForceConst { + public: + typedef struct { flt_t cos_shift, sin_shift, k; + int multiplicity; } fc_packed1; + + fc_packed1 **bp; + + ForceConst() : _nbondtypes(0) {} + ~ForceConst() { set_ntypes(0, NULL, NULL, NULL); } + + void set_ntypes(const int nbondtypes, int *setflag, int *nterms, + Memory *memory); + + private: + int _nbondtypes, _maxnterms; + Memory *_memory; + }; + ForceConst force_const_single; + ForceConst force_const_double; +}; + +} + +#endif +#endif diff --git a/src/USER-INTEL/dihedral_harmonic_intel.cpp b/src/USER-INTEL/dihedral_harmonic_intel.cpp index 196b024fa6..b35ea4e03a 100644 --- a/src/USER-INTEL/dihedral_harmonic_intel.cpp +++ b/src/USER-INTEL/dihedral_harmonic_intel.cpp @@ -21,6 +21,7 @@ #include "atom.h" #include "comm.h" #include "memory.h" +#include "modify.h" #include "neighbor.h" #include "domain.h" #include "force.h" @@ -400,7 +401,7 @@ void DihedralHarmonicIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->ndihedraltypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.bp[i].multiplicity = multiplicity[i]; fc.bp[i].cos_shift = cos_shift[i]; fc.bp[i].sin_shift = sin_shift[i]; diff --git a/src/USER-INTEL/dihedral_opls_intel.cpp b/src/USER-INTEL/dihedral_opls_intel.cpp index 1abeba1d5e..6b7b2c81eb 100644 --- a/src/USER-INTEL/dihedral_opls_intel.cpp +++ b/src/USER-INTEL/dihedral_opls_intel.cpp @@ -21,6 +21,7 @@ #include "atom.h" #include "comm.h" #include "memory.h" +#include "modify.h" #include "neighbor.h" #include "domain.h" #include "force.h" @@ -427,7 +428,7 @@ void DihedralOPLSIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->ndihedraltypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.bp[i].k1 = k1[i]; fc.bp[i].k2 = k2[i]; fc.bp[i].k3 = k3[i]; diff --git a/src/USER-INTEL/fix_intel.cpp b/src/USER-INTEL/fix_intel.cpp index 637fc0d06e..cac5e0b49c 100644 --- a/src/USER-INTEL/fix_intel.cpp +++ b/src/USER-INTEL/fix_intel.cpp @@ -32,6 +32,11 @@ #include #include #include +#include + +#ifdef LAMMPS_BIGBIG +#error "The USER-INTEL package is not compatible with -DLAMMPS_BIGBIG" +#endif #ifdef _LMP_INTEL_OFFLOAD #ifndef INTEL_OFFLOAD_NOAFFINITY @@ -285,6 +290,7 @@ int FixIntel::setmask() { int mask = 0; mask |= PRE_REVERSE; + mask |= MIN_PRE_REVERSE; #ifdef _LMP_INTEL_OFFLOAD mask |= POST_FORCE; mask |= MIN_POST_FORCE; diff --git a/src/USER-INTEL/fix_intel.h b/src/USER-INTEL/fix_intel.h index 068e5ed890..d7093e79bb 100644 --- a/src/USER-INTEL/fix_intel.h +++ b/src/USER-INTEL/fix_intel.h @@ -43,6 +43,7 @@ class FixIntel : public Fix { virtual int setmask(); virtual void init(); virtual void setup(int); + inline void min_setup(int in) { setup(in); } void setup_pre_reverse(int eflag = 0, int vflag = 0); void pair_init_check(const bool cdmessage=false); @@ -50,6 +51,8 @@ class FixIntel : public Fix { void kspace_init_check(); void pre_reverse(int eflag = 0, int vflag = 0); + inline void min_pre_reverse(int eflag = 0, int vflag = 0) + { pre_reverse(eflag, vflag); } // Get all forces, calculation results from coprocesser void sync_coprocessor(); diff --git a/src/USER-INTEL/improper_cvff_intel.cpp b/src/USER-INTEL/improper_cvff_intel.cpp index dc9765d913..39090e5a74 100644 --- a/src/USER-INTEL/improper_cvff_intel.cpp +++ b/src/USER-INTEL/improper_cvff_intel.cpp @@ -433,7 +433,7 @@ void ImproperCvffIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->nimpropertypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.fc[i].k = k[i]; fc.fc[i].sign = sign[i]; fc.fc[i].multiplicity = multiplicity[i]; diff --git a/src/USER-INTEL/improper_harmonic_intel.cpp b/src/USER-INTEL/improper_harmonic_intel.cpp index fe0efca5ec..3547061672 100644 --- a/src/USER-INTEL/improper_harmonic_intel.cpp +++ b/src/USER-INTEL/improper_harmonic_intel.cpp @@ -389,7 +389,7 @@ void ImproperHarmonicIntel::pack_force_const(ForceConst &fc, const int bp1 = atom->nimpropertypes + 1; fc.set_ntypes(bp1,memory); - for (int i = 0; i < bp1; i++) { + for (int i = 1; i < bp1; i++) { fc.fc[i].k = k[i]; fc.fc[i].chi = chi[i]; } diff --git a/src/USER-INTEL/intel_buffers.cpp b/src/USER-INTEL/intel_buffers.cpp index 3664bc248b..ac208f5a0c 100644 --- a/src/USER-INTEL/intel_buffers.cpp +++ b/src/USER-INTEL/intel_buffers.cpp @@ -30,6 +30,9 @@ IntelBuffers::IntelBuffers(class LAMMPS *lmp_in) : _off_map_listlocal = 0; _ccachex = 0; _ncache_alloc = 0; + _ncachetag = 0; + _cutneighsq = 0; + _cutneighghostsq = 0; #ifdef _LMP_INTEL_OFFLOAD _separate_buffers = 0; _off_f = 0; @@ -406,6 +409,7 @@ void IntelBuffers::grow_ccache(const int off_flag, IP_PRE_get_stride(_ccache_stride3, nsize * 3, sizeof(acc_t), 0); lmp->memory->create(_ccachef, _ccache_stride3 * nt, "_ccachef"); #endif + memset(_ccachei, 0, vsize * sizeof(int)); memset(_ccachej, 0, vsize * sizeof(int)); #ifdef _LMP_INTEL_OFFLOAD @@ -422,7 +426,7 @@ void IntelBuffers::grow_ccache(const int off_flag, #pragma offload_transfer target(mic:_cop) \ nocopy(ccachex,ccachey:length(vsize) alloc_if(1) free_if(0)) \ nocopy(ccachez,ccachew:length(vsize) alloc_if(1) free_if(0)) \ - nocopy(ccachei:length(vsize) alloc_if(1) free_if(0)) \ + in(ccachei:length(vsize) alloc_if(1) free_if(0)) \ in(ccachej:length(vsize) alloc_if(1) free_if(0)) } #ifdef LMP_USE_AVXCD @@ -447,12 +451,17 @@ void IntelBuffers::free_ncache() flt_t *ncachez = _ncachez; int *ncachej = _ncachej; int *ncachejtype = _ncachejtype; + int *ncachetag = _ncachetag; #ifdef _LMP_INTEL_OFFLOAD if (_off_ncache) { #pragma offload_transfer target(mic:_cop) \ nocopy(ncachex,ncachey,ncachez,ncachej:alloc_if(0) free_if(1)) \ nocopy(ncachejtype:alloc_if(0) free_if(1)) + if (ncachetag) { + #pragma offload_transfer target(mic:_cop) \ + nocopy(ncachetag:alloc_if(0) free_if(1)) + } } _off_ncache = 0; #endif @@ -462,8 +471,10 @@ void IntelBuffers::free_ncache() lmp->memory->destroy(ncachez); lmp->memory->destroy(ncachej); lmp->memory->destroy(ncachejtype); - + if (ncachetag) + lmp->memory->destroy(ncachetag); _ncache_alloc = 0; + _ncachetag = 0; } } @@ -480,7 +491,7 @@ void IntelBuffers::grow_ncache(const int off_flag, const int vsize = _ncache_stride * nt; if (_ncache_alloc) { - if (vsize > _ncache_alloc) + if (vsize > _ncache_alloc || (need_tag() && _ncachetag == 0)) free_ncache(); #ifdef _LMP_INTEL_OFFLOAD else if (off_flag && _off_ncache == 0) @@ -495,6 +506,8 @@ void IntelBuffers::grow_ncache(const int off_flag, lmp->memory->create(_ncachez, vsize, "_ncachez"); lmp->memory->create(_ncachej, vsize, "_ncachej"); lmp->memory->create(_ncachejtype, vsize, "_ncachejtype"); + if (need_tag()) + lmp->memory->create(_ncachetag, vsize, "_ncachetag"); _ncache_alloc = vsize; @@ -513,6 +526,14 @@ void IntelBuffers::grow_ncache(const int off_flag, nocopy(ncachez,ncachej:length(vsize) alloc_if(1) free_if(0)) \ nocopy(ncachejtype:length(vsize) alloc_if(1) free_if(0)) } + int tsize = vsize; + if (!need_tag()) { + tsize = 16; + lmp->memory->create(_ncachetag, tsize, "_ncachetag"); + } + int *ncachetag = _ncachetag; + #pragma offload_transfer target(mic:_cop) \ + nocopy(ncachetag:length(tsize) alloc_if(1) free_if(0)) _off_ncache = 1; } #endif @@ -548,7 +569,8 @@ void IntelBuffers::fdotr_reduce(const int nall, /* ---------------------------------------------------------------------- */ template -void IntelBuffers::set_ntypes(const int ntypes) +void IntelBuffers::set_ntypes(const int ntypes, + const int use_ghost_cut) { if (ntypes != _ntypes) { if (_ntypes > 0) { @@ -558,16 +580,34 @@ void IntelBuffers::set_ntypes(const int ntypes) #pragma offload_transfer target(mic:_cop) \ nocopy(cutneighsqo:alloc_if(0) free_if(1)) } + flt_t * cutneighghostsqo; + if (_cutneighghostsq && _off_threads > 0 && cutneighghostsqo != 0) { + cutneighghostsqo = _cutneighghostsq[0]; + #pragma offload_transfer target(mic:_cop) \ + nocopy(cutneighghostsqo:alloc_if(0) free_if(1)) + } #endif lmp->memory->destroy(_cutneighsq); + if (_cutneighghostsq != 0) lmp->memory->destroy(_cutneighghostsq); } if (ntypes > 0) { lmp->memory->create(_cutneighsq, ntypes, ntypes, "_cutneighsq"); + if (use_ghost_cut) + lmp->memory->create(_cutneighghostsq, ntypes, ntypes, + "_cutneighghostsq"); #ifdef _LMP_INTEL_OFFLOAD flt_t * cutneighsqo = _cutneighsq[0]; + const int ntypes2 = ntypes * ntypes; if (_off_threads > 0 && cutneighsqo != NULL) { #pragma offload_transfer target(mic:_cop) \ - nocopy(cutneighsqo:length(ntypes * ntypes) alloc_if(1) free_if(0)) + nocopy(cutneighsqo:length(ntypes2) alloc_if(1) free_if(0)) + } + if (use_ghost_cut) { + flt_t * cutneighghostsqo = _cutneighghostsq[0]; + if (_off_threads > 0 && cutneighghostsqo != NULL) { + #pragma offload_transfer target(mic:_cop) \ + nocopy(cutneighghostsqo:length(ntypes2) alloc_if(1) free_if(0)) + } } #endif } diff --git a/src/USER-INTEL/intel_buffers.h b/src/USER-INTEL/intel_buffers.h index 7a7640a203..8040715b2e 100644 --- a/src/USER-INTEL/intel_buffers.h +++ b/src/USER-INTEL/intel_buffers.h @@ -109,12 +109,14 @@ class IntelBuffers { void free_ncache(); void grow_ncache(const int off_flag, const int nthreads); + void grow_ncachetag(const int off_flag, const int nthreads); inline int ncache_stride() { return _ncache_stride; } inline flt_t * get_ncachex() { return _ncachex; } inline flt_t * get_ncachey() { return _ncachey; } inline flt_t * get_ncachez() { return _ncachez; } inline int * get_ncachej() { return _ncachej; } inline int * get_ncachejtype() { return _ncachejtype; } + inline int * get_ncachetag() { return _ncachetag; } inline int get_max_nbors() { int mn = lmp->neighbor->oneatom * sizeof(int) / @@ -131,7 +133,7 @@ class IntelBuffers { _grow_nbor_list(list, nlocal, nthreads, offload_end, pack_width); } - void set_ntypes(const int ntypes); + void set_ntypes(const int ntypes, const int use_ghost_cut = 0); inline int * firstneigh(const NeighList *list) { return _list_alloc; } inline int * cnumneigh(const NeighList *list) { return _cnumneigh; } @@ -162,6 +164,7 @@ class IntelBuffers { inline void zero_ev() { for (int i = 0; i < 8; i++) _ev_global[i] = _ev_global_host[i] = 0.0; } inline flt_t ** get_cutneighsq() { return _cutneighsq; } + inline flt_t ** get_cutneighghostsq() { return _cutneighghostsq; } inline int get_off_threads() { return _off_threads; } #ifdef _LMP_INTEL_OFFLOAD inline void set_off_params(const int n, const int cop, @@ -274,13 +277,10 @@ class IntelBuffers { used_ghost * sizeof(flt_t)); } } + #endif inline int need_tag() { return _need_tag; } inline void need_tag(const int nt) { _need_tag = nt; } - #else - inline int need_tag() { return 0; } - inline void need_tag(const int nt) { } - #endif double memory_usage(const int nthreads); @@ -298,7 +298,7 @@ class IntelBuffers { int _list_alloc_atoms; int *_list_alloc, *_cnumneigh, *_atombin, *_binpacked; - flt_t **_cutneighsq; + flt_t **_cutneighsq, **_cutneighghostsq; int _ntypes; int _ccache_stride; @@ -307,7 +307,10 @@ class IntelBuffers { int _ncache_stride, _ncache_alloc; flt_t *_ncachex, *_ncachey, *_ncachez; - int *_ncachej, *_ncachejtype; + int *_ncachej, *_ncachejtype, *_ncachetag; + + int _need_tag, _host_nmax; + #ifdef LMP_USE_AVXCD int _ccache_stride3; acc_t * _ccachef; @@ -324,7 +327,6 @@ class IntelBuffers { int *_off_map_special, *_off_map_nspecial, *_off_map_tag; int *_off_map_numneigh; bool _off_list_alloc; - int _need_tag, _host_nmax; #endif int _buf_size, _buf_local_size; diff --git a/src/USER-INTEL/intel_intrinsics_airebo.h b/src/USER-INTEL/intel_intrinsics_airebo.h new file mode 100644 index 0000000000..7b091a4ba1 --- /dev/null +++ b/src/USER-INTEL/intel_intrinsics_airebo.h @@ -0,0 +1,2279 @@ +#ifndef LMP_INTEL_AIREBO_SCALAR +# ifdef __INTEL_COMPILER +# if defined(__MIC__) || defined(__AVX512F__) +# define LMP_INTEL_AIREBO_512 +# elif defined(__AVX__) +# define LMP_INTEL_AIREBO_256 +# else +# define LMP_INTEL_AIREBO_SCALAR +# endif +# else +# define LMP_INTEL_AIREBO_SCALAR +# endif +#endif + +#ifdef LMP_INTEL_AIREBO_512 + +#include +#include + +#define VEC_INLINE __attribute__((always_inline)) + + +#ifndef FVEC_FIRST_PASS +# define FVEC_LEN 8 +# define FVEC_SUFFIX(a) a##pd +# define FVEC_SUFFIX_MASK(a) a##pd_mask +# define FVEC_MASK_T __mmask8 +# define FVEC_VEC_T __m512d +# define FVEC_SCAL_T double +# define IVEC_NAME ivec8 +# define FVEC_NAME fvec8pd +# define BVEC_NAME bvec8 +# define AVEC_NAME avec8pd +#else +# undef FVEC_LEN +# undef FVEC_SUFFIX +# undef FVEC_SUFFIX_MASK +# undef FVEC_MASK_T +# undef FVEC_VEC_T +# undef FVEC_SCAL_T +# undef IVEC_NAME +# undef FVEC_NAME +# undef BVEC_NAME +# undef AVEC_NAME + +# define FVEC_LEN 16 +# define FVEC_SUFFIX(a) a##ps +# define FVEC_SUFFIX_MASK(a) a##ps_mask +# define FVEC_MASK_T __mmask16 +# define FVEC_VEC_T __m512 +# define FVEC_SCAL_T float +# define IVEC_NAME ivec16 +# define FVEC_NAME fvec16ps +# define BVEC_NAME bvec16 +# define AVEC_NAME avec16ps +#endif + +namespace mm512 { + +#ifndef __AVX512F__ + +#ifndef FVEC_FIRST_PASS +VEC_INLINE static inline __m512i _mm512_mask_expand_epi32(__m512i src, + __mmask16 k, + __m512i a) { + int buf[16] __attribute__((aligned(64))); + _mm512_store_epi32(buf, a); + return _mm512_mask_loadunpacklo_epi32(src, k, buf); +} +VEC_INLINE static inline __m512i _mm512_maskz_expand_epi32(__mmask16 k, + __m512i a) { + int buf[16] __attribute__((aligned(64))); + _mm512_store_epi32(buf, a); + return _mm512_mask_loadunpacklo_epi32(_mm512_setzero_epi32(), k, buf); +} +VEC_INLINE static inline __m512i _mm512_mask_compress_epi32(__m512i src, + __mmask16 k, + __m512i a) { + int buf[16] __attribute__((aligned(64))); + _mm512_store_epi32(buf, src); + _mm512_mask_packstorelo_epi32(buf, k, a); + return _mm512_load_epi32(buf); +} +VEC_INLINE static inline __m512i _mm512_maskz_compress_epi32(__mmask16 k, + __m512i a) { + int buf[16] __attribute__((aligned(64))) = {0}; + _mm512_mask_packstorelo_epi32(buf, k, a); + return _mm512_load_epi32(buf); +} + +VEC_INLINE static inline void _mm512_mask_compressstoreu_epi32(int * dest, + __mmask16 mask, + __m512i src) { + _mm512_mask_packstorelo_epi32(dest, mask, src); + _mm512_mask_packstorehi_epi32(dest + 16, mask, src); +} + +VEC_INLINE static inline __m512i _mm512_mask_loadu_epi32(__m512i src, + __mmask16 k, + const int * mem_addr) { + assert((k & (k + 1)) == 0); + __m512i ret = _mm512_mask_loadunpacklo_epi32(src, k, mem_addr); + ret = _mm512_mask_loadunpackhi_epi32(ret, k, mem_addr + 16); + return ret; +} +VEC_INLINE static inline __m512i _mm512_maskz_loadu_epi32(__mmask16 k, + const int * mem_addr) { + assert((k & (k + 1)) == 0); + __m512i ret = _mm512_mask_loadunpacklo_epi32(_mm512_setzero_epi32(), k, + mem_addr); + ret = _mm512_mask_loadunpackhi_epi32(ret, k, mem_addr + 16); + return ret; +} +VEC_INLINE static inline void _mm512_mask_storeu_epi32(int * dest, + __mmask16 mask, + __m512i src) { + assert((mask & (mask + 1)) == 0); + _mm512_mask_packstorelo_epi32(dest, mask, src); + _mm512_mask_packstorehi_epi32(dest + 16, mask, src); +} +#endif + +VEC_INLINE static inline FVEC_VEC_T FVEC_SUFFIX(_mm512_mask_expand_) + (FVEC_VEC_T src, __mmask16 k, FVEC_VEC_T a) { + FVEC_SCAL_T buf[FVEC_LEN] __attribute__((aligned(64))); + FVEC_SUFFIX(_mm512_store_)(buf, a); + return FVEC_SUFFIX(_mm512_mask_loadunpacklo_)(src, k, buf); +} +VEC_INLINE static inline FVEC_VEC_T FVEC_SUFFIX(_mm512_maskz_expand_) + (__mmask16 k, FVEC_VEC_T a) { + FVEC_SCAL_T buf[FVEC_LEN] __attribute__((aligned(64))); + FVEC_SUFFIX(_mm512_store_)(buf, a); + return FVEC_SUFFIX(_mm512_mask_loadunpacklo_)(FVEC_SUFFIX(_mm512_setzero_)(), + k, buf); +} +VEC_INLINE static inline FVEC_VEC_T FVEC_SUFFIX(_mm512_mask_compress_) + (FVEC_VEC_T src, __mmask16 k, FVEC_VEC_T a) { + FVEC_SCAL_T buf[FVEC_LEN] __attribute__((aligned(64))); + FVEC_SUFFIX(_mm512_store_)(buf, src); + FVEC_SUFFIX(_mm512_mask_packstorelo_)(buf, k, a); + return FVEC_SUFFIX(_mm512_load_)(buf); +} +VEC_INLINE static inline FVEC_VEC_T FVEC_SUFFIX(_mm512_maskz_compress_) + (__mmask16 k, FVEC_VEC_T a) { + FVEC_SCAL_T buf[FVEC_LEN] __attribute__((aligned(64))) = {0}; + FVEC_SUFFIX(_mm512_mask_packstorelo_)(buf, k, a); + return FVEC_SUFFIX(_mm512_load_)(buf); +} +VEC_INLINE static inline void FVEC_SUFFIX(_mm512_mask_storeu_) + (FVEC_SCAL_T * dest, FVEC_MASK_T mask, FVEC_VEC_T src) { + assert((mask & (mask + 1)) == 0); + FVEC_SUFFIX(_mm512_mask_packstorelo_)(dest, mask, src); + FVEC_SUFFIX(_mm512_mask_packstorehi_)(dest + FVEC_LEN, mask, src); +} +#endif + + +class FVEC_NAME; +class IVEC_NAME; +class AVEC_NAME; +class BVEC_NAME { + friend class FVEC_NAME; + friend class IVEC_NAME; + friend class AVEC_NAME; +# if FVEC_LEN==16 + friend class avec16pd; +# endif + FVEC_MASK_T val_; + VEC_INLINE BVEC_NAME(const FVEC_MASK_T &v) : val_(v) {} +public: + VEC_INLINE BVEC_NAME() {} + VEC_INLINE static BVEC_NAME kand(const BVEC_NAME &a, const BVEC_NAME &b) { + return _mm512_kand(a.val_, b.val_); + } + VEC_INLINE static BVEC_NAME kandn(const BVEC_NAME &a, const BVEC_NAME &b) { + return _mm512_kandn(a.val_, b.val_); + } + VEC_INLINE static BVEC_NAME knot(const BVEC_NAME &a) { + return _mm512_knot(a.val_); + } + VEC_INLINE static int kortestz(const BVEC_NAME &a, const BVEC_NAME &b) { + return _mm512_kortestz(a.val_, b.val_); + } + VEC_INLINE static BVEC_NAME masku_compress(const BVEC_NAME &mask, + const BVEC_NAME &a) { + const __m512i c_i1 = _mm512_set1_epi32(1); + __m512i a_int_vec = _mm512_mask_blend_epi32(a.val_, _mm512_setzero_epi32(), + c_i1); + __m512i compressed = _mm512_mask_compress_epi32(_mm512_undefined_epi32(), + mask.val_, a_int_vec); + return _mm512_cmpeq_epi32_mask(compressed, c_i1); + } + VEC_INLINE static BVEC_NAME mask_expand(const BVEC_NAME &src, + const BVEC_NAME &mask, + const BVEC_NAME &a) { + const __m512i c_i1 = _mm512_set1_epi32(1); + __m512i a_int_vec = _mm512_mask_blend_epi32(a.val_, _mm512_setzero_epi32(), + c_i1); + __m512i src_int_vec = _mm512_mask_blend_epi32(src.val_, + _mm512_setzero_epi32(), c_i1); + __m512i compressed = _mm512_mask_expand_epi32(src_int_vec, mask.val_, + a_int_vec); + return _mm512_cmpeq_epi32_mask(compressed, c_i1); + } + VEC_INLINE static BVEC_NAME full() { + return static_cast(0xFFFF); + } + VEC_INLINE static BVEC_NAME empty() { + return 0; + } + VEC_INLINE static BVEC_NAME only(int n) { + return full().val_ >> (FVEC_LEN - n); + } + VEC_INLINE static BVEC_NAME after(int n) { + return full().val_ << n; + } + VEC_INLINE static BVEC_NAME onlyafter(int only, int after) { + return (full().val_ >> (FVEC_LEN - only)) << after; + } + VEC_INLINE static int popcnt(const BVEC_NAME &a) { + return _popcnt32(a.val_); + } + VEC_INLINE static bool test_all_unset(const BVEC_NAME &a) { + return _mm512_kortestz(a.val_, a.val_); + } + VEC_INLINE static bool test_any_set(const BVEC_NAME &a) { + return ! test_all_unset(a); + } + VEC_INLINE static bool test_at(const BVEC_NAME &a, int i) { + assert(i < FVEC_LEN); + return a.val_ & (1 << i); + } + VEC_INLINE BVEC_NAME operator &(const BVEC_NAME &b) const { + return _mm512_kand(val_, b.val_); + } + VEC_INLINE BVEC_NAME operator |(const BVEC_NAME &b) const { + return _mm512_kor(val_, b.val_); + } + VEC_INLINE BVEC_NAME operator ~() const { + return _mm512_knot(val_); + } +}; + +class IVEC_NAME { + friend class FVEC_NAME; + friend class AVEC_NAME; +# if FVEC_LEN==16 + friend class avec16pd; +# endif + __m512i val_; + VEC_INLINE IVEC_NAME(const __m512i &v) : val_(v) {} +public: + static const int VL = 16; + VEC_INLINE IVEC_NAME() {} + + #define IVEC_MASK_BINFN_B(the_name) \ + VEC_INLINE static BVEC_NAME the_name(const IVEC_NAME &a, \ + const IVEC_NAME &b) { \ + return _mm512_##the_name##_epi32_mask(a.val_, b.val_); \ + } \ + VEC_INLINE static BVEC_NAME mask_##the_name( \ + const BVEC_NAME &mask, \ + const IVEC_NAME &a, \ + const IVEC_NAME &b \ + ) { \ + return _mm512_mask_##the_name##_epi32_mask( \ + mask.val_, a.val_, b.val_); \ + } + IVEC_MASK_BINFN_B(cmpeq) + IVEC_MASK_BINFN_B(cmplt) + IVEC_MASK_BINFN_B(cmpneq) + IVEC_MASK_BINFN_B(cmpgt) + + #define IVEC_MASK_BINFN_I(the_name) \ + VEC_INLINE static IVEC_NAME mask_##the_name( \ + const IVEC_NAME &src, const BVEC_NAME &mask, \ + const IVEC_NAME &a, const IVEC_NAME &b \ + ) { \ + return _mm512_mask_##the_name##_epi32( \ + src.val_, mask.val_, a.val_, b.val_); \ + } + IVEC_MASK_BINFN_I(add) + VEC_INLINE static IVEC_NAME mask_blend( + const BVEC_NAME &mask, const IVEC_NAME &a, const IVEC_NAME &b + ) { + return _mm512_mask_blend_epi32(mask.val_, a.val_, b.val_); + } + + #define IVEC_BINFN_I(the_name) \ + VEC_INLINE static IVEC_NAME the_name(const IVEC_NAME &a, \ + const IVEC_NAME &b) { \ + return _mm512_##the_name##_epi32(a.val_, b.val_); \ + } + IVEC_BINFN_I(mullo) + IVEC_BINFN_I(srlv) + VEC_INLINE static IVEC_NAME the_and(const IVEC_NAME &a, const IVEC_NAME &b) { + return _mm512_and_epi32(a.val_, b.val_); + } + + VEC_INLINE static IVEC_NAME mask_expand( + const IVEC_NAME &src, const BVEC_NAME &a, const IVEC_NAME &b + ) { + return _mm512_mask_expand_epi32(src.val_, + a.val_, b.val_); + } + VEC_INLINE static IVEC_NAME masku_compress( + const BVEC_NAME &a, const IVEC_NAME &b + ) { + return _mm512_mask_compress_epi32(_mm512_undefined_epi32(), a.val_, b.val_); + } + + VEC_INLINE static int at(const IVEC_NAME &a, int b) { + int data[16] __attribute__((aligned(64))); + _mm512_store_epi32(data, a.val_); + return data[b]; + } + + VEC_INLINE static IVEC_NAME load(const int * src) { + return _mm512_load_epi32(src); + } + VEC_INLINE static IVEC_NAME mask_loadu(const BVEC_NAME &mask, + const int * src) { + assert((mask.val_ & (mask.val_ + 1)) == 0); + assert(mask.val_ <= BVEC_NAME::full().val_); + return _mm512_mask_loadu_epi32(_mm512_undefined_epi32(), mask.val_, src); + } + VEC_INLINE static IVEC_NAME maskz_loadu(const BVEC_NAME &mask, + const int * src) { + assert((mask.val_ & (mask.val_ + 1)) == 0); + assert(mask.val_ <= BVEC_NAME::full().val_); + return _mm512_maskz_loadu_epi32(mask.val_, src); + } + VEC_INLINE static void mask_storeu(const BVEC_NAME &mask, int * dest, + const IVEC_NAME &src) { + assert((mask.val_ & (mask.val_ + 1)) == 0); + assert(mask.val_ <= BVEC_NAME::full().val_); + _mm512_mask_storeu_epi32(dest, mask.val_, src.val_); + } + VEC_INLINE static void store(int * dest, const IVEC_NAME &src) { + _mm512_store_epi32(dest, src.val_); + } + + VEC_INLINE static IVEC_NAME mask_gather( + const IVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const int * mem, const int scale + ) { + assert(mask.val_ <= BVEC_NAME::full().val_); + assert(scale == sizeof(int)); + return _mm512_mask_i32gather_epi32(src.val_, mask.val_, idx.val_, mem, + sizeof(int)); + } + VEC_INLINE static void mask_i32scatter( + int * mem, const BVEC_NAME &mask, const IVEC_NAME &idx, + const IVEC_NAME &a, const int scale + ) { + assert(mask.val_ <= BVEC_NAME::full().val_); + assert(scale == sizeof(int)); + _mm512_mask_i32scatter_epi32(mem, mask.val_, idx.val_, a.val_, sizeof(int)); + } + + VEC_INLINE static void mask_compressstore(const BVEC_NAME &mask, int * dest, + const IVEC_NAME &src) { + _mm512_mask_compressstoreu_epi32(dest, mask.val_, src.val_); + } + + VEC_INLINE static IVEC_NAME set1(int i) { + return _mm512_set1_epi32(i); + } + VEC_INLINE static IVEC_NAME setzero() { + return _mm512_setzero_epi32(); + } + VEC_INLINE static IVEC_NAME undefined() { + return _mm512_undefined_epi32(); + } + + VEC_INLINE IVEC_NAME operator +(const IVEC_NAME &b) const { + return _mm512_add_epi32(this->val_, b.val_); + } + VEC_INLINE static void print(const char * str, const IVEC_NAME &a) { + int data[8] __attribute__((aligned(32))); + store(data, a); + printf("%s:", str); + for (int i = 0; i < FVEC_LEN; i++) { + printf(" %d", data[i]); + } + printf("\n"); + } +}; + +class FVEC_NAME { + friend class AVEC_NAME; +#if FVEC_LEN==16 + friend class avec16pd; +#endif + FVEC_VEC_T val_; + VEC_INLINE FVEC_NAME(const FVEC_VEC_T &v) : val_(v) {} +public: + static const int VL = FVEC_LEN; + VEC_INLINE FVEC_NAME() {} + VEC_INLINE static FVEC_SCAL_T at(const FVEC_NAME &a, int i) { + assert(i < FVEC_LEN); + FVEC_SCAL_T data[FVEC_LEN] __attribute__((aligned(64))); + FVEC_SUFFIX(_mm512_store_)(data, a.val_); + return data[i]; + } + VEC_INLINE static bool fast_compress() { return true; } + + #define FVEC_MASK_BINFN_B(the_name) \ + VEC_INLINE static BVEC_NAME the_name(const FVEC_NAME &a, \ + const FVEC_NAME &b) { \ + return FVEC_SUFFIX_MASK(_mm512_##the_name##_)(a.val_, b.val_); \ + } \ + VEC_INLINE static BVEC_NAME mask_##the_name( \ + const BVEC_NAME &mask, \ + const FVEC_NAME &a, const FVEC_NAME &b \ + ) { \ + return FVEC_SUFFIX_MASK(_mm512_mask_##the_name##_)( \ + mask.val_, a.val_, b.val_); \ + } + FVEC_MASK_BINFN_B(cmple) + FVEC_MASK_BINFN_B(cmplt) + FVEC_MASK_BINFN_B(cmpneq) + FVEC_MASK_BINFN_B(cmpnle) + FVEC_MASK_BINFN_B(cmpnlt) + + #define FVEC_UNFN_F(the_name) \ + VEC_INLINE static FVEC_NAME the_name(const FVEC_NAME &a) { \ + return FVEC_SUFFIX(_mm512_##the_name##_)(a.val_); \ + } + FVEC_UNFN_F(abs) + FVEC_UNFN_F(exp) + FVEC_UNFN_F(invsqrt) + FVEC_UNFN_F(recip) + FVEC_UNFN_F(sqrt) + + #define FVEC_MASK_UNFN_F(the_name) \ + VEC_INLINE static FVEC_NAME mask_##the_name( \ + const FVEC_NAME &src, const BVEC_NAME &mask, \ + const FVEC_NAME &a \ + ) { \ + return FVEC_SUFFIX(_mm512_mask_##the_name##_)( \ + src.val_, mask.val_, a.val_); \ + } + FVEC_MASK_UNFN_F(cos) + FVEC_MASK_UNFN_F(recip) + FVEC_MASK_UNFN_F(sqrt) + + #define FVEC_BINFN_F(the_name) \ + VEC_INLINE static FVEC_NAME the_name(const FVEC_NAME &a, \ + const FVEC_NAME &b) { \ + return FVEC_SUFFIX(_mm512_##the_name##_)(a.val_, b.val_); \ + } + FVEC_BINFN_F(max) + FVEC_BINFN_F(min) + + #define FVEC_MASK_BINFN_F(the_name) \ + VEC_INLINE static FVEC_NAME mask_##the_name( \ + const FVEC_NAME &src, const BVEC_NAME &mask, \ + const FVEC_NAME &a, const FVEC_NAME &b \ + ) { \ + return FVEC_SUFFIX(_mm512_mask_##the_name##_)( \ + src.val_, mask.val_, a.val_, b.val_); \ + } + FVEC_MASK_BINFN_F(add) + FVEC_MASK_BINFN_F(div) + FVEC_MASK_BINFN_F(mul) + FVEC_MASK_BINFN_F(sub) + VEC_INLINE static FVEC_NAME mask_blend( + const BVEC_NAME &mask, const FVEC_NAME &a, const FVEC_NAME &b + ) { + return FVEC_SUFFIX(_mm512_mask_blend_)(mask.val_, a.val_, b.val_); + } + + VEC_INLINE static FVEC_NAME mask_expand( + const FVEC_NAME &src, const BVEC_NAME &a, const FVEC_NAME &b + ) { + return FVEC_SUFFIX(_mm512_mask_expand_)(src.val_, + a.val_, b.val_); + } + VEC_INLINE static FVEC_NAME masku_compress( + const BVEC_NAME &a, const FVEC_NAME &b + ) { + return FVEC_SUFFIX(_mm512_mask_compress_)(FVEC_SUFFIX(_mm512_undefined_)(), + a.val_, b.val_); + } + + VEC_INLINE static FVEC_NAME set1(const FVEC_SCAL_T &a) { + return FVEC_SUFFIX(_mm512_set1_)(a); + } + VEC_INLINE static FVEC_NAME setzero() { + return FVEC_SUFFIX(_mm512_setzero_)(); + } + VEC_INLINE static FVEC_NAME undefined() { + return FVEC_SUFFIX(_mm512_undefined_)(); + } + + VEC_INLINE static FVEC_NAME load(const FVEC_SCAL_T *mem) { + return FVEC_SUFFIX(_mm512_load_)(mem); + } + VEC_INLINE static void mask_storeu(const BVEC_NAME &mask, FVEC_SCAL_T * dest, + const FVEC_NAME &a) { + FVEC_SUFFIX(_mm512_mask_storeu_)(dest, mask.val_, a.val_); + } + VEC_INLINE static void store(FVEC_SCAL_T * dest, const FVEC_NAME &a) { + FVEC_SUFFIX(_mm512_store_)(dest, a.val_); + } + + VEC_INLINE static FVEC_NAME gather(const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, + const int scale) { + assert(scale == sizeof(FVEC_SCAL_T)); +# if FVEC_LEN==8 + return FVEC_SUFFIX(_mm512_i32logather_)(idx.val_, mem, sizeof(FVEC_SCAL_T)); +# else + return FVEC_SUFFIX(_mm512_i32gather_)(idx.val_, mem, sizeof(FVEC_SCAL_T)); +# endif + } + VEC_INLINE static FVEC_NAME mask_gather( + const FVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, const int scale + ) { + assert(scale == sizeof(FVEC_SCAL_T)); +# if FVEC_LEN==8 + return FVEC_SUFFIX(_mm512_mask_i32logather_)(src.val_, mask.val_, idx.val_, + mem, sizeof(FVEC_SCAL_T)); +# else + return FVEC_SUFFIX(_mm512_mask_i32gather_)(src.val_, mask.val_, idx.val_, + mem, sizeof(FVEC_SCAL_T)); +# endif + } + + VEC_INLINE static void gather_3_adjacent(const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, + const int scale, + FVEC_NAME * out_0, + FVEC_NAME * out_1, + FVEC_NAME * out_2) { + assert(scale == sizeof(FVEC_SCAL_T)); + *out_0 = FVEC_NAME::gather(idx, mem + 0, scale); + *out_1 = FVEC_NAME::gather(idx, mem + 1, scale); + *out_2 = FVEC_NAME::gather(idx, mem + 2, scale); + } + VEC_INLINE static void gather_4_adjacent(const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, + const int scale, FVEC_NAME * out_0, + FVEC_NAME * out_1, + FVEC_NAME * out_2, + FVEC_NAME * out_3) { + assert(scale == sizeof(FVEC_SCAL_T)); + *out_0 = FVEC_NAME::gather(idx, mem + 0, scale); + *out_1 = FVEC_NAME::gather(idx, mem + 1, scale); + *out_2 = FVEC_NAME::gather(idx, mem + 2, scale); + *out_3 = FVEC_NAME::gather(idx, mem + 3, scale); + } + + VEC_INLINE static FVEC_SCAL_T mask_reduce_add(const BVEC_NAME &mask, + const FVEC_NAME &a) { + return FVEC_SUFFIX(_mm512_mask_reduce_add_)(mask.val_, a.val_); + } + VEC_INLINE static FVEC_SCAL_T reduce_add(const FVEC_NAME &a) { + return FVEC_SUFFIX(_mm512_reduce_add_)(a.val_); + } + + VEC_INLINE static IVEC_NAME unpackloepi32(const FVEC_NAME &a) { +# if FVEC_LEN==8 + return _mm512_maskz_compress_epi32(0x5555, _mm512_castpd_si512(a.val_)); +# else + return _mm512_castps_si512(a.val_); +# endif + } + + VEC_INLINE static FVEC_NAME mask_sincos( + FVEC_NAME * cos, const FVEC_NAME &src_a, const FVEC_NAME &src_b, + const BVEC_NAME &mask, const FVEC_NAME &arg + ) { + return FVEC_SUFFIX(_mm512_mask_sincos_)(&cos->val_, src_a.val_, src_b.val_, + mask.val_, arg.val_); + } + + #define FVEC_BINOP(the_sym, the_name) \ + VEC_INLINE inline FVEC_NAME operator the_sym(const FVEC_NAME &b) const { \ + return FVEC_SUFFIX(_mm512_##the_name##_)(this->val_, b.val_); \ + } + FVEC_BINOP(+, add) + FVEC_BINOP(-, sub) + FVEC_BINOP(*, mul) + FVEC_BINOP(/, div) + + VEC_INLINE static void gather_prefetch0(const IVEC_NAME &a, void * mem) { + #ifdef __AVX512PF__ + _mm512_mask_prefetch_i32gather_ps(a.val_, BVEC_NAME::full().val_, mem, + sizeof(FVEC_SCAL_T), _MM_HINT_T0); + #endif + } +}; + +class AVEC_NAME { + FVEC_VEC_T val_; + VEC_INLINE AVEC_NAME(const FVEC_VEC_T &a) : val_(a) {} +public: + VEC_INLINE AVEC_NAME(const FVEC_NAME &a) : val_(a.val_) {} + VEC_INLINE static AVEC_NAME undefined() { + return FVEC_SUFFIX(_mm512_undefined_)(); + } + VEC_INLINE static AVEC_NAME mask_gather( + const AVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, const int scale + ) { + assert(scale == sizeof(FVEC_SCAL_T)); +# if FVEC_LEN==8 + return FVEC_SUFFIX(_mm512_mask_i32logather_)(src.val_, mask.val_, idx.val_, + mem, sizeof(FVEC_SCAL_T)); +# else + return FVEC_SUFFIX(_mm512_mask_i32gather_)(src.val_, mask.val_, idx.val_, + mem, sizeof(FVEC_SCAL_T)); +# endif + } + VEC_INLINE static void mask_i32loscatter( + FVEC_SCAL_T * mem, const BVEC_NAME &mask, const IVEC_NAME &idx, + const AVEC_NAME &a, const int scale + ) { + assert(scale == sizeof(FVEC_SCAL_T)); +# if FVEC_LEN==8 + FVEC_SUFFIX(_mm512_mask_i32loscatter_)(mem, mask.val_, idx.val_, a.val_, + sizeof(FVEC_SCAL_T)); +# else + FVEC_SUFFIX(_mm512_mask_i32scatter_)(mem, mask.val_, idx.val_, a.val_, + sizeof(FVEC_SCAL_T)); +# endif + } + + #define AVEC_BINOP(the_sym, the_name) \ + VEC_INLINE inline AVEC_NAME operator the_sym(const AVEC_NAME &b) const { \ + return FVEC_SUFFIX(_mm512_##the_name##_)(this->val_, b.val_); \ + } + AVEC_BINOP(-, sub) + + VEC_INLINE static void gather_prefetch0(const IVEC_NAME &a, void * mem) { + _mm512_mask_prefetch_i32gather_ps(a.val_, BVEC_NAME::full().val_, mem, + sizeof(FVEC_SCAL_T), _MM_HINT_T0); + } +}; + +#if FVEC_LEN==16 +class avec16pd { + __m512d lo_, hi_; + VEC_INLINE avec16pd(const __m512d &lo, const __m512d &hi) : lo_(lo), hi_(hi) + {} + VEC_INLINE static __mmask8 get_bvec_hi(__mmask16 a) { + return a >> 8; + } + VEC_INLINE static __m512i get_ivec_hi(__m512i a) { + return _mm512_permute4f128_epi32(a, _MM_PERM_BADC); + } +public: + VEC_INLINE avec16pd(const FVEC_NAME &a) { + lo_ = _mm512_cvtpslo_pd(a.val_); + hi_ = _mm512_cvtpslo_pd(_mm512_permute4f128_ps(a.val_, _MM_PERM_BADC)); + } + VEC_INLINE static avec16pd undefined() { + return avec16pd(_mm512_undefined_pd(), _mm512_undefined_pd()); + } + VEC_INLINE static avec16pd mask_gather( + const avec16pd &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const double * mem, const int scale + ) { + assert(scale == sizeof(double)); + __m512d lo = _mm512_mask_i32logather_pd(src.lo_, mask.val_, idx.val_, mem, + sizeof(double)); + __m512d hi = _mm512_mask_i32logather_pd(src.hi_, get_bvec_hi(mask.val_), + get_ivec_hi(idx.val_), mem, + sizeof(double)); + return avec16pd(lo, hi); + } + VEC_INLINE static void mask_i32loscatter( + double * mem, const BVEC_NAME &mask, const IVEC_NAME &idx, + const avec16pd &a, const int scale + ) { + assert(scale == sizeof(double)); + _mm512_mask_i32loscatter_pd(mem, mask.val_, idx.val_, a.lo_, + sizeof(double)); + _mm512_mask_i32loscatter_pd(mem, get_bvec_hi(mask.val_), + get_ivec_hi(idx.val_), a.hi_, sizeof(double)); + } + + #define AVEC2_BINOP(the_sym, the_name) \ + VEC_INLINE inline avec16pd operator the_sym(const avec16pd &b) const { \ + __m512d lo = _mm512_##the_name##_pd(this->lo_, b.lo_); \ + __m512d hi = _mm512_##the_name##_pd(this->hi_, b.hi_); \ + return avec16pd(lo, hi); \ + } + AVEC2_BINOP(-, sub) + + VEC_INLINE static void gather_prefetch0(const IVEC_NAME &a, void * mem) { + _mm512_mask_prefetch_i32gather_ps(a.val_, BVEC_NAME::full().val_, mem, + sizeof(double), _MM_HINT_T0); + } +}; +#endif + +} + + +#ifdef FVEC_FIRST_PASS + +template +struct intr_types; + +template<> +struct intr_types { + typedef mm512::fvec8pd fvec; + typedef mm512::ivec8 ivec; + typedef mm512::bvec8 bvec; + typedef mm512::avec8pd avec; +}; + +template<> +struct intr_types { + typedef mm512::fvec16ps fvec; + typedef mm512::ivec16 ivec; + typedef mm512::bvec16 bvec; + typedef mm512::avec16ps avec; +}; + +template<> +struct intr_types { + typedef mm512::fvec16ps fvec; + typedef mm512::ivec16 ivec; + typedef mm512::bvec16 bvec; + typedef mm512::avec16pd avec; +}; + +#endif + + +#ifndef FVEC_FIRST_PASS +# define FVEC_FIRST_PASS +# include "intel_intrinsics_airebo.h" +#endif + +#endif + +#ifdef LMP_INTEL_AIREBO_256 + +#include +#include +#include + +#define VEC_INLINE __attribute__((always_inline)) + + +#ifndef FVEC_FIRST_PASS +# define FVEC_LEN 4 +# define FVEC_SUFFIX(a) a##pd +# define FVEC_MASK_T __m256d +# define FVEC_VEC_T __m256d +# define FVEC_SCAL_T double +# define IVEC_NAME ivec4 +# define FVEC_NAME fvec4pd +# define BVEC_NAME bvec4 +# define AVEC_NAME avec4pd +#else +# undef FVEC_LEN +# undef FVEC_SUFFIX +# undef FVEC_SUFFIX_MASK +# undef FVEC_MASK_T +# undef FVEC_VEC_T +# undef FVEC_SCAL_T +# undef IVEC_NAME +# undef FVEC_NAME +# undef BVEC_NAME +# undef AVEC_NAME + +# define FVEC_LEN 8 +# define FVEC_SUFFIX(a) a##ps +# define FVEC_MASK_T __m256 +# define FVEC_VEC_T __m256 +# define FVEC_SCAL_T float +# define IVEC_NAME ivec8 +# define FVEC_NAME fvec8ps +# define BVEC_NAME bvec8 +# define AVEC_NAME avec8ps +#endif + + + +namespace mm256 { + +//#define __AVX2__ __AVX2__ + +#if !defined(__AVX2__) && !defined(FVEC_FIRST_PASS) + +#define IVEC_EM_BIN(op) \ + __m128i a_lo = _mm256_castsi256_si128(a); \ + __m128i b_lo = _mm256_castsi256_si128(b); \ + __m128i a_hi = _mm256_extractf128_si256(a, 1); \ + __m128i b_hi = _mm256_extractf128_si256(b, 1); \ + __m128i c_lo = op(a_lo, b_lo); \ + __m128i c_hi = op(a_hi, b_hi); \ + __m256i ret = _mm256_setr_m128i(c_lo, c_hi); \ + return ret; + +VEC_INLINE inline __m256i _cm256_add_epi32(const __m256i &a, const __m256i &b) { + IVEC_EM_BIN(_mm_add_epi32) +} + +VEC_INLINE inline __m256i _cm256_and_si256(const __m256i &a, const __m256i &b) { + IVEC_EM_BIN(_mm_and_si128) +} + +VEC_INLINE inline __m256i _cm256_andnot_si256(const __m256i &a, + const __m256i &b) { + IVEC_EM_BIN(_mm_andnot_si128) +} + +VEC_INLINE inline __m256i _cm256_cmpeq_epi32(const __m256i &a, + const __m256i &b) { + IVEC_EM_BIN(_mm_cmpeq_epi32) +} + +VEC_INLINE inline __m256i _cm256_cmpgt_epi32(const __m256i &a, + const __m256i &b) { + IVEC_EM_BIN(_mm_cmpgt_epi32) +} + +VEC_INLINE inline __m256i _cm256_cvtepu8_epi32(const __m128i &a) { + __m128i a_hi = _mm_castps_si128(_mm_permute_ps(_mm_castsi128_ps(a), 1)); + __m128i c_lo = _mm_cvtepu8_epi32(a); + __m128i c_hi = _mm_cvtepu8_epi32(a_hi); + __m256i ret = _mm256_setr_m128i(c_lo, c_hi); + return ret; + +} + +#define IVEC_EM_SCAL(op) \ + int buf_a[8] __attribute__((aligned(32))); \ + int buf_b[8] __attribute__((aligned(32))); \ + int dest[8] __attribute__((aligned(32))); \ + _mm256_store_si256((__m256i*)buf_a, a); \ + _mm256_store_si256((__m256i*)buf_b, b); \ + for (int i = 0; i < 8; i++) { \ + dest[i] = op; \ + } \ + return _mm256_load_si256((__m256i*) dest); + +VEC_INLINE inline __m256i _cm256_permutevar8x32_epi32(const __m256i &a, + const __m256i &b) { + IVEC_EM_SCAL(buf_a[buf_b[i]]) +} + +VEC_INLINE inline __m256i _cm256_mullo_epi32(__m256i a, __m256i b) { + IVEC_EM_BIN(_mm_mullo_epi32) +} + +VEC_INLINE inline __m256i _cm256_srlv_epi32(__m256i a, __m256i b) { + IVEC_EM_SCAL(buf_a[i] >> buf_b[i]) +} + + +VEC_INLINE inline __m256 _cm256_permutevar8x32_ps(const __m256 &a, + const __m256i &b) { + return _mm256_castsi256_ps(_cm256_permutevar8x32_epi32(_mm256_castps_si256(a), + b)); +} + +VEC_INLINE inline __m128i _cm_maskload_epi32(int const * mem, __m128i mask) { + return _mm_castps_si128(_mm_maskload_ps((float const *) mem, mask)); +} + +VEC_INLINE inline __m256i _cm256_maskload_epi32(int const * mem, __m256i mask) { + __m128i a_lo = _mm256_castsi256_si128(mask); + __m128i a_hi = _mm256_extractf128_si256(mask, 1); + __m128i c_lo = _cm_maskload_epi32(mem, a_lo); + __m128i c_hi = _cm_maskload_epi32(mem + 4, a_hi); + __m256i ret = _mm256_setr_m128i(c_lo, c_hi); + return ret; +} + + +VEC_INLINE inline __m256i _cm256_mask_i32gather_epi32(__m256i src, + int const * base_addr, + __m256i index, + __m256i mask, + const int scale) { + assert(scale == sizeof(int)); + int buf_index[8] __attribute__((aligned(32))); + int buf_mask[8] __attribute__((aligned(32))); + int dest[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*)dest, src); + _mm256_store_si256((__m256i*)buf_index, index); + _mm256_store_si256((__m256i*)buf_mask, mask); + for (int i = 0; i < 8; i++) { + if (buf_mask[i]) dest[i] = base_addr[buf_index[i]]; + } + return _mm256_load_si256((__m256i*) dest); +} + +VEC_INLINE inline __m256 _cm256_mask_i32gather_ps(__m256 src, + float const * base_addr, + __m256i index, __m256 mask, + const int scale) { + return _mm256_castsi256_ps(_cm256_mask_i32gather_epi32( + _mm256_castps_si256(src), (const int *) base_addr, index, + _mm256_castps_si256(mask), scale)); +} + +VEC_INLINE inline __m256d _cm256_mask_i32gather_pd(__m256d src, + double const * base_addr, + __m128i index, __m256d mask, + const int scale) { + assert(scale == sizeof(double)); + int buf_index[4] __attribute__((aligned(32))); + int buf_mask[8] __attribute__((aligned(32))); + double dest[4] __attribute__((aligned(32))); + _mm256_store_pd(dest, src); + _mm_store_si128((__m128i*)buf_index, index); + _mm256_store_si256((__m256i*)buf_mask, _mm256_castpd_si256(mask)); + for (int i = 0; i < 4; i++) { + if (buf_mask[2*i]) dest[i] = base_addr[buf_index[i]]; + } + return _mm256_load_pd(dest); +} + +VEC_INLINE inline __m256i _cm256_i32gather_epi32(int const * base_addr, + __m256i index, + const int scale) { + assert(scale == sizeof(int)); + int buf_index[8] __attribute__((aligned(32))); + int dest[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*)buf_index, index); + for (int i = 0; i < 8; i++) { + dest[i] = base_addr[buf_index[i]]; + } + return _mm256_load_si256((__m256i*) dest); +} + +VEC_INLINE inline __m256 _cm256_i32gather_ps(float const * base_addr, + __m256i index, const int scale) { + return _mm256_castsi256_ps(_cm256_i32gather_epi32((const int *) base_addr, + index, scale)); +} + +VEC_INLINE inline __m256d _cm256_i32gather_pd(double const * base_addr, + __m128i index, const int scale) { + assert(scale == sizeof(double)); + int buf_index[4] __attribute__((aligned(32))); + double dest[4] __attribute__((aligned(32))); + _mm_store_si128((__m128i*)buf_index, index); + for (int i = 0; i < 4; i++) { + dest[i] = base_addr[buf_index[i]]; + } + return _mm256_load_pd(dest); +} + +VEC_INLINE inline uint64_t _cdep_u64(uint64_t tmp, uint64_t mask) { + uint64_t dst = 0; + uint64_t k = 0; + const uint64_t one = 1; + const uint64_t zero = 0; + for (uint64_t m = 0; m < 64; m++) { + if (mask & (one << m)) { + dst |= static_cast((tmp & (one << k)) != zero) << m; + k += 1; + } + } + return dst; +} + +VEC_INLINE inline uint64_t _cext_u64(uint64_t tmp, uint64_t mask) { + uint64_t dst = 0; + uint64_t k = 0; + const uint64_t one = 1; + const uint64_t zero = 0; + for (uint64_t m = 0; m < 64; m++) { + if (mask & (one << m)) { + dst |= static_cast((tmp & (one << m)) != zero) << k; + k += 1; + } + } + return dst; +} + +#define _mm256_add_epi32 _cm256_add_epi32 +#define _mm256_and_si256 _cm256_and_si256 +#define _mm256_andnot_si256 _cm256_andnot_si256 +#define _mm256_cmpeq_epi32 _cm256_cmpeq_epi32 +#define _mm256_cmpgt_epi32 _cm256_cmpgt_epi32 +#define _mm256_permutevar8x32_epi32 _cm256_permutevar8x32_epi32 +#define _mm256_permutevar8x32_ps _cm256_permutevar8x32_ps +#define _mm_maskload_epi32 _cm_maskload_epi32 +#define _mm256_maskload_epi32 _cm256_maskload_epi32 +#define _mm256_mullo_epi32 _cm256_mullo_epi32 +#define _mm256_srlv_epi32 _cm256_srlv_epi32 +#define _mm256_mask_i32gather_epi32 _cm256_mask_i32gather_epi32 +#define _mm256_mask_i32gather_pd _cm256_mask_i32gather_pd +#define _mm256_mask_i32gather_ps _cm256_mask_i32gather_ps +#define _mm256_i32gather_epi32 _cm256_i32gather_epi32 +#define _mm256_i32gather_pd _cm256_i32gather_pd +#define _mm256_i32gather_ps _cm256_i32gather_ps +#define _pdep_u64 _cdep_u64 +#define _pext_u64 _cext_u64 +#define _mm256_cvtepu8_epi32 _cm256_cvtepu8_epi32 + +#endif + +#ifndef FVEC_FIRST_PASS + +VEC_INLINE inline __m256 _mm256_compress_ps(__m256 mask, __m256 a) { +# ifdef __AVX2__ + uint64_t expanded_mask = _pdep_u64(_mm256_movemask_ps(mask), + 0x0101010101010101); + // unpack each bit to a byte + expanded_mask *= 0xFF; // mask |= mask<<1 | mask<<2 | ... | mask<<7; + // the identity shuffle for vpermps, packed to one index per byte + const uint64_t identity_indices = 0x0706050403020100; + uint64_t wanted_indices = _pext_u64(identity_indices, expanded_mask); + + __m128i bytevec = _mm_cvtsi64_si128(wanted_indices); + __m256i shufmask = _mm256_cvtepu8_epi32(bytevec); + + return _mm256_permutevar8x32_ps(a, shufmask); +# else + int mask_buf[8] __attribute__((aligned(32))); + float a_buf[8] __attribute__((aligned(32))); + float dst_buf[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*) mask_buf, _mm256_castps_si256(mask)); + _mm256_store_ps(a_buf, a); + int k = 0; + for (int i = 0; i < 8; i++) { + if (mask[i]) { + dst_buf[k++] = a_buf[i]; + } + } + return _mm256_load_ps(dst_buf); +# endif +} +VEC_INLINE inline __m256 _mm256_expand_ps(__m256 mask, __m256 a) { +# ifdef __AVX2__ + uint64_t expanded_mask = _pdep_u64(_mm256_movemask_ps(mask), + 0x0101010101010101); + expanded_mask *= 0xFF; + const uint64_t identity_indices = 0x0706050403020100; + uint64_t wanted_indices = _pdep_u64(identity_indices, expanded_mask); + __m128i bytevec = _mm_cvtsi64_si128(wanted_indices); + __m256i shufmask = _mm256_cvtepu8_epi32(bytevec); + return _mm256_permutevar8x32_ps(a, shufmask); +# else + int mask_buf[8] __attribute__((aligned(32))); + float a_buf[8] __attribute__((aligned(32))); + float dst_buf[8] __attribute__((aligned(32))) = {0}; + _mm256_store_si256((__m256i*) mask_buf, _mm256_castps_si256(mask)); + _mm256_store_ps(a_buf, a); + int k = 0; + for (int i = 0; i < 8; i++) { + if (mask[i]) { + dst_buf[i] = a_buf[k++]; + } + } + return _mm256_load_ps(dst_buf); +# endif +} + +VEC_INLINE inline __m256d _mm256_compress_pd(__m256d mask, __m256d a) { + return _mm256_castps_pd(_mm256_compress_ps(_mm256_castpd_ps(mask), + _mm256_castpd_ps(a))); +} +VEC_INLINE inline __m256d _mm256_expand_pd(__m256d mask, __m256d a) { + return _mm256_castps_pd(_mm256_expand_ps(_mm256_castpd_ps(mask), + _mm256_castpd_ps(a))); +} +#endif + + +class FVEC_NAME; +class IVEC_NAME; +class AVEC_NAME; +class BVEC_NAME { + friend class FVEC_NAME; + friend class IVEC_NAME; + friend class AVEC_NAME; +# if FVEC_LEN==8 + friend class avec8pd; +# endif + FVEC_MASK_T val_; + VEC_INLINE BVEC_NAME(const FVEC_MASK_T &v) : val_(v) {} + VEC_INLINE BVEC_NAME(const __m256i &v) : val_(FVEC_SUFFIX(_mm256_castsi256_) + (v)) {} +public: + VEC_INLINE BVEC_NAME() {} + VEC_INLINE static BVEC_NAME kand(const BVEC_NAME &a, const BVEC_NAME &b) { + return FVEC_SUFFIX(_mm256_and_)(a.val_, b.val_); + } + VEC_INLINE static BVEC_NAME kandn(const BVEC_NAME &a, const BVEC_NAME &b) { + return FVEC_SUFFIX(_mm256_andnot_)(a.val_, b.val_); + } + VEC_INLINE static BVEC_NAME masku_compress(const BVEC_NAME &mask, + const BVEC_NAME &a) { + return FVEC_SUFFIX(_mm256_compress_)(mask.val_, a.val_); + } + VEC_INLINE static BVEC_NAME mask_expand(const BVEC_NAME &src, + const BVEC_NAME &mask, + const BVEC_NAME &a) { + FVEC_MASK_T ret = FVEC_SUFFIX(_mm256_expand_)(mask.val_, a.val_); + ret = FVEC_SUFFIX(_mm256_and_)(mask.val_, ret); + ret = FVEC_SUFFIX(_mm256_or_)(ret, FVEC_SUFFIX(_mm256_andnot_) + (mask.val_, src.val_)); + return ret; + } + VEC_INLINE static BVEC_NAME full() { + __m256i a = _mm256_undefined_si256(); + return FVEC_SUFFIX(_mm256_castsi256_)(_mm256_cmpeq_epi32(a, a)); + } + VEC_INLINE static BVEC_NAME empty() { + return FVEC_SUFFIX(_mm256_setzero_)(); + } + VEC_INLINE static BVEC_NAME only(int n) { + static const unsigned int FULL_ps = (unsigned int) -1; + static const unsigned int LUT_ps[9][8] = { + {0, 0, 0, 0, 0, 0, 0, 0}, + {FULL_ps, 0, 0, 0, 0, 0, 0, 0}, + {FULL_ps, FULL_ps, 0, 0, 0, 0, 0, 0}, + {FULL_ps, FULL_ps, FULL_ps, 0, 0, 0, 0, 0}, + {FULL_ps, FULL_ps, FULL_ps, FULL_ps, 0, 0, 0, 0}, + {FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, 0, 0, 0}, + {FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, 0, 0}, + {FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, 0}, + {FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps}, + }; + static const unsigned long long FULL_pd = (unsigned long long) -1; + static const unsigned long long LUT_pd[5][4] = { + {0, 0, 0, 0}, + {FULL_pd, 0, 0, 0}, + {FULL_pd, FULL_pd, 0, 0}, + {FULL_pd, FULL_pd, FULL_pd, 0}, + {FULL_pd, FULL_pd, FULL_pd, FULL_pd}, + }; + return FVEC_SUFFIX(_mm256_load_)((const FVEC_SCAL_T*) FVEC_SUFFIX(LUT_)[n]); + } + VEC_INLINE static BVEC_NAME after(int n) { + static const unsigned int FULL_ps = (unsigned int) -1; + static const unsigned int LUT_ps[9][8] = { + {FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps}, + {0, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps}, + {0, 0, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps}, + {0, 0, 0, FULL_ps, FULL_ps, FULL_ps, FULL_ps, FULL_ps}, + {0, 0, 0, 0, FULL_ps, FULL_ps, FULL_ps, FULL_ps}, + {0, 0, 0, 0, 0, FULL_ps, FULL_ps, FULL_ps}, + {0, 0, 0, 0, 0, 0, FULL_ps, FULL_ps}, + {0, 0, 0, 0, 0, 0, 0, FULL_ps}, + {0, 0, 0, 0, 0, 0, 0, 0}, + }; + static const unsigned long long FULL_pd = (unsigned long long) -1; + static const unsigned long long LUT_pd[5][4] = { + {FULL_pd, FULL_pd, FULL_pd, FULL_pd}, + {0, FULL_pd, FULL_pd, FULL_pd}, + {0, 0, FULL_pd, FULL_pd}, + {0, 0, 0, FULL_pd}, + {0, 0, 0, 0}, + }; + return FVEC_SUFFIX(_mm256_load_)((const FVEC_SCAL_T*) FVEC_SUFFIX(LUT_)[n]); + } + VEC_INLINE static BVEC_NAME onlyafter(int only_, int after_) { + return kand(after(after_), only(after_ + only_)); + } + VEC_INLINE static int popcnt(const BVEC_NAME &a) { + return _popcnt32(FVEC_SUFFIX(_mm256_movemask_)(a.val_)); + } + VEC_INLINE static bool test_all_unset(const BVEC_NAME &a) { + return FVEC_SUFFIX(_mm256_testz_)(a.val_, a.val_); + } + VEC_INLINE static bool test_any_set(const BVEC_NAME &a) { + return ! test_all_unset(a); + } + VEC_INLINE static bool test_at(const BVEC_NAME &a, int i) { + assert(i < FVEC_LEN); + return FVEC_SUFFIX(_mm256_movemask_)(a.val_) & (1 << i); + } + VEC_INLINE BVEC_NAME operator &(const BVEC_NAME &b) const { + return FVEC_SUFFIX(_mm256_and_)(val_, b.val_); + } + VEC_INLINE BVEC_NAME operator |(const BVEC_NAME &b) const { + return FVEC_SUFFIX(_mm256_or_)(val_, b.val_); + } + VEC_INLINE BVEC_NAME operator ~() const { + return FVEC_SUFFIX(_mm256_andnot_)(val_, full().val_); + } +}; + +class IVEC_NAME { + friend class FVEC_NAME; + friend class AVEC_NAME; +# if FVEC_LEN==8 + friend class avec8pd; +# endif + __m256i val_; + VEC_INLINE IVEC_NAME(const __m256i &v) : val_(v) {} + VEC_INLINE static __m256i to(const FVEC_VEC_T &a) { +# if FVEC_LEN==4 + return _mm256_castpd_si256(a); +# else + return _mm256_castps_si256(a); +# endif + } + VEC_INLINE static FVEC_VEC_T from(const __m256i &a) { + return FVEC_SUFFIX(_mm256_castsi256_)(a); + } +public: + static const int VL = 8; + VEC_INLINE IVEC_NAME() {} + + #define IVEC_MASK_BINFN_B(the_name) \ + VEC_INLINE static BVEC_NAME the_name(const IVEC_NAME &a, \ + const IVEC_NAME &b) { \ + return _mm256_##the_name##_epi32(a.val_, b.val_); \ + } \ + VEC_INLINE static BVEC_NAME mask_##the_name( \ + const BVEC_NAME &mask, \ + const IVEC_NAME &a, const IVEC_NAME &b \ + ) { \ + BVEC_NAME ret = _mm256_##the_name##_epi32( \ + a.val_, b.val_); \ + return mask & ret; \ + } + IVEC_MASK_BINFN_B(cmpeq) + IVEC_MASK_BINFN_B(cmpgt) + + VEC_INLINE static __m256i _mm256_cmplt_epi32(__m256i a, __m256i b) { + __m256i le = _mm256_cmpgt_epi32(b, a); + __m256i eq = _mm256_cmpeq_epi32(a, b); + return _mm256_andnot_si256(eq, le); + } + + VEC_INLINE static __m256i _mm256_cmpneq_epi32(__m256i a, __m256i b) { + __m256i eq = _mm256_cmpeq_epi32(a, b); + __m256i t = _mm256_undefined_si256(); + __m256i f = _mm256_cmpeq_epi32(t, t); + return _mm256_andnot_si256(eq, f); + } + + IVEC_MASK_BINFN_B(cmplt) + IVEC_MASK_BINFN_B(cmpneq) + #undef IVEC_MASK_BINFN_B + + VEC_INLINE static IVEC_NAME mask_blend( + const BVEC_NAME &mask, const IVEC_NAME &a, const IVEC_NAME &b + ) { + return to(FVEC_SUFFIX(_mm256_blendv_)(from(a.val_), from(b.val_), + mask.val_)); + } + #define IVEC_MASK_BINFN_I(the_name) \ + VEC_INLINE static IVEC_NAME mask_##the_name( \ + const IVEC_NAME &src, const BVEC_NAME &mask, \ + const IVEC_NAME &a, const IVEC_NAME &b \ + ) { \ + IVEC_NAME ret = _mm256_##the_name##_epi32( \ + a.val_, b.val_); \ + return mask_blend(mask, src, ret); \ + } + IVEC_MASK_BINFN_I(add) + #undef IVEC_MASK_BINFN_I + + #define IVEC_BINFN_I(the_name) \ + VEC_INLINE static IVEC_NAME the_name(const IVEC_NAME &a, \ + const IVEC_NAME &b) { \ + return _mm256_##the_name##_epi32(a.val_, b.val_); \ + } + IVEC_BINFN_I(mullo) + IVEC_BINFN_I(srlv) + #undef IVEC_BINFN_I + VEC_INLINE static IVEC_NAME the_and(const IVEC_NAME &a, const IVEC_NAME &b) { + return _mm256_and_si256(a.val_, b.val_); + } + + VEC_INLINE static IVEC_NAME masku_compress(const BVEC_NAME &mask, + const IVEC_NAME &b) { + return to(FVEC_SUFFIX(_mm256_compress_)(mask.val_, from(b.val_))); + } + VEC_INLINE static IVEC_NAME mask_expand( + const IVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &b + ) { + FVEC_VEC_T ret = FVEC_SUFFIX(_mm256_expand_)(mask.val_, from(b.val_)); + ret = FVEC_SUFFIX(_mm256_and_)(mask.val_, ret); + ret = FVEC_SUFFIX(_mm256_or_)(ret, FVEC_SUFFIX(_mm256_andnot_) + (mask.val_, from(src.val_))); + return to(ret); + } + + VEC_INLINE static void store(int * dest, const IVEC_NAME &src) { + _mm256_store_si256((__m256i*)dest, src.val_); +# if FVEC_LEN==4 + dest[1] = dest[2]; + dest[2] = dest[4]; + dest[3] = dest[6]; +# endif + } + + VEC_INLINE static int at(const IVEC_NAME &a, int b) { + int data[8] __attribute__((aligned(32))); + store(data, a); + return data[b]; + } + + VEC_INLINE static void print(const char * str, const IVEC_NAME &a) { + int data[8] __attribute__((aligned(32))); + store(data, a); + printf("%s:", str); + for (int i = 0; i < FVEC_LEN; i++) { + printf(" %d", data[i]); + } + printf("\n"); + } + + VEC_INLINE static IVEC_NAME maskz_loadu(const BVEC_NAME &mask, + const int * src) { + FVEC_VEC_T mask_val = mask.val_; +# if FVEC_LEN==4 +# ifdef __AVX2__ + static const unsigned int mask_shuffle[8] __attribute__((aligned(32))) = + {0, 2, 4, 6, 0, 0, 0, 0}; + __m256 m = _mm256_castpd_ps(mask_val); + m = _mm256_permutevar8x32_ps(m, _mm256_load_si256((__m256i*)mask_shuffle)); + __m128i ret = _mm_maskload_epi32(src, + _mm256_castsi256_si128(_mm256_castps_si256(m))); + static const unsigned int load_shuffle[8] __attribute__((aligned(32))) = + {0, 0, 1, 1, 2, 2, 3, 3}; + return _mm256_permutevar8x32_epi32(_mm256_castsi128_si256(ret), + _mm256_load_si256((__m256i*)load_shuffle)); +# else + int dest[8] __attribute__((aligned(32))) = {0}; + int mask_buf[8] __attribute__((aligned(32))); + _mm256_store_pd((double*) mask_buf, mask.val_); + for (int i = 0; i < 4; i++) { + if (mask_buf[2*i]) { + int val = src[i]; + dest[2*i+0] = val; + dest[2*i+1] = val; + } + } + return _mm256_load_si256((__m256i*) dest); +# endif +# else + return _mm256_maskload_epi32(src, to(mask_val)); +# endif + } + + VEC_INLINE static IVEC_NAME mask_gather( + const IVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const int * mem, const int scale + ) { + assert(scale == sizeof(int)); + return _mm256_mask_i32gather_epi32(src.val_, mem, idx.val_, to(mask.val_), + sizeof(int)); + } + + VEC_INLINE static void mask_compressstore(const BVEC_NAME &mask, int * dest, + const IVEC_NAME &src) { + int buf[8] __attribute__((aligned(64))); + const int stride = FVEC_LEN==4 ? 2 : 1; + _mm256_store_si256((__m256i*)buf, src.val_); + int mask_val = FVEC_SUFFIX(_mm256_movemask_)(mask.val_); + int k = 0; + #pragma unroll + for (int i = 0; i < FVEC_LEN; i++) { + if (mask_val & (1 << i)) + dest[k++] = buf[stride*i]; + } + } + + VEC_INLINE static IVEC_NAME set1(int i) { + return _mm256_set1_epi32(i); + } + VEC_INLINE static IVEC_NAME setzero() { + return _mm256_setzero_si256(); + } + VEC_INLINE static IVEC_NAME undefined() { + return _mm256_undefined_si256(); + } + + VEC_INLINE IVEC_NAME operator +(const IVEC_NAME &b) const { + return _mm256_add_epi32(this->val_, b.val_); + } +}; + +class FVEC_NAME { + friend class AVEC_NAME; +#if FVEC_LEN==8 + friend class avec8pd; +#endif + FVEC_VEC_T val_; + VEC_INLINE FVEC_NAME(const FVEC_VEC_T &v) : val_(v) {} +public: + static const int VL = FVEC_LEN; +# if defined(__AVX2__) || defined(__MIC__) || defined(__AVX512F__) + VEC_INLINE static bool fast_compress() { return true; } +# else + VEC_INLINE static bool fast_compress() { return false; } +# endif + VEC_INLINE FVEC_NAME() {} + VEC_INLINE static FVEC_SCAL_T at(const FVEC_NAME &a, int i) { + assert(i < FVEC_LEN); + FVEC_SCAL_T data[FVEC_LEN] __attribute__((aligned(64))); + FVEC_SUFFIX(_mm256_store_)(data, a.val_); + return data[i]; + } + + #define FVEC_MASK_BINFN_B(the_name, the_imm) \ + VEC_INLINE static BVEC_NAME the_name(const FVEC_NAME &a, \ + const FVEC_NAME &b) { \ + return FVEC_SUFFIX(_mm256_cmp_)(a.val_, b.val_, the_imm); \ + } \ + VEC_INLINE static BVEC_NAME mask_##the_name( \ + const BVEC_NAME &mask, \ + const FVEC_NAME &a, const FVEC_NAME &b \ + ) { \ + BVEC_NAME ret = FVEC_SUFFIX(_mm256_cmp_)( \ + a.val_, b.val_, the_imm); \ + return mask & ret; \ + } + FVEC_MASK_BINFN_B(cmple, _CMP_LE_OS) + FVEC_MASK_BINFN_B(cmplt, _CMP_LT_OS) + FVEC_MASK_BINFN_B(cmpneq, _CMP_NEQ_UQ) + FVEC_MASK_BINFN_B(cmpnle, _CMP_NLE_US) + FVEC_MASK_BINFN_B(cmpnlt, _CMP_NLT_US) + #undef FVEC_MASK_BINFN_B + + VEC_INLINE static __m256d _mm256_recip_pd(__m256d a) { + __m256d c_1 = _mm256_set1_pd(1); + return _mm256_div_pd(c_1, a); + } + VEC_INLINE static __m256 _mm256_recip_ps(__m256 a) { + return _mm256_rcp_ps(a); + } + VEC_INLINE static __m256d _mm256_abs_pd(__m256d a) { + const unsigned long long abs_mask = 0x7FFFFFFFFFFFFFFF; + const unsigned long long abs_full[8] = + {abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, + abs_mask}; + return _mm256_and_pd(_mm256_load_pd((double*)abs_full), a); + } + VEC_INLINE static __m256 _mm256_abs_ps(__m256 a) { + const unsigned long long abs_mask = 0x7FFFFFFF; + const unsigned long long abs_full[16] = + {abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, + abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, abs_mask, + abs_mask, abs_mask, abs_mask}; + return _mm256_and_ps(_mm256_load_ps((float*)abs_full), a); + } + + #define FVEC_UNFN_F(the_name) \ + VEC_INLINE static FVEC_NAME the_name(const FVEC_NAME &a) { \ + return FVEC_SUFFIX(_mm256_##the_name##_)(a.val_); \ + } + FVEC_UNFN_F(abs) + FVEC_UNFN_F(exp) + FVEC_UNFN_F(invsqrt) + FVEC_UNFN_F(recip) + FVEC_UNFN_F(sqrt) + #undef FVEC_UNFN_F + + VEC_INLINE static FVEC_NAME mask_blend( + const BVEC_NAME &mask, const FVEC_NAME &a, const FVEC_NAME &b + ) { + return FVEC_SUFFIX(_mm256_blendv_)(a.val_, b.val_, mask.val_); + } + #define FVEC_MASK_UNFN_F(the_name) \ + VEC_INLINE static FVEC_NAME mask_##the_name( \ + const FVEC_NAME &src, const BVEC_NAME &mask, \ + const FVEC_NAME &a \ + ) { \ + FVEC_NAME ret = FVEC_SUFFIX(_mm256_##the_name##_)( \ + a.val_); \ + return mask_blend(mask, src, ret); \ + } + FVEC_MASK_UNFN_F(cos) + FVEC_MASK_UNFN_F(recip) + FVEC_MASK_UNFN_F(sqrt) + #undef FVEC_MASK_UNFN_F + + #define FVEC_BINFN_F(the_name) \ + VEC_INLINE static FVEC_NAME the_name(const FVEC_NAME &a, \ + const FVEC_NAME &b) { \ + return FVEC_SUFFIX(_mm256_##the_name##_)(a.val_, b.val_); \ + } + FVEC_BINFN_F(max) + FVEC_BINFN_F(min) + #undef FVEC_BINFN_F + + #define FVEC_MASK_BINFN_F(the_name) \ + VEC_INLINE static FVEC_NAME mask_##the_name( \ + const FVEC_NAME &src, const BVEC_NAME &mask, \ + const FVEC_NAME &a, const FVEC_NAME &b \ + ) { \ + FVEC_NAME ret = FVEC_SUFFIX(_mm256_##the_name##_)( \ + a.val_, b.val_); \ + return mask_blend(mask, src, ret); \ + } + FVEC_MASK_BINFN_F(add) + FVEC_MASK_BINFN_F(div) + FVEC_MASK_BINFN_F(mul) + FVEC_MASK_BINFN_F(sub) + #undef FVEC_MASK_BINFN_F + + VEC_INLINE static FVEC_NAME mask_expand( + const FVEC_NAME &src, const BVEC_NAME &mask, const FVEC_NAME &b + ) { + FVEC_VEC_T ret = FVEC_SUFFIX(_mm256_expand_)(mask.val_, b.val_); + ret = FVEC_SUFFIX(_mm256_and_)(mask.val_, ret); + ret = FVEC_SUFFIX(_mm256_or_)(ret, FVEC_SUFFIX(_mm256_andnot_) + (mask.val_, src.val_)); + return ret; + } + VEC_INLINE static FVEC_NAME masku_compress( + const BVEC_NAME &mask, const FVEC_NAME &b + ) { + return FVEC_SUFFIX(_mm256_compress_)(mask.val_, b.val_); + } + + VEC_INLINE static FVEC_NAME set1(const FVEC_SCAL_T &a) { + return FVEC_SUFFIX(_mm256_set1_)(a); + } + VEC_INLINE static FVEC_NAME setzero() { + return FVEC_SUFFIX(_mm256_setzero_)(); + } + VEC_INLINE static FVEC_NAME undefined() { + return FVEC_SUFFIX(_mm256_undefined_)(); + } + + VEC_INLINE static FVEC_NAME load(const FVEC_SCAL_T *mem) { + return FVEC_SUFFIX(_mm256_load_)(mem); + } + VEC_INLINE static void store(FVEC_SCAL_T * dest, const FVEC_NAME &a) { + FVEC_SUFFIX(_mm256_store_)(dest, a.val_); + } + + + VEC_INLINE static FVEC_NAME gather(const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, const int scale) { + assert(scale == sizeof(FVEC_SCAL_T)); +# if FVEC_LEN==4 +# ifdef __AVX2__ + static const unsigned int mask_shuffle[8] __attribute__((aligned(32))) = + {0, 2, 4, 6, 0, 0, 0, 0}; + __m256i m = _mm256_permutevar8x32_epi32(idx.val_, + _mm256_load_si256((__m256i*)mask_shuffle)); + __m128i idx_short = _mm256_castsi256_si128(m); + return FVEC_SUFFIX(_mm256_i32gather_)(mem, idx_short, sizeof(FVEC_SCAL_T)); +# else + int idx_buf[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*) idx_buf, idx.val_); + double dest[4] __attribute__((aligned(32))); + for (int i = 0; i < 4; i++) { + dest[i] = mem[idx_buf[2*i]]; + } + return _mm256_load_pd(dest); +# endif +# else + return FVEC_SUFFIX(_mm256_i32gather_)(mem, idx.val_, sizeof(FVEC_SCAL_T)); +# endif + } + VEC_INLINE static FVEC_NAME mask_gather( + const FVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, const int scale + ) { + assert(scale == sizeof(FVEC_SCAL_T)); +# if FVEC_LEN==4 +# ifdef __AVX2__ + static const unsigned int mask_shuffle[8] __attribute__((aligned(32))) = + {0, 2, 4, 6, 0, 0, 0, 0}; + __m256i m = _mm256_permutevar8x32_epi32(idx.val_, + _mm256_load_si256((__m256i*)mask_shuffle)); + __m128i idx_short = _mm256_castsi256_si128(m); + return FVEC_SUFFIX(_mm256_mask_i32gather_)(src.val_, mem, idx_short, + mask.val_, sizeof(FVEC_SCAL_T)); +# else + int idx_buf[8] __attribute__((aligned(32))); + int mask_buf[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*) idx_buf, idx.val_); + _mm256_store_pd((double*) mask_buf, mask.val_); + double dest[4] __attribute__((aligned(32))); + _mm256_store_pd((double*) dest, src.val_); + for (int i = 0; i < 4; i++) { + if (mask_buf[2*i]) + dest[i] = mem[idx_buf[2*i]]; + } + return _mm256_load_pd(dest); +# endif +# else + return FVEC_SUFFIX(_mm256_mask_i32gather_)(src.val_, mem, idx.val_, + mask.val_, sizeof(FVEC_SCAL_T)); +# endif + } + + VEC_INLINE static void gather_4_adjacent(const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, const int scale, FVEC_NAME * out_0, + FVEC_NAME * out_1, FVEC_NAME * out_2, FVEC_NAME * out_3) { + assert(scale == sizeof(FVEC_SCAL_T)); + int idx_buf[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*) idx_buf, idx.val_); +# if FVEC_LEN==4 + __m256d a0 = _mm256_load_pd(&mem[idx_buf[0]]); + __m256d a1 = _mm256_load_pd(&mem[idx_buf[2]]); + __m256d a2 = _mm256_load_pd(&mem[idx_buf[4]]); + __m256d a3 = _mm256_load_pd(&mem[idx_buf[6]]); + __m256d b0 = _mm256_unpacklo_pd(a0, a1); + __m256d b1 = _mm256_unpackhi_pd(a0, a1); + __m256d b2 = _mm256_unpacklo_pd(a2, a3); + __m256d b3 = _mm256_unpackhi_pd(a2, a3); + *out_0 = _mm256_permute2f128_pd(b0, b2, 0x20); + *out_1 = _mm256_permute2f128_pd(b1, b3, 0x20); + *out_2 = _mm256_permute2f128_pd(b0, b2, 0x31); + *out_3 = _mm256_permute2f128_pd(b1, b3, 0x31); +# else + const float *e0 = &mem[idx_buf[0]]; + const float *e1 = &mem[idx_buf[1]]; + const float *e2 = &mem[idx_buf[2]]; + const float *e3 = &mem[idx_buf[3]]; + const float *e4 = &mem[idx_buf[4]]; + const float *e5 = &mem[idx_buf[5]]; + const float *e6 = &mem[idx_buf[6]]; + const float *e7 = &mem[idx_buf[7]]; + __m256 a0 = _mm256_loadu2_m128(e4, e0); + __m256 a1 = _mm256_loadu2_m128(e5, e1); + __m256 b0 = _mm256_unpacklo_ps(a0, a1); + __m256 b1 = _mm256_unpackhi_ps(a0, a1); + __m256 a2 = _mm256_loadu2_m128(e6, e2); + __m256 a3 = _mm256_loadu2_m128(e7, e3); + __m256 b2 = _mm256_unpacklo_ps(a2, a3); + __m256 b3 = _mm256_unpackhi_ps(a2, a3); + *out_0 = _mm256_shuffle_ps(b0, b2, 0x44); + *out_1 = _mm256_shuffle_ps(b0, b2, 0xEE); + *out_2 = _mm256_shuffle_ps(b1, b3, 0x44); + *out_3 = _mm256_shuffle_ps(b1, b3, 0xEE); +# endif + } + VEC_INLINE static void gather_3_adjacent(const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, + const int scale, + FVEC_NAME * out_0, + FVEC_NAME * out_1, + FVEC_NAME * out_2) { + assert(scale == sizeof(FVEC_SCAL_T)); + FVEC_NAME tmp_3; + gather_4_adjacent(idx, mem, scale, out_0, out_1, out_2, &tmp_3); + } + + VEC_INLINE static double _mm256_reduce_add_pd(__m256d a) { + __m256d t1 = _mm256_hadd_pd(a, a); + __m128d t2 = _mm256_extractf128_pd(t1, 1); + __m128d t3 = _mm256_castpd256_pd128(t1); + return _mm_cvtsd_f64(_mm_add_pd(t2, t3)); + } + + VEC_INLINE static float _mm256_reduce_add_ps(__m256 a) { + __m256 t1 = _mm256_hadd_ps(a, a); + __m128 t2 = _mm256_extractf128_ps(t1, 1); + __m128 t3 = _mm256_castps256_ps128(t1); + __m128 t4 = _mm_add_ps(t2, t3); + __m128 t5 = _mm_permute_ps(t4, 0x1B); // 0x1B = reverse + return _mm_cvtss_f32(_mm_add_ps(t4, t5)); + } + + VEC_INLINE static FVEC_SCAL_T reduce_add(const FVEC_NAME &a) { + return FVEC_SUFFIX(_mm256_reduce_add_)(a.val_); + } + VEC_INLINE static FVEC_SCAL_T mask_reduce_add(const BVEC_NAME &mask, + const FVEC_NAME &a) { + return reduce_add(FVEC_SUFFIX(_mm256_and_)(mask.val_, a.val_)); + } + + VEC_INLINE static IVEC_NAME unpackloepi32(const FVEC_NAME &a) { +# if FVEC_LEN==4 +# if __AVX2__ + static const unsigned int mask_shuffle[8] __attribute__((aligned(32))) = + {0, 0, 2, 2, 4, 4, 6, 6}; + __m256 m = _mm256_permutevar8x32_ps(_mm256_castpd_ps(a.val_), + _mm256_load_si256((__m256i*)mask_shuffle)); + return _mm256_castps_si256(m); +# else + __m128i a_lo = _mm256_castsi256_si128(_mm256_castpd_si256(a.val_)); + __m128i a_hi = _mm256_extractf128_si256(_mm256_castpd_si256(a.val_), 1); + __m128i c_lo = _mm_shuffle_epi32(a_lo, 0xA0); /*1010 0000*/ + __m128i c_hi = _mm_shuffle_epi32(a_hi, 0xA0); + __m256i ret = _mm256_setr_m128i(c_lo, c_hi); + return ret; +# endif +# else + return _mm256_castps_si256(a.val_); +# endif + } + + VEC_INLINE static FVEC_NAME mask_sincos( + FVEC_NAME * cos, const FVEC_NAME &src_a, const FVEC_NAME &src_b, + const BVEC_NAME &mask, const FVEC_NAME &arg + ) { + FVEC_VEC_T c, s = FVEC_SUFFIX(_mm256_sincos_)(&c, arg.val_); + *cos = mask_blend(mask, src_b, c); + return mask_blend(mask, src_a, s); + } + + #define FVEC_BINOP(the_sym, the_name) \ + VEC_INLINE inline FVEC_NAME operator the_sym(const FVEC_NAME &b) const { \ + return FVEC_SUFFIX(_mm256_##the_name##_)(this->val_, b.val_); \ + } + FVEC_BINOP(+, add) + FVEC_BINOP(-, sub) + FVEC_BINOP(*, mul) + FVEC_BINOP(/, div) + #undef FVEC_BINOP + + VEC_INLINE static void gather_prefetch0(const IVEC_NAME &a, void * mem) { + /* NOP */ + } +}; + +class AVEC_NAME { + friend class avec8pd; + FVEC_VEC_T val_; + VEC_INLINE AVEC_NAME(const FVEC_VEC_T &a) : val_(a) {} +public: + VEC_INLINE AVEC_NAME(const FVEC_NAME &a) : val_(a.val_) {} + VEC_INLINE static AVEC_NAME undefined() { + return FVEC_SUFFIX(_mm256_undefined_)(); + } + VEC_INLINE static AVEC_NAME mask_gather( + const AVEC_NAME &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const FVEC_SCAL_T * mem, const int scale + ) { + assert(scale == sizeof(FVEC_SCAL_T)); + return FVEC_NAME::mask_gather(src.val_, mask, idx, mem, scale); + } + VEC_INLINE static void mask_i32loscatter( + FVEC_SCAL_T * mem, const BVEC_NAME &mask, const IVEC_NAME &idx, + const AVEC_NAME &a, const int scale + ) { + assert(scale == sizeof(FVEC_SCAL_T)); + for (int l = 0; l < FVEC_NAME::VL; l++) { + if (BVEC_NAME::test_at(mask, l)) + mem[IVEC_NAME::at(idx, l)] = FVEC_NAME::at(a.val_, l); + } + } + + #define AVEC_BINOP(the_sym, the_name) \ + VEC_INLINE inline AVEC_NAME operator the_sym(const AVEC_NAME &b) const { \ + return FVEC_SUFFIX(_mm256_##the_name##_)(this->val_, b.val_); \ + } + AVEC_BINOP(-, sub) + #undef AVEC_BINOP +}; + +#if FVEC_LEN==8 +class avec8pd { + __m256d lo_, hi_; + VEC_INLINE avec8pd(const __m256d &lo, const __m256d &hi) : lo_(lo), hi_(hi) {} + VEC_INLINE static __m128 get_ps_hi(__m256 a) { + return _mm256_extractf128_ps(a, 1); + } + VEC_INLINE static __m128 get_ps_lo(__m256 a) { + return _mm256_castps256_ps128(a); + } + VEC_INLINE static __m128i get_si_hi(__m256i a) { + return _mm_castps_si128(get_ps_hi(_mm256_castsi256_ps(a))); + } + VEC_INLINE static __m128i get_si_lo(__m256i a) { + return _mm_castps_si128(get_ps_lo(_mm256_castsi256_ps(a))); + } +public: + VEC_INLINE avec8pd(const FVEC_NAME &a) { + lo_ = _mm256_cvtps_pd(get_ps_lo(a.val_)); + hi_ = _mm256_cvtps_pd(get_ps_hi(a.val_)); + } + VEC_INLINE static avec8pd undefined() { + return avec8pd(_mm256_undefined_pd(), _mm256_undefined_pd()); + } + VEC_INLINE static avec8pd mask_gather( + const avec8pd &src, const BVEC_NAME &mask, const IVEC_NAME &idx, + const double * mem, const int scale + ) { +# ifndef __AVX2__ + assert(scale == sizeof(double)); + int idx_buf[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*) idx_buf, idx.val_); + int mask_val = _mm256_movemask_ps(mask.val_); + double ret_buf[8] __attribute__((aligned(32))); + _mm256_store_pd(&ret_buf[0], src.lo_); + _mm256_store_pd(&ret_buf[4], src.hi_); + for (int i = 0; i < 8; i++) { + if (mask_val & (1 << i)) { + ret_buf[i] = mem[idx_buf[i]]; + } + } + __m256d lo = _mm256_load_pd(&ret_buf[0]); + __m256d hi = _mm256_load_pd(&ret_buf[4]); +# else + static const unsigned int lo_shuffle[8] __attribute__((aligned(32))) = + {0, 0, 1, 1, 2, 2, 3, 3}; + static const unsigned int hi_shuffle[8] __attribute__((aligned(32))) = + {4, 4, 5, 5, 6, 6, 7, 7}; + __m256d lo_mask = _mm256_castps_pd(_mm256_permutevar8x32_ps(mask.val_, + _mm256_load_si256((__m256i*) lo_shuffle))); + __m256d hi_mask = _mm256_castps_pd(_mm256_permutevar8x32_ps(mask.val_, + _mm256_load_si256((__m256i*) hi_shuffle))); + __m256d lo = _mm256_mask_i32gather_pd(src.lo_, mem, get_si_lo(idx.val_), + lo_mask, sizeof(double)); + __m256d hi = _mm256_mask_i32gather_pd(src.hi_, mem, get_si_hi(idx.val_), + hi_mask, sizeof(double)); +# endif + return avec8pd(lo, hi); + } + VEC_INLINE static void mask_i32loscatter( + double * mem, const BVEC_NAME &mask, const IVEC_NAME &idx, + const avec8pd &a, const int scale + ) { + assert(scale == sizeof(double)); + double a_buf[8] __attribute__((aligned(32))); + _mm256_store_pd(a_buf, a.lo_); + _mm256_store_pd(&a_buf[4], a.hi_); + int idx_buf[8] __attribute__((aligned(32))); + _mm256_store_si256((__m256i*)idx_buf, idx.val_); + int mask_val = _mm256_movemask_ps(mask.val_); + for (int i = 0; i < 8; i++) { + if (mask_val & (1 << i)) + mem[idx_buf[i]] = a_buf[i]; + } + } + + #define AVEC2_BINOP(the_sym, the_name) \ + VEC_INLINE inline avec8pd operator the_sym(const avec8pd &b) const { \ + __m256d lo = _mm256_##the_name##_pd(this->lo_, b.lo_); \ + __m256d hi = _mm256_##the_name##_pd(this->hi_, b.hi_); \ + return avec8pd(lo, hi); \ + } + AVEC2_BINOP(-, sub) +}; +#endif + +} + + +#ifdef FVEC_FIRST_PASS + +template +struct intr_types; + +template<> +struct intr_types { + typedef mm256::fvec4pd fvec; + typedef mm256::ivec4 ivec; + typedef mm256::bvec4 bvec; + typedef mm256::avec4pd avec; +}; + +template<> +struct intr_types { + typedef mm256::fvec8ps fvec; + typedef mm256::ivec8 ivec; + typedef mm256::bvec8 bvec; + typedef mm256::avec8ps avec; +}; + +template<> +struct intr_types { + typedef mm256::fvec8ps fvec; + typedef mm256::ivec8 ivec; + typedef mm256::bvec8 bvec; + typedef mm256::avec8pd avec; +}; + +#endif + +#ifndef FVEC_FIRST_PASS +# define FVEC_FIRST_PASS +# include "intel_intrinsics_airebo.h" +#endif + +#endif + +#ifdef LMP_INTEL_AIREBO_SCALAR + +#include +#include +#include + +#define VEC_INLINE __attribute__((always_inline)) + +template +struct intr_types { + +class fvec; +class ivec; +class avec; +class bvec { + friend class fvec; + friend class ivec; + friend class avec; + bool val_; + VEC_INLINE bvec(const bool &v) : val_(v) {} +public: + VEC_INLINE bvec() {} + VEC_INLINE static bvec kand(const bvec &a, const bvec &b) { + return a.val_ && b.val_; + } + VEC_INLINE static bvec kandn(const bvec &a, const bvec &b) { + return (! a.val_) && b.val_; + } + VEC_INLINE static bvec knot(const bvec &a) { + return ! a.val_; + } + VEC_INLINE static int kortestz(const bvec &a, const bvec &b) { + return (! a.val_) && (! b.val_) ? true : false; + } + VEC_INLINE static bvec masku_compress(const bvec &mask, const bvec &a) { + return mask.val_ ? a.val_ : false; + } + VEC_INLINE static bvec mask_expand(const bvec &src, const bvec &mask, + const bvec &a) { + return mask.val_ ? a.val_ : src.val_; + } + VEC_INLINE static bvec full() { + return true; + } + VEC_INLINE static bvec empty() { + return false; + } + VEC_INLINE static bvec only(int n) { + return n == 1 ? true : false; + } + VEC_INLINE static bvec after(int n) { + return n == 0 ? true : false; + } + VEC_INLINE static bvec onlyafter(int only, int after) { + return after == 0 && only == 1 ? true : false; + } + VEC_INLINE static int popcnt(const bvec &a) { + return static_cast(a.val_); + } + VEC_INLINE static bool test_all_unset(const bvec &a) { + return kortestz(a, a); + } + VEC_INLINE static bool test_any_set(const bvec &a) { + return ! test_all_unset(a); + } + VEC_INLINE static bool test_at(const bvec &a, int i) { + assert(i < 1); + return a.val_; + } + VEC_INLINE bvec operator &(const bvec &b) const { + return val_ && b.val_; + } + VEC_INLINE bvec operator |(const bvec &b) const { + return val_ || b.val_; + } + VEC_INLINE bvec operator ~() const { + return ! val_; + } +}; + +class ivec { + friend class fvec; + friend class avec; + int val_; + VEC_INLINE ivec(const int &v) : val_(v) {} +public: + static const int VL = 1; + VEC_INLINE ivec() {} + + #define IVEC_MASK_BINFN_B(the_name, the_op) \ + VEC_INLINE static bvec the_name(const ivec &a, const ivec &b) { \ + return a.val_ the_op b.val_; \ + } \ + VEC_INLINE static bvec mask_##the_name( \ + const bvec &mask, \ + const ivec &a, const ivec &b \ + ) { \ + return mask.val_ && (a.val_ the_op b.val_); \ + \ + } + IVEC_MASK_BINFN_B(cmpeq, ==) + IVEC_MASK_BINFN_B(cmplt, <) + IVEC_MASK_BINFN_B(cmpneq, !=) + IVEC_MASK_BINFN_B(cmpgt, >) + + #define IVEC_MASK_BINFN_I(the_name, the_op) \ + VEC_INLINE static ivec mask_##the_name( \ + const ivec &src, const bvec &mask, \ + const ivec &a, const ivec &b \ + ) { \ + return mask.val_ ? a.val_ the_op b.val_ : src.val_; \ + } + IVEC_MASK_BINFN_I(add, +) + VEC_INLINE static ivec mask_blend( + const bvec &mask, const ivec &a, const ivec &b + ) { + return mask.val_ ? b.val_ : a.val_; + } + + #define IVEC_BINFN_I(the_name, the_op) \ + VEC_INLINE static ivec the_name(const ivec &a, const ivec &b) { \ + return a.val_ the_op b.val_; \ + } + IVEC_BINFN_I(mullo, *) + IVEC_BINFN_I(srlv, >>) + VEC_INLINE static ivec the_and(const ivec &a, const ivec &b) { + return a.val_ & b.val_; + } + + VEC_INLINE static ivec mask_expand( + const ivec &src, const bvec &a, const ivec &b + ) { + return a.val_ ? b.val_ : src.val_; + } + VEC_INLINE static ivec masku_compress( + const bvec &a, const ivec &b + ) { + return a.val_ ? b.val_ : 0; + } + + VEC_INLINE static int at(const ivec &a, int b) { + assert(b == 0); + return a.val_; + } + + VEC_INLINE static ivec load(const int * src) { + return *src; + } + VEC_INLINE static ivec mask_loadu(const bvec &mask, const int * src) { + return mask.val_ ? *src : 0xDEAD; + } + VEC_INLINE static ivec maskz_loadu(const bvec &mask, const int * src) { + return mask.val_ ? *src : 0; + } + VEC_INLINE static void mask_storeu(const bvec &mask, int * dest, + const ivec &src) { + if (mask.val_) *dest = src.val_; + } + VEC_INLINE static void store(int * dest, const ivec &src) { + *dest = src.val_; + } + + VEC_INLINE static ivec mask_gather( + const ivec &src, const bvec &mask, const ivec &idx, const int * mem, + const int scale + ) { + return mask.val_ ? *reinterpret_cast + (reinterpret_cast(mem) + scale * idx.val_) : src.val_; + } + VEC_INLINE static void mask_i32scatter( + int * mem, const bvec &mask, const ivec &idx, const ivec &a, + const int scale + ) { + if (mask.val_) *reinterpret_cast(reinterpret_cast(mem) + + scale * idx.val_) = a.val_; + } + + VEC_INLINE static void mask_compressstore(const bvec &mask, int * dest, + const ivec &src) { + if (mask.val_) *dest = src.val_; + } + + VEC_INLINE static ivec set( + int i15, int i14, int i13, int i12, int i11, int i10, int i9, int i8, + int i7, int i6, int i5, int i4, int i3, int i2, int i1, int i0 + ) { + return i0; + } + VEC_INLINE static ivec set1(int i) { + return i; + } + VEC_INLINE static ivec setzero() { + return 0; + } + VEC_INLINE static ivec undefined() { + return 0xDEAD; + } + + VEC_INLINE ivec operator +(const ivec &b) const { + return val_ + b.val_; + } +}; + +class fvec { + friend class avec; + flt_t val_; + VEC_INLINE fvec(const flt_t &v) : val_(v) {} +public: + static const int VL = 1; + VEC_INLINE fvec() {} + VEC_INLINE static flt_t at(const fvec &a, int i) { + assert(i < 1); + return a.val_; + } + VEC_INLINE static bool fast_compress() { return false; } + + #define FVEC_MASK_BINFN_B(the_name, the_op) \ + VEC_INLINE static bvec the_name(const fvec &a, const fvec &b) { \ + return a.val_ the_op b.val_; \ + } \ + VEC_INLINE static bvec mask_##the_name( \ + const bvec &mask, \ + const fvec &a, const fvec &b \ + ) { \ + return mask.val_ && (a.val_ the_op b.val_); \ + } + FVEC_MASK_BINFN_B(cmple, <=) + FVEC_MASK_BINFN_B(cmplt, <) + FVEC_MASK_BINFN_B(cmpneq, !=) + FVEC_MASK_BINFN_B(cmpnle, >) + FVEC_MASK_BINFN_B(cmpnlt, >=) + + #define FVEC_UNFN_F(the_name, the_fn) \ + VEC_INLINE static fvec the_name(const fvec &a) { \ + return the_fn(a.val_); \ + } + FVEC_UNFN_F(abs, fabs) + FVEC_UNFN_F(exp, ::exp) + FVEC_UNFN_F(invsqrt, 1/std::sqrt) + FVEC_UNFN_F(recip, 1/) + FVEC_UNFN_F(sqrt, std::sqrt) + + #define FVEC_MASK_UNFN_F(the_name, the_fn) \ + VEC_INLINE static fvec mask_##the_name( \ + const fvec &src, const bvec &mask, \ + const fvec &a \ + ) { \ + return mask.val_ ? the_fn(a.val_) : src.val_; \ + } + FVEC_MASK_UNFN_F(cos, std::cos) + FVEC_MASK_UNFN_F(recip, 1/) + FVEC_MASK_UNFN_F(sqrt, std::sqrt) + + #define FVEC_BINFN_F(the_name, the_fn) \ + VEC_INLINE static fvec the_name(const fvec &a, const fvec &b) { \ + return the_fn(a.val_, b.val_); \ + } + FVEC_BINFN_F(max, ::fmax) + FVEC_BINFN_F(min, ::fmin) + + #define FVEC_MASK_BINFN_F(the_name, the_op) \ + VEC_INLINE static fvec mask_##the_name( \ + const fvec &src, const bvec &mask, \ + const fvec &a, const fvec &b \ + ) { \ + return mask.val_ ? a.val_ the_op b.val_ : src.val_; \ + } + FVEC_MASK_BINFN_F(add, +) + FVEC_MASK_BINFN_F(div, /) + FVEC_MASK_BINFN_F(mul, *) + FVEC_MASK_BINFN_F(sub, -) + VEC_INLINE static fvec mask_blend( + const bvec &mask, const fvec &a, const fvec &b + ) { + return mask.val_ ? b.val_ : a.val_; + } + + VEC_INLINE static fvec mask_expand( + const fvec &src, const bvec &a, const fvec &b + ) { + return a.val_ ? b.val_ : src.val_; + } + VEC_INLINE static fvec masku_compress( + const bvec &a, const fvec &b + ) { + return a.val_ ? b.val_ : 0; + } + + VEC_INLINE static fvec set1(const flt_t &a) { + return a; + } + VEC_INLINE static fvec setzero() { + return 0; + } + VEC_INLINE static fvec undefined() { + return 1337.1337; + } + + VEC_INLINE static fvec load(const flt_t *mem) { + return *mem; + } + VEC_INLINE static void mask_storeu(const bvec &mask, flt_t * dest, + const fvec &a) { + if (mask.val_) *dest = a.val_; + } + VEC_INLINE static void store(flt_t * dest, const fvec &a) { + *dest = a.val_; + } + + VEC_INLINE static fvec gather(const ivec &idx, const flt_t * mem, + const int scale) { + return *reinterpret_cast(reinterpret_cast(mem) + + scale * idx.val_); + } + VEC_INLINE static fvec mask_gather( + const fvec &src, const bvec &mask, const ivec &idx, + const flt_t * mem, const int scale + ) { + return mask.val_ ? *reinterpret_cast + (reinterpret_cast(mem) + scale * idx.val_) : src.val_; + } + + VEC_INLINE static void gather_3_adjacent(const ivec &idx, const flt_t * mem, + const int scale, fvec * out_0, + fvec * out_1, fvec * out_2) { + assert(scale == sizeof(flt_t)); + *out_0 = gather(idx, mem + 0, scale); + *out_1 = gather(idx, mem + 1, scale); + *out_2 = gather(idx, mem + 2, scale); + } + VEC_INLINE static void gather_4_adjacent(const ivec &idx, const flt_t * mem, + const int scale, fvec * out_0, + fvec * out_1, fvec * out_2, + fvec * out_3) { + assert(scale == sizeof(flt_t)); + *out_0 = gather(idx, mem + 0, scale); + *out_1 = gather(idx, mem + 1, scale); + *out_2 = gather(idx, mem + 2, scale); + *out_3 = gather(idx, mem + 3, scale); + } + + VEC_INLINE static flt_t mask_reduce_add(const bvec &mask, const fvec &a) { + return mask.val_ ? a.val_ : 0; + } + VEC_INLINE static flt_t reduce_add(const fvec &a) { + return a.val_; + } + + VEC_INLINE static ivec unpackloepi32(const fvec &a) { + return reinterpret_cast(&a.val_)[0]; + } + + VEC_INLINE static fvec mask_sincos( + fvec * cos_out, const fvec &src_a, const fvec &src_b, + const bvec &mask, const fvec &arg + ) { + cos_out->val_ = mask.val_ ? ::cos(arg.val_) : src_b.val_; + return mask.val_ ? ::sin(arg.val_) : src_a.val_; + } + + #define FVEC_BINOP(the_sym, the_name) \ + VEC_INLINE inline fvec operator the_sym(const fvec &b) const { \ + return this->val_ the_sym b.val_; \ + } + FVEC_BINOP(+, add) + FVEC_BINOP(-, sub) + FVEC_BINOP(*, mul) + FVEC_BINOP(/, div) + + VEC_INLINE static void gather_prefetch0(const ivec &idx, const void * mem) {} +}; + +class avec { + acc_t val_; + VEC_INLINE avec(const acc_t &a) : val_(a) {} +public: + VEC_INLINE avec(const fvec &a) : val_(a.val_) {} + VEC_INLINE static avec undefined() { + return 1337.1337; + } + VEC_INLINE static avec mask_gather(const avec &src, const bvec &mask, + const ivec &idx, const acc_t * mem, + const int scale) { + return mask.val_ ? *reinterpret_cast + (reinterpret_cast(mem) + scale * idx.val_) : src.val_; + } + VEC_INLINE static void mask_i32loscatter(acc_t * mem, const bvec &mask, + const ivec &idx, const avec &a, + const int scale) { + if (mask.val_) *reinterpret_cast(reinterpret_cast(mem) + + idx.val_ * scale) = a.val_; + } + + #define AVEC_BINOP(the_sym, the_name) \ + VEC_INLINE inline avec operator the_sym(const avec &b) const { \ + return this->val_ the_sym b.val_; \ + } + AVEC_BINOP(-, sub) +}; + +}; + +#endif diff --git a/src/USER-INTEL/intel_preprocess.h b/src/USER-INTEL/intel_preprocess.h index 24cb92a0f3..068f61023e 100644 --- a/src/USER-INTEL/intel_preprocess.h +++ b/src/USER-INTEL/intel_preprocess.h @@ -211,10 +211,9 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, datasize); \ } -#define IP_PRE_omp_range_id_vec(ifrom, ito, tid, inum, \ - nthreads, vecsize) \ +#define IP_PRE_omp_range_vec(ifrom, ito, tid, inum, nthreads, \ + vecsize) \ { \ - tid = omp_get_thread_num(); \ int idelta = static_cast(ceil(static_cast(inum) \ /vecsize/nthreads)); \ idelta *= vecsize; \ @@ -223,6 +222,14 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, if (ito > inum) ito = inum; \ } +#define IP_PRE_omp_range_id_vec(ifrom, ito, tid, inum, \ + nthreads, vecsize) \ + { \ + tid = omp_get_thread_num(); \ + IP_PRE_omp_range_vec(ifrom, ito, tid, inum, nthreads, \ + vecsize); \ + } + #define IP_PRE_omp_stride_id_vec(ifrom, ip, ito, tid, inum, \ nthr, vecsize) \ { \ @@ -235,13 +242,12 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, int nd = nthr / INTEL_HTHREADS; \ int td = tid / INTEL_HTHREADS; \ int tm = tid % INTEL_HTHREADS; \ - IP_PRE_omp_range_id_vec(ifrom, ito, td, inum, nd, \ - vecsize); \ + IP_PRE_omp_range_vec(ifrom, ito, td, inum, nd, vecsize); \ ifrom += tm * vecsize; \ ip = INTEL_HTHREADS * vecsize; \ } else { \ - IP_PRE_omp_range_id_vec(ifrom, ito, tid, inum, nthr, \ - vecsize); \ + IP_PRE_omp_range_vec(ifrom, ito, tid, inum, nthr, \ + vecsize); \ ip = vecsize; \ } \ } @@ -255,11 +261,10 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, ito = inum; \ } -#define IP_PRE_omp_range(ifrom, ip, ito, tid, inum, nthreads) \ +#define IP_PRE_omp_range(ifrom, ito, tid, inum, nthreads) \ { \ ifrom = 0; \ ito = inum; \ - ip = 1; \ } #define IP_PRE_omp_stride_id(ifrom, ip, ito, tid, inum, nthr) \ @@ -293,6 +298,15 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, ito = inum; \ } +#define IP_PRE_omp_stride_id_vec(ifrom, ip, ito, tid, inum, \ + nthr, vecsize) \ + { \ + tid = 0; \ + ifrom = 0; \ + ip = 1; \ + ito = inum; \ + } + #endif #define IP_PRE_fdotr_acc_force_l5(lf, lt, minlocal, nthreads, f_start, \ diff --git a/src/USER-INTEL/nbin_intel.cpp b/src/USER-INTEL/nbin_intel.cpp index c5574a78c7..9a1dae36ca 100644 --- a/src/USER-INTEL/nbin_intel.cpp +++ b/src/USER-INTEL/nbin_intel.cpp @@ -18,8 +18,9 @@ #include "nbin_intel.h" #include "atom.h" #include "group.h" -#include "domain.h" #include "comm.h" +#include "domain.h" +#include "modify.h" #include "update.h" #include "error.h" @@ -211,6 +212,8 @@ void NBinIntel::bin_atoms(IntelBuffers * buffers) { for (i = nall-1; i >= nlocal; i--) { if (mask[i] & bitmask) { ibin = coord2bin(atom->x[i]); + // Only necessary to store when neighboring ghost + atombin[i] = ibin; bins[i] = binhead[ibin]; binhead[ibin] = i; } @@ -222,14 +225,10 @@ void NBinIntel::bin_atoms(IntelBuffers * buffers) { binhead[ibin] = i; } } else { - for (i = nall-1; i >= nlocal; i--) { + for (i = nall-1; i >= 0; i--) { ibin = coord2bin(atom->x[i]); - bins[i] = binhead[ibin]; - binhead[ibin] = i; - } - for (i = nlocal-1; i >= 0; i--) { - ibin = coord2bin(atom->x[i]); - atombin[i]=ibin; + // Only necessary to store for ghost when neighboring ghost + atombin[i] = ibin; bins[i] = binhead[ibin]; binhead[ibin] = i; } diff --git a/src/USER-INTEL/npair_full_bin_ghost_intel.cpp b/src/USER-INTEL/npair_full_bin_ghost_intel.cpp new file mode 100644 index 0000000000..a814891f25 --- /dev/null +++ b/src/USER-INTEL/npair_full_bin_ghost_intel.cpp @@ -0,0 +1,593 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: W. Michael Brown (Intel) +------------------------------------------------------------------------- */ + +#include "npair_full_bin_ghost_intel.h" +#include "neighbor.h" +#include "nstencil.h" +#include "neigh_list.h" +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "domain.h" +#include "molecule.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairFullBinGhostIntel::NPairFullBinGhostIntel(LAMMPS *lmp) : NPairIntel(lmp) {} + +/* ---------------------------------------------------------------------- + binned neighbor list construction for all neighbors + include neighbors of ghost atoms, but no "special neighbors" for ghosts + every neighbor pair appears in list of both atoms i and j +------------------------------------------------------------------------- */ + +void NPairFullBinGhostIntel::build(NeighList *list) +{ + #ifdef _LMP_INTEL_OFFLOAD + if (_fix->offload_noghost()) + error->all(FLERR, + "The 'ghost no' option cannot be used with this USER-INTEL pair style."); + #endif + + if (nstencil > INTEL_MAX_STENCIL_CHECK) + error->all(FLERR, "Too many neighbor bins for USER-INTEL package."); + + #ifdef _LMP_INTEL_OFFLOAD + if (exclude) + error->all(FLERR, "Exclusion lists not yet supported for Intel offload"); + #endif + + if (_fix->precision() == FixIntel::PREC_MODE_MIXED) + fbi(list, _fix->get_mixed_buffers()); + else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) + fbi(list, _fix->get_double_buffers()); + else + fbi(list, _fix->get_single_buffers()); + + _fix->stop_watch(TIME_HOST_NEIGHBOR); +} + +/* ---------------------------------------------------------------------- */ + +template +void NPairFullBinGhostIntel::fbi(NeighList * list, + IntelBuffers * buffers) +{ + const int nlocal = atom->nlocal; + const int nall = atom->nlocal + atom->nghost; + list->inum = atom->nlocal; + list->gnum = atom->nghost; + + int host_start = _fix->host_start_neighbor(); + const int off_end = _fix->offload_end_neighbor(); + + #ifdef _LMP_INTEL_OFFLOAD + if (off_end) grow_stencil(); + if (_fix->full_host_list()) host_start = 0; + int offload_noghost = _fix->offload_noghost(); + #endif + + // only uses offload_end_neighbor to check whether we are doing offloading + // at all, no need to correct this later + buffers->grow_list(list, nall, comm->nthreads, off_end, + _fix->nbor_pack_width()); + + int need_ic = 0; + if (atom->molecular) + dminimum_image_check(need_ic, neighbor->cutneighmax, neighbor->cutneighmax, + neighbor->cutneighmax); + + if (need_ic) { + fbi(1, list, buffers, 0, off_end); + fbi(0, list, buffers, host_start, nlocal); + } else { + fbi(1, list, buffers, 0, off_end); + fbi(0, list, buffers, host_start, nlocal); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void NPairFullBinGhostIntel::fbi(const int offload, NeighList * list, + IntelBuffers * buffers, + const int pstart, const int pend) { + if (pend-pstart == 0) return; + + const int nall = atom->nlocal + atom->nghost; + int pad = 1; + int nall_t = nall; + const int aend = nall; + + const int pack_width = _fix->nbor_pack_width(); + const ATOM_T * _noalias const x = buffers->get_x(); + int * _noalias const firstneigh = buffers->firstneigh(list); + const int e_nall = nall_t; + + const int molecular = atom->molecular; + int *ns = NULL; + tagint *s = NULL; + int tag_size = 0, special_size; + if (buffers->need_tag()) tag_size = e_nall; + if (molecular) { + s = atom->special[0]; + ns = atom->nspecial[0]; + special_size = aend; + } else { + s = &buffers->_special_holder; + ns = &buffers->_nspecial_holder; + special_size = 0; + } + const tagint * _noalias const special = s; + const int * _noalias const nspecial = ns; + const int maxspecial = atom->maxspecial; + const tagint * _noalias const tag = atom->tag; + + int * _noalias const ilist = list->ilist; + int * _noalias numneigh = list->numneigh; + int * _noalias const cnumneigh = buffers->cnumneigh(list); + const int nstencil = this->nstencil; + const int * _noalias const stencil = this->stencil; + const flt_t * _noalias const cutneighsq = buffers->get_cutneighsq()[0]; + const flt_t * _noalias const cutneighghostsq = + buffers->get_cutneighghostsq()[0]; + const int ntypes = atom->ntypes + 1; + const int nlocal = atom->nlocal; + + #ifndef _LMP_INTEL_OFFLOAD + int * const mask = atom->mask; + tagint * const molecule = atom->molecule; + #endif + + int *molindex = atom->molindex; + int *molatom = atom->molatom; + Molecule **onemols = atom->avec->onemols; + int moltemplate; + if (molecular == 2) moltemplate = 1; + else moltemplate = 0; + if (moltemplate) + error->all(FLERR, + "Can't use moltemplate with npair style full/bin/ghost/intel."); + + int tnum; + int *overflow; + double *timer_compute; + #ifdef _LMP_INTEL_OFFLOAD + if (offload) { + timer_compute = _fix->off_watch_neighbor(); + tnum = buffers->get_off_threads(); + overflow = _fix->get_off_overflow_flag(); + _fix->stop_watch(TIME_HOST_NEIGHBOR); + _fix->start_watch(TIME_OFFLOAD_LATENCY); + } else + #endif + { + tnum = comm->nthreads; + overflow = _fix->get_overflow_flag(); + } + const int nthreads = tnum; + const int maxnbors = buffers->get_max_nbors(); + int * _noalias const atombin = buffers->get_atombin(); + const int * _noalias const binpacked = buffers->get_binpacked(); + + const int xperiodic = domain->xperiodic; + const int yperiodic = domain->yperiodic; + const int zperiodic = domain->zperiodic; + const flt_t xprd_half = domain->xprd_half; + const flt_t yprd_half = domain->yprd_half; + const flt_t zprd_half = domain->zprd_half; + + flt_t * _noalias const ncachex = buffers->get_ncachex(); + flt_t * _noalias const ncachey = buffers->get_ncachey(); + flt_t * _noalias const ncachez = buffers->get_ncachez(); + int * _noalias const ncachej = buffers->get_ncachej(); + int * _noalias const ncachejtype = buffers->get_ncachejtype(); + int * _noalias const ncachetag = buffers->get_ncachetag(); + const int ncache_stride = buffers->ncache_stride(); + + const int mbinx = this->mbinx; + const int mbiny = this->mbiny; + const int mbinz = this->mbinz; + const int * const stencilxyz = &this->stencilxyz[0][0]; + + #ifdef _LMP_INTEL_OFFLOAD + const int * _noalias const binhead = this->binhead; + const int * _noalias const bins = this->bins; + const int cop = _fix->coprocessor_number(); + const int separate_buffers = _fix->separate_buffers(); + #pragma offload target(mic:cop) if(offload) \ + in(x:length(e_nall+1) alloc_if(0) free_if(0)) \ + in(tag:length(tag_size) alloc_if(0) free_if(0)) \ + in(special:length(special_size*maxspecial) alloc_if(0) free_if(0)) \ + in(nspecial:length(special_size*3) alloc_if(0) free_if(0)) \ + in(bins,binpacked:length(nall) alloc_if(0) free_if(0)) \ + in(binhead:length(mbins+1) alloc_if(0) free_if(0)) \ + in(cutneighsq:length(0) alloc_if(0) free_if(0)) \ + in(cutneighghostsq:length(0) alloc_if(0) free_if(0)) \ + in(firstneigh:length(0) alloc_if(0) free_if(0)) \ + in(cnumneigh:length(0) alloc_if(0) free_if(0)) \ + in(numneigh:length(0) alloc_if(0) free_if(0)) \ + in(ilist:length(0) alloc_if(0) free_if(0)) \ + in(atombin:length(aend) alloc_if(0) free_if(0)) \ + in(stencil:length(nstencil) alloc_if(0) free_if(0)) \ + in(ncachex,ncachey,ncachez,ncachej:length(0) alloc_if(0) free_if(0)) \ + in(ncachejtype,ncachetag:length(0) alloc_if(0) free_if(0)) \ + in(ncache_stride,maxnbors,nthreads,maxspecial,nstencil,e_nall,offload) \ + in(separate_buffers,aend,nlocal,molecular,ntypes,mbinx,mbiny) \ + in(mbinz,xperiodic,yperiodic,zperiodic,xprd_half,yprd_half,zprd_half) \ + in(stencilxyz:length(3*nstencil)) \ + out(overflow:length(5) alloc_if(0) free_if(0)) \ + out(timer_compute:length(1) alloc_if(0) free_if(0)) \ + signal(tag) + #endif + { + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime(); + #endif + + #ifdef _LMP_INTEL_OFFLOAD + overflow[LMP_LOCAL_MIN] = 0; + overflow[LMP_LOCAL_MAX] = aend - 1; + overflow[LMP_GHOST_MIN] = e_nall; + overflow[LMP_GHOST_MAX] = -1; + #endif + + int nstencilp = 0; + int binstart[INTEL_MAX_STENCIL], binend[INTEL_MAX_STENCIL]; + for (int k = 0; k < nstencil; k++) { + binstart[nstencilp] = stencil[k]; + int end = stencil[k] + 1; + for (int kk = k + 1; kk < nstencil; kk++) { + if (stencil[kk-1]+1 == stencil[kk]) { + end++; + k++; + } else break; + } + binend[nstencilp] = end; + nstencilp++; + } + + const int mbinyx = mbiny * mbinx; + + #if defined(_OPENMP) + #pragma omp parallel + #endif + { + const int num = aend; + int tid, ifrom, ito; + + const double balance_factor = 2.0; + const double ibalance_factor = 1.0 / balance_factor; + const int gnum = num - nlocal; + const int wlocal = static_cast(ceil(balance_factor * nlocal)); + const int snum = wlocal + gnum; + IP_PRE_omp_range_id(ifrom, ito, tid, snum, nthreads); + if (ifrom < wlocal) ifrom = static_cast(ibalance_factor * ifrom); + else ifrom -= wlocal - nlocal; + if (ito < wlocal) ito = static_cast(ibalance_factor * ito); + else ito -= wlocal - nlocal; + + int e_ito = ito; + const int list_size = (e_ito + tid * 2 + 2) * maxnbors; + + int which; + + int pack_offset = maxnbors; + int ct = (ifrom + tid * 2) * maxnbors; + int *neighptr = firstneigh + ct; + const int obound = pack_offset + maxnbors * 2; + + const int toffs = tid * ncache_stride; + flt_t * _noalias const tx = ncachex + toffs; + flt_t * _noalias const ty = ncachey + toffs; + flt_t * _noalias const tz = ncachez + toffs; + int * _noalias const tj = ncachej + toffs; + int * _noalias const tjtype = ncachejtype + toffs; + int * _noalias const ttag = ncachetag + toffs; + + // loop over all atoms in other bins in stencil, store every pair + int istart, icount, ncount, oldbin = -9999999, lane, max_chunk; + for (int i = ifrom; i < ito; i++) { + const flt_t xtmp = x[i].x; + const flt_t ytmp = x[i].y; + const flt_t ztmp = x[i].z; + const int itype = x[i].w; + const tagint itag = tag[i]; + const int ioffset = ntypes * itype; + + const int ibin = atombin[i]; + if (ibin != oldbin) { + oldbin = ibin; + ncount = 0; + if (i < nlocal) { + for (int k = 0; k < nstencilp; k++) { + const int bstart = binhead[ibin + binstart[k]]; + const int bend = binhead[ibin + binend[k]]; + #if defined(LMP_SIMD_COMPILER) + #pragma simd + #endif + for (int jj = bstart; jj < bend; jj++) + tj[ncount++] = binpacked[jj]; + } + } else { + const int zbin = ibin / mbinyx; + const int zrem = ibin % mbinyx; + const int ybin = zrem / mbinx; + const int xbin = zrem % mbinx; + for (int k = 0; k < nstencil; k++) { + const int xbin2 = xbin + stencilxyz[3 * k + 0]; + const int ybin2 = ybin + stencilxyz[3 * k + 1]; + const int zbin2 = zbin + stencilxyz[3 * k + 2]; + if (xbin2 < 0 || xbin2 >= mbinx || + ybin2 < 0 || ybin2 >= mbiny || + zbin2 < 0 || zbin2 >= mbinz) continue; + + const int bstart = binhead[ibin + stencil[k]]; + const int bend = binhead[ibin + stencil[k] + 1]; + #if defined(LMP_SIMD_COMPILER) + #pragma simd + #endif + for (int jj = bstart; jj < bend; jj++) + tj[ncount++] = binpacked[jj]; + } + } // if i < nlocal + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd + #endif + for (int u = 0; u < ncount; u++) { + const int j = tj[u]; + tx[u] = x[j].x; + ty[u] = x[j].y; + tz[u] = x[j].z; + tjtype[u] = x[j].w; + ttag[u] = tag[j]; + } + } // if ibin != oldbin + + // ---------------------- Loop over other bins + + int n = maxnbors; + int n2 = n * 2; + int *neighptr2 = neighptr; + const flt_t * _noalias cutsq; + if (i < nlocal) cutsq = cutneighsq; + else cutsq = cutneighghostsq; + + const int icp = i; + + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int u = 0; u < ncount; u++) { + int addme = 1; + int j = tj[u]; + + if (i == j) addme = 0; + + // Cutoff Check + const flt_t delx = xtmp - tx[u]; + const flt_t dely = ytmp - ty[u]; + const flt_t delz = ztmp - tz[u]; + const int jtype = tjtype[u]; + const int jtag = ttag[u]; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + if (rsq > cutsq[ioffset + jtype]) addme = 0; + + if (need_ic && icp < nlocal) { + int no_special; + ominimum_image_check(no_special, delx, dely, delz); + if (no_special) + j = -j - 1; + } + + int flist = 0; + if (itag > jtag) { + if (((itag+jtag) & 1) == 0) flist = 1; + } else if (itag < jtag) { + if (((itag+jtag) & 1) == 1) flist = 1; + } else { + if (tz[u] < ztmp) flist = 1; + else if (tz[u] == ztmp && ty[u] < ytmp) flist = 1; + else if (tz[u] == ztmp && ty[u] == ytmp && tx[u] < xtmp) + flist = 1; + } + if (addme) { + if (flist) + neighptr2[n2++] = j; + else + neighptr[n++] = j; + } + } // for u + + #ifndef _LMP_INTEL_OFFLOAD + if (exclude) { + int alln = n; + n = maxnbors; + for (int u = pack_offset; u < alln; u++) { + const int j = neighptr[u]; + int pj = j; + if (need_ic) + if (pj < 0) pj = -j - 1; + const int jtype = x[pj].w; + if (exclusion(i,pj,itype,jtype,mask,molecule)) continue; + neighptr[n++] = j; + } + alln = n2; + n2 = maxnbors * 2; + for (int u = n2; u < alln; u++) { + const int j = neighptr[u]; + int pj = j; + if (need_ic) + if (pj < 0) pj = -j - 1; + const int jtype = x[pj].w; + if (exclusion(i,pj,itype,jtype,mask,molecule)) continue; + neighptr[n2++] = j; + } + } + #endif + int ns = n - maxnbors; + int alln = n; + atombin[i] = ns; + n = 0; + for (int u = maxnbors; u < alln; u++) + neighptr[n++] = neighptr[u]; + ns += n2 - maxnbors * 2; + for (int u = maxnbors * 2; u < n2; u++) + neighptr[n++] = neighptr[u]; + if (ns > maxnbors) *overflow = 1; + + ilist[i] = i; + cnumneigh[i] = ct; + numneigh[i] = ns; + + ct += ns; + const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); + const int edge = ct & (alignb - 1); + if (edge) ct += alignb - edge; + neighptr = firstneigh + ct; + if (ct + obound > list_size) { + if (i < ito - 1) { + *overflow = 1; + ct = (ifrom + tid * 2) * maxnbors; + } + } + } + + if (*overflow == 1) + for (int i = ifrom; i < ito; i++) + numneigh[i] = 0; + + #ifdef _LMP_INTEL_OFFLOAD + int ghost_offset = 0, nall_offset = e_nall; + if (separate_buffers) { + for (int i = ifrom; i < ito; ++i) { + int * _noalias jlist = firstneigh + cnumneigh[i]; + const int jnum = numneigh[i]; + #if __INTEL_COMPILER+0 > 1499 + #pragma vector aligned + #pragma simd + #endif + for (int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + if (need_ic && j < 0) j = -j - 1; + } + } + + overflow[LMP_LOCAL_MIN] = 0; + overflow[LMP_LOCAL_MAX] = nlocal - 1; + overflow[LMP_GHOST_MIN] = nlocal; + overflow[LMP_GHOST_MAX] = e_nall - 1; + + int nghost = overflow[LMP_GHOST_MAX] + 1 - overflow[LMP_GHOST_MIN]; + if (nghost < 0) nghost = 0; + if (offload) { + ghost_offset = overflow[LMP_GHOST_MIN] - overflow[LMP_LOCAL_MAX] - 1; + nall_offset = overflow[LMP_LOCAL_MAX] + 1 + nghost; + } else { + ghost_offset = overflow[LMP_GHOST_MIN] - nlocal; + nall_offset = nlocal + nghost; + } + } // if separate_buffers + #endif + + if (molecular) { + int ito_m = ito; + if (ito >= nlocal) ito_m = nlocal; + for (int i = ifrom; i < ito_m; ++i) { + int * _noalias jlist = firstneigh + cnumneigh[i]; + const int jnum = numneigh[i]; + + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd + #endif + for (int jj = 0; jj < jnum; jj++) { + const int j = jlist[jj]; + if (need_ic && j < 0) { + which = 0; + jlist[jj] = -j - 1; + } else + ofind_special(which, special, nspecial, i, tag[j]); + #ifdef _LMP_INTEL_OFFLOAD + if (j >= nlocal) { + if (j == e_nall) + jlist[jj] = nall_offset; + else if (which) + jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); + else jlist[jj]-=ghost_offset; + } else + #endif + if (which) jlist[jj] = j ^ (which << SBBITS); + } + } // for i + } // if molecular + #ifdef _LMP_INTEL_OFFLOAD + else if (separate_buffers) { + for (int i = ifrom; i < ito; ++i) { + int * _noalias jlist = firstneigh + cnumneigh[i]; + const int jnum = numneigh[i]; + int jj = 0; + #pragma vector aligned + #pragma simd + for (jj = 0; jj < jnum; jj++) { + if (jlist[jj] >= nlocal) { + if (jlist[jj] == e_nall) jlist[jj] = nall_offset; + else jlist[jj] -= ghost_offset; + } + } + } + } + #endif + } // end omp + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime() - *timer_compute; + #endif + } // end offload + + #ifdef _LMP_INTEL_OFFLOAD + if (offload) { + _fix->stop_watch(TIME_OFFLOAD_LATENCY); + _fix->start_watch(TIME_HOST_NEIGHBOR); + for (int n = 0; n < aend; n++) { + ilist[n] = n; + numneigh[n] = 0; + } + } else { + for (int i = 0; i < aend; i++) + list->firstneigh[i] = firstneigh + cnumneigh[i]; + if (separate_buffers) { + _fix->start_watch(TIME_PACK); + _fix->set_neighbor_host_sizes(); + buffers->pack_sep_from_single(_fix->host_min_local(), + _fix->host_used_local(), + _fix->host_min_ghost(), + _fix->host_used_ghost()); + _fix->stop_watch(TIME_PACK); + } + } + #else + #pragma vector aligned + #pragma simd + for (int i = 0; i < aend; i++) + list->firstneigh[i] = firstneigh + cnumneigh[i]; + #endif +} diff --git a/src/USER-INTEL/npair_full_bin_ghost_intel.h b/src/USER-INTEL/npair_full_bin_ghost_intel.h new file mode 100644 index 0000000000..4449dfa1e1 --- /dev/null +++ b/src/USER-INTEL/npair_full_bin_ghost_intel.h @@ -0,0 +1,55 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: W. Michael Brown (Intel) +------------------------------------------------------------------------- */ + +#ifdef NPAIR_CLASS + +NPairStyle(full/bin/ghost/intel, + NPairFullBinGhostIntel, + NP_FULL | NP_BIN | NP_GHOST | NP_NEWTON | NP_NEWTOFF | + NP_ORTHO | NP_TRI | NP_INTEL) + +#else + +#ifndef LMP_NPAIR_FULL_BIN_GHOST_INTEL_H +#define LMP_NPAIR_FULL_BIN_GHOST_INTEL_H + +#include "npair_intel.h" + +namespace LAMMPS_NS { + +class NPairFullBinGhostIntel : public NPairIntel { + public: + NPairFullBinGhostIntel(class LAMMPS *); + ~NPairFullBinGhostIntel() {} + void build(class NeighList *); + private: + template + void fbi(NeighList * list, IntelBuffers * buffers); + template + void fbi(const int offload, NeighList * list, + IntelBuffers * buffers, + const int astart, const int aend); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/USER-INTEL/npair_full_bin_intel.cpp b/src/USER-INTEL/npair_full_bin_intel.cpp index 06c10c080f..60b912d796 100644 --- a/src/USER-INTEL/npair_full_bin_intel.cpp +++ b/src/USER-INTEL/npair_full_bin_intel.cpp @@ -20,6 +20,7 @@ #include "neigh_list.h" #include "atom.h" #include "comm.h" +#include "domain.h" #include "group.h" using namespace LAMMPS_NS; diff --git a/src/USER-INTEL/npair_half_bin_newton_intel.cpp b/src/USER-INTEL/npair_half_bin_newton_intel.cpp index c761557097..8c024a4604 100644 --- a/src/USER-INTEL/npair_half_bin_newton_intel.cpp +++ b/src/USER-INTEL/npair_half_bin_newton_intel.cpp @@ -20,6 +20,7 @@ #include "neigh_list.h" #include "atom.h" #include "comm.h" +#include "domain.h" #include "group.h" using namespace LAMMPS_NS; diff --git a/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp b/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp index d70f1ec589..653a951394 100644 --- a/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp +++ b/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp @@ -20,6 +20,7 @@ #include "neigh_list.h" #include "atom.h" #include "comm.h" +#include "domain.h" #include "group.h" using namespace LAMMPS_NS; diff --git a/src/USER-INTEL/npair_intel.cpp b/src/USER-INTEL/npair_intel.cpp index b20b1dcd08..234557c941 100644 --- a/src/USER-INTEL/npair_intel.cpp +++ b/src/USER-INTEL/npair_intel.cpp @@ -15,6 +15,10 @@ Contributing author: W. Michael Brown (Intel) ------------------------------------------------------------------------- */ +#include "comm.h" +#include "domain.h" +#include "timer.h" +#include "modify.h" #include "npair_intel.h" #include "nstencil.h" @@ -143,6 +147,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, flt_t * _noalias const ncachez = buffers->get_ncachez(); int * _noalias const ncachej = buffers->get_ncachej(); int * _noalias const ncachejtype = buffers->get_ncachejtype(); + int * _noalias const ncachetag = buffers->get_ncachetag(); const int ncache_stride = buffers->ncache_stride(); #ifdef _LMP_INTEL_OFFLOAD @@ -165,7 +170,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, in(atombin:length(aend) alloc_if(0) free_if(0)) \ in(stencil:length(nstencil) alloc_if(0) free_if(0)) \ in(ncachex,ncachey,ncachez,ncachej:length(0) alloc_if(0) free_if(0)) \ - in(ncachejtype:length(0) alloc_if(0) free_if(0)) \ + in(ncachejtype,ncachetag:length(0) alloc_if(0) free_if(0)) \ in(ncache_stride,maxnbors,nthreads,maxspecial,nstencil,e_nall,offload) \ in(pad_width,offload_end,separate_buffers,astart,aend,nlocal,molecular) \ in(ntypes,xperiodic,yperiodic,zperiodic,xprd_half,yprd_half,zprd_half) \ @@ -222,7 +227,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, ito += astart; int e_ito = ito; if (THREE && ito == num) { - int imod = ito % pack_width; + int imod = ito & (pack_width - 1); if (imod) e_ito += pack_width - imod; } const int list_size = (e_ito + tid * 2 + 2) * maxnbors; @@ -241,6 +246,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, flt_t * _noalias const tz = ncachez + toffs; int * _noalias const tj = ncachej + toffs; int * _noalias const tjtype = ncachejtype + toffs; + int * _noalias const ttag = ncachetag + toffs; flt_t * _noalias itx; flt_t * _noalias ity; @@ -271,7 +277,6 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, const int bstart = binhead[ibin + binstart[k]]; const int bend = binhead[ibin + binend[k]]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #pragma simd #endif for (int jj = bstart; jj < bend; jj++) @@ -287,13 +292,14 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, ty[u] = x[j].y; tz[u] = x[j].z; tjtype[u] = x[j].w; + if (THREE) ttag[u] = tag[j]; } if (FULL == 0 || TRI == 1) { icount = 0; istart = ncount; const int alignb = INTEL_DATA_ALIGN / sizeof(int); - int nedge = istart % alignb; + int nedge = istart & (alignb - 1); if (nedge) istart + (alignb - nedge); itx = tx + istart; ity = ty + istart; @@ -304,7 +310,6 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, const int bstart = binhead[ibin]; const int bend = binhead[ibin + 1]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #pragma simd #endif for (int jj = bstart; jj < bend; jj++) { @@ -343,7 +348,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, // i bin (half) check and offload ghost check if (j < nlocal) { - const int ijmod = (i + j) % 2; + const int ijmod = (i + j) & 1; if (i > j) { if (ijmod == 0) addme = 0; } else if (i < j) { @@ -424,8 +429,6 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, } #endif - int pj; - if (THREE) pj = j; if (need_ic) { int no_special; ominimum_image_check(no_special, delx, dely, delz); @@ -434,12 +437,12 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, } if (THREE) { - const int jtag = tag[pj]; + const int jtag = ttag[u]; int flist = 0; if (itag > jtag) { - if ((itag+jtag) % 2 == 0) flist = 1; + if (((itag+jtag) & 1) == 0) flist = 1; } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) flist = 1; + if (((itag+jtag) & 1) == 1) flist = 1; } else { if (tz[u] < ztmp) flist = 1; else if (tz[u] == ztmp && ty[u] < ytmp) flist = 1; @@ -512,7 +515,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, cnumneigh[i] += lane; numneigh[i] = ns; } else { - int edge = (n % pad_width); + int edge = n & (pad_width - 1); if (edge) { const int pad_end = n + (pad_width - edge); #if defined(LMP_SIMD_COMPILER) @@ -532,7 +535,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, if (lane == pack_width) { ct += max_chunk * pack_width; const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); - const int edge = (ct % alignb); + const int edge = ct & (alignb - 1); if (edge) ct += alignb - edge; neighptr = firstneigh + ct; max_chunk = 0; @@ -548,7 +551,7 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, } else { ct += n; const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); - const int edge = (ct % alignb); + const int edge = ct & (alignb - 1); if (edge) ct += alignb - edge; neighptr = firstneigh + ct; if (ct + obound > list_size) { diff --git a/src/USER-INTEL/pair_airebo_intel.cpp b/src/USER-INTEL/pair_airebo_intel.cpp new file mode 100644 index 0000000000..54c5055812 --- /dev/null +++ b/src/USER-INTEL/pair_airebo_intel.cpp @@ -0,0 +1,4886 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Markus Hohnerbach (RWTH) +------------------------------------------------------------------------- */ + +#ifdef __INTEL_OFFLOAD +#pragma offload_attribute(push, target(mic)) +#endif +#include +#include +#include +#include +#include +#include +#include +#include "lmptype.h" +#include "intel_preprocess.h" +#include "intel_intrinsics_airebo.h" +#ifdef __INTEL_OFFLOAD +#pragma offload_attribute(pop) +#endif + +#include +#include +#include "pair_airebo_intel.h" +#include "atom.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" +#include "group.h" +#include "kspace.h" +#include "modify.h" +#include "suffix.h" + +using namespace LAMMPS_NS; + +#ifdef __INTEL_OFFLOAD +#pragma offload_attribute(push, target(mic)) +#endif + +template +struct LAMMPS_NS::PairAIREBOIntelParam { + flt_t cutlj, cutljrebosq, cut3rebo; + flt_t sigmin, sigcut; + flt_t cutljsq[2][2]; + flt_t lj1[2][2], lj2[2][2], lj3[2][2], lj4[2][2]; + + flt_t smin, Nmin, Nmax, NCmin, NCmax, thmin, thmax; + flt_t rcmin[2][2], rcmax[2][2], rcmaxsq[2][2], rcmaxp[2][2]; + flt_t Q[2][2], alpha[2][2], A[2][2], rho[2][2], BIJc[2][2][3], + Beta[2][2][3]; + flt_t rcLJmin[2][2], rcLJmax[2][2], rcLJmaxsq[2][2], bLJmin[2][2], + bLJmax[2][2]; + flt_t epsilon[2][2], sigma[2][2], epsilonT[2][2]; + + // spline coefficients + + flt_t gCdom[5], gC1[4][6], gC2[4][6], gHdom[4], gH[3][6]; + flt_t gDom[5+4]; + flt_t gVal[(4+4+3)*6]; + flt_t pCCdom[2][2], pCHdom[2][2], pCC[4][4][16], pCH[4][4][16]; + flt_t piCCdom[3][2], piCHdom[3][2], piHHdom[3][2]; + acc_t piCC[4][4][9][64], piCH[4][4][9][64], piHH[4][4][9][64]; + flt_t Tijdom[3][2]; + acc_t Tijc[4][4][9][64]; + + // spline knot values + + flt_t PCCf[5][5], PCCdfdx[5][5], PCCdfdy[5][5], PCHf[5][5]; + flt_t PCHdfdx[5][5], PCHdfdy[5][5]; + flt_t piCCf[5][5][11], piCCdfdx[5][5][11]; + flt_t piCCdfdy[5][5][11], piCCdfdz[5][5][11]; + flt_t piCHf[5][5][11], piCHdfdx[5][5][11]; + flt_t piCHdfdy[5][5][11], piCHdfdz[5][5][11]; + flt_t piHHf[5][5][11], piHHdfdx[5][5][11]; + flt_t piHHdfdy[5][5][11], piHHdfdz[5][5][11]; + flt_t Tf[5][5][10], Tdfdx[5][5][10], Tdfdy[5][5][10], Tdfdz[5][5][10]; +}; + +namespace { + +struct NeighListAIREBO { + int * num; /* num_all */ + int * num_half; /* num_all */ + int * offset; /* num_all */ + int * entries; /* num_all * num_neighs_per_atom */ +}; + +template +struct AtomAIREBOT { + flt_t x, y, z; + int w; +}; + +template +struct ResultForceT { + acc_t x, y, z, w; +}; + +template +struct KernelArgsAIREBOT { + int num_local; + int num_all; + int num_neighs_per_atom; + int num_types; + int frebo_from_atom, frebo_to_atom; + int neigh_from_atom, neigh_to_atom; + int rebuild_flag; + flt_t skin; + struct NeighListAIREBO neigh_lmp; + struct NeighListAIREBO neigh_rebo; + PairAIREBOIntelParam params; + struct AtomAIREBOT * x; /* num_all */ + tagint * tag; /* num_all */ + flt_t * nC, * nH; /* num_all */ + int * map; /* num_types+1 */ + struct ResultForceT * result_f; /* num_all */ + acc_t result_eng; +}; + +template +void aut_lennard_jones(KernelArgsAIREBOT * ka, int morseflag); +template +void aut_rebo_neigh(KernelArgsAIREBOT * ka); +template +void aut_frebo(KernelArgsAIREBOT * ka, int torsion_flag); + +} + +#ifdef __INTEL_OFFLOAD +#pragma offload_attribute(pop) +#endif + +/* ---------------------------------------------------------------------- */ + +PairAIREBOIntel::PairAIREBOIntel(LAMMPS *lmp) : PairAIREBO(lmp) +{ + suffix_flag |= Suffix::INTEL; + REBO_cnumneigh = NULL; + REBO_num_skin = NULL; + REBO_list_data = NULL; + fix = NULL; +} + +/* ---------------------------------------------------------------------- */ + +PairAIREBOIntel::~PairAIREBOIntel() +{ + memory->destroy(REBO_cnumneigh); + memory->destroy(REBO_num_skin); + memory->destroy(REBO_list_data); +} + +/* ---------------------------------------------------------------------- */ + +void PairAIREBOIntel::init_style() +{ + PairAIREBO::init_style(); + neighbor->requests[neighbor->nrequest-1]->intel = 1; + + int ifix = modify->find_fix("package_intel"); + if (ifix < 0) + error->all(FLERR, + "The 'package intel' command is required for /intel styles"); + fix = static_cast(modify->fix[ifix]); + + fix->pair_init_check(); + #ifdef _LMP_INTEL_OFFLOAD + _cop = fix->coprocessor_number(); + #endif + + if (fix->precision() == FixIntel::PREC_MODE_MIXED) { + pack_force_const(fix->get_mixed_buffers()); + fix->get_mixed_buffers()->need_tag(1); + } else if (fix->precision() == FixIntel::PREC_MODE_DOUBLE) { + pack_force_const(fix->get_double_buffers()); + fix->get_double_buffers()->need_tag(1); + } else { + pack_force_const(fix->get_single_buffers()); + fix->get_single_buffers()->need_tag(1); + } + + #ifdef _LMP_INTEL_OFFLOAD + if (fix->offload_noghost()) + error->all(FLERR,"The 'ghost no' option cannot be used with airebo/intel."); + #endif +} + +/* ---------------------------------------------------------------------- */ + +template +T * calloc_it(size_t size) { + return static_cast(calloc(size, sizeof(T))); +} + +void PairAIREBOIntel::compute(int eflag, int vflag) +{ + if (fix->precision()==FixIntel::PREC_MODE_MIXED) + compute(eflag, vflag, fix->get_mixed_buffers()); + else if (fix->precision()==FixIntel::PREC_MODE_DOUBLE) + compute(eflag, vflag, fix->get_double_buffers()); + else + compute(eflag, vflag, fix->get_single_buffers()); + + fix->balance_stamp(); + vflag_fdotr = 0; +} + +/* ---------------------------------------------------------------------- */ + +template +PairAIREBOIntelParam PairAIREBOIntel::get_param() +{ + PairAIREBOIntelParam fc; + +#define A(a) \ + for (int i = 0; i < sizeof(this->a)/sizeof(double); i++) { \ + reinterpret_cast(&fc.a)[i] = \ + reinterpret_cast(&this->a)[i]; \ + } +#define A0(a) \ + for (int i = 0; i < sizeof(fc.a)/sizeof(flt_t); i++) { \ + reinterpret_cast(&fc.a)[i] = \ + reinterpret_cast(this->a[0])[i]; \ + } +#define B(a) \ + for (int i = 0; i < sizeof(this->a)/sizeof(double); i++) { \ + reinterpret_cast(&fc.a)[i] = \ + reinterpret_cast(&this->a)[i]; \ + } + + A(cutlj) A(cutljrebosq) A(cut3rebo) A(sigmin); + A(sigcut) A0(cutljsq) A0(lj1) A0(lj2) A0(lj3); + A0(lj4) A(smin) A(Nmin) A(Nmax) A(NCmin) A(NCmax) A(thmin) A(thmax); + A(rcmin) A(rcmax) A(rcmaxsq) A(rcmaxp) A(Q) A(alpha) A(A) A(rho) A(BIJc); + A(Beta) A(rcLJmin) A(rcLJmax) A(rcLJmaxsq) A(bLJmin) A(bLJmax) A(epsilon); + A(sigma) A(epsilonT) A(gCdom) A(gC1) A(gC2) A(gHdom) A(gH) A(pCCdom); + A(pCHdom) A(pCC) A(pCH) A(piCCdom) A(piCHdom) A(piHHdom) B(piCC); + B(piCH) B(piHH) A(Tijdom) B(Tijc) A(PCCf) A(PCCdfdx) A(PCCdfdy) A(PCHf); + A(PCHdfdx) A(PCHdfdy) A(piCCf) A(piCCdfdx) A(piCCdfdy) A(piCCdfdz); + A(piCHf) A(piCHdfdx) A(piCHdfdy) A(piCHdfdz) A(piHHf) A(piHHdfdx); + A(piHHdfdy) A(piHHdfdz) A(Tf) A(Tdfdx) A(Tdfdy) A(Tdfdz); + +#undef A +#undef A0 +#undef B + for (int i = 0; i < 5; i++) fc.gDom[i] = fc.gCdom[i]; + for (int i = 0; i < 4; i++) fc.gDom[5+i] = fc.gHdom[i]; + for (int i = 0; i < 4; i++) for (int j = 0; j < 6; j++) + fc.gVal[6*i+j] = fc.gC1[i][j]; + for (int i = 0; i < 4; i++) for (int j = 0; j < 6; j++) + fc.gVal[4*6+6*i+j] = fc.gC2[i][j]; + for (int i = 0; i < 3; i++) for (int j = 0; j < 6; j++) + fc.gVal[8*6+6*i+j] = fc.gH[i][j]; + + return fc; +} + +/* ---------------------------------------------------------------------- */ + +template +void PairAIREBOIntel::compute( + int eflag, int vflag, IntelBuffers * buffers +) { + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = vflag_atom = 0; + pvector[0] = pvector[1] = pvector[2] = 0.0; + + const int inum = list->inum; + const int nthreads = comm->nthreads; + const int host_start = fix->host_start_pair(); + const int offload_end = fix->offload_end_pair(); + const int ago = neighbor->ago; + + if (ago != 0 && fix->separate_buffers() == 0) { + fix->start_watch(TIME_PACK); + int packthreads; + if (nthreads > INTEL_HTHREADS) packthreads = nthreads; + else packthreads = 1; + #if defined(_OPENMP) + #pragma omp parallel if(packthreads > 1) + #endif + { + int ifrom, ito, tid; + IP_PRE_omp_range_id_align(ifrom, ito, tid, atom->nlocal + atom->nghost, + packthreads, sizeof(ATOM_T)); + buffers->thr_pack(ifrom,ito,ago); + } + fix->stop_watch(TIME_PACK); + } + + if (atom->nmax > maxlocal) { + #ifdef LMP_INTEL_OFFLOAD + if (maxlocal > 0 && _cop >= 0) { + int * const REBO_numneigh = this->REBO_numneigh; + int * const REBO_num_skin = this->REBO_num_skin; + int * const REBO_cnumneigh = this->REBO_cnumneigh; + int * const REBO_list_data = this->REBO_list_data; + double * const nC = this->nC; + double * const nH = this->nH; + #pragma offload_transfer target(mic:_cop) \ + nocopy(REBO_numneigh: alloc_if(0) free_if(1)) \ + nocopy(REBO_cnumneigh: alloc_if(0) free_if(1)) \ + nocopy(REBO_num_skin: alloc_if(0) free_if(1)) \ + nocopy(REBO_list_data: alloc_if(0) free_if(1)) \ + nocopy(nH: alloc_if(0) free_if(1)) \ + nocopy(nC: alloc_if(0) free_if(1)) + } + #endif + maxlocal = atom->nmax; + memory->destroy(REBO_numneigh); + memory->destroy(REBO_cnumneigh); + memory->destroy(REBO_list_data); + memory->sfree(REBO_firstneigh); + memory->destroy(nC); + memory->destroy(nH); + memory->create(REBO_numneigh,maxlocal,"AIREBO:numneigh"); + memory->create(REBO_cnumneigh,maxlocal,"AIREBO:cnumneigh"); + memory->create(REBO_num_skin,maxlocal,"AIREBO:cnumneigh"); + int max_nbors = buffers->get_max_nbors(); + memory->create(REBO_list_data,maxlocal * max_nbors,"AIREBO:list_data"); + REBO_firstneigh = (int **) memory->smalloc(maxlocal*sizeof(int *), + "AIREBO:firstneigh"); + memory->create(nC,maxlocal,"AIREBO:nC"); + memory->create(nH,maxlocal,"AIREBO:nH"); + #ifdef _LMP_INTEL_OFFLOAD + if (_cop >= 0) { + int * const REBO_numneigh = this->REBO_numneigh; + int * const REBO_num_skin = this->REBO_num_skin; + int * const REBO_cnumneigh = this->REBO_cnumneigh; + int * const REBO_list_data = this->REBO_list_data; + double * const nC = this->nC; + double * const nH = this->nH; + const int mnml = max_nbors * maxlocal; + #pragma offload_transfer target(mic:_cop) \ + nocopy(REBO_numneigh: length(maxlocal) alloc_if(1) free_if(0)) \ + nocopy(REBO_cnumneigh:length(maxlocal) alloc_if(1) free_if(0)) \ + nocopy(REBO_num_skin: length(maxlocal) alloc_if(1) free_if(0)) \ + nocopy(REBO_list_data:length(mnml) alloc_if(1) free_if(0)) \ + nocopy(nH: length(maxlocal) alloc_if(1) free_if(0)) \ + nocopy(nC: length(maxlocal) alloc_if(1) free_if(0)) + } + #endif + } + + if (evflag || vflag_fdotr) { + int ovflag = 0; + if (vflag_fdotr) ovflag = 2; + else if (vflag) ovflag = 1; + if (eflag) { + eval<1,1>(1, ovflag, buffers, 0, offload_end); + eval<1,1>(0, ovflag, buffers, host_start, inum); + } else { + eval<1,0>(1, ovflag, buffers, 0, offload_end); + eval<1,0>(0, ovflag, buffers, host_start, inum); + } + } else { + eval<0,0>(1, 0, buffers, 0, offload_end); + eval<0,0>(0, 0, buffers, host_start, inum); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairAIREBOIntel::eval( + const int offload, const int vflag, + IntelBuffers * buffers, + const int astart, const int aend +) { + const int inum = aend - astart; + if (inum == 0) { + return; + } + int nlocal, nall, minlocal; + fix->get_buffern(offload, nlocal, nall, minlocal); + + const int ago = neighbor->ago; + IP_PRE_pack_separate_buffers(fix, buffers, ago, offload, nlocal, nall); + + ATOM_T * _noalias const x = buffers->get_x(offload); + const int * _noalias const numneighhalf = buffers->get_atombin(); + const int * _noalias const numneigh = list->numneigh; + const int * _noalias const cnumneigh = buffers->cnumneigh(list); + const int * _noalias const firstneigh = buffers->firstneigh(list); + tagint * const tag = atom->tag; + + const int ntypes = atom->ntypes + 1; + const int eatom = this->eflag_atom; + + int x_size, q_size, f_stride, ev_size, separate_flag; + IP_PRE_get_transfern(ago, 1 /*NEWTON_PAIR*/, EFLAG, vflag, + buffers, offload, fix, separate_flag, + x_size, q_size, ev_size, f_stride); + + int tc; + FORCE_T * _noalias f_start; + acc_t * _noalias ev_global; + IP_PRE_get_buffers(offload, buffers, fix, tc, f_start, ev_global); + + const int nthreads = tc; + const double skin = neighbor->skin; + const int max_nbor = buffers->get_max_nbors(); + const PairAIREBOIntelParam param = get_param(); + + // offload here + #ifdef _LMP_INTEL_OFFLOAD + int *overflow = fix->get_off_overflow_flag(); + double *timer_compute = fix->off_watch_pair(); + + int * const REBO_numneigh = this->REBO_numneigh; + int * const REBO_num_skin = this->REBO_num_skin; + int * const REBO_cnumneigh = this->REBO_cnumneigh; + int * const REBO_list_data = this->REBO_list_data; + double * const nC = this->nC; + double * const nH = this->nH; + const int torflag = this->torflag; + const int ljflag = this->ljflag; + const int morseflag = this->morseflag; + int * const map = this->map; + + if (offload) fix->start_watch(TIME_OFFLOAD_LATENCY); + + #pragma offload target(mic:_cop) if(offload) \ + in(firstneigh:length(0) alloc_if(0) free_if(0)) \ + in(cnumneigh:length(0) alloc_if(0) free_if(0)) \ + in(numneigh:length(0) alloc_if(0) free_if(0)) \ + in(numneighhalf:length(0) alloc_if(0) free_if(0)) \ + in(x:length(x_size) alloc_if(0) free_if(0)) \ + in(overflow:length(0) alloc_if(0) free_if(0)) \ + in(astart,nthreads,inum,nall,ntypes,vflag,eatom) \ + in(f_stride,nlocal,minlocal,separate_flag,offload) \ + out(f_start:length(f_stride) alloc_if(0) free_if(0)) \ + out(ev_global:length(ev_size) alloc_if(0) free_if(0)) \ + out(timer_compute:length(1) alloc_if(0) free_if(0)) \ + in(param,skin,max_nbor) \ + in(tag: length(0) alloc_if(0) free_if(0)) \ + in(torflag, ljflag, morseflag, ago) \ + in(nC: length(0) alloc_if(0) free_if(0)) \ + in(nH: length(0) alloc_if(0) free_if(0)) \ + in(REBO_numneigh: length(0) alloc_if(0) free_if(0)) \ + in(REBO_cnumneigh: length(0) alloc_if(0) free_if(0)) \ + in(REBO_num_skin: length(0) alloc_if(0) free_if(0)) \ + in(REBO_list_data: length(0) alloc_if(0) free_if(0)) \ + in(map: length(0) alloc_if(0) free_if(0)) \ + signal(f_start) + #endif + { + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime(); + #endif + + IP_PRE_repack_for_offload(1 /*NEWTON_PAIR*/, separate_flag, nlocal, nall, + f_stride, x, 0/*q*/); + + acc_t oevdwl, oecoul, ov0, ov1, ov2, ov3, ov4, ov5; + if (EVFLAG) { + oevdwl = oecoul = (acc_t)0; + if (vflag) ov0 = ov1 = ov2 = ov3 = ov4 = ov5 = (acc_t)0; + } + + // loop over neighbors of my atoms + #if defined(_OPENMP) + #pragma omp parallel \ + shared(f_start,f_stride,nlocal,nall,minlocal) \ + reduction(+:oevdwl,oecoul,ov0,ov1,ov2,ov3,ov4,ov5) + #endif + { + int iifrom, iito, tid; + IP_PRE_omp_range_id(iifrom, iito, tid, inum, nthreads); + iifrom += astart; + iito += astart; + + int neigh_iifrom, neigh_iito; + IP_PRE_omp_range(neigh_iifrom, neigh_iito, tid, nall, nthreads); + + FORCE_T * _noalias const f = f_start - minlocal + (tid * f_stride); + memset(f + minlocal, 0, f_stride * sizeof(FORCE_T)); + + KernelArgsAIREBOT args; + args.num_local = nlocal; + args.num_all = nall; + args.num_neighs_per_atom = max_nbor; + args.num_types = ntypes; + args.frebo_from_atom = 0; + args.frebo_to_atom = args.num_local; + args.neigh_from_atom = 0; + args.neigh_to_atom = args.num_all; + args.rebuild_flag = ago == 0; + args.skin = skin; + args.neigh_lmp.num = const_cast(numneigh); + args.neigh_lmp.num_half = const_cast(numneighhalf); + args.neigh_lmp.offset = const_cast(cnumneigh); + args.neigh_lmp.entries = const_cast(firstneigh); + args.neigh_rebo.num = REBO_numneigh; + args.neigh_rebo.num_half = REBO_num_skin; + args.neigh_rebo.offset = REBO_cnumneigh; + args.neigh_rebo.entries = REBO_list_data; + args.params = param; + args.tag = tag; + args.nC = reinterpret_cast(nC); + args.nH = reinterpret_cast(nH); + args.map = map; + args.result_eng = 0; + args.x = (AtomAIREBOT*) x; + + args.result_f = (ResultForceT *) f; + args.neigh_from_atom = neigh_iifrom; + args.neigh_to_atom = neigh_iito; + args.frebo_from_atom = iifrom; + args.frebo_to_atom = iito; + + aut_rebo_neigh(&args); + #if defined(_OPENMP) + #pragma omp barrier + #endif + aut_frebo(&args, torflag); + if (ljflag) aut_lennard_jones(&args, morseflag); + + oevdwl += args.result_eng; + + IP_PRE_fdotr_reduce_omp(1, nall, minlocal, nthreads, f_start, f_stride, x, + offload, vflag, ov0, ov1, ov2, ov3, ov4, ov5); + } // end of omp parallel region + IP_PRE_fdotr_reduce(1, nall, nthreads, f_stride, vflag, + ov0, ov1, ov2, ov3, ov4, ov5); + if (EVFLAG) { + if (EFLAG) { + ev_global[0] = oevdwl; + ev_global[1] = oecoul; + } + if (vflag) { + ev_global[2] = ov0; + ev_global[3] = ov1; + ev_global[4] = ov2; + ev_global[5] = ov3; + ev_global[6] = ov4; + ev_global[7] = ov5; + } + } + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime() - *timer_compute; + #endif + } // end of offload region + + if (offload) + fix->stop_watch(TIME_OFFLOAD_LATENCY); + else + fix->stop_watch(TIME_HOST_PAIR); + + if (EVFLAG) + fix->add_result_array(f_start, ev_global, offload, eatom, 0, vflag); + else + fix->add_result_array(f_start, 0, offload); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairAIREBOIntel::pack_force_const(IntelBuffers * buffers) { + int tp1 = atom->ntypes + 1; + + buffers->set_ntypes(tp1,1); + flt_t **cutneighsq = buffers->get_cutneighsq(); + flt_t **cutneighghostsq = buffers->get_cutneighghostsq(); + + // Repeat cutsq calculation because done after call to init_style + double cut, cutneigh; + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { + if (setflag[i][j] != 0 || (setflag[i][i] != 0 && setflag[j][j] != 0)) { + cut = init_one(i, j); + cutneigh = cut + neighbor->skin; + cutsq[i][j] = cutsq[j][i] = cut*cut; + cutneighsq[i][j] = cutneighsq[j][i] = cutneigh * cutneigh; + cut = cutghost[i][j] + neighbor->skin; + cutneighghostsq[i][j] = cutneighghostsq[j][i] = cut*cut; + } + } + } + + #ifdef _LMP_INTEL_OFFLOAD + if (_cop < 0) return; + flt_t * ocutneighsq = cutneighsq[0]; + size_t VL = 512 / 8 / sizeof(flt_t); + int ntypes = tp1; + int tp1sq = tp1 * tp1; + // TODO the lifecycle of "map" is currently not 100% correct + // it might not be freed if this method is called more than once + int * map = this->map; + #pragma offload_transfer target(mic:_cop) \ + in(ocutneighsq: length(tp1sq) alloc_if(0) free_if(0)) \ + in(map: length(tp1) alloc_if(1) free_if(0)) + #endif + +} + +/* ---------------------------------------------------------------------- + Implementation + ---------------------------------------------------------------------- */ + +namespace { + +#ifdef __INTEL_OFFLOAD +#pragma offload_attribute(push, target(mic)) +#endif + +namespace overloaded { + double sqrt(double a) { return ::sqrt(a); } + float sqrt(float a) { return ::sqrtf(a); } + double sin(double a) { return ::sin(a); } + float sin(float a) { return ::sinf(a); } + double cos(double a) { return ::cos(a); } + float cos(float a) { return ::cosf(a); } + double exp(double a) { return ::exp(a); } + float exp(float a) { return ::expf(a); } + double pow(double a, double b) { return ::pow(a, b); } + float pow(float a, float b) { return ::powf(a, b); } +} + +/* ---------------------------------------------------------------------- + Scalar AIREBO implementation, standalone, with massive code reuse + compared to original code. + ---------------------------------------------------------------------- */ + +#define M_PI 3.14159265358979323846 /* pi */ + +#define CARBON 0 +#define HYDROGEN 1 +#define TOL 1.0e-9 + +template +inline T fmin_nonan(T a, T b) { + return a < b ? a : b; +} +template +inline T fmax_nonan(T a, T b) { + return a > b ? a : b; +} + +template +inline flt_t Sp(flt_t r, flt_t lo, flt_t hi, flt_t * del) { + flt_t t = (r - lo) / (hi - lo); + if (t <= 0) { + if (del) *del = 0; + return 1; + } else if (t >= 1) { + if (del) *del = 0; + return 0; + } else { + t *= static_cast(M_PI); + if (del) *del = static_cast(-0.5 * M_PI) + * overloaded::sin(t) / (hi - lo); + return static_cast(0.5) * (1 + overloaded::cos(t)); + } +} + +template +inline flt_t Sp2(flt_t r, flt_t lo, flt_t hi, flt_t * del) { + flt_t t = (r - lo) / (hi - lo); + if (t <= 0) { + if (del) *del = 0; + return 1; + } else if (t >= 1) { + if (del) *del = 0; + return 0; + } else { + if (del) *del = 6 * (t * t - t) / (hi - lo); + return 1 - t * t * (3 - 2 * t); + } +} + +template +inline flt_t eval_poly_lin(int n, flt_t * coeffs, flt_t x, flt_t * deriv) { + flt_t result = coeffs[n - 1]; + *deriv = coeffs[n - 1] * (n - 1); + for (int i = n - 2; i > 0; i--) { + result = coeffs[i] + x * result; + *deriv = coeffs[i] * i + x * (*deriv); + } + result = coeffs[0] + x * result; + return result; +} + +template +inline flt_t gSpline(KernelArgsAIREBOT * ka, int itype, flt_t cos, flt_t N, flt_t * dgdc, flt_t * dgdN) { + flt_t NCmin = ka->params.NCmin; + flt_t NCmax = ka->params.NCmax; + int index = 0; + flt_t * gDom = NULL; + int nDom = 0; + int offs = 0; + if (itype == 0) { + nDom = 4; + gDom = &ka->params.gCdom[0]; + if (N > NCmin) offs = 4 * 6; + } else { + nDom = 3; + gDom = &ka->params.gHdom[0]; + offs = 8 * 6; + } + cos = fmax_nonan(gDom[0], fmin_nonan(gDom[nDom], cos)); + int i; + for (i = 0; i < nDom; i++) { + if (cos >= gDom[i] && cos <= gDom[i + 1]) { + index = i; + } + } + flt_t g = eval_poly_lin(6, &ka->params.gVal[offs+index*6], cos, dgdc); + *dgdN = 0; + if (itype == 0 && N > NCmin && N < NCmax) { + flt_t dg1; + flt_t g1 = eval_poly_lin(6, &ka->params.gVal[index*6], cos, &dg1); + flt_t dS; + flt_t cut = Sp(N, NCmin, NCmax, &dS); + *dgdN = dS * (g1 - g); + g = g + cut * (g1 - g); + *dgdc = *dgdc + cut * (dg1 - *dgdc); + } + return g; +} + +template +inline flt_t eval_poly_bi(int n, flt_t * coeffs, flt_t x, flt_t y, + flt_t * deriv) { + flt_t dy; + flt_t vy = eval_poly_lin(n, &coeffs[n * (n - 1)], y, &dy); + flt_t result = vy; + deriv[0] = vy * (n - 1); + deriv[1] = dy; + for (int i = n - 2; i > 0; i--) { + vy = eval_poly_lin(n, &coeffs[n * i], y, &dy); + result = vy + x * result; + deriv[0] = vy * i + x * deriv[0]; + deriv[1] = dy + x * deriv[1]; + } + result = eval_poly_lin(n, &coeffs[0], y, &dy) + x * result; + deriv[1] = dy + x * deriv[1]; + return result; +} + +template +inline flt_t eval_poly_tri(int n, flt_t * coeffs, flt_t x, flt_t y, flt_t z, + flt_t * deriv) { + flt_t dyz[2]; + flt_t vyz = eval_poly_bi(n, &coeffs[n * n * (n - 1)], y, z, &dyz[0]); + flt_t result = vyz; + deriv[0] = vyz * (n - 1); + deriv[1] = dyz[0]; + deriv[2] = dyz[1]; + for (int i = n - 2; i > 0; i--) { + vyz = eval_poly_bi(n, &coeffs[n * n * i], y, z, &dyz[0]); + result = vyz + x * result; + deriv[0] = vyz * i + x * deriv[0]; + deriv[1] = dyz[0] + x * deriv[1]; + deriv[2] = dyz[1] + x * deriv[2]; + } + result = eval_poly_bi(n, &coeffs[0], y, z, &dyz[0]) + x * result; + deriv[1] = dyz[0] + x * deriv[1]; + deriv[2] = dyz[1] + x * deriv[2]; + return result; +} + +template +inline flt_t PijSpline(KernelArgsAIREBOT * ka, int itype, + int jtype, flt_t NC, flt_t NH, flt_t * dN) { + dN[0] = 0.0; + dN[1] = 0.0; + if (itype == HYDROGEN) return 0; + flt_t *pCJdom = jtype == CARBON ? &ka->params.pCCdom[0][0] : + &ka->params.pCHdom[0][0]; + NC = fmax_nonan(pCJdom[0], fmin_nonan(pCJdom[1], NC)); + NH = fmax_nonan(pCJdom[2], fmin_nonan(pCJdom[3], NH)); + int nC = floor(NC); + int nH = floor(NH); + #define PijSelect(a, b) (jtype == CARBON ? ka->params.a : ka->params.b) + if (fabs(NC - nC) < TOL && fabs(NH - nH) < TOL) { + dN[0] = PijSelect(PCCdfdx, PCHdfdx)[nC][nH]; + dN[1] = PijSelect(PCCdfdy, PCHdfdy)[nC][nH]; + return PijSelect(PCCf, PCHf)[nC][nH]; + } + if (NC == pCJdom[1]) nC -= 1; + if (NH == pCJdom[3]) nH -= 1; + return eval_poly_bi(4, &PijSelect(pCC, pCH)[nC][nH][0], NC, NH, dN); + #undef PijSelect +} + +template +inline flt_t TijSpline(KernelArgsAIREBOT * ka, flt_t Nij, + flt_t Nji, flt_t Nijconj, acc_t * dN3) { + flt_t * Tijdom = &ka->params.Tijdom[0][0]; + Nij = fmax_nonan(Tijdom[0], fmin_nonan(Tijdom[1], Nij)); + Nji = fmax_nonan(Tijdom[2], fmin_nonan(Tijdom[3], Nji)); + Nijconj = fmax_nonan(Tijdom[4], fmin_nonan(Tijdom[5], Nijconj)); + int nij = floor(Nij); + int nji = floor(Nji); + int nijconj = floor(Nijconj); + if (fabs(Nij - nij) < TOL && fabs(Nji - nji) < + TOL && fabs(Nijconj - nijconj) < TOL) { + dN3[0] = ka->params.Tdfdx[nij][nji][nijconj]; + dN3[1] = ka->params.Tdfdy[nij][nji][nijconj]; + dN3[2] = ka->params.Tdfdz[nij][nji][nijconj]; + return ka->params.Tf[nij][nji][nijconj]; + } + if (Nij == Tijdom[1]) nij -= 1; + if (Nji == Tijdom[3]) nji -= 1; + if (Nijconj == Tijdom[5]) nijconj -= 1; + return eval_poly_tri(4, &ka->params.Tijc[nij][nji][nijconj][0], Nij, + Nji, Nijconj, dN3); +} + +template +inline flt_t piRCSpline(KernelArgsAIREBOT * ka, int itype, + int jtype, flt_t Nij, flt_t Nji, flt_t Nijconj, acc_t * dN3) { + const int HH = 2; + const int CH = 1; + /* const int CC = 0; */ + int select = itype + jtype; + #define piRCSelect(a, b, c) (select == HH ? ka->params.a : select == CH ? \ + ka->params.b : ka->params.c) + flt_t * piIJdom = &piRCSelect(piHHdom, piCHdom, piCCdom)[0][0]; + if (select == HH) { + if (Nij < piIJdom[0] || Nij > piIJdom[1] || Nji < piIJdom[2] || + Nji > piIJdom[3] || Nijconj < piIJdom[4] || Nijconj > piIJdom[5]) { + Nij = 0; + Nji = 0; + Nijconj = 0; + } + } + Nij = fmax_nonan(piIJdom[0], fmin_nonan(piIJdom[1], Nij)); + Nji = fmax_nonan(piIJdom[2], fmin_nonan(piIJdom[3], Nji)); + Nijconj = fmax_nonan(piIJdom[4], fmin_nonan(piIJdom[5], Nijconj)); + int nij = floor(Nij); + int nji = floor(Nji); + int nijconj = floor(Nijconj); + if (fabs(Nij - nij) < TOL && fabs(Nji - nji) < + TOL && fabs(Nijconj - nijconj) < TOL) { + dN3[0] = piRCSelect(piHHdfdx, piCHdfdx, piCCdfdx)[nij][nji][nijconj]; + dN3[1] = piRCSelect(piHHdfdy, piCHdfdy, piCCdfdy)[nij][nji][nijconj]; + dN3[2] = piRCSelect(piHHdfdz, piCHdfdz, piCCdfdz)[nij][nji][nijconj]; + return piRCSelect(piHHf, piCHf, piCCf)[nij][nji][nijconj]; + } + if (Nij == piIJdom[1]) nij -= 1; + if (Nji == piIJdom[3]) nji -= 1; + if (Nijconj == piIJdom[5]) nijconj -= 1; + return eval_poly_tri(4, + &piRCSelect(piHH, piCH, piCC)[nij][nji][nijconj][0], Nij, Nji, Nijconj, + dN3); + #undef piRCSelect +} + +/* + * Implements the p_ij term in airebo, which occurs on 4 different occasions + * in the original lammps code. + */ +template +inline flt_t frebo_pij(KernelArgsAIREBOT * ka, int i, int j, + flt_t rijx, flt_t rijy, flt_t rijz, flt_t rijmag, flt_t wij, flt_t VA, + flt_t * sum_N, acc_t fij[3]) { + ResultForceT * result_f = ka->result_f; + AtomAIREBOT * x = ka->x; + int * map = ka->map; + flt_t * nC = ka->nC; + flt_t * nH = ka->nH; + flt_t x_i = x[i].x; + flt_t y_i = x[i].y; + flt_t z_i = x[i].z; + int itype = map[x[i].w]; + int jtype = map[x[j].w]; + flt_t invrijm = 1 / rijmag; + flt_t invrijm2 = invrijm * invrijm; + flt_t rcminij = ka->params.rcmin[itype][jtype]; + flt_t rcmaxij = ka->params.rcmax[itype][jtype]; + flt_t Nmin = ka->params.Nmin; + flt_t Nmax = ka->params.Nmax; + flt_t Nij = nC[i] + nH[i] - wij; + flt_t NijC = nC[i] - wij * (1 - jtype); + flt_t NijH = nH[i] - wij * jtype; + flt_t sum_pij = 0; + flt_t sum_dpij_dN = 0; + flt_t dN2[2] = {0}; + flt_t pij = 0; + *sum_N = 0; + int * neighs = ka->neigh_rebo.entries + ka->neigh_rebo.offset[i]; + int pass; + for (pass = 0; pass < 2; pass++) { + int kk; + int knum = ka->neigh_rebo.num[i]; + for (kk = 0; kk < knum; kk++) { + int k = neighs[kk]; + if (k == j) continue; + flt_t rikx = x_i - x[k].x; + flt_t riky = y_i - x[k].y; + flt_t rikz = z_i - x[k].z; + int ktype = map[x[k].w]; + flt_t rikmag = overloaded::sqrt(rikx * rikx + riky * riky + rikz * rikz); + flt_t rho_k = ka->params.rho[ktype][1]; + flt_t rho_j = ka->params.rho[jtype][1]; + flt_t lamdajik = 4 * itype * ((rho_k - rikmag) - (rho_j - rijmag)); + flt_t ex_lam = exp(lamdajik); + flt_t rcminik = ka->params.rcmin[itype][ktype]; + flt_t rcmaxik = ka->params.rcmax[itype][ktype]; + flt_t dwik; + flt_t wik = Sp(rikmag, rcminik, rcmaxik, &dwik); + flt_t Nki = nC[k] + nH[k] - wik; + flt_t cosjik = (rijx * rikx + rijy * riky + rijz * rikz) / + (rijmag * rikmag); + cosjik = fmin_nonan(1, fmax_nonan(-1, cosjik)); + flt_t dgdc, dgdN; + flt_t g = gSpline(ka, itype, cosjik, Nij, &dgdc, &dgdN); + if (pass == 0) { + sum_pij += wik * g * ex_lam; + sum_dpij_dN += wik * dgdN * ex_lam; + flt_t cutN = Sp(Nki, Nmin, Nmax, NULL); + *sum_N += (1 - ktype) * wik * cutN; + } else { + flt_t tmp = -0.5 * pij * pij * pij; + flt_t invrikm = 1 / rikmag; + flt_t rjkx = rikx - rijx; + flt_t rjky = riky - rijy; + flt_t rjkz = rikz - rijz; + flt_t rjkmag = sqrt(rjkx * rjkx + rjky * rjky + rjkz * rjkz); + flt_t rijrik = 2 * rijmag * rikmag; + flt_t rr = rijmag * rijmag - rikmag * rikmag; + flt_t dctdjk = -2 / rijrik; + flt_t dctdik = (-rr + rjkmag * rjkmag) / (rijrik * rikmag * rikmag); + flt_t dctdij = (rr + rjkmag * rjkmag) / (rijrik * rijmag * rijmag); + + acc_t fi[3], fj[3], fk[3]; + flt_t pref = 0.5 * VA * tmp; + flt_t tmp20 = pref * wik * dgdc * ex_lam; + fj[0] = fj[1] = fj[2] = 0; + fi[0] = -tmp20 * dctdik * rikx; + fi[1] = -tmp20 * dctdik * riky; + fi[2] = -tmp20 * dctdik * rikz; + fk[0] = tmp20 * dctdik * rikx; + fk[1] = tmp20 * dctdik * riky; + fk[2] = tmp20 * dctdik * rikz; + + fij[0] += -tmp20 * dctdij * rijx; + fij[1] += -tmp20 * dctdij * rijy; + fij[2] += -tmp20 * dctdij * rijz; + + fi[0] += -tmp20 * dctdjk * rjkx; + fi[1] += -tmp20 * dctdjk * rjky; + fi[2] += -tmp20 * dctdjk * rjkz; + fk[0] += tmp20 * dctdjk * rjkx; + fk[1] += tmp20 * dctdjk * rjky; + fk[2] += tmp20 * dctdjk * rjkz; + fij[0] -= -tmp20 * dctdjk * rjkx; + fij[1] -= -tmp20 * dctdjk * rjky; + fij[2] -= -tmp20 * dctdjk * rjkz; + + flt_t tmp21 = pref * (wik * g * ex_lam * 4 * itype); + fij[0] -= 1 * tmp21 * rijx * invrijm; + fij[1] -= 1 * tmp21 * rijy * invrijm; + fij[2] -= 1 * tmp21 * rijz * invrijm; + fi[0] -= tmp21 * (-rikx * invrikm); + fi[1] -= tmp21 * (-riky * invrikm); + fi[2] -= tmp21 * (-rikz * invrikm); + fk[0] -= tmp21 * (rikx * invrikm); + fk[1] -= tmp21 * (riky * invrikm); + fk[2] -= tmp21 * (rikz * invrikm); + + // coordination forces + + // dwik forces + flt_t tmp22 = pref * dwik * g * ex_lam * invrikm; + fi[0] -= tmp22 * rikx; + fi[1] -= tmp22 * riky; + fi[2] -= tmp22 * rikz; + fk[0] += tmp22 * rikx; + fk[1] += tmp22 * riky; + fk[2] += tmp22 * rikz; + + // PIJ forces + flt_t tmp23 = pref * dN2[ktype] * dwik * invrikm; + fi[0] -= tmp23 * rikx; + fi[1] -= tmp23 * riky; + fi[2] -= tmp23 * rikz; + fk[0] += tmp23 * rikx; + fk[1] += tmp23 * riky; + fk[2] += tmp23 * rikz; + + // dgdN forces + flt_t tmp24 = pref * sum_dpij_dN * dwik * invrikm; + fi[0] -= tmp24 * rikx; + fi[1] -= tmp24 * riky; + fi[2] -= tmp24 * rikz; + fk[0] += tmp24 * rikx; + fk[1] += tmp24 * riky; + fk[2] += tmp24 * rikz; + + result_f[i].x += fi[0]; + result_f[i].y += fi[1]; + result_f[i].z += fi[2]; + result_f[j].x += fj[0]; + result_f[j].y += fj[1]; + result_f[j].z += fj[2]; + result_f[k].x += fk[0]; + result_f[k].y += fk[1]; + result_f[k].z += fk[2]; + } + } + if (pass == 0) { + flt_t PijS = PijSpline(ka, itype, jtype, NijC, NijH, dN2); + pij = 1 / overloaded::sqrt(1 + sum_pij + PijS); + } + } + return pij; +} + +template +inline flt_t frebo_pi_rc(KernelArgsAIREBOT * ka, int itype, + int jtype, flt_t Nij, flt_t Nji, flt_t Nijconj, flt_t * dN3) { + acc_t dN3tmp[3] = {0}; + flt_t ret = piRCSpline(ka, itype, jtype, Nij, Nji, Nijconj, dN3tmp); + dN3[0] = dN3tmp[0]; + dN3[1] = dN3tmp[1]; + dN3[2] = dN3tmp[2]; + return ret; +} + +template +inline flt_t frebo_Tij(KernelArgsAIREBOT * ka, int itype, + int jtype, flt_t Nij, flt_t Nji, flt_t Nijconj, flt_t * dN3) { + dN3[0] = 0; + dN3[1] = 0; + dN3[2] = 0; + if (itype == HYDROGEN || jtype == HYDROGEN) return 0; + acc_t dN3tmp[3] = {0}; + flt_t ret = TijSpline(ka, Nij, Nji, Nijconj, dN3tmp); + dN3[0] = dN3tmp[0]; + dN3[1] = dN3tmp[1]; + dN3[2] = dN3tmp[2]; + return ret; +} + +/* + * Implements a scalar version of the sum cos^1(omega) term used in pi^dh_ij. + * Occurs in both bondorder and bondorderLJ. + */ +template +inline flt_t frebo_sum_omega(KernelArgsAIREBOT * ka, int i, int j, + flt_t r23x, flt_t r23y, flt_t r23z, flt_t r23mag, flt_t VA, acc_t fij[3]) { + ResultForceT * result_f = ka->result_f; + acc_t sum_omega = 0; + int a2 = i; + int a3 = j; + flt_t r32x = - r23x; + flt_t r32y = - r23y; + flt_t r32z = - r23z; + int * map = ka->map; + AtomAIREBOT * x = ka->x; + flt_t thmin = ka->params.thmin; + flt_t thmax = ka->params.thmax; + int itype = map[x[i].w]; + int jtype = map[x[j].w]; + int * neighs_i = ka->neigh_rebo.entries + ka->neigh_rebo.offset[i]; + int * neighs_j = ka->neigh_rebo.entries + ka->neigh_rebo.offset[j]; + int num_i = ka->neigh_rebo.num[i]; + int num_j = ka->neigh_rebo.num[j]; + int kk; + for (kk = 0; kk < num_i; kk++) { + int k = neighs_i[kk]; + if (k == j) continue; + int a1 = k; + int ktype = map[x[k].w]; + flt_t r21x = x[a2].x - x[a1].x; + flt_t r21y = x[a2].y - x[a1].y; + flt_t r21z = x[a2].z - x[a1].z; + flt_t r21mag = overloaded::sqrt(r21x * r21x + r21y * r21y + r21z * r21z); + flt_t cos321 = (r23x * r21x + r23y * r21y + r23z * r21z) / + (r23mag * r21mag); + cos321 = fmin_nonan(1, fmax_nonan(-1, cos321)); + flt_t sin321 = overloaded::sqrt(1 - cos321 * cos321); + if (sin321 == 0) continue; + flt_t sink2i = 1 / (sin321 * sin321); + flt_t rik2i = 1 / (r21mag * r21mag); + flt_t rr = r23mag * r23mag - r21mag * r21mag; + flt_t r31x = r21x - r23x; + flt_t r31y = r21y - r23y; + flt_t r31z = r21z - r23z; + flt_t r31mag2 = r31x * r31x + r31y * r31y + r31z * r31z; + flt_t rijrik = 2 * r23mag * r21mag; + flt_t r21mag2 = r21mag * r21mag; + flt_t dctik = (-rr + r31mag2) / (rijrik * r21mag2); + flt_t dctij = (rr + r31mag2) / (rijrik * r23mag * r23mag); + flt_t dctjk = -2 / rijrik; + flt_t rcmin21 = ka->params.rcmin [itype][ktype]; + flt_t rcmaxp21 = ka->params.rcmaxp[itype][ktype]; + flt_t dw21; + flt_t w21 = Sp(r21mag, rcmin21, rcmaxp21, &dw21); + // why does this additional cutoff in the cosine exist? + // the original code by stuart answers this: + // it avoid issues when bonds in the dihedral are linear + // by switching the dihedral off beforehand. + // This is the reason for both the sin == 0 checks and the + // tspjik = Sp2(..) calls. + // Unfortunately, this is not exactly stated in the original paper. + // It might be similar in purpose to the H(sin - s^min) term that + // appears in that paper, but can not be found in original REBO papers. + flt_t dtsjik; + flt_t tspjik = Sp2(cos321, thmin, thmax, &dtsjik); + dtsjik = - dtsjik; + int ll; + for (ll = 0; ll < num_j; ll++) { + int l = neighs_j[ll]; + if (l == i || l == k) continue; + int ltype = map[x[l].w]; + int a4 = l; + flt_t r34x = x[a3].x - x[a4].x; + flt_t r34y = x[a3].y - x[a4].y; + flt_t r34z = x[a3].z - x[a4].z; + flt_t r34mag = overloaded::sqrt(r34x * r34x + r34y * r34y + r34z * r34z); + flt_t cos234 = (r32x * r34x + r32y * r34y + r32z * r34z) / + (r23mag * r34mag); + cos234 = fmin_nonan(1, fmax_nonan(-1, cos234)); + flt_t sin234 = overloaded::sqrt(1 - cos234 * cos234); + if (sin234 == 0) continue; + flt_t sinl2i = 1 / (sin234 * sin234); + flt_t rjl2i = 1 / (r34mag * r34mag); + + flt_t rcminjl = ka->params.rcmin[jtype][ltype]; + flt_t rcmaxpjl = ka->params.rcmaxp[jtype][ltype]; + flt_t dw34; + flt_t w34 = Sp(r34mag, rcminjl, rcmaxpjl, &dw34); + flt_t rr = (r23mag * r23mag) - (r34mag * r34mag); + flt_t r24x = r23x + r34x; + flt_t r24y = r23y + r34y; + flt_t r24z = r23z + r34z; + flt_t r242 = + (r24x * r24x) + (r24y * r24y) + (r24z * r24z); + flt_t rijrjl = 2 * r23mag * r34mag; + flt_t rjl2 = r34mag * r34mag; + flt_t dctjl = (-rr + r242) / (rijrjl * rjl2); + flt_t dctji = (rr + r242) / (rijrjl * r23mag * r23mag); + flt_t dctil = -2 / rijrjl; + flt_t dtsijl; + flt_t tspijl = Sp2(cos234, thmin, thmax, &dtsijl); + dtsijl = -dtsijl; // need minus sign + flt_t prefactor = VA; + + flt_t cross321x = (r32y * r21z) - (r32z * r21y); + flt_t cross321y = (r32z * r21x) - (r32x * r21z); + flt_t cross321z = (r32x * r21y) - (r32y * r21x); + flt_t cross234x = (r23y * r34z) - (r23z * r34y); + flt_t cross234y = (r23z * r34x) - (r23x * r34z); + flt_t cross234z = (r23x * r34y) - (r23y * r34x); + + flt_t cwnum = (cross321x * cross234x) + + (cross321y * cross234y) + + (cross321z * cross234z); + flt_t cwnom = r21mag * r34mag * r23mag * r23mag * sin321 * sin234; + flt_t om1234 = cwnum / cwnom; + flt_t cw = om1234; + sum_omega += ((1 - (om1234 * om1234)) * w21 * w34) * + (1 - tspjik) * (1 - tspijl); + if (VA == static_cast(0.0)) continue; + + flt_t dt1dik = (rik2i) - (dctik * sink2i * cos321); + flt_t dt1djk = (-dctjk * sink2i * cos321); + flt_t dt1djl = (rjl2i) - (dctjl * sinl2i * cos234); + flt_t dt1dil = (-dctil * sinl2i * cos234); + flt_t dt1dij = (2 / (r23mag * r23mag)) - + (dctij * sink2i * cos321) - + (dctji * sinl2i * cos234); + + flt_t dt2dikx = (-r23z * cross234y) + (r23y * cross234z); + flt_t dt2diky = (-r23x * cross234z) + (r23z * cross234x); + flt_t dt2dikz = (-r23y * cross234x) + (r23x * cross234y); + + flt_t dt2djlx = (-r23y * cross321z) + (r23z * cross321y); + flt_t dt2djly = (-r23z * cross321x) + (r23x * cross321z); + flt_t dt2djlz = (-r23x * cross321y) + (r23y * cross321x); + + flt_t dt2dijx = (r21z * cross234y) - (r34z * cross321y) - + flt_t (r21y * cross234z) + (r34y * cross321z); + flt_t dt2dijy = (r21x * cross234z) - (r34x * cross321z) - + flt_t (r21z * cross234x) + (r34z * cross321x); + flt_t dt2dijz = (r21y * cross234x) - (r34y * cross321x) - + flt_t (r21x * cross234y) + (r34x * cross321y); + + flt_t aa = (prefactor * 2 * cw / cwnom) * w21 * w34 * + (1 - tspjik) * (1 - tspijl); + flt_t aaa1 = -prefactor * (1 - (om1234 * om1234)) * + (1 - tspjik) * (1 - tspijl); + flt_t aaa2 = -prefactor * (1 - (om1234 * om1234)) * w21 * w34; + flt_t at2 = aa * cwnum; + + flt_t fcijpc = (-dt1dij * at2) + + (aaa2 * dtsjik * dctij * (1 - tspijl)) + + (aaa2 * dtsijl * dctji * (1 - tspjik)); + flt_t fcikpc = (-dt1dik * at2) + + (aaa2 * dtsjik * dctik * (1 - tspijl)); + flt_t fcjlpc = (-dt1djl * at2) + + (aaa2 * dtsijl * dctjl * (1 - tspjik)); + flt_t fcjkpc = (-dt1djk * at2) + + (aaa2 * dtsjik * dctjk * (1 - tspijl)); + flt_t fcilpc = (-dt1dil * at2) + + (aaa2 * dtsijl * dctil * (1 - tspjik)); + + flt_t F23x = (fcijpc * r23x) + (aa * dt2dijx); + flt_t F23y = (fcijpc * r23y) + (aa * dt2dijy); + flt_t F23z = (fcijpc * r23z) + (aa * dt2dijz); + + flt_t F12x = (fcikpc * r21x) + (aa * dt2dikx); + flt_t F12y = (fcikpc * r21y) + (aa * dt2diky); + flt_t F12z = (fcikpc * r21z) + (aa * dt2dikz); + + flt_t F34x = (fcjlpc * r34x) + (aa * dt2djlx); + flt_t F34y = (fcjlpc * r34y) + (aa * dt2djly); + flt_t F34z = (fcjlpc * r34z) + (aa * dt2djlz); + + flt_t F31x = (fcjkpc * r31x); + flt_t F31y = (fcjkpc * r31y); + flt_t F31z = (fcjkpc * r31z); + + flt_t F24x = (fcilpc * r24x); + flt_t F24y = (fcilpc * r24y); + flt_t F24z = (fcilpc * r24z); + + flt_t f1x = -F12x - F31x; + flt_t f1y = -F12y - F31y; + flt_t f1z = -F12z - F31z; + flt_t f2x = F12x + F31x; + flt_t f2y = F12y + F31y; + flt_t f2z = F12z + F31z; + flt_t f3x = F34x + F24x; + flt_t f3y = F34y + F24y; + flt_t f3z = F34z + F24z; + flt_t f4x = -F34x - F24x; + flt_t f4y = -F34y - F24y; + flt_t f4z = -F34z - F24z; + + fij[0] += F23x + F24x - F31x; + fij[1] += F23y + F24y - F31y; + fij[2] += F23z + F24z - F31z; + + // coordination forces + + flt_t tmp20 = VA * ((1 - (om1234 * om1234))) * + (1 - tspjik) * (1 - tspijl) * dw21 * w34 / r21mag; + f2x -= tmp20 * r21x; + f2y -= tmp20 * r21y; + f2z -= tmp20 * r21z; + f1x += tmp20 * r21x; + f1y += tmp20 * r21y; + f1z += tmp20 * r21z; + + flt_t tmp21 = VA * ((1 - (om1234 * om1234))) * + (1 - tspjik) * (1 - tspijl) * w21 * dw34 / r34mag; + f3x -= tmp21 * r34x; + f3y -= tmp21 * r34y; + f3z -= tmp21 * r34z; + f4x += tmp21 * r34x; + f4y += tmp21 * r34y; + f4z += tmp21 * r34z; + + result_f[a1].x += f1x; + result_f[a1].y += f1y; + result_f[a1].z += f1z; + result_f[a2].x += f2x; + result_f[a2].y += f2y; + result_f[a2].z += f2z; + result_f[a3].x += f3x; + result_f[a3].y += f3y; + result_f[a3].z += f3z; + result_f[a4].x += f4x; + result_f[a4].y += f4y; + result_f[a4].z += f4z; + } + } + return sum_omega; +} + +/* + * Implements a scalar implementation the force update due to splines. + * It is used for both pi^rc_ij and T_ij. + * Occurs four times in each bondorder and bondorderLJ. + */ +template +inline void frebo_N_spline_force(KernelArgsAIREBOT * ka, int i, + int j, flt_t VA, flt_t dN, flt_t dNconj, flt_t Nconj) { + int * map = ka->map; + AtomAIREBOT * x = ka->x; + ResultForceT * result_f = ka->result_f; + flt_t * nC = ka->nC; + flt_t * nH = ka->nH; + flt_t Nmin = ka->params.Nmin; + flt_t Nmax = ka->params.Nmax; + int itype = map[x[i].w]; + int * neighs = ka->neigh_rebo.entries + ka->neigh_rebo.offset[i]; + int knum = ka->neigh_rebo.num[i]; + int kk; + for (kk = 0; kk < knum; kk++) { + int k = neighs[kk]; + if (k == j) continue; + flt_t rikx = x[i].x - x[k].x; + flt_t riky = x[i].y - x[k].y; + flt_t rikz = x[i].z - x[k].z; + flt_t rikmag = overloaded::sqrt(rikx * rikx + riky * riky + rikz * rikz); + int ktype = map[x[k].w]; + flt_t rcminik = ka->params.rcmin[itype][ktype]; + flt_t rcmaxik = ka->params.rcmax[itype][ktype]; + flt_t dwik; + flt_t wik = Sp(rikmag, rcminik, rcmaxik, &dwik); + flt_t Nki = nC[k] + nH[k] - wik; + flt_t dNki; + flt_t SpN = Sp(Nki, Nmin, Nmax, &dNki); + flt_t fdN = VA * dN * dwik / rikmag; + flt_t fdNconj = VA * dNconj * 2 * Nconj * dwik * SpN / rikmag; + flt_t ffactor = fdN; + if (ktype == 0) ffactor += fdNconj; + flt_t fkx = ffactor * rikx; + flt_t fky = ffactor * riky; + flt_t fkz = ffactor * rikz; + result_f[i].x -= fkx; + result_f[i].y -= fky; + result_f[i].z -= fkz; + result_f[k].x += fkx; + result_f[k].y += fky; + result_f[k].z += fkz; + if (ktype != 0 || fabs(dNki) <= TOL) continue; + int * neighs_k = ka->neigh_rebo.entries + ka->neigh_rebo.offset[k]; + int nnum = ka->neigh_rebo.num[k]; + int nn; + for (nn = 0; nn < nnum; nn++) { + int n = neighs_k[nn]; + if (n == i) continue; + flt_t rknx = x[k].x - x[n].x; + flt_t rkny = x[k].y - x[n].y; + flt_t rknz = x[k].z - x[n].z; + flt_t rknmag = overloaded::sqrt(rknx * rknx + rkny * rkny + rknz * rknz); + int ntype = map[x[n].w]; + flt_t rcminkn = ka->params.rcmin[ktype][ntype]; + flt_t rcmaxkn = ka->params.rcmax[ktype][ntype]; + flt_t dwkn; + Sp(rknmag, rcminkn, rcmaxkn, &dwkn); + flt_t ffactor = VA * dNconj * 2 * Nconj * wik * dNki * dwkn / rknmag; + result_f[k].x -= ffactor * rknx; + result_f[k].y -= ffactor * rkny; + result_f[k].z -= ffactor * rknz; + result_f[n].x += ffactor * rknx; + result_f[n].y += ffactor * rkny; + result_f[n].z += ffactor * rknz; + } + } +} + +/* + * This data-structure contains the result of a search through neighbor-lists. + * It is used to calculate C_ij and the corresponding force updates. + */ +template +struct LennardJonesPathAIREBOT { + AtomAIREBOT del[3]; + int num; + flt_t w[3]; + flt_t dw[3]; + flt_t r[3]; + int idx[4]; +}; + +/* + * Checks a candidate path stored in idxs whether it is better than *path + * and updates *path accordingly. + */ +template +inline flt_t ref_lennard_jones_test_path_single( + KernelArgsAIREBOT * ka, flt_t best, int num, int * idxs, + LennardJonesPathAIREBOT * path) { + LennardJonesPathAIREBOT result; + AtomAIREBOT * x = ka->x; + int * map = ka->map; + result.num = num; + flt_t combined = 1; + for (int i = num - 2; i >= 0; i--) { + int a0 = idxs[i+0]; + int a1 = idxs[i+1]; + flt_t delx = x[a1].x - x[a0].x; + flt_t dely = x[a1].y - x[a0].y; + flt_t delz = x[a1].z - x[a0].z; + flt_t rsq = delx * delx + dely * dely + delz * delz; + int type0 = map[x[a0].w]; + int type1 = map[x[a1].w]; + if (rsq >= ka->params.rcmaxsq[type0][type1]) return best; + flt_t r = overloaded::sqrt(rsq); + flt_t dw, w = Sp(r, ka->params.rcmin[type0][type1], + ka->params.rcmax[type0][type1], &dw); + if (w == 0) return best; + combined *= w; + if (combined <= best) return best; + result.idx[i] = a0; + result.del[i].x = delx; + result.del[i].y = dely; + result.del[i].z = delz; + result.r[i] = r; + result.w[i] = w; + result.dw[i] = dw; + } + result.idx[num - 1] = idxs[num - 1]; + *path = result; + return combined; +} + +/* + * Test through all paths surrounding i and j to find the corresponding + * best path. Uses the same iteration ordering as FLJ() does. + * Note that an optimization would use the j neighlist instead in the inner + * loop. + */ +template +inline flt_t ref_lennard_jones_test_path(KernelArgsAIREBOT * ka, + int i, int j, flt_t rij, flt_t rcmax, + LennardJonesPathAIREBOT * path) { + int idxs[4]; + idxs[0] = i; + idxs[1] = j; + flt_t best = 0; + if (rij <= rcmax) { + best = ref_lennard_jones_test_path_single(ka, best, 2, idxs, path); + if (best == static_cast(1.0)) return 0; + } + for (int kk = 0; kk < ka->neigh_rebo.num[i]; kk++) { + int k = ka->neigh_rebo.entries[ka->neigh_rebo.offset[i] + kk]; + if (k == j) continue; + idxs[1] = k; + idxs[2] = j; + best = ref_lennard_jones_test_path_single(ka, best, 3, idxs, path); + if (best == static_cast(1.0)) return 0; + for (int mm = 0; mm < ka->neigh_rebo.num[k]; mm++) { + int m = ka->neigh_rebo.entries[ka->neigh_rebo.offset[k] + mm]; + if (m == i || m == j) continue; + idxs[2] = m; + idxs[3] = j; + best = ref_lennard_jones_test_path_single(ka, best, 4, idxs, path); + if (best == static_cast(1.0)) return 0; + } + } + return 1 - best; +} + +/* + * Conducts the force update due to C_ij, given the active path. + */ +template +inline void ref_lennard_jones_force_path(KernelArgsAIREBOT * ka, + flt_t dC, LennardJonesPathAIREBOT * path) { + AtomAIREBOT * x = ka->x; + ResultForceT * result_f = ka->result_f; + for (int i = 0; i < path->num - 1; i++) { + flt_t fpair = dC * path->dw[i] / path->r[i]; + for (int j = 0; j < path->num - 1; j++) { + if (i != j) fpair *= path->w[j]; + } + result_f[path->idx[i+0]].x -= fpair * path->del[i].x; + result_f[path->idx[i+0]].y -= fpair * path->del[i].y; + result_f[path->idx[i+0]].z -= fpair * path->del[i].z; + result_f[path->idx[i+1]].x += fpair * path->del[i].x; + result_f[path->idx[i+1]].y += fpair * path->del[i].y; + result_f[path->idx[i+1]].z += fpair * path->del[i].z; + } +} + +/* + * Calculate the bondorderLJ term. + */ +template +inline flt_t ref_lennard_jones_bondorder(KernelArgsAIREBOT * ka, + int i, int j, flt_t VA, acc_t fij[3]) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + ResultForceT * result_f = ka->result_f; + + int itype = map[x[i].w]; + int jtype = map[x[j].w]; + + flt_t delx = x[i].x - x[j].x; + flt_t dely = x[i].y - x[j].y; + flt_t delz = x[i].z - x[j].z; + flt_t rsq = delx * delx + dely * dely + delz * delz; + flt_t rij = overloaded::sqrt(rsq); + + flt_t rcminij = ka->params.rcmin[itype][jtype]; + flt_t rcmaxij = ka->params.rcmax[itype][jtype]; + flt_t dwij; + flt_t wij = Sp(rij, rcminij, rcmaxij, &dwij); + + flt_t the_r = ka->params.rcmin[itype][jtype]; + flt_t scale = the_r / rij; + flt_t Nij = ka->nH[i] + ka->nC[i] - wij; + flt_t Nji = ka->nH[j] + ka->nC[j] - wij; + flt_t NconjtmpI; + acc_t fijc[3] = {0}, fjic[3] = {0}; + flt_t pij = frebo_pij(ka, i, j, delx * scale, dely * scale, + delz * scale, the_r, wij, 0.0, &NconjtmpI, fijc); + flt_t NconjtmpJ; + flt_t pji = frebo_pij(ka, j, i, -delx * scale, -dely * scale, + -delz * scale, the_r, wij, 0.0, &NconjtmpJ, fjic); + flt_t Nijconj = 1.0 + (NconjtmpI * NconjtmpI) + (NconjtmpJ * NconjtmpJ); + flt_t dN3_pi_rc[3]; + flt_t pi_rc = frebo_pi_rc(ka, itype, jtype, Nij, Nji, Nijconj, + dN3_pi_rc); + flt_t dN3_Tij[3]; + flt_t Tij = frebo_Tij(ka, itype, jtype, Nij, Nji, Nijconj, + dN3_Tij); + flt_t sum_omega = 0; + if (fabs(Tij) > TOL) { + sum_omega = frebo_sum_omega(ka, i, j, delx * scale, dely * + scale, delz * scale, the_r, 0.0, + fijc); + } + flt_t pi_dh = Tij * sum_omega; + flt_t bij = 0.5 * (pij + pji) + pi_rc + pi_dh; + flt_t dStb; + flt_t Stb = Sp2(bij, ka->params.bLJmin[itype][jtype], + ka->params.bLJmax[itype][jtype], &dStb); + if (dStb != 0) { + flt_t pij_reverse = frebo_pij(ka, i, j, delx * scale, + dely * scale, delz * scale, the_r, wij, VA * dStb, &NconjtmpI, fijc); + flt_t pji_reverse = frebo_pij(ka, j, i, -delx * scale, + -dely * scale, -delz * scale, the_r, wij, VA * dStb, &NconjtmpJ, fjic); + fijc[0] -= fjic[0]; + fijc[1] -= fjic[1]; + fijc[2] -= fjic[2]; + frebo_N_spline_force(ka, i, j, VA * dStb, dN3_pi_rc[0], + dN3_pi_rc[2], NconjtmpI); + frebo_N_spline_force(ka, j, i, VA * dStb, dN3_pi_rc[1], + dN3_pi_rc[2], NconjtmpJ); + if (fabs(Tij) > TOL) { + flt_t sum_omega_reverse = frebo_sum_omega(ka, i, j, + delx * scale, dely * scale, delz * scale, the_r, VA * dStb * Tij, fijc); + frebo_N_spline_force(ka, i, j, VA * dStb * sum_omega, dN3_Tij[0], + dN3_Tij[2], NconjtmpI); + frebo_N_spline_force(ka, j, i, VA * dStb * sum_omega, dN3_Tij[1], + dN3_Tij[2], NconjtmpJ); + } + assert(fij[0] == 0); + assert(fij[1] == 0); + assert(fij[2] == 0); + fij[0] = scale * (fijc[0] - (delx * delx * fijc[0] + dely * delx * + fijc[1] + delz * delx * fijc[2]) / rsq); + fij[1] = scale * (fijc[1] - (delx * dely * fijc[0] + dely * dely * + fijc[1] + delz * dely * fijc[2]) / rsq); + fij[2] = scale * (fijc[2] - (delx * delz * fijc[0] + dely * delz * + fijc[1] + delz * delz * fijc[2]) / rsq); + } + return Stb; +} + +/* + * Scalar reference implementation of neighbor routine. + */ +template +void ref_rebo_neigh(KernelArgsAIREBOT * ka) { + int offset = ka->neigh_from_atom * ka->num_neighs_per_atom; + for (int i = ka->neigh_from_atom; i < ka->neigh_to_atom; i++) { + ka->neigh_rebo.offset[i] = offset; + int itype = ka->map[ka->x[i].w]; + int n = 0; + ka->nC[i] = 0; + ka->nH[i] = 0; + for (int j = 0; j < ka->neigh_lmp.num[i]; j++) { + int ji = ka->neigh_lmp.entries[ka->neigh_lmp.offset[i] + j]; + flt_t delx = ka->x[i].x - ka->x[ji].x; + flt_t dely = ka->x[i].y - ka->x[ji].y; + flt_t delz = ka->x[i].z - ka->x[ji].z; + flt_t rsq = delx * delx + dely * dely + delz * delz; + int jtype = ka->map[ka->x[ji].w]; + if (rsq < ka->params.rcmaxsq[itype][jtype]) { + ka->neigh_rebo.entries[offset + n++] = ji; + flt_t rcmin = ka->params.rcmin[itype][jtype]; + flt_t rcmax = ka->params.rcmax[itype][jtype]; + if (jtype == CARBON) + ka->nC[i] += Sp(overloaded::sqrt(rsq), rcmin, rcmax, NULL); + else + ka->nH[i] += Sp(overloaded::sqrt(rsq), rcmin, rcmax, NULL); + } + } + ka->neigh_rebo.num[i] = n; + offset += n; + } +} + +template +void ref_torsion_single_interaction(KernelArgsAIREBOT * ka, int i, + int j) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + ResultForceT * f = ka->result_f; + flt_t (*rcmin)[2] = ka->params.rcmin; + flt_t (*rcmax)[2] = ka->params.rcmax; + flt_t (*epsilonT)[2] = ka->params.epsilonT; + flt_t thmin = ka->params.thmin; + flt_t thmax = ka->params.thmax; + int itype = map[x[i].w]; + flt_t xtmp = x[i].x; + flt_t ytmp = x[i].y; + flt_t ztmp = x[i].z; + int * REBO_neighs_i = &ka->neigh_rebo.entries[ka->neigh_rebo.offset[i]]; + int jnum = ka->neigh_rebo.num[i]; + int jtype = map[x[j].w]; + + flt_t del32x = x[j].x-x[i].x; + flt_t del32y = x[j].y-x[i].y; + flt_t del32z = x[j].z-x[i].z; + flt_t rsq = del32x*del32x + del32y*del32y + del32z*del32z; + flt_t r32 = overloaded::sqrt(rsq); + flt_t del23x = -del32x; + flt_t del23y = -del32y; + flt_t del23z = -del32z; + flt_t r23 = r32; + flt_t dw23, w23 = Sp(r23,rcmin[itype][jtype],rcmax[itype][jtype], + &dw23); + + assert(itype == 0); + assert(jtype == 0); + + for (int kk = 0; kk < jnum; kk++) { + int k = REBO_neighs_i[kk]; + int ktype = map[x[k].w]; + if (k == j) continue; + flt_t del21x = x[i].x-x[k].x; + flt_t del21y = x[i].y-x[k].y; + flt_t del21z = x[i].z-x[k].z; + flt_t rsq = del21x*del21x + del21y*del21y + del21z*del21z; + flt_t r21 = overloaded::sqrt(rsq); + flt_t cos321 = - ((del21x*del32x) + (del21y*del32y) + + (del21z*del32z)) / (r21*r32); + cos321 = fmin(cos321,1); + cos321 = fmax(cos321,-1); + flt_t sin321 = overloaded::sqrt(1 - cos321*cos321); + if (sin321 < TOL) continue; + + flt_t deljkx = del21x-del23x; + flt_t deljky = del21y-del23y; + flt_t deljkz = del21z-del23z; + flt_t rjk2 = deljkx*deljkx + deljky*deljky + deljkz*deljkz; + flt_t rjk = overloaded::sqrt(rjk2); + flt_t rik2 = r21*r21; + flt_t dw21, w21 = Sp(r21,rcmin[itype][ktype],rcmax[itype][ktype], + &dw21); + + flt_t rij = r32; + flt_t rik = r21; + flt_t rij2 = r32*r32; + flt_t costmp = static_cast(0.5)*(rij2+rik2-rjk2)/rij/rik; + flt_t dtsjik, tspjik = Sp2(costmp,thmin,thmax,&dtsjik); + dtsjik = -dtsjik; + + int * REBO_neighs_j = &ka->neigh_rebo.entries[ka->neigh_rebo.offset[j]]; + int lnum = ka->neigh_rebo.num[j]; + for (int ll = 0; ll < lnum; ll++) { + int l = REBO_neighs_j[ll]; + int ltype = map[x[l].w]; + if (l == i || l == k) continue; + flt_t del34x = x[j].x-x[l].x; + flt_t del34y = x[j].y-x[l].y; + flt_t del34z = x[j].z-x[l].z; + flt_t rsq = del34x*del34x + del34y*del34y + del34z*del34z; + flt_t r34 = overloaded::sqrt(rsq); + flt_t cos234 = (del32x*del34x + del32y*del34y + + del32z*del34z) / (r32*r34); + cos234 = fmin(cos234,1); + cos234 = fmax(cos234,-1); + flt_t sin234 = overloaded::sqrt(1 - cos234*cos234); + if (sin234 < TOL) continue; + flt_t dw34, w34 = Sp(r34,rcmin[jtype][ltype],rcmax[jtype][ltype], + &dw34); + flt_t delilx = del23x + del34x; + flt_t delily = del23y + del34y; + flt_t delilz = del23z + del34z; + flt_t ril2 = delilx*delilx + delily*delily + delilz*delilz; + flt_t ril = overloaded::sqrt(ril2); + flt_t rjl2 = r34*r34; + + flt_t rjl = r34; + flt_t costmp = static_cast(0.5)*(rij2+rjl2-ril2)/rij/rjl; + flt_t dtsijl, tspijl = Sp2(costmp,thmin,thmax,&dtsijl); + dtsijl = -dtsijl; //need minus sign + flt_t cross321x = (del32y*del21z)-(del32z*del21y); + flt_t cross321y = (del32z*del21x)-(del32x*del21z); + flt_t cross321z = (del32x*del21y)-(del32y*del21x); + flt_t cross321mag = overloaded::sqrt(cross321x*cross321x+ + cross321y*cross321y + cross321z*cross321z); + flt_t cross234x = (del23y*del34z)-(del23z*del34y); + flt_t cross234y = (del23z*del34x)-(del23x*del34z); + flt_t cross234z = (del23x*del34y)-(del23y*del34x); + flt_t cross234mag = overloaded::sqrt(cross234x*cross234x+ + cross234y*cross234y + cross234z*cross234z); + flt_t cwnum = (cross321x*cross234x) + + (cross321y*cross234y)+(cross321z*cross234z); + flt_t cwnom = r21*r34*r32*r32*sin321*sin234; + flt_t cw = cwnum/cwnom; + + flt_t cw2 = (static_cast(.5)*(1-cw)); + flt_t ekijl = epsilonT[ktype][ltype]; + flt_t Ec = 256*ekijl/405; + flt_t Vtors = (Ec*(overloaded::pow(cw2,5)))-(ekijl/10); + + ka->result_eng += Vtors*w21*w23*w34*(1-tspjik)*(1-tspijl); + + flt_t dndijx = (cross234y*del21z)-(cross234z*del21y); + flt_t dndijy = (cross234z*del21x)-(cross234x*del21z); + flt_t dndijz = (cross234x*del21y)-(cross234y*del21x); + + flt_t tmpvecx = (del34y*cross321z)-(del34z*cross321y); + flt_t tmpvecy = (del34z*cross321x)-(del34x*cross321z); + flt_t tmpvecz = (del34x*cross321y)-(del34y*cross321x); + + dndijx = dndijx+tmpvecx; + dndijy = dndijy+tmpvecy; + dndijz = dndijz+tmpvecz; + + flt_t dndikx = (del23y*cross234z)-(del23z*cross234y); + flt_t dndiky = (del23z*cross234x)-(del23x*cross234z); + flt_t dndikz = (del23x*cross234y)-(del23y*cross234x); + + flt_t dndjlx = (cross321y*del23z)-(cross321z*del23y); + flt_t dndjly = (cross321z*del23x)-(cross321x*del23z); + flt_t dndjlz = (cross321x*del23y)-(cross321y*del23x); + + flt_t dcidij = ((r23*r23)-(r21*r21)+(rjk*rjk))/(2*r23*r23*r21); + flt_t dcidik = ((r21*r21)-(r23*r23)+(rjk*rjk))/(2*r23*r21*r21); + flt_t dcidjk = (-rjk)/(r23*r21); + flt_t dcjdji = ((r23*r23)-(r34*r34)+(ril*ril))/(2*r23*r23*r34); + flt_t dcjdjl = ((r34*r34)-(r23*r23)+(ril*ril))/(2*r23*r34*r34); + flt_t dcjdil = (-ril)/(r23*r34); + + flt_t dsidij = (-cos321/sin321)*dcidij; + flt_t dsidik = (-cos321/sin321)*dcidik; + flt_t dsidjk = (-cos321/sin321)*dcidjk; + + flt_t dsjdji = (-cos234/sin234)*dcjdji; + flt_t dsjdjl = (-cos234/sin234)*dcjdjl; + flt_t dsjdil = (-cos234/sin234)*dcjdil; + + flt_t dxidij = (r21*sin321)+(r23*r21*dsidij); + flt_t dxidik = (r23*sin321)+(r23*r21*dsidik); + flt_t dxidjk = (r23*r21*dsidjk); + + flt_t dxjdji = (r34*sin234)+(r23*r34*dsjdji); + flt_t dxjdjl = (r23*sin234)+(r23*r34*dsjdjl); + flt_t dxjdil = (r23*r34*dsjdil); + + flt_t ddndij = (dxidij*cross234mag)+(cross321mag*dxjdji); + flt_t ddndik = dxidik*cross234mag; + flt_t ddndjk = dxidjk*cross234mag; + flt_t ddndjl = cross321mag*dxjdjl; + flt_t ddndil = cross321mag*dxjdil; + flt_t dcwddn = -cwnum/(cwnom*cwnom); + flt_t dcwdn = 1/cwnom; + flt_t dvpdcw = (-1)*Ec*static_cast(-0.5)*5*overloaded::pow(cw2,4)* + w23*w21*w34*(1-tspjik)*(1-tspijl); + + flt_t Ftmpx = dvpdcw*((dcwdn*dndijx)+(dcwddn*ddndij*del23x/r23)); + flt_t Ftmpy = dvpdcw*((dcwdn*dndijy)+(dcwddn*ddndij*del23y/r23)); + flt_t Ftmpz = dvpdcw*((dcwdn*dndijz)+(dcwddn*ddndij*del23z/r23)); + flt_t fix = Ftmpx; + flt_t fiy = Ftmpy; + flt_t fiz = Ftmpz; + flt_t fjx = -Ftmpx; + flt_t fjy = -Ftmpy; + flt_t fjz = -Ftmpz; + + Ftmpx = dvpdcw*((dcwdn*dndikx)+(dcwddn*ddndik*del21x/r21)); + Ftmpy = dvpdcw*((dcwdn*dndiky)+(dcwddn*ddndik*del21y/r21)); + Ftmpz = dvpdcw*((dcwdn*dndikz)+(dcwddn*ddndik*del21z/r21)); + fix += Ftmpx; + fiy += Ftmpy; + fiz += Ftmpz; + flt_t fkx = -Ftmpx; + flt_t fky = -Ftmpy; + flt_t fkz = -Ftmpz; + + Ftmpx = (dvpdcw*dcwddn*ddndjk*deljkx)/rjk; + Ftmpy = (dvpdcw*dcwddn*ddndjk*deljky)/rjk; + Ftmpz = (dvpdcw*dcwddn*ddndjk*deljkz)/rjk; + fjx += Ftmpx; + fjy += Ftmpy; + fjz += Ftmpz; + fkx -= Ftmpx; + fky -= Ftmpy; + fkz -= Ftmpz; + + Ftmpx = dvpdcw*((dcwdn*dndjlx)+(dcwddn*ddndjl*del34x/r34)); + Ftmpy = dvpdcw*((dcwdn*dndjly)+(dcwddn*ddndjl*del34y/r34)); + Ftmpz = dvpdcw*((dcwdn*dndjlz)+(dcwddn*ddndjl*del34z/r34)); + fjx += Ftmpx; + fjy += Ftmpy; + fjz += Ftmpz; + flt_t flx = -Ftmpx; + flt_t fly = -Ftmpy; + flt_t flz = -Ftmpz; + + Ftmpx = (dvpdcw*dcwddn*ddndil*delilx)/ril; + Ftmpy = (dvpdcw*dcwddn*ddndil*delily)/ril; + Ftmpz = (dvpdcw*dcwddn*ddndil*delilz)/ril; + fix += Ftmpx; + fiy += Ftmpy; + fiz += Ftmpz; + flx -= Ftmpx; + fly -= Ftmpy; + flz -= Ftmpz; + + // coordination forces + + flt_t fpair = Vtors*dw21*w23*w34*(1-tspjik)*(1-tspijl) / r21; + fix -= del21x*fpair; + fiy -= del21y*fpair; + fiz -= del21z*fpair; + fkx += del21x*fpair; + fky += del21y*fpair; + fkz += del21z*fpair; + + fpair = Vtors*w21*dw23*w34*(1-tspjik)*(1-tspijl) / r23; + fix -= del23x*fpair; + fiy -= del23y*fpair; + fiz -= del23z*fpair; + fjx += del23x*fpair; + fjy += del23y*fpair; + fjz += del23z*fpair; + + fpair = Vtors*w21*w23*dw34*(1-tspjik)*(1-tspijl) / r34; + fjx -= del34x*fpair; + fjy -= del34y*fpair; + fjz -= del34z*fpair; + flx += del34x*fpair; + fly += del34y*fpair; + flz += del34z*fpair; + + // additional cut off function forces + + flt_t fcpc = -Vtors*w21*w23*w34*dtsjik*(1-tspijl); + fpair = fcpc*dcidij/rij; + fix += fpair*del23x; + fiy += fpair*del23y; + fiz += fpair*del23z; + fjx -= fpair*del23x; + fjy -= fpair*del23y; + fjz -= fpair*del23z; + + fpair = fcpc*dcidik/rik; + fix += fpair*del21x; + fiy += fpair*del21y; + fiz += fpair*del21z; + fkx -= fpair*del21x; + fky -= fpair*del21y; + fkz -= fpair*del21z; + + fpair = fcpc*dcidjk/rjk; + fjx += fpair*deljkx; + fjy += fpair*deljky; + fjz += fpair*deljkz; + fkx -= fpair*deljkx; + fky -= fpair*deljky; + fkz -= fpair*deljkz; + + fcpc = -Vtors*w21*w23*w34*(1-tspjik)*dtsijl; + fpair = fcpc*dcjdji/rij; + fix += fpair*del23x; + fiy += fpair*del23y; + fiz += fpair*del23z; + fjx -= fpair*del23x; + fjy -= fpair*del23y; + fjz -= fpair*del23z; + + fpair = fcpc*dcjdjl/rjl; + fjx += fpair*del34x; + fjy += fpair*del34y; + fjz += fpair*del34z; + flx -= fpair*del34x; + fly -= fpair*del34y; + flz -= fpair*del34z; + + fpair = fcpc*dcjdil/ril; + fix += fpair*delilx; + fiy += fpair*delily; + fiz += fpair*delilz; + flx -= fpair*delilx; + fly -= fpair*delily; + flz -= fpair*delilz; + + // sum per-atom forces into atom force array + + f[i].x += fix; f[i].y += fiy; f[i].z += fiz; + f[j].x += fjx; f[j].y += fjy; f[j].z += fjz; + f[k].x += fkx; f[k].y += fky; f[k].z += fkz; + f[l].x += flx; f[l].y += fly; f[l].z += flz; + } + } +} + +template +void ref_torsion(KernelArgsAIREBOT * ka) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + tagint * tag = ka->tag; + for (int ii = ka->frebo_from_atom; ii < ka->frebo_to_atom; ii++) { + int i = ii; + tagint itag = tag[i]; + int itype = map[x[i].w]; + if (itype != 0) continue; + flt_t xtmp = x[i].x; + flt_t ytmp = x[i].y; + flt_t ztmp = x[i].z; + int * REBO_neighs_i = &ka->neigh_rebo.entries[ka->neigh_rebo.offset[i]]; + int jnum = ka->neigh_rebo.num[i]; + for (int jj = 0; jj < jnum; jj++) { + int j = REBO_neighs_i[jj]; + tagint jtag = tag[j]; + + if (itag > jtag) { + if (((itag+jtag) & 1) == 0) continue; + } else if (itag < jtag) { + if (((itag+jtag) & 1) == 1) continue; + } else { + if (x[j].z < ztmp) continue; + if (x[j].z == ztmp && x[j].y < ytmp) continue; + if (x[j].z == ztmp && x[j].y == ytmp && x[j].x < xtmp) continue; + } + + int jtype = map[x[j].w]; + if (jtype != 0) continue; + ref_torsion_single_interaction(ka, i, j); + } + } +} + +/* + * Calculate single REBO interaction. + * Corresponds to FREBO method. Note that the bondorder() function is + * inlined. + */ +template +void ref_frebo_single_interaction(KernelArgsAIREBOT * ka, int i, + int j) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + ResultForceT * result_f = ka->result_f; + int jj; + int itype = map[x[i].w]; + flt_t x_i = x[i].x; + flt_t y_i = x[i].y; + flt_t z_i = x[i].z; + int jtype = map[x[j].w]; + flt_t delx = x[i].x - x[j].x; + flt_t dely = x[i].y - x[j].y; + flt_t delz = x[i].z - x[j].z; + flt_t rsq = delx * delx + dely * dely + delz * delz; + flt_t rij = overloaded::sqrt(rsq); + flt_t rcminij = ka->params.rcmin[itype][jtype]; + flt_t rcmaxij = ka->params.rcmax[itype][jtype]; + flt_t dwij; + flt_t wij = Sp(rij, rcminij, rcmaxij, &dwij); + if (wij <= TOL) return; + + flt_t Qij = ka->params.Q[itype][jtype]; + flt_t Aij = ka->params.A[itype][jtype]; + flt_t alphaij = ka->params.alpha[itype][jtype]; + + flt_t exp_alphar = exp(-alphaij * rij); + flt_t VR_by_wij = (1.0 + (Qij / rij)) * Aij * exp_alphar; + flt_t VR = wij * VR_by_wij; + flt_t pre = wij * Aij * exp_alphar; + flt_t dVRdi = pre * ((-alphaij) - (Qij / rsq) - (Qij * alphaij / rij)); + dVRdi += VR_by_wij * dwij; + + flt_t VA_by_wij = 0, dVA = 0; + for (int k = 0; k < 3; k++) { + flt_t BIJc = ka->params.BIJc[itype][jtype][k]; + flt_t Betaij = ka->params.Beta[itype][jtype][k]; + flt_t term = -BIJc * overloaded::exp(-Betaij * rij); + VA_by_wij += term; + dVA += -Betaij * wij * term; + } + dVA += VA_by_wij * dwij; + flt_t VA = VA_by_wij * wij; + + acc_t fij[3] = {0}; + flt_t Nij = ka->nH[i] + ka->nC[i] - wij; + flt_t Nji = ka->nH[j] + ka->nC[j] - wij; + flt_t NconjtmpI; + flt_t pij = frebo_pij(ka, i, j, delx, dely, delz, rij, wij, VA, &NconjtmpI, + fij); + flt_t NconjtmpJ; + acc_t fji[3] = {0}; + flt_t pji = frebo_pij(ka, j, i, -delx, -dely, -delz, rij, wij, VA, + &NconjtmpJ, fji); + fij[0] -= fji[0]; fij[1] -= fji[1]; fij[2] -= fji[2]; + flt_t Nijconj = 1.0 + (NconjtmpI * NconjtmpI) + (NconjtmpJ * NconjtmpJ); + flt_t dN3[3]; + flt_t pi_rc = frebo_pi_rc(ka, itype, jtype, Nij, Nji, Nijconj, dN3); + frebo_N_spline_force(ka, i, j, VA, dN3[0], dN3[2], NconjtmpI); + frebo_N_spline_force(ka, j, i, VA, dN3[1], dN3[2], NconjtmpJ); + flt_t Tij = frebo_Tij(ka, itype, jtype, Nij, Nji, Nijconj, dN3); + flt_t sum_omega = 0.0; + if (fabs(Tij) > TOL) { + sum_omega = frebo_sum_omega(ka, i, j, delx, dely, delz, rij, VA * Tij, fij); + frebo_N_spline_force(ka, i, j, VA * sum_omega, dN3[0], dN3[2], NconjtmpI); + frebo_N_spline_force(ka, j, i, VA * sum_omega, dN3[1], dN3[2], NconjtmpJ); + } + flt_t pi_dh = Tij * sum_omega; + flt_t bij = static_cast(0.5) * (pij + pji) + pi_rc + pi_dh; + flt_t dVAdi = bij * dVA; + flt_t fpair = -(dVRdi + dVAdi) / rij; + + result_f[i].x += fpair * delx + fij[0]; + result_f[i].y += fpair * dely + fij[1]; + result_f[i].z += fpair * delz + fij[2]; + result_f[j].x -= fpair * delx + fij[0]; + result_f[j].y -= fpair * dely + fij[1]; + result_f[j].z -= fpair * delz + fij[2]; + + flt_t evdwl = VR + bij * VA; + ka->result_eng += evdwl; + result_f[i].w += 0.5 * evdwl; + result_f[j].w += 0.5 * evdwl; +} + + +template +inline void ref_frebo_single_atom(KernelArgsAIREBOT * ka, int i) { + AtomAIREBOT * x = ka->x; + tagint * tag = ka->tag; + int jj; + tagint itag = tag[i]; + flt_t x_i = x[i].x; + flt_t y_i = x[i].y; + flt_t z_i = x[i].z; + int * neighs = ka->neigh_rebo.entries + ka->neigh_rebo.offset[i]; + int jnum = ka->neigh_rebo.num[i]; + for (jj = 0; jj < jnum; jj++) { + int j = neighs[jj]; + tagint jtag = tag[j]; + if (itag > jtag) { + if (((itag + jtag) & 1) == 0) + continue; + } else if (itag < jtag) { + if (((itag + jtag) & 1) == 1) + continue; + } else { + if (x[j].z < z_i) + continue; + if (x[j].z == z_i && x[j].y < y_i) + continue; + if (x[j].z == z_i && x[j].y == y_i && x[j].x < x_i) + continue; + } + ref_frebo_single_interaction(ka, i, j); + } +} + + +template +void ref_frebo(KernelArgsAIREBOT * ka, int torflag) { + for (int i = ka->frebo_from_atom; i < ka->frebo_to_atom; i++) { + ref_frebo_single_atom(ka, i); + } + if (torflag) ref_torsion(ka); +} + +template +void ref_lennard_jones_single_interaction(KernelArgsAIREBOT * ka, + int i, int j, int morseflag) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + ResultForceT * result_f = ka->result_f; + + int itype = map[x[i].w]; + int jtype = map[x[j].w]; + + flt_t delx = x[i].x - x[j].x; + flt_t dely = x[i].y - x[j].y; + flt_t delz = x[i].z - x[j].z; + flt_t rsq = delx * delx + dely * dely + delz * delz; + + if (rsq >= ka->params.cutljsq[itype][jtype]) { return; } + flt_t rij = overloaded::sqrt(rsq); + + LennardJonesPathAIREBOT testpath; + flt_t cij = 1.0; + if (rij < ka->params.cut3rebo) { + #pragma noinline + cij = ref_lennard_jones_test_path(ka, i, j, rij, + ka->params.rcmax[itype][jtype], &testpath); + } + if (cij == 0) { + return; + } + + flt_t sigcut = ka->params.sigcut; + flt_t sigmin = ka->params.sigmin; + flt_t sigma = ka->params.sigma[itype][jtype]; + flt_t rljmax = sigcut * sigma; + flt_t rljmin = sigmin * sigma; + + flt_t dslw, slw = Sp2(rij, rljmin, rljmax, &dslw); + + flt_t vdw, dvdw; + if (morseflag) { + const flt_t exr = exp(-rij * ka->params.lj4[itype][jtype]); + vdw = ka->params.lj1[itype][jtype] * exr * + (ka->params.lj2[itype][jtype]*exr - 2); + dvdw = ka->params.lj3[itype][jtype] * exr * + (1 - ka->params.lj2[itype][jtype]*exr); + } else { + flt_t r2inv = 1 / rsq; + flt_t r6inv = r2inv * r2inv * r2inv; + + vdw = r6inv * (ka->params.lj3[itype][jtype]*r6inv - + ka->params.lj4[itype][jtype]); + dvdw = -r6inv * (ka->params.lj1[itype][jtype]*r6inv - + ka->params.lj2[itype][jtype]) / rij; + } + + flt_t VLJ = vdw * slw; + flt_t dVLJ = dvdw * slw + vdw * dslw; + + flt_t dStr, Str = Sp2(rij, ka->params.rcLJmin[itype][jtype], + ka->params.rcLJmax[itype][jtype], &dStr); + flt_t VA = Str * cij * VLJ; + flt_t Stb = 0; + acc_t fij[3] = {0}; + if (Str > 0) { + #pragma noinline + Stb = ref_lennard_jones_bondorder(ka, i, j, VA, fij); + } + flt_t fpair = -(dStr * (Stb * cij * VLJ - cij * VLJ) + + dVLJ * (Str * Stb * cij + cij - Str * cij)) / rij; + flt_t evdwl = VA * Stb + (1 - Str) * cij * VLJ; + result_f[i].x += fpair * delx + fij[0]; + result_f[i].y += fpair * dely + fij[1]; + result_f[i].z += fpair * delz + fij[2]; + result_f[j].x -= fpair * delx + fij[0]; + result_f[j].y -= fpair * dely + fij[1]; + result_f[j].z -= fpair * delz + fij[2]; + ka->result_eng += evdwl; + + if (cij < 1) { + #pragma noinline + ref_lennard_jones_force_path(ka, Str * Stb * VLJ + (1 - Str) * VLJ, + &testpath); + } +} + +template +void ref_lennard_jones_single_atom(KernelArgsAIREBOT * ka, int i, + int morseflag) { + AtomAIREBOT * x = ka->x; + int jj; + int * neighs = ka->neigh_lmp.entries + ka->neigh_lmp.offset[i]; + int jnum = ka->neigh_lmp.num_half[i]; + for (jj = 0; jj < jnum; jj++) { + int j = neighs[jj]; + ref_lennard_jones_single_interaction(ka, i, j, morseflag); + } +} + +template +void ref_lennard_jones(KernelArgsAIREBOT * ka, int morseflag) { + for (int i = ka->frebo_from_atom; i < ka->frebo_to_atom; i++) { + #pragma noinline + ref_lennard_jones_single_atom(ka, i, morseflag); + } +} + +/* ---------------------------------------------------------------------- + Vectorized AIREBO implementation, standalone, using caching to reduce + memory access. + ---------------------------------------------------------------------- */ + +template +struct aut_wrap { + +typedef typename intr_types::fvec fvec; +typedef typename intr_types::avec avec; +typedef typename intr_types::ivec ivec; +typedef typename intr_types::bvec bvec; + +VEC_INLINE inline +static void aut_loadatoms_vec( + AtomAIREBOT * atoms, ivec j_vec, + fvec *x, fvec * y, fvec * z, bvec * type_mask, int * map, ivec map_i, + ivec c_1 +) { + const ivec c_4 = ivec::set1(4); + ivec j_vec_4 = ivec::mullo(c_4, j_vec); + fvec w; + fvec::gather_4_adjacent(j_vec_4, &atoms[0].x, sizeof(flt_t), x, y, z, &w); + ivec jtype = fvec::unpackloepi32(w); + jtype = ivec::srlv(map_i, jtype); //_mm512_castpd_si512(w)); + jtype = ivec::the_and(c_1, jtype); + bvec jtype_mask = ivec::cmpneq(jtype, ivec::setzero()); + *type_mask = jtype_mask; +} + +VEC_INLINE inline +static void aut_loadatoms_vec_notype( + AtomAIREBOT * atoms, ivec j_vec, + fvec *x, fvec * y, fvec * z +) { + const ivec c_4 = ivec::set1(4); + ivec j_vec_4 = ivec::mullo(c_4, j_vec); + fvec::gather_3_adjacent(j_vec_4, &atoms[0].x, sizeof(flt_t), x, y, z); +} + +static fvec aut_Sp2_deriv(fvec r, fvec lo, fvec hi, fvec * d) { + fvec c_1 = fvec::set1(1); + fvec c_2 = fvec::set1(2); + fvec c_3 = fvec::set1(3); + fvec c_6 = fvec::set1(6); + bvec m_lo = fvec::cmple(r, lo); + bvec m_hi = fvec::cmpnlt(r, hi); // nlt == ge + bvec m_tr = bvec::kandn(m_lo, ~ m_hi); + fvec ret = c_1; + ret = fvec::mask_blend(m_hi, ret, fvec::setzero()); + fvec der = fvec::setzero(); + if (bvec::test_any_set(m_tr)) { + fvec diff = hi - lo; + fvec rcp = fvec::recip(diff); + fvec t = (r - lo) * rcp; + fvec v = c_1 - t * t * ( c_3 - c_2 * t); + ret = fvec::mask_blend(m_tr, ret, v); + fvec dv = c_6 * rcp * ( t * t - t); + der = fvec::mask_blend(m_tr, der, dv); + } + *d = der; + return ret; +} + +static fvec aut_Sp_deriv(fvec r, fvec lo, fvec hi, fvec * d) { + fvec c_1 = fvec::set1(1); + fvec c_0_5 = fvec::set1(0.5); + fvec c_m0_5 = fvec::set1(-0.5); + fvec c_PI = fvec::set1(M_PI); + bvec m_lo = fvec::cmple(r, lo); + bvec m_hi = fvec::cmpnlt(r, hi); // nlt == ge + bvec m_tr = bvec::kandn(m_lo, ~ m_hi); + fvec ret = c_1; + ret = fvec::mask_blend(m_hi, ret, fvec::setzero()); + fvec der = fvec::setzero(); + if (bvec::test_any_set(m_tr)) { + fvec diff = hi - lo; + fvec rcp = fvec::mask_recip(c_1, m_tr, diff); + fvec t = (r - lo) / diff; + fvec sinval, cosval; + sinval = fvec::mask_sincos(&cosval, fvec::setzero(), c_1, m_tr, c_PI * t); + fvec v = c_0_5 * ( c_1 + cosval); + ret = fvec::mask_blend(m_tr, ret, v); + fvec dv = c_PI * c_m0_5 * rcp * sinval; + der = fvec::mask_blend(m_tr, der, dv); + } + *d = der; + return ret; +} + +static fvec aut_mask_Sp(bvec mask, fvec r, fvec lo, fvec hi) { + fvec c_1 = fvec::set1(1); + fvec c_0_5 = fvec::set1(0.5); + fvec c_PI = fvec::set1(M_PI); + bvec m_lo = fvec::mask_cmple(mask, r, lo); + bvec m_hi = fvec::mask_cmpnlt(mask, r, hi); // nlt == ge + bvec m_tr = bvec::kandn(m_lo, bvec::kandn(m_hi, mask)); + fvec ret = c_1; + ret = fvec::mask_blend(m_hi, ret, fvec::setzero()); + if (bvec::test_any_set(m_tr)) { + fvec rcp = fvec::mask_recip(c_1, m_tr, hi - lo); + fvec t = (r - lo) * rcp; + fvec v = c_0_5 * ( c_1 + fvec::mask_cos(c_1, m_tr, c_PI * t)); + ret = fvec::mask_blend(m_tr, ret, v); + } + return ret; +} + +static void aut_rebo_neigh(KernelArgsAIREBOT * ka) { + int offset = ka->neigh_from_atom * ka->num_neighs_per_atom; + ivec c_CARBON = ivec::setzero(); + int map_i = 0; + int i; + for (i = 1; i < ka->num_types; i++) { + if (ka->map[i]) + map_i |= (1 << i); + } + ivec c_i1 = ivec::set1(1); + ivec c_im = ivec::set1(map_i); + AtomAIREBOT * _noalias x = ka->x; + + for (i = ka->neigh_from_atom; i < ka->neigh_to_atom; i++) { + + fvec x_i = fvec::set1(x[i].x); + fvec y_i = fvec::set1(x[i].y); + fvec z_i = fvec::set1(x[i].z); + int itype = ka->map[ka->x[i].w]; + + fvec rcmaxsq0 = fvec::set1(ka->params.rcmaxsq[itype][0]); + fvec rcmaxsq1 = fvec::set1(ka->params.rcmaxsq[itype][1]); + fvec rcmax0 = fvec::set1(ka->params.rcmax[itype][0]); + fvec rcmax1 = fvec::set1(ka->params.rcmax[itype][1]); + fvec rcmin0 = fvec::set1(ka->params.rcmin[itype][0]); + fvec rcmin1 = fvec::set1(ka->params.rcmin[itype][1]); + fvec rcmaxskinsq0 = fvec::set1( + (ka->params.rcmax[itype][0] + ka->skin) * (ka->params.rcmax[itype][0] + + ka->skin)); + fvec rcmaxskinsq1 = fvec::set1( + (ka->params.rcmax[itype][1] + ka->skin) * (ka->params.rcmax[itype][1] + + ka->skin)); + fvec nC = fvec::setzero(); + fvec nH = fvec::setzero(); + + ka->neigh_rebo.offset[i] = offset; + + int jnum = ka->rebuild_flag ? ka->neigh_lmp.num[i] : + ka->neigh_rebo.num_half[i]; + int * neighs = ka->rebuild_flag ? + &ka->neigh_lmp.entries[ka->neigh_lmp.offset[i]] : + &ka->neigh_rebo.entries[ka->neigh_rebo.offset[i]+jnum]; + int * skin_target = &ka->neigh_rebo.entries[offset+ka->num_neighs_per_atom]; + int n = 0; + int n_skin = 0; + + int lowest_idx; + #pragma unroll(4) + for (lowest_idx = 0; lowest_idx < jnum; lowest_idx += fvec::VL) { + bvec j_mask = bvec::full(); + if (lowest_idx + fvec::VL > jnum) j_mask = bvec::only(jnum - lowest_idx); + + int * _noalias neighs_l = neighs + lowest_idx; + fvec x_j, y_j, z_j; + bvec jtype_mask; + ivec ji = ivec::maskz_loadu(j_mask, neighs_l); + aut_loadatoms_vec(x, ji, + &x_j, &y_j, &z_j, &jtype_mask, ka->map, c_im, c_i1); + fvec delx = x_i - x_j; + fvec dely = y_i - y_j; + fvec delz = z_i - z_j; + fvec rsq = delx * delx + dely * dely + delz * delz; + if (ka->rebuild_flag) { + fvec rcmaxskinsq = fvec::mask_blend(jtype_mask, rcmaxskinsq0, + rcmaxskinsq1); + bvec c_mask = fvec::mask_cmplt(j_mask, rsq, rcmaxskinsq); + ivec::mask_compressstore(c_mask, &skin_target[n_skin], ji); + n_skin += bvec::popcnt(c_mask); + } + fvec rcmaxsq = fvec::mask_blend(jtype_mask, rcmaxsq0, rcmaxsq1); + bvec c_mask = fvec::mask_cmplt(j_mask, rsq, rcmaxsq); + if (bvec::test_all_unset(c_mask)) continue; + ivec::mask_compressstore(c_mask, &ka->neigh_rebo.entries[offset + n], ji); + n += bvec::popcnt(c_mask); + fvec rcmax = fvec::mask_blend(jtype_mask, rcmax0, rcmax1); + fvec rcmin = fvec::mask_blend(jtype_mask, rcmin0, rcmin1); + fvec sp = aut_mask_Sp(c_mask, fvec::sqrt(rsq), rcmin, rcmax); + nC = fvec::mask_add(nC, bvec::kandn(jtype_mask, c_mask), nC, sp); + nH = fvec::mask_add(nH, bvec::kand (jtype_mask, c_mask), nH, sp); + } + ka->neigh_rebo.num[i] = n; + if (ka->rebuild_flag) { + for (int i = 0; i < n_skin; i++) { + ka->neigh_rebo.entries[offset+n_skin+i] = skin_target[i]; + } + } + if (ka->rebuild_flag) { + assert(n <= n_skin); + offset += 2 * n_skin; + ka->neigh_rebo.num_half[i] = n_skin; + } else { + assert(n <= jnum); + offset += 2 * jnum; + } + ka->nC[i] = fvec::reduce_add(nC); + ka->nH[i] = fvec::reduce_add(nH); + } +} + + +static fvec aut_eval_poly_lin_pd_2(int n, flt_t * vals, ivec idx, fvec x, + fvec * deriv) { + fvec c_1 = fvec::set1(1); + fvec x_i = c_1; + fvec x_im1 = fvec::setzero(); + fvec result = fvec::setzero(); + fvec i_v = fvec::setzero(); + *deriv = fvec::setzero(); + int i; + for (i = 0; i < n; i++) { + fvec coeff = fvec::gather(idx, vals + i, sizeof(flt_t)); + result = result + coeff * x_i; + *deriv = *deriv + coeff * x_im1 * i_v; + x_im1 = x_i; + x_i = x_i * x; + i_v = i_v + c_1; + } + return result; +} + +static fvec aut_mask_gSpline_pd_2(KernelArgsAIREBOT * ka, + bvec active_mask, int itype, fvec cosjik, + fvec Nij, fvec *dgdc, fvec *dgdN) { + int i; + flt_t * gDom = NULL; + int nDom = 0; + ivec offs = ivec::setzero(); + fvec NCmin = fvec::set1(ka->params.NCmin); + bvec Ngt = fvec::cmpnle(Nij, NCmin); //gt + if (itype == 0) { + nDom = 4; + gDom = &ka->params.gCdom[0]; + offs = ivec::mask_blend(Ngt, offs, ivec::set1(4*6)); + } else { + nDom = 3; + gDom = &ka->params.gHdom[0]; + offs = ivec::set1(8 * 6); + } + cosjik = fvec::max(fvec::set1(gDom[0]), fvec::min(fvec::set1(gDom[nDom]), + cosjik)); + ivec index6 = ivec::setzero(); + for (i = 0; i < nDom; i++) { + bvec cosge = fvec::cmpnlt(cosjik, fvec::set1(gDom[i])); //ge + bvec cosle = fvec::cmple(cosjik, fvec::set1(gDom[i+1])); + index6 = ivec::mask_blend(cosge & cosle, index6, ivec::set1(6*i)); + } + fvec g = aut_eval_poly_lin_pd_2(6, &ka->params.gVal[0], offs + index6, + cosjik, dgdc); + *dgdN = fvec::setzero(); + if (itype == 0) { + fvec NCmax = fvec::set1(ka->params.NCmax); + bvec Nlt = fvec::cmplt(Nij, NCmax); //gt + bvec Nmask = Ngt & Nlt; + if (bvec::test_any_set(Nmask)) { + fvec dg1; + fvec g1 = aut_eval_poly_lin_pd_2(6, &ka->params.gVal[0], index6, cosjik, + &dg1); + fvec dS; + fvec cut = aut_Sp_deriv(Nij, NCmin, NCmax, &dS); + *dgdN = fvec::mask_mul(*dgdN, Nmask, dS, g1 - g); + g = fvec::mask_add(g, Nmask, g, cut * ( g1 - g)); + *dgdc = fvec::mask_add(*dgdc, Nmask, *dgdc, cut * ( dg1 - *dgdc)); + } + } + return g; +} + +static fvec aut_PijSpline(KernelArgsAIREBOT * ka, int itype, + int jtype, fvec NijC, fvec NijH, fvec *dN2) { + flt_t ret[fvec::VL] __attribute__((aligned(64))); + flt_t dN20[fvec::VL] __attribute__((aligned(64))); + flt_t dN21[fvec::VL] __attribute__((aligned(64))); + flt_t NijC_[fvec::VL] __attribute__((aligned(64))); + flt_t NijH_[fvec::VL] __attribute__((aligned(64))); + flt_t tmp_dN2[2]; + fvec::store(NijC_, NijC); + fvec::store(NijH_, NijH); + int i; + for (i = 0; i < fvec::VL; i++) { + ret[i] = PijSpline(ka, itype, jtype, NijC_[i], NijH_[i], tmp_dN2); + dN20[i] = tmp_dN2[0]; + dN21[i] = tmp_dN2[1]; + } + dN2[0] = fvec::load(dN20); + dN2[1] = fvec::load(dN21); + return fvec::load(ret); +} + +/* + * aut_frebo_data stores all the short-ranged coordinations + * and intermediate values that get reused frequently during + * bondorder calculations. + * BUF_CAP should rarely exceed 4, so 8 is a very conservative + * value. + */ +static const int BUF_CAP = 8; +struct aut_frebo_data { + fvec rikx_buf[BUF_CAP]; + fvec riky_buf[BUF_CAP]; + fvec rikz_buf[BUF_CAP]; + fvec rikmag_buf[BUF_CAP]; + fvec cosjik_buf[BUF_CAP]; + ivec k_buf[BUF_CAP]; + fvec g_buf[BUF_CAP]; + fvec dgdc_buf[BUF_CAP]; + fvec ex_lam_buf[BUF_CAP]; + fvec wik_buf[BUF_CAP]; + fvec dwik_buf[BUF_CAP]; + fvec cutN_buf[BUF_CAP]; + fvec dcutN_buf[BUF_CAP]; + bvec ktype_buf[BUF_CAP]; + bvec mask_buf[BUF_CAP]; + fvec force_k_x_buf[BUF_CAP]; + fvec force_k_y_buf[BUF_CAP]; + fvec force_k_z_buf[BUF_CAP]; + int buf_len; + fvec x_i; + fvec y_i; + fvec z_i; + fvec x_j; + fvec y_j; + fvec z_j; + fvec nCi; + fvec nHi; + fvec force_i_x; + fvec force_i_y; + fvec force_i_z; + fvec force_j_x; + fvec force_j_y; + fvec force_j_z; +}; + +/* + * Initialize values in aut_frebo_data and perform the calculations + * for p_ij. + */ +static fvec aut_frebo_pij_pd_2( + KernelArgsAIREBOT * _noalias ka, + struct aut_frebo_data * _noalias data, + int itype, int jtype, + ivec vi, ivec vj, + fvec rijx, fvec rijy, fvec rijz, fvec rijmag, + fvec wij, fvec VA, fvec * sum_N, fvec fij[3] +) { + AtomAIREBOT * _noalias x = ka->x; + int * _noalias map = ka->map; + flt_t * _noalias nC = ka->nC; + flt_t * _noalias nH = ka->nH; + fvec x_i, y_i, z_i; + fvec x_j, y_j, z_j; + x_i = data->x_i; + y_i = data->y_i; + z_i = data->z_i; + x_j = data->x_j; + y_j = data->y_j; + z_j = data->z_j; + fvec invrijm = fvec::recip(rijmag); + fvec invrijm2 = invrijm * invrijm; + fvec rcminij = fvec::set1(ka->params.rcmin[itype][jtype]); + fvec rcmaxij = fvec::set1(ka->params.rcmax[itype][jtype]); + fvec Nmin = fvec::set1(ka->params.Nmin); + fvec Nmax = fvec::set1(ka->params.Nmax); + int map_i_scalar = 0; + { + int i; + for (i = 1; i < ka->num_types; i++) { + if (ka->map[i]) + map_i_scalar |= (1 << i); + } + } + ivec map_i = ivec::set1(map_i_scalar); + fvec nCi = data->nCi; + fvec nHi = data->nHi; + fvec Nij = nHi + nCi - wij; + fvec factor_jtype, factor_not_jtype; + if (jtype) { + factor_jtype = fvec::set1(1); + factor_not_jtype = fvec::set1(0); + } else { + factor_jtype = fvec::set1(0); + factor_not_jtype = fvec::set1(1); + } + fvec NijC = nCi - wij * factor_not_jtype; + fvec NijH = nHi - wij * factor_jtype; + fvec sum_pij = fvec::setzero(); + fvec sum_dpij_dN = fvec::setzero(); + fvec dN2[2]; + ivec offseti = ivec::mask_gather(ivec::setzero(), bvec::full(), vi, + ka->neigh_rebo.offset, sizeof(int)); + int buf_len = 0; + ivec knum = ivec::mask_gather(ivec::setzero(), bvec::full(), vi, + ka->neigh_rebo.num, sizeof(int)); + ivec kk = ivec::setzero(); + bvec active_mask = ivec::cmplt(kk, knum); + ivec c_i1 = ivec::set1(1); + fvec rho_j = fvec::set1(ka->params.rho[jtype][1]); + fvec rho_k0 = fvec::set1(ka->params.rho[0][1]); + fvec rho_k1 = fvec::set1(ka->params.rho[1][1]); + fvec c_4 = fvec::set1(4); + fvec c_2_0 = fvec::set1(2.0); + fvec c_m2_0 = fvec::set1(-2.0); + fvec c_4_0 = fvec::set1(4.0); + fvec c_0_5 = fvec::set1(0.5); + fvec c_m0_5 = fvec::set1(-0.5); + fvec c_1 = fvec::set1(1); + fvec c_m1 = fvec::set1(-1); + fvec factor_itype = itype ? c_1 : fvec::setzero(); + fvec rcmax0 = fvec::set1(ka->params.rcmax[itype][0]); + fvec rcmax1 = fvec::set1(ka->params.rcmax[itype][1]); + fvec rcmin0 = fvec::set1(ka->params.rcmin[itype][0]); + fvec rcmin1 = fvec::set1(ka->params.rcmin[itype][1]); + fvec result_f_i_x = fvec::setzero(); + fvec result_f_i_y = fvec::setzero(); + fvec result_f_i_z = fvec::setzero(); + fvec result_f_j_x = fvec::setzero(); + fvec result_f_j_y = fvec::setzero(); + fvec result_f_j_z = fvec::setzero(); + *sum_N = fvec::setzero(); + { + while (bvec::test_any_set(active_mask)) { + ivec k = ivec::mask_gather(ivec::setzero(), active_mask, kk + offseti, + ka->neigh_rebo.entries, sizeof(int)); + bvec excluded_mask = ivec::cmpeq(k, vj) & active_mask; + if (bvec::test_any_set(excluded_mask)) { + kk = ivec::mask_add(kk, excluded_mask, kk, c_i1); + active_mask = ivec::cmplt(kk, knum); + continue; + } + fvec x_k, y_k, z_k; + bvec ktype_mask; + aut_loadatoms_vec(x, k, &x_k, &y_k, &z_k, &ktype_mask, ka->map, map_i, + c_i1); + fvec rikx = x_i - x_k; + fvec riky = y_i - y_k; + fvec rikz = z_i - z_k; + fvec rikmag = fvec::sqrt(rikx * rikx + riky * riky + rikz * rikz); + fvec rho_k = fvec::mask_blend(ktype_mask, rho_k0, rho_k1); + fvec lamdajik = c_4 * factor_itype * ( rho_k - rikmag - ( rho_j - + rijmag)); + fvec ex_lam = fvec::exp(lamdajik); + fvec rcmax = fvec::mask_blend(ktype_mask, rcmax0, rcmax1); + fvec rcmin = fvec::mask_blend(ktype_mask, rcmin0, rcmin1); + fvec dwik; + fvec wik = aut_Sp_deriv(rikmag, rcmin, rcmax, &dwik); + fvec Nki = fvec::gather(k, nC, sizeof(flt_t)) + + fvec::gather(k, nH, sizeof(flt_t)) - wik; + fvec cosjik = (rijx * rikx + rijy * riky + rijz * rikz) / + ( rijmag * rikmag); + cosjik = fvec::min(c_1, fvec::max(c_m1, cosjik)); + fvec dgdc, dgdN; + fvec g = aut_mask_gSpline_pd_2(ka, active_mask, itype, cosjik, Nij, + &dgdc, &dgdN); + sum_pij = fvec::mask_add(sum_pij, active_mask, sum_pij, wik * g * ex_lam); + sum_dpij_dN = fvec::mask_add(sum_dpij_dN, active_mask, sum_dpij_dN, + wik * ex_lam * dgdN); + fvec dcutN; + fvec cutN = aut_Sp_deriv(Nki, Nmin, Nmax, &dcutN); + *sum_N = fvec::mask_add(*sum_N, active_mask, *sum_N, + fvec::mask_blend(ktype_mask, c_1, + fvec::setzero()) * wik * cutN); + if (buf_len == BUF_CAP) goto exceed_buffer; + data->rikx_buf[buf_len] = rikx; + data->riky_buf[buf_len] = riky; + data->rikz_buf[buf_len] = rikz; + data->rikmag_buf[buf_len] = rikmag; + data->cosjik_buf[buf_len] = cosjik; + data->ktype_buf[buf_len] = ktype_mask; + data->k_buf[buf_len] = k; + data->g_buf[buf_len] = g; + data->dgdc_buf[buf_len] = dgdc; + data->ex_lam_buf[buf_len] = ex_lam; + data->wik_buf[buf_len] = wik; + data->dwik_buf[buf_len] = dwik; + data->mask_buf[buf_len] = active_mask; + data->cutN_buf[buf_len] = cutN; + data->dcutN_buf[buf_len] = dcutN; + buf_len += 1; + kk = ivec::mask_add(kk, active_mask, kk, c_i1); + active_mask = ivec::cmplt(kk, knum); + } + data->buf_len = buf_len; + fvec PijS = aut_PijSpline(ka, itype, jtype, NijC, NijH, &dN2[0]); + fvec pij = fvec::invsqrt(c_1 + sum_pij + PijS); + fvec tmp = c_m0_5 * pij * pij * pij; + int buf_idx; + for (buf_idx = 0; buf_idx < buf_len; buf_idx++) { + fvec rikx = data->rikx_buf[buf_idx]; + fvec riky = data->riky_buf[buf_idx]; + fvec rikz = data->rikz_buf[buf_idx]; + fvec rikmag = data->rikmag_buf[buf_idx]; + fvec cosjik = data->cosjik_buf[buf_idx]; + bvec ktype_mask = data->ktype_buf[buf_idx]; + ivec k = data->k_buf[buf_idx]; + fvec g = data->g_buf[buf_idx]; + fvec dgdc = data->dgdc_buf[buf_idx]; + fvec ex_lam = data->ex_lam_buf[buf_idx]; + fvec wik = data->wik_buf[buf_idx]; + fvec dwik = data->dwik_buf[buf_idx]; + bvec mask = data->mask_buf[buf_idx]; + fvec invrikm = fvec::recip(rikmag); + fvec rjkx = rikx - rijx; + fvec rjky = riky - rijy; + fvec rjkz = rikz - rijz; + fvec rjkmag = fvec::sqrt( + rjkx * rjkx + rjky * rjky + rjkz * rjkz); + fvec rijrik = c_2_0 * rijmag * rikmag; + fvec rr = rijmag * rijmag - rikmag * rikmag; + fvec dctdjk = c_m2_0 / rijrik; + fvec dctdik = (rjkmag * rjkmag - rr) / ( rijrik * rikmag * rikmag); + fvec dctdij = (rjkmag * rjkmag + rr) / ( rijrik * rijmag * rijmag); + fvec fi[3], fj[3], fk[3]; + fvec pref = c_0_5 * VA * tmp; + fvec tmp20 = pref * wik * dgdc * ex_lam; + fj[0] = fj[1] = fj[2] = fvec::setzero(); + fvec tmpdik = tmp20 * dctdik; + fi[0] = fvec::setzero() - tmpdik * rikx; + fi[1] = fvec::setzero() - tmpdik * riky; + fi[2] = fvec::setzero() - tmpdik * rikz; + fk[0] = tmpdik * rikx; + fk[1] = tmpdik * riky; + fk[2] = tmpdik * rikz; + + fvec tmpdij = tmp20 * dctdij; + fij[0] = fvec::mask_sub(fij[0], mask, fij[0], tmpdij * rijx); + fij[1] = fvec::mask_sub(fij[1], mask, fij[1], tmpdij * rijy); + fij[2] = fvec::mask_sub(fij[2], mask, fij[2], tmpdij * rijz); + + fvec tmpdjk = tmp20 * dctdjk; + fi[0] = fi[0] - tmpdjk * rjkx; + fi[1] = fi[1] - tmpdjk * rjky; + fi[2] = fi[2] - tmpdjk * rjkz; + fk[0] = fk[0] + tmpdjk * rjkx; + fk[1] = fk[1] + tmpdjk * rjky; + fk[2] = fk[2] + tmpdjk * rjkz; + fij[0] = fvec::mask_add(fij[0], mask, fij[0], tmpdjk * rjkx); + fij[1] = fvec::mask_add(fij[1], mask, fij[1], tmpdjk * rjky); + fij[2] = fvec::mask_add(fij[2], mask, fij[2], tmpdjk * rjkz); + + if (itype) { + fvec tmp21 = pref * wik * g * ex_lam * c_4_0; + fvec tmp21ij = tmp21 * invrijm; + fij[0] = fvec::mask_sub(fij[0], mask, fij[0], tmp21ij * rijx); + fij[1] = fvec::mask_sub(fij[1], mask, fij[1], tmp21ij * rijy); + fij[2] = fvec::mask_sub(fij[2], mask, fij[2], tmp21ij * rijz); + fvec tmp21ik = tmp21 * invrikm; + fi[0] = fi[0] + tmp21ik * rikx; + fi[1] = fi[1] + tmp21ik * riky; + fi[2] = fi[2] + tmp21ik * rikz; + fk[0] = fk[0] - tmp21ik * rikx; + fk[1] = fk[1] - tmp21ik * riky; + fk[2] = fk[2] - tmp21ik * rikz; + } + + // coordination forces + + // dwik forces + fvec tmp22 = pref * dwik * g * ex_lam * invrikm; + fi[0] = fi[0] - tmp22 * rikx; + fi[1] = fi[1] - tmp22 * riky; + fi[2] = fi[2] - tmp22 * rikz; + fk[0] = fk[0] + tmp22 * rikx; + fk[1] = fk[1] + tmp22 * riky; + fk[2] = fk[2] + tmp22 * rikz; + + // PIJ forces + fvec dN2ktype = fvec::mask_blend(ktype_mask, dN2[0], dN2[1]); + fvec tmp23 = pref * dN2ktype * dwik * invrikm; + fi[0] = fi[0] - tmp23 * rikx; + fi[1] = fi[1] - tmp23 * riky; + fi[2] = fi[2] - tmp23 * rikz; + fk[0] = fk[0] + tmp23 * rikx; + fk[1] = fk[1] + tmp23 * riky; + fk[2] = fk[2] + tmp23 * rikz; + + // dgdN forces + fvec tmp24 = pref * sum_dpij_dN * dwik * invrikm; + fi[0] = fi[0] - tmp24 * rikx; + fi[1] = fi[1] - tmp24 * riky; + fi[2] = fi[2] - tmp24 * rikz; + fk[0] = fk[0] + tmp24 * rikx; + fk[1] = fk[1] + tmp24 * riky; + fk[2] = fk[2] + tmp24 * rikz; + + result_f_i_x = fvec::mask_add(result_f_i_x, mask, result_f_i_x, fi[0]); + result_f_i_y = fvec::mask_add(result_f_i_y, mask, result_f_i_y, fi[1]); + result_f_i_z = fvec::mask_add(result_f_i_z, mask, result_f_i_z, fi[2]); + result_f_j_x = fvec::mask_add(result_f_j_x, mask, result_f_j_x, fj[0]); + result_f_j_y = fvec::mask_add(result_f_j_y, mask, result_f_j_y, fj[1]); + result_f_j_z = fvec::mask_add(result_f_j_z, mask, result_f_j_z, fj[2]); + + data->force_k_x_buf[buf_idx] = fk[0]; + data->force_k_y_buf[buf_idx] = fk[1]; + data->force_k_z_buf[buf_idx] = fk[2]; + } + data->force_i_x = result_f_i_x; + data->force_i_y = result_f_i_y; + data->force_i_z = result_f_i_z; + data->force_j_x = result_f_j_x; + data->force_j_y = result_f_j_y; + data->force_j_z = result_f_j_z; + return pij; + } + exceed_buffer: + data->buf_len = -1; + return fvec::setzero(); +} + +/* + * Apply the force values stored iin aut_frebo_data to + * the respective neighbors. + */ +static void aut_frebo_data_writeback( + KernelArgsAIREBOT * _noalias ka, + struct aut_frebo_data * _noalias data) { + ResultForceT * _noalias result_f = ka->result_f; + flt_t fk_x_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fk_y_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fk_z_buf[fvec::VL] __attribute__((aligned(64))); + int fk_k_buf[ivec::VL] __attribute__((aligned(64))); + int buf_idx; + for (buf_idx = 0; buf_idx < data->buf_len; buf_idx++) { + ivec k = data->k_buf[buf_idx]; + bvec active_mask = data->mask_buf[buf_idx]; + + fvec::store(fk_x_buf, data->force_k_x_buf[buf_idx]); + fvec::store(fk_y_buf, data->force_k_y_buf[buf_idx]); + fvec::store(fk_z_buf, data->force_k_z_buf[buf_idx]); + ivec::store(fk_k_buf, k); + + int lane; + for (lane = 0; lane < fvec::VL; lane++) { + if (bvec::test_at(active_mask, lane)) {} else continue; + int kk = fk_k_buf[lane]; + result_f[kk].x += fk_x_buf[lane]; + result_f[kk].y += fk_y_buf[lane]; + result_f[kk].z += fk_z_buf[lane]; + } + } +} + +static void aut_frebo_N_spline_force( + KernelArgsAIREBOT * _noalias ka, + struct aut_frebo_data * _noalias data, int itype, int jtype, ivec vi, + ivec vj, fvec VA, fvec dN, fvec dNconj, fvec Nconj) { + ivec c_i1 = ivec::set1(1); + fvec c_2 = fvec::set1(2); + fvec c_TOL = fvec::set1(TOL); + ResultForceT * _noalias result_f = ka->result_f; + AtomAIREBOT * _noalias x = ka->x; + int * _noalias map = ka->map; + flt_t * _noalias nC = ka->nC; + flt_t * _noalias nH = ka->nH; + fvec x_i, y_i, z_i; + x_i = data->x_i; + y_i = data->y_i; + z_i = data->z_i; + fvec Nmin = fvec::set1(ka->params.Nmin); + fvec Nmax = fvec::set1(ka->params.Nmax); + int map_i_scalar = 0; + { + int i; + for (i = 1; i < ka->num_types; i++) { + if (ka->map[i]) + map_i_scalar |= (1 << i); + } + } + ivec map_i = ivec::set1(map_i_scalar); + fvec dN2[2]; + ivec kk = ivec::setzero(); + fvec rcmax0 = fvec::set1(ka->params.rcmax[itype][0]); + fvec rcmax1 = fvec::set1(ka->params.rcmax[itype][1]); + fvec rcmin0 = fvec::set1(ka->params.rcmin[itype][0]); + fvec rcmin1 = fvec::set1(ka->params.rcmin[itype][1]); + fvec result_f_i_x = fvec::setzero(); + fvec result_f_i_y = fvec::setzero(); + fvec result_f_i_z = fvec::setzero(); + int buf_idx; + for (buf_idx = 0; buf_idx < data->buf_len; buf_idx++) { + ivec k = data->k_buf[buf_idx]; + bvec active_mask = data->mask_buf[buf_idx]; + fvec rikx = data->rikx_buf[buf_idx]; + fvec riky = data->riky_buf[buf_idx]; + fvec rikz = data->rikz_buf[buf_idx]; + fvec rikmag = data->rikmag_buf[buf_idx]; + bvec ktype_mask = data->ktype_buf[buf_idx]; + + fvec dwik = data->dwik_buf[buf_idx]; + fvec wik = data->wik_buf[buf_idx]; + + fvec dNki = data->dcutN_buf[buf_idx]; + fvec SpN = data->cutN_buf[buf_idx]; + + fvec invrikmag = fvec::recip(rikmag); + fvec pref = VA * dwik * invrikmag; + fvec fdN = dN * pref; + fvec fdNconj = pref * SpN * c_2 * dNconj * Nconj; + fvec ffactor = fdN; + bvec ktype_is_C = ~ ktype_mask; + ffactor = fvec::mask_add(ffactor, ktype_is_C, ffactor, fdNconj); + + fvec fkx = ffactor * rikx; + fvec fky = ffactor * riky; + fvec fkz = ffactor * rikz; + + data->force_k_x_buf[buf_idx] = data->force_k_x_buf[buf_idx] + fkx; + data->force_k_y_buf[buf_idx] = data->force_k_y_buf[buf_idx] + fky; + data->force_k_z_buf[buf_idx] = data->force_k_z_buf[buf_idx] + fkz; + + result_f_i_x = fvec::mask_sub(result_f_i_x, active_mask, result_f_i_x, fkx); + result_f_i_y = fvec::mask_sub(result_f_i_y, active_mask, result_f_i_y, fky); + result_f_i_z = fvec::mask_sub(result_f_i_z, active_mask, result_f_i_z, fkz); + + bvec need_k_neighs = fvec::mask_cmpnle(active_mask, fvec::abs(dNki), c_TOL) + & ktype_is_C; + if (bvec::test_any_set(need_k_neighs)) { + int lane; + for (lane = 0; lane < fvec::VL; lane++) { + if (! bvec::test_at(need_k_neighs, lane)) continue; + int kk = ivec::at(k, lane); + int k = kk; + int ktype = map[x[k].w]; + int i = ivec::at(vi, lane); + fvec oldVA = VA; + double VA = fvec::at(oldVA, lane); + fvec oldwik = wik; + double wik = fvec::at(oldwik, lane); + fvec olddNconj = dNconj; + double dNconj = fvec::at(olddNconj, lane); + fvec oldNconj = Nconj; + double Nconj = fvec::at(oldNconj, lane); + fvec olddNki = dNki; + double dNki = fvec::at(olddNki, lane); + int * neighs_k = ka->neigh_rebo.entries + ka->neigh_rebo.offset[k]; + int nnum = ka->neigh_rebo.num[k]; + int nn; + for (nn = 0; nn < nnum; nn++) { + int n = neighs_k[nn]; + if (n == i) continue; + double rknx = x[k].x - x[n].x; + double rkny = x[k].y - x[n].y; + double rknz = x[k].z - x[n].z; + double rknmag = sqrt(rknx * rknx + rkny * rkny + rknz * rknz); + int ntype = map[x[n].w]; + double rcminkn = ka->params.rcmin[ktype][ntype]; + double rcmaxkn = ka->params.rcmax[ktype][ntype]; + double dwkn; + Sp(rknmag, rcminkn, rcmaxkn, &dwkn); + double ffactor = VA * dNconj * 2 * Nconj * wik * dNki * dwkn / rknmag; + result_f[k].x -= ffactor * rknx; + result_f[k].y -= ffactor * rkny; + result_f[k].z -= ffactor * rknz; + result_f[n].x += ffactor * rknx; + result_f[n].y += ffactor * rkny; + result_f[n].z += ffactor * rknz; + } + } + } + } + data->force_i_x = data->force_i_x + result_f_i_x; + data->force_i_y = data->force_i_y + result_f_i_y; + data->force_i_z = data->force_i_z + result_f_i_z; +} + +static fvec aut_frebo_pi_rc_pd(KernelArgsAIREBOT * ka, int itype, + int jtype, fvec Nij, fvec Nji, fvec Nijconj, + fvec * dN3) { + flt_t ret[fvec::VL] __attribute__((aligned(64))); + flt_t dN3ret[3][fvec::VL] __attribute__((aligned(64))); + int i; + for (i = 0; i < fvec::VL; i++) { + flt_t dN3tmp[3]; + ret[i] = frebo_pi_rc(ka, itype, jtype, fvec::at(Nij, i), fvec::at(Nji, i), + fvec::at(Nijconj, i), &dN3tmp[0]); + dN3ret[0][i] = dN3tmp[0]; + dN3ret[1][i] = dN3tmp[1]; + dN3ret[2][i] = dN3tmp[2]; + } + dN3[0] = fvec::load(&dN3ret[0][0]); + dN3[1] = fvec::load(&dN3ret[1][0]); + dN3[2] = fvec::load(&dN3ret[2][0]); + return fvec::load(&ret[0]); +} + +static fvec aut_frebo_Tij(KernelArgsAIREBOT * ka, int itype, + int jtype, fvec Nij, fvec Nji, fvec Nijconj, + fvec * dN3) { + flt_t ret[fvec::VL] __attribute__((aligned(64))); + flt_t dN3ret[3][fvec::VL] __attribute__((aligned(64))); + int i; + for (i = 0; i < fvec::VL; i++) { + flt_t dN3tmp[3]; + ret[i] = frebo_Tij(ka, itype, jtype, fvec::at(Nij, i), fvec::at(Nji, i), + fvec::at(Nijconj, i), &dN3tmp[0]); + dN3ret[0][i] = dN3tmp[0]; + dN3ret[1][i] = dN3tmp[1]; + dN3ret[2][i] = dN3tmp[2]; + } + dN3[0] = fvec::load(&dN3ret[0][0]); + dN3[1] = fvec::load(&dN3ret[1][0]); + dN3[2] = fvec::load(&dN3ret[2][0]); + return fvec::load(&ret[0]); +} + +static fvec aut_frebo_sum_omega( + KernelArgsAIREBOT * _noalias ka, + struct aut_frebo_data * _noalias i_data, + struct aut_frebo_data * _noalias j_data, + int itype, int jtype, + ivec vi, ivec vj, + fvec r23x, fvec r23y, fvec r23z, fvec r23mag, + fvec VA, fvec fij[3] +) { + fvec c_1 = fvec::set1(1); + fvec c_m1 = fvec::set1(-1); + fvec c_2 = fvec::set1(2); + fvec c_m2 = fvec::set1(-2); + fvec sum_omega = fvec::setzero(); + fvec thmin = fvec::set1(ka->params.thmin); + fvec thmax = fvec::set1(ka->params.thmax); + // 2 == i, 3 == j + fvec r32x = fvec::setzero() - r23x; + fvec r32y = fvec::setzero() - r23y; + fvec r32z = fvec::setzero() - r23z; + int buf_idx_i, buf_idx_j; + for (buf_idx_i = 0; buf_idx_i < i_data->buf_len; buf_idx_i++) { + // a1 == k == buf_idx_i + bvec mask_start = i_data->mask_buf[buf_idx_i]; + fvec r21x = i_data->rikx_buf[buf_idx_i]; // a2 - a1 -> i - k + fvec r21y = i_data->riky_buf[buf_idx_i]; // a2 - a1 -> i - k + fvec r21z = i_data->rikz_buf[buf_idx_i]; // a2 - a1 -> i - k + fvec r21mag = i_data->rikmag_buf[buf_idx_i]; + // TODO use buffered cosjik + fvec cos321 = ( + r23x * r21x + r23y * r21y + r23z * r21z) / ( r23mag * r21mag); + cos321 = fvec::min(c_1, fvec::max(c_m1, cos321)); + fvec sin321 = fvec::sqrt(c_1 - cos321 * cos321); + bvec mask_outer = fvec::cmpneq(fvec::setzero(), sin321) & mask_start; + // add "continue" + fvec sink2i = fvec::mask_recip(fvec::undefined(), mask_outer, + sin321 * sin321); + fvec rik2i = fvec::mask_recip(fvec::undefined(), mask_outer, + r21mag * r21mag); + fvec rr = r23mag * r23mag - r21mag * r21mag; + fvec r31x = r21x - r23x; + fvec r31y = r21y - r23y; + fvec r31z = r21z - r23z; + fvec r31mag2 = r31x * r31x + r31y * r31y + r31z * r31z; + fvec rijrik = c_2 * r23mag * r21mag; + fvec r21mag2 = r21mag * r21mag; + fvec dctik = fvec::mask_div(fvec::undefined(), mask_outer, r31mag2 - rr, + rijrik * r21mag2); + fvec dctij = fvec::mask_div(fvec::undefined(), mask_outer, r31mag2 + rr, + rijrik * r23mag * r23mag); + fvec dctjk = fvec::mask_div(fvec::undefined(), mask_outer, c_m2, rijrik); + fvec dw21 = i_data->dwik_buf[buf_idx_i]; + fvec w21 = i_data->wik_buf[buf_idx_i]; + fvec dtsjik; + fvec tspjik = aut_Sp2_deriv(cos321, thmin, thmax, &dtsjik); + dtsjik = fvec::setzero() - dtsjik; // todo replace by appropriate xor. + ivec k = i_data->k_buf[buf_idx_i]; + for (buf_idx_j = 0; buf_idx_j < j_data->buf_len; buf_idx_j++) { + // check l == k in second loop. + // l == a4 == buf_idx_j + ivec l = j_data->k_buf[buf_idx_j]; + bvec mask_inner_0 = ivec::mask_cmpneq(mask_outer, k, l) & + j_data->mask_buf[buf_idx_j]; + // add "continue" + fvec r34x = j_data->rikx_buf[buf_idx_j]; + fvec r34y = j_data->riky_buf[buf_idx_j]; + fvec r34z = j_data->rikz_buf[buf_idx_j]; + fvec r34mag = j_data->rikmag_buf[buf_idx_j]; + fvec cos234 = fvec::mask_div(fvec::undefined(), mask_inner_0, + r32x * r34x + r32y * r34y + r32z * r34z, + r23mag * r34mag); + cos234 = fvec::min(c_1, fvec::max(c_m1, cos234)); + fvec sin234 = fvec::mask_sqrt(fvec::undefined(), mask_inner_0, + c_1 - cos234 * cos234); + bvec mask_inner_1 = fvec::mask_cmpneq(mask_inner_0, sin234, + fvec::setzero()); + // add "continue" + fvec sinl2i = fvec::mask_recip(fvec::undefined(), mask_inner_1, + sin234 * sin234); + fvec rjl2i = fvec::mask_recip(fvec::undefined(), mask_inner_1, + r34mag * r34mag); + fvec dw34 = j_data->dwik_buf[buf_idx_j]; + fvec w34 = j_data->wik_buf[buf_idx_j]; + fvec rr = r23mag * r23mag - r34mag * r34mag; + fvec r24x = r23x + r34x; + fvec r24y = r23y + r34y; + fvec r24z = r23z + r34z; + fvec r242 = r24x * r24x + r24y * r24y + r24z * r24z; + fvec rijrjl = c_2 * r23mag * r34mag; + fvec rjl2 = r34mag * r34mag; + fvec dctjl = fvec::mask_div(fvec::undefined(), mask_inner_1, r242 - rr, + rijrjl * rjl2); + fvec dctji = fvec::mask_div(fvec::undefined(), mask_inner_1, r242 + rr, + rijrjl * r23mag * r23mag); + fvec dctil = fvec::mask_div(fvec::undefined(), mask_inner_1, c_m2, + rijrjl); + fvec dtsijl; + fvec tspijl = aut_Sp2_deriv(cos234, thmin, thmax, &dtsijl); + dtsijl = fvec::setzero() - dtsijl; + fvec prefactor = VA; + + fvec cross321x = r32y * r21z - r32z * r21y; + fvec cross321y = r32z * r21x - r32x * r21z; + fvec cross321z = r32x * r21y - r32y * r21x; + fvec cross234x = r23y * r34z - r23z * r34y; + fvec cross234y = r23z * r34x - r23x * r34z; + fvec cross234z = r23x * r34y - r23y * r34x; + + fvec cwnum = cross321x * cross234x + cross321y * cross234y + cross321z * + cross234z; + fvec cwnom = r21mag * r34mag * r23mag * r23mag * sin321 * sin234; + fvec om1234 = fvec::mask_div(fvec::undefined(), mask_inner_1, cwnum, + cwnom); + fvec cw = om1234; + fvec sum_omega_contrib = (c_1 - om1234 * om1234) * w21 * w34 * + (c_1 - tspjik) * ( c_1 - tspijl); + sum_omega = fvec::mask_add(sum_omega, mask_inner_1, sum_omega, + sum_omega_contrib); + fvec dt1dik = rik2i - dctik * sink2i * cos321; + fvec dt1djk = fvec::setzero() - dctjk * sink2i * cos321; + fvec dt1djl = rjl2i - dctjl * sinl2i * cos234; + fvec dt1dil = fvec::setzero() - dctil * sinl2i * cos234; + fvec dt1dij = fvec::mask_div(fvec::undefined(), mask_inner_1, c_2, + r23mag * r23mag) - + dctij * sink2i * cos321 - dctji * sinl2i * cos234; + + fvec dt2dikx = r23y * cross234z - r23z * cross234y; + fvec dt2diky = r23z * cross234x - r23x * cross234z; + fvec dt2dikz = r23x * cross234y - r23y * cross234x; + + fvec dt2djlx = r23z * cross321y - r23y * cross321z; + fvec dt2djly = r23x * cross321z - r23z * cross321x; + fvec dt2djlz = r23y * cross321x - r23x * cross321y; + + fvec dt2dijx = r21z * cross234y + r34y * cross321z - + ( r34z * cross321y + r21y * cross234z); + fvec dt2dijy = r21x * cross234z + r34z * cross321x - + ( r34x * cross321z + r21z * cross234x); + fvec dt2dijz = r21y * cross234x + r34x * cross321y - + ( r34y * cross321x + r21x * cross234y); + + fvec aa = prefactor * c_2 * fvec::mask_div(fvec::undefined(), + mask_inner_1, cw, cwnom) * + w21 * w34 * (c_1 - tspjik) * ( c_1 - tspijl); + fvec aaa1 = (fvec::setzero() - prefactor) * (c_1 - om1234 * om1234) * + (c_1 - tspjik) * (c_1 - tspijl); + fvec aaa2 = (fvec::setzero() - prefactor) * (c_1 - om1234 * om1234) * + w21 * w34; + fvec at2 = aa * cwnum; + + fvec fcijpc = aaa2 * dtsjik * dctij * (c_1 - tspijl) + aaa2 * dtsijl * + dctji * (c_1 - tspjik) - dt1dij * at2; + fvec fcikpc = aaa2 * dtsjik * dctik * (c_1 - tspijl) - dt1dik * at2; + fvec fcjlpc = aaa2 * dtsijl * dctjl * (c_1 - tspjik) - dt1djl * at2; + fvec fcjkpc = aaa2 * dtsjik * dctjk * (c_1 - tspijl) - dt1djk * at2; + fvec fcilpc = aaa2 * dtsijl * dctil * (c_1 - tspjik) - dt1dil * at2; + + fvec F23x = fcijpc * r23x + aa * dt2dijx; + fvec F23y = fcijpc * r23y + aa * dt2dijy; + fvec F23z = fcijpc * r23z + aa * dt2dijz; + + fvec F12x = fcikpc * r21x + aa * dt2dikx; + fvec F12y = fcikpc * r21y + aa * dt2diky; + fvec F12z = fcikpc * r21z + aa * dt2dikz; + + fvec F34x = fcjlpc * r34x + aa * dt2djlx; + fvec F34y = fcjlpc * r34y + aa * dt2djly; + fvec F34z = fcjlpc * r34z + aa * dt2djlz; + + fvec F31x = fcjkpc * r31x; + fvec F31y = fcjkpc * r31y; + fvec F31z = fcjkpc * r31z; + + fvec F24x = fcilpc * r24x; + fvec F24y = fcilpc * r24y; + fvec F24z = fcilpc * r24z; + + fvec f1x = fvec::setzero() - ( F12x + F31x); + fvec f1y = fvec::setzero() - ( F12y + F31y); + fvec f1z = fvec::setzero() - ( F12z + F31z); + fvec f2x = F12x + F31x; + fvec f2y = F12y + F31y; + fvec f2z = F12z + F31z; + fvec f3x = F34x + F24x; + fvec f3y = F34y + F24y; + fvec f3z = F34z + F24z; + fvec f4x = fvec::setzero() - ( F34x + F24x); + fvec f4y = fvec::setzero() - ( F34y + F24y); + fvec f4z = fvec::setzero() - ( F34z + F24z); + + fij[0] = fvec::mask_add(fij[0], mask_inner_1, fij[0], + F23x + F24x - F31x); + fij[1] = fvec::mask_add(fij[1], mask_inner_1, fij[1], + F23y + F24y - F31y); + fij[2] = fvec::mask_add(fij[2], mask_inner_1, fij[2], + F23z + F24z - F31z); + + fvec tmp20 = VA * (c_1 - om1234 * om1234) * (c_1 - tspjik) * + (c_1 - tspijl) * dw21 * w34 * fvec::mask_recip(fvec::undefined(), + mask_inner_1, r21mag); + f2x = f2x - tmp20 * r21x; + f2y = f2y - tmp20 * r21y; + f2z = f2z - tmp20 * r21z; + f1x = f1x + tmp20 * r21x; + f1y = f1y + tmp20 * r21y; + f1z = f1z + tmp20 * r21z; + + fvec tmp21 = VA * (c_1 - om1234 * om1234) * (c_1 - tspjik) * + (c_1 - tspijl) * w21 * dw34 * fvec::mask_recip(fvec::undefined(), + mask_inner_1, r34mag); + f3x = f3x - tmp21 * r34x; + f3y = f3y - tmp21 * r34y; + f3z = f3z - tmp21 * r34z; + f4x = f4x + tmp21 * r34x; + f4y = f4y + tmp21 * r34y; + f4z = f4z + tmp21 * r34z; + + // 1 == buf_idx_i, 2 == i, 3 == j, 4 == buf_idx_j + i_data->force_k_x_buf[buf_idx_i] = + fvec::mask_add(i_data->force_k_x_buf[buf_idx_i], + mask_inner_1, i_data->force_k_x_buf[buf_idx_i], f1x); + i_data->force_k_y_buf[buf_idx_i] = + fvec::mask_add(i_data->force_k_y_buf[buf_idx_i], mask_inner_1, + i_data->force_k_y_buf[buf_idx_i], f1y); + i_data->force_k_z_buf[buf_idx_i] = + fvec::mask_add(i_data->force_k_z_buf[buf_idx_i], mask_inner_1, + i_data->force_k_z_buf[buf_idx_i], f1z); + i_data->force_i_x = + fvec::mask_add(i_data->force_i_x, mask_inner_1, i_data->force_i_x, f2x); + i_data->force_i_y = + fvec::mask_add(i_data->force_i_y, mask_inner_1, i_data->force_i_y, f2y); + i_data->force_i_z = + fvec::mask_add(i_data->force_i_z, mask_inner_1, i_data->force_i_z, f2z); + j_data->force_i_x = + fvec::mask_add(j_data->force_i_x, mask_inner_1, j_data->force_i_x, f3x); + j_data->force_i_y = + fvec::mask_add(j_data->force_i_y, mask_inner_1, j_data->force_i_y, f3y); + j_data->force_i_z = + fvec::mask_add(j_data->force_i_z, mask_inner_1, j_data->force_i_z, f3z); + j_data->force_k_x_buf[buf_idx_j] = + fvec::mask_add(j_data->force_k_x_buf[buf_idx_j], mask_inner_1, + j_data->force_k_x_buf[buf_idx_j], f4x); + j_data->force_k_y_buf[buf_idx_j] = + fvec::mask_add(j_data->force_k_y_buf[buf_idx_j], mask_inner_1, + j_data->force_k_y_buf[buf_idx_j], f4y); + j_data->force_k_z_buf[buf_idx_j] = + fvec::mask_add(j_data->force_k_z_buf[buf_idx_j], mask_inner_1, + j_data->force_k_z_buf[buf_idx_j], f4z); + } + } + return sum_omega; +} + +static fvec aut_frebo_pi_dh( + KernelArgsAIREBOT * _noalias ka, + struct aut_frebo_data * _noalias i_data, + struct aut_frebo_data * _noalias j_data, + int itype, int jtype, ivec vi, ivec vj, + fvec r23x, fvec r23y, fvec r23z, fvec r23mag, + fvec VA, + fvec Nij, fvec Nji, fvec Nijconj, fvec NconjtmpI, fvec NconjtmpJ, + fvec fij[3] +) { + fvec c_TOL = fvec::set1(TOL); + fvec dN3[3]; + fvec Tij = aut_frebo_Tij(ka, itype, jtype, Nij, Nji, Nijconj, &dN3[0]); + bvec TijgtTOLmask = fvec::cmpnle(fvec::abs(Tij), c_TOL); + fvec sum_omega = fvec::setzero(); + if (bvec::test_any_set(TijgtTOLmask)) { + sum_omega = aut_frebo_sum_omega( + ka, i_data, j_data, itype, jtype, vi, vj, + r23x, r23y, r23z, r23mag, VA * Tij, fij); + sum_omega = fvec::mask_blend(TijgtTOLmask, fvec::setzero(), sum_omega); + aut_frebo_N_spline_force(ka, i_data, itype, jtype, vi, vj, VA * sum_omega, + dN3[0], dN3[2], NconjtmpI); + aut_frebo_N_spline_force(ka, j_data, jtype, itype, vj, vi, VA * sum_omega, + dN3[1], dN3[2], NconjtmpJ); + } + return Tij * sum_omega; +} + +/* + We can reuse the aut_frebo_data buffers here to do this calculation very + cheaply. +*/ +static void aut_torsion_vec( + KernelArgsAIREBOT * ka, + struct aut_frebo_data * i_data, + struct aut_frebo_data * j_data, + ivec i, ivec j, fvec wij, fvec dwij +) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + flt_t (*epsilonT)[2] = ka->params.epsilonT; + fvec epsilonT00 = fvec::set1(epsilonT[0][0]); + fvec epsilonT01 = fvec::set1(epsilonT[0][1]); + fvec epsilonT10 = fvec::set1(epsilonT[1][0]); + fvec epsilonT11 = fvec::set1(epsilonT[1][1]); + fvec thmin = fvec::set1(ka->params.thmin); + fvec thmax = fvec::set1(ka->params.thmax); + + const fvec c_1_0 = fvec::set1(1.0); + const fvec c_0_5 = fvec::set1(0.5); + const fvec c_0_1 = fvec::set1(0.1); + const fvec c_2_0 = fvec::set1(2.0); + const fvec c_2_5 = fvec::set1(2.5); + const fvec c_256_405 = fvec::set1(256.0/405.0); + + fvec del32x = j_data->x_i - i_data->x_i; + fvec del32y = j_data->y_i - i_data->y_i; + fvec del32z = j_data->z_i - i_data->z_i; + fvec rsq = del32x * del32x + del32y * del32y + del32z * del32z; + fvec r32 = fvec::sqrt(rsq); + fvec del23x = fvec::setzero() - del32x; + fvec del23y = fvec::setzero() - del32y; + fvec del23z = fvec::setzero() - del32z; + fvec r23 = r32; + fvec w23 = wij; + fvec dw23 = dwij; + + for (int buf_idx_i = 0; buf_idx_i < i_data->buf_len; buf_idx_i++) { + bvec mask_start = i_data->mask_buf[buf_idx_i]; + fvec del21x = i_data->rikx_buf[buf_idx_i]; // a2 - a1 -> i - k + fvec del21y = i_data->riky_buf[buf_idx_i]; // a2 - a1 -> i - k + fvec del21z = i_data->rikz_buf[buf_idx_i]; // a2 - a1 -> i - k + fvec r21 = i_data->rikmag_buf[buf_idx_i]; + fvec cos321 = i_data->cosjik_buf[buf_idx_i]; + fvec sin321 = fvec::sqrt(c_1_0 - cos321 * cos321); + // strictly equivalent to sin321 < TOL + mask_start = fvec::mask_cmpneq(mask_start, fvec::setzero(), sin321); + if (! bvec::test_any_set(mask_start)) continue; + + fvec deljkx = del21x - del23x; + fvec deljky = del21y - del23y; + fvec deljkz = del21z - del23z; + fvec rjk2 = deljkx * deljkx + deljky * deljky + deljkz * deljkz; + fvec rjk = fvec::sqrt(rjk2); + fvec rik2 = r21 * r21; + fvec w21 = i_data->wik_buf[buf_idx_i]; + fvec dw21 = i_data->dwik_buf[buf_idx_i]; + + fvec rij = r32; + fvec rik = r21; + fvec rij2 = r32 * r32; + fvec dtsjik; + fvec tspjik = aut_Sp2_deriv(cos321, thmin, thmax, &dtsjik); + dtsjik = fvec::setzero() - dtsjik; + + bvec ktype_mask = i_data->ktype_buf[buf_idx_i]; + fvec epsilonT0 = fvec::mask_blend(ktype_mask, epsilonT00, epsilonT10); + fvec epsilonT1 = fvec::mask_blend(ktype_mask, epsilonT01, epsilonT11); + + ivec k = i_data->k_buf[buf_idx_i]; + for (int buf_idx_j = 0; buf_idx_j < j_data->buf_len; buf_idx_j++) { + ivec l = j_data->k_buf[buf_idx_j]; + bvec mask_inner_0 = ivec::mask_cmpneq(mask_start, k, l) & + j_data->mask_buf[buf_idx_j]; + if (! bvec::test_any_set(mask_inner_0)) continue; + fvec del34x = j_data->rikx_buf[buf_idx_j]; + fvec del34y = j_data->riky_buf[buf_idx_j]; + fvec del34z = j_data->rikz_buf[buf_idx_j]; + fvec r34 = j_data->rikmag_buf[buf_idx_j]; + bvec ltype_mask = j_data->ktype_buf[buf_idx_j]; + fvec cos234 = j_data->cosjik_buf[buf_idx_j]; + fvec sin234 = fvec::sqrt(c_1_0 - cos234 * cos234); + // strictly equivalent to sin234 < TOL + mask_inner_0 = fvec::mask_cmpneq(mask_inner_0, sin234, fvec::setzero()); + if (! bvec::test_any_set(mask_inner_0)) continue; + fvec dw34 = j_data->dwik_buf[buf_idx_j]; + fvec w34 = j_data->wik_buf[buf_idx_j]; + fvec delilx = del23x + del34x; + fvec delily = del23y + del34y; + fvec delilz = del23z + del34z; + fvec ril2 = delilx * delilx + delily * delily + delilz * delilz; + fvec ril = fvec::sqrt(ril2); + fvec rjl2 = r34 * r34; + + fvec rjl = r34; + fvec dtsijl; + fvec tspijl = aut_Sp2_deriv(cos234, thmin, thmax, &dtsijl); + dtsijl = fvec::setzero() - dtsijl; + fvec cross321x = del32y * del21z - del32z * del21y; + fvec cross321y = del32z * del21x - del32x * del21z; + fvec cross321z = del32x * del21y - del32y * del21x; + fvec cross321mag = fvec::sqrt(cross321x * cross321x + + cross321y * cross321y + + cross321z * cross321z); + fvec cross234x = del23y * del34z - del23z * del34y; + fvec cross234y = del23z * del34x - del23x * del34z; + fvec cross234z = del23x * del34y - del23y * del34x; + fvec cross234mag = fvec::sqrt(cross234x * cross234x + + cross234y * cross234y + + cross234z * cross234z); + fvec cwnum = cross321x * cross234x + cross321y * cross234y + + cross321z * cross234z; + fvec cwnom = r21 * r34 * r32 * r32 * sin321 * sin234; + fvec cw = cwnum / cwnom; + + fvec cw2 = c_0_5 * ( c_1_0 - cw); + fvec ekijl = fvec::mask_blend(ltype_mask, epsilonT0, epsilonT1); + fvec Ec = c_256_405 * ekijl; + fvec cw2_5 = cw2 * cw2 * cw2 * cw2 * cw2; + fvec Vtors = Ec * cw2_5 - ekijl * c_0_1; + + fvec evdwl = Vtors * w21 * w23 * w34 * (c_1_0-tspjik) * (c_1_0-tspijl); + ka->result_eng += fvec::mask_reduce_add(mask_inner_0, evdwl); + + fvec dndijx = cross234y * del21z - cross234z * del21y; + fvec dndijy = cross234z * del21x - cross234x * del21z; + fvec dndijz = cross234x * del21y - cross234y * del21x; + + fvec tmpvecx = del34y * cross321z - del34z * cross321y; + fvec tmpvecy = del34z * cross321x - del34x * cross321z; + fvec tmpvecz = del34x * cross321y - del34y * cross321x; + + dndijx = dndijx + tmpvecx; + dndijy = dndijy + tmpvecy; + dndijz = dndijz + tmpvecz; + + fvec dndikx = del23y * cross234z - del23z * cross234y; + fvec dndiky = del23z * cross234x - del23x * cross234z; + fvec dndikz = del23x * cross234y - del23y * cross234x; + + fvec dndjlx = cross321y * del23z - cross321z * del23y; + fvec dndjly = cross321z * del23x - cross321x * del23z; + fvec dndjlz = cross321x * del23y - cross321y * del23x; + + fvec r23sq = r23 * r23; + fvec r21sq = r21 * r21; + fvec r34sq = r34 * r34; + fvec rjksq = rjk * rjk; + fvec rilsq = ril * ril; + fvec dcidij = (r23sq - r21sq + rjksq) / ( c_2_0 * r23sq * r21); + fvec dcidik = (r21sq - r23sq + rjksq) / ( c_2_0 * r21sq * r23); + fvec dcidjk = fvec::setzero() - rjk / ( r23 * r21); + fvec dcjdji = (r23sq - r34sq + rilsq) / ( c_2_0 * r23sq * r34); + fvec dcjdjl = (r34sq - r23sq + rilsq) / ( c_2_0 * r34sq * r23); + fvec dcjdil = fvec::setzero() - ril / ( r23 * r34); + + fvec dsidij = fvec::setzero() - cos321 / sin321 * dcidij; + fvec dsidik = fvec::setzero() - cos321 / sin321 * dcidik; + fvec dsidjk = fvec::setzero() - cos321 / sin321 * dcidjk; + + fvec dsjdji = fvec::setzero() - cos234 / sin234 * dcjdji; + fvec dsjdjl = fvec::setzero() - cos234 / sin234 * dcjdjl; + fvec dsjdil = fvec::setzero() - cos234 / sin234 * dcjdil; + + fvec dxidij = r21 * sin321 + r23 * r21 * dsidij; + fvec dxidik = r23 * sin321 + r23 * r21 * dsidik; + fvec dxidjk = r23 * r21 * dsidjk; + + fvec dxjdji = r34 * sin234 + r23 * r34 * dsjdji; + fvec dxjdjl = r23 * sin234 + r23 * r34 * dsjdjl; + fvec dxjdil = r23 * r34 * dsjdil; + + fvec ddndij = dxidij * cross234mag + cross321mag * dxjdji; + fvec ddndik = dxidik * cross234mag; + fvec ddndjk = dxidjk * cross234mag; + fvec ddndjl = cross321mag * dxjdjl; + fvec ddndil = cross321mag * dxjdil; + fvec dcwddn = fvec::setzero() - cwnum / ( cwnom * cwnom); + fvec dcwdn = fvec::recip(cwnom); + fvec cw2_4 = cw2 * cw2 * cw2 * cw2; + fvec dvpdcw = c_2_5 * Ec * cw2_4 * w23 * w21 * w34 * (c_1_0 - tspjik) * + (c_1_0 - tspijl); + + fvec Ftmpx = dvpdcw * (dcwdn * dndijx + dcwddn * ddndij * del23x / r23); + fvec Ftmpy = dvpdcw * (dcwdn * dndijy + dcwddn * ddndij * del23y / r23); + fvec Ftmpz = dvpdcw * (dcwdn * dndijz + dcwddn * ddndij * del23z / r23); + fvec fix = Ftmpx; + fvec fiy = Ftmpy; + fvec fiz = Ftmpz; + fvec fjx = fvec::setzero() - Ftmpx; + fvec fjy = fvec::setzero() - Ftmpy; + fvec fjz = fvec::setzero() - Ftmpz; + + Ftmpx = dvpdcw * (dcwdn * dndikx + dcwddn * ddndik * del21x / r21); + Ftmpy = dvpdcw * (dcwdn * dndiky + dcwddn * ddndik * del21y / r21); + Ftmpz = dvpdcw * (dcwdn * dndikz + dcwddn * ddndik * del21z / r21); + fix = fix + Ftmpx; + fiy = fiy + Ftmpy; + fiz = fiz + Ftmpz; + fvec fkx = fvec::setzero() - Ftmpx; + fvec fky = fvec::setzero() - Ftmpy; + fvec fkz = fvec::setzero() - Ftmpz; + + Ftmpx = dvpdcw * dcwddn * ddndjk * deljkx / rjk; + Ftmpy = dvpdcw * dcwddn * ddndjk * deljky / rjk; + Ftmpz = dvpdcw * dcwddn * ddndjk * deljkz / rjk; + fjx = fjx + Ftmpx; + fjy = fjy + Ftmpy; + fjz = fjz + Ftmpz; + fkx = fkx - Ftmpx; + fky = fky - Ftmpy; + fkz = fkz - Ftmpz; + + Ftmpx = dvpdcw * (dcwdn * dndjlx + dcwddn * ddndjl * del34x / r34); + Ftmpy = dvpdcw * (dcwdn * dndjly + dcwddn * ddndjl * del34y / r34); + Ftmpz = dvpdcw * (dcwdn * dndjlz + dcwddn * ddndjl * del34z / r34); + fjx = fjx + Ftmpx; + fjy = fjy + Ftmpy; + fjz = fjz + Ftmpz; + fvec flx = fvec::setzero() - Ftmpx; + fvec fly = fvec::setzero() - Ftmpy; + fvec flz = fvec::setzero() - Ftmpz; + + Ftmpx = dvpdcw * dcwddn * ddndil * delilx / ril; + Ftmpy = dvpdcw * dcwddn * ddndil * delily / ril; + Ftmpz = dvpdcw * dcwddn * ddndil * delilz / ril; + fix = fix + Ftmpx; + fiy = fiy + Ftmpy; + fiz = fiz + Ftmpz; + flx = flx - Ftmpx; + fly = fly - Ftmpy; + flz = flz - Ftmpz; + + // coordination forces + + fvec fpair = Vtors * dw21 * w23 * w34 * (c_1_0 - tspjik) * + (c_1_0 - tspijl) / r21; + fix = fix - del21x * fpair; + fiy = fiy - del21y * fpair; + fiz = fiz - del21z * fpair; + fkx = fkx + del21x * fpair; + fky = fky + del21y * fpair; + fkz = fkz + del21z * fpair; + + fpair = Vtors * w21 * dw23 * w34 * (c_1_0 - tspjik) * (c_1_0 - tspijl) / + r23; + fix = fix - del23x * fpair; + fiy = fiy - del23y * fpair; + fiz = fiz - del23z * fpair; + fjx = fjx + del23x * fpair; + fjy = fjy + del23y * fpair; + fjz = fjz + del23z * fpair; + + fpair = Vtors * w21 * w23 * dw34 * (c_1_0 - tspjik) * (c_1_0 - tspijl) / + r34; + fjx = fjx - del34x * fpair; + fjy = fjy - del34y * fpair; + fjz = fjz - del34z * fpair; + flx = flx + del34x * fpair; + fly = fly + del34y * fpair; + flz = flz + del34z * fpair; + + // additional cut off function forces + + fvec fcpc = fvec::setzero() - Vtors * w21 * w23 * w34 * dtsjik * (c_1_0 - + tspijl); + fpair = fcpc * dcidij / rij; + fix = fix + fpair * del23x; + fiy = fiy + fpair * del23y; + fiz = fiz + fpair * del23z; + fjx = fjx - fpair * del23x; + fjy = fjy - fpair * del23y; + fjz = fjz - fpair * del23z; + + fpair = fcpc * dcidik / rik; + fix = fix + fpair * del21x; + fiy = fiy + fpair * del21y; + fiz = fiz + fpair * del21z; + fkx = fkx - fpair * del21x; + fky = fky - fpair * del21y; + fkz = fkz - fpair * del21z; + + fpair = fcpc * dcidjk / rjk; + fjx = fjx + fpair * deljkx; + fjy = fjy + fpair * deljky; + fjz = fjz + fpair * deljkz; + fkx = fkx - fpair * deljkx; + fky = fky - fpair * deljky; + fkz = fkz - fpair * deljkz; + + fcpc = fvec::setzero() - Vtors * w21 * w23 * w34 * (c_1_0 - tspjik) * + dtsijl; + fpair = fcpc * dcjdji / rij; + fix = fix + fpair * del23x; + fiy = fiy + fpair * del23y; + fiz = fiz + fpair * del23z; + fjx = fjx - fpair * del23x; + fjy = fjy - fpair * del23y; + fjz = fjz - fpair * del23z; + + fpair = fcpc * dcjdjl / rjl; + fjx = fjx + fpair * del34x; + fjy = fjy + fpair * del34y; + fjz = fjz + fpair * del34z; + flx = flx - fpair * del34x; + fly = fly - fpair * del34y; + flz = flz - fpair * del34z; + + fpair = fcpc * dcjdil / ril; + fix = fix + fpair * delilx; + fiy = fiy + fpair * delily; + fiz = fiz + fpair * delilz; + flx = flx - fpair * delilx; + fly = fly - fpair * delily; + flz = flz - fpair * delilz; + + // sum per-atom forces into atom force array + + i_data->force_i_x = fvec::mask_add(i_data->force_i_x, mask_inner_0, + i_data->force_i_x, fix); + i_data->force_i_y = fvec::mask_add(i_data->force_i_y, mask_inner_0, + i_data->force_i_y, fiy); + i_data->force_i_z = fvec::mask_add(i_data->force_i_z, mask_inner_0, + i_data->force_i_z, fiz); + i_data->force_j_x = fvec::mask_add(i_data->force_j_x, mask_inner_0, + i_data->force_j_x, fjx); + i_data->force_j_y = fvec::mask_add(i_data->force_j_y, mask_inner_0, + i_data->force_j_y, fjy); + i_data->force_j_z = fvec::mask_add(i_data->force_j_z, mask_inner_0, + i_data->force_j_z, fjz); + i_data->force_k_x_buf[buf_idx_i] = + fvec::mask_add(i_data->force_k_x_buf[buf_idx_i], mask_inner_0, + i_data->force_k_x_buf[buf_idx_i], fkx); + i_data->force_k_y_buf[buf_idx_i] = + fvec::mask_add(i_data->force_k_y_buf[buf_idx_i], mask_inner_0, + i_data->force_k_y_buf[buf_idx_i], fky); + i_data->force_k_z_buf[buf_idx_i] = + fvec::mask_add(i_data->force_k_z_buf[buf_idx_i], mask_inner_0, + i_data->force_k_z_buf[buf_idx_i], fkz); + j_data->force_k_x_buf[buf_idx_j] = + fvec::mask_add(j_data->force_k_x_buf[buf_idx_j], mask_inner_0, + j_data->force_k_x_buf[buf_idx_j], flx); + j_data->force_k_y_buf[buf_idx_j] = + fvec::mask_add(j_data->force_k_y_buf[buf_idx_j], mask_inner_0, + j_data->force_k_y_buf[buf_idx_j], fly); + j_data->force_k_z_buf[buf_idx_j] = + fvec::mask_add(j_data->force_k_z_buf[buf_idx_j], mask_inner_0, + j_data->force_k_z_buf[buf_idx_j], flz); + } + } +} + +/* + * Processes VL elements of the same type itype/jtype for REBO and TORSION + * interactions. This allows us to reuse the aut_frebo_data buffes in the + * torsion calculaltion. + */ +static void aut_frebo_batch_of_kind(KernelArgsAIREBOT * ka, + int torflag, int itype, int jtype, + int * i_buf, int * j_buf) { + { // jump-scope for exceed_limits + AtomAIREBOT * x = ka->x; + int * map = ka->map; + ResultForceT * result_f = ka->result_f; + flt_t rcminij = ka->params.rcmin[itype][jtype]; + flt_t rcmaxij = ka->params.rcmax[itype][jtype]; + flt_t Qij = ka->params.Q[itype][jtype]; + flt_t Aij = ka->params.A[itype][jtype]; + flt_t alphaij = ka->params.alpha[itype][jtype]; + fvec vrcminij = fvec::set1(ka->params.rcmin[itype][jtype]); + fvec vrcmaxij = fvec::set1(ka->params.rcmax[itype][jtype]); + fvec vQij = fvec::set1(ka->params.Q[itype][jtype]); + fvec vAij = fvec::set1(ka->params.A[itype][jtype]); + fvec malphaij = fvec::set1(-ka->params.alpha[itype][jtype]); + fvec c_1_0 = fvec::set1(1); + fvec c_0_5 = fvec::set1(0.5); + fvec c_TOL = fvec::set1(1e-9); + struct aut_frebo_data i_data, j_data; + + fvec evdwl_vacc = fvec::setzero(); + ivec vi = ivec::maskz_loadu(bvec::full(), i_buf); + int tmp; + ivec vj = ivec::maskz_loadu(bvec::full(), j_buf); + fvec x_i, y_i, z_i; + fvec x_j, y_j, z_j; + aut_loadatoms_vec_notype(x, vi, &x_i, &y_i, &z_i); + aut_loadatoms_vec_notype(x, vj, &x_j, &y_j, &z_j); + i_data.x_i = x_i; + i_data.y_i = y_i; + i_data.z_i = z_i; + i_data.x_j = x_j; + i_data.y_j = y_j; + i_data.z_j = z_j; + j_data.x_i = x_j; + j_data.y_i = y_j; + j_data.z_i = z_j; + j_data.x_j = x_i; + j_data.y_j = y_i; + j_data.z_j = z_i; + fvec delx = x_i - x_j; + fvec dely = y_i - y_j; + fvec delz = z_i - z_j; + fvec rsq = delx * delx + dely * dely + delz * delz; + fvec rij = fvec::sqrt(rsq); + fvec dwij; + fvec wij = aut_Sp_deriv(rij, vrcminij, vrcmaxij, &dwij); + + fvec exp_alphar = fvec::exp(malphaij * rij); + fvec Qij_over_rij = vQij / rij; + fvec Qij_over_rsq = vQij / rsq; + fvec VR_by_wij = ( c_1_0 + Qij_over_rij) * vAij * exp_alphar; + fvec VR = wij * VR_by_wij; + fvec pre = wij * vAij * exp_alphar; + fvec dVRdi = pre * ( malphaij + malphaij * Qij_over_rij - Qij_over_rsq); + dVRdi = dVRdi + VR_by_wij * dwij; + + fvec VA_by_wij = fvec::setzero(); + fvec dVA = fvec::setzero(); + + int k; + for (k = 0; k < 3; k++) { + fvec mBIJc = fvec::set1(-ka->params.BIJc[itype][jtype][k]); + fvec mBetaij = fvec::set1(-ka->params.Beta[itype][jtype][k]); + fvec term = mBIJc * fvec::exp(mBetaij * rij); + VA_by_wij = VA_by_wij + term; + dVA = dVA + mBetaij * wij * term; + } + + dVA = dVA + dwij * VA_by_wij; + fvec VA = wij * VA_by_wij; + + bvec tol_check = fvec::cmplt(wij, c_TOL); + VA = fvec::mask_blend(tol_check, VA, fvec::setzero()); + dVA = fvec::mask_blend(tol_check, dVA, fvec::setzero()); + VR = fvec::mask_blend(tol_check, VR, fvec::setzero()); + dVRdi = fvec::mask_blend(tol_check, dVRdi, fvec::setzero()); + + fvec nHi = fvec::gather(vi, ka->nH, sizeof(flt_t)); + fvec nCi = fvec::gather(vi, ka->nC, sizeof(flt_t)); + fvec nHj = fvec::gather(vj, ka->nH, sizeof(flt_t)); + fvec nCj = fvec::gather(vj, ka->nC, sizeof(flt_t)); + fvec Nij = (nHi + nCi) - wij; + fvec Nji = (nHj + nCj) - wij; + i_data.nHi = nHi; + i_data.nCi = nCi; + j_data.nHi = nHj; + j_data.nCi = nCj; + fvec fij[3], fji[3]; + fij[0] = fvec::setzero(); fij[1] = fvec::setzero(); + fij[2] = fvec::setzero(); + fji[0] = fvec::setzero(); fji[1] = fvec::setzero(); + fji[2] = fvec::setzero(); + + fvec NconjtmpI; + fvec pij = aut_frebo_pij_pd_2( + ka, &i_data, itype, jtype, vi, vj, + delx, dely, delz, rij, wij, VA, &NconjtmpI, fij); + + if (i_data.buf_len < 0) goto exceed_limits; + + fvec NconjtmpJ; + fvec rjix = fvec::setzero() - delx; + fvec rjiy = fvec::setzero() - dely; + fvec rjiz = fvec::setzero() - delz; + fvec pji = aut_frebo_pij_pd_2( + ka, &j_data, jtype, itype, vj, vi, + rjix, rjiy, rjiz, rij, wij, VA, &NconjtmpJ, fji); + fij[0] = fij[0] - fji[0]; + fij[1] = fij[1] - fji[1]; + fij[2] = fij[2] - fji[2]; + + if (j_data.buf_len < 0) goto exceed_limits; + + if (torflag && itype == 0 && jtype == 0) + aut_torsion_vec(ka, &i_data, &j_data, vi, vj, wij, dwij); + + fvec Nijconj = c_1_0 + NconjtmpI * NconjtmpI + NconjtmpJ * NconjtmpJ; + fvec dN3[3]; + fvec pi_rc = aut_frebo_pi_rc_pd(ka, itype, jtype, Nij, Nji, Nijconj, dN3); + aut_frebo_N_spline_force(ka, &i_data, itype, jtype, vi, vj, VA, dN3[0], + dN3[2], NconjtmpI); + aut_frebo_N_spline_force(ka, &j_data, jtype, itype, vj, vi, VA, dN3[1], + dN3[2], NconjtmpJ); + fvec pi_dh = aut_frebo_pi_dh(ka, &i_data, &j_data, itype, jtype, vi, vj, + delx, dely, delz, rij, VA, Nij, Nji, Nijconj, + NconjtmpI, NconjtmpJ, fij); + + fvec bij = c_0_5 * ( pij + pji) + pi_rc + pi_dh; + fvec dVAdi = bij * dVA; + fvec fpair = (dVAdi + dVRdi) * fvec::recip(rij); + fvec result_f_j_x = fpair * delx - fij[0]; + fvec result_f_j_y = fpair * dely - fij[1]; + fvec result_f_j_z = fpair * delz - fij[2]; + fvec result_f_i_x = fvec::setzero() - result_f_j_x; + fvec result_f_i_y = fvec::setzero() - result_f_j_y; + fvec result_f_i_z = fvec::setzero() - result_f_j_z; + fvec evdwl = VR + bij * VA; + evdwl_vacc = evdwl_vacc + evdwl; + + aut_frebo_data_writeback(ka, &i_data); + aut_frebo_data_writeback(ka, &j_data); + + flt_t fi_x_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fi_y_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fi_z_buf[fvec::VL] __attribute__((aligned(64))); + int fi_i_buf[ivec::VL] __attribute__((aligned(64))); + flt_t fj_x_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fj_y_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fj_z_buf[fvec::VL] __attribute__((aligned(64))); + int fj_j_buf[ivec::VL] __attribute__((aligned(64))); + flt_t evdwl_buf[fvec::VL] __attribute__((aligned(64))); + + result_f_i_x = i_data.force_i_x + result_f_i_x; + result_f_i_y = i_data.force_i_y + result_f_i_y; + result_f_i_z = i_data.force_i_z + result_f_i_z; + result_f_j_x = i_data.force_j_x + result_f_j_x; + result_f_j_y = i_data.force_j_y + result_f_j_y; + result_f_j_z = i_data.force_j_z + result_f_j_z; + + result_f_i_x = j_data.force_j_x + result_f_i_x; + result_f_i_y = j_data.force_j_y + result_f_i_y; + result_f_i_z = j_data.force_j_z + result_f_i_z; + result_f_j_x = j_data.force_i_x + result_f_j_x; + result_f_j_y = j_data.force_i_y + result_f_j_y; + result_f_j_z = j_data.force_i_z + result_f_j_z; + + fvec::store(fi_x_buf, result_f_i_x); + fvec::store(fi_y_buf, result_f_i_y); + fvec::store(fi_z_buf, result_f_i_z); + ivec::store(fi_i_buf, vi); + fvec::store(fj_x_buf, result_f_j_x); + fvec::store(fj_y_buf, result_f_j_y); + fvec::store(fj_z_buf, result_f_j_z); + ivec::store(fj_j_buf, vj); + fvec::store(evdwl_buf, evdwl); + + int lane; + for (lane = 0; lane < fvec::VL; lane++) { + int ii = fi_i_buf[lane]; + result_f[ii].x += fi_x_buf[lane]; + result_f[ii].y += fi_y_buf[lane]; + result_f[ii].z += fi_z_buf[lane]; + result_f[ii].w += 0.5 * evdwl_buf[lane]; + int jj = fj_j_buf[lane]; + result_f[jj].x += fj_x_buf[lane]; + result_f[jj].y += fj_y_buf[lane]; + result_f[jj].z += fj_z_buf[lane]; + result_f[jj].w += 0.5 * evdwl_buf[lane]; + } + ka->result_eng += fvec::reduce_add(evdwl_vacc); + return; + } +exceed_limits: + for (int l = 0; l < fvec::VL; l++) { + int i = i_buf[l]; + int j = j_buf[l]; + ref_frebo_single_interaction(ka, i, j); + if (torflag && itype == 0 && jtype == 0) + ref_torsion_single_interaction(ka, i, j); + } +} + +/* + Orders the interactions by itype and jtype and passes chunks to the above + method. +*/ +static void aut_frebo(KernelArgsAIREBOT * ka, int torflag) { + AtomAIREBOT * _noalias x = ka->x; + tagint * _noalias tag = ka->tag; + int * _noalias map = ka->map; + int i_buf[2][2][fvec::VL]; + int j_buf[2][2][fvec::VL]; + int n_buf[2][2] = {0}; + for (int i = ka->frebo_from_atom; i < ka->frebo_to_atom; i++) { + tagint itag = tag[i]; + int itype = map[x[i].w]; + flt_t x_i = x[i].x; + flt_t y_i = x[i].y; + flt_t z_i = x[i].z; + int * neighs = ka->neigh_rebo.entries + ka->neigh_rebo.offset[i]; + int jnum = ka->neigh_rebo.num[i]; + for (int jj = 0; jj < jnum; jj++) { + int j = neighs[jj]; + tagint jtag = tag[j]; + if (itag > jtag) { + if (((itag + jtag) & 1) == 0) + continue; + } else if (itag < jtag) { + if (((itag + jtag) & 1) == 1) + continue; + } else { + if (x[j].z < z_i) + continue; + if (x[j].z == z_i && x[j].y < y_i) + continue; + if (x[j].z == z_i && x[j].y == y_i && x[j].x < x_i) + continue; + } + int jtype = map[x[j].w]; + int ins = n_buf[itype][jtype]; + i_buf[itype][jtype][ins] = i; + j_buf[itype][jtype][ins] = j; + n_buf[itype][jtype] += 1; + if (n_buf[itype][jtype] == fvec::VL) { + aut_frebo_batch_of_kind(ka, torflag, itype, jtype, + i_buf[itype][jtype], j_buf[itype][jtype]); + n_buf[itype][jtype] = 0; + } + } + } + for (int itype = 0; itype < 2; itype++) { + for (int jtype = 0; jtype < 2; jtype++) { + for (int l = 0; l < n_buf[itype][jtype]; l++) { + int i = i_buf[itype][jtype][l]; + int j = j_buf[itype][jtype][l]; + ref_frebo_single_interaction(ka, i, j); + if (torflag && itype == 0 && jtype == 0) + ref_torsion_single_interaction(ka, i, j); + } + } + } +} + +/* + * Apply paths in scalar fashion, not crucial for performance. + */ +static void aut_airebo_lj_force_path(KernelArgsAIREBOT * ka, + bvec mask, fvec dC, LennardJonesPathAIREBOT path[fvec::VL]) { + for (int i = 0; i < fvec::VL; i++) { + if (bvec::test_at(mask, i)) { + ref_lennard_jones_force_path(ka, fvec::at(dC, i), &path[i]); + } + } +} + +/* + * Hash-Map for efficient calculation of C_ij. + * Can have up to ITEMS entries with associated paths, as well as + * 1024 entries. Open addressing, invalidation by using a different i. + * Only needs to be reset once per timestep. + */ +static const int OPT_TEST_PATH_SIZE = 1024; +static const int OPT_TEST_PATH_ITEMS = 128; +struct aut_airebo_lj_test_path_result_data { + LennardJonesPathAIREBOT testpath[OPT_TEST_PATH_ITEMS]; + int i[OPT_TEST_PATH_SIZE]; + int j[OPT_TEST_PATH_SIZE]; + flt_t cij[OPT_TEST_PATH_SIZE]; + int testpath_idx[OPT_TEST_PATH_SIZE]; +}; +static const unsigned int OPT_TEST_PATH_HASH = 2654435761; + +static int aut_lj_tap_hash_fn(int j, int attempt) { + uint32_t result = j; + result *= (uint32_t) OPT_TEST_PATH_HASH; + result += (uint32_t) attempt; + result %= (uint32_t) OPT_TEST_PATH_SIZE; + return result; +} + +static ivec aut_airebo_lj_tap_hash_fn_vec(ivec val, ivec attempt) { + const ivec golden = ivec::set1(OPT_TEST_PATH_HASH); + const ivec mask = ivec::set1(OPT_TEST_PATH_SIZE - 1); + ivec a = ivec::mullo(golden, val); + ivec b = a + attempt; + ivec c = ivec::the_and(b, mask); + return c; +} + +/* + * Enter all those (potential) neighbors of i (including 2nd and 3rd degree) + * into the hash-map. There is no good way to vectorize this, and it does not + * seem time-critical. + */ +static bool aut_airebo_lj_test_all_paths(KernelArgsAIREBOT * ka, + int i, struct aut_airebo_lj_test_path_result_data * result) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + flt_t (*rcmin)[2] = &ka->params.rcmin[0]; + flt_t (*rcmax)[2] = &ka->params.rcmax[0]; + flt_t rcminsq[2][2]; + rcminsq[0][0] = rcmin[0][0] * rcmin[0][0]; + rcminsq[0][1] = rcmin[0][1] * rcmin[0][1]; + rcminsq[1][0] = rcmin[1][0] * rcmin[1][0]; + rcminsq[1][1] = rcmin[1][1] * rcmin[1][1]; + int * neighs_i = &ka->neigh_rebo.entries[ka->neigh_rebo.offset[i]]; + int itype = map[x[i].w]; + int path_insert_pos = 0; + for (int jj = 0; jj < ka->neigh_rebo.num[i]; jj++) { + int j = neighs_i[jj]; + int jtype = map[x[j].w]; + flt_t dijx = x[j].x - x[i].x; + flt_t dijy = x[j].y - x[i].y; + flt_t dijz = x[j].z - x[i].z; + flt_t rijsq = dijx * dijx + dijy * dijy + dijz * dijz; + flt_t wj = 1, dwj = 0; + flt_t rij = 0; + if (rijsq >= rcminsq[itype][jtype]) { + rij = overloaded::sqrt(rijsq); + wj = Sp(rij, rcmin[itype][jtype], rcmax[itype][jtype], &dwj); + } + int attempt = 0; + int start_hash_slot = aut_lj_tap_hash_fn(j, attempt); + int hash_slot = start_hash_slot; + while (result->i[hash_slot] == i && result->j[hash_slot] != j && + attempt < OPT_TEST_PATH_SIZE) { + hash_slot = aut_lj_tap_hash_fn(j, ++attempt); + } + if (attempt >= OPT_TEST_PATH_SIZE) goto exceed_limits; + bool init_slot = result->i[hash_slot] != i; + if (init_slot || (1 - wj < result->cij[hash_slot])) { + result->i[hash_slot] = i; + result->j[hash_slot] = j; + result->cij[hash_slot] = 1 - wj; + if (wj != 1.0) { + if (path_insert_pos >= OPT_TEST_PATH_ITEMS) goto exceed_limits; + result->testpath_idx[hash_slot] = path_insert_pos; + LennardJonesPathAIREBOT *path = + &result->testpath[path_insert_pos++]; + path->num = 2; + path->del[0].x = dijx; + path->del[0].y = dijy; + path->del[0].z = dijz; + if (rij == 0) rij = sqrt(rijsq); + path->r[0] = rij; + path->w[0] = wj; + path->dw[0] = dwj; + path->idx[0] = i; + path->idx[1] = j; + } + } + int * neighs_j = &ka->neigh_rebo.entries[ka->neigh_rebo.offset[j]]; + for (int kk = 0; kk < ka->neigh_rebo.num[j]; kk++) { + int k = neighs_j[kk]; + if (k == i) continue; + int ktype = map[x[k].w]; + flt_t djkx = x[k].x - x[j].x; + flt_t djky = x[k].y - x[j].y; + flt_t djkz = x[k].z - x[j].z; + flt_t rjksq = djkx * djkx + djky * djky + djkz * djkz; + flt_t wk = 1, dwk = 0; + flt_t rjk = 0; + if (rjksq >= rcminsq[jtype][ktype]) { + rjk = overloaded::sqrt(rjksq); + wk = Sp(rjk, rcmin[jtype][ktype], rcmax[jtype][ktype], &dwk); + } + int attempt = 0; + int start_hash_slot = aut_lj_tap_hash_fn(k, attempt); + int hash_slot = start_hash_slot; + while (result->i[hash_slot] == i && result->j[hash_slot] != k && + attempt < OPT_TEST_PATH_SIZE) { + hash_slot = aut_lj_tap_hash_fn(k, ++attempt); + } + if (attempt >= OPT_TEST_PATH_SIZE) goto exceed_limits; + bool init_slot = result->i[hash_slot] != i; + if (init_slot || (1 - wj * wk < result->cij[hash_slot])) { + result->i[hash_slot] = i; + result->j[hash_slot] = k; + result->cij[hash_slot] = 1 - wj * wk; + if (wj * wk != 1.0) { + if (path_insert_pos >= OPT_TEST_PATH_ITEMS) goto exceed_limits; + result->testpath_idx[hash_slot] = path_insert_pos; + LennardJonesPathAIREBOT *path = + &result->testpath[path_insert_pos++]; + path->num = 3; + path->del[0].x = dijx; + path->del[0].y = dijy; + path->del[0].z = dijz; + if (rij == 0) rij = sqrt(rijsq); + path->r[0] = rij; + path->del[1].x = djkx; + path->del[1].y = djky; + path->del[1].z = djkz; + if (rjk == 0) rjk = sqrt(rjksq); + path->r[1] = rjk; + path->w[0] = wj; + path->dw[0] = dwj; + path->w[1] = wk; + path->dw[1] = dwk; + path->idx[0] = i; + path->idx[1] = j; + path->idx[2] = k; + } + } + int * neighs_k = &ka->neigh_rebo.entries[ka->neigh_rebo.offset[k]]; + for (int ll = 0; ll < ka->neigh_rebo.num[k]; ll++) { + int l = neighs_k[ll]; + if ((l == i) || (l == j)) continue; + int ltype = map[x[l].w]; + flt_t dklx = x[l].x - x[k].x; + flt_t dkly = x[l].y - x[k].y; + flt_t dklz = x[l].z - x[k].z; + flt_t rklsq = dklx * dklx + dkly * dkly + dklz * dklz; + flt_t wl = 1, dwl = 0; + flt_t rkl = 0; + if (rklsq >= rcminsq[ktype][ltype]) { + rkl = overloaded::sqrt(rklsq); + wl = Sp(rkl, rcmin[ktype][ltype], rcmax[ktype][ltype], &dwl); + } + int attempt = 0; + int start_hash_slot = aut_lj_tap_hash_fn(l, attempt); + int hash_slot = start_hash_slot; + while (result->i[hash_slot] == i && result->j[hash_slot] != l && + attempt < OPT_TEST_PATH_SIZE) { + hash_slot = aut_lj_tap_hash_fn(l, ++attempt); + } + if (attempt >= OPT_TEST_PATH_SIZE) goto exceed_limits; + bool init_slot = result->i[hash_slot] != i; + if (init_slot || (1 - wj * wk * wl < result->cij[hash_slot])) { + result->i[hash_slot] = i; + result->j[hash_slot] = l; + result->cij[hash_slot] = 1 - wj * wk * wl; + if (wj * wk * wl != 1.0) { + if (path_insert_pos >= OPT_TEST_PATH_ITEMS) goto exceed_limits; + result->testpath_idx[hash_slot] = path_insert_pos; + LennardJonesPathAIREBOT *path = + &result->testpath[path_insert_pos++]; + path->num = 4; + path->del[0].x = dijx; + path->del[0].y = dijy; + path->del[0].z = dijz; + if (rij == 0) rij = sqrt(rijsq); + path->r[0] = rij; + path->del[1].x = djkx; + path->del[1].y = djky; + path->del[1].z = djkz; + if (rjk == 0) rjk = sqrt(rjksq); + path->r[1] = rjk; + path->del[2].x = dklx; + path->del[2].y = dkly; + path->del[2].z = dklz; + if (rkl == 0) rkl = sqrt(rklsq); + path->r[2] = rkl; + path->w[0] = wj; + path->dw[0] = dwj; + path->w[1] = wk; + path->dw[1] = dwk; + path->w[2] = wl; + path->dw[2] = dwl; + path->idx[0] = i; + path->idx[1] = j; + path->idx[2] = k; + path->idx[3] = l; + } + } + } + } + } + return true; +exceed_limits: + return false; +} + +/* + * Attempt to look up an element in the hash-map. + */ +static fvec aut_airebo_lj_tap_test_path(KernelArgsAIREBOT * ka, + struct aut_airebo_lj_test_path_result_data * test_path_result, + bvec need_search, ivec i_bc, ivec j, + LennardJonesPathAIREBOT path[fvec::VL] +) { + const ivec c_i1 = ivec::set1(1); + fvec cij = fvec::set1(1.0); + // first round: hash all j + // lookup i/j in hash list. + // if i matches and j matches: congrats + // if i matches and j does not: look up attempts + // if attempts > current_attempts: + // do another round of hashing + // for all those found: + + // fill in the path + // ----------------------------------------------- + // find all the correct hash slots, and a mask of where found. + ivec attempt = ivec::setzero(); + ivec hash_slot = aut_airebo_lj_tap_hash_fn_vec(j, attempt); + ivec lookup_i = ivec::mask_gather(ivec::undefined(), need_search, hash_slot, + &test_path_result->i[0], sizeof(int)); + bvec correct_i = ivec::mask_cmpeq(need_search, lookup_i, i_bc); + ivec lookup_j = ivec::mask_gather(ivec::undefined(), correct_i, hash_slot, + &test_path_result->j[0], sizeof(int)); + bvec found_items = ivec::mask_cmpeq(correct_i, lookup_j, j); + bvec another_attempt = correct_i & ~ found_items; + while (bvec::test_any_set(another_attempt)) { + attempt = ivec::mask_add(attempt, another_attempt, attempt, c_i1); + hash_slot = aut_airebo_lj_tap_hash_fn_vec(j, attempt); + ivec lookup_i_2 = ivec::mask_gather(lookup_i, another_attempt, hash_slot, + &test_path_result->i[0], sizeof(int)); + lookup_i = lookup_i_2; + correct_i = ivec::mask_cmpeq(need_search, lookup_i, i_bc); + lookup_j = ivec::mask_gather(lookup_j, another_attempt, hash_slot, + &test_path_result->j[0], sizeof(int)); + found_items = ivec::mask_cmpeq(correct_i, lookup_j, j); + another_attempt = correct_i & ~ found_items; + } + cij = fvec::mask_gather(cij, found_items, hash_slot, + &test_path_result->cij[0], sizeof(flt_t)); + bvec need_testpath = fvec::mask_cmplt(found_items, fvec::setzero(), cij); + if (bvec::test_any_set(need_testpath)) { + for (int i = 0; i < fvec::VL; i++) { + if (bvec::test_at(need_testpath, i)) { + int testpath_idx = + test_path_result->testpath_idx[ivec::at(hash_slot, i)]; + path[i] = test_path_result->testpath[testpath_idx]; + } + } + } + return cij; +} + +/* + * This function calculates the Lennard-Jones interaciton for those + * elements that require a bond-order calculation. + * It is similarly structured as the aut_frebo_batch_of_kind function. + * The forces due to bondorders are calculated speculatively and later + * updated with the correct outer derivative. + */ +template +static void aut_lj_with_bo( + KernelArgsAIREBOT * ka, + int itype, int jtype, + ivec i, ivec j, + fvec cij, LennardJonesPathAIREBOT testpath[fvec::VL] +) { + { // jump-scope for exceed_limits + AtomAIREBOT * _noalias x = ka->x; + ResultForceT * result_f = ka->result_f; + + ivec c_i4 = ivec::set1(4); + fvec c_1_0 = fvec::set1(1.0); + fvec c_2_0 = fvec::set1(2.0); + fvec c_0_5 = fvec::set1(0.5); + + fvec x_i, y_i, z_i; + aut_loadatoms_vec_notype(x, i, &x_i, &y_i, &z_i); + fvec x_j, y_j, z_j; + aut_loadatoms_vec_notype(x, j, &x_j, &y_j, &z_j); + fvec delx = x_i - x_j; + fvec dely = y_i - y_j; + fvec delz = z_i - z_j; + fvec rsq = delx * delx + dely * dely + delz * delz; + + fvec rij = fvec::sqrt(rsq); + bvec need_path_force = fvec::cmplt(cij, c_1_0); + flt_t sigcut = ka->params.sigcut; + flt_t sigmin = ka->params.sigmin; + flt_t sigma = ka->params.sigma[itype][jtype]; + flt_t rljmax = sigcut * sigma; + flt_t rljmin = sigmin * sigma; + fvec p_rljmin = fvec::set1(rljmin); + fvec p_rljmax = fvec::set1(rljmax); + + fvec dslw, slw = aut_Sp2_deriv(rij, p_rljmin, p_rljmax, &dslw); + + fvec p_lj1 = fvec::set1(ka->params.lj1[itype][jtype]); + fvec p_lj2 = fvec::set1(ka->params.lj2[itype][jtype]); + fvec p_lj3 = fvec::set1(ka->params.lj3[itype][jtype]); + fvec p_lj4 = fvec::set1(ka->params.lj4[itype][jtype]); + + fvec r2inv = fvec::recip(rsq); + + fvec vdw, dvdw; + if (MORSEFLAG) { + fvec exr = fvec::exp(fvec::setzero() - rij * p_lj4); + vdw = p_lj1 * exr * (p_lj2 * exr - c_2_0); + dvdw = p_lj3 * exr * (c_1_0 - p_lj2 * exr); + } else { + fvec r6inv = r2inv * r2inv * r2inv; + + vdw = r6inv * ( p_lj3 * r6inv - p_lj4); + fvec r7inv = r6inv * rij * r2inv; + dvdw = r7inv * ( p_lj2 - p_lj1 * r6inv); + } + + fvec VLJ = vdw * slw; + fvec dVLJ = dvdw * slw + vdw * dslw; + + fvec p_rcLJmin = fvec::set1(ka->params.rcLJmin[itype][jtype]); + fvec p_rcLJmax = fvec::set1(ka->params.rcLJmax[itype][jtype]); + fvec dStr, Str = aut_Sp2_deriv(rij, p_rcLJmin, p_rcLJmax, &dStr); + fvec VA = cij * VLJ * Str; + + fvec fij[3], fji[3]; + fij[0] = fvec::setzero(); fij[1] = fvec::setzero(); + fij[2] = fvec::setzero(); + fji[0] = fvec::setzero(); fji[1] = fvec::setzero(); + fji[2] = fvec::setzero(); + + ivec vi = i; + ivec vj = j; + + struct aut_frebo_data i_data, j_data; + i_data.x_i = x_i; + i_data.y_i = y_i; + i_data.z_i = z_i; + i_data.x_j = x_j; + i_data.y_j = y_j; + i_data.z_j = z_j; + j_data.x_i = x_j; + j_data.y_i = y_j; + j_data.z_i = z_j; + j_data.x_j = x_i; + j_data.y_j = y_i; + j_data.z_j = z_i; + + fvec p_rcmin = fvec::set1(ka->params.rcmin[itype][jtype]); + fvec p_rcmax = fvec::set1(ka->params.rcmax[itype][jtype]); + fvec dwij; + fvec wij = aut_Sp_deriv(rij, p_rcmin, p_rcmax, &dwij); + + fvec nHi = fvec::gather(vi, ka->nH, sizeof(flt_t)); + fvec nCi = fvec::gather(vi, ka->nC, sizeof(flt_t)); + fvec nHj = fvec::gather(vj, ka->nH, sizeof(flt_t)); + fvec nCj = fvec::gather(vj, ka->nC, sizeof(flt_t)); + fvec Nij = nHi + nCi - wij; + fvec Nji = nHj + nCj - wij; + i_data.nHi = nHi; + i_data.nCi = nCi; + j_data.nHi = nHj; + j_data.nCi = nCj; + + fvec the_r = fvec::set1(ka->params.rcmin[itype][jtype]); + fvec scale = the_r / rij; + + fvec NconjtmpI; + fvec pij = aut_frebo_pij_pd_2(ka, &i_data, itype, jtype, vi, vj, + delx * scale, dely * scale, delz * scale, + the_r, wij, VA, &NconjtmpI, fij); + + if (i_data.buf_len < 0) goto exceed_limits; + + fvec NconjtmpJ; + fvec rjix = fvec::setzero() - delx; + fvec rjiy = fvec::setzero() - dely; + fvec rjiz = fvec::setzero() - delz; + fvec pji = aut_frebo_pij_pd_2(ka, &j_data, jtype, itype, vj, vi, + rjix * scale, rjiy * scale, rjiz * scale, + the_r, wij, VA, &NconjtmpJ, fji); + fij[0] = fij[0] - fji[0]; + fij[1] = fij[1] - fji[1]; + fij[2] = fij[2] - fji[2]; + + if (j_data.buf_len < 0) goto exceed_limits; + + fvec Nijconj = c_1_0 + NconjtmpI * NconjtmpI + NconjtmpJ * NconjtmpJ; + fvec dN3[3]; + fvec pi_rc = aut_frebo_pi_rc_pd(ka, itype, jtype, Nij, Nji, Nijconj, dN3); + + fvec c_TOL = fvec::set1(TOL); + fvec dN3_dh[3]; + fvec Tij = aut_frebo_Tij(ka, itype, jtype, Nij, Nji, Nijconj, &dN3_dh[0]); + bvec TijgtTOLmask = fvec::cmpnle(fvec::abs(Tij), c_TOL); + fvec sum_omega = fvec::setzero(); + if (bvec::test_any_set(TijgtTOLmask)) { + sum_omega = aut_frebo_sum_omega( + ka, &i_data, &j_data, itype, jtype, vi, vj, + delx * scale, dely * scale, delz * scale, the_r, VA * Tij, fij); + sum_omega = fvec::mask_blend(TijgtTOLmask, fvec::setzero(), sum_omega); + } + fvec pi_dh = Tij * sum_omega; + + fvec bij = c_0_5 * ( pij + pji) + pi_rc + pi_dh; + + fvec p_bLJmin = fvec::set1(ka->params.bLJmin[itype][jtype]); + fvec p_bLJmax = fvec::set1(ka->params.bLJmax[itype][jtype]); + fvec dStb, Stb = aut_Sp2_deriv(bij, p_bLJmin, p_bLJmax, &dStb); + + bvec need_bo_deriv = fvec::cmpneq(dStb, fvec::setzero()); + // fix up j_data, i_data, fij: + // multiply each by dStb + if (bvec::test_any_set(need_bo_deriv)) { + i_data.force_i_x = dStb * i_data.force_i_x; + i_data.force_i_y = dStb * i_data.force_i_y; + i_data.force_i_z = dStb * i_data.force_i_z; + i_data.force_j_x = dStb * i_data.force_j_x; + i_data.force_j_y = dStb * i_data.force_j_y; + i_data.force_j_z = dStb * i_data.force_j_z; + j_data.force_i_x = dStb * j_data.force_i_x; + j_data.force_i_y = dStb * j_data.force_i_y; + j_data.force_i_z = dStb * j_data.force_i_z; + j_data.force_j_x = dStb * j_data.force_j_x; + j_data.force_j_y = dStb * j_data.force_j_y; + j_data.force_j_z = dStb * j_data.force_j_z; + for (int k = 0; k < i_data.buf_len; k++) { + i_data.force_k_x_buf[k] = dStb * i_data.force_k_x_buf[k]; + i_data.force_k_y_buf[k] = dStb * i_data.force_k_y_buf[k]; + i_data.force_k_z_buf[k] = dStb * i_data.force_k_z_buf[k]; + } + for (int k = 0; k < j_data.buf_len; k++) { + j_data.force_k_x_buf[k] = dStb * j_data.force_k_x_buf[k]; + j_data.force_k_y_buf[k] = dStb * j_data.force_k_y_buf[k]; + j_data.force_k_z_buf[k] = dStb * j_data.force_k_z_buf[k]; + } + fvec fijc[3]; + fijc[0] = dStb * fij[0]; + fijc[1] = dStb * fij[1]; + fijc[2] = dStb * fij[2]; + fij[0] = scale * (fijc[0] - (delx * delx * fijc[0] + dely * delx * + fijc[1] + delz * delx * fijc[2]) / rsq); + fij[1] = scale * (fijc[1] - (delx * dely * fijc[0] + dely * dely * + fijc[1] + delz * dely * fijc[2]) / rsq); + fij[2] = scale * (fijc[2] - (delx * delz * fijc[0] + dely * delz * + fijc[1] + delz * delz * fijc[2]) / rsq); + + aut_frebo_N_spline_force(ka, &i_data, itype, jtype, vi, vj, dStb * VA, + dN3[0], dN3[2], NconjtmpI); + aut_frebo_N_spline_force(ka, &j_data, jtype, itype, vj, vi, dStb * VA, + dN3[1], dN3[2], NconjtmpJ); + if (bvec::test_any_set(TijgtTOLmask)) { + aut_frebo_N_spline_force(ka, &i_data, itype, jtype, vi, vj, + dStb * VA * sum_omega, dN3_dh[0], dN3_dh[2], + NconjtmpI); + aut_frebo_N_spline_force(ka, &j_data, jtype, itype, vj, vi, + dStb * VA * sum_omega, dN3_dh[1], dN3_dh[2], + NconjtmpJ); + } + + aut_frebo_data_writeback(ka, &i_data); + aut_frebo_data_writeback(ka, &j_data); + } else { + fij[0] = fvec::setzero(); + fij[1] = fvec::setzero(); + fij[2] = fvec::setzero(); + } + + fvec fpdVLJ = cij * dVLJ * ( c_1_0 + Str * ( Stb - c_1_0)); + fvec fpdStr = dStr * cij * ( Stb * VLJ - VLJ); + fvec fpair = r2inv * rij * ( fvec::setzero() - ( fpdVLJ + fpdStr)); + fvec evdwl = VA * Stb + cij * VLJ * ( c_1_0 - Str); + + fvec result_f_i_x = fpair * delx + fij[0]; + fvec result_f_i_y = fpair * dely + fij[1]; + fvec result_f_i_z = fpair * delz + fij[2]; + fvec result_f_j_x = fvec::setzero() - result_f_i_x; + fvec result_f_j_y = fvec::setzero() - result_f_i_y; + fvec result_f_j_z = fvec::setzero() - result_f_i_z; + + flt_t fi_x_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fi_y_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fi_z_buf[fvec::VL] __attribute__((aligned(64))); + int fi_i_buf[ivec::VL] __attribute__((aligned(64))); + flt_t fj_x_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fj_y_buf[fvec::VL] __attribute__((aligned(64))); + flt_t fj_z_buf[fvec::VL] __attribute__((aligned(64))); + int fj_j_buf[ivec::VL] __attribute__((aligned(64))); + flt_t evdwl_buf[fvec::VL] __attribute__((aligned(64))); + + if (bvec::test_any_set(need_bo_deriv)) { + result_f_i_x = i_data.force_i_x + result_f_i_x; + result_f_i_y = i_data.force_i_y + result_f_i_y; + result_f_i_z = i_data.force_i_z + result_f_i_z; + result_f_j_x = i_data.force_j_x + result_f_j_x; + result_f_j_y = i_data.force_j_y + result_f_j_y; + result_f_j_z = i_data.force_j_z + result_f_j_z; + + result_f_i_x = j_data.force_j_x + result_f_i_x; + result_f_i_y = j_data.force_j_y + result_f_i_y; + result_f_i_z = j_data.force_j_z + result_f_i_z; + result_f_j_x = j_data.force_i_x + result_f_j_x; + result_f_j_y = j_data.force_i_y + result_f_j_y; + result_f_j_z = j_data.force_i_z + result_f_j_z; + } + + fvec::store(fi_x_buf, result_f_i_x); + fvec::store(fi_y_buf, result_f_i_y); + fvec::store(fi_z_buf, result_f_i_z); + ivec::store(fi_i_buf, vi); + fvec::store(fj_x_buf, result_f_j_x); + fvec::store(fj_y_buf, result_f_j_y); + fvec::store(fj_z_buf, result_f_j_z); + ivec::store(fj_j_buf, vj); + fvec::store(evdwl_buf, evdwl); + + int lane; + for (lane = 0; lane < fvec::VL; lane++) { + int ii = fi_i_buf[lane]; + result_f[ii].x += fi_x_buf[lane]; + result_f[ii].y += fi_y_buf[lane]; + result_f[ii].z += fi_z_buf[lane]; + result_f[ii].w += 0.5 * evdwl_buf[lane]; + int jj = fj_j_buf[lane]; + result_f[jj].x += fj_x_buf[lane]; + result_f[jj].y += fj_y_buf[lane]; + result_f[jj].z += fj_z_buf[lane]; + result_f[jj].w += 0.5 * evdwl_buf[lane]; + } + ka->result_eng += fvec::reduce_add(evdwl); + + if (bvec::test_any_set(need_path_force)) { + fvec dC = VLJ * ( Str * Stb + c_1_0 - Str); + aut_airebo_lj_force_path(ka, need_path_force, dC, testpath); + } + return; + } +exceed_limits: + for (int l = 0; l < fvec::VL; l++) { + ref_lennard_jones_single_interaction(ka, ivec::at(i, l), ivec::at(j, l), + MORSEFLAG); + } + return; +} + +/* + * Calculate the lennard-jones interaction. + * Uses the above hash-map, and outlines the calculation if the bondorder is + * needed. + * Agressively compresses to get the most values calculated. + */ +template +static void aut_lennard_jones(KernelArgsAIREBOT * ka) { + AtomAIREBOT * x = ka->x; + int * map = ka->map; + ResultForceT * result_f = ka->result_f; + ivec c_i1 = ivec::set1(1); + ivec c_i4 = ivec::set1(4); + fvec c_1_0 = fvec::set1(1.0); + fvec c_2_0 = fvec::set1(2.0); + fvec c_0_0 = fvec::set1(0.0); + int map_i_scalar = 0; + { + int i; + for (i = 1; i < ka->num_types; i++) { + if (ka->map[i]) + map_i_scalar |= (1 << i); + } + } + ivec map_i = ivec::set1(map_i_scalar); + fvec result_eng = fvec::setzero(); + + struct aut_airebo_lj_test_path_result_data test_path_result; + for (int i = 0; i < OPT_TEST_PATH_SIZE; i++) { + test_path_result.i[i] = -1; + } + + ivec i_bo[2][2]; + ivec j_bo[2][2]; + fvec cij_bo[2][2]; + LennardJonesPathAIREBOT testpath_bo[2][2][fvec::VL]; + int num_bo[2][2] = {0}; + + for (int i = ka->frebo_from_atom; i < ka->frebo_to_atom; i++) { + int itype = map[x[i].w]; + fvec x_i = fvec::set1(x[i].x); + fvec y_i = fvec::set1(x[i].y); + fvec z_i = fvec::set1(x[i].z); + ivec i_bc = ivec::set1(i); + + fvec cutljsq0 = fvec::set1(ka->params.cutljsq[itype][0]); + fvec cutljsq1 = fvec::set1(ka->params.cutljsq[itype][1]); + fvec p_rcmax0 = fvec::set1(ka->params.rcmax[itype][0]); + fvec p_rcmax1 = fvec::set1(ka->params.rcmax[itype][1]); + flt_t sigcut = ka->params.sigcut; + flt_t sigmin = ka->params.sigmin; + flt_t sigma0 = ka->params.sigma[itype][0]; + flt_t rljmax0 = sigcut * sigma0; + flt_t rljmin0 = sigmin * sigma0; + flt_t sigma1 = ka->params.sigma[itype][1]; + flt_t rljmax1 = sigcut * sigma1; + flt_t rljmin1 = sigmin * sigma1; + fvec p_rljmax0 = fvec::set1(rljmax0); + fvec p_rljmax1 = fvec::set1(rljmax1); + fvec p_rljmin0 = fvec::set1(rljmin0); + fvec p_rljmin1 = fvec::set1(rljmin1); + fvec p_rcLJmax0 = fvec::set1(ka->params.rcLJmax[itype][0]); + fvec p_rcLJmax1 = fvec::set1(ka->params.rcLJmax[itype][1]); + fvec p_rcLJmin0 = fvec::set1(ka->params.rcLJmin[itype][0]); + fvec p_rcLJmin1 = fvec::set1(ka->params.rcLJmin[itype][1]); + fvec p_lj10 = fvec::set1(ka->params.lj1[itype][0]); + fvec p_lj11 = fvec::set1(ka->params.lj1[itype][1]); + fvec p_lj20 = fvec::set1(ka->params.lj2[itype][0]); + fvec p_lj21 = fvec::set1(ka->params.lj2[itype][1]); + fvec p_lj30 = fvec::set1(ka->params.lj3[itype][0]); + fvec p_lj31 = fvec::set1(ka->params.lj3[itype][1]); + fvec p_lj40 = fvec::set1(ka->params.lj4[itype][0]); + fvec p_lj41 = fvec::set1(ka->params.lj4[itype][1]); + + int * neighs = ka->neigh_lmp.entries + ka->neigh_lmp.offset[i]; + int jnum = ka->neigh_lmp.num_half[i]; + + bool tap_success = aut_airebo_lj_test_all_paths(ka, i, &test_path_result); + if (! tap_success) { + for (int jj = 0; jj < jnum; jj++) { + ref_lennard_jones_single_interaction(ka, i, neighs[jj], MORSEFLAG); + } + continue; + } + + ivec j_2; + fvec delx_2, dely_2, delz_2, rsq_2; + bvec jtype_mask_2; + int num_2 = 0; + + fvec result_f_i_x = fvec::setzero(); + fvec result_f_i_y = fvec::setzero(); + fvec result_f_i_z = fvec::setzero(); + + int jj = 0; + bool rest_j = jj < jnum; + bool rest_2 = fvec::fast_compress(); + #pragma forceinline recursive + while (rest_j || rest_2) { + fvec delx, dely, delz, rsq; + bvec jtype_mask, within_cutoff; + ivec j; + if (rest_j) { + bvec mask_0 = bvec::full(); + //0xFF >> (8 - (jnum - jj)); + if (jj + (fvec::VL - 1) >= jnum) mask_0 = bvec::only(jnum - jj); + j = ivec::maskz_loadu(mask_0, &neighs[jj]); + fvec x_j, y_j, z_j; + aut_loadatoms_vec(x, j, &x_j, &y_j, &z_j, &jtype_mask, map, map_i, + c_i1); + fvec::gather_prefetch0(ivec::mullo(c_i4, + ivec::maskz_loadu(bvec::full(), &neighs[jj + fvec::VL])), x); + _mm_prefetch((const char*)&neighs[jj + 2 * fvec::VL], _MM_HINT_T0); + delx = x_i - x_j; + dely = y_i - y_j; + delz = z_i - z_j; + rsq = delx * delx + dely * dely + delz * delz; + fvec cutoff_sq = fvec::mask_blend(jtype_mask, cutljsq0, cutljsq1); + within_cutoff = fvec::mask_cmplt(mask_0, rsq, cutoff_sq); + + if (fvec::fast_compress()) { + j = ivec::masku_compress(within_cutoff, j); + delx = fvec::masku_compress(within_cutoff, delx); + dely = fvec::masku_compress(within_cutoff, dely); + delz = fvec::masku_compress(within_cutoff, delz); + rsq = fvec::masku_compress(within_cutoff, rsq); + jtype_mask = bvec::masku_compress(within_cutoff, jtype_mask); + //within_cutoff = 0xFF >> (8 - _cc_popcnt(within_cutoff)); + + bvec mask_2 = bvec::after(num_2);//0xFF << num_2; + j_2 = ivec::mask_expand(j_2, mask_2, j); + delx_2 = fvec::mask_expand(delx_2, mask_2, delx); + dely_2 = fvec::mask_expand(dely_2, mask_2, dely); + delz_2 = fvec::mask_expand(delz_2, mask_2, delz); + rsq_2 = fvec::mask_expand(rsq_2, mask_2, rsq); + jtype_mask_2 = bvec::mask_expand(jtype_mask_2, mask_2, jtype_mask); + num_2 = num_2 + bvec::popcnt(within_cutoff); + if (num_2 < fvec::VL) { + jj += fvec::VL; + rest_j = jj < jnum; + continue; + } + + num_2 -= fvec::VL; + //(0xFF >> (8 - num_2)) << (_cc_popcnt(within_cutoff) - num_2); + mask_2 = bvec::onlyafter(num_2, bvec::popcnt(within_cutoff) - num_2); + { + ivec tmp_j = j_2; + j_2 = ivec::masku_compress(mask_2, j); + j = tmp_j; + fvec tmp_delx = delx_2; + delx_2 = fvec::masku_compress(mask_2, delx); + delx = tmp_delx; + fvec tmp_dely = dely_2; + dely_2 = fvec::masku_compress(mask_2, dely); + dely = tmp_dely; + fvec tmp_delz = delz_2; + delz_2 = fvec::masku_compress(mask_2, delz); + delz = tmp_delz; + fvec tmp_rsq = rsq_2; + rsq_2 = fvec::masku_compress(mask_2, rsq); + rsq = tmp_rsq; + bvec tmp_jtype_mask = jtype_mask_2; + jtype_mask_2 = bvec::masku_compress(mask_2, jtype_mask); + jtype_mask = tmp_jtype_mask; + within_cutoff = bvec::full(); + } + } + } else if (rest_2) { + rest_2 = false; + j = j_2; + delx = delx_2; + dely = dely_2; + delz = delz_2; + rsq = rsq_2; + jtype_mask = jtype_mask_2; + within_cutoff = bvec::only(num_2); + num_2 = 0; + } + + bvec current_mask = within_cutoff; + if (bvec::test_all_unset(current_mask)) { + jj += fvec::VL; + rest_j = jj < jnum; + continue; + } + + fvec rij = fvec::sqrt(rsq); + LennardJonesPathAIREBOT testpath[fvec::VL]; + fvec cij = c_1_0; + fvec p_cut3rebo = fvec::set1(ka->params.cut3rebo); + bvec need_search = fvec::mask_cmplt(current_mask, rij, p_cut3rebo); + if (bvec::test_any_set(need_search)) { + fvec p_rcmax = fvec::mask_blend(jtype_mask, p_rcmax0, p_rcmax1); + #pragma noinline + cij = aut_airebo_lj_tap_test_path(ka, &test_path_result, need_search, + i_bc, j, testpath); + } + current_mask = fvec::mask_cmplt(current_mask, c_0_0, cij); + if (bvec::test_all_unset(current_mask)) { + jj += fvec::VL; + rest_j = jj < jnum; + continue; + } + bvec need_path_force = fvec::mask_cmplt(current_mask, cij, c_1_0); + + fvec p_rljmax = fvec::mask_blend(jtype_mask, p_rljmax0, p_rljmax1); + fvec p_rljmin = fvec::mask_blend(jtype_mask, p_rljmin0, p_rljmin1); + + fvec dslw, slw = aut_Sp2_deriv(rij, p_rljmin, p_rljmax, &dslw); + + fvec p_lj1 = fvec::mask_blend(jtype_mask, p_lj10, p_lj11); + fvec p_lj2 = fvec::mask_blend(jtype_mask, p_lj20, p_lj21); + fvec p_lj3 = fvec::mask_blend(jtype_mask, p_lj30, p_lj31); + fvec p_lj4 = fvec::mask_blend(jtype_mask, p_lj40, p_lj41); + + fvec vdw, dvdw; + + fvec r2inv = fvec::recip(rsq); + + if (MORSEFLAG) { + fvec exr = fvec::exp(fvec::setzero() - rij * p_lj4); + vdw = p_lj1 * exr * (p_lj2 * exr - c_2_0); + dvdw = p_lj3 * exr * (c_1_0 - p_lj2 * exr); + } else { + fvec r6inv = r2inv * r2inv * r2inv; + + vdw = r6inv * ( p_lj3 * r6inv - p_lj4); + fvec r7inv = r6inv * rij * r2inv; + dvdw = r7inv * ( p_lj2 - p_lj1 * r6inv); + } + + fvec VLJ = vdw * slw; + fvec dVLJ = dvdw * slw + vdw * dslw; + + fvec p_rcLJmin = fvec::mask_blend(jtype_mask, p_rcLJmin0, p_rcLJmin1); + fvec p_rcLJmax = fvec::mask_blend(jtype_mask, p_rcLJmax0, p_rcLJmax1); + fvec dStr, Str = aut_Sp2_deriv(rij, p_rcLJmin, p_rcLJmax, &dStr); + fvec VA = cij * VLJ * Str; + bvec need_bondorder = fvec::mask_cmplt(current_mask, c_0_0, Str); + fvec Stb = fvec::setzero(); + fvec fij[3]; + fij[0] = fvec::setzero(); + fij[1] = fvec::setzero(); + fij[2] = fvec::setzero(); + if (bvec::test_any_set(need_bondorder)) { + for (int jtype = 0; jtype < 2; jtype++) { + bvec need_bo_with_jtype = need_bondorder; + if (jtype) need_bo_with_jtype = need_bo_with_jtype & jtype_mask; + else need_bo_with_jtype = need_bo_with_jtype & ~ jtype_mask; + ivec jtmp = ivec::masku_compress(need_bo_with_jtype, j); + ivec itmp = ivec::masku_compress(need_bo_with_jtype, ivec::set1(i)); + fvec cijtmp = fvec::masku_compress(need_bo_with_jtype, cij); + bvec insert_mask = bvec::after(num_bo[itype][jtype]); + i_bo[itype][jtype] = ivec::mask_expand(i_bo[itype][jtype], + insert_mask, itmp); + j_bo[itype][jtype] = ivec::mask_expand(j_bo[itype][jtype], + insert_mask, jtmp); + cij_bo[itype][jtype] = fvec::mask_expand(cij_bo[itype][jtype], + insert_mask, cijtmp); + bvec need_path_force_with_jtype = need_bo_with_jtype & + need_path_force; + int testpath_end = fvec::VL; + if (bvec::test_any_set(need_path_force_with_jtype)) { + int pos = num_bo[itype][jtype]; + for (int l = 0; l < fvec::VL; l++) { + if (pos >= fvec::VL) { + testpath_end = l; + break; + } + if (bvec::test_at(need_path_force_with_jtype, l)) { + testpath_bo[itype][jtype][pos] = testpath[l]; + } + if (bvec::test_at(need_bo_with_jtype, l)) { + pos += 1; + } + } + } + num_bo[itype][jtype] = num_bo[itype][jtype] + + bvec::popcnt(need_bo_with_jtype); + if (num_bo[itype][jtype] >= fvec::VL) { + #pragma noinline + aut_lj_with_bo(ka, itype, jtype, i_bo[itype][jtype], + j_bo[itype][jtype], cij_bo[itype][jtype], + testpath_bo[itype][jtype]); + num_bo[itype][jtype] -= fvec::VL; + insert_mask = bvec::onlyafter(num_bo[itype][jtype], + bvec::popcnt(need_bo_with_jtype) - + num_bo[itype][jtype]); + i_bo[itype][jtype] = ivec::masku_compress(insert_mask, itmp); + j_bo[itype][jtype] = ivec::masku_compress(insert_mask, jtmp); + cij_bo[itype][jtype] = fvec::masku_compress(insert_mask, cijtmp); + if (bvec::test_any_set(need_path_force_with_jtype)) { + int pos = 0; + for (int l = testpath_end; l < fvec::VL; l++) { + if (bvec::test_at(need_path_force_with_jtype, l)) { + testpath_bo[itype][jtype][pos] = testpath[l]; + } + if (bvec::test_at(need_bo_with_jtype, l)) { + pos += 1; + } + } + } + } + } + current_mask = current_mask & ~ need_bondorder; + need_path_force = need_path_force & ~ need_bondorder; + } + + fvec fpdVLJ = cij * dVLJ * ( c_1_0 + Str * ( Stb - c_1_0)); + fvec fpdStr = dStr * cij * ( Stb * VLJ - VLJ); + fvec fpair = r2inv * rij * ( fvec::setzero() - ( fpdVLJ + fpdStr)); + fvec evdwl = VA * Stb + cij * VLJ * ( c_1_0 - Str); + + fvec fix = fpair * delx + fij[0]; + fvec fiy = fpair * dely + fij[1]; + fvec fiz = fpair * delz + fij[2]; + result_f_i_x = fvec::mask_add(result_f_i_x, current_mask, result_f_i_x, + fix); + result_f_i_y = fvec::mask_add(result_f_i_y, current_mask, result_f_i_y, + fiy); + result_f_i_z = fvec::mask_add(result_f_i_z, current_mask, result_f_i_z, + fiz); + result_eng = fvec::mask_add(result_eng, current_mask, result_eng, evdwl); + + ivec j_dbl_idx = ivec::mullo(j, c_i4); + avec fjx = avec::mask_gather(avec::undefined(), current_mask, j_dbl_idx, + &ka->result_f[0].x, sizeof(acc_t)); + avec fjy = avec::mask_gather(avec::undefined(), current_mask, j_dbl_idx, + &ka->result_f[0].y, sizeof(acc_t)); + avec fjz = avec::mask_gather(avec::undefined(), current_mask, j_dbl_idx, + &ka->result_f[0].z, sizeof(acc_t)); + + fjx = fjx - fix; + fjy = fjy - fiy; + fjz = fjz - fiz; + avec::mask_i32loscatter(&ka->result_f[0].x, current_mask, j_dbl_idx, fjx, + sizeof(acc_t)); + avec::mask_i32loscatter(&ka->result_f[0].y, current_mask, j_dbl_idx, fjy, + sizeof(acc_t)); + avec::mask_i32loscatter(&ka->result_f[0].z, current_mask, j_dbl_idx, fjz, + sizeof(acc_t)); + + if (bvec::test_any_set(need_path_force)) { + fvec dC = VLJ * ( Str * Stb + c_1_0 - Str); + #pragma noinline + aut_airebo_lj_force_path(ka, need_path_force, dC, testpath); + } + jj += fvec::VL; + rest_j = jj < jnum; + } + ka->result_f[i].x += fvec::reduce_add(result_f_i_x); + ka->result_f[i].y += fvec::reduce_add(result_f_i_y); + ka->result_f[i].z += fvec::reduce_add(result_f_i_z); + } + for (int itype = 0; itype < 2; itype++) { + for (int jtype = 0; jtype < 2; jtype++) { + for (int l = 0; l < num_bo[itype][jtype]; l++) { + ref_lennard_jones_single_interaction(ka,ivec::at(i_bo[itype][jtype],l), + ivec::at(j_bo[itype][jtype], l), + MORSEFLAG); + } + } + } + ka->result_eng += fvec::reduce_add(result_eng); +} + +}; + +template +void aut_lennard_jones(KernelArgsAIREBOT * ka, int morseflag) { +#ifdef LMP_INTEL_AIREBO_REF + ref_lennard_jones(ka, morseflag); +#else + if (morseflag) { + aut_wrap::template aut_lennard_jones<1>(ka); + } else { + aut_wrap::template aut_lennard_jones<0>(ka); + } +#endif +} + +template +void aut_rebo_neigh(KernelArgsAIREBOT * ka) { +#ifdef LMP_INTEL_AIREBO_REF + ref_rebo_neigh(ka); +#else + aut_wrap::aut_rebo_neigh(ka); +#endif +} + +template +void aut_frebo(KernelArgsAIREBOT * ka, int torsion_flag) { +#ifdef LMP_INTEL_AIREBO_REF + ref_frebo(ka, torsion_flag); +#else + aut_wrap::aut_frebo(ka, torsion_flag); +#endif +} + +#ifdef __INTEL_OFFLOAD +#pragma offload_attribute(pop) +#endif + +} + diff --git a/src/USER-INTEL/pair_airebo_intel.h b/src/USER-INTEL/pair_airebo_intel.h new file mode 100644 index 0000000000..d3179c09f1 --- /dev/null +++ b/src/USER-INTEL/pair_airebo_intel.h @@ -0,0 +1,110 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Markus Hohnerbach (RWTH) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(airebo/intel,PairAIREBOIntel) + +#else + +#ifndef LMP_PAIR_AIREBO_INTEL_H +#define LMP_PAIR_AIREBO_INTEL_H + +#include "pair.h" +#include "fix_intel.h" +#include "pair_airebo.h" +//#include "airebo_common.h" + +namespace LAMMPS_NS { + +template +struct PairAIREBOIntelParam; + +class PairAIREBOIntel : public PairAIREBO { + public: + PairAIREBOIntel(class LAMMPS *); + virtual ~PairAIREBOIntel(); + virtual void compute(int, int); + virtual void init_style(); + protected: + + template + void compute(int eflag, int vflag, IntelBuffers *buffers); + + template + void eval(const int offload, const int vflag, + IntelBuffers * buffers, + const int astart, const int aend); + + template + void pack_force_const(IntelBuffers * buffers); + + template + PairAIREBOIntelParam get_param(); + + FixIntel * fix; + int _cop; + + int * REBO_cnumneigh; + int * REBO_num_skin; + int * REBO_list_data; + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair style AIREBO requires atom IDs + +This is a requirement to use the AIREBO potential. + +E: Pair style AIREBO requires newton pair on + +See the newton command. This is a restriction to use the AIREBO +potential. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Neighbor list overflow, boost neigh_modify one + +There are too many neighbors of a single atom. Use the neigh_modify +command to increase the max number of neighbors allowed for one atom. +You may also want to boost the page size. + +E: Cannot open AIREBO potential file %s + +The specified AIREBO potential file cannot be opened. Check that the +path and name are correct. + +*/ diff --git a/src/USER-INTEL/pair_airebo_morse_intel.cpp b/src/USER-INTEL/pair_airebo_morse_intel.cpp new file mode 100644 index 0000000000..9c0f3b8ed0 --- /dev/null +++ b/src/USER-INTEL/pair_airebo_morse_intel.cpp @@ -0,0 +1,37 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Markus Hohnerbach (RWTH) +------------------------------------------------------------------------- */ + +#include "pair_airebo_morse_intel.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairAIREBOMorseIntel::PairAIREBOMorseIntel(LAMMPS *lmp) + : PairAIREBOIntel(lmp) {} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairAIREBOMorseIntel::settings(int narg, char **arg) +{ + PairAIREBOIntel::settings(narg,arg); + + morseflag = 1; +} diff --git a/src/USER-INTEL/pair_airebo_morse_intel.h b/src/USER-INTEL/pair_airebo_morse_intel.h new file mode 100644 index 0000000000..5210ea80ee --- /dev/null +++ b/src/USER-INTEL/pair_airebo_morse_intel.h @@ -0,0 +1,40 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Markus Hohnerbach (RWTH) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(airebo/morse/intel,PairAIREBOMorseIntel) + +#else + +#ifndef LMP_PAIR_AIREBO_MORSE_INTEL_H +#define LMP_PAIR_AIREBO_MORSE_INTEL_H + +#include "pair_airebo_intel.h" + +namespace LAMMPS_NS { + +class PairAIREBOMorseIntel : public PairAIREBOIntel { + public: + PairAIREBOMorseIntel(class LAMMPS *); + virtual void settings(int, char **); +}; + +} + +#endif +#endif diff --git a/src/USER-INTEL/pair_buck_coul_cut_intel.cpp b/src/USER-INTEL/pair_buck_coul_cut_intel.cpp index 07beae1e41..e32fd06660 100644 --- a/src/USER-INTEL/pair_buck_coul_cut_intel.cpp +++ b/src/USER-INTEL/pair_buck_coul_cut_intel.cpp @@ -458,8 +458,8 @@ void PairBuckCoulCutIntel::pack_force_const(ForceConst &fc, fc.special_lj[0] = 1.0; } - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { fc.c_cut[i][j].cutsq = cutsq[i][j]; fc.c_cut[i][j].cut_ljsq = cut_ljsq[i][j]; fc.c_cut[i][j].cut_coulsq = cut_coulsq[i][j]; diff --git a/src/USER-INTEL/pair_buck_coul_long_intel.cpp b/src/USER-INTEL/pair_buck_coul_long_intel.cpp index 995e2e8583..2b9fea7a50 100644 --- a/src/USER-INTEL/pair_buck_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_buck_coul_long_intel.cpp @@ -545,8 +545,8 @@ void PairBuckCoulLongIntel::pack_force_const(ForceConst &fc, fc.special_lj[0] = 1.0; } - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { if (cutsq[i][j] < cut_ljsq[i][j]) error->all(FLERR, "Intel variant of lj/buck/coul/long expects lj cutoff<=coulombic"); diff --git a/src/USER-INTEL/pair_buck_intel.cpp b/src/USER-INTEL/pair_buck_intel.cpp index 8c63d2e62d..05a28eb7f0 100644 --- a/src/USER-INTEL/pair_buck_intel.cpp +++ b/src/USER-INTEL/pair_buck_intel.cpp @@ -413,8 +413,8 @@ void PairBuckIntel::pack_force_const(ForceConst &fc, fc.special_lj[0] = 1.0; } - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { fc.c_force[i][j].buck1 = buck1[i][j]; fc.c_force[i][j].buck2 = buck2[i][j]; fc.c_force[i][j].rhoinv = rhoinv[i][j]; diff --git a/src/USER-INTEL/pair_dpd_intel.cpp b/src/USER-INTEL/pair_dpd_intel.cpp new file mode 100644 index 0000000000..09f27504a1 --- /dev/null +++ b/src/USER-INTEL/pair_dpd_intel.cpp @@ -0,0 +1,617 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + This software is distributed under the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: W. Michael Brown (Intel) + Shun Xu (Computer Network Information Center, CAS) +------------------------------------------------------------------------- */ + +#include +#include "pair_dpd_intel.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "suffix.h" +using namespace LAMMPS_NS; + +#define LMP_MKL_RNG VSL_BRNG_MT19937 +#define FC_PACKED1_T typename ForceConst::fc_packed1 +#define IEPSILON 1.0e10 + +/* ---------------------------------------------------------------------- */ + +PairDPDIntel::PairDPDIntel(LAMMPS *lmp) : + PairDPD(lmp) +{ + suffix_flag |= Suffix::INTEL; + respa_enable = 0; + random_thread = NULL; + _nrandom_thread = 0; +} + +/* ---------------------------------------------------------------------- */ + +PairDPDIntel::~PairDPDIntel() +{ + #if defined(_OPENMP) + if (_nrandom_thread) { + #ifdef LMP_USE_MKL_RNG + for (int i = 0; i < _nrandom_thread; i++) + vslDeleteStream(&random_thread[i]); + #else + for (int i = 1; i < _nrandom_thread; i++) + delete random_thread[i]; + #endif + } + #endif + delete []random_thread; +} + +/* ---------------------------------------------------------------------- */ + +void PairDPDIntel::compute(int eflag, int vflag) +{ + if (fix->precision() == FixIntel::PREC_MODE_MIXED) + compute(eflag, vflag, fix->get_mixed_buffers(), + force_const_single); + else if (fix->precision() == FixIntel::PREC_MODE_DOUBLE) + compute(eflag, vflag, fix->get_double_buffers(), + force_const_double); + else + compute(eflag, vflag, fix->get_single_buffers(), + force_const_single); + + fix->balance_stamp(); + vflag_fdotr = 0; +} + +template +void PairDPDIntel::compute(int eflag, int vflag, + IntelBuffers *buffers, + const ForceConst &fc) +{ + if (eflag || vflag) { + ev_setup(eflag, vflag); + } else evflag = vflag_fdotr = 0; + + const int inum = list->inum; + const int nthreads = comm->nthreads; + const int host_start = fix->host_start_pair(); + const int offload_end = fix->offload_end_pair(); + const int ago = neighbor->ago; + + if (ago != 0 && fix->separate_buffers() == 0) { + fix->start_watch(TIME_PACK); + + int packthreads; + if (nthreads > INTEL_HTHREADS) packthreads = nthreads; + else packthreads = 1; + #if defined(_OPENMP) + #pragma omp parallel if(packthreads > 1) + #endif + { + int ifrom, ito, tid; + IP_PRE_omp_range_id_align(ifrom, ito, tid, atom->nlocal + atom->nghost, + packthreads, sizeof(ATOM_T)); + buffers->thr_pack(ifrom,ito,ago); + } + fix->stop_watch(TIME_PACK); + } + + int ovflag = 0; + if (vflag_fdotr) ovflag = 2; + else if (vflag) ovflag = 1; + if (_onetype) { + if (eflag) { + if (force->newton_pair) { + eval<1,1,1>(1, ovflag, buffers, fc, 0, offload_end); + eval<1,1,1>(0, ovflag, buffers, fc, host_start, inum); + } else { + eval<1,1,0>(1, ovflag, buffers, fc, 0, offload_end); + eval<1,1,0>(0, ovflag, buffers, fc, host_start, inum); + } + } else { + if (force->newton_pair) { + eval<1,0,1>(1, ovflag, buffers, fc, 0, offload_end); + eval<1,0,1>(0, ovflag, buffers, fc, host_start, inum); + } else { + eval<1,0,0>(1, ovflag, buffers, fc, 0, offload_end); + eval<1,0,0>(0, ovflag, buffers, fc, host_start, inum); + } + } + } else { + if (eflag) { + if (force->newton_pair) { + eval<0,1,1>(1, ovflag, buffers, fc, 0, offload_end); + eval<0,1,1>(0, ovflag, buffers, fc, host_start, inum); + } else { + eval<0,1,0>(1, ovflag, buffers, fc, 0, offload_end); + eval<0,1,0>(0, ovflag, buffers, fc, host_start, inum); + } + } else { + if (force->newton_pair) { + eval<0,0,1>(1, ovflag, buffers, fc, 0, offload_end); + eval<0,0,1>(0, ovflag, buffers, fc, host_start, inum); + } else { + eval<0,0,0>(1, ovflag, buffers, fc, 0, offload_end); + eval<0,0,0>(0, ovflag, buffers, fc, host_start, inum); + } + } + } +} + +template +void PairDPDIntel::eval(const int offload, const int vflag, + IntelBuffers *buffers, + const ForceConst &fc, + const int astart, const int aend) +{ + const int inum = aend - astart; + if (inum == 0) return; + int nlocal, nall, minlocal; + fix->get_buffern(offload, nlocal, nall, minlocal); + + const int ago = neighbor->ago; + IP_PRE_pack_separate_buffers(fix, buffers, ago, offload, nlocal, nall); + + ATOM_T * _noalias const x = buffers->get_x(offload); + typedef struct { double x, y, z; } lmp_vt; + lmp_vt *v = (lmp_vt *)atom->v[0]; + const flt_t dtinvsqrt = 1.0/sqrt(update->dt); + + const int * _noalias const numneigh = list->numneigh; + const int * _noalias const cnumneigh = buffers->cnumneigh(list); + const int * _noalias const firstneigh = buffers->firstneigh(list); + const FC_PACKED1_T * _noalias const param = fc.param[0]; + const flt_t * _noalias const special_lj = fc.special_lj; + int * _noalias const rngi_thread = fc.rngi; + const int rng_size = buffers->get_max_nbors(); + + const int ntypes = atom->ntypes + 1; + const int eatom = this->eflag_atom; + + // Determine how much data to transfer + int x_size, q_size, f_stride, ev_size, separate_flag; + IP_PRE_get_transfern(ago, NEWTON_PAIR, EFLAG, vflag, + buffers, offload, fix, separate_flag, + x_size, q_size, ev_size, f_stride); + + int tc; + FORCE_T * _noalias f_start; + acc_t * _noalias ev_global; + IP_PRE_get_buffers(offload, buffers, fix, tc, f_start, ev_global); + const int nthreads = tc; + int *overflow = fix->get_off_overflow_flag(); + { + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime(); + #endif + + IP_PRE_repack_for_offload(NEWTON_PAIR, separate_flag, nlocal, nall, + f_stride, x, 0); + + acc_t oevdwl, ov0, ov1, ov2, ov3, ov4, ov5; + if (EFLAG) oevdwl = (acc_t)0; + if (vflag) ov0 = ov1 = ov2 = ov3 = ov4 = ov5 = (acc_t)0; + + // loop over neighbors of my atoms + #if defined(_OPENMP) + #pragma omp parallel reduction(+:oevdwl,ov0,ov1,ov2,ov3,ov4,ov5) + #endif + { + int iifrom, iip, iito, tid; + IP_PRE_omp_stride_id(iifrom, iip, iito, tid, inum, nthreads); + iifrom += astart; + iito += astart; + + #ifdef LMP_USE_MKL_RNG + VSLStreamStatePtr *my_random = &(random_thread[tid]); + #else + RanMars *my_random = random_thread[tid]; + #endif + flt_t *my_rand_buffer = fc.rand_buffer_thread[tid]; + int rngi = rngi_thread[tid]; + + int foff; + if (NEWTON_PAIR) foff = tid * f_stride - minlocal; + else foff = -minlocal; + FORCE_T * _noalias const f = f_start + foff; + if (NEWTON_PAIR) memset(f + minlocal, 0, f_stride * sizeof(FORCE_T)); + + flt_t icut, a0, gamma, sigma; + if (ONETYPE) { + icut = param[3].icut; + a0 = param[3].a0; + gamma = param[3].gamma; + sigma = param[3].sigma; + } + for (int i = iifrom; i < iito; i += iip) { + int itype, ptr_off; + const FC_PACKED1_T * _noalias parami; + if (!ONETYPE) { + itype = x[i].w; + ptr_off = itype * ntypes; + parami = param + ptr_off; + } + + const int * _noalias const jlist = firstneigh + cnumneigh[i]; + const int jnum = numneigh[i]; + + acc_t fxtmp, fytmp, fztmp, fwtmp; + acc_t sevdwl, sv0, sv1, sv2, sv3, sv4, sv5; + + const flt_t xtmp = x[i].x; + const flt_t ytmp = x[i].y; + const flt_t ztmp = x[i].z; + const flt_t vxtmp = v[i].x; + const flt_t vytmp = v[i].y; + const flt_t vztmp = v[i].z; + fxtmp = fytmp = fztmp = (acc_t)0; + if (EFLAG) fwtmp = sevdwl = (acc_t)0; + if (NEWTON_PAIR == 0) + if (vflag==1) sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; + + if (rngi + jnum > rng_size) { + #ifdef LMP_USE_MKL_RNG + if (sizeof(flt_t) == sizeof(float)) + vsRngGaussian(VSL_RNG_METHOD_GAUSSIAN_ICDF, *my_random, rngi, + (float*)my_rand_buffer, (float)0.0, (float)1.0 ); + else + vdRngGaussian(VSL_RNG_METHOD_GAUSSIAN_ICDF, *my_random, rngi, + (double*)my_rand_buffer, 0.0, 1.0 ); + #else + for (int jj = 0; jj < rngi; jj++) + my_rand_buffer[jj] = my_random->gaussian(); + #endif + rngi = 0; + } + + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + sv0, sv1, sv2, sv3, sv4, sv5) + #endif + for (int jj = 0; jj < jnum; jj++) { + flt_t forcelj, evdwl; + forcelj = evdwl = (flt_t)0.0; + + int j, jtype, sbindex; + if (!ONETYPE) { + sbindex = jlist[jj] >> SBBITS & 3; + j = jlist[jj] & NEIGHMASK; + } else + j = jlist[jj]; + + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + if (!ONETYPE) { + jtype = x[j].w; + icut = parami[jtype].icut; + } + const flt_t rsq = delx * delx + dely * dely + delz * delz; + const flt_t rinv = (flt_t)1.0/sqrt(rsq); + + if (rinv > icut) { + flt_t factor_dpd; + if (!ONETYPE) factor_dpd = special_lj[sbindex]; + + flt_t delvx = vxtmp - v[j].x; + flt_t delvy = vytmp - v[j].y; + flt_t delvz = vztmp - v[j].z; + flt_t dot = delx*delvx + dely*delvy + delz*delvz; + flt_t randnum = my_rand_buffer[jj]; + + flt_t iwd = rinv - icut; + if (rinv > (flt_t)IEPSILON) iwd = (flt_t)0.0; + + if (!ONETYPE) { + a0 = parami[jtype].a0; + gamma = parami[jtype].gamma; + sigma = parami[jtype].sigma; + } + flt_t fpair = a0 - iwd * gamma * dot + sigma * randnum * dtinvsqrt; + if (!ONETYPE) fpair *= factor_dpd; + fpair *= iwd; + + const flt_t fpx = fpair * delx; + fxtmp += fpx; + if (NEWTON_PAIR) f[j].x -= fpx; + const flt_t fpy = fpair * dely; + fytmp += fpy; + if (NEWTON_PAIR) f[j].y -= fpy; + const flt_t fpz = fpair * delz; + fztmp += fpz; + if (NEWTON_PAIR) f[j].z -= fpz; + + if (EFLAG) { + flt_t cut = (flt_t)1.0/icut; + flt_t r = (flt_t)1.0/rinv; + evdwl = (flt_t)0.5 * a0 * (cut - (flt_t)2.0*r + rsq * icut); + if (!ONETYPE) evdwl *= factor_dpd; + sevdwl += evdwl; + if (eatom) { + fwtmp += (flt_t)0.5 * evdwl; + if (NEWTON_PAIR) + f[j].w += (flt_t)0.5 * evdwl; + } + } + + if (NEWTON_PAIR == 0) + IP_PRE_ev_tally_nborv(vflag, delx, dely, delz, fpx, fpy, fpz); + } // if rsq + } // for jj + if (NEWTON_PAIR) { + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; + } else { + f[i].x = fxtmp; + f[i].y = fytmp; + f[i].z = fztmp; + } + + IP_PRE_ev_tally_atom(NEWTON_PAIR, EFLAG, vflag, f, fwtmp); + rngi += jnum; + } // for ii + + IP_PRE_fdotr_reduce_omp(NEWTON_PAIR, nall, minlocal, nthreads, f_start, + f_stride, x, offload, vflag, ov0, ov1, ov2, ov3, + ov4, ov5); + rngi_thread[tid] = rngi; + } // end omp + + IP_PRE_fdotr_reduce(NEWTON_PAIR, nall, nthreads, f_stride, vflag, + ov0, ov1, ov2, ov3, ov4, ov5); + + if (EFLAG) { + if (NEWTON_PAIR == 0) oevdwl *= (acc_t)0.5; + ev_global[0] = oevdwl; + ev_global[1] = (acc_t)0.0; + } + if (vflag) { + if (NEWTON_PAIR == 0) { + ov0 *= (acc_t)0.5; + ov1 *= (acc_t)0.5; + ov2 *= (acc_t)0.5; + ov3 *= (acc_t)0.5; + ov4 *= (acc_t)0.5; + ov5 *= (acc_t)0.5; + } + ev_global[2] = ov0; + ev_global[3] = ov1; + ev_global[4] = ov2; + ev_global[5] = ov3; + ev_global[6] = ov4; + ev_global[7] = ov5; + } + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime() - *timer_compute; + #endif + } // end offload + + if (offload) + fix->stop_watch(TIME_OFFLOAD_LATENCY); + else + fix->stop_watch(TIME_HOST_PAIR); + + if (EFLAG || vflag) + fix->add_result_array(f_start, ev_global, offload, eatom, 0, vflag); + else + fix->add_result_array(f_start, 0, offload); +} + +/* ---------------------------------------------------------------------- + global settings + ------------------------------------------------------------------------- */ + +void PairDPDIntel::settings(int narg, char **arg) { + #if defined(_OPENMP) + if (_nrandom_thread) { + #ifdef LMP_USE_MKL_RNG + for (int i = 0; i < _nrandom_thread; i++) + vslDeleteStream(&random_thread[i]); + #else + for (int i = 1; i < _nrandom_thread; i++) + delete random_thread[i]; + #endif + } + delete []random_thread; + #endif + PairDPD::settings(narg,arg); + _nrandom_thread = comm->nthreads; + + #ifdef LMP_USE_MKL_RNG + + random_thread=new VSLStreamStatePtr[comm->nthreads]; + #if defined(_OPENMP) + #pragma omp parallel + { + int tid = omp_get_thread_num(); + vslNewStream(&random_thread[tid], LMP_MKL_RNG, + seed + comm->me + comm->nprocs * tid ); + } + #endif + + #else + + random_thread =new RanMars*[comm->nthreads]; + random_thread[0] = random; + #if defined(_OPENMP) + #pragma omp parallel + { + int tid = omp_get_thread_num(); + if (tid > 0) + random_thread[tid] = new RanMars(lmp, seed+comm->me+comm->nprocs*tid); + } + #endif + + #endif +} + +/* ---------------------------------------------------------------------- */ + +void PairDPDIntel::init_style() +{ + PairDPD::init_style(); + if (force->newton_pair == 0) { + neighbor->requests[neighbor->nrequest-1]->half = 0; + neighbor->requests[neighbor->nrequest-1]->full = 1; + } + neighbor->requests[neighbor->nrequest-1]->intel = 1; + + int ifix = modify->find_fix("package_intel"); + if (ifix < 0) + error->all(FLERR, + "The 'package intel' command is required for /intel styles"); + fix = static_cast(modify->fix[ifix]); + + fix->pair_init_check(); + #ifdef _LMP_INTEL_OFFLOAD + if (fix->offload_balance() != 0.0) + error->all(FLERR, + "Offload for dpd/intel is not yet available. Set balance to 0."); + #endif + + if (fix->precision() == FixIntel::PREC_MODE_MIXED) + pack_force_const(force_const_single, fix->get_mixed_buffers()); + else if (fix->precision() == FixIntel::PREC_MODE_DOUBLE) + pack_force_const(force_const_double, fix->get_double_buffers()); + else + pack_force_const(force_const_single, fix->get_single_buffers()); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairDPDIntel::pack_force_const(ForceConst &fc, + IntelBuffers *buffers) +{ + _onetype = 0; + if (atom->ntypes == 1 && !atom->molecular) _onetype = 1; + + int tp1 = atom->ntypes + 1; + fc.set_ntypes(tp1,comm->nthreads,buffers->get_max_nbors(),memory,_cop); + buffers->set_ntypes(tp1); + flt_t **cutneighsq = buffers->get_cutneighsq(); + + // Repeat cutsq calculation because done after call to init_style + double cut, cutneigh; + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { + if (setflag[i][j] != 0 || (setflag[i][i] != 0 && setflag[j][j] != 0)) { + cut = init_one(i,j); + cutneigh = cut + neighbor->skin; + cutsq[i][j] = cutsq[j][i] = cut*cut; + cutneighsq[i][j] = cutneighsq[j][i] = cutneigh * cutneigh; + double icut = 1.0 / cut; + fc.param[i][j].icut = fc.param[j][i].icut = icut; + } else { + cut = init_one(i,j); + double icut = 1.0 / cut; + fc.param[i][j].icut = fc.param[j][i].icut = icut; + } + } + } + + for (int i = 0; i < 4; i++) { + fc.special_lj[i] = force->special_lj[i]; + fc.special_lj[0] = 1.0; + } + + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { + fc.param[i][j].a0 = a0[i][j]; + fc.param[i][j].gamma = gamma[i][j]; + fc.param[i][j].sigma = sigma[i][j]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairDPDIntel::ForceConst::set_ntypes(const int ntypes, + const int nthreads, + const int max_nbors, + Memory *memory, + const int cop) { + if (ntypes != _ntypes) { + if (_ntypes > 0) { + _memory->destroy(param); + _memory->destroy(rand_buffer_thread); + _memory->destroy(rngi); + } + if (ntypes > 0) { + _cop = cop; + memory->create(param,ntypes,ntypes,"fc.param"); + memory->create(rand_buffer_thread, nthreads, max_nbors, + "fc.rand_buffer_thread"); + memory->create(rngi,nthreads,"fc.param"); + for (int i = 0; i < nthreads; i++) rngi[i] = max_nbors; + } + } + _ntypes = ntypes; + _memory = memory; +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void PairDPDIntel::read_restart_settings(FILE *fp) +{ + #if defined(_OPENMP) + if (_nrandom_thread) { + #ifdef LMP_USE_MKL_RNG + for (int i = 0; i < _nrandom_thread; i++) + vslDeleteStream(&random_thread[i]); + #else + for (int i = 1; i < _nrandom_thread; i++) + delete random_thread[i]; + #endif + } + delete []random_thread; + #endif + PairDPD::read_restart_settings(fp); + _nrandom_thread = comm->nthreads; + + #ifdef LMP_USE_MKL_RNG + + random_thread=new VSLStreamStatePtr[comm->nthreads]; + #if defined(_OPENMP) + #pragma omp parallel + { + int tid = omp_get_thread_num(); + vslNewStream(&random_thread[tid], LMP_MKL_RNG, + seed + comm->me + comm->nprocs * tid ); + } + #endif + + #else + + random_thread =new RanMars*[comm->nthreads]; + random_thread[0] = random; + #if defined(_OPENMP) + #pragma omp parallel + { + int tid = omp_get_thread_num(); + if (tid > 0) + random_thread[tid] = new RanMars(lmp, seed+comm->me+comm->nprocs*tid); + } + #endif + + #endif +} diff --git a/src/USER-INTEL/pair_dpd_intel.h b/src/USER-INTEL/pair_dpd_intel.h new file mode 100644 index 0000000000..416d873c00 --- /dev/null +++ b/src/USER-INTEL/pair_dpd_intel.h @@ -0,0 +1,110 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: W. Michael Brown (Intel) + Shun Xu (Computer Network Information Center, CAS) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(dpd/intel,PairDPDIntel) + +#else + +#ifndef LMP_PAIR_DPD_INTEL_H +#define LMP_PAIR_DPD_INTEL_H + +#include "pair_dpd.h" +#include "fix_intel.h" + +#ifdef LMP_USE_MKL_RNG +#include "mkl_vsl.h" +#else +#include "random_mars.h" +#endif + +namespace LAMMPS_NS { + +class PairDPDIntel : public PairDPD { + + public: + PairDPDIntel(class LAMMPS *); + ~PairDPDIntel(); + + virtual void compute(int, int); + void settings(int, char **); + void init_style(); + void read_restart_settings(FILE *); + + private: + FixIntel *fix; + int _cop, _onetype, _nrandom_thread; + + #ifdef LMP_USE_MKL_RNG + VSLStreamStatePtr *random_thread; + #else + RanMars **random_thread; + #endif + + template class ForceConst; + template + void compute(int eflag, int vflag, IntelBuffers *buffers, + const ForceConst &fc); + template + void eval(const int offload, const int vflag, + IntelBuffers * buffers, + const ForceConst &fc, const int astart, const int aend); + + template + void pack_force_const(ForceConst &fc, + IntelBuffers *buffers); + + // ---------------------------------------------------------------------- + + template + class ForceConst { + public: + typedef struct { flt_t icut, a0, gamma, sigma; } fc_packed1; + + _alignvar(flt_t special_lj[4],64); + fc_packed1 **param; + flt_t **rand_buffer_thread; + int *rngi; + + ForceConst() : _ntypes(0) {} + ~ForceConst() { set_ntypes(0, 0, 0, NULL, _cop); } + + void set_ntypes(const int ntypes, const int nthreads, const int max_nbors, + Memory *memory, const int cop); + + private: + int _ntypes, _cop; + Memory *_memory; + }; + ForceConst force_const_single; + ForceConst force_const_double; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: The 'package intel' command is required for /intel styles + +Self-explanatory. + +*/ diff --git a/src/USER-INTEL/pair_eam_alloy_intel.cpp b/src/USER-INTEL/pair_eam_alloy_intel.cpp new file mode 100644 index 0000000000..4f47c7ee23 --- /dev/null +++ b/src/USER-INTEL/pair_eam_alloy_intel.cpp @@ -0,0 +1,326 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Stephen Foiles (SNL), Murray Daw (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_eam_alloy_intel.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define MAXLINE 1024 + +/* ---------------------------------------------------------------------- */ + +PairEAMAlloyIntel::PairEAMAlloyIntel(LAMMPS *lmp) : PairEAMIntel(lmp) +{ + one_coeff = 1; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs + read DYNAMO setfl file +------------------------------------------------------------------------- */ + +void PairEAMAlloyIntel::coeff(int narg, char **arg) +{ + int i,j; + + if (!allocated) allocate(); + + if (narg != 3 + atom->ntypes) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // insure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // read EAM setfl file + + if (setfl) { + for (i = 0; i < setfl->nelements; i++) delete [] setfl->elements[i]; + delete [] setfl->elements; + delete [] setfl->mass; + memory->destroy(setfl->frho); + memory->destroy(setfl->rhor); + memory->destroy(setfl->z2r); + delete setfl; + } + setfl = new Setfl(); + read_file(arg[2]); + + // read args that map atom types to elements in potential file + // map[i] = which element the Ith atom type is, -1 if NULL + + for (i = 3; i < narg; i++) { + if (strcmp(arg[i],"NULL") == 0) { + map[i-2] = -1; + continue; + } + for (j = 0; j < setfl->nelements; j++) + if (strcmp(arg[i],setfl->elements[j]) == 0) break; + if (j < setfl->nelements) map[i-2] = j; + else error->all(FLERR,"No matching element in EAM potential file"); + } + + // clear setflag since coeff() called once with I,J = * * + + int n = atom->ntypes; + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + setflag[i][j] = 0; + + // set setflag i,j for type pairs where both are mapped to elements + // set mass of atom type if i = j + + int count = 0; + for (i = 1; i <= n; i++) { + for (j = i; j <= n; j++) { + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + if (i == j) atom->set_mass(FLERR,i,setfl->mass[map[i]]); + count++; + } + scale[i][j] = 1.0; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + read a multi-element DYNAMO setfl file +------------------------------------------------------------------------- */ + +void PairEAMAlloyIntel::read_file(char *filename) +{ + Setfl *file = setfl; + + // open potential file + + int me = comm->me; + FILE *fptr; + char line[MAXLINE]; + + if (me == 0) { + fptr = force->open_potential(filename); + if (fptr == NULL) { + char str[128]; + sprintf(str,"Cannot open EAM potential file %s",filename); + error->one(FLERR,str); + } + } + + // read and broadcast header + // extract element names from nelements line + + int n; + if (me == 0) { + fgets(line,MAXLINE,fptr); + fgets(line,MAXLINE,fptr); + fgets(line,MAXLINE,fptr); + fgets(line,MAXLINE,fptr); + n = strlen(line) + 1; + } + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + sscanf(line,"%d",&file->nelements); + int nwords = atom->count_words(line); + if (nwords != file->nelements + 1) + error->all(FLERR,"Incorrect element names in EAM potential file"); + + char **words = new char*[file->nelements+1]; + nwords = 0; + strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + file->elements = new char*[file->nelements]; + for (int i = 0; i < file->nelements; i++) { + n = strlen(words[i]) + 1; + file->elements[i] = new char[n]; + strcpy(file->elements[i],words[i]); + } + delete [] words; + + if (me == 0) { + fgets(line,MAXLINE,fptr); + sscanf(line,"%d %lg %d %lg %lg", + &file->nrho,&file->drho,&file->nr,&file->dr,&file->cut); + } + + MPI_Bcast(&file->nrho,1,MPI_INT,0,world); + MPI_Bcast(&file->drho,1,MPI_DOUBLE,0,world); + MPI_Bcast(&file->nr,1,MPI_INT,0,world); + MPI_Bcast(&file->dr,1,MPI_DOUBLE,0,world); + MPI_Bcast(&file->cut,1,MPI_DOUBLE,0,world); + + file->mass = new double[file->nelements]; + memory->create(file->frho,file->nelements,file->nrho+1,"pair:frho"); + memory->create(file->rhor,file->nelements,file->nr+1,"pair:rhor"); + memory->create(file->z2r,file->nelements,file->nelements,file->nr+1, + "pair:z2r"); + + int i,j,tmp; + for (i = 0; i < file->nelements; i++) { + if (me == 0) { + fgets(line,MAXLINE,fptr); + sscanf(line,"%d %lg",&tmp,&file->mass[i]); + } + MPI_Bcast(&file->mass[i],1,MPI_DOUBLE,0,world); + + if (me == 0) grab(fptr,file->nrho,&file->frho[i][1]); + MPI_Bcast(&file->frho[i][1],file->nrho,MPI_DOUBLE,0,world); + if (me == 0) grab(fptr,file->nr,&file->rhor[i][1]); + MPI_Bcast(&file->rhor[i][1],file->nr,MPI_DOUBLE,0,world); + } + + for (i = 0; i < file->nelements; i++) + for (j = 0; j <= i; j++) { + if (me == 0) grab(fptr,file->nr,&file->z2r[i][j][1]); + MPI_Bcast(&file->z2r[i][j][1],file->nr,MPI_DOUBLE,0,world); + } + + // close the potential file + + if (me == 0) fclose(fptr); +} + +/* ---------------------------------------------------------------------- + copy read-in setfl potential to standard array format +------------------------------------------------------------------------- */ + +void PairEAMAlloyIntel::file2array() +{ + int i,j,m,n; + int ntypes = atom->ntypes; + + // set function params directly from setfl file + + nrho = setfl->nrho; + nr = setfl->nr; + drho = setfl->drho; + dr = setfl->dr; + rhomax = (nrho-1) * drho; + + // ------------------------------------------------------------------ + // setup frho arrays + // ------------------------------------------------------------------ + + // allocate frho arrays + // nfrho = # of setfl elements + 1 for zero array + + nfrho = setfl->nelements + 1; + memory->destroy(frho); + memory->create(frho,nfrho,nrho+1,"pair:frho"); + + // copy each element's frho to global frho + + for (i = 0; i < setfl->nelements; i++) + for (m = 1; m <= nrho; m++) frho[i][m] = setfl->frho[i][m]; + + // add extra frho of zeroes for non-EAM types to point to (pair hybrid) + // this is necessary b/c fp is still computed for non-EAM atoms + + for (m = 1; m <= nrho; m++) frho[nfrho-1][m] = 0.0; + + // type2frho[i] = which frho array (0 to nfrho-1) each atom type maps to + // if atom type doesn't point to element (non-EAM atom in pair hybrid) + // then map it to last frho array of zeroes + + for (i = 1; i <= ntypes; i++) + if (map[i] >= 0) type2frho[i] = map[i]; + else type2frho[i] = nfrho-1; + + // ------------------------------------------------------------------ + // setup rhor arrays + // ------------------------------------------------------------------ + + // allocate rhor arrays + // nrhor = # of setfl elements + + nrhor = setfl->nelements; + memory->destroy(rhor); + memory->create(rhor,nrhor,nr+1,"pair:rhor"); + + // copy each element's rhor to global rhor + + for (i = 0; i < setfl->nelements; i++) + for (m = 1; m <= nr; m++) rhor[i][m] = setfl->rhor[i][m]; + + // type2rhor[i][j] = which rhor array (0 to nrhor-1) each type pair maps to + // for setfl files, I,J mapping only depends on I + // OK if map = -1 (non-EAM atom in pair hybrid) b/c type2rhor not used + + for (i = 1; i <= ntypes; i++) + for (j = 1; j <= ntypes; j++) + type2rhor[i][j] = map[i]; + + // ------------------------------------------------------------------ + // setup z2r arrays + // ------------------------------------------------------------------ + + // allocate z2r arrays + // nz2r = N*(N+1)/2 where N = # of setfl elements + + nz2r = setfl->nelements * (setfl->nelements+1) / 2; + memory->destroy(z2r); + memory->create(z2r,nz2r,nr+1,"pair:z2r"); + + // copy each element pair z2r to global z2r, only for I >= J + + n = 0; + for (i = 0; i < setfl->nelements; i++) + for (j = 0; j <= i; j++) { + for (m = 1; m <= nr; m++) z2r[n][m] = setfl->z2r[i][j][m]; + n++; + } + + // type2z2r[i][j] = which z2r array (0 to nz2r-1) each type pair maps to + // set of z2r arrays only fill lower triangular Nelement matrix + // value = n = sum over rows of lower-triangular matrix until reach irow,icol + // swap indices when irow < icol to stay lower triangular + // if map = -1 (non-EAM atom in pair hybrid): + // type2z2r is not used by non-opt + // but set type2z2r to 0 since accessed by opt + + int irow,icol; + for (i = 1; i <= ntypes; i++) { + for (j = 1; j <= ntypes; j++) { + irow = map[i]; + icol = map[j]; + if (irow == -1 || icol == -1) { + type2z2r[i][j] = 0; + continue; + } + if (irow < icol) { + irow = map[j]; + icol = map[i]; + } + n = 0; + for (m = 0; m < irow; m++) n += m + 1; + n += icol; + type2z2r[i][j] = n; + } + } +} diff --git a/src/USER-INTEL/pair_eam_alloy_intel.h b/src/USER-INTEL/pair_eam_alloy_intel.h new file mode 100644 index 0000000000..4967c3709d --- /dev/null +++ b/src/USER-INTEL/pair_eam_alloy_intel.h @@ -0,0 +1,43 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(eam/alloy/intel,PairEAMAlloyIntel) + +#else + +#ifndef LMP_PAIR_EAM_ALLOY_INTEL_H +#define LMP_PAIR_EAM_ALLOY_INTEL_H + +#include "pair_eam_intel.h" + +namespace LAMMPS_NS { + +// need virtual public b/c of how eam/alloy/opt inherits from it + +class PairEAMAlloyIntel : virtual public PairEAMIntel { + public: + PairEAMAlloyIntel(class LAMMPS *); + virtual ~PairEAMAlloyIntel() {} + void coeff(int, char **); + + protected: + void read_file(char *); + void file2array(); +}; + +} + +#endif +#endif diff --git a/src/USER-INTEL/pair_eam_fs_intel.cpp b/src/USER-INTEL/pair_eam_fs_intel.cpp new file mode 100644 index 0000000000..cfcc8200cc --- /dev/null +++ b/src/USER-INTEL/pair_eam_fs_intel.cpp @@ -0,0 +1,335 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Tim Lau (MIT) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_eam_fs_intel.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define MAXLINE 1024 + +/* ---------------------------------------------------------------------- */ + +PairEAMFSIntel::PairEAMFSIntel(LAMMPS *lmp) : PairEAMIntel(lmp) +{ + one_coeff = 1; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs + read EAM Finnis-Sinclair file +------------------------------------------------------------------------- */ + +void PairEAMFSIntel::coeff(int narg, char **arg) +{ + int i,j; + + if (!allocated) allocate(); + + if (narg != 3 + atom->ntypes) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // insure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // read EAM Finnis-Sinclair file + + if (fs) { + for (i = 0; i < fs->nelements; i++) delete [] fs->elements[i]; + delete [] fs->elements; + delete [] fs->mass; + memory->destroy(fs->frho); + memory->destroy(fs->rhor); + memory->destroy(fs->z2r); + delete fs; + } + fs = new Fs(); + read_file(arg[2]); + + // read args that map atom types to elements in potential file + // map[i] = which element the Ith atom type is, -1 if NULL + + for (i = 3; i < narg; i++) { + if (strcmp(arg[i],"NULL") == 0) { + map[i-2] = -1; + continue; + } + for (j = 0; j < fs->nelements; j++) + if (strcmp(arg[i],fs->elements[j]) == 0) break; + if (j < fs->nelements) map[i-2] = j; + else error->all(FLERR,"No matching element in EAM potential file"); + } + + // clear setflag since coeff() called once with I,J = * * + + int n = atom->ntypes; + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + setflag[i][j] = 0; + + // set setflag i,j for type pairs where both are mapped to elements + // set mass of atom type if i = j + + int count = 0; + for (i = 1; i <= n; i++) { + for (j = i; j <= n; j++) { + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + if (i == j) atom->set_mass(FLERR,i,fs->mass[map[i]]); + count++; + } + scale[i][j] = 1.0; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + read a multi-element DYNAMO setfl file +------------------------------------------------------------------------- */ + +void PairEAMFSIntel::read_file(char *filename) +{ + Fs *file = fs; + + // open potential file + + int me = comm->me; + FILE *fptr; + char line[MAXLINE]; + + if (me == 0) { + fptr = force->open_potential(filename); + if (fptr == NULL) { + char str[128]; + sprintf(str,"Cannot open EAM potential file %s",filename); + error->one(FLERR,str); + } + } + + // read and broadcast header + // extract element names from nelements line + + int n; + if (me == 0) { + fgets(line,MAXLINE,fptr); + fgets(line,MAXLINE,fptr); + fgets(line,MAXLINE,fptr); + fgets(line,MAXLINE,fptr); + n = strlen(line) + 1; + } + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + sscanf(line,"%d",&file->nelements); + int nwords = atom->count_words(line); + if (nwords != file->nelements + 1) + error->all(FLERR,"Incorrect element names in EAM potential file"); + + char **words = new char*[file->nelements+1]; + nwords = 0; + strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + file->elements = new char*[file->nelements]; + for (int i = 0; i < file->nelements; i++) { + n = strlen(words[i]) + 1; + file->elements[i] = new char[n]; + strcpy(file->elements[i],words[i]); + } + delete [] words; + + if (me == 0) { + fgets(line,MAXLINE,fptr); + sscanf(line,"%d %lg %d %lg %lg", + &file->nrho,&file->drho,&file->nr,&file->dr,&file->cut); + } + + MPI_Bcast(&file->nrho,1,MPI_INT,0,world); + MPI_Bcast(&file->drho,1,MPI_DOUBLE,0,world); + MPI_Bcast(&file->nr,1,MPI_INT,0,world); + MPI_Bcast(&file->dr,1,MPI_DOUBLE,0,world); + MPI_Bcast(&file->cut,1,MPI_DOUBLE,0,world); + + file->mass = new double[file->nelements]; + memory->create(file->frho,file->nelements,file->nrho+1, + "pair:frho"); + memory->create(file->rhor,file->nelements,file->nelements, + file->nr+1,"pair:rhor"); + memory->create(file->z2r,file->nelements,file->nelements, + file->nr+1,"pair:z2r"); + + int i,j,tmp; + for (i = 0; i < file->nelements; i++) { + if (me == 0) { + fgets(line,MAXLINE,fptr); + sscanf(line,"%d %lg",&tmp,&file->mass[i]); + } + MPI_Bcast(&file->mass[i],1,MPI_DOUBLE,0,world); + + if (me == 0) grab(fptr,file->nrho,&file->frho[i][1]); + MPI_Bcast(&file->frho[i][1],file->nrho,MPI_DOUBLE,0,world); + + for (j = 0; j < file->nelements; j++) { + if (me == 0) grab(fptr,file->nr,&file->rhor[i][j][1]); + MPI_Bcast(&file->rhor[i][j][1],file->nr,MPI_DOUBLE,0,world); + } + } + + for (i = 0; i < file->nelements; i++) + for (j = 0; j <= i; j++) { + if (me == 0) grab(fptr,file->nr,&file->z2r[i][j][1]); + MPI_Bcast(&file->z2r[i][j][1],file->nr,MPI_DOUBLE,0,world); + } + + // close the potential file + + if (me == 0) fclose(fptr); +} + +/* ---------------------------------------------------------------------- + copy read-in setfl potential to standard array format +------------------------------------------------------------------------- */ + +void PairEAMFSIntel::file2array() +{ + int i,j,m,n; + int ntypes = atom->ntypes; + + // set function params directly from fs file + + nrho = fs->nrho; + nr = fs->nr; + drho = fs->drho; + dr = fs->dr; + rhomax = (nrho-1) * drho; + + // ------------------------------------------------------------------ + // setup frho arrays + // ------------------------------------------------------------------ + + // allocate frho arrays + // nfrho = # of fs elements + 1 for zero array + + nfrho = fs->nelements + 1; + memory->destroy(frho); + memory->create(frho,nfrho,nrho+1,"pair:frho"); + + // copy each element's frho to global frho + + for (i = 0; i < fs->nelements; i++) + for (m = 1; m <= nrho; m++) frho[i][m] = fs->frho[i][m]; + + // add extra frho of zeroes for non-EAM types to point to (pair hybrid) + // this is necessary b/c fp is still computed for non-EAM atoms + + for (m = 1; m <= nrho; m++) frho[nfrho-1][m] = 0.0; + + // type2frho[i] = which frho array (0 to nfrho-1) each atom type maps to + // if atom type doesn't point to element (non-EAM atom in pair hybrid) + // then map it to last frho array of zeroes + + for (i = 1; i <= ntypes; i++) + if (map[i] >= 0) type2frho[i] = map[i]; + else type2frho[i] = nfrho-1; + + // ------------------------------------------------------------------ + // setup rhor arrays + // ------------------------------------------------------------------ + + // allocate rhor arrays + // nrhor = square of # of fs elements + + nrhor = fs->nelements * fs->nelements; + memory->destroy(rhor); + memory->create(rhor,nrhor,nr+1,"pair:rhor"); + + // copy each element pair rhor to global rhor + + n = 0; + for (i = 0; i < fs->nelements; i++) + for (j = 0; j < fs->nelements; j++) { + for (m = 1; m <= nr; m++) rhor[n][m] = fs->rhor[i][j][m]; + n++; + } + + // type2rhor[i][j] = which rhor array (0 to nrhor-1) each type pair maps to + // for fs files, there is a full NxN set of rhor arrays + // OK if map = -1 (non-EAM atom in pair hybrid) b/c type2rhor not used + + for (i = 1; i <= ntypes; i++) + for (j = 1; j <= ntypes; j++) + type2rhor[i][j] = map[i] * fs->nelements + map[j]; + + // ------------------------------------------------------------------ + // setup z2r arrays + // ------------------------------------------------------------------ + + // allocate z2r arrays + // nz2r = N*(N+1)/2 where N = # of fs elements + + nz2r = fs->nelements * (fs->nelements+1) / 2; + memory->destroy(z2r); + memory->create(z2r,nz2r,nr+1,"pair:z2r"); + + // copy each element pair z2r to global z2r, only for I >= J + + n = 0; + for (i = 0; i < fs->nelements; i++) + for (j = 0; j <= i; j++) { + for (m = 1; m <= nr; m++) z2r[n][m] = fs->z2r[i][j][m]; + n++; + } + + // type2z2r[i][j] = which z2r array (0 to nz2r-1) each type pair maps to + // set of z2r arrays only fill lower triangular Nelement matrix + // value = n = sum over rows of lower-triangular matrix until reach irow,icol + // swap indices when irow < icol to stay lower triangular + // if map = -1 (non-EAM atom in pair hybrid): + // type2z2r is not used by non-opt + // but set type2z2r to 0 since accessed by opt + + int irow,icol; + for (i = 1; i <= ntypes; i++) { + for (j = 1; j <= ntypes; j++) { + irow = map[i]; + icol = map[j]; + if (irow == -1 || icol == -1) { + type2z2r[i][j] = 0; + continue; + } + if (irow < icol) { + irow = map[j]; + icol = map[i]; + } + n = 0; + for (m = 0; m < irow; m++) n += m + 1; + n += icol; + type2z2r[i][j] = n; + } + } +} diff --git a/src/USER-INTEL/pair_eam_fs_intel.h b/src/USER-INTEL/pair_eam_fs_intel.h new file mode 100644 index 0000000000..da2ab9d2d7 --- /dev/null +++ b/src/USER-INTEL/pair_eam_fs_intel.h @@ -0,0 +1,43 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(eam/fs/intel,PairEAMFSIntel) + +#else + +#ifndef LMP_PAIR_EAM_FS_INTEL_H +#define LMP_PAIR_EAM_FS_INTEL_H + +#include "pair_eam_intel.h" + +namespace LAMMPS_NS { + +// need virtual public b/c of how eam/fs/opt inherits from it + +class PairEAMFSIntel : virtual public PairEAMIntel { + public: + PairEAMFSIntel(class LAMMPS *); + virtual ~PairEAMFSIntel() {} + void coeff(int, char **); + + protected: + void read_file(char *); + void file2array(); +}; + +} + +#endif +#endif diff --git a/src/USER-INTEL/pair_eam_intel.cpp b/src/USER-INTEL/pair_eam_intel.cpp index b97128bf9f..ea4ee30d52 100644 --- a/src/USER-INTEL/pair_eam_intel.cpp +++ b/src/USER-INTEL/pair_eam_intel.cpp @@ -23,6 +23,7 @@ #include "atom.h" #include "force.h" #include "comm.h" +#include "modify.h" #include "neighbor.h" #include "neigh_list.h" #include "neigh_request.h" diff --git a/src/USER-INTEL/pair_gayberne_intel.cpp b/src/USER-INTEL/pair_gayberne_intel.cpp index ed7dd424af..1f05ad0efc 100644 --- a/src/USER-INTEL/pair_gayberne_intel.cpp +++ b/src/USER-INTEL/pair_gayberne_intel.cpp @@ -428,7 +428,7 @@ void PairGayBerneIntel::eval(const int offload, const int vflag, } else multiple_forms = true; } - const int edge = (packed_j % pad_width); + const int edge = packed_j & (pad_width - 1); if (edge) { const int packed_end = packed_j + (pad_width - edge); #if defined(LMP_SIMD_COMPILER) @@ -938,8 +938,8 @@ void PairGayBerneIntel::pack_force_const(ForceConst &fc, fc.upsilon = upsilon; fc.mu = mu; - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { fc.ijc[i][j].lj1 = lj1[i][j]; fc.ijc[i][j].lj2 = lj2[i][j]; fc.ijc[i][j].cutsq = cutsq[i][j]; diff --git a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp new file mode 100644 index 0000000000..e3afcd64a6 --- /dev/null +++ b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -0,0 +1,595 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + This software is distributed under the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: W. Michael Brown (Intel) +------------------------------------------------------------------------- */ + +#include +#include "pair_lj_charmm_coul_charmm_intel.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "group.h" +#include "memory.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "suffix.h" +using namespace LAMMPS_NS; + +#define LJ_T typename IntelBuffers::vec4_t + +/* ---------------------------------------------------------------------- */ + +PairLJCharmmCoulCharmmIntel::PairLJCharmmCoulCharmmIntel(LAMMPS *lmp) : + PairLJCharmmCoulCharmm(lmp) +{ + suffix_flag |= Suffix::INTEL; +} + +/* ---------------------------------------------------------------------- */ + +PairLJCharmmCoulCharmmIntel::~PairLJCharmmCoulCharmmIntel() +{ +} + +/* ---------------------------------------------------------------------- */ + +void PairLJCharmmCoulCharmmIntel::compute(int eflag, int vflag) +{ + if (fix->precision()==FixIntel::PREC_MODE_MIXED) + compute(eflag, vflag, fix->get_mixed_buffers(), + force_const_single); + else if (fix->precision()==FixIntel::PREC_MODE_DOUBLE) + compute(eflag, vflag, fix->get_double_buffers(), + force_const_double); + else + compute(eflag, vflag, fix->get_single_buffers(), + force_const_single); + + fix->balance_stamp(); + vflag_fdotr = 0; +} + +template +void PairLJCharmmCoulCharmmIntel::compute(int eflag, int vflag, + IntelBuffers *buffers, + const ForceConst &fc) +{ + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = vflag_fdotr = 0; + + const int inum = list->inum; + const int nthreads = comm->nthreads; + const int host_start = fix->host_start_pair(); + const int offload_end = fix->offload_end_pair(); + const int ago = neighbor->ago; + + if (ago != 0 && fix->separate_buffers() == 0) { + fix->start_watch(TIME_PACK); + + int packthreads; + if (nthreads > INTEL_HTHREADS) packthreads = nthreads; + else packthreads = 1; + #if defined(_OPENMP) + #pragma omp parallel if(packthreads > 1) + #endif + { + int ifrom, ito, tid; + IP_PRE_omp_range_id_align(ifrom, ito, tid, atom->nlocal+atom->nghost, + packthreads, sizeof(ATOM_T)); + buffers->thr_pack(ifrom,ito,ago); + } + fix->stop_watch(TIME_PACK); + } + + // -------------------- Regular version + int ovflag = 0; + if (vflag_fdotr) ovflag = 2; + else if (vflag) ovflag = 1; + if (eflag) { + if (force->newton_pair) { + eval<1,1>(1, ovflag, buffers, fc, 0, offload_end); + eval<1,1>(0, ovflag, buffers, fc, host_start, inum); + } else { + eval<1,0>(1, ovflag, buffers, fc, 0, offload_end); + eval<1,0>(0, ovflag, buffers, fc, host_start, inum); + } + } else { + if (force->newton_pair) { + eval<0,1>(1, ovflag, buffers, fc, 0, offload_end); + eval<0,1>(0, ovflag, buffers, fc, host_start, inum); + } else { + eval<0,0>(1, ovflag, buffers, fc, 0, offload_end); + eval<0,0>(0, ovflag, buffers, fc, host_start, inum); + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairLJCharmmCoulCharmmIntel::eval(const int offload, const int vflag, + IntelBuffers *buffers, + const ForceConst &fc, + const int astart, const int aend) +{ + const int inum = aend - astart; + if (inum == 0) return; + int nlocal, nall, minlocal; + fix->get_buffern(offload, nlocal, nall, minlocal); + + const int ago = neighbor->ago; + IP_PRE_pack_separate_buffers(fix, buffers, ago, offload, nlocal, nall); + + ATOM_T * _noalias const x = buffers->get_x(offload); + flt_t * _noalias const q = buffers->get_q(offload); + + const int * _noalias const numneigh = list->numneigh; + const int * _noalias const cnumneigh = buffers->cnumneigh(list); + const int * _noalias const firstneigh = buffers->firstneigh(list); + + const flt_t * _noalias const special_coul = fc.special_coul; + const flt_t * _noalias const special_lj = fc.special_lj; + const flt_t qqrd2e = force->qqrd2e; + const flt_t inv_denom_lj = (flt_t)1.0/denom_lj; + const flt_t inv_denom_coul = (flt_t)1.0/denom_coul; + + const flt_t * _noalias const cutsq = fc.cutsq[0]; + const LJ_T * _noalias const lj = fc.lj[0]; + const flt_t cut_ljsq = fc.cut_ljsq; + const flt_t cut_lj_innersq = fc.cut_lj_innersq; + const flt_t cut_coul_innersq = fc.cut_coul_innersq; + const flt_t cut_coulsq = fc.cut_coulsq; + + const int ntypes = atom->ntypes + 1; + const int eatom = this->eflag_atom; + + flt_t * _noalias const ccachex = buffers->get_ccachex(); + flt_t * _noalias const ccachey = buffers->get_ccachey(); + flt_t * _noalias const ccachez = buffers->get_ccachez(); + flt_t * _noalias const ccachew = buffers->get_ccachew(); + int * _noalias const ccachei = buffers->get_ccachei(); + int * _noalias const ccachej = buffers->get_ccachej(); + const int ccache_stride = _ccache_stride; + + // Determine how much data to transfer + int x_size, q_size, f_stride, ev_size, separate_flag; + IP_PRE_get_transfern(ago, NEWTON_PAIR, EFLAG, vflag, + buffers, offload, fix, separate_flag, + x_size, q_size, ev_size, f_stride); + + int tc; + FORCE_T * _noalias f_start; + acc_t * _noalias ev_global; + IP_PRE_get_buffers(offload, buffers, fix, tc, f_start, ev_global); + + const int nthreads = tc; + #ifdef _LMP_INTEL_OFFLOAD + int *overflow = fix->get_off_overflow_flag(); + double *timer_compute = fix->off_watch_pair(); + + if (offload) fix->start_watch(TIME_OFFLOAD_LATENCY); + #pragma offload target(mic:_cop) if(offload) \ + in(special_lj,special_coul:length(0) alloc_if(0) free_if(0)) \ + in(cutsq,lj:length(0) alloc_if(0) free_if(0)) \ + in(firstneigh:length(0) alloc_if(0) free_if(0)) \ + in(cnumneigh:length(0) alloc_if(0) free_if(0)) \ + in(numneigh:length(0) alloc_if(0) free_if(0)) \ + in(x:length(x_size) alloc_if(0) free_if(0)) \ + in(q:length(q_size) alloc_if(0) free_if(0)) \ + in(overflow:length(0) alloc_if(0) free_if(0)) \ + in(ccachex,ccachey,ccachez,ccachew:length(0) alloc_if(0) free_if(0)) \ + in(ccachei,ccachej:length(0) alloc_if(0) free_if(0)) \ + in(ccache_stride,nthreads,qqrd2e,inum,nall,ntypes,cut_coulsq) \ + in(vflag,eatom,f_stride,separate_flag,offload) \ + in(astart,cut_ljsq,cut_lj_innersq,nlocal,inv_denom_lj,minlocal) \ + in(inv_denom_coul,cut_coul_innersq) \ + out(f_start:length(f_stride) alloc_if(0) free_if(0)) \ + out(ev_global:length(ev_size) alloc_if(0) free_if(0)) \ + out(timer_compute:length(1) alloc_if(0) free_if(0)) \ + signal(f_start) + #endif + { + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime(); + #endif + + IP_PRE_repack_for_offload(NEWTON_PAIR, separate_flag, nlocal, nall, + f_stride, x, q); + + acc_t oevdwl, oecoul, ov0, ov1, ov2, ov3, ov4, ov5; + if (EFLAG) oevdwl = oecoul = (acc_t)0; + if (vflag) ov0 = ov1 = ov2 = ov3 = ov4 = ov5 = (acc_t)0; + + // loop over neighbors of my atoms + #if defined(_OPENMP) + #pragma omp parallel reduction(+:oevdwl,oecoul,ov0,ov1,ov2,ov3,ov4,ov5) + #endif + { + int iifrom, iip, iito, tid; + IP_PRE_omp_stride_id(iifrom, iip, iito, tid, inum, nthreads); + iifrom += astart; + iito += astart; + + int foff; + if (NEWTON_PAIR) foff = tid * f_stride - minlocal; + else foff = -minlocal; + FORCE_T * _noalias const f = f_start + foff; + if (NEWTON_PAIR) memset(f + minlocal, 0, f_stride * sizeof(FORCE_T)); + flt_t cutboth = cut_coulsq; + + const int toffs = tid * ccache_stride; + flt_t * _noalias const tdelx = ccachex + toffs; + flt_t * _noalias const tdely = ccachey + toffs; + flt_t * _noalias const tdelz = ccachez + toffs; + flt_t * _noalias const trsq = ccachew + toffs; + int * _noalias const tj = ccachei + toffs; + int * _noalias const tjtype = ccachej + toffs; + + for (int i = iifrom; i < iito; i += iip) { + // const int i = ilist[ii]; + const int itype = x[i].w; + + const int ptr_off = itype * ntypes; + const flt_t * _noalias const cutsqi = cutsq + ptr_off; + const LJ_T * _noalias const lji = lj + ptr_off; + + const int * _noalias const jlist = firstneigh + cnumneigh[i]; + const int jnum = numneigh[i]; + + acc_t fxtmp,fytmp,fztmp,fwtmp; + acc_t sevdwl, secoul, sv0, sv1, sv2, sv3, sv4, sv5; + + const flt_t xtmp = x[i].x; + const flt_t ytmp = x[i].y; + const flt_t ztmp = x[i].z; + const flt_t qtmp = q[i]; + fxtmp = fytmp = fztmp = (acc_t)0; + if (EFLAG) fwtmp = sevdwl = secoul = (acc_t)0; + if (NEWTON_PAIR == 0) + if (vflag==1) sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; + + int ej = 0; + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma ivdep + #endif + for (int jj = 0; jj < jnum; jj++) { + const int j = jlist[jj] & NEIGHMASK; + const flt_t delx = xtmp - x[j].x; + const flt_t dely = ytmp - x[j].y; + const flt_t delz = ztmp - x[j].z; + const flt_t rsq = delx * delx + dely * dely + delz * delz; + + if (rsq < cut_coulsq) { + trsq[ej]=rsq; + tdelx[ej]=delx; + tdely[ej]=dely; + tdelz[ej]=delz; + tjtype[ej]=x[j].w; + tj[ej]=jlist[jj]; + ej++; + } + } + + #if defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, secoul, \ + sv0, sv1, sv2, sv3, sv4, sv5) + #endif + for (int jj = 0; jj < ej; jj++) { + flt_t forcecoul, forcelj, evdwl; + forcecoul = forcelj = evdwl = (flt_t)0.0; + + const int j = tj[jj] & NEIGHMASK; + const int sbindex = tj[jj] >> SBBITS & 3; + const flt_t rsq = trsq[jj]; + const flt_t r2inv = (flt_t)1.0 / rsq; + const flt_t r_inv = (flt_t)1.0 / sqrt(rsq); + forcecoul = qqrd2e * qtmp * q[j] * r_inv; + if (rsq > cut_coul_innersq) { + const flt_t ccr = cut_coulsq - rsq; + const flt_t switch1 = ccr * ccr * inv_denom_coul * + (cut_coulsq + (flt_t)2.0 * rsq - (flt_t)3.0 * cut_coul_innersq); + forcecoul *= switch1; + } + + #ifdef INTEL_VMASK + if (rsq < cut_ljsq) { + #endif + const int jtype = tjtype[jj]; + flt_t r6inv = r2inv * r2inv * r2inv; + forcelj = r6inv * (lji[jtype].x * r6inv - lji[jtype].y); + if (EFLAG) evdwl = r6inv*(lji[jtype].z * r6inv - lji[jtype].w); + + #ifdef INTEL_VMASK + if (rsq > cut_lj_innersq) { + #endif + const flt_t drsq = cut_ljsq - rsq; + const flt_t cut2 = (rsq - cut_lj_innersq) * drsq; + const flt_t switch1 = drsq * (drsq * drsq + (flt_t)3.0 * cut2) * + inv_denom_lj; + const flt_t switch2 = (flt_t)12.0 * rsq * cut2 * inv_denom_lj; + if (EFLAG) { + #ifndef INTEL_VMASK + if (rsq > cut_lj_innersq) { + #endif + forcelj = forcelj * switch1 + evdwl * switch2; + evdwl *= switch1; + #ifndef INTEL_VMASK + } + #endif + } else { + const flt_t philj = r6inv * (lji[jtype].z*r6inv - + lji[jtype].w); + #ifndef INTEL_VMASK + if (rsq > cut_lj_innersq) + #endif + forcelj = forcelj * switch1 + philj * switch2; + } + #ifdef INTEL_VMASK + } + #endif + + #ifdef INTEL_VMASK + } + #else + if (rsq > cut_ljsq) { forcelj = (flt_t)0.0; evdwl = (flt_t)0.0; } + #endif + if (sbindex) { + const flt_t factor_coul = special_coul[sbindex]; + forcecoul *= factor_coul; + const flt_t factor_lj = special_lj[sbindex]; + forcelj *= factor_lj; + if (EFLAG) evdwl *= factor_lj; + } + + const flt_t fpair = (forcecoul + forcelj) * r2inv; + const flt_t fpx = fpair * tdelx[jj]; + fxtmp += fpx; + if (NEWTON_PAIR) f[j].x -= fpx; + const flt_t fpy = fpair * tdely[jj]; + fytmp += fpy; + if (NEWTON_PAIR) f[j].y -= fpy; + const flt_t fpz = fpair * tdelz[jj]; + fztmp += fpz; + if (NEWTON_PAIR) f[j].z -= fpz; + + if (EFLAG) { + sevdwl += evdwl; + secoul += forcecoul; + if (eatom) { + fwtmp += (flt_t)0.5 * evdwl + (flt_t)0.5 * forcecoul; + if (NEWTON_PAIR) + f[j].w += (flt_t)0.5 * evdwl + (flt_t)0.5 * forcecoul; + } + } + if (NEWTON_PAIR == 0) + IP_PRE_ev_tally_nborv(vflag, tdelx[jj], tdely[jj], tdelz[jj], + fpx, fpy, fpz); + } // for jj + if (NEWTON_PAIR) { + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; + } else { + f[i].x = fxtmp; + f[i].y = fytmp; + f[i].z = fztmp; + } + IP_PRE_ev_tally_atomq(NEWTON_PAIR, EFLAG, vflag, f, fwtmp); + } // for ii + + IP_PRE_fdotr_reduce_omp(NEWTON_PAIR, nall, minlocal, nthreads, f_start, + f_stride, x, offload, vflag, ov0, ov1, ov2, ov3, + ov4, ov5); + } // end of omp parallel region + + IP_PRE_fdotr_reduce(NEWTON_PAIR, nall, nthreads, f_stride, vflag, + ov0, ov1, ov2, ov3, ov4, ov5); + + if (EFLAG) { + if (NEWTON_PAIR == 0) { + oevdwl *= (acc_t)0.5; + oecoul *= (acc_t)0.5; + } + ev_global[0] = oevdwl; + ev_global[1] = oecoul; + } + if (vflag) { + if (NEWTON_PAIR == 0) { + ov0 *= (acc_t)0.5; + ov1 *= (acc_t)0.5; + ov2 *= (acc_t)0.5; + ov3 *= (acc_t)0.5; + ov4 *= (acc_t)0.5; + ov5 *= (acc_t)0.5; + } + ev_global[2] = ov0; + ev_global[3] = ov1; + ev_global[4] = ov2; + ev_global[5] = ov3; + ev_global[6] = ov4; + ev_global[7] = ov5; + } + #if defined(__MIC__) && defined(_LMP_INTEL_OFFLOAD) + *timer_compute = MIC_Wtime() - *timer_compute; + #endif + } // end of offload region + + if (offload) + fix->stop_watch(TIME_OFFLOAD_LATENCY); + else + fix->stop_watch(TIME_HOST_PAIR); + + if (EFLAG || vflag) + fix->add_result_array(f_start, ev_global, offload, eatom, 0, vflag); + else + fix->add_result_array(f_start, 0, offload); +} + +/* ---------------------------------------------------------------------- */ + +void PairLJCharmmCoulCharmmIntel::init_style() +{ + PairLJCharmmCoulCharmm::init_style(); + if (force->newton_pair == 0) { + neighbor->requests[neighbor->nrequest-1]->half = 0; + neighbor->requests[neighbor->nrequest-1]->full = 1; + } + neighbor->requests[neighbor->nrequest-1]->intel = 1; + + int ifix = modify->find_fix("package_intel"); + if (ifix < 0) + error->all(FLERR, + "The 'package intel' command is required for /intel styles"); + fix = static_cast(modify->fix[ifix]); + + fix->pair_init_check(); + #ifdef _LMP_INTEL_OFFLOAD + _cop = fix->coprocessor_number(); + #endif + + if (fix->precision() == FixIntel::PREC_MODE_MIXED) + pack_force_const(force_const_single, fix->get_mixed_buffers()); + else if (fix->precision() == FixIntel::PREC_MODE_DOUBLE) + pack_force_const(force_const_double, fix->get_double_buffers()); + else + pack_force_const(force_const_single, fix->get_single_buffers()); +} + +template +void PairLJCharmmCoulCharmmIntel::pack_force_const(ForceConst &fc, + IntelBuffers *buffers) +{ + int off_ccache = 0; + #ifdef _LMP_INTEL_OFFLOAD + if (_cop >= 0) off_ccache = 1; + #endif + buffers->grow_ccache(off_ccache, comm->nthreads, 1); + _ccache_stride = buffers->ccache_stride(); + + int tp1 = atom->ntypes + 1; + + fc.set_ntypes(tp1, memory, _cop); + buffers->set_ntypes(tp1); + flt_t **cutneighsq = buffers->get_cutneighsq(); + + // Repeat cutsq calculation because done after call to init_style + double cut, cutneigh; + if (cut_lj > cut_coul) + error->all(FLERR, + "Intel varient of lj/charmm/coul/long expects lj cutoff<=coulombic"); + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { + if (setflag[i][j] != 0 || (setflag[i][i] != 0 && setflag[j][j] != 0)) { + cut = init_one(i, j); + cutneigh = cut + neighbor->skin; + cutsq[i][j] = cutsq[j][i] = cut*cut; + cutneighsq[i][j] = cutneighsq[j][i] = cutneigh * cutneigh; + } + } + } + + cut_coul_innersq = cut_coul_inner * cut_coul_inner; + cut_lj_innersq = cut_lj_inner * cut_lj_inner; + cut_ljsq = cut_lj * cut_lj; + cut_coulsq = cut_coul * cut_coul; + cut_bothsq = MAX(cut_ljsq, cut_coulsq); + + fc.cut_coulsq = cut_coulsq; + fc.cut_ljsq = cut_ljsq; + fc.cut_coul_innersq = cut_coul_innersq; + fc.cut_lj_innersq = cut_lj_innersq; + + for (int i = 0; i < 4; i++) { + fc.special_lj[i] = force->special_lj[i]; + fc.special_coul[i] = force->special_coul[i]; + fc.special_coul[0] = 1.0; + fc.special_lj[0] = 1.0; + } + + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { + fc.lj[i][j].x = lj1[i][j]; + fc.lj[i][j].y = lj2[i][j]; + fc.lj[i][j].z = lj3[i][j]; + fc.lj[i][j].w = lj4[i][j]; + fc.cutsq[i][j] = cutsq[i][j]; + } + } + + #ifdef _LMP_INTEL_OFFLOAD + if (_cop < 0) return; + flt_t * special_lj = fc.special_lj; + flt_t * special_coul = fc.special_coul; + flt_t * cutsq = fc.cutsq[0]; + LJ_T * lj = fc.lj[0]; + flt_t * ocutneighsq = cutneighsq[0]; + int tp1sq = tp1 * tp1; + #pragma offload_transfer target(mic:_cop) \ + in(special_lj, special_coul: length(4) alloc_if(0) free_if(0)) \ + in(cutsq,lj: length(tp1sq) alloc_if(0) free_if(0)) \ + in(ocutneighsq: length(tp1sq) alloc_if(0) free_if(0)) + #endif +} + +/* ---------------------------------------------------------------------- */ + +template +void PairLJCharmmCoulCharmmIntel::ForceConst::set_ntypes( + const int ntypes, Memory *memory, const int cop) { + if (ntypes != _ntypes) { + if (_ntypes > 0) { + #ifdef _LMP_INTEL_OFFLOAD + flt_t * ospecial_lj = special_lj; + flt_t * ospecial_coul = special_coul; + flt_t * ocutsq = cutsq[0]; + typename IntelBuffers::vec4_t * olj = lj[0]; + if (ospecial_lj != NULL && ocutsq != NULL && olj != NULL && + ospecial_coul != NULL && cop >= 0) { + #pragma offload_transfer target(mic:cop) \ + nocopy(ospecial_lj, ospecial_coul: alloc_if(0) free_if(1)) \ + nocopy(ocutsq, olj: alloc_if(0) free_if(1)) + } + #endif + + _memory->destroy(cutsq); + _memory->destroy(lj); + } + if (ntypes > 0) { + _cop = cop; + memory->create(cutsq,ntypes,ntypes,"fc.cutsq"); + memory->create(lj,ntypes,ntypes,"fc.lj"); + + #ifdef _LMP_INTEL_OFFLOAD + flt_t * ospecial_lj = special_lj; + flt_t * ospecial_coul = special_coul; + flt_t * ocutsq = cutsq[0]; + typename IntelBuffers::vec4_t * olj = lj[0]; + int tp1sq = ntypes*ntypes; + if (ospecial_lj != NULL && ocutsq != NULL && olj != NULL && + ospecial_coul != NULL && cop >= 0) { + #pragma offload_transfer target(mic:cop) \ + nocopy(ospecial_lj: length(4) alloc_if(1) free_if(0)) \ + nocopy(ospecial_coul: length(4) alloc_if(1) free_if(0)) \ + nocopy(ocutsq,olj: length(tp1sq) alloc_if(1) free_if(0)) + } + #endif + } + } + _ntypes=ntypes; + _memory=memory; +} diff --git a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.h b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.h new file mode 100644 index 0000000000..64d6077477 --- /dev/null +++ b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.h @@ -0,0 +1,100 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: W. Michael Brown (Intel) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/charmm/coul/charmm/intel,PairLJCharmmCoulCharmmIntel) + +#else + +#ifndef LMP_PAIR_LJ_CHARMM_COUL_CHARMM_INTEL_H +#define LMP_PAIR_LJ_CHARMM_COUL_CHARMM_INTEL_H + +#include "pair_lj_charmm_coul_charmm.h" +#include "fix_intel.h" + +namespace LAMMPS_NS { + +class PairLJCharmmCoulCharmmIntel : public PairLJCharmmCoulCharmm { + + public: + PairLJCharmmCoulCharmmIntel(class LAMMPS *); + virtual ~PairLJCharmmCoulCharmmIntel(); + + virtual void compute(int, int); + void init_style(); + + typedef struct { float x,y,z; int w; } sng4_t; + + private: + FixIntel *fix; + int _cop, _ccache_stride; + + template class ForceConst; + template + void compute(int eflag, int vflag, IntelBuffers *buffers, + const ForceConst &fc); + template + void eval(const int offload, const int vflag, + IntelBuffers * buffers, + const ForceConst &fc, const int astart, const int aend); + + template + void pack_force_const(ForceConst &fc, + IntelBuffers *buffers); + + // ---------------------------------------------------------------------- + template + class ForceConst { + public: + _alignvar(flt_t special_coul[4],64); + _alignvar(flt_t special_lj[4],64); + flt_t **cutsq; + flt_t cut_coulsq, cut_ljsq; + flt_t cut_coul_innersq, cut_lj_innersq; + typename IntelBuffers::vec4_t **lj; + + ForceConst() : _ntypes(0) {} + ~ForceConst() { set_ntypes(0,NULL,_cop); } + + void set_ntypes(const int ntypes, Memory *memory, const int cop); + + private: + int _ntypes, _cop; + Memory *_memory; + }; + ForceConst force_const_single; + ForceConst force_const_double; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: The 'package intel' command is required for /intel styles + +Self-explanatory. + +E: Intel varient of lj/charmm/coul/charmm expects lj cutoff<=coulombic + +The intel accelerated version of the CHARMM style requires that the +Lennard-Jones cutoff is not greater than the coulombic cutoff. + +*/ diff --git a/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp b/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp index fe99525122..a2680cdff4 100644 --- a/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_lj_charmm_coul_long_intel.cpp @@ -586,8 +586,8 @@ void PairLJCharmmCoulLongIntel::pack_force_const(ForceConst &fc, fc.special_lj[0] = 1.0; } - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { fc.lj[i][j].x = lj1[i][j]; fc.lj[i][j].y = lj2[i][j]; fc.lj[i][j].z = lj3[i][j]; diff --git a/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp b/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp index e9775d6ec5..c0bf6f35c6 100644 --- a/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp +++ b/src/USER-INTEL/pair_lj_cut_coul_long_intel.cpp @@ -544,8 +544,8 @@ void PairLJCutCoulLongIntel::pack_force_const(ForceConst &fc, fc.special_lj[0] = 1.0; } - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { if (cutsq[i][j] < cut_ljsq[i][j]) error->all(FLERR, "Intel variant of lj/cut/coul/long expects lj cutoff<=coulombic"); diff --git a/src/USER-INTEL/pair_lj_cut_intel.cpp b/src/USER-INTEL/pair_lj_cut_intel.cpp index 4871821842..f5a7999ee2 100644 --- a/src/USER-INTEL/pair_lj_cut_intel.cpp +++ b/src/USER-INTEL/pair_lj_cut_intel.cpp @@ -437,8 +437,8 @@ void PairLJCutIntel::pack_force_const(ForceConst &fc, fc.special_lj[0] = 1.0; } - for (int i = 0; i < tp1; i++) { - for (int j = 0; j < tp1; j++) { + for (int i = 1; i < tp1; i++) { + for (int j = 1; j < tp1; j++) { fc.ljc12o[i][j].lj1 = lj1[i][j]; fc.ljc12o[i][j].lj2 = lj2[i][j]; fc.lj34[i][j].lj3 = lj3[i][j]; diff --git a/src/USER-INTEL/pair_rebo_intel.cpp b/src/USER-INTEL/pair_rebo_intel.cpp new file mode 100644 index 0000000000..006830a5fa --- /dev/null +++ b/src/USER-INTEL/pair_rebo_intel.cpp @@ -0,0 +1,42 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Markus Hohnerbach (RWTH) +------------------------------------------------------------------------- */ + +#include "pair_rebo_intel.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairREBOIntel::PairREBOIntel(LAMMPS *lmp) : PairAIREBOIntel(lmp) {} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairREBOIntel::settings(int narg, char **arg) +{ + if (narg != 0) error->all(FLERR,"Illegal pair_style command"); + + cutlj = 0.0; + ljflag = torflag = 0; + // + // this one parameter for C-C interactions is different in REBO vs AIREBO + // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) + + PCCf_2_0 = 0.0; +} diff --git a/src/USER-INTEL/pair_rebo_intel.h b/src/USER-INTEL/pair_rebo_intel.h new file mode 100644 index 0000000000..e76279a248 --- /dev/null +++ b/src/USER-INTEL/pair_rebo_intel.h @@ -0,0 +1,40 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Markus Hohnerbach (RWTH) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(rebo/intel,PairREBOIntel) + +#else + +#ifndef LMP_PAIR_REBO_INTEL_H +#define LMP_PAIR_REBO_INTEL_H + +#include "pair_airebo_intel.h" + +namespace LAMMPS_NS { + +class PairREBOIntel : public PairAIREBOIntel { + public: + PairREBOIntel(class LAMMPS *); + virtual void settings(int, char **); +}; + +} + +#endif +#endif diff --git a/src/USER-INTEL/pair_sw_intel.cpp b/src/USER-INTEL/pair_sw_intel.cpp index 7a6b7afd92..fff104f39b 100644 --- a/src/USER-INTEL/pair_sw_intel.cpp +++ b/src/USER-INTEL/pair_sw_intel.cpp @@ -345,16 +345,17 @@ void PairSWIntel::eval(const int offload, const int vflag, if (jj < jnumhalf) ejnumhalf++; } } - int ejnum_pad = ejnum; - while ( (ejnum_pad % pad_width) != 0) { - tdelx[ejnum_pad] = (flt_t)0.0; - tdely[ejnum_pad] = (flt_t)0.0; - tdelz[ejnum_pad] = (flt_t)0.0; - trsq[ejnum_pad] = p2[3].cutsq + (flt_t)1.0; - tj[ejnum_pad] = nall; - if (!ONETYPE) tjtype[ejnum_pad] = 0; - ejnum_pad++; + int ejrem = ejnum & (pad_width - 1); + if (ejrem) ejrem = pad_width - ejrem; + const int ejnum_pad = ejnum + ejrem; + for (int jj = ejnum; jj < ejnum_pad; jj++) { + tdelx[jj] = (flt_t)0.0; + tdely[jj] = (flt_t)0.0; + tdelz[jj] = (flt_t)0.0; + trsq[jj] = p2[3].cutsq + (flt_t)1.0; + tj[jj] = nall; + if (!ONETYPE) tjtype[jj] = 0; } #if defined(LMP_SIMD_COMPILER) diff --git a/src/USER-INTEL/pair_tersoff_intel.cpp b/src/USER-INTEL/pair_tersoff_intel.cpp index 9e0a888638..a59fe12f5b 100644 --- a/src/USER-INTEL/pair_tersoff_intel.cpp +++ b/src/USER-INTEL/pair_tersoff_intel.cpp @@ -1372,7 +1372,7 @@ void IntelKernelTersoff::attractive_vector( fvec vrij_hatx = vrijinv * vdijx; fvec vrij_haty = vrijinv * vdijy; fvec vrij_hatz = vrijinv * vdijz; - fvec rikinv = invsqrt(rsq2); + fvec rikinv = v::invsqrt(rsq2); fvec rik_hatx = rikinv * dikx; fvec rik_haty = rikinv * diky; fvec rik_hatz = rikinv * dikz; diff --git a/src/USER-INTEL/pppm_disp_intel.cpp b/src/USER-INTEL/pppm_disp_intel.cpp index 1269579ff4..bd41f8b531 100644 --- a/src/USER-INTEL/pppm_disp_intel.cpp +++ b/src/USER-INTEL/pppm_disp_intel.cpp @@ -20,7 +20,10 @@ #include #include "pppm_disp_intel.h" #include "atom.h" +#include "comm.h" +#include "domain.h" #include "error.h" +#include "modify.h" #include "fft3d_wrap.h" #include "gridcomm.h" #include "math_const.h" diff --git a/src/USER-INTEL/pppm_intel.cpp b/src/USER-INTEL/pppm_intel.cpp index f1cfe591f2..30f8f4c5c0 100644 --- a/src/USER-INTEL/pppm_intel.cpp +++ b/src/USER-INTEL/pppm_intel.cpp @@ -23,7 +23,10 @@ #include #include "pppm_intel.h" #include "atom.h" +#include "comm.h" +#include "domain.h" #include "error.h" +#include "modify.h" #include "fft3d_wrap.h" #include "gridcomm.h" #include "math_const.h" @@ -66,11 +69,7 @@ PPPMIntel::PPPMIntel(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg) rho_lookup = drho_lookup = NULL; rho_points = 0; - vdxy_brick = vdz0_brick = NULL; - work3 = NULL; - cg_pack = NULL; - - _use_table = _use_packing = _use_lrt = 0; + _use_table = _use_lrt = 0; } PPPMIntel::~PPPMIntel() @@ -82,12 +81,6 @@ PPPMIntel::~PPPMIntel() memory->destroy(rho_lookup); memory->destroy(drho_lookup); - - memory->destroy3d_offset(vdxy_brick, nzlo_out, nylo_out, 2*nxlo_out); - memory->destroy3d_offset(vdz0_brick, nzlo_out, nylo_out, 2*nxlo_out); - memory->destroy(work3); - - delete cg_pack; } /* ---------------------------------------------------------------------- @@ -141,36 +134,6 @@ void PPPMIntel::init() if (order > INTEL_P3M_MAXORDER) error->all(FLERR,"PPPM order greater than supported by USER-INTEL\n"); - _use_packing = (order == 7) && (INTEL_VECTOR_WIDTH == 16) - && (sizeof(FFT_SCALAR) == sizeof(float)) - && (differentiation_flag == 0); - if (_use_packing) { - memory->destroy3d_offset(vdx_brick,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdy_brick,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdz_brick,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxy_brick, nzlo_out, nylo_out, 2*nxlo_out); - create3d_offset(vdxy_brick, nzlo_out, nzhi_out+2, - nylo_out, nyhi_out, 2*nxlo_out, 2*nxhi_out+1, - "pppmintel:vdxy_brick"); - memory->destroy3d_offset(vdz0_brick, nzlo_out, nylo_out, 2*nxlo_out); - create3d_offset(vdz0_brick, nzlo_out, nzhi_out+2, - nylo_out, nyhi_out, 2*nxlo_out, 2*nxhi_out+1, - "pppmintel:vdz0_brick"); - memory->destroy(work3); - memory->create(work3, 2*nfft_both, "pppmintel:work3"); - - // new communicator for the double-size bricks - delete cg_pack; - int (*procneigh)[2] = comm->procneigh; - cg_pack = new GridComm(lmp,world,2,0, 2*nxlo_in,2*nxhi_in+1,nylo_in, - nyhi_in,nzlo_in,nzhi_in, 2*nxlo_out,2*nxhi_out+1, - nylo_out,nyhi_out,nzlo_out,nzhi_out, - procneigh[0][0],procneigh[0][1],procneigh[1][0], - procneigh[1][1],procneigh[2][0],procneigh[2][1]); - - cg_pack->ghost_notify(); - cg_pack->setup(); - } } /* ---------------------------------------------------------------------- @@ -272,18 +235,13 @@ void PPPMIntel::compute_first(int eflag, int vflag) // also performs per-atom calculations via poisson_peratom() if (differentiation_flag == 1) poisson_ad(); - else poisson_ik_intel(); + else poisson_ik(); // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks if (differentiation_flag == 1) cg->forward_comm(this,FORWARD_AD); - else { - if (_use_packing) - cg_pack->forward_comm(this,FORWARD_IK); - else - cg->forward_comm(this,FORWARD_IK); - } + else cg->forward_comm(this,FORWARD_IK); // extra per-atom energy/virial communication @@ -604,7 +562,7 @@ void PPPMIntel::make_rho(IntelBuffers *buffers) interpolate from grid to get electric field & force on my particles for ik ------------------------------------------------------------------------- */ -template +template void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) { // loop over my charges, interpolate electric field from nearby grid points @@ -649,9 +607,9 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) int ny = part2grid[i][1]; int nz = part2grid[i][2]; - int nxsum = (use_packing ? 2 : 1) * (nx + nlower); + int nxsum = nx + nlower; int nysum = ny + nlower; - int nzsum = nz + nlower;; + int nzsum = nz + nlower; FFT_SCALAR dx = nx+fshiftone - (x[i].x-lo0)*xi; FFT_SCALAR dy = ny+fshiftone - (x[i].y-lo1)*yi; @@ -668,12 +626,7 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) #pragma simd #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { - if (use_packing) { - rho0[2 * k] = rho_lookup[idx][k]; - rho0[2 * k + 1] = rho_lookup[idx][k]; - } else { - rho0[k] = rho_lookup[idx][k]; - } + rho0[k] = rho_lookup[idx][k]; rho1[k] = rho_lookup[idy][k]; rho2[k] = rho_lookup[idz][k]; } @@ -690,12 +643,7 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) r2 = rho_coeff[l][k] + r2*dy; r3 = rho_coeff[l][k] + r3*dz; } - if (use_packing) { - rho0[2 * (k-nlower)] = r1; - rho0[2 * (k-nlower) + 1] = r1; - } else { - rho0[k-nlower] = r1; - } + rho0[k-nlower] = r1; rho1[k-nlower] = r2; rho2[k-nlower] = r3; } @@ -722,18 +670,12 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) #if defined(LMP_SIMD_COMPILER) #pragma simd #endif - for (int l = 0; l < (use_packing ? 2 : 1) * - INTEL_P3M_ALIGNED_MAXORDER; l++) { + for (int l = 0; l < INTEL_P3M_ALIGNED_MAXORDER; l++) { int mx = l+nxsum; FFT_SCALAR x0 = y0*rho0[l]; - if (use_packing) { - ekxy_arr[l] -= x0*vdxy_brick[mz][my][mx]; - ekz0_arr[l] -= x0*vdz0_brick[mz][my][mx]; - } else { - ekx_arr[l] -= x0*vdx_brick[mz][my][mx]; - eky_arr[l] -= x0*vdy_brick[mz][my][mx]; - ekz_arr[l] -= x0*vdz_brick[mz][my][mx]; - } + ekx_arr[l] -= x0*vdx_brick[mz][my][mx]; + eky_arr[l] -= x0*vdy_brick[mz][my][mx]; + ekz_arr[l] -= x0*vdz_brick[mz][my][mx]; } } } @@ -741,18 +683,10 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) FFT_SCALAR ekx, eky, ekz; ekx = eky = ekz = ZEROF; - if (use_packing) { - for (int l = 0; l < 2*order; l += 2) { - ekx += ekxy_arr[l]; - eky += ekxy_arr[l+1]; - ekz += ekz0_arr[l]; - } - } else { - for (int l = 0; l < order; l++) { - ekx += ekx_arr[l]; - eky += eky_arr[l]; - ekz += ekz_arr[l]; - } + for (int l = 0; l < order; l++) { + ekx += ekx_arr[l]; + eky += eky_arr[l]; + ekz += ekz_arr[l]; } // convert E-field to force @@ -965,137 +899,6 @@ void PPPMIntel::fieldforce_ad(IntelBuffers *buffers) } } -/* ---------------------------------------------------------------------- - FFT-based Poisson solver for ik - Does special things for packing mode to avoid repeated copies -------------------------------------------------------------------------- */ - -void PPPMIntel::poisson_ik_intel() -{ - if (_use_packing == 0) { - poisson_ik(); - return; - } - - int i,j,k,n; - double eng; - - // transform charge density (r -> k) - - n = 0; - for (i = 0; i < nfft; i++) { - work1[n++] = density_fft[i]; - work1[n++] = ZEROF; - } - - fft1->compute(work1,work1,1); - - // global energy and virial contribution - - double scaleinv = 1.0/(nx_pppm*ny_pppm*nz_pppm); - double s2 = scaleinv*scaleinv; - - if (eflag_global || vflag_global) { - if (vflag_global) { - n = 0; - for (i = 0; i < nfft; i++) { - eng = s2 * greensfn[i] * (work1[n]*work1[n] + - work1[n+1]*work1[n+1]); - for (j = 0; j < 6; j++) virial[j] += eng*vg[i][j]; - if (eflag_global) energy += eng; - n += 2; - } - } else { - n = 0; - for (i = 0; i < nfft; i++) { - energy += - s2 * greensfn[i] * (work1[n]*work1[n] + work1[n+1]*work1[n+1]); - n += 2; - } - } - } - - // scale by 1/total-grid-pts to get rho(k) - // multiply by Green's function to get V(k) - - n = 0; - for (i = 0; i < nfft; i++) { - work1[n++] *= scaleinv * greensfn[i]; - work1[n++] *= scaleinv * greensfn[i]; - } - - // extra FFTs for per-atom energy/virial - - if (evflag_atom) poisson_peratom(); - - // triclinic system - - if (triclinic) { - poisson_ik_triclinic(); - return; - } - - // compute gradients of V(r) in each of 3 dims by transformimg -ik*V(k) - // FFT leaves data in 3d brick decomposition - // copy it into inner portion of vdx,vdy,vdz arrays - - // x direction gradient - n = 0; - for (k = nzlo_fft; k <= nzhi_fft; k++) - for (j = nylo_fft; j <= nyhi_fft; j++) - for (i = nxlo_fft; i <= nxhi_fft; i++) { - work2[n] = fkx[i]*work1[n+1]; - work2[n+1] = -fkx[i]*work1[n]; - n += 2; - } - - fft2->compute(work2,work2,-1); - - // y direction gradient - - n = 0; - for (k = nzlo_fft; k <= nzhi_fft; k++) - for (j = nylo_fft; j <= nyhi_fft; j++) - for (i = nxlo_fft; i <= nxhi_fft; i++) { - work3[n] = fky[j]*work1[n+1]; - work3[n+1] = -fky[j]*work1[n]; - n += 2; - } - - fft2->compute(work3,work3,-1); - - n = 0; - for (k = nzlo_in; k <= nzhi_in; k++) - for (j = nylo_in; j <= nyhi_in; j++) - for (i = nxlo_in; i <= nxhi_in; i++) { - vdxy_brick[k][j][2*i] = work2[n]; - vdxy_brick[k][j][2*i+1] = work3[n]; - n += 2; - } - - // z direction gradient - - n = 0; - for (k = nzlo_fft; k <= nzhi_fft; k++) - for (j = nylo_fft; j <= nyhi_fft; j++) - for (i = nxlo_fft; i <= nxhi_fft; i++) { - work2[n] = fkz[k]*work1[n+1]; - work2[n+1] = -fkz[k]*work1[n]; - n += 2; - } - - fft2->compute(work2,work2,-1); - - n = 0; - for (k = nzlo_in; k <= nzhi_in; k++) - for (j = nylo_in; j <= nyhi_in; j++) - for (i = nxlo_in; i <= nxhi_in; i++) { - vdz0_brick[k][j][2*i] = work2[n]; - vdz0_brick[k][j][2*i+1] = 0.; - n += 2; - } -} - /* ---------------------------------------------------------------------- precompute rho coefficients as a lookup table to save time in make_rho and fieldforce. Instead of doing this polynomial for every atom 6 times @@ -1141,46 +944,6 @@ void PPPMIntel::precompute_rho() } } -/* ---------------------------------------------------------------------- - pack own values to buf to send to another proc -------------------------------------------------------------------------- */ - -void PPPMIntel::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) -{ - int n = 0; - - if ((flag == FORWARD_IK) && _use_packing) { - FFT_SCALAR *xsrc = &vdxy_brick[nzlo_out][nylo_out][2*nxlo_out]; - FFT_SCALAR *zsrc = &vdz0_brick[nzlo_out][nylo_out][2*nxlo_out]; - for (int i = 0; i < nlist; i++) { - buf[n++] = xsrc[list[i]]; - buf[n++] = zsrc[list[i]]; - } - } else { - PPPM::pack_forward(flag, buf, nlist, list); - } -} - -/* ---------------------------------------------------------------------- - unpack another proc's own values from buf and set own ghost values -------------------------------------------------------------------------- */ - -void PPPMIntel::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) -{ - int n = 0; - - if ((flag == FORWARD_IK) && _use_packing) { - FFT_SCALAR *xdest = &vdxy_brick[nzlo_out][nylo_out][2*nxlo_out]; - FFT_SCALAR *zdest = &vdz0_brick[nzlo_out][nylo_out][2*nxlo_out]; - for (int i = 0; i < nlist; i++) { - xdest[list[i]] = buf[n++]; - zdest[list[i]] = buf[n++]; - } - } else { - PPPM::unpack_forward(flag, buf, nlist, list); - } -} - /* ---------------------------------------------------------------------- memory usage of local arrays ------------------------------------------------------------------------- */ @@ -1201,14 +964,6 @@ double PPPMIntel::memory_usage() bytes += rho_points * INTEL_P3M_ALIGNED_MAXORDER * sizeof(FFT_SCALAR); } } - if (_use_packing) { - bytes += 2 * (nzhi_out + 2 - nzlo_out + 1) * (nyhi_out - nylo_out + 1) - * (2 * nxhi_out + 1 - 2 * nxlo_out + 1) * sizeof(FFT_SCALAR); - bytes -= 3 * (nxhi_out - nxlo_out + 1) * (nyhi_out - nylo_out + 1) - * (nzhi_out - nzlo_out + 1) * sizeof(FFT_SCALAR); - bytes += 2 * nfft_both * sizeof(FFT_SCALAR); - bytes += cg_pack->memory_usage(); - } return bytes; } diff --git a/src/USER-INTEL/pppm_intel.h b/src/USER-INTEL/pppm_intel.h index 5bffabe0e5..2a57372558 100644 --- a/src/USER-INTEL/pppm_intel.h +++ b/src/USER-INTEL/pppm_intel.h @@ -38,8 +38,6 @@ class PPPMIntel : public PPPM { virtual ~PPPMIntel(); virtual void init(); virtual void compute(int, int); - virtual void pack_forward(int, FFT_SCALAR *, int, int *); - virtual void unpack_forward(int, FFT_SCALAR *, int, int *); virtual double memory_usage(); void compute_first(int, int); void compute_second(int, int); @@ -64,12 +62,6 @@ class PPPMIntel : public PPPM { FFT_SCALAR **drho_lookup; FFT_SCALAR half_rho_scale, half_rho_scale_plus; - int _use_packing; - FFT_SCALAR ***vdxy_brick; - FFT_SCALAR ***vdz0_brick; - FFT_SCALAR *work3; - class GridComm *cg_pack; - #ifdef _LMP_INTEL_OFFLOAD int _use_base; #endif @@ -92,23 +84,14 @@ class PPPMIntel : public PPPM { make_rho(buffers); } } - void poisson_ik_intel(); - template + template void fieldforce_ik(IntelBuffers *buffers); template void fieldforce_ik(IntelBuffers *buffers) { if (_use_table == 1) { - if (_use_packing == 1) { - fieldforce_ik(buffers); - } else { - fieldforce_ik(buffers); - } + fieldforce_ik(buffers); } else { - if (_use_packing == 1) { - fieldforce_ik(buffers); - } else { - fieldforce_ik(buffers); - } + fieldforce_ik(buffers); } } template diff --git a/src/USER-INTEL/verlet_lrt_intel.cpp b/src/USER-INTEL/verlet_lrt_intel.cpp index 81f4586143..1b9c305e9c 100644 --- a/src/USER-INTEL/verlet_lrt_intel.cpp +++ b/src/USER-INTEL/verlet_lrt_intel.cpp @@ -68,7 +68,7 @@ void VerletLRTIntel::init() _intel_kspace = (PPPMIntel*)(force->kspace_match("pppm/intel", 0)); - #ifdef LMP_INTEL_NOLRT + #ifndef LMP_INTEL_USELRT error->all(FLERR, "LRT otion for Intel package disabled at compile time"); #endif @@ -142,7 +142,7 @@ void VerletLRTIntel::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; // compute all forces @@ -276,7 +276,7 @@ void VerletLRTIntel::run(int n) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); } diff --git a/src/USER-INTEL/verlet_lrt_intel.h b/src/USER-INTEL/verlet_lrt_intel.h index 0521b161c7..7380cc6376 100644 --- a/src/USER-INTEL/verlet_lrt_intel.h +++ b/src/USER-INTEL/verlet_lrt_intel.h @@ -23,8 +23,7 @@ IntegrateStyle(verlet/lrt/intel,VerletLRTIntel) #include "verlet.h" #include "pppm_intel.h" -#ifndef LMP_INTEL_NOLRT - +#ifdef LMP_INTEL_USELRT #ifdef LMP_INTEL_LRT11 #define _LMP_INTEL_LRT_11 #include @@ -42,7 +41,7 @@ class VerletLRTIntel : public Verlet { VerletLRTIntel(class LAMMPS *, int, char **); virtual ~VerletLRTIntel(); virtual void init(); - virtual void setup(int flag = 1); + virtual void setup(int flag); virtual void run(int); protected: diff --git a/src/USER-LB/fix_lb_rigid_pc_sphere.cpp b/src/USER-LB/fix_lb_rigid_pc_sphere.cpp index b5383fe1a6..42e8eae3d2 100644 --- a/src/USER-LB/fix_lb_rigid_pc_sphere.cpp +++ b/src/USER-LB/fix_lb_rigid_pc_sphere.cpp @@ -51,6 +51,7 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : rigid_flag = 1; create_attribute = 1; virial_flag = 1; + thermo_virial = 1; // perform initial allocation of atom-based arrays // register with Atom class @@ -153,7 +154,7 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : for (ibody = 0; ibody < nbody; ibody++) { igroups[ibody] = group->find(arg[5+ibody]); if (igroups[ibody] == -1) - error->all(FLERR,"Could not find fix lb/rigid/pc/sphere group ID"); + error->all(FLERR,"Could not find fix lb/rigid/pc/sphere group ID"); } int *mask = atom->mask; @@ -163,11 +164,11 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : for (i = 0; i < nlocal; i++) { body[i] = -1; if (mask[i] & groupbit) - for (ibody = 0; ibody < nbody; ibody++) - if (mask[i] & group->bitmask[igroups[ibody]]) { - if (body[i] >= 0) flag = 1; - body[i] = ibody; - } + for (ibody = 0; ibody < nbody; ibody++) + if (mask[i] & group->bitmask[igroups[ibody]]) { + if (body[i] >= 0) flag = 1; + body[i] = ibody; + } } int flagall; @@ -250,10 +251,10 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : int count = 0; for (int m = mlo; m <= mhi; m++) { - fflag[m-1][0] = xflag; - fflag[m-1][1] = yflag; - fflag[m-1][2] = zflag; - count++; + fflag[m-1][0] = xflag; + fflag[m-1][1] = yflag; + fflag[m-1][2] = zflag; + count++; } if (count == 0) error->all(FLERR,"Illegal fix lb/rigid/pc/sphere command"); @@ -277,10 +278,10 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : int count = 0; for (int m = mlo; m <= mhi; m++) { - tflag[m-1][0] = xflag; - tflag[m-1][1] = yflag; - tflag[m-1][2] = zflag; - count++; + tflag[m-1][0] = xflag; + tflag[m-1][1] = yflag; + tflag[m-1][2] = zflag; + count++; } if (count == 0) error->all(FLERR,"Illegal fix lb/rigid/pc/sphere command"); @@ -291,7 +292,7 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : inner_nodes = 1; igroupinner = group->find(arg[iarg+1]); if(igroupinner == -1) - error->all(FLERR,"Could not find fix lb/rigid/pc/sphere innerNodes group ID"); + error->all(FLERR,"Could not find fix lb/rigid/pc/sphere innerNodes group ID"); iarg += 2; } else error->all(FLERR,"Illegal fix lb/rigid/pc/sphere command"); } @@ -332,7 +333,7 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : for(ibody=0; ibodybitmask[igroupinner])){ - if(body[i] >= 0) ncount[body[i]]++; + if(body[i] >= 0) ncount[body[i]]++; } } @@ -379,17 +380,17 @@ FixLbRigidPCSphere::FixLbRigidPCSphere(LAMMPS *lmp, int narg, char **arg) : if(inner_nodes == 1){ for(int j=0; jbitmask[igroupinner]) && !(mask[j] & groupbit_lb_fluid)) - error->one(FLERR,"use the innerNodes keyword in the lb/rigid/pc/sphere fix for atoms which do not interact with the lb/fluid"); + error->one(FLERR,"use the innerNodes keyword in the lb/rigid/pc/sphere fix for atoms which do not interact with the lb/fluid"); // If inner nodes are present, which should not interact with the fluid, make // sure these are not used by the lb/fluid fix to apply a force to the fluid. if((mask[j] & groupbit) && (mask[j] & groupbit_lb_fluid) && (mask[j] & group->bitmask[igroupinner])) - error->one(FLERR,"the inner nodes specified in lb/rigid/pc/sphere should not be included in the lb/fluid fix"); + error->one(FLERR,"the inner nodes specified in lb/rigid/pc/sphere should not be included in the lb/fluid fix"); } }else{ for(int j=0; jone(FLERR,"use the innerNodes keyword in the lb/rigid/pc/sphere fix for atoms which do not interact with the lb/fluid"); + error->one(FLERR,"use the innerNodes keyword in the lb/rigid/pc/sphere fix for atoms which do not interact with the lb/fluid"); } } @@ -519,9 +520,9 @@ void FixLbRigidPCSphere::init() else massone = mass[type[i]]; if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) || - (zbox && !periodicity[2])) - error->one(FLERR,"Fix lb/rigid/pc/sphere atom has non-zero image flag " - "in a non-periodic dimension"); + (zbox && !periodicity[2])) + error->one(FLERR,"Fix lb/rigid/pc/sphere atom has non-zero image flag " + "in a non-periodic dimension"); xunwrap = x[i][0] + xbox*xprd; yunwrap = x[i][1] + ybox*yprd; @@ -533,7 +534,7 @@ void FixLbRigidPCSphere::init() sum[ibody][3] += massone; if(inner_nodes == 1){ if(!(mask[i] & group->bitmask[igroupinner])){ - sum[ibody][4] += massone; + sum[ibody][4] += massone; } }else{ sum[ibody][4] += massone; @@ -563,22 +564,22 @@ void FixLbRigidPCSphere::init() if(body[i] < 0) continue; if(inner_nodes == 1){ if(!(mask[i] & group->bitmask[igroupinner])){ - ibody = body[i]; + ibody = body[i]; - xbox = (image[i] & IMGMASK) - IMGMAX; - ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; - zbox = (image[i] >> IMG2BITS) - IMGMAX; + xbox = (image[i] & IMGMASK) - IMGMAX; + ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX; + zbox = (image[i] >> IMG2BITS) - IMGMAX; - xunwrap = x[i][0] + xbox*xprd; - yunwrap = x[i][1] + ybox*yprd; - zunwrap = x[i][2] + zbox*zprd; + xunwrap = x[i][0] + xbox*xprd; + yunwrap = x[i][1] + ybox*yprd; + zunwrap = x[i][2] + zbox*zprd; - dx = xunwrap - xcm[ibody][0]; - dy = yunwrap - xcm[ibody][1]; - dz = zunwrap - xcm[ibody][2]; + dx = xunwrap - xcm[ibody][0]; + dy = yunwrap - xcm[ibody][1]; + dz = zunwrap - xcm[ibody][2]; - sum[ibody][0] += dx*dx + dy*dy + dz*dz; - sum[ibody][1] += Gamma[type[i]]; + sum[ibody][0] += dx*dx + dy*dy + dz*dz; + sum[ibody][1] += Gamma[type[i]]; } }else{ ibody = body[i]; @@ -613,16 +614,16 @@ void FixLbRigidPCSphere::init() if(body[i] < 0) continue; if(inner_nodes == 1){ if(!(mask[i] & group->bitmask[igroupinner])){ - ibody = body[i]; + ibody = body[i]; - if(Gamma_MD[ibody]*dt_lb/dm_lb - Gamma[type[i]] > eps) - error->one(FLERR,"All atoms in a rigid body must have the same gamma value"); + if(Gamma_MD[ibody]*dt_lb/dm_lb - Gamma[type[i]] > eps) + error->one(FLERR,"All atoms in a rigid body must have the same gamma value"); } }else{ ibody = body[i]; - if(Gamma_MD[ibody]*dt_lb/dm_lb - Gamma[type[i]] > eps) - error->one(FLERR,"All atoms in a rigid body must have the same gamma value"); + if(Gamma_MD[ibody]*dt_lb/dm_lb - Gamma[type[i]] > eps) + error->one(FLERR,"All atoms in a rigid body must have the same gamma value"); } } @@ -744,14 +745,15 @@ void FixLbRigidPCSphere::setup(int vflag) // Set the velocities set_v(); - if (vflag_global) - for (n = 0; n < 6; n++) virial[n] *= 2.0; - if (vflag_atom) { - for (i = 0; i < nlocal; i++) - for (n = 0; n < 6; n++) - vatom[i][n] *= 2.0; + if (evflag) { + if (vflag_global) + for (n = 0; n < 6; n++) virial[n] *= 2.0; + if (vflag_atom) { + for (i = 0; i < nlocal; i++) + for (n = 0; n < 6; n++) + vatom[i][n] *= 2.0; + } } - } /* ---------------------------------------------------------------------- */ @@ -792,9 +794,9 @@ void FixLbRigidPCSphere::initial_integrate(int vflag) if(inner_nodes == 1){ if(!(mask[i] & group->bitmask[igroupinner])){ - sum[ibody][0] += up[i][0]*massone; - sum[ibody][1] += up[i][1]*massone; - sum[ibody][2] += up[i][2]*massone; + sum[ibody][0] += up[i][0]*massone; + sum[ibody][1] += up[i][1]*massone; + sum[ibody][2] += up[i][2]*massone; } }else{ sum[ibody][0] += up[i][0]*massone; @@ -829,23 +831,23 @@ void FixLbRigidPCSphere::initial_integrate(int vflag) if(inner_nodes == 1){ if(!(mask[i] & group->bitmask[igroupinner])){ - sum[ibody][0] += Gamma_MD[ibody]*(dy * ((up[i][2]-vcm[ibody][2])) - - dz * ((up[i][1]-vcm[ibody][1]))); - sum[ibody][1] += Gamma_MD[ibody]*(dz * ((up[i][0]-vcm[ibody][0])) - - dx * ((up[i][2]-vcm[ibody][2]))); - sum[ibody][2] += Gamma_MD[ibody]*(dx * ((up[i][1]-vcm[ibody][1])) - - dy * ((up[i][0]-vcm[ibody][0]))); - sum[ibody][3] += -Gamma_MD[ibody]*(v[i][0]-up[i][0]); - sum[ibody][4] += -Gamma_MD[ibody]*(v[i][1]-up[i][1]); - sum[ibody][5] += -Gamma_MD[ibody]*(v[i][2]-up[i][2]); + sum[ibody][0] += Gamma_MD[ibody]*(dy * ((up[i][2]-vcm[ibody][2])) - + dz * ((up[i][1]-vcm[ibody][1]))); + sum[ibody][1] += Gamma_MD[ibody]*(dz * ((up[i][0]-vcm[ibody][0])) - + dx * ((up[i][2]-vcm[ibody][2]))); + sum[ibody][2] += Gamma_MD[ibody]*(dx * ((up[i][1]-vcm[ibody][1])) - + dy * ((up[i][0]-vcm[ibody][0]))); + sum[ibody][3] += -Gamma_MD[ibody]*(v[i][0]-up[i][0]); + sum[ibody][4] += -Gamma_MD[ibody]*(v[i][1]-up[i][1]); + sum[ibody][5] += -Gamma_MD[ibody]*(v[i][2]-up[i][2]); } }else{ sum[ibody][0] += Gamma_MD[ibody]*(dy * ((up[i][2]-vcm[ibody][2])) - - dz * ((up[i][1]-vcm[ibody][1]))); + dz * ((up[i][1]-vcm[ibody][1]))); sum[ibody][1] += Gamma_MD[ibody]*(dz * ((up[i][0]-vcm[ibody][0])) - - dx * ((up[i][2]-vcm[ibody][2]))); + dx * ((up[i][2]-vcm[ibody][2]))); sum[ibody][2] += Gamma_MD[ibody]*(dx * ((up[i][1]-vcm[ibody][1])) - - dy * ((up[i][0]-vcm[ibody][0]))); + dy * ((up[i][0]-vcm[ibody][0]))); sum[ibody][3] += -Gamma_MD[ibody]*(v[i][0]-up[i][0]); sum[ibody][4] += -Gamma_MD[ibody]*(v[i][1]-up[i][1]); sum[ibody][5] += -Gamma_MD[ibody]*(v[i][2]-up[i][2]); @@ -900,15 +902,15 @@ void FixLbRigidPCSphere::initial_integrate(int vflag) if(fflag[ibody][0]==1){ vcm[ibody][0] = expminusdttimesgamma*(vcm[ibody][0] - ucm[ibody][0] - fcm[ibody][0]*force_factor) - + ucm[ibody][0] + fcm[ibody][0]*force_factor; + + ucm[ibody][0] + fcm[ibody][0]*force_factor; } if(fflag[ibody][1]==1){ vcm[ibody][1] = expminusdttimesgamma*(vcm[ibody][1] - ucm[ibody][1] - fcm[ibody][1]*force_factor) + - ucm[ibody][1] + fcm[ibody][1]*force_factor; + ucm[ibody][1] + fcm[ibody][1]*force_factor; } if(fflag[ibody][2]==1){ vcm[ibody][2] = expminusdttimesgamma*(vcm[ibody][2] - ucm[ibody][2] - fcm[ibody][2]*force_factor) + - ucm[ibody][2] + fcm[ibody][2]*force_factor; + ucm[ibody][2] + fcm[ibody][2]*force_factor; } // Approximate angmom @@ -918,21 +920,21 @@ void FixLbRigidPCSphere::initial_integrate(int vflag) if(tflag[ibody][0]==1){ omega[ibody][0] = expminusdttimesgamma*(omega[ibody][0] - (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* - (force->ftm2v*torque[ibody][0] + torque_fluid[ibody][0])) + - (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* - (force->ftm2v*torque[ibody][0] + torque_fluid[ibody][0]); + (force->ftm2v*torque[ibody][0] + torque_fluid[ibody][0])) + + (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* + (force->ftm2v*torque[ibody][0] + torque_fluid[ibody][0]); } if(tflag[ibody][1]==1){ omega[ibody][1] = expminusdttimesgamma*(omega[ibody][1] - (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* - (force->ftm2v*torque[ibody][1] + torque_fluid[ibody][1])) + - (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* - (force->ftm2v*torque[ibody][1] + torque_fluid[ibody][1]); + (force->ftm2v*torque[ibody][1] + torque_fluid[ibody][1])) + + (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* + (force->ftm2v*torque[ibody][1] + torque_fluid[ibody][1]); } if(tflag[ibody][2]==1){ omega[ibody][2] = expminusdttimesgamma*(omega[ibody][2] - (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* - (force->ftm2v*torque[ibody][2] + torque_fluid[ibody][2])) + - (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* - (force->ftm2v*torque[ibody][2] + torque_fluid[ibody][2]); + (force->ftm2v*torque[ibody][2] + torque_fluid[ibody][2])) + + (3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))* + (force->ftm2v*torque[ibody][2] + torque_fluid[ibody][2]); } } @@ -1012,11 +1014,11 @@ void FixLbRigidPCSphere::final_integrate() DMDcoeff = (dtv - (1.0-expminusdttimesgamma)/torque_factor); omega[ibody][0] += tflag[ibody][0]*(3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))*DMDcoeff* - force->ftm2v*(torque[ibody][0] - torque_old[ibody][0])/dtv; + force->ftm2v*(torque[ibody][0] - torque_old[ibody][0])/dtv; omega[ibody][1] += tflag[ibody][1]*(3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))*DMDcoeff* - force->ftm2v*(torque[ibody][1] - torque_old[ibody][1])/dtv; + force->ftm2v*(torque[ibody][1] - torque_old[ibody][1])/dtv; omega[ibody][2] += tflag[ibody][2]*(3.0/(2.0*nrigid_shell[ibody]*sphereradius[ibody]*sphereradius[ibody]*Gamma_MD[ibody]))*DMDcoeff* - force->ftm2v*(torque[ibody][2] - torque_old[ibody][2])/dtv; + force->ftm2v*(torque[ibody][2] - torque_old[ibody][2])/dtv; } //Next, calculate the correction to the velocity and angular momentum due to the fluid forces: @@ -1042,26 +1044,26 @@ void FixLbRigidPCSphere::final_integrate() if(inner_nodes == 1){ if(!(mask[i] & group->bitmask[igroupinner])){ - sum[ibody][0] += up[i][0]*massone; - sum[ibody][1] += up[i][1]*massone; - sum[ibody][2] += up[i][2]*massone; - sum[ibody][3] += Gamma_MD[ibody]*(dy * ((up[i][2]-vcm[ibody][2])) - - dz * ((up[i][1]-vcm[ibody][1]))); - sum[ibody][4] += Gamma_MD[ibody]*(dz * ((up[i][0]-vcm[ibody][0])) - - dx * ((up[i][2]-vcm[ibody][2]))); - sum[ibody][5] += Gamma_MD[ibody]*(dx * ((up[i][1]-vcm[ibody][1])) - - dy * ((up[i][0]-vcm[ibody][0]))); + sum[ibody][0] += up[i][0]*massone; + sum[ibody][1] += up[i][1]*massone; + sum[ibody][2] += up[i][2]*massone; + sum[ibody][3] += Gamma_MD[ibody]*(dy * ((up[i][2]-vcm[ibody][2])) - + dz * ((up[i][1]-vcm[ibody][1]))); + sum[ibody][4] += Gamma_MD[ibody]*(dz * ((up[i][0]-vcm[ibody][0])) - + dx * ((up[i][2]-vcm[ibody][2]))); + sum[ibody][5] += Gamma_MD[ibody]*(dx * ((up[i][1]-vcm[ibody][1])) - + dy * ((up[i][0]-vcm[ibody][0]))); } }else{ sum[ibody][0] += up[i][0]*massone; sum[ibody][1] += up[i][1]*massone; sum[ibody][2] += up[i][2]*massone; sum[ibody][3] += Gamma_MD[ibody]*(dy * ((up[i][2]-vcm[ibody][2])) - - dz * ((up[i][1]-vcm[ibody][1]))); + dz * ((up[i][1]-vcm[ibody][1]))); sum[ibody][4] += Gamma_MD[ibody]*(dz * ((up[i][0]-vcm[ibody][0])) - - dx * ((up[i][2]-vcm[ibody][2]))); + dx * ((up[i][2]-vcm[ibody][2]))); sum[ibody][5] += Gamma_MD[ibody]*(dx * ((up[i][1]-vcm[ibody][1])) - - dy * ((up[i][0]-vcm[ibody][0]))); + dy * ((up[i][0]-vcm[ibody][0]))); } } @@ -1521,8 +1523,8 @@ double FixLbRigidPCSphere::compute_scalar() for (int i = 0; i < nbody; i++) { t += masstotal[i] * (fflag[i][0]*vcm[i][0]*vcm[i][0] + - fflag[i][1]*vcm[i][1]*vcm[i][1] + \ - fflag[i][2]*vcm[i][2]*vcm[i][2]); + fflag[i][1]*vcm[i][1]*vcm[i][1] + \ + fflag[i][2]*vcm[i][2]*vcm[i][2]); // wbody = angular velocity in body frame @@ -1602,88 +1604,88 @@ double FixLbRigidPCSphere::compute_array(int i, int j) up[i][0]=0.0; up[i][1]=0.0; up[i][2]=0.0; if(trilinear_stencil==0){ - isten=0; - for(ii=-1; ii<3; ii++){ - rsq=(-dx1+ii)*(-dx1+ii); + isten=0; + for(ii=-1; ii<3; ii++){ + rsq=(-dx1+ii)*(-dx1+ii); - if(rsq>=4) - weightx=0.0; - else{ - r=sqrt(rsq); - if(rsq>1){ - weightx=(5.0-2.0*r-sqrt(-7.0+12.0*r-4.0*rsq))/8.; - } else{ - weightx=(3.0-2.0*r+sqrt(1.0+4.0*r-4.0*rsq))/8.; - } - } - for(jj=-1; jj<3; jj++){ - rsq=(-dy1+jj)*(-dy1+jj); - if(rsq>=4) - weighty=0.0; - else{ - r=sqrt(rsq); - if(rsq>1){ - weighty=(5.0-2.0*r-sqrt(-7.0+12.0*r-4.0*rsq))/8.; - } else{ - weighty=(3.0-2.0*r+sqrt(1.0+4.0*r-4.0*rsq))/8.; - } - } - for(kk=-1; kk<3; kk++){ - rsq=(-dz1+kk)*(-dz1+kk); - if(rsq>=4) - weightz=0.0; - else{ - r=sqrt(rsq); - if(rsq>1){ - weightz=(5.0-2.0*r-sqrt(-7.0+12.0*r-4.0*rsq))/8.; - } else{ - weightz=(3.0-2.0*r+sqrt(1.0+4.0*r-4.0*rsq))/8.; - } - } - ixp = ix+ii; - iyp = iy+jj; - izp = iz+kk; + if(rsq>=4) + weightx=0.0; + else{ + r=sqrt(rsq); + if(rsq>1){ + weightx=(5.0-2.0*r-sqrt(-7.0+12.0*r-4.0*rsq))/8.; + } else{ + weightx=(3.0-2.0*r+sqrt(1.0+4.0*r-4.0*rsq))/8.; + } + } + for(jj=-1; jj<3; jj++){ + rsq=(-dy1+jj)*(-dy1+jj); + if(rsq>=4) + weighty=0.0; + else{ + r=sqrt(rsq); + if(rsq>1){ + weighty=(5.0-2.0*r-sqrt(-7.0+12.0*r-4.0*rsq))/8.; + } else{ + weighty=(3.0-2.0*r+sqrt(1.0+4.0*r-4.0*rsq))/8.; + } + } + for(kk=-1; kk<3; kk++){ + rsq=(-dz1+kk)*(-dz1+kk); + if(rsq>=4) + weightz=0.0; + else{ + r=sqrt(rsq); + if(rsq>1){ + weightz=(5.0-2.0*r-sqrt(-7.0+12.0*r-4.0*rsq))/8.; + } else{ + weightz=(3.0-2.0*r+sqrt(1.0+4.0*r-4.0*rsq))/8.; + } + } + ixp = ix+ii; + iyp = iy+jj; + izp = iz+kk; - if(ixp==-1) ixp=subNbx+2; - if(iyp==-1) iyp=subNby+2; - if(izp==-1) izp=subNbz+2; + if(ixp==-1) ixp=subNbx+2; + if(iyp==-1) iyp=subNby+2; + if(izp==-1) izp=subNbz+2; - FfP[isten] = weightx*weighty*weightz; - // interpolated velocity based on delta function. - for(k=0; k<3; k++){ - up[i][k] += u_lb[ixp][iyp][izp][k]*FfP[isten]; - } - } - } - } + FfP[isten] = weightx*weighty*weightz; + // interpolated velocity based on delta function. + for(k=0; k<3; k++){ + up[i][k] += u_lb[ixp][iyp][izp][k]*FfP[isten]; + } + } + } + } }else{ - FfP[0] = (1.-dx1)*(1.-dy1)*(1.-dz1); - FfP[1] = (1.-dx1)*(1.-dy1)*dz1; - FfP[2] = (1.-dx1)*dy1*(1.-dz1); - FfP[3] = (1.-dx1)*dy1*dz1; - FfP[4] = dx1*(1.-dy1)*(1.-dz1); - FfP[5] = dx1*(1.-dy1)*dz1; - FfP[6] = dx1*dy1*(1.-dz1); - FfP[7] = dx1*dy1*dz1; + FfP[0] = (1.-dx1)*(1.-dy1)*(1.-dz1); + FfP[1] = (1.-dx1)*(1.-dy1)*dz1; + FfP[2] = (1.-dx1)*dy1*(1.-dz1); + FfP[3] = (1.-dx1)*dy1*dz1; + FfP[4] = dx1*(1.-dy1)*(1.-dz1); + FfP[5] = dx1*(1.-dy1)*dz1; + FfP[6] = dx1*dy1*(1.-dz1); + FfP[7] = dx1*dy1*dz1; - ixp = (ix+1); - iyp = (iy+1); - izp = (iz+1); + ixp = (ix+1); + iyp = (iy+1); + izp = (iz+1); - for (k=0; k<3; k++) { // tri-linearly interpolated velocity at node - up[i][k] = u_lb[ix][iy][iz][k]*FfP[0] - + u_lb[ix][iy][izp][k]*FfP[1] - + u_lb[ix][iyp][iz][k]*FfP[2] - + u_lb[ix][iyp][izp][k]*FfP[3] - + u_lb[ixp][iy][iz][k]*FfP[4] - + u_lb[ixp][iy][izp][k]*FfP[5] - + u_lb[ixp][iyp][iz][k]*FfP[6] - + u_lb[ixp][iyp][izp][k]*FfP[7]; - } + for (k=0; k<3; k++) { // tri-linearly interpolated velocity at node + up[i][k] = u_lb[ix][iy][iz][k]*FfP[0] + + u_lb[ix][iy][izp][k]*FfP[1] + + u_lb[ix][iyp][iz][k]*FfP[2] + + u_lb[ix][iyp][izp][k]*FfP[3] + + u_lb[ixp][iy][iz][k]*FfP[4] + + u_lb[ixp][iy][izp][k]*FfP[5] + + u_lb[ixp][iyp][iz][k]*FfP[6] + + u_lb[ixp][iyp][izp][k]*FfP[7]; + } } for(k=0; k<3; k++) - up[i][k] = up[i][k]*dx_lb/dt_lb; + up[i][k] = up[i][k]*dx_lb/dt_lb; } } diff --git a/src/USER-MANIFOLD/manifold_gaussian_bump.cpp b/src/USER-MANIFOLD/manifold_gaussian_bump.cpp index db8c589afb..a9ee35bbfc 100644 --- a/src/USER-MANIFOLD/manifold_gaussian_bump.cpp +++ b/src/USER-MANIFOLD/manifold_gaussian_bump.cpp @@ -134,7 +134,7 @@ public: // Manifold itself: manifold_gaussian_bump::manifold_gaussian_bump(class LAMMPS* lmp, int narg, char **arg) - : manifold(lmp), lut_z(NULL), lut_zp(NULL) {} + : manifold(lmp), lut_z(NULL), lut_zp(NULL) {} manifold_gaussian_bump::~manifold_gaussian_bump() @@ -361,13 +361,13 @@ void manifold_gaussian_bump::test_lut() n( x, nn ); double taper_z; if( xx <= rc1 ){ - taper_z = gaussian_bump(xx); + taper_z = gaussian_bump(xx); }else if( xx < rc2 ){ - taper_z = lut_get_z( xx ); + taper_z = lut_get_z( xx ); }else{ - taper_z = 0.0; + taper_z = 0.0; } - fprintf( fp, "%g %g %g %g %g\n", xx, gaussian_bump(xx), taper_z, + fprintf( fp, "%g %g %g %g %g %g %g\n", xx, gaussian_bump(xx), taper_z, gg, nn[0], nn[1], nn[2] ); } fclose(fp); diff --git a/src/USER-MANIFOLD/manifold_plane_wiggle.cpp b/src/USER-MANIFOLD/manifold_plane_wiggle.cpp index fd50e774da..136c52ab36 100644 --- a/src/USER-MANIFOLD/manifold_plane_wiggle.cpp +++ b/src/USER-MANIFOLD/manifold_plane_wiggle.cpp @@ -24,5 +24,5 @@ void manifold_plane_wiggle::n( const double *x, double *n ) double w = params[1]; n[2] = 1; n[1] = 0.0; - n[0] = -a*w*cos(x[0]); + n[0] = -a*w*cos(w*x[0]); } diff --git a/src/USER-MEAMC/meam_dens_final.cpp b/src/USER-MEAMC/meam_dens_final.cpp index 2adf4000f1..e25c2e7299 100644 --- a/src/USER-MEAMC/meam_dens_final.cpp +++ b/src/USER-MEAMC/meam_dens_final.cpp @@ -33,9 +33,9 @@ MEAM::meam_dens_final(int nlocal, int eflag_either, int eflag_global, int eflag_ if (rho0[i] > 0.0) { if (this->ialloy == 1) { - t_ave[i][0] = t_ave[i][0] / tsq_ave[i][0]; - t_ave[i][1] = t_ave[i][1] / tsq_ave[i][1]; - t_ave[i][2] = t_ave[i][2] / tsq_ave[i][2]; + t_ave[i][0] = (tsq_ave[i][0] != 0.0 ) ? t_ave[i][0] / tsq_ave[i][0] : 0.0; + t_ave[i][1] = (tsq_ave[i][1] != 0.0 ) ? t_ave[i][1] / tsq_ave[i][1] : 0.0; + t_ave[i][0] = (tsq_ave[i][2] != 0.0 ) ? t_ave[i][2] / tsq_ave[i][2] : 0.0; } else if (this->ialloy == 2) { t_ave[i][0] = this->t1_meam[elti]; t_ave[i][1] = this->t2_meam[elti]; diff --git a/src/USER-MESO/README b/src/USER-MESO/README new file mode 100644 index 0000000000..0119fdb9f8 --- /dev/null +++ b/src/USER-MESO/README @@ -0,0 +1,50 @@ +This package implements three extensions of the dissipative particle +dynamics (DPD) method, i.e., energy-conserving DPD (eDPD) that can +model non-isothermal processes, many-body DPD (mDPD) for simulating +vapor-liquid coexistence, and transport DPD (tDPD) for modeling +advection-diffuion-reaction systems. The equations of motion of these +DPD extensions are integrated through the modified velocity-Verlet +(MVV) algorithm. + +Currently, the package has the following features: + +* Three new atom styles (eDPD, mDPD, tDPD) for tracking the particles + with internal temperature, local mass density, and chemical + concentration. + +* Three set commands (edpd/temp, edpd/cv, cc) for setting internal + temperature (edpd/temp) and heat capacity (edpd/cv) for eDPD + particles and for setting chemical concentration (cc) for tDPD + particles. + +* Two compute commands (edpd/temp/atom, tdpd/cc/atom) for accessing + the internal temperature of eDPD particles and the chemical + concentration of tDPD particles. + +* Three fix commands (mvv/dpd, mvv/edpd, mvv/tdpd) for integrating the + shochastic ODEs using the modified velocity-Verlet (MVV) algorithm. + +* Two fix commands (edpd/source, tdpd/source) for adding additional + heat source/sink or chemical concentration source/sink to eDPD and + tDPD particles. + +* One pair style (edpd) for modeling a eDPD fluid. + +* Two pair styles (mdpd/rhosum, mdpd) for modeling a mDPD fluid. + +* One pair style (tdpd) for modeling a tDPD fluid. + +See the doc pages for "atom style edpd", "atom style mdpd", "atom +style tdpd", "set edpd/temp", "set edpd/cv", "set tdpd/cc", "compute +edpd/temp/atom", "compute tdpd/cc/atom", "fix mvv/dpd", "fix +mvv/edpd", "fix mvv/tdpd", "fix edpd/source", "fix tdpd/source", "pair +edpd", "pair mdpd/rhosum", "pair mdpd", "pair tdpd" commands to get +started. At the bottom of the doc pages are many links to additional +documentation contained in the doc/USER/meso directory. + +There are example scripts for using this package in +examples/USER/meso. + +The person who created this package is Zhen Li (zhen_li at brown.edu) +at Division of Applied Mathematics, Brown University, USA. Contact him +directly if you have questions. diff --git a/src/USER-MESO/atom_vec_edpd.cpp b/src/USER-MESO/atom_vec_edpd.cpp new file mode 100644 index 0000000000..385e8fd426 --- /dev/null +++ b/src/USER-MESO/atom_vec_edpd.cpp @@ -0,0 +1,844 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ +#include +#include +#include "atom_vec_edpd.h" +#include "atom.h" +#include "comm.h" +#include "domain.h" +#include "modify.h" +#include "fix.h" +#include "update.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +AtomVecEDPD::AtomVecEDPD(LAMMPS *lmp) : AtomVec(lmp) +{ + if(strcmp(update->unit_style,"lj") != 0) + error->all(FLERR,"Atom style edpd requires lj units"); + + molecular = 0; + mass_type = 1; + forceclearflag = 1; + + comm_x_only = comm_f_only = 0; + comm->ghost_velocity = 1; + + size_forward = 3 + 5; // edpd_temp + vest[4] + size_reverse = 3 + 1; // edpd_flux + size_border = 6 + 6; // edpd_temp + edpd_cv + vest[4] + size_velocity = 3; + size_data_atom = 5 + 2; // we read id + type + edpd_temp + edpd_cv + xyz[3] + size_data_vel = 4; + xcol_data = 5; + + atom->edpd_flag = 1; + atom->vest_flag = 1; +} + +/* ---------------------------------------------------------------------- + grow atom arrays + n = 0 grows arrays by a chunk + n > 0 allocates arrays to size n +------------------------------------------------------------------------- */ + +void AtomVecEDPD::grow(int n) +{ + if (n == 0) grow_nmax(); + else nmax = n; + atom->nmax = nmax; + if (nmax < 0 || nmax > MAXSMALLINT) + error->one(FLERR,"Per-processor system is too big"); + + tag = memory->grow(atom->tag,nmax,"atom:tag"); + type = memory->grow(atom->type,nmax,"atom:type"); + mask = memory->grow(atom->mask,nmax,"atom:mask"); + image = memory->grow(atom->image,nmax,"atom:image"); + x = memory->grow(atom->x,nmax,3,"atom:x"); + v = memory->grow(atom->v,nmax,3,"atom:v"); + f = memory->grow(atom->f,nmax*comm->nthreads,3,"atom:f"); + edpd_cv= memory->grow(atom->edpd_cv, nmax, "atom:edpd_cv"); + edpd_temp = memory->grow(atom->edpd_temp, nmax, "atom:edpd_temp"); + edpd_flux = memory->grow(atom->edpd_flux, nmax*comm->nthreads,"atom:edpd_flux"); + vest = memory->grow(atom->vest, nmax, 4, "atom:vest"); + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax); +} + +/* ---------------------------------------------------------------------- + reset local array ptrs +------------------------------------------------------------------------- */ + +void AtomVecEDPD::grow_reset() +{ + tag = atom->tag; type = atom->type; + mask = atom->mask; image = atom->image; + x = atom->x; v = atom->v; f = atom->f; + edpd_cv = atom->cv; edpd_temp = atom->edpd_temp; edpd_flux = atom->edpd_flux; + vest = atom->vest; +} + +/* ---------------------------------------------------------------------- + copy atom I info to atom J +------------------------------------------------------------------------- */ + +void AtomVecEDPD::copy(int i, int j, int delflag) +{ + tag[j] = tag[i]; + type[j] = type[i]; + mask[j] = mask[i]; + image[j] = image[i]; + x[j][0] = x[i][0]; + x[j][1] = x[i][1]; + x[j][2] = x[i][2]; + v[j][0] = v[i][0]; + v[j][1] = v[i][1]; + v[j][2] = v[i][2]; + + edpd_temp[j] = edpd_temp[i]; + edpd_flux[j] = edpd_flux[i]; + edpd_cv[j] = edpd_cv[i]; + vest[j][0] = vest[i][0]; + vest[j][1] = vest[i][1]; + vest[j][2] = vest[i][2]; + vest[j][3] = vest[i][3]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag); +} + + +void AtomVecEDPD::force_clear(int n, size_t nbytes) +{ + memset(&edpd_flux[n],0,nbytes); +} + + +/* ---------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = edpd_temp[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = edpd_temp[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_comm_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = edpd_temp[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = edpd_temp[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + if (mask[i] & deform_groupbit) { + buf[m++] = v[j][0] + dvx; + buf[m++] = v[j][1] + dvy; + buf[m++] = v[j][2] + dvz; + } else { + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + } + buf[m++] = edpd_temp[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecEDPD::unpack_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + edpd_temp[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + vest[i][3] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecEDPD::unpack_comm_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + v[i][0] = buf[m++]; + v[i][1] = buf[m++]; + v[i][2] = buf[m++]; + edpd_temp[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + vest[i][3] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_reverse(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = f[i][0]; + buf[m++] = f[i][1]; + buf[m++] = f[i][2]; + buf[m++] = edpd_flux[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecEDPD::unpack_reverse(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + f[j][0] += buf[m++]; + f[j][1] += buf[m++]; + f[j][2] += buf[m++]; + edpd_flux[j] += buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_border(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = edpd_temp[j]; + buf[m++] = edpd_cv[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = edpd_temp[j]; + buf[m++] = edpd_cv[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_border_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = edpd_temp[j]; + buf[m++] = edpd_cv[j]; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = edpd_temp[j]; + buf[m++] = edpd_cv[j]; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = edpd_temp[j]; + buf[m++] = edpd_cv[j]; + if (mask[i] & deform_groupbit) { + buf[m++] = v[j][0] + dvx; + buf[m++] = v[j][1] + dvy; + buf[m++] = v[j][2] + dvz; + buf[m++] = vest[j][0] + dvx; + buf[m++] = vest[j][1] + dvy; + buf[m++] = vest[j][2] + dvz; + buf[m++] = vest[j][3]; + } else { + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + buf[m++] = vest[j][3]; + } + } + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecEDPD::unpack_border(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + tag[i] = (tagint) ubuf(buf[m++]).i; + type[i] = (int) ubuf(buf[m++]).i; + mask[i] = (int) ubuf(buf[m++]).i; + edpd_temp[i] = buf[m++]; + edpd_cv[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + vest[i][3] = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecEDPD::unpack_border_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + tag[i] = (tagint) ubuf(buf[m++]).i; + type[i] = (int) ubuf(buf[m++]).i; + mask[i] = (int) ubuf(buf[m++]).i; + edpd_temp[i] = buf[m++]; + edpd_cv[i] = buf[m++]; + v[i][0] = buf[m++]; + v[i][1] = buf[m++]; + v[i][2] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + vest[i][3] = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- + pack data for atom I for sending to another proc + xyz must be 1st 3 values, so comm::exchange() can test on them +------------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_exchange(int i, double *buf) +{ + int m = 1; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + buf[m++] = v[i][0]; + buf[m++] = v[i][1]; + buf[m++] = v[i][2]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = ubuf(type[i]).d; + buf[m++] = ubuf(mask[i]).d; + buf[m++] = ubuf(image[i]).d; + buf[m++] = edpd_temp[i]; + buf[m++] = edpd_cv[i]; + buf[m++] = vest[i][0]; + buf[m++] = vest[i][1]; + buf[m++] = vest[i][2]; + buf[m++] = vest[i][3]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecEDPD::unpack_exchange(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + int m = 1; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + v[nlocal][0] = buf[m++]; + v[nlocal][1] = buf[m++]; + v[nlocal][2] = buf[m++]; + tag[nlocal] = (tagint) ubuf(buf[m++]).i; + type[nlocal] = (int) ubuf(buf[m++]).i; + mask[nlocal] = (int) ubuf(buf[m++]).i; + image[nlocal] = (imageint) ubuf(buf[m++]).i; + edpd_temp[nlocal] = buf[m++]; + edpd_cv[nlocal] = buf[m++]; + vest[nlocal][0] = buf[m++]; + vest[nlocal][1] = buf[m++]; + vest[nlocal][2] = buf[m++]; + vest[nlocal][3] = buf[m++]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]-> + unpack_exchange(nlocal,&buf[m]); + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + size of restart data for all atoms owned by this proc + include extra data stored by fixes +------------------------------------------------------------------------- */ + +int AtomVecEDPD::size_restart() +{ + int i; + + int nlocal = atom->nlocal; + int n = (11 + 6) * nlocal; // 11 + edpd_temp + edpd_cv + vest[4] + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + for (i = 0; i < nlocal; i++) + n += modify->fix[atom->extra_restart[iextra]]->size_restart(i); + + return n; +} + +/* ---------------------------------------------------------------------- + pack atom I's data for restart file including extra quantities + xyz must be 1st 3 values, so that read_restart can test on them + molecular types may be negative, but write as positive +------------------------------------------------------------------------- */ + +int AtomVecEDPD::pack_restart(int i, double *buf) +{ + int m = 1; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = ubuf(type[i]).d; + buf[m++] = ubuf(mask[i]).d; + buf[m++] = ubuf(image[i]).d; + buf[m++] = v[i][0]; + buf[m++] = v[i][1]; + buf[m++] = v[i][2]; + buf[m++] = edpd_temp[i]; + buf[m++] = edpd_cv[i]; + buf[m++] = vest[i][0]; + buf[m++] = vest[i][1]; + buf[m++] = vest[i][2]; + buf[m++] = vest[i][3]; + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- + unpack data for one atom from restart file including extra quantities +------------------------------------------------------------------------- */ + +int AtomVecEDPD::unpack_restart(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) { + grow(0); + if (atom->nextra_store) + memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra"); + } + + int m = 1; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + tag[nlocal] = (tagint) ubuf(buf[m++]).i; + type[nlocal] = (int) ubuf(buf[m++]).i; + mask[nlocal] = (int) ubuf(buf[m++]).i; + image[nlocal] = (imageint) ubuf(buf[m++]).i; + v[nlocal][0] = buf[m++]; + v[nlocal][1] = buf[m++]; + v[nlocal][2] = buf[m++]; + + edpd_temp[nlocal] = buf[m++]; + edpd_cv[nlocal]= buf[m++]; + vest[nlocal][0] = buf[m++]; + vest[nlocal][1] = buf[m++]; + vest[nlocal][2] = buf[m++]; + vest[nlocal][3] = buf[m++]; + + double **extra = atom->extra; + if (atom->nextra_store) { + int size = static_cast (buf[0]) - m; + for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++]; + } + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + create one atom of itype at coord + set other values to defaults +------------------------------------------------------------------------- */ + +void AtomVecEDPD::create_atom(int itype, double *coord) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + tag[nlocal] = 0; + type[nlocal] = itype; + x[nlocal][0] = coord[0]; + x[nlocal][1] = coord[1]; + x[nlocal][2] = coord[2]; + mask[nlocal] = 1; + image[nlocal] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + v[nlocal][0] = 0.0; + v[nlocal][1] = 0.0; + v[nlocal][2] = 0.0; + + edpd_temp[nlocal] = 1.0; + edpd_flux[nlocal] = 0.0; + edpd_cv[nlocal]= 1.0E5; + vest[nlocal][0] = 0.0; + vest[nlocal][1] = 0.0; + vest[nlocal][2] = 0.0; + vest[nlocal][3] = edpd_temp[nlocal]; + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack one line from Atoms section of data file + initialize other atom quantities +------------------------------------------------------------------------- */ + +void AtomVecEDPD::data_atom(double *coord, imageint imagetmp, char **values) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + tag[nlocal] = ATOTAGINT(values[0]); + type[nlocal] = atoi(values[1]); + if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes) + error->one(FLERR,"Invalid atom type in Atoms section of data file"); + + edpd_temp[nlocal] = atof(values[2]); + edpd_cv[nlocal] = atof(values[3]); + + x[nlocal][0] = coord[0]; + x[nlocal][1] = coord[1]; + x[nlocal][2] = coord[2]; + + image[nlocal] = imagetmp; + + mask[nlocal] = 1; + v[nlocal][0] = 0.0; + v[nlocal][1] = 0.0; + v[nlocal][2] = 0.0; + + vest[nlocal][0] = 0.0; + vest[nlocal][1] = 0.0; + vest[nlocal][2] = 0.0; + vest[nlocal][3] = edpd_temp[nlocal]; + edpd_flux[nlocal] = 0.0; + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + pack atom info for data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecEDPD::pack_data(double **buf) +{ + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + buf[i][0] = ubuf(tag[i]).d; + buf[i][1] = ubuf(type[i]).d; + buf[i][2] = edpd_temp[i]; + buf[i][3] = edpd_cv[i]; + buf[i][4] = x[i][0]; + buf[i][5] = x[i][1]; + buf[i][6] = x[i][2]; + buf[i][7] = ubuf((image[i] & IMGMASK) - IMGMAX).d; + buf[i][8] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d; + buf[i][9] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d; + } +} + +/* ---------------------------------------------------------------------- + write atom info to data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecEDPD::write_data(FILE *fp, int n, double **buf) +{ + for (int i = 0; i < n; i++) + fprintf(fp,TAGINT_FORMAT " %d %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %d %d %d\n", + (tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i, + buf[i][2],buf[i][3],buf[i][4],buf[i][5],buf[i][6], + (int) ubuf(buf[i][7]).i,(int) ubuf(buf[i][8]).i,(int) ubuf(buf[i][9]).i); +} + +/* ---------------------------------------------------------------------- + return # of bytes of allocated memory +------------------------------------------------------------------------- */ + +bigint AtomVecEDPD::memory_usage() +{ + bigint bytes = 0; + + if (atom->memcheck("tag")) bytes += memory->usage(tag,nmax); + if (atom->memcheck("type")) bytes += memory->usage(type,nmax); + if (atom->memcheck("mask")) bytes += memory->usage(mask,nmax); + if (atom->memcheck("image")) bytes += memory->usage(image,nmax); + if (atom->memcheck("x")) bytes += memory->usage(x,nmax,3); + if (atom->memcheck("v")) bytes += memory->usage(v,nmax,3); + if (atom->memcheck("f")) bytes += memory->usage(f,nmax*comm->nthreads,3); + if (atom->memcheck("edpd_temp")) bytes += memory->usage(edpd_temp,nmax); + if (atom->memcheck("edpd_flux")) bytes += memory->usage(edpd_flux,nmax*comm->nthreads); + if (atom->memcheck("edpd_cv")) bytes += memory->usage(edpd_cv,nmax); + if (atom->memcheck("vest")) bytes += memory->usage(vest,nmax,4); + + return bytes; +} diff --git a/src/USER-MESO/atom_vec_edpd.h b/src/USER-MESO/atom_vec_edpd.h new file mode 100644 index 0000000000..36a4cae97b --- /dev/null +++ b/src/USER-MESO/atom_vec_edpd.h @@ -0,0 +1,68 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ATOM_CLASS + +AtomStyle(edpd,AtomVecEDPD) + +#else + +#ifndef LMP_ATOM_VEC_EDPD_H +#define LMP_ATOM_VEC_EDPD_H + +#include "atom_vec.h" + +namespace LAMMPS_NS { + +class AtomVecEDPD : public AtomVec { + public: + AtomVecEDPD(class LAMMPS *); + virtual ~AtomVecEDPD() {} + void grow(int); + void grow_reset(); + void copy(int, int, int); + void force_clear(int, size_t); + virtual int pack_comm(int, int *, double *, int, int *); + virtual int pack_comm_vel(int, int *, double *, int, int *); + virtual void unpack_comm(int, int, double *); + virtual void unpack_comm_vel(int, int, double *); + int pack_reverse(int, int, double *); + void unpack_reverse(int, int *, double *); + virtual int pack_border(int, int *, double *, int, int *); + virtual int pack_border_vel(int, int *, double *, int, int *); + virtual void unpack_border(int, int, double *); + virtual void unpack_border_vel(int, int, double *); + virtual int pack_exchange(int, double *); + virtual int unpack_exchange(double *); + int size_restart(); + int pack_restart(int, double *); + int unpack_restart(double *); + void create_atom(int, double *); + void data_atom(double *, imageint, char **); + void pack_data(double **); + void write_data(FILE *, int, double **); + bigint memory_usage(); + + protected: + tagint *tag; + int *type,*mask; + imageint *image; + double **x,**v,**f; + double **vest; // store intermediate velocity for using mvv integrator + double *edpd_temp,*edpd_flux,*edpd_cv; // temperature, heat flux, and heat capacity +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/atom_vec_mdpd.cpp b/src/USER-MESO/atom_vec_mdpd.cpp new file mode 100644 index 0000000000..0d2350a645 --- /dev/null +++ b/src/USER-MESO/atom_vec_mdpd.cpp @@ -0,0 +1,951 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +#include +#include +#include "atom_vec_mdpd.h" +#include "atom.h" +#include "comm.h" +#include "domain.h" +#include "modify.h" +#include "fix.h" +#include "update.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +AtomVecMDPD::AtomVecMDPD(LAMMPS *lmp) : AtomVec(lmp) +{ + if(strcmp(update->unit_style,"lj") != 0) + error->all(FLERR,"Atom style mdpd requires lj units"); + + molecular = 0; + mass_type = 1; + forceclearflag = 1; + + comm_x_only = comm_f_only = 0; + comm->ghost_velocity = 1; + + size_forward = 3 + 4; // 3 + rho + vest[3], that means we may only communicate 4 in hybrid + size_reverse = 3 + 1; // 3 + drho + size_border = 6 + 4; // 6 + rho + vest[3] + size_velocity = 3; + size_data_atom = 6; + size_data_vel = 4; + xcol_data = 4; + + atom->rho_flag = 1; + atom->vest_flag = 1; +} + +/* ---------------------------------------------------------------------- + grow atom arrays + n = 0 grows arrays by a chunk + n > 0 allocates arrays to size n + ------------------------------------------------------------------------- */ + +void AtomVecMDPD::grow(int n) +{ + if (n == 0) grow_nmax(); + else nmax = n; + atom->nmax = nmax; + if (nmax < 0 || nmax > MAXSMALLINT) + error->one(FLERR,"Per-processor system is too big"); + + tag = memory->grow(atom->tag, nmax, "atom:tag"); + type = memory->grow(atom->type, nmax, "atom:type"); + mask = memory->grow(atom->mask, nmax, "atom:mask"); + image = memory->grow(atom->image, nmax, "atom:image"); + x = memory->grow(atom->x, nmax, 3, "atom:x"); + v = memory->grow(atom->v, nmax, 3, "atom:v"); + f = memory->grow(atom->f, nmax*comm->nthreads, 3, "atom:f"); + + rho = memory->grow(atom->rho, nmax, "atom:rho"); + drho = memory->grow(atom->drho, nmax*comm->nthreads, "atom:drho"); + vest = memory->grow(atom->vest, nmax, 3, "atom:vest"); + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax); +} + +/* ---------------------------------------------------------------------- + reset local array ptrs + ------------------------------------------------------------------------- */ + +void AtomVecMDPD::grow_reset() { + tag = atom->tag; + type = atom->type; + mask = atom->mask; + image = atom->image; + x = atom->x; + v = atom->v; + f = atom->f; + rho = atom->rho; + drho = atom->drho; + vest = atom->vest; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::copy(int i, int j, int delflag) { + //printf("in AtomVecMDPD::copy\n"); + tag[j] = tag[i]; + type[j] = type[i]; + mask[j] = mask[i]; + image[j] = image[i]; + x[j][0] = x[i][0]; + x[j][1] = x[i][1]; + x[j][2] = x[i][2]; + v[j][0] = v[i][0]; + v[j][1] = v[i][1]; + v[j][2] = v[i][2]; + + rho[j] = rho[i]; + drho[j] = drho[i]; + vest[j][0] = vest[i][0]; + vest[j][1] = vest[i][1]; + vest[j][2] = vest[i][2]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->copy_arrays(i, j,delflag); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::force_clear(int n, size_t nbytes) +{ + memset(&drho[n],0,nbytes); +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_comm_hybrid(int n, int *list, double *buf) { + //printf("in AtomVecMDPD::pack_comm_hybrid\n"); + int i, j, m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::unpack_comm_hybrid(int n, int first, double *buf) { + //printf("in AtomVecMDPD::unpack_comm_hybrid\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + rho[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_border_hybrid(int n, int *list, double *buf) { + //printf("in AtomVecMDPD::pack_border_hybrid\n"); + int i, j, m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::unpack_border_hybrid(int n, int first, double *buf) { + //printf("in AtomVecMDPD::unpack_border_hybrid\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + rho[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_reverse_hybrid(int n, int first, double *buf) { + //printf("in AtomVecMDPD::pack_reverse_hybrid\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = drho[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::unpack_reverse_hybrid(int n, int *list, double *buf) { + //printf("in AtomVecMDPD::unpack_reverse_hybrid\n"); + int i, j, m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + drho[j] += buf[m++]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_comm(int n, int *list, double *buf, int pbc_flag, + int *pbc) { + //printf("in AtomVecMDPD::pack_comm\n"); + int i, j, m; + double dx, dy, dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0] * domain->xprd; + dy = pbc[1] * domain->yprd; + dz = pbc[2] * domain->zprd; + } else { + dx = pbc[0] * domain->xprd + pbc[5] * domain->xy + pbc[4] * domain->xz; + dy = pbc[1] * domain->yprd + pbc[3] * domain->yz; + dz = pbc[2] * domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_comm_vel(int n, int *list, double *buf, int pbc_flag, + int *pbc) { + //printf("in AtomVecMDPD::pack_comm_vel\n"); + int i, j, m; + double dx, dy, dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0] * domain->xprd; + dy = pbc[1] * domain->yprd; + dz = pbc[2] * domain->zprd; + } else { + dx = pbc[0] * domain->xprd + pbc[5] * domain->xy + pbc[4] * domain->xz; + dy = pbc[1] * domain->yprd + pbc[3] * domain->yz; + dz = pbc[2] * domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::unpack_comm(int n, int first, double *buf) { + //printf("in AtomVecMDPD::unpack_comm\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + rho[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::unpack_comm_vel(int n, int first, double *buf) { + //printf("in AtomVecMDPD::unpack_comm_vel\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + v[i][0] = buf[m++]; + v[i][1] = buf[m++]; + v[i][2] = buf[m++]; + rho[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_reverse(int n, int first, double *buf) { + //printf("in AtomVecMDPD::pack_reverse\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = f[i][0]; + buf[m++] = f[i][1]; + buf[m++] = f[i][2]; + buf[m++] = drho[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::unpack_reverse(int n, int *list, double *buf) { + //printf("in AtomVecMDPD::unpack_reverse\n"); + int i, j, m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + f[j][0] += buf[m++]; + f[j][1] += buf[m++]; + f[j][2] += buf[m++]; + drho[j] += buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_border(int n, int *list, double *buf, int pbc_flag, + int *pbc) { + //printf("in AtomVecMDPD::pack_border\n"); + int i, j, m; + double dx, dy, dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0] * domain->xprd; + dy = pbc[1] * domain->yprd; + dz = pbc[2] * domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_border_vel(int n, int *list, double *buf, int pbc_flag, + int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0] * domain->xprd; + dy = pbc[1] * domain->yprd; + dz = pbc[2] * domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + dvx = pbc[0] * h_rate[0] + pbc[5] * h_rate[5] + pbc[4] * h_rate[4]; + dvy = pbc[1] * h_rate[1] + pbc[3] * h_rate[3]; + dvz = pbc[2] * h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + if (mask[i] & deform_groupbit) { + buf[m++] = v[j][0] + dvx; + buf[m++] = v[j][1] + dvy; + buf[m++] = v[j][2] + dvz; + buf[m++] = rho[j]; + buf[m++] = vest[j][0] + dvx; + buf[m++] = vest[j][1] + dvy; + buf[m++] = vest[j][2] + dvz; + } else { + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + buf[m++] = rho[j]; + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::unpack_border(int n, int first, double *buf) { + //printf("in AtomVecMDPD::unpack_border\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) + grow(0); + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + tag[i] = (tagint) ubuf(buf[m++]).i; + type[i] = (int) ubuf(buf[m++]).i; + mask[i] = (int) ubuf(buf[m++]).i; + rho[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecMDPD::unpack_border_vel(int n, int first, double *buf) { + //printf("in AtomVecMDPD::unpack_border_vel\n"); + int i, m, last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) + grow(0); + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + tag[i] = (tagint) ubuf(buf[m++]).i; + type[i] = (int) ubuf(buf[m++]).i; + mask[i] = (int) ubuf(buf[m++]).i; + v[i][0] = buf[m++]; + v[i][1] = buf[m++]; + v[i][2] = buf[m++]; + rho[i] = buf[m++]; + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- + pack data for atom I for sending to another proc + xyz must be 1st 3 values, so comm::exchange() can test on them + ------------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_exchange(int i, double *buf) { + //printf("in AtomVecMDPD::pack_exchange\n"); + int m = 1; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + buf[m++] = v[i][0]; + buf[m++] = v[i][1]; + buf[m++] = v[i][2]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = ubuf(type[i]).d; + buf[m++] = ubuf(mask[i]).d; + buf[m++] = ubuf(image[i]).d; + buf[m++] = rho[i]; + buf[m++] = vest[i][0]; + buf[m++] = vest[i][1]; + buf[m++] = vest[i][2]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i, &buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecMDPD::unpack_exchange(double *buf) { + //printf("in AtomVecMDPD::unpack_exchange\n"); + int nlocal = atom->nlocal; + if (nlocal == nmax) + grow(0); + + int m = 1; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + v[nlocal][0] = buf[m++]; + v[nlocal][1] = buf[m++]; + v[nlocal][2] = buf[m++]; + tag[nlocal] = (tagint) ubuf(buf[m++]).i; + type[nlocal] = (int) ubuf(buf[m++]).i; + mask[nlocal] = (int) ubuf(buf[m++]).i; + image[nlocal] = (imageint) ubuf(buf[m++]).i; + rho[nlocal] = buf[m++]; + vest[nlocal][0] = buf[m++]; + vest[nlocal][1] = buf[m++]; + vest[nlocal][2] = buf[m++]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]-> unpack_exchange(nlocal, + &buf[m]); + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + size of restart data for all atoms owned by this proc + include extra data stored by fixes + ------------------------------------------------------------------------- */ + +int AtomVecMDPD::size_restart() { + int i; + + int nlocal = atom->nlocal; + int n = 15 * nlocal; // 11 + rho + vest[3] + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + for (i = 0; i < nlocal; i++) + n += modify->fix[atom->extra_restart[iextra]]->size_restart(i); + + return n; +} + +/* ---------------------------------------------------------------------- + pack atom I's data for restart file including extra quantities + xyz must be 1st 3 values, so that read_restart can test on them + molecular types may be negative, but write as positive + ------------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_restart(int i, double *buf) { + int m = 1; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = ubuf(type[i]).d; + buf[m++] = ubuf(mask[i]).d; + buf[m++] = ubuf(image[i]).d; + buf[m++] = v[i][0]; + buf[m++] = v[i][1]; + buf[m++] = v[i][2]; + buf[m++] = rho[i]; + buf[m++] = vest[i][0]; + buf[m++] = vest[i][1]; + buf[m++] = vest[i][2]; + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i, &buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- + unpack data for one atom from restart file including extra quantities + ------------------------------------------------------------------------- */ + +int AtomVecMDPD::unpack_restart(double *buf) { + int nlocal = atom->nlocal; + if (nlocal == nmax) { + grow(0); + if (atom->nextra_store) + memory->grow(atom->extra, nmax, atom->nextra_store, "atom:extra"); + } + + int m = 1; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + tag[nlocal] = (tagint) ubuf(buf[m++]).i; + type[nlocal] = (int) ubuf(buf[m++]).i; + mask[nlocal] = (int) ubuf(buf[m++]).i; + image[nlocal] = (imageint) ubuf(buf[m++]).i; + v[nlocal][0] = buf[m++]; + v[nlocal][1] = buf[m++]; + v[nlocal][2] = buf[m++]; + rho[nlocal] = buf[m++]; + vest[nlocal][0] = buf[m++]; + vest[nlocal][1] = buf[m++]; + vest[nlocal][2] = buf[m++]; + + double **extra = atom->extra; + if (atom->nextra_store) { + int size = static_cast (buf[0]) - m; + for (int i = 0; i < size; i++) + extra[nlocal][i] = buf[m++]; + } + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + create one atom of itype at coord + set other values to defaults + ------------------------------------------------------------------------- */ + +void AtomVecMDPD::create_atom(int itype, double *coord) { + int nlocal = atom->nlocal; + if (nlocal == nmax) + grow(0); + + tag[nlocal] = 0; + type[nlocal] = itype; + x[nlocal][0] = coord[0]; + x[nlocal][1] = coord[1]; + x[nlocal][2] = coord[2]; + mask[nlocal] = 1; + image[nlocal] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + v[nlocal][0] = 0.0; + v[nlocal][1] = 0.0; + v[nlocal][2] = 0.0; + rho[nlocal] = 0.0; + vest[nlocal][0] = 0.0; + vest[nlocal][1] = 0.0; + vest[nlocal][2] = 0.0; + drho[nlocal] = 0.0; + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack one line from Atoms section of data file + initialize other atom quantities + ------------------------------------------------------------------------- */ + +void AtomVecMDPD::data_atom(double *coord, imageint imagetmp, char **values) { + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + tag[nlocal] = ATOTAGINT(values[0]); + type[nlocal] = atoi(values[1]); + if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes) + error->one(FLERR,"Invalid atom type in Atoms section of data file"); + + x[nlocal][0] = coord[0]; + x[nlocal][1] = coord[1]; + x[nlocal][2] = coord[2]; + + image[nlocal] = imagetmp; + + mask[nlocal] = 1; + v[nlocal][0] = 0.0; + v[nlocal][1] = 0.0; + v[nlocal][2] = 0.0; + + vest[nlocal][0] = 0.0; + vest[nlocal][1] = 0.0; + vest[nlocal][2] = 0.0; + + rho[nlocal] = atof(values[2]); + drho[nlocal] = 0.0; + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack hybrid quantities from one line in Atoms section of data file + initialize other atom quantities for this sub-style + ------------------------------------------------------------------------- */ + +int AtomVecMDPD::data_atom_hybrid(int nlocal, char **values) +{ + rho[nlocal] = atof(values[0]); + return 3; +} + +/* ---------------------------------------------------------------------- + pack atom info for data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecMDPD::pack_data(double **buf) +{ + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + buf[i][0] = ubuf(tag[i]).d; + buf[i][1] = ubuf(type[i]).d; + buf[i][2] = rho[i]; + buf[i][3] = x[i][0]; + buf[i][4] = x[i][1]; + buf[i][5] = x[i][2]; + buf[i][6] = ubuf((image[i] & IMGMASK) - IMGMAX).d; + buf[i][7] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d; + buf[i][8] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d; + } +} + +/* ---------------------------------------------------------------------- + pack hybrid atom info for data file +------------------------------------------------------------------------- */ + +int AtomVecMDPD::pack_data_hybrid(int i, double *buf) +{ + buf[0] = rho[i]; + return 3; +} + +/* ---------------------------------------------------------------------- + write atom info to data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecMDPD::write_data(FILE *fp, int n, double **buf) +{ + for (int i = 0; i < n; i++) + fprintf(fp,TAGINT_FORMAT + " %d %-1.16e %-1.16e %-1.16e %-1.16e " + "%d %d %d\n", + (tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i, + buf[i][2],buf[i][3],buf[i][4],buf[i][5], + (int) ubuf(buf[i][6]).i,(int) ubuf(buf[i][7]).i, + (int) ubuf(buf[i][8]).i); +} + +/* ---------------------------------------------------------------------- + write hybrid atom info to data file +------------------------------------------------------------------------- */ + +int AtomVecMDPD::write_data_hybrid(FILE *fp, double *buf) +{ + fprintf(fp," %-1.16e",buf[0]); + return 3; +} + +/* ---------------------------------------------------------------------- + assign an index to named atom property and return index + return -1 if name is unknown to this atom style +------------------------------------------------------------------------- */ + +int AtomVecMDPD::property_atom(char *name) +{ + if (strcmp(name,"rho") == 0) return 0; + if (strcmp(name,"drho") == 0) return 1; + return -1; +} + +/* ---------------------------------------------------------------------- + pack per-atom data into buf for ComputePropertyAtom + index maps to data specific to this atom style +------------------------------------------------------------------------- */ + +void AtomVecMDPD::pack_property_atom(int index, double *buf, + int nvalues, int groupbit) +{ + int *mask = atom->mask; + int nlocal = atom->nlocal; + int n = 0; + + if (index == 0) { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = rho[i]; + else buf[n] = 0.0; + n += nvalues; + } + } else if (index == 1) { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = drho[i]; + else buf[n] = 0.0; + n += nvalues; + } + } +} + +/* ---------------------------------------------------------------------- + return # of bytes of allocated memory + ------------------------------------------------------------------------- */ + +bigint AtomVecMDPD::memory_usage() { + bigint bytes = 0; + + if (atom->memcheck("tag")) bytes += memory->usage(tag, nmax); + if (atom->memcheck("type")) bytes += memory->usage(type, nmax); + if (atom->memcheck("mask")) bytes += memory->usage(mask, nmax); + if (atom->memcheck("image")) bytes += memory->usage(image, nmax); + if (atom->memcheck("x")) bytes += memory->usage(x, nmax, 3); + if (atom->memcheck("v")) bytes += memory->usage(v, nmax, 3); + if (atom->memcheck("f")) bytes += memory->usage(f, nmax*comm->nthreads, 3); + if (atom->memcheck("rho")) bytes += memory->usage(rho, nmax); + if (atom->memcheck("drho")) bytes += memory->usage(drho, nmax*comm->nthreads); + if (atom->memcheck("vest")) bytes += memory->usage(vest, nmax, 3); + + return bytes; +} diff --git a/src/USER-MESO/atom_vec_mdpd.h b/src/USER-MESO/atom_vec_mdpd.h new file mode 100644 index 0000000000..9e9ffcdcf2 --- /dev/null +++ b/src/USER-MESO/atom_vec_mdpd.h @@ -0,0 +1,79 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ATOM_CLASS + +AtomStyle(mdpd,AtomVecMDPD) + +#else + +#ifndef LMP_ATOM_VEC_MDPD_H +#define LMP_ATOM_VEC_MDPD_H + +#include "atom_vec.h" + +namespace LAMMPS_NS { + +class AtomVecMDPD : public AtomVec { + public: + AtomVecMDPD(class LAMMPS *); + ~AtomVecMDPD() {} + void grow(int); + void grow_reset(); + void copy(int, int, int); + void force_clear(int, size_t); + int pack_comm(int, int *, double *, int, int *); + int pack_comm_vel(int, int *, double *, int, int *); + void unpack_comm(int, int, double *); + void unpack_comm_vel(int, int, double *); + int pack_reverse(int, int, double *); + void unpack_reverse(int, int *, double *); + int pack_comm_hybrid(int, int *, double *); + int unpack_comm_hybrid(int, int, double *); + int pack_border_hybrid(int, int *, double *); + int unpack_border_hybrid(int, int, double *); + int pack_reverse_hybrid(int, int, double *); + int unpack_reverse_hybrid(int, int *, double *); + int pack_border(int, int *, double *, int, int *); + int pack_border_vel(int, int *, double *, int, int *); + void unpack_border(int, int, double *); + void unpack_border_vel(int, int, double *); + int pack_exchange(int, double *); + int unpack_exchange(double *); + int size_restart(); + int pack_restart(int, double *); + int unpack_restart(double *); + void create_atom(int, double *); + void data_atom(double *, imageint, char **); + int data_atom_hybrid(int, char **); + void pack_data(double **); + int pack_data_hybrid(int, double *); + void write_data(FILE *, int, double **); + int write_data_hybrid(FILE *, double *); + int property_atom(char *); + void pack_property_atom(int, double *, int, int); + bigint memory_usage(); + + private: + tagint *tag; + int *type,*mask; + imageint *image; + double **x,**v,**f; + double *rho, *drho; + double **vest; // estimated velocity during force computation +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/atom_vec_tdpd.cpp b/src/USER-MESO/atom_vec_tdpd.cpp new file mode 100644 index 0000000000..34f2b1a031 --- /dev/null +++ b/src/USER-MESO/atom_vec_tdpd.cpp @@ -0,0 +1,879 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "atom_vec_tdpd.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "domain.h" +#include "modify.h" +#include "fix.h" +#include "update.h" +#include "memory.h" +#include "error.h" +#include "input.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +AtomVecTDPD::AtomVecTDPD(LAMMPS *lmp) : AtomVec(lmp) +{ + if(strcmp(update->unit_style,"lj") != 0) + error->all(FLERR,"Atom style edpd requires lj units"); + + molecular = 0; + mass_type = 1; + forceclearflag = 1; + + comm_x_only = comm_f_only = 0; + comm->ghost_velocity = 1; + + cc_species = 0; // for now, reset in process_args() + + size_forward = 3 + cc_species + 3; //vest[3] + size_reverse = 3 + cc_species; + size_border = 6 + cc_species + 3; //vest[3] + size_velocity = 3; + // for data_atom, we read id + type + xyz[3] + cc[i] where i=1,cc_species + size_data_atom = 5 + cc_species; + size_data_vel = 4; + xcol_data = 3; + + atom->tdpd_flag = 1; + atom->vest_flag = 1; +} + +/* ---------------------------------------------------------------------- + process additional args + single arg = number of cc_species +------------------------------------------------------------------------- */ + +void AtomVecTDPD::process_args(int narg, char **arg) +{ + if (narg < 1) error->all(FLERR,"Invalid atom_style tdpd command"); + + atom->cc_species = force->inumeric(FLERR,arg[0]); + cc_species = atom->cc_species; + + // reset sizes that depend on cc_species + + size_forward = 3 + cc_species + 3; + size_reverse = 3 + cc_species; + size_border = 6 + cc_species + 3; + size_data_atom = 5 + cc_species; +} + +/* ---------------------------------------------------------------------- + grow atom arrays + n = 0 grows arrays by a chunk + n > 0 allocates arrays to size n +------------------------------------------------------------------------- */ + +void AtomVecTDPD::grow(int n) +{ + if (n == 0) grow_nmax(); + else nmax = n; + atom->nmax = nmax; + if (nmax < 0 || nmax > MAXSMALLINT) + error->one(FLERR,"Per-processor system is too big"); + + tag = memory->grow(atom->tag,nmax,"atom:tag"); + type = memory->grow(atom->type,nmax,"atom:type"); + mask = memory->grow(atom->mask,nmax,"atom:mask"); + image = memory->grow(atom->image,nmax,"atom:image"); + x = memory->grow(atom->x,nmax,3,"atom:x"); + v = memory->grow(atom->v,nmax,3,"atom:v"); + f = memory->grow(atom->f,nmax*comm->nthreads,3,"atom:f"); + cc = memory->grow(atom->cc,nmax*comm->nthreads,cc_species,"atom:cc"); + cc_flux = memory->grow(atom->cc_flux,nmax*comm->nthreads,cc_species, + "atom:cc_flux"); + vest = memory->grow(atom->vest, nmax, 3, "atom:vest"); + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax); +} + +/* ---------------------------------------------------------------------- + reset local array ptrs +------------------------------------------------------------------------- */ + +void AtomVecTDPD::grow_reset() +{ + tag = atom->tag; type = atom->type; + mask = atom->mask; image = atom->image; + x = atom->x; v = atom->v; f = atom->f; + cc = atom->cc; cc_flux = atom->cc_flux; + vest = atom->vest; +} + +/* ---------------------------------------------------------------------- + copy atom I info to atom J +------------------------------------------------------------------------- */ + +void AtomVecTDPD::copy(int i, int j, int delflag) +{ + tag[j] = tag[i]; + type[j] = type[i]; + mask[j] = mask[i]; + image[j] = image[i]; + x[j][0] = x[i][0]; + x[j][1] = x[i][1]; + x[j][2] = x[i][2]; + v[j][0] = v[i][0]; + v[j][1] = v[i][1]; + v[j][2] = v[i][2]; + + for(int k = 0; k < cc_species; k++) + cc[j][k] = cc[i][k]; + + vest[j][0] = vest[i][0]; + vest[j][1] = vest[i][1]; + vest[j][2] = vest[i][2]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag); +} + + +void AtomVecTDPD::force_clear(int n, size_t nbytes) +{ + memset(&cc_flux[n][0],0,cc_species*nbytes); +} + + +/* ---------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,k,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + + for(k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + + for(k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_comm_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,k,m; + double dx,dy,dz,dvx,dvy,dvz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + + for(k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz; + dy = pbc[1]*domain->yprd + pbc[3]*domain->yz; + dz = pbc[2]*domain->zprd; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + + for(k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + if (mask[i] & deform_groupbit) { + buf[m++] = v[j][0] + dvx; + buf[m++] = v[j][1] + dvy; + buf[m++] = v[j][2] + dvz; + } else { + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + } + for(k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecTDPD::unpack_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + + for(int k = 0; k < cc_species; k++) + cc[i][k] = buf[m++]; + + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecTDPD::unpack_comm_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + v[i][0] = buf[m++]; + v[i][1] = buf[m++]; + v[i][2] = buf[m++]; + for(int k = 0; k < cc_species; k++) + cc[i][k] = buf[m++]; + + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_reverse(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = f[i][0]; + buf[m++] = f[i][1]; + buf[m++] = f[i][2]; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc_flux[i][k]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecTDPD::unpack_reverse(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + f[j][0] += buf[m++]; + f[j][1] += buf[m++]; + f[j][2] += buf[m++]; + for(int k = 0; k < cc_species; k++) + cc_flux[j][k] += buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_border(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_border_vel(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + double dx,dy,dz,dvx,dvy,dvz; + + m = 0; + if (pbc_flag == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0]; + buf[m++] = x[j][1]; + buf[m++] = x[j][2]; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + if (domain->triclinic == 0) { + dx = pbc[0]*domain->xprd; + dy = pbc[1]*domain->yprd; + dz = pbc[2]*domain->zprd; + } else { + dx = pbc[0]; + dy = pbc[1]; + dz = pbc[2]; + } + if (!deform_vremap) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } else { + dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4]; + dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3]; + dvz = pbc[2]*h_rate[2]; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = x[j][0] + dx; + buf[m++] = x[j][1] + dy; + buf[m++] = x[j][2] + dz; + buf[m++] = ubuf(tag[j]).d; + buf[m++] = ubuf(type[j]).d; + buf[m++] = ubuf(mask[j]).d; + if (mask[i] & deform_groupbit) { + buf[m++] = v[j][0] + dvx; + buf[m++] = v[j][1] + dvy; + buf[m++] = v[j][2] + dvz; + } else { + buf[m++] = v[j][0]; + buf[m++] = v[j][1]; + buf[m++] = v[j][2]; + } + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[j][k]; + + buf[m++] = vest[j][0]; + buf[m++] = vest[j][1]; + buf[m++] = vest[j][2]; + } + } + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]); + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecTDPD::unpack_border(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + tag[i] = (tagint) ubuf(buf[m++]).i; + type[i] = (int) ubuf(buf[m++]).i; + mask[i] = (int) ubuf(buf[m++]).i; + for(int k = 0; k < cc_species; k++) + cc[i][k] = buf[m++]; + + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- */ + +void AtomVecTDPD::unpack_border_vel(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + if (i == nmax) grow(0); + x[i][0] = buf[m++]; + x[i][1] = buf[m++]; + x[i][2] = buf[m++]; + tag[i] = (tagint) ubuf(buf[m++]).i; + type[i] = (int) ubuf(buf[m++]).i; + mask[i] = (int) ubuf(buf[m++]).i; + v[i][0] = buf[m++]; + v[i][1] = buf[m++]; + v[i][2] = buf[m++]; + for(int k = 0; k < cc_species; k++) + cc[i][k] = buf[m++]; + + vest[i][0] = buf[m++]; + vest[i][1] = buf[m++]; + vest[i][2] = buf[m++]; + } + + if (atom->nextra_border) + for (int iextra = 0; iextra < atom->nextra_border; iextra++) + m += modify->fix[atom->extra_border[iextra]]-> + unpack_border(n,first,&buf[m]); +} + +/* ---------------------------------------------------------------------- + pack data for atom I for sending to another proc + xyz must be 1st 3 values, so comm::exchange() can test on them +------------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_exchange(int i, double *buf) +{ + int m = 1; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + buf[m++] = v[i][0]; + buf[m++] = v[i][1]; + buf[m++] = v[i][2]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = ubuf(type[i]).d; + buf[m++] = ubuf(mask[i]).d; + buf[m++] = ubuf(image[i]).d; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[i][k]; + + buf[m++] = vest[i][0]; + buf[m++] = vest[i][1]; + buf[m++] = vest[i][2]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- */ + +int AtomVecTDPD::unpack_exchange(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + int m = 1; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + v[nlocal][0] = buf[m++]; + v[nlocal][1] = buf[m++]; + v[nlocal][2] = buf[m++]; + tag[nlocal] = (tagint) ubuf(buf[m++]).i; + type[nlocal] = (int) ubuf(buf[m++]).i; + mask[nlocal] = (int) ubuf(buf[m++]).i; + image[nlocal] = (imageint) ubuf(buf[m++]).i; + for(int k = 0; k < cc_species; k++) + cc[nlocal][k] = buf[m++]; + + vest[nlocal][0] = buf[m++]; + vest[nlocal][1] = buf[m++]; + vest[nlocal][2] = buf[m++]; + + if (atom->nextra_grow) + for (int iextra = 0; iextra < atom->nextra_grow; iextra++) + m += modify->fix[atom->extra_grow[iextra]]-> + unpack_exchange(nlocal,&buf[m]); + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + size of restart data for all atoms owned by this proc + include extra data stored by fixes +------------------------------------------------------------------------- */ + +int AtomVecTDPD::size_restart() +{ + int i; + + int nlocal = atom->nlocal; + int n = (11 + cc_species + 3) * nlocal; // 11 + cc[i] + vest[3] + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + for (i = 0; i < nlocal; i++) + n += modify->fix[atom->extra_restart[iextra]]->size_restart(i); + + return n; +} + +/* ---------------------------------------------------------------------- + pack atom I's data for restart file including extra quantities + xyz must be 1st 3 values, so that read_restart can test on them + molecular types may be negative, but write as positive +------------------------------------------------------------------------- */ + +int AtomVecTDPD::pack_restart(int i, double *buf) +{ + int m = 1; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + buf[m++] = ubuf(tag[i]).d; + buf[m++] = ubuf(type[i]).d; + buf[m++] = ubuf(mask[i]).d; + buf[m++] = ubuf(image[i]).d; + buf[m++] = v[i][0]; + buf[m++] = v[i][1]; + buf[m++] = v[i][2]; + for(int k = 0; k < cc_species; k++) + buf[m++] = cc[i][k]; + + buf[m++] = vest[i][0]; + buf[m++] = vest[i][1]; + buf[m++] = vest[i][2]; + + if (atom->nextra_restart) + for (int iextra = 0; iextra < atom->nextra_restart; iextra++) + m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]); + + buf[0] = m; + return m; +} + +/* ---------------------------------------------------------------------- + unpack data for one atom from restart file including extra quantities +------------------------------------------------------------------------- */ + +int AtomVecTDPD::unpack_restart(double *buf) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) { + grow(0); + if (atom->nextra_store) + memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra"); + } + + int m = 1; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + tag[nlocal] = (tagint) ubuf(buf[m++]).i; + type[nlocal] = (int) ubuf(buf[m++]).i; + mask[nlocal] = (int) ubuf(buf[m++]).i; + image[nlocal] = (imageint) ubuf(buf[m++]).i; + v[nlocal][0] = buf[m++]; + v[nlocal][1] = buf[m++]; + v[nlocal][2] = buf[m++]; + for(int k = 0; k < cc_species; k++) + cc[nlocal][k] = buf[m++]; + + vest[nlocal][0] = buf[m++]; + vest[nlocal][1] = buf[m++]; + vest[nlocal][2] = buf[m++]; + + double **extra = atom->extra; + if (atom->nextra_store) { + int size = static_cast (buf[0]) - m; + for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++]; + } + + atom->nlocal++; + return m; +} + +/* ---------------------------------------------------------------------- + create one atom of itype at coord + set other values to defaults +------------------------------------------------------------------------- */ + +void AtomVecTDPD::create_atom(int itype, double *coord) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + tag[nlocal] = 0; + type[nlocal] = itype; + x[nlocal][0] = coord[0]; + x[nlocal][1] = coord[1]; + x[nlocal][2] = coord[2]; + mask[nlocal] = 1; + image[nlocal] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + v[nlocal][0] = 0.0; + v[nlocal][1] = 0.0; + v[nlocal][2] = 0.0; + + for(int k = 0; k < cc_species; k++) + cc[nlocal][k] = 0.0; + + vest[nlocal][0] = 0.0; + vest[nlocal][1] = 0.0; + vest[nlocal][2] = 0.0; + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + unpack one line from Atoms section of data file + initialize other atom quantities +------------------------------------------------------------------------- */ + +void AtomVecTDPD::data_atom(double *coord, imageint imagetmp, char **values) +{ + int nlocal = atom->nlocal; + if (nlocal == nmax) grow(0); + + tag[nlocal] = ATOTAGINT(values[0]); + type[nlocal] = atoi(values[1]); + if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes) + error->one(FLERR,"Invalid atom type in Atoms section of data file"); + + x[nlocal][0] = coord[0]; + x[nlocal][1] = coord[1]; + x[nlocal][2] = coord[2]; + + for(int k = 0; k < cc_species; k++) + cc[nlocal][k] = atof( values[5+k] ); + + image[nlocal] = imagetmp; + + mask[nlocal] = 1; + v[nlocal][0] = 0.0; + v[nlocal][1] = 0.0; + v[nlocal][2] = 0.0; + + vest[nlocal][0] = 0.0; + vest[nlocal][1] = 0.0; + vest[nlocal][2] = 0.0; + + atom->nlocal++; +} + +/* ---------------------------------------------------------------------- + pack atom info for data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecTDPD::pack_data(double **buf) +{ + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + buf[i][0] = ubuf(tag[i]).d; + buf[i][1] = ubuf(type[i]).d; + buf[i][2] = x[i][0]; + buf[i][3] = x[i][1]; + buf[i][4] = x[i][2]; + buf[i][5] = ubuf((image[i] & IMGMASK) - IMGMAX).d; + buf[i][6] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d; + buf[i][7] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d; + for(int k = 0; k < cc_species; k++) + buf[i][8+k] = cc[i][k]; + } +} + +/* ---------------------------------------------------------------------- + write atom info to data file including 3 image flags +------------------------------------------------------------------------- */ + +void AtomVecTDPD::write_data(FILE *fp, int n, double **buf) +{ + for (int i = 0; i < n; i++){ + fprintf(fp,TAGINT_FORMAT " %d %-1.16e %-1.16e %-1.16e %d %d %d", + (tagint) ubuf(buf[i][0]).i,(int) ubuf(buf[i][1]).i, + buf[i][2],buf[i][3],buf[i][4], + (int) ubuf(buf[i][5]).i,(int) ubuf(buf[i][6]).i, + (int) ubuf(buf[i][7]).i); + for(int k = 0; k < cc_species; k++) + fprintf(fp," %-1.16e",buf[i][8+k]); + fprintf(fp,"\n"); + } +} + +/* ---------------------------------------------------------------------- + return # of bytes of allocated memory +------------------------------------------------------------------------- */ + +bigint AtomVecTDPD::memory_usage() +{ + bigint bytes = 0; + + if (atom->memcheck("tag")) bytes += memory->usage(tag,nmax); + if (atom->memcheck("type")) bytes += memory->usage(type,nmax); + if (atom->memcheck("mask")) bytes += memory->usage(mask,nmax); + if (atom->memcheck("image")) bytes += memory->usage(image,nmax); + if (atom->memcheck("x")) bytes += memory->usage(x,nmax,3); + if (atom->memcheck("v")) bytes += memory->usage(v,nmax,3); + if (atom->memcheck("f")) bytes += memory->usage(f,nmax*comm->nthreads,3); + if (atom->memcheck("cc")) bytes += memory->usage(cc,nmax*comm->nthreads,cc_species); + if (atom->memcheck("cc_flux")) bytes += memory->usage(cc_flux,nmax*comm->nthreads,cc_species); + if (atom->memcheck("vest")) bytes += memory->usage(vest, nmax); + + return bytes; +} diff --git a/src/USER-MESO/atom_vec_tdpd.h b/src/USER-MESO/atom_vec_tdpd.h new file mode 100644 index 0000000000..86e9ae4bb8 --- /dev/null +++ b/src/USER-MESO/atom_vec_tdpd.h @@ -0,0 +1,83 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ATOM_CLASS + +AtomStyle(tdpd,AtomVecTDPD) + +#else + +#ifndef LMP_ATOM_VEC_TDPD_H +#define LMP_ATOM_VEC_TDPD_H + +#include "atom_vec.h" + +namespace LAMMPS_NS { + +class AtomVecTDPD : public AtomVec { + public: + AtomVecTDPD(class LAMMPS *); + virtual ~AtomVecTDPD() {} + void process_args(int, char **); + void grow(int); + void grow_reset(); + void copy(int, int, int); + void force_clear(int, size_t); + virtual int pack_comm(int, int *, double *, int, int *); + virtual int pack_comm_vel(int, int *, double *, int, int *); + virtual void unpack_comm(int, int, double *); + virtual void unpack_comm_vel(int, int, double *); + int pack_reverse(int, int, double *); + void unpack_reverse(int, int *, double *); + virtual int pack_border(int, int *, double *, int, int *); + virtual int pack_border_vel(int, int *, double *, int, int *); + virtual void unpack_border(int, int, double *); + virtual void unpack_border_vel(int, int, double *); + virtual int pack_exchange(int, double *); + virtual int unpack_exchange(double *); + int size_restart(); + int pack_restart(int, double *); + int unpack_restart(double *); + void create_atom(int, double *); + void data_atom(double *, imageint, char **); + void pack_data(double **); + void write_data(FILE *, int, double **); + bigint memory_usage(); + + protected: + tagint *tag; + int *type,*mask; + imageint *image; + double **x,**v,**f; + double **vest; // store intermediate velocity for using mvv integrator + double **cc,**cc_flux; + int cc_species; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Per-processor system is too big + +The number of owned atoms plus ghost atoms on a single +processor must fit in 32-bit integer. + +E: Invalid atom type in Atoms section of data file + +Atom types must range from 1 to specified # of types. + +*/ diff --git a/src/USER-MESO/compute_edpd_temp_atom.cpp b/src/USER-MESO/compute_edpd_temp_atom.cpp new file mode 100644 index 0000000000..15fdab2a69 --- /dev/null +++ b/src/USER-MESO/compute_edpd_temp_atom.cpp @@ -0,0 +1,97 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include "compute_edpd_temp_atom.h" +#include "atom.h" +#include "update.h" +#include "modify.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +ComputeEDPDTempAtom::ComputeEDPDTempAtom(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg) +{ + if (narg != 3) error->all(FLERR,"Number of arguments for compute edpd/temp/atom command != 3"); + if (atom->edpd_flag != 1) error->all(FLERR,"compute edpd/temp/atom command requires atom_style with temperature (e.g. edpd)"); + + peratom_flag = 1; + size_peratom_cols = 0; + + nmax = 0; + temp_vector = NULL; +} + +/* ---------------------------------------------------------------------- */ + +ComputeEDPDTempAtom::~ComputeEDPDTempAtom() +{ + memory->sfree(temp_vector); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeEDPDTempAtom::init() +{ + + int count = 0; + for (int i = 0; i < modify->ncompute; i++) + if (strcmp(modify->compute[i]->style,"temp_vector/atom") == 0) count++; + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one compute temp_vector/atom"); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeEDPDTempAtom::compute_peratom() +{ + invoked_peratom = update->ntimestep; + + // grow temp_vector array if necessary + + if (atom->nmax > nmax) { + memory->sfree(temp_vector); + nmax = atom->nmax; + temp_vector = (double *) memory->smalloc(nmax*sizeof(double),"temp_vector/atom:temp_vector"); + vector_atom = temp_vector; + } + + double *edpd_temp = atom->edpd_temp; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + temp_vector[i] = edpd_temp[i]; + } + else { + temp_vector[i] = 0.0; + } + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based array +------------------------------------------------------------------------- */ + +double ComputeEDPDTempAtom::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} diff --git a/src/USER-MESO/compute_edpd_temp_atom.h b/src/USER-MESO/compute_edpd_temp_atom.h new file mode 100644 index 0000000000..4c61b664cc --- /dev/null +++ b/src/USER-MESO/compute_edpd_temp_atom.h @@ -0,0 +1,43 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(edpd/temp/atom,ComputeEDPDTempAtom) + +#else + +#ifndef LMP_COMPUTE_EDPD_TEMP_ATOM_H +#define LMP_COMPUTE_EDPD_TEMP_ATOM_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputeEDPDTempAtom : public Compute { + public: + ComputeEDPDTempAtom(class LAMMPS *, int, char **); + ~ComputeEDPDTempAtom(); + void init(); + void compute_peratom(); + double memory_usage(); + + private: + int nmax; + double *temp_vector; +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/compute_tdpd_cc_atom.cpp b/src/USER-MESO/compute_tdpd_cc_atom.cpp new file mode 100644 index 0000000000..b33550f5c1 --- /dev/null +++ b/src/USER-MESO/compute_tdpd_cc_atom.cpp @@ -0,0 +1,98 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include "compute_tdpd_cc_atom.h" +#include "atom.h" +#include "update.h" +#include "modify.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +ComputeTDPDCCAtom::ComputeTDPDCCAtom(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg) +{ + if (narg != 4) error->all(FLERR,"Number of arguments for compute tdpd/cc/atom command != 4"); + if (atom->tdpd_flag != 1) error->all(FLERR,"compute tdpd/cc/atom command requires atom_style with concentration (e.g. tdpd)"); + + index = force->inumeric(FLERR,arg[3]); + + peratom_flag = 1; + size_peratom_cols = 0; + + nmax = 0; + cc_vector = NULL; +} + +/* ---------------------------------------------------------------------- */ + +ComputeTDPDCCAtom::~ComputeTDPDCCAtom() +{ + memory->sfree(cc_vector); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeTDPDCCAtom::init() +{ + + int count = 0; + for (int i = 0; i < modify->ncompute; i++) + if (strcmp(modify->compute[i]->style,"cc_vector/atom") == 0) count++; + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one compute cc_vector/atom"); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeTDPDCCAtom::compute_peratom() +{ + invoked_peratom = update->ntimestep; + + // grow cc_vector array if necessary + + if (atom->nmax > nmax) { + memory->sfree(cc_vector); + nmax = atom->nmax; + cc_vector = (double *) memory->smalloc(nmax*sizeof(double),"cc_vector/atom:cc_vector"); + vector_atom = cc_vector; + } + + double **cc = atom->cc; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + cc_vector[i] = cc[i][index-1]; + } + else + cc_vector[i] = 0.0; + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based array +------------------------------------------------------------------------- */ + +double ComputeTDPDCCAtom::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} diff --git a/src/USER-MESO/compute_tdpd_cc_atom.h b/src/USER-MESO/compute_tdpd_cc_atom.h new file mode 100644 index 0000000000..324cb779a4 --- /dev/null +++ b/src/USER-MESO/compute_tdpd_cc_atom.h @@ -0,0 +1,44 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(tdpd/cc/atom,ComputeTDPDCCAtom) + +#else + +#ifndef LMP_COMPUTE_TDPD_CC_ATOM_H +#define LMP_COMPUTE_TDPD_CC_ATOM_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputeTDPDCCAtom : public Compute { + public: + ComputeTDPDCCAtom(class LAMMPS *, int, char **); + ~ComputeTDPDCCAtom(); + void init(); + void compute_peratom(); + double memory_usage(); + + private: + int nmax; + int index; + double *cc_vector; +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/fix_edpd_source.cpp b/src/USER-MESO/fix_edpd_source.cpp new file mode 100644 index 0000000000..3ee7e8e291 --- /dev/null +++ b/src/USER-MESO/fix_edpd_source.cpp @@ -0,0 +1,120 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_edpd_source.h" +#include "atom.h" +#include "comm.h" +#include "update.h" +#include "modify.h" +#include "domain.h" +#include "lattice.h" +#include "input.h" +#include "variable.h" +#include "error.h" +#include "force.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixEDPDSource::FixEDPDSource(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (strcmp(style,"edpd/source") != 0 && narg < 4) + error->all(FLERR,"Illegal fix edpd/source command"); + + int iarg = 3; + + if (strcmp(arg[iarg],"sphere") == 0) option = 0; + else if (strcmp(arg[iarg],"cuboid") == 0) option = 1; + else error->all(FLERR,"Illegal fix edpd/source command"); + iarg++; + + if(option == 0){ + if (narg != 9 ) error->all(FLERR,"Illegal fix edpd/source command (5 args for sphere)"); + center[0] = force->numeric(FLERR,arg[iarg++]); + center[1] = force->numeric(FLERR,arg[iarg++]); + center[2] = force->numeric(FLERR,arg[iarg++]); + radius = force->numeric(FLERR,arg[iarg++]); + value = force->numeric(FLERR,arg[iarg++]); + } + else if(option == 1){ + if (narg != 11 ) error->all(FLERR,"Illegal fix edpd/edpd command (7 args for cuboid)"); + center[0] = force->numeric(FLERR,arg[iarg++]); + center[1] = force->numeric(FLERR,arg[iarg++]); + center[2] = force->numeric(FLERR,arg[iarg++]); + dLx = force->numeric(FLERR,arg[iarg++]); + dLy = force->numeric(FLERR,arg[iarg++]); + dLz = force->numeric(FLERR,arg[iarg++]); + value = force->numeric(FLERR,arg[iarg++]); + } + else error->all(FLERR,"Illegal fix edpd/source command"); +} + +/* ---------------------------------------------------------------------- */ + +FixEDPDSource::~FixEDPDSource() +{ +} + +/* ---------------------------------------------------------------------- */ + +int FixEDPDSource::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixEDPDSource::init() +{ +} + +/* ---------------------------------------------------------------------- */ + +void FixEDPDSource::post_force(int vflag) +{ + double **x = atom->x; + double *edpd_flux = atom->edpd_flux; + double *edpd_cv = atom->edpd_cv; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double drx, dry, drz, rsq; + double radius_sq = radius*radius*radius; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if(option == 0){ + drx = x[i][0] - center[0]; + dry = x[i][1] - center[1]; + drz = x[i][2] - center[2]; + rsq = drx*drx + dry*dry + drz*drz; + if(rsq < radius_sq) + edpd_flux[i] += value*edpd_cv[i]; + } + else if(option == 1){ + drx = x[i][0] - center[0]; + dry = x[i][1] - center[1]; + drz = x[i][2] - center[2]; + if(abs(drx) <= 0.5*dLx && abs(dry) <= 0.5*dLy && abs(drz) <= 0.5*dLz) + edpd_flux[i] += value*edpd_cv[i]; + } + } + } +} diff --git a/src/USER-OMP/fix_shear_history_omp.h b/src/USER-MESO/fix_edpd_source.h similarity index 66% rename from src/USER-OMP/fix_shear_history_omp.h rename to src/USER-MESO/fix_edpd_source.h index 95281b2afc..1ea8610ce9 100644 --- a/src/USER-OMP/fix_shear_history_omp.h +++ b/src/USER-MESO/fix_edpd_source.h @@ -13,23 +13,29 @@ #ifdef FIX_CLASS -FixStyle(SHEAR_HISTORY/omp,FixShearHistoryOMP) +FixStyle(edpd/source,FixEDPDSource) #else -#ifndef LMP_FIX_SHEAR_HISTORY_OMP_H -#define LMP_FIX_SHEAR_HISTORY_OMP_H +#ifndef LMP_FIX_EDPDSOURCE_H +#define LMP_FIX_EDPDSOURCE_H -#include "fix_shear_history.h" +#include "fix.h" namespace LAMMPS_NS { -class FixShearHistoryOMP : public FixShearHistory { - +class FixEDPDSource : public Fix { public: - FixShearHistoryOMP(class LAMMPS *lmp, int narg, char **argv) - : FixShearHistory(lmp,narg,argv) {}; - virtual void pre_exchange(); + FixEDPDSource(class LAMMPS *, int, char **); + ~FixEDPDSource(); + int setmask(); + void init(); + void post_force(int); + + protected: + int option; + double center[3], radius, dLx, dLy, dLz; + double value; }; } diff --git a/src/USER-MESO/fix_mvv_dpd.cpp b/src/USER-MESO/fix_mvv_dpd.cpp new file mode 100644 index 0000000000..299f453ea7 --- /dev/null +++ b/src/USER-MESO/fix_mvv_dpd.cpp @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + This is a time integrator for position and velocity (x and v) using the + modified velocity-Verlet (MVV) algorithm. + Setting verlet = 0.5 recovers the standard velocity-Verlet algorithm. + + Contributing author: Zhen Li (Brown University) + Email: zhen_li@brown.edu +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_mvv_dpd.h" +#include "atom.h" +#include "force.h" +#include "update.h" +#include "respa.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixMvvDPD::FixMvvDPD(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (strcmp(style,"mvv/dpd") != 0 && narg < 3) + error->all(FLERR,"Illegal fix mvv/dpd command"); + + verlet = 0.5; + if(narg > 3) verlet = force->numeric(FLERR,arg[3]); + + dynamic_group_allow = 1; + time_integrate = 1; +} + +/* ---------------------------------------------------------------------- */ + +int FixMvvDPD::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= FINAL_INTEGRATE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvDPD::init() +{ + if (!atom->vest_flag) + error->all(FLERR,"Fix mvv/dpd requires atom attribute vest"); + + dtv = update->dt; + dtf = 0.5 * update->dt * force->ftm2v; +} + +/* ---------------------------------------------------------------------- + allow for both per-type and per-atom mass +------------------------------------------------------------------------- */ + +void FixMvvDPD::initial_integrate(int vflag) +{ + double dtfm; + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **vest = atom->vest; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) dtfm = dtf / rmass[i]; + else dtfm = dtf / mass[type[i]]; + + vest[i][0] = v[i][0] + dtfm * f[i][0]; + vest[i][1] = v[i][1] + dtfm * f[i][1]; + vest[i][2] = v[i][2] + dtfm * f[i][2]; + + x[i][0] += dtv * vest[i][0]; + x[i][1] += dtv * vest[i][1]; + x[i][2] += dtv * vest[i][2]; + v[i][0] += 2.0 * verlet * dtfm * f[i][0]; + v[i][1] += 2.0 * verlet * dtfm * f[i][1]; + v[i][2] += 2.0 * verlet * dtfm * f[i][2]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvDPD::final_integrate() +{ + double dtfm; + double **v = atom->v; + double **f = atom->f; + double **vest = atom->vest; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) dtfm = dtf / rmass[i]; + else dtfm = dtf / mass[type[i]]; + + v[i][0] = vest[i][0] + dtfm * f[i][0]; + v[i][1] = vest[i][1] + dtfm * f[i][1]; + v[i][2] = vest[i][2] + dtfm * f[i][2]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvDPD::reset_dt() +{ + dtv = update->dt; + dtf = 0.5 * update->dt * force->ftm2v; +} diff --git a/src/USER-MESO/fix_mvv_dpd.h b/src/USER-MESO/fix_mvv_dpd.h new file mode 100644 index 0000000000..86cc79485f --- /dev/null +++ b/src/USER-MESO/fix_mvv_dpd.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(mvv/dpd,FixMvvDPD) + +#else + +#ifndef LMP_FIX_MVV_DPD_H +#define LMP_FIX_MVV_DPD_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixMvvDPD : public Fix { + public: + FixMvvDPD(class LAMMPS *, int, char **); + virtual ~FixMvvDPD() {} + int setmask(); + virtual void init(); + virtual void initial_integrate(int); + virtual void final_integrate(); + virtual void reset_dt(); + + protected: + double dtv, dtf; + double verlet; +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/fix_mvv_edpd.cpp b/src/USER-MESO/fix_mvv_edpd.cpp new file mode 100644 index 0000000000..fe801d6d36 --- /dev/null +++ b/src/USER-MESO/fix_mvv_edpd.cpp @@ -0,0 +1,163 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + This is a time integrator for position, velocity and temperature (x, + v and edpd_T) using the modified velocity-Verlet (MVV) algorithm. + Setting verlet = 0.5 recovers the standard velocity-Verlet algorithm. + + Contributing author: Zhen Li (Brown University) + Email: zhen_li@brown.edu + + Please cite the related publication: + Z. Li, Y.-H. Tang, H. Lei, B. Caswell and G.E. Karniadakis. "Energy- + conserving dissipative particle dynamics with temperature-dependent + properties". Journal of Computational Physics, 2014, 265: 113-127. + + Z. Li, Y.-H. Tang , X. Li and G.E. Karniadakis. "Mesoscale modeling of + phase transition dynamics of thermoresponsive polymers". Chemical + Communications, 2015, 51: 11038-11040. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_mvv_edpd.h" +#include "atom.h" +#include "force.h" +#include "update.h" +#include "respa.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixMvvEDPD::FixMvvEDPD(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (strcmp(style,"mvv/edpd") != 0 && narg < 3) + error->all(FLERR,"Illegal fix mvv/edpd command"); + + verlet = 0.5; + if(narg > 3) verlet = force->numeric(FLERR,arg[3]); + + dynamic_group_allow = 1; + time_integrate = 1; +} + +/* ---------------------------------------------------------------------- */ + +int FixMvvEDPD::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= FINAL_INTEGRATE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvEDPD::init() +{ + dtv = update->dt; + dtf = 0.5 * update->dt * force->ftm2v; +} + +/* ---------------------------------------------------------------------- + allow for both per-type and per-atom mass +------------------------------------------------------------------------- */ + +void FixMvvEDPD::initial_integrate(int vflag) +{ + double dtfm,dtT; + // update v and x and cc of atoms in group + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *edpd_temp = atom->edpd_temp; + double *edpd_flux = atom->edpd_flux; + double *edpd_cv = atom->edpd_cv; + double **vest = atom->vest; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) dtfm = dtf / rmass[i]; + else dtfm = dtf / mass[type[i]]; + + dtT = 0.5 * dtv / edpd_cv[i]; + + vest[i][0] = v[i][0] + dtfm * f[i][0]; + vest[i][1] = v[i][1] + dtfm * f[i][1]; + vest[i][2] = v[i][2] + dtfm * f[i][2]; + vest[i][3] = edpd_temp[i] + dtT * edpd_flux[i]; + + x[i][0] += dtv * vest[i][0]; + x[i][1] += dtv * vest[i][1]; + x[i][2] += dtv * vest[i][2]; + v[i][0] += 2.0 * verlet * dtfm * f[i][0]; + v[i][1] += 2.0 * verlet * dtfm * f[i][1]; + v[i][2] += 2.0 * verlet * dtfm * f[i][2]; + edpd_temp[i] += 2.0 * verlet * dtT * edpd_flux[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvEDPD::final_integrate() +{ + double dtfm, dtT; + + // update v and edpd_temp of atoms in group + + double **v = atom->v; + double **f = atom->f; + double *edpd_temp = atom->edpd_temp; + double *edpd_flux = atom->edpd_flux; + double *edpd_cv = atom->edpd_cv; + double **vest = atom->vest; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) dtfm = dtf / rmass[i]; + else dtfm = dtf / mass[type[i]]; + + dtT = 0.5 * dtv / edpd_cv[i]; + + v[i][0] = vest[i][0] + dtfm * f[i][0]; + v[i][1] = vest[i][1] + dtfm * f[i][1]; + v[i][2] = vest[i][2] + dtfm * f[i][2]; + edpd_temp[i] = vest[i][3] + dtT * edpd_flux[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvEDPD::reset_dt() +{ + dtv = update->dt; + dtf = 0.5 * update->dt * force->ftm2v; +} diff --git a/src/USER-MESO/fix_mvv_edpd.h b/src/USER-MESO/fix_mvv_edpd.h new file mode 100644 index 0000000000..0d9c5f195a --- /dev/null +++ b/src/USER-MESO/fix_mvv_edpd.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(mvv/edpd,FixMvvEDPD) + +#else + +#ifndef LMP_FIX_MVV_EDPD_H +#define LMP_FIX_MVV_EDPD_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixMvvEDPD : public Fix { + public: + FixMvvEDPD(class LAMMPS *, int, char **); + virtual ~FixMvvEDPD() {} + int setmask(); + virtual void init(); + virtual void initial_integrate(int); + virtual void final_integrate(); + virtual void reset_dt(); + + protected: + double dtv, dtf; + double verlet; +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/fix_mvv_tdpd.cpp b/src/USER-MESO/fix_mvv_tdpd.cpp new file mode 100644 index 0000000000..382ce9033a --- /dev/null +++ b/src/USER-MESO/fix_mvv_tdpd.cpp @@ -0,0 +1,156 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + This is a time integrator for position, velocity and concentration (x, + v and cc) using the modified velocity-Verlet (MVV) algorithm. + Setting verlet = 0.5 recovers the standard velocity-Verlet algorithm. + + Contributing author: Zhen Li (Brown University) + Email: zhen_li@brown.edu + + Please cite the related publication: + Z. Li, A. Yazdani, A. Tartakovsky and G.E. Karniadakis. "Transport + dissipative particle dynamics model for mesoscopic advection-diffusion + -reaction problems". The Journal of Chemical Physics, 2015, 143: 014101. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_mvv_tdpd.h" +#include "atom.h" +#include "force.h" +#include "update.h" +#include "respa.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixMvvTDPD::FixMvvTDPD(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (strcmp(style,"tdpd/verlet") != 0 && narg < 3) + error->all(FLERR,"Illegal fix mvv/tdpd command"); + + verlet = 0.5; + if(narg > 3) verlet = force->numeric(FLERR,arg[3]); + + cc_species = atom->cc_species; + + dynamic_group_allow = 1; + time_integrate = 1; +} + +/* ---------------------------------------------------------------------- */ + +int FixMvvTDPD::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= FINAL_INTEGRATE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvTDPD::init() +{ + dtv = update->dt; + dtf = 0.5 * update->dt * force->ftm2v; +} + +/* ---------------------------------------------------------------------- + allow for both per-type and per-atom mass +------------------------------------------------------------------------- */ + +void FixMvvTDPD::initial_integrate(int vflag) +{ + double dtfm; + // update v and x and cc of atoms in group + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **cc = atom->cc; + double **cc_flux = atom->cc_flux; + double **vest = atom->vest; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) dtfm = dtf / rmass[i]; + else dtfm = dtf / mass[type[i]]; + + vest[i][0] = v[i][0] + dtfm * f[i][0]; + vest[i][1] = v[i][1] + dtfm * f[i][1]; + vest[i][2] = v[i][2] + dtfm * f[i][2]; + + x[i][0] += dtv * vest[i][0]; + x[i][1] += dtv * vest[i][1]; + x[i][2] += dtv * vest[i][2]; + v[i][0] += 2.0 * verlet * dtfm * f[i][0]; + v[i][1] += 2.0 * verlet * dtfm * f[i][1]; + v[i][2] += 2.0 * verlet * dtfm * f[i][2]; + for(int k = 0; k < cc_species; k++) + cc[i][k] += 0.5 * dtv * cc_flux[i][k]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvTDPD::final_integrate() +{ + double dtfm; + + // update v of atoms in group + + double **v = atom->v; + double **f = atom->f; + double **cc = atom->cc; + double **cc_flux = atom->cc_flux; + double **vest = atom->vest; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) dtfm = dtf / rmass[i]; + else dtfm = dtf / mass[type[i]]; + + v[i][0] = vest[i][0] + dtfm * f[i][0]; + v[i][1] = vest[i][1] + dtfm * f[i][1]; + v[i][2] = vest[i][2] + dtfm * f[i][2]; + for(int k = 0; k < cc_species; k++) + cc[i][k] += 0.5 * dtv * cc_flux[i][k]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixMvvTDPD::reset_dt() +{ + dtv = update->dt; + dtf = 0.5 * update->dt * force->ftm2v; +} diff --git a/src/USER-MESO/fix_mvv_tdpd.h b/src/USER-MESO/fix_mvv_tdpd.h new file mode 100644 index 0000000000..7adb23af69 --- /dev/null +++ b/src/USER-MESO/fix_mvv_tdpd.h @@ -0,0 +1,46 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(mvv/tdpd,FixMvvTDPD) + +#else + +#ifndef LMP_FIX_MVV_TDPD_H +#define LMP_FIX_MVV_TDPD_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixMvvTDPD : public Fix { + public: + FixMvvTDPD(class LAMMPS *, int, char **); + virtual ~FixMvvTDPD() {} + int setmask(); + virtual void init(); + virtual void initial_integrate(int); + virtual void final_integrate(); + virtual void reset_dt(); + + protected: + double dtv, dtf; + double verlet; + int cc_species; +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/fix_tdpd_source.cpp b/src/USER-MESO/fix_tdpd_source.cpp new file mode 100644 index 0000000000..3dfeba4787 --- /dev/null +++ b/src/USER-MESO/fix_tdpd_source.cpp @@ -0,0 +1,120 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_tdpd_source.h" +#include "atom.h" +#include "comm.h" +#include "update.h" +#include "modify.h" +#include "domain.h" +#include "lattice.h" +#include "input.h" +#include "variable.h" +#include "error.h" +#include "force.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixTDPDSource::FixTDPDSource(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (strcmp(style,"tdpd/source") != 0 && narg < 4) + error->all(FLERR,"Illegal fix tdpd/source command"); + + int iarg = 3; + cc_index = force->inumeric(FLERR,arg[iarg++]); + + if (strcmp(arg[iarg],"sphere") == 0) option = 0; + else if (strcmp(arg[iarg],"cuboid") == 0) option = 1; + else error->all(FLERR,"Illegal fix tdpd/source command"); + iarg++; + + if(option == 0){ + if (narg != 10 ) error->all(FLERR,"Illegal fix tdpd/source command (5 args for sphere)"); + center[0] = force->numeric(FLERR,arg[iarg++]); + center[1] = force->numeric(FLERR,arg[iarg++]); + center[2] = force->numeric(FLERR,arg[iarg++]); + radius = force->numeric(FLERR,arg[iarg++]); + value = force->numeric(FLERR,arg[iarg++]); + } + else if(option == 1){ + if (narg != 12 ) error->all(FLERR,"Illegal fix tdpd/edpd command (7 args for cuboid)"); + center[0] = force->numeric(FLERR,arg[iarg++]); + center[1] = force->numeric(FLERR,arg[iarg++]); + center[2] = force->numeric(FLERR,arg[iarg++]); + dLx = force->numeric(FLERR,arg[iarg++]); + dLy = force->numeric(FLERR,arg[iarg++]); + dLz = force->numeric(FLERR,arg[iarg++]); + value = force->numeric(FLERR,arg[iarg++]); + } + else error->all(FLERR,"Illegal fix tdpd/source command"); +} + +/* ---------------------------------------------------------------------- */ + +FixTDPDSource::~FixTDPDSource() +{ +} + +/* ---------------------------------------------------------------------- */ + +int FixTDPDSource::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixTDPDSource::init() +{ +} + +/* ---------------------------------------------------------------------- */ + +void FixTDPDSource::post_force(int vflag) +{ + double **x = atom->x; + double **cc_flux = atom->cc_flux; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double drx, dry, drz, rsq; + double radius_sq = radius*radius*radius; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if(option == 0){ + drx = x[i][0] - center[0]; + dry = x[i][1] - center[1]; + drz = x[i][2] - center[2]; + rsq = drx*drx + dry*dry + drz*drz; + if(rsq < radius_sq) + cc_flux[i][cc_index-1] += value; + } + else if(option == 1){ + drx = x[i][0] - center[0]; + dry = x[i][1] - center[1]; + drz = x[i][2] - center[2]; + if(abs(drx) <= 0.5*dLx && abs(dry) <= 0.5*dLy && abs(drz) <= 0.5*dLz) + cc_flux[i][cc_index-1] += value; + } + } + } +} diff --git a/src/USER-MESO/fix_tdpd_source.h b/src/USER-MESO/fix_tdpd_source.h new file mode 100644 index 0000000000..302fe82090 --- /dev/null +++ b/src/USER-MESO/fix_tdpd_source.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(tdpd/source,FixTDPDSource) + +#else + +#ifndef LMP_FIX_TDPDSOURCE_H +#define LMP_FIX_TDPDSOURCE_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixTDPDSource : public Fix { + public: + FixTDPDSource(class LAMMPS *, int, char **); + ~FixTDPDSource(); + int setmask(); + void init(); + void post_force(int); + + protected: + int option; + int cc_index; + double center[3], radius, dLx, dLy, dLz; + double value; +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/pair_edpd.cpp b/src/USER-MESO/pair_edpd.cpp new file mode 100644 index 0000000000..c1c100db43 --- /dev/null +++ b/src/USER-MESO/pair_edpd.cpp @@ -0,0 +1,551 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Zhen Li (Brown University) + Email: zhen_li@brown.edu +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_edpd.h" +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "update.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "random_mars.h" +#include "citeme.h" +#include "memory.h" +#include "error.h" +#include +#include + +using namespace LAMMPS_NS; + +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#define MAX(A,B) ((A) > (B) ? (A) : (B)) + +#define EPSILON 1.0e-10 + +static const char cite_pair_edpd[] = + "pair edpd command:\n\n" + "@Article{ZLi2014_JCP,\n" + " author = {Li, Z. and Tang, Y.-H. and Lei, H. and Caswell, B. and Karniadakis, G.E.},\n" + " title = {Energy-conserving dissipative particle dynamics with temperature-dependent properties},\n" + " journal = {Journal of Computational Physics},\n" + " year = {2014},\n" + " volume = {265},\n" + " pages = {113--127}\n" + "}\n\n" + "@Article{ZLi2015_CC,\n" + " author = {Li, Z. and Tang, Y.-H. and Li, X. and Karniadakis, G.E.},\n" + " title = {Mesoscale modeling of phase transition dynamics of thermoresponsive polymers},\n" + " journal = {Chemical Communications},\n" + " year = {2015},\n" + " volume = {51},\n" + " pages = {11038--11040}\n" + "}\n\n"; +; + +/* ---------------------------------------------------------------------- */ + +PairEDPD::PairEDPD(LAMMPS *lmp) : Pair(lmp) +{ + if (lmp->citeme) lmp->citeme->add(cite_pair_edpd); + writedata = 1; + random = NULL; + randomT = NULL; +} + +/* ---------------------------------------------------------------------- */ + +PairEDPD::~PairEDPD() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(cutT); + + memory->destroy(a0); + memory->destroy(gamma); + memory->destroy(power); + memory->destroy(kappa); + memory->destroy(powerT); + } + if (power_flag) memory->destroy(sc); + if (kappa_flag) memory->destroy(kc); + + if (random) delete random; + if (randomT) delete randomT; +} + +/* ---------------------------------------------------------------------- */ + +void PairEDPD::compute(int eflag, int vflag) +{ + double evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *T = atom->edpd_temp; + double *Q = atom->edpd_flux; + double *cv = atom->edpd_cv; + int *type = atom->type; + double *mass = atom->mass; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + double dtinvsqrt = 1.0/sqrt(update->dt); + double kboltz = 1.0; + + int inum = list->inum; + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + for (int ii = 0; ii < inum; ii++) { + int i = ilist[ii]; + double xtmp = x[i][0]; + double ytmp = x[i][1]; + double ztmp = x[i][2]; + double vxtmp = v[i][0]; + double vytmp = v[i][1]; + double vztmp = v[i][2]; + int itype = type[i]; + int *jlist = firstneigh[i]; + int jnum = numneigh[i]; + + for (int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + double factor_dpd = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + double delx = xtmp - x[j][0]; + double dely = ytmp - x[j][1]; + double delz = ztmp - x[j][2]; + double rsq = delx*delx + dely*dely + delz*delz; + int jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + double r = sqrt(rsq); + if (r < EPSILON) continue; + double rinv = 1.0/r; + double delvx = vxtmp - v[j][0]; + double delvy = vytmp - v[j][1]; + double delvz = vztmp - v[j][2]; + double dot = delx*delvx + dely*delvy + delz*delvz; + double vijeij = dot*rinv; + double randnum = random->gaussian(); + + double T_ij=0.5*(T[i]+T[j]); + double T_pow[4]; + T_pow[0] = T_ij - 1.0; + T_pow[1] = T_pow[0]*T_pow[0]; + T_pow[2] = T_pow[0]*T_pow[1]; + T_pow[3] = T_pow[0]*T_pow[2]; + + double power_d = power[itype][jtype]; + if(power_flag){ + double factor = 1.0; + for(int k = 0; k < 4; k++) + factor += sc[itype][jtype][k]*T_pow[k]; + power_d *= factor; + } + + power_d = MAX(0.01,power_d); + double wc = 1.0 - r/cut[itype][jtype]; + wc = MAX(0.0,MIN(1.0,wc)); + double wr = pow(wc, 0.5*power_d); + + double GammaIJ = gamma[itype][jtype]; + double SigmaIJ = 4.0*GammaIJ*kboltz*T[i]*T[j]/(T[i]+T[j]); + SigmaIJ = sqrt(SigmaIJ); + + double fpair = a0[itype][jtype]*T_ij*wc; + fpair -= GammaIJ *wr*wr *dot*rinv; + fpair += SigmaIJ * wr *randnum * dtinvsqrt; + fpair *= factor_dpd*rinv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + + // heat transfer + double dQc,dQd,dQr; + if( r < cutT[itype][jtype]) { + double wrT = 1.0 - r/cutT[itype][jtype]; + wrT = MAX(0.0,MIN(1.0,wrT)); + wrT = pow(wrT, 0.5*powerT[itype][jtype]); + double randnumT = randomT->gaussian(); + randnumT = MAX(-5.0,MIN(randnum,5.0)); + + double kappaT = kappa[itype][jtype]; + if(kappa_flag) { + double factor = 1.0; + for(int k = 0; k < 4; k++) + factor += kc[itype][jtype][k]*T_pow[k]; + kappaT *= factor; + } + + double kij = cv[i]*cv[j]*kappaT * T_ij*T_ij; + double alphaij = sqrt(2.0*kboltz*kij); + + dQc = kij * wrT*wrT * ( T[j] - T[i] )/(T[i]*T[j]); + dQd = wr*wr*( GammaIJ * vijeij*vijeij - SigmaIJ*SigmaIJ/mass[itype] ) - SigmaIJ * wr *vijeij *randnum; + dQd /= (cv[i]+cv[j]); + dQr = alphaij * wrT * dtinvsqrt * randnumT; + Q[i] += (dQc + dQd + dQr ); + } + //----------------------------------------------------------- + + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + Q[j] -= ( dQc - dQd + dQr ); + } + + if (eflag) { + evdwl = 0.5*a0[itype][jtype]*T_ij*cut[itype][jtype] * wc*wc; + evdwl *= factor_dpd; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairEDPD::allocate() +{ + int i,j; + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(cutT,n+1,n+1,"pair:cutT"); + memory->create(a0,n+1,n+1,"pair:a0"); + memory->create(gamma,n+1,n+1,"pair:gamma"); + memory->create(power,n+1,n+1,"pair:power"); + memory->create(kappa,n+1,n+1,"pair:kappa"); + memory->create(powerT,n+1,n+1,"pair:powerT"); + +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairEDPD::settings(int narg, char **arg) +{ + if (narg != 2) error->all(FLERR,"Illegal pair_style command"); + + cut_global = force->numeric(FLERR,arg[0]); + seed = force->inumeric(FLERR,arg[1]); + + // initialize Marsaglia RNG with processor-unique seed + + if (seed <= 0 ) { + struct timespec time; + clock_gettime( CLOCK_REALTIME, &time ); + seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed + } + delete random; + random = new RanMars(lmp,(seed + comm->me) % 900000000); + randomT = new RanMars(lmp,(2*seed + comm->me) % 900000000); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i+1; j <= atom->ntypes; j++) + if (setflag[i][j]) + cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairEDPD::coeff(int narg, char **arg) +{ + if (narg < 9) + error->all(FLERR,"Incorrect args for pair edpd coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double a0_one = force->numeric(FLERR,arg[2]); + double gamma_one = force->numeric(FLERR,arg[3]); + double power_one = force->numeric(FLERR,arg[4]); + double cut_one = force->numeric(FLERR,arg[5]); + double kappa_one = force->numeric(FLERR,arg[6]); + double powerT_one= force->numeric(FLERR,arg[7]); + double cutT_one = force->numeric(FLERR,arg[8]); + + int iarg = 9; + power_flag = kappa_flag = 0; + double sc_one[4], kc_one[4]; + int n = atom->ntypes; + while (iarg < narg) { + if (strcmp(arg[iarg],"power") == 0) { + if (iarg+5 > narg) error->all(FLERR,"Illegal pair edpd coefficients"); + for (int i = 0; i < 4; i++) + sc_one[i] = force->numeric(FLERR,arg[iarg+i+1]); + iarg += 5; + power_flag = 1; + memory->create(sc,n+1,n+1,4,"pair:sc"); + } else if (strcmp(arg[iarg],"kappa") == 0) { + if (iarg+5 > narg) error->all(FLERR,"Illegal pair edpd coefficients"); + for (int i = 0; i < 4; i++) + kc_one[i] = force->numeric(FLERR,arg[iarg+i+1]); + iarg += 5; + kappa_flag = 1; + memory->create(kc,n+1,n+1,4,"pair:kc"); + } else error->all(FLERR,"Illegal pair edpd coefficients"); + } + + int count = 0; + for (int i = ilo; i <= ihi; i++) + for (int j = MAX(jlo,i); j <= jhi; j++) { + a0[i][j] = a0_one; + gamma[i][j] = gamma_one; + power[i][j] = power_one; + cut[i][j] = cut_one; + kappa[i][j] = kappa_one; + powerT[i][j]= powerT_one; + cutT[i][j] = cutT_one; + + if(power_flag) + for (int k = 0; k < 4; k++) + sc[i][j][k] = sc_one[k]; + + if(kappa_flag) + for (int k = 0; k < 4; k++) + kc[i][j][k] = kc_one[k]; + + setflag[i][j] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairEDPD::init_style() +{ + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair edpd requires ghost atoms store velocity"); + + // if newton off, forces between atoms ij will be double computed + // using different random numbers + + if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR, + "Pair tdpd needs newton pair on for momentum conservation"); + + neighbor->request(this,instance_me); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairEDPD::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut[j][i] = cut[i][j]; + cutT[j][i] = cutT[i][j]; + a0[j][i] = a0[i][j]; + gamma[j][i] = gamma[i][j]; + power[j][i] = power[i][j]; + kappa[j][i] = kappa[i][j]; + powerT[j][i]= powerT[i][j]; + + if(power_flag) + for (int k = 0; k < 4; k++) + sc[j][i][k] = sc[i][j][k]; + + if(kappa_flag) + for (int k = 0; k < 4; k++) + kc[j][i][k] = kc[i][j][k]; + + return cut[i][j]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairEDPD::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&a0[i][j],sizeof(double),1,fp); + fwrite(&gamma[i][j],sizeof(double),1,fp); + fwrite(&power[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + fwrite(&kappa[i][j],sizeof(double),1,fp); + fwrite(&powerT[i][j],sizeof(double),1,fp); + fwrite(&cutT[i][j],sizeof(double),1,fp); + if(power_flag) + for (int k = 0; k < 4; k++) + fwrite(&sc[i][j][k],sizeof(double),1,fp); + + if(kappa_flag) + for (int k = 0; k < 4; k++) + fwrite(&kc[i][j][k],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairEDPD::read_restart(FILE *fp) +{ + read_restart_settings(fp); + + allocate(); + + int me = comm->me; + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&a0[i][j],sizeof(double),1,fp); + fread(&gamma[i][j],sizeof(double),1,fp); + fread(&power[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + fread(&kappa[i][j],sizeof(double),1,fp); + fread(&powerT[i][j],sizeof(double),1,fp); + fread(&cutT[i][j],sizeof(double),1,fp); + if(power_flag) + for (int k = 0; k < 4; k++) + fread(&sc[i][j][k],sizeof(double),1,fp); + + if(kappa_flag) + for (int k = 0; k < 4; k++) + fread(&kc[i][j][k],sizeof(double),1,fp); + } + MPI_Bcast(&a0[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&gamma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&power[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&kappa[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&powerT[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cutT[i][j],1,MPI_DOUBLE,0,world); + if(power_flag) + for (int k = 0; k < 4; k++) + MPI_Bcast(&sc[i][j][k],1,MPI_DOUBLE,0,world); + + if(kappa_flag) + for (int k = 0; k < 4; k++) + MPI_Bcast(&kc[i][j][k],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairEDPD::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); + fwrite(&seed,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairEDPD::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_global,sizeof(double),1,fp); + fread(&seed,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&seed,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + + // initialize Marsaglia RNG with processor-unique seed + // same seed that pair_style command initially specified + + if (random) delete random; + random = new RanMars(lmp,seed + comm->me); + if (randomT) delete randomT; + randomT = new RanMars(lmp,seed + comm->me); +} + +/* ---------------------------------------------------------------------- */ + +double PairEDPD::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_dpd, double &fforce) +{ + double r,rinv,wc,phi; + double *T = atom->edpd_temp; + + r = sqrt(rsq); + if (r < EPSILON) { + fforce = 0.0; + return 0.0; + } + double T_ij = 0.5*(T[i]+T[j]); + rinv = 1.0/r; + wc = 1.0 - r/cut[itype][jtype]; + fforce = a0[itype][jtype]*T_ij*wc*factor_dpd*rinv; + + phi = 0.5*a0[itype][jtype]*T_ij*cut[itype][jtype]*wc*wc; + return factor_dpd*phi; +} diff --git a/src/USER-MESO/pair_edpd.h b/src/USER-MESO/pair_edpd.h new file mode 100644 index 0000000000..9ab0ad9670 --- /dev/null +++ b/src/USER-MESO/pair_edpd.h @@ -0,0 +1,85 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(edpd,PairEDPD) + +#else + +#ifndef LMP_PAIR_EDPD_H +#define LMP_PAIR_EDPD_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairEDPD : public Pair { + public: + PairEDPD(class LAMMPS *); + virtual ~PairEDPD(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + virtual void write_restart(FILE *); + virtual void read_restart(FILE *); + virtual void write_restart_settings(FILE *); + virtual void read_restart_settings(FILE *); + double single(int, int, int, int, double, double, double, double &); + + protected: + double cut_global; + int seed; + double **cut,**cutT; + double **a0,**gamma; + double **power; + double **slope; + double **kappa; + double **powerT; + int power_flag, kappa_flag; + double ***sc,***kc; + class RanMars *random; + class RanMars *randomT; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +W: Pair tdpd needs newton pair on for momentum conservation + +Self-explanatory. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +*/ diff --git a/src/USER-MESO/pair_mdpd.cpp b/src/USER-MESO/pair_mdpd.cpp new file mode 100644 index 0000000000..ba72304ddb --- /dev/null +++ b/src/USER-MESO/pair_mdpd.cpp @@ -0,0 +1,428 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Zhen Li (Brown University) + Email: zhen_li@brown.edu +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_mdpd.h" +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "update.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "random_mars.h" +#include "citeme.h" +#include "memory.h" +#include "error.h" +#include + +using namespace LAMMPS_NS; + +#define EPSILON 1.0e-10 + +static const char cite_pair_mdpd[] = + "pair mdpd command:\n\n" + "@Article{ZLi2013_POF,\n" + " author = {Li, Z. and Hu, G.H. and Wang, Z.L. and Ma Y.B. and Zhou, Z.W.},\n" + " title = {Three dimensional flow structures in a moving droplet on substrate: a dissipative particle dynamics study},\n" + " journal = {Physics of Fluids},\n" + " year = {2013},\n" + " volume = {25},\n" + " pages = {072103}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- */ + +PairMDPD::PairMDPD(LAMMPS *lmp) : Pair(lmp) +{ + if (lmp->citeme) lmp->citeme->add(cite_pair_mdpd); + + writedata = 1; + random = NULL; +} + +/* ---------------------------------------------------------------------- */ + +PairMDPD::~PairMDPD() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(cut_r); + memory->destroy(A_att); + memory->destroy(B_rep); + memory->destroy(gamma); + memory->destroy(sigma); + } + if (random) delete random; +} + +/* ---------------------------------------------------------------------- */ + +void PairMDPD::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double vxtmp,vytmp,vztmp,delvx,delvy,delvz; + double rsq,r,rinv,dot,wc,wc_r, wr,randnum,factor_dpd; + int *ilist,*jlist,*numneigh,**firstneigh; + double rhoi, rhoj; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *rho= atom->rho; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + double dtinvsqrt = 1.0/sqrt(update->dt); + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + vxtmp = v[i][0]; + vytmp = v[i][1]; + vztmp = v[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + rhoi = rho[i]; + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_dpd = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r = sqrt(rsq); + if (r < EPSILON) continue; // r can be 0.0 in MDPD systems + rinv = 1.0/r; + delvx = vxtmp - v[j][0]; + delvy = vytmp - v[j][1]; + delvz = vztmp - v[j][2]; + dot = delx*delvx + dely*delvy + delz*delvz; + + wc = 1.0 - r/cut[itype][jtype]; + wc_r = 1.0 - r/cut_r[itype][jtype]; + wc_r = MAX(wc_r,0.0); + wr = wc; + + rhoj = rho[j]; + randnum = random->gaussian(); + + // conservative force = A_att * wc + B_rep*(rhoi+rhoj)*wc_r + // drag force = -gamma * wr^2 * (delx dot delv) / r + // random force = sigma * wr * rnd * dtinvsqrt; + + fpair = A_att[itype][jtype]*wc + B_rep[itype][jtype]*(rhoi+rhoj)*wc_r; + fpair -= gamma[itype][jtype]*wr*wr*dot*rinv; + fpair += sigma[itype][jtype]*wr*randnum*dtinvsqrt; + fpair *= factor_dpd*rinv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + // unshifted eng of conservative term: + // eng shifted to 0.0 at cutoff + evdwl = 0.5*A_att[itype][jtype]*cut[itype][jtype] * wr*wr + 0.5*B_rep[itype][jtype]*cut_r[itype][jtype]*(rhoi+rhoj)*wc_r*wc_r; + evdwl *= factor_dpd; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz); + } + } + } + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairMDPD::allocate() +{ + int i,j; + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(cut_r,n+1,n+1,"pair:cut_r"); + memory->create(A_att,n+1,n+1,"pair:A_att"); + memory->create(B_rep,n+1,n+1,"pair:B_rep"); + memory->create(gamma,n+1,n+1,"pair:gamma"); + memory->create(sigma,n+1,n+1,"pair:sigma"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairMDPD::settings(int narg, char **arg) +{ + if (narg != 3) error->all(FLERR,"Illegal pair_style command"); + + temperature = force->numeric(FLERR,arg[0]); + cut_global = force->numeric(FLERR,arg[1]); + seed = force->inumeric(FLERR,arg[2]); + + // initialize Marsaglia RNG with processor-unique seed + + if (seed <= 0 ) { + struct timespec time; + clock_gettime( CLOCK_REALTIME, &time ); + seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed + } + delete random; + random = new RanMars(lmp,(seed + comm->me) % 900000000); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i+1; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairMDPD::coeff(int narg, char **arg) +{ + if(narg != 7 ) error->all(FLERR,"Incorrect args for pair coefficients\n itype jtype A B gamma cutA cutB"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double A_one = force->numeric(FLERR,arg[2]); + double B_one = force->numeric(FLERR,arg[3]); + double gamma_one = force->numeric(FLERR,arg[4]); + double cut_one = force->numeric(FLERR,arg[5]); + double cut_two = force->numeric(FLERR,arg[6]); + + if(cut_one < cut_two) error->all(FLERR,"Incorrect args for pair coefficients\n cutA should be larger than cutB."); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + A_att[i][j] = A_one; + B_rep[i][j] = B_one; + gamma[i][j] = gamma_one; + cut[i][j] = cut_one; + cut_r[i][j] = cut_two; + setflag[i][j] = 1; + count++; + } + } + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairMDPD::init_style() +{ + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair mdpd requires ghost atoms store velocity"); + + if (!atom->rho_flag) + error->all(FLERR,"Pair style mdpd requires atom attribute rho"); + + // if newton off, forces between atoms ij will be double computed + // using different random numbers + + if (force->newton_pair == 0 && comm->me == 0) error->warning(FLERR, + "Pair mdpd needs newton pair on for momentum conservation"); + + neighbor->request(this,instance_me); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairMDPD::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); + + cut[j][i] = cut[i][j]; + cut_r[j][i] = cut_r[i][j]; + A_att[j][i] = A_att[i][j]; + B_rep[j][i] = B_rep[i][j]; + gamma[j][i] = gamma[i][j]; + sigma[j][i] = sigma[i][j]; + + return cut[i][j]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairMDPD::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&A_att[i][j],sizeof(double),1,fp); + fwrite(&B_rep[i][j],sizeof(double),1,fp); + fwrite(&gamma[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + fwrite(&cut_r[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairMDPD::read_restart(FILE *fp) +{ + read_restart_settings(fp); + + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&A_att[i][j],sizeof(double),1,fp); + fread(&B_rep[i][j],sizeof(double),1,fp); + fread(&gamma[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + fread(&cut_r[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&A_att[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&B_rep[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&gamma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_r[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairMDPD::write_restart_settings(FILE *fp) +{ + fwrite(&temperature,sizeof(double),1,fp); + fwrite(&cut_global,sizeof(double),1,fp); + fwrite(&seed,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairMDPD::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&temperature,sizeof(double),1,fp); + fread(&cut_global,sizeof(double),1,fp); + fread(&seed,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&temperature,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&seed,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + + // initialize Marsaglia RNG with processor-unique seed + // same seed that pair_style command initially specified + + if (random) delete random; + random = new RanMars(lmp,seed + comm->me); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairMDPD::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g %g\n",i,A_att[i][i],B_rep[i][i],gamma[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairMDPD::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g %g %g\n",i,j,A_att[i][j],B_rep[i][j],gamma[i][j],cut[i][j],cut_r[i][j]); +} + diff --git a/src/USER-MESO/pair_mdpd.h b/src/USER-MESO/pair_mdpd.h new file mode 100644 index 0000000000..ea0389c7fe --- /dev/null +++ b/src/USER-MESO/pair_mdpd.h @@ -0,0 +1,84 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(mdpd,PairMDPD) + +#else + +#ifndef LMP_PAIR_MDPD_H +#define LMP_PAIR_MDPD_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairMDPD : public Pair { + public: + PairMDPD(class LAMMPS *); + virtual ~PairMDPD(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + virtual void write_restart(FILE *); + virtual void read_restart(FILE *); + virtual void write_restart_settings(FILE *); + virtual void read_restart_settings(FILE *); + virtual void write_data(FILE *); + virtual void write_data_all(FILE *); + + protected: + double cut_global,temperature; + int seed; + double **cut, **cut_r; + double **A_att,**B_rep; + double **gamma,**sigma; + class RanMars *random; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dpd requires ghost atoms store velocity + +Use the comm_modify vel yes command to enable this. + +W: Pair dpd needs newton pair on for momentum conservation + +Self-explanatory. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +*/ diff --git a/src/USER-MESO/pair_mdpd_rhosum.cpp b/src/USER-MESO/pair_mdpd_rhosum.cpp new file mode 100644 index 0000000000..d2a4ad33d8 --- /dev/null +++ b/src/USER-MESO/pair_mdpd_rhosum.cpp @@ -0,0 +1,271 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/*----------------------------------------------------------------------- + This is a Child Class PairMDPD for taking care of density summation + before the force calculation. + The code uses 3D Lucy kernel, it can be modified for other kernels. + + Contributing author: Zhen Li (Brown University) +------------------------------------------------------------------------- */ + +#include +#include +#include "pair_mdpd_rhosum.h" +#include "atom.h" +#include "force.h" +#include "comm.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "memory.h" +#include "error.h" +#include "neighbor.h" +#include "update.h" +#include "domain.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairMDPDRhoSum::PairMDPDRhoSum(LAMMPS *lmp) : Pair(lmp) +{ + restartinfo = 0; + + // set comm size needed by this Pair + + comm_forward = 1; + first = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairMDPDRhoSum::~PairMDPDRhoSum() { + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + } +} + +/* ---------------------------------------------------------------------- + init specific to this pair style + ------------------------------------------------------------------------- */ + +void PairMDPDRhoSum::init_style() +{ + if (!atom->rho_flag) + error->all(FLERR,"Pair style mdpd/rhosum requires atom attribute rho"); + + // need a full neighbor list + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; +} + +/* ---------------------------------------------------------------------- */ + +void PairMDPDRhoSum::compute(int eflag, int vflag) { + int i, j, ii, jj, jnum, itype, jtype; + double xtmp, ytmp, ztmp, delx, dely, delz; + double r, rsq, h, ih, ihsq; + int *jlist; + double wf; + // neighbor list variables + int inum, *ilist, *numneigh, **firstneigh; + + if (eflag || vflag) + ev_setup(eflag, vflag); + else + evflag = vflag_fdotr = 0; + + double **x = atom->x; + double *rho = atom->rho; + int *type = atom->type; + double *mass = atom->mass; + + // check consistency of pair coefficients + if (first) { + for (i = 1; i <= atom->ntypes; i++) + for (j = 1; i <= atom->ntypes; i++) + if (cutsq[i][j] > 0.0) + if (!setflag[i][i] || !setflag[j][j]) + if (comm->me == 0) + printf("mDPD particle types %d and %d interact, but not all of their single particle properties are set.\n", i, j); + + first = 0; + } + + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // recompute density + // we use a full neighborlist here + + // initialize density with zero self-contribution, + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itype = type[i]; + + h = cut[itype][itype]; + // Lucy kernel, 3d + wf = 2.0889086280811262819e0 / (h * h * h); + rho[i] = 0; + } + + // add density at each atom via kernel function overlap + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + jtype = type[j]; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx * delx + dely * dely + delz * delz; + + if (rsq < cutsq[itype][jtype]) { + h = cut[itype][jtype]; + ih = 1.0 / h; + ihsq = ih * ih; + + // Lucy kernel, 3d + r = sqrt(rsq); + wf = (h - r) * ihsq; + wf = 2.0889086280811262819e0 * (h + 3. * r) * wf * wf * wf * ih; + rho[i] += mass[jtype]*wf; + } + } + } + + // communicate densities + comm->forward_comm_pair(this); +} + +/* ---------------------------------------------------------------------- + allocate all arrays + ------------------------------------------------------------------------- */ + +void PairMDPDRhoSum::allocate() { + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag, n + 1, n + 1, "pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + + memory->create(cut, n + 1, n + 1, "pair:cut"); +} + +/* ---------------------------------------------------------------------- + global settings + ------------------------------------------------------------------------- */ + +void PairMDPDRhoSum::settings(int narg, char **arg) { + if (narg != 0) + error->all(FLERR,"Illegal number of setting arguments for pair_style mdpd/rhosum"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs + ------------------------------------------------------------------------- */ + +void PairMDPDRhoSum::coeff(int narg, char **arg) { + if (narg != 3) + error->all(FLERR,"Incorrect number of args for mdpd/rhosum coefficients"); + if (!allocated) + allocate(); + + int ilo, ihi, jlo, jhi; + force->bounds(FLERR,arg[0], atom->ntypes, ilo, ihi); + force->bounds(FLERR,arg[1], atom->ntypes, jlo, jhi); + + double cut_one = force->numeric(FLERR,arg[2]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) + error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i + ------------------------------------------------------------------------- */ + +double PairMDPDRhoSum::init_one(int i, int j) { + if (setflag[i][j] == 0) { + error->all(FLERR,"All pair mdpd/rhosum coeffs are not set"); + } + + cut[j][i] = cut[i][j]; + + return cut[i][j]; +} + +/* ---------------------------------------------------------------------- */ + +double PairMDPDRhoSum::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_lj, double &fforce) { + fforce = 0.0; + + return 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int PairMDPDRhoSum::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) { + int i, j, m; + double *rho = atom->rho; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = rho[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void PairMDPDRhoSum::unpack_forward_comm(int n, int first, double *buf) { + int i, m, last; + double *rho = atom->rho; + + m = 0; + last = first + n; + for (i = first; i < last; i++) + rho[i] = buf[m++]; +} diff --git a/src/USER-MESO/pair_mdpd_rhosum.h b/src/USER-MESO/pair_mdpd_rhosum.h new file mode 100644 index 0000000000..a972ec7ccf --- /dev/null +++ b/src/USER-MESO/pair_mdpd_rhosum.h @@ -0,0 +1,50 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(mdpd/rhosum,PairMDPDRhoSum) + +#else + +#ifndef LMP_PAIR_MDPD_RHOSUM_H +#define LMP_PAIR_MDPD_RHOSUM_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairMDPDRhoSum : public Pair { + public: + PairMDPDRhoSum(class LAMMPS *); + virtual ~PairMDPDRhoSum(); + void init_style(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + virtual double init_one(int, int); + virtual double single(int, int, int, int, double, double, double, double &); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + + protected: + double **cut; + int first; + + void allocate(); +}; + +} + +#endif +#endif diff --git a/src/USER-MESO/pair_tdpd.cpp b/src/USER-MESO/pair_tdpd.cpp new file mode 100644 index 0000000000..42904d2b5a --- /dev/null +++ b/src/USER-MESO/pair_tdpd.cpp @@ -0,0 +1,480 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Zhen Li (Brown University) + Email: zhen_li@brown.edu +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "pair_tdpd.h" +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "update.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "random_mars.h" +#include "citeme.h" +#include "memory.h" +#include "error.h" +#include + +using namespace LAMMPS_NS; + +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#define MAX(A,B) ((A) > (B) ? (A) : (B)) + +#define EPSILON 1.0e-10 + +static const char cite_pair_tdpd[] = + "pair tdpd command:\n\n" + "@Article{ZLi2015_JCP,\n" + " author = {Li, Z. and Yazdani, A. and Tartakovsky, A. and Karniadakis, G.E.},\n" + " title = {Transport dissipative particle dynamics model for mesoscopic advection-diffusion-reaction problems},\n" + " journal = {The Journal of Chemical Physics},\n" + " year = {2015},\n" + " volume = {143},\n" + " pages = {014101}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- */ + +PairTDPD::PairTDPD(LAMMPS *lmp) : Pair(lmp) +{ + if (lmp->citeme) lmp->citeme->add(cite_pair_tdpd); + cc_species = atom->cc_species; + + writedata = 1; + random = NULL; +} + +/* ---------------------------------------------------------------------- */ + +PairTDPD::~PairTDPD() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut); + memory->destroy(cutcc); + + memory->destroy(a0); + memory->destroy(gamma); + memory->destroy(sigma); + + memory->destroy(power); + memory->destroy(kappa); + memory->destroy(epsilon); + memory->destroy(powercc); + } + + if (random) delete random; +} + +/* ---------------------------------------------------------------------- */ + +void PairTDPD::compute(int eflag, int vflag) +{ + double evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **cc = atom->cc; + double **cc_flux = atom->cc_flux; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + double dtinvsqrt = 1.0/sqrt(update->dt); + + int inum = list->inum; + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + for (int ii = 0; ii < inum; ii++) { + int i = ilist[ii]; + double xtmp = x[i][0]; + double ytmp = x[i][1]; + double ztmp = x[i][2]; + double vxtmp = v[i][0]; + double vytmp = v[i][1]; + double vztmp = v[i][2]; + int itype = type[i]; + int *jlist = firstneigh[i]; + int jnum = numneigh[i]; + + for (int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + double factor_dpd = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + double delx = xtmp - x[j][0]; + double dely = ytmp - x[j][1]; + double delz = ztmp - x[j][2]; + double rsq = delx*delx + dely*dely + delz*delz; + int jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + double r = sqrt(rsq); + if (r < EPSILON) continue; // r can be 0.0 in DPD systems + double rinv = 1.0/r; + double delvx = vxtmp - v[j][0]; + double delvy = vytmp - v[j][1]; + double delvz = vztmp - v[j][2]; + double dot = delx*delvx + dely*delvy + delz*delvz; + double wc = 1.0 - r/cut[itype][jtype]; + wc = MAX(0,MIN(1.0,wc)); + double wr = pow(wc, 0.5*power[itype][jtype]); + double randnum = random->gaussian(); + + // conservative force = a0 * wc + // drag force = -gamma * wr^2 * (delx dot delv) / r + // random force = sigma * wr^(power/2) * rnd * dtinvsqrt; + + double fpair = a0[itype][jtype]*wc; + fpair -= gamma[itype][jtype]*wr*wr*dot*rinv; + fpair += sigma[itype][jtype]*wr*randnum*dtinvsqrt; + fpair *= factor_dpd*rinv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + + // chemical concentration transport + if( r < cutcc[itype][jtype]) { + for(int k=0; kgaussian(); + randnum = MAX(-5.0,MIN(randnum,5.0)); + double dQc = -kappa[itype][jtype][k] * wcr*wcr *(cc[i][k]-cc[j][k]); + double dQr = epsilon[itype][jtype][k] *wcr* (cc[i][k]+cc[j][k]) *randnum*dtinvsqrt; + cc_flux[i][k] += (dQc + dQr); + if (newton_pair || j < nlocal) + cc_flux[j][k] -= ( dQc + dQr ); + } + } + //----------------------------------------------------------- + + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + evdwl = 0.5*a0[itype][jtype]*cut[itype][jtype] * wc*wc; + evdwl *= factor_dpd; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairTDPD::allocate() +{ + int i,j; + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(cutcc,n+1,n+1,"pair:cutcc"); + memory->create(a0,n+1,n+1,"pair:a0"); + memory->create(gamma,n+1,n+1,"pair:gamma"); + memory->create(sigma,n+1,n+1,"pair:sigma"); + memory->create(power,n+1,n+1,"pair:power"); + memory->create(kappa,n+1,n+1,cc_species,"pair:kappa"); + memory->create(epsilon,n+1,n+1,cc_species,"pair:epsilon"); + memory->create(powercc,n+1,n+1,cc_species,"pair:powercc"); + + for (i = 0; i <= atom->ntypes; i++) + for (j = 0; j <= atom->ntypes; j++) + sigma[i][j] = gamma[i][j] = 0.0; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairTDPD::settings(int narg, char **arg) +{ + if (narg != 3) error->all(FLERR,"Illegal pair_style command"); + + temperature = force->numeric(FLERR,arg[0]); + cut_global = force->numeric(FLERR,arg[1]); + seed = force->inumeric(FLERR,arg[2]); + + // initialize Marsaglia RNG with processor-unique seed + + if (seed <= 0 ) { + struct timespec time; + clock_gettime( CLOCK_REALTIME, &time ); + seed = time.tv_nsec; // if seed is non-positive, get the current time as the seed + } + delete random; + random = new RanMars(lmp,(seed + comm->me) % 900000000); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i+1; j <= atom->ntypes; j++) + if (setflag[i][j]) + cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairTDPD::coeff(int narg, char **arg) +{ + if (narg != 7 + 3*cc_species) + error->all(FLERR,"Incorrect args for pair tdpd coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double a0_one = force->numeric(FLERR,arg[2]); + double gamma_one = force->numeric(FLERR,arg[3]); + double power_one = force->numeric(FLERR,arg[4]); + double cut_one = force->numeric(FLERR,arg[5]); + double cutcc_one = force->numeric(FLERR,arg[6]); + double kappa_one[cc_species],epsilon_one[cc_species],powercc_one[cc_species]; + for(int k=0; knumeric(FLERR,arg[7+3*k]); + epsilon_one[k] = force->numeric(FLERR,arg[8+3*k]); + powercc_one[k] = force->numeric(FLERR,arg[9+3*k]); + } + + int count = 0; + for (int i = ilo; i <= ihi; i++) + for (int j = MAX(jlo,i); j <= jhi; j++) { + a0[i][j] = a0_one; + gamma[i][j] = gamma_one; + power[i][j] = power_one; + cut[i][j] = cut_one; + cutcc[i][j] = cutcc_one; + for(int k=0; kall(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairTDPD::init_style() +{ + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair style tdpd requires ghost atoms store velocity"); + + if (!atom->tdpd_flag) + error->all(FLERR,"Pair style tdpd requires atom properties cc/cc_flux"); + + // if newton off, forces between atoms ij will be double computed + // using different random numbers + + if (force->newton_pair == 0 && comm->me == 0) + error->warning(FLERR,"Pair tdpd needs newton pair on " + "for momentum conservation"); + + neighbor->request(this,instance_me); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairTDPD::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); + + cut[j][i] = cut[i][j]; + cutcc[j][i] = cutcc[i][j]; + a0[j][i] = a0[i][j]; + gamma[j][i] = gamma[i][j]; + sigma[j][i] = sigma[i][j]; + power[j][i] = power[i][j]; + for(int k=0; kntypes; i++) + for (int j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&a0[i][j],sizeof(double),1,fp); + fwrite(&gamma[i][j],sizeof(double),1,fp); + fwrite(&power[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + fwrite(&cutcc[i][j],sizeof(double),1,fp); + for(int k=0; kme; + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&a0[i][j],sizeof(double),1,fp); + fread(&gamma[i][j],sizeof(double),1,fp); + fread(&power[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + fread(&cutcc[i][j],sizeof(double),1,fp); + for(int k=0; kme == 0) { + fread(&temperature,sizeof(double),1,fp); + fread(&cut_global,sizeof(double),1,fp); + fread(&seed,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&temperature,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&seed,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + + // initialize Marsaglia RNG with processor-unique seed + // same seed that pair_style command initially specified + + if (random) delete random; + random = new RanMars(lmp,seed + comm->me); +} + +/* ---------------------------------------------------------------------- */ + +double PairTDPD::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_dpd, double &fforce) +{ + double r,rinv,wc,phi; + + r = sqrt(rsq); + if (r < EPSILON) { + fforce = 0.0; + return 0.0; + } + + rinv = 1.0/r; + wc = 1.0 - r/cut[itype][jtype]; + fforce = a0[itype][jtype]*wc*factor_dpd*rinv; + + phi = 0.5*a0[itype][jtype]*cut[itype][jtype]*wc*wc; + return factor_dpd*phi; +} diff --git a/src/USER-MESO/pair_tdpd.h b/src/USER-MESO/pair_tdpd.h new file mode 100644 index 0000000000..9245308d38 --- /dev/null +++ b/src/USER-MESO/pair_tdpd.h @@ -0,0 +1,81 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(tdpd,PairTDPD) + +#else + +#ifndef LMP_PAIR_TDPD_H +#define LMP_PAIR_TDPD_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairTDPD : public Pair { + public: + PairTDPD(class LAMMPS *); + virtual ~PairTDPD(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + virtual void write_restart(FILE *); + virtual void read_restart(FILE *); + virtual void write_restart_settings(FILE *); + virtual void read_restart_settings(FILE *); + double single(int, int, int, int, double, double, double, double &); + + protected: + double cut_global,temperature; + int seed,cc_species; + double **cut,**cutcc; + double **a0,**gamma,**sigma; + double **power; + double ***kappa,***epsilon; + double ***powercc; + class RanMars *random; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +W: Pair tdpd needs newton pair on for momentum conservation + +Self-explanatory. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +*/ diff --git a/src/USER-MISC/README b/src/USER-MISC/README index 2fd25df9be..a8c33fa380 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -47,6 +47,7 @@ fix imd, Axel Kohlmeyer, akohlmey at gmail.com, 9 Nov 2009 fix ipi, Michele Ceriotti (EPFL Lausanne), michele.ceriotti at gmail.com, 24 Nov 2014 fix nvk, Efrem Braun (UC Berkeley), efrem.braun at gmail.com, https://github.com/lammps/lammps/pull/310 fix pimd, Yuxing Peng (U Chicago), yuxing at uchicago.edu, 24 Nov 2014 +fix rhok, Ulf Pedersen (Roskilde U), ulf at urp.dk, 25 Sep 2017 fix smd, Axel Kohlmeyer, akohlmey at gmail.com, 19 May 2008 fix ti/spring, Rodrigo Freitas (Unicamp/Brazil), rodrigohb at gmail.com, 7 Nov 2013 fix ttm/mod, Sergey Starikov and Vasily Pisarev (JIHT), pisarevvv at gmail.com, 2 Feb 2015 @@ -62,6 +63,7 @@ pair_style coul/diel, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 pair_style eam/cd, Alexander Stukowski, stukowski at mm.tu-darmstadt.de, 7 Nov 09 +pair_style extep, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Nov 17 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13 @@ -74,3 +76,4 @@ pair_style srp, Tim Sirk, tim.sirk at us.army.mil, 21 Nov 14 pair_style tersoff/table, Luca Ferraro, luca.ferraro@caspur.it, 1 Dec 11 pair_style momb, Kristen Fichthorn, Tonnam Balankura, Ya Zhou, fichthorn@psu.edu, 18 Mar 17 temper/grem, David Stelter, dstelter@bu.edu, 22 Nov 16 +temper/npt, Amulya K. Pervaje, Cody K. Addington, amulyapervaje@gmail.com , 31 Aug 17 diff --git a/src/USER-MISC/fix_rhok.cpp b/src/USER-MISC/fix_rhok.cpp new file mode 100644 index 0000000000..58b0e95a97 --- /dev/null +++ b/src/USER-MISC/fix_rhok.cpp @@ -0,0 +1,245 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Ulf R. Pedersen, ulf@urp.dk +------------------------------------------------------------------------- */ + +#include +#include +#include +#include + +#include "fix_rhok.h" +#include "atom.h" +#include "domain.h" +#include "error.h" +#include "force.h" +#include "respa.h" +#include "update.h" +#include "citeme.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +static const char cite_fix_rhok[] = + "Bias on the collective density field (fix rhok):\n\n" + "@Article{pedersen_jcp139_104102_2013,\n" + "title = {Direct calculation of the solid-liquid Gibbs free energy difference in a single equilibrium simulation},\n" + "volume = {139},\n" + "number = {10},\n" + "url = {http://aip.scitation.org/doi/10.1063/1.4818747},\n" + "doi = {10.1063/1.4818747},\n" + "urldate = {2017-10-03},\n" + "journal = {J. Chem. Phys.},\n" + "author = {Pedersen, Ulf R.},\n" + "year = {2013},\n" + "pages = {104102}\n" + "}\n\n"; + +FixRhok::FixRhok( LAMMPS* inLMP, int inArgc, char** inArgv ) + : Fix( inLMP, inArgc, inArgv ) +{ + + if (lmp->citeme) lmp->citeme->add(cite_fix_rhok); + + // Check arguments + if( inArgc != 8 ) + error->all(FLERR,"Illegal fix rhoKUmbrella command" ); + + // Set up fix flags + scalar_flag = 1; // have compute_scalar + vector_flag = 1; // have compute_vector... + size_vector = 3; // ...with this many components + global_freq = 1; // whose value can be computed at every timestep + thermo_energy = 1; // this fix changes system's potential energy + extscalar = 0; // but the deltaPE might not scale with # of atoms + extvector = 0; // neither do the components of the vector + + // Parse fix options + int n[3]; + + n[0] = force->inumeric(FLERR,inArgv[3]); + n[1] = force->inumeric(FLERR,inArgv[4]); + n[2] = force->inumeric(FLERR,inArgv[5]); + + mK[0] = n[0]*(2*M_PI / (domain->boxhi[0] - domain->boxlo[0])); + mK[1] = n[1]*(2*M_PI / (domain->boxhi[1] - domain->boxlo[1])); + mK[2] = n[2]*(2*M_PI / (domain->boxhi[2] - domain->boxlo[2])); + + mKappa = force->numeric(FLERR,inArgv[6]); + mRhoK0 = force->numeric(FLERR,inArgv[7]); +} + +// Methods that this fix implements +// -------------------------------- + +// Tells LAMMPS where this fix should act +int +FixRhok::setmask() +{ + int mask = 0; + + // This fix modifies forces... + mask |= POST_FORCE; + mask |= POST_FORCE_RESPA; + mask |= MIN_POST_FORCE; + + // ...and potential energies + mask |= THERMO_ENERGY; + + return mask; +} + +// Initializes the fix at the beginning of a run +void +FixRhok::init() +{ + // RESPA boilerplate + if( strcmp( update->integrate_style, "respa" ) == 0 ) + mNLevelsRESPA = ((Respa *) update->integrate)->nlevels; + + // Count the number of affected particles + int nThisLocal = 0; + int *mask = atom->mask; + int nlocal = atom->nlocal; + for( int i = 0; i < nlocal; i++ ) { // Iterate through all atoms on this CPU + if( mask[i] & groupbit ) { // ...only those affected by this fix + nThisLocal++; + } + } + MPI_Allreduce( &nThisLocal, &mNThis, + 1, MPI_INT, MPI_SUM, world ); + mSqrtNThis = sqrt( mNThis ); +} + +// Initial application of the fix to a system (when doing MD) +void +FixRhok::setup( int inVFlag ) +{ + if( strcmp( update->integrate_style, "verlet" ) == 0 ) + post_force( inVFlag ); + else + { + ((Respa *) update->integrate)->copy_flevel_f( mNLevelsRESPA - 1 ); + post_force_respa( inVFlag, mNLevelsRESPA - 1,0 ); + ((Respa *) update->integrate)->copy_f_flevel( mNLevelsRESPA - 1 ); + } +} + +// Initial application of the fix to a system (when doing minimization) +void +FixRhok::min_setup( int inVFlag ) +{ + post_force( inVFlag ); +} + +// Modify the forces calculated in the main force loop of ordinary MD +void +FixRhok::post_force( int inVFlag ) +{ + double **x = atom->x; + double **f = atom->f; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // Loop over locally-owned atoms affected by this fix and calculate the + // partial rhoK's + mRhoKLocal[0] = 0.0; + mRhoKLocal[1] = 0.0; + + for( int i = 0; i < nlocal; i++ ) { // Iterate through all atoms on this CPU + if( mask[i] & groupbit ) { // ...only those affected by this fix + + // rho_k = sum_i exp( - i k.r_i ) + mRhoKLocal[0] += cos( mK[0]*x[i][0] + mK[1]*x[i][1] + mK[2]*x[i][2] ); + mRhoKLocal[1] -= sin( mK[0]*x[i][0] + mK[1]*x[i][1] + mK[2]*x[i][2] ); + } + } + + // Now calculate mRhoKGlobal + MPI_Allreduce( mRhoKLocal, mRhoKGlobal, + 2, MPI_DOUBLE, MPI_SUM, world ); + + // Info: < \sum_{i,j} e^{-ik.(r_i - r_j)} > ~ N, so + // we define rho_k as (1 / sqrt(N)) \sum_i e^{-i k.r_i}, so that + // is intensive. + mRhoKGlobal[0] /= mSqrtNThis; + mRhoKGlobal[1] /= mSqrtNThis; + + // We'll need magnitude of rho_k + double rhoK = sqrt( mRhoKGlobal[0]*mRhoKGlobal[0] + + mRhoKGlobal[1]*mRhoKGlobal[1] ); + + for( int i = 0; i < nlocal; i++ ) { // Iterate through all atoms on this CPU + if( mask[i] & groupbit ) { // ...only those affected by this fix + + // Calculate forces + // U = kappa/2 ( |rho_k| - rho_k^0 )^2 + // f_i = -grad_i U = -kappa ( |rho_k| - rho_k^0 ) grad_i |rho_k| + // grad_i |rho_k| = Re( rho_k* (-i k e^{-i k . r_i} / sqrt(N)) ) / |rho_k| + // + // In terms of real and imag parts of rho_k, + // + // Re( rho_k* (-i k e^{-i k . r_i}) ) = + // (- Re[rho_k] * sin( k . r_i ) - Im[rho_k] * cos( k . r_i )) * k + + double sinKRi = sin( mK[0]*x[i][0] + mK[1]*x[i][1] + mK[2]*x[i][2] ); + double cosKRi = cos( mK[0]*x[i][0] + mK[1]*x[i][1] + mK[2]*x[i][2] ); + + double prefactor = mKappa * ( rhoK - mRhoK0 ) / rhoK + * (-mRhoKGlobal[0]*sinKRi - mRhoKGlobal[1]*cosKRi) / mSqrtNThis; + f[i][0] -= prefactor * mK[0]; + f[i][1] -= prefactor * mK[1]; + f[i][2] -= prefactor * mK[2]; + } + } +} + +// Forces in RESPA loop +void +FixRhok::post_force_respa( int inVFlag, int inILevel, int inILoop ) +{ + if( inILevel == mNLevelsRESPA - 1 ) + post_force( inVFlag ); +} + +// Forces in minimization loop +void +FixRhok::min_post_force( int inVFlag ) +{ + post_force( inVFlag ); +} + +// Compute the change in the potential energy induced by this fix +double +FixRhok::compute_scalar() +{ + double rhoK = sqrt( mRhoKGlobal[0]*mRhoKGlobal[0] + + mRhoKGlobal[1]*mRhoKGlobal[1] ); + + return 0.5 * mKappa * (rhoK - mRhoK0) * (rhoK - mRhoK0); +} + +// Compute the ith component of the vector +double +FixRhok::compute_vector( int inI ) +{ + if( inI == 0 ) + return mRhoKGlobal[0]; // Real part + else if( inI == 1 ) + return mRhoKGlobal[1]; // Imagniary part + else if( inI == 2 ) + return sqrt( mRhoKGlobal[0]*mRhoKGlobal[0] + + mRhoKGlobal[1]*mRhoKGlobal[1] ); + else + return 12345.0; +} diff --git a/src/USER-MISC/fix_rhok.h b/src/USER-MISC/fix_rhok.h new file mode 100644 index 0000000000..c950c08b1d --- /dev/null +++ b/src/USER-MISC/fix_rhok.h @@ -0,0 +1,77 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(rhok,FixRhok) + +#else + +#ifndef LMP_FIX_RHOK_H +#define LMP_FIX_RHOK_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixRhok : public Fix +{ +public: + // Constructor: all the parameters to this fix specified in + // the LAMMPS input get passed in + FixRhok( LAMMPS* inLMP, int inArgc, char** inArgv ); + virtual ~FixRhok() {}; + + // Methods that this fix implements + // -------------------------------- + + // Tells LAMMPS where this fix should act + int setmask(); + + // Initializes the fix at the beginning of a run + void init(); + + // Initial application of the fix to a system (when doing MD / minimization) + void setup( int inVFlag ); + void min_setup( int inVFlag ); + + // Modify the forces calculated in the main force loop, either when + // doing usual MD, RESPA MD or minimization + void post_force( int inVFlag ); + void post_force_respa( int inVFlag, int inILevel, int inILoop ); + void min_post_force( int inVFlag ); + + // Compute the change in the potential energy induced by this fix + double compute_scalar(); + + // Compute the ith component of the vector associated with this fix + double compute_vector( int inI ); + +private: + // RESPA boilerplate + int mNLevelsRESPA; + + // Defining parameters for this umbrella + double mK[3], mKappa, mRhoK0; + + // Number of particles affected by the fix + int mNThis; + double mSqrtNThis; + + // Real and imaginary parts of rho_k := sum_i exp( - i k . r_i ) + double mRhoKLocal[2], mRhoKGlobal[2]; +}; + +} // namespace LAMMPS_NS + +#endif // __FIX_RHOK__ +#endif // FIX_CLASS + diff --git a/src/USER-MISC/fix_smd.cpp b/src/USER-MISC/fix_smd.cpp index b527e4b788..b2d3ee0779 100644 --- a/src/USER-MISC/fix_smd.cpp +++ b/src/USER-MISC/fix_smd.cpp @@ -58,6 +58,7 @@ FixSMD::FixSMD(LAMMPS *lmp, int narg, char **arg) : extvector = 1; respa_level_support = 1; ilevel_respa = 0; + virial_flag = 1; int argoffs=3; if (strcmp(arg[argoffs],"cvel") == 0) { @@ -181,6 +182,11 @@ void FixSMD::setup(int vflag) void FixSMD::post_force(int vflag) { + // energy and virial setup + + if (vflag) v_setup(vflag); + else evflag = 0; + if (styleflag & SMD_TETHER) smd_tether(); else smd_couple(); @@ -238,12 +244,15 @@ void FixSMD::smd_tether() // apply restoring force to atoms in group // f = -k*(r-r0)*mass/masstotal + double **x = atom->x; double **f = atom->f; + imageint *image = atom->image; int *mask = atom->mask; int *type = atom->type; double *mass = atom->mass; double *rmass = atom->rmass; double massfrac; + double unwrap[3],v[6]; int nlocal = atom->nlocal; ftotal[0] = ftotal[1] = ftotal[2] = 0.0; @@ -259,6 +268,16 @@ void FixSMD::smd_tether() ftotal[0] -= fx*massfrac; ftotal[1] -= fy*massfrac; ftotal[2] -= fz*massfrac; + if (evflag) { + domain->unmap(x[i],image[i],unwrap); + v[0] = fx*massfrac*unwrap[0]; + v[1] = fy*massfrac*unwrap[1]; + v[2] = fz*massfrac*unwrap[2]; + v[3] = fx*massfrac*unwrap[1]; + v[4] = fx*massfrac*unwrap[2]; + v[5] = fy*massfrac*unwrap[2]; + v_tally(i, v); + } } } else { for (int i = 0; i < nlocal; i++) @@ -270,6 +289,16 @@ void FixSMD::smd_tether() ftotal[0] -= fx*massfrac; ftotal[1] -= fy*massfrac; ftotal[2] -= fz*massfrac; + if (evflag) { + domain->unmap(x[i],image[i],unwrap); + v[0] = fx*massfrac*unwrap[0]; + v[1] = fy*massfrac*unwrap[1]; + v[2] = fz*massfrac*unwrap[2]; + v[3] = fx*massfrac*unwrap[1]; + v[4] = fx*massfrac*unwrap[2]; + v[5] = fy*massfrac*unwrap[2]; + v_tally(i, v); + } } } } diff --git a/src/USER-MISC/fix_srp.cpp b/src/USER-MISC/fix_srp.cpp index f3dec42a83..aeaf2f78ba 100644 --- a/src/USER-MISC/fix_srp.cpp +++ b/src/USER-MISC/fix_srp.cpp @@ -98,7 +98,7 @@ int FixSRP::setmask() void FixSRP::init() { - if (force->pair_match("hybrid",1) == NULL) + if (force->pair_match("hybrid",1) == NULL && force->pair_match("hybrid/overlay",1) == NULL) error->all(FLERR,"Cannot use pair srp without pair_style hybrid"); int has_rigid = 0; @@ -304,7 +304,7 @@ void FixSRP::setup_pre_force(int zz) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); neighbor->ncalls = 0; // new atom counts diff --git a/src/USER-MISC/fix_ttm_mod.cpp b/src/USER-MISC/fix_ttm_mod.cpp index 4bf90fdca3..d2fc6ac901 100644 --- a/src/USER-MISC/fix_ttm_mod.cpp +++ b/src/USER-MISC/fix_ttm_mod.cpp @@ -628,99 +628,99 @@ void FixTTMMod::end_of_step() T_electron[ixnode][iynode][iznode] = T_electron_first[ixnode][iynode][iznode]; - stability_criterion = 1.0 - - 2.0*inner_dt/el_specific_heat * + stability_criterion = 1.0 - + 2.0*inner_dt/el_specific_heat * + (el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + if (stability_criterion < 0.0) { + inner_dt = 0.25*el_specific_heat / (el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); - if (stability_criterion < 0.0) { - inner_dt = 0.25*el_specific_heat / - (el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); - } - num_inner_timesteps = static_cast(update->dt/inner_dt) + 1; - inner_dt = update->dt/double(num_inner_timesteps); - if (num_inner_timesteps > 1000000) - error->warning(FLERR,"Too many inner timesteps in fix ttm/mod",0); - for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; - ith_inner_timestep++) { - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - T_electron_old[ixnode][iynode][iznode] = - T_electron[ixnode][iynode][iznode]; - // compute new electron T profile - duration = duration + inner_dt; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) { - int right_xnode = ixnode + 1; - int right_ynode = iynode + 1; - int right_znode = iznode + 1; - if (right_xnode == nxnodes) right_xnode = 0; - if (right_ynode == nynodes) right_ynode = 0; - if (right_znode == nznodes) right_znode = 0; - int left_xnode = ixnode - 1; - int left_ynode = iynode - 1; - int left_znode = iznode - 1; - if (left_xnode == -1) left_xnode = nxnodes - 1; - if (left_ynode == -1) left_ynode = nynodes - 1; - if (left_znode == -1) left_znode = nznodes - 1; - double skin_layer_d = double(skin_layer); - double ixnode_d = double(ixnode); - double surface_d = double(t_surface_l); - mult_factor = 0.0; - if (duration < width){ - if (ixnode >= t_surface_l) mult_factor = (intensity/(dx*skin_layer_d))*exp((-1.0)*(ixnode_d - surface_d)/skin_layer_d); - } - if (ixnode < t_surface_l) net_energy_transfer_all[ixnode][iynode][iznode] = 0.0; - double cr_vac = 1; - if (T_electron_old[ixnode][iynode][iznode] == 0) cr_vac = 0; - double cr_v_l_x = 1; - if (T_electron_old[left_xnode][iynode][iznode] == 0) cr_v_l_x = 0; - double cr_v_r_x = 1; - if (T_electron_old[right_xnode][iynode][iznode] == 0) cr_v_r_x = 0; - double cr_v_l_y = 1; - if (T_electron_old[ixnode][left_ynode][iznode] == 0) cr_v_l_y = 0; - double cr_v_r_y = 1; - if (T_electron_old[ixnode][right_ynode][iznode] == 0) cr_v_r_y = 0; - double cr_v_l_z = 1; - if (T_electron_old[ixnode][iynode][left_znode] == 0) cr_v_l_z = 0; - double cr_v_r_z = 1; - if (T_electron_old[ixnode][iynode][right_znode] == 0) cr_v_r_z = 0; - if (cr_vac != 0) { - T_electron[ixnode][iynode][iznode] = - T_electron_old[ixnode][iynode][iznode] + - inner_dt/el_properties(T_electron_old[ixnode][iynode][iznode]).el_heat_capacity * - ((cr_v_r_x*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[right_xnode][iynode][iznode]/2.0).el_thermal_conductivity* - (T_electron_old[right_xnode][iynode][iznode]-T_electron_old[ixnode][iynode][iznode])/dx - - cr_v_l_x*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[left_xnode][iynode][iznode]/2.0).el_thermal_conductivity* - (T_electron_old[ixnode][iynode][iznode]-T_electron_old[left_xnode][iynode][iznode])/dx)/dx + - (cr_v_r_y*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][right_ynode][iznode]/2.0).el_thermal_conductivity* - (T_electron_old[ixnode][right_ynode][iznode]-T_electron_old[ixnode][iynode][iznode])/dy - - cr_v_l_y*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][left_ynode][iznode]/2.0).el_thermal_conductivity* - (T_electron_old[ixnode][iynode][iznode]-T_electron_old[ixnode][left_ynode][iznode])/dy)/dy + - (cr_v_r_z*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][iynode][right_znode]/2.0).el_thermal_conductivity* - (T_electron_old[ixnode][iynode][right_znode]-T_electron_old[ixnode][iynode][iznode])/dz - - cr_v_l_z*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][iynode][left_znode]/2.0).el_thermal_conductivity* - (T_electron_old[ixnode][iynode][iznode]-T_electron_old[ixnode][iynode][left_znode])/dz)/dz); - T_electron[ixnode][iynode][iznode]+=inner_dt/el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity* - (mult_factor - - net_energy_transfer_all[ixnode][iynode][iznode]/del_vol); - } - else T_electron[ixnode][iynode][iznode] = - T_electron_old[ixnode][iynode][iznode]; - if ((T_electron[ixnode][iynode][iznode] > 0.0) && (T_electron[ixnode][iynode][iznode] < electron_temperature_min)) - T_electron[ixnode][iynode][iznode] = T_electron[ixnode][iynode][iznode] + 0.5*(electron_temperature_min - T_electron[ixnode][iynode][iznode]); - - if (el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity > el_thermal_conductivity) - el_thermal_conductivity = el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity; - if ((T_electron[ixnode][iynode][iznode] > 0.0) && (el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity < el_specific_heat)) - el_specific_heat = el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity; + } + num_inner_timesteps = static_cast(update->dt/inner_dt) + 1; + inner_dt = update->dt/double(num_inner_timesteps); + if (num_inner_timesteps > 1000000) + error->warning(FLERR,"Too many inner timesteps in fix ttm/mod",0); + for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; + ith_inner_timestep++) { + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + T_electron_old[ixnode][iynode][iznode] = + T_electron[ixnode][iynode][iznode]; + // compute new electron T profile + duration = duration + inner_dt; + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) { + int right_xnode = ixnode + 1; + int right_ynode = iynode + 1; + int right_znode = iznode + 1; + if (right_xnode == nxnodes) right_xnode = 0; + if (right_ynode == nynodes) right_ynode = 0; + if (right_znode == nznodes) right_znode = 0; + int left_xnode = ixnode - 1; + int left_ynode = iynode - 1; + int left_znode = iznode - 1; + if (left_xnode == -1) left_xnode = nxnodes - 1; + if (left_ynode == -1) left_ynode = nynodes - 1; + if (left_znode == -1) left_znode = nznodes - 1; + double skin_layer_d = double(skin_layer); + double ixnode_d = double(ixnode); + double surface_d = double(t_surface_l); + mult_factor = 0.0; + if (duration < width){ + if (ixnode >= t_surface_l) mult_factor = (intensity/(dx*skin_layer_d))*exp((-1.0)*(ixnode_d - surface_d)/skin_layer_d); } - } - stability_criterion = 1.0 - - 2.0*inner_dt/el_specific_heat * - (el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + if (ixnode < t_surface_l) net_energy_transfer_all[ixnode][iynode][iznode] = 0.0; + double cr_vac = 1; + if (T_electron_old[ixnode][iynode][iznode] == 0) cr_vac = 0; + double cr_v_l_x = 1; + if (T_electron_old[left_xnode][iynode][iznode] == 0) cr_v_l_x = 0; + double cr_v_r_x = 1; + if (T_electron_old[right_xnode][iynode][iznode] == 0) cr_v_r_x = 0; + double cr_v_l_y = 1; + if (T_electron_old[ixnode][left_ynode][iznode] == 0) cr_v_l_y = 0; + double cr_v_r_y = 1; + if (T_electron_old[ixnode][right_ynode][iznode] == 0) cr_v_r_y = 0; + double cr_v_l_z = 1; + if (T_electron_old[ixnode][iynode][left_znode] == 0) cr_v_l_z = 0; + double cr_v_r_z = 1; + if (T_electron_old[ixnode][iynode][right_znode] == 0) cr_v_r_z = 0; + if (cr_vac != 0) { + T_electron[ixnode][iynode][iznode] = + T_electron_old[ixnode][iynode][iznode] + + inner_dt/el_properties(T_electron_old[ixnode][iynode][iznode]).el_heat_capacity * + ((cr_v_r_x*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[right_xnode][iynode][iznode]/2.0).el_thermal_conductivity* + (T_electron_old[right_xnode][iynode][iznode]-T_electron_old[ixnode][iynode][iznode])/dx - + cr_v_l_x*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[left_xnode][iynode][iznode]/2.0).el_thermal_conductivity* + (T_electron_old[ixnode][iynode][iznode]-T_electron_old[left_xnode][iynode][iznode])/dx)/dx + + (cr_v_r_y*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][right_ynode][iznode]/2.0).el_thermal_conductivity* + (T_electron_old[ixnode][right_ynode][iznode]-T_electron_old[ixnode][iynode][iznode])/dy - + cr_v_l_y*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][left_ynode][iznode]/2.0).el_thermal_conductivity* + (T_electron_old[ixnode][iynode][iznode]-T_electron_old[ixnode][left_ynode][iznode])/dy)/dy + + (cr_v_r_z*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][iynode][right_znode]/2.0).el_thermal_conductivity* + (T_electron_old[ixnode][iynode][right_znode]-T_electron_old[ixnode][iynode][iznode])/dz - + cr_v_l_z*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][iynode][left_znode]/2.0).el_thermal_conductivity* + (T_electron_old[ixnode][iynode][iznode]-T_electron_old[ixnode][iynode][left_znode])/dz)/dz); + T_electron[ixnode][iynode][iznode]+=inner_dt/el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity* + (mult_factor - + net_energy_transfer_all[ixnode][iynode][iznode]/del_vol); + } + else T_electron[ixnode][iynode][iznode] = + T_electron_old[ixnode][iynode][iznode]; + if ((T_electron[ixnode][iynode][iznode] > 0.0) && (T_electron[ixnode][iynode][iznode] < electron_temperature_min)) + T_electron[ixnode][iynode][iznode] = T_electron[ixnode][iynode][iznode] + 0.5*(electron_temperature_min - T_electron[ixnode][iynode][iznode]); - } while (stability_criterion < 0.0); + if (el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity > el_thermal_conductivity) + el_thermal_conductivity = el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity; + if ((T_electron[ixnode][iynode][iznode] > 0.0) && (el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity < el_specific_heat)) + el_specific_heat = el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity; + } + } + stability_criterion = 1.0 - + 2.0*inner_dt/el_specific_heat * + (el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + + } while (stability_criterion < 0.0); // output nodal temperatures for current timestep if ((nfileevery) && !(update->ntimestep % nfileevery)) { // compute atomic Ta for each grid point diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/USER-MISC/pair_edip_multi.cpp index d52b2e4a47..3345549ae3 100644 --- a/src/USER-MISC/pair_edip_multi.cpp +++ b/src/USER-MISC/pair_edip_multi.cpp @@ -364,7 +364,7 @@ void PairEDIPMulti::edip_fc(double r, Param *param, double &f, double &fdr) double c = param->cutoffC; double alpha = param->alpha; double x; - double v1, v2, v3; + double v1, v2; if(r < c + 1E-6) { diff --git a/src/USER-MISC/pair_extep.cpp b/src/USER-MISC/pair_extep.cpp new file mode 100644 index 0000000000..cf859a28f8 --- /dev/null +++ b/src/USER-MISC/pair_extep.cpp @@ -0,0 +1,1189 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Jan Los +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_extep.h" +#include "atom.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "my_page.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define MAXLINE 1024 +#define DELTA 4 +#define PGDELTA 1 + +/* ---------------------------------------------------------------------- */ + +PairExTeP::PairExTeP(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + ghostneigh = 1; + + nelements = 0; + elements = NULL; + nparams = maxparam = 0; + params = NULL; + elem2param = NULL; + + maxlocal = 0; + SR_numneigh = NULL; + SR_firstneigh = NULL; + ipage = NULL; + pgsize = oneatom = 0; + map = NULL; + + Nt = NULL; + Nd = NULL; +} + +/* ---------------------------------------------------------------------- + check if allocated, since class can be destructed when incomplete +------------------------------------------------------------------------- */ + +PairExTeP::~PairExTeP() +{ + if (elements) + for (int i = 0; i < nelements; i++) delete [] elements[i]; + delete [] elements; + memory->destroy(params); + memory->destroy(elem2param); + + memory->destroy(SR_numneigh); + memory->sfree(SR_firstneigh); + delete [] ipage; + memory->destroy(Nt); + memory->destroy(Nd); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(cutghost); + delete [] map; + } +} + +/* ---------------------------------------------------------------------- + create SR neighbor list from main neighbor list + SR neighbor list stores neighbors of ghost atoms +------------------------------------------------------------------------- */ + +void PairExTeP::SR_neigh() +{ + int i,j,ii,jj,n,allnum,jnum,itype,jtype,iparam_ij; + double xtmp,ytmp,ztmp,delx,dely,delz,rsq; + int *ilist,*jlist,*numneigh,**firstneigh; + int *neighptr; + + double **x = atom->x; + int *type = atom->type; + + if (atom->nmax > maxlocal) { // ensure there is enough space + maxlocal = atom->nmax; // for atoms and ghosts allocated + memory->destroy(SR_numneigh); + memory->sfree(SR_firstneigh); + memory->destroy(Nt); + memory->destroy(Nd); + memory->create(SR_numneigh,maxlocal,"ExTeP:numneigh"); + SR_firstneigh = (int **) memory->smalloc(maxlocal*sizeof(int *), + "ExTeP:firstneigh"); + memory->create(Nt,maxlocal,"ExTeP:Nt"); + memory->create(Nd,maxlocal,"ExTeP:Nd"); + } + + allnum = list->inum + list->gnum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // store all SR neighs of owned and ghost atoms + // scan full neighbor list of I + + ipage->reset(); + + for (ii = 0; ii < allnum; ii++) { + i = ilist[ii]; + itype=map[type[i]]; + + n = 0; + neighptr = ipage->vget(); + + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + Nt[i] = 0.0; + Nd[i] = 0.0; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + jtype=map[type[j]]; + iparam_ij = elem2param[itype][jtype][jtype]; + + if (rsq < params[iparam_ij].cutsq) { + neighptr[n++] = j; + double tmp_fc = ters_fc(sqrt(rsq),¶ms[iparam_ij]); + Nt[i] += tmp_fc; + if (itype!=jtype) { + Nd[i] += tmp_fc; + } + } + } + //printf("SR_neigh : N[%d] = %f\n",i,N[i]); + + ipage->vgot(n); + if (ipage->status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + } +} + + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::compute(int eflag, int vflag) +{ + int i,j,k,ii,jj,kk,inum,jnum; + int itype,jtype,ktype,iparam_ij,iparam_ijk; + tagint itag,jtag; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rsq1,rsq2,r2; + double delr1[3],delr2[3],fi[3],fj[3],fk[3]; + double zeta_ij,prefactor; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = vflag_atom = 0; + + SR_neigh(); + + double **x = atom->x; + double **f = atom->f; + tagint *tag = atom->tag; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over full neighbor list of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itag = tag[i]; + itype = map[type[i]]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // two-body interactions, skip half of them + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtag = tag[j]; + + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (x[j][2] < x[i][2]) continue; + if (x[j][2] == ztmp && x[j][1] < ytmp) continue; + if (x[j][2] == ztmp && x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + + jtype = map[type[j]]; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + iparam_ij = elem2param[itype][jtype][jtype]; + if (rsq > params[iparam_ij].cutsq) continue; + + repulsive(¶ms[iparam_ij],rsq,fpair,eflag,evdwl); + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + + // three-body interactions -(bij + Fcorrection) * fA + // skip immediately if I-J is not within cutoff + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtag = tag[j]; + jtype = map[type[j]]; + iparam_ij = elem2param[itype][jtype][jtype]; + + delr1[0] = x[j][0] - xtmp; + delr1[1] = x[j][1] - ytmp; + delr1[2] = x[j][2] - ztmp; + rsq1 = delr1[0]*delr1[0] + delr1[1]*delr1[1] + delr1[2]*delr1[2]; + if (rsq1 > params[iparam_ij].cutsq) continue; + + // accumulate bondorder zeta for each i-j interaction via loop over k + + zeta_ij = 0.0; + + /* F_IJ (1) */ + // compute correction to energy and forces + // dE/dr = -Fij(Zi,Zj) dV/dr + // - dFij/dZi dZi/dr V + // (conjugate term is computed when j is a central atom) + + double FXY, dFXY_dNdij, dFXY_dNdji, fa, fa_d, deng, fpair; + double Ntij = Nt[i]; + double Ndij = Nd[i]; + double Ntji = Nt[j]; + double Ndji = Nd[j]; + double r = sqrt(rsq1); + double fc_ij = ters_fc(r,¶ms[iparam_ij]); + + Ntij -= fc_ij; + Ntji -= fc_ij; + if (jtype!=itype) { + Ndij -= fc_ij; + Ndji -= fc_ij; + } + if (Ntij<0) { Ntij=0.; } + if (Ndij<0) { Ndij=0.; } + if (Ntji<0) { Ntji=0.; } + if (Ndji<0) { Ndji=0.; } + FXY = F_corr(itype, jtype, Ndij, Ndji, &dFXY_dNdij, &dFXY_dNdji); + + // envelop functions + double fenv, dfenv_ij; + fenv = envelop_function(Ntij, Ntji, &dfenv_ij); + // + double Fc = fenv * FXY; + double dFc_dNtij = dfenv_ij * FXY; + double dFc_dNdij = fenv * dFXY_dNdij; + + fa = ters_fa(r,¶ms[iparam_ij]); + fa_d = ters_fa_d(r,¶ms[iparam_ij]); + deng = 0.5 * fa * Fc; + fpair = 0.5 * fa_d * Fc / r; + + f[i][0] += delr1[0]*fpair; + f[i][1] += delr1[1]*fpair; + f[i][2] += delr1[2]*fpair; + f[j][0] -= delr1[0]*fpair; + f[j][1] -= delr1[1]*fpair; + f[j][2] -= delr1[2]*fpair; + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + deng,0.0,-fpair,-delr1[0],-delr1[1],-delr1[2]); + /* END F_IJ (1) */ + + for (kk = 0; kk < jnum; kk++) { + if (jj == kk) continue; + k = jlist[kk]; + k &= NEIGHMASK; + ktype = map[type[k]]; + iparam_ijk = elem2param[itype][jtype][ktype]; + + delr2[0] = x[k][0] - xtmp; + delr2[1] = x[k][1] - ytmp; + delr2[2] = x[k][2] - ztmp; + rsq2 = delr2[0]*delr2[0] + delr2[1]*delr2[1] + delr2[2]*delr2[2]; + if (rsq2 > params[iparam_ijk].cutsq) continue; + + r2 = sqrt(rsq2); + + zeta_ij += zeta(¶ms[iparam_ijk],r,r2,delr1,delr2); + + /* F_IJ (2) */ + // compute force components due to spline derivatives + // uses only the part with FXY_x (FXY_y is done when i and j are inversed) + int iparam_ik = elem2param[itype][ktype][0]; + double fc_ik_d = ters_fc_d(r2,¶ms[iparam_ik]); + double fc_prefac_ik_0 = 1.0 * fc_ik_d * fa / r2; + double fc_prefac_ik = dFc_dNtij * fc_prefac_ik_0; + f[i][0] += fc_prefac_ik * delr2[0]; + f[i][1] += fc_prefac_ik * delr2[1]; + f[i][2] += fc_prefac_ik * delr2[2]; + f[k][0] -= fc_prefac_ik * delr2[0]; + f[k][1] -= fc_prefac_ik * delr2[1]; + f[k][2] -= fc_prefac_ik * delr2[2]; + if ( itype != ktype ) { + fc_prefac_ik = dFc_dNdij * fc_prefac_ik_0; + f[i][0] += fc_prefac_ik * delr2[0]; + f[i][1] += fc_prefac_ik * delr2[1]; + f[i][2] += fc_prefac_ik * delr2[2]; + f[k][0] -= fc_prefac_ik * delr2[0]; + f[k][1] -= fc_prefac_ik * delr2[1]; + f[k][2] -= fc_prefac_ik * delr2[2]; + } + /* END F_IJ (2) */ + + } + + // pairwise force due to zeta + + force_zeta(¶ms[iparam_ij],r,zeta_ij,fpair,prefactor,eflag,evdwl); + + f[i][0] += delr1[0]*fpair; + f[i][1] += delr1[1]*fpair; + f[i][2] += delr1[2]*fpair; + f[j][0] -= delr1[0]*fpair; + f[j][1] -= delr1[1]*fpair; + f[j][2] -= delr1[2]*fpair; + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,-fpair,-delr1[0],-delr1[1],-delr1[2]); + + // attractive term via loop over k + + for (kk = 0; kk < jnum; kk++) { + if (jj == kk) continue; + k = jlist[kk]; + k &= NEIGHMASK; + ktype = map[type[k]]; + iparam_ijk = elem2param[itype][jtype][ktype]; + + delr2[0] = x[k][0] - xtmp; + delr2[1] = x[k][1] - ytmp; + delr2[2] = x[k][2] - ztmp; + rsq2 = delr2[0]*delr2[0] + delr2[1]*delr2[1] + delr2[2]*delr2[2]; + if (rsq2 > params[iparam_ijk].cutsq) continue; + + attractive(¶ms[iparam_ijk],prefactor, + rsq1,rsq2,delr1,delr2,fi,fj,fk); + + + f[i][0] += fi[0]; + f[i][1] += fi[1]; + f[i][2] += fi[2]; + f[j][0] += fj[0]; + f[j][1] += fj[1]; + f[j][2] += fj[2]; + f[k][0] += fk[0]; + f[k][1] += fk[1]; + f[k][2] += fk[2]; + + if (vflag_atom) v_tally3(i,j,k,fj,fk,delr1,delr2); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cutghost,n+1,n+1,"pair:cutghost"); + + map = new int[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairExTeP::settings(int narg, char **arg) +{ + if (narg != 0) error->all(FLERR,"Illegal pair_style command"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairExTeP::coeff(int narg, char **arg) +{ + int i,j,n; + + if (!allocated) allocate(); + + if (narg != 3 + atom->ntypes) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // insure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // read args that map atom types to elements in potential file + // map[i] = which element the Ith atom type is, -1 if NULL + // nelements = # of unique elements + // elements = list of element names + + if (elements) { + for (i = 0; i < nelements; i++) delete [] elements[i]; + delete [] elements; + } + elements = new char*[atom->ntypes]; + for (i = 0; i < atom->ntypes; i++) elements[i] = NULL; + + nelements = 0; + for (i = 3; i < narg; i++) { + if (strcmp(arg[i],"NULL") == 0) { + map[i-2] = -1; + continue; + } + for (j = 0; j < nelements; j++) + if (strcmp(arg[i],elements[j]) == 0) break; + map[i-2] = j; + if (j == nelements) { + n = strlen(arg[i]) + 1; + elements[j] = new char[n]; + strcpy(elements[j],arg[i]); + nelements++; + } + } + + // read potential file and initialize potential parameters + + read_file(arg[2]); + spline_init(); + setup(); + + // clear setflag since coeff() called once with I,J = * * + + n = atom->ntypes; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + // set setflag i,j for type pairs where both are mapped to elements + + int count = 0; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairExTeP::init_style() +{ + if (atom->tag_enable == 0) + error->all(FLERR,"Pair style ExTeP requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR,"Pair style ExTeP requires newton pair on"); + + // need a full neighbor list + + int irequest = neighbor->request(this); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // including neighbors of ghosts + neighbor->requests[irequest]->ghost = 1; + + // create pages if first time or if neighbor pgsize/oneatom has changed + + int create = 0; + if (ipage == NULL) create = 1; + if (pgsize != neighbor->pgsize) create = 1; + if (oneatom != neighbor->oneatom) create = 1; + + if (create) { + delete [] ipage; + pgsize = neighbor->pgsize; + oneatom = neighbor->oneatom; + + int nmypage= comm->nthreads; + ipage = new MyPage[nmypage]; + for (int i = 0; i < nmypage; i++) + ipage[i].init(oneatom,pgsize,PGDELTA); + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairExTeP::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cutghost[i][j] = cutmax ; + cutghost[j][i] = cutghost[i][j]; + + return cutmax; +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::read_file(char *file) +{ + int params_per_line = 17; + char **words = new char*[params_per_line+1]; + + memory->sfree(params); + params = NULL; + nparams = maxparam = 0; + + // open file on proc 0 + + FILE *fp; + if (comm->me == 0) { + fp = force->open_potential(file); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open ExTeP potential file %s",file); + error->one(FLERR,str); + } + } + + // read each line out of file, skipping blank lines or leading '#' + // store line of params if all 3 element tags are in element list + + int n,nwords,ielement,jelement,kelement; + char line[MAXLINE],*ptr; + int eof = 0; + + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + // concatenate additional lines until have params_per_line words + + while (nwords < params_per_line) { + n = strlen(line); + if (comm->me == 0) { + ptr = fgets(&line[n],MAXLINE-n,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + } + + if (nwords != params_per_line) + error->all(FLERR,"Insufficient spline parameters in potential file"); + + // words = ptrs to all words in line + + nwords = 0; + words[nwords++] = strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + // ielement,jelement,kelement = 1st args + // if all 3 args are in element list, then parse this line + // else skip to next line + + for (ielement = 0; ielement < nelements; ielement++) + if (strcmp(words[0],elements[ielement]) == 0) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (strcmp(words[1],elements[jelement]) == 0) break; + if (jelement == nelements) continue; + for (kelement = 0; kelement < nelements; kelement++) + if (strcmp(words[2],elements[kelement]) == 0) break; + if (kelement == nelements) continue; + + // load up parameter settings and error check their values + + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), + "pair:params"); + } + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].kelement = kelement; + params[nparams].powerm = atof(words[3]); + params[nparams].gamma = atof(words[4]); + params[nparams].lam3 = atof(words[5]); + params[nparams].c = atof(words[6]); + params[nparams].d = atof(words[7]); + params[nparams].h = atof(words[8]); + params[nparams].powern = atof(words[9]); + params[nparams].beta = atof(words[10]); + params[nparams].lam2 = atof(words[11]); + params[nparams].bigb = atof(words[12]); + params[nparams].bigr = atof(words[13]); + params[nparams].bigd = atof(words[14]); + params[nparams].lam1 = atof(words[15]); + params[nparams].biga = atof(words[16]); + + // currently only allow m exponent of 1 or 3 + + params[nparams].powermint = int(params[nparams].powerm); + + if (params[nparams].c < 0.0 || params[nparams].d < 0.0 || + params[nparams].powern < 0.0 || params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 ||params[nparams].bigd < 0.0 || + params[nparams].bigd > params[nparams].bigr || + params[nparams].lam1 < 0.0 || params[nparams].biga < 0.0 || + params[nparams].powerm - params[nparams].powermint != 0.0 || + (params[nparams].powermint != 3 && params[nparams].powermint != 1) || + params[nparams].gamma < 0.0) + error->all(FLERR,"Illegal ExTeP parameter"); + + nparams++; + if (nparams >= pow(atom->ntypes,3)) break; + } + + // deallocate words array + delete [] words; + + /* F_IJ (3) */ + // read the spline coefficients + params_per_line = 8; + // reallocate with new size + words = new char*[params_per_line+1]; + + // intialize F_corr_data to all zeros + for (int iel=0;ielntypes;iel++) + for (int jel=0;jelntypes;jel++) + for (int in=0;in<4;in++) + for (int jn=0;jn<4;jn++) + for (int ivar=0;ivar<3;ivar++) + F_corr_data[iel][jel][in][jn][ivar]=0; + + // loop until EOF + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fp); + //fputs(line,stdout); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + if (nwords != params_per_line) + error->all(FLERR,"Incorrect format in ExTeP potential file"); + + // words = ptrs to all words in line + + nwords = 0; + words[nwords++] = strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + // ielement,jelement = 1st args + // if all 3 args are in element list, then parse this line + // else skip to next line + // these lines set ielement and jelement to the + // integers matching the strings from the input + + for (ielement = 0; ielement < nelements; ielement++) + if (strcmp(words[0],elements[ielement]) == 0) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (strcmp(words[1],elements[jelement]) == 0) break; + if (jelement == nelements) continue; + + int Ni = atoi(words[2]); + int Nj = atoi(words[3]); + double spline_val = atof(words[4]); + double spline_derx = atof(words[5]); + double spline_dery = atof(words[6]); + + // Set value for all pairs of ielement,jelement (any kelement) + for (int iparam = 0; iparam < nparams; iparam++) { + if ( ielement == params[iparam].ielement + && jelement == params[iparam].jelement) { + F_corr_data[ielement][jelement][Ni][Nj][0] = spline_val; + F_corr_data[ielement][jelement][Ni][Nj][1] = spline_derx; + F_corr_data[ielement][jelement][Ni][Nj][2] = spline_dery; + + F_corr_data[jelement][ielement][Nj][Ni][0] = spline_val; + F_corr_data[jelement][ielement][Nj][Ni][1] = spline_dery; + F_corr_data[jelement][ielement][Nj][Ni][2] = spline_derx; + } + } + } + + delete [] words; + /* END F_IJ (3) */ + +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::setup() +{ + int i,j,k,m,n; + + // set elem2param for all element triplet combinations + // must be a single exact match to lines read from file + // do not allow for ACB in place of ABC + + memory->destroy(elem2param); + memory->create(elem2param,nelements,nelements,nelements,"pair:elem2param"); + + for (i = 0; i < nelements; i++) + for (j = 0; j < nelements; j++) + for (k = 0; k < nelements; k++) { + n = -1; + for (m = 0; m < nparams; m++) { + if (i == params[m].ielement && j == params[m].jelement && + k == params[m].kelement) { + if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + n = m; + } + } + if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + elem2param[i][j][k] = n; + } + + // compute parameter values derived from inputs + + for (m = 0; m < nparams; m++) { + params[m].cut = params[m].bigr + params[m].bigd; + params[m].cutsq = params[m].cut*params[m].cut; + + params[m].c1 = pow(2.0*params[m].powern*1.0e-16,-1.0/params[m].powern); + params[m].c2 = pow(2.0*params[m].powern*1.0e-8,-1.0/params[m].powern); + params[m].c3 = 1.0/params[m].c2; + params[m].c4 = 1.0/params[m].c1; + } + + // set cutmax to max of all params + + cutmax = 0.0; + for (m = 0; m < nparams; m++) + if (params[m].cut > cutmax) cutmax = params[m].cut; +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::repulsive(Param *param, double rsq, double &fforce, + int eflag, double &eng) +{ + double r,tmp_fc,tmp_fc_d,tmp_exp; + + r = sqrt(rsq); + tmp_fc = ters_fc(r,param); + tmp_fc_d = ters_fc_d(r,param); + tmp_exp = exp(-param->lam1 * r); + fforce = -param->biga * tmp_exp * (tmp_fc_d - tmp_fc*param->lam1) / r; + if (eflag) eng = tmp_fc * param->biga * tmp_exp; +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::zeta(Param *param, double rij, double rik, + double *delrij, double *delrik) +{ + double costheta,arg,ex_delr; + + costheta = (delrij[0]*delrik[0] + delrij[1]*delrik[1] + + delrij[2]*delrik[2]) / (rij*rik); + + if (param->powermint == 3) arg = pow(param->lam3 * (rij-rik),3.0); + else arg = param->lam3 * (rij-rik); + + if (arg > 69.0776) ex_delr = 1.e30; + else if (arg < -69.0776) ex_delr = 0.0; + else ex_delr = exp(arg); + + return ters_fc(rik,param) * ters_gijk(costheta,param) * ex_delr; +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::force_zeta(Param *param, double r, double zeta_ij, + double &fforce, double &prefactor, + int eflag, double &eng) +{ + double fa,fa_d,bij; + + fa = ters_fa(r,param); + fa_d = ters_fa_d(r,param); + bij = ters_bij(zeta_ij,param); + fforce = 0.5*bij*fa_d / r; + prefactor = -0.5*fa * ( ters_bij_d(zeta_ij,param) ); + if (eflag) eng = 0.5*bij*fa; +} + +/* ---------------------------------------------------------------------- + attractive term + use param_ij cutoff for rij test + use param_ijk cutoff for rik test +------------------------------------------------------------------------- */ + +void PairExTeP::attractive(Param *param, double prefactor, + double rsqij, double rsqik, + double *delrij, double *delrik, + double *fi, double *fj, double *fk) +{ + double rij_hat[3],rik_hat[3]; + double rij,rijinv,rik,rikinv; + + rij = sqrt(rsqij); + rijinv = 1.0/rij; + vec3_scale(rijinv,delrij,rij_hat); + + rik = sqrt(rsqik); + rikinv = 1.0/rik; + vec3_scale(rikinv,delrik,rik_hat); + + ters_zetaterm_d(prefactor,rij_hat,rij,rik_hat,rik,fi,fj,fk,param); +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::ters_fc(double r, Param *param) +{ + double ters_R = param->bigr; + double ters_D = param->bigd; + + if (r < ters_R-ters_D) return 1.0; + if (r > ters_R+ters_D) return 0.0; + return 0.5*(1.0 - sin(MY_PI2*(r - ters_R)/ters_D)); +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::ters_fc_d(double r, Param *param) +{ + double ters_R = param->bigr; + double ters_D = param->bigd; + + if (r < ters_R-ters_D) return 0.0; + if (r > ters_R+ters_D) return 0.0; + return -(MY_PI4/ters_D) * cos(MY_PI2*(r - ters_R)/ters_D); +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::ters_fa(double r, Param *param) +{ + if (r > param->bigr + param->bigd) return 0.0; + return -param->bigb * exp(-param->lam2 * r) * ters_fc(r,param); +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::ters_fa_d(double r, Param *param) +{ + if (r > param->bigr + param->bigd) return 0.0; + return param->bigb * exp(-param->lam2 * r) * + (param->lam2 * ters_fc(r,param) - ters_fc_d(r,param)); +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::ters_bij(double zeta, Param *param) +{ + double tmp = param->beta * zeta; + if (tmp > param->c1) return 1.0/sqrt(tmp); + if (tmp > param->c2) + return (1.0 - pow(tmp,-param->powern) / (2.0*param->powern))/sqrt(tmp); + if (tmp < param->c4) return 1.0; + if (tmp < param->c3) + return 1.0 - pow(tmp,param->powern)/(2.0*param->powern); + return pow(1.0 + pow(tmp,param->powern), -1.0/(2.0*param->powern)); +} + +/* ---------------------------------------------------------------------- */ + +double PairExTeP::ters_bij_d(double zeta, Param *param) +{ + double tmp = param->beta * zeta; + if (tmp > param->c1) return param->beta * -0.5*pow(tmp,-1.5); + if (tmp > param->c2) + return param->beta * (-0.5*pow(tmp,-1.5) * + (1.0 - 0.5*(1.0 + 1.0/(2.0*param->powern)) * + pow(tmp,-param->powern))); + if (tmp < param->c4) return 0.0; + if (tmp < param->c3) + return -0.5*param->beta * pow(tmp,param->powern-1.0); + + double tmp_n = pow(tmp,param->powern); + return -0.5 * pow(1.0+tmp_n, -1.0-(1.0/(2.0*param->powern)))*tmp_n / zeta; +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::ters_zetaterm_d(double prefactor, + double *rij_hat, double rij, + double *rik_hat, double rik, + double *dri, double *drj, double *drk, + Param *param) +{ + double gijk,gijk_d,ex_delr,ex_delr_d,fc,dfc,cos_theta,tmp; + double dcosdri[3],dcosdrj[3],dcosdrk[3]; + + fc = ters_fc(rik,param); + dfc = ters_fc_d(rik,param); + if (param->powermint == 3) tmp = pow(param->lam3 * (rij-rik),3.0); + else tmp = param->lam3 * (rij-rik); + + if (tmp > 69.0776) ex_delr = 1.e30; + else if (tmp < -69.0776) ex_delr = 0.0; + else ex_delr = exp(tmp); + + if (param->powermint == 3) + ex_delr_d = 3.0*pow(param->lam3,3.0) * pow(rij-rik,2.0)*ex_delr; + else ex_delr_d = param->lam3 * ex_delr; + + cos_theta = vec3_dot(rij_hat,rik_hat); + gijk = ters_gijk(cos_theta,param); + gijk_d = ters_gijk_d(cos_theta,param); + costheta_d(rij_hat,rij,rik_hat,rik,dcosdri,dcosdrj,dcosdrk); + + // compute the derivative wrt Ri + // dri = -dfc*gijk*ex_delr*rik_hat; + // dri += fc*gijk_d*ex_delr*dcosdri; + // dri += fc*gijk*ex_delr_d*(rik_hat - rij_hat); + + vec3_scale(-dfc*gijk*ex_delr,rik_hat,dri); + vec3_scaleadd(fc*gijk_d*ex_delr,dcosdri,dri,dri); + vec3_scaleadd(fc*gijk*ex_delr_d,rik_hat,dri,dri); + vec3_scaleadd(-fc*gijk*ex_delr_d,rij_hat,dri,dri); + vec3_scale(prefactor,dri,dri); + + // compute the derivative wrt Rj + // drj = fc*gijk_d*ex_delr*dcosdrj; + // drj += fc*gijk*ex_delr_d*rij_hat; + + vec3_scale(fc*gijk_d*ex_delr,dcosdrj,drj); + vec3_scaleadd(fc*gijk*ex_delr_d,rij_hat,drj,drj); + vec3_scale(prefactor,drj,drj); + + // compute the derivative wrt Rk + // drk = dfc*gijk*ex_delr*rik_hat; + // drk += fc*gijk_d*ex_delr*dcosdrk; + // drk += -fc*gijk*ex_delr_d*rik_hat; + + vec3_scale(dfc*gijk*ex_delr,rik_hat,drk); + vec3_scaleadd(fc*gijk_d*ex_delr,dcosdrk,drk,drk); + vec3_scaleadd(-fc*gijk*ex_delr_d,rik_hat,drk,drk); + vec3_scale(prefactor,drk,drk); +} + +/* ---------------------------------------------------------------------- */ + +void PairExTeP::costheta_d(double *rij_hat, double rij, + double *rik_hat, double rik, + double *dri, double *drj, double *drk) +{ + // first element is devative wrt Ri, second wrt Rj, third wrt Rk + + double cos_theta = vec3_dot(rij_hat,rik_hat); + + vec3_scaleadd(-cos_theta,rij_hat,rik_hat,drj); + vec3_scale(1.0/rij,drj,drj); + vec3_scaleadd(-cos_theta,rik_hat,rij_hat,drk); + vec3_scale(1.0/rik,drk,drk); + vec3_add(drj,drk,dri); + vec3_scale(-1.0,dri,dri); +} + + +/* ---------------------------------------------------------------------- */ + +/* F_IJ (4) */ +// initialize spline for F_corr (based on PairLCBOP::F_conj) + +void PairExTeP::spline_init() { + for ( size_t iel=0; ielntypes; iel++) { + for ( size_t jel=0; jelntypes; jel++) { + for ( size_t N_ij=0; N_ij<4; N_ij++ ) { + for ( size_t N_ji=0; N_ji<4; N_ji++ ) { + TF_corr_param &f = F_corr_param[iel][jel][N_ij][N_ji]; + + // corner points for each spline function + f.f_00 = F_corr_data[iel][jel][N_ij ][N_ji ][0]; + f.f_01 = F_corr_data[iel][jel][N_ij ][N_ji+1][0]; + f.f_10 = F_corr_data[iel][jel][N_ij+1][N_ji ][0]; + f.f_11 = F_corr_data[iel][jel][N_ij+1][N_ji+1][0]; + + // compute f tilde according to [Los & Fasolino, PRB 68, 024107 2003] + f.f_x_00 = F_corr_data[iel][jel][N_ij ][N_ji ][1] - f.f_10 + f.f_00; + f.f_x_01 = F_corr_data[iel][jel][N_ij ][N_ji+1][1] - f.f_11 + f.f_01; + f.f_x_10 = -(F_corr_data[iel][jel][N_ij+1][N_ji ][1] - f.f_10 + f.f_00); + f.f_x_11 = -(F_corr_data[iel][jel][N_ij+1][N_ji+1][1] - f.f_11 + f.f_01); + + f.f_y_00 = F_corr_data[iel][jel][N_ij ][N_ji ][2] - f.f_01 + f.f_00; + f.f_y_01 = -(F_corr_data[iel][jel][N_ij ][N_ji+1][2] - f.f_01 + f.f_00); + f.f_y_10 = F_corr_data[iel][jel][N_ij+1][N_ji ][2] - f.f_11 + f.f_10; + f.f_y_11 = -(F_corr_data[iel][jel][N_ij+1][N_ji+1][2] - f.f_11 + f.f_10); + } + } + } + } +} + +double PairExTeP::envelop_function(double x, double y, double *func_der) { + double fx,fy,fxy,dfx,dfxydx; + double del, delsq; + + fxy = 1.0; + dfxydx = 0.0; + + if (x <= 3.0) { + fx = 1.0; + dfx = 0.0; + if (x < 1.0 && y < 1.0) { + double gx=(1.0-x); + double gy=(1.0-y); + double gxsq=gx*gx; + double gysq=gy*gy; + fxy = 1.0 - gxsq*gysq; + dfxydx = 2.0*gx*gysq; + } + } else if (x < 4.0) { + del = 4.0-x; + delsq = del*del; + fx = (3.0-2.0*del)*delsq; + dfx = - 6.0*del*(1.0-del); + } else { + fx = 0.0; + dfx = 0.0; + } + if (y <= 3.0) { + fy = 1.0; + } else if (y < 4.0) { + del = 4.0-y; + delsq = del*del; + fy = (3.0-2.0*del)*delsq; + } else { + fy = 0.0; + } + + double func_val = fxy*fx*fy; + *func_der = dfxydx*fx*fy+fxy*dfx*fy; + + return func_val; +} + +double PairExTeP::F_corr(int iel, int jel, double Ndij, double Ndji, double *dFN_x, double *dFN_y ) { + + // compute F_XY + + size_t Ndij_int = static_cast( floor( Ndij ) ); + size_t Ndji_int = static_cast( floor( Ndji ) ); + double x = Ndij - Ndij_int; + double y = Ndji - Ndji_int; + TF_corr_param &f = F_corr_param[iel][jel][Ndij_int][Ndji_int]; + double F = 0; + double dF_dx = 0, dF_dy = 0; + double l, r; + if (Ndij_int < 4 && Ndji_int < 4) { + l = (1-y)* (1-x); + r = ( f.f_00 + x*x* f.f_x_10 + y*y* f.f_y_01 ); + F += l*r; + dF_dx += -(1-y)*r +l*2*x* f.f_x_10; + dF_dy += -(1-x)*r +l*2*y* f.f_y_01; + l = (1-y)*x; + r = ( f.f_10 + (1-x)*(1-x)*f.f_x_00 + y* y* f.f_y_11 ); + F += l*r; + dF_dx += (1-y)*r -l*2*(1-x)*f.f_x_00; + dF_dy += -x*r +l*2*y* f.f_y_11; + l = y* (1-x); + r = ( f.f_01 + x*x* f.f_x_11 + (1-y)*(1-y)*f.f_y_00 ); + F += l*r; + dF_dx += -y*r +l*2*x* f.f_x_11; + dF_dy += (1-x)*r -l*2*(1-y)*f.f_y_00; + l = y* x; + r = ( f.f_11 + (1-x)*(1-x)*f.f_x_01 + (1-y)*(1-y)*f.f_y_10 ); + F += l*r; + dF_dx += y*r -l*2*(1-x)*f.f_x_01; + dF_dy += x*r -l*2*(1-y)*f.f_y_10; + } + double result = F; + *dFN_x = dF_dx; + *dFN_y = dF_dy; + + return result; +} +/* F_IJ (4) */ diff --git a/src/USER-MISC/pair_extep.h b/src/USER-MISC/pair_extep.h new file mode 100644 index 0000000000..bad433455e --- /dev/null +++ b/src/USER-MISC/pair_extep.h @@ -0,0 +1,225 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(extep,PairExTeP) + +#else + +#ifndef LMP_PAIR_EXTEP_H +#define LMP_PAIR_EXTEP_H + +#include "pair.h" +#include "my_page.h" + +#define MAXTYPES 8 +#define NSPLINE 5 + +namespace LAMMPS_NS { + +class PairExTeP : public Pair { + public: + PairExTeP(class LAMMPS *); + virtual ~PairExTeP(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + void init_style(); + double init_one(int, int); + + protected: + struct Param { + double lam1,lam2,lam3; + double c,d,h; + double gamma,powerm; + double powern,beta; + double biga,bigb,bigd,bigr; + double cut,cutsq; + double c1,c2,c3,c4; + int ielement,jelement,kelement; + int powermint; + double Z_i,Z_j; // added for ExTePZBL + double ZBLcut,ZBLexpscale; + double c5,ca1,ca4; // added for ExTePMOD + double powern_del; + }; + + Param *params; // parameter set for an I-J-K interaction + char **elements; // names of unique elements + int ***elem2param; // mapping from element triplets to parameters + int *map; // mapping from atom types to elements + double cutmax; // max cutoff for all elements + int nelements; // # of unique elements + int nparams; // # of stored parameter sets + int maxparam; // max # of parameter sets + + int maxlocal; // size of numneigh, firstneigh arrays + int maxpage; // # of pages currently allocated + int pgsize; // size of neighbor page + int oneatom; // max # of neighbors for one atom + MyPage *ipage; // neighbor list pages + int *SR_numneigh; // # of pair neighbors for each atom + int **SR_firstneigh; // ptr to 1st neighbor of each atom + + double *Nt, *Nd; // sum of cutoff fns ( f_C ) with SR neighs + + void allocate(); + void spline_init(); + virtual void read_file(char *); + virtual void setup(); + virtual void repulsive(Param *, double, double &, int, double &); + virtual double zeta(Param *, double, double, double *, double *); + virtual void force_zeta(Param *, double, double, double &, + double &, int, double &); + void attractive(Param *, double, double, double, double *, double *, + double *, double *, double *); + + virtual double ters_fc(double, Param *); + virtual double ters_fc_d(double, Param *); + virtual double ters_fa(double, Param *); + virtual double ters_fa_d(double, Param *); + virtual double ters_bij(double, Param *); + virtual double ters_bij_d(double, Param *); + + virtual void ters_zetaterm_d(double, double *, double, double *, double, + double *, double *, double *, Param *); + void costheta_d(double *, double, double *, double, + double *, double *, double *); + + // inlined functions for efficiency + + inline double ters_gijk(const double costheta, + const Param * const param) const { + const double ters_c = param->c * param->c; + const double ters_d = param->d * param->d; + const double hcth = param->h - costheta; + + return param->gamma*(1.0 + ters_c/ters_d - ters_c / (ters_d + hcth*hcth)); + } + + inline double ters_gijk_d(const double costheta, + const Param * const param) const { + const double ters_c = param->c * param->c; + const double ters_d = param->d * param->d; + const double hcth = param->h - costheta; + const double numerator = -2.0 * ters_c * hcth; + const double denominator = 1.0/(ters_d + hcth*hcth); + return param->gamma*numerator*denominator*denominator; + } + + inline double vec3_dot(const double x[3], const double y[3]) const { + return x[0]*y[0] + x[1]*y[1] + x[2]*y[2]; + } + + inline void vec3_add(const double x[3], const double y[3], + double * const z) const { + z[0] = x[0]+y[0]; z[1] = x[1]+y[1]; z[2] = x[2]+y[2]; + } + + inline void vec3_scale(const double k, const double x[3], + double y[3]) const { + y[0] = k*x[0]; y[1] = k*x[1]; y[2] = k*x[2]; + } + + inline void vec3_scaleadd(const double k, const double x[3], + const double y[3], double * const z) const { + z[0] = k*x[0]+y[0]; + z[1] = k*x[1]+y[1]; + z[2] = k*x[2]+y[2]; + } + + // splines parameters + // F[Ni=0-1, 1-2, 2-3, + // Nj=..., + struct TF_corr_param { + double + f_00, + f_01, + f_10, + f_11, + f_x_00, + f_x_01, + f_x_10, + f_x_11, + f_y_00, + f_y_01, + f_y_10, + f_y_11; + } F_corr_param[MAXTYPES][MAXTYPES][NSPLINE][NSPLINE]; + + double F_corr_data[MAXTYPES][MAXTYPES][NSPLINE][NSPLINE][3]; + + double F_corr( int, int, double, double, double*, double* ); + void SR_neigh(); + + double envelop_function(double, double, double*); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair style ExTeP requires atom IDs + +This is a requirement to use the ExTeP potential. + +E: Pair style ExTeP requires newton pair on + +See the newton command. This is a restriction to use the ExTeP +potential. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Cannot open ExTeP potential file %s + +The specified potential file cannot be opened. Check that the path +and name are correct. + +E: Incorrect format in ExTeP potential file + +Incorrect number of words per line in the potential file. + +E: Illegal ExTeP parameter + +One or more of the coefficients defined in the potential file is +invalid. + +E: Potential file has duplicate entry + +The potential file for a SW or ExTeP potential has more than +one entry for the same 3 ordered elements. + +E: Potential file is missing an entry + +The potential file for a SW or ExTeP potential does not have a +needed entry. + +*/ diff --git a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp index c03aee6362..dc1f56a318 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp @@ -43,6 +43,7 @@ using namespace LAMMPS_NS; PairKolmogorovCrespiZ::PairKolmogorovCrespiZ(LAMMPS *lmp) : Pair(lmp) { writedata = 1; + restartinfo = 0; // initialize element to parameter maps nelements = 0; diff --git a/src/USER-MISC/pair_list.cpp b/src/USER-MISC/pair_list.cpp index 458c228d58..6bb71d05c8 100644 --- a/src/USER-MISC/pair_list.cpp +++ b/src/USER-MISC/pair_list.cpp @@ -54,6 +54,7 @@ typedef struct { double x,y,z; } dbl3_t; PairList::PairList(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; respa_enable = 0; cut_global = 0.0; style = NULL; diff --git a/src/USER-MISC/pair_tersoff_table.cpp b/src/USER-MISC/pair_tersoff_table.cpp index 536730322a..1c96b3d002 100644 --- a/src/USER-MISC/pair_tersoff_table.cpp +++ b/src/USER-MISC/pair_tersoff_table.cpp @@ -55,6 +55,7 @@ using namespace LAMMPS_NS; PairTersoffTable::PairTersoffTable(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; @@ -939,8 +940,10 @@ void PairTersoffTable::read_file(char *file) params[nparams].beta = atof(words[10]); params[nparams].lam2 = atof(words[11]); params[nparams].bigb = atof(words[12]); + // current implementation is based on functional form // of tersoff_2 as reported in the reference paper + double bigr = atof(words[13]); double bigd = atof(words[14]); params[nparams].cutoffR = bigr - bigd; @@ -948,15 +951,17 @@ void PairTersoffTable::read_file(char *file) params[nparams].lam1 = atof(words[15]); params[nparams].biga = atof(words[16]); - // currently only allow m exponent of 1 or 3 - params[nparams].powermint = int(params[nparams].powerm); - - if (params[nparams].c < 0.0 || params[nparams].d < 0.0 || - params[nparams].powern < 0.0 || params[nparams].beta < 0.0 || - params[nparams].lam2 < 0.0 || params[nparams].bigb < 0.0 || - params[nparams].cutoffR < 0.0 ||params[nparams].cutoffS < 0.0 || + if (params[nparams].c < 0.0 || + params[nparams].d < 0.0 || + params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || + params[nparams].cutoffR < 0.0 || + params[nparams].cutoffS < 0.0 || params[nparams].cutoffR > params[nparams].cutoffS || - params[nparams].lam1 < 0.0 || params[nparams].biga < 0.0 + params[nparams].lam1 < 0.0 || + params[nparams].biga < 0.0 ) error->all(FLERR,"Illegal Tersoff parameter"); // only tersoff_2 parametrization is implemented diff --git a/src/USER-MISC/temper_grem.cpp b/src/USER-MISC/temper_grem.cpp index 6ce7da8d6a..9e5a4c5c3b 100644 --- a/src/USER-MISC/temper_grem.cpp +++ b/src/USER-MISC/temper_grem.cpp @@ -214,7 +214,7 @@ void TemperGrem::command(int narg, char **arg) if (me_universe == 0 && universe->uscreen) fprintf(universe->uscreen,"Setting up tempering ...\n"); - update->integrate->setup(); + update->integrate->setup(1); if (me_universe == 0) { if (universe->uscreen) { diff --git a/src/USER-MISC/temper_npt.cpp b/src/USER-MISC/temper_npt.cpp new file mode 100644 index 0000000000..60f9313fdd --- /dev/null +++ b/src/USER-MISC/temper_npt.cpp @@ -0,0 +1,380 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing Authors: Amulya K. Pervaje and Cody K. Addington, + (North Carolina State University) + Contact Email: amulyapervaje@gmail.com +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "temper_npt.h" +#include "universe.h" +#include "domain.h" +#include "atom.h" +#include "update.h" +#include "integrate.h" +#include "modify.h" +#include "compute.h" +#include "force.h" +#include "output.h" +#include "thermo.h" +#include "fix.h" +#include "random_park.h" +#include "finish.h" +#include "timer.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define TEMPER_DEBUG 0 + +/* ---------------------------------------------------------------------- */ + +TemperNPT::TemperNPT(LAMMPS *lmp) : Pointers(lmp) {} + +/* ---------------------------------------------------------------------- */ + +TemperNPT::~TemperNPT() +{ + MPI_Comm_free(&roots); + if (ranswap) delete ranswap; + delete ranboltz; + delete [] set_temp; + delete [] temp2world; + delete [] world2temp; + delete [] world2root; +} + +/* ---------------------------------------------------------------------- + perform tempering with inter-world swaps +------------------------------------------------------------------------- */ + +void TemperNPT::command(int narg, char **arg) +{ + if (universe->nworlds == 1) + error->all(FLERR,"Must have more than one processor partition to temper"); + if (domain->box_exist == 0) + error->all(FLERR,"temper/npt command before simulation box is defined"); + if (narg != 7 && narg != 8) + error->universe_all(FLERR,"Illegal temper/npt command"); + + int nsteps = force->inumeric(FLERR,arg[0]); + nevery = force->inumeric(FLERR,arg[1]); + double temp = force->numeric(FLERR,arg[2]); + double press_set = force->numeric(FLERR,arg[6]); + + for (whichfix = 0; whichfix < modify->nfix; whichfix++) + if (strcmp(arg[3],modify->fix[whichfix]->id) == 0) break; + if (whichfix == modify->nfix) + error->universe_all(FLERR,"Tempering fix ID is not defined"); + + seed_swap = force->inumeric(FLERR,arg[4]); + seed_boltz = force->inumeric(FLERR,arg[5]); + + my_set_temp = universe->iworld; + if (narg == 8) my_set_temp = force->inumeric(FLERR,arg[6]); + + // swap frequency must evenly divide total # of timesteps + + if (nevery <= 0) + error->universe_all(FLERR,"Invalid frequency in temper/npt command"); + nswaps = nsteps/nevery; + if (nswaps*nevery != nsteps) + error->universe_all(FLERR,"Non integer # of swaps in temper/npt command"); + + // fix style must be appropriate for temperature and pressure control, + // i.e. it needs to provide a working Fix::reset_target() and must also + // change the volume. This currently only applies to fix npt and + // fix rigid/npt variants + + if ((strncmp(modify->fix[whichfix]->style,"npt",3) != 0) + && (strncmp(modify->fix[whichfix]->style,"rigid/npt",9) != 0)) + error->universe_all(FLERR,"Tempering temperature and pressure fix is not supported"); + + // setup for long tempering run + + update->whichflag = 1; + update->nsteps = nsteps; + update->beginstep = update->firststep = update->ntimestep; + update->endstep = update->laststep = update->firststep + nsteps; + if (update->laststep < 0) + error->all(FLERR,"Too many timesteps"); + + lmp->init(); + + // local storage + + me_universe = universe->me; + MPI_Comm_rank(world,&me); + nworlds = universe->nworlds; + iworld = universe->iworld; + boltz = force->boltz; + nktv2p = force->nktv2p; + + // pe_compute = ptr to thermo_pe compute + // notify compute it will be called at first swap + + int id = modify->find_compute("thermo_pe"); + if (id < 0) error->all(FLERR,"Tempering could not find thermo_pe compute"); + Compute *pe_compute = modify->compute[id]; + pe_compute->addstep(update->ntimestep + nevery); + + // create MPI communicator for root proc from each world + + int color; + if (me == 0) color = 0; + else color = 1; + MPI_Comm_split(universe->uworld,color,0,&roots); + + // RNGs for swaps and Boltzmann test + // warm up Boltzmann RNG + + if (seed_swap) ranswap = new RanPark(lmp,seed_swap); + else ranswap = NULL; + ranboltz = new RanPark(lmp,seed_boltz + me_universe); + for (int i = 0; i < 100; i++) ranboltz->uniform(); + + // world2root[i] = global proc that is root proc of world i + + world2root = new int[nworlds]; + if (me == 0) + MPI_Allgather(&me_universe,1,MPI_INT,world2root,1,MPI_INT,roots); + MPI_Bcast(world2root,nworlds,MPI_INT,0,world); + + // create static list of set temperatures + // allgather tempering arg "temp" across root procs + // bcast from each root to other procs in world + + set_temp = new double[nworlds]; + if (me == 0) MPI_Allgather(&temp,1,MPI_DOUBLE,set_temp,1,MPI_DOUBLE,roots); + MPI_Bcast(set_temp,nworlds,MPI_DOUBLE,0,world); + + // create world2temp only on root procs from my_set_temp + // create temp2world on root procs from world2temp, + // then bcast to all procs within world + + world2temp = new int[nworlds]; + temp2world = new int[nworlds]; + if (me == 0) { + MPI_Allgather(&my_set_temp,1,MPI_INT,world2temp,1,MPI_INT,roots); + for (int i = 0; i < nworlds; i++) temp2world[world2temp[i]] = i; + } + MPI_Bcast(temp2world,nworlds,MPI_INT,0,world); + + // if restarting tempering, reset temp target of Fix to current my_set_temp + + if (narg == 8) { + double new_temp = set_temp[my_set_temp]; + modify->fix[whichfix]->reset_target(new_temp); + } + + // setup tempering runs + + int i,which,partner,swap,partner_set_temp,partner_world; + double pe,pe_partner, delr,boltz_factor,new_temp, press_units; + + if (me_universe == 0 && universe->uscreen) + fprintf(universe->uscreen,"Setting up tempering ...\n"); + + update->integrate->setup(1); + + if (me_universe == 0) { + if (universe->uscreen) { + fprintf(universe->uscreen,"Step"); + for (int i = 0; i < nworlds; i++) + fprintf(universe->uscreen," T%d",i); + fprintf(universe->uscreen,"\n"); + } + if (universe->ulogfile) { + fprintf(universe->ulogfile,"Step"); + for (int i = 0; i < nworlds; i++) + fprintf(universe->ulogfile," T%d",i); + fprintf(universe->ulogfile,"\n"); + } + print_status(); + } + + timer->init(); + timer->barrier_start(); + + for (int iswap = 0; iswap < nswaps; iswap++) { + + // run for nevery timesteps + + update->integrate->run(nevery); + + // compute PE + // notify compute it will be called at next swap + + pe = pe_compute->compute_scalar(); + pe_compute->addstep(update->ntimestep + nevery); + double boxlox=domain->boxlo[0]; + double boxhix=domain->boxhi[0]; + double boxloy=domain->boxlo[1]; + double boxhiy=domain->boxhi[1]; + double boxloz=domain->boxlo[2]; + double boxhiz=domain->boxhi[2]; + double vol = (boxhix - boxlox)*(boxhiy - boxloy)*(boxhiz - boxloz); + double vol_partner = vol; + // which = which of 2 kinds of swaps to do (0,1) + + if (!ranswap) which = iswap % 2; + else if (ranswap->uniform() < 0.5) which = 0; + else which = 1; + + // partner_set_temp = which set temp I am partnering with for this swap + + if (which == 0) { + if (my_set_temp % 2 == 0) partner_set_temp = my_set_temp + 1; + else partner_set_temp = my_set_temp - 1; + } else { + if (my_set_temp % 2 == 1) partner_set_temp = my_set_temp + 1; + else partner_set_temp = my_set_temp - 1; + } + + // partner = proc ID to swap with + // if partner = -1, then I am not a proc that swaps + + partner = -1; + if (me == 0 && partner_set_temp >= 0 && partner_set_temp < nworlds) { + partner_world = temp2world[partner_set_temp]; + partner = world2root[partner_world]; + } + + // swap with a partner, only root procs in each world participate + // hi proc sends PE to low proc + // lo proc make Boltzmann decision on whether to swap + // lo proc communicates decision back to hi proc + + swap = 0; + if (partner != -1) { + if (me_universe > partner) { + MPI_Send(&pe,1,MPI_DOUBLE,partner,0,universe->uworld); + } + else { + MPI_Recv(&pe_partner,1,MPI_DOUBLE,partner,0,universe->uworld,MPI_STATUS_IGNORE); + } + if (me_universe > partner) { + MPI_Send(&vol,1, MPI_DOUBLE,partner,0,universe->uworld); + } + else { + MPI_Recv(&vol_partner,1,MPI_DOUBLE,partner,0,universe->uworld,MPI_STATUS_IGNORE); + } + // Acceptance criteria changed for NPT ensemble + if (me_universe < partner) { + press_units = press_set/nktv2p; + delr = (pe_partner - pe)*(1.0/(boltz*set_temp[my_set_temp]) - 1.0/(boltz*set_temp[partner_set_temp])) + press_units*(1.0/(boltz*set_temp[my_set_temp]) - 1.0/(boltz*set_temp[partner_set_temp]))*(vol_partner - vol); + boltz_factor = -delr; + if (boltz_factor >= 0.0) swap = 1; + else if (ranboltz->uniform() < exp(boltz_factor)) swap = 1; + } + + if (me_universe < partner) + MPI_Send(&swap,1,MPI_INT,partner,0,universe->uworld); + else + MPI_Recv(&swap,1,MPI_INT,partner,0,universe->uworld,MPI_STATUS_IGNORE); +#ifdef TEMPER_DEBUG + if (me_universe < partner) + fprintf(universe->uscreen,"SWAP %d & %d: yes = %d,Ts = %d %d, PEs = %g %g, Bz = %g %g, vol = %g %g\n", + me_universe,partner,swap,my_set_temp,partner_set_temp, + pe,pe_partner,boltz_factor,exp(boltz_factor), vol, vol_partner); +#endif + + } + + // bcast swap result to other procs in my world + + MPI_Bcast(&swap,1,MPI_INT,0,world); + + // rescale kinetic energy via velocities if move is accepted + + if (swap) scale_velocities(partner_set_temp,my_set_temp); + + // if my world swapped, all procs in world reset temp target of Fix + + if (swap) { + new_temp = set_temp[partner_set_temp]; + modify->fix[whichfix]->reset_target(new_temp); + } + + // update my_set_temp and temp2world on every proc + // root procs update their value if swap took place + // allgather across root procs + // bcast within my world + + if (swap) my_set_temp = partner_set_temp; + if (me == 0) { + MPI_Allgather(&my_set_temp,1,MPI_INT,world2temp,1,MPI_INT,roots); + for (i = 0; i < nworlds; i++) temp2world[world2temp[i]] = i; + } + MPI_Bcast(temp2world,nworlds,MPI_INT,0,world); + + // print out current swap status + + if (me_universe == 0) print_status(); + } + + timer->barrier_stop(); + + update->integrate->cleanup(); + + Finish finish(lmp); + finish.end(1); + + update->whichflag = 0; + update->firststep = update->laststep = 0; + update->beginstep = update->endstep = 0; +} + +/* ---------------------------------------------------------------------- + scale kinetic energy via velocities a la Sugita +------------------------------------------------------------------------- */ + +void TemperNPT::scale_velocities(int t_partner, int t_me) +{ + double sfactor = sqrt(set_temp[t_partner]/set_temp[t_me]); + + double **v = atom->v; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + v[i][0] = v[i][0]*sfactor; + v[i][1] = v[i][1]*sfactor; + v[i][2] = v[i][2]*sfactor; + } +} + +/* ---------------------------------------------------------------------- + proc 0 prints current tempering status +------------------------------------------------------------------------- */ + +void TemperNPT::print_status() +{ + if (universe->uscreen) { + fprintf(universe->uscreen,BIGINT_FORMAT,update->ntimestep); + for (int i = 0; i < nworlds; i++) + fprintf(universe->uscreen," %d",world2temp[i]); + fprintf(universe->uscreen,"\n"); + } + if (universe->ulogfile) { + fprintf(universe->ulogfile,BIGINT_FORMAT,update->ntimestep); + for (int i = 0; i < nworlds; i++) + fprintf(universe->ulogfile," %d",world2temp[i]); + fprintf(universe->ulogfile,"\n"); + fflush(universe->ulogfile); + } +} diff --git a/src/USER-MISC/temper_npt.h b/src/USER-MISC/temper_npt.h new file mode 100644 index 0000000000..cbc4345995 --- /dev/null +++ b/src/USER-MISC/temper_npt.h @@ -0,0 +1,108 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + +------------------------------------------------------------------------- */ + +#ifdef COMMAND_CLASS + +CommandStyle(temper/npt,TemperNPT) + +#else + +#ifndef LMP_TEMPERNPT_H +#define LMP_TEMPERNPT_H + +#include "pointers.h" + +namespace LAMMPS_NS { + +class TemperNPT : protected Pointers { + public: + TemperNPT(class LAMMPS *); + ~TemperNPT(); + void command(int, char **); + + private: + int me,me_universe; // my proc ID in world and universe + int iworld,nworlds; // world info + double boltz; // copy from output->boltz + double nktv2p; + MPI_Comm roots; // MPI comm with 1 root proc from each world + class RanPark *ranswap,*ranboltz; // RNGs for swapping and Boltz factor + int nevery; // # of timesteps between swaps + int nswaps; // # of tempering swaps to perform + int seed_swap; // 0 = toggle swaps, n = RNG for swap direction + int seed_boltz; // seed for Boltz factor comparison + int whichfix; // index of temperature fix to use + int fixstyle; // what kind of temperature fix is used + + int my_set_temp; // which set temp I am simulating + double *set_temp; // static list of replica set temperatures + int *temp2world; // temp2world[i] = world simulating set temp i + int *world2temp; // world2temp[i] = temp simulated by world i + int *world2root; // world2root[i] = root proc of world i + + void scale_velocities(int, int); + void print_status(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Must have more than one processor partition to temper + +Cannot use the temper command with only one processor partition. Use +the -partition command-line option. + +E: temper/npt command before simulation box is defined + +The temper/npt command cannot be used before a read_data, read_restart, +or create_box command. + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Tempering fix ID is not defined + +The fix ID specified by the temper/npt command does not exist. + +E: Invalid frequency in temper/npt command + +Nevery must be > 0. + +E: Non integer # of swaps in temper/npt command + +Swap frequency in temper/npt command must evenly divide the total +# of timesteps. + +E: Tempering temperature fix is not valid + +The fix specified by the temper command is not one that controls +temperature and pressure (npt). + +E: Too many timesteps + +The cummulative timesteps must fit in a 64-bit integer. + +E: Tempering could not find thermo_pe compute + +This compute is created by the thermo command. It must have been +explicitly deleted by a uncompute command. + +*/ diff --git a/src/USER-MOFFF/README b/src/USER-MOFFF/README new file mode 100644 index 0000000000..1cc74392dc --- /dev/null +++ b/src/USER-MOFFF/README @@ -0,0 +1,32 @@ +This Package implements pair, angle and improper styles needed to employ +the MOF-FF force field by Schmid and coworkers with LAMMPS. +MOF-FF is a first principles derived force field with the primary aim +to simulate MOFs and related porous framework materials, using spherical +Gaussian charges. It is described in S. Bureekaew et al., Phys. Stat. Sol. B +2013, 250, 1128-1141. +For the usage of MOF-FF see the example in the example directory as +well as the "MOF+" website (https://www.mofplus.org/content/show/MOF-FF). +The package provides the following features: + +* a dispersion damped Buckhingham potential with spherical Gaussian type +charges (dsf and long-range treatment of charges) + +* a modified angle/class2 including 6th order polynomial + +* a modified angle/cosine style which adds a dispersion damped Buckhingham +1-3 interaction analog to the dihedral/charmm style + +* an improper style following the Wilson-Decius definition of the +out-of-plane angle + +See the file doc/drude_tutorial.html for getting started. +See the doc pages for "pair_style buck6d/coul/gauss", "anlge_style class2", +"angle_style cosine/buck6d", and "improper_style inversion/harmonic" +commands to get started. Also see the above mentioned website and +literature for further documentation about the force field. + +There are example scripts for using this force field in examples/USER/mofff. + +The creators of this package are Hendrik Heenen (hendrik.heenen at mytum.de) +and Rochus Schmid (rochus.schmid at rub.de). Contact them directly if you +have questions. diff --git a/src/USER-MOFFF/angle_class2_p6.cpp b/src/USER-MOFFF/angle_class2_p6.cpp new file mode 100644 index 0000000000..aba117ca90 --- /dev/null +++ b/src/USER-MOFFF/angle_class2_p6.cpp @@ -0,0 +1,487 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hendrik Heenen (Technical University of Munich) + and Rochus Schmid (Ruhr-Universitaet Bochum) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "angle_class2_p6.h" +#include "atom.h" +#include "neighbor.h" +#include "domain.h" +#include "comm.h" +#include "force.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define SMALL 0.001 + +/* ---------------------------------------------------------------------- */ + +AngleClass2P6::AngleClass2P6(LAMMPS *lmp) : Angle(lmp) {} + +/* ---------------------------------------------------------------------- */ + +AngleClass2P6::~AngleClass2P6() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(setflag_a); + memory->destroy(setflag_bb); + memory->destroy(setflag_ba); + + memory->destroy(theta0); + memory->destroy(k2); + memory->destroy(k3); + memory->destroy(k4); + memory->destroy(k5); + memory->destroy(k6); + + memory->destroy(bb_k); + memory->destroy(bb_r1); + memory->destroy(bb_r2); + + memory->destroy(ba_k1); + memory->destroy(ba_k2); + memory->destroy(ba_r1); + memory->destroy(ba_r2); + } +} + +/* ---------------------------------------------------------------------- */ + +void AngleClass2P6::compute(int eflag, int vflag) +{ + int i1,i2,i3,n,type; + double delx1,dely1,delz1,delx2,dely2,delz2; + double eangle,f1[3],f3[3]; + double dtheta,dtheta2,dtheta3,dtheta4,dtheta5,dtheta6,de_angle; + double dr1,dr2,tk1,tk2,aa1,aa2,aa11,aa12,aa21,aa22; + double rsq1,rsq2,r1,r2,c,s,a,a11,a12,a22,b1,b2; + double vx11,vx12,vy11,vy12,vz11,vz12,vx21,vx22,vy21,vy22,vz21,vz22; + + eangle = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = 0; + + double **x = atom->x; + double **f = atom->f; + int **anglelist = neighbor->anglelist; + int nanglelist = neighbor->nanglelist; + int nlocal = atom->nlocal; + int newton_bond = force->newton_bond; + + for (n = 0; n < nanglelist; n++) { + i1 = anglelist[n][0]; + i2 = anglelist[n][1]; + i3 = anglelist[n][2]; + type = anglelist[n][3]; + + // 1st bond + + delx1 = x[i1][0] - x[i2][0]; + dely1 = x[i1][1] - x[i2][1]; + delz1 = x[i1][2] - x[i2][2]; + + rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + r1 = sqrt(rsq1); + + // 2nd bond + + delx2 = x[i3][0] - x[i2][0]; + dely2 = x[i3][1] - x[i2][1]; + delz2 = x[i3][2] - x[i2][2]; + + rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + r2 = sqrt(rsq2); + + // angle (cos and sin) + + c = delx1*delx2 + dely1*dely2 + delz1*delz2; + c /= r1*r2; + + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + + s = sqrt(1.0 - c*c); + if (s < SMALL) s = SMALL; + s = 1.0/s; + + // force & energy for angle term + + dtheta = acos(c) - theta0[type]; + dtheta2 = dtheta*dtheta; + dtheta3 = dtheta2*dtheta; + dtheta4 = dtheta3*dtheta; + dtheta5 = dtheta4*dtheta; + dtheta6 = dtheta5*dtheta; + + de_angle = 2.0*k2[type]*dtheta + 3.0*k3[type]*dtheta2 + + 4.0*k4[type]*dtheta3 + 5.0*k5[type]*dtheta4 + + 6.0*k6[type]*dtheta5; + + a = -de_angle*s; + a11 = a*c / rsq1; + a12 = -a / (r1*r2); + a22 = a*c / rsq2; + + f1[0] = a11*delx1 + a12*delx2; + f1[1] = a11*dely1 + a12*dely2; + f1[2] = a11*delz1 + a12*delz2; + + f3[0] = a22*delx2 + a12*delx1; + f3[1] = a22*dely2 + a12*dely1; + f3[2] = a22*delz2 + a12*delz1; + + if (eflag) eangle = k2[type]*dtheta2 + k3[type]*dtheta3 + k4[type]*dtheta4 + + k5[type]*dtheta5 + k6[type]*dtheta6; + + // force & energy for bond-bond term + + dr1 = r1 - bb_r1[type]; + dr2 = r2 - bb_r2[type]; + tk1 = bb_k[type] * dr1; + tk2 = bb_k[type] * dr2; + + f1[0] -= delx1*tk2/r1; + f1[1] -= dely1*tk2/r1; + f1[2] -= delz1*tk2/r1; + + f3[0] -= delx2*tk1/r2; + f3[1] -= dely2*tk1/r2; + f3[2] -= delz2*tk1/r2; + + if (eflag) eangle += bb_k[type]*dr1*dr2; + + // force & energy for bond-angle term + + aa1 = s * dr1 * ba_k1[type]; + aa2 = s * dr2 * ba_k2[type]; + + aa11 = aa1 * c / rsq1; + aa12 = -aa1 / (r1 * r2); + aa21 = aa2 * c / rsq1; + aa22 = -aa2 / (r1 * r2); + + vx11 = (aa11 * delx1) + (aa12 * delx2); + vx12 = (aa21 * delx1) + (aa22 * delx2); + vy11 = (aa11 * dely1) + (aa12 * dely2); + vy12 = (aa21 * dely1) + (aa22 * dely2); + vz11 = (aa11 * delz1) + (aa12 * delz2); + vz12 = (aa21 * delz1) + (aa22 * delz2); + + aa11 = aa1 * c / rsq2; + aa21 = aa2 * c / rsq2; + + vx21 = (aa11 * delx2) + (aa12 * delx1); + vx22 = (aa21 * delx2) + (aa22 * delx1); + vy21 = (aa11 * dely2) + (aa12 * dely1); + vy22 = (aa21 * dely2) + (aa22 * dely1); + vz21 = (aa11 * delz2) + (aa12 * delz1); + vz22 = (aa21 * delz2) + (aa22 * delz1); + + b1 = ba_k1[type] * dtheta / r1; + b2 = ba_k2[type] * dtheta / r2; + + f1[0] -= vx11 + b1*delx1 + vx12; + f1[1] -= vy11 + b1*dely1 + vy12; + f1[2] -= vz11 + b1*delz1 + vz12; + + f3[0] -= vx21 + b2*delx2 + vx22; + f3[1] -= vy21 + b2*dely2 + vy22; + f3[2] -= vz21 + b2*delz2 + vz22; + + if (eflag) eangle += ba_k1[type]*dr1*dtheta + ba_k2[type]*dr2*dtheta; + + // apply force to each of 3 atoms + + if (newton_bond || i1 < nlocal) { + f[i1][0] += f1[0]; + f[i1][1] += f1[1]; + f[i1][2] += f1[2]; + } + + if (newton_bond || i2 < nlocal) { + f[i2][0] -= f1[0] + f3[0]; + f[i2][1] -= f1[1] + f3[1]; + f[i2][2] -= f1[2] + f3[2]; + } + + if (newton_bond || i3 < nlocal) { + f[i3][0] += f3[0]; + f[i3][1] += f3[1]; + f[i3][2] += f3[2]; + } + + if (evflag) ev_tally(i1,i2,i3,nlocal,newton_bond,eangle,f1,f3, + delx1,dely1,delz1,delx2,dely2,delz2); + } +} + +/* ---------------------------------------------------------------------- */ + +void AngleClass2P6::allocate() +{ + allocated = 1; + int n = atom->nangletypes; + + memory->create(theta0,n+1,"angle:theta0"); + memory->create(k2,n+1,"angle:k2"); + memory->create(k3,n+1,"angle:k3"); + memory->create(k4,n+1,"angle:k4"); + memory->create(k5,n+1,"angle:k5"); + memory->create(k6,n+1,"angle:k6"); + + memory->create(bb_k,n+1,"angle:bb_k"); + memory->create(bb_r1,n+1,"angle:bb_r1"); + memory->create(bb_r2,n+1,"angle:bb_r2"); + + memory->create(ba_k1,n+1,"angle:ba_k1"); + memory->create(ba_k2,n+1,"angle:ba_k2"); + memory->create(ba_r1,n+1,"angle:ba_r1"); + memory->create(ba_r2,n+1,"angle:ba_r2"); + + memory->create(setflag,n+1,"angle:setflag"); + memory->create(setflag_a,n+1,"angle:setflag_a"); + memory->create(setflag_bb,n+1,"angle:setflag_bb"); + memory->create(setflag_ba,n+1,"angle:setflag_ba"); + for (int i = 1; i <= n; i++) + setflag[i] = setflag_a[i] = setflag_bb[i] = setflag_ba[i] = 0; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more types + arg1 = "bb" -> BondBond coeffs + arg1 = "ba" -> BondAngle coeffs + else -> Angle coeffs +------------------------------------------------------------------------- */ + +void AngleClass2P6::coeff(int narg, char **arg) +{ + if (narg < 2) error->all(FLERR,"Incorrect args for angle coefficients"); + if (!allocated) allocate(); + + int ilo,ihi; + force->bounds(FLERR,arg[0],atom->nangletypes,ilo,ihi); + + int count = 0; + + if (strcmp(arg[1],"bb") == 0) { + if (narg != 5) error->all(FLERR,"Incorrect args for angle coefficients"); + + double bb_k_one = force->numeric(FLERR,arg[2]); + double bb_r1_one = force->numeric(FLERR,arg[3]); + double bb_r2_one = force->numeric(FLERR,arg[4]); + + for (int i = ilo; i <= ihi; i++) { + bb_k[i] = bb_k_one; + bb_r1[i] = bb_r1_one; + bb_r2[i] = bb_r2_one; + setflag_bb[i] = 1; + count++; + } + + } else if (strcmp(arg[1],"ba") == 0) { + if (narg != 6) error->all(FLERR,"Incorrect args for angle coefficients"); + + double ba_k1_one = force->numeric(FLERR,arg[2]); + double ba_k2_one = force->numeric(FLERR,arg[3]); + double ba_r1_one = force->numeric(FLERR,arg[4]); + double ba_r2_one = force->numeric(FLERR,arg[5]); + + for (int i = ilo; i <= ihi; i++) { + ba_k1[i] = ba_k1_one; + ba_k2[i] = ba_k2_one; + ba_r1[i] = ba_r1_one; + ba_r2[i] = ba_r2_one; + setflag_ba[i] = 1; + count++; + } + + } else { + if (narg != 7) error->all(FLERR,"Incorrect args for angle coefficients"); + + double theta0_one = force->numeric(FLERR,arg[1]); + double k2_one = force->numeric(FLERR,arg[2]); + double k3_one = force->numeric(FLERR,arg[3]); + double k4_one = force->numeric(FLERR,arg[4]); + double k5_one = force->numeric(FLERR,arg[5]); + double k6_one = force->numeric(FLERR,arg[6]); + + // convert theta0 from degrees to radians + + for (int i = ilo; i <= ihi; i++) { + theta0[i] = theta0_one/180.0 * MY_PI; + k2[i] = k2_one; + k3[i] = k3_one; + k4[i] = k4_one; + k5[i] = k5_one; + k6[i] = k6_one; + setflag_a[i] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for angle coefficients"); + + for (int i = ilo; i <= ihi; i++) + if (setflag_a[i] == 1 && setflag_bb[i] == 1 && setflag_ba[i] == 1) + setflag[i] = 1; +} + +/* ---------------------------------------------------------------------- */ + +double AngleClass2P6::equilibrium_angle(int i) +{ + return theta0[i]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes out coeffs to restart file +------------------------------------------------------------------------- */ + +void AngleClass2P6::write_restart(FILE *fp) +{ + fwrite(&theta0[1],sizeof(double),atom->nangletypes,fp); + fwrite(&k2[1],sizeof(double),atom->nangletypes,fp); + fwrite(&k3[1],sizeof(double),atom->nangletypes,fp); + fwrite(&k4[1],sizeof(double),atom->nangletypes,fp); + fwrite(&k5[1],sizeof(double),atom->nangletypes,fp); + fwrite(&k6[1],sizeof(double),atom->nangletypes,fp); + + fwrite(&bb_k[1],sizeof(double),atom->nangletypes,fp); + fwrite(&bb_r1[1],sizeof(double),atom->nangletypes,fp); + fwrite(&bb_r2[1],sizeof(double),atom->nangletypes,fp); + + fwrite(&ba_k1[1],sizeof(double),atom->nangletypes,fp); + fwrite(&ba_k2[1],sizeof(double),atom->nangletypes,fp); + fwrite(&ba_r1[1],sizeof(double),atom->nangletypes,fp); + fwrite(&ba_r2[1],sizeof(double),atom->nangletypes,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads coeffs from restart file, bcasts them +------------------------------------------------------------------------- */ + +void AngleClass2P6::read_restart(FILE *fp) +{ + allocate(); + + if (comm->me == 0) { + fread(&theta0[1],sizeof(double),atom->nangletypes,fp); + fread(&k2[1],sizeof(double),atom->nangletypes,fp); + fread(&k3[1],sizeof(double),atom->nangletypes,fp); + fread(&k4[1],sizeof(double),atom->nangletypes,fp); + fread(&k5[1],sizeof(double),atom->nangletypes,fp); + fread(&k6[1],sizeof(double),atom->nangletypes,fp); + + fread(&bb_k[1],sizeof(double),atom->nangletypes,fp); + fread(&bb_r1[1],sizeof(double),atom->nangletypes,fp); + fread(&bb_r2[1],sizeof(double),atom->nangletypes,fp); + + fread(&ba_k1[1],sizeof(double),atom->nangletypes,fp); + fread(&ba_k2[1],sizeof(double),atom->nangletypes,fp); + fread(&ba_r1[1],sizeof(double),atom->nangletypes,fp); + fread(&ba_r2[1],sizeof(double),atom->nangletypes,fp); + } + + MPI_Bcast(&theta0[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&k2[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&k3[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&k4[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&k5[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&k6[1],atom->nangletypes,MPI_DOUBLE,0,world); + + MPI_Bcast(&bb_k[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&bb_r1[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&bb_r2[1],atom->nangletypes,MPI_DOUBLE,0,world); + + MPI_Bcast(&ba_k1[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&ba_k2[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&ba_r1[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&ba_r2[1],atom->nangletypes,MPI_DOUBLE,0,world); + + for (int i = 1; i <= atom->nangletypes; i++) setflag[i] = 1; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void AngleClass2P6::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->nangletypes; i++) + fprintf(fp,"%d %g %g %g %g\n", + i,theta0[i]/MY_PI*180.0,k2[i],k3[i],k4[i],k5[i],k6[i]); + + fprintf(fp,"\nBondBond Coeffs\n\n"); + for (int i = 1; i <= atom->nangletypes; i++) + fprintf(fp,"%d %g %g %g\n",i,bb_k[i],bb_r1[i],bb_r2[i]); + + fprintf(fp,"\nBondAngle Coeffs\n\n"); + for (int i = 1; i <= atom->nangletypes; i++) + fprintf(fp,"%d %g %g %g %g\n",i,ba_k1[i],ba_k2[i],ba_r1[i],ba_r2[i]); +} + +/* ---------------------------------------------------------------------- */ + +double AngleClass2P6::single(int type, int i1, int i2, int i3) +{ + double **x = atom->x; + + double delx1 = x[i1][0] - x[i2][0]; + double dely1 = x[i1][1] - x[i2][1]; + double delz1 = x[i1][2] - x[i2][2]; + domain->minimum_image(delx1,dely1,delz1); + double r1 = sqrt(delx1*delx1 + dely1*dely1 + delz1*delz1); + + double delx2 = x[i3][0] - x[i2][0]; + double dely2 = x[i3][1] - x[i2][1]; + double delz2 = x[i3][2] - x[i2][2]; + domain->minimum_image(delx2,dely2,delz2); + double r2 = sqrt(delx2*delx2 + dely2*dely2 + delz2*delz2); + + double c = delx1*delx2 + dely1*dely2 + delz1*delz2; + c /= r1*r2; + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + + double s = sqrt(1.0 - c*c); + if (s < SMALL) s = SMALL; + s = 1.0/s; + + double dtheta = acos(c) - theta0[type]; + double dtheta2 = dtheta*dtheta; + double dtheta3 = dtheta2*dtheta; + double dtheta4 = dtheta3*dtheta; + double dtheta5 = dtheta4*dtheta; + double dtheta6 = dtheta5*dtheta; + + double energy = k2[type]*dtheta2 + k3[type]*dtheta3 + k4[type]*dtheta4 + + k5[type]*dtheta5 + k6[type]*dtheta6; + + double dr1 = r1 - bb_r1[type]; + double dr2 = r2 - bb_r2[type]; + energy += bb_k[type]*dr1*dr2; + + energy += ba_k1[type]*dr1*dtheta + ba_k2[type]*dr2*dtheta; + return energy; +} diff --git a/src/USER-MOFFF/angle_class2_p6.h b/src/USER-MOFFF/angle_class2_p6.h new file mode 100644 index 0000000000..aa0bdea6d6 --- /dev/null +++ b/src/USER-MOFFF/angle_class2_p6.h @@ -0,0 +1,60 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ANGLE_CLASS + +AngleStyle(class2/p6,AngleClass2P6) + +#else + +#ifndef LMP_ANGLE_CLASS2_P6_H +#define LMP_ANGLE_CLASS2_P6_H + +#include +#include "angle.h" + +namespace LAMMPS_NS { + +class AngleClass2P6 : public Angle { + public: + AngleClass2P6(class LAMMPS *); + virtual ~AngleClass2P6(); + virtual void compute(int, int); + void coeff(int, char **); + double equilibrium_angle(int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_data(FILE *); + double single(int, int, int, int); + + protected: + double *theta0,*k2,*k3,*k4,*k5,*k6; + double *bb_k,*bb_r1,*bb_r2; + double *ba_k1,*ba_k2,*ba_r1,*ba_r2; + int *setflag_a,*setflag_bb,*setflag_ba; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args for angle coefficients + +Self-explanatory. Check the input script or data file. + +*/ diff --git a/src/USER-MOFFF/angle_cosine_buck6d.cpp b/src/USER-MOFFF/angle_cosine_buck6d.cpp new file mode 100644 index 0000000000..3f8df52887 --- /dev/null +++ b/src/USER-MOFFF/angle_cosine_buck6d.cpp @@ -0,0 +1,386 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hendrik Heenen (Technical University of Munich) + and Rochus Schmid (Ruhr-Universitaet Bochum) +------------------------------------------------------------------------- */ + +#include +#include +#include "angle_cosine_buck6d.h" +#include "atom.h" +#include "neighbor.h" +#include "domain.h" +#include "comm.h" +#include "force.h" +#include "pair.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define SMALL 0.001 + +/* ---------------------------------------------------------------------- */ + +AngleCosineBuck6d::AngleCosineBuck6d(LAMMPS *lmp) : Angle(lmp) {} + +/* ---------------------------------------------------------------------- */ + +AngleCosineBuck6d::~AngleCosineBuck6d() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(k); + memory->destroy(multiplicity); + memory->destroy(th0); + } +} + +/* ---------------------------------------------------------------------- */ + +void AngleCosineBuck6d::compute(int eflag, int vflag) +{ + int i,i1,i2,i3,n,type,itype,jtype; + double delx1,dely1,delz1,delx2,dely2,delz2; + double eangle,f1[3],f3[3]; + double rsq1,rsq2,r1,r2,c,s,a,a11,a12,a22; + double tk; + + // extra lj variables + double delx3,dely3,delz3,rsq3,r3; + double rexp,r32inv,r36inv,r314inv,forcebuck6d,fpair; + double term1,term2,term3,term4,term5,ebuck6d,evdwl; + double rcu,rqu,sme,smf; + + eangle = evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = 0; + + // insure pair->ev_tally() will use 1-3 virial contribution + + if (vflag_global == 2) + force->pair->vflag_either = force->pair->vflag_global = 1; + + double **x = atom->x; + double **f = atom->f; + int **anglelist = neighbor->anglelist; + int nanglelist = neighbor->nanglelist; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + int newton_bond = force->newton_bond; + int *atomtype = atom->type; + + for (n = 0; n < nanglelist; n++) { + i1 = anglelist[n][0]; + i2 = anglelist[n][1]; + i3 = anglelist[n][2]; + type = anglelist[n][3]; + + // 1st bond + + delx1 = x[i1][0] - x[i2][0]; + dely1 = x[i1][1] - x[i2][1]; + delz1 = x[i1][2] - x[i2][2]; + + rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + r1 = sqrt(rsq1); + + // 2nd bond + + delx2 = x[i3][0] - x[i2][0]; + dely2 = x[i3][1] - x[i2][1]; + delz2 = x[i3][2] - x[i2][2]; + + rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + r2 = sqrt(rsq2); + + // c = cosine of angle + + c = delx1*delx2 + dely1*dely2 + delz1*delz2; + c /= r1*r2; + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + + s = sqrt(1.0 - c*c); + if (s < SMALL) s = SMALL; + s = 1.0/s; + + // force & energy + + // explicit lj-contribution + + itype = atomtype[i1]; + jtype = atomtype[i3]; + + delx3 = x[i1][0] - x[i3][0]; + dely3 = x[i1][1] - x[i3][1]; + delz3 = x[i1][2] - x[i3][2]; + rsq3 = delx3*delx3 + dely3*dely3 + delz3*delz3; + + if (rsq3 < cut_ljsq[itype][jtype]) { + r3 = sqrt(rsq3); + r32inv = 1.0/rsq3; + r36inv = r32inv*r32inv*r32inv; + r314inv = r36inv*r36inv*r32inv; + rexp = exp(-r3*buck6d2[itype][jtype]); + term1 = buck6d3[itype][jtype]*r36inv; + term2 = buck6d4[itype][jtype]*r314inv; + term3 = term2*term2; + term4 = 1.0/(1.0 + term2); + term5 = 1.0/(1.0 + 2.0*term2 + term3); + forcebuck6d = buck6d1[itype][jtype]*buck6d2[itype][jtype]*r3*rexp; + forcebuck6d -= term1*(6.0*term4 - term5*14.0*term2); + ebuck6d = buck6d1[itype][jtype]*rexp - term1*term4; + + // smoothing term + if (rsq3 > rsmooth_sq[itype][jtype]) { + rcu = r3*rsq3; + rqu = rsq3*rsq3; + sme = c5[itype][jtype]*rqu*r3 + c4[itype][jtype]*rqu + c3[itype][jtype]*rcu + + c2[itype][jtype]*rsq3 + c1[itype][jtype]*r3 + c0[itype][jtype]; + smf = 5.0*c5[itype][jtype]*rqu + 4.0*c4[itype][jtype]*rcu + + 3.0*c3[itype][jtype]*rsq3 + 2.0*c2[itype][jtype]*r3 + c1[itype][jtype]; + forcebuck6d = forcebuck6d*sme + ebuck6d*smf; + ebuck6d *= sme; + } + } else forcebuck6d = 0.0; + + // add forces of additional LJ interaction + + fpair = forcebuck6d * r32inv; + if (newton_pair || i1 < nlocal) { + f[i1][0] += delx3*fpair; + f[i1][1] += dely3*fpair; + f[i1][2] += delz3*fpair; + } + if (newton_pair || i3 < nlocal) { + f[i3][0] -= delx3*fpair; + f[i3][1] -= dely3*fpair; + f[i3][2] -= delz3*fpair; + } + + evdwl = 0.0; + if (eflag) { + if (rsq3 < cut_ljsq[itype][jtype]) { + evdwl = ebuck6d - offset[itype][jtype]; + } + } + + //update pair energy and velocities + + if (evflag) force->pair->ev_tally(i1,i3,nlocal,newton_pair, + evdwl,0.0,fpair,delx3,dely3,delz3); + + tk = multiplicity[type]*acos(c)-th0[type]; + + if (eflag) eangle = k[type]*(1.0+cos(tk)); + + a = k[type]*multiplicity[type]*sin(tk)*s; + + a11 = a*c / rsq1; + a12 = -a / (r1*r2); + a22 = a*c / rsq2; + + f1[0] = a11*delx1 + a12*delx2; + f1[1] = a11*dely1 + a12*dely2; + f1[2] = a11*delz1 + a12*delz2; + f3[0] = a22*delx2 + a12*delx1; + f3[1] = a22*dely2 + a12*dely1; + f3[2] = a22*delz2 + a12*delz1; + + // apply force to each of 3 atoms + + if (newton_bond || i1 < nlocal) { + f[i1][0] += f1[0]; + f[i1][1] += f1[1]; + f[i1][2] += f1[2]; + } + + if (newton_bond || i2 < nlocal) { + f[i2][0] -= f1[0] + f3[0]; + f[i2][1] -= f1[1] + f3[1]; + f[i2][2] -= f1[2] + f3[2]; + } + + if (newton_bond || i3 < nlocal) { + f[i3][0] += f3[0]; + f[i3][1] += f3[1]; + f[i3][2] += f3[2]; + } + + if (evflag) ev_tally(i1,i2,i3,nlocal,newton_bond,eangle,f1,f3, + delx1,dely1,delz1,delx2,dely2,delz2); + } +} + +/* ---------------------------------------------------------------------- */ + +void AngleCosineBuck6d::allocate() +{ + allocated = 1; + int n = atom->nangletypes; + + memory->create(k,n+1,"angle:k"); + memory->create(multiplicity,n+1,"angle:multiplicity"); + memory->create(th0,n+1,"angle:th0"); + memory->create(setflag,n+1,"angle:setflag"); + for (int i = 1; i <= n; i++) setflag[i] = 0; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more types +------------------------------------------------------------------------- */ + +void AngleCosineBuck6d::coeff(int narg, char **arg) +{ + if (narg != 4) error->all(FLERR,"Incorrect args for angle coefficients"); + if (!allocated) allocate(); + + int ilo,ihi; + force->bounds(FLERR,arg[0],atom->nangletypes,ilo,ihi); + + double c_one = force->numeric(FLERR,arg[1]); + int n_one = force->inumeric(FLERR,arg[2]); + int th0_one = force->numeric(FLERR,arg[3]); + if (n_one <= 0) error->all(FLERR,"Incorrect args for angle coefficients"); + + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + k[i] = c_one; + multiplicity[i] = n_one; + // transform offset angle to radians + th0[i] = th0_one/180.0 * MY_PI; + + setflag[i] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for angle coefficients"); +} + +/* ---------------------------------------------------------------------- + check special_bond settings are valid and initialize vdwl parameters +------------------------------------------------------------------------- */ + +void AngleCosineBuck6d::init_style() +{ + // set local ptrs to buck6d 13 arrays setup by Pair + int itmp; + if (force->pair == NULL) + error->all(FLERR,"Angle cosine/buck6d is incompatible with Pair style"); + cut_ljsq = (double **) force->pair->extract("cut_ljsq",itmp); + buck6d1 = (double **) force->pair->extract("buck6d1",itmp); + buck6d2 = (double **) force->pair->extract("buck6d2",itmp); + buck6d3 = (double **) force->pair->extract("buck6d3",itmp); + buck6d4 = (double **) force->pair->extract("buck6d4",itmp); + rsmooth_sq = (double **) force->pair->extract("rsmooth_sq",itmp); + c0 = (double **) force->pair->extract("c0",itmp); + c1 = (double **) force->pair->extract("c1",itmp); + c2 = (double **) force->pair->extract("c2",itmp); + c3 = (double **) force->pair->extract("c3",itmp); + c4 = (double **) force->pair->extract("c4",itmp); + c5 = (double **) force->pair->extract("c5",itmp); + offset = (double **) force->pair->extract("offset",itmp); + if (!buck6d1 || !buck6d2 || !buck6d3 || !buck6d4 || !c0 || !c1 || !c2) + error->all(FLERR,"Angle cosine/buck6d is incompatible with Pair style"); + + // special bonds must be x 0 x or double counting + if (force->special_lj[2] != 0.0) + error->all(FLERR,"Angle style requires special_bonds lj = x,0,x;" + " otherwise buck6d 1-3 interaction are counted twice"); +} + +/* ---------------------------------------------------------------------- */ + +double AngleCosineBuck6d::equilibrium_angle(int i) +{ + return MY_PI; +} + +/* ---------------------------------------------------------------------- + proc 0 writes out coeffs to restart file +------------------------------------------------------------------------- */ + +void AngleCosineBuck6d::write_restart(FILE *fp) +{ + fwrite(&k[1],sizeof(double),atom->nangletypes,fp); + fwrite(&multiplicity[1],sizeof(int),atom->nangletypes,fp); + fwrite(&th0[1],sizeof(double),atom->nangletypes,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads coeffs from restart file, bcasts them +------------------------------------------------------------------------- */ + +void AngleCosineBuck6d::read_restart(FILE *fp) +{ + allocate(); + + if (comm->me == 0) { + fread(&k[1],sizeof(double),atom->nangletypes,fp); + fread(&multiplicity[1],sizeof(int),atom->nangletypes,fp); + fread(&th0[1],sizeof(double),atom->nangletypes,fp); + } + + MPI_Bcast(&k[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&multiplicity[1],atom->nangletypes,MPI_INT,0,world); + MPI_Bcast(&th0[1],atom->nangletypes,MPI_INT,0,world); + for (int i = 1; i <= atom->nangletypes; i++) setflag[i] = 1; +} + + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void AngleCosineBuck6d::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->nangletypes; i++) { + fprintf(fp,"%d %g %d %d\n",i,k[i],multiplicity[i],th0[i]); + } +} + +/* ---------------------------------------------------------------------- */ + +double AngleCosineBuck6d::single(int type, int i1, int i2, int i3) +{ + double **x = atom->x; + + double delx1 = x[i1][0] - x[i2][0]; + double dely1 = x[i1][1] - x[i2][1]; + double delz1 = x[i1][2] - x[i2][2]; + domain->minimum_image(delx1,dely1,delz1); + double r1 = sqrt(delx1*delx1 + dely1*dely1 + delz1*delz1); + + double delx2 = x[i3][0] - x[i2][0]; + double dely2 = x[i3][1] - x[i2][1]; + double delz2 = x[i3][2] - x[i2][2]; + domain->minimum_image(delx2,dely2,delz2); + double r2 = sqrt(delx2*delx2 + dely2*dely2 + delz2*delz2); + + double c = delx1*delx2 + dely1*dely2 + delz1*delz2; + c /= r1*r2; + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + + double tk = multiplicity[type]*acos(c)-th0[type]; + + return k[type]*(1.0+cos(tk)); +} diff --git a/src/USER-MOFFF/angle_cosine_buck6d.h b/src/USER-MOFFF/angle_cosine_buck6d.h new file mode 100644 index 0000000000..e021992b94 --- /dev/null +++ b/src/USER-MOFFF/angle_cosine_buck6d.h @@ -0,0 +1,62 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef ANGLE_CLASS + +AngleStyle(cosine/buck6d, AngleCosineBuck6d) + +#else + +#ifndef LMP_ANGLE_COSINE_BUCK6D_H +#define LMP_ANGLE_COSINE_BUCK6D_H + +#include +#include "angle.h" + +namespace LAMMPS_NS { + +class AngleCosineBuck6d : public Angle { + public: + AngleCosineBuck6d(class LAMMPS *); + virtual ~AngleCosineBuck6d(); + virtual void compute(int, int); + void coeff(int, char **); + void init_style(); + double equilibrium_angle(int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_data(FILE *); + double single(int, int, int, int); + + protected: + double *k,*th0; + double *eps,*d0; + double **buck6d1,**buck6d2,**buck6d3,**buck6d4,**cut_ljsq; + double **c0,**c1,**c2,**c3,**c4,**c5,**rsmooth_sq,**offset; + int *multiplicity; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args for angle coefficients + +Self-explanatory. Check the input script or data file. + +*/ diff --git a/src/USER-MOFFF/improper_inversion_harmonic.cpp b/src/USER-MOFFF/improper_inversion_harmonic.cpp new file mode 100644 index 0000000000..9e8a419eac --- /dev/null +++ b/src/USER-MOFFF/improper_inversion_harmonic.cpp @@ -0,0 +1,337 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hendrik Heenen (Technical University of Munich) + and Rochus Schmid (Ruhr-Universitaet Bochum) + [ based on improper_fourier.cpp Loukas D. Peristeras (Scienomics SARL) ] + [ based on improper_umbrella.cpp Tod A Pascal (Caltech) ] + [ abbreviated from and verified via DLPOLY2.0 ] +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "string.h" +#include "improper_inversion_harmonic.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "domain.h" +#include "force.h" +#include "update.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define TOLERANCE 0.05 +#define SMALL 0.001 + +/* ---------------------------------------------------------------------- */ + +ImproperInversionHarmonic::ImproperInversionHarmonic(LAMMPS *lmp) : Improper(lmp) +{ + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +ImproperInversionHarmonic::~ImproperInversionHarmonic() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(kw); + memory->destroy(w0); + } +} + +/* ---------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::compute(int eflag, int vflag) +{ + int i1,i2,i3,i4,n,type; + double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z; + double rrvb1,rrvb2,rrvb3,rr2vb1,rr2vb2,rr2vb3; + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = 0; + + double **x = atom->x; + int **improperlist = neighbor->improperlist; + int nimproperlist = neighbor->nimproperlist; + + for (n = 0; n < nimproperlist; n++) { + i1 = improperlist[n][0]; + i2 = improperlist[n][1]; + i3 = improperlist[n][2]; + i4 = improperlist[n][3]; + type = improperlist[n][4]; + + // 1st bond - IJ + + vb1x = x[i2][0] - x[i1][0]; + vb1y = x[i2][1] - x[i1][1]; + vb1z = x[i2][2] - x[i1][2]; + rrvb1 = 1.0/sqrt(vb1x*vb1x+vb1y*vb1y+vb1z*vb1z); + rr2vb1 = rrvb1*rrvb1; + + // 2nd bond - IK + + vb2x = x[i3][0] - x[i1][0]; + vb2y = x[i3][1] - x[i1][1]; + vb2z = x[i3][2] - x[i1][2]; + rrvb2 = 1.0/sqrt(vb2x*vb2x+vb2y*vb2y+vb2z*vb2z); + rr2vb2 = rrvb2*rrvb2; + + // 3rd bond - IL + + vb3x = x[i4][0] - x[i1][0]; + vb3y = x[i4][1] - x[i1][1]; + vb3z = x[i4][2] - x[i1][2]; + rrvb3 = 1.0/sqrt(vb3x*vb3x+vb3y*vb3y+vb3z*vb3z); + rr2vb3 = rrvb3*rrvb3; + + // compute all three inversion angles + invang(i1,i2,i3,i4, type,evflag,eflag, + vb3x, vb3y, vb3z, rrvb3, rr2vb3, + vb2x, vb2y, vb2z, rrvb2, rr2vb2, + vb1x, vb1y, vb1z, rrvb1, rr2vb1); + invang(i1,i3,i4,i2, type,evflag,eflag, + vb1x, vb1y, vb1z, rrvb1, rr2vb1, + vb3x, vb3y, vb3z, rrvb3, rr2vb3, + vb2x, vb2y, vb2z, rrvb2, rr2vb2); + invang(i1,i4,i2,i3, type,evflag,eflag, + vb2x, vb2y, vb2z, rrvb2, rr2vb2, + vb1x, vb1y, vb1z, rrvb1, rr2vb1, + vb3x, vb3y, vb3z, rrvb3, rr2vb3); + } +} + +/* ---------------------------------------------------------------------- + compute inversion angles + energy and forces +------------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::invang(const int &i1,const int &i2, + const int &i3,const int &i4, + const int &type,const int &evflag,const int &eflag, + const double &vb1x, const double &vb1y, const double &vb1z, + const double &rrvb1, const double &rr2vb1, + const double &vb2x, const double &vb2y, const double &vb2z, + const double &rrvb2, const double &rr2vb2, + const double &vb3x, const double &vb3y, const double &vb3z, + const double &rrvb3, const double &rr2vb3) +{ + double eimproper,f1[3],f2[3],f3[3],f4[3]; + double omega,cosomega,domega,gomega,rjk,rjl; + double upx,upy,upz,upn,rup,umx,umy,umz,umn,rum,wwr; + double rucb,rudb,rvcb,rvdb,rupupn,rumumn; + + double **x = atom->x; + double **f = atom->f; + int nlocal = atom->nlocal; + int newton_bond = force->newton_bond; + + eimproper = 0.0; + + // scalar products of IJ*IK and IJ*IL + rjk=vb3x*vb2x+vb3y*vb2y+vb3z*vb2z; + rjl=vb1x*vb3x+vb1y*vb3y+vb1z*vb3z; + + // unit-vector: IK+IL + upx=vb2x*rrvb2+vb1x*rrvb1; + upy=vb2y*rrvb2+vb1y*rrvb1; + upz=vb2z*rrvb2+vb1z*rrvb1; + upn=1.0/sqrt(upx*upx+upy*upy+upz*upz); + upx=upx*upn; + upy=upy*upn; + upz=upz*upn; + rup=vb3x*upx+vb3y*upy+vb3z*upz; + + // unit-vector: IK-IL + umx=vb2x*rrvb2-vb1x*rrvb1; + umy=vb2y*rrvb2-vb1y*rrvb1; + umz=vb2z*rrvb2-vb1z*rrvb1; + umn=1.0/sqrt(umx*umx+umy*umy+umz*umz); + umx=umx*umn; + umy=umy*umn; + umz=umz*umn; + rum=vb3x*umx+vb3y*umy+vb3z*umz; + + // angle theta + wwr=sqrt(rup*rup+rum*rum); + + cosomega=wwr*rrvb3; + + if (cosomega > 1.0) cosomega = 1.0; + + omega=acos(cosomega); + + domega = acos(cosomega)-w0[type]; + if (eflag) eimproper = kw[type]*(domega*domega); + + // kw[type] is divided by 3 -> threefold contribution + gomega=0.0; + if (omega*omega > 1.0e-24) gomega=2.0*kw[type]*(domega)/(sin(omega)); + + // projection IK and IL on unit vectors and contribution on IK and IL + rucb = rjk-rup*(vb2x*upx+vb2y*upy+vb2z*upz); + rudb = rjl-rup*(vb1x*upx+vb1y*upy+vb1z*upz); + rvcb = rjk-rum*(vb2x*umx+vb2y*umy+vb2z*umz); + rvdb = rjl-rum*(vb1x*umx+vb1y*umy+vb1z*umz); + + rupupn = rup*upn; + rumumn = rum*umn; + + // force contributions of angle + f2[0]=gomega*(-cosomega*vb3x*rr2vb3+rrvb3*(rup*upx+rum*umx)/wwr); + f2[1]=gomega*(-cosomega*vb3y*rr2vb3+rrvb3*(rup*upy+rum*umy)/wwr); + f2[2]=gomega*(-cosomega*vb3z*rr2vb3+rrvb3*(rup*upz+rum*umz)/wwr); + + f3[0]=gomega*rrvb3*(rupupn*rrvb2*(vb3x-rup*upx-rucb*vb2x*rr2vb2) + + rumumn*rrvb2*(vb3x-rum*umx-rvcb*vb2x*rr2vb2))/wwr; + f3[1]=gomega*rrvb3*(rupupn*rrvb2*(vb3y-rup*upy-rucb*vb2y*rr2vb2) + + rumumn*rrvb2*(vb3y-rum*umy-rvcb*vb2y*rr2vb2))/wwr; + f3[2]=gomega*rrvb3*(rupupn*rrvb2*(vb3z-rup*upz-rucb*vb2z*rr2vb2) + + rumumn*rrvb2*(vb3z-rum*umz-rvcb*vb2z*rr2vb2))/wwr; + + f4[0]=gomega*rrvb3*(rupupn*rrvb1*(vb3x-rup*upx-rudb*vb1x*rr2vb1) - + rumumn*rrvb1*(vb3x-rum*umx-rvdb*vb1x*rr2vb1))/wwr; + f4[1]=gomega*rrvb3*(rupupn*rrvb1*(vb3y-rup*upy-rudb*vb1y*rr2vb1) - + rumumn*rrvb1*(vb3y-rum*umy-rvdb*vb1y*rr2vb1))/wwr; + f4[2]=gomega*rrvb3*(rupupn*rrvb1*(vb3z-rup*upz-rudb*vb1z*rr2vb1) - + rumumn*rrvb1*(vb3z-rum*umz-rvdb*vb1z*rr2vb1))/wwr; + + f1[0] = -(f2[0] + f3[0] + f4[0]); + f1[1] = -(f2[1] + f3[1] + f4[1]); + f1[2] = -(f2[2] + f3[2] + f4[2]); + + if (newton_bond || i1 < nlocal) { + f[i1][0] += f1[0]; + f[i1][1] += f1[1]; + f[i1][2] += f1[2]; + } + + if (newton_bond || i2 < nlocal) { + f[i2][0] += f2[0]; + f[i2][1] += f2[1]; + f[i2][2] += f2[2]; + } + + if (newton_bond || i3 < nlocal) { + f[i3][0] += f3[0]; + f[i3][1] += f3[1]; + f[i3][2] += f3[2]; + } + + if (newton_bond || i4 < nlocal) { + f[i4][0] += f4[0]; + f[i4][1] += f4[1]; + f[i4][2] += f4[2]; + } + + double rb1x, rb1y, rb1z, rb2x, rb2y, rb2z, rb3x, rb3y, rb3z; + if (evflag) + + rb3x = vb1x - vb2x; + rb3y = vb1y - vb2y; + rb3z = vb1z - vb2z; + + ev_tally(i1,i2,i3,i4,nlocal,newton_bond,eimproper,f2,f3,f4, + vb3x,vb3y,vb3z, + vb2x,vb2y,vb2z, + rb3x,rb3y,rb3z); + } + +/* ---------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::allocate() +{ + allocated = 1; + int n = atom->nimpropertypes; + + memory->create(kw,n+1,"improper:kw"); + memory->create(w0,n+1,"improper:w0"); + + memory->create(setflag,n+1,"improper:setflag"); + for (int i = 1; i <= n; i++) setflag[i] = 0; +} + +/* ---------------------------------------------------------------------- + set coeffs for one type +------------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::coeff(int narg, char **arg) +{ + + if (narg != 3) error->all(FLERR,"Incorrect args for improper coefficients"); + if (!allocated) allocate(); + + int ilo,ihi; + force->bounds(FLERR,arg[0],atom->nimpropertypes,ilo,ihi); + + double k_one = force->numeric(FLERR,arg[1]); + double w_one = force->numeric(FLERR,arg[2]); + + // convert w0 from degrees to radians + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + kw[i] = k_one/3.0; // parameter division due to 3 vector averaging + w0[i] = w_one/180.0 * MY_PI; + setflag[i] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for improper coefficients"); +} + +/* ---------------------------------------------------------------------- + proc 0 writes out coeffs to restart file +------------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::write_restart(FILE *fp) +{ + fwrite(&kw[1],sizeof(double),atom->nimpropertypes,fp); + fwrite(&w0[1],sizeof(double),atom->nimpropertypes,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads coeffs from restart file, bcasts them +------------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::read_restart(FILE *fp) +{ + allocate(); + + if (comm->me == 0) { + fread(&kw[1],sizeof(double),atom->nimpropertypes,fp); + fread(&w0[1],sizeof(double),atom->nimpropertypes,fp); + } + MPI_Bcast(&kw[1],atom->nimpropertypes,MPI_DOUBLE,0,world); + MPI_Bcast(&w0[1],atom->nimpropertypes,MPI_DOUBLE,0,world); + + for (int i = 1; i <= atom->nimpropertypes; i++) setflag[i] = 1; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void ImproperInversionHarmonic::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->nimpropertypes; i++) + fprintf(fp,"%d %g %g\n",i,kw[i],w0[i]/MY_PI*180.0); +} diff --git a/src/USER-MOFFF/improper_inversion_harmonic.h b/src/USER-MOFFF/improper_inversion_harmonic.h new file mode 100644 index 0000000000..fd36389d20 --- /dev/null +++ b/src/USER-MOFFF/improper_inversion_harmonic.h @@ -0,0 +1,54 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef IMPROPER_CLASS + +ImproperStyle(inversion/harmonic,ImproperInversionHarmonic) + +#else + +#ifndef LMP_IMPROPER_INVERSION_HARMONIC_H +#define LMP_IMPROPER_INVERSION_HARMONIC_H + +#include +#include "improper.h" + +namespace LAMMPS_NS { + +class ImproperInversionHarmonic : public Improper { + public: + ImproperInversionHarmonic(class LAMMPS *); + virtual ~ImproperInversionHarmonic(); + virtual void compute(int, int); + void coeff(int, char **); + void write_restart(FILE *); + void read_restart(FILE *); + void write_data(FILE *); + + protected: + double *kw, *w0; + void invang(const int &i1,const int &i2,const int &i3,const int &i4, + const int &type,const int &evflag,const int &eflag, + const double &vb1x, const double &vb1y, const double &vb1z, + const double &rrvb1, const double &rr2vb1, + const double &vb2x, const double &vb2y, const double &vb2z, + const double &rrvb2, const double &rr2vb2, + const double &vb3x, const double &vb3y, const double &vb3z, + const double &rrvb3, const double &rr2vb3); + void allocate(); +}; + +} + +#endif +#endif diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp new file mode 100644 index 0000000000..415348cbec --- /dev/null +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.cpp @@ -0,0 +1,590 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hendrik Heenen (Technical University of Munich) + and Rochus Schmid (Ruhr-Universitaet Bochum) + References: Bureekaew and Schmid, Phys. Status Solidi B 250, 1128 (2013) + Fennell and Gezelter, JCP 124, 234104 (2006) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_buck6d_coul_gauss_dsf.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "memory.h" +#include "math_const.h" +#include "error.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairBuck6dCoulGaussDSF::PairBuck6dCoulGaussDSF(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 1; + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairBuck6dCoulGaussDSF::~PairBuck6dCoulGaussDSF() +{ + if (!copymode) { + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(alpha_ij); + memory->destroy(f_shift_ij); + memory->destroy(e_shift_ij); + memory->destroy(buck6d1); + memory->destroy(buck6d2); + memory->destroy(buck6d3); + memory->destroy(buck6d4); + memory->destroy(c0); + memory->destroy(c1); + memory->destroy(c2); + memory->destroy(c3); + memory->destroy(c4); + memory->destroy(c5); + memory->destroy(rsmooth_sq); + memory->destroy(offset); + } + } +} + +/* ---------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double r,rsq,r2inv,r6inv,r14inv,rexp,forcecoul,forcebuck6d,factor_coul,factor_lj; + double term1,term2,term3,term4,term5; + double rcu,rqu,sme,smf,ebuck6d; + double prefactor,erfcc,erfcd,t,arg; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + double *special_coul = force->special_coul; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + r = sqrt(rsq); + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + r14inv = r6inv*r6inv*r2inv; + rexp = exp(-r*buck6d2[itype][jtype]); + term1 = buck6d3[itype][jtype]*r6inv; + term2 = buck6d4[itype][jtype]*r14inv; + term3 = term2*term2; + term4 = 1.0/(1.0 + term2); + term5 = 1.0/(1.0 + 2.0*term2 + term3); + forcebuck6d = buck6d1[itype][jtype]*buck6d2[itype][jtype]*r*rexp; + forcebuck6d -= term1*(6.0*term4 - term5*14.0*term2); + ebuck6d = buck6d1[itype][jtype]*rexp - term1*term4; + + // smoothing term + if (rsq > rsmooth_sq[itype][jtype]) { + rcu = r*rsq; + rqu = rsq*rsq; + sme = c5[itype][jtype]*rqu*r + c4[itype][jtype]*rqu + c3[itype][jtype]*rcu + + c2[itype][jtype]*rsq + c1[itype][jtype]*r + c0[itype][jtype]; + smf = 5.0*c5[itype][jtype]*rqu + 4.0*c4[itype][jtype]*rcu + + 3.0*c3[itype][jtype]*rsq + 2.0*c2[itype][jtype]*r + c1[itype][jtype]; + // forcebuck6d is -dE/dr*r + forcebuck6d = forcebuck6d*sme - ebuck6d*smf*r; //RS was here: changed this from +E*smf to -E*smf*r + ebuck6d *= sme; + } + } else forcebuck6d = 0.0; + + if (rsq < cut_coulsq) { + prefactor = qqrd2e*qtmp*q[j]/r; + + //below: parametrization for erfcc = erf(alpha_ij[itype][jtype]*r); + arg = alpha_ij[itype][jtype]*r; + erfcd = MathSpecial::expmsq(arg); + erfcc = 1 - (MathSpecial::my_erfcx(arg) * erfcd); + + forcecoul = prefactor * ((erfcc/r) - (2.0/MY_PIS*alpha_ij[itype][jtype]*erfcd) + + r*f_shift_ij[itype][jtype]) * r; + + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + } else forcecoul = 0.0; + + fpair = (forcecoul + factor_lj*forcebuck6d) * r2inv; + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = ebuck6d - offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + + if (rsq < cut_coulsq) { + ecoul = prefactor * (erfcc - r*e_shift_ij[itype][jtype] - + rsq*f_shift_ij[itype][jtype]); + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,ecoul,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut_lj,n+1,n+1,"pair:cut_lj"); + memory->create(cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memory->create(alpha_ij,n+1,n+1,"pair:alpha_ij"); + memory->create(f_shift_ij,n+1,n+1,"pair:f_shift_ij"); + memory->create(e_shift_ij,n+1,n+1,"pair:e_shift_ij"); + memory->create(buck6d1,n+1,n+1,"pair:buck6d1"); + memory->create(buck6d2,n+1,n+1,"pair:buck6d2"); + memory->create(buck6d3,n+1,n+1,"pair:buck6d3"); + memory->create(buck6d4,n+1,n+1,"pair:buck6d4"); + memory->create(c0,n+1,n+1,"pair:c0"); + memory->create(c1,n+1,n+1,"pair:c1"); + memory->create(c2,n+1,n+1,"pair:c2"); + memory->create(c3,n+1,n+1,"pair:c3"); + memory->create(c4,n+1,n+1,"pair:c4"); + memory->create(c5,n+1,n+1,"pair:c5"); + memory->create(rsmooth_sq,n+1,n+1,"pair:rsmooth_sq"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::settings(int narg, char **arg) +{ + if (narg < 2 || narg > 3) error->all(FLERR,"Illegal pair_style command"); + + vdwl_smooth = force->numeric(FLERR,arg[0]); + + cut_lj_global = force->numeric(FLERR,arg[1]); + if (narg == 2) cut_coul = cut_lj_global; + else cut_coul = force->numeric(FLERR,arg[2]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i+1; j <= atom->ntypes; j++) + if (setflag[i][j]) + cut_lj[i][j] = cut_lj_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::coeff(int narg, char **arg) +{ + if (narg < 7 || narg > 8) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double buck6d1_one = force->numeric(FLERR,arg[2]); + double buck6d2_one = force->numeric(FLERR,arg[3]); + double buck6d3_one = force->numeric(FLERR,arg[4]); + double buck6d4_one = force->numeric(FLERR,arg[5]); + double alpha_one = force->numeric(FLERR,arg[6]); + + double cut_lj_one = cut_lj_global; + if (narg == 8) cut_lj_one = force->numeric(FLERR,arg[7]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + buck6d1[i][j] = buck6d1_one; + buck6d2[i][j] = buck6d2_one; + buck6d3[i][j] = buck6d3_one; + buck6d4[i][j] = buck6d4_one; + alpha_ij[i][j] = alpha_one; + cut_lj[i][j] = cut_lj_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::init_style() +{ + if (!atom->q_flag) + error->all(FLERR,"Pair style buck6d/coul/dsf requires atom attribute q"); + + neighbor->request(this,instance_me); + + cut_coulsq = cut_coul * cut_coul; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairBuck6dCoulGaussDSF::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + double cut = MAX(cut_lj[i][j],cut_coul); + cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; + + //calculation of smoothing coefficients c0-c5 + c0[i][j] = c1[i][j] = c2[i][j] = c3[i][j] = c4[i][j] = c5[i][j] = 0.0; + rsmooth_sq[i][j] = cut_ljsq[i][j]; + if (vdwl_smooth < 1.0) { + double rsm = vdwl_smooth * cut_lj[i][j]; + double rsm_sq = rsm * rsm; + double denom = pow((cut_lj[i][j]-rsm),5.0); + c0[i][j] = cut_lj[i][j]*cut_ljsq[i][j]*(cut_ljsq[i][j]- + 5.0*cut_lj[i][j]*rsm+10.0*rsm_sq)/denom; + c1[i][j] = -30.0*(cut_ljsq[i][j]*rsm_sq)/denom; + c2[i][j] = 30.0*(cut_ljsq[i][j]*rsm + cut_lj[i][j]*rsm_sq)/denom; + c3[i][j] = -10.0*(cut_ljsq[i][j] + 4.0*cut_lj[i][j]*rsm + rsm_sq)/denom; + c4[i][j] = 15.0*(cut_lj[i][j]+rsm)/denom; + c5[i][j] = -6.0/denom; + rsmooth_sq[i][j] = rsm_sq; + } + + // if offset_flag, shift is only invoked if there is not already smoothing + if (offset_flag && vdwl_smooth >= 1.0) { + double term1 = buck6d3[i][j]/pow(cut_lj[i][j],6.0); + double term4 = 1.0/(1.0 + (buck6d4[i][j]/pow(cut_lj[i][j],14.0))); + double rexp = exp(-cut_lj[i][j]*buck6d2[i][j]); + offset[i][j] = buck6d1[i][j]*rexp - term1*term4; + } else offset[i][j] = 0.0; + + double erfcd_c = exp(-alpha_ij[i][j]*alpha_ij[i][j]*cut_coul*cut_coul); + double erfcc_c = erf(alpha_ij[i][j]*cut_coul); + f_shift_ij[i][j] = -erfcc_c/cut_coulsq + 2.0/MY_PIS*alpha_ij[i][j]*erfcd_c/cut_coul; + e_shift_ij[i][j] = erfcc_c/cut_coul - f_shift_ij[i][j]*cut_coul; + + cut_ljsq[j][i] = cut_ljsq[i][j]; + alpha_ij[j][i] = alpha_ij[i][j]; + f_shift_ij[j][i] = f_shift_ij[i][j]; + e_shift_ij[j][i] = e_shift_ij[i][j]; + buck6d1[j][i] = buck6d1[i][j]; + buck6d2[j][i] = buck6d2[i][j]; + buck6d3[j][i] = buck6d3[i][j]; + buck6d4[j][i] = buck6d4[i][j]; + c0[j][i] = c0[i][j]; + c1[j][i] = c1[i][j]; + c2[j][i] = c2[i][j]; + c3[j][i] = c3[i][j]; + c4[j][i] = c4[i][j]; + c5[j][i] = c5[i][j]; + rsmooth_sq[j][i] = rsmooth_sq[i][j]; + offset[j][i] = offset[i][j]; + + return cut; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&buck6d1[i][j],sizeof(double),1,fp); + fwrite(&buck6d2[i][j],sizeof(double),1,fp); + fwrite(&buck6d3[i][j],sizeof(double),1,fp); + fwrite(&buck6d4[i][j],sizeof(double),1,fp); + fwrite(&alpha_ij[i][j],sizeof(double),1,fp); + fwrite(&cut_lj[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&buck6d1[i][j],sizeof(double),1,fp); + fread(&buck6d2[i][j],sizeof(double),1,fp); + fread(&buck6d3[i][j],sizeof(double),1,fp); + fread(&buck6d4[i][j],sizeof(double),1,fp); + fread(&alpha_ij[i][j],sizeof(double),1,fp); + fread(&cut_lj[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&buck6d1[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&buck6d2[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&buck6d3[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&buck6d4[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&alpha_ij[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::write_restart_settings(FILE *fp) +{ + fwrite(&vdwl_smooth,sizeof(double),1,fp); + fwrite(&cut_lj_global,sizeof(double),1,fp); + fwrite(&cut_coul,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&tail_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&vdwl_smooth,sizeof(double),1,fp); + fread(&cut_lj_global,sizeof(double),1,fp); + fread(&cut_coul,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + fread(&tail_flag,sizeof(int),1,fp); + } + MPI_Bcast(&vdwl_smooth,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&tail_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g %g %g %g\n",i, + buck6d1[i][i],buck6d2[i][i],buck6d3[i][i], + buck6d4[i][i],alpha_ij[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussDSF::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g %g %g %g\n",i,j, + buck6d1[i][j],buck6d2[i][j],buck6d3[i][j], + buck6d4[i][j],alpha_ij[i][j],cut_lj[i][j]); +} +/* ---------------------------------------------------------------------- */ + +double PairBuck6dCoulGaussDSF::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double r,r2inv,r6inv,r14inv,rexp,term1,term2,term3,term4,term5; + double rcu,rqu,sme,smf; + double erfcc,erfcd,prefactor,arg; + double forcecoul,forcebuck6d,ebuck6d,phicoul,phibuck6d; + + r2inv = 1.0/rsq; + r = sqrt(rsq); + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + r14inv = r6inv*r6inv*r2inv; + rexp = exp(-r*buck6d2[itype][jtype]); + term1 = buck6d3[itype][jtype]*r6inv; + term2 = buck6d4[itype][jtype]*r14inv; + term3 = term2*term2; + term4 = 1.0/(1.0 + term2); + term5 = 1.0/(1.0 + 2.0*term2 + term3); + forcebuck6d = buck6d1[itype][jtype]*buck6d2[itype][jtype]*r*rexp; + forcebuck6d -= term1*(6.0*term4 - term5*14.0*term2); + ebuck6d = buck6d1[itype][jtype]*rexp - term1*term4; + // smoothing term + if (rsq > rsmooth_sq[itype][jtype]) { + rcu = r*rsq; + rqu = rsq*rsq; + sme = c5[itype][jtype]*rqu*r + c4[itype][jtype]*rqu + c3[itype][jtype]*rcu + + c2[itype][jtype]*rsq + c1[itype][jtype]*r + c0[itype][jtype]; + smf = 5.0*c5[itype][jtype]*rqu + 4.0*c4[itype][jtype]*rcu + + 3.0*c3[itype][jtype]*rsq + 2.0*c2[itype][jtype]*r + c1[itype][jtype]; + // forcebuck6d is -dE/dr*r + forcebuck6d = forcebuck6d*sme - ebuck6d*smf*r; //RS was here: changed this from +E*smf to -E*smf*r + ebuck6d *= sme; + } + } else forcebuck6d = 0.0; + + if (rsq < cut_coulsq) { + prefactor = factor_coul * force->qqrd2e * atom->q[i] * atom->q[j] / r; + arg = alpha_ij[itype][jtype]*r; + erfcd = MathSpecial::expmsq(arg); + erfcc = 1 - (MathSpecial::my_erfcx(arg) * erfcd); + forcecoul = prefactor * ((erfcc/r) - (2.0/MY_PIS*alpha_ij[itype][jtype]*erfcd) + + r*f_shift_ij[itype][jtype]) * r; + } else forcecoul = 0.0; + + fforce = (forcecoul + factor_lj*forcebuck6d) * r2inv; + + double eng = 0.0; + if (rsq < cut_ljsq[itype][jtype]) { + phibuck6d = ebuck6d - offset[itype][jtype]; + eng += factor_lj*phibuck6d; + } + + if (rsq < cut_coulsq) { + phicoul = prefactor * (erfcc - r*e_shift_ij[itype][jtype] - + rsq*f_shift_ij[itype][jtype]); + eng += phicoul; + } + + return eng; +} + +/* ---------------------------------------------------------------------- */ + +void *PairBuck6dCoulGaussDSF::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"cut_ljsq") == 0) return (void *) cut_ljsq; + if (strcmp(str,"buck6d1") == 0) return (void *) buck6d1; + if (strcmp(str,"buck6d2") == 0) return (void *) buck6d2; + if (strcmp(str,"buck6d3") == 0) return (void *) buck6d3; + if (strcmp(str,"buck6d4") == 0) return (void *) buck6d4; + if (strcmp(str,"rsmooth_sq") == 0) return (void *) rsmooth_sq; + if (strcmp(str,"c0") == 0) return (void *) c0; + if (strcmp(str,"c1") == 0) return (void *) c1; + if (strcmp(str,"c2") == 0) return (void *) c2; + if (strcmp(str,"c3") == 0) return (void *) c3; + if (strcmp(str,"c4") == 0) return (void *) c4; + if (strcmp(str,"c5") == 0) return (void *) c5; + if (strcmp(str,"offset") == 0) return (void *) offset; + + if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_coul; + } + return NULL; +} diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.h b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.h new file mode 100644 index 0000000000..65acc400de --- /dev/null +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_dsf.h @@ -0,0 +1,79 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(buck6d/coul/gauss/dsf,PairBuck6dCoulGaussDSF) + +#else + +#ifndef LMP_PAIR_BUCK6D_COUL_GAUSS_DSF_H +#define LMP_PAIR_BUCK6D_COUL_GAUSS_DSF_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairBuck6dCoulGaussDSF : public Pair { + public: + PairBuck6dCoulGaussDSF(class LAMMPS *); + virtual ~PairBuck6dCoulGaussDSF(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + virtual void init_style(); + virtual double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + double single(int, int, int, int, double, double, double, double &); + void *extract(const char *, int &); + + protected: + double cut_lj_global; + double **cut_lj,**cut_ljsq; + double **alpha_ij; + double **buck6d1,**buck6d2,**buck6d3,**buck6d4,**offset; + double **f_shift_ij,**e_shift_ij; + double cut_coul,cut_coulsq; + double vdwl_smooth; + double **c0,**c1,**c2,**c3,**c4,**c5,**rsmooth_sq; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair style lj/cut/coul/dsf requires atom attribute q + +The atom style defined does not have these attributes. + +*/ diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp new file mode 100644 index 0000000000..46ef91f0b1 --- /dev/null +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.cpp @@ -0,0 +1,646 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hendrik Heenen (Technical University of Munich) + and Rochus Schmid (Ruhr-Universitaet Bochum) + References: Bureekaew and Schmid, Phys. Status Solidi B 250, 1128 (2013) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_buck6d_coul_gauss_long.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "kspace.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "memory.h" +#include "math_const.h" +#include "error.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 + +/* ---------------------------------------------------------------------- */ + +PairBuck6dCoulGaussLong::PairBuck6dCoulGaussLong(LAMMPS *lmp) : Pair(lmp) +{ + ewaldflag = pppmflag = 1; + single_enable = 1; + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairBuck6dCoulGaussLong::~PairBuck6dCoulGaussLong() +{ + if (!copymode) { + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(alpha_ij); + memory->destroy(buck6d1); + memory->destroy(buck6d2); + memory->destroy(buck6d3); + memory->destroy(buck6d4); + memory->destroy(c0); + memory->destroy(c1); + memory->destroy(c2); + memory->destroy(c3); + memory->destroy(c4); + memory->destroy(c5); + memory->destroy(rsmooth_sq); + memory->destroy(offset); + } + } +} + +/* ---------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double r,rsq,r2inv,r6inv,r14inv,rexp,forcecoul,forcebuck6d,factor_coul,factor_lj; + double grij,expm2,erf; + double term1,term2,term3,term4,term5; + double rcu,rqu,sme,smf,ebuck6d,ealpha; + double prefactor,erfa,expa,t,arg,falpha; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + double *special_coul = force->special_coul; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + r = sqrt(rsq); + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + r14inv = r6inv*r6inv*r2inv; + rexp = exp(-r*buck6d2[itype][jtype]); + term1 = buck6d3[itype][jtype]*r6inv; + term2 = buck6d4[itype][jtype]*r14inv; + term3 = term2*term2; + term4 = 1.0/(1.0 + term2); + term5 = 1.0/(1.0 + 2.0*term2 + term3); + forcebuck6d = buck6d1[itype][jtype]*buck6d2[itype][jtype]*r*rexp; + forcebuck6d -= term1*(6.0*term4 - term5*14.0*term2); + ebuck6d = buck6d1[itype][jtype]*rexp - term1*term4; + + // smoothing term + if (rsq > rsmooth_sq[itype][jtype]) { + rcu = r*rsq; + rqu = rsq*rsq; + sme = c5[itype][jtype]*rqu*r + c4[itype][jtype]*rqu + c3[itype][jtype]*rcu + + c2[itype][jtype]*rsq + c1[itype][jtype]*r + c0[itype][jtype]; + smf = 5.0*c5[itype][jtype]*rqu + 4.0*c4[itype][jtype]*rcu + + 3.0*c3[itype][jtype]*rsq + 2.0*c2[itype][jtype]*r + c1[itype][jtype]; + // forcebuck6d is -dE/dr*r + forcebuck6d = forcebuck6d*sme - ebuck6d*smf*r; + ebuck6d *= sme; + } + } else forcebuck6d = 0.0; + + if (rsq < cut_coulsq) { + // long range - real space + grij = g_ewald * r; + expm2 = MathSpecial::expmsq(grij); + erf = 1 - (MathSpecial::my_erfcx(grij) * expm2); + + // gaussian for 1/r alpha_ij contribution + arg = alpha_ij[itype][jtype]*r; + expa = MathSpecial::expmsq(arg); + erfa = 1 - (MathSpecial::my_erfcx(arg) * expa); + + prefactor = qqrd2e*qtmp*q[j]/r; + falpha = erfa - EWALD_F*arg*expa; + forcecoul = prefactor * (falpha - erf + EWALD_F*grij*expm2); + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor*falpha; + + // (q*q/r) * (gauss(alpha_ij) - gauss(alpha_long) + ealpha = prefactor * (erfa-erf); + // smoothing term - NOTE: ingnored in special_bonds correction + // since likely rsmooth_sq_c >> d(special) + if (rsq > rsmooth_sq_c) { + rcu = r*rsq; + rqu = rsq*rsq; + sme = c5_c*rqu*r + c4_c*rqu + c3_c*rcu + c2_c*rsq + c1_c*r + c0_c; + smf = 5.0*c5_c*rqu + 4.0*c4_c*rcu + 3.0*c3_c*rsq + 2.0*c2_c*r + c1_c; + forcecoul = forcecoul*sme - ealpha*smf*r; + ealpha *= sme; + } + } else forcecoul = 0.0; + + + fpair = (forcecoul + factor_lj*forcebuck6d) * r2inv; + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = ebuck6d - offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + + if (rsq < cut_coulsq) { + ecoul = ealpha; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor*erfa; + } else ecoul = 0.0; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,ecoul,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut_lj,n+1,n+1,"pair:cut_lj"); + memory->create(cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memory->create(alpha_ij,n+1,n+1,"pair:alpha_ij"); + memory->create(buck6d1,n+1,n+1,"pair:buck6d1"); + memory->create(buck6d2,n+1,n+1,"pair:buck6d2"); + memory->create(buck6d3,n+1,n+1,"pair:buck6d3"); + memory->create(buck6d4,n+1,n+1,"pair:buck6d4"); + memory->create(c0,n+1,n+1,"pair:c0"); + memory->create(c1,n+1,n+1,"pair:c1"); + memory->create(c2,n+1,n+1,"pair:c2"); + memory->create(c3,n+1,n+1,"pair:c3"); + memory->create(c4,n+1,n+1,"pair:c4"); + memory->create(c5,n+1,n+1,"pair:c5"); + memory->create(rsmooth_sq,n+1,n+1,"pair:rsmooth_sq"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::settings(int narg, char **arg) +{ + if (narg < 3 || narg > 4) error->all(FLERR,"Illegal pair_style command"); + + vdwl_smooth = force->numeric(FLERR,arg[0]); + coul_smooth = force->numeric(FLERR,arg[1]); + + cut_lj_global = force->numeric(FLERR,arg[2]); + if (narg == 3) cut_coul = cut_lj_global; + else cut_coul = force->numeric(FLERR,arg[3]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i+1; j <= atom->ntypes; j++) + if (setflag[i][j]) + cut_lj[i][j] = cut_lj_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::coeff(int narg, char **arg) +{ + if (narg < 7 || narg > 8) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double buck6d1_one = force->numeric(FLERR,arg[2]); + double buck6d2_one = force->numeric(FLERR,arg[3]); + double buck6d3_one = force->numeric(FLERR,arg[4]); + double buck6d4_one = force->numeric(FLERR,arg[5]); + double alpha_one = force->numeric(FLERR,arg[6]); + + double cut_lj_one = cut_lj_global; + if (narg == 8) cut_lj_one = force->numeric(FLERR,arg[7]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + buck6d1[i][j] = buck6d1_one; + buck6d2[i][j] = buck6d2_one; + buck6d3[i][j] = buck6d3_one; + buck6d4[i][j] = buck6d4_one; + alpha_ij[i][j] = alpha_one; + cut_lj[i][j] = cut_lj_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::init_style() +{ + if (!atom->q_flag) + error->all(FLERR,"Pair style buck6d/coul/dsf requires atom attribute q"); + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + g_ewald = force->kspace->g_ewald; + + neighbor->request(this,instance_me); + + cut_coulsq = cut_coul * cut_coul; + + //calculation of smoothing coefficients c0_c-c5_c for coulomb smoothing + c0_c = c1_c = c2_c = c3_c = c4_c = c5_c = 0.0; + rsmooth_sq_c = cut_coulsq; + if (coul_smooth < 1.0) { + double rsm = coul_smooth * cut_coul; + double rsm_sq = rsm * rsm; + double denom = pow((cut_coul-rsm),5.0); + c0_c = cut_coul*cut_coulsq*(cut_coulsq- + 5.0*cut_coul*rsm+10.0*rsm_sq)/denom; + c1_c = -30.0*(cut_coulsq*rsm_sq)/denom; + c2_c = 30.0*(cut_coulsq*rsm + cut_coul*rsm_sq)/denom; + c3_c = -10.0*(cut_coulsq + 4.0*cut_coul*rsm + rsm_sq)/denom; + c4_c = 15.0*(cut_coul+rsm)/denom; + c5_c = -6.0/denom; + rsmooth_sq_c = rsm_sq; + } +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairBuck6dCoulGaussLong::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + double cut = MAX(cut_lj[i][j],cut_coul); + cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; + + //calculation of smoothing coefficients c0-c5 + c0[i][j] = c1[i][j] = c2[i][j] = c3[i][j] = c4[i][j] = c5[i][j] = 0.0; + rsmooth_sq[i][j] = cut_ljsq[i][j]; + if (vdwl_smooth < 1.0) { + double rsm = vdwl_smooth * cut_lj[i][j]; + double rsm_sq = rsm * rsm; + double denom = pow((cut_lj[i][j]-rsm),5.0); + c0[i][j] = cut_lj[i][j]*cut_ljsq[i][j]*(cut_ljsq[i][j]- + 5.0*cut_lj[i][j]*rsm+10.0*rsm_sq)/denom; + c1[i][j] = -30.0*(cut_ljsq[i][j]*rsm_sq)/denom; + c2[i][j] = 30.0*(cut_ljsq[i][j]*rsm + cut_lj[i][j]*rsm_sq)/denom; + c3[i][j] = -10.0*(cut_ljsq[i][j] + 4.0*cut_lj[i][j]*rsm + rsm_sq)/denom; + c4[i][j] = 15.0*(cut_lj[i][j]+rsm)/denom; + c5[i][j] = -6.0/denom; + rsmooth_sq[i][j] = rsm_sq; + } + + // if offset_flag, shift is only invoked if there is not already smoothing + if (offset_flag && vdwl_smooth >= 1.0) { + double term1 = buck6d3[i][j]/pow(cut_lj[i][j],6.0); + double term4 = 1.0/(1.0 + (buck6d4[i][j]/pow(cut_lj[i][j],14.0))); + double rexp = exp(-cut_lj[i][j]*buck6d2[i][j]); + offset[i][j] = buck6d1[i][j]*rexp - term1*term4; + } else offset[i][j] = 0.0; + + cut_ljsq[j][i] = cut_ljsq[i][j]; + alpha_ij[j][i] = alpha_ij[i][j]; + buck6d1[j][i] = buck6d1[i][j]; + buck6d2[j][i] = buck6d2[i][j]; + buck6d3[j][i] = buck6d3[i][j]; + buck6d4[j][i] = buck6d4[i][j]; + c0[j][i] = c0[i][j]; + c1[j][i] = c1[i][j]; + c2[j][i] = c2[i][j]; + c3[j][i] = c3[i][j]; + c4[j][i] = c4[i][j]; + c5[j][i] = c5[i][j]; + rsmooth_sq[j][i] = rsmooth_sq[i][j]; + offset[j][i] = offset[i][j]; + + return cut; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&buck6d1[i][j],sizeof(double),1,fp); + fwrite(&buck6d2[i][j],sizeof(double),1,fp); + fwrite(&buck6d3[i][j],sizeof(double),1,fp); + fwrite(&buck6d4[i][j],sizeof(double),1,fp); + fwrite(&alpha_ij[i][j],sizeof(double),1,fp); + fwrite(&cut_lj[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&buck6d1[i][j],sizeof(double),1,fp); + fread(&buck6d2[i][j],sizeof(double),1,fp); + fread(&buck6d3[i][j],sizeof(double),1,fp); + fread(&buck6d4[i][j],sizeof(double),1,fp); + fread(&alpha_ij[i][j],sizeof(double),1,fp); + fread(&cut_lj[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&buck6d1[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&buck6d2[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&buck6d3[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&buck6d4[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&alpha_ij[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::write_restart_settings(FILE *fp) +{ + fwrite(&vdwl_smooth,sizeof(double),1,fp); + fwrite(&coul_smooth,sizeof(double),1,fp); + fwrite(&cut_lj_global,sizeof(double),1,fp); + fwrite(&cut_coul,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&tail_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&vdwl_smooth,sizeof(double),1,fp); + fread(&coul_smooth,sizeof(double),1,fp); + fread(&cut_lj_global,sizeof(double),1,fp); + fread(&cut_coul,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + fread(&tail_flag,sizeof(int),1,fp); + } + MPI_Bcast(&vdwl_smooth,1,MPI_DOUBLE,0,world); + MPI_Bcast(&coul_smooth,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&tail_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g %g %g %g\n",i, + buck6d1[i][i],buck6d2[i][i],buck6d3[i][i], + buck6d4[i][i],alpha_ij[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairBuck6dCoulGaussLong::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g %g %g %g\n",i,j, + buck6d1[i][j],buck6d2[i][j],buck6d3[i][j], + buck6d4[i][j],alpha_ij[i][j],cut_lj[i][j]); +} +/* ---------------------------------------------------------------------- */ + +double PairBuck6dCoulGaussLong::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double r,r2inv,r6inv,r14inv,rexp,term1,term2,term3,term4,term5; + double rcu,rqu,sme,smf; + double erfa,expa,prefactor,arg,falpha,ealpha; + double grij,expm2,erf; + double forcecoul,forcebuck6d,ebuck6d,phicoul,phibuck6d; + + r2inv = 1.0/rsq; + r = sqrt(rsq); + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + r14inv = r6inv*r6inv*r2inv; + rexp = exp(-r*buck6d2[itype][jtype]); + term1 = buck6d3[itype][jtype]*r6inv; + term2 = buck6d4[itype][jtype]*r14inv; + term3 = term2*term2; + term4 = 1.0/(1.0 + term2); + term5 = 1.0/(1.0 + 2.0*term2 + term3); + forcebuck6d = buck6d1[itype][jtype]*buck6d2[itype][jtype]*r*rexp; + forcebuck6d -= term1*(6.0*term4 - term5*14.0*term2); + ebuck6d = buck6d1[itype][jtype]*rexp - term1*term4; + // smoothing term + if (rsq > rsmooth_sq[itype][jtype]) { + rcu = r*rsq; + rqu = rsq*rsq; + sme = c5[itype][jtype]*rqu*r + c4[itype][jtype]*rqu + c3[itype][jtype]*rcu + + c2[itype][jtype]*rsq + c1[itype][jtype]*r + c0[itype][jtype]; + smf = 5.0*c5[itype][jtype]*rqu + 4.0*c4[itype][jtype]*rcu + + 3.0*c3[itype][jtype]*rsq + 2.0*c2[itype][jtype]*r + c1[itype][jtype]; + // forcebuck6d is -dE/dr*r + forcebuck6d = forcebuck6d*sme - ebuck6d*smf*r; //RS was here: changed this from +E*smf to -E*smf*r + ebuck6d *= sme; + } + } else forcebuck6d = 0.0; + + if (rsq < cut_coulsq) { + // long range - real space + grij = g_ewald * r; + expm2 = MathSpecial::expmsq(grij); + erf = 1 - (MathSpecial::my_erfcx(grij) * expm2); + + // gaussian for 1/r alpha_ij contribution + arg = alpha_ij[itype][jtype]*r; + expa = MathSpecial::expmsq(arg); + erfa = 1 - (MathSpecial::my_erfcx(arg) * expa); + + prefactor = force->qqrd2e * atom->q[i] * atom->q[j] / r; + falpha = erfa - EWALD_F*arg*expa; + forcecoul = prefactor * (falpha - erf + EWALD_F*grij*expm2); + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor*falpha; + + ealpha = prefactor * (erfa-erf); + // smoothing term + if (rsq > rsmooth_sq_c) { + rcu = r*rsq; + rqu = rsq*rsq; + sme = c5_c*rqu*r + c4_c*rqu + c3_c*rcu + c2_c*rsq + c1_c*r + c0_c; + smf = 5.0*c5_c*rqu + 4.0*c4_c*rcu + 3.0*c3_c*rsq + 2.0*c2_c*r + c1_c; + forcecoul = forcecoul*sme - ealpha*smf*r; + ealpha *= sme; + } + } else forcecoul = 0.0; + + fforce = (forcecoul + factor_lj*forcebuck6d) * r2inv; + + double eng = 0.0; + if (rsq < cut_ljsq[itype][jtype]) { + phibuck6d = ebuck6d - offset[itype][jtype]; + eng += factor_lj*phibuck6d; + } + + if (rsq < cut_coulsq) { + phicoul = ealpha; + if (factor_coul < 1.0) phicoul -= (1.0-factor_coul)*prefactor*erfa; + eng += phicoul; + } + + return eng; +} + +/* ---------------------------------------------------------------------- */ + +void *PairBuck6dCoulGaussLong::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"cut_ljsq") == 0) return (void *) cut_ljsq; + if (strcmp(str,"buck6d1") == 0) return (void *) buck6d1; + if (strcmp(str,"buck6d2") == 0) return (void *) buck6d2; + if (strcmp(str,"buck6d3") == 0) return (void *) buck6d3; + if (strcmp(str,"buck6d4") == 0) return (void *) buck6d4; + if (strcmp(str,"rsmooth_sq") == 0) return (void *) rsmooth_sq; + if (strcmp(str,"c0") == 0) return (void *) c0; + if (strcmp(str,"c1") == 0) return (void *) c1; + if (strcmp(str,"c2") == 0) return (void *) c2; + if (strcmp(str,"c3") == 0) return (void *) c3; + if (strcmp(str,"c4") == 0) return (void *) c4; + if (strcmp(str,"c5") == 0) return (void *) c5; + if (strcmp(str,"offset") == 0) return (void *) offset; + + if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_coul; + } + return NULL; +} diff --git a/src/USER-MOFFF/pair_buck6d_coul_gauss_long.h b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.h new file mode 100644 index 0000000000..0cfd45b69b --- /dev/null +++ b/src/USER-MOFFF/pair_buck6d_coul_gauss_long.h @@ -0,0 +1,80 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(buck6d/coul/gauss/long,PairBuck6dCoulGaussLong) + +#else + +#ifndef LMP_PAIR_BUCK6D_COUL_GAUSS_LONG_H +#define LMP_PAIR_BUCK6D_COUL_GAUSS_LONG_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairBuck6dCoulGaussLong : public Pair { + public: + PairBuck6dCoulGaussLong(class LAMMPS *); + virtual ~PairBuck6dCoulGaussLong(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + virtual void init_style(); + virtual double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + double single(int, int, int, int, double, double, double, double &); + void *extract(const char *, int &); + + protected: + double cut_lj_global; + double **cut_lj,**cut_ljsq; + double **alpha_ij; + double **buck6d1,**buck6d2,**buck6d3,**buck6d4,**offset; + double cut_coul, cut_coulsq; + double vdwl_smooth, coul_smooth; + double c0_c,c1_c,c2_c,c3_c,c4_c,c5_c,rsmooth_sq_c; + double **c0,**c1,**c2,**c3,**c4,**c5,**rsmooth_sq; + double g_ewald; + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair style lj/cut/coul/dsf requires atom attribute q + +The atom style defined does not have these attributes. + +*/ diff --git a/src/USER-MOLFILE/molfile_interface.cpp b/src/USER-MOLFILE/molfile_interface.cpp index 37f343736d..9c0c15f1ee 100644 --- a/src/USER-MOLFILE/molfile_interface.cpp +++ b/src/USER-MOLFILE/molfile_interface.cpp @@ -107,7 +107,7 @@ extern "C" { * J. Phys. Chem., 68, 441 - 452, 1964, * except the value for H, which is taken from R.S. Rowland & R. Taylor, * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in - * either of these publications have RvdW = 2.00 Å. + * either of these publications have RvdW = 2.00 \AA. * The radii for Ions (Na, K, Cl, Ca, Mg, and Cs are based on the CHARMM27 * Rmin/2 parameters for (SOD, POT, CLA, CAL, MG, CES) by default. */ diff --git a/src/USER-NETCDF/dump_netcdf.cpp b/src/USER-NETCDF/dump_netcdf.cpp index b45794126d..4147b3897d 100644 --- a/src/USER-NETCDF/dump_netcdf.cpp +++ b/src/USER-NETCDF/dump_netcdf.cpp @@ -43,7 +43,8 @@ using namespace LAMMPS_NS; using namespace MathConst; -enum{INT,FLOAT,BIGINT}; // same as in thermo.cpp +enum{THERMO_INT,THERMO_FLOAT,THERMO_BIGINT}; // same as in thermo.cpp +enum{DUMP_INT,DUMP_DOUBLE,DUMP_STRING,DUMP_BIGINT}; // same as in DumpCFG const char NC_FRAME_STR[] = "frame"; const char NC_SPATIAL_STR[] = "spatial"; @@ -70,6 +71,9 @@ const int THIS_IS_A_BIGINT = -4; #define NCERR(x) ncerr(x, NULL, __LINE__) #define NCERRX(x, descr) ncerr(x, descr, __LINE__) +#if !defined(NC_64BIT_DATA) +#define NC_64BIT_DATA NC_64BIT_OFFSET +#endif /* ---------------------------------------------------------------------- */ @@ -85,8 +89,8 @@ DumpNetCDF::DumpNetCDF(LAMMPS *lmp, int narg, char **arg) : if (multiproc) error->all(FLERR,"Multi-processor writes are not supported."); - if (multifile) - error->all(FLERR,"Multiple files are not supported."); + if (append_flag && multifile) + error->all(FLERR,"Cannot append when writing to multiple files."); perat = new nc_perat_t[nfield]; @@ -118,10 +122,6 @@ DumpNetCDF::DumpNetCDF(LAMMPS *lmp, int narg, char **arg) : ndims = 3; strcpy(mangled, "velocities"); } - // extensions to the AMBER specification - else if (!strcmp(mangled, "type")) { - strcpy(mangled, "atom_types"); - } else if (!strcmp(mangled, "xs") || !strcmp(mangled, "ys") || !strcmp(mangled, "zs")) { idim = mangled[0] - 'x'; @@ -221,6 +221,24 @@ DumpNetCDF::~DumpNetCDF() void DumpNetCDF::openfile() { + char *filecurrent = filename; + if (multifile && !singlefile_opened) { + char *filestar = filecurrent; + filecurrent = new char[strlen(filestar) + 16]; + char *ptr = strchr(filestar,'*'); + *ptr = '\0'; + if (padflag == 0) + sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", + filestar,update->ntimestep,ptr+1); + else { + char bif[8],pad[16]; + strcpy(bif,BIGINT_FORMAT); + sprintf(pad,"%%s%%0%d%s%%s",padflag,&bif[1]); + sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1); + } + *ptr = '*'; + } + if (thermo && !singlefile_opened) { if (thermovar) delete [] thermovar; thermovar = new int[output->thermo->nfield]; @@ -265,14 +283,14 @@ void DumpNetCDF::openfile() ntotalgr = group->count(igroup); if (filewriter) { - if (append_flag && access(filename, F_OK) != -1) { + if (append_flag && !multifile && access(filecurrent, F_OK) != -1) { // Fixme! Perform checks if dimensions and variables conform with // data structure standard. if (singlefile_opened) return; singlefile_opened = 1; - NCERRX( nc_open(filename, NC_WRITE, &ncid), filename ); + NCERRX( nc_open(filecurrent, NC_WRITE, &ncid), filecurrent ); // dimensions NCERRX( nc_inq_dimid(ncid, NC_FRAME_STR, &frame_dim), NC_FRAME_STR ); @@ -304,19 +322,6 @@ void DumpNetCDF::openfile() // variables specified in the input file for (int i = 0; i < n_perat; i++) { - nc_type xtype; - - // Type mangling - if (vtype[perat[i].field[0]] == INT) { - xtype = NC_INT; - } - else { - if (double_precision) - xtype = NC_DOUBLE; - else - xtype = NC_FLOAT; - } - NCERRX( nc_inq_varid(ncid, perat[i].name, &perat[i].var), perat[i].name ); } @@ -334,10 +339,13 @@ void DumpNetCDF::openfile() NCERR( nc_inq_dimlen(ncid, frame_dim, &nframes) ); // framei == -1 means append to file, == -2 means override last frame // Note that in the input file this translates to 'yes', '-1', etc. - if (framei < 0 || (append_flag && framei == 0)) framei = nframes+framei+1; + + if (framei <= 0) framei = nframes+framei+1; if (framei < 1) framei = 1; - } - else { + } else { + if (framei != 0 && !multifile) + error->all(FLERR,"at keyword requires use of 'append yes'"); + int dims[NC_MAX_VAR_DIMS]; size_t index[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS]; double d[1]; @@ -345,8 +353,8 @@ void DumpNetCDF::openfile() if (singlefile_opened) return; singlefile_opened = 1; - NCERRX( nc_create(filename, NC_64BIT_DATA, &ncid), - filename ); + NCERRX( nc_create(filecurrent, NC_64BIT_DATA, &ncid), + filecurrent ); // dimensions NCERRX( nc_def_dim(ncid, NC_FRAME_STR, NC_UNLIMITED, &frame_dim), @@ -398,10 +406,11 @@ void DumpNetCDF::openfile() nc_type xtype; // Type mangling - if (vtype[perat[i].field[0]] == INT) { + if (vtype[perat[i].field[0]] == DUMP_INT) { xtype = NC_INT; - } - else { + } else if (vtype[perat[i].field[0]] == DUMP_BIGINT) { + xtype = NC_INT64; + } else { if (double_precision) xtype = NC_DOUBLE; else @@ -465,17 +474,22 @@ void DumpNetCDF::openfile() if (thermo) { Thermo *th = output->thermo; for (int i = 0; i < th->nfield; i++) { - if (th->vtype[i] == FLOAT) { + if (th->vtype[i] == THERMO_FLOAT) { NCERRX( nc_def_var(ncid, th->keyword[i], NC_DOUBLE, 1, dims, &thermovar[i]), th->keyword[i] ); } - else if (th->vtype[i] == INT) { + else if (th->vtype[i] == THERMO_INT) { NCERRX( nc_def_var(ncid, th->keyword[i], NC_INT, 1, dims, &thermovar[i]), th->keyword[i] ); } - else if (th->vtype[i] == BIGINT) { + else if (th->vtype[i] == THERMO_BIGINT) { +#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG) + NCERRX( nc_def_var(ncid, th->keyword[i], NC_INT64, 1, dims, + &thermovar[i]), th->keyword[i] ); +#else NCERRX( nc_def_var(ncid, th->keyword[i], NC_LONG, 1, dims, &thermovar[i]), th->keyword[i] ); +#endif } } } @@ -583,6 +597,7 @@ void DumpNetCDF::openfile() count[1] = 5; NCERR( nc_put_vara_text(ncid, cell_angular_var, index, count, "gamma") ); + append_flag = 1; framei = 1; } } @@ -595,15 +610,85 @@ void DumpNetCDF::closefile() if (filewriter && singlefile_opened) { NCERR( nc_close(ncid) ); singlefile_opened = 0; - // append next time DumpNetCDF::openfile is called - append_flag = 1; // write to next frame upon next open - framei++; + if (multifile) + framei = 1; + else { + // append next time DumpNetCDF::openfile is called + append_flag = 1; + framei++; + } } } /* ---------------------------------------------------------------------- */ +template +int nc_put_var1_bigint(int ncid, int varid, const size_t index[], const T* tp) +{ + return nc_put_var1_int(ncid, varid, index, tp); +} + +template <> +int nc_put_var1_bigint(int ncid, int varid, const size_t index[], + const long* tp) +{ + return nc_put_var1_long(ncid, varid, index, tp); +} + +template <> +int nc_put_var1_bigint(int ncid, int varid, const size_t index[], + const long long* tp) +{ + return nc_put_var1_longlong(ncid, varid, index, tp); +} + +template +int nc_put_vara_bigint(int ncid, int varid, const size_t start[], + const size_t count[], const T* tp) +{ + return nc_put_vara_int(ncid, varid, start, count, tp); +} + +template <> +int nc_put_vara_bigint(int ncid, int varid, const size_t start[], + const size_t count[], const long* tp) +{ + return nc_put_vara_long(ncid, varid, start, count, tp); +} + +template <> +int nc_put_vara_bigint(int ncid, int varid, const size_t start[], + const size_t count[], const long long* tp) +{ + return nc_put_vara_longlong(ncid, varid, start, count, tp); +} + +template +int nc_put_vars_bigint(int ncid, int varid, const size_t start[], + const size_t count[], const ptrdiff_t stride[], + const T* tp) +{ + return nc_put_vars_int(ncid, varid, start, count, stride, tp); +} + +template <> +int nc_put_vars_bigint(int ncid, int varid, const size_t start[], + const size_t count[], const ptrdiff_t stride[], + const long* tp) +{ + return nc_put_vars_long(ncid, varid, start, count, stride, tp); +} + +template <> +int nc_put_vars_bigint(int ncid, int varid, const size_t start[], + const size_t count[], + const ptrdiff_t stride[], + const long long* tp) +{ + return nc_put_vars_longlong(ncid, varid, start, count, stride, tp); +} + void DumpNetCDF::write() { // open file @@ -625,23 +710,18 @@ void DumpNetCDF::write() for (int i = 0; i < th->nfield; i++) { th->call_vfunc(i); if (filewriter) { - if (th->vtype[i] == FLOAT) { + if (th->vtype[i] == THERMO_FLOAT) { NCERRX( nc_put_var1_double(ncid, thermovar[i], start, &th->dvalue), th->keyword[i] ); } - else if (th->vtype[i] == INT) { + else if (th->vtype[i] == THERMO_INT) { NCERRX( nc_put_var1_int(ncid, thermovar[i], start, &th->ivalue), th->keyword[i] ); } - else if (th->vtype[i] == BIGINT) { -#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG) - NCERRX( nc_put_var1_long(ncid, thermovar[i], start, &th->bivalue), + else if (th->vtype[i] == THERMO_BIGINT) { + NCERRX( nc_put_var1_bigint(ncid, thermovar[i], start, &th->bivalue), th->keyword[i] ); -#else - NCERRX( nc_put_var1_int(ncid, thermovar[i], start, &th->bivalue), - th->keyword[i] ); -#endif } } } @@ -740,16 +820,16 @@ void DumpNetCDF::write_data(int n, double *mybuf) if (!int_buffer) { n_buffer = n; - int_buffer = (int *) - memory->smalloc(n*sizeof(int),"dump::int_buffer"); + int_buffer = (bigint *) + memory->smalloc(n*sizeof(bigint),"dump::int_buffer"); double_buffer = (double *) memory->smalloc(n*sizeof(double),"dump::double_buffer"); } if (n > n_buffer) { n_buffer = n; - int_buffer = (int *) - memory->srealloc(int_buffer, n*sizeof(int),"dump::int_buffer"); + int_buffer = (bigint *) + memory->srealloc(int_buffer, n*sizeof(bigint),"dump::int_buffer"); double_buffer = (double *) memory->srealloc(double_buffer, n*sizeof(double),"dump::double_buffer"); } @@ -769,7 +849,7 @@ void DumpNetCDF::write_data(int n, double *mybuf) for (int i = 0; i < n_perat; i++) { int iaux = perat[i].field[0]; - if (vtype[iaux] == INT) { + if (vtype[iaux] == DUMP_INT || vtype[iaux] == DUMP_BIGINT) { // integers if (perat[i].dims > 1) { @@ -777,41 +857,55 @@ void DumpNetCDF::write_data(int n, double *mybuf) iaux = perat[i].field[idim]; if (iaux >= 0) { - for (int j = 0; j < n; j++, iaux+=size_one) { - int_buffer[j] = mybuf[iaux]; + if (vtype[iaux] == DUMP_INT) { + for (int j = 0; j < n; j++, iaux+=size_one) { + int_buffer[j] = static_cast(mybuf[iaux]); + } + } + else { // DUMP_BIGINT + for (int j = 0; j < n; j++, iaux+=size_one) { + int_buffer[j] = static_cast(mybuf[iaux]); + } } start[2] = idim; if (perat[i].constant) { if (perat[i].ndumped < ntotalgr) { - NCERR( nc_put_vars_int(ncid, perat[i].var, - start+1, count+1, stride+1, - int_buffer) ); + NCERR( nc_put_vars_bigint(ncid, perat[i].var, + start+1, count+1, stride+1, + int_buffer) ); perat[i].ndumped += n; } } else - NCERR( nc_put_vars_int(ncid, perat[i].var, start, count, stride, - int_buffer) ); + NCERR( nc_put_vars_bigint(ncid, perat[i].var, start, count, stride, + int_buffer) ); } } } else { - for (int j = 0; j < n; j++, iaux+=size_one) { - int_buffer[j] = mybuf[iaux]; + if (vtype[iaux] == DUMP_INT) { + for (int j = 0; j < n; j++, iaux+=size_one) { + int_buffer[j] = static_cast(mybuf[iaux]); + } + } + else { // DUMP_BIGINT + for (int j = 0; j < n; j++, iaux+=size_one) { + int_buffer[j] = static_cast(mybuf[iaux]); + } } if (perat[i].constant) { if (perat[i].ndumped < ntotalgr) { - NCERR( nc_put_vara_int(ncid, perat[i].var, start+1, count+1, - int_buffer) ); + NCERR( nc_put_vara_bigint(ncid, perat[i].var, start+1, count+1, + int_buffer) ); perat[i].ndumped += n; } } else - NCERR( nc_put_vara_int(ncid, perat[i].var, start, count, - int_buffer) ); + NCERR( nc_put_vara_bigint(ncid, perat[i].var, start, count, + int_buffer) ); } } else { @@ -885,8 +979,11 @@ int DumpNetCDF::modify_param(int narg, char **arg) } else if (strcmp(arg[iarg],"at") == 0) { iarg++; + if (iarg >= narg) + error->all(FLERR,"expected additional arg after 'at' keyword."); framei = force->inumeric(FLERR,arg[iarg]); - if (framei < 0) framei--; + if (framei == 0) error->all(FLERR,"frame 0 not allowed for 'at' keyword."); + else if (framei < 0) framei--; iarg++; return 2; } @@ -908,68 +1005,6 @@ int DumpNetCDF::modify_param(int narg, char **arg) /* ---------------------------------------------------------------------- */ -void DumpNetCDF::write_prmtop() -{ - char fn[1024]; - char tmp[81]; - FILE *f; - - strcpy(fn, filename); - strcat(fn, ".prmtop"); - - f = fopen(fn, "w"); - fprintf(f, "%%VERSION LAMMPS\n"); - fprintf(f, "%%FLAG TITLE\n"); - fprintf(f, "%%FORMAT(20a4)\n"); - memset(tmp, ' ', 76); - tmp[76] = '\0'; - fprintf(f, "NASN%s\n", tmp); - - fprintf(f, "%%FLAG POINTERS\n"); - fprintf(f, "%%FORMAT(10I8)\n"); -#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG) - fprintf(f, "%8li", ntotalgr); -#else - fprintf(f, "%8i", ntotalgr); -#endif - for (int i = 0; i < 11; i++) - fprintf(f, "%8i", 0); - fprintf(f, "\n"); - for (int i = 0; i < 12; i++) - fprintf(f, "%8i", 0); - fprintf(f, "\n"); - for (int i = 0; i < 6; i++) - fprintf(f, "%8i", 0); - fprintf(f, "\n"); - - fprintf(f, "%%FLAG ATOM_NAME\n"); - fprintf(f, "%%FORMAT(20a4)\n"); - for (int i = 0; i < ntotalgr; i++) { - fprintf(f, "%4s", "He"); - if ((i+1) % 20 == 0) - fprintf(f, "\n"); - } - - fprintf(f, "%%FLAG CHARGE\n"); - fprintf(f, "%%FORMAT(5E16.5)\n"); - for (int i = 0; i < ntotalgr; i++) { - fprintf(f, "%16.5e", 0.0); - if ((i+1) % 5 == 0) - fprintf(f, "\n"); - } - - fprintf(f, "%%FLAG MASS\n"); - fprintf(f, "%%FORMAT(5E16.5)\n"); - for (int i = 0; i < ntotalgr; i++) { - fprintf(f, "%16.5e", 1.0); - if ((i+1) % 5 == 0) - fprintf(f, "\n"); - } - fclose(f); -} - -/* ---------------------------------------------------------------------- */ - void DumpNetCDF::ncerr(int err, const char *descr, int line) { if (err != NC_NOERR) { diff --git a/src/USER-NETCDF/dump_netcdf.h b/src/USER-NETCDF/dump_netcdf.h index b86f294d30..f97fd58409 100644 --- a/src/USER-NETCDF/dump_netcdf.h +++ b/src/USER-NETCDF/dump_netcdf.h @@ -66,7 +66,7 @@ class DumpNetCDF : public DumpCustom { bool thermo; // write thermo output to netcdf file bigint n_buffer; // size of buffer - int *int_buffer; // buffer for passing data to netcdf + bigint *int_buffer; // buffer for passing data to netcdf double *double_buffer; // buffer for passing data to netcdf int ncid; @@ -92,7 +92,6 @@ class DumpNetCDF : public DumpCustom { void closefile(); virtual void write_header(bigint); virtual void write_data(int, double *); - void write_prmtop(); virtual int modify_param(int, char **); diff --git a/src/USER-NETCDF/dump_netcdf_mpiio.cpp b/src/USER-NETCDF/dump_netcdf_mpiio.cpp index c5b87b178e..129f9cccbb 100644 --- a/src/USER-NETCDF/dump_netcdf_mpiio.cpp +++ b/src/USER-NETCDF/dump_netcdf_mpiio.cpp @@ -43,7 +43,8 @@ using namespace LAMMPS_NS; using namespace MathConst; -enum{INT,FLOAT,BIGINT}; // same as in thermo.cpp +enum{THERMO_INT,THERMO_FLOAT,THERMO_BIGINT}; // same as in thermo.cpp +enum{DUMP_INT,DUMP_DOUBLE,DUMP_STRING,DUMP_BIGINT}; // same as in DumpCFG const char NC_FRAME_STR[] = "frame"; const char NC_SPATIAL_STR[] = "spatial"; @@ -70,6 +71,9 @@ const int THIS_IS_A_BIGINT = -4; #define NCERR(x) ncerr(x, NULL, __LINE__) #define NCERRX(x, descr) ncerr(x, descr, __LINE__) +#if !defined(NC_64BIT_DATA) +#define NC_64BIT_DATA NC_64BIT_OFFSET +#endif /* ---------------------------------------------------------------------- */ @@ -85,8 +89,8 @@ DumpNetCDFMPIIO::DumpNetCDFMPIIO(LAMMPS *lmp, int narg, char **arg) : if (multiproc) error->all(FLERR,"Multi-processor writes are not supported."); - if (multifile) - error->all(FLERR,"Multiple files are not supported."); + if (append_flag && multifile) + error->all(FLERR,"Cannot append when writing to multiple files."); perat = new nc_perat_t[nfield]; @@ -214,6 +218,24 @@ DumpNetCDFMPIIO::~DumpNetCDFMPIIO() void DumpNetCDFMPIIO::openfile() { + char *filecurrent = filename; + if (multifile && !singlefile_opened) { + char *filestar = filecurrent; + filecurrent = new char[strlen(filestar) + 16]; + char *ptr = strchr(filestar,'*'); + *ptr = '\0'; + if (padflag == 0) + sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", + filestar,update->ntimestep,ptr+1); + else { + char bif[8],pad[16]; + strcpy(bif,BIGINT_FORMAT); + sprintf(pad,"%%s%%0%d%s%%s",padflag,&bif[1]); + sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1); + } + *ptr = '*'; + } + if (thermo && !singlefile_opened) { if (thermovar) delete [] thermovar; thermovar = new int[output->thermo->nfield]; @@ -257,7 +279,7 @@ void DumpNetCDFMPIIO::openfile() // get total number of atoms ntotalgr = group->count(igroup); - if (append_flag && access(filename, F_OK) != -1) { + if (append_flag && !multifile && access(filecurrent, F_OK) != -1) { // Fixme! Perform checks if dimensions and variables conform with // data structure standard. @@ -267,8 +289,8 @@ void DumpNetCDFMPIIO::openfile() if (singlefile_opened) return; singlefile_opened = 1; - NCERRX( ncmpi_open(MPI_COMM_WORLD, filename, NC_WRITE, MPI_INFO_NULL, - &ncid), filename ); + NCERRX( ncmpi_open(MPI_COMM_WORLD, filecurrent, NC_WRITE, MPI_INFO_NULL, + &ncid), filecurrent ); // dimensions NCERRX( ncmpi_inq_dimid(ncid, NC_FRAME_STR, &frame_dim), NC_FRAME_STR ); @@ -300,19 +322,6 @@ void DumpNetCDFMPIIO::openfile() // variables specified in the input file for (int i = 0; i < n_perat; i++) { - nc_type xtype; - - // Type mangling - if (vtype[perat[i].field[0]] == INT) { - xtype = NC_INT; - } - else { - if (double_precision) - xtype = NC_DOUBLE; - else - xtype = NC_FLOAT; - } - NCERRX( ncmpi_inq_varid(ncid, perat[i].name, &perat[i].var), perat[i].name ); } @@ -330,10 +339,12 @@ void DumpNetCDFMPIIO::openfile() NCERR( ncmpi_inq_dimlen(ncid, frame_dim, &nframes) ); // framei == -1 means append to file, == -2 means override last frame // Note that in the input file this translates to 'yes', '-1', etc. - if (framei < 0 || (append_flag && framei == 0)) framei = nframes+framei+1; + if (framei <= 0) framei = nframes+framei+1; if (framei < 1) framei = 1; - } - else { + } else { + if (framei != 0 && !multifile) + error->all(FLERR,"at keyword requires use of 'append yes'"); + int dims[NC_MAX_VAR_DIMS]; MPI_Offset index[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS]; double d[1]; @@ -341,8 +352,8 @@ void DumpNetCDFMPIIO::openfile() if (singlefile_opened) return; singlefile_opened = 1; - NCERRX( ncmpi_create(MPI_COMM_WORLD, filename, NC_64BIT_DATA, - MPI_INFO_NULL, &ncid), filename ); + NCERRX( ncmpi_create(MPI_COMM_WORLD, filecurrent, NC_64BIT_DATA, + MPI_INFO_NULL, &ncid), filecurrent ); // dimensions NCERRX( ncmpi_def_dim(ncid, NC_FRAME_STR, NC_UNLIMITED, &frame_dim), @@ -394,10 +405,11 @@ void DumpNetCDFMPIIO::openfile() nc_type xtype; // Type mangling - if (vtype[perat[i].field[0]] == INT) { + if (vtype[perat[i].field[0]] == DUMP_INT) { xtype = NC_INT; - } - else { + } else if (vtype[perat[i].field[0]] == DUMP_BIGINT) { + xtype = NC_INT64; + } else { if (double_precision) xtype = NC_DOUBLE; else @@ -433,17 +445,22 @@ void DumpNetCDFMPIIO::openfile() if (thermo) { Thermo *th = output->thermo; for (int i = 0; i < th->nfield; i++) { - if (th->vtype[i] == FLOAT) { + if (th->vtype[i] == THERMO_FLOAT) { NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_DOUBLE, 1, dims, &thermovar[i]), th->keyword[i] ); } - else if (th->vtype[i] == INT) { + else if (th->vtype[i] == THERMO_INT) { NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_INT, 1, dims, &thermovar[i]), th->keyword[i] ); } - else if (th->vtype[i] == BIGINT) { + else if (th->vtype[i] == THERMO_BIGINT) { +#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG) + NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_INT64, 1, dims, + &thermovar[i]), th->keyword[i] ); +#else NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_LONG, 1, dims, &thermovar[i]), th->keyword[i] ); +#endif } } } @@ -560,6 +577,7 @@ void DumpNetCDFMPIIO::openfile() NCERR( ncmpi_end_indep_data(ncid) ); + append_flag = 1; framei = 1; } } @@ -571,15 +589,92 @@ void DumpNetCDFMPIIO::closefile() if (singlefile_opened) { NCERR( ncmpi_close(ncid) ); singlefile_opened = 0; - // append next time DumpNetCDFMPIIO::openfile is called - append_flag = 1; // write to next frame upon next open - framei++; + if (multifile) + framei = 1; + else { + // append next time DumpNetCDFMPIIO::openfile is called + append_flag = 1; + framei++; + } } } /* ---------------------------------------------------------------------- */ +template +int ncmpi_put_var1_bigint(int ncid, int varid, const MPI_Offset index[], + const T* tp) +{ + return ncmpi_put_var1_int(ncid, varid, index, tp); +} + +template <> +int ncmpi_put_var1_bigint(int ncid, int varid, const MPI_Offset index[], + const long* tp) +{ + return ncmpi_put_var1_long(ncid, varid, index, tp); +} + +template <> +int ncmpi_put_var1_bigint(int ncid, int varid, + const MPI_Offset index[], + const long long* tp) +{ + return ncmpi_put_var1_longlong(ncid, varid, index, tp); +} + +template +int ncmpi_put_vara_bigint_all(int ncid, int varid, const MPI_Offset start[], + const MPI_Offset count[], const T* tp) +{ + return ncmpi_put_vara_int_all(ncid, varid, start, count, tp); +} + +template <> +int ncmpi_put_vara_bigint_all(int ncid, int varid, + const MPI_Offset start[], + const MPI_Offset count[], const long* tp) +{ + return ncmpi_put_vara_long_all(ncid, varid, start, count, tp); +} + +template <> +int ncmpi_put_vara_bigint_all(int ncid, int varid, + const MPI_Offset start[], + const MPI_Offset count[], + const long long* tp) +{ + return ncmpi_put_vara_longlong_all(ncid, varid, start, count, tp); +} + +template +int ncmpi_put_vars_bigint_all(int ncid, int varid, const MPI_Offset start[], + const MPI_Offset count[], + const MPI_Offset stride[], const T* tp) +{ + return ncmpi_put_vars_int_all(ncid, varid, start, count, stride, tp); +} + +template <> +int ncmpi_put_vars_bigint_all(int ncid, int varid, + const MPI_Offset start[], + const MPI_Offset count[], + const MPI_Offset stride[], const long* tp) +{ + return ncmpi_put_vars_long_all(ncid, varid, start, count, stride, tp); +} + +template <> +int ncmpi_put_vars_bigint_all(int ncid, int varid, + const MPI_Offset start[], + const MPI_Offset count[], + const MPI_Offset stride[], + const long long* tp) +{ + return ncmpi_put_vars_longlong_all(ncid, varid, start, count, stride, tp); +} + void DumpNetCDFMPIIO::write() { // open file @@ -603,23 +698,18 @@ void DumpNetCDFMPIIO::write() for (int i = 0; i < th->nfield; i++) { th->call_vfunc(i); if (filewriter) { - if (th->vtype[i] == FLOAT) { + if (th->vtype[i] == THERMO_FLOAT) { NCERRX( ncmpi_put_var1_double(ncid, thermovar[i], start, &th->dvalue), th->keyword[i] ); } - else if (th->vtype[i] == INT) { + else if (th->vtype[i] == THERMO_INT) { NCERRX( ncmpi_put_var1_int(ncid, thermovar[i], start, &th->ivalue), th->keyword[i] ); } - else if (th->vtype[i] == BIGINT) { -#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG) - NCERRX( ncmpi_put_var1_long(ncid, thermovar[i], start, &th->bivalue), + else if (th->vtype[i] == THERMO_BIGINT) { + NCERRX( ncmpi_put_var1_bigint(ncid, thermovar[i], start, &th->bivalue), th->keyword[i] ); -#else - NCERRX( ncmpi_put_var1_int(ncid, thermovar[i], start, &th->bivalue), - th->keyword[i] ); -#endif } } } @@ -746,16 +836,16 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf) if (!int_buffer) { n_buffer = std::max(1, n); - int_buffer = (int *) - memory->smalloc(n_buffer*sizeof(int),"dump::int_buffer"); + int_buffer = (bigint *) + memory->smalloc(n_buffer*sizeof(bigint),"dump::int_buffer"); double_buffer = (double *) memory->smalloc(n_buffer*sizeof(double),"dump::double_buffer"); } if (n > n_buffer) { n_buffer = std::max(1, n); - int_buffer = (int *) - memory->srealloc(int_buffer, n_buffer*sizeof(int),"dump::int_buffer"); + int_buffer = (bigint *) + memory->srealloc(int_buffer, n_buffer*sizeof(bigint),"dump::int_buffer"); double_buffer = (double *) memory->srealloc(double_buffer, n_buffer*sizeof(double), "dump::double_buffer"); @@ -788,7 +878,7 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf) error->one(FLERR,errmsg); } - if (vtype[iaux] == INT) { + if (vtype[iaux] == DUMP_INT || vtype[iaux] == DUMP_BIGINT) { // integers if (perat[i].dims > 1) { @@ -803,13 +893,21 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf) error->one(FLERR,errmsg); } - for (int j = 0; j < n; j++, iaux+=size_one) { - int_buffer[j] = mybuf[iaux]; + if (vtype[iaux] == DUMP_INT) { + for (int j = 0; j < n; j++, iaux+=size_one) { + int_buffer[j] = static_cast(mybuf[iaux]); + } + } + else { // DUMP_BIGINT + for (int j = 0; j < n; j++, iaux+=size_one) { + int_buffer[j] = static_cast(mybuf[iaux]); + } } start[2] = idim; - NCERRX( ncmpi_put_vars_int_all(ncid, perat[i].var, start, count, - stride, int_buffer), perat[i].name ); + NCERRX( ncmpi_put_vars_bigint_all(ncid, perat[i].var, start, count, + stride, int_buffer), + perat[i].name ); } } } @@ -818,8 +916,8 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf) int_buffer[j] = mybuf[iaux]; } - NCERRX( ncmpi_put_vara_int_all(ncid, perat[i].var, start, count, - int_buffer), perat[i].name ); + NCERRX( ncmpi_put_vara_bigint_all(ncid, perat[i].var, start, count, + int_buffer), perat[i].name ); } } else { @@ -880,8 +978,11 @@ int DumpNetCDFMPIIO::modify_param(int narg, char **arg) } else if (strcmp(arg[iarg],"at") == 0) { iarg++; + if (iarg >= narg) + error->all(FLERR,"expected additional arg after 'at' keyword."); framei = force->inumeric(FLERR,arg[iarg]); - if (framei < 0) framei--; + if (framei == 0) error->all(FLERR,"frame 0 not allowed for 'at' keyword."); + else if (framei < 0) framei--; iarg++; return 2; } diff --git a/src/USER-NETCDF/dump_netcdf_mpiio.h b/src/USER-NETCDF/dump_netcdf_mpiio.h index 3ca52449a5..330fa46c04 100644 --- a/src/USER-NETCDF/dump_netcdf_mpiio.h +++ b/src/USER-NETCDF/dump_netcdf_mpiio.h @@ -65,7 +65,7 @@ class DumpNetCDFMPIIO : public DumpCustom { bool thermo; // write thermo output to netcdf file bigint n_buffer; // size of buffer - int *int_buffer; // buffer for passing data to netcdf + bigint *int_buffer; // buffer for passing data to netcdf double *double_buffer; // buffer for passing data to netcdf int ncid; diff --git a/src/USER-OMP/bond_gromos_omp.cpp b/src/USER-OMP/bond_gromos_omp.cpp new file mode 100644 index 0000000000..7904c4683b --- /dev/null +++ b/src/USER-OMP/bond_gromos_omp.cpp @@ -0,0 +1,129 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include "bond_gromos_omp.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "domain.h" + +#include + +#include "suffix.h" +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +BondGromosOMP::BondGromosOMP(class LAMMPS *lmp) + : BondGromos(lmp), ThrOMP(lmp,THR_BOND) +{ + suffix_flag |= Suffix::OMP; +} + +/* ---------------------------------------------------------------------- */ + +void BondGromosOMP::compute(int eflag, int vflag) +{ + + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = 0; + + const int nall = atom->nlocal + atom->nghost; + const int nthreads = comm->nthreads; + const int inum = neighbor->nbondlist; + +#if defined(_OPENMP) +#pragma omp parallel default(none) shared(eflag,vflag) +#endif + { + int ifrom, ito, tid; + + loop_setup_thr(ifrom, ito, tid, inum, nthreads); + ThrData *thr = fix->get_thr(tid); + thr->timer(Timer::START); + ev_setup_thr(eflag, vflag, nall, eatom, vatom, thr); + + if (inum > 0) { + if (evflag) { + if (eflag) { + if (force->newton_bond) eval<1,1,1>(ifrom, ito, thr); + else eval<1,1,0>(ifrom, ito, thr); + } else { + if (force->newton_bond) eval<1,0,1>(ifrom, ito, thr); + else eval<1,0,0>(ifrom, ito, thr); + } + } else { + if (force->newton_bond) eval<0,0,1>(ifrom, ito, thr); + else eval<0,0,0>(ifrom, ito, thr); + } + } + thr->timer(Timer::BOND); + reduce_thr(this, eflag, vflag, thr); + } // end of omp parallel region +} + +template +void BondGromosOMP::eval(int nfrom, int nto, ThrData * const thr) +{ + int i1,i2,n,type; + double delx,dely,delz,ebond,fbond; + + const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const int3_t * _noalias const bondlist = (int3_t *) neighbor->bondlist[0]; + const int nlocal = atom->nlocal; + ebond = 0.0; + + for (n = nfrom; n < nto; n++) { + i1 = bondlist[n].a; + i2 = bondlist[n].b; + type = bondlist[n].t; + + delx = x[i1].x - x[i2].x; + dely = x[i1].y - x[i2].y; + delz = x[i1].z - x[i2].z; + + const double rsq = delx*delx + dely*dely + delz*delz; + const double dr = rsq - r0[type]*r0[type]; + const double kdr = k[type]*dr; + + // force & energy + + fbond = -4.0 * kdr; + + if (EFLAG) ebond = kdr; + + // apply force to each of 2 atoms + + if (NEWTON_BOND || i1 < nlocal) { + f[i1].x += delx*fbond; + f[i1].y += dely*fbond; + f[i1].z += delz*fbond; + } + + if (NEWTON_BOND || i2 < nlocal) { + f[i2].x -= delx*fbond; + f[i2].y -= dely*fbond; + f[i2].z -= delz*fbond; + } + + if (EVFLAG) ev_tally_thr(this,i1,i2,nlocal,NEWTON_BOND, + ebond,fbond,delx,dely,delz,thr); + } +} diff --git a/src/USER-OMP/bond_gromos_omp.h b/src/USER-OMP/bond_gromos_omp.h new file mode 100644 index 0000000000..69e92e4295 --- /dev/null +++ b/src/USER-OMP/bond_gromos_omp.h @@ -0,0 +1,46 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#ifdef BOND_CLASS + +BondStyle(gromos/omp,BondGromosOMP) + +#else + +#ifndef LMP_BOND_GROMOS_OMP_H +#define LMP_BOND_GROMOS_OMP_H + +#include "bond_gromos.h" +#include "thr_omp.h" + +namespace LAMMPS_NS { + +class BondGromosOMP : public BondGromos, public ThrOMP { + + public: + BondGromosOMP(class LAMMPS *lmp); + virtual void compute(int, int); + + private: + template + void eval(int ifrom, int ito, ThrData * const thr); +}; + +} + +#endif +#endif diff --git a/src/USER-OMP/fix_neigh_history_omp.cpp b/src/USER-OMP/fix_neigh_history_omp.cpp new file mode 100644 index 0000000000..21aed6c7c0 --- /dev/null +++ b/src/USER-OMP/fix_neigh_history_omp.cpp @@ -0,0 +1,603 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include "fix_neigh_history_omp.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "force.h" +#include "pair.h" +#include "update.h" +#include "memory.h" +#include "modify.h" +#include "error.h" + +#if defined(_OPENMP) +#include +#endif + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum{DEFAULT,NPARTNER,PERPARTNER}; // also set in fix neigh/history + + +FixNeighHistoryOMP::FixNeighHistoryOMP(class LAMMPS *lmp,int narg,char **argv) + : FixNeighHistory(lmp,narg,argv) { + +} + + +/* ---------------------------------------------------------------------- + copy partner info from neighbor data structs (NDS) to atom arrays + should be called whenever NDS store current history info + and need to transfer the info to owned atoms + e.g. when atoms migrate to new procs, new neigh list built, or between runs + when atoms may be added or deleted (NDS becomes out-of-date) + the next post_neighbor() will put this info back into new NDS + called during run before atom exchanges, including for restart files + called at end of run via post_run() + do not call during setup of run (setup_pre_exchange) + b/c there is no guarantee of a current NDS (even on continued run) + if run command does a 2nd run with pre = no, then no neigh list + will be built, but old neigh list will still have the info + onesided and newton on and newton off versions +------------------------------------------------------------------------- */ +// below is the pre_exchange() function from the parent class +// void FixNeighHistory::pre_exchange() +// { +// if (onesided) pre_exchange_onesided(); +// else if (newton_pair) pre_exchange_newton(); +// else pre_exchange_no_newton(); +//} + +/* ---------------------------------------------------------------------- + onesided version for sphere contact with line/tri particles + neighbor list has I = sphere, J = line/tri + only store history info with spheres +------------------------------------------------------------------------- */ + +void FixNeighHistoryOMP::pre_exchange_onesided() +{ + const int nthreads = comm->nthreads; + const int nlocal = atom->nlocal; + maxpartner = 0; + +#if defined(_OPENMP) +#pragma omp parallel default(none) +#endif + { + +#if defined(_OPENMP) + const int tid = omp_get_thread_num(); +#else + const int tid = 0; +#endif + + int i,j,ii,jj,m,n,inum,jnum; + int *ilist,*jlist,*numneigh,**firstneigh; + int *allflags; + double *allvalues,*onevalues; + + // NOTE: all operations until very end are with: + // nlocal_neigh <= current nlocal + // b/c previous neigh list was built with nlocal_neigh + // nlocal can be larger if other fixes added atoms at this pre_exchange() + + // clear per-thread paged data structures + + MyPage &ipg = ipage_atom[tid]; + MyPage &dpg = dpage_atom[tid]; + ipg.reset(); + dpg.reset(); + + // each thread works on a fixed chunk of local and ghost atoms. + const int ldelta = 1 + nlocal_neigh/nthreads; + const int lfrom = tid*ldelta; + const int lmax = lfrom +ldelta; + const int lto = (lmax > nlocal_neigh) ? nlocal_neigh : lmax; + + // 1st loop over neighbor list, I = sphere, J = tri + // only calculate npartner for each owned spheres + + for (i = lfrom; i < lto; i++) npartner[i] = 0; + + tagint *tag = atom->tag; + NeighList *list = pair->list; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + allflags = firstflag[i]; + + for (jj = 0; jj < jnum; jj++) + if (allflags[jj]) + if ((i >= lfrom) && (i < lto)) npartner[i]++; + } + + // get page chunks to store atom IDs and shear history for my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + if ((i >= lfrom) && (i < lto)) { + n = npartner[i]; + partner[i] = ipg.get(n); + valuepartner[i] = dpg.get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); + } + } + + // 2nd loop over neighbor list + // store partner IDs and values for owned+ghost atoms + // re-zero npartner to use as counter + + for (i = lfrom; i < lto; i++) npartner[i] = 0; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + allflags = firstflag[i]; + allvalues = firstvalue[i]; + + for (jj = 0; jj < jnum; jj++) { + if (allflags[jj]) { + onevalues = &allvalues[dnum*jj]; + j = jlist[jj]; + j &= NEIGHMASK; + + if ((i >= lfrom) && (i < lto)) { + m = npartner[i]++; + partner[i][m] = tag[j]; + memcpy(&valuepartner[i][dnum*m],onevalues,dnumbytes); + } + } + } + } + + // set maxpartner = max # of partners of any owned atom + maxpartner = m = 0; + for (i = lfrom; i < lto; i++) + m = MAX(m,npartner[i]); + +#if defined(_OPENMP) +#pragma omp critical +#endif + { + maxpartner = MAX(m,maxpartner); + comm->maxexchange_fix =MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1); + } + } + + // zero npartner values from previous nlocal_neigh to current nlocal + for (int i = nlocal_neigh; i < nlocal; ++i) npartner[i] = 0; +} + +/* -------------------------------------------------------------------- */ + +void FixNeighHistoryOMP::pre_exchange_newton() +{ + const int nthreads = comm->nthreads; + maxpartner = 0; + for (int i = 0; i < nall_neigh; i++) npartner[i] = 0; + +#if defined(_OPENMP) +#pragma omp parallel default(none) +#endif + { + +#if defined(_OPENMP) + const int tid = omp_get_thread_num(); +#else + const int tid = 0; +#endif + + int i,j,ii,jj,m,n,inum,jnum; + int *ilist,*jlist,*numneigh,**firstneigh; + int *allflags; + double *allvalues,*onevalues,*jvalues; + + MyPage &ipg = ipage_atom[tid]; + MyPage &dpg = dpage_atom[tid]; + ipg.reset(); + dpg.reset(); + + // 1st loop over neighbor list + // calculate npartner for each owned+ghost atom + + tagint *tag = atom->tag; + + NeighList *list = pair->list; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // each thread works on a fixed chunk of local and ghost atoms. + const int ldelta = 1 + nlocal_neigh/nthreads; + const int lfrom = tid*ldelta; + const int lmax = lfrom +ldelta; + const int lto = (lmax > nlocal_neigh) ? nlocal_neigh : lmax; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + allflags = firstflag[i]; + + for (jj = 0; jj < jnum; jj++) { + if (allflags[jj]) { + if ((i >= lfrom) && (i < lto)) + npartner[i]++; + + j = jlist[jj]; + j &= NEIGHMASK; + if ((j >= lfrom) && (j < lto)) + npartner[j]++; + } + } + } +#if defined(_OPENMP) +#pragma omp barrier + {;} + + // perform reverse comm to augment owned npartner counts with ghost counts + +#pragma omp master +#endif + { + commflag = NPARTNER; + comm->reverse_comm_fix(this,0); + } + + // get page chunks to store atom IDs and shear history for my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + if ((i >= lfrom) && (i < lto)) { + n = npartner[i]; + partner[i] = ipg.get(n); + valuepartner[i] = dpg.get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); + } + } + +#if defined(_OPENMP) +#pragma omp master +#endif + { + for (i = nlocal_neigh; i < nall_neigh; i++) { + n = npartner[i]; + partner[i] = ipg.get(n); + valuepartner[i] = dpg.get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) { + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); + } + } + } + + // 2nd loop over neighbor list + // store partner IDs and values for owned+ghost atoms + // re-zero npartner to use as counter + + for (i = lfrom; i < lto; i++) npartner[i] = 0; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + allflags = firstflag[i]; + allvalues = firstvalue[i]; + + for (jj = 0; jj < jnum; jj++) { + if (allflags[jj]) { + onevalues = &allvalues[dnum*jj]; + j = jlist[jj]; + j &= NEIGHMASK; + + if ((i >= lfrom) && (i < lto)) { + m = npartner[i]++; + partner[i][m] = tag[j]; + memcpy(&valuepartner[i][dnum*m],onevalues,dnumbytes); + } + + if ((j >= lfrom) && (j < lto)) { + m = npartner[j]++; + partner[j][m] = tag[i]; + jvalues = &valuepartner[j][dnum*m]; + for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; + } + } + } + } +#if defined(_OPENMP) +#pragma omp barrier + {;} + +#pragma omp master +#endif + { + // perform reverse comm to augment + // owned atom partner/valuepartner with ghost info + // use variable variant b/c size of packed data can be arbitrarily large + // if many touching neighbors for large particle + + commflag = PERPARTNER; + comm->reverse_comm_fix_variable(this); + } + + // set maxpartner = max # of partners of any owned atom + m = 0; + for (i = lfrom; i < lto; i++) + m = MAX(m,npartner[i]); + +#if defined(_OPENMP) +#pragma omp critical +#endif + { + maxpartner = MAX(m,maxpartner); + comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1); + } + } + + // zero npartner values from previous nlocal_neigh to current nlocal + + int nlocal = atom->nlocal; + for (int i = nlocal_neigh; i < nlocal; i++) npartner[i] = 0; +} + +/* -------------------------------------------------------------------- */ + +void FixNeighHistoryOMP::pre_exchange_no_newton() +{ + const int nthreads = comm->nthreads; + maxpartner = 0; + +#if defined(_OPENMP) +#pragma omp parallel default(none) +#endif + { + +#if defined(_OPENMP) + const int tid = omp_get_thread_num(); +#else + const int tid = 0; +#endif + + int i,j,ii,jj,m,n,inum,jnum; + int *ilist,*jlist,*numneigh,**firstneigh; + int *allflags; + double *allvalues,*onevalues,*jvalues; + + MyPage &ipg = ipage_atom[tid]; + MyPage &dpg = dpage_atom[tid]; + ipg.reset(); + dpg.reset(); + + // 1st loop over neighbor list + // calculate npartner for each owned atom + + tagint *tag = atom->tag; + + NeighList *list = pair->list; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // each thread works on a fixed chunk of local and ghost atoms. + const int ldelta = 1 + nlocal_neigh/nthreads; + const int lfrom = tid*ldelta; + const int lmax = lfrom +ldelta; + const int lto = (lmax > nlocal_neigh) ? nlocal_neigh : lmax; + + // zero npartners for all current atoms and + // clear page data structures for this thread + + for (i = lfrom; i < lto; i++) npartner[i] = 0; + + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + allflags = firstflag[i]; + + for (jj = 0; jj < jnum; jj++) { + if (allflags[jj]) { + if ((i >= lfrom) && (i < lto)) + npartner[i]++; + + j = jlist[jj]; + j &= NEIGHMASK; + if ((j >= lfrom) && (j < lto)) + npartner[j]++; + } + } + } + + // get page chunks to store atom IDs and shear history for my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + if ((i >= lfrom) && (i < lto)) { + n = npartner[i]; + partner[i] = ipg.get(n); + valuepartner[i] = dpg.get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); + } + } + + // 2nd loop over neighbor list + // store partner IDs and values for owned+ghost atoms + // re-zero npartner to use as counter + + for (i = lfrom; i < lto; i++) npartner[i] = 0; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + allflags = firstflag[i]; + allvalues = firstvalue[i]; + + for (jj = 0; jj < jnum; jj++) { + if (allflags[jj]) { + onevalues = &allvalues[dnum*jj]; + j = jlist[jj]; + j &= NEIGHMASK; + + if ((i >= lfrom) && (i < lto)) { + m = npartner[i]++; + partner[i][m] = tag[j]; + memcpy(&valuepartner[i][dnum*m],onevalues,dnumbytes); + } + + if ((j >= lfrom) && (j < lto)) { + m = npartner[j]++; + partner[j][m] = tag[i]; + jvalues = &valuepartner[j][dnum*m]; + for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; + } + } + } + } + + // set maxpartner = max # of partners of any owned atom + m = 0; + for (i = lfrom; i < lto; i++) + m = MAX(m,npartner[i]); + +#if defined(_OPENMP) +#pragma omp critical +#endif + { + maxpartner = MAX(m,maxpartner); + comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1); + } + } +} + +/* -------------------------------------------------------------------- */ + +void FixNeighHistoryOMP::post_neighbor() +{ + const int nthreads = comm->nthreads; + maxpartner = 0; + const int nlocal = atom->nlocal; + const int nall = nlocal + atom->nghost; + nlocal_neigh = nlocal; + nall_neigh = nall; + + // realloc firstflag and firstvalue if needed + + if (maxatom < nlocal) { + memory->sfree(firstflag); + memory->sfree(firstvalue); + maxatom = nall; + firstflag = (int **) + memory->smalloc(maxatom*sizeof(int *),"neighbor_history:firstflag"); + firstvalue = (double **) + memory->smalloc(maxatom*sizeof(double *),"neighbor_history:firstvalue"); + } + + +#if defined(_OPENMP) +#pragma omp parallel default(none) +#endif + { + +#if defined(_OPENMP) + const int tid = omp_get_thread_num(); +#else + const int tid = 0; +#endif + + int i,j,ii,jj,m,nn,np,inum,jnum,rflag; + tagint jtag; + int *ilist,*jlist,*numneigh,**firstneigh; + int *allflags; + double *allvalues; + + MyPage &ipg = ipage_neigh[tid]; + MyPage &dpg = dpage_neigh[tid]; + ipg.reset(); + dpg.reset(); + + // 1st loop over neighbor list + // calculate npartner for each owned atom + + tagint *tag = atom->tag; + + NeighList *list = pair->list; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // each thread works on a fixed chunk of local and ghost atoms. + const int ldelta = 1 + inum/nthreads; + const int lfrom = tid*ldelta; + const int lmax = lfrom +ldelta; + const int lto = (lmax > inum) ? inum : lmax; + + for (ii = lfrom; ii < lto; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + firstflag[i] = allflags = ipg.get(jnum); + firstvalue[i] = allvalues = dpg.get(jnum*dnum); + np = npartner[i]; + nn = 0; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + rflag = sbmask(j); + j &= NEIGHMASK; + jlist[jj] = j; + + // rflag = 1 if r < radsum in npair_size() method + // preserve neigh history info if tag[j] is in old-neigh partner list + // this test could be more geometrically precise for two sphere/line/tri + + if (rflag) { + jtag = tag[j]; + for (m = 0; m < np; m++) + if (partner[i][m] == jtag) break; + if (m < np) { + allflags[jj] = 1; + memcpy(&allvalues[nn],&valuepartner[i][dnum*m],dnumbytes); + } else { + allflags[jj] = 0; + memcpy(&allvalues[nn],zeroes,dnumbytes); + } + } else { + allflags[jj] = 0; + memcpy(&allvalues[nn],zeroes,dnumbytes); + } + nn += dnum; + } + } + } +} diff --git a/src/USER-OMP/fix_neigh_history_omp.h b/src/USER-OMP/fix_neigh_history_omp.h new file mode 100644 index 0000000000..9cd97ce3da --- /dev/null +++ b/src/USER-OMP/fix_neigh_history_omp.h @@ -0,0 +1,40 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(NEIGH_HISTORY/omp,FixNeighHistoryOMP) + +#else + +#ifndef LMP_FIX_NEIGH_HISTORY_OMP_H +#define LMP_FIX_NEIGH_HISTORY_OMP_H + +#include "fix_neigh_history.h" + +namespace LAMMPS_NS { + +class FixNeighHistoryOMP : public FixNeighHistory { + + public: + FixNeighHistoryOMP(class LAMMPS *lmp, int narg, char **argv); + void pre_exchange_onesided(); + void pre_exchange_newton(); + void pre_exchange_no_newton(); + void post_neighbor(); +}; + +} + +#endif +#endif diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 4457ab6592..d89c9627fe 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -703,7 +703,7 @@ void FixQEqReaxOMP::calculate_Q() q[i] = s[i] - u * t[i]; // backup s & t - for (int k = 4; k > 0; --k) { + for (int k = nprev-1; k > 0; --k) { s_hist[i][k] = s_hist[i][k-1]; t_hist[i][k] = t_hist[i][k-1]; } diff --git a/src/USER-OMP/fix_shear_history_omp.cpp b/src/USER-OMP/fix_shear_history_omp.cpp deleted file mode 100644 index 4180e0af41..0000000000 --- a/src/USER-OMP/fix_shear_history_omp.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#include -#include -#include "fix_shear_history_omp.h" -#include "atom.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "force.h" -#include "pair.h" -#include "update.h" -#include "modify.h" -#include "error.h" - -#if defined(_OPENMP) -#include -#endif - -using namespace LAMMPS_NS; -using namespace FixConst; - -/* ---------------------------------------------------------------------- - copy shear partner info from neighbor lists to per-atom arrays - so it can be exchanged with those atoms -------------------------------------------------------------------------- */ - -void FixShearHistoryOMP::pre_exchange() -{ - const int nthreads = comm->nthreads; - maxtouch = 0; - -#if defined(_OPENMP) -#pragma omp parallel default(none) -#endif - { - -#if defined(_OPENMP) - const int tid = omp_get_thread_num(); -#else - const int tid = 0; -#endif - - int i,j,ii,jj,m,n,inum,jnum; - int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*shearj,*allshear,**firstshear; - - MyPage &ipg = ipage[tid]; - MyPage &dpg = dpage[tid]; - ipg.reset(); - dpg.reset(); - - // 1st loop over neighbor list - // calculate nparter for each owned atom - - tagint *tag = atom->tag; - - NeighList *list = pair->list; - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; - - int nlocal_neigh = 0; - if (inum) nlocal_neigh = ilist[inum-1] + 1; - - // each thread works on a fixed chunk of local and ghost atoms. - const int ldelta = 1 + nlocal_neigh/nthreads; - const int lfrom = tid*ldelta; - const int lmax = lfrom +ldelta; - const int lto = (lmax > nlocal_neigh) ? nlocal_neigh : lmax; - - // zero npartners for all current atoms and - // clear page data structures for this thread - - for (i = lfrom; i < lto; i++) npartner[i] = 0; - - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - touch = firsttouch[i]; - - for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { - if ((i >= lfrom) && (i < lto)) - npartner[i]++; - - j = jlist[jj]; - j &= NEIGHMASK; - if ((j >= lfrom) && (j < lto)) - npartner[j]++; - } - } - } - - // get page chunks to store atom IDs and shear history for my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - if ((i >= lfrom) && (i < lto)) { - n = npartner[i]; - partner[i] = ipg.get(n); - shearpartner[i] = dpg.get(dnum*n); - if (partner[i] == NULL || shearpartner[i] == NULL) - error->one(FLERR,"Shear history overflow, boost neigh_modify one"); - } - } - - // 2nd loop over neighbor list - // store atom IDs and shear history for my atoms - // re-zero npartner to use as counter for all my atoms - - for (i = lfrom; i < lto; i++) npartner[i] = 0; - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - jlist = firstneigh[i]; - allshear = firstshear[i]; - jnum = numneigh[i]; - touch = firsttouch[i]; - - for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { - shear = &allshear[3*jj]; - j = jlist[jj]; - j &= NEIGHMASK; - - if ((i >= lfrom) && (i < lto)) { - m = npartner[i]++; - partner[i][m] = tag[j]; - memcpy(&shearpartner[i][dnum*m],shear,dnumbytes); - } - - if ((j >= lfrom) && (j < lto)) { - m = npartner[j]++; - partner[j][m] = tag[i]; - shearj = &shearpartner[j][dnum*m]; - for (n = 0; n < dnum; n++) shearj[n] = -shear[n]; - } - } - } - } - - // set maxtouch = max # of partners of any owned atom - maxtouch = m = 0; - for (i = lfrom; i < lto; i++) - m = MAX(m,npartner[i]); - -#if defined(_OPENMP) -#pragma omp critical -#endif - maxtouch = MAX(m,maxtouch); - } -} diff --git a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp index 45add87092..f094691b71 100644 --- a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp @@ -45,12 +45,10 @@ void NPairHalfRespaBinNewtoffOmp::build(NeighList *list) NPAIR_OMP_INIT; - NeighList *listinner = list->listinner; - NeighList *listmiddle = list->listmiddle; const int respamiddle = list->respamiddle; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listinner,listmiddle) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); @@ -77,26 +75,26 @@ void NPairHalfRespaBinNewtoffOmp::build(NeighList *list) int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; int *ilist_middle,*numneigh_middle,**firstneigh_middle; if (respamiddle) { - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; } // each thread has its own page allocator MyPage &ipage = list->ipage[tid]; - MyPage &ipage_inner = listinner->ipage[tid]; + MyPage &ipage_inner = list->ipage_inner[tid]; ipage.reset(); ipage_inner.reset(); MyPage *ipage_middle; if (respamiddle) { - ipage_middle = listmiddle->ipage + tid; + ipage_middle = list->ipage_middle + tid; ipage_middle->reset(); } @@ -199,6 +197,6 @@ void NPairHalfRespaBinNewtoffOmp::build(NeighList *list) } NPAIR_OMP_CLOSE; list->inum = nlocal; - listinner->inum = nlocal; - if (respamiddle) listmiddle->inum = nlocal; + list->inum_inner = nlocal; + if (respamiddle) list->inum_middle = nlocal; } diff --git a/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp index ee6b9b7501..de7ef5f7d5 100644 --- a/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp @@ -44,12 +44,10 @@ void NPairHalfRespaBinNewtonOmp::build(NeighList *list) NPAIR_OMP_INIT; - NeighList *listinner = list->listinner; - NeighList *listmiddle = list->listmiddle; const int respamiddle = list->respamiddle; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listinner,listmiddle) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); @@ -76,26 +74,26 @@ void NPairHalfRespaBinNewtonOmp::build(NeighList *list) int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; int *ilist_middle,*numneigh_middle,**firstneigh_middle; if (respamiddle) { - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; } // each thread has its own page allocator MyPage &ipage = list->ipage[tid]; - MyPage &ipage_inner = listinner->ipage[tid]; + MyPage &ipage_inner = list->ipage_inner[tid]; ipage.reset(); ipage_inner.reset(); MyPage *ipage_middle; if (respamiddle) { - ipage_middle = listmiddle->ipage + tid; + ipage_middle = list->ipage_middle + tid; ipage_middle->reset(); } @@ -245,6 +243,6 @@ void NPairHalfRespaBinNewtonOmp::build(NeighList *list) } NPAIR_OMP_CLOSE; list->inum = nlocal; - listinner->inum = nlocal; - if (respamiddle) listmiddle->inum = nlocal; + list->inum_inner = nlocal; + if (respamiddle) list->inum_middle = nlocal; } diff --git a/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp index fbb512ba64..f20d101bc9 100644 --- a/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp @@ -44,12 +44,10 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) NPAIR_OMP_INIT; - NeighList *listinner = list->listinner; - NeighList *listmiddle = list->listmiddle; const int respamiddle = list->respamiddle; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listinner,listmiddle) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); @@ -76,26 +74,26 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; int *ilist_middle,*numneigh_middle,**firstneigh_middle; if (respamiddle) { - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; } // each thread has its own page allocator MyPage &ipage = list->ipage[tid]; - MyPage &ipage_inner = listinner->ipage[tid]; + MyPage &ipage_inner = list->ipage_inner[tid]; ipage.reset(); ipage_inner.reset(); MyPage *ipage_middle; if (respamiddle) { - ipage_middle = listmiddle->ipage + tid; + ipage_middle = list->ipage_middle + tid; ipage_middle->reset(); } @@ -206,6 +204,6 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) } NPAIR_OMP_CLOSE; list->inum = nlocal; - listinner->inum = nlocal; - if (respamiddle) listmiddle->inum = nlocal; + list->inum_inner = nlocal; + if (respamiddle) list->inum_middle = nlocal; } diff --git a/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp b/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp index 5ee71bebad..0f726cdd7f 100644 --- a/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp @@ -46,12 +46,10 @@ void NPairHalfRespaNsqNewtoffOmp::build(NeighList *list) NPAIR_OMP_INIT; - NeighList *listinner = list->listinner; - NeighList *listmiddle = list->listmiddle; const int respamiddle = list->respamiddle; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listinner,listmiddle) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); @@ -80,26 +78,26 @@ void NPairHalfRespaNsqNewtoffOmp::build(NeighList *list) int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; int *ilist_middle,*numneigh_middle,**firstneigh_middle; if (respamiddle) { - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; } // each thread has its own page allocator MyPage &ipage = list->ipage[tid]; - MyPage &ipage_inner = listinner->ipage[tid]; + MyPage &ipage_inner = list->ipage_inner[tid]; ipage.reset(); ipage_inner.reset(); MyPage *ipage_middle; if (respamiddle) { - ipage_middle = listmiddle->ipage + tid; + ipage_middle = list->ipage_middle + tid; ipage_middle->reset(); } @@ -193,6 +191,6 @@ void NPairHalfRespaNsqNewtoffOmp::build(NeighList *list) } NPAIR_OMP_CLOSE; list->inum = nlocal; - listinner->inum = nlocal; - if (respamiddle) listmiddle->inum = nlocal; + list->inum_inner = nlocal; + if (respamiddle) list->inum_middle = nlocal; } diff --git a/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp b/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp index 89cff732c9..2783e1255e 100644 --- a/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp +++ b/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp @@ -47,12 +47,10 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) NPAIR_OMP_INIT; - NeighList *listinner = list->listinner; - NeighList *listmiddle = list->listmiddle; const int respamiddle = list->respamiddle; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listinner,listmiddle) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); @@ -81,26 +79,26 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; int *ilist_middle,*numneigh_middle,**firstneigh_middle; if (respamiddle) { - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; } // each thread has its own page allocator MyPage &ipage = list->ipage[tid]; - MyPage &ipage_inner = listinner->ipage[tid]; + MyPage &ipage_inner = list->ipage_inner[tid]; ipage.reset(); ipage_inner.reset(); MyPage *ipage_middle; if (respamiddle) { - ipage_middle = listmiddle->ipage + tid; + ipage_middle = list->ipage_middle + tid; ipage_middle->reset(); } @@ -212,6 +210,6 @@ void NPairHalfRespaNsqNewtonOmp::build(NeighList *list) } NPAIR_OMP_CLOSE; list->inum = nlocal; - listinner->inum = nlocal; - if (respamiddle) listmiddle->inum = nlocal; + list->inum_inner = nlocal; + if (respamiddle) list->inum_middle = nlocal; } diff --git a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp index 120658b714..fc101a33d2 100644 --- a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp @@ -18,9 +18,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -34,7 +31,6 @@ NPairHalfSizeBinNewtoffOmp::NPairHalfSizeBinNewtoffOmp(LAMMPS *lmp) : /* ---------------------------------------------------------------------- size particles binned neighbor list construction with partial Newton's 3rd law - shear history must be accounted for when a neighbor pair is added each owned atom i checks own bin and surrounding bins in non-Newton stencil pair stored once if i,j are both owned and i < j pair stored by me if j is ghost (also stored by proc owning j) @@ -43,36 +39,25 @@ NPairHalfSizeBinNewtoffOmp::NPairHalfSizeBinNewtoffOmp(LAMMPS *lmp) : void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) { const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; - - FixShearHistory * const fix_history = (FixShearHistory *) list->fix_history; - NeighList * listhistory = list->listhistory; + const int history = list->history; + const int mask_history = 3 << SBBITS; NPAIR_OMP_INIT; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listhistory) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,k,m,n,nn,ibin,dnum,dnumbytes; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - MyPage *ipage_touch; - MyPage *dpage_shear; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; + int *neighptr; // loop over each atom, storing neighbors double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; @@ -85,29 +70,10 @@ void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) MyPage &ipage = list->ipage[tid]; ipage.reset(); - if (fix_history) { - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage+tid; - dpage_shear = listhistory->dpage+tid; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - ipage_touch->reset(); - dpage_shear->reset(); - } - for (i = ifrom; i < ito; i++) { n = 0; neighptr = ipage.vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -133,29 +99,10 @@ void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } } @@ -166,13 +113,6 @@ void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) ipage.vgot(n); if (ipage.status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } NPAIR_OMP_CLOSE; list->inum = nlocal; diff --git a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp index cf0c6d20fe..1f0dca79ac 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp @@ -18,9 +18,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -34,7 +31,6 @@ NPairHalfSizeBinNewtonOmp::NPairHalfSizeBinNewtonOmp(LAMMPS *lmp) : /* ---------------------------------------------------------------------- size particles binned neighbor list construction with full Newton's 3rd law - shear history must be accounted for when a neighbor pair is added each owned atom i checks its own bin and other bins in Newton stencil every pair stored exactly once by some processor ------------------------------------------------------------------------- */ @@ -42,40 +38,23 @@ NPairHalfSizeBinNewtonOmp::NPairHalfSizeBinNewtonOmp(LAMMPS *lmp) : void NPairHalfSizeBinNewtonOmp::build(NeighList *list) { const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; - - FixShearHistory * const fix_history = (FixShearHistory *) list->fix_history; - NeighList * listhistory = list->listhistory; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - } + const int history = list->history; + const int mask_history = 3 << SBBITS; NPAIR_OMP_INIT; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listhistory) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,k,m,n,nn,ibin,dnum,dnumbytes; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - MyPage *ipage_touch; - MyPage *dpage_shear; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - - // loop over each atom, storing neighbors + int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; @@ -88,29 +67,10 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) MyPage &ipage = list->ipage[tid]; ipage.reset(); - if (fix_history) { - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage+tid; - dpage_shear = listhistory->dpage+tid; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - ipage_touch->reset(); - dpage_shear->reset(); - } - for (i = ifrom; i < ito; i++) { n = 0; neighptr = ipage.vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -140,29 +100,10 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } @@ -181,29 +122,10 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } } @@ -214,13 +136,6 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) ipage.vgot(n); if (ipage.status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } NPAIR_OMP_CLOSE; list->inum = nlocal; diff --git a/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp index da04eebd1e..b02bfa345e 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp @@ -17,8 +17,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" #include "my_page.h" #include "error.h" @@ -32,7 +30,6 @@ NPairHalfSizeBinNewtonTriOmp::NPairHalfSizeBinNewtonTriOmp(LAMMPS *lmp) : /* ---------------------------------------------------------------------- size particles binned neighbor list construction with Newton's 3rd law for triclinic - no shear history is allowed for this option each owned atom i checks its own bin and other bins in triclinic stencil every pair stored exactly once by some processor ------------------------------------------------------------------------- */ @@ -40,6 +37,8 @@ NPairHalfSizeBinNewtonTriOmp::NPairHalfSizeBinNewtonTriOmp(LAMMPS *lmp) : void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) { const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; + const int history = list->history; + const int mask_history = 3 << SBBITS; NPAIR_OMP_INIT; #if defined(_OPENMP) @@ -105,7 +104,12 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) radsum = radi + radius[j]; cutsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutsq) neighptr[n++] = j; + if (rsq <= cutsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } } } diff --git a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp index f898ec3828..1615effad3 100644 --- a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp @@ -19,9 +19,6 @@ #include "atom.h" #include "atom_vec.h" #include "group.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -44,38 +41,23 @@ void NPairHalfSizeNsqNewtoffOmp::build(NeighList *list) { const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int bitmask = (includegroup) ? group->bitmask[includegroup] : 0; - - FixShearHistory * const fix_history = (FixShearHistory *) list->fix_history; - NeighList * listhistory = list->listhistory; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - } + const int history = list->history; + const int mask_history = 3 << SBBITS; NPAIR_OMP_INIT; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listhistory) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,m,n,nn,dnum,dnumbytes; + int i,j,n; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; + int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; @@ -89,29 +71,10 @@ void NPairHalfSizeNsqNewtoffOmp::build(NeighList *list) MyPage &ipage = list->ipage[tid]; ipage.reset(); - if (fix_history) { - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage+tid; - dpage_shear = listhistory->dpage+tid; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - ipage_touch->reset(); - dpage_shear->reset(); - } - for (i = ifrom; i < ito; i++) { n = 0; neighptr = ipage.vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -132,29 +95,10 @@ void NPairHalfSizeNsqNewtoffOmp::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } @@ -164,13 +108,6 @@ void NPairHalfSizeNsqNewtoffOmp::build(NeighList *list) ipage.vgot(n); if (ipage.status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } NPAIR_OMP_CLOSE; list->inum = nlocal; diff --git a/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp b/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp index a7caac372a..e5de57aa51 100644 --- a/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp @@ -19,9 +19,6 @@ #include "atom.h" #include "atom_vec.h" #include "group.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -45,34 +42,20 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) { const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; const int bitmask = (includegroup) ? group->bitmask[includegroup] : 0;; - - FixShearHistory * const fix_history = (FixShearHistory *) list->fix_history; - NeighList * listhistory = list->listhistory; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal+atom->nghost; - } + const int history = list->history; + const int mask_history = 3 << SBBITS; NPAIR_OMP_INIT; #if defined(_OPENMP) -#pragma omp parallel default(none) shared(list,listhistory) +#pragma omp parallel default(none) shared(list) #endif NPAIR_OMP_SETUP(nlocal); - int i,j,m,n,nn,itag,jtag,dnum,dnumbytes; + int i,j,n,itag,jtag; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; + int *neighptr; double **x = atom->x; double *radius = atom->radius; @@ -90,29 +73,10 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) MyPage &ipage = list->ipage[tid]; ipage.reset(); - if (fix_history) { - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage+tid; - dpage_shear = listhistory->dpage+tid; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - ipage_touch->reset(); - dpage_shear->reset(); - } - for (i = ifrom; i < ito; i++) { n = 0; neighptr = ipage.vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } itag = tag[i]; xtmp = x[i][0]; @@ -150,29 +114,10 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } @@ -183,12 +128,6 @@ void NPairHalfSizeNsqNewtonOmp::build(NeighList *list) if (ipage.status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } NPAIR_OMP_CLOSE; list->inum = nlocal; diff --git a/src/USER-OMP/pair_buck_long_coul_long_omp.cpp b/src/USER-OMP/pair_buck_long_coul_long_omp.cpp index 87f9e2e321..f996372409 100644 --- a/src/USER-OMP/pair_buck_long_coul_long_omp.cpp +++ b/src/USER-OMP/pair_buck_long_coul_long_omp.cpp @@ -319,7 +319,7 @@ void PairBuckLongCoulLongOMP::compute_inner() const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listinner->inum; + const int inum = list->inum_inner; #if defined(_OPENMP) #pragma omp parallel default(none) #endif @@ -343,7 +343,7 @@ void PairBuckLongCoulLongOMP::compute_middle() const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listmiddle->inum; + const int inum = list->inum_middle; #if defined(_OPENMP) #pragma omp parallel default(none) @@ -373,7 +373,7 @@ void PairBuckLongCoulLongOMP::compute_outer(int eflag, int vflag) const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listouter->inum; + const int inum = list->inum; #if defined(_OPENMP) #pragma omp parallel default(none) shared(eflag,vflag) @@ -811,7 +811,7 @@ void PairBuckLongCoulLongOMP::eval_inner(int iifrom, int iito, ThrData * const t const double *x0 = x[0]; double *f0 = f[0], *fi = 0; - int *ilist = listinner->ilist; + int *ilist = list->ilist_inner; const int newton_pair = force->newton_pair; @@ -835,7 +835,7 @@ void PairBuckLongCoulLongOMP::eval_inner(int iifrom, int iito, ThrData * const t memcpy(xi, x0+(i+(i<<1)), sizeof(vector)); cut_bucksqi = cut_bucksq[typei = type[i]]; buck1i = buck1[typei]; buck2i = buck2[typei]; rhoinvi = rhoinv[typei]; - jneighn = (jneigh = listinner->firstneigh[i])+listinner->numneigh[i]; + jneighn = (jneigh = list->firstneigh_inner[i])+list->numneigh_inner[i]; for (; jneighilist; + int *ilist = list->ilist_middle; const int newton_pair = force->newton_pair; @@ -932,7 +932,7 @@ void PairBuckLongCoulLongOMP::eval_middle(int iifrom, int iito, ThrData * const memcpy(xi, x0+(i+(i<<1)), sizeof(vector)); cut_bucksqi = cut_bucksq[typei = type[i]]; buck1i = buck1[typei]; buck2i = buck2[typei]; rhoinvi = rhoinv[typei]; - jneighn = (jneigh = listmiddle->firstneigh[i])+listmiddle->numneigh[i]; + jneighn = (jneigh = list->firstneigh_middle[i])+list->numneigh_middle[i]; for (; jneighilist; + int *ilist = list->ilist; int i, j, ii; int *jneigh, *jneighn, typei, typej, ni, respa_flag; @@ -1035,7 +1035,7 @@ void PairBuckLongCoulLongOMP::eval_outer(int iiform, int iito, ThrData * const t buckai = buck_a[typei]; buckci = buck_c[typei]; rhoinvi = rhoinv[typei]; cutsqi = cutsq[typei]; cut_bucksqi = cut_bucksq[typei]; memcpy(xi, x0+(i+(i<<1)), sizeof(vector)); - jneighn = (jneigh = listouter->firstneigh[i])+listouter->numneigh[i]; + jneighn = (jneigh = list->firstneigh[i])+list->numneigh[i]; for (; jneigh #include "pair_gran_hertz_history_omp.h" +#include "fix_neigh_history.h" #include "atom.h" #include "comm.h" #include "fix.h" @@ -134,8 +135,8 @@ void PairGranHertzHistoryOMP::eval(int iifrom, int iito, ThrData * const thr) ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; // loop over neighbors of my atoms diff --git a/src/USER-OMP/pair_gran_hooke_history_omp.cpp b/src/USER-OMP/pair_gran_hooke_history_omp.cpp index e507a63f7c..2e7d55aff0 100644 --- a/src/USER-OMP/pair_gran_hooke_history_omp.cpp +++ b/src/USER-OMP/pair_gran_hooke_history_omp.cpp @@ -14,6 +14,7 @@ #include #include "pair_gran_hooke_history_omp.h" +#include "fix_neigh_history.h" #include "atom.h" #include "comm.h" #include "fix.h" @@ -137,8 +138,8 @@ void PairGranHookeHistoryOMP::eval(int iifrom, int iito, ThrData * const thr) ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; + firsttouch = fix_history->firstflag; + firstshear = fix_history->firstvalue; // loop over neighbors of my atoms diff --git a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp new file mode 100644 index 0000000000..51574b2ee7 --- /dev/null +++ b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + This software is distributed under the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include +#include "pair_lj_cut_coul_wolf_omp.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" + +#include "suffix.h" +#include "math_const.h" +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairLJCutCoulWolfOMP::PairLJCutCoulWolfOMP(LAMMPS *lmp) : + PairLJCutCoulWolf(lmp), ThrOMP(lmp, THR_PAIR) +{ + suffix_flag |= Suffix::OMP; + respa_enable = 0; +} + +/* ---------------------------------------------------------------------- */ + +void PairLJCutCoulWolfOMP::compute(int eflag, int vflag) +{ + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = vflag_fdotr = 0; + + const int nall = atom->nlocal + atom->nghost; + const int nthreads = comm->nthreads; + const int inum = list->inum; + +#if defined(_OPENMP) +#pragma omp parallel default(none) shared(eflag,vflag) +#endif + { + int ifrom, ito, tid; + + loop_setup_thr(ifrom, ito, tid, inum, nthreads); + ThrData *thr = fix->get_thr(tid); + thr->timer(Timer::START); + ev_setup_thr(eflag, vflag, nall, eatom, vatom, thr); + + if (evflag) { + if (eflag) { + if (force->newton_pair) eval<1,1,1>(ifrom, ito, thr); + else eval<1,1,0>(ifrom, ito, thr); + } else { + if (force->newton_pair) eval<1,0,1>(ifrom, ito, thr); + else eval<1,0,0>(ifrom, ito, thr); + } + } else { + if (force->newton_pair) eval<0,0,1>(ifrom, ito, thr); + else eval<0,0,0>(ifrom, ito, thr); + } + + thr->timer(Timer::PAIR); + reduce_thr(this, eflag, vflag, thr); + } // end of omp parallel region +} + +/* ---------------------------------------------------------------------- */ + +template +void PairLJCutCoulWolfOMP::eval(int iifrom, int iito, ThrData * const thr) +{ + int i,j,ii,jj,jnum,itype,jtype; + double qitmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double r,rsq,r2inv,r6inv,forcecoul,forcelj,factor_coul,factor_lj; + double prefactor,erfcc,erfcd,v_sh,dvdrr,e_self; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + + const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const double * _noalias const q = atom->q; + const int * _noalias const type = atom->type; + const int nlocal = atom->nlocal; + const double * _noalias const special_coul = force->special_coul; + const double * _noalias const special_lj = force->special_lj; + const double qqrd2e = force->qqrd2e; + double fxtmp,fytmp,fztmp; + + // self and shifted Coulombic energy + + e_self = v_sh = 0.0; + const double e_shift = erfc(alf*cut_coul)/cut_coul; + const double f_shift = -(e_shift+ 2.0*alf/MY_PIS + * exp(-alf*alf*cut_coul*cut_coul)) / cut_coul; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = iifrom; ii < iito; ++ii) { + + i = ilist[ii]; + qitmp = q[i]; + xtmp = x[i].x; + ytmp = x[i].y; + ztmp = x[i].z; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + fxtmp=fytmp=fztmp=0.0; + + if (EFLAG) { + e_self = -(e_shift/2.0 + alf/MY_PIS) * qitmp*qitmp*qqrd2e; + ev_tally_thr(this,i,i,nlocal,0,0.0,e_self,0.0,0.0,0.0,0.0,thr); + } + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j].x; + dely = ytmp - x[j].y; + delz = ztmp - x[j].z; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + + if (rsq < cut_coulsq) { + r = sqrt(rsq); + prefactor = qqrd2e*qitmp*q[j]/r; + erfcc = erfc(alf*r); + erfcd = exp(-alf*alf*r*r); + v_sh = (erfcc - e_shift*r) * prefactor; + dvdrr = (erfcc/rsq + 2.0*alf/MY_PIS * erfcd/r) + f_shift; + forcecoul = dvdrr*rsq*prefactor; + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + } else forcecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); + } else forcelj = 0.0; + + fpair = (forcecoul + factor_lj*forcelj) * r2inv; + + fxtmp += delx*fpair; + fytmp += dely*fpair; + fztmp += delz*fpair; + if (NEWTON_PAIR || j < nlocal) { + f[j].x -= delx*fpair; + f[j].y -= dely*fpair; + f[j].z -= delz*fpair; + } + + if (EFLAG) { + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + + if (rsq < cut_coulsq) { + ecoul = v_sh; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + } + + if (EVFLAG) ev_tally_thr(this, i,j,nlocal,NEWTON_PAIR, + evdwl,ecoul,fpair,delx,dely,delz,thr); + } + } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; + } +} + +/* ---------------------------------------------------------------------- */ + +double PairLJCutCoulWolfOMP::memory_usage() +{ + double bytes = memory_usage_thr(); + bytes += PairLJCutCoulWolf::memory_usage(); + + return bytes; +} diff --git a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.h b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.h new file mode 100644 index 0000000000..4e56808c7b --- /dev/null +++ b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.h @@ -0,0 +1,48 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/cut/coul/wolf/omp,PairLJCutCoulWolfOMP) + +#else + +#ifndef LMP_PAIR_LJ_CUT_COUL_WOLF_OMP_H +#define LMP_PAIR_LJ_CUT_COUL_WOLF_OMP_H + +#include "pair_lj_cut_coul_wolf.h" +#include "thr_omp.h" + +namespace LAMMPS_NS { + +class PairLJCutCoulWolfOMP : public PairLJCutCoulWolf, public ThrOMP { + + public: + PairLJCutCoulWolfOMP(class LAMMPS *); + + virtual void compute(int, int); + virtual double memory_usage(); + + private: + template + void eval(int ifrom, int ito, ThrData * const thr); +}; + +} + +#endif +#endif diff --git a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp index 85c7e44f8c..110b8917cf 100644 --- a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp @@ -29,6 +29,7 @@ #include "math_const.h" #include "error.h" #include "suffix.h" +#include "domain.h" using namespace LAMMPS_NS; using namespace MathConst; diff --git a/src/USER-OMP/pair_lj_long_coul_long_omp.cpp b/src/USER-OMP/pair_lj_long_coul_long_omp.cpp index 28d4f229c8..c0c87e7481 100644 --- a/src/USER-OMP/pair_lj_long_coul_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_coul_long_omp.cpp @@ -317,7 +317,7 @@ void PairLJLongCoulLongOMP::compute_inner() const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listinner->inum; + const int inum = list->inum_inner; #if defined(_OPENMP) #pragma omp parallel default(none) #endif @@ -341,7 +341,7 @@ void PairLJLongCoulLongOMP::compute_middle() const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listmiddle->inum; + const int inum = list->inum_middle; #if defined(_OPENMP) #pragma omp parallel default(none) @@ -371,7 +371,7 @@ void PairLJLongCoulLongOMP::compute_outer(int eflag, int vflag) const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listouter->inum; + const int inum = list->inum; #if defined(_OPENMP) #pragma omp parallel default(none) shared(eflag,vflag) @@ -805,7 +805,7 @@ void PairLJLongCoulLongOMP::eval_inner(int iifrom, int iito, ThrData * const thr const double *x0 = x[0]; double *f0 = f[0], *fi = 0; - int *ilist = listinner->ilist; + int *ilist = list->ilist_inner; const int newton_pair = force->newton_pair; @@ -828,7 +828,7 @@ void PairLJLongCoulLongOMP::eval_inner(int iifrom, int iito, ThrData * const thr memcpy(xi, x0+(i+(i<<1)), sizeof(vector)); cut_ljsqi = cut_ljsq[typei = type[i]]; lj1i = lj1[typei]; lj2i = lj2[typei]; - jneighn = (jneigh = listinner->firstneigh[i])+listinner->numneigh[i]; + jneighn = (jneigh = list->firstneigh_inner[i])+list->numneigh_inner[i]; for (; jneighilist; + int *ilist = list->ilist_middle; const int newton_pair = force->newton_pair; @@ -925,7 +925,7 @@ void PairLJLongCoulLongOMP::eval_middle(int iifrom, int iito, ThrData * const th memcpy(xi, x0+(i+(i<<1)), sizeof(vector)); cut_ljsqi = cut_ljsq[typei = type[i]]; lj1i = lj1[typei]; lj2i = lj2[typei]; - jneighn = (jneigh = listmiddle->firstneigh[i])+listmiddle->numneigh[i]; + jneighn = (jneigh = list->firstneigh_middle[i])+list->numneigh_middle[i]; for (; jneighilist; + int *ilist = list->ilist; int i, j, ii; int *jneigh, *jneighn, typei, typej, ni, respa_flag; @@ -1027,7 +1027,7 @@ void PairLJLongCoulLongOMP::eval_outer(int iiform, int iito, ThrData * const thr lj1i = lj1[typei]; lj2i = lj2[typei]; lj3i = lj3[typei]; lj4i = lj4[typei]; cutsqi = cutsq[typei]; cut_ljsqi = cut_ljsq[typei]; memcpy(xi, x0+(i+(i<<1)), sizeof(vector)); - jneighn = (jneigh = listouter->firstneigh[i])+listouter->numneigh[i]; + jneighn = (jneigh = list->firstneigh[i])+list->numneigh[i]; for (; jneighnthreads; - const int inum = listinner->inum; + const int inum = list->inum_inner; #if defined(_OPENMP) #pragma omp parallel default(none) #endif @@ -403,7 +403,7 @@ void PairLJLongTIP4PLongOMP::compute_middle() const int nall = atom->nlocal + atom->nghost; const int nthreads = comm->nthreads; - const int inum = listmiddle->inum; + const int inum = list->inum_middle; #if defined(_OPENMP) #pragma omp parallel default(none) @@ -457,7 +457,7 @@ void PairLJLongTIP4PLongOMP::compute_outer(int eflag, int vflag) } const int nthreads = comm->nthreads; - const int inum = listouter->inum; + const int inum = list->inum; #if defined(_OPENMP) #pragma omp parallel default(none) shared(eflag,vflag) @@ -1126,9 +1126,9 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th double *lj1i, *lj2i; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; // loop over neighbors of my atoms @@ -1388,9 +1388,9 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t int ni; double *lj1i, *lj2i; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; // loop over neighbors of my atoms @@ -1656,9 +1656,9 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th double fxtmp,fytmp,fztmp; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; // loop over neighbors of my atoms @@ -1700,6 +1700,7 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th jnum = numneigh[i]; offseti = offset[itype]; lj1i = lj1[itype]; lj2i = lj2[itype]; lj3i = lj3[itype]; lj4i = lj4[itype]; + fxtmp = fytmp = fztmp = 0.0; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 7ac8952b1e..d4448ad868 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -351,7 +351,10 @@ void PairReaxCOMP::init_style( ) neighbor->requests[irequest]->newton = 2; neighbor->requests[irequest]->ghost = 1; - cutmax = MAX3(control->nonb_cut, control->hbond_cut, 2*control->bond_cut); + cutmax = MAX3(control->nonb_cut, control->hbond_cut, control->bond_cut); + if ((cutmax < 2.0*control->bond_cut) && (comm->me == 0)) + error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " + "increased neighbor list skin."); for( int i = 0; i < LIST_N; ++i ) lists[i].allocated = 0; diff --git a/src/USER-OMP/pair_tersoff_zbl_omp.cpp b/src/USER-OMP/pair_tersoff_zbl_omp.cpp index f5c08741ce..f53778d1a1 100644 --- a/src/USER-OMP/pair_tersoff_zbl_omp.cpp +++ b/src/USER-OMP/pair_tersoff_zbl_omp.cpp @@ -205,18 +205,24 @@ void PairTersoffZBLOMP::read_file(char *file) params[nparams].powermint = int(params[nparams].powerm); if ( - params[nparams].lam3 < 0.0 || params[nparams].c < 0.0 || - params[nparams].d < 0.0 || params[nparams].powern < 0.0 || - params[nparams].beta < 0.0 || params[nparams].lam2 < 0.0 || - params[nparams].bigb < 0.0 || params[nparams].bigr < 0.0 || + params[nparams].c < 0.0 || + params[nparams].d < 0.0 || + params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 || params[nparams].bigd < 0.0 || params[nparams].bigd > params[nparams].bigr || - params[nparams].lam3 < 0.0 || params[nparams].biga < 0.0 || + params[nparams].biga < 0.0 || params[nparams].powerm - params[nparams].powermint != 0.0 || - (params[nparams].powermint != 3 && params[nparams].powermint != 1) || + (params[nparams].powermint != 3 && + params[nparams].powermint != 1) || params[nparams].gamma < 0.0 || - params[nparams].Z_i < 1.0 || params[nparams].Z_j < 1.0 || - params[nparams].ZBLcut < 0.0 || params[nparams].ZBLexpscale < 0.0) + params[nparams].Z_i < 1.0 || + params[nparams].Z_j < 1.0 || + params[nparams].ZBLcut < 0.0 || + params[nparams].ZBLexpscale < 0.0) error->all(FLERR,"Illegal Tersoff parameter"); nparams++; diff --git a/src/USER-OMP/pair_ufm_omp.cpp b/src/USER-OMP/pair_ufm_omp.cpp new file mode 100644 index 0000000000..b2e2cd29ee --- /dev/null +++ b/src/USER-OMP/pair_ufm_omp.cpp @@ -0,0 +1,159 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + This software is distributed under the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#include +#include "pair_ufm_omp.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" + +#include "suffix.h" +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairUFMOMP::PairUFMOMP(LAMMPS *lmp) : + PairUFM(lmp), ThrOMP(lmp, THR_PAIR) +{ + suffix_flag |= Suffix::OMP; + respa_enable = 0; +} + +/* ---------------------------------------------------------------------- */ + +void PairUFMOMP::compute(int eflag, int vflag) +{ + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = vflag_fdotr = 0; + + const int nall = atom->nlocal + atom->nghost; + const int nthreads = comm->nthreads; + const int inum = list->inum; + +#if defined(_OPENMP) +#pragma omp parallel default(none) shared(eflag,vflag) +#endif + { + int ifrom, ito, tid; + + loop_setup_thr(ifrom, ito, tid, inum, nthreads); + ThrData *thr = fix->get_thr(tid); + thr->timer(Timer::START); + ev_setup_thr(eflag, vflag, nall, eatom, vatom, thr); + + if (evflag) { + if (eflag) { + if (force->newton_pair) eval<1,1,1>(ifrom, ito, thr); + else eval<1,1,0>(ifrom, ito, thr); + } else { + if (force->newton_pair) eval<1,0,1>(ifrom, ito, thr); + else eval<1,0,0>(ifrom, ito, thr); + } + } else { + if (force->newton_pair) eval<0,0,1>(ifrom, ito, thr); + else eval<0,0,0>(ifrom, ito, thr); + } + + thr->timer(Timer::PAIR); + reduce_thr(this, eflag, vflag, thr); + } // end of omp parallel region +} + +template +void PairUFMOMP::eval(int iifrom, int iito, ThrData * const thr) +{ + int i,j,ii,jj,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,expuf,factor; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + + const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const int * _noalias const type = atom->type; + const int nlocal = atom->nlocal; + const double * _noalias const special_lj = force->special_lj; + double fxtmp,fytmp,fztmp; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = iifrom; ii < iito; ++ii) { + + i = ilist[ii]; + xtmp = x[i].x; + ytmp = x[i].y; + ztmp = x[i].z; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + fxtmp=fytmp=fztmp=0.0; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j].x; + dely = ytmp - x[j].y; + delz = ztmp - x[j].z; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + expuf = exp(- rsq * uf2[itype][jtype]); + fpair = factor * scale[itype][jtype] * uf1[itype][jtype] * expuf /(1.0 - expuf); + + fxtmp += delx*fpair; + fytmp += dely*fpair; + fztmp += delz*fpair; + if (NEWTON_PAIR || j < nlocal) { + f[j].x -= delx*fpair; + f[j].y -= dely*fpair; + f[j].z -= delz*fpair; + } + + if (EFLAG) { + evdwl = -uf3[itype][jtype] * log(1.0 - expuf) - offset[itype][jtype]; + evdwl *= factor; + } + + if (EVFLAG) ev_tally_thr(this,i,j,nlocal,NEWTON_PAIR, + evdwl,0.0,fpair,delx,dely,delz,thr); + } + } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; + } +} + +/* ---------------------------------------------------------------------- */ + +double PairUFMOMP::memory_usage() +{ + double bytes = memory_usage_thr(); + bytes += PairUFM::memory_usage(); + + return bytes; +} diff --git a/src/USER-OMP/pair_ufm_omp.h b/src/USER-OMP/pair_ufm_omp.h new file mode 100644 index 0000000000..2a01da15d0 --- /dev/null +++ b/src/USER-OMP/pair_ufm_omp.h @@ -0,0 +1,50 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(ufm/omp,PairUFMOMP) + +#else + +#ifndef LMP_PAIR_UFM_OMP_H +#define LMP_PAIR_UFM_OMP_H + +#include "pair_ufm.h" +#include "thr_omp.h" + +namespace LAMMPS_NS { + +class PairUFMOMP : public PairUFM, public ThrOMP { + + public: + PairUFMOMP(class LAMMPS *); + + virtual void compute(int, int); + virtual double memory_usage(); + + private: + template + void eval(int ifrom, int ito, ThrData * const thr); +}; + +} + +#endif +#endif diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 6fec7a7e4d..321d104b00 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -601,44 +601,17 @@ void Compute_ForcesOMP( reax_system *system, control_params *control, MPI_Comm comm = mpi_data->world; // Init Forces -#if defined(LOG_PERFORMANCE) - double t_start = 0; - if( system->my_rank == MASTER_NODE ) - t_start = Get_Time( ); -#endif - Init_Forces_noQEq_OMP( system, control, data, workspace, - lists, out_control, comm ); - -#if defined(LOG_PERFORMANCE) - //MPI_Barrier( comm ); - if( system->my_rank == MASTER_NODE ) - Update_Timing_Info( &t_start, &(data->timing.init_forces) ); -#endif + lists, out_control, comm ); // Bonded Interactions Compute_Bonded_ForcesOMP( system, control, data, workspace, lists, out_control, mpi_data->world ); -#if defined(LOG_PERFORMANCE) - if( system->my_rank == MASTER_NODE ) - Update_Timing_Info( &t_start, &(data->timing.bonded) ); -#endif - // Nonbonded Interactions Compute_NonBonded_ForcesOMP( system, control, data, workspace, lists, out_control, mpi_data->world ); -#if defined(LOG_PERFORMANCE) - if( system->my_rank == MASTER_NODE ) - Update_Timing_Info( &t_start, &(data->timing.nonb) ); -#endif - // Total Force Compute_Total_ForceOMP( system, control, data, workspace, lists, mpi_data ); - -#if defined(LOG_PERFORMANCE) - if( system->my_rank == MASTER_NODE ) - Update_Timing_Info( &t_start, &(data->timing.bonded) ); -#endif } diff --git a/src/USER-OMP/respa_omp.cpp b/src/USER-OMP/respa_omp.cpp index 738538a209..e596caab81 100644 --- a/src/USER-OMP/respa_omp.cpp +++ b/src/USER-OMP/respa_omp.cpp @@ -67,24 +67,26 @@ void RespaOMP::init() setup before run ------------------------------------------------------------------------- */ -void RespaOMP::setup() +void RespaOMP::setup(int flag) { if (comm->me == 0 && screen) { fprintf(screen,"Setting up r-RESPA/omp run ...\n"); - fprintf(screen," Unit style : %s\n", update->unit_style); - fprintf(screen," Current step : " BIGINT_FORMAT "\n", update->ntimestep); - fprintf(screen," Time steps :"); - for (int ilevel=0; ilevel < nlevels; ++ilevel) - fprintf(screen," %d:%g",ilevel+1, step[ilevel]); - fprintf(screen,"\n r-RESPA fixes :"); - for (int l=0; l < modify->n_post_force_respa; ++l) { - Fix *f = modify->fix[modify->list_post_force_respa[l]]; - if (f->respa_level >= 0) - fprintf(screen," %d:%s[%s]", - MIN(f->respa_level+1,nlevels),f->style,f->id); + if (flag) { + fprintf(screen," Unit style : %s\n", update->unit_style); + fprintf(screen," Current step : " BIGINT_FORMAT "\n", update->ntimestep); + fprintf(screen," Time steps :"); + for (int ilevel=0; ilevel < nlevels; ++ilevel) + fprintf(screen," %d:%g",ilevel+1, step[ilevel]); + fprintf(screen,"\n r-RESPA fixes :"); + for (int l=0; l < modify->n_post_force_respa; ++l) { + Fix *f = modify->fix[modify->list_post_force_respa[l]]; + if (f->respa_level >= 0) + fprintf(screen," %d:%s[%s]", + MIN(f->respa_level+1,nlevels),f->style,f->id); + } + fprintf(screen,"\n"); + timer->print_timeout(screen); } - fprintf(screen,"\n"); - timer->print_timeout(screen); } update->setupflag = 1; @@ -107,7 +109,8 @@ void RespaOMP::setup() domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // compute all forces @@ -199,7 +202,8 @@ void RespaOMP::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -309,8 +313,12 @@ void RespaOMP::recurse(int ilevel) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); + if (modify->n_post_neighbor) { + modify->post_neighbor(); + timer->stamp(Timer::MODIFY); + } } else if (ilevel == 0) { timer->stamp(); comm->forward_comm(); diff --git a/src/USER-OMP/respa_omp.h b/src/USER-OMP/respa_omp.h index 89ddbe78af..dc01e3dc5b 100644 --- a/src/USER-OMP/respa_omp.h +++ b/src/USER-OMP/respa_omp.h @@ -30,7 +30,7 @@ class RespaOMP : public Respa, public ThrOMP { RespaOMP(class LAMMPS *, int, char **); virtual ~RespaOMP() {} virtual void init(); - virtual void setup(); + virtual void setup(int); virtual void setup_minimal(int); protected: diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 9d165f3fd3..a79c5edd07 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -95,7 +95,7 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : pack_flag = 0; s = NULL; t = NULL; - nprev = 5; + nprev = 4; Hdia_inv = NULL; b_s = NULL; @@ -428,7 +428,7 @@ void FixQEqReax::init_taper() Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; Tap[1] = 140.0 * swa3 * swb3 / d7; - Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; } @@ -817,7 +817,7 @@ void FixQEqReax::calculate_Q() q[i] = s[i] - u * t[i]; /* backup s & t */ - for (k = 4; k > 0; --k) { + for (k = nprev-1; k > 0; --k) { s_hist[i][k] = s_hist[i][k-1]; t_hist[i][k] = t_hist[i][k-1]; } diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index 19efcd2b03..96a174b908 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -122,15 +122,15 @@ class FixQEqReax : public Fix { //int GMRES(double*,double*); virtual void sparse_matvec(sparse_matrix*,double*,double*); - int pack_forward_comm(int, int *, double *, int, int *); - void unpack_forward_comm(int, int, double *); - int pack_reverse_comm(int, int, double *); - void unpack_reverse_comm(int, int *, double *); - double memory_usage(); - void grow_arrays(int); - void copy_arrays(int, int, int); - int pack_exchange(int, double *); - int unpack_exchange(int, double *); + virtual int pack_forward_comm(int, int *, double *, int, int *); + virtual void unpack_forward_comm(int, int, double *); + virtual int pack_reverse_comm(int, int, double *); + virtual void unpack_reverse_comm(int, int *, double *); + virtual double memory_usage(); + virtual void grow_arrays(int); + virtual void copy_arrays(int, int, int); + virtual int pack_exchange(int, double *); + virtual int unpack_exchange(int, double *); virtual double parallel_norm( double*, int ); virtual double parallel_dot( double*, double*, int ); diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 0f4bd49cc8..626e965667 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -387,8 +387,11 @@ void PairReaxC::init_style( ) neighbor->requests[irequest]->newton = 2; neighbor->requests[irequest]->ghost = 1; - cutmax = MAX3(control->nonb_cut, control->hbond_cut, 2*control->bond_cut); - + cutmax = MAX3(control->nonb_cut, control->hbond_cut, control->bond_cut); + if ((cutmax < 2.0*control->bond_cut) && (comm->me == 0)) + error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " + "increased neighbor list skin."); + for( int i = 0; i < LIST_N; ++i ) lists[i].allocated = 0; @@ -697,7 +700,7 @@ int PairReaxC::write_reax_lists() int itr_i, itr_j, i, j; int num_nbrs; int *ilist, *jlist, *numneigh, **firstneigh; - double d_sqr; + double d_sqr, cutoff_sqr; rvec dvec; double *dist, **x; reax_list *far_nbrs; @@ -712,6 +715,7 @@ int PairReaxC::write_reax_lists() far_list = far_nbrs->select.far_nbr_list; num_nbrs = 0; + int inum = list->inum; dist = (double*) calloc( system->N, sizeof(double) ); int numall = list->inum + list->gnum; @@ -721,12 +725,17 @@ int PairReaxC::write_reax_lists() jlist = firstneigh[i]; Set_Start_Index( i, num_nbrs, far_nbrs ); + if (i < inum) + cutoff_sqr = control->nonb_cut*control->nonb_cut; + else + cutoff_sqr = control->bond_cut*control->bond_cut; + for( itr_j = 0; itr_j < numneigh[i]; ++itr_j ){ j = jlist[itr_j]; j &= NEIGHMASK; get_distance( x[j], x[i], &d_sqr, &dvec ); - if( d_sqr <= (control->nonb_cut*control->nonb_cut) ){ + if( d_sqr <= (cutoff_sqr) ){ dist[j] = sqrt( d_sqr ); set_far_nbr( &far_list[num_nbrs], j, dist[j], dvec ); ++num_nbrs; diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index b11cdd2fbc..4af21284f2 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -113,7 +113,7 @@ void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) workspace->Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; workspace->Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; workspace->Tap[1] = 140.0 * swa3 * swb3 / d7; - workspace->Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + workspace->Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; } diff --git a/src/USER-SMD/atom_vec_smd.cpp b/src/USER-SMD/atom_vec_smd.cpp index 2a0d65b642..d2d72a855a 100644 --- a/src/USER-SMD/atom_vec_smd.cpp +++ b/src/USER-SMD/atom_vec_smd.cpp @@ -1099,7 +1099,7 @@ void AtomVecSMD::data_atom(double *coord, imageint imagetmp, char **values) { ------------------------------------------------------------------------- */ int AtomVecSMD::data_atom_hybrid(int nlocal, char **values) { - error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style tlsph"); + error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style smd"); return -1; } @@ -1121,7 +1121,7 @@ void AtomVecSMD::data_vel(int m, char **values) { ------------------------------------------------------------------------- */ int AtomVecSMD::data_vel_hybrid(int m, char **values) { - error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style tlsph"); + error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style smd"); return 0; } @@ -1143,10 +1143,14 @@ void AtomVecSMD::pack_data(double **buf) { buf[i][7] = x[i][0]; buf[i][8] = x[i][1]; buf[i][9] = x[i][2]; + + buf[i][10] = x0[i][0]; + buf[i][11] = x0[i][1]; + buf[i][12] = x0[i][2]; - buf[i][10] = ubuf((image[i] & IMGMASK) - IMGMAX).d; - buf[i][11] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d; - buf[i][12] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d; + buf[i][13] = ubuf((image[i] & IMGMASK) - IMGMAX).d; + buf[i][14] = ubuf((image[i] >> IMGBITS & IMGMASK) - IMGMAX).d; + buf[i][15] = ubuf((image[i] >> IMG2BITS) - IMGMAX).d; } } @@ -1155,7 +1159,7 @@ void AtomVecSMD::pack_data(double **buf) { ------------------------------------------------------------------------- */ int AtomVecSMD::pack_data_hybrid(int i, double *buf) { - error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style tlsph"); + error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style smd"); return -1; } @@ -1167,9 +1171,9 @@ void AtomVecSMD::write_data(FILE *fp, int n, double **buf) { for (int i = 0; i < n; i++) fprintf(fp, TAGINT_FORMAT - " %d %d %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %d %d %d\n", (tagint) ubuf(buf[i][0]).i, + " %d %d %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e\n", (tagint) ubuf(buf[i][0]).i, (int) ubuf(buf[i][1]).i, (int) ubuf(buf[i][2]).i, buf[i][3], buf[i][4], buf[i][5], buf[i][6], buf[i][7], buf[i][8], - buf[i][9], (int) ubuf(buf[i][7]).i, (int) ubuf(buf[i][8]).i, (int) ubuf(buf[i][9]).i); + buf[i][9], buf[i][10], buf[i][11], buf[i][12]); } /* ---------------------------------------------------------------------- @@ -1177,7 +1181,7 @@ void AtomVecSMD::write_data(FILE *fp, int n, double **buf) { ------------------------------------------------------------------------- */ int AtomVecSMD::write_data_hybrid(FILE *fp, double *buf) { - error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style tlsph"); + error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style smd"); return -1; } @@ -1200,7 +1204,7 @@ void AtomVecSMD::pack_vel(double **buf) { ------------------------------------------------------------------------- */ int AtomVecSMD::pack_vel_hybrid(int i, double *buf) { - error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style tlsph"); + error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style smd"); return 0; } @@ -1211,8 +1215,7 @@ int AtomVecSMD::pack_vel_hybrid(int i, double *buf) { void AtomVecSMD::write_vel(FILE *fp, int n, double **buf) { for (int i = 0; i < n; i++) fprintf(fp, TAGINT_FORMAT - " %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e\n", (tagint) ubuf(buf[i][0]).i, buf[i][1], buf[i][2], buf[i][3], - buf[i][4], buf[i][5], buf[i][6]); + " %-1.16e %-1.16e %-1.16e\n", (tagint) ubuf(buf[i][0]).i, buf[i][1], buf[i][2], buf[i][3]); } /* ---------------------------------------------------------------------- @@ -1220,7 +1223,7 @@ void AtomVecSMD::write_vel(FILE *fp, int n, double **buf) { ------------------------------------------------------------------------- */ int AtomVecSMD::write_vel_hybrid(FILE *fp, double *buf) { - error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style tlsph"); + error->one(FLERR, "hybrid atom style functionality not yet implemented for atom style smd"); return 3; } diff --git a/src/USER-SMD/pair_smd_tlsph.cpp b/src/USER-SMD/pair_smd_tlsph.cpp index 1900519935..8dac846017 100644 --- a/src/USER-SMD/pair_smd_tlsph.cpp +++ b/src/USER-SMD/pair_smd_tlsph.cpp @@ -775,9 +775,9 @@ void PairTlsph::AssembleStress() { // compute a characteristic time over which to average the plastic strain double tav = 1000 * radius[i] / (Lookup[SIGNAL_VELOCITY][itype]); - eff_plastic_strain_rate[i] -= eff_plastic_strain_rate[i] / tav; - eff_plastic_strain_rate[i] += (plastic_strain_increment / dt) / tav; - eff_plastic_strain_rate[i] = MAX(0.0, eff_plastic_strain_rate[i]); + eff_plastic_strain_rate[i] -= eff_plastic_strain_rate[i] * dt / tav; + eff_plastic_strain_rate[i] += plastic_strain_increment / tav; + eff_plastic_strain_rate[i] = MAX(0.0, eff_plastic_strain_rate[i]); /* * assemble total stress from pressure and deviatoric stress @@ -1066,7 +1066,7 @@ void PairTlsph::coeff(int narg, char **arg) { Lookup[HEAT_CAPACITY][itype] = force->numeric(FLERR, arg[ioffset + 7]); Lookup[LAME_LAMBDA][itype] = Lookup[YOUNGS_MODULUS][itype] * Lookup[POISSON_RATIO][itype] - / ((1.0 + Lookup[POISSON_RATIO][itype] * (1.0 - 2.0 * Lookup[POISSON_RATIO][itype]))); + / ((1.0 + Lookup[POISSON_RATIO][itype]) * (1.0 - 2.0 * Lookup[POISSON_RATIO][itype])); Lookup[SHEAR_MODULUS][itype] = Lookup[YOUNGS_MODULUS][itype] / (2.0 * (1.0 + Lookup[POISSON_RATIO][itype])); Lookup[M_MODULUS][itype] = Lookup[LAME_LAMBDA][itype] + 2.0 * Lookup[SHEAR_MODULUS][itype]; Lookup[SIGNAL_VELOCITY][itype] = sqrt( diff --git a/src/USER-SMD/smd_material_models.cpp b/src/USER-SMD/smd_material_models.cpp index 228d1c709a..f1288ae5ca 100644 --- a/src/USER-SMD/smd_material_models.cpp +++ b/src/USER-SMD/smd_material_models.cpp @@ -75,7 +75,7 @@ void ShockEOS(double rho, double rho0, double e, double e0, double c0, double S, double mu = rho / rho0 - 1.0; double pH = rho0 * square(c0) * mu * (1.0 + mu) / square(1.0 - (S - 1.0) * mu); - pFinal = (pH + rho * Gamma * (e - e0)); + pFinal = (-pH + rho * Gamma * (e - e0)); //printf("shock EOS: rho = %g, rho0 = %g, Gamma=%f, c0=%f, S=%f, e=%f, e0=%f\n", rho, rho0, Gamma, c0, S, e, e0); //printf("pFinal = %f\n", pFinal); diff --git a/src/USER-TALLY/compute_force_tally.cpp b/src/USER-TALLY/compute_force_tally.cpp index 5f29aea5b2..3ec6c188fc 100644 --- a/src/USER-TALLY/compute_force_tally.cpp +++ b/src/USER-TALLY/compute_force_tally.cpp @@ -12,6 +12,7 @@ ------------------------------------------------------------------------- */ #include +#include #include "compute_force_tally.h" #include "atom.h" #include "group.h" @@ -20,6 +21,7 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "comm.h" using namespace LAMMPS_NS; diff --git a/src/USER-TALLY/compute_heat_flux_tally.cpp b/src/USER-TALLY/compute_heat_flux_tally.cpp index c090050b15..43b663b27a 100644 --- a/src/USER-TALLY/compute_heat_flux_tally.cpp +++ b/src/USER-TALLY/compute_heat_flux_tally.cpp @@ -20,6 +20,7 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "comm.h" using namespace LAMMPS_NS; diff --git a/src/USER-TALLY/compute_pe_mol_tally.cpp b/src/USER-TALLY/compute_pe_mol_tally.cpp index 25a172b7f8..0328740e03 100644 --- a/src/USER-TALLY/compute_pe_mol_tally.cpp +++ b/src/USER-TALLY/compute_pe_mol_tally.cpp @@ -20,6 +20,7 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "comm.h" using namespace LAMMPS_NS; diff --git a/src/USER-TALLY/compute_pe_tally.cpp b/src/USER-TALLY/compute_pe_tally.cpp index 5b4644d4e1..caa4cf134a 100644 --- a/src/USER-TALLY/compute_pe_tally.cpp +++ b/src/USER-TALLY/compute_pe_tally.cpp @@ -20,6 +20,7 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "comm.h" using namespace LAMMPS_NS; diff --git a/src/USER-TALLY/compute_stress_tally.cpp b/src/USER-TALLY/compute_stress_tally.cpp index 32253d2cad..e44313d695 100644 --- a/src/USER-TALLY/compute_stress_tally.cpp +++ b/src/USER-TALLY/compute_stress_tally.cpp @@ -20,6 +20,8 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "comm.h" +#include "domain.h" using namespace LAMMPS_NS; diff --git a/src/USER-UEF/README b/src/USER-UEF/README new file mode 100644 index 0000000000..92b2cee5e3 --- /dev/null +++ b/src/USER-UEF/README @@ -0,0 +1,47 @@ +USER-UEF is a LAMMPS package for non-equilibrium molecular dynamics +(NEMD) under diagonal flow fields, including uniaxial and biaxial +flow. With this package, simulations under extensional flow may be +carried out for an indefinite amount of time. It is an implementation +of the boundary conditions developed by Matthew Dobson, and also uses +numerical lattice reduction as was proposed by Thomas Hunt. The +lattice reduction algorithm is from Igor Semaev. The package is +intended for simulations of homogeneous flows, and integrates the +SLLOD equations of motion. + +-- + +This package was created by David Nicholson (davidanich@gmail.com) +at the Massachusetts Institute of Technology. + +-- + +The following commands are contained in this package: + +fix npt/uef and fix nvt/uef: + These commands perform time-integration of the SLLOD equations of + motion under constant temperature/pressure with the proper + boundary conditions for extensional flow fields. + +compute pressure/uef and compute temp/uef: + These commands allow for the evaluation of pressure/ke tensors in + the reference frame corresponding to the applied flow field. + +dump cfg/uef: + This command dumps coordinates in the reference frame corresponding + to the applied flow field. + +For more information, visit the documentation page for fix nvt/uef +and examine the example scripts in doc/USER/uef/. + +-- + +References: + +I. Semaev, Cryptography and Lattices, 181 (2001). + +M. Dobson, J. Chem. Phys., 141, 184103 (2014) + +T.A. Hunt, Mol. Simul., 42, 347 (2016). + +D.A. Nicholson, G.C. Rutledge, J. Chem. Phys.,145, 244903 (2016) + diff --git a/src/USER-UEF/compute_pressure_uef.cpp b/src/USER-UEF/compute_pressure_uef.cpp new file mode 100644 index 0000000000..43054d7d3f --- /dev/null +++ b/src/USER-UEF/compute_pressure_uef.cpp @@ -0,0 +1,195 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "compute_pressure_uef.h" +#include "fix_nh_uef.h" +#include "update.h" +#include "domain.h" +#include "modify.h" +#include "fix.h" +#include "force.h" +#include "pair.h" +#include "bond.h" +#include "angle.h" +#include "dihedral.h" +#include "improper.h" +#include "kspace.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- + * Default values for the ext flags + * ----------------------------------------------------------------------*/ +ComputePressureUef::ComputePressureUef(LAMMPS *lmp, int narg, char **arg) : + ComputePressure(lmp, narg, arg) +{ + ext_flags[0] = true; + ext_flags[1] = true; + ext_flags[2] = true; + in_fix=false; +} + +/* ---------------------------------------------------------------------- + * Check for the uef fix + * ----------------------------------------------------------------------*/ +void ComputePressureUef::init() +{ + ComputePressure::init(); + // check to make sure the other uef fix is on + // borrowed from Pieter's nvt/sllod code + int i=0; + for (i=0; infix; i++) { + if (strcmp(modify->fix[i]->style,"nvt/uef")==0) + break; + if (strcmp(modify->fix[i]->style,"npt/uef")==0) + break; + } + if (i==modify->nfix) + error->all(FLERR,"Can't use compute pressure/uef without defining a fix nvt/npt/uef"); + ifix_uef=i; + ((FixNHUef*) modify->fix[ifix_uef])->get_ext_flags(ext_flags); + + if (strcmp(temperature->style,"temp/uef") != 0) + error->warning(FLERR,"The temperature used in compute pressure/ued is not of style temp/uef"); +} + +/* ---------------------------------------------------------------------- + * Compute pressure in the directions i corresponding to ext_flag[i]=true + * ----------------------------------------------------------------------*/ +double ComputePressureUef::compute_scalar() +{ + + temperature->compute_scalar(); +// if all pressures are external the scalar is found as normal + if (ext_flags[0] && ext_flags[1] && ext_flags[2]) + return ComputePressure::compute_scalar(); + +// otherwise compute the full tensor and average desired components + compute_vector(); + addstep(update->ntimestep+1); + + int k =0; + scalar = 0; + if (ext_flags[0]) { + scalar += vector[0]; + k++; + } + if (ext_flags[1]) { + scalar += vector[1]; + k++; + } + if (ext_flags[2]) { + scalar += vector[2]; + k++; + } + + scalar /= k; + return scalar; +} + +/* ---------------------------------------------------------------------- + Compute the pressure tensor in the rotated coordinate system +------------------------------------------------------------------------- */ +void ComputePressureUef::compute_vector() +{ + invoked_vector = update->ntimestep; + if (update->vflag_global != invoked_vector) + error->all(FLERR,"Virial was not tallied on needed timestep"); + + if (force->kspace && kspace_virial && force->kspace->scalar_pressure_flag) + error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' for " + "tensor components with kspace_style msm"); + + // invoke temperature if it hasn't been already + + double *ke_tensor; + if (keflag) { + if (temperature->invoked_vector != update->ntimestep) + temperature->compute_vector(); + ke_tensor = temperature->vector; + } + + if (dimension == 3) { + inv_volume = 1.0 / (domain->xprd * domain->yprd * domain->zprd); + virial_compute(6,3); + if (in_fix) + virial_rot(virial,rot); + else + { + double r[3][3]; + ( (FixNHUef*) modify->fix[ifix_uef])->get_rot(r); + virial_rot(virial,r); + } + if (keflag) { + for (int i = 0; i < 6; i++) + vector[i] = (ke_tensor[i] + virial[i]) * inv_volume * nktv2p; + } else + for (int i = 0; i < 6; i++) + vector[i] = virial[i] * inv_volume * nktv2p; + } else { + inv_volume = 1.0 / (domain->xprd * domain->yprd); + virial_compute(4,2); + if (keflag) { + vector[0] = (ke_tensor[0] + virial[0]) * inv_volume * nktv2p; + vector[1] = (ke_tensor[1] + virial[1]) * inv_volume * nktv2p; + vector[3] = (ke_tensor[3] + virial[3]) * inv_volume * nktv2p; + vector[2] = vector[4] = vector[5] = 0.0; + } else { + vector[0] = virial[0] * inv_volume * nktv2p; + vector[1] = virial[1] * inv_volume * nktv2p; + vector[3] = virial[3] * inv_volume * nktv2p; + vector[2] = vector[4] = vector[5] = 0.0; + } + } +} + +/* ---------------------------------------------------------------------- + * get the current rotation matrix and store it +------------------------------------------------------------------------- */ +void ComputePressureUef::update_rot() +{ + ( (FixNHUef*) modify->fix[ifix_uef])->get_rot(rot); +} + +/* ---------------------------------------------------------------------- + Transform the pressure tensor to the rotated coordinate system + [P]rot = Q.[P].Q^t +------------------------------------------------------------------------- */ +void ComputePressureUef::virial_rot(double *x, const double r[3][3]) +{ + + double t[3][3]; + + // [00 10 20 ] [ 0 3 4 ] [00 01 02 ] + // [01 11 21 ] [ 3 1 5 ] [10 11 12 ] + // [02 12 22 ] [ 4 5 2 ] [20 21 22 ] + + for (int k = 0; k<3; ++k) + { + t[0][k] = x[0]*r[0][k] + x[3]*r[1][k] + x[4]*r[2][k]; + t[1][k] = x[3]*r[0][k] + x[1]*r[1][k] + x[5]*r[2][k]; + t[2][k] = x[4]*r[0][k] + x[5]*r[1][k] + x[2]*r[2][k]; + } + x[0] = r[0][0]*t[0][0] + r[1][0]*t[1][0] + r[2][0]*t[2][0]; + x[3] = r[0][0]*t[0][1] + r[1][0]*t[1][1] + r[2][0]*t[2][1]; + x[4] = r[0][0]*t[0][2] + r[1][0]*t[1][2] + r[2][0]*t[2][2]; + x[1] = r[0][1]*t[0][1] + r[1][1]*t[1][1] + r[2][1]*t[2][1]; + x[5] = r[0][1]*t[0][2] + r[1][1]*t[1][2] + r[2][1]*t[2][2]; + x[2] = r[0][2]*t[0][2] + r[1][2]*t[1][2] + r[2][2]*t[2][2]; +} diff --git a/src/USER-UEF/compute_pressure_uef.h b/src/USER-UEF/compute_pressure_uef.h new file mode 100644 index 0000000000..d3a4d3195c --- /dev/null +++ b/src/USER-UEF/compute_pressure_uef.h @@ -0,0 +1,66 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(pressure/uef,ComputePressureUef) + +#else + +#ifndef LMP_COMPUTE_PRESSURE_UEF_H +#define LMP_COMPUTE_PRESSURE_UEF_H + +#include "compute_pressure.h" + +namespace LAMMPS_NS { + +class ComputePressureUef : public ComputePressure { + public: + ComputePressureUef(class LAMMPS *, int, char **); + virtual ~ComputePressureUef(){} + virtual void init(); + virtual void compute_vector(); + virtual double compute_scalar(); + void update_rot(); + bool in_fix; //true if this compute is used in fix/nvt/npt + + + protected: + bool ext_flags[3]; // true if used in average output pressure + void virial_rot(double*,const double[3][3]); + int ifix_uef; + double rot[3][3]; +}; + + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +This class inherits most of the warnings from ComputePressure. The +only additions are: + +E: Can't use compute pressure/uef without defining a fix nvt/npt/uef + +Self-explanatory. + +W: The temperature used in compute pressure/uef is not of style temp/uef + +Self-explanatory. + +*/ diff --git a/src/USER-UEF/compute_temp_uef.cpp b/src/USER-UEF/compute_temp_uef.cpp new file mode 100644 index 0000000000..6055524056 --- /dev/null +++ b/src/USER-UEF/compute_temp_uef.cpp @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#include +#include +#include "compute_temp_uef.h" +#include "fix_nh_uef.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- + * Base constructor initialized to use rotation matrix + * ----------------------------------------------------------------------*/ +ComputeTempUef::ComputeTempUef(LAMMPS *lmp, int narg, char **arg) : + ComputeTemp(lmp, narg, arg) +{ + rot_flag=true; +} + +/* ---------------------------------------------------------------------- + * Check for the uef fix + * ----------------------------------------------------------------------*/ +void ComputeTempUef::init() +{ + ComputeTemp::init(); + // check to make sure the other uef fix is on + // borrowed from Pieter's nvt/sllod code + int i=0; + for (i=0; infix; i++) { + if (strcmp(modify->fix[i]->style,"nvt/uef")==0) + break; + if (strcmp(modify->fix[i]->style,"npt/uef")==0) + break; + } + if (i==modify->nfix) + error->all(FLERR,"Can't use compute temp/uef without defining a fix nvt/npt/uef"); + ifix_uef=i; +} + + +/* ---------------------------------------------------------------------- + Compute the ke tensor in the proper coordinate system +------------------------------------------------------------------------- */ +void ComputeTempUef::compute_vector() +{ + ComputeTemp::compute_vector(); + if (rot_flag) { + double rot[3][3]; + ( (FixNHUef*) modify->fix[ifix_uef])->get_rot(rot); + virial_rot(vector,rot); + } + +} + +/* ---------------------------------------------------------------------- + * turn the rotation matrix on or off to properly account for the + * coordinate system of the velocities +------------------------------------------------------------------------- */ +void ComputeTempUef::yes_rot() +{ + rot_flag =true; +} +void ComputeTempUef::no_rot() +{ + rot_flag =false; +} + +/* ---------------------------------------------------------------------- + Transform the pressure tensor to the rotated coordinate system + [P]rot = Q.[P].Q^t +------------------------------------------------------------------------- */ +void ComputeTempUef::virial_rot(double *x, const double r[3][3]) +{ + + double t[3][3]; + // [00 10 20 ] [ 0 3 4 ] [00 01 02 ] + // [01 11 21 ] [ 3 1 5 ] [10 11 12 ] + // [02 12 22 ] [ 4 5 2 ] [20 21 22 ] + for (int k = 0; k<3; ++k) { + t[0][k] = x[0]*r[0][k] + x[3]*r[1][k] + x[4]*r[2][k]; + t[1][k] = x[3]*r[0][k] + x[1]*r[1][k] + x[5]*r[2][k]; + t[2][k] = x[4]*r[0][k] + x[5]*r[1][k] + x[2]*r[2][k]; + } + x[0] = r[0][0]*t[0][0] + r[1][0]*t[1][0] + r[2][0]*t[2][0]; + x[3] = r[0][0]*t[0][1] + r[1][0]*t[1][1] + r[2][0]*t[2][1]; + x[4] = r[0][0]*t[0][2] + r[1][0]*t[1][2] + r[2][0]*t[2][2]; + x[1] = r[0][1]*t[0][1] + r[1][1]*t[1][1] + r[2][1]*t[2][1]; + x[5] = r[0][1]*t[0][2] + r[1][1]*t[1][2] + r[2][1]*t[2][2]; + x[2] = r[0][2]*t[0][2] + r[1][2]*t[1][2] + r[2][2]*t[2][2]; +} diff --git a/src/USER-UEF/compute_temp_uef.h b/src/USER-UEF/compute_temp_uef.h new file mode 100644 index 0000000000..460e2b18c0 --- /dev/null +++ b/src/USER-UEF/compute_temp_uef.h @@ -0,0 +1,60 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(temp/uef,ComputeTempUef) + +#else + +#ifndef LMP_COMPUTE_TEMP_UEF_H +#define LMP_COMPUTE_TEMP_UEF_H + +#include "compute_temp.h" + +namespace LAMMPS_NS { + +class ComputeTempUef : public ComputeTemp { + public: + ComputeTempUef(class LAMMPS *, int, char **); + virtual ~ComputeTempUef(){} + virtual void init(); + virtual void compute_vector(); + void yes_rot(); + void no_rot(); + + + protected: + bool rot_flag; + void virial_rot(double*,const double[3][3]); + int ifix_uef; +}; + + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +This class inherits most of the warnings from ComputePressure. The +only addition is: + +E: Can't use compute temp/uef without defining a fix nvt/npt/uef + +Self-explanatory. + +*/ diff --git a/src/USER-UEF/dump_cfg_uef.cpp b/src/USER-UEF/dump_cfg_uef.cpp new file mode 100644 index 0000000000..4b0c08275a --- /dev/null +++ b/src/USER-UEF/dump_cfg_uef.cpp @@ -0,0 +1,114 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing Author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + + +#include +#include +#include +#include "dump_cfg.h" +#include "atom.h" +#include "domain.h" +#include "modify.h" +#include "compute.h" +#include "fix.h" +#include "error.h" +#include "uef_utils.h" +#include "dump_cfg_uef.h" +#include "fix_nh_uef.h" + +using namespace LAMMPS_NS; + +enum{INT,DOUBLE,STRING,BIGINT}; // same as in DumpCustom + +#define UNWRAPEXPAND 10.0 +#define ONEFIELD 32 +#define DELTA 1048576 + +/* ---------------------------------------------------------------------- + * base method is mostly fine, just need to find the FixNHUef + * ----------------------------------------------------------------------*/ +void DumpCFGUef::init_style() +{ + DumpCFG::init_style(); + + // check to make sure the other uef fix is on + // borrowed from Pieter's nvt/sllod code + int i=0; + for (i=0; infix; i++) + { + if (strcmp(modify->fix[i]->style,"nvt/uef")==0) + break; + if (strcmp(modify->fix[i]->style,"npt/uef")==0) + break; + } + if (i==modify->nfix) + error->all(FLERR,"Can't use dump cfg/uef without defining a fix nvt/npt/uef"); + ifix_uef=i; +} + +/* ---------------------------------------------------------------------- + * this is really the only difference between the base class and this one. + * since the output is in scaled coordinates, changing the simulation box + * edges to the flow frame will put coordinates in the flow frame too. + * ----------------------------------------------------------------------*/ + +void DumpCFGUef::write_header(bigint n) +{ + // set scale factor used by AtomEye for CFG viz + // default = 1.0 + // for peridynamics, set to pre-computed PD scale factor + // so PD particles mimic C atoms + // for unwrapped coords, set to UNWRAPEXPAND (10.0) + // so molecules are not split across periodic box boundaries + + double box[3][3],rot[3][3]; + ((FixNHUef*) modify->fix[ifix_uef])->get_box(box); + ((FixNHUef*) modify->fix[ifix_uef])->get_rot(rot); + // rot goes from "lab frame" to "upper triangular frame" + // it's transpose takes the simulation box to the flow frame + for (int i=0;i<3;i++) + for(int j=i+1;j<3;j++) + { + double t=rot[i][j]; + rot[i][j]=rot[j][i]; + rot[j][i]=t; + } + UEF_utils::mul_m2(rot,box); + + + double scale = 1.0; + if (atom->peri_flag) scale = atom->pdscale; + else if (unwrapflag == 1) scale = UNWRAPEXPAND; + + char str[64]; + sprintf(str,"Number of particles = %s\n",BIGINT_FORMAT); + fprintf(fp,str,n); + fprintf(fp,"A = %g Angstrom (basic length-scale)\n",scale); + // in box[][] columns are cell edges + // in H0, rows are cell edges + fprintf(fp,"H0(1,1) = %g A\n",box[0][0]); + fprintf(fp,"H0(1,2) = %g A\n",box[1][0]); + fprintf(fp,"H0(1,3) = %g A\n",box[2][0]); + fprintf(fp,"H0(2,1) = %g A\n",box[0][1]); + fprintf(fp,"H0(2,2) = %g A\n",box[1][1]); + fprintf(fp,"H0(2,3) = %g A\n",box[2][1]); + fprintf(fp,"H0(3,1) = %g A\n",box[0][2]); + fprintf(fp,"H0(3,2) = %g A\n",box[1][2]); + fprintf(fp,"H0(3,3) = %g A\n",box[2][2]); + fprintf(fp,".NO_VELOCITY.\n"); + fprintf(fp,"entry_count = %d\n",nfield-2); + for (int i = 0; i < nfield-5; i++) + fprintf(fp,"auxiliary[%d] = %s\n",i,auxname[i]); +} diff --git a/src/USER-UEF/dump_cfg_uef.h b/src/USER-UEF/dump_cfg_uef.h new file mode 100644 index 0000000000..d2881136ad --- /dev/null +++ b/src/USER-UEF/dump_cfg_uef.h @@ -0,0 +1,51 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing Author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#ifdef DUMP_CLASS + +DumpStyle(cfg/uef,DumpCFGUef) + +#else + +#ifndef LMP_DUMP_CFG_UEF_H +#define LMP_DUMP_CFG_UEF_H + +#include "dump_cfg.h" + +namespace LAMMPS_NS { + +class DumpCFGUef : public DumpCFG { + public: + DumpCFGUef(LAMMPS *lmp, int narg, char **arg) : + DumpCFG(lmp, narg, arg){} + void init_style(); + void write_header(bigint); + + protected: + int ifix_uef; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Can't use dump cfg/uef without defining a fix nvt/npt/uef + +Self-explanatory. + +*/ diff --git a/src/USER-UEF/fix_nh_uef.cpp b/src/USER-UEF/fix_nh_uef.cpp new file mode 100644 index 0000000000..36494b0d49 --- /dev/null +++ b/src/USER-UEF/fix_nh_uef.cpp @@ -0,0 +1,820 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "fix_nh_uef.h" +#include "atom.h" +#include "force.h" +#include "group.h" +#include "comm.h" +#include "citeme.h" +#include "irregular.h" +#include "modify.h" +#include "compute.h" +#include "kspace.h" +#include "update.h" +#include "domain.h" +#include "error.h" +#include "output.h" +#include "timer.h" +#include "neighbor.h" +#include "compute_pressure_uef.h" +#include "compute_temp_uef.h" +#include "uef_utils.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum{ISO,ANISO,TRICLINIC}; + +// citation info + +static const char cite_user_uef_package[] = + "USER-UEF package:\n\n" + "@Article{NicholsonRutledge16,\n" + "author = {David A. Nicholson and Gregory C. Rutledge},\n" + "title = {Molecular simulation of flow-enhanced nucleation in n-eicosane melts under steady shear and uniaxial extension},\n" + "journal = {The Journal of Chemical Physics},\n" + "volume = {145},\n" + "number = {24},\n" + "pages = {244903},\n" + "year = {2016}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- + * Parse fix specific keywords, do some error checking, and initalize + * temp/pressure fixes + ---------------------------------------------------------------------- */ +FixNHUef::FixNHUef(LAMMPS *lmp, int narg, char **arg) : + FixNH(lmp, narg, arg), uefbox(NULL) +{ + if (lmp->citeme) lmp->citeme->add(cite_user_uef_package); + + //initialization + + erate[0] = erate[1] = 0; + + // default values + + strain[0]=strain[1]= 0; + ext_flags[0]=ext_flags[1]=ext_flags[2] = true; + + // need to initialize these + + omega_dot[0]=omega_dot[1]=omega_dot[2]=0; + + // parse fix nh/uef specific options + + bool erate_flag = false; + int iarg = 3; + + while (iarg narg) error->all(FLERR,"Illegal fix nvt/npt/uef command"); + erate[0] = force->numeric(FLERR,arg[iarg+1]); + erate[1] = force->numeric(FLERR,arg[iarg+2]); + erate_flag = true; + iarg += 3; + } else if (strcmp(arg[iarg],"strain")==0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal fix nvt/npt/uef command"); + strain[0] = force->numeric(FLERR,arg[iarg+1]); + strain[1] = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"ext")==0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix nvt/npt/uef command"); + if (strcmp(arg[iarg+1],"x")==0) + ext_flags[1] = ext_flags[2] = false; + else if (strcmp(arg[iarg+1],"y")==0) + ext_flags[0] = ext_flags[2] = false; + else if (strcmp(arg[iarg+1],"z")==0) + ext_flags[0] = ext_flags[1] = false; + else if (strcmp(arg[iarg+1],"xy")==0) + ext_flags[2] = false; + else if (strcmp(arg[iarg+1],"xz")==0) + ext_flags[1] = false; + else if (strcmp(arg[iarg+1],"yz")==0) + ext_flags[0] = false; + else if (strcmp(arg[iarg+1],"xyz")!=0) + error->all(FLERR,"Illegal fix nvt/npt/uef command"); + + iarg += 2; + } else { + + // skip to next argument; argument check for unknown keywords is done in FixNH + + ++iarg; + } + } + + if (!erate_flag) + error->all(FLERR,"Keyword erate must be set for fix npt/npt/uef command"); + + if (mtchain_default_flag) mtchain=1; + + if (!domain->triclinic) + error->all(FLERR,"Simulation box must be triclinic for fix/nvt/npt/uef"); + + // check for conditions that impose a deviatoric stress + + if (pstyle == TRICLINIC) + error->all(FLERR,"Only normal stresses can be controlled with fix/nvt/npt/uef"); + double erate_tmp[3]; + erate_tmp[0]=erate[0]; + erate_tmp[1]=erate[1]; + erate_tmp[2]=-erate[0]-erate[1]; + + if (pstyle == ANISO) { + if (!(ext_flags[0] & ext_flags[1] & ext_flags[2])) + error->all(FLERR,"The ext keyword may only be used with iso pressure control"); + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + if (p_flag[k] && p_flag[j]) { + double tol = 1e-6; + if ( !nearly_equal(p_start[k],p_start[j],tol) + || !nearly_equal(p_stop[k],p_stop[j],tol)) + error->all(FLERR,"All controlled stresses must have the same " + "value in fix/nvt/npt/uef"); + if ( !nearly_equal(erate_tmp[k],erate_tmp[j],tol) + || !nearly_equal(erate_tmp[k],erate_tmp[j],tol)) + error->all(FLERR,"Dimensions with controlled stresses must have"\ + " same strain rate in fix/nvt/npt/uef"); + } + } + + // conditions that produce a deviatoric stress have already been eliminated. + + deviatoric_flag=0; + + // need pre_exchange and irregular migration + + pre_exchange_flag = 1; + irregular = new Irregular(lmp); + + // flag that I change the box here (in case of nvt) + + box_change_shape = 1; + + // initialize the UEFBox class which computes the box at each step + + uefbox = new UEF_utils::UEFBox(); + uefbox->set_strain(strain[0],strain[1]); + + // reset fixedpoint to the stagnation point. I don't allow fixedpoint + // to be set by the user. + + fixedpoint[0] = domain->boxlo[0]; + fixedpoint[1] = domain->boxlo[1]; + fixedpoint[2] = domain->boxlo[2]; + + // Create temp and pressure computes for nh/uef + + int n = strlen(id) + 6; + id_temp = new char[n]; + strcpy(id_temp,id); + strcat(id_temp,"_temp"); + char **newarg = new char*[3]; + newarg[0] = id_temp; + newarg[1] = (char *) "all"; + newarg[2] = (char *) "temp/uef"; + modify->add_compute(3,newarg); + delete [] newarg; + tcomputeflag = 1; + + n = strlen(id) + 7; + id_press = new char[n]; + strcpy(id_press,id); + strcat(id_press,"_press"); + newarg = new char*[4]; + newarg[0] = id_press; + newarg[1] = (char *) "all"; + newarg[2] = (char *) "pressure/uef"; + newarg[3] = id_temp; + modify->add_compute(4,newarg); + delete [] newarg; + pcomputeflag = 1; + + nevery = 1; +} + +/* ---------------------------------------------------------------------- + * Erase the UEFBox object and get rid of the pressure compute if the nvt + * version is being used. Everything else will be done in base destructor + * ---------------------------------------------------------------------- */ +FixNHUef::~FixNHUef() +{ + delete uefbox; + if (pcomputeflag && !pstat_flag) + { + modify->delete_compute(id_press); + delete [] id_press; + } +} + +/* ---------------------------------------------------------------------- + * Make the end_of_step() routine callable + * ---------------------------------------------------------------------- */ +int FixNHUef::setmask() +{ + int mask = FixNH::setmask(); + mask |= END_OF_STEP; + return mask; +} + +/* ---------------------------------------------------------------------- + * Run FixNH::init() and do more error checking. Set the pressure + * pointer in the case that the nvt version is used + * ---------------------------------------------------------------------- */ +void FixNHUef::init() +{ + FixNH::init(); + + + // find conflict with fix/deform or other box chaging fixes + for (int i=0; i < modify->nfix; i++) + { + if (strcmp(modify->fix[i]->id,id) != 0) + if (modify->fix[i]->box_change_shape != 0) + error->all(FLERR,"Can't use another fix which changes box shape with fix/nvt/npt/uef"); + } + + + // this will make the pressure compute for nvt + if (!pstat_flag) + if (pcomputeflag) { + int icomp = modify->find_compute(id_press); + if (icomp<0) + error->all(FLERR,"Pressure ID for fix/nvt/uef doesn't exist"); + pressure = modify->compute[icomp]; + + if (strcmp(pressure->style,"pressure/uef") != 0) + error->all(FLERR,"Using fix nvt/npt/uef without a compute pressure/uef"); + } + + if (strcmp(temperature->style,"temp/uef") != 0) + error->all(FLERR,"Using fix nvt/npt/uef without a compute temp/uef"); +} + +/* ---------------------------------------------------------------------- + * Run FixNH::setup() make sure the box is OK and set the rotation matrix + * for the first step + * ---------------------------------------------------------------------- */ +void FixNHUef::setup(int j) +{ + double box[3][3]; + double vol = domain->xprd * domain->yprd * domain->zprd; + uefbox->get_box(box,vol); + double tol = 1e-4; + // ensure the box is ok for uef + bool isok = true; + isok &= nearly_equal(domain->h[0],box[0][0],tol); + isok &= nearly_equal(domain->h[1],box[1][1],tol); + isok &= nearly_equal(domain->h[2],box[2][2],tol); + isok &= nearly_equal(domain->xy,box[0][1],tol); + isok &= nearly_equal(domain->yz,box[1][2],tol); + isok &= nearly_equal(domain->xz,box[0][2],tol); + if (!isok) + error->all(FLERR,"Initial box is not close enough to the expected uef box"); + + uefbox->get_rot(rot); + ((ComputeTempUef*) temperature)->yes_rot(); + ((ComputePressureUef*) pressure)->in_fix = true; + ((ComputePressureUef*) pressure)->update_rot(); + FixNH::setup(j); +} + +/* ---------------------------------------------------------------------- + * rotate -> initial integration step -> rotate back + * ---------------------------------------------------------------------- */ +void FixNHUef::initial_integrate(int vflag) +{ + inv_rotate_x(rot); + inv_rotate_v(rot); + inv_rotate_f(rot); + ((ComputeTempUef*) temperature)->no_rot(); + FixNH::initial_integrate(vflag); + rotate_x(rot); + rotate_v(rot); + rotate_f(rot); + ((ComputeTempUef*) temperature)->yes_rot(); +} + +/* ---------------------------------------------------------------------- + * rotate -> initial integration step -> rotate back (RESPA) + * ---------------------------------------------------------------------- */ +void FixNHUef::initial_integrate_respa(int vflag, int ilevel, int iloop) +{ + inv_rotate_x(rot); + inv_rotate_v(rot); + inv_rotate_f(rot); + ((ComputeTempUef*) temperature)->no_rot(); + FixNH::initial_integrate_respa(vflag,ilevel,iloop); + rotate_x(rot); + rotate_v(rot); + rotate_f(rot); + ((ComputeTempUef*) temperature)->yes_rot(); +} + +/* ---------------------------------------------------------------------- + * rotate -> final integration step -> rotate back + * ---------------------------------------------------------------------- */ +void FixNHUef::final_integrate() +{ + // update rot here since it must directly follow the virial calculation + ((ComputePressureUef*) pressure)->update_rot(); + inv_rotate_v(rot); + inv_rotate_f(rot); + ((ComputeTempUef*) temperature)->no_rot(); + FixNH::final_integrate(); + rotate_v(rot); + rotate_f(rot); + ((ComputeTempUef*) temperature)->yes_rot(); +} + +/* ---------------------------------------------------------------------- + * at outer level: call this->final_integrate() + * at other levels: rotate -> 2nd verlet step -> rotate back + * ---------------------------------------------------------------------- */ +void FixNHUef::final_integrate_respa(int ilevel, int iloop) +{ + // set timesteps by level + dtf = 0.5 * step_respa[ilevel] * force->ftm2v; + dthalf = 0.5 * step_respa[ilevel]; + // outermost level - update eta_dot and omega_dot, apply via final_integrate + // all other levels - NVE update of v + if (ilevel == nlevels_respa-1) final_integrate(); + else + { + inv_rotate_v(rot); + inv_rotate_f(rot); + nve_v(); + rotate_v(rot); + rotate_f(rot); + } +} + +/* ---------------------------------------------------------------------- + SLLOD velocity update in time-reversible (i think) increments + v -> exp(-edot*dt/2)*v + v -> v +f/m*dt + v -> exp(-edot*dt/2)*v +-----------------------------------------------------------------------*/ +void FixNHUef::nve_v() +{ + double dtfm; + double **v = atom->v; + double **f = atom->f; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + double ex = erate[0]*dtf/2; + double ey = erate[1]*dtf/2; + double ez = -ex-ey; + double e0 = exp(-ex); + double e1 = exp(-ey); + double e2 = exp(-ez); + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + if (rmass) { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + v[i][0] *= e0; + v[i][1] *= e1; + v[i][2] *= e2; + v[i][0] += dtfm*f[i][0]; + v[i][1] += dtfm*f[i][1]; + v[i][2] += dtfm*f[i][2]; + v[i][0] *= e0; + v[i][1] *= e1; + v[i][2] *= e2; + } + } + } else { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + v[i][0] *= e0; + v[i][1] *= e1; + v[i][2] *= e2; + v[i][0] += dtfm*f[i][0]; + v[i][1] += dtfm*f[i][1]; + v[i][2] += dtfm*f[i][2]; + v[i][0] *= e0; + v[i][1] *= e1; + v[i][2] *= e2; + } + } + } +} + +/* ---------------------------------------------------------------------- + Don't actually move atoms in remap(), just change the box +-----------------------------------------------------------------------*/ +void FixNHUef::remap() +{ + double vol = domain->xprd * domain->yprd * domain->zprd; + double domega = dto*(omega_dot[0]+omega_dot[1]+omega_dot[2])/3.; + + // constant volume strain associated with barostat + // box scaling + double ex = dto*omega_dot[0]-domega; + double ey = dto*omega_dot[1]-domega; + uefbox->step_deform(ex,ey); + strain[0] += ex; + strain[1] += ey; + + // volume change + vol = vol*exp(3*domega); + double box[3][3]; + uefbox->get_box(box,vol); + domain->boxhi[0] = domain->boxlo[0]+box[0][0]; + domain->boxhi[1] = domain->boxlo[1]+box[1][1]; + domain->boxhi[2] = domain->boxlo[2]+box[2][2]; + domain->xy = box[0][1]; + domain->xz = box[0][2]; + domain->yz = box[1][2]; + domain->set_global_box(); + domain->set_local_box(); + uefbox->get_rot(rot); +} + +/* ---------------------------------------------------------------------- + SLLOD position update in time-reversible (i think) increments + x -> exp(edot*dt/2)*x + x -> x + v*dt + x -> exp(edot*dt/2)*x +-----------------------------------------------------------------------*/ +void FixNHUef::nve_x() +{ + double **x = atom->x; + double **v = atom->v; + int *mask = atom->mask; + int nlocal = atom->nlocal; + double ex = erate[0]*dtv; + strain[0] += ex; + double e0 = exp((ex+omega_dot[0]*dtv)/2); + double ey = erate[1]*dtv; + strain[1] += ey; + double e1 = exp((ey+omega_dot[1]*dtv)/2.); + double ez = -ex -ey; + double e2 = exp((ez+omega_dot[2]*dtv)/2.); + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + // x update by full step only for atoms in group + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + x[i][0] *= e0; + x[i][1] *= e1; + x[i][2] *= e2; + x[i][0] += dtv * v[i][0]; + x[i][1] += dtv * v[i][1]; + x[i][2] += dtv * v[i][2]; + x[i][0] *= e0; + x[i][1] *= e1; + x[i][2] *= e2; + } + } + uefbox->step_deform(ex,ey); + double box[3][3]; + double vol = domain->xprd * domain->yprd * domain->zprd; + uefbox->get_box(box,vol); + domain->boxhi[0] = domain->boxlo[0]+box[0][0]; + domain->boxhi[1] = domain->boxlo[1]+box[1][1]; + domain->boxhi[2] = domain->boxlo[2]+box[2][2]; + domain->xy = box[0][1]; + domain->xz = box[0][2]; + domain->yz = box[1][2]; + domain->set_global_box(); + domain->set_local_box(); + uefbox->get_rot(rot); +} + +/* ---------------------------------------------------------------------- + * Do the lattice reduction if necessary. +-----------------------------------------------------------------------*/ +void FixNHUef::pre_exchange() +{ + // only need to reset things if the lattice needs to be reduced + if (uefbox->reduce()) + { + // go to lab frame + inv_rotate_x(rot); + inv_rotate_v(rot); + inv_rotate_f(rot); + // get & set the new box and rotation matrix + double vol = domain->xprd * domain->yprd * domain->zprd; + double box[3][3]; + uefbox->get_box(box,vol); + domain->boxhi[0] = domain->boxlo[0]+box[0][0]; + domain->boxhi[1] = domain->boxlo[1]+box[1][1]; + domain->boxhi[2] = domain->boxlo[2]+box[2][2]; + domain->xy = box[0][1]; + domain->xz = box[0][2]; + domain->yz = box[1][2]; + domain->set_global_box(); + domain->set_local_box(); + uefbox->get_rot(rot); + + // rotate to the new upper triangular frame + rotate_v(rot); + rotate_x(rot); + rotate_f(rot); + + // put all atoms in the new box + double **x = atom->x; + imageint *image = atom->image; + int nlocal = atom->nlocal; + for (int i=0; iremap(x[i],image[i]); + + // move atoms to the right processors + domain->x2lamda(atom->nlocal); + irregular->migrate_atoms(); + domain->lamda2x(atom->nlocal); + } +} + +/* ---------------------------------------------------------------------- + * The following are routines to rotate between the lab and upper triangular + * (UT) frames. For most of the time the simulation is in the UT frame. + * To get to the lab frame, apply the inv_rotate_[..](rot) and to + * get back to the UT frame apply rotate_[..](rot). + * + * Note: the rotate_x() functions also apply a shift to/from the fixedpoint + * to make the integration a little simpler. + * ---------------------------------------------------------------------- */ +void FixNHUef::rotate_x(double r[3][3]) +{ + double **x = atom->x; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double xn[3]; + for (int i=0;iboxlo[0]; + x[i][1]=xn[1]+domain->boxlo[1]; + x[i][2]=xn[2]+domain->boxlo[2]; + } + } +} + +void FixNHUef::inv_rotate_x(double r[3][3]) +{ + double **x = atom->x; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double xn[3]; + for (int i=0;iboxlo[0]; + x[i][1] -= domain->boxlo[1]; + x[i][2] -= domain->boxlo[2]; + xn[0]=r[0][0]*x[i][0]+r[1][0]*x[i][1]+r[2][0]*x[i][2]; + xn[1]=r[0][1]*x[i][0]+r[1][1]*x[i][1]+r[2][1]*x[i][2]; + xn[2]=r[0][2]*x[i][0]+r[1][2]*x[i][1]+r[2][2]*x[i][2]; + x[i][0]=xn[0]; + x[i][1]=xn[1]; + x[i][2]=xn[2]; + } + } +} + +void FixNHUef::rotate_v(double r[3][3]) +{ + double **v = atom->v; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double vn[3]; + for (int i=0;iv; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double vn[3]; + for (int i=0;if; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double fn[3]; + for (int i=0;if; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + double fn[3]; + for (int i=0;iset_strain(strain[0],strain[1]); +} + +/* ---------------------------------------------------------------------- + * If the step writes a restart, reduce the box beforehand. This makes sure + * the unique box shape can be found once the restart is read and that + * all of the atoms lie within the box. + * This may only be necessary for RESPA runs, but I'm leaving it in anyway. + * ---------------------------------------------------------------------- */ +void FixNHUef::end_of_step() +{ + if (update->ntimestep==output->next_restart) + { + pre_exchange(); + domain->x2lamda(atom->nlocal); + domain->pbc(); + timer->stamp(); + comm->exchange(); + comm->borders(); + domain->lamda2x(atom->nlocal+atom->nghost); + timer->stamp(Timer::COMM); + neighbor->build(1); + timer->stamp(Timer::NEIGH); + } +} + +/* ---------------------------------------------------------------------- + * reduce the simulation box after a run is complete. otherwise it won't + * be possible to resume from a write_restart since the initialization of + * the simulation box requires reduced simulation box + * ---------------------------------------------------------------------- */ +void FixNHUef::post_run() +{ + pre_exchange(); + domain->x2lamda(atom->nlocal); + domain->pbc(); + timer->stamp(); + comm->exchange(); + comm->borders(); + domain->lamda2x(atom->nlocal+atom->nghost); + timer->stamp(Timer::COMM); + neighbor->build(1); + timer->stamp(Timer::NEIGH); +} + +/* ---------------------------------------------------------------------- + * public read for rotation matrix + * ---------------------------------------------------------------------- */ +void FixNHUef::get_rot(double r[3][3]) +{ + r[0][0] = rot[0][0]; + r[0][1] = rot[0][1]; + r[0][2] = rot[0][2]; + r[1][0] = rot[1][0]; + r[1][1] = rot[1][1]; + r[1][2] = rot[1][2]; + r[2][0] = rot[2][0]; + r[2][1] = rot[2][1]; + r[2][2] = rot[2][2]; +} + +/* ---------------------------------------------------------------------- + * public read for ext flags + * ---------------------------------------------------------------------- */ +void FixNHUef::get_ext_flags(bool* e) +{ + e[0] = ext_flags[0]; + e[1] = ext_flags[1]; + e[2] = ext_flags[2]; +} + +/* ---------------------------------------------------------------------- + * public read for simulation box + * ---------------------------------------------------------------------- */ +void FixNHUef::get_box(double b[3][3]) +{ + double box[3][3]; + double vol = domain->xprd * domain->yprd * domain->zprd; + uefbox->get_box(box,vol); + b[0][0] = box[0][0]; + b[0][1] = box[0][1]; + b[0][2] = box[0][2]; + b[1][0] = box[1][0]; + b[1][1] = box[1][1]; + b[1][2] = box[1][2]; + b[2][0] = box[2][0]; + b[2][1] = box[2][1]; + b[2][2] = box[2][2]; +} + +/* ---------------------------------------------------------------------- + * comparing floats + * it's imperfect, but should work provided no infinities + * ---------------------------------------------------------------------- */ +bool FixNHUef::nearly_equal(double a, double b, double epsilon) +{ + double absa = fabs(a); + double absb = fabs(b); + double diff = fabs(a-b); + if (a == b) return true; + else if ( (absa+absb) < epsilon) + return diff < epsilon*epsilon; + else + return diff/(absa+absb) < epsilon; +} diff --git a/src/USER-UEF/fix_nh_uef.h b/src/USER-UEF/fix_nh_uef.h new file mode 100644 index 0000000000..43f5bb46a9 --- /dev/null +++ b/src/USER-UEF/fix_nh_uef.h @@ -0,0 +1,128 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing Author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + + +#ifndef LMP_FIX_NH_UEF_H +#define LMP_FIX_NH_UEF_H + +#include "fix_nh.h" + +namespace LAMMPS_NS { + // forward declaration + namespace UEF_utils { + class UEFBox; + }; + +class FixNHUef : public FixNH { + public: + FixNHUef(class LAMMPS *, int, char **); + virtual ~FixNHUef(); + virtual int setmask(); + virtual void init(); + virtual void setup(int); + virtual void pre_exchange(); + virtual int pack_restart_data(double*); + virtual void restart(char *); + virtual void end_of_step(); + virtual void initial_integrate(int); + virtual void final_integrate(); + virtual void initial_integrate_respa(int, int, int); + virtual void final_integrate_respa(int, int); + virtual void post_run(); + void get_rot(double[3][3]); + void get_ext_flags(bool*); + void get_box(double[3][3]); + + protected: + virtual void remap(); + virtual int size_restart_global(); + virtual void nve_x(); + virtual void nve_v(); + void rotate_x(double [3][3]); + void inv_rotate_x(double[3][3]); + void rotate_v(double[3][3]); + void inv_rotate_v(double[3][3]); + void rotate_f(double[3][3]); + void inv_rotate_f(double[3][3]); + double strain[2],erate[2]; // strain/strain rate : [e_x, e_y] + // always assume traceless e_z = -e_x-e_y + + int rem; //this is for the narg kluge + + UEF_utils::UEFBox *uefbox; // interface for the special simulation box + + double rot[3][3]; // rotation matrix + bool ext_flags[3]; // flags for external "free surfaces" + bool nearly_equal(double,double,double); + //bool rotate_output; // experimental feature. Too many issues for now +}; + +} + +#endif + +/* ERROR/WARNING messages: + +This is a base class for FixNH so it will inherit most of its error/warning messages along with the following: + +E: Illegal fix nvt/npt/uef command + +Self-explanatory + +E: Keyword erate must be set for fix nvt/npt/uef command + +Self-explanatory. + +E: Simulation box must be triclinic for fix/nvt/npt/uef + +Self-explanatory. + +E: Only normal stresses can be controlled with fix/nvt/npt/uef + +The keywords xy xz and yz cannot be used for pressure control + +E: The ext keyword may only be used with iso pressure control + +Self-explanatory + +E: All controlled stresses must have the same value in fix/nvt/npt/uef + +Stress control is only possible when the stress specified for each dimension is the same + +E: Dimensions with controlled stresses must have same strain rate in fix/nvt/npt/uef + +Stress-controlled dimensions with the same strain rate must have the same target stress. + +E: Can't use another fix which changes box shape with fix/nvt/npt/uef + +The fix npt/nvt/uef command must have full control over the box shape. You cannot use a simultaneous fix deform command, for example. + +E: Pressure ID for fix/nvt/uef doesn't exist + +The compute pressure introduced via fix_modify does not exist + +E: Using fix nvt/npt/uef without a compute pressure/uef + +Self-explanatory. + +E: Using fix nvt/npt/uef without a compute temp/uef + +Self-explanatory. + +E: Initial box is not close enough to the expected uef box + +The initial box does not correspond to the shape required by the value of the strain keyword. If the default strain value of zero was used, the initial box is not cubic. + +*/ diff --git a/src/USER-UEF/fix_npt_uef.cpp b/src/USER-UEF/fix_npt_uef.cpp new file mode 100644 index 0000000000..b8ab1eccf9 --- /dev/null +++ b/src/USER-UEF/fix_npt_uef.cpp @@ -0,0 +1,28 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#include "fix_npt_uef.h" +#include "error.h" + +using namespace LAMMPS_NS; + +FixNPTUef::FixNPTUef(LAMMPS *lmp, int narg, char **arg) : + FixNHUef(lmp, narg, arg) +{ + if (!tstat_flag) + error->all(FLERR,"Temperature control must be used with fix npt/uef"); + if (!pstat_flag) + error->all(FLERR,"Pressure control must be used with fix npt/uef"); +} diff --git a/src/USER-DPD/npair_halffull_newton_ssa.h b/src/USER-UEF/fix_npt_uef.h similarity index 62% rename from src/USER-DPD/npair_halffull_newton_ssa.h rename to src/USER-UEF/fix_npt_uef.h index 03903815b1..4c0cd28ae0 100644 --- a/src/USER-DPD/npair_halffull_newton_ssa.h +++ b/src/USER-UEF/fix_npt_uef.h @@ -9,29 +9,27 @@ the GNU General Public License. See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) ------------------------------------------------------------------------- */ -#ifdef NPAIR_CLASS +#ifdef FIX_CLASS -NPairStyle(halffull/newton/ssa, - NPairHalffullNewtonSSA, - NP_HALF_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | - NP_ORTHO | NP_TRI | NP_SSA) +FixStyle(npt/uef,FixNPTUef) #else -#ifndef LMP_NPAIR_HALFFULL_NEWTON_SSA_H -#define LMP_NPAIR_HALFFULL_NEWTON_SSA_H +#ifndef LMP_FIX_NPT_UEF_H +#define LMP_FIX_NPT_UEF_H -#include "npair.h" +#include "fix_nh_uef.h" namespace LAMMPS_NS { -class NPairHalffullNewtonSSA : public NPair { +class FixNPTUef : public FixNHUef { public: - NPairHalffullNewtonSSA(class LAMMPS *); - ~NPairHalffullNewtonSSA() {} - void build(class NeighList *); + FixNPTUef(class LAMMPS *, int, char **); + ~FixNPTUef() {} }; } @@ -41,4 +39,12 @@ class NPairHalffullNewtonSSA : public NPair { /* ERROR/WARNING messages: +E: Temperature control must be used with fix npt uef + +Self-explanatory. + +E: Pressure control must be used with fix npt uef + +Self-explanatory. + */ diff --git a/src/USER-UEF/fix_nvt_uef.cpp b/src/USER-UEF/fix_nvt_uef.cpp new file mode 100644 index 0000000000..2fd4a28545 --- /dev/null +++ b/src/USER-UEF/fix_nvt_uef.cpp @@ -0,0 +1,30 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#include "fix_nvt_uef.h" +#include "error.h" + +using namespace LAMMPS_NS; + +FixNVTUef::FixNVTUef(LAMMPS *lmp, int narg, char **arg) : + FixNHUef(lmp, narg, arg) +{ + if (!tstat_flag) + error->all(FLERR,"Temperature control must be used with fix nvt/uef"); + if (pstat_flag) + error->all(FLERR,"Pressure control can't be used with fix nvt/uef"); +} + + diff --git a/src/USER-UEF/fix_nvt_uef.h b/src/USER-UEF/fix_nvt_uef.h new file mode 100644 index 0000000000..718e36e756 --- /dev/null +++ b/src/USER-UEF/fix_nvt_uef.h @@ -0,0 +1,50 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(nvt/uef,FixNVTUef) + +#else + +#ifndef LMP_FIX_NVT_UEF_H +#define LMP_FIX_NVT_UEF_H + +#include "fix_nh_uef.h" + +namespace LAMMPS_NS { + +class FixNVTUef : public FixNHUef { + public: + FixNVTUef(class LAMMPS *, int, char **); + ~FixNVTUef(){} +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Temperature control must be used with fix npt uef + +Self-explanatory. + +E: Pressure control must be used with fix npt uef + +Self-explanatory. + +*/ diff --git a/src/USER-UEF/uef_utils.cpp b/src/USER-UEF/uef_utils.cpp new file mode 100644 index 0000000000..f270fe1d8b --- /dev/null +++ b/src/USER-UEF/uef_utils.cpp @@ -0,0 +1,366 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Contributing author: David Nicholson (MIT) +------------------------------------------------------------------------- + + This class contains functions to calculate the evolution of the periodic + simulation box under elongational flow as described by Matthew Dobson + in the arXiv preprint at http://arxiv.org/abs/1408.7078 + + Additionally, there are methods to do a lattice reduction to further + reduce the simulation box using the method of Igor Semaev at + http://link.springer.com/chapter/10.1007%2F3-540-44670-2_13 +*/ + +#include +#include "uef_utils.h" + +namespace LAMMPS_NS { + namespace UEF_utils{ + +UEFBox::UEFBox() +{ + // initial box (also an inverse eigenvector matrix of automorphisms) + double x = 0.327985277605681; + double y = 0.591009048506103; + double z = 0.736976229099578; + l0[0][0]= z; l0[0][1]= y; l0[0][2]= x; + l0[1][0]=-x; l0[1][1]= z; l0[1][2]=-y; + l0[2][0]=-y; l0[2][1]= x; l0[2][2]= z; + // spectra of the two automorpisms (log of eigenvalues) + w1[0]=-1.177725211523360; + w1[1]=-0.441448620566067; + w1[2]= 1.619173832089425; + w2[0]= w1[1]; + w2[1]= w1[2]; + w2[2]= w1[0]; + // initialize theta + // strain = w1 * theta1 + w2 * theta2 + theta[0]=theta[1]=0; + + + //set up the initial box l and change of basis matrix r + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + { + l[k][j] = l0[k][j]; + r[j][k]=(j==k); + } + + // get the initial rotation and upper triangular matrix + rotation_matrix(rot, lrot ,l); + + // this is just a way to calculate the automorphisms + // themselves, which play a minor role in the calculations + // it's overkill, but only called once + double t1[3][3]; + double t1i[3][3]; + double t2[3][3]; + double t2i[3][3]; + double l0t[3][3]; + for (int k=0; k<3; ++k) + for (int j=0; j<3; ++j) + { + t1[k][j] = exp(w1[k])*l0[k][j]; + t1i[k][j] = exp(-w1[k])*l0[k][j]; + t2[k][j] = exp(w2[k])*l0[k][j]; + t2i[k][j] = exp(-w2[k])*l0[k][j]; + l0t[k][j] = l0[j][k]; + } + mul_m2(l0t,t1); + mul_m2(l0t,t1i); + mul_m2(l0t,t2); + mul_m2(l0t,t2i); + for (int k=0; k<3; ++k) + for (int j=0; j<3; ++j) + { + a1[k][j] = round(t1[k][j]); + a1i[k][j] = round(t1i[k][j]); + a2[k][j] = round(t2[k][j]); + a2i[k][j] = round(t2i[k][j]); + } + + // winv used to transform between + // strain increments and theta increments + winv[0][0] = w2[1]; + winv[0][1] = -w2[0]; + winv[1][0] = -w1[1]; + winv[1][1] = w1[0]; + double d = w1[0]*w2[1] - w2[0]*w1[1]; + for (int k=0;k<2;k++) + for (int j=0;j<2;j++) + winv[k][j] /= d; +} + +// get volume-correct r basis in: basis*cbrt(vol) = q*r +void UEFBox::get_box(double x[3][3], double v) +{ + v = cbrtf(v); + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + x[k][j] = lrot[k][j]*v; +} + +// get rotation matrix q in: basis = q*r +void UEFBox::get_rot(double x[3][3]) +{ + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + x[k][j]=rot[k][j]; +} + +// diagonal, incompressible deformation +void UEFBox::step_deform(const double ex, const double ey) +{ + // increment theta values used in the reduction + theta[0] +=winv[0][0]*ex + winv[0][1]*ey; + theta[1] +=winv[1][0]*ex + winv[1][1]*ey; + + // deformation of the box. reduce() needs to + // be called regularly or calculation will become + // unstable + double eps[3]; + eps[0]=ex; eps[1] = ey; eps[2] = -ex-ey; + for (int k=0;k<3;k++) + { + eps[k] = exp(eps[k]); + l[k][0] = eps[k]*l[k][0]; + l[k][1] = eps[k]*l[k][1]; + l[k][2] = eps[k]*l[k][2]; + } + rotation_matrix(rot,lrot, l); +} +// reuduce the current basis +bool UEFBox::reduce() +{ + // determine how many times to apply the automorphisms + // and find new theta values + int f1 = round(theta[0]); + int f2 = round(theta[1]); + theta[0] -= f1; + theta[1] -= f2; + + // store old change or basis matrix to determine if it + // changes + int r0[3][3]; + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + r0[k][j]=r[k][j]; + + // this modifies the old change basis matrix to + // handle the case where the automorphism transforms + // the box but the reduced basis doesn't change + // (r0 should still equal r at the end) + if (f1 > 0) for (int k=0;k 0) for (int k=0;k (-q)*m = (-r) will hold row-wise + if (r[0][0] < 0){ neg_row(q,0); neg_row(r,0); } + if (r[1][1] < 0){ neg_row(q,1); neg_row(r,1); } + if (r[2][2] < 0){ neg_row(q,2); neg_row(r,2); } +} + + + +//sort columns in order of increasing length +void col_sort(double b[3][3],int r[3][3]) +{ + if (col_prod(b,0,0)>col_prod(b,1,1)) + { + col_swap(b,0,1); + col_swap(r,0,1); + } + if (col_prod(b,0,0)>col_prod(b,2,2)) + { + col_swap(b,0,2); + col_swap(r,0,2); + } + if (col_prod(b,1,1)>col_prod(b,2,2)) + { + col_swap(b,1,2); + col_swap(r,1,2); + } +} + + +// 1-2 reduction (Graham-Schmidt) +void red12(double b[3][3],int r[3][3]) +{ + int y = round(col_prod(b,0,1)/col_prod(b,0,0)); + b[0][1] -= y*b[0][0]; + b[1][1] -= y*b[1][0]; + b[2][1] -= y*b[2][0]; + + r[0][1] -= y*r[0][0]; + r[1][1] -= y*r[1][0]; + r[2][1] -= y*r[2][0]; + if (col_prod(b,1,1) < col_prod(b,0,0)) + { + col_swap(b,0,1); + col_swap(r,0,1); + red12(b,r); + } +} + +// The Semaev condition for a 3-reduced basis +void red3(double b[3][3], int r[3][3]) +{ + double b11 = col_prod(b,0,0); + double b22 = col_prod(b,1,1); + double b12 = col_prod(b,0,1); + double b13 = col_prod(b,0,2); + double b23 = col_prod(b,1,2); + + double y2 =-(b23/b22-b12/b22*b13/b11)/(1-b12/b11*b12/b22); + double y1 =-(b13/b11-b12/b11*b23/b22)/(1-b12/b11*b12/b22); + + int x1=0; + int x2=0; + double min = col_prod(b,2,2); + int x1v[2]; + int x2v[2]; + x1v[0] = floor(y1); x1v[1] = x1v[0]+1; + x2v[0] = floor(y2); x2v[1] = x2v[0]+1; + for (int k=0;k<2;k++) + for (int j=0;j<2;j++) + { + double a[3]; + a[0] = b[0][2] + x1v[k]*b[0][0] + x2v[j]*b[0][1]; + a[1] = b[1][2] + x1v[k]*b[1][0] + x2v[j]*b[1][1]; + a[2] = b[2][2] + x1v[k]*b[2][0] + x2v[j]*b[2][1]; + double val=a[0]*a[0]+a[1]*a[1]+a[2]*a[2]; + if (val +T col_prod(T x[3][3], int c1, int c2) +{ + return x[0][c1]*x[0][c2]+x[1][c1]*x[1][c2]+x[2][c1]*x[2][c2]; +} + +template +void col_swap(T x[3][3], int c1, int c2) +{ + for (int k=0;k<3;k++) + { + T t = x[k][c2]; + x[k][c2]=x[k][c1]; + x[k][c1]=t; + } +} + +template +void neg_col(T x[3][3], int c1) +{ + x[0][c1] = -x[0][c1]; + x[1][c1] = -x[1][c1]; + x[2][c1] = -x[2][c1]; +} + +template +void neg_row(T x[3][3], int c1) +{ + x[c1][0] = -x[c1][0]; + x[c1][1] = -x[c1][1]; + x[c1][2] = -x[c1][2]; +} + +template +T det(T x[3][3]) +{ + double val; + val = x[0][0]*(x[1][1]*x[2][2] - x[1][2]*x[2][1]); + val -= x[0][1]*(x[1][0]*x[2][2] - x[1][2]*x[2][0]); + val += x[0][2]*(x[1][0]*x[2][1] - x[1][1]*x[2][0]); + return val; +} + +template +bool mat_same(T x1[3][3], T x2[3][3]) +{ + bool v = true; + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + v &= (x1[k][j]==x2[k][j]); + return v; +} + +template +void mul_m1(T m1[3][3], const T m2[3][3]) +{ + T t[3][3]; + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + t[k][j]=m1[k][j]; + + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + m1[k][j] = t[k][0]*m2[0][j] + t[k][1]*m2[1][j] + t[k][2]*m2[2][j]; +} + +template +void mul_m2(const T m1[3][3], T m2[3][3]) +{ + T t[3][3]; + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + t[k][j]=m2[k][j]; + + for (int k=0;k<3;k++) + for (int j=0;j<3;j++) + m2[k][j] = m1[k][0]*t[0][j] + m1[k][1]*t[1][j] + m1[k][2]*t[2][j]; +} + +} +} +#endif diff --git a/src/accelerator_kokkos.h b/src/accelerator_kokkos.h index d9794023b0..708592a25e 100644 --- a/src/accelerator_kokkos.h +++ b/src/accelerator_kokkos.h @@ -25,6 +25,7 @@ #include "comm_tiled_kokkos.h" #include "domain_kokkos.h" #include "neighbor_kokkos.h" +#include "memory_kokkos.h" #include "modify_kokkos.h" #else @@ -37,6 +38,7 @@ #include "comm_tiled.h" #include "domain.h" #include "neighbor.h" +#include "memory.h" #include "modify.h" namespace LAMMPS_NS { @@ -89,6 +91,13 @@ class NeighborKokkos : public Neighbor { ~NeighborKokkos() {} }; +class MemoryKokkos : public Memory { + public: + MemoryKokkos(class LAMMPS *lmp) : Memory(lmp) {} + ~MemoryKokkos() {} + void grow_kokkos(tagint **, tagint **, int, int, const char*) {} +}; + class ModifyKokkos : public Modify { public: ModifyKokkos(class LAMMPS *lmp) : Modify(lmp) {} @@ -99,7 +108,7 @@ class DAT { public: typedef double tdual_xfloat_1d; typedef double tdual_FFT_SCALAR_1d; - typedef int t_int_1d; + typedef int tdual_int_1d; typedef int tdual_int_2d; }; diff --git a/src/atom.cpp b/src/atom.cpp index e46b1a7242..fa86046d23 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -103,7 +103,11 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) uCond = uMech = uChem = uCG = uCGnew = NULL; duChem = NULL; dpdTheta = NULL; - ssaAIR = NULL; + + // USER-MESO + + cc = cc_flux = NULL; + edpd_temp = edpd_flux = edpd_cv = NULL; // USER-SMD @@ -169,7 +173,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) cs_flag = csforce_flag = vforce_flag = etag_flag = 0; rho_flag = e_flag = cv_flag = vest_flag = 0; - dpd_flag = 0; + dpd_flag = edpd_flag = tdpd_flag = 0; // USER-SMD @@ -300,7 +304,12 @@ Atom::~Atom() memory->destroy(uCG); memory->destroy(uCGnew); memory->destroy(duChem); - memory->destroy(ssaAIR); + + memory->destroy(cc); + memory->destroy(cc_flux); + memory->destroy(edpd_temp); + memory->destroy(edpd_flux); + memory->destroy(edpd_cv); memory->destroy(nspecial); memory->destroy(special); @@ -335,9 +344,11 @@ Atom::~Atom() delete [] iname[i]; memory->destroy(ivector[i]); } - for (int i = 0; i < ndvector; i++) { - delete [] dname[i]; - memory->destroy(dvector[i]); + if (dvector != NULL) { + for (int i = 0; i < ndvector; i++) { + delete [] dname[i]; + memory->destroy(dvector[i]); + } } memory->sfree(iname); @@ -442,12 +453,12 @@ void Atom::create_avec(const char *style, int narg, char **arg, int trysuffix) // if molecular system: // atom IDs must be defined // force atom map to be created - // map style may be reset by map_init() and its call to map_style_set() + // map style will be reset to array vs hash to by map_init() molecular = avec->molecular; if (molecular && tag_enable == 0) error->all(FLERR,"Atom IDs must be used for molecular systems"); - if (molecular) map_style = 1; + if (molecular) map_style = 3; } /* ---------------------------------------------------------------------- @@ -582,6 +593,7 @@ void Atom::modify_params(int narg, char **arg) "Atom_modify map command after simulation box is defined"); if (strcmp(arg[iarg+1],"array") == 0) map_user = 1; else if (strcmp(arg[iarg+1],"hash") == 0) map_user = 2; + else if (strcmp(arg[iarg+1],"yes") == 0) map_user = 3; else error->all(FLERR,"Illegal atom_modify command"); map_style = map_user; iarg += 2; @@ -810,8 +822,8 @@ void Atom::deallocate_topology() call style-specific routine to parse line ------------------------------------------------------------------------- */ -void Atom::data_atoms(int n, char *buf, tagint id_offset, int type_offset, - int shiftflag, double *shift) +void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset, + int type_offset, int shiftflag, double *shift) { int m,xptr,iptr; imageint imagedata; @@ -936,6 +948,7 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, int type_offset, coord[2] >= sublo[2] && coord[2] < subhi[2]) { avec->data_atom(xdata,imagedata,values); if (id_offset) tag[nlocal-1] += id_offset; + if (mol_offset) molecule[nlocal-1] += mol_offset; if (type_offset) { type[nlocal-1] += type_offset; if (type[nlocal-1] > ntypes) @@ -1019,8 +1032,8 @@ void Atom::data_bonds(int n, char *buf, int *count, tagint id_offset, } itype += type_offset; - if (atom1 <= 0 || atom1 > map_tag_max || - atom2 <= 0 || atom2 > map_tag_max) + if ((atom1 <= 0) || (atom1 > map_tag_max) || + (atom2 <= 0) || (atom2 > map_tag_max) || (atom1 == atom2)) error->one(FLERR,"Invalid atom ID in Bonds section of data file"); if (itype <= 0 || itype > nbondtypes) error->one(FLERR,"Invalid bond type in Bonds section of data file"); @@ -1073,9 +1086,10 @@ void Atom::data_angles(int n, char *buf, int *count, tagint id_offset, } itype += type_offset; - if (atom1 <= 0 || atom1 > map_tag_max || - atom2 <= 0 || atom2 > map_tag_max || - atom3 <= 0 || atom3 > map_tag_max) + if ((atom1 <= 0) || (atom1 > map_tag_max) || + (atom2 <= 0) || (atom2 > map_tag_max) || + (atom3 <= 0) || (atom3 > map_tag_max) || + (atom1 == atom2) || (atom1 == atom3) || (atom2 == atom3)) error->one(FLERR,"Invalid atom ID in Angles section of data file"); if (itype <= 0 || itype > nangletypes) error->one(FLERR,"Invalid angle type in Angles section of data file"); @@ -1144,10 +1158,12 @@ void Atom::data_dihedrals(int n, char *buf, int *count, tagint id_offset, } itype += type_offset; - if (atom1 <= 0 || atom1 > map_tag_max || - atom2 <= 0 || atom2 > map_tag_max || - atom3 <= 0 || atom3 > map_tag_max || - atom4 <= 0 || atom4 > map_tag_max) + if ((atom1 <= 0) || (atom1 > map_tag_max) || + (atom2 <= 0) || (atom2 > map_tag_max) || + (atom3 <= 0) || (atom3 > map_tag_max) || + (atom4 <= 0) || (atom4 > map_tag_max) || + (atom1 == atom2) || (atom1 == atom3) || (atom1 == atom4) || + (atom2 == atom3) || (atom2 == atom4) || (atom3 == atom4)) error->one(FLERR,"Invalid atom ID in Dihedrals section of data file"); if (itype <= 0 || itype > ndihedraltypes) error->one(FLERR, @@ -1231,10 +1247,12 @@ void Atom::data_impropers(int n, char *buf, int *count, tagint id_offset, } itype += type_offset; - if (atom1 <= 0 || atom1 > map_tag_max || - atom2 <= 0 || atom2 > map_tag_max || - atom3 <= 0 || atom3 > map_tag_max || - atom4 <= 0 || atom4 > map_tag_max) + if ((atom1 <= 0) || (atom1 > map_tag_max) || + (atom2 <= 0) || (atom2 > map_tag_max) || + (atom3 <= 0) || (atom3 > map_tag_max) || + (atom4 <= 0) || (atom4 > map_tag_max) || + (atom1 == atom2) || (atom1 == atom3) || (atom1 == atom4) || + (atom2 == atom3) || (atom2 == atom4) || (atom3 == atom4)) error->one(FLERR,"Invalid atom ID in Impropers section of data file"); if (itype <= 0 || itype > nimpropertypes) error->one(FLERR, @@ -2194,6 +2212,7 @@ void *Atom::extract(char *name) if (strcmp(name, "damage") == 0) return (void *) damage; if (strcmp(name,"dpdTheta") == 0) return (void *) dpdTheta; + if (strcmp(name,"edpd_temp") == 0) return (void *) edpd_temp; return NULL; } diff --git a/src/atom.h b/src/atom.h index 0f84c8242f..62c2d64ca7 100644 --- a/src/atom.h +++ b/src/atom.h @@ -93,7 +93,13 @@ class Atom : protected Pointers { double *duChem; double *dpdTheta; int nspecies_dpd; - int *ssaAIR; // Shardlow Splitting Algorithm Active Interaction Region number + + // USER-MESO package + + double **cc, **cc_flux; // cc = chemical concentration + double *edpd_temp,*edpd_flux; // temperature and heat flux + double *edpd_cv; // heat capacity + int cc_species; // molecular info @@ -138,7 +144,7 @@ class Atom : protected Pointers { int vfrac_flag,spin_flag,eradius_flag,ervel_flag,erforce_flag; int cs_flag,csforce_flag,vforce_flag,ervelforce_flag,etag_flag; int rho_flag,e_flag,cv_flag,vest_flag; - int dpd_flag; + int dpd_flag,edpd_flag,tdpd_flag; // USER-SMD package @@ -223,7 +229,7 @@ class Atom : protected Pointers { void deallocate_topology(); - void data_atoms(int, char *, tagint, int, int, double *); + void data_atoms(int, char *, tagint, tagint, int, int, double *); void data_vels(int, char *, tagint); void data_bonds(int, char *, int *, tagint, int); void data_angles(int, char *, int *, tagint, int); @@ -255,8 +261,8 @@ class Atom : protected Pointers { void update_callback(int); int find_custom(const char *, int &); - int add_custom(const char *, int); - void remove_custom(int, int); + virtual int add_custom(const char *, int); + virtual void remove_custom(int, int); virtual void sync_modify(ExecutionSpace, unsigned int, unsigned int) {} diff --git a/src/atom_map.cpp b/src/atom_map.cpp index bbfe014dec..4b1be77a06 100644 --- a/src/atom_map.cpp +++ b/src/atom_map.cpp @@ -57,7 +57,7 @@ void Atom::map_init(int check) map_nused = 0; map_free = 0; for (int i = 0; i < map_nhash; i++) map_hash[i].next = i+1; - map_hash[map_nhash-1].next = -1; + if (map_nhash > 0) map_hash[map_nhash-1].next = -1; } // recreating: delete old map and create new one for array or hash @@ -298,12 +298,12 @@ int Atom::map_style_set() MPI_Allreduce(&max,&map_tag_max,1,MPI_LMP_TAGINT,MPI_MAX,world); // set map_style for new map - // if user-selected, use that setting + // if user-selected to array/hash, use that setting // else if map_tag_max > 1M, use hash // else use array int map_style_old = map_style; - if (map_user) map_style = map_user; + if (map_user == 1 || map_user == 2) map_style = map_user; else if (map_tag_max > 1000000) map_style = 2; else map_style = 1; diff --git a/src/atom_masks.h b/src/atom_masks.h index 119f09f273..8e29448488 100644 --- a/src/atom_masks.h +++ b/src/atom_masks.h @@ -42,6 +42,18 @@ #define ENERGY_MASK 0x00010000 #define VIRIAL_MASK 0x00020000 +// DPD + +#define DPDRHO_MASK 0x00040000 +#define DPDTHETA_MASK 0x00080000 +#define UCOND_MASK 0x00100000 +#define UMECH_MASK 0x00200000 +#define UCHEM_MASK 0x00400000 +#define UCG_MASK 0x00800000 +#define UCGNEW_MASK 0x01000000 +#define DUCHEM_MASK 0x02000000 +#define DVECTOR_MASK 0x04000000 + // granular #define RADIUS_MASK 0x00100000 diff --git a/src/atom_vec.cpp b/src/atom_vec.cpp index a8fa982c00..14091cbb77 100644 --- a/src/atom_vec.cpp +++ b/src/atom_vec.cpp @@ -274,7 +274,7 @@ void AtomVec::write_angle(FILE *fp, int n, tagint **buf, int index) pack dihedral info for data file ------------------------------------------------------------------------- */ -void AtomVec::pack_dihedral(tagint **buf) +int AtomVec::pack_dihedral(tagint **buf) { tagint *tag = atom->tag; int *num_dihedral = atom->num_dihedral; @@ -291,25 +291,31 @@ void AtomVec::pack_dihedral(tagint **buf) if (newton_bond) { for (i = 0; i < nlocal; i++) for (j = 0; j < num_dihedral[i]; j++) { - buf[m][0] = MAX(dihedral_type[i][j],-dihedral_type[i][j]); - buf[m][1] = dihedral_atom1[i][j]; - buf[m][2] = dihedral_atom2[i][j]; - buf[m][3] = dihedral_atom3[i][j]; - buf[m][4] = dihedral_atom4[i][j]; + if (buf) { + buf[m][0] = MAX(dihedral_type[i][j],-dihedral_type[i][j]); + buf[m][1] = dihedral_atom1[i][j]; + buf[m][2] = dihedral_atom2[i][j]; + buf[m][3] = dihedral_atom3[i][j]; + buf[m][4] = dihedral_atom4[i][j]; + } m++; } } else { for (i = 0; i < nlocal; i++) for (j = 0; j < num_dihedral[i]; j++) if (tag[i] == dihedral_atom2[i][j]) { - buf[m][0] = MAX(dihedral_type[i][j],-dihedral_type[i][j]); - buf[m][1] = dihedral_atom1[i][j]; - buf[m][2] = dihedral_atom2[i][j]; - buf[m][3] = dihedral_atom3[i][j]; - buf[m][4] = dihedral_atom4[i][j]; + if (buf) { + buf[m][0] = MAX(dihedral_type[i][j],-dihedral_type[i][j]); + buf[m][1] = dihedral_atom1[i][j]; + buf[m][2] = dihedral_atom2[i][j]; + buf[m][3] = dihedral_atom3[i][j]; + buf[m][4] = dihedral_atom4[i][j]; + } m++; } } + + return m; } /* ---------------------------------------------------------------------- @@ -330,7 +336,7 @@ void AtomVec::write_dihedral(FILE *fp, int n, tagint **buf, int index) pack improper info for data file ------------------------------------------------------------------------- */ -void AtomVec::pack_improper(tagint **buf) +int AtomVec::pack_improper(tagint **buf) { tagint *tag = atom->tag; int *num_improper = atom->num_improper; @@ -347,25 +353,31 @@ void AtomVec::pack_improper(tagint **buf) if (newton_bond) { for (i = 0; i < nlocal; i++) for (j = 0; j < num_improper[i]; j++) { - buf[m][0] = MAX(improper_type[i][j],-improper_type[i][j]); - buf[m][1] = improper_atom1[i][j]; - buf[m][2] = improper_atom2[i][j]; - buf[m][3] = improper_atom3[i][j]; - buf[m][4] = improper_atom4[i][j]; + if (buf) { + buf[m][0] = MAX(improper_type[i][j],-improper_type[i][j]); + buf[m][1] = improper_atom1[i][j]; + buf[m][2] = improper_atom2[i][j]; + buf[m][3] = improper_atom3[i][j]; + buf[m][4] = improper_atom4[i][j]; + } m++; } } else { for (i = 0; i < nlocal; i++) for (j = 0; j < num_improper[i]; j++) if (tag[i] == improper_atom2[i][j]) { - buf[m][0] = MAX(improper_type[i][j],-improper_type[i][j]); - buf[m][1] = improper_atom1[i][j]; - buf[m][2] = improper_atom2[i][j]; - buf[m][3] = improper_atom3[i][j]; - buf[m][4] = improper_atom4[i][j]; + if (buf) { + buf[m][0] = MAX(improper_type[i][j],-improper_type[i][j]); + buf[m][1] = improper_atom1[i][j]; + buf[m][2] = improper_atom2[i][j]; + buf[m][3] = improper_atom3[i][j]; + buf[m][4] = improper_atom4[i][j]; + } m++; } } + + return m; } /* ---------------------------------------------------------------------- diff --git a/src/atom_vec.h b/src/atom_vec.h index 698cdef2f5..5be955a06c 100644 --- a/src/atom_vec.h +++ b/src/atom_vec.h @@ -107,9 +107,9 @@ class AtomVec : protected Pointers { void write_bond(FILE *, int, tagint **, int); int pack_angle(tagint **); void write_angle(FILE *, int, tagint **, int); - void pack_dihedral(tagint **); + int pack_dihedral(tagint **); void write_dihedral(FILE *, int, tagint **, int); - void pack_improper(tagint **); + int pack_improper(tagint **); void write_improper(FILE *, int, tagint **, int); virtual int property_atom(char *) {return -1;} diff --git a/src/balance.cpp b/src/balance.cpp index c184a72d32..8f994466ad 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -782,7 +782,7 @@ void Balance::shift_setup(char *str, int nitermax_in, double thresh_in) int Balance::shift() { - int i,j,k,m,np,max; + int i,j,k,m,np; double mycost,totalcost; double *split; diff --git a/src/comm.cpp b/src/comm.cpp index 88edf98ca6..d997c2914f 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -696,10 +696,15 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (maxbytes == 0) return; + // sanity check + + if ((nbytes > 0) && inbuf == NULL) + error->one(FLERR,"Cannot put data on ring from NULL pointer"); + char *buf,*bufcopy; memory->create(buf,maxbytes,"comm:buf"); memory->create(bufcopy,maxbytes,"comm:bufcopy"); - memcpy(buf,inbuf,nbytes); + if (nbytes && inbuf) memcpy(buf,inbuf,nbytes); int next = me + 1; int prev = me - 1; @@ -712,12 +717,12 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, MPI_Send(buf,nbytes,MPI_CHAR,next,messtag,world); MPI_Wait(&request,&status); MPI_Get_count(&status,MPI_CHAR,&nbytes); - memcpy(buf,bufcopy,nbytes); + if (nbytes) memcpy(buf,bufcopy,nbytes); } if (self || loop < nprocs-1) callback(nbytes/nper,buf,ptr); } - if (outbuf) memcpy(outbuf,buf,nbytes); + if (nbytes && outbuf) memcpy(outbuf,buf,nbytes); memory->destroy(buf); memory->destroy(bufcopy); diff --git a/src/comm_brick.cpp b/src/comm_brick.cpp index 3c972b8244..06227b7a84 100644 --- a/src/comm_brick.cpp +++ b/src/comm_brick.cpp @@ -476,8 +476,7 @@ void CommBrick::forward_comm(int dummy) if (sendproc[iswap] != me) { if (comm_x_only) { if (size_forward_recv[iswap]) { - if (size_forward_recv[iswap]) buf = x[firstrecv[iswap]]; - else buf = NULL; + buf = x[firstrecv[iswap]]; MPI_Irecv(buf,size_forward_recv[iswap],MPI_DOUBLE, recvproc[iswap],0,world,&request); } @@ -547,8 +546,7 @@ void CommBrick::reverse_comm() MPI_Irecv(buf_recv,size_reverse_recv[iswap],MPI_DOUBLE, sendproc[iswap],0,world,&request); if (size_reverse_send[iswap]) { - if (size_reverse_send[iswap]) buf = f[firstrecv[iswap]]; - else buf = NULL; + buf = f[firstrecv[iswap]]; MPI_Send(buf,size_reverse_send[iswap],MPI_DOUBLE, recvproc[iswap],0,world); } diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp new file mode 100644 index 0000000000..d61fd06397 --- /dev/null +++ b/src/compute_aggregate_atom.cpp @@ -0,0 +1,316 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include +#include +#include "compute_aggregate_atom.h" +#include "atom.h" +#include "atom_vec.h" +#include "update.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "pair.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +#include "group.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +ComputeAggregateAtom::ComputeAggregateAtom(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg), + aggregateID(NULL) +{ + if (narg != 4) error->all(FLERR,"Illegal compute aggregate/atom command"); + + double cutoff = force->numeric(FLERR,arg[3]); + cutsq = cutoff*cutoff; + + if (atom->avec->bonds_allow == 0) + error->all(FLERR,"Compute aggregate/atom used when bonds are not allowed"); + + peratom_flag = 1; + size_peratom_cols = 0; + comm_forward = 1; + comm_reverse = 1; + + nmax = 0; +} + +/* ---------------------------------------------------------------------- */ + +ComputeAggregateAtom::~ComputeAggregateAtom() +{ + memory->destroy(aggregateID); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::init() +{ + if (atom->tag_enable == 0) + error->all(FLERR,"Cannot use compute aggregate/atom unless atoms have IDs"); + if (force->bond == NULL) + error->all(FLERR,"Compute aggregate/atom requires a bond style to be defined"); + + if (force->pair == NULL) + error->all(FLERR,"Compute cluster/atom requires a pair style to be defined"); + if (sqrt(cutsq) > force->pair->cutforce) + error->all(FLERR, + "Compute cluster/atom cutoff is longer than pairwise cutoff"); + + // need an occasional full neighbor list + // full required so that pair of atoms on 2 procs both set their clusterID + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->compute = 1; + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->occasional = 1; + + int count = 0; + for (int i = 0; i < modify->ncompute; i++) + if (strcmp(modify->compute[i]->style,"aggregate/atom") == 0) count++; + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one compute aggregate/atom"); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::init_list(int id, NeighList *ptr) +{ + list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::compute_peratom() +{ + int i,j,k; + + invoked_peratom = update->ntimestep; + + // grow aggregateID array if necessary + + if (atom->nmax > nmax) { + memory->destroy(aggregateID); + nmax = atom->nmax; + memory->create(aggregateID,nmax,"aggregate/atom:aggregateID"); + vector_atom = aggregateID; + } + + // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) + + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); + + // if group is dynamic, insure ghost atom masks are current + + if (group->dynamic[igroup]) { + commflag = 0; + comm->forward_comm_compute(this); + } + + // each atom starts in its own aggregate, + + int nlocal = atom->nlocal; + int inum = list->inum; + tagint *tag = atom->tag; + int *mask = atom->mask; + int *num_bond = atom->num_bond; + int **bond_type = atom->bond_type; + tagint **bond_atom = atom->bond_atom; + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + double **x = atom->x; + + for (i = 0; i < nlocal + atom->nghost; i++) + if (mask[i] & groupbit) aggregateID[i] = tag[i]; + else aggregateID[i] = 0; + + // loop until no more changes on any proc: + // acquire aggregateIDs of ghost atoms + // loop over my atoms, and check atoms bound to it + // if both atoms are in aggregate, assign lowest aggregateID to both + // then loop over my atoms, checking distance to neighbors + // if both atoms are in cluster, assign lowest clusterID to both + // iterate until no changes in my atoms + // then check if any proc made changes + + commflag = 1; + + int change,done,anychange; + + while (1) { + comm->forward_comm_compute(this); + + // reverse communication when bonds are not stored on every processor + + if (force->newton_bond) + comm->reverse_comm_compute(this); + + change = 0; + while (1) { + done = 1; + for (i = 0; i < nlocal; i++) { + if (!(mask[i] & groupbit)) continue; + + for (j = 0; j < num_bond[i]; j++) { + if (bond_type[i][j] == 0) continue; + k = atom->map(bond_atom[i][j]); + if (k < 0) continue; + if (!(mask[k] & groupbit)) continue; + if (aggregateID[i] == aggregateID[k]) continue; + + aggregateID[i] = aggregateID[k] = MIN(aggregateID[i],aggregateID[k]); + done = 0; + } + } + + for (int ii = 0; ii < inum; ii++) { + i = ilist[ii]; + if (!(mask[i] & groupbit)) continue; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + int *jlist = firstneigh[i]; + const int jnum = numneigh[i]; + + for (int jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + if (!(mask[j] & groupbit)) continue; + if (aggregateID[i] == aggregateID[j]) continue; + + const double delx = xtmp - x[j][0]; + const double dely = ytmp - x[j][1]; + const double delz = ztmp - x[j][2]; + const double rsq = delx*delx + dely*dely + delz*delz; + if (rsq < cutsq) { + aggregateID[i] = aggregateID[j] + = MIN(aggregateID[i],aggregateID[j]); + done = 0; + } + } + } + if (!done) change = 1; + if (done) break; + } + + // stop if all procs are done + + MPI_Allreduce(&change,&anychange,1,MPI_INT,MPI_MAX,world); + if (!anychange) break; + } +} + +/* ---------------------------------------------------------------------- */ + +int ComputeAggregateAtom::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + if (commflag) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = aggregateID[j]; + } + } else { + int *mask = atom->mask; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = ubuf(mask[j]).d; + } + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + if (commflag) + for (i = first; i < last; i++) { + double x = buf[m++]; + + // only overwrite ghost IDs with values lower than current ones + + aggregateID[i] = MIN(x,aggregateID[i]); + } + else { + int *mask = atom->mask; + for (i = first; i < last; i++) mask[i] = (int) ubuf(buf[m++]).i; + } +} + +/* ---------------------------------------------------------------------- */ + +int ComputeAggregateAtom::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = aggregateID[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + double x = buf[m++]; + + // only overwrite local IDs with values lower than current ones + + aggregateID[j] = MIN(x,aggregateID[j]); + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based array +------------------------------------------------------------------------- */ + +double ComputeAggregateAtom::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} diff --git a/src/compute_aggregate_atom.h b/src/compute_aggregate_atom.h new file mode 100644 index 0000000000..dc2e1d7b40 --- /dev/null +++ b/src/compute_aggregate_atom.h @@ -0,0 +1,72 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(aggregate/atom,ComputeAggregateAtom) + +#else + +#ifndef LMP_COMPUTE_AGGREGATE_ATOM_H +#define LMP_COMPUTE_AGGREGATE_ATOM_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputeAggregateAtom : public Compute { + public: + ComputeAggregateAtom(class LAMMPS *, int, char **); + ~ComputeAggregateAtom(); + void init(); + void init_list(int, class NeighList *); + void compute_peratom(); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + double memory_usage(); + + private: + int nmax,commflag; + double cutsq; + class NeighList *list; + double *aggregateID; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Cannot use compute aggregate/atom unless atoms have IDs + +Atom IDs are used to identify aggregates. + +E: Compute aggregate/atom requires a bond style to be defined + +This is so that a bond list is generated which is used to find aggregates. + +W: More than one compute aggregate/atom + +It is not efficient to use compute aggregate/atom more than once. + +*/ diff --git a/src/compute_centro_atom.cpp b/src/compute_centro_atom.cpp index 3f88095d77..c76b569462 100644 --- a/src/compute_centro_atom.cpp +++ b/src/compute_centro_atom.cpp @@ -39,7 +39,8 @@ ComputeCentroAtom::ComputeCentroAtom(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), distsq(NULL), nearest(NULL), centro(NULL) { - if (narg < 4 || narg > 6) error->all(FLERR,"Illegal compute centro/atom command"); + if (narg < 4 || narg > 6) + error->all(FLERR,"Illegal compute centro/atom command"); if (strcmp(arg[3],"fcc") == 0) nnn = 12; else if (strcmp(arg[3],"bcc") == 0) nnn = 8; @@ -48,13 +49,14 @@ ComputeCentroAtom::ComputeCentroAtom(LAMMPS *lmp, int narg, char **arg) : // default values axes_flag = 0; - + // optional keywords - + int iarg = 4; while (iarg < narg) { if (strcmp(arg[iarg],"axes") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal compute centro/atom command3"); + if (iarg+2 > narg) + error->all(FLERR,"Illegal compute centro/atom command3"); if (strcmp(arg[iarg+1],"yes") == 0) axes_flag = 1; else if (strcmp(arg[iarg+1],"no") == 0) axes_flag = 0; else error->all(FLERR,"Illegal compute centro/atom command2"); @@ -68,7 +70,7 @@ ComputeCentroAtom::ComputeCentroAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; if (!axes_flag) size_peratom_cols = 0; else size_peratom_cols = 10; - + nmax = 0; maxneigh = 0; } @@ -137,7 +139,8 @@ void ComputeCentroAtom::compute_peratom() memory->destroy(array_atom); nmax = atom->nmax; memory->create(centro,nmax,"centro/atom:centro"); - memory->create(array_atom,nmax,size_peratom_cols,"centro/atom:array_atom"); + memory->create(array_atom,nmax,size_peratom_cols, + "centro/atom:array_atom"); } } @@ -202,98 +205,98 @@ void ComputeCentroAtom::compute_peratom() } // check whether to include local crystal symmetry axes - + if (!axes_flag) { - - // if not nnn neighbors, centro = 0.0 + + // if not nnn neighbors, centro = 0.0 - if (n < nnn) { - centro[i] = 0.0; - continue; - } + if (n < nnn) { + centro[i] = 0.0; + continue; + } - // store nnn nearest neighs in 1st nnn locations of distsq and nearest + // store nnn nearest neighs in 1st nnn locations of distsq and nearest - select2(nnn,n,distsq,nearest); + select2(nnn,n,distsq,nearest); - // R = Ri + Rj for each of npairs i,j pairs among nnn neighbors - // pairs = squared length of each R + // R = Ri + Rj for each of npairs i,j pairs among nnn neighbors + // pairs = squared length of each R - n = 0; - for (j = 0; j < nnn; j++) { - jj = nearest[j]; - for (k = j+1; k < nnn; k++) { - kk = nearest[k]; - delx = x[jj][0] + x[kk][0] - 2.0*xtmp; - dely = x[jj][1] + x[kk][1] - 2.0*ytmp; - delz = x[jj][2] + x[kk][2] - 2.0*ztmp; - pairs[n++] = delx*delx + dely*dely + delz*delz; + n = 0; + for (j = 0; j < nnn; j++) { + jj = nearest[j]; + for (k = j+1; k < nnn; k++) { + kk = nearest[k]; + delx = x[jj][0] + x[kk][0] - 2.0*xtmp; + dely = x[jj][1] + x[kk][1] - 2.0*ytmp; + delz = x[jj][2] + x[kk][2] - 2.0*ztmp; + pairs[n++] = delx*delx + dely*dely + delz*delz; - } - } - + } + } + } else { - - // calculate local crystal symmetry axes + + // calculate local crystal symmetry axes - // rsq1, rsq2 are two smallest values of R^2 - // R1, R2 are corresponding vectors Ri - Rj - // R3 is normal to R1, R2 + // rsq1, rsq2 are two smallest values of R^2 + // R1, R2 are corresponding vectors Ri - Rj + // R3 is normal to R1, R2 - double rsq1,rsq2; + double rsq1,rsq2; - double* r1 = &array_atom[i][1]; - double* r2 = &array_atom[i][4]; - double* r3 = &array_atom[i][7]; - - if (n < nnn) { - centro[i] = 0.0; - MathExtra::zero3(r1); - MathExtra::zero3(r2); - MathExtra::zero3(r3); - continue; - } + double* r1 = &array_atom[i][1]; + double* r2 = &array_atom[i][4]; + double* r3 = &array_atom[i][7]; + + if (n < nnn) { + centro[i] = 0.0; + MathExtra::zero3(r1); + MathExtra::zero3(r2); + MathExtra::zero3(r3); + continue; + } - // store nnn nearest neighs in 1st nnn locations of distsq and nearest + // store nnn nearest neighs in 1st nnn locations of distsq and nearest - select2(nnn,n,distsq,nearest); + select2(nnn,n,distsq,nearest); - n = 0; - rsq1 = rsq2 = cutsq; - for (j = 0; j < nnn; j++) { - jj = nearest[j]; - for (k = j+1; k < nnn; k++) { - kk = nearest[k]; - delx = x[jj][0] + x[kk][0] - 2.0*xtmp; - dely = x[jj][1] + x[kk][1] - 2.0*ytmp; - delz = x[jj][2] + x[kk][2] - 2.0*ztmp; - double rsq = delx*delx + dely*dely + delz*delz; - pairs[n++] = rsq; - - if (rsq < rsq2) { - if (rsq < rsq1) { - rsq2 = rsq1; - MathExtra::copy3(r1, r2); - rsq1 = rsq; - MathExtra::sub3(x[jj],x[kk],r1); - } else { - rsq2 = rsq; - MathExtra::sub3(x[jj],x[kk],r2); - } + n = 0; + rsq1 = rsq2 = cutsq; + for (j = 0; j < nnn; j++) { + jj = nearest[j]; + for (k = j+1; k < nnn; k++) { + kk = nearest[k]; + delx = x[jj][0] + x[kk][0] - 2.0*xtmp; + dely = x[jj][1] + x[kk][1] - 2.0*ytmp; + delz = x[jj][2] + x[kk][2] - 2.0*ztmp; + double rsq = delx*delx + dely*dely + delz*delz; + pairs[n++] = rsq; + + if (rsq < rsq2) { + if (rsq < rsq1) { + rsq2 = rsq1; + MathExtra::copy3(r1, r2); + rsq1 = rsq; + MathExtra::sub3(x[jj],x[kk],r1); + } else { + rsq2 = rsq; + MathExtra::sub3(x[jj],x[kk],r2); + } } - } - } + } + } - MathExtra::cross3(r1,r2,r3); - MathExtra::norm3(r1); - MathExtra::norm3(r2); - MathExtra::norm3(r3); + MathExtra::cross3(r1,r2,r3); + MathExtra::norm3(r1); + MathExtra::norm3(r2); + MathExtra::norm3(r3); } - + // store nhalf smallest pair distances in 1st nhalf locations of pairs - + select(nhalf,npairs,pairs); - + // centrosymmetry = sum of nhalf smallest squared values value = 0.0; @@ -303,9 +306,9 @@ void ComputeCentroAtom::compute_peratom() } else { centro[i] = 0.0; if (axes_flag) { - MathExtra::zero3(&array_atom[i][1]); - MathExtra::zero3(&array_atom[i][4]); - MathExtra::zero3(&array_atom[i][7]); + MathExtra::zero3(&array_atom[i][1]); + MathExtra::zero3(&array_atom[i][4]); + MathExtra::zero3(&array_atom[i][7]); } } } @@ -316,10 +319,11 @@ void ComputeCentroAtom::compute_peratom() for (ii = 0; ii < inum; ii++) { i = ilist[ii]; if (mask[i] & groupbit) - array_atom[i][0] = centro[i]; + array_atom[i][0] = centro[i]; } } + /* ---------------------------------------------------------------------- 2 select routines from Numerical Recipes (slightly modified) find k smallest values in array of length n @@ -434,5 +438,6 @@ void ComputeCentroAtom::select2(int k, int n, double *arr, int *iarr) double ComputeCentroAtom::memory_usage() { double bytes = nmax * sizeof(double); + if (axes_flag) bytes += size_peratom_cols*nmax * sizeof(double); return bytes; } diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index f1052bb85a..d08f462907 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -218,10 +218,10 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : if (limit && !compress) limitfirst = 1; iarg += 2; if (limit) { - if (iarg+1 > narg) + if (iarg > narg) error->all(FLERR,"Illegal compute chunk/atom command"); - if (strcmp(arg[iarg+1],"max") == 0) limitstyle = LIMITMAX; - else if (strcmp(arg[iarg+1],"exact") == 0) limitstyle = LIMITEXACT; + if (strcmp(arg[iarg],"max") == 0) limitstyle = LIMITMAX; + else if (strcmp(arg[iarg],"exact") == 0) limitstyle = LIMITEXACT; else error->all(FLERR,"Illegal compute chunk/atom command"); iarg++; } @@ -712,13 +712,14 @@ void ComputeChunkAtom::compute_ichunk() return; } - invoked_ichunk = update->ntimestep; - // assign chunk IDs to atoms // will exclude atoms not in group or in optional region // already invoked if this is same timestep as last setup_chunks() + // however, when between runs or using rerun, we need it again. - if (update->ntimestep > invoked_setup) assign_chunk_ids(); + if ((update->ntimestep > invoked_setup) || (invoked_ichunk < 0)) assign_chunk_ids(); + + invoked_ichunk = update->ntimestep; // compress chunk IDs via hash of the original uncompressed IDs // also apply discard rule except for binning styles which already did @@ -1808,13 +1809,13 @@ void ComputeChunkAtom::atom2binsphere() } yremap = x[i][1]; if (periodicity[1]) { - if (xremap < boxlo[1]) yremap += prd[1]; - if (xremap >= boxhi[1]) yremap -= prd[1]; + if (yremap < boxlo[1]) yremap += prd[1]; + if (yremap >= boxhi[1]) yremap -= prd[1]; } zremap = x[i][2]; if (periodicity[2]) { - if (xremap < boxlo[2]) zremap += prd[2]; - if (xremap >= boxhi[2]) zremap -= prd[2]; + if (zremap < boxlo[2]) zremap += prd[2]; + if (zremap >= boxhi[2]) zremap -= prd[2]; } dx = xremap - sorigin[0]; diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index 80c002d39f..9a7df03e49 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -63,7 +63,7 @@ void ComputeClusterAtom::init() if (atom->tag_enable == 0) error->all(FLERR,"Cannot use compute cluster/atom unless atoms have IDs"); if (force->pair == NULL) - error->all(FLERR,"Compute cluster/atom requires a pair style be defined"); + error->all(FLERR,"Compute cluster/atom requires a pair style to be defined"); if (sqrt(cutsq) > force->pair->cutforce) error->all(FLERR, "Compute cluster/atom cutoff is longer than pairwise cutoff"); @@ -112,8 +112,10 @@ void ComputeClusterAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/compute_cluster_atom.h b/src/compute_cluster_atom.h index aae4747781..253396b40e 100644 --- a/src/compute_cluster_atom.h +++ b/src/compute_cluster_atom.h @@ -59,7 +59,7 @@ E: Cannot use compute cluster/atom unless atoms have IDs Atom IDs are used to identify clusters. -E: Compute cluster/atom requires a pair style be defined +E: Compute cluster/atom requires a pair style to be defined This is so that the pair style defines a cutoff distance which is used to find clusters. diff --git a/src/compute_fragment_atom.cpp b/src/compute_fragment_atom.cpp new file mode 100644 index 0000000000..8606f54933 --- /dev/null +++ b/src/compute_fragment_atom.cpp @@ -0,0 +1,244 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include +#include "compute_fragment_atom.h" +#include "atom.h" +#include "atom_vec.h" +#include "update.h" +#include "modify.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +#include "group.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +ComputeFragmentAtom::ComputeFragmentAtom(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg), + fragmentID(NULL) +{ + if (narg != 3) error->all(FLERR,"Illegal compute fragment/atom command"); + + if (atom->avec->bonds_allow == 0) + error->all(FLERR,"Compute fragment/atom used when bonds are not allowed"); + + peratom_flag = 1; + size_peratom_cols = 0; + comm_forward = 1; + comm_reverse = 1; + + nmax = 0; +} + +/* ---------------------------------------------------------------------- */ + +ComputeFragmentAtom::~ComputeFragmentAtom() +{ + memory->destroy(fragmentID); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFragmentAtom::init() +{ + if (atom->tag_enable == 0) + error->all(FLERR,"Cannot use compute fragment/atom unless atoms have IDs"); + if (force->bond == NULL) + error->all(FLERR,"Compute fragment/atom requires a bond style to be defined"); + + int count = 0; + for (int i = 0; i < modify->ncompute; i++) + if (strcmp(modify->compute[i]->style,"fragment/atom") == 0) count++; + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one compute fragment/atom"); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFragmentAtom::compute_peratom() +{ + int i,j,k; + + invoked_peratom = update->ntimestep; + + // grow fragmentID array if necessary + + if (atom->nmax > nmax) { + memory->destroy(fragmentID); + nmax = atom->nmax; + memory->create(fragmentID,nmax,"fragment/atom:fragmentID"); + vector_atom = fragmentID; + } + + // if group is dynamic, insure ghost atom masks are current + + if (group->dynamic[igroup]) { + commflag = 0; + comm->forward_comm_compute(this); + } + + // each atom starts in its own fragment, + + int nlocal = atom->nlocal; + tagint *tag = atom->tag; + int *mask = atom->mask; + int *num_bond = atom->num_bond; + int **bond_type = atom->bond_type; + tagint **bond_atom = atom->bond_atom; + + for (i = 0; i < nlocal + atom->nghost; i++) + if (mask[i] & groupbit) fragmentID[i] = tag[i]; + else fragmentID[i] = 0; + + // loop until no more changes on any proc: + // acquire fragmentIDs of ghost atoms + // loop over my atoms, and check atoms bound to it + // if both atoms are in fragment, assign lowest fragmentID to both + // iterate until no changes in my atoms + // then check if any proc made changes + + commflag = 1; + + int change,done,anychange; + + while (1) { + comm->forward_comm_compute(this); + + // reverse communication when bonds are not stored on every processor + + if (force->newton_bond) + comm->reverse_comm_compute(this); + + change = 0; + while (1) { + done = 1; + for (i = 0; i < nlocal; i++) { + if (!(mask[i] & groupbit)) continue; + + for (j = 0; j < num_bond[i]; j++) { + if (bond_type[i][j] == 0) continue; + k = atom->map(bond_atom[i][j]); + if (k < 0) continue; + if (!(mask[k] & groupbit)) continue; + if (fragmentID[i] == fragmentID[k]) continue; + + fragmentID[i] = fragmentID[k] = MIN(fragmentID[i],fragmentID[k]); + done = 0; + } + } + if (!done) change = 1; + if (done) break; + } + + // stop if all procs are done + + MPI_Allreduce(&change,&anychange,1,MPI_INT,MPI_MAX,world); + if (!anychange) break; + } +} + +/* ---------------------------------------------------------------------- */ + +int ComputeFragmentAtom::pack_forward_comm(int n, int *list, double *buf, + int pbc_flag, int *pbc) +{ + int i,j,m; + + m = 0; + if (commflag) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = fragmentID[j]; + } + } else { + int *mask = atom->mask; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = ubuf(mask[j]).d; + } + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFragmentAtom::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + if (commflag) + for (i = first; i < last; i++) { + double x = buf[m++]; + + // only overwrite ghost IDs with values lower than current ones + + fragmentID[i] = MIN(x,fragmentID[i]); + } + else { + int *mask = atom->mask; + for (i = first; i < last; i++) mask[i] = (int) ubuf(buf[m++]).i; + } +} + +/* ---------------------------------------------------------------------- */ + +int ComputeFragmentAtom::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = fragmentID[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFragmentAtom::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + double x = buf[m++]; + + // only overwrite local IDs with values lower than current ones + + fragmentID[j] = MIN(x,fragmentID[j]); + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based array +------------------------------------------------------------------------- */ + +double ComputeFragmentAtom::memory_usage() +{ + double bytes = nmax * sizeof(double); + return bytes; +} diff --git a/src/compute_fragment_atom.h b/src/compute_fragment_atom.h new file mode 100644 index 0000000000..2365b6028b --- /dev/null +++ b/src/compute_fragment_atom.h @@ -0,0 +1,69 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(fragment/atom,ComputeFragmentAtom) + +#else + +#ifndef LMP_COMPUTE_FRAGMENT_ATOM_H +#define LMP_COMPUTE_FRAGMENT_ATOM_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputeFragmentAtom : public Compute { + public: + ComputeFragmentAtom(class LAMMPS *, int, char **); + ~ComputeFragmentAtom(); + void init(); + void compute_peratom(); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); + double memory_usage(); + + private: + int nmax,commflag; + double *fragmentID; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Cannot use compute fragment/atom unless atoms have IDs + +Atom IDs are used to identify fragments. + +E: Compute fragment/atom requires a bond style to be defined + +This is so that a bond list is generated which is used to find fragments. + +W: More than one compute fragment/atom + +It is not efficient to use compute fragment/atom more than once. + +*/ diff --git a/src/compute_hexorder_atom.cpp b/src/compute_hexorder_atom.cpp index 013036f364..85324651c1 100644 --- a/src/compute_hexorder_atom.cpp +++ b/src/compute_hexorder_atom.cpp @@ -154,8 +154,10 @@ void ComputeHexOrderAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/compute_msd_chunk.cpp b/src/compute_msd_chunk.cpp index bc5a374fad..69cd87f96b 100644 --- a/src/compute_msd_chunk.cpp +++ b/src/compute_msd_chunk.cpp @@ -126,7 +126,7 @@ void ComputeMSDChunk::setup() if (fix->nrow == nchunk && fix->ncol == 3) return; fix->reset_global(nchunk,3); - + double **cominit = fix->astore; for (int i = 0; i < nchunk; i++) { cominit[i][0] = comall[i][0]; diff --git a/src/compute_orientorder_atom.cpp b/src/compute_orientorder_atom.cpp index 90e2830e39..b443d56bf8 100644 --- a/src/compute_orientorder_atom.cpp +++ b/src/compute_orientorder_atom.cpp @@ -18,6 +18,7 @@ #include #include +#include #include "compute_orientorder_atom.h" #include "atom.h" #include "update.h" diff --git a/src/compute_pressure.cpp b/src/compute_pressure.cpp index fde19a277a..80289c59b3 100644 --- a/src/compute_pressure.cpp +++ b/src/compute_pressure.cpp @@ -147,7 +147,7 @@ void ComputePressure::init() if (improperflag && atom->molecular && force->improper) nvirial++; if (fixflag) for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->virial_flag) nvirial++; + if (modify->fix[i]->thermo_virial) nvirial++; if (nvirial) { vptr = new double*[nvirial]; @@ -161,7 +161,7 @@ void ComputePressure::init() vptr[nvirial++] = force->improper->virial; if (fixflag) for (int i = 0; i < modify->nfix; i++) - if (modify->fix[i]->virial_flag) + if (modify->fix[i]->thermo_virial) vptr[nvirial++] = modify->fix[i]->virial; } diff --git a/src/compute_rdf.cpp b/src/compute_rdf.cpp index 167de4576d..bcb620f3b3 100644 --- a/src/compute_rdf.cpp +++ b/src/compute_rdf.cpp @@ -32,6 +32,7 @@ #include "math_const.h" #include "memory.h" #include "error.h" +#include "comm.h" using namespace LAMMPS_NS; using namespace MathConst; diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index fd6b091c25..8a012e6a67 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -359,6 +359,11 @@ void CreateAtoms::command(int narg, char **arg) } } + // Record wall time for atom creation + + MPI_Barrier(world); + double time1 = MPI_Wtime(); + // clear ghost count and any ghost bonus data internal to AtomVec // same logic as beginning of Comm::exchange() // do it now b/c creating atoms will overwrite ghost atoms @@ -525,6 +530,9 @@ void CreateAtoms::command(int narg, char **arg) if (domain->triclinic) domain->lamda2x(atom->nlocal); } + MPI_Barrier(world); + double time2 = MPI_Wtime(); + // clean up delete ranmol; @@ -538,12 +546,16 @@ void CreateAtoms::command(int narg, char **arg) // print status if (comm->me == 0) { - if (screen) + if (screen) { fprintf(screen,"Created " BIGINT_FORMAT " atoms\n", atom->natoms-natoms_previous); - if (logfile) + fprintf(screen," Time spent = %g secs\n",time2-time1); + } + if (logfile) { fprintf(logfile,"Created " BIGINT_FORMAT " atoms\n", atom->natoms-natoms_previous); + fprintf(logfile," Time spent = %g secs\n",time2-time1); + } } // for MOLECULE mode: diff --git a/src/create_bonds.cpp b/src/create_bonds.cpp index c62c6df91c..48f12406b6 100644 --- a/src/create_bonds.cpp +++ b/src/create_bonds.cpp @@ -75,6 +75,8 @@ void CreateBonds::command(int narg, char **arg) btype = force->inumeric(FLERR,arg[1]); batom1 = force->tnumeric(FLERR,arg[2]); batom2 = force->tnumeric(FLERR,arg[3]); + if (batom1 == batom2) + error->all(FLERR,"Illegal create_bonds command"); iarg = 4; } else if (strcmp(arg[0],"single/angle") == 0) { style = SANGLE; @@ -83,6 +85,8 @@ void CreateBonds::command(int narg, char **arg) aatom1 = force->tnumeric(FLERR,arg[2]); aatom2 = force->tnumeric(FLERR,arg[3]); aatom3 = force->tnumeric(FLERR,arg[4]); + if ((aatom1 == aatom2) || (aatom1 == aatom3) || (aatom2 == aatom3)) + error->all(FLERR,"Illegal create_bonds command"); iarg = 5; } else if (strcmp(arg[0],"single/dihedral") == 0) { style = SDIHEDRAL; @@ -92,6 +96,9 @@ void CreateBonds::command(int narg, char **arg) datom2 = force->tnumeric(FLERR,arg[3]); datom3 = force->tnumeric(FLERR,arg[4]); datom4 = force->tnumeric(FLERR,arg[5]); + if ((datom1 == datom2) || (datom1 == datom3) || (datom1 == datom4) || + (datom2 == datom3) || (datom2 == datom4) || (datom3 == datom4)) + error->all(FLERR,"Illegal create_bonds command"); iarg = 6; } else error->all(FLERR,"Illegal create_bonds command"); @@ -202,7 +209,7 @@ void CreateBonds::many() comm->exchange(); comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - neighbor->build(); + neighbor->build(1); // build neighbor list this command needs based on earlier request @@ -338,6 +345,7 @@ void CreateBonds::single_bond() bond_atom[m][num_bond[m]] = batom2; num_bond[m]++; } + atom->nbonds++; if (force->newton_bond) return; @@ -385,6 +393,7 @@ void CreateBonds::single_angle() angle_atom3[m][num_angle[m]] = aatom3; num_angle[m]++; } + atom->nangles++; if (force->newton_bond) return; @@ -448,6 +457,7 @@ void CreateBonds::single_dihedral() dihedral_atom4[m][num_dihedral[m]] = datom4; num_dihedral[m]++; } + atom->ndihedrals++; if (force->newton_bond) return; diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index 825426b2b6..a5b15f5f52 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -28,6 +28,7 @@ #include "random_mars.h" #include "memory.h" #include "error.h" +#include "modify.h" #include @@ -310,7 +311,7 @@ void DeleteAtoms::delete_overlap(int narg, char **arg) comm->exchange(); comm->borders(); if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - neighbor->build(); + neighbor->build(1); // build neighbor list this command needs based on earlier request diff --git a/src/domain.cpp b/src/domain.cpp index 427f7785e8..bad5030373 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -772,7 +772,7 @@ void Domain::image_check() delz = unwrap[i][2] - unwrap[k][2]; if (xperiodic && delx > xprd_half) flag = 1; - if (xperiodic && dely > yprd_half) flag = 1; + if (yperiodic && dely > yprd_half) flag = 1; if (dimension == 3 && zperiodic && delz > zprd_half) flag = 1; if (!xperiodic && delx > xprd) flag = 1; if (!yperiodic && dely > yprd) flag = 1; diff --git a/src/dump.cpp b/src/dump.cpp index 44098298ba..ddd958c25c 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -238,7 +238,7 @@ void Dump::init() int gcmcflag = 0; for (int i = 0; i < modify->nfix; i++) if ((strcmp(modify->fix[i]->style,"gcmc") == 0)) - gcmcflag = 1; + gcmcflag = 1; if (sortcol == 0 && atom->tag_consecutive() && !gcmcflag) { tagint *tag = atom->tag; @@ -898,7 +898,7 @@ void Dump::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg],"fileper") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); if (!multiproc) - error->all(FLERR,"Cannot use dump_modify fileper " + error->all(FLERR,"Cannot use dump_modify fileper " "without % in dump file name"); int nper = force->inumeric(FLERR,arg[iarg+1]); if (nper <= 0) error->all(FLERR,"Illegal dump_modify command"); @@ -973,7 +973,7 @@ void Dump::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg],"nfile") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); if (!multiproc) - error->all(FLERR,"Cannot use dump_modify nfile " + error->all(FLERR,"Cannot use dump_modify nfile " "without % in dump file name"); int nfile = force->inumeric(FLERR,arg[iarg+1]); if (nfile <= 0) error->all(FLERR,"Illegal dump_modify command"); diff --git a/src/dump_image.cpp b/src/dump_image.cpp index eedfb89992..0e5f57be6b 100644 --- a/src/dump_image.cpp +++ b/src/dump_image.cpp @@ -1345,7 +1345,7 @@ int DumpImage::modify_param(int narg, char **arg) if (atom->nbondtypes == 0) error->all(FLERR,"Dump modify bdiam not allowed with no bond types"); int nlo,nhi; - force->bounds(FLERR,arg[1],atom->ntypes,nlo,nhi); + force->bounds(FLERR,arg[1],atom->nbondtypes,nlo,nhi); double diam = force->numeric(FLERR,arg[2]); if (diam <= 0.0) error->all(FLERR,"Illegal dump_modify command"); for (int i = nlo; i <= nhi; i++) bdiamtype[i] = diam; diff --git a/src/error.cpp b/src/error.cpp index 0969507fc9..9193314fc8 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -115,10 +115,10 @@ void Error::all(const char *file, int line, const char *str) if (me == 0) { if (input && input->line) lastcmd = input->line; if (screen) fprintf(screen,"ERROR: %s (%s:%d)\n" - "Last command: %s\n", + "Last command: %s\n", str,file,line,lastcmd); if (logfile) fprintf(logfile,"ERROR: %s (%s:%d)\n" - "Last command: %s\n", + "Last command: %s\n", str,file,line,lastcmd); } @@ -152,9 +152,17 @@ void Error::all(const char *file, int line, const char *str) void Error::one(const char *file, int line, const char *str) { int me; + const char *lastcmd = (const char*)"(unknown)"; MPI_Comm_rank(world,&me); - if (screen) fprintf(screen,"ERROR on proc %d: %s (%s:%d)\n", - me,str,file,line); + + if (input && input->line) lastcmd = input->line; + if (screen) fprintf(screen,"ERROR on proc %d: %s (%s:%d)\n" + "Last command: %s\n", + me,str,file,line,lastcmd); + if (logfile) fprintf(logfile,"ERROR on proc %d: %s (%s:%d)\n" + "Last command: %s\n", + me,str,file,line,lastcmd); + if (universe->nworlds > 1) if (universe->uscreen) fprintf(universe->uscreen,"ERROR on proc %d: %s (%s:%d)\n", diff --git a/src/finish.cpp b/src/finish.cpp index 45e9226388..c22ecaae60 100644 --- a/src/finish.cpp +++ b/src/finish.cpp @@ -130,7 +130,7 @@ void Finish::end(int flag) atom->natoms); if (logfile) fprintf(logfile,fmt1,time_loop,ntasks,update->nsteps, atom->natoms); - + // Gromacs/NAMD-style performance metric for suitable unit settings if ( timeflag && !minflag && !prdflag && !tadflag && @@ -144,7 +144,7 @@ void Finish::end(int flag) double one_fs = force->femtosecond; double t_step = ((double) time_loop) / ((double) update->nsteps); double step_t = 1.0/t_step; - + if (strcmp(update->unit_style,"lj") == 0) { double tau_day = 24.0*3600.0 / t_step * update->dt / one_fs; const char perf[] = "Performance: %.3f tau/day, %.3f timesteps/s\n"; @@ -161,7 +161,7 @@ void Finish::end(int flag) } // CPU use on MPI tasks and OpenMP threads - + if (timeflag) { if (lmp->kokkos) { const char fmt2[] = diff --git a/src/fix.cpp b/src/fix.cpp index e6e8a292b9..297d184967 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -31,7 +31,7 @@ int Fix::instance_total = 0; /* ---------------------------------------------------------------------- */ -Fix::Fix(LAMMPS *lmp, int narg, char **arg) : +Fix::Fix(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp), id(NULL), style(NULL), extlist(NULL), vector_atom(NULL), array_atom(NULL), vector_local(NULL), array_local(NULL), eatom(NULL), vatom(NULL) @@ -61,6 +61,7 @@ Fix::Fix(LAMMPS *lmp, int narg, char **arg) : force_reneighbor = 0; box_change_size = box_change_shape = box_change_domain = 0; thermo_energy = 0; + thermo_virial = 0; rigid_flag = 0; peatom_flag = 0; virial_flag = 0; @@ -140,8 +141,20 @@ void Fix::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg],"energy") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); if (strcmp(arg[iarg+1],"no") == 0) thermo_energy = 0; - else if (strcmp(arg[iarg+1],"yes") == 0) thermo_energy = 1; - else error->all(FLERR,"Illegal fix_modify command"); + else if (strcmp(arg[iarg+1],"yes") == 0) { + if (!(THERMO_ENERGY & setmask())) + error->all(FLERR,"Illegal fix_modify command"); + thermo_energy = 1; + } else error->all(FLERR,"Illegal fix_modify command"); + iarg += 2; + } else if (strcmp(arg[iarg],"virial") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); + if (strcmp(arg[iarg+1],"no") == 0) thermo_virial = 0; + else if (strcmp(arg[iarg+1],"yes") == 0) { + if (virial_flag == 0) + error->all(FLERR,"Illegal fix_modify command"); + thermo_virial = 1; + } else error->all(FLERR,"Illegal fix_modify command"); iarg += 2; } else if (strcmp(arg[iarg],"respa") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); @@ -214,15 +227,22 @@ void Fix::ev_setup(int eflag, int vflag) } /* ---------------------------------------------------------------------- - setup for virial computation - see integrate::ev_set() for values of vflag (0-6) - fixes call this if use v_tally() + if thermo_virial is on: + setup for virial computation + see integrate::ev_set() for values of vflag (0-6) + fixes call this if use v_tally() + else: set evflag=0 ------------------------------------------------------------------------- */ void Fix::v_setup(int vflag) { int i,n; + if (!thermo_virial) { + evflag = 0; + return; + } + evflag = 1; vflag_global = vflag % 4; @@ -316,3 +336,56 @@ void Fix::v_tally(int n, int *list, double total, double *v) } } } + +/* ---------------------------------------------------------------------- + tally virial into global and per-atom accumulators + i = local index of atom + v = total virial for the interaction + increment global virial by v + increment per-atom virial by v + this method can be used when fix computes forces in post_force() + and the force depends on a distance to some external object + e.g. fix wall/lj93: compute virial only on owned atoms +------------------------------------------------------------------------- */ + +void Fix::v_tally(int i, double *v) +{ + if (vflag_global) { + virial[0] += v[0]; + virial[1] += v[1]; + virial[2] += v[2]; + virial[3] += v[3]; + virial[4] += v[4]; + virial[5] += v[5]; + } + + if (vflag_atom) { + vatom[i][0] += v[0]; + vatom[i][1] += v[1]; + vatom[i][2] += v[2]; + vatom[i][3] += v[3]; + vatom[i][4] += v[4]; + vatom[i][5] += v[5]; + } +} + +/* ---------------------------------------------------------------------- + tally virial component into global and per-atom accumulators + n = index of virial component (0-5) + i = local index of atom + vn = nth component of virial for the interaction + increment nth component of global virial by vn + increment nth component of per-atom virial by vn + this method can be used when fix computes forces in post_force() + and the force depends on a distance to some external object + e.g. fix wall/lj93: compute virial only on owned atoms +------------------------------------------------------------------------- */ + +void Fix::v_tally(int n, int i, double vn) +{ + if (vflag_global) + virial[n] += vn; + + if (vflag_atom) + vatom[i][n] += vn; +} diff --git a/src/fix.h b/src/fix.h index d91937848a..21dfc955a8 100644 --- a/src/fix.h +++ b/src/fix.h @@ -36,6 +36,7 @@ class Fix : protected Pointers { bigint next_reneighbor; // next timestep to force a reneighboring int thermo_energy; // 1 if fix_modify enabled ThEng, 0 if not + int thermo_virial; // 1 if fix_modify enabled ThVir, 0 if not int nevery; // how often to call an end_of_step fix int rigid_flag; // 1 if Fix integrates rigid bodies, 0 if not int peatom_flag; // 1 if Fix contributes per-atom eng, 0 if not @@ -112,6 +113,7 @@ class Fix : protected Pointers { virtual void setup(int) {} virtual void setup_pre_exchange() {} virtual void setup_pre_neighbor() {} + virtual void setup_post_neighbor() {} virtual void setup_pre_force(int) {} virtual void setup_pre_reverse(int, int) {} virtual void min_setup(int) {} @@ -119,6 +121,7 @@ class Fix : protected Pointers { virtual void post_integrate() {} virtual void pre_exchange() {} virtual void pre_neighbor() {} + virtual void post_neighbor() {} virtual void pre_force(int) {} virtual void pre_reverse(int,int) {} virtual void post_force(int) {} @@ -154,6 +157,7 @@ class Fix : protected Pointers { virtual void min_pre_exchange() {} virtual void min_pre_neighbor() {} + virtual void min_post_neighbor() {} virtual void min_pre_force(int) {} virtual void min_pre_reverse(int,int) {} virtual void min_post_force(int) {} @@ -223,6 +227,8 @@ class Fix : protected Pointers { void ev_tally(int, int *, double, double, double *); void v_setup(int); void v_tally(int, int *, double, double *); + void v_tally(int, double *); + void v_tally(int, int, double); // union data struct for packing 32-bit and 64-bit ints into double bufs // see atom_vec.h for documentation @@ -241,25 +247,27 @@ namespace FixConst { static const int POST_INTEGRATE = 1<<1; static const int PRE_EXCHANGE = 1<<2; static const int PRE_NEIGHBOR = 1<<3; - static const int PRE_FORCE = 1<<4; - static const int PRE_REVERSE = 1<<5; - static const int POST_FORCE = 1<<6; - static const int FINAL_INTEGRATE = 1<<7; - static const int END_OF_STEP = 1<<8; - static const int POST_RUN = 1<<9; - static const int THERMO_ENERGY = 1<<10; - static const int INITIAL_INTEGRATE_RESPA = 1<<11; - static const int POST_INTEGRATE_RESPA = 1<<12; - static const int PRE_FORCE_RESPA = 1<<13; - static const int POST_FORCE_RESPA = 1<<14; - static const int FINAL_INTEGRATE_RESPA = 1<<15; - static const int MIN_PRE_EXCHANGE = 1<<16; - static const int MIN_PRE_NEIGHBOR = 1<<17; - static const int MIN_PRE_FORCE = 1<<18; - static const int MIN_PRE_REVERSE = 1<<19; - static const int MIN_POST_FORCE = 1<<20; - static const int MIN_ENERGY = 1<<21; - static const int FIX_CONST_LAST = 1<<22; + static const int POST_NEIGHBOR = 1<<4; + static const int PRE_FORCE = 1<<5; + static const int PRE_REVERSE = 1<<6; + static const int POST_FORCE = 1<<7; + static const int FINAL_INTEGRATE = 1<<8; + static const int END_OF_STEP = 1<<9; + static const int POST_RUN = 1<<10; + static const int THERMO_ENERGY = 1<<11; + static const int INITIAL_INTEGRATE_RESPA = 1<<12; + static const int POST_INTEGRATE_RESPA = 1<<13; + static const int PRE_FORCE_RESPA = 1<<14; + static const int POST_FORCE_RESPA = 1<<15; + static const int FINAL_INTEGRATE_RESPA = 1<<16; + static const int MIN_PRE_EXCHANGE = 1<<17; + static const int MIN_PRE_NEIGHBOR = 1<<18; + static const int MIN_POST_NEIGHBOR = 1<<19; + static const int MIN_PRE_FORCE = 1<<20; + static const int MIN_PRE_REVERSE = 1<<21; + static const int MIN_POST_FORCE = 1<<22; + static const int MIN_ENERGY = 1<<23; + static const int FIX_CONST_LAST = 1<<24; } } diff --git a/src/fix_addforce.cpp b/src/fix_addforce.cpp index 472d03f1f9..6b1e892279 100644 --- a/src/fix_addforce.cpp +++ b/src/fix_addforce.cpp @@ -16,7 +16,6 @@ #include "fix_addforce.h" #include "atom.h" #include "atom_masks.h" -#include "accelerator_kokkos.h" #include "update.h" #include "modify.h" #include "domain.h" @@ -51,6 +50,7 @@ FixAddForce::FixAddForce(LAMMPS *lmp, int narg, char **arg) : extvector = 1; respa_level_support = 1; ilevel_respa = 0; + virial_flag = 1; xstr = ystr = zstr = NULL; @@ -237,10 +237,16 @@ void FixAddForce::post_force(int vflag) double **f = atom->f; int *mask = atom->mask; imageint *image = atom->image; + double v[6]; int nlocal = atom->nlocal; if (update->ntimestep % nevery) return; + // energy and virial setup + + if (vflag) v_setup(vflag); + else evflag = 0; + if (lmp->kokkos) atom->sync_modify(Host, (unsigned int) (F_MASK | MASK_MASK), (unsigned int) F_MASK); @@ -283,6 +289,15 @@ void FixAddForce::post_force(int vflag) f[i][0] += xvalue; f[i][1] += yvalue; f[i][2] += zvalue; + if (evflag) { + v[0] = xvalue * unwrap[0]; + v[1] = yvalue * unwrap[1]; + v[2] = zvalue * unwrap[2]; + v[3] = xvalue * unwrap[1]; + v[4] = xvalue * unwrap[2]; + v[5] = yvalue * unwrap[2]; + v_tally(i,v); + } } // variable force, wrap with clear/add @@ -290,6 +305,7 @@ void FixAddForce::post_force(int vflag) // wrap with clear/add } else { + double unwrap[3]; modify->clearstep_compute(); @@ -307,20 +323,39 @@ void FixAddForce::post_force(int vflag) modify->addstep_compute(update->ntimestep + 1); - for (int i = 0; i < nlocal; i++) + for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue; - if (estyle == ATOM) foriginal[0] += sforce[i][3]; + domain->unmap(x[i],image[i],unwrap); + if (xstyle == ATOM) xvalue = sforce[i][0]; + if (ystyle == ATOM) yvalue = sforce[i][1]; + if (zstyle == ATOM) zvalue = sforce[i][2]; + + if (estyle == ATOM) { + foriginal[0] += sforce[i][3]; + } else { + if (xstyle) foriginal[0] -= xvalue*unwrap[0]; + if (ystyle) foriginal[0] -= yvalue*unwrap[1]; + if (zstyle) foriginal[0] -= zvalue*unwrap[2]; + } foriginal[1] += f[i][0]; foriginal[2] += f[i][1]; foriginal[3] += f[i][2]; - if (xstyle == ATOM) f[i][0] += sforce[i][0]; - else if (xstyle) f[i][0] += xvalue; - if (ystyle == ATOM) f[i][1] += sforce[i][1]; - else if (ystyle) f[i][1] += yvalue; - if (zstyle == ATOM) f[i][2] += sforce[i][2]; - else if (zstyle) f[i][2] += zvalue; + + if (xstyle) f[i][0] += xvalue; + if (ystyle) f[i][1] += yvalue; + if (zstyle) f[i][2] += zvalue; + if (evflag) { + v[0] = xstyle ? xvalue*unwrap[0] : 0.0; + v[1] = ystyle ? yvalue*unwrap[1] : 0.0; + v[2] = zstyle ? zvalue*unwrap[2] : 0.0; + v[3] = xstyle ? xvalue*unwrap[1] : 0.0; + v[4] = xstyle ? xvalue*unwrap[2] : 0.0; + v[5] = ystyle ? yvalue*unwrap[2] : 0.0; + v_tally(i, v); + } } + } } } diff --git a/src/fix_ave_chunk.cpp b/src/fix_ave_chunk.cpp index 1060acd7bb..73df50c66c 100644 --- a/src/fix_ave_chunk.cpp +++ b/src/fix_ave_chunk.cpp @@ -63,6 +63,7 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) : strcpy(idchunk,arg[6]); global_freq = nfreq; + peratom_freq = nfreq; no_change_box = 1; // expand args if any have wildcard character "*" diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 85523b912c..a3b697bb2b 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -37,6 +37,7 @@ FixExternal::FixExternal(LAMMPS *lmp, int narg, char **arg) : scalar_flag = 1; global_freq = 1; virial_flag = 1; + thermo_virial = 1; extscalar = 1; if (strcmp(arg[3],"pf/callback") == 0) { @@ -196,6 +197,7 @@ void FixExternal::set_energy_global(double caller_energy) void FixExternal::set_virial_global(double *caller_virial) { + if (!evflag) return; if (!vflag_global) return; for (int i = 0; i < 6; i++) @@ -223,6 +225,7 @@ void FixExternal::set_virial_peratom(double **caller_virial) { int i,j; + if (!evflag) return; if (!vflag_atom) return; int nlocal = atom->nlocal; diff --git a/src/fix_group.cpp b/src/fix_group.cpp index fe2495d6c0..51abebdf29 100644 --- a/src/fix_group.cpp +++ b/src/fix_group.cpp @@ -33,7 +33,7 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixGroup::FixGroup(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), -idregion(NULL), idvar(NULL) +idregion(NULL), idvar(NULL), idprop(NULL) { // dgroupbit = bitmask of dynamic group // group ID is last part of fix ID @@ -49,6 +49,7 @@ idregion(NULL), idvar(NULL) regionflag = 0; varflag = 0; + propflag = 0; nevery = 1; int iarg = 3; @@ -73,7 +74,17 @@ idregion(NULL), idvar(NULL) idvar = new char[n]; strcpy(idvar,arg[iarg+1]); iarg += 2; - } else if (strcmp(arg[iarg],"every") == 0) { + } else if (strcmp(arg[iarg],"property") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); + if (atom->find_custom(arg[iarg+1],typeflag) < 0) + error->all(FLERR,"Per atom property for group dynamic does not exist"); + propflag = 1; + delete [] idprop; + int n = strlen(arg[iarg+1]) + 1; + idprop = new char[n]; + strcpy(idprop,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"every") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); nevery = force->inumeric(FLERR,arg[iarg+1]); if (nevery <= 0) error->all(FLERR,"Illegal group command"); @@ -88,6 +99,7 @@ FixGroup::~FixGroup() { delete [] idregion; delete [] idvar; + delete [] idprop; } /* ---------------------------------------------------------------------- */ @@ -130,6 +142,12 @@ void FixGroup::init() error->all(FLERR,"Variable for group dynamic is invalid style"); } + if (propflag) { + iprop = atom->find_custom(idprop,typeflag); + if (iprop < 0) + error->all(FLERR,"Per-atom property for group dynamic does not exist"); + } + // warn if any FixGroup is not at tail end of all post_integrate fixes Fix **fix = modify->fix; @@ -188,6 +206,9 @@ void FixGroup::set_group() // invoke atom-style variable if defined double *var = NULL; + int *ivector = NULL; + double *dvector = NULL; + if (varflag) { modify->clearstep_compute(); @@ -196,6 +217,12 @@ void FixGroup::set_group() modify->addstep_compute(update->ntimestep + nevery); } + // invoke per-atom property if defined + + if (propflag && !typeflag) ivector = atom->ivector[iprop]; //check nlocal > 0? + + if (propflag && typeflag) dvector = atom->dvector[iprop]; //check nlocal > 0? + // update region in case it has a variable dependence or is dynamic if (regionflag) region->prematch(); @@ -214,6 +241,8 @@ void FixGroup::set_group() inflag = 1; if (regionflag && !region->match(x[i][0],x[i][1],x[i][2])) inflag = 0; if (varflag && var[i] == 0.0) inflag = 0; + if (propflag && !typeflag && ivector[i] == 0) inflag = 0; + if (propflag && typeflag && dvector[i] == 0) inflag = 0; } else inflag = 0; if (inflag) mask[i] |= gbit; diff --git a/src/fix_group.h b/src/fix_group.h index 6ed842578d..662325492b 100644 --- a/src/fix_group.h +++ b/src/fix_group.h @@ -36,9 +36,9 @@ class FixGroup : public Fix { private: int gbit,gbitinverse; - int regionflag,varflag; - int iregion,ivar; - char *idregion,*idvar; + int regionflag,varflag,propflag,typeflag; + int iregion,ivar,iprop; + char *idregion,*idvar,*idprop; class Region *region; int nlevels_respa; diff --git a/src/fix_heat.cpp b/src/fix_heat.cpp index 97e0ed6a7f..846531dbb9 100644 --- a/src/fix_heat.cpp +++ b/src/fix_heat.cpp @@ -127,7 +127,7 @@ void FixHeat::init() } // check for rigid bodies in region (done here for performance reasons) - if (modify->check_rigid_region_overlap(groupbit,domain->regions[iregion])) + if (iregion >= 0 && modify->check_rigid_region_overlap(groupbit,domain->regions[iregion])) error->warning(FLERR,"Cannot apply fix heat to atoms in rigid bodies"); // cannot have 0 atoms in group diff --git a/src/fix_shear_history.cpp b/src/fix_neigh_history.cpp similarity index 55% rename from src/fix_shear_history.cpp rename to src/fix_neigh_history.cpp index 17e78830f4..e8bfe840d8 100644 --- a/src/fix_shear_history.cpp +++ b/src/fix_neigh_history.cpp @@ -14,7 +14,7 @@ #include #include #include -#include "fix_shear_history.h" +#include "fix_neigh_history.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -29,16 +29,16 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum{DEFAULT,NPARTNER,PERPARTNER}; +enum{DEFAULT,NPARTNER,PERPARTNER}; // also set in fix neigh/history/omp /* ---------------------------------------------------------------------- */ -FixShearHistory::FixShearHistory(LAMMPS *lmp, int narg, char **arg) : +FixNeighHistory::FixNeighHistory(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - npartner(NULL), partner(NULL), shearpartner(NULL), pair(NULL), - ipage(NULL), dpage(NULL) + npartner(NULL), partner(NULL), valuepartner(NULL), pair(NULL), + ipage_atom(NULL), dpage_atom(NULL), ipage_neigh(NULL), dpage_neigh(NULL) { - if (narg != 4) error->all(FLERR,"Illegal fix SHEAR_HISTORY command"); + if (narg != 4) error->all(FLERR,"Illegal fix NEIGH_HISTORY command"); restart_peratom = 1; create_attribute = 1; @@ -48,9 +48,12 @@ FixShearHistory::FixShearHistory(LAMMPS *lmp, int narg, char **arg) : dnum = force->inumeric(FLERR,arg[3]); dnumbytes = dnum * sizeof(double); + zeroes = new double[dnum]; + for (int i = 0; i < dnum; i++) zeroes[i] = 0.0; + onesided = 0; - if (strcmp(id,"LINE_SHEAR_HISTORY") == 0) onesided = 1; - if (strcmp(id,"TRI_SHEAR_HISTORY") == 0) onesided = 1; + if (strcmp(id,"LINE_NEIGH_HISTORY") == 0) onesided = 1; + if (strcmp(id,"TRI_NEIGH_HISTORY") == 0) onesided = 1; if (newton_pair) comm_reverse = 1; // just for single npartner value // variable-size history communicated via @@ -65,11 +68,24 @@ FixShearHistory::FixShearHistory(LAMMPS *lmp, int narg, char **arg) : pgsize = oneatom = 0; + // other per-atom vectors + + firstflag = NULL; + firstvalue = NULL; + maxatom = 0; + + // per-atom and per-neighbor data structs + + ipage_atom = NULL; + dpage_atom = NULL; + ipage_neigh = NULL; + dpage_neigh = NULL; + // initialize npartner to 0 so neighbor list creation is OK the 1st time int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) npartner[i] = 0; - maxtouch = 0; + maxpartner = 0; nlocal_neigh = nall_neigh = 0; commflag = DEFAULT; @@ -77,7 +93,7 @@ FixShearHistory::FixShearHistory(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixShearHistory::~FixShearHistory() +FixNeighHistory::~FixNeighHistory() { // unregister this fix so atom class doesn't invoke it any more @@ -86,86 +102,111 @@ FixShearHistory::~FixShearHistory() // delete locally stored arrays + delete [] zeroes; + + memory->sfree(firstflag); + memory->sfree(firstvalue); + memory->destroy(npartner); memory->sfree(partner); - memory->sfree(shearpartner); + memory->sfree(valuepartner); + + delete [] ipage_atom; + delete [] dpage_atom; + delete [] ipage_neigh; + delete [] dpage_neigh; // to better detect use-after-delete errors + firstflag = NULL; + firstvalue = NULL; + pair = NULL; npartner = NULL; partner = NULL; - shearpartner = NULL; - - delete [] ipage; - delete [] dpage; + valuepartner = NULL; } /* ---------------------------------------------------------------------- */ -int FixShearHistory::setmask() +int FixNeighHistory::setmask() { int mask = 0; mask |= PRE_EXCHANGE; mask |= MIN_PRE_EXCHANGE; + mask |= POST_NEIGHBOR; + mask |= MIN_POST_NEIGHBOR; return mask; } /* ---------------------------------------------------------------------- */ -void FixShearHistory::init() +void FixNeighHistory::init() { if (atom->tag_enable == 0) - error->all(FLERR,"Granular shear history requires atoms have IDs"); + error->all(FLERR,"Neighbor history requires atoms have IDs"); allocate_pages(); } /* ---------------------------------------------------------------------- create pages if first time or if neighbor pgsize/oneatom has changed - note that latter could cause shear history info to be discarded + note that latter could cause neighbor history info to be discarded ------------------------------------------------------------------------- */ -void FixShearHistory::allocate_pages() +void FixNeighHistory::allocate_pages() { int create = 0; - if (ipage == NULL) create = 1; + if (ipage_atom == NULL) create = 1; if (pgsize != neighbor->pgsize) create = 1; if (oneatom != neighbor->oneatom) create = 1; if (create) { - delete [] ipage; - delete [] dpage; + delete [] ipage_atom; + delete [] dpage_atom; + delete [] ipage_neigh; + delete [] dpage_neigh; pgsize = neighbor->pgsize; oneatom = neighbor->oneatom; int nmypage = comm->nthreads; - ipage = new MyPage[nmypage]; - dpage = new MyPage[nmypage]; + ipage_atom = new MyPage[nmypage]; + dpage_atom = new MyPage[nmypage]; + ipage_neigh = new MyPage[nmypage]; + dpage_neigh = new MyPage[nmypage]; for (int i = 0; i < nmypage; i++) { - ipage[i].init(oneatom,pgsize); - dpage[i].init(dnum*oneatom,dnum*pgsize); + ipage_atom[i].init(oneatom,pgsize); + dpage_atom[i].init(dnum*oneatom,dnum*pgsize); + ipage_neigh[i].init(oneatom,pgsize); + dpage_neigh[i].init(dnum*oneatom,dnum*pgsize); } } } +/* ---------------------------------------------------------------------- */ + +void FixNeighHistory::setup_post_neighbor() +{ + post_neighbor(); +} + /* ---------------------------------------------------------------------- - copy shear partner info from neighbor lists to atom arrays - should be called whenever neighbor list stores current history info - and need to store the info with owned atoms - e.g. so atoms can migrate to new procs or between runs - when atoms may be added or deleted (neighbor list becomes out-of-date) - the next granular neigh list build will put this info back into neigh list + copy partner info from neighbor data structs (NDS) to atom arrays + should be called whenever NDS store current history info + and need to transfer the info to owned atoms + e.g. when atoms migrate to new procs, new neigh list built, or between runs + when atoms may be added or deleted (NDS becomes out-of-date) + the next post_neighbor() will put this info back into new NDS called during run before atom exchanges, including for restart files called at end of run via post_run() do not call during setup of run (setup_pre_exchange) - b/c there is no guarantee of a current neigh list (even on continued run) + b/c there is no guarantee of a current NDS (even on continued run) if run command does a 2nd run with pre = no, then no neigh list will be built, but old neigh list will still have the info onesided and newton on and newton off versions ------------------------------------------------------------------------- */ -void FixShearHistory::pre_exchange() +void FixNeighHistory::pre_exchange() { if (onesided) pre_exchange_onesided(); else if (newton_pair) pre_exchange_newton(); @@ -178,60 +219,57 @@ void FixShearHistory::pre_exchange() only store history info with spheres ------------------------------------------------------------------------- */ -void FixShearHistory::pre_exchange_onesided() +void FixNeighHistory::pre_exchange_onesided() { int i,j,ii,jj,m,n,inum,jnum; int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*allshear,**firstshear; + int *allflags; + double *allvalues,*onevalues; // NOTE: all operations until very end are with nlocal_neigh <= current nlocal // b/c previous neigh list was built with nlocal_neigh // nlocal can be larger if other fixes added atoms at this pre_exchange() - // zero npartner for owned atoms - // clear 2 page data structures + // clear two paged data structures - for (i = 0; i < nlocal_neigh; i++) npartner[i] = 0; - - ipage->reset(); - dpage->reset(); + ipage_atom->reset(); + dpage_atom->reset(); // 1st loop over neighbor list, I = sphere, J = tri // only calculate npartner for owned spheres + for (i = 0; i < nlocal_neigh; i++) npartner[i] = 0; + tagint *tag = atom->tag; NeighList *list = pair->list; inum = list->inum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jlist = firstneigh[i]; jnum = numneigh[i]; - touch = firsttouch[i]; + allflags = firstflag[i]; for (jj = 0; jj < jnum; jj++) - if (touch[jj]) npartner[i]++; + if (allflags[jj]) npartner[i]++; } - // get page chunks to store atom IDs and shear history for owned atoms + // get page chunks to store partner IDs and values for owned atoms for (ii = 0; ii < inum; ii++) { i = ilist[ii]; n = npartner[i]; - partner[i] = ipage->get(n); - shearpartner[i] = dpage->get(dnum*n); - if (partner[i] == NULL || shearpartner[i] == NULL) - error->one(FLERR,"Shear history overflow, boost neigh_modify one"); + partner[i] = ipage_atom->get(n); + valuepartner[i] = dpage_atom->get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); } // 2nd loop over neighbor list, I = sphere, J = tri - // store atom IDs and shear history for owned spheres + // store partner IDs and values for owned+ghost atoms // re-zero npartner to use as counter for (i = 0; i < nlocal_neigh; i++) npartner[i] = 0; @@ -239,28 +277,28 @@ void FixShearHistory::pre_exchange_onesided() for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jlist = firstneigh[i]; - allshear = firstshear[i]; jnum = numneigh[i]; - touch = firsttouch[i]; + allflags = firstflag[i]; + allvalues = firstvalue[i]; for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { - shear = &allshear[dnum*jj]; + if (allflags[jj]) { + onevalues = &allvalues[dnum*jj]; j = jlist[jj]; j &= NEIGHMASK; m = npartner[i]++; partner[i][m] = tag[j]; - memcpy(&shearpartner[i][dnum*m],shear,dnumbytes); + memcpy(&valuepartner[i][dnum*m],onevalues,dnumbytes); } } } - // set maxtouch = max # of partners of any owned atom + // set maxpartner = max # of partners of any owned atom // bump up comm->maxexchange_fix if necessary - - maxtouch = 0; - for (i = 0; i < nlocal_neigh; i++) maxtouch = MAX(maxtouch,npartner[i]); - comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxtouch+1); + + maxpartner = 0; + for (i = 0; i < nlocal_neigh; i++) maxpartner = MAX(maxpartner,npartner[i]); + comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1); // zero npartner values from previous nlocal_neigh to current nlocal @@ -269,50 +307,47 @@ void FixShearHistory::pre_exchange_onesided() } /* ---------------------------------------------------------------------- - newton on version, for sphere/sphere contacts - performs reverse comm to acquire shear partner info from ghost atoms + newton ON version + performs reverse comm to acquire partner values from ghost atoms ------------------------------------------------------------------------- */ -void FixShearHistory::pre_exchange_newton() +void FixNeighHistory::pre_exchange_newton() { int i,j,ii,jj,m,n,inum,jnum; int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*shearj,*allshear,**firstshear; + int *allflags; + double *allvalues,*onevalues,*jvalues; - // NOTE: all operations until very end are with + // NOTE: all operations until very end are with // nlocal_neigh <= current nlocal and nall_neigh - // b/c previous neigh list was built with nlocal_neigh,nghost_neigh + // b/c previous neigh list was built with nlocal_neigh & nghost_neigh // nlocal can be larger if other fixes added atoms at this pre_exchange() - // zero npartner for owned+ghost atoms - // clear 2 page data structures + // clear two paged data structures - for (i = 0; i < nall_neigh; i++) npartner[i] = 0; - - ipage->reset(); - dpage->reset(); + ipage_atom->reset(); + dpage_atom->reset(); // 1st loop over neighbor list // calculate npartner for owned+ghost atoms + for (i = 0; i < nall_neigh; i++) npartner[i] = 0; + tagint *tag = atom->tag; NeighList *list = pair->list; inum = list->inum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jlist = firstneigh[i]; jnum = numneigh[i]; - touch = firsttouch[i]; + allflags = firstflag[i]; for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { + if (allflags[jj]) { npartner[i]++; j = jlist[jj]; j &= NEIGHMASK; @@ -326,29 +361,29 @@ void FixShearHistory::pre_exchange_newton() commflag = NPARTNER; comm->reverse_comm_fix(this,0); - // get page chunks to store atom IDs and shear history for owned+ghost atoms + // get page chunks to store partner IDs and values for owned+ghost atoms for (ii = 0; ii < inum; ii++) { i = ilist[ii]; n = npartner[i]; - partner[i] = ipage->get(n); - shearpartner[i] = dpage->get(dnum*n); - if (partner[i] == NULL || shearpartner[i] == NULL) { - error->one(FLERR,"Shear history overflow, boost neigh_modify one"); + partner[i] = ipage_atom->get(n); + valuepartner[i] = dpage_atom->get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) { + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); } } for (i = nlocal_neigh; i < nall_neigh; i++) { n = npartner[i]; - partner[i] = ipage->get(n); - shearpartner[i] = dpage->get(dnum*n); - if (partner[i] == NULL || shearpartner[i] == NULL) { - error->one(FLERR,"Shear history overflow, boost neigh_modify one"); + partner[i] = ipage_atom->get(n); + valuepartner[i] = dpage_atom->get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) { + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); } } // 2nd loop over neighbor list - // store atom IDs and shear history for owned+ghost atoms + // store partner IDs and values for owned+ghost atoms // re-zero npartner to use as counter for (i = 0; i < nall_neigh; i++) npartner[i] = 0; @@ -356,40 +391,40 @@ void FixShearHistory::pre_exchange_newton() for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jlist = firstneigh[i]; - allshear = firstshear[i]; jnum = numneigh[i]; - touch = firsttouch[i]; + allflags = firstflag[i]; + allvalues = firstvalue[i]; for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { - shear = &allshear[dnum*jj]; + if (allflags[jj]) { + onevalues = &allvalues[dnum*jj]; j = jlist[jj]; j &= NEIGHMASK; m = npartner[i]++; partner[i][m] = tag[j]; - memcpy(&shearpartner[i][dnum*m],shear,dnumbytes); + memcpy(&valuepartner[i][dnum*m],onevalues,dnumbytes); m = npartner[j]++; partner[j][m] = tag[i]; - shearj = &shearpartner[j][dnum*m]; - for (n = 0; n < dnum; n++) shearj[n] = -shear[n]; + jvalues = &valuepartner[j][dnum*m]; + for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } } // perform reverse comm to augment - // owned atom partner/shearpartner with ghost info + // owned atom partner/valuepartner with ghost info // use variable variant b/c size of packed data can be arbitrarily large // if many touching neighbors for large particle commflag = PERPARTNER; comm->reverse_comm_fix_variable(this); - // set maxtouch = max # of partners of any owned atom + // set maxpartner = max # of partners of any owned atom // bump up comm->maxexchange_fix if necessary - maxtouch = 0; - for (i = 0; i < nlocal_neigh; i++) maxtouch = MAX(maxtouch,npartner[i]); - comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxtouch+1); + maxpartner = 0; + for (i = 0; i < nlocal_neigh; i++) maxpartner = MAX(maxpartner,npartner[i]); + comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1); // zero npartner values from previous nlocal_neigh to current nlocal @@ -398,49 +433,47 @@ void FixShearHistory::pre_exchange_newton() } /* ---------------------------------------------------------------------- - newton off version, for sphere/sphere contacts - newton OFF works with smaller vectors that don't include ghost info + newton OFF version + do not need partner values from ghost atoms + assume J values are negative of I values ------------------------------------------------------------------------- */ -void FixShearHistory::pre_exchange_no_newton() +void FixNeighHistory::pre_exchange_no_newton() { int i,j,ii,jj,m,n,inum,jnum; int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*shearj,*allshear,**firstshear; + int *allflags; + double *allvalues,*onevalues,*jvalues; // NOTE: all operations until very end are with nlocal_neigh <= current nlocal // b/c previous neigh list was built with nlocal_neigh // nlocal can be larger if other fixes added atoms at this pre_exchange() - // zero npartner for owned atoms - // clear 2 page data structures + // clear two paged data structures - for (i = 0; i < nlocal_neigh; i++) npartner[i] = 0; - - ipage->reset(); - dpage->reset(); + ipage_atom->reset(); + dpage_atom->reset(); // 1st loop over neighbor list // calculate npartner for owned atoms + for (i = 0; i < nlocal_neigh; i++) npartner[i] = 0; + tagint *tag = atom->tag; NeighList *list = pair->list; inum = list->inum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; - firsttouch = list->listhistory->firstneigh; - firstshear = list->listhistory->firstdouble; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jlist = firstneigh[i]; jnum = numneigh[i]; - touch = firsttouch[i]; + allflags = firstflag[i]; for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { + if (allflags[jj]) { npartner[i]++; j = jlist[jj]; j &= NEIGHMASK; @@ -449,19 +482,19 @@ void FixShearHistory::pre_exchange_no_newton() } } - // get page chunks to store atom IDs and shear history for owned atoms + // get page chunks to store partner IDs and values for owned atoms for (ii = 0; ii < inum; ii++) { i = ilist[ii]; n = npartner[i]; - partner[i] = ipage->get(n); - shearpartner[i] = dpage->get(dnum*n); - if (partner[i] == NULL || shearpartner[i] == NULL) - error->one(FLERR,"Shear history overflow, boost neigh_modify one"); + partner[i] = ipage_atom->get(n); + valuepartner[i] = dpage_atom->get(dnum*n); + if (partner[i] == NULL || valuepartner[i] == NULL) + error->one(FLERR,"Neighbor history overflow, boost neigh_modify one"); } // 2nd loop over neighbor list - // store atom IDs and shear history for owned atoms + // store partner IDs and values for owned+ghost atoms // re-zero npartner to use as counter for (i = 0; i < nlocal_neigh; i++) npartner[i] = 0; @@ -469,34 +502,34 @@ void FixShearHistory::pre_exchange_no_newton() for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jlist = firstneigh[i]; - allshear = firstshear[i]; jnum = numneigh[i]; - touch = firsttouch[i]; + allflags = firstflag[i]; + allvalues = firstvalue[i]; for (jj = 0; jj < jnum; jj++) { - if (touch[jj]) { - shear = &allshear[dnum*jj]; + if (allflags[jj]) { + onevalues = &allvalues[dnum*jj]; j = jlist[jj]; j &= NEIGHMASK; m = npartner[i]++; partner[i][m] = tag[j]; - memcpy(&shearpartner[i][dnum*m],shear,dnumbytes); + memcpy(&valuepartner[i][dnum*m],onevalues,dnumbytes); if (j < nlocal_neigh) { m = npartner[j]++; partner[j][m] = tag[i]; - shearj = &shearpartner[j][dnum*m]; - for (n = 0; n < dnum; n++) shearj[n] = -shear[n]; + jvalues = &valuepartner[j][dnum*m]; + for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } } } - // set maxtouch = max # of partners of any owned atom + // set maxpartner = max # of partners of any owned atom // bump up comm->maxexchange_fix if necessary - - maxtouch = 0; - for (i = 0; i < nlocal_neigh; i++) maxtouch = MAX(maxtouch,npartner[i]); - comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxtouch+1); + + maxpartner = 0; + for (i = 0; i < nlocal_neigh; i++) maxpartner = MAX(maxpartner,npartner[i]); + comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1); // zero npartner values from previous nlocal_neigh to current nlocal @@ -506,14 +539,107 @@ void FixShearHistory::pre_exchange_no_newton() /* ---------------------------------------------------------------------- */ -void FixShearHistory::min_pre_exchange() +void FixNeighHistory::min_pre_exchange() { pre_exchange(); } +/* ---------------------------------------------------------------------- + called after neighbor list is build + recover history info stored temporarily in per-atom partner lists + and store afresh in per-neighbor firstflag and firstvalue lists +------------------------------------------------------------------------- */ + +void FixNeighHistory::post_neighbor() +{ + int i,j,m,ii,jj,nn,np,inum,jnum,rflag; + tagint jtag; + int *ilist,*jlist,*numneigh,**firstneigh; + int *allflags; + double *allvalues; + + // store atom counts used for new neighbor list which was just built + + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; + nlocal_neigh = nlocal; + nall_neigh = nall; + + // realloc firstflag and firstvalue if needed + + if (maxatom < nlocal) { + memory->sfree(firstflag); + memory->sfree(firstvalue); + maxatom = nall; + firstflag = (int **) + memory->smalloc(maxatom*sizeof(int *),"neighbor_history:firstflag"); + firstvalue = (double **) + memory->smalloc(maxatom*sizeof(double *),"neighbor_history:firstvalue"); + } + + // loop over newly built neighbor list + // repopulate entire per-neighbor data structs + // whether with old-neigh partner info or zeroes + + ipage_neigh->reset(); + dpage_neigh->reset(); + + tagint *tag = atom->tag; + NeighList *list = pair->list; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + firstflag[i] = allflags = ipage_neigh->get(jnum); + firstvalue[i] = allvalues = dpage_neigh->get(jnum*dnum); + np = npartner[i]; + nn = 0; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + rflag = sbmask(j); + j &= NEIGHMASK; + jlist[jj] = j; + + // rflag = 1 if r < radsum in npair_size() method + // preserve neigh history info if tag[j] is in old-neigh partner list + // this test could be more geometrically precise for two sphere/line/tri + + if (rflag) { + jtag = tag[j]; + for (m = 0; m < np; m++) + if (partner[i][m] == jtag) break; + if (m < np) { + allflags[jj] = 1; + memcpy(&allvalues[nn],&valuepartner[i][dnum*m],dnumbytes); + } else { + allflags[jj] = 0; + memcpy(&allvalues[nn],zeroes,dnumbytes); + } + } else { + allflags[jj] = 0; + memcpy(&allvalues[nn],zeroes,dnumbytes); + } + nn += dnum; + } + } +} + /* ---------------------------------------------------------------------- */ -void FixShearHistory::post_run() +void FixNeighHistory::min_post_neighbor() +{ + post_neighbor(); +} + +/* ---------------------------------------------------------------------- */ + +void FixNeighHistory::post_run() { pre_exchange(); } @@ -522,17 +648,21 @@ void FixShearHistory::post_run() memory usage of local atom-based arrays ------------------------------------------------------------------------- */ -double FixShearHistory::memory_usage() +double FixNeighHistory::memory_usage() { int nmax = atom->nmax; - double bytes = nmax * sizeof(int); - bytes += nmax * sizeof(tagint *); - bytes += nmax * sizeof(double *); + double bytes = nmax * sizeof(int); // npartner + bytes += nmax * sizeof(tagint *); // partner + bytes += nmax * sizeof(double *); // valuepartner + bytes += maxatom * sizeof(int *); // firstflag + bytes += maxatom * sizeof(double *); // firstvalue int nmypage = comm->nthreads; for (int i = 0; i < nmypage; i++) { - bytes += ipage[i].size(); - bytes += dpage[i].size(); + bytes += ipage_atom[i].size(); + bytes += dpage_atom[i].size(); + bytes += ipage_neigh[i].size(); + bytes += dpage_neigh[i].size(); } return bytes; @@ -542,38 +672,38 @@ double FixShearHistory::memory_usage() allocate local atom-based arrays ------------------------------------------------------------------------- */ -void FixShearHistory::grow_arrays(int nmax) +void FixNeighHistory::grow_arrays(int nmax) { - memory->grow(npartner,nmax,"shear_history:npartner"); + memory->grow(npartner,nmax,"neighbor_history:npartner"); partner = (tagint **) memory->srealloc(partner,nmax*sizeof(tagint *), - "shear_history:partner"); - shearpartner = (double **) memory->srealloc(shearpartner, + "neighbor_history:partner"); + valuepartner = (double **) memory->srealloc(valuepartner, nmax*sizeof(double *), - "shear_history:shearpartner"); + "neighbor_history:valuepartner"); } /* ---------------------------------------------------------------------- copy values within local atom-based arrays ------------------------------------------------------------------------- */ -void FixShearHistory::copy_arrays(int i, int j, int delflag) +void FixNeighHistory::copy_arrays(int i, int j, int delflag) { - // just copy pointers for partner and shearpartner - // b/c can't overwrite chunk allocation inside ipage,dpage + // just copy pointers for partner and valuepartner + // b/c can't overwrite chunk allocation inside ipage_atom,dpage_atom // incoming atoms in unpack_exchange just grab new chunks // so are orphaning chunks for migrating atoms - // OK, b/c will reset ipage,dpage on next reneighboring + // OK, b/c will reset ipage_atom,dpage_atom on next reneighboring npartner[j] = npartner[i]; partner[j] = partner[i]; - shearpartner[j] = shearpartner[i]; + valuepartner[j] = valuepartner[i]; } /* ---------------------------------------------------------------------- initialize one atom's array values, called when atom is created ------------------------------------------------------------------------- */ -void FixShearHistory::set_arrays(int i) +void FixNeighHistory::set_arrays(int i) { npartner[i] = 0; } @@ -582,15 +712,16 @@ void FixShearHistory::set_arrays(int i) only called by Comm::reverse_comm_fix_variable for PERPARTNER mode ------------------------------------------------------------------------- */ -int FixShearHistory::pack_reverse_comm_size(int n, int first) +int FixNeighHistory::pack_reverse_comm_size(int n, int first) { int i,last; + int dnump1 = dnum + 1; int m = 0; last = first + n; for (i = first; i < last; i++) - m += 1 + (dnum+1)*npartner[i]; + m += 1 + dnump1*npartner[i]; return m; } @@ -599,7 +730,7 @@ int FixShearHistory::pack_reverse_comm_size(int n, int first) two modes: NPARTNER and PERPARTNER ------------------------------------------------------------------------- */ -int FixShearHistory::pack_reverse_comm(int n, int first, double *buf) +int FixNeighHistory::pack_reverse_comm(int n, int first, double *buf) { int i,k,last; @@ -615,11 +746,11 @@ int FixShearHistory::pack_reverse_comm(int n, int first, double *buf) buf[m++] = npartner[i]; for (k = 0; k < npartner[i]; k++) { buf[m++] = partner[i][k]; - memcpy(&buf[m],&shearpartner[i][dnum*k],dnumbytes); + memcpy(&buf[m],&valuepartner[i][dnum*k],dnumbytes); m += dnum; } } - } else error->all(FLERR,"Unsupported comm mode in shear history"); + } else error->all(FLERR,"Unsupported comm mode in neighbor history"); return m; } @@ -628,7 +759,7 @@ int FixShearHistory::pack_reverse_comm(int n, int first, double *buf) two modes: NPARTNER and PERPARTNER ------------------------------------------------------------------------- */ -void FixShearHistory::unpack_reverse_comm(int n, int *list, double *buf) +void FixNeighHistory::unpack_reverse_comm(int n, int *list, double *buf) { int i,j,k,kk,ncount; @@ -646,18 +777,18 @@ void FixShearHistory::unpack_reverse_comm(int n, int *list, double *buf) for (k = 0; k < ncount; k++) { kk = npartner[j]++; partner[j][kk] = static_cast (buf[m++]); - memcpy(&shearpartner[j][dnum*kk],&buf[m],dnumbytes); + memcpy(&valuepartner[j][dnum*kk],&buf[m],dnumbytes); m += dnum; } } - } else error->all(FLERR,"Unsupported comm mode in shear history"); + } else error->all(FLERR,"Unsupported comm mode in neighbor history"); } /* ---------------------------------------------------------------------- pack values in local atom-based arrays for exchange with another proc ------------------------------------------------------------------------- */ -int FixShearHistory::pack_exchange(int i, double *buf) +int FixNeighHistory::pack_exchange(int i, double *buf) { // NOTE: how do I know comm buf is big enough if extreme # of touching neighs // Comm::BUFEXTRA may need to be increased @@ -666,7 +797,7 @@ int FixShearHistory::pack_exchange(int i, double *buf) buf[m++] = npartner[i]; for (int n = 0; n < npartner[i]; n++) { buf[m++] = partner[i][n]; - memcpy(&buf[m],&shearpartner[i][dnum*n],dnumbytes); + memcpy(&buf[m],&valuepartner[i][dnum*n],dnumbytes); m += dnum; } return m; @@ -676,18 +807,18 @@ int FixShearHistory::pack_exchange(int i, double *buf) unpack values in local atom-based arrays from exchange with another proc ------------------------------------------------------------------------- */ -int FixShearHistory::unpack_exchange(int nlocal, double *buf) +int FixNeighHistory::unpack_exchange(int nlocal, double *buf) { - // allocate new chunks from ipage,dpage for incoming values + // allocate new chunks from ipage_atom,dpage_atom for incoming values int m = 0; npartner[nlocal] = static_cast (buf[m++]); - maxtouch = MAX(maxtouch,npartner[nlocal]); - partner[nlocal] = ipage->get(npartner[nlocal]); - shearpartner[nlocal] = dpage->get(dnum*npartner[nlocal]); + maxpartner = MAX(maxpartner,npartner[nlocal]); + partner[nlocal] = ipage_atom->get(npartner[nlocal]); + valuepartner[nlocal] = dpage_atom->get(dnum*npartner[nlocal]); for (int n = 0; n < npartner[nlocal]; n++) { partner[nlocal][n] = static_cast (buf[m++]); - memcpy(&shearpartner[nlocal][dnum*n],&buf[m],dnumbytes); + memcpy(&valuepartner[nlocal][dnum*n],&buf[m],dnumbytes); m += dnum; } return m; @@ -697,13 +828,13 @@ int FixShearHistory::unpack_exchange(int nlocal, double *buf) pack values in local atom-based arrays for restart file ------------------------------------------------------------------------- */ -int FixShearHistory::pack_restart(int i, double *buf) +int FixNeighHistory::pack_restart(int i, double *buf) { int m = 1; buf[m++] = npartner[i]; for (int n = 0; n < npartner[i]; n++) { buf[m++] = partner[i][n]; - memcpy(&buf[m],&shearpartner[i][dnum*n],dnumbytes); + memcpy(&buf[m],&valuepartner[i][dnum*n],dnumbytes); m += dnum; } buf[0] = m; @@ -714,11 +845,11 @@ int FixShearHistory::pack_restart(int i, double *buf) unpack values from atom->extra array to restart the fix ------------------------------------------------------------------------- */ -void FixShearHistory::unpack_restart(int nlocal, int nth) +void FixNeighHistory::unpack_restart(int nlocal, int nth) { - // ipage = NULL if being called from granular pair style init() + // ipage_atom = NULL if being called from granular pair style init() - if (ipage == NULL) allocate_pages(); + if (ipage_atom == NULL) allocate_pages(); // skip to Nth set of extra values @@ -728,15 +859,15 @@ void FixShearHistory::unpack_restart(int nlocal, int nth) for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); m++; - // allocate new chunks from ipage,dpage for incoming values + // allocate new chunks from ipage_atom,dpage_atom for incoming values npartner[nlocal] = static_cast (extra[nlocal][m++]); - maxtouch = MAX(maxtouch,npartner[nlocal]); - partner[nlocal] = ipage->get(npartner[nlocal]); - shearpartner[nlocal] = dpage->get(dnum*npartner[nlocal]); + maxpartner = MAX(maxpartner,npartner[nlocal]); + partner[nlocal] = ipage_atom->get(npartner[nlocal]); + valuepartner[nlocal] = dpage_atom->get(dnum*npartner[nlocal]); for (int n = 0; n < npartner[nlocal]; n++) { partner[nlocal][n] = static_cast (extra[nlocal][m++]); - memcpy(&shearpartner[nlocal][dnum*n],&extra[nlocal][m],dnumbytes); + memcpy(&valuepartner[nlocal][dnum*n],&extra[nlocal][m],dnumbytes); m += dnum; } } @@ -745,20 +876,20 @@ void FixShearHistory::unpack_restart(int nlocal, int nth) maxsize of any atom's restart data ------------------------------------------------------------------------- */ -int FixShearHistory::maxsize_restart() +int FixNeighHistory::maxsize_restart() { - // maxtouch_all = max # of touching partners across all procs + // maxpartner_all = max # of touching partners across all procs - int maxtouch_all; - MPI_Allreduce(&maxtouch,&maxtouch_all,1,MPI_INT,MPI_MAX,world); - return (dnum+1)*maxtouch_all + 2; + int maxpartner_all; + MPI_Allreduce(&maxpartner,&maxpartner_all,1,MPI_INT,MPI_MAX,world); + return (dnum+1)*maxpartner_all + 2; } /* ---------------------------------------------------------------------- size of atom nlocal's restart data ------------------------------------------------------------------------- */ -int FixShearHistory::size_restart(int nlocal) +int FixNeighHistory::size_restart(int nlocal) { return (dnum+1)*npartner[nlocal] + 2; } diff --git a/src/fix_shear_history.h b/src/fix_neigh_history.h similarity index 59% rename from src/fix_shear_history.h rename to src/fix_neigh_history.h index 00f219f034..7aed2d6035 100644 --- a/src/fix_shear_history.h +++ b/src/fix_neigh_history.h @@ -13,38 +13,35 @@ #ifdef FIX_CLASS -FixStyle(SHEAR_HISTORY,FixShearHistory) +FixStyle(NEIGH_HISTORY,FixNeighHistory) #else -#ifndef LMP_FIX_SHEAR_HISTORY_H -#define LMP_FIX_SHEAR_HISTORY_H +#ifndef LMP_FIX_NEIGH_HISTORY_H +#define LMP_FIX_NEIGH_HISTORY_H #include "fix.h" #include "my_page.h" namespace LAMMPS_NS { -class FixShearHistory : public Fix { - //friend class Neighbor; - //friend class PairGranHookeHistory; - friend class PairLineGranHookeHistory; - friend class PairTriGranHookeHistory; - +class FixNeighHistory : public Fix { public: int nlocal_neigh; // nlocal at last time neigh list was built int nall_neigh; // ditto for nlocal+nghost - int *npartner; // # of touching partners of each atom - tagint **partner; // global atom IDs for the partners - double **shearpartner; // shear values with the partner - class Pair *pair; // ptr to pair style that uses shear history + int **firstflag; // ptr to each atom's neighbor flsg + double **firstvalue; // ptr to each atom's values + class Pair *pair; // ptr to pair style that uses neighbor history - FixShearHistory(class LAMMPS *, int, char **); - ~FixShearHistory(); + FixNeighHistory(class LAMMPS *, int, char **); + ~FixNeighHistory(); int setmask(); void init(); - virtual void pre_exchange(); + void setup_post_neighbor(); + void pre_exchange(); void min_pre_exchange(); + virtual void post_neighbor(); + void min_post_neighbor(); void post_run(); double memory_usage(); @@ -64,20 +61,40 @@ class FixShearHistory : public Fix { protected: int newton_pair; // same as force setting - int dnum,dnumbytes; // dnum = # of shear history values + int dnum,dnumbytes; // dnum = # of values per neighbor int onesided; // 1 for line/tri history, else 0 - int maxtouch; // max # of touching partners for my atoms + int maxatom; // max size of firstflag and firstvalue int commflag; // mode of reverse comm to get ghost info + double *zeroes; + + // per-atom data structures + // partners = flagged neighbors of an atom + + int *npartner; // # of partners of each atom + tagint **partner; // global atom IDs for the partners + double **valuepartner; // values for the partners + int maxpartner; // max # of partners for any of my atoms + + // per-atom data structs pointed to by partner & valuepartner int pgsize,oneatom; // copy of settings in Neighbor - MyPage *ipage; // pages of partner atom IDs - MyPage *dpage; // pages of shear history with partners + MyPage *ipage_atom; // pages of partner atom IDs + MyPage *dpage_atom; // pages of partner values - void pre_exchange_onesided(); - void pre_exchange_newton(); - void pre_exchange_no_newton(); + // per-neighbor data structs pointed to by firstflag & firstvalue + + MyPage *ipage_neigh; // pages of local atom indices + MyPage *dpage_neigh; // pages of partner values + + virtual void pre_exchange_onesided(); + virtual void pre_exchange_newton(); + virtual void pre_exchange_no_newton(); void allocate_pages(); + + inline int sbmask(int j) const { + return j >> SBBITS & 3; + } }; } diff --git a/src/fix_nh.cpp b/src/fix_nh.cpp index c99c7a34bd..f95bde95d0 100644 --- a/src/fix_nh.cpp +++ b/src/fix_nh.cpp @@ -353,6 +353,15 @@ FixNH::FixNH(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"disc") == 0) { iarg++; + // keywords erate, strain, and ext are also parsed in fix/nh/uef + + } else if (strcmp(arg[iarg],"erate") == 0) { + iarg += 3; + } else if (strcmp(arg[iarg],"strain") == 0) { + iarg += 3; + } else if (strcmp(arg[iarg],"ext") == 0) { + iarg += 2; + } else error->all(FLERR,"Illegal fix nvt/npt/nph command"); } diff --git a/src/fix_nve_limit.cpp b/src/fix_nve_limit.cpp index 966fcfbb09..6f85d107f1 100644 --- a/src/fix_nve_limit.cpp +++ b/src/fix_nve_limit.cpp @@ -38,6 +38,7 @@ FixNVELimit::FixNVELimit(LAMMPS *lmp, int narg, char **arg) : scalar_flag = 1; global_freq = 1; extscalar = 1; + dynamic_group_allow = 1; xlimit = force->numeric(FLERR,arg[3]); diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index b83aadc95d..9ef939c58d 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -134,7 +134,8 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : // register with Atom class nmax_old = 0; - grow_arrays(atom->nmax); + if (!lmp->kokkos) + grow_arrays(atom->nmax); atom->add_callback(0); atom->add_callback(1); if (border) atom->add_callback(2); diff --git a/src/fix_property_atom.h b/src/fix_property_atom.h index 77a41f393a..d923d76cac 100644 --- a/src/fix_property_atom.h +++ b/src/fix_property_atom.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class FixPropertyAtom : public Fix { public: FixPropertyAtom(class LAMMPS *, int, char **); - ~FixPropertyAtom(); + virtual ~FixPropertyAtom(); int setmask(); void init(); @@ -38,7 +38,7 @@ class FixPropertyAtom : public Fix { void write_data_section_keyword(int, FILE *); void write_data_section(int, FILE *, int, double **, int); - void grow_arrays(int); + virtual void grow_arrays(int); void copy_arrays(int, int, int); int pack_border(int, int *, double *); int unpack_border(int, int, double *); @@ -50,7 +50,7 @@ class FixPropertyAtom : public Fix { int maxsize_restart(); double memory_usage(); - private: + protected: int nvalue,border; int molecule_flag,q_flag,rmass_flag; int *style,*index; diff --git a/src/fix_store.cpp b/src/fix_store.cpp index c856bb2db2..84e94fc2b7 100644 --- a/src/fix_store.cpp +++ b/src/fix_store.cpp @@ -155,8 +155,7 @@ void FixStore::reset_global(int nrow_caller, int ncol_caller) else memory->create(astore,nrow,ncol,"fix/store:astore"); memory->create(rbuf,nrow*ncol+2,"fix/store:rbuf"); - - printf("AAA HOW GET HERE\n"); + // printf("AAA HOW GET HERE\n"); } /* ---------------------------------------------------------------------- diff --git a/src/fix_temp_rescale.cpp b/src/fix_temp_rescale.cpp index fe52a31788..52e2da7b3d 100644 --- a/src/fix_temp_rescale.cpp +++ b/src/fix_temp_rescale.cpp @@ -48,6 +48,7 @@ FixTempRescale::FixTempRescale(LAMMPS *lmp, int narg, char **arg) : scalar_flag = 1; global_freq = nevery; extscalar = 1; + dynamic_group_allow = 1; tstr = NULL; if (strstr(arg[4],"v_") == arg[4]) { diff --git a/src/fix_viscous.cpp b/src/fix_viscous.cpp index 911fcf84ef..423bccc383 100644 --- a/src/fix_viscous.cpp +++ b/src/fix_viscous.cpp @@ -30,6 +30,8 @@ FixViscous::FixViscous(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), gamma(NULL) { + dynamic_group_allow = 1; + if (narg < 4) error->all(FLERR,"Illegal fix viscous command"); double gamma_one = force->numeric(FLERR,arg[3]); diff --git a/src/fix_wall.cpp b/src/fix_wall.cpp index 503b87f4a7..2c3aa4afa0 100644 --- a/src/fix_wall.cpp +++ b/src/fix_wall.cpp @@ -45,6 +45,7 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : extvector = 1; respa_level_support = 1; ilevel_respa = 0; + virial_flag = 1; // parse args @@ -201,6 +202,8 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : FixWall::~FixWall() { + if (copymode) return; + for (int m = 0; m < nwall; m++) { delete [] xstr[m]; delete [] estr[m]; @@ -296,7 +299,12 @@ void FixWall::pre_force(int vflag) void FixWall::post_force(int vflag) { + + // energy and virial setup + eflag = 0; + if (vflag) v_setup(vflag); + else evflag = 0; for (int m = 0; m <= nwall; m++) ewall[m] = 0.0; // coord = current position of wall diff --git a/src/fix_wall_harmonic.cpp b/src/fix_wall_harmonic.cpp index 41d630b7fe..20d5dbebd4 100644 --- a/src/fix_wall_harmonic.cpp +++ b/src/fix_wall_harmonic.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallHarmonic::FixWallHarmonic(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- interaction of all particles in group with a wall @@ -34,6 +37,7 @@ FixWallHarmonic::FixWallHarmonic(LAMMPS *lmp, int narg, char **arg) : void FixWallHarmonic::wall_particle(int m, int which, double coord) { double delta,dr,fwall; + double vn; double **x = atom->x; double **f = atom->f; @@ -60,6 +64,12 @@ void FixWallHarmonic::wall_particle(int m, int which, double coord) f[i][dim] -= fwall; ewall[0] += epsilon[m]*dr*dr; ewall[m+1] += fwall; + + if (evflag) { + if (side < 0) vn = -fwall*delta; + else vn = fwall*delta; + v_tally(dim, i, vn); + } } if (onflag) error->one(FLERR,"Particle on or inside fix wall surface"); diff --git a/src/fix_wall_lj1043.cpp b/src/fix_wall_lj1043.cpp index 72d71fbb3c..064a5a8d60 100644 --- a/src/fix_wall_lj1043.cpp +++ b/src/fix_wall_lj1043.cpp @@ -26,7 +26,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ FixWallLJ1043::FixWallLJ1043(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ @@ -52,6 +55,7 @@ void FixWallLJ1043::precompute(int m) void FixWallLJ1043::wall_particle(int m, int which, double coord) { double delta,rinv,r2inv,r4inv,r10inv,fwall; + double vn; double **x = atom->x; double **f = atom->f; @@ -79,5 +83,11 @@ void FixWallLJ1043::wall_particle(int m, int which, double coord) ewall[0] += coeff1[m]*r10inv - coeff2[m]*r4inv - coeff3[m]*pow(delta+coeff4[m],-3.0) - offset[m]; ewall[m+1] += fwall; + + if (evflag) { + if (side < 0) vn = -fwall*delta; + else vn = fwall*delta; + v_tally(dim, i, vn); + } } } diff --git a/src/fix_wall_lj126.cpp b/src/fix_wall_lj126.cpp index f6d8654eea..f556952ab3 100644 --- a/src/fix_wall_lj126.cpp +++ b/src/fix_wall_lj126.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallLJ126::FixWallLJ126(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ @@ -48,6 +51,7 @@ void FixWallLJ126::precompute(int m) void FixWallLJ126::wall_particle(int m, int which, double coord) { double delta,rinv,r2inv,r6inv,fwall; + double vn; double **x = atom->x; double **f = atom->f; @@ -76,6 +80,12 @@ void FixWallLJ126::wall_particle(int m, int which, double coord) f[i][dim] -= fwall; ewall[0] += r6inv*(coeff3[m]*r6inv - coeff4[m]) - offset[m]; ewall[m+1] += fwall; + + if (evflag) { + if (side < 0) vn = -fwall*delta; + else vn = fwall*delta; + v_tally(dim, i, vn); + } } if (onflag) error->one(FLERR,"Particle on or inside fix wall surface"); diff --git a/src/fix_wall_lj93.cpp b/src/fix_wall_lj93.cpp index f7a3aaf14c..f5d6a7e147 100644 --- a/src/fix_wall_lj93.cpp +++ b/src/fix_wall_lj93.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallLJ93::FixWallLJ93(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ @@ -49,6 +52,7 @@ void FixWallLJ93::precompute(int m) void FixWallLJ93::wall_particle(int m, int which, double coord) { double delta,rinv,r2inv,r4inv,r10inv,fwall; + double vn; double **x = atom->x; double **f = atom->f; @@ -79,6 +83,12 @@ void FixWallLJ93::wall_particle(int m, int which, double coord) ewall[0] += coeff3[m]*r4inv*r4inv*rinv - coeff4[m]*r2inv*rinv - offset[m]; ewall[m+1] += fwall; + + if (evflag) { + if (side < 0) vn = -fwall*delta; + else vn = fwall*delta; + v_tally(dim, i, vn); + } } if (onflag) error->one(FLERR,"Particle on or inside fix wall surface"); diff --git a/src/fix_wall_lj93.h b/src/fix_wall_lj93.h index 40337a5176..3763a02910 100644 --- a/src/fix_wall_lj93.h +++ b/src/fix_wall_lj93.h @@ -28,9 +28,9 @@ class FixWallLJ93 : public FixWall { public: FixWallLJ93(class LAMMPS *, int, char **); void precompute(int); - void wall_particle(int, int, double); + virtual void wall_particle(int, int, double); - private: + protected: double coeff1[6],coeff2[6],coeff3[6],coeff4[6],offset[6]; }; diff --git a/src/fix_wall_reflect.cpp b/src/fix_wall_reflect.cpp index dba7cf7036..86607dbe8e 100644 --- a/src/fix_wall_reflect.cpp +++ b/src/fix_wall_reflect.cpp @@ -39,6 +39,8 @@ FixWallReflect::FixWallReflect(LAMMPS *lmp, int narg, char **arg) : { if (narg < 4) error->all(FLERR,"Illegal fix wall/reflect command"); + dynamic_group_allow = 1; + // parse args nwall = 0; diff --git a/src/fix_wall_region.cpp b/src/fix_wall_region.cpp index f543c12171..67b0bcd713 100644 --- a/src/fix_wall_region.cpp +++ b/src/fix_wall_region.cpp @@ -25,11 +25,13 @@ #include "output.h" #include "respa.h" #include "error.h" +#include "math_const.h" using namespace LAMMPS_NS; using namespace FixConst; +using namespace MathConst; -enum{LJ93,LJ126,COLLOID,HARMONIC}; +enum{LJ93,LJ126,LJ1043,COLLOID,HARMONIC}; /* ---------------------------------------------------------------------- */ @@ -47,6 +49,7 @@ FixWallRegion::FixWallRegion(LAMMPS *lmp, int narg, char **arg) : extvector = 1; respa_level_support = 1; ilevel_respa = 0; + virial_flag = 1; // parse args @@ -59,10 +62,13 @@ FixWallRegion::FixWallRegion(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[4],"lj93") == 0) style = LJ93; else if (strcmp(arg[4],"lj126") == 0) style = LJ126; + else if (strcmp(arg[4],"lj1043") == 0) style = LJ1043; else if (strcmp(arg[4],"colloid") == 0) style = COLLOID; else if (strcmp(arg[4],"harmonic") == 0) style = HARMONIC; else error->all(FLERR,"Illegal fix wall/region command"); + if (style != COLLOID) dynamic_group_allow = 1; + epsilon = force->numeric(FLERR,arg[5]); sigma = force->numeric(FLERR,arg[6]); cutoff = force->numeric(FLERR,arg[7]); @@ -143,6 +149,20 @@ void FixWallRegion::init() double r2inv = 1.0/(cutoff*cutoff); double r6inv = r2inv*r2inv*r2inv; offset = r6inv*(coeff3*r6inv - coeff4); + } else if (style == LJ1043) { + coeff1 = MY_2PI * 2.0/5.0 * epsilon * pow(sigma,10.0); + coeff2 = MY_2PI * epsilon * pow(sigma,4.0); + coeff3 = MY_2PI * pow(2.0,1/2.0) / 3 * epsilon * pow(sigma,3.0); + coeff4 = 0.61 / pow(2.0,1/2.0) * sigma; + coeff5 = coeff1 * 10.0; + coeff6 = coeff2 * 4.0; + coeff7 = coeff3 * 3.0; + + double rinv = 1.0/cutoff; + double r2inv = rinv*rinv; + double r4inv = r2inv*r2inv; + offset = coeff1*r4inv*r4inv*r2inv - coeff2*r4inv - + coeff3*pow(cutoff+coeff4,-3.0); } else if (style == COLLOID) { coeff1 = -4.0/315.0 * epsilon * pow(sigma,6.0); coeff2 = -2.0/3.0 * epsilon; @@ -186,6 +206,7 @@ void FixWallRegion::post_force(int vflag) { int i,m,n; double rinv,fx,fy,fz,tooclose; + double delx, dely, delz, v[6]; double **x = atom->x; double **f = atom->f; @@ -198,13 +219,18 @@ void FixWallRegion::post_force(int vflag) int onflag = 0; + // energy and virial setup + + eflag = 0; + if (vflag) v_setup(vflag); + else evflag = 0; + // region->match() insures particle is in region or on surface, else error // if returned contact dist r = 0, is on surface, also an error // in COLLOID case, r <= radius is an error // initilize ewall after region->prematch(), // so a dynamic region can access last timestep values - eflag = 0; ewall[0] = ewall[1] = ewall[2] = ewall[3] = 0.0; for (i = 0; i < nlocal; i++) @@ -226,19 +252,32 @@ void FixWallRegion::post_force(int vflag) if (style == LJ93) lj93(region->contact[m].r); else if (style == LJ126) lj126(region->contact[m].r); + else if (style == LJ1043) lj1043(region->contact[m].r); else if (style == COLLOID) colloid(region->contact[m].r,radius[i]); else harmonic(region->contact[m].r); - ewall[0] += eng; - fx = fwall * region->contact[m].delx * rinv; - fy = fwall * region->contact[m].dely * rinv; - fz = fwall * region->contact[m].delz * rinv; + delx = region->contact[m].delx; + dely = region->contact[m].dely; + delz = region->contact[m].delz; + fx = fwall * delx * rinv; + fy = fwall * dely * rinv; + fz = fwall * delz * rinv; f[i][0] += fx; f[i][1] += fy; f[i][2] += fz; ewall[1] -= fx; ewall[2] -= fy; ewall[3] -= fz; + ewall[0] += eng; + if (evflag) { + v[0] = fx*delx; + v[1] = fy*dely; + v[2] = fz*delz; + v[3] = fx*dely; + v[4] = fx*delz; + v[5] = fy*delz; + v_tally(i, v); + } } } @@ -319,6 +358,23 @@ void FixWallRegion::lj126(double r) eng = r6inv*(coeff3*r6inv - coeff4) - offset; } +/* ---------------------------------------------------------------------- + LJ 10/4/3 interaction for particle with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +void FixWallRegion::lj1043(double r) +{ + double rinv = 1.0/r; + double r2inv = rinv*rinv; + double r4inv = r2inv*r2inv; + double r10inv = r4inv*r4inv*r2inv; + fwall = coeff5*r10inv*rinv - coeff6*r4inv*rinv - + coeff7*pow(r+coeff4,-4.0); + eng = coeff1*r10inv - coeff2*r4inv - + coeff3*pow(r+coeff4,-3.0) - offset; +} + /* ---------------------------------------------------------------------- colloid interaction for finite-size particle of rad with wall compute eng and fwall = magnitude of wall force diff --git a/src/fix_wall_region.h b/src/fix_wall_region.h index cecd7faa33..e3688c99ee 100644 --- a/src/fix_wall_region.h +++ b/src/fix_wall_region.h @@ -47,10 +47,12 @@ class FixWallRegion : public Fix { char *idregion; double coeff1,coeff2,coeff3,coeff4,offset; + double coeff5,coeff6,coeff7; double eng,fwall; void lj93(double); void lj126(double); + void lj1043(double); void colloid(double, double); void harmonic(double); }; diff --git a/src/force.cpp b/src/force.cpp index 33e6630406..060cae10eb 100644 --- a/src/force.cpp +++ b/src/force.cpp @@ -833,10 +833,6 @@ void Force::set_special(int narg, char **arg) else if (strcmp(arg[iarg+1],"yes") == 0) special_dihedral = 1; else error->all(FLERR,"Illegal special_bonds command"); iarg += 2; - } else if (strcmp(arg[iarg],"extra") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal special_bonds command"); - special_extra = atoi(arg[iarg+1]); - iarg += 2; } else error->all(FLERR,"Illegal special_bonds command"); } @@ -844,8 +840,6 @@ void Force::set_special(int narg, char **arg) if (special_lj[i] < 0.0 || special_lj[i] > 1.0 || special_coul[i] < 0.0 || special_coul[i] > 1.0) error->all(FLERR,"Illegal special_bonds command"); - - if (special_extra < 0) error->all(FLERR,"Illegal special_bonds command"); } /* ---------------------------------------------------------------------- diff --git a/src/group.cpp b/src/group.cpp index 76275f301d..93c9c12bcf 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -188,6 +188,12 @@ void Group::assign(int narg, char **arg) if (domain->regions[iregion]->match(x[i][0],x[i][1],x[i][2])) mask[i] |= bit; + // create an empty group + + } else if (strcmp(arg[1],"empty") == 0) { + + ; // nothing to do here + // style = type, molecule, id // add to group if atom matches type/molecule/id or condition diff --git a/src/info.cpp b/src/info.cpp index 9fcc24fde9..c8cf25d871 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -28,6 +28,10 @@ #include "force.h" #include "pair.h" #include "pair_hybrid.h" +#include "bond.h" +#include "angle.h" +#include "dihedral.h" +#include "improper.h" #include "group.h" #include "input.h" #include "modify.h" @@ -45,7 +49,7 @@ #include #ifdef _WIN32 -#define PSAPI_VERSION=1 +#define PSAPI_VERSION 1 #include #include #include @@ -75,20 +79,21 @@ enum {COMPUTES=1<<0, VARIABLES=1<<8, SYSTEM=1<<9, COMM=1<<10, - ATOM_STYLES=1<<11, - INTEGRATE_STYLES=1<<12, - MINIMIZE_STYLES=1<<13, - PAIR_STYLES=1<<14, - BOND_STYLES=1<<15, - ANGLE_STYLES=1<<16, - DIHEDRAL_STYLES=1<<17, - IMPROPER_STYLES=1<<18, - KSPACE_STYLES=1<<19, - FIX_STYLES=1<<20, - COMPUTE_STYLES=1<<21, - REGION_STYLES=1<<22, - DUMP_STYLES=1<<23, - COMMAND_STYLES=1<<24, + COEFFS=1<<11, + ATOM_STYLES=1<<12, + INTEGRATE_STYLES=1<<13, + MINIMIZE_STYLES=1<<14, + PAIR_STYLES=1<<15, + BOND_STYLES=1<<16, + ANGLE_STYLES=1<<17, + DIHEDRAL_STYLES=1<<18, + IMPROPER_STYLES=1<<19, + KSPACE_STYLES=1<<20, + FIX_STYLES=1<<21, + COMPUTE_STYLES=1<<22, + REGION_STYLES=1<<23, + DUMP_STYLES=1<<24, + COMMAND_STYLES=1<<25, ALL=~0}; static const int STYLES = ATOM_STYLES | INTEGRATE_STYLES | MINIMIZE_STYLES @@ -183,6 +188,9 @@ void Info::command(int narg, char **arg) } else if (strncmp(arg[idx],"system",3) == 0) { flags |= SYSTEM; ++idx; + } else if (strncmp(arg[idx],"coeffs",3) == 0) { + flags |= COEFFS; + ++idx; } else if (strncmp(arg[idx],"styles",3) == 0) { if (idx+1 < narg) { ++idx; @@ -440,6 +448,69 @@ void Info::command(int narg, char **arg) } } + if (domain->box_exist && (flags & COEFFS)) { + Pair *pair=force->pair; + + fprintf(out,"\nCoeff information:\n"); + if (pair) { + fprintf(out,"Pair Coeffs:\n"); + for (int i=1; i <= atom->ntypes; ++i) + for (int j=i; j <= atom->ntypes; ++j) { + fprintf(out,"%3d %3d :",i,j); + if (pair->allocated && pair->setflag[i][j]) fputs(" is set\n",out); + else fputs (" is not set\n",out); + } + } + if (force->bond) { + Bond *bond=force->bond; + + if (bond) { + fprintf(out,"Bond Coeffs:\n"); + for (int i=1; i <= atom->nbondtypes; ++i) { + fprintf(out,"%3d :",i); + if (bond->allocated && bond->setflag[i]) fputs(" is set\n",out); + else fputs (" is not set\n",out); + } + } + } + if (force->angle) { + Angle *angle=force->angle; + + if (angle) { + fprintf(out,"Angle Coeffs:\n"); + for (int i=1; i <= atom->nangletypes; ++i) { + fprintf(out,"%3d :",i); + if (angle->allocated && angle->setflag[i]) fputs(" is set\n",out); + else fputs (" is not set\n",out); + } + } + } + if (force->dihedral) { + Dihedral *dihedral=force->dihedral; + + if (dihedral) { + fprintf(out,"Dihedral Coeffs:\n"); + for (int i=1; i <= atom->ndihedraltypes; ++i) { + fprintf(out,"%3d :",i); + if (dihedral->allocated && dihedral->setflag[i]) fputs(" is set\n",out); + else fputs (" is not set\n",out); + } + } + } + if (force->improper) { + Improper *b=force->improper; + + if (b) { + fprintf(out,"Improper Coeffs:\n"); + for (int i=1; i <= atom->nimpropertypes; ++i) { + fprintf(out,"%3d :",i); + if (b->allocated && b->setflag[i]) fputs(" is set\n",out); + else fputs (" is not set\n",out); + } + } + } + } + if (flags & GROUPS) { int ngroup = group->ngroup; char **names = group->names; diff --git a/src/input.cpp b/src/input.cpp index 570560373a..0640327682 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -18,7 +18,7 @@ #include #include #include -#include "sys/stat.h" +#include #include "input.h" #include "style_command.h" #include "universe.h" @@ -27,7 +27,6 @@ #include "comm.h" #include "comm_brick.h" #include "comm_tiled.h" -#include "accelerator_kokkos.h" #include "group.h" #include "domain.h" #include "output.h" @@ -530,8 +529,11 @@ void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag) value = variable->retrieve(var); } - if (value == NULL) error->one(FLERR,"Substitution for illegal variable"); - + if (value == NULL) { + char str[128]; + sprintf(str,"Substitution for illegal variable %s",var); + error->one(FLERR,str); + } // check if storage in str2 needs to be expanded // re-initialize ptr and ptr2 to the point beyond the variable. @@ -1172,6 +1174,7 @@ void Input::print() FILE *fp = NULL; int screenflag = 1; + int universeflag = 0; int iarg = 1; while (iarg < narg) { @@ -1194,6 +1197,12 @@ void Input::print() else if (strcmp(arg[iarg+1],"no") == 0) screenflag = 0; else error->all(FLERR,"Illegal print command"); iarg += 2; + } else if (strcmp(arg[iarg],"universe") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal print command"); + if (strcmp(arg[iarg+1],"yes") == 0) universeflag = 1; + else if (strcmp(arg[iarg+1],"no") == 0) universeflag = 0; + else error->all(FLERR,"Illegal print command"); + iarg += 2; } else error->all(FLERR,"Illegal print command"); } @@ -1205,6 +1214,10 @@ void Input::print() fclose(fp); } } + if (universeflag && (universe->me == 0)) { + if (universe->uscreen) fprintf(universe->uscreen, "%s\n",line); + if (universe->ulogfile) fprintf(universe->ulogfile,"%s\n",line); + } } /* ---------------------------------------------------------------------- */ @@ -1867,7 +1880,6 @@ void Input::special_bonds() double coul3 = force->special_coul[3]; int angle = force->special_angle; int dihedral = force->special_dihedral; - int extra = force->special_extra; force->set_special(narg,arg); @@ -1877,8 +1889,7 @@ void Input::special_bonds() if (lj2 != force->special_lj[2] || lj3 != force->special_lj[3] || coul2 != force->special_coul[2] || coul3 != force->special_coul[3] || angle != force->special_angle || - dihedral != force->special_dihedral || - extra != force->special_extra) { + dihedral != force->special_dihedral) { Special special(lmp); special.build(); } diff --git a/src/integrate.h b/src/integrate.h index 4ca3a788fa..9a50fad1f7 100644 --- a/src/integrate.h +++ b/src/integrate.h @@ -23,7 +23,7 @@ class Integrate : protected Pointers { Integrate(class LAMMPS *, int, char **); virtual ~Integrate(); virtual void init(); - virtual void setup(int flag=1) = 0; + virtual void setup(int flag) = 0; virtual void setup_minimal(int) = 0; virtual void run(int) = 0; virtual void cleanup() {} diff --git a/src/kspace.cpp b/src/kspace.cpp index c2113cdf76..07e117e162 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -315,10 +315,10 @@ double KSpace::estimate_table_accuracy(double q2_over_sqrt, double spr) if (comm->me == 0) { char str[128]; if (nctb) - sprintf(str,"Using %d-bit tables for long-range coulomb",nctb); + sprintf(str," using %d-bit tables for long-range coulomb",nctb); else - sprintf(str,"Using polynomial approximation for long-range coulomb"); - error->warning(FLERR,str); + sprintf(str," using polynomial approximation for long-range coulomb"); + error->message(FLERR,str); } if (nctb) { diff --git a/src/kspace.h b/src/kspace.h index ad29c21472..5a2e5b7884 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -15,7 +15,6 @@ #define LMP_KSPACE_H #include "pointers.h" -#include "accelerator_kokkos.h" #ifdef FFT_SINGLE typedef float FFT_SCALAR; @@ -124,11 +123,6 @@ class KSpace : protected Pointers { virtual void pack_reverse(int, FFT_SCALAR *, int, int *) {}; virtual void unpack_reverse(int, FFT_SCALAR *, int, int *) {}; - virtual void pack_forward_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; - virtual void unpack_forward_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; - virtual void pack_reverse_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; - virtual void unpack_reverse_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {}; - virtual int timing(int, double &, double &) {return 0;} virtual int timing_1d(int, double &) {return 0;} virtual int timing_3d(int, double &) {return 0;} diff --git a/src/lammps.h b/src/lammps.h index c432784a0b..e3b815e623 100644 --- a/src/lammps.h +++ b/src/lammps.h @@ -53,6 +53,7 @@ class LAMMPS { class KokkosLMP *kokkos; // KOKKOS accelerator class class AtomKokkos *atomKK; // KOKKOS version of Atom class + class MemoryKokkos *memoryKK; // KOKKOS version of Memory class class Python * python; // Python interface diff --git a/src/library.cpp b/src/library.cpp index 22b54f73a1..233bb3122c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -37,6 +37,7 @@ #include "comm.h" #include "memory.h" #include "error.h" +#include "force.h" using namespace LAMMPS_NS; @@ -202,7 +203,10 @@ void lammps_file(void *ptr, char *str) BEGIN_CAPTURE { - lmp->input->file(str); + if (lmp->update->whichflag != 0) + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + else + lmp->input->file(str); } END_CAPTURE } @@ -220,7 +224,10 @@ char *lammps_command(void *ptr, char *str) BEGIN_CAPTURE { - result = lmp->input->one(str); + if (lmp->update->whichflag != 0) + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + else + result = lmp->input->one(str); } END_CAPTURE @@ -277,6 +284,10 @@ void lammps_commands_string(void *ptr, char *str) BEGIN_CAPTURE { + if (lmp->update->whichflag != 0) { + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + } + char *ptr = copy; for (int i=0; i < n-1; ++i) { @@ -370,6 +381,7 @@ void *lammps_extract_global(void *ptr, char *name) if (strcmp(name,"nlocal") == 0) return (void *) &lmp->atom->nlocal; if (strcmp(name,"nghost") == 0) return (void *) &lmp->atom->nghost; if (strcmp(name,"nmax") == 0) return (void *) &lmp->atom->nmax; + if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes; if (strcmp(name,"ntimestep") == 0) return (void *) &lmp->update->ntimestep; if (strcmp(name,"units") == 0) return (void *) lmp->update->unit_style; @@ -384,6 +396,28 @@ void *lammps_extract_global(void *ptr, char *name) if (strcmp(name,"atime") == 0) return (void *) &lmp->update->atime; if (strcmp(name,"atimestep") == 0) return (void *) &lmp->update->atimestep; + // global constants defined by units + + if (strcmp(name,"boltz") == 0) return (void *) &lmp->force->boltz; + if (strcmp(name,"hplanck") == 0) return (void *) &lmp->force->hplanck; + if (strcmp(name,"mvv2e") == 0) return (void *) &lmp->force->mvv2e; + if (strcmp(name,"ftm2v") == 0) return (void *) &lmp->force->ftm2v; + if (strcmp(name,"mv2d") == 0) return (void *) &lmp->force->mv2d; + if (strcmp(name,"nktv2p") == 0) return (void *) &lmp->force->nktv2p; + if (strcmp(name,"qqr2e") == 0) return (void *) &lmp->force->qqr2e; + if (strcmp(name,"qe2f") == 0) return (void *) &lmp->force->qe2f; + if (strcmp(name,"vxmu2f") == 0) return (void *) &lmp->force->vxmu2f; + if (strcmp(name,"xxt2kmu") == 0) return (void *) &lmp->force->xxt2kmu; + if (strcmp(name,"dielectric") == 0) return (void *) &lmp->force->dielectric; + if (strcmp(name,"qqrd2e") == 0) return (void *) &lmp->force->qqrd2e; + if (strcmp(name,"e_mass") == 0) return (void *) &lmp->force->e_mass; + if (strcmp(name,"hhmrr2e") == 0) return (void *) &lmp->force->hhmrr2e; + if (strcmp(name,"mvh2r") == 0) return (void *) &lmp->force->mvh2r; + + if (strcmp(name,"angstrom") == 0) return (void *) &lmp->force->angstrom; + if (strcmp(name,"femtosecond") == 0) return (void *) &lmp->force->femtosecond; + if (strcmp(name,"qelectron") == 0) return (void *) &lmp->force->qelectron; + return NULL; } diff --git a/src/main.cpp b/src/main.cpp index 7401183fea..82dac5af6d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,10 @@ #include #endif +#ifdef FFT_FFTW3 +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- @@ -62,4 +66,10 @@ int main(int argc, char **argv) #endif MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); + +#ifdef FFT_FFTW3 + // tell fftw3 to delete its global memory pool + // and thus avoid bogus valgrind memory leak reports + fftw_cleanup(); +#endif } diff --git a/src/memory.h b/src/memory.h index b83482e4c2..f2faecf6e1 100644 --- a/src/memory.h +++ b/src/memory.h @@ -16,9 +16,6 @@ #include "lmptype.h" #include "pointers.h" -#ifdef LMP_KOKKOS -#include "kokkos_type.h" -#endif namespace LAMMPS_NS { @@ -31,16 +28,6 @@ class Memory : protected Pointers { void sfree(void *); void fail(const char *); - // Kokkos memory allocation functions - // provide a dummy prototpye for any Kokkos memory function - // called in main LAMMPS even when not built with KOKKOS package - -#ifdef LMP_KOKKOS -#include "memory_kokkos.h" -#else - void grow_kokkos(tagint **, tagint **, int, int, const char*) {} -#endif - /* ---------------------------------------------------------------------- create/grow/destroy vecs and multidim arrays with contiguous memory blocks only use with primitive data types, e.g. 1d vec of ints, 2d array of doubles diff --git a/src/min.cpp b/src/min.cpp index af23629cad..0caa9a9acf 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -245,7 +245,8 @@ void Min::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // remove these restriction eventually @@ -344,7 +345,8 @@ void Min::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -503,12 +505,15 @@ double Min::energy_force(int resetflag) if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); timer->stamp(Timer::COMM); if (modify->n_min_pre_neighbor) { - timer->stamp(); modify->min_pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); + if (modify->n_min_post_neighbor) { + modify->min_post_neighbor(); + timer->stamp(Timer::MODIFY); + } } ev_set(update->ntimestep); diff --git a/src/modify.cpp b/src/modify.cpp index 4516788aa9..64970f2cf9 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -42,7 +42,7 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp) { nfix = maxfix = 0; n_initial_integrate = n_post_integrate = 0; - n_pre_exchange = n_pre_neighbor = 0; + n_pre_exchange = n_pre_neighbor = n_post_neighbor = 0; n_pre_force = n_pre_reverse = n_post_force = 0; n_final_integrate = n_end_of_step = n_thermo_energy = 0; n_thermo_energy_atom = 0; @@ -54,14 +54,14 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp) fix = NULL; fmask = NULL; list_initial_integrate = list_post_integrate = NULL; - list_pre_exchange = list_pre_neighbor = NULL; + list_pre_exchange = list_pre_neighbor = list_post_neighbor = NULL; list_pre_force = list_pre_reverse = list_post_force = NULL; list_final_integrate = list_end_of_step = NULL; list_thermo_energy = list_thermo_energy_atom = NULL; list_initial_integrate_respa = list_post_integrate_respa = NULL; list_pre_force_respa = list_post_force_respa = NULL; list_final_integrate_respa = NULL; - list_min_pre_exchange = list_min_pre_neighbor = NULL; + list_min_pre_exchange = list_min_pre_neighbor = list_min_post_neighbor = NULL; list_min_pre_force = list_min_pre_reverse = list_min_post_force = NULL; list_min_energy = NULL; @@ -110,7 +110,7 @@ Modify::~Modify() // delete all fixes // do it via delete_fix() so callbacks in Atom are also updated correctly - while (nfix) delete_fix(fix[0]->id); + while (nfix) delete_fix(0); memory->sfree(fix); memory->destroy(fmask); @@ -123,6 +123,7 @@ Modify::~Modify() delete [] list_post_integrate; delete [] list_pre_exchange; delete [] list_pre_neighbor; + delete [] list_post_neighbor; delete [] list_pre_force; delete [] list_pre_reverse; delete [] list_post_force; @@ -137,6 +138,7 @@ Modify::~Modify() delete [] list_final_integrate_respa; delete [] list_min_pre_exchange; delete [] list_min_pre_neighbor; + delete [] list_min_post_neighbor; delete [] list_min_pre_force; delete [] list_min_pre_reverse; delete [] list_min_post_force; @@ -169,6 +171,7 @@ void Modify::init() list_init(POST_INTEGRATE,n_post_integrate,list_post_integrate); list_init(PRE_EXCHANGE,n_pre_exchange,list_pre_exchange); list_init(PRE_NEIGHBOR,n_pre_neighbor,list_pre_neighbor); + list_init(POST_NEIGHBOR,n_post_neighbor,list_post_neighbor); list_init(PRE_FORCE,n_pre_force,list_pre_force); list_init(PRE_REVERSE,n_pre_reverse,list_pre_reverse); list_init(POST_FORCE,n_post_force,list_post_force); @@ -190,6 +193,7 @@ void Modify::init() list_init(MIN_PRE_EXCHANGE,n_min_pre_exchange,list_min_pre_exchange); list_init(MIN_PRE_NEIGHBOR,n_min_pre_neighbor,list_min_pre_neighbor); + list_init(MIN_POST_NEIGHBOR,n_min_post_neighbor,list_min_post_neighbor); list_init(MIN_PRE_FORCE,n_min_pre_force,list_min_pre_force); list_init(MIN_PRE_REVERSE,n_min_pre_reverse,list_min_pre_reverse); list_init(MIN_POST_FORCE,n_min_post_force,list_min_post_force); @@ -329,6 +333,21 @@ void Modify::setup_pre_neighbor() fix[list_min_pre_neighbor[i]]->setup_pre_neighbor(); } +/* ---------------------------------------------------------------------- + setup post_neighbor call, only for fixes that define post_neighbor + called from Verlet, RESPA +------------------------------------------------------------------------- */ + +void Modify::setup_post_neighbor() +{ + if (update->whichflag == 1) + for (int i = 0; i < n_post_neighbor; i++) + fix[list_post_neighbor[i]]->setup_post_neighbor(); + else if (update->whichflag == 2) + for (int i = 0; i < n_min_post_neighbor; i++) + fix[list_min_post_neighbor[i]]->setup_post_neighbor(); +} + /* ---------------------------------------------------------------------- setup pre_force call, only for fixes that define pre_force called from Verlet, RESPA, Min @@ -399,6 +418,16 @@ void Modify::pre_neighbor() fix[list_pre_neighbor[i]]->pre_neighbor(); } +/* ---------------------------------------------------------------------- + post_neighbor call, only for relevant fixes +------------------------------------------------------------------------- */ + +void Modify::post_neighbor() +{ + for (int i = 0; i < n_post_neighbor; i++) + fix[list_post_neighbor[i]]->post_neighbor(); +} + /* ---------------------------------------------------------------------- pre_force call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -589,6 +618,16 @@ void Modify::min_pre_neighbor() fix[list_min_pre_neighbor[i]]->min_pre_neighbor(); } +/* ---------------------------------------------------------------------- + minimizer post-neighbor call, only for relevant fixes +------------------------------------------------------------------------- */ + +void Modify::min_post_neighbor() +{ + for (int i = 0; i < n_min_post_neighbor; i++) + fix[list_min_post_neighbor[i]]->min_post_neighbor(); +} + /* ---------------------------------------------------------------------- minimizer pre-force call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -863,9 +902,9 @@ void Modify::add_fix(int narg, char **arg, int trysuffix) fix[ifix]->restart(state_restart_global[i]); used_restart_global[i] = 1; if (comm->me == 0) { - if (screen) + if (screen) fprintf(screen,"Resetting global fix info from restart file:\n"); - if (logfile) + if (logfile) fprintf(logfile,"Resetting global fix info from restart file:\n"); if (screen) fprintf(screen," fix style: %s, fix ID: %s\n", fix[ifix]->style,fix[ifix]->id); @@ -885,9 +924,9 @@ void Modify::add_fix(int narg, char **arg, int trysuffix) fix[ifix]->unpack_restart(j,index_restart_peratom[i]); fix[ifix]->restart_reset = 1; if (comm->me == 0) { - if (screen) + if (screen) fprintf(screen,"Resetting peratom fix info from restart file:\n"); - if (logfile) + if (logfile) fprintf(logfile,"Resetting peratom fix info from restart file:\n"); if (screen) fprintf(screen," fix style: %s, fix ID: %s\n", fix[ifix]->style,fix[ifix]->id); @@ -944,7 +983,12 @@ void Modify::delete_fix(const char *id) { int ifix = find_fix(id); if (ifix < 0) error->all(FLERR,"Could not find fix ID to delete"); - delete fix[ifix]; + delete_fix(ifix); +} + +void Modify::delete_fix(int ifix) +{ + if (fix[ifix]) delete fix[ifix]; atom->update_callback(ifix); // move other Fixes and fmask down in list one slot @@ -1409,24 +1453,24 @@ void Modify::restart_deallocate(int flag) if (flag && comm->me == 0) { int i; for (i = 0; i < nfix_restart_global; i++) - if (used_restart_global[i] == 0) break; + if (used_restart_global[i] == 0) break; if (i == nfix_restart_global) { - if (screen) + if (screen) fprintf(screen,"All restart file global fix info " "was re-assigned\n"); - if (logfile) + if (logfile) fprintf(logfile,"All restart file global fix info " "was re-assigned\n"); } else { - if (screen) fprintf(screen,"Unused restart file global fix info:\n"); - if (logfile) fprintf(logfile,"Unused restart file global fix info:\n"); - for (i = 0; i < nfix_restart_global; i++) { - if (used_restart_global[i]) continue; - if (screen) fprintf(screen," fix style: %s, fix ID: %s\n", - style_restart_global[i],id_restart_global[i]); - if (logfile) fprintf(logfile," fix style: %s, fix ID: %s\n", - style_restart_global[i],id_restart_global[i]); - } + if (screen) fprintf(screen,"Unused restart file global fix info:\n"); + if (logfile) fprintf(logfile,"Unused restart file global fix info:\n"); + for (i = 0; i < nfix_restart_global; i++) { + if (used_restart_global[i]) continue; + if (screen) fprintf(screen," fix style: %s, fix ID: %s\n", + style_restart_global[i],id_restart_global[i]); + if (logfile) fprintf(logfile," fix style: %s, fix ID: %s\n", + style_restart_global[i],id_restart_global[i]); + } } } @@ -1445,24 +1489,24 @@ void Modify::restart_deallocate(int flag) if (flag && comm->me == 0) { int i; for (i = 0; i < nfix_restart_peratom; i++) - if (used_restart_peratom[i] == 0) break; + if (used_restart_peratom[i] == 0) break; if (i == nfix_restart_peratom) { - if (screen) + if (screen) fprintf(screen,"All restart file peratom fix info " "was re-assigned\n"); - if (logfile) + if (logfile) fprintf(logfile,"All restart file peratom fix info " "was re-assigned\n"); } else { - if (screen) fprintf(screen,"Unused restart file peratom fix info:\n"); - if (logfile) fprintf(logfile,"Unused restart file peratom fix info:\n"); - for (i = 0; i < nfix_restart_peratom; i++) { - if (used_restart_peratom[i]) continue; - if (screen) fprintf(screen," fix style: %s, fix ID: %s\n", - style_restart_peratom[i],id_restart_peratom[i]); - if (logfile) fprintf(logfile," fix style: %s, fix ID: %s\n", - style_restart_peratom[i],id_restart_peratom[i]); - } + if (screen) fprintf(screen,"Unused restart file peratom fix info:\n"); + if (logfile) fprintf(logfile,"Unused restart file peratom fix info:\n"); + for (i = 0; i < nfix_restart_peratom; i++) { + if (used_restart_peratom[i]) continue; + if (screen) fprintf(screen," fix style: %s, fix ID: %s\n", + style_restart_peratom[i],id_restart_peratom[i]); + if (logfile) fprintf(logfile," fix style: %s, fix ID: %s\n", + style_restart_peratom[i],id_restart_peratom[i]); + } } } diff --git a/src/modify.h b/src/modify.h index d825d5c4ef..3e20df5aac 100644 --- a/src/modify.h +++ b/src/modify.h @@ -29,12 +29,13 @@ class Modify : protected Pointers { public: int nfix,maxfix; - int n_initial_integrate,n_post_integrate,n_pre_exchange,n_pre_neighbor; + int n_initial_integrate,n_post_integrate,n_pre_exchange; + int n_pre_neighbor,n_post_neighbor; int n_pre_force,n_pre_reverse,n_post_force; int n_final_integrate,n_end_of_step,n_thermo_energy,n_thermo_energy_atom; int n_initial_integrate_respa,n_post_integrate_respa; int n_pre_force_respa,n_post_force_respa,n_final_integrate_respa; - int n_min_pre_exchange,n_min_pre_neighbor; + int n_min_pre_exchange,n_min_pre_neighbor,n_min_post_neighbor; int n_min_pre_force,n_min_pre_reverse,n_min_post_force,n_min_energy; int restart_pbc_any; // 1 if any fix sets restart_pbc @@ -53,12 +54,14 @@ class Modify : protected Pointers { virtual void setup(int); virtual void setup_pre_exchange(); virtual void setup_pre_neighbor(); + virtual void setup_post_neighbor(); virtual void setup_pre_force(int); virtual void setup_pre_reverse(int, int); virtual void initial_integrate(int); virtual void post_integrate(); virtual void pre_exchange(); virtual void pre_neighbor(); + virtual void post_neighbor(); virtual void pre_force(int); virtual void pre_reverse(int,int); virtual void post_force(int); @@ -78,6 +81,7 @@ class Modify : protected Pointers { virtual void min_pre_exchange(); virtual void min_pre_neighbor(); + virtual void min_post_neighbor(); virtual void min_pre_force(int); virtual void min_pre_reverse(int,int); virtual void min_post_force(int); @@ -95,6 +99,7 @@ class Modify : protected Pointers { void add_fix(int, char **, int trysuffix=1); void modify_fix(int, char **); void delete_fix(const char *); + void delete_fix(int); int find_fix(const char *); int find_fix_by_style(const char *); int check_package(const char *); @@ -122,14 +127,14 @@ class Modify : protected Pointers { // lists of fixes to apply at different stages of timestep int *list_initial_integrate,*list_post_integrate; - int *list_pre_exchange,*list_pre_neighbor; + int *list_pre_exchange,*list_pre_neighbor,*list_post_neighbor; int *list_pre_force,*list_pre_reverse,*list_post_force; int *list_final_integrate,*list_end_of_step,*list_thermo_energy; int *list_thermo_energy_atom; int *list_initial_integrate_respa,*list_post_integrate_respa; int *list_pre_force_respa,*list_post_force_respa; int *list_final_integrate_respa; - int *list_min_pre_exchange,*list_min_pre_neighbor; + int *list_min_pre_exchange,*list_min_pre_neighbor,*list_min_post_neighbor; int *list_min_pre_force,*list_min_pre_reverse,*list_min_post_force; int *list_min_energy; diff --git a/src/molecule.cpp b/src/molecule.cpp index e0e9ec8aaf..78dc4b82b3 100644 --- a/src/molecule.cpp +++ b/src/molecule.cpp @@ -144,17 +144,17 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) : if (me == 0) { if (screen) fprintf(screen,"Read molecule %s:\n" - " %d atoms with %d types\n %d bonds with %d types\n" - " %d angles with %d types\n %d dihedrals with %d types\n" - " %d impropers with %d types\n", + " %d atoms with max type %d\n %d bonds with max type %d\n" + " %d angles with max type %d\n %d dihedrals with max type %d\n" + " %d impropers with max type %d\n", id,natoms,ntypes, nbonds,nbondtypes,nangles,nangletypes, ndihedrals,ndihedraltypes,nimpropers,nimpropertypes); if (logfile) fprintf(logfile,"Read molecule %s:\n" - " %d atoms with %d types\n %d bonds with %d types\n" - " %d angles with %d types\n %d dihedrals with %d types\n" - " %d impropers with %d types\n", + " %d atoms with max type %d\n %d bonds with max type %d\n" + " %d angles with max type %d\n %d dihedrals with max type %d\n" + " %d impropers with max type %d\n", id,natoms,ntypes, nbonds,nbondtypes,nangles,nangletypes, ndihedrals,ndihedraltypes,nimpropers,nimpropertypes); @@ -173,7 +173,7 @@ Molecule::~Molecule() compute center = geometric center of molecule also compute: dx = displacement of each atom from center - molradius = radius of molecule from center + molradius = radius of molecule from center including finite-size particles or body particles ------------------------------------------------------------------------- */ @@ -427,52 +427,66 @@ void Molecule::read(int flag) // search line for header keywords and set corresponding variable - if (strstr(line,"atoms")) sscanf(line,"%d",&natoms); - else if (strstr(line,"bonds")) sscanf(line,"%d",&nbonds); - else if (strstr(line,"angles")) sscanf(line,"%d",&nangles); - else if (strstr(line,"dihedrals")) sscanf(line,"%d",&ndihedrals); - else if (strstr(line,"impropers")) sscanf(line,"%d",&nimpropers); - - else if (strstr(line,"mass")) { + int nmatch = 0; + int nwant = 0; + if (strstr(line,"atoms")) { + nmatch = sscanf(line,"%d",&natoms); + nwant = 1; + } else if (strstr(line,"bonds")) { + nmatch = sscanf(line,"%d",&nbonds); + nwant = 1; + } else if (strstr(line,"angles")) { + nmatch = sscanf(line,"%d",&nangles); + nwant = 1; + } else if (strstr(line,"dihedrals")) { + nmatch = sscanf(line,"%d",&ndihedrals); + nwant = 1; + } else if (strstr(line,"impropers")) { + nmatch = sscanf(line,"%d",&nimpropers); + nwant = 1; + } else if (strstr(line,"mass")) { massflag = 1; - sscanf(line,"%lg",&masstotal); + nmatch = sscanf(line,"%lg",&masstotal); + nwant = 1; masstotal *= sizescale*sizescale*sizescale; - } - else if (strstr(line,"com")) { + } else if (strstr(line,"com")) { comflag = 1; - sscanf(line,"%lg %lg %lg",&com[0],&com[1],&com[2]); + nmatch = sscanf(line,"%lg %lg %lg",&com[0],&com[1],&com[2]); + nwant = 3; com[0] *= sizescale; com[1] *= sizescale; com[2] *= sizescale; if (domain->dimension == 2 && com[2] != 0.0) error->all(FLERR,"Molecule file z center-of-mass must be 0.0 for 2d"); - } - else if (strstr(line,"inertia")) { + } else if (strstr(line,"inertia")) { inertiaflag = 1; - sscanf(line,"%lg %lg %lg %lg %lg %lg", - &itensor[0],&itensor[1],&itensor[2], - &itensor[3],&itensor[4],&itensor[5]); - itensor[0] *= sizescale*sizescale*sizescale*sizescale*sizescale; - itensor[1] *= sizescale*sizescale*sizescale*sizescale*sizescale; - itensor[2] *= sizescale*sizescale*sizescale*sizescale*sizescale; - itensor[3] *= sizescale*sizescale*sizescale*sizescale*sizescale; - itensor[4] *= sizescale*sizescale*sizescale*sizescale*sizescale; - itensor[5] *= sizescale*sizescale*sizescale*sizescale*sizescale; - } - else if (strstr(line,"body")) { + nmatch = sscanf(line,"%lg %lg %lg %lg %lg %lg", + &itensor[0],&itensor[1],&itensor[2], + &itensor[3],&itensor[4],&itensor[5]); + nwant = 6; + const double scale5 = sizescale*sizescale*sizescale*sizescale*sizescale; + itensor[0] *= scale5; + itensor[1] *= scale5; + itensor[2] *= scale5; + itensor[3] *= scale5; + itensor[4] *= scale5; + itensor[5] *= scale5; + } else if (strstr(line,"body")) { bodyflag = 1; avec_body = (AtomVecBody *) atom->style_match("body"); - if (!avec_body) + if (!avec_body) error->all(FLERR,"Molecule file requires atom style body"); - sscanf(line,"%d %d",&nibody,&ndbody); - } + nmatch = sscanf(line,"%d %d",&nibody,&ndbody); + nwant = 2; + } else break; - else break; + if (nmatch != nwant) + error->all(FLERR,"Invalid header in molecule file"); } // error checks - if (natoms < 1) + if (natoms < 1) error->all(FLERR,"No count or invalid atom count in molecule file"); if (nbonds < 0) error->all(FLERR,"Invalid bond count in molecule file"); if (nangles < 0) error->all(FLERR,"Invalid angle count in molecule file"); @@ -493,7 +507,7 @@ void Molecule::read(int flag) // loop over sections of molecule file - while (strlen(keyword)) { + while (strlen(keyword) > 0) { if (strcmp(keyword,"Coords") == 0) { xflag = 1; if (flag) coords(line); @@ -517,22 +531,22 @@ void Molecule::read(int flag) } else if (strcmp(keyword,"Bonds") == 0) { if (nbonds == 0) - error->all(FLERR,"Molecule file has bonds but no nbonds setting"); + error->all(FLERR,"Molecule file has bonds but no nbonds setting"); bondflag = tag_require = 1; bonds(flag,line); } else if (strcmp(keyword,"Angles") == 0) { if (nangles == 0) - error->all(FLERR,"Molecule file has angles but no nangles setting"); + error->all(FLERR,"Molecule file has angles but no nangles setting"); angleflag = tag_require = 1; angles(flag,line); } else if (strcmp(keyword,"Dihedrals") == 0) { if (ndihedrals == 0) error->all(FLERR,"Molecule file has dihedrals " - "but no ndihedrals setting"); + "but no ndihedrals setting"); dihedralflag = tag_require = 1; dihedrals(flag,line); } else if (strcmp(keyword,"Impropers") == 0) { if (nimpropers == 0) error->all(FLERR,"Molecule file has impropers " - "but no nimpropers setting"); + "but no nimpropers setting"); improperflag = tag_require = 1; impropers(flag,line); @@ -552,26 +566,26 @@ void Molecule::read(int flag) shakeatomflag = tag_require = 1; if (shaketypeflag) shakeflag = 1; if (!shakeflagflag) - error->all(FLERR,"Molecule file shake flags not before shake atoms"); + error->all(FLERR,"Molecule file shake flags not before shake atoms"); if (flag) shakeatom_read(line); else skip_lines(natoms,line); } else if (strcmp(keyword,"Shake Bond Types") == 0) { shaketypeflag = 1; if (shakeatomflag) shakeflag = 1; if (!shakeflagflag) - error->all(FLERR,"Molecule file shake flags not before shake bonds"); + error->all(FLERR,"Molecule file shake flags not before shake bonds"); if (flag) shaketype_read(line); else skip_lines(natoms,line); } else if (strcmp(keyword,"Body Integers") == 0) { if (bodyflag == 0 || nibody == 0) - error->all(FLERR,"Molecule file has body params " + error->all(FLERR,"Molecule file has body params " "but no setting for them"); ibodyflag = 1; body(flag,0,line); } else if (strcmp(keyword,"Body Doubles") == 0) { if (bodyflag == 0 || ndbody == 0) - error->all(FLERR,"Molecule file has body params " + error->all(FLERR,"Molecule file has body params " "but no setting for them"); dbodyflag = 1; body(flag,1,line); @@ -601,14 +615,12 @@ void Molecule::read(int flag) } // auto-generate special bonds if needed and not in file - // set maxspecial on first pass, so allocate() has a size if (bondflag && specialflag == 0) { if (domain->box_exist == 0) error->all(FLERR,"Cannot auto-generate special bonds before " "simulation box is defined"); - maxspecial = atom->maxspecial; if (flag) { special_generate(); specialflag = 1; @@ -618,10 +630,10 @@ void Molecule::read(int flag) // body particle must have natom = 1 // set radius by having body class compute its own radius - + if (bodyflag) { radiusflag = 1; - if (natoms != 1) + if (natoms != 1) error->all(FLERR,"Molecule natoms must be 1 for body particle"); if (sizescale != 1.0) error->all(FLERR,"Molecule sizescale must be 1.0 for body particle"); @@ -641,12 +653,9 @@ void Molecule::coords(char *line) int tmp; for (int i = 0; i < natoms; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 4) - error->all(FLERR,"Invalid Coords section in molecule file"); - } - sscanf(line,"%d %lg %lg %lg",&tmp,&x[i][0],&x[i][1],&x[i][2]); + if (4 != sscanf(line,"%d %lg %lg %lg",&tmp,&x[i][0],&x[i][1],&x[i][2])) + error->all(FLERR,"Invalid Coords section in molecule file"); + x[i][0] *= sizescale; x[i][1] *= sizescale; x[i][2] *= sizescale; @@ -669,12 +678,8 @@ void Molecule::types(char *line) int tmp; for (int i = 0; i < natoms; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 2) - error->all(FLERR,"Invalid Types section in molecule file"); - } - sscanf(line,"%d %d",&tmp,&type[i]); + if (2 != sscanf(line,"%d %d",&tmp,&type[i])) + error->all(FLERR,"Invalid Types section in molecule file"); type[i] += toffset; } @@ -695,12 +700,8 @@ void Molecule::charges(char *line) int tmp; for (int i = 0; i < natoms; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 2) - error->all(FLERR,"Invalid Charges section in molecule file"); - } - sscanf(line,"%d %lg",&tmp,&q[i]); + if (2 != sscanf(line,"%d %lg",&tmp,&q[i])) + error->all(FLERR,"Invalid Charges section in molecule file"); } } @@ -714,12 +715,8 @@ void Molecule::diameters(char *line) maxradius = 0.0; for (int i = 0; i < natoms; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 2) - error->all(FLERR,"Invalid Diameters section in molecule file"); - } - sscanf(line,"%d %lg",&tmp,&radius[i]); + if (2 != sscanf(line,"%d %lg",&tmp,&radius[i])) + error->all(FLERR,"Invalid Diameters section in molecule file"); radius[i] *= sizescale; radius[i] *= 0.5; maxradius = MAX(maxradius,radius[i]); @@ -739,12 +736,8 @@ void Molecule::masses(char *line) int tmp; for (int i = 0; i < natoms; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 2) - error->all(FLERR,"Invalid Masses section in molecule file"); - } - sscanf(line,"%d %lg",&tmp,&rmass[i]); + if (2 != sscanf(line,"%d %lg",&tmp,&rmass[i])) + error->all(FLERR,"Invalid Masses section in molecule file"); rmass[i] *= sizescale*sizescale*sizescale; } @@ -773,17 +766,13 @@ void Molecule::bonds(int flag, char *line) for (int i = 0; i < nbonds; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 4) - error->all(FLERR,"Invalid Bonds section in molecule file"); - } - sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT, - &tmp,&itype,&atom1,&atom2); + if (4 != sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT, + &tmp,&itype,&atom1,&atom2)) + error->all(FLERR,"Invalid Bonds section in molecule file"); itype += boffset; if (atom1 <= 0 || atom1 > natoms || - atom2 <= 0 || atom2 > natoms) + atom2 <= 0 || atom2 > natoms) error->one(FLERR,"Invalid atom ID in Bonds section of molecule file"); if (itype <= 0) error->one(FLERR,"Invalid bond type in Bonds section of molecule file"); @@ -795,10 +784,10 @@ void Molecule::bonds(int flag, char *line) bond_atom[m][num_bond[m]] = atom2; num_bond[m]++; if (newton_bond == 0) { - m = atom2-1; - bond_type[m][num_bond[m]] = itype; - bond_atom[m][num_bond[m]] = atom1; - num_bond[m]++; + m = atom2-1; + bond_type[m][num_bond[m]] = itype; + bond_atom[m][num_bond[m]] = atom1; + num_bond[m]++; } } else { count[atom1-1]++; @@ -835,13 +824,9 @@ void Molecule::angles(int flag, char *line) for (int i = 0; i < nangles; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 5) - error->all(FLERR,"Invalid Angles section in molecule file"); - } - sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT, - &tmp,&itype,&atom1,&atom2,&atom3); + if (5 != sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT, + &tmp,&itype,&atom1,&atom2,&atom3)) + error->all(FLERR,"Invalid Angles section in molecule file"); itype += aoffset; if (atom1 <= 0 || atom1 > natoms || @@ -860,24 +845,24 @@ void Molecule::angles(int flag, char *line) angle_atom3[m][num_angle[m]] = atom3; num_angle[m]++; if (newton_bond == 0) { - m = atom1-1; - angle_type[m][num_angle[m]] = itype; - angle_atom1[m][num_angle[m]] = atom1; - angle_atom2[m][num_angle[m]] = atom2; - angle_atom3[m][num_angle[m]] = atom3; - num_angle[m]++; - m = atom3-1; - angle_type[m][num_angle[m]] = itype; - angle_atom1[m][num_angle[m]] = atom1; - angle_atom2[m][num_angle[m]] = atom2; - angle_atom3[m][num_angle[m]] = atom3; - num_angle[m]++; + m = atom1-1; + angle_type[m][num_angle[m]] = itype; + angle_atom1[m][num_angle[m]] = atom1; + angle_atom2[m][num_angle[m]] = atom2; + angle_atom3[m][num_angle[m]] = atom3; + num_angle[m]++; + m = atom3-1; + angle_type[m][num_angle[m]] = itype; + angle_atom1[m][num_angle[m]] = atom1; + angle_atom2[m][num_angle[m]] = atom2; + angle_atom3[m][num_angle[m]] = atom3; + num_angle[m]++; } } else { count[atom2-1]++; if (newton_bond == 0) { - count[atom1-1]++; - count[atom3-1]++; + count[atom1-1]++; + count[atom3-1]++; } } } @@ -911,14 +896,10 @@ void Molecule::dihedrals(int flag, char *line) for (int i = 0; i < ndihedrals; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 6) - error->all(FLERR,"Invalid Dihedrals section in molecule file"); - } - sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " + if (6 != sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " ", - &tmp,&itype,&atom1,&atom2,&atom3,&atom4); + &tmp,&itype,&atom1,&atom2,&atom3,&atom4)) + error->all(FLERR,"Invalid Dihedrals section in molecule file"); itype += doffset; if (atom1 <= 0 || atom1 > natoms || @@ -926,10 +907,10 @@ void Molecule::dihedrals(int flag, char *line) atom3 <= 0 || atom3 > natoms || atom4 <= 0 || atom4 > natoms) error->one(FLERR, - "Invalid atom ID in dihedrals section of molecule file"); + "Invalid atom ID in dihedrals section of molecule file"); if (itype <= 0) error->one(FLERR, - "Invalid dihedral type in dihedrals section of molecule file"); + "Invalid dihedral type in dihedrals section of molecule file"); if (flag) { m = atom2-1; @@ -941,34 +922,34 @@ void Molecule::dihedrals(int flag, char *line) dihedral_atom4[m][num_dihedral[m]] = atom4; num_dihedral[m]++; if (newton_bond == 0) { - m = atom1-1; - dihedral_type[m][num_dihedral[m]] = itype; - dihedral_atom1[m][num_dihedral[m]] = atom1; - dihedral_atom2[m][num_dihedral[m]] = atom2; - dihedral_atom3[m][num_dihedral[m]] = atom3; - dihedral_atom4[m][num_dihedral[m]] = atom4; - num_dihedral[m]++; - m = atom3-1; - dihedral_type[m][num_dihedral[m]] = itype; - dihedral_atom1[m][num_dihedral[m]] = atom1; - dihedral_atom2[m][num_dihedral[m]] = atom2; - dihedral_atom3[m][num_dihedral[m]] = atom3; - dihedral_atom4[m][num_dihedral[m]] = atom4; - num_dihedral[m]++; - m = atom4-1; - dihedral_type[m][num_dihedral[m]] = itype; - dihedral_atom1[m][num_dihedral[m]] = atom1; - dihedral_atom2[m][num_dihedral[m]] = atom2; - dihedral_atom3[m][num_dihedral[m]] = atom3; - dihedral_atom4[m][num_dihedral[m]] = atom4; - num_dihedral[m]++; + m = atom1-1; + dihedral_type[m][num_dihedral[m]] = itype; + dihedral_atom1[m][num_dihedral[m]] = atom1; + dihedral_atom2[m][num_dihedral[m]] = atom2; + dihedral_atom3[m][num_dihedral[m]] = atom3; + dihedral_atom4[m][num_dihedral[m]] = atom4; + num_dihedral[m]++; + m = atom3-1; + dihedral_type[m][num_dihedral[m]] = itype; + dihedral_atom1[m][num_dihedral[m]] = atom1; + dihedral_atom2[m][num_dihedral[m]] = atom2; + dihedral_atom3[m][num_dihedral[m]] = atom3; + dihedral_atom4[m][num_dihedral[m]] = atom4; + num_dihedral[m]++; + m = atom4-1; + dihedral_type[m][num_dihedral[m]] = itype; + dihedral_atom1[m][num_dihedral[m]] = atom1; + dihedral_atom2[m][num_dihedral[m]] = atom2; + dihedral_atom3[m][num_dihedral[m]] = atom3; + dihedral_atom4[m][num_dihedral[m]] = atom4; + num_dihedral[m]++; } } else { count[atom2-1]++; if (newton_bond == 0) { - count[atom1-1]++; - count[atom3-1]++; - count[atom4-1]++; + count[atom1-1]++; + count[atom3-1]++; + count[atom4-1]++; } } } @@ -1002,14 +983,10 @@ void Molecule::impropers(int flag, char *line) for (int i = 0; i < nimpropers; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 6) - error->all(FLERR,"Invalid Impropers section in molecule file"); - } - sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " + if (6 != sscanf(line,"%d %d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " ", - &tmp,&itype,&atom1,&atom2,&atom3,&atom4); + &tmp,&itype,&atom1,&atom2,&atom3,&atom4)) + error->all(FLERR,"Invalid Impropers section in molecule file"); itype += ioffset; if (atom1 <= 0 || atom1 > natoms || @@ -1017,10 +994,10 @@ void Molecule::impropers(int flag, char *line) atom3 <= 0 || atom3 > natoms || atom4 <= 0 || atom4 > natoms) error->one(FLERR, - "Invalid atom ID in impropers section of molecule file"); + "Invalid atom ID in impropers section of molecule file"); if (itype <= 0) error->one(FLERR, - "Invalid improper type in impropers section of molecule file"); + "Invalid improper type in impropers section of molecule file"); if (flag) { m = atom2-1; @@ -1032,34 +1009,34 @@ void Molecule::impropers(int flag, char *line) improper_atom4[m][num_improper[m]] = atom4; num_improper[m]++; if (newton_bond == 0) { - m = atom1-1; - improper_type[m][num_improper[m]] = itype; - improper_atom1[m][num_improper[m]] = atom1; - improper_atom2[m][num_improper[m]] = atom2; - improper_atom3[m][num_improper[m]] = atom3; - improper_atom4[m][num_improper[m]] = atom4; - num_improper[m]++; - m = atom3-1; - improper_type[m][num_improper[m]] = itype; - improper_atom1[m][num_improper[m]] = atom1; - improper_atom2[m][num_improper[m]] = atom2; - improper_atom3[m][num_improper[m]] = atom3; - improper_atom4[m][num_improper[m]] = atom4; - num_improper[m]++; - m = atom4-1; - improper_type[m][num_improper[m]] = itype; - improper_atom1[m][num_improper[m]] = atom1; - improper_atom2[m][num_improper[m]] = atom2; - improper_atom3[m][num_improper[m]] = atom3; - improper_atom4[m][num_improper[m]] = atom4; - num_improper[m]++; + m = atom1-1; + improper_type[m][num_improper[m]] = itype; + improper_atom1[m][num_improper[m]] = atom1; + improper_atom2[m][num_improper[m]] = atom2; + improper_atom3[m][num_improper[m]] = atom3; + improper_atom4[m][num_improper[m]] = atom4; + num_improper[m]++; + m = atom3-1; + improper_type[m][num_improper[m]] = itype; + improper_atom1[m][num_improper[m]] = atom1; + improper_atom2[m][num_improper[m]] = atom2; + improper_atom3[m][num_improper[m]] = atom3; + improper_atom4[m][num_improper[m]] = atom4; + num_improper[m]++; + m = atom4-1; + improper_type[m][num_improper[m]] = itype; + improper_atom1[m][num_improper[m]] = atom1; + improper_atom2[m][num_improper[m]] = atom2; + improper_atom3[m][num_improper[m]] = atom3; + improper_atom4[m][num_improper[m]] = atom4; + num_improper[m]++; } } else { count[atom2-1]++; if (newton_bond == 0) { - count[atom1-1]++; - count[atom3-1]++; - count[atom4-1]++; + count[atom1-1]++; + count[atom3-1]++; + count[atom4-1]++; } } } @@ -1087,13 +1064,9 @@ void Molecule::nspecial_read(int flag, char *line) for (int i = 0; i < natoms; i++) { readline(line); - if (i == 0) { - int nwords = atom->count_words(line); - if (nwords != 4) - error->all(FLERR,"Invalid Special Bond Counts section in " - "molecule file"); - } - sscanf(line,"%d %d %d %d",&tmp,&c1,&c2,&c3); + if (4 != sscanf(line,"%d %d %d %d",&tmp,&c1,&c2,&c3)) + error->all(FLERR,"Invalid Special Bond Counts section in " + "molecule file"); if (flag) { nspecial[i][0] = c1; @@ -1117,13 +1090,13 @@ void Molecule::special_read(char *line) nwords = parse(line,words,maxspecial+1); if (nwords != nspecial[i][2]+1) error->all(FLERR,"Molecule file special list " - "does not match special count"); + "does not match special count"); for (m = 1; m < nwords; m++) { special[i][m-1] = ATOTAGINT(words[m]); if (special[i][m-1] <= 0 || special[i][m-1] > natoms || - special[i][m-1] == i+1) - error->all(FLERR,"Invalid special atom index in molecule file"); + special[i][m-1] == i+1) + error->all(FLERR,"Invalid special atom index in molecule file"); } } @@ -1140,6 +1113,12 @@ void Molecule::special_generate() tagint atom1,atom2; int count[natoms]; + // temporary array for special atoms + + tagint **tmpspecial; + memory->create(tmpspecial,natoms,atom->maxspecial,"molecule:tmpspecial"); + memset(&tmpspecial[0][0],0,sizeof(tagint)*natoms*atom->maxspecial); + for (int i = 0; i < natoms; i++) count[i] = 0; // 1-2 neighbors @@ -1151,10 +1130,10 @@ void Molecule::special_generate() atom2 = bond_atom[i][j]-1; nspecial[i][0]++; nspecial[atom2][0]++; - if (count[i] >= maxspecial || count[atom2] >= maxspecial) + if (count[i] >= atom->maxspecial || count[atom2] >= atom->maxspecial) error->one(FLERR,"Molecule auto special bond generation overflow"); - special[i][count[i]++] = atom2 + 1; - special[atom2][count[atom2]++] = i + 1; + tmpspecial[i][count[i]++] = atom2 + 1; + tmpspecial[atom2][count[atom2]++] = i + 1; } } } else { @@ -1163,9 +1142,9 @@ void Molecule::special_generate() for (int j = 0; j < num_bond[i]; j++) { atom1 = i; atom2 = bond_atom[i][j]; - if (count[atom1] >= maxspecial) + if (count[atom1] >= atom->maxspecial) error->one(FLERR,"Molecule auto special bond generation overflow"); - special[i][count[atom1]++] = atom2; + tmpspecial[i][count[atom1]++] = atom2; } } } @@ -1177,18 +1156,18 @@ void Molecule::special_generate() int dedup; for (int i = 0; i < natoms; i++) { for (int m = 0; m < nspecial[i][0]; m++) { - for (int j = 0; j < nspecial[special[i][m]-1][0]; j++) { + for (int j = 0; j < nspecial[tmpspecial[i][m]-1][0]; j++) { dedup = 0; for (int k =0; k < count[i]; k++) { - if (special[special[i][m]-1][j] == special[i][k] || - special[special[i][m]-1][j] == i+1) { + if (tmpspecial[tmpspecial[i][m]-1][j] == tmpspecial[i][k] || + tmpspecial[tmpspecial[i][m]-1][j] == i+1) { dedup = 1; } } if (!dedup) { - if (count[i] >= maxspecial) + if (count[i] >= atom->maxspecial) error->one(FLERR,"Molecule auto special bond generation overflow"); - special[i][count[i]++] = special[special[i][m]-1][j]; + tmpspecial[i][count[i]++] = tmpspecial[tmpspecial[i][m]-1][j]; nspecial[i][1]++; } } @@ -1201,23 +1180,34 @@ void Molecule::special_generate() for (int i = 0; i < natoms; i++) { for (int m = nspecial[i][0]; m < nspecial[i][1]; m++) { - for (int j = 0; j < nspecial[special[i][m]-1][0]; j++) { + for (int j = 0; j < nspecial[tmpspecial[i][m]-1][0]; j++) { dedup = 0; for (int k =0; k < count[i]; k++) { - if (special[special[i][m]-1][j] == special[i][k] || - special[special[i][m]-1][j] == i+1) { + if (tmpspecial[tmpspecial[i][m]-1][j] == tmpspecial[i][k] || + tmpspecial[tmpspecial[i][m]-1][j] == i+1) { dedup = 1; } } if (!dedup) { - if (count[i] >= maxspecial) + if (count[i] >= atom->maxspecial) error->one(FLERR,"Molecule auto special bond generation overflow"); - special[i][count[i]++] = special[special[i][m]-1][j]; + tmpspecial[i][count[i]++] = tmpspecial[tmpspecial[i][m]-1][j]; nspecial[i][2]++; } } } } + + maxspecial = 0; + for (int i = 0; i < natoms; i++) + maxspecial = MAX(maxspecial,nspecial[i][2]); + + memory->create(special,natoms,maxspecial,"molecule:special"); + for (int i = 0; i < natoms; i++) + for (int j = 0; j < nspecial[i][2]; j++) + special[i][j] = tmpspecial[i][j]; + + memory->destroy(tmpspecial); } /* ---------------------------------------------------------------------- @@ -1229,7 +1219,8 @@ void Molecule::shakeflag_read(char *line) int tmp; for (int i = 0; i < natoms; i++) { readline(line); - sscanf(line,"%d %d",&tmp,&shake_flag[i]); + if (2 != sscanf(line,"%d %d",&tmp,&shake_flag[i])) + error->all(FLERR,"Invalid Shake Flags section in molecule file"); } for (int i = 0; i < natoms; i++) @@ -1243,23 +1234,32 @@ void Molecule::shakeflag_read(char *line) void Molecule::shakeatom_read(char *line) { - int tmp; + int tmp, nmatch=0, nwant=0; for (int i = 0; i < natoms; i++) { readline(line); - if (shake_flag[i] == 1) - sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT, - &tmp,&shake_atom[i][0],&shake_atom[i][1],&shake_atom[i][2]); - else if (shake_flag[i] == 2) - sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT, - &tmp,&shake_atom[i][0],&shake_atom[i][1]); - else if (shake_flag[i] == 3) - sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT, - &tmp,&shake_atom[i][0],&shake_atom[i][1],&shake_atom[i][2]); - else if (shake_flag[i] == 4) - sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT " " - TAGINT_FORMAT " " TAGINT_FORMAT, - &tmp,&shake_atom[i][0],&shake_atom[i][1], - &shake_atom[i][2],&shake_atom[i][3]); + if (shake_flag[i] == 1) { + nmatch = sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT + " " TAGINT_FORMAT,&tmp,&shake_atom[i][0], + &shake_atom[i][1],&shake_atom[i][2]); + nwant = 4; + } else if (shake_flag[i] == 2) { + nmatch = sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT, + &tmp,&shake_atom[i][0],&shake_atom[i][1]); + nwant = 3; + } else if (shake_flag[i] == 3) { + nmatch = sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT + " " TAGINT_FORMAT,&tmp,&shake_atom[i][0], + &shake_atom[i][1],&shake_atom[i][2]); + nwant = 4; + } else if (shake_flag[i] == 4) { + nmatch = sscanf(line,"%d " TAGINT_FORMAT " " TAGINT_FORMAT " " + TAGINT_FORMAT " " TAGINT_FORMAT, + &tmp,&shake_atom[i][0],&shake_atom[i][1], + &shake_atom[i][2],&shake_atom[i][3]); + nwant = 5; + } + if (nmatch != nwant) + error->all(FLERR,"Invalid shake atom in molecule file"); } for (int i = 0; i < natoms; i++) { @@ -1277,19 +1277,27 @@ void Molecule::shakeatom_read(char *line) void Molecule::shaketype_read(char *line) { - int tmp; + int tmp, nmatch=0, nwant=0; for (int i = 0; i < natoms; i++) { readline(line); - if (shake_flag[i] == 1) - sscanf(line,"%d %d %d %d",&tmp, - &shake_type[i][0],&shake_type[i][1],&shake_type[i][2]); - else if (shake_flag[i] == 2) - sscanf(line,"%d %d",&tmp,&shake_type[i][0]); - else if (shake_flag[i] == 3) - sscanf(line,"%d %d %d",&tmp,&shake_type[i][0],&shake_type[i][1]); - else if (shake_flag[i] == 4) - sscanf(line,"%d %d %d %d",&tmp, - &shake_type[i][0],&shake_type[i][1],&shake_type[i][2]); + if (shake_flag[i] == 1) { + nmatch = sscanf(line,"%d %d %d %d",&tmp,&shake_type[i][0], + &shake_type[i][1],&shake_type[i][2]); + nwant = 4; + } else if (shake_flag[i] == 2) { + nmatch = sscanf(line,"%d %d",&tmp,&shake_type[i][0]); + nwant = 2; + } else if (shake_flag[i] == 3) { + nmatch = sscanf(line,"%d %d %d",&tmp,&shake_type[i][0], + &shake_type[i][1]); + nwant = 3; + } else if (shake_flag[i] == 4) { + nmatch = sscanf(line,"%d %d %d %d",&tmp,&shake_type[i][0], + &shake_type[i][1],&shake_type[i][2]); + nwant = 4; + } + if (nmatch != nwant) + error->all(FLERR,"Invalid shake type data in molecule file"); } for (int i = 0; i < natoms; i++) { @@ -1323,19 +1331,19 @@ void Molecule::body(int flag, int pflag, char *line) ncount = atom->count_words(line); if (ncount == 0) error->one(FLERR,"Too few values in body section of molecule file"); - if (nword+ncount > nparam) + if (nword+ncount > nparam) error->all(FLERR,"Too many values in body section of molecule file"); - + if (flag) { if (pflag == 0) { ibodyparams[nword++] = force->inumeric(FLERR,strtok(line," \t\n\r\f")); for (i = 1; i < ncount; i++) - ibodyparams[nword++] = + ibodyparams[nword++] = force->inumeric(FLERR,strtok(NULL," \t\n\r\f")); } else { dbodyparams[nword++] = force->numeric(FLERR,strtok(line," \t\n\r\f")); for (i = 1; i < ncount; i++) - dbodyparams[nword++] = + dbodyparams[nword++] = force->numeric(FLERR,strtok(NULL," \t\n\r\f")); } } else nword += ncount; @@ -1480,7 +1488,7 @@ void Molecule::allocate() if (radiusflag) memory->create(radius,natoms,"molecule:radius"); if (rmassflag) memory->create(rmass,natoms,"molecule:rmass"); - // always allocate num_bond,num_angle,etc and special+nspecial + // always allocate num_bond,num_angle,etc and nspecial // even if not in molecule file, initialize to 0 // this is so methods that use these arrays don't have to check they exist @@ -1492,55 +1500,55 @@ void Molecule::allocate() for (int i = 0; i < natoms; i++) num_dihedral[i] = 0; memory->create(num_improper,natoms,"molecule:num_improper"); for (int i = 0; i < natoms; i++) num_improper[i] = 0; - - memory->create(special,natoms,maxspecial,"molecule:special"); - memory->create(nspecial,natoms,3,"molecule:nspecial"); for (int i = 0; i < natoms; i++) nspecial[i][0] = nspecial[i][1] = nspecial[i][2] = 0; + if (specialflag) + memory->create(special,natoms,maxspecial,"molecule:special"); + if (bondflag) { memory->create(bond_type,natoms,bond_per_atom, - "molecule:bond_type"); + "molecule:bond_type"); memory->create(bond_atom,natoms,bond_per_atom, - "molecule:bond_atom"); + "molecule:bond_atom"); } if (angleflag) { memory->create(angle_type,natoms,angle_per_atom, - "molecule:angle_type"); + "molecule:angle_type"); memory->create(angle_atom1,natoms,angle_per_atom, - "molecule:angle_atom1"); + "molecule:angle_atom1"); memory->create(angle_atom2,natoms,angle_per_atom, - "molecule:angle_atom2"); + "molecule:angle_atom2"); memory->create(angle_atom3,natoms,angle_per_atom, - "molecule:angle_atom3"); + "molecule:angle_atom3"); } if (dihedralflag) { memory->create(dihedral_type,natoms,dihedral_per_atom, - "molecule:dihedral_type"); + "molecule:dihedral_type"); memory->create(dihedral_atom1,natoms,dihedral_per_atom, - "molecule:dihedral_atom1"); + "molecule:dihedral_atom1"); memory->create(dihedral_atom2,natoms,dihedral_per_atom, - "molecule:dihedral_atom2"); + "molecule:dihedral_atom2"); memory->create(dihedral_atom3,natoms,dihedral_per_atom, - "molecule:dihedral_atom3"); + "molecule:dihedral_atom3"); memory->create(dihedral_atom4,natoms,dihedral_per_atom, - "molecule:dihedral_atom4"); + "molecule:dihedral_atom4"); } if (improperflag) { memory->create(improper_type,natoms,improper_per_atom, - "molecule:improper_type"); + "molecule:improper_type"); memory->create(improper_atom1,natoms,improper_per_atom, - "molecule:improper_atom1"); + "molecule:improper_atom1"); memory->create(improper_atom2,natoms,improper_per_atom, - "molecule:improper_atom2"); + "molecule:improper_atom2"); memory->create(improper_atom3,natoms,improper_per_atom, - "molecule:improper_atom3"); + "molecule:improper_atom3"); memory->create(improper_atom4,natoms,improper_per_atom, - "molecule:improper_atom4"); + "molecule:improper_atom4"); } if (shakeflag) { @@ -1653,7 +1661,7 @@ void Molecule::parse_keyword(int flag, char *line, char *keyword) if (me == 0) { if (fgets(line,MAXLINE,fp) == NULL) eof = 1; while (eof == 0 && strspn(line," \t\n\r") == strlen(line)) { - if (fgets(line,MAXLINE,fp) == NULL) eof = 1; + if (fgets(line,MAXLINE,fp) == NULL) eof = 1; } if (fgets(keyword,MAXLINE,fp) == NULL) eof = 1; } diff --git a/src/neigh_list.cpp b/src/neigh_list.cpp index a5ca7a5366..93f4b13bf2 100644 --- a/src/neigh_list.cpp +++ b/src/neigh_list.cpp @@ -40,16 +40,18 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp) ilist = NULL; numneigh = NULL; firstneigh = NULL; - firstdouble = NULL; // defaults, but may be reset by post_constructor() occasional = 0; ghost = 0; ssa = 0; + history = 0; + respaouter = 0; + respamiddle = 0; + respainner = 0; copy = 0; copymode = 0; - dnum = 0; // ptrs @@ -60,17 +62,24 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp) listskip = NULL; listfull = NULL; - listhistory = NULL; - fix_history = NULL; - - respamiddle = 0; - listinner = NULL; - listmiddle = NULL; - fix_bond = NULL; ipage = NULL; - dpage = NULL; + + // extra rRESPA lists + + inum_inner = gnum_inner = 0; + ilist_inner = NULL; + numneigh_inner = NULL; + firstneigh_inner = NULL; + + inum_middle = gnum_middle = 0; + ilist_middle = NULL; + numneigh_middle = NULL; + firstneigh_middle = NULL; + + ipage_inner = NULL; + ipage_middle = NULL; // Kokkos package @@ -79,7 +88,7 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp) // USER-DPD package - ndxAIR_ssa = NULL; + np = NULL; } /* ---------------------------------------------------------------------- */ @@ -91,18 +100,25 @@ NeighList::~NeighList() memory->destroy(ilist); memory->destroy(numneigh); memory->sfree(firstneigh); - memory->sfree(firstdouble); - delete [] ipage; - delete [] dpage; + } + + if (respainner) { + memory->destroy(ilist_inner); + memory->destroy(numneigh_inner); + memory->sfree(firstneigh_inner); + delete [] ipage_inner; + } + + if (respamiddle) { + memory->destroy(ilist_middle); + memory->destroy(numneigh_middle); + memory->sfree(firstneigh_middle); + delete [] ipage_middle; } delete [] iskip; memory->destroy(ijskip); - - if (ssa) { - memory->sfree(ndxAIR_ssa); - } } /* ---------------------------------------------------------------------- @@ -111,8 +127,7 @@ NeighList::~NeighList() copy -> set listcopy for list to copy from skip -> set listskip for list to skip from, create copy of itype,ijtype halffull -> set listfull for full list to derive from - history -> set LH and FH ptrs in partner list that uses the history info - respaouter -> set listinner/listmiddle for other rRESPA lists + respaouter -> set all 3 outer/middle/inner flags bond -> set fix_bond to Fix that made the request ------------------------------------------------------------------------- */ @@ -123,8 +138,11 @@ void NeighList::post_constructor(NeighRequest *nq) occasional = nq->occasional; ghost = nq->ghost; ssa = nq->ssa; + history = nq->history; + respaouter = nq->respaouter; + respamiddle = nq->respamiddle; + respainner = nq->respainner; copy = nq->copy; - dnum = nq->dnum; if (nq->copy) listcopy = neighbor->lists[nq->copylist]; @@ -144,24 +162,6 @@ void NeighList::post_constructor(NeighRequest *nq) if (nq->halffull) listfull = neighbor->lists[nq->halffulllist]; - if (nq->history) { - neighbor->lists[nq->historylist]->listhistory = this; - int tmp; - neighbor->lists[nq->historylist]->fix_history = - (Fix *) ((Pair *) nq->requestor)->extract("history",tmp); - } - - if (nq->respaouter) { - if (nq->respamiddlelist < 0) { - respamiddle = 0; - listinner = neighbor->lists[nq->respainnerlist]; - } else { - respamiddle = 1; - listmiddle = neighbor->lists[nq->respamiddlelist]; - listinner = neighbor->lists[nq->respainnerlist]; - } - } - if (nq->bond) fix_bond = (Fix *) nq->requestor; } @@ -177,40 +177,39 @@ void NeighList::setup_pages(int pgsize_caller, int oneatom_caller) for (int i = 0; i < nmypage; i++) ipage[i].init(oneatom,pgsize,PGDELTA); - if (dnum) { - dpage = new MyPage[nmypage]; + if (respainner) { + ipage_inner = new MyPage[nmypage]; for (int i = 0; i < nmypage; i++) - dpage[i].init(dnum*oneatom,dnum*pgsize,PGDELTA); - } else dpage = NULL; + ipage_inner[i].init(oneatom,pgsize,PGDELTA); + } + + if (respamiddle) { + ipage_middle = new MyPage[nmypage]; + for (int i = 0; i < nmypage; i++) + ipage_middle[i].init(oneatom,pgsize,PGDELTA); + } } /* ---------------------------------------------------------------------- grow per-atom data to allow for nlocal/nall atoms - for parent lists: - also trigger grow in child list(s) which are not built themselves - history calls grow() in listhistory - respaouter calls grow() in respainner, respamiddle triggered by neighbor list build not called if a copy list ------------------------------------------------------------------------- */ void NeighList::grow(int nlocal, int nall) { - // trigger grow() in children before possible return - - if (listhistory) listhistory->grow(nlocal,nall); - if (listinner) listinner->grow(nlocal,nall); - if (listmiddle) listmiddle->grow(nlocal,nall); - // skip if data structs are already big enough - if (ghost) { + if (ssa) { + if ((nlocal * 3) + nall <= maxatom) return; + } else if (ghost) { if (nall <= maxatom) return; } else { if (nlocal <= maxatom) return; } - maxatom = atom->nmax; + if (ssa) maxatom = (nlocal * 3) + nall; + else maxatom = atom->nmax; memory->destroy(ilist); memory->destroy(numneigh); @@ -219,16 +218,25 @@ void NeighList::grow(int nlocal, int nall) memory->create(numneigh,maxatom,"neighlist:numneigh"); firstneigh = (int **) memory->smalloc(maxatom*sizeof(int *), "neighlist:firstneigh"); - if (dnum) { - memory->sfree(firstdouble); - firstdouble = (double **) memory->smalloc(maxatom*sizeof(double *), - "neighlist:firstdouble"); + + if (respainner) { + memory->destroy(ilist_inner); + memory->destroy(numneigh_inner); + memory->sfree(firstneigh_inner); + memory->create(ilist_inner,maxatom,"neighlist:ilist_inner"); + memory->create(numneigh_inner,maxatom,"neighlist:numneigh_inner"); + firstneigh_inner = (int **) memory->smalloc(maxatom*sizeof(int *), + "neighlist:firstneigh_inner"); } - if (ssa) { - if (ndxAIR_ssa) memory->sfree(ndxAIR_ssa); - ndxAIR_ssa = (uint16_t (*)[8]) memory->smalloc(sizeof(uint16_t)*8*maxatom, - "neighlist:ndxAIR_ssa"); + if (respamiddle) { + memory->destroy(ilist_middle); + memory->destroy(numneigh_middle); + memory->sfree(firstneigh_middle); + memory->create(ilist_middle,maxatom,"neighlist:ilist_middle"); + memory->create(numneigh_middle,maxatom,"neighlist:numneigh_middle"); + firstneigh_middle = (int **) memory->smalloc(maxatom*sizeof(int *), + "neighlist:firstneigh_middle"); } } @@ -260,22 +268,20 @@ void NeighList::print_attributes() printf(" %d = size\n",rq->size); printf(" %d = history\n",rq->history); printf(" %d = granonesided\n",rq->granonesided); - printf(" %d = respainner\n",rq->respainner); - printf(" %d = respamiddle\n",rq->respamiddle); printf(" %d = respaouter\n",rq->respaouter); + printf(" %d = respamiddle\n",rq->respamiddle); + printf(" %d = respainner\n",rq->respainner); printf(" %d = bond\n",rq->bond); printf(" %d = omp\n",rq->omp); printf(" %d = intel\n",rq->intel); printf(" %d = kokkos host\n",rq->kokkos_host); printf(" %d = kokkos device\n",rq->kokkos_device); printf(" %d = ssa flag\n",ssa); - printf(" %d = dnum\n",dnum); printf("\n"); printf(" %d = skip flag\n",rq->skip); printf(" %d = off2on\n",rq->off2on); printf(" %d = copy flag\n",rq->copy); printf(" %d = half/full\n",rq->halffull); - printf(" %d = history/partner\n",rq->history_partner); printf("\n"); } @@ -299,14 +305,25 @@ bigint NeighList::memory_usage() bytes += ipage[i].size(); } - if (dnum && dpage) { - for (int i = 0; i < nmypage; i++) { - bytes += maxatom * sizeof(double *); - bytes += dpage[i].size(); + if (respainner) { + bytes += memory->usage(ilist_inner,maxatom); + bytes += memory->usage(numneigh_inner,maxatom); + bytes += maxatom * sizeof(int *); + if (ipage_inner) { + for (int i = 0; i < nmypage; i++) + bytes += ipage_inner[i].size(); } } - if (ndxAIR_ssa) bytes += sizeof(uint16_t) * 8 * maxatom; + if (respamiddle) { + bytes += memory->usage(ilist_middle,maxatom); + bytes += memory->usage(numneigh_middle,maxatom); + bytes += maxatom * sizeof(int *); + if (ipage_middle) { + for (int i = 0; i < nmypage; i++) + bytes += ipage_middle[i].size(); + } + } return bytes; } diff --git a/src/neigh_list.h b/src/neigh_list.h index 3fb3868114..755a1bf134 100644 --- a/src/neigh_list.h +++ b/src/neigh_list.h @@ -34,9 +34,12 @@ class NeighList : protected Pointers { int occasional; // 0 if build every reneighbor, 1 if not int ghost; // 1 if list stores neighbors of ghosts int ssa; // 1 if list stores Shardlow data - int copy; // 1 if this list is (host) copied from another list + int history; // 1 if there is neigh history (FixNeighHist) + int respaouter; // 1 if list is a rRespa outer list + int respamiddle; // 1 if there is also a rRespa middle list + int respainner; // 1 if there is also a rRespa inner list + int copy; // 1 if this list is copied from another list int copymode; // 1 if this is a Kokkos on-device copy - int dnum; // # of doubles per neighbor, 0 if none // data structs to store neighbor pairs I,J and associated values @@ -45,13 +48,28 @@ class NeighList : protected Pointers { int *ilist; // local indices of I atoms int *numneigh; // # of J neighbors for each I atom int **firstneigh; // ptr to 1st J int value of each I atom - double **firstdouble; // ptr to 1st J double value of each I atom int maxatom; // size of allocated per-atom arrays int pgsize; // size of each page int oneatom; // max size for one atom MyPage *ipage; // pages of neighbor indices - MyPage *dpage; // pages of neighbor doubles, if dnum > 0 + + // data structs to store rRESPA neighbor pairs I,J and associated values + + int inum_inner; // # of I atoms neighbors are stored for + int gnum_inner; // # of ghost atoms neighbors are stored for + int *ilist_inner; // local indices of I atoms + int *numneigh_inner; // # of J neighbors for each I atom + int **firstneigh_inner; // ptr to 1st J int value of each I atom + + int inum_middle; // # of I atoms neighbors are stored for + int gnum_middle; // # of ghost atoms neighbors are stored for + int *ilist_middle; // local indices of I atoms + int *numneigh_middle; // # of J neighbors for each I atom + int **firstneigh_middle; // ptr to 1st J int value of each I atom + + MyPage *ipage_inner; // pages of neighbor indices for inner + MyPage *ipage_middle; // pages of neighbor indices for middle // atom types to skip when building list // copied info from corresponding request into realloced vec/array @@ -65,13 +83,6 @@ class NeighList : protected Pointers { NeighList *listskip; // me = skip list, point to list I skip from NeighList *listfull; // me = half list, point to full I derive from - NeighList *listhistory; // list storing neigh history - class Fix *fix_history; // fix that stores history info - - int respamiddle; // 1 if this respaouter has middle list - NeighList *listinner; // me = respaouter, point to respainner - NeighList *listmiddle; // me = respaouter, point to respamiddle - class Fix *fix_bond; // fix that stores bond info // Kokkos package @@ -81,7 +92,7 @@ class NeighList : protected Pointers { // USER-DPD package and Shardlow Splitting Algorithm (SSA) support - uint16_t (*ndxAIR_ssa)[8]; // for each atom, last neighbor index of each AIR + class NPair *np; // ptr to NPair instance I depend on // methods diff --git a/src/neigh_request.cpp b/src/neigh_request.cpp index 8d720e766c..1ad111d9c5 100644 --- a/src/neigh_request.cpp +++ b/src/neigh_request.cpp @@ -36,13 +36,13 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp) half = 1; full = 0; - + // attribute flags, mutiple can be set to 1 // default is every reneighboring, not occasional // default is use newton_pair setting in force // default is no neighbors of ghosts // default is use cutoffs, not size of particles - // default is no additional neighbor history info + // default is no associated neighbor history info in FixNeighHistory // default is no one-sided sphere/surface interactions (when size = 1) // default is neighbors of atoms, not bonds // default is no multilevel rRESPA neighbors @@ -68,10 +68,8 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp) cut = 0; cutoff = 0.0; - dnum = 0; - // skip info, default is no skipping - + skip = 0; iskip = NULL; ijskip = NULL; @@ -88,11 +86,6 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp) copylist = -1; halffull = 0; halffulllist = -1; - history_partner = 0; - historylist = -1; - respaouterlist = -1; - respamiddlelist = -1; - respainnerlist = -1; unique = 0; // internal settings @@ -130,7 +123,7 @@ int NeighRequest::identical(NeighRequest *other) // only compare settings made by requestors // not settings made later by Neighbor class - + if (pair != other->pair) same = 0; if (fix != other->fix) same = 0; if (compute != other->compute) same = 0; @@ -158,10 +151,8 @@ int NeighRequest::identical(NeighRequest *other) if (copy != other->copy) same = 0; if (cutoff != other->cutoff) same = 0; - if (dnum != other->dnum) same = 0; - if (skip != other->skip) same = 0; - if (skip) same = same_skip(other); + if (same && skip && other->skip) same = same_skip(other); return same; } @@ -226,8 +217,6 @@ void NeighRequest::copy_request(NeighRequest *other, int skipflag) cut = other->cut; cutoff = other->cutoff; - dnum = other->dnum; - iskip = NULL; ijskip = NULL; diff --git a/src/neigh_request.h b/src/neigh_request.h index 70f7783a70..16e6f1a8c0 100644 --- a/src/neigh_request.h +++ b/src/neigh_request.h @@ -59,12 +59,12 @@ class NeighRequest : protected Pointers { int ghost; // 1 if includes ghost atom neighbors int size; // 1 if pair cutoff set by particle radius - int history; // 1 if stores neighbor history info + int history; // 1 if there is also neigh history info (FixNeighHist) int granonesided; // 1 if one-sided granular list for // sphere/surf interactions - int respainner; // 1 if a rRESPA inner list - int respamiddle; // 1 if a rRESPA middle list - int respaouter; // 1 if a rRESPA outer list + int respainner; // 1 if need a rRESPA inner list + int respamiddle; // 1 if need a rRESPA middle list + int respaouter; // 1 if need a rRESPA outer list int bond; // 1 if store bond neighbors instead of atom neighs int omp; // set by USER-OMP package int intel; // set by USER-INTEL package @@ -74,8 +74,6 @@ class NeighRequest : protected Pointers { int cut; // 1 if use a non-standard cutoff length double cutoff; // special cutoff distance for this list - int dnum; // # of extra floating point values stored in list - // flags set by pair hybrid int skip; // 1 if this list skips atom types from another list @@ -100,21 +98,9 @@ class NeighRequest : protected Pointers { int halffull; // 1 if half list computed from another full list int halffulllist; // index of full list to derive half from - int history_partner; // 1 if this list partners with a history list - int historylist; // index of the associated history list - // for history = 1, index of the non-history partner - - int respaouterlist; // index of respaouter/middle/inner lists - int respamiddlelist; // which this rREPSA list is associated with - int respainnerlist; // each rRESPA style list points at the others - int unique; // 1 if this list requires its own // NStencil, Nbin class - because of requestor cutoff - // pointer to FSH class, set by requestor class (not by Neighbor) - - class FixShearHistory *fix_history; // fix that stores per-atom history info - // ----------------------------- // internal settings made by Neighbor class // ----------------------------- diff --git a/src/neighbor.cpp b/src/neighbor.cpp index ef150902e3..686552656a 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -22,6 +22,10 @@ #include "neighbor.h" #include "neigh_list.h" #include "neigh_request.h" +#include "nbin.h" +#include "nstencil.h" +#include "npair.h" +#include "ntopo.h" #include "style_nbin.h" #include "style_nstencil.h" #include "style_npair.h" @@ -129,8 +133,6 @@ pairclass(NULL), pairnames(NULL), pairmasks(NULL) old_pgsize = pgsize; old_oneatom = oneatom; - zeroes = NULL; - binclass = NULL; binnames = NULL; binmasks = NULL; @@ -204,8 +206,6 @@ Neighbor::~Neighbor() if (old_requests[i]) delete old_requests[i]; memory->sfree(old_requests); - delete [] zeroes; - delete [] binclass; delete [] binnames; delete [] binmasks; @@ -662,14 +662,12 @@ int Neighbor::init_pair() // purpose is to avoid duplicate or inefficient builds // may add new requests if a needed request to derive from does not exist // methods: - // (1) other = point history and rRESPA lists at their partner lists + // (1) unique = create unique lists if cutoff is explicitly set // (2) skip = create any new non-skip lists needed by pair hybrid skip lists // (3) granular = adjust parent and skip lists for granular onesided usage // (4) h/f = pair up any matching half/full lists // (5) copy = convert as many lists as possible to copy lists // order of morph methods matters: - // (1) before (2), b/c (2) needs to know history partner pairings - // (2) after (1), b/c (2) may also need to create new history lists // (3) after (2), b/c it adjusts lists created by (2) // (4) after (2) and (3), // b/c (2) may create new full lists, (3) may change them @@ -677,7 +675,7 @@ int Neighbor::init_pair() int nrequest_original = nrequest; - morph_other(); + morph_unique(); morph_skip(); morph_granular(); // this method can change flags set by requestor morph_halffull(); @@ -804,7 +802,7 @@ int Neighbor::init_pair() } PairCreator pair_creator = pairclass[flag-1]; - neigh_pair[i] = pair_creator(lmp); + lists[i]->np = neigh_pair[i] = pair_creator(lmp); neigh_pair[i]->post_constructor(requests[i]); neigh_pair[i]->istyle = flag; @@ -823,23 +821,13 @@ int Neighbor::init_pair() } // allocate initial pages for each list, except if copy flag set - // allocate dnum vector of zeroes if set - int dnummax = 0; for (i = 0; i < nlist; i++) { if (lists[i]->copy) continue; lists[i]->setup_pages(pgsize,oneatom); - dnummax = MAX(dnummax,lists[i]->dnum); - } - - if (dnummax) { - delete [] zeroes; - zeroes = new double[dnummax]; - for (i = 0; i < dnummax; i++) zeroes[i] = 0.0; } // first-time allocation of per-atom data for lists that are built and store - // lists that are not built: granhistory, respa inner/middle (no neigh_pair) // lists that do not store: copy // use atom->nmax for both grow() args // i.e. grow first time to expanded size to avoid future reallocs @@ -919,40 +907,16 @@ int Neighbor::init_pair() /* ---------------------------------------------------------------------- scan NeighRequests to set additional flags - only for history, respaouter, custom cutoff lists + only for custom cutoff lists ------------------------------------------------------------------------- */ -void Neighbor::morph_other() +void Neighbor::morph_unique() { NeighRequest *irq; for (int i = 0; i < nrequest; i++) { irq = requests[i]; - // if history, point this list and partner list at each other - - if (irq->history) { - irq->historylist = i-1; - requests[i-1]->history_partner = 1; - requests[i-1]->historylist = i; - } - - // if respaouter, point all associated rRESPA lists at each other - - if (irq->respaouter) { - if (requests[i-1]->respainner) { - irq->respainnerlist = i-1; - requests[i-1]->respaouterlist = i; - } else { - irq->respamiddlelist = i-1; - requests[i-1]->respaouterlist = i; - requests[i-1]->respainnerlist = i-1; - irq->respainnerlist = i-2; - requests[i-2]->respaouterlist = i; - requests[i-2]->respamiddlelist = i-1; - } - } - // if cut flag set by requestor, set unique flag // this forces Pair,Stencil,Bin styles to be instantiated separately @@ -983,8 +947,6 @@ void Neighbor::morph_skip() // halffull list and its full parent may both skip, // but are checked to insure matching skip info - if (irq->history) continue; - if (irq->respainner || irq->respamiddle) continue; if (irq->halffull) continue; if (irq->copy) continue; @@ -1017,12 +979,11 @@ void Neighbor::morph_skip() // else 2 lists do not store same pairs // or their data structures are different // this includes custom cutoff set by requestor - // no need to check respaouter b/c it stores same pairs - // no need to check dnum b/c only set for history // NOTE: need check for 2 Kokkos flags? if (irq->ghost != jrq->ghost) continue; if (irq->size != jrq->size) continue; + if (irq->history != jrq->history) continue; if (irq->bond != jrq->bond) continue; if (irq->omp != jrq->omp) continue; if (irq->intel != jrq->intel) continue; @@ -1041,8 +1002,8 @@ void Neighbor::morph_skip() // else create a new identical list except non-skip // for new list, set neigh = 1, skip = 0, no skip vec/array, // copy unique flag (since copy_request() will not do it) - // note: parents of skip lists do not have associated history list - // b/c child skip lists store their own history info + // note: parents of skip lists do not have associated history + // b/c child skip lists have the associated history if (j < nrequest) irq->skiplist = j; else { @@ -1103,7 +1064,6 @@ void Neighbor::morph_granular() if (onesided == 2) break; } - // if onesided = 2, parent has children with both granonesided = 0/1 // force parent newton off (newton = 2) to enable onesided skip by child // set parent granonesided = 0, so it stores all neighs in usual manner @@ -1147,16 +1107,9 @@ void Neighbor::morph_halffull() if (!irq->half) continue; - // Kokkos doesn't yet support half from full - - if (irq->kokkos_host) continue; - if (irq->kokkos_device) continue; - // these lists are created other ways, no need for halffull // do want to process skip lists - if (irq->history) continue; - if (irq->respainner || irq->respamiddle) continue; if (irq->copy) continue; // check all other lists @@ -1175,11 +1128,10 @@ void Neighbor::morph_halffull() // else 2 lists do not store same pairs // or their data structures are different // this includes custom cutoff set by requestor - // no need to check respaouter b/c it stores same pairs - // no need to check dnum b/c only set for history if (irq->ghost != jrq->ghost) continue; if (irq->size != jrq->size) continue; + if (irq->history != jrq->history) continue; if (irq->bond != jrq->bond) continue; if (irq->omp != jrq->omp) continue; if (irq->intel != jrq->intel) continue; @@ -1226,12 +1178,6 @@ void Neighbor::morph_copy() if (irq->copy) continue; - // these lists are created other ways, no need to copy - // skip lists are eligible to become a copy list - - if (irq->history) continue; - if (irq->respainner || irq->respamiddle) continue; - // check all other lists for (j = 0; j < nrequest; j++) { @@ -1268,9 +1214,9 @@ void Neighbor::morph_copy() if (irq->ghost && !jrq->ghost) continue; - // do not copy from a history list or a respa middle/inner list + // do not copy from a list with respa middle/inner + // b/c its outer list will not be complete - if (jrq->history) continue; if (jrq->respamiddle) continue; if (jrq->respainner) continue; @@ -1278,12 +1224,11 @@ void Neighbor::morph_copy() // else 2 lists do not store same pairs // or their data structures are different // this includes custom cutoff set by requestor - // no need to check respaouter b/c it stores same pairs // no need to check omp b/c it stores same pairs - // no need to check dnum b/c only set for history // NOTE: need check for 2 Kokkos flags? if (irq->size != jrq->size) continue; + if (irq->history != jrq->history) continue; if (irq->bond != jrq->bond) continue; if (irq->intel != jrq->intel) continue; if (irq->kokkos_host != jrq->kokkos_host) continue; @@ -1531,9 +1476,7 @@ void Neighbor::print_pairwise_info() // order these to get single output of most relevant - if (rq->history) - fprintf(out,", history for (%d)",rq->historylist+1); - else if (rq->copy) + if (rq->copy) fprintf(out,", copy from (%d)",rq->copylist+1); else if (rq->halffull) fprintf(out,", half/full from (%d)",rq->halffulllist+1); @@ -1558,9 +1501,8 @@ void Neighbor::print_pairwise_info() if (rq->size) fprintf(out,", size"); if (rq->history) fprintf(out,", history"); if (rq->granonesided) fprintf(out,", onesided"); - if (rq->respainner) fprintf(out,", respa outer"); - if (rq->respamiddle) fprintf(out,", respa middle"); - if (rq->respaouter) fprintf(out,", respa inner"); + if (rq->respamiddle) fprintf(out,", respa outer/middle/inner"); + else if (rq->respainner) fprintf(out,", respa outer/inner"); if (rq->bond) fprintf(out,", bond"); if (rq->omp) fprintf(out,", omp"); if (rq->intel) fprintf(out,", intel"); @@ -1655,8 +1597,6 @@ int Neighbor::choose_bin(NeighRequest *rq) if (style == NSQ) return 0; if (rq->skip || rq->copy || rq->halffull) return 0; - if (rq->history) return 0; - if (rq->respainner || rq->respamiddle) return 0; // use request settings to match exactly one NBin class mask // checks are bitwise using NeighConst bit masks @@ -1697,8 +1637,6 @@ int Neighbor::choose_stencil(NeighRequest *rq) if (style == NSQ) return 0; if (rq->skip || rq->copy || rq->halffull) return 0; - if (rq->history) return 0; - if (rq->respainner || rq->respamiddle) return 0; // convert newton request to newtflag = on or off @@ -1789,11 +1727,6 @@ int Neighbor::choose_stencil(NeighRequest *rq) int Neighbor::choose_pair(NeighRequest *rq) { - // no neighbor list build performed - - if (rq->history) return 0; - if (rq->respainner || rq->respamiddle) return 0; - // error check for includegroup with ghost neighbor request if (includegroup && rq->ghost) diff --git a/src/neighbor.h b/src/neighbor.h index 64bced2293..c054cddb2b 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -54,7 +54,6 @@ class Neighbor : protected Pointers { double *bboxlo,*bboxhi; // ptrs to full domain bounding box // different for orthog vs triclinic - double *zeroes; // vector of zeroes for shear history init // exclusion info, used by NeighPair @@ -112,7 +111,7 @@ class Neighbor : protected Pointers { int decide(); // decide whether to build or not virtual int check_distance(); // check max distance moved since last build void setup_bins(); // setup bins based on box and cutoff - virtual void build(int topoflag=1); // build all perpetual neighbor lists + virtual void build(int); // build all perpetual neighbor lists virtual void build_topology(); // pairwise topology neighbor lists void build_one(class NeighList *list, int preflag=0); // create a one-time pairwise neigh list @@ -205,7 +204,7 @@ class Neighbor : protected Pointers { int init_pair(); virtual void init_topology(); - void morph_other(); + void morph_unique(); void morph_skip(); void morph_granular(); void morph_halffull(); diff --git a/src/npair.cpp b/src/npair.cpp index 9fbb4d219d..4d06850e65 100644 --- a/src/npair.cpp +++ b/src/npair.cpp @@ -32,12 +32,16 @@ NPair::NPair(LAMMPS *lmp) last_build = -1; mycutneighsq = NULL; molecular = atom->molecular; + copymode = 0; + execution_space = Host; } /* ---------------------------------------------------------------------- */ NPair::~NPair() { + if (copymode) return; + memory->destroy(mycutneighsq); } @@ -66,7 +70,6 @@ void NPair::copy_neighbor_info() cut_inner_sq = neighbor->cut_inner_sq; cut_middle_sq = neighbor->cut_middle_sq; cut_middle_inside_sq = neighbor->cut_middle_inside_sq; - zeroes = neighbor->zeroes; bboxlo = neighbor->bboxlo; bboxhi = neighbor->bboxhi; diff --git a/src/npair.h b/src/npair.h index 6941b86164..186f921a00 100644 --- a/src/npair.h +++ b/src/npair.h @@ -47,7 +47,6 @@ class NPair : protected Pointers { double cut_inner_sq; double cut_middle_sq; double cut_middle_inside_sq; - double *zeroes; double *bboxlo,*bboxhi; // exclusion data from Neighbor class @@ -135,6 +134,9 @@ class NPair : protected Pointers { } return 0; }; + + int copymode; + ExecutionSpace execution_space; }; } diff --git a/src/npair_copy.cpp b/src/npair_copy.cpp index 1799d48fed..9426d22ed3 100644 --- a/src/npair_copy.cpp +++ b/src/npair_copy.cpp @@ -40,7 +40,5 @@ void NPairCopy::build(NeighList *list) list->ilist = listcopy->ilist; list->numneigh = listcopy->numneigh; list->firstneigh = listcopy->firstneigh; - list->firstdouble = listcopy->firstdouble; list->ipage = listcopy->ipage; - list->dpage = listcopy->dpage; } diff --git a/src/npair_half_respa_bin_newtoff.cpp b/src/npair_half_respa_bin_newtoff.cpp index 11246b4af8..0145771f4a 100644 --- a/src/npair_half_respa_bin_newtoff.cpp +++ b/src/npair_half_respa_bin_newtoff.cpp @@ -63,22 +63,19 @@ void NPairHalfRespaBinNewtoff::build(NeighList *list) int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - NeighList *listinner = list->listinner; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; - MyPage *ipage_inner = listinner->ipage; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; - NeighList *listmiddle; int *ilist_middle,*numneigh_middle,**firstneigh_middle; MyPage *ipage_middle; int respamiddle = list->respamiddle; if (respamiddle) { - listmiddle = list->listmiddle; - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; - ipage_middle = listmiddle->ipage; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; } int inum = 0; @@ -185,6 +182,6 @@ void NPairHalfRespaBinNewtoff::build(NeighList *list) } list->inum = inum; - listinner->inum = inum; - if (respamiddle) listmiddle->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; } diff --git a/src/npair_half_respa_bin_newton.cpp b/src/npair_half_respa_bin_newton.cpp index db76678036..72a613204d 100644 --- a/src/npair_half_respa_bin_newton.cpp +++ b/src/npair_half_respa_bin_newton.cpp @@ -62,22 +62,19 @@ void NPairHalfRespaBinNewton::build(NeighList *list) int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - NeighList *listinner = list->listinner; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; - MyPage *ipage_inner = listinner->ipage; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; - NeighList *listmiddle; int *ilist_middle,*numneigh_middle,**firstneigh_middle; MyPage *ipage_middle; int respamiddle = list->respamiddle; if (respamiddle) { - listmiddle = list->listmiddle; - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; - ipage_middle = listmiddle->ipage; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; } int inum = 0; @@ -231,6 +228,6 @@ void NPairHalfRespaBinNewton::build(NeighList *list) } list->inum = inum; - listinner->inum = inum; - if (respamiddle) listmiddle->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; } diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index 4ec6685e1d..add1cf6e5c 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -63,22 +63,19 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - NeighList *listinner = list->listinner; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; - MyPage *ipage_inner = listinner->ipage; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; - NeighList *listmiddle; int *ilist_middle,*numneigh_middle,**firstneigh_middle; MyPage *ipage_middle; int respamiddle = list->respamiddle; if (respamiddle) { - listmiddle = list->listmiddle; - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; - ipage_middle = listmiddle->ipage; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; } int inum = 0; @@ -193,6 +190,6 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) } list->inum = inum; - listinner->inum = inum; - if (respamiddle) listmiddle->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; } diff --git a/src/npair_half_respa_nsq_newtoff.cpp b/src/npair_half_respa_nsq_newtoff.cpp index 1bb2034384..c0e932f0ae 100644 --- a/src/npair_half_respa_nsq_newtoff.cpp +++ b/src/npair_half_respa_nsq_newtoff.cpp @@ -67,22 +67,19 @@ void NPairHalfRespaNsqNewtoff::build(NeighList *list) int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - NeighList *listinner = list->listinner; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; - MyPage *ipage_inner = listinner->ipage; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; - NeighList *listmiddle; int *ilist_middle,*numneigh_middle,**firstneigh_middle; MyPage *ipage_middle; int respamiddle = list->respamiddle; if (respamiddle) { - listmiddle = list->listmiddle; - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; - ipage_middle = listmiddle->ipage; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; } int inum = 0; @@ -180,6 +177,6 @@ void NPairHalfRespaNsqNewtoff::build(NeighList *list) } list->inum = inum; - listinner->inum = inum; - if (respamiddle) listmiddle->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; } diff --git a/src/npair_half_respa_nsq_newton.cpp b/src/npair_half_respa_nsq_newton.cpp index 9aacc702cc..f7d161896d 100644 --- a/src/npair_half_respa_nsq_newton.cpp +++ b/src/npair_half_respa_nsq_newton.cpp @@ -69,22 +69,19 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - NeighList *listinner = list->listinner; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; - MyPage *ipage_inner = listinner->ipage; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; - NeighList *listmiddle; int *ilist_middle,*numneigh_middle,**firstneigh_middle; MyPage *ipage_middle; int respamiddle = list->respamiddle; if (respamiddle) { - listmiddle = list->listmiddle; - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; - ipage_middle = listmiddle->ipage; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; } int inum = 0; @@ -200,6 +197,6 @@ void NPairHalfRespaNsqNewton::build(NeighList *list) } list->inum = inum; - listinner->inum = inum; - if (respamiddle) listmiddle->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; } diff --git a/src/npair_half_size_bin_newtoff.cpp b/src/npair_half_size_bin_newtoff.cpp index 571b2484ea..d575f3eb1f 100644 --- a/src/npair_half_size_bin_newtoff.cpp +++ b/src/npair_half_size_bin_newtoff.cpp @@ -17,9 +17,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -32,7 +29,6 @@ NPairHalfSizeBinNewtoff::NPairHalfSizeBinNewtoff(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- size particles binned neighbor list construction with partial Newton's 3rd law - shear history must be accounted for when a neighbor pair is added each owned atom i checks own bin and surrounding bins in non-Newton stencil pair stored once if i,j are both owned and i < j pair stored by me if j is ghost (also stored by proc owning j) @@ -40,66 +36,33 @@ NPairHalfSizeBinNewtoff::NPairHalfSizeBinNewtoff(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeBinNewtoff::build(NeighList *list) { - int i,j,k,m,n,nn,ibin,dnum,dnumbytes; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; + int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; int nlocal = atom->nlocal; if (includegroup) nlocal = atom->nfirst; + int history = list->history; int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } + int mask_history = 3 << SBBITS; int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -116,38 +79,19 @@ void NPairHalfSizeBinNewtoff::build(NeighList *list) for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { if (j <= i) continue; if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; - + delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; rsq = delx*delx + dely*dely + delz*delz; radsum = radi + radius[j]; cutsq = (radsum+skin) * (radsum+skin); - + if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } } @@ -158,13 +102,6 @@ void NPairHalfSizeBinNewtoff::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_half_size_bin_newton.cpp b/src/npair_half_size_bin_newton.cpp index 4f4ecccb16..da29cb2029 100644 --- a/src/npair_half_size_bin_newton.cpp +++ b/src/npair_half_size_bin_newton.cpp @@ -17,9 +17,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -32,73 +29,39 @@ NPairHalfSizeBinNewton::NPairHalfSizeBinNewton(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- size particles binned neighbor list construction with full Newton's 3rd law - shear history must be accounted for when a neighbor pair is added each owned atom i checks its own bin and other bins in Newton stencil every pair stored exactly once by some processor ------------------------------------------------------------------------- */ void NPairHalfSizeBinNewton::build(NeighList *list) { - int i,j,k,m,n,nn,ibin,dnum,dnumbytes; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; + int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; int nlocal = atom->nlocal; if (includegroup) nlocal = atom->nfirst; + int history = list->history; int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } + int mask_history = 3 << SBBITS; int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -128,29 +91,10 @@ void NPairHalfSizeBinNewton::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } @@ -169,29 +113,10 @@ void NPairHalfSizeBinNewton::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } } @@ -202,13 +127,6 @@ void NPairHalfSizeBinNewton::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index 559eb09a7a..044847ba8c 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -17,9 +17,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -33,73 +30,39 @@ NPairHalfSizeBinNewtonTri::NPairHalfSizeBinNewtonTri(LAMMPS *lmp) : /* ---------------------------------------------------------------------- size particles binned neighbor list construction with Newton's 3rd law for triclinic - shear history must be accounted for when a neighbor pair is added each owned atom i checks its own bin and other bins in triclinic stencil every pair stored exactly once by some processor ------------------------------------------------------------------------- */ void NPairHalfSizeBinNewtonTri::build(NeighList *list) { - int i,j,k,m,n,nn,ibin,dnum,dnumbytes; + int i,j,k,n,ibin; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; + int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; int nlocal = atom->nlocal; if (includegroup) nlocal = atom->nfirst; + int history = list->history; int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } + int mask_history = 3 << SBBITS; int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -134,29 +97,10 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n++] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } } @@ -167,13 +111,6 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_half_size_nsq_newtoff.cpp b/src/npair_half_size_nsq_newtoff.cpp index 56630a9dc8..50a32c87ba 100644 --- a/src/npair_half_size_nsq_newtoff.cpp +++ b/src/npair_half_size_nsq_newtoff.cpp @@ -18,9 +18,6 @@ #include "atom.h" #include "atom_vec.h" #include "group.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -33,31 +30,19 @@ NPairHalfSizeNsqNewtoff::NPairHalfSizeNsqNewtoff(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- size particles N^2 / 2 search for neighbor pairs with partial Newton's 3rd law - shear history must be accounted for when a neighbor pair is added pair added to list if atoms i and j are both owned and i < j pair added if j is ghost (also stored by proc owning j) ------------------------------------------------------------------------- */ void NPairHalfSizeNsqNewtoff::build(NeighList *list) { - int i,j,m,n,nn,bitmask,dnum,dnumbytes; + int i,j,n,bitmask; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; + int *neighptr; double **x = atom->x; double *radius = atom->radius; - tagint *tag = atom->tag; int *type = atom->type; int *mask = atom->mask; tagint *molecule = atom->molecule; @@ -68,42 +53,20 @@ void NPairHalfSizeNsqNewtoff::build(NeighList *list) bitmask = group->bitmask[includegroup]; } + int history = list->history; int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nall; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } + int mask_history = 3 << SBBITS; int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } xtmp = x[i][0]; ytmp = x[i][1]; @@ -124,29 +87,10 @@ void NPairHalfSizeNsqNewtoff::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } @@ -156,13 +100,6 @@ void NPairHalfSizeNsqNewtoff::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_half_size_nsq_newton.cpp b/src/npair_half_size_nsq_newton.cpp index 177685b9fc..343172fb98 100644 --- a/src/npair_half_size_nsq_newton.cpp +++ b/src/npair_half_size_nsq_newton.cpp @@ -18,9 +18,6 @@ #include "atom.h" #include "atom_vec.h" #include "group.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -33,7 +30,6 @@ NPairHalfSizeNsqNewton::NPairHalfSizeNsqNewton(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- size particles N^2 / 2 search for neighbor pairs with full Newton's 3rd law - shear history must be accounted for when a neighbor pair is added pair added to list if atoms i and j are both owned and i < j if j is ghost only me or other proc adds pair decision based on itag,jtag tests @@ -41,20 +37,10 @@ NPairHalfSizeNsqNewton::NPairHalfSizeNsqNewton(LAMMPS *lmp) : NPair(lmp) {} void NPairHalfSizeNsqNewton::build(NeighList *list) { - int i,j,m,n,nn,itag,jtag,bitmask,dnum,dnumbytes; + int i,j,n,itag,jtag,bitmask; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double radi,radsum,cutsq; - int *neighptr,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; + int *neighptr; double **x = atom->x; double *radius = atom->radius; @@ -69,42 +55,20 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) bitmask = group->bitmask[includegroup]; } + int history = list->history; int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; MyPage *ipage = list->ipage; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nall; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } + int mask_history = 3 << SBBITS; int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } for (i = 0; i < nlocal; i++) { n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } itag = tag[i]; xtmp = x[i][0]; @@ -142,29 +106,10 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) cutsq = (radsum+skin) * (radsum+skin); if (rsq <= cutsq) { - neighptr[n] = j; - - if (fix_history) { - if (rsq < radsum*radsum) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == tag[j]) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; } } @@ -174,13 +119,6 @@ void NPairHalfSizeNsqNewton::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_halffull_newtoff.cpp b/src/npair_halffull_newtoff.cpp index bd7cc4dd59..84816f07b2 100644 --- a/src/npair_halffull_newtoff.cpp +++ b/src/npair_halffull_newtoff.cpp @@ -32,6 +32,8 @@ NPairHalffullNewtoff::NPairHalffullNewtoff(LAMMPS *lmp) : NPair(lmp) {} pair stored once if i,j are both owned and i < j pair stored by me if j is ghost (also stored by proc owning j) works if full list is a skip list + works for owned (non-ghost) list, also for ghost list + if ghost, also store neighbors of ghost atoms & set inum,gnum correctly ------------------------------------------------------------------------- */ void NPairHalffullNewtoff::build(NeighList *list) @@ -48,6 +50,7 @@ void NPairHalffullNewtoff::build(NeighList *list) int *numneigh_full = list->listfull->numneigh; int **firstneigh_full = list->listfull->firstneigh; int inum_full = list->listfull->inum; + if (list->ghost) inum_full += list->listfull->gnum; int inum = 0; ipage->reset(); @@ -79,4 +82,5 @@ void NPairHalffullNewtoff::build(NeighList *list) } list->inum = inum; + if (list->ghost) list->gnum = list->listfull->gnum; } diff --git a/src/npair_halffull_newtoff.h b/src/npair_halffull_newtoff.h index 24d439a331..c4f7d00a01 100644 --- a/src/npair_halffull_newtoff.h +++ b/src/npair_halffull_newtoff.h @@ -23,6 +23,16 @@ NPairStyle(halffull/newtoff/skip, NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | NP_ORTHO | NP_TRI | NP_SKIP) +NPairStyle(halffull/newtoff/ghost, + NPairHalffullNewtoff, + NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | + NP_ORTHO | NP_TRI | NP_GHOST) + +NPairStyle(halffull/newtoff/skip/ghost, + NPairHalffullNewtoff, + NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | + NP_ORTHO | NP_TRI | NP_SKIP | NP_GHOST) + #else #ifndef LMP_NPAIR_HALFFULL_NEWTOFF_H diff --git a/src/npair_skip_respa.cpp b/src/npair_skip_respa.cpp index 31420b32d1..1d4eda5354 100644 --- a/src/npair_skip_respa.cpp +++ b/src/npair_skip_respa.cpp @@ -53,28 +53,24 @@ void NPairSkipRespa::build(NeighList *list) int *iskip = list->iskip; int **ijskip = list->ijskip; - NeighList *listinner = list->listinner; - int *ilist_inner = listinner->ilist; - int *numneigh_inner = listinner->numneigh; - int **firstneigh_inner = listinner->firstneigh; - MyPage *ipage_inner = listinner->ipage; + int *ilist_inner = list->ilist_inner; + int *numneigh_inner = list->numneigh_inner; + int **firstneigh_inner = list->firstneigh_inner; + MyPage *ipage_inner = list->ipage_inner; + int *numneigh_inner_skip = list->listskip->numneigh_inner; + int **firstneigh_inner_skip = list->listskip->firstneigh_inner; - int *numneigh_inner_skip = list->listskip->listinner->numneigh; - int **firstneigh_inner_skip = list->listskip->listinner->firstneigh; - - NeighList *listmiddle; int *ilist_middle,*numneigh_middle,**firstneigh_middle; MyPage *ipage_middle; int *numneigh_middle_skip,**firstneigh_middle_skip; int respamiddle = list->respamiddle; if (respamiddle) { - listmiddle = list->listmiddle; - ilist_middle = listmiddle->ilist; - numneigh_middle = listmiddle->numneigh; - firstneigh_middle = listmiddle->firstneigh; - ipage_middle = listmiddle->ipage; - numneigh_middle_skip = list->listskip->listmiddle->numneigh; - firstneigh_middle_skip = list->listskip->listmiddle->firstneigh; + ilist_middle = list->ilist_middle; + numneigh_middle = list->numneigh_middle; + firstneigh_middle = list->firstneigh_middle; + ipage_middle = list->ipage_middle; + numneigh_middle_skip = list->listskip->numneigh_middle; + firstneigh_middle_skip = list->listskip->firstneigh_middle; } int inum = 0; @@ -164,6 +160,6 @@ void NPairSkipRespa::build(NeighList *list) } list->inum = inum; - listinner->inum = inum; - if (respamiddle) listmiddle->inum = inum; + list->inum_inner = inum; + if (respamiddle) list->inum_middle = inum; } diff --git a/src/npair_skip_size.cpp b/src/npair_skip_size.cpp index e8d19dedca..b75856dde4 100644 --- a/src/npair_skip_size.cpp +++ b/src/npair_skip_size.cpp @@ -17,9 +17,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -32,29 +29,14 @@ NPairSkipSize::NPairSkipSize(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- build skip list for subset of types from parent list iskip and ijskip flag which atom types and type pairs to skip - if list requests it, preserve shear history via fix shear/history ------------------------------------------------------------------------- */ void NPairSkipSize::build(NeighList *list) { - int i,j,ii,jj,m,n,nn,itype,jnum,joriginal,dnum,dnumbytes; - tagint jtag; - int *neighptr,*jlist,*touchptr; - double *shearptr; + int i,j,ii,jj,n,itype,jnum,joriginal; + int *neighptr,*jlist; - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; - - tagint *tag = atom->tag; int *type = atom->type; - int nlocal = atom->nlocal; - int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; @@ -68,28 +50,8 @@ void NPairSkipSize::build(NeighList *list) int *iskip = list->iskip; int **ijskip = list->ijskip; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } - int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } // loop over atoms in other list // skip I atom entirely if iskip is set for type[I] @@ -102,13 +64,8 @@ void NPairSkipSize::build(NeighList *list) n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } - // loop over parent non-skip size list and optionally its history info + // loop over parent non-skip size list jlist = firstneigh_skip[i]; jnum = numneigh_skip[i]; @@ -117,29 +74,7 @@ void NPairSkipSize::build(NeighList *list) joriginal = jlist[jj]; j = joriginal & NEIGHMASK; if (ijskip[itype][type[j]]) continue; - neighptr[n] = joriginal; - - // no numeric test for current touch - // just use FSH partner list to infer it - // would require distance calculation for spheres - // more complex calculation for surfs - - if (fix_history) { - jtag = tag[j]; - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == jtag) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + neighptr[n++] = joriginal; } ilist[inum++] = i; @@ -148,13 +83,6 @@ void NPairSkipSize::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_skip_size_off2on.cpp b/src/npair_skip_size_off2on.cpp index da9dd57047..8d728a3c0a 100644 --- a/src/npair_skip_size_off2on.cpp +++ b/src/npair_skip_size_off2on.cpp @@ -17,9 +17,6 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -33,24 +30,13 @@ NPairSkipSizeOff2on::NPairSkipSizeOff2on(LAMMPS *lmp) : NPair(lmp) {} build skip list for subset of types from parent list iskip and ijskip flag which atom types and type pairs to skip parent non-skip list used newton off, this skip list is newton on - if list requests it, preserve shear history via fix shear/history ------------------------------------------------------------------------- */ void NPairSkipSizeOff2on::build(NeighList *list) { - int i,j,ii,jj,m,n,nn,itype,jnum,joriginal,dnum,dnumbytes; + int i,j,ii,jj,n,itype,jnum,joriginal; tagint itag,jtag; - int *neighptr,*jlist,*touchptr; - double *shearptr; - - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; + int *neighptr,*jlist; tagint *tag = atom->tag; int *type = atom->type; @@ -69,28 +55,8 @@ void NPairSkipSizeOff2on::build(NeighList *list) int *iskip = list->iskip; int **ijskip = list->ijskip; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } - int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } // loop over atoms in other list // skip I atom entirely if iskip is set for type[I] @@ -104,11 +70,6 @@ void NPairSkipSizeOff2on::build(NeighList *list) n = 0; neighptr = ipage->vget(); - if (fix_history) { - nn = 0; - touchptr = ipage_touch->vget(); - shearptr = dpage_shear->vget(); - } // loop over parent non-skip size list and optionally its history info @@ -125,28 +86,7 @@ void NPairSkipSizeOff2on::build(NeighList *list) jtag = tag[j]; if (j >= nlocal && jtag < itag) continue; - neighptr[n] = joriginal; - - // no numeric test for current touch - // just use FSH partner list to infer it - // would require distance calculation for spheres - // more complex calculation for surfs - - if (fix_history) { - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == jtag) break; - if (m < npartner[i]) { - touchptr[n] = 1; - memcpy(&shearptr[nn],&shearpartner[i][dnum*m],dnumbytes); - nn += dnum; - } else { - touchptr[n] = 0; - memcpy(&shearptr[nn],zeroes,dnumbytes); - nn += dnum; - } - } - - n++; + neighptr[n++] = joriginal; } ilist[inum++] = i; @@ -155,13 +95,6 @@ void NPairSkipSizeOff2on::build(NeighList *list) ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - - if (fix_history) { - firsttouch[i] = touchptr; - firstshear[i] = shearptr; - ipage_touch->vgot(n); - dpage_shear->vgot(nn); - } } list->inum = inum; diff --git a/src/npair_skip_size_off2on_oneside.cpp b/src/npair_skip_size_off2on_oneside.cpp index 7377feec5b..a04fc7782c 100644 --- a/src/npair_skip_size_off2on_oneside.cpp +++ b/src/npair_skip_size_off2on_oneside.cpp @@ -17,9 +17,7 @@ #include "neigh_list.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" #include "domain.h" -#include "fix_shear_history.h" #include "my_page.h" #include "error.h" @@ -35,25 +33,13 @@ NPairSkipSizeOff2onOneside::NPairSkipSizeOff2onOneside(LAMMPS *lmp) : iskip and ijskip flag which atom types and type pairs to skip parent non-skip list used newton off and was not onesided, this skip list is newton on and onesided - if list requests it, preserve shear history via fix shear/history ------------------------------------------------------------------------- */ void NPairSkipSizeOff2onOneside::build(NeighList *list) { - int i,j,ii,jj,m,n,nn,itype,jnum,joriginal,flip,dnum,dnumbytes,tmp; - tagint jtag; + int i,j,ii,jj,n,itype,jnum,joriginal,flip,tmp; int *surf,*jlist; - int *npartner; - tagint **partner; - double **shearpartner; - int **firsttouch; - double **firstshear; - MyPage *ipage_touch; - MyPage *dpage_shear; - NeighList *listhistory; - - tagint *tag = atom->tag; int *type = atom->type; int nlocal = atom->nlocal; @@ -73,28 +59,8 @@ void NPairSkipSizeOff2onOneside::build(NeighList *list) if (domain->dimension == 2) surf = atom->line; else surf = atom->tri; - FixShearHistory *fix_history = (FixShearHistory *) list->fix_history; - if (fix_history) { - fix_history->nlocal_neigh = nlocal; - fix_history->nall_neigh = nlocal + atom->nghost; - npartner = fix_history->npartner; - partner = fix_history->partner; - shearpartner = fix_history->shearpartner; - listhistory = list->listhistory; - firsttouch = listhistory->firstneigh; - firstshear = listhistory->firstdouble; - ipage_touch = listhistory->ipage; - dpage_shear = listhistory->dpage; - dnum = listhistory->dnum; - dnumbytes = dnum * sizeof(double); - } - int inum = 0; ipage->reset(); - if (fix_history) { - ipage_touch->reset(); - dpage_shear->reset(); - } // two loops over parent list required, one to count, one to store // because onesided constraint means pair I,J may be stored with I or J @@ -139,7 +105,7 @@ void NPairSkipSizeOff2onOneside::build(NeighList *list) } } - // allocate all per-atom neigh list chunks, including history + // allocate all per-atom neigh list chunks for (i = 0; i < nlocal; i++) { if (numneigh[i] == 0) continue; @@ -147,10 +113,6 @@ void NPairSkipSizeOff2onOneside::build(NeighList *list) firstneigh[i] = ipage->get(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); - if (fix_history) { - firsttouch[i] = ipage_touch->get(n); - firstshear[i] = dpage_shear->get(dnum*n); - } } // second loop over atoms in other list to store neighbors @@ -189,32 +151,11 @@ void NPairSkipSizeOff2onOneside::build(NeighList *list) // OK, b/c there is no special list flagging for surfs firstneigh[i][numneigh[i]] = j; - - // no numeric test for current touch - // just use FSH partner list to infer it - // would require complex calculation for surfs - - if (fix_history) { - jtag = tag[j]; - n = numneigh[i]; - nn = dnum*n; - for (m = 0; m < npartner[i]; m++) - if (partner[i][m] == jtag) break; - if (m < npartner[i]) { - firsttouch[i][n] = 1; - memcpy(&firstshear[i][nn],&shearpartner[i][dnum*m],dnumbytes); - } else { - firsttouch[i][n] = 0; - memcpy(&firstshear[i][nn],zeroes,dnumbytes); - } - } - numneigh[i]++; if (flip) i = j; } // only add atom I to ilist if it has neighbors - // fix shear/history allows for this in pre_exchange_onesided() if (numneigh[i]) ilist[inum++] = i; } diff --git a/src/nstencil.h b/src/nstencil.h index 7985d23202..a4c6a4af66 100644 --- a/src/nstencil.h +++ b/src/nstencil.h @@ -30,6 +30,7 @@ class NStencil : protected Pointers { int *nstencil_multi; // # bins in each type-based multi stencil int **stencil_multi; // list of bin offsets in each stencil double **distsq_multi; // sq distances to bins in each stencil + int sx,sy,sz; // extent of stencil in each dim double cutoff_custom; // cutoff set by requestor @@ -64,7 +65,6 @@ class NStencil : protected Pointers { int xyzflag; // 1 if stencilxyz is allocated int maxstencil; // max size of stencil int maxstencil_multi; // max sizes of stencils - int sx,sy,sz; // extent of stencil in each dim int dimension; diff --git a/src/output.cpp b/src/output.cpp index ce7fcb7cca..11c6fa073e 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -827,9 +827,9 @@ void Output::create_restart(int narg, char **arg) sum and print memory usage result is only memory on proc 0, not averaged across procs ------------------------------------------------------------------------- */ + void Output::memory_usage() { - bigint bytes = 0; bytes += atom->memory_usage(); bytes += neighbor->memory_usage(); @@ -844,9 +844,9 @@ void Output::memory_usage() MPI_Reduce(&mbytes,&mbavg,1,MPI_DOUBLE,MPI_SUM,0,world); MPI_Reduce(&mbytes,&mbmin,1,MPI_DOUBLE,MPI_MIN,0,world); MPI_Reduce(&mbytes,&mbmax,1,MPI_DOUBLE,MPI_MAX,0,world); - mbavg /= comm->nprocs; if (comm->me == 0) { + mbavg /= comm->nprocs; if (screen) fprintf(screen,"Per MPI rank memory allocation (min/avg/max) = " "%.4g | %.4g | %.4g Mbytes\n",mbmin,mbavg,mbmax); diff --git a/src/pair.cpp b/src/pair.cpp index ce711c4f5d..05319e33f2 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -75,7 +75,7 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = 0; reinitflag = 1; - // pair_modify settingsx + // pair_modify settings compute_flag = 1; manybody_flag = 0; diff --git a/src/pair.h b/src/pair.h index b57004d965..cfb6576653 100644 --- a/src/pair.h +++ b/src/pair.h @@ -15,7 +15,6 @@ #define LMP_PAIR_H #include "pointers.h" -#include "accelerator_kokkos.h" namespace LAMMPS_NS { @@ -92,10 +91,6 @@ class Pair : protected Pointers { class NeighList *list; // standard neighbor list used by most pairs class NeighList *listhalf; // half list used by some pairs class NeighList *listfull; // full list used by some pairs - class NeighList *listhistory; // neighbor history list used by some pairs - class NeighList *listinner; // rRESPA lists used by some pairs - class NeighList *listmiddle; - class NeighList *listouter; int allocated; // 0/1 = whether arrays are allocated // public so external driver can check @@ -169,10 +164,6 @@ class Pair : protected Pointers { virtual int pack_forward_comm(int, int *, double *, int, int *) {return 0;} virtual void unpack_forward_comm(int, int, double *) {} - virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, - int, DAT::tdual_xfloat_1d &, - int, int *) {return 0;}; - virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d &) {} virtual int pack_reverse_comm(int, int, double *) {return 0;} virtual void unpack_reverse_comm(int, int *, double *) {} virtual double memory_usage(); @@ -211,10 +202,12 @@ class Pair : protected Pointers { double tabinner; // inner cutoff for Coulomb table double tabinner_disp; // inner cutoff for dispersion table + public: // custom data type for accessing Coulomb tables typedef union {int i; float f;} union_int_float_t; + protected: int vflag_fdotr; int maxeatom,maxvatom; diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index fa79f1cf97..751560deff 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -36,12 +36,9 @@ PairHybrid::PairHybrid(LAMMPS *lmp) : Pair(lmp), map(NULL), special_lj(NULL), special_coul(NULL), compute_tally(NULL) { nstyles = 0; - + outerflag = 0; respaflag = 0; - - if (lmp->kokkos) - error->all(FLERR,"Cannot yet use pair hybrid with Kokkos"); } /* ---------------------------------------------------------------------- */ @@ -382,6 +379,9 @@ void PairHybrid::coeff(int narg, char **arg) if (narg < 3) error->all(FLERR,"Incorrect args for pair coefficients"); if (!allocated) allocate(); + if (lmp->kokkos) + error->all(FLERR,"Cannot yet use pair hybrid with Kokkos"); + int ilo,ihi,jlo,jhi; force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); @@ -490,7 +490,7 @@ void PairHybrid::init_style() if (((force->special_lj[i] == 0.0) || (force->special_lj[i] == 1.0)) && (force->special_lj[i] != special_lj[istyle][i])) error->all(FLERR,"Pair_modify special setting for pair hybrid " - "incompatible with global special_bonds setting"); + "incompatible with global special_bonds setting"); } } @@ -500,7 +500,7 @@ void PairHybrid::init_style() || (force->special_coul[i] == 1.0)) && (force->special_coul[i] != special_coul[istyle][i])) error->all(FLERR,"Pair_modify special setting for pair hybrid " - "incompatible with global special_bonds setting"); + "incompatible with global special_bonds setting"); } } } @@ -832,6 +832,12 @@ void PairHybrid::modify_params(int narg, char **arg) Pair::modify_params(narg,arg); for (int m = 0; m < nstyles; m++) styles[m]->modify_params(narg,arg); } + + // reset global compute_flag since there may have been changes + // to any of the substyles + compute_flag = 0; + for (int m = 0; m < nstyles; m++) + if (styles[m]->compute_flag) compute_flag = 1; } /* ---------------------------------------------------------------------- diff --git a/src/pair_hybrid.h b/src/pair_hybrid.h index b8b9af5f40..463ae00eca 100644 --- a/src/pair_hybrid.h +++ b/src/pair_hybrid.h @@ -35,7 +35,7 @@ class PairHybrid : public Pair { public: PairHybrid(class LAMMPS *); virtual ~PairHybrid(); - void compute(int, int); + virtual void compute(int, int); void settings(int, char **); virtual void coeff(int, char **); void init_style(); diff --git a/src/pair_hybrid_overlay.h b/src/pair_hybrid_overlay.h index 7fd0e3347f..934be05365 100644 --- a/src/pair_hybrid_overlay.h +++ b/src/pair_hybrid_overlay.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class PairHybridOverlay : public PairHybrid { public: PairHybridOverlay(class LAMMPS *); - ~PairHybridOverlay() {} + virtual ~PairHybridOverlay() {} void coeff(int, char **); }; diff --git a/src/pair_lj96_cut.cpp b/src/pair_lj96_cut.cpp index 83fc5bcdda..842b918fe1 100644 --- a/src/pair_lj96_cut.cpp +++ b/src/pair_lj96_cut.cpp @@ -157,10 +157,10 @@ void PairLJ96Cut::compute_inner() double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -231,10 +231,10 @@ void PairLJ96Cut::compute_middle() double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -318,10 +318,10 @@ void PairLJ96Cut::compute_outer(int eflag, int vflag) double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -487,36 +487,23 @@ void PairLJ96Cut::coeff(int narg, char **arg) void PairLJ96Cut::init_style() { - // request regular or rRESPA neighbor lists + // request regular or rRESPA neighbor list int irequest; + int respa = 0; if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } + irequest = neighbor->request(this,instance_me); - } else irequest = neighbor->request(this,instance_me); + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; // set rRESPA cutoffs @@ -526,19 +513,6 @@ void PairLJ96Cut::init_style() else cut_respa = NULL; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJ96Cut::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/pair_lj96_cut.h b/src/pair_lj96_cut.h index 6b677c6429..4d6df02127 100644 --- a/src/pair_lj96_cut.h +++ b/src/pair_lj96_cut.h @@ -33,7 +33,6 @@ class PairLJ96Cut : public Pair { void settings(int, char **); void coeff(int, char **); void init_style(); - void init_list(int, class NeighList *); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/pair_lj_cut.cpp b/src/pair_lj_cut.cpp index 7f838061f1..215fabecbb 100644 --- a/src/pair_lj_cut.cpp +++ b/src/pair_lj_cut.cpp @@ -156,10 +156,10 @@ void PairLJCut::compute_inner() double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -229,10 +229,10 @@ void PairLJCut::compute_middle() double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -315,10 +315,10 @@ void PairLJCut::compute_outer(int eflag, int vflag) double *special_lj = force->special_lj; int newton_pair = force->newton_pair; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -481,36 +481,23 @@ void PairLJCut::coeff(int narg, char **arg) void PairLJCut::init_style() { - // request regular or rRESPA neighbor lists + // request regular or rRESPA neighbor list int irequest; + int respa = 0; if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } + irequest = neighbor->request(this,instance_me); - } else irequest = neighbor->request(this,instance_me); + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; // set rRESPA cutoffs @@ -520,19 +507,6 @@ void PairLJCut::init_style() else cut_respa = NULL; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairLJCut::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/pair_lj_cut.h b/src/pair_lj_cut.h index 43eeda09ca..3724685db6 100644 --- a/src/pair_lj_cut.h +++ b/src/pair_lj_cut.h @@ -32,7 +32,6 @@ class PairLJCut : public Pair { void settings(int, char **); void coeff(int, char **); void init_style(); - void init_list(int, class NeighList *); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/pair_lj_cut_coul_wolf.cpp new file mode 100644 index 0000000000..1527180eac --- /dev/null +++ b/src/pair_lj_cut_coul_wolf.cpp @@ -0,0 +1,447 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Vishal Boddu (FAU) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_lj_cut_coul_wolf.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairLJCutCoulWolf::PairLJCutCoulWolf(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairLJCutCoulWolf::~PairLJCutCoulWolf() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(cut_lj); + memory->destroy(cut_ljsq); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(lj1); + memory->destroy(lj2); + memory->destroy(lj3); + memory->destroy(lj4); + memory->destroy(offset); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double rsq,r2inv,r6inv,forcelj,factor_lj,forcecoul,factor_coul; + double prefactor; + double r; + int *ilist,*jlist,*numneigh,**firstneigh; + double erfcc,erfcd,v_sh,dvdrr,e_self,e_shift,f_shift,qisq; + + evdwl = 0.0; + ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + double *special_coul = force->special_coul; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + // self and shifted Coulombic energy + + e_self = v_sh = 0.0; + e_shift = erfc(alf*cut_coul)/cut_coul; + f_shift = -(e_shift+ 2.0*alf/MY_PIS + * exp(-alf*alf*cut_coul*cut_coul)) / cut_coul; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + qisq = qtmp*qtmp; + e_self = -(e_shift/2.0 + alf/MY_PIS) * qisq*qqrd2e; + if (eflag) ev_tally(i,i,nlocal,0,0.0,e_self,0.0,0.0,0.0,0.0); + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + + if (rsq < cut_coulsq) { + r = sqrt(rsq); + prefactor = qqrd2e*qtmp*q[j]/r; + erfcc = erfc(alf*r); + erfcd = exp(-alf*alf*r*r); + v_sh = (erfcc - e_shift*r) * prefactor; + dvdrr = (erfcc/rsq + 2.0*alf/MY_PIS * erfcd/r) + f_shift; + forcecoul = dvdrr*rsq*prefactor; + if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + } else forcecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); + } else forcelj = 0.0; + + fpair = (forcecoul + factor_lj*forcelj) * r2inv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + + if (rsq < cut_coulsq) { + ecoul = v_sh; + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + } else ecoul = 0.0; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,ecoul,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cut_lj,n+1,n+1,"pair:cut"); + memory->create(cut_ljsq,n+1,n+1,"pair:cut_ljsq"); + memory->create(epsilon,n+1,n+1,"pair:epsilon"); + memory->create(sigma,n+1,n+1,"pair:sigma"); + memory->create(lj1,n+1,n+1,"pair:lj1"); + memory->create(lj2,n+1,n+1,"pair:lj2"); + memory->create(lj3,n+1,n+1,"pair:lj3"); + memory->create(lj4,n+1,n+1,"pair:lj4"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::settings(int narg, char **arg) +{ + if (narg < 2 || narg > 3) error->all(FLERR,"Illegal pair_style command"); + + alf = force->numeric(FLERR,arg[0]); + cut_lj_global = force->numeric(FLERR,arg[1]); + if (narg == 2) cut_coul = cut_lj_global; + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double epsilon_one = force->numeric(FLERR,arg[2]); + double sigma_one = force->numeric(FLERR,arg[3]); + + double cut_lj_one = cut_lj_global; + if (narg == 5) cut_lj_one = force->numeric(FLERR,arg[4]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + epsilon[i][j] = epsilon_one; + sigma[i][j] = sigma_one; + cut_lj[i][j] = cut_lj_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::init_style() +{ + if (!atom->q_flag) + error->all(FLERR,"Pair style lj/cut/coul/wolf requires atom attribute q"); + + cut_coulsq = cut_coul * cut_coul; + + // request regular or rRESPA neighbor list + + int irequest; + irequest = neighbor->request(this,instance_me); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairLJCutCoulWolf::init_one(int i, int j) +{ + if (setflag[i][j] == 0) { + epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], + sigma[i][i],sigma[j][j]); + sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]); + cut_lj[i][j] = mix_distance(cut_lj[i][i],cut_lj[j][j]); + } + + double cut = MAX(cut_lj[i][j],cut_coul); + cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; + + lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0); + lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0); + lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + + if (offset_flag && (cut_lj[i][j] > 0.0)) { + double ratio = sigma[i][j] / cut_lj[i][j]; + offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio,12.0) - pow(ratio,6.0)); + } else offset[i][j] = 0.0; + + lj1[j][i] = lj1[i][j]; + lj2[j][i] = lj2[i][j]; + lj3[j][i] = lj3[i][j]; + lj4[j][i] = lj4[i][j]; + offset[j][i] = offset[i][j]; + + // compute I,J contribution to long-range tail correction + // count total # of atoms of type I and J via Allreduce + + if (tail_flag) { + int *type = atom->type; + int nlocal = atom->nlocal; + + double count[2],all[2]; + count[0] = count[1] = 0.0; + for (int k = 0; k < nlocal; k++) { + if (type[k] == i) count[0] += 1.0; + if (type[k] == j) count[1] += 1.0; + } + MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world); + + double sig2 = sigma[i][j]*sigma[i][j]; + double sig6 = sig2*sig2*sig2; + double rc3 = cut_lj[i][j]*cut_lj[i][j]*cut_lj[i][j]; + double rc6 = rc3*rc3; + double rc9 = rc3*rc6; + etail_ij = 8.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (sig6 - 3.0*rc6) / (9.0*rc9); + ptail_ij = 16.0*MY_PI*all[0]*all[1]*epsilon[i][j] * + sig6 * (2.0*sig6 - 3.0*rc6) / (9.0*rc9); + } + + return cut; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&cut_lj[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&epsilon[i][j],sizeof(double),1,fp); + fread(&sigma[i][j],sizeof(double),1,fp); + fread(&cut_lj[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_restart_settings(FILE *fp) +{ + fwrite(&alf,sizeof(double),1,fp); + fwrite(&cut_lj_global,sizeof(double),1,fp); + fwrite(&cut_coul,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&tail_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::read_restart_settings(FILE *fp) +{ + int me = comm->me; + if (me == 0) { + fread(&alf,sizeof(double),1,fp); + fread(&cut_lj_global,sizeof(double),1,fp); + fread(&cut_coul,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + fread(&tail_flag,sizeof(int),1,fp); + } + MPI_Bcast(&alf,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&tail_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairLJCutCoulWolf::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut_lj[i][j]); +} diff --git a/src/pair_lj_cut_coul_wolf.h b/src/pair_lj_cut_coul_wolf.h new file mode 100644 index 0000000000..aa4e08f9b7 --- /dev/null +++ b/src/pair_lj_cut_coul_wolf.h @@ -0,0 +1,70 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/cut/coul/wolf,PairLJCutCoulWolf) + +#else + +#ifndef LMP_PAIR_LJ_CUT_COUL_WOLF_H +#define LMP_PAIR_LJ_CUT_COUL_WOLF_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairLJCutCoulWolf : public Pair { + public: + PairLJCutCoulWolf(class LAMMPS *); + virtual ~PairLJCutCoulWolf(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + + protected: + double cut_lj_global; + double **cut_lj,**cut_ljsq; + double **epsilon,**sigma; + double **lj1,**lj2,**lj3,**lj4,**offset; + double cut_coul,cut_coulsq,alf; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +*/ diff --git a/src/pair_mie_cut.cpp b/src/pair_mie_cut.cpp index 320f21248d..04f8de8d7d 100644 --- a/src/pair_mie_cut.cpp +++ b/src/pair_mie_cut.cpp @@ -159,10 +159,10 @@ void PairMIECut::compute_inner() double *special_mie = force->special_lj; int newton_pair = force->newton_pair; - inum = listinner->inum; - ilist = listinner->ilist; - numneigh = listinner->numneigh; - firstneigh = listinner->firstneigh; + inum = list->inum_inner; + ilist = list->ilist_inner; + numneigh = list->numneigh_inner; + firstneigh = list->firstneigh_inner; double cut_out_on = cut_respa[0]; double cut_out_off = cut_respa[1]; @@ -233,10 +233,10 @@ void PairMIECut::compute_middle() double *special_mie = force->special_lj; int newton_pair = force->newton_pair; - inum = listmiddle->inum; - ilist = listmiddle->ilist; - numneigh = listmiddle->numneigh; - firstneigh = listmiddle->firstneigh; + inum = list->inum_middle; + ilist = list->ilist_middle; + numneigh = list->numneigh_middle; + firstneigh = list->firstneigh_middle; double cut_in_off = cut_respa[0]; double cut_in_on = cut_respa[1]; @@ -320,10 +320,10 @@ void PairMIECut::compute_outer(int eflag, int vflag) double *special_mie = force->special_lj; int newton_pair = force->newton_pair; - inum = listouter->inum; - ilist = listouter->ilist; - numneigh = listouter->numneigh; - firstneigh = listouter->firstneigh; + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; double cut_in_off = cut_respa[2]; double cut_in_on = cut_respa[3]; @@ -496,36 +496,23 @@ void PairMIECut::coeff(int narg, char **arg) void PairMIECut::init_style() { - // request regular or rRESPA neighbor lists + // request regular or rRESPA neighbor list int irequest; + int respa = 0; if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { - int respa = 0; if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + } - if (respa == 0) irequest = neighbor->request(this,instance_me); - else if (respa == 1) { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } else { - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 1; - neighbor->requests[irequest]->respainner = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 2; - neighbor->requests[irequest]->respamiddle = 1; - irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->id = 3; - neighbor->requests[irequest]->respaouter = 1; - } + irequest = neighbor->request(this,instance_me); - } else irequest = neighbor->request(this,instance_me); + if (respa >= 1) { + neighbor->requests[irequest]->respaouter = 1; + neighbor->requests[irequest]->respainner = 1; + } + if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; // set rRESPA cutoffs @@ -535,19 +522,6 @@ void PairMIECut::init_style() else cut_respa = NULL; } -/* ---------------------------------------------------------------------- - neighbor callback to inform pair style of neighbor list to use - regular or rRESPA -------------------------------------------------------------------------- */ - -void PairMIECut::init_list(int id, NeighList *ptr) -{ - if (id == 0) list = ptr; - else if (id == 1) listinner = ptr; - else if (id == 2) listmiddle = ptr; - else if (id == 3) listouter = ptr; -} - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/pair_mie_cut.h b/src/pair_mie_cut.h index 2a0a29843e..9e12438d14 100644 --- a/src/pair_mie_cut.h +++ b/src/pair_mie_cut.h @@ -32,7 +32,6 @@ class PairMIECut : public Pair { void settings(int, char **); void coeff(int, char **); void init_style(); - void init_list(int, class NeighList *); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); diff --git a/src/pair_table.h b/src/pair_table.h index 2de4b6ea99..b723fd2d98 100644 --- a/src/pair_table.h +++ b/src/pair_table.h @@ -30,19 +30,19 @@ class PairTable : public Pair { virtual ~PairTable(); virtual void compute(int, int); - void settings(int, char **); + virtual void settings(int, char **); void coeff(int, char **); - double init_one(int, int); + virtual double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double single(int, int, int, int, double, double, double, double &); + virtual double single(int, int, int, int, double, double, double, double &); void *extract(const char *, int &); - protected: enum{LOOKUP,LINEAR,SPLINE,BITMAP}; + protected: int tabstyle,tablength; struct Table { int ninput,rflag,fpflag,match,ntablebits; @@ -66,8 +66,8 @@ class PairTable : public Pair { virtual void compute_table(Table *); void null_table(Table *); void free_table(Table *); - void spline(double *, double *, int, double, double, double *); - double splint(double *, double *, double *, int, double); + static void spline(double *, double *, int, double, double, double *); + static double splint(double *, double *, double *, int, double); }; } diff --git a/src/pair_ufm.cpp b/src/pair_ufm.cpp new file mode 100644 index 0000000000..6462c0e797 --- /dev/null +++ b/src/pair_ufm.cpp @@ -0,0 +1,376 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/* ----------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_ufm.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "respa.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +/* ---------------------------------------------------------------------- */ + +PairUFM::PairUFM(LAMMPS *lmp) : Pair(lmp) +{ + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairUFM::~PairUFM() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(cut); + memory->destroy(epsilon); + memory->destroy(sigma); + memory->destroy(scale); + memory->destroy(uf1); + memory->destroy(uf2); + memory->destroy(uf3); + memory->destroy(uf4); + memory->destroy(offset); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairUFM::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq, expuf, factor; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + expuf = exp(- rsq * uf2[itype][jtype]); + fpair = factor * scale[itype][jtype] * uf1[itype][jtype] * expuf /(1.0 - expuf); + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + evdwl = -uf3[itype][jtype] * log(1.0 - expuf) - offset[itype][jtype]; + evdwl *= factor; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairUFM::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(cut,n+1,n+1,"pair:cut"); + memory->create(epsilon,n+1,n+1,"pair:epsilon"); + memory->create(sigma,n+1,n+1,"pair:sigma"); + memory->create(scale,n+1,n+1,"pair:scale"); + memory->create(uf1,n+1,n+1,"pair:uf1"); + memory->create(uf2,n+1,n+1,"pair:uf2"); + memory->create(uf3,n+1,n+1,"pair:uf3"); + memory->create(uf4,n+1,n+1,"pair:uf4"); + memory->create(offset,n+1,n+1,"pair:offset"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairUFM::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + cut_global = force->numeric(FLERR,arg[0]); + + // reset cutoffs that have been explicitly set + + if (allocated) { + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i+1; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; + } +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairUFM::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double epsilon_one = force->numeric(FLERR,arg[2]); + double sigma_one = force->numeric(FLERR,arg[3]); + + double cut_one = cut_global; + + if (narg == 5) cut_one = force->numeric(FLERR,arg[4]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + epsilon[i][j] = epsilon_one; + sigma[i][j] = sigma_one; + scale[i][j] = 1.0; + cut[i][j] = cut_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairUFM::init_one(int i, int j) +{ + if (setflag[i][j] == 0) { + epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], + sigma[i][i],sigma[j][j]); + sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]); + cut[i][j] = mix_distance(cut[i][i],cut[j][j]); + } + + uf1[i][j] = 2.0 * epsilon[i][j] / pow(sigma[i][j],2.0); + uf2[i][j] = 1.0 / pow(sigma[i][j],2.0); + uf3[i][j] = epsilon[i][j]; + uf4[i][j] = sigma[i][j]; + + if (offset_flag) { + double ratio = pow(cut[i][j] / sigma[i][j],2.0); + offset[i][j] = - epsilon[i][j] * log ( 1.0 - exp( -ratio )) ; + } else offset[i][j] = 0.0; + + uf1[j][i] = uf1[i][j]; + uf2[j][i] = uf2[i][j]; + uf3[j][i] = uf3[i][j]; + uf4[j][i] = uf4[i][j]; + scale[j][i] = scale[i][j]; + offset[j][i] = offset[i][j]; + + return cut[i][j]; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairUFM::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + if (setflag[i][j]) { + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&cut[i][j],sizeof(double),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairUFM::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (setflag[i][j]) { + if (me == 0) { + fread(&epsilon[i][j],sizeof(double),1,fp); + fread(&sigma[i][j],sizeof(double),1,fp); + fread(&cut[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairUFM::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairUFM::read_restart_settings(FILE *fp) +{ + int me = comm->me; + if (me == 0) { + fread(&cut_global,sizeof(double),1,fp); + fread(&offset_flag,sizeof(int),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairUFM::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairUFM::write_data_all(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut[i][j]); +} + +/* ---------------------------------------------------------------------- */ + +double PairUFM::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double expuf,phiuf; + expuf = exp(- rsq * uf2[itype][jtype]); + fforce = factor_lj * uf1[itype][jtype] * expuf /(1.0 - expuf); + phiuf = - uf3[itype][jtype] * log(1.0 - expuf) - offset[itype][jtype]; + return factor_lj * phiuf; +} + +/* ---------------------------------------------------------------------- */ + +void *PairUFM::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"epsilon") == 0) return (void *) epsilon; + if (strcmp(str,"sigma") == 0) return (void *) sigma; + if (strcmp(str,"scale") == 0) return (void *) scale; + return NULL; +} diff --git a/src/pair_ufm.h b/src/pair_ufm.h new file mode 100644 index 0000000000..2161c2acaf --- /dev/null +++ b/src/pair_ufm.h @@ -0,0 +1,76 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: + Rodolfo Paula Leite (Unicamp/Brazil) - pl.rodolfo@gmail.com + Maurice de Koning (Unicamp/Brazil) - dekoning@ifi.unicamp.br + ------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(ufm,PairUFM) + +#else + +#ifndef LMP_PAIR_UFM_H +#define LMP_PAIR_UFM_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairUFM : public Pair { + public: + PairUFM(class LAMMPS *); + virtual ~PairUFM(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + void write_data(FILE *); + void write_data_all(FILE *); + double single(int, int, int, int, double, double, double, double &); + void *extract(const char *, int &); + + protected: + double cut_global; + double **cut,**scale; + double **epsilon,**sigma; + double **uf1,**uf2,**uf3,**uf4,**offset; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +*/ diff --git a/src/pair_yukawa.cpp b/src/pair_yukawa.cpp index 2ba6633d9e..9be9237734 100644 --- a/src/pair_yukawa.cpp +++ b/src/pair_yukawa.cpp @@ -139,7 +139,6 @@ void PairYukawa::allocate() setflag[i][j] = 0; memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(rad,n+1,"pair:rad"); memory->create(cut,n+1,n+1,"pair:cut"); memory->create(a,n+1,n+1,"pair:a"); diff --git a/src/pair_yukawa.h b/src/pair_yukawa.h index 3859d163af..3222019a0a 100644 --- a/src/pair_yukawa.h +++ b/src/pair_yukawa.h @@ -46,7 +46,7 @@ class PairYukawa : public Pair { double *rad; double **cut,**a,**offset; - void allocate(); + virtual void allocate(); }; } diff --git a/src/pair_zbl.cpp b/src/pair_zbl.cpp index 86c6c64d77..ce6c581ced 100644 --- a/src/pair_zbl.cpp +++ b/src/pair_zbl.cpp @@ -48,6 +48,8 @@ PairZBL::PairZBL(LAMMPS *lmp) : Pair(lmp) {} PairZBL::~PairZBL() { + if (copymode) return; + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); diff --git a/src/pair_zbl.h b/src/pair_zbl.h index 0dc01731d3..b89dd680b2 100644 --- a/src/pair_zbl.h +++ b/src/pair_zbl.h @@ -31,8 +31,8 @@ class PairZBL : public Pair { virtual void compute(int, int); void settings(int, char **); void coeff(int, char **); - void init_style(); - double init_one(int, int); + virtual void init_style(); + virtual double init_one(int, int); double single(int, int, int, int, double, double, double, double &); protected: @@ -42,7 +42,7 @@ class PairZBL : public Pair { double **d1a,**d2a,**d3a,**d4a,**zze; double **sw1,**sw2,**sw3,**sw4,**sw5; - void allocate(); + virtual void allocate(); double e_zbl(double, int, int); double dzbldr(double, int, int); double d2zbldr2(double, int, int); diff --git a/src/pointers.h b/src/pointers.h index 82b49c1dad..44967f5135 100644 --- a/src/pointers.h +++ b/src/pointers.h @@ -57,6 +57,7 @@ class Pointers { screen(ptr->screen), logfile(ptr->logfile), atomKK(ptr->atomKK), + memoryKK(ptr->memoryKK), python(ptr->python) {} virtual ~Pointers() {} @@ -84,6 +85,7 @@ class Pointers { FILE *&logfile; class AtomKokkos *&atomKK; + class MemoryKokkos *&memoryKK; class Python *&python; }; diff --git a/src/read_data.cpp b/src/read_data.cpp index b1a42608c0..3b93098a6e 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -124,7 +124,7 @@ void ReadData::command(int narg, char **arg) addflag = NONE; coeffflag = 1; - id_offset = 0; + id_offset = mol_offset = 0; offsetflag = shiftflag = 0; toffset = boffset = aoffset = doffset = ioffset = 0; shift[0] = shift[1] = shift[2] = 0.0; @@ -145,11 +145,21 @@ void ReadData::command(int narg, char **arg) if (strcmp(arg[iarg+1],"append") == 0) addflag = APPEND; else if (strcmp(arg[iarg+1],"merge") == 0) addflag = MERGE; else { + if (atom->molecule_flag && (iarg+3 > narg)) + error->all(FLERR,"Illegal read_data command"); addflag = VALUE; bigint offset = force->bnumeric(FLERR,arg[iarg+1]); if (offset > MAXTAGINT) - error->all(FLERR,"Read data add offset is too big"); + error->all(FLERR,"Read data add atomID offset is too big"); id_offset = offset; + + if (atom->molecule_flag) { + offset = force->bnumeric(FLERR,arg[iarg+2]); + if (offset > MAXTAGINT) + error->all(FLERR,"Read data add molID offset is too big"); + mol_offset = offset; + iarg++; + } } iarg += 2; } else if (strcmp(arg[iarg],"offset") == 0) { @@ -310,14 +320,18 @@ void ReadData::command(int narg, char **arg) update->ntimestep = 0; } - // compute atomID offset for addflag = MERGE + // compute atomID and optionally moleculeID offset for addflag = APPEND if (addflag == APPEND) { tagint *tag = atom->tag; + tagint *molecule = atom->molecule; int nlocal = atom->nlocal; - tagint max = 0; - for (int i = 0; i < nlocal; i++) max = MAX(max,tag[i]); - MPI_Allreduce(&max,&id_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); + tagint maxid = 0, maxmol = 0; + for (int i = 0; i < nlocal; i++) maxid = MAX(maxid,tag[i]); + if (atom->molecule_flag) + for (int i = 0; i < nlocal; i++) maxmol = MAX(maxmol,molecule[i]); + MPI_Allreduce(&maxid,&id_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); + MPI_Allreduce(&maxmol,&mol_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); } // set up pointer to hold original styles while we replace them with "zero" @@ -1137,7 +1151,7 @@ void ReadData::atoms() nchunk = MIN(natoms-nread,CHUNK); eof = comm->read_lines_from_file(fp,nchunk,MAXLINE,buffer); if (eof) error->all(FLERR,"Unexpected end of data file"); - atom->data_atoms(nchunk,buffer,id_offset,toffset,shiftflag,shift); + atom->data_atoms(nchunk,buffer,id_offset,mol_offset,toffset,shiftflag,shift); nread += nchunk; } diff --git a/src/read_data.h b/src/read_data.h index 730229c722..b85ed67dcd 100644 --- a/src/read_data.h +++ b/src/read_data.h @@ -39,7 +39,7 @@ class ReadData : protected Pointers { int narg,maxarg; char argoffset1[8],argoffset2[8]; - bigint id_offset; + bigint id_offset, mol_offset; int nlocal_previous; bigint natoms; diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 6a950353ef..82583bfe01 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -207,7 +207,13 @@ void ReadRestart::command(int narg, char **arg) memory->create(buf,assignedChunkSize,"read_restart:buf"); mpiio->read((headerOffset+assignedChunkOffset),assignedChunkSize,buf); mpiio->close(); - + if (!nextra) { // We can actually calculate number of atoms from assignedChunkSize + atom->nlocal = 1; // temporarily claim there is one atom... + int perAtomSize = avec->size_restart(); // ...so we can get its size + atom->nlocal = 0; // restore nlocal to zero atoms + int atomCt = (int) (assignedChunkSize / perAtomSize); + if (atomCt > atom->nmax) avec->grow(atomCt); + } m = 0; while (m < assignedChunkSize) m += avec->unpack_restart(&buf[m]); } @@ -1010,6 +1016,7 @@ void ReadRestart::file_layout() // if the number of ranks that did the writing is different if (me == 0) { + int ndx; int *all_written_send_sizes; memory->create(all_written_send_sizes,nprocs_file, "write_restart:all_written_send_sizes"); @@ -1019,30 +1026,61 @@ void ReadRestart::file_layout() fread(all_written_send_sizes,sizeof(int),nprocs_file,fp); - int init_chunk_number = nprocs_file/nprocs; - int num_extra_chunks = nprocs_file - (nprocs*init_chunk_number); + if ((nprocs != nprocs_file) && !(atom->nextra_store)) { + // nprocs differ, but atom sizes are fixed length, yeah! + atom->nlocal = 1; // temporarily claim there is one atom... + int perAtomSize = atom->avec->size_restart(); // ...so we can get its size + atom->nlocal = 0; // restore nlocal to zero atoms - for (int i = 0; i < nprocs; i++) { - if (i < num_extra_chunks) - nproc_chunk_number[i] = init_chunk_number+1; - else - nproc_chunk_number[i] = init_chunk_number; - } + bigint total_size = 0; + for (int i = 0; i < nprocs_file; ++i) { + total_size += all_written_send_sizes[i]; + } + bigint total_ct = total_size / perAtomSize; - int all_written_send_sizes_index = 0; - bigint current_offset = 0; - for (int i=0;idestroy(all_written_send_sizes); memory->destroy(nproc_chunk_number); diff --git a/src/region.cpp b/src/region.cpp index e69fdc79d5..da814746ad 100644 --- a/src/region.cpp +++ b/src/region.cpp @@ -142,15 +142,6 @@ int Region::match(double x, double y, double z) return !(inside(x,y,z) ^ interior); } -/* ---------------------------------------------------------------------- - generate error if Kokkos function defaults to base class -------------------------------------------------------------------------- */ - -void Region::match_all_kokkos(int, DAT::t_int_1d) -{ - error->all(FLERR,"Can only use Kokkos supported regions with Kokkos package"); -} - /* ---------------------------------------------------------------------- generate list of contact points for interior or exterior regions if region has variable shape, invoke shape_update() once per timestep diff --git a/src/region.h b/src/region.h index 9c693bfcd5..7e8c45cb2e 100644 --- a/src/region.h +++ b/src/region.h @@ -15,7 +15,6 @@ #define LMP_REGION_H #include "pointers.h" -#include "accelerator_kokkos.h" namespace LAMMPS_NS { @@ -97,10 +96,6 @@ class Region : protected Pointers { virtual void set_velocity_shape() {} virtual void velocity_contact_shape(double*, double*) {} - // Kokkos function, implemented by each Kokkos region - - virtual void match_all_kokkos(int, DAT::t_int_1d); - protected: void add_contact(int, double *, double, double, double); void options(int, char **); diff --git a/src/replicate.cpp b/src/replicate.cpp index e2ed718f65..1251688211 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -44,7 +44,7 @@ void Replicate::command(int narg, char **arg) if (domain->box_exist == 0) error->all(FLERR,"Replicate command before simulation box is defined"); - if (narg != 3) error->all(FLERR,"Illegal replicate command"); + if (narg < 3 || narg > 4) error->all(FLERR,"Illegal replicate command"); int me = comm->me; int nprocs = comm->nprocs; @@ -58,6 +58,10 @@ void Replicate::command(int narg, char **arg) int nz = force->inumeric(FLERR,arg[2]); int nrep = nx*ny*nz; + int bbox_flag = 0; + if (narg == 4) + if (strcmp(arg[3],"bbox") == 0) bbox_flag = 1; + // error and warning checks if (nx <= 0 || ny <= 0 || nz <= 0) @@ -74,6 +78,11 @@ void Replicate::command(int narg, char **arg) if (atom->nextra_grow || atom->nextra_restart || atom->nextra_store) error->all(FLERR,"Cannot replicate with fixes that store atom quantities"); + // Record wall time for atom replication + + MPI_Barrier(world); + double time1 = MPI_Wtime(); + // maxtag = largest atom tag across all existing atoms tagint maxtag = 0; @@ -94,6 +103,37 @@ void Replicate::command(int narg, char **arg) maxmol = maxmol_all; } + // check image flags maximum extent; only efficient small image flags compared to new system + + int _imagelo[3], _imagehi[3]; + _imagelo[0] = 0; + _imagelo[1] = 0; + _imagelo[2] = 0; + _imagehi[0] = 0; + _imagehi[1] = 0; + _imagehi[2] = 0; + + if (bbox_flag) { + + for (i=0; inlocal; ++i) { + imageint image = atom->image[i]; + int xbox = (image & IMGMASK) - IMGMAX; + int ybox = (image >> IMGBITS & IMGMASK) - IMGMAX; + int zbox = (image >> IMG2BITS) - IMGMAX; + + if (xbox < _imagelo[0]) _imagelo[0] = xbox; + if (ybox < _imagelo[1]) _imagelo[1] = ybox; + if (zbox < _imagelo[2]) _imagelo[2] = zbox; + + if (xbox > _imagehi[0]) _imagehi[0] = xbox; + if (ybox > _imagehi[1]) _imagehi[1] = ybox; + if (zbox > _imagehi[2]) _imagehi[2] = zbox; + } + + MPI_Allreduce(MPI_IN_PLACE, &(_imagelo[0]), 3, MPI_INT, MPI_MIN, world); + MPI_Allreduce(MPI_IN_PLACE, &(_imagehi[0]), 3, MPI_INT, MPI_MAX, world); + } + // unmap existing atoms via image flags for (i = 0; i < atom->nlocal; i++) @@ -275,93 +315,392 @@ void Replicate::command(int narg, char **arg) double *coord; int tag_enable = atom->tag_enable; - for (int iproc = 0; iproc < nprocs; iproc++) { - if (me == iproc) { - n = 0; - for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); + if (bbox_flag) { + + // allgather size of buf on each proc + + n = 0; + for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); + + int * size_buf_rnk; + memory->create(size_buf_rnk, nprocs, "replicate:size_buf_rnk"); + + MPI_Allgather(&n, 1, MPI_INT, size_buf_rnk, 1, MPI_INT, world); + + // size of buf_all + + int size_buf_all = 0; + MPI_Allreduce(&n, &size_buf_all, 1, MPI_INT, MPI_SUM, world); + + if (me == 0 && screen) { + fprintf(screen," bounding box image = (%i %i %i) to (%i %i %i)\n", + _imagelo[0],_imagelo[1],_imagelo[2],_imagehi[0],_imagehi[1],_imagehi[2]); + fprintf(screen," bounding box extra memory = %.2f MB\n", + (double)size_buf_all*sizeof(double)/1024/1024); } - MPI_Bcast(&n,1,MPI_INT,iproc,world); - MPI_Bcast(buf,n,MPI_DOUBLE,iproc,world); + + // rnk offsets + + int * disp_buf_rnk; + memory->create(disp_buf_rnk, nprocs, "replicate:disp_buf_rnk"); + disp_buf_rnk[0] = 0; + for (i=1; icreate(buf_all, size_buf_all, "replicate:buf_all"); + + MPI_Allgatherv(buf, n, MPI_DOUBLE, buf_all, size_buf_rnk, disp_buf_rnk, MPI_DOUBLE, world); + + // bounding box of original unwrapped system + + double _orig_lo[3], _orig_hi[3]; + if (triclinic) { + _orig_lo[0] = domain->boxlo[0] + _imagelo[0] * old_xprd + _imagelo[1] * old_xy + _imagelo[2] * old_xz; + _orig_lo[1] = domain->boxlo[1] + _imagelo[1] * old_yprd + _imagelo[2] * old_yz; + _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; + + _orig_hi[0] = domain->boxlo[0] + (_imagehi[0]+1) * old_xprd + (_imagehi[1]+1) * old_xy + (_imagehi[2]+1) * old_xz; + _orig_hi[1] = domain->boxlo[1] + (_imagehi[1]+1) * old_yprd + (_imagehi[2]+1) * old_yz; + _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; + } else { + _orig_lo[0] = domain->boxlo[0] + _imagelo[0] * old_xprd; + _orig_lo[1] = domain->boxlo[1] + _imagelo[1] * old_yprd; + _orig_lo[2] = domain->boxlo[2] + _imagelo[2] * old_zprd; + + _orig_hi[0] = domain->boxlo[0] + (_imagehi[0]+1) * old_xprd; + _orig_hi[1] = domain->boxlo[1] + (_imagehi[1]+1) * old_yprd; + _orig_hi[2] = domain->boxlo[2] + (_imagehi[2]+1) * old_zprd; + } + + double _lo[3], _hi[3]; + + int num_replicas_added = 0; for (ix = 0; ix < nx; ix++) { for (iy = 0; iy < ny; iy++) { for (iz = 0; iz < nz; iz++) { + // domain->remap() overwrites coordinates, so always recompute here + + if (triclinic) { + _lo[0] = _orig_lo[0] + ix * old_xprd + iy * old_xy + iz * old_xz; + _hi[0] = _orig_hi[0] + ix * old_xprd + iy * old_xy + iz * old_xz; + + _lo[1] = _orig_lo[1] + iy * old_yprd + iz * old_yz; + _hi[1] = _orig_hi[1] + iy * old_yprd + iz * old_yz; + + _lo[2] = _orig_lo[2] + iz * old_zprd; + _hi[2] = _orig_hi[2] + iz * old_zprd; + } else { + _lo[0] = _orig_lo[0] + ix * old_xprd; + _hi[0] = _orig_hi[0] + ix * old_xprd; + + _lo[1] = _orig_lo[1] + iy * old_yprd; + _hi[1] = _orig_hi[1] + iy * old_yprd; + + _lo[2] = _orig_lo[2] + iz * old_zprd; + _hi[2] = _orig_hi[2] + iz * old_zprd; + } + + // test if bounding box of shifted replica overlaps sub-domain of proc + // if not, then skip testing atoms + + int xoverlap = 1; + int yoverlap = 1; + int zoverlap = 1; + if (triclinic) { + double _llo[3]; + domain->x2lamda(_lo,_llo); + double _lhi[3]; + domain->x2lamda(_hi,_lhi); + + if (_llo[0] > (subhi[0] - EPSILON) + || _lhi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; + if (_llo[1] > (subhi[1] - EPSILON) + || _lhi[1] < (sublo[1] + EPSILON) ) yoverlap = 0; + if (_llo[2] > (subhi[2] - EPSILON) + || _lhi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; + } else { + if (_lo[0] > (subhi[0] - EPSILON) + || _hi[0] < (sublo[0] + EPSILON) ) xoverlap = 0; + if (_lo[1] > (subhi[1] - EPSILON) + || _hi[1] < (sublo[1] + EPSILON) ) yoverlap = 0; + if (_lo[2] > (subhi[2] - EPSILON) + || _hi[2] < (sublo[2] + EPSILON) ) zoverlap = 0; + } + + int overlap = 0; + if (xoverlap && yoverlap && zoverlap) overlap = 1; + + // if no overlap, test if bounding box wrapped back into new system + + if (!overlap) { + + // wrap back into cell + + imageint imagelo = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + domain->remap(&(_lo[0]), imagelo); + int xboxlo = (imagelo & IMGMASK) - IMGMAX; + int yboxlo = (imagelo >> IMGBITS & IMGMASK) - IMGMAX; + int zboxlo = (imagelo >> IMG2BITS) - IMGMAX; + + imageint imagehi = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + domain->remap(&(_hi[0]), imagehi); + int xboxhi = (imagehi & IMGMASK) - IMGMAX; + int yboxhi = (imagehi >> IMGBITS & IMGMASK) - IMGMAX; + int zboxhi = (imagehi >> IMG2BITS) - IMGMAX; + + if (triclinic) { + double _llo[3]; + _llo[0] = _lo[0]; _llo[1] = _lo[1]; _llo[2] = _lo[2]; + domain->x2lamda(_llo,_lo); + + double _lhi[3]; + _lhi[0] = _hi[0]; _lhi[1] = _hi[1]; _lhi[2] = _hi[2]; + domain->x2lamda(_lhi,_hi); + } + + // test all fragments for any overlap; ok to include false positives + + int _xoverlap1 = 0; + int _xoverlap2 = 0; + if (!xoverlap) { + if (xboxlo < 0) { + _xoverlap1 = 1; + if ( _lo[0] > (subhi[0] - EPSILON) ) _xoverlap1 = 0; + } + + if (xboxhi > 0) { + _xoverlap2 = 1; + if ( _hi[0] < (sublo[0] + EPSILON) ) _xoverlap2 = 0; + } + + if (_xoverlap1 || _xoverlap2) xoverlap = 1; + } + + int _yoverlap1 = 0; + int _yoverlap2 = 0; + if (!yoverlap) { + if (yboxlo < 0) { + _yoverlap1 = 1; + if ( _lo[1] > (subhi[1] - EPSILON) ) _yoverlap1 = 0; + } + + if (yboxhi > 0) { + _yoverlap2 = 1; + if ( _hi[1] < (sublo[1] + EPSILON) ) _yoverlap2 = 0; + } + + if (_yoverlap1 || _yoverlap2) yoverlap = 1; + } + + + int _zoverlap1 = 0; + int _zoverlap2 = 0; + if (!zoverlap) { + if (zboxlo < 0) { + _zoverlap1 = 1; + if ( _lo[2] > (subhi[2] - EPSILON) ) _zoverlap1 = 0; + } + + if (zboxhi > 0) { + _zoverlap2 = 1; + if ( _hi[2] < (sublo[2] + EPSILON) ) _zoverlap2 = 0; + } + + if (_zoverlap1 || _zoverlap2) zoverlap = 1; + } + + // does either fragment overlap w/ sub-domain + + if (xoverlap && yoverlap && zoverlap) overlap = 1; + } + // while loop over one proc's atom list - m = 0; - while (m < n) { - image = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - if (triclinic == 0) { - x[0] = buf[m+1] + ix*old_xprd; - x[1] = buf[m+2] + iy*old_yprd; - x[2] = buf[m+3] + iz*old_zprd; - } else { - x[0] = buf[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; - x[1] = buf[m+2] + iy*old_yprd + iz*old_yz; - x[2] = buf[m+3] + iz*old_zprd; - } - domain->remap(x,image); - if (triclinic) { - domain->x2lamda(x,lamda); - coord = lamda; - } else coord = x; + if (overlap) { + num_replicas_added++; - if (coord[0] >= sublo[0] && coord[0] < subhi[0] && - coord[1] >= sublo[1] && coord[1] < subhi[1] && - coord[2] >= sublo[2] && coord[2] < subhi[2]) { - - m += avec->unpack_restart(&buf[m]); - - i = atom->nlocal - 1; - if (tag_enable) - atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; - else atom_offset = 0; - mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; - - atom->x[i][0] = x[0]; - atom->x[i][1] = x[1]; - atom->x[i][2] = x[2]; - - atom->tag[i] += atom_offset; - atom->image[i] = image; - - if (atom->molecular) { - if (atom->molecule[i] > 0) - atom->molecule[i] += mol_offset; - if (atom->molecular == 1) { - if (atom->avec->bonds_allow) - for (j = 0; j < atom->num_bond[i]; j++) - atom->bond_atom[i][j] += atom_offset; - if (atom->avec->angles_allow) - for (j = 0; j < atom->num_angle[i]; j++) { - atom->angle_atom1[i][j] += atom_offset; - atom->angle_atom2[i][j] += atom_offset; - atom->angle_atom3[i][j] += atom_offset; - } - if (atom->avec->dihedrals_allow) - for (j = 0; j < atom->num_dihedral[i]; j++) { - atom->dihedral_atom1[i][j] += atom_offset; - atom->dihedral_atom2[i][j] += atom_offset; - atom->dihedral_atom3[i][j] += atom_offset; - atom->dihedral_atom4[i][j] += atom_offset; - } - if (atom->avec->impropers_allow) - for (j = 0; j < atom->num_improper[i]; j++) { - atom->improper_atom1[i][j] += atom_offset; - atom->improper_atom2[i][j] += atom_offset; - atom->improper_atom3[i][j] += atom_offset; - atom->improper_atom4[i][j] += atom_offset; - } - } + m = 0; + while (m < size_buf_all) { + image = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + if (triclinic == 0) { + x[0] = buf_all[m+1] + ix*old_xprd; + x[1] = buf_all[m+2] + iy*old_yprd; + x[2] = buf_all[m+3] + iz*old_zprd; + } else { + x[0] = buf_all[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; + x[1] = buf_all[m+2] + iy*old_yprd + iz*old_yz; + x[2] = buf_all[m+3] + iz*old_zprd; } - } else m += static_cast (buf[m]); + domain->remap(x,image); + if (triclinic) { + domain->x2lamda(x,lamda); + coord = lamda; + } else coord = x; + + if (coord[0] >= sublo[0] && coord[0] < subhi[0] && + coord[1] >= sublo[1] && coord[1] < subhi[1] && + coord[2] >= sublo[2] && coord[2] < subhi[2]) { + + m += avec->unpack_restart(&buf_all[m]); + + i = atom->nlocal - 1; + if (tag_enable) + atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; + else atom_offset = 0; + mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; + + atom->x[i][0] = x[0]; + atom->x[i][1] = x[1]; + atom->x[i][2] = x[2]; + + atom->tag[i] += atom_offset; + atom->image[i] = image; + + if (atom->molecular) { + if (atom->molecule[i] > 0) + atom->molecule[i] += mol_offset; + if (atom->molecular == 1) { + if (atom->avec->bonds_allow) + for (j = 0; j < atom->num_bond[i]; j++) + atom->bond_atom[i][j] += atom_offset; + if (atom->avec->angles_allow) + for (j = 0; j < atom->num_angle[i]; j++) { + atom->angle_atom1[i][j] += atom_offset; + atom->angle_atom2[i][j] += atom_offset; + atom->angle_atom3[i][j] += atom_offset; + } + if (atom->avec->dihedrals_allow) + for (j = 0; j < atom->num_dihedral[i]; j++) { + atom->dihedral_atom1[i][j] += atom_offset; + atom->dihedral_atom2[i][j] += atom_offset; + atom->dihedral_atom3[i][j] += atom_offset; + atom->dihedral_atom4[i][j] += atom_offset; + } + if (atom->avec->impropers_allow) + for (j = 0; j < atom->num_improper[i]; j++) { + atom->improper_atom1[i][j] += atom_offset; + atom->improper_atom2[i][j] += atom_offset; + atom->improper_atom3[i][j] += atom_offset; + atom->improper_atom4[i][j] += atom_offset; + } + } + } + } else m += static_cast (buf_all[m]); + } + } // if (overlap) + + } + } + } + + memory->destroy(size_buf_rnk); + memory->destroy(disp_buf_rnk); + memory->destroy(buf_all); + + int sum = 0; + MPI_Reduce(&num_replicas_added, &sum, 1, MPI_INT, MPI_SUM, 0, world); + double avg = (double) sum / nprocs; + if (me == 0 && screen) + fprintf(screen," average # of replicas added to proc = %.2f out of %i (%.2f %%)\n", + avg,nx*ny*nz,avg/(nx*ny*nz)*100.0); + + } else { + + for (int iproc = 0; iproc < nprocs; iproc++) { + if (me == iproc) { + n = 0; + for (i = 0; i < old->nlocal; i++) n += old_avec->pack_restart(i,&buf[n]); + } + MPI_Bcast(&n,1,MPI_INT,iproc,world); + MPI_Bcast(buf,n,MPI_DOUBLE,iproc,world); + + for (ix = 0; ix < nx; ix++) { + for (iy = 0; iy < ny; iy++) { + for (iz = 0; iz < nz; iz++) { + + // while loop over one proc's atom list + + m = 0; + while (m < n) { + image = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + if (triclinic == 0) { + x[0] = buf[m+1] + ix*old_xprd; + x[1] = buf[m+2] + iy*old_yprd; + x[2] = buf[m+3] + iz*old_zprd; + } else { + x[0] = buf[m+1] + ix*old_xprd + iy*old_xy + iz*old_xz; + x[1] = buf[m+2] + iy*old_yprd + iz*old_yz; + x[2] = buf[m+3] + iz*old_zprd; + } + domain->remap(x,image); + if (triclinic) { + domain->x2lamda(x,lamda); + coord = lamda; + } else coord = x; + + if (coord[0] >= sublo[0] && coord[0] < subhi[0] && + coord[1] >= sublo[1] && coord[1] < subhi[1] && + coord[2] >= sublo[2] && coord[2] < subhi[2]) { + + m += avec->unpack_restart(&buf[m]); + + i = atom->nlocal - 1; + if (tag_enable) + atom_offset = iz*ny*nx*maxtag + iy*nx*maxtag + ix*maxtag; + else atom_offset = 0; + mol_offset = iz*ny*nx*maxmol + iy*nx*maxmol + ix*maxmol; + + atom->x[i][0] = x[0]; + atom->x[i][1] = x[1]; + atom->x[i][2] = x[2]; + + atom->tag[i] += atom_offset; + atom->image[i] = image; + + if (atom->molecular) { + if (atom->molecule[i] > 0) + atom->molecule[i] += mol_offset; + if (atom->molecular == 1) { + if (atom->avec->bonds_allow) + for (j = 0; j < atom->num_bond[i]; j++) + atom->bond_atom[i][j] += atom_offset; + if (atom->avec->angles_allow) + for (j = 0; j < atom->num_angle[i]; j++) { + atom->angle_atom1[i][j] += atom_offset; + atom->angle_atom2[i][j] += atom_offset; + atom->angle_atom3[i][j] += atom_offset; + } + if (atom->avec->dihedrals_allow) + for (j = 0; j < atom->num_dihedral[i]; j++) { + atom->dihedral_atom1[i][j] += atom_offset; + atom->dihedral_atom2[i][j] += atom_offset; + atom->dihedral_atom3[i][j] += atom_offset; + atom->dihedral_atom4[i][j] += atom_offset; + } + if (atom->avec->impropers_allow) + for (j = 0; j < atom->num_improper[i]; j++) { + atom->improper_atom1[i][j] += atom_offset; + atom->improper_atom2[i][j] += atom_offset; + atom->improper_atom3[i][j] += atom_offset; + atom->improper_atom4[i][j] += atom_offset; + } + } + } + } else m += static_cast (buf[m]); + } } } } } - } + } // if (bbox_flag) // free communication buffer and old atom class @@ -424,4 +763,16 @@ void Replicate::command(int narg, char **arg) Special special(lmp); special.build(); } + + // Wall time + + MPI_Barrier(world); + double time2 = MPI_Wtime(); + + if (me == 0) { + if (screen) + fprintf(screen," Time spent = %g secs\n",time2-time1); + if (logfile) + fprintf(logfile," Time spent = %g secs\n",time2-time1); + } } diff --git a/src/respa.cpp b/src/respa.cpp index 5d51ff64ee..18630c06d6 100644 --- a/src/respa.cpp +++ b/src/respa.cpp @@ -441,7 +441,8 @@ void Respa::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // compute all forces @@ -516,7 +517,8 @@ void Respa::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -666,8 +668,13 @@ void Respa::recurse(int ilevel) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); + if (modify->n_post_neighbor) { + modify->post_neighbor(); + timer->stamp(Timer::MODIFY); + } + } else if (ilevel == 0) { timer->stamp(); comm->forward_comm(); diff --git a/src/respa.h b/src/respa.h index 0b08b12bd7..f910f0c666 100644 --- a/src/respa.h +++ b/src/respa.h @@ -48,7 +48,7 @@ class Respa : public Integrate { Respa(class LAMMPS *, int, char **); virtual ~Respa(); virtual void init(); - virtual void setup(int flag=1); + virtual void setup(int); virtual void setup_minimal(int); virtual void run(int); virtual void cleanup(); diff --git a/src/run.cpp b/src/run.cpp index 3317545342..37af977e34 100644 --- a/src/run.cpp +++ b/src/run.cpp @@ -175,7 +175,7 @@ void Run::command(int narg, char **arg) if (preflag || update->first_update == 0) { lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); } else output->setup(0); timer->init(); @@ -216,7 +216,7 @@ void Run::command(int narg, char **arg) if (preflag || iter == 0) { lmp->init(); - update->integrate->setup(); + update->integrate->setup(1); } else output->setup(0); timer->init(); diff --git a/src/set.cpp b/src/set.cpp index 59625b7e6c..11b91df4c4 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -36,16 +36,18 @@ #include "math_const.h" #include "memory.h" #include "error.h" +#include "modify.h" using namespace LAMMPS_NS; using namespace MathConst; enum{ATOM_SELECT,MOL_SELECT,TYPE_SELECT,GROUP_SELECT,REGION_SELECT}; + enum{TYPE,TYPE_FRACTION,MOLECULE,X,Y,Z,CHARGE,MASS,SHAPE,LENGTH,TRI, DIPOLE,DIPOLE_RANDOM,QUAT,QUAT_RANDOM,THETA,THETA_RANDOM,ANGMOM,OMEGA, DIAMETER,DENSITY,VOLUME,IMAGE,BOND,ANGLE,DIHEDRAL,IMPROPER, - MESO_E,MESO_CV,MESO_RHO,SMD_MASS_DENSITY,SMD_CONTACT_RADIUS,DPDTHETA, - INAME,DNAME}; + MESO_E,MESO_CV,MESO_RHO,EDPD_TEMP,EDPD_CV,CC,SMD_MASS_DENSITY, + SMD_CONTACT_RADIUS,DPDTHETA,INAME,DNAME}; #define BIG INT_MAX @@ -419,6 +421,46 @@ void Set::command(int narg, char **arg) set(MESO_RHO); iarg += 2; + } else if (strcmp(arg[iarg],"edpd/temp") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + if (strcmp(arg[iarg+1],"NULL") == 0) dvalue = -1.0; + else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else { + dvalue = force->numeric(FLERR,arg[iarg+1]); + if (dvalue < 0.0) error->all(FLERR,"Illegal set command"); + } + if (!atom->edpd_flag) + error->all(FLERR,"Cannot set edpd/temp for this atom style"); + set(EDPD_TEMP); + iarg += 2; + + } else if (strcmp(arg[iarg],"edpd/cv") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + if (strcmp(arg[iarg+1],"NULL") == 0) dvalue = -1.0; + else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else { + dvalue = force->numeric(FLERR,arg[iarg+1]); + if (dvalue < 0.0) error->all(FLERR,"Illegal set command"); + } + if (!atom->edpd_flag) + error->all(FLERR,"Cannot set edpd/cv for this atom style"); + set(EDPD_CV); + iarg += 2; + + } else if (strcmp(arg[iarg],"cc") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal set command"); + if (strcmp(arg[iarg+1],"NULL") == 0) dvalue = -1.0; + else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else { + cc_index = force->inumeric(FLERR,arg[iarg+1]); + dvalue = force->numeric(FLERR,arg[iarg+2]); + if (cc_index < 1) error->all(FLERR,"Illegal set command"); + } + if (!atom->tdpd_flag) + error->all(FLERR,"Cannot set cc for this atom style"); + set(CC); + iarg += 3; + } else if (strcmp(arg[iarg],"smd/mass/density") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); @@ -476,14 +518,28 @@ void Set::command(int narg, char **arg) } else error->all(FLERR,"Illegal set command"); // statistics + // for CC option, include species index MPI_Allreduce(&count,&allcount,1,MPI_INT,MPI_SUM,world); if (comm->me == 0) { - if (screen) fprintf(screen," %d settings made for %s\n", - allcount,arg[origarg]); - if (logfile) fprintf(logfile," %d settings made for %s\n", - allcount,arg[origarg]); + + if (screen) { + if (strcmp(arg[origarg],"cc") == 0) + fprintf(screen," %d settings made for %s index %s\n", + allcount,arg[origarg],arg[origarg+1]); + else + fprintf(screen," %d settings made for %s\n", + allcount,arg[origarg]); + } + if (logfile) { + if (strcmp(arg[origarg],"cc") == 0) + fprintf(logfile," %d settings made for %s index %s\n", + allcount,arg[origarg],arg[origarg+1]); + else + fprintf(logfile," %d settings made for %s\n", + allcount,arg[origarg]); + } } } @@ -663,6 +719,11 @@ void Set::set(int keyword) else if (keyword == MESO_E) atom->e[i] = dvalue; else if (keyword == MESO_CV) atom->cv[i] = dvalue; else if (keyword == MESO_RHO) atom->rho[i] = dvalue; + + else if (keyword == EDPD_TEMP) atom->edpd_temp[i] = dvalue; + else if (keyword == EDPD_CV) atom->edpd_cv[i] = dvalue; + else if (keyword == CC) atom->cc[i][cc_index-1] = dvalue; + else if (keyword == SMD_MASS_DENSITY) { // set mass from volume and supplied mass density atom->rmass[i] = atom->vfrac[i] * dvalue; diff --git a/src/set.h b/src/set.h index dfb06a2e12..5584e228ba 100644 --- a/src/set.h +++ b/src/set.h @@ -35,7 +35,8 @@ class Set : protected Pointers { int style,ivalue,newtype,count,index_custom; int ximage,yimage,zimage,ximageflag,yimageflag,zimageflag; double dvalue,xvalue,yvalue,zvalue,wvalue,fraction; - + int cc_index; + int varflag,varflag1,varflag2,varflag3,varflag4; int ivar1,ivar2,ivar3,ivar4; double *vec1,*vec2,*vec3,*vec4; diff --git a/src/special.cpp b/src/special.cpp index 4697fc40a6..56529e748b 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -561,7 +561,13 @@ void Special::combine() for (j = 0; j < nspecial[i][2]; j++) atom->map_one(onefour[i][j],-1); } - // compute global maxspecial, must be at least 1 + // if atom->maxspecial has been updated before, make certain + // we do not reset it to a smaller value. Since atom->maxspecial + // is initialized to 1, this ensures that it is larger than zero. + + maxspecial = MAX(atom->maxspecial,maxspecial); + + // compute global maxspecial // add in extra factor from special_bonds command // allocate correct special array with same nmax, new maxspecial // previously allocated one must be destroyed @@ -569,7 +575,10 @@ void Special::combine() MPI_Allreduce(&maxspecial,&atom->maxspecial,1,MPI_INT,MPI_MAX,world); atom->maxspecial += force->special_extra; - atom->maxspecial = MAX(atom->maxspecial,1); + + // add force->special_extra only once + + force->special_extra = 0; if (me == 0) { if (screen) @@ -582,7 +591,8 @@ void Special::combine() AtomKokkos* atomKK = (AtomKokkos*) atom; atomKK->modified(Host,SPECIAL_MASK); atomKK->sync(Device,SPECIAL_MASK); - memory->grow_kokkos(atomKK->k_special,atom->special, + MemoryKokkos* memoryKK = (MemoryKokkos*) memory; + memoryKK->grow_kokkos(atomKK->k_special,atom->special, atom->nmax,atom->maxspecial,"atom:special"); atomKK->modified(Device,SPECIAL_MASK); atomKK->sync(Host,SPECIAL_MASK); diff --git a/src/variable.cpp b/src/variable.cpp index 6e16597c63..399fddeee1 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -516,9 +516,12 @@ void Variable::set(int narg, char **arg) strcpy(names[nvar],arg[0]); for (int i = 0; i < n-1; i++) - if (!isalnum(names[nvar][i]) && names[nvar][i] != '_') - error->all(FLERR,"Variable name must be alphanumeric or " - "underscore characters"); + if (!isalnum(names[nvar][i]) && names[nvar][i] != '_') { + char errmsg[128]; + sprintf(errmsg,"Variable name '%s' must have only alphanumeric " + "characters or underscore",names[nvar]); + error->all(FLERR,errmsg); + } nvar++; } @@ -571,11 +574,15 @@ int Variable::next(int narg, char **arg) for (int iarg = 0; iarg < narg; iarg++) { ivar = find(arg[iarg]); - if (ivar < 0) error->all(FLERR,"Invalid variable in next command"); + if (ivar < 0) { + char errmsg[128]; + sprintf(errmsg,"Invalid variable '%s' in next command",arg[iarg]); + error->all(FLERR,errmsg); + } if (style[ivar] == ULOOP && style[find(arg[0])] == UNIVERSE) continue; else if (style[ivar] == UNIVERSE && style[find(arg[0])] == ULOOP) continue; else if (style[ivar] != style[find(arg[0])]) - error->all(FLERR,"All variables in next command must be same style"); + error->all(FLERR,"All variables in next command must have same style"); } // invalid styles: STRING, EQUAL, WORLD, ATOM, VECTOR, GETENV, @@ -822,7 +829,8 @@ char *Variable::retrieve(char *name) if (which[ivar] >= num[ivar]) return NULL; if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has a circular dependency",ivar); + eval_in_progress[ivar] = 1; char *str = NULL; @@ -844,7 +852,7 @@ char *Variable::retrieve(char *name) strcpy(data[ivar][0],result); str = data[ivar][0]; } else if (style[ivar] == EQUAL) { - double answer = evaluate(data[ivar][0],NULL); + double answer = evaluate(data[ivar][0],NULL,ivar); sprintf(data[ivar][1],"%.15g",answer); str = data[ivar][1]; } else if (style[ivar] == FORMAT) { @@ -865,9 +873,12 @@ char *Variable::retrieve(char *name) strcpy(data[ivar][1],result); str = data[ivar][1]; } else if (style[ivar] == PYTHON) { - int ifunc = python->variable_match(data[ivar][0],names[ivar],0); - if (ifunc < 0) - error->all(FLERR,"Python variable does not match Python function"); + int ifunc = python->variable_match(data[ivar][0],name,0); + if (ifunc < 0) { + char errmsg[128]; + sprintf(errmsg,"Python variable '%s' does not match Python function",name); + error->all(FLERR,errmsg); + } python->invoke_function(ifunc,data[ivar][1]); str = data[ivar][1]; // if Python func returns a string longer than VALUELENGTH @@ -895,15 +906,17 @@ char *Variable::retrieve(char *name) double Variable::compute_equal(int ivar) { if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has a circular dependency",ivar); + eval_in_progress[ivar] = 1; double value = 0.0; - if (style[ivar] == EQUAL) value = evaluate(data[ivar][0],NULL); + if (style[ivar] == EQUAL) value = evaluate(data[ivar][0],NULL,ivar); else if (style[ivar] == INTERNAL) value = dvalue[ivar]; else if (style[ivar] == PYTHON) { int ifunc = python->find(data[ivar][0]); - if (ifunc < 0) error->all(FLERR,"Python variable has no function"); + if (ifunc < 0) + print_var_error(FLERR,"Python variable has no function",ivar); python->invoke_function(ifunc,data[ivar][1]); value = atof(data[ivar][1]); } @@ -920,7 +933,7 @@ double Variable::compute_equal(int ivar) double Variable::compute_equal(char *str) { - return evaluate(str,NULL); + return evaluate(str,NULL,-1); } /* ---------------------------------------------------------------------- @@ -937,12 +950,13 @@ void Variable::compute_atom(int ivar, int igroup, double *vstore; if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has a circular dependency",ivar); + eval_in_progress[ivar] = 1; if (style[ivar] == ATOM) { treetype = ATOM; - evaluate(data[ivar][0],&tree); + evaluate(data[ivar][0],&tree,ivar); collapse_tree(tree); } else vstore = reader[ivar]->fixstore->vstore; @@ -1011,16 +1025,19 @@ int Variable::compute_vector(int ivar, double **result) } if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has a circular dependency",ivar); + eval_in_progress[ivar] = 1; treetype = VECTOR; - evaluate(data[ivar][0],&tree); + evaluate(data[ivar][0],&tree,ivar); collapse_tree(tree); int nlen = size_tree_vector(tree); - if (nlen == 0) error->all(FLERR,"Vector-style variable has zero length"); - if (nlen < 0) error->all(FLERR, - "Inconsistent lengths in vector-style variable"); + if (nlen == 0) + print_var_error(FLERR,"Vector-style variable has zero length",ivar); + + if (nlen < 0) + print_var_error(FLERR,"Inconsistent lengths in vector-style variable",ivar); // (re)allocate space for results if necessary @@ -1148,7 +1165,7 @@ void Variable::copy(int narg, char **from, char **to) create a parse tree and return it ------------------------------------------------------------------------- */ -double Variable::evaluate(char *str, Tree **tree) +double Variable::evaluate(char *str, Tree **tree, int ivar) { int op,opprevious; double value1,value2; @@ -1177,20 +1194,21 @@ double Variable::evaluate(char *str, Tree **tree) // ---------------- else if (onechar == '(') { - if (expect == OP) error->all(FLERR,"Invalid syntax in variable formula"); + if (expect == OP) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); expect = OP; char *contents; - i = find_matching_paren(str,i,contents); + i = find_matching_paren(str,i,contents,ivar); i++; // evaluate contents and push on stack if (tree) { Tree *newtree; - evaluate(contents,&newtree); + evaluate(contents,&newtree,ivar); treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = evaluate(contents,NULL); + } else argstack[nargstack++] = evaluate(contents,NULL,ivar); delete [] contents; @@ -1199,7 +1217,8 @@ double Variable::evaluate(char *str, Tree **tree) // ---------------- } else if (isdigit(onechar) || onechar == '.') { - if (expect == OP) error->all(FLERR,"Invalid syntax in variable formula"); + if (expect == OP) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); expect = OP; // istop = end of number, including scientific notation @@ -1235,7 +1254,8 @@ double Variable::evaluate(char *str, Tree **tree) // ---------------- } else if (isalpha(onechar)) { - if (expect == OP) error->all(FLERR,"Invalid syntax in variable formula"); + if (expect == OP) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); expect = OP; // istop = end of word @@ -1256,8 +1276,8 @@ double Variable::evaluate(char *str, Tree **tree) if (strncmp(word,"c_",2) == 0 || strncmp(word,"C_",2) == 0) { if (domain->box_exist == 0) - error->all(FLERR, - "Variable evaluation before simulation box is defined"); + print_var_error(FLERR,"Variable evaluation before " + "simulation box is defined",ivar); // uppercase used to force access of // global vector vs global scalar, and global array vs global vector @@ -1267,7 +1287,7 @@ double Variable::evaluate(char *str, Tree **tree) int icompute = modify->find_compute(word+2); if (icompute < 0) - error->all(FLERR,"Invalid compute ID in variable formula"); + print_var_error(FLERR,"Invalid compute ID in variable formula",ivar); Compute *compute = modify->compute[icompute]; // parse zero or one or two trailing brackets @@ -1297,8 +1317,8 @@ double Variable::evaluate(char *str, Tree **tree) if (update->whichflag == 0) { if (compute->invoked_scalar != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable between " + "runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_SCALAR)) { compute->compute_scalar(); compute->invoked_flag |= INVOKED_SCALAR; @@ -1320,12 +1340,12 @@ double Variable::evaluate(char *str, Tree **tree) if (index1 > compute->size_vector && compute->size_vector_variable == 0) - error->all(FLERR,"Variable formula compute vector " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute vector " + "is accessed out-of-range",ivar); if (update->whichflag == 0) { if (compute->invoked_vector != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable between runs " + "is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_VECTOR)) { compute->compute_vector(); compute->invoked_flag |= INVOKED_VECTOR; @@ -1349,15 +1369,15 @@ double Variable::evaluate(char *str, Tree **tree) if (index1 > compute->size_array_rows && compute->size_array_rows_variable == 0) - error->all(FLERR,"Variable formula compute array " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute array " + "is accessed out-of-range",ivar); if (index2 > compute->size_array_cols) - error->all(FLERR,"Variable formula compute array " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute array " + "is accessed out-of-range",ivar); if (update->whichflag == 0) { if (compute->invoked_array != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable between runs " + "is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_ARRAY)) { compute->compute_array(); compute->invoked_flag |= INVOKED_ARRAY; @@ -1380,17 +1400,18 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 0 && compute->vector_flag) { if (tree == NULL) - error->all(FLERR, - "Compute global vector in equal-style variable formula"); + print_var_error(FLERR,"Compute global vector in " + "equal-style variable formula",ivar); if (treetype == ATOM) - error->all(FLERR, - "Compute global vector in atom-style variable formula"); - if (compute->size_vector == 0) - error->all(FLERR,"Variable formula compute vector is zero length"); + print_var_error(FLERR,"Compute global vector in " + "atom-style variable formula",ivar); + if (compute->size_vector == 0) + print_var_error(FLERR,"Variable formula compute " + "vector is zero length",ivar); if (update->whichflag == 0) { if (compute->invoked_vector != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable between " + "runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_VECTOR)) { compute->compute_vector(); compute->invoked_flag |= INVOKED_VECTOR; @@ -1399,7 +1420,7 @@ double Variable::evaluate(char *str, Tree **tree) Tree *newtree = new Tree(); newtree->type = VECTORARRAY; newtree->array = compute->vector; - newtree->nvector = compute->size_vector; + newtree->nvector = compute->size_vector; newtree->nstride = 1; newtree->selfalloc = 0; newtree->first = newtree->second = NULL; @@ -1411,17 +1432,18 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 1 && compute->array_flag) { if (tree == NULL) - error->all(FLERR, - "Compute global vector in equal-style variable formula"); + print_var_error(FLERR,"Compute global vector in " + "equal-style variable formula",ivar); if (treetype == ATOM) - error->all(FLERR, - "Compute global vector in atom-style variable formula"); - if (compute->size_array_rows == 0) - error->all(FLERR,"Variable formula compute array is zero length"); + print_var_error(FLERR,"Compute global vector in " + "atom-style variable formula",ivar); + if (compute->size_array_rows == 0) + print_var_error(FLERR,"Variable formula compute array " + "is zero length",ivar); if (update->whichflag == 0) { if (compute->invoked_array != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable between " + "runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_ARRAY)) { compute->compute_array(); compute->invoked_flag |= INVOKED_ARRAY; @@ -1430,7 +1452,7 @@ double Variable::evaluate(char *str, Tree **tree) Tree *newtree = new Tree(); newtree->type = VECTORARRAY; newtree->array = &compute->array[0][index1-1]; - newtree->nvector = compute->size_array_rows; + newtree->nvector = compute->size_array_rows; newtree->nstride = compute->size_array_cols; newtree->selfalloc = 0; newtree->first = newtree->second = NULL; @@ -1444,8 +1466,8 @@ double Variable::evaluate(char *str, Tree **tree) if (update->whichflag == 0) { if (compute->invoked_peratom != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable " + "between runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_PERATOM)) { compute->compute_peratom(); compute->invoked_flag |= INVOKED_PERATOM; @@ -1460,12 +1482,12 @@ double Variable::evaluate(char *str, Tree **tree) compute->size_peratom_cols > 0) { if (index2 > compute->size_peratom_cols) - error->all(FLERR,"Variable formula compute array " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute " + "array is accessed out-of-range",ivar); if (update->whichflag == 0) { if (compute->invoked_peratom != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable " + "between runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_PERATOM)) { compute->compute_peratom(); compute->invoked_flag |= INVOKED_PERATOM; @@ -1486,15 +1508,15 @@ double Variable::evaluate(char *str, Tree **tree) compute->size_peratom_cols == 0) { if (tree == NULL) - error->all(FLERR, - "Per-atom compute in equal-style variable formula"); + print_var_error(FLERR,"Per-atom compute in " + "equal-style variable formula",ivar); if (treetype == VECTOR) - error->all(FLERR, - "Per-atom compute in vector-style variable formula"); + print_var_error(FLERR,"Per-atom compute in " + "vector-style variable formula",ivar); if (update->whichflag == 0) { if (compute->invoked_peratom != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable " + "between runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_PERATOM)) { compute->compute_peratom(); compute->invoked_flag |= INVOKED_PERATOM; @@ -1515,18 +1537,18 @@ double Variable::evaluate(char *str, Tree **tree) compute->size_peratom_cols > 0) { if (tree == NULL) - error->all(FLERR, - "Per-atom compute in equal-style variable formula"); + print_var_error(FLERR,"Per-atom compute in " + "equal-style variable formula",ivar); if (treetype == VECTOR) - error->all(FLERR, - "Per-atom compute in vector-style variable formula"); + print_var_error(FLERR,"Per-atom compute in " + "vector-style variable formula",ivar); if (index1 > compute->size_peratom_cols) - error->all(FLERR,"Variable formula compute array " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute array " + "is accessed out-of-range",ivar); if (update->whichflag == 0) { if (compute->invoked_peratom != update->ntimestep) - error->all(FLERR,"Compute used in variable between runs " - "is not current"); + print_var_error(FLERR,"Compute used in variable " + "between runs is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_PERATOM)) { compute->compute_peratom(); compute->invoked_flag |= INVOKED_PERATOM; @@ -1544,7 +1566,7 @@ double Variable::evaluate(char *str, Tree **tree) newtree->nextra = 0; treestack[ntreestack++] = newtree; - } else error->all(FLERR,"Mismatched compute in variable formula"); + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // ---------------- // fix @@ -1552,8 +1574,7 @@ double Variable::evaluate(char *str, Tree **tree) } else if (strncmp(word,"f_",2) == 0 || strncmp(word,"F_",2) == 0) { if (domain->box_exist == 0) - error->all(FLERR, - "Variable evaluation before simulation box is defined"); + print_var_error(FLERR,"Variable evaluation before simulation box is defined",ivar); // uppercase used to force access of // global vector vs global scalar, and global array vs global vector @@ -1562,7 +1583,11 @@ double Variable::evaluate(char *str, Tree **tree) if (word[0] == 'F') lowercase = 0; int ifix = modify->find_fix(word+2); - if (ifix < 0) error->all(FLERR,"Invalid fix ID in variable formula"); + if (ifix < 0) { + char msg[128]; + sprintf(msg,"Invalid fix ID '%s' in variable formula",word+2); + print_var_error(FLERR,msg,ivar); + } Fix *fix = modify->fix[ifix]; // parse zero or one or two trailing brackets @@ -1591,7 +1616,8 @@ double Variable::evaluate(char *str, Tree **tree) if (nbracket == 0 && fix->scalar_flag && lowercase) { if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed " + "at a compatible time",ivar); value1 = fix->compute_scalar(); if (tree) { @@ -1609,10 +1635,11 @@ double Variable::evaluate(char *str, Tree **tree) if (index1 > fix->size_vector && fix->size_vector_variable == 0) - error->all(FLERR,"Variable formula fix vector is " - "accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix vector is " + "accessed out-of-range",ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed " + "at a compatible time",ivar); value1 = fix->compute_vector(index1-1); if (tree) { @@ -1630,13 +1657,11 @@ double Variable::evaluate(char *str, Tree **tree) if (index1 > fix->size_array_rows && fix->size_array_rows_variable == 0) - error->all(FLERR, - "Variable formula fix array is accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar); if (index2 > fix->size_array_cols) - error->all(FLERR, - "Variable formula fix array is accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); value1 = fix->compute_array(index1-1,index2-1); if (tree) { @@ -1653,15 +1678,13 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 0 && fix->vector_flag) { if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); if (tree == NULL) - error->all(FLERR,"Fix global vector in " - "equal-style variable formula"); + print_var_error(FLERR,"Fix global vector in ""equal-style variable formula",ivar); if (treetype == ATOM) - error->all(FLERR,"Fix global vector in " - "atom-style variable formula"); - if (fix->size_vector == 0) - error->all(FLERR,"Variable formula fix vector is zero length"); + print_var_error(FLERR,"Fix global vector in ""atom-style variable formula",ivar); + if (fix->size_vector == 0) + print_var_error(FLERR,"Variable formula fix vector is zero length",ivar); int nvec = fix->size_vector; double *vec; @@ -1672,7 +1695,7 @@ double Variable::evaluate(char *str, Tree **tree) Tree *newtree = new Tree(); newtree->type = VECTORARRAY; newtree->array = vec; - newtree->nvector = nvec; + newtree->nvector = nvec; newtree->nstride = 1; newtree->selfalloc = 1; newtree->first = newtree->second = NULL; @@ -1684,26 +1707,27 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 1 && fix->array_flag) { if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed " + "at a compatible time",ivar); if (tree == NULL) - error->all(FLERR,"Fix global vector in " - "equal-style variable formula"); + print_var_error(FLERR,"Fix global vector in " + "equal-style variable formula",ivar); if (treetype == ATOM) - error->all(FLERR,"Fix global vector in " - "atom-style variable formula"); - if (fix->size_array_rows == 0) - error->all(FLERR,"Variable formula fix array is zero length"); + print_var_error(FLERR,"Fix global vector in " + "atom-style variable formula",ivar); + if (fix->size_array_rows == 0) + print_var_error(FLERR,"Variable formula fix array is zero length",ivar); - int nvec = fix->size_array_rows; - double *vec; - memory->create(vec,nvec,"variable:values"); - for (int m = 0; m < nvec; m++) - vec[m] = fix->compute_array(m,index1-1); + int nvec = fix->size_array_rows; + double *vec; + memory->create(vec,nvec,"variable:values"); + for (int m = 0; m < nvec; m++) + vec[m] = fix->compute_array(m,index1-1); Tree *newtree = new Tree(); newtree->type = VECTORARRAY; newtree->array = vec; - newtree->nvector = nvec; + newtree->nvector = nvec; newtree->nstride = 1; newtree->selfalloc = 1; newtree->first = newtree->second = NULL; @@ -1717,8 +1741,8 @@ double Variable::evaluate(char *str, Tree **tree) if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - error->all(FLERR, - "Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed " + "at a compatible time",ivar); peratom2global(1,NULL,fix->vector_atom,1,index1, tree,treestack,ntreestack,argstack,nargstack); @@ -1729,11 +1753,12 @@ double Variable::evaluate(char *str, Tree **tree) fix->size_peratom_cols > 0) { if (index2 > fix->size_peratom_cols) - error->all(FLERR, - "Variable formula fix array is accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix array is " + "accessed out-of-range",ivar); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed " + "at a compatible time",ivar); if (fix->array_atom) peratom2global(1,NULL,&fix->array_atom[0][index2-1], @@ -1750,10 +1775,10 @@ double Variable::evaluate(char *str, Tree **tree) fix->size_peratom_cols == 0) { if (tree == NULL) - error->all(FLERR,"Per-atom fix in equal-style variable formula"); + print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); Tree *newtree = new Tree(); newtree->type = ATOMARRAY; @@ -1770,13 +1795,13 @@ double Variable::evaluate(char *str, Tree **tree) fix->size_peratom_cols > 0) { if (tree == NULL) - error->all(FLERR,"Per-atom fix in equal-style variable formula"); + print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar); if (index1 > fix->size_peratom_cols) - error->all(FLERR, - "Variable formula fix array is accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix array " + "is accessed out-of-range",ivar); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); Tree *newtree = new Tree(); newtree->type = ATOMARRAY; @@ -1790,7 +1815,7 @@ double Variable::evaluate(char *str, Tree **tree) newtree->nextra = 0; treestack[ntreestack++] = newtree; - } else error->all(FLERR,"Mismatched fix in variable formula"); + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // ---------------- // variable @@ -1800,9 +1825,10 @@ double Variable::evaluate(char *str, Tree **tree) int ivar = find(word+2); if (ivar < 0) - error->all(FLERR,"Invalid variable name in variable formula"); + print_var_error(FLERR,"Invalid variable reference " + "in variable formula",ivar); if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has circular dependency",ivar); // parse zero or one trailing brackets // point i beyond last bracket @@ -1842,7 +1868,7 @@ double Variable::evaluate(char *str, Tree **tree) char *var = retrieve(word+2); if (var == NULL) - error->all(FLERR,"Invalid variable evaluation in variable formula"); + print_var_error(FLERR,"Invalid variable evaluation in variable formula",ivar); if (tree) { Tree *newtree = new Tree(); newtree->type = VALUE; @@ -1858,14 +1884,14 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 0 && style[ivar] == ATOM) { if (tree == NULL) - error->all(FLERR, - "Atom-style variable in equal-style variable formula"); - if (treetype == VECTOR) - error->all(FLERR, - "Atom-style variable in vector-style variable formula"); + print_var_error(FLERR,"Atom-style variable in " + "equal-style variable formula",ivar); + if (treetype == VECTOR) + print_var_error(FLERR,"Atom-style variable in " + "vector-style variable formula",ivar); Tree *newtree; - evaluate(data[ivar][0],&newtree); + evaluate(data[ivar][0],&newtree,ivar); treestack[ntreestack++] = newtree; // v_name = per-atom vector from atomfile-style variable @@ -1873,11 +1899,11 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 0 && style[ivar] == ATOMFILE) { if (tree == NULL) - error->all(FLERR,"Atomfile-style variable in " - "equal-style variable formula"); - if (treetype == VECTOR) - error->all(FLERR,"Atomfile-style variable in " - "vector-style variable formula"); + print_var_error(FLERR,"Atomfile-style variable in " + "equal-style variable formula",ivar); + if (treetype == VECTOR) + print_var_error(FLERR,"Atomfile-style variable in " + "vector-style variable formula",ivar); Tree *newtree = new Tree(); newtree->type = ATOMARRAY; @@ -1894,11 +1920,11 @@ double Variable::evaluate(char *str, Tree **tree) } else if (nbracket == 0 && style[ivar] == VECTOR) { if (tree == NULL) - error->all(FLERR, - "Vector-style variable in equal-style variable formula"); + print_var_error(FLERR,"Vector-style variable in " + "equal-style variable formula",ivar); if (treetype == ATOM) - error->all(FLERR, - "Vector-style variable in atom-style variable formula"); + print_var_error(FLERR,"Vector-style variable in " + "atom-style variable formula",ivar); double *vec; int nvec = compute_vector(ivar,&vec); @@ -1941,7 +1967,7 @@ double Variable::evaluate(char *str, Tree **tree) double *vec; int nvec = compute_vector(ivar,&vec); if (index <= 0 || index > nvec) - error->all(FLERR,"Invalid index into vector-style variable"); + print_var_error(FLERR,"Invalid index into vector-style variable",ivar); int m = index; // convert from tagint to int if (tree) { @@ -1953,7 +1979,7 @@ double Variable::evaluate(char *str, Tree **tree) treestack[ntreestack++] = newtree; } else argstack[nargstack++] = vec[m-1]; - } else error->all(FLERR,"Mismatched variable in variable formula"); + } else print_var_error(FLERR,"Mismatched variable in variable formula",ivar); // ---------------- // math/group/special function or atom value/vector or @@ -1968,17 +1994,21 @@ double Variable::evaluate(char *str, Tree **tree) if (str[i] == '(') { char *contents; - i = find_matching_paren(str,i,contents); + i = find_matching_paren(str,i,contents,ivar); i++; - if (math_function(word,contents,tree, - treestack,ntreestack,argstack,nargstack)); - else if (group_function(word,contents,tree, - treestack,ntreestack,argstack,nargstack)); - else if (special_function(word,contents,tree, - treestack,ntreestack,argstack,nargstack)); - else error->all(FLERR,"Invalid math/group/special function " - "in variable formula"); + if (math_function(word,contents,tree,treestack,ntreestack, + argstack,nargstack,ivar)); + else if (group_function(word,contents,tree,treestack,ntreestack, + argstack,nargstack,ivar)); + else if (special_function(word,contents,tree,treestack,ntreestack, + argstack,nargstack,ivar)); + else { + char msg[128]; + sprintf(msg,"Invalid math/group/special function '%s()'" + "in variable formula", word); + print_var_error(FLERR,msg,ivar); + } delete [] contents; // ---------------- @@ -1987,8 +2017,8 @@ double Variable::evaluate(char *str, Tree **tree) } else if (str[i] == '[') { if (domain->box_exist == 0) - error->all(FLERR, - "Variable evaluation before simulation box is defined"); + print_var_error(FLERR,"Variable evaluation before " + "simulation box is defined",ivar); ptr = &str[i]; tagint id = int_between_brackets(ptr,1); @@ -2003,8 +2033,8 @@ double Variable::evaluate(char *str, Tree **tree) } else if (is_atom_vector(word)) { if (domain->box_exist == 0) - error->all(FLERR, - "Variable evaluation before simulation box is defined"); + print_var_error(FLERR,"Variable evaluation before " + "simulation box is defined",ivar); atom_vector(word,tree,treestack,ntreestack); @@ -2029,12 +2059,15 @@ double Variable::evaluate(char *str, Tree **tree) } else { if (domain->box_exist == 0) - error->all(FLERR, - "Variable evaluation before simulation box is defined"); + print_var_error(FLERR,"Variable evaluation before " + "simulation box is defined",ivar); int flag = output->thermo->evaluate_keyword(word,&value1); - if (flag) - error->all(FLERR,"Invalid thermo keyword in variable formula"); + if (flag) { + char msg[128]; + sprintf(msg,"Invalid thermo keyword '%s' in variable formula",word); + print_var_error(FLERR,msg,ivar); + } if (tree) { Tree *newtree = new Tree(); newtree->type = VALUE; @@ -2061,7 +2094,7 @@ double Variable::evaluate(char *str, Tree **tree) else if (onechar == '^') op = CARAT; else if (onechar == '=') { if (str[i+1] != '=') - error->all(FLERR,"Invalid syntax in variable formula"); + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); op = EQ; i++; } else if (onechar == '!') { @@ -2083,13 +2116,13 @@ double Variable::evaluate(char *str, Tree **tree) } } else if (onechar == '&') { if (str[i+1] != '&') - error->all(FLERR,"Invalid syntax in variable formula"); + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); op = AND; i++; } else if (onechar == '|') { if (str[i+1] == '|') op = OR; else if (str[i+1] == '^') op = XOR; - else error->all(FLERR,"Invalid syntax in variable formula"); + else print_var_error(FLERR,"Invalid syntax in variable formula",ivar); i++; } else op = DONE; @@ -2104,7 +2137,8 @@ double Variable::evaluate(char *str, Tree **tree) continue; } - if (expect == ARG) error->all(FLERR,"Invalid syntax in variable formula"); + if (expect == ARG) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); expect = ARG; // evaluate stack as deep as possible while respecting precedence @@ -2140,16 +2174,18 @@ double Variable::evaluate(char *str, Tree **tree) argstack[nargstack++] = value1 * value2; else if (opprevious == DIVIDE) { if (value2 == 0.0) - error->all(FLERR,"Divide by 0 in variable formula"); + print_var_error(FLERR,"Divide by 0 in variable formula",ivar); argstack[nargstack++] = value1 / value2; } else if (opprevious == MODULO) { if (value2 == 0.0) - error->all(FLERR,"Modulo 0 in variable formula"); + print_var_error(FLERR,"Modulo 0 in variable formula",ivar); argstack[nargstack++] = fmod(value1,value2); } else if (opprevious == CARAT) { if (value2 == 0.0) - error->all(FLERR,"Power by 0 in variable formula"); - argstack[nargstack++] = pow(value1,value2); + argstack[nargstack++] = 1.0; + else if ((value1 == 0.0) && (value2 < 0.0)) + print_var_error(FLERR,"Invalid power expression in variable formula",ivar); + else argstack[nargstack++] = pow(value1,value2); } else if (opprevious == UNARY) { argstack[nargstack++] = -value2; } else if (opprevious == NOT) { @@ -2195,20 +2231,22 @@ double Variable::evaluate(char *str, Tree **tree) opstack[nopstack++] = op; - } else error->all(FLERR,"Invalid syntax in variable formula"); + } else print_var_error(FLERR,"Invalid syntax in variable formula",ivar); } - if (nopstack) error->all(FLERR,"Invalid syntax in variable formula"); + if (nopstack) print_var_error(FLERR,"Invalid syntax in variable formula",ivar); // for atom-style variable, return remaining tree // for equal-style variable, return remaining arg if (tree) { - if (ntreestack != 1) error->all(FLERR,"Invalid syntax in variable formula"); + if (ntreestack != 1) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); *tree = treestack[0]; return 0.0; } else { - if (nargstack != 1) error->all(FLERR,"Invalid syntax in variable formula"); + if (nargstack != 1) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); return argstack[0]; } } @@ -3131,7 +3169,7 @@ void Variable::free_tree(Tree *tree) return loc or right paren ------------------------------------------------------------------------- */ -int Variable::find_matching_paren(char *str, int i,char *&contents) +int Variable::find_matching_paren(char *str, int i, char *&contents, int ivar) { // istop = matching ')' at same level, allowing for nested parens @@ -3144,7 +3182,7 @@ int Variable::find_matching_paren(char *str, int i,char *&contents) else if (str[i] == ')' && ilevel) ilevel--; else if (str[i] == ')') break; } - if (!str[i]) error->all(FLERR,"Invalid syntax in variable formula"); + if (!str[i]) print_var_error(FLERR,"Invalid syntax in variable formula",ivar); int istop = i; int n = istop - istart - 1; @@ -3233,7 +3271,7 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow) int Variable::math_function(char *word, char *contents, Tree **tree, Tree **treestack, int &ntreestack, - double *argstack, int &nargstack) + double *argstack, int &nargstack, int ivar) { // word not a match to any math function @@ -3268,16 +3306,16 @@ int Variable::math_function(char *word, char *contents, Tree **tree, newtree->first = newtree->second = NULL; newtree->nextra = 0; Tree *argtree; - evaluate(args[0],&argtree); + evaluate(args[0],&argtree,ivar); newtree->first = argtree; if (narg > 1) { - evaluate(args[1],&argtree); + evaluate(args[1],&argtree,ivar); newtree->second = argtree; if (narg > 2) { newtree->nextra = narg-2; newtree->extra = new Tree*[narg-2]; for (int i = 2; i < narg; i++) { - evaluate(args[i],&argtree); + evaluate(args[i],&argtree,ivar); newtree->extra[i-2] = argtree; } } @@ -3285,12 +3323,12 @@ int Variable::math_function(char *word, char *contents, Tree **tree, treestack[ntreestack++] = newtree; } else { - value1 = evaluate(args[0],NULL); + value1 = evaluate(args[0],NULL,ivar); if (narg > 1) { - value2 = evaluate(args[1],NULL); + value2 = evaluate(args[1],NULL,ivar); if (narg > 2) { for (int i = 2; i < narg; i++) - values[i-2] = evaluate(args[i],NULL); + values[i-2] = evaluate(args[i],NULL,ivar); } } } @@ -3300,112 +3338,113 @@ int Variable::math_function(char *word, char *contents, Tree **tree, if (strcmp(word,"sqrt") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = SQRT; else { if (value1 < 0.0) - error->all(FLERR,"Sqrt of negative value in variable formula"); + print_var_error(FLERR,"Sqrt of negative value in " + "variable formula",ivar); argstack[nargstack++] = sqrt(value1); } } else if (strcmp(word,"exp") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = EXP; else argstack[nargstack++] = exp(value1); } else if (strcmp(word,"ln") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LN; else { if (value1 <= 0.0) - error->all(FLERR,"Log of zero/negative value in variable formula"); + print_var_error(FLERR,"Log of zero/negative value in variable formula",ivar); argstack[nargstack++] = log(value1); } } else if (strcmp(word,"log") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LOG; else { if (value1 <= 0.0) - error->all(FLERR,"Log of zero/negative value in variable formula"); + print_var_error(FLERR,"Log of zero/negative value in variable formula",ivar); argstack[nargstack++] = log10(value1); } } else if (strcmp(word,"abs") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ABS; else argstack[nargstack++] = fabs(value1); } else if (strcmp(word,"sin") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = SIN; else argstack[nargstack++] = sin(value1); } else if (strcmp(word,"cos") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = COS; else argstack[nargstack++] = cos(value1); } else if (strcmp(word,"tan") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = TAN; else argstack[nargstack++] = tan(value1); } else if (strcmp(word,"asin") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ASIN; else { if (value1 < -1.0 || value1 > 1.0) - error->all(FLERR,"Arcsin of invalid value in variable formula"); + print_var_error(FLERR,"Arcsin of invalid value in variable formula",ivar); argstack[nargstack++] = asin(value1); } } else if (strcmp(word,"acos") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ACOS; else { if (value1 < -1.0 || value1 > 1.0) - error->all(FLERR,"Arccos of invalid value in variable formula"); + print_var_error(FLERR,"Arccos of invalid value in variable formula",ivar); argstack[nargstack++] = acos(value1); } } else if (strcmp(word,"atan") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ATAN; else argstack[nargstack++] = atan(value1); } else if (strcmp(word,"atan2") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ATAN2; else argstack[nargstack++] = atan2(value1,value2); } else if (strcmp(word,"random") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = RANDOM; else { if (randomequal == NULL) { int seed = static_cast (values[0]); if (seed <= 0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); randomequal = new RanMars(lmp,seed); } argstack[nargstack++] = randomequal->uniform()*(value2-value1) + value1; } } else if (strcmp(word,"normal") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = NORMAL; else { if (value2 < 0.0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (randomequal == NULL) { int seed = static_cast (values[0]); if (seed <= 0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); randomequal = new RanMars(lmp,seed); } argstack[nargstack++] = value1 + value2*randomequal->gaussian(); @@ -3413,27 +3452,27 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"ceil") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = CEIL; else argstack[nargstack++] = ceil(value1); } else if (strcmp(word,"floor") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = FLOOR; else argstack[nargstack++] = floor(value1); } else if (strcmp(word,"round") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ROUND; else argstack[nargstack++] = MYROUND(value1); } else if (strcmp(word,"ramp") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use ramp in variable formula between runs"); + print_var_error(FLERR,"Cannot use ramp in variable formula between runs",ivar); if (tree) newtree->type = RAMP; else { double delta = update->ntimestep - update->beginstep; @@ -3444,13 +3483,13 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"stagger") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = STAGGER; else { int ivalue1 = static_cast (value1); int ivalue2 = static_cast (value2); if (ivalue1 <= 0 || ivalue2 <= 0 || ivalue1 <= ivalue2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); int lower = update->ntimestep/ivalue1 * ivalue1; int delta = update->ntimestep - lower; double value; @@ -3461,14 +3500,14 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"logfreq") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LOGFREQ; else { int ivalue1 = static_cast (value1); int ivalue2 = static_cast (value2); int ivalue3 = static_cast (values[0]); if (ivalue1 <= 0 || ivalue2 <= 0 || ivalue3 <= 0 || ivalue2 >= ivalue3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double value; if (update->ntimestep < ivalue1) value = ivalue1; else { @@ -3483,14 +3522,14 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"logfreq2") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LOGFREQ2; else { int ivalue1 = static_cast (value1); int ivalue2 = static_cast (value2); int ivalue3 = static_cast (values[0]); if (ivalue1 <= 0 || ivalue2 <= 0 || ivalue3 <= 0 ) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double value; if (update->ntimestep < ivalue1) value = ivalue1; else { @@ -3508,7 +3547,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"stride") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = STRIDE; else { int ivalue1 = static_cast (value1); @@ -3528,7 +3567,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"stride2") == 0) { if (narg != 6) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = STRIDE2; else { int ivalue1 = static_cast (value1); @@ -3566,9 +3605,9 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"vdisplace") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use vdisplace in variable formula between runs"); + print_var_error(FLERR,"Cannot use vdisplace in variable formula between runs",ivar); if (tree) newtree->type = VDISPLACE; else { double delta = update->ntimestep - update->beginstep; @@ -3578,13 +3617,13 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"swiggle") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use swiggle in variable formula between runs"); + print_var_error(FLERR,"Cannot use swiggle in variable formula between runs",ivar); if (tree) newtree->type = CWIGGLE; else { if (values[0] == 0.0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double delta = update->ntimestep - update->beginstep; double omega = 2.0*MY_PI/values[0]; double value = value1 + value2*sin(omega*delta*update->dt); @@ -3593,13 +3632,13 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"cwiggle") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use cwiggle in variable formula between runs"); + print_var_error(FLERR,"Cannot use cwiggle in variable formula between runs",ivar); if (tree) newtree->type = CWIGGLE; else { if (values[0] == 0.0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double delta = update->ntimestep - update->beginstep; double omega = 2.0*MY_PI/values[0]; double value = value1 + value2*(1.0-cos(omega*delta*update->dt)); @@ -3629,7 +3668,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, int Variable::group_function(char *word, char *contents, Tree **tree, Tree **treestack, int &ntreestack, - double *argstack, int &nargstack) + double *argstack, int &nargstack, int ivar) { // word not a match to any group function @@ -3652,7 +3691,7 @@ int Variable::group_function(char *word, char *contents, Tree **tree, int igroup = group->find(args[0]); if (igroup == -1) - error->all(FLERR,"Group ID in variable formula does not exist"); + print_var_error(FLERR,"Group ID in variable formula does not exist",ivar); // match word to group function @@ -3660,18 +3699,18 @@ int Variable::group_function(char *word, char *contents, Tree **tree, if (strcmp(word,"count") == 0) { if (narg == 1) value = group->count(igroup); - else if (narg == 2) value = group->count(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->count(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"mass") == 0) { if (narg == 1) value = group->mass(igroup); - else if (narg == 2) value = group->mass(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->mass(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"charge") == 0) { if (narg == 1) value = group->charge(igroup); - else if (narg == 2) value = group->charge(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->charge(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"xcm") == 0) { atom->check_mass(FLERR); @@ -3680,14 +3719,14 @@ int Variable::group_function(char *word, char *contents, Tree **tree, double masstotal = group->mass(igroup); group->xcm(igroup,masstotal,xcm); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = xcm[0]; else if (strcmp(args[1],"y") == 0) value = xcm[1]; else if (strcmp(args[1],"z") == 0) value = xcm[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"vcm") == 0) { atom->check_mass(FLERR); @@ -3696,37 +3735,37 @@ int Variable::group_function(char *word, char *contents, Tree **tree, double masstotal = group->mass(igroup); group->vcm(igroup,masstotal,vcm); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->vcm(igroup,masstotal,vcm,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = vcm[0]; else if (strcmp(args[1],"y") == 0) value = vcm[1]; else if (strcmp(args[1],"z") == 0) value = vcm[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"fcm") == 0) { double fcm[3]; if (narg == 2) group->fcm(igroup,fcm); - else if (narg == 3) group->fcm(igroup,fcm,region_function(args[2])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 3) group->fcm(igroup,fcm,region_function(args[2],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = fcm[0]; else if (strcmp(args[1],"y") == 0) value = fcm[1]; else if (strcmp(args[1],"z") == 0) value = fcm[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"bound") == 0) { double minmax[6]; if (narg == 2) group->bounds(igroup,minmax); - else if (narg == 3) group->bounds(igroup,minmax,region_function(args[2])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 3) group->bounds(igroup,minmax,region_function(args[2],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"xmin") == 0) value = minmax[0]; else if (strcmp(args[1],"xmax") == 0) value = minmax[1]; else if (strcmp(args[1],"ymin") == 0) value = minmax[2]; else if (strcmp(args[1],"ymax") == 0) value = minmax[3]; else if (strcmp(args[1],"zmin") == 0) value = minmax[4]; else if (strcmp(args[1],"zmax") == 0) value = minmax[5]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"gyration") == 0) { atom->check_mass(FLERR); @@ -3736,16 +3775,16 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); value = group->gyration(igroup,masstotal,xcm); } else if (narg == 2) { - int iregion = region_function(args[1]); + int iregion = region_function(args[1],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); value = group->gyration(igroup,masstotal,xcm,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"ke") == 0) { if (narg == 1) value = group->ke(igroup); - else if (narg == 2) value = group->ke(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->ke(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"angmom") == 0) { atom->check_mass(FLERR); @@ -3755,15 +3794,15 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); group->angmom(igroup,xcm,lmom); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->angmom(igroup,xcm,lmom,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = lmom[0]; else if (strcmp(args[1],"y") == 0) value = lmom[1]; else if (strcmp(args[1],"z") == 0) value = lmom[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"torque") == 0) { atom->check_mass(FLERR); @@ -3773,15 +3812,15 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); group->torque(igroup,xcm,tq); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->torque(igroup,xcm,tq,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = tq[0]; else if (strcmp(args[1],"y") == 0) value = tq[1]; else if (strcmp(args[1],"z") == 0) value = tq[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"inertia") == 0) { atom->check_mass(FLERR); @@ -3791,18 +3830,18 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); group->inertia(igroup,xcm,inertia); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->inertia(igroup,xcm,inertia,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"xx") == 0) value = inertia[0][0]; else if (strcmp(args[1],"yy") == 0) value = inertia[1][1]; else if (strcmp(args[1],"zz") == 0) value = inertia[2][2]; else if (strcmp(args[1],"xy") == 0) value = inertia[0][1]; else if (strcmp(args[1],"yz") == 0) value = inertia[1][2]; else if (strcmp(args[1],"xz") == 0) value = inertia[0][2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"omega") == 0) { atom->check_mass(FLERR); @@ -3814,17 +3853,17 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->inertia(igroup,xcm,inertia); group->omega(angmom,inertia,omega); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->angmom(igroup,xcm,angmom,iregion); group->inertia(igroup,xcm,inertia,iregion); group->omega(angmom,inertia,omega); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = omega[0]; else if (strcmp(args[1],"y") == 0) value = omega[1]; else if (strcmp(args[1],"z") == 0) value = omega[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } // delete stored args @@ -3847,11 +3886,11 @@ int Variable::group_function(char *word, char *contents, Tree **tree, /* ---------------------------------------------------------------------- */ -int Variable::region_function(char *id) +int Variable::region_function(char *id, int ivar) { int iregion = domain->find_region(id); if (iregion == -1) - error->all(FLERR,"Region ID in variable formula does not exist"); + print_var_error(FLERR,"Region ID in variable formula does not exist",ivar); // init region in case sub-regions have been deleted @@ -3873,7 +3912,7 @@ int Variable::region_function(char *id) int Variable::special_function(char *word, char *contents, Tree **tree, Tree **treestack, int &ntreestack, - double *argstack, int &nargstack) + double *argstack, int &nargstack, int ivar) { double value,xvalue,sx,sy,sxx,sxy; @@ -3908,7 +3947,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, else if (strcmp(word,"slope") == 0) method = SLOPE; if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); Compute *compute = NULL; Fix *fix = NULL; @@ -3927,14 +3966,17 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else index = 0; int icompute = modify->find_compute(&args[0][2]); - if (icompute < 0) - error->all(FLERR,"Invalid compute ID in variable formula"); + if (icompute < 0) { + char msg[128]; + sprintf(msg,"Invalid compute ID '%s' in variable formula",word+2); + print_var_error(FLERR,msg,ivar); + } compute = modify->compute[icompute]; if (index == 0 && compute->vector_flag) { if (update->whichflag == 0) { if (compute->invoked_vector != update->ntimestep) - error->all(FLERR, - "Compute used in variable between runs is not current"); + print_var_error(FLERR,"Compute used in variable between runs " + "is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_VECTOR)) { compute->compute_vector(); compute->invoked_flag |= INVOKED_VECTOR; @@ -3943,19 +3985,19 @@ int Variable::special_function(char *word, char *contents, Tree **tree, nstride = 1; } else if (index && compute->array_flag) { if (index > compute->size_array_cols) - error->all(FLERR,"Variable formula compute array " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute array " + "is accessed out-of-range",ivar); if (update->whichflag == 0) { if (compute->invoked_array != update->ntimestep) - error->all(FLERR, - "Compute used in variable between runs is not current"); + print_var_error(FLERR,"Compute used in variable between runs " + "is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_ARRAY)) { compute->compute_array(); compute->invoked_flag |= INVOKED_ARRAY; } nvec = compute->size_array_rows; nstride = compute->size_array_cols; - } else error->all(FLERR,"Mismatched compute in variable formula"); + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // argument is fix @@ -3968,22 +4010,22 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else index = 0; int ifix = modify->find_fix(&args[0][2]); - if (ifix < 0) error->all(FLERR,"Invalid fix ID in variable formula"); + if (ifix < 0) print_var_error(FLERR,"Invalid fix ID in variable formula",ivar); fix = modify->fix[ifix]; if (index == 0 && fix->vector_flag) { if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); nvec = fix->size_vector; nstride = 1; } else if (index && fix->array_flag) { if (index > fix->size_array_cols) - error->all(FLERR, - "Variable formula fix array is accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix array " + "is accessed out-of-range",ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); nvec = fix->size_array_rows; nstride = fix->size_array_cols; - } else error->all(FLERR,"Mismatched fix in variable formula"); + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // argument is vector-style variable @@ -3996,21 +4038,21 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else index = 0; if (index) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); ivar = find(&args[0][2]); if (ivar < 0) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); if (style[ivar] != VECTOR) - error->all(FLERR, - "Mis-matched special function variable in variable formula"); + print_var_error(FLERR,"Mis-matched special function variable " + "in variable formula",ivar); if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has circular dependency",ivar); double *vec; nvec = compute_vector(ivar,&vec); nstride = 1; - } else error->all(FLERR,"Invalid special function in variable formula"); + } else print_var_error(FLERR,"Invalid special function in variable formula",ivar); value = 0.0; if (method == SLOPE) sx = sy = sxx = sxy = 0.0; @@ -4117,13 +4159,13 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"gmask") == 0) { if (tree == NULL) - error->all(FLERR,"Gmask function in equal-style variable formula"); + print_var_error(FLERR,"Gmask function in equal-style variable formula",ivar); if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); int igroup = group->find(args[0]); if (igroup == -1) - error->all(FLERR,"Group ID in variable formula does not exist"); + print_var_error(FLERR,"Group ID in variable formula does not exist",ivar); Tree *newtree = new Tree(); newtree->type = GMASK; @@ -4134,11 +4176,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"rmask") == 0) { if (tree == NULL) - error->all(FLERR,"Rmask function in equal-style variable formula"); + print_var_error(FLERR,"Rmask function in equal-style variable formula",ivar); if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); - int iregion = region_function(args[0]); + int iregion = region_function(args[0],ivar); domain->regions[iregion]->prematch(); Tree *newtree = new Tree(); @@ -4150,14 +4192,14 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"grmask") == 0) { if (tree == NULL) - error->all(FLERR,"Grmask function in equal-style variable formula"); + print_var_error(FLERR,"Grmask function in equal-style variable formula",ivar); if (narg != 2) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); int igroup = group->find(args[0]); if (igroup == -1) - error->all(FLERR,"Group ID in variable formula does not exist"); - int iregion = region_function(args[1]); + print_var_error(FLERR,"Group ID in variable formula does not exist",ivar); + int iregion = region_function(args[1],ivar); domain->regions[iregion]->prematch(); Tree *newtree = new Tree(); @@ -4172,11 +4214,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"next") == 0) { if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); int ivar = find(args[0]); if (ivar < 0) - error->all(FLERR,"Variable ID in variable formula does not exist"); + print_var_error(FLERR,"Variable ID in variable formula does not exist",ivar); // SCALARFILE has single current value, read next one // save value in tree or on argstack @@ -4201,7 +4243,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (style[ivar] == ATOMFILE) { if (tree == NULL) - error->all(FLERR,"Atomfile variable in equal-style variable formula"); + print_var_error(FLERR,"Atomfile variable in equal-style variable formula",ivar); double *result; memory->create(result,atom->nlocal,"variable:result"); @@ -4219,11 +4261,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree, newtree->nextra = 0; treestack[ntreestack++] = newtree; - } else error->all(FLERR,"Invalid variable style in special function next"); + } else print_var_error(FLERR,"Invalid variable style in special function next",ivar); } else if (strcmp(word,"is_active") == 0) { if (narg != 2) - error->all(FLERR,"Invalid is_active() function in variable formula"); + print_var_error(FLERR,"Invalid is_active() function in variable formula",ivar); Info info(lmp); value = (info.is_active(args[0],args[1])) ? 1.0 : 0.0; @@ -4241,7 +4283,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"is_available") == 0) { if (narg != 2) - error->all(FLERR,"Invalid is_available() function in variable formula"); + print_var_error(FLERR,"Invalid is_available() function in variable formula",ivar); Info info(lmp); value = (info.is_available(args[0],args[1])) ? 1.0 : 0.0; @@ -4259,7 +4301,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"is_defined") == 0) { if (narg != 2) - error->all(FLERR,"Invalid is_defined() function in variable formula"); + print_var_error(FLERR,"Invalid is_defined() function in variable formula",ivar); Info info(lmp); value = (info.is_defined(args[0],args[1])) ? 1.0 : 0.0; @@ -4546,6 +4588,22 @@ char *Variable::find_next_comma(char *str) return NULL; } + +/* ---------------------------------------------------------------------- + helper routine for printing variable name with error message +------------------------------------------------------------------------- */ + +void Variable::print_var_error(const char *srcfile, int lineno, + const char *errmsg, int ivar) +{ + if ((ivar >= 0) && (ivar < nvar)) { + char msg[128]; + + sprintf(msg,"Variable %s: %s",names[ivar],errmsg); + error->all(srcfile,lineno,msg); + } else error->all(srcfile,lineno,errmsg); +} + /* ---------------------------------------------------------------------- debug routine for printing formula tree recursively ------------------------------------------------------------------------- */ @@ -4606,7 +4664,7 @@ double Variable::evaluate_boolean(char *str) expect = OP; char *contents; - i = find_matching_paren(str,i,contents); + i = find_matching_paren(str,i,contents,-1); i++; // evaluate contents and push on stack diff --git a/src/variable.h b/src/variable.h index 886dd7b422..428c4edce8 100644 --- a/src/variable.h +++ b/src/variable.h @@ -97,18 +97,20 @@ class Variable : protected Pointers { void remove(int); void grow(); void copy(int, char **, char **); - double evaluate(char *, Tree **); + double evaluate(char *, Tree **, int); double collapse_tree(Tree *); double eval_tree(Tree *, int); int size_tree_vector(Tree *); int compare_tree_vector(int, int); void free_tree(Tree *); - int find_matching_paren(char *, int, char *&); - int math_function(char *, char *, Tree **, Tree **, int &, double *, int &); - int group_function(char *, char *, Tree **, Tree **, int &, double *, int &); - int region_function(char *); + int find_matching_paren(char *, int, char *&, int); + int math_function(char *, char *, Tree **, Tree **, + int &, double *, int &, int); + int group_function(char *, char *, Tree **, Tree **, + int &, double *, int &, int); + int region_function(char *, int); int special_function(char *, char *, Tree **, Tree **, - int &, double *, int &); + int &, double *, int &, int); void peratom2global(int, char *, double *, int, tagint, Tree **, Tree **, int &, double *, int &); int is_atom_vector(char *); @@ -117,6 +119,7 @@ class Variable : protected Pointers { double constant(char *); int parse_args(char *, char **); char *find_next_comma(char *); + void print_var_error(const char *, int, const char *, int); void print_tree(Tree *, int); }; diff --git a/src/verlet.cpp b/src/verlet.cpp index b242b00722..019f3f2f05 100644 --- a/src/verlet.cpp +++ b/src/verlet.cpp @@ -90,10 +90,9 @@ void Verlet::setup(int flag) if (comm->me == 0 && screen) { fprintf(screen,"Setting up Verlet run ...\n"); if (flag) { - fprintf(screen," Unit style : %s\n", update->unit_style); - fprintf(screen," Current step : " BIGINT_FORMAT "\n", - update->ntimestep); - fprintf(screen," Time step : %g\n", update->dt); + fprintf(screen," Unit style : %s\n",update->unit_style); + fprintf(screen," Current step : " BIGINT_FORMAT "\n",update->ntimestep); + fprintf(screen," Time step : %g\n",update->dt); timer->print_timeout(screen); } } @@ -121,7 +120,8 @@ void Verlet::setup(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // compute all forces @@ -182,7 +182,8 @@ void Verlet::setup_minimal(int flag) domain->image_check(); domain->box_too_small_check(); modify->setup_pre_neighbor(); - neighbor->build(); + neighbor->build(1); + modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -227,6 +228,7 @@ void Verlet::run(int n) int n_post_integrate = modify->n_post_integrate; int n_pre_exchange = modify->n_pre_exchange; int n_pre_neighbor = modify->n_pre_neighbor; + int n_post_neighbor = modify->n_post_neighbor; int n_pre_force = modify->n_pre_force; int n_pre_reverse = modify->n_pre_reverse; int n_post_force = modify->n_post_force; @@ -282,8 +284,12 @@ void Verlet::run(int n) modify->pre_neighbor(); timer->stamp(Timer::MODIFY); } - neighbor->build(); + neighbor->build(1); timer->stamp(Timer::NEIGH); + if (n_post_neighbor) { + modify->post_neighbor(); + timer->stamp(Timer::MODIFY); + } } // force computations diff --git a/src/verlet.h b/src/verlet.h index 29bd3f16b3..e71932a861 100644 --- a/src/verlet.h +++ b/src/verlet.h @@ -29,7 +29,7 @@ class Verlet : public Integrate { Verlet(class LAMMPS *, int, char **); virtual ~Verlet() {} virtual void init(); - virtual void setup(int flag=1); + virtual void setup(int flag); virtual void setup_minimal(int); virtual void run(int); void cleanup(); diff --git a/src/version.h b/src/version.h index c55566c88a..2ca19eaed7 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "24 Jul 2017" +#define LAMMPS_VERSION "8 Mar 2018" diff --git a/src/write_coeff.cpp b/src/write_coeff.cpp index d4d4f99bf3..0556d647cf 100644 --- a/src/write_coeff.cpp +++ b/src/write_coeff.cpp @@ -23,6 +23,7 @@ #include "force.h" #include "universe.h" #include "error.h" +#include "domain.h" using namespace LAMMPS_NS; diff --git a/src/write_data.cpp b/src/write_data.cpp index d8b951dd8c..7c8838628e 100644 --- a/src/write_data.cpp +++ b/src/write_data.cpp @@ -152,8 +152,8 @@ void WriteData::write(char *file) if (natoms != atom->natoms && output->thermo->lostflag == ERROR) error->all(FLERR,"Atom count is inconsistent, cannot write data file"); - // sum up bond,angle counts - // may be different than atom->nbonds,nangles if broken/turned-off + // sum up bond,angle,dihedral,improper counts + // may be different than atom->nbonds,nangles, etc. if broken/turned-off if (atom->molecular == 1 && (atom->nbonds || atom->nbondtypes)) { nbonds_local = atom->avec->pack_bond(NULL); @@ -164,6 +164,16 @@ void WriteData::write(char *file) MPI_Allreduce(&nangles_local,&nangles,1,MPI_LMP_BIGINT,MPI_SUM,world); } + if (atom->molecular == 1 && (atom->ndihedrals || atom->ndihedraltypes)) { + ndihedrals_local = atom->avec->pack_dihedral(NULL); + MPI_Allreduce(&ndihedrals_local,&ndihedrals,1,MPI_LMP_BIGINT,MPI_SUM,world); + } + + if (atom->molecular == 1 && (atom->nimpropers || atom->nimpropertypes)) { + nimpropers_local = atom->avec->pack_improper(NULL); + MPI_Allreduce(&nimpropers_local,&nimpropers,1,MPI_LMP_BIGINT,MPI_SUM,world); + } + // open data file if (me == 0) { @@ -233,11 +243,11 @@ void WriteData::header() fprintf(fp,"%d angle types\n",atom->nangletypes); } if (atom->ndihedrals || atom->ndihedraltypes) { - fprintf(fp,BIGINT_FORMAT " dihedrals\n",atom->ndihedrals); + fprintf(fp,BIGINT_FORMAT " dihedrals\n",ndihedrals); fprintf(fp,"%d dihedral types\n",atom->ndihedraltypes); } if (atom->nimpropers || atom->nimpropertypes) { - fprintf(fp,BIGINT_FORMAT " impropers\n",atom->nimpropers); + fprintf(fp,BIGINT_FORMAT " impropers\n",nimpropers); fprintf(fp,"%d improper types\n",atom->nimpropertypes); } } diff --git a/src/write_data.h b/src/write_data.h index 8c19635602..462c78c794 100644 --- a/src/write_data.h +++ b/src/write_data.h @@ -38,6 +38,8 @@ class WriteData : protected Pointers { FILE *fp; bigint nbonds_local,nbonds; bigint nangles_local,nangles; + bigint ndihedrals_local,ndihedrals; + bigint nimpropers_local,nimpropers; void header(); void type_arrays(); diff --git a/src/write_dump.cpp b/src/write_dump.cpp index 31fca773eb..dcf6c05a14 100644 --- a/src/write_dump.cpp +++ b/src/write_dump.cpp @@ -21,6 +21,7 @@ #include "dump.h" #include "dump_image.h" #include "atom.h" +#include "comm.h" #include "group.h" #include "input.h" #include "update.h" @@ -76,7 +77,7 @@ void WriteDump::command(int narg, char **arg) if (strcmp(arg[1],"cfg") == 0) ((DumpCFG *) dump)->multifile_override = 1; - if (update->first_update == 0) + if ((update->first_update == 0) && (comm->me == 0)) error->warning(FLERR,"Calling write_dump before a full system init."); dump->init(); diff --git a/src/write_restart.cpp b/src/write_restart.cpp index ad6c756558..082e1b873d 100644 --- a/src/write_restart.cpp +++ b/src/write_restart.cpp @@ -95,6 +95,7 @@ void WriteRestart::command(int narg, char **arg) if ((ptr = strchr(arg[0],'*'))) { *ptr = '\0'; sprintf(file,"%s" BIGINT_FORMAT "%s",arg[0],update->ntimestep,ptr+1); + *ptr = '*'; // must restore arg[0] so it can be correctly parsed below } else strcpy(file,arg[0]); // check for multiproc output and an MPI-IO filename diff --git a/tools/ch2lmp/.gitignore b/tools/ch2lmp/.gitignore new file mode 100644 index 0000000000..e1f48f332d --- /dev/null +++ b/tools/ch2lmp/.gitignore @@ -0,0 +1,5 @@ +*.dump +*.restart +*.restart1 +*.restart2 +*.cmap diff --git a/tools/ch2lmp/example-cmap/1gb1.data b/tools/ch2lmp/example-cmap/1gb1.data index 73a418fbff..bb4e832e3b 100644 --- a/tools/ch2lmp/example-cmap/1gb1.data +++ b/tools/ch2lmp/example-cmap/1gb1.data @@ -1,10 +1,11 @@ -LAMMPS data file. CGCMM Style. atom_style full. Created by charmm2lammps v1.9.1 on Wed Oct 5 18:08:55 EDT 2016 +LAMMPS data file. CGCMM Style. atom_style full. Created by charmm2lammps v1.9.1 on Sun Jan 28 05:50:21 EST 2018 2833 atoms 2177 bonds 2209 angles 2707 dihedrals 137 impropers + 54 crossterms 30 atom types 49 bond types @@ -969,1618 +970,1618 @@ Atoms # full 883 122 28 -0.834 -17.1465387178 -10.8944232307 -2.72060258118 # OT 884 122 27 0.417 -16.3895883905 -10.308540954 -2.72060258118 # HT 885 122 27 0.417 -17.903489045 -10.308540954 -2.72060258118 # HT - 886 123 28 -0.834 -17.1465387178 -13.357628393 -0.257397418816 # OT - 887 123 27 0.417 -16.3895883905 -12.7717461164 -0.257397418816 # HT - 888 123 27 0.417 -17.903489045 -12.7717461164 -0.257397418816 # HT - 889 124 28 -0.834 -19.6097438801 -10.8944232307 -0.257397418816 # OT - 890 124 27 0.417 -18.8527935529 -10.308540954 -0.257397418816 # HT - 891 124 27 0.417 -20.3666942074 -10.308540954 -0.257397418816 # HT - 892 125 28 -0.834 -19.6097438801 -13.357628393 2.20580774355 # OT - 893 125 27 0.417 -18.8527935529 -12.7717461164 2.20580774355 # HT - 894 125 27 0.417 -20.3666942074 -12.7717461164 2.20580774355 # HT - 895 126 28 -0.834 -17.1465387178 -10.8944232307 2.20580774355 # OT - 896 126 27 0.417 -16.3895883905 -10.308540954 2.20580774355 # HT - 897 126 27 0.417 -17.903489045 -10.308540954 2.20580774355 # HT - 898 127 28 -0.834 -17.1465387178 -13.357628393 4.66901290592 # OT - 899 127 27 0.417 -16.3895883905 -12.7717461164 4.66901290592 # HT - 900 127 27 0.417 -17.903489045 -12.7717461164 4.66901290592 # HT - 901 128 28 -0.834 -19.6097438801 -10.8944232307 4.66901290592 # OT - 902 128 27 0.417 -18.8527935529 -10.308540954 4.66901290592 # HT - 903 128 27 0.417 -20.3666942074 -10.308540954 4.66901290592 # HT - 904 129 28 -0.834 -19.6097438801 -13.357628393 7.13221806829 # OT - 905 129 27 0.417 -18.8527935529 -12.7717461164 7.13221806829 # HT - 906 129 27 0.417 -20.3666942074 -12.7717461164 7.13221806829 # HT - 907 130 28 -0.834 -17.1465387178 -10.8944232307 7.13221806829 # OT - 908 130 27 0.417 -16.3895883905 -10.308540954 7.13221806829 # HT - 909 130 27 0.417 -17.903489045 -10.308540954 7.13221806829 # HT - 910 131 28 -0.834 -17.1465387178 -13.357628393 9.59542323066 # OT - 911 131 27 0.417 -16.3895883905 -12.7717461164 9.59542323066 # HT - 912 131 27 0.417 -17.903489045 -12.7717461164 9.59542323066 # HT - 913 132 28 -0.834 -19.6097438801 -10.8944232307 9.59542323066 # OT - 914 132 27 0.417 -18.8527935529 -10.308540954 9.59542323066 # HT - 915 132 27 0.417 -20.3666942074 -10.308540954 9.59542323066 # HT - 916 133 28 -0.834 -19.6097438801 -8.43121806829 -12.5734232307 # OT - 917 133 27 0.417 -18.8527935529 -7.84533579167 -12.5734232307 # HT - 918 133 27 0.417 -20.3666942074 -7.84533579167 -12.5734232307 # HT - 919 134 28 -0.834 -17.1465387178 -5.96801290592 -12.5734232307 # OT - 920 134 27 0.417 -16.3895883905 -5.3821306293 -12.5734232307 # HT - 921 134 27 0.417 -17.903489045 -5.3821306293 -12.5734232307 # HT - 922 135 28 -0.834 -17.1465387178 -8.43121806829 -10.1102180683 # OT - 923 135 27 0.417 -16.3895883905 -7.84533579167 -10.1102180683 # HT - 924 135 27 0.417 -17.903489045 -7.84533579167 -10.1102180683 # HT - 925 136 28 -0.834 -19.6097438801 -5.96801290592 -10.1102180683 # OT - 926 136 27 0.417 -18.8527935529 -5.3821306293 -10.1102180683 # HT - 927 136 27 0.417 -20.3666942074 -5.3821306293 -10.1102180683 # HT - 928 137 28 -0.834 -19.6097438801 -8.43121806829 -7.64701290592 # OT - 929 137 27 0.417 -18.8527935529 -7.84533579167 -7.64701290592 # HT - 930 137 27 0.417 -20.3666942074 -7.84533579167 -7.64701290592 # HT - 931 138 28 -0.834 -17.1465387178 -5.96801290592 -7.64701290592 # OT - 932 138 27 0.417 -16.3895883905 -5.3821306293 -7.64701290592 # HT - 933 138 27 0.417 -17.903489045 -5.3821306293 -7.64701290592 # HT - 934 139 28 -0.834 -17.1465387178 -8.43121806829 -5.18380774355 # OT - 935 139 27 0.417 -16.3895883905 -7.84533579167 -5.18380774355 # HT - 936 139 27 0.417 -17.903489045 -7.84533579167 -5.18380774355 # HT - 937 140 28 -0.834 -19.6097438801 -5.96801290592 -5.18380774355 # OT - 938 140 27 0.417 -18.8527935529 -5.3821306293 -5.18380774355 # HT - 939 140 27 0.417 -20.3666942074 -5.3821306293 -5.18380774355 # HT - 940 141 28 -0.834 -19.6097438801 -8.43121806829 -2.72060258118 # OT - 941 141 27 0.417 -18.8527935529 -7.84533579167 -2.72060258118 # HT - 942 141 27 0.417 -20.3666942074 -7.84533579167 -2.72060258118 # HT - 943 142 28 -0.834 -17.1465387178 -5.96801290592 -2.72060258118 # OT - 944 142 27 0.417 -16.3895883905 -5.3821306293 -2.72060258118 # HT - 945 142 27 0.417 -17.903489045 -5.3821306293 -2.72060258118 # HT - 946 143 28 -0.834 -17.1465387178 -8.43121806829 -0.257397418816 # OT - 947 143 27 0.417 -16.3895883905 -7.84533579167 -0.257397418816 # HT - 948 143 27 0.417 -17.903489045 -7.84533579167 -0.257397418816 # HT - 949 144 28 -0.834 -19.6097438801 -5.96801290592 -0.257397418816 # OT - 950 144 27 0.417 -18.8527935529 -5.3821306293 -0.257397418816 # HT - 951 144 27 0.417 -20.3666942074 -5.3821306293 -0.257397418816 # HT - 952 145 28 -0.834 -19.6097438801 -8.43121806829 2.20580774355 # OT - 953 145 27 0.417 -18.8527935529 -7.84533579167 2.20580774355 # HT - 954 145 27 0.417 -20.3666942074 -7.84533579167 2.20580774355 # HT - 955 146 28 -0.834 -17.1465387178 -5.96801290592 2.20580774355 # OT - 956 146 27 0.417 -16.3895883905 -5.3821306293 2.20580774355 # HT - 957 146 27 0.417 -17.903489045 -5.3821306293 2.20580774355 # HT - 958 147 28 -0.834 -17.1465387178 -8.43121806829 4.66901290592 # OT - 959 147 27 0.417 -16.3895883905 -7.84533579167 4.66901290592 # HT - 960 147 27 0.417 -17.903489045 -7.84533579167 4.66901290592 # HT - 961 148 28 -0.834 -19.6097438801 -5.96801290592 4.66901290592 # OT - 962 148 27 0.417 -18.8527935529 -5.3821306293 4.66901290592 # HT - 963 148 27 0.417 -20.3666942074 -5.3821306293 4.66901290592 # HT - 964 149 28 -0.834 -19.6097438801 -8.43121806829 7.13221806829 # OT - 965 149 27 0.417 -18.8527935529 -7.84533579167 7.13221806829 # HT - 966 149 27 0.417 -20.3666942074 -7.84533579167 7.13221806829 # HT - 967 150 28 -0.834 -17.1465387178 -5.96801290592 7.13221806829 # OT - 968 150 27 0.417 -16.3895883905 -5.3821306293 7.13221806829 # HT - 969 150 27 0.417 -17.903489045 -5.3821306293 7.13221806829 # HT - 970 151 28 -0.834 -17.1465387178 -8.43121806829 9.59542323066 # OT - 971 151 27 0.417 -16.3895883905 -7.84533579167 9.59542323066 # HT - 972 151 27 0.417 -17.903489045 -7.84533579167 9.59542323066 # HT - 973 152 28 -0.834 -19.6097438801 -5.96801290592 9.59542323066 # OT - 974 152 27 0.417 -18.8527935529 -5.3821306293 9.59542323066 # HT - 975 152 27 0.417 -20.3666942074 -5.3821306293 9.59542323066 # HT - 976 153 28 -0.834 -19.6097438801 -3.50480774355 -12.5734232307 # OT - 977 153 27 0.417 -18.8527935529 -2.91892546693 -12.5734232307 # HT - 978 153 27 0.417 -20.3666942074 -2.91892546693 -12.5734232307 # HT - 979 154 28 -0.834 -17.1465387178 -1.04160258118 -12.5734232307 # OT - 980 154 27 0.417 -16.3895883905 -0.455720304566 -12.5734232307 # HT - 981 154 27 0.417 -17.903489045 -0.455720304566 -12.5734232307 # HT - 982 155 28 -0.834 -17.1465387178 -3.50480774355 -10.1102180683 # OT - 983 155 27 0.417 -16.3895883905 -2.91892546693 -10.1102180683 # HT - 984 155 27 0.417 -17.903489045 -2.91892546693 -10.1102180683 # HT - 985 156 28 -0.834 -19.6097438801 -1.04160258118 -10.1102180683 # OT - 986 156 27 0.417 -18.8527935529 -0.455720304566 -10.1102180683 # HT - 987 156 27 0.417 -20.3666942074 -0.455720304566 -10.1102180683 # HT - 988 157 28 -0.834 -19.6097438801 -3.50480774355 -7.64701290592 # OT - 989 157 27 0.417 -18.8527935529 -2.91892546693 -7.64701290592 # HT - 990 157 27 0.417 -20.3666942074 -2.91892546693 -7.64701290592 # HT - 991 158 28 -0.834 -17.1465387178 -1.04160258118 -7.64701290592 # OT - 992 158 27 0.417 -16.3895883905 -0.455720304566 -7.64701290592 # HT - 993 158 27 0.417 -17.903489045 -0.455720304566 -7.64701290592 # HT - 994 159 28 -0.834 -17.1465387178 -3.50480774355 -5.18380774355 # OT - 995 159 27 0.417 -16.3895883905 -2.91892546693 -5.18380774355 # HT - 996 159 27 0.417 -17.903489045 -2.91892546693 -5.18380774355 # HT - 997 160 28 -0.834 -19.6097438801 -1.04160258118 -5.18380774355 # OT - 998 160 27 0.417 -18.8527935529 -0.455720304566 -5.18380774355 # HT - 999 160 27 0.417 -20.3666942074 -0.455720304566 -5.18380774355 # HT - 1000 161 28 -0.834 -19.6097438801 -3.50480774355 -2.72060258118 # OT - 1001 161 27 0.417 -18.8527935529 -2.91892546693 -2.72060258118 # HT - 1002 161 27 0.417 -20.3666942074 -2.91892546693 -2.72060258118 # HT - 1003 162 28 -0.834 -17.1465387178 -1.04160258118 -2.72060258118 # OT - 1004 162 27 0.417 -16.3895883905 -0.455720304566 -2.72060258118 # HT - 1005 162 27 0.417 -17.903489045 -0.455720304566 -2.72060258118 # HT - 1006 163 28 -0.834 -17.1465387178 -3.50480774355 -0.257397418816 # OT - 1007 163 27 0.417 -16.3895883905 -2.91892546693 -0.257397418816 # HT - 1008 163 27 0.417 -17.903489045 -2.91892546693 -0.257397418816 # HT - 1009 164 28 -0.834 -19.6097438801 -3.50480774355 2.20580774355 # OT - 1010 164 27 0.417 -18.8527935529 -2.91892546693 2.20580774355 # HT - 1011 164 27 0.417 -20.3666942074 -2.91892546693 2.20580774355 # HT - 1012 165 28 -0.834 -17.1465387178 -3.50480774355 4.66901290592 # OT - 1013 165 27 0.417 -16.3895883905 -2.91892546693 4.66901290592 # HT - 1014 165 27 0.417 -17.903489045 -2.91892546693 4.66901290592 # HT - 1015 166 28 -0.834 -19.6097438801 -1.04160258118 4.66901290592 # OT - 1016 166 27 0.417 -18.8527935529 -0.455720304566 4.66901290592 # HT - 1017 166 27 0.417 -20.3666942074 -0.455720304566 4.66901290592 # HT - 1018 167 28 -0.834 -19.6097438801 -3.50480774355 7.13221806829 # OT - 1019 167 27 0.417 -18.8527935529 -2.91892546693 7.13221806829 # HT - 1020 167 27 0.417 -20.3666942074 -2.91892546693 7.13221806829 # HT - 1021 168 28 -0.834 -17.1465387178 -1.04160258118 7.13221806829 # OT - 1022 168 27 0.417 -16.3895883905 -0.455720304566 7.13221806829 # HT - 1023 168 27 0.417 -17.903489045 -0.455720304566 7.13221806829 # HT - 1024 169 28 -0.834 -17.1465387178 -3.50480774355 9.59542323066 # OT - 1025 169 27 0.417 -16.3895883905 -2.91892546693 9.59542323066 # HT - 1026 169 27 0.417 -17.903489045 -2.91892546693 9.59542323066 # HT - 1027 170 28 -0.834 -19.6097438801 -1.04160258118 9.59542323066 # OT - 1028 170 27 0.417 -18.8527935529 -0.455720304566 9.59542323066 # HT - 1029 170 27 0.417 -20.3666942074 -0.455720304566 9.59542323066 # HT - 1030 171 28 -0.834 -19.6097438801 1.42160258118 -12.5734232307 # OT - 1031 171 27 0.417 -18.8527935529 2.0074848578 -12.5734232307 # HT - 1032 171 27 0.417 -20.3666942074 2.0074848578 -12.5734232307 # HT - 1033 172 28 -0.834 -17.1465387178 3.88480774355 -12.5734232307 # OT - 1034 172 27 0.417 -16.3895883905 4.47069002017 -12.5734232307 # HT - 1035 172 27 0.417 -17.903489045 4.47069002017 -12.5734232307 # HT - 1036 173 28 -0.834 -17.1465387178 1.42160258118 -10.1102180683 # OT - 1037 173 27 0.417 -16.3895883905 2.0074848578 -10.1102180683 # HT - 1038 173 27 0.417 -17.903489045 2.0074848578 -10.1102180683 # HT - 1039 174 28 -0.834 -19.6097438801 3.88480774355 -10.1102180683 # OT - 1040 174 27 0.417 -18.8527935529 4.47069002017 -10.1102180683 # HT - 1041 174 27 0.417 -20.3666942074 4.47069002017 -10.1102180683 # HT - 1042 175 28 -0.834 -19.6097438801 1.42160258118 -7.64701290592 # OT - 1043 175 27 0.417 -18.8527935529 2.0074848578 -7.64701290592 # HT - 1044 175 27 0.417 -20.3666942074 2.0074848578 -7.64701290592 # HT - 1045 176 28 -0.834 -17.1465387178 3.88480774355 -7.64701290592 # OT - 1046 176 27 0.417 -16.3895883905 4.47069002017 -7.64701290592 # HT - 1047 176 27 0.417 -17.903489045 4.47069002017 -7.64701290592 # HT - 1048 177 28 -0.834 -17.1465387178 1.42160258118 -5.18380774355 # OT - 1049 177 27 0.417 -16.3895883905 2.0074848578 -5.18380774355 # HT - 1050 177 27 0.417 -17.903489045 2.0074848578 -5.18380774355 # HT - 1051 178 28 -0.834 -19.6097438801 3.88480774355 -5.18380774355 # OT - 1052 178 27 0.417 -18.8527935529 4.47069002017 -5.18380774355 # HT - 1053 178 27 0.417 -20.3666942074 4.47069002017 -5.18380774355 # HT - 1054 179 28 -0.834 -19.6097438801 1.42160258118 -2.72060258118 # OT - 1055 179 27 0.417 -18.8527935529 2.0074848578 -2.72060258118 # HT - 1056 179 27 0.417 -20.3666942074 2.0074848578 -2.72060258118 # HT - 1057 180 28 -0.834 -17.1465387178 3.88480774355 -2.72060258118 # OT - 1058 180 27 0.417 -16.3895883905 4.47069002017 -2.72060258118 # HT - 1059 180 27 0.417 -17.903489045 4.47069002017 -2.72060258118 # HT - 1060 181 28 -0.834 -19.6097438801 3.88480774355 -0.257397418816 # OT - 1061 181 27 0.417 -18.8527935529 4.47069002017 -0.257397418816 # HT - 1062 181 27 0.417 -20.3666942074 4.47069002017 -0.257397418816 # HT - 1063 182 28 -0.834 -17.1465387178 3.88480774355 2.20580774355 # OT - 1064 182 27 0.417 -16.3895883905 4.47069002017 2.20580774355 # HT - 1065 182 27 0.417 -17.903489045 4.47069002017 2.20580774355 # HT - 1066 183 28 -0.834 -17.1465387178 1.42160258118 4.66901290592 # OT - 1067 183 27 0.417 -16.3895883905 2.0074848578 4.66901290592 # HT - 1068 183 27 0.417 -17.903489045 2.0074848578 4.66901290592 # HT - 1069 184 28 -0.834 -19.6097438801 3.88480774355 4.66901290592 # OT - 1070 184 27 0.417 -18.8527935529 4.47069002017 4.66901290592 # HT - 1071 184 27 0.417 -20.3666942074 4.47069002017 4.66901290592 # HT - 1072 185 28 -0.834 -19.6097438801 1.42160258118 7.13221806829 # OT - 1073 185 27 0.417 -18.8527935529 2.0074848578 7.13221806829 # HT - 1074 185 27 0.417 -20.3666942074 2.0074848578 7.13221806829 # HT - 1075 186 28 -0.834 -17.1465387178 3.88480774355 7.13221806829 # OT - 1076 186 27 0.417 -16.3895883905 4.47069002017 7.13221806829 # HT - 1077 186 27 0.417 -17.903489045 4.47069002017 7.13221806829 # HT - 1078 187 28 -0.834 -17.1465387178 1.42160258118 9.59542323066 # OT - 1079 187 27 0.417 -16.3895883905 2.0074848578 9.59542323066 # HT - 1080 187 27 0.417 -17.903489045 2.0074848578 9.59542323066 # HT - 1081 188 28 -0.834 -19.6097438801 3.88480774355 9.59542323066 # OT - 1082 188 27 0.417 -18.8527935529 4.47069002017 9.59542323066 # HT - 1083 188 27 0.417 -20.3666942074 4.47069002017 9.59542323066 # HT - 1084 189 28 -0.834 -19.6097438801 6.34801290592 -12.5734232307 # OT - 1085 189 27 0.417 -18.8527935529 6.93389518254 -12.5734232307 # HT - 1086 189 27 0.417 -20.3666942074 6.93389518254 -12.5734232307 # HT - 1087 190 28 -0.834 -17.1465387178 8.81121806829 -12.5734232307 # OT - 1088 190 27 0.417 -16.3895883905 9.39710034491 -12.5734232307 # HT - 1089 190 27 0.417 -17.903489045 9.39710034491 -12.5734232307 # HT - 1090 191 28 -0.834 -17.1465387178 6.34801290592 -10.1102180683 # OT - 1091 191 27 0.417 -16.3895883905 6.93389518254 -10.1102180683 # HT - 1092 191 27 0.417 -17.903489045 6.93389518254 -10.1102180683 # HT - 1093 192 28 -0.834 -19.6097438801 8.81121806829 -10.1102180683 # OT - 1094 192 27 0.417 -18.8527935529 9.39710034491 -10.1102180683 # HT - 1095 192 27 0.417 -20.3666942074 9.39710034491 -10.1102180683 # HT - 1096 193 28 -0.834 -19.6097438801 6.34801290592 -7.64701290592 # OT - 1097 193 27 0.417 -18.8527935529 6.93389518254 -7.64701290592 # HT - 1098 193 27 0.417 -20.3666942074 6.93389518254 -7.64701290592 # HT - 1099 194 28 -0.834 -17.1465387178 8.81121806829 -7.64701290592 # OT - 1100 194 27 0.417 -16.3895883905 9.39710034491 -7.64701290592 # HT - 1101 194 27 0.417 -17.903489045 9.39710034491 -7.64701290592 # HT - 1102 195 28 -0.834 -17.1465387178 6.34801290592 -5.18380774355 # OT - 1103 195 27 0.417 -16.3895883905 6.93389518254 -5.18380774355 # HT - 1104 195 27 0.417 -17.903489045 6.93389518254 -5.18380774355 # HT - 1105 196 28 -0.834 -19.6097438801 8.81121806829 -5.18380774355 # OT - 1106 196 27 0.417 -18.8527935529 9.39710034491 -5.18380774355 # HT - 1107 196 27 0.417 -20.3666942074 9.39710034491 -5.18380774355 # HT - 1108 197 28 -0.834 -19.6097438801 6.34801290592 -2.72060258118 # OT - 1109 197 27 0.417 -18.8527935529 6.93389518254 -2.72060258118 # HT - 1110 197 27 0.417 -20.3666942074 6.93389518254 -2.72060258118 # HT - 1111 198 28 -0.834 -19.6097438801 8.81121806829 -0.257397418816 # OT - 1112 198 27 0.417 -18.8527935529 9.39710034491 -0.257397418816 # HT - 1113 198 27 0.417 -20.3666942074 9.39710034491 -0.257397418816 # HT - 1114 199 28 -0.834 -19.6097438801 6.34801290592 2.20580774355 # OT - 1115 199 27 0.417 -18.8527935529 6.93389518254 2.20580774355 # HT - 1116 199 27 0.417 -20.3666942074 6.93389518254 2.20580774355 # HT - 1117 200 28 -0.834 -17.1465387178 8.81121806829 2.20580774355 # OT - 1118 200 27 0.417 -16.3895883905 9.39710034491 2.20580774355 # HT - 1119 200 27 0.417 -17.903489045 9.39710034491 2.20580774355 # HT - 1120 201 28 -0.834 -17.1465387178 6.34801290592 4.66901290592 # OT - 1121 201 27 0.417 -16.3895883905 6.93389518254 4.66901290592 # HT - 1122 201 27 0.417 -17.903489045 6.93389518254 4.66901290592 # HT - 1123 202 28 -0.834 -19.6097438801 8.81121806829 4.66901290592 # OT - 1124 202 27 0.417 -18.8527935529 9.39710034491 4.66901290592 # HT - 1125 202 27 0.417 -20.3666942074 9.39710034491 4.66901290592 # HT - 1126 203 28 -0.834 -19.6097438801 6.34801290592 7.13221806829 # OT - 1127 203 27 0.417 -18.8527935529 6.93389518254 7.13221806829 # HT - 1128 203 27 0.417 -20.3666942074 6.93389518254 7.13221806829 # HT - 1129 204 28 -0.834 -17.1465387178 8.81121806829 7.13221806829 # OT - 1130 204 27 0.417 -16.3895883905 9.39710034491 7.13221806829 # HT - 1131 204 27 0.417 -17.903489045 9.39710034491 7.13221806829 # HT - 1132 205 28 -0.834 -17.1465387178 6.34801290592 9.59542323066 # OT - 1133 205 27 0.417 -16.3895883905 6.93389518254 9.59542323066 # HT - 1134 205 27 0.417 -17.903489045 6.93389518254 9.59542323066 # HT - 1135 206 28 -0.834 -19.6097438801 8.81121806829 9.59542323066 # OT - 1136 206 27 0.417 -18.8527935529 9.39710034491 9.59542323066 # HT - 1137 206 27 0.417 -20.3666942074 9.39710034491 9.59542323066 # HT - 1138 207 28 -0.834 -19.6097438801 11.2744232307 -12.5734232307 # OT - 1139 207 27 0.417 -18.8527935529 11.8603055073 -12.5734232307 # HT - 1140 207 27 0.417 -20.3666942074 11.8603055073 -12.5734232307 # HT - 1141 208 28 -0.834 -17.1465387178 13.737628393 -12.5734232307 # OT - 1142 208 27 0.417 -16.3895883905 14.3235106696 -12.5734232307 # HT - 1143 208 27 0.417 -17.903489045 14.3235106696 -12.5734232307 # HT - 1144 209 28 -0.834 -17.1465387178 11.2744232307 -10.1102180683 # OT - 1145 209 27 0.417 -16.3895883905 11.8603055073 -10.1102180683 # HT - 1146 209 27 0.417 -17.903489045 11.8603055073 -10.1102180683 # HT - 1147 210 28 -0.834 -19.6097438801 13.737628393 -10.1102180683 # OT - 1148 210 27 0.417 -18.8527935529 14.3235106696 -10.1102180683 # HT - 1149 210 27 0.417 -20.3666942074 14.3235106696 -10.1102180683 # HT - 1150 211 28 -0.834 -19.6097438801 11.2744232307 -7.64701290592 # OT - 1151 211 27 0.417 -18.8527935529 11.8603055073 -7.64701290592 # HT - 1152 211 27 0.417 -20.3666942074 11.8603055073 -7.64701290592 # HT - 1153 212 28 -0.834 -17.1465387178 13.737628393 -7.64701290592 # OT - 1154 212 27 0.417 -16.3895883905 14.3235106696 -7.64701290592 # HT - 1155 212 27 0.417 -17.903489045 14.3235106696 -7.64701290592 # HT - 1156 213 28 -0.834 -17.1465387178 11.2744232307 -5.18380774355 # OT - 1157 213 27 0.417 -16.3895883905 11.8603055073 -5.18380774355 # HT - 1158 213 27 0.417 -17.903489045 11.8603055073 -5.18380774355 # HT - 1159 214 28 -0.834 -19.6097438801 13.737628393 -5.18380774355 # OT - 1160 214 27 0.417 -18.8527935529 14.3235106696 -5.18380774355 # HT - 1161 214 27 0.417 -20.3666942074 14.3235106696 -5.18380774355 # HT - 1162 215 28 -0.834 -19.6097438801 11.2744232307 -2.72060258118 # OT - 1163 215 27 0.417 -18.8527935529 11.8603055073 -2.72060258118 # HT - 1164 215 27 0.417 -20.3666942074 11.8603055073 -2.72060258118 # HT - 1165 216 28 -0.834 -17.1465387178 13.737628393 -2.72060258118 # OT - 1166 216 27 0.417 -16.3895883905 14.3235106696 -2.72060258118 # HT - 1167 216 27 0.417 -17.903489045 14.3235106696 -2.72060258118 # HT - 1168 217 28 -0.834 -17.1465387178 11.2744232307 -0.257397418816 # OT - 1169 217 27 0.417 -16.3895883905 11.8603055073 -0.257397418816 # HT - 1170 217 27 0.417 -17.903489045 11.8603055073 -0.257397418816 # HT - 1171 218 28 -0.834 -19.6097438801 13.737628393 -0.257397418816 # OT - 1172 218 27 0.417 -18.8527935529 14.3235106696 -0.257397418816 # HT - 1173 218 27 0.417 -20.3666942074 14.3235106696 -0.257397418816 # HT - 1174 219 28 -0.834 -19.6097438801 11.2744232307 2.20580774355 # OT - 1175 219 27 0.417 -18.8527935529 11.8603055073 2.20580774355 # HT - 1176 219 27 0.417 -20.3666942074 11.8603055073 2.20580774355 # HT - 1177 220 28 -0.834 -17.1465387178 13.737628393 2.20580774355 # OT - 1178 220 27 0.417 -16.3895883905 14.3235106696 2.20580774355 # HT - 1179 220 27 0.417 -17.903489045 14.3235106696 2.20580774355 # HT - 1180 221 28 -0.834 -17.1465387178 11.2744232307 4.66901290592 # OT - 1181 221 27 0.417 -16.3895883905 11.8603055073 4.66901290592 # HT - 1182 221 27 0.417 -17.903489045 11.8603055073 4.66901290592 # HT - 1183 222 28 -0.834 -19.6097438801 13.737628393 4.66901290592 # OT - 1184 222 27 0.417 -18.8527935529 14.3235106696 4.66901290592 # HT - 1185 222 27 0.417 -20.3666942074 14.3235106696 4.66901290592 # HT - 1186 223 28 -0.834 -19.6097438801 11.2744232307 7.13221806829 # OT - 1187 223 27 0.417 -18.8527935529 11.8603055073 7.13221806829 # HT - 1188 223 27 0.417 -20.3666942074 11.8603055073 7.13221806829 # HT - 1189 224 28 -0.834 -17.1465387178 13.737628393 7.13221806829 # OT - 1190 224 27 0.417 -16.3895883905 14.3235106696 7.13221806829 # HT - 1191 224 27 0.417 -17.903489045 14.3235106696 7.13221806829 # HT - 1192 225 28 -0.834 -17.1465387178 11.2744232307 9.59542323066 # OT - 1193 225 27 0.417 -16.3895883905 11.8603055073 9.59542323066 # HT - 1194 225 27 0.417 -17.903489045 11.8603055073 9.59542323066 # HT - 1195 226 28 -0.834 -19.6097438801 13.737628393 9.59542323066 # OT - 1196 226 27 0.417 -18.8527935529 14.3235106696 9.59542323066 # HT - 1197 226 27 0.417 -20.3666942074 14.3235106696 9.59542323066 # HT - 1198 227 28 -0.834 -14.6833335554 -13.357628393 -12.5734232307 # OT - 1199 227 27 0.417 -13.9263832281 -12.7717461164 -12.5734232307 # HT - 1200 227 27 0.417 -15.4402838827 -12.7717461164 -12.5734232307 # HT - 1201 228 28 -0.834 -12.220128393 -10.8944232307 -12.5734232307 # OT - 1202 228 27 0.417 -11.4631780658 -10.308540954 -12.5734232307 # HT - 1203 228 27 0.417 -12.9770787203 -10.308540954 -12.5734232307 # HT - 1204 229 28 -0.834 -12.220128393 -13.357628393 -10.1102180683 # OT - 1205 229 27 0.417 -11.4631780658 -12.7717461164 -10.1102180683 # HT - 1206 229 27 0.417 -12.9770787203 -12.7717461164 -10.1102180683 # HT - 1207 230 28 -0.834 -14.6833335554 -10.8944232307 -10.1102180683 # OT - 1208 230 27 0.417 -13.9263832281 -10.308540954 -10.1102180683 # HT - 1209 230 27 0.417 -15.4402838827 -10.308540954 -10.1102180683 # HT - 1210 231 28 -0.834 -14.6833335554 -13.357628393 -7.64701290592 # OT - 1211 231 27 0.417 -13.9263832281 -12.7717461164 -7.64701290592 # HT - 1212 231 27 0.417 -15.4402838827 -12.7717461164 -7.64701290592 # HT - 1213 232 28 -0.834 -12.220128393 -10.8944232307 -7.64701290592 # OT - 1214 232 27 0.417 -11.4631780658 -10.308540954 -7.64701290592 # HT - 1215 232 27 0.417 -12.9770787203 -10.308540954 -7.64701290592 # HT - 1216 233 28 -0.834 -12.220128393 -13.357628393 -5.18380774355 # OT - 1217 233 27 0.417 -11.4631780658 -12.7717461164 -5.18380774355 # HT - 1218 233 27 0.417 -12.9770787203 -12.7717461164 -5.18380774355 # HT - 1219 234 28 -0.834 -14.6833335554 -10.8944232307 -5.18380774355 # OT - 1220 234 27 0.417 -13.9263832281 -10.308540954 -5.18380774355 # HT - 1221 234 27 0.417 -15.4402838827 -10.308540954 -5.18380774355 # HT - 1222 235 28 -0.834 -14.6833335554 -13.357628393 -2.72060258118 # OT - 1223 235 27 0.417 -13.9263832281 -12.7717461164 -2.72060258118 # HT - 1224 235 27 0.417 -15.4402838827 -12.7717461164 -2.72060258118 # HT - 1225 236 28 -0.834 -14.6833335554 -10.8944232307 -0.257397418816 # OT - 1226 236 27 0.417 -13.9263832281 -10.308540954 -0.257397418816 # HT - 1227 236 27 0.417 -15.4402838827 -10.308540954 -0.257397418816 # HT - 1228 237 28 -0.834 -14.6833335554 -13.357628393 2.20580774355 # OT - 1229 237 27 0.417 -13.9263832281 -12.7717461164 2.20580774355 # HT - 1230 237 27 0.417 -15.4402838827 -12.7717461164 2.20580774355 # HT - 1231 238 28 -0.834 -12.220128393 -13.357628393 4.66901290592 # OT - 1232 238 27 0.417 -11.4631780658 -12.7717461164 4.66901290592 # HT - 1233 238 27 0.417 -12.9770787203 -12.7717461164 4.66901290592 # HT - 1234 239 28 -0.834 -14.6833335554 -10.8944232307 4.66901290592 # OT - 1235 239 27 0.417 -13.9263832281 -10.308540954 4.66901290592 # HT - 1236 239 27 0.417 -15.4402838827 -10.308540954 4.66901290592 # HT - 1237 240 28 -0.834 -14.6833335554 -13.357628393 7.13221806829 # OT - 1238 240 27 0.417 -13.9263832281 -12.7717461164 7.13221806829 # HT - 1239 240 27 0.417 -15.4402838827 -12.7717461164 7.13221806829 # HT - 1240 241 28 -0.834 -12.220128393 -10.8944232307 7.13221806829 # OT - 1241 241 27 0.417 -11.4631780658 -10.308540954 7.13221806829 # HT - 1242 241 27 0.417 -12.9770787203 -10.308540954 7.13221806829 # HT - 1243 242 28 -0.834 -12.220128393 -13.357628393 9.59542323066 # OT - 1244 242 27 0.417 -11.4631780658 -12.7717461164 9.59542323066 # HT - 1245 242 27 0.417 -12.9770787203 -12.7717461164 9.59542323066 # HT - 1246 243 28 -0.834 -14.6833335554 -10.8944232307 9.59542323066 # OT - 1247 243 27 0.417 -13.9263832281 -10.308540954 9.59542323066 # HT - 1248 243 27 0.417 -15.4402838827 -10.308540954 9.59542323066 # HT - 1249 244 28 -0.834 -14.6833335554 -8.43121806829 -12.5734232307 # OT - 1250 244 27 0.417 -13.9263832281 -7.84533579167 -12.5734232307 # HT - 1251 244 27 0.417 -15.4402838827 -7.84533579167 -12.5734232307 # HT - 1252 245 28 -0.834 -12.220128393 -5.96801290592 -12.5734232307 # OT - 1253 245 27 0.417 -11.4631780658 -5.3821306293 -12.5734232307 # HT - 1254 245 27 0.417 -12.9770787203 -5.3821306293 -12.5734232307 # HT - 1255 246 28 -0.834 -12.220128393 -8.43121806829 -10.1102180683 # OT - 1256 246 27 0.417 -11.4631780658 -7.84533579167 -10.1102180683 # HT - 1257 246 27 0.417 -12.9770787203 -7.84533579167 -10.1102180683 # HT - 1258 247 28 -0.834 -14.6833335554 -5.96801290592 -10.1102180683 # OT - 1259 247 27 0.417 -13.9263832281 -5.3821306293 -10.1102180683 # HT - 1260 247 27 0.417 -15.4402838827 -5.3821306293 -10.1102180683 # HT - 1261 248 28 -0.834 -14.6833335554 -8.43121806829 -7.64701290592 # OT - 1262 248 27 0.417 -13.9263832281 -7.84533579167 -7.64701290592 # HT - 1263 248 27 0.417 -15.4402838827 -7.84533579167 -7.64701290592 # HT - 1264 249 28 -0.834 -14.6833335554 -8.43121806829 -2.72060258118 # OT - 1265 249 27 0.417 -13.9263832281 -7.84533579167 -2.72060258118 # HT - 1266 249 27 0.417 -15.4402838827 -7.84533579167 -2.72060258118 # HT - 1267 250 28 -0.834 -14.6833335554 -8.43121806829 7.13221806829 # OT - 1268 250 27 0.417 -13.9263832281 -7.84533579167 7.13221806829 # HT - 1269 250 27 0.417 -15.4402838827 -7.84533579167 7.13221806829 # HT - 1270 251 28 -0.834 -12.220128393 -5.96801290592 7.13221806829 # OT - 1271 251 27 0.417 -11.4631780658 -5.3821306293 7.13221806829 # HT - 1272 251 27 0.417 -12.9770787203 -5.3821306293 7.13221806829 # HT - 1273 252 28 -0.834 -12.220128393 -8.43121806829 9.59542323066 # OT - 1274 252 27 0.417 -11.4631780658 -7.84533579167 9.59542323066 # HT - 1275 252 27 0.417 -12.9770787203 -7.84533579167 9.59542323066 # HT - 1276 253 28 -0.834 -14.6833335554 -5.96801290592 9.59542323066 # OT - 1277 253 27 0.417 -13.9263832281 -5.3821306293 9.59542323066 # HT - 1278 253 27 0.417 -15.4402838827 -5.3821306293 9.59542323066 # HT - 1279 254 28 -0.834 -14.6833335554 -3.50480774355 -12.5734232307 # OT - 1280 254 27 0.417 -13.9263832281 -2.91892546693 -12.5734232307 # HT - 1281 254 27 0.417 -15.4402838827 -2.91892546693 -12.5734232307 # HT - 1282 255 28 -0.834 -12.220128393 -1.04160258118 -12.5734232307 # OT - 1283 255 27 0.417 -11.4631780658 -0.455720304566 -12.5734232307 # HT - 1284 255 27 0.417 -12.9770787203 -0.455720304566 -12.5734232307 # HT - 1285 256 28 -0.834 -12.220128393 -3.50480774355 -10.1102180683 # OT - 1286 256 27 0.417 -11.4631780658 -2.91892546693 -10.1102180683 # HT - 1287 256 27 0.417 -12.9770787203 -2.91892546693 -10.1102180683 # HT - 1288 257 28 -0.834 -14.6833335554 -1.04160258118 -10.1102180683 # OT - 1289 257 27 0.417 -13.9263832281 -0.455720304566 -10.1102180683 # HT - 1290 257 27 0.417 -15.4402838827 -0.455720304566 -10.1102180683 # HT - 1291 258 28 -0.834 -14.6833335554 -3.50480774355 -7.64701290592 # OT - 1292 258 27 0.417 -13.9263832281 -2.91892546693 -7.64701290592 # HT - 1293 258 27 0.417 -15.4402838827 -2.91892546693 -7.64701290592 # HT - 1294 259 28 -0.834 -12.220128393 -1.04160258118 -7.64701290592 # OT - 1295 259 27 0.417 -11.4631780658 -0.455720304566 -7.64701290592 # HT - 1296 259 27 0.417 -12.9770787203 -0.455720304566 -7.64701290592 # HT - 1297 260 28 -0.834 -14.6833335554 -1.04160258118 -5.18380774355 # OT - 1298 260 27 0.417 -13.9263832281 -0.455720304566 -5.18380774355 # HT - 1299 260 27 0.417 -15.4402838827 -0.455720304566 -5.18380774355 # HT - 1300 261 28 -0.834 -14.6833335554 -3.50480774355 -2.72060258118 # OT - 1301 261 27 0.417 -13.9263832281 -2.91892546693 -2.72060258118 # HT - 1302 261 27 0.417 -15.4402838827 -2.91892546693 -2.72060258118 # HT - 1303 262 28 -0.834 -14.6833335554 -3.50480774355 7.13221806829 # OT - 1304 262 27 0.417 -13.9263832281 -2.91892546693 7.13221806829 # HT - 1305 262 27 0.417 -15.4402838827 -2.91892546693 7.13221806829 # HT - 1306 263 28 -0.834 -12.220128393 -3.50480774355 9.59542323066 # OT - 1307 263 27 0.417 -11.4631780658 -2.91892546693 9.59542323066 # HT - 1308 263 27 0.417 -12.9770787203 -2.91892546693 9.59542323066 # HT - 1309 264 28 -0.834 -14.6833335554 -1.04160258118 9.59542323066 # OT - 1310 264 27 0.417 -13.9263832281 -0.455720304566 9.59542323066 # HT - 1311 264 27 0.417 -15.4402838827 -0.455720304566 9.59542323066 # HT - 1312 265 28 -0.834 -14.6833335554 1.42160258118 -12.5734232307 # OT - 1313 265 27 0.417 -13.9263832281 2.0074848578 -12.5734232307 # HT - 1314 265 27 0.417 -15.4402838827 2.0074848578 -12.5734232307 # HT - 1315 266 28 -0.834 -12.220128393 3.88480774355 -12.5734232307 # OT - 1316 266 27 0.417 -11.4631780658 4.47069002017 -12.5734232307 # HT - 1317 266 27 0.417 -12.9770787203 4.47069002017 -12.5734232307 # HT - 1318 267 28 -0.834 -12.220128393 1.42160258118 -10.1102180683 # OT - 1319 267 27 0.417 -11.4631780658 2.0074848578 -10.1102180683 # HT - 1320 267 27 0.417 -12.9770787203 2.0074848578 -10.1102180683 # HT - 1321 268 28 -0.834 -14.6833335554 3.88480774355 -10.1102180683 # OT - 1322 268 27 0.417 -13.9263832281 4.47069002017 -10.1102180683 # HT - 1323 268 27 0.417 -15.4402838827 4.47069002017 -10.1102180683 # HT - 1324 269 28 -0.834 -14.6833335554 1.42160258118 -7.64701290592 # OT - 1325 269 27 0.417 -13.9263832281 2.0074848578 -7.64701290592 # HT - 1326 269 27 0.417 -15.4402838827 2.0074848578 -7.64701290592 # HT - 1327 270 28 -0.834 -14.6833335554 1.42160258118 7.13221806829 # OT - 1328 270 27 0.417 -13.9263832281 2.0074848578 7.13221806829 # HT - 1329 270 27 0.417 -15.4402838827 2.0074848578 7.13221806829 # HT - 1330 271 28 -0.834 -14.6833335554 6.34801290592 -12.5734232307 # OT - 1331 271 27 0.417 -13.9263832281 6.93389518254 -12.5734232307 # HT - 1332 271 27 0.417 -15.4402838827 6.93389518254 -12.5734232307 # HT - 1333 272 28 -0.834 -12.220128393 8.81121806829 -12.5734232307 # OT - 1334 272 27 0.417 -11.4631780658 9.39710034491 -12.5734232307 # HT - 1335 272 27 0.417 -12.9770787203 9.39710034491 -12.5734232307 # HT - 1336 273 28 -0.834 -12.220128393 6.34801290592 -10.1102180683 # OT - 1337 273 27 0.417 -11.4631780658 6.93389518254 -10.1102180683 # HT - 1338 273 27 0.417 -12.9770787203 6.93389518254 -10.1102180683 # HT - 1339 274 28 -0.834 -14.6833335554 8.81121806829 -10.1102180683 # OT - 1340 274 27 0.417 -13.9263832281 9.39710034491 -10.1102180683 # HT - 1341 274 27 0.417 -15.4402838827 9.39710034491 -10.1102180683 # HT - 1342 275 28 -0.834 -14.6833335554 6.34801290592 -7.64701290592 # OT - 1343 275 27 0.417 -13.9263832281 6.93389518254 -7.64701290592 # HT - 1344 275 27 0.417 -15.4402838827 6.93389518254 -7.64701290592 # HT - 1345 276 28 -0.834 -12.220128393 8.81121806829 -7.64701290592 # OT - 1346 276 27 0.417 -11.4631780658 9.39710034491 -7.64701290592 # HT - 1347 276 27 0.417 -12.9770787203 9.39710034491 -7.64701290592 # HT - 1348 277 28 -0.834 -12.220128393 6.34801290592 4.66901290592 # OT - 1349 277 27 0.417 -11.4631780658 6.93389518254 4.66901290592 # HT - 1350 277 27 0.417 -12.9770787203 6.93389518254 4.66901290592 # HT - 1351 278 28 -0.834 -14.6833335554 8.81121806829 4.66901290592 # OT - 1352 278 27 0.417 -13.9263832281 9.39710034491 4.66901290592 # HT - 1353 278 27 0.417 -15.4402838827 9.39710034491 4.66901290592 # HT - 1354 279 28 -0.834 -14.6833335554 6.34801290592 7.13221806829 # OT - 1355 279 27 0.417 -13.9263832281 6.93389518254 7.13221806829 # HT - 1356 279 27 0.417 -15.4402838827 6.93389518254 7.13221806829 # HT - 1357 280 28 -0.834 -12.220128393 8.81121806829 7.13221806829 # OT - 1358 280 27 0.417 -11.4631780658 9.39710034491 7.13221806829 # HT - 1359 280 27 0.417 -12.9770787203 9.39710034491 7.13221806829 # HT - 1360 281 28 -0.834 -14.6833335554 8.81121806829 9.59542323066 # OT - 1361 281 27 0.417 -13.9263832281 9.39710034491 9.59542323066 # HT - 1362 281 27 0.417 -15.4402838827 9.39710034491 9.59542323066 # HT - 1363 282 28 -0.834 -14.6833335554 11.2744232307 -12.5734232307 # OT - 1364 282 27 0.417 -13.9263832281 11.8603055073 -12.5734232307 # HT - 1365 282 27 0.417 -15.4402838827 11.8603055073 -12.5734232307 # HT - 1366 283 28 -0.834 -12.220128393 13.737628393 -12.5734232307 # OT - 1367 283 27 0.417 -11.4631780658 14.3235106696 -12.5734232307 # HT - 1368 283 27 0.417 -12.9770787203 14.3235106696 -12.5734232307 # HT - 1369 284 28 -0.834 -12.220128393 11.2744232307 -10.1102180683 # OT - 1370 284 27 0.417 -11.4631780658 11.8603055073 -10.1102180683 # HT - 1371 284 27 0.417 -12.9770787203 11.8603055073 -10.1102180683 # HT - 1372 285 28 -0.834 -14.6833335554 13.737628393 -10.1102180683 # OT - 1373 285 27 0.417 -13.9263832281 14.3235106696 -10.1102180683 # HT - 1374 285 27 0.417 -15.4402838827 14.3235106696 -10.1102180683 # HT - 1375 286 28 -0.834 -14.6833335554 11.2744232307 -7.64701290592 # OT - 1376 286 27 0.417 -13.9263832281 11.8603055073 -7.64701290592 # HT - 1377 286 27 0.417 -15.4402838827 11.8603055073 -7.64701290592 # HT - 1378 287 28 -0.834 -12.220128393 13.737628393 -7.64701290592 # OT - 1379 287 27 0.417 -11.4631780658 14.3235106696 -7.64701290592 # HT - 1380 287 27 0.417 -12.9770787203 14.3235106696 -7.64701290592 # HT - 1381 288 28 -0.834 -12.220128393 11.2744232307 -5.18380774355 # OT - 1382 288 27 0.417 -11.4631780658 11.8603055073 -5.18380774355 # HT - 1383 288 27 0.417 -12.9770787203 11.8603055073 -5.18380774355 # HT - 1384 289 28 -0.834 -14.6833335554 13.737628393 -5.18380774355 # OT - 1385 289 27 0.417 -13.9263832281 14.3235106696 -5.18380774355 # HT - 1386 289 27 0.417 -15.4402838827 14.3235106696 -5.18380774355 # HT - 1387 290 28 -0.834 -14.6833335554 11.2744232307 -2.72060258118 # OT - 1388 290 27 0.417 -13.9263832281 11.8603055073 -2.72060258118 # HT - 1389 290 27 0.417 -15.4402838827 11.8603055073 -2.72060258118 # HT - 1390 291 28 -0.834 -12.220128393 13.737628393 -2.72060258118 # OT - 1391 291 27 0.417 -11.4631780658 14.3235106696 -2.72060258118 # HT - 1392 291 27 0.417 -12.9770787203 14.3235106696 -2.72060258118 # HT - 1393 292 28 -0.834 -12.220128393 11.2744232307 -0.257397418816 # OT - 1394 292 27 0.417 -11.4631780658 11.8603055073 -0.257397418816 # HT - 1395 292 27 0.417 -12.9770787203 11.8603055073 -0.257397418816 # HT - 1396 293 28 -0.834 -14.6833335554 13.737628393 -0.257397418816 # OT - 1397 293 27 0.417 -13.9263832281 14.3235106696 -0.257397418816 # HT - 1398 293 27 0.417 -15.4402838827 14.3235106696 -0.257397418816 # HT - 1399 294 28 -0.834 -14.6833335554 11.2744232307 2.20580774355 # OT - 1400 294 27 0.417 -13.9263832281 11.8603055073 2.20580774355 # HT - 1401 294 27 0.417 -15.4402838827 11.8603055073 2.20580774355 # HT - 1402 295 28 -0.834 -12.220128393 13.737628393 2.20580774355 # OT - 1403 295 27 0.417 -11.4631780658 14.3235106696 2.20580774355 # HT - 1404 295 27 0.417 -12.9770787203 14.3235106696 2.20580774355 # HT - 1405 296 28 -0.834 -12.220128393 11.2744232307 4.66901290592 # OT - 1406 296 27 0.417 -11.4631780658 11.8603055073 4.66901290592 # HT - 1407 296 27 0.417 -12.9770787203 11.8603055073 4.66901290592 # HT - 1408 297 28 -0.834 -14.6833335554 13.737628393 4.66901290592 # OT - 1409 297 27 0.417 -13.9263832281 14.3235106696 4.66901290592 # HT - 1410 297 27 0.417 -15.4402838827 14.3235106696 4.66901290592 # HT - 1411 298 28 -0.834 -14.6833335554 11.2744232307 7.13221806829 # OT - 1412 298 27 0.417 -13.9263832281 11.8603055073 7.13221806829 # HT - 1413 298 27 0.417 -15.4402838827 11.8603055073 7.13221806829 # HT - 1414 299 28 -0.834 -12.220128393 13.737628393 7.13221806829 # OT - 1415 299 27 0.417 -11.4631780658 14.3235106696 7.13221806829 # HT - 1416 299 27 0.417 -12.9770787203 14.3235106696 7.13221806829 # HT - 1417 300 28 -0.834 -12.220128393 11.2744232307 9.59542323066 # OT - 1418 300 27 0.417 -11.4631780658 11.8603055073 9.59542323066 # HT - 1419 300 27 0.417 -12.9770787203 11.8603055073 9.59542323066 # HT - 1420 301 28 -0.834 -14.6833335554 13.737628393 9.59542323066 # OT - 1421 301 27 0.417 -13.9263832281 14.3235106696 9.59542323066 # HT - 1422 301 27 0.417 -15.4402838827 14.3235106696 9.59542323066 # HT - 1423 302 28 -0.834 -9.75692323066 -13.357628393 -12.5734232307 # OT - 1424 302 27 0.417 -8.9999729034 -12.7717461164 -12.5734232307 # HT - 1425 302 27 0.417 -10.5138735579 -12.7717461164 -12.5734232307 # HT - 1426 303 28 -0.834 -7.29371806829 -10.8944232307 -12.5734232307 # OT - 1427 303 27 0.417 -6.53676774103 -10.308540954 -12.5734232307 # HT - 1428 303 27 0.417 -8.05066839555 -10.308540954 -12.5734232307 # HT - 1429 304 28 -0.834 -7.29371806829 -13.357628393 -10.1102180683 # OT - 1430 304 27 0.417 -6.53676774103 -12.7717461164 -10.1102180683 # HT - 1431 304 27 0.417 -8.05066839555 -12.7717461164 -10.1102180683 # HT - 1432 305 28 -0.834 -9.75692323066 -10.8944232307 -10.1102180683 # OT - 1433 305 27 0.417 -8.9999729034 -10.308540954 -10.1102180683 # HT - 1434 305 27 0.417 -10.5138735579 -10.308540954 -10.1102180683 # HT - 1435 306 28 -0.834 -9.75692323066 -13.357628393 -7.64701290592 # OT - 1436 306 27 0.417 -8.9999729034 -12.7717461164 -7.64701290592 # HT - 1437 306 27 0.417 -10.5138735579 -12.7717461164 -7.64701290592 # HT - 1438 307 28 -0.834 -7.29371806829 -13.357628393 4.66901290592 # OT - 1439 307 27 0.417 -6.53676774103 -12.7717461164 4.66901290592 # HT - 1440 307 27 0.417 -8.05066839555 -12.7717461164 4.66901290592 # HT - 1441 308 28 -0.834 -9.75692323066 -10.8944232307 4.66901290592 # OT - 1442 308 27 0.417 -8.9999729034 -10.308540954 4.66901290592 # HT - 1443 308 27 0.417 -10.5138735579 -10.308540954 4.66901290592 # HT - 1444 309 28 -0.834 -9.75692323066 -13.357628393 7.13221806829 # OT - 1445 309 27 0.417 -8.9999729034 -12.7717461164 7.13221806829 # HT - 1446 309 27 0.417 -10.5138735579 -12.7717461164 7.13221806829 # HT - 1447 310 28 -0.834 -7.29371806829 -10.8944232307 7.13221806829 # OT - 1448 310 27 0.417 -6.53676774103 -10.308540954 7.13221806829 # HT - 1449 310 27 0.417 -8.05066839555 -10.308540954 7.13221806829 # HT - 1450 311 28 -0.834 -7.29371806829 -13.357628393 9.59542323066 # OT - 1451 311 27 0.417 -6.53676774103 -12.7717461164 9.59542323066 # HT - 1452 311 27 0.417 -8.05066839555 -12.7717461164 9.59542323066 # HT - 1453 312 28 -0.834 -9.75692323066 -10.8944232307 9.59542323066 # OT - 1454 312 27 0.417 -8.9999729034 -10.308540954 9.59542323066 # HT - 1455 312 27 0.417 -10.5138735579 -10.308540954 9.59542323066 # HT - 1456 313 28 -0.834 -9.75692323066 -8.43121806829 -12.5734232307 # OT - 1457 313 27 0.417 -8.9999729034 -7.84533579167 -12.5734232307 # HT - 1458 313 27 0.417 -10.5138735579 -7.84533579167 -12.5734232307 # HT - 1459 314 28 -0.834 -7.29371806829 -5.96801290592 -12.5734232307 # OT - 1460 314 27 0.417 -6.53676774103 -5.3821306293 -12.5734232307 # HT - 1461 314 27 0.417 -8.05066839555 -5.3821306293 -12.5734232307 # HT - 1462 315 28 -0.834 -7.29371806829 -8.43121806829 -10.1102180683 # OT - 1463 315 27 0.417 -6.53676774103 -7.84533579167 -10.1102180683 # HT - 1464 315 27 0.417 -8.05066839555 -7.84533579167 -10.1102180683 # HT - 1465 316 28 -0.834 -9.75692323066 -5.96801290592 -10.1102180683 # OT - 1466 316 27 0.417 -8.9999729034 -5.3821306293 -10.1102180683 # HT - 1467 316 27 0.417 -10.5138735579 -5.3821306293 -10.1102180683 # HT - 1468 317 28 -0.834 -7.29371806829 -8.43121806829 4.66901290592 # OT - 1469 317 27 0.417 -6.53676774103 -7.84533579167 4.66901290592 # HT - 1470 317 27 0.417 -8.05066839555 -7.84533579167 4.66901290592 # HT - 1471 318 28 -0.834 -9.75692323066 -8.43121806829 7.13221806829 # OT - 1472 318 27 0.417 -8.9999729034 -7.84533579167 7.13221806829 # HT - 1473 318 27 0.417 -10.5138735579 -7.84533579167 7.13221806829 # HT - 1474 319 28 -0.834 -7.29371806829 -5.96801290592 7.13221806829 # OT - 1475 319 27 0.417 -6.53676774103 -5.3821306293 7.13221806829 # HT - 1476 319 27 0.417 -8.05066839555 -5.3821306293 7.13221806829 # HT - 1477 320 28 -0.834 -7.29371806829 -8.43121806829 9.59542323066 # OT - 1478 320 27 0.417 -6.53676774103 -7.84533579167 9.59542323066 # HT - 1479 320 27 0.417 -8.05066839555 -7.84533579167 9.59542323066 # HT - 1480 321 28 -0.834 -9.75692323066 -5.96801290592 9.59542323066 # OT - 1481 321 27 0.417 -8.9999729034 -5.3821306293 9.59542323066 # HT - 1482 321 27 0.417 -10.5138735579 -5.3821306293 9.59542323066 # HT - 1483 322 28 -0.834 -9.75692323066 -3.50480774355 -12.5734232307 # OT - 1484 322 27 0.417 -8.9999729034 -2.91892546693 -12.5734232307 # HT - 1485 322 27 0.417 -10.5138735579 -2.91892546693 -12.5734232307 # HT - 1486 323 28 -0.834 -7.29371806829 -1.04160258118 -12.5734232307 # OT - 1487 323 27 0.417 -6.53676774103 -0.455720304566 -12.5734232307 # HT - 1488 323 27 0.417 -8.05066839555 -0.455720304566 -12.5734232307 # HT - 1489 324 28 -0.834 -7.29371806829 -3.50480774355 -10.1102180683 # OT - 1490 324 27 0.417 -6.53676774103 -2.91892546693 -10.1102180683 # HT - 1491 324 27 0.417 -8.05066839555 -2.91892546693 -10.1102180683 # HT - 1492 325 28 -0.834 -9.75692323066 -1.04160258118 -10.1102180683 # OT - 1493 325 27 0.417 -8.9999729034 -0.455720304566 -10.1102180683 # HT - 1494 325 27 0.417 -10.5138735579 -0.455720304566 -10.1102180683 # HT - 1495 326 28 -0.834 -9.75692323066 1.42160258118 -12.5734232307 # OT - 1496 326 27 0.417 -8.9999729034 2.0074848578 -12.5734232307 # HT - 1497 326 27 0.417 -10.5138735579 2.0074848578 -12.5734232307 # HT - 1498 327 28 -0.834 -7.29371806829 3.88480774355 -12.5734232307 # OT - 1499 327 27 0.417 -6.53676774103 4.47069002017 -12.5734232307 # HT - 1500 327 27 0.417 -8.05066839555 4.47069002017 -12.5734232307 # HT - 1501 328 28 -0.834 -7.29371806829 1.42160258118 -10.1102180683 # OT - 1502 328 27 0.417 -6.53676774103 2.0074848578 -10.1102180683 # HT - 1503 328 27 0.417 -8.05066839555 2.0074848578 -10.1102180683 # HT - 1504 329 28 -0.834 -9.75692323066 3.88480774355 -10.1102180683 # OT - 1505 329 27 0.417 -8.9999729034 4.47069002017 -10.1102180683 # HT - 1506 329 27 0.417 -10.5138735579 4.47069002017 -10.1102180683 # HT - 1507 330 28 -0.834 -9.75692323066 6.34801290592 -12.5734232307 # OT - 1508 330 27 0.417 -8.9999729034 6.93389518254 -12.5734232307 # HT - 1509 330 27 0.417 -10.5138735579 6.93389518254 -12.5734232307 # HT - 1510 331 28 -0.834 -7.29371806829 8.81121806829 -12.5734232307 # OT - 1511 331 27 0.417 -6.53676774103 9.39710034491 -12.5734232307 # HT - 1512 331 27 0.417 -8.05066839555 9.39710034491 -12.5734232307 # HT - 1513 332 28 -0.834 -9.75692323066 8.81121806829 -10.1102180683 # OT - 1514 332 27 0.417 -8.9999729034 9.39710034491 -10.1102180683 # HT - 1515 332 27 0.417 -10.5138735579 9.39710034491 -10.1102180683 # HT - 1516 333 28 -0.834 -9.75692323066 8.81121806829 4.66901290592 # OT - 1517 333 27 0.417 -8.9999729034 9.39710034491 4.66901290592 # HT - 1518 333 27 0.417 -10.5138735579 9.39710034491 4.66901290592 # HT - 1519 334 28 -0.834 -7.29371806829 8.81121806829 7.13221806829 # OT - 1520 334 27 0.417 -6.53676774103 9.39710034491 7.13221806829 # HT - 1521 334 27 0.417 -8.05066839555 9.39710034491 7.13221806829 # HT - 1522 335 28 -0.834 -7.29371806829 6.34801290592 9.59542323066 # OT - 1523 335 27 0.417 -6.53676774103 6.93389518254 9.59542323066 # HT - 1524 335 27 0.417 -8.05066839555 6.93389518254 9.59542323066 # HT - 1525 336 28 -0.834 -9.75692323066 8.81121806829 9.59542323066 # OT - 1526 336 27 0.417 -8.9999729034 9.39710034491 9.59542323066 # HT - 1527 336 27 0.417 -10.5138735579 9.39710034491 9.59542323066 # HT - 1528 337 30 1 -9.75692323066 11.2744232307 -12.5734232307 # SOD - 1529 338 28 -0.834 -7.29371806829 13.737628393 -12.5734232307 # OT - 1530 338 27 0.417 -6.53676774103 14.3235106696 -12.5734232307 # HT - 1531 338 27 0.417 -8.05066839555 14.3235106696 -12.5734232307 # HT - 1532 339 28 -0.834 -7.29371806829 11.2744232307 -10.1102180683 # OT - 1533 339 27 0.417 -6.53676774103 11.8603055073 -10.1102180683 # HT - 1534 339 27 0.417 -8.05066839555 11.8603055073 -10.1102180683 # HT - 1535 340 28 -0.834 -9.75692323066 13.737628393 -10.1102180683 # OT - 1536 340 27 0.417 -8.9999729034 14.3235106696 -10.1102180683 # HT - 1537 340 27 0.417 -10.5138735579 14.3235106696 -10.1102180683 # HT - 1538 341 28 -0.834 -9.75692323066 11.2744232307 -7.64701290592 # OT - 1539 341 27 0.417 -8.9999729034 11.8603055073 -7.64701290592 # HT - 1540 341 27 0.417 -10.5138735579 11.8603055073 -7.64701290592 # HT - 1541 342 28 -0.834 -9.75692323066 13.737628393 -5.18380774355 # OT - 1542 342 27 0.417 -8.9999729034 14.3235106696 -5.18380774355 # HT - 1543 342 27 0.417 -10.5138735579 14.3235106696 -5.18380774355 # HT - 1544 343 28 -0.834 -7.29371806829 13.737628393 -2.72060258118 # OT - 1545 343 27 0.417 -6.53676774103 14.3235106696 -2.72060258118 # HT - 1546 343 27 0.417 -8.05066839555 14.3235106696 -2.72060258118 # HT - 1547 344 28 -0.834 -9.75692323066 13.737628393 -0.257397418816 # OT - 1548 344 27 0.417 -8.9999729034 14.3235106696 -0.257397418816 # HT - 1549 344 27 0.417 -10.5138735579 14.3235106696 -0.257397418816 # HT - 1550 345 28 -0.834 -9.75692323066 11.2744232307 2.20580774355 # OT - 1551 345 27 0.417 -8.9999729034 11.8603055073 2.20580774355 # HT - 1552 345 27 0.417 -10.5138735579 11.8603055073 2.20580774355 # HT - 1553 346 28 -0.834 -7.29371806829 13.737628393 2.20580774355 # OT - 1554 346 27 0.417 -6.53676774103 14.3235106696 2.20580774355 # HT - 1555 346 27 0.417 -8.05066839555 14.3235106696 2.20580774355 # HT - 1556 347 28 -0.834 -7.29371806829 11.2744232307 4.66901290592 # OT - 1557 347 27 0.417 -6.53676774103 11.8603055073 4.66901290592 # HT - 1558 347 27 0.417 -8.05066839555 11.8603055073 4.66901290592 # HT - 1559 348 28 -0.834 -9.75692323066 13.737628393 4.66901290592 # OT - 1560 348 27 0.417 -8.9999729034 14.3235106696 4.66901290592 # HT - 1561 348 27 0.417 -10.5138735579 14.3235106696 4.66901290592 # HT - 1562 349 28 -0.834 -9.75692323066 11.2744232307 7.13221806829 # OT - 1563 349 27 0.417 -8.9999729034 11.8603055073 7.13221806829 # HT - 1564 349 27 0.417 -10.5138735579 11.8603055073 7.13221806829 # HT - 1565 350 28 -0.834 -7.29371806829 13.737628393 7.13221806829 # OT - 1566 350 27 0.417 -6.53676774103 14.3235106696 7.13221806829 # HT - 1567 350 27 0.417 -8.05066839555 14.3235106696 7.13221806829 # HT - 1568 351 28 -0.834 -7.29371806829 11.2744232307 9.59542323066 # OT - 1569 351 27 0.417 -6.53676774103 11.8603055073 9.59542323066 # HT - 1570 351 27 0.417 -8.05066839555 11.8603055073 9.59542323066 # HT - 1571 352 28 -0.834 -9.75692323066 13.737628393 9.59542323066 # OT - 1572 352 27 0.417 -8.9999729034 14.3235106696 9.59542323066 # HT - 1573 352 27 0.417 -10.5138735579 14.3235106696 9.59542323066 # HT - 1574 353 28 -0.834 -4.83051290592 -13.357628393 -12.5734232307 # OT - 1575 353 27 0.417 -4.07356257866 -12.7717461164 -12.5734232307 # HT - 1576 353 27 0.417 -5.58746323319 -12.7717461164 -12.5734232307 # HT - 1577 354 28 -0.834 -2.36730774355 -10.8944232307 -12.5734232307 # OT - 1578 354 27 0.417 -1.61035741629 -10.308540954 -12.5734232307 # HT - 1579 354 27 0.417 -3.12425807082 -10.308540954 -12.5734232307 # HT - 1580 355 28 -0.834 -2.36730774355 -13.357628393 -10.1102180683 # OT - 1581 355 27 0.417 -1.61035741629 -12.7717461164 -10.1102180683 # HT - 1582 355 27 0.417 -3.12425807082 -12.7717461164 -10.1102180683 # HT - 1583 356 28 -0.834 -4.83051290592 -10.8944232307 -10.1102180683 # OT - 1584 356 27 0.417 -4.07356257866 -10.308540954 -10.1102180683 # HT - 1585 356 27 0.417 -5.58746323319 -10.308540954 -10.1102180683 # HT - 1586 357 28 -0.834 -4.83051290592 -13.357628393 -7.64701290592 # OT - 1587 357 27 0.417 -4.07356257866 -12.7717461164 -7.64701290592 # HT - 1588 357 27 0.417 -5.58746323319 -12.7717461164 -7.64701290592 # HT - 1589 358 28 -0.834 -2.36730774355 -10.8944232307 -7.64701290592 # OT - 1590 358 27 0.417 -1.61035741629 -10.308540954 -7.64701290592 # HT - 1591 358 27 0.417 -3.12425807082 -10.308540954 -7.64701290592 # HT - 1592 359 28 -0.834 -2.36730774355 -13.357628393 -5.18380774355 # OT - 1593 359 27 0.417 -1.61035741629 -12.7717461164 -5.18380774355 # HT - 1594 359 27 0.417 -3.12425807082 -12.7717461164 -5.18380774355 # HT - 1595 360 28 -0.834 -2.36730774355 -13.357628393 -0.257397418816 # OT - 1596 360 27 0.417 -1.61035741629 -12.7717461164 -0.257397418816 # HT - 1597 360 27 0.417 -3.12425807082 -12.7717461164 -0.257397418816 # HT - 1598 361 28 -0.834 -4.83051290592 -13.357628393 2.20580774355 # OT - 1599 361 27 0.417 -4.07356257866 -12.7717461164 2.20580774355 # HT - 1600 361 27 0.417 -5.58746323319 -12.7717461164 2.20580774355 # HT - 1601 362 28 -0.834 -2.36730774355 -13.357628393 4.66901290592 # OT - 1602 362 27 0.417 -1.61035741629 -12.7717461164 4.66901290592 # HT - 1603 362 27 0.417 -3.12425807082 -12.7717461164 4.66901290592 # HT - 1604 363 28 -0.834 -4.83051290592 -13.357628393 7.13221806829 # OT - 1605 363 27 0.417 -4.07356257866 -12.7717461164 7.13221806829 # HT - 1606 363 27 0.417 -5.58746323319 -12.7717461164 7.13221806829 # HT - 1607 364 28 -0.834 -2.36730774355 -10.8944232307 7.13221806829 # OT - 1608 364 27 0.417 -1.61035741629 -10.308540954 7.13221806829 # HT - 1609 364 27 0.417 -3.12425807082 -10.308540954 7.13221806829 # HT - 1610 365 28 -0.834 -2.36730774355 -13.357628393 9.59542323066 # OT - 1611 365 27 0.417 -1.61035741629 -12.7717461164 9.59542323066 # HT - 1612 365 27 0.417 -3.12425807082 -12.7717461164 9.59542323066 # HT - 1613 366 28 -0.834 -4.83051290592 -10.8944232307 9.59542323066 # OT - 1614 366 27 0.417 -4.07356257866 -10.308540954 9.59542323066 # HT - 1615 366 27 0.417 -5.58746323319 -10.308540954 9.59542323066 # HT - 1616 367 28 -0.834 -4.83051290592 -8.43121806829 -12.5734232307 # OT - 1617 367 27 0.417 -4.07356257866 -7.84533579167 -12.5734232307 # HT - 1618 367 27 0.417 -5.58746323319 -7.84533579167 -12.5734232307 # HT - 1619 368 28 -0.834 -2.36730774355 -5.96801290592 -12.5734232307 # OT - 1620 368 27 0.417 -1.61035741629 -5.3821306293 -12.5734232307 # HT - 1621 368 27 0.417 -3.12425807082 -5.3821306293 -12.5734232307 # HT - 1622 369 28 -0.834 -2.36730774355 -8.43121806829 -10.1102180683 # OT - 1623 369 27 0.417 -1.61035741629 -7.84533579167 -10.1102180683 # HT - 1624 369 27 0.417 -3.12425807082 -7.84533579167 -10.1102180683 # HT - 1625 370 28 -0.834 -4.83051290592 -5.96801290592 -10.1102180683 # OT - 1626 370 27 0.417 -4.07356257866 -5.3821306293 -10.1102180683 # HT - 1627 370 27 0.417 -5.58746323319 -5.3821306293 -10.1102180683 # HT - 1628 371 28 -0.834 -4.83051290592 -5.96801290592 9.59542323066 # OT - 1629 371 27 0.417 -4.07356257866 -5.3821306293 9.59542323066 # HT - 1630 371 27 0.417 -5.58746323319 -5.3821306293 9.59542323066 # HT - 1631 372 28 -0.834 -4.83051290592 -3.50480774355 -12.5734232307 # OT - 1632 372 27 0.417 -4.07356257866 -2.91892546693 -12.5734232307 # HT - 1633 372 27 0.417 -5.58746323319 -2.91892546693 -12.5734232307 # HT - 1634 373 28 -0.834 -2.36730774355 -1.04160258118 -12.5734232307 # OT - 1635 373 27 0.417 -1.61035741629 -0.455720304566 -12.5734232307 # HT - 1636 373 27 0.417 -3.12425807082 -0.455720304566 -12.5734232307 # HT - 1637 374 28 -0.834 -2.36730774355 -3.50480774355 -10.1102180683 # OT - 1638 374 27 0.417 -1.61035741629 -2.91892546693 -10.1102180683 # HT - 1639 374 27 0.417 -3.12425807082 -2.91892546693 -10.1102180683 # HT - 1640 375 28 -0.834 -4.83051290592 -1.04160258118 -10.1102180683 # OT - 1641 375 27 0.417 -4.07356257866 -0.455720304566 -10.1102180683 # HT - 1642 375 27 0.417 -5.58746323319 -0.455720304566 -10.1102180683 # HT - 1643 376 28 -0.834 -4.83051290592 1.42160258118 -12.5734232307 # OT - 1644 376 27 0.417 -4.07356257866 2.0074848578 -12.5734232307 # HT - 1645 376 27 0.417 -5.58746323319 2.0074848578 -12.5734232307 # HT - 1646 377 28 -0.834 -2.36730774355 3.88480774355 -12.5734232307 # OT - 1647 377 27 0.417 -1.61035741629 4.47069002017 -12.5734232307 # HT - 1648 377 27 0.417 -3.12425807082 4.47069002017 -12.5734232307 # HT - 1649 378 28 -0.834 -4.83051290592 6.34801290592 -12.5734232307 # OT - 1650 378 27 0.417 -4.07356257866 6.93389518254 -12.5734232307 # HT - 1651 378 27 0.417 -5.58746323319 6.93389518254 -12.5734232307 # HT - 1652 379 28 -0.834 -2.36730774355 8.81121806829 -12.5734232307 # OT - 1653 379 27 0.417 -1.61035741629 9.39710034491 -12.5734232307 # HT - 1654 379 27 0.417 -3.12425807082 9.39710034491 -12.5734232307 # HT - 1655 380 28 -0.834 -2.36730774355 6.34801290592 -10.1102180683 # OT - 1656 380 27 0.417 -1.61035741629 6.93389518254 -10.1102180683 # HT - 1657 380 27 0.417 -3.12425807082 6.93389518254 -10.1102180683 # HT - 1658 381 28 -0.834 -4.83051290592 8.81121806829 -10.1102180683 # OT - 1659 381 27 0.417 -4.07356257866 9.39710034491 -10.1102180683 # HT - 1660 381 27 0.417 -5.58746323319 9.39710034491 -10.1102180683 # HT - 1661 382 28 -0.834 -2.36730774355 8.81121806829 7.13221806829 # OT - 1662 382 27 0.417 -1.61035741629 9.39710034491 7.13221806829 # HT - 1663 382 27 0.417 -3.12425807082 9.39710034491 7.13221806829 # HT - 1664 383 28 -0.834 -2.36730774355 6.34801290592 9.59542323066 # OT - 1665 383 27 0.417 -1.61035741629 6.93389518254 9.59542323066 # HT - 1666 383 27 0.417 -3.12425807082 6.93389518254 9.59542323066 # HT - 1667 384 28 -0.834 -4.83051290592 8.81121806829 9.59542323066 # OT - 1668 384 27 0.417 -4.07356257866 9.39710034491 9.59542323066 # HT - 1669 384 27 0.417 -5.58746323319 9.39710034491 9.59542323066 # HT - 1670 385 28 -0.834 -4.83051290592 11.2744232307 -12.5734232307 # OT - 1671 385 27 0.417 -4.07356257866 11.8603055073 -12.5734232307 # HT - 1672 385 27 0.417 -5.58746323319 11.8603055073 -12.5734232307 # HT - 1673 386 28 -0.834 -2.36730774355 13.737628393 -12.5734232307 # OT - 1674 386 27 0.417 -1.61035741629 14.3235106696 -12.5734232307 # HT - 1675 386 27 0.417 -3.12425807082 14.3235106696 -12.5734232307 # HT - 1676 387 28 -0.834 -2.36730774355 11.2744232307 -10.1102180683 # OT - 1677 387 27 0.417 -1.61035741629 11.8603055073 -10.1102180683 # HT - 1678 387 27 0.417 -3.12425807082 11.8603055073 -10.1102180683 # HT - 1679 388 28 -0.834 -4.83051290592 13.737628393 -10.1102180683 # OT - 1680 388 27 0.417 -4.07356257866 14.3235106696 -10.1102180683 # HT - 1681 388 27 0.417 -5.58746323319 14.3235106696 -10.1102180683 # HT - 1682 389 28 -0.834 -2.36730774355 13.737628393 -7.64701290592 # OT - 1683 389 27 0.417 -1.61035741629 14.3235106696 -7.64701290592 # HT - 1684 389 27 0.417 -3.12425807082 14.3235106696 -7.64701290592 # HT - 1685 390 28 -0.834 -2.36730774355 13.737628393 -2.72060258118 # OT - 1686 390 27 0.417 -1.61035741629 14.3235106696 -2.72060258118 # HT - 1687 390 27 0.417 -3.12425807082 14.3235106696 -2.72060258118 # HT - 1688 391 28 -0.834 -2.36730774355 11.2744232307 -0.257397418816 # OT - 1689 391 27 0.417 -1.61035741629 11.8603055073 -0.257397418816 # HT - 1690 391 27 0.417 -3.12425807082 11.8603055073 -0.257397418816 # HT - 1691 392 28 -0.834 -4.83051290592 13.737628393 -0.257397418816 # OT - 1692 392 27 0.417 -4.07356257866 14.3235106696 -0.257397418816 # HT - 1693 392 27 0.417 -5.58746323319 14.3235106696 -0.257397418816 # HT - 1694 393 28 -0.834 -4.83051290592 11.2744232307 2.20580774355 # OT - 1695 393 27 0.417 -4.07356257866 11.8603055073 2.20580774355 # HT - 1696 393 27 0.417 -5.58746323319 11.8603055073 2.20580774355 # HT - 1697 394 28 -0.834 -2.36730774355 13.737628393 2.20580774355 # OT - 1698 394 27 0.417 -1.61035741629 14.3235106696 2.20580774355 # HT - 1699 394 27 0.417 -3.12425807082 14.3235106696 2.20580774355 # HT - 1700 395 28 -0.834 -2.36730774355 11.2744232307 4.66901290592 # OT - 1701 395 27 0.417 -1.61035741629 11.8603055073 4.66901290592 # HT - 1702 395 27 0.417 -3.12425807082 11.8603055073 4.66901290592 # HT - 1703 396 28 -0.834 -4.83051290592 13.737628393 4.66901290592 # OT - 1704 396 27 0.417 -4.07356257866 14.3235106696 4.66901290592 # HT - 1705 396 27 0.417 -5.58746323319 14.3235106696 4.66901290592 # HT - 1706 397 28 -0.834 -4.83051290592 11.2744232307 7.13221806829 # OT - 1707 397 27 0.417 -4.07356257866 11.8603055073 7.13221806829 # HT - 1708 397 27 0.417 -5.58746323319 11.8603055073 7.13221806829 # HT - 1709 398 28 -0.834 -2.36730774355 13.737628393 7.13221806829 # OT - 1710 398 27 0.417 -1.61035741629 14.3235106696 7.13221806829 # HT - 1711 398 27 0.417 -3.12425807082 14.3235106696 7.13221806829 # HT - 1712 399 28 -0.834 -2.36730774355 11.2744232307 9.59542323066 # OT - 1713 399 27 0.417 -1.61035741629 11.8603055073 9.59542323066 # HT - 1714 399 27 0.417 -3.12425807082 11.8603055073 9.59542323066 # HT - 1715 400 28 -0.834 -4.83051290592 13.737628393 9.59542323066 # OT - 1716 400 27 0.417 -4.07356257866 14.3235106696 9.59542323066 # HT - 1717 400 27 0.417 -5.58746323319 14.3235106696 9.59542323066 # HT - 1718 401 28 -0.834 0.0958974188157 -13.357628393 -12.5734232307 # OT - 1719 401 27 0.417 0.852847746079 -12.7717461164 -12.5734232307 # HT - 1720 401 27 0.417 -0.661052908448 -12.7717461164 -12.5734232307 # HT - 1721 402 28 -0.834 2.55910258118 -10.8944232307 -12.5734232307 # OT - 1722 402 27 0.417 3.31605290845 -10.308540954 -12.5734232307 # HT - 1723 402 27 0.417 1.80215225392 -10.308540954 -12.5734232307 # HT - 1724 403 28 -0.834 2.55910258118 -13.357628393 -10.1102180683 # OT - 1725 403 27 0.417 3.31605290845 -12.7717461164 -10.1102180683 # HT - 1726 403 27 0.417 1.80215225392 -12.7717461164 -10.1102180683 # HT - 1727 404 28 -0.834 0.0958974188157 -10.8944232307 -10.1102180683 # OT - 1728 404 27 0.417 0.852847746079 -10.308540954 -10.1102180683 # HT - 1729 404 27 0.417 -0.661052908448 -10.308540954 -10.1102180683 # HT - 1730 405 28 -0.834 0.0958974188157 -13.357628393 -7.64701290592 # OT - 1731 405 27 0.417 0.852847746079 -12.7717461164 -7.64701290592 # HT - 1732 405 27 0.417 -0.661052908448 -12.7717461164 -7.64701290592 # HT - 1733 406 28 -0.834 2.55910258118 -10.8944232307 -7.64701290592 # OT - 1734 406 27 0.417 3.31605290845 -10.308540954 -7.64701290592 # HT - 1735 406 27 0.417 1.80215225392 -10.308540954 -7.64701290592 # HT - 1736 407 28 -0.834 2.55910258118 -13.357628393 -5.18380774355 # OT - 1737 407 27 0.417 3.31605290845 -12.7717461164 -5.18380774355 # HT - 1738 407 27 0.417 1.80215225392 -12.7717461164 -5.18380774355 # HT - 1739 408 28 -0.834 0.0958974188157 -10.8944232307 -5.18380774355 # OT - 1740 408 27 0.417 0.852847746079 -10.308540954 -5.18380774355 # HT - 1741 408 27 0.417 -0.661052908448 -10.308540954 -5.18380774355 # HT - 1742 409 28 -0.834 0.0958974188157 -13.357628393 -2.72060258118 # OT - 1743 409 27 0.417 0.852847746079 -12.7717461164 -2.72060258118 # HT - 1744 409 27 0.417 -0.661052908448 -12.7717461164 -2.72060258118 # HT - 1745 410 28 -0.834 2.55910258118 -10.8944232307 -2.72060258118 # OT - 1746 410 27 0.417 3.31605290845 -10.308540954 -2.72060258118 # HT - 1747 410 27 0.417 1.80215225392 -10.308540954 -2.72060258118 # HT - 1748 411 28 -0.834 2.55910258118 -13.357628393 -0.257397418816 # OT - 1749 411 27 0.417 3.31605290845 -12.7717461164 -0.257397418816 # HT - 1750 411 27 0.417 1.80215225392 -12.7717461164 -0.257397418816 # HT - 1751 412 28 -0.834 0.0958974188157 -13.357628393 2.20580774355 # OT - 1752 412 27 0.417 0.852847746079 -12.7717461164 2.20580774355 # HT - 1753 412 27 0.417 -0.661052908448 -12.7717461164 2.20580774355 # HT - 1754 413 28 -0.834 2.55910258118 -10.8944232307 2.20580774355 # OT - 1755 413 27 0.417 3.31605290845 -10.308540954 2.20580774355 # HT - 1756 413 27 0.417 1.80215225392 -10.308540954 2.20580774355 # HT - 1757 414 28 -0.834 2.55910258118 -13.357628393 4.66901290592 # OT - 1758 414 27 0.417 3.31605290845 -12.7717461164 4.66901290592 # HT - 1759 414 27 0.417 1.80215225392 -12.7717461164 4.66901290592 # HT - 1760 415 28 -0.834 0.0958974188157 -10.8944232307 4.66901290592 # OT - 1761 415 27 0.417 0.852847746079 -10.308540954 4.66901290592 # HT - 1762 415 27 0.417 -0.661052908448 -10.308540954 4.66901290592 # HT - 1763 416 28 -0.834 0.0958974188157 -13.357628393 7.13221806829 # OT - 1764 416 27 0.417 0.852847746079 -12.7717461164 7.13221806829 # HT - 1765 416 27 0.417 -0.661052908448 -12.7717461164 7.13221806829 # HT - 1766 417 28 -0.834 2.55910258118 -10.8944232307 7.13221806829 # OT - 1767 417 27 0.417 3.31605290845 -10.308540954 7.13221806829 # HT - 1768 417 27 0.417 1.80215225392 -10.308540954 7.13221806829 # HT - 1769 418 28 -0.834 2.55910258118 -13.357628393 9.59542323066 # OT - 1770 418 27 0.417 3.31605290845 -12.7717461164 9.59542323066 # HT - 1771 418 27 0.417 1.80215225392 -12.7717461164 9.59542323066 # HT - 1772 419 28 -0.834 0.0958974188157 -10.8944232307 9.59542323066 # OT - 1773 419 27 0.417 0.852847746079 -10.308540954 9.59542323066 # HT - 1774 419 27 0.417 -0.661052908448 -10.308540954 9.59542323066 # HT - 1775 420 28 -0.834 0.0958974188157 -8.43121806829 -12.5734232307 # OT - 1776 420 27 0.417 0.852847746079 -7.84533579167 -12.5734232307 # HT - 1777 420 27 0.417 -0.661052908448 -7.84533579167 -12.5734232307 # HT - 1778 421 28 -0.834 2.55910258118 -8.43121806829 -10.1102180683 # OT - 1779 421 27 0.417 3.31605290845 -7.84533579167 -10.1102180683 # HT - 1780 421 27 0.417 1.80215225392 -7.84533579167 -10.1102180683 # HT - 1781 422 28 -0.834 2.55910258118 -8.43121806829 -5.18380774355 # OT - 1782 422 27 0.417 3.31605290845 -7.84533579167 -5.18380774355 # HT - 1783 422 27 0.417 1.80215225392 -7.84533579167 -5.18380774355 # HT - 1784 423 28 -0.834 0.0958974188157 -3.50480774355 -12.5734232307 # OT - 1785 423 27 0.417 0.852847746079 -2.91892546693 -12.5734232307 # HT - 1786 423 27 0.417 -0.661052908448 -2.91892546693 -12.5734232307 # HT - 1787 424 28 -0.834 2.55910258118 -1.04160258118 -12.5734232307 # OT - 1788 424 27 0.417 3.31605290845 -0.455720304566 -12.5734232307 # HT - 1789 424 27 0.417 1.80215225392 -0.455720304566 -12.5734232307 # HT - 1790 425 28 -0.834 0.0958974188157 1.42160258118 -12.5734232307 # OT - 1791 425 27 0.417 0.852847746079 2.0074848578 -12.5734232307 # HT - 1792 425 27 0.417 -0.661052908448 2.0074848578 -12.5734232307 # HT - 1793 426 28 -0.834 2.55910258118 3.88480774355 -12.5734232307 # OT - 1794 426 27 0.417 3.31605290845 4.47069002017 -12.5734232307 # HT - 1795 426 27 0.417 1.80215225392 4.47069002017 -12.5734232307 # HT - 1796 427 28 -0.834 0.0958974188157 3.88480774355 -10.1102180683 # OT - 1797 427 27 0.417 0.852847746079 4.47069002017 -10.1102180683 # HT - 1798 427 27 0.417 -0.661052908448 4.47069002017 -10.1102180683 # HT - 1799 428 28 -0.834 0.0958974188157 3.88480774355 9.59542323066 # OT - 1800 428 27 0.417 0.852847746079 4.47069002017 9.59542323066 # HT - 1801 428 27 0.417 -0.661052908448 4.47069002017 9.59542323066 # HT - 1802 429 28 -0.834 0.0958974188157 6.34801290592 -12.5734232307 # OT - 1803 429 27 0.417 0.852847746079 6.93389518254 -12.5734232307 # HT - 1804 429 27 0.417 -0.661052908448 6.93389518254 -12.5734232307 # HT - 1805 430 28 -0.834 2.55910258118 8.81121806829 -12.5734232307 # OT - 1806 430 27 0.417 3.31605290845 9.39710034491 -12.5734232307 # HT - 1807 430 27 0.417 1.80215225392 9.39710034491 -12.5734232307 # HT - 1808 431 28 -0.834 2.55910258118 6.34801290592 -10.1102180683 # OT - 1809 431 27 0.417 3.31605290845 6.93389518254 -10.1102180683 # HT - 1810 431 27 0.417 1.80215225392 6.93389518254 -10.1102180683 # HT - 1811 432 28 -0.834 0.0958974188157 8.81121806829 -10.1102180683 # OT - 1812 432 27 0.417 0.852847746079 9.39710034491 -10.1102180683 # HT - 1813 432 27 0.417 -0.661052908448 9.39710034491 -10.1102180683 # HT - 1814 433 28 -0.834 0.0958974188157 8.81121806829 4.66901290592 # OT - 1815 433 27 0.417 0.852847746079 9.39710034491 4.66901290592 # HT - 1816 433 27 0.417 -0.661052908448 9.39710034491 4.66901290592 # HT - 1817 434 28 -0.834 2.55910258118 8.81121806829 7.13221806829 # OT - 1818 434 27 0.417 3.31605290845 9.39710034491 7.13221806829 # HT - 1819 434 27 0.417 1.80215225392 9.39710034491 7.13221806829 # HT - 1820 435 28 -0.834 0.0958974188157 8.81121806829 9.59542323066 # OT - 1821 435 27 0.417 0.852847746079 9.39710034491 9.59542323066 # HT - 1822 435 27 0.417 -0.661052908448 9.39710034491 9.59542323066 # HT - 1823 436 28 -0.834 0.0958974188157 11.2744232307 -12.5734232307 # OT - 1824 436 27 0.417 0.852847746079 11.8603055073 -12.5734232307 # HT - 1825 436 27 0.417 -0.661052908448 11.8603055073 -12.5734232307 # HT - 1826 437 28 -0.834 2.55910258118 13.737628393 -12.5734232307 # OT - 1827 437 27 0.417 3.31605290845 14.3235106696 -12.5734232307 # HT - 1828 437 27 0.417 1.80215225392 14.3235106696 -12.5734232307 # HT - 1829 438 28 -0.834 2.55910258118 11.2744232307 -10.1102180683 # OT - 1830 438 27 0.417 3.31605290845 11.8603055073 -10.1102180683 # HT - 1831 438 27 0.417 1.80215225392 11.8603055073 -10.1102180683 # HT - 1832 439 28 -0.834 0.0958974188157 13.737628393 -10.1102180683 # OT - 1833 439 27 0.417 0.852847746079 14.3235106696 -10.1102180683 # HT - 1834 439 27 0.417 -0.661052908448 14.3235106696 -10.1102180683 # HT - 1835 440 28 -0.834 0.0958974188157 11.2744232307 -7.64701290592 # OT - 1836 440 27 0.417 0.852847746079 11.8603055073 -7.64701290592 # HT - 1837 440 27 0.417 -0.661052908448 11.8603055073 -7.64701290592 # HT - 1838 441 28 -0.834 2.55910258118 13.737628393 -7.64701290592 # OT - 1839 441 27 0.417 3.31605290845 14.3235106696 -7.64701290592 # HT - 1840 441 27 0.417 1.80215225392 14.3235106696 -7.64701290592 # HT - 1841 442 28 -0.834 2.55910258118 11.2744232307 -5.18380774355 # OT - 1842 442 27 0.417 3.31605290845 11.8603055073 -5.18380774355 # HT - 1843 442 27 0.417 1.80215225392 11.8603055073 -5.18380774355 # HT - 1844 443 28 -0.834 0.0958974188157 13.737628393 -5.18380774355 # OT - 1845 443 27 0.417 0.852847746079 14.3235106696 -5.18380774355 # HT - 1846 443 27 0.417 -0.661052908448 14.3235106696 -5.18380774355 # HT - 1847 444 28 -0.834 2.55910258118 13.737628393 -2.72060258118 # OT - 1848 444 27 0.417 3.31605290845 14.3235106696 -2.72060258118 # HT - 1849 444 27 0.417 1.80215225392 14.3235106696 -2.72060258118 # HT - 1850 445 28 -0.834 0.0958974188157 13.737628393 4.66901290592 # OT - 1851 445 27 0.417 0.852847746079 14.3235106696 4.66901290592 # HT - 1852 445 27 0.417 -0.661052908448 14.3235106696 4.66901290592 # HT - 1853 446 28 -0.834 0.0958974188157 11.2744232307 7.13221806829 # OT - 1854 446 27 0.417 0.852847746079 11.8603055073 7.13221806829 # HT - 1855 446 27 0.417 -0.661052908448 11.8603055073 7.13221806829 # HT - 1856 447 28 -0.834 2.55910258118 13.737628393 7.13221806829 # OT - 1857 447 27 0.417 3.31605290845 14.3235106696 7.13221806829 # HT - 1858 447 27 0.417 1.80215225392 14.3235106696 7.13221806829 # HT - 1859 448 28 -0.834 2.55910258118 11.2744232307 9.59542323066 # OT - 1860 448 27 0.417 3.31605290845 11.8603055073 9.59542323066 # HT - 1861 448 27 0.417 1.80215225392 11.8603055073 9.59542323066 # HT - 1862 449 28 -0.834 0.0958974188157 13.737628393 9.59542323066 # OT - 1863 449 27 0.417 0.852847746079 14.3235106696 9.59542323066 # HT - 1864 449 27 0.417 -0.661052908448 14.3235106696 9.59542323066 # HT - 1865 450 28 -0.834 5.02230774355 -13.357628393 -12.5734232307 # OT - 1866 450 27 0.417 5.77925807082 -12.7717461164 -12.5734232307 # HT - 1867 450 27 0.417 4.26535741629 -12.7717461164 -12.5734232307 # HT - 1868 451 28 -0.834 7.48551290592 -10.8944232307 -12.5734232307 # OT - 1869 451 27 0.417 8.24246323319 -10.308540954 -12.5734232307 # HT - 1870 451 27 0.417 6.72856257866 -10.308540954 -12.5734232307 # HT - 1871 452 28 -0.834 7.48551290592 -13.357628393 -10.1102180683 # OT - 1872 452 27 0.417 8.24246323319 -12.7717461164 -10.1102180683 # HT - 1873 452 27 0.417 6.72856257866 -12.7717461164 -10.1102180683 # HT - 1874 453 28 -0.834 5.02230774355 -10.8944232307 -10.1102180683 # OT - 1875 453 27 0.417 5.77925807082 -10.308540954 -10.1102180683 # HT - 1876 453 27 0.417 4.26535741629 -10.308540954 -10.1102180683 # HT - 1877 454 28 -0.834 5.02230774355 -13.357628393 -7.64701290592 # OT - 1878 454 27 0.417 5.77925807082 -12.7717461164 -7.64701290592 # HT - 1879 454 27 0.417 4.26535741629 -12.7717461164 -7.64701290592 # HT - 1880 455 28 -0.834 7.48551290592 -10.8944232307 -7.64701290592 # OT - 1881 455 27 0.417 8.24246323319 -10.308540954 -7.64701290592 # HT - 1882 455 27 0.417 6.72856257866 -10.308540954 -7.64701290592 # HT - 1883 456 28 -0.834 7.48551290592 -13.357628393 -5.18380774355 # OT - 1884 456 27 0.417 8.24246323319 -12.7717461164 -5.18380774355 # HT - 1885 456 27 0.417 6.72856257866 -12.7717461164 -5.18380774355 # HT - 1886 457 28 -0.834 5.02230774355 -10.8944232307 -5.18380774355 # OT - 1887 457 27 0.417 5.77925807082 -10.308540954 -5.18380774355 # HT - 1888 457 27 0.417 4.26535741629 -10.308540954 -5.18380774355 # HT - 1889 458 28 -0.834 5.02230774355 -13.357628393 -2.72060258118 # OT - 1890 458 27 0.417 5.77925807082 -12.7717461164 -2.72060258118 # HT - 1891 458 27 0.417 4.26535741629 -12.7717461164 -2.72060258118 # HT - 1892 459 28 -0.834 7.48551290592 -10.8944232307 -2.72060258118 # OT - 1893 459 27 0.417 8.24246323319 -10.308540954 -2.72060258118 # HT - 1894 459 27 0.417 6.72856257866 -10.308540954 -2.72060258118 # HT - 1895 460 28 -0.834 7.48551290592 -13.357628393 -0.257397418816 # OT - 1896 460 27 0.417 8.24246323319 -12.7717461164 -0.257397418816 # HT - 1897 460 27 0.417 6.72856257866 -12.7717461164 -0.257397418816 # HT - 1898 461 28 -0.834 5.02230774355 -13.357628393 2.20580774355 # OT - 1899 461 27 0.417 5.77925807082 -12.7717461164 2.20580774355 # HT - 1900 461 27 0.417 4.26535741629 -12.7717461164 2.20580774355 # HT - 1901 462 28 -0.834 7.48551290592 -10.8944232307 2.20580774355 # OT - 1902 462 27 0.417 8.24246323319 -10.308540954 2.20580774355 # HT - 1903 462 27 0.417 6.72856257866 -10.308540954 2.20580774355 # HT - 1904 463 28 -0.834 7.48551290592 -13.357628393 4.66901290592 # OT - 1905 463 27 0.417 8.24246323319 -12.7717461164 4.66901290592 # HT - 1906 463 27 0.417 6.72856257866 -12.7717461164 4.66901290592 # HT - 1907 464 28 -0.834 5.02230774355 -10.8944232307 4.66901290592 # OT - 1908 464 27 0.417 5.77925807082 -10.308540954 4.66901290592 # HT - 1909 464 27 0.417 4.26535741629 -10.308540954 4.66901290592 # HT - 1910 465 28 -0.834 5.02230774355 -13.357628393 7.13221806829 # OT - 1911 465 27 0.417 5.77925807082 -12.7717461164 7.13221806829 # HT - 1912 465 27 0.417 4.26535741629 -12.7717461164 7.13221806829 # HT - 1913 466 28 -0.834 7.48551290592 -10.8944232307 7.13221806829 # OT - 1914 466 27 0.417 8.24246323319 -10.308540954 7.13221806829 # HT - 1915 466 27 0.417 6.72856257866 -10.308540954 7.13221806829 # HT - 1916 467 28 -0.834 7.48551290592 -13.357628393 9.59542323066 # OT - 1917 467 27 0.417 8.24246323319 -12.7717461164 9.59542323066 # HT - 1918 467 27 0.417 6.72856257866 -12.7717461164 9.59542323066 # HT - 1919 468 28 -0.834 5.02230774355 -10.8944232307 9.59542323066 # OT - 1920 468 27 0.417 5.77925807082 -10.308540954 9.59542323066 # HT - 1921 468 27 0.417 4.26535741629 -10.308540954 9.59542323066 # HT - 1922 469 28 -0.834 5.02230774355 -8.43121806829 -12.5734232307 # OT - 1923 469 27 0.417 5.77925807082 -7.84533579167 -12.5734232307 # HT - 1924 469 27 0.417 4.26535741629 -7.84533579167 -12.5734232307 # HT - 1925 470 28 -0.834 7.48551290592 -8.43121806829 -10.1102180683 # OT - 1926 470 27 0.417 8.24246323319 -7.84533579167 -10.1102180683 # HT - 1927 470 27 0.417 6.72856257866 -7.84533579167 -10.1102180683 # HT - 1928 471 28 -0.834 5.02230774355 -5.96801290592 -10.1102180683 # OT - 1929 471 27 0.417 5.77925807082 -5.3821306293 -10.1102180683 # HT - 1930 471 27 0.417 4.26535741629 -5.3821306293 -10.1102180683 # HT - 1931 472 28 -0.834 5.02230774355 -8.43121806829 -7.64701290592 # OT - 1932 472 27 0.417 5.77925807082 -7.84533579167 -7.64701290592 # HT - 1933 472 27 0.417 4.26535741629 -7.84533579167 -7.64701290592 # HT - 1934 473 28 -0.834 7.48551290592 -8.43121806829 9.59542323066 # OT - 1935 473 27 0.417 8.24246323319 -7.84533579167 9.59542323066 # HT - 1936 473 27 0.417 6.72856257866 -7.84533579167 9.59542323066 # HT - 1937 474 28 -0.834 5.02230774355 -1.04160258118 9.59542323066 # OT - 1938 474 27 0.417 5.77925807082 -0.455720304566 9.59542323066 # HT - 1939 474 27 0.417 4.26535741629 -0.455720304566 9.59542323066 # HT - 1940 475 28 -0.834 5.02230774355 1.42160258118 -12.5734232307 # OT - 1941 475 27 0.417 5.77925807082 2.0074848578 -12.5734232307 # HT - 1942 475 27 0.417 4.26535741629 2.0074848578 -12.5734232307 # HT - 1943 476 28 -0.834 7.48551290592 3.88480774355 -12.5734232307 # OT - 1944 476 27 0.417 8.24246323319 4.47069002017 -12.5734232307 # HT - 1945 476 27 0.417 6.72856257866 4.47069002017 -12.5734232307 # HT - 1946 477 28 -0.834 7.48551290592 1.42160258118 9.59542323066 # OT - 1947 477 27 0.417 8.24246323319 2.0074848578 9.59542323066 # HT - 1948 477 27 0.417 6.72856257866 2.0074848578 9.59542323066 # HT - 1949 478 28 -0.834 5.02230774355 6.34801290592 -12.5734232307 # OT - 1950 478 27 0.417 5.77925807082 6.93389518254 -12.5734232307 # HT - 1951 478 27 0.417 4.26535741629 6.93389518254 -12.5734232307 # HT - 1952 479 28 -0.834 7.48551290592 8.81121806829 -12.5734232307 # OT - 1953 479 27 0.417 8.24246323319 9.39710034491 -12.5734232307 # HT - 1954 479 27 0.417 6.72856257866 9.39710034491 -12.5734232307 # HT - 1955 480 28 -0.834 7.48551290592 6.34801290592 -10.1102180683 # OT - 1956 480 27 0.417 8.24246323319 6.93389518254 -10.1102180683 # HT - 1957 480 27 0.417 6.72856257866 6.93389518254 -10.1102180683 # HT - 1958 481 28 -0.834 5.02230774355 8.81121806829 -10.1102180683 # OT - 1959 481 27 0.417 5.77925807082 9.39710034491 -10.1102180683 # HT - 1960 481 27 0.417 4.26535741629 9.39710034491 -10.1102180683 # HT - 1961 482 28 -0.834 7.48551290592 8.81121806829 -7.64701290592 # OT - 1962 482 27 0.417 8.24246323319 9.39710034491 -7.64701290592 # HT - 1963 482 27 0.417 6.72856257866 9.39710034491 -7.64701290592 # HT - 1964 483 28 -0.834 7.48551290592 6.34801290592 9.59542323066 # OT - 1965 483 27 0.417 8.24246323319 6.93389518254 9.59542323066 # HT - 1966 483 27 0.417 6.72856257866 6.93389518254 9.59542323066 # HT - 1967 484 28 -0.834 5.02230774355 8.81121806829 9.59542323066 # OT - 1968 484 27 0.417 5.77925807082 9.39710034491 9.59542323066 # HT - 1969 484 27 0.417 4.26535741629 9.39710034491 9.59542323066 # HT - 1970 485 28 -0.834 5.02230774355 11.2744232307 -12.5734232307 # OT - 1971 485 27 0.417 5.77925807082 11.8603055073 -12.5734232307 # HT - 1972 485 27 0.417 4.26535741629 11.8603055073 -12.5734232307 # HT - 1973 486 28 -0.834 7.48551290592 13.737628393 -12.5734232307 # OT - 1974 486 27 0.417 8.24246323319 14.3235106696 -12.5734232307 # HT - 1975 486 27 0.417 6.72856257866 14.3235106696 -12.5734232307 # HT - 1976 487 28 -0.834 7.48551290592 11.2744232307 -10.1102180683 # OT - 1977 487 27 0.417 8.24246323319 11.8603055073 -10.1102180683 # HT - 1978 487 27 0.417 6.72856257866 11.8603055073 -10.1102180683 # HT - 1979 488 28 -0.834 5.02230774355 13.737628393 -10.1102180683 # OT - 1980 488 27 0.417 5.77925807082 14.3235106696 -10.1102180683 # HT - 1981 488 27 0.417 4.26535741629 14.3235106696 -10.1102180683 # HT - 1982 489 28 -0.834 5.02230774355 11.2744232307 -7.64701290592 # OT - 1983 489 27 0.417 5.77925807082 11.8603055073 -7.64701290592 # HT - 1984 489 27 0.417 4.26535741629 11.8603055073 -7.64701290592 # HT - 1985 490 28 -0.834 7.48551290592 13.737628393 -7.64701290592 # OT - 1986 490 27 0.417 8.24246323319 14.3235106696 -7.64701290592 # HT - 1987 490 27 0.417 6.72856257866 14.3235106696 -7.64701290592 # HT - 1988 491 28 -0.834 7.48551290592 11.2744232307 -5.18380774355 # OT - 1989 491 27 0.417 8.24246323319 11.8603055073 -5.18380774355 # HT - 1990 491 27 0.417 6.72856257866 11.8603055073 -5.18380774355 # HT - 1991 492 28 -0.834 5.02230774355 13.737628393 -5.18380774355 # OT - 1992 492 27 0.417 5.77925807082 14.3235106696 -5.18380774355 # HT - 1993 492 27 0.417 4.26535741629 14.3235106696 -5.18380774355 # HT - 1994 493 28 -0.834 5.02230774355 11.2744232307 -2.72060258118 # OT - 1995 493 27 0.417 5.77925807082 11.8603055073 -2.72060258118 # HT - 1996 493 27 0.417 4.26535741629 11.8603055073 -2.72060258118 # HT - 1997 494 28 -0.834 7.48551290592 13.737628393 -2.72060258118 # OT - 1998 494 27 0.417 8.24246323319 14.3235106696 -2.72060258118 # HT - 1999 494 27 0.417 6.72856257866 14.3235106696 -2.72060258118 # HT - 2000 495 28 -0.834 7.48551290592 13.737628393 2.20580774355 # OT - 2001 495 27 0.417 8.24246323319 14.3235106696 2.20580774355 # HT - 2002 495 27 0.417 6.72856257866 14.3235106696 2.20580774355 # HT - 2003 496 28 -0.834 5.02230774355 13.737628393 4.66901290592 # OT - 2004 496 27 0.417 5.77925807082 14.3235106696 4.66901290592 # HT - 2005 496 27 0.417 4.26535741629 14.3235106696 4.66901290592 # HT - 2006 497 30 1 7.48551290592 13.737628393 7.13221806829 # SOD - 2007 498 28 -0.834 7.48551290592 11.2744232307 9.59542323066 # OT - 2008 498 27 0.417 8.24246323319 11.8603055073 9.59542323066 # HT - 2009 498 27 0.417 6.72856257866 11.8603055073 9.59542323066 # HT - 2010 499 28 -0.834 5.02230774355 13.737628393 9.59542323066 # OT - 2011 499 27 0.417 5.77925807082 14.3235106696 9.59542323066 # HT - 2012 499 27 0.417 4.26535741629 14.3235106696 9.59542323066 # HT - 2013 500 28 -0.834 9.94871806829 -13.357628393 -12.5734232307 # OT - 2014 500 27 0.417 10.7056683956 -12.7717461164 -12.5734232307 # HT - 2015 500 27 0.417 9.19176774103 -12.7717461164 -12.5734232307 # HT - 2016 501 28 -0.834 12.4119232307 -10.8944232307 -12.5734232307 # OT - 2017 501 27 0.417 13.1688735579 -10.308540954 -12.5734232307 # HT - 2018 501 27 0.417 11.6549729034 -10.308540954 -12.5734232307 # HT - 2019 502 28 -0.834 12.4119232307 -13.357628393 -10.1102180683 # OT - 2020 502 27 0.417 13.1688735579 -12.7717461164 -10.1102180683 # HT - 2021 502 27 0.417 11.6549729034 -12.7717461164 -10.1102180683 # HT - 2022 503 28 -0.834 9.94871806829 -10.8944232307 -10.1102180683 # OT - 2023 503 27 0.417 10.7056683956 -10.308540954 -10.1102180683 # HT - 2024 503 27 0.417 9.19176774103 -10.308540954 -10.1102180683 # HT - 2025 504 28 -0.834 9.94871806829 -13.357628393 -7.64701290592 # OT - 2026 504 27 0.417 10.7056683956 -12.7717461164 -7.64701290592 # HT - 2027 504 27 0.417 9.19176774103 -12.7717461164 -7.64701290592 # HT - 2028 505 28 -0.834 12.4119232307 -10.8944232307 -7.64701290592 # OT - 2029 505 27 0.417 13.1688735579 -10.308540954 -7.64701290592 # HT - 2030 505 27 0.417 11.6549729034 -10.308540954 -7.64701290592 # HT - 2031 506 28 -0.834 12.4119232307 -13.357628393 -5.18380774355 # OT - 2032 506 27 0.417 13.1688735579 -12.7717461164 -5.18380774355 # HT - 2033 506 27 0.417 11.6549729034 -12.7717461164 -5.18380774355 # HT - 2034 507 28 -0.834 9.94871806829 -10.8944232307 -5.18380774355 # OT - 2035 507 27 0.417 10.7056683956 -10.308540954 -5.18380774355 # HT - 2036 507 27 0.417 9.19176774103 -10.308540954 -5.18380774355 # HT - 2037 508 28 -0.834 9.94871806829 -13.357628393 -2.72060258118 # OT - 2038 508 27 0.417 10.7056683956 -12.7717461164 -2.72060258118 # HT - 2039 508 27 0.417 9.19176774103 -12.7717461164 -2.72060258118 # HT - 2040 509 28 -0.834 12.4119232307 -10.8944232307 -2.72060258118 # OT - 2041 509 27 0.417 13.1688735579 -10.308540954 -2.72060258118 # HT - 2042 509 27 0.417 11.6549729034 -10.308540954 -2.72060258118 # HT - 2043 510 28 -0.834 12.4119232307 -13.357628393 -0.257397418816 # OT - 2044 510 27 0.417 13.1688735579 -12.7717461164 -0.257397418816 # HT - 2045 510 27 0.417 11.6549729034 -12.7717461164 -0.257397418816 # HT - 2046 511 28 -0.834 9.94871806829 -10.8944232307 -0.257397418816 # OT - 2047 511 27 0.417 10.7056683956 -10.308540954 -0.257397418816 # HT - 2048 511 27 0.417 9.19176774103 -10.308540954 -0.257397418816 # HT - 2049 512 28 -0.834 9.94871806829 -13.357628393 2.20580774355 # OT - 2050 512 27 0.417 10.7056683956 -12.7717461164 2.20580774355 # HT - 2051 512 27 0.417 9.19176774103 -12.7717461164 2.20580774355 # HT - 2052 513 28 -0.834 12.4119232307 -10.8944232307 2.20580774355 # OT - 2053 513 27 0.417 13.1688735579 -10.308540954 2.20580774355 # HT - 2054 513 27 0.417 11.6549729034 -10.308540954 2.20580774355 # HT - 2055 514 28 -0.834 12.4119232307 -13.357628393 4.66901290592 # OT - 2056 514 27 0.417 13.1688735579 -12.7717461164 4.66901290592 # HT - 2057 514 27 0.417 11.6549729034 -12.7717461164 4.66901290592 # HT - 2058 515 28 -0.834 9.94871806829 -10.8944232307 4.66901290592 # OT - 2059 515 27 0.417 10.7056683956 -10.308540954 4.66901290592 # HT - 2060 515 27 0.417 9.19176774103 -10.308540954 4.66901290592 # HT - 2061 516 28 -0.834 9.94871806829 -13.357628393 7.13221806829 # OT - 2062 516 27 0.417 10.7056683956 -12.7717461164 7.13221806829 # HT - 2063 516 27 0.417 9.19176774103 -12.7717461164 7.13221806829 # HT - 2064 517 28 -0.834 12.4119232307 -10.8944232307 7.13221806829 # OT - 2065 517 27 0.417 13.1688735579 -10.308540954 7.13221806829 # HT - 2066 517 27 0.417 11.6549729034 -10.308540954 7.13221806829 # HT - 2067 518 28 -0.834 12.4119232307 -13.357628393 9.59542323066 # OT - 2068 518 27 0.417 13.1688735579 -12.7717461164 9.59542323066 # HT - 2069 518 27 0.417 11.6549729034 -12.7717461164 9.59542323066 # HT - 2070 519 28 -0.834 9.94871806829 -10.8944232307 9.59542323066 # OT - 2071 519 27 0.417 10.7056683956 -10.308540954 9.59542323066 # HT - 2072 519 27 0.417 9.19176774103 -10.308540954 9.59542323066 # HT - 2073 520 28 -0.834 9.94871806829 -8.43121806829 -12.5734232307 # OT - 2074 520 27 0.417 10.7056683956 -7.84533579167 -12.5734232307 # HT - 2075 520 27 0.417 9.19176774103 -7.84533579167 -12.5734232307 # HT - 2076 521 28 -0.834 12.4119232307 -5.96801290592 -12.5734232307 # OT - 2077 521 27 0.417 13.1688735579 -5.3821306293 -12.5734232307 # HT - 2078 521 27 0.417 11.6549729034 -5.3821306293 -12.5734232307 # HT - 2079 522 28 -0.834 12.4119232307 -8.43121806829 -10.1102180683 # OT - 2080 522 27 0.417 13.1688735579 -7.84533579167 -10.1102180683 # HT - 2081 522 27 0.417 11.6549729034 -7.84533579167 -10.1102180683 # HT - 2082 523 28 -0.834 9.94871806829 -5.96801290592 -10.1102180683 # OT - 2083 523 27 0.417 10.7056683956 -5.3821306293 -10.1102180683 # HT - 2084 523 27 0.417 9.19176774103 -5.3821306293 -10.1102180683 # HT - 2085 524 28 -0.834 9.94871806829 -8.43121806829 -7.64701290592 # OT - 2086 524 27 0.417 10.7056683956 -7.84533579167 -7.64701290592 # HT - 2087 524 27 0.417 9.19176774103 -7.84533579167 -7.64701290592 # HT - 2088 525 28 -0.834 12.4119232307 -5.96801290592 -7.64701290592 # OT - 2089 525 27 0.417 13.1688735579 -5.3821306293 -7.64701290592 # HT - 2090 525 27 0.417 11.6549729034 -5.3821306293 -7.64701290592 # HT - 2091 526 28 -0.834 12.4119232307 -8.43121806829 -5.18380774355 # OT - 2092 526 27 0.417 13.1688735579 -7.84533579167 -5.18380774355 # HT - 2093 526 27 0.417 11.6549729034 -7.84533579167 -5.18380774355 # HT - 2094 527 28 -0.834 12.4119232307 -8.43121806829 9.59542323066 # OT - 2095 527 27 0.417 13.1688735579 -7.84533579167 9.59542323066 # HT - 2096 527 27 0.417 11.6549729034 -7.84533579167 9.59542323066 # HT - 2097 528 28 -0.834 9.94871806829 -5.96801290592 9.59542323066 # OT - 2098 528 27 0.417 10.7056683956 -5.3821306293 9.59542323066 # HT - 2099 528 27 0.417 9.19176774103 -5.3821306293 9.59542323066 # HT - 2100 529 28 -0.834 9.94871806829 -3.50480774355 -12.5734232307 # OT - 2101 529 27 0.417 10.7056683956 -2.91892546693 -12.5734232307 # HT - 2102 529 27 0.417 9.19176774103 -2.91892546693 -12.5734232307 # HT - 2103 530 28 -0.834 12.4119232307 -1.04160258118 -12.5734232307 # OT - 2104 530 27 0.417 13.1688735579 -0.455720304566 -12.5734232307 # HT - 2105 530 27 0.417 11.6549729034 -0.455720304566 -12.5734232307 # HT - 2106 531 28 -0.834 12.4119232307 -3.50480774355 -10.1102180683 # OT - 2107 531 27 0.417 13.1688735579 -2.91892546693 -10.1102180683 # HT - 2108 531 27 0.417 11.6549729034 -2.91892546693 -10.1102180683 # HT - 2109 532 28 -0.834 9.94871806829 1.42160258118 -12.5734232307 # OT - 2110 532 27 0.417 10.7056683956 2.0074848578 -12.5734232307 # HT - 2111 532 27 0.417 9.19176774103 2.0074848578 -12.5734232307 # HT - 2112 533 28 -0.834 12.4119232307 3.88480774355 -12.5734232307 # OT - 2113 533 27 0.417 13.1688735579 4.47069002017 -12.5734232307 # HT - 2114 533 27 0.417 11.6549729034 4.47069002017 -12.5734232307 # HT - 2115 534 28 -0.834 12.4119232307 1.42160258118 -10.1102180683 # OT - 2116 534 27 0.417 13.1688735579 2.0074848578 -10.1102180683 # HT - 2117 534 27 0.417 11.6549729034 2.0074848578 -10.1102180683 # HT - 2118 535 28 -0.834 9.94871806829 3.88480774355 -10.1102180683 # OT - 2119 535 27 0.417 10.7056683956 4.47069002017 -10.1102180683 # HT - 2120 535 27 0.417 9.19176774103 4.47069002017 -10.1102180683 # HT - 2121 536 28 -0.834 12.4119232307 1.42160258118 9.59542323066 # OT - 2122 536 27 0.417 13.1688735579 2.0074848578 9.59542323066 # HT - 2123 536 27 0.417 11.6549729034 2.0074848578 9.59542323066 # HT - 2124 537 28 -0.834 9.94871806829 3.88480774355 9.59542323066 # OT - 2125 537 27 0.417 10.7056683956 4.47069002017 9.59542323066 # HT - 2126 537 27 0.417 9.19176774103 4.47069002017 9.59542323066 # HT - 2127 538 28 -0.834 9.94871806829 6.34801290592 -12.5734232307 # OT - 2128 538 27 0.417 10.7056683956 6.93389518254 -12.5734232307 # HT - 2129 538 27 0.417 9.19176774103 6.93389518254 -12.5734232307 # HT - 2130 539 28 -0.834 12.4119232307 8.81121806829 -12.5734232307 # OT - 2131 539 27 0.417 13.1688735579 9.39710034491 -12.5734232307 # HT - 2132 539 27 0.417 11.6549729034 9.39710034491 -12.5734232307 # HT - 2133 540 28 -0.834 12.4119232307 6.34801290592 -10.1102180683 # OT - 2134 540 27 0.417 13.1688735579 6.93389518254 -10.1102180683 # HT - 2135 540 27 0.417 11.6549729034 6.93389518254 -10.1102180683 # HT - 2136 541 28 -0.834 9.94871806829 8.81121806829 -10.1102180683 # OT - 2137 541 27 0.417 10.7056683956 9.39710034491 -10.1102180683 # HT - 2138 541 27 0.417 9.19176774103 9.39710034491 -10.1102180683 # HT - 2139 542 28 -0.834 12.4119232307 8.81121806829 -7.64701290592 # OT - 2140 542 27 0.417 13.1688735579 9.39710034491 -7.64701290592 # HT - 2141 542 27 0.417 11.6549729034 9.39710034491 -7.64701290592 # HT - 2142 543 28 -0.834 12.4119232307 8.81121806829 -2.72060258118 # OT - 2143 543 27 0.417 13.1688735579 9.39710034491 -2.72060258118 # HT - 2144 543 27 0.417 11.6549729034 9.39710034491 -2.72060258118 # HT - 2145 544 28 -0.834 12.4119232307 8.81121806829 2.20580774355 # OT - 2146 544 27 0.417 13.1688735579 9.39710034491 2.20580774355 # HT - 2147 544 27 0.417 11.6549729034 9.39710034491 2.20580774355 # HT - 2148 545 28 -0.834 12.4119232307 8.81121806829 7.13221806829 # OT - 2149 545 27 0.417 13.1688735579 9.39710034491 7.13221806829 # HT - 2150 545 27 0.417 11.6549729034 9.39710034491 7.13221806829 # HT - 2151 546 28 -0.834 12.4119232307 6.34801290592 9.59542323066 # OT - 2152 546 27 0.417 13.1688735579 6.93389518254 9.59542323066 # HT - 2153 546 27 0.417 11.6549729034 6.93389518254 9.59542323066 # HT - 2154 547 28 -0.834 9.94871806829 8.81121806829 9.59542323066 # OT - 2155 547 27 0.417 10.7056683956 9.39710034491 9.59542323066 # HT - 2156 547 27 0.417 9.19176774103 9.39710034491 9.59542323066 # HT - 2157 548 28 -0.834 9.94871806829 11.2744232307 -12.5734232307 # OT - 2158 548 27 0.417 10.7056683956 11.8603055073 -12.5734232307 # HT - 2159 548 27 0.417 9.19176774103 11.8603055073 -12.5734232307 # HT - 2160 549 28 -0.834 12.4119232307 13.737628393 -12.5734232307 # OT - 2161 549 27 0.417 13.1688735579 14.3235106696 -12.5734232307 # HT - 2162 549 27 0.417 11.6549729034 14.3235106696 -12.5734232307 # HT - 2163 550 28 -0.834 12.4119232307 11.2744232307 -10.1102180683 # OT - 2164 550 27 0.417 13.1688735579 11.8603055073 -10.1102180683 # HT - 2165 550 27 0.417 11.6549729034 11.8603055073 -10.1102180683 # HT - 2166 551 28 -0.834 9.94871806829 13.737628393 -10.1102180683 # OT - 2167 551 27 0.417 10.7056683956 14.3235106696 -10.1102180683 # HT - 2168 551 27 0.417 9.19176774103 14.3235106696 -10.1102180683 # HT - 2169 552 28 -0.834 9.94871806829 11.2744232307 -7.64701290592 # OT - 2170 552 27 0.417 10.7056683956 11.8603055073 -7.64701290592 # HT - 2171 552 27 0.417 9.19176774103 11.8603055073 -7.64701290592 # HT - 2172 553 28 -0.834 12.4119232307 13.737628393 -7.64701290592 # OT - 2173 553 27 0.417 13.1688735579 14.3235106696 -7.64701290592 # HT - 2174 553 27 0.417 11.6549729034 14.3235106696 -7.64701290592 # HT - 2175 554 28 -0.834 12.4119232307 11.2744232307 -5.18380774355 # OT - 2176 554 27 0.417 13.1688735579 11.8603055073 -5.18380774355 # HT - 2177 554 27 0.417 11.6549729034 11.8603055073 -5.18380774355 # HT - 2178 555 28 -0.834 9.94871806829 13.737628393 -5.18380774355 # OT - 2179 555 27 0.417 10.7056683956 14.3235106696 -5.18380774355 # HT - 2180 555 27 0.417 9.19176774103 14.3235106696 -5.18380774355 # HT - 2181 556 28 -0.834 12.4119232307 13.737628393 -2.72060258118 # OT - 2182 556 27 0.417 13.1688735579 14.3235106696 -2.72060258118 # HT - 2183 556 27 0.417 11.6549729034 14.3235106696 -2.72060258118 # HT - 2184 557 28 -0.834 12.4119232307 11.2744232307 -0.257397418816 # OT - 2185 557 27 0.417 13.1688735579 11.8603055073 -0.257397418816 # HT - 2186 557 27 0.417 11.6549729034 11.8603055073 -0.257397418816 # HT - 2187 558 28 -0.834 9.94871806829 13.737628393 -0.257397418816 # OT - 2188 558 27 0.417 10.7056683956 14.3235106696 -0.257397418816 # HT - 2189 558 27 0.417 9.19176774103 14.3235106696 -0.257397418816 # HT - 2190 559 28 -0.834 12.4119232307 13.737628393 2.20580774355 # OT - 2191 559 27 0.417 13.1688735579 14.3235106696 2.20580774355 # HT - 2192 559 27 0.417 11.6549729034 14.3235106696 2.20580774355 # HT - 2193 560 28 -0.834 12.4119232307 11.2744232307 4.66901290592 # OT - 2194 560 27 0.417 13.1688735579 11.8603055073 4.66901290592 # HT - 2195 560 27 0.417 11.6549729034 11.8603055073 4.66901290592 # HT - 2196 561 28 -0.834 9.94871806829 13.737628393 4.66901290592 # OT - 2197 561 27 0.417 10.7056683956 14.3235106696 4.66901290592 # HT - 2198 561 27 0.417 9.19176774103 14.3235106696 4.66901290592 # HT - 2199 562 28 -0.834 9.94871806829 11.2744232307 7.13221806829 # OT - 2200 562 27 0.417 10.7056683956 11.8603055073 7.13221806829 # HT - 2201 562 27 0.417 9.19176774103 11.8603055073 7.13221806829 # HT - 2202 563 28 -0.834 12.4119232307 13.737628393 7.13221806829 # OT - 2203 563 27 0.417 13.1688735579 14.3235106696 7.13221806829 # HT - 2204 563 27 0.417 11.6549729034 14.3235106696 7.13221806829 # HT - 2205 564 28 -0.834 12.4119232307 11.2744232307 9.59542323066 # OT - 2206 564 27 0.417 13.1688735579 11.8603055073 9.59542323066 # HT - 2207 564 27 0.417 11.6549729034 11.8603055073 9.59542323066 # HT - 2208 565 28 -0.834 9.94871806829 13.737628393 9.59542323066 # OT - 2209 565 27 0.417 10.7056683956 14.3235106696 9.59542323066 # HT - 2210 565 27 0.417 9.19176774103 14.3235106696 9.59542323066 # HT - 2211 566 28 -0.834 14.875128393 -13.357628393 -12.5734232307 # OT - 2212 566 27 0.417 15.6320787203 -12.7717461164 -12.5734232307 # HT - 2213 566 27 0.417 14.1181780658 -12.7717461164 -12.5734232307 # HT - 2214 567 28 -0.834 17.3383335554 -10.8944232307 -12.5734232307 # OT - 2215 567 27 0.417 18.0952838827 -10.308540954 -12.5734232307 # HT - 2216 567 27 0.417 16.5813832281 -10.308540954 -12.5734232307 # HT - 2217 568 28 -0.834 17.3383335554 -13.357628393 -10.1102180683 # OT - 2218 568 27 0.417 18.0952838827 -12.7717461164 -10.1102180683 # HT - 2219 568 27 0.417 16.5813832281 -12.7717461164 -10.1102180683 # HT - 2220 569 28 -0.834 14.875128393 -10.8944232307 -10.1102180683 # OT - 2221 569 27 0.417 15.6320787203 -10.308540954 -10.1102180683 # HT - 2222 569 27 0.417 14.1181780658 -10.308540954 -10.1102180683 # HT - 2223 570 28 -0.834 14.875128393 -13.357628393 -7.64701290592 # OT - 2224 570 27 0.417 15.6320787203 -12.7717461164 -7.64701290592 # HT - 2225 570 27 0.417 14.1181780658 -12.7717461164 -7.64701290592 # HT - 2226 571 28 -0.834 17.3383335554 -10.8944232307 -7.64701290592 # OT - 2227 571 27 0.417 18.0952838827 -10.308540954 -7.64701290592 # HT - 2228 571 27 0.417 16.5813832281 -10.308540954 -7.64701290592 # HT - 2229 572 28 -0.834 17.3383335554 -13.357628393 -5.18380774355 # OT - 2230 572 27 0.417 18.0952838827 -12.7717461164 -5.18380774355 # HT - 2231 572 27 0.417 16.5813832281 -12.7717461164 -5.18380774355 # HT - 2232 573 28 -0.834 14.875128393 -10.8944232307 -5.18380774355 # OT - 2233 573 27 0.417 15.6320787203 -10.308540954 -5.18380774355 # HT - 2234 573 27 0.417 14.1181780658 -10.308540954 -5.18380774355 # HT - 2235 574 28 -0.834 14.875128393 -13.357628393 -2.72060258118 # OT - 2236 574 27 0.417 15.6320787203 -12.7717461164 -2.72060258118 # HT - 2237 574 27 0.417 14.1181780658 -12.7717461164 -2.72060258118 # HT - 2238 575 28 -0.834 17.3383335554 -10.8944232307 -2.72060258118 # OT - 2239 575 27 0.417 18.0952838827 -10.308540954 -2.72060258118 # HT - 2240 575 27 0.417 16.5813832281 -10.308540954 -2.72060258118 # HT - 2241 576 28 -0.834 17.3383335554 -13.357628393 -0.257397418816 # OT - 2242 576 27 0.417 18.0952838827 -12.7717461164 -0.257397418816 # HT - 2243 576 27 0.417 16.5813832281 -12.7717461164 -0.257397418816 # HT - 2244 577 28 -0.834 14.875128393 -10.8944232307 -0.257397418816 # OT - 2245 577 27 0.417 15.6320787203 -10.308540954 -0.257397418816 # HT - 2246 577 27 0.417 14.1181780658 -10.308540954 -0.257397418816 # HT - 2247 578 28 -0.834 14.875128393 -13.357628393 2.20580774355 # OT - 2248 578 27 0.417 15.6320787203 -12.7717461164 2.20580774355 # HT - 2249 578 27 0.417 14.1181780658 -12.7717461164 2.20580774355 # HT - 2250 579 28 -0.834 17.3383335554 -10.8944232307 2.20580774355 # OT - 2251 579 27 0.417 18.0952838827 -10.308540954 2.20580774355 # HT - 2252 579 27 0.417 16.5813832281 -10.308540954 2.20580774355 # HT - 2253 580 28 -0.834 17.3383335554 -13.357628393 4.66901290592 # OT - 2254 580 27 0.417 18.0952838827 -12.7717461164 4.66901290592 # HT - 2255 580 27 0.417 16.5813832281 -12.7717461164 4.66901290592 # HT - 2256 581 28 -0.834 14.875128393 -10.8944232307 4.66901290592 # OT - 2257 581 27 0.417 15.6320787203 -10.308540954 4.66901290592 # HT - 2258 581 27 0.417 14.1181780658 -10.308540954 4.66901290592 # HT - 2259 582 28 -0.834 14.875128393 -13.357628393 7.13221806829 # OT - 2260 582 27 0.417 15.6320787203 -12.7717461164 7.13221806829 # HT - 2261 582 27 0.417 14.1181780658 -12.7717461164 7.13221806829 # HT - 2262 583 28 -0.834 17.3383335554 -10.8944232307 7.13221806829 # OT - 2263 583 27 0.417 18.0952838827 -10.308540954 7.13221806829 # HT - 2264 583 27 0.417 16.5813832281 -10.308540954 7.13221806829 # HT - 2265 584 28 -0.834 17.3383335554 -13.357628393 9.59542323066 # OT - 2266 584 27 0.417 18.0952838827 -12.7717461164 9.59542323066 # HT - 2267 584 27 0.417 16.5813832281 -12.7717461164 9.59542323066 # HT - 2268 585 28 -0.834 14.875128393 -10.8944232307 9.59542323066 # OT - 2269 585 27 0.417 15.6320787203 -10.308540954 9.59542323066 # HT - 2270 585 27 0.417 14.1181780658 -10.308540954 9.59542323066 # HT - 2271 586 28 -0.834 14.875128393 -8.43121806829 -12.5734232307 # OT - 2272 586 27 0.417 15.6320787203 -7.84533579167 -12.5734232307 # HT - 2273 586 27 0.417 14.1181780658 -7.84533579167 -12.5734232307 # HT - 2274 587 28 -0.834 17.3383335554 -5.96801290592 -12.5734232307 # OT - 2275 587 27 0.417 18.0952838827 -5.3821306293 -12.5734232307 # HT - 2276 587 27 0.417 16.5813832281 -5.3821306293 -12.5734232307 # HT - 2277 588 28 -0.834 17.3383335554 -8.43121806829 -10.1102180683 # OT - 2278 588 27 0.417 18.0952838827 -7.84533579167 -10.1102180683 # HT - 2279 588 27 0.417 16.5813832281 -7.84533579167 -10.1102180683 # HT - 2280 589 28 -0.834 14.875128393 -5.96801290592 -10.1102180683 # OT - 2281 589 27 0.417 15.6320787203 -5.3821306293 -10.1102180683 # HT - 2282 589 27 0.417 14.1181780658 -5.3821306293 -10.1102180683 # HT - 2283 590 28 -0.834 14.875128393 -8.43121806829 -7.64701290592 # OT - 2284 590 27 0.417 15.6320787203 -7.84533579167 -7.64701290592 # HT - 2285 590 27 0.417 14.1181780658 -7.84533579167 -7.64701290592 # HT - 2286 591 28 -0.834 17.3383335554 -5.96801290592 -7.64701290592 # OT - 2287 591 27 0.417 18.0952838827 -5.3821306293 -7.64701290592 # HT - 2288 591 27 0.417 16.5813832281 -5.3821306293 -7.64701290592 # HT - 2289 592 28 -0.834 17.3383335554 -8.43121806829 -5.18380774355 # OT - 2290 592 27 0.417 18.0952838827 -7.84533579167 -5.18380774355 # HT - 2291 592 27 0.417 16.5813832281 -7.84533579167 -5.18380774355 # HT - 2292 593 28 -0.834 14.875128393 -8.43121806829 -2.72060258118 # OT - 2293 593 27 0.417 15.6320787203 -7.84533579167 -2.72060258118 # HT - 2294 593 27 0.417 14.1181780658 -7.84533579167 -2.72060258118 # HT - 2295 594 28 -0.834 17.3383335554 -8.43121806829 -0.257397418816 # OT - 2296 594 27 0.417 18.0952838827 -7.84533579167 -0.257397418816 # HT - 2297 594 27 0.417 16.5813832281 -7.84533579167 -0.257397418816 # HT - 2298 595 28 -0.834 17.3383335554 -8.43121806829 4.66901290592 # OT - 2299 595 27 0.417 18.0952838827 -7.84533579167 4.66901290592 # HT - 2300 595 27 0.417 16.5813832281 -7.84533579167 4.66901290592 # HT - 2301 596 28 -0.834 14.875128393 -8.43121806829 7.13221806829 # OT - 2302 596 27 0.417 15.6320787203 -7.84533579167 7.13221806829 # HT - 2303 596 27 0.417 14.1181780658 -7.84533579167 7.13221806829 # HT - 2304 597 28 -0.834 17.3383335554 -5.96801290592 7.13221806829 # OT - 2305 597 27 0.417 18.0952838827 -5.3821306293 7.13221806829 # HT - 2306 597 27 0.417 16.5813832281 -5.3821306293 7.13221806829 # HT - 2307 598 28 -0.834 17.3383335554 -8.43121806829 9.59542323066 # OT - 2308 598 27 0.417 18.0952838827 -7.84533579167 9.59542323066 # HT - 2309 598 27 0.417 16.5813832281 -7.84533579167 9.59542323066 # HT - 2310 599 28 -0.834 14.875128393 -5.96801290592 9.59542323066 # OT - 2311 599 27 0.417 15.6320787203 -5.3821306293 9.59542323066 # HT - 2312 599 27 0.417 14.1181780658 -5.3821306293 9.59542323066 # HT - 2313 600 28 -0.834 14.875128393 -3.50480774355 -12.5734232307 # OT - 2314 600 27 0.417 15.6320787203 -2.91892546693 -12.5734232307 # HT - 2315 600 27 0.417 14.1181780658 -2.91892546693 -12.5734232307 # HT - 2316 601 28 -0.834 17.3383335554 -1.04160258118 -12.5734232307 # OT - 2317 601 27 0.417 18.0952838827 -0.455720304566 -12.5734232307 # HT - 2318 601 27 0.417 16.5813832281 -0.455720304566 -12.5734232307 # HT - 2319 602 28 -0.834 17.3383335554 -3.50480774355 -10.1102180683 # OT - 2320 602 27 0.417 18.0952838827 -2.91892546693 -10.1102180683 # HT - 2321 602 27 0.417 16.5813832281 -2.91892546693 -10.1102180683 # HT - 2322 603 28 -0.834 14.875128393 -1.04160258118 -10.1102180683 # OT - 2323 603 27 0.417 15.6320787203 -0.455720304566 -10.1102180683 # HT - 2324 603 27 0.417 14.1181780658 -0.455720304566 -10.1102180683 # HT - 2325 604 28 -0.834 14.875128393 -3.50480774355 -7.64701290592 # OT - 2326 604 27 0.417 15.6320787203 -2.91892546693 -7.64701290592 # HT - 2327 604 27 0.417 14.1181780658 -2.91892546693 -7.64701290592 # HT - 2328 605 28 -0.834 17.3383335554 -1.04160258118 -7.64701290592 # OT - 2329 605 27 0.417 18.0952838827 -0.455720304566 -7.64701290592 # HT - 2330 605 27 0.417 16.5813832281 -0.455720304566 -7.64701290592 # HT - 2331 606 28 -0.834 14.875128393 -1.04160258118 -5.18380774355 # OT - 2332 606 27 0.417 15.6320787203 -0.455720304566 -5.18380774355 # HT - 2333 606 27 0.417 14.1181780658 -0.455720304566 -5.18380774355 # HT - 2334 607 28 -0.834 17.3383335554 -1.04160258118 -2.72060258118 # OT - 2335 607 27 0.417 18.0952838827 -0.455720304566 -2.72060258118 # HT - 2336 607 27 0.417 16.5813832281 -0.455720304566 -2.72060258118 # HT - 2337 608 28 -0.834 17.3383335554 -1.04160258118 7.13221806829 # OT - 2338 608 27 0.417 18.0952838827 -0.455720304566 7.13221806829 # HT - 2339 608 27 0.417 16.5813832281 -0.455720304566 7.13221806829 # HT - 2340 609 28 -0.834 17.3383335554 -3.50480774355 9.59542323066 # OT - 2341 609 27 0.417 18.0952838827 -2.91892546693 9.59542323066 # HT - 2342 609 27 0.417 16.5813832281 -2.91892546693 9.59542323066 # HT - 2343 610 28 -0.834 14.875128393 1.42160258118 -12.5734232307 # OT - 2344 610 27 0.417 15.6320787203 2.0074848578 -12.5734232307 # HT - 2345 610 27 0.417 14.1181780658 2.0074848578 -12.5734232307 # HT - 2346 611 28 -0.834 17.3383335554 3.88480774355 -12.5734232307 # OT - 2347 611 27 0.417 18.0952838827 4.47069002017 -12.5734232307 # HT - 2348 611 27 0.417 16.5813832281 4.47069002017 -12.5734232307 # HT - 2349 612 28 -0.834 17.3383335554 1.42160258118 -10.1102180683 # OT - 2350 612 27 0.417 18.0952838827 2.0074848578 -10.1102180683 # HT - 2351 612 27 0.417 16.5813832281 2.0074848578 -10.1102180683 # HT - 2352 613 28 -0.834 14.875128393 3.88480774355 -10.1102180683 # OT - 2353 613 27 0.417 15.6320787203 4.47069002017 -10.1102180683 # HT - 2354 613 27 0.417 14.1181780658 4.47069002017 -10.1102180683 # HT - 2355 614 28 -0.834 14.875128393 1.42160258118 -7.64701290592 # OT - 2356 614 27 0.417 15.6320787203 2.0074848578 -7.64701290592 # HT - 2357 614 27 0.417 14.1181780658 2.0074848578 -7.64701290592 # HT - 2358 615 28 -0.834 17.3383335554 3.88480774355 -7.64701290592 # OT - 2359 615 27 0.417 18.0952838827 4.47069002017 -7.64701290592 # HT - 2360 615 27 0.417 16.5813832281 4.47069002017 -7.64701290592 # HT - 2361 616 28 -0.834 17.3383335554 1.42160258118 -5.18380774355 # OT - 2362 616 27 0.417 18.0952838827 2.0074848578 -5.18380774355 # HT - 2363 616 27 0.417 16.5813832281 2.0074848578 -5.18380774355 # HT - 2364 617 30 1 17.3383335554 3.88480774355 -2.72060258118 # SOD - 2365 618 28 -0.834 17.3383335554 3.88480774355 2.20580774355 # OT - 2366 618 27 0.417 18.0952838827 4.47069002017 2.20580774355 # HT - 2367 618 27 0.417 16.5813832281 4.47069002017 2.20580774355 # HT - 2368 619 28 -0.834 17.3383335554 3.88480774355 7.13221806829 # OT - 2369 619 27 0.417 18.0952838827 4.47069002017 7.13221806829 # HT - 2370 619 27 0.417 16.5813832281 4.47069002017 7.13221806829 # HT - 2371 620 28 -0.834 17.3383335554 1.42160258118 9.59542323066 # OT - 2372 620 27 0.417 18.0952838827 2.0074848578 9.59542323066 # HT - 2373 620 27 0.417 16.5813832281 2.0074848578 9.59542323066 # HT - 2374 621 28 -0.834 14.875128393 3.88480774355 9.59542323066 # OT - 2375 621 27 0.417 15.6320787203 4.47069002017 9.59542323066 # HT - 2376 621 27 0.417 14.1181780658 4.47069002017 9.59542323066 # HT - 2377 622 28 -0.834 14.875128393 6.34801290592 -12.5734232307 # OT - 2378 622 27 0.417 15.6320787203 6.93389518254 -12.5734232307 # HT - 2379 622 27 0.417 14.1181780658 6.93389518254 -12.5734232307 # HT - 2380 623 28 -0.834 17.3383335554 8.81121806829 -12.5734232307 # OT - 2381 623 27 0.417 18.0952838827 9.39710034491 -12.5734232307 # HT - 2382 623 27 0.417 16.5813832281 9.39710034491 -12.5734232307 # HT - 2383 624 28 -0.834 17.3383335554 6.34801290592 -10.1102180683 # OT - 2384 624 27 0.417 18.0952838827 6.93389518254 -10.1102180683 # HT - 2385 624 27 0.417 16.5813832281 6.93389518254 -10.1102180683 # HT - 2386 625 28 -0.834 14.875128393 8.81121806829 -10.1102180683 # OT - 2387 625 27 0.417 15.6320787203 9.39710034491 -10.1102180683 # HT - 2388 625 27 0.417 14.1181780658 9.39710034491 -10.1102180683 # HT - 2389 626 28 -0.834 14.875128393 6.34801290592 -7.64701290592 # OT - 2390 626 27 0.417 15.6320787203 6.93389518254 -7.64701290592 # HT - 2391 626 27 0.417 14.1181780658 6.93389518254 -7.64701290592 # HT - 2392 627 28 -0.834 17.3383335554 8.81121806829 -7.64701290592 # OT - 2393 627 27 0.417 18.0952838827 9.39710034491 -7.64701290592 # HT - 2394 627 27 0.417 16.5813832281 9.39710034491 -7.64701290592 # HT - 2395 628 28 -0.834 17.3383335554 6.34801290592 -5.18380774355 # OT - 2396 628 27 0.417 18.0952838827 6.93389518254 -5.18380774355 # HT - 2397 628 27 0.417 16.5813832281 6.93389518254 -5.18380774355 # HT - 2398 629 28 -0.834 14.875128393 8.81121806829 -5.18380774355 # OT - 2399 629 27 0.417 15.6320787203 9.39710034491 -5.18380774355 # HT - 2400 629 27 0.417 14.1181780658 9.39710034491 -5.18380774355 # HT - 2401 630 28 -0.834 14.875128393 6.34801290592 -2.72060258118 # OT - 2402 630 27 0.417 15.6320787203 6.93389518254 -2.72060258118 # HT - 2403 630 27 0.417 14.1181780658 6.93389518254 -2.72060258118 # HT - 2404 631 28 -0.834 17.3383335554 8.81121806829 -2.72060258118 # OT - 2405 631 27 0.417 18.0952838827 9.39710034491 -2.72060258118 # HT - 2406 631 27 0.417 16.5813832281 9.39710034491 -2.72060258118 # HT - 2407 632 28 -0.834 17.3383335554 6.34801290592 -0.257397418816 # OT - 2408 632 27 0.417 18.0952838827 6.93389518254 -0.257397418816 # HT - 2409 632 27 0.417 16.5813832281 6.93389518254 -0.257397418816 # HT - 2410 633 28 -0.834 14.875128393 8.81121806829 -0.257397418816 # OT - 2411 633 27 0.417 15.6320787203 9.39710034491 -0.257397418816 # HT - 2412 633 27 0.417 14.1181780658 9.39710034491 -0.257397418816 # HT - 2413 634 28 -0.834 17.3383335554 8.81121806829 2.20580774355 # OT - 2414 634 27 0.417 18.0952838827 9.39710034491 2.20580774355 # HT - 2415 634 27 0.417 16.5813832281 9.39710034491 2.20580774355 # HT - 2416 635 28 -0.834 17.3383335554 6.34801290592 4.66901290592 # OT - 2417 635 27 0.417 18.0952838827 6.93389518254 4.66901290592 # HT - 2418 635 27 0.417 16.5813832281 6.93389518254 4.66901290592 # HT - 2419 636 28 -0.834 14.875128393 8.81121806829 4.66901290592 # OT - 2420 636 27 0.417 15.6320787203 9.39710034491 4.66901290592 # HT - 2421 636 27 0.417 14.1181780658 9.39710034491 4.66901290592 # HT - 2422 637 28 -0.834 14.875128393 6.34801290592 7.13221806829 # OT - 2423 637 27 0.417 15.6320787203 6.93389518254 7.13221806829 # HT - 2424 637 27 0.417 14.1181780658 6.93389518254 7.13221806829 # HT - 2425 638 28 -0.834 17.3383335554 8.81121806829 7.13221806829 # OT - 2426 638 27 0.417 18.0952838827 9.39710034491 7.13221806829 # HT - 2427 638 27 0.417 16.5813832281 9.39710034491 7.13221806829 # HT - 2428 639 28 -0.834 17.3383335554 6.34801290592 9.59542323066 # OT - 2429 639 27 0.417 18.0952838827 6.93389518254 9.59542323066 # HT - 2430 639 27 0.417 16.5813832281 6.93389518254 9.59542323066 # HT - 2431 640 28 -0.834 14.875128393 8.81121806829 9.59542323066 # OT - 2432 640 27 0.417 15.6320787203 9.39710034491 9.59542323066 # HT - 2433 640 27 0.417 14.1181780658 9.39710034491 9.59542323066 # HT - 2434 641 28 -0.834 14.875128393 11.2744232307 -12.5734232307 # OT - 2435 641 27 0.417 15.6320787203 11.8603055073 -12.5734232307 # HT - 2436 641 27 0.417 14.1181780658 11.8603055073 -12.5734232307 # HT - 2437 642 28 -0.834 17.3383335554 13.737628393 -12.5734232307 # OT - 2438 642 27 0.417 18.0952838827 14.3235106696 -12.5734232307 # HT - 2439 642 27 0.417 16.5813832281 14.3235106696 -12.5734232307 # HT - 2440 643 28 -0.834 17.3383335554 11.2744232307 -10.1102180683 # OT - 2441 643 27 0.417 18.0952838827 11.8603055073 -10.1102180683 # HT - 2442 643 27 0.417 16.5813832281 11.8603055073 -10.1102180683 # HT - 2443 644 28 -0.834 14.875128393 13.737628393 -10.1102180683 # OT - 2444 644 27 0.417 15.6320787203 14.3235106696 -10.1102180683 # HT - 2445 644 27 0.417 14.1181780658 14.3235106696 -10.1102180683 # HT - 2446 645 28 -0.834 14.875128393 11.2744232307 -7.64701290592 # OT - 2447 645 27 0.417 15.6320787203 11.8603055073 -7.64701290592 # HT - 2448 645 27 0.417 14.1181780658 11.8603055073 -7.64701290592 # HT - 2449 646 28 -0.834 17.3383335554 13.737628393 -7.64701290592 # OT - 2450 646 27 0.417 18.0952838827 14.3235106696 -7.64701290592 # HT - 2451 646 27 0.417 16.5813832281 14.3235106696 -7.64701290592 # HT - 2452 647 28 -0.834 17.3383335554 11.2744232307 -5.18380774355 # OT - 2453 647 27 0.417 18.0952838827 11.8603055073 -5.18380774355 # HT - 2454 647 27 0.417 16.5813832281 11.8603055073 -5.18380774355 # HT - 2455 648 28 -0.834 14.875128393 13.737628393 -5.18380774355 # OT - 2456 648 27 0.417 15.6320787203 14.3235106696 -5.18380774355 # HT - 2457 648 27 0.417 14.1181780658 14.3235106696 -5.18380774355 # HT - 2458 649 28 -0.834 14.875128393 11.2744232307 -2.72060258118 # OT - 2459 649 27 0.417 15.6320787203 11.8603055073 -2.72060258118 # HT - 2460 649 27 0.417 14.1181780658 11.8603055073 -2.72060258118 # HT - 2461 650 28 -0.834 17.3383335554 13.737628393 -2.72060258118 # OT - 2462 650 27 0.417 18.0952838827 14.3235106696 -2.72060258118 # HT - 2463 650 27 0.417 16.5813832281 14.3235106696 -2.72060258118 # HT - 2464 651 28 -0.834 17.3383335554 11.2744232307 -0.257397418816 # OT - 2465 651 27 0.417 18.0952838827 11.8603055073 -0.257397418816 # HT - 2466 651 27 0.417 16.5813832281 11.8603055073 -0.257397418816 # HT - 2467 652 28 -0.834 14.875128393 13.737628393 -0.257397418816 # OT - 2468 652 27 0.417 15.6320787203 14.3235106696 -0.257397418816 # HT - 2469 652 27 0.417 14.1181780658 14.3235106696 -0.257397418816 # HT - 2470 653 28 -0.834 14.875128393 11.2744232307 2.20580774355 # OT - 2471 653 27 0.417 15.6320787203 11.8603055073 2.20580774355 # HT - 2472 653 27 0.417 14.1181780658 11.8603055073 2.20580774355 # HT - 2473 654 28 -0.834 17.3383335554 13.737628393 2.20580774355 # OT - 2474 654 27 0.417 18.0952838827 14.3235106696 2.20580774355 # HT - 2475 654 27 0.417 16.5813832281 14.3235106696 2.20580774355 # HT - 2476 655 28 -0.834 17.3383335554 11.2744232307 4.66901290592 # OT - 2477 655 27 0.417 18.0952838827 11.8603055073 4.66901290592 # HT - 2478 655 27 0.417 16.5813832281 11.8603055073 4.66901290592 # HT - 2479 656 28 -0.834 14.875128393 13.737628393 4.66901290592 # OT - 2480 656 27 0.417 15.6320787203 14.3235106696 4.66901290592 # HT - 2481 656 27 0.417 14.1181780658 14.3235106696 4.66901290592 # HT - 2482 657 28 -0.834 14.875128393 11.2744232307 7.13221806829 # OT - 2483 657 27 0.417 15.6320787203 11.8603055073 7.13221806829 # HT - 2484 657 27 0.417 14.1181780658 11.8603055073 7.13221806829 # HT - 2485 658 28 -0.834 17.3383335554 13.737628393 7.13221806829 # OT - 2486 658 27 0.417 18.0952838827 14.3235106696 7.13221806829 # HT - 2487 658 27 0.417 16.5813832281 14.3235106696 7.13221806829 # HT - 2488 659 28 -0.834 17.3383335554 11.2744232307 9.59542323066 # OT - 2489 659 27 0.417 18.0952838827 11.8603055073 9.59542323066 # HT - 2490 659 27 0.417 16.5813832281 11.8603055073 9.59542323066 # HT - 2491 660 28 -0.834 14.875128393 13.737628393 9.59542323066 # OT - 2492 660 27 0.417 15.6320787203 14.3235106696 9.59542323066 # HT - 2493 660 27 0.417 14.1181780658 14.3235106696 9.59542323066 # HT - 2494 661 28 -0.834 19.8015387178 -13.357628393 -12.5734232307 # OT - 2495 661 27 0.417 20.558489045 -12.7717461164 -12.5734232307 # HT - 2496 661 27 0.417 19.0445883905 -12.7717461164 -12.5734232307 # HT - 2497 662 30 1 22.2647438801 -10.8944232307 -12.5734232307 # SOD + 886 123 30 1 -17.1465387178 -13.357628393 -0.257397418816 # SOD + 887 124 28 -0.834 -19.6097438801 -10.8944232307 -0.257397418816 # OT + 888 124 27 0.417 -18.8527935529 -10.308540954 -0.257397418816 # HT + 889 124 27 0.417 -20.3666942074 -10.308540954 -0.257397418816 # HT + 890 125 28 -0.834 -19.6097438801 -13.357628393 2.20580774355 # OT + 891 125 27 0.417 -18.8527935529 -12.7717461164 2.20580774355 # HT + 892 125 27 0.417 -20.3666942074 -12.7717461164 2.20580774355 # HT + 893 126 28 -0.834 -17.1465387178 -10.8944232307 2.20580774355 # OT + 894 126 27 0.417 -16.3895883905 -10.308540954 2.20580774355 # HT + 895 126 27 0.417 -17.903489045 -10.308540954 2.20580774355 # HT + 896 127 28 -0.834 -17.1465387178 -13.357628393 4.66901290592 # OT + 897 127 27 0.417 -16.3895883905 -12.7717461164 4.66901290592 # HT + 898 127 27 0.417 -17.903489045 -12.7717461164 4.66901290592 # HT + 899 128 28 -0.834 -19.6097438801 -10.8944232307 4.66901290592 # OT + 900 128 27 0.417 -18.8527935529 -10.308540954 4.66901290592 # HT + 901 128 27 0.417 -20.3666942074 -10.308540954 4.66901290592 # HT + 902 129 28 -0.834 -19.6097438801 -13.357628393 7.13221806829 # OT + 903 129 27 0.417 -18.8527935529 -12.7717461164 7.13221806829 # HT + 904 129 27 0.417 -20.3666942074 -12.7717461164 7.13221806829 # HT + 905 130 28 -0.834 -17.1465387178 -10.8944232307 7.13221806829 # OT + 906 130 27 0.417 -16.3895883905 -10.308540954 7.13221806829 # HT + 907 130 27 0.417 -17.903489045 -10.308540954 7.13221806829 # HT + 908 131 28 -0.834 -17.1465387178 -13.357628393 9.59542323066 # OT + 909 131 27 0.417 -16.3895883905 -12.7717461164 9.59542323066 # HT + 910 131 27 0.417 -17.903489045 -12.7717461164 9.59542323066 # HT + 911 132 28 -0.834 -19.6097438801 -10.8944232307 9.59542323066 # OT + 912 132 27 0.417 -18.8527935529 -10.308540954 9.59542323066 # HT + 913 132 27 0.417 -20.3666942074 -10.308540954 9.59542323066 # HT + 914 133 28 -0.834 -19.6097438801 -8.43121806829 -12.5734232307 # OT + 915 133 27 0.417 -18.8527935529 -7.84533579167 -12.5734232307 # HT + 916 133 27 0.417 -20.3666942074 -7.84533579167 -12.5734232307 # HT + 917 134 28 -0.834 -17.1465387178 -5.96801290592 -12.5734232307 # OT + 918 134 27 0.417 -16.3895883905 -5.3821306293 -12.5734232307 # HT + 919 134 27 0.417 -17.903489045 -5.3821306293 -12.5734232307 # HT + 920 135 28 -0.834 -17.1465387178 -8.43121806829 -10.1102180683 # OT + 921 135 27 0.417 -16.3895883905 -7.84533579167 -10.1102180683 # HT + 922 135 27 0.417 -17.903489045 -7.84533579167 -10.1102180683 # HT + 923 136 28 -0.834 -19.6097438801 -5.96801290592 -10.1102180683 # OT + 924 136 27 0.417 -18.8527935529 -5.3821306293 -10.1102180683 # HT + 925 136 27 0.417 -20.3666942074 -5.3821306293 -10.1102180683 # HT + 926 137 28 -0.834 -19.6097438801 -8.43121806829 -7.64701290592 # OT + 927 137 27 0.417 -18.8527935529 -7.84533579167 -7.64701290592 # HT + 928 137 27 0.417 -20.3666942074 -7.84533579167 -7.64701290592 # HT + 929 138 28 -0.834 -17.1465387178 -5.96801290592 -7.64701290592 # OT + 930 138 27 0.417 -16.3895883905 -5.3821306293 -7.64701290592 # HT + 931 138 27 0.417 -17.903489045 -5.3821306293 -7.64701290592 # HT + 932 139 28 -0.834 -17.1465387178 -8.43121806829 -5.18380774355 # OT + 933 139 27 0.417 -16.3895883905 -7.84533579167 -5.18380774355 # HT + 934 139 27 0.417 -17.903489045 -7.84533579167 -5.18380774355 # HT + 935 140 28 -0.834 -19.6097438801 -5.96801290592 -5.18380774355 # OT + 936 140 27 0.417 -18.8527935529 -5.3821306293 -5.18380774355 # HT + 937 140 27 0.417 -20.3666942074 -5.3821306293 -5.18380774355 # HT + 938 141 28 -0.834 -19.6097438801 -8.43121806829 -2.72060258118 # OT + 939 141 27 0.417 -18.8527935529 -7.84533579167 -2.72060258118 # HT + 940 141 27 0.417 -20.3666942074 -7.84533579167 -2.72060258118 # HT + 941 142 28 -0.834 -17.1465387178 -5.96801290592 -2.72060258118 # OT + 942 142 27 0.417 -16.3895883905 -5.3821306293 -2.72060258118 # HT + 943 142 27 0.417 -17.903489045 -5.3821306293 -2.72060258118 # HT + 944 143 28 -0.834 -17.1465387178 -8.43121806829 -0.257397418816 # OT + 945 143 27 0.417 -16.3895883905 -7.84533579167 -0.257397418816 # HT + 946 143 27 0.417 -17.903489045 -7.84533579167 -0.257397418816 # HT + 947 144 28 -0.834 -19.6097438801 -5.96801290592 -0.257397418816 # OT + 948 144 27 0.417 -18.8527935529 -5.3821306293 -0.257397418816 # HT + 949 144 27 0.417 -20.3666942074 -5.3821306293 -0.257397418816 # HT + 950 145 28 -0.834 -19.6097438801 -8.43121806829 2.20580774355 # OT + 951 145 27 0.417 -18.8527935529 -7.84533579167 2.20580774355 # HT + 952 145 27 0.417 -20.3666942074 -7.84533579167 2.20580774355 # HT + 953 146 28 -0.834 -17.1465387178 -5.96801290592 2.20580774355 # OT + 954 146 27 0.417 -16.3895883905 -5.3821306293 2.20580774355 # HT + 955 146 27 0.417 -17.903489045 -5.3821306293 2.20580774355 # HT + 956 147 28 -0.834 -17.1465387178 -8.43121806829 4.66901290592 # OT + 957 147 27 0.417 -16.3895883905 -7.84533579167 4.66901290592 # HT + 958 147 27 0.417 -17.903489045 -7.84533579167 4.66901290592 # HT + 959 148 28 -0.834 -19.6097438801 -5.96801290592 4.66901290592 # OT + 960 148 27 0.417 -18.8527935529 -5.3821306293 4.66901290592 # HT + 961 148 27 0.417 -20.3666942074 -5.3821306293 4.66901290592 # HT + 962 149 28 -0.834 -19.6097438801 -8.43121806829 7.13221806829 # OT + 963 149 27 0.417 -18.8527935529 -7.84533579167 7.13221806829 # HT + 964 149 27 0.417 -20.3666942074 -7.84533579167 7.13221806829 # HT + 965 150 28 -0.834 -17.1465387178 -5.96801290592 7.13221806829 # OT + 966 150 27 0.417 -16.3895883905 -5.3821306293 7.13221806829 # HT + 967 150 27 0.417 -17.903489045 -5.3821306293 7.13221806829 # HT + 968 151 28 -0.834 -17.1465387178 -8.43121806829 9.59542323066 # OT + 969 151 27 0.417 -16.3895883905 -7.84533579167 9.59542323066 # HT + 970 151 27 0.417 -17.903489045 -7.84533579167 9.59542323066 # HT + 971 152 28 -0.834 -19.6097438801 -5.96801290592 9.59542323066 # OT + 972 152 27 0.417 -18.8527935529 -5.3821306293 9.59542323066 # HT + 973 152 27 0.417 -20.3666942074 -5.3821306293 9.59542323066 # HT + 974 153 28 -0.834 -19.6097438801 -3.50480774355 -12.5734232307 # OT + 975 153 27 0.417 -18.8527935529 -2.91892546693 -12.5734232307 # HT + 976 153 27 0.417 -20.3666942074 -2.91892546693 -12.5734232307 # HT + 977 154 28 -0.834 -17.1465387178 -1.04160258118 -12.5734232307 # OT + 978 154 27 0.417 -16.3895883905 -0.455720304566 -12.5734232307 # HT + 979 154 27 0.417 -17.903489045 -0.455720304566 -12.5734232307 # HT + 980 155 28 -0.834 -17.1465387178 -3.50480774355 -10.1102180683 # OT + 981 155 27 0.417 -16.3895883905 -2.91892546693 -10.1102180683 # HT + 982 155 27 0.417 -17.903489045 -2.91892546693 -10.1102180683 # HT + 983 156 28 -0.834 -19.6097438801 -1.04160258118 -10.1102180683 # OT + 984 156 27 0.417 -18.8527935529 -0.455720304566 -10.1102180683 # HT + 985 156 27 0.417 -20.3666942074 -0.455720304566 -10.1102180683 # HT + 986 157 28 -0.834 -19.6097438801 -3.50480774355 -7.64701290592 # OT + 987 157 27 0.417 -18.8527935529 -2.91892546693 -7.64701290592 # HT + 988 157 27 0.417 -20.3666942074 -2.91892546693 -7.64701290592 # HT + 989 158 28 -0.834 -17.1465387178 -1.04160258118 -7.64701290592 # OT + 990 158 27 0.417 -16.3895883905 -0.455720304566 -7.64701290592 # HT + 991 158 27 0.417 -17.903489045 -0.455720304566 -7.64701290592 # HT + 992 159 28 -0.834 -17.1465387178 -3.50480774355 -5.18380774355 # OT + 993 159 27 0.417 -16.3895883905 -2.91892546693 -5.18380774355 # HT + 994 159 27 0.417 -17.903489045 -2.91892546693 -5.18380774355 # HT + 995 160 30 1 -19.6097438801 -1.04160258118 -5.18380774355 # SOD + 996 161 28 -0.834 -19.6097438801 -3.50480774355 -2.72060258118 # OT + 997 161 27 0.417 -18.8527935529 -2.91892546693 -2.72060258118 # HT + 998 161 27 0.417 -20.3666942074 -2.91892546693 -2.72060258118 # HT + 999 162 28 -0.834 -17.1465387178 -1.04160258118 -2.72060258118 # OT + 1000 162 27 0.417 -16.3895883905 -0.455720304566 -2.72060258118 # HT + 1001 162 27 0.417 -17.903489045 -0.455720304566 -2.72060258118 # HT + 1002 163 28 -0.834 -17.1465387178 -3.50480774355 -0.257397418816 # OT + 1003 163 27 0.417 -16.3895883905 -2.91892546693 -0.257397418816 # HT + 1004 163 27 0.417 -17.903489045 -2.91892546693 -0.257397418816 # HT + 1005 164 28 -0.834 -19.6097438801 -3.50480774355 2.20580774355 # OT + 1006 164 27 0.417 -18.8527935529 -2.91892546693 2.20580774355 # HT + 1007 164 27 0.417 -20.3666942074 -2.91892546693 2.20580774355 # HT + 1008 165 28 -0.834 -17.1465387178 -3.50480774355 4.66901290592 # OT + 1009 165 27 0.417 -16.3895883905 -2.91892546693 4.66901290592 # HT + 1010 165 27 0.417 -17.903489045 -2.91892546693 4.66901290592 # HT + 1011 166 28 -0.834 -19.6097438801 -1.04160258118 4.66901290592 # OT + 1012 166 27 0.417 -18.8527935529 -0.455720304566 4.66901290592 # HT + 1013 166 27 0.417 -20.3666942074 -0.455720304566 4.66901290592 # HT + 1014 167 28 -0.834 -19.6097438801 -3.50480774355 7.13221806829 # OT + 1015 167 27 0.417 -18.8527935529 -2.91892546693 7.13221806829 # HT + 1016 167 27 0.417 -20.3666942074 -2.91892546693 7.13221806829 # HT + 1017 168 28 -0.834 -17.1465387178 -1.04160258118 7.13221806829 # OT + 1018 168 27 0.417 -16.3895883905 -0.455720304566 7.13221806829 # HT + 1019 168 27 0.417 -17.903489045 -0.455720304566 7.13221806829 # HT + 1020 169 28 -0.834 -17.1465387178 -3.50480774355 9.59542323066 # OT + 1021 169 27 0.417 -16.3895883905 -2.91892546693 9.59542323066 # HT + 1022 169 27 0.417 -17.903489045 -2.91892546693 9.59542323066 # HT + 1023 170 28 -0.834 -19.6097438801 -1.04160258118 9.59542323066 # OT + 1024 170 27 0.417 -18.8527935529 -0.455720304566 9.59542323066 # HT + 1025 170 27 0.417 -20.3666942074 -0.455720304566 9.59542323066 # HT + 1026 171 28 -0.834 -19.6097438801 1.42160258118 -12.5734232307 # OT + 1027 171 27 0.417 -18.8527935529 2.0074848578 -12.5734232307 # HT + 1028 171 27 0.417 -20.3666942074 2.0074848578 -12.5734232307 # HT + 1029 172 28 -0.834 -17.1465387178 3.88480774355 -12.5734232307 # OT + 1030 172 27 0.417 -16.3895883905 4.47069002017 -12.5734232307 # HT + 1031 172 27 0.417 -17.903489045 4.47069002017 -12.5734232307 # HT + 1032 173 28 -0.834 -17.1465387178 1.42160258118 -10.1102180683 # OT + 1033 173 27 0.417 -16.3895883905 2.0074848578 -10.1102180683 # HT + 1034 173 27 0.417 -17.903489045 2.0074848578 -10.1102180683 # HT + 1035 174 28 -0.834 -19.6097438801 3.88480774355 -10.1102180683 # OT + 1036 174 27 0.417 -18.8527935529 4.47069002017 -10.1102180683 # HT + 1037 174 27 0.417 -20.3666942074 4.47069002017 -10.1102180683 # HT + 1038 175 28 -0.834 -19.6097438801 1.42160258118 -7.64701290592 # OT + 1039 175 27 0.417 -18.8527935529 2.0074848578 -7.64701290592 # HT + 1040 175 27 0.417 -20.3666942074 2.0074848578 -7.64701290592 # HT + 1041 176 28 -0.834 -17.1465387178 3.88480774355 -7.64701290592 # OT + 1042 176 27 0.417 -16.3895883905 4.47069002017 -7.64701290592 # HT + 1043 176 27 0.417 -17.903489045 4.47069002017 -7.64701290592 # HT + 1044 177 28 -0.834 -17.1465387178 1.42160258118 -5.18380774355 # OT + 1045 177 27 0.417 -16.3895883905 2.0074848578 -5.18380774355 # HT + 1046 177 27 0.417 -17.903489045 2.0074848578 -5.18380774355 # HT + 1047 178 28 -0.834 -19.6097438801 3.88480774355 -5.18380774355 # OT + 1048 178 27 0.417 -18.8527935529 4.47069002017 -5.18380774355 # HT + 1049 178 27 0.417 -20.3666942074 4.47069002017 -5.18380774355 # HT + 1050 179 28 -0.834 -19.6097438801 1.42160258118 -2.72060258118 # OT + 1051 179 27 0.417 -18.8527935529 2.0074848578 -2.72060258118 # HT + 1052 179 27 0.417 -20.3666942074 2.0074848578 -2.72060258118 # HT + 1053 180 28 -0.834 -17.1465387178 3.88480774355 -2.72060258118 # OT + 1054 180 27 0.417 -16.3895883905 4.47069002017 -2.72060258118 # HT + 1055 180 27 0.417 -17.903489045 4.47069002017 -2.72060258118 # HT + 1056 181 28 -0.834 -19.6097438801 3.88480774355 -0.257397418816 # OT + 1057 181 27 0.417 -18.8527935529 4.47069002017 -0.257397418816 # HT + 1058 181 27 0.417 -20.3666942074 4.47069002017 -0.257397418816 # HT + 1059 182 28 -0.834 -17.1465387178 3.88480774355 2.20580774355 # OT + 1060 182 27 0.417 -16.3895883905 4.47069002017 2.20580774355 # HT + 1061 182 27 0.417 -17.903489045 4.47069002017 2.20580774355 # HT + 1062 183 28 -0.834 -17.1465387178 1.42160258118 4.66901290592 # OT + 1063 183 27 0.417 -16.3895883905 2.0074848578 4.66901290592 # HT + 1064 183 27 0.417 -17.903489045 2.0074848578 4.66901290592 # HT + 1065 184 28 -0.834 -19.6097438801 3.88480774355 4.66901290592 # OT + 1066 184 27 0.417 -18.8527935529 4.47069002017 4.66901290592 # HT + 1067 184 27 0.417 -20.3666942074 4.47069002017 4.66901290592 # HT + 1068 185 28 -0.834 -19.6097438801 1.42160258118 7.13221806829 # OT + 1069 185 27 0.417 -18.8527935529 2.0074848578 7.13221806829 # HT + 1070 185 27 0.417 -20.3666942074 2.0074848578 7.13221806829 # HT + 1071 186 28 -0.834 -17.1465387178 3.88480774355 7.13221806829 # OT + 1072 186 27 0.417 -16.3895883905 4.47069002017 7.13221806829 # HT + 1073 186 27 0.417 -17.903489045 4.47069002017 7.13221806829 # HT + 1074 187 28 -0.834 -17.1465387178 1.42160258118 9.59542323066 # OT + 1075 187 27 0.417 -16.3895883905 2.0074848578 9.59542323066 # HT + 1076 187 27 0.417 -17.903489045 2.0074848578 9.59542323066 # HT + 1077 188 28 -0.834 -19.6097438801 3.88480774355 9.59542323066 # OT + 1078 188 27 0.417 -18.8527935529 4.47069002017 9.59542323066 # HT + 1079 188 27 0.417 -20.3666942074 4.47069002017 9.59542323066 # HT + 1080 189 28 -0.834 -19.6097438801 6.34801290592 -12.5734232307 # OT + 1081 189 27 0.417 -18.8527935529 6.93389518254 -12.5734232307 # HT + 1082 189 27 0.417 -20.3666942074 6.93389518254 -12.5734232307 # HT + 1083 190 28 -0.834 -17.1465387178 8.81121806829 -12.5734232307 # OT + 1084 190 27 0.417 -16.3895883905 9.39710034491 -12.5734232307 # HT + 1085 190 27 0.417 -17.903489045 9.39710034491 -12.5734232307 # HT + 1086 191 28 -0.834 -17.1465387178 6.34801290592 -10.1102180683 # OT + 1087 191 27 0.417 -16.3895883905 6.93389518254 -10.1102180683 # HT + 1088 191 27 0.417 -17.903489045 6.93389518254 -10.1102180683 # HT + 1089 192 28 -0.834 -19.6097438801 8.81121806829 -10.1102180683 # OT + 1090 192 27 0.417 -18.8527935529 9.39710034491 -10.1102180683 # HT + 1091 192 27 0.417 -20.3666942074 9.39710034491 -10.1102180683 # HT + 1092 193 28 -0.834 -19.6097438801 6.34801290592 -7.64701290592 # OT + 1093 193 27 0.417 -18.8527935529 6.93389518254 -7.64701290592 # HT + 1094 193 27 0.417 -20.3666942074 6.93389518254 -7.64701290592 # HT + 1095 194 28 -0.834 -17.1465387178 8.81121806829 -7.64701290592 # OT + 1096 194 27 0.417 -16.3895883905 9.39710034491 -7.64701290592 # HT + 1097 194 27 0.417 -17.903489045 9.39710034491 -7.64701290592 # HT + 1098 195 28 -0.834 -17.1465387178 6.34801290592 -5.18380774355 # OT + 1099 195 27 0.417 -16.3895883905 6.93389518254 -5.18380774355 # HT + 1100 195 27 0.417 -17.903489045 6.93389518254 -5.18380774355 # HT + 1101 196 28 -0.834 -19.6097438801 8.81121806829 -5.18380774355 # OT + 1102 196 27 0.417 -18.8527935529 9.39710034491 -5.18380774355 # HT + 1103 196 27 0.417 -20.3666942074 9.39710034491 -5.18380774355 # HT + 1104 197 28 -0.834 -19.6097438801 6.34801290592 -2.72060258118 # OT + 1105 197 27 0.417 -18.8527935529 6.93389518254 -2.72060258118 # HT + 1106 197 27 0.417 -20.3666942074 6.93389518254 -2.72060258118 # HT + 1107 198 28 -0.834 -19.6097438801 8.81121806829 -0.257397418816 # OT + 1108 198 27 0.417 -18.8527935529 9.39710034491 -0.257397418816 # HT + 1109 198 27 0.417 -20.3666942074 9.39710034491 -0.257397418816 # HT + 1110 199 28 -0.834 -19.6097438801 6.34801290592 2.20580774355 # OT + 1111 199 27 0.417 -18.8527935529 6.93389518254 2.20580774355 # HT + 1112 199 27 0.417 -20.3666942074 6.93389518254 2.20580774355 # HT + 1113 200 28 -0.834 -17.1465387178 8.81121806829 2.20580774355 # OT + 1114 200 27 0.417 -16.3895883905 9.39710034491 2.20580774355 # HT + 1115 200 27 0.417 -17.903489045 9.39710034491 2.20580774355 # HT + 1116 201 28 -0.834 -17.1465387178 6.34801290592 4.66901290592 # OT + 1117 201 27 0.417 -16.3895883905 6.93389518254 4.66901290592 # HT + 1118 201 27 0.417 -17.903489045 6.93389518254 4.66901290592 # HT + 1119 202 28 -0.834 -19.6097438801 8.81121806829 4.66901290592 # OT + 1120 202 27 0.417 -18.8527935529 9.39710034491 4.66901290592 # HT + 1121 202 27 0.417 -20.3666942074 9.39710034491 4.66901290592 # HT + 1122 203 28 -0.834 -19.6097438801 6.34801290592 7.13221806829 # OT + 1123 203 27 0.417 -18.8527935529 6.93389518254 7.13221806829 # HT + 1124 203 27 0.417 -20.3666942074 6.93389518254 7.13221806829 # HT + 1125 204 28 -0.834 -17.1465387178 8.81121806829 7.13221806829 # OT + 1126 204 27 0.417 -16.3895883905 9.39710034491 7.13221806829 # HT + 1127 204 27 0.417 -17.903489045 9.39710034491 7.13221806829 # HT + 1128 205 28 -0.834 -17.1465387178 6.34801290592 9.59542323066 # OT + 1129 205 27 0.417 -16.3895883905 6.93389518254 9.59542323066 # HT + 1130 205 27 0.417 -17.903489045 6.93389518254 9.59542323066 # HT + 1131 206 28 -0.834 -19.6097438801 8.81121806829 9.59542323066 # OT + 1132 206 27 0.417 -18.8527935529 9.39710034491 9.59542323066 # HT + 1133 206 27 0.417 -20.3666942074 9.39710034491 9.59542323066 # HT + 1134 207 28 -0.834 -19.6097438801 11.2744232307 -12.5734232307 # OT + 1135 207 27 0.417 -18.8527935529 11.8603055073 -12.5734232307 # HT + 1136 207 27 0.417 -20.3666942074 11.8603055073 -12.5734232307 # HT + 1137 208 28 -0.834 -17.1465387178 13.737628393 -12.5734232307 # OT + 1138 208 27 0.417 -16.3895883905 14.3235106696 -12.5734232307 # HT + 1139 208 27 0.417 -17.903489045 14.3235106696 -12.5734232307 # HT + 1140 209 28 -0.834 -17.1465387178 11.2744232307 -10.1102180683 # OT + 1141 209 27 0.417 -16.3895883905 11.8603055073 -10.1102180683 # HT + 1142 209 27 0.417 -17.903489045 11.8603055073 -10.1102180683 # HT + 1143 210 28 -0.834 -19.6097438801 13.737628393 -10.1102180683 # OT + 1144 210 27 0.417 -18.8527935529 14.3235106696 -10.1102180683 # HT + 1145 210 27 0.417 -20.3666942074 14.3235106696 -10.1102180683 # HT + 1146 211 28 -0.834 -19.6097438801 11.2744232307 -7.64701290592 # OT + 1147 211 27 0.417 -18.8527935529 11.8603055073 -7.64701290592 # HT + 1148 211 27 0.417 -20.3666942074 11.8603055073 -7.64701290592 # HT + 1149 212 28 -0.834 -17.1465387178 13.737628393 -7.64701290592 # OT + 1150 212 27 0.417 -16.3895883905 14.3235106696 -7.64701290592 # HT + 1151 212 27 0.417 -17.903489045 14.3235106696 -7.64701290592 # HT + 1152 213 28 -0.834 -17.1465387178 11.2744232307 -5.18380774355 # OT + 1153 213 27 0.417 -16.3895883905 11.8603055073 -5.18380774355 # HT + 1154 213 27 0.417 -17.903489045 11.8603055073 -5.18380774355 # HT + 1155 214 28 -0.834 -19.6097438801 13.737628393 -5.18380774355 # OT + 1156 214 27 0.417 -18.8527935529 14.3235106696 -5.18380774355 # HT + 1157 214 27 0.417 -20.3666942074 14.3235106696 -5.18380774355 # HT + 1158 215 28 -0.834 -19.6097438801 11.2744232307 -2.72060258118 # OT + 1159 215 27 0.417 -18.8527935529 11.8603055073 -2.72060258118 # HT + 1160 215 27 0.417 -20.3666942074 11.8603055073 -2.72060258118 # HT + 1161 216 28 -0.834 -17.1465387178 13.737628393 -2.72060258118 # OT + 1162 216 27 0.417 -16.3895883905 14.3235106696 -2.72060258118 # HT + 1163 216 27 0.417 -17.903489045 14.3235106696 -2.72060258118 # HT + 1164 217 28 -0.834 -17.1465387178 11.2744232307 -0.257397418816 # OT + 1165 217 27 0.417 -16.3895883905 11.8603055073 -0.257397418816 # HT + 1166 217 27 0.417 -17.903489045 11.8603055073 -0.257397418816 # HT + 1167 218 28 -0.834 -19.6097438801 13.737628393 -0.257397418816 # OT + 1168 218 27 0.417 -18.8527935529 14.3235106696 -0.257397418816 # HT + 1169 218 27 0.417 -20.3666942074 14.3235106696 -0.257397418816 # HT + 1170 219 28 -0.834 -19.6097438801 11.2744232307 2.20580774355 # OT + 1171 219 27 0.417 -18.8527935529 11.8603055073 2.20580774355 # HT + 1172 219 27 0.417 -20.3666942074 11.8603055073 2.20580774355 # HT + 1173 220 28 -0.834 -17.1465387178 13.737628393 2.20580774355 # OT + 1174 220 27 0.417 -16.3895883905 14.3235106696 2.20580774355 # HT + 1175 220 27 0.417 -17.903489045 14.3235106696 2.20580774355 # HT + 1176 221 28 -0.834 -17.1465387178 11.2744232307 4.66901290592 # OT + 1177 221 27 0.417 -16.3895883905 11.8603055073 4.66901290592 # HT + 1178 221 27 0.417 -17.903489045 11.8603055073 4.66901290592 # HT + 1179 222 28 -0.834 -19.6097438801 13.737628393 4.66901290592 # OT + 1180 222 27 0.417 -18.8527935529 14.3235106696 4.66901290592 # HT + 1181 222 27 0.417 -20.3666942074 14.3235106696 4.66901290592 # HT + 1182 223 28 -0.834 -19.6097438801 11.2744232307 7.13221806829 # OT + 1183 223 27 0.417 -18.8527935529 11.8603055073 7.13221806829 # HT + 1184 223 27 0.417 -20.3666942074 11.8603055073 7.13221806829 # HT + 1185 224 28 -0.834 -17.1465387178 13.737628393 7.13221806829 # OT + 1186 224 27 0.417 -16.3895883905 14.3235106696 7.13221806829 # HT + 1187 224 27 0.417 -17.903489045 14.3235106696 7.13221806829 # HT + 1188 225 28 -0.834 -17.1465387178 11.2744232307 9.59542323066 # OT + 1189 225 27 0.417 -16.3895883905 11.8603055073 9.59542323066 # HT + 1190 225 27 0.417 -17.903489045 11.8603055073 9.59542323066 # HT + 1191 226 28 -0.834 -19.6097438801 13.737628393 9.59542323066 # OT + 1192 226 27 0.417 -18.8527935529 14.3235106696 9.59542323066 # HT + 1193 226 27 0.417 -20.3666942074 14.3235106696 9.59542323066 # HT + 1194 227 28 -0.834 -14.6833335554 -13.357628393 -12.5734232307 # OT + 1195 227 27 0.417 -13.9263832281 -12.7717461164 -12.5734232307 # HT + 1196 227 27 0.417 -15.4402838827 -12.7717461164 -12.5734232307 # HT + 1197 228 28 -0.834 -12.220128393 -10.8944232307 -12.5734232307 # OT + 1198 228 27 0.417 -11.4631780658 -10.308540954 -12.5734232307 # HT + 1199 228 27 0.417 -12.9770787203 -10.308540954 -12.5734232307 # HT + 1200 229 28 -0.834 -12.220128393 -13.357628393 -10.1102180683 # OT + 1201 229 27 0.417 -11.4631780658 -12.7717461164 -10.1102180683 # HT + 1202 229 27 0.417 -12.9770787203 -12.7717461164 -10.1102180683 # HT + 1203 230 28 -0.834 -14.6833335554 -10.8944232307 -10.1102180683 # OT + 1204 230 27 0.417 -13.9263832281 -10.308540954 -10.1102180683 # HT + 1205 230 27 0.417 -15.4402838827 -10.308540954 -10.1102180683 # HT + 1206 231 28 -0.834 -14.6833335554 -13.357628393 -7.64701290592 # OT + 1207 231 27 0.417 -13.9263832281 -12.7717461164 -7.64701290592 # HT + 1208 231 27 0.417 -15.4402838827 -12.7717461164 -7.64701290592 # HT + 1209 232 28 -0.834 -12.220128393 -10.8944232307 -7.64701290592 # OT + 1210 232 27 0.417 -11.4631780658 -10.308540954 -7.64701290592 # HT + 1211 232 27 0.417 -12.9770787203 -10.308540954 -7.64701290592 # HT + 1212 233 28 -0.834 -12.220128393 -13.357628393 -5.18380774355 # OT + 1213 233 27 0.417 -11.4631780658 -12.7717461164 -5.18380774355 # HT + 1214 233 27 0.417 -12.9770787203 -12.7717461164 -5.18380774355 # HT + 1215 234 28 -0.834 -14.6833335554 -10.8944232307 -5.18380774355 # OT + 1216 234 27 0.417 -13.9263832281 -10.308540954 -5.18380774355 # HT + 1217 234 27 0.417 -15.4402838827 -10.308540954 -5.18380774355 # HT + 1218 235 28 -0.834 -14.6833335554 -13.357628393 -2.72060258118 # OT + 1219 235 27 0.417 -13.9263832281 -12.7717461164 -2.72060258118 # HT + 1220 235 27 0.417 -15.4402838827 -12.7717461164 -2.72060258118 # HT + 1221 236 28 -0.834 -14.6833335554 -10.8944232307 -0.257397418816 # OT + 1222 236 27 0.417 -13.9263832281 -10.308540954 -0.257397418816 # HT + 1223 236 27 0.417 -15.4402838827 -10.308540954 -0.257397418816 # HT + 1224 237 28 -0.834 -14.6833335554 -13.357628393 2.20580774355 # OT + 1225 237 27 0.417 -13.9263832281 -12.7717461164 2.20580774355 # HT + 1226 237 27 0.417 -15.4402838827 -12.7717461164 2.20580774355 # HT + 1227 238 28 -0.834 -12.220128393 -13.357628393 4.66901290592 # OT + 1228 238 27 0.417 -11.4631780658 -12.7717461164 4.66901290592 # HT + 1229 238 27 0.417 -12.9770787203 -12.7717461164 4.66901290592 # HT + 1230 239 28 -0.834 -14.6833335554 -10.8944232307 4.66901290592 # OT + 1231 239 27 0.417 -13.9263832281 -10.308540954 4.66901290592 # HT + 1232 239 27 0.417 -15.4402838827 -10.308540954 4.66901290592 # HT + 1233 240 28 -0.834 -14.6833335554 -13.357628393 7.13221806829 # OT + 1234 240 27 0.417 -13.9263832281 -12.7717461164 7.13221806829 # HT + 1235 240 27 0.417 -15.4402838827 -12.7717461164 7.13221806829 # HT + 1236 241 28 -0.834 -12.220128393 -10.8944232307 7.13221806829 # OT + 1237 241 27 0.417 -11.4631780658 -10.308540954 7.13221806829 # HT + 1238 241 27 0.417 -12.9770787203 -10.308540954 7.13221806829 # HT + 1239 242 28 -0.834 -12.220128393 -13.357628393 9.59542323066 # OT + 1240 242 27 0.417 -11.4631780658 -12.7717461164 9.59542323066 # HT + 1241 242 27 0.417 -12.9770787203 -12.7717461164 9.59542323066 # HT + 1242 243 28 -0.834 -14.6833335554 -10.8944232307 9.59542323066 # OT + 1243 243 27 0.417 -13.9263832281 -10.308540954 9.59542323066 # HT + 1244 243 27 0.417 -15.4402838827 -10.308540954 9.59542323066 # HT + 1245 244 28 -0.834 -14.6833335554 -8.43121806829 -12.5734232307 # OT + 1246 244 27 0.417 -13.9263832281 -7.84533579167 -12.5734232307 # HT + 1247 244 27 0.417 -15.4402838827 -7.84533579167 -12.5734232307 # HT + 1248 245 28 -0.834 -12.220128393 -5.96801290592 -12.5734232307 # OT + 1249 245 27 0.417 -11.4631780658 -5.3821306293 -12.5734232307 # HT + 1250 245 27 0.417 -12.9770787203 -5.3821306293 -12.5734232307 # HT + 1251 246 28 -0.834 -12.220128393 -8.43121806829 -10.1102180683 # OT + 1252 246 27 0.417 -11.4631780658 -7.84533579167 -10.1102180683 # HT + 1253 246 27 0.417 -12.9770787203 -7.84533579167 -10.1102180683 # HT + 1254 247 28 -0.834 -14.6833335554 -5.96801290592 -10.1102180683 # OT + 1255 247 27 0.417 -13.9263832281 -5.3821306293 -10.1102180683 # HT + 1256 247 27 0.417 -15.4402838827 -5.3821306293 -10.1102180683 # HT + 1257 248 28 -0.834 -14.6833335554 -8.43121806829 -7.64701290592 # OT + 1258 248 27 0.417 -13.9263832281 -7.84533579167 -7.64701290592 # HT + 1259 248 27 0.417 -15.4402838827 -7.84533579167 -7.64701290592 # HT + 1260 249 28 -0.834 -14.6833335554 -8.43121806829 -2.72060258118 # OT + 1261 249 27 0.417 -13.9263832281 -7.84533579167 -2.72060258118 # HT + 1262 249 27 0.417 -15.4402838827 -7.84533579167 -2.72060258118 # HT + 1263 250 28 -0.834 -14.6833335554 -8.43121806829 7.13221806829 # OT + 1264 250 27 0.417 -13.9263832281 -7.84533579167 7.13221806829 # HT + 1265 250 27 0.417 -15.4402838827 -7.84533579167 7.13221806829 # HT + 1266 251 28 -0.834 -12.220128393 -5.96801290592 7.13221806829 # OT + 1267 251 27 0.417 -11.4631780658 -5.3821306293 7.13221806829 # HT + 1268 251 27 0.417 -12.9770787203 -5.3821306293 7.13221806829 # HT + 1269 252 28 -0.834 -12.220128393 -8.43121806829 9.59542323066 # OT + 1270 252 27 0.417 -11.4631780658 -7.84533579167 9.59542323066 # HT + 1271 252 27 0.417 -12.9770787203 -7.84533579167 9.59542323066 # HT + 1272 253 28 -0.834 -14.6833335554 -5.96801290592 9.59542323066 # OT + 1273 253 27 0.417 -13.9263832281 -5.3821306293 9.59542323066 # HT + 1274 253 27 0.417 -15.4402838827 -5.3821306293 9.59542323066 # HT + 1275 254 28 -0.834 -14.6833335554 -3.50480774355 -12.5734232307 # OT + 1276 254 27 0.417 -13.9263832281 -2.91892546693 -12.5734232307 # HT + 1277 254 27 0.417 -15.4402838827 -2.91892546693 -12.5734232307 # HT + 1278 255 28 -0.834 -12.220128393 -1.04160258118 -12.5734232307 # OT + 1279 255 27 0.417 -11.4631780658 -0.455720304566 -12.5734232307 # HT + 1280 255 27 0.417 -12.9770787203 -0.455720304566 -12.5734232307 # HT + 1281 256 28 -0.834 -12.220128393 -3.50480774355 -10.1102180683 # OT + 1282 256 27 0.417 -11.4631780658 -2.91892546693 -10.1102180683 # HT + 1283 256 27 0.417 -12.9770787203 -2.91892546693 -10.1102180683 # HT + 1284 257 28 -0.834 -14.6833335554 -1.04160258118 -10.1102180683 # OT + 1285 257 27 0.417 -13.9263832281 -0.455720304566 -10.1102180683 # HT + 1286 257 27 0.417 -15.4402838827 -0.455720304566 -10.1102180683 # HT + 1287 258 28 -0.834 -14.6833335554 -3.50480774355 -7.64701290592 # OT + 1288 258 27 0.417 -13.9263832281 -2.91892546693 -7.64701290592 # HT + 1289 258 27 0.417 -15.4402838827 -2.91892546693 -7.64701290592 # HT + 1290 259 28 -0.834 -12.220128393 -1.04160258118 -7.64701290592 # OT + 1291 259 27 0.417 -11.4631780658 -0.455720304566 -7.64701290592 # HT + 1292 259 27 0.417 -12.9770787203 -0.455720304566 -7.64701290592 # HT + 1293 260 28 -0.834 -14.6833335554 -1.04160258118 -5.18380774355 # OT + 1294 260 27 0.417 -13.9263832281 -0.455720304566 -5.18380774355 # HT + 1295 260 27 0.417 -15.4402838827 -0.455720304566 -5.18380774355 # HT + 1296 261 28 -0.834 -14.6833335554 -3.50480774355 -2.72060258118 # OT + 1297 261 27 0.417 -13.9263832281 -2.91892546693 -2.72060258118 # HT + 1298 261 27 0.417 -15.4402838827 -2.91892546693 -2.72060258118 # HT + 1299 262 28 -0.834 -14.6833335554 -3.50480774355 7.13221806829 # OT + 1300 262 27 0.417 -13.9263832281 -2.91892546693 7.13221806829 # HT + 1301 262 27 0.417 -15.4402838827 -2.91892546693 7.13221806829 # HT + 1302 263 28 -0.834 -12.220128393 -3.50480774355 9.59542323066 # OT + 1303 263 27 0.417 -11.4631780658 -2.91892546693 9.59542323066 # HT + 1304 263 27 0.417 -12.9770787203 -2.91892546693 9.59542323066 # HT + 1305 264 28 -0.834 -14.6833335554 -1.04160258118 9.59542323066 # OT + 1306 264 27 0.417 -13.9263832281 -0.455720304566 9.59542323066 # HT + 1307 264 27 0.417 -15.4402838827 -0.455720304566 9.59542323066 # HT + 1308 265 28 -0.834 -14.6833335554 1.42160258118 -12.5734232307 # OT + 1309 265 27 0.417 -13.9263832281 2.0074848578 -12.5734232307 # HT + 1310 265 27 0.417 -15.4402838827 2.0074848578 -12.5734232307 # HT + 1311 266 28 -0.834 -12.220128393 3.88480774355 -12.5734232307 # OT + 1312 266 27 0.417 -11.4631780658 4.47069002017 -12.5734232307 # HT + 1313 266 27 0.417 -12.9770787203 4.47069002017 -12.5734232307 # HT + 1314 267 28 -0.834 -12.220128393 1.42160258118 -10.1102180683 # OT + 1315 267 27 0.417 -11.4631780658 2.0074848578 -10.1102180683 # HT + 1316 267 27 0.417 -12.9770787203 2.0074848578 -10.1102180683 # HT + 1317 268 28 -0.834 -14.6833335554 3.88480774355 -10.1102180683 # OT + 1318 268 27 0.417 -13.9263832281 4.47069002017 -10.1102180683 # HT + 1319 268 27 0.417 -15.4402838827 4.47069002017 -10.1102180683 # HT + 1320 269 28 -0.834 -14.6833335554 1.42160258118 -7.64701290592 # OT + 1321 269 27 0.417 -13.9263832281 2.0074848578 -7.64701290592 # HT + 1322 269 27 0.417 -15.4402838827 2.0074848578 -7.64701290592 # HT + 1323 270 28 -0.834 -14.6833335554 1.42160258118 7.13221806829 # OT + 1324 270 27 0.417 -13.9263832281 2.0074848578 7.13221806829 # HT + 1325 270 27 0.417 -15.4402838827 2.0074848578 7.13221806829 # HT + 1326 271 28 -0.834 -14.6833335554 6.34801290592 -12.5734232307 # OT + 1327 271 27 0.417 -13.9263832281 6.93389518254 -12.5734232307 # HT + 1328 271 27 0.417 -15.4402838827 6.93389518254 -12.5734232307 # HT + 1329 272 28 -0.834 -12.220128393 8.81121806829 -12.5734232307 # OT + 1330 272 27 0.417 -11.4631780658 9.39710034491 -12.5734232307 # HT + 1331 272 27 0.417 -12.9770787203 9.39710034491 -12.5734232307 # HT + 1332 273 28 -0.834 -12.220128393 6.34801290592 -10.1102180683 # OT + 1333 273 27 0.417 -11.4631780658 6.93389518254 -10.1102180683 # HT + 1334 273 27 0.417 -12.9770787203 6.93389518254 -10.1102180683 # HT + 1335 274 28 -0.834 -14.6833335554 8.81121806829 -10.1102180683 # OT + 1336 274 27 0.417 -13.9263832281 9.39710034491 -10.1102180683 # HT + 1337 274 27 0.417 -15.4402838827 9.39710034491 -10.1102180683 # HT + 1338 275 28 -0.834 -14.6833335554 6.34801290592 -7.64701290592 # OT + 1339 275 27 0.417 -13.9263832281 6.93389518254 -7.64701290592 # HT + 1340 275 27 0.417 -15.4402838827 6.93389518254 -7.64701290592 # HT + 1341 276 28 -0.834 -12.220128393 8.81121806829 -7.64701290592 # OT + 1342 276 27 0.417 -11.4631780658 9.39710034491 -7.64701290592 # HT + 1343 276 27 0.417 -12.9770787203 9.39710034491 -7.64701290592 # HT + 1344 277 28 -0.834 -12.220128393 6.34801290592 4.66901290592 # OT + 1345 277 27 0.417 -11.4631780658 6.93389518254 4.66901290592 # HT + 1346 277 27 0.417 -12.9770787203 6.93389518254 4.66901290592 # HT + 1347 278 28 -0.834 -14.6833335554 8.81121806829 4.66901290592 # OT + 1348 278 27 0.417 -13.9263832281 9.39710034491 4.66901290592 # HT + 1349 278 27 0.417 -15.4402838827 9.39710034491 4.66901290592 # HT + 1350 279 28 -0.834 -14.6833335554 6.34801290592 7.13221806829 # OT + 1351 279 27 0.417 -13.9263832281 6.93389518254 7.13221806829 # HT + 1352 279 27 0.417 -15.4402838827 6.93389518254 7.13221806829 # HT + 1353 280 28 -0.834 -12.220128393 8.81121806829 7.13221806829 # OT + 1354 280 27 0.417 -11.4631780658 9.39710034491 7.13221806829 # HT + 1355 280 27 0.417 -12.9770787203 9.39710034491 7.13221806829 # HT + 1356 281 28 -0.834 -14.6833335554 8.81121806829 9.59542323066 # OT + 1357 281 27 0.417 -13.9263832281 9.39710034491 9.59542323066 # HT + 1358 281 27 0.417 -15.4402838827 9.39710034491 9.59542323066 # HT + 1359 282 28 -0.834 -14.6833335554 11.2744232307 -12.5734232307 # OT + 1360 282 27 0.417 -13.9263832281 11.8603055073 -12.5734232307 # HT + 1361 282 27 0.417 -15.4402838827 11.8603055073 -12.5734232307 # HT + 1362 283 28 -0.834 -12.220128393 13.737628393 -12.5734232307 # OT + 1363 283 27 0.417 -11.4631780658 14.3235106696 -12.5734232307 # HT + 1364 283 27 0.417 -12.9770787203 14.3235106696 -12.5734232307 # HT + 1365 284 28 -0.834 -12.220128393 11.2744232307 -10.1102180683 # OT + 1366 284 27 0.417 -11.4631780658 11.8603055073 -10.1102180683 # HT + 1367 284 27 0.417 -12.9770787203 11.8603055073 -10.1102180683 # HT + 1368 285 28 -0.834 -14.6833335554 13.737628393 -10.1102180683 # OT + 1369 285 27 0.417 -13.9263832281 14.3235106696 -10.1102180683 # HT + 1370 285 27 0.417 -15.4402838827 14.3235106696 -10.1102180683 # HT + 1371 286 28 -0.834 -14.6833335554 11.2744232307 -7.64701290592 # OT + 1372 286 27 0.417 -13.9263832281 11.8603055073 -7.64701290592 # HT + 1373 286 27 0.417 -15.4402838827 11.8603055073 -7.64701290592 # HT + 1374 287 28 -0.834 -12.220128393 13.737628393 -7.64701290592 # OT + 1375 287 27 0.417 -11.4631780658 14.3235106696 -7.64701290592 # HT + 1376 287 27 0.417 -12.9770787203 14.3235106696 -7.64701290592 # HT + 1377 288 28 -0.834 -12.220128393 11.2744232307 -5.18380774355 # OT + 1378 288 27 0.417 -11.4631780658 11.8603055073 -5.18380774355 # HT + 1379 288 27 0.417 -12.9770787203 11.8603055073 -5.18380774355 # HT + 1380 289 28 -0.834 -14.6833335554 13.737628393 -5.18380774355 # OT + 1381 289 27 0.417 -13.9263832281 14.3235106696 -5.18380774355 # HT + 1382 289 27 0.417 -15.4402838827 14.3235106696 -5.18380774355 # HT + 1383 290 28 -0.834 -14.6833335554 11.2744232307 -2.72060258118 # OT + 1384 290 27 0.417 -13.9263832281 11.8603055073 -2.72060258118 # HT + 1385 290 27 0.417 -15.4402838827 11.8603055073 -2.72060258118 # HT + 1386 291 28 -0.834 -12.220128393 13.737628393 -2.72060258118 # OT + 1387 291 27 0.417 -11.4631780658 14.3235106696 -2.72060258118 # HT + 1388 291 27 0.417 -12.9770787203 14.3235106696 -2.72060258118 # HT + 1389 292 28 -0.834 -12.220128393 11.2744232307 -0.257397418816 # OT + 1390 292 27 0.417 -11.4631780658 11.8603055073 -0.257397418816 # HT + 1391 292 27 0.417 -12.9770787203 11.8603055073 -0.257397418816 # HT + 1392 293 28 -0.834 -14.6833335554 13.737628393 -0.257397418816 # OT + 1393 293 27 0.417 -13.9263832281 14.3235106696 -0.257397418816 # HT + 1394 293 27 0.417 -15.4402838827 14.3235106696 -0.257397418816 # HT + 1395 294 28 -0.834 -14.6833335554 11.2744232307 2.20580774355 # OT + 1396 294 27 0.417 -13.9263832281 11.8603055073 2.20580774355 # HT + 1397 294 27 0.417 -15.4402838827 11.8603055073 2.20580774355 # HT + 1398 295 28 -0.834 -12.220128393 13.737628393 2.20580774355 # OT + 1399 295 27 0.417 -11.4631780658 14.3235106696 2.20580774355 # HT + 1400 295 27 0.417 -12.9770787203 14.3235106696 2.20580774355 # HT + 1401 296 28 -0.834 -12.220128393 11.2744232307 4.66901290592 # OT + 1402 296 27 0.417 -11.4631780658 11.8603055073 4.66901290592 # HT + 1403 296 27 0.417 -12.9770787203 11.8603055073 4.66901290592 # HT + 1404 297 28 -0.834 -14.6833335554 13.737628393 4.66901290592 # OT + 1405 297 27 0.417 -13.9263832281 14.3235106696 4.66901290592 # HT + 1406 297 27 0.417 -15.4402838827 14.3235106696 4.66901290592 # HT + 1407 298 28 -0.834 -14.6833335554 11.2744232307 7.13221806829 # OT + 1408 298 27 0.417 -13.9263832281 11.8603055073 7.13221806829 # HT + 1409 298 27 0.417 -15.4402838827 11.8603055073 7.13221806829 # HT + 1410 299 28 -0.834 -12.220128393 13.737628393 7.13221806829 # OT + 1411 299 27 0.417 -11.4631780658 14.3235106696 7.13221806829 # HT + 1412 299 27 0.417 -12.9770787203 14.3235106696 7.13221806829 # HT + 1413 300 28 -0.834 -12.220128393 11.2744232307 9.59542323066 # OT + 1414 300 27 0.417 -11.4631780658 11.8603055073 9.59542323066 # HT + 1415 300 27 0.417 -12.9770787203 11.8603055073 9.59542323066 # HT + 1416 301 28 -0.834 -14.6833335554 13.737628393 9.59542323066 # OT + 1417 301 27 0.417 -13.9263832281 14.3235106696 9.59542323066 # HT + 1418 301 27 0.417 -15.4402838827 14.3235106696 9.59542323066 # HT + 1419 302 28 -0.834 -9.75692323066 -13.357628393 -12.5734232307 # OT + 1420 302 27 0.417 -8.9999729034 -12.7717461164 -12.5734232307 # HT + 1421 302 27 0.417 -10.5138735579 -12.7717461164 -12.5734232307 # HT + 1422 303 28 -0.834 -7.29371806829 -10.8944232307 -12.5734232307 # OT + 1423 303 27 0.417 -6.53676774103 -10.308540954 -12.5734232307 # HT + 1424 303 27 0.417 -8.05066839555 -10.308540954 -12.5734232307 # HT + 1425 304 28 -0.834 -7.29371806829 -13.357628393 -10.1102180683 # OT + 1426 304 27 0.417 -6.53676774103 -12.7717461164 -10.1102180683 # HT + 1427 304 27 0.417 -8.05066839555 -12.7717461164 -10.1102180683 # HT + 1428 305 28 -0.834 -9.75692323066 -10.8944232307 -10.1102180683 # OT + 1429 305 27 0.417 -8.9999729034 -10.308540954 -10.1102180683 # HT + 1430 305 27 0.417 -10.5138735579 -10.308540954 -10.1102180683 # HT + 1431 306 28 -0.834 -9.75692323066 -13.357628393 -7.64701290592 # OT + 1432 306 27 0.417 -8.9999729034 -12.7717461164 -7.64701290592 # HT + 1433 306 27 0.417 -10.5138735579 -12.7717461164 -7.64701290592 # HT + 1434 307 30 1 -7.29371806829 -13.357628393 4.66901290592 # SOD + 1435 308 28 -0.834 -9.75692323066 -10.8944232307 4.66901290592 # OT + 1436 308 27 0.417 -8.9999729034 -10.308540954 4.66901290592 # HT + 1437 308 27 0.417 -10.5138735579 -10.308540954 4.66901290592 # HT + 1438 309 28 -0.834 -9.75692323066 -13.357628393 7.13221806829 # OT + 1439 309 27 0.417 -8.9999729034 -12.7717461164 7.13221806829 # HT + 1440 309 27 0.417 -10.5138735579 -12.7717461164 7.13221806829 # HT + 1441 310 28 -0.834 -7.29371806829 -10.8944232307 7.13221806829 # OT + 1442 310 27 0.417 -6.53676774103 -10.308540954 7.13221806829 # HT + 1443 310 27 0.417 -8.05066839555 -10.308540954 7.13221806829 # HT + 1444 311 28 -0.834 -7.29371806829 -13.357628393 9.59542323066 # OT + 1445 311 27 0.417 -6.53676774103 -12.7717461164 9.59542323066 # HT + 1446 311 27 0.417 -8.05066839555 -12.7717461164 9.59542323066 # HT + 1447 312 28 -0.834 -9.75692323066 -10.8944232307 9.59542323066 # OT + 1448 312 27 0.417 -8.9999729034 -10.308540954 9.59542323066 # HT + 1449 312 27 0.417 -10.5138735579 -10.308540954 9.59542323066 # HT + 1450 313 28 -0.834 -9.75692323066 -8.43121806829 -12.5734232307 # OT + 1451 313 27 0.417 -8.9999729034 -7.84533579167 -12.5734232307 # HT + 1452 313 27 0.417 -10.5138735579 -7.84533579167 -12.5734232307 # HT + 1453 314 28 -0.834 -7.29371806829 -5.96801290592 -12.5734232307 # OT + 1454 314 27 0.417 -6.53676774103 -5.3821306293 -12.5734232307 # HT + 1455 314 27 0.417 -8.05066839555 -5.3821306293 -12.5734232307 # HT + 1456 315 28 -0.834 -7.29371806829 -8.43121806829 -10.1102180683 # OT + 1457 315 27 0.417 -6.53676774103 -7.84533579167 -10.1102180683 # HT + 1458 315 27 0.417 -8.05066839555 -7.84533579167 -10.1102180683 # HT + 1459 316 28 -0.834 -9.75692323066 -5.96801290592 -10.1102180683 # OT + 1460 316 27 0.417 -8.9999729034 -5.3821306293 -10.1102180683 # HT + 1461 316 27 0.417 -10.5138735579 -5.3821306293 -10.1102180683 # HT + 1462 317 28 -0.834 -7.29371806829 -8.43121806829 4.66901290592 # OT + 1463 317 27 0.417 -6.53676774103 -7.84533579167 4.66901290592 # HT + 1464 317 27 0.417 -8.05066839555 -7.84533579167 4.66901290592 # HT + 1465 318 28 -0.834 -9.75692323066 -8.43121806829 7.13221806829 # OT + 1466 318 27 0.417 -8.9999729034 -7.84533579167 7.13221806829 # HT + 1467 318 27 0.417 -10.5138735579 -7.84533579167 7.13221806829 # HT + 1468 319 28 -0.834 -7.29371806829 -5.96801290592 7.13221806829 # OT + 1469 319 27 0.417 -6.53676774103 -5.3821306293 7.13221806829 # HT + 1470 319 27 0.417 -8.05066839555 -5.3821306293 7.13221806829 # HT + 1471 320 28 -0.834 -7.29371806829 -8.43121806829 9.59542323066 # OT + 1472 320 27 0.417 -6.53676774103 -7.84533579167 9.59542323066 # HT + 1473 320 27 0.417 -8.05066839555 -7.84533579167 9.59542323066 # HT + 1474 321 28 -0.834 -9.75692323066 -5.96801290592 9.59542323066 # OT + 1475 321 27 0.417 -8.9999729034 -5.3821306293 9.59542323066 # HT + 1476 321 27 0.417 -10.5138735579 -5.3821306293 9.59542323066 # HT + 1477 322 28 -0.834 -9.75692323066 -3.50480774355 -12.5734232307 # OT + 1478 322 27 0.417 -8.9999729034 -2.91892546693 -12.5734232307 # HT + 1479 322 27 0.417 -10.5138735579 -2.91892546693 -12.5734232307 # HT + 1480 323 28 -0.834 -7.29371806829 -1.04160258118 -12.5734232307 # OT + 1481 323 27 0.417 -6.53676774103 -0.455720304566 -12.5734232307 # HT + 1482 323 27 0.417 -8.05066839555 -0.455720304566 -12.5734232307 # HT + 1483 324 28 -0.834 -7.29371806829 -3.50480774355 -10.1102180683 # OT + 1484 324 27 0.417 -6.53676774103 -2.91892546693 -10.1102180683 # HT + 1485 324 27 0.417 -8.05066839555 -2.91892546693 -10.1102180683 # HT + 1486 325 28 -0.834 -9.75692323066 -1.04160258118 -10.1102180683 # OT + 1487 325 27 0.417 -8.9999729034 -0.455720304566 -10.1102180683 # HT + 1488 325 27 0.417 -10.5138735579 -0.455720304566 -10.1102180683 # HT + 1489 326 28 -0.834 -9.75692323066 1.42160258118 -12.5734232307 # OT + 1490 326 27 0.417 -8.9999729034 2.0074848578 -12.5734232307 # HT + 1491 326 27 0.417 -10.5138735579 2.0074848578 -12.5734232307 # HT + 1492 327 28 -0.834 -7.29371806829 3.88480774355 -12.5734232307 # OT + 1493 327 27 0.417 -6.53676774103 4.47069002017 -12.5734232307 # HT + 1494 327 27 0.417 -8.05066839555 4.47069002017 -12.5734232307 # HT + 1495 328 28 -0.834 -7.29371806829 1.42160258118 -10.1102180683 # OT + 1496 328 27 0.417 -6.53676774103 2.0074848578 -10.1102180683 # HT + 1497 328 27 0.417 -8.05066839555 2.0074848578 -10.1102180683 # HT + 1498 329 28 -0.834 -9.75692323066 3.88480774355 -10.1102180683 # OT + 1499 329 27 0.417 -8.9999729034 4.47069002017 -10.1102180683 # HT + 1500 329 27 0.417 -10.5138735579 4.47069002017 -10.1102180683 # HT + 1501 330 28 -0.834 -9.75692323066 6.34801290592 -12.5734232307 # OT + 1502 330 27 0.417 -8.9999729034 6.93389518254 -12.5734232307 # HT + 1503 330 27 0.417 -10.5138735579 6.93389518254 -12.5734232307 # HT + 1504 331 28 -0.834 -7.29371806829 8.81121806829 -12.5734232307 # OT + 1505 331 27 0.417 -6.53676774103 9.39710034491 -12.5734232307 # HT + 1506 331 27 0.417 -8.05066839555 9.39710034491 -12.5734232307 # HT + 1507 332 28 -0.834 -9.75692323066 8.81121806829 -10.1102180683 # OT + 1508 332 27 0.417 -8.9999729034 9.39710034491 -10.1102180683 # HT + 1509 332 27 0.417 -10.5138735579 9.39710034491 -10.1102180683 # HT + 1510 333 28 -0.834 -9.75692323066 8.81121806829 4.66901290592 # OT + 1511 333 27 0.417 -8.9999729034 9.39710034491 4.66901290592 # HT + 1512 333 27 0.417 -10.5138735579 9.39710034491 4.66901290592 # HT + 1513 334 28 -0.834 -7.29371806829 8.81121806829 7.13221806829 # OT + 1514 334 27 0.417 -6.53676774103 9.39710034491 7.13221806829 # HT + 1515 334 27 0.417 -8.05066839555 9.39710034491 7.13221806829 # HT + 1516 335 28 -0.834 -7.29371806829 6.34801290592 9.59542323066 # OT + 1517 335 27 0.417 -6.53676774103 6.93389518254 9.59542323066 # HT + 1518 335 27 0.417 -8.05066839555 6.93389518254 9.59542323066 # HT + 1519 336 28 -0.834 -9.75692323066 8.81121806829 9.59542323066 # OT + 1520 336 27 0.417 -8.9999729034 9.39710034491 9.59542323066 # HT + 1521 336 27 0.417 -10.5138735579 9.39710034491 9.59542323066 # HT + 1522 337 28 -0.834 -9.75692323066 11.2744232307 -12.5734232307 # OT + 1523 337 27 0.417 -8.9999729034 11.8603055073 -12.5734232307 # HT + 1524 337 27 0.417 -10.5138735579 11.8603055073 -12.5734232307 # HT + 1525 338 28 -0.834 -7.29371806829 13.737628393 -12.5734232307 # OT + 1526 338 27 0.417 -6.53676774103 14.3235106696 -12.5734232307 # HT + 1527 338 27 0.417 -8.05066839555 14.3235106696 -12.5734232307 # HT + 1528 339 28 -0.834 -7.29371806829 11.2744232307 -10.1102180683 # OT + 1529 339 27 0.417 -6.53676774103 11.8603055073 -10.1102180683 # HT + 1530 339 27 0.417 -8.05066839555 11.8603055073 -10.1102180683 # HT + 1531 340 28 -0.834 -9.75692323066 13.737628393 -10.1102180683 # OT + 1532 340 27 0.417 -8.9999729034 14.3235106696 -10.1102180683 # HT + 1533 340 27 0.417 -10.5138735579 14.3235106696 -10.1102180683 # HT + 1534 341 28 -0.834 -9.75692323066 11.2744232307 -7.64701290592 # OT + 1535 341 27 0.417 -8.9999729034 11.8603055073 -7.64701290592 # HT + 1536 341 27 0.417 -10.5138735579 11.8603055073 -7.64701290592 # HT + 1537 342 28 -0.834 -9.75692323066 13.737628393 -5.18380774355 # OT + 1538 342 27 0.417 -8.9999729034 14.3235106696 -5.18380774355 # HT + 1539 342 27 0.417 -10.5138735579 14.3235106696 -5.18380774355 # HT + 1540 343 28 -0.834 -7.29371806829 13.737628393 -2.72060258118 # OT + 1541 343 27 0.417 -6.53676774103 14.3235106696 -2.72060258118 # HT + 1542 343 27 0.417 -8.05066839555 14.3235106696 -2.72060258118 # HT + 1543 344 28 -0.834 -9.75692323066 13.737628393 -0.257397418816 # OT + 1544 344 27 0.417 -8.9999729034 14.3235106696 -0.257397418816 # HT + 1545 344 27 0.417 -10.5138735579 14.3235106696 -0.257397418816 # HT + 1546 345 28 -0.834 -9.75692323066 11.2744232307 2.20580774355 # OT + 1547 345 27 0.417 -8.9999729034 11.8603055073 2.20580774355 # HT + 1548 345 27 0.417 -10.5138735579 11.8603055073 2.20580774355 # HT + 1549 346 28 -0.834 -7.29371806829 13.737628393 2.20580774355 # OT + 1550 346 27 0.417 -6.53676774103 14.3235106696 2.20580774355 # HT + 1551 346 27 0.417 -8.05066839555 14.3235106696 2.20580774355 # HT + 1552 347 28 -0.834 -7.29371806829 11.2744232307 4.66901290592 # OT + 1553 347 27 0.417 -6.53676774103 11.8603055073 4.66901290592 # HT + 1554 347 27 0.417 -8.05066839555 11.8603055073 4.66901290592 # HT + 1555 348 28 -0.834 -9.75692323066 13.737628393 4.66901290592 # OT + 1556 348 27 0.417 -8.9999729034 14.3235106696 4.66901290592 # HT + 1557 348 27 0.417 -10.5138735579 14.3235106696 4.66901290592 # HT + 1558 349 28 -0.834 -9.75692323066 11.2744232307 7.13221806829 # OT + 1559 349 27 0.417 -8.9999729034 11.8603055073 7.13221806829 # HT + 1560 349 27 0.417 -10.5138735579 11.8603055073 7.13221806829 # HT + 1561 350 28 -0.834 -7.29371806829 13.737628393 7.13221806829 # OT + 1562 350 27 0.417 -6.53676774103 14.3235106696 7.13221806829 # HT + 1563 350 27 0.417 -8.05066839555 14.3235106696 7.13221806829 # HT + 1564 351 28 -0.834 -7.29371806829 11.2744232307 9.59542323066 # OT + 1565 351 27 0.417 -6.53676774103 11.8603055073 9.59542323066 # HT + 1566 351 27 0.417 -8.05066839555 11.8603055073 9.59542323066 # HT + 1567 352 28 -0.834 -9.75692323066 13.737628393 9.59542323066 # OT + 1568 352 27 0.417 -8.9999729034 14.3235106696 9.59542323066 # HT + 1569 352 27 0.417 -10.5138735579 14.3235106696 9.59542323066 # HT + 1570 353 28 -0.834 -4.83051290592 -13.357628393 -12.5734232307 # OT + 1571 353 27 0.417 -4.07356257866 -12.7717461164 -12.5734232307 # HT + 1572 353 27 0.417 -5.58746323319 -12.7717461164 -12.5734232307 # HT + 1573 354 28 -0.834 -2.36730774355 -10.8944232307 -12.5734232307 # OT + 1574 354 27 0.417 -1.61035741629 -10.308540954 -12.5734232307 # HT + 1575 354 27 0.417 -3.12425807082 -10.308540954 -12.5734232307 # HT + 1576 355 28 -0.834 -2.36730774355 -13.357628393 -10.1102180683 # OT + 1577 355 27 0.417 -1.61035741629 -12.7717461164 -10.1102180683 # HT + 1578 355 27 0.417 -3.12425807082 -12.7717461164 -10.1102180683 # HT + 1579 356 28 -0.834 -4.83051290592 -10.8944232307 -10.1102180683 # OT + 1580 356 27 0.417 -4.07356257866 -10.308540954 -10.1102180683 # HT + 1581 356 27 0.417 -5.58746323319 -10.308540954 -10.1102180683 # HT + 1582 357 28 -0.834 -4.83051290592 -13.357628393 -7.64701290592 # OT + 1583 357 27 0.417 -4.07356257866 -12.7717461164 -7.64701290592 # HT + 1584 357 27 0.417 -5.58746323319 -12.7717461164 -7.64701290592 # HT + 1585 358 28 -0.834 -2.36730774355 -10.8944232307 -7.64701290592 # OT + 1586 358 27 0.417 -1.61035741629 -10.308540954 -7.64701290592 # HT + 1587 358 27 0.417 -3.12425807082 -10.308540954 -7.64701290592 # HT + 1588 359 28 -0.834 -2.36730774355 -13.357628393 -5.18380774355 # OT + 1589 359 27 0.417 -1.61035741629 -12.7717461164 -5.18380774355 # HT + 1590 359 27 0.417 -3.12425807082 -12.7717461164 -5.18380774355 # HT + 1591 360 28 -0.834 -2.36730774355 -13.357628393 -0.257397418816 # OT + 1592 360 27 0.417 -1.61035741629 -12.7717461164 -0.257397418816 # HT + 1593 360 27 0.417 -3.12425807082 -12.7717461164 -0.257397418816 # HT + 1594 361 28 -0.834 -4.83051290592 -13.357628393 2.20580774355 # OT + 1595 361 27 0.417 -4.07356257866 -12.7717461164 2.20580774355 # HT + 1596 361 27 0.417 -5.58746323319 -12.7717461164 2.20580774355 # HT + 1597 362 28 -0.834 -2.36730774355 -13.357628393 4.66901290592 # OT + 1598 362 27 0.417 -1.61035741629 -12.7717461164 4.66901290592 # HT + 1599 362 27 0.417 -3.12425807082 -12.7717461164 4.66901290592 # HT + 1600 363 28 -0.834 -4.83051290592 -13.357628393 7.13221806829 # OT + 1601 363 27 0.417 -4.07356257866 -12.7717461164 7.13221806829 # HT + 1602 363 27 0.417 -5.58746323319 -12.7717461164 7.13221806829 # HT + 1603 364 28 -0.834 -2.36730774355 -10.8944232307 7.13221806829 # OT + 1604 364 27 0.417 -1.61035741629 -10.308540954 7.13221806829 # HT + 1605 364 27 0.417 -3.12425807082 -10.308540954 7.13221806829 # HT + 1606 365 28 -0.834 -2.36730774355 -13.357628393 9.59542323066 # OT + 1607 365 27 0.417 -1.61035741629 -12.7717461164 9.59542323066 # HT + 1608 365 27 0.417 -3.12425807082 -12.7717461164 9.59542323066 # HT + 1609 366 28 -0.834 -4.83051290592 -10.8944232307 9.59542323066 # OT + 1610 366 27 0.417 -4.07356257866 -10.308540954 9.59542323066 # HT + 1611 366 27 0.417 -5.58746323319 -10.308540954 9.59542323066 # HT + 1612 367 28 -0.834 -4.83051290592 -8.43121806829 -12.5734232307 # OT + 1613 367 27 0.417 -4.07356257866 -7.84533579167 -12.5734232307 # HT + 1614 367 27 0.417 -5.58746323319 -7.84533579167 -12.5734232307 # HT + 1615 368 28 -0.834 -2.36730774355 -5.96801290592 -12.5734232307 # OT + 1616 368 27 0.417 -1.61035741629 -5.3821306293 -12.5734232307 # HT + 1617 368 27 0.417 -3.12425807082 -5.3821306293 -12.5734232307 # HT + 1618 369 28 -0.834 -2.36730774355 -8.43121806829 -10.1102180683 # OT + 1619 369 27 0.417 -1.61035741629 -7.84533579167 -10.1102180683 # HT + 1620 369 27 0.417 -3.12425807082 -7.84533579167 -10.1102180683 # HT + 1621 370 28 -0.834 -4.83051290592 -5.96801290592 -10.1102180683 # OT + 1622 370 27 0.417 -4.07356257866 -5.3821306293 -10.1102180683 # HT + 1623 370 27 0.417 -5.58746323319 -5.3821306293 -10.1102180683 # HT + 1624 371 28 -0.834 -4.83051290592 -5.96801290592 9.59542323066 # OT + 1625 371 27 0.417 -4.07356257866 -5.3821306293 9.59542323066 # HT + 1626 371 27 0.417 -5.58746323319 -5.3821306293 9.59542323066 # HT + 1627 372 28 -0.834 -4.83051290592 -3.50480774355 -12.5734232307 # OT + 1628 372 27 0.417 -4.07356257866 -2.91892546693 -12.5734232307 # HT + 1629 372 27 0.417 -5.58746323319 -2.91892546693 -12.5734232307 # HT + 1630 373 28 -0.834 -2.36730774355 -1.04160258118 -12.5734232307 # OT + 1631 373 27 0.417 -1.61035741629 -0.455720304566 -12.5734232307 # HT + 1632 373 27 0.417 -3.12425807082 -0.455720304566 -12.5734232307 # HT + 1633 374 28 -0.834 -2.36730774355 -3.50480774355 -10.1102180683 # OT + 1634 374 27 0.417 -1.61035741629 -2.91892546693 -10.1102180683 # HT + 1635 374 27 0.417 -3.12425807082 -2.91892546693 -10.1102180683 # HT + 1636 375 28 -0.834 -4.83051290592 -1.04160258118 -10.1102180683 # OT + 1637 375 27 0.417 -4.07356257866 -0.455720304566 -10.1102180683 # HT + 1638 375 27 0.417 -5.58746323319 -0.455720304566 -10.1102180683 # HT + 1639 376 28 -0.834 -4.83051290592 1.42160258118 -12.5734232307 # OT + 1640 376 27 0.417 -4.07356257866 2.0074848578 -12.5734232307 # HT + 1641 376 27 0.417 -5.58746323319 2.0074848578 -12.5734232307 # HT + 1642 377 28 -0.834 -2.36730774355 3.88480774355 -12.5734232307 # OT + 1643 377 27 0.417 -1.61035741629 4.47069002017 -12.5734232307 # HT + 1644 377 27 0.417 -3.12425807082 4.47069002017 -12.5734232307 # HT + 1645 378 28 -0.834 -4.83051290592 6.34801290592 -12.5734232307 # OT + 1646 378 27 0.417 -4.07356257866 6.93389518254 -12.5734232307 # HT + 1647 378 27 0.417 -5.58746323319 6.93389518254 -12.5734232307 # HT + 1648 379 28 -0.834 -2.36730774355 8.81121806829 -12.5734232307 # OT + 1649 379 27 0.417 -1.61035741629 9.39710034491 -12.5734232307 # HT + 1650 379 27 0.417 -3.12425807082 9.39710034491 -12.5734232307 # HT + 1651 380 28 -0.834 -2.36730774355 6.34801290592 -10.1102180683 # OT + 1652 380 27 0.417 -1.61035741629 6.93389518254 -10.1102180683 # HT + 1653 380 27 0.417 -3.12425807082 6.93389518254 -10.1102180683 # HT + 1654 381 28 -0.834 -4.83051290592 8.81121806829 -10.1102180683 # OT + 1655 381 27 0.417 -4.07356257866 9.39710034491 -10.1102180683 # HT + 1656 381 27 0.417 -5.58746323319 9.39710034491 -10.1102180683 # HT + 1657 382 28 -0.834 -2.36730774355 8.81121806829 7.13221806829 # OT + 1658 382 27 0.417 -1.61035741629 9.39710034491 7.13221806829 # HT + 1659 382 27 0.417 -3.12425807082 9.39710034491 7.13221806829 # HT + 1660 383 28 -0.834 -2.36730774355 6.34801290592 9.59542323066 # OT + 1661 383 27 0.417 -1.61035741629 6.93389518254 9.59542323066 # HT + 1662 383 27 0.417 -3.12425807082 6.93389518254 9.59542323066 # HT + 1663 384 28 -0.834 -4.83051290592 8.81121806829 9.59542323066 # OT + 1664 384 27 0.417 -4.07356257866 9.39710034491 9.59542323066 # HT + 1665 384 27 0.417 -5.58746323319 9.39710034491 9.59542323066 # HT + 1666 385 28 -0.834 -4.83051290592 11.2744232307 -12.5734232307 # OT + 1667 385 27 0.417 -4.07356257866 11.8603055073 -12.5734232307 # HT + 1668 385 27 0.417 -5.58746323319 11.8603055073 -12.5734232307 # HT + 1669 386 28 -0.834 -2.36730774355 13.737628393 -12.5734232307 # OT + 1670 386 27 0.417 -1.61035741629 14.3235106696 -12.5734232307 # HT + 1671 386 27 0.417 -3.12425807082 14.3235106696 -12.5734232307 # HT + 1672 387 28 -0.834 -2.36730774355 11.2744232307 -10.1102180683 # OT + 1673 387 27 0.417 -1.61035741629 11.8603055073 -10.1102180683 # HT + 1674 387 27 0.417 -3.12425807082 11.8603055073 -10.1102180683 # HT + 1675 388 28 -0.834 -4.83051290592 13.737628393 -10.1102180683 # OT + 1676 388 27 0.417 -4.07356257866 14.3235106696 -10.1102180683 # HT + 1677 388 27 0.417 -5.58746323319 14.3235106696 -10.1102180683 # HT + 1678 389 28 -0.834 -2.36730774355 13.737628393 -7.64701290592 # OT + 1679 389 27 0.417 -1.61035741629 14.3235106696 -7.64701290592 # HT + 1680 389 27 0.417 -3.12425807082 14.3235106696 -7.64701290592 # HT + 1681 390 28 -0.834 -2.36730774355 13.737628393 -2.72060258118 # OT + 1682 390 27 0.417 -1.61035741629 14.3235106696 -2.72060258118 # HT + 1683 390 27 0.417 -3.12425807082 14.3235106696 -2.72060258118 # HT + 1684 391 28 -0.834 -2.36730774355 11.2744232307 -0.257397418816 # OT + 1685 391 27 0.417 -1.61035741629 11.8603055073 -0.257397418816 # HT + 1686 391 27 0.417 -3.12425807082 11.8603055073 -0.257397418816 # HT + 1687 392 28 -0.834 -4.83051290592 13.737628393 -0.257397418816 # OT + 1688 392 27 0.417 -4.07356257866 14.3235106696 -0.257397418816 # HT + 1689 392 27 0.417 -5.58746323319 14.3235106696 -0.257397418816 # HT + 1690 393 28 -0.834 -4.83051290592 11.2744232307 2.20580774355 # OT + 1691 393 27 0.417 -4.07356257866 11.8603055073 2.20580774355 # HT + 1692 393 27 0.417 -5.58746323319 11.8603055073 2.20580774355 # HT + 1693 394 28 -0.834 -2.36730774355 13.737628393 2.20580774355 # OT + 1694 394 27 0.417 -1.61035741629 14.3235106696 2.20580774355 # HT + 1695 394 27 0.417 -3.12425807082 14.3235106696 2.20580774355 # HT + 1696 395 28 -0.834 -2.36730774355 11.2744232307 4.66901290592 # OT + 1697 395 27 0.417 -1.61035741629 11.8603055073 4.66901290592 # HT + 1698 395 27 0.417 -3.12425807082 11.8603055073 4.66901290592 # HT + 1699 396 28 -0.834 -4.83051290592 13.737628393 4.66901290592 # OT + 1700 396 27 0.417 -4.07356257866 14.3235106696 4.66901290592 # HT + 1701 396 27 0.417 -5.58746323319 14.3235106696 4.66901290592 # HT + 1702 397 28 -0.834 -4.83051290592 11.2744232307 7.13221806829 # OT + 1703 397 27 0.417 -4.07356257866 11.8603055073 7.13221806829 # HT + 1704 397 27 0.417 -5.58746323319 11.8603055073 7.13221806829 # HT + 1705 398 28 -0.834 -2.36730774355 13.737628393 7.13221806829 # OT + 1706 398 27 0.417 -1.61035741629 14.3235106696 7.13221806829 # HT + 1707 398 27 0.417 -3.12425807082 14.3235106696 7.13221806829 # HT + 1708 399 28 -0.834 -2.36730774355 11.2744232307 9.59542323066 # OT + 1709 399 27 0.417 -1.61035741629 11.8603055073 9.59542323066 # HT + 1710 399 27 0.417 -3.12425807082 11.8603055073 9.59542323066 # HT + 1711 400 28 -0.834 -4.83051290592 13.737628393 9.59542323066 # OT + 1712 400 27 0.417 -4.07356257866 14.3235106696 9.59542323066 # HT + 1713 400 27 0.417 -5.58746323319 14.3235106696 9.59542323066 # HT + 1714 401 28 -0.834 0.0958974188157 -13.357628393 -12.5734232307 # OT + 1715 401 27 0.417 0.852847746079 -12.7717461164 -12.5734232307 # HT + 1716 401 27 0.417 -0.661052908448 -12.7717461164 -12.5734232307 # HT + 1717 402 28 -0.834 2.55910258118 -10.8944232307 -12.5734232307 # OT + 1718 402 27 0.417 3.31605290845 -10.308540954 -12.5734232307 # HT + 1719 402 27 0.417 1.80215225392 -10.308540954 -12.5734232307 # HT + 1720 403 28 -0.834 2.55910258118 -13.357628393 -10.1102180683 # OT + 1721 403 27 0.417 3.31605290845 -12.7717461164 -10.1102180683 # HT + 1722 403 27 0.417 1.80215225392 -12.7717461164 -10.1102180683 # HT + 1723 404 28 -0.834 0.0958974188157 -10.8944232307 -10.1102180683 # OT + 1724 404 27 0.417 0.852847746079 -10.308540954 -10.1102180683 # HT + 1725 404 27 0.417 -0.661052908448 -10.308540954 -10.1102180683 # HT + 1726 405 28 -0.834 0.0958974188157 -13.357628393 -7.64701290592 # OT + 1727 405 27 0.417 0.852847746079 -12.7717461164 -7.64701290592 # HT + 1728 405 27 0.417 -0.661052908448 -12.7717461164 -7.64701290592 # HT + 1729 406 28 -0.834 2.55910258118 -10.8944232307 -7.64701290592 # OT + 1730 406 27 0.417 3.31605290845 -10.308540954 -7.64701290592 # HT + 1731 406 27 0.417 1.80215225392 -10.308540954 -7.64701290592 # HT + 1732 407 28 -0.834 2.55910258118 -13.357628393 -5.18380774355 # OT + 1733 407 27 0.417 3.31605290845 -12.7717461164 -5.18380774355 # HT + 1734 407 27 0.417 1.80215225392 -12.7717461164 -5.18380774355 # HT + 1735 408 28 -0.834 0.0958974188157 -10.8944232307 -5.18380774355 # OT + 1736 408 27 0.417 0.852847746079 -10.308540954 -5.18380774355 # HT + 1737 408 27 0.417 -0.661052908448 -10.308540954 -5.18380774355 # HT + 1738 409 28 -0.834 0.0958974188157 -13.357628393 -2.72060258118 # OT + 1739 409 27 0.417 0.852847746079 -12.7717461164 -2.72060258118 # HT + 1740 409 27 0.417 -0.661052908448 -12.7717461164 -2.72060258118 # HT + 1741 410 28 -0.834 2.55910258118 -10.8944232307 -2.72060258118 # OT + 1742 410 27 0.417 3.31605290845 -10.308540954 -2.72060258118 # HT + 1743 410 27 0.417 1.80215225392 -10.308540954 -2.72060258118 # HT + 1744 411 28 -0.834 2.55910258118 -13.357628393 -0.257397418816 # OT + 1745 411 27 0.417 3.31605290845 -12.7717461164 -0.257397418816 # HT + 1746 411 27 0.417 1.80215225392 -12.7717461164 -0.257397418816 # HT + 1747 412 28 -0.834 0.0958974188157 -13.357628393 2.20580774355 # OT + 1748 412 27 0.417 0.852847746079 -12.7717461164 2.20580774355 # HT + 1749 412 27 0.417 -0.661052908448 -12.7717461164 2.20580774355 # HT + 1750 413 28 -0.834 2.55910258118 -10.8944232307 2.20580774355 # OT + 1751 413 27 0.417 3.31605290845 -10.308540954 2.20580774355 # HT + 1752 413 27 0.417 1.80215225392 -10.308540954 2.20580774355 # HT + 1753 414 28 -0.834 2.55910258118 -13.357628393 4.66901290592 # OT + 1754 414 27 0.417 3.31605290845 -12.7717461164 4.66901290592 # HT + 1755 414 27 0.417 1.80215225392 -12.7717461164 4.66901290592 # HT + 1756 415 28 -0.834 0.0958974188157 -10.8944232307 4.66901290592 # OT + 1757 415 27 0.417 0.852847746079 -10.308540954 4.66901290592 # HT + 1758 415 27 0.417 -0.661052908448 -10.308540954 4.66901290592 # HT + 1759 416 28 -0.834 0.0958974188157 -13.357628393 7.13221806829 # OT + 1760 416 27 0.417 0.852847746079 -12.7717461164 7.13221806829 # HT + 1761 416 27 0.417 -0.661052908448 -12.7717461164 7.13221806829 # HT + 1762 417 28 -0.834 2.55910258118 -10.8944232307 7.13221806829 # OT + 1763 417 27 0.417 3.31605290845 -10.308540954 7.13221806829 # HT + 1764 417 27 0.417 1.80215225392 -10.308540954 7.13221806829 # HT + 1765 418 28 -0.834 2.55910258118 -13.357628393 9.59542323066 # OT + 1766 418 27 0.417 3.31605290845 -12.7717461164 9.59542323066 # HT + 1767 418 27 0.417 1.80215225392 -12.7717461164 9.59542323066 # HT + 1768 419 28 -0.834 0.0958974188157 -10.8944232307 9.59542323066 # OT + 1769 419 27 0.417 0.852847746079 -10.308540954 9.59542323066 # HT + 1770 419 27 0.417 -0.661052908448 -10.308540954 9.59542323066 # HT + 1771 420 28 -0.834 0.0958974188157 -8.43121806829 -12.5734232307 # OT + 1772 420 27 0.417 0.852847746079 -7.84533579167 -12.5734232307 # HT + 1773 420 27 0.417 -0.661052908448 -7.84533579167 -12.5734232307 # HT + 1774 421 28 -0.834 2.55910258118 -8.43121806829 -10.1102180683 # OT + 1775 421 27 0.417 3.31605290845 -7.84533579167 -10.1102180683 # HT + 1776 421 27 0.417 1.80215225392 -7.84533579167 -10.1102180683 # HT + 1777 422 28 -0.834 2.55910258118 -8.43121806829 -5.18380774355 # OT + 1778 422 27 0.417 3.31605290845 -7.84533579167 -5.18380774355 # HT + 1779 422 27 0.417 1.80215225392 -7.84533579167 -5.18380774355 # HT + 1780 423 28 -0.834 0.0958974188157 -3.50480774355 -12.5734232307 # OT + 1781 423 27 0.417 0.852847746079 -2.91892546693 -12.5734232307 # HT + 1782 423 27 0.417 -0.661052908448 -2.91892546693 -12.5734232307 # HT + 1783 424 28 -0.834 2.55910258118 -1.04160258118 -12.5734232307 # OT + 1784 424 27 0.417 3.31605290845 -0.455720304566 -12.5734232307 # HT + 1785 424 27 0.417 1.80215225392 -0.455720304566 -12.5734232307 # HT + 1786 425 28 -0.834 0.0958974188157 1.42160258118 -12.5734232307 # OT + 1787 425 27 0.417 0.852847746079 2.0074848578 -12.5734232307 # HT + 1788 425 27 0.417 -0.661052908448 2.0074848578 -12.5734232307 # HT + 1789 426 28 -0.834 2.55910258118 3.88480774355 -12.5734232307 # OT + 1790 426 27 0.417 3.31605290845 4.47069002017 -12.5734232307 # HT + 1791 426 27 0.417 1.80215225392 4.47069002017 -12.5734232307 # HT + 1792 427 28 -0.834 0.0958974188157 3.88480774355 -10.1102180683 # OT + 1793 427 27 0.417 0.852847746079 4.47069002017 -10.1102180683 # HT + 1794 427 27 0.417 -0.661052908448 4.47069002017 -10.1102180683 # HT + 1795 428 28 -0.834 0.0958974188157 3.88480774355 9.59542323066 # OT + 1796 428 27 0.417 0.852847746079 4.47069002017 9.59542323066 # HT + 1797 428 27 0.417 -0.661052908448 4.47069002017 9.59542323066 # HT + 1798 429 28 -0.834 0.0958974188157 6.34801290592 -12.5734232307 # OT + 1799 429 27 0.417 0.852847746079 6.93389518254 -12.5734232307 # HT + 1800 429 27 0.417 -0.661052908448 6.93389518254 -12.5734232307 # HT + 1801 430 28 -0.834 2.55910258118 8.81121806829 -12.5734232307 # OT + 1802 430 27 0.417 3.31605290845 9.39710034491 -12.5734232307 # HT + 1803 430 27 0.417 1.80215225392 9.39710034491 -12.5734232307 # HT + 1804 431 30 1 2.55910258118 6.34801290592 -10.1102180683 # SOD + 1805 432 28 -0.834 0.0958974188157 8.81121806829 -10.1102180683 # OT + 1806 432 27 0.417 0.852847746079 9.39710034491 -10.1102180683 # HT + 1807 432 27 0.417 -0.661052908448 9.39710034491 -10.1102180683 # HT + 1808 433 28 -0.834 0.0958974188157 8.81121806829 4.66901290592 # OT + 1809 433 27 0.417 0.852847746079 9.39710034491 4.66901290592 # HT + 1810 433 27 0.417 -0.661052908448 9.39710034491 4.66901290592 # HT + 1811 434 28 -0.834 2.55910258118 8.81121806829 7.13221806829 # OT + 1812 434 27 0.417 3.31605290845 9.39710034491 7.13221806829 # HT + 1813 434 27 0.417 1.80215225392 9.39710034491 7.13221806829 # HT + 1814 435 28 -0.834 0.0958974188157 8.81121806829 9.59542323066 # OT + 1815 435 27 0.417 0.852847746079 9.39710034491 9.59542323066 # HT + 1816 435 27 0.417 -0.661052908448 9.39710034491 9.59542323066 # HT + 1817 436 28 -0.834 0.0958974188157 11.2744232307 -12.5734232307 # OT + 1818 436 27 0.417 0.852847746079 11.8603055073 -12.5734232307 # HT + 1819 436 27 0.417 -0.661052908448 11.8603055073 -12.5734232307 # HT + 1820 437 28 -0.834 2.55910258118 13.737628393 -12.5734232307 # OT + 1821 437 27 0.417 3.31605290845 14.3235106696 -12.5734232307 # HT + 1822 437 27 0.417 1.80215225392 14.3235106696 -12.5734232307 # HT + 1823 438 28 -0.834 2.55910258118 11.2744232307 -10.1102180683 # OT + 1824 438 27 0.417 3.31605290845 11.8603055073 -10.1102180683 # HT + 1825 438 27 0.417 1.80215225392 11.8603055073 -10.1102180683 # HT + 1826 439 28 -0.834 0.0958974188157 13.737628393 -10.1102180683 # OT + 1827 439 27 0.417 0.852847746079 14.3235106696 -10.1102180683 # HT + 1828 439 27 0.417 -0.661052908448 14.3235106696 -10.1102180683 # HT + 1829 440 28 -0.834 0.0958974188157 11.2744232307 -7.64701290592 # OT + 1830 440 27 0.417 0.852847746079 11.8603055073 -7.64701290592 # HT + 1831 440 27 0.417 -0.661052908448 11.8603055073 -7.64701290592 # HT + 1832 441 28 -0.834 2.55910258118 13.737628393 -7.64701290592 # OT + 1833 441 27 0.417 3.31605290845 14.3235106696 -7.64701290592 # HT + 1834 441 27 0.417 1.80215225392 14.3235106696 -7.64701290592 # HT + 1835 442 28 -0.834 2.55910258118 11.2744232307 -5.18380774355 # OT + 1836 442 27 0.417 3.31605290845 11.8603055073 -5.18380774355 # HT + 1837 442 27 0.417 1.80215225392 11.8603055073 -5.18380774355 # HT + 1838 443 28 -0.834 0.0958974188157 13.737628393 -5.18380774355 # OT + 1839 443 27 0.417 0.852847746079 14.3235106696 -5.18380774355 # HT + 1840 443 27 0.417 -0.661052908448 14.3235106696 -5.18380774355 # HT + 1841 444 28 -0.834 2.55910258118 13.737628393 -2.72060258118 # OT + 1842 444 27 0.417 3.31605290845 14.3235106696 -2.72060258118 # HT + 1843 444 27 0.417 1.80215225392 14.3235106696 -2.72060258118 # HT + 1844 445 28 -0.834 0.0958974188157 13.737628393 4.66901290592 # OT + 1845 445 27 0.417 0.852847746079 14.3235106696 4.66901290592 # HT + 1846 445 27 0.417 -0.661052908448 14.3235106696 4.66901290592 # HT + 1847 446 28 -0.834 0.0958974188157 11.2744232307 7.13221806829 # OT + 1848 446 27 0.417 0.852847746079 11.8603055073 7.13221806829 # HT + 1849 446 27 0.417 -0.661052908448 11.8603055073 7.13221806829 # HT + 1850 447 28 -0.834 2.55910258118 13.737628393 7.13221806829 # OT + 1851 447 27 0.417 3.31605290845 14.3235106696 7.13221806829 # HT + 1852 447 27 0.417 1.80215225392 14.3235106696 7.13221806829 # HT + 1853 448 28 -0.834 2.55910258118 11.2744232307 9.59542323066 # OT + 1854 448 27 0.417 3.31605290845 11.8603055073 9.59542323066 # HT + 1855 448 27 0.417 1.80215225392 11.8603055073 9.59542323066 # HT + 1856 449 28 -0.834 0.0958974188157 13.737628393 9.59542323066 # OT + 1857 449 27 0.417 0.852847746079 14.3235106696 9.59542323066 # HT + 1858 449 27 0.417 -0.661052908448 14.3235106696 9.59542323066 # HT + 1859 450 28 -0.834 5.02230774355 -13.357628393 -12.5734232307 # OT + 1860 450 27 0.417 5.77925807082 -12.7717461164 -12.5734232307 # HT + 1861 450 27 0.417 4.26535741629 -12.7717461164 -12.5734232307 # HT + 1862 451 28 -0.834 7.48551290592 -10.8944232307 -12.5734232307 # OT + 1863 451 27 0.417 8.24246323319 -10.308540954 -12.5734232307 # HT + 1864 451 27 0.417 6.72856257866 -10.308540954 -12.5734232307 # HT + 1865 452 28 -0.834 7.48551290592 -13.357628393 -10.1102180683 # OT + 1866 452 27 0.417 8.24246323319 -12.7717461164 -10.1102180683 # HT + 1867 452 27 0.417 6.72856257866 -12.7717461164 -10.1102180683 # HT + 1868 453 28 -0.834 5.02230774355 -10.8944232307 -10.1102180683 # OT + 1869 453 27 0.417 5.77925807082 -10.308540954 -10.1102180683 # HT + 1870 453 27 0.417 4.26535741629 -10.308540954 -10.1102180683 # HT + 1871 454 28 -0.834 5.02230774355 -13.357628393 -7.64701290592 # OT + 1872 454 27 0.417 5.77925807082 -12.7717461164 -7.64701290592 # HT + 1873 454 27 0.417 4.26535741629 -12.7717461164 -7.64701290592 # HT + 1874 455 28 -0.834 7.48551290592 -10.8944232307 -7.64701290592 # OT + 1875 455 27 0.417 8.24246323319 -10.308540954 -7.64701290592 # HT + 1876 455 27 0.417 6.72856257866 -10.308540954 -7.64701290592 # HT + 1877 456 28 -0.834 7.48551290592 -13.357628393 -5.18380774355 # OT + 1878 456 27 0.417 8.24246323319 -12.7717461164 -5.18380774355 # HT + 1879 456 27 0.417 6.72856257866 -12.7717461164 -5.18380774355 # HT + 1880 457 28 -0.834 5.02230774355 -10.8944232307 -5.18380774355 # OT + 1881 457 27 0.417 5.77925807082 -10.308540954 -5.18380774355 # HT + 1882 457 27 0.417 4.26535741629 -10.308540954 -5.18380774355 # HT + 1883 458 28 -0.834 5.02230774355 -13.357628393 -2.72060258118 # OT + 1884 458 27 0.417 5.77925807082 -12.7717461164 -2.72060258118 # HT + 1885 458 27 0.417 4.26535741629 -12.7717461164 -2.72060258118 # HT + 1886 459 28 -0.834 7.48551290592 -10.8944232307 -2.72060258118 # OT + 1887 459 27 0.417 8.24246323319 -10.308540954 -2.72060258118 # HT + 1888 459 27 0.417 6.72856257866 -10.308540954 -2.72060258118 # HT + 1889 460 28 -0.834 7.48551290592 -13.357628393 -0.257397418816 # OT + 1890 460 27 0.417 8.24246323319 -12.7717461164 -0.257397418816 # HT + 1891 460 27 0.417 6.72856257866 -12.7717461164 -0.257397418816 # HT + 1892 461 28 -0.834 5.02230774355 -13.357628393 2.20580774355 # OT + 1893 461 27 0.417 5.77925807082 -12.7717461164 2.20580774355 # HT + 1894 461 27 0.417 4.26535741629 -12.7717461164 2.20580774355 # HT + 1895 462 28 -0.834 7.48551290592 -10.8944232307 2.20580774355 # OT + 1896 462 27 0.417 8.24246323319 -10.308540954 2.20580774355 # HT + 1897 462 27 0.417 6.72856257866 -10.308540954 2.20580774355 # HT + 1898 463 28 -0.834 7.48551290592 -13.357628393 4.66901290592 # OT + 1899 463 27 0.417 8.24246323319 -12.7717461164 4.66901290592 # HT + 1900 463 27 0.417 6.72856257866 -12.7717461164 4.66901290592 # HT + 1901 464 28 -0.834 5.02230774355 -10.8944232307 4.66901290592 # OT + 1902 464 27 0.417 5.77925807082 -10.308540954 4.66901290592 # HT + 1903 464 27 0.417 4.26535741629 -10.308540954 4.66901290592 # HT + 1904 465 28 -0.834 5.02230774355 -13.357628393 7.13221806829 # OT + 1905 465 27 0.417 5.77925807082 -12.7717461164 7.13221806829 # HT + 1906 465 27 0.417 4.26535741629 -12.7717461164 7.13221806829 # HT + 1907 466 28 -0.834 7.48551290592 -10.8944232307 7.13221806829 # OT + 1908 466 27 0.417 8.24246323319 -10.308540954 7.13221806829 # HT + 1909 466 27 0.417 6.72856257866 -10.308540954 7.13221806829 # HT + 1910 467 28 -0.834 7.48551290592 -13.357628393 9.59542323066 # OT + 1911 467 27 0.417 8.24246323319 -12.7717461164 9.59542323066 # HT + 1912 467 27 0.417 6.72856257866 -12.7717461164 9.59542323066 # HT + 1913 468 28 -0.834 5.02230774355 -10.8944232307 9.59542323066 # OT + 1914 468 27 0.417 5.77925807082 -10.308540954 9.59542323066 # HT + 1915 468 27 0.417 4.26535741629 -10.308540954 9.59542323066 # HT + 1916 469 28 -0.834 5.02230774355 -8.43121806829 -12.5734232307 # OT + 1917 469 27 0.417 5.77925807082 -7.84533579167 -12.5734232307 # HT + 1918 469 27 0.417 4.26535741629 -7.84533579167 -12.5734232307 # HT + 1919 470 28 -0.834 7.48551290592 -8.43121806829 -10.1102180683 # OT + 1920 470 27 0.417 8.24246323319 -7.84533579167 -10.1102180683 # HT + 1921 470 27 0.417 6.72856257866 -7.84533579167 -10.1102180683 # HT + 1922 471 28 -0.834 5.02230774355 -5.96801290592 -10.1102180683 # OT + 1923 471 27 0.417 5.77925807082 -5.3821306293 -10.1102180683 # HT + 1924 471 27 0.417 4.26535741629 -5.3821306293 -10.1102180683 # HT + 1925 472 28 -0.834 5.02230774355 -8.43121806829 -7.64701290592 # OT + 1926 472 27 0.417 5.77925807082 -7.84533579167 -7.64701290592 # HT + 1927 472 27 0.417 4.26535741629 -7.84533579167 -7.64701290592 # HT + 1928 473 28 -0.834 7.48551290592 -8.43121806829 9.59542323066 # OT + 1929 473 27 0.417 8.24246323319 -7.84533579167 9.59542323066 # HT + 1930 473 27 0.417 6.72856257866 -7.84533579167 9.59542323066 # HT + 1931 474 28 -0.834 5.02230774355 -1.04160258118 9.59542323066 # OT + 1932 474 27 0.417 5.77925807082 -0.455720304566 9.59542323066 # HT + 1933 474 27 0.417 4.26535741629 -0.455720304566 9.59542323066 # HT + 1934 475 28 -0.834 5.02230774355 1.42160258118 -12.5734232307 # OT + 1935 475 27 0.417 5.77925807082 2.0074848578 -12.5734232307 # HT + 1936 475 27 0.417 4.26535741629 2.0074848578 -12.5734232307 # HT + 1937 476 28 -0.834 7.48551290592 3.88480774355 -12.5734232307 # OT + 1938 476 27 0.417 8.24246323319 4.47069002017 -12.5734232307 # HT + 1939 476 27 0.417 6.72856257866 4.47069002017 -12.5734232307 # HT + 1940 477 28 -0.834 7.48551290592 1.42160258118 9.59542323066 # OT + 1941 477 27 0.417 8.24246323319 2.0074848578 9.59542323066 # HT + 1942 477 27 0.417 6.72856257866 2.0074848578 9.59542323066 # HT + 1943 478 28 -0.834 5.02230774355 6.34801290592 -12.5734232307 # OT + 1944 478 27 0.417 5.77925807082 6.93389518254 -12.5734232307 # HT + 1945 478 27 0.417 4.26535741629 6.93389518254 -12.5734232307 # HT + 1946 479 28 -0.834 7.48551290592 8.81121806829 -12.5734232307 # OT + 1947 479 27 0.417 8.24246323319 9.39710034491 -12.5734232307 # HT + 1948 479 27 0.417 6.72856257866 9.39710034491 -12.5734232307 # HT + 1949 480 28 -0.834 7.48551290592 6.34801290592 -10.1102180683 # OT + 1950 480 27 0.417 8.24246323319 6.93389518254 -10.1102180683 # HT + 1951 480 27 0.417 6.72856257866 6.93389518254 -10.1102180683 # HT + 1952 481 28 -0.834 5.02230774355 8.81121806829 -10.1102180683 # OT + 1953 481 27 0.417 5.77925807082 9.39710034491 -10.1102180683 # HT + 1954 481 27 0.417 4.26535741629 9.39710034491 -10.1102180683 # HT + 1955 482 28 -0.834 7.48551290592 8.81121806829 -7.64701290592 # OT + 1956 482 27 0.417 8.24246323319 9.39710034491 -7.64701290592 # HT + 1957 482 27 0.417 6.72856257866 9.39710034491 -7.64701290592 # HT + 1958 483 28 -0.834 7.48551290592 6.34801290592 9.59542323066 # OT + 1959 483 27 0.417 8.24246323319 6.93389518254 9.59542323066 # HT + 1960 483 27 0.417 6.72856257866 6.93389518254 9.59542323066 # HT + 1961 484 28 -0.834 5.02230774355 8.81121806829 9.59542323066 # OT + 1962 484 27 0.417 5.77925807082 9.39710034491 9.59542323066 # HT + 1963 484 27 0.417 4.26535741629 9.39710034491 9.59542323066 # HT + 1964 485 28 -0.834 5.02230774355 11.2744232307 -12.5734232307 # OT + 1965 485 27 0.417 5.77925807082 11.8603055073 -12.5734232307 # HT + 1966 485 27 0.417 4.26535741629 11.8603055073 -12.5734232307 # HT + 1967 486 28 -0.834 7.48551290592 13.737628393 -12.5734232307 # OT + 1968 486 27 0.417 8.24246323319 14.3235106696 -12.5734232307 # HT + 1969 486 27 0.417 6.72856257866 14.3235106696 -12.5734232307 # HT + 1970 487 28 -0.834 7.48551290592 11.2744232307 -10.1102180683 # OT + 1971 487 27 0.417 8.24246323319 11.8603055073 -10.1102180683 # HT + 1972 487 27 0.417 6.72856257866 11.8603055073 -10.1102180683 # HT + 1973 488 28 -0.834 5.02230774355 13.737628393 -10.1102180683 # OT + 1974 488 27 0.417 5.77925807082 14.3235106696 -10.1102180683 # HT + 1975 488 27 0.417 4.26535741629 14.3235106696 -10.1102180683 # HT + 1976 489 28 -0.834 5.02230774355 11.2744232307 -7.64701290592 # OT + 1977 489 27 0.417 5.77925807082 11.8603055073 -7.64701290592 # HT + 1978 489 27 0.417 4.26535741629 11.8603055073 -7.64701290592 # HT + 1979 490 28 -0.834 7.48551290592 13.737628393 -7.64701290592 # OT + 1980 490 27 0.417 8.24246323319 14.3235106696 -7.64701290592 # HT + 1981 490 27 0.417 6.72856257866 14.3235106696 -7.64701290592 # HT + 1982 491 28 -0.834 7.48551290592 11.2744232307 -5.18380774355 # OT + 1983 491 27 0.417 8.24246323319 11.8603055073 -5.18380774355 # HT + 1984 491 27 0.417 6.72856257866 11.8603055073 -5.18380774355 # HT + 1985 492 28 -0.834 5.02230774355 13.737628393 -5.18380774355 # OT + 1986 492 27 0.417 5.77925807082 14.3235106696 -5.18380774355 # HT + 1987 492 27 0.417 4.26535741629 14.3235106696 -5.18380774355 # HT + 1988 493 28 -0.834 5.02230774355 11.2744232307 -2.72060258118 # OT + 1989 493 27 0.417 5.77925807082 11.8603055073 -2.72060258118 # HT + 1990 493 27 0.417 4.26535741629 11.8603055073 -2.72060258118 # HT + 1991 494 28 -0.834 7.48551290592 13.737628393 -2.72060258118 # OT + 1992 494 27 0.417 8.24246323319 14.3235106696 -2.72060258118 # HT + 1993 494 27 0.417 6.72856257866 14.3235106696 -2.72060258118 # HT + 1994 495 28 -0.834 7.48551290592 13.737628393 2.20580774355 # OT + 1995 495 27 0.417 8.24246323319 14.3235106696 2.20580774355 # HT + 1996 495 27 0.417 6.72856257866 14.3235106696 2.20580774355 # HT + 1997 496 28 -0.834 5.02230774355 13.737628393 4.66901290592 # OT + 1998 496 27 0.417 5.77925807082 14.3235106696 4.66901290592 # HT + 1999 496 27 0.417 4.26535741629 14.3235106696 4.66901290592 # HT + 2000 497 28 -0.834 7.48551290592 13.737628393 7.13221806829 # OT + 2001 497 27 0.417 8.24246323319 14.3235106696 7.13221806829 # HT + 2002 497 27 0.417 6.72856257866 14.3235106696 7.13221806829 # HT + 2003 498 28 -0.834 7.48551290592 11.2744232307 9.59542323066 # OT + 2004 498 27 0.417 8.24246323319 11.8603055073 9.59542323066 # HT + 2005 498 27 0.417 6.72856257866 11.8603055073 9.59542323066 # HT + 2006 499 28 -0.834 5.02230774355 13.737628393 9.59542323066 # OT + 2007 499 27 0.417 5.77925807082 14.3235106696 9.59542323066 # HT + 2008 499 27 0.417 4.26535741629 14.3235106696 9.59542323066 # HT + 2009 500 28 -0.834 9.94871806829 -13.357628393 -12.5734232307 # OT + 2010 500 27 0.417 10.7056683956 -12.7717461164 -12.5734232307 # HT + 2011 500 27 0.417 9.19176774103 -12.7717461164 -12.5734232307 # HT + 2012 501 28 -0.834 12.4119232307 -10.8944232307 -12.5734232307 # OT + 2013 501 27 0.417 13.1688735579 -10.308540954 -12.5734232307 # HT + 2014 501 27 0.417 11.6549729034 -10.308540954 -12.5734232307 # HT + 2015 502 28 -0.834 12.4119232307 -13.357628393 -10.1102180683 # OT + 2016 502 27 0.417 13.1688735579 -12.7717461164 -10.1102180683 # HT + 2017 502 27 0.417 11.6549729034 -12.7717461164 -10.1102180683 # HT + 2018 503 28 -0.834 9.94871806829 -10.8944232307 -10.1102180683 # OT + 2019 503 27 0.417 10.7056683956 -10.308540954 -10.1102180683 # HT + 2020 503 27 0.417 9.19176774103 -10.308540954 -10.1102180683 # HT + 2021 504 28 -0.834 9.94871806829 -13.357628393 -7.64701290592 # OT + 2022 504 27 0.417 10.7056683956 -12.7717461164 -7.64701290592 # HT + 2023 504 27 0.417 9.19176774103 -12.7717461164 -7.64701290592 # HT + 2024 505 28 -0.834 12.4119232307 -10.8944232307 -7.64701290592 # OT + 2025 505 27 0.417 13.1688735579 -10.308540954 -7.64701290592 # HT + 2026 505 27 0.417 11.6549729034 -10.308540954 -7.64701290592 # HT + 2027 506 28 -0.834 12.4119232307 -13.357628393 -5.18380774355 # OT + 2028 506 27 0.417 13.1688735579 -12.7717461164 -5.18380774355 # HT + 2029 506 27 0.417 11.6549729034 -12.7717461164 -5.18380774355 # HT + 2030 507 28 -0.834 9.94871806829 -10.8944232307 -5.18380774355 # OT + 2031 507 27 0.417 10.7056683956 -10.308540954 -5.18380774355 # HT + 2032 507 27 0.417 9.19176774103 -10.308540954 -5.18380774355 # HT + 2033 508 28 -0.834 9.94871806829 -13.357628393 -2.72060258118 # OT + 2034 508 27 0.417 10.7056683956 -12.7717461164 -2.72060258118 # HT + 2035 508 27 0.417 9.19176774103 -12.7717461164 -2.72060258118 # HT + 2036 509 28 -0.834 12.4119232307 -10.8944232307 -2.72060258118 # OT + 2037 509 27 0.417 13.1688735579 -10.308540954 -2.72060258118 # HT + 2038 509 27 0.417 11.6549729034 -10.308540954 -2.72060258118 # HT + 2039 510 28 -0.834 12.4119232307 -13.357628393 -0.257397418816 # OT + 2040 510 27 0.417 13.1688735579 -12.7717461164 -0.257397418816 # HT + 2041 510 27 0.417 11.6549729034 -12.7717461164 -0.257397418816 # HT + 2042 511 28 -0.834 9.94871806829 -10.8944232307 -0.257397418816 # OT + 2043 511 27 0.417 10.7056683956 -10.308540954 -0.257397418816 # HT + 2044 511 27 0.417 9.19176774103 -10.308540954 -0.257397418816 # HT + 2045 512 28 -0.834 9.94871806829 -13.357628393 2.20580774355 # OT + 2046 512 27 0.417 10.7056683956 -12.7717461164 2.20580774355 # HT + 2047 512 27 0.417 9.19176774103 -12.7717461164 2.20580774355 # HT + 2048 513 28 -0.834 12.4119232307 -10.8944232307 2.20580774355 # OT + 2049 513 27 0.417 13.1688735579 -10.308540954 2.20580774355 # HT + 2050 513 27 0.417 11.6549729034 -10.308540954 2.20580774355 # HT + 2051 514 28 -0.834 12.4119232307 -13.357628393 4.66901290592 # OT + 2052 514 27 0.417 13.1688735579 -12.7717461164 4.66901290592 # HT + 2053 514 27 0.417 11.6549729034 -12.7717461164 4.66901290592 # HT + 2054 515 28 -0.834 9.94871806829 -10.8944232307 4.66901290592 # OT + 2055 515 27 0.417 10.7056683956 -10.308540954 4.66901290592 # HT + 2056 515 27 0.417 9.19176774103 -10.308540954 4.66901290592 # HT + 2057 516 28 -0.834 9.94871806829 -13.357628393 7.13221806829 # OT + 2058 516 27 0.417 10.7056683956 -12.7717461164 7.13221806829 # HT + 2059 516 27 0.417 9.19176774103 -12.7717461164 7.13221806829 # HT + 2060 517 28 -0.834 12.4119232307 -10.8944232307 7.13221806829 # OT + 2061 517 27 0.417 13.1688735579 -10.308540954 7.13221806829 # HT + 2062 517 27 0.417 11.6549729034 -10.308540954 7.13221806829 # HT + 2063 518 28 -0.834 12.4119232307 -13.357628393 9.59542323066 # OT + 2064 518 27 0.417 13.1688735579 -12.7717461164 9.59542323066 # HT + 2065 518 27 0.417 11.6549729034 -12.7717461164 9.59542323066 # HT + 2066 519 28 -0.834 9.94871806829 -10.8944232307 9.59542323066 # OT + 2067 519 27 0.417 10.7056683956 -10.308540954 9.59542323066 # HT + 2068 519 27 0.417 9.19176774103 -10.308540954 9.59542323066 # HT + 2069 520 28 -0.834 9.94871806829 -8.43121806829 -12.5734232307 # OT + 2070 520 27 0.417 10.7056683956 -7.84533579167 -12.5734232307 # HT + 2071 520 27 0.417 9.19176774103 -7.84533579167 -12.5734232307 # HT + 2072 521 28 -0.834 12.4119232307 -5.96801290592 -12.5734232307 # OT + 2073 521 27 0.417 13.1688735579 -5.3821306293 -12.5734232307 # HT + 2074 521 27 0.417 11.6549729034 -5.3821306293 -12.5734232307 # HT + 2075 522 28 -0.834 12.4119232307 -8.43121806829 -10.1102180683 # OT + 2076 522 27 0.417 13.1688735579 -7.84533579167 -10.1102180683 # HT + 2077 522 27 0.417 11.6549729034 -7.84533579167 -10.1102180683 # HT + 2078 523 28 -0.834 9.94871806829 -5.96801290592 -10.1102180683 # OT + 2079 523 27 0.417 10.7056683956 -5.3821306293 -10.1102180683 # HT + 2080 523 27 0.417 9.19176774103 -5.3821306293 -10.1102180683 # HT + 2081 524 28 -0.834 9.94871806829 -8.43121806829 -7.64701290592 # OT + 2082 524 27 0.417 10.7056683956 -7.84533579167 -7.64701290592 # HT + 2083 524 27 0.417 9.19176774103 -7.84533579167 -7.64701290592 # HT + 2084 525 28 -0.834 12.4119232307 -5.96801290592 -7.64701290592 # OT + 2085 525 27 0.417 13.1688735579 -5.3821306293 -7.64701290592 # HT + 2086 525 27 0.417 11.6549729034 -5.3821306293 -7.64701290592 # HT + 2087 526 28 -0.834 12.4119232307 -8.43121806829 -5.18380774355 # OT + 2088 526 27 0.417 13.1688735579 -7.84533579167 -5.18380774355 # HT + 2089 526 27 0.417 11.6549729034 -7.84533579167 -5.18380774355 # HT + 2090 527 28 -0.834 12.4119232307 -8.43121806829 9.59542323066 # OT + 2091 527 27 0.417 13.1688735579 -7.84533579167 9.59542323066 # HT + 2092 527 27 0.417 11.6549729034 -7.84533579167 9.59542323066 # HT + 2093 528 28 -0.834 9.94871806829 -5.96801290592 9.59542323066 # OT + 2094 528 27 0.417 10.7056683956 -5.3821306293 9.59542323066 # HT + 2095 528 27 0.417 9.19176774103 -5.3821306293 9.59542323066 # HT + 2096 529 28 -0.834 9.94871806829 -3.50480774355 -12.5734232307 # OT + 2097 529 27 0.417 10.7056683956 -2.91892546693 -12.5734232307 # HT + 2098 529 27 0.417 9.19176774103 -2.91892546693 -12.5734232307 # HT + 2099 530 28 -0.834 12.4119232307 -1.04160258118 -12.5734232307 # OT + 2100 530 27 0.417 13.1688735579 -0.455720304566 -12.5734232307 # HT + 2101 530 27 0.417 11.6549729034 -0.455720304566 -12.5734232307 # HT + 2102 531 28 -0.834 12.4119232307 -3.50480774355 -10.1102180683 # OT + 2103 531 27 0.417 13.1688735579 -2.91892546693 -10.1102180683 # HT + 2104 531 27 0.417 11.6549729034 -2.91892546693 -10.1102180683 # HT + 2105 532 28 -0.834 9.94871806829 1.42160258118 -12.5734232307 # OT + 2106 532 27 0.417 10.7056683956 2.0074848578 -12.5734232307 # HT + 2107 532 27 0.417 9.19176774103 2.0074848578 -12.5734232307 # HT + 2108 533 28 -0.834 12.4119232307 3.88480774355 -12.5734232307 # OT + 2109 533 27 0.417 13.1688735579 4.47069002017 -12.5734232307 # HT + 2110 533 27 0.417 11.6549729034 4.47069002017 -12.5734232307 # HT + 2111 534 28 -0.834 12.4119232307 1.42160258118 -10.1102180683 # OT + 2112 534 27 0.417 13.1688735579 2.0074848578 -10.1102180683 # HT + 2113 534 27 0.417 11.6549729034 2.0074848578 -10.1102180683 # HT + 2114 535 28 -0.834 9.94871806829 3.88480774355 -10.1102180683 # OT + 2115 535 27 0.417 10.7056683956 4.47069002017 -10.1102180683 # HT + 2116 535 27 0.417 9.19176774103 4.47069002017 -10.1102180683 # HT + 2117 536 28 -0.834 12.4119232307 1.42160258118 9.59542323066 # OT + 2118 536 27 0.417 13.1688735579 2.0074848578 9.59542323066 # HT + 2119 536 27 0.417 11.6549729034 2.0074848578 9.59542323066 # HT + 2120 537 28 -0.834 9.94871806829 3.88480774355 9.59542323066 # OT + 2121 537 27 0.417 10.7056683956 4.47069002017 9.59542323066 # HT + 2122 537 27 0.417 9.19176774103 4.47069002017 9.59542323066 # HT + 2123 538 28 -0.834 9.94871806829 6.34801290592 -12.5734232307 # OT + 2124 538 27 0.417 10.7056683956 6.93389518254 -12.5734232307 # HT + 2125 538 27 0.417 9.19176774103 6.93389518254 -12.5734232307 # HT + 2126 539 28 -0.834 12.4119232307 8.81121806829 -12.5734232307 # OT + 2127 539 27 0.417 13.1688735579 9.39710034491 -12.5734232307 # HT + 2128 539 27 0.417 11.6549729034 9.39710034491 -12.5734232307 # HT + 2129 540 28 -0.834 12.4119232307 6.34801290592 -10.1102180683 # OT + 2130 540 27 0.417 13.1688735579 6.93389518254 -10.1102180683 # HT + 2131 540 27 0.417 11.6549729034 6.93389518254 -10.1102180683 # HT + 2132 541 28 -0.834 9.94871806829 8.81121806829 -10.1102180683 # OT + 2133 541 27 0.417 10.7056683956 9.39710034491 -10.1102180683 # HT + 2134 541 27 0.417 9.19176774103 9.39710034491 -10.1102180683 # HT + 2135 542 28 -0.834 12.4119232307 8.81121806829 -7.64701290592 # OT + 2136 542 27 0.417 13.1688735579 9.39710034491 -7.64701290592 # HT + 2137 542 27 0.417 11.6549729034 9.39710034491 -7.64701290592 # HT + 2138 543 28 -0.834 12.4119232307 8.81121806829 -2.72060258118 # OT + 2139 543 27 0.417 13.1688735579 9.39710034491 -2.72060258118 # HT + 2140 543 27 0.417 11.6549729034 9.39710034491 -2.72060258118 # HT + 2141 544 28 -0.834 12.4119232307 8.81121806829 2.20580774355 # OT + 2142 544 27 0.417 13.1688735579 9.39710034491 2.20580774355 # HT + 2143 544 27 0.417 11.6549729034 9.39710034491 2.20580774355 # HT + 2144 545 28 -0.834 12.4119232307 8.81121806829 7.13221806829 # OT + 2145 545 27 0.417 13.1688735579 9.39710034491 7.13221806829 # HT + 2146 545 27 0.417 11.6549729034 9.39710034491 7.13221806829 # HT + 2147 546 28 -0.834 12.4119232307 6.34801290592 9.59542323066 # OT + 2148 546 27 0.417 13.1688735579 6.93389518254 9.59542323066 # HT + 2149 546 27 0.417 11.6549729034 6.93389518254 9.59542323066 # HT + 2150 547 28 -0.834 9.94871806829 8.81121806829 9.59542323066 # OT + 2151 547 27 0.417 10.7056683956 9.39710034491 9.59542323066 # HT + 2152 547 27 0.417 9.19176774103 9.39710034491 9.59542323066 # HT + 2153 548 28 -0.834 9.94871806829 11.2744232307 -12.5734232307 # OT + 2154 548 27 0.417 10.7056683956 11.8603055073 -12.5734232307 # HT + 2155 548 27 0.417 9.19176774103 11.8603055073 -12.5734232307 # HT + 2156 549 28 -0.834 12.4119232307 13.737628393 -12.5734232307 # OT + 2157 549 27 0.417 13.1688735579 14.3235106696 -12.5734232307 # HT + 2158 549 27 0.417 11.6549729034 14.3235106696 -12.5734232307 # HT + 2159 550 28 -0.834 12.4119232307 11.2744232307 -10.1102180683 # OT + 2160 550 27 0.417 13.1688735579 11.8603055073 -10.1102180683 # HT + 2161 550 27 0.417 11.6549729034 11.8603055073 -10.1102180683 # HT + 2162 551 28 -0.834 9.94871806829 13.737628393 -10.1102180683 # OT + 2163 551 27 0.417 10.7056683956 14.3235106696 -10.1102180683 # HT + 2164 551 27 0.417 9.19176774103 14.3235106696 -10.1102180683 # HT + 2165 552 28 -0.834 9.94871806829 11.2744232307 -7.64701290592 # OT + 2166 552 27 0.417 10.7056683956 11.8603055073 -7.64701290592 # HT + 2167 552 27 0.417 9.19176774103 11.8603055073 -7.64701290592 # HT + 2168 553 28 -0.834 12.4119232307 13.737628393 -7.64701290592 # OT + 2169 553 27 0.417 13.1688735579 14.3235106696 -7.64701290592 # HT + 2170 553 27 0.417 11.6549729034 14.3235106696 -7.64701290592 # HT + 2171 554 28 -0.834 12.4119232307 11.2744232307 -5.18380774355 # OT + 2172 554 27 0.417 13.1688735579 11.8603055073 -5.18380774355 # HT + 2173 554 27 0.417 11.6549729034 11.8603055073 -5.18380774355 # HT + 2174 555 28 -0.834 9.94871806829 13.737628393 -5.18380774355 # OT + 2175 555 27 0.417 10.7056683956 14.3235106696 -5.18380774355 # HT + 2176 555 27 0.417 9.19176774103 14.3235106696 -5.18380774355 # HT + 2177 556 28 -0.834 12.4119232307 13.737628393 -2.72060258118 # OT + 2178 556 27 0.417 13.1688735579 14.3235106696 -2.72060258118 # HT + 2179 556 27 0.417 11.6549729034 14.3235106696 -2.72060258118 # HT + 2180 557 28 -0.834 12.4119232307 11.2744232307 -0.257397418816 # OT + 2181 557 27 0.417 13.1688735579 11.8603055073 -0.257397418816 # HT + 2182 557 27 0.417 11.6549729034 11.8603055073 -0.257397418816 # HT + 2183 558 28 -0.834 9.94871806829 13.737628393 -0.257397418816 # OT + 2184 558 27 0.417 10.7056683956 14.3235106696 -0.257397418816 # HT + 2185 558 27 0.417 9.19176774103 14.3235106696 -0.257397418816 # HT + 2186 559 28 -0.834 12.4119232307 13.737628393 2.20580774355 # OT + 2187 559 27 0.417 13.1688735579 14.3235106696 2.20580774355 # HT + 2188 559 27 0.417 11.6549729034 14.3235106696 2.20580774355 # HT + 2189 560 28 -0.834 12.4119232307 11.2744232307 4.66901290592 # OT + 2190 560 27 0.417 13.1688735579 11.8603055073 4.66901290592 # HT + 2191 560 27 0.417 11.6549729034 11.8603055073 4.66901290592 # HT + 2192 561 28 -0.834 9.94871806829 13.737628393 4.66901290592 # OT + 2193 561 27 0.417 10.7056683956 14.3235106696 4.66901290592 # HT + 2194 561 27 0.417 9.19176774103 14.3235106696 4.66901290592 # HT + 2195 562 28 -0.834 9.94871806829 11.2744232307 7.13221806829 # OT + 2196 562 27 0.417 10.7056683956 11.8603055073 7.13221806829 # HT + 2197 562 27 0.417 9.19176774103 11.8603055073 7.13221806829 # HT + 2198 563 28 -0.834 12.4119232307 13.737628393 7.13221806829 # OT + 2199 563 27 0.417 13.1688735579 14.3235106696 7.13221806829 # HT + 2200 563 27 0.417 11.6549729034 14.3235106696 7.13221806829 # HT + 2201 564 28 -0.834 12.4119232307 11.2744232307 9.59542323066 # OT + 2202 564 27 0.417 13.1688735579 11.8603055073 9.59542323066 # HT + 2203 564 27 0.417 11.6549729034 11.8603055073 9.59542323066 # HT + 2204 565 28 -0.834 9.94871806829 13.737628393 9.59542323066 # OT + 2205 565 27 0.417 10.7056683956 14.3235106696 9.59542323066 # HT + 2206 565 27 0.417 9.19176774103 14.3235106696 9.59542323066 # HT + 2207 566 28 -0.834 14.875128393 -13.357628393 -12.5734232307 # OT + 2208 566 27 0.417 15.6320787203 -12.7717461164 -12.5734232307 # HT + 2209 566 27 0.417 14.1181780658 -12.7717461164 -12.5734232307 # HT + 2210 567 28 -0.834 17.3383335554 -10.8944232307 -12.5734232307 # OT + 2211 567 27 0.417 18.0952838827 -10.308540954 -12.5734232307 # HT + 2212 567 27 0.417 16.5813832281 -10.308540954 -12.5734232307 # HT + 2213 568 28 -0.834 17.3383335554 -13.357628393 -10.1102180683 # OT + 2214 568 27 0.417 18.0952838827 -12.7717461164 -10.1102180683 # HT + 2215 568 27 0.417 16.5813832281 -12.7717461164 -10.1102180683 # HT + 2216 569 28 -0.834 14.875128393 -10.8944232307 -10.1102180683 # OT + 2217 569 27 0.417 15.6320787203 -10.308540954 -10.1102180683 # HT + 2218 569 27 0.417 14.1181780658 -10.308540954 -10.1102180683 # HT + 2219 570 28 -0.834 14.875128393 -13.357628393 -7.64701290592 # OT + 2220 570 27 0.417 15.6320787203 -12.7717461164 -7.64701290592 # HT + 2221 570 27 0.417 14.1181780658 -12.7717461164 -7.64701290592 # HT + 2222 571 28 -0.834 17.3383335554 -10.8944232307 -7.64701290592 # OT + 2223 571 27 0.417 18.0952838827 -10.308540954 -7.64701290592 # HT + 2224 571 27 0.417 16.5813832281 -10.308540954 -7.64701290592 # HT + 2225 572 28 -0.834 17.3383335554 -13.357628393 -5.18380774355 # OT + 2226 572 27 0.417 18.0952838827 -12.7717461164 -5.18380774355 # HT + 2227 572 27 0.417 16.5813832281 -12.7717461164 -5.18380774355 # HT + 2228 573 28 -0.834 14.875128393 -10.8944232307 -5.18380774355 # OT + 2229 573 27 0.417 15.6320787203 -10.308540954 -5.18380774355 # HT + 2230 573 27 0.417 14.1181780658 -10.308540954 -5.18380774355 # HT + 2231 574 28 -0.834 14.875128393 -13.357628393 -2.72060258118 # OT + 2232 574 27 0.417 15.6320787203 -12.7717461164 -2.72060258118 # HT + 2233 574 27 0.417 14.1181780658 -12.7717461164 -2.72060258118 # HT + 2234 575 28 -0.834 17.3383335554 -10.8944232307 -2.72060258118 # OT + 2235 575 27 0.417 18.0952838827 -10.308540954 -2.72060258118 # HT + 2236 575 27 0.417 16.5813832281 -10.308540954 -2.72060258118 # HT + 2237 576 28 -0.834 17.3383335554 -13.357628393 -0.257397418816 # OT + 2238 576 27 0.417 18.0952838827 -12.7717461164 -0.257397418816 # HT + 2239 576 27 0.417 16.5813832281 -12.7717461164 -0.257397418816 # HT + 2240 577 28 -0.834 14.875128393 -10.8944232307 -0.257397418816 # OT + 2241 577 27 0.417 15.6320787203 -10.308540954 -0.257397418816 # HT + 2242 577 27 0.417 14.1181780658 -10.308540954 -0.257397418816 # HT + 2243 578 28 -0.834 14.875128393 -13.357628393 2.20580774355 # OT + 2244 578 27 0.417 15.6320787203 -12.7717461164 2.20580774355 # HT + 2245 578 27 0.417 14.1181780658 -12.7717461164 2.20580774355 # HT + 2246 579 28 -0.834 17.3383335554 -10.8944232307 2.20580774355 # OT + 2247 579 27 0.417 18.0952838827 -10.308540954 2.20580774355 # HT + 2248 579 27 0.417 16.5813832281 -10.308540954 2.20580774355 # HT + 2249 580 28 -0.834 17.3383335554 -13.357628393 4.66901290592 # OT + 2250 580 27 0.417 18.0952838827 -12.7717461164 4.66901290592 # HT + 2251 580 27 0.417 16.5813832281 -12.7717461164 4.66901290592 # HT + 2252 581 28 -0.834 14.875128393 -10.8944232307 4.66901290592 # OT + 2253 581 27 0.417 15.6320787203 -10.308540954 4.66901290592 # HT + 2254 581 27 0.417 14.1181780658 -10.308540954 4.66901290592 # HT + 2255 582 28 -0.834 14.875128393 -13.357628393 7.13221806829 # OT + 2256 582 27 0.417 15.6320787203 -12.7717461164 7.13221806829 # HT + 2257 582 27 0.417 14.1181780658 -12.7717461164 7.13221806829 # HT + 2258 583 28 -0.834 17.3383335554 -10.8944232307 7.13221806829 # OT + 2259 583 27 0.417 18.0952838827 -10.308540954 7.13221806829 # HT + 2260 583 27 0.417 16.5813832281 -10.308540954 7.13221806829 # HT + 2261 584 28 -0.834 17.3383335554 -13.357628393 9.59542323066 # OT + 2262 584 27 0.417 18.0952838827 -12.7717461164 9.59542323066 # HT + 2263 584 27 0.417 16.5813832281 -12.7717461164 9.59542323066 # HT + 2264 585 28 -0.834 14.875128393 -10.8944232307 9.59542323066 # OT + 2265 585 27 0.417 15.6320787203 -10.308540954 9.59542323066 # HT + 2266 585 27 0.417 14.1181780658 -10.308540954 9.59542323066 # HT + 2267 586 28 -0.834 14.875128393 -8.43121806829 -12.5734232307 # OT + 2268 586 27 0.417 15.6320787203 -7.84533579167 -12.5734232307 # HT + 2269 586 27 0.417 14.1181780658 -7.84533579167 -12.5734232307 # HT + 2270 587 28 -0.834 17.3383335554 -5.96801290592 -12.5734232307 # OT + 2271 587 27 0.417 18.0952838827 -5.3821306293 -12.5734232307 # HT + 2272 587 27 0.417 16.5813832281 -5.3821306293 -12.5734232307 # HT + 2273 588 28 -0.834 17.3383335554 -8.43121806829 -10.1102180683 # OT + 2274 588 27 0.417 18.0952838827 -7.84533579167 -10.1102180683 # HT + 2275 588 27 0.417 16.5813832281 -7.84533579167 -10.1102180683 # HT + 2276 589 28 -0.834 14.875128393 -5.96801290592 -10.1102180683 # OT + 2277 589 27 0.417 15.6320787203 -5.3821306293 -10.1102180683 # HT + 2278 589 27 0.417 14.1181780658 -5.3821306293 -10.1102180683 # HT + 2279 590 28 -0.834 14.875128393 -8.43121806829 -7.64701290592 # OT + 2280 590 27 0.417 15.6320787203 -7.84533579167 -7.64701290592 # HT + 2281 590 27 0.417 14.1181780658 -7.84533579167 -7.64701290592 # HT + 2282 591 28 -0.834 17.3383335554 -5.96801290592 -7.64701290592 # OT + 2283 591 27 0.417 18.0952838827 -5.3821306293 -7.64701290592 # HT + 2284 591 27 0.417 16.5813832281 -5.3821306293 -7.64701290592 # HT + 2285 592 28 -0.834 17.3383335554 -8.43121806829 -5.18380774355 # OT + 2286 592 27 0.417 18.0952838827 -7.84533579167 -5.18380774355 # HT + 2287 592 27 0.417 16.5813832281 -7.84533579167 -5.18380774355 # HT + 2288 593 28 -0.834 14.875128393 -8.43121806829 -2.72060258118 # OT + 2289 593 27 0.417 15.6320787203 -7.84533579167 -2.72060258118 # HT + 2290 593 27 0.417 14.1181780658 -7.84533579167 -2.72060258118 # HT + 2291 594 28 -0.834 17.3383335554 -8.43121806829 -0.257397418816 # OT + 2292 594 27 0.417 18.0952838827 -7.84533579167 -0.257397418816 # HT + 2293 594 27 0.417 16.5813832281 -7.84533579167 -0.257397418816 # HT + 2294 595 28 -0.834 17.3383335554 -8.43121806829 4.66901290592 # OT + 2295 595 27 0.417 18.0952838827 -7.84533579167 4.66901290592 # HT + 2296 595 27 0.417 16.5813832281 -7.84533579167 4.66901290592 # HT + 2297 596 28 -0.834 14.875128393 -8.43121806829 7.13221806829 # OT + 2298 596 27 0.417 15.6320787203 -7.84533579167 7.13221806829 # HT + 2299 596 27 0.417 14.1181780658 -7.84533579167 7.13221806829 # HT + 2300 597 28 -0.834 17.3383335554 -5.96801290592 7.13221806829 # OT + 2301 597 27 0.417 18.0952838827 -5.3821306293 7.13221806829 # HT + 2302 597 27 0.417 16.5813832281 -5.3821306293 7.13221806829 # HT + 2303 598 28 -0.834 17.3383335554 -8.43121806829 9.59542323066 # OT + 2304 598 27 0.417 18.0952838827 -7.84533579167 9.59542323066 # HT + 2305 598 27 0.417 16.5813832281 -7.84533579167 9.59542323066 # HT + 2306 599 28 -0.834 14.875128393 -5.96801290592 9.59542323066 # OT + 2307 599 27 0.417 15.6320787203 -5.3821306293 9.59542323066 # HT + 2308 599 27 0.417 14.1181780658 -5.3821306293 9.59542323066 # HT + 2309 600 28 -0.834 14.875128393 -3.50480774355 -12.5734232307 # OT + 2310 600 27 0.417 15.6320787203 -2.91892546693 -12.5734232307 # HT + 2311 600 27 0.417 14.1181780658 -2.91892546693 -12.5734232307 # HT + 2312 601 28 -0.834 17.3383335554 -1.04160258118 -12.5734232307 # OT + 2313 601 27 0.417 18.0952838827 -0.455720304566 -12.5734232307 # HT + 2314 601 27 0.417 16.5813832281 -0.455720304566 -12.5734232307 # HT + 2315 602 28 -0.834 17.3383335554 -3.50480774355 -10.1102180683 # OT + 2316 602 27 0.417 18.0952838827 -2.91892546693 -10.1102180683 # HT + 2317 602 27 0.417 16.5813832281 -2.91892546693 -10.1102180683 # HT + 2318 603 28 -0.834 14.875128393 -1.04160258118 -10.1102180683 # OT + 2319 603 27 0.417 15.6320787203 -0.455720304566 -10.1102180683 # HT + 2320 603 27 0.417 14.1181780658 -0.455720304566 -10.1102180683 # HT + 2321 604 28 -0.834 14.875128393 -3.50480774355 -7.64701290592 # OT + 2322 604 27 0.417 15.6320787203 -2.91892546693 -7.64701290592 # HT + 2323 604 27 0.417 14.1181780658 -2.91892546693 -7.64701290592 # HT + 2324 605 28 -0.834 17.3383335554 -1.04160258118 -7.64701290592 # OT + 2325 605 27 0.417 18.0952838827 -0.455720304566 -7.64701290592 # HT + 2326 605 27 0.417 16.5813832281 -0.455720304566 -7.64701290592 # HT + 2327 606 28 -0.834 14.875128393 -1.04160258118 -5.18380774355 # OT + 2328 606 27 0.417 15.6320787203 -0.455720304566 -5.18380774355 # HT + 2329 606 27 0.417 14.1181780658 -0.455720304566 -5.18380774355 # HT + 2330 607 28 -0.834 17.3383335554 -1.04160258118 -2.72060258118 # OT + 2331 607 27 0.417 18.0952838827 -0.455720304566 -2.72060258118 # HT + 2332 607 27 0.417 16.5813832281 -0.455720304566 -2.72060258118 # HT + 2333 608 28 -0.834 17.3383335554 -1.04160258118 7.13221806829 # OT + 2334 608 27 0.417 18.0952838827 -0.455720304566 7.13221806829 # HT + 2335 608 27 0.417 16.5813832281 -0.455720304566 7.13221806829 # HT + 2336 609 28 -0.834 17.3383335554 -3.50480774355 9.59542323066 # OT + 2337 609 27 0.417 18.0952838827 -2.91892546693 9.59542323066 # HT + 2338 609 27 0.417 16.5813832281 -2.91892546693 9.59542323066 # HT + 2339 610 28 -0.834 14.875128393 1.42160258118 -12.5734232307 # OT + 2340 610 27 0.417 15.6320787203 2.0074848578 -12.5734232307 # HT + 2341 610 27 0.417 14.1181780658 2.0074848578 -12.5734232307 # HT + 2342 611 28 -0.834 17.3383335554 3.88480774355 -12.5734232307 # OT + 2343 611 27 0.417 18.0952838827 4.47069002017 -12.5734232307 # HT + 2344 611 27 0.417 16.5813832281 4.47069002017 -12.5734232307 # HT + 2345 612 28 -0.834 17.3383335554 1.42160258118 -10.1102180683 # OT + 2346 612 27 0.417 18.0952838827 2.0074848578 -10.1102180683 # HT + 2347 612 27 0.417 16.5813832281 2.0074848578 -10.1102180683 # HT + 2348 613 28 -0.834 14.875128393 3.88480774355 -10.1102180683 # OT + 2349 613 27 0.417 15.6320787203 4.47069002017 -10.1102180683 # HT + 2350 613 27 0.417 14.1181780658 4.47069002017 -10.1102180683 # HT + 2351 614 28 -0.834 14.875128393 1.42160258118 -7.64701290592 # OT + 2352 614 27 0.417 15.6320787203 2.0074848578 -7.64701290592 # HT + 2353 614 27 0.417 14.1181780658 2.0074848578 -7.64701290592 # HT + 2354 615 28 -0.834 17.3383335554 3.88480774355 -7.64701290592 # OT + 2355 615 27 0.417 18.0952838827 4.47069002017 -7.64701290592 # HT + 2356 615 27 0.417 16.5813832281 4.47069002017 -7.64701290592 # HT + 2357 616 28 -0.834 17.3383335554 1.42160258118 -5.18380774355 # OT + 2358 616 27 0.417 18.0952838827 2.0074848578 -5.18380774355 # HT + 2359 616 27 0.417 16.5813832281 2.0074848578 -5.18380774355 # HT + 2360 617 28 -0.834 17.3383335554 3.88480774355 -2.72060258118 # OT + 2361 617 27 0.417 18.0952838827 4.47069002017 -2.72060258118 # HT + 2362 617 27 0.417 16.5813832281 4.47069002017 -2.72060258118 # HT + 2363 618 28 -0.834 17.3383335554 3.88480774355 2.20580774355 # OT + 2364 618 27 0.417 18.0952838827 4.47069002017 2.20580774355 # HT + 2365 618 27 0.417 16.5813832281 4.47069002017 2.20580774355 # HT + 2366 619 28 -0.834 17.3383335554 3.88480774355 7.13221806829 # OT + 2367 619 27 0.417 18.0952838827 4.47069002017 7.13221806829 # HT + 2368 619 27 0.417 16.5813832281 4.47069002017 7.13221806829 # HT + 2369 620 28 -0.834 17.3383335554 1.42160258118 9.59542323066 # OT + 2370 620 27 0.417 18.0952838827 2.0074848578 9.59542323066 # HT + 2371 620 27 0.417 16.5813832281 2.0074848578 9.59542323066 # HT + 2372 621 28 -0.834 14.875128393 3.88480774355 9.59542323066 # OT + 2373 621 27 0.417 15.6320787203 4.47069002017 9.59542323066 # HT + 2374 621 27 0.417 14.1181780658 4.47069002017 9.59542323066 # HT + 2375 622 28 -0.834 14.875128393 6.34801290592 -12.5734232307 # OT + 2376 622 27 0.417 15.6320787203 6.93389518254 -12.5734232307 # HT + 2377 622 27 0.417 14.1181780658 6.93389518254 -12.5734232307 # HT + 2378 623 28 -0.834 17.3383335554 8.81121806829 -12.5734232307 # OT + 2379 623 27 0.417 18.0952838827 9.39710034491 -12.5734232307 # HT + 2380 623 27 0.417 16.5813832281 9.39710034491 -12.5734232307 # HT + 2381 624 28 -0.834 17.3383335554 6.34801290592 -10.1102180683 # OT + 2382 624 27 0.417 18.0952838827 6.93389518254 -10.1102180683 # HT + 2383 624 27 0.417 16.5813832281 6.93389518254 -10.1102180683 # HT + 2384 625 28 -0.834 14.875128393 8.81121806829 -10.1102180683 # OT + 2385 625 27 0.417 15.6320787203 9.39710034491 -10.1102180683 # HT + 2386 625 27 0.417 14.1181780658 9.39710034491 -10.1102180683 # HT + 2387 626 28 -0.834 14.875128393 6.34801290592 -7.64701290592 # OT + 2388 626 27 0.417 15.6320787203 6.93389518254 -7.64701290592 # HT + 2389 626 27 0.417 14.1181780658 6.93389518254 -7.64701290592 # HT + 2390 627 28 -0.834 17.3383335554 8.81121806829 -7.64701290592 # OT + 2391 627 27 0.417 18.0952838827 9.39710034491 -7.64701290592 # HT + 2392 627 27 0.417 16.5813832281 9.39710034491 -7.64701290592 # HT + 2393 628 28 -0.834 17.3383335554 6.34801290592 -5.18380774355 # OT + 2394 628 27 0.417 18.0952838827 6.93389518254 -5.18380774355 # HT + 2395 628 27 0.417 16.5813832281 6.93389518254 -5.18380774355 # HT + 2396 629 28 -0.834 14.875128393 8.81121806829 -5.18380774355 # OT + 2397 629 27 0.417 15.6320787203 9.39710034491 -5.18380774355 # HT + 2398 629 27 0.417 14.1181780658 9.39710034491 -5.18380774355 # HT + 2399 630 28 -0.834 14.875128393 6.34801290592 -2.72060258118 # OT + 2400 630 27 0.417 15.6320787203 6.93389518254 -2.72060258118 # HT + 2401 630 27 0.417 14.1181780658 6.93389518254 -2.72060258118 # HT + 2402 631 28 -0.834 17.3383335554 8.81121806829 -2.72060258118 # OT + 2403 631 27 0.417 18.0952838827 9.39710034491 -2.72060258118 # HT + 2404 631 27 0.417 16.5813832281 9.39710034491 -2.72060258118 # HT + 2405 632 28 -0.834 17.3383335554 6.34801290592 -0.257397418816 # OT + 2406 632 27 0.417 18.0952838827 6.93389518254 -0.257397418816 # HT + 2407 632 27 0.417 16.5813832281 6.93389518254 -0.257397418816 # HT + 2408 633 28 -0.834 14.875128393 8.81121806829 -0.257397418816 # OT + 2409 633 27 0.417 15.6320787203 9.39710034491 -0.257397418816 # HT + 2410 633 27 0.417 14.1181780658 9.39710034491 -0.257397418816 # HT + 2411 634 28 -0.834 17.3383335554 8.81121806829 2.20580774355 # OT + 2412 634 27 0.417 18.0952838827 9.39710034491 2.20580774355 # HT + 2413 634 27 0.417 16.5813832281 9.39710034491 2.20580774355 # HT + 2414 635 28 -0.834 17.3383335554 6.34801290592 4.66901290592 # OT + 2415 635 27 0.417 18.0952838827 6.93389518254 4.66901290592 # HT + 2416 635 27 0.417 16.5813832281 6.93389518254 4.66901290592 # HT + 2417 636 28 -0.834 14.875128393 8.81121806829 4.66901290592 # OT + 2418 636 27 0.417 15.6320787203 9.39710034491 4.66901290592 # HT + 2419 636 27 0.417 14.1181780658 9.39710034491 4.66901290592 # HT + 2420 637 28 -0.834 14.875128393 6.34801290592 7.13221806829 # OT + 2421 637 27 0.417 15.6320787203 6.93389518254 7.13221806829 # HT + 2422 637 27 0.417 14.1181780658 6.93389518254 7.13221806829 # HT + 2423 638 28 -0.834 17.3383335554 8.81121806829 7.13221806829 # OT + 2424 638 27 0.417 18.0952838827 9.39710034491 7.13221806829 # HT + 2425 638 27 0.417 16.5813832281 9.39710034491 7.13221806829 # HT + 2426 639 28 -0.834 17.3383335554 6.34801290592 9.59542323066 # OT + 2427 639 27 0.417 18.0952838827 6.93389518254 9.59542323066 # HT + 2428 639 27 0.417 16.5813832281 6.93389518254 9.59542323066 # HT + 2429 640 28 -0.834 14.875128393 8.81121806829 9.59542323066 # OT + 2430 640 27 0.417 15.6320787203 9.39710034491 9.59542323066 # HT + 2431 640 27 0.417 14.1181780658 9.39710034491 9.59542323066 # HT + 2432 641 28 -0.834 14.875128393 11.2744232307 -12.5734232307 # OT + 2433 641 27 0.417 15.6320787203 11.8603055073 -12.5734232307 # HT + 2434 641 27 0.417 14.1181780658 11.8603055073 -12.5734232307 # HT + 2435 642 28 -0.834 17.3383335554 13.737628393 -12.5734232307 # OT + 2436 642 27 0.417 18.0952838827 14.3235106696 -12.5734232307 # HT + 2437 642 27 0.417 16.5813832281 14.3235106696 -12.5734232307 # HT + 2438 643 28 -0.834 17.3383335554 11.2744232307 -10.1102180683 # OT + 2439 643 27 0.417 18.0952838827 11.8603055073 -10.1102180683 # HT + 2440 643 27 0.417 16.5813832281 11.8603055073 -10.1102180683 # HT + 2441 644 28 -0.834 14.875128393 13.737628393 -10.1102180683 # OT + 2442 644 27 0.417 15.6320787203 14.3235106696 -10.1102180683 # HT + 2443 644 27 0.417 14.1181780658 14.3235106696 -10.1102180683 # HT + 2444 645 28 -0.834 14.875128393 11.2744232307 -7.64701290592 # OT + 2445 645 27 0.417 15.6320787203 11.8603055073 -7.64701290592 # HT + 2446 645 27 0.417 14.1181780658 11.8603055073 -7.64701290592 # HT + 2447 646 28 -0.834 17.3383335554 13.737628393 -7.64701290592 # OT + 2448 646 27 0.417 18.0952838827 14.3235106696 -7.64701290592 # HT + 2449 646 27 0.417 16.5813832281 14.3235106696 -7.64701290592 # HT + 2450 647 28 -0.834 17.3383335554 11.2744232307 -5.18380774355 # OT + 2451 647 27 0.417 18.0952838827 11.8603055073 -5.18380774355 # HT + 2452 647 27 0.417 16.5813832281 11.8603055073 -5.18380774355 # HT + 2453 648 28 -0.834 14.875128393 13.737628393 -5.18380774355 # OT + 2454 648 27 0.417 15.6320787203 14.3235106696 -5.18380774355 # HT + 2455 648 27 0.417 14.1181780658 14.3235106696 -5.18380774355 # HT + 2456 649 28 -0.834 14.875128393 11.2744232307 -2.72060258118 # OT + 2457 649 27 0.417 15.6320787203 11.8603055073 -2.72060258118 # HT + 2458 649 27 0.417 14.1181780658 11.8603055073 -2.72060258118 # HT + 2459 650 28 -0.834 17.3383335554 13.737628393 -2.72060258118 # OT + 2460 650 27 0.417 18.0952838827 14.3235106696 -2.72060258118 # HT + 2461 650 27 0.417 16.5813832281 14.3235106696 -2.72060258118 # HT + 2462 651 28 -0.834 17.3383335554 11.2744232307 -0.257397418816 # OT + 2463 651 27 0.417 18.0952838827 11.8603055073 -0.257397418816 # HT + 2464 651 27 0.417 16.5813832281 11.8603055073 -0.257397418816 # HT + 2465 652 28 -0.834 14.875128393 13.737628393 -0.257397418816 # OT + 2466 652 27 0.417 15.6320787203 14.3235106696 -0.257397418816 # HT + 2467 652 27 0.417 14.1181780658 14.3235106696 -0.257397418816 # HT + 2468 653 28 -0.834 14.875128393 11.2744232307 2.20580774355 # OT + 2469 653 27 0.417 15.6320787203 11.8603055073 2.20580774355 # HT + 2470 653 27 0.417 14.1181780658 11.8603055073 2.20580774355 # HT + 2471 654 28 -0.834 17.3383335554 13.737628393 2.20580774355 # OT + 2472 654 27 0.417 18.0952838827 14.3235106696 2.20580774355 # HT + 2473 654 27 0.417 16.5813832281 14.3235106696 2.20580774355 # HT + 2474 655 28 -0.834 17.3383335554 11.2744232307 4.66901290592 # OT + 2475 655 27 0.417 18.0952838827 11.8603055073 4.66901290592 # HT + 2476 655 27 0.417 16.5813832281 11.8603055073 4.66901290592 # HT + 2477 656 28 -0.834 14.875128393 13.737628393 4.66901290592 # OT + 2478 656 27 0.417 15.6320787203 14.3235106696 4.66901290592 # HT + 2479 656 27 0.417 14.1181780658 14.3235106696 4.66901290592 # HT + 2480 657 28 -0.834 14.875128393 11.2744232307 7.13221806829 # OT + 2481 657 27 0.417 15.6320787203 11.8603055073 7.13221806829 # HT + 2482 657 27 0.417 14.1181780658 11.8603055073 7.13221806829 # HT + 2483 658 28 -0.834 17.3383335554 13.737628393 7.13221806829 # OT + 2484 658 27 0.417 18.0952838827 14.3235106696 7.13221806829 # HT + 2485 658 27 0.417 16.5813832281 14.3235106696 7.13221806829 # HT + 2486 659 28 -0.834 17.3383335554 11.2744232307 9.59542323066 # OT + 2487 659 27 0.417 18.0952838827 11.8603055073 9.59542323066 # HT + 2488 659 27 0.417 16.5813832281 11.8603055073 9.59542323066 # HT + 2489 660 28 -0.834 14.875128393 13.737628393 9.59542323066 # OT + 2490 660 27 0.417 15.6320787203 14.3235106696 9.59542323066 # HT + 2491 660 27 0.417 14.1181780658 14.3235106696 9.59542323066 # HT + 2492 661 28 -0.834 19.8015387178 -13.357628393 -12.5734232307 # OT + 2493 661 27 0.417 20.558489045 -12.7717461164 -12.5734232307 # HT + 2494 661 27 0.417 19.0445883905 -12.7717461164 -12.5734232307 # HT + 2495 662 28 -0.834 22.2647438801 -10.8944232307 -12.5734232307 # OT + 2496 662 27 0.417 23.0216942074 -10.308540954 -12.5734232307 # HT + 2497 662 27 0.417 21.5077935529 -10.308540954 -12.5734232307 # HT 2498 663 28 -0.834 22.2647438801 -13.357628393 -10.1102180683 # OT 2499 663 27 0.417 23.0216942074 -12.7717461164 -10.1102180683 # HT 2500 663 27 0.417 21.5077935529 -12.7717461164 -10.1102180683 # HT @@ -3853,1078 +3854,1078 @@ Bonds 879 49 880 882 # HT OT 880 49 883 884 # HT OT 881 49 883 885 # HT OT - 882 49 886 887 # HT OT - 883 49 886 888 # HT OT - 884 49 889 890 # HT OT - 885 49 889 891 # HT OT - 886 49 892 893 # HT OT - 887 49 892 894 # HT OT - 888 49 895 896 # HT OT - 889 49 895 897 # HT OT - 890 49 898 899 # HT OT - 891 49 898 900 # HT OT - 892 49 901 902 # HT OT - 893 49 901 903 # HT OT - 894 49 904 905 # HT OT - 895 49 904 906 # HT OT - 896 49 907 908 # HT OT - 897 49 907 909 # HT OT - 898 49 910 911 # HT OT - 899 49 910 912 # HT OT - 900 49 913 914 # HT OT - 901 49 913 915 # HT OT - 902 49 916 917 # HT OT - 903 49 916 918 # HT OT - 904 49 919 920 # HT OT - 905 49 919 921 # HT OT - 906 49 922 923 # HT OT - 907 49 922 924 # HT OT - 908 49 925 926 # HT OT - 909 49 925 927 # HT OT - 910 49 928 929 # HT OT - 911 49 928 930 # HT OT - 912 49 931 932 # HT OT - 913 49 931 933 # HT OT - 914 49 934 935 # HT OT - 915 49 934 936 # HT OT - 916 49 937 938 # HT OT - 917 49 937 939 # HT OT - 918 49 940 941 # HT OT - 919 49 940 942 # HT OT - 920 49 943 944 # HT OT - 921 49 943 945 # HT OT - 922 49 946 947 # HT OT - 923 49 946 948 # HT OT - 924 49 949 950 # HT OT - 925 49 949 951 # HT OT - 926 49 952 953 # HT OT - 927 49 952 954 # HT OT - 928 49 955 956 # HT OT - 929 49 955 957 # HT OT - 930 49 958 959 # HT OT - 931 49 958 960 # HT OT - 932 49 961 962 # HT OT - 933 49 961 963 # HT OT - 934 49 964 965 # HT OT - 935 49 964 966 # HT OT - 936 49 967 968 # HT OT - 937 49 967 969 # HT OT - 938 49 970 971 # HT OT - 939 49 970 972 # HT OT - 940 49 973 974 # HT OT - 941 49 973 975 # HT OT - 942 49 976 977 # HT OT - 943 49 976 978 # HT OT - 944 49 979 980 # HT OT - 945 49 979 981 # HT OT - 946 49 982 983 # HT OT - 947 49 982 984 # HT OT - 948 49 985 986 # HT OT - 949 49 985 987 # HT OT - 950 49 988 989 # HT OT - 951 49 988 990 # HT OT - 952 49 991 992 # HT OT - 953 49 991 993 # HT OT - 954 49 994 995 # HT OT - 955 49 994 996 # HT OT - 956 49 997 998 # HT OT - 957 49 997 999 # HT OT - 958 49 1000 1001 # HT OT - 959 49 1000 1002 # HT OT - 960 49 1003 1004 # HT OT - 961 49 1003 1005 # HT OT - 962 49 1006 1007 # HT OT - 963 49 1006 1008 # HT OT - 964 49 1009 1010 # HT OT - 965 49 1009 1011 # HT OT - 966 49 1012 1013 # HT OT - 967 49 1012 1014 # HT OT - 968 49 1015 1016 # HT OT - 969 49 1015 1017 # HT OT - 970 49 1018 1019 # HT OT - 971 49 1018 1020 # HT OT - 972 49 1021 1022 # HT OT - 973 49 1021 1023 # HT OT - 974 49 1024 1025 # HT OT - 975 49 1024 1026 # HT OT - 976 49 1027 1028 # HT OT - 977 49 1027 1029 # HT OT - 978 49 1030 1031 # HT OT - 979 49 1030 1032 # HT OT - 980 49 1033 1034 # HT OT - 981 49 1033 1035 # HT OT - 982 49 1036 1037 # HT OT - 983 49 1036 1038 # HT OT - 984 49 1039 1040 # HT OT - 985 49 1039 1041 # HT OT - 986 49 1042 1043 # HT OT - 987 49 1042 1044 # HT OT - 988 49 1045 1046 # HT OT - 989 49 1045 1047 # HT OT - 990 49 1048 1049 # HT OT - 991 49 1048 1050 # HT OT - 992 49 1051 1052 # HT OT - 993 49 1051 1053 # HT OT - 994 49 1054 1055 # HT OT - 995 49 1054 1056 # HT OT - 996 49 1057 1058 # HT OT - 997 49 1057 1059 # HT OT - 998 49 1060 1061 # HT OT - 999 49 1060 1062 # HT OT - 1000 49 1063 1064 # HT OT - 1001 49 1063 1065 # HT OT - 1002 49 1066 1067 # HT OT - 1003 49 1066 1068 # HT OT - 1004 49 1069 1070 # HT OT - 1005 49 1069 1071 # HT OT - 1006 49 1072 1073 # HT OT - 1007 49 1072 1074 # HT OT - 1008 49 1075 1076 # HT OT - 1009 49 1075 1077 # HT OT - 1010 49 1078 1079 # HT OT - 1011 49 1078 1080 # HT OT - 1012 49 1081 1082 # HT OT - 1013 49 1081 1083 # HT OT - 1014 49 1084 1085 # HT OT - 1015 49 1084 1086 # HT OT - 1016 49 1087 1088 # HT OT - 1017 49 1087 1089 # HT OT - 1018 49 1090 1091 # HT OT - 1019 49 1090 1092 # HT OT - 1020 49 1093 1094 # HT OT - 1021 49 1093 1095 # HT OT - 1022 49 1096 1097 # HT OT - 1023 49 1096 1098 # HT OT - 1024 49 1099 1100 # HT OT - 1025 49 1099 1101 # HT OT - 1026 49 1102 1103 # HT OT - 1027 49 1102 1104 # HT OT - 1028 49 1105 1106 # HT OT - 1029 49 1105 1107 # HT OT - 1030 49 1108 1109 # HT OT - 1031 49 1108 1110 # HT OT - 1032 49 1111 1112 # HT OT - 1033 49 1111 1113 # HT OT - 1034 49 1114 1115 # HT OT - 1035 49 1114 1116 # HT OT - 1036 49 1117 1118 # HT OT - 1037 49 1117 1119 # HT OT - 1038 49 1120 1121 # HT OT - 1039 49 1120 1122 # HT OT - 1040 49 1123 1124 # HT OT - 1041 49 1123 1125 # HT OT - 1042 49 1126 1127 # HT OT - 1043 49 1126 1128 # HT OT - 1044 49 1129 1130 # HT OT - 1045 49 1129 1131 # HT OT - 1046 49 1132 1133 # HT OT - 1047 49 1132 1134 # HT OT - 1048 49 1135 1136 # HT OT - 1049 49 1135 1137 # HT OT - 1050 49 1138 1139 # HT OT - 1051 49 1138 1140 # HT OT - 1052 49 1141 1142 # HT OT - 1053 49 1141 1143 # HT OT - 1054 49 1144 1145 # HT OT - 1055 49 1144 1146 # HT OT - 1056 49 1147 1148 # HT OT - 1057 49 1147 1149 # HT OT - 1058 49 1150 1151 # HT OT - 1059 49 1150 1152 # HT OT - 1060 49 1153 1154 # HT OT - 1061 49 1153 1155 # HT OT - 1062 49 1156 1157 # HT OT - 1063 49 1156 1158 # HT OT - 1064 49 1159 1160 # HT OT - 1065 49 1159 1161 # HT OT - 1066 49 1162 1163 # HT OT - 1067 49 1162 1164 # HT OT - 1068 49 1165 1166 # HT OT - 1069 49 1165 1167 # HT OT - 1070 49 1168 1169 # HT OT - 1071 49 1168 1170 # HT OT - 1072 49 1171 1172 # HT OT - 1073 49 1171 1173 # HT OT - 1074 49 1174 1175 # HT OT - 1075 49 1174 1176 # HT OT - 1076 49 1177 1178 # HT OT - 1077 49 1177 1179 # HT OT - 1078 49 1180 1181 # HT OT - 1079 49 1180 1182 # HT OT - 1080 49 1183 1184 # HT OT - 1081 49 1183 1185 # HT OT - 1082 49 1186 1187 # HT OT - 1083 49 1186 1188 # HT OT - 1084 49 1189 1190 # HT OT - 1085 49 1189 1191 # HT OT - 1086 49 1192 1193 # HT OT - 1087 49 1192 1194 # HT OT - 1088 49 1195 1196 # HT OT - 1089 49 1195 1197 # HT OT - 1090 49 1198 1199 # HT OT - 1091 49 1198 1200 # HT OT - 1092 49 1201 1202 # HT OT - 1093 49 1201 1203 # HT OT - 1094 49 1204 1205 # HT OT - 1095 49 1204 1206 # HT OT - 1096 49 1207 1208 # HT OT - 1097 49 1207 1209 # HT OT - 1098 49 1210 1211 # HT OT - 1099 49 1210 1212 # HT OT - 1100 49 1213 1214 # HT OT - 1101 49 1213 1215 # HT OT - 1102 49 1216 1217 # HT OT - 1103 49 1216 1218 # HT OT - 1104 49 1219 1220 # HT OT - 1105 49 1219 1221 # HT OT - 1106 49 1222 1223 # HT OT - 1107 49 1222 1224 # HT OT - 1108 49 1225 1226 # HT OT - 1109 49 1225 1227 # HT OT - 1110 49 1228 1229 # HT OT - 1111 49 1228 1230 # HT OT - 1112 49 1231 1232 # HT OT - 1113 49 1231 1233 # HT OT - 1114 49 1234 1235 # HT OT - 1115 49 1234 1236 # HT OT - 1116 49 1237 1238 # HT OT - 1117 49 1237 1239 # HT OT - 1118 49 1240 1241 # HT OT - 1119 49 1240 1242 # HT OT - 1120 49 1243 1244 # HT OT - 1121 49 1243 1245 # HT OT - 1122 49 1246 1247 # HT OT - 1123 49 1246 1248 # HT OT - 1124 49 1249 1250 # HT OT - 1125 49 1249 1251 # HT OT - 1126 49 1252 1253 # HT OT - 1127 49 1252 1254 # HT OT - 1128 49 1255 1256 # HT OT - 1129 49 1255 1257 # HT OT - 1130 49 1258 1259 # HT OT - 1131 49 1258 1260 # HT OT - 1132 49 1261 1262 # HT OT - 1133 49 1261 1263 # HT OT - 1134 49 1264 1265 # HT OT - 1135 49 1264 1266 # HT OT - 1136 49 1267 1268 # HT OT - 1137 49 1267 1269 # HT OT - 1138 49 1270 1271 # HT OT - 1139 49 1270 1272 # HT OT - 1140 49 1273 1274 # HT OT - 1141 49 1273 1275 # HT OT - 1142 49 1276 1277 # HT OT - 1143 49 1276 1278 # HT OT - 1144 49 1279 1280 # HT OT - 1145 49 1279 1281 # HT OT - 1146 49 1282 1283 # HT OT - 1147 49 1282 1284 # HT OT - 1148 49 1285 1286 # HT OT - 1149 49 1285 1287 # HT OT - 1150 49 1288 1289 # HT OT - 1151 49 1288 1290 # HT OT - 1152 49 1291 1292 # HT OT - 1153 49 1291 1293 # HT OT - 1154 49 1294 1295 # HT OT - 1155 49 1294 1296 # HT OT - 1156 49 1297 1298 # HT OT - 1157 49 1297 1299 # HT OT - 1158 49 1300 1301 # HT OT - 1159 49 1300 1302 # HT OT - 1160 49 1303 1304 # HT OT - 1161 49 1303 1305 # HT OT - 1162 49 1306 1307 # HT OT - 1163 49 1306 1308 # HT OT - 1164 49 1309 1310 # HT OT - 1165 49 1309 1311 # HT OT - 1166 49 1312 1313 # HT OT - 1167 49 1312 1314 # HT OT - 1168 49 1315 1316 # HT OT - 1169 49 1315 1317 # HT OT - 1170 49 1318 1319 # HT OT - 1171 49 1318 1320 # HT OT - 1172 49 1321 1322 # HT OT - 1173 49 1321 1323 # HT OT - 1174 49 1324 1325 # HT OT - 1175 49 1324 1326 # HT OT - 1176 49 1327 1328 # HT OT - 1177 49 1327 1329 # HT OT - 1178 49 1330 1331 # HT OT - 1179 49 1330 1332 # HT OT - 1180 49 1333 1334 # HT OT - 1181 49 1333 1335 # HT OT - 1182 49 1336 1337 # HT OT - 1183 49 1336 1338 # HT OT - 1184 49 1339 1340 # HT OT - 1185 49 1339 1341 # HT OT - 1186 49 1342 1343 # HT OT - 1187 49 1342 1344 # HT OT - 1188 49 1345 1346 # HT OT - 1189 49 1345 1347 # HT OT - 1190 49 1348 1349 # HT OT - 1191 49 1348 1350 # HT OT - 1192 49 1351 1352 # HT OT - 1193 49 1351 1353 # HT OT - 1194 49 1354 1355 # HT OT - 1195 49 1354 1356 # HT OT - 1196 49 1357 1358 # HT OT - 1197 49 1357 1359 # HT OT - 1198 49 1360 1361 # HT OT - 1199 49 1360 1362 # HT OT - 1200 49 1363 1364 # HT OT - 1201 49 1363 1365 # HT OT - 1202 49 1366 1367 # HT OT - 1203 49 1366 1368 # HT OT - 1204 49 1369 1370 # HT OT - 1205 49 1369 1371 # HT OT - 1206 49 1372 1373 # HT OT - 1207 49 1372 1374 # HT OT - 1208 49 1375 1376 # HT OT - 1209 49 1375 1377 # HT OT - 1210 49 1378 1379 # HT OT - 1211 49 1378 1380 # HT OT - 1212 49 1381 1382 # HT OT - 1213 49 1381 1383 # HT OT - 1214 49 1384 1385 # HT OT - 1215 49 1384 1386 # HT OT - 1216 49 1387 1388 # HT OT - 1217 49 1387 1389 # HT OT - 1218 49 1390 1391 # HT OT - 1219 49 1390 1392 # HT OT - 1220 49 1393 1394 # HT OT - 1221 49 1393 1395 # HT OT - 1222 49 1396 1397 # HT OT - 1223 49 1396 1398 # HT OT - 1224 49 1399 1400 # HT OT - 1225 49 1399 1401 # HT OT - 1226 49 1402 1403 # HT OT - 1227 49 1402 1404 # HT OT - 1228 49 1405 1406 # HT OT - 1229 49 1405 1407 # HT OT - 1230 49 1408 1409 # HT OT - 1231 49 1408 1410 # HT OT - 1232 49 1411 1412 # HT OT - 1233 49 1411 1413 # HT OT - 1234 49 1414 1415 # HT OT - 1235 49 1414 1416 # HT OT - 1236 49 1417 1418 # HT OT - 1237 49 1417 1419 # HT OT - 1238 49 1420 1421 # HT OT - 1239 49 1420 1422 # HT OT - 1240 49 1423 1424 # HT OT - 1241 49 1423 1425 # HT OT - 1242 49 1426 1427 # HT OT - 1243 49 1426 1428 # HT OT - 1244 49 1429 1430 # HT OT - 1245 49 1429 1431 # HT OT - 1246 49 1432 1433 # HT OT - 1247 49 1432 1434 # HT OT - 1248 49 1435 1436 # HT OT - 1249 49 1435 1437 # HT OT - 1250 49 1438 1439 # HT OT - 1251 49 1438 1440 # HT OT - 1252 49 1441 1442 # HT OT - 1253 49 1441 1443 # HT OT - 1254 49 1444 1445 # HT OT - 1255 49 1444 1446 # HT OT - 1256 49 1447 1448 # HT OT - 1257 49 1447 1449 # HT OT - 1258 49 1450 1451 # HT OT - 1259 49 1450 1452 # HT OT - 1260 49 1453 1454 # HT OT - 1261 49 1453 1455 # HT OT - 1262 49 1456 1457 # HT OT - 1263 49 1456 1458 # HT OT - 1264 49 1459 1460 # HT OT - 1265 49 1459 1461 # HT OT - 1266 49 1462 1463 # HT OT - 1267 49 1462 1464 # HT OT - 1268 49 1465 1466 # HT OT - 1269 49 1465 1467 # HT OT - 1270 49 1468 1469 # HT OT - 1271 49 1468 1470 # HT OT - 1272 49 1471 1472 # HT OT - 1273 49 1471 1473 # HT OT - 1274 49 1474 1475 # HT OT - 1275 49 1474 1476 # HT OT - 1276 49 1477 1478 # HT OT - 1277 49 1477 1479 # HT OT - 1278 49 1480 1481 # HT OT - 1279 49 1480 1482 # HT OT - 1280 49 1483 1484 # HT OT - 1281 49 1483 1485 # HT OT - 1282 49 1486 1487 # HT OT - 1283 49 1486 1488 # HT OT - 1284 49 1489 1490 # HT OT - 1285 49 1489 1491 # HT OT - 1286 49 1492 1493 # HT OT - 1287 49 1492 1494 # HT OT - 1288 49 1495 1496 # HT OT - 1289 49 1495 1497 # HT OT - 1290 49 1498 1499 # HT OT - 1291 49 1498 1500 # HT OT - 1292 49 1501 1502 # HT OT - 1293 49 1501 1503 # HT OT - 1294 49 1504 1505 # HT OT - 1295 49 1504 1506 # HT OT - 1296 49 1507 1508 # HT OT - 1297 49 1507 1509 # HT OT - 1298 49 1510 1511 # HT OT - 1299 49 1510 1512 # HT OT - 1300 49 1513 1514 # HT OT - 1301 49 1513 1515 # HT OT - 1302 49 1516 1517 # HT OT - 1303 49 1516 1518 # HT OT - 1304 49 1519 1520 # HT OT - 1305 49 1519 1521 # HT OT - 1306 49 1522 1523 # HT OT - 1307 49 1522 1524 # HT OT - 1308 49 1525 1526 # HT OT - 1309 49 1525 1527 # HT OT - 1310 49 1529 1530 # HT OT - 1311 49 1529 1531 # HT OT - 1312 49 1532 1533 # HT OT - 1313 49 1532 1534 # HT OT - 1314 49 1535 1536 # HT OT - 1315 49 1535 1537 # HT OT - 1316 49 1538 1539 # HT OT - 1317 49 1538 1540 # HT OT - 1318 49 1541 1542 # HT OT - 1319 49 1541 1543 # HT OT - 1320 49 1544 1545 # HT OT - 1321 49 1544 1546 # HT OT - 1322 49 1547 1548 # HT OT - 1323 49 1547 1549 # HT OT - 1324 49 1550 1551 # HT OT - 1325 49 1550 1552 # HT OT - 1326 49 1553 1554 # HT OT - 1327 49 1553 1555 # HT OT - 1328 49 1556 1557 # HT OT - 1329 49 1556 1558 # HT OT - 1330 49 1559 1560 # HT OT - 1331 49 1559 1561 # HT OT - 1332 49 1562 1563 # HT OT - 1333 49 1562 1564 # HT OT - 1334 49 1565 1566 # HT OT - 1335 49 1565 1567 # HT OT - 1336 49 1568 1569 # HT OT - 1337 49 1568 1570 # HT OT - 1338 49 1571 1572 # HT OT - 1339 49 1571 1573 # HT OT - 1340 49 1574 1575 # HT OT - 1341 49 1574 1576 # HT OT - 1342 49 1577 1578 # HT OT - 1343 49 1577 1579 # HT OT - 1344 49 1580 1581 # HT OT - 1345 49 1580 1582 # HT OT - 1346 49 1583 1584 # HT OT - 1347 49 1583 1585 # HT OT - 1348 49 1586 1587 # HT OT - 1349 49 1586 1588 # HT OT - 1350 49 1589 1590 # HT OT - 1351 49 1589 1591 # HT OT - 1352 49 1592 1593 # HT OT - 1353 49 1592 1594 # HT OT - 1354 49 1595 1596 # HT OT - 1355 49 1595 1597 # HT OT - 1356 49 1598 1599 # HT OT - 1357 49 1598 1600 # HT OT - 1358 49 1601 1602 # HT OT - 1359 49 1601 1603 # HT OT - 1360 49 1604 1605 # HT OT - 1361 49 1604 1606 # HT OT - 1362 49 1607 1608 # HT OT - 1363 49 1607 1609 # HT OT - 1364 49 1610 1611 # HT OT - 1365 49 1610 1612 # HT OT - 1366 49 1613 1614 # HT OT - 1367 49 1613 1615 # HT OT - 1368 49 1616 1617 # HT OT - 1369 49 1616 1618 # HT OT - 1370 49 1619 1620 # HT OT - 1371 49 1619 1621 # HT OT - 1372 49 1622 1623 # HT OT - 1373 49 1622 1624 # HT OT - 1374 49 1625 1626 # HT OT - 1375 49 1625 1627 # HT OT - 1376 49 1628 1629 # HT OT - 1377 49 1628 1630 # HT OT - 1378 49 1631 1632 # HT OT - 1379 49 1631 1633 # HT OT - 1380 49 1634 1635 # HT OT - 1381 49 1634 1636 # HT OT - 1382 49 1637 1638 # HT OT - 1383 49 1637 1639 # HT OT - 1384 49 1640 1641 # HT OT - 1385 49 1640 1642 # HT OT - 1386 49 1643 1644 # HT OT - 1387 49 1643 1645 # HT OT - 1388 49 1646 1647 # HT OT - 1389 49 1646 1648 # HT OT - 1390 49 1649 1650 # HT OT - 1391 49 1649 1651 # HT OT - 1392 49 1652 1653 # HT OT - 1393 49 1652 1654 # HT OT - 1394 49 1655 1656 # HT OT - 1395 49 1655 1657 # HT OT - 1396 49 1658 1659 # HT OT - 1397 49 1658 1660 # HT OT - 1398 49 1661 1662 # HT OT - 1399 49 1661 1663 # HT OT - 1400 49 1664 1665 # HT OT - 1401 49 1664 1666 # HT OT - 1402 49 1667 1668 # HT OT - 1403 49 1667 1669 # HT OT - 1404 49 1670 1671 # HT OT - 1405 49 1670 1672 # HT OT - 1406 49 1673 1674 # HT OT - 1407 49 1673 1675 # HT OT - 1408 49 1676 1677 # HT OT - 1409 49 1676 1678 # HT OT - 1410 49 1679 1680 # HT OT - 1411 49 1679 1681 # HT OT - 1412 49 1682 1683 # HT OT - 1413 49 1682 1684 # HT OT - 1414 49 1685 1686 # HT OT - 1415 49 1685 1687 # HT OT - 1416 49 1688 1689 # HT OT - 1417 49 1688 1690 # HT OT - 1418 49 1691 1692 # HT OT - 1419 49 1691 1693 # HT OT - 1420 49 1694 1695 # HT OT - 1421 49 1694 1696 # HT OT - 1422 49 1697 1698 # HT OT - 1423 49 1697 1699 # HT OT - 1424 49 1700 1701 # HT OT - 1425 49 1700 1702 # HT OT - 1426 49 1703 1704 # HT OT - 1427 49 1703 1705 # HT OT - 1428 49 1706 1707 # HT OT - 1429 49 1706 1708 # HT OT - 1430 49 1709 1710 # HT OT - 1431 49 1709 1711 # HT OT - 1432 49 1712 1713 # HT OT - 1433 49 1712 1714 # HT OT - 1434 49 1715 1716 # HT OT - 1435 49 1715 1717 # HT OT - 1436 49 1718 1719 # HT OT - 1437 49 1718 1720 # HT OT - 1438 49 1721 1722 # HT OT - 1439 49 1721 1723 # HT OT - 1440 49 1724 1725 # HT OT - 1441 49 1724 1726 # HT OT - 1442 49 1727 1728 # HT OT - 1443 49 1727 1729 # HT OT - 1444 49 1730 1731 # HT OT - 1445 49 1730 1732 # HT OT - 1446 49 1733 1734 # HT OT - 1447 49 1733 1735 # HT OT - 1448 49 1736 1737 # HT OT - 1449 49 1736 1738 # HT OT - 1450 49 1739 1740 # HT OT - 1451 49 1739 1741 # HT OT - 1452 49 1742 1743 # HT OT - 1453 49 1742 1744 # HT OT - 1454 49 1745 1746 # HT OT - 1455 49 1745 1747 # HT OT - 1456 49 1748 1749 # HT OT - 1457 49 1748 1750 # HT OT - 1458 49 1751 1752 # HT OT - 1459 49 1751 1753 # HT OT - 1460 49 1754 1755 # HT OT - 1461 49 1754 1756 # HT OT - 1462 49 1757 1758 # HT OT - 1463 49 1757 1759 # HT OT - 1464 49 1760 1761 # HT OT - 1465 49 1760 1762 # HT OT - 1466 49 1763 1764 # HT OT - 1467 49 1763 1765 # HT OT - 1468 49 1766 1767 # HT OT - 1469 49 1766 1768 # HT OT - 1470 49 1769 1770 # HT OT - 1471 49 1769 1771 # HT OT - 1472 49 1772 1773 # HT OT - 1473 49 1772 1774 # HT OT - 1474 49 1775 1776 # HT OT - 1475 49 1775 1777 # HT OT - 1476 49 1778 1779 # HT OT - 1477 49 1778 1780 # HT OT - 1478 49 1781 1782 # HT OT - 1479 49 1781 1783 # HT OT - 1480 49 1784 1785 # HT OT - 1481 49 1784 1786 # HT OT - 1482 49 1787 1788 # HT OT - 1483 49 1787 1789 # HT OT - 1484 49 1790 1791 # HT OT - 1485 49 1790 1792 # HT OT - 1486 49 1793 1794 # HT OT - 1487 49 1793 1795 # HT OT - 1488 49 1796 1797 # HT OT - 1489 49 1796 1798 # HT OT - 1490 49 1799 1800 # HT OT - 1491 49 1799 1801 # HT OT - 1492 49 1802 1803 # HT OT - 1493 49 1802 1804 # HT OT - 1494 49 1805 1806 # HT OT - 1495 49 1805 1807 # HT OT - 1496 49 1808 1809 # HT OT - 1497 49 1808 1810 # HT OT - 1498 49 1811 1812 # HT OT - 1499 49 1811 1813 # HT OT - 1500 49 1814 1815 # HT OT - 1501 49 1814 1816 # HT OT - 1502 49 1817 1818 # HT OT - 1503 49 1817 1819 # HT OT - 1504 49 1820 1821 # HT OT - 1505 49 1820 1822 # HT OT - 1506 49 1823 1824 # HT OT - 1507 49 1823 1825 # HT OT - 1508 49 1826 1827 # HT OT - 1509 49 1826 1828 # HT OT - 1510 49 1829 1830 # HT OT - 1511 49 1829 1831 # HT OT - 1512 49 1832 1833 # HT OT - 1513 49 1832 1834 # HT OT - 1514 49 1835 1836 # HT OT - 1515 49 1835 1837 # HT OT - 1516 49 1838 1839 # HT OT - 1517 49 1838 1840 # HT OT - 1518 49 1841 1842 # HT OT - 1519 49 1841 1843 # HT OT - 1520 49 1844 1845 # HT OT - 1521 49 1844 1846 # HT OT - 1522 49 1847 1848 # HT OT - 1523 49 1847 1849 # HT OT - 1524 49 1850 1851 # HT OT - 1525 49 1850 1852 # HT OT - 1526 49 1853 1854 # HT OT - 1527 49 1853 1855 # HT OT - 1528 49 1856 1857 # HT OT - 1529 49 1856 1858 # HT OT - 1530 49 1859 1860 # HT OT - 1531 49 1859 1861 # HT OT - 1532 49 1862 1863 # HT OT - 1533 49 1862 1864 # HT OT - 1534 49 1865 1866 # HT OT - 1535 49 1865 1867 # HT OT - 1536 49 1868 1869 # HT OT - 1537 49 1868 1870 # HT OT - 1538 49 1871 1872 # HT OT - 1539 49 1871 1873 # HT OT - 1540 49 1874 1875 # HT OT - 1541 49 1874 1876 # HT OT - 1542 49 1877 1878 # HT OT - 1543 49 1877 1879 # HT OT - 1544 49 1880 1881 # HT OT - 1545 49 1880 1882 # HT OT - 1546 49 1883 1884 # HT OT - 1547 49 1883 1885 # HT OT - 1548 49 1886 1887 # HT OT - 1549 49 1886 1888 # HT OT - 1550 49 1889 1890 # HT OT - 1551 49 1889 1891 # HT OT - 1552 49 1892 1893 # HT OT - 1553 49 1892 1894 # HT OT - 1554 49 1895 1896 # HT OT - 1555 49 1895 1897 # HT OT - 1556 49 1898 1899 # HT OT - 1557 49 1898 1900 # HT OT - 1558 49 1901 1902 # HT OT - 1559 49 1901 1903 # HT OT - 1560 49 1904 1905 # HT OT - 1561 49 1904 1906 # HT OT - 1562 49 1907 1908 # HT OT - 1563 49 1907 1909 # HT OT - 1564 49 1910 1911 # HT OT - 1565 49 1910 1912 # HT OT - 1566 49 1913 1914 # HT OT - 1567 49 1913 1915 # HT OT - 1568 49 1916 1917 # HT OT - 1569 49 1916 1918 # HT OT - 1570 49 1919 1920 # HT OT - 1571 49 1919 1921 # HT OT - 1572 49 1922 1923 # HT OT - 1573 49 1922 1924 # HT OT - 1574 49 1925 1926 # HT OT - 1575 49 1925 1927 # HT OT - 1576 49 1928 1929 # HT OT - 1577 49 1928 1930 # HT OT - 1578 49 1931 1932 # HT OT - 1579 49 1931 1933 # HT OT - 1580 49 1934 1935 # HT OT - 1581 49 1934 1936 # HT OT - 1582 49 1937 1938 # HT OT - 1583 49 1937 1939 # HT OT - 1584 49 1940 1941 # HT OT - 1585 49 1940 1942 # HT OT - 1586 49 1943 1944 # HT OT - 1587 49 1943 1945 # HT OT - 1588 49 1946 1947 # HT OT - 1589 49 1946 1948 # HT OT - 1590 49 1949 1950 # HT OT - 1591 49 1949 1951 # HT OT - 1592 49 1952 1953 # HT OT - 1593 49 1952 1954 # HT OT - 1594 49 1955 1956 # HT OT - 1595 49 1955 1957 # HT OT - 1596 49 1958 1959 # HT OT - 1597 49 1958 1960 # HT OT - 1598 49 1961 1962 # HT OT - 1599 49 1961 1963 # HT OT - 1600 49 1964 1965 # HT OT - 1601 49 1964 1966 # HT OT - 1602 49 1967 1968 # HT OT - 1603 49 1967 1969 # HT OT - 1604 49 1970 1971 # HT OT - 1605 49 1970 1972 # HT OT - 1606 49 1973 1974 # HT OT - 1607 49 1973 1975 # HT OT - 1608 49 1976 1977 # HT OT - 1609 49 1976 1978 # HT OT - 1610 49 1979 1980 # HT OT - 1611 49 1979 1981 # HT OT - 1612 49 1982 1983 # HT OT - 1613 49 1982 1984 # HT OT - 1614 49 1985 1986 # HT OT - 1615 49 1985 1987 # HT OT - 1616 49 1988 1989 # HT OT - 1617 49 1988 1990 # HT OT - 1618 49 1991 1992 # HT OT - 1619 49 1991 1993 # HT OT - 1620 49 1994 1995 # HT OT - 1621 49 1994 1996 # HT OT - 1622 49 1997 1998 # HT OT - 1623 49 1997 1999 # HT OT - 1624 49 2000 2001 # HT OT - 1625 49 2000 2002 # HT OT - 1626 49 2003 2004 # HT OT - 1627 49 2003 2005 # HT OT - 1628 49 2007 2008 # HT OT - 1629 49 2007 2009 # HT OT - 1630 49 2010 2011 # HT OT - 1631 49 2010 2012 # HT OT - 1632 49 2013 2014 # HT OT - 1633 49 2013 2015 # HT OT - 1634 49 2016 2017 # HT OT - 1635 49 2016 2018 # HT OT - 1636 49 2019 2020 # HT OT - 1637 49 2019 2021 # HT OT - 1638 49 2022 2023 # HT OT - 1639 49 2022 2024 # HT OT - 1640 49 2025 2026 # HT OT - 1641 49 2025 2027 # HT OT - 1642 49 2028 2029 # HT OT - 1643 49 2028 2030 # HT OT - 1644 49 2031 2032 # HT OT - 1645 49 2031 2033 # HT OT - 1646 49 2034 2035 # HT OT - 1647 49 2034 2036 # HT OT - 1648 49 2037 2038 # HT OT - 1649 49 2037 2039 # HT OT - 1650 49 2040 2041 # HT OT - 1651 49 2040 2042 # HT OT - 1652 49 2043 2044 # HT OT - 1653 49 2043 2045 # HT OT - 1654 49 2046 2047 # HT OT - 1655 49 2046 2048 # HT OT - 1656 49 2049 2050 # HT OT - 1657 49 2049 2051 # HT OT - 1658 49 2052 2053 # HT OT - 1659 49 2052 2054 # HT OT - 1660 49 2055 2056 # HT OT - 1661 49 2055 2057 # HT OT - 1662 49 2058 2059 # HT OT - 1663 49 2058 2060 # HT OT - 1664 49 2061 2062 # HT OT - 1665 49 2061 2063 # HT OT - 1666 49 2064 2065 # HT OT - 1667 49 2064 2066 # HT OT - 1668 49 2067 2068 # HT OT - 1669 49 2067 2069 # HT OT - 1670 49 2070 2071 # HT OT - 1671 49 2070 2072 # HT OT - 1672 49 2073 2074 # HT OT - 1673 49 2073 2075 # HT OT - 1674 49 2076 2077 # HT OT - 1675 49 2076 2078 # HT OT - 1676 49 2079 2080 # HT OT - 1677 49 2079 2081 # HT OT - 1678 49 2082 2083 # HT OT - 1679 49 2082 2084 # HT OT - 1680 49 2085 2086 # HT OT - 1681 49 2085 2087 # HT OT - 1682 49 2088 2089 # HT OT - 1683 49 2088 2090 # HT OT - 1684 49 2091 2092 # HT OT - 1685 49 2091 2093 # HT OT - 1686 49 2094 2095 # HT OT - 1687 49 2094 2096 # HT OT - 1688 49 2097 2098 # HT OT - 1689 49 2097 2099 # HT OT - 1690 49 2100 2101 # HT OT - 1691 49 2100 2102 # HT OT - 1692 49 2103 2104 # HT OT - 1693 49 2103 2105 # HT OT - 1694 49 2106 2107 # HT OT - 1695 49 2106 2108 # HT OT - 1696 49 2109 2110 # HT OT - 1697 49 2109 2111 # HT OT - 1698 49 2112 2113 # HT OT - 1699 49 2112 2114 # HT OT - 1700 49 2115 2116 # HT OT - 1701 49 2115 2117 # HT OT - 1702 49 2118 2119 # HT OT - 1703 49 2118 2120 # HT OT - 1704 49 2121 2122 # HT OT - 1705 49 2121 2123 # HT OT - 1706 49 2124 2125 # HT OT - 1707 49 2124 2126 # HT OT - 1708 49 2127 2128 # HT OT - 1709 49 2127 2129 # HT OT - 1710 49 2130 2131 # HT OT - 1711 49 2130 2132 # HT OT - 1712 49 2133 2134 # HT OT - 1713 49 2133 2135 # HT OT - 1714 49 2136 2137 # HT OT - 1715 49 2136 2138 # HT OT - 1716 49 2139 2140 # HT OT - 1717 49 2139 2141 # HT OT - 1718 49 2142 2143 # HT OT - 1719 49 2142 2144 # HT OT - 1720 49 2145 2146 # HT OT - 1721 49 2145 2147 # HT OT - 1722 49 2148 2149 # HT OT - 1723 49 2148 2150 # HT OT - 1724 49 2151 2152 # HT OT - 1725 49 2151 2153 # HT OT - 1726 49 2154 2155 # HT OT - 1727 49 2154 2156 # HT OT - 1728 49 2157 2158 # HT OT - 1729 49 2157 2159 # HT OT - 1730 49 2160 2161 # HT OT - 1731 49 2160 2162 # HT OT - 1732 49 2163 2164 # HT OT - 1733 49 2163 2165 # HT OT - 1734 49 2166 2167 # HT OT - 1735 49 2166 2168 # HT OT - 1736 49 2169 2170 # HT OT - 1737 49 2169 2171 # HT OT - 1738 49 2172 2173 # HT OT - 1739 49 2172 2174 # HT OT - 1740 49 2175 2176 # HT OT - 1741 49 2175 2177 # HT OT - 1742 49 2178 2179 # HT OT - 1743 49 2178 2180 # HT OT - 1744 49 2181 2182 # HT OT - 1745 49 2181 2183 # HT OT - 1746 49 2184 2185 # HT OT - 1747 49 2184 2186 # HT OT - 1748 49 2187 2188 # HT OT - 1749 49 2187 2189 # HT OT - 1750 49 2190 2191 # HT OT - 1751 49 2190 2192 # HT OT - 1752 49 2193 2194 # HT OT - 1753 49 2193 2195 # HT OT - 1754 49 2196 2197 # HT OT - 1755 49 2196 2198 # HT OT - 1756 49 2199 2200 # HT OT - 1757 49 2199 2201 # HT OT - 1758 49 2202 2203 # HT OT - 1759 49 2202 2204 # HT OT - 1760 49 2205 2206 # HT OT - 1761 49 2205 2207 # HT OT - 1762 49 2208 2209 # HT OT - 1763 49 2208 2210 # HT OT - 1764 49 2211 2212 # HT OT - 1765 49 2211 2213 # HT OT - 1766 49 2214 2215 # HT OT - 1767 49 2214 2216 # HT OT - 1768 49 2217 2218 # HT OT - 1769 49 2217 2219 # HT OT - 1770 49 2220 2221 # HT OT - 1771 49 2220 2222 # HT OT - 1772 49 2223 2224 # HT OT - 1773 49 2223 2225 # HT OT - 1774 49 2226 2227 # HT OT - 1775 49 2226 2228 # HT OT - 1776 49 2229 2230 # HT OT - 1777 49 2229 2231 # HT OT - 1778 49 2232 2233 # HT OT - 1779 49 2232 2234 # HT OT - 1780 49 2235 2236 # HT OT - 1781 49 2235 2237 # HT OT - 1782 49 2238 2239 # HT OT - 1783 49 2238 2240 # HT OT - 1784 49 2241 2242 # HT OT - 1785 49 2241 2243 # HT OT - 1786 49 2244 2245 # HT OT - 1787 49 2244 2246 # HT OT - 1788 49 2247 2248 # HT OT - 1789 49 2247 2249 # HT OT - 1790 49 2250 2251 # HT OT - 1791 49 2250 2252 # HT OT - 1792 49 2253 2254 # HT OT - 1793 49 2253 2255 # HT OT - 1794 49 2256 2257 # HT OT - 1795 49 2256 2258 # HT OT - 1796 49 2259 2260 # HT OT - 1797 49 2259 2261 # HT OT - 1798 49 2262 2263 # HT OT - 1799 49 2262 2264 # HT OT - 1800 49 2265 2266 # HT OT - 1801 49 2265 2267 # HT OT - 1802 49 2268 2269 # HT OT - 1803 49 2268 2270 # HT OT - 1804 49 2271 2272 # HT OT - 1805 49 2271 2273 # HT OT - 1806 49 2274 2275 # HT OT - 1807 49 2274 2276 # HT OT - 1808 49 2277 2278 # HT OT - 1809 49 2277 2279 # HT OT - 1810 49 2280 2281 # HT OT - 1811 49 2280 2282 # HT OT - 1812 49 2283 2284 # HT OT - 1813 49 2283 2285 # HT OT - 1814 49 2286 2287 # HT OT - 1815 49 2286 2288 # HT OT - 1816 49 2289 2290 # HT OT - 1817 49 2289 2291 # HT OT - 1818 49 2292 2293 # HT OT - 1819 49 2292 2294 # HT OT - 1820 49 2295 2296 # HT OT - 1821 49 2295 2297 # HT OT - 1822 49 2298 2299 # HT OT - 1823 49 2298 2300 # HT OT - 1824 49 2301 2302 # HT OT - 1825 49 2301 2303 # HT OT - 1826 49 2304 2305 # HT OT - 1827 49 2304 2306 # HT OT - 1828 49 2307 2308 # HT OT - 1829 49 2307 2309 # HT OT - 1830 49 2310 2311 # HT OT - 1831 49 2310 2312 # HT OT - 1832 49 2313 2314 # HT OT - 1833 49 2313 2315 # HT OT - 1834 49 2316 2317 # HT OT - 1835 49 2316 2318 # HT OT - 1836 49 2319 2320 # HT OT - 1837 49 2319 2321 # HT OT - 1838 49 2322 2323 # HT OT - 1839 49 2322 2324 # HT OT - 1840 49 2325 2326 # HT OT - 1841 49 2325 2327 # HT OT - 1842 49 2328 2329 # HT OT - 1843 49 2328 2330 # HT OT - 1844 49 2331 2332 # HT OT - 1845 49 2331 2333 # HT OT - 1846 49 2334 2335 # HT OT - 1847 49 2334 2336 # HT OT - 1848 49 2337 2338 # HT OT - 1849 49 2337 2339 # HT OT - 1850 49 2340 2341 # HT OT - 1851 49 2340 2342 # HT OT - 1852 49 2343 2344 # HT OT - 1853 49 2343 2345 # HT OT - 1854 49 2346 2347 # HT OT - 1855 49 2346 2348 # HT OT - 1856 49 2349 2350 # HT OT - 1857 49 2349 2351 # HT OT - 1858 49 2352 2353 # HT OT - 1859 49 2352 2354 # HT OT - 1860 49 2355 2356 # HT OT - 1861 49 2355 2357 # HT OT - 1862 49 2358 2359 # HT OT - 1863 49 2358 2360 # HT OT - 1864 49 2361 2362 # HT OT - 1865 49 2361 2363 # HT OT - 1866 49 2365 2366 # HT OT - 1867 49 2365 2367 # HT OT - 1868 49 2368 2369 # HT OT - 1869 49 2368 2370 # HT OT - 1870 49 2371 2372 # HT OT - 1871 49 2371 2373 # HT OT - 1872 49 2374 2375 # HT OT - 1873 49 2374 2376 # HT OT - 1874 49 2377 2378 # HT OT - 1875 49 2377 2379 # HT OT - 1876 49 2380 2381 # HT OT - 1877 49 2380 2382 # HT OT - 1878 49 2383 2384 # HT OT - 1879 49 2383 2385 # HT OT - 1880 49 2386 2387 # HT OT - 1881 49 2386 2388 # HT OT - 1882 49 2389 2390 # HT OT - 1883 49 2389 2391 # HT OT - 1884 49 2392 2393 # HT OT - 1885 49 2392 2394 # HT OT - 1886 49 2395 2396 # HT OT - 1887 49 2395 2397 # HT OT - 1888 49 2398 2399 # HT OT - 1889 49 2398 2400 # HT OT - 1890 49 2401 2402 # HT OT - 1891 49 2401 2403 # HT OT - 1892 49 2404 2405 # HT OT - 1893 49 2404 2406 # HT OT - 1894 49 2407 2408 # HT OT - 1895 49 2407 2409 # HT OT - 1896 49 2410 2411 # HT OT - 1897 49 2410 2412 # HT OT - 1898 49 2413 2414 # HT OT - 1899 49 2413 2415 # HT OT - 1900 49 2416 2417 # HT OT - 1901 49 2416 2418 # HT OT - 1902 49 2419 2420 # HT OT - 1903 49 2419 2421 # HT OT - 1904 49 2422 2423 # HT OT - 1905 49 2422 2424 # HT OT - 1906 49 2425 2426 # HT OT - 1907 49 2425 2427 # HT OT - 1908 49 2428 2429 # HT OT - 1909 49 2428 2430 # HT OT - 1910 49 2431 2432 # HT OT - 1911 49 2431 2433 # HT OT - 1912 49 2434 2435 # HT OT - 1913 49 2434 2436 # HT OT - 1914 49 2437 2438 # HT OT - 1915 49 2437 2439 # HT OT - 1916 49 2440 2441 # HT OT - 1917 49 2440 2442 # HT OT - 1918 49 2443 2444 # HT OT - 1919 49 2443 2445 # HT OT - 1920 49 2446 2447 # HT OT - 1921 49 2446 2448 # HT OT - 1922 49 2449 2450 # HT OT - 1923 49 2449 2451 # HT OT - 1924 49 2452 2453 # HT OT - 1925 49 2452 2454 # HT OT - 1926 49 2455 2456 # HT OT - 1927 49 2455 2457 # HT OT - 1928 49 2458 2459 # HT OT - 1929 49 2458 2460 # HT OT - 1930 49 2461 2462 # HT OT - 1931 49 2461 2463 # HT OT - 1932 49 2464 2465 # HT OT - 1933 49 2464 2466 # HT OT - 1934 49 2467 2468 # HT OT - 1935 49 2467 2469 # HT OT - 1936 49 2470 2471 # HT OT - 1937 49 2470 2472 # HT OT - 1938 49 2473 2474 # HT OT - 1939 49 2473 2475 # HT OT - 1940 49 2476 2477 # HT OT - 1941 49 2476 2478 # HT OT - 1942 49 2479 2480 # HT OT - 1943 49 2479 2481 # HT OT - 1944 49 2482 2483 # HT OT - 1945 49 2482 2484 # HT OT - 1946 49 2485 2486 # HT OT - 1947 49 2485 2487 # HT OT - 1948 49 2488 2489 # HT OT - 1949 49 2488 2490 # HT OT - 1950 49 2491 2492 # HT OT - 1951 49 2491 2493 # HT OT - 1952 49 2494 2495 # HT OT - 1953 49 2494 2496 # HT OT + 882 49 887 888 # HT OT + 883 49 887 889 # HT OT + 884 49 890 891 # HT OT + 885 49 890 892 # HT OT + 886 49 893 894 # HT OT + 887 49 893 895 # HT OT + 888 49 896 897 # HT OT + 889 49 896 898 # HT OT + 890 49 899 900 # HT OT + 891 49 899 901 # HT OT + 892 49 902 903 # HT OT + 893 49 902 904 # HT OT + 894 49 905 906 # HT OT + 895 49 905 907 # HT OT + 896 49 908 909 # HT OT + 897 49 908 910 # HT OT + 898 49 911 912 # HT OT + 899 49 911 913 # HT OT + 900 49 914 915 # HT OT + 901 49 914 916 # HT OT + 902 49 917 918 # HT OT + 903 49 917 919 # HT OT + 904 49 920 921 # HT OT + 905 49 920 922 # HT OT + 906 49 923 924 # HT OT + 907 49 923 925 # HT OT + 908 49 926 927 # HT OT + 909 49 926 928 # HT OT + 910 49 929 930 # HT OT + 911 49 929 931 # HT OT + 912 49 932 933 # HT OT + 913 49 932 934 # HT OT + 914 49 935 936 # HT OT + 915 49 935 937 # HT OT + 916 49 938 939 # HT OT + 917 49 938 940 # HT OT + 918 49 941 942 # HT OT + 919 49 941 943 # HT OT + 920 49 944 945 # HT OT + 921 49 944 946 # HT OT + 922 49 947 948 # HT OT + 923 49 947 949 # HT OT + 924 49 950 951 # HT OT + 925 49 950 952 # HT OT + 926 49 953 954 # HT OT + 927 49 953 955 # HT OT + 928 49 956 957 # HT OT + 929 49 956 958 # HT OT + 930 49 959 960 # HT OT + 931 49 959 961 # HT OT + 932 49 962 963 # HT OT + 933 49 962 964 # HT OT + 934 49 965 966 # HT OT + 935 49 965 967 # HT OT + 936 49 968 969 # HT OT + 937 49 968 970 # HT OT + 938 49 971 972 # HT OT + 939 49 971 973 # HT OT + 940 49 974 975 # HT OT + 941 49 974 976 # HT OT + 942 49 977 978 # HT OT + 943 49 977 979 # HT OT + 944 49 980 981 # HT OT + 945 49 980 982 # HT OT + 946 49 983 984 # HT OT + 947 49 983 985 # HT OT + 948 49 986 987 # HT OT + 949 49 986 988 # HT OT + 950 49 989 990 # HT OT + 951 49 989 991 # HT OT + 952 49 992 993 # HT OT + 953 49 992 994 # HT OT + 954 49 996 997 # HT OT + 955 49 996 998 # HT OT + 956 49 999 1000 # HT OT + 957 49 999 1001 # HT OT + 958 49 1002 1003 # HT OT + 959 49 1002 1004 # HT OT + 960 49 1005 1006 # HT OT + 961 49 1005 1007 # HT OT + 962 49 1008 1009 # HT OT + 963 49 1008 1010 # HT OT + 964 49 1011 1012 # HT OT + 965 49 1011 1013 # HT OT + 966 49 1014 1015 # HT OT + 967 49 1014 1016 # HT OT + 968 49 1017 1018 # HT OT + 969 49 1017 1019 # HT OT + 970 49 1020 1021 # HT OT + 971 49 1020 1022 # HT OT + 972 49 1023 1024 # HT OT + 973 49 1023 1025 # HT OT + 974 49 1026 1027 # HT OT + 975 49 1026 1028 # HT OT + 976 49 1029 1030 # HT OT + 977 49 1029 1031 # HT OT + 978 49 1032 1033 # HT OT + 979 49 1032 1034 # HT OT + 980 49 1035 1036 # HT OT + 981 49 1035 1037 # HT OT + 982 49 1038 1039 # HT OT + 983 49 1038 1040 # HT OT + 984 49 1041 1042 # HT OT + 985 49 1041 1043 # HT OT + 986 49 1044 1045 # HT OT + 987 49 1044 1046 # HT OT + 988 49 1047 1048 # HT OT + 989 49 1047 1049 # HT OT + 990 49 1050 1051 # HT OT + 991 49 1050 1052 # HT OT + 992 49 1053 1054 # HT OT + 993 49 1053 1055 # HT OT + 994 49 1056 1057 # HT OT + 995 49 1056 1058 # HT OT + 996 49 1059 1060 # HT OT + 997 49 1059 1061 # HT OT + 998 49 1062 1063 # HT OT + 999 49 1062 1064 # HT OT + 1000 49 1065 1066 # HT OT + 1001 49 1065 1067 # HT OT + 1002 49 1068 1069 # HT OT + 1003 49 1068 1070 # HT OT + 1004 49 1071 1072 # HT OT + 1005 49 1071 1073 # HT OT + 1006 49 1074 1075 # HT OT + 1007 49 1074 1076 # HT OT + 1008 49 1077 1078 # HT OT + 1009 49 1077 1079 # HT OT + 1010 49 1080 1081 # HT OT + 1011 49 1080 1082 # HT OT + 1012 49 1083 1084 # HT OT + 1013 49 1083 1085 # HT OT + 1014 49 1086 1087 # HT OT + 1015 49 1086 1088 # HT OT + 1016 49 1089 1090 # HT OT + 1017 49 1089 1091 # HT OT + 1018 49 1092 1093 # HT OT + 1019 49 1092 1094 # HT OT + 1020 49 1095 1096 # HT OT + 1021 49 1095 1097 # HT OT + 1022 49 1098 1099 # HT OT + 1023 49 1098 1100 # HT OT + 1024 49 1101 1102 # HT OT + 1025 49 1101 1103 # HT OT + 1026 49 1104 1105 # HT OT + 1027 49 1104 1106 # HT OT + 1028 49 1107 1108 # HT OT + 1029 49 1107 1109 # HT OT + 1030 49 1110 1111 # HT OT + 1031 49 1110 1112 # HT OT + 1032 49 1113 1114 # HT OT + 1033 49 1113 1115 # HT OT + 1034 49 1116 1117 # HT OT + 1035 49 1116 1118 # HT OT + 1036 49 1119 1120 # HT OT + 1037 49 1119 1121 # HT OT + 1038 49 1122 1123 # HT OT + 1039 49 1122 1124 # HT OT + 1040 49 1125 1126 # HT OT + 1041 49 1125 1127 # HT OT + 1042 49 1128 1129 # HT OT + 1043 49 1128 1130 # HT OT + 1044 49 1131 1132 # HT OT + 1045 49 1131 1133 # HT OT + 1046 49 1134 1135 # HT OT + 1047 49 1134 1136 # HT OT + 1048 49 1137 1138 # HT OT + 1049 49 1137 1139 # HT OT + 1050 49 1140 1141 # HT OT + 1051 49 1140 1142 # HT OT + 1052 49 1143 1144 # HT OT + 1053 49 1143 1145 # HT OT + 1054 49 1146 1147 # HT OT + 1055 49 1146 1148 # HT OT + 1056 49 1149 1150 # HT OT + 1057 49 1149 1151 # HT OT + 1058 49 1152 1153 # HT OT + 1059 49 1152 1154 # HT OT + 1060 49 1155 1156 # HT OT + 1061 49 1155 1157 # HT OT + 1062 49 1158 1159 # HT OT + 1063 49 1158 1160 # HT OT + 1064 49 1161 1162 # HT OT + 1065 49 1161 1163 # HT OT + 1066 49 1164 1165 # HT OT + 1067 49 1164 1166 # HT OT + 1068 49 1167 1168 # HT OT + 1069 49 1167 1169 # HT OT + 1070 49 1170 1171 # HT OT + 1071 49 1170 1172 # HT OT + 1072 49 1173 1174 # HT OT + 1073 49 1173 1175 # HT OT + 1074 49 1176 1177 # HT OT + 1075 49 1176 1178 # HT OT + 1076 49 1179 1180 # HT OT + 1077 49 1179 1181 # HT OT + 1078 49 1182 1183 # HT OT + 1079 49 1182 1184 # HT OT + 1080 49 1185 1186 # HT OT + 1081 49 1185 1187 # HT OT + 1082 49 1188 1189 # HT OT + 1083 49 1188 1190 # HT OT + 1084 49 1191 1192 # HT OT + 1085 49 1191 1193 # HT OT + 1086 49 1194 1195 # HT OT + 1087 49 1194 1196 # HT OT + 1088 49 1197 1198 # HT OT + 1089 49 1197 1199 # HT OT + 1090 49 1200 1201 # HT OT + 1091 49 1200 1202 # HT OT + 1092 49 1203 1204 # HT OT + 1093 49 1203 1205 # HT OT + 1094 49 1206 1207 # HT OT + 1095 49 1206 1208 # HT OT + 1096 49 1209 1210 # HT OT + 1097 49 1209 1211 # HT OT + 1098 49 1212 1213 # HT OT + 1099 49 1212 1214 # HT OT + 1100 49 1215 1216 # HT OT + 1101 49 1215 1217 # HT OT + 1102 49 1218 1219 # HT OT + 1103 49 1218 1220 # HT OT + 1104 49 1221 1222 # HT OT + 1105 49 1221 1223 # HT OT + 1106 49 1224 1225 # HT OT + 1107 49 1224 1226 # HT OT + 1108 49 1227 1228 # HT OT + 1109 49 1227 1229 # HT OT + 1110 49 1230 1231 # HT OT + 1111 49 1230 1232 # HT OT + 1112 49 1233 1234 # HT OT + 1113 49 1233 1235 # HT OT + 1114 49 1236 1237 # HT OT + 1115 49 1236 1238 # HT OT + 1116 49 1239 1240 # HT OT + 1117 49 1239 1241 # HT OT + 1118 49 1242 1243 # HT OT + 1119 49 1242 1244 # HT OT + 1120 49 1245 1246 # HT OT + 1121 49 1245 1247 # HT OT + 1122 49 1248 1249 # HT OT + 1123 49 1248 1250 # HT OT + 1124 49 1251 1252 # HT OT + 1125 49 1251 1253 # HT OT + 1126 49 1254 1255 # HT OT + 1127 49 1254 1256 # HT OT + 1128 49 1257 1258 # HT OT + 1129 49 1257 1259 # HT OT + 1130 49 1260 1261 # HT OT + 1131 49 1260 1262 # HT OT + 1132 49 1263 1264 # HT OT + 1133 49 1263 1265 # HT OT + 1134 49 1266 1267 # HT OT + 1135 49 1266 1268 # HT OT + 1136 49 1269 1270 # HT OT + 1137 49 1269 1271 # HT OT + 1138 49 1272 1273 # HT OT + 1139 49 1272 1274 # HT OT + 1140 49 1275 1276 # HT OT + 1141 49 1275 1277 # HT OT + 1142 49 1278 1279 # HT OT + 1143 49 1278 1280 # HT OT + 1144 49 1281 1282 # HT OT + 1145 49 1281 1283 # HT OT + 1146 49 1284 1285 # HT OT + 1147 49 1284 1286 # HT OT + 1148 49 1287 1288 # HT OT + 1149 49 1287 1289 # HT OT + 1150 49 1290 1291 # HT OT + 1151 49 1290 1292 # HT OT + 1152 49 1293 1294 # HT OT + 1153 49 1293 1295 # HT OT + 1154 49 1296 1297 # HT OT + 1155 49 1296 1298 # HT OT + 1156 49 1299 1300 # HT OT + 1157 49 1299 1301 # HT OT + 1158 49 1302 1303 # HT OT + 1159 49 1302 1304 # HT OT + 1160 49 1305 1306 # HT OT + 1161 49 1305 1307 # HT OT + 1162 49 1308 1309 # HT OT + 1163 49 1308 1310 # HT OT + 1164 49 1311 1312 # HT OT + 1165 49 1311 1313 # HT OT + 1166 49 1314 1315 # HT OT + 1167 49 1314 1316 # HT OT + 1168 49 1317 1318 # HT OT + 1169 49 1317 1319 # HT OT + 1170 49 1320 1321 # HT OT + 1171 49 1320 1322 # HT OT + 1172 49 1323 1324 # HT OT + 1173 49 1323 1325 # HT OT + 1174 49 1326 1327 # HT OT + 1175 49 1326 1328 # HT OT + 1176 49 1329 1330 # HT OT + 1177 49 1329 1331 # HT OT + 1178 49 1332 1333 # HT OT + 1179 49 1332 1334 # HT OT + 1180 49 1335 1336 # HT OT + 1181 49 1335 1337 # HT OT + 1182 49 1338 1339 # HT OT + 1183 49 1338 1340 # HT OT + 1184 49 1341 1342 # HT OT + 1185 49 1341 1343 # HT OT + 1186 49 1344 1345 # HT OT + 1187 49 1344 1346 # HT OT + 1188 49 1347 1348 # HT OT + 1189 49 1347 1349 # HT OT + 1190 49 1350 1351 # HT OT + 1191 49 1350 1352 # HT OT + 1192 49 1353 1354 # HT OT + 1193 49 1353 1355 # HT OT + 1194 49 1356 1357 # HT OT + 1195 49 1356 1358 # HT OT + 1196 49 1359 1360 # HT OT + 1197 49 1359 1361 # HT OT + 1198 49 1362 1363 # HT OT + 1199 49 1362 1364 # HT OT + 1200 49 1365 1366 # HT OT + 1201 49 1365 1367 # HT OT + 1202 49 1368 1369 # HT OT + 1203 49 1368 1370 # HT OT + 1204 49 1371 1372 # HT OT + 1205 49 1371 1373 # HT OT + 1206 49 1374 1375 # HT OT + 1207 49 1374 1376 # HT OT + 1208 49 1377 1378 # HT OT + 1209 49 1377 1379 # HT OT + 1210 49 1380 1381 # HT OT + 1211 49 1380 1382 # HT OT + 1212 49 1383 1384 # HT OT + 1213 49 1383 1385 # HT OT + 1214 49 1386 1387 # HT OT + 1215 49 1386 1388 # HT OT + 1216 49 1389 1390 # HT OT + 1217 49 1389 1391 # HT OT + 1218 49 1392 1393 # HT OT + 1219 49 1392 1394 # HT OT + 1220 49 1395 1396 # HT OT + 1221 49 1395 1397 # HT OT + 1222 49 1398 1399 # HT OT + 1223 49 1398 1400 # HT OT + 1224 49 1401 1402 # HT OT + 1225 49 1401 1403 # HT OT + 1226 49 1404 1405 # HT OT + 1227 49 1404 1406 # HT OT + 1228 49 1407 1408 # HT OT + 1229 49 1407 1409 # HT OT + 1230 49 1410 1411 # HT OT + 1231 49 1410 1412 # HT OT + 1232 49 1413 1414 # HT OT + 1233 49 1413 1415 # HT OT + 1234 49 1416 1417 # HT OT + 1235 49 1416 1418 # HT OT + 1236 49 1419 1420 # HT OT + 1237 49 1419 1421 # HT OT + 1238 49 1422 1423 # HT OT + 1239 49 1422 1424 # HT OT + 1240 49 1425 1426 # HT OT + 1241 49 1425 1427 # HT OT + 1242 49 1428 1429 # HT OT + 1243 49 1428 1430 # HT OT + 1244 49 1431 1432 # HT OT + 1245 49 1431 1433 # HT OT + 1246 49 1435 1436 # HT OT + 1247 49 1435 1437 # HT OT + 1248 49 1438 1439 # HT OT + 1249 49 1438 1440 # HT OT + 1250 49 1441 1442 # HT OT + 1251 49 1441 1443 # HT OT + 1252 49 1444 1445 # HT OT + 1253 49 1444 1446 # HT OT + 1254 49 1447 1448 # HT OT + 1255 49 1447 1449 # HT OT + 1256 49 1450 1451 # HT OT + 1257 49 1450 1452 # HT OT + 1258 49 1453 1454 # HT OT + 1259 49 1453 1455 # HT OT + 1260 49 1456 1457 # HT OT + 1261 49 1456 1458 # HT OT + 1262 49 1459 1460 # HT OT + 1263 49 1459 1461 # HT OT + 1264 49 1462 1463 # HT OT + 1265 49 1462 1464 # HT OT + 1266 49 1465 1466 # HT OT + 1267 49 1465 1467 # HT OT + 1268 49 1468 1469 # HT OT + 1269 49 1468 1470 # HT OT + 1270 49 1471 1472 # HT OT + 1271 49 1471 1473 # HT OT + 1272 49 1474 1475 # HT OT + 1273 49 1474 1476 # HT OT + 1274 49 1477 1478 # HT OT + 1275 49 1477 1479 # HT OT + 1276 49 1480 1481 # HT OT + 1277 49 1480 1482 # HT OT + 1278 49 1483 1484 # HT OT + 1279 49 1483 1485 # HT OT + 1280 49 1486 1487 # HT OT + 1281 49 1486 1488 # HT OT + 1282 49 1489 1490 # HT OT + 1283 49 1489 1491 # HT OT + 1284 49 1492 1493 # HT OT + 1285 49 1492 1494 # HT OT + 1286 49 1495 1496 # HT OT + 1287 49 1495 1497 # HT OT + 1288 49 1498 1499 # HT OT + 1289 49 1498 1500 # HT OT + 1290 49 1501 1502 # HT OT + 1291 49 1501 1503 # HT OT + 1292 49 1504 1505 # HT OT + 1293 49 1504 1506 # HT OT + 1294 49 1507 1508 # HT OT + 1295 49 1507 1509 # HT OT + 1296 49 1510 1511 # HT OT + 1297 49 1510 1512 # HT OT + 1298 49 1513 1514 # HT OT + 1299 49 1513 1515 # HT OT + 1300 49 1516 1517 # HT OT + 1301 49 1516 1518 # HT OT + 1302 49 1519 1520 # HT OT + 1303 49 1519 1521 # HT OT + 1304 49 1522 1523 # HT OT + 1305 49 1522 1524 # HT OT + 1306 49 1525 1526 # HT OT + 1307 49 1525 1527 # HT OT + 1308 49 1528 1529 # HT OT + 1309 49 1528 1530 # HT OT + 1310 49 1531 1532 # HT OT + 1311 49 1531 1533 # HT OT + 1312 49 1534 1535 # HT OT + 1313 49 1534 1536 # HT OT + 1314 49 1537 1538 # HT OT + 1315 49 1537 1539 # HT OT + 1316 49 1540 1541 # HT OT + 1317 49 1540 1542 # HT OT + 1318 49 1543 1544 # HT OT + 1319 49 1543 1545 # HT OT + 1320 49 1546 1547 # HT OT + 1321 49 1546 1548 # HT OT + 1322 49 1549 1550 # HT OT + 1323 49 1549 1551 # HT OT + 1324 49 1552 1553 # HT OT + 1325 49 1552 1554 # HT OT + 1326 49 1555 1556 # HT OT + 1327 49 1555 1557 # HT OT + 1328 49 1558 1559 # HT OT + 1329 49 1558 1560 # HT OT + 1330 49 1561 1562 # HT OT + 1331 49 1561 1563 # HT OT + 1332 49 1564 1565 # HT OT + 1333 49 1564 1566 # HT OT + 1334 49 1567 1568 # HT OT + 1335 49 1567 1569 # HT OT + 1336 49 1570 1571 # HT OT + 1337 49 1570 1572 # HT OT + 1338 49 1573 1574 # HT OT + 1339 49 1573 1575 # HT OT + 1340 49 1576 1577 # HT OT + 1341 49 1576 1578 # HT OT + 1342 49 1579 1580 # HT OT + 1343 49 1579 1581 # HT OT + 1344 49 1582 1583 # HT OT + 1345 49 1582 1584 # HT OT + 1346 49 1585 1586 # HT OT + 1347 49 1585 1587 # HT OT + 1348 49 1588 1589 # HT OT + 1349 49 1588 1590 # HT OT + 1350 49 1591 1592 # HT OT + 1351 49 1591 1593 # HT OT + 1352 49 1594 1595 # HT OT + 1353 49 1594 1596 # HT OT + 1354 49 1597 1598 # HT OT + 1355 49 1597 1599 # HT OT + 1356 49 1600 1601 # HT OT + 1357 49 1600 1602 # HT OT + 1358 49 1603 1604 # HT OT + 1359 49 1603 1605 # HT OT + 1360 49 1606 1607 # HT OT + 1361 49 1606 1608 # HT OT + 1362 49 1609 1610 # HT OT + 1363 49 1609 1611 # HT OT + 1364 49 1612 1613 # HT OT + 1365 49 1612 1614 # HT OT + 1366 49 1615 1616 # HT OT + 1367 49 1615 1617 # HT OT + 1368 49 1618 1619 # HT OT + 1369 49 1618 1620 # HT OT + 1370 49 1621 1622 # HT OT + 1371 49 1621 1623 # HT OT + 1372 49 1624 1625 # HT OT + 1373 49 1624 1626 # HT OT + 1374 49 1627 1628 # HT OT + 1375 49 1627 1629 # HT OT + 1376 49 1630 1631 # HT OT + 1377 49 1630 1632 # HT OT + 1378 49 1633 1634 # HT OT + 1379 49 1633 1635 # HT OT + 1380 49 1636 1637 # HT OT + 1381 49 1636 1638 # HT OT + 1382 49 1639 1640 # HT OT + 1383 49 1639 1641 # HT OT + 1384 49 1642 1643 # HT OT + 1385 49 1642 1644 # HT OT + 1386 49 1645 1646 # HT OT + 1387 49 1645 1647 # HT OT + 1388 49 1648 1649 # HT OT + 1389 49 1648 1650 # HT OT + 1390 49 1651 1652 # HT OT + 1391 49 1651 1653 # HT OT + 1392 49 1654 1655 # HT OT + 1393 49 1654 1656 # HT OT + 1394 49 1657 1658 # HT OT + 1395 49 1657 1659 # HT OT + 1396 49 1660 1661 # HT OT + 1397 49 1660 1662 # HT OT + 1398 49 1663 1664 # HT OT + 1399 49 1663 1665 # HT OT + 1400 49 1666 1667 # HT OT + 1401 49 1666 1668 # HT OT + 1402 49 1669 1670 # HT OT + 1403 49 1669 1671 # HT OT + 1404 49 1672 1673 # HT OT + 1405 49 1672 1674 # HT OT + 1406 49 1675 1676 # HT OT + 1407 49 1675 1677 # HT OT + 1408 49 1678 1679 # HT OT + 1409 49 1678 1680 # HT OT + 1410 49 1681 1682 # HT OT + 1411 49 1681 1683 # HT OT + 1412 49 1684 1685 # HT OT + 1413 49 1684 1686 # HT OT + 1414 49 1687 1688 # HT OT + 1415 49 1687 1689 # HT OT + 1416 49 1690 1691 # HT OT + 1417 49 1690 1692 # HT OT + 1418 49 1693 1694 # HT OT + 1419 49 1693 1695 # HT OT + 1420 49 1696 1697 # HT OT + 1421 49 1696 1698 # HT OT + 1422 49 1699 1700 # HT OT + 1423 49 1699 1701 # HT OT + 1424 49 1702 1703 # HT OT + 1425 49 1702 1704 # HT OT + 1426 49 1705 1706 # HT OT + 1427 49 1705 1707 # HT OT + 1428 49 1708 1709 # HT OT + 1429 49 1708 1710 # HT OT + 1430 49 1711 1712 # HT OT + 1431 49 1711 1713 # HT OT + 1432 49 1714 1715 # HT OT + 1433 49 1714 1716 # HT OT + 1434 49 1717 1718 # HT OT + 1435 49 1717 1719 # HT OT + 1436 49 1720 1721 # HT OT + 1437 49 1720 1722 # HT OT + 1438 49 1723 1724 # HT OT + 1439 49 1723 1725 # HT OT + 1440 49 1726 1727 # HT OT + 1441 49 1726 1728 # HT OT + 1442 49 1729 1730 # HT OT + 1443 49 1729 1731 # HT OT + 1444 49 1732 1733 # HT OT + 1445 49 1732 1734 # HT OT + 1446 49 1735 1736 # HT OT + 1447 49 1735 1737 # HT OT + 1448 49 1738 1739 # HT OT + 1449 49 1738 1740 # HT OT + 1450 49 1741 1742 # HT OT + 1451 49 1741 1743 # HT OT + 1452 49 1744 1745 # HT OT + 1453 49 1744 1746 # HT OT + 1454 49 1747 1748 # HT OT + 1455 49 1747 1749 # HT OT + 1456 49 1750 1751 # HT OT + 1457 49 1750 1752 # HT OT + 1458 49 1753 1754 # HT OT + 1459 49 1753 1755 # HT OT + 1460 49 1756 1757 # HT OT + 1461 49 1756 1758 # HT OT + 1462 49 1759 1760 # HT OT + 1463 49 1759 1761 # HT OT + 1464 49 1762 1763 # HT OT + 1465 49 1762 1764 # HT OT + 1466 49 1765 1766 # HT OT + 1467 49 1765 1767 # HT OT + 1468 49 1768 1769 # HT OT + 1469 49 1768 1770 # HT OT + 1470 49 1771 1772 # HT OT + 1471 49 1771 1773 # HT OT + 1472 49 1774 1775 # HT OT + 1473 49 1774 1776 # HT OT + 1474 49 1777 1778 # HT OT + 1475 49 1777 1779 # HT OT + 1476 49 1780 1781 # HT OT + 1477 49 1780 1782 # HT OT + 1478 49 1783 1784 # HT OT + 1479 49 1783 1785 # HT OT + 1480 49 1786 1787 # HT OT + 1481 49 1786 1788 # HT OT + 1482 49 1789 1790 # HT OT + 1483 49 1789 1791 # HT OT + 1484 49 1792 1793 # HT OT + 1485 49 1792 1794 # HT OT + 1486 49 1795 1796 # HT OT + 1487 49 1795 1797 # HT OT + 1488 49 1798 1799 # HT OT + 1489 49 1798 1800 # HT OT + 1490 49 1801 1802 # HT OT + 1491 49 1801 1803 # HT OT + 1492 49 1805 1806 # HT OT + 1493 49 1805 1807 # HT OT + 1494 49 1808 1809 # HT OT + 1495 49 1808 1810 # HT OT + 1496 49 1811 1812 # HT OT + 1497 49 1811 1813 # HT OT + 1498 49 1814 1815 # HT OT + 1499 49 1814 1816 # HT OT + 1500 49 1817 1818 # HT OT + 1501 49 1817 1819 # HT OT + 1502 49 1820 1821 # HT OT + 1503 49 1820 1822 # HT OT + 1504 49 1823 1824 # HT OT + 1505 49 1823 1825 # HT OT + 1506 49 1826 1827 # HT OT + 1507 49 1826 1828 # HT OT + 1508 49 1829 1830 # HT OT + 1509 49 1829 1831 # HT OT + 1510 49 1832 1833 # HT OT + 1511 49 1832 1834 # HT OT + 1512 49 1835 1836 # HT OT + 1513 49 1835 1837 # HT OT + 1514 49 1838 1839 # HT OT + 1515 49 1838 1840 # HT OT + 1516 49 1841 1842 # HT OT + 1517 49 1841 1843 # HT OT + 1518 49 1844 1845 # HT OT + 1519 49 1844 1846 # HT OT + 1520 49 1847 1848 # HT OT + 1521 49 1847 1849 # HT OT + 1522 49 1850 1851 # HT OT + 1523 49 1850 1852 # HT OT + 1524 49 1853 1854 # HT OT + 1525 49 1853 1855 # HT OT + 1526 49 1856 1857 # HT OT + 1527 49 1856 1858 # HT OT + 1528 49 1859 1860 # HT OT + 1529 49 1859 1861 # HT OT + 1530 49 1862 1863 # HT OT + 1531 49 1862 1864 # HT OT + 1532 49 1865 1866 # HT OT + 1533 49 1865 1867 # HT OT + 1534 49 1868 1869 # HT OT + 1535 49 1868 1870 # HT OT + 1536 49 1871 1872 # HT OT + 1537 49 1871 1873 # HT OT + 1538 49 1874 1875 # HT OT + 1539 49 1874 1876 # HT OT + 1540 49 1877 1878 # HT OT + 1541 49 1877 1879 # HT OT + 1542 49 1880 1881 # HT OT + 1543 49 1880 1882 # HT OT + 1544 49 1883 1884 # HT OT + 1545 49 1883 1885 # HT OT + 1546 49 1886 1887 # HT OT + 1547 49 1886 1888 # HT OT + 1548 49 1889 1890 # HT OT + 1549 49 1889 1891 # HT OT + 1550 49 1892 1893 # HT OT + 1551 49 1892 1894 # HT OT + 1552 49 1895 1896 # HT OT + 1553 49 1895 1897 # HT OT + 1554 49 1898 1899 # HT OT + 1555 49 1898 1900 # HT OT + 1556 49 1901 1902 # HT OT + 1557 49 1901 1903 # HT OT + 1558 49 1904 1905 # HT OT + 1559 49 1904 1906 # HT OT + 1560 49 1907 1908 # HT OT + 1561 49 1907 1909 # HT OT + 1562 49 1910 1911 # HT OT + 1563 49 1910 1912 # HT OT + 1564 49 1913 1914 # HT OT + 1565 49 1913 1915 # HT OT + 1566 49 1916 1917 # HT OT + 1567 49 1916 1918 # HT OT + 1568 49 1919 1920 # HT OT + 1569 49 1919 1921 # HT OT + 1570 49 1922 1923 # HT OT + 1571 49 1922 1924 # HT OT + 1572 49 1925 1926 # HT OT + 1573 49 1925 1927 # HT OT + 1574 49 1928 1929 # HT OT + 1575 49 1928 1930 # HT OT + 1576 49 1931 1932 # HT OT + 1577 49 1931 1933 # HT OT + 1578 49 1934 1935 # HT OT + 1579 49 1934 1936 # HT OT + 1580 49 1937 1938 # HT OT + 1581 49 1937 1939 # HT OT + 1582 49 1940 1941 # HT OT + 1583 49 1940 1942 # HT OT + 1584 49 1943 1944 # HT OT + 1585 49 1943 1945 # HT OT + 1586 49 1946 1947 # HT OT + 1587 49 1946 1948 # HT OT + 1588 49 1949 1950 # HT OT + 1589 49 1949 1951 # HT OT + 1590 49 1952 1953 # HT OT + 1591 49 1952 1954 # HT OT + 1592 49 1955 1956 # HT OT + 1593 49 1955 1957 # HT OT + 1594 49 1958 1959 # HT OT + 1595 49 1958 1960 # HT OT + 1596 49 1961 1962 # HT OT + 1597 49 1961 1963 # HT OT + 1598 49 1964 1965 # HT OT + 1599 49 1964 1966 # HT OT + 1600 49 1967 1968 # HT OT + 1601 49 1967 1969 # HT OT + 1602 49 1970 1971 # HT OT + 1603 49 1970 1972 # HT OT + 1604 49 1973 1974 # HT OT + 1605 49 1973 1975 # HT OT + 1606 49 1976 1977 # HT OT + 1607 49 1976 1978 # HT OT + 1608 49 1979 1980 # HT OT + 1609 49 1979 1981 # HT OT + 1610 49 1982 1983 # HT OT + 1611 49 1982 1984 # HT OT + 1612 49 1985 1986 # HT OT + 1613 49 1985 1987 # HT OT + 1614 49 1988 1989 # HT OT + 1615 49 1988 1990 # HT OT + 1616 49 1991 1992 # HT OT + 1617 49 1991 1993 # HT OT + 1618 49 1994 1995 # HT OT + 1619 49 1994 1996 # HT OT + 1620 49 1997 1998 # HT OT + 1621 49 1997 1999 # HT OT + 1622 49 2000 2001 # HT OT + 1623 49 2000 2002 # HT OT + 1624 49 2003 2004 # HT OT + 1625 49 2003 2005 # HT OT + 1626 49 2006 2007 # HT OT + 1627 49 2006 2008 # HT OT + 1628 49 2009 2010 # HT OT + 1629 49 2009 2011 # HT OT + 1630 49 2012 2013 # HT OT + 1631 49 2012 2014 # HT OT + 1632 49 2015 2016 # HT OT + 1633 49 2015 2017 # HT OT + 1634 49 2018 2019 # HT OT + 1635 49 2018 2020 # HT OT + 1636 49 2021 2022 # HT OT + 1637 49 2021 2023 # HT OT + 1638 49 2024 2025 # HT OT + 1639 49 2024 2026 # HT OT + 1640 49 2027 2028 # HT OT + 1641 49 2027 2029 # HT OT + 1642 49 2030 2031 # HT OT + 1643 49 2030 2032 # HT OT + 1644 49 2033 2034 # HT OT + 1645 49 2033 2035 # HT OT + 1646 49 2036 2037 # HT OT + 1647 49 2036 2038 # HT OT + 1648 49 2039 2040 # HT OT + 1649 49 2039 2041 # HT OT + 1650 49 2042 2043 # HT OT + 1651 49 2042 2044 # HT OT + 1652 49 2045 2046 # HT OT + 1653 49 2045 2047 # HT OT + 1654 49 2048 2049 # HT OT + 1655 49 2048 2050 # HT OT + 1656 49 2051 2052 # HT OT + 1657 49 2051 2053 # HT OT + 1658 49 2054 2055 # HT OT + 1659 49 2054 2056 # HT OT + 1660 49 2057 2058 # HT OT + 1661 49 2057 2059 # HT OT + 1662 49 2060 2061 # HT OT + 1663 49 2060 2062 # HT OT + 1664 49 2063 2064 # HT OT + 1665 49 2063 2065 # HT OT + 1666 49 2066 2067 # HT OT + 1667 49 2066 2068 # HT OT + 1668 49 2069 2070 # HT OT + 1669 49 2069 2071 # HT OT + 1670 49 2072 2073 # HT OT + 1671 49 2072 2074 # HT OT + 1672 49 2075 2076 # HT OT + 1673 49 2075 2077 # HT OT + 1674 49 2078 2079 # HT OT + 1675 49 2078 2080 # HT OT + 1676 49 2081 2082 # HT OT + 1677 49 2081 2083 # HT OT + 1678 49 2084 2085 # HT OT + 1679 49 2084 2086 # HT OT + 1680 49 2087 2088 # HT OT + 1681 49 2087 2089 # HT OT + 1682 49 2090 2091 # HT OT + 1683 49 2090 2092 # HT OT + 1684 49 2093 2094 # HT OT + 1685 49 2093 2095 # HT OT + 1686 49 2096 2097 # HT OT + 1687 49 2096 2098 # HT OT + 1688 49 2099 2100 # HT OT + 1689 49 2099 2101 # HT OT + 1690 49 2102 2103 # HT OT + 1691 49 2102 2104 # HT OT + 1692 49 2105 2106 # HT OT + 1693 49 2105 2107 # HT OT + 1694 49 2108 2109 # HT OT + 1695 49 2108 2110 # HT OT + 1696 49 2111 2112 # HT OT + 1697 49 2111 2113 # HT OT + 1698 49 2114 2115 # HT OT + 1699 49 2114 2116 # HT OT + 1700 49 2117 2118 # HT OT + 1701 49 2117 2119 # HT OT + 1702 49 2120 2121 # HT OT + 1703 49 2120 2122 # HT OT + 1704 49 2123 2124 # HT OT + 1705 49 2123 2125 # HT OT + 1706 49 2126 2127 # HT OT + 1707 49 2126 2128 # HT OT + 1708 49 2129 2130 # HT OT + 1709 49 2129 2131 # HT OT + 1710 49 2132 2133 # HT OT + 1711 49 2132 2134 # HT OT + 1712 49 2135 2136 # HT OT + 1713 49 2135 2137 # HT OT + 1714 49 2138 2139 # HT OT + 1715 49 2138 2140 # HT OT + 1716 49 2141 2142 # HT OT + 1717 49 2141 2143 # HT OT + 1718 49 2144 2145 # HT OT + 1719 49 2144 2146 # HT OT + 1720 49 2147 2148 # HT OT + 1721 49 2147 2149 # HT OT + 1722 49 2150 2151 # HT OT + 1723 49 2150 2152 # HT OT + 1724 49 2153 2154 # HT OT + 1725 49 2153 2155 # HT OT + 1726 49 2156 2157 # HT OT + 1727 49 2156 2158 # HT OT + 1728 49 2159 2160 # HT OT + 1729 49 2159 2161 # HT OT + 1730 49 2162 2163 # HT OT + 1731 49 2162 2164 # HT OT + 1732 49 2165 2166 # HT OT + 1733 49 2165 2167 # HT OT + 1734 49 2168 2169 # HT OT + 1735 49 2168 2170 # HT OT + 1736 49 2171 2172 # HT OT + 1737 49 2171 2173 # HT OT + 1738 49 2174 2175 # HT OT + 1739 49 2174 2176 # HT OT + 1740 49 2177 2178 # HT OT + 1741 49 2177 2179 # HT OT + 1742 49 2180 2181 # HT OT + 1743 49 2180 2182 # HT OT + 1744 49 2183 2184 # HT OT + 1745 49 2183 2185 # HT OT + 1746 49 2186 2187 # HT OT + 1747 49 2186 2188 # HT OT + 1748 49 2189 2190 # HT OT + 1749 49 2189 2191 # HT OT + 1750 49 2192 2193 # HT OT + 1751 49 2192 2194 # HT OT + 1752 49 2195 2196 # HT OT + 1753 49 2195 2197 # HT OT + 1754 49 2198 2199 # HT OT + 1755 49 2198 2200 # HT OT + 1756 49 2201 2202 # HT OT + 1757 49 2201 2203 # HT OT + 1758 49 2204 2205 # HT OT + 1759 49 2204 2206 # HT OT + 1760 49 2207 2208 # HT OT + 1761 49 2207 2209 # HT OT + 1762 49 2210 2211 # HT OT + 1763 49 2210 2212 # HT OT + 1764 49 2213 2214 # HT OT + 1765 49 2213 2215 # HT OT + 1766 49 2216 2217 # HT OT + 1767 49 2216 2218 # HT OT + 1768 49 2219 2220 # HT OT + 1769 49 2219 2221 # HT OT + 1770 49 2222 2223 # HT OT + 1771 49 2222 2224 # HT OT + 1772 49 2225 2226 # HT OT + 1773 49 2225 2227 # HT OT + 1774 49 2228 2229 # HT OT + 1775 49 2228 2230 # HT OT + 1776 49 2231 2232 # HT OT + 1777 49 2231 2233 # HT OT + 1778 49 2234 2235 # HT OT + 1779 49 2234 2236 # HT OT + 1780 49 2237 2238 # HT OT + 1781 49 2237 2239 # HT OT + 1782 49 2240 2241 # HT OT + 1783 49 2240 2242 # HT OT + 1784 49 2243 2244 # HT OT + 1785 49 2243 2245 # HT OT + 1786 49 2246 2247 # HT OT + 1787 49 2246 2248 # HT OT + 1788 49 2249 2250 # HT OT + 1789 49 2249 2251 # HT OT + 1790 49 2252 2253 # HT OT + 1791 49 2252 2254 # HT OT + 1792 49 2255 2256 # HT OT + 1793 49 2255 2257 # HT OT + 1794 49 2258 2259 # HT OT + 1795 49 2258 2260 # HT OT + 1796 49 2261 2262 # HT OT + 1797 49 2261 2263 # HT OT + 1798 49 2264 2265 # HT OT + 1799 49 2264 2266 # HT OT + 1800 49 2267 2268 # HT OT + 1801 49 2267 2269 # HT OT + 1802 49 2270 2271 # HT OT + 1803 49 2270 2272 # HT OT + 1804 49 2273 2274 # HT OT + 1805 49 2273 2275 # HT OT + 1806 49 2276 2277 # HT OT + 1807 49 2276 2278 # HT OT + 1808 49 2279 2280 # HT OT + 1809 49 2279 2281 # HT OT + 1810 49 2282 2283 # HT OT + 1811 49 2282 2284 # HT OT + 1812 49 2285 2286 # HT OT + 1813 49 2285 2287 # HT OT + 1814 49 2288 2289 # HT OT + 1815 49 2288 2290 # HT OT + 1816 49 2291 2292 # HT OT + 1817 49 2291 2293 # HT OT + 1818 49 2294 2295 # HT OT + 1819 49 2294 2296 # HT OT + 1820 49 2297 2298 # HT OT + 1821 49 2297 2299 # HT OT + 1822 49 2300 2301 # HT OT + 1823 49 2300 2302 # HT OT + 1824 49 2303 2304 # HT OT + 1825 49 2303 2305 # HT OT + 1826 49 2306 2307 # HT OT + 1827 49 2306 2308 # HT OT + 1828 49 2309 2310 # HT OT + 1829 49 2309 2311 # HT OT + 1830 49 2312 2313 # HT OT + 1831 49 2312 2314 # HT OT + 1832 49 2315 2316 # HT OT + 1833 49 2315 2317 # HT OT + 1834 49 2318 2319 # HT OT + 1835 49 2318 2320 # HT OT + 1836 49 2321 2322 # HT OT + 1837 49 2321 2323 # HT OT + 1838 49 2324 2325 # HT OT + 1839 49 2324 2326 # HT OT + 1840 49 2327 2328 # HT OT + 1841 49 2327 2329 # HT OT + 1842 49 2330 2331 # HT OT + 1843 49 2330 2332 # HT OT + 1844 49 2333 2334 # HT OT + 1845 49 2333 2335 # HT OT + 1846 49 2336 2337 # HT OT + 1847 49 2336 2338 # HT OT + 1848 49 2339 2340 # HT OT + 1849 49 2339 2341 # HT OT + 1850 49 2342 2343 # HT OT + 1851 49 2342 2344 # HT OT + 1852 49 2345 2346 # HT OT + 1853 49 2345 2347 # HT OT + 1854 49 2348 2349 # HT OT + 1855 49 2348 2350 # HT OT + 1856 49 2351 2352 # HT OT + 1857 49 2351 2353 # HT OT + 1858 49 2354 2355 # HT OT + 1859 49 2354 2356 # HT OT + 1860 49 2357 2358 # HT OT + 1861 49 2357 2359 # HT OT + 1862 49 2360 2361 # HT OT + 1863 49 2360 2362 # HT OT + 1864 49 2363 2364 # HT OT + 1865 49 2363 2365 # HT OT + 1866 49 2366 2367 # HT OT + 1867 49 2366 2368 # HT OT + 1868 49 2369 2370 # HT OT + 1869 49 2369 2371 # HT OT + 1870 49 2372 2373 # HT OT + 1871 49 2372 2374 # HT OT + 1872 49 2375 2376 # HT OT + 1873 49 2375 2377 # HT OT + 1874 49 2378 2379 # HT OT + 1875 49 2378 2380 # HT OT + 1876 49 2381 2382 # HT OT + 1877 49 2381 2383 # HT OT + 1878 49 2384 2385 # HT OT + 1879 49 2384 2386 # HT OT + 1880 49 2387 2388 # HT OT + 1881 49 2387 2389 # HT OT + 1882 49 2390 2391 # HT OT + 1883 49 2390 2392 # HT OT + 1884 49 2393 2394 # HT OT + 1885 49 2393 2395 # HT OT + 1886 49 2396 2397 # HT OT + 1887 49 2396 2398 # HT OT + 1888 49 2399 2400 # HT OT + 1889 49 2399 2401 # HT OT + 1890 49 2402 2403 # HT OT + 1891 49 2402 2404 # HT OT + 1892 49 2405 2406 # HT OT + 1893 49 2405 2407 # HT OT + 1894 49 2408 2409 # HT OT + 1895 49 2408 2410 # HT OT + 1896 49 2411 2412 # HT OT + 1897 49 2411 2413 # HT OT + 1898 49 2414 2415 # HT OT + 1899 49 2414 2416 # HT OT + 1900 49 2417 2418 # HT OT + 1901 49 2417 2419 # HT OT + 1902 49 2420 2421 # HT OT + 1903 49 2420 2422 # HT OT + 1904 49 2423 2424 # HT OT + 1905 49 2423 2425 # HT OT + 1906 49 2426 2427 # HT OT + 1907 49 2426 2428 # HT OT + 1908 49 2429 2430 # HT OT + 1909 49 2429 2431 # HT OT + 1910 49 2432 2433 # HT OT + 1911 49 2432 2434 # HT OT + 1912 49 2435 2436 # HT OT + 1913 49 2435 2437 # HT OT + 1914 49 2438 2439 # HT OT + 1915 49 2438 2440 # HT OT + 1916 49 2441 2442 # HT OT + 1917 49 2441 2443 # HT OT + 1918 49 2444 2445 # HT OT + 1919 49 2444 2446 # HT OT + 1920 49 2447 2448 # HT OT + 1921 49 2447 2449 # HT OT + 1922 49 2450 2451 # HT OT + 1923 49 2450 2452 # HT OT + 1924 49 2453 2454 # HT OT + 1925 49 2453 2455 # HT OT + 1926 49 2456 2457 # HT OT + 1927 49 2456 2458 # HT OT + 1928 49 2459 2460 # HT OT + 1929 49 2459 2461 # HT OT + 1930 49 2462 2463 # HT OT + 1931 49 2462 2464 # HT OT + 1932 49 2465 2466 # HT OT + 1933 49 2465 2467 # HT OT + 1934 49 2468 2469 # HT OT + 1935 49 2468 2470 # HT OT + 1936 49 2471 2472 # HT OT + 1937 49 2471 2473 # HT OT + 1938 49 2474 2475 # HT OT + 1939 49 2474 2476 # HT OT + 1940 49 2477 2478 # HT OT + 1941 49 2477 2479 # HT OT + 1942 49 2480 2481 # HT OT + 1943 49 2480 2482 # HT OT + 1944 49 2483 2484 # HT OT + 1945 49 2483 2485 # HT OT + 1946 49 2486 2487 # HT OT + 1947 49 2486 2488 # HT OT + 1948 49 2489 2490 # HT OT + 1949 49 2489 2491 # HT OT + 1950 49 2492 2493 # HT OT + 1951 49 2492 2494 # HT OT + 1952 49 2495 2496 # HT OT + 1953 49 2495 2497 # HT OT 1954 49 2498 2499 # HT OT 1955 49 2498 2500 # HT OT 1956 49 2501 2502 # HT OT @@ -6831,542 +6832,542 @@ Angles 1559 112 878 877 879 # HT OT HT 1560 112 881 880 882 # HT OT HT 1561 112 884 883 885 # HT OT HT - 1562 112 887 886 888 # HT OT HT - 1563 112 890 889 891 # HT OT HT - 1564 112 893 892 894 # HT OT HT - 1565 112 896 895 897 # HT OT HT - 1566 112 899 898 900 # HT OT HT - 1567 112 902 901 903 # HT OT HT - 1568 112 905 904 906 # HT OT HT - 1569 112 908 907 909 # HT OT HT - 1570 112 911 910 912 # HT OT HT - 1571 112 914 913 915 # HT OT HT - 1572 112 917 916 918 # HT OT HT - 1573 112 920 919 921 # HT OT HT - 1574 112 923 922 924 # HT OT HT - 1575 112 926 925 927 # HT OT HT - 1576 112 929 928 930 # HT OT HT - 1577 112 932 931 933 # HT OT HT - 1578 112 935 934 936 # HT OT HT - 1579 112 938 937 939 # HT OT HT - 1580 112 941 940 942 # HT OT HT - 1581 112 944 943 945 # HT OT HT - 1582 112 947 946 948 # HT OT HT - 1583 112 950 949 951 # HT OT HT - 1584 112 953 952 954 # HT OT HT - 1585 112 956 955 957 # HT OT HT - 1586 112 959 958 960 # HT OT HT - 1587 112 962 961 963 # HT OT HT - 1588 112 965 964 966 # HT OT HT - 1589 112 968 967 969 # HT OT HT - 1590 112 971 970 972 # HT OT HT - 1591 112 974 973 975 # HT OT HT - 1592 112 977 976 978 # HT OT HT - 1593 112 980 979 981 # HT OT HT - 1594 112 983 982 984 # HT OT HT - 1595 112 986 985 987 # HT OT HT - 1596 112 989 988 990 # HT OT HT - 1597 112 992 991 993 # HT OT HT - 1598 112 995 994 996 # HT OT HT - 1599 112 998 997 999 # HT OT HT - 1600 112 1001 1000 1002 # HT OT HT - 1601 112 1004 1003 1005 # HT OT HT - 1602 112 1007 1006 1008 # HT OT HT - 1603 112 1010 1009 1011 # HT OT HT - 1604 112 1013 1012 1014 # HT OT HT - 1605 112 1016 1015 1017 # HT OT HT - 1606 112 1019 1018 1020 # HT OT HT - 1607 112 1022 1021 1023 # HT OT HT - 1608 112 1025 1024 1026 # HT OT HT - 1609 112 1028 1027 1029 # HT OT HT - 1610 112 1031 1030 1032 # HT OT HT - 1611 112 1034 1033 1035 # HT OT HT - 1612 112 1037 1036 1038 # HT OT HT - 1613 112 1040 1039 1041 # HT OT HT - 1614 112 1043 1042 1044 # HT OT HT - 1615 112 1046 1045 1047 # HT OT HT - 1616 112 1049 1048 1050 # HT OT HT - 1617 112 1052 1051 1053 # HT OT HT - 1618 112 1055 1054 1056 # HT OT HT - 1619 112 1058 1057 1059 # HT OT HT - 1620 112 1061 1060 1062 # HT OT HT - 1621 112 1064 1063 1065 # HT OT HT - 1622 112 1067 1066 1068 # HT OT HT - 1623 112 1070 1069 1071 # HT OT HT - 1624 112 1073 1072 1074 # HT OT HT - 1625 112 1076 1075 1077 # HT OT HT - 1626 112 1079 1078 1080 # HT OT HT - 1627 112 1082 1081 1083 # HT OT HT - 1628 112 1085 1084 1086 # HT OT HT - 1629 112 1088 1087 1089 # HT OT HT - 1630 112 1091 1090 1092 # HT OT HT - 1631 112 1094 1093 1095 # HT OT HT - 1632 112 1097 1096 1098 # HT OT HT - 1633 112 1100 1099 1101 # HT OT HT - 1634 112 1103 1102 1104 # HT OT HT - 1635 112 1106 1105 1107 # HT OT HT - 1636 112 1109 1108 1110 # HT OT HT - 1637 112 1112 1111 1113 # HT OT HT - 1638 112 1115 1114 1116 # HT OT HT - 1639 112 1118 1117 1119 # HT OT HT - 1640 112 1121 1120 1122 # HT OT HT - 1641 112 1124 1123 1125 # HT OT HT - 1642 112 1127 1126 1128 # HT OT HT - 1643 112 1130 1129 1131 # HT OT HT - 1644 112 1133 1132 1134 # HT OT HT - 1645 112 1136 1135 1137 # HT OT HT - 1646 112 1139 1138 1140 # HT OT HT - 1647 112 1142 1141 1143 # HT OT HT - 1648 112 1145 1144 1146 # HT OT HT - 1649 112 1148 1147 1149 # HT OT HT - 1650 112 1151 1150 1152 # HT OT HT - 1651 112 1154 1153 1155 # HT OT HT - 1652 112 1157 1156 1158 # HT OT HT - 1653 112 1160 1159 1161 # HT OT HT - 1654 112 1163 1162 1164 # HT OT HT - 1655 112 1166 1165 1167 # HT OT HT - 1656 112 1169 1168 1170 # HT OT HT - 1657 112 1172 1171 1173 # HT OT HT - 1658 112 1175 1174 1176 # HT OT HT - 1659 112 1178 1177 1179 # HT OT HT - 1660 112 1181 1180 1182 # HT OT HT - 1661 112 1184 1183 1185 # HT OT HT - 1662 112 1187 1186 1188 # HT OT HT - 1663 112 1190 1189 1191 # HT OT HT - 1664 112 1193 1192 1194 # HT OT HT - 1665 112 1196 1195 1197 # HT OT HT - 1666 112 1199 1198 1200 # HT OT HT - 1667 112 1202 1201 1203 # HT OT HT - 1668 112 1205 1204 1206 # HT OT HT - 1669 112 1208 1207 1209 # HT OT HT - 1670 112 1211 1210 1212 # HT OT HT - 1671 112 1214 1213 1215 # HT OT HT - 1672 112 1217 1216 1218 # HT OT HT - 1673 112 1220 1219 1221 # HT OT HT - 1674 112 1223 1222 1224 # HT OT HT - 1675 112 1226 1225 1227 # HT OT HT - 1676 112 1229 1228 1230 # HT OT HT - 1677 112 1232 1231 1233 # HT OT HT - 1678 112 1235 1234 1236 # HT OT HT - 1679 112 1238 1237 1239 # HT OT HT - 1680 112 1241 1240 1242 # HT OT HT - 1681 112 1244 1243 1245 # HT OT HT - 1682 112 1247 1246 1248 # HT OT HT - 1683 112 1250 1249 1251 # HT OT HT - 1684 112 1253 1252 1254 # HT OT HT - 1685 112 1256 1255 1257 # HT OT HT - 1686 112 1259 1258 1260 # HT OT HT - 1687 112 1262 1261 1263 # HT OT HT - 1688 112 1265 1264 1266 # HT OT HT - 1689 112 1268 1267 1269 # HT OT HT - 1690 112 1271 1270 1272 # HT OT HT - 1691 112 1274 1273 1275 # HT OT HT - 1692 112 1277 1276 1278 # HT OT HT - 1693 112 1280 1279 1281 # HT OT HT - 1694 112 1283 1282 1284 # HT OT HT - 1695 112 1286 1285 1287 # HT OT HT - 1696 112 1289 1288 1290 # HT OT HT - 1697 112 1292 1291 1293 # HT OT HT - 1698 112 1295 1294 1296 # HT OT HT - 1699 112 1298 1297 1299 # HT OT HT - 1700 112 1301 1300 1302 # HT OT HT - 1701 112 1304 1303 1305 # HT OT HT - 1702 112 1307 1306 1308 # HT OT HT - 1703 112 1310 1309 1311 # HT OT HT - 1704 112 1313 1312 1314 # HT OT HT - 1705 112 1316 1315 1317 # HT OT HT - 1706 112 1319 1318 1320 # HT OT HT - 1707 112 1322 1321 1323 # HT OT HT - 1708 112 1325 1324 1326 # HT OT HT - 1709 112 1328 1327 1329 # HT OT HT - 1710 112 1331 1330 1332 # HT OT HT - 1711 112 1334 1333 1335 # HT OT HT - 1712 112 1337 1336 1338 # HT OT HT - 1713 112 1340 1339 1341 # HT OT HT - 1714 112 1343 1342 1344 # HT OT HT - 1715 112 1346 1345 1347 # HT OT HT - 1716 112 1349 1348 1350 # HT OT HT - 1717 112 1352 1351 1353 # HT OT HT - 1718 112 1355 1354 1356 # HT OT HT - 1719 112 1358 1357 1359 # HT OT HT - 1720 112 1361 1360 1362 # HT OT HT - 1721 112 1364 1363 1365 # HT OT HT - 1722 112 1367 1366 1368 # HT OT HT - 1723 112 1370 1369 1371 # HT OT HT - 1724 112 1373 1372 1374 # HT OT HT - 1725 112 1376 1375 1377 # HT OT HT - 1726 112 1379 1378 1380 # HT OT HT - 1727 112 1382 1381 1383 # HT OT HT - 1728 112 1385 1384 1386 # HT OT HT - 1729 112 1388 1387 1389 # HT OT HT - 1730 112 1391 1390 1392 # HT OT HT - 1731 112 1394 1393 1395 # HT OT HT - 1732 112 1397 1396 1398 # HT OT HT - 1733 112 1400 1399 1401 # HT OT HT - 1734 112 1403 1402 1404 # HT OT HT - 1735 112 1406 1405 1407 # HT OT HT - 1736 112 1409 1408 1410 # HT OT HT - 1737 112 1412 1411 1413 # HT OT HT - 1738 112 1415 1414 1416 # HT OT HT - 1739 112 1418 1417 1419 # HT OT HT - 1740 112 1421 1420 1422 # HT OT HT - 1741 112 1424 1423 1425 # HT OT HT - 1742 112 1427 1426 1428 # HT OT HT - 1743 112 1430 1429 1431 # HT OT HT - 1744 112 1433 1432 1434 # HT OT HT - 1745 112 1436 1435 1437 # HT OT HT - 1746 112 1439 1438 1440 # HT OT HT - 1747 112 1442 1441 1443 # HT OT HT - 1748 112 1445 1444 1446 # HT OT HT - 1749 112 1448 1447 1449 # HT OT HT - 1750 112 1451 1450 1452 # HT OT HT - 1751 112 1454 1453 1455 # HT OT HT - 1752 112 1457 1456 1458 # HT OT HT - 1753 112 1460 1459 1461 # HT OT HT - 1754 112 1463 1462 1464 # HT OT HT - 1755 112 1466 1465 1467 # HT OT HT - 1756 112 1469 1468 1470 # HT OT HT - 1757 112 1472 1471 1473 # HT OT HT - 1758 112 1475 1474 1476 # HT OT HT - 1759 112 1478 1477 1479 # HT OT HT - 1760 112 1481 1480 1482 # HT OT HT - 1761 112 1484 1483 1485 # HT OT HT - 1762 112 1487 1486 1488 # HT OT HT - 1763 112 1490 1489 1491 # HT OT HT - 1764 112 1493 1492 1494 # HT OT HT - 1765 112 1496 1495 1497 # HT OT HT - 1766 112 1499 1498 1500 # HT OT HT - 1767 112 1502 1501 1503 # HT OT HT - 1768 112 1505 1504 1506 # HT OT HT - 1769 112 1508 1507 1509 # HT OT HT - 1770 112 1511 1510 1512 # HT OT HT - 1771 112 1514 1513 1515 # HT OT HT - 1772 112 1517 1516 1518 # HT OT HT - 1773 112 1520 1519 1521 # HT OT HT - 1774 112 1523 1522 1524 # HT OT HT - 1775 112 1526 1525 1527 # HT OT HT - 1776 112 1530 1529 1531 # HT OT HT - 1777 112 1533 1532 1534 # HT OT HT - 1778 112 1536 1535 1537 # HT OT HT - 1779 112 1539 1538 1540 # HT OT HT - 1780 112 1542 1541 1543 # HT OT HT - 1781 112 1545 1544 1546 # HT OT HT - 1782 112 1548 1547 1549 # HT OT HT - 1783 112 1551 1550 1552 # HT OT HT - 1784 112 1554 1553 1555 # HT OT HT - 1785 112 1557 1556 1558 # HT OT HT - 1786 112 1560 1559 1561 # HT OT HT - 1787 112 1563 1562 1564 # HT OT HT - 1788 112 1566 1565 1567 # HT OT HT - 1789 112 1569 1568 1570 # HT OT HT - 1790 112 1572 1571 1573 # HT OT HT - 1791 112 1575 1574 1576 # HT OT HT - 1792 112 1578 1577 1579 # HT OT HT - 1793 112 1581 1580 1582 # HT OT HT - 1794 112 1584 1583 1585 # HT OT HT - 1795 112 1587 1586 1588 # HT OT HT - 1796 112 1590 1589 1591 # HT OT HT - 1797 112 1593 1592 1594 # HT OT HT - 1798 112 1596 1595 1597 # HT OT HT - 1799 112 1599 1598 1600 # HT OT HT - 1800 112 1602 1601 1603 # HT OT HT - 1801 112 1605 1604 1606 # HT OT HT - 1802 112 1608 1607 1609 # HT OT HT - 1803 112 1611 1610 1612 # HT OT HT - 1804 112 1614 1613 1615 # HT OT HT - 1805 112 1617 1616 1618 # HT OT HT - 1806 112 1620 1619 1621 # HT OT HT - 1807 112 1623 1622 1624 # HT OT HT - 1808 112 1626 1625 1627 # HT OT HT - 1809 112 1629 1628 1630 # HT OT HT - 1810 112 1632 1631 1633 # HT OT HT - 1811 112 1635 1634 1636 # HT OT HT - 1812 112 1638 1637 1639 # HT OT HT - 1813 112 1641 1640 1642 # HT OT HT - 1814 112 1644 1643 1645 # HT OT HT - 1815 112 1647 1646 1648 # HT OT HT - 1816 112 1650 1649 1651 # HT OT HT - 1817 112 1653 1652 1654 # HT OT HT - 1818 112 1656 1655 1657 # HT OT HT - 1819 112 1659 1658 1660 # HT OT HT - 1820 112 1662 1661 1663 # HT OT HT - 1821 112 1665 1664 1666 # HT OT HT - 1822 112 1668 1667 1669 # HT OT HT - 1823 112 1671 1670 1672 # HT OT HT - 1824 112 1674 1673 1675 # HT OT HT - 1825 112 1677 1676 1678 # HT OT HT - 1826 112 1680 1679 1681 # HT OT HT - 1827 112 1683 1682 1684 # HT OT HT - 1828 112 1686 1685 1687 # HT OT HT - 1829 112 1689 1688 1690 # HT OT HT - 1830 112 1692 1691 1693 # HT OT HT - 1831 112 1695 1694 1696 # HT OT HT - 1832 112 1698 1697 1699 # HT OT HT - 1833 112 1701 1700 1702 # HT OT HT - 1834 112 1704 1703 1705 # HT OT HT - 1835 112 1707 1706 1708 # HT OT HT - 1836 112 1710 1709 1711 # HT OT HT - 1837 112 1713 1712 1714 # HT OT HT - 1838 112 1716 1715 1717 # HT OT HT - 1839 112 1719 1718 1720 # HT OT HT - 1840 112 1722 1721 1723 # HT OT HT - 1841 112 1725 1724 1726 # HT OT HT - 1842 112 1728 1727 1729 # HT OT HT - 1843 112 1731 1730 1732 # HT OT HT - 1844 112 1734 1733 1735 # HT OT HT - 1845 112 1737 1736 1738 # HT OT HT - 1846 112 1740 1739 1741 # HT OT HT - 1847 112 1743 1742 1744 # HT OT HT - 1848 112 1746 1745 1747 # HT OT HT - 1849 112 1749 1748 1750 # HT OT HT - 1850 112 1752 1751 1753 # HT OT HT - 1851 112 1755 1754 1756 # HT OT HT - 1852 112 1758 1757 1759 # HT OT HT - 1853 112 1761 1760 1762 # HT OT HT - 1854 112 1764 1763 1765 # HT OT HT - 1855 112 1767 1766 1768 # HT OT HT - 1856 112 1770 1769 1771 # HT OT HT - 1857 112 1773 1772 1774 # HT OT HT - 1858 112 1776 1775 1777 # HT OT HT - 1859 112 1779 1778 1780 # HT OT HT - 1860 112 1782 1781 1783 # HT OT HT - 1861 112 1785 1784 1786 # HT OT HT - 1862 112 1788 1787 1789 # HT OT HT - 1863 112 1791 1790 1792 # HT OT HT - 1864 112 1794 1793 1795 # HT OT HT - 1865 112 1797 1796 1798 # HT OT HT - 1866 112 1800 1799 1801 # HT OT HT - 1867 112 1803 1802 1804 # HT OT HT - 1868 112 1806 1805 1807 # HT OT HT - 1869 112 1809 1808 1810 # HT OT HT - 1870 112 1812 1811 1813 # HT OT HT - 1871 112 1815 1814 1816 # HT OT HT - 1872 112 1818 1817 1819 # HT OT HT - 1873 112 1821 1820 1822 # HT OT HT - 1874 112 1824 1823 1825 # HT OT HT - 1875 112 1827 1826 1828 # HT OT HT - 1876 112 1830 1829 1831 # HT OT HT - 1877 112 1833 1832 1834 # HT OT HT - 1878 112 1836 1835 1837 # HT OT HT - 1879 112 1839 1838 1840 # HT OT HT - 1880 112 1842 1841 1843 # HT OT HT - 1881 112 1845 1844 1846 # HT OT HT - 1882 112 1848 1847 1849 # HT OT HT - 1883 112 1851 1850 1852 # HT OT HT - 1884 112 1854 1853 1855 # HT OT HT - 1885 112 1857 1856 1858 # HT OT HT - 1886 112 1860 1859 1861 # HT OT HT - 1887 112 1863 1862 1864 # HT OT HT - 1888 112 1866 1865 1867 # HT OT HT - 1889 112 1869 1868 1870 # HT OT HT - 1890 112 1872 1871 1873 # HT OT HT - 1891 112 1875 1874 1876 # HT OT HT - 1892 112 1878 1877 1879 # HT OT HT - 1893 112 1881 1880 1882 # HT OT HT - 1894 112 1884 1883 1885 # HT OT HT - 1895 112 1887 1886 1888 # HT OT HT - 1896 112 1890 1889 1891 # HT OT HT - 1897 112 1893 1892 1894 # HT OT HT - 1898 112 1896 1895 1897 # HT OT HT - 1899 112 1899 1898 1900 # HT OT HT - 1900 112 1902 1901 1903 # HT OT HT - 1901 112 1905 1904 1906 # HT OT HT - 1902 112 1908 1907 1909 # HT OT HT - 1903 112 1911 1910 1912 # HT OT HT - 1904 112 1914 1913 1915 # HT OT HT - 1905 112 1917 1916 1918 # HT OT HT - 1906 112 1920 1919 1921 # HT OT HT - 1907 112 1923 1922 1924 # HT OT HT - 1908 112 1926 1925 1927 # HT OT HT - 1909 112 1929 1928 1930 # HT OT HT - 1910 112 1932 1931 1933 # HT OT HT - 1911 112 1935 1934 1936 # HT OT HT - 1912 112 1938 1937 1939 # HT OT HT - 1913 112 1941 1940 1942 # HT OT HT - 1914 112 1944 1943 1945 # HT OT HT - 1915 112 1947 1946 1948 # HT OT HT - 1916 112 1950 1949 1951 # HT OT HT - 1917 112 1953 1952 1954 # HT OT HT - 1918 112 1956 1955 1957 # HT OT HT - 1919 112 1959 1958 1960 # HT OT HT - 1920 112 1962 1961 1963 # HT OT HT - 1921 112 1965 1964 1966 # HT OT HT - 1922 112 1968 1967 1969 # HT OT HT - 1923 112 1971 1970 1972 # HT OT HT - 1924 112 1974 1973 1975 # HT OT HT - 1925 112 1977 1976 1978 # HT OT HT - 1926 112 1980 1979 1981 # HT OT HT - 1927 112 1983 1982 1984 # HT OT HT - 1928 112 1986 1985 1987 # HT OT HT - 1929 112 1989 1988 1990 # HT OT HT - 1930 112 1992 1991 1993 # HT OT HT - 1931 112 1995 1994 1996 # HT OT HT - 1932 112 1998 1997 1999 # HT OT HT - 1933 112 2001 2000 2002 # HT OT HT - 1934 112 2004 2003 2005 # HT OT HT - 1935 112 2008 2007 2009 # HT OT HT - 1936 112 2011 2010 2012 # HT OT HT - 1937 112 2014 2013 2015 # HT OT HT - 1938 112 2017 2016 2018 # HT OT HT - 1939 112 2020 2019 2021 # HT OT HT - 1940 112 2023 2022 2024 # HT OT HT - 1941 112 2026 2025 2027 # HT OT HT - 1942 112 2029 2028 2030 # HT OT HT - 1943 112 2032 2031 2033 # HT OT HT - 1944 112 2035 2034 2036 # HT OT HT - 1945 112 2038 2037 2039 # HT OT HT - 1946 112 2041 2040 2042 # HT OT HT - 1947 112 2044 2043 2045 # HT OT HT - 1948 112 2047 2046 2048 # HT OT HT - 1949 112 2050 2049 2051 # HT OT HT - 1950 112 2053 2052 2054 # HT OT HT - 1951 112 2056 2055 2057 # HT OT HT - 1952 112 2059 2058 2060 # HT OT HT - 1953 112 2062 2061 2063 # HT OT HT - 1954 112 2065 2064 2066 # HT OT HT - 1955 112 2068 2067 2069 # HT OT HT - 1956 112 2071 2070 2072 # HT OT HT - 1957 112 2074 2073 2075 # HT OT HT - 1958 112 2077 2076 2078 # HT OT HT - 1959 112 2080 2079 2081 # HT OT HT - 1960 112 2083 2082 2084 # HT OT HT - 1961 112 2086 2085 2087 # HT OT HT - 1962 112 2089 2088 2090 # HT OT HT - 1963 112 2092 2091 2093 # HT OT HT - 1964 112 2095 2094 2096 # HT OT HT - 1965 112 2098 2097 2099 # HT OT HT - 1966 112 2101 2100 2102 # HT OT HT - 1967 112 2104 2103 2105 # HT OT HT - 1968 112 2107 2106 2108 # HT OT HT - 1969 112 2110 2109 2111 # HT OT HT - 1970 112 2113 2112 2114 # HT OT HT - 1971 112 2116 2115 2117 # HT OT HT - 1972 112 2119 2118 2120 # HT OT HT - 1973 112 2122 2121 2123 # HT OT HT - 1974 112 2125 2124 2126 # HT OT HT - 1975 112 2128 2127 2129 # HT OT HT - 1976 112 2131 2130 2132 # HT OT HT - 1977 112 2134 2133 2135 # HT OT HT - 1978 112 2137 2136 2138 # HT OT HT - 1979 112 2140 2139 2141 # HT OT HT - 1980 112 2143 2142 2144 # HT OT HT - 1981 112 2146 2145 2147 # HT OT HT - 1982 112 2149 2148 2150 # HT OT HT - 1983 112 2152 2151 2153 # HT OT HT - 1984 112 2155 2154 2156 # HT OT HT - 1985 112 2158 2157 2159 # HT OT HT - 1986 112 2161 2160 2162 # HT OT HT - 1987 112 2164 2163 2165 # HT OT HT - 1988 112 2167 2166 2168 # HT OT HT - 1989 112 2170 2169 2171 # HT OT HT - 1990 112 2173 2172 2174 # HT OT HT - 1991 112 2176 2175 2177 # HT OT HT - 1992 112 2179 2178 2180 # HT OT HT - 1993 112 2182 2181 2183 # HT OT HT - 1994 112 2185 2184 2186 # HT OT HT - 1995 112 2188 2187 2189 # HT OT HT - 1996 112 2191 2190 2192 # HT OT HT - 1997 112 2194 2193 2195 # HT OT HT - 1998 112 2197 2196 2198 # HT OT HT - 1999 112 2200 2199 2201 # HT OT HT - 2000 112 2203 2202 2204 # HT OT HT - 2001 112 2206 2205 2207 # HT OT HT - 2002 112 2209 2208 2210 # HT OT HT - 2003 112 2212 2211 2213 # HT OT HT - 2004 112 2215 2214 2216 # HT OT HT - 2005 112 2218 2217 2219 # HT OT HT - 2006 112 2221 2220 2222 # HT OT HT - 2007 112 2224 2223 2225 # HT OT HT - 2008 112 2227 2226 2228 # HT OT HT - 2009 112 2230 2229 2231 # HT OT HT - 2010 112 2233 2232 2234 # HT OT HT - 2011 112 2236 2235 2237 # HT OT HT - 2012 112 2239 2238 2240 # HT OT HT - 2013 112 2242 2241 2243 # HT OT HT - 2014 112 2245 2244 2246 # HT OT HT - 2015 112 2248 2247 2249 # HT OT HT - 2016 112 2251 2250 2252 # HT OT HT - 2017 112 2254 2253 2255 # HT OT HT - 2018 112 2257 2256 2258 # HT OT HT - 2019 112 2260 2259 2261 # HT OT HT - 2020 112 2263 2262 2264 # HT OT HT - 2021 112 2266 2265 2267 # HT OT HT - 2022 112 2269 2268 2270 # HT OT HT - 2023 112 2272 2271 2273 # HT OT HT - 2024 112 2275 2274 2276 # HT OT HT - 2025 112 2278 2277 2279 # HT OT HT - 2026 112 2281 2280 2282 # HT OT HT - 2027 112 2284 2283 2285 # HT OT HT - 2028 112 2287 2286 2288 # HT OT HT - 2029 112 2290 2289 2291 # HT OT HT - 2030 112 2293 2292 2294 # HT OT HT - 2031 112 2296 2295 2297 # HT OT HT - 2032 112 2299 2298 2300 # HT OT HT - 2033 112 2302 2301 2303 # HT OT HT - 2034 112 2305 2304 2306 # HT OT HT - 2035 112 2308 2307 2309 # HT OT HT - 2036 112 2311 2310 2312 # HT OT HT - 2037 112 2314 2313 2315 # HT OT HT - 2038 112 2317 2316 2318 # HT OT HT - 2039 112 2320 2319 2321 # HT OT HT - 2040 112 2323 2322 2324 # HT OT HT - 2041 112 2326 2325 2327 # HT OT HT - 2042 112 2329 2328 2330 # HT OT HT - 2043 112 2332 2331 2333 # HT OT HT - 2044 112 2335 2334 2336 # HT OT HT - 2045 112 2338 2337 2339 # HT OT HT - 2046 112 2341 2340 2342 # HT OT HT - 2047 112 2344 2343 2345 # HT OT HT - 2048 112 2347 2346 2348 # HT OT HT - 2049 112 2350 2349 2351 # HT OT HT - 2050 112 2353 2352 2354 # HT OT HT - 2051 112 2356 2355 2357 # HT OT HT - 2052 112 2359 2358 2360 # HT OT HT - 2053 112 2362 2361 2363 # HT OT HT - 2054 112 2366 2365 2367 # HT OT HT - 2055 112 2369 2368 2370 # HT OT HT - 2056 112 2372 2371 2373 # HT OT HT - 2057 112 2375 2374 2376 # HT OT HT - 2058 112 2378 2377 2379 # HT OT HT - 2059 112 2381 2380 2382 # HT OT HT - 2060 112 2384 2383 2385 # HT OT HT - 2061 112 2387 2386 2388 # HT OT HT - 2062 112 2390 2389 2391 # HT OT HT - 2063 112 2393 2392 2394 # HT OT HT - 2064 112 2396 2395 2397 # HT OT HT - 2065 112 2399 2398 2400 # HT OT HT - 2066 112 2402 2401 2403 # HT OT HT - 2067 112 2405 2404 2406 # HT OT HT - 2068 112 2408 2407 2409 # HT OT HT - 2069 112 2411 2410 2412 # HT OT HT - 2070 112 2414 2413 2415 # HT OT HT - 2071 112 2417 2416 2418 # HT OT HT - 2072 112 2420 2419 2421 # HT OT HT - 2073 112 2423 2422 2424 # HT OT HT - 2074 112 2426 2425 2427 # HT OT HT - 2075 112 2429 2428 2430 # HT OT HT - 2076 112 2432 2431 2433 # HT OT HT - 2077 112 2435 2434 2436 # HT OT HT - 2078 112 2438 2437 2439 # HT OT HT - 2079 112 2441 2440 2442 # HT OT HT - 2080 112 2444 2443 2445 # HT OT HT - 2081 112 2447 2446 2448 # HT OT HT - 2082 112 2450 2449 2451 # HT OT HT - 2083 112 2453 2452 2454 # HT OT HT - 2084 112 2456 2455 2457 # HT OT HT - 2085 112 2459 2458 2460 # HT OT HT - 2086 112 2462 2461 2463 # HT OT HT - 2087 112 2465 2464 2466 # HT OT HT - 2088 112 2468 2467 2469 # HT OT HT - 2089 112 2471 2470 2472 # HT OT HT - 2090 112 2474 2473 2475 # HT OT HT - 2091 112 2477 2476 2478 # HT OT HT - 2092 112 2480 2479 2481 # HT OT HT - 2093 112 2483 2482 2484 # HT OT HT - 2094 112 2486 2485 2487 # HT OT HT - 2095 112 2489 2488 2490 # HT OT HT - 2096 112 2492 2491 2493 # HT OT HT - 2097 112 2495 2494 2496 # HT OT HT + 1562 112 888 887 889 # HT OT HT + 1563 112 891 890 892 # HT OT HT + 1564 112 894 893 895 # HT OT HT + 1565 112 897 896 898 # HT OT HT + 1566 112 900 899 901 # HT OT HT + 1567 112 903 902 904 # HT OT HT + 1568 112 906 905 907 # HT OT HT + 1569 112 909 908 910 # HT OT HT + 1570 112 912 911 913 # HT OT HT + 1571 112 915 914 916 # HT OT HT + 1572 112 918 917 919 # HT OT HT + 1573 112 921 920 922 # HT OT HT + 1574 112 924 923 925 # HT OT HT + 1575 112 927 926 928 # HT OT HT + 1576 112 930 929 931 # HT OT HT + 1577 112 933 932 934 # HT OT HT + 1578 112 936 935 937 # HT OT HT + 1579 112 939 938 940 # HT OT HT + 1580 112 942 941 943 # HT OT HT + 1581 112 945 944 946 # HT OT HT + 1582 112 948 947 949 # HT OT HT + 1583 112 951 950 952 # HT OT HT + 1584 112 954 953 955 # HT OT HT + 1585 112 957 956 958 # HT OT HT + 1586 112 960 959 961 # HT OT HT + 1587 112 963 962 964 # HT OT HT + 1588 112 966 965 967 # HT OT HT + 1589 112 969 968 970 # HT OT HT + 1590 112 972 971 973 # HT OT HT + 1591 112 975 974 976 # HT OT HT + 1592 112 978 977 979 # HT OT HT + 1593 112 981 980 982 # HT OT HT + 1594 112 984 983 985 # HT OT HT + 1595 112 987 986 988 # HT OT HT + 1596 112 990 989 991 # HT OT HT + 1597 112 993 992 994 # HT OT HT + 1598 112 997 996 998 # HT OT HT + 1599 112 1000 999 1001 # HT OT HT + 1600 112 1003 1002 1004 # HT OT HT + 1601 112 1006 1005 1007 # HT OT HT + 1602 112 1009 1008 1010 # HT OT HT + 1603 112 1012 1011 1013 # HT OT HT + 1604 112 1015 1014 1016 # HT OT HT + 1605 112 1018 1017 1019 # HT OT HT + 1606 112 1021 1020 1022 # HT OT HT + 1607 112 1024 1023 1025 # HT OT HT + 1608 112 1027 1026 1028 # HT OT HT + 1609 112 1030 1029 1031 # HT OT HT + 1610 112 1033 1032 1034 # HT OT HT + 1611 112 1036 1035 1037 # HT OT HT + 1612 112 1039 1038 1040 # HT OT HT + 1613 112 1042 1041 1043 # HT OT HT + 1614 112 1045 1044 1046 # HT OT HT + 1615 112 1048 1047 1049 # HT OT HT + 1616 112 1051 1050 1052 # HT OT HT + 1617 112 1054 1053 1055 # HT OT HT + 1618 112 1057 1056 1058 # HT OT HT + 1619 112 1060 1059 1061 # HT OT HT + 1620 112 1063 1062 1064 # HT OT HT + 1621 112 1066 1065 1067 # HT OT HT + 1622 112 1069 1068 1070 # HT OT HT + 1623 112 1072 1071 1073 # HT OT HT + 1624 112 1075 1074 1076 # HT OT HT + 1625 112 1078 1077 1079 # HT OT HT + 1626 112 1081 1080 1082 # HT OT HT + 1627 112 1084 1083 1085 # HT OT HT + 1628 112 1087 1086 1088 # HT OT HT + 1629 112 1090 1089 1091 # HT OT HT + 1630 112 1093 1092 1094 # HT OT HT + 1631 112 1096 1095 1097 # HT OT HT + 1632 112 1099 1098 1100 # HT OT HT + 1633 112 1102 1101 1103 # HT OT HT + 1634 112 1105 1104 1106 # HT OT HT + 1635 112 1108 1107 1109 # HT OT HT + 1636 112 1111 1110 1112 # HT OT HT + 1637 112 1114 1113 1115 # HT OT HT + 1638 112 1117 1116 1118 # HT OT HT + 1639 112 1120 1119 1121 # HT OT HT + 1640 112 1123 1122 1124 # HT OT HT + 1641 112 1126 1125 1127 # HT OT HT + 1642 112 1129 1128 1130 # HT OT HT + 1643 112 1132 1131 1133 # HT OT HT + 1644 112 1135 1134 1136 # HT OT HT + 1645 112 1138 1137 1139 # HT OT HT + 1646 112 1141 1140 1142 # HT OT HT + 1647 112 1144 1143 1145 # HT OT HT + 1648 112 1147 1146 1148 # HT OT HT + 1649 112 1150 1149 1151 # HT OT HT + 1650 112 1153 1152 1154 # HT OT HT + 1651 112 1156 1155 1157 # HT OT HT + 1652 112 1159 1158 1160 # HT OT HT + 1653 112 1162 1161 1163 # HT OT HT + 1654 112 1165 1164 1166 # HT OT HT + 1655 112 1168 1167 1169 # HT OT HT + 1656 112 1171 1170 1172 # HT OT HT + 1657 112 1174 1173 1175 # HT OT HT + 1658 112 1177 1176 1178 # HT OT HT + 1659 112 1180 1179 1181 # HT OT HT + 1660 112 1183 1182 1184 # HT OT HT + 1661 112 1186 1185 1187 # HT OT HT + 1662 112 1189 1188 1190 # HT OT HT + 1663 112 1192 1191 1193 # HT OT HT + 1664 112 1195 1194 1196 # HT OT HT + 1665 112 1198 1197 1199 # HT OT HT + 1666 112 1201 1200 1202 # HT OT HT + 1667 112 1204 1203 1205 # HT OT HT + 1668 112 1207 1206 1208 # HT OT HT + 1669 112 1210 1209 1211 # HT OT HT + 1670 112 1213 1212 1214 # HT OT HT + 1671 112 1216 1215 1217 # HT OT HT + 1672 112 1219 1218 1220 # HT OT HT + 1673 112 1222 1221 1223 # HT OT HT + 1674 112 1225 1224 1226 # HT OT HT + 1675 112 1228 1227 1229 # HT OT HT + 1676 112 1231 1230 1232 # HT OT HT + 1677 112 1234 1233 1235 # HT OT HT + 1678 112 1237 1236 1238 # HT OT HT + 1679 112 1240 1239 1241 # HT OT HT + 1680 112 1243 1242 1244 # HT OT HT + 1681 112 1246 1245 1247 # HT OT HT + 1682 112 1249 1248 1250 # HT OT HT + 1683 112 1252 1251 1253 # HT OT HT + 1684 112 1255 1254 1256 # HT OT HT + 1685 112 1258 1257 1259 # HT OT HT + 1686 112 1261 1260 1262 # HT OT HT + 1687 112 1264 1263 1265 # HT OT HT + 1688 112 1267 1266 1268 # HT OT HT + 1689 112 1270 1269 1271 # HT OT HT + 1690 112 1273 1272 1274 # HT OT HT + 1691 112 1276 1275 1277 # HT OT HT + 1692 112 1279 1278 1280 # HT OT HT + 1693 112 1282 1281 1283 # HT OT HT + 1694 112 1285 1284 1286 # HT OT HT + 1695 112 1288 1287 1289 # HT OT HT + 1696 112 1291 1290 1292 # HT OT HT + 1697 112 1294 1293 1295 # HT OT HT + 1698 112 1297 1296 1298 # HT OT HT + 1699 112 1300 1299 1301 # HT OT HT + 1700 112 1303 1302 1304 # HT OT HT + 1701 112 1306 1305 1307 # HT OT HT + 1702 112 1309 1308 1310 # HT OT HT + 1703 112 1312 1311 1313 # HT OT HT + 1704 112 1315 1314 1316 # HT OT HT + 1705 112 1318 1317 1319 # HT OT HT + 1706 112 1321 1320 1322 # HT OT HT + 1707 112 1324 1323 1325 # HT OT HT + 1708 112 1327 1326 1328 # HT OT HT + 1709 112 1330 1329 1331 # HT OT HT + 1710 112 1333 1332 1334 # HT OT HT + 1711 112 1336 1335 1337 # HT OT HT + 1712 112 1339 1338 1340 # HT OT HT + 1713 112 1342 1341 1343 # HT OT HT + 1714 112 1345 1344 1346 # HT OT HT + 1715 112 1348 1347 1349 # HT OT HT + 1716 112 1351 1350 1352 # HT OT HT + 1717 112 1354 1353 1355 # HT OT HT + 1718 112 1357 1356 1358 # HT OT HT + 1719 112 1360 1359 1361 # HT OT HT + 1720 112 1363 1362 1364 # HT OT HT + 1721 112 1366 1365 1367 # HT OT HT + 1722 112 1369 1368 1370 # HT OT HT + 1723 112 1372 1371 1373 # HT OT HT + 1724 112 1375 1374 1376 # HT OT HT + 1725 112 1378 1377 1379 # HT OT HT + 1726 112 1381 1380 1382 # HT OT HT + 1727 112 1384 1383 1385 # HT OT HT + 1728 112 1387 1386 1388 # HT OT HT + 1729 112 1390 1389 1391 # HT OT HT + 1730 112 1393 1392 1394 # HT OT HT + 1731 112 1396 1395 1397 # HT OT HT + 1732 112 1399 1398 1400 # HT OT HT + 1733 112 1402 1401 1403 # HT OT HT + 1734 112 1405 1404 1406 # HT OT HT + 1735 112 1408 1407 1409 # HT OT HT + 1736 112 1411 1410 1412 # HT OT HT + 1737 112 1414 1413 1415 # HT OT HT + 1738 112 1417 1416 1418 # HT OT HT + 1739 112 1420 1419 1421 # HT OT HT + 1740 112 1423 1422 1424 # HT OT HT + 1741 112 1426 1425 1427 # HT OT HT + 1742 112 1429 1428 1430 # HT OT HT + 1743 112 1432 1431 1433 # HT OT HT + 1744 112 1436 1435 1437 # HT OT HT + 1745 112 1439 1438 1440 # HT OT HT + 1746 112 1442 1441 1443 # HT OT HT + 1747 112 1445 1444 1446 # HT OT HT + 1748 112 1448 1447 1449 # HT OT HT + 1749 112 1451 1450 1452 # HT OT HT + 1750 112 1454 1453 1455 # HT OT HT + 1751 112 1457 1456 1458 # HT OT HT + 1752 112 1460 1459 1461 # HT OT HT + 1753 112 1463 1462 1464 # HT OT HT + 1754 112 1466 1465 1467 # HT OT HT + 1755 112 1469 1468 1470 # HT OT HT + 1756 112 1472 1471 1473 # HT OT HT + 1757 112 1475 1474 1476 # HT OT HT + 1758 112 1478 1477 1479 # HT OT HT + 1759 112 1481 1480 1482 # HT OT HT + 1760 112 1484 1483 1485 # HT OT HT + 1761 112 1487 1486 1488 # HT OT HT + 1762 112 1490 1489 1491 # HT OT HT + 1763 112 1493 1492 1494 # HT OT HT + 1764 112 1496 1495 1497 # HT OT HT + 1765 112 1499 1498 1500 # HT OT HT + 1766 112 1502 1501 1503 # HT OT HT + 1767 112 1505 1504 1506 # HT OT HT + 1768 112 1508 1507 1509 # HT OT HT + 1769 112 1511 1510 1512 # HT OT HT + 1770 112 1514 1513 1515 # HT OT HT + 1771 112 1517 1516 1518 # HT OT HT + 1772 112 1520 1519 1521 # HT OT HT + 1773 112 1523 1522 1524 # HT OT HT + 1774 112 1526 1525 1527 # HT OT HT + 1775 112 1529 1528 1530 # HT OT HT + 1776 112 1532 1531 1533 # HT OT HT + 1777 112 1535 1534 1536 # HT OT HT + 1778 112 1538 1537 1539 # HT OT HT + 1779 112 1541 1540 1542 # HT OT HT + 1780 112 1544 1543 1545 # HT OT HT + 1781 112 1547 1546 1548 # HT OT HT + 1782 112 1550 1549 1551 # HT OT HT + 1783 112 1553 1552 1554 # HT OT HT + 1784 112 1556 1555 1557 # HT OT HT + 1785 112 1559 1558 1560 # HT OT HT + 1786 112 1562 1561 1563 # HT OT HT + 1787 112 1565 1564 1566 # HT OT HT + 1788 112 1568 1567 1569 # HT OT HT + 1789 112 1571 1570 1572 # HT OT HT + 1790 112 1574 1573 1575 # HT OT HT + 1791 112 1577 1576 1578 # HT OT HT + 1792 112 1580 1579 1581 # HT OT HT + 1793 112 1583 1582 1584 # HT OT HT + 1794 112 1586 1585 1587 # HT OT HT + 1795 112 1589 1588 1590 # HT OT HT + 1796 112 1592 1591 1593 # HT OT HT + 1797 112 1595 1594 1596 # HT OT HT + 1798 112 1598 1597 1599 # HT OT HT + 1799 112 1601 1600 1602 # HT OT HT + 1800 112 1604 1603 1605 # HT OT HT + 1801 112 1607 1606 1608 # HT OT HT + 1802 112 1610 1609 1611 # HT OT HT + 1803 112 1613 1612 1614 # HT OT HT + 1804 112 1616 1615 1617 # HT OT HT + 1805 112 1619 1618 1620 # HT OT HT + 1806 112 1622 1621 1623 # HT OT HT + 1807 112 1625 1624 1626 # HT OT HT + 1808 112 1628 1627 1629 # HT OT HT + 1809 112 1631 1630 1632 # HT OT HT + 1810 112 1634 1633 1635 # HT OT HT + 1811 112 1637 1636 1638 # HT OT HT + 1812 112 1640 1639 1641 # HT OT HT + 1813 112 1643 1642 1644 # HT OT HT + 1814 112 1646 1645 1647 # HT OT HT + 1815 112 1649 1648 1650 # HT OT HT + 1816 112 1652 1651 1653 # HT OT HT + 1817 112 1655 1654 1656 # HT OT HT + 1818 112 1658 1657 1659 # HT OT HT + 1819 112 1661 1660 1662 # HT OT HT + 1820 112 1664 1663 1665 # HT OT HT + 1821 112 1667 1666 1668 # HT OT HT + 1822 112 1670 1669 1671 # HT OT HT + 1823 112 1673 1672 1674 # HT OT HT + 1824 112 1676 1675 1677 # HT OT HT + 1825 112 1679 1678 1680 # HT OT HT + 1826 112 1682 1681 1683 # HT OT HT + 1827 112 1685 1684 1686 # HT OT HT + 1828 112 1688 1687 1689 # HT OT HT + 1829 112 1691 1690 1692 # HT OT HT + 1830 112 1694 1693 1695 # HT OT HT + 1831 112 1697 1696 1698 # HT OT HT + 1832 112 1700 1699 1701 # HT OT HT + 1833 112 1703 1702 1704 # HT OT HT + 1834 112 1706 1705 1707 # HT OT HT + 1835 112 1709 1708 1710 # HT OT HT + 1836 112 1712 1711 1713 # HT OT HT + 1837 112 1715 1714 1716 # HT OT HT + 1838 112 1718 1717 1719 # HT OT HT + 1839 112 1721 1720 1722 # HT OT HT + 1840 112 1724 1723 1725 # HT OT HT + 1841 112 1727 1726 1728 # HT OT HT + 1842 112 1730 1729 1731 # HT OT HT + 1843 112 1733 1732 1734 # HT OT HT + 1844 112 1736 1735 1737 # HT OT HT + 1845 112 1739 1738 1740 # HT OT HT + 1846 112 1742 1741 1743 # HT OT HT + 1847 112 1745 1744 1746 # HT OT HT + 1848 112 1748 1747 1749 # HT OT HT + 1849 112 1751 1750 1752 # HT OT HT + 1850 112 1754 1753 1755 # HT OT HT + 1851 112 1757 1756 1758 # HT OT HT + 1852 112 1760 1759 1761 # HT OT HT + 1853 112 1763 1762 1764 # HT OT HT + 1854 112 1766 1765 1767 # HT OT HT + 1855 112 1769 1768 1770 # HT OT HT + 1856 112 1772 1771 1773 # HT OT HT + 1857 112 1775 1774 1776 # HT OT HT + 1858 112 1778 1777 1779 # HT OT HT + 1859 112 1781 1780 1782 # HT OT HT + 1860 112 1784 1783 1785 # HT OT HT + 1861 112 1787 1786 1788 # HT OT HT + 1862 112 1790 1789 1791 # HT OT HT + 1863 112 1793 1792 1794 # HT OT HT + 1864 112 1796 1795 1797 # HT OT HT + 1865 112 1799 1798 1800 # HT OT HT + 1866 112 1802 1801 1803 # HT OT HT + 1867 112 1806 1805 1807 # HT OT HT + 1868 112 1809 1808 1810 # HT OT HT + 1869 112 1812 1811 1813 # HT OT HT + 1870 112 1815 1814 1816 # HT OT HT + 1871 112 1818 1817 1819 # HT OT HT + 1872 112 1821 1820 1822 # HT OT HT + 1873 112 1824 1823 1825 # HT OT HT + 1874 112 1827 1826 1828 # HT OT HT + 1875 112 1830 1829 1831 # HT OT HT + 1876 112 1833 1832 1834 # HT OT HT + 1877 112 1836 1835 1837 # HT OT HT + 1878 112 1839 1838 1840 # HT OT HT + 1879 112 1842 1841 1843 # HT OT HT + 1880 112 1845 1844 1846 # HT OT HT + 1881 112 1848 1847 1849 # HT OT HT + 1882 112 1851 1850 1852 # HT OT HT + 1883 112 1854 1853 1855 # HT OT HT + 1884 112 1857 1856 1858 # HT OT HT + 1885 112 1860 1859 1861 # HT OT HT + 1886 112 1863 1862 1864 # HT OT HT + 1887 112 1866 1865 1867 # HT OT HT + 1888 112 1869 1868 1870 # HT OT HT + 1889 112 1872 1871 1873 # HT OT HT + 1890 112 1875 1874 1876 # HT OT HT + 1891 112 1878 1877 1879 # HT OT HT + 1892 112 1881 1880 1882 # HT OT HT + 1893 112 1884 1883 1885 # HT OT HT + 1894 112 1887 1886 1888 # HT OT HT + 1895 112 1890 1889 1891 # HT OT HT + 1896 112 1893 1892 1894 # HT OT HT + 1897 112 1896 1895 1897 # HT OT HT + 1898 112 1899 1898 1900 # HT OT HT + 1899 112 1902 1901 1903 # HT OT HT + 1900 112 1905 1904 1906 # HT OT HT + 1901 112 1908 1907 1909 # HT OT HT + 1902 112 1911 1910 1912 # HT OT HT + 1903 112 1914 1913 1915 # HT OT HT + 1904 112 1917 1916 1918 # HT OT HT + 1905 112 1920 1919 1921 # HT OT HT + 1906 112 1923 1922 1924 # HT OT HT + 1907 112 1926 1925 1927 # HT OT HT + 1908 112 1929 1928 1930 # HT OT HT + 1909 112 1932 1931 1933 # HT OT HT + 1910 112 1935 1934 1936 # HT OT HT + 1911 112 1938 1937 1939 # HT OT HT + 1912 112 1941 1940 1942 # HT OT HT + 1913 112 1944 1943 1945 # HT OT HT + 1914 112 1947 1946 1948 # HT OT HT + 1915 112 1950 1949 1951 # HT OT HT + 1916 112 1953 1952 1954 # HT OT HT + 1917 112 1956 1955 1957 # HT OT HT + 1918 112 1959 1958 1960 # HT OT HT + 1919 112 1962 1961 1963 # HT OT HT + 1920 112 1965 1964 1966 # HT OT HT + 1921 112 1968 1967 1969 # HT OT HT + 1922 112 1971 1970 1972 # HT OT HT + 1923 112 1974 1973 1975 # HT OT HT + 1924 112 1977 1976 1978 # HT OT HT + 1925 112 1980 1979 1981 # HT OT HT + 1926 112 1983 1982 1984 # HT OT HT + 1927 112 1986 1985 1987 # HT OT HT + 1928 112 1989 1988 1990 # HT OT HT + 1929 112 1992 1991 1993 # HT OT HT + 1930 112 1995 1994 1996 # HT OT HT + 1931 112 1998 1997 1999 # HT OT HT + 1932 112 2001 2000 2002 # HT OT HT + 1933 112 2004 2003 2005 # HT OT HT + 1934 112 2007 2006 2008 # HT OT HT + 1935 112 2010 2009 2011 # HT OT HT + 1936 112 2013 2012 2014 # HT OT HT + 1937 112 2016 2015 2017 # HT OT HT + 1938 112 2019 2018 2020 # HT OT HT + 1939 112 2022 2021 2023 # HT OT HT + 1940 112 2025 2024 2026 # HT OT HT + 1941 112 2028 2027 2029 # HT OT HT + 1942 112 2031 2030 2032 # HT OT HT + 1943 112 2034 2033 2035 # HT OT HT + 1944 112 2037 2036 2038 # HT OT HT + 1945 112 2040 2039 2041 # HT OT HT + 1946 112 2043 2042 2044 # HT OT HT + 1947 112 2046 2045 2047 # HT OT HT + 1948 112 2049 2048 2050 # HT OT HT + 1949 112 2052 2051 2053 # HT OT HT + 1950 112 2055 2054 2056 # HT OT HT + 1951 112 2058 2057 2059 # HT OT HT + 1952 112 2061 2060 2062 # HT OT HT + 1953 112 2064 2063 2065 # HT OT HT + 1954 112 2067 2066 2068 # HT OT HT + 1955 112 2070 2069 2071 # HT OT HT + 1956 112 2073 2072 2074 # HT OT HT + 1957 112 2076 2075 2077 # HT OT HT + 1958 112 2079 2078 2080 # HT OT HT + 1959 112 2082 2081 2083 # HT OT HT + 1960 112 2085 2084 2086 # HT OT HT + 1961 112 2088 2087 2089 # HT OT HT + 1962 112 2091 2090 2092 # HT OT HT + 1963 112 2094 2093 2095 # HT OT HT + 1964 112 2097 2096 2098 # HT OT HT + 1965 112 2100 2099 2101 # HT OT HT + 1966 112 2103 2102 2104 # HT OT HT + 1967 112 2106 2105 2107 # HT OT HT + 1968 112 2109 2108 2110 # HT OT HT + 1969 112 2112 2111 2113 # HT OT HT + 1970 112 2115 2114 2116 # HT OT HT + 1971 112 2118 2117 2119 # HT OT HT + 1972 112 2121 2120 2122 # HT OT HT + 1973 112 2124 2123 2125 # HT OT HT + 1974 112 2127 2126 2128 # HT OT HT + 1975 112 2130 2129 2131 # HT OT HT + 1976 112 2133 2132 2134 # HT OT HT + 1977 112 2136 2135 2137 # HT OT HT + 1978 112 2139 2138 2140 # HT OT HT + 1979 112 2142 2141 2143 # HT OT HT + 1980 112 2145 2144 2146 # HT OT HT + 1981 112 2148 2147 2149 # HT OT HT + 1982 112 2151 2150 2152 # HT OT HT + 1983 112 2154 2153 2155 # HT OT HT + 1984 112 2157 2156 2158 # HT OT HT + 1985 112 2160 2159 2161 # HT OT HT + 1986 112 2163 2162 2164 # HT OT HT + 1987 112 2166 2165 2167 # HT OT HT + 1988 112 2169 2168 2170 # HT OT HT + 1989 112 2172 2171 2173 # HT OT HT + 1990 112 2175 2174 2176 # HT OT HT + 1991 112 2178 2177 2179 # HT OT HT + 1992 112 2181 2180 2182 # HT OT HT + 1993 112 2184 2183 2185 # HT OT HT + 1994 112 2187 2186 2188 # HT OT HT + 1995 112 2190 2189 2191 # HT OT HT + 1996 112 2193 2192 2194 # HT OT HT + 1997 112 2196 2195 2197 # HT OT HT + 1998 112 2199 2198 2200 # HT OT HT + 1999 112 2202 2201 2203 # HT OT HT + 2000 112 2205 2204 2206 # HT OT HT + 2001 112 2208 2207 2209 # HT OT HT + 2002 112 2211 2210 2212 # HT OT HT + 2003 112 2214 2213 2215 # HT OT HT + 2004 112 2217 2216 2218 # HT OT HT + 2005 112 2220 2219 2221 # HT OT HT + 2006 112 2223 2222 2224 # HT OT HT + 2007 112 2226 2225 2227 # HT OT HT + 2008 112 2229 2228 2230 # HT OT HT + 2009 112 2232 2231 2233 # HT OT HT + 2010 112 2235 2234 2236 # HT OT HT + 2011 112 2238 2237 2239 # HT OT HT + 2012 112 2241 2240 2242 # HT OT HT + 2013 112 2244 2243 2245 # HT OT HT + 2014 112 2247 2246 2248 # HT OT HT + 2015 112 2250 2249 2251 # HT OT HT + 2016 112 2253 2252 2254 # HT OT HT + 2017 112 2256 2255 2257 # HT OT HT + 2018 112 2259 2258 2260 # HT OT HT + 2019 112 2262 2261 2263 # HT OT HT + 2020 112 2265 2264 2266 # HT OT HT + 2021 112 2268 2267 2269 # HT OT HT + 2022 112 2271 2270 2272 # HT OT HT + 2023 112 2274 2273 2275 # HT OT HT + 2024 112 2277 2276 2278 # HT OT HT + 2025 112 2280 2279 2281 # HT OT HT + 2026 112 2283 2282 2284 # HT OT HT + 2027 112 2286 2285 2287 # HT OT HT + 2028 112 2289 2288 2290 # HT OT HT + 2029 112 2292 2291 2293 # HT OT HT + 2030 112 2295 2294 2296 # HT OT HT + 2031 112 2298 2297 2299 # HT OT HT + 2032 112 2301 2300 2302 # HT OT HT + 2033 112 2304 2303 2305 # HT OT HT + 2034 112 2307 2306 2308 # HT OT HT + 2035 112 2310 2309 2311 # HT OT HT + 2036 112 2313 2312 2314 # HT OT HT + 2037 112 2316 2315 2317 # HT OT HT + 2038 112 2319 2318 2320 # HT OT HT + 2039 112 2322 2321 2323 # HT OT HT + 2040 112 2325 2324 2326 # HT OT HT + 2041 112 2328 2327 2329 # HT OT HT + 2042 112 2331 2330 2332 # HT OT HT + 2043 112 2334 2333 2335 # HT OT HT + 2044 112 2337 2336 2338 # HT OT HT + 2045 112 2340 2339 2341 # HT OT HT + 2046 112 2343 2342 2344 # HT OT HT + 2047 112 2346 2345 2347 # HT OT HT + 2048 112 2349 2348 2350 # HT OT HT + 2049 112 2352 2351 2353 # HT OT HT + 2050 112 2355 2354 2356 # HT OT HT + 2051 112 2358 2357 2359 # HT OT HT + 2052 112 2361 2360 2362 # HT OT HT + 2053 112 2364 2363 2365 # HT OT HT + 2054 112 2367 2366 2368 # HT OT HT + 2055 112 2370 2369 2371 # HT OT HT + 2056 112 2373 2372 2374 # HT OT HT + 2057 112 2376 2375 2377 # HT OT HT + 2058 112 2379 2378 2380 # HT OT HT + 2059 112 2382 2381 2383 # HT OT HT + 2060 112 2385 2384 2386 # HT OT HT + 2061 112 2388 2387 2389 # HT OT HT + 2062 112 2391 2390 2392 # HT OT HT + 2063 112 2394 2393 2395 # HT OT HT + 2064 112 2397 2396 2398 # HT OT HT + 2065 112 2400 2399 2401 # HT OT HT + 2066 112 2403 2402 2404 # HT OT HT + 2067 112 2406 2405 2407 # HT OT HT + 2068 112 2409 2408 2410 # HT OT HT + 2069 112 2412 2411 2413 # HT OT HT + 2070 112 2415 2414 2416 # HT OT HT + 2071 112 2418 2417 2419 # HT OT HT + 2072 112 2421 2420 2422 # HT OT HT + 2073 112 2424 2423 2425 # HT OT HT + 2074 112 2427 2426 2428 # HT OT HT + 2075 112 2430 2429 2431 # HT OT HT + 2076 112 2433 2432 2434 # HT OT HT + 2077 112 2436 2435 2437 # HT OT HT + 2078 112 2439 2438 2440 # HT OT HT + 2079 112 2442 2441 2443 # HT OT HT + 2080 112 2445 2444 2446 # HT OT HT + 2081 112 2448 2447 2449 # HT OT HT + 2082 112 2451 2450 2452 # HT OT HT + 2083 112 2454 2453 2455 # HT OT HT + 2084 112 2457 2456 2458 # HT OT HT + 2085 112 2460 2459 2461 # HT OT HT + 2086 112 2463 2462 2464 # HT OT HT + 2087 112 2466 2465 2467 # HT OT HT + 2088 112 2469 2468 2470 # HT OT HT + 2089 112 2472 2471 2473 # HT OT HT + 2090 112 2475 2474 2476 # HT OT HT + 2091 112 2478 2477 2479 # HT OT HT + 2092 112 2481 2480 2482 # HT OT HT + 2093 112 2484 2483 2485 # HT OT HT + 2094 112 2487 2486 2488 # HT OT HT + 2095 112 2490 2489 2491 # HT OT HT + 2096 112 2493 2492 2494 # HT OT HT + 2097 112 2496 2495 2497 # HT OT HT 2098 112 2499 2498 2500 # HT OT HT 2099 112 2502 2501 2503 # HT OT HT 2100 112 2505 2504 2506 # HT OT HT @@ -10612,3 +10613,59 @@ Impropers 136 5 850 847 852 851 # CC CT2 OC OC 137 3 853 842 855 854 # CC CT1 OC OC +CMAP + + 1 1 18 20 22 32 34 + 2 1 32 34 36 53 55 + 3 1 53 55 57 75 77 + 4 1 75 77 79 94 96 + 5 1 94 96 98 113 115 + 6 1 113 115 117 132 134 + 7 1 132 134 136 146 148 + 8 5 146 148 150 153 155 + 9 1 153 155 157 175 177 + 10 1 175 177 179 189 191 + 11 1 189 191 193 208 210 + 12 1 208 210 212 230 232 + 13 5 230 232 234 237 239 + 14 1 237 239 241 252 254 + 15 1 252 254 256 266 268 + 16 1 266 268 270 280 282 + 17 1 280 282 284 294 296 + 18 1 294 296 298 309 311 + 19 1 309 311 313 319 321 + 20 1 319 321 323 335 337 + 21 1 335 337 339 347 349 + 22 1 347 349 351 357 359 + 23 1 357 359 361 367 369 + 24 1 367 369 371 381 383 + 25 1 381 383 385 391 393 + 26 1 391 393 395 406 408 + 27 1 406 408 410 428 430 + 28 1 428 430 432 444 446 + 29 1 444 446 448 464 466 + 30 1 464 466 468 486 488 + 31 1 486 488 490 503 505 + 32 1 503 505 507 524 526 + 33 1 524 526 528 534 536 + 34 1 534 536 538 548 550 + 35 1 548 550 552 560 562 + 36 1 560 562 564 574 576 + 37 5 574 576 578 581 583 + 38 1 581 583 585 597 599 + 39 1 597 599 601 609 611 + 40 5 609 611 613 616 618 + 41 1 616 618 620 631 633 + 42 1 631 633 635 655 657 + 43 1 655 657 659 669 671 + 44 1 669 671 673 690 692 + 45 1 690 692 694 702 704 + 46 1 702 704 706 714 716 + 47 1 714 716 718 724 726 + 48 1 724 726 728 738 740 + 49 1 738 740 742 760 762 + 50 1 760 762 764 774 776 + 51 1 774 776 778 794 796 + 52 1 794 796 798 808 810 + 53 1 808 810 812 824 826 + 54 1 824 826 828 838 840 diff --git a/tools/ch2lmp/example-cmap/1gb1.in b/tools/ch2lmp/example-cmap/1gb1.in index d7e8cbb042..39f6a3272a 100644 --- a/tools/ch2lmp/example-cmap/1gb1.in +++ b/tools/ch2lmp/example-cmap/1gb1.in @@ -1,5 +1,5 @@ -# Created by charmm2lammps v1.9.1 on Wed Oct 5 18:08:55 EDT 2016 -# Command: charmm2lammps.pl -water -ions -border=2.0 all36_prot 1gb1 +# Created by charmm2lammps v1.9.1 on Sun Jan 28 05:50:21 EST 2018 +# Command: charmm2lammps.pl -border=2.0 -cmap=36 -ions -water all36_prot 1gb1 units real neigh_modify delay 2 every 1 @@ -14,7 +14,10 @@ pair_style lj/charmm/coul/long 8 12 pair_modify mix arithmetic kspace_style pppm 1e-6 -read_data 1gb1.data +# Modify following line to point to the desired CMAP file +fix cmap all cmap charmm36.cmap +fix_modify cmap energy yes +read_data 1gb1.data fix cmap crossterm CMAP special_bonds charmm thermo 10 diff --git a/tools/ch2lmp/example-cmap/1gb1.log b/tools/ch2lmp/example-cmap/1gb1.log index 9561b2ee06..aba0c4cb6a 100644 --- a/tools/ch2lmp/example-cmap/1gb1.log +++ b/tools/ch2lmp/example-cmap/1gb1.log @@ -1,8 +1,8 @@ -LAMMPS (5 Oct 2016) -package omp 0 -WARNING: OpenMP support not enabled during compilation; using 1 thread only. (../fix_omp.cpp:123) -# Created by charmm2lammps v1.9.1 on Wed Oct 5 18:08:55 EDT 2016 -# Command: charmm2lammps.pl -water -ions -border=2.0 all36_prot 1gb1 +LAMMPS (17 Jan 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# Created by charmm2lammps v1.9.1 on Sun Jan 28 05:50:21 EST 2018 +# Command: charmm2lammps.pl -border=2.0 -cmap=36 -ions -water all36_prot 1gb1 units real neigh_modify delay 2 every 1 @@ -17,9 +17,13 @@ pair_style lj/charmm/coul/long 8 12 pair_modify mix arithmetic kspace_style pppm 1e-6 -read_data 1gb1.data +# Modify following line to point to the desired CMAP file +fix cmap all cmap charmm36.cmap +Reading potential file charmm36.cmap with DATE: 2016-09-26 +fix_modify cmap energy yes +read_data 1gb1.data fix cmap crossterm CMAP orthogonal box = (-20.8413 -14.5892 -13.805) to (23.4963 14.9692 10.827) - 2 by 2 by 2 MPI processor grid + 2 by 2 by 1 MPI processor grid reading atoms ... 2833 atoms scanning bonds ... @@ -49,91 +53,95 @@ thermo_style multi timestep 1.0 minimize 0.0 0.0 50 200 -WARNING: Resetting reneighboring criteria during minimization (../min.cpp:168) +WARNING: Using 'neigh_modify every 1 delay 0 check yes' setting during minimization (../min.cpp:168) PPPM initialization ... -WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:316) +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) G vector (1/distance) = 0.278254 grid = 45 32 30 stencil order = 5 estimated absolute RMS force accuracy = 0.000317429 estimated relative force accuracy = 9.55928e-07 using double precision FFTs - 3d grid and FFT values/proc = 15180 5760 -Last active /omp style is kspace_style pppm/omp + 3d grid and FFT values/proc = 25530 11520 Neighbor list info ... - 1 neighbor list requests update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 14 ghost atom cutoff = 14 - binsize = 7 -> bins = 7 5 4 -Memory usage per processor = 19.7492 Mbytes + binsize = 7, bins = 7 5 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 24.54 | 24.61 | 24.65 Mbytes ---------------- Step 0 ----- CPU = 0.0000 (sec) ---------------- -TotEng = -3599.1065 KinEng = 0.0000 Temp = 0.0000 -PotEng = -3599.1065 E_bond = 169.6834 E_angle = 103.6483 -E_dihed = 583.9669 E_impro = 0.0335 E_vdwl = -776.0899 -E_coul = 35419.6941 E_long = -39100.0428 Press = 3623.5803 ----------------- Step 10 ----- CPU = 0.2563 (sec) ---------------- -TotEng = -5168.1778 KinEng = 0.0000 Temp = 0.0000 -PotEng = -5168.1778 E_bond = 120.7538 E_angle = 171.5023 -E_dihed = 583.0143 E_impro = 6.5958 E_vdwl = -1034.8022 -E_coul = 34737.4006 E_long = -39752.6424 Press = -10232.1944 ----------------- Step 20 ----- CPU = 0.4597 (sec) ---------------- -TotEng = -5784.4945 KinEng = 0.0000 Temp = 0.0000 -PotEng = -5784.4945 E_bond = 110.1359 E_angle = 262.6659 -E_dihed = 573.8164 E_impro = 8.5071 E_vdwl = -1050.9646 -E_coul = 34464.2659 E_long = -40152.9212 Press = -10843.0328 ----------------- Step 30 ----- CPU = 0.6813 (sec) ---------------- -TotEng = -6342.0862 KinEng = 0.0000 Temp = 0.0000 -PotEng = -6342.0862 E_bond = 146.0247 E_angle = 272.7224 -E_dihed = 557.6616 E_impro = 7.1074 E_vdwl = -984.4028 -E_coul = 34031.1722 E_long = -40372.3718 Press = -13674.9873 ----------------- Step 40 ----- CPU = 0.8599 (sec) ---------------- -TotEng = -6821.3956 KinEng = 0.0000 Temp = 0.0000 -PotEng = -6821.3956 E_bond = 147.4491 E_angle = 271.5247 -E_dihed = 548.2429 E_impro = 7.1832 E_vdwl = -873.4714 -E_coul = 33514.8072 E_long = -40437.1312 Press = -12024.8390 ----------------- Step 50 ----- CPU = 1.0662 (sec) ---------------- -TotEng = -7278.3435 KinEng = 0.0000 Temp = 0.0000 -PotEng = -7278.3435 E_bond = 181.9934 E_angle = 288.9107 -E_dihed = 541.0050 E_impro = 7.1673 E_vdwl = -501.3825 -E_coul = 32665.6923 E_long = -40461.7297 Press = -10391.9829 -Loop time of 1.06631 on 8 procs for 50 steps with 2833 atoms +TotEng = -3304.5599 KinEng = 0.0000 Temp = 0.0000 +PotEng = -3304.5599 E_bond = 169.6834 E_angle = 103.6483 +E_dihed = 583.9669 E_impro = 0.0335 E_vdwl = -776.3982 +E_coul = 35482.9694 E_long = -38851.5191 Press = 3844.7433 +---------------- Step 10 ----- CPU = 0.3473 (sec) ---------------- +TotEng = -4930.6259 KinEng = 0.0000 Temp = 0.0000 +PotEng = -4930.6259 E_bond = 104.7992 E_angle = 181.4386 +E_dihed = 584.0895 E_impro = 7.5537 E_vdwl = -1028.4574 +E_coul = 34837.9592 E_long = -39590.5863 Press = -8420.5689 +---------------- Step 20 ----- CPU = 0.7554 (sec) ---------------- +TotEng = -5457.1158 KinEng = 0.0000 Temp = 0.0000 +PotEng = -5457.1158 E_bond = 121.1716 E_angle = 243.0784 +E_dihed = 580.3183 E_impro = 8.9483 E_vdwl = -1040.3321 +E_coul = 34593.3894 E_long = -39923.3583 Press = -9942.5587 +---------------- Step 30 ----- CPU = 1.1694 (sec) ---------------- +TotEng = -6057.2086 KinEng = 0.0000 Temp = 0.0000 +PotEng = -6057.2086 E_bond = 120.1005 E_angle = 267.0579 +E_dihed = 570.6124 E_impro = 9.3921 E_vdwl = -1025.6144 +E_coul = 34318.6209 E_long = -40277.2340 Press = -11617.6026 +---------------- Step 40 ----- CPU = 1.6505 (sec) ---------------- +TotEng = -6520.0628 KinEng = 0.0000 Temp = 0.0000 +PotEng = -6520.0628 E_bond = 135.8622 E_angle = 293.3665 +E_dihed = 558.0537 E_impro = 8.6211 E_vdwl = -968.6884 +E_coul = 33877.9402 E_long = -40381.7851 Press = -12652.4710 +---------------- Step 50 ----- CPU = 2.1052 (sec) ---------------- +TotEng = -6931.3243 KinEng = 0.0000 Temp = 0.0000 +PotEng = -6931.3243 E_bond = 147.5166 E_angle = 290.5234 +E_dihed = 550.9597 E_impro = 9.4741 E_vdwl = -794.7620 +E_coul = 33347.2827 E_long = -40437.2965 Press = -11322.9412 +Loop time of 2.10544 on 4 procs for 50 steps with 2833 atoms -99.3% CPU use with 8 MPI tasks x 1 OpenMP threads +98.5% CPU use with 4 MPI tasks x 1 OpenMP threads Minimization stats: Stopping criterion = max iterations Energy initial, next-to-last, final = - -3599.10649881 -7238.80368107 -7278.34352699 - Force two-norm initial, final = 1109.81 247.325 - Force max component initial, final = 107.492 37.5055 - Final line search alpha, max atom move = 0.00133024 0.0498915 - Iterations, force evaluations = 50 87 + -3304.55988409 -6893.73171135 -6931.32434601 + Force two-norm initial, final = 1135.31 300.792 + Force max component initial, final = 107.634 93.2558 + Final line search alpha, max atom move = 0.00152738 0.142437 + Iterations, force evaluations = 50 82 MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.46313 | 0.53526 | 0.61611 | 6.9 | 50.20 -Bond | 0.0070326 | 0.01008 | 0.013407 | 1.8 | 0.95 -Kspace | 0.3364 | 0.41785 | 0.49165 | 8.0 | 39.19 -Neigh | 0.035014 | 0.035175 | 0.035337 | 0.1 | 3.30 -Comm | 0.058533 | 0.05973 | 0.060792 | 0.3 | 5.60 -Output | 0.00039005 | 0.00040504 | 0.00049496 | 0.2 | 0.04 -Modify | 0.0015707 | 0.0022006 | 0.0025775 | 0.6 | 0.21 -Other | | 0.005615 | | | 0.53 +Pair | 1.5485 | 1.5674 | 1.5856 | 1.4 | 74.44 +Bond | 0.017887 | 0.020853 | 0.024278 | 1.6 | 0.99 +Kspace | 0.41442 | 0.43099 | 0.45053 | 2.5 | 20.47 +Neigh | 0.052102 | 0.052125 | 0.052147 | 0.0 | 2.48 +Comm | 0.023884 | 0.024002 | 0.024059 | 0.0 | 1.14 +Output | 0.00030303 | 0.00051945 | 0.0011663 | 0.0 | 0.02 +Modify | 0.0015671 | 0.0018674 | 0.0021205 | 0.5 | 0.09 +Other | | 0.007689 | | | 0.37 -Nlocal: 354.125 ave 376 max 344 min -Histogram: 3 1 0 1 2 0 0 0 0 1 -Nghost: 7405 ave 7531 max 7307 min -Histogram: 1 2 1 0 0 1 1 1 0 1 -Neighs: 178281 ave 194848 max 158123 min -Histogram: 2 0 1 0 0 1 0 1 2 1 +Nlocal: 708.25 ave 728 max 693 min +Histogram: 1 0 0 2 0 0 0 0 0 1 +Nghost: 9301.25 ave 9410 max 9200 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 356382 ave 367163 max 347323 min +Histogram: 1 1 0 0 0 0 1 0 0 1 -Total # of neighbors = 1426250 -Ave neighs/atom = 503.442 +Total # of neighbors = 1425526 +Ave neighs/atom = 503.186 Ave special neighs/atom = 4.67702 -Neighbor list builds = 4 +Neighbor list builds = 3 Dangerous builds = 0 reset_timestep 0 @@ -152,105 +160,97 @@ dump_modify 1 image yes scale yes thermo 100 run 1000 PPPM initialization ... -WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:316) +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) G vector (1/distance) = 0.278254 grid = 45 32 30 stencil order = 5 estimated absolute RMS force accuracy = 0.000317429 estimated relative force accuracy = 9.55928e-07 using double precision FFTs - 3d grid and FFT values/proc = 15180 5760 -Last active /omp style is kspace_style pppm/omp -Neighbor list info ... - 1 neighbor list requests - update every 1 steps, delay 2 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 14 - ghost atom cutoff = 14 - binsize = 7 -> bins = 7 5 4 -Memory usage per processor = 20.5221 Mbytes + 3d grid and FFT values/proc = 25530 11520 +Per MPI rank memory allocation (min/avg/max) = 25.34 | 25.4 | 25.44 Mbytes ---------------- Step 0 ----- CPU = 0.0000 (sec) ---------------- -TotEng = -7547.0017 KinEng = 0.0000 Temp = 0.0000 -PotEng = -7547.0017 E_bond = 52.4535 E_angle = 149.7924 -E_dihed = 541.0050 E_impro = 7.1673 E_vdwl = -501.3825 -E_coul = 32665.6923 E_long = -40461.7297 Press = -9600.9476 ----------------- Step 100 ----- CPU = 0.8242 (sec) ---------------- -TotEng = -7049.9503 KinEng = 688.1123 Temp = 113.4757 -PotEng = -7738.0625 E_bond = 53.8035 E_angle = 139.7846 -E_dihed = 529.5460 E_impro = 6.1806 E_vdwl = 52.8666 -E_coul = 31951.7370 E_long = -40471.9810 Press = -5991.4443 ----------------- Step 200 ----- CPU = 1.6765 (sec) ---------------- -TotEng = -7050.0350 KinEng = 956.0848 Temp = 157.6667 -PotEng = -8006.1198 E_bond = 47.1331 E_angle = 140.9769 -E_dihed = 517.5474 E_impro = 5.7244 E_vdwl = 635.2166 -E_coul = 31127.8100 E_long = -40480.5282 Press = -920.9624 ----------------- Step 300 ----- CPU = 2.5246 (sec) ---------------- -TotEng = -7050.0984 KinEng = 1049.7346 Temp = 173.1104 -PotEng = -8099.8330 E_bond = 47.4551 E_angle = 156.5090 -E_dihed = 520.6006 E_impro = 9.4008 E_vdwl = 451.0904 -E_coul = 31202.3817 E_long = -40487.2707 Press = -2352.9550 ----------------- Step 400 ----- CPU = 3.3982 (sec) ---------------- -TotEng = -7050.1671 KinEng = 1099.2465 Temp = 181.2753 -PotEng = -8149.4136 E_bond = 56.6375 E_angle = 164.5897 -E_dihed = 528.8356 E_impro = 8.8390 E_vdwl = 525.0114 -E_coul = 31060.0380 E_long = -40493.3650 Press = -2146.9087 ----------------- Step 500 ----- CPU = 4.2800 (sec) ---------------- -TotEng = -7050.2027 KinEng = 1134.4924 Temp = 187.0877 -PotEng = -8184.6951 E_bond = 53.5903 E_angle = 169.1090 -E_dihed = 522.9488 E_impro = 7.9830 E_vdwl = 496.8404 -E_coul = 31058.9967 E_long = -40494.1633 Press = -2537.1829 ----------------- Step 600 ----- CPU = 5.1548 (sec) ---------------- -TotEng = -7050.1894 KinEng = 1122.6756 Temp = 185.1390 -PotEng = -8172.8649 E_bond = 47.9283 E_angle = 168.7967 -E_dihed = 518.7200 E_impro = 9.2011 E_vdwl = 499.6778 -E_coul = 31076.1916 E_long = -40493.3805 Press = -1939.2216 ----------------- Step 700 ----- CPU = 6.0377 (sec) ---------------- -TotEng = -7050.2850 KinEng = 1154.4452 Temp = 190.3781 -PotEng = -8204.7301 E_bond = 54.3594 E_angle = 183.8772 -E_dihed = 513.0797 E_impro = 9.6842 E_vdwl = 522.0052 -E_coul = 31008.3632 E_long = -40496.0990 Press = -2059.4885 ----------------- Step 800 ----- CPU = 6.9161 (sec) ---------------- -TotEng = -7050.2852 KinEng = 1146.2741 Temp = 189.0306 -PotEng = -8196.5593 E_bond = 48.8126 E_angle = 171.3411 -E_dihed = 525.8682 E_impro = 10.5588 E_vdwl = 538.6905 -E_coul = 31003.8447 E_long = -40495.6752 Press = -1458.5181 ----------------- Step 900 ----- CPU = 7.8101 (sec) ---------------- -TotEng = -7050.3025 KinEng = 1154.2134 Temp = 190.3398 -PotEng = -8204.5159 E_bond = 51.1010 E_angle = 177.9642 -E_dihed = 520.6908 E_impro = 8.9539 E_vdwl = 521.5994 -E_coul = 31012.6307 E_long = -40497.4560 Press = -1683.9131 ----------------- Step 1000 ----- CPU = 8.7313 (sec) ---------------- -TotEng = -7050.3166 KinEng = 1179.9351 Temp = 194.5816 -PotEng = -8230.2517 E_bond = 57.8905 E_angle = 190.1556 -E_dihed = 518.1288 E_impro = 10.0403 E_vdwl = 557.6413 -E_coul = 30933.6472 E_long = -40497.7554 Press = -1643.1247 -Loop time of 8.73139 on 8 procs for 1000 steps with 2833 atoms +TotEng = -7157.1195 KinEng = 0.0000 Temp = 0.0000 +PotEng = -7157.1195 E_bond = 59.0052 E_angle = 144.8137 +E_dihed = 550.9597 E_impro = 9.4741 E_vdwl = -794.7620 +E_coul = 33347.2827 E_long = -40437.2965 Press = -11653.0907 +---------------- Step 100 ----- CPU = 2.0713 (sec) ---------------- +TotEng = -6731.9859 KinEng = 736.6132 Temp = 121.4739 +PotEng = -7468.5991 E_bond = 51.6809 E_angle = 141.9715 +E_dihed = 539.0053 E_impro = 6.5800 E_vdwl = -138.7778 +E_coul = 32438.3099 E_long = -40470.2744 Press = -6545.1453 +---------------- Step 200 ----- CPU = 4.1194 (sec) ---------------- +TotEng = -6732.1577 KinEng = 1137.9916 Temp = 187.6647 +PotEng = -7870.1494 E_bond = 54.1322 E_angle = 155.0534 +E_dihed = 530.3471 E_impro = 6.0821 E_vdwl = 581.9109 +E_coul = 31309.7031 E_long = -40477.5339 Press = -1108.1567 +---------------- Step 300 ----- CPU = 6.2051 (sec) ---------------- +TotEng = -6732.2356 KinEng = 1205.1394 Temp = 198.7380 +PotEng = -7937.3749 E_bond = 50.7295 E_angle = 154.0262 +E_dihed = 541.0277 E_impro = 9.6153 E_vdwl = 553.9794 +E_coul = 31264.5100 E_long = -40483.0651 Press = -1179.2736 +---------------- Step 400 ----- CPU = 8.3309 (sec) ---------------- +TotEng = -6732.3498 KinEng = 1263.7920 Temp = 208.4103 +PotEng = -7996.1418 E_bond = 59.5441 E_angle = 159.8690 +E_dihed = 531.3170 E_impro = 9.8105 E_vdwl = 572.2021 +E_coul = 31187.5411 E_long = -40486.5450 Press = -1312.0304 +---------------- Step 500 ----- CPU = 10.5236 (sec) ---------------- +TotEng = -6732.2697 KinEng = 1225.7309 Temp = 202.1337 +PotEng = -7958.0006 E_bond = 52.7184 E_angle = 169.2353 +E_dihed = 529.7384 E_impro = 10.4859 E_vdwl = 489.7017 +E_coul = 31300.5731 E_long = -40480.8862 Press = -1431.7699 +---------------- Step 600 ----- CPU = 12.7351 (sec) ---------------- +TotEng = -6732.2989 KinEng = 1238.7683 Temp = 204.2837 +PotEng = -7971.0672 E_bond = 56.2994 E_angle = 173.1005 +E_dihed = 530.0426 E_impro = 10.5372 E_vdwl = 535.7865 +E_coul = 31234.7342 E_long = -40486.0690 Press = -1402.7109 +---------------- Step 700 ----- CPU = 14.9715 (sec) ---------------- +TotEng = -6732.3516 KinEng = 1309.3540 Temp = 215.9239 +PotEng = -8041.7056 E_bond = 59.3741 E_angle = 177.8374 +E_dihed = 526.2153 E_impro = 12.2105 E_vdwl = 536.7845 +E_coul = 31152.4306 E_long = -40484.9510 Press = -1448.7774 +---------------- Step 800 ----- CPU = 17.2110 (sec) ---------------- +TotEng = -6732.3114 KinEng = 1299.2723 Temp = 214.2613 +PotEng = -8031.5837 E_bond = 55.8605 E_angle = 178.5243 +E_dihed = 534.2468 E_impro = 11.5427 E_vdwl = 560.2428 +E_coul = 31143.0967 E_long = -40486.6330 Press = -737.0231 +---------------- Step 900 ----- CPU = 19.4334 (sec) ---------------- +TotEng = -6732.4712 KinEng = 1299.4505 Temp = 214.2907 +PotEng = -8031.9217 E_bond = 61.2314 E_angle = 181.8029 +E_dihed = 536.4906 E_impro = 12.4741 E_vdwl = 475.8515 +E_coul = 31223.2733 E_long = -40494.0221 Press = -1853.8183 +---------------- Step 1000 ----- CPU = 21.6519 (sec) ---------------- +TotEng = -6732.4953 KinEng = 1325.4723 Temp = 218.5819 +PotEng = -8057.9676 E_bond = 55.0903 E_angle = 187.1899 +E_dihed = 524.1709 E_impro = 13.3778 E_vdwl = 510.4710 +E_coul = 31176.6501 E_long = -40497.1637 Press = -1649.1418 +Loop time of 21.6521 on 4 procs for 1000 steps with 2833 atoms -Performance: 9.895 ns/day, 2.425 hours/ns, 114.529 timesteps/s -99.6% CPU use with 8 MPI tasks x 1 OpenMP threads +Performance: 3.990 ns/day, 6.014 hours/ns, 46.185 timesteps/s +98.8% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 3.2841 | 3.856 | 4.393 | 17.3 | 44.16 -Bond | 0.041216 | 0.074389 | 0.11041 | 7.2 | 0.85 -Kspace | 2.8668 | 3.4354 | 4.0036 | 18.9 | 39.35 -Neigh | 0.3024 | 0.30315 | 0.30402 | 0.1 | 3.47 -Comm | 0.58794 | 0.60511 | 0.61362 | 1.0 | 6.93 -Output | 0.010607 | 0.010696 | 0.010783 | 0.0 | 0.12 -Modify | 0.40802 | 0.41482 | 0.42598 | 0.8 | 4.75 -Other | | 0.03184 | | | 0.36 +Pair | 13.758 | 14.312 | 14.767 | 11.1 | 66.10 +Bond | 0.14719 | 0.17763 | 0.21239 | 5.5 | 0.82 +Kspace | 5.0774 | 5.5813 | 6.2275 | 18.7 | 25.78 +Neigh | 0.81074 | 0.8116 | 0.81234 | 0.1 | 3.75 +Comm | 0.28366 | 0.34314 | 0.41466 | 10.2 | 1.58 +Output | 0.018707 | 0.019262 | 0.020673 | 0.6 | 0.09 +Modify | 0.33949 | 0.35308 | 0.36488 | 1.7 | 1.63 +Other | | 0.05392 | | | 0.25 -Nlocal: 354.125 ave 390 max 323 min -Histogram: 2 0 2 0 1 0 0 0 1 2 -Nghost: 7219.12 ave 7453 max 6941 min -Histogram: 1 1 1 1 0 0 0 0 2 2 -Neighs: 179095 ave 217661 max 144647 min -Histogram: 1 0 1 1 1 2 1 0 0 1 +Nlocal: 708.25 ave 747 max 669 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Nghost: 9164.5 ave 9383 max 8916 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 357504 ave 379770 max 327897 min +Histogram: 1 0 0 1 0 0 0 0 0 2 -Total # of neighbors = 1432758 -Ave neighs/atom = 505.739 +Total # of neighbors = 1430018 +Ave neighs/atom = 504.772 Ave special neighs/atom = 4.67702 -Neighbor list builds = 39 +Neighbor list builds = 40 Dangerous builds = 0 -Total wall time: 0:00:09 +Total wall time: 0:00:23 diff --git a/tools/ch2lmp/example-cmap/1gb1_ctrl.pdb b/tools/ch2lmp/example-cmap/1gb1_ctrl.pdb index 43567c490a..c8f73e1e53 100644 --- a/tools/ch2lmp/example-cmap/1gb1_ctrl.pdb +++ b/tools/ch2lmp/example-cmap/1gb1_ctrl.pdb @@ -1,6 +1,6 @@ REMARK REMARK CONTROL PDB 1gb1_ctrl.pdb -REMARK CREATED BY charmm2lammps v1.9.1 ON Wed Oct 5 18:08:54 EDT 2016 +REMARK CREATED BY charmm2lammps v1.9.1 ON Sun Jan 28 05:50:21 EST 2018 REMARK ATOM 1 N MET 1 -14.136 1.321 3.616 1.00 0.0 PROA ATOM 2 HT1 MET 1 -14.508 1.808 4.456 1.00 0.0 PROA @@ -887,1618 +887,1618 @@ ATOM 882 HT HOH 121 -20.366 -12.771 -2.7206 1.00 0.00 WATR ATOM 883 OT HOH 122 -17.146 -10.894 -2.7206 1.00 0.00 WATR ATOM 884 HT HOH 122 -16.389 -10.308 -2.7206 1.00 0.00 WATR ATOM 885 HT HOH 122 -17.903 -10.308 -2.7206 1.00 0.00 WATR -ATOM 886 OT HOH 123 -17.146 -13.357 -0.2573 1.00 0.00 WATR -ATOM 887 HT HOH 123 -16.389 -12.771 -0.2573 1.00 0.00 WATR -ATOM 888 HT HOH 123 -17.903 -12.771 -0.2573 1.00 0.00 WATR -ATOM 889 OT HOH 124 -19.609 -10.894 -0.2573 1.00 0.00 WATR -ATOM 890 HT HOH 124 -18.852 -10.308 -0.2573 1.00 0.00 WATR -ATOM 891 HT HOH 124 -20.366 -10.308 -0.2573 1.00 0.00 WATR -ATOM 892 OT HOH 125 -19.609 -13.357 2.20580 1.00 0.00 WATR -ATOM 893 HT HOH 125 -18.852 -12.771 2.20580 1.00 0.00 WATR -ATOM 894 HT HOH 125 -20.366 -12.771 2.20580 1.00 0.00 WATR -ATOM 895 OT HOH 126 -17.146 -10.894 2.20580 1.00 0.00 WATR -ATOM 896 HT HOH 126 -16.389 -10.308 2.20580 1.00 0.00 WATR -ATOM 897 HT HOH 126 -17.903 -10.308 2.20580 1.00 0.00 WATR -ATOM 898 OT HOH 127 -17.146 -13.357 4.66901 1.00 0.00 WATR -ATOM 899 HT HOH 127 -16.389 -12.771 4.66901 1.00 0.00 WATR -ATOM 900 HT HOH 127 -17.903 -12.771 4.66901 1.00 0.00 WATR -ATOM 901 OT HOH 128 -19.609 -10.894 4.66901 1.00 0.00 WATR -ATOM 902 HT HOH 128 -18.852 -10.308 4.66901 1.00 0.00 WATR -ATOM 903 HT HOH 128 -20.366 -10.308 4.66901 1.00 0.00 WATR -ATOM 904 OT HOH 129 -19.609 -13.357 7.13221 1.00 0.00 WATR -ATOM 905 HT HOH 129 -18.852 -12.771 7.13221 1.00 0.00 WATR -ATOM 906 HT HOH 129 -20.366 -12.771 7.13221 1.00 0.00 WATR -ATOM 907 OT HOH 130 -17.146 -10.894 7.13221 1.00 0.00 WATR -ATOM 908 HT HOH 130 -16.389 -10.308 7.13221 1.00 0.00 WATR -ATOM 909 HT HOH 130 -17.903 -10.308 7.13221 1.00 0.00 WATR -ATOM 910 OT HOH 131 -17.146 -13.357 9.59542 1.00 0.00 WATR -ATOM 911 HT HOH 131 -16.389 -12.771 9.59542 1.00 0.00 WATR -ATOM 912 HT HOH 131 -17.903 -12.771 9.59542 1.00 0.00 WATR -ATOM 913 OT HOH 132 -19.609 -10.894 9.59542 1.00 0.00 WATR -ATOM 914 HT HOH 132 -18.852 -10.308 9.59542 1.00 0.00 WATR -ATOM 915 HT HOH 132 -20.366 -10.308 9.59542 1.00 0.00 WATR -ATOM 916 OT HOH 133 -19.609 -8.4312 -12.573 1.00 0.00 WATR -ATOM 917 HT HOH 133 -18.852 -7.8453 -12.573 1.00 0.00 WATR -ATOM 918 HT HOH 133 -20.366 -7.8453 -12.573 1.00 0.00 WATR -ATOM 919 OT HOH 134 -17.146 -5.9680 -12.573 1.00 0.00 WATR -ATOM 920 HT HOH 134 -16.389 -5.3821 -12.573 1.00 0.00 WATR -ATOM 921 HT HOH 134 -17.903 -5.3821 -12.573 1.00 0.00 WATR -ATOM 922 OT HOH 135 -17.146 -8.4312 -10.110 1.00 0.00 WATR -ATOM 923 HT HOH 135 -16.389 -7.8453 -10.110 1.00 0.00 WATR -ATOM 924 HT HOH 135 -17.903 -7.8453 -10.110 1.00 0.00 WATR -ATOM 925 OT HOH 136 -19.609 -5.9680 -10.110 1.00 0.00 WATR -ATOM 926 HT HOH 136 -18.852 -5.3821 -10.110 1.00 0.00 WATR -ATOM 927 HT HOH 136 -20.366 -5.3821 -10.110 1.00 0.00 WATR -ATOM 928 OT HOH 137 -19.609 -8.4312 -7.6470 1.00 0.00 WATR -ATOM 929 HT HOH 137 -18.852 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 930 HT HOH 137 -20.366 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 931 OT HOH 138 -17.146 -5.9680 -7.6470 1.00 0.00 WATR -ATOM 932 HT HOH 138 -16.389 -5.3821 -7.6470 1.00 0.00 WATR -ATOM 933 HT HOH 138 -17.903 -5.3821 -7.6470 1.00 0.00 WATR -ATOM 934 OT HOH 139 -17.146 -8.4312 -5.1838 1.00 0.00 WATR -ATOM 935 HT HOH 139 -16.389 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 936 HT HOH 139 -17.903 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 937 OT HOH 140 -19.609 -5.9680 -5.1838 1.00 0.00 WATR -ATOM 938 HT HOH 140 -18.852 -5.3821 -5.1838 1.00 0.00 WATR -ATOM 939 HT HOH 140 -20.366 -5.3821 -5.1838 1.00 0.00 WATR -ATOM 940 OT HOH 141 -19.609 -8.4312 -2.7206 1.00 0.00 WATR -ATOM 941 HT HOH 141 -18.852 -7.8453 -2.7206 1.00 0.00 WATR -ATOM 942 HT HOH 141 -20.366 -7.8453 -2.7206 1.00 0.00 WATR -ATOM 943 OT HOH 142 -17.146 -5.9680 -2.7206 1.00 0.00 WATR -ATOM 944 HT HOH 142 -16.389 -5.3821 -2.7206 1.00 0.00 WATR -ATOM 945 HT HOH 142 -17.903 -5.3821 -2.7206 1.00 0.00 WATR -ATOM 946 OT HOH 143 -17.146 -8.4312 -0.2573 1.00 0.00 WATR -ATOM 947 HT HOH 143 -16.389 -7.8453 -0.2573 1.00 0.00 WATR -ATOM 948 HT HOH 143 -17.903 -7.8453 -0.2573 1.00 0.00 WATR -ATOM 949 OT HOH 144 -19.609 -5.9680 -0.2573 1.00 0.00 WATR -ATOM 950 HT HOH 144 -18.852 -5.3821 -0.2573 1.00 0.00 WATR -ATOM 951 HT HOH 144 -20.366 -5.3821 -0.2573 1.00 0.00 WATR -ATOM 952 OT HOH 145 -19.609 -8.4312 2.20580 1.00 0.00 WATR -ATOM 953 HT HOH 145 -18.852 -7.8453 2.20580 1.00 0.00 WATR -ATOM 954 HT HOH 145 -20.366 -7.8453 2.20580 1.00 0.00 WATR -ATOM 955 OT HOH 146 -17.146 -5.9680 2.20580 1.00 0.00 WATR -ATOM 956 HT HOH 146 -16.389 -5.3821 2.20580 1.00 0.00 WATR -ATOM 957 HT HOH 146 -17.903 -5.3821 2.20580 1.00 0.00 WATR -ATOM 958 OT HOH 147 -17.146 -8.4312 4.66901 1.00 0.00 WATR -ATOM 959 HT HOH 147 -16.389 -7.8453 4.66901 1.00 0.00 WATR -ATOM 960 HT HOH 147 -17.903 -7.8453 4.66901 1.00 0.00 WATR -ATOM 961 OT HOH 148 -19.609 -5.9680 4.66901 1.00 0.00 WATR -ATOM 962 HT HOH 148 -18.852 -5.3821 4.66901 1.00 0.00 WATR -ATOM 963 HT HOH 148 -20.366 -5.3821 4.66901 1.00 0.00 WATR -ATOM 964 OT HOH 149 -19.609 -8.4312 7.13221 1.00 0.00 WATR -ATOM 965 HT HOH 149 -18.852 -7.8453 7.13221 1.00 0.00 WATR -ATOM 966 HT HOH 149 -20.366 -7.8453 7.13221 1.00 0.00 WATR -ATOM 967 OT HOH 150 -17.146 -5.9680 7.13221 1.00 0.00 WATR -ATOM 968 HT HOH 150 -16.389 -5.3821 7.13221 1.00 0.00 WATR -ATOM 969 HT HOH 150 -17.903 -5.3821 7.13221 1.00 0.00 WATR -ATOM 970 OT HOH 151 -17.146 -8.4312 9.59542 1.00 0.00 WATR -ATOM 971 HT HOH 151 -16.389 -7.8453 9.59542 1.00 0.00 WATR -ATOM 972 HT HOH 151 -17.903 -7.8453 9.59542 1.00 0.00 WATR -ATOM 973 OT HOH 152 -19.609 -5.9680 9.59542 1.00 0.00 WATR -ATOM 974 HT HOH 152 -18.852 -5.3821 9.59542 1.00 0.00 WATR -ATOM 975 HT HOH 152 -20.366 -5.3821 9.59542 1.00 0.00 WATR -ATOM 976 OT HOH 153 -19.609 -3.5048 -12.573 1.00 0.00 WATR -ATOM 977 HT HOH 153 -18.852 -2.9189 -12.573 1.00 0.00 WATR -ATOM 978 HT HOH 153 -20.366 -2.9189 -12.573 1.00 0.00 WATR -ATOM 979 OT HOH 154 -17.146 -1.0416 -12.573 1.00 0.00 WATR -ATOM 980 HT HOH 154 -16.389 -0.4557 -12.573 1.00 0.00 WATR -ATOM 981 HT HOH 154 -17.903 -0.4557 -12.573 1.00 0.00 WATR -ATOM 982 OT HOH 155 -17.146 -3.5048 -10.110 1.00 0.00 WATR -ATOM 983 HT HOH 155 -16.389 -2.9189 -10.110 1.00 0.00 WATR -ATOM 984 HT HOH 155 -17.903 -2.9189 -10.110 1.00 0.00 WATR -ATOM 985 OT HOH 156 -19.609 -1.0416 -10.110 1.00 0.00 WATR -ATOM 986 HT HOH 156 -18.852 -0.4557 -10.110 1.00 0.00 WATR -ATOM 987 HT HOH 156 -20.366 -0.4557 -10.110 1.00 0.00 WATR -ATOM 988 OT HOH 157 -19.609 -3.5048 -7.6470 1.00 0.00 WATR -ATOM 989 HT HOH 157 -18.852 -2.9189 -7.6470 1.00 0.00 WATR -ATOM 990 HT HOH 157 -20.366 -2.9189 -7.6470 1.00 0.00 WATR -ATOM 991 OT HOH 158 -17.146 -1.0416 -7.6470 1.00 0.00 WATR -ATOM 992 HT HOH 158 -16.389 -0.4557 -7.6470 1.00 0.00 WATR -ATOM 993 HT HOH 158 -17.903 -0.4557 -7.6470 1.00 0.00 WATR -ATOM 994 OT HOH 159 -17.146 -3.5048 -5.1838 1.00 0.00 WATR -ATOM 995 HT HOH 159 -16.389 -2.9189 -5.1838 1.00 0.00 WATR -ATOM 996 HT HOH 159 -17.903 -2.9189 -5.1838 1.00 0.00 WATR -ATOM 997 OT HOH 160 -19.609 -1.0416 -5.1838 1.00 0.00 WATR -ATOM 998 HT HOH 160 -18.852 -0.4557 -5.1838 1.00 0.00 WATR -ATOM 999 HT HOH 160 -20.366 -0.4557 -5.1838 1.00 0.00 WATR -ATOM 1000 OT HOH 161 -19.609 -3.5048 -2.7206 1.00 0.00 WATR -ATOM 1001 HT HOH 161 -18.852 -2.9189 -2.7206 1.00 0.00 WATR -ATOM 1002 HT HOH 161 -20.366 -2.9189 -2.7206 1.00 0.00 WATR -ATOM 1003 OT HOH 162 -17.146 -1.0416 -2.7206 1.00 0.00 WATR -ATOM 1004 HT HOH 162 -16.389 -0.4557 -2.7206 1.00 0.00 WATR -ATOM 1005 HT HOH 162 -17.903 -0.4557 -2.7206 1.00 0.00 WATR -ATOM 1006 OT HOH 163 -17.146 -3.5048 -0.2573 1.00 0.00 WATR -ATOM 1007 HT HOH 163 -16.389 -2.9189 -0.2573 1.00 0.00 WATR -ATOM 1008 HT HOH 163 -17.903 -2.9189 -0.2573 1.00 0.00 WATR -ATOM 1009 OT HOH 164 -19.609 -3.5048 2.20580 1.00 0.00 WATR -ATOM 1010 HT HOH 164 -18.852 -2.9189 2.20580 1.00 0.00 WATR -ATOM 1011 HT HOH 164 -20.366 -2.9189 2.20580 1.00 0.00 WATR -ATOM 1012 OT HOH 165 -17.146 -3.5048 4.66901 1.00 0.00 WATR -ATOM 1013 HT HOH 165 -16.389 -2.9189 4.66901 1.00 0.00 WATR -ATOM 1014 HT HOH 165 -17.903 -2.9189 4.66901 1.00 0.00 WATR -ATOM 1015 OT HOH 166 -19.609 -1.0416 4.66901 1.00 0.00 WATR -ATOM 1016 HT HOH 166 -18.852 -0.4557 4.66901 1.00 0.00 WATR -ATOM 1017 HT HOH 166 -20.366 -0.4557 4.66901 1.00 0.00 WATR -ATOM 1018 OT HOH 167 -19.609 -3.5048 7.13221 1.00 0.00 WATR -ATOM 1019 HT HOH 167 -18.852 -2.9189 7.13221 1.00 0.00 WATR -ATOM 1020 HT HOH 167 -20.366 -2.9189 7.13221 1.00 0.00 WATR -ATOM 1021 OT HOH 168 -17.146 -1.0416 7.13221 1.00 0.00 WATR -ATOM 1022 HT HOH 168 -16.389 -0.4557 7.13221 1.00 0.00 WATR -ATOM 1023 HT HOH 168 -17.903 -0.4557 7.13221 1.00 0.00 WATR -ATOM 1024 OT HOH 169 -17.146 -3.5048 9.59542 1.00 0.00 WATR -ATOM 1025 HT HOH 169 -16.389 -2.9189 9.59542 1.00 0.00 WATR -ATOM 1026 HT HOH 169 -17.903 -2.9189 9.59542 1.00 0.00 WATR -ATOM 1027 OT HOH 170 -19.609 -1.0416 9.59542 1.00 0.00 WATR -ATOM 1028 HT HOH 170 -18.852 -0.4557 9.59542 1.00 0.00 WATR -ATOM 1029 HT HOH 170 -20.366 -0.4557 9.59542 1.00 0.00 WATR -ATOM 1030 OT HOH 171 -19.609 1.42160 -12.573 1.00 0.00 WATR -ATOM 1031 HT HOH 171 -18.852 2.00748 -12.573 1.00 0.00 WATR -ATOM 1032 HT HOH 171 -20.366 2.00748 -12.573 1.00 0.00 WATR -ATOM 1033 OT HOH 172 -17.146 3.88480 -12.573 1.00 0.00 WATR -ATOM 1034 HT HOH 172 -16.389 4.47069 -12.573 1.00 0.00 WATR -ATOM 1035 HT HOH 172 -17.903 4.47069 -12.573 1.00 0.00 WATR -ATOM 1036 OT HOH 173 -17.146 1.42160 -10.110 1.00 0.00 WATR -ATOM 1037 HT HOH 173 -16.389 2.00748 -10.110 1.00 0.00 WATR -ATOM 1038 HT HOH 173 -17.903 2.00748 -10.110 1.00 0.00 WATR -ATOM 1039 OT HOH 174 -19.609 3.88480 -10.110 1.00 0.00 WATR -ATOM 1040 HT HOH 174 -18.852 4.47069 -10.110 1.00 0.00 WATR -ATOM 1041 HT HOH 174 -20.366 4.47069 -10.110 1.00 0.00 WATR -ATOM 1042 OT HOH 175 -19.609 1.42160 -7.6470 1.00 0.00 WATR -ATOM 1043 HT HOH 175 -18.852 2.00748 -7.6470 1.00 0.00 WATR -ATOM 1044 HT HOH 175 -20.366 2.00748 -7.6470 1.00 0.00 WATR -ATOM 1045 OT HOH 176 -17.146 3.88480 -7.6470 1.00 0.00 WATR -ATOM 1046 HT HOH 176 -16.389 4.47069 -7.6470 1.00 0.00 WATR -ATOM 1047 HT HOH 176 -17.903 4.47069 -7.6470 1.00 0.00 WATR -ATOM 1048 OT HOH 177 -17.146 1.42160 -5.1838 1.00 0.00 WATR -ATOM 1049 HT HOH 177 -16.389 2.00748 -5.1838 1.00 0.00 WATR -ATOM 1050 HT HOH 177 -17.903 2.00748 -5.1838 1.00 0.00 WATR -ATOM 1051 OT HOH 178 -19.609 3.88480 -5.1838 1.00 0.00 WATR -ATOM 1052 HT HOH 178 -18.852 4.47069 -5.1838 1.00 0.00 WATR -ATOM 1053 HT HOH 178 -20.366 4.47069 -5.1838 1.00 0.00 WATR -ATOM 1054 OT HOH 179 -19.609 1.42160 -2.7206 1.00 0.00 WATR -ATOM 1055 HT HOH 179 -18.852 2.00748 -2.7206 1.00 0.00 WATR -ATOM 1056 HT HOH 179 -20.366 2.00748 -2.7206 1.00 0.00 WATR -ATOM 1057 OT HOH 180 -17.146 3.88480 -2.7206 1.00 0.00 WATR -ATOM 1058 HT HOH 180 -16.389 4.47069 -2.7206 1.00 0.00 WATR -ATOM 1059 HT HOH 180 -17.903 4.47069 -2.7206 1.00 0.00 WATR -ATOM 1060 OT HOH 181 -19.609 3.88480 -0.2573 1.00 0.00 WATR -ATOM 1061 HT HOH 181 -18.852 4.47069 -0.2573 1.00 0.00 WATR -ATOM 1062 HT HOH 181 -20.366 4.47069 -0.2573 1.00 0.00 WATR -ATOM 1063 OT HOH 182 -17.146 3.88480 2.20580 1.00 0.00 WATR -ATOM 1064 HT HOH 182 -16.389 4.47069 2.20580 1.00 0.00 WATR -ATOM 1065 HT HOH 182 -17.903 4.47069 2.20580 1.00 0.00 WATR -ATOM 1066 OT HOH 183 -17.146 1.42160 4.66901 1.00 0.00 WATR -ATOM 1067 HT HOH 183 -16.389 2.00748 4.66901 1.00 0.00 WATR -ATOM 1068 HT HOH 183 -17.903 2.00748 4.66901 1.00 0.00 WATR -ATOM 1069 OT HOH 184 -19.609 3.88480 4.66901 1.00 0.00 WATR -ATOM 1070 HT HOH 184 -18.852 4.47069 4.66901 1.00 0.00 WATR -ATOM 1071 HT HOH 184 -20.366 4.47069 4.66901 1.00 0.00 WATR -ATOM 1072 OT HOH 185 -19.609 1.42160 7.13221 1.00 0.00 WATR -ATOM 1073 HT HOH 185 -18.852 2.00748 7.13221 1.00 0.00 WATR -ATOM 1074 HT HOH 185 -20.366 2.00748 7.13221 1.00 0.00 WATR -ATOM 1075 OT HOH 186 -17.146 3.88480 7.13221 1.00 0.00 WATR -ATOM 1076 HT HOH 186 -16.389 4.47069 7.13221 1.00 0.00 WATR -ATOM 1077 HT HOH 186 -17.903 4.47069 7.13221 1.00 0.00 WATR -ATOM 1078 OT HOH 187 -17.146 1.42160 9.59542 1.00 0.00 WATR -ATOM 1079 HT HOH 187 -16.389 2.00748 9.59542 1.00 0.00 WATR -ATOM 1080 HT HOH 187 -17.903 2.00748 9.59542 1.00 0.00 WATR -ATOM 1081 OT HOH 188 -19.609 3.88480 9.59542 1.00 0.00 WATR -ATOM 1082 HT HOH 188 -18.852 4.47069 9.59542 1.00 0.00 WATR -ATOM 1083 HT HOH 188 -20.366 4.47069 9.59542 1.00 0.00 WATR -ATOM 1084 OT HOH 189 -19.609 6.34801 -12.573 1.00 0.00 WATR -ATOM 1085 HT HOH 189 -18.852 6.93389 -12.573 1.00 0.00 WATR -ATOM 1086 HT HOH 189 -20.366 6.93389 -12.573 1.00 0.00 WATR -ATOM 1087 OT HOH 190 -17.146 8.81121 -12.573 1.00 0.00 WATR -ATOM 1088 HT HOH 190 -16.389 9.39710 -12.573 1.00 0.00 WATR -ATOM 1089 HT HOH 190 -17.903 9.39710 -12.573 1.00 0.00 WATR -ATOM 1090 OT HOH 191 -17.146 6.34801 -10.110 1.00 0.00 WATR -ATOM 1091 HT HOH 191 -16.389 6.93389 -10.110 1.00 0.00 WATR -ATOM 1092 HT HOH 191 -17.903 6.93389 -10.110 1.00 0.00 WATR -ATOM 1093 OT HOH 192 -19.609 8.81121 -10.110 1.00 0.00 WATR -ATOM 1094 HT HOH 192 -18.852 9.39710 -10.110 1.00 0.00 WATR -ATOM 1095 HT HOH 192 -20.366 9.39710 -10.110 1.00 0.00 WATR -ATOM 1096 OT HOH 193 -19.609 6.34801 -7.6470 1.00 0.00 WATR -ATOM 1097 HT HOH 193 -18.852 6.93389 -7.6470 1.00 0.00 WATR -ATOM 1098 HT HOH 193 -20.366 6.93389 -7.6470 1.00 0.00 WATR -ATOM 1099 OT HOH 194 -17.146 8.81121 -7.6470 1.00 0.00 WATR -ATOM 1100 HT HOH 194 -16.389 9.39710 -7.6470 1.00 0.00 WATR -ATOM 1101 HT HOH 194 -17.903 9.39710 -7.6470 1.00 0.00 WATR -ATOM 1102 OT HOH 195 -17.146 6.34801 -5.1838 1.00 0.00 WATR -ATOM 1103 HT HOH 195 -16.389 6.93389 -5.1838 1.00 0.00 WATR -ATOM 1104 HT HOH 195 -17.903 6.93389 -5.1838 1.00 0.00 WATR -ATOM 1105 OT HOH 196 -19.609 8.81121 -5.1838 1.00 0.00 WATR -ATOM 1106 HT HOH 196 -18.852 9.39710 -5.1838 1.00 0.00 WATR -ATOM 1107 HT HOH 196 -20.366 9.39710 -5.1838 1.00 0.00 WATR -ATOM 1108 OT HOH 197 -19.609 6.34801 -2.7206 1.00 0.00 WATR -ATOM 1109 HT HOH 197 -18.852 6.93389 -2.7206 1.00 0.00 WATR -ATOM 1110 HT HOH 197 -20.366 6.93389 -2.7206 1.00 0.00 WATR -ATOM 1111 OT HOH 198 -19.609 8.81121 -0.2573 1.00 0.00 WATR -ATOM 1112 HT HOH 198 -18.852 9.39710 -0.2573 1.00 0.00 WATR -ATOM 1113 HT HOH 198 -20.366 9.39710 -0.2573 1.00 0.00 WATR -ATOM 1114 OT HOH 199 -19.609 6.34801 2.20580 1.00 0.00 WATR -ATOM 1115 HT HOH 199 -18.852 6.93389 2.20580 1.00 0.00 WATR -ATOM 1116 HT HOH 199 -20.366 6.93389 2.20580 1.00 0.00 WATR -ATOM 1117 OT HOH 200 -17.146 8.81121 2.20580 1.00 0.00 WATR -ATOM 1118 HT HOH 200 -16.389 9.39710 2.20580 1.00 0.00 WATR -ATOM 1119 HT HOH 200 -17.903 9.39710 2.20580 1.00 0.00 WATR -ATOM 1120 OT HOH 201 -17.146 6.34801 4.66901 1.00 0.00 WATR -ATOM 1121 HT HOH 201 -16.389 6.93389 4.66901 1.00 0.00 WATR -ATOM 1122 HT HOH 201 -17.903 6.93389 4.66901 1.00 0.00 WATR -ATOM 1123 OT HOH 202 -19.609 8.81121 4.66901 1.00 0.00 WATR -ATOM 1124 HT HOH 202 -18.852 9.39710 4.66901 1.00 0.00 WATR -ATOM 1125 HT HOH 202 -20.366 9.39710 4.66901 1.00 0.00 WATR -ATOM 1126 OT HOH 203 -19.609 6.34801 7.13221 1.00 0.00 WATR -ATOM 1127 HT HOH 203 -18.852 6.93389 7.13221 1.00 0.00 WATR -ATOM 1128 HT HOH 203 -20.366 6.93389 7.13221 1.00 0.00 WATR -ATOM 1129 OT HOH 204 -17.146 8.81121 7.13221 1.00 0.00 WATR -ATOM 1130 HT HOH 204 -16.389 9.39710 7.13221 1.00 0.00 WATR -ATOM 1131 HT HOH 204 -17.903 9.39710 7.13221 1.00 0.00 WATR -ATOM 1132 OT HOH 205 -17.146 6.34801 9.59542 1.00 0.00 WATR -ATOM 1133 HT HOH 205 -16.389 6.93389 9.59542 1.00 0.00 WATR -ATOM 1134 HT HOH 205 -17.903 6.93389 9.59542 1.00 0.00 WATR -ATOM 1135 OT HOH 206 -19.609 8.81121 9.59542 1.00 0.00 WATR -ATOM 1136 HT HOH 206 -18.852 9.39710 9.59542 1.00 0.00 WATR -ATOM 1137 HT HOH 206 -20.366 9.39710 9.59542 1.00 0.00 WATR -ATOM 1138 OT HOH 207 -19.609 11.2744 -12.573 1.00 0.00 WATR -ATOM 1139 HT HOH 207 -18.852 11.8603 -12.573 1.00 0.00 WATR -ATOM 1140 HT HOH 207 -20.366 11.8603 -12.573 1.00 0.00 WATR -ATOM 1141 OT HOH 208 -17.146 13.7376 -12.573 1.00 0.00 WATR -ATOM 1142 HT HOH 208 -16.389 14.3235 -12.573 1.00 0.00 WATR -ATOM 1143 HT HOH 208 -17.903 14.3235 -12.573 1.00 0.00 WATR -ATOM 1144 OT HOH 209 -17.146 11.2744 -10.110 1.00 0.00 WATR -ATOM 1145 HT HOH 209 -16.389 11.8603 -10.110 1.00 0.00 WATR -ATOM 1146 HT HOH 209 -17.903 11.8603 -10.110 1.00 0.00 WATR -ATOM 1147 OT HOH 210 -19.609 13.7376 -10.110 1.00 0.00 WATR -ATOM 1148 HT HOH 210 -18.852 14.3235 -10.110 1.00 0.00 WATR -ATOM 1149 HT HOH 210 -20.366 14.3235 -10.110 1.00 0.00 WATR -ATOM 1150 OT HOH 211 -19.609 11.2744 -7.6470 1.00 0.00 WATR -ATOM 1151 HT HOH 211 -18.852 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1152 HT HOH 211 -20.366 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1153 OT HOH 212 -17.146 13.7376 -7.6470 1.00 0.00 WATR -ATOM 1154 HT HOH 212 -16.389 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1155 HT HOH 212 -17.903 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1156 OT HOH 213 -17.146 11.2744 -5.1838 1.00 0.00 WATR -ATOM 1157 HT HOH 213 -16.389 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1158 HT HOH 213 -17.903 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1159 OT HOH 214 -19.609 13.7376 -5.1838 1.00 0.00 WATR -ATOM 1160 HT HOH 214 -18.852 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1161 HT HOH 214 -20.366 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1162 OT HOH 215 -19.609 11.2744 -2.7206 1.00 0.00 WATR -ATOM 1163 HT HOH 215 -18.852 11.8603 -2.7206 1.00 0.00 WATR -ATOM 1164 HT HOH 215 -20.366 11.8603 -2.7206 1.00 0.00 WATR -ATOM 1165 OT HOH 216 -17.146 13.7376 -2.7206 1.00 0.00 WATR -ATOM 1166 HT HOH 216 -16.389 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1167 HT HOH 216 -17.903 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1168 OT HOH 217 -17.146 11.2744 -0.2573 1.00 0.00 WATR -ATOM 1169 HT HOH 217 -16.389 11.8603 -0.2573 1.00 0.00 WATR -ATOM 1170 HT HOH 217 -17.903 11.8603 -0.2573 1.00 0.00 WATR -ATOM 1171 OT HOH 218 -19.609 13.7376 -0.2573 1.00 0.00 WATR -ATOM 1172 HT HOH 218 -18.852 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1173 HT HOH 218 -20.366 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1174 OT HOH 219 -19.609 11.2744 2.20580 1.00 0.00 WATR -ATOM 1175 HT HOH 219 -18.852 11.8603 2.20580 1.00 0.00 WATR -ATOM 1176 HT HOH 219 -20.366 11.8603 2.20580 1.00 0.00 WATR -ATOM 1177 OT HOH 220 -17.146 13.7376 2.20580 1.00 0.00 WATR -ATOM 1178 HT HOH 220 -16.389 14.3235 2.20580 1.00 0.00 WATR -ATOM 1179 HT HOH 220 -17.903 14.3235 2.20580 1.00 0.00 WATR -ATOM 1180 OT HOH 221 -17.146 11.2744 4.66901 1.00 0.00 WATR -ATOM 1181 HT HOH 221 -16.389 11.8603 4.66901 1.00 0.00 WATR -ATOM 1182 HT HOH 221 -17.903 11.8603 4.66901 1.00 0.00 WATR -ATOM 1183 OT HOH 222 -19.609 13.7376 4.66901 1.00 0.00 WATR -ATOM 1184 HT HOH 222 -18.852 14.3235 4.66901 1.00 0.00 WATR -ATOM 1185 HT HOH 222 -20.366 14.3235 4.66901 1.00 0.00 WATR -ATOM 1186 OT HOH 223 -19.609 11.2744 7.13221 1.00 0.00 WATR -ATOM 1187 HT HOH 223 -18.852 11.8603 7.13221 1.00 0.00 WATR -ATOM 1188 HT HOH 223 -20.366 11.8603 7.13221 1.00 0.00 WATR -ATOM 1189 OT HOH 224 -17.146 13.7376 7.13221 1.00 0.00 WATR -ATOM 1190 HT HOH 224 -16.389 14.3235 7.13221 1.00 0.00 WATR -ATOM 1191 HT HOH 224 -17.903 14.3235 7.13221 1.00 0.00 WATR -ATOM 1192 OT HOH 225 -17.146 11.2744 9.59542 1.00 0.00 WATR -ATOM 1193 HT HOH 225 -16.389 11.8603 9.59542 1.00 0.00 WATR -ATOM 1194 HT HOH 225 -17.903 11.8603 9.59542 1.00 0.00 WATR -ATOM 1195 OT HOH 226 -19.609 13.7376 9.59542 1.00 0.00 WATR -ATOM 1196 HT HOH 226 -18.852 14.3235 9.59542 1.00 0.00 WATR -ATOM 1197 HT HOH 226 -20.366 14.3235 9.59542 1.00 0.00 WATR -ATOM 1198 OT HOH 227 -14.683 -13.357 -12.573 1.00 0.00 WATR -ATOM 1199 HT HOH 227 -13.926 -12.771 -12.573 1.00 0.00 WATR -ATOM 1200 HT HOH 227 -15.440 -12.771 -12.573 1.00 0.00 WATR -ATOM 1201 OT HOH 228 -12.220 -10.894 -12.573 1.00 0.00 WATR -ATOM 1202 HT HOH 228 -11.463 -10.308 -12.573 1.00 0.00 WATR -ATOM 1203 HT HOH 228 -12.977 -10.308 -12.573 1.00 0.00 WATR -ATOM 1204 OT HOH 229 -12.220 -13.357 -10.110 1.00 0.00 WATR -ATOM 1205 HT HOH 229 -11.463 -12.771 -10.110 1.00 0.00 WATR -ATOM 1206 HT HOH 229 -12.977 -12.771 -10.110 1.00 0.00 WATR -ATOM 1207 OT HOH 230 -14.683 -10.894 -10.110 1.00 0.00 WATR -ATOM 1208 HT HOH 230 -13.926 -10.308 -10.110 1.00 0.00 WATR -ATOM 1209 HT HOH 230 -15.440 -10.308 -10.110 1.00 0.00 WATR -ATOM 1210 OT HOH 231 -14.683 -13.357 -7.6470 1.00 0.00 WATR -ATOM 1211 HT HOH 231 -13.926 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1212 HT HOH 231 -15.440 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1213 OT HOH 232 -12.220 -10.894 -7.6470 1.00 0.00 WATR -ATOM 1214 HT HOH 232 -11.463 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1215 HT HOH 232 -12.977 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1216 OT HOH 233 -12.220 -13.357 -5.1838 1.00 0.00 WATR -ATOM 1217 HT HOH 233 -11.463 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1218 HT HOH 233 -12.977 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1219 OT HOH 234 -14.683 -10.894 -5.1838 1.00 0.00 WATR -ATOM 1220 HT HOH 234 -13.926 -10.308 -5.1838 1.00 0.00 WATR -ATOM 1221 HT HOH 234 -15.440 -10.308 -5.1838 1.00 0.00 WATR -ATOM 1222 OT HOH 235 -14.683 -13.357 -2.7206 1.00 0.00 WATR -ATOM 1223 HT HOH 235 -13.926 -12.771 -2.7206 1.00 0.00 WATR -ATOM 1224 HT HOH 235 -15.440 -12.771 -2.7206 1.00 0.00 WATR -ATOM 1225 OT HOH 236 -14.683 -10.894 -0.2573 1.00 0.00 WATR -ATOM 1226 HT HOH 236 -13.926 -10.308 -0.2573 1.00 0.00 WATR -ATOM 1227 HT HOH 236 -15.440 -10.308 -0.2573 1.00 0.00 WATR -ATOM 1228 OT HOH 237 -14.683 -13.357 2.20580 1.00 0.00 WATR -ATOM 1229 HT HOH 237 -13.926 -12.771 2.20580 1.00 0.00 WATR -ATOM 1230 HT HOH 237 -15.440 -12.771 2.20580 1.00 0.00 WATR -ATOM 1231 OT HOH 238 -12.220 -13.357 4.66901 1.00 0.00 WATR -ATOM 1232 HT HOH 238 -11.463 -12.771 4.66901 1.00 0.00 WATR -ATOM 1233 HT HOH 238 -12.977 -12.771 4.66901 1.00 0.00 WATR -ATOM 1234 OT HOH 239 -14.683 -10.894 4.66901 1.00 0.00 WATR -ATOM 1235 HT HOH 239 -13.926 -10.308 4.66901 1.00 0.00 WATR -ATOM 1236 HT HOH 239 -15.440 -10.308 4.66901 1.00 0.00 WATR -ATOM 1237 OT HOH 240 -14.683 -13.357 7.13221 1.00 0.00 WATR -ATOM 1238 HT HOH 240 -13.926 -12.771 7.13221 1.00 0.00 WATR -ATOM 1239 HT HOH 240 -15.440 -12.771 7.13221 1.00 0.00 WATR -ATOM 1240 OT HOH 241 -12.220 -10.894 7.13221 1.00 0.00 WATR -ATOM 1241 HT HOH 241 -11.463 -10.308 7.13221 1.00 0.00 WATR -ATOM 1242 HT HOH 241 -12.977 -10.308 7.13221 1.00 0.00 WATR -ATOM 1243 OT HOH 242 -12.220 -13.357 9.59542 1.00 0.00 WATR -ATOM 1244 HT HOH 242 -11.463 -12.771 9.59542 1.00 0.00 WATR -ATOM 1245 HT HOH 242 -12.977 -12.771 9.59542 1.00 0.00 WATR -ATOM 1246 OT HOH 243 -14.683 -10.894 9.59542 1.00 0.00 WATR -ATOM 1247 HT HOH 243 -13.926 -10.308 9.59542 1.00 0.00 WATR -ATOM 1248 HT HOH 243 -15.440 -10.308 9.59542 1.00 0.00 WATR -ATOM 1249 OT HOH 244 -14.683 -8.4312 -12.573 1.00 0.00 WATR -ATOM 1250 HT HOH 244 -13.926 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1251 HT HOH 244 -15.440 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1252 OT HOH 245 -12.220 -5.9680 -12.573 1.00 0.00 WATR -ATOM 1253 HT HOH 245 -11.463 -5.3821 -12.573 1.00 0.00 WATR -ATOM 1254 HT HOH 245 -12.977 -5.3821 -12.573 1.00 0.00 WATR -ATOM 1255 OT HOH 246 -12.220 -8.4312 -10.110 1.00 0.00 WATR -ATOM 1256 HT HOH 246 -11.463 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1257 HT HOH 246 -12.977 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1258 OT HOH 247 -14.683 -5.9680 -10.110 1.00 0.00 WATR -ATOM 1259 HT HOH 247 -13.926 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1260 HT HOH 247 -15.440 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1261 OT HOH 248 -14.683 -8.4312 -7.6470 1.00 0.00 WATR -ATOM 1262 HT HOH 248 -13.926 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 1263 HT HOH 248 -15.440 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 1264 OT HOH 249 -14.683 -8.4312 -2.7206 1.00 0.00 WATR -ATOM 1265 HT HOH 249 -13.926 -7.8453 -2.7206 1.00 0.00 WATR -ATOM 1266 HT HOH 249 -15.440 -7.8453 -2.7206 1.00 0.00 WATR -ATOM 1267 OT HOH 250 -14.683 -8.4312 7.13221 1.00 0.00 WATR -ATOM 1268 HT HOH 250 -13.926 -7.8453 7.13221 1.00 0.00 WATR -ATOM 1269 HT HOH 250 -15.440 -7.8453 7.13221 1.00 0.00 WATR -ATOM 1270 OT HOH 251 -12.220 -5.9680 7.13221 1.00 0.00 WATR -ATOM 1271 HT HOH 251 -11.463 -5.3821 7.13221 1.00 0.00 WATR -ATOM 1272 HT HOH 251 -12.977 -5.3821 7.13221 1.00 0.00 WATR -ATOM 1273 OT HOH 252 -12.220 -8.4312 9.59542 1.00 0.00 WATR -ATOM 1274 HT HOH 252 -11.463 -7.8453 9.59542 1.00 0.00 WATR -ATOM 1275 HT HOH 252 -12.977 -7.8453 9.59542 1.00 0.00 WATR -ATOM 1276 OT HOH 253 -14.683 -5.9680 9.59542 1.00 0.00 WATR -ATOM 1277 HT HOH 253 -13.926 -5.3821 9.59542 1.00 0.00 WATR -ATOM 1278 HT HOH 253 -15.440 -5.3821 9.59542 1.00 0.00 WATR -ATOM 1279 OT HOH 254 -14.683 -3.5048 -12.573 1.00 0.00 WATR -ATOM 1280 HT HOH 254 -13.926 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1281 HT HOH 254 -15.440 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1282 OT HOH 255 -12.220 -1.0416 -12.573 1.00 0.00 WATR -ATOM 1283 HT HOH 255 -11.463 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1284 HT HOH 255 -12.977 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1285 OT HOH 256 -12.220 -3.5048 -10.110 1.00 0.00 WATR -ATOM 1286 HT HOH 256 -11.463 -2.9189 -10.110 1.00 0.00 WATR -ATOM 1287 HT HOH 256 -12.977 -2.9189 -10.110 1.00 0.00 WATR -ATOM 1288 OT HOH 257 -14.683 -1.0416 -10.110 1.00 0.00 WATR -ATOM 1289 HT HOH 257 -13.926 -0.4557 -10.110 1.00 0.00 WATR -ATOM 1290 HT HOH 257 -15.440 -0.4557 -10.110 1.00 0.00 WATR -ATOM 1291 OT HOH 258 -14.683 -3.5048 -7.6470 1.00 0.00 WATR -ATOM 1292 HT HOH 258 -13.926 -2.9189 -7.6470 1.00 0.00 WATR -ATOM 1293 HT HOH 258 -15.440 -2.9189 -7.6470 1.00 0.00 WATR -ATOM 1294 OT HOH 259 -12.220 -1.0416 -7.6470 1.00 0.00 WATR -ATOM 1295 HT HOH 259 -11.463 -0.4557 -7.6470 1.00 0.00 WATR -ATOM 1296 HT HOH 259 -12.977 -0.4557 -7.6470 1.00 0.00 WATR -ATOM 1297 OT HOH 260 -14.683 -1.0416 -5.1838 1.00 0.00 WATR -ATOM 1298 HT HOH 260 -13.926 -0.4557 -5.1838 1.00 0.00 WATR -ATOM 1299 HT HOH 260 -15.440 -0.4557 -5.1838 1.00 0.00 WATR -ATOM 1300 OT HOH 261 -14.683 -3.5048 -2.7206 1.00 0.00 WATR -ATOM 1301 HT HOH 261 -13.926 -2.9189 -2.7206 1.00 0.00 WATR -ATOM 1302 HT HOH 261 -15.440 -2.9189 -2.7206 1.00 0.00 WATR -ATOM 1303 OT HOH 262 -14.683 -3.5048 7.13221 1.00 0.00 WATR -ATOM 1304 HT HOH 262 -13.926 -2.9189 7.13221 1.00 0.00 WATR -ATOM 1305 HT HOH 262 -15.440 -2.9189 7.13221 1.00 0.00 WATR -ATOM 1306 OT HOH 263 -12.220 -3.5048 9.59542 1.00 0.00 WATR -ATOM 1307 HT HOH 263 -11.463 -2.9189 9.59542 1.00 0.00 WATR -ATOM 1308 HT HOH 263 -12.977 -2.9189 9.59542 1.00 0.00 WATR -ATOM 1309 OT HOH 264 -14.683 -1.0416 9.59542 1.00 0.00 WATR -ATOM 1310 HT HOH 264 -13.926 -0.4557 9.59542 1.00 0.00 WATR -ATOM 1311 HT HOH 264 -15.440 -0.4557 9.59542 1.00 0.00 WATR -ATOM 1312 OT HOH 265 -14.683 1.42160 -12.573 1.00 0.00 WATR -ATOM 1313 HT HOH 265 -13.926 2.00748 -12.573 1.00 0.00 WATR -ATOM 1314 HT HOH 265 -15.440 2.00748 -12.573 1.00 0.00 WATR -ATOM 1315 OT HOH 266 -12.220 3.88480 -12.573 1.00 0.00 WATR -ATOM 1316 HT HOH 266 -11.463 4.47069 -12.573 1.00 0.00 WATR -ATOM 1317 HT HOH 266 -12.977 4.47069 -12.573 1.00 0.00 WATR -ATOM 1318 OT HOH 267 -12.220 1.42160 -10.110 1.00 0.00 WATR -ATOM 1319 HT HOH 267 -11.463 2.00748 -10.110 1.00 0.00 WATR -ATOM 1320 HT HOH 267 -12.977 2.00748 -10.110 1.00 0.00 WATR -ATOM 1321 OT HOH 268 -14.683 3.88480 -10.110 1.00 0.00 WATR -ATOM 1322 HT HOH 268 -13.926 4.47069 -10.110 1.00 0.00 WATR -ATOM 1323 HT HOH 268 -15.440 4.47069 -10.110 1.00 0.00 WATR -ATOM 1324 OT HOH 269 -14.683 1.42160 -7.6470 1.00 0.00 WATR -ATOM 1325 HT HOH 269 -13.926 2.00748 -7.6470 1.00 0.00 WATR -ATOM 1326 HT HOH 269 -15.440 2.00748 -7.6470 1.00 0.00 WATR -ATOM 1327 OT HOH 270 -14.683 1.42160 7.13221 1.00 0.00 WATR -ATOM 1328 HT HOH 270 -13.926 2.00748 7.13221 1.00 0.00 WATR -ATOM 1329 HT HOH 270 -15.440 2.00748 7.13221 1.00 0.00 WATR -ATOM 1330 OT HOH 271 -14.683 6.34801 -12.573 1.00 0.00 WATR -ATOM 1331 HT HOH 271 -13.926 6.93389 -12.573 1.00 0.00 WATR -ATOM 1332 HT HOH 271 -15.440 6.93389 -12.573 1.00 0.00 WATR -ATOM 1333 OT HOH 272 -12.220 8.81121 -12.573 1.00 0.00 WATR -ATOM 1334 HT HOH 272 -11.463 9.39710 -12.573 1.00 0.00 WATR -ATOM 1335 HT HOH 272 -12.977 9.39710 -12.573 1.00 0.00 WATR -ATOM 1336 OT HOH 273 -12.220 6.34801 -10.110 1.00 0.00 WATR -ATOM 1337 HT HOH 273 -11.463 6.93389 -10.110 1.00 0.00 WATR -ATOM 1338 HT HOH 273 -12.977 6.93389 -10.110 1.00 0.00 WATR -ATOM 1339 OT HOH 274 -14.683 8.81121 -10.110 1.00 0.00 WATR -ATOM 1340 HT HOH 274 -13.926 9.39710 -10.110 1.00 0.00 WATR -ATOM 1341 HT HOH 274 -15.440 9.39710 -10.110 1.00 0.00 WATR -ATOM 1342 OT HOH 275 -14.683 6.34801 -7.6470 1.00 0.00 WATR -ATOM 1343 HT HOH 275 -13.926 6.93389 -7.6470 1.00 0.00 WATR -ATOM 1344 HT HOH 275 -15.440 6.93389 -7.6470 1.00 0.00 WATR -ATOM 1345 OT HOH 276 -12.220 8.81121 -7.6470 1.00 0.00 WATR -ATOM 1346 HT HOH 276 -11.463 9.39710 -7.6470 1.00 0.00 WATR -ATOM 1347 HT HOH 276 -12.977 9.39710 -7.6470 1.00 0.00 WATR -ATOM 1348 OT HOH 277 -12.220 6.34801 4.66901 1.00 0.00 WATR -ATOM 1349 HT HOH 277 -11.463 6.93389 4.66901 1.00 0.00 WATR -ATOM 1350 HT HOH 277 -12.977 6.93389 4.66901 1.00 0.00 WATR -ATOM 1351 OT HOH 278 -14.683 8.81121 4.66901 1.00 0.00 WATR -ATOM 1352 HT HOH 278 -13.926 9.39710 4.66901 1.00 0.00 WATR -ATOM 1353 HT HOH 278 -15.440 9.39710 4.66901 1.00 0.00 WATR -ATOM 1354 OT HOH 279 -14.683 6.34801 7.13221 1.00 0.00 WATR -ATOM 1355 HT HOH 279 -13.926 6.93389 7.13221 1.00 0.00 WATR -ATOM 1356 HT HOH 279 -15.440 6.93389 7.13221 1.00 0.00 WATR -ATOM 1357 OT HOH 280 -12.220 8.81121 7.13221 1.00 0.00 WATR -ATOM 1358 HT HOH 280 -11.463 9.39710 7.13221 1.00 0.00 WATR -ATOM 1359 HT HOH 280 -12.977 9.39710 7.13221 1.00 0.00 WATR -ATOM 1360 OT HOH 281 -14.683 8.81121 9.59542 1.00 0.00 WATR -ATOM 1361 HT HOH 281 -13.926 9.39710 9.59542 1.00 0.00 WATR -ATOM 1362 HT HOH 281 -15.440 9.39710 9.59542 1.00 0.00 WATR -ATOM 1363 OT HOH 282 -14.683 11.2744 -12.573 1.00 0.00 WATR -ATOM 1364 HT HOH 282 -13.926 11.8603 -12.573 1.00 0.00 WATR -ATOM 1365 HT HOH 282 -15.440 11.8603 -12.573 1.00 0.00 WATR -ATOM 1366 OT HOH 283 -12.220 13.7376 -12.573 1.00 0.00 WATR -ATOM 1367 HT HOH 283 -11.463 14.3235 -12.573 1.00 0.00 WATR -ATOM 1368 HT HOH 283 -12.977 14.3235 -12.573 1.00 0.00 WATR -ATOM 1369 OT HOH 284 -12.220 11.2744 -10.110 1.00 0.00 WATR -ATOM 1370 HT HOH 284 -11.463 11.8603 -10.110 1.00 0.00 WATR -ATOM 1371 HT HOH 284 -12.977 11.8603 -10.110 1.00 0.00 WATR -ATOM 1372 OT HOH 285 -14.683 13.7376 -10.110 1.00 0.00 WATR -ATOM 1373 HT HOH 285 -13.926 14.3235 -10.110 1.00 0.00 WATR -ATOM 1374 HT HOH 285 -15.440 14.3235 -10.110 1.00 0.00 WATR -ATOM 1375 OT HOH 286 -14.683 11.2744 -7.6470 1.00 0.00 WATR -ATOM 1376 HT HOH 286 -13.926 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1377 HT HOH 286 -15.440 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1378 OT HOH 287 -12.220 13.7376 -7.6470 1.00 0.00 WATR -ATOM 1379 HT HOH 287 -11.463 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1380 HT HOH 287 -12.977 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1381 OT HOH 288 -12.220 11.2744 -5.1838 1.00 0.00 WATR -ATOM 1382 HT HOH 288 -11.463 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1383 HT HOH 288 -12.977 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1384 OT HOH 289 -14.683 13.7376 -5.1838 1.00 0.00 WATR -ATOM 1385 HT HOH 289 -13.926 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1386 HT HOH 289 -15.440 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1387 OT HOH 290 -14.683 11.2744 -2.7206 1.00 0.00 WATR -ATOM 1388 HT HOH 290 -13.926 11.8603 -2.7206 1.00 0.00 WATR -ATOM 1389 HT HOH 290 -15.440 11.8603 -2.7206 1.00 0.00 WATR -ATOM 1390 OT HOH 291 -12.220 13.7376 -2.7206 1.00 0.00 WATR -ATOM 1391 HT HOH 291 -11.463 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1392 HT HOH 291 -12.977 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1393 OT HOH 292 -12.220 11.2744 -0.2573 1.00 0.00 WATR -ATOM 1394 HT HOH 292 -11.463 11.8603 -0.2573 1.00 0.00 WATR -ATOM 1395 HT HOH 292 -12.977 11.8603 -0.2573 1.00 0.00 WATR -ATOM 1396 OT HOH 293 -14.683 13.7376 -0.2573 1.00 0.00 WATR -ATOM 1397 HT HOH 293 -13.926 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1398 HT HOH 293 -15.440 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1399 OT HOH 294 -14.683 11.2744 2.20580 1.00 0.00 WATR -ATOM 1400 HT HOH 294 -13.926 11.8603 2.20580 1.00 0.00 WATR -ATOM 1401 HT HOH 294 -15.440 11.8603 2.20580 1.00 0.00 WATR -ATOM 1402 OT HOH 295 -12.220 13.7376 2.20580 1.00 0.00 WATR -ATOM 1403 HT HOH 295 -11.463 14.3235 2.20580 1.00 0.00 WATR -ATOM 1404 HT HOH 295 -12.977 14.3235 2.20580 1.00 0.00 WATR -ATOM 1405 OT HOH 296 -12.220 11.2744 4.66901 1.00 0.00 WATR -ATOM 1406 HT HOH 296 -11.463 11.8603 4.66901 1.00 0.00 WATR -ATOM 1407 HT HOH 296 -12.977 11.8603 4.66901 1.00 0.00 WATR -ATOM 1408 OT HOH 297 -14.683 13.7376 4.66901 1.00 0.00 WATR -ATOM 1409 HT HOH 297 -13.926 14.3235 4.66901 1.00 0.00 WATR -ATOM 1410 HT HOH 297 -15.440 14.3235 4.66901 1.00 0.00 WATR -ATOM 1411 OT HOH 298 -14.683 11.2744 7.13221 1.00 0.00 WATR -ATOM 1412 HT HOH 298 -13.926 11.8603 7.13221 1.00 0.00 WATR -ATOM 1413 HT HOH 298 -15.440 11.8603 7.13221 1.00 0.00 WATR -ATOM 1414 OT HOH 299 -12.220 13.7376 7.13221 1.00 0.00 WATR -ATOM 1415 HT HOH 299 -11.463 14.3235 7.13221 1.00 0.00 WATR -ATOM 1416 HT HOH 299 -12.977 14.3235 7.13221 1.00 0.00 WATR -ATOM 1417 OT HOH 300 -12.220 11.2744 9.59542 1.00 0.00 WATR -ATOM 1418 HT HOH 300 -11.463 11.8603 9.59542 1.00 0.00 WATR -ATOM 1419 HT HOH 300 -12.977 11.8603 9.59542 1.00 0.00 WATR -ATOM 1420 OT HOH 301 -14.683 13.7376 9.59542 1.00 0.00 WATR -ATOM 1421 HT HOH 301 -13.926 14.3235 9.59542 1.00 0.00 WATR -ATOM 1422 HT HOH 301 -15.440 14.3235 9.59542 1.00 0.00 WATR -ATOM 1423 OT HOH 302 -9.7569 -13.357 -12.573 1.00 0.00 WATR -ATOM 1424 HT HOH 302 -8.9999 -12.771 -12.573 1.00 0.00 WATR -ATOM 1425 HT HOH 302 -10.513 -12.771 -12.573 1.00 0.00 WATR -ATOM 1426 OT HOH 303 -7.2937 -10.894 -12.573 1.00 0.00 WATR -ATOM 1427 HT HOH 303 -6.5367 -10.308 -12.573 1.00 0.00 WATR -ATOM 1428 HT HOH 303 -8.0506 -10.308 -12.573 1.00 0.00 WATR -ATOM 1429 OT HOH 304 -7.2937 -13.357 -10.110 1.00 0.00 WATR -ATOM 1430 HT HOH 304 -6.5367 -12.771 -10.110 1.00 0.00 WATR -ATOM 1431 HT HOH 304 -8.0506 -12.771 -10.110 1.00 0.00 WATR -ATOM 1432 OT HOH 305 -9.7569 -10.894 -10.110 1.00 0.00 WATR -ATOM 1433 HT HOH 305 -8.9999 -10.308 -10.110 1.00 0.00 WATR -ATOM 1434 HT HOH 305 -10.513 -10.308 -10.110 1.00 0.00 WATR -ATOM 1435 OT HOH 306 -9.7569 -13.357 -7.6470 1.00 0.00 WATR -ATOM 1436 HT HOH 306 -8.9999 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1437 HT HOH 306 -10.513 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1438 OT HOH 307 -7.2937 -13.357 4.66901 1.00 0.00 WATR -ATOM 1439 HT HOH 307 -6.5367 -12.771 4.66901 1.00 0.00 WATR -ATOM 1440 HT HOH 307 -8.0506 -12.771 4.66901 1.00 0.00 WATR -ATOM 1441 OT HOH 308 -9.7569 -10.894 4.66901 1.00 0.00 WATR -ATOM 1442 HT HOH 308 -8.9999 -10.308 4.66901 1.00 0.00 WATR -ATOM 1443 HT HOH 308 -10.513 -10.308 4.66901 1.00 0.00 WATR -ATOM 1444 OT HOH 309 -9.7569 -13.357 7.13221 1.00 0.00 WATR -ATOM 1445 HT HOH 309 -8.9999 -12.771 7.13221 1.00 0.00 WATR -ATOM 1446 HT HOH 309 -10.513 -12.771 7.13221 1.00 0.00 WATR -ATOM 1447 OT HOH 310 -7.2937 -10.894 7.13221 1.00 0.00 WATR -ATOM 1448 HT HOH 310 -6.5367 -10.308 7.13221 1.00 0.00 WATR -ATOM 1449 HT HOH 310 -8.0506 -10.308 7.13221 1.00 0.00 WATR -ATOM 1450 OT HOH 311 -7.2937 -13.357 9.59542 1.00 0.00 WATR -ATOM 1451 HT HOH 311 -6.5367 -12.771 9.59542 1.00 0.00 WATR -ATOM 1452 HT HOH 311 -8.0506 -12.771 9.59542 1.00 0.00 WATR -ATOM 1453 OT HOH 312 -9.7569 -10.894 9.59542 1.00 0.00 WATR -ATOM 1454 HT HOH 312 -8.9999 -10.308 9.59542 1.00 0.00 WATR -ATOM 1455 HT HOH 312 -10.513 -10.308 9.59542 1.00 0.00 WATR -ATOM 1456 OT HOH 313 -9.7569 -8.4312 -12.573 1.00 0.00 WATR -ATOM 1457 HT HOH 313 -8.9999 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1458 HT HOH 313 -10.513 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1459 OT HOH 314 -7.2937 -5.9680 -12.573 1.00 0.00 WATR -ATOM 1460 HT HOH 314 -6.5367 -5.3821 -12.573 1.00 0.00 WATR -ATOM 1461 HT HOH 314 -8.0506 -5.3821 -12.573 1.00 0.00 WATR -ATOM 1462 OT HOH 315 -7.2937 -8.4312 -10.110 1.00 0.00 WATR -ATOM 1463 HT HOH 315 -6.5367 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1464 HT HOH 315 -8.0506 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1465 OT HOH 316 -9.7569 -5.9680 -10.110 1.00 0.00 WATR -ATOM 1466 HT HOH 316 -8.9999 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1467 HT HOH 316 -10.513 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1468 OT HOH 317 -7.2937 -8.4312 4.66901 1.00 0.00 WATR -ATOM 1469 HT HOH 317 -6.5367 -7.8453 4.66901 1.00 0.00 WATR -ATOM 1470 HT HOH 317 -8.0506 -7.8453 4.66901 1.00 0.00 WATR -ATOM 1471 OT HOH 318 -9.7569 -8.4312 7.13221 1.00 0.00 WATR -ATOM 1472 HT HOH 318 -8.9999 -7.8453 7.13221 1.00 0.00 WATR -ATOM 1473 HT HOH 318 -10.513 -7.8453 7.13221 1.00 0.00 WATR -ATOM 1474 OT HOH 319 -7.2937 -5.9680 7.13221 1.00 0.00 WATR -ATOM 1475 HT HOH 319 -6.5367 -5.3821 7.13221 1.00 0.00 WATR -ATOM 1476 HT HOH 319 -8.0506 -5.3821 7.13221 1.00 0.00 WATR -ATOM 1477 OT HOH 320 -7.2937 -8.4312 9.59542 1.00 0.00 WATR -ATOM 1478 HT HOH 320 -6.5367 -7.8453 9.59542 1.00 0.00 WATR -ATOM 1479 HT HOH 320 -8.0506 -7.8453 9.59542 1.00 0.00 WATR -ATOM 1480 OT HOH 321 -9.7569 -5.9680 9.59542 1.00 0.00 WATR -ATOM 1481 HT HOH 321 -8.9999 -5.3821 9.59542 1.00 0.00 WATR -ATOM 1482 HT HOH 321 -10.513 -5.3821 9.59542 1.00 0.00 WATR -ATOM 1483 OT HOH 322 -9.7569 -3.5048 -12.573 1.00 0.00 WATR -ATOM 1484 HT HOH 322 -8.9999 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1485 HT HOH 322 -10.513 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1486 OT HOH 323 -7.2937 -1.0416 -12.573 1.00 0.00 WATR -ATOM 1487 HT HOH 323 -6.5367 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1488 HT HOH 323 -8.0506 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1489 OT HOH 324 -7.2937 -3.5048 -10.110 1.00 0.00 WATR -ATOM 1490 HT HOH 324 -6.5367 -2.9189 -10.110 1.00 0.00 WATR -ATOM 1491 HT HOH 324 -8.0506 -2.9189 -10.110 1.00 0.00 WATR -ATOM 1492 OT HOH 325 -9.7569 -1.0416 -10.110 1.00 0.00 WATR -ATOM 1493 HT HOH 325 -8.9999 -0.4557 -10.110 1.00 0.00 WATR -ATOM 1494 HT HOH 325 -10.513 -0.4557 -10.110 1.00 0.00 WATR -ATOM 1495 OT HOH 326 -9.7569 1.42160 -12.573 1.00 0.00 WATR -ATOM 1496 HT HOH 326 -8.9999 2.00748 -12.573 1.00 0.00 WATR -ATOM 1497 HT HOH 326 -10.513 2.00748 -12.573 1.00 0.00 WATR -ATOM 1498 OT HOH 327 -7.2937 3.88480 -12.573 1.00 0.00 WATR -ATOM 1499 HT HOH 327 -6.5367 4.47069 -12.573 1.00 0.00 WATR -ATOM 1500 HT HOH 327 -8.0506 4.47069 -12.573 1.00 0.00 WATR -ATOM 1501 OT HOH 328 -7.2937 1.42160 -10.110 1.00 0.00 WATR -ATOM 1502 HT HOH 328 -6.5367 2.00748 -10.110 1.00 0.00 WATR -ATOM 1503 HT HOH 328 -8.0506 2.00748 -10.110 1.00 0.00 WATR -ATOM 1504 OT HOH 329 -9.7569 3.88480 -10.110 1.00 0.00 WATR -ATOM 1505 HT HOH 329 -8.9999 4.47069 -10.110 1.00 0.00 WATR -ATOM 1506 HT HOH 329 -10.513 4.47069 -10.110 1.00 0.00 WATR -ATOM 1507 OT HOH 330 -9.7569 6.34801 -12.573 1.00 0.00 WATR -ATOM 1508 HT HOH 330 -8.9999 6.93389 -12.573 1.00 0.00 WATR -ATOM 1509 HT HOH 330 -10.513 6.93389 -12.573 1.00 0.00 WATR -ATOM 1510 OT HOH 331 -7.2937 8.81121 -12.573 1.00 0.00 WATR -ATOM 1511 HT HOH 331 -6.5367 9.39710 -12.573 1.00 0.00 WATR -ATOM 1512 HT HOH 331 -8.0506 9.39710 -12.573 1.00 0.00 WATR -ATOM 1513 OT HOH 332 -9.7569 8.81121 -10.110 1.00 0.00 WATR -ATOM 1514 HT HOH 332 -8.9999 9.39710 -10.110 1.00 0.00 WATR -ATOM 1515 HT HOH 332 -10.513 9.39710 -10.110 1.00 0.00 WATR -ATOM 1516 OT HOH 333 -9.7569 8.81121 4.66901 1.00 0.00 WATR -ATOM 1517 HT HOH 333 -8.9999 9.39710 4.66901 1.00 0.00 WATR -ATOM 1518 HT HOH 333 -10.513 9.39710 4.66901 1.00 0.00 WATR -ATOM 1519 OT HOH 334 -7.2937 8.81121 7.13221 1.00 0.00 WATR -ATOM 1520 HT HOH 334 -6.5367 9.39710 7.13221 1.00 0.00 WATR -ATOM 1521 HT HOH 334 -8.0506 9.39710 7.13221 1.00 0.00 WATR -ATOM 1522 OT HOH 335 -7.2937 6.34801 9.59542 1.00 0.00 WATR -ATOM 1523 HT HOH 335 -6.5367 6.93389 9.59542 1.00 0.00 WATR -ATOM 1524 HT HOH 335 -8.0506 6.93389 9.59542 1.00 0.00 WATR -ATOM 1525 OT HOH 336 -9.7569 8.81121 9.59542 1.00 0.00 WATR -ATOM 1526 HT HOH 336 -8.9999 9.39710 9.59542 1.00 0.00 WATR -ATOM 1527 HT HOH 336 -10.513 9.39710 9.59542 1.00 0.00 WATR -ATOM 1528 SOD ION 337 -9.7569 11.2744 -12.573 1.00 0.00 SALT -ATOM 1529 OT HOH 338 -7.2937 13.7376 -12.573 1.00 0.00 WATR -ATOM 1530 HT HOH 338 -6.5367 14.3235 -12.573 1.00 0.00 WATR -ATOM 1531 HT HOH 338 -8.0506 14.3235 -12.573 1.00 0.00 WATR -ATOM 1532 OT HOH 339 -7.2937 11.2744 -10.110 1.00 0.00 WATR -ATOM 1533 HT HOH 339 -6.5367 11.8603 -10.110 1.00 0.00 WATR -ATOM 1534 HT HOH 339 -8.0506 11.8603 -10.110 1.00 0.00 WATR -ATOM 1535 OT HOH 340 -9.7569 13.7376 -10.110 1.00 0.00 WATR -ATOM 1536 HT HOH 340 -8.9999 14.3235 -10.110 1.00 0.00 WATR -ATOM 1537 HT HOH 340 -10.513 14.3235 -10.110 1.00 0.00 WATR -ATOM 1538 OT HOH 341 -9.7569 11.2744 -7.6470 1.00 0.00 WATR -ATOM 1539 HT HOH 341 -8.9999 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1540 HT HOH 341 -10.513 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1541 OT HOH 342 -9.7569 13.7376 -5.1838 1.00 0.00 WATR -ATOM 1542 HT HOH 342 -8.9999 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1543 HT HOH 342 -10.513 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1544 OT HOH 343 -7.2937 13.7376 -2.7206 1.00 0.00 WATR -ATOM 1545 HT HOH 343 -6.5367 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1546 HT HOH 343 -8.0506 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1547 OT HOH 344 -9.7569 13.7376 -0.2573 1.00 0.00 WATR -ATOM 1548 HT HOH 344 -8.9999 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1549 HT HOH 344 -10.513 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1550 OT HOH 345 -9.7569 11.2744 2.20580 1.00 0.00 WATR -ATOM 1551 HT HOH 345 -8.9999 11.8603 2.20580 1.00 0.00 WATR -ATOM 1552 HT HOH 345 -10.513 11.8603 2.20580 1.00 0.00 WATR -ATOM 1553 OT HOH 346 -7.2937 13.7376 2.20580 1.00 0.00 WATR -ATOM 1554 HT HOH 346 -6.5367 14.3235 2.20580 1.00 0.00 WATR -ATOM 1555 HT HOH 346 -8.0506 14.3235 2.20580 1.00 0.00 WATR -ATOM 1556 OT HOH 347 -7.2937 11.2744 4.66901 1.00 0.00 WATR -ATOM 1557 HT HOH 347 -6.5367 11.8603 4.66901 1.00 0.00 WATR -ATOM 1558 HT HOH 347 -8.0506 11.8603 4.66901 1.00 0.00 WATR -ATOM 1559 OT HOH 348 -9.7569 13.7376 4.66901 1.00 0.00 WATR -ATOM 1560 HT HOH 348 -8.9999 14.3235 4.66901 1.00 0.00 WATR -ATOM 1561 HT HOH 348 -10.513 14.3235 4.66901 1.00 0.00 WATR -ATOM 1562 OT HOH 349 -9.7569 11.2744 7.13221 1.00 0.00 WATR -ATOM 1563 HT HOH 349 -8.9999 11.8603 7.13221 1.00 0.00 WATR -ATOM 1564 HT HOH 349 -10.513 11.8603 7.13221 1.00 0.00 WATR -ATOM 1565 OT HOH 350 -7.2937 13.7376 7.13221 1.00 0.00 WATR -ATOM 1566 HT HOH 350 -6.5367 14.3235 7.13221 1.00 0.00 WATR -ATOM 1567 HT HOH 350 -8.0506 14.3235 7.13221 1.00 0.00 WATR -ATOM 1568 OT HOH 351 -7.2937 11.2744 9.59542 1.00 0.00 WATR -ATOM 1569 HT HOH 351 -6.5367 11.8603 9.59542 1.00 0.00 WATR -ATOM 1570 HT HOH 351 -8.0506 11.8603 9.59542 1.00 0.00 WATR -ATOM 1571 OT HOH 352 -9.7569 13.7376 9.59542 1.00 0.00 WATR -ATOM 1572 HT HOH 352 -8.9999 14.3235 9.59542 1.00 0.00 WATR -ATOM 1573 HT HOH 352 -10.513 14.3235 9.59542 1.00 0.00 WATR -ATOM 1574 OT HOH 353 -4.8305 -13.357 -12.573 1.00 0.00 WATR -ATOM 1575 HT HOH 353 -4.0735 -12.771 -12.573 1.00 0.00 WATR -ATOM 1576 HT HOH 353 -5.5874 -12.771 -12.573 1.00 0.00 WATR -ATOM 1577 OT HOH 354 -2.3673 -10.894 -12.573 1.00 0.00 WATR -ATOM 1578 HT HOH 354 -1.6103 -10.308 -12.573 1.00 0.00 WATR -ATOM 1579 HT HOH 354 -3.1242 -10.308 -12.573 1.00 0.00 WATR -ATOM 1580 OT HOH 355 -2.3673 -13.357 -10.110 1.00 0.00 WATR -ATOM 1581 HT HOH 355 -1.6103 -12.771 -10.110 1.00 0.00 WATR -ATOM 1582 HT HOH 355 -3.1242 -12.771 -10.110 1.00 0.00 WATR -ATOM 1583 OT HOH 356 -4.8305 -10.894 -10.110 1.00 0.00 WATR -ATOM 1584 HT HOH 356 -4.0735 -10.308 -10.110 1.00 0.00 WATR -ATOM 1585 HT HOH 356 -5.5874 -10.308 -10.110 1.00 0.00 WATR -ATOM 1586 OT HOH 357 -4.8305 -13.357 -7.6470 1.00 0.00 WATR -ATOM 1587 HT HOH 357 -4.0735 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1588 HT HOH 357 -5.5874 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1589 OT HOH 358 -2.3673 -10.894 -7.6470 1.00 0.00 WATR -ATOM 1590 HT HOH 358 -1.6103 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1591 HT HOH 358 -3.1242 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1592 OT HOH 359 -2.3673 -13.357 -5.1838 1.00 0.00 WATR -ATOM 1593 HT HOH 359 -1.6103 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1594 HT HOH 359 -3.1242 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1595 OT HOH 360 -2.3673 -13.357 -0.2573 1.00 0.00 WATR -ATOM 1596 HT HOH 360 -1.6103 -12.771 -0.2573 1.00 0.00 WATR -ATOM 1597 HT HOH 360 -3.1242 -12.771 -0.2573 1.00 0.00 WATR -ATOM 1598 OT HOH 361 -4.8305 -13.357 2.20580 1.00 0.00 WATR -ATOM 1599 HT HOH 361 -4.0735 -12.771 2.20580 1.00 0.00 WATR -ATOM 1600 HT HOH 361 -5.5874 -12.771 2.20580 1.00 0.00 WATR -ATOM 1601 OT HOH 362 -2.3673 -13.357 4.66901 1.00 0.00 WATR -ATOM 1602 HT HOH 362 -1.6103 -12.771 4.66901 1.00 0.00 WATR -ATOM 1603 HT HOH 362 -3.1242 -12.771 4.66901 1.00 0.00 WATR -ATOM 1604 OT HOH 363 -4.8305 -13.357 7.13221 1.00 0.00 WATR -ATOM 1605 HT HOH 363 -4.0735 -12.771 7.13221 1.00 0.00 WATR -ATOM 1606 HT HOH 363 -5.5874 -12.771 7.13221 1.00 0.00 WATR -ATOM 1607 OT HOH 364 -2.3673 -10.894 7.13221 1.00 0.00 WATR -ATOM 1608 HT HOH 364 -1.6103 -10.308 7.13221 1.00 0.00 WATR -ATOM 1609 HT HOH 364 -3.1242 -10.308 7.13221 1.00 0.00 WATR -ATOM 1610 OT HOH 365 -2.3673 -13.357 9.59542 1.00 0.00 WATR -ATOM 1611 HT HOH 365 -1.6103 -12.771 9.59542 1.00 0.00 WATR -ATOM 1612 HT HOH 365 -3.1242 -12.771 9.59542 1.00 0.00 WATR -ATOM 1613 OT HOH 366 -4.8305 -10.894 9.59542 1.00 0.00 WATR -ATOM 1614 HT HOH 366 -4.0735 -10.308 9.59542 1.00 0.00 WATR -ATOM 1615 HT HOH 366 -5.5874 -10.308 9.59542 1.00 0.00 WATR -ATOM 1616 OT HOH 367 -4.8305 -8.4312 -12.573 1.00 0.00 WATR -ATOM 1617 HT HOH 367 -4.0735 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1618 HT HOH 367 -5.5874 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1619 OT HOH 368 -2.3673 -5.9680 -12.573 1.00 0.00 WATR -ATOM 1620 HT HOH 368 -1.6103 -5.3821 -12.573 1.00 0.00 WATR -ATOM 1621 HT HOH 368 -3.1242 -5.3821 -12.573 1.00 0.00 WATR -ATOM 1622 OT HOH 369 -2.3673 -8.4312 -10.110 1.00 0.00 WATR -ATOM 1623 HT HOH 369 -1.6103 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1624 HT HOH 369 -3.1242 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1625 OT HOH 370 -4.8305 -5.9680 -10.110 1.00 0.00 WATR -ATOM 1626 HT HOH 370 -4.0735 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1627 HT HOH 370 -5.5874 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1628 OT HOH 371 -4.8305 -5.9680 9.59542 1.00 0.00 WATR -ATOM 1629 HT HOH 371 -4.0735 -5.3821 9.59542 1.00 0.00 WATR -ATOM 1630 HT HOH 371 -5.5874 -5.3821 9.59542 1.00 0.00 WATR -ATOM 1631 OT HOH 372 -4.8305 -3.5048 -12.573 1.00 0.00 WATR -ATOM 1632 HT HOH 372 -4.0735 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1633 HT HOH 372 -5.5874 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1634 OT HOH 373 -2.3673 -1.0416 -12.573 1.00 0.00 WATR -ATOM 1635 HT HOH 373 -1.6103 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1636 HT HOH 373 -3.1242 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1637 OT HOH 374 -2.3673 -3.5048 -10.110 1.00 0.00 WATR -ATOM 1638 HT HOH 374 -1.6103 -2.9189 -10.110 1.00 0.00 WATR -ATOM 1639 HT HOH 374 -3.1242 -2.9189 -10.110 1.00 0.00 WATR -ATOM 1640 OT HOH 375 -4.8305 -1.0416 -10.110 1.00 0.00 WATR -ATOM 1641 HT HOH 375 -4.0735 -0.4557 -10.110 1.00 0.00 WATR -ATOM 1642 HT HOH 375 -5.5874 -0.4557 -10.110 1.00 0.00 WATR -ATOM 1643 OT HOH 376 -4.8305 1.42160 -12.573 1.00 0.00 WATR -ATOM 1644 HT HOH 376 -4.0735 2.00748 -12.573 1.00 0.00 WATR -ATOM 1645 HT HOH 376 -5.5874 2.00748 -12.573 1.00 0.00 WATR -ATOM 1646 OT HOH 377 -2.3673 3.88480 -12.573 1.00 0.00 WATR -ATOM 1647 HT HOH 377 -1.6103 4.47069 -12.573 1.00 0.00 WATR -ATOM 1648 HT HOH 377 -3.1242 4.47069 -12.573 1.00 0.00 WATR -ATOM 1649 OT HOH 378 -4.8305 6.34801 -12.573 1.00 0.00 WATR -ATOM 1650 HT HOH 378 -4.0735 6.93389 -12.573 1.00 0.00 WATR -ATOM 1651 HT HOH 378 -5.5874 6.93389 -12.573 1.00 0.00 WATR -ATOM 1652 OT HOH 379 -2.3673 8.81121 -12.573 1.00 0.00 WATR -ATOM 1653 HT HOH 379 -1.6103 9.39710 -12.573 1.00 0.00 WATR -ATOM 1654 HT HOH 379 -3.1242 9.39710 -12.573 1.00 0.00 WATR -ATOM 1655 OT HOH 380 -2.3673 6.34801 -10.110 1.00 0.00 WATR -ATOM 1656 HT HOH 380 -1.6103 6.93389 -10.110 1.00 0.00 WATR -ATOM 1657 HT HOH 380 -3.1242 6.93389 -10.110 1.00 0.00 WATR -ATOM 1658 OT HOH 381 -4.8305 8.81121 -10.110 1.00 0.00 WATR -ATOM 1659 HT HOH 381 -4.0735 9.39710 -10.110 1.00 0.00 WATR -ATOM 1660 HT HOH 381 -5.5874 9.39710 -10.110 1.00 0.00 WATR -ATOM 1661 OT HOH 382 -2.3673 8.81121 7.13221 1.00 0.00 WATR -ATOM 1662 HT HOH 382 -1.6103 9.39710 7.13221 1.00 0.00 WATR -ATOM 1663 HT HOH 382 -3.1242 9.39710 7.13221 1.00 0.00 WATR -ATOM 1664 OT HOH 383 -2.3673 6.34801 9.59542 1.00 0.00 WATR -ATOM 1665 HT HOH 383 -1.6103 6.93389 9.59542 1.00 0.00 WATR -ATOM 1666 HT HOH 383 -3.1242 6.93389 9.59542 1.00 0.00 WATR -ATOM 1667 OT HOH 384 -4.8305 8.81121 9.59542 1.00 0.00 WATR -ATOM 1668 HT HOH 384 -4.0735 9.39710 9.59542 1.00 0.00 WATR -ATOM 1669 HT HOH 384 -5.5874 9.39710 9.59542 1.00 0.00 WATR -ATOM 1670 OT HOH 385 -4.8305 11.2744 -12.573 1.00 0.00 WATR -ATOM 1671 HT HOH 385 -4.0735 11.8603 -12.573 1.00 0.00 WATR -ATOM 1672 HT HOH 385 -5.5874 11.8603 -12.573 1.00 0.00 WATR -ATOM 1673 OT HOH 386 -2.3673 13.7376 -12.573 1.00 0.00 WATR -ATOM 1674 HT HOH 386 -1.6103 14.3235 -12.573 1.00 0.00 WATR -ATOM 1675 HT HOH 386 -3.1242 14.3235 -12.573 1.00 0.00 WATR -ATOM 1676 OT HOH 387 -2.3673 11.2744 -10.110 1.00 0.00 WATR -ATOM 1677 HT HOH 387 -1.6103 11.8603 -10.110 1.00 0.00 WATR -ATOM 1678 HT HOH 387 -3.1242 11.8603 -10.110 1.00 0.00 WATR -ATOM 1679 OT HOH 388 -4.8305 13.7376 -10.110 1.00 0.00 WATR -ATOM 1680 HT HOH 388 -4.0735 14.3235 -10.110 1.00 0.00 WATR -ATOM 1681 HT HOH 388 -5.5874 14.3235 -10.110 1.00 0.00 WATR -ATOM 1682 OT HOH 389 -2.3673 13.7376 -7.6470 1.00 0.00 WATR -ATOM 1683 HT HOH 389 -1.6103 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1684 HT HOH 389 -3.1242 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1685 OT HOH 390 -2.3673 13.7376 -2.7206 1.00 0.00 WATR -ATOM 1686 HT HOH 390 -1.6103 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1687 HT HOH 390 -3.1242 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1688 OT HOH 391 -2.3673 11.2744 -0.2573 1.00 0.00 WATR -ATOM 1689 HT HOH 391 -1.6103 11.8603 -0.2573 1.00 0.00 WATR -ATOM 1690 HT HOH 391 -3.1242 11.8603 -0.2573 1.00 0.00 WATR -ATOM 1691 OT HOH 392 -4.8305 13.7376 -0.2573 1.00 0.00 WATR -ATOM 1692 HT HOH 392 -4.0735 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1693 HT HOH 392 -5.5874 14.3235 -0.2573 1.00 0.00 WATR -ATOM 1694 OT HOH 393 -4.8305 11.2744 2.20580 1.00 0.00 WATR -ATOM 1695 HT HOH 393 -4.0735 11.8603 2.20580 1.00 0.00 WATR -ATOM 1696 HT HOH 393 -5.5874 11.8603 2.20580 1.00 0.00 WATR -ATOM 1697 OT HOH 394 -2.3673 13.7376 2.20580 1.00 0.00 WATR -ATOM 1698 HT HOH 394 -1.6103 14.3235 2.20580 1.00 0.00 WATR -ATOM 1699 HT HOH 394 -3.1242 14.3235 2.20580 1.00 0.00 WATR -ATOM 1700 OT HOH 395 -2.3673 11.2744 4.66901 1.00 0.00 WATR -ATOM 1701 HT HOH 395 -1.6103 11.8603 4.66901 1.00 0.00 WATR -ATOM 1702 HT HOH 395 -3.1242 11.8603 4.66901 1.00 0.00 WATR -ATOM 1703 OT HOH 396 -4.8305 13.7376 4.66901 1.00 0.00 WATR -ATOM 1704 HT HOH 396 -4.0735 14.3235 4.66901 1.00 0.00 WATR -ATOM 1705 HT HOH 396 -5.5874 14.3235 4.66901 1.00 0.00 WATR -ATOM 1706 OT HOH 397 -4.8305 11.2744 7.13221 1.00 0.00 WATR -ATOM 1707 HT HOH 397 -4.0735 11.8603 7.13221 1.00 0.00 WATR -ATOM 1708 HT HOH 397 -5.5874 11.8603 7.13221 1.00 0.00 WATR -ATOM 1709 OT HOH 398 -2.3673 13.7376 7.13221 1.00 0.00 WATR -ATOM 1710 HT HOH 398 -1.6103 14.3235 7.13221 1.00 0.00 WATR -ATOM 1711 HT HOH 398 -3.1242 14.3235 7.13221 1.00 0.00 WATR -ATOM 1712 OT HOH 399 -2.3673 11.2744 9.59542 1.00 0.00 WATR -ATOM 1713 HT HOH 399 -1.6103 11.8603 9.59542 1.00 0.00 WATR -ATOM 1714 HT HOH 399 -3.1242 11.8603 9.59542 1.00 0.00 WATR -ATOM 1715 OT HOH 400 -4.8305 13.7376 9.59542 1.00 0.00 WATR -ATOM 1716 HT HOH 400 -4.0735 14.3235 9.59542 1.00 0.00 WATR -ATOM 1717 HT HOH 400 -5.5874 14.3235 9.59542 1.00 0.00 WATR -ATOM 1718 OT HOH 401 0.09589 -13.357 -12.573 1.00 0.00 WATR -ATOM 1719 HT HOH 401 0.85284 -12.771 -12.573 1.00 0.00 WATR -ATOM 1720 HT HOH 401 -0.6610 -12.771 -12.573 1.00 0.00 WATR -ATOM 1721 OT HOH 402 2.55910 -10.894 -12.573 1.00 0.00 WATR -ATOM 1722 HT HOH 402 3.31605 -10.308 -12.573 1.00 0.00 WATR -ATOM 1723 HT HOH 402 1.80215 -10.308 -12.573 1.00 0.00 WATR -ATOM 1724 OT HOH 403 2.55910 -13.357 -10.110 1.00 0.00 WATR -ATOM 1725 HT HOH 403 3.31605 -12.771 -10.110 1.00 0.00 WATR -ATOM 1726 HT HOH 403 1.80215 -12.771 -10.110 1.00 0.00 WATR -ATOM 1727 OT HOH 404 0.09589 -10.894 -10.110 1.00 0.00 WATR -ATOM 1728 HT HOH 404 0.85284 -10.308 -10.110 1.00 0.00 WATR -ATOM 1729 HT HOH 404 -0.6610 -10.308 -10.110 1.00 0.00 WATR -ATOM 1730 OT HOH 405 0.09589 -13.357 -7.6470 1.00 0.00 WATR -ATOM 1731 HT HOH 405 0.85284 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1732 HT HOH 405 -0.6610 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1733 OT HOH 406 2.55910 -10.894 -7.6470 1.00 0.00 WATR -ATOM 1734 HT HOH 406 3.31605 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1735 HT HOH 406 1.80215 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1736 OT HOH 407 2.55910 -13.357 -5.1838 1.00 0.00 WATR -ATOM 1737 HT HOH 407 3.31605 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1738 HT HOH 407 1.80215 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1739 OT HOH 408 0.09589 -10.894 -5.1838 1.00 0.00 WATR -ATOM 1740 HT HOH 408 0.85284 -10.308 -5.1838 1.00 0.00 WATR -ATOM 1741 HT HOH 408 -0.6610 -10.308 -5.1838 1.00 0.00 WATR -ATOM 1742 OT HOH 409 0.09589 -13.357 -2.7206 1.00 0.00 WATR -ATOM 1743 HT HOH 409 0.85284 -12.771 -2.7206 1.00 0.00 WATR -ATOM 1744 HT HOH 409 -0.6610 -12.771 -2.7206 1.00 0.00 WATR -ATOM 1745 OT HOH 410 2.55910 -10.894 -2.7206 1.00 0.00 WATR -ATOM 1746 HT HOH 410 3.31605 -10.308 -2.7206 1.00 0.00 WATR -ATOM 1747 HT HOH 410 1.80215 -10.308 -2.7206 1.00 0.00 WATR -ATOM 1748 OT HOH 411 2.55910 -13.357 -0.2573 1.00 0.00 WATR -ATOM 1749 HT HOH 411 3.31605 -12.771 -0.2573 1.00 0.00 WATR -ATOM 1750 HT HOH 411 1.80215 -12.771 -0.2573 1.00 0.00 WATR -ATOM 1751 OT HOH 412 0.09589 -13.357 2.20580 1.00 0.00 WATR -ATOM 1752 HT HOH 412 0.85284 -12.771 2.20580 1.00 0.00 WATR -ATOM 1753 HT HOH 412 -0.6610 -12.771 2.20580 1.00 0.00 WATR -ATOM 1754 OT HOH 413 2.55910 -10.894 2.20580 1.00 0.00 WATR -ATOM 1755 HT HOH 413 3.31605 -10.308 2.20580 1.00 0.00 WATR -ATOM 1756 HT HOH 413 1.80215 -10.308 2.20580 1.00 0.00 WATR -ATOM 1757 OT HOH 414 2.55910 -13.357 4.66901 1.00 0.00 WATR -ATOM 1758 HT HOH 414 3.31605 -12.771 4.66901 1.00 0.00 WATR -ATOM 1759 HT HOH 414 1.80215 -12.771 4.66901 1.00 0.00 WATR -ATOM 1760 OT HOH 415 0.09589 -10.894 4.66901 1.00 0.00 WATR -ATOM 1761 HT HOH 415 0.85284 -10.308 4.66901 1.00 0.00 WATR -ATOM 1762 HT HOH 415 -0.6610 -10.308 4.66901 1.00 0.00 WATR -ATOM 1763 OT HOH 416 0.09589 -13.357 7.13221 1.00 0.00 WATR -ATOM 1764 HT HOH 416 0.85284 -12.771 7.13221 1.00 0.00 WATR -ATOM 1765 HT HOH 416 -0.6610 -12.771 7.13221 1.00 0.00 WATR -ATOM 1766 OT HOH 417 2.55910 -10.894 7.13221 1.00 0.00 WATR -ATOM 1767 HT HOH 417 3.31605 -10.308 7.13221 1.00 0.00 WATR -ATOM 1768 HT HOH 417 1.80215 -10.308 7.13221 1.00 0.00 WATR -ATOM 1769 OT HOH 418 2.55910 -13.357 9.59542 1.00 0.00 WATR -ATOM 1770 HT HOH 418 3.31605 -12.771 9.59542 1.00 0.00 WATR -ATOM 1771 HT HOH 418 1.80215 -12.771 9.59542 1.00 0.00 WATR -ATOM 1772 OT HOH 419 0.09589 -10.894 9.59542 1.00 0.00 WATR -ATOM 1773 HT HOH 419 0.85284 -10.308 9.59542 1.00 0.00 WATR -ATOM 1774 HT HOH 419 -0.6610 -10.308 9.59542 1.00 0.00 WATR -ATOM 1775 OT HOH 420 0.09589 -8.4312 -12.573 1.00 0.00 WATR -ATOM 1776 HT HOH 420 0.85284 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1777 HT HOH 420 -0.6610 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1778 OT HOH 421 2.55910 -8.4312 -10.110 1.00 0.00 WATR -ATOM 1779 HT HOH 421 3.31605 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1780 HT HOH 421 1.80215 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1781 OT HOH 422 2.55910 -8.4312 -5.1838 1.00 0.00 WATR -ATOM 1782 HT HOH 422 3.31605 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 1783 HT HOH 422 1.80215 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 1784 OT HOH 423 0.09589 -3.5048 -12.573 1.00 0.00 WATR -ATOM 1785 HT HOH 423 0.85284 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1786 HT HOH 423 -0.6610 -2.9189 -12.573 1.00 0.00 WATR -ATOM 1787 OT HOH 424 2.55910 -1.0416 -12.573 1.00 0.00 WATR -ATOM 1788 HT HOH 424 3.31605 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1789 HT HOH 424 1.80215 -0.4557 -12.573 1.00 0.00 WATR -ATOM 1790 OT HOH 425 0.09589 1.42160 -12.573 1.00 0.00 WATR -ATOM 1791 HT HOH 425 0.85284 2.00748 -12.573 1.00 0.00 WATR -ATOM 1792 HT HOH 425 -0.6610 2.00748 -12.573 1.00 0.00 WATR -ATOM 1793 OT HOH 426 2.55910 3.88480 -12.573 1.00 0.00 WATR -ATOM 1794 HT HOH 426 3.31605 4.47069 -12.573 1.00 0.00 WATR -ATOM 1795 HT HOH 426 1.80215 4.47069 -12.573 1.00 0.00 WATR -ATOM 1796 OT HOH 427 0.09589 3.88480 -10.110 1.00 0.00 WATR -ATOM 1797 HT HOH 427 0.85284 4.47069 -10.110 1.00 0.00 WATR -ATOM 1798 HT HOH 427 -0.6610 4.47069 -10.110 1.00 0.00 WATR -ATOM 1799 OT HOH 428 0.09589 3.88480 9.59542 1.00 0.00 WATR -ATOM 1800 HT HOH 428 0.85284 4.47069 9.59542 1.00 0.00 WATR -ATOM 1801 HT HOH 428 -0.6610 4.47069 9.59542 1.00 0.00 WATR -ATOM 1802 OT HOH 429 0.09589 6.34801 -12.573 1.00 0.00 WATR -ATOM 1803 HT HOH 429 0.85284 6.93389 -12.573 1.00 0.00 WATR -ATOM 1804 HT HOH 429 -0.6610 6.93389 -12.573 1.00 0.00 WATR -ATOM 1805 OT HOH 430 2.55910 8.81121 -12.573 1.00 0.00 WATR -ATOM 1806 HT HOH 430 3.31605 9.39710 -12.573 1.00 0.00 WATR -ATOM 1807 HT HOH 430 1.80215 9.39710 -12.573 1.00 0.00 WATR -ATOM 1808 OT HOH 431 2.55910 6.34801 -10.110 1.00 0.00 WATR -ATOM 1809 HT HOH 431 3.31605 6.93389 -10.110 1.00 0.00 WATR -ATOM 1810 HT HOH 431 1.80215 6.93389 -10.110 1.00 0.00 WATR -ATOM 1811 OT HOH 432 0.09589 8.81121 -10.110 1.00 0.00 WATR -ATOM 1812 HT HOH 432 0.85284 9.39710 -10.110 1.00 0.00 WATR -ATOM 1813 HT HOH 432 -0.6610 9.39710 -10.110 1.00 0.00 WATR -ATOM 1814 OT HOH 433 0.09589 8.81121 4.66901 1.00 0.00 WATR -ATOM 1815 HT HOH 433 0.85284 9.39710 4.66901 1.00 0.00 WATR -ATOM 1816 HT HOH 433 -0.6610 9.39710 4.66901 1.00 0.00 WATR -ATOM 1817 OT HOH 434 2.55910 8.81121 7.13221 1.00 0.00 WATR -ATOM 1818 HT HOH 434 3.31605 9.39710 7.13221 1.00 0.00 WATR -ATOM 1819 HT HOH 434 1.80215 9.39710 7.13221 1.00 0.00 WATR -ATOM 1820 OT HOH 435 0.09589 8.81121 9.59542 1.00 0.00 WATR -ATOM 1821 HT HOH 435 0.85284 9.39710 9.59542 1.00 0.00 WATR -ATOM 1822 HT HOH 435 -0.6610 9.39710 9.59542 1.00 0.00 WATR -ATOM 1823 OT HOH 436 0.09589 11.2744 -12.573 1.00 0.00 WATR -ATOM 1824 HT HOH 436 0.85284 11.8603 -12.573 1.00 0.00 WATR -ATOM 1825 HT HOH 436 -0.6610 11.8603 -12.573 1.00 0.00 WATR -ATOM 1826 OT HOH 437 2.55910 13.7376 -12.573 1.00 0.00 WATR -ATOM 1827 HT HOH 437 3.31605 14.3235 -12.573 1.00 0.00 WATR -ATOM 1828 HT HOH 437 1.80215 14.3235 -12.573 1.00 0.00 WATR -ATOM 1829 OT HOH 438 2.55910 11.2744 -10.110 1.00 0.00 WATR -ATOM 1830 HT HOH 438 3.31605 11.8603 -10.110 1.00 0.00 WATR -ATOM 1831 HT HOH 438 1.80215 11.8603 -10.110 1.00 0.00 WATR -ATOM 1832 OT HOH 439 0.09589 13.7376 -10.110 1.00 0.00 WATR -ATOM 1833 HT HOH 439 0.85284 14.3235 -10.110 1.00 0.00 WATR -ATOM 1834 HT HOH 439 -0.6610 14.3235 -10.110 1.00 0.00 WATR -ATOM 1835 OT HOH 440 0.09589 11.2744 -7.6470 1.00 0.00 WATR -ATOM 1836 HT HOH 440 0.85284 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1837 HT HOH 440 -0.6610 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1838 OT HOH 441 2.55910 13.7376 -7.6470 1.00 0.00 WATR -ATOM 1839 HT HOH 441 3.31605 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1840 HT HOH 441 1.80215 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1841 OT HOH 442 2.55910 11.2744 -5.1838 1.00 0.00 WATR -ATOM 1842 HT HOH 442 3.31605 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1843 HT HOH 442 1.80215 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1844 OT HOH 443 0.09589 13.7376 -5.1838 1.00 0.00 WATR -ATOM 1845 HT HOH 443 0.85284 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1846 HT HOH 443 -0.6610 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1847 OT HOH 444 2.55910 13.7376 -2.7206 1.00 0.00 WATR -ATOM 1848 HT HOH 444 3.31605 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1849 HT HOH 444 1.80215 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1850 OT HOH 445 0.09589 13.7376 4.66901 1.00 0.00 WATR -ATOM 1851 HT HOH 445 0.85284 14.3235 4.66901 1.00 0.00 WATR -ATOM 1852 HT HOH 445 -0.6610 14.3235 4.66901 1.00 0.00 WATR -ATOM 1853 OT HOH 446 0.09589 11.2744 7.13221 1.00 0.00 WATR -ATOM 1854 HT HOH 446 0.85284 11.8603 7.13221 1.00 0.00 WATR -ATOM 1855 HT HOH 446 -0.6610 11.8603 7.13221 1.00 0.00 WATR -ATOM 1856 OT HOH 447 2.55910 13.7376 7.13221 1.00 0.00 WATR -ATOM 1857 HT HOH 447 3.31605 14.3235 7.13221 1.00 0.00 WATR -ATOM 1858 HT HOH 447 1.80215 14.3235 7.13221 1.00 0.00 WATR -ATOM 1859 OT HOH 448 2.55910 11.2744 9.59542 1.00 0.00 WATR -ATOM 1860 HT HOH 448 3.31605 11.8603 9.59542 1.00 0.00 WATR -ATOM 1861 HT HOH 448 1.80215 11.8603 9.59542 1.00 0.00 WATR -ATOM 1862 OT HOH 449 0.09589 13.7376 9.59542 1.00 0.00 WATR -ATOM 1863 HT HOH 449 0.85284 14.3235 9.59542 1.00 0.00 WATR -ATOM 1864 HT HOH 449 -0.6610 14.3235 9.59542 1.00 0.00 WATR -ATOM 1865 OT HOH 450 5.02230 -13.357 -12.573 1.00 0.00 WATR -ATOM 1866 HT HOH 450 5.77925 -12.771 -12.573 1.00 0.00 WATR -ATOM 1867 HT HOH 450 4.26535 -12.771 -12.573 1.00 0.00 WATR -ATOM 1868 OT HOH 451 7.48551 -10.894 -12.573 1.00 0.00 WATR -ATOM 1869 HT HOH 451 8.24246 -10.308 -12.573 1.00 0.00 WATR -ATOM 1870 HT HOH 451 6.72856 -10.308 -12.573 1.00 0.00 WATR -ATOM 1871 OT HOH 452 7.48551 -13.357 -10.110 1.00 0.00 WATR -ATOM 1872 HT HOH 452 8.24246 -12.771 -10.110 1.00 0.00 WATR -ATOM 1873 HT HOH 452 6.72856 -12.771 -10.110 1.00 0.00 WATR -ATOM 1874 OT HOH 453 5.02230 -10.894 -10.110 1.00 0.00 WATR -ATOM 1875 HT HOH 453 5.77925 -10.308 -10.110 1.00 0.00 WATR -ATOM 1876 HT HOH 453 4.26535 -10.308 -10.110 1.00 0.00 WATR -ATOM 1877 OT HOH 454 5.02230 -13.357 -7.6470 1.00 0.00 WATR -ATOM 1878 HT HOH 454 5.77925 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1879 HT HOH 454 4.26535 -12.771 -7.6470 1.00 0.00 WATR -ATOM 1880 OT HOH 455 7.48551 -10.894 -7.6470 1.00 0.00 WATR -ATOM 1881 HT HOH 455 8.24246 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1882 HT HOH 455 6.72856 -10.308 -7.6470 1.00 0.00 WATR -ATOM 1883 OT HOH 456 7.48551 -13.357 -5.1838 1.00 0.00 WATR -ATOM 1884 HT HOH 456 8.24246 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1885 HT HOH 456 6.72856 -12.771 -5.1838 1.00 0.00 WATR -ATOM 1886 OT HOH 457 5.02230 -10.894 -5.1838 1.00 0.00 WATR -ATOM 1887 HT HOH 457 5.77925 -10.308 -5.1838 1.00 0.00 WATR -ATOM 1888 HT HOH 457 4.26535 -10.308 -5.1838 1.00 0.00 WATR -ATOM 1889 OT HOH 458 5.02230 -13.357 -2.7206 1.00 0.00 WATR -ATOM 1890 HT HOH 458 5.77925 -12.771 -2.7206 1.00 0.00 WATR -ATOM 1891 HT HOH 458 4.26535 -12.771 -2.7206 1.00 0.00 WATR -ATOM 1892 OT HOH 459 7.48551 -10.894 -2.7206 1.00 0.00 WATR -ATOM 1893 HT HOH 459 8.24246 -10.308 -2.7206 1.00 0.00 WATR -ATOM 1894 HT HOH 459 6.72856 -10.308 -2.7206 1.00 0.00 WATR -ATOM 1895 OT HOH 460 7.48551 -13.357 -0.2573 1.00 0.00 WATR -ATOM 1896 HT HOH 460 8.24246 -12.771 -0.2573 1.00 0.00 WATR -ATOM 1897 HT HOH 460 6.72856 -12.771 -0.2573 1.00 0.00 WATR -ATOM 1898 OT HOH 461 5.02230 -13.357 2.20580 1.00 0.00 WATR -ATOM 1899 HT HOH 461 5.77925 -12.771 2.20580 1.00 0.00 WATR -ATOM 1900 HT HOH 461 4.26535 -12.771 2.20580 1.00 0.00 WATR -ATOM 1901 OT HOH 462 7.48551 -10.894 2.20580 1.00 0.00 WATR -ATOM 1902 HT HOH 462 8.24246 -10.308 2.20580 1.00 0.00 WATR -ATOM 1903 HT HOH 462 6.72856 -10.308 2.20580 1.00 0.00 WATR -ATOM 1904 OT HOH 463 7.48551 -13.357 4.66901 1.00 0.00 WATR -ATOM 1905 HT HOH 463 8.24246 -12.771 4.66901 1.00 0.00 WATR -ATOM 1906 HT HOH 463 6.72856 -12.771 4.66901 1.00 0.00 WATR -ATOM 1907 OT HOH 464 5.02230 -10.894 4.66901 1.00 0.00 WATR -ATOM 1908 HT HOH 464 5.77925 -10.308 4.66901 1.00 0.00 WATR -ATOM 1909 HT HOH 464 4.26535 -10.308 4.66901 1.00 0.00 WATR -ATOM 1910 OT HOH 465 5.02230 -13.357 7.13221 1.00 0.00 WATR -ATOM 1911 HT HOH 465 5.77925 -12.771 7.13221 1.00 0.00 WATR -ATOM 1912 HT HOH 465 4.26535 -12.771 7.13221 1.00 0.00 WATR -ATOM 1913 OT HOH 466 7.48551 -10.894 7.13221 1.00 0.00 WATR -ATOM 1914 HT HOH 466 8.24246 -10.308 7.13221 1.00 0.00 WATR -ATOM 1915 HT HOH 466 6.72856 -10.308 7.13221 1.00 0.00 WATR -ATOM 1916 OT HOH 467 7.48551 -13.357 9.59542 1.00 0.00 WATR -ATOM 1917 HT HOH 467 8.24246 -12.771 9.59542 1.00 0.00 WATR -ATOM 1918 HT HOH 467 6.72856 -12.771 9.59542 1.00 0.00 WATR -ATOM 1919 OT HOH 468 5.02230 -10.894 9.59542 1.00 0.00 WATR -ATOM 1920 HT HOH 468 5.77925 -10.308 9.59542 1.00 0.00 WATR -ATOM 1921 HT HOH 468 4.26535 -10.308 9.59542 1.00 0.00 WATR -ATOM 1922 OT HOH 469 5.02230 -8.4312 -12.573 1.00 0.00 WATR -ATOM 1923 HT HOH 469 5.77925 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1924 HT HOH 469 4.26535 -7.8453 -12.573 1.00 0.00 WATR -ATOM 1925 OT HOH 470 7.48551 -8.4312 -10.110 1.00 0.00 WATR -ATOM 1926 HT HOH 470 8.24246 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1927 HT HOH 470 6.72856 -7.8453 -10.110 1.00 0.00 WATR -ATOM 1928 OT HOH 471 5.02230 -5.9680 -10.110 1.00 0.00 WATR -ATOM 1929 HT HOH 471 5.77925 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1930 HT HOH 471 4.26535 -5.3821 -10.110 1.00 0.00 WATR -ATOM 1931 OT HOH 472 5.02230 -8.4312 -7.6470 1.00 0.00 WATR -ATOM 1932 HT HOH 472 5.77925 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 1933 HT HOH 472 4.26535 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 1934 OT HOH 473 7.48551 -8.4312 9.59542 1.00 0.00 WATR -ATOM 1935 HT HOH 473 8.24246 -7.8453 9.59542 1.00 0.00 WATR -ATOM 1936 HT HOH 473 6.72856 -7.8453 9.59542 1.00 0.00 WATR -ATOM 1937 OT HOH 474 5.02230 -1.0416 9.59542 1.00 0.00 WATR -ATOM 1938 HT HOH 474 5.77925 -0.4557 9.59542 1.00 0.00 WATR -ATOM 1939 HT HOH 474 4.26535 -0.4557 9.59542 1.00 0.00 WATR -ATOM 1940 OT HOH 475 5.02230 1.42160 -12.573 1.00 0.00 WATR -ATOM 1941 HT HOH 475 5.77925 2.00748 -12.573 1.00 0.00 WATR -ATOM 1942 HT HOH 475 4.26535 2.00748 -12.573 1.00 0.00 WATR -ATOM 1943 OT HOH 476 7.48551 3.88480 -12.573 1.00 0.00 WATR -ATOM 1944 HT HOH 476 8.24246 4.47069 -12.573 1.00 0.00 WATR -ATOM 1945 HT HOH 476 6.72856 4.47069 -12.573 1.00 0.00 WATR -ATOM 1946 OT HOH 477 7.48551 1.42160 9.59542 1.00 0.00 WATR -ATOM 1947 HT HOH 477 8.24246 2.00748 9.59542 1.00 0.00 WATR -ATOM 1948 HT HOH 477 6.72856 2.00748 9.59542 1.00 0.00 WATR -ATOM 1949 OT HOH 478 5.02230 6.34801 -12.573 1.00 0.00 WATR -ATOM 1950 HT HOH 478 5.77925 6.93389 -12.573 1.00 0.00 WATR -ATOM 1951 HT HOH 478 4.26535 6.93389 -12.573 1.00 0.00 WATR -ATOM 1952 OT HOH 479 7.48551 8.81121 -12.573 1.00 0.00 WATR -ATOM 1953 HT HOH 479 8.24246 9.39710 -12.573 1.00 0.00 WATR -ATOM 1954 HT HOH 479 6.72856 9.39710 -12.573 1.00 0.00 WATR -ATOM 1955 OT HOH 480 7.48551 6.34801 -10.110 1.00 0.00 WATR -ATOM 1956 HT HOH 480 8.24246 6.93389 -10.110 1.00 0.00 WATR -ATOM 1957 HT HOH 480 6.72856 6.93389 -10.110 1.00 0.00 WATR -ATOM 1958 OT HOH 481 5.02230 8.81121 -10.110 1.00 0.00 WATR -ATOM 1959 HT HOH 481 5.77925 9.39710 -10.110 1.00 0.00 WATR -ATOM 1960 HT HOH 481 4.26535 9.39710 -10.110 1.00 0.00 WATR -ATOM 1961 OT HOH 482 7.48551 8.81121 -7.6470 1.00 0.00 WATR -ATOM 1962 HT HOH 482 8.24246 9.39710 -7.6470 1.00 0.00 WATR -ATOM 1963 HT HOH 482 6.72856 9.39710 -7.6470 1.00 0.00 WATR -ATOM 1964 OT HOH 483 7.48551 6.34801 9.59542 1.00 0.00 WATR -ATOM 1965 HT HOH 483 8.24246 6.93389 9.59542 1.00 0.00 WATR -ATOM 1966 HT HOH 483 6.72856 6.93389 9.59542 1.00 0.00 WATR -ATOM 1967 OT HOH 484 5.02230 8.81121 9.59542 1.00 0.00 WATR -ATOM 1968 HT HOH 484 5.77925 9.39710 9.59542 1.00 0.00 WATR -ATOM 1969 HT HOH 484 4.26535 9.39710 9.59542 1.00 0.00 WATR -ATOM 1970 OT HOH 485 5.02230 11.2744 -12.573 1.00 0.00 WATR -ATOM 1971 HT HOH 485 5.77925 11.8603 -12.573 1.00 0.00 WATR -ATOM 1972 HT HOH 485 4.26535 11.8603 -12.573 1.00 0.00 WATR -ATOM 1973 OT HOH 486 7.48551 13.7376 -12.573 1.00 0.00 WATR -ATOM 1974 HT HOH 486 8.24246 14.3235 -12.573 1.00 0.00 WATR -ATOM 1975 HT HOH 486 6.72856 14.3235 -12.573 1.00 0.00 WATR -ATOM 1976 OT HOH 487 7.48551 11.2744 -10.110 1.00 0.00 WATR -ATOM 1977 HT HOH 487 8.24246 11.8603 -10.110 1.00 0.00 WATR -ATOM 1978 HT HOH 487 6.72856 11.8603 -10.110 1.00 0.00 WATR -ATOM 1979 OT HOH 488 5.02230 13.7376 -10.110 1.00 0.00 WATR -ATOM 1980 HT HOH 488 5.77925 14.3235 -10.110 1.00 0.00 WATR -ATOM 1981 HT HOH 488 4.26535 14.3235 -10.110 1.00 0.00 WATR -ATOM 1982 OT HOH 489 5.02230 11.2744 -7.6470 1.00 0.00 WATR -ATOM 1983 HT HOH 489 5.77925 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1984 HT HOH 489 4.26535 11.8603 -7.6470 1.00 0.00 WATR -ATOM 1985 OT HOH 490 7.48551 13.7376 -7.6470 1.00 0.00 WATR -ATOM 1986 HT HOH 490 8.24246 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1987 HT HOH 490 6.72856 14.3235 -7.6470 1.00 0.00 WATR -ATOM 1988 OT HOH 491 7.48551 11.2744 -5.1838 1.00 0.00 WATR -ATOM 1989 HT HOH 491 8.24246 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1990 HT HOH 491 6.72856 11.8603 -5.1838 1.00 0.00 WATR -ATOM 1991 OT HOH 492 5.02230 13.7376 -5.1838 1.00 0.00 WATR -ATOM 1992 HT HOH 492 5.77925 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1993 HT HOH 492 4.26535 14.3235 -5.1838 1.00 0.00 WATR -ATOM 1994 OT HOH 493 5.02230 11.2744 -2.7206 1.00 0.00 WATR -ATOM 1995 HT HOH 493 5.77925 11.8603 -2.7206 1.00 0.00 WATR -ATOM 1996 HT HOH 493 4.26535 11.8603 -2.7206 1.00 0.00 WATR -ATOM 1997 OT HOH 494 7.48551 13.7376 -2.7206 1.00 0.00 WATR -ATOM 1998 HT HOH 494 8.24246 14.3235 -2.7206 1.00 0.00 WATR -ATOM 1999 HT HOH 494 6.72856 14.3235 -2.7206 1.00 0.00 WATR -ATOM 2000 OT HOH 495 7.48551 13.7376 2.20580 1.00 0.00 WATR -ATOM 2001 HT HOH 495 8.24246 14.3235 2.20580 1.00 0.00 WATR -ATOM 2002 HT HOH 495 6.72856 14.3235 2.20580 1.00 0.00 WATR -ATOM 2003 OT HOH 496 5.02230 13.7376 4.66901 1.00 0.00 WATR -ATOM 2004 HT HOH 496 5.77925 14.3235 4.66901 1.00 0.00 WATR -ATOM 2005 HT HOH 496 4.26535 14.3235 4.66901 1.00 0.00 WATR -ATOM 2006 SOD ION 497 7.48551 13.7376 7.13221 1.00 0.00 SALT -ATOM 2007 OT HOH 498 7.48551 11.2744 9.59542 1.00 0.00 WATR -ATOM 2008 HT HOH 498 8.24246 11.8603 9.59542 1.00 0.00 WATR -ATOM 2009 HT HOH 498 6.72856 11.8603 9.59542 1.00 0.00 WATR -ATOM 2010 OT HOH 499 5.02230 13.7376 9.59542 1.00 0.00 WATR -ATOM 2011 HT HOH 499 5.77925 14.3235 9.59542 1.00 0.00 WATR -ATOM 2012 HT HOH 499 4.26535 14.3235 9.59542 1.00 0.00 WATR -ATOM 2013 OT HOH 500 9.94871 -13.357 -12.573 1.00 0.00 WATR -ATOM 2014 HT HOH 500 10.7056 -12.771 -12.573 1.00 0.00 WATR -ATOM 2015 HT HOH 500 9.19176 -12.771 -12.573 1.00 0.00 WATR -ATOM 2016 OT HOH 501 12.4119 -10.894 -12.573 1.00 0.00 WATR -ATOM 2017 HT HOH 501 13.1688 -10.308 -12.573 1.00 0.00 WATR -ATOM 2018 HT HOH 501 11.6549 -10.308 -12.573 1.00 0.00 WATR -ATOM 2019 OT HOH 502 12.4119 -13.357 -10.110 1.00 0.00 WATR -ATOM 2020 HT HOH 502 13.1688 -12.771 -10.110 1.00 0.00 WATR -ATOM 2021 HT HOH 502 11.6549 -12.771 -10.110 1.00 0.00 WATR -ATOM 2022 OT HOH 503 9.94871 -10.894 -10.110 1.00 0.00 WATR -ATOM 2023 HT HOH 503 10.7056 -10.308 -10.110 1.00 0.00 WATR -ATOM 2024 HT HOH 503 9.19176 -10.308 -10.110 1.00 0.00 WATR -ATOM 2025 OT HOH 504 9.94871 -13.357 -7.6470 1.00 0.00 WATR -ATOM 2026 HT HOH 504 10.7056 -12.771 -7.6470 1.00 0.00 WATR -ATOM 2027 HT HOH 504 9.19176 -12.771 -7.6470 1.00 0.00 WATR -ATOM 2028 OT HOH 505 12.4119 -10.894 -7.6470 1.00 0.00 WATR -ATOM 2029 HT HOH 505 13.1688 -10.308 -7.6470 1.00 0.00 WATR -ATOM 2030 HT HOH 505 11.6549 -10.308 -7.6470 1.00 0.00 WATR -ATOM 2031 OT HOH 506 12.4119 -13.357 -5.1838 1.00 0.00 WATR -ATOM 2032 HT HOH 506 13.1688 -12.771 -5.1838 1.00 0.00 WATR -ATOM 2033 HT HOH 506 11.6549 -12.771 -5.1838 1.00 0.00 WATR -ATOM 2034 OT HOH 507 9.94871 -10.894 -5.1838 1.00 0.00 WATR -ATOM 2035 HT HOH 507 10.7056 -10.308 -5.1838 1.00 0.00 WATR -ATOM 2036 HT HOH 507 9.19176 -10.308 -5.1838 1.00 0.00 WATR -ATOM 2037 OT HOH 508 9.94871 -13.357 -2.7206 1.00 0.00 WATR -ATOM 2038 HT HOH 508 10.7056 -12.771 -2.7206 1.00 0.00 WATR -ATOM 2039 HT HOH 508 9.19176 -12.771 -2.7206 1.00 0.00 WATR -ATOM 2040 OT HOH 509 12.4119 -10.894 -2.7206 1.00 0.00 WATR -ATOM 2041 HT HOH 509 13.1688 -10.308 -2.7206 1.00 0.00 WATR -ATOM 2042 HT HOH 509 11.6549 -10.308 -2.7206 1.00 0.00 WATR -ATOM 2043 OT HOH 510 12.4119 -13.357 -0.2573 1.00 0.00 WATR -ATOM 2044 HT HOH 510 13.1688 -12.771 -0.2573 1.00 0.00 WATR -ATOM 2045 HT HOH 510 11.6549 -12.771 -0.2573 1.00 0.00 WATR -ATOM 2046 OT HOH 511 9.94871 -10.894 -0.2573 1.00 0.00 WATR -ATOM 2047 HT HOH 511 10.7056 -10.308 -0.2573 1.00 0.00 WATR -ATOM 2048 HT HOH 511 9.19176 -10.308 -0.2573 1.00 0.00 WATR -ATOM 2049 OT HOH 512 9.94871 -13.357 2.20580 1.00 0.00 WATR -ATOM 2050 HT HOH 512 10.7056 -12.771 2.20580 1.00 0.00 WATR -ATOM 2051 HT HOH 512 9.19176 -12.771 2.20580 1.00 0.00 WATR -ATOM 2052 OT HOH 513 12.4119 -10.894 2.20580 1.00 0.00 WATR -ATOM 2053 HT HOH 513 13.1688 -10.308 2.20580 1.00 0.00 WATR -ATOM 2054 HT HOH 513 11.6549 -10.308 2.20580 1.00 0.00 WATR -ATOM 2055 OT HOH 514 12.4119 -13.357 4.66901 1.00 0.00 WATR -ATOM 2056 HT HOH 514 13.1688 -12.771 4.66901 1.00 0.00 WATR -ATOM 2057 HT HOH 514 11.6549 -12.771 4.66901 1.00 0.00 WATR -ATOM 2058 OT HOH 515 9.94871 -10.894 4.66901 1.00 0.00 WATR -ATOM 2059 HT HOH 515 10.7056 -10.308 4.66901 1.00 0.00 WATR -ATOM 2060 HT HOH 515 9.19176 -10.308 4.66901 1.00 0.00 WATR -ATOM 2061 OT HOH 516 9.94871 -13.357 7.13221 1.00 0.00 WATR -ATOM 2062 HT HOH 516 10.7056 -12.771 7.13221 1.00 0.00 WATR -ATOM 2063 HT HOH 516 9.19176 -12.771 7.13221 1.00 0.00 WATR -ATOM 2064 OT HOH 517 12.4119 -10.894 7.13221 1.00 0.00 WATR -ATOM 2065 HT HOH 517 13.1688 -10.308 7.13221 1.00 0.00 WATR -ATOM 2066 HT HOH 517 11.6549 -10.308 7.13221 1.00 0.00 WATR -ATOM 2067 OT HOH 518 12.4119 -13.357 9.59542 1.00 0.00 WATR -ATOM 2068 HT HOH 518 13.1688 -12.771 9.59542 1.00 0.00 WATR -ATOM 2069 HT HOH 518 11.6549 -12.771 9.59542 1.00 0.00 WATR -ATOM 2070 OT HOH 519 9.94871 -10.894 9.59542 1.00 0.00 WATR -ATOM 2071 HT HOH 519 10.7056 -10.308 9.59542 1.00 0.00 WATR -ATOM 2072 HT HOH 519 9.19176 -10.308 9.59542 1.00 0.00 WATR -ATOM 2073 OT HOH 520 9.94871 -8.4312 -12.573 1.00 0.00 WATR -ATOM 2074 HT HOH 520 10.7056 -7.8453 -12.573 1.00 0.00 WATR -ATOM 2075 HT HOH 520 9.19176 -7.8453 -12.573 1.00 0.00 WATR -ATOM 2076 OT HOH 521 12.4119 -5.9680 -12.573 1.00 0.00 WATR -ATOM 2077 HT HOH 521 13.1688 -5.3821 -12.573 1.00 0.00 WATR -ATOM 2078 HT HOH 521 11.6549 -5.3821 -12.573 1.00 0.00 WATR -ATOM 2079 OT HOH 522 12.4119 -8.4312 -10.110 1.00 0.00 WATR -ATOM 2080 HT HOH 522 13.1688 -7.8453 -10.110 1.00 0.00 WATR -ATOM 2081 HT HOH 522 11.6549 -7.8453 -10.110 1.00 0.00 WATR -ATOM 2082 OT HOH 523 9.94871 -5.9680 -10.110 1.00 0.00 WATR -ATOM 2083 HT HOH 523 10.7056 -5.3821 -10.110 1.00 0.00 WATR -ATOM 2084 HT HOH 523 9.19176 -5.3821 -10.110 1.00 0.00 WATR -ATOM 2085 OT HOH 524 9.94871 -8.4312 -7.6470 1.00 0.00 WATR -ATOM 2086 HT HOH 524 10.7056 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 2087 HT HOH 524 9.19176 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 2088 OT HOH 525 12.4119 -5.9680 -7.6470 1.00 0.00 WATR -ATOM 2089 HT HOH 525 13.1688 -5.3821 -7.6470 1.00 0.00 WATR -ATOM 2090 HT HOH 525 11.6549 -5.3821 -7.6470 1.00 0.00 WATR -ATOM 2091 OT HOH 526 12.4119 -8.4312 -5.1838 1.00 0.00 WATR -ATOM 2092 HT HOH 526 13.1688 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 2093 HT HOH 526 11.6549 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 2094 OT HOH 527 12.4119 -8.4312 9.59542 1.00 0.00 WATR -ATOM 2095 HT HOH 527 13.1688 -7.8453 9.59542 1.00 0.00 WATR -ATOM 2096 HT HOH 527 11.6549 -7.8453 9.59542 1.00 0.00 WATR -ATOM 2097 OT HOH 528 9.94871 -5.9680 9.59542 1.00 0.00 WATR -ATOM 2098 HT HOH 528 10.7056 -5.3821 9.59542 1.00 0.00 WATR -ATOM 2099 HT HOH 528 9.19176 -5.3821 9.59542 1.00 0.00 WATR -ATOM 2100 OT HOH 529 9.94871 -3.5048 -12.573 1.00 0.00 WATR -ATOM 2101 HT HOH 529 10.7056 -2.9189 -12.573 1.00 0.00 WATR -ATOM 2102 HT HOH 529 9.19176 -2.9189 -12.573 1.00 0.00 WATR -ATOM 2103 OT HOH 530 12.4119 -1.0416 -12.573 1.00 0.00 WATR -ATOM 2104 HT HOH 530 13.1688 -0.4557 -12.573 1.00 0.00 WATR -ATOM 2105 HT HOH 530 11.6549 -0.4557 -12.573 1.00 0.00 WATR -ATOM 2106 OT HOH 531 12.4119 -3.5048 -10.110 1.00 0.00 WATR -ATOM 2107 HT HOH 531 13.1688 -2.9189 -10.110 1.00 0.00 WATR -ATOM 2108 HT HOH 531 11.6549 -2.9189 -10.110 1.00 0.00 WATR -ATOM 2109 OT HOH 532 9.94871 1.42160 -12.573 1.00 0.00 WATR -ATOM 2110 HT HOH 532 10.7056 2.00748 -12.573 1.00 0.00 WATR -ATOM 2111 HT HOH 532 9.19176 2.00748 -12.573 1.00 0.00 WATR -ATOM 2112 OT HOH 533 12.4119 3.88480 -12.573 1.00 0.00 WATR -ATOM 2113 HT HOH 533 13.1688 4.47069 -12.573 1.00 0.00 WATR -ATOM 2114 HT HOH 533 11.6549 4.47069 -12.573 1.00 0.00 WATR -ATOM 2115 OT HOH 534 12.4119 1.42160 -10.110 1.00 0.00 WATR -ATOM 2116 HT HOH 534 13.1688 2.00748 -10.110 1.00 0.00 WATR -ATOM 2117 HT HOH 534 11.6549 2.00748 -10.110 1.00 0.00 WATR -ATOM 2118 OT HOH 535 9.94871 3.88480 -10.110 1.00 0.00 WATR -ATOM 2119 HT HOH 535 10.7056 4.47069 -10.110 1.00 0.00 WATR -ATOM 2120 HT HOH 535 9.19176 4.47069 -10.110 1.00 0.00 WATR -ATOM 2121 OT HOH 536 12.4119 1.42160 9.59542 1.00 0.00 WATR -ATOM 2122 HT HOH 536 13.1688 2.00748 9.59542 1.00 0.00 WATR -ATOM 2123 HT HOH 536 11.6549 2.00748 9.59542 1.00 0.00 WATR -ATOM 2124 OT HOH 537 9.94871 3.88480 9.59542 1.00 0.00 WATR -ATOM 2125 HT HOH 537 10.7056 4.47069 9.59542 1.00 0.00 WATR -ATOM 2126 HT HOH 537 9.19176 4.47069 9.59542 1.00 0.00 WATR -ATOM 2127 OT HOH 538 9.94871 6.34801 -12.573 1.00 0.00 WATR -ATOM 2128 HT HOH 538 10.7056 6.93389 -12.573 1.00 0.00 WATR -ATOM 2129 HT HOH 538 9.19176 6.93389 -12.573 1.00 0.00 WATR -ATOM 2130 OT HOH 539 12.4119 8.81121 -12.573 1.00 0.00 WATR -ATOM 2131 HT HOH 539 13.1688 9.39710 -12.573 1.00 0.00 WATR -ATOM 2132 HT HOH 539 11.6549 9.39710 -12.573 1.00 0.00 WATR -ATOM 2133 OT HOH 540 12.4119 6.34801 -10.110 1.00 0.00 WATR -ATOM 2134 HT HOH 540 13.1688 6.93389 -10.110 1.00 0.00 WATR -ATOM 2135 HT HOH 540 11.6549 6.93389 -10.110 1.00 0.00 WATR -ATOM 2136 OT HOH 541 9.94871 8.81121 -10.110 1.00 0.00 WATR -ATOM 2137 HT HOH 541 10.7056 9.39710 -10.110 1.00 0.00 WATR -ATOM 2138 HT HOH 541 9.19176 9.39710 -10.110 1.00 0.00 WATR -ATOM 2139 OT HOH 542 12.4119 8.81121 -7.6470 1.00 0.00 WATR -ATOM 2140 HT HOH 542 13.1688 9.39710 -7.6470 1.00 0.00 WATR -ATOM 2141 HT HOH 542 11.6549 9.39710 -7.6470 1.00 0.00 WATR -ATOM 2142 OT HOH 543 12.4119 8.81121 -2.7206 1.00 0.00 WATR -ATOM 2143 HT HOH 543 13.1688 9.39710 -2.7206 1.00 0.00 WATR -ATOM 2144 HT HOH 543 11.6549 9.39710 -2.7206 1.00 0.00 WATR -ATOM 2145 OT HOH 544 12.4119 8.81121 2.20580 1.00 0.00 WATR -ATOM 2146 HT HOH 544 13.1688 9.39710 2.20580 1.00 0.00 WATR -ATOM 2147 HT HOH 544 11.6549 9.39710 2.20580 1.00 0.00 WATR -ATOM 2148 OT HOH 545 12.4119 8.81121 7.13221 1.00 0.00 WATR -ATOM 2149 HT HOH 545 13.1688 9.39710 7.13221 1.00 0.00 WATR -ATOM 2150 HT HOH 545 11.6549 9.39710 7.13221 1.00 0.00 WATR -ATOM 2151 OT HOH 546 12.4119 6.34801 9.59542 1.00 0.00 WATR -ATOM 2152 HT HOH 546 13.1688 6.93389 9.59542 1.00 0.00 WATR -ATOM 2153 HT HOH 546 11.6549 6.93389 9.59542 1.00 0.00 WATR -ATOM 2154 OT HOH 547 9.94871 8.81121 9.59542 1.00 0.00 WATR -ATOM 2155 HT HOH 547 10.7056 9.39710 9.59542 1.00 0.00 WATR -ATOM 2156 HT HOH 547 9.19176 9.39710 9.59542 1.00 0.00 WATR -ATOM 2157 OT HOH 548 9.94871 11.2744 -12.573 1.00 0.00 WATR -ATOM 2158 HT HOH 548 10.7056 11.8603 -12.573 1.00 0.00 WATR -ATOM 2159 HT HOH 548 9.19176 11.8603 -12.573 1.00 0.00 WATR -ATOM 2160 OT HOH 549 12.4119 13.7376 -12.573 1.00 0.00 WATR -ATOM 2161 HT HOH 549 13.1688 14.3235 -12.573 1.00 0.00 WATR -ATOM 2162 HT HOH 549 11.6549 14.3235 -12.573 1.00 0.00 WATR -ATOM 2163 OT HOH 550 12.4119 11.2744 -10.110 1.00 0.00 WATR -ATOM 2164 HT HOH 550 13.1688 11.8603 -10.110 1.00 0.00 WATR -ATOM 2165 HT HOH 550 11.6549 11.8603 -10.110 1.00 0.00 WATR -ATOM 2166 OT HOH 551 9.94871 13.7376 -10.110 1.00 0.00 WATR -ATOM 2167 HT HOH 551 10.7056 14.3235 -10.110 1.00 0.00 WATR -ATOM 2168 HT HOH 551 9.19176 14.3235 -10.110 1.00 0.00 WATR -ATOM 2169 OT HOH 552 9.94871 11.2744 -7.6470 1.00 0.00 WATR -ATOM 2170 HT HOH 552 10.7056 11.8603 -7.6470 1.00 0.00 WATR -ATOM 2171 HT HOH 552 9.19176 11.8603 -7.6470 1.00 0.00 WATR -ATOM 2172 OT HOH 553 12.4119 13.7376 -7.6470 1.00 0.00 WATR -ATOM 2173 HT HOH 553 13.1688 14.3235 -7.6470 1.00 0.00 WATR -ATOM 2174 HT HOH 553 11.6549 14.3235 -7.6470 1.00 0.00 WATR -ATOM 2175 OT HOH 554 12.4119 11.2744 -5.1838 1.00 0.00 WATR -ATOM 2176 HT HOH 554 13.1688 11.8603 -5.1838 1.00 0.00 WATR -ATOM 2177 HT HOH 554 11.6549 11.8603 -5.1838 1.00 0.00 WATR -ATOM 2178 OT HOH 555 9.94871 13.7376 -5.1838 1.00 0.00 WATR -ATOM 2179 HT HOH 555 10.7056 14.3235 -5.1838 1.00 0.00 WATR -ATOM 2180 HT HOH 555 9.19176 14.3235 -5.1838 1.00 0.00 WATR -ATOM 2181 OT HOH 556 12.4119 13.7376 -2.7206 1.00 0.00 WATR -ATOM 2182 HT HOH 556 13.1688 14.3235 -2.7206 1.00 0.00 WATR -ATOM 2183 HT HOH 556 11.6549 14.3235 -2.7206 1.00 0.00 WATR -ATOM 2184 OT HOH 557 12.4119 11.2744 -0.2573 1.00 0.00 WATR -ATOM 2185 HT HOH 557 13.1688 11.8603 -0.2573 1.00 0.00 WATR -ATOM 2186 HT HOH 557 11.6549 11.8603 -0.2573 1.00 0.00 WATR -ATOM 2187 OT HOH 558 9.94871 13.7376 -0.2573 1.00 0.00 WATR -ATOM 2188 HT HOH 558 10.7056 14.3235 -0.2573 1.00 0.00 WATR -ATOM 2189 HT HOH 558 9.19176 14.3235 -0.2573 1.00 0.00 WATR -ATOM 2190 OT HOH 559 12.4119 13.7376 2.20580 1.00 0.00 WATR -ATOM 2191 HT HOH 559 13.1688 14.3235 2.20580 1.00 0.00 WATR -ATOM 2192 HT HOH 559 11.6549 14.3235 2.20580 1.00 0.00 WATR -ATOM 2193 OT HOH 560 12.4119 11.2744 4.66901 1.00 0.00 WATR -ATOM 2194 HT HOH 560 13.1688 11.8603 4.66901 1.00 0.00 WATR -ATOM 2195 HT HOH 560 11.6549 11.8603 4.66901 1.00 0.00 WATR -ATOM 2196 OT HOH 561 9.94871 13.7376 4.66901 1.00 0.00 WATR -ATOM 2197 HT HOH 561 10.7056 14.3235 4.66901 1.00 0.00 WATR -ATOM 2198 HT HOH 561 9.19176 14.3235 4.66901 1.00 0.00 WATR -ATOM 2199 OT HOH 562 9.94871 11.2744 7.13221 1.00 0.00 WATR -ATOM 2200 HT HOH 562 10.7056 11.8603 7.13221 1.00 0.00 WATR -ATOM 2201 HT HOH 562 9.19176 11.8603 7.13221 1.00 0.00 WATR -ATOM 2202 OT HOH 563 12.4119 13.7376 7.13221 1.00 0.00 WATR -ATOM 2203 HT HOH 563 13.1688 14.3235 7.13221 1.00 0.00 WATR -ATOM 2204 HT HOH 563 11.6549 14.3235 7.13221 1.00 0.00 WATR -ATOM 2205 OT HOH 564 12.4119 11.2744 9.59542 1.00 0.00 WATR -ATOM 2206 HT HOH 564 13.1688 11.8603 9.59542 1.00 0.00 WATR -ATOM 2207 HT HOH 564 11.6549 11.8603 9.59542 1.00 0.00 WATR -ATOM 2208 OT HOH 565 9.94871 13.7376 9.59542 1.00 0.00 WATR -ATOM 2209 HT HOH 565 10.7056 14.3235 9.59542 1.00 0.00 WATR -ATOM 2210 HT HOH 565 9.19176 14.3235 9.59542 1.00 0.00 WATR -ATOM 2211 OT HOH 566 14.8751 -13.357 -12.573 1.00 0.00 WATR -ATOM 2212 HT HOH 566 15.6320 -12.771 -12.573 1.00 0.00 WATR -ATOM 2213 HT HOH 566 14.1181 -12.771 -12.573 1.00 0.00 WATR -ATOM 2214 OT HOH 567 17.3383 -10.894 -12.573 1.00 0.00 WATR -ATOM 2215 HT HOH 567 18.0952 -10.308 -12.573 1.00 0.00 WATR -ATOM 2216 HT HOH 567 16.5813 -10.308 -12.573 1.00 0.00 WATR -ATOM 2217 OT HOH 568 17.3383 -13.357 -10.110 1.00 0.00 WATR -ATOM 2218 HT HOH 568 18.0952 -12.771 -10.110 1.00 0.00 WATR -ATOM 2219 HT HOH 568 16.5813 -12.771 -10.110 1.00 0.00 WATR -ATOM 2220 OT HOH 569 14.8751 -10.894 -10.110 1.00 0.00 WATR -ATOM 2221 HT HOH 569 15.6320 -10.308 -10.110 1.00 0.00 WATR -ATOM 2222 HT HOH 569 14.1181 -10.308 -10.110 1.00 0.00 WATR -ATOM 2223 OT HOH 570 14.8751 -13.357 -7.6470 1.00 0.00 WATR -ATOM 2224 HT HOH 570 15.6320 -12.771 -7.6470 1.00 0.00 WATR -ATOM 2225 HT HOH 570 14.1181 -12.771 -7.6470 1.00 0.00 WATR -ATOM 2226 OT HOH 571 17.3383 -10.894 -7.6470 1.00 0.00 WATR -ATOM 2227 HT HOH 571 18.0952 -10.308 -7.6470 1.00 0.00 WATR -ATOM 2228 HT HOH 571 16.5813 -10.308 -7.6470 1.00 0.00 WATR -ATOM 2229 OT HOH 572 17.3383 -13.357 -5.1838 1.00 0.00 WATR -ATOM 2230 HT HOH 572 18.0952 -12.771 -5.1838 1.00 0.00 WATR -ATOM 2231 HT HOH 572 16.5813 -12.771 -5.1838 1.00 0.00 WATR -ATOM 2232 OT HOH 573 14.8751 -10.894 -5.1838 1.00 0.00 WATR -ATOM 2233 HT HOH 573 15.6320 -10.308 -5.1838 1.00 0.00 WATR -ATOM 2234 HT HOH 573 14.1181 -10.308 -5.1838 1.00 0.00 WATR -ATOM 2235 OT HOH 574 14.8751 -13.357 -2.7206 1.00 0.00 WATR -ATOM 2236 HT HOH 574 15.6320 -12.771 -2.7206 1.00 0.00 WATR -ATOM 2237 HT HOH 574 14.1181 -12.771 -2.7206 1.00 0.00 WATR -ATOM 2238 OT HOH 575 17.3383 -10.894 -2.7206 1.00 0.00 WATR -ATOM 2239 HT HOH 575 18.0952 -10.308 -2.7206 1.00 0.00 WATR -ATOM 2240 HT HOH 575 16.5813 -10.308 -2.7206 1.00 0.00 WATR -ATOM 2241 OT HOH 576 17.3383 -13.357 -0.2573 1.00 0.00 WATR -ATOM 2242 HT HOH 576 18.0952 -12.771 -0.2573 1.00 0.00 WATR -ATOM 2243 HT HOH 576 16.5813 -12.771 -0.2573 1.00 0.00 WATR -ATOM 2244 OT HOH 577 14.8751 -10.894 -0.2573 1.00 0.00 WATR -ATOM 2245 HT HOH 577 15.6320 -10.308 -0.2573 1.00 0.00 WATR -ATOM 2246 HT HOH 577 14.1181 -10.308 -0.2573 1.00 0.00 WATR -ATOM 2247 OT HOH 578 14.8751 -13.357 2.20580 1.00 0.00 WATR -ATOM 2248 HT HOH 578 15.6320 -12.771 2.20580 1.00 0.00 WATR -ATOM 2249 HT HOH 578 14.1181 -12.771 2.20580 1.00 0.00 WATR -ATOM 2250 OT HOH 579 17.3383 -10.894 2.20580 1.00 0.00 WATR -ATOM 2251 HT HOH 579 18.0952 -10.308 2.20580 1.00 0.00 WATR -ATOM 2252 HT HOH 579 16.5813 -10.308 2.20580 1.00 0.00 WATR -ATOM 2253 OT HOH 580 17.3383 -13.357 4.66901 1.00 0.00 WATR -ATOM 2254 HT HOH 580 18.0952 -12.771 4.66901 1.00 0.00 WATR -ATOM 2255 HT HOH 580 16.5813 -12.771 4.66901 1.00 0.00 WATR -ATOM 2256 OT HOH 581 14.8751 -10.894 4.66901 1.00 0.00 WATR -ATOM 2257 HT HOH 581 15.6320 -10.308 4.66901 1.00 0.00 WATR -ATOM 2258 HT HOH 581 14.1181 -10.308 4.66901 1.00 0.00 WATR -ATOM 2259 OT HOH 582 14.8751 -13.357 7.13221 1.00 0.00 WATR -ATOM 2260 HT HOH 582 15.6320 -12.771 7.13221 1.00 0.00 WATR -ATOM 2261 HT HOH 582 14.1181 -12.771 7.13221 1.00 0.00 WATR -ATOM 2262 OT HOH 583 17.3383 -10.894 7.13221 1.00 0.00 WATR -ATOM 2263 HT HOH 583 18.0952 -10.308 7.13221 1.00 0.00 WATR -ATOM 2264 HT HOH 583 16.5813 -10.308 7.13221 1.00 0.00 WATR -ATOM 2265 OT HOH 584 17.3383 -13.357 9.59542 1.00 0.00 WATR -ATOM 2266 HT HOH 584 18.0952 -12.771 9.59542 1.00 0.00 WATR -ATOM 2267 HT HOH 584 16.5813 -12.771 9.59542 1.00 0.00 WATR -ATOM 2268 OT HOH 585 14.8751 -10.894 9.59542 1.00 0.00 WATR -ATOM 2269 HT HOH 585 15.6320 -10.308 9.59542 1.00 0.00 WATR -ATOM 2270 HT HOH 585 14.1181 -10.308 9.59542 1.00 0.00 WATR -ATOM 2271 OT HOH 586 14.8751 -8.4312 -12.573 1.00 0.00 WATR -ATOM 2272 HT HOH 586 15.6320 -7.8453 -12.573 1.00 0.00 WATR -ATOM 2273 HT HOH 586 14.1181 -7.8453 -12.573 1.00 0.00 WATR -ATOM 2274 OT HOH 587 17.3383 -5.9680 -12.573 1.00 0.00 WATR -ATOM 2275 HT HOH 587 18.0952 -5.3821 -12.573 1.00 0.00 WATR -ATOM 2276 HT HOH 587 16.5813 -5.3821 -12.573 1.00 0.00 WATR -ATOM 2277 OT HOH 588 17.3383 -8.4312 -10.110 1.00 0.00 WATR -ATOM 2278 HT HOH 588 18.0952 -7.8453 -10.110 1.00 0.00 WATR -ATOM 2279 HT HOH 588 16.5813 -7.8453 -10.110 1.00 0.00 WATR -ATOM 2280 OT HOH 589 14.8751 -5.9680 -10.110 1.00 0.00 WATR -ATOM 2281 HT HOH 589 15.6320 -5.3821 -10.110 1.00 0.00 WATR -ATOM 2282 HT HOH 589 14.1181 -5.3821 -10.110 1.00 0.00 WATR -ATOM 2283 OT HOH 590 14.8751 -8.4312 -7.6470 1.00 0.00 WATR -ATOM 2284 HT HOH 590 15.6320 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 2285 HT HOH 590 14.1181 -7.8453 -7.6470 1.00 0.00 WATR -ATOM 2286 OT HOH 591 17.3383 -5.9680 -7.6470 1.00 0.00 WATR -ATOM 2287 HT HOH 591 18.0952 -5.3821 -7.6470 1.00 0.00 WATR -ATOM 2288 HT HOH 591 16.5813 -5.3821 -7.6470 1.00 0.00 WATR -ATOM 2289 OT HOH 592 17.3383 -8.4312 -5.1838 1.00 0.00 WATR -ATOM 2290 HT HOH 592 18.0952 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 2291 HT HOH 592 16.5813 -7.8453 -5.1838 1.00 0.00 WATR -ATOM 2292 OT HOH 593 14.8751 -8.4312 -2.7206 1.00 0.00 WATR -ATOM 2293 HT HOH 593 15.6320 -7.8453 -2.7206 1.00 0.00 WATR -ATOM 2294 HT HOH 593 14.1181 -7.8453 -2.7206 1.00 0.00 WATR -ATOM 2295 OT HOH 594 17.3383 -8.4312 -0.2573 1.00 0.00 WATR -ATOM 2296 HT HOH 594 18.0952 -7.8453 -0.2573 1.00 0.00 WATR -ATOM 2297 HT HOH 594 16.5813 -7.8453 -0.2573 1.00 0.00 WATR -ATOM 2298 OT HOH 595 17.3383 -8.4312 4.66901 1.00 0.00 WATR -ATOM 2299 HT HOH 595 18.0952 -7.8453 4.66901 1.00 0.00 WATR -ATOM 2300 HT HOH 595 16.5813 -7.8453 4.66901 1.00 0.00 WATR -ATOM 2301 OT HOH 596 14.8751 -8.4312 7.13221 1.00 0.00 WATR -ATOM 2302 HT HOH 596 15.6320 -7.8453 7.13221 1.00 0.00 WATR -ATOM 2303 HT HOH 596 14.1181 -7.8453 7.13221 1.00 0.00 WATR -ATOM 2304 OT HOH 597 17.3383 -5.9680 7.13221 1.00 0.00 WATR -ATOM 2305 HT HOH 597 18.0952 -5.3821 7.13221 1.00 0.00 WATR -ATOM 2306 HT HOH 597 16.5813 -5.3821 7.13221 1.00 0.00 WATR -ATOM 2307 OT HOH 598 17.3383 -8.4312 9.59542 1.00 0.00 WATR -ATOM 2308 HT HOH 598 18.0952 -7.8453 9.59542 1.00 0.00 WATR -ATOM 2309 HT HOH 598 16.5813 -7.8453 9.59542 1.00 0.00 WATR -ATOM 2310 OT HOH 599 14.8751 -5.9680 9.59542 1.00 0.00 WATR -ATOM 2311 HT HOH 599 15.6320 -5.3821 9.59542 1.00 0.00 WATR -ATOM 2312 HT HOH 599 14.1181 -5.3821 9.59542 1.00 0.00 WATR -ATOM 2313 OT HOH 600 14.8751 -3.5048 -12.573 1.00 0.00 WATR -ATOM 2314 HT HOH 600 15.6320 -2.9189 -12.573 1.00 0.00 WATR -ATOM 2315 HT HOH 600 14.1181 -2.9189 -12.573 1.00 0.00 WATR -ATOM 2316 OT HOH 601 17.3383 -1.0416 -12.573 1.00 0.00 WATR -ATOM 2317 HT HOH 601 18.0952 -0.4557 -12.573 1.00 0.00 WATR -ATOM 2318 HT HOH 601 16.5813 -0.4557 -12.573 1.00 0.00 WATR -ATOM 2319 OT HOH 602 17.3383 -3.5048 -10.110 1.00 0.00 WATR -ATOM 2320 HT HOH 602 18.0952 -2.9189 -10.110 1.00 0.00 WATR -ATOM 2321 HT HOH 602 16.5813 -2.9189 -10.110 1.00 0.00 WATR -ATOM 2322 OT HOH 603 14.8751 -1.0416 -10.110 1.00 0.00 WATR -ATOM 2323 HT HOH 603 15.6320 -0.4557 -10.110 1.00 0.00 WATR -ATOM 2324 HT HOH 603 14.1181 -0.4557 -10.110 1.00 0.00 WATR -ATOM 2325 OT HOH 604 14.8751 -3.5048 -7.6470 1.00 0.00 WATR -ATOM 2326 HT HOH 604 15.6320 -2.9189 -7.6470 1.00 0.00 WATR -ATOM 2327 HT HOH 604 14.1181 -2.9189 -7.6470 1.00 0.00 WATR -ATOM 2328 OT HOH 605 17.3383 -1.0416 -7.6470 1.00 0.00 WATR -ATOM 2329 HT HOH 605 18.0952 -0.4557 -7.6470 1.00 0.00 WATR -ATOM 2330 HT HOH 605 16.5813 -0.4557 -7.6470 1.00 0.00 WATR -ATOM 2331 OT HOH 606 14.8751 -1.0416 -5.1838 1.00 0.00 WATR -ATOM 2332 HT HOH 606 15.6320 -0.4557 -5.1838 1.00 0.00 WATR -ATOM 2333 HT HOH 606 14.1181 -0.4557 -5.1838 1.00 0.00 WATR -ATOM 2334 OT HOH 607 17.3383 -1.0416 -2.7206 1.00 0.00 WATR -ATOM 2335 HT HOH 607 18.0952 -0.4557 -2.7206 1.00 0.00 WATR -ATOM 2336 HT HOH 607 16.5813 -0.4557 -2.7206 1.00 0.00 WATR -ATOM 2337 OT HOH 608 17.3383 -1.0416 7.13221 1.00 0.00 WATR -ATOM 2338 HT HOH 608 18.0952 -0.4557 7.13221 1.00 0.00 WATR -ATOM 2339 HT HOH 608 16.5813 -0.4557 7.13221 1.00 0.00 WATR -ATOM 2340 OT HOH 609 17.3383 -3.5048 9.59542 1.00 0.00 WATR -ATOM 2341 HT HOH 609 18.0952 -2.9189 9.59542 1.00 0.00 WATR -ATOM 2342 HT HOH 609 16.5813 -2.9189 9.59542 1.00 0.00 WATR -ATOM 2343 OT HOH 610 14.8751 1.42160 -12.573 1.00 0.00 WATR -ATOM 2344 HT HOH 610 15.6320 2.00748 -12.573 1.00 0.00 WATR -ATOM 2345 HT HOH 610 14.1181 2.00748 -12.573 1.00 0.00 WATR -ATOM 2346 OT HOH 611 17.3383 3.88480 -12.573 1.00 0.00 WATR -ATOM 2347 HT HOH 611 18.0952 4.47069 -12.573 1.00 0.00 WATR -ATOM 2348 HT HOH 611 16.5813 4.47069 -12.573 1.00 0.00 WATR -ATOM 2349 OT HOH 612 17.3383 1.42160 -10.110 1.00 0.00 WATR -ATOM 2350 HT HOH 612 18.0952 2.00748 -10.110 1.00 0.00 WATR -ATOM 2351 HT HOH 612 16.5813 2.00748 -10.110 1.00 0.00 WATR -ATOM 2352 OT HOH 613 14.8751 3.88480 -10.110 1.00 0.00 WATR -ATOM 2353 HT HOH 613 15.6320 4.47069 -10.110 1.00 0.00 WATR -ATOM 2354 HT HOH 613 14.1181 4.47069 -10.110 1.00 0.00 WATR -ATOM 2355 OT HOH 614 14.8751 1.42160 -7.6470 1.00 0.00 WATR -ATOM 2356 HT HOH 614 15.6320 2.00748 -7.6470 1.00 0.00 WATR -ATOM 2357 HT HOH 614 14.1181 2.00748 -7.6470 1.00 0.00 WATR -ATOM 2358 OT HOH 615 17.3383 3.88480 -7.6470 1.00 0.00 WATR -ATOM 2359 HT HOH 615 18.0952 4.47069 -7.6470 1.00 0.00 WATR -ATOM 2360 HT HOH 615 16.5813 4.47069 -7.6470 1.00 0.00 WATR -ATOM 2361 OT HOH 616 17.3383 1.42160 -5.1838 1.00 0.00 WATR -ATOM 2362 HT HOH 616 18.0952 2.00748 -5.1838 1.00 0.00 WATR -ATOM 2363 HT HOH 616 16.5813 2.00748 -5.1838 1.00 0.00 WATR -ATOM 2364 SOD ION 617 17.3383 3.88480 -2.7206 1.00 0.00 SALT -ATOM 2365 OT HOH 618 17.3383 3.88480 2.20580 1.00 0.00 WATR -ATOM 2366 HT HOH 618 18.0952 4.47069 2.20580 1.00 0.00 WATR -ATOM 2367 HT HOH 618 16.5813 4.47069 2.20580 1.00 0.00 WATR -ATOM 2368 OT HOH 619 17.3383 3.88480 7.13221 1.00 0.00 WATR -ATOM 2369 HT HOH 619 18.0952 4.47069 7.13221 1.00 0.00 WATR -ATOM 2370 HT HOH 619 16.5813 4.47069 7.13221 1.00 0.00 WATR -ATOM 2371 OT HOH 620 17.3383 1.42160 9.59542 1.00 0.00 WATR -ATOM 2372 HT HOH 620 18.0952 2.00748 9.59542 1.00 0.00 WATR -ATOM 2373 HT HOH 620 16.5813 2.00748 9.59542 1.00 0.00 WATR -ATOM 2374 OT HOH 621 14.8751 3.88480 9.59542 1.00 0.00 WATR -ATOM 2375 HT HOH 621 15.6320 4.47069 9.59542 1.00 0.00 WATR -ATOM 2376 HT HOH 621 14.1181 4.47069 9.59542 1.00 0.00 WATR -ATOM 2377 OT HOH 622 14.8751 6.34801 -12.573 1.00 0.00 WATR -ATOM 2378 HT HOH 622 15.6320 6.93389 -12.573 1.00 0.00 WATR -ATOM 2379 HT HOH 622 14.1181 6.93389 -12.573 1.00 0.00 WATR -ATOM 2380 OT HOH 623 17.3383 8.81121 -12.573 1.00 0.00 WATR -ATOM 2381 HT HOH 623 18.0952 9.39710 -12.573 1.00 0.00 WATR -ATOM 2382 HT HOH 623 16.5813 9.39710 -12.573 1.00 0.00 WATR -ATOM 2383 OT HOH 624 17.3383 6.34801 -10.110 1.00 0.00 WATR -ATOM 2384 HT HOH 624 18.0952 6.93389 -10.110 1.00 0.00 WATR -ATOM 2385 HT HOH 624 16.5813 6.93389 -10.110 1.00 0.00 WATR -ATOM 2386 OT HOH 625 14.8751 8.81121 -10.110 1.00 0.00 WATR -ATOM 2387 HT HOH 625 15.6320 9.39710 -10.110 1.00 0.00 WATR -ATOM 2388 HT HOH 625 14.1181 9.39710 -10.110 1.00 0.00 WATR -ATOM 2389 OT HOH 626 14.8751 6.34801 -7.6470 1.00 0.00 WATR -ATOM 2390 HT HOH 626 15.6320 6.93389 -7.6470 1.00 0.00 WATR -ATOM 2391 HT HOH 626 14.1181 6.93389 -7.6470 1.00 0.00 WATR -ATOM 2392 OT HOH 627 17.3383 8.81121 -7.6470 1.00 0.00 WATR -ATOM 2393 HT HOH 627 18.0952 9.39710 -7.6470 1.00 0.00 WATR -ATOM 2394 HT HOH 627 16.5813 9.39710 -7.6470 1.00 0.00 WATR -ATOM 2395 OT HOH 628 17.3383 6.34801 -5.1838 1.00 0.00 WATR -ATOM 2396 HT HOH 628 18.0952 6.93389 -5.1838 1.00 0.00 WATR -ATOM 2397 HT HOH 628 16.5813 6.93389 -5.1838 1.00 0.00 WATR -ATOM 2398 OT HOH 629 14.8751 8.81121 -5.1838 1.00 0.00 WATR -ATOM 2399 HT HOH 629 15.6320 9.39710 -5.1838 1.00 0.00 WATR -ATOM 2400 HT HOH 629 14.1181 9.39710 -5.1838 1.00 0.00 WATR -ATOM 2401 OT HOH 630 14.8751 6.34801 -2.7206 1.00 0.00 WATR -ATOM 2402 HT HOH 630 15.6320 6.93389 -2.7206 1.00 0.00 WATR -ATOM 2403 HT HOH 630 14.1181 6.93389 -2.7206 1.00 0.00 WATR -ATOM 2404 OT HOH 631 17.3383 8.81121 -2.7206 1.00 0.00 WATR -ATOM 2405 HT HOH 631 18.0952 9.39710 -2.7206 1.00 0.00 WATR -ATOM 2406 HT HOH 631 16.5813 9.39710 -2.7206 1.00 0.00 WATR -ATOM 2407 OT HOH 632 17.3383 6.34801 -0.2573 1.00 0.00 WATR -ATOM 2408 HT HOH 632 18.0952 6.93389 -0.2573 1.00 0.00 WATR -ATOM 2409 HT HOH 632 16.5813 6.93389 -0.2573 1.00 0.00 WATR -ATOM 2410 OT HOH 633 14.8751 8.81121 -0.2573 1.00 0.00 WATR -ATOM 2411 HT HOH 633 15.6320 9.39710 -0.2573 1.00 0.00 WATR -ATOM 2412 HT HOH 633 14.1181 9.39710 -0.2573 1.00 0.00 WATR -ATOM 2413 OT HOH 634 17.3383 8.81121 2.20580 1.00 0.00 WATR -ATOM 2414 HT HOH 634 18.0952 9.39710 2.20580 1.00 0.00 WATR -ATOM 2415 HT HOH 634 16.5813 9.39710 2.20580 1.00 0.00 WATR -ATOM 2416 OT HOH 635 17.3383 6.34801 4.66901 1.00 0.00 WATR -ATOM 2417 HT HOH 635 18.0952 6.93389 4.66901 1.00 0.00 WATR -ATOM 2418 HT HOH 635 16.5813 6.93389 4.66901 1.00 0.00 WATR -ATOM 2419 OT HOH 636 14.8751 8.81121 4.66901 1.00 0.00 WATR -ATOM 2420 HT HOH 636 15.6320 9.39710 4.66901 1.00 0.00 WATR -ATOM 2421 HT HOH 636 14.1181 9.39710 4.66901 1.00 0.00 WATR -ATOM 2422 OT HOH 637 14.8751 6.34801 7.13221 1.00 0.00 WATR -ATOM 2423 HT HOH 637 15.6320 6.93389 7.13221 1.00 0.00 WATR -ATOM 2424 HT HOH 637 14.1181 6.93389 7.13221 1.00 0.00 WATR -ATOM 2425 OT HOH 638 17.3383 8.81121 7.13221 1.00 0.00 WATR -ATOM 2426 HT HOH 638 18.0952 9.39710 7.13221 1.00 0.00 WATR -ATOM 2427 HT HOH 638 16.5813 9.39710 7.13221 1.00 0.00 WATR -ATOM 2428 OT HOH 639 17.3383 6.34801 9.59542 1.00 0.00 WATR -ATOM 2429 HT HOH 639 18.0952 6.93389 9.59542 1.00 0.00 WATR -ATOM 2430 HT HOH 639 16.5813 6.93389 9.59542 1.00 0.00 WATR -ATOM 2431 OT HOH 640 14.8751 8.81121 9.59542 1.00 0.00 WATR -ATOM 2432 HT HOH 640 15.6320 9.39710 9.59542 1.00 0.00 WATR -ATOM 2433 HT HOH 640 14.1181 9.39710 9.59542 1.00 0.00 WATR -ATOM 2434 OT HOH 641 14.8751 11.2744 -12.573 1.00 0.00 WATR -ATOM 2435 HT HOH 641 15.6320 11.8603 -12.573 1.00 0.00 WATR -ATOM 2436 HT HOH 641 14.1181 11.8603 -12.573 1.00 0.00 WATR -ATOM 2437 OT HOH 642 17.3383 13.7376 -12.573 1.00 0.00 WATR -ATOM 2438 HT HOH 642 18.0952 14.3235 -12.573 1.00 0.00 WATR -ATOM 2439 HT HOH 642 16.5813 14.3235 -12.573 1.00 0.00 WATR -ATOM 2440 OT HOH 643 17.3383 11.2744 -10.110 1.00 0.00 WATR -ATOM 2441 HT HOH 643 18.0952 11.8603 -10.110 1.00 0.00 WATR -ATOM 2442 HT HOH 643 16.5813 11.8603 -10.110 1.00 0.00 WATR -ATOM 2443 OT HOH 644 14.8751 13.7376 -10.110 1.00 0.00 WATR -ATOM 2444 HT HOH 644 15.6320 14.3235 -10.110 1.00 0.00 WATR -ATOM 2445 HT HOH 644 14.1181 14.3235 -10.110 1.00 0.00 WATR -ATOM 2446 OT HOH 645 14.8751 11.2744 -7.6470 1.00 0.00 WATR -ATOM 2447 HT HOH 645 15.6320 11.8603 -7.6470 1.00 0.00 WATR -ATOM 2448 HT HOH 645 14.1181 11.8603 -7.6470 1.00 0.00 WATR -ATOM 2449 OT HOH 646 17.3383 13.7376 -7.6470 1.00 0.00 WATR -ATOM 2450 HT HOH 646 18.0952 14.3235 -7.6470 1.00 0.00 WATR -ATOM 2451 HT HOH 646 16.5813 14.3235 -7.6470 1.00 0.00 WATR -ATOM 2452 OT HOH 647 17.3383 11.2744 -5.1838 1.00 0.00 WATR -ATOM 2453 HT HOH 647 18.0952 11.8603 -5.1838 1.00 0.00 WATR -ATOM 2454 HT HOH 647 16.5813 11.8603 -5.1838 1.00 0.00 WATR -ATOM 2455 OT HOH 648 14.8751 13.7376 -5.1838 1.00 0.00 WATR -ATOM 2456 HT HOH 648 15.6320 14.3235 -5.1838 1.00 0.00 WATR -ATOM 2457 HT HOH 648 14.1181 14.3235 -5.1838 1.00 0.00 WATR -ATOM 2458 OT HOH 649 14.8751 11.2744 -2.7206 1.00 0.00 WATR -ATOM 2459 HT HOH 649 15.6320 11.8603 -2.7206 1.00 0.00 WATR -ATOM 2460 HT HOH 649 14.1181 11.8603 -2.7206 1.00 0.00 WATR -ATOM 2461 OT HOH 650 17.3383 13.7376 -2.7206 1.00 0.00 WATR -ATOM 2462 HT HOH 650 18.0952 14.3235 -2.7206 1.00 0.00 WATR -ATOM 2463 HT HOH 650 16.5813 14.3235 -2.7206 1.00 0.00 WATR -ATOM 2464 OT HOH 651 17.3383 11.2744 -0.2573 1.00 0.00 WATR -ATOM 2465 HT HOH 651 18.0952 11.8603 -0.2573 1.00 0.00 WATR -ATOM 2466 HT HOH 651 16.5813 11.8603 -0.2573 1.00 0.00 WATR -ATOM 2467 OT HOH 652 14.8751 13.7376 -0.2573 1.00 0.00 WATR -ATOM 2468 HT HOH 652 15.6320 14.3235 -0.2573 1.00 0.00 WATR -ATOM 2469 HT HOH 652 14.1181 14.3235 -0.2573 1.00 0.00 WATR -ATOM 2470 OT HOH 653 14.8751 11.2744 2.20580 1.00 0.00 WATR -ATOM 2471 HT HOH 653 15.6320 11.8603 2.20580 1.00 0.00 WATR -ATOM 2472 HT HOH 653 14.1181 11.8603 2.20580 1.00 0.00 WATR -ATOM 2473 OT HOH 654 17.3383 13.7376 2.20580 1.00 0.00 WATR -ATOM 2474 HT HOH 654 18.0952 14.3235 2.20580 1.00 0.00 WATR -ATOM 2475 HT HOH 654 16.5813 14.3235 2.20580 1.00 0.00 WATR -ATOM 2476 OT HOH 655 17.3383 11.2744 4.66901 1.00 0.00 WATR -ATOM 2477 HT HOH 655 18.0952 11.8603 4.66901 1.00 0.00 WATR -ATOM 2478 HT HOH 655 16.5813 11.8603 4.66901 1.00 0.00 WATR -ATOM 2479 OT HOH 656 14.8751 13.7376 4.66901 1.00 0.00 WATR -ATOM 2480 HT HOH 656 15.6320 14.3235 4.66901 1.00 0.00 WATR -ATOM 2481 HT HOH 656 14.1181 14.3235 4.66901 1.00 0.00 WATR -ATOM 2482 OT HOH 657 14.8751 11.2744 7.13221 1.00 0.00 WATR -ATOM 2483 HT HOH 657 15.6320 11.8603 7.13221 1.00 0.00 WATR -ATOM 2484 HT HOH 657 14.1181 11.8603 7.13221 1.00 0.00 WATR -ATOM 2485 OT HOH 658 17.3383 13.7376 7.13221 1.00 0.00 WATR -ATOM 2486 HT HOH 658 18.0952 14.3235 7.13221 1.00 0.00 WATR -ATOM 2487 HT HOH 658 16.5813 14.3235 7.13221 1.00 0.00 WATR -ATOM 2488 OT HOH 659 17.3383 11.2744 9.59542 1.00 0.00 WATR -ATOM 2489 HT HOH 659 18.0952 11.8603 9.59542 1.00 0.00 WATR -ATOM 2490 HT HOH 659 16.5813 11.8603 9.59542 1.00 0.00 WATR -ATOM 2491 OT HOH 660 14.8751 13.7376 9.59542 1.00 0.00 WATR -ATOM 2492 HT HOH 660 15.6320 14.3235 9.59542 1.00 0.00 WATR -ATOM 2493 HT HOH 660 14.1181 14.3235 9.59542 1.00 0.00 WATR -ATOM 2494 OT HOH 661 19.8015 -13.357 -12.573 1.00 0.00 WATR -ATOM 2495 HT HOH 661 20.5584 -12.771 -12.573 1.00 0.00 WATR -ATOM 2496 HT HOH 661 19.0445 -12.771 -12.573 1.00 0.00 WATR -ATOM 2497 SOD ION 662 22.2647 -10.894 -12.573 1.00 0.00 SALT +ATOM 886 SOD ION 123 -17.146 -13.357 -0.2573 1.00 0.00 SALT +ATOM 887 OT HOH 124 -19.609 -10.894 -0.2573 1.00 0.00 WATR +ATOM 888 HT HOH 124 -18.852 -10.308 -0.2573 1.00 0.00 WATR +ATOM 889 HT HOH 124 -20.366 -10.308 -0.2573 1.00 0.00 WATR +ATOM 890 OT HOH 125 -19.609 -13.357 2.20580 1.00 0.00 WATR +ATOM 891 HT HOH 125 -18.852 -12.771 2.20580 1.00 0.00 WATR +ATOM 892 HT HOH 125 -20.366 -12.771 2.20580 1.00 0.00 WATR +ATOM 893 OT HOH 126 -17.146 -10.894 2.20580 1.00 0.00 WATR +ATOM 894 HT HOH 126 -16.389 -10.308 2.20580 1.00 0.00 WATR +ATOM 895 HT HOH 126 -17.903 -10.308 2.20580 1.00 0.00 WATR +ATOM 896 OT HOH 127 -17.146 -13.357 4.66901 1.00 0.00 WATR +ATOM 897 HT HOH 127 -16.389 -12.771 4.66901 1.00 0.00 WATR +ATOM 898 HT HOH 127 -17.903 -12.771 4.66901 1.00 0.00 WATR +ATOM 899 OT HOH 128 -19.609 -10.894 4.66901 1.00 0.00 WATR +ATOM 900 HT HOH 128 -18.852 -10.308 4.66901 1.00 0.00 WATR +ATOM 901 HT HOH 128 -20.366 -10.308 4.66901 1.00 0.00 WATR +ATOM 902 OT HOH 129 -19.609 -13.357 7.13221 1.00 0.00 WATR +ATOM 903 HT HOH 129 -18.852 -12.771 7.13221 1.00 0.00 WATR +ATOM 904 HT HOH 129 -20.366 -12.771 7.13221 1.00 0.00 WATR +ATOM 905 OT HOH 130 -17.146 -10.894 7.13221 1.00 0.00 WATR +ATOM 906 HT HOH 130 -16.389 -10.308 7.13221 1.00 0.00 WATR +ATOM 907 HT HOH 130 -17.903 -10.308 7.13221 1.00 0.00 WATR +ATOM 908 OT HOH 131 -17.146 -13.357 9.59542 1.00 0.00 WATR +ATOM 909 HT HOH 131 -16.389 -12.771 9.59542 1.00 0.00 WATR +ATOM 910 HT HOH 131 -17.903 -12.771 9.59542 1.00 0.00 WATR +ATOM 911 OT HOH 132 -19.609 -10.894 9.59542 1.00 0.00 WATR +ATOM 912 HT HOH 132 -18.852 -10.308 9.59542 1.00 0.00 WATR +ATOM 913 HT HOH 132 -20.366 -10.308 9.59542 1.00 0.00 WATR +ATOM 914 OT HOH 133 -19.609 -8.4312 -12.573 1.00 0.00 WATR +ATOM 915 HT HOH 133 -18.852 -7.8453 -12.573 1.00 0.00 WATR +ATOM 916 HT HOH 133 -20.366 -7.8453 -12.573 1.00 0.00 WATR +ATOM 917 OT HOH 134 -17.146 -5.9680 -12.573 1.00 0.00 WATR +ATOM 918 HT HOH 134 -16.389 -5.3821 -12.573 1.00 0.00 WATR +ATOM 919 HT HOH 134 -17.903 -5.3821 -12.573 1.00 0.00 WATR +ATOM 920 OT HOH 135 -17.146 -8.4312 -10.110 1.00 0.00 WATR +ATOM 921 HT HOH 135 -16.389 -7.8453 -10.110 1.00 0.00 WATR +ATOM 922 HT HOH 135 -17.903 -7.8453 -10.110 1.00 0.00 WATR +ATOM 923 OT HOH 136 -19.609 -5.9680 -10.110 1.00 0.00 WATR +ATOM 924 HT HOH 136 -18.852 -5.3821 -10.110 1.00 0.00 WATR +ATOM 925 HT HOH 136 -20.366 -5.3821 -10.110 1.00 0.00 WATR +ATOM 926 OT HOH 137 -19.609 -8.4312 -7.6470 1.00 0.00 WATR +ATOM 927 HT HOH 137 -18.852 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 928 HT HOH 137 -20.366 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 929 OT HOH 138 -17.146 -5.9680 -7.6470 1.00 0.00 WATR +ATOM 930 HT HOH 138 -16.389 -5.3821 -7.6470 1.00 0.00 WATR +ATOM 931 HT HOH 138 -17.903 -5.3821 -7.6470 1.00 0.00 WATR +ATOM 932 OT HOH 139 -17.146 -8.4312 -5.1838 1.00 0.00 WATR +ATOM 933 HT HOH 139 -16.389 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 934 HT HOH 139 -17.903 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 935 OT HOH 140 -19.609 -5.9680 -5.1838 1.00 0.00 WATR +ATOM 936 HT HOH 140 -18.852 -5.3821 -5.1838 1.00 0.00 WATR +ATOM 937 HT HOH 140 -20.366 -5.3821 -5.1838 1.00 0.00 WATR +ATOM 938 OT HOH 141 -19.609 -8.4312 -2.7206 1.00 0.00 WATR +ATOM 939 HT HOH 141 -18.852 -7.8453 -2.7206 1.00 0.00 WATR +ATOM 940 HT HOH 141 -20.366 -7.8453 -2.7206 1.00 0.00 WATR +ATOM 941 OT HOH 142 -17.146 -5.9680 -2.7206 1.00 0.00 WATR +ATOM 942 HT HOH 142 -16.389 -5.3821 -2.7206 1.00 0.00 WATR +ATOM 943 HT HOH 142 -17.903 -5.3821 -2.7206 1.00 0.00 WATR +ATOM 944 OT HOH 143 -17.146 -8.4312 -0.2573 1.00 0.00 WATR +ATOM 945 HT HOH 143 -16.389 -7.8453 -0.2573 1.00 0.00 WATR +ATOM 946 HT HOH 143 -17.903 -7.8453 -0.2573 1.00 0.00 WATR +ATOM 947 OT HOH 144 -19.609 -5.9680 -0.2573 1.00 0.00 WATR +ATOM 948 HT HOH 144 -18.852 -5.3821 -0.2573 1.00 0.00 WATR +ATOM 949 HT HOH 144 -20.366 -5.3821 -0.2573 1.00 0.00 WATR +ATOM 950 OT HOH 145 -19.609 -8.4312 2.20580 1.00 0.00 WATR +ATOM 951 HT HOH 145 -18.852 -7.8453 2.20580 1.00 0.00 WATR +ATOM 952 HT HOH 145 -20.366 -7.8453 2.20580 1.00 0.00 WATR +ATOM 953 OT HOH 146 -17.146 -5.9680 2.20580 1.00 0.00 WATR +ATOM 954 HT HOH 146 -16.389 -5.3821 2.20580 1.00 0.00 WATR +ATOM 955 HT HOH 146 -17.903 -5.3821 2.20580 1.00 0.00 WATR +ATOM 956 OT HOH 147 -17.146 -8.4312 4.66901 1.00 0.00 WATR +ATOM 957 HT HOH 147 -16.389 -7.8453 4.66901 1.00 0.00 WATR +ATOM 958 HT HOH 147 -17.903 -7.8453 4.66901 1.00 0.00 WATR +ATOM 959 OT HOH 148 -19.609 -5.9680 4.66901 1.00 0.00 WATR +ATOM 960 HT HOH 148 -18.852 -5.3821 4.66901 1.00 0.00 WATR +ATOM 961 HT HOH 148 -20.366 -5.3821 4.66901 1.00 0.00 WATR +ATOM 962 OT HOH 149 -19.609 -8.4312 7.13221 1.00 0.00 WATR +ATOM 963 HT HOH 149 -18.852 -7.8453 7.13221 1.00 0.00 WATR +ATOM 964 HT HOH 149 -20.366 -7.8453 7.13221 1.00 0.00 WATR +ATOM 965 OT HOH 150 -17.146 -5.9680 7.13221 1.00 0.00 WATR +ATOM 966 HT HOH 150 -16.389 -5.3821 7.13221 1.00 0.00 WATR +ATOM 967 HT HOH 150 -17.903 -5.3821 7.13221 1.00 0.00 WATR +ATOM 968 OT HOH 151 -17.146 -8.4312 9.59542 1.00 0.00 WATR +ATOM 969 HT HOH 151 -16.389 -7.8453 9.59542 1.00 0.00 WATR +ATOM 970 HT HOH 151 -17.903 -7.8453 9.59542 1.00 0.00 WATR +ATOM 971 OT HOH 152 -19.609 -5.9680 9.59542 1.00 0.00 WATR +ATOM 972 HT HOH 152 -18.852 -5.3821 9.59542 1.00 0.00 WATR +ATOM 973 HT HOH 152 -20.366 -5.3821 9.59542 1.00 0.00 WATR +ATOM 974 OT HOH 153 -19.609 -3.5048 -12.573 1.00 0.00 WATR +ATOM 975 HT HOH 153 -18.852 -2.9189 -12.573 1.00 0.00 WATR +ATOM 976 HT HOH 153 -20.366 -2.9189 -12.573 1.00 0.00 WATR +ATOM 977 OT HOH 154 -17.146 -1.0416 -12.573 1.00 0.00 WATR +ATOM 978 HT HOH 154 -16.389 -0.4557 -12.573 1.00 0.00 WATR +ATOM 979 HT HOH 154 -17.903 -0.4557 -12.573 1.00 0.00 WATR +ATOM 980 OT HOH 155 -17.146 -3.5048 -10.110 1.00 0.00 WATR +ATOM 981 HT HOH 155 -16.389 -2.9189 -10.110 1.00 0.00 WATR +ATOM 982 HT HOH 155 -17.903 -2.9189 -10.110 1.00 0.00 WATR +ATOM 983 OT HOH 156 -19.609 -1.0416 -10.110 1.00 0.00 WATR +ATOM 984 HT HOH 156 -18.852 -0.4557 -10.110 1.00 0.00 WATR +ATOM 985 HT HOH 156 -20.366 -0.4557 -10.110 1.00 0.00 WATR +ATOM 986 OT HOH 157 -19.609 -3.5048 -7.6470 1.00 0.00 WATR +ATOM 987 HT HOH 157 -18.852 -2.9189 -7.6470 1.00 0.00 WATR +ATOM 988 HT HOH 157 -20.366 -2.9189 -7.6470 1.00 0.00 WATR +ATOM 989 OT HOH 158 -17.146 -1.0416 -7.6470 1.00 0.00 WATR +ATOM 990 HT HOH 158 -16.389 -0.4557 -7.6470 1.00 0.00 WATR +ATOM 991 HT HOH 158 -17.903 -0.4557 -7.6470 1.00 0.00 WATR +ATOM 992 OT HOH 159 -17.146 -3.5048 -5.1838 1.00 0.00 WATR +ATOM 993 HT HOH 159 -16.389 -2.9189 -5.1838 1.00 0.00 WATR +ATOM 994 HT HOH 159 -17.903 -2.9189 -5.1838 1.00 0.00 WATR +ATOM 995 SOD ION 160 -19.609 -1.0416 -5.1838 1.00 0.00 SALT +ATOM 996 OT HOH 161 -19.609 -3.5048 -2.7206 1.00 0.00 WATR +ATOM 997 HT HOH 161 -18.852 -2.9189 -2.7206 1.00 0.00 WATR +ATOM 998 HT HOH 161 -20.366 -2.9189 -2.7206 1.00 0.00 WATR +ATOM 999 OT HOH 162 -17.146 -1.0416 -2.7206 1.00 0.00 WATR +ATOM 1000 HT HOH 162 -16.389 -0.4557 -2.7206 1.00 0.00 WATR +ATOM 1001 HT HOH 162 -17.903 -0.4557 -2.7206 1.00 0.00 WATR +ATOM 1002 OT HOH 163 -17.146 -3.5048 -0.2573 1.00 0.00 WATR +ATOM 1003 HT HOH 163 -16.389 -2.9189 -0.2573 1.00 0.00 WATR +ATOM 1004 HT HOH 163 -17.903 -2.9189 -0.2573 1.00 0.00 WATR +ATOM 1005 OT HOH 164 -19.609 -3.5048 2.20580 1.00 0.00 WATR +ATOM 1006 HT HOH 164 -18.852 -2.9189 2.20580 1.00 0.00 WATR +ATOM 1007 HT HOH 164 -20.366 -2.9189 2.20580 1.00 0.00 WATR +ATOM 1008 OT HOH 165 -17.146 -3.5048 4.66901 1.00 0.00 WATR +ATOM 1009 HT HOH 165 -16.389 -2.9189 4.66901 1.00 0.00 WATR +ATOM 1010 HT HOH 165 -17.903 -2.9189 4.66901 1.00 0.00 WATR +ATOM 1011 OT HOH 166 -19.609 -1.0416 4.66901 1.00 0.00 WATR +ATOM 1012 HT HOH 166 -18.852 -0.4557 4.66901 1.00 0.00 WATR +ATOM 1013 HT HOH 166 -20.366 -0.4557 4.66901 1.00 0.00 WATR +ATOM 1014 OT HOH 167 -19.609 -3.5048 7.13221 1.00 0.00 WATR +ATOM 1015 HT HOH 167 -18.852 -2.9189 7.13221 1.00 0.00 WATR +ATOM 1016 HT HOH 167 -20.366 -2.9189 7.13221 1.00 0.00 WATR +ATOM 1017 OT HOH 168 -17.146 -1.0416 7.13221 1.00 0.00 WATR +ATOM 1018 HT HOH 168 -16.389 -0.4557 7.13221 1.00 0.00 WATR +ATOM 1019 HT HOH 168 -17.903 -0.4557 7.13221 1.00 0.00 WATR +ATOM 1020 OT HOH 169 -17.146 -3.5048 9.59542 1.00 0.00 WATR +ATOM 1021 HT HOH 169 -16.389 -2.9189 9.59542 1.00 0.00 WATR +ATOM 1022 HT HOH 169 -17.903 -2.9189 9.59542 1.00 0.00 WATR +ATOM 1023 OT HOH 170 -19.609 -1.0416 9.59542 1.00 0.00 WATR +ATOM 1024 HT HOH 170 -18.852 -0.4557 9.59542 1.00 0.00 WATR +ATOM 1025 HT HOH 170 -20.366 -0.4557 9.59542 1.00 0.00 WATR +ATOM 1026 OT HOH 171 -19.609 1.42160 -12.573 1.00 0.00 WATR +ATOM 1027 HT HOH 171 -18.852 2.00748 -12.573 1.00 0.00 WATR +ATOM 1028 HT HOH 171 -20.366 2.00748 -12.573 1.00 0.00 WATR +ATOM 1029 OT HOH 172 -17.146 3.88480 -12.573 1.00 0.00 WATR +ATOM 1030 HT HOH 172 -16.389 4.47069 -12.573 1.00 0.00 WATR +ATOM 1031 HT HOH 172 -17.903 4.47069 -12.573 1.00 0.00 WATR +ATOM 1032 OT HOH 173 -17.146 1.42160 -10.110 1.00 0.00 WATR +ATOM 1033 HT HOH 173 -16.389 2.00748 -10.110 1.00 0.00 WATR +ATOM 1034 HT HOH 173 -17.903 2.00748 -10.110 1.00 0.00 WATR +ATOM 1035 OT HOH 174 -19.609 3.88480 -10.110 1.00 0.00 WATR +ATOM 1036 HT HOH 174 -18.852 4.47069 -10.110 1.00 0.00 WATR +ATOM 1037 HT HOH 174 -20.366 4.47069 -10.110 1.00 0.00 WATR +ATOM 1038 OT HOH 175 -19.609 1.42160 -7.6470 1.00 0.00 WATR +ATOM 1039 HT HOH 175 -18.852 2.00748 -7.6470 1.00 0.00 WATR +ATOM 1040 HT HOH 175 -20.366 2.00748 -7.6470 1.00 0.00 WATR +ATOM 1041 OT HOH 176 -17.146 3.88480 -7.6470 1.00 0.00 WATR +ATOM 1042 HT HOH 176 -16.389 4.47069 -7.6470 1.00 0.00 WATR +ATOM 1043 HT HOH 176 -17.903 4.47069 -7.6470 1.00 0.00 WATR +ATOM 1044 OT HOH 177 -17.146 1.42160 -5.1838 1.00 0.00 WATR +ATOM 1045 HT HOH 177 -16.389 2.00748 -5.1838 1.00 0.00 WATR +ATOM 1046 HT HOH 177 -17.903 2.00748 -5.1838 1.00 0.00 WATR +ATOM 1047 OT HOH 178 -19.609 3.88480 -5.1838 1.00 0.00 WATR +ATOM 1048 HT HOH 178 -18.852 4.47069 -5.1838 1.00 0.00 WATR +ATOM 1049 HT HOH 178 -20.366 4.47069 -5.1838 1.00 0.00 WATR +ATOM 1050 OT HOH 179 -19.609 1.42160 -2.7206 1.00 0.00 WATR +ATOM 1051 HT HOH 179 -18.852 2.00748 -2.7206 1.00 0.00 WATR +ATOM 1052 HT HOH 179 -20.366 2.00748 -2.7206 1.00 0.00 WATR +ATOM 1053 OT HOH 180 -17.146 3.88480 -2.7206 1.00 0.00 WATR +ATOM 1054 HT HOH 180 -16.389 4.47069 -2.7206 1.00 0.00 WATR +ATOM 1055 HT HOH 180 -17.903 4.47069 -2.7206 1.00 0.00 WATR +ATOM 1056 OT HOH 181 -19.609 3.88480 -0.2573 1.00 0.00 WATR +ATOM 1057 HT HOH 181 -18.852 4.47069 -0.2573 1.00 0.00 WATR +ATOM 1058 HT HOH 181 -20.366 4.47069 -0.2573 1.00 0.00 WATR +ATOM 1059 OT HOH 182 -17.146 3.88480 2.20580 1.00 0.00 WATR +ATOM 1060 HT HOH 182 -16.389 4.47069 2.20580 1.00 0.00 WATR +ATOM 1061 HT HOH 182 -17.903 4.47069 2.20580 1.00 0.00 WATR +ATOM 1062 OT HOH 183 -17.146 1.42160 4.66901 1.00 0.00 WATR +ATOM 1063 HT HOH 183 -16.389 2.00748 4.66901 1.00 0.00 WATR +ATOM 1064 HT HOH 183 -17.903 2.00748 4.66901 1.00 0.00 WATR +ATOM 1065 OT HOH 184 -19.609 3.88480 4.66901 1.00 0.00 WATR +ATOM 1066 HT HOH 184 -18.852 4.47069 4.66901 1.00 0.00 WATR +ATOM 1067 HT HOH 184 -20.366 4.47069 4.66901 1.00 0.00 WATR +ATOM 1068 OT HOH 185 -19.609 1.42160 7.13221 1.00 0.00 WATR +ATOM 1069 HT HOH 185 -18.852 2.00748 7.13221 1.00 0.00 WATR +ATOM 1070 HT HOH 185 -20.366 2.00748 7.13221 1.00 0.00 WATR +ATOM 1071 OT HOH 186 -17.146 3.88480 7.13221 1.00 0.00 WATR +ATOM 1072 HT HOH 186 -16.389 4.47069 7.13221 1.00 0.00 WATR +ATOM 1073 HT HOH 186 -17.903 4.47069 7.13221 1.00 0.00 WATR +ATOM 1074 OT HOH 187 -17.146 1.42160 9.59542 1.00 0.00 WATR +ATOM 1075 HT HOH 187 -16.389 2.00748 9.59542 1.00 0.00 WATR +ATOM 1076 HT HOH 187 -17.903 2.00748 9.59542 1.00 0.00 WATR +ATOM 1077 OT HOH 188 -19.609 3.88480 9.59542 1.00 0.00 WATR +ATOM 1078 HT HOH 188 -18.852 4.47069 9.59542 1.00 0.00 WATR +ATOM 1079 HT HOH 188 -20.366 4.47069 9.59542 1.00 0.00 WATR +ATOM 1080 OT HOH 189 -19.609 6.34801 -12.573 1.00 0.00 WATR +ATOM 1081 HT HOH 189 -18.852 6.93389 -12.573 1.00 0.00 WATR +ATOM 1082 HT HOH 189 -20.366 6.93389 -12.573 1.00 0.00 WATR +ATOM 1083 OT HOH 190 -17.146 8.81121 -12.573 1.00 0.00 WATR +ATOM 1084 HT HOH 190 -16.389 9.39710 -12.573 1.00 0.00 WATR +ATOM 1085 HT HOH 190 -17.903 9.39710 -12.573 1.00 0.00 WATR +ATOM 1086 OT HOH 191 -17.146 6.34801 -10.110 1.00 0.00 WATR +ATOM 1087 HT HOH 191 -16.389 6.93389 -10.110 1.00 0.00 WATR +ATOM 1088 HT HOH 191 -17.903 6.93389 -10.110 1.00 0.00 WATR +ATOM 1089 OT HOH 192 -19.609 8.81121 -10.110 1.00 0.00 WATR +ATOM 1090 HT HOH 192 -18.852 9.39710 -10.110 1.00 0.00 WATR +ATOM 1091 HT HOH 192 -20.366 9.39710 -10.110 1.00 0.00 WATR +ATOM 1092 OT HOH 193 -19.609 6.34801 -7.6470 1.00 0.00 WATR +ATOM 1093 HT HOH 193 -18.852 6.93389 -7.6470 1.00 0.00 WATR +ATOM 1094 HT HOH 193 -20.366 6.93389 -7.6470 1.00 0.00 WATR +ATOM 1095 OT HOH 194 -17.146 8.81121 -7.6470 1.00 0.00 WATR +ATOM 1096 HT HOH 194 -16.389 9.39710 -7.6470 1.00 0.00 WATR +ATOM 1097 HT HOH 194 -17.903 9.39710 -7.6470 1.00 0.00 WATR +ATOM 1098 OT HOH 195 -17.146 6.34801 -5.1838 1.00 0.00 WATR +ATOM 1099 HT HOH 195 -16.389 6.93389 -5.1838 1.00 0.00 WATR +ATOM 1100 HT HOH 195 -17.903 6.93389 -5.1838 1.00 0.00 WATR +ATOM 1101 OT HOH 196 -19.609 8.81121 -5.1838 1.00 0.00 WATR +ATOM 1102 HT HOH 196 -18.852 9.39710 -5.1838 1.00 0.00 WATR +ATOM 1103 HT HOH 196 -20.366 9.39710 -5.1838 1.00 0.00 WATR +ATOM 1104 OT HOH 197 -19.609 6.34801 -2.7206 1.00 0.00 WATR +ATOM 1105 HT HOH 197 -18.852 6.93389 -2.7206 1.00 0.00 WATR +ATOM 1106 HT HOH 197 -20.366 6.93389 -2.7206 1.00 0.00 WATR +ATOM 1107 OT HOH 198 -19.609 8.81121 -0.2573 1.00 0.00 WATR +ATOM 1108 HT HOH 198 -18.852 9.39710 -0.2573 1.00 0.00 WATR +ATOM 1109 HT HOH 198 -20.366 9.39710 -0.2573 1.00 0.00 WATR +ATOM 1110 OT HOH 199 -19.609 6.34801 2.20580 1.00 0.00 WATR +ATOM 1111 HT HOH 199 -18.852 6.93389 2.20580 1.00 0.00 WATR +ATOM 1112 HT HOH 199 -20.366 6.93389 2.20580 1.00 0.00 WATR +ATOM 1113 OT HOH 200 -17.146 8.81121 2.20580 1.00 0.00 WATR +ATOM 1114 HT HOH 200 -16.389 9.39710 2.20580 1.00 0.00 WATR +ATOM 1115 HT HOH 200 -17.903 9.39710 2.20580 1.00 0.00 WATR +ATOM 1116 OT HOH 201 -17.146 6.34801 4.66901 1.00 0.00 WATR +ATOM 1117 HT HOH 201 -16.389 6.93389 4.66901 1.00 0.00 WATR +ATOM 1118 HT HOH 201 -17.903 6.93389 4.66901 1.00 0.00 WATR +ATOM 1119 OT HOH 202 -19.609 8.81121 4.66901 1.00 0.00 WATR +ATOM 1120 HT HOH 202 -18.852 9.39710 4.66901 1.00 0.00 WATR +ATOM 1121 HT HOH 202 -20.366 9.39710 4.66901 1.00 0.00 WATR +ATOM 1122 OT HOH 203 -19.609 6.34801 7.13221 1.00 0.00 WATR +ATOM 1123 HT HOH 203 -18.852 6.93389 7.13221 1.00 0.00 WATR +ATOM 1124 HT HOH 203 -20.366 6.93389 7.13221 1.00 0.00 WATR +ATOM 1125 OT HOH 204 -17.146 8.81121 7.13221 1.00 0.00 WATR +ATOM 1126 HT HOH 204 -16.389 9.39710 7.13221 1.00 0.00 WATR +ATOM 1127 HT HOH 204 -17.903 9.39710 7.13221 1.00 0.00 WATR +ATOM 1128 OT HOH 205 -17.146 6.34801 9.59542 1.00 0.00 WATR +ATOM 1129 HT HOH 205 -16.389 6.93389 9.59542 1.00 0.00 WATR +ATOM 1130 HT HOH 205 -17.903 6.93389 9.59542 1.00 0.00 WATR +ATOM 1131 OT HOH 206 -19.609 8.81121 9.59542 1.00 0.00 WATR +ATOM 1132 HT HOH 206 -18.852 9.39710 9.59542 1.00 0.00 WATR +ATOM 1133 HT HOH 206 -20.366 9.39710 9.59542 1.00 0.00 WATR +ATOM 1134 OT HOH 207 -19.609 11.2744 -12.573 1.00 0.00 WATR +ATOM 1135 HT HOH 207 -18.852 11.8603 -12.573 1.00 0.00 WATR +ATOM 1136 HT HOH 207 -20.366 11.8603 -12.573 1.00 0.00 WATR +ATOM 1137 OT HOH 208 -17.146 13.7376 -12.573 1.00 0.00 WATR +ATOM 1138 HT HOH 208 -16.389 14.3235 -12.573 1.00 0.00 WATR +ATOM 1139 HT HOH 208 -17.903 14.3235 -12.573 1.00 0.00 WATR +ATOM 1140 OT HOH 209 -17.146 11.2744 -10.110 1.00 0.00 WATR +ATOM 1141 HT HOH 209 -16.389 11.8603 -10.110 1.00 0.00 WATR +ATOM 1142 HT HOH 209 -17.903 11.8603 -10.110 1.00 0.00 WATR +ATOM 1143 OT HOH 210 -19.609 13.7376 -10.110 1.00 0.00 WATR +ATOM 1144 HT HOH 210 -18.852 14.3235 -10.110 1.00 0.00 WATR +ATOM 1145 HT HOH 210 -20.366 14.3235 -10.110 1.00 0.00 WATR +ATOM 1146 OT HOH 211 -19.609 11.2744 -7.6470 1.00 0.00 WATR +ATOM 1147 HT HOH 211 -18.852 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1148 HT HOH 211 -20.366 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1149 OT HOH 212 -17.146 13.7376 -7.6470 1.00 0.00 WATR +ATOM 1150 HT HOH 212 -16.389 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1151 HT HOH 212 -17.903 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1152 OT HOH 213 -17.146 11.2744 -5.1838 1.00 0.00 WATR +ATOM 1153 HT HOH 213 -16.389 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1154 HT HOH 213 -17.903 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1155 OT HOH 214 -19.609 13.7376 -5.1838 1.00 0.00 WATR +ATOM 1156 HT HOH 214 -18.852 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1157 HT HOH 214 -20.366 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1158 OT HOH 215 -19.609 11.2744 -2.7206 1.00 0.00 WATR +ATOM 1159 HT HOH 215 -18.852 11.8603 -2.7206 1.00 0.00 WATR +ATOM 1160 HT HOH 215 -20.366 11.8603 -2.7206 1.00 0.00 WATR +ATOM 1161 OT HOH 216 -17.146 13.7376 -2.7206 1.00 0.00 WATR +ATOM 1162 HT HOH 216 -16.389 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1163 HT HOH 216 -17.903 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1164 OT HOH 217 -17.146 11.2744 -0.2573 1.00 0.00 WATR +ATOM 1165 HT HOH 217 -16.389 11.8603 -0.2573 1.00 0.00 WATR +ATOM 1166 HT HOH 217 -17.903 11.8603 -0.2573 1.00 0.00 WATR +ATOM 1167 OT HOH 218 -19.609 13.7376 -0.2573 1.00 0.00 WATR +ATOM 1168 HT HOH 218 -18.852 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1169 HT HOH 218 -20.366 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1170 OT HOH 219 -19.609 11.2744 2.20580 1.00 0.00 WATR +ATOM 1171 HT HOH 219 -18.852 11.8603 2.20580 1.00 0.00 WATR +ATOM 1172 HT HOH 219 -20.366 11.8603 2.20580 1.00 0.00 WATR +ATOM 1173 OT HOH 220 -17.146 13.7376 2.20580 1.00 0.00 WATR +ATOM 1174 HT HOH 220 -16.389 14.3235 2.20580 1.00 0.00 WATR +ATOM 1175 HT HOH 220 -17.903 14.3235 2.20580 1.00 0.00 WATR +ATOM 1176 OT HOH 221 -17.146 11.2744 4.66901 1.00 0.00 WATR +ATOM 1177 HT HOH 221 -16.389 11.8603 4.66901 1.00 0.00 WATR +ATOM 1178 HT HOH 221 -17.903 11.8603 4.66901 1.00 0.00 WATR +ATOM 1179 OT HOH 222 -19.609 13.7376 4.66901 1.00 0.00 WATR +ATOM 1180 HT HOH 222 -18.852 14.3235 4.66901 1.00 0.00 WATR +ATOM 1181 HT HOH 222 -20.366 14.3235 4.66901 1.00 0.00 WATR +ATOM 1182 OT HOH 223 -19.609 11.2744 7.13221 1.00 0.00 WATR +ATOM 1183 HT HOH 223 -18.852 11.8603 7.13221 1.00 0.00 WATR +ATOM 1184 HT HOH 223 -20.366 11.8603 7.13221 1.00 0.00 WATR +ATOM 1185 OT HOH 224 -17.146 13.7376 7.13221 1.00 0.00 WATR +ATOM 1186 HT HOH 224 -16.389 14.3235 7.13221 1.00 0.00 WATR +ATOM 1187 HT HOH 224 -17.903 14.3235 7.13221 1.00 0.00 WATR +ATOM 1188 OT HOH 225 -17.146 11.2744 9.59542 1.00 0.00 WATR +ATOM 1189 HT HOH 225 -16.389 11.8603 9.59542 1.00 0.00 WATR +ATOM 1190 HT HOH 225 -17.903 11.8603 9.59542 1.00 0.00 WATR +ATOM 1191 OT HOH 226 -19.609 13.7376 9.59542 1.00 0.00 WATR +ATOM 1192 HT HOH 226 -18.852 14.3235 9.59542 1.00 0.00 WATR +ATOM 1193 HT HOH 226 -20.366 14.3235 9.59542 1.00 0.00 WATR +ATOM 1194 OT HOH 227 -14.683 -13.357 -12.573 1.00 0.00 WATR +ATOM 1195 HT HOH 227 -13.926 -12.771 -12.573 1.00 0.00 WATR +ATOM 1196 HT HOH 227 -15.440 -12.771 -12.573 1.00 0.00 WATR +ATOM 1197 OT HOH 228 -12.220 -10.894 -12.573 1.00 0.00 WATR +ATOM 1198 HT HOH 228 -11.463 -10.308 -12.573 1.00 0.00 WATR +ATOM 1199 HT HOH 228 -12.977 -10.308 -12.573 1.00 0.00 WATR +ATOM 1200 OT HOH 229 -12.220 -13.357 -10.110 1.00 0.00 WATR +ATOM 1201 HT HOH 229 -11.463 -12.771 -10.110 1.00 0.00 WATR +ATOM 1202 HT HOH 229 -12.977 -12.771 -10.110 1.00 0.00 WATR +ATOM 1203 OT HOH 230 -14.683 -10.894 -10.110 1.00 0.00 WATR +ATOM 1204 HT HOH 230 -13.926 -10.308 -10.110 1.00 0.00 WATR +ATOM 1205 HT HOH 230 -15.440 -10.308 -10.110 1.00 0.00 WATR +ATOM 1206 OT HOH 231 -14.683 -13.357 -7.6470 1.00 0.00 WATR +ATOM 1207 HT HOH 231 -13.926 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1208 HT HOH 231 -15.440 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1209 OT HOH 232 -12.220 -10.894 -7.6470 1.00 0.00 WATR +ATOM 1210 HT HOH 232 -11.463 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1211 HT HOH 232 -12.977 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1212 OT HOH 233 -12.220 -13.357 -5.1838 1.00 0.00 WATR +ATOM 1213 HT HOH 233 -11.463 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1214 HT HOH 233 -12.977 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1215 OT HOH 234 -14.683 -10.894 -5.1838 1.00 0.00 WATR +ATOM 1216 HT HOH 234 -13.926 -10.308 -5.1838 1.00 0.00 WATR +ATOM 1217 HT HOH 234 -15.440 -10.308 -5.1838 1.00 0.00 WATR +ATOM 1218 OT HOH 235 -14.683 -13.357 -2.7206 1.00 0.00 WATR +ATOM 1219 HT HOH 235 -13.926 -12.771 -2.7206 1.00 0.00 WATR +ATOM 1220 HT HOH 235 -15.440 -12.771 -2.7206 1.00 0.00 WATR +ATOM 1221 OT HOH 236 -14.683 -10.894 -0.2573 1.00 0.00 WATR +ATOM 1222 HT HOH 236 -13.926 -10.308 -0.2573 1.00 0.00 WATR +ATOM 1223 HT HOH 236 -15.440 -10.308 -0.2573 1.00 0.00 WATR +ATOM 1224 OT HOH 237 -14.683 -13.357 2.20580 1.00 0.00 WATR +ATOM 1225 HT HOH 237 -13.926 -12.771 2.20580 1.00 0.00 WATR +ATOM 1226 HT HOH 237 -15.440 -12.771 2.20580 1.00 0.00 WATR +ATOM 1227 OT HOH 238 -12.220 -13.357 4.66901 1.00 0.00 WATR +ATOM 1228 HT HOH 238 -11.463 -12.771 4.66901 1.00 0.00 WATR +ATOM 1229 HT HOH 238 -12.977 -12.771 4.66901 1.00 0.00 WATR +ATOM 1230 OT HOH 239 -14.683 -10.894 4.66901 1.00 0.00 WATR +ATOM 1231 HT HOH 239 -13.926 -10.308 4.66901 1.00 0.00 WATR +ATOM 1232 HT HOH 239 -15.440 -10.308 4.66901 1.00 0.00 WATR +ATOM 1233 OT HOH 240 -14.683 -13.357 7.13221 1.00 0.00 WATR +ATOM 1234 HT HOH 240 -13.926 -12.771 7.13221 1.00 0.00 WATR +ATOM 1235 HT HOH 240 -15.440 -12.771 7.13221 1.00 0.00 WATR +ATOM 1236 OT HOH 241 -12.220 -10.894 7.13221 1.00 0.00 WATR +ATOM 1237 HT HOH 241 -11.463 -10.308 7.13221 1.00 0.00 WATR +ATOM 1238 HT HOH 241 -12.977 -10.308 7.13221 1.00 0.00 WATR +ATOM 1239 OT HOH 242 -12.220 -13.357 9.59542 1.00 0.00 WATR +ATOM 1240 HT HOH 242 -11.463 -12.771 9.59542 1.00 0.00 WATR +ATOM 1241 HT HOH 242 -12.977 -12.771 9.59542 1.00 0.00 WATR +ATOM 1242 OT HOH 243 -14.683 -10.894 9.59542 1.00 0.00 WATR +ATOM 1243 HT HOH 243 -13.926 -10.308 9.59542 1.00 0.00 WATR +ATOM 1244 HT HOH 243 -15.440 -10.308 9.59542 1.00 0.00 WATR +ATOM 1245 OT HOH 244 -14.683 -8.4312 -12.573 1.00 0.00 WATR +ATOM 1246 HT HOH 244 -13.926 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1247 HT HOH 244 -15.440 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1248 OT HOH 245 -12.220 -5.9680 -12.573 1.00 0.00 WATR +ATOM 1249 HT HOH 245 -11.463 -5.3821 -12.573 1.00 0.00 WATR +ATOM 1250 HT HOH 245 -12.977 -5.3821 -12.573 1.00 0.00 WATR +ATOM 1251 OT HOH 246 -12.220 -8.4312 -10.110 1.00 0.00 WATR +ATOM 1252 HT HOH 246 -11.463 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1253 HT HOH 246 -12.977 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1254 OT HOH 247 -14.683 -5.9680 -10.110 1.00 0.00 WATR +ATOM 1255 HT HOH 247 -13.926 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1256 HT HOH 247 -15.440 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1257 OT HOH 248 -14.683 -8.4312 -7.6470 1.00 0.00 WATR +ATOM 1258 HT HOH 248 -13.926 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 1259 HT HOH 248 -15.440 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 1260 OT HOH 249 -14.683 -8.4312 -2.7206 1.00 0.00 WATR +ATOM 1261 HT HOH 249 -13.926 -7.8453 -2.7206 1.00 0.00 WATR +ATOM 1262 HT HOH 249 -15.440 -7.8453 -2.7206 1.00 0.00 WATR +ATOM 1263 OT HOH 250 -14.683 -8.4312 7.13221 1.00 0.00 WATR +ATOM 1264 HT HOH 250 -13.926 -7.8453 7.13221 1.00 0.00 WATR +ATOM 1265 HT HOH 250 -15.440 -7.8453 7.13221 1.00 0.00 WATR +ATOM 1266 OT HOH 251 -12.220 -5.9680 7.13221 1.00 0.00 WATR +ATOM 1267 HT HOH 251 -11.463 -5.3821 7.13221 1.00 0.00 WATR +ATOM 1268 HT HOH 251 -12.977 -5.3821 7.13221 1.00 0.00 WATR +ATOM 1269 OT HOH 252 -12.220 -8.4312 9.59542 1.00 0.00 WATR +ATOM 1270 HT HOH 252 -11.463 -7.8453 9.59542 1.00 0.00 WATR +ATOM 1271 HT HOH 252 -12.977 -7.8453 9.59542 1.00 0.00 WATR +ATOM 1272 OT HOH 253 -14.683 -5.9680 9.59542 1.00 0.00 WATR +ATOM 1273 HT HOH 253 -13.926 -5.3821 9.59542 1.00 0.00 WATR +ATOM 1274 HT HOH 253 -15.440 -5.3821 9.59542 1.00 0.00 WATR +ATOM 1275 OT HOH 254 -14.683 -3.5048 -12.573 1.00 0.00 WATR +ATOM 1276 HT HOH 254 -13.926 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1277 HT HOH 254 -15.440 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1278 OT HOH 255 -12.220 -1.0416 -12.573 1.00 0.00 WATR +ATOM 1279 HT HOH 255 -11.463 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1280 HT HOH 255 -12.977 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1281 OT HOH 256 -12.220 -3.5048 -10.110 1.00 0.00 WATR +ATOM 1282 HT HOH 256 -11.463 -2.9189 -10.110 1.00 0.00 WATR +ATOM 1283 HT HOH 256 -12.977 -2.9189 -10.110 1.00 0.00 WATR +ATOM 1284 OT HOH 257 -14.683 -1.0416 -10.110 1.00 0.00 WATR +ATOM 1285 HT HOH 257 -13.926 -0.4557 -10.110 1.00 0.00 WATR +ATOM 1286 HT HOH 257 -15.440 -0.4557 -10.110 1.00 0.00 WATR +ATOM 1287 OT HOH 258 -14.683 -3.5048 -7.6470 1.00 0.00 WATR +ATOM 1288 HT HOH 258 -13.926 -2.9189 -7.6470 1.00 0.00 WATR +ATOM 1289 HT HOH 258 -15.440 -2.9189 -7.6470 1.00 0.00 WATR +ATOM 1290 OT HOH 259 -12.220 -1.0416 -7.6470 1.00 0.00 WATR +ATOM 1291 HT HOH 259 -11.463 -0.4557 -7.6470 1.00 0.00 WATR +ATOM 1292 HT HOH 259 -12.977 -0.4557 -7.6470 1.00 0.00 WATR +ATOM 1293 OT HOH 260 -14.683 -1.0416 -5.1838 1.00 0.00 WATR +ATOM 1294 HT HOH 260 -13.926 -0.4557 -5.1838 1.00 0.00 WATR +ATOM 1295 HT HOH 260 -15.440 -0.4557 -5.1838 1.00 0.00 WATR +ATOM 1296 OT HOH 261 -14.683 -3.5048 -2.7206 1.00 0.00 WATR +ATOM 1297 HT HOH 261 -13.926 -2.9189 -2.7206 1.00 0.00 WATR +ATOM 1298 HT HOH 261 -15.440 -2.9189 -2.7206 1.00 0.00 WATR +ATOM 1299 OT HOH 262 -14.683 -3.5048 7.13221 1.00 0.00 WATR +ATOM 1300 HT HOH 262 -13.926 -2.9189 7.13221 1.00 0.00 WATR +ATOM 1301 HT HOH 262 -15.440 -2.9189 7.13221 1.00 0.00 WATR +ATOM 1302 OT HOH 263 -12.220 -3.5048 9.59542 1.00 0.00 WATR +ATOM 1303 HT HOH 263 -11.463 -2.9189 9.59542 1.00 0.00 WATR +ATOM 1304 HT HOH 263 -12.977 -2.9189 9.59542 1.00 0.00 WATR +ATOM 1305 OT HOH 264 -14.683 -1.0416 9.59542 1.00 0.00 WATR +ATOM 1306 HT HOH 264 -13.926 -0.4557 9.59542 1.00 0.00 WATR +ATOM 1307 HT HOH 264 -15.440 -0.4557 9.59542 1.00 0.00 WATR +ATOM 1308 OT HOH 265 -14.683 1.42160 -12.573 1.00 0.00 WATR +ATOM 1309 HT HOH 265 -13.926 2.00748 -12.573 1.00 0.00 WATR +ATOM 1310 HT HOH 265 -15.440 2.00748 -12.573 1.00 0.00 WATR +ATOM 1311 OT HOH 266 -12.220 3.88480 -12.573 1.00 0.00 WATR +ATOM 1312 HT HOH 266 -11.463 4.47069 -12.573 1.00 0.00 WATR +ATOM 1313 HT HOH 266 -12.977 4.47069 -12.573 1.00 0.00 WATR +ATOM 1314 OT HOH 267 -12.220 1.42160 -10.110 1.00 0.00 WATR +ATOM 1315 HT HOH 267 -11.463 2.00748 -10.110 1.00 0.00 WATR +ATOM 1316 HT HOH 267 -12.977 2.00748 -10.110 1.00 0.00 WATR +ATOM 1317 OT HOH 268 -14.683 3.88480 -10.110 1.00 0.00 WATR +ATOM 1318 HT HOH 268 -13.926 4.47069 -10.110 1.00 0.00 WATR +ATOM 1319 HT HOH 268 -15.440 4.47069 -10.110 1.00 0.00 WATR +ATOM 1320 OT HOH 269 -14.683 1.42160 -7.6470 1.00 0.00 WATR +ATOM 1321 HT HOH 269 -13.926 2.00748 -7.6470 1.00 0.00 WATR +ATOM 1322 HT HOH 269 -15.440 2.00748 -7.6470 1.00 0.00 WATR +ATOM 1323 OT HOH 270 -14.683 1.42160 7.13221 1.00 0.00 WATR +ATOM 1324 HT HOH 270 -13.926 2.00748 7.13221 1.00 0.00 WATR +ATOM 1325 HT HOH 270 -15.440 2.00748 7.13221 1.00 0.00 WATR +ATOM 1326 OT HOH 271 -14.683 6.34801 -12.573 1.00 0.00 WATR +ATOM 1327 HT HOH 271 -13.926 6.93389 -12.573 1.00 0.00 WATR +ATOM 1328 HT HOH 271 -15.440 6.93389 -12.573 1.00 0.00 WATR +ATOM 1329 OT HOH 272 -12.220 8.81121 -12.573 1.00 0.00 WATR +ATOM 1330 HT HOH 272 -11.463 9.39710 -12.573 1.00 0.00 WATR +ATOM 1331 HT HOH 272 -12.977 9.39710 -12.573 1.00 0.00 WATR +ATOM 1332 OT HOH 273 -12.220 6.34801 -10.110 1.00 0.00 WATR +ATOM 1333 HT HOH 273 -11.463 6.93389 -10.110 1.00 0.00 WATR +ATOM 1334 HT HOH 273 -12.977 6.93389 -10.110 1.00 0.00 WATR +ATOM 1335 OT HOH 274 -14.683 8.81121 -10.110 1.00 0.00 WATR +ATOM 1336 HT HOH 274 -13.926 9.39710 -10.110 1.00 0.00 WATR +ATOM 1337 HT HOH 274 -15.440 9.39710 -10.110 1.00 0.00 WATR +ATOM 1338 OT HOH 275 -14.683 6.34801 -7.6470 1.00 0.00 WATR +ATOM 1339 HT HOH 275 -13.926 6.93389 -7.6470 1.00 0.00 WATR +ATOM 1340 HT HOH 275 -15.440 6.93389 -7.6470 1.00 0.00 WATR +ATOM 1341 OT HOH 276 -12.220 8.81121 -7.6470 1.00 0.00 WATR +ATOM 1342 HT HOH 276 -11.463 9.39710 -7.6470 1.00 0.00 WATR +ATOM 1343 HT HOH 276 -12.977 9.39710 -7.6470 1.00 0.00 WATR +ATOM 1344 OT HOH 277 -12.220 6.34801 4.66901 1.00 0.00 WATR +ATOM 1345 HT HOH 277 -11.463 6.93389 4.66901 1.00 0.00 WATR +ATOM 1346 HT HOH 277 -12.977 6.93389 4.66901 1.00 0.00 WATR +ATOM 1347 OT HOH 278 -14.683 8.81121 4.66901 1.00 0.00 WATR +ATOM 1348 HT HOH 278 -13.926 9.39710 4.66901 1.00 0.00 WATR +ATOM 1349 HT HOH 278 -15.440 9.39710 4.66901 1.00 0.00 WATR +ATOM 1350 OT HOH 279 -14.683 6.34801 7.13221 1.00 0.00 WATR +ATOM 1351 HT HOH 279 -13.926 6.93389 7.13221 1.00 0.00 WATR +ATOM 1352 HT HOH 279 -15.440 6.93389 7.13221 1.00 0.00 WATR +ATOM 1353 OT HOH 280 -12.220 8.81121 7.13221 1.00 0.00 WATR +ATOM 1354 HT HOH 280 -11.463 9.39710 7.13221 1.00 0.00 WATR +ATOM 1355 HT HOH 280 -12.977 9.39710 7.13221 1.00 0.00 WATR +ATOM 1356 OT HOH 281 -14.683 8.81121 9.59542 1.00 0.00 WATR +ATOM 1357 HT HOH 281 -13.926 9.39710 9.59542 1.00 0.00 WATR +ATOM 1358 HT HOH 281 -15.440 9.39710 9.59542 1.00 0.00 WATR +ATOM 1359 OT HOH 282 -14.683 11.2744 -12.573 1.00 0.00 WATR +ATOM 1360 HT HOH 282 -13.926 11.8603 -12.573 1.00 0.00 WATR +ATOM 1361 HT HOH 282 -15.440 11.8603 -12.573 1.00 0.00 WATR +ATOM 1362 OT HOH 283 -12.220 13.7376 -12.573 1.00 0.00 WATR +ATOM 1363 HT HOH 283 -11.463 14.3235 -12.573 1.00 0.00 WATR +ATOM 1364 HT HOH 283 -12.977 14.3235 -12.573 1.00 0.00 WATR +ATOM 1365 OT HOH 284 -12.220 11.2744 -10.110 1.00 0.00 WATR +ATOM 1366 HT HOH 284 -11.463 11.8603 -10.110 1.00 0.00 WATR +ATOM 1367 HT HOH 284 -12.977 11.8603 -10.110 1.00 0.00 WATR +ATOM 1368 OT HOH 285 -14.683 13.7376 -10.110 1.00 0.00 WATR +ATOM 1369 HT HOH 285 -13.926 14.3235 -10.110 1.00 0.00 WATR +ATOM 1370 HT HOH 285 -15.440 14.3235 -10.110 1.00 0.00 WATR +ATOM 1371 OT HOH 286 -14.683 11.2744 -7.6470 1.00 0.00 WATR +ATOM 1372 HT HOH 286 -13.926 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1373 HT HOH 286 -15.440 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1374 OT HOH 287 -12.220 13.7376 -7.6470 1.00 0.00 WATR +ATOM 1375 HT HOH 287 -11.463 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1376 HT HOH 287 -12.977 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1377 OT HOH 288 -12.220 11.2744 -5.1838 1.00 0.00 WATR +ATOM 1378 HT HOH 288 -11.463 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1379 HT HOH 288 -12.977 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1380 OT HOH 289 -14.683 13.7376 -5.1838 1.00 0.00 WATR +ATOM 1381 HT HOH 289 -13.926 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1382 HT HOH 289 -15.440 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1383 OT HOH 290 -14.683 11.2744 -2.7206 1.00 0.00 WATR +ATOM 1384 HT HOH 290 -13.926 11.8603 -2.7206 1.00 0.00 WATR +ATOM 1385 HT HOH 290 -15.440 11.8603 -2.7206 1.00 0.00 WATR +ATOM 1386 OT HOH 291 -12.220 13.7376 -2.7206 1.00 0.00 WATR +ATOM 1387 HT HOH 291 -11.463 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1388 HT HOH 291 -12.977 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1389 OT HOH 292 -12.220 11.2744 -0.2573 1.00 0.00 WATR +ATOM 1390 HT HOH 292 -11.463 11.8603 -0.2573 1.00 0.00 WATR +ATOM 1391 HT HOH 292 -12.977 11.8603 -0.2573 1.00 0.00 WATR +ATOM 1392 OT HOH 293 -14.683 13.7376 -0.2573 1.00 0.00 WATR +ATOM 1393 HT HOH 293 -13.926 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1394 HT HOH 293 -15.440 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1395 OT HOH 294 -14.683 11.2744 2.20580 1.00 0.00 WATR +ATOM 1396 HT HOH 294 -13.926 11.8603 2.20580 1.00 0.00 WATR +ATOM 1397 HT HOH 294 -15.440 11.8603 2.20580 1.00 0.00 WATR +ATOM 1398 OT HOH 295 -12.220 13.7376 2.20580 1.00 0.00 WATR +ATOM 1399 HT HOH 295 -11.463 14.3235 2.20580 1.00 0.00 WATR +ATOM 1400 HT HOH 295 -12.977 14.3235 2.20580 1.00 0.00 WATR +ATOM 1401 OT HOH 296 -12.220 11.2744 4.66901 1.00 0.00 WATR +ATOM 1402 HT HOH 296 -11.463 11.8603 4.66901 1.00 0.00 WATR +ATOM 1403 HT HOH 296 -12.977 11.8603 4.66901 1.00 0.00 WATR +ATOM 1404 OT HOH 297 -14.683 13.7376 4.66901 1.00 0.00 WATR +ATOM 1405 HT HOH 297 -13.926 14.3235 4.66901 1.00 0.00 WATR +ATOM 1406 HT HOH 297 -15.440 14.3235 4.66901 1.00 0.00 WATR +ATOM 1407 OT HOH 298 -14.683 11.2744 7.13221 1.00 0.00 WATR +ATOM 1408 HT HOH 298 -13.926 11.8603 7.13221 1.00 0.00 WATR +ATOM 1409 HT HOH 298 -15.440 11.8603 7.13221 1.00 0.00 WATR +ATOM 1410 OT HOH 299 -12.220 13.7376 7.13221 1.00 0.00 WATR +ATOM 1411 HT HOH 299 -11.463 14.3235 7.13221 1.00 0.00 WATR +ATOM 1412 HT HOH 299 -12.977 14.3235 7.13221 1.00 0.00 WATR +ATOM 1413 OT HOH 300 -12.220 11.2744 9.59542 1.00 0.00 WATR +ATOM 1414 HT HOH 300 -11.463 11.8603 9.59542 1.00 0.00 WATR +ATOM 1415 HT HOH 300 -12.977 11.8603 9.59542 1.00 0.00 WATR +ATOM 1416 OT HOH 301 -14.683 13.7376 9.59542 1.00 0.00 WATR +ATOM 1417 HT HOH 301 -13.926 14.3235 9.59542 1.00 0.00 WATR +ATOM 1418 HT HOH 301 -15.440 14.3235 9.59542 1.00 0.00 WATR +ATOM 1419 OT HOH 302 -9.7569 -13.357 -12.573 1.00 0.00 WATR +ATOM 1420 HT HOH 302 -8.9999 -12.771 -12.573 1.00 0.00 WATR +ATOM 1421 HT HOH 302 -10.513 -12.771 -12.573 1.00 0.00 WATR +ATOM 1422 OT HOH 303 -7.2937 -10.894 -12.573 1.00 0.00 WATR +ATOM 1423 HT HOH 303 -6.5367 -10.308 -12.573 1.00 0.00 WATR +ATOM 1424 HT HOH 303 -8.0506 -10.308 -12.573 1.00 0.00 WATR +ATOM 1425 OT HOH 304 -7.2937 -13.357 -10.110 1.00 0.00 WATR +ATOM 1426 HT HOH 304 -6.5367 -12.771 -10.110 1.00 0.00 WATR +ATOM 1427 HT HOH 304 -8.0506 -12.771 -10.110 1.00 0.00 WATR +ATOM 1428 OT HOH 305 -9.7569 -10.894 -10.110 1.00 0.00 WATR +ATOM 1429 HT HOH 305 -8.9999 -10.308 -10.110 1.00 0.00 WATR +ATOM 1430 HT HOH 305 -10.513 -10.308 -10.110 1.00 0.00 WATR +ATOM 1431 OT HOH 306 -9.7569 -13.357 -7.6470 1.00 0.00 WATR +ATOM 1432 HT HOH 306 -8.9999 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1433 HT HOH 306 -10.513 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1434 SOD ION 307 -7.2937 -13.357 4.66901 1.00 0.00 SALT +ATOM 1435 OT HOH 308 -9.7569 -10.894 4.66901 1.00 0.00 WATR +ATOM 1436 HT HOH 308 -8.9999 -10.308 4.66901 1.00 0.00 WATR +ATOM 1437 HT HOH 308 -10.513 -10.308 4.66901 1.00 0.00 WATR +ATOM 1438 OT HOH 309 -9.7569 -13.357 7.13221 1.00 0.00 WATR +ATOM 1439 HT HOH 309 -8.9999 -12.771 7.13221 1.00 0.00 WATR +ATOM 1440 HT HOH 309 -10.513 -12.771 7.13221 1.00 0.00 WATR +ATOM 1441 OT HOH 310 -7.2937 -10.894 7.13221 1.00 0.00 WATR +ATOM 1442 HT HOH 310 -6.5367 -10.308 7.13221 1.00 0.00 WATR +ATOM 1443 HT HOH 310 -8.0506 -10.308 7.13221 1.00 0.00 WATR +ATOM 1444 OT HOH 311 -7.2937 -13.357 9.59542 1.00 0.00 WATR +ATOM 1445 HT HOH 311 -6.5367 -12.771 9.59542 1.00 0.00 WATR +ATOM 1446 HT HOH 311 -8.0506 -12.771 9.59542 1.00 0.00 WATR +ATOM 1447 OT HOH 312 -9.7569 -10.894 9.59542 1.00 0.00 WATR +ATOM 1448 HT HOH 312 -8.9999 -10.308 9.59542 1.00 0.00 WATR +ATOM 1449 HT HOH 312 -10.513 -10.308 9.59542 1.00 0.00 WATR +ATOM 1450 OT HOH 313 -9.7569 -8.4312 -12.573 1.00 0.00 WATR +ATOM 1451 HT HOH 313 -8.9999 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1452 HT HOH 313 -10.513 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1453 OT HOH 314 -7.2937 -5.9680 -12.573 1.00 0.00 WATR +ATOM 1454 HT HOH 314 -6.5367 -5.3821 -12.573 1.00 0.00 WATR +ATOM 1455 HT HOH 314 -8.0506 -5.3821 -12.573 1.00 0.00 WATR +ATOM 1456 OT HOH 315 -7.2937 -8.4312 -10.110 1.00 0.00 WATR +ATOM 1457 HT HOH 315 -6.5367 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1458 HT HOH 315 -8.0506 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1459 OT HOH 316 -9.7569 -5.9680 -10.110 1.00 0.00 WATR +ATOM 1460 HT HOH 316 -8.9999 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1461 HT HOH 316 -10.513 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1462 OT HOH 317 -7.2937 -8.4312 4.66901 1.00 0.00 WATR +ATOM 1463 HT HOH 317 -6.5367 -7.8453 4.66901 1.00 0.00 WATR +ATOM 1464 HT HOH 317 -8.0506 -7.8453 4.66901 1.00 0.00 WATR +ATOM 1465 OT HOH 318 -9.7569 -8.4312 7.13221 1.00 0.00 WATR +ATOM 1466 HT HOH 318 -8.9999 -7.8453 7.13221 1.00 0.00 WATR +ATOM 1467 HT HOH 318 -10.513 -7.8453 7.13221 1.00 0.00 WATR +ATOM 1468 OT HOH 319 -7.2937 -5.9680 7.13221 1.00 0.00 WATR +ATOM 1469 HT HOH 319 -6.5367 -5.3821 7.13221 1.00 0.00 WATR +ATOM 1470 HT HOH 319 -8.0506 -5.3821 7.13221 1.00 0.00 WATR +ATOM 1471 OT HOH 320 -7.2937 -8.4312 9.59542 1.00 0.00 WATR +ATOM 1472 HT HOH 320 -6.5367 -7.8453 9.59542 1.00 0.00 WATR +ATOM 1473 HT HOH 320 -8.0506 -7.8453 9.59542 1.00 0.00 WATR +ATOM 1474 OT HOH 321 -9.7569 -5.9680 9.59542 1.00 0.00 WATR +ATOM 1475 HT HOH 321 -8.9999 -5.3821 9.59542 1.00 0.00 WATR +ATOM 1476 HT HOH 321 -10.513 -5.3821 9.59542 1.00 0.00 WATR +ATOM 1477 OT HOH 322 -9.7569 -3.5048 -12.573 1.00 0.00 WATR +ATOM 1478 HT HOH 322 -8.9999 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1479 HT HOH 322 -10.513 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1480 OT HOH 323 -7.2937 -1.0416 -12.573 1.00 0.00 WATR +ATOM 1481 HT HOH 323 -6.5367 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1482 HT HOH 323 -8.0506 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1483 OT HOH 324 -7.2937 -3.5048 -10.110 1.00 0.00 WATR +ATOM 1484 HT HOH 324 -6.5367 -2.9189 -10.110 1.00 0.00 WATR +ATOM 1485 HT HOH 324 -8.0506 -2.9189 -10.110 1.00 0.00 WATR +ATOM 1486 OT HOH 325 -9.7569 -1.0416 -10.110 1.00 0.00 WATR +ATOM 1487 HT HOH 325 -8.9999 -0.4557 -10.110 1.00 0.00 WATR +ATOM 1488 HT HOH 325 -10.513 -0.4557 -10.110 1.00 0.00 WATR +ATOM 1489 OT HOH 326 -9.7569 1.42160 -12.573 1.00 0.00 WATR +ATOM 1490 HT HOH 326 -8.9999 2.00748 -12.573 1.00 0.00 WATR +ATOM 1491 HT HOH 326 -10.513 2.00748 -12.573 1.00 0.00 WATR +ATOM 1492 OT HOH 327 -7.2937 3.88480 -12.573 1.00 0.00 WATR +ATOM 1493 HT HOH 327 -6.5367 4.47069 -12.573 1.00 0.00 WATR +ATOM 1494 HT HOH 327 -8.0506 4.47069 -12.573 1.00 0.00 WATR +ATOM 1495 OT HOH 328 -7.2937 1.42160 -10.110 1.00 0.00 WATR +ATOM 1496 HT HOH 328 -6.5367 2.00748 -10.110 1.00 0.00 WATR +ATOM 1497 HT HOH 328 -8.0506 2.00748 -10.110 1.00 0.00 WATR +ATOM 1498 OT HOH 329 -9.7569 3.88480 -10.110 1.00 0.00 WATR +ATOM 1499 HT HOH 329 -8.9999 4.47069 -10.110 1.00 0.00 WATR +ATOM 1500 HT HOH 329 -10.513 4.47069 -10.110 1.00 0.00 WATR +ATOM 1501 OT HOH 330 -9.7569 6.34801 -12.573 1.00 0.00 WATR +ATOM 1502 HT HOH 330 -8.9999 6.93389 -12.573 1.00 0.00 WATR +ATOM 1503 HT HOH 330 -10.513 6.93389 -12.573 1.00 0.00 WATR +ATOM 1504 OT HOH 331 -7.2937 8.81121 -12.573 1.00 0.00 WATR +ATOM 1505 HT HOH 331 -6.5367 9.39710 -12.573 1.00 0.00 WATR +ATOM 1506 HT HOH 331 -8.0506 9.39710 -12.573 1.00 0.00 WATR +ATOM 1507 OT HOH 332 -9.7569 8.81121 -10.110 1.00 0.00 WATR +ATOM 1508 HT HOH 332 -8.9999 9.39710 -10.110 1.00 0.00 WATR +ATOM 1509 HT HOH 332 -10.513 9.39710 -10.110 1.00 0.00 WATR +ATOM 1510 OT HOH 333 -9.7569 8.81121 4.66901 1.00 0.00 WATR +ATOM 1511 HT HOH 333 -8.9999 9.39710 4.66901 1.00 0.00 WATR +ATOM 1512 HT HOH 333 -10.513 9.39710 4.66901 1.00 0.00 WATR +ATOM 1513 OT HOH 334 -7.2937 8.81121 7.13221 1.00 0.00 WATR +ATOM 1514 HT HOH 334 -6.5367 9.39710 7.13221 1.00 0.00 WATR +ATOM 1515 HT HOH 334 -8.0506 9.39710 7.13221 1.00 0.00 WATR +ATOM 1516 OT HOH 335 -7.2937 6.34801 9.59542 1.00 0.00 WATR +ATOM 1517 HT HOH 335 -6.5367 6.93389 9.59542 1.00 0.00 WATR +ATOM 1518 HT HOH 335 -8.0506 6.93389 9.59542 1.00 0.00 WATR +ATOM 1519 OT HOH 336 -9.7569 8.81121 9.59542 1.00 0.00 WATR +ATOM 1520 HT HOH 336 -8.9999 9.39710 9.59542 1.00 0.00 WATR +ATOM 1521 HT HOH 336 -10.513 9.39710 9.59542 1.00 0.00 WATR +ATOM 1522 OT HOH 337 -9.7569 11.2744 -12.573 1.00 0.00 WATR +ATOM 1523 HT HOH 337 -8.9999 11.8603 -12.573 1.00 0.00 WATR +ATOM 1524 HT HOH 337 -10.513 11.8603 -12.573 1.00 0.00 WATR +ATOM 1525 OT HOH 338 -7.2937 13.7376 -12.573 1.00 0.00 WATR +ATOM 1526 HT HOH 338 -6.5367 14.3235 -12.573 1.00 0.00 WATR +ATOM 1527 HT HOH 338 -8.0506 14.3235 -12.573 1.00 0.00 WATR +ATOM 1528 OT HOH 339 -7.2937 11.2744 -10.110 1.00 0.00 WATR +ATOM 1529 HT HOH 339 -6.5367 11.8603 -10.110 1.00 0.00 WATR +ATOM 1530 HT HOH 339 -8.0506 11.8603 -10.110 1.00 0.00 WATR +ATOM 1531 OT HOH 340 -9.7569 13.7376 -10.110 1.00 0.00 WATR +ATOM 1532 HT HOH 340 -8.9999 14.3235 -10.110 1.00 0.00 WATR +ATOM 1533 HT HOH 340 -10.513 14.3235 -10.110 1.00 0.00 WATR +ATOM 1534 OT HOH 341 -9.7569 11.2744 -7.6470 1.00 0.00 WATR +ATOM 1535 HT HOH 341 -8.9999 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1536 HT HOH 341 -10.513 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1537 OT HOH 342 -9.7569 13.7376 -5.1838 1.00 0.00 WATR +ATOM 1538 HT HOH 342 -8.9999 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1539 HT HOH 342 -10.513 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1540 OT HOH 343 -7.2937 13.7376 -2.7206 1.00 0.00 WATR +ATOM 1541 HT HOH 343 -6.5367 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1542 HT HOH 343 -8.0506 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1543 OT HOH 344 -9.7569 13.7376 -0.2573 1.00 0.00 WATR +ATOM 1544 HT HOH 344 -8.9999 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1545 HT HOH 344 -10.513 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1546 OT HOH 345 -9.7569 11.2744 2.20580 1.00 0.00 WATR +ATOM 1547 HT HOH 345 -8.9999 11.8603 2.20580 1.00 0.00 WATR +ATOM 1548 HT HOH 345 -10.513 11.8603 2.20580 1.00 0.00 WATR +ATOM 1549 OT HOH 346 -7.2937 13.7376 2.20580 1.00 0.00 WATR +ATOM 1550 HT HOH 346 -6.5367 14.3235 2.20580 1.00 0.00 WATR +ATOM 1551 HT HOH 346 -8.0506 14.3235 2.20580 1.00 0.00 WATR +ATOM 1552 OT HOH 347 -7.2937 11.2744 4.66901 1.00 0.00 WATR +ATOM 1553 HT HOH 347 -6.5367 11.8603 4.66901 1.00 0.00 WATR +ATOM 1554 HT HOH 347 -8.0506 11.8603 4.66901 1.00 0.00 WATR +ATOM 1555 OT HOH 348 -9.7569 13.7376 4.66901 1.00 0.00 WATR +ATOM 1556 HT HOH 348 -8.9999 14.3235 4.66901 1.00 0.00 WATR +ATOM 1557 HT HOH 348 -10.513 14.3235 4.66901 1.00 0.00 WATR +ATOM 1558 OT HOH 349 -9.7569 11.2744 7.13221 1.00 0.00 WATR +ATOM 1559 HT HOH 349 -8.9999 11.8603 7.13221 1.00 0.00 WATR +ATOM 1560 HT HOH 349 -10.513 11.8603 7.13221 1.00 0.00 WATR +ATOM 1561 OT HOH 350 -7.2937 13.7376 7.13221 1.00 0.00 WATR +ATOM 1562 HT HOH 350 -6.5367 14.3235 7.13221 1.00 0.00 WATR +ATOM 1563 HT HOH 350 -8.0506 14.3235 7.13221 1.00 0.00 WATR +ATOM 1564 OT HOH 351 -7.2937 11.2744 9.59542 1.00 0.00 WATR +ATOM 1565 HT HOH 351 -6.5367 11.8603 9.59542 1.00 0.00 WATR +ATOM 1566 HT HOH 351 -8.0506 11.8603 9.59542 1.00 0.00 WATR +ATOM 1567 OT HOH 352 -9.7569 13.7376 9.59542 1.00 0.00 WATR +ATOM 1568 HT HOH 352 -8.9999 14.3235 9.59542 1.00 0.00 WATR +ATOM 1569 HT HOH 352 -10.513 14.3235 9.59542 1.00 0.00 WATR +ATOM 1570 OT HOH 353 -4.8305 -13.357 -12.573 1.00 0.00 WATR +ATOM 1571 HT HOH 353 -4.0735 -12.771 -12.573 1.00 0.00 WATR +ATOM 1572 HT HOH 353 -5.5874 -12.771 -12.573 1.00 0.00 WATR +ATOM 1573 OT HOH 354 -2.3673 -10.894 -12.573 1.00 0.00 WATR +ATOM 1574 HT HOH 354 -1.6103 -10.308 -12.573 1.00 0.00 WATR +ATOM 1575 HT HOH 354 -3.1242 -10.308 -12.573 1.00 0.00 WATR +ATOM 1576 OT HOH 355 -2.3673 -13.357 -10.110 1.00 0.00 WATR +ATOM 1577 HT HOH 355 -1.6103 -12.771 -10.110 1.00 0.00 WATR +ATOM 1578 HT HOH 355 -3.1242 -12.771 -10.110 1.00 0.00 WATR +ATOM 1579 OT HOH 356 -4.8305 -10.894 -10.110 1.00 0.00 WATR +ATOM 1580 HT HOH 356 -4.0735 -10.308 -10.110 1.00 0.00 WATR +ATOM 1581 HT HOH 356 -5.5874 -10.308 -10.110 1.00 0.00 WATR +ATOM 1582 OT HOH 357 -4.8305 -13.357 -7.6470 1.00 0.00 WATR +ATOM 1583 HT HOH 357 -4.0735 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1584 HT HOH 357 -5.5874 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1585 OT HOH 358 -2.3673 -10.894 -7.6470 1.00 0.00 WATR +ATOM 1586 HT HOH 358 -1.6103 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1587 HT HOH 358 -3.1242 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1588 OT HOH 359 -2.3673 -13.357 -5.1838 1.00 0.00 WATR +ATOM 1589 HT HOH 359 -1.6103 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1590 HT HOH 359 -3.1242 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1591 OT HOH 360 -2.3673 -13.357 -0.2573 1.00 0.00 WATR +ATOM 1592 HT HOH 360 -1.6103 -12.771 -0.2573 1.00 0.00 WATR +ATOM 1593 HT HOH 360 -3.1242 -12.771 -0.2573 1.00 0.00 WATR +ATOM 1594 OT HOH 361 -4.8305 -13.357 2.20580 1.00 0.00 WATR +ATOM 1595 HT HOH 361 -4.0735 -12.771 2.20580 1.00 0.00 WATR +ATOM 1596 HT HOH 361 -5.5874 -12.771 2.20580 1.00 0.00 WATR +ATOM 1597 OT HOH 362 -2.3673 -13.357 4.66901 1.00 0.00 WATR +ATOM 1598 HT HOH 362 -1.6103 -12.771 4.66901 1.00 0.00 WATR +ATOM 1599 HT HOH 362 -3.1242 -12.771 4.66901 1.00 0.00 WATR +ATOM 1600 OT HOH 363 -4.8305 -13.357 7.13221 1.00 0.00 WATR +ATOM 1601 HT HOH 363 -4.0735 -12.771 7.13221 1.00 0.00 WATR +ATOM 1602 HT HOH 363 -5.5874 -12.771 7.13221 1.00 0.00 WATR +ATOM 1603 OT HOH 364 -2.3673 -10.894 7.13221 1.00 0.00 WATR +ATOM 1604 HT HOH 364 -1.6103 -10.308 7.13221 1.00 0.00 WATR +ATOM 1605 HT HOH 364 -3.1242 -10.308 7.13221 1.00 0.00 WATR +ATOM 1606 OT HOH 365 -2.3673 -13.357 9.59542 1.00 0.00 WATR +ATOM 1607 HT HOH 365 -1.6103 -12.771 9.59542 1.00 0.00 WATR +ATOM 1608 HT HOH 365 -3.1242 -12.771 9.59542 1.00 0.00 WATR +ATOM 1609 OT HOH 366 -4.8305 -10.894 9.59542 1.00 0.00 WATR +ATOM 1610 HT HOH 366 -4.0735 -10.308 9.59542 1.00 0.00 WATR +ATOM 1611 HT HOH 366 -5.5874 -10.308 9.59542 1.00 0.00 WATR +ATOM 1612 OT HOH 367 -4.8305 -8.4312 -12.573 1.00 0.00 WATR +ATOM 1613 HT HOH 367 -4.0735 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1614 HT HOH 367 -5.5874 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1615 OT HOH 368 -2.3673 -5.9680 -12.573 1.00 0.00 WATR +ATOM 1616 HT HOH 368 -1.6103 -5.3821 -12.573 1.00 0.00 WATR +ATOM 1617 HT HOH 368 -3.1242 -5.3821 -12.573 1.00 0.00 WATR +ATOM 1618 OT HOH 369 -2.3673 -8.4312 -10.110 1.00 0.00 WATR +ATOM 1619 HT HOH 369 -1.6103 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1620 HT HOH 369 -3.1242 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1621 OT HOH 370 -4.8305 -5.9680 -10.110 1.00 0.00 WATR +ATOM 1622 HT HOH 370 -4.0735 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1623 HT HOH 370 -5.5874 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1624 OT HOH 371 -4.8305 -5.9680 9.59542 1.00 0.00 WATR +ATOM 1625 HT HOH 371 -4.0735 -5.3821 9.59542 1.00 0.00 WATR +ATOM 1626 HT HOH 371 -5.5874 -5.3821 9.59542 1.00 0.00 WATR +ATOM 1627 OT HOH 372 -4.8305 -3.5048 -12.573 1.00 0.00 WATR +ATOM 1628 HT HOH 372 -4.0735 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1629 HT HOH 372 -5.5874 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1630 OT HOH 373 -2.3673 -1.0416 -12.573 1.00 0.00 WATR +ATOM 1631 HT HOH 373 -1.6103 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1632 HT HOH 373 -3.1242 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1633 OT HOH 374 -2.3673 -3.5048 -10.110 1.00 0.00 WATR +ATOM 1634 HT HOH 374 -1.6103 -2.9189 -10.110 1.00 0.00 WATR +ATOM 1635 HT HOH 374 -3.1242 -2.9189 -10.110 1.00 0.00 WATR +ATOM 1636 OT HOH 375 -4.8305 -1.0416 -10.110 1.00 0.00 WATR +ATOM 1637 HT HOH 375 -4.0735 -0.4557 -10.110 1.00 0.00 WATR +ATOM 1638 HT HOH 375 -5.5874 -0.4557 -10.110 1.00 0.00 WATR +ATOM 1639 OT HOH 376 -4.8305 1.42160 -12.573 1.00 0.00 WATR +ATOM 1640 HT HOH 376 -4.0735 2.00748 -12.573 1.00 0.00 WATR +ATOM 1641 HT HOH 376 -5.5874 2.00748 -12.573 1.00 0.00 WATR +ATOM 1642 OT HOH 377 -2.3673 3.88480 -12.573 1.00 0.00 WATR +ATOM 1643 HT HOH 377 -1.6103 4.47069 -12.573 1.00 0.00 WATR +ATOM 1644 HT HOH 377 -3.1242 4.47069 -12.573 1.00 0.00 WATR +ATOM 1645 OT HOH 378 -4.8305 6.34801 -12.573 1.00 0.00 WATR +ATOM 1646 HT HOH 378 -4.0735 6.93389 -12.573 1.00 0.00 WATR +ATOM 1647 HT HOH 378 -5.5874 6.93389 -12.573 1.00 0.00 WATR +ATOM 1648 OT HOH 379 -2.3673 8.81121 -12.573 1.00 0.00 WATR +ATOM 1649 HT HOH 379 -1.6103 9.39710 -12.573 1.00 0.00 WATR +ATOM 1650 HT HOH 379 -3.1242 9.39710 -12.573 1.00 0.00 WATR +ATOM 1651 OT HOH 380 -2.3673 6.34801 -10.110 1.00 0.00 WATR +ATOM 1652 HT HOH 380 -1.6103 6.93389 -10.110 1.00 0.00 WATR +ATOM 1653 HT HOH 380 -3.1242 6.93389 -10.110 1.00 0.00 WATR +ATOM 1654 OT HOH 381 -4.8305 8.81121 -10.110 1.00 0.00 WATR +ATOM 1655 HT HOH 381 -4.0735 9.39710 -10.110 1.00 0.00 WATR +ATOM 1656 HT HOH 381 -5.5874 9.39710 -10.110 1.00 0.00 WATR +ATOM 1657 OT HOH 382 -2.3673 8.81121 7.13221 1.00 0.00 WATR +ATOM 1658 HT HOH 382 -1.6103 9.39710 7.13221 1.00 0.00 WATR +ATOM 1659 HT HOH 382 -3.1242 9.39710 7.13221 1.00 0.00 WATR +ATOM 1660 OT HOH 383 -2.3673 6.34801 9.59542 1.00 0.00 WATR +ATOM 1661 HT HOH 383 -1.6103 6.93389 9.59542 1.00 0.00 WATR +ATOM 1662 HT HOH 383 -3.1242 6.93389 9.59542 1.00 0.00 WATR +ATOM 1663 OT HOH 384 -4.8305 8.81121 9.59542 1.00 0.00 WATR +ATOM 1664 HT HOH 384 -4.0735 9.39710 9.59542 1.00 0.00 WATR +ATOM 1665 HT HOH 384 -5.5874 9.39710 9.59542 1.00 0.00 WATR +ATOM 1666 OT HOH 385 -4.8305 11.2744 -12.573 1.00 0.00 WATR +ATOM 1667 HT HOH 385 -4.0735 11.8603 -12.573 1.00 0.00 WATR +ATOM 1668 HT HOH 385 -5.5874 11.8603 -12.573 1.00 0.00 WATR +ATOM 1669 OT HOH 386 -2.3673 13.7376 -12.573 1.00 0.00 WATR +ATOM 1670 HT HOH 386 -1.6103 14.3235 -12.573 1.00 0.00 WATR +ATOM 1671 HT HOH 386 -3.1242 14.3235 -12.573 1.00 0.00 WATR +ATOM 1672 OT HOH 387 -2.3673 11.2744 -10.110 1.00 0.00 WATR +ATOM 1673 HT HOH 387 -1.6103 11.8603 -10.110 1.00 0.00 WATR +ATOM 1674 HT HOH 387 -3.1242 11.8603 -10.110 1.00 0.00 WATR +ATOM 1675 OT HOH 388 -4.8305 13.7376 -10.110 1.00 0.00 WATR +ATOM 1676 HT HOH 388 -4.0735 14.3235 -10.110 1.00 0.00 WATR +ATOM 1677 HT HOH 388 -5.5874 14.3235 -10.110 1.00 0.00 WATR +ATOM 1678 OT HOH 389 -2.3673 13.7376 -7.6470 1.00 0.00 WATR +ATOM 1679 HT HOH 389 -1.6103 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1680 HT HOH 389 -3.1242 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1681 OT HOH 390 -2.3673 13.7376 -2.7206 1.00 0.00 WATR +ATOM 1682 HT HOH 390 -1.6103 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1683 HT HOH 390 -3.1242 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1684 OT HOH 391 -2.3673 11.2744 -0.2573 1.00 0.00 WATR +ATOM 1685 HT HOH 391 -1.6103 11.8603 -0.2573 1.00 0.00 WATR +ATOM 1686 HT HOH 391 -3.1242 11.8603 -0.2573 1.00 0.00 WATR +ATOM 1687 OT HOH 392 -4.8305 13.7376 -0.2573 1.00 0.00 WATR +ATOM 1688 HT HOH 392 -4.0735 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1689 HT HOH 392 -5.5874 14.3235 -0.2573 1.00 0.00 WATR +ATOM 1690 OT HOH 393 -4.8305 11.2744 2.20580 1.00 0.00 WATR +ATOM 1691 HT HOH 393 -4.0735 11.8603 2.20580 1.00 0.00 WATR +ATOM 1692 HT HOH 393 -5.5874 11.8603 2.20580 1.00 0.00 WATR +ATOM 1693 OT HOH 394 -2.3673 13.7376 2.20580 1.00 0.00 WATR +ATOM 1694 HT HOH 394 -1.6103 14.3235 2.20580 1.00 0.00 WATR +ATOM 1695 HT HOH 394 -3.1242 14.3235 2.20580 1.00 0.00 WATR +ATOM 1696 OT HOH 395 -2.3673 11.2744 4.66901 1.00 0.00 WATR +ATOM 1697 HT HOH 395 -1.6103 11.8603 4.66901 1.00 0.00 WATR +ATOM 1698 HT HOH 395 -3.1242 11.8603 4.66901 1.00 0.00 WATR +ATOM 1699 OT HOH 396 -4.8305 13.7376 4.66901 1.00 0.00 WATR +ATOM 1700 HT HOH 396 -4.0735 14.3235 4.66901 1.00 0.00 WATR +ATOM 1701 HT HOH 396 -5.5874 14.3235 4.66901 1.00 0.00 WATR +ATOM 1702 OT HOH 397 -4.8305 11.2744 7.13221 1.00 0.00 WATR +ATOM 1703 HT HOH 397 -4.0735 11.8603 7.13221 1.00 0.00 WATR +ATOM 1704 HT HOH 397 -5.5874 11.8603 7.13221 1.00 0.00 WATR +ATOM 1705 OT HOH 398 -2.3673 13.7376 7.13221 1.00 0.00 WATR +ATOM 1706 HT HOH 398 -1.6103 14.3235 7.13221 1.00 0.00 WATR +ATOM 1707 HT HOH 398 -3.1242 14.3235 7.13221 1.00 0.00 WATR +ATOM 1708 OT HOH 399 -2.3673 11.2744 9.59542 1.00 0.00 WATR +ATOM 1709 HT HOH 399 -1.6103 11.8603 9.59542 1.00 0.00 WATR +ATOM 1710 HT HOH 399 -3.1242 11.8603 9.59542 1.00 0.00 WATR +ATOM 1711 OT HOH 400 -4.8305 13.7376 9.59542 1.00 0.00 WATR +ATOM 1712 HT HOH 400 -4.0735 14.3235 9.59542 1.00 0.00 WATR +ATOM 1713 HT HOH 400 -5.5874 14.3235 9.59542 1.00 0.00 WATR +ATOM 1714 OT HOH 401 0.09589 -13.357 -12.573 1.00 0.00 WATR +ATOM 1715 HT HOH 401 0.85284 -12.771 -12.573 1.00 0.00 WATR +ATOM 1716 HT HOH 401 -0.6610 -12.771 -12.573 1.00 0.00 WATR +ATOM 1717 OT HOH 402 2.55910 -10.894 -12.573 1.00 0.00 WATR +ATOM 1718 HT HOH 402 3.31605 -10.308 -12.573 1.00 0.00 WATR +ATOM 1719 HT HOH 402 1.80215 -10.308 -12.573 1.00 0.00 WATR +ATOM 1720 OT HOH 403 2.55910 -13.357 -10.110 1.00 0.00 WATR +ATOM 1721 HT HOH 403 3.31605 -12.771 -10.110 1.00 0.00 WATR +ATOM 1722 HT HOH 403 1.80215 -12.771 -10.110 1.00 0.00 WATR +ATOM 1723 OT HOH 404 0.09589 -10.894 -10.110 1.00 0.00 WATR +ATOM 1724 HT HOH 404 0.85284 -10.308 -10.110 1.00 0.00 WATR +ATOM 1725 HT HOH 404 -0.6610 -10.308 -10.110 1.00 0.00 WATR +ATOM 1726 OT HOH 405 0.09589 -13.357 -7.6470 1.00 0.00 WATR +ATOM 1727 HT HOH 405 0.85284 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1728 HT HOH 405 -0.6610 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1729 OT HOH 406 2.55910 -10.894 -7.6470 1.00 0.00 WATR +ATOM 1730 HT HOH 406 3.31605 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1731 HT HOH 406 1.80215 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1732 OT HOH 407 2.55910 -13.357 -5.1838 1.00 0.00 WATR +ATOM 1733 HT HOH 407 3.31605 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1734 HT HOH 407 1.80215 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1735 OT HOH 408 0.09589 -10.894 -5.1838 1.00 0.00 WATR +ATOM 1736 HT HOH 408 0.85284 -10.308 -5.1838 1.00 0.00 WATR +ATOM 1737 HT HOH 408 -0.6610 -10.308 -5.1838 1.00 0.00 WATR +ATOM 1738 OT HOH 409 0.09589 -13.357 -2.7206 1.00 0.00 WATR +ATOM 1739 HT HOH 409 0.85284 -12.771 -2.7206 1.00 0.00 WATR +ATOM 1740 HT HOH 409 -0.6610 -12.771 -2.7206 1.00 0.00 WATR +ATOM 1741 OT HOH 410 2.55910 -10.894 -2.7206 1.00 0.00 WATR +ATOM 1742 HT HOH 410 3.31605 -10.308 -2.7206 1.00 0.00 WATR +ATOM 1743 HT HOH 410 1.80215 -10.308 -2.7206 1.00 0.00 WATR +ATOM 1744 OT HOH 411 2.55910 -13.357 -0.2573 1.00 0.00 WATR +ATOM 1745 HT HOH 411 3.31605 -12.771 -0.2573 1.00 0.00 WATR +ATOM 1746 HT HOH 411 1.80215 -12.771 -0.2573 1.00 0.00 WATR +ATOM 1747 OT HOH 412 0.09589 -13.357 2.20580 1.00 0.00 WATR +ATOM 1748 HT HOH 412 0.85284 -12.771 2.20580 1.00 0.00 WATR +ATOM 1749 HT HOH 412 -0.6610 -12.771 2.20580 1.00 0.00 WATR +ATOM 1750 OT HOH 413 2.55910 -10.894 2.20580 1.00 0.00 WATR +ATOM 1751 HT HOH 413 3.31605 -10.308 2.20580 1.00 0.00 WATR +ATOM 1752 HT HOH 413 1.80215 -10.308 2.20580 1.00 0.00 WATR +ATOM 1753 OT HOH 414 2.55910 -13.357 4.66901 1.00 0.00 WATR +ATOM 1754 HT HOH 414 3.31605 -12.771 4.66901 1.00 0.00 WATR +ATOM 1755 HT HOH 414 1.80215 -12.771 4.66901 1.00 0.00 WATR +ATOM 1756 OT HOH 415 0.09589 -10.894 4.66901 1.00 0.00 WATR +ATOM 1757 HT HOH 415 0.85284 -10.308 4.66901 1.00 0.00 WATR +ATOM 1758 HT HOH 415 -0.6610 -10.308 4.66901 1.00 0.00 WATR +ATOM 1759 OT HOH 416 0.09589 -13.357 7.13221 1.00 0.00 WATR +ATOM 1760 HT HOH 416 0.85284 -12.771 7.13221 1.00 0.00 WATR +ATOM 1761 HT HOH 416 -0.6610 -12.771 7.13221 1.00 0.00 WATR +ATOM 1762 OT HOH 417 2.55910 -10.894 7.13221 1.00 0.00 WATR +ATOM 1763 HT HOH 417 3.31605 -10.308 7.13221 1.00 0.00 WATR +ATOM 1764 HT HOH 417 1.80215 -10.308 7.13221 1.00 0.00 WATR +ATOM 1765 OT HOH 418 2.55910 -13.357 9.59542 1.00 0.00 WATR +ATOM 1766 HT HOH 418 3.31605 -12.771 9.59542 1.00 0.00 WATR +ATOM 1767 HT HOH 418 1.80215 -12.771 9.59542 1.00 0.00 WATR +ATOM 1768 OT HOH 419 0.09589 -10.894 9.59542 1.00 0.00 WATR +ATOM 1769 HT HOH 419 0.85284 -10.308 9.59542 1.00 0.00 WATR +ATOM 1770 HT HOH 419 -0.6610 -10.308 9.59542 1.00 0.00 WATR +ATOM 1771 OT HOH 420 0.09589 -8.4312 -12.573 1.00 0.00 WATR +ATOM 1772 HT HOH 420 0.85284 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1773 HT HOH 420 -0.6610 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1774 OT HOH 421 2.55910 -8.4312 -10.110 1.00 0.00 WATR +ATOM 1775 HT HOH 421 3.31605 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1776 HT HOH 421 1.80215 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1777 OT HOH 422 2.55910 -8.4312 -5.1838 1.00 0.00 WATR +ATOM 1778 HT HOH 422 3.31605 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 1779 HT HOH 422 1.80215 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 1780 OT HOH 423 0.09589 -3.5048 -12.573 1.00 0.00 WATR +ATOM 1781 HT HOH 423 0.85284 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1782 HT HOH 423 -0.6610 -2.9189 -12.573 1.00 0.00 WATR +ATOM 1783 OT HOH 424 2.55910 -1.0416 -12.573 1.00 0.00 WATR +ATOM 1784 HT HOH 424 3.31605 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1785 HT HOH 424 1.80215 -0.4557 -12.573 1.00 0.00 WATR +ATOM 1786 OT HOH 425 0.09589 1.42160 -12.573 1.00 0.00 WATR +ATOM 1787 HT HOH 425 0.85284 2.00748 -12.573 1.00 0.00 WATR +ATOM 1788 HT HOH 425 -0.6610 2.00748 -12.573 1.00 0.00 WATR +ATOM 1789 OT HOH 426 2.55910 3.88480 -12.573 1.00 0.00 WATR +ATOM 1790 HT HOH 426 3.31605 4.47069 -12.573 1.00 0.00 WATR +ATOM 1791 HT HOH 426 1.80215 4.47069 -12.573 1.00 0.00 WATR +ATOM 1792 OT HOH 427 0.09589 3.88480 -10.110 1.00 0.00 WATR +ATOM 1793 HT HOH 427 0.85284 4.47069 -10.110 1.00 0.00 WATR +ATOM 1794 HT HOH 427 -0.6610 4.47069 -10.110 1.00 0.00 WATR +ATOM 1795 OT HOH 428 0.09589 3.88480 9.59542 1.00 0.00 WATR +ATOM 1796 HT HOH 428 0.85284 4.47069 9.59542 1.00 0.00 WATR +ATOM 1797 HT HOH 428 -0.6610 4.47069 9.59542 1.00 0.00 WATR +ATOM 1798 OT HOH 429 0.09589 6.34801 -12.573 1.00 0.00 WATR +ATOM 1799 HT HOH 429 0.85284 6.93389 -12.573 1.00 0.00 WATR +ATOM 1800 HT HOH 429 -0.6610 6.93389 -12.573 1.00 0.00 WATR +ATOM 1801 OT HOH 430 2.55910 8.81121 -12.573 1.00 0.00 WATR +ATOM 1802 HT HOH 430 3.31605 9.39710 -12.573 1.00 0.00 WATR +ATOM 1803 HT HOH 430 1.80215 9.39710 -12.573 1.00 0.00 WATR +ATOM 1804 SOD ION 431 2.55910 6.34801 -10.110 1.00 0.00 SALT +ATOM 1805 OT HOH 432 0.09589 8.81121 -10.110 1.00 0.00 WATR +ATOM 1806 HT HOH 432 0.85284 9.39710 -10.110 1.00 0.00 WATR +ATOM 1807 HT HOH 432 -0.6610 9.39710 -10.110 1.00 0.00 WATR +ATOM 1808 OT HOH 433 0.09589 8.81121 4.66901 1.00 0.00 WATR +ATOM 1809 HT HOH 433 0.85284 9.39710 4.66901 1.00 0.00 WATR +ATOM 1810 HT HOH 433 -0.6610 9.39710 4.66901 1.00 0.00 WATR +ATOM 1811 OT HOH 434 2.55910 8.81121 7.13221 1.00 0.00 WATR +ATOM 1812 HT HOH 434 3.31605 9.39710 7.13221 1.00 0.00 WATR +ATOM 1813 HT HOH 434 1.80215 9.39710 7.13221 1.00 0.00 WATR +ATOM 1814 OT HOH 435 0.09589 8.81121 9.59542 1.00 0.00 WATR +ATOM 1815 HT HOH 435 0.85284 9.39710 9.59542 1.00 0.00 WATR +ATOM 1816 HT HOH 435 -0.6610 9.39710 9.59542 1.00 0.00 WATR +ATOM 1817 OT HOH 436 0.09589 11.2744 -12.573 1.00 0.00 WATR +ATOM 1818 HT HOH 436 0.85284 11.8603 -12.573 1.00 0.00 WATR +ATOM 1819 HT HOH 436 -0.6610 11.8603 -12.573 1.00 0.00 WATR +ATOM 1820 OT HOH 437 2.55910 13.7376 -12.573 1.00 0.00 WATR +ATOM 1821 HT HOH 437 3.31605 14.3235 -12.573 1.00 0.00 WATR +ATOM 1822 HT HOH 437 1.80215 14.3235 -12.573 1.00 0.00 WATR +ATOM 1823 OT HOH 438 2.55910 11.2744 -10.110 1.00 0.00 WATR +ATOM 1824 HT HOH 438 3.31605 11.8603 -10.110 1.00 0.00 WATR +ATOM 1825 HT HOH 438 1.80215 11.8603 -10.110 1.00 0.00 WATR +ATOM 1826 OT HOH 439 0.09589 13.7376 -10.110 1.00 0.00 WATR +ATOM 1827 HT HOH 439 0.85284 14.3235 -10.110 1.00 0.00 WATR +ATOM 1828 HT HOH 439 -0.6610 14.3235 -10.110 1.00 0.00 WATR +ATOM 1829 OT HOH 440 0.09589 11.2744 -7.6470 1.00 0.00 WATR +ATOM 1830 HT HOH 440 0.85284 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1831 HT HOH 440 -0.6610 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1832 OT HOH 441 2.55910 13.7376 -7.6470 1.00 0.00 WATR +ATOM 1833 HT HOH 441 3.31605 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1834 HT HOH 441 1.80215 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1835 OT HOH 442 2.55910 11.2744 -5.1838 1.00 0.00 WATR +ATOM 1836 HT HOH 442 3.31605 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1837 HT HOH 442 1.80215 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1838 OT HOH 443 0.09589 13.7376 -5.1838 1.00 0.00 WATR +ATOM 1839 HT HOH 443 0.85284 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1840 HT HOH 443 -0.6610 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1841 OT HOH 444 2.55910 13.7376 -2.7206 1.00 0.00 WATR +ATOM 1842 HT HOH 444 3.31605 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1843 HT HOH 444 1.80215 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1844 OT HOH 445 0.09589 13.7376 4.66901 1.00 0.00 WATR +ATOM 1845 HT HOH 445 0.85284 14.3235 4.66901 1.00 0.00 WATR +ATOM 1846 HT HOH 445 -0.6610 14.3235 4.66901 1.00 0.00 WATR +ATOM 1847 OT HOH 446 0.09589 11.2744 7.13221 1.00 0.00 WATR +ATOM 1848 HT HOH 446 0.85284 11.8603 7.13221 1.00 0.00 WATR +ATOM 1849 HT HOH 446 -0.6610 11.8603 7.13221 1.00 0.00 WATR +ATOM 1850 OT HOH 447 2.55910 13.7376 7.13221 1.00 0.00 WATR +ATOM 1851 HT HOH 447 3.31605 14.3235 7.13221 1.00 0.00 WATR +ATOM 1852 HT HOH 447 1.80215 14.3235 7.13221 1.00 0.00 WATR +ATOM 1853 OT HOH 448 2.55910 11.2744 9.59542 1.00 0.00 WATR +ATOM 1854 HT HOH 448 3.31605 11.8603 9.59542 1.00 0.00 WATR +ATOM 1855 HT HOH 448 1.80215 11.8603 9.59542 1.00 0.00 WATR +ATOM 1856 OT HOH 449 0.09589 13.7376 9.59542 1.00 0.00 WATR +ATOM 1857 HT HOH 449 0.85284 14.3235 9.59542 1.00 0.00 WATR +ATOM 1858 HT HOH 449 -0.6610 14.3235 9.59542 1.00 0.00 WATR +ATOM 1859 OT HOH 450 5.02230 -13.357 -12.573 1.00 0.00 WATR +ATOM 1860 HT HOH 450 5.77925 -12.771 -12.573 1.00 0.00 WATR +ATOM 1861 HT HOH 450 4.26535 -12.771 -12.573 1.00 0.00 WATR +ATOM 1862 OT HOH 451 7.48551 -10.894 -12.573 1.00 0.00 WATR +ATOM 1863 HT HOH 451 8.24246 -10.308 -12.573 1.00 0.00 WATR +ATOM 1864 HT HOH 451 6.72856 -10.308 -12.573 1.00 0.00 WATR +ATOM 1865 OT HOH 452 7.48551 -13.357 -10.110 1.00 0.00 WATR +ATOM 1866 HT HOH 452 8.24246 -12.771 -10.110 1.00 0.00 WATR +ATOM 1867 HT HOH 452 6.72856 -12.771 -10.110 1.00 0.00 WATR +ATOM 1868 OT HOH 453 5.02230 -10.894 -10.110 1.00 0.00 WATR +ATOM 1869 HT HOH 453 5.77925 -10.308 -10.110 1.00 0.00 WATR +ATOM 1870 HT HOH 453 4.26535 -10.308 -10.110 1.00 0.00 WATR +ATOM 1871 OT HOH 454 5.02230 -13.357 -7.6470 1.00 0.00 WATR +ATOM 1872 HT HOH 454 5.77925 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1873 HT HOH 454 4.26535 -12.771 -7.6470 1.00 0.00 WATR +ATOM 1874 OT HOH 455 7.48551 -10.894 -7.6470 1.00 0.00 WATR +ATOM 1875 HT HOH 455 8.24246 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1876 HT HOH 455 6.72856 -10.308 -7.6470 1.00 0.00 WATR +ATOM 1877 OT HOH 456 7.48551 -13.357 -5.1838 1.00 0.00 WATR +ATOM 1878 HT HOH 456 8.24246 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1879 HT HOH 456 6.72856 -12.771 -5.1838 1.00 0.00 WATR +ATOM 1880 OT HOH 457 5.02230 -10.894 -5.1838 1.00 0.00 WATR +ATOM 1881 HT HOH 457 5.77925 -10.308 -5.1838 1.00 0.00 WATR +ATOM 1882 HT HOH 457 4.26535 -10.308 -5.1838 1.00 0.00 WATR +ATOM 1883 OT HOH 458 5.02230 -13.357 -2.7206 1.00 0.00 WATR +ATOM 1884 HT HOH 458 5.77925 -12.771 -2.7206 1.00 0.00 WATR +ATOM 1885 HT HOH 458 4.26535 -12.771 -2.7206 1.00 0.00 WATR +ATOM 1886 OT HOH 459 7.48551 -10.894 -2.7206 1.00 0.00 WATR +ATOM 1887 HT HOH 459 8.24246 -10.308 -2.7206 1.00 0.00 WATR +ATOM 1888 HT HOH 459 6.72856 -10.308 -2.7206 1.00 0.00 WATR +ATOM 1889 OT HOH 460 7.48551 -13.357 -0.2573 1.00 0.00 WATR +ATOM 1890 HT HOH 460 8.24246 -12.771 -0.2573 1.00 0.00 WATR +ATOM 1891 HT HOH 460 6.72856 -12.771 -0.2573 1.00 0.00 WATR +ATOM 1892 OT HOH 461 5.02230 -13.357 2.20580 1.00 0.00 WATR +ATOM 1893 HT HOH 461 5.77925 -12.771 2.20580 1.00 0.00 WATR +ATOM 1894 HT HOH 461 4.26535 -12.771 2.20580 1.00 0.00 WATR +ATOM 1895 OT HOH 462 7.48551 -10.894 2.20580 1.00 0.00 WATR +ATOM 1896 HT HOH 462 8.24246 -10.308 2.20580 1.00 0.00 WATR +ATOM 1897 HT HOH 462 6.72856 -10.308 2.20580 1.00 0.00 WATR +ATOM 1898 OT HOH 463 7.48551 -13.357 4.66901 1.00 0.00 WATR +ATOM 1899 HT HOH 463 8.24246 -12.771 4.66901 1.00 0.00 WATR +ATOM 1900 HT HOH 463 6.72856 -12.771 4.66901 1.00 0.00 WATR +ATOM 1901 OT HOH 464 5.02230 -10.894 4.66901 1.00 0.00 WATR +ATOM 1902 HT HOH 464 5.77925 -10.308 4.66901 1.00 0.00 WATR +ATOM 1903 HT HOH 464 4.26535 -10.308 4.66901 1.00 0.00 WATR +ATOM 1904 OT HOH 465 5.02230 -13.357 7.13221 1.00 0.00 WATR +ATOM 1905 HT HOH 465 5.77925 -12.771 7.13221 1.00 0.00 WATR +ATOM 1906 HT HOH 465 4.26535 -12.771 7.13221 1.00 0.00 WATR +ATOM 1907 OT HOH 466 7.48551 -10.894 7.13221 1.00 0.00 WATR +ATOM 1908 HT HOH 466 8.24246 -10.308 7.13221 1.00 0.00 WATR +ATOM 1909 HT HOH 466 6.72856 -10.308 7.13221 1.00 0.00 WATR +ATOM 1910 OT HOH 467 7.48551 -13.357 9.59542 1.00 0.00 WATR +ATOM 1911 HT HOH 467 8.24246 -12.771 9.59542 1.00 0.00 WATR +ATOM 1912 HT HOH 467 6.72856 -12.771 9.59542 1.00 0.00 WATR +ATOM 1913 OT HOH 468 5.02230 -10.894 9.59542 1.00 0.00 WATR +ATOM 1914 HT HOH 468 5.77925 -10.308 9.59542 1.00 0.00 WATR +ATOM 1915 HT HOH 468 4.26535 -10.308 9.59542 1.00 0.00 WATR +ATOM 1916 OT HOH 469 5.02230 -8.4312 -12.573 1.00 0.00 WATR +ATOM 1917 HT HOH 469 5.77925 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1918 HT HOH 469 4.26535 -7.8453 -12.573 1.00 0.00 WATR +ATOM 1919 OT HOH 470 7.48551 -8.4312 -10.110 1.00 0.00 WATR +ATOM 1920 HT HOH 470 8.24246 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1921 HT HOH 470 6.72856 -7.8453 -10.110 1.00 0.00 WATR +ATOM 1922 OT HOH 471 5.02230 -5.9680 -10.110 1.00 0.00 WATR +ATOM 1923 HT HOH 471 5.77925 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1924 HT HOH 471 4.26535 -5.3821 -10.110 1.00 0.00 WATR +ATOM 1925 OT HOH 472 5.02230 -8.4312 -7.6470 1.00 0.00 WATR +ATOM 1926 HT HOH 472 5.77925 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 1927 HT HOH 472 4.26535 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 1928 OT HOH 473 7.48551 -8.4312 9.59542 1.00 0.00 WATR +ATOM 1929 HT HOH 473 8.24246 -7.8453 9.59542 1.00 0.00 WATR +ATOM 1930 HT HOH 473 6.72856 -7.8453 9.59542 1.00 0.00 WATR +ATOM 1931 OT HOH 474 5.02230 -1.0416 9.59542 1.00 0.00 WATR +ATOM 1932 HT HOH 474 5.77925 -0.4557 9.59542 1.00 0.00 WATR +ATOM 1933 HT HOH 474 4.26535 -0.4557 9.59542 1.00 0.00 WATR +ATOM 1934 OT HOH 475 5.02230 1.42160 -12.573 1.00 0.00 WATR +ATOM 1935 HT HOH 475 5.77925 2.00748 -12.573 1.00 0.00 WATR +ATOM 1936 HT HOH 475 4.26535 2.00748 -12.573 1.00 0.00 WATR +ATOM 1937 OT HOH 476 7.48551 3.88480 -12.573 1.00 0.00 WATR +ATOM 1938 HT HOH 476 8.24246 4.47069 -12.573 1.00 0.00 WATR +ATOM 1939 HT HOH 476 6.72856 4.47069 -12.573 1.00 0.00 WATR +ATOM 1940 OT HOH 477 7.48551 1.42160 9.59542 1.00 0.00 WATR +ATOM 1941 HT HOH 477 8.24246 2.00748 9.59542 1.00 0.00 WATR +ATOM 1942 HT HOH 477 6.72856 2.00748 9.59542 1.00 0.00 WATR +ATOM 1943 OT HOH 478 5.02230 6.34801 -12.573 1.00 0.00 WATR +ATOM 1944 HT HOH 478 5.77925 6.93389 -12.573 1.00 0.00 WATR +ATOM 1945 HT HOH 478 4.26535 6.93389 -12.573 1.00 0.00 WATR +ATOM 1946 OT HOH 479 7.48551 8.81121 -12.573 1.00 0.00 WATR +ATOM 1947 HT HOH 479 8.24246 9.39710 -12.573 1.00 0.00 WATR +ATOM 1948 HT HOH 479 6.72856 9.39710 -12.573 1.00 0.00 WATR +ATOM 1949 OT HOH 480 7.48551 6.34801 -10.110 1.00 0.00 WATR +ATOM 1950 HT HOH 480 8.24246 6.93389 -10.110 1.00 0.00 WATR +ATOM 1951 HT HOH 480 6.72856 6.93389 -10.110 1.00 0.00 WATR +ATOM 1952 OT HOH 481 5.02230 8.81121 -10.110 1.00 0.00 WATR +ATOM 1953 HT HOH 481 5.77925 9.39710 -10.110 1.00 0.00 WATR +ATOM 1954 HT HOH 481 4.26535 9.39710 -10.110 1.00 0.00 WATR +ATOM 1955 OT HOH 482 7.48551 8.81121 -7.6470 1.00 0.00 WATR +ATOM 1956 HT HOH 482 8.24246 9.39710 -7.6470 1.00 0.00 WATR +ATOM 1957 HT HOH 482 6.72856 9.39710 -7.6470 1.00 0.00 WATR +ATOM 1958 OT HOH 483 7.48551 6.34801 9.59542 1.00 0.00 WATR +ATOM 1959 HT HOH 483 8.24246 6.93389 9.59542 1.00 0.00 WATR +ATOM 1960 HT HOH 483 6.72856 6.93389 9.59542 1.00 0.00 WATR +ATOM 1961 OT HOH 484 5.02230 8.81121 9.59542 1.00 0.00 WATR +ATOM 1962 HT HOH 484 5.77925 9.39710 9.59542 1.00 0.00 WATR +ATOM 1963 HT HOH 484 4.26535 9.39710 9.59542 1.00 0.00 WATR +ATOM 1964 OT HOH 485 5.02230 11.2744 -12.573 1.00 0.00 WATR +ATOM 1965 HT HOH 485 5.77925 11.8603 -12.573 1.00 0.00 WATR +ATOM 1966 HT HOH 485 4.26535 11.8603 -12.573 1.00 0.00 WATR +ATOM 1967 OT HOH 486 7.48551 13.7376 -12.573 1.00 0.00 WATR +ATOM 1968 HT HOH 486 8.24246 14.3235 -12.573 1.00 0.00 WATR +ATOM 1969 HT HOH 486 6.72856 14.3235 -12.573 1.00 0.00 WATR +ATOM 1970 OT HOH 487 7.48551 11.2744 -10.110 1.00 0.00 WATR +ATOM 1971 HT HOH 487 8.24246 11.8603 -10.110 1.00 0.00 WATR +ATOM 1972 HT HOH 487 6.72856 11.8603 -10.110 1.00 0.00 WATR +ATOM 1973 OT HOH 488 5.02230 13.7376 -10.110 1.00 0.00 WATR +ATOM 1974 HT HOH 488 5.77925 14.3235 -10.110 1.00 0.00 WATR +ATOM 1975 HT HOH 488 4.26535 14.3235 -10.110 1.00 0.00 WATR +ATOM 1976 OT HOH 489 5.02230 11.2744 -7.6470 1.00 0.00 WATR +ATOM 1977 HT HOH 489 5.77925 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1978 HT HOH 489 4.26535 11.8603 -7.6470 1.00 0.00 WATR +ATOM 1979 OT HOH 490 7.48551 13.7376 -7.6470 1.00 0.00 WATR +ATOM 1980 HT HOH 490 8.24246 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1981 HT HOH 490 6.72856 14.3235 -7.6470 1.00 0.00 WATR +ATOM 1982 OT HOH 491 7.48551 11.2744 -5.1838 1.00 0.00 WATR +ATOM 1983 HT HOH 491 8.24246 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1984 HT HOH 491 6.72856 11.8603 -5.1838 1.00 0.00 WATR +ATOM 1985 OT HOH 492 5.02230 13.7376 -5.1838 1.00 0.00 WATR +ATOM 1986 HT HOH 492 5.77925 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1987 HT HOH 492 4.26535 14.3235 -5.1838 1.00 0.00 WATR +ATOM 1988 OT HOH 493 5.02230 11.2744 -2.7206 1.00 0.00 WATR +ATOM 1989 HT HOH 493 5.77925 11.8603 -2.7206 1.00 0.00 WATR +ATOM 1990 HT HOH 493 4.26535 11.8603 -2.7206 1.00 0.00 WATR +ATOM 1991 OT HOH 494 7.48551 13.7376 -2.7206 1.00 0.00 WATR +ATOM 1992 HT HOH 494 8.24246 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1993 HT HOH 494 6.72856 14.3235 -2.7206 1.00 0.00 WATR +ATOM 1994 OT HOH 495 7.48551 13.7376 2.20580 1.00 0.00 WATR +ATOM 1995 HT HOH 495 8.24246 14.3235 2.20580 1.00 0.00 WATR +ATOM 1996 HT HOH 495 6.72856 14.3235 2.20580 1.00 0.00 WATR +ATOM 1997 OT HOH 496 5.02230 13.7376 4.66901 1.00 0.00 WATR +ATOM 1998 HT HOH 496 5.77925 14.3235 4.66901 1.00 0.00 WATR +ATOM 1999 HT HOH 496 4.26535 14.3235 4.66901 1.00 0.00 WATR +ATOM 2000 OT HOH 497 7.48551 13.7376 7.13221 1.00 0.00 WATR +ATOM 2001 HT HOH 497 8.24246 14.3235 7.13221 1.00 0.00 WATR +ATOM 2002 HT HOH 497 6.72856 14.3235 7.13221 1.00 0.00 WATR +ATOM 2003 OT HOH 498 7.48551 11.2744 9.59542 1.00 0.00 WATR +ATOM 2004 HT HOH 498 8.24246 11.8603 9.59542 1.00 0.00 WATR +ATOM 2005 HT HOH 498 6.72856 11.8603 9.59542 1.00 0.00 WATR +ATOM 2006 OT HOH 499 5.02230 13.7376 9.59542 1.00 0.00 WATR +ATOM 2007 HT HOH 499 5.77925 14.3235 9.59542 1.00 0.00 WATR +ATOM 2008 HT HOH 499 4.26535 14.3235 9.59542 1.00 0.00 WATR +ATOM 2009 OT HOH 500 9.94871 -13.357 -12.573 1.00 0.00 WATR +ATOM 2010 HT HOH 500 10.7056 -12.771 -12.573 1.00 0.00 WATR +ATOM 2011 HT HOH 500 9.19176 -12.771 -12.573 1.00 0.00 WATR +ATOM 2012 OT HOH 501 12.4119 -10.894 -12.573 1.00 0.00 WATR +ATOM 2013 HT HOH 501 13.1688 -10.308 -12.573 1.00 0.00 WATR +ATOM 2014 HT HOH 501 11.6549 -10.308 -12.573 1.00 0.00 WATR +ATOM 2015 OT HOH 502 12.4119 -13.357 -10.110 1.00 0.00 WATR +ATOM 2016 HT HOH 502 13.1688 -12.771 -10.110 1.00 0.00 WATR +ATOM 2017 HT HOH 502 11.6549 -12.771 -10.110 1.00 0.00 WATR +ATOM 2018 OT HOH 503 9.94871 -10.894 -10.110 1.00 0.00 WATR +ATOM 2019 HT HOH 503 10.7056 -10.308 -10.110 1.00 0.00 WATR +ATOM 2020 HT HOH 503 9.19176 -10.308 -10.110 1.00 0.00 WATR +ATOM 2021 OT HOH 504 9.94871 -13.357 -7.6470 1.00 0.00 WATR +ATOM 2022 HT HOH 504 10.7056 -12.771 -7.6470 1.00 0.00 WATR +ATOM 2023 HT HOH 504 9.19176 -12.771 -7.6470 1.00 0.00 WATR +ATOM 2024 OT HOH 505 12.4119 -10.894 -7.6470 1.00 0.00 WATR +ATOM 2025 HT HOH 505 13.1688 -10.308 -7.6470 1.00 0.00 WATR +ATOM 2026 HT HOH 505 11.6549 -10.308 -7.6470 1.00 0.00 WATR +ATOM 2027 OT HOH 506 12.4119 -13.357 -5.1838 1.00 0.00 WATR +ATOM 2028 HT HOH 506 13.1688 -12.771 -5.1838 1.00 0.00 WATR +ATOM 2029 HT HOH 506 11.6549 -12.771 -5.1838 1.00 0.00 WATR +ATOM 2030 OT HOH 507 9.94871 -10.894 -5.1838 1.00 0.00 WATR +ATOM 2031 HT HOH 507 10.7056 -10.308 -5.1838 1.00 0.00 WATR +ATOM 2032 HT HOH 507 9.19176 -10.308 -5.1838 1.00 0.00 WATR +ATOM 2033 OT HOH 508 9.94871 -13.357 -2.7206 1.00 0.00 WATR +ATOM 2034 HT HOH 508 10.7056 -12.771 -2.7206 1.00 0.00 WATR +ATOM 2035 HT HOH 508 9.19176 -12.771 -2.7206 1.00 0.00 WATR +ATOM 2036 OT HOH 509 12.4119 -10.894 -2.7206 1.00 0.00 WATR +ATOM 2037 HT HOH 509 13.1688 -10.308 -2.7206 1.00 0.00 WATR +ATOM 2038 HT HOH 509 11.6549 -10.308 -2.7206 1.00 0.00 WATR +ATOM 2039 OT HOH 510 12.4119 -13.357 -0.2573 1.00 0.00 WATR +ATOM 2040 HT HOH 510 13.1688 -12.771 -0.2573 1.00 0.00 WATR +ATOM 2041 HT HOH 510 11.6549 -12.771 -0.2573 1.00 0.00 WATR +ATOM 2042 OT HOH 511 9.94871 -10.894 -0.2573 1.00 0.00 WATR +ATOM 2043 HT HOH 511 10.7056 -10.308 -0.2573 1.00 0.00 WATR +ATOM 2044 HT HOH 511 9.19176 -10.308 -0.2573 1.00 0.00 WATR +ATOM 2045 OT HOH 512 9.94871 -13.357 2.20580 1.00 0.00 WATR +ATOM 2046 HT HOH 512 10.7056 -12.771 2.20580 1.00 0.00 WATR +ATOM 2047 HT HOH 512 9.19176 -12.771 2.20580 1.00 0.00 WATR +ATOM 2048 OT HOH 513 12.4119 -10.894 2.20580 1.00 0.00 WATR +ATOM 2049 HT HOH 513 13.1688 -10.308 2.20580 1.00 0.00 WATR +ATOM 2050 HT HOH 513 11.6549 -10.308 2.20580 1.00 0.00 WATR +ATOM 2051 OT HOH 514 12.4119 -13.357 4.66901 1.00 0.00 WATR +ATOM 2052 HT HOH 514 13.1688 -12.771 4.66901 1.00 0.00 WATR +ATOM 2053 HT HOH 514 11.6549 -12.771 4.66901 1.00 0.00 WATR +ATOM 2054 OT HOH 515 9.94871 -10.894 4.66901 1.00 0.00 WATR +ATOM 2055 HT HOH 515 10.7056 -10.308 4.66901 1.00 0.00 WATR +ATOM 2056 HT HOH 515 9.19176 -10.308 4.66901 1.00 0.00 WATR +ATOM 2057 OT HOH 516 9.94871 -13.357 7.13221 1.00 0.00 WATR +ATOM 2058 HT HOH 516 10.7056 -12.771 7.13221 1.00 0.00 WATR +ATOM 2059 HT HOH 516 9.19176 -12.771 7.13221 1.00 0.00 WATR +ATOM 2060 OT HOH 517 12.4119 -10.894 7.13221 1.00 0.00 WATR +ATOM 2061 HT HOH 517 13.1688 -10.308 7.13221 1.00 0.00 WATR +ATOM 2062 HT HOH 517 11.6549 -10.308 7.13221 1.00 0.00 WATR +ATOM 2063 OT HOH 518 12.4119 -13.357 9.59542 1.00 0.00 WATR +ATOM 2064 HT HOH 518 13.1688 -12.771 9.59542 1.00 0.00 WATR +ATOM 2065 HT HOH 518 11.6549 -12.771 9.59542 1.00 0.00 WATR +ATOM 2066 OT HOH 519 9.94871 -10.894 9.59542 1.00 0.00 WATR +ATOM 2067 HT HOH 519 10.7056 -10.308 9.59542 1.00 0.00 WATR +ATOM 2068 HT HOH 519 9.19176 -10.308 9.59542 1.00 0.00 WATR +ATOM 2069 OT HOH 520 9.94871 -8.4312 -12.573 1.00 0.00 WATR +ATOM 2070 HT HOH 520 10.7056 -7.8453 -12.573 1.00 0.00 WATR +ATOM 2071 HT HOH 520 9.19176 -7.8453 -12.573 1.00 0.00 WATR +ATOM 2072 OT HOH 521 12.4119 -5.9680 -12.573 1.00 0.00 WATR +ATOM 2073 HT HOH 521 13.1688 -5.3821 -12.573 1.00 0.00 WATR +ATOM 2074 HT HOH 521 11.6549 -5.3821 -12.573 1.00 0.00 WATR +ATOM 2075 OT HOH 522 12.4119 -8.4312 -10.110 1.00 0.00 WATR +ATOM 2076 HT HOH 522 13.1688 -7.8453 -10.110 1.00 0.00 WATR +ATOM 2077 HT HOH 522 11.6549 -7.8453 -10.110 1.00 0.00 WATR +ATOM 2078 OT HOH 523 9.94871 -5.9680 -10.110 1.00 0.00 WATR +ATOM 2079 HT HOH 523 10.7056 -5.3821 -10.110 1.00 0.00 WATR +ATOM 2080 HT HOH 523 9.19176 -5.3821 -10.110 1.00 0.00 WATR +ATOM 2081 OT HOH 524 9.94871 -8.4312 -7.6470 1.00 0.00 WATR +ATOM 2082 HT HOH 524 10.7056 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 2083 HT HOH 524 9.19176 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 2084 OT HOH 525 12.4119 -5.9680 -7.6470 1.00 0.00 WATR +ATOM 2085 HT HOH 525 13.1688 -5.3821 -7.6470 1.00 0.00 WATR +ATOM 2086 HT HOH 525 11.6549 -5.3821 -7.6470 1.00 0.00 WATR +ATOM 2087 OT HOH 526 12.4119 -8.4312 -5.1838 1.00 0.00 WATR +ATOM 2088 HT HOH 526 13.1688 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 2089 HT HOH 526 11.6549 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 2090 OT HOH 527 12.4119 -8.4312 9.59542 1.00 0.00 WATR +ATOM 2091 HT HOH 527 13.1688 -7.8453 9.59542 1.00 0.00 WATR +ATOM 2092 HT HOH 527 11.6549 -7.8453 9.59542 1.00 0.00 WATR +ATOM 2093 OT HOH 528 9.94871 -5.9680 9.59542 1.00 0.00 WATR +ATOM 2094 HT HOH 528 10.7056 -5.3821 9.59542 1.00 0.00 WATR +ATOM 2095 HT HOH 528 9.19176 -5.3821 9.59542 1.00 0.00 WATR +ATOM 2096 OT HOH 529 9.94871 -3.5048 -12.573 1.00 0.00 WATR +ATOM 2097 HT HOH 529 10.7056 -2.9189 -12.573 1.00 0.00 WATR +ATOM 2098 HT HOH 529 9.19176 -2.9189 -12.573 1.00 0.00 WATR +ATOM 2099 OT HOH 530 12.4119 -1.0416 -12.573 1.00 0.00 WATR +ATOM 2100 HT HOH 530 13.1688 -0.4557 -12.573 1.00 0.00 WATR +ATOM 2101 HT HOH 530 11.6549 -0.4557 -12.573 1.00 0.00 WATR +ATOM 2102 OT HOH 531 12.4119 -3.5048 -10.110 1.00 0.00 WATR +ATOM 2103 HT HOH 531 13.1688 -2.9189 -10.110 1.00 0.00 WATR +ATOM 2104 HT HOH 531 11.6549 -2.9189 -10.110 1.00 0.00 WATR +ATOM 2105 OT HOH 532 9.94871 1.42160 -12.573 1.00 0.00 WATR +ATOM 2106 HT HOH 532 10.7056 2.00748 -12.573 1.00 0.00 WATR +ATOM 2107 HT HOH 532 9.19176 2.00748 -12.573 1.00 0.00 WATR +ATOM 2108 OT HOH 533 12.4119 3.88480 -12.573 1.00 0.00 WATR +ATOM 2109 HT HOH 533 13.1688 4.47069 -12.573 1.00 0.00 WATR +ATOM 2110 HT HOH 533 11.6549 4.47069 -12.573 1.00 0.00 WATR +ATOM 2111 OT HOH 534 12.4119 1.42160 -10.110 1.00 0.00 WATR +ATOM 2112 HT HOH 534 13.1688 2.00748 -10.110 1.00 0.00 WATR +ATOM 2113 HT HOH 534 11.6549 2.00748 -10.110 1.00 0.00 WATR +ATOM 2114 OT HOH 535 9.94871 3.88480 -10.110 1.00 0.00 WATR +ATOM 2115 HT HOH 535 10.7056 4.47069 -10.110 1.00 0.00 WATR +ATOM 2116 HT HOH 535 9.19176 4.47069 -10.110 1.00 0.00 WATR +ATOM 2117 OT HOH 536 12.4119 1.42160 9.59542 1.00 0.00 WATR +ATOM 2118 HT HOH 536 13.1688 2.00748 9.59542 1.00 0.00 WATR +ATOM 2119 HT HOH 536 11.6549 2.00748 9.59542 1.00 0.00 WATR +ATOM 2120 OT HOH 537 9.94871 3.88480 9.59542 1.00 0.00 WATR +ATOM 2121 HT HOH 537 10.7056 4.47069 9.59542 1.00 0.00 WATR +ATOM 2122 HT HOH 537 9.19176 4.47069 9.59542 1.00 0.00 WATR +ATOM 2123 OT HOH 538 9.94871 6.34801 -12.573 1.00 0.00 WATR +ATOM 2124 HT HOH 538 10.7056 6.93389 -12.573 1.00 0.00 WATR +ATOM 2125 HT HOH 538 9.19176 6.93389 -12.573 1.00 0.00 WATR +ATOM 2126 OT HOH 539 12.4119 8.81121 -12.573 1.00 0.00 WATR +ATOM 2127 HT HOH 539 13.1688 9.39710 -12.573 1.00 0.00 WATR +ATOM 2128 HT HOH 539 11.6549 9.39710 -12.573 1.00 0.00 WATR +ATOM 2129 OT HOH 540 12.4119 6.34801 -10.110 1.00 0.00 WATR +ATOM 2130 HT HOH 540 13.1688 6.93389 -10.110 1.00 0.00 WATR +ATOM 2131 HT HOH 540 11.6549 6.93389 -10.110 1.00 0.00 WATR +ATOM 2132 OT HOH 541 9.94871 8.81121 -10.110 1.00 0.00 WATR +ATOM 2133 HT HOH 541 10.7056 9.39710 -10.110 1.00 0.00 WATR +ATOM 2134 HT HOH 541 9.19176 9.39710 -10.110 1.00 0.00 WATR +ATOM 2135 OT HOH 542 12.4119 8.81121 -7.6470 1.00 0.00 WATR +ATOM 2136 HT HOH 542 13.1688 9.39710 -7.6470 1.00 0.00 WATR +ATOM 2137 HT HOH 542 11.6549 9.39710 -7.6470 1.00 0.00 WATR +ATOM 2138 OT HOH 543 12.4119 8.81121 -2.7206 1.00 0.00 WATR +ATOM 2139 HT HOH 543 13.1688 9.39710 -2.7206 1.00 0.00 WATR +ATOM 2140 HT HOH 543 11.6549 9.39710 -2.7206 1.00 0.00 WATR +ATOM 2141 OT HOH 544 12.4119 8.81121 2.20580 1.00 0.00 WATR +ATOM 2142 HT HOH 544 13.1688 9.39710 2.20580 1.00 0.00 WATR +ATOM 2143 HT HOH 544 11.6549 9.39710 2.20580 1.00 0.00 WATR +ATOM 2144 OT HOH 545 12.4119 8.81121 7.13221 1.00 0.00 WATR +ATOM 2145 HT HOH 545 13.1688 9.39710 7.13221 1.00 0.00 WATR +ATOM 2146 HT HOH 545 11.6549 9.39710 7.13221 1.00 0.00 WATR +ATOM 2147 OT HOH 546 12.4119 6.34801 9.59542 1.00 0.00 WATR +ATOM 2148 HT HOH 546 13.1688 6.93389 9.59542 1.00 0.00 WATR +ATOM 2149 HT HOH 546 11.6549 6.93389 9.59542 1.00 0.00 WATR +ATOM 2150 OT HOH 547 9.94871 8.81121 9.59542 1.00 0.00 WATR +ATOM 2151 HT HOH 547 10.7056 9.39710 9.59542 1.00 0.00 WATR +ATOM 2152 HT HOH 547 9.19176 9.39710 9.59542 1.00 0.00 WATR +ATOM 2153 OT HOH 548 9.94871 11.2744 -12.573 1.00 0.00 WATR +ATOM 2154 HT HOH 548 10.7056 11.8603 -12.573 1.00 0.00 WATR +ATOM 2155 HT HOH 548 9.19176 11.8603 -12.573 1.00 0.00 WATR +ATOM 2156 OT HOH 549 12.4119 13.7376 -12.573 1.00 0.00 WATR +ATOM 2157 HT HOH 549 13.1688 14.3235 -12.573 1.00 0.00 WATR +ATOM 2158 HT HOH 549 11.6549 14.3235 -12.573 1.00 0.00 WATR +ATOM 2159 OT HOH 550 12.4119 11.2744 -10.110 1.00 0.00 WATR +ATOM 2160 HT HOH 550 13.1688 11.8603 -10.110 1.00 0.00 WATR +ATOM 2161 HT HOH 550 11.6549 11.8603 -10.110 1.00 0.00 WATR +ATOM 2162 OT HOH 551 9.94871 13.7376 -10.110 1.00 0.00 WATR +ATOM 2163 HT HOH 551 10.7056 14.3235 -10.110 1.00 0.00 WATR +ATOM 2164 HT HOH 551 9.19176 14.3235 -10.110 1.00 0.00 WATR +ATOM 2165 OT HOH 552 9.94871 11.2744 -7.6470 1.00 0.00 WATR +ATOM 2166 HT HOH 552 10.7056 11.8603 -7.6470 1.00 0.00 WATR +ATOM 2167 HT HOH 552 9.19176 11.8603 -7.6470 1.00 0.00 WATR +ATOM 2168 OT HOH 553 12.4119 13.7376 -7.6470 1.00 0.00 WATR +ATOM 2169 HT HOH 553 13.1688 14.3235 -7.6470 1.00 0.00 WATR +ATOM 2170 HT HOH 553 11.6549 14.3235 -7.6470 1.00 0.00 WATR +ATOM 2171 OT HOH 554 12.4119 11.2744 -5.1838 1.00 0.00 WATR +ATOM 2172 HT HOH 554 13.1688 11.8603 -5.1838 1.00 0.00 WATR +ATOM 2173 HT HOH 554 11.6549 11.8603 -5.1838 1.00 0.00 WATR +ATOM 2174 OT HOH 555 9.94871 13.7376 -5.1838 1.00 0.00 WATR +ATOM 2175 HT HOH 555 10.7056 14.3235 -5.1838 1.00 0.00 WATR +ATOM 2176 HT HOH 555 9.19176 14.3235 -5.1838 1.00 0.00 WATR +ATOM 2177 OT HOH 556 12.4119 13.7376 -2.7206 1.00 0.00 WATR +ATOM 2178 HT HOH 556 13.1688 14.3235 -2.7206 1.00 0.00 WATR +ATOM 2179 HT HOH 556 11.6549 14.3235 -2.7206 1.00 0.00 WATR +ATOM 2180 OT HOH 557 12.4119 11.2744 -0.2573 1.00 0.00 WATR +ATOM 2181 HT HOH 557 13.1688 11.8603 -0.2573 1.00 0.00 WATR +ATOM 2182 HT HOH 557 11.6549 11.8603 -0.2573 1.00 0.00 WATR +ATOM 2183 OT HOH 558 9.94871 13.7376 -0.2573 1.00 0.00 WATR +ATOM 2184 HT HOH 558 10.7056 14.3235 -0.2573 1.00 0.00 WATR +ATOM 2185 HT HOH 558 9.19176 14.3235 -0.2573 1.00 0.00 WATR +ATOM 2186 OT HOH 559 12.4119 13.7376 2.20580 1.00 0.00 WATR +ATOM 2187 HT HOH 559 13.1688 14.3235 2.20580 1.00 0.00 WATR +ATOM 2188 HT HOH 559 11.6549 14.3235 2.20580 1.00 0.00 WATR +ATOM 2189 OT HOH 560 12.4119 11.2744 4.66901 1.00 0.00 WATR +ATOM 2190 HT HOH 560 13.1688 11.8603 4.66901 1.00 0.00 WATR +ATOM 2191 HT HOH 560 11.6549 11.8603 4.66901 1.00 0.00 WATR +ATOM 2192 OT HOH 561 9.94871 13.7376 4.66901 1.00 0.00 WATR +ATOM 2193 HT HOH 561 10.7056 14.3235 4.66901 1.00 0.00 WATR +ATOM 2194 HT HOH 561 9.19176 14.3235 4.66901 1.00 0.00 WATR +ATOM 2195 OT HOH 562 9.94871 11.2744 7.13221 1.00 0.00 WATR +ATOM 2196 HT HOH 562 10.7056 11.8603 7.13221 1.00 0.00 WATR +ATOM 2197 HT HOH 562 9.19176 11.8603 7.13221 1.00 0.00 WATR +ATOM 2198 OT HOH 563 12.4119 13.7376 7.13221 1.00 0.00 WATR +ATOM 2199 HT HOH 563 13.1688 14.3235 7.13221 1.00 0.00 WATR +ATOM 2200 HT HOH 563 11.6549 14.3235 7.13221 1.00 0.00 WATR +ATOM 2201 OT HOH 564 12.4119 11.2744 9.59542 1.00 0.00 WATR +ATOM 2202 HT HOH 564 13.1688 11.8603 9.59542 1.00 0.00 WATR +ATOM 2203 HT HOH 564 11.6549 11.8603 9.59542 1.00 0.00 WATR +ATOM 2204 OT HOH 565 9.94871 13.7376 9.59542 1.00 0.00 WATR +ATOM 2205 HT HOH 565 10.7056 14.3235 9.59542 1.00 0.00 WATR +ATOM 2206 HT HOH 565 9.19176 14.3235 9.59542 1.00 0.00 WATR +ATOM 2207 OT HOH 566 14.8751 -13.357 -12.573 1.00 0.00 WATR +ATOM 2208 HT HOH 566 15.6320 -12.771 -12.573 1.00 0.00 WATR +ATOM 2209 HT HOH 566 14.1181 -12.771 -12.573 1.00 0.00 WATR +ATOM 2210 OT HOH 567 17.3383 -10.894 -12.573 1.00 0.00 WATR +ATOM 2211 HT HOH 567 18.0952 -10.308 -12.573 1.00 0.00 WATR +ATOM 2212 HT HOH 567 16.5813 -10.308 -12.573 1.00 0.00 WATR +ATOM 2213 OT HOH 568 17.3383 -13.357 -10.110 1.00 0.00 WATR +ATOM 2214 HT HOH 568 18.0952 -12.771 -10.110 1.00 0.00 WATR +ATOM 2215 HT HOH 568 16.5813 -12.771 -10.110 1.00 0.00 WATR +ATOM 2216 OT HOH 569 14.8751 -10.894 -10.110 1.00 0.00 WATR +ATOM 2217 HT HOH 569 15.6320 -10.308 -10.110 1.00 0.00 WATR +ATOM 2218 HT HOH 569 14.1181 -10.308 -10.110 1.00 0.00 WATR +ATOM 2219 OT HOH 570 14.8751 -13.357 -7.6470 1.00 0.00 WATR +ATOM 2220 HT HOH 570 15.6320 -12.771 -7.6470 1.00 0.00 WATR +ATOM 2221 HT HOH 570 14.1181 -12.771 -7.6470 1.00 0.00 WATR +ATOM 2222 OT HOH 571 17.3383 -10.894 -7.6470 1.00 0.00 WATR +ATOM 2223 HT HOH 571 18.0952 -10.308 -7.6470 1.00 0.00 WATR +ATOM 2224 HT HOH 571 16.5813 -10.308 -7.6470 1.00 0.00 WATR +ATOM 2225 OT HOH 572 17.3383 -13.357 -5.1838 1.00 0.00 WATR +ATOM 2226 HT HOH 572 18.0952 -12.771 -5.1838 1.00 0.00 WATR +ATOM 2227 HT HOH 572 16.5813 -12.771 -5.1838 1.00 0.00 WATR +ATOM 2228 OT HOH 573 14.8751 -10.894 -5.1838 1.00 0.00 WATR +ATOM 2229 HT HOH 573 15.6320 -10.308 -5.1838 1.00 0.00 WATR +ATOM 2230 HT HOH 573 14.1181 -10.308 -5.1838 1.00 0.00 WATR +ATOM 2231 OT HOH 574 14.8751 -13.357 -2.7206 1.00 0.00 WATR +ATOM 2232 HT HOH 574 15.6320 -12.771 -2.7206 1.00 0.00 WATR +ATOM 2233 HT HOH 574 14.1181 -12.771 -2.7206 1.00 0.00 WATR +ATOM 2234 OT HOH 575 17.3383 -10.894 -2.7206 1.00 0.00 WATR +ATOM 2235 HT HOH 575 18.0952 -10.308 -2.7206 1.00 0.00 WATR +ATOM 2236 HT HOH 575 16.5813 -10.308 -2.7206 1.00 0.00 WATR +ATOM 2237 OT HOH 576 17.3383 -13.357 -0.2573 1.00 0.00 WATR +ATOM 2238 HT HOH 576 18.0952 -12.771 -0.2573 1.00 0.00 WATR +ATOM 2239 HT HOH 576 16.5813 -12.771 -0.2573 1.00 0.00 WATR +ATOM 2240 OT HOH 577 14.8751 -10.894 -0.2573 1.00 0.00 WATR +ATOM 2241 HT HOH 577 15.6320 -10.308 -0.2573 1.00 0.00 WATR +ATOM 2242 HT HOH 577 14.1181 -10.308 -0.2573 1.00 0.00 WATR +ATOM 2243 OT HOH 578 14.8751 -13.357 2.20580 1.00 0.00 WATR +ATOM 2244 HT HOH 578 15.6320 -12.771 2.20580 1.00 0.00 WATR +ATOM 2245 HT HOH 578 14.1181 -12.771 2.20580 1.00 0.00 WATR +ATOM 2246 OT HOH 579 17.3383 -10.894 2.20580 1.00 0.00 WATR +ATOM 2247 HT HOH 579 18.0952 -10.308 2.20580 1.00 0.00 WATR +ATOM 2248 HT HOH 579 16.5813 -10.308 2.20580 1.00 0.00 WATR +ATOM 2249 OT HOH 580 17.3383 -13.357 4.66901 1.00 0.00 WATR +ATOM 2250 HT HOH 580 18.0952 -12.771 4.66901 1.00 0.00 WATR +ATOM 2251 HT HOH 580 16.5813 -12.771 4.66901 1.00 0.00 WATR +ATOM 2252 OT HOH 581 14.8751 -10.894 4.66901 1.00 0.00 WATR +ATOM 2253 HT HOH 581 15.6320 -10.308 4.66901 1.00 0.00 WATR +ATOM 2254 HT HOH 581 14.1181 -10.308 4.66901 1.00 0.00 WATR +ATOM 2255 OT HOH 582 14.8751 -13.357 7.13221 1.00 0.00 WATR +ATOM 2256 HT HOH 582 15.6320 -12.771 7.13221 1.00 0.00 WATR +ATOM 2257 HT HOH 582 14.1181 -12.771 7.13221 1.00 0.00 WATR +ATOM 2258 OT HOH 583 17.3383 -10.894 7.13221 1.00 0.00 WATR +ATOM 2259 HT HOH 583 18.0952 -10.308 7.13221 1.00 0.00 WATR +ATOM 2260 HT HOH 583 16.5813 -10.308 7.13221 1.00 0.00 WATR +ATOM 2261 OT HOH 584 17.3383 -13.357 9.59542 1.00 0.00 WATR +ATOM 2262 HT HOH 584 18.0952 -12.771 9.59542 1.00 0.00 WATR +ATOM 2263 HT HOH 584 16.5813 -12.771 9.59542 1.00 0.00 WATR +ATOM 2264 OT HOH 585 14.8751 -10.894 9.59542 1.00 0.00 WATR +ATOM 2265 HT HOH 585 15.6320 -10.308 9.59542 1.00 0.00 WATR +ATOM 2266 HT HOH 585 14.1181 -10.308 9.59542 1.00 0.00 WATR +ATOM 2267 OT HOH 586 14.8751 -8.4312 -12.573 1.00 0.00 WATR +ATOM 2268 HT HOH 586 15.6320 -7.8453 -12.573 1.00 0.00 WATR +ATOM 2269 HT HOH 586 14.1181 -7.8453 -12.573 1.00 0.00 WATR +ATOM 2270 OT HOH 587 17.3383 -5.9680 -12.573 1.00 0.00 WATR +ATOM 2271 HT HOH 587 18.0952 -5.3821 -12.573 1.00 0.00 WATR +ATOM 2272 HT HOH 587 16.5813 -5.3821 -12.573 1.00 0.00 WATR +ATOM 2273 OT HOH 588 17.3383 -8.4312 -10.110 1.00 0.00 WATR +ATOM 2274 HT HOH 588 18.0952 -7.8453 -10.110 1.00 0.00 WATR +ATOM 2275 HT HOH 588 16.5813 -7.8453 -10.110 1.00 0.00 WATR +ATOM 2276 OT HOH 589 14.8751 -5.9680 -10.110 1.00 0.00 WATR +ATOM 2277 HT HOH 589 15.6320 -5.3821 -10.110 1.00 0.00 WATR +ATOM 2278 HT HOH 589 14.1181 -5.3821 -10.110 1.00 0.00 WATR +ATOM 2279 OT HOH 590 14.8751 -8.4312 -7.6470 1.00 0.00 WATR +ATOM 2280 HT HOH 590 15.6320 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 2281 HT HOH 590 14.1181 -7.8453 -7.6470 1.00 0.00 WATR +ATOM 2282 OT HOH 591 17.3383 -5.9680 -7.6470 1.00 0.00 WATR +ATOM 2283 HT HOH 591 18.0952 -5.3821 -7.6470 1.00 0.00 WATR +ATOM 2284 HT HOH 591 16.5813 -5.3821 -7.6470 1.00 0.00 WATR +ATOM 2285 OT HOH 592 17.3383 -8.4312 -5.1838 1.00 0.00 WATR +ATOM 2286 HT HOH 592 18.0952 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 2287 HT HOH 592 16.5813 -7.8453 -5.1838 1.00 0.00 WATR +ATOM 2288 OT HOH 593 14.8751 -8.4312 -2.7206 1.00 0.00 WATR +ATOM 2289 HT HOH 593 15.6320 -7.8453 -2.7206 1.00 0.00 WATR +ATOM 2290 HT HOH 593 14.1181 -7.8453 -2.7206 1.00 0.00 WATR +ATOM 2291 OT HOH 594 17.3383 -8.4312 -0.2573 1.00 0.00 WATR +ATOM 2292 HT HOH 594 18.0952 -7.8453 -0.2573 1.00 0.00 WATR +ATOM 2293 HT HOH 594 16.5813 -7.8453 -0.2573 1.00 0.00 WATR +ATOM 2294 OT HOH 595 17.3383 -8.4312 4.66901 1.00 0.00 WATR +ATOM 2295 HT HOH 595 18.0952 -7.8453 4.66901 1.00 0.00 WATR +ATOM 2296 HT HOH 595 16.5813 -7.8453 4.66901 1.00 0.00 WATR +ATOM 2297 OT HOH 596 14.8751 -8.4312 7.13221 1.00 0.00 WATR +ATOM 2298 HT HOH 596 15.6320 -7.8453 7.13221 1.00 0.00 WATR +ATOM 2299 HT HOH 596 14.1181 -7.8453 7.13221 1.00 0.00 WATR +ATOM 2300 OT HOH 597 17.3383 -5.9680 7.13221 1.00 0.00 WATR +ATOM 2301 HT HOH 597 18.0952 -5.3821 7.13221 1.00 0.00 WATR +ATOM 2302 HT HOH 597 16.5813 -5.3821 7.13221 1.00 0.00 WATR +ATOM 2303 OT HOH 598 17.3383 -8.4312 9.59542 1.00 0.00 WATR +ATOM 2304 HT HOH 598 18.0952 -7.8453 9.59542 1.00 0.00 WATR +ATOM 2305 HT HOH 598 16.5813 -7.8453 9.59542 1.00 0.00 WATR +ATOM 2306 OT HOH 599 14.8751 -5.9680 9.59542 1.00 0.00 WATR +ATOM 2307 HT HOH 599 15.6320 -5.3821 9.59542 1.00 0.00 WATR +ATOM 2308 HT HOH 599 14.1181 -5.3821 9.59542 1.00 0.00 WATR +ATOM 2309 OT HOH 600 14.8751 -3.5048 -12.573 1.00 0.00 WATR +ATOM 2310 HT HOH 600 15.6320 -2.9189 -12.573 1.00 0.00 WATR +ATOM 2311 HT HOH 600 14.1181 -2.9189 -12.573 1.00 0.00 WATR +ATOM 2312 OT HOH 601 17.3383 -1.0416 -12.573 1.00 0.00 WATR +ATOM 2313 HT HOH 601 18.0952 -0.4557 -12.573 1.00 0.00 WATR +ATOM 2314 HT HOH 601 16.5813 -0.4557 -12.573 1.00 0.00 WATR +ATOM 2315 OT HOH 602 17.3383 -3.5048 -10.110 1.00 0.00 WATR +ATOM 2316 HT HOH 602 18.0952 -2.9189 -10.110 1.00 0.00 WATR +ATOM 2317 HT HOH 602 16.5813 -2.9189 -10.110 1.00 0.00 WATR +ATOM 2318 OT HOH 603 14.8751 -1.0416 -10.110 1.00 0.00 WATR +ATOM 2319 HT HOH 603 15.6320 -0.4557 -10.110 1.00 0.00 WATR +ATOM 2320 HT HOH 603 14.1181 -0.4557 -10.110 1.00 0.00 WATR +ATOM 2321 OT HOH 604 14.8751 -3.5048 -7.6470 1.00 0.00 WATR +ATOM 2322 HT HOH 604 15.6320 -2.9189 -7.6470 1.00 0.00 WATR +ATOM 2323 HT HOH 604 14.1181 -2.9189 -7.6470 1.00 0.00 WATR +ATOM 2324 OT HOH 605 17.3383 -1.0416 -7.6470 1.00 0.00 WATR +ATOM 2325 HT HOH 605 18.0952 -0.4557 -7.6470 1.00 0.00 WATR +ATOM 2326 HT HOH 605 16.5813 -0.4557 -7.6470 1.00 0.00 WATR +ATOM 2327 OT HOH 606 14.8751 -1.0416 -5.1838 1.00 0.00 WATR +ATOM 2328 HT HOH 606 15.6320 -0.4557 -5.1838 1.00 0.00 WATR +ATOM 2329 HT HOH 606 14.1181 -0.4557 -5.1838 1.00 0.00 WATR +ATOM 2330 OT HOH 607 17.3383 -1.0416 -2.7206 1.00 0.00 WATR +ATOM 2331 HT HOH 607 18.0952 -0.4557 -2.7206 1.00 0.00 WATR +ATOM 2332 HT HOH 607 16.5813 -0.4557 -2.7206 1.00 0.00 WATR +ATOM 2333 OT HOH 608 17.3383 -1.0416 7.13221 1.00 0.00 WATR +ATOM 2334 HT HOH 608 18.0952 -0.4557 7.13221 1.00 0.00 WATR +ATOM 2335 HT HOH 608 16.5813 -0.4557 7.13221 1.00 0.00 WATR +ATOM 2336 OT HOH 609 17.3383 -3.5048 9.59542 1.00 0.00 WATR +ATOM 2337 HT HOH 609 18.0952 -2.9189 9.59542 1.00 0.00 WATR +ATOM 2338 HT HOH 609 16.5813 -2.9189 9.59542 1.00 0.00 WATR +ATOM 2339 OT HOH 610 14.8751 1.42160 -12.573 1.00 0.00 WATR +ATOM 2340 HT HOH 610 15.6320 2.00748 -12.573 1.00 0.00 WATR +ATOM 2341 HT HOH 610 14.1181 2.00748 -12.573 1.00 0.00 WATR +ATOM 2342 OT HOH 611 17.3383 3.88480 -12.573 1.00 0.00 WATR +ATOM 2343 HT HOH 611 18.0952 4.47069 -12.573 1.00 0.00 WATR +ATOM 2344 HT HOH 611 16.5813 4.47069 -12.573 1.00 0.00 WATR +ATOM 2345 OT HOH 612 17.3383 1.42160 -10.110 1.00 0.00 WATR +ATOM 2346 HT HOH 612 18.0952 2.00748 -10.110 1.00 0.00 WATR +ATOM 2347 HT HOH 612 16.5813 2.00748 -10.110 1.00 0.00 WATR +ATOM 2348 OT HOH 613 14.8751 3.88480 -10.110 1.00 0.00 WATR +ATOM 2349 HT HOH 613 15.6320 4.47069 -10.110 1.00 0.00 WATR +ATOM 2350 HT HOH 613 14.1181 4.47069 -10.110 1.00 0.00 WATR +ATOM 2351 OT HOH 614 14.8751 1.42160 -7.6470 1.00 0.00 WATR +ATOM 2352 HT HOH 614 15.6320 2.00748 -7.6470 1.00 0.00 WATR +ATOM 2353 HT HOH 614 14.1181 2.00748 -7.6470 1.00 0.00 WATR +ATOM 2354 OT HOH 615 17.3383 3.88480 -7.6470 1.00 0.00 WATR +ATOM 2355 HT HOH 615 18.0952 4.47069 -7.6470 1.00 0.00 WATR +ATOM 2356 HT HOH 615 16.5813 4.47069 -7.6470 1.00 0.00 WATR +ATOM 2357 OT HOH 616 17.3383 1.42160 -5.1838 1.00 0.00 WATR +ATOM 2358 HT HOH 616 18.0952 2.00748 -5.1838 1.00 0.00 WATR +ATOM 2359 HT HOH 616 16.5813 2.00748 -5.1838 1.00 0.00 WATR +ATOM 2360 OT HOH 617 17.3383 3.88480 -2.7206 1.00 0.00 WATR +ATOM 2361 HT HOH 617 18.0952 4.47069 -2.7206 1.00 0.00 WATR +ATOM 2362 HT HOH 617 16.5813 4.47069 -2.7206 1.00 0.00 WATR +ATOM 2363 OT HOH 618 17.3383 3.88480 2.20580 1.00 0.00 WATR +ATOM 2364 HT HOH 618 18.0952 4.47069 2.20580 1.00 0.00 WATR +ATOM 2365 HT HOH 618 16.5813 4.47069 2.20580 1.00 0.00 WATR +ATOM 2366 OT HOH 619 17.3383 3.88480 7.13221 1.00 0.00 WATR +ATOM 2367 HT HOH 619 18.0952 4.47069 7.13221 1.00 0.00 WATR +ATOM 2368 HT HOH 619 16.5813 4.47069 7.13221 1.00 0.00 WATR +ATOM 2369 OT HOH 620 17.3383 1.42160 9.59542 1.00 0.00 WATR +ATOM 2370 HT HOH 620 18.0952 2.00748 9.59542 1.00 0.00 WATR +ATOM 2371 HT HOH 620 16.5813 2.00748 9.59542 1.00 0.00 WATR +ATOM 2372 OT HOH 621 14.8751 3.88480 9.59542 1.00 0.00 WATR +ATOM 2373 HT HOH 621 15.6320 4.47069 9.59542 1.00 0.00 WATR +ATOM 2374 HT HOH 621 14.1181 4.47069 9.59542 1.00 0.00 WATR +ATOM 2375 OT HOH 622 14.8751 6.34801 -12.573 1.00 0.00 WATR +ATOM 2376 HT HOH 622 15.6320 6.93389 -12.573 1.00 0.00 WATR +ATOM 2377 HT HOH 622 14.1181 6.93389 -12.573 1.00 0.00 WATR +ATOM 2378 OT HOH 623 17.3383 8.81121 -12.573 1.00 0.00 WATR +ATOM 2379 HT HOH 623 18.0952 9.39710 -12.573 1.00 0.00 WATR +ATOM 2380 HT HOH 623 16.5813 9.39710 -12.573 1.00 0.00 WATR +ATOM 2381 OT HOH 624 17.3383 6.34801 -10.110 1.00 0.00 WATR +ATOM 2382 HT HOH 624 18.0952 6.93389 -10.110 1.00 0.00 WATR +ATOM 2383 HT HOH 624 16.5813 6.93389 -10.110 1.00 0.00 WATR +ATOM 2384 OT HOH 625 14.8751 8.81121 -10.110 1.00 0.00 WATR +ATOM 2385 HT HOH 625 15.6320 9.39710 -10.110 1.00 0.00 WATR +ATOM 2386 HT HOH 625 14.1181 9.39710 -10.110 1.00 0.00 WATR +ATOM 2387 OT HOH 626 14.8751 6.34801 -7.6470 1.00 0.00 WATR +ATOM 2388 HT HOH 626 15.6320 6.93389 -7.6470 1.00 0.00 WATR +ATOM 2389 HT HOH 626 14.1181 6.93389 -7.6470 1.00 0.00 WATR +ATOM 2390 OT HOH 627 17.3383 8.81121 -7.6470 1.00 0.00 WATR +ATOM 2391 HT HOH 627 18.0952 9.39710 -7.6470 1.00 0.00 WATR +ATOM 2392 HT HOH 627 16.5813 9.39710 -7.6470 1.00 0.00 WATR +ATOM 2393 OT HOH 628 17.3383 6.34801 -5.1838 1.00 0.00 WATR +ATOM 2394 HT HOH 628 18.0952 6.93389 -5.1838 1.00 0.00 WATR +ATOM 2395 HT HOH 628 16.5813 6.93389 -5.1838 1.00 0.00 WATR +ATOM 2396 OT HOH 629 14.8751 8.81121 -5.1838 1.00 0.00 WATR +ATOM 2397 HT HOH 629 15.6320 9.39710 -5.1838 1.00 0.00 WATR +ATOM 2398 HT HOH 629 14.1181 9.39710 -5.1838 1.00 0.00 WATR +ATOM 2399 OT HOH 630 14.8751 6.34801 -2.7206 1.00 0.00 WATR +ATOM 2400 HT HOH 630 15.6320 6.93389 -2.7206 1.00 0.00 WATR +ATOM 2401 HT HOH 630 14.1181 6.93389 -2.7206 1.00 0.00 WATR +ATOM 2402 OT HOH 631 17.3383 8.81121 -2.7206 1.00 0.00 WATR +ATOM 2403 HT HOH 631 18.0952 9.39710 -2.7206 1.00 0.00 WATR +ATOM 2404 HT HOH 631 16.5813 9.39710 -2.7206 1.00 0.00 WATR +ATOM 2405 OT HOH 632 17.3383 6.34801 -0.2573 1.00 0.00 WATR +ATOM 2406 HT HOH 632 18.0952 6.93389 -0.2573 1.00 0.00 WATR +ATOM 2407 HT HOH 632 16.5813 6.93389 -0.2573 1.00 0.00 WATR +ATOM 2408 OT HOH 633 14.8751 8.81121 -0.2573 1.00 0.00 WATR +ATOM 2409 HT HOH 633 15.6320 9.39710 -0.2573 1.00 0.00 WATR +ATOM 2410 HT HOH 633 14.1181 9.39710 -0.2573 1.00 0.00 WATR +ATOM 2411 OT HOH 634 17.3383 8.81121 2.20580 1.00 0.00 WATR +ATOM 2412 HT HOH 634 18.0952 9.39710 2.20580 1.00 0.00 WATR +ATOM 2413 HT HOH 634 16.5813 9.39710 2.20580 1.00 0.00 WATR +ATOM 2414 OT HOH 635 17.3383 6.34801 4.66901 1.00 0.00 WATR +ATOM 2415 HT HOH 635 18.0952 6.93389 4.66901 1.00 0.00 WATR +ATOM 2416 HT HOH 635 16.5813 6.93389 4.66901 1.00 0.00 WATR +ATOM 2417 OT HOH 636 14.8751 8.81121 4.66901 1.00 0.00 WATR +ATOM 2418 HT HOH 636 15.6320 9.39710 4.66901 1.00 0.00 WATR +ATOM 2419 HT HOH 636 14.1181 9.39710 4.66901 1.00 0.00 WATR +ATOM 2420 OT HOH 637 14.8751 6.34801 7.13221 1.00 0.00 WATR +ATOM 2421 HT HOH 637 15.6320 6.93389 7.13221 1.00 0.00 WATR +ATOM 2422 HT HOH 637 14.1181 6.93389 7.13221 1.00 0.00 WATR +ATOM 2423 OT HOH 638 17.3383 8.81121 7.13221 1.00 0.00 WATR +ATOM 2424 HT HOH 638 18.0952 9.39710 7.13221 1.00 0.00 WATR +ATOM 2425 HT HOH 638 16.5813 9.39710 7.13221 1.00 0.00 WATR +ATOM 2426 OT HOH 639 17.3383 6.34801 9.59542 1.00 0.00 WATR +ATOM 2427 HT HOH 639 18.0952 6.93389 9.59542 1.00 0.00 WATR +ATOM 2428 HT HOH 639 16.5813 6.93389 9.59542 1.00 0.00 WATR +ATOM 2429 OT HOH 640 14.8751 8.81121 9.59542 1.00 0.00 WATR +ATOM 2430 HT HOH 640 15.6320 9.39710 9.59542 1.00 0.00 WATR +ATOM 2431 HT HOH 640 14.1181 9.39710 9.59542 1.00 0.00 WATR +ATOM 2432 OT HOH 641 14.8751 11.2744 -12.573 1.00 0.00 WATR +ATOM 2433 HT HOH 641 15.6320 11.8603 -12.573 1.00 0.00 WATR +ATOM 2434 HT HOH 641 14.1181 11.8603 -12.573 1.00 0.00 WATR +ATOM 2435 OT HOH 642 17.3383 13.7376 -12.573 1.00 0.00 WATR +ATOM 2436 HT HOH 642 18.0952 14.3235 -12.573 1.00 0.00 WATR +ATOM 2437 HT HOH 642 16.5813 14.3235 -12.573 1.00 0.00 WATR +ATOM 2438 OT HOH 643 17.3383 11.2744 -10.110 1.00 0.00 WATR +ATOM 2439 HT HOH 643 18.0952 11.8603 -10.110 1.00 0.00 WATR +ATOM 2440 HT HOH 643 16.5813 11.8603 -10.110 1.00 0.00 WATR +ATOM 2441 OT HOH 644 14.8751 13.7376 -10.110 1.00 0.00 WATR +ATOM 2442 HT HOH 644 15.6320 14.3235 -10.110 1.00 0.00 WATR +ATOM 2443 HT HOH 644 14.1181 14.3235 -10.110 1.00 0.00 WATR +ATOM 2444 OT HOH 645 14.8751 11.2744 -7.6470 1.00 0.00 WATR +ATOM 2445 HT HOH 645 15.6320 11.8603 -7.6470 1.00 0.00 WATR +ATOM 2446 HT HOH 645 14.1181 11.8603 -7.6470 1.00 0.00 WATR +ATOM 2447 OT HOH 646 17.3383 13.7376 -7.6470 1.00 0.00 WATR +ATOM 2448 HT HOH 646 18.0952 14.3235 -7.6470 1.00 0.00 WATR +ATOM 2449 HT HOH 646 16.5813 14.3235 -7.6470 1.00 0.00 WATR +ATOM 2450 OT HOH 647 17.3383 11.2744 -5.1838 1.00 0.00 WATR +ATOM 2451 HT HOH 647 18.0952 11.8603 -5.1838 1.00 0.00 WATR +ATOM 2452 HT HOH 647 16.5813 11.8603 -5.1838 1.00 0.00 WATR +ATOM 2453 OT HOH 648 14.8751 13.7376 -5.1838 1.00 0.00 WATR +ATOM 2454 HT HOH 648 15.6320 14.3235 -5.1838 1.00 0.00 WATR +ATOM 2455 HT HOH 648 14.1181 14.3235 -5.1838 1.00 0.00 WATR +ATOM 2456 OT HOH 649 14.8751 11.2744 -2.7206 1.00 0.00 WATR +ATOM 2457 HT HOH 649 15.6320 11.8603 -2.7206 1.00 0.00 WATR +ATOM 2458 HT HOH 649 14.1181 11.8603 -2.7206 1.00 0.00 WATR +ATOM 2459 OT HOH 650 17.3383 13.7376 -2.7206 1.00 0.00 WATR +ATOM 2460 HT HOH 650 18.0952 14.3235 -2.7206 1.00 0.00 WATR +ATOM 2461 HT HOH 650 16.5813 14.3235 -2.7206 1.00 0.00 WATR +ATOM 2462 OT HOH 651 17.3383 11.2744 -0.2573 1.00 0.00 WATR +ATOM 2463 HT HOH 651 18.0952 11.8603 -0.2573 1.00 0.00 WATR +ATOM 2464 HT HOH 651 16.5813 11.8603 -0.2573 1.00 0.00 WATR +ATOM 2465 OT HOH 652 14.8751 13.7376 -0.2573 1.00 0.00 WATR +ATOM 2466 HT HOH 652 15.6320 14.3235 -0.2573 1.00 0.00 WATR +ATOM 2467 HT HOH 652 14.1181 14.3235 -0.2573 1.00 0.00 WATR +ATOM 2468 OT HOH 653 14.8751 11.2744 2.20580 1.00 0.00 WATR +ATOM 2469 HT HOH 653 15.6320 11.8603 2.20580 1.00 0.00 WATR +ATOM 2470 HT HOH 653 14.1181 11.8603 2.20580 1.00 0.00 WATR +ATOM 2471 OT HOH 654 17.3383 13.7376 2.20580 1.00 0.00 WATR +ATOM 2472 HT HOH 654 18.0952 14.3235 2.20580 1.00 0.00 WATR +ATOM 2473 HT HOH 654 16.5813 14.3235 2.20580 1.00 0.00 WATR +ATOM 2474 OT HOH 655 17.3383 11.2744 4.66901 1.00 0.00 WATR +ATOM 2475 HT HOH 655 18.0952 11.8603 4.66901 1.00 0.00 WATR +ATOM 2476 HT HOH 655 16.5813 11.8603 4.66901 1.00 0.00 WATR +ATOM 2477 OT HOH 656 14.8751 13.7376 4.66901 1.00 0.00 WATR +ATOM 2478 HT HOH 656 15.6320 14.3235 4.66901 1.00 0.00 WATR +ATOM 2479 HT HOH 656 14.1181 14.3235 4.66901 1.00 0.00 WATR +ATOM 2480 OT HOH 657 14.8751 11.2744 7.13221 1.00 0.00 WATR +ATOM 2481 HT HOH 657 15.6320 11.8603 7.13221 1.00 0.00 WATR +ATOM 2482 HT HOH 657 14.1181 11.8603 7.13221 1.00 0.00 WATR +ATOM 2483 OT HOH 658 17.3383 13.7376 7.13221 1.00 0.00 WATR +ATOM 2484 HT HOH 658 18.0952 14.3235 7.13221 1.00 0.00 WATR +ATOM 2485 HT HOH 658 16.5813 14.3235 7.13221 1.00 0.00 WATR +ATOM 2486 OT HOH 659 17.3383 11.2744 9.59542 1.00 0.00 WATR +ATOM 2487 HT HOH 659 18.0952 11.8603 9.59542 1.00 0.00 WATR +ATOM 2488 HT HOH 659 16.5813 11.8603 9.59542 1.00 0.00 WATR +ATOM 2489 OT HOH 660 14.8751 13.7376 9.59542 1.00 0.00 WATR +ATOM 2490 HT HOH 660 15.6320 14.3235 9.59542 1.00 0.00 WATR +ATOM 2491 HT HOH 660 14.1181 14.3235 9.59542 1.00 0.00 WATR +ATOM 2492 OT HOH 661 19.8015 -13.357 -12.573 1.00 0.00 WATR +ATOM 2493 HT HOH 661 20.5584 -12.771 -12.573 1.00 0.00 WATR +ATOM 2494 HT HOH 661 19.0445 -12.771 -12.573 1.00 0.00 WATR +ATOM 2495 OT HOH 662 22.2647 -10.894 -12.573 1.00 0.00 WATR +ATOM 2496 HT HOH 662 23.0216 -10.308 -12.573 1.00 0.00 WATR +ATOM 2497 HT HOH 662 21.5077 -10.308 -12.573 1.00 0.00 WATR ATOM 2498 OT HOH 663 22.2647 -13.357 -10.110 1.00 0.00 WATR ATOM 2499 HT HOH 663 23.0216 -12.771 -10.110 1.00 0.00 WATR ATOM 2500 HT HOH 663 21.5077 -12.771 -10.110 1.00 0.00 WATR diff --git a/tools/ch2lmp/example-cmap/1gb1_ctrl.psf b/tools/ch2lmp/example-cmap/1gb1_ctrl.psf index 2f37644bc8..fbceeb22a6 100644 --- a/tools/ch2lmp/example-cmap/1gb1_ctrl.psf +++ b/tools/ch2lmp/example-cmap/1gb1_ctrl.psf @@ -2,7 +2,7 @@ PSF 2 !NTITLE REMARKS CONTROL PSF 1gb1_ctrl.psf - REMARKS CREATED BY charmm2lammps v1.9.1 ON Wed Oct 5 18:08:54 EDT 2016 + REMARKS CREATED BY charmm2lammps v1.9.1 ON Sun Jan 28 05:50:21 EST 2018 2833 !NATOM 1 PROA 1 MET N NH3 -3.00000000e-01 14.0070 0 @@ -890,1618 +890,1618 @@ PSF 883 WATR 10 HOH OT 85 -8.34000000e-01 15.9994 0 884 WATR 10 HOH HT 84 4.17000000e-01 1.008 0 885 WATR 10 HOH HT 84 4.17000000e-01 1.008 0 - 886 WATR 11 HOH OT 85 -8.34000000e-01 15.9994 0 - 887 WATR 11 HOH HT 84 4.17000000e-01 1.008 0 + 886 SALT 1 ION SOD 87 1.00000000e+00 22.9897 0 + 887 WATR 11 HOH OT 85 -8.34000000e-01 15.9994 0 888 WATR 11 HOH HT 84 4.17000000e-01 1.008 0 - 889 WATR 12 HOH OT 85 -8.34000000e-01 15.9994 0 - 890 WATR 12 HOH HT 84 4.17000000e-01 1.008 0 + 889 WATR 11 HOH HT 84 4.17000000e-01 1.008 0 + 890 WATR 12 HOH OT 85 -8.34000000e-01 15.9994 0 891 WATR 12 HOH HT 84 4.17000000e-01 1.008 0 - 892 WATR 13 HOH OT 85 -8.34000000e-01 15.9994 0 - 893 WATR 13 HOH HT 84 4.17000000e-01 1.008 0 + 892 WATR 12 HOH HT 84 4.17000000e-01 1.008 0 + 893 WATR 13 HOH OT 85 -8.34000000e-01 15.9994 0 894 WATR 13 HOH HT 84 4.17000000e-01 1.008 0 - 895 WATR 14 HOH OT 85 -8.34000000e-01 15.9994 0 - 896 WATR 14 HOH HT 84 4.17000000e-01 1.008 0 + 895 WATR 13 HOH HT 84 4.17000000e-01 1.008 0 + 896 WATR 14 HOH OT 85 -8.34000000e-01 15.9994 0 897 WATR 14 HOH HT 84 4.17000000e-01 1.008 0 - 898 WATR 15 HOH OT 85 -8.34000000e-01 15.9994 0 - 899 WATR 15 HOH HT 84 4.17000000e-01 1.008 0 + 898 WATR 14 HOH HT 84 4.17000000e-01 1.008 0 + 899 WATR 15 HOH OT 85 -8.34000000e-01 15.9994 0 900 WATR 15 HOH HT 84 4.17000000e-01 1.008 0 - 901 WATR 16 HOH OT 85 -8.34000000e-01 15.9994 0 - 902 WATR 16 HOH HT 84 4.17000000e-01 1.008 0 + 901 WATR 15 HOH HT 84 4.17000000e-01 1.008 0 + 902 WATR 16 HOH OT 85 -8.34000000e-01 15.9994 0 903 WATR 16 HOH HT 84 4.17000000e-01 1.008 0 - 904 WATR 17 HOH OT 85 -8.34000000e-01 15.9994 0 - 905 WATR 17 HOH HT 84 4.17000000e-01 1.008 0 + 904 WATR 16 HOH HT 84 4.17000000e-01 1.008 0 + 905 WATR 17 HOH OT 85 -8.34000000e-01 15.9994 0 906 WATR 17 HOH HT 84 4.17000000e-01 1.008 0 - 907 WATR 18 HOH OT 85 -8.34000000e-01 15.9994 0 - 908 WATR 18 HOH HT 84 4.17000000e-01 1.008 0 + 907 WATR 17 HOH HT 84 4.17000000e-01 1.008 0 + 908 WATR 18 HOH OT 85 -8.34000000e-01 15.9994 0 909 WATR 18 HOH HT 84 4.17000000e-01 1.008 0 - 910 WATR 19 HOH OT 85 -8.34000000e-01 15.9994 0 - 911 WATR 19 HOH HT 84 4.17000000e-01 1.008 0 + 910 WATR 18 HOH HT 84 4.17000000e-01 1.008 0 + 911 WATR 19 HOH OT 85 -8.34000000e-01 15.9994 0 912 WATR 19 HOH HT 84 4.17000000e-01 1.008 0 - 913 WATR 20 HOH OT 85 -8.34000000e-01 15.9994 0 - 914 WATR 20 HOH HT 84 4.17000000e-01 1.008 0 + 913 WATR 19 HOH HT 84 4.17000000e-01 1.008 0 + 914 WATR 20 HOH OT 85 -8.34000000e-01 15.9994 0 915 WATR 20 HOH HT 84 4.17000000e-01 1.008 0 - 916 WATR 21 HOH OT 85 -8.34000000e-01 15.9994 0 - 917 WATR 21 HOH HT 84 4.17000000e-01 1.008 0 + 916 WATR 20 HOH HT 84 4.17000000e-01 1.008 0 + 917 WATR 21 HOH OT 85 -8.34000000e-01 15.9994 0 918 WATR 21 HOH HT 84 4.17000000e-01 1.008 0 - 919 WATR 22 HOH OT 85 -8.34000000e-01 15.9994 0 - 920 WATR 22 HOH HT 84 4.17000000e-01 1.008 0 + 919 WATR 21 HOH HT 84 4.17000000e-01 1.008 0 + 920 WATR 22 HOH OT 85 -8.34000000e-01 15.9994 0 921 WATR 22 HOH HT 84 4.17000000e-01 1.008 0 - 922 WATR 23 HOH OT 85 -8.34000000e-01 15.9994 0 - 923 WATR 23 HOH HT 84 4.17000000e-01 1.008 0 + 922 WATR 22 HOH HT 84 4.17000000e-01 1.008 0 + 923 WATR 23 HOH OT 85 -8.34000000e-01 15.9994 0 924 WATR 23 HOH HT 84 4.17000000e-01 1.008 0 - 925 WATR 24 HOH OT 85 -8.34000000e-01 15.9994 0 - 926 WATR 24 HOH HT 84 4.17000000e-01 1.008 0 + 925 WATR 23 HOH HT 84 4.17000000e-01 1.008 0 + 926 WATR 24 HOH OT 85 -8.34000000e-01 15.9994 0 927 WATR 24 HOH HT 84 4.17000000e-01 1.008 0 - 928 WATR 25 HOH OT 85 -8.34000000e-01 15.9994 0 - 929 WATR 25 HOH HT 84 4.17000000e-01 1.008 0 + 928 WATR 24 HOH HT 84 4.17000000e-01 1.008 0 + 929 WATR 25 HOH OT 85 -8.34000000e-01 15.9994 0 930 WATR 25 HOH HT 84 4.17000000e-01 1.008 0 - 931 WATR 26 HOH OT 85 -8.34000000e-01 15.9994 0 - 932 WATR 26 HOH HT 84 4.17000000e-01 1.008 0 + 931 WATR 25 HOH HT 84 4.17000000e-01 1.008 0 + 932 WATR 26 HOH OT 85 -8.34000000e-01 15.9994 0 933 WATR 26 HOH HT 84 4.17000000e-01 1.008 0 - 934 WATR 27 HOH OT 85 -8.34000000e-01 15.9994 0 - 935 WATR 27 HOH HT 84 4.17000000e-01 1.008 0 + 934 WATR 26 HOH HT 84 4.17000000e-01 1.008 0 + 935 WATR 27 HOH OT 85 -8.34000000e-01 15.9994 0 936 WATR 27 HOH HT 84 4.17000000e-01 1.008 0 - 937 WATR 28 HOH OT 85 -8.34000000e-01 15.9994 0 - 938 WATR 28 HOH HT 84 4.17000000e-01 1.008 0 + 937 WATR 27 HOH HT 84 4.17000000e-01 1.008 0 + 938 WATR 28 HOH OT 85 -8.34000000e-01 15.9994 0 939 WATR 28 HOH HT 84 4.17000000e-01 1.008 0 - 940 WATR 29 HOH OT 85 -8.34000000e-01 15.9994 0 - 941 WATR 29 HOH HT 84 4.17000000e-01 1.008 0 + 940 WATR 28 HOH HT 84 4.17000000e-01 1.008 0 + 941 WATR 29 HOH OT 85 -8.34000000e-01 15.9994 0 942 WATR 29 HOH HT 84 4.17000000e-01 1.008 0 - 943 WATR 30 HOH OT 85 -8.34000000e-01 15.9994 0 - 944 WATR 30 HOH HT 84 4.17000000e-01 1.008 0 + 943 WATR 29 HOH HT 84 4.17000000e-01 1.008 0 + 944 WATR 30 HOH OT 85 -8.34000000e-01 15.9994 0 945 WATR 30 HOH HT 84 4.17000000e-01 1.008 0 - 946 WATR 31 HOH OT 85 -8.34000000e-01 15.9994 0 - 947 WATR 31 HOH HT 84 4.17000000e-01 1.008 0 + 946 WATR 30 HOH HT 84 4.17000000e-01 1.008 0 + 947 WATR 31 HOH OT 85 -8.34000000e-01 15.9994 0 948 WATR 31 HOH HT 84 4.17000000e-01 1.008 0 - 949 WATR 32 HOH OT 85 -8.34000000e-01 15.9994 0 - 950 WATR 32 HOH HT 84 4.17000000e-01 1.008 0 + 949 WATR 31 HOH HT 84 4.17000000e-01 1.008 0 + 950 WATR 32 HOH OT 85 -8.34000000e-01 15.9994 0 951 WATR 32 HOH HT 84 4.17000000e-01 1.008 0 - 952 WATR 33 HOH OT 85 -8.34000000e-01 15.9994 0 - 953 WATR 33 HOH HT 84 4.17000000e-01 1.008 0 + 952 WATR 32 HOH HT 84 4.17000000e-01 1.008 0 + 953 WATR 33 HOH OT 85 -8.34000000e-01 15.9994 0 954 WATR 33 HOH HT 84 4.17000000e-01 1.008 0 - 955 WATR 34 HOH OT 85 -8.34000000e-01 15.9994 0 - 956 WATR 34 HOH HT 84 4.17000000e-01 1.008 0 + 955 WATR 33 HOH HT 84 4.17000000e-01 1.008 0 + 956 WATR 34 HOH OT 85 -8.34000000e-01 15.9994 0 957 WATR 34 HOH HT 84 4.17000000e-01 1.008 0 - 958 WATR 35 HOH OT 85 -8.34000000e-01 15.9994 0 - 959 WATR 35 HOH HT 84 4.17000000e-01 1.008 0 + 958 WATR 34 HOH HT 84 4.17000000e-01 1.008 0 + 959 WATR 35 HOH OT 85 -8.34000000e-01 15.9994 0 960 WATR 35 HOH HT 84 4.17000000e-01 1.008 0 - 961 WATR 36 HOH OT 85 -8.34000000e-01 15.9994 0 - 962 WATR 36 HOH HT 84 4.17000000e-01 1.008 0 + 961 WATR 35 HOH HT 84 4.17000000e-01 1.008 0 + 962 WATR 36 HOH OT 85 -8.34000000e-01 15.9994 0 963 WATR 36 HOH HT 84 4.17000000e-01 1.008 0 - 964 WATR 37 HOH OT 85 -8.34000000e-01 15.9994 0 - 965 WATR 37 HOH HT 84 4.17000000e-01 1.008 0 + 964 WATR 36 HOH HT 84 4.17000000e-01 1.008 0 + 965 WATR 37 HOH OT 85 -8.34000000e-01 15.9994 0 966 WATR 37 HOH HT 84 4.17000000e-01 1.008 0 - 967 WATR 38 HOH OT 85 -8.34000000e-01 15.9994 0 - 968 WATR 38 HOH HT 84 4.17000000e-01 1.008 0 + 967 WATR 37 HOH HT 84 4.17000000e-01 1.008 0 + 968 WATR 38 HOH OT 85 -8.34000000e-01 15.9994 0 969 WATR 38 HOH HT 84 4.17000000e-01 1.008 0 - 970 WATR 39 HOH OT 85 -8.34000000e-01 15.9994 0 - 971 WATR 39 HOH HT 84 4.17000000e-01 1.008 0 + 970 WATR 38 HOH HT 84 4.17000000e-01 1.008 0 + 971 WATR 39 HOH OT 85 -8.34000000e-01 15.9994 0 972 WATR 39 HOH HT 84 4.17000000e-01 1.008 0 - 973 WATR 40 HOH OT 85 -8.34000000e-01 15.9994 0 - 974 WATR 40 HOH HT 84 4.17000000e-01 1.008 0 + 973 WATR 39 HOH HT 84 4.17000000e-01 1.008 0 + 974 WATR 40 HOH OT 85 -8.34000000e-01 15.9994 0 975 WATR 40 HOH HT 84 4.17000000e-01 1.008 0 - 976 WATR 41 HOH OT 85 -8.34000000e-01 15.9994 0 - 977 WATR 41 HOH HT 84 4.17000000e-01 1.008 0 + 976 WATR 40 HOH HT 84 4.17000000e-01 1.008 0 + 977 WATR 41 HOH OT 85 -8.34000000e-01 15.9994 0 978 WATR 41 HOH HT 84 4.17000000e-01 1.008 0 - 979 WATR 42 HOH OT 85 -8.34000000e-01 15.9994 0 - 980 WATR 42 HOH HT 84 4.17000000e-01 1.008 0 + 979 WATR 41 HOH HT 84 4.17000000e-01 1.008 0 + 980 WATR 42 HOH OT 85 -8.34000000e-01 15.9994 0 981 WATR 42 HOH HT 84 4.17000000e-01 1.008 0 - 982 WATR 43 HOH OT 85 -8.34000000e-01 15.9994 0 - 983 WATR 43 HOH HT 84 4.17000000e-01 1.008 0 + 982 WATR 42 HOH HT 84 4.17000000e-01 1.008 0 + 983 WATR 43 HOH OT 85 -8.34000000e-01 15.9994 0 984 WATR 43 HOH HT 84 4.17000000e-01 1.008 0 - 985 WATR 44 HOH OT 85 -8.34000000e-01 15.9994 0 - 986 WATR 44 HOH HT 84 4.17000000e-01 1.008 0 + 985 WATR 43 HOH HT 84 4.17000000e-01 1.008 0 + 986 WATR 44 HOH OT 85 -8.34000000e-01 15.9994 0 987 WATR 44 HOH HT 84 4.17000000e-01 1.008 0 - 988 WATR 45 HOH OT 85 -8.34000000e-01 15.9994 0 - 989 WATR 45 HOH HT 84 4.17000000e-01 1.008 0 + 988 WATR 44 HOH HT 84 4.17000000e-01 1.008 0 + 989 WATR 45 HOH OT 85 -8.34000000e-01 15.9994 0 990 WATR 45 HOH HT 84 4.17000000e-01 1.008 0 - 991 WATR 46 HOH OT 85 -8.34000000e-01 15.9994 0 - 992 WATR 46 HOH HT 84 4.17000000e-01 1.008 0 + 991 WATR 45 HOH HT 84 4.17000000e-01 1.008 0 + 992 WATR 46 HOH OT 85 -8.34000000e-01 15.9994 0 993 WATR 46 HOH HT 84 4.17000000e-01 1.008 0 - 994 WATR 47 HOH OT 85 -8.34000000e-01 15.9994 0 - 995 WATR 47 HOH HT 84 4.17000000e-01 1.008 0 - 996 WATR 47 HOH HT 84 4.17000000e-01 1.008 0 - 997 WATR 48 HOH OT 85 -8.34000000e-01 15.9994 0 - 998 WATR 48 HOH HT 84 4.17000000e-01 1.008 0 - 999 WATR 48 HOH HT 84 4.17000000e-01 1.008 0 - 1000 WATR 49 HOH OT 85 -8.34000000e-01 15.9994 0 - 1001 WATR 49 HOH HT 84 4.17000000e-01 1.008 0 - 1002 WATR 49 HOH HT 84 4.17000000e-01 1.008 0 - 1003 WATR 50 HOH OT 85 -8.34000000e-01 15.9994 0 - 1004 WATR 50 HOH HT 84 4.17000000e-01 1.008 0 - 1005 WATR 50 HOH HT 84 4.17000000e-01 1.008 0 - 1006 WATR 51 HOH OT 85 -8.34000000e-01 15.9994 0 - 1007 WATR 51 HOH HT 84 4.17000000e-01 1.008 0 - 1008 WATR 51 HOH HT 84 4.17000000e-01 1.008 0 - 1009 WATR 52 HOH OT 85 -8.34000000e-01 15.9994 0 - 1010 WATR 52 HOH HT 84 4.17000000e-01 1.008 0 - 1011 WATR 52 HOH HT 84 4.17000000e-01 1.008 0 - 1012 WATR 53 HOH OT 85 -8.34000000e-01 15.9994 0 - 1013 WATR 53 HOH HT 84 4.17000000e-01 1.008 0 - 1014 WATR 53 HOH HT 84 4.17000000e-01 1.008 0 - 1015 WATR 54 HOH OT 85 -8.34000000e-01 15.9994 0 - 1016 WATR 54 HOH HT 84 4.17000000e-01 1.008 0 - 1017 WATR 54 HOH HT 84 4.17000000e-01 1.008 0 - 1018 WATR 55 HOH OT 85 -8.34000000e-01 15.9994 0 - 1019 WATR 55 HOH HT 84 4.17000000e-01 1.008 0 - 1020 WATR 55 HOH HT 84 4.17000000e-01 1.008 0 - 1021 WATR 56 HOH OT 85 -8.34000000e-01 15.9994 0 - 1022 WATR 56 HOH HT 84 4.17000000e-01 1.008 0 - 1023 WATR 56 HOH HT 84 4.17000000e-01 1.008 0 - 1024 WATR 57 HOH OT 85 -8.34000000e-01 15.9994 0 - 1025 WATR 57 HOH HT 84 4.17000000e-01 1.008 0 - 1026 WATR 57 HOH HT 84 4.17000000e-01 1.008 0 - 1027 WATR 58 HOH OT 85 -8.34000000e-01 15.9994 0 - 1028 WATR 58 HOH HT 84 4.17000000e-01 1.008 0 - 1029 WATR 58 HOH HT 84 4.17000000e-01 1.008 0 - 1030 WATR 59 HOH OT 85 -8.34000000e-01 15.9994 0 - 1031 WATR 59 HOH HT 84 4.17000000e-01 1.008 0 - 1032 WATR 59 HOH HT 84 4.17000000e-01 1.008 0 - 1033 WATR 60 HOH OT 85 -8.34000000e-01 15.9994 0 - 1034 WATR 60 HOH HT 84 4.17000000e-01 1.008 0 - 1035 WATR 60 HOH HT 84 4.17000000e-01 1.008 0 - 1036 WATR 61 HOH OT 85 -8.34000000e-01 15.9994 0 - 1037 WATR 61 HOH HT 84 4.17000000e-01 1.008 0 - 1038 WATR 61 HOH HT 84 4.17000000e-01 1.008 0 - 1039 WATR 62 HOH OT 85 -8.34000000e-01 15.9994 0 - 1040 WATR 62 HOH HT 84 4.17000000e-01 1.008 0 - 1041 WATR 62 HOH HT 84 4.17000000e-01 1.008 0 - 1042 WATR 63 HOH OT 85 -8.34000000e-01 15.9994 0 - 1043 WATR 63 HOH HT 84 4.17000000e-01 1.008 0 - 1044 WATR 63 HOH HT 84 4.17000000e-01 1.008 0 - 1045 WATR 64 HOH OT 85 -8.34000000e-01 15.9994 0 - 1046 WATR 64 HOH HT 84 4.17000000e-01 1.008 0 - 1047 WATR 64 HOH HT 84 4.17000000e-01 1.008 0 - 1048 WATR 65 HOH OT 85 -8.34000000e-01 15.9994 0 - 1049 WATR 65 HOH HT 84 4.17000000e-01 1.008 0 - 1050 WATR 65 HOH HT 84 4.17000000e-01 1.008 0 - 1051 WATR 66 HOH OT 85 -8.34000000e-01 15.9994 0 - 1052 WATR 66 HOH HT 84 4.17000000e-01 1.008 0 - 1053 WATR 66 HOH HT 84 4.17000000e-01 1.008 0 - 1054 WATR 67 HOH OT 85 -8.34000000e-01 15.9994 0 - 1055 WATR 67 HOH HT 84 4.17000000e-01 1.008 0 - 1056 WATR 67 HOH HT 84 4.17000000e-01 1.008 0 - 1057 WATR 68 HOH OT 85 -8.34000000e-01 15.9994 0 - 1058 WATR 68 HOH HT 84 4.17000000e-01 1.008 0 - 1059 WATR 68 HOH HT 84 4.17000000e-01 1.008 0 - 1060 WATR 69 HOH OT 85 -8.34000000e-01 15.9994 0 - 1061 WATR 69 HOH HT 84 4.17000000e-01 1.008 0 - 1062 WATR 69 HOH HT 84 4.17000000e-01 1.008 0 - 1063 WATR 70 HOH OT 85 -8.34000000e-01 15.9994 0 - 1064 WATR 70 HOH HT 84 4.17000000e-01 1.008 0 - 1065 WATR 70 HOH HT 84 4.17000000e-01 1.008 0 - 1066 WATR 71 HOH OT 85 -8.34000000e-01 15.9994 0 - 1067 WATR 71 HOH HT 84 4.17000000e-01 1.008 0 - 1068 WATR 71 HOH HT 84 4.17000000e-01 1.008 0 - 1069 WATR 72 HOH OT 85 -8.34000000e-01 15.9994 0 - 1070 WATR 72 HOH HT 84 4.17000000e-01 1.008 0 - 1071 WATR 72 HOH HT 84 4.17000000e-01 1.008 0 - 1072 WATR 73 HOH OT 85 -8.34000000e-01 15.9994 0 - 1073 WATR 73 HOH HT 84 4.17000000e-01 1.008 0 - 1074 WATR 73 HOH HT 84 4.17000000e-01 1.008 0 - 1075 WATR 74 HOH OT 85 -8.34000000e-01 15.9994 0 - 1076 WATR 74 HOH HT 84 4.17000000e-01 1.008 0 - 1077 WATR 74 HOH HT 84 4.17000000e-01 1.008 0 - 1078 WATR 75 HOH OT 85 -8.34000000e-01 15.9994 0 - 1079 WATR 75 HOH HT 84 4.17000000e-01 1.008 0 - 1080 WATR 75 HOH HT 84 4.17000000e-01 1.008 0 - 1081 WATR 76 HOH OT 85 -8.34000000e-01 15.9994 0 - 1082 WATR 76 HOH HT 84 4.17000000e-01 1.008 0 - 1083 WATR 76 HOH HT 84 4.17000000e-01 1.008 0 - 1084 WATR 77 HOH OT 85 -8.34000000e-01 15.9994 0 - 1085 WATR 77 HOH HT 84 4.17000000e-01 1.008 0 - 1086 WATR 77 HOH HT 84 4.17000000e-01 1.008 0 - 1087 WATR 78 HOH OT 85 -8.34000000e-01 15.9994 0 - 1088 WATR 78 HOH HT 84 4.17000000e-01 1.008 0 - 1089 WATR 78 HOH HT 84 4.17000000e-01 1.008 0 - 1090 WATR 79 HOH OT 85 -8.34000000e-01 15.9994 0 - 1091 WATR 79 HOH HT 84 4.17000000e-01 1.008 0 - 1092 WATR 79 HOH HT 84 4.17000000e-01 1.008 0 - 1093 WATR 80 HOH OT 85 -8.34000000e-01 15.9994 0 - 1094 WATR 80 HOH HT 84 4.17000000e-01 1.008 0 - 1095 WATR 80 HOH HT 84 4.17000000e-01 1.008 0 - 1096 WATR 81 HOH OT 85 -8.34000000e-01 15.9994 0 - 1097 WATR 81 HOH HT 84 4.17000000e-01 1.008 0 - 1098 WATR 81 HOH HT 84 4.17000000e-01 1.008 0 - 1099 WATR 82 HOH OT 85 -8.34000000e-01 15.9994 0 - 1100 WATR 82 HOH HT 84 4.17000000e-01 1.008 0 - 1101 WATR 82 HOH HT 84 4.17000000e-01 1.008 0 - 1102 WATR 83 HOH OT 85 -8.34000000e-01 15.9994 0 - 1103 WATR 83 HOH HT 84 4.17000000e-01 1.008 0 - 1104 WATR 83 HOH HT 84 4.17000000e-01 1.008 0 - 1105 WATR 84 HOH OT 85 -8.34000000e-01 15.9994 0 - 1106 WATR 84 HOH HT 84 4.17000000e-01 1.008 0 - 1107 WATR 84 HOH HT 84 4.17000000e-01 1.008 0 - 1108 WATR 85 HOH OT 85 -8.34000000e-01 15.9994 0 - 1109 WATR 85 HOH HT 84 4.17000000e-01 1.008 0 - 1110 WATR 85 HOH HT 84 4.17000000e-01 1.008 0 - 1111 WATR 86 HOH OT 85 -8.34000000e-01 15.9994 0 - 1112 WATR 86 HOH HT 84 4.17000000e-01 1.008 0 - 1113 WATR 86 HOH HT 84 4.17000000e-01 1.008 0 - 1114 WATR 87 HOH OT 85 -8.34000000e-01 15.9994 0 - 1115 WATR 87 HOH HT 84 4.17000000e-01 1.008 0 - 1116 WATR 87 HOH HT 84 4.17000000e-01 1.008 0 - 1117 WATR 88 HOH OT 85 -8.34000000e-01 15.9994 0 - 1118 WATR 88 HOH HT 84 4.17000000e-01 1.008 0 - 1119 WATR 88 HOH HT 84 4.17000000e-01 1.008 0 - 1120 WATR 89 HOH OT 85 -8.34000000e-01 15.9994 0 - 1121 WATR 89 HOH HT 84 4.17000000e-01 1.008 0 - 1122 WATR 89 HOH HT 84 4.17000000e-01 1.008 0 - 1123 WATR 90 HOH OT 85 -8.34000000e-01 15.9994 0 - 1124 WATR 90 HOH HT 84 4.17000000e-01 1.008 0 - 1125 WATR 90 HOH HT 84 4.17000000e-01 1.008 0 - 1126 WATR 91 HOH OT 85 -8.34000000e-01 15.9994 0 - 1127 WATR 91 HOH HT 84 4.17000000e-01 1.008 0 - 1128 WATR 91 HOH HT 84 4.17000000e-01 1.008 0 - 1129 WATR 92 HOH OT 85 -8.34000000e-01 15.9994 0 - 1130 WATR 92 HOH HT 84 4.17000000e-01 1.008 0 - 1131 WATR 92 HOH HT 84 4.17000000e-01 1.008 0 - 1132 WATR 93 HOH OT 85 -8.34000000e-01 15.9994 0 - 1133 WATR 93 HOH HT 84 4.17000000e-01 1.008 0 - 1134 WATR 93 HOH HT 84 4.17000000e-01 1.008 0 - 1135 WATR 94 HOH OT 85 -8.34000000e-01 15.9994 0 - 1136 WATR 94 HOH HT 84 4.17000000e-01 1.008 0 - 1137 WATR 94 HOH HT 84 4.17000000e-01 1.008 0 - 1138 WATR 95 HOH OT 85 -8.34000000e-01 15.9994 0 - 1139 WATR 95 HOH HT 84 4.17000000e-01 1.008 0 - 1140 WATR 95 HOH HT 84 4.17000000e-01 1.008 0 - 1141 WATR 96 HOH OT 85 -8.34000000e-01 15.9994 0 - 1142 WATR 96 HOH HT 84 4.17000000e-01 1.008 0 - 1143 WATR 96 HOH HT 84 4.17000000e-01 1.008 0 - 1144 WATR 97 HOH OT 85 -8.34000000e-01 15.9994 0 - 1145 WATR 97 HOH HT 84 4.17000000e-01 1.008 0 - 1146 WATR 97 HOH HT 84 4.17000000e-01 1.008 0 - 1147 WATR 98 HOH OT 85 -8.34000000e-01 15.9994 0 - 1148 WATR 98 HOH HT 84 4.17000000e-01 1.008 0 - 1149 WATR 98 HOH HT 84 4.17000000e-01 1.008 0 - 1150 WATR 99 HOH OT 85 -8.34000000e-01 15.9994 0 - 1151 WATR 99 HOH HT 84 4.17000000e-01 1.008 0 - 1152 WATR 99 HOH HT 84 4.17000000e-01 1.008 0 - 1153 WATR 100 HOH OT 85 -8.34000000e-01 15.9994 0 - 1154 WATR 100 HOH HT 84 4.17000000e-01 1.008 0 - 1155 WATR 100 HOH HT 84 4.17000000e-01 1.008 0 - 1156 WATR 101 HOH OT 85 -8.34000000e-01 15.9994 0 - 1157 WATR 101 HOH HT 84 4.17000000e-01 1.008 0 - 1158 WATR 101 HOH HT 84 4.17000000e-01 1.008 0 - 1159 WATR 102 HOH OT 85 -8.34000000e-01 15.9994 0 - 1160 WATR 102 HOH HT 84 4.17000000e-01 1.008 0 - 1161 WATR 102 HOH HT 84 4.17000000e-01 1.008 0 - 1162 WATR 103 HOH OT 85 -8.34000000e-01 15.9994 0 - 1163 WATR 103 HOH HT 84 4.17000000e-01 1.008 0 - 1164 WATR 103 HOH HT 84 4.17000000e-01 1.008 0 - 1165 WATR 104 HOH OT 85 -8.34000000e-01 15.9994 0 - 1166 WATR 104 HOH HT 84 4.17000000e-01 1.008 0 - 1167 WATR 104 HOH HT 84 4.17000000e-01 1.008 0 - 1168 WATR 105 HOH OT 85 -8.34000000e-01 15.9994 0 - 1169 WATR 105 HOH HT 84 4.17000000e-01 1.008 0 - 1170 WATR 105 HOH HT 84 4.17000000e-01 1.008 0 - 1171 WATR 106 HOH OT 85 -8.34000000e-01 15.9994 0 - 1172 WATR 106 HOH HT 84 4.17000000e-01 1.008 0 - 1173 WATR 106 HOH HT 84 4.17000000e-01 1.008 0 - 1174 WATR 107 HOH OT 85 -8.34000000e-01 15.9994 0 - 1175 WATR 107 HOH HT 84 4.17000000e-01 1.008 0 - 1176 WATR 107 HOH HT 84 4.17000000e-01 1.008 0 - 1177 WATR 108 HOH OT 85 -8.34000000e-01 15.9994 0 - 1178 WATR 108 HOH HT 84 4.17000000e-01 1.008 0 - 1179 WATR 108 HOH HT 84 4.17000000e-01 1.008 0 - 1180 WATR 109 HOH OT 85 -8.34000000e-01 15.9994 0 - 1181 WATR 109 HOH HT 84 4.17000000e-01 1.008 0 - 1182 WATR 109 HOH HT 84 4.17000000e-01 1.008 0 - 1183 WATR 110 HOH OT 85 -8.34000000e-01 15.9994 0 - 1184 WATR 110 HOH HT 84 4.17000000e-01 1.008 0 - 1185 WATR 110 HOH HT 84 4.17000000e-01 1.008 0 - 1186 WATR 111 HOH OT 85 -8.34000000e-01 15.9994 0 - 1187 WATR 111 HOH HT 84 4.17000000e-01 1.008 0 - 1188 WATR 111 HOH HT 84 4.17000000e-01 1.008 0 - 1189 WATR 112 HOH OT 85 -8.34000000e-01 15.9994 0 - 1190 WATR 112 HOH HT 84 4.17000000e-01 1.008 0 - 1191 WATR 112 HOH HT 84 4.17000000e-01 1.008 0 - 1192 WATR 113 HOH OT 85 -8.34000000e-01 15.9994 0 - 1193 WATR 113 HOH HT 84 4.17000000e-01 1.008 0 - 1194 WATR 113 HOH HT 84 4.17000000e-01 1.008 0 - 1195 WATR 114 HOH OT 85 -8.34000000e-01 15.9994 0 - 1196 WATR 114 HOH HT 84 4.17000000e-01 1.008 0 - 1197 WATR 114 HOH HT 84 4.17000000e-01 1.008 0 - 1198 WATR 115 HOH OT 85 -8.34000000e-01 15.9994 0 - 1199 WATR 115 HOH HT 84 4.17000000e-01 1.008 0 - 1200 WATR 115 HOH HT 84 4.17000000e-01 1.008 0 - 1201 WATR 116 HOH OT 85 -8.34000000e-01 15.9994 0 - 1202 WATR 116 HOH HT 84 4.17000000e-01 1.008 0 - 1203 WATR 116 HOH HT 84 4.17000000e-01 1.008 0 - 1204 WATR 117 HOH OT 85 -8.34000000e-01 15.9994 0 - 1205 WATR 117 HOH HT 84 4.17000000e-01 1.008 0 - 1206 WATR 117 HOH HT 84 4.17000000e-01 1.008 0 - 1207 WATR 118 HOH OT 85 -8.34000000e-01 15.9994 0 - 1208 WATR 118 HOH HT 84 4.17000000e-01 1.008 0 - 1209 WATR 118 HOH HT 84 4.17000000e-01 1.008 0 - 1210 WATR 119 HOH OT 85 -8.34000000e-01 15.9994 0 - 1211 WATR 119 HOH HT 84 4.17000000e-01 1.008 0 - 1212 WATR 119 HOH HT 84 4.17000000e-01 1.008 0 - 1213 WATR 120 HOH OT 85 -8.34000000e-01 15.9994 0 - 1214 WATR 120 HOH HT 84 4.17000000e-01 1.008 0 - 1215 WATR 120 HOH HT 84 4.17000000e-01 1.008 0 - 1216 WATR 121 HOH OT 85 -8.34000000e-01 15.9994 0 - 1217 WATR 121 HOH HT 84 4.17000000e-01 1.008 0 - 1218 WATR 121 HOH HT 84 4.17000000e-01 1.008 0 - 1219 WATR 122 HOH OT 85 -8.34000000e-01 15.9994 0 - 1220 WATR 122 HOH HT 84 4.17000000e-01 1.008 0 - 1221 WATR 122 HOH HT 84 4.17000000e-01 1.008 0 - 1222 WATR 123 HOH OT 85 -8.34000000e-01 15.9994 0 - 1223 WATR 123 HOH HT 84 4.17000000e-01 1.008 0 - 1224 WATR 123 HOH HT 84 4.17000000e-01 1.008 0 - 1225 WATR 124 HOH OT 85 -8.34000000e-01 15.9994 0 - 1226 WATR 124 HOH HT 84 4.17000000e-01 1.008 0 - 1227 WATR 124 HOH HT 84 4.17000000e-01 1.008 0 - 1228 WATR 125 HOH OT 85 -8.34000000e-01 15.9994 0 - 1229 WATR 125 HOH HT 84 4.17000000e-01 1.008 0 - 1230 WATR 125 HOH HT 84 4.17000000e-01 1.008 0 - 1231 WATR 126 HOH OT 85 -8.34000000e-01 15.9994 0 - 1232 WATR 126 HOH HT 84 4.17000000e-01 1.008 0 - 1233 WATR 126 HOH HT 84 4.17000000e-01 1.008 0 - 1234 WATR 127 HOH OT 85 -8.34000000e-01 15.9994 0 - 1235 WATR 127 HOH HT 84 4.17000000e-01 1.008 0 - 1236 WATR 127 HOH HT 84 4.17000000e-01 1.008 0 - 1237 WATR 128 HOH OT 85 -8.34000000e-01 15.9994 0 - 1238 WATR 128 HOH HT 84 4.17000000e-01 1.008 0 - 1239 WATR 128 HOH HT 84 4.17000000e-01 1.008 0 - 1240 WATR 129 HOH OT 85 -8.34000000e-01 15.9994 0 - 1241 WATR 129 HOH HT 84 4.17000000e-01 1.008 0 - 1242 WATR 129 HOH HT 84 4.17000000e-01 1.008 0 - 1243 WATR 130 HOH OT 85 -8.34000000e-01 15.9994 0 - 1244 WATR 130 HOH HT 84 4.17000000e-01 1.008 0 - 1245 WATR 130 HOH HT 84 4.17000000e-01 1.008 0 - 1246 WATR 131 HOH OT 85 -8.34000000e-01 15.9994 0 - 1247 WATR 131 HOH HT 84 4.17000000e-01 1.008 0 - 1248 WATR 131 HOH HT 84 4.17000000e-01 1.008 0 - 1249 WATR 132 HOH OT 85 -8.34000000e-01 15.9994 0 - 1250 WATR 132 HOH HT 84 4.17000000e-01 1.008 0 - 1251 WATR 132 HOH HT 84 4.17000000e-01 1.008 0 - 1252 WATR 133 HOH OT 85 -8.34000000e-01 15.9994 0 - 1253 WATR 133 HOH HT 84 4.17000000e-01 1.008 0 - 1254 WATR 133 HOH HT 84 4.17000000e-01 1.008 0 - 1255 WATR 134 HOH OT 85 -8.34000000e-01 15.9994 0 - 1256 WATR 134 HOH HT 84 4.17000000e-01 1.008 0 - 1257 WATR 134 HOH HT 84 4.17000000e-01 1.008 0 - 1258 WATR 135 HOH OT 85 -8.34000000e-01 15.9994 0 - 1259 WATR 135 HOH HT 84 4.17000000e-01 1.008 0 - 1260 WATR 135 HOH HT 84 4.17000000e-01 1.008 0 - 1261 WATR 136 HOH OT 85 -8.34000000e-01 15.9994 0 - 1262 WATR 136 HOH HT 84 4.17000000e-01 1.008 0 - 1263 WATR 136 HOH HT 84 4.17000000e-01 1.008 0 - 1264 WATR 137 HOH OT 85 -8.34000000e-01 15.9994 0 - 1265 WATR 137 HOH HT 84 4.17000000e-01 1.008 0 - 1266 WATR 137 HOH HT 84 4.17000000e-01 1.008 0 - 1267 WATR 138 HOH OT 85 -8.34000000e-01 15.9994 0 - 1268 WATR 138 HOH HT 84 4.17000000e-01 1.008 0 - 1269 WATR 138 HOH HT 84 4.17000000e-01 1.008 0 - 1270 WATR 139 HOH OT 85 -8.34000000e-01 15.9994 0 - 1271 WATR 139 HOH HT 84 4.17000000e-01 1.008 0 - 1272 WATR 139 HOH HT 84 4.17000000e-01 1.008 0 - 1273 WATR 140 HOH OT 85 -8.34000000e-01 15.9994 0 - 1274 WATR 140 HOH HT 84 4.17000000e-01 1.008 0 - 1275 WATR 140 HOH HT 84 4.17000000e-01 1.008 0 - 1276 WATR 141 HOH OT 85 -8.34000000e-01 15.9994 0 - 1277 WATR 141 HOH HT 84 4.17000000e-01 1.008 0 - 1278 WATR 141 HOH HT 84 4.17000000e-01 1.008 0 - 1279 WATR 142 HOH OT 85 -8.34000000e-01 15.9994 0 - 1280 WATR 142 HOH HT 84 4.17000000e-01 1.008 0 - 1281 WATR 142 HOH HT 84 4.17000000e-01 1.008 0 - 1282 WATR 143 HOH OT 85 -8.34000000e-01 15.9994 0 - 1283 WATR 143 HOH HT 84 4.17000000e-01 1.008 0 - 1284 WATR 143 HOH HT 84 4.17000000e-01 1.008 0 - 1285 WATR 144 HOH OT 85 -8.34000000e-01 15.9994 0 - 1286 WATR 144 HOH HT 84 4.17000000e-01 1.008 0 - 1287 WATR 144 HOH HT 84 4.17000000e-01 1.008 0 - 1288 WATR 145 HOH OT 85 -8.34000000e-01 15.9994 0 - 1289 WATR 145 HOH HT 84 4.17000000e-01 1.008 0 - 1290 WATR 145 HOH HT 84 4.17000000e-01 1.008 0 - 1291 WATR 146 HOH OT 85 -8.34000000e-01 15.9994 0 - 1292 WATR 146 HOH HT 84 4.17000000e-01 1.008 0 - 1293 WATR 146 HOH HT 84 4.17000000e-01 1.008 0 - 1294 WATR 147 HOH OT 85 -8.34000000e-01 15.9994 0 - 1295 WATR 147 HOH HT 84 4.17000000e-01 1.008 0 - 1296 WATR 147 HOH HT 84 4.17000000e-01 1.008 0 - 1297 WATR 148 HOH OT 85 -8.34000000e-01 15.9994 0 - 1298 WATR 148 HOH HT 84 4.17000000e-01 1.008 0 - 1299 WATR 148 HOH HT 84 4.17000000e-01 1.008 0 - 1300 WATR 149 HOH OT 85 -8.34000000e-01 15.9994 0 - 1301 WATR 149 HOH HT 84 4.17000000e-01 1.008 0 - 1302 WATR 149 HOH HT 84 4.17000000e-01 1.008 0 - 1303 WATR 150 HOH OT 85 -8.34000000e-01 15.9994 0 - 1304 WATR 150 HOH HT 84 4.17000000e-01 1.008 0 - 1305 WATR 150 HOH HT 84 4.17000000e-01 1.008 0 - 1306 WATR 151 HOH OT 85 -8.34000000e-01 15.9994 0 - 1307 WATR 151 HOH HT 84 4.17000000e-01 1.008 0 - 1308 WATR 151 HOH HT 84 4.17000000e-01 1.008 0 - 1309 WATR 152 HOH OT 85 -8.34000000e-01 15.9994 0 - 1310 WATR 152 HOH HT 84 4.17000000e-01 1.008 0 - 1311 WATR 152 HOH HT 84 4.17000000e-01 1.008 0 - 1312 WATR 153 HOH OT 85 -8.34000000e-01 15.9994 0 - 1313 WATR 153 HOH HT 84 4.17000000e-01 1.008 0 - 1314 WATR 153 HOH HT 84 4.17000000e-01 1.008 0 - 1315 WATR 154 HOH OT 85 -8.34000000e-01 15.9994 0 - 1316 WATR 154 HOH HT 84 4.17000000e-01 1.008 0 - 1317 WATR 154 HOH HT 84 4.17000000e-01 1.008 0 - 1318 WATR 155 HOH OT 85 -8.34000000e-01 15.9994 0 - 1319 WATR 155 HOH HT 84 4.17000000e-01 1.008 0 - 1320 WATR 155 HOH HT 84 4.17000000e-01 1.008 0 - 1321 WATR 156 HOH OT 85 -8.34000000e-01 15.9994 0 - 1322 WATR 156 HOH HT 84 4.17000000e-01 1.008 0 - 1323 WATR 156 HOH HT 84 4.17000000e-01 1.008 0 - 1324 WATR 157 HOH OT 85 -8.34000000e-01 15.9994 0 - 1325 WATR 157 HOH HT 84 4.17000000e-01 1.008 0 - 1326 WATR 157 HOH HT 84 4.17000000e-01 1.008 0 - 1327 WATR 158 HOH OT 85 -8.34000000e-01 15.9994 0 - 1328 WATR 158 HOH HT 84 4.17000000e-01 1.008 0 - 1329 WATR 158 HOH HT 84 4.17000000e-01 1.008 0 - 1330 WATR 159 HOH OT 85 -8.34000000e-01 15.9994 0 - 1331 WATR 159 HOH HT 84 4.17000000e-01 1.008 0 - 1332 WATR 159 HOH HT 84 4.17000000e-01 1.008 0 - 1333 WATR 160 HOH OT 85 -8.34000000e-01 15.9994 0 - 1334 WATR 160 HOH HT 84 4.17000000e-01 1.008 0 - 1335 WATR 160 HOH HT 84 4.17000000e-01 1.008 0 - 1336 WATR 161 HOH OT 85 -8.34000000e-01 15.9994 0 - 1337 WATR 161 HOH HT 84 4.17000000e-01 1.008 0 - 1338 WATR 161 HOH HT 84 4.17000000e-01 1.008 0 - 1339 WATR 162 HOH OT 85 -8.34000000e-01 15.9994 0 - 1340 WATR 162 HOH HT 84 4.17000000e-01 1.008 0 - 1341 WATR 162 HOH HT 84 4.17000000e-01 1.008 0 - 1342 WATR 163 HOH OT 85 -8.34000000e-01 15.9994 0 - 1343 WATR 163 HOH HT 84 4.17000000e-01 1.008 0 - 1344 WATR 163 HOH HT 84 4.17000000e-01 1.008 0 - 1345 WATR 164 HOH OT 85 -8.34000000e-01 15.9994 0 - 1346 WATR 164 HOH HT 84 4.17000000e-01 1.008 0 - 1347 WATR 164 HOH HT 84 4.17000000e-01 1.008 0 - 1348 WATR 165 HOH OT 85 -8.34000000e-01 15.9994 0 - 1349 WATR 165 HOH HT 84 4.17000000e-01 1.008 0 - 1350 WATR 165 HOH HT 84 4.17000000e-01 1.008 0 - 1351 WATR 166 HOH OT 85 -8.34000000e-01 15.9994 0 - 1352 WATR 166 HOH HT 84 4.17000000e-01 1.008 0 - 1353 WATR 166 HOH HT 84 4.17000000e-01 1.008 0 - 1354 WATR 167 HOH OT 85 -8.34000000e-01 15.9994 0 - 1355 WATR 167 HOH HT 84 4.17000000e-01 1.008 0 - 1356 WATR 167 HOH HT 84 4.17000000e-01 1.008 0 - 1357 WATR 168 HOH OT 85 -8.34000000e-01 15.9994 0 - 1358 WATR 168 HOH HT 84 4.17000000e-01 1.008 0 - 1359 WATR 168 HOH HT 84 4.17000000e-01 1.008 0 - 1360 WATR 169 HOH OT 85 -8.34000000e-01 15.9994 0 - 1361 WATR 169 HOH HT 84 4.17000000e-01 1.008 0 - 1362 WATR 169 HOH HT 84 4.17000000e-01 1.008 0 - 1363 WATR 170 HOH OT 85 -8.34000000e-01 15.9994 0 - 1364 WATR 170 HOH HT 84 4.17000000e-01 1.008 0 - 1365 WATR 170 HOH HT 84 4.17000000e-01 1.008 0 - 1366 WATR 171 HOH OT 85 -8.34000000e-01 15.9994 0 - 1367 WATR 171 HOH HT 84 4.17000000e-01 1.008 0 - 1368 WATR 171 HOH HT 84 4.17000000e-01 1.008 0 - 1369 WATR 172 HOH OT 85 -8.34000000e-01 15.9994 0 - 1370 WATR 172 HOH HT 84 4.17000000e-01 1.008 0 - 1371 WATR 172 HOH HT 84 4.17000000e-01 1.008 0 - 1372 WATR 173 HOH OT 85 -8.34000000e-01 15.9994 0 - 1373 WATR 173 HOH HT 84 4.17000000e-01 1.008 0 - 1374 WATR 173 HOH HT 84 4.17000000e-01 1.008 0 - 1375 WATR 174 HOH OT 85 -8.34000000e-01 15.9994 0 - 1376 WATR 174 HOH HT 84 4.17000000e-01 1.008 0 - 1377 WATR 174 HOH HT 84 4.17000000e-01 1.008 0 - 1378 WATR 175 HOH OT 85 -8.34000000e-01 15.9994 0 - 1379 WATR 175 HOH HT 84 4.17000000e-01 1.008 0 - 1380 WATR 175 HOH HT 84 4.17000000e-01 1.008 0 - 1381 WATR 176 HOH OT 85 -8.34000000e-01 15.9994 0 - 1382 WATR 176 HOH HT 84 4.17000000e-01 1.008 0 - 1383 WATR 176 HOH HT 84 4.17000000e-01 1.008 0 - 1384 WATR 177 HOH OT 85 -8.34000000e-01 15.9994 0 - 1385 WATR 177 HOH HT 84 4.17000000e-01 1.008 0 - 1386 WATR 177 HOH HT 84 4.17000000e-01 1.008 0 - 1387 WATR 178 HOH OT 85 -8.34000000e-01 15.9994 0 - 1388 WATR 178 HOH HT 84 4.17000000e-01 1.008 0 - 1389 WATR 178 HOH HT 84 4.17000000e-01 1.008 0 - 1390 WATR 179 HOH OT 85 -8.34000000e-01 15.9994 0 - 1391 WATR 179 HOH HT 84 4.17000000e-01 1.008 0 - 1392 WATR 179 HOH HT 84 4.17000000e-01 1.008 0 - 1393 WATR 180 HOH OT 85 -8.34000000e-01 15.9994 0 - 1394 WATR 180 HOH HT 84 4.17000000e-01 1.008 0 - 1395 WATR 180 HOH HT 84 4.17000000e-01 1.008 0 - 1396 WATR 181 HOH OT 85 -8.34000000e-01 15.9994 0 - 1397 WATR 181 HOH HT 84 4.17000000e-01 1.008 0 - 1398 WATR 181 HOH HT 84 4.17000000e-01 1.008 0 - 1399 WATR 182 HOH OT 85 -8.34000000e-01 15.9994 0 - 1400 WATR 182 HOH HT 84 4.17000000e-01 1.008 0 - 1401 WATR 182 HOH HT 84 4.17000000e-01 1.008 0 - 1402 WATR 183 HOH OT 85 -8.34000000e-01 15.9994 0 - 1403 WATR 183 HOH HT 84 4.17000000e-01 1.008 0 - 1404 WATR 183 HOH HT 84 4.17000000e-01 1.008 0 - 1405 WATR 184 HOH OT 85 -8.34000000e-01 15.9994 0 - 1406 WATR 184 HOH HT 84 4.17000000e-01 1.008 0 - 1407 WATR 184 HOH HT 84 4.17000000e-01 1.008 0 - 1408 WATR 185 HOH OT 85 -8.34000000e-01 15.9994 0 - 1409 WATR 185 HOH HT 84 4.17000000e-01 1.008 0 - 1410 WATR 185 HOH HT 84 4.17000000e-01 1.008 0 - 1411 WATR 186 HOH OT 85 -8.34000000e-01 15.9994 0 - 1412 WATR 186 HOH HT 84 4.17000000e-01 1.008 0 - 1413 WATR 186 HOH HT 84 4.17000000e-01 1.008 0 - 1414 WATR 187 HOH OT 85 -8.34000000e-01 15.9994 0 - 1415 WATR 187 HOH HT 84 4.17000000e-01 1.008 0 - 1416 WATR 187 HOH HT 84 4.17000000e-01 1.008 0 - 1417 WATR 188 HOH OT 85 -8.34000000e-01 15.9994 0 - 1418 WATR 188 HOH HT 84 4.17000000e-01 1.008 0 - 1419 WATR 188 HOH HT 84 4.17000000e-01 1.008 0 - 1420 WATR 189 HOH OT 85 -8.34000000e-01 15.9994 0 - 1421 WATR 189 HOH HT 84 4.17000000e-01 1.008 0 - 1422 WATR 189 HOH HT 84 4.17000000e-01 1.008 0 - 1423 WATR 190 HOH OT 85 -8.34000000e-01 15.9994 0 - 1424 WATR 190 HOH HT 84 4.17000000e-01 1.008 0 - 1425 WATR 190 HOH HT 84 4.17000000e-01 1.008 0 - 1426 WATR 191 HOH OT 85 -8.34000000e-01 15.9994 0 - 1427 WATR 191 HOH HT 84 4.17000000e-01 1.008 0 - 1428 WATR 191 HOH HT 84 4.17000000e-01 1.008 0 - 1429 WATR 192 HOH OT 85 -8.34000000e-01 15.9994 0 - 1430 WATR 192 HOH HT 84 4.17000000e-01 1.008 0 - 1431 WATR 192 HOH HT 84 4.17000000e-01 1.008 0 - 1432 WATR 193 HOH OT 85 -8.34000000e-01 15.9994 0 - 1433 WATR 193 HOH HT 84 4.17000000e-01 1.008 0 - 1434 WATR 193 HOH HT 84 4.17000000e-01 1.008 0 - 1435 WATR 194 HOH OT 85 -8.34000000e-01 15.9994 0 - 1436 WATR 194 HOH HT 84 4.17000000e-01 1.008 0 - 1437 WATR 194 HOH HT 84 4.17000000e-01 1.008 0 - 1438 WATR 195 HOH OT 85 -8.34000000e-01 15.9994 0 - 1439 WATR 195 HOH HT 84 4.17000000e-01 1.008 0 - 1440 WATR 195 HOH HT 84 4.17000000e-01 1.008 0 - 1441 WATR 196 HOH OT 85 -8.34000000e-01 15.9994 0 - 1442 WATR 196 HOH HT 84 4.17000000e-01 1.008 0 - 1443 WATR 196 HOH HT 84 4.17000000e-01 1.008 0 - 1444 WATR 197 HOH OT 85 -8.34000000e-01 15.9994 0 - 1445 WATR 197 HOH HT 84 4.17000000e-01 1.008 0 - 1446 WATR 197 HOH HT 84 4.17000000e-01 1.008 0 - 1447 WATR 198 HOH OT 85 -8.34000000e-01 15.9994 0 - 1448 WATR 198 HOH HT 84 4.17000000e-01 1.008 0 - 1449 WATR 198 HOH HT 84 4.17000000e-01 1.008 0 - 1450 WATR 199 HOH OT 85 -8.34000000e-01 15.9994 0 - 1451 WATR 199 HOH HT 84 4.17000000e-01 1.008 0 - 1452 WATR 199 HOH HT 84 4.17000000e-01 1.008 0 - 1453 WATR 200 HOH OT 85 -8.34000000e-01 15.9994 0 - 1454 WATR 200 HOH HT 84 4.17000000e-01 1.008 0 - 1455 WATR 200 HOH HT 84 4.17000000e-01 1.008 0 - 1456 WATR 201 HOH OT 85 -8.34000000e-01 15.9994 0 - 1457 WATR 201 HOH HT 84 4.17000000e-01 1.008 0 - 1458 WATR 201 HOH HT 84 4.17000000e-01 1.008 0 - 1459 WATR 202 HOH OT 85 -8.34000000e-01 15.9994 0 - 1460 WATR 202 HOH HT 84 4.17000000e-01 1.008 0 - 1461 WATR 202 HOH HT 84 4.17000000e-01 1.008 0 - 1462 WATR 203 HOH OT 85 -8.34000000e-01 15.9994 0 - 1463 WATR 203 HOH HT 84 4.17000000e-01 1.008 0 - 1464 WATR 203 HOH HT 84 4.17000000e-01 1.008 0 - 1465 WATR 204 HOH OT 85 -8.34000000e-01 15.9994 0 - 1466 WATR 204 HOH HT 84 4.17000000e-01 1.008 0 - 1467 WATR 204 HOH HT 84 4.17000000e-01 1.008 0 - 1468 WATR 205 HOH OT 85 -8.34000000e-01 15.9994 0 - 1469 WATR 205 HOH HT 84 4.17000000e-01 1.008 0 - 1470 WATR 205 HOH HT 84 4.17000000e-01 1.008 0 - 1471 WATR 206 HOH OT 85 -8.34000000e-01 15.9994 0 - 1472 WATR 206 HOH HT 84 4.17000000e-01 1.008 0 - 1473 WATR 206 HOH HT 84 4.17000000e-01 1.008 0 - 1474 WATR 207 HOH OT 85 -8.34000000e-01 15.9994 0 - 1475 WATR 207 HOH HT 84 4.17000000e-01 1.008 0 - 1476 WATR 207 HOH HT 84 4.17000000e-01 1.008 0 - 1477 WATR 208 HOH OT 85 -8.34000000e-01 15.9994 0 - 1478 WATR 208 HOH HT 84 4.17000000e-01 1.008 0 - 1479 WATR 208 HOH HT 84 4.17000000e-01 1.008 0 - 1480 WATR 209 HOH OT 85 -8.34000000e-01 15.9994 0 - 1481 WATR 209 HOH HT 84 4.17000000e-01 1.008 0 - 1482 WATR 209 HOH HT 84 4.17000000e-01 1.008 0 - 1483 WATR 210 HOH OT 85 -8.34000000e-01 15.9994 0 - 1484 WATR 210 HOH HT 84 4.17000000e-01 1.008 0 - 1485 WATR 210 HOH HT 84 4.17000000e-01 1.008 0 - 1486 WATR 211 HOH OT 85 -8.34000000e-01 15.9994 0 - 1487 WATR 211 HOH HT 84 4.17000000e-01 1.008 0 - 1488 WATR 211 HOH HT 84 4.17000000e-01 1.008 0 - 1489 WATR 212 HOH OT 85 -8.34000000e-01 15.9994 0 - 1490 WATR 212 HOH HT 84 4.17000000e-01 1.008 0 - 1491 WATR 212 HOH HT 84 4.17000000e-01 1.008 0 - 1492 WATR 213 HOH OT 85 -8.34000000e-01 15.9994 0 - 1493 WATR 213 HOH HT 84 4.17000000e-01 1.008 0 - 1494 WATR 213 HOH HT 84 4.17000000e-01 1.008 0 - 1495 WATR 214 HOH OT 85 -8.34000000e-01 15.9994 0 - 1496 WATR 214 HOH HT 84 4.17000000e-01 1.008 0 - 1497 WATR 214 HOH HT 84 4.17000000e-01 1.008 0 - 1498 WATR 215 HOH OT 85 -8.34000000e-01 15.9994 0 - 1499 WATR 215 HOH HT 84 4.17000000e-01 1.008 0 - 1500 WATR 215 HOH HT 84 4.17000000e-01 1.008 0 - 1501 WATR 216 HOH OT 85 -8.34000000e-01 15.9994 0 - 1502 WATR 216 HOH HT 84 4.17000000e-01 1.008 0 - 1503 WATR 216 HOH HT 84 4.17000000e-01 1.008 0 - 1504 WATR 217 HOH OT 85 -8.34000000e-01 15.9994 0 - 1505 WATR 217 HOH HT 84 4.17000000e-01 1.008 0 - 1506 WATR 217 HOH HT 84 4.17000000e-01 1.008 0 - 1507 WATR 218 HOH OT 85 -8.34000000e-01 15.9994 0 - 1508 WATR 218 HOH HT 84 4.17000000e-01 1.008 0 - 1509 WATR 218 HOH HT 84 4.17000000e-01 1.008 0 - 1510 WATR 219 HOH OT 85 -8.34000000e-01 15.9994 0 - 1511 WATR 219 HOH HT 84 4.17000000e-01 1.008 0 - 1512 WATR 219 HOH HT 84 4.17000000e-01 1.008 0 - 1513 WATR 220 HOH OT 85 -8.34000000e-01 15.9994 0 - 1514 WATR 220 HOH HT 84 4.17000000e-01 1.008 0 - 1515 WATR 220 HOH HT 84 4.17000000e-01 1.008 0 - 1516 WATR 221 HOH OT 85 -8.34000000e-01 15.9994 0 - 1517 WATR 221 HOH HT 84 4.17000000e-01 1.008 0 - 1518 WATR 221 HOH HT 84 4.17000000e-01 1.008 0 - 1519 WATR 222 HOH OT 85 -8.34000000e-01 15.9994 0 - 1520 WATR 222 HOH HT 84 4.17000000e-01 1.008 0 - 1521 WATR 222 HOH HT 84 4.17000000e-01 1.008 0 - 1522 WATR 223 HOH OT 85 -8.34000000e-01 15.9994 0 - 1523 WATR 223 HOH HT 84 4.17000000e-01 1.008 0 - 1524 WATR 223 HOH HT 84 4.17000000e-01 1.008 0 - 1525 WATR 224 HOH OT 85 -8.34000000e-01 15.9994 0 - 1526 WATR 224 HOH HT 84 4.17000000e-01 1.008 0 - 1527 WATR 224 HOH HT 84 4.17000000e-01 1.008 0 - 1528 SALT 1 ION SOD 87 1.00000000e+00 22.9897 0 - 1529 WATR 225 HOH OT 85 -8.34000000e-01 15.9994 0 - 1530 WATR 225 HOH HT 84 4.17000000e-01 1.008 0 - 1531 WATR 225 HOH HT 84 4.17000000e-01 1.008 0 - 1532 WATR 226 HOH OT 85 -8.34000000e-01 15.9994 0 - 1533 WATR 226 HOH HT 84 4.17000000e-01 1.008 0 - 1534 WATR 226 HOH HT 84 4.17000000e-01 1.008 0 - 1535 WATR 227 HOH OT 85 -8.34000000e-01 15.9994 0 - 1536 WATR 227 HOH HT 84 4.17000000e-01 1.008 0 - 1537 WATR 227 HOH HT 84 4.17000000e-01 1.008 0 - 1538 WATR 228 HOH OT 85 -8.34000000e-01 15.9994 0 - 1539 WATR 228 HOH HT 84 4.17000000e-01 1.008 0 - 1540 WATR 228 HOH HT 84 4.17000000e-01 1.008 0 - 1541 WATR 229 HOH OT 85 -8.34000000e-01 15.9994 0 - 1542 WATR 229 HOH HT 84 4.17000000e-01 1.008 0 - 1543 WATR 229 HOH HT 84 4.17000000e-01 1.008 0 - 1544 WATR 230 HOH OT 85 -8.34000000e-01 15.9994 0 - 1545 WATR 230 HOH HT 84 4.17000000e-01 1.008 0 - 1546 WATR 230 HOH HT 84 4.17000000e-01 1.008 0 - 1547 WATR 231 HOH OT 85 -8.34000000e-01 15.9994 0 - 1548 WATR 231 HOH HT 84 4.17000000e-01 1.008 0 - 1549 WATR 231 HOH HT 84 4.17000000e-01 1.008 0 - 1550 WATR 232 HOH OT 85 -8.34000000e-01 15.9994 0 - 1551 WATR 232 HOH HT 84 4.17000000e-01 1.008 0 - 1552 WATR 232 HOH HT 84 4.17000000e-01 1.008 0 - 1553 WATR 233 HOH OT 85 -8.34000000e-01 15.9994 0 - 1554 WATR 233 HOH HT 84 4.17000000e-01 1.008 0 - 1555 WATR 233 HOH HT 84 4.17000000e-01 1.008 0 - 1556 WATR 234 HOH OT 85 -8.34000000e-01 15.9994 0 - 1557 WATR 234 HOH HT 84 4.17000000e-01 1.008 0 - 1558 WATR 234 HOH HT 84 4.17000000e-01 1.008 0 - 1559 WATR 235 HOH OT 85 -8.34000000e-01 15.9994 0 - 1560 WATR 235 HOH HT 84 4.17000000e-01 1.008 0 - 1561 WATR 235 HOH HT 84 4.17000000e-01 1.008 0 - 1562 WATR 236 HOH OT 85 -8.34000000e-01 15.9994 0 - 1563 WATR 236 HOH HT 84 4.17000000e-01 1.008 0 - 1564 WATR 236 HOH HT 84 4.17000000e-01 1.008 0 - 1565 WATR 237 HOH OT 85 -8.34000000e-01 15.9994 0 - 1566 WATR 237 HOH HT 84 4.17000000e-01 1.008 0 - 1567 WATR 237 HOH HT 84 4.17000000e-01 1.008 0 - 1568 WATR 238 HOH OT 85 -8.34000000e-01 15.9994 0 - 1569 WATR 238 HOH HT 84 4.17000000e-01 1.008 0 - 1570 WATR 238 HOH HT 84 4.17000000e-01 1.008 0 - 1571 WATR 239 HOH OT 85 -8.34000000e-01 15.9994 0 - 1572 WATR 239 HOH HT 84 4.17000000e-01 1.008 0 - 1573 WATR 239 HOH HT 84 4.17000000e-01 1.008 0 - 1574 WATR 240 HOH OT 85 -8.34000000e-01 15.9994 0 - 1575 WATR 240 HOH HT 84 4.17000000e-01 1.008 0 - 1576 WATR 240 HOH HT 84 4.17000000e-01 1.008 0 - 1577 WATR 241 HOH OT 85 -8.34000000e-01 15.9994 0 - 1578 WATR 241 HOH HT 84 4.17000000e-01 1.008 0 - 1579 WATR 241 HOH HT 84 4.17000000e-01 1.008 0 - 1580 WATR 242 HOH OT 85 -8.34000000e-01 15.9994 0 - 1581 WATR 242 HOH HT 84 4.17000000e-01 1.008 0 - 1582 WATR 242 HOH HT 84 4.17000000e-01 1.008 0 - 1583 WATR 243 HOH OT 85 -8.34000000e-01 15.9994 0 - 1584 WATR 243 HOH HT 84 4.17000000e-01 1.008 0 - 1585 WATR 243 HOH HT 84 4.17000000e-01 1.008 0 - 1586 WATR 244 HOH OT 85 -8.34000000e-01 15.9994 0 - 1587 WATR 244 HOH HT 84 4.17000000e-01 1.008 0 - 1588 WATR 244 HOH HT 84 4.17000000e-01 1.008 0 - 1589 WATR 245 HOH OT 85 -8.34000000e-01 15.9994 0 - 1590 WATR 245 HOH HT 84 4.17000000e-01 1.008 0 - 1591 WATR 245 HOH HT 84 4.17000000e-01 1.008 0 - 1592 WATR 246 HOH OT 85 -8.34000000e-01 15.9994 0 - 1593 WATR 246 HOH HT 84 4.17000000e-01 1.008 0 - 1594 WATR 246 HOH HT 84 4.17000000e-01 1.008 0 - 1595 WATR 247 HOH OT 85 -8.34000000e-01 15.9994 0 - 1596 WATR 247 HOH HT 84 4.17000000e-01 1.008 0 - 1597 WATR 247 HOH HT 84 4.17000000e-01 1.008 0 - 1598 WATR 248 HOH OT 85 -8.34000000e-01 15.9994 0 - 1599 WATR 248 HOH HT 84 4.17000000e-01 1.008 0 - 1600 WATR 248 HOH HT 84 4.17000000e-01 1.008 0 - 1601 WATR 249 HOH OT 85 -8.34000000e-01 15.9994 0 - 1602 WATR 249 HOH HT 84 4.17000000e-01 1.008 0 - 1603 WATR 249 HOH HT 84 4.17000000e-01 1.008 0 - 1604 WATR 250 HOH OT 85 -8.34000000e-01 15.9994 0 - 1605 WATR 250 HOH HT 84 4.17000000e-01 1.008 0 - 1606 WATR 250 HOH HT 84 4.17000000e-01 1.008 0 - 1607 WATR 251 HOH OT 85 -8.34000000e-01 15.9994 0 - 1608 WATR 251 HOH HT 84 4.17000000e-01 1.008 0 - 1609 WATR 251 HOH HT 84 4.17000000e-01 1.008 0 - 1610 WATR 252 HOH OT 85 -8.34000000e-01 15.9994 0 - 1611 WATR 252 HOH HT 84 4.17000000e-01 1.008 0 - 1612 WATR 252 HOH HT 84 4.17000000e-01 1.008 0 - 1613 WATR 253 HOH OT 85 -8.34000000e-01 15.9994 0 - 1614 WATR 253 HOH HT 84 4.17000000e-01 1.008 0 - 1615 WATR 253 HOH HT 84 4.17000000e-01 1.008 0 - 1616 WATR 254 HOH OT 85 -8.34000000e-01 15.9994 0 - 1617 WATR 254 HOH HT 84 4.17000000e-01 1.008 0 - 1618 WATR 254 HOH HT 84 4.17000000e-01 1.008 0 - 1619 WATR 255 HOH OT 85 -8.34000000e-01 15.9994 0 - 1620 WATR 255 HOH HT 84 4.17000000e-01 1.008 0 - 1621 WATR 255 HOH HT 84 4.17000000e-01 1.008 0 - 1622 WATR 256 HOH OT 85 -8.34000000e-01 15.9994 0 - 1623 WATR 256 HOH HT 84 4.17000000e-01 1.008 0 - 1624 WATR 256 HOH HT 84 4.17000000e-01 1.008 0 - 1625 WATR 257 HOH OT 85 -8.34000000e-01 15.9994 0 - 1626 WATR 257 HOH HT 84 4.17000000e-01 1.008 0 - 1627 WATR 257 HOH HT 84 4.17000000e-01 1.008 0 - 1628 WATR 258 HOH OT 85 -8.34000000e-01 15.9994 0 - 1629 WATR 258 HOH HT 84 4.17000000e-01 1.008 0 - 1630 WATR 258 HOH HT 84 4.17000000e-01 1.008 0 - 1631 WATR 259 HOH OT 85 -8.34000000e-01 15.9994 0 - 1632 WATR 259 HOH HT 84 4.17000000e-01 1.008 0 - 1633 WATR 259 HOH HT 84 4.17000000e-01 1.008 0 - 1634 WATR 260 HOH OT 85 -8.34000000e-01 15.9994 0 - 1635 WATR 260 HOH HT 84 4.17000000e-01 1.008 0 - 1636 WATR 260 HOH HT 84 4.17000000e-01 1.008 0 - 1637 WATR 261 HOH OT 85 -8.34000000e-01 15.9994 0 - 1638 WATR 261 HOH HT 84 4.17000000e-01 1.008 0 - 1639 WATR 261 HOH HT 84 4.17000000e-01 1.008 0 - 1640 WATR 262 HOH OT 85 -8.34000000e-01 15.9994 0 - 1641 WATR 262 HOH HT 84 4.17000000e-01 1.008 0 - 1642 WATR 262 HOH HT 84 4.17000000e-01 1.008 0 - 1643 WATR 263 HOH OT 85 -8.34000000e-01 15.9994 0 - 1644 WATR 263 HOH HT 84 4.17000000e-01 1.008 0 - 1645 WATR 263 HOH HT 84 4.17000000e-01 1.008 0 - 1646 WATR 264 HOH OT 85 -8.34000000e-01 15.9994 0 - 1647 WATR 264 HOH HT 84 4.17000000e-01 1.008 0 - 1648 WATR 264 HOH HT 84 4.17000000e-01 1.008 0 - 1649 WATR 265 HOH OT 85 -8.34000000e-01 15.9994 0 - 1650 WATR 265 HOH HT 84 4.17000000e-01 1.008 0 - 1651 WATR 265 HOH HT 84 4.17000000e-01 1.008 0 - 1652 WATR 266 HOH OT 85 -8.34000000e-01 15.9994 0 - 1653 WATR 266 HOH HT 84 4.17000000e-01 1.008 0 - 1654 WATR 266 HOH HT 84 4.17000000e-01 1.008 0 - 1655 WATR 267 HOH OT 85 -8.34000000e-01 15.9994 0 - 1656 WATR 267 HOH HT 84 4.17000000e-01 1.008 0 - 1657 WATR 267 HOH HT 84 4.17000000e-01 1.008 0 - 1658 WATR 268 HOH OT 85 -8.34000000e-01 15.9994 0 - 1659 WATR 268 HOH HT 84 4.17000000e-01 1.008 0 - 1660 WATR 268 HOH HT 84 4.17000000e-01 1.008 0 - 1661 WATR 269 HOH OT 85 -8.34000000e-01 15.9994 0 - 1662 WATR 269 HOH HT 84 4.17000000e-01 1.008 0 - 1663 WATR 269 HOH HT 84 4.17000000e-01 1.008 0 - 1664 WATR 270 HOH OT 85 -8.34000000e-01 15.9994 0 - 1665 WATR 270 HOH HT 84 4.17000000e-01 1.008 0 - 1666 WATR 270 HOH HT 84 4.17000000e-01 1.008 0 - 1667 WATR 271 HOH OT 85 -8.34000000e-01 15.9994 0 - 1668 WATR 271 HOH HT 84 4.17000000e-01 1.008 0 - 1669 WATR 271 HOH HT 84 4.17000000e-01 1.008 0 - 1670 WATR 272 HOH OT 85 -8.34000000e-01 15.9994 0 - 1671 WATR 272 HOH HT 84 4.17000000e-01 1.008 0 - 1672 WATR 272 HOH HT 84 4.17000000e-01 1.008 0 - 1673 WATR 273 HOH OT 85 -8.34000000e-01 15.9994 0 - 1674 WATR 273 HOH HT 84 4.17000000e-01 1.008 0 - 1675 WATR 273 HOH HT 84 4.17000000e-01 1.008 0 - 1676 WATR 274 HOH OT 85 -8.34000000e-01 15.9994 0 - 1677 WATR 274 HOH HT 84 4.17000000e-01 1.008 0 - 1678 WATR 274 HOH HT 84 4.17000000e-01 1.008 0 - 1679 WATR 275 HOH OT 85 -8.34000000e-01 15.9994 0 - 1680 WATR 275 HOH HT 84 4.17000000e-01 1.008 0 - 1681 WATR 275 HOH HT 84 4.17000000e-01 1.008 0 - 1682 WATR 276 HOH OT 85 -8.34000000e-01 15.9994 0 - 1683 WATR 276 HOH HT 84 4.17000000e-01 1.008 0 - 1684 WATR 276 HOH HT 84 4.17000000e-01 1.008 0 - 1685 WATR 277 HOH OT 85 -8.34000000e-01 15.9994 0 - 1686 WATR 277 HOH HT 84 4.17000000e-01 1.008 0 - 1687 WATR 277 HOH HT 84 4.17000000e-01 1.008 0 - 1688 WATR 278 HOH OT 85 -8.34000000e-01 15.9994 0 - 1689 WATR 278 HOH HT 84 4.17000000e-01 1.008 0 - 1690 WATR 278 HOH HT 84 4.17000000e-01 1.008 0 - 1691 WATR 279 HOH OT 85 -8.34000000e-01 15.9994 0 - 1692 WATR 279 HOH HT 84 4.17000000e-01 1.008 0 - 1693 WATR 279 HOH HT 84 4.17000000e-01 1.008 0 - 1694 WATR 280 HOH OT 85 -8.34000000e-01 15.9994 0 - 1695 WATR 280 HOH HT 84 4.17000000e-01 1.008 0 - 1696 WATR 280 HOH HT 84 4.17000000e-01 1.008 0 - 1697 WATR 281 HOH OT 85 -8.34000000e-01 15.9994 0 - 1698 WATR 281 HOH HT 84 4.17000000e-01 1.008 0 - 1699 WATR 281 HOH HT 84 4.17000000e-01 1.008 0 - 1700 WATR 282 HOH OT 85 -8.34000000e-01 15.9994 0 - 1701 WATR 282 HOH HT 84 4.17000000e-01 1.008 0 - 1702 WATR 282 HOH HT 84 4.17000000e-01 1.008 0 - 1703 WATR 283 HOH OT 85 -8.34000000e-01 15.9994 0 - 1704 WATR 283 HOH HT 84 4.17000000e-01 1.008 0 - 1705 WATR 283 HOH HT 84 4.17000000e-01 1.008 0 - 1706 WATR 284 HOH OT 85 -8.34000000e-01 15.9994 0 - 1707 WATR 284 HOH HT 84 4.17000000e-01 1.008 0 - 1708 WATR 284 HOH HT 84 4.17000000e-01 1.008 0 - 1709 WATR 285 HOH OT 85 -8.34000000e-01 15.9994 0 - 1710 WATR 285 HOH HT 84 4.17000000e-01 1.008 0 - 1711 WATR 285 HOH HT 84 4.17000000e-01 1.008 0 - 1712 WATR 286 HOH OT 85 -8.34000000e-01 15.9994 0 - 1713 WATR 286 HOH HT 84 4.17000000e-01 1.008 0 - 1714 WATR 286 HOH HT 84 4.17000000e-01 1.008 0 - 1715 WATR 287 HOH OT 85 -8.34000000e-01 15.9994 0 - 1716 WATR 287 HOH HT 84 4.17000000e-01 1.008 0 - 1717 WATR 287 HOH HT 84 4.17000000e-01 1.008 0 - 1718 WATR 288 HOH OT 85 -8.34000000e-01 15.9994 0 - 1719 WATR 288 HOH HT 84 4.17000000e-01 1.008 0 - 1720 WATR 288 HOH HT 84 4.17000000e-01 1.008 0 - 1721 WATR 289 HOH OT 85 -8.34000000e-01 15.9994 0 - 1722 WATR 289 HOH HT 84 4.17000000e-01 1.008 0 - 1723 WATR 289 HOH HT 84 4.17000000e-01 1.008 0 - 1724 WATR 290 HOH OT 85 -8.34000000e-01 15.9994 0 - 1725 WATR 290 HOH HT 84 4.17000000e-01 1.008 0 - 1726 WATR 290 HOH HT 84 4.17000000e-01 1.008 0 - 1727 WATR 291 HOH OT 85 -8.34000000e-01 15.9994 0 - 1728 WATR 291 HOH HT 84 4.17000000e-01 1.008 0 - 1729 WATR 291 HOH HT 84 4.17000000e-01 1.008 0 - 1730 WATR 292 HOH OT 85 -8.34000000e-01 15.9994 0 - 1731 WATR 292 HOH HT 84 4.17000000e-01 1.008 0 - 1732 WATR 292 HOH HT 84 4.17000000e-01 1.008 0 - 1733 WATR 293 HOH OT 85 -8.34000000e-01 15.9994 0 - 1734 WATR 293 HOH HT 84 4.17000000e-01 1.008 0 - 1735 WATR 293 HOH HT 84 4.17000000e-01 1.008 0 - 1736 WATR 294 HOH OT 85 -8.34000000e-01 15.9994 0 - 1737 WATR 294 HOH HT 84 4.17000000e-01 1.008 0 - 1738 WATR 294 HOH HT 84 4.17000000e-01 1.008 0 - 1739 WATR 295 HOH OT 85 -8.34000000e-01 15.9994 0 - 1740 WATR 295 HOH HT 84 4.17000000e-01 1.008 0 - 1741 WATR 295 HOH HT 84 4.17000000e-01 1.008 0 - 1742 WATR 296 HOH OT 85 -8.34000000e-01 15.9994 0 - 1743 WATR 296 HOH HT 84 4.17000000e-01 1.008 0 - 1744 WATR 296 HOH HT 84 4.17000000e-01 1.008 0 - 1745 WATR 297 HOH OT 85 -8.34000000e-01 15.9994 0 - 1746 WATR 297 HOH HT 84 4.17000000e-01 1.008 0 - 1747 WATR 297 HOH HT 84 4.17000000e-01 1.008 0 - 1748 WATR 298 HOH OT 85 -8.34000000e-01 15.9994 0 - 1749 WATR 298 HOH HT 84 4.17000000e-01 1.008 0 - 1750 WATR 298 HOH HT 84 4.17000000e-01 1.008 0 - 1751 WATR 299 HOH OT 85 -8.34000000e-01 15.9994 0 - 1752 WATR 299 HOH HT 84 4.17000000e-01 1.008 0 - 1753 WATR 299 HOH HT 84 4.17000000e-01 1.008 0 - 1754 WATR 300 HOH OT 85 -8.34000000e-01 15.9994 0 - 1755 WATR 300 HOH HT 84 4.17000000e-01 1.008 0 - 1756 WATR 300 HOH HT 84 4.17000000e-01 1.008 0 - 1757 WATR 301 HOH OT 85 -8.34000000e-01 15.9994 0 - 1758 WATR 301 HOH HT 84 4.17000000e-01 1.008 0 - 1759 WATR 301 HOH HT 84 4.17000000e-01 1.008 0 - 1760 WATR 302 HOH OT 85 -8.34000000e-01 15.9994 0 - 1761 WATR 302 HOH HT 84 4.17000000e-01 1.008 0 - 1762 WATR 302 HOH HT 84 4.17000000e-01 1.008 0 - 1763 WATR 303 HOH OT 85 -8.34000000e-01 15.9994 0 - 1764 WATR 303 HOH HT 84 4.17000000e-01 1.008 0 - 1765 WATR 303 HOH HT 84 4.17000000e-01 1.008 0 - 1766 WATR 304 HOH OT 85 -8.34000000e-01 15.9994 0 - 1767 WATR 304 HOH HT 84 4.17000000e-01 1.008 0 - 1768 WATR 304 HOH HT 84 4.17000000e-01 1.008 0 - 1769 WATR 305 HOH OT 85 -8.34000000e-01 15.9994 0 - 1770 WATR 305 HOH HT 84 4.17000000e-01 1.008 0 - 1771 WATR 305 HOH HT 84 4.17000000e-01 1.008 0 - 1772 WATR 306 HOH OT 85 -8.34000000e-01 15.9994 0 - 1773 WATR 306 HOH HT 84 4.17000000e-01 1.008 0 - 1774 WATR 306 HOH HT 84 4.17000000e-01 1.008 0 - 1775 WATR 307 HOH OT 85 -8.34000000e-01 15.9994 0 - 1776 WATR 307 HOH HT 84 4.17000000e-01 1.008 0 - 1777 WATR 307 HOH HT 84 4.17000000e-01 1.008 0 - 1778 WATR 308 HOH OT 85 -8.34000000e-01 15.9994 0 - 1779 WATR 308 HOH HT 84 4.17000000e-01 1.008 0 - 1780 WATR 308 HOH HT 84 4.17000000e-01 1.008 0 - 1781 WATR 309 HOH OT 85 -8.34000000e-01 15.9994 0 - 1782 WATR 309 HOH HT 84 4.17000000e-01 1.008 0 - 1783 WATR 309 HOH HT 84 4.17000000e-01 1.008 0 - 1784 WATR 310 HOH OT 85 -8.34000000e-01 15.9994 0 - 1785 WATR 310 HOH HT 84 4.17000000e-01 1.008 0 - 1786 WATR 310 HOH HT 84 4.17000000e-01 1.008 0 - 1787 WATR 311 HOH OT 85 -8.34000000e-01 15.9994 0 - 1788 WATR 311 HOH HT 84 4.17000000e-01 1.008 0 - 1789 WATR 311 HOH HT 84 4.17000000e-01 1.008 0 - 1790 WATR 312 HOH OT 85 -8.34000000e-01 15.9994 0 - 1791 WATR 312 HOH HT 84 4.17000000e-01 1.008 0 - 1792 WATR 312 HOH HT 84 4.17000000e-01 1.008 0 - 1793 WATR 313 HOH OT 85 -8.34000000e-01 15.9994 0 - 1794 WATR 313 HOH HT 84 4.17000000e-01 1.008 0 - 1795 WATR 313 HOH HT 84 4.17000000e-01 1.008 0 - 1796 WATR 314 HOH OT 85 -8.34000000e-01 15.9994 0 - 1797 WATR 314 HOH HT 84 4.17000000e-01 1.008 0 - 1798 WATR 314 HOH HT 84 4.17000000e-01 1.008 0 - 1799 WATR 315 HOH OT 85 -8.34000000e-01 15.9994 0 - 1800 WATR 315 HOH HT 84 4.17000000e-01 1.008 0 - 1801 WATR 315 HOH HT 84 4.17000000e-01 1.008 0 - 1802 WATR 316 HOH OT 85 -8.34000000e-01 15.9994 0 - 1803 WATR 316 HOH HT 84 4.17000000e-01 1.008 0 - 1804 WATR 316 HOH HT 84 4.17000000e-01 1.008 0 - 1805 WATR 317 HOH OT 85 -8.34000000e-01 15.9994 0 - 1806 WATR 317 HOH HT 84 4.17000000e-01 1.008 0 - 1807 WATR 317 HOH HT 84 4.17000000e-01 1.008 0 - 1808 WATR 318 HOH OT 85 -8.34000000e-01 15.9994 0 - 1809 WATR 318 HOH HT 84 4.17000000e-01 1.008 0 - 1810 WATR 318 HOH HT 84 4.17000000e-01 1.008 0 - 1811 WATR 319 HOH OT 85 -8.34000000e-01 15.9994 0 - 1812 WATR 319 HOH HT 84 4.17000000e-01 1.008 0 - 1813 WATR 319 HOH HT 84 4.17000000e-01 1.008 0 - 1814 WATR 320 HOH OT 85 -8.34000000e-01 15.9994 0 - 1815 WATR 320 HOH HT 84 4.17000000e-01 1.008 0 - 1816 WATR 320 HOH HT 84 4.17000000e-01 1.008 0 - 1817 WATR 321 HOH OT 85 -8.34000000e-01 15.9994 0 - 1818 WATR 321 HOH HT 84 4.17000000e-01 1.008 0 - 1819 WATR 321 HOH HT 84 4.17000000e-01 1.008 0 - 1820 WATR 322 HOH OT 85 -8.34000000e-01 15.9994 0 - 1821 WATR 322 HOH HT 84 4.17000000e-01 1.008 0 - 1822 WATR 322 HOH HT 84 4.17000000e-01 1.008 0 - 1823 WATR 323 HOH OT 85 -8.34000000e-01 15.9994 0 - 1824 WATR 323 HOH HT 84 4.17000000e-01 1.008 0 - 1825 WATR 323 HOH HT 84 4.17000000e-01 1.008 0 - 1826 WATR 324 HOH OT 85 -8.34000000e-01 15.9994 0 - 1827 WATR 324 HOH HT 84 4.17000000e-01 1.008 0 - 1828 WATR 324 HOH HT 84 4.17000000e-01 1.008 0 - 1829 WATR 325 HOH OT 85 -8.34000000e-01 15.9994 0 - 1830 WATR 325 HOH HT 84 4.17000000e-01 1.008 0 - 1831 WATR 325 HOH HT 84 4.17000000e-01 1.008 0 - 1832 WATR 326 HOH OT 85 -8.34000000e-01 15.9994 0 - 1833 WATR 326 HOH HT 84 4.17000000e-01 1.008 0 - 1834 WATR 326 HOH HT 84 4.17000000e-01 1.008 0 - 1835 WATR 327 HOH OT 85 -8.34000000e-01 15.9994 0 - 1836 WATR 327 HOH HT 84 4.17000000e-01 1.008 0 - 1837 WATR 327 HOH HT 84 4.17000000e-01 1.008 0 - 1838 WATR 328 HOH OT 85 -8.34000000e-01 15.9994 0 - 1839 WATR 328 HOH HT 84 4.17000000e-01 1.008 0 - 1840 WATR 328 HOH HT 84 4.17000000e-01 1.008 0 - 1841 WATR 329 HOH OT 85 -8.34000000e-01 15.9994 0 - 1842 WATR 329 HOH HT 84 4.17000000e-01 1.008 0 - 1843 WATR 329 HOH HT 84 4.17000000e-01 1.008 0 - 1844 WATR 330 HOH OT 85 -8.34000000e-01 15.9994 0 - 1845 WATR 330 HOH HT 84 4.17000000e-01 1.008 0 - 1846 WATR 330 HOH HT 84 4.17000000e-01 1.008 0 - 1847 WATR 331 HOH OT 85 -8.34000000e-01 15.9994 0 - 1848 WATR 331 HOH HT 84 4.17000000e-01 1.008 0 - 1849 WATR 331 HOH HT 84 4.17000000e-01 1.008 0 - 1850 WATR 332 HOH OT 85 -8.34000000e-01 15.9994 0 - 1851 WATR 332 HOH HT 84 4.17000000e-01 1.008 0 - 1852 WATR 332 HOH HT 84 4.17000000e-01 1.008 0 - 1853 WATR 333 HOH OT 85 -8.34000000e-01 15.9994 0 - 1854 WATR 333 HOH HT 84 4.17000000e-01 1.008 0 - 1855 WATR 333 HOH HT 84 4.17000000e-01 1.008 0 - 1856 WATR 334 HOH OT 85 -8.34000000e-01 15.9994 0 - 1857 WATR 334 HOH HT 84 4.17000000e-01 1.008 0 - 1858 WATR 334 HOH HT 84 4.17000000e-01 1.008 0 - 1859 WATR 335 HOH OT 85 -8.34000000e-01 15.9994 0 - 1860 WATR 335 HOH HT 84 4.17000000e-01 1.008 0 - 1861 WATR 335 HOH HT 84 4.17000000e-01 1.008 0 - 1862 WATR 336 HOH OT 85 -8.34000000e-01 15.9994 0 - 1863 WATR 336 HOH HT 84 4.17000000e-01 1.008 0 - 1864 WATR 336 HOH HT 84 4.17000000e-01 1.008 0 - 1865 WATR 337 HOH OT 85 -8.34000000e-01 15.9994 0 - 1866 WATR 337 HOH HT 84 4.17000000e-01 1.008 0 - 1867 WATR 337 HOH HT 84 4.17000000e-01 1.008 0 - 1868 WATR 338 HOH OT 85 -8.34000000e-01 15.9994 0 - 1869 WATR 338 HOH HT 84 4.17000000e-01 1.008 0 - 1870 WATR 338 HOH HT 84 4.17000000e-01 1.008 0 - 1871 WATR 339 HOH OT 85 -8.34000000e-01 15.9994 0 - 1872 WATR 339 HOH HT 84 4.17000000e-01 1.008 0 - 1873 WATR 339 HOH HT 84 4.17000000e-01 1.008 0 - 1874 WATR 340 HOH OT 85 -8.34000000e-01 15.9994 0 - 1875 WATR 340 HOH HT 84 4.17000000e-01 1.008 0 - 1876 WATR 340 HOH HT 84 4.17000000e-01 1.008 0 - 1877 WATR 341 HOH OT 85 -8.34000000e-01 15.9994 0 - 1878 WATR 341 HOH HT 84 4.17000000e-01 1.008 0 - 1879 WATR 341 HOH HT 84 4.17000000e-01 1.008 0 - 1880 WATR 342 HOH OT 85 -8.34000000e-01 15.9994 0 - 1881 WATR 342 HOH HT 84 4.17000000e-01 1.008 0 - 1882 WATR 342 HOH HT 84 4.17000000e-01 1.008 0 - 1883 WATR 343 HOH OT 85 -8.34000000e-01 15.9994 0 - 1884 WATR 343 HOH HT 84 4.17000000e-01 1.008 0 - 1885 WATR 343 HOH HT 84 4.17000000e-01 1.008 0 - 1886 WATR 344 HOH OT 85 -8.34000000e-01 15.9994 0 - 1887 WATR 344 HOH HT 84 4.17000000e-01 1.008 0 - 1888 WATR 344 HOH HT 84 4.17000000e-01 1.008 0 - 1889 WATR 345 HOH OT 85 -8.34000000e-01 15.9994 0 - 1890 WATR 345 HOH HT 84 4.17000000e-01 1.008 0 - 1891 WATR 345 HOH HT 84 4.17000000e-01 1.008 0 - 1892 WATR 346 HOH OT 85 -8.34000000e-01 15.9994 0 - 1893 WATR 346 HOH HT 84 4.17000000e-01 1.008 0 - 1894 WATR 346 HOH HT 84 4.17000000e-01 1.008 0 - 1895 WATR 347 HOH OT 85 -8.34000000e-01 15.9994 0 - 1896 WATR 347 HOH HT 84 4.17000000e-01 1.008 0 - 1897 WATR 347 HOH HT 84 4.17000000e-01 1.008 0 - 1898 WATR 348 HOH OT 85 -8.34000000e-01 15.9994 0 - 1899 WATR 348 HOH HT 84 4.17000000e-01 1.008 0 - 1900 WATR 348 HOH HT 84 4.17000000e-01 1.008 0 - 1901 WATR 349 HOH OT 85 -8.34000000e-01 15.9994 0 - 1902 WATR 349 HOH HT 84 4.17000000e-01 1.008 0 - 1903 WATR 349 HOH HT 84 4.17000000e-01 1.008 0 - 1904 WATR 350 HOH OT 85 -8.34000000e-01 15.9994 0 - 1905 WATR 350 HOH HT 84 4.17000000e-01 1.008 0 - 1906 WATR 350 HOH HT 84 4.17000000e-01 1.008 0 - 1907 WATR 351 HOH OT 85 -8.34000000e-01 15.9994 0 - 1908 WATR 351 HOH HT 84 4.17000000e-01 1.008 0 - 1909 WATR 351 HOH HT 84 4.17000000e-01 1.008 0 - 1910 WATR 352 HOH OT 85 -8.34000000e-01 15.9994 0 - 1911 WATR 352 HOH HT 84 4.17000000e-01 1.008 0 - 1912 WATR 352 HOH HT 84 4.17000000e-01 1.008 0 - 1913 WATR 353 HOH OT 85 -8.34000000e-01 15.9994 0 - 1914 WATR 353 HOH HT 84 4.17000000e-01 1.008 0 - 1915 WATR 353 HOH HT 84 4.17000000e-01 1.008 0 - 1916 WATR 354 HOH OT 85 -8.34000000e-01 15.9994 0 - 1917 WATR 354 HOH HT 84 4.17000000e-01 1.008 0 - 1918 WATR 354 HOH HT 84 4.17000000e-01 1.008 0 - 1919 WATR 355 HOH OT 85 -8.34000000e-01 15.9994 0 - 1920 WATR 355 HOH HT 84 4.17000000e-01 1.008 0 - 1921 WATR 355 HOH HT 84 4.17000000e-01 1.008 0 - 1922 WATR 356 HOH OT 85 -8.34000000e-01 15.9994 0 - 1923 WATR 356 HOH HT 84 4.17000000e-01 1.008 0 - 1924 WATR 356 HOH HT 84 4.17000000e-01 1.008 0 - 1925 WATR 357 HOH OT 85 -8.34000000e-01 15.9994 0 - 1926 WATR 357 HOH HT 84 4.17000000e-01 1.008 0 - 1927 WATR 357 HOH HT 84 4.17000000e-01 1.008 0 - 1928 WATR 358 HOH OT 85 -8.34000000e-01 15.9994 0 - 1929 WATR 358 HOH HT 84 4.17000000e-01 1.008 0 - 1930 WATR 358 HOH HT 84 4.17000000e-01 1.008 0 - 1931 WATR 359 HOH OT 85 -8.34000000e-01 15.9994 0 - 1932 WATR 359 HOH HT 84 4.17000000e-01 1.008 0 - 1933 WATR 359 HOH HT 84 4.17000000e-01 1.008 0 - 1934 WATR 360 HOH OT 85 -8.34000000e-01 15.9994 0 - 1935 WATR 360 HOH HT 84 4.17000000e-01 1.008 0 - 1936 WATR 360 HOH HT 84 4.17000000e-01 1.008 0 - 1937 WATR 361 HOH OT 85 -8.34000000e-01 15.9994 0 - 1938 WATR 361 HOH HT 84 4.17000000e-01 1.008 0 - 1939 WATR 361 HOH HT 84 4.17000000e-01 1.008 0 - 1940 WATR 362 HOH OT 85 -8.34000000e-01 15.9994 0 - 1941 WATR 362 HOH HT 84 4.17000000e-01 1.008 0 - 1942 WATR 362 HOH HT 84 4.17000000e-01 1.008 0 - 1943 WATR 363 HOH OT 85 -8.34000000e-01 15.9994 0 - 1944 WATR 363 HOH HT 84 4.17000000e-01 1.008 0 - 1945 WATR 363 HOH HT 84 4.17000000e-01 1.008 0 - 1946 WATR 364 HOH OT 85 -8.34000000e-01 15.9994 0 - 1947 WATR 364 HOH HT 84 4.17000000e-01 1.008 0 - 1948 WATR 364 HOH HT 84 4.17000000e-01 1.008 0 - 1949 WATR 365 HOH OT 85 -8.34000000e-01 15.9994 0 - 1950 WATR 365 HOH HT 84 4.17000000e-01 1.008 0 - 1951 WATR 365 HOH HT 84 4.17000000e-01 1.008 0 - 1952 WATR 366 HOH OT 85 -8.34000000e-01 15.9994 0 - 1953 WATR 366 HOH HT 84 4.17000000e-01 1.008 0 - 1954 WATR 366 HOH HT 84 4.17000000e-01 1.008 0 - 1955 WATR 367 HOH OT 85 -8.34000000e-01 15.9994 0 - 1956 WATR 367 HOH HT 84 4.17000000e-01 1.008 0 - 1957 WATR 367 HOH HT 84 4.17000000e-01 1.008 0 - 1958 WATR 368 HOH OT 85 -8.34000000e-01 15.9994 0 - 1959 WATR 368 HOH HT 84 4.17000000e-01 1.008 0 - 1960 WATR 368 HOH HT 84 4.17000000e-01 1.008 0 - 1961 WATR 369 HOH OT 85 -8.34000000e-01 15.9994 0 - 1962 WATR 369 HOH HT 84 4.17000000e-01 1.008 0 - 1963 WATR 369 HOH HT 84 4.17000000e-01 1.008 0 - 1964 WATR 370 HOH OT 85 -8.34000000e-01 15.9994 0 - 1965 WATR 370 HOH HT 84 4.17000000e-01 1.008 0 - 1966 WATR 370 HOH HT 84 4.17000000e-01 1.008 0 - 1967 WATR 371 HOH OT 85 -8.34000000e-01 15.9994 0 - 1968 WATR 371 HOH HT 84 4.17000000e-01 1.008 0 - 1969 WATR 371 HOH HT 84 4.17000000e-01 1.008 0 - 1970 WATR 372 HOH OT 85 -8.34000000e-01 15.9994 0 - 1971 WATR 372 HOH HT 84 4.17000000e-01 1.008 0 - 1972 WATR 372 HOH HT 84 4.17000000e-01 1.008 0 - 1973 WATR 373 HOH OT 85 -8.34000000e-01 15.9994 0 - 1974 WATR 373 HOH HT 84 4.17000000e-01 1.008 0 - 1975 WATR 373 HOH HT 84 4.17000000e-01 1.008 0 - 1976 WATR 374 HOH OT 85 -8.34000000e-01 15.9994 0 - 1977 WATR 374 HOH HT 84 4.17000000e-01 1.008 0 - 1978 WATR 374 HOH HT 84 4.17000000e-01 1.008 0 - 1979 WATR 375 HOH OT 85 -8.34000000e-01 15.9994 0 - 1980 WATR 375 HOH HT 84 4.17000000e-01 1.008 0 - 1981 WATR 375 HOH HT 84 4.17000000e-01 1.008 0 - 1982 WATR 376 HOH OT 85 -8.34000000e-01 15.9994 0 - 1983 WATR 376 HOH HT 84 4.17000000e-01 1.008 0 - 1984 WATR 376 HOH HT 84 4.17000000e-01 1.008 0 - 1985 WATR 377 HOH OT 85 -8.34000000e-01 15.9994 0 - 1986 WATR 377 HOH HT 84 4.17000000e-01 1.008 0 - 1987 WATR 377 HOH HT 84 4.17000000e-01 1.008 0 - 1988 WATR 378 HOH OT 85 -8.34000000e-01 15.9994 0 - 1989 WATR 378 HOH HT 84 4.17000000e-01 1.008 0 - 1990 WATR 378 HOH HT 84 4.17000000e-01 1.008 0 - 1991 WATR 379 HOH OT 85 -8.34000000e-01 15.9994 0 - 1992 WATR 379 HOH HT 84 4.17000000e-01 1.008 0 - 1993 WATR 379 HOH HT 84 4.17000000e-01 1.008 0 - 1994 WATR 380 HOH OT 85 -8.34000000e-01 15.9994 0 - 1995 WATR 380 HOH HT 84 4.17000000e-01 1.008 0 - 1996 WATR 380 HOH HT 84 4.17000000e-01 1.008 0 - 1997 WATR 381 HOH OT 85 -8.34000000e-01 15.9994 0 - 1998 WATR 381 HOH HT 84 4.17000000e-01 1.008 0 - 1999 WATR 381 HOH HT 84 4.17000000e-01 1.008 0 - 2000 WATR 382 HOH OT 85 -8.34000000e-01 15.9994 0 - 2001 WATR 382 HOH HT 84 4.17000000e-01 1.008 0 - 2002 WATR 382 HOH HT 84 4.17000000e-01 1.008 0 - 2003 WATR 383 HOH OT 85 -8.34000000e-01 15.9994 0 - 2004 WATR 383 HOH HT 84 4.17000000e-01 1.008 0 - 2005 WATR 383 HOH HT 84 4.17000000e-01 1.008 0 - 2006 SALT 2 ION SOD 87 1.00000000e+00 22.9897 0 - 2007 WATR 384 HOH OT 85 -8.34000000e-01 15.9994 0 - 2008 WATR 384 HOH HT 84 4.17000000e-01 1.008 0 - 2009 WATR 384 HOH HT 84 4.17000000e-01 1.008 0 - 2010 WATR 385 HOH OT 85 -8.34000000e-01 15.9994 0 - 2011 WATR 385 HOH HT 84 4.17000000e-01 1.008 0 - 2012 WATR 385 HOH HT 84 4.17000000e-01 1.008 0 - 2013 WATR 386 HOH OT 85 -8.34000000e-01 15.9994 0 - 2014 WATR 386 HOH HT 84 4.17000000e-01 1.008 0 - 2015 WATR 386 HOH HT 84 4.17000000e-01 1.008 0 - 2016 WATR 387 HOH OT 85 -8.34000000e-01 15.9994 0 - 2017 WATR 387 HOH HT 84 4.17000000e-01 1.008 0 - 2018 WATR 387 HOH HT 84 4.17000000e-01 1.008 0 - 2019 WATR 388 HOH OT 85 -8.34000000e-01 15.9994 0 - 2020 WATR 388 HOH HT 84 4.17000000e-01 1.008 0 - 2021 WATR 388 HOH HT 84 4.17000000e-01 1.008 0 - 2022 WATR 389 HOH OT 85 -8.34000000e-01 15.9994 0 - 2023 WATR 389 HOH HT 84 4.17000000e-01 1.008 0 - 2024 WATR 389 HOH HT 84 4.17000000e-01 1.008 0 - 2025 WATR 390 HOH OT 85 -8.34000000e-01 15.9994 0 - 2026 WATR 390 HOH HT 84 4.17000000e-01 1.008 0 - 2027 WATR 390 HOH HT 84 4.17000000e-01 1.008 0 - 2028 WATR 391 HOH OT 85 -8.34000000e-01 15.9994 0 - 2029 WATR 391 HOH HT 84 4.17000000e-01 1.008 0 - 2030 WATR 391 HOH HT 84 4.17000000e-01 1.008 0 - 2031 WATR 392 HOH OT 85 -8.34000000e-01 15.9994 0 - 2032 WATR 392 HOH HT 84 4.17000000e-01 1.008 0 - 2033 WATR 392 HOH HT 84 4.17000000e-01 1.008 0 - 2034 WATR 393 HOH OT 85 -8.34000000e-01 15.9994 0 - 2035 WATR 393 HOH HT 84 4.17000000e-01 1.008 0 - 2036 WATR 393 HOH HT 84 4.17000000e-01 1.008 0 - 2037 WATR 394 HOH OT 85 -8.34000000e-01 15.9994 0 - 2038 WATR 394 HOH HT 84 4.17000000e-01 1.008 0 - 2039 WATR 394 HOH HT 84 4.17000000e-01 1.008 0 - 2040 WATR 395 HOH OT 85 -8.34000000e-01 15.9994 0 - 2041 WATR 395 HOH HT 84 4.17000000e-01 1.008 0 - 2042 WATR 395 HOH HT 84 4.17000000e-01 1.008 0 - 2043 WATR 396 HOH OT 85 -8.34000000e-01 15.9994 0 - 2044 WATR 396 HOH HT 84 4.17000000e-01 1.008 0 - 2045 WATR 396 HOH HT 84 4.17000000e-01 1.008 0 - 2046 WATR 397 HOH OT 85 -8.34000000e-01 15.9994 0 - 2047 WATR 397 HOH HT 84 4.17000000e-01 1.008 0 - 2048 WATR 397 HOH HT 84 4.17000000e-01 1.008 0 - 2049 WATR 398 HOH OT 85 -8.34000000e-01 15.9994 0 - 2050 WATR 398 HOH HT 84 4.17000000e-01 1.008 0 - 2051 WATR 398 HOH HT 84 4.17000000e-01 1.008 0 - 2052 WATR 399 HOH OT 85 -8.34000000e-01 15.9994 0 - 2053 WATR 399 HOH HT 84 4.17000000e-01 1.008 0 - 2054 WATR 399 HOH HT 84 4.17000000e-01 1.008 0 - 2055 WATR 400 HOH OT 85 -8.34000000e-01 15.9994 0 - 2056 WATR 400 HOH HT 84 4.17000000e-01 1.008 0 - 2057 WATR 400 HOH HT 84 4.17000000e-01 1.008 0 - 2058 WATR 401 HOH OT 85 -8.34000000e-01 15.9994 0 - 2059 WATR 401 HOH HT 84 4.17000000e-01 1.008 0 - 2060 WATR 401 HOH HT 84 4.17000000e-01 1.008 0 - 2061 WATR 402 HOH OT 85 -8.34000000e-01 15.9994 0 - 2062 WATR 402 HOH HT 84 4.17000000e-01 1.008 0 - 2063 WATR 402 HOH HT 84 4.17000000e-01 1.008 0 - 2064 WATR 403 HOH OT 85 -8.34000000e-01 15.9994 0 - 2065 WATR 403 HOH HT 84 4.17000000e-01 1.008 0 - 2066 WATR 403 HOH HT 84 4.17000000e-01 1.008 0 - 2067 WATR 404 HOH OT 85 -8.34000000e-01 15.9994 0 - 2068 WATR 404 HOH HT 84 4.17000000e-01 1.008 0 - 2069 WATR 404 HOH HT 84 4.17000000e-01 1.008 0 - 2070 WATR 405 HOH OT 85 -8.34000000e-01 15.9994 0 - 2071 WATR 405 HOH HT 84 4.17000000e-01 1.008 0 - 2072 WATR 405 HOH HT 84 4.17000000e-01 1.008 0 - 2073 WATR 406 HOH OT 85 -8.34000000e-01 15.9994 0 - 2074 WATR 406 HOH HT 84 4.17000000e-01 1.008 0 - 2075 WATR 406 HOH HT 84 4.17000000e-01 1.008 0 - 2076 WATR 407 HOH OT 85 -8.34000000e-01 15.9994 0 - 2077 WATR 407 HOH HT 84 4.17000000e-01 1.008 0 - 2078 WATR 407 HOH HT 84 4.17000000e-01 1.008 0 - 2079 WATR 408 HOH OT 85 -8.34000000e-01 15.9994 0 - 2080 WATR 408 HOH HT 84 4.17000000e-01 1.008 0 - 2081 WATR 408 HOH HT 84 4.17000000e-01 1.008 0 - 2082 WATR 409 HOH OT 85 -8.34000000e-01 15.9994 0 - 2083 WATR 409 HOH HT 84 4.17000000e-01 1.008 0 - 2084 WATR 409 HOH HT 84 4.17000000e-01 1.008 0 - 2085 WATR 410 HOH OT 85 -8.34000000e-01 15.9994 0 - 2086 WATR 410 HOH HT 84 4.17000000e-01 1.008 0 - 2087 WATR 410 HOH HT 84 4.17000000e-01 1.008 0 - 2088 WATR 411 HOH OT 85 -8.34000000e-01 15.9994 0 - 2089 WATR 411 HOH HT 84 4.17000000e-01 1.008 0 - 2090 WATR 411 HOH HT 84 4.17000000e-01 1.008 0 - 2091 WATR 412 HOH OT 85 -8.34000000e-01 15.9994 0 - 2092 WATR 412 HOH HT 84 4.17000000e-01 1.008 0 - 2093 WATR 412 HOH HT 84 4.17000000e-01 1.008 0 - 2094 WATR 413 HOH OT 85 -8.34000000e-01 15.9994 0 - 2095 WATR 413 HOH HT 84 4.17000000e-01 1.008 0 - 2096 WATR 413 HOH HT 84 4.17000000e-01 1.008 0 - 2097 WATR 414 HOH OT 85 -8.34000000e-01 15.9994 0 - 2098 WATR 414 HOH HT 84 4.17000000e-01 1.008 0 - 2099 WATR 414 HOH HT 84 4.17000000e-01 1.008 0 - 2100 WATR 415 HOH OT 85 -8.34000000e-01 15.9994 0 - 2101 WATR 415 HOH HT 84 4.17000000e-01 1.008 0 - 2102 WATR 415 HOH HT 84 4.17000000e-01 1.008 0 - 2103 WATR 416 HOH OT 85 -8.34000000e-01 15.9994 0 - 2104 WATR 416 HOH HT 84 4.17000000e-01 1.008 0 - 2105 WATR 416 HOH HT 84 4.17000000e-01 1.008 0 - 2106 WATR 417 HOH OT 85 -8.34000000e-01 15.9994 0 - 2107 WATR 417 HOH HT 84 4.17000000e-01 1.008 0 - 2108 WATR 417 HOH HT 84 4.17000000e-01 1.008 0 - 2109 WATR 418 HOH OT 85 -8.34000000e-01 15.9994 0 - 2110 WATR 418 HOH HT 84 4.17000000e-01 1.008 0 - 2111 WATR 418 HOH HT 84 4.17000000e-01 1.008 0 - 2112 WATR 419 HOH OT 85 -8.34000000e-01 15.9994 0 - 2113 WATR 419 HOH HT 84 4.17000000e-01 1.008 0 - 2114 WATR 419 HOH HT 84 4.17000000e-01 1.008 0 - 2115 WATR 420 HOH OT 85 -8.34000000e-01 15.9994 0 - 2116 WATR 420 HOH HT 84 4.17000000e-01 1.008 0 - 2117 WATR 420 HOH HT 84 4.17000000e-01 1.008 0 - 2118 WATR 421 HOH OT 85 -8.34000000e-01 15.9994 0 - 2119 WATR 421 HOH HT 84 4.17000000e-01 1.008 0 - 2120 WATR 421 HOH HT 84 4.17000000e-01 1.008 0 - 2121 WATR 422 HOH OT 85 -8.34000000e-01 15.9994 0 - 2122 WATR 422 HOH HT 84 4.17000000e-01 1.008 0 - 2123 WATR 422 HOH HT 84 4.17000000e-01 1.008 0 - 2124 WATR 423 HOH OT 85 -8.34000000e-01 15.9994 0 - 2125 WATR 423 HOH HT 84 4.17000000e-01 1.008 0 - 2126 WATR 423 HOH HT 84 4.17000000e-01 1.008 0 - 2127 WATR 424 HOH OT 85 -8.34000000e-01 15.9994 0 - 2128 WATR 424 HOH HT 84 4.17000000e-01 1.008 0 - 2129 WATR 424 HOH HT 84 4.17000000e-01 1.008 0 - 2130 WATR 425 HOH OT 85 -8.34000000e-01 15.9994 0 - 2131 WATR 425 HOH HT 84 4.17000000e-01 1.008 0 - 2132 WATR 425 HOH HT 84 4.17000000e-01 1.008 0 - 2133 WATR 426 HOH OT 85 -8.34000000e-01 15.9994 0 - 2134 WATR 426 HOH HT 84 4.17000000e-01 1.008 0 - 2135 WATR 426 HOH HT 84 4.17000000e-01 1.008 0 - 2136 WATR 427 HOH OT 85 -8.34000000e-01 15.9994 0 - 2137 WATR 427 HOH HT 84 4.17000000e-01 1.008 0 - 2138 WATR 427 HOH HT 84 4.17000000e-01 1.008 0 - 2139 WATR 428 HOH OT 85 -8.34000000e-01 15.9994 0 - 2140 WATR 428 HOH HT 84 4.17000000e-01 1.008 0 - 2141 WATR 428 HOH HT 84 4.17000000e-01 1.008 0 - 2142 WATR 429 HOH OT 85 -8.34000000e-01 15.9994 0 - 2143 WATR 429 HOH HT 84 4.17000000e-01 1.008 0 - 2144 WATR 429 HOH HT 84 4.17000000e-01 1.008 0 - 2145 WATR 430 HOH OT 85 -8.34000000e-01 15.9994 0 - 2146 WATR 430 HOH HT 84 4.17000000e-01 1.008 0 - 2147 WATR 430 HOH HT 84 4.17000000e-01 1.008 0 - 2148 WATR 431 HOH OT 85 -8.34000000e-01 15.9994 0 - 2149 WATR 431 HOH HT 84 4.17000000e-01 1.008 0 - 2150 WATR 431 HOH HT 84 4.17000000e-01 1.008 0 - 2151 WATR 432 HOH OT 85 -8.34000000e-01 15.9994 0 - 2152 WATR 432 HOH HT 84 4.17000000e-01 1.008 0 - 2153 WATR 432 HOH HT 84 4.17000000e-01 1.008 0 - 2154 WATR 433 HOH OT 85 -8.34000000e-01 15.9994 0 - 2155 WATR 433 HOH HT 84 4.17000000e-01 1.008 0 - 2156 WATR 433 HOH HT 84 4.17000000e-01 1.008 0 - 2157 WATR 434 HOH OT 85 -8.34000000e-01 15.9994 0 - 2158 WATR 434 HOH HT 84 4.17000000e-01 1.008 0 - 2159 WATR 434 HOH HT 84 4.17000000e-01 1.008 0 - 2160 WATR 435 HOH OT 85 -8.34000000e-01 15.9994 0 - 2161 WATR 435 HOH HT 84 4.17000000e-01 1.008 0 - 2162 WATR 435 HOH HT 84 4.17000000e-01 1.008 0 - 2163 WATR 436 HOH OT 85 -8.34000000e-01 15.9994 0 - 2164 WATR 436 HOH HT 84 4.17000000e-01 1.008 0 - 2165 WATR 436 HOH HT 84 4.17000000e-01 1.008 0 - 2166 WATR 437 HOH OT 85 -8.34000000e-01 15.9994 0 - 2167 WATR 437 HOH HT 84 4.17000000e-01 1.008 0 - 2168 WATR 437 HOH HT 84 4.17000000e-01 1.008 0 - 2169 WATR 438 HOH OT 85 -8.34000000e-01 15.9994 0 - 2170 WATR 438 HOH HT 84 4.17000000e-01 1.008 0 - 2171 WATR 438 HOH HT 84 4.17000000e-01 1.008 0 - 2172 WATR 439 HOH OT 85 -8.34000000e-01 15.9994 0 - 2173 WATR 439 HOH HT 84 4.17000000e-01 1.008 0 - 2174 WATR 439 HOH HT 84 4.17000000e-01 1.008 0 - 2175 WATR 440 HOH OT 85 -8.34000000e-01 15.9994 0 - 2176 WATR 440 HOH HT 84 4.17000000e-01 1.008 0 - 2177 WATR 440 HOH HT 84 4.17000000e-01 1.008 0 - 2178 WATR 441 HOH OT 85 -8.34000000e-01 15.9994 0 - 2179 WATR 441 HOH HT 84 4.17000000e-01 1.008 0 - 2180 WATR 441 HOH HT 84 4.17000000e-01 1.008 0 - 2181 WATR 442 HOH OT 85 -8.34000000e-01 15.9994 0 - 2182 WATR 442 HOH HT 84 4.17000000e-01 1.008 0 - 2183 WATR 442 HOH HT 84 4.17000000e-01 1.008 0 - 2184 WATR 443 HOH OT 85 -8.34000000e-01 15.9994 0 - 2185 WATR 443 HOH HT 84 4.17000000e-01 1.008 0 - 2186 WATR 443 HOH HT 84 4.17000000e-01 1.008 0 - 2187 WATR 444 HOH OT 85 -8.34000000e-01 15.9994 0 - 2188 WATR 444 HOH HT 84 4.17000000e-01 1.008 0 - 2189 WATR 444 HOH HT 84 4.17000000e-01 1.008 0 - 2190 WATR 445 HOH OT 85 -8.34000000e-01 15.9994 0 - 2191 WATR 445 HOH HT 84 4.17000000e-01 1.008 0 - 2192 WATR 445 HOH HT 84 4.17000000e-01 1.008 0 - 2193 WATR 446 HOH OT 85 -8.34000000e-01 15.9994 0 - 2194 WATR 446 HOH HT 84 4.17000000e-01 1.008 0 - 2195 WATR 446 HOH HT 84 4.17000000e-01 1.008 0 - 2196 WATR 447 HOH OT 85 -8.34000000e-01 15.9994 0 - 2197 WATR 447 HOH HT 84 4.17000000e-01 1.008 0 - 2198 WATR 447 HOH HT 84 4.17000000e-01 1.008 0 - 2199 WATR 448 HOH OT 85 -8.34000000e-01 15.9994 0 - 2200 WATR 448 HOH HT 84 4.17000000e-01 1.008 0 - 2201 WATR 448 HOH HT 84 4.17000000e-01 1.008 0 - 2202 WATR 449 HOH OT 85 -8.34000000e-01 15.9994 0 - 2203 WATR 449 HOH HT 84 4.17000000e-01 1.008 0 - 2204 WATR 449 HOH HT 84 4.17000000e-01 1.008 0 - 2205 WATR 450 HOH OT 85 -8.34000000e-01 15.9994 0 - 2206 WATR 450 HOH HT 84 4.17000000e-01 1.008 0 - 2207 WATR 450 HOH HT 84 4.17000000e-01 1.008 0 - 2208 WATR 451 HOH OT 85 -8.34000000e-01 15.9994 0 - 2209 WATR 451 HOH HT 84 4.17000000e-01 1.008 0 - 2210 WATR 451 HOH HT 84 4.17000000e-01 1.008 0 - 2211 WATR 452 HOH OT 85 -8.34000000e-01 15.9994 0 - 2212 WATR 452 HOH HT 84 4.17000000e-01 1.008 0 - 2213 WATR 452 HOH HT 84 4.17000000e-01 1.008 0 - 2214 WATR 453 HOH OT 85 -8.34000000e-01 15.9994 0 - 2215 WATR 453 HOH HT 84 4.17000000e-01 1.008 0 - 2216 WATR 453 HOH HT 84 4.17000000e-01 1.008 0 - 2217 WATR 454 HOH OT 85 -8.34000000e-01 15.9994 0 - 2218 WATR 454 HOH HT 84 4.17000000e-01 1.008 0 - 2219 WATR 454 HOH HT 84 4.17000000e-01 1.008 0 - 2220 WATR 455 HOH OT 85 -8.34000000e-01 15.9994 0 - 2221 WATR 455 HOH HT 84 4.17000000e-01 1.008 0 - 2222 WATR 455 HOH HT 84 4.17000000e-01 1.008 0 - 2223 WATR 456 HOH OT 85 -8.34000000e-01 15.9994 0 - 2224 WATR 456 HOH HT 84 4.17000000e-01 1.008 0 - 2225 WATR 456 HOH HT 84 4.17000000e-01 1.008 0 - 2226 WATR 457 HOH OT 85 -8.34000000e-01 15.9994 0 - 2227 WATR 457 HOH HT 84 4.17000000e-01 1.008 0 - 2228 WATR 457 HOH HT 84 4.17000000e-01 1.008 0 - 2229 WATR 458 HOH OT 85 -8.34000000e-01 15.9994 0 - 2230 WATR 458 HOH HT 84 4.17000000e-01 1.008 0 - 2231 WATR 458 HOH HT 84 4.17000000e-01 1.008 0 - 2232 WATR 459 HOH OT 85 -8.34000000e-01 15.9994 0 - 2233 WATR 459 HOH HT 84 4.17000000e-01 1.008 0 - 2234 WATR 459 HOH HT 84 4.17000000e-01 1.008 0 - 2235 WATR 460 HOH OT 85 -8.34000000e-01 15.9994 0 - 2236 WATR 460 HOH HT 84 4.17000000e-01 1.008 0 - 2237 WATR 460 HOH HT 84 4.17000000e-01 1.008 0 - 2238 WATR 461 HOH OT 85 -8.34000000e-01 15.9994 0 - 2239 WATR 461 HOH HT 84 4.17000000e-01 1.008 0 - 2240 WATR 461 HOH HT 84 4.17000000e-01 1.008 0 - 2241 WATR 462 HOH OT 85 -8.34000000e-01 15.9994 0 - 2242 WATR 462 HOH HT 84 4.17000000e-01 1.008 0 - 2243 WATR 462 HOH HT 84 4.17000000e-01 1.008 0 - 2244 WATR 463 HOH OT 85 -8.34000000e-01 15.9994 0 - 2245 WATR 463 HOH HT 84 4.17000000e-01 1.008 0 - 2246 WATR 463 HOH HT 84 4.17000000e-01 1.008 0 - 2247 WATR 464 HOH OT 85 -8.34000000e-01 15.9994 0 - 2248 WATR 464 HOH HT 84 4.17000000e-01 1.008 0 - 2249 WATR 464 HOH HT 84 4.17000000e-01 1.008 0 - 2250 WATR 465 HOH OT 85 -8.34000000e-01 15.9994 0 - 2251 WATR 465 HOH HT 84 4.17000000e-01 1.008 0 - 2252 WATR 465 HOH HT 84 4.17000000e-01 1.008 0 - 2253 WATR 466 HOH OT 85 -8.34000000e-01 15.9994 0 - 2254 WATR 466 HOH HT 84 4.17000000e-01 1.008 0 - 2255 WATR 466 HOH HT 84 4.17000000e-01 1.008 0 - 2256 WATR 467 HOH OT 85 -8.34000000e-01 15.9994 0 - 2257 WATR 467 HOH HT 84 4.17000000e-01 1.008 0 - 2258 WATR 467 HOH HT 84 4.17000000e-01 1.008 0 - 2259 WATR 468 HOH OT 85 -8.34000000e-01 15.9994 0 - 2260 WATR 468 HOH HT 84 4.17000000e-01 1.008 0 - 2261 WATR 468 HOH HT 84 4.17000000e-01 1.008 0 - 2262 WATR 469 HOH OT 85 -8.34000000e-01 15.9994 0 - 2263 WATR 469 HOH HT 84 4.17000000e-01 1.008 0 - 2264 WATR 469 HOH HT 84 4.17000000e-01 1.008 0 - 2265 WATR 470 HOH OT 85 -8.34000000e-01 15.9994 0 - 2266 WATR 470 HOH HT 84 4.17000000e-01 1.008 0 - 2267 WATR 470 HOH HT 84 4.17000000e-01 1.008 0 - 2268 WATR 471 HOH OT 85 -8.34000000e-01 15.9994 0 - 2269 WATR 471 HOH HT 84 4.17000000e-01 1.008 0 - 2270 WATR 471 HOH HT 84 4.17000000e-01 1.008 0 - 2271 WATR 472 HOH OT 85 -8.34000000e-01 15.9994 0 - 2272 WATR 472 HOH HT 84 4.17000000e-01 1.008 0 - 2273 WATR 472 HOH HT 84 4.17000000e-01 1.008 0 - 2274 WATR 473 HOH OT 85 -8.34000000e-01 15.9994 0 - 2275 WATR 473 HOH HT 84 4.17000000e-01 1.008 0 - 2276 WATR 473 HOH HT 84 4.17000000e-01 1.008 0 - 2277 WATR 474 HOH OT 85 -8.34000000e-01 15.9994 0 - 2278 WATR 474 HOH HT 84 4.17000000e-01 1.008 0 - 2279 WATR 474 HOH HT 84 4.17000000e-01 1.008 0 - 2280 WATR 475 HOH OT 85 -8.34000000e-01 15.9994 0 - 2281 WATR 475 HOH HT 84 4.17000000e-01 1.008 0 - 2282 WATR 475 HOH HT 84 4.17000000e-01 1.008 0 - 2283 WATR 476 HOH OT 85 -8.34000000e-01 15.9994 0 - 2284 WATR 476 HOH HT 84 4.17000000e-01 1.008 0 - 2285 WATR 476 HOH HT 84 4.17000000e-01 1.008 0 - 2286 WATR 477 HOH OT 85 -8.34000000e-01 15.9994 0 - 2287 WATR 477 HOH HT 84 4.17000000e-01 1.008 0 - 2288 WATR 477 HOH HT 84 4.17000000e-01 1.008 0 - 2289 WATR 478 HOH OT 85 -8.34000000e-01 15.9994 0 - 2290 WATR 478 HOH HT 84 4.17000000e-01 1.008 0 - 2291 WATR 478 HOH HT 84 4.17000000e-01 1.008 0 - 2292 WATR 479 HOH OT 85 -8.34000000e-01 15.9994 0 - 2293 WATR 479 HOH HT 84 4.17000000e-01 1.008 0 - 2294 WATR 479 HOH HT 84 4.17000000e-01 1.008 0 - 2295 WATR 480 HOH OT 85 -8.34000000e-01 15.9994 0 - 2296 WATR 480 HOH HT 84 4.17000000e-01 1.008 0 - 2297 WATR 480 HOH HT 84 4.17000000e-01 1.008 0 - 2298 WATR 481 HOH OT 85 -8.34000000e-01 15.9994 0 - 2299 WATR 481 HOH HT 84 4.17000000e-01 1.008 0 - 2300 WATR 481 HOH HT 84 4.17000000e-01 1.008 0 - 2301 WATR 482 HOH OT 85 -8.34000000e-01 15.9994 0 - 2302 WATR 482 HOH HT 84 4.17000000e-01 1.008 0 - 2303 WATR 482 HOH HT 84 4.17000000e-01 1.008 0 - 2304 WATR 483 HOH OT 85 -8.34000000e-01 15.9994 0 - 2305 WATR 483 HOH HT 84 4.17000000e-01 1.008 0 - 2306 WATR 483 HOH HT 84 4.17000000e-01 1.008 0 - 2307 WATR 484 HOH OT 85 -8.34000000e-01 15.9994 0 - 2308 WATR 484 HOH HT 84 4.17000000e-01 1.008 0 - 2309 WATR 484 HOH HT 84 4.17000000e-01 1.008 0 - 2310 WATR 485 HOH OT 85 -8.34000000e-01 15.9994 0 - 2311 WATR 485 HOH HT 84 4.17000000e-01 1.008 0 - 2312 WATR 485 HOH HT 84 4.17000000e-01 1.008 0 - 2313 WATR 486 HOH OT 85 -8.34000000e-01 15.9994 0 - 2314 WATR 486 HOH HT 84 4.17000000e-01 1.008 0 - 2315 WATR 486 HOH HT 84 4.17000000e-01 1.008 0 - 2316 WATR 487 HOH OT 85 -8.34000000e-01 15.9994 0 - 2317 WATR 487 HOH HT 84 4.17000000e-01 1.008 0 - 2318 WATR 487 HOH HT 84 4.17000000e-01 1.008 0 - 2319 WATR 488 HOH OT 85 -8.34000000e-01 15.9994 0 - 2320 WATR 488 HOH HT 84 4.17000000e-01 1.008 0 - 2321 WATR 488 HOH HT 84 4.17000000e-01 1.008 0 - 2322 WATR 489 HOH OT 85 -8.34000000e-01 15.9994 0 - 2323 WATR 489 HOH HT 84 4.17000000e-01 1.008 0 - 2324 WATR 489 HOH HT 84 4.17000000e-01 1.008 0 - 2325 WATR 490 HOH OT 85 -8.34000000e-01 15.9994 0 - 2326 WATR 490 HOH HT 84 4.17000000e-01 1.008 0 - 2327 WATR 490 HOH HT 84 4.17000000e-01 1.008 0 - 2328 WATR 491 HOH OT 85 -8.34000000e-01 15.9994 0 - 2329 WATR 491 HOH HT 84 4.17000000e-01 1.008 0 - 2330 WATR 491 HOH HT 84 4.17000000e-01 1.008 0 - 2331 WATR 492 HOH OT 85 -8.34000000e-01 15.9994 0 - 2332 WATR 492 HOH HT 84 4.17000000e-01 1.008 0 - 2333 WATR 492 HOH HT 84 4.17000000e-01 1.008 0 - 2334 WATR 493 HOH OT 85 -8.34000000e-01 15.9994 0 - 2335 WATR 493 HOH HT 84 4.17000000e-01 1.008 0 - 2336 WATR 493 HOH HT 84 4.17000000e-01 1.008 0 - 2337 WATR 494 HOH OT 85 -8.34000000e-01 15.9994 0 - 2338 WATR 494 HOH HT 84 4.17000000e-01 1.008 0 - 2339 WATR 494 HOH HT 84 4.17000000e-01 1.008 0 - 2340 WATR 495 HOH OT 85 -8.34000000e-01 15.9994 0 - 2341 WATR 495 HOH HT 84 4.17000000e-01 1.008 0 - 2342 WATR 495 HOH HT 84 4.17000000e-01 1.008 0 - 2343 WATR 496 HOH OT 85 -8.34000000e-01 15.9994 0 - 2344 WATR 496 HOH HT 84 4.17000000e-01 1.008 0 - 2345 WATR 496 HOH HT 84 4.17000000e-01 1.008 0 - 2346 WATR 497 HOH OT 85 -8.34000000e-01 15.9994 0 - 2347 WATR 497 HOH HT 84 4.17000000e-01 1.008 0 - 2348 WATR 497 HOH HT 84 4.17000000e-01 1.008 0 - 2349 WATR 498 HOH OT 85 -8.34000000e-01 15.9994 0 - 2350 WATR 498 HOH HT 84 4.17000000e-01 1.008 0 - 2351 WATR 498 HOH HT 84 4.17000000e-01 1.008 0 - 2352 WATR 499 HOH OT 85 -8.34000000e-01 15.9994 0 - 2353 WATR 499 HOH HT 84 4.17000000e-01 1.008 0 - 2354 WATR 499 HOH HT 84 4.17000000e-01 1.008 0 - 2355 WATR 500 HOH OT 85 -8.34000000e-01 15.9994 0 - 2356 WATR 500 HOH HT 84 4.17000000e-01 1.008 0 - 2357 WATR 500 HOH HT 84 4.17000000e-01 1.008 0 - 2358 WATR 501 HOH OT 85 -8.34000000e-01 15.9994 0 - 2359 WATR 501 HOH HT 84 4.17000000e-01 1.008 0 - 2360 WATR 501 HOH HT 84 4.17000000e-01 1.008 0 - 2361 WATR 502 HOH OT 85 -8.34000000e-01 15.9994 0 - 2362 WATR 502 HOH HT 84 4.17000000e-01 1.008 0 - 2363 WATR 502 HOH HT 84 4.17000000e-01 1.008 0 - 2364 SALT 3 ION SOD 87 1.00000000e+00 22.9897 0 - 2365 WATR 503 HOH OT 85 -8.34000000e-01 15.9994 0 - 2366 WATR 503 HOH HT 84 4.17000000e-01 1.008 0 + 994 WATR 46 HOH HT 84 4.17000000e-01 1.008 0 + 995 SALT 2 ION SOD 87 1.00000000e+00 22.9897 0 + 996 WATR 47 HOH OT 85 -8.34000000e-01 15.9994 0 + 997 WATR 47 HOH HT 84 4.17000000e-01 1.008 0 + 998 WATR 47 HOH HT 84 4.17000000e-01 1.008 0 + 999 WATR 48 HOH OT 85 -8.34000000e-01 15.9994 0 + 1000 WATR 48 HOH HT 84 4.17000000e-01 1.008 0 + 1001 WATR 48 HOH HT 84 4.17000000e-01 1.008 0 + 1002 WATR 49 HOH OT 85 -8.34000000e-01 15.9994 0 + 1003 WATR 49 HOH HT 84 4.17000000e-01 1.008 0 + 1004 WATR 49 HOH HT 84 4.17000000e-01 1.008 0 + 1005 WATR 50 HOH OT 85 -8.34000000e-01 15.9994 0 + 1006 WATR 50 HOH HT 84 4.17000000e-01 1.008 0 + 1007 WATR 50 HOH HT 84 4.17000000e-01 1.008 0 + 1008 WATR 51 HOH OT 85 -8.34000000e-01 15.9994 0 + 1009 WATR 51 HOH HT 84 4.17000000e-01 1.008 0 + 1010 WATR 51 HOH HT 84 4.17000000e-01 1.008 0 + 1011 WATR 52 HOH OT 85 -8.34000000e-01 15.9994 0 + 1012 WATR 52 HOH HT 84 4.17000000e-01 1.008 0 + 1013 WATR 52 HOH HT 84 4.17000000e-01 1.008 0 + 1014 WATR 53 HOH OT 85 -8.34000000e-01 15.9994 0 + 1015 WATR 53 HOH HT 84 4.17000000e-01 1.008 0 + 1016 WATR 53 HOH HT 84 4.17000000e-01 1.008 0 + 1017 WATR 54 HOH OT 85 -8.34000000e-01 15.9994 0 + 1018 WATR 54 HOH HT 84 4.17000000e-01 1.008 0 + 1019 WATR 54 HOH HT 84 4.17000000e-01 1.008 0 + 1020 WATR 55 HOH OT 85 -8.34000000e-01 15.9994 0 + 1021 WATR 55 HOH HT 84 4.17000000e-01 1.008 0 + 1022 WATR 55 HOH HT 84 4.17000000e-01 1.008 0 + 1023 WATR 56 HOH OT 85 -8.34000000e-01 15.9994 0 + 1024 WATR 56 HOH HT 84 4.17000000e-01 1.008 0 + 1025 WATR 56 HOH HT 84 4.17000000e-01 1.008 0 + 1026 WATR 57 HOH OT 85 -8.34000000e-01 15.9994 0 + 1027 WATR 57 HOH HT 84 4.17000000e-01 1.008 0 + 1028 WATR 57 HOH HT 84 4.17000000e-01 1.008 0 + 1029 WATR 58 HOH OT 85 -8.34000000e-01 15.9994 0 + 1030 WATR 58 HOH HT 84 4.17000000e-01 1.008 0 + 1031 WATR 58 HOH HT 84 4.17000000e-01 1.008 0 + 1032 WATR 59 HOH OT 85 -8.34000000e-01 15.9994 0 + 1033 WATR 59 HOH HT 84 4.17000000e-01 1.008 0 + 1034 WATR 59 HOH HT 84 4.17000000e-01 1.008 0 + 1035 WATR 60 HOH OT 85 -8.34000000e-01 15.9994 0 + 1036 WATR 60 HOH HT 84 4.17000000e-01 1.008 0 + 1037 WATR 60 HOH HT 84 4.17000000e-01 1.008 0 + 1038 WATR 61 HOH OT 85 -8.34000000e-01 15.9994 0 + 1039 WATR 61 HOH HT 84 4.17000000e-01 1.008 0 + 1040 WATR 61 HOH HT 84 4.17000000e-01 1.008 0 + 1041 WATR 62 HOH OT 85 -8.34000000e-01 15.9994 0 + 1042 WATR 62 HOH HT 84 4.17000000e-01 1.008 0 + 1043 WATR 62 HOH HT 84 4.17000000e-01 1.008 0 + 1044 WATR 63 HOH OT 85 -8.34000000e-01 15.9994 0 + 1045 WATR 63 HOH HT 84 4.17000000e-01 1.008 0 + 1046 WATR 63 HOH HT 84 4.17000000e-01 1.008 0 + 1047 WATR 64 HOH OT 85 -8.34000000e-01 15.9994 0 + 1048 WATR 64 HOH HT 84 4.17000000e-01 1.008 0 + 1049 WATR 64 HOH HT 84 4.17000000e-01 1.008 0 + 1050 WATR 65 HOH OT 85 -8.34000000e-01 15.9994 0 + 1051 WATR 65 HOH HT 84 4.17000000e-01 1.008 0 + 1052 WATR 65 HOH HT 84 4.17000000e-01 1.008 0 + 1053 WATR 66 HOH OT 85 -8.34000000e-01 15.9994 0 + 1054 WATR 66 HOH HT 84 4.17000000e-01 1.008 0 + 1055 WATR 66 HOH HT 84 4.17000000e-01 1.008 0 + 1056 WATR 67 HOH OT 85 -8.34000000e-01 15.9994 0 + 1057 WATR 67 HOH HT 84 4.17000000e-01 1.008 0 + 1058 WATR 67 HOH HT 84 4.17000000e-01 1.008 0 + 1059 WATR 68 HOH OT 85 -8.34000000e-01 15.9994 0 + 1060 WATR 68 HOH HT 84 4.17000000e-01 1.008 0 + 1061 WATR 68 HOH HT 84 4.17000000e-01 1.008 0 + 1062 WATR 69 HOH OT 85 -8.34000000e-01 15.9994 0 + 1063 WATR 69 HOH HT 84 4.17000000e-01 1.008 0 + 1064 WATR 69 HOH HT 84 4.17000000e-01 1.008 0 + 1065 WATR 70 HOH OT 85 -8.34000000e-01 15.9994 0 + 1066 WATR 70 HOH HT 84 4.17000000e-01 1.008 0 + 1067 WATR 70 HOH HT 84 4.17000000e-01 1.008 0 + 1068 WATR 71 HOH OT 85 -8.34000000e-01 15.9994 0 + 1069 WATR 71 HOH HT 84 4.17000000e-01 1.008 0 + 1070 WATR 71 HOH HT 84 4.17000000e-01 1.008 0 + 1071 WATR 72 HOH OT 85 -8.34000000e-01 15.9994 0 + 1072 WATR 72 HOH HT 84 4.17000000e-01 1.008 0 + 1073 WATR 72 HOH HT 84 4.17000000e-01 1.008 0 + 1074 WATR 73 HOH OT 85 -8.34000000e-01 15.9994 0 + 1075 WATR 73 HOH HT 84 4.17000000e-01 1.008 0 + 1076 WATR 73 HOH HT 84 4.17000000e-01 1.008 0 + 1077 WATR 74 HOH OT 85 -8.34000000e-01 15.9994 0 + 1078 WATR 74 HOH HT 84 4.17000000e-01 1.008 0 + 1079 WATR 74 HOH HT 84 4.17000000e-01 1.008 0 + 1080 WATR 75 HOH OT 85 -8.34000000e-01 15.9994 0 + 1081 WATR 75 HOH HT 84 4.17000000e-01 1.008 0 + 1082 WATR 75 HOH HT 84 4.17000000e-01 1.008 0 + 1083 WATR 76 HOH OT 85 -8.34000000e-01 15.9994 0 + 1084 WATR 76 HOH HT 84 4.17000000e-01 1.008 0 + 1085 WATR 76 HOH HT 84 4.17000000e-01 1.008 0 + 1086 WATR 77 HOH OT 85 -8.34000000e-01 15.9994 0 + 1087 WATR 77 HOH HT 84 4.17000000e-01 1.008 0 + 1088 WATR 77 HOH HT 84 4.17000000e-01 1.008 0 + 1089 WATR 78 HOH OT 85 -8.34000000e-01 15.9994 0 + 1090 WATR 78 HOH HT 84 4.17000000e-01 1.008 0 + 1091 WATR 78 HOH HT 84 4.17000000e-01 1.008 0 + 1092 WATR 79 HOH OT 85 -8.34000000e-01 15.9994 0 + 1093 WATR 79 HOH HT 84 4.17000000e-01 1.008 0 + 1094 WATR 79 HOH HT 84 4.17000000e-01 1.008 0 + 1095 WATR 80 HOH OT 85 -8.34000000e-01 15.9994 0 + 1096 WATR 80 HOH HT 84 4.17000000e-01 1.008 0 + 1097 WATR 80 HOH HT 84 4.17000000e-01 1.008 0 + 1098 WATR 81 HOH OT 85 -8.34000000e-01 15.9994 0 + 1099 WATR 81 HOH HT 84 4.17000000e-01 1.008 0 + 1100 WATR 81 HOH HT 84 4.17000000e-01 1.008 0 + 1101 WATR 82 HOH OT 85 -8.34000000e-01 15.9994 0 + 1102 WATR 82 HOH HT 84 4.17000000e-01 1.008 0 + 1103 WATR 82 HOH HT 84 4.17000000e-01 1.008 0 + 1104 WATR 83 HOH OT 85 -8.34000000e-01 15.9994 0 + 1105 WATR 83 HOH HT 84 4.17000000e-01 1.008 0 + 1106 WATR 83 HOH HT 84 4.17000000e-01 1.008 0 + 1107 WATR 84 HOH OT 85 -8.34000000e-01 15.9994 0 + 1108 WATR 84 HOH HT 84 4.17000000e-01 1.008 0 + 1109 WATR 84 HOH HT 84 4.17000000e-01 1.008 0 + 1110 WATR 85 HOH OT 85 -8.34000000e-01 15.9994 0 + 1111 WATR 85 HOH HT 84 4.17000000e-01 1.008 0 + 1112 WATR 85 HOH HT 84 4.17000000e-01 1.008 0 + 1113 WATR 86 HOH OT 85 -8.34000000e-01 15.9994 0 + 1114 WATR 86 HOH HT 84 4.17000000e-01 1.008 0 + 1115 WATR 86 HOH HT 84 4.17000000e-01 1.008 0 + 1116 WATR 87 HOH OT 85 -8.34000000e-01 15.9994 0 + 1117 WATR 87 HOH HT 84 4.17000000e-01 1.008 0 + 1118 WATR 87 HOH HT 84 4.17000000e-01 1.008 0 + 1119 WATR 88 HOH OT 85 -8.34000000e-01 15.9994 0 + 1120 WATR 88 HOH HT 84 4.17000000e-01 1.008 0 + 1121 WATR 88 HOH HT 84 4.17000000e-01 1.008 0 + 1122 WATR 89 HOH OT 85 -8.34000000e-01 15.9994 0 + 1123 WATR 89 HOH HT 84 4.17000000e-01 1.008 0 + 1124 WATR 89 HOH HT 84 4.17000000e-01 1.008 0 + 1125 WATR 90 HOH OT 85 -8.34000000e-01 15.9994 0 + 1126 WATR 90 HOH HT 84 4.17000000e-01 1.008 0 + 1127 WATR 90 HOH HT 84 4.17000000e-01 1.008 0 + 1128 WATR 91 HOH OT 85 -8.34000000e-01 15.9994 0 + 1129 WATR 91 HOH HT 84 4.17000000e-01 1.008 0 + 1130 WATR 91 HOH HT 84 4.17000000e-01 1.008 0 + 1131 WATR 92 HOH OT 85 -8.34000000e-01 15.9994 0 + 1132 WATR 92 HOH HT 84 4.17000000e-01 1.008 0 + 1133 WATR 92 HOH HT 84 4.17000000e-01 1.008 0 + 1134 WATR 93 HOH OT 85 -8.34000000e-01 15.9994 0 + 1135 WATR 93 HOH HT 84 4.17000000e-01 1.008 0 + 1136 WATR 93 HOH HT 84 4.17000000e-01 1.008 0 + 1137 WATR 94 HOH OT 85 -8.34000000e-01 15.9994 0 + 1138 WATR 94 HOH HT 84 4.17000000e-01 1.008 0 + 1139 WATR 94 HOH HT 84 4.17000000e-01 1.008 0 + 1140 WATR 95 HOH OT 85 -8.34000000e-01 15.9994 0 + 1141 WATR 95 HOH HT 84 4.17000000e-01 1.008 0 + 1142 WATR 95 HOH HT 84 4.17000000e-01 1.008 0 + 1143 WATR 96 HOH OT 85 -8.34000000e-01 15.9994 0 + 1144 WATR 96 HOH HT 84 4.17000000e-01 1.008 0 + 1145 WATR 96 HOH HT 84 4.17000000e-01 1.008 0 + 1146 WATR 97 HOH OT 85 -8.34000000e-01 15.9994 0 + 1147 WATR 97 HOH HT 84 4.17000000e-01 1.008 0 + 1148 WATR 97 HOH HT 84 4.17000000e-01 1.008 0 + 1149 WATR 98 HOH OT 85 -8.34000000e-01 15.9994 0 + 1150 WATR 98 HOH HT 84 4.17000000e-01 1.008 0 + 1151 WATR 98 HOH HT 84 4.17000000e-01 1.008 0 + 1152 WATR 99 HOH OT 85 -8.34000000e-01 15.9994 0 + 1153 WATR 99 HOH HT 84 4.17000000e-01 1.008 0 + 1154 WATR 99 HOH HT 84 4.17000000e-01 1.008 0 + 1155 WATR 100 HOH OT 85 -8.34000000e-01 15.9994 0 + 1156 WATR 100 HOH HT 84 4.17000000e-01 1.008 0 + 1157 WATR 100 HOH HT 84 4.17000000e-01 1.008 0 + 1158 WATR 101 HOH OT 85 -8.34000000e-01 15.9994 0 + 1159 WATR 101 HOH HT 84 4.17000000e-01 1.008 0 + 1160 WATR 101 HOH HT 84 4.17000000e-01 1.008 0 + 1161 WATR 102 HOH OT 85 -8.34000000e-01 15.9994 0 + 1162 WATR 102 HOH HT 84 4.17000000e-01 1.008 0 + 1163 WATR 102 HOH HT 84 4.17000000e-01 1.008 0 + 1164 WATR 103 HOH OT 85 -8.34000000e-01 15.9994 0 + 1165 WATR 103 HOH HT 84 4.17000000e-01 1.008 0 + 1166 WATR 103 HOH HT 84 4.17000000e-01 1.008 0 + 1167 WATR 104 HOH OT 85 -8.34000000e-01 15.9994 0 + 1168 WATR 104 HOH HT 84 4.17000000e-01 1.008 0 + 1169 WATR 104 HOH HT 84 4.17000000e-01 1.008 0 + 1170 WATR 105 HOH OT 85 -8.34000000e-01 15.9994 0 + 1171 WATR 105 HOH HT 84 4.17000000e-01 1.008 0 + 1172 WATR 105 HOH HT 84 4.17000000e-01 1.008 0 + 1173 WATR 106 HOH OT 85 -8.34000000e-01 15.9994 0 + 1174 WATR 106 HOH HT 84 4.17000000e-01 1.008 0 + 1175 WATR 106 HOH HT 84 4.17000000e-01 1.008 0 + 1176 WATR 107 HOH OT 85 -8.34000000e-01 15.9994 0 + 1177 WATR 107 HOH HT 84 4.17000000e-01 1.008 0 + 1178 WATR 107 HOH HT 84 4.17000000e-01 1.008 0 + 1179 WATR 108 HOH OT 85 -8.34000000e-01 15.9994 0 + 1180 WATR 108 HOH HT 84 4.17000000e-01 1.008 0 + 1181 WATR 108 HOH HT 84 4.17000000e-01 1.008 0 + 1182 WATR 109 HOH OT 85 -8.34000000e-01 15.9994 0 + 1183 WATR 109 HOH HT 84 4.17000000e-01 1.008 0 + 1184 WATR 109 HOH HT 84 4.17000000e-01 1.008 0 + 1185 WATR 110 HOH OT 85 -8.34000000e-01 15.9994 0 + 1186 WATR 110 HOH HT 84 4.17000000e-01 1.008 0 + 1187 WATR 110 HOH HT 84 4.17000000e-01 1.008 0 + 1188 WATR 111 HOH OT 85 -8.34000000e-01 15.9994 0 + 1189 WATR 111 HOH HT 84 4.17000000e-01 1.008 0 + 1190 WATR 111 HOH HT 84 4.17000000e-01 1.008 0 + 1191 WATR 112 HOH OT 85 -8.34000000e-01 15.9994 0 + 1192 WATR 112 HOH HT 84 4.17000000e-01 1.008 0 + 1193 WATR 112 HOH HT 84 4.17000000e-01 1.008 0 + 1194 WATR 113 HOH OT 85 -8.34000000e-01 15.9994 0 + 1195 WATR 113 HOH HT 84 4.17000000e-01 1.008 0 + 1196 WATR 113 HOH HT 84 4.17000000e-01 1.008 0 + 1197 WATR 114 HOH OT 85 -8.34000000e-01 15.9994 0 + 1198 WATR 114 HOH HT 84 4.17000000e-01 1.008 0 + 1199 WATR 114 HOH HT 84 4.17000000e-01 1.008 0 + 1200 WATR 115 HOH OT 85 -8.34000000e-01 15.9994 0 + 1201 WATR 115 HOH HT 84 4.17000000e-01 1.008 0 + 1202 WATR 115 HOH HT 84 4.17000000e-01 1.008 0 + 1203 WATR 116 HOH OT 85 -8.34000000e-01 15.9994 0 + 1204 WATR 116 HOH HT 84 4.17000000e-01 1.008 0 + 1205 WATR 116 HOH HT 84 4.17000000e-01 1.008 0 + 1206 WATR 117 HOH OT 85 -8.34000000e-01 15.9994 0 + 1207 WATR 117 HOH HT 84 4.17000000e-01 1.008 0 + 1208 WATR 117 HOH HT 84 4.17000000e-01 1.008 0 + 1209 WATR 118 HOH OT 85 -8.34000000e-01 15.9994 0 + 1210 WATR 118 HOH HT 84 4.17000000e-01 1.008 0 + 1211 WATR 118 HOH HT 84 4.17000000e-01 1.008 0 + 1212 WATR 119 HOH OT 85 -8.34000000e-01 15.9994 0 + 1213 WATR 119 HOH HT 84 4.17000000e-01 1.008 0 + 1214 WATR 119 HOH HT 84 4.17000000e-01 1.008 0 + 1215 WATR 120 HOH OT 85 -8.34000000e-01 15.9994 0 + 1216 WATR 120 HOH HT 84 4.17000000e-01 1.008 0 + 1217 WATR 120 HOH HT 84 4.17000000e-01 1.008 0 + 1218 WATR 121 HOH OT 85 -8.34000000e-01 15.9994 0 + 1219 WATR 121 HOH HT 84 4.17000000e-01 1.008 0 + 1220 WATR 121 HOH HT 84 4.17000000e-01 1.008 0 + 1221 WATR 122 HOH OT 85 -8.34000000e-01 15.9994 0 + 1222 WATR 122 HOH HT 84 4.17000000e-01 1.008 0 + 1223 WATR 122 HOH HT 84 4.17000000e-01 1.008 0 + 1224 WATR 123 HOH OT 85 -8.34000000e-01 15.9994 0 + 1225 WATR 123 HOH HT 84 4.17000000e-01 1.008 0 + 1226 WATR 123 HOH HT 84 4.17000000e-01 1.008 0 + 1227 WATR 124 HOH OT 85 -8.34000000e-01 15.9994 0 + 1228 WATR 124 HOH HT 84 4.17000000e-01 1.008 0 + 1229 WATR 124 HOH HT 84 4.17000000e-01 1.008 0 + 1230 WATR 125 HOH OT 85 -8.34000000e-01 15.9994 0 + 1231 WATR 125 HOH HT 84 4.17000000e-01 1.008 0 + 1232 WATR 125 HOH HT 84 4.17000000e-01 1.008 0 + 1233 WATR 126 HOH OT 85 -8.34000000e-01 15.9994 0 + 1234 WATR 126 HOH HT 84 4.17000000e-01 1.008 0 + 1235 WATR 126 HOH HT 84 4.17000000e-01 1.008 0 + 1236 WATR 127 HOH OT 85 -8.34000000e-01 15.9994 0 + 1237 WATR 127 HOH HT 84 4.17000000e-01 1.008 0 + 1238 WATR 127 HOH HT 84 4.17000000e-01 1.008 0 + 1239 WATR 128 HOH OT 85 -8.34000000e-01 15.9994 0 + 1240 WATR 128 HOH HT 84 4.17000000e-01 1.008 0 + 1241 WATR 128 HOH HT 84 4.17000000e-01 1.008 0 + 1242 WATR 129 HOH OT 85 -8.34000000e-01 15.9994 0 + 1243 WATR 129 HOH HT 84 4.17000000e-01 1.008 0 + 1244 WATR 129 HOH HT 84 4.17000000e-01 1.008 0 + 1245 WATR 130 HOH OT 85 -8.34000000e-01 15.9994 0 + 1246 WATR 130 HOH HT 84 4.17000000e-01 1.008 0 + 1247 WATR 130 HOH HT 84 4.17000000e-01 1.008 0 + 1248 WATR 131 HOH OT 85 -8.34000000e-01 15.9994 0 + 1249 WATR 131 HOH HT 84 4.17000000e-01 1.008 0 + 1250 WATR 131 HOH HT 84 4.17000000e-01 1.008 0 + 1251 WATR 132 HOH OT 85 -8.34000000e-01 15.9994 0 + 1252 WATR 132 HOH HT 84 4.17000000e-01 1.008 0 + 1253 WATR 132 HOH HT 84 4.17000000e-01 1.008 0 + 1254 WATR 133 HOH OT 85 -8.34000000e-01 15.9994 0 + 1255 WATR 133 HOH HT 84 4.17000000e-01 1.008 0 + 1256 WATR 133 HOH HT 84 4.17000000e-01 1.008 0 + 1257 WATR 134 HOH OT 85 -8.34000000e-01 15.9994 0 + 1258 WATR 134 HOH HT 84 4.17000000e-01 1.008 0 + 1259 WATR 134 HOH HT 84 4.17000000e-01 1.008 0 + 1260 WATR 135 HOH OT 85 -8.34000000e-01 15.9994 0 + 1261 WATR 135 HOH HT 84 4.17000000e-01 1.008 0 + 1262 WATR 135 HOH HT 84 4.17000000e-01 1.008 0 + 1263 WATR 136 HOH OT 85 -8.34000000e-01 15.9994 0 + 1264 WATR 136 HOH HT 84 4.17000000e-01 1.008 0 + 1265 WATR 136 HOH HT 84 4.17000000e-01 1.008 0 + 1266 WATR 137 HOH OT 85 -8.34000000e-01 15.9994 0 + 1267 WATR 137 HOH HT 84 4.17000000e-01 1.008 0 + 1268 WATR 137 HOH HT 84 4.17000000e-01 1.008 0 + 1269 WATR 138 HOH OT 85 -8.34000000e-01 15.9994 0 + 1270 WATR 138 HOH HT 84 4.17000000e-01 1.008 0 + 1271 WATR 138 HOH HT 84 4.17000000e-01 1.008 0 + 1272 WATR 139 HOH OT 85 -8.34000000e-01 15.9994 0 + 1273 WATR 139 HOH HT 84 4.17000000e-01 1.008 0 + 1274 WATR 139 HOH HT 84 4.17000000e-01 1.008 0 + 1275 WATR 140 HOH OT 85 -8.34000000e-01 15.9994 0 + 1276 WATR 140 HOH HT 84 4.17000000e-01 1.008 0 + 1277 WATR 140 HOH HT 84 4.17000000e-01 1.008 0 + 1278 WATR 141 HOH OT 85 -8.34000000e-01 15.9994 0 + 1279 WATR 141 HOH HT 84 4.17000000e-01 1.008 0 + 1280 WATR 141 HOH HT 84 4.17000000e-01 1.008 0 + 1281 WATR 142 HOH OT 85 -8.34000000e-01 15.9994 0 + 1282 WATR 142 HOH HT 84 4.17000000e-01 1.008 0 + 1283 WATR 142 HOH HT 84 4.17000000e-01 1.008 0 + 1284 WATR 143 HOH OT 85 -8.34000000e-01 15.9994 0 + 1285 WATR 143 HOH HT 84 4.17000000e-01 1.008 0 + 1286 WATR 143 HOH HT 84 4.17000000e-01 1.008 0 + 1287 WATR 144 HOH OT 85 -8.34000000e-01 15.9994 0 + 1288 WATR 144 HOH HT 84 4.17000000e-01 1.008 0 + 1289 WATR 144 HOH HT 84 4.17000000e-01 1.008 0 + 1290 WATR 145 HOH OT 85 -8.34000000e-01 15.9994 0 + 1291 WATR 145 HOH HT 84 4.17000000e-01 1.008 0 + 1292 WATR 145 HOH HT 84 4.17000000e-01 1.008 0 + 1293 WATR 146 HOH OT 85 -8.34000000e-01 15.9994 0 + 1294 WATR 146 HOH HT 84 4.17000000e-01 1.008 0 + 1295 WATR 146 HOH HT 84 4.17000000e-01 1.008 0 + 1296 WATR 147 HOH OT 85 -8.34000000e-01 15.9994 0 + 1297 WATR 147 HOH HT 84 4.17000000e-01 1.008 0 + 1298 WATR 147 HOH HT 84 4.17000000e-01 1.008 0 + 1299 WATR 148 HOH OT 85 -8.34000000e-01 15.9994 0 + 1300 WATR 148 HOH HT 84 4.17000000e-01 1.008 0 + 1301 WATR 148 HOH HT 84 4.17000000e-01 1.008 0 + 1302 WATR 149 HOH OT 85 -8.34000000e-01 15.9994 0 + 1303 WATR 149 HOH HT 84 4.17000000e-01 1.008 0 + 1304 WATR 149 HOH HT 84 4.17000000e-01 1.008 0 + 1305 WATR 150 HOH OT 85 -8.34000000e-01 15.9994 0 + 1306 WATR 150 HOH HT 84 4.17000000e-01 1.008 0 + 1307 WATR 150 HOH HT 84 4.17000000e-01 1.008 0 + 1308 WATR 151 HOH OT 85 -8.34000000e-01 15.9994 0 + 1309 WATR 151 HOH HT 84 4.17000000e-01 1.008 0 + 1310 WATR 151 HOH HT 84 4.17000000e-01 1.008 0 + 1311 WATR 152 HOH OT 85 -8.34000000e-01 15.9994 0 + 1312 WATR 152 HOH HT 84 4.17000000e-01 1.008 0 + 1313 WATR 152 HOH HT 84 4.17000000e-01 1.008 0 + 1314 WATR 153 HOH OT 85 -8.34000000e-01 15.9994 0 + 1315 WATR 153 HOH HT 84 4.17000000e-01 1.008 0 + 1316 WATR 153 HOH HT 84 4.17000000e-01 1.008 0 + 1317 WATR 154 HOH OT 85 -8.34000000e-01 15.9994 0 + 1318 WATR 154 HOH HT 84 4.17000000e-01 1.008 0 + 1319 WATR 154 HOH HT 84 4.17000000e-01 1.008 0 + 1320 WATR 155 HOH OT 85 -8.34000000e-01 15.9994 0 + 1321 WATR 155 HOH HT 84 4.17000000e-01 1.008 0 + 1322 WATR 155 HOH HT 84 4.17000000e-01 1.008 0 + 1323 WATR 156 HOH OT 85 -8.34000000e-01 15.9994 0 + 1324 WATR 156 HOH HT 84 4.17000000e-01 1.008 0 + 1325 WATR 156 HOH HT 84 4.17000000e-01 1.008 0 + 1326 WATR 157 HOH OT 85 -8.34000000e-01 15.9994 0 + 1327 WATR 157 HOH HT 84 4.17000000e-01 1.008 0 + 1328 WATR 157 HOH HT 84 4.17000000e-01 1.008 0 + 1329 WATR 158 HOH OT 85 -8.34000000e-01 15.9994 0 + 1330 WATR 158 HOH HT 84 4.17000000e-01 1.008 0 + 1331 WATR 158 HOH HT 84 4.17000000e-01 1.008 0 + 1332 WATR 159 HOH OT 85 -8.34000000e-01 15.9994 0 + 1333 WATR 159 HOH HT 84 4.17000000e-01 1.008 0 + 1334 WATR 159 HOH HT 84 4.17000000e-01 1.008 0 + 1335 WATR 160 HOH OT 85 -8.34000000e-01 15.9994 0 + 1336 WATR 160 HOH HT 84 4.17000000e-01 1.008 0 + 1337 WATR 160 HOH HT 84 4.17000000e-01 1.008 0 + 1338 WATR 161 HOH OT 85 -8.34000000e-01 15.9994 0 + 1339 WATR 161 HOH HT 84 4.17000000e-01 1.008 0 + 1340 WATR 161 HOH HT 84 4.17000000e-01 1.008 0 + 1341 WATR 162 HOH OT 85 -8.34000000e-01 15.9994 0 + 1342 WATR 162 HOH HT 84 4.17000000e-01 1.008 0 + 1343 WATR 162 HOH HT 84 4.17000000e-01 1.008 0 + 1344 WATR 163 HOH OT 85 -8.34000000e-01 15.9994 0 + 1345 WATR 163 HOH HT 84 4.17000000e-01 1.008 0 + 1346 WATR 163 HOH HT 84 4.17000000e-01 1.008 0 + 1347 WATR 164 HOH OT 85 -8.34000000e-01 15.9994 0 + 1348 WATR 164 HOH HT 84 4.17000000e-01 1.008 0 + 1349 WATR 164 HOH HT 84 4.17000000e-01 1.008 0 + 1350 WATR 165 HOH OT 85 -8.34000000e-01 15.9994 0 + 1351 WATR 165 HOH HT 84 4.17000000e-01 1.008 0 + 1352 WATR 165 HOH HT 84 4.17000000e-01 1.008 0 + 1353 WATR 166 HOH OT 85 -8.34000000e-01 15.9994 0 + 1354 WATR 166 HOH HT 84 4.17000000e-01 1.008 0 + 1355 WATR 166 HOH HT 84 4.17000000e-01 1.008 0 + 1356 WATR 167 HOH OT 85 -8.34000000e-01 15.9994 0 + 1357 WATR 167 HOH HT 84 4.17000000e-01 1.008 0 + 1358 WATR 167 HOH HT 84 4.17000000e-01 1.008 0 + 1359 WATR 168 HOH OT 85 -8.34000000e-01 15.9994 0 + 1360 WATR 168 HOH HT 84 4.17000000e-01 1.008 0 + 1361 WATR 168 HOH HT 84 4.17000000e-01 1.008 0 + 1362 WATR 169 HOH OT 85 -8.34000000e-01 15.9994 0 + 1363 WATR 169 HOH HT 84 4.17000000e-01 1.008 0 + 1364 WATR 169 HOH HT 84 4.17000000e-01 1.008 0 + 1365 WATR 170 HOH OT 85 -8.34000000e-01 15.9994 0 + 1366 WATR 170 HOH HT 84 4.17000000e-01 1.008 0 + 1367 WATR 170 HOH HT 84 4.17000000e-01 1.008 0 + 1368 WATR 171 HOH OT 85 -8.34000000e-01 15.9994 0 + 1369 WATR 171 HOH HT 84 4.17000000e-01 1.008 0 + 1370 WATR 171 HOH HT 84 4.17000000e-01 1.008 0 + 1371 WATR 172 HOH OT 85 -8.34000000e-01 15.9994 0 + 1372 WATR 172 HOH HT 84 4.17000000e-01 1.008 0 + 1373 WATR 172 HOH HT 84 4.17000000e-01 1.008 0 + 1374 WATR 173 HOH OT 85 -8.34000000e-01 15.9994 0 + 1375 WATR 173 HOH HT 84 4.17000000e-01 1.008 0 + 1376 WATR 173 HOH HT 84 4.17000000e-01 1.008 0 + 1377 WATR 174 HOH OT 85 -8.34000000e-01 15.9994 0 + 1378 WATR 174 HOH HT 84 4.17000000e-01 1.008 0 + 1379 WATR 174 HOH HT 84 4.17000000e-01 1.008 0 + 1380 WATR 175 HOH OT 85 -8.34000000e-01 15.9994 0 + 1381 WATR 175 HOH HT 84 4.17000000e-01 1.008 0 + 1382 WATR 175 HOH HT 84 4.17000000e-01 1.008 0 + 1383 WATR 176 HOH OT 85 -8.34000000e-01 15.9994 0 + 1384 WATR 176 HOH HT 84 4.17000000e-01 1.008 0 + 1385 WATR 176 HOH HT 84 4.17000000e-01 1.008 0 + 1386 WATR 177 HOH OT 85 -8.34000000e-01 15.9994 0 + 1387 WATR 177 HOH HT 84 4.17000000e-01 1.008 0 + 1388 WATR 177 HOH HT 84 4.17000000e-01 1.008 0 + 1389 WATR 178 HOH OT 85 -8.34000000e-01 15.9994 0 + 1390 WATR 178 HOH HT 84 4.17000000e-01 1.008 0 + 1391 WATR 178 HOH HT 84 4.17000000e-01 1.008 0 + 1392 WATR 179 HOH OT 85 -8.34000000e-01 15.9994 0 + 1393 WATR 179 HOH HT 84 4.17000000e-01 1.008 0 + 1394 WATR 179 HOH HT 84 4.17000000e-01 1.008 0 + 1395 WATR 180 HOH OT 85 -8.34000000e-01 15.9994 0 + 1396 WATR 180 HOH HT 84 4.17000000e-01 1.008 0 + 1397 WATR 180 HOH HT 84 4.17000000e-01 1.008 0 + 1398 WATR 181 HOH OT 85 -8.34000000e-01 15.9994 0 + 1399 WATR 181 HOH HT 84 4.17000000e-01 1.008 0 + 1400 WATR 181 HOH HT 84 4.17000000e-01 1.008 0 + 1401 WATR 182 HOH OT 85 -8.34000000e-01 15.9994 0 + 1402 WATR 182 HOH HT 84 4.17000000e-01 1.008 0 + 1403 WATR 182 HOH HT 84 4.17000000e-01 1.008 0 + 1404 WATR 183 HOH OT 85 -8.34000000e-01 15.9994 0 + 1405 WATR 183 HOH HT 84 4.17000000e-01 1.008 0 + 1406 WATR 183 HOH HT 84 4.17000000e-01 1.008 0 + 1407 WATR 184 HOH OT 85 -8.34000000e-01 15.9994 0 + 1408 WATR 184 HOH HT 84 4.17000000e-01 1.008 0 + 1409 WATR 184 HOH HT 84 4.17000000e-01 1.008 0 + 1410 WATR 185 HOH OT 85 -8.34000000e-01 15.9994 0 + 1411 WATR 185 HOH HT 84 4.17000000e-01 1.008 0 + 1412 WATR 185 HOH HT 84 4.17000000e-01 1.008 0 + 1413 WATR 186 HOH OT 85 -8.34000000e-01 15.9994 0 + 1414 WATR 186 HOH HT 84 4.17000000e-01 1.008 0 + 1415 WATR 186 HOH HT 84 4.17000000e-01 1.008 0 + 1416 WATR 187 HOH OT 85 -8.34000000e-01 15.9994 0 + 1417 WATR 187 HOH HT 84 4.17000000e-01 1.008 0 + 1418 WATR 187 HOH HT 84 4.17000000e-01 1.008 0 + 1419 WATR 188 HOH OT 85 -8.34000000e-01 15.9994 0 + 1420 WATR 188 HOH HT 84 4.17000000e-01 1.008 0 + 1421 WATR 188 HOH HT 84 4.17000000e-01 1.008 0 + 1422 WATR 189 HOH OT 85 -8.34000000e-01 15.9994 0 + 1423 WATR 189 HOH HT 84 4.17000000e-01 1.008 0 + 1424 WATR 189 HOH HT 84 4.17000000e-01 1.008 0 + 1425 WATR 190 HOH OT 85 -8.34000000e-01 15.9994 0 + 1426 WATR 190 HOH HT 84 4.17000000e-01 1.008 0 + 1427 WATR 190 HOH HT 84 4.17000000e-01 1.008 0 + 1428 WATR 191 HOH OT 85 -8.34000000e-01 15.9994 0 + 1429 WATR 191 HOH HT 84 4.17000000e-01 1.008 0 + 1430 WATR 191 HOH HT 84 4.17000000e-01 1.008 0 + 1431 WATR 192 HOH OT 85 -8.34000000e-01 15.9994 0 + 1432 WATR 192 HOH HT 84 4.17000000e-01 1.008 0 + 1433 WATR 192 HOH HT 84 4.17000000e-01 1.008 0 + 1434 SALT 3 ION SOD 87 1.00000000e+00 22.9897 0 + 1435 WATR 193 HOH OT 85 -8.34000000e-01 15.9994 0 + 1436 WATR 193 HOH HT 84 4.17000000e-01 1.008 0 + 1437 WATR 193 HOH HT 84 4.17000000e-01 1.008 0 + 1438 WATR 194 HOH OT 85 -8.34000000e-01 15.9994 0 + 1439 WATR 194 HOH HT 84 4.17000000e-01 1.008 0 + 1440 WATR 194 HOH HT 84 4.17000000e-01 1.008 0 + 1441 WATR 195 HOH OT 85 -8.34000000e-01 15.9994 0 + 1442 WATR 195 HOH HT 84 4.17000000e-01 1.008 0 + 1443 WATR 195 HOH HT 84 4.17000000e-01 1.008 0 + 1444 WATR 196 HOH OT 85 -8.34000000e-01 15.9994 0 + 1445 WATR 196 HOH HT 84 4.17000000e-01 1.008 0 + 1446 WATR 196 HOH HT 84 4.17000000e-01 1.008 0 + 1447 WATR 197 HOH OT 85 -8.34000000e-01 15.9994 0 + 1448 WATR 197 HOH HT 84 4.17000000e-01 1.008 0 + 1449 WATR 197 HOH HT 84 4.17000000e-01 1.008 0 + 1450 WATR 198 HOH OT 85 -8.34000000e-01 15.9994 0 + 1451 WATR 198 HOH HT 84 4.17000000e-01 1.008 0 + 1452 WATR 198 HOH HT 84 4.17000000e-01 1.008 0 + 1453 WATR 199 HOH OT 85 -8.34000000e-01 15.9994 0 + 1454 WATR 199 HOH HT 84 4.17000000e-01 1.008 0 + 1455 WATR 199 HOH HT 84 4.17000000e-01 1.008 0 + 1456 WATR 200 HOH OT 85 -8.34000000e-01 15.9994 0 + 1457 WATR 200 HOH HT 84 4.17000000e-01 1.008 0 + 1458 WATR 200 HOH HT 84 4.17000000e-01 1.008 0 + 1459 WATR 201 HOH OT 85 -8.34000000e-01 15.9994 0 + 1460 WATR 201 HOH HT 84 4.17000000e-01 1.008 0 + 1461 WATR 201 HOH HT 84 4.17000000e-01 1.008 0 + 1462 WATR 202 HOH OT 85 -8.34000000e-01 15.9994 0 + 1463 WATR 202 HOH HT 84 4.17000000e-01 1.008 0 + 1464 WATR 202 HOH HT 84 4.17000000e-01 1.008 0 + 1465 WATR 203 HOH OT 85 -8.34000000e-01 15.9994 0 + 1466 WATR 203 HOH HT 84 4.17000000e-01 1.008 0 + 1467 WATR 203 HOH HT 84 4.17000000e-01 1.008 0 + 1468 WATR 204 HOH OT 85 -8.34000000e-01 15.9994 0 + 1469 WATR 204 HOH HT 84 4.17000000e-01 1.008 0 + 1470 WATR 204 HOH HT 84 4.17000000e-01 1.008 0 + 1471 WATR 205 HOH OT 85 -8.34000000e-01 15.9994 0 + 1472 WATR 205 HOH HT 84 4.17000000e-01 1.008 0 + 1473 WATR 205 HOH HT 84 4.17000000e-01 1.008 0 + 1474 WATR 206 HOH OT 85 -8.34000000e-01 15.9994 0 + 1475 WATR 206 HOH HT 84 4.17000000e-01 1.008 0 + 1476 WATR 206 HOH HT 84 4.17000000e-01 1.008 0 + 1477 WATR 207 HOH OT 85 -8.34000000e-01 15.9994 0 + 1478 WATR 207 HOH HT 84 4.17000000e-01 1.008 0 + 1479 WATR 207 HOH HT 84 4.17000000e-01 1.008 0 + 1480 WATR 208 HOH OT 85 -8.34000000e-01 15.9994 0 + 1481 WATR 208 HOH HT 84 4.17000000e-01 1.008 0 + 1482 WATR 208 HOH HT 84 4.17000000e-01 1.008 0 + 1483 WATR 209 HOH OT 85 -8.34000000e-01 15.9994 0 + 1484 WATR 209 HOH HT 84 4.17000000e-01 1.008 0 + 1485 WATR 209 HOH HT 84 4.17000000e-01 1.008 0 + 1486 WATR 210 HOH OT 85 -8.34000000e-01 15.9994 0 + 1487 WATR 210 HOH HT 84 4.17000000e-01 1.008 0 + 1488 WATR 210 HOH HT 84 4.17000000e-01 1.008 0 + 1489 WATR 211 HOH OT 85 -8.34000000e-01 15.9994 0 + 1490 WATR 211 HOH HT 84 4.17000000e-01 1.008 0 + 1491 WATR 211 HOH HT 84 4.17000000e-01 1.008 0 + 1492 WATR 212 HOH OT 85 -8.34000000e-01 15.9994 0 + 1493 WATR 212 HOH HT 84 4.17000000e-01 1.008 0 + 1494 WATR 212 HOH HT 84 4.17000000e-01 1.008 0 + 1495 WATR 213 HOH OT 85 -8.34000000e-01 15.9994 0 + 1496 WATR 213 HOH HT 84 4.17000000e-01 1.008 0 + 1497 WATR 213 HOH HT 84 4.17000000e-01 1.008 0 + 1498 WATR 214 HOH OT 85 -8.34000000e-01 15.9994 0 + 1499 WATR 214 HOH HT 84 4.17000000e-01 1.008 0 + 1500 WATR 214 HOH HT 84 4.17000000e-01 1.008 0 + 1501 WATR 215 HOH OT 85 -8.34000000e-01 15.9994 0 + 1502 WATR 215 HOH HT 84 4.17000000e-01 1.008 0 + 1503 WATR 215 HOH HT 84 4.17000000e-01 1.008 0 + 1504 WATR 216 HOH OT 85 -8.34000000e-01 15.9994 0 + 1505 WATR 216 HOH HT 84 4.17000000e-01 1.008 0 + 1506 WATR 216 HOH HT 84 4.17000000e-01 1.008 0 + 1507 WATR 217 HOH OT 85 -8.34000000e-01 15.9994 0 + 1508 WATR 217 HOH HT 84 4.17000000e-01 1.008 0 + 1509 WATR 217 HOH HT 84 4.17000000e-01 1.008 0 + 1510 WATR 218 HOH OT 85 -8.34000000e-01 15.9994 0 + 1511 WATR 218 HOH HT 84 4.17000000e-01 1.008 0 + 1512 WATR 218 HOH HT 84 4.17000000e-01 1.008 0 + 1513 WATR 219 HOH OT 85 -8.34000000e-01 15.9994 0 + 1514 WATR 219 HOH HT 84 4.17000000e-01 1.008 0 + 1515 WATR 219 HOH HT 84 4.17000000e-01 1.008 0 + 1516 WATR 220 HOH OT 85 -8.34000000e-01 15.9994 0 + 1517 WATR 220 HOH HT 84 4.17000000e-01 1.008 0 + 1518 WATR 220 HOH HT 84 4.17000000e-01 1.008 0 + 1519 WATR 221 HOH OT 85 -8.34000000e-01 15.9994 0 + 1520 WATR 221 HOH HT 84 4.17000000e-01 1.008 0 + 1521 WATR 221 HOH HT 84 4.17000000e-01 1.008 0 + 1522 WATR 222 HOH OT 85 -8.34000000e-01 15.9994 0 + 1523 WATR 222 HOH HT 84 4.17000000e-01 1.008 0 + 1524 WATR 222 HOH HT 84 4.17000000e-01 1.008 0 + 1525 WATR 223 HOH OT 85 -8.34000000e-01 15.9994 0 + 1526 WATR 223 HOH HT 84 4.17000000e-01 1.008 0 + 1527 WATR 223 HOH HT 84 4.17000000e-01 1.008 0 + 1528 WATR 224 HOH OT 85 -8.34000000e-01 15.9994 0 + 1529 WATR 224 HOH HT 84 4.17000000e-01 1.008 0 + 1530 WATR 224 HOH HT 84 4.17000000e-01 1.008 0 + 1531 WATR 225 HOH OT 85 -8.34000000e-01 15.9994 0 + 1532 WATR 225 HOH HT 84 4.17000000e-01 1.008 0 + 1533 WATR 225 HOH HT 84 4.17000000e-01 1.008 0 + 1534 WATR 226 HOH OT 85 -8.34000000e-01 15.9994 0 + 1535 WATR 226 HOH HT 84 4.17000000e-01 1.008 0 + 1536 WATR 226 HOH HT 84 4.17000000e-01 1.008 0 + 1537 WATR 227 HOH OT 85 -8.34000000e-01 15.9994 0 + 1538 WATR 227 HOH HT 84 4.17000000e-01 1.008 0 + 1539 WATR 227 HOH HT 84 4.17000000e-01 1.008 0 + 1540 WATR 228 HOH OT 85 -8.34000000e-01 15.9994 0 + 1541 WATR 228 HOH HT 84 4.17000000e-01 1.008 0 + 1542 WATR 228 HOH HT 84 4.17000000e-01 1.008 0 + 1543 WATR 229 HOH OT 85 -8.34000000e-01 15.9994 0 + 1544 WATR 229 HOH HT 84 4.17000000e-01 1.008 0 + 1545 WATR 229 HOH HT 84 4.17000000e-01 1.008 0 + 1546 WATR 230 HOH OT 85 -8.34000000e-01 15.9994 0 + 1547 WATR 230 HOH HT 84 4.17000000e-01 1.008 0 + 1548 WATR 230 HOH HT 84 4.17000000e-01 1.008 0 + 1549 WATR 231 HOH OT 85 -8.34000000e-01 15.9994 0 + 1550 WATR 231 HOH HT 84 4.17000000e-01 1.008 0 + 1551 WATR 231 HOH HT 84 4.17000000e-01 1.008 0 + 1552 WATR 232 HOH OT 85 -8.34000000e-01 15.9994 0 + 1553 WATR 232 HOH HT 84 4.17000000e-01 1.008 0 + 1554 WATR 232 HOH HT 84 4.17000000e-01 1.008 0 + 1555 WATR 233 HOH OT 85 -8.34000000e-01 15.9994 0 + 1556 WATR 233 HOH HT 84 4.17000000e-01 1.008 0 + 1557 WATR 233 HOH HT 84 4.17000000e-01 1.008 0 + 1558 WATR 234 HOH OT 85 -8.34000000e-01 15.9994 0 + 1559 WATR 234 HOH HT 84 4.17000000e-01 1.008 0 + 1560 WATR 234 HOH HT 84 4.17000000e-01 1.008 0 + 1561 WATR 235 HOH OT 85 -8.34000000e-01 15.9994 0 + 1562 WATR 235 HOH HT 84 4.17000000e-01 1.008 0 + 1563 WATR 235 HOH HT 84 4.17000000e-01 1.008 0 + 1564 WATR 236 HOH OT 85 -8.34000000e-01 15.9994 0 + 1565 WATR 236 HOH HT 84 4.17000000e-01 1.008 0 + 1566 WATR 236 HOH HT 84 4.17000000e-01 1.008 0 + 1567 WATR 237 HOH OT 85 -8.34000000e-01 15.9994 0 + 1568 WATR 237 HOH HT 84 4.17000000e-01 1.008 0 + 1569 WATR 237 HOH HT 84 4.17000000e-01 1.008 0 + 1570 WATR 238 HOH OT 85 -8.34000000e-01 15.9994 0 + 1571 WATR 238 HOH HT 84 4.17000000e-01 1.008 0 + 1572 WATR 238 HOH HT 84 4.17000000e-01 1.008 0 + 1573 WATR 239 HOH OT 85 -8.34000000e-01 15.9994 0 + 1574 WATR 239 HOH HT 84 4.17000000e-01 1.008 0 + 1575 WATR 239 HOH HT 84 4.17000000e-01 1.008 0 + 1576 WATR 240 HOH OT 85 -8.34000000e-01 15.9994 0 + 1577 WATR 240 HOH HT 84 4.17000000e-01 1.008 0 + 1578 WATR 240 HOH HT 84 4.17000000e-01 1.008 0 + 1579 WATR 241 HOH OT 85 -8.34000000e-01 15.9994 0 + 1580 WATR 241 HOH HT 84 4.17000000e-01 1.008 0 + 1581 WATR 241 HOH HT 84 4.17000000e-01 1.008 0 + 1582 WATR 242 HOH OT 85 -8.34000000e-01 15.9994 0 + 1583 WATR 242 HOH HT 84 4.17000000e-01 1.008 0 + 1584 WATR 242 HOH HT 84 4.17000000e-01 1.008 0 + 1585 WATR 243 HOH OT 85 -8.34000000e-01 15.9994 0 + 1586 WATR 243 HOH HT 84 4.17000000e-01 1.008 0 + 1587 WATR 243 HOH HT 84 4.17000000e-01 1.008 0 + 1588 WATR 244 HOH OT 85 -8.34000000e-01 15.9994 0 + 1589 WATR 244 HOH HT 84 4.17000000e-01 1.008 0 + 1590 WATR 244 HOH HT 84 4.17000000e-01 1.008 0 + 1591 WATR 245 HOH OT 85 -8.34000000e-01 15.9994 0 + 1592 WATR 245 HOH HT 84 4.17000000e-01 1.008 0 + 1593 WATR 245 HOH HT 84 4.17000000e-01 1.008 0 + 1594 WATR 246 HOH OT 85 -8.34000000e-01 15.9994 0 + 1595 WATR 246 HOH HT 84 4.17000000e-01 1.008 0 + 1596 WATR 246 HOH HT 84 4.17000000e-01 1.008 0 + 1597 WATR 247 HOH OT 85 -8.34000000e-01 15.9994 0 + 1598 WATR 247 HOH HT 84 4.17000000e-01 1.008 0 + 1599 WATR 247 HOH HT 84 4.17000000e-01 1.008 0 + 1600 WATR 248 HOH OT 85 -8.34000000e-01 15.9994 0 + 1601 WATR 248 HOH HT 84 4.17000000e-01 1.008 0 + 1602 WATR 248 HOH HT 84 4.17000000e-01 1.008 0 + 1603 WATR 249 HOH OT 85 -8.34000000e-01 15.9994 0 + 1604 WATR 249 HOH HT 84 4.17000000e-01 1.008 0 + 1605 WATR 249 HOH HT 84 4.17000000e-01 1.008 0 + 1606 WATR 250 HOH OT 85 -8.34000000e-01 15.9994 0 + 1607 WATR 250 HOH HT 84 4.17000000e-01 1.008 0 + 1608 WATR 250 HOH HT 84 4.17000000e-01 1.008 0 + 1609 WATR 251 HOH OT 85 -8.34000000e-01 15.9994 0 + 1610 WATR 251 HOH HT 84 4.17000000e-01 1.008 0 + 1611 WATR 251 HOH HT 84 4.17000000e-01 1.008 0 + 1612 WATR 252 HOH OT 85 -8.34000000e-01 15.9994 0 + 1613 WATR 252 HOH HT 84 4.17000000e-01 1.008 0 + 1614 WATR 252 HOH HT 84 4.17000000e-01 1.008 0 + 1615 WATR 253 HOH OT 85 -8.34000000e-01 15.9994 0 + 1616 WATR 253 HOH HT 84 4.17000000e-01 1.008 0 + 1617 WATR 253 HOH HT 84 4.17000000e-01 1.008 0 + 1618 WATR 254 HOH OT 85 -8.34000000e-01 15.9994 0 + 1619 WATR 254 HOH HT 84 4.17000000e-01 1.008 0 + 1620 WATR 254 HOH HT 84 4.17000000e-01 1.008 0 + 1621 WATR 255 HOH OT 85 -8.34000000e-01 15.9994 0 + 1622 WATR 255 HOH HT 84 4.17000000e-01 1.008 0 + 1623 WATR 255 HOH HT 84 4.17000000e-01 1.008 0 + 1624 WATR 256 HOH OT 85 -8.34000000e-01 15.9994 0 + 1625 WATR 256 HOH HT 84 4.17000000e-01 1.008 0 + 1626 WATR 256 HOH HT 84 4.17000000e-01 1.008 0 + 1627 WATR 257 HOH OT 85 -8.34000000e-01 15.9994 0 + 1628 WATR 257 HOH HT 84 4.17000000e-01 1.008 0 + 1629 WATR 257 HOH HT 84 4.17000000e-01 1.008 0 + 1630 WATR 258 HOH OT 85 -8.34000000e-01 15.9994 0 + 1631 WATR 258 HOH HT 84 4.17000000e-01 1.008 0 + 1632 WATR 258 HOH HT 84 4.17000000e-01 1.008 0 + 1633 WATR 259 HOH OT 85 -8.34000000e-01 15.9994 0 + 1634 WATR 259 HOH HT 84 4.17000000e-01 1.008 0 + 1635 WATR 259 HOH HT 84 4.17000000e-01 1.008 0 + 1636 WATR 260 HOH OT 85 -8.34000000e-01 15.9994 0 + 1637 WATR 260 HOH HT 84 4.17000000e-01 1.008 0 + 1638 WATR 260 HOH HT 84 4.17000000e-01 1.008 0 + 1639 WATR 261 HOH OT 85 -8.34000000e-01 15.9994 0 + 1640 WATR 261 HOH HT 84 4.17000000e-01 1.008 0 + 1641 WATR 261 HOH HT 84 4.17000000e-01 1.008 0 + 1642 WATR 262 HOH OT 85 -8.34000000e-01 15.9994 0 + 1643 WATR 262 HOH HT 84 4.17000000e-01 1.008 0 + 1644 WATR 262 HOH HT 84 4.17000000e-01 1.008 0 + 1645 WATR 263 HOH OT 85 -8.34000000e-01 15.9994 0 + 1646 WATR 263 HOH HT 84 4.17000000e-01 1.008 0 + 1647 WATR 263 HOH HT 84 4.17000000e-01 1.008 0 + 1648 WATR 264 HOH OT 85 -8.34000000e-01 15.9994 0 + 1649 WATR 264 HOH HT 84 4.17000000e-01 1.008 0 + 1650 WATR 264 HOH HT 84 4.17000000e-01 1.008 0 + 1651 WATR 265 HOH OT 85 -8.34000000e-01 15.9994 0 + 1652 WATR 265 HOH HT 84 4.17000000e-01 1.008 0 + 1653 WATR 265 HOH HT 84 4.17000000e-01 1.008 0 + 1654 WATR 266 HOH OT 85 -8.34000000e-01 15.9994 0 + 1655 WATR 266 HOH HT 84 4.17000000e-01 1.008 0 + 1656 WATR 266 HOH HT 84 4.17000000e-01 1.008 0 + 1657 WATR 267 HOH OT 85 -8.34000000e-01 15.9994 0 + 1658 WATR 267 HOH HT 84 4.17000000e-01 1.008 0 + 1659 WATR 267 HOH HT 84 4.17000000e-01 1.008 0 + 1660 WATR 268 HOH OT 85 -8.34000000e-01 15.9994 0 + 1661 WATR 268 HOH HT 84 4.17000000e-01 1.008 0 + 1662 WATR 268 HOH HT 84 4.17000000e-01 1.008 0 + 1663 WATR 269 HOH OT 85 -8.34000000e-01 15.9994 0 + 1664 WATR 269 HOH HT 84 4.17000000e-01 1.008 0 + 1665 WATR 269 HOH HT 84 4.17000000e-01 1.008 0 + 1666 WATR 270 HOH OT 85 -8.34000000e-01 15.9994 0 + 1667 WATR 270 HOH HT 84 4.17000000e-01 1.008 0 + 1668 WATR 270 HOH HT 84 4.17000000e-01 1.008 0 + 1669 WATR 271 HOH OT 85 -8.34000000e-01 15.9994 0 + 1670 WATR 271 HOH HT 84 4.17000000e-01 1.008 0 + 1671 WATR 271 HOH HT 84 4.17000000e-01 1.008 0 + 1672 WATR 272 HOH OT 85 -8.34000000e-01 15.9994 0 + 1673 WATR 272 HOH HT 84 4.17000000e-01 1.008 0 + 1674 WATR 272 HOH HT 84 4.17000000e-01 1.008 0 + 1675 WATR 273 HOH OT 85 -8.34000000e-01 15.9994 0 + 1676 WATR 273 HOH HT 84 4.17000000e-01 1.008 0 + 1677 WATR 273 HOH HT 84 4.17000000e-01 1.008 0 + 1678 WATR 274 HOH OT 85 -8.34000000e-01 15.9994 0 + 1679 WATR 274 HOH HT 84 4.17000000e-01 1.008 0 + 1680 WATR 274 HOH HT 84 4.17000000e-01 1.008 0 + 1681 WATR 275 HOH OT 85 -8.34000000e-01 15.9994 0 + 1682 WATR 275 HOH HT 84 4.17000000e-01 1.008 0 + 1683 WATR 275 HOH HT 84 4.17000000e-01 1.008 0 + 1684 WATR 276 HOH OT 85 -8.34000000e-01 15.9994 0 + 1685 WATR 276 HOH HT 84 4.17000000e-01 1.008 0 + 1686 WATR 276 HOH HT 84 4.17000000e-01 1.008 0 + 1687 WATR 277 HOH OT 85 -8.34000000e-01 15.9994 0 + 1688 WATR 277 HOH HT 84 4.17000000e-01 1.008 0 + 1689 WATR 277 HOH HT 84 4.17000000e-01 1.008 0 + 1690 WATR 278 HOH OT 85 -8.34000000e-01 15.9994 0 + 1691 WATR 278 HOH HT 84 4.17000000e-01 1.008 0 + 1692 WATR 278 HOH HT 84 4.17000000e-01 1.008 0 + 1693 WATR 279 HOH OT 85 -8.34000000e-01 15.9994 0 + 1694 WATR 279 HOH HT 84 4.17000000e-01 1.008 0 + 1695 WATR 279 HOH HT 84 4.17000000e-01 1.008 0 + 1696 WATR 280 HOH OT 85 -8.34000000e-01 15.9994 0 + 1697 WATR 280 HOH HT 84 4.17000000e-01 1.008 0 + 1698 WATR 280 HOH HT 84 4.17000000e-01 1.008 0 + 1699 WATR 281 HOH OT 85 -8.34000000e-01 15.9994 0 + 1700 WATR 281 HOH HT 84 4.17000000e-01 1.008 0 + 1701 WATR 281 HOH HT 84 4.17000000e-01 1.008 0 + 1702 WATR 282 HOH OT 85 -8.34000000e-01 15.9994 0 + 1703 WATR 282 HOH HT 84 4.17000000e-01 1.008 0 + 1704 WATR 282 HOH HT 84 4.17000000e-01 1.008 0 + 1705 WATR 283 HOH OT 85 -8.34000000e-01 15.9994 0 + 1706 WATR 283 HOH HT 84 4.17000000e-01 1.008 0 + 1707 WATR 283 HOH HT 84 4.17000000e-01 1.008 0 + 1708 WATR 284 HOH OT 85 -8.34000000e-01 15.9994 0 + 1709 WATR 284 HOH HT 84 4.17000000e-01 1.008 0 + 1710 WATR 284 HOH HT 84 4.17000000e-01 1.008 0 + 1711 WATR 285 HOH OT 85 -8.34000000e-01 15.9994 0 + 1712 WATR 285 HOH HT 84 4.17000000e-01 1.008 0 + 1713 WATR 285 HOH HT 84 4.17000000e-01 1.008 0 + 1714 WATR 286 HOH OT 85 -8.34000000e-01 15.9994 0 + 1715 WATR 286 HOH HT 84 4.17000000e-01 1.008 0 + 1716 WATR 286 HOH HT 84 4.17000000e-01 1.008 0 + 1717 WATR 287 HOH OT 85 -8.34000000e-01 15.9994 0 + 1718 WATR 287 HOH HT 84 4.17000000e-01 1.008 0 + 1719 WATR 287 HOH HT 84 4.17000000e-01 1.008 0 + 1720 WATR 288 HOH OT 85 -8.34000000e-01 15.9994 0 + 1721 WATR 288 HOH HT 84 4.17000000e-01 1.008 0 + 1722 WATR 288 HOH HT 84 4.17000000e-01 1.008 0 + 1723 WATR 289 HOH OT 85 -8.34000000e-01 15.9994 0 + 1724 WATR 289 HOH HT 84 4.17000000e-01 1.008 0 + 1725 WATR 289 HOH HT 84 4.17000000e-01 1.008 0 + 1726 WATR 290 HOH OT 85 -8.34000000e-01 15.9994 0 + 1727 WATR 290 HOH HT 84 4.17000000e-01 1.008 0 + 1728 WATR 290 HOH HT 84 4.17000000e-01 1.008 0 + 1729 WATR 291 HOH OT 85 -8.34000000e-01 15.9994 0 + 1730 WATR 291 HOH HT 84 4.17000000e-01 1.008 0 + 1731 WATR 291 HOH HT 84 4.17000000e-01 1.008 0 + 1732 WATR 292 HOH OT 85 -8.34000000e-01 15.9994 0 + 1733 WATR 292 HOH HT 84 4.17000000e-01 1.008 0 + 1734 WATR 292 HOH HT 84 4.17000000e-01 1.008 0 + 1735 WATR 293 HOH OT 85 -8.34000000e-01 15.9994 0 + 1736 WATR 293 HOH HT 84 4.17000000e-01 1.008 0 + 1737 WATR 293 HOH HT 84 4.17000000e-01 1.008 0 + 1738 WATR 294 HOH OT 85 -8.34000000e-01 15.9994 0 + 1739 WATR 294 HOH HT 84 4.17000000e-01 1.008 0 + 1740 WATR 294 HOH HT 84 4.17000000e-01 1.008 0 + 1741 WATR 295 HOH OT 85 -8.34000000e-01 15.9994 0 + 1742 WATR 295 HOH HT 84 4.17000000e-01 1.008 0 + 1743 WATR 295 HOH HT 84 4.17000000e-01 1.008 0 + 1744 WATR 296 HOH OT 85 -8.34000000e-01 15.9994 0 + 1745 WATR 296 HOH HT 84 4.17000000e-01 1.008 0 + 1746 WATR 296 HOH HT 84 4.17000000e-01 1.008 0 + 1747 WATR 297 HOH OT 85 -8.34000000e-01 15.9994 0 + 1748 WATR 297 HOH HT 84 4.17000000e-01 1.008 0 + 1749 WATR 297 HOH HT 84 4.17000000e-01 1.008 0 + 1750 WATR 298 HOH OT 85 -8.34000000e-01 15.9994 0 + 1751 WATR 298 HOH HT 84 4.17000000e-01 1.008 0 + 1752 WATR 298 HOH HT 84 4.17000000e-01 1.008 0 + 1753 WATR 299 HOH OT 85 -8.34000000e-01 15.9994 0 + 1754 WATR 299 HOH HT 84 4.17000000e-01 1.008 0 + 1755 WATR 299 HOH HT 84 4.17000000e-01 1.008 0 + 1756 WATR 300 HOH OT 85 -8.34000000e-01 15.9994 0 + 1757 WATR 300 HOH HT 84 4.17000000e-01 1.008 0 + 1758 WATR 300 HOH HT 84 4.17000000e-01 1.008 0 + 1759 WATR 301 HOH OT 85 -8.34000000e-01 15.9994 0 + 1760 WATR 301 HOH HT 84 4.17000000e-01 1.008 0 + 1761 WATR 301 HOH HT 84 4.17000000e-01 1.008 0 + 1762 WATR 302 HOH OT 85 -8.34000000e-01 15.9994 0 + 1763 WATR 302 HOH HT 84 4.17000000e-01 1.008 0 + 1764 WATR 302 HOH HT 84 4.17000000e-01 1.008 0 + 1765 WATR 303 HOH OT 85 -8.34000000e-01 15.9994 0 + 1766 WATR 303 HOH HT 84 4.17000000e-01 1.008 0 + 1767 WATR 303 HOH HT 84 4.17000000e-01 1.008 0 + 1768 WATR 304 HOH OT 85 -8.34000000e-01 15.9994 0 + 1769 WATR 304 HOH HT 84 4.17000000e-01 1.008 0 + 1770 WATR 304 HOH HT 84 4.17000000e-01 1.008 0 + 1771 WATR 305 HOH OT 85 -8.34000000e-01 15.9994 0 + 1772 WATR 305 HOH HT 84 4.17000000e-01 1.008 0 + 1773 WATR 305 HOH HT 84 4.17000000e-01 1.008 0 + 1774 WATR 306 HOH OT 85 -8.34000000e-01 15.9994 0 + 1775 WATR 306 HOH HT 84 4.17000000e-01 1.008 0 + 1776 WATR 306 HOH HT 84 4.17000000e-01 1.008 0 + 1777 WATR 307 HOH OT 85 -8.34000000e-01 15.9994 0 + 1778 WATR 307 HOH HT 84 4.17000000e-01 1.008 0 + 1779 WATR 307 HOH HT 84 4.17000000e-01 1.008 0 + 1780 WATR 308 HOH OT 85 -8.34000000e-01 15.9994 0 + 1781 WATR 308 HOH HT 84 4.17000000e-01 1.008 0 + 1782 WATR 308 HOH HT 84 4.17000000e-01 1.008 0 + 1783 WATR 309 HOH OT 85 -8.34000000e-01 15.9994 0 + 1784 WATR 309 HOH HT 84 4.17000000e-01 1.008 0 + 1785 WATR 309 HOH HT 84 4.17000000e-01 1.008 0 + 1786 WATR 310 HOH OT 85 -8.34000000e-01 15.9994 0 + 1787 WATR 310 HOH HT 84 4.17000000e-01 1.008 0 + 1788 WATR 310 HOH HT 84 4.17000000e-01 1.008 0 + 1789 WATR 311 HOH OT 85 -8.34000000e-01 15.9994 0 + 1790 WATR 311 HOH HT 84 4.17000000e-01 1.008 0 + 1791 WATR 311 HOH HT 84 4.17000000e-01 1.008 0 + 1792 WATR 312 HOH OT 85 -8.34000000e-01 15.9994 0 + 1793 WATR 312 HOH HT 84 4.17000000e-01 1.008 0 + 1794 WATR 312 HOH HT 84 4.17000000e-01 1.008 0 + 1795 WATR 313 HOH OT 85 -8.34000000e-01 15.9994 0 + 1796 WATR 313 HOH HT 84 4.17000000e-01 1.008 0 + 1797 WATR 313 HOH HT 84 4.17000000e-01 1.008 0 + 1798 WATR 314 HOH OT 85 -8.34000000e-01 15.9994 0 + 1799 WATR 314 HOH HT 84 4.17000000e-01 1.008 0 + 1800 WATR 314 HOH HT 84 4.17000000e-01 1.008 0 + 1801 WATR 315 HOH OT 85 -8.34000000e-01 15.9994 0 + 1802 WATR 315 HOH HT 84 4.17000000e-01 1.008 0 + 1803 WATR 315 HOH HT 84 4.17000000e-01 1.008 0 + 1804 SALT 4 ION SOD 87 1.00000000e+00 22.9897 0 + 1805 WATR 316 HOH OT 85 -8.34000000e-01 15.9994 0 + 1806 WATR 316 HOH HT 84 4.17000000e-01 1.008 0 + 1807 WATR 316 HOH HT 84 4.17000000e-01 1.008 0 + 1808 WATR 317 HOH OT 85 -8.34000000e-01 15.9994 0 + 1809 WATR 317 HOH HT 84 4.17000000e-01 1.008 0 + 1810 WATR 317 HOH HT 84 4.17000000e-01 1.008 0 + 1811 WATR 318 HOH OT 85 -8.34000000e-01 15.9994 0 + 1812 WATR 318 HOH HT 84 4.17000000e-01 1.008 0 + 1813 WATR 318 HOH HT 84 4.17000000e-01 1.008 0 + 1814 WATR 319 HOH OT 85 -8.34000000e-01 15.9994 0 + 1815 WATR 319 HOH HT 84 4.17000000e-01 1.008 0 + 1816 WATR 319 HOH HT 84 4.17000000e-01 1.008 0 + 1817 WATR 320 HOH OT 85 -8.34000000e-01 15.9994 0 + 1818 WATR 320 HOH HT 84 4.17000000e-01 1.008 0 + 1819 WATR 320 HOH HT 84 4.17000000e-01 1.008 0 + 1820 WATR 321 HOH OT 85 -8.34000000e-01 15.9994 0 + 1821 WATR 321 HOH HT 84 4.17000000e-01 1.008 0 + 1822 WATR 321 HOH HT 84 4.17000000e-01 1.008 0 + 1823 WATR 322 HOH OT 85 -8.34000000e-01 15.9994 0 + 1824 WATR 322 HOH HT 84 4.17000000e-01 1.008 0 + 1825 WATR 322 HOH HT 84 4.17000000e-01 1.008 0 + 1826 WATR 323 HOH OT 85 -8.34000000e-01 15.9994 0 + 1827 WATR 323 HOH HT 84 4.17000000e-01 1.008 0 + 1828 WATR 323 HOH HT 84 4.17000000e-01 1.008 0 + 1829 WATR 324 HOH OT 85 -8.34000000e-01 15.9994 0 + 1830 WATR 324 HOH HT 84 4.17000000e-01 1.008 0 + 1831 WATR 324 HOH HT 84 4.17000000e-01 1.008 0 + 1832 WATR 325 HOH OT 85 -8.34000000e-01 15.9994 0 + 1833 WATR 325 HOH HT 84 4.17000000e-01 1.008 0 + 1834 WATR 325 HOH HT 84 4.17000000e-01 1.008 0 + 1835 WATR 326 HOH OT 85 -8.34000000e-01 15.9994 0 + 1836 WATR 326 HOH HT 84 4.17000000e-01 1.008 0 + 1837 WATR 326 HOH HT 84 4.17000000e-01 1.008 0 + 1838 WATR 327 HOH OT 85 -8.34000000e-01 15.9994 0 + 1839 WATR 327 HOH HT 84 4.17000000e-01 1.008 0 + 1840 WATR 327 HOH HT 84 4.17000000e-01 1.008 0 + 1841 WATR 328 HOH OT 85 -8.34000000e-01 15.9994 0 + 1842 WATR 328 HOH HT 84 4.17000000e-01 1.008 0 + 1843 WATR 328 HOH HT 84 4.17000000e-01 1.008 0 + 1844 WATR 329 HOH OT 85 -8.34000000e-01 15.9994 0 + 1845 WATR 329 HOH HT 84 4.17000000e-01 1.008 0 + 1846 WATR 329 HOH HT 84 4.17000000e-01 1.008 0 + 1847 WATR 330 HOH OT 85 -8.34000000e-01 15.9994 0 + 1848 WATR 330 HOH HT 84 4.17000000e-01 1.008 0 + 1849 WATR 330 HOH HT 84 4.17000000e-01 1.008 0 + 1850 WATR 331 HOH OT 85 -8.34000000e-01 15.9994 0 + 1851 WATR 331 HOH HT 84 4.17000000e-01 1.008 0 + 1852 WATR 331 HOH HT 84 4.17000000e-01 1.008 0 + 1853 WATR 332 HOH OT 85 -8.34000000e-01 15.9994 0 + 1854 WATR 332 HOH HT 84 4.17000000e-01 1.008 0 + 1855 WATR 332 HOH HT 84 4.17000000e-01 1.008 0 + 1856 WATR 333 HOH OT 85 -8.34000000e-01 15.9994 0 + 1857 WATR 333 HOH HT 84 4.17000000e-01 1.008 0 + 1858 WATR 333 HOH HT 84 4.17000000e-01 1.008 0 + 1859 WATR 334 HOH OT 85 -8.34000000e-01 15.9994 0 + 1860 WATR 334 HOH HT 84 4.17000000e-01 1.008 0 + 1861 WATR 334 HOH HT 84 4.17000000e-01 1.008 0 + 1862 WATR 335 HOH OT 85 -8.34000000e-01 15.9994 0 + 1863 WATR 335 HOH HT 84 4.17000000e-01 1.008 0 + 1864 WATR 335 HOH HT 84 4.17000000e-01 1.008 0 + 1865 WATR 336 HOH OT 85 -8.34000000e-01 15.9994 0 + 1866 WATR 336 HOH HT 84 4.17000000e-01 1.008 0 + 1867 WATR 336 HOH HT 84 4.17000000e-01 1.008 0 + 1868 WATR 337 HOH OT 85 -8.34000000e-01 15.9994 0 + 1869 WATR 337 HOH HT 84 4.17000000e-01 1.008 0 + 1870 WATR 337 HOH HT 84 4.17000000e-01 1.008 0 + 1871 WATR 338 HOH OT 85 -8.34000000e-01 15.9994 0 + 1872 WATR 338 HOH HT 84 4.17000000e-01 1.008 0 + 1873 WATR 338 HOH HT 84 4.17000000e-01 1.008 0 + 1874 WATR 339 HOH OT 85 -8.34000000e-01 15.9994 0 + 1875 WATR 339 HOH HT 84 4.17000000e-01 1.008 0 + 1876 WATR 339 HOH HT 84 4.17000000e-01 1.008 0 + 1877 WATR 340 HOH OT 85 -8.34000000e-01 15.9994 0 + 1878 WATR 340 HOH HT 84 4.17000000e-01 1.008 0 + 1879 WATR 340 HOH HT 84 4.17000000e-01 1.008 0 + 1880 WATR 341 HOH OT 85 -8.34000000e-01 15.9994 0 + 1881 WATR 341 HOH HT 84 4.17000000e-01 1.008 0 + 1882 WATR 341 HOH HT 84 4.17000000e-01 1.008 0 + 1883 WATR 342 HOH OT 85 -8.34000000e-01 15.9994 0 + 1884 WATR 342 HOH HT 84 4.17000000e-01 1.008 0 + 1885 WATR 342 HOH HT 84 4.17000000e-01 1.008 0 + 1886 WATR 343 HOH OT 85 -8.34000000e-01 15.9994 0 + 1887 WATR 343 HOH HT 84 4.17000000e-01 1.008 0 + 1888 WATR 343 HOH HT 84 4.17000000e-01 1.008 0 + 1889 WATR 344 HOH OT 85 -8.34000000e-01 15.9994 0 + 1890 WATR 344 HOH HT 84 4.17000000e-01 1.008 0 + 1891 WATR 344 HOH HT 84 4.17000000e-01 1.008 0 + 1892 WATR 345 HOH OT 85 -8.34000000e-01 15.9994 0 + 1893 WATR 345 HOH HT 84 4.17000000e-01 1.008 0 + 1894 WATR 345 HOH HT 84 4.17000000e-01 1.008 0 + 1895 WATR 346 HOH OT 85 -8.34000000e-01 15.9994 0 + 1896 WATR 346 HOH HT 84 4.17000000e-01 1.008 0 + 1897 WATR 346 HOH HT 84 4.17000000e-01 1.008 0 + 1898 WATR 347 HOH OT 85 -8.34000000e-01 15.9994 0 + 1899 WATR 347 HOH HT 84 4.17000000e-01 1.008 0 + 1900 WATR 347 HOH HT 84 4.17000000e-01 1.008 0 + 1901 WATR 348 HOH OT 85 -8.34000000e-01 15.9994 0 + 1902 WATR 348 HOH HT 84 4.17000000e-01 1.008 0 + 1903 WATR 348 HOH HT 84 4.17000000e-01 1.008 0 + 1904 WATR 349 HOH OT 85 -8.34000000e-01 15.9994 0 + 1905 WATR 349 HOH HT 84 4.17000000e-01 1.008 0 + 1906 WATR 349 HOH HT 84 4.17000000e-01 1.008 0 + 1907 WATR 350 HOH OT 85 -8.34000000e-01 15.9994 0 + 1908 WATR 350 HOH HT 84 4.17000000e-01 1.008 0 + 1909 WATR 350 HOH HT 84 4.17000000e-01 1.008 0 + 1910 WATR 351 HOH OT 85 -8.34000000e-01 15.9994 0 + 1911 WATR 351 HOH HT 84 4.17000000e-01 1.008 0 + 1912 WATR 351 HOH HT 84 4.17000000e-01 1.008 0 + 1913 WATR 352 HOH OT 85 -8.34000000e-01 15.9994 0 + 1914 WATR 352 HOH HT 84 4.17000000e-01 1.008 0 + 1915 WATR 352 HOH HT 84 4.17000000e-01 1.008 0 + 1916 WATR 353 HOH OT 85 -8.34000000e-01 15.9994 0 + 1917 WATR 353 HOH HT 84 4.17000000e-01 1.008 0 + 1918 WATR 353 HOH HT 84 4.17000000e-01 1.008 0 + 1919 WATR 354 HOH OT 85 -8.34000000e-01 15.9994 0 + 1920 WATR 354 HOH HT 84 4.17000000e-01 1.008 0 + 1921 WATR 354 HOH HT 84 4.17000000e-01 1.008 0 + 1922 WATR 355 HOH OT 85 -8.34000000e-01 15.9994 0 + 1923 WATR 355 HOH HT 84 4.17000000e-01 1.008 0 + 1924 WATR 355 HOH HT 84 4.17000000e-01 1.008 0 + 1925 WATR 356 HOH OT 85 -8.34000000e-01 15.9994 0 + 1926 WATR 356 HOH HT 84 4.17000000e-01 1.008 0 + 1927 WATR 356 HOH HT 84 4.17000000e-01 1.008 0 + 1928 WATR 357 HOH OT 85 -8.34000000e-01 15.9994 0 + 1929 WATR 357 HOH HT 84 4.17000000e-01 1.008 0 + 1930 WATR 357 HOH HT 84 4.17000000e-01 1.008 0 + 1931 WATR 358 HOH OT 85 -8.34000000e-01 15.9994 0 + 1932 WATR 358 HOH HT 84 4.17000000e-01 1.008 0 + 1933 WATR 358 HOH HT 84 4.17000000e-01 1.008 0 + 1934 WATR 359 HOH OT 85 -8.34000000e-01 15.9994 0 + 1935 WATR 359 HOH HT 84 4.17000000e-01 1.008 0 + 1936 WATR 359 HOH HT 84 4.17000000e-01 1.008 0 + 1937 WATR 360 HOH OT 85 -8.34000000e-01 15.9994 0 + 1938 WATR 360 HOH HT 84 4.17000000e-01 1.008 0 + 1939 WATR 360 HOH HT 84 4.17000000e-01 1.008 0 + 1940 WATR 361 HOH OT 85 -8.34000000e-01 15.9994 0 + 1941 WATR 361 HOH HT 84 4.17000000e-01 1.008 0 + 1942 WATR 361 HOH HT 84 4.17000000e-01 1.008 0 + 1943 WATR 362 HOH OT 85 -8.34000000e-01 15.9994 0 + 1944 WATR 362 HOH HT 84 4.17000000e-01 1.008 0 + 1945 WATR 362 HOH HT 84 4.17000000e-01 1.008 0 + 1946 WATR 363 HOH OT 85 -8.34000000e-01 15.9994 0 + 1947 WATR 363 HOH HT 84 4.17000000e-01 1.008 0 + 1948 WATR 363 HOH HT 84 4.17000000e-01 1.008 0 + 1949 WATR 364 HOH OT 85 -8.34000000e-01 15.9994 0 + 1950 WATR 364 HOH HT 84 4.17000000e-01 1.008 0 + 1951 WATR 364 HOH HT 84 4.17000000e-01 1.008 0 + 1952 WATR 365 HOH OT 85 -8.34000000e-01 15.9994 0 + 1953 WATR 365 HOH HT 84 4.17000000e-01 1.008 0 + 1954 WATR 365 HOH HT 84 4.17000000e-01 1.008 0 + 1955 WATR 366 HOH OT 85 -8.34000000e-01 15.9994 0 + 1956 WATR 366 HOH HT 84 4.17000000e-01 1.008 0 + 1957 WATR 366 HOH HT 84 4.17000000e-01 1.008 0 + 1958 WATR 367 HOH OT 85 -8.34000000e-01 15.9994 0 + 1959 WATR 367 HOH HT 84 4.17000000e-01 1.008 0 + 1960 WATR 367 HOH HT 84 4.17000000e-01 1.008 0 + 1961 WATR 368 HOH OT 85 -8.34000000e-01 15.9994 0 + 1962 WATR 368 HOH HT 84 4.17000000e-01 1.008 0 + 1963 WATR 368 HOH HT 84 4.17000000e-01 1.008 0 + 1964 WATR 369 HOH OT 85 -8.34000000e-01 15.9994 0 + 1965 WATR 369 HOH HT 84 4.17000000e-01 1.008 0 + 1966 WATR 369 HOH HT 84 4.17000000e-01 1.008 0 + 1967 WATR 370 HOH OT 85 -8.34000000e-01 15.9994 0 + 1968 WATR 370 HOH HT 84 4.17000000e-01 1.008 0 + 1969 WATR 370 HOH HT 84 4.17000000e-01 1.008 0 + 1970 WATR 371 HOH OT 85 -8.34000000e-01 15.9994 0 + 1971 WATR 371 HOH HT 84 4.17000000e-01 1.008 0 + 1972 WATR 371 HOH HT 84 4.17000000e-01 1.008 0 + 1973 WATR 372 HOH OT 85 -8.34000000e-01 15.9994 0 + 1974 WATR 372 HOH HT 84 4.17000000e-01 1.008 0 + 1975 WATR 372 HOH HT 84 4.17000000e-01 1.008 0 + 1976 WATR 373 HOH OT 85 -8.34000000e-01 15.9994 0 + 1977 WATR 373 HOH HT 84 4.17000000e-01 1.008 0 + 1978 WATR 373 HOH HT 84 4.17000000e-01 1.008 0 + 1979 WATR 374 HOH OT 85 -8.34000000e-01 15.9994 0 + 1980 WATR 374 HOH HT 84 4.17000000e-01 1.008 0 + 1981 WATR 374 HOH HT 84 4.17000000e-01 1.008 0 + 1982 WATR 375 HOH OT 85 -8.34000000e-01 15.9994 0 + 1983 WATR 375 HOH HT 84 4.17000000e-01 1.008 0 + 1984 WATR 375 HOH HT 84 4.17000000e-01 1.008 0 + 1985 WATR 376 HOH OT 85 -8.34000000e-01 15.9994 0 + 1986 WATR 376 HOH HT 84 4.17000000e-01 1.008 0 + 1987 WATR 376 HOH HT 84 4.17000000e-01 1.008 0 + 1988 WATR 377 HOH OT 85 -8.34000000e-01 15.9994 0 + 1989 WATR 377 HOH HT 84 4.17000000e-01 1.008 0 + 1990 WATR 377 HOH HT 84 4.17000000e-01 1.008 0 + 1991 WATR 378 HOH OT 85 -8.34000000e-01 15.9994 0 + 1992 WATR 378 HOH HT 84 4.17000000e-01 1.008 0 + 1993 WATR 378 HOH HT 84 4.17000000e-01 1.008 0 + 1994 WATR 379 HOH OT 85 -8.34000000e-01 15.9994 0 + 1995 WATR 379 HOH HT 84 4.17000000e-01 1.008 0 + 1996 WATR 379 HOH HT 84 4.17000000e-01 1.008 0 + 1997 WATR 380 HOH OT 85 -8.34000000e-01 15.9994 0 + 1998 WATR 380 HOH HT 84 4.17000000e-01 1.008 0 + 1999 WATR 380 HOH HT 84 4.17000000e-01 1.008 0 + 2000 WATR 381 HOH OT 85 -8.34000000e-01 15.9994 0 + 2001 WATR 381 HOH HT 84 4.17000000e-01 1.008 0 + 2002 WATR 381 HOH HT 84 4.17000000e-01 1.008 0 + 2003 WATR 382 HOH OT 85 -8.34000000e-01 15.9994 0 + 2004 WATR 382 HOH HT 84 4.17000000e-01 1.008 0 + 2005 WATR 382 HOH HT 84 4.17000000e-01 1.008 0 + 2006 WATR 383 HOH OT 85 -8.34000000e-01 15.9994 0 + 2007 WATR 383 HOH HT 84 4.17000000e-01 1.008 0 + 2008 WATR 383 HOH HT 84 4.17000000e-01 1.008 0 + 2009 WATR 384 HOH OT 85 -8.34000000e-01 15.9994 0 + 2010 WATR 384 HOH HT 84 4.17000000e-01 1.008 0 + 2011 WATR 384 HOH HT 84 4.17000000e-01 1.008 0 + 2012 WATR 385 HOH OT 85 -8.34000000e-01 15.9994 0 + 2013 WATR 385 HOH HT 84 4.17000000e-01 1.008 0 + 2014 WATR 385 HOH HT 84 4.17000000e-01 1.008 0 + 2015 WATR 386 HOH OT 85 -8.34000000e-01 15.9994 0 + 2016 WATR 386 HOH HT 84 4.17000000e-01 1.008 0 + 2017 WATR 386 HOH HT 84 4.17000000e-01 1.008 0 + 2018 WATR 387 HOH OT 85 -8.34000000e-01 15.9994 0 + 2019 WATR 387 HOH HT 84 4.17000000e-01 1.008 0 + 2020 WATR 387 HOH HT 84 4.17000000e-01 1.008 0 + 2021 WATR 388 HOH OT 85 -8.34000000e-01 15.9994 0 + 2022 WATR 388 HOH HT 84 4.17000000e-01 1.008 0 + 2023 WATR 388 HOH HT 84 4.17000000e-01 1.008 0 + 2024 WATR 389 HOH OT 85 -8.34000000e-01 15.9994 0 + 2025 WATR 389 HOH HT 84 4.17000000e-01 1.008 0 + 2026 WATR 389 HOH HT 84 4.17000000e-01 1.008 0 + 2027 WATR 390 HOH OT 85 -8.34000000e-01 15.9994 0 + 2028 WATR 390 HOH HT 84 4.17000000e-01 1.008 0 + 2029 WATR 390 HOH HT 84 4.17000000e-01 1.008 0 + 2030 WATR 391 HOH OT 85 -8.34000000e-01 15.9994 0 + 2031 WATR 391 HOH HT 84 4.17000000e-01 1.008 0 + 2032 WATR 391 HOH HT 84 4.17000000e-01 1.008 0 + 2033 WATR 392 HOH OT 85 -8.34000000e-01 15.9994 0 + 2034 WATR 392 HOH HT 84 4.17000000e-01 1.008 0 + 2035 WATR 392 HOH HT 84 4.17000000e-01 1.008 0 + 2036 WATR 393 HOH OT 85 -8.34000000e-01 15.9994 0 + 2037 WATR 393 HOH HT 84 4.17000000e-01 1.008 0 + 2038 WATR 393 HOH HT 84 4.17000000e-01 1.008 0 + 2039 WATR 394 HOH OT 85 -8.34000000e-01 15.9994 0 + 2040 WATR 394 HOH HT 84 4.17000000e-01 1.008 0 + 2041 WATR 394 HOH HT 84 4.17000000e-01 1.008 0 + 2042 WATR 395 HOH OT 85 -8.34000000e-01 15.9994 0 + 2043 WATR 395 HOH HT 84 4.17000000e-01 1.008 0 + 2044 WATR 395 HOH HT 84 4.17000000e-01 1.008 0 + 2045 WATR 396 HOH OT 85 -8.34000000e-01 15.9994 0 + 2046 WATR 396 HOH HT 84 4.17000000e-01 1.008 0 + 2047 WATR 396 HOH HT 84 4.17000000e-01 1.008 0 + 2048 WATR 397 HOH OT 85 -8.34000000e-01 15.9994 0 + 2049 WATR 397 HOH HT 84 4.17000000e-01 1.008 0 + 2050 WATR 397 HOH HT 84 4.17000000e-01 1.008 0 + 2051 WATR 398 HOH OT 85 -8.34000000e-01 15.9994 0 + 2052 WATR 398 HOH HT 84 4.17000000e-01 1.008 0 + 2053 WATR 398 HOH HT 84 4.17000000e-01 1.008 0 + 2054 WATR 399 HOH OT 85 -8.34000000e-01 15.9994 0 + 2055 WATR 399 HOH HT 84 4.17000000e-01 1.008 0 + 2056 WATR 399 HOH HT 84 4.17000000e-01 1.008 0 + 2057 WATR 400 HOH OT 85 -8.34000000e-01 15.9994 0 + 2058 WATR 400 HOH HT 84 4.17000000e-01 1.008 0 + 2059 WATR 400 HOH HT 84 4.17000000e-01 1.008 0 + 2060 WATR 401 HOH OT 85 -8.34000000e-01 15.9994 0 + 2061 WATR 401 HOH HT 84 4.17000000e-01 1.008 0 + 2062 WATR 401 HOH HT 84 4.17000000e-01 1.008 0 + 2063 WATR 402 HOH OT 85 -8.34000000e-01 15.9994 0 + 2064 WATR 402 HOH HT 84 4.17000000e-01 1.008 0 + 2065 WATR 402 HOH HT 84 4.17000000e-01 1.008 0 + 2066 WATR 403 HOH OT 85 -8.34000000e-01 15.9994 0 + 2067 WATR 403 HOH HT 84 4.17000000e-01 1.008 0 + 2068 WATR 403 HOH HT 84 4.17000000e-01 1.008 0 + 2069 WATR 404 HOH OT 85 -8.34000000e-01 15.9994 0 + 2070 WATR 404 HOH HT 84 4.17000000e-01 1.008 0 + 2071 WATR 404 HOH HT 84 4.17000000e-01 1.008 0 + 2072 WATR 405 HOH OT 85 -8.34000000e-01 15.9994 0 + 2073 WATR 405 HOH HT 84 4.17000000e-01 1.008 0 + 2074 WATR 405 HOH HT 84 4.17000000e-01 1.008 0 + 2075 WATR 406 HOH OT 85 -8.34000000e-01 15.9994 0 + 2076 WATR 406 HOH HT 84 4.17000000e-01 1.008 0 + 2077 WATR 406 HOH HT 84 4.17000000e-01 1.008 0 + 2078 WATR 407 HOH OT 85 -8.34000000e-01 15.9994 0 + 2079 WATR 407 HOH HT 84 4.17000000e-01 1.008 0 + 2080 WATR 407 HOH HT 84 4.17000000e-01 1.008 0 + 2081 WATR 408 HOH OT 85 -8.34000000e-01 15.9994 0 + 2082 WATR 408 HOH HT 84 4.17000000e-01 1.008 0 + 2083 WATR 408 HOH HT 84 4.17000000e-01 1.008 0 + 2084 WATR 409 HOH OT 85 -8.34000000e-01 15.9994 0 + 2085 WATR 409 HOH HT 84 4.17000000e-01 1.008 0 + 2086 WATR 409 HOH HT 84 4.17000000e-01 1.008 0 + 2087 WATR 410 HOH OT 85 -8.34000000e-01 15.9994 0 + 2088 WATR 410 HOH HT 84 4.17000000e-01 1.008 0 + 2089 WATR 410 HOH HT 84 4.17000000e-01 1.008 0 + 2090 WATR 411 HOH OT 85 -8.34000000e-01 15.9994 0 + 2091 WATR 411 HOH HT 84 4.17000000e-01 1.008 0 + 2092 WATR 411 HOH HT 84 4.17000000e-01 1.008 0 + 2093 WATR 412 HOH OT 85 -8.34000000e-01 15.9994 0 + 2094 WATR 412 HOH HT 84 4.17000000e-01 1.008 0 + 2095 WATR 412 HOH HT 84 4.17000000e-01 1.008 0 + 2096 WATR 413 HOH OT 85 -8.34000000e-01 15.9994 0 + 2097 WATR 413 HOH HT 84 4.17000000e-01 1.008 0 + 2098 WATR 413 HOH HT 84 4.17000000e-01 1.008 0 + 2099 WATR 414 HOH OT 85 -8.34000000e-01 15.9994 0 + 2100 WATR 414 HOH HT 84 4.17000000e-01 1.008 0 + 2101 WATR 414 HOH HT 84 4.17000000e-01 1.008 0 + 2102 WATR 415 HOH OT 85 -8.34000000e-01 15.9994 0 + 2103 WATR 415 HOH HT 84 4.17000000e-01 1.008 0 + 2104 WATR 415 HOH HT 84 4.17000000e-01 1.008 0 + 2105 WATR 416 HOH OT 85 -8.34000000e-01 15.9994 0 + 2106 WATR 416 HOH HT 84 4.17000000e-01 1.008 0 + 2107 WATR 416 HOH HT 84 4.17000000e-01 1.008 0 + 2108 WATR 417 HOH OT 85 -8.34000000e-01 15.9994 0 + 2109 WATR 417 HOH HT 84 4.17000000e-01 1.008 0 + 2110 WATR 417 HOH HT 84 4.17000000e-01 1.008 0 + 2111 WATR 418 HOH OT 85 -8.34000000e-01 15.9994 0 + 2112 WATR 418 HOH HT 84 4.17000000e-01 1.008 0 + 2113 WATR 418 HOH HT 84 4.17000000e-01 1.008 0 + 2114 WATR 419 HOH OT 85 -8.34000000e-01 15.9994 0 + 2115 WATR 419 HOH HT 84 4.17000000e-01 1.008 0 + 2116 WATR 419 HOH HT 84 4.17000000e-01 1.008 0 + 2117 WATR 420 HOH OT 85 -8.34000000e-01 15.9994 0 + 2118 WATR 420 HOH HT 84 4.17000000e-01 1.008 0 + 2119 WATR 420 HOH HT 84 4.17000000e-01 1.008 0 + 2120 WATR 421 HOH OT 85 -8.34000000e-01 15.9994 0 + 2121 WATR 421 HOH HT 84 4.17000000e-01 1.008 0 + 2122 WATR 421 HOH HT 84 4.17000000e-01 1.008 0 + 2123 WATR 422 HOH OT 85 -8.34000000e-01 15.9994 0 + 2124 WATR 422 HOH HT 84 4.17000000e-01 1.008 0 + 2125 WATR 422 HOH HT 84 4.17000000e-01 1.008 0 + 2126 WATR 423 HOH OT 85 -8.34000000e-01 15.9994 0 + 2127 WATR 423 HOH HT 84 4.17000000e-01 1.008 0 + 2128 WATR 423 HOH HT 84 4.17000000e-01 1.008 0 + 2129 WATR 424 HOH OT 85 -8.34000000e-01 15.9994 0 + 2130 WATR 424 HOH HT 84 4.17000000e-01 1.008 0 + 2131 WATR 424 HOH HT 84 4.17000000e-01 1.008 0 + 2132 WATR 425 HOH OT 85 -8.34000000e-01 15.9994 0 + 2133 WATR 425 HOH HT 84 4.17000000e-01 1.008 0 + 2134 WATR 425 HOH HT 84 4.17000000e-01 1.008 0 + 2135 WATR 426 HOH OT 85 -8.34000000e-01 15.9994 0 + 2136 WATR 426 HOH HT 84 4.17000000e-01 1.008 0 + 2137 WATR 426 HOH HT 84 4.17000000e-01 1.008 0 + 2138 WATR 427 HOH OT 85 -8.34000000e-01 15.9994 0 + 2139 WATR 427 HOH HT 84 4.17000000e-01 1.008 0 + 2140 WATR 427 HOH HT 84 4.17000000e-01 1.008 0 + 2141 WATR 428 HOH OT 85 -8.34000000e-01 15.9994 0 + 2142 WATR 428 HOH HT 84 4.17000000e-01 1.008 0 + 2143 WATR 428 HOH HT 84 4.17000000e-01 1.008 0 + 2144 WATR 429 HOH OT 85 -8.34000000e-01 15.9994 0 + 2145 WATR 429 HOH HT 84 4.17000000e-01 1.008 0 + 2146 WATR 429 HOH HT 84 4.17000000e-01 1.008 0 + 2147 WATR 430 HOH OT 85 -8.34000000e-01 15.9994 0 + 2148 WATR 430 HOH HT 84 4.17000000e-01 1.008 0 + 2149 WATR 430 HOH HT 84 4.17000000e-01 1.008 0 + 2150 WATR 431 HOH OT 85 -8.34000000e-01 15.9994 0 + 2151 WATR 431 HOH HT 84 4.17000000e-01 1.008 0 + 2152 WATR 431 HOH HT 84 4.17000000e-01 1.008 0 + 2153 WATR 432 HOH OT 85 -8.34000000e-01 15.9994 0 + 2154 WATR 432 HOH HT 84 4.17000000e-01 1.008 0 + 2155 WATR 432 HOH HT 84 4.17000000e-01 1.008 0 + 2156 WATR 433 HOH OT 85 -8.34000000e-01 15.9994 0 + 2157 WATR 433 HOH HT 84 4.17000000e-01 1.008 0 + 2158 WATR 433 HOH HT 84 4.17000000e-01 1.008 0 + 2159 WATR 434 HOH OT 85 -8.34000000e-01 15.9994 0 + 2160 WATR 434 HOH HT 84 4.17000000e-01 1.008 0 + 2161 WATR 434 HOH HT 84 4.17000000e-01 1.008 0 + 2162 WATR 435 HOH OT 85 -8.34000000e-01 15.9994 0 + 2163 WATR 435 HOH HT 84 4.17000000e-01 1.008 0 + 2164 WATR 435 HOH HT 84 4.17000000e-01 1.008 0 + 2165 WATR 436 HOH OT 85 -8.34000000e-01 15.9994 0 + 2166 WATR 436 HOH HT 84 4.17000000e-01 1.008 0 + 2167 WATR 436 HOH HT 84 4.17000000e-01 1.008 0 + 2168 WATR 437 HOH OT 85 -8.34000000e-01 15.9994 0 + 2169 WATR 437 HOH HT 84 4.17000000e-01 1.008 0 + 2170 WATR 437 HOH HT 84 4.17000000e-01 1.008 0 + 2171 WATR 438 HOH OT 85 -8.34000000e-01 15.9994 0 + 2172 WATR 438 HOH HT 84 4.17000000e-01 1.008 0 + 2173 WATR 438 HOH HT 84 4.17000000e-01 1.008 0 + 2174 WATR 439 HOH OT 85 -8.34000000e-01 15.9994 0 + 2175 WATR 439 HOH HT 84 4.17000000e-01 1.008 0 + 2176 WATR 439 HOH HT 84 4.17000000e-01 1.008 0 + 2177 WATR 440 HOH OT 85 -8.34000000e-01 15.9994 0 + 2178 WATR 440 HOH HT 84 4.17000000e-01 1.008 0 + 2179 WATR 440 HOH HT 84 4.17000000e-01 1.008 0 + 2180 WATR 441 HOH OT 85 -8.34000000e-01 15.9994 0 + 2181 WATR 441 HOH HT 84 4.17000000e-01 1.008 0 + 2182 WATR 441 HOH HT 84 4.17000000e-01 1.008 0 + 2183 WATR 442 HOH OT 85 -8.34000000e-01 15.9994 0 + 2184 WATR 442 HOH HT 84 4.17000000e-01 1.008 0 + 2185 WATR 442 HOH HT 84 4.17000000e-01 1.008 0 + 2186 WATR 443 HOH OT 85 -8.34000000e-01 15.9994 0 + 2187 WATR 443 HOH HT 84 4.17000000e-01 1.008 0 + 2188 WATR 443 HOH HT 84 4.17000000e-01 1.008 0 + 2189 WATR 444 HOH OT 85 -8.34000000e-01 15.9994 0 + 2190 WATR 444 HOH HT 84 4.17000000e-01 1.008 0 + 2191 WATR 444 HOH HT 84 4.17000000e-01 1.008 0 + 2192 WATR 445 HOH OT 85 -8.34000000e-01 15.9994 0 + 2193 WATR 445 HOH HT 84 4.17000000e-01 1.008 0 + 2194 WATR 445 HOH HT 84 4.17000000e-01 1.008 0 + 2195 WATR 446 HOH OT 85 -8.34000000e-01 15.9994 0 + 2196 WATR 446 HOH HT 84 4.17000000e-01 1.008 0 + 2197 WATR 446 HOH HT 84 4.17000000e-01 1.008 0 + 2198 WATR 447 HOH OT 85 -8.34000000e-01 15.9994 0 + 2199 WATR 447 HOH HT 84 4.17000000e-01 1.008 0 + 2200 WATR 447 HOH HT 84 4.17000000e-01 1.008 0 + 2201 WATR 448 HOH OT 85 -8.34000000e-01 15.9994 0 + 2202 WATR 448 HOH HT 84 4.17000000e-01 1.008 0 + 2203 WATR 448 HOH HT 84 4.17000000e-01 1.008 0 + 2204 WATR 449 HOH OT 85 -8.34000000e-01 15.9994 0 + 2205 WATR 449 HOH HT 84 4.17000000e-01 1.008 0 + 2206 WATR 449 HOH HT 84 4.17000000e-01 1.008 0 + 2207 WATR 450 HOH OT 85 -8.34000000e-01 15.9994 0 + 2208 WATR 450 HOH HT 84 4.17000000e-01 1.008 0 + 2209 WATR 450 HOH HT 84 4.17000000e-01 1.008 0 + 2210 WATR 451 HOH OT 85 -8.34000000e-01 15.9994 0 + 2211 WATR 451 HOH HT 84 4.17000000e-01 1.008 0 + 2212 WATR 451 HOH HT 84 4.17000000e-01 1.008 0 + 2213 WATR 452 HOH OT 85 -8.34000000e-01 15.9994 0 + 2214 WATR 452 HOH HT 84 4.17000000e-01 1.008 0 + 2215 WATR 452 HOH HT 84 4.17000000e-01 1.008 0 + 2216 WATR 453 HOH OT 85 -8.34000000e-01 15.9994 0 + 2217 WATR 453 HOH HT 84 4.17000000e-01 1.008 0 + 2218 WATR 453 HOH HT 84 4.17000000e-01 1.008 0 + 2219 WATR 454 HOH OT 85 -8.34000000e-01 15.9994 0 + 2220 WATR 454 HOH HT 84 4.17000000e-01 1.008 0 + 2221 WATR 454 HOH HT 84 4.17000000e-01 1.008 0 + 2222 WATR 455 HOH OT 85 -8.34000000e-01 15.9994 0 + 2223 WATR 455 HOH HT 84 4.17000000e-01 1.008 0 + 2224 WATR 455 HOH HT 84 4.17000000e-01 1.008 0 + 2225 WATR 456 HOH OT 85 -8.34000000e-01 15.9994 0 + 2226 WATR 456 HOH HT 84 4.17000000e-01 1.008 0 + 2227 WATR 456 HOH HT 84 4.17000000e-01 1.008 0 + 2228 WATR 457 HOH OT 85 -8.34000000e-01 15.9994 0 + 2229 WATR 457 HOH HT 84 4.17000000e-01 1.008 0 + 2230 WATR 457 HOH HT 84 4.17000000e-01 1.008 0 + 2231 WATR 458 HOH OT 85 -8.34000000e-01 15.9994 0 + 2232 WATR 458 HOH HT 84 4.17000000e-01 1.008 0 + 2233 WATR 458 HOH HT 84 4.17000000e-01 1.008 0 + 2234 WATR 459 HOH OT 85 -8.34000000e-01 15.9994 0 + 2235 WATR 459 HOH HT 84 4.17000000e-01 1.008 0 + 2236 WATR 459 HOH HT 84 4.17000000e-01 1.008 0 + 2237 WATR 460 HOH OT 85 -8.34000000e-01 15.9994 0 + 2238 WATR 460 HOH HT 84 4.17000000e-01 1.008 0 + 2239 WATR 460 HOH HT 84 4.17000000e-01 1.008 0 + 2240 WATR 461 HOH OT 85 -8.34000000e-01 15.9994 0 + 2241 WATR 461 HOH HT 84 4.17000000e-01 1.008 0 + 2242 WATR 461 HOH HT 84 4.17000000e-01 1.008 0 + 2243 WATR 462 HOH OT 85 -8.34000000e-01 15.9994 0 + 2244 WATR 462 HOH HT 84 4.17000000e-01 1.008 0 + 2245 WATR 462 HOH HT 84 4.17000000e-01 1.008 0 + 2246 WATR 463 HOH OT 85 -8.34000000e-01 15.9994 0 + 2247 WATR 463 HOH HT 84 4.17000000e-01 1.008 0 + 2248 WATR 463 HOH HT 84 4.17000000e-01 1.008 0 + 2249 WATR 464 HOH OT 85 -8.34000000e-01 15.9994 0 + 2250 WATR 464 HOH HT 84 4.17000000e-01 1.008 0 + 2251 WATR 464 HOH HT 84 4.17000000e-01 1.008 0 + 2252 WATR 465 HOH OT 85 -8.34000000e-01 15.9994 0 + 2253 WATR 465 HOH HT 84 4.17000000e-01 1.008 0 + 2254 WATR 465 HOH HT 84 4.17000000e-01 1.008 0 + 2255 WATR 466 HOH OT 85 -8.34000000e-01 15.9994 0 + 2256 WATR 466 HOH HT 84 4.17000000e-01 1.008 0 + 2257 WATR 466 HOH HT 84 4.17000000e-01 1.008 0 + 2258 WATR 467 HOH OT 85 -8.34000000e-01 15.9994 0 + 2259 WATR 467 HOH HT 84 4.17000000e-01 1.008 0 + 2260 WATR 467 HOH HT 84 4.17000000e-01 1.008 0 + 2261 WATR 468 HOH OT 85 -8.34000000e-01 15.9994 0 + 2262 WATR 468 HOH HT 84 4.17000000e-01 1.008 0 + 2263 WATR 468 HOH HT 84 4.17000000e-01 1.008 0 + 2264 WATR 469 HOH OT 85 -8.34000000e-01 15.9994 0 + 2265 WATR 469 HOH HT 84 4.17000000e-01 1.008 0 + 2266 WATR 469 HOH HT 84 4.17000000e-01 1.008 0 + 2267 WATR 470 HOH OT 85 -8.34000000e-01 15.9994 0 + 2268 WATR 470 HOH HT 84 4.17000000e-01 1.008 0 + 2269 WATR 470 HOH HT 84 4.17000000e-01 1.008 0 + 2270 WATR 471 HOH OT 85 -8.34000000e-01 15.9994 0 + 2271 WATR 471 HOH HT 84 4.17000000e-01 1.008 0 + 2272 WATR 471 HOH HT 84 4.17000000e-01 1.008 0 + 2273 WATR 472 HOH OT 85 -8.34000000e-01 15.9994 0 + 2274 WATR 472 HOH HT 84 4.17000000e-01 1.008 0 + 2275 WATR 472 HOH HT 84 4.17000000e-01 1.008 0 + 2276 WATR 473 HOH OT 85 -8.34000000e-01 15.9994 0 + 2277 WATR 473 HOH HT 84 4.17000000e-01 1.008 0 + 2278 WATR 473 HOH HT 84 4.17000000e-01 1.008 0 + 2279 WATR 474 HOH OT 85 -8.34000000e-01 15.9994 0 + 2280 WATR 474 HOH HT 84 4.17000000e-01 1.008 0 + 2281 WATR 474 HOH HT 84 4.17000000e-01 1.008 0 + 2282 WATR 475 HOH OT 85 -8.34000000e-01 15.9994 0 + 2283 WATR 475 HOH HT 84 4.17000000e-01 1.008 0 + 2284 WATR 475 HOH HT 84 4.17000000e-01 1.008 0 + 2285 WATR 476 HOH OT 85 -8.34000000e-01 15.9994 0 + 2286 WATR 476 HOH HT 84 4.17000000e-01 1.008 0 + 2287 WATR 476 HOH HT 84 4.17000000e-01 1.008 0 + 2288 WATR 477 HOH OT 85 -8.34000000e-01 15.9994 0 + 2289 WATR 477 HOH HT 84 4.17000000e-01 1.008 0 + 2290 WATR 477 HOH HT 84 4.17000000e-01 1.008 0 + 2291 WATR 478 HOH OT 85 -8.34000000e-01 15.9994 0 + 2292 WATR 478 HOH HT 84 4.17000000e-01 1.008 0 + 2293 WATR 478 HOH HT 84 4.17000000e-01 1.008 0 + 2294 WATR 479 HOH OT 85 -8.34000000e-01 15.9994 0 + 2295 WATR 479 HOH HT 84 4.17000000e-01 1.008 0 + 2296 WATR 479 HOH HT 84 4.17000000e-01 1.008 0 + 2297 WATR 480 HOH OT 85 -8.34000000e-01 15.9994 0 + 2298 WATR 480 HOH HT 84 4.17000000e-01 1.008 0 + 2299 WATR 480 HOH HT 84 4.17000000e-01 1.008 0 + 2300 WATR 481 HOH OT 85 -8.34000000e-01 15.9994 0 + 2301 WATR 481 HOH HT 84 4.17000000e-01 1.008 0 + 2302 WATR 481 HOH HT 84 4.17000000e-01 1.008 0 + 2303 WATR 482 HOH OT 85 -8.34000000e-01 15.9994 0 + 2304 WATR 482 HOH HT 84 4.17000000e-01 1.008 0 + 2305 WATR 482 HOH HT 84 4.17000000e-01 1.008 0 + 2306 WATR 483 HOH OT 85 -8.34000000e-01 15.9994 0 + 2307 WATR 483 HOH HT 84 4.17000000e-01 1.008 0 + 2308 WATR 483 HOH HT 84 4.17000000e-01 1.008 0 + 2309 WATR 484 HOH OT 85 -8.34000000e-01 15.9994 0 + 2310 WATR 484 HOH HT 84 4.17000000e-01 1.008 0 + 2311 WATR 484 HOH HT 84 4.17000000e-01 1.008 0 + 2312 WATR 485 HOH OT 85 -8.34000000e-01 15.9994 0 + 2313 WATR 485 HOH HT 84 4.17000000e-01 1.008 0 + 2314 WATR 485 HOH HT 84 4.17000000e-01 1.008 0 + 2315 WATR 486 HOH OT 85 -8.34000000e-01 15.9994 0 + 2316 WATR 486 HOH HT 84 4.17000000e-01 1.008 0 + 2317 WATR 486 HOH HT 84 4.17000000e-01 1.008 0 + 2318 WATR 487 HOH OT 85 -8.34000000e-01 15.9994 0 + 2319 WATR 487 HOH HT 84 4.17000000e-01 1.008 0 + 2320 WATR 487 HOH HT 84 4.17000000e-01 1.008 0 + 2321 WATR 488 HOH OT 85 -8.34000000e-01 15.9994 0 + 2322 WATR 488 HOH HT 84 4.17000000e-01 1.008 0 + 2323 WATR 488 HOH HT 84 4.17000000e-01 1.008 0 + 2324 WATR 489 HOH OT 85 -8.34000000e-01 15.9994 0 + 2325 WATR 489 HOH HT 84 4.17000000e-01 1.008 0 + 2326 WATR 489 HOH HT 84 4.17000000e-01 1.008 0 + 2327 WATR 490 HOH OT 85 -8.34000000e-01 15.9994 0 + 2328 WATR 490 HOH HT 84 4.17000000e-01 1.008 0 + 2329 WATR 490 HOH HT 84 4.17000000e-01 1.008 0 + 2330 WATR 491 HOH OT 85 -8.34000000e-01 15.9994 0 + 2331 WATR 491 HOH HT 84 4.17000000e-01 1.008 0 + 2332 WATR 491 HOH HT 84 4.17000000e-01 1.008 0 + 2333 WATR 492 HOH OT 85 -8.34000000e-01 15.9994 0 + 2334 WATR 492 HOH HT 84 4.17000000e-01 1.008 0 + 2335 WATR 492 HOH HT 84 4.17000000e-01 1.008 0 + 2336 WATR 493 HOH OT 85 -8.34000000e-01 15.9994 0 + 2337 WATR 493 HOH HT 84 4.17000000e-01 1.008 0 + 2338 WATR 493 HOH HT 84 4.17000000e-01 1.008 0 + 2339 WATR 494 HOH OT 85 -8.34000000e-01 15.9994 0 + 2340 WATR 494 HOH HT 84 4.17000000e-01 1.008 0 + 2341 WATR 494 HOH HT 84 4.17000000e-01 1.008 0 + 2342 WATR 495 HOH OT 85 -8.34000000e-01 15.9994 0 + 2343 WATR 495 HOH HT 84 4.17000000e-01 1.008 0 + 2344 WATR 495 HOH HT 84 4.17000000e-01 1.008 0 + 2345 WATR 496 HOH OT 85 -8.34000000e-01 15.9994 0 + 2346 WATR 496 HOH HT 84 4.17000000e-01 1.008 0 + 2347 WATR 496 HOH HT 84 4.17000000e-01 1.008 0 + 2348 WATR 497 HOH OT 85 -8.34000000e-01 15.9994 0 + 2349 WATR 497 HOH HT 84 4.17000000e-01 1.008 0 + 2350 WATR 497 HOH HT 84 4.17000000e-01 1.008 0 + 2351 WATR 498 HOH OT 85 -8.34000000e-01 15.9994 0 + 2352 WATR 498 HOH HT 84 4.17000000e-01 1.008 0 + 2353 WATR 498 HOH HT 84 4.17000000e-01 1.008 0 + 2354 WATR 499 HOH OT 85 -8.34000000e-01 15.9994 0 + 2355 WATR 499 HOH HT 84 4.17000000e-01 1.008 0 + 2356 WATR 499 HOH HT 84 4.17000000e-01 1.008 0 + 2357 WATR 500 HOH OT 85 -8.34000000e-01 15.9994 0 + 2358 WATR 500 HOH HT 84 4.17000000e-01 1.008 0 + 2359 WATR 500 HOH HT 84 4.17000000e-01 1.008 0 + 2360 WATR 501 HOH OT 85 -8.34000000e-01 15.9994 0 + 2361 WATR 501 HOH HT 84 4.17000000e-01 1.008 0 + 2362 WATR 501 HOH HT 84 4.17000000e-01 1.008 0 + 2363 WATR 502 HOH OT 85 -8.34000000e-01 15.9994 0 + 2364 WATR 502 HOH HT 84 4.17000000e-01 1.008 0 + 2365 WATR 502 HOH HT 84 4.17000000e-01 1.008 0 + 2366 WATR 503 HOH OT 85 -8.34000000e-01 15.9994 0 2367 WATR 503 HOH HT 84 4.17000000e-01 1.008 0 - 2368 WATR 504 HOH OT 85 -8.34000000e-01 15.9994 0 - 2369 WATR 504 HOH HT 84 4.17000000e-01 1.008 0 + 2368 WATR 503 HOH HT 84 4.17000000e-01 1.008 0 + 2369 WATR 504 HOH OT 85 -8.34000000e-01 15.9994 0 2370 WATR 504 HOH HT 84 4.17000000e-01 1.008 0 - 2371 WATR 505 HOH OT 85 -8.34000000e-01 15.9994 0 - 2372 WATR 505 HOH HT 84 4.17000000e-01 1.008 0 + 2371 WATR 504 HOH HT 84 4.17000000e-01 1.008 0 + 2372 WATR 505 HOH OT 85 -8.34000000e-01 15.9994 0 2373 WATR 505 HOH HT 84 4.17000000e-01 1.008 0 - 2374 WATR 506 HOH OT 85 -8.34000000e-01 15.9994 0 - 2375 WATR 506 HOH HT 84 4.17000000e-01 1.008 0 + 2374 WATR 505 HOH HT 84 4.17000000e-01 1.008 0 + 2375 WATR 506 HOH OT 85 -8.34000000e-01 15.9994 0 2376 WATR 506 HOH HT 84 4.17000000e-01 1.008 0 - 2377 WATR 507 HOH OT 85 -8.34000000e-01 15.9994 0 - 2378 WATR 507 HOH HT 84 4.17000000e-01 1.008 0 + 2377 WATR 506 HOH HT 84 4.17000000e-01 1.008 0 + 2378 WATR 507 HOH OT 85 -8.34000000e-01 15.9994 0 2379 WATR 507 HOH HT 84 4.17000000e-01 1.008 0 - 2380 WATR 508 HOH OT 85 -8.34000000e-01 15.9994 0 - 2381 WATR 508 HOH HT 84 4.17000000e-01 1.008 0 + 2380 WATR 507 HOH HT 84 4.17000000e-01 1.008 0 + 2381 WATR 508 HOH OT 85 -8.34000000e-01 15.9994 0 2382 WATR 508 HOH HT 84 4.17000000e-01 1.008 0 - 2383 WATR 509 HOH OT 85 -8.34000000e-01 15.9994 0 - 2384 WATR 509 HOH HT 84 4.17000000e-01 1.008 0 + 2383 WATR 508 HOH HT 84 4.17000000e-01 1.008 0 + 2384 WATR 509 HOH OT 85 -8.34000000e-01 15.9994 0 2385 WATR 509 HOH HT 84 4.17000000e-01 1.008 0 - 2386 WATR 510 HOH OT 85 -8.34000000e-01 15.9994 0 - 2387 WATR 510 HOH HT 84 4.17000000e-01 1.008 0 + 2386 WATR 509 HOH HT 84 4.17000000e-01 1.008 0 + 2387 WATR 510 HOH OT 85 -8.34000000e-01 15.9994 0 2388 WATR 510 HOH HT 84 4.17000000e-01 1.008 0 - 2389 WATR 511 HOH OT 85 -8.34000000e-01 15.9994 0 - 2390 WATR 511 HOH HT 84 4.17000000e-01 1.008 0 + 2389 WATR 510 HOH HT 84 4.17000000e-01 1.008 0 + 2390 WATR 511 HOH OT 85 -8.34000000e-01 15.9994 0 2391 WATR 511 HOH HT 84 4.17000000e-01 1.008 0 - 2392 WATR 512 HOH OT 85 -8.34000000e-01 15.9994 0 - 2393 WATR 512 HOH HT 84 4.17000000e-01 1.008 0 + 2392 WATR 511 HOH HT 84 4.17000000e-01 1.008 0 + 2393 WATR 512 HOH OT 85 -8.34000000e-01 15.9994 0 2394 WATR 512 HOH HT 84 4.17000000e-01 1.008 0 - 2395 WATR 513 HOH OT 85 -8.34000000e-01 15.9994 0 - 2396 WATR 513 HOH HT 84 4.17000000e-01 1.008 0 + 2395 WATR 512 HOH HT 84 4.17000000e-01 1.008 0 + 2396 WATR 513 HOH OT 85 -8.34000000e-01 15.9994 0 2397 WATR 513 HOH HT 84 4.17000000e-01 1.008 0 - 2398 WATR 514 HOH OT 85 -8.34000000e-01 15.9994 0 - 2399 WATR 514 HOH HT 84 4.17000000e-01 1.008 0 + 2398 WATR 513 HOH HT 84 4.17000000e-01 1.008 0 + 2399 WATR 514 HOH OT 85 -8.34000000e-01 15.9994 0 2400 WATR 514 HOH HT 84 4.17000000e-01 1.008 0 - 2401 WATR 515 HOH OT 85 -8.34000000e-01 15.9994 0 - 2402 WATR 515 HOH HT 84 4.17000000e-01 1.008 0 + 2401 WATR 514 HOH HT 84 4.17000000e-01 1.008 0 + 2402 WATR 515 HOH OT 85 -8.34000000e-01 15.9994 0 2403 WATR 515 HOH HT 84 4.17000000e-01 1.008 0 - 2404 WATR 516 HOH OT 85 -8.34000000e-01 15.9994 0 - 2405 WATR 516 HOH HT 84 4.17000000e-01 1.008 0 + 2404 WATR 515 HOH HT 84 4.17000000e-01 1.008 0 + 2405 WATR 516 HOH OT 85 -8.34000000e-01 15.9994 0 2406 WATR 516 HOH HT 84 4.17000000e-01 1.008 0 - 2407 WATR 517 HOH OT 85 -8.34000000e-01 15.9994 0 - 2408 WATR 517 HOH HT 84 4.17000000e-01 1.008 0 + 2407 WATR 516 HOH HT 84 4.17000000e-01 1.008 0 + 2408 WATR 517 HOH OT 85 -8.34000000e-01 15.9994 0 2409 WATR 517 HOH HT 84 4.17000000e-01 1.008 0 - 2410 WATR 518 HOH OT 85 -8.34000000e-01 15.9994 0 - 2411 WATR 518 HOH HT 84 4.17000000e-01 1.008 0 + 2410 WATR 517 HOH HT 84 4.17000000e-01 1.008 0 + 2411 WATR 518 HOH OT 85 -8.34000000e-01 15.9994 0 2412 WATR 518 HOH HT 84 4.17000000e-01 1.008 0 - 2413 WATR 519 HOH OT 85 -8.34000000e-01 15.9994 0 - 2414 WATR 519 HOH HT 84 4.17000000e-01 1.008 0 + 2413 WATR 518 HOH HT 84 4.17000000e-01 1.008 0 + 2414 WATR 519 HOH OT 85 -8.34000000e-01 15.9994 0 2415 WATR 519 HOH HT 84 4.17000000e-01 1.008 0 - 2416 WATR 520 HOH OT 85 -8.34000000e-01 15.9994 0 - 2417 WATR 520 HOH HT 84 4.17000000e-01 1.008 0 + 2416 WATR 519 HOH HT 84 4.17000000e-01 1.008 0 + 2417 WATR 520 HOH OT 85 -8.34000000e-01 15.9994 0 2418 WATR 520 HOH HT 84 4.17000000e-01 1.008 0 - 2419 WATR 521 HOH OT 85 -8.34000000e-01 15.9994 0 - 2420 WATR 521 HOH HT 84 4.17000000e-01 1.008 0 + 2419 WATR 520 HOH HT 84 4.17000000e-01 1.008 0 + 2420 WATR 521 HOH OT 85 -8.34000000e-01 15.9994 0 2421 WATR 521 HOH HT 84 4.17000000e-01 1.008 0 - 2422 WATR 522 HOH OT 85 -8.34000000e-01 15.9994 0 - 2423 WATR 522 HOH HT 84 4.17000000e-01 1.008 0 + 2422 WATR 521 HOH HT 84 4.17000000e-01 1.008 0 + 2423 WATR 522 HOH OT 85 -8.34000000e-01 15.9994 0 2424 WATR 522 HOH HT 84 4.17000000e-01 1.008 0 - 2425 WATR 523 HOH OT 85 -8.34000000e-01 15.9994 0 - 2426 WATR 523 HOH HT 84 4.17000000e-01 1.008 0 + 2425 WATR 522 HOH HT 84 4.17000000e-01 1.008 0 + 2426 WATR 523 HOH OT 85 -8.34000000e-01 15.9994 0 2427 WATR 523 HOH HT 84 4.17000000e-01 1.008 0 - 2428 WATR 524 HOH OT 85 -8.34000000e-01 15.9994 0 - 2429 WATR 524 HOH HT 84 4.17000000e-01 1.008 0 + 2428 WATR 523 HOH HT 84 4.17000000e-01 1.008 0 + 2429 WATR 524 HOH OT 85 -8.34000000e-01 15.9994 0 2430 WATR 524 HOH HT 84 4.17000000e-01 1.008 0 - 2431 WATR 525 HOH OT 85 -8.34000000e-01 15.9994 0 - 2432 WATR 525 HOH HT 84 4.17000000e-01 1.008 0 + 2431 WATR 524 HOH HT 84 4.17000000e-01 1.008 0 + 2432 WATR 525 HOH OT 85 -8.34000000e-01 15.9994 0 2433 WATR 525 HOH HT 84 4.17000000e-01 1.008 0 - 2434 WATR 526 HOH OT 85 -8.34000000e-01 15.9994 0 - 2435 WATR 526 HOH HT 84 4.17000000e-01 1.008 0 + 2434 WATR 525 HOH HT 84 4.17000000e-01 1.008 0 + 2435 WATR 526 HOH OT 85 -8.34000000e-01 15.9994 0 2436 WATR 526 HOH HT 84 4.17000000e-01 1.008 0 - 2437 WATR 527 HOH OT 85 -8.34000000e-01 15.9994 0 - 2438 WATR 527 HOH HT 84 4.17000000e-01 1.008 0 + 2437 WATR 526 HOH HT 84 4.17000000e-01 1.008 0 + 2438 WATR 527 HOH OT 85 -8.34000000e-01 15.9994 0 2439 WATR 527 HOH HT 84 4.17000000e-01 1.008 0 - 2440 WATR 528 HOH OT 85 -8.34000000e-01 15.9994 0 - 2441 WATR 528 HOH HT 84 4.17000000e-01 1.008 0 + 2440 WATR 527 HOH HT 84 4.17000000e-01 1.008 0 + 2441 WATR 528 HOH OT 85 -8.34000000e-01 15.9994 0 2442 WATR 528 HOH HT 84 4.17000000e-01 1.008 0 - 2443 WATR 529 HOH OT 85 -8.34000000e-01 15.9994 0 - 2444 WATR 529 HOH HT 84 4.17000000e-01 1.008 0 + 2443 WATR 528 HOH HT 84 4.17000000e-01 1.008 0 + 2444 WATR 529 HOH OT 85 -8.34000000e-01 15.9994 0 2445 WATR 529 HOH HT 84 4.17000000e-01 1.008 0 - 2446 WATR 530 HOH OT 85 -8.34000000e-01 15.9994 0 - 2447 WATR 530 HOH HT 84 4.17000000e-01 1.008 0 + 2446 WATR 529 HOH HT 84 4.17000000e-01 1.008 0 + 2447 WATR 530 HOH OT 85 -8.34000000e-01 15.9994 0 2448 WATR 530 HOH HT 84 4.17000000e-01 1.008 0 - 2449 WATR 531 HOH OT 85 -8.34000000e-01 15.9994 0 - 2450 WATR 531 HOH HT 84 4.17000000e-01 1.008 0 + 2449 WATR 530 HOH HT 84 4.17000000e-01 1.008 0 + 2450 WATR 531 HOH OT 85 -8.34000000e-01 15.9994 0 2451 WATR 531 HOH HT 84 4.17000000e-01 1.008 0 - 2452 WATR 532 HOH OT 85 -8.34000000e-01 15.9994 0 - 2453 WATR 532 HOH HT 84 4.17000000e-01 1.008 0 + 2452 WATR 531 HOH HT 84 4.17000000e-01 1.008 0 + 2453 WATR 532 HOH OT 85 -8.34000000e-01 15.9994 0 2454 WATR 532 HOH HT 84 4.17000000e-01 1.008 0 - 2455 WATR 533 HOH OT 85 -8.34000000e-01 15.9994 0 - 2456 WATR 533 HOH HT 84 4.17000000e-01 1.008 0 + 2455 WATR 532 HOH HT 84 4.17000000e-01 1.008 0 + 2456 WATR 533 HOH OT 85 -8.34000000e-01 15.9994 0 2457 WATR 533 HOH HT 84 4.17000000e-01 1.008 0 - 2458 WATR 534 HOH OT 85 -8.34000000e-01 15.9994 0 - 2459 WATR 534 HOH HT 84 4.17000000e-01 1.008 0 + 2458 WATR 533 HOH HT 84 4.17000000e-01 1.008 0 + 2459 WATR 534 HOH OT 85 -8.34000000e-01 15.9994 0 2460 WATR 534 HOH HT 84 4.17000000e-01 1.008 0 - 2461 WATR 535 HOH OT 85 -8.34000000e-01 15.9994 0 - 2462 WATR 535 HOH HT 84 4.17000000e-01 1.008 0 + 2461 WATR 534 HOH HT 84 4.17000000e-01 1.008 0 + 2462 WATR 535 HOH OT 85 -8.34000000e-01 15.9994 0 2463 WATR 535 HOH HT 84 4.17000000e-01 1.008 0 - 2464 WATR 536 HOH OT 85 -8.34000000e-01 15.9994 0 - 2465 WATR 536 HOH HT 84 4.17000000e-01 1.008 0 + 2464 WATR 535 HOH HT 84 4.17000000e-01 1.008 0 + 2465 WATR 536 HOH OT 85 -8.34000000e-01 15.9994 0 2466 WATR 536 HOH HT 84 4.17000000e-01 1.008 0 - 2467 WATR 537 HOH OT 85 -8.34000000e-01 15.9994 0 - 2468 WATR 537 HOH HT 84 4.17000000e-01 1.008 0 + 2467 WATR 536 HOH HT 84 4.17000000e-01 1.008 0 + 2468 WATR 537 HOH OT 85 -8.34000000e-01 15.9994 0 2469 WATR 537 HOH HT 84 4.17000000e-01 1.008 0 - 2470 WATR 538 HOH OT 85 -8.34000000e-01 15.9994 0 - 2471 WATR 538 HOH HT 84 4.17000000e-01 1.008 0 + 2470 WATR 537 HOH HT 84 4.17000000e-01 1.008 0 + 2471 WATR 538 HOH OT 85 -8.34000000e-01 15.9994 0 2472 WATR 538 HOH HT 84 4.17000000e-01 1.008 0 - 2473 WATR 539 HOH OT 85 -8.34000000e-01 15.9994 0 - 2474 WATR 539 HOH HT 84 4.17000000e-01 1.008 0 + 2473 WATR 538 HOH HT 84 4.17000000e-01 1.008 0 + 2474 WATR 539 HOH OT 85 -8.34000000e-01 15.9994 0 2475 WATR 539 HOH HT 84 4.17000000e-01 1.008 0 - 2476 WATR 540 HOH OT 85 -8.34000000e-01 15.9994 0 - 2477 WATR 540 HOH HT 84 4.17000000e-01 1.008 0 + 2476 WATR 539 HOH HT 84 4.17000000e-01 1.008 0 + 2477 WATR 540 HOH OT 85 -8.34000000e-01 15.9994 0 2478 WATR 540 HOH HT 84 4.17000000e-01 1.008 0 - 2479 WATR 541 HOH OT 85 -8.34000000e-01 15.9994 0 - 2480 WATR 541 HOH HT 84 4.17000000e-01 1.008 0 + 2479 WATR 540 HOH HT 84 4.17000000e-01 1.008 0 + 2480 WATR 541 HOH OT 85 -8.34000000e-01 15.9994 0 2481 WATR 541 HOH HT 84 4.17000000e-01 1.008 0 - 2482 WATR 542 HOH OT 85 -8.34000000e-01 15.9994 0 - 2483 WATR 542 HOH HT 84 4.17000000e-01 1.008 0 + 2482 WATR 541 HOH HT 84 4.17000000e-01 1.008 0 + 2483 WATR 542 HOH OT 85 -8.34000000e-01 15.9994 0 2484 WATR 542 HOH HT 84 4.17000000e-01 1.008 0 - 2485 WATR 543 HOH OT 85 -8.34000000e-01 15.9994 0 - 2486 WATR 543 HOH HT 84 4.17000000e-01 1.008 0 + 2485 WATR 542 HOH HT 84 4.17000000e-01 1.008 0 + 2486 WATR 543 HOH OT 85 -8.34000000e-01 15.9994 0 2487 WATR 543 HOH HT 84 4.17000000e-01 1.008 0 - 2488 WATR 544 HOH OT 85 -8.34000000e-01 15.9994 0 - 2489 WATR 544 HOH HT 84 4.17000000e-01 1.008 0 + 2488 WATR 543 HOH HT 84 4.17000000e-01 1.008 0 + 2489 WATR 544 HOH OT 85 -8.34000000e-01 15.9994 0 2490 WATR 544 HOH HT 84 4.17000000e-01 1.008 0 - 2491 WATR 545 HOH OT 85 -8.34000000e-01 15.9994 0 - 2492 WATR 545 HOH HT 84 4.17000000e-01 1.008 0 + 2491 WATR 544 HOH HT 84 4.17000000e-01 1.008 0 + 2492 WATR 545 HOH OT 85 -8.34000000e-01 15.9994 0 2493 WATR 545 HOH HT 84 4.17000000e-01 1.008 0 - 2494 WATR 546 HOH OT 85 -8.34000000e-01 15.9994 0 - 2495 WATR 546 HOH HT 84 4.17000000e-01 1.008 0 + 2494 WATR 545 HOH HT 84 4.17000000e-01 1.008 0 + 2495 WATR 546 HOH OT 85 -8.34000000e-01 15.9994 0 2496 WATR 546 HOH HT 84 4.17000000e-01 1.008 0 - 2497 SALT 4 ION SOD 87 1.00000000e+00 22.9897 0 + 2497 WATR 546 HOH HT 84 4.17000000e-01 1.008 0 2498 WATR 547 HOH OT 85 -8.34000000e-01 15.9994 0 2499 WATR 547 HOH HT 84 4.17000000e-01 1.008 0 2500 WATR 547 HOH HT 84 4.17000000e-01 1.008 0 @@ -3060,275 +3060,275 @@ PSF 865 867 868 869 868 870 871 872 871 873 874 875 874 876 877 878 877 879 880 881 880 882 883 884 - 883 885 886 887 886 888 889 890 - 889 891 892 893 892 894 895 896 - 895 897 898 899 898 900 901 902 - 901 903 904 905 904 906 907 908 - 907 909 910 911 910 912 913 914 - 913 915 916 917 916 918 919 920 - 919 921 922 923 922 924 925 926 - 925 927 928 929 928 930 931 932 - 931 933 934 935 934 936 937 938 - 937 939 940 941 940 942 943 944 - 943 945 946 947 946 948 949 950 - 949 951 952 953 952 954 955 956 - 955 957 958 959 958 960 961 962 - 961 963 964 965 964 966 967 968 - 967 969 970 971 970 972 973 974 - 973 975 976 977 976 978 979 980 - 979 981 982 983 982 984 985 986 - 985 987 988 989 988 990 991 992 - 991 993 994 995 994 996 997 998 - 997 999 1000 1001 1000 1002 1003 1004 - 1003 1005 1006 1007 1006 1008 1009 1010 - 1009 1011 1012 1013 1012 1014 1015 1016 - 1015 1017 1018 1019 1018 1020 1021 1022 - 1021 1023 1024 1025 1024 1026 1027 1028 - 1027 1029 1030 1031 1030 1032 1033 1034 - 1033 1035 1036 1037 1036 1038 1039 1040 - 1039 1041 1042 1043 1042 1044 1045 1046 - 1045 1047 1048 1049 1048 1050 1051 1052 - 1051 1053 1054 1055 1054 1056 1057 1058 - 1057 1059 1060 1061 1060 1062 1063 1064 - 1063 1065 1066 1067 1066 1068 1069 1070 - 1069 1071 1072 1073 1072 1074 1075 1076 - 1075 1077 1078 1079 1078 1080 1081 1082 - 1081 1083 1084 1085 1084 1086 1087 1088 - 1087 1089 1090 1091 1090 1092 1093 1094 - 1093 1095 1096 1097 1096 1098 1099 1100 - 1099 1101 1102 1103 1102 1104 1105 1106 - 1105 1107 1108 1109 1108 1110 1111 1112 - 1111 1113 1114 1115 1114 1116 1117 1118 - 1117 1119 1120 1121 1120 1122 1123 1124 - 1123 1125 1126 1127 1126 1128 1129 1130 - 1129 1131 1132 1133 1132 1134 1135 1136 - 1135 1137 1138 1139 1138 1140 1141 1142 - 1141 1143 1144 1145 1144 1146 1147 1148 - 1147 1149 1150 1151 1150 1152 1153 1154 - 1153 1155 1156 1157 1156 1158 1159 1160 - 1159 1161 1162 1163 1162 1164 1165 1166 - 1165 1167 1168 1169 1168 1170 1171 1172 - 1171 1173 1174 1175 1174 1176 1177 1178 - 1177 1179 1180 1181 1180 1182 1183 1184 - 1183 1185 1186 1187 1186 1188 1189 1190 - 1189 1191 1192 1193 1192 1194 1195 1196 - 1195 1197 1198 1199 1198 1200 1201 1202 - 1201 1203 1204 1205 1204 1206 1207 1208 - 1207 1209 1210 1211 1210 1212 1213 1214 - 1213 1215 1216 1217 1216 1218 1219 1220 - 1219 1221 1222 1223 1222 1224 1225 1226 - 1225 1227 1228 1229 1228 1230 1231 1232 - 1231 1233 1234 1235 1234 1236 1237 1238 - 1237 1239 1240 1241 1240 1242 1243 1244 - 1243 1245 1246 1247 1246 1248 1249 1250 - 1249 1251 1252 1253 1252 1254 1255 1256 - 1255 1257 1258 1259 1258 1260 1261 1262 - 1261 1263 1264 1265 1264 1266 1267 1268 - 1267 1269 1270 1271 1270 1272 1273 1274 - 1273 1275 1276 1277 1276 1278 1279 1280 - 1279 1281 1282 1283 1282 1284 1285 1286 - 1285 1287 1288 1289 1288 1290 1291 1292 - 1291 1293 1294 1295 1294 1296 1297 1298 - 1297 1299 1300 1301 1300 1302 1303 1304 - 1303 1305 1306 1307 1306 1308 1309 1310 - 1309 1311 1312 1313 1312 1314 1315 1316 - 1315 1317 1318 1319 1318 1320 1321 1322 - 1321 1323 1324 1325 1324 1326 1327 1328 - 1327 1329 1330 1331 1330 1332 1333 1334 - 1333 1335 1336 1337 1336 1338 1339 1340 - 1339 1341 1342 1343 1342 1344 1345 1346 - 1345 1347 1348 1349 1348 1350 1351 1352 - 1351 1353 1354 1355 1354 1356 1357 1358 - 1357 1359 1360 1361 1360 1362 1363 1364 - 1363 1365 1366 1367 1366 1368 1369 1370 - 1369 1371 1372 1373 1372 1374 1375 1376 - 1375 1377 1378 1379 1378 1380 1381 1382 - 1381 1383 1384 1385 1384 1386 1387 1388 - 1387 1389 1390 1391 1390 1392 1393 1394 - 1393 1395 1396 1397 1396 1398 1399 1400 - 1399 1401 1402 1403 1402 1404 1405 1406 - 1405 1407 1408 1409 1408 1410 1411 1412 - 1411 1413 1414 1415 1414 1416 1417 1418 - 1417 1419 1420 1421 1420 1422 1423 1424 - 1423 1425 1426 1427 1426 1428 1429 1430 - 1429 1431 1432 1433 1432 1434 1435 1436 - 1435 1437 1438 1439 1438 1440 1441 1442 - 1441 1443 1444 1445 1444 1446 1447 1448 - 1447 1449 1450 1451 1450 1452 1453 1454 - 1453 1455 1456 1457 1456 1458 1459 1460 - 1459 1461 1462 1463 1462 1464 1465 1466 - 1465 1467 1468 1469 1468 1470 1471 1472 - 1471 1473 1474 1475 1474 1476 1477 1478 - 1477 1479 1480 1481 1480 1482 1483 1484 - 1483 1485 1486 1487 1486 1488 1489 1490 - 1489 1491 1492 1493 1492 1494 1495 1496 - 1495 1497 1498 1499 1498 1500 1501 1502 - 1501 1503 1504 1505 1504 1506 1507 1508 - 1507 1509 1510 1511 1510 1512 1513 1514 - 1513 1515 1516 1517 1516 1518 1519 1520 - 1519 1521 1522 1523 1522 1524 1525 1526 - 1525 1527 1529 1530 1529 1531 1532 1533 - 1532 1534 1535 1536 1535 1537 1538 1539 - 1538 1540 1541 1542 1541 1543 1544 1545 - 1544 1546 1547 1548 1547 1549 1550 1551 - 1550 1552 1553 1554 1553 1555 1556 1557 - 1556 1558 1559 1560 1559 1561 1562 1563 - 1562 1564 1565 1566 1565 1567 1568 1569 - 1568 1570 1571 1572 1571 1573 1574 1575 - 1574 1576 1577 1578 1577 1579 1580 1581 - 1580 1582 1583 1584 1583 1585 1586 1587 - 1586 1588 1589 1590 1589 1591 1592 1593 - 1592 1594 1595 1596 1595 1597 1598 1599 - 1598 1600 1601 1602 1601 1603 1604 1605 - 1604 1606 1607 1608 1607 1609 1610 1611 - 1610 1612 1613 1614 1613 1615 1616 1617 - 1616 1618 1619 1620 1619 1621 1622 1623 - 1622 1624 1625 1626 1625 1627 1628 1629 - 1628 1630 1631 1632 1631 1633 1634 1635 - 1634 1636 1637 1638 1637 1639 1640 1641 - 1640 1642 1643 1644 1643 1645 1646 1647 - 1646 1648 1649 1650 1649 1651 1652 1653 - 1652 1654 1655 1656 1655 1657 1658 1659 - 1658 1660 1661 1662 1661 1663 1664 1665 - 1664 1666 1667 1668 1667 1669 1670 1671 - 1670 1672 1673 1674 1673 1675 1676 1677 - 1676 1678 1679 1680 1679 1681 1682 1683 - 1682 1684 1685 1686 1685 1687 1688 1689 - 1688 1690 1691 1692 1691 1693 1694 1695 - 1694 1696 1697 1698 1697 1699 1700 1701 - 1700 1702 1703 1704 1703 1705 1706 1707 - 1706 1708 1709 1710 1709 1711 1712 1713 - 1712 1714 1715 1716 1715 1717 1718 1719 - 1718 1720 1721 1722 1721 1723 1724 1725 - 1724 1726 1727 1728 1727 1729 1730 1731 - 1730 1732 1733 1734 1733 1735 1736 1737 - 1736 1738 1739 1740 1739 1741 1742 1743 - 1742 1744 1745 1746 1745 1747 1748 1749 - 1748 1750 1751 1752 1751 1753 1754 1755 - 1754 1756 1757 1758 1757 1759 1760 1761 - 1760 1762 1763 1764 1763 1765 1766 1767 - 1766 1768 1769 1770 1769 1771 1772 1773 - 1772 1774 1775 1776 1775 1777 1778 1779 - 1778 1780 1781 1782 1781 1783 1784 1785 - 1784 1786 1787 1788 1787 1789 1790 1791 - 1790 1792 1793 1794 1793 1795 1796 1797 - 1796 1798 1799 1800 1799 1801 1802 1803 - 1802 1804 1805 1806 1805 1807 1808 1809 - 1808 1810 1811 1812 1811 1813 1814 1815 - 1814 1816 1817 1818 1817 1819 1820 1821 - 1820 1822 1823 1824 1823 1825 1826 1827 - 1826 1828 1829 1830 1829 1831 1832 1833 - 1832 1834 1835 1836 1835 1837 1838 1839 - 1838 1840 1841 1842 1841 1843 1844 1845 - 1844 1846 1847 1848 1847 1849 1850 1851 - 1850 1852 1853 1854 1853 1855 1856 1857 - 1856 1858 1859 1860 1859 1861 1862 1863 - 1862 1864 1865 1866 1865 1867 1868 1869 - 1868 1870 1871 1872 1871 1873 1874 1875 - 1874 1876 1877 1878 1877 1879 1880 1881 - 1880 1882 1883 1884 1883 1885 1886 1887 - 1886 1888 1889 1890 1889 1891 1892 1893 - 1892 1894 1895 1896 1895 1897 1898 1899 - 1898 1900 1901 1902 1901 1903 1904 1905 - 1904 1906 1907 1908 1907 1909 1910 1911 - 1910 1912 1913 1914 1913 1915 1916 1917 - 1916 1918 1919 1920 1919 1921 1922 1923 - 1922 1924 1925 1926 1925 1927 1928 1929 - 1928 1930 1931 1932 1931 1933 1934 1935 - 1934 1936 1937 1938 1937 1939 1940 1941 - 1940 1942 1943 1944 1943 1945 1946 1947 - 1946 1948 1949 1950 1949 1951 1952 1953 - 1952 1954 1955 1956 1955 1957 1958 1959 - 1958 1960 1961 1962 1961 1963 1964 1965 - 1964 1966 1967 1968 1967 1969 1970 1971 - 1970 1972 1973 1974 1973 1975 1976 1977 - 1976 1978 1979 1980 1979 1981 1982 1983 - 1982 1984 1985 1986 1985 1987 1988 1989 - 1988 1990 1991 1992 1991 1993 1994 1995 - 1994 1996 1997 1998 1997 1999 2000 2001 - 2000 2002 2003 2004 2003 2005 2007 2008 - 2007 2009 2010 2011 2010 2012 2013 2014 - 2013 2015 2016 2017 2016 2018 2019 2020 - 2019 2021 2022 2023 2022 2024 2025 2026 - 2025 2027 2028 2029 2028 2030 2031 2032 - 2031 2033 2034 2035 2034 2036 2037 2038 - 2037 2039 2040 2041 2040 2042 2043 2044 - 2043 2045 2046 2047 2046 2048 2049 2050 - 2049 2051 2052 2053 2052 2054 2055 2056 - 2055 2057 2058 2059 2058 2060 2061 2062 - 2061 2063 2064 2065 2064 2066 2067 2068 - 2067 2069 2070 2071 2070 2072 2073 2074 - 2073 2075 2076 2077 2076 2078 2079 2080 - 2079 2081 2082 2083 2082 2084 2085 2086 - 2085 2087 2088 2089 2088 2090 2091 2092 - 2091 2093 2094 2095 2094 2096 2097 2098 - 2097 2099 2100 2101 2100 2102 2103 2104 - 2103 2105 2106 2107 2106 2108 2109 2110 - 2109 2111 2112 2113 2112 2114 2115 2116 - 2115 2117 2118 2119 2118 2120 2121 2122 - 2121 2123 2124 2125 2124 2126 2127 2128 - 2127 2129 2130 2131 2130 2132 2133 2134 - 2133 2135 2136 2137 2136 2138 2139 2140 - 2139 2141 2142 2143 2142 2144 2145 2146 - 2145 2147 2148 2149 2148 2150 2151 2152 - 2151 2153 2154 2155 2154 2156 2157 2158 - 2157 2159 2160 2161 2160 2162 2163 2164 - 2163 2165 2166 2167 2166 2168 2169 2170 - 2169 2171 2172 2173 2172 2174 2175 2176 - 2175 2177 2178 2179 2178 2180 2181 2182 - 2181 2183 2184 2185 2184 2186 2187 2188 - 2187 2189 2190 2191 2190 2192 2193 2194 - 2193 2195 2196 2197 2196 2198 2199 2200 - 2199 2201 2202 2203 2202 2204 2205 2206 - 2205 2207 2208 2209 2208 2210 2211 2212 - 2211 2213 2214 2215 2214 2216 2217 2218 - 2217 2219 2220 2221 2220 2222 2223 2224 - 2223 2225 2226 2227 2226 2228 2229 2230 - 2229 2231 2232 2233 2232 2234 2235 2236 - 2235 2237 2238 2239 2238 2240 2241 2242 - 2241 2243 2244 2245 2244 2246 2247 2248 - 2247 2249 2250 2251 2250 2252 2253 2254 - 2253 2255 2256 2257 2256 2258 2259 2260 - 2259 2261 2262 2263 2262 2264 2265 2266 - 2265 2267 2268 2269 2268 2270 2271 2272 - 2271 2273 2274 2275 2274 2276 2277 2278 - 2277 2279 2280 2281 2280 2282 2283 2284 - 2283 2285 2286 2287 2286 2288 2289 2290 - 2289 2291 2292 2293 2292 2294 2295 2296 - 2295 2297 2298 2299 2298 2300 2301 2302 - 2301 2303 2304 2305 2304 2306 2307 2308 - 2307 2309 2310 2311 2310 2312 2313 2314 - 2313 2315 2316 2317 2316 2318 2319 2320 - 2319 2321 2322 2323 2322 2324 2325 2326 - 2325 2327 2328 2329 2328 2330 2331 2332 - 2331 2333 2334 2335 2334 2336 2337 2338 - 2337 2339 2340 2341 2340 2342 2343 2344 - 2343 2345 2346 2347 2346 2348 2349 2350 - 2349 2351 2352 2353 2352 2354 2355 2356 - 2355 2357 2358 2359 2358 2360 2361 2362 - 2361 2363 2365 2366 2365 2367 2368 2369 - 2368 2370 2371 2372 2371 2373 2374 2375 - 2374 2376 2377 2378 2377 2379 2380 2381 - 2380 2382 2383 2384 2383 2385 2386 2387 - 2386 2388 2389 2390 2389 2391 2392 2393 - 2392 2394 2395 2396 2395 2397 2398 2399 - 2398 2400 2401 2402 2401 2403 2404 2405 - 2404 2406 2407 2408 2407 2409 2410 2411 - 2410 2412 2413 2414 2413 2415 2416 2417 - 2416 2418 2419 2420 2419 2421 2422 2423 - 2422 2424 2425 2426 2425 2427 2428 2429 - 2428 2430 2431 2432 2431 2433 2434 2435 - 2434 2436 2437 2438 2437 2439 2440 2441 - 2440 2442 2443 2444 2443 2445 2446 2447 - 2446 2448 2449 2450 2449 2451 2452 2453 - 2452 2454 2455 2456 2455 2457 2458 2459 - 2458 2460 2461 2462 2461 2463 2464 2465 - 2464 2466 2467 2468 2467 2469 2470 2471 - 2470 2472 2473 2474 2473 2475 2476 2477 - 2476 2478 2479 2480 2479 2481 2482 2483 - 2482 2484 2485 2486 2485 2487 2488 2489 - 2488 2490 2491 2492 2491 2493 2494 2495 - 2494 2496 2498 2499 2498 2500 2501 2502 + 883 885 887 888 887 889 890 891 + 890 892 893 894 893 895 896 897 + 896 898 899 900 899 901 902 903 + 902 904 905 906 905 907 908 909 + 908 910 911 912 911 913 914 915 + 914 916 917 918 917 919 920 921 + 920 922 923 924 923 925 926 927 + 926 928 929 930 929 931 932 933 + 932 934 935 936 935 937 938 939 + 938 940 941 942 941 943 944 945 + 944 946 947 948 947 949 950 951 + 950 952 953 954 953 955 956 957 + 956 958 959 960 959 961 962 963 + 962 964 965 966 965 967 968 969 + 968 970 971 972 971 973 974 975 + 974 976 977 978 977 979 980 981 + 980 982 983 984 983 985 986 987 + 986 988 989 990 989 991 992 993 + 992 994 996 997 996 998 999 1000 + 999 1001 1002 1003 1002 1004 1005 1006 + 1005 1007 1008 1009 1008 1010 1011 1012 + 1011 1013 1014 1015 1014 1016 1017 1018 + 1017 1019 1020 1021 1020 1022 1023 1024 + 1023 1025 1026 1027 1026 1028 1029 1030 + 1029 1031 1032 1033 1032 1034 1035 1036 + 1035 1037 1038 1039 1038 1040 1041 1042 + 1041 1043 1044 1045 1044 1046 1047 1048 + 1047 1049 1050 1051 1050 1052 1053 1054 + 1053 1055 1056 1057 1056 1058 1059 1060 + 1059 1061 1062 1063 1062 1064 1065 1066 + 1065 1067 1068 1069 1068 1070 1071 1072 + 1071 1073 1074 1075 1074 1076 1077 1078 + 1077 1079 1080 1081 1080 1082 1083 1084 + 1083 1085 1086 1087 1086 1088 1089 1090 + 1089 1091 1092 1093 1092 1094 1095 1096 + 1095 1097 1098 1099 1098 1100 1101 1102 + 1101 1103 1104 1105 1104 1106 1107 1108 + 1107 1109 1110 1111 1110 1112 1113 1114 + 1113 1115 1116 1117 1116 1118 1119 1120 + 1119 1121 1122 1123 1122 1124 1125 1126 + 1125 1127 1128 1129 1128 1130 1131 1132 + 1131 1133 1134 1135 1134 1136 1137 1138 + 1137 1139 1140 1141 1140 1142 1143 1144 + 1143 1145 1146 1147 1146 1148 1149 1150 + 1149 1151 1152 1153 1152 1154 1155 1156 + 1155 1157 1158 1159 1158 1160 1161 1162 + 1161 1163 1164 1165 1164 1166 1167 1168 + 1167 1169 1170 1171 1170 1172 1173 1174 + 1173 1175 1176 1177 1176 1178 1179 1180 + 1179 1181 1182 1183 1182 1184 1185 1186 + 1185 1187 1188 1189 1188 1190 1191 1192 + 1191 1193 1194 1195 1194 1196 1197 1198 + 1197 1199 1200 1201 1200 1202 1203 1204 + 1203 1205 1206 1207 1206 1208 1209 1210 + 1209 1211 1212 1213 1212 1214 1215 1216 + 1215 1217 1218 1219 1218 1220 1221 1222 + 1221 1223 1224 1225 1224 1226 1227 1228 + 1227 1229 1230 1231 1230 1232 1233 1234 + 1233 1235 1236 1237 1236 1238 1239 1240 + 1239 1241 1242 1243 1242 1244 1245 1246 + 1245 1247 1248 1249 1248 1250 1251 1252 + 1251 1253 1254 1255 1254 1256 1257 1258 + 1257 1259 1260 1261 1260 1262 1263 1264 + 1263 1265 1266 1267 1266 1268 1269 1270 + 1269 1271 1272 1273 1272 1274 1275 1276 + 1275 1277 1278 1279 1278 1280 1281 1282 + 1281 1283 1284 1285 1284 1286 1287 1288 + 1287 1289 1290 1291 1290 1292 1293 1294 + 1293 1295 1296 1297 1296 1298 1299 1300 + 1299 1301 1302 1303 1302 1304 1305 1306 + 1305 1307 1308 1309 1308 1310 1311 1312 + 1311 1313 1314 1315 1314 1316 1317 1318 + 1317 1319 1320 1321 1320 1322 1323 1324 + 1323 1325 1326 1327 1326 1328 1329 1330 + 1329 1331 1332 1333 1332 1334 1335 1336 + 1335 1337 1338 1339 1338 1340 1341 1342 + 1341 1343 1344 1345 1344 1346 1347 1348 + 1347 1349 1350 1351 1350 1352 1353 1354 + 1353 1355 1356 1357 1356 1358 1359 1360 + 1359 1361 1362 1363 1362 1364 1365 1366 + 1365 1367 1368 1369 1368 1370 1371 1372 + 1371 1373 1374 1375 1374 1376 1377 1378 + 1377 1379 1380 1381 1380 1382 1383 1384 + 1383 1385 1386 1387 1386 1388 1389 1390 + 1389 1391 1392 1393 1392 1394 1395 1396 + 1395 1397 1398 1399 1398 1400 1401 1402 + 1401 1403 1404 1405 1404 1406 1407 1408 + 1407 1409 1410 1411 1410 1412 1413 1414 + 1413 1415 1416 1417 1416 1418 1419 1420 + 1419 1421 1422 1423 1422 1424 1425 1426 + 1425 1427 1428 1429 1428 1430 1431 1432 + 1431 1433 1435 1436 1435 1437 1438 1439 + 1438 1440 1441 1442 1441 1443 1444 1445 + 1444 1446 1447 1448 1447 1449 1450 1451 + 1450 1452 1453 1454 1453 1455 1456 1457 + 1456 1458 1459 1460 1459 1461 1462 1463 + 1462 1464 1465 1466 1465 1467 1468 1469 + 1468 1470 1471 1472 1471 1473 1474 1475 + 1474 1476 1477 1478 1477 1479 1480 1481 + 1480 1482 1483 1484 1483 1485 1486 1487 + 1486 1488 1489 1490 1489 1491 1492 1493 + 1492 1494 1495 1496 1495 1497 1498 1499 + 1498 1500 1501 1502 1501 1503 1504 1505 + 1504 1506 1507 1508 1507 1509 1510 1511 + 1510 1512 1513 1514 1513 1515 1516 1517 + 1516 1518 1519 1520 1519 1521 1522 1523 + 1522 1524 1525 1526 1525 1527 1528 1529 + 1528 1530 1531 1532 1531 1533 1534 1535 + 1534 1536 1537 1538 1537 1539 1540 1541 + 1540 1542 1543 1544 1543 1545 1546 1547 + 1546 1548 1549 1550 1549 1551 1552 1553 + 1552 1554 1555 1556 1555 1557 1558 1559 + 1558 1560 1561 1562 1561 1563 1564 1565 + 1564 1566 1567 1568 1567 1569 1570 1571 + 1570 1572 1573 1574 1573 1575 1576 1577 + 1576 1578 1579 1580 1579 1581 1582 1583 + 1582 1584 1585 1586 1585 1587 1588 1589 + 1588 1590 1591 1592 1591 1593 1594 1595 + 1594 1596 1597 1598 1597 1599 1600 1601 + 1600 1602 1603 1604 1603 1605 1606 1607 + 1606 1608 1609 1610 1609 1611 1612 1613 + 1612 1614 1615 1616 1615 1617 1618 1619 + 1618 1620 1621 1622 1621 1623 1624 1625 + 1624 1626 1627 1628 1627 1629 1630 1631 + 1630 1632 1633 1634 1633 1635 1636 1637 + 1636 1638 1639 1640 1639 1641 1642 1643 + 1642 1644 1645 1646 1645 1647 1648 1649 + 1648 1650 1651 1652 1651 1653 1654 1655 + 1654 1656 1657 1658 1657 1659 1660 1661 + 1660 1662 1663 1664 1663 1665 1666 1667 + 1666 1668 1669 1670 1669 1671 1672 1673 + 1672 1674 1675 1676 1675 1677 1678 1679 + 1678 1680 1681 1682 1681 1683 1684 1685 + 1684 1686 1687 1688 1687 1689 1690 1691 + 1690 1692 1693 1694 1693 1695 1696 1697 + 1696 1698 1699 1700 1699 1701 1702 1703 + 1702 1704 1705 1706 1705 1707 1708 1709 + 1708 1710 1711 1712 1711 1713 1714 1715 + 1714 1716 1717 1718 1717 1719 1720 1721 + 1720 1722 1723 1724 1723 1725 1726 1727 + 1726 1728 1729 1730 1729 1731 1732 1733 + 1732 1734 1735 1736 1735 1737 1738 1739 + 1738 1740 1741 1742 1741 1743 1744 1745 + 1744 1746 1747 1748 1747 1749 1750 1751 + 1750 1752 1753 1754 1753 1755 1756 1757 + 1756 1758 1759 1760 1759 1761 1762 1763 + 1762 1764 1765 1766 1765 1767 1768 1769 + 1768 1770 1771 1772 1771 1773 1774 1775 + 1774 1776 1777 1778 1777 1779 1780 1781 + 1780 1782 1783 1784 1783 1785 1786 1787 + 1786 1788 1789 1790 1789 1791 1792 1793 + 1792 1794 1795 1796 1795 1797 1798 1799 + 1798 1800 1801 1802 1801 1803 1805 1806 + 1805 1807 1808 1809 1808 1810 1811 1812 + 1811 1813 1814 1815 1814 1816 1817 1818 + 1817 1819 1820 1821 1820 1822 1823 1824 + 1823 1825 1826 1827 1826 1828 1829 1830 + 1829 1831 1832 1833 1832 1834 1835 1836 + 1835 1837 1838 1839 1838 1840 1841 1842 + 1841 1843 1844 1845 1844 1846 1847 1848 + 1847 1849 1850 1851 1850 1852 1853 1854 + 1853 1855 1856 1857 1856 1858 1859 1860 + 1859 1861 1862 1863 1862 1864 1865 1866 + 1865 1867 1868 1869 1868 1870 1871 1872 + 1871 1873 1874 1875 1874 1876 1877 1878 + 1877 1879 1880 1881 1880 1882 1883 1884 + 1883 1885 1886 1887 1886 1888 1889 1890 + 1889 1891 1892 1893 1892 1894 1895 1896 + 1895 1897 1898 1899 1898 1900 1901 1902 + 1901 1903 1904 1905 1904 1906 1907 1908 + 1907 1909 1910 1911 1910 1912 1913 1914 + 1913 1915 1916 1917 1916 1918 1919 1920 + 1919 1921 1922 1923 1922 1924 1925 1926 + 1925 1927 1928 1929 1928 1930 1931 1932 + 1931 1933 1934 1935 1934 1936 1937 1938 + 1937 1939 1940 1941 1940 1942 1943 1944 + 1943 1945 1946 1947 1946 1948 1949 1950 + 1949 1951 1952 1953 1952 1954 1955 1956 + 1955 1957 1958 1959 1958 1960 1961 1962 + 1961 1963 1964 1965 1964 1966 1967 1968 + 1967 1969 1970 1971 1970 1972 1973 1974 + 1973 1975 1976 1977 1976 1978 1979 1980 + 1979 1981 1982 1983 1982 1984 1985 1986 + 1985 1987 1988 1989 1988 1990 1991 1992 + 1991 1993 1994 1995 1994 1996 1997 1998 + 1997 1999 2000 2001 2000 2002 2003 2004 + 2003 2005 2006 2007 2006 2008 2009 2010 + 2009 2011 2012 2013 2012 2014 2015 2016 + 2015 2017 2018 2019 2018 2020 2021 2022 + 2021 2023 2024 2025 2024 2026 2027 2028 + 2027 2029 2030 2031 2030 2032 2033 2034 + 2033 2035 2036 2037 2036 2038 2039 2040 + 2039 2041 2042 2043 2042 2044 2045 2046 + 2045 2047 2048 2049 2048 2050 2051 2052 + 2051 2053 2054 2055 2054 2056 2057 2058 + 2057 2059 2060 2061 2060 2062 2063 2064 + 2063 2065 2066 2067 2066 2068 2069 2070 + 2069 2071 2072 2073 2072 2074 2075 2076 + 2075 2077 2078 2079 2078 2080 2081 2082 + 2081 2083 2084 2085 2084 2086 2087 2088 + 2087 2089 2090 2091 2090 2092 2093 2094 + 2093 2095 2096 2097 2096 2098 2099 2100 + 2099 2101 2102 2103 2102 2104 2105 2106 + 2105 2107 2108 2109 2108 2110 2111 2112 + 2111 2113 2114 2115 2114 2116 2117 2118 + 2117 2119 2120 2121 2120 2122 2123 2124 + 2123 2125 2126 2127 2126 2128 2129 2130 + 2129 2131 2132 2133 2132 2134 2135 2136 + 2135 2137 2138 2139 2138 2140 2141 2142 + 2141 2143 2144 2145 2144 2146 2147 2148 + 2147 2149 2150 2151 2150 2152 2153 2154 + 2153 2155 2156 2157 2156 2158 2159 2160 + 2159 2161 2162 2163 2162 2164 2165 2166 + 2165 2167 2168 2169 2168 2170 2171 2172 + 2171 2173 2174 2175 2174 2176 2177 2178 + 2177 2179 2180 2181 2180 2182 2183 2184 + 2183 2185 2186 2187 2186 2188 2189 2190 + 2189 2191 2192 2193 2192 2194 2195 2196 + 2195 2197 2198 2199 2198 2200 2201 2202 + 2201 2203 2204 2205 2204 2206 2207 2208 + 2207 2209 2210 2211 2210 2212 2213 2214 + 2213 2215 2216 2217 2216 2218 2219 2220 + 2219 2221 2222 2223 2222 2224 2225 2226 + 2225 2227 2228 2229 2228 2230 2231 2232 + 2231 2233 2234 2235 2234 2236 2237 2238 + 2237 2239 2240 2241 2240 2242 2243 2244 + 2243 2245 2246 2247 2246 2248 2249 2250 + 2249 2251 2252 2253 2252 2254 2255 2256 + 2255 2257 2258 2259 2258 2260 2261 2262 + 2261 2263 2264 2265 2264 2266 2267 2268 + 2267 2269 2270 2271 2270 2272 2273 2274 + 2273 2275 2276 2277 2276 2278 2279 2280 + 2279 2281 2282 2283 2282 2284 2285 2286 + 2285 2287 2288 2289 2288 2290 2291 2292 + 2291 2293 2294 2295 2294 2296 2297 2298 + 2297 2299 2300 2301 2300 2302 2303 2304 + 2303 2305 2306 2307 2306 2308 2309 2310 + 2309 2311 2312 2313 2312 2314 2315 2316 + 2315 2317 2318 2319 2318 2320 2321 2322 + 2321 2323 2324 2325 2324 2326 2327 2328 + 2327 2329 2330 2331 2330 2332 2333 2334 + 2333 2335 2336 2337 2336 2338 2339 2340 + 2339 2341 2342 2343 2342 2344 2345 2346 + 2345 2347 2348 2349 2348 2350 2351 2352 + 2351 2353 2354 2355 2354 2356 2357 2358 + 2357 2359 2360 2361 2360 2362 2363 2364 + 2363 2365 2366 2367 2366 2368 2369 2370 + 2369 2371 2372 2373 2372 2374 2375 2376 + 2375 2377 2378 2379 2378 2380 2381 2382 + 2381 2383 2384 2385 2384 2386 2387 2388 + 2387 2389 2390 2391 2390 2392 2393 2394 + 2393 2395 2396 2397 2396 2398 2399 2400 + 2399 2401 2402 2403 2402 2404 2405 2406 + 2405 2407 2408 2409 2408 2410 2411 2412 + 2411 2413 2414 2415 2414 2416 2417 2418 + 2417 2419 2420 2421 2420 2422 2423 2424 + 2423 2425 2426 2427 2426 2428 2429 2430 + 2429 2431 2432 2433 2432 2434 2435 2436 + 2435 2437 2438 2439 2438 2440 2441 2442 + 2441 2443 2444 2445 2444 2446 2447 2448 + 2447 2449 2450 2451 2450 2452 2453 2454 + 2453 2455 2456 2457 2456 2458 2459 2460 + 2459 2461 2462 2463 2462 2464 2465 2466 + 2465 2467 2468 2469 2468 2470 2471 2472 + 2471 2473 2474 2475 2474 2476 2477 2478 + 2477 2479 2480 2481 2480 2482 2483 2484 + 2483 2485 2486 2487 2486 2488 2489 2490 + 2489 2491 2492 2493 2492 2494 2495 2496 + 2495 2497 2498 2499 2498 2500 2501 2502 2501 2503 2504 2505 2504 2506 2507 2508 2507 2509 2510 2511 2510 2512 2513 2514 2513 2515 2516 2517 2516 2518 2519 2520 @@ -3907,185 +3907,185 @@ PSF 857 856 858 860 859 861 863 862 864 866 865 867 869 868 870 872 871 873 875 874 876 878 877 879 881 880 882 - 884 883 885 887 886 888 890 889 891 - 893 892 894 896 895 897 899 898 900 - 902 901 903 905 904 906 908 907 909 - 911 910 912 914 913 915 917 916 918 - 920 919 921 923 922 924 926 925 927 - 929 928 930 932 931 933 935 934 936 - 938 937 939 941 940 942 944 943 945 - 947 946 948 950 949 951 953 952 954 - 956 955 957 959 958 960 962 961 963 - 965 964 966 968 967 969 971 970 972 - 974 973 975 977 976 978 980 979 981 - 983 982 984 986 985 987 989 988 990 - 992 991 993 995 994 996 998 997 999 - 1001 1000 1002 1004 1003 1005 1007 1006 1008 - 1010 1009 1011 1013 1012 1014 1016 1015 1017 - 1019 1018 1020 1022 1021 1023 1025 1024 1026 - 1028 1027 1029 1031 1030 1032 1034 1033 1035 - 1037 1036 1038 1040 1039 1041 1043 1042 1044 - 1046 1045 1047 1049 1048 1050 1052 1051 1053 - 1055 1054 1056 1058 1057 1059 1061 1060 1062 - 1064 1063 1065 1067 1066 1068 1070 1069 1071 - 1073 1072 1074 1076 1075 1077 1079 1078 1080 - 1082 1081 1083 1085 1084 1086 1088 1087 1089 - 1091 1090 1092 1094 1093 1095 1097 1096 1098 - 1100 1099 1101 1103 1102 1104 1106 1105 1107 - 1109 1108 1110 1112 1111 1113 1115 1114 1116 - 1118 1117 1119 1121 1120 1122 1124 1123 1125 - 1127 1126 1128 1130 1129 1131 1133 1132 1134 - 1136 1135 1137 1139 1138 1140 1142 1141 1143 - 1145 1144 1146 1148 1147 1149 1151 1150 1152 - 1154 1153 1155 1157 1156 1158 1160 1159 1161 - 1163 1162 1164 1166 1165 1167 1169 1168 1170 - 1172 1171 1173 1175 1174 1176 1178 1177 1179 - 1181 1180 1182 1184 1183 1185 1187 1186 1188 - 1190 1189 1191 1193 1192 1194 1196 1195 1197 - 1199 1198 1200 1202 1201 1203 1205 1204 1206 - 1208 1207 1209 1211 1210 1212 1214 1213 1215 - 1217 1216 1218 1220 1219 1221 1223 1222 1224 - 1226 1225 1227 1229 1228 1230 1232 1231 1233 - 1235 1234 1236 1238 1237 1239 1241 1240 1242 - 1244 1243 1245 1247 1246 1248 1250 1249 1251 - 1253 1252 1254 1256 1255 1257 1259 1258 1260 - 1262 1261 1263 1265 1264 1266 1268 1267 1269 - 1271 1270 1272 1274 1273 1275 1277 1276 1278 - 1280 1279 1281 1283 1282 1284 1286 1285 1287 - 1289 1288 1290 1292 1291 1293 1295 1294 1296 - 1298 1297 1299 1301 1300 1302 1304 1303 1305 - 1307 1306 1308 1310 1309 1311 1313 1312 1314 - 1316 1315 1317 1319 1318 1320 1322 1321 1323 - 1325 1324 1326 1328 1327 1329 1331 1330 1332 - 1334 1333 1335 1337 1336 1338 1340 1339 1341 - 1343 1342 1344 1346 1345 1347 1349 1348 1350 - 1352 1351 1353 1355 1354 1356 1358 1357 1359 - 1361 1360 1362 1364 1363 1365 1367 1366 1368 - 1370 1369 1371 1373 1372 1374 1376 1375 1377 - 1379 1378 1380 1382 1381 1383 1385 1384 1386 - 1388 1387 1389 1391 1390 1392 1394 1393 1395 - 1397 1396 1398 1400 1399 1401 1403 1402 1404 - 1406 1405 1407 1409 1408 1410 1412 1411 1413 - 1415 1414 1416 1418 1417 1419 1421 1420 1422 - 1424 1423 1425 1427 1426 1428 1430 1429 1431 - 1433 1432 1434 1436 1435 1437 1439 1438 1440 - 1442 1441 1443 1445 1444 1446 1448 1447 1449 - 1451 1450 1452 1454 1453 1455 1457 1456 1458 - 1460 1459 1461 1463 1462 1464 1466 1465 1467 - 1469 1468 1470 1472 1471 1473 1475 1474 1476 - 1478 1477 1479 1481 1480 1482 1484 1483 1485 - 1487 1486 1488 1490 1489 1491 1493 1492 1494 - 1496 1495 1497 1499 1498 1500 1502 1501 1503 - 1505 1504 1506 1508 1507 1509 1511 1510 1512 - 1514 1513 1515 1517 1516 1518 1520 1519 1521 - 1523 1522 1524 1526 1525 1527 1530 1529 1531 - 1533 1532 1534 1536 1535 1537 1539 1538 1540 - 1542 1541 1543 1545 1544 1546 1548 1547 1549 - 1551 1550 1552 1554 1553 1555 1557 1556 1558 - 1560 1559 1561 1563 1562 1564 1566 1565 1567 - 1569 1568 1570 1572 1571 1573 1575 1574 1576 - 1578 1577 1579 1581 1580 1582 1584 1583 1585 - 1587 1586 1588 1590 1589 1591 1593 1592 1594 - 1596 1595 1597 1599 1598 1600 1602 1601 1603 - 1605 1604 1606 1608 1607 1609 1611 1610 1612 - 1614 1613 1615 1617 1616 1618 1620 1619 1621 - 1623 1622 1624 1626 1625 1627 1629 1628 1630 - 1632 1631 1633 1635 1634 1636 1638 1637 1639 - 1641 1640 1642 1644 1643 1645 1647 1646 1648 - 1650 1649 1651 1653 1652 1654 1656 1655 1657 - 1659 1658 1660 1662 1661 1663 1665 1664 1666 - 1668 1667 1669 1671 1670 1672 1674 1673 1675 - 1677 1676 1678 1680 1679 1681 1683 1682 1684 - 1686 1685 1687 1689 1688 1690 1692 1691 1693 - 1695 1694 1696 1698 1697 1699 1701 1700 1702 - 1704 1703 1705 1707 1706 1708 1710 1709 1711 - 1713 1712 1714 1716 1715 1717 1719 1718 1720 - 1722 1721 1723 1725 1724 1726 1728 1727 1729 - 1731 1730 1732 1734 1733 1735 1737 1736 1738 - 1740 1739 1741 1743 1742 1744 1746 1745 1747 - 1749 1748 1750 1752 1751 1753 1755 1754 1756 - 1758 1757 1759 1761 1760 1762 1764 1763 1765 - 1767 1766 1768 1770 1769 1771 1773 1772 1774 - 1776 1775 1777 1779 1778 1780 1782 1781 1783 - 1785 1784 1786 1788 1787 1789 1791 1790 1792 - 1794 1793 1795 1797 1796 1798 1800 1799 1801 - 1803 1802 1804 1806 1805 1807 1809 1808 1810 - 1812 1811 1813 1815 1814 1816 1818 1817 1819 - 1821 1820 1822 1824 1823 1825 1827 1826 1828 - 1830 1829 1831 1833 1832 1834 1836 1835 1837 - 1839 1838 1840 1842 1841 1843 1845 1844 1846 - 1848 1847 1849 1851 1850 1852 1854 1853 1855 - 1857 1856 1858 1860 1859 1861 1863 1862 1864 - 1866 1865 1867 1869 1868 1870 1872 1871 1873 - 1875 1874 1876 1878 1877 1879 1881 1880 1882 - 1884 1883 1885 1887 1886 1888 1890 1889 1891 - 1893 1892 1894 1896 1895 1897 1899 1898 1900 - 1902 1901 1903 1905 1904 1906 1908 1907 1909 - 1911 1910 1912 1914 1913 1915 1917 1916 1918 - 1920 1919 1921 1923 1922 1924 1926 1925 1927 - 1929 1928 1930 1932 1931 1933 1935 1934 1936 - 1938 1937 1939 1941 1940 1942 1944 1943 1945 - 1947 1946 1948 1950 1949 1951 1953 1952 1954 - 1956 1955 1957 1959 1958 1960 1962 1961 1963 - 1965 1964 1966 1968 1967 1969 1971 1970 1972 - 1974 1973 1975 1977 1976 1978 1980 1979 1981 - 1983 1982 1984 1986 1985 1987 1989 1988 1990 - 1992 1991 1993 1995 1994 1996 1998 1997 1999 - 2001 2000 2002 2004 2003 2005 2008 2007 2009 - 2011 2010 2012 2014 2013 2015 2017 2016 2018 - 2020 2019 2021 2023 2022 2024 2026 2025 2027 - 2029 2028 2030 2032 2031 2033 2035 2034 2036 - 2038 2037 2039 2041 2040 2042 2044 2043 2045 - 2047 2046 2048 2050 2049 2051 2053 2052 2054 - 2056 2055 2057 2059 2058 2060 2062 2061 2063 - 2065 2064 2066 2068 2067 2069 2071 2070 2072 - 2074 2073 2075 2077 2076 2078 2080 2079 2081 - 2083 2082 2084 2086 2085 2087 2089 2088 2090 - 2092 2091 2093 2095 2094 2096 2098 2097 2099 - 2101 2100 2102 2104 2103 2105 2107 2106 2108 - 2110 2109 2111 2113 2112 2114 2116 2115 2117 - 2119 2118 2120 2122 2121 2123 2125 2124 2126 - 2128 2127 2129 2131 2130 2132 2134 2133 2135 - 2137 2136 2138 2140 2139 2141 2143 2142 2144 - 2146 2145 2147 2149 2148 2150 2152 2151 2153 - 2155 2154 2156 2158 2157 2159 2161 2160 2162 - 2164 2163 2165 2167 2166 2168 2170 2169 2171 - 2173 2172 2174 2176 2175 2177 2179 2178 2180 - 2182 2181 2183 2185 2184 2186 2188 2187 2189 - 2191 2190 2192 2194 2193 2195 2197 2196 2198 - 2200 2199 2201 2203 2202 2204 2206 2205 2207 - 2209 2208 2210 2212 2211 2213 2215 2214 2216 - 2218 2217 2219 2221 2220 2222 2224 2223 2225 - 2227 2226 2228 2230 2229 2231 2233 2232 2234 - 2236 2235 2237 2239 2238 2240 2242 2241 2243 - 2245 2244 2246 2248 2247 2249 2251 2250 2252 - 2254 2253 2255 2257 2256 2258 2260 2259 2261 - 2263 2262 2264 2266 2265 2267 2269 2268 2270 - 2272 2271 2273 2275 2274 2276 2278 2277 2279 - 2281 2280 2282 2284 2283 2285 2287 2286 2288 - 2290 2289 2291 2293 2292 2294 2296 2295 2297 - 2299 2298 2300 2302 2301 2303 2305 2304 2306 - 2308 2307 2309 2311 2310 2312 2314 2313 2315 - 2317 2316 2318 2320 2319 2321 2323 2322 2324 - 2326 2325 2327 2329 2328 2330 2332 2331 2333 - 2335 2334 2336 2338 2337 2339 2341 2340 2342 - 2344 2343 2345 2347 2346 2348 2350 2349 2351 - 2353 2352 2354 2356 2355 2357 2359 2358 2360 - 2362 2361 2363 2366 2365 2367 2369 2368 2370 - 2372 2371 2373 2375 2374 2376 2378 2377 2379 - 2381 2380 2382 2384 2383 2385 2387 2386 2388 - 2390 2389 2391 2393 2392 2394 2396 2395 2397 - 2399 2398 2400 2402 2401 2403 2405 2404 2406 - 2408 2407 2409 2411 2410 2412 2414 2413 2415 - 2417 2416 2418 2420 2419 2421 2423 2422 2424 - 2426 2425 2427 2429 2428 2430 2432 2431 2433 - 2435 2434 2436 2438 2437 2439 2441 2440 2442 - 2444 2443 2445 2447 2446 2448 2450 2449 2451 - 2453 2452 2454 2456 2455 2457 2459 2458 2460 - 2462 2461 2463 2465 2464 2466 2468 2467 2469 - 2471 2470 2472 2474 2473 2475 2477 2476 2478 - 2480 2479 2481 2483 2482 2484 2486 2485 2487 - 2489 2488 2490 2492 2491 2493 2495 2494 2496 + 884 883 885 888 887 889 891 890 892 + 894 893 895 897 896 898 900 899 901 + 903 902 904 906 905 907 909 908 910 + 912 911 913 915 914 916 918 917 919 + 921 920 922 924 923 925 927 926 928 + 930 929 931 933 932 934 936 935 937 + 939 938 940 942 941 943 945 944 946 + 948 947 949 951 950 952 954 953 955 + 957 956 958 960 959 961 963 962 964 + 966 965 967 969 968 970 972 971 973 + 975 974 976 978 977 979 981 980 982 + 984 983 985 987 986 988 990 989 991 + 993 992 994 997 996 998 1000 999 1001 + 1003 1002 1004 1006 1005 1007 1009 1008 1010 + 1012 1011 1013 1015 1014 1016 1018 1017 1019 + 1021 1020 1022 1024 1023 1025 1027 1026 1028 + 1030 1029 1031 1033 1032 1034 1036 1035 1037 + 1039 1038 1040 1042 1041 1043 1045 1044 1046 + 1048 1047 1049 1051 1050 1052 1054 1053 1055 + 1057 1056 1058 1060 1059 1061 1063 1062 1064 + 1066 1065 1067 1069 1068 1070 1072 1071 1073 + 1075 1074 1076 1078 1077 1079 1081 1080 1082 + 1084 1083 1085 1087 1086 1088 1090 1089 1091 + 1093 1092 1094 1096 1095 1097 1099 1098 1100 + 1102 1101 1103 1105 1104 1106 1108 1107 1109 + 1111 1110 1112 1114 1113 1115 1117 1116 1118 + 1120 1119 1121 1123 1122 1124 1126 1125 1127 + 1129 1128 1130 1132 1131 1133 1135 1134 1136 + 1138 1137 1139 1141 1140 1142 1144 1143 1145 + 1147 1146 1148 1150 1149 1151 1153 1152 1154 + 1156 1155 1157 1159 1158 1160 1162 1161 1163 + 1165 1164 1166 1168 1167 1169 1171 1170 1172 + 1174 1173 1175 1177 1176 1178 1180 1179 1181 + 1183 1182 1184 1186 1185 1187 1189 1188 1190 + 1192 1191 1193 1195 1194 1196 1198 1197 1199 + 1201 1200 1202 1204 1203 1205 1207 1206 1208 + 1210 1209 1211 1213 1212 1214 1216 1215 1217 + 1219 1218 1220 1222 1221 1223 1225 1224 1226 + 1228 1227 1229 1231 1230 1232 1234 1233 1235 + 1237 1236 1238 1240 1239 1241 1243 1242 1244 + 1246 1245 1247 1249 1248 1250 1252 1251 1253 + 1255 1254 1256 1258 1257 1259 1261 1260 1262 + 1264 1263 1265 1267 1266 1268 1270 1269 1271 + 1273 1272 1274 1276 1275 1277 1279 1278 1280 + 1282 1281 1283 1285 1284 1286 1288 1287 1289 + 1291 1290 1292 1294 1293 1295 1297 1296 1298 + 1300 1299 1301 1303 1302 1304 1306 1305 1307 + 1309 1308 1310 1312 1311 1313 1315 1314 1316 + 1318 1317 1319 1321 1320 1322 1324 1323 1325 + 1327 1326 1328 1330 1329 1331 1333 1332 1334 + 1336 1335 1337 1339 1338 1340 1342 1341 1343 + 1345 1344 1346 1348 1347 1349 1351 1350 1352 + 1354 1353 1355 1357 1356 1358 1360 1359 1361 + 1363 1362 1364 1366 1365 1367 1369 1368 1370 + 1372 1371 1373 1375 1374 1376 1378 1377 1379 + 1381 1380 1382 1384 1383 1385 1387 1386 1388 + 1390 1389 1391 1393 1392 1394 1396 1395 1397 + 1399 1398 1400 1402 1401 1403 1405 1404 1406 + 1408 1407 1409 1411 1410 1412 1414 1413 1415 + 1417 1416 1418 1420 1419 1421 1423 1422 1424 + 1426 1425 1427 1429 1428 1430 1432 1431 1433 + 1436 1435 1437 1439 1438 1440 1442 1441 1443 + 1445 1444 1446 1448 1447 1449 1451 1450 1452 + 1454 1453 1455 1457 1456 1458 1460 1459 1461 + 1463 1462 1464 1466 1465 1467 1469 1468 1470 + 1472 1471 1473 1475 1474 1476 1478 1477 1479 + 1481 1480 1482 1484 1483 1485 1487 1486 1488 + 1490 1489 1491 1493 1492 1494 1496 1495 1497 + 1499 1498 1500 1502 1501 1503 1505 1504 1506 + 1508 1507 1509 1511 1510 1512 1514 1513 1515 + 1517 1516 1518 1520 1519 1521 1523 1522 1524 + 1526 1525 1527 1529 1528 1530 1532 1531 1533 + 1535 1534 1536 1538 1537 1539 1541 1540 1542 + 1544 1543 1545 1547 1546 1548 1550 1549 1551 + 1553 1552 1554 1556 1555 1557 1559 1558 1560 + 1562 1561 1563 1565 1564 1566 1568 1567 1569 + 1571 1570 1572 1574 1573 1575 1577 1576 1578 + 1580 1579 1581 1583 1582 1584 1586 1585 1587 + 1589 1588 1590 1592 1591 1593 1595 1594 1596 + 1598 1597 1599 1601 1600 1602 1604 1603 1605 + 1607 1606 1608 1610 1609 1611 1613 1612 1614 + 1616 1615 1617 1619 1618 1620 1622 1621 1623 + 1625 1624 1626 1628 1627 1629 1631 1630 1632 + 1634 1633 1635 1637 1636 1638 1640 1639 1641 + 1643 1642 1644 1646 1645 1647 1649 1648 1650 + 1652 1651 1653 1655 1654 1656 1658 1657 1659 + 1661 1660 1662 1664 1663 1665 1667 1666 1668 + 1670 1669 1671 1673 1672 1674 1676 1675 1677 + 1679 1678 1680 1682 1681 1683 1685 1684 1686 + 1688 1687 1689 1691 1690 1692 1694 1693 1695 + 1697 1696 1698 1700 1699 1701 1703 1702 1704 + 1706 1705 1707 1709 1708 1710 1712 1711 1713 + 1715 1714 1716 1718 1717 1719 1721 1720 1722 + 1724 1723 1725 1727 1726 1728 1730 1729 1731 + 1733 1732 1734 1736 1735 1737 1739 1738 1740 + 1742 1741 1743 1745 1744 1746 1748 1747 1749 + 1751 1750 1752 1754 1753 1755 1757 1756 1758 + 1760 1759 1761 1763 1762 1764 1766 1765 1767 + 1769 1768 1770 1772 1771 1773 1775 1774 1776 + 1778 1777 1779 1781 1780 1782 1784 1783 1785 + 1787 1786 1788 1790 1789 1791 1793 1792 1794 + 1796 1795 1797 1799 1798 1800 1802 1801 1803 + 1806 1805 1807 1809 1808 1810 1812 1811 1813 + 1815 1814 1816 1818 1817 1819 1821 1820 1822 + 1824 1823 1825 1827 1826 1828 1830 1829 1831 + 1833 1832 1834 1836 1835 1837 1839 1838 1840 + 1842 1841 1843 1845 1844 1846 1848 1847 1849 + 1851 1850 1852 1854 1853 1855 1857 1856 1858 + 1860 1859 1861 1863 1862 1864 1866 1865 1867 + 1869 1868 1870 1872 1871 1873 1875 1874 1876 + 1878 1877 1879 1881 1880 1882 1884 1883 1885 + 1887 1886 1888 1890 1889 1891 1893 1892 1894 + 1896 1895 1897 1899 1898 1900 1902 1901 1903 + 1905 1904 1906 1908 1907 1909 1911 1910 1912 + 1914 1913 1915 1917 1916 1918 1920 1919 1921 + 1923 1922 1924 1926 1925 1927 1929 1928 1930 + 1932 1931 1933 1935 1934 1936 1938 1937 1939 + 1941 1940 1942 1944 1943 1945 1947 1946 1948 + 1950 1949 1951 1953 1952 1954 1956 1955 1957 + 1959 1958 1960 1962 1961 1963 1965 1964 1966 + 1968 1967 1969 1971 1970 1972 1974 1973 1975 + 1977 1976 1978 1980 1979 1981 1983 1982 1984 + 1986 1985 1987 1989 1988 1990 1992 1991 1993 + 1995 1994 1996 1998 1997 1999 2001 2000 2002 + 2004 2003 2005 2007 2006 2008 2010 2009 2011 + 2013 2012 2014 2016 2015 2017 2019 2018 2020 + 2022 2021 2023 2025 2024 2026 2028 2027 2029 + 2031 2030 2032 2034 2033 2035 2037 2036 2038 + 2040 2039 2041 2043 2042 2044 2046 2045 2047 + 2049 2048 2050 2052 2051 2053 2055 2054 2056 + 2058 2057 2059 2061 2060 2062 2064 2063 2065 + 2067 2066 2068 2070 2069 2071 2073 2072 2074 + 2076 2075 2077 2079 2078 2080 2082 2081 2083 + 2085 2084 2086 2088 2087 2089 2091 2090 2092 + 2094 2093 2095 2097 2096 2098 2100 2099 2101 + 2103 2102 2104 2106 2105 2107 2109 2108 2110 + 2112 2111 2113 2115 2114 2116 2118 2117 2119 + 2121 2120 2122 2124 2123 2125 2127 2126 2128 + 2130 2129 2131 2133 2132 2134 2136 2135 2137 + 2139 2138 2140 2142 2141 2143 2145 2144 2146 + 2148 2147 2149 2151 2150 2152 2154 2153 2155 + 2157 2156 2158 2160 2159 2161 2163 2162 2164 + 2166 2165 2167 2169 2168 2170 2172 2171 2173 + 2175 2174 2176 2178 2177 2179 2181 2180 2182 + 2184 2183 2185 2187 2186 2188 2190 2189 2191 + 2193 2192 2194 2196 2195 2197 2199 2198 2200 + 2202 2201 2203 2205 2204 2206 2208 2207 2209 + 2211 2210 2212 2214 2213 2215 2217 2216 2218 + 2220 2219 2221 2223 2222 2224 2226 2225 2227 + 2229 2228 2230 2232 2231 2233 2235 2234 2236 + 2238 2237 2239 2241 2240 2242 2244 2243 2245 + 2247 2246 2248 2250 2249 2251 2253 2252 2254 + 2256 2255 2257 2259 2258 2260 2262 2261 2263 + 2265 2264 2266 2268 2267 2269 2271 2270 2272 + 2274 2273 2275 2277 2276 2278 2280 2279 2281 + 2283 2282 2284 2286 2285 2287 2289 2288 2290 + 2292 2291 2293 2295 2294 2296 2298 2297 2299 + 2301 2300 2302 2304 2303 2305 2307 2306 2308 + 2310 2309 2311 2313 2312 2314 2316 2315 2317 + 2319 2318 2320 2322 2321 2323 2325 2324 2326 + 2328 2327 2329 2331 2330 2332 2334 2333 2335 + 2337 2336 2338 2340 2339 2341 2343 2342 2344 + 2346 2345 2347 2349 2348 2350 2352 2351 2353 + 2355 2354 2356 2358 2357 2359 2361 2360 2362 + 2364 2363 2365 2367 2366 2368 2370 2369 2371 + 2373 2372 2374 2376 2375 2377 2379 2378 2380 + 2382 2381 2383 2385 2384 2386 2388 2387 2389 + 2391 2390 2392 2394 2393 2395 2397 2396 2398 + 2400 2399 2401 2403 2402 2404 2406 2405 2407 + 2409 2408 2410 2412 2411 2413 2415 2414 2416 + 2418 2417 2419 2421 2420 2422 2424 2423 2425 + 2427 2426 2428 2430 2429 2431 2433 2432 2434 + 2436 2435 2437 2439 2438 2440 2442 2441 2443 + 2445 2444 2446 2448 2447 2449 2451 2450 2452 + 2454 2453 2455 2457 2456 2458 2460 2459 2461 + 2463 2462 2464 2466 2465 2467 2469 2468 2470 + 2472 2471 2473 2475 2474 2476 2478 2477 2479 + 2481 2480 2482 2484 2483 2485 2487 2486 2488 + 2490 2489 2491 2493 2492 2494 2496 2495 2497 2499 2498 2500 2502 2501 2503 2505 2504 2506 2508 2507 2509 2511 2510 2512 2514 2513 2515 2517 2516 2518 2520 2519 2521 2523 2522 2524 diff --git a/tools/ch2lmp/example-cmap/convert.sh b/tools/ch2lmp/example-cmap/convert.sh new file mode 100755 index 0000000000..88c4de8178 --- /dev/null +++ b/tools/ch2lmp/example-cmap/convert.sh @@ -0,0 +1,4 @@ +#!/bin/sh +rm -f *.dump *.restart? *.restart +../charmm2lammps.pl -border=2.0 -cmap=36 -ions -water all36_prot 1gb1 +cp ../../../potentials/charmm36.cmap . diff --git a/tools/ch2lmp/example/1ac7.data b/tools/ch2lmp/example/1ac7.data index 152a74c019..1247597c90 100644 --- a/tools/ch2lmp/example/1ac7.data +++ b/tools/ch2lmp/example/1ac7.data @@ -1,4 +1,4 @@ -LAMMPS data file. CGCMM Style. atom_style full. Created by charmm2lammps v1.9.1 on Wed Oct 5 18:18:20 EDT 2016 +LAMMPS data file. CGCMM Style. atom_style full. Created by charmm2lammps v1.9.1 on Sun Jan 28 05:46:18 EST 2018 1968 atoms 1516 bonds @@ -692,109 +692,109 @@ Atoms # full 588 53 30 -0.834 -10.3922180683 1.81228193171 20.4215129059 # OT 589 53 1 0.417 -9.63526774103 2.39816420833 20.4215129059 # HT 590 53 1 0.417 -11.1491683956 2.39816420833 20.4215129059 # HT - 591 54 38 1 -10.3922180683 -0.650923230659 22.8847180683 # SOD - 592 55 30 -0.834 -12.8554232307 1.81228193171 22.8847180683 # OT - 593 55 1 0.417 -12.0984729034 2.39816420833 22.8847180683 # HT - 594 55 1 0.417 -13.6123735579 2.39816420833 22.8847180683 # HT - 595 56 30 -0.834 -12.8554232307 -0.650923230659 25.3479232307 # OT - 596 56 1 0.417 -12.0984729034 -0.0650409540408 25.3479232307 # HT - 597 56 1 0.417 -13.6123735579 -0.0650409540408 25.3479232307 # HT - 598 57 30 -0.834 -10.3922180683 1.81228193171 25.3479232307 # OT - 599 57 1 0.417 -9.63526774103 2.39816420833 25.3479232307 # HT - 600 57 1 0.417 -11.1491683956 2.39816420833 25.3479232307 # HT - 601 58 30 -0.834 -10.3922180683 -0.650923230659 27.811128393 # OT - 602 58 1 0.417 -9.63526774103 -0.0650409540408 27.811128393 # HT - 603 58 1 0.417 -11.1491683956 -0.0650409540408 27.811128393 # HT - 604 59 30 -0.834 -12.8554232307 1.81228193171 27.811128393 # OT - 605 59 1 0.417 -12.0984729034 2.39816420833 27.811128393 # HT - 606 59 1 0.417 -13.6123735579 2.39816420833 27.811128393 # HT - 607 60 30 -0.834 -12.8554232307 -0.650923230659 30.2743335554 # OT - 608 60 1 0.417 -12.0984729034 -0.0650409540408 30.2743335554 # HT - 609 60 1 0.417 -13.6123735579 -0.0650409540408 30.2743335554 # HT - 610 61 30 -0.834 -10.3922180683 1.81228193171 30.2743335554 # OT - 611 61 1 0.417 -9.63526774103 2.39816420833 30.2743335554 # HT - 612 61 1 0.417 -11.1491683956 2.39816420833 30.2743335554 # HT - 613 62 30 -0.834 -10.3922180683 -0.650923230659 32.7375387178 # OT - 614 62 1 0.417 -9.63526774103 -0.0650409540408 32.7375387178 # HT - 615 62 1 0.417 -11.1491683956 -0.0650409540408 32.7375387178 # HT - 616 63 30 -0.834 -12.8554232307 1.81228193171 32.7375387178 # OT - 617 63 1 0.417 -12.0984729034 2.39816420833 32.7375387178 # HT - 618 63 1 0.417 -13.6123735579 2.39816420833 32.7375387178 # HT - 619 64 30 -0.834 -12.8554232307 4.27548709408 -4.21053871777 # OT - 620 64 1 0.417 -12.0984729034 4.8613693707 -4.21053871777 # HT - 621 64 1 0.417 -13.6123735579 4.8613693707 -4.21053871777 # HT - 622 65 30 -0.834 -10.3922180683 6.73869225645 -4.21053871777 # OT - 623 65 1 0.417 -9.63526774103 7.32457453307 -4.21053871777 # HT - 624 65 1 0.417 -11.1491683956 7.32457453307 -4.21053871777 # HT - 625 66 30 -0.834 -10.3922180683 4.27548709408 -1.7473335554 # OT - 626 66 1 0.417 -9.63526774103 4.8613693707 -1.7473335554 # HT - 627 66 1 0.417 -11.1491683956 4.8613693707 -1.7473335554 # HT - 628 67 30 -0.834 -12.8554232307 6.73869225645 -1.7473335554 # OT - 629 67 1 0.417 -12.0984729034 7.32457453307 -1.7473335554 # HT - 630 67 1 0.417 -13.6123735579 7.32457453307 -1.7473335554 # HT - 631 68 30 -0.834 -12.8554232307 4.27548709408 0.715871606972 # OT - 632 68 1 0.417 -12.0984729034 4.8613693707 0.715871606972 # HT - 633 68 1 0.417 -13.6123735579 4.8613693707 0.715871606972 # HT - 634 69 30 -0.834 -10.3922180683 6.73869225645 0.715871606972 # OT - 635 69 1 0.417 -9.63526774103 7.32457453307 0.715871606972 # HT - 636 69 1 0.417 -11.1491683956 7.32457453307 0.715871606972 # HT - 637 70 30 -0.834 -10.3922180683 4.27548709408 3.17907676934 # OT - 638 70 1 0.417 -9.63526774103 4.8613693707 3.17907676934 # HT - 639 70 1 0.417 -11.1491683956 4.8613693707 3.17907676934 # HT - 640 71 30 -0.834 -12.8554232307 6.73869225645 3.17907676934 # OT - 641 71 1 0.417 -12.0984729034 7.32457453307 3.17907676934 # HT - 642 71 1 0.417 -13.6123735579 7.32457453307 3.17907676934 # HT - 643 72 30 -0.834 -12.8554232307 4.27548709408 5.64228193171 # OT - 644 72 1 0.417 -12.0984729034 4.8613693707 5.64228193171 # HT - 645 72 1 0.417 -13.6123735579 4.8613693707 5.64228193171 # HT - 646 73 30 -0.834 -12.8554232307 6.73869225645 13.0318974188 # OT - 647 73 1 0.417 -12.0984729034 7.32457453307 13.0318974188 # HT - 648 73 1 0.417 -13.6123735579 7.32457453307 13.0318974188 # HT - 649 74 30 -0.834 -12.8554232307 4.27548709408 15.4951025812 # OT - 650 74 1 0.417 -12.0984729034 4.8613693707 15.4951025812 # HT - 651 74 1 0.417 -13.6123735579 4.8613693707 15.4951025812 # HT - 652 75 30 -0.834 -10.3922180683 4.27548709408 17.9583077436 # OT - 653 75 1 0.417 -9.63526774103 4.8613693707 17.9583077436 # HT - 654 75 1 0.417 -11.1491683956 4.8613693707 17.9583077436 # HT - 655 76 30 -0.834 -12.8554232307 6.73869225645 17.9583077436 # OT - 656 76 1 0.417 -12.0984729034 7.32457453307 17.9583077436 # HT - 657 76 1 0.417 -13.6123735579 7.32457453307 17.9583077436 # HT - 658 77 30 -0.834 -12.8554232307 4.27548709408 20.4215129059 # OT - 659 77 1 0.417 -12.0984729034 4.8613693707 20.4215129059 # HT - 660 77 1 0.417 -13.6123735579 4.8613693707 20.4215129059 # HT - 661 78 30 -0.834 -10.3922180683 6.73869225645 20.4215129059 # OT - 662 78 1 0.417 -9.63526774103 7.32457453307 20.4215129059 # HT - 663 78 1 0.417 -11.1491683956 7.32457453307 20.4215129059 # HT - 664 79 30 -0.834 -10.3922180683 4.27548709408 22.8847180683 # OT - 665 79 1 0.417 -9.63526774103 4.8613693707 22.8847180683 # HT - 666 79 1 0.417 -11.1491683956 4.8613693707 22.8847180683 # HT - 667 80 30 -0.834 -12.8554232307 6.73869225645 22.8847180683 # OT - 668 80 1 0.417 -12.0984729034 7.32457453307 22.8847180683 # HT - 669 80 1 0.417 -13.6123735579 7.32457453307 22.8847180683 # HT - 670 81 30 -0.834 -12.8554232307 4.27548709408 25.3479232307 # OT - 671 81 1 0.417 -12.0984729034 4.8613693707 25.3479232307 # HT - 672 81 1 0.417 -13.6123735579 4.8613693707 25.3479232307 # HT - 673 82 30 -0.834 -10.3922180683 6.73869225645 25.3479232307 # OT - 674 82 1 0.417 -9.63526774103 7.32457453307 25.3479232307 # HT - 675 82 1 0.417 -11.1491683956 7.32457453307 25.3479232307 # HT - 676 83 30 -0.834 -10.3922180683 4.27548709408 27.811128393 # OT - 677 83 1 0.417 -9.63526774103 4.8613693707 27.811128393 # HT - 678 83 1 0.417 -11.1491683956 4.8613693707 27.811128393 # HT - 679 84 30 -0.834 -12.8554232307 6.73869225645 27.811128393 # OT - 680 84 1 0.417 -12.0984729034 7.32457453307 27.811128393 # HT - 681 84 1 0.417 -13.6123735579 7.32457453307 27.811128393 # HT - 682 85 30 -0.834 -12.8554232307 4.27548709408 30.2743335554 # OT - 683 85 1 0.417 -12.0984729034 4.8613693707 30.2743335554 # HT - 684 85 1 0.417 -13.6123735579 4.8613693707 30.2743335554 # HT - 685 86 30 -0.834 -10.3922180683 6.73869225645 30.2743335554 # OT - 686 86 1 0.417 -9.63526774103 7.32457453307 30.2743335554 # HT - 687 86 1 0.417 -11.1491683956 7.32457453307 30.2743335554 # HT - 688 87 30 -0.834 -10.3922180683 4.27548709408 32.7375387178 # OT - 689 87 1 0.417 -9.63526774103 4.8613693707 32.7375387178 # HT - 690 87 1 0.417 -11.1491683956 4.8613693707 32.7375387178 # HT - 691 88 30 -0.834 -12.8554232307 6.73869225645 32.7375387178 # OT - 692 88 1 0.417 -12.0984729034 7.32457453307 32.7375387178 # HT - 693 88 1 0.417 -13.6123735579 7.32457453307 32.7375387178 # HT + 591 54 30 -0.834 -10.3922180683 -0.650923230659 22.8847180683 # OT + 592 54 1 0.417 -9.63526774103 -0.0650409540408 22.8847180683 # HT + 593 54 1 0.417 -11.1491683956 -0.0650409540408 22.8847180683 # HT + 594 55 30 -0.834 -12.8554232307 1.81228193171 22.8847180683 # OT + 595 55 1 0.417 -12.0984729034 2.39816420833 22.8847180683 # HT + 596 55 1 0.417 -13.6123735579 2.39816420833 22.8847180683 # HT + 597 56 30 -0.834 -12.8554232307 -0.650923230659 25.3479232307 # OT + 598 56 1 0.417 -12.0984729034 -0.0650409540408 25.3479232307 # HT + 599 56 1 0.417 -13.6123735579 -0.0650409540408 25.3479232307 # HT + 600 57 30 -0.834 -10.3922180683 1.81228193171 25.3479232307 # OT + 601 57 1 0.417 -9.63526774103 2.39816420833 25.3479232307 # HT + 602 57 1 0.417 -11.1491683956 2.39816420833 25.3479232307 # HT + 603 58 30 -0.834 -10.3922180683 -0.650923230659 27.811128393 # OT + 604 58 1 0.417 -9.63526774103 -0.0650409540408 27.811128393 # HT + 605 58 1 0.417 -11.1491683956 -0.0650409540408 27.811128393 # HT + 606 59 30 -0.834 -12.8554232307 1.81228193171 27.811128393 # OT + 607 59 1 0.417 -12.0984729034 2.39816420833 27.811128393 # HT + 608 59 1 0.417 -13.6123735579 2.39816420833 27.811128393 # HT + 609 60 30 -0.834 -12.8554232307 -0.650923230659 30.2743335554 # OT + 610 60 1 0.417 -12.0984729034 -0.0650409540408 30.2743335554 # HT + 611 60 1 0.417 -13.6123735579 -0.0650409540408 30.2743335554 # HT + 612 61 30 -0.834 -10.3922180683 1.81228193171 30.2743335554 # OT + 613 61 1 0.417 -9.63526774103 2.39816420833 30.2743335554 # HT + 614 61 1 0.417 -11.1491683956 2.39816420833 30.2743335554 # HT + 615 62 30 -0.834 -10.3922180683 -0.650923230659 32.7375387178 # OT + 616 62 1 0.417 -9.63526774103 -0.0650409540408 32.7375387178 # HT + 617 62 1 0.417 -11.1491683956 -0.0650409540408 32.7375387178 # HT + 618 63 30 -0.834 -12.8554232307 1.81228193171 32.7375387178 # OT + 619 63 1 0.417 -12.0984729034 2.39816420833 32.7375387178 # HT + 620 63 1 0.417 -13.6123735579 2.39816420833 32.7375387178 # HT + 621 64 30 -0.834 -12.8554232307 4.27548709408 -4.21053871777 # OT + 622 64 1 0.417 -12.0984729034 4.8613693707 -4.21053871777 # HT + 623 64 1 0.417 -13.6123735579 4.8613693707 -4.21053871777 # HT + 624 65 30 -0.834 -10.3922180683 6.73869225645 -4.21053871777 # OT + 625 65 1 0.417 -9.63526774103 7.32457453307 -4.21053871777 # HT + 626 65 1 0.417 -11.1491683956 7.32457453307 -4.21053871777 # HT + 627 66 30 -0.834 -10.3922180683 4.27548709408 -1.7473335554 # OT + 628 66 1 0.417 -9.63526774103 4.8613693707 -1.7473335554 # HT + 629 66 1 0.417 -11.1491683956 4.8613693707 -1.7473335554 # HT + 630 67 30 -0.834 -12.8554232307 6.73869225645 -1.7473335554 # OT + 631 67 1 0.417 -12.0984729034 7.32457453307 -1.7473335554 # HT + 632 67 1 0.417 -13.6123735579 7.32457453307 -1.7473335554 # HT + 633 68 30 -0.834 -12.8554232307 4.27548709408 0.715871606972 # OT + 634 68 1 0.417 -12.0984729034 4.8613693707 0.715871606972 # HT + 635 68 1 0.417 -13.6123735579 4.8613693707 0.715871606972 # HT + 636 69 30 -0.834 -10.3922180683 6.73869225645 0.715871606972 # OT + 637 69 1 0.417 -9.63526774103 7.32457453307 0.715871606972 # HT + 638 69 1 0.417 -11.1491683956 7.32457453307 0.715871606972 # HT + 639 70 30 -0.834 -10.3922180683 4.27548709408 3.17907676934 # OT + 640 70 1 0.417 -9.63526774103 4.8613693707 3.17907676934 # HT + 641 70 1 0.417 -11.1491683956 4.8613693707 3.17907676934 # HT + 642 71 30 -0.834 -12.8554232307 6.73869225645 3.17907676934 # OT + 643 71 1 0.417 -12.0984729034 7.32457453307 3.17907676934 # HT + 644 71 1 0.417 -13.6123735579 7.32457453307 3.17907676934 # HT + 645 72 30 -0.834 -12.8554232307 4.27548709408 5.64228193171 # OT + 646 72 1 0.417 -12.0984729034 4.8613693707 5.64228193171 # HT + 647 72 1 0.417 -13.6123735579 4.8613693707 5.64228193171 # HT + 648 73 30 -0.834 -12.8554232307 6.73869225645 13.0318974188 # OT + 649 73 1 0.417 -12.0984729034 7.32457453307 13.0318974188 # HT + 650 73 1 0.417 -13.6123735579 7.32457453307 13.0318974188 # HT + 651 74 30 -0.834 -12.8554232307 4.27548709408 15.4951025812 # OT + 652 74 1 0.417 -12.0984729034 4.8613693707 15.4951025812 # HT + 653 74 1 0.417 -13.6123735579 4.8613693707 15.4951025812 # HT + 654 75 30 -0.834 -10.3922180683 4.27548709408 17.9583077436 # OT + 655 75 1 0.417 -9.63526774103 4.8613693707 17.9583077436 # HT + 656 75 1 0.417 -11.1491683956 4.8613693707 17.9583077436 # HT + 657 76 30 -0.834 -12.8554232307 6.73869225645 17.9583077436 # OT + 658 76 1 0.417 -12.0984729034 7.32457453307 17.9583077436 # HT + 659 76 1 0.417 -13.6123735579 7.32457453307 17.9583077436 # HT + 660 77 30 -0.834 -12.8554232307 4.27548709408 20.4215129059 # OT + 661 77 1 0.417 -12.0984729034 4.8613693707 20.4215129059 # HT + 662 77 1 0.417 -13.6123735579 4.8613693707 20.4215129059 # HT + 663 78 30 -0.834 -10.3922180683 6.73869225645 20.4215129059 # OT + 664 78 1 0.417 -9.63526774103 7.32457453307 20.4215129059 # HT + 665 78 1 0.417 -11.1491683956 7.32457453307 20.4215129059 # HT + 666 79 30 -0.834 -10.3922180683 4.27548709408 22.8847180683 # OT + 667 79 1 0.417 -9.63526774103 4.8613693707 22.8847180683 # HT + 668 79 1 0.417 -11.1491683956 4.8613693707 22.8847180683 # HT + 669 80 30 -0.834 -12.8554232307 6.73869225645 22.8847180683 # OT + 670 80 1 0.417 -12.0984729034 7.32457453307 22.8847180683 # HT + 671 80 1 0.417 -13.6123735579 7.32457453307 22.8847180683 # HT + 672 81 30 -0.834 -12.8554232307 4.27548709408 25.3479232307 # OT + 673 81 1 0.417 -12.0984729034 4.8613693707 25.3479232307 # HT + 674 81 1 0.417 -13.6123735579 4.8613693707 25.3479232307 # HT + 675 82 30 -0.834 -10.3922180683 6.73869225645 25.3479232307 # OT + 676 82 1 0.417 -9.63526774103 7.32457453307 25.3479232307 # HT + 677 82 1 0.417 -11.1491683956 7.32457453307 25.3479232307 # HT + 678 83 30 -0.834 -10.3922180683 4.27548709408 27.811128393 # OT + 679 83 1 0.417 -9.63526774103 4.8613693707 27.811128393 # HT + 680 83 1 0.417 -11.1491683956 4.8613693707 27.811128393 # HT + 681 84 30 -0.834 -12.8554232307 6.73869225645 27.811128393 # OT + 682 84 1 0.417 -12.0984729034 7.32457453307 27.811128393 # HT + 683 84 1 0.417 -13.6123735579 7.32457453307 27.811128393 # HT + 684 85 30 -0.834 -12.8554232307 4.27548709408 30.2743335554 # OT + 685 85 1 0.417 -12.0984729034 4.8613693707 30.2743335554 # HT + 686 85 1 0.417 -13.6123735579 4.8613693707 30.2743335554 # HT + 687 86 30 -0.834 -10.3922180683 6.73869225645 30.2743335554 # OT + 688 86 1 0.417 -9.63526774103 7.32457453307 30.2743335554 # HT + 689 86 1 0.417 -11.1491683956 7.32457453307 30.2743335554 # HT + 690 87 30 -0.834 -10.3922180683 4.27548709408 32.7375387178 # OT + 691 87 1 0.417 -9.63526774103 4.8613693707 32.7375387178 # HT + 692 87 1 0.417 -11.1491683956 4.8613693707 32.7375387178 # HT + 693 88 38 1 -12.8554232307 6.73869225645 32.7375387178 # SOD 694 89 30 -0.834 -12.8554232307 9.20189741882 -4.21053871777 # OT 695 89 1 0.417 -12.0984729034 9.78777969543 -4.21053871777 # HT 696 89 1 0.417 -13.6123735579 9.78777969543 -4.21053871777 # HT @@ -915,40 +915,40 @@ Atoms # full 811 128 30 -0.834 -12.8554232307 19.0547180683 0.715871606972 # OT 812 128 1 0.417 -12.0984729034 19.6406003449 0.715871606972 # HT 813 128 1 0.417 -13.6123735579 19.6406003449 0.715871606972 # HT - 814 129 30 -0.834 -10.3922180683 21.5179232307 0.715871606972 # OT - 815 129 1 0.417 -9.63526774103 22.1038055073 0.715871606972 # HT - 816 129 1 0.417 -11.1491683956 22.1038055073 0.715871606972 # HT - 817 130 30 -0.834 -10.3922180683 19.0547180683 3.17907676934 # OT - 818 130 1 0.417 -9.63526774103 19.6406003449 3.17907676934 # HT - 819 130 1 0.417 -11.1491683956 19.6406003449 3.17907676934 # HT - 820 131 30 -0.834 -12.8554232307 21.5179232307 3.17907676934 # OT - 821 131 1 0.417 -12.0984729034 22.1038055073 3.17907676934 # HT - 822 131 1 0.417 -13.6123735579 22.1038055073 3.17907676934 # HT - 823 132 30 -0.834 -12.8554232307 19.0547180683 5.64228193171 # OT - 824 132 1 0.417 -12.0984729034 19.6406003449 5.64228193171 # HT - 825 132 1 0.417 -13.6123735579 19.6406003449 5.64228193171 # HT - 826 133 30 -0.834 -10.3922180683 21.5179232307 5.64228193171 # OT - 827 133 1 0.417 -9.63526774103 22.1038055073 5.64228193171 # HT - 828 133 1 0.417 -11.1491683956 22.1038055073 5.64228193171 # HT - 829 134 30 -0.834 -10.3922180683 19.0547180683 8.10548709408 # OT - 830 134 1 0.417 -9.63526774103 19.6406003449 8.10548709408 # HT - 831 134 1 0.417 -11.1491683956 19.6406003449 8.10548709408 # HT - 832 135 30 -0.834 -12.8554232307 21.5179232307 8.10548709408 # OT - 833 135 1 0.417 -12.0984729034 22.1038055073 8.10548709408 # HT - 834 135 1 0.417 -13.6123735579 22.1038055073 8.10548709408 # HT - 835 136 30 -0.834 -12.8554232307 19.0547180683 10.5686922564 # OT - 836 136 1 0.417 -12.0984729034 19.6406003449 10.5686922564 # HT - 837 136 1 0.417 -13.6123735579 19.6406003449 10.5686922564 # HT - 838 137 30 -0.834 -10.3922180683 21.5179232307 10.5686922564 # OT - 839 137 1 0.417 -9.63526774103 22.1038055073 10.5686922564 # HT - 840 137 1 0.417 -11.1491683956 22.1038055073 10.5686922564 # HT - 841 138 30 -0.834 -12.8554232307 21.5179232307 13.0318974188 # OT - 842 138 1 0.417 -12.0984729034 22.1038055073 13.0318974188 # HT - 843 138 1 0.417 -13.6123735579 22.1038055073 13.0318974188 # HT - 844 139 30 -0.834 -10.3922180683 21.5179232307 15.4951025812 # OT - 845 139 1 0.417 -9.63526774103 22.1038055073 15.4951025812 # HT - 846 139 1 0.417 -11.1491683956 22.1038055073 15.4951025812 # HT - 847 140 38 1 -12.8554232307 21.5179232307 17.9583077436 # SOD + 814 129 38 1 -10.3922180683 21.5179232307 0.715871606972 # SOD + 815 130 30 -0.834 -10.3922180683 19.0547180683 3.17907676934 # OT + 816 130 1 0.417 -9.63526774103 19.6406003449 3.17907676934 # HT + 817 130 1 0.417 -11.1491683956 19.6406003449 3.17907676934 # HT + 818 131 30 -0.834 -12.8554232307 21.5179232307 3.17907676934 # OT + 819 131 1 0.417 -12.0984729034 22.1038055073 3.17907676934 # HT + 820 131 1 0.417 -13.6123735579 22.1038055073 3.17907676934 # HT + 821 132 30 -0.834 -12.8554232307 19.0547180683 5.64228193171 # OT + 822 132 1 0.417 -12.0984729034 19.6406003449 5.64228193171 # HT + 823 132 1 0.417 -13.6123735579 19.6406003449 5.64228193171 # HT + 824 133 30 -0.834 -10.3922180683 21.5179232307 5.64228193171 # OT + 825 133 1 0.417 -9.63526774103 22.1038055073 5.64228193171 # HT + 826 133 1 0.417 -11.1491683956 22.1038055073 5.64228193171 # HT + 827 134 30 -0.834 -10.3922180683 19.0547180683 8.10548709408 # OT + 828 134 1 0.417 -9.63526774103 19.6406003449 8.10548709408 # HT + 829 134 1 0.417 -11.1491683956 19.6406003449 8.10548709408 # HT + 830 135 30 -0.834 -12.8554232307 21.5179232307 8.10548709408 # OT + 831 135 1 0.417 -12.0984729034 22.1038055073 8.10548709408 # HT + 832 135 1 0.417 -13.6123735579 22.1038055073 8.10548709408 # HT + 833 136 30 -0.834 -12.8554232307 19.0547180683 10.5686922564 # OT + 834 136 1 0.417 -12.0984729034 19.6406003449 10.5686922564 # HT + 835 136 1 0.417 -13.6123735579 19.6406003449 10.5686922564 # HT + 836 137 30 -0.834 -10.3922180683 21.5179232307 10.5686922564 # OT + 837 137 1 0.417 -9.63526774103 22.1038055073 10.5686922564 # HT + 838 137 1 0.417 -11.1491683956 22.1038055073 10.5686922564 # HT + 839 138 30 -0.834 -12.8554232307 21.5179232307 13.0318974188 # OT + 840 138 1 0.417 -12.0984729034 22.1038055073 13.0318974188 # HT + 841 138 1 0.417 -13.6123735579 22.1038055073 13.0318974188 # HT + 842 139 30 -0.834 -10.3922180683 21.5179232307 15.4951025812 # OT + 843 139 1 0.417 -9.63526774103 22.1038055073 15.4951025812 # HT + 844 139 1 0.417 -11.1491683956 22.1038055073 15.4951025812 # HT + 845 140 30 -0.834 -12.8554232307 21.5179232307 17.9583077436 # OT + 846 140 1 0.417 -12.0984729034 22.1038055073 17.9583077436 # HT + 847 140 1 0.417 -13.6123735579 22.1038055073 17.9583077436 # HT 848 141 30 -0.834 -12.8554232307 19.0547180683 20.4215129059 # OT 849 141 1 0.417 -12.0984729034 19.6406003449 20.4215129059 # HT 850 141 1 0.417 -13.6123735579 19.6406003449 20.4215129059 # HT @@ -961,10 +961,10 @@ Atoms # full 857 144 30 -0.834 -12.8554232307 21.5179232307 22.8847180683 # OT 858 144 1 0.417 -12.0984729034 22.1038055073 22.8847180683 # HT 859 144 1 0.417 -13.6123735579 22.1038055073 22.8847180683 # HT - 860 145 38 1 -12.8554232307 19.0547180683 25.3479232307 # SOD - 861 146 30 -0.834 -10.3922180683 21.5179232307 25.3479232307 # OT - 862 146 1 0.417 -9.63526774103 22.1038055073 25.3479232307 # HT - 863 146 1 0.417 -11.1491683956 22.1038055073 25.3479232307 # HT + 860 145 30 -0.834 -12.8554232307 19.0547180683 25.3479232307 # OT + 861 145 1 0.417 -12.0984729034 19.6406003449 25.3479232307 # HT + 862 145 1 0.417 -13.6123735579 19.6406003449 25.3479232307 # HT + 863 146 38 1 -10.3922180683 21.5179232307 25.3479232307 # SOD 864 147 30 -0.834 -10.3922180683 19.0547180683 27.811128393 # OT 865 147 1 0.417 -9.63526774103 19.6406003449 27.811128393 # HT 866 147 1 0.417 -11.1491683956 19.6406003449 27.811128393 # HT @@ -1004,95 +1004,95 @@ Atoms # full 900 159 30 -0.834 -5.46580774355 -0.650923230659 3.17907676934 # OT 901 159 1 0.417 -4.70885741629 -0.0650409540408 3.17907676934 # HT 902 159 1 0.417 -6.22275807082 -0.0650409540408 3.17907676934 # HT - 903 160 38 1 -7.92901290592 1.81228193171 3.17907676934 # SOD - 904 161 30 -0.834 -7.92901290592 -0.650923230659 5.64228193171 # OT - 905 161 1 0.417 -7.17206257866 -0.0650409540408 5.64228193171 # HT - 906 161 1 0.417 -8.68596323319 -0.0650409540408 5.64228193171 # HT - 907 162 30 -0.834 -5.46580774355 1.81228193171 5.64228193171 # OT - 908 162 1 0.417 -4.70885741629 2.39816420833 5.64228193171 # HT - 909 162 1 0.417 -6.22275807082 2.39816420833 5.64228193171 # HT - 910 163 30 -0.834 -5.46580774355 -0.650923230659 8.10548709408 # OT - 911 163 1 0.417 -4.70885741629 -0.0650409540408 8.10548709408 # HT - 912 163 1 0.417 -6.22275807082 -0.0650409540408 8.10548709408 # HT - 913 164 30 -0.834 -7.92901290592 -0.650923230659 10.5686922564 # OT - 914 164 1 0.417 -7.17206257866 -0.0650409540408 10.5686922564 # HT - 915 164 1 0.417 -8.68596323319 -0.0650409540408 10.5686922564 # HT - 916 165 30 -0.834 -5.46580774355 1.81228193171 10.5686922564 # OT - 917 165 1 0.417 -4.70885741629 2.39816420833 10.5686922564 # HT - 918 165 1 0.417 -6.22275807082 2.39816420833 10.5686922564 # HT - 919 166 30 -0.834 -5.46580774355 -0.650923230659 17.9583077436 # OT - 920 166 1 0.417 -4.70885741629 -0.0650409540408 17.9583077436 # HT - 921 166 1 0.417 -6.22275807082 -0.0650409540408 17.9583077436 # HT - 922 167 30 -0.834 -7.92901290592 1.81228193171 17.9583077436 # OT - 923 167 1 0.417 -7.17206257866 2.39816420833 17.9583077436 # HT - 924 167 1 0.417 -8.68596323319 2.39816420833 17.9583077436 # HT - 925 168 30 -0.834 -7.92901290592 -0.650923230659 20.4215129059 # OT - 926 168 1 0.417 -7.17206257866 -0.0650409540408 20.4215129059 # HT - 927 168 1 0.417 -8.68596323319 -0.0650409540408 20.4215129059 # HT - 928 169 30 -0.834 -5.46580774355 -0.650923230659 22.8847180683 # OT - 929 169 1 0.417 -4.70885741629 -0.0650409540408 22.8847180683 # HT - 930 169 1 0.417 -6.22275807082 -0.0650409540408 22.8847180683 # HT - 931 170 30 -0.834 -7.92901290592 1.81228193171 22.8847180683 # OT - 932 170 1 0.417 -7.17206257866 2.39816420833 22.8847180683 # HT - 933 170 1 0.417 -8.68596323319 2.39816420833 22.8847180683 # HT - 934 171 30 -0.834 -7.92901290592 -0.650923230659 25.3479232307 # OT - 935 171 1 0.417 -7.17206257866 -0.0650409540408 25.3479232307 # HT - 936 171 1 0.417 -8.68596323319 -0.0650409540408 25.3479232307 # HT - 937 172 30 -0.834 -5.46580774355 1.81228193171 25.3479232307 # OT - 938 172 1 0.417 -4.70885741629 2.39816420833 25.3479232307 # HT - 939 172 1 0.417 -6.22275807082 2.39816420833 25.3479232307 # HT - 940 173 30 -0.834 -5.46580774355 -0.650923230659 27.811128393 # OT - 941 173 1 0.417 -4.70885741629 -0.0650409540408 27.811128393 # HT - 942 173 1 0.417 -6.22275807082 -0.0650409540408 27.811128393 # HT - 943 174 30 -0.834 -7.92901290592 1.81228193171 27.811128393 # OT - 944 174 1 0.417 -7.17206257866 2.39816420833 27.811128393 # HT - 945 174 1 0.417 -8.68596323319 2.39816420833 27.811128393 # HT - 946 175 30 -0.834 -7.92901290592 -0.650923230659 30.2743335554 # OT - 947 175 1 0.417 -7.17206257866 -0.0650409540408 30.2743335554 # HT - 948 175 1 0.417 -8.68596323319 -0.0650409540408 30.2743335554 # HT - 949 176 30 -0.834 -5.46580774355 1.81228193171 30.2743335554 # OT - 950 176 1 0.417 -4.70885741629 2.39816420833 30.2743335554 # HT - 951 176 1 0.417 -6.22275807082 2.39816420833 30.2743335554 # HT - 952 177 30 -0.834 -5.46580774355 -0.650923230659 32.7375387178 # OT - 953 177 1 0.417 -4.70885741629 -0.0650409540408 32.7375387178 # HT - 954 177 1 0.417 -6.22275807082 -0.0650409540408 32.7375387178 # HT - 955 178 30 -0.834 -7.92901290592 1.81228193171 32.7375387178 # OT - 956 178 1 0.417 -7.17206257866 2.39816420833 32.7375387178 # HT - 957 178 1 0.417 -8.68596323319 2.39816420833 32.7375387178 # HT - 958 179 38 1 -7.92901290592 4.27548709408 -4.21053871777 # SOD - 959 180 30 -0.834 -5.46580774355 6.73869225645 -4.21053871777 # OT - 960 180 1 0.417 -4.70885741629 7.32457453307 -4.21053871777 # HT - 961 180 1 0.417 -6.22275807082 7.32457453307 -4.21053871777 # HT - 962 181 30 -0.834 -5.46580774355 4.27548709408 -1.7473335554 # OT - 963 181 1 0.417 -4.70885741629 4.8613693707 -1.7473335554 # HT - 964 181 1 0.417 -6.22275807082 4.8613693707 -1.7473335554 # HT - 965 182 30 -0.834 -7.92901290592 6.73869225645 -1.7473335554 # OT - 966 182 1 0.417 -7.17206257866 7.32457453307 -1.7473335554 # HT - 967 182 1 0.417 -8.68596323319 7.32457453307 -1.7473335554 # HT - 968 183 30 -0.834 -7.92901290592 4.27548709408 0.715871606972 # OT - 969 183 1 0.417 -7.17206257866 4.8613693707 0.715871606972 # HT - 970 183 1 0.417 -8.68596323319 4.8613693707 0.715871606972 # HT - 971 184 30 -0.834 -5.46580774355 6.73869225645 0.715871606972 # OT - 972 184 1 0.417 -4.70885741629 7.32457453307 0.715871606972 # HT - 973 184 1 0.417 -6.22275807082 7.32457453307 0.715871606972 # HT - 974 185 30 -0.834 -5.46580774355 4.27548709408 3.17907676934 # OT - 975 185 1 0.417 -4.70885741629 4.8613693707 3.17907676934 # HT - 976 185 1 0.417 -6.22275807082 4.8613693707 3.17907676934 # HT - 977 186 30 -0.834 -7.92901290592 6.73869225645 3.17907676934 # OT - 978 186 1 0.417 -7.17206257866 7.32457453307 3.17907676934 # HT - 979 186 1 0.417 -8.68596323319 7.32457453307 3.17907676934 # HT - 980 187 30 -0.834 -7.92901290592 4.27548709408 5.64228193171 # OT - 981 187 1 0.417 -7.17206257866 4.8613693707 5.64228193171 # HT - 982 187 1 0.417 -8.68596323319 4.8613693707 5.64228193171 # HT - 983 188 30 -0.834 -7.92901290592 6.73869225645 17.9583077436 # OT - 984 188 1 0.417 -7.17206257866 7.32457453307 17.9583077436 # HT - 985 188 1 0.417 -8.68596323319 7.32457453307 17.9583077436 # HT - 986 189 30 -0.834 -7.92901290592 4.27548709408 20.4215129059 # OT - 987 189 1 0.417 -7.17206257866 4.8613693707 20.4215129059 # HT - 988 189 1 0.417 -8.68596323319 4.8613693707 20.4215129059 # HT - 989 190 30 -0.834 -7.92901290592 4.27548709408 25.3479232307 # OT - 990 190 1 0.417 -7.17206257866 4.8613693707 25.3479232307 # HT - 991 190 1 0.417 -8.68596323319 4.8613693707 25.3479232307 # HT + 903 160 30 -0.834 -7.92901290592 1.81228193171 3.17907676934 # OT + 904 160 1 0.417 -7.17206257866 2.39816420833 3.17907676934 # HT + 905 160 1 0.417 -8.68596323319 2.39816420833 3.17907676934 # HT + 906 161 30 -0.834 -7.92901290592 -0.650923230659 5.64228193171 # OT + 907 161 1 0.417 -7.17206257866 -0.0650409540408 5.64228193171 # HT + 908 161 1 0.417 -8.68596323319 -0.0650409540408 5.64228193171 # HT + 909 162 30 -0.834 -5.46580774355 1.81228193171 5.64228193171 # OT + 910 162 1 0.417 -4.70885741629 2.39816420833 5.64228193171 # HT + 911 162 1 0.417 -6.22275807082 2.39816420833 5.64228193171 # HT + 912 163 30 -0.834 -5.46580774355 -0.650923230659 8.10548709408 # OT + 913 163 1 0.417 -4.70885741629 -0.0650409540408 8.10548709408 # HT + 914 163 1 0.417 -6.22275807082 -0.0650409540408 8.10548709408 # HT + 915 164 30 -0.834 -7.92901290592 -0.650923230659 10.5686922564 # OT + 916 164 1 0.417 -7.17206257866 -0.0650409540408 10.5686922564 # HT + 917 164 1 0.417 -8.68596323319 -0.0650409540408 10.5686922564 # HT + 918 165 30 -0.834 -5.46580774355 1.81228193171 10.5686922564 # OT + 919 165 1 0.417 -4.70885741629 2.39816420833 10.5686922564 # HT + 920 165 1 0.417 -6.22275807082 2.39816420833 10.5686922564 # HT + 921 166 30 -0.834 -5.46580774355 -0.650923230659 17.9583077436 # OT + 922 166 1 0.417 -4.70885741629 -0.0650409540408 17.9583077436 # HT + 923 166 1 0.417 -6.22275807082 -0.0650409540408 17.9583077436 # HT + 924 167 30 -0.834 -7.92901290592 1.81228193171 17.9583077436 # OT + 925 167 1 0.417 -7.17206257866 2.39816420833 17.9583077436 # HT + 926 167 1 0.417 -8.68596323319 2.39816420833 17.9583077436 # HT + 927 168 30 -0.834 -7.92901290592 -0.650923230659 20.4215129059 # OT + 928 168 1 0.417 -7.17206257866 -0.0650409540408 20.4215129059 # HT + 929 168 1 0.417 -8.68596323319 -0.0650409540408 20.4215129059 # HT + 930 169 30 -0.834 -5.46580774355 -0.650923230659 22.8847180683 # OT + 931 169 1 0.417 -4.70885741629 -0.0650409540408 22.8847180683 # HT + 932 169 1 0.417 -6.22275807082 -0.0650409540408 22.8847180683 # HT + 933 170 30 -0.834 -7.92901290592 1.81228193171 22.8847180683 # OT + 934 170 1 0.417 -7.17206257866 2.39816420833 22.8847180683 # HT + 935 170 1 0.417 -8.68596323319 2.39816420833 22.8847180683 # HT + 936 171 30 -0.834 -7.92901290592 -0.650923230659 25.3479232307 # OT + 937 171 1 0.417 -7.17206257866 -0.0650409540408 25.3479232307 # HT + 938 171 1 0.417 -8.68596323319 -0.0650409540408 25.3479232307 # HT + 939 172 30 -0.834 -5.46580774355 1.81228193171 25.3479232307 # OT + 940 172 1 0.417 -4.70885741629 2.39816420833 25.3479232307 # HT + 941 172 1 0.417 -6.22275807082 2.39816420833 25.3479232307 # HT + 942 173 30 -0.834 -5.46580774355 -0.650923230659 27.811128393 # OT + 943 173 1 0.417 -4.70885741629 -0.0650409540408 27.811128393 # HT + 944 173 1 0.417 -6.22275807082 -0.0650409540408 27.811128393 # HT + 945 174 30 -0.834 -7.92901290592 1.81228193171 27.811128393 # OT + 946 174 1 0.417 -7.17206257866 2.39816420833 27.811128393 # HT + 947 174 1 0.417 -8.68596323319 2.39816420833 27.811128393 # HT + 948 175 30 -0.834 -7.92901290592 -0.650923230659 30.2743335554 # OT + 949 175 1 0.417 -7.17206257866 -0.0650409540408 30.2743335554 # HT + 950 175 1 0.417 -8.68596323319 -0.0650409540408 30.2743335554 # HT + 951 176 30 -0.834 -5.46580774355 1.81228193171 30.2743335554 # OT + 952 176 1 0.417 -4.70885741629 2.39816420833 30.2743335554 # HT + 953 176 1 0.417 -6.22275807082 2.39816420833 30.2743335554 # HT + 954 177 30 -0.834 -5.46580774355 -0.650923230659 32.7375387178 # OT + 955 177 1 0.417 -4.70885741629 -0.0650409540408 32.7375387178 # HT + 956 177 1 0.417 -6.22275807082 -0.0650409540408 32.7375387178 # HT + 957 178 30 -0.834 -7.92901290592 1.81228193171 32.7375387178 # OT + 958 178 1 0.417 -7.17206257866 2.39816420833 32.7375387178 # HT + 959 178 1 0.417 -8.68596323319 2.39816420833 32.7375387178 # HT + 960 179 30 -0.834 -7.92901290592 4.27548709408 -4.21053871777 # OT + 961 179 1 0.417 -7.17206257866 4.8613693707 -4.21053871777 # HT + 962 179 1 0.417 -8.68596323319 4.8613693707 -4.21053871777 # HT + 963 180 30 -0.834 -5.46580774355 6.73869225645 -4.21053871777 # OT + 964 180 1 0.417 -4.70885741629 7.32457453307 -4.21053871777 # HT + 965 180 1 0.417 -6.22275807082 7.32457453307 -4.21053871777 # HT + 966 181 30 -0.834 -5.46580774355 4.27548709408 -1.7473335554 # OT + 967 181 1 0.417 -4.70885741629 4.8613693707 -1.7473335554 # HT + 968 181 1 0.417 -6.22275807082 4.8613693707 -1.7473335554 # HT + 969 182 30 -0.834 -7.92901290592 6.73869225645 -1.7473335554 # OT + 970 182 1 0.417 -7.17206257866 7.32457453307 -1.7473335554 # HT + 971 182 1 0.417 -8.68596323319 7.32457453307 -1.7473335554 # HT + 972 183 30 -0.834 -7.92901290592 4.27548709408 0.715871606972 # OT + 973 183 1 0.417 -7.17206257866 4.8613693707 0.715871606972 # HT + 974 183 1 0.417 -8.68596323319 4.8613693707 0.715871606972 # HT + 975 184 30 -0.834 -5.46580774355 6.73869225645 0.715871606972 # OT + 976 184 1 0.417 -4.70885741629 7.32457453307 0.715871606972 # HT + 977 184 1 0.417 -6.22275807082 7.32457453307 0.715871606972 # HT + 978 185 30 -0.834 -5.46580774355 4.27548709408 3.17907676934 # OT + 979 185 1 0.417 -4.70885741629 4.8613693707 3.17907676934 # HT + 980 185 1 0.417 -6.22275807082 4.8613693707 3.17907676934 # HT + 981 186 30 -0.834 -7.92901290592 6.73869225645 3.17907676934 # OT + 982 186 1 0.417 -7.17206257866 7.32457453307 3.17907676934 # HT + 983 186 1 0.417 -8.68596323319 7.32457453307 3.17907676934 # HT + 984 187 38 1 -7.92901290592 4.27548709408 5.64228193171 # SOD + 985 188 30 -0.834 -7.92901290592 6.73869225645 17.9583077436 # OT + 986 188 1 0.417 -7.17206257866 7.32457453307 17.9583077436 # HT + 987 188 1 0.417 -8.68596323319 7.32457453307 17.9583077436 # HT + 988 189 30 -0.834 -7.92901290592 4.27548709408 20.4215129059 # OT + 989 189 1 0.417 -7.17206257866 4.8613693707 20.4215129059 # HT + 990 189 1 0.417 -8.68596323319 4.8613693707 20.4215129059 # HT + 991 190 38 1 -7.92901290592 4.27548709408 25.3479232307 # SOD 992 191 30 -0.834 -5.46580774355 4.27548709408 27.811128393 # OT 993 191 1 0.417 -4.70885741629 4.8613693707 27.811128393 # HT 994 191 1 0.417 -6.22275807082 4.8613693707 27.811128393 # HT @@ -1138,64 +1138,64 @@ Atoms # full 1034 205 30 -0.834 -7.92901290592 14.1283077436 30.2743335554 # OT 1035 205 1 0.417 -7.17206257866 14.7141900202 30.2743335554 # HT 1036 205 1 0.417 -8.68596323319 14.7141900202 30.2743335554 # HT - 1037 206 38 1 -5.46580774355 16.5915129059 30.2743335554 # SOD - 1038 207 30 -0.834 -7.92901290592 16.5915129059 32.7375387178 # OT - 1039 207 1 0.417 -7.17206257866 17.1773951825 32.7375387178 # HT - 1040 207 1 0.417 -8.68596323319 17.1773951825 32.7375387178 # HT - 1041 208 30 -0.834 -7.92901290592 19.0547180683 -4.21053871777 # OT - 1042 208 1 0.417 -7.17206257866 19.6406003449 -4.21053871777 # HT - 1043 208 1 0.417 -8.68596323319 19.6406003449 -4.21053871777 # HT - 1044 209 30 -0.834 -5.46580774355 21.5179232307 -4.21053871777 # OT - 1045 209 1 0.417 -4.70885741629 22.1038055073 -4.21053871777 # HT - 1046 209 1 0.417 -6.22275807082 22.1038055073 -4.21053871777 # HT - 1047 210 30 -0.834 -7.92901290592 21.5179232307 -1.7473335554 # OT - 1048 210 1 0.417 -7.17206257866 22.1038055073 -1.7473335554 # HT - 1049 210 1 0.417 -8.68596323319 22.1038055073 -1.7473335554 # HT - 1050 211 30 -0.834 -7.92901290592 21.5179232307 3.17907676934 # OT - 1051 211 1 0.417 -7.17206257866 22.1038055073 3.17907676934 # HT - 1052 211 1 0.417 -8.68596323319 22.1038055073 3.17907676934 # HT - 1053 212 30 -0.834 -7.92901290592 19.0547180683 5.64228193171 # OT - 1054 212 1 0.417 -7.17206257866 19.6406003449 5.64228193171 # HT - 1055 212 1 0.417 -8.68596323319 19.6406003449 5.64228193171 # HT - 1056 213 30 -0.834 -5.46580774355 21.5179232307 5.64228193171 # OT - 1057 213 1 0.417 -4.70885741629 22.1038055073 5.64228193171 # HT - 1058 213 1 0.417 -6.22275807082 22.1038055073 5.64228193171 # HT - 1059 214 30 -0.834 -7.92901290592 21.5179232307 8.10548709408 # OT - 1060 214 1 0.417 -7.17206257866 22.1038055073 8.10548709408 # HT - 1061 214 1 0.417 -8.68596323319 22.1038055073 8.10548709408 # HT - 1062 215 30 -0.834 -5.46580774355 21.5179232307 20.4215129059 # OT - 1063 215 1 0.417 -4.70885741629 22.1038055073 20.4215129059 # HT - 1064 215 1 0.417 -6.22275807082 22.1038055073 20.4215129059 # HT - 1065 216 30 -0.834 -7.92901290592 21.5179232307 22.8847180683 # OT - 1066 216 1 0.417 -7.17206257866 22.1038055073 22.8847180683 # HT - 1067 216 1 0.417 -8.68596323319 22.1038055073 22.8847180683 # HT - 1068 217 30 -0.834 -5.46580774355 21.5179232307 25.3479232307 # OT - 1069 217 1 0.417 -4.70885741629 22.1038055073 25.3479232307 # HT - 1070 217 1 0.417 -6.22275807082 22.1038055073 25.3479232307 # HT - 1071 218 30 -0.834 -5.46580774355 19.0547180683 27.811128393 # OT - 1072 218 1 0.417 -4.70885741629 19.6406003449 27.811128393 # HT - 1073 218 1 0.417 -6.22275807082 19.6406003449 27.811128393 # HT - 1074 219 30 -0.834 -7.92901290592 21.5179232307 27.811128393 # OT - 1075 219 1 0.417 -7.17206257866 22.1038055073 27.811128393 # HT - 1076 219 1 0.417 -8.68596323319 22.1038055073 27.811128393 # HT - 1077 220 30 -0.834 -7.92901290592 19.0547180683 30.2743335554 # OT - 1078 220 1 0.417 -7.17206257866 19.6406003449 30.2743335554 # HT - 1079 220 1 0.417 -8.68596323319 19.6406003449 30.2743335554 # HT - 1080 221 30 -0.834 -5.46580774355 21.5179232307 30.2743335554 # OT - 1081 221 1 0.417 -4.70885741629 22.1038055073 30.2743335554 # HT - 1082 221 1 0.417 -6.22275807082 22.1038055073 30.2743335554 # HT - 1083 222 30 -0.834 -5.46580774355 19.0547180683 32.7375387178 # OT - 1084 222 1 0.417 -4.70885741629 19.6406003449 32.7375387178 # HT - 1085 222 1 0.417 -6.22275807082 19.6406003449 32.7375387178 # HT - 1086 223 30 -0.834 -7.92901290592 21.5179232307 32.7375387178 # OT - 1087 223 1 0.417 -7.17206257866 22.1038055073 32.7375387178 # HT - 1088 223 1 0.417 -8.68596323319 22.1038055073 32.7375387178 # HT - 1089 224 30 -0.834 -3.00260258118 -0.650923230659 -4.21053871777 # OT - 1090 224 1 0.417 -2.24565225392 -0.0650409540408 -4.21053871777 # HT - 1091 224 1 0.417 -3.75955290845 -0.0650409540408 -4.21053871777 # HT - 1092 225 30 -0.834 -0.539397418816 1.81228193171 -4.21053871777 # OT - 1093 225 1 0.417 0.217552908448 2.39816420833 -4.21053871777 # HT - 1094 225 1 0.417 -1.29634774608 2.39816420833 -4.21053871777 # HT + 1037 206 30 -0.834 -5.46580774355 16.5915129059 30.2743335554 # OT + 1038 206 1 0.417 -4.70885741629 17.1773951825 30.2743335554 # HT + 1039 206 1 0.417 -6.22275807082 17.1773951825 30.2743335554 # HT + 1040 207 30 -0.834 -7.92901290592 16.5915129059 32.7375387178 # OT + 1041 207 1 0.417 -7.17206257866 17.1773951825 32.7375387178 # HT + 1042 207 1 0.417 -8.68596323319 17.1773951825 32.7375387178 # HT + 1043 208 30 -0.834 -7.92901290592 19.0547180683 -4.21053871777 # OT + 1044 208 1 0.417 -7.17206257866 19.6406003449 -4.21053871777 # HT + 1045 208 1 0.417 -8.68596323319 19.6406003449 -4.21053871777 # HT + 1046 209 30 -0.834 -5.46580774355 21.5179232307 -4.21053871777 # OT + 1047 209 1 0.417 -4.70885741629 22.1038055073 -4.21053871777 # HT + 1048 209 1 0.417 -6.22275807082 22.1038055073 -4.21053871777 # HT + 1049 210 30 -0.834 -7.92901290592 21.5179232307 -1.7473335554 # OT + 1050 210 1 0.417 -7.17206257866 22.1038055073 -1.7473335554 # HT + 1051 210 1 0.417 -8.68596323319 22.1038055073 -1.7473335554 # HT + 1052 211 30 -0.834 -7.92901290592 21.5179232307 3.17907676934 # OT + 1053 211 1 0.417 -7.17206257866 22.1038055073 3.17907676934 # HT + 1054 211 1 0.417 -8.68596323319 22.1038055073 3.17907676934 # HT + 1055 212 30 -0.834 -7.92901290592 19.0547180683 5.64228193171 # OT + 1056 212 1 0.417 -7.17206257866 19.6406003449 5.64228193171 # HT + 1057 212 1 0.417 -8.68596323319 19.6406003449 5.64228193171 # HT + 1058 213 30 -0.834 -5.46580774355 21.5179232307 5.64228193171 # OT + 1059 213 1 0.417 -4.70885741629 22.1038055073 5.64228193171 # HT + 1060 213 1 0.417 -6.22275807082 22.1038055073 5.64228193171 # HT + 1061 214 30 -0.834 -7.92901290592 21.5179232307 8.10548709408 # OT + 1062 214 1 0.417 -7.17206257866 22.1038055073 8.10548709408 # HT + 1063 214 1 0.417 -8.68596323319 22.1038055073 8.10548709408 # HT + 1064 215 30 -0.834 -5.46580774355 21.5179232307 20.4215129059 # OT + 1065 215 1 0.417 -4.70885741629 22.1038055073 20.4215129059 # HT + 1066 215 1 0.417 -6.22275807082 22.1038055073 20.4215129059 # HT + 1067 216 30 -0.834 -7.92901290592 21.5179232307 22.8847180683 # OT + 1068 216 1 0.417 -7.17206257866 22.1038055073 22.8847180683 # HT + 1069 216 1 0.417 -8.68596323319 22.1038055073 22.8847180683 # HT + 1070 217 30 -0.834 -5.46580774355 21.5179232307 25.3479232307 # OT + 1071 217 1 0.417 -4.70885741629 22.1038055073 25.3479232307 # HT + 1072 217 1 0.417 -6.22275807082 22.1038055073 25.3479232307 # HT + 1073 218 30 -0.834 -5.46580774355 19.0547180683 27.811128393 # OT + 1074 218 1 0.417 -4.70885741629 19.6406003449 27.811128393 # HT + 1075 218 1 0.417 -6.22275807082 19.6406003449 27.811128393 # HT + 1076 219 30 -0.834 -7.92901290592 21.5179232307 27.811128393 # OT + 1077 219 1 0.417 -7.17206257866 22.1038055073 27.811128393 # HT + 1078 219 1 0.417 -8.68596323319 22.1038055073 27.811128393 # HT + 1079 220 30 -0.834 -7.92901290592 19.0547180683 30.2743335554 # OT + 1080 220 1 0.417 -7.17206257866 19.6406003449 30.2743335554 # HT + 1081 220 1 0.417 -8.68596323319 19.6406003449 30.2743335554 # HT + 1082 221 30 -0.834 -5.46580774355 21.5179232307 30.2743335554 # OT + 1083 221 1 0.417 -4.70885741629 22.1038055073 30.2743335554 # HT + 1084 221 1 0.417 -6.22275807082 22.1038055073 30.2743335554 # HT + 1085 222 30 -0.834 -5.46580774355 19.0547180683 32.7375387178 # OT + 1086 222 1 0.417 -4.70885741629 19.6406003449 32.7375387178 # HT + 1087 222 1 0.417 -6.22275807082 19.6406003449 32.7375387178 # HT + 1088 223 30 -0.834 -7.92901290592 21.5179232307 32.7375387178 # OT + 1089 223 1 0.417 -7.17206257866 22.1038055073 32.7375387178 # HT + 1090 223 1 0.417 -8.68596323319 22.1038055073 32.7375387178 # HT + 1091 224 30 -0.834 -3.00260258118 -0.650923230659 -4.21053871777 # OT + 1092 224 1 0.417 -2.24565225392 -0.0650409540408 -4.21053871777 # HT + 1093 224 1 0.417 -3.75955290845 -0.0650409540408 -4.21053871777 # HT + 1094 225 38 1 -0.539397418816 1.81228193171 -4.21053871777 # SOD 1095 226 30 -0.834 -0.539397418816 -0.650923230659 -1.7473335554 # OT 1096 226 1 0.417 0.217552908448 -0.0650409540408 -1.7473335554 # HT 1097 226 1 0.417 -1.29634774608 -0.0650409540408 -1.7473335554 # HT @@ -1226,468 +1226,468 @@ Atoms # full 1122 235 30 -0.834 -3.00260258118 1.81228193171 8.10548709408 # OT 1123 235 1 0.417 -2.24565225392 2.39816420833 8.10548709408 # HT 1124 235 1 0.417 -3.75955290845 2.39816420833 8.10548709408 # HT - 1125 236 30 -0.834 -3.00260258118 -0.650923230659 10.5686922564 # OT - 1126 236 1 0.417 -2.24565225392 -0.0650409540408 10.5686922564 # HT - 1127 236 1 0.417 -3.75955290845 -0.0650409540408 10.5686922564 # HT - 1128 237 30 -0.834 -0.539397418816 1.81228193171 10.5686922564 # OT - 1129 237 1 0.417 0.217552908448 2.39816420833 10.5686922564 # HT - 1130 237 1 0.417 -1.29634774608 2.39816420833 10.5686922564 # HT - 1131 238 30 -0.834 -0.539397418816 -0.650923230659 13.0318974188 # OT - 1132 238 1 0.417 0.217552908448 -0.0650409540408 13.0318974188 # HT - 1133 238 1 0.417 -1.29634774608 -0.0650409540408 13.0318974188 # HT - 1134 239 30 -0.834 -0.539397418816 -0.650923230659 17.9583077436 # OT - 1135 239 1 0.417 0.217552908448 -0.0650409540408 17.9583077436 # HT - 1136 239 1 0.417 -1.29634774608 -0.0650409540408 17.9583077436 # HT - 1137 240 30 -0.834 -3.00260258118 -0.650923230659 20.4215129059 # OT - 1138 240 1 0.417 -2.24565225392 -0.0650409540408 20.4215129059 # HT - 1139 240 1 0.417 -3.75955290845 -0.0650409540408 20.4215129059 # HT - 1140 241 30 -0.834 -0.539397418816 -0.650923230659 22.8847180683 # OT - 1141 241 1 0.417 0.217552908448 -0.0650409540408 22.8847180683 # HT - 1142 241 1 0.417 -1.29634774608 -0.0650409540408 22.8847180683 # HT - 1143 242 30 -0.834 -3.00260258118 1.81228193171 22.8847180683 # OT - 1144 242 1 0.417 -2.24565225392 2.39816420833 22.8847180683 # HT - 1145 242 1 0.417 -3.75955290845 2.39816420833 22.8847180683 # HT - 1146 243 30 -0.834 -3.00260258118 -0.650923230659 25.3479232307 # OT - 1147 243 1 0.417 -2.24565225392 -0.0650409540408 25.3479232307 # HT - 1148 243 1 0.417 -3.75955290845 -0.0650409540408 25.3479232307 # HT - 1149 244 30 -0.834 -0.539397418816 1.81228193171 25.3479232307 # OT - 1150 244 1 0.417 0.217552908448 2.39816420833 25.3479232307 # HT - 1151 244 1 0.417 -1.29634774608 2.39816420833 25.3479232307 # HT - 1152 245 30 -0.834 -0.539397418816 -0.650923230659 27.811128393 # OT - 1153 245 1 0.417 0.217552908448 -0.0650409540408 27.811128393 # HT - 1154 245 1 0.417 -1.29634774608 -0.0650409540408 27.811128393 # HT - 1155 246 30 -0.834 -3.00260258118 1.81228193171 27.811128393 # OT - 1156 246 1 0.417 -2.24565225392 2.39816420833 27.811128393 # HT - 1157 246 1 0.417 -3.75955290845 2.39816420833 27.811128393 # HT - 1158 247 30 -0.834 -3.00260258118 -0.650923230659 30.2743335554 # OT - 1159 247 1 0.417 -2.24565225392 -0.0650409540408 30.2743335554 # HT - 1160 247 1 0.417 -3.75955290845 -0.0650409540408 30.2743335554 # HT - 1161 248 30 -0.834 -0.539397418816 1.81228193171 30.2743335554 # OT - 1162 248 1 0.417 0.217552908448 2.39816420833 30.2743335554 # HT - 1163 248 1 0.417 -1.29634774608 2.39816420833 30.2743335554 # HT - 1164 249 30 -0.834 -0.539397418816 -0.650923230659 32.7375387178 # OT - 1165 249 1 0.417 0.217552908448 -0.0650409540408 32.7375387178 # HT - 1166 249 1 0.417 -1.29634774608 -0.0650409540408 32.7375387178 # HT - 1167 250 30 -0.834 -3.00260258118 1.81228193171 32.7375387178 # OT - 1168 250 1 0.417 -2.24565225392 2.39816420833 32.7375387178 # HT - 1169 250 1 0.417 -3.75955290845 2.39816420833 32.7375387178 # HT - 1170 251 30 -0.834 -3.00260258118 4.27548709408 -4.21053871777 # OT - 1171 251 1 0.417 -2.24565225392 4.8613693707 -4.21053871777 # HT - 1172 251 1 0.417 -3.75955290845 4.8613693707 -4.21053871777 # HT - 1173 252 30 -0.834 -0.539397418816 6.73869225645 -4.21053871777 # OT - 1174 252 1 0.417 0.217552908448 7.32457453307 -4.21053871777 # HT - 1175 252 1 0.417 -1.29634774608 7.32457453307 -4.21053871777 # HT - 1176 253 30 -0.834 -3.00260258118 4.27548709408 0.715871606972 # OT - 1177 253 1 0.417 -2.24565225392 4.8613693707 0.715871606972 # HT - 1178 253 1 0.417 -3.75955290845 4.8613693707 0.715871606972 # HT - 1179 254 30 -0.834 -3.00260258118 4.27548709408 5.64228193171 # OT - 1180 254 1 0.417 -2.24565225392 4.8613693707 5.64228193171 # HT - 1181 254 1 0.417 -3.75955290845 4.8613693707 5.64228193171 # HT - 1182 255 30 -0.834 -0.539397418816 4.27548709408 8.10548709408 # OT - 1183 255 1 0.417 0.217552908448 4.8613693707 8.10548709408 # HT - 1184 255 1 0.417 -1.29634774608 4.8613693707 8.10548709408 # HT - 1185 256 30 -0.834 -3.00260258118 4.27548709408 10.5686922564 # OT - 1186 256 1 0.417 -2.24565225392 4.8613693707 10.5686922564 # HT - 1187 256 1 0.417 -3.75955290845 4.8613693707 10.5686922564 # HT - 1188 257 30 -0.834 -0.539397418816 4.27548709408 13.0318974188 # OT - 1189 257 1 0.417 0.217552908448 4.8613693707 13.0318974188 # HT - 1190 257 1 0.417 -1.29634774608 4.8613693707 13.0318974188 # HT - 1191 258 30 -0.834 -0.539397418816 4.27548709408 27.811128393 # OT - 1192 258 1 0.417 0.217552908448 4.8613693707 27.811128393 # HT - 1193 258 1 0.417 -1.29634774608 4.8613693707 27.811128393 # HT - 1194 259 30 -0.834 -3.00260258118 4.27548709408 30.2743335554 # OT - 1195 259 1 0.417 -2.24565225392 4.8613693707 30.2743335554 # HT - 1196 259 1 0.417 -3.75955290845 4.8613693707 30.2743335554 # HT - 1197 260 30 -0.834 -0.539397418816 6.73869225645 30.2743335554 # OT - 1198 260 1 0.417 0.217552908448 7.32457453307 30.2743335554 # HT - 1199 260 1 0.417 -1.29634774608 7.32457453307 30.2743335554 # HT - 1200 261 30 -0.834 -0.539397418816 4.27548709408 32.7375387178 # OT - 1201 261 1 0.417 0.217552908448 4.8613693707 32.7375387178 # HT - 1202 261 1 0.417 -1.29634774608 4.8613693707 32.7375387178 # HT - 1203 262 30 -0.834 -3.00260258118 6.73869225645 32.7375387178 # OT - 1204 262 1 0.417 -2.24565225392 7.32457453307 32.7375387178 # HT - 1205 262 1 0.417 -3.75955290845 7.32457453307 32.7375387178 # HT - 1206 263 30 -0.834 -0.539397418816 9.20189741882 32.7375387178 # OT - 1207 263 1 0.417 0.217552908448 9.78777969543 32.7375387178 # HT - 1208 263 1 0.417 -1.29634774608 9.78777969543 32.7375387178 # HT - 1209 264 30 -0.834 -0.539397418816 21.5179232307 -4.21053871777 # OT - 1210 264 1 0.417 0.217552908448 22.1038055073 -4.21053871777 # HT - 1211 264 1 0.417 -1.29634774608 22.1038055073 -4.21053871777 # HT - 1212 265 30 -0.834 -3.00260258118 21.5179232307 -1.7473335554 # OT - 1213 265 1 0.417 -2.24565225392 22.1038055073 -1.7473335554 # HT - 1214 265 1 0.417 -3.75955290845 22.1038055073 -1.7473335554 # HT - 1215 266 30 -0.834 -0.539397418816 21.5179232307 0.715871606972 # OT - 1216 266 1 0.417 0.217552908448 22.1038055073 0.715871606972 # HT - 1217 266 1 0.417 -1.29634774608 22.1038055073 0.715871606972 # HT - 1218 267 30 -0.834 -0.539397418816 19.0547180683 3.17907676934 # OT - 1219 267 1 0.417 0.217552908448 19.6406003449 3.17907676934 # HT - 1220 267 1 0.417 -1.29634774608 19.6406003449 3.17907676934 # HT - 1221 268 30 -0.834 -3.00260258118 21.5179232307 3.17907676934 # OT - 1222 268 1 0.417 -2.24565225392 22.1038055073 3.17907676934 # HT - 1223 268 1 0.417 -3.75955290845 22.1038055073 3.17907676934 # HT - 1224 269 30 -0.834 -3.00260258118 19.0547180683 5.64228193171 # OT - 1225 269 1 0.417 -2.24565225392 19.6406003449 5.64228193171 # HT - 1226 269 1 0.417 -3.75955290845 19.6406003449 5.64228193171 # HT - 1227 270 30 -0.834 -0.539397418816 21.5179232307 5.64228193171 # OT - 1228 270 1 0.417 0.217552908448 22.1038055073 5.64228193171 # HT - 1229 270 1 0.417 -1.29634774608 22.1038055073 5.64228193171 # HT - 1230 271 30 -0.834 -0.539397418816 21.5179232307 15.4951025812 # OT - 1231 271 1 0.417 0.217552908448 22.1038055073 15.4951025812 # HT - 1232 271 1 0.417 -1.29634774608 22.1038055073 15.4951025812 # HT - 1233 272 30 -0.834 -3.00260258118 21.5179232307 17.9583077436 # OT - 1234 272 1 0.417 -2.24565225392 22.1038055073 17.9583077436 # HT - 1235 272 1 0.417 -3.75955290845 22.1038055073 17.9583077436 # HT - 1236 273 30 -0.834 -0.539397418816 21.5179232307 20.4215129059 # OT - 1237 273 1 0.417 0.217552908448 22.1038055073 20.4215129059 # HT - 1238 273 1 0.417 -1.29634774608 22.1038055073 20.4215129059 # HT - 1239 274 30 -0.834 -0.539397418816 19.0547180683 22.8847180683 # OT - 1240 274 1 0.417 0.217552908448 19.6406003449 22.8847180683 # HT - 1241 274 1 0.417 -1.29634774608 19.6406003449 22.8847180683 # HT - 1242 275 30 -0.834 -3.00260258118 21.5179232307 22.8847180683 # OT - 1243 275 1 0.417 -2.24565225392 22.1038055073 22.8847180683 # HT - 1244 275 1 0.417 -3.75955290845 22.1038055073 22.8847180683 # HT - 1245 276 30 -0.834 -0.539397418816 21.5179232307 25.3479232307 # OT - 1246 276 1 0.417 0.217552908448 22.1038055073 25.3479232307 # HT - 1247 276 1 0.417 -1.29634774608 22.1038055073 25.3479232307 # HT - 1248 277 30 -0.834 -0.539397418816 19.0547180683 27.811128393 # OT - 1249 277 1 0.417 0.217552908448 19.6406003449 27.811128393 # HT - 1250 277 1 0.417 -1.29634774608 19.6406003449 27.811128393 # HT - 1251 278 30 -0.834 -3.00260258118 21.5179232307 27.811128393 # OT - 1252 278 1 0.417 -2.24565225392 22.1038055073 27.811128393 # HT - 1253 278 1 0.417 -3.75955290845 22.1038055073 27.811128393 # HT - 1254 279 30 -0.834 -3.00260258118 19.0547180683 30.2743335554 # OT - 1255 279 1 0.417 -2.24565225392 19.6406003449 30.2743335554 # HT - 1256 279 1 0.417 -3.75955290845 19.6406003449 30.2743335554 # HT - 1257 280 30 -0.834 -0.539397418816 21.5179232307 30.2743335554 # OT - 1258 280 1 0.417 0.217552908448 22.1038055073 30.2743335554 # HT - 1259 280 1 0.417 -1.29634774608 22.1038055073 30.2743335554 # HT - 1260 281 38 1 -0.539397418816 19.0547180683 32.7375387178 # SOD - 1261 282 30 -0.834 -3.00260258118 21.5179232307 32.7375387178 # OT - 1262 282 1 0.417 -2.24565225392 22.1038055073 32.7375387178 # HT - 1263 282 1 0.417 -3.75955290845 22.1038055073 32.7375387178 # HT - 1264 283 30 -0.834 1.92380774355 -0.650923230659 -4.21053871777 # OT - 1265 283 1 0.417 2.68075807082 -0.0650409540408 -4.21053871777 # HT - 1266 283 1 0.417 1.16685741629 -0.0650409540408 -4.21053871777 # HT - 1267 284 30 -0.834 1.92380774355 1.81228193171 3.17907676934 # OT - 1268 284 1 0.417 2.68075807082 2.39816420833 3.17907676934 # HT - 1269 284 1 0.417 1.16685741629 2.39816420833 3.17907676934 # HT - 1270 285 30 -0.834 1.92380774355 -0.650923230659 5.64228193171 # OT - 1271 285 1 0.417 2.68075807082 -0.0650409540408 5.64228193171 # HT - 1272 285 1 0.417 1.16685741629 -0.0650409540408 5.64228193171 # HT - 1273 286 30 -0.834 4.38701290592 1.81228193171 5.64228193171 # OT - 1274 286 1 0.417 5.14396323319 2.39816420833 5.64228193171 # HT - 1275 286 1 0.417 3.63006257866 2.39816420833 5.64228193171 # HT - 1276 287 30 -0.834 4.38701290592 -0.650923230659 8.10548709408 # OT - 1277 287 1 0.417 5.14396323319 -0.0650409540408 8.10548709408 # HT - 1278 287 1 0.417 3.63006257866 -0.0650409540408 8.10548709408 # HT - 1279 288 30 -0.834 1.92380774355 1.81228193171 8.10548709408 # OT - 1280 288 1 0.417 2.68075807082 2.39816420833 8.10548709408 # HT - 1281 288 1 0.417 1.16685741629 2.39816420833 8.10548709408 # HT - 1282 289 30 -0.834 1.92380774355 -0.650923230659 10.5686922564 # OT - 1283 289 1 0.417 2.68075807082 -0.0650409540408 10.5686922564 # HT - 1284 289 1 0.417 1.16685741629 -0.0650409540408 10.5686922564 # HT - 1285 290 30 -0.834 4.38701290592 1.81228193171 10.5686922564 # OT - 1286 290 1 0.417 5.14396323319 2.39816420833 10.5686922564 # HT - 1287 290 1 0.417 3.63006257866 2.39816420833 10.5686922564 # HT - 1288 291 30 -0.834 4.38701290592 -0.650923230659 13.0318974188 # OT - 1289 291 1 0.417 5.14396323319 -0.0650409540408 13.0318974188 # HT - 1290 291 1 0.417 3.63006257866 -0.0650409540408 13.0318974188 # HT - 1291 292 30 -0.834 1.92380774355 1.81228193171 13.0318974188 # OT - 1292 292 1 0.417 2.68075807082 2.39816420833 13.0318974188 # HT - 1293 292 1 0.417 1.16685741629 2.39816420833 13.0318974188 # HT - 1294 293 30 -0.834 1.92380774355 -0.650923230659 15.4951025812 # OT - 1295 293 1 0.417 2.68075807082 -0.0650409540408 15.4951025812 # HT - 1296 293 1 0.417 1.16685741629 -0.0650409540408 15.4951025812 # HT - 1297 294 30 -0.834 4.38701290592 1.81228193171 15.4951025812 # OT - 1298 294 1 0.417 5.14396323319 2.39816420833 15.4951025812 # HT - 1299 294 1 0.417 3.63006257866 2.39816420833 15.4951025812 # HT - 1300 295 30 -0.834 4.38701290592 -0.650923230659 17.9583077436 # OT - 1301 295 1 0.417 5.14396323319 -0.0650409540408 17.9583077436 # HT - 1302 295 1 0.417 3.63006257866 -0.0650409540408 17.9583077436 # HT - 1303 296 30 -0.834 1.92380774355 -0.650923230659 20.4215129059 # OT - 1304 296 1 0.417 2.68075807082 -0.0650409540408 20.4215129059 # HT - 1305 296 1 0.417 1.16685741629 -0.0650409540408 20.4215129059 # HT - 1306 297 30 -0.834 4.38701290592 1.81228193171 20.4215129059 # OT - 1307 297 1 0.417 5.14396323319 2.39816420833 20.4215129059 # HT - 1308 297 1 0.417 3.63006257866 2.39816420833 20.4215129059 # HT - 1309 298 30 -0.834 4.38701290592 -0.650923230659 22.8847180683 # OT - 1310 298 1 0.417 5.14396323319 -0.0650409540408 22.8847180683 # HT - 1311 298 1 0.417 3.63006257866 -0.0650409540408 22.8847180683 # HT - 1312 299 38 1 1.92380774355 1.81228193171 22.8847180683 # SOD - 1313 300 30 -0.834 1.92380774355 -0.650923230659 25.3479232307 # OT - 1314 300 1 0.417 2.68075807082 -0.0650409540408 25.3479232307 # HT - 1315 300 1 0.417 1.16685741629 -0.0650409540408 25.3479232307 # HT - 1316 301 30 -0.834 4.38701290592 1.81228193171 25.3479232307 # OT - 1317 301 1 0.417 5.14396323319 2.39816420833 25.3479232307 # HT - 1318 301 1 0.417 3.63006257866 2.39816420833 25.3479232307 # HT - 1319 302 30 -0.834 4.38701290592 -0.650923230659 27.811128393 # OT - 1320 302 1 0.417 5.14396323319 -0.0650409540408 27.811128393 # HT - 1321 302 1 0.417 3.63006257866 -0.0650409540408 27.811128393 # HT - 1322 303 30 -0.834 1.92380774355 1.81228193171 27.811128393 # OT - 1323 303 1 0.417 2.68075807082 2.39816420833 27.811128393 # HT - 1324 303 1 0.417 1.16685741629 2.39816420833 27.811128393 # HT - 1325 304 30 -0.834 1.92380774355 -0.650923230659 30.2743335554 # OT - 1326 304 1 0.417 2.68075807082 -0.0650409540408 30.2743335554 # HT - 1327 304 1 0.417 1.16685741629 -0.0650409540408 30.2743335554 # HT - 1328 305 30 -0.834 4.38701290592 1.81228193171 30.2743335554 # OT - 1329 305 1 0.417 5.14396323319 2.39816420833 30.2743335554 # HT - 1330 305 1 0.417 3.63006257866 2.39816420833 30.2743335554 # HT - 1331 306 30 -0.834 4.38701290592 -0.650923230659 32.7375387178 # OT - 1332 306 1 0.417 5.14396323319 -0.0650409540408 32.7375387178 # HT - 1333 306 1 0.417 3.63006257866 -0.0650409540408 32.7375387178 # HT - 1334 307 30 -0.834 1.92380774355 1.81228193171 32.7375387178 # OT - 1335 307 1 0.417 2.68075807082 2.39816420833 32.7375387178 # HT - 1336 307 1 0.417 1.16685741629 2.39816420833 32.7375387178 # HT - 1337 308 30 -0.834 1.92380774355 4.27548709408 -4.21053871777 # OT - 1338 308 1 0.417 2.68075807082 4.8613693707 -4.21053871777 # HT - 1339 308 1 0.417 1.16685741629 4.8613693707 -4.21053871777 # HT - 1340 309 30 -0.834 4.38701290592 6.73869225645 -4.21053871777 # OT - 1341 309 1 0.417 5.14396323319 7.32457453307 -4.21053871777 # HT - 1342 309 1 0.417 3.63006257866 7.32457453307 -4.21053871777 # HT - 1343 310 30 -0.834 4.38701290592 4.27548709408 8.10548709408 # OT - 1344 310 1 0.417 5.14396323319 4.8613693707 8.10548709408 # HT - 1345 310 1 0.417 3.63006257866 4.8613693707 8.10548709408 # HT - 1346 311 30 -0.834 1.92380774355 6.73869225645 8.10548709408 # OT - 1347 311 1 0.417 2.68075807082 7.32457453307 8.10548709408 # HT - 1348 311 1 0.417 1.16685741629 7.32457453307 8.10548709408 # HT - 1349 312 30 -0.834 1.92380774355 4.27548709408 10.5686922564 # OT - 1350 312 1 0.417 2.68075807082 4.8613693707 10.5686922564 # HT - 1351 312 1 0.417 1.16685741629 4.8613693707 10.5686922564 # HT - 1352 313 30 -0.834 4.38701290592 6.73869225645 10.5686922564 # OT - 1353 313 1 0.417 5.14396323319 7.32457453307 10.5686922564 # HT - 1354 313 1 0.417 3.63006257866 7.32457453307 10.5686922564 # HT - 1355 314 30 -0.834 4.38701290592 4.27548709408 13.0318974188 # OT - 1356 314 1 0.417 5.14396323319 4.8613693707 13.0318974188 # HT - 1357 314 1 0.417 3.63006257866 4.8613693707 13.0318974188 # HT - 1358 315 30 -0.834 1.92380774355 6.73869225645 13.0318974188 # OT - 1359 315 1 0.417 2.68075807082 7.32457453307 13.0318974188 # HT - 1360 315 1 0.417 1.16685741629 7.32457453307 13.0318974188 # HT - 1361 316 30 -0.834 1.92380774355 4.27548709408 15.4951025812 # OT - 1362 316 1 0.417 2.68075807082 4.8613693707 15.4951025812 # HT - 1363 316 1 0.417 1.16685741629 4.8613693707 15.4951025812 # HT - 1364 317 30 -0.834 4.38701290592 6.73869225645 15.4951025812 # OT - 1365 317 1 0.417 5.14396323319 7.32457453307 15.4951025812 # HT - 1366 317 1 0.417 3.63006257866 7.32457453307 15.4951025812 # HT - 1367 318 30 -0.834 4.38701290592 4.27548709408 17.9583077436 # OT - 1368 318 1 0.417 5.14396323319 4.8613693707 17.9583077436 # HT - 1369 318 1 0.417 3.63006257866 4.8613693707 17.9583077436 # HT - 1370 319 30 -0.834 4.38701290592 6.73869225645 20.4215129059 # OT - 1371 319 1 0.417 5.14396323319 7.32457453307 20.4215129059 # HT - 1372 319 1 0.417 3.63006257866 7.32457453307 20.4215129059 # HT - 1373 320 30 -0.834 4.38701290592 4.27548709408 22.8847180683 # OT - 1374 320 1 0.417 5.14396323319 4.8613693707 22.8847180683 # HT - 1375 320 1 0.417 3.63006257866 4.8613693707 22.8847180683 # HT - 1376 321 30 -0.834 1.92380774355 4.27548709408 25.3479232307 # OT - 1377 321 1 0.417 2.68075807082 4.8613693707 25.3479232307 # HT - 1378 321 1 0.417 1.16685741629 4.8613693707 25.3479232307 # HT - 1379 322 30 -0.834 4.38701290592 6.73869225645 25.3479232307 # OT - 1380 322 1 0.417 5.14396323319 7.32457453307 25.3479232307 # HT - 1381 322 1 0.417 3.63006257866 7.32457453307 25.3479232307 # HT - 1382 323 30 -0.834 4.38701290592 4.27548709408 27.811128393 # OT - 1383 323 1 0.417 5.14396323319 4.8613693707 27.811128393 # HT - 1384 323 1 0.417 3.63006257866 4.8613693707 27.811128393 # HT - 1385 324 30 -0.834 1.92380774355 6.73869225645 27.811128393 # OT - 1386 324 1 0.417 2.68075807082 7.32457453307 27.811128393 # HT - 1387 324 1 0.417 1.16685741629 7.32457453307 27.811128393 # HT - 1388 325 30 -0.834 1.92380774355 4.27548709408 30.2743335554 # OT - 1389 325 1 0.417 2.68075807082 4.8613693707 30.2743335554 # HT - 1390 325 1 0.417 1.16685741629 4.8613693707 30.2743335554 # HT - 1391 326 30 -0.834 4.38701290592 6.73869225645 30.2743335554 # OT - 1392 326 1 0.417 5.14396323319 7.32457453307 30.2743335554 # HT - 1393 326 1 0.417 3.63006257866 7.32457453307 30.2743335554 # HT - 1394 327 30 -0.834 4.38701290592 4.27548709408 32.7375387178 # OT - 1395 327 1 0.417 5.14396323319 4.8613693707 32.7375387178 # HT - 1396 327 1 0.417 3.63006257866 4.8613693707 32.7375387178 # HT - 1397 328 30 -0.834 1.92380774355 6.73869225645 32.7375387178 # OT - 1398 328 1 0.417 2.68075807082 7.32457453307 32.7375387178 # HT - 1399 328 1 0.417 1.16685741629 7.32457453307 32.7375387178 # HT - 1400 329 30 -0.834 1.92380774355 9.20189741882 -4.21053871777 # OT - 1401 329 1 0.417 2.68075807082 9.78777969543 -4.21053871777 # HT - 1402 329 1 0.417 1.16685741629 9.78777969543 -4.21053871777 # HT - 1403 330 30 -0.834 4.38701290592 11.6651025812 -4.21053871777 # OT - 1404 330 1 0.417 5.14396323319 12.2509848578 -4.21053871777 # HT - 1405 330 1 0.417 3.63006257866 12.2509848578 -4.21053871777 # HT - 1406 331 30 -0.834 4.38701290592 9.20189741882 13.0318974188 # OT - 1407 331 1 0.417 5.14396323319 9.78777969543 13.0318974188 # HT - 1408 331 1 0.417 3.63006257866 9.78777969543 13.0318974188 # HT - 1409 332 30 -0.834 4.38701290592 11.6651025812 15.4951025812 # OT - 1410 332 1 0.417 5.14396323319 12.2509848578 15.4951025812 # HT - 1411 332 1 0.417 3.63006257866 12.2509848578 15.4951025812 # HT - 1412 333 30 -0.834 4.38701290592 9.20189741882 17.9583077436 # OT - 1413 333 1 0.417 5.14396323319 9.78777969543 17.9583077436 # HT - 1414 333 1 0.417 3.63006257866 9.78777969543 17.9583077436 # HT - 1415 334 30 -0.834 1.92380774355 11.6651025812 17.9583077436 # OT - 1416 334 1 0.417 2.68075807082 12.2509848578 17.9583077436 # HT - 1417 334 1 0.417 1.16685741629 12.2509848578 17.9583077436 # HT - 1418 335 30 -0.834 4.38701290592 11.6651025812 20.4215129059 # OT - 1419 335 1 0.417 5.14396323319 12.2509848578 20.4215129059 # HT - 1420 335 1 0.417 3.63006257866 12.2509848578 20.4215129059 # HT - 1421 336 30 -0.834 4.38701290592 9.20189741882 22.8847180683 # OT - 1422 336 1 0.417 5.14396323319 9.78777969543 22.8847180683 # HT - 1423 336 1 0.417 3.63006257866 9.78777969543 22.8847180683 # HT - 1424 337 30 -0.834 1.92380774355 11.6651025812 22.8847180683 # OT - 1425 337 1 0.417 2.68075807082 12.2509848578 22.8847180683 # HT - 1426 337 1 0.417 1.16685741629 12.2509848578 22.8847180683 # HT - 1427 338 30 -0.834 4.38701290592 11.6651025812 25.3479232307 # OT - 1428 338 1 0.417 5.14396323319 12.2509848578 25.3479232307 # HT - 1429 338 1 0.417 3.63006257866 12.2509848578 25.3479232307 # HT - 1430 339 30 -0.834 4.38701290592 9.20189741882 27.811128393 # OT - 1431 339 1 0.417 5.14396323319 9.78777969543 27.811128393 # HT - 1432 339 1 0.417 3.63006257866 9.78777969543 27.811128393 # HT - 1433 340 30 -0.834 1.92380774355 9.20189741882 30.2743335554 # OT - 1434 340 1 0.417 2.68075807082 9.78777969543 30.2743335554 # HT - 1435 340 1 0.417 1.16685741629 9.78777969543 30.2743335554 # HT - 1436 341 30 -0.834 4.38701290592 11.6651025812 30.2743335554 # OT - 1437 341 1 0.417 5.14396323319 12.2509848578 30.2743335554 # HT - 1438 341 1 0.417 3.63006257866 12.2509848578 30.2743335554 # HT - 1439 342 30 -0.834 4.38701290592 9.20189741882 32.7375387178 # OT - 1440 342 1 0.417 5.14396323319 9.78777969543 32.7375387178 # HT - 1441 342 1 0.417 3.63006257866 9.78777969543 32.7375387178 # HT - 1442 343 30 -0.834 1.92380774355 11.6651025812 32.7375387178 # OT - 1443 343 1 0.417 2.68075807082 12.2509848578 32.7375387178 # HT - 1444 343 1 0.417 1.16685741629 12.2509848578 32.7375387178 # HT - 1445 344 38 1 4.38701290592 16.5915129059 -4.21053871777 # SOD - 1446 345 30 -0.834 4.38701290592 14.1283077436 -1.7473335554 # OT - 1447 345 1 0.417 5.14396323319 14.7141900202 -1.7473335554 # HT - 1448 345 1 0.417 3.63006257866 14.7141900202 -1.7473335554 # HT - 1449 346 30 -0.834 4.38701290592 16.5915129059 0.715871606972 # OT - 1450 346 1 0.417 5.14396323319 17.1773951825 0.715871606972 # HT - 1451 346 1 0.417 3.63006257866 17.1773951825 0.715871606972 # HT - 1452 347 30 -0.834 1.92380774355 16.5915129059 3.17907676934 # OT - 1453 347 1 0.417 2.68075807082 17.1773951825 3.17907676934 # HT - 1454 347 1 0.417 1.16685741629 17.1773951825 3.17907676934 # HT - 1455 348 30 -0.834 4.38701290592 16.5915129059 15.4951025812 # OT - 1456 348 1 0.417 5.14396323319 17.1773951825 15.4951025812 # HT - 1457 348 1 0.417 3.63006257866 17.1773951825 15.4951025812 # HT - 1458 349 30 -0.834 4.38701290592 14.1283077436 17.9583077436 # OT - 1459 349 1 0.417 5.14396323319 14.7141900202 17.9583077436 # HT - 1460 349 1 0.417 3.63006257866 14.7141900202 17.9583077436 # HT - 1461 350 30 -0.834 1.92380774355 16.5915129059 17.9583077436 # OT - 1462 350 1 0.417 2.68075807082 17.1773951825 17.9583077436 # HT - 1463 350 1 0.417 1.16685741629 17.1773951825 17.9583077436 # HT - 1464 351 30 -0.834 1.92380774355 14.1283077436 20.4215129059 # OT - 1465 351 1 0.417 2.68075807082 14.7141900202 20.4215129059 # HT - 1466 351 1 0.417 1.16685741629 14.7141900202 20.4215129059 # HT - 1467 352 30 -0.834 4.38701290592 16.5915129059 20.4215129059 # OT - 1468 352 1 0.417 5.14396323319 17.1773951825 20.4215129059 # HT - 1469 352 1 0.417 3.63006257866 17.1773951825 20.4215129059 # HT - 1470 353 30 -0.834 4.38701290592 14.1283077436 22.8847180683 # OT - 1471 353 1 0.417 5.14396323319 14.7141900202 22.8847180683 # HT - 1472 353 1 0.417 3.63006257866 14.7141900202 22.8847180683 # HT - 1473 354 30 -0.834 1.92380774355 16.5915129059 22.8847180683 # OT - 1474 354 1 0.417 2.68075807082 17.1773951825 22.8847180683 # HT - 1475 354 1 0.417 1.16685741629 17.1773951825 22.8847180683 # HT - 1476 355 30 -0.834 4.38701290592 16.5915129059 25.3479232307 # OT - 1477 355 1 0.417 5.14396323319 17.1773951825 25.3479232307 # HT - 1478 355 1 0.417 3.63006257866 17.1773951825 25.3479232307 # HT - 1479 356 30 -0.834 4.38701290592 14.1283077436 27.811128393 # OT - 1480 356 1 0.417 5.14396323319 14.7141900202 27.811128393 # HT - 1481 356 1 0.417 3.63006257866 14.7141900202 27.811128393 # HT - 1482 357 30 -0.834 1.92380774355 16.5915129059 27.811128393 # OT - 1483 357 1 0.417 2.68075807082 17.1773951825 27.811128393 # HT - 1484 357 1 0.417 1.16685741629 17.1773951825 27.811128393 # HT - 1485 358 30 -0.834 1.92380774355 14.1283077436 30.2743335554 # OT - 1486 358 1 0.417 2.68075807082 14.7141900202 30.2743335554 # HT - 1487 358 1 0.417 1.16685741629 14.7141900202 30.2743335554 # HT - 1488 359 30 -0.834 4.38701290592 16.5915129059 30.2743335554 # OT - 1489 359 1 0.417 5.14396323319 17.1773951825 30.2743335554 # HT - 1490 359 1 0.417 3.63006257866 17.1773951825 30.2743335554 # HT - 1491 360 30 -0.834 4.38701290592 14.1283077436 32.7375387178 # OT - 1492 360 1 0.417 5.14396323319 14.7141900202 32.7375387178 # HT - 1493 360 1 0.417 3.63006257866 14.7141900202 32.7375387178 # HT - 1494 361 30 -0.834 1.92380774355 16.5915129059 32.7375387178 # OT - 1495 361 1 0.417 2.68075807082 17.1773951825 32.7375387178 # HT - 1496 361 1 0.417 1.16685741629 17.1773951825 32.7375387178 # HT - 1497 362 30 -0.834 4.38701290592 21.5179232307 -4.21053871777 # OT - 1498 362 1 0.417 5.14396323319 22.1038055073 -4.21053871777 # HT - 1499 362 1 0.417 3.63006257866 22.1038055073 -4.21053871777 # HT - 1500 363 38 1 4.38701290592 19.0547180683 -1.7473335554 # SOD - 1501 364 30 -0.834 1.92380774355 21.5179232307 -1.7473335554 # OT - 1502 364 1 0.417 2.68075807082 22.1038055073 -1.7473335554 # HT - 1503 364 1 0.417 1.16685741629 22.1038055073 -1.7473335554 # HT - 1504 365 30 -0.834 1.92380774355 19.0547180683 0.715871606972 # OT - 1505 365 1 0.417 2.68075807082 19.6406003449 0.715871606972 # HT - 1506 365 1 0.417 1.16685741629 19.6406003449 0.715871606972 # HT - 1507 366 30 -0.834 4.38701290592 21.5179232307 0.715871606972 # OT - 1508 366 1 0.417 5.14396323319 22.1038055073 0.715871606972 # HT - 1509 366 1 0.417 3.63006257866 22.1038055073 0.715871606972 # HT - 1510 367 30 -0.834 4.38701290592 19.0547180683 3.17907676934 # OT - 1511 367 1 0.417 5.14396323319 19.6406003449 3.17907676934 # HT - 1512 367 1 0.417 3.63006257866 19.6406003449 3.17907676934 # HT - 1513 368 30 -0.834 1.92380774355 21.5179232307 3.17907676934 # OT - 1514 368 1 0.417 2.68075807082 22.1038055073 3.17907676934 # HT - 1515 368 1 0.417 1.16685741629 22.1038055073 3.17907676934 # HT - 1516 369 30 -0.834 4.38701290592 21.5179232307 5.64228193171 # OT - 1517 369 1 0.417 5.14396323319 22.1038055073 5.64228193171 # HT - 1518 369 1 0.417 3.63006257866 22.1038055073 5.64228193171 # HT - 1519 370 30 -0.834 4.38701290592 21.5179232307 10.5686922564 # OT - 1520 370 1 0.417 5.14396323319 22.1038055073 10.5686922564 # HT - 1521 370 1 0.417 3.63006257866 22.1038055073 10.5686922564 # HT - 1522 371 30 -0.834 4.38701290592 19.0547180683 13.0318974188 # OT - 1523 371 1 0.417 5.14396323319 19.6406003449 13.0318974188 # HT - 1524 371 1 0.417 3.63006257866 19.6406003449 13.0318974188 # HT - 1525 372 30 -0.834 1.92380774355 19.0547180683 15.4951025812 # OT - 1526 372 1 0.417 2.68075807082 19.6406003449 15.4951025812 # HT - 1527 372 1 0.417 1.16685741629 19.6406003449 15.4951025812 # HT - 1528 373 30 -0.834 4.38701290592 21.5179232307 15.4951025812 # OT - 1529 373 1 0.417 5.14396323319 22.1038055073 15.4951025812 # HT - 1530 373 1 0.417 3.63006257866 22.1038055073 15.4951025812 # HT - 1531 374 30 -0.834 4.38701290592 19.0547180683 17.9583077436 # OT - 1532 374 1 0.417 5.14396323319 19.6406003449 17.9583077436 # HT - 1533 374 1 0.417 3.63006257866 19.6406003449 17.9583077436 # HT - 1534 375 30 -0.834 1.92380774355 21.5179232307 17.9583077436 # OT - 1535 375 1 0.417 2.68075807082 22.1038055073 17.9583077436 # HT - 1536 375 1 0.417 1.16685741629 22.1038055073 17.9583077436 # HT - 1537 376 30 -0.834 1.92380774355 19.0547180683 20.4215129059 # OT - 1538 376 1 0.417 2.68075807082 19.6406003449 20.4215129059 # HT - 1539 376 1 0.417 1.16685741629 19.6406003449 20.4215129059 # HT - 1540 377 30 -0.834 4.38701290592 21.5179232307 20.4215129059 # OT - 1541 377 1 0.417 5.14396323319 22.1038055073 20.4215129059 # HT - 1542 377 1 0.417 3.63006257866 22.1038055073 20.4215129059 # HT - 1543 378 30 -0.834 4.38701290592 19.0547180683 22.8847180683 # OT - 1544 378 1 0.417 5.14396323319 19.6406003449 22.8847180683 # HT - 1545 378 1 0.417 3.63006257866 19.6406003449 22.8847180683 # HT - 1546 379 30 -0.834 1.92380774355 21.5179232307 22.8847180683 # OT - 1547 379 1 0.417 2.68075807082 22.1038055073 22.8847180683 # HT - 1548 379 1 0.417 1.16685741629 22.1038055073 22.8847180683 # HT - 1549 380 30 -0.834 1.92380774355 19.0547180683 25.3479232307 # OT - 1550 380 1 0.417 2.68075807082 19.6406003449 25.3479232307 # HT - 1551 380 1 0.417 1.16685741629 19.6406003449 25.3479232307 # HT - 1552 381 30 -0.834 4.38701290592 21.5179232307 25.3479232307 # OT - 1553 381 1 0.417 5.14396323319 22.1038055073 25.3479232307 # HT - 1554 381 1 0.417 3.63006257866 22.1038055073 25.3479232307 # HT - 1555 382 30 -0.834 4.38701290592 19.0547180683 27.811128393 # OT - 1556 382 1 0.417 5.14396323319 19.6406003449 27.811128393 # HT - 1557 382 1 0.417 3.63006257866 19.6406003449 27.811128393 # HT - 1558 383 30 -0.834 1.92380774355 21.5179232307 27.811128393 # OT - 1559 383 1 0.417 2.68075807082 22.1038055073 27.811128393 # HT - 1560 383 1 0.417 1.16685741629 22.1038055073 27.811128393 # HT - 1561 384 30 -0.834 1.92380774355 19.0547180683 30.2743335554 # OT - 1562 384 1 0.417 2.68075807082 19.6406003449 30.2743335554 # HT - 1563 384 1 0.417 1.16685741629 19.6406003449 30.2743335554 # HT - 1564 385 30 -0.834 4.38701290592 21.5179232307 30.2743335554 # OT - 1565 385 1 0.417 5.14396323319 22.1038055073 30.2743335554 # HT - 1566 385 1 0.417 3.63006257866 22.1038055073 30.2743335554 # HT - 1567 386 30 -0.834 4.38701290592 19.0547180683 32.7375387178 # OT - 1568 386 1 0.417 5.14396323319 19.6406003449 32.7375387178 # HT - 1569 386 1 0.417 3.63006257866 19.6406003449 32.7375387178 # HT - 1570 387 30 -0.834 1.92380774355 21.5179232307 32.7375387178 # OT - 1571 387 1 0.417 2.68075807082 22.1038055073 32.7375387178 # HT - 1572 387 1 0.417 1.16685741629 22.1038055073 32.7375387178 # HT - 1573 388 38 1 6.85021806829 -0.650923230659 -4.21053871777 # SOD - 1574 389 30 -0.834 9.31342323066 1.81228193171 -4.21053871777 # OT - 1575 389 1 0.417 10.0703735579 2.39816420833 -4.21053871777 # HT - 1576 389 1 0.417 8.5564729034 2.39816420833 -4.21053871777 # HT - 1577 390 30 -0.834 9.31342323066 -0.650923230659 -1.7473335554 # OT - 1578 390 1 0.417 10.0703735579 -0.0650409540408 -1.7473335554 # HT - 1579 390 1 0.417 8.5564729034 -0.0650409540408 -1.7473335554 # HT - 1580 391 30 -0.834 9.31342323066 1.81228193171 0.715871606972 # OT - 1581 391 1 0.417 10.0703735579 2.39816420833 0.715871606972 # HT - 1582 391 1 0.417 8.5564729034 2.39816420833 0.715871606972 # HT - 1583 392 30 -0.834 9.31342323066 -0.650923230659 3.17907676934 # OT - 1584 392 1 0.417 10.0703735579 -0.0650409540408 3.17907676934 # HT - 1585 392 1 0.417 8.5564729034 -0.0650409540408 3.17907676934 # HT - 1586 393 38 1 6.85021806829 -0.650923230659 5.64228193171 # SOD + 1125 236 38 1 -3.00260258118 -0.650923230659 10.5686922564 # SOD + 1126 237 30 -0.834 -0.539397418816 1.81228193171 10.5686922564 # OT + 1127 237 1 0.417 0.217552908448 2.39816420833 10.5686922564 # HT + 1128 237 1 0.417 -1.29634774608 2.39816420833 10.5686922564 # HT + 1129 238 30 -0.834 -0.539397418816 -0.650923230659 13.0318974188 # OT + 1130 238 1 0.417 0.217552908448 -0.0650409540408 13.0318974188 # HT + 1131 238 1 0.417 -1.29634774608 -0.0650409540408 13.0318974188 # HT + 1132 239 30 -0.834 -0.539397418816 -0.650923230659 17.9583077436 # OT + 1133 239 1 0.417 0.217552908448 -0.0650409540408 17.9583077436 # HT + 1134 239 1 0.417 -1.29634774608 -0.0650409540408 17.9583077436 # HT + 1135 240 30 -0.834 -3.00260258118 -0.650923230659 20.4215129059 # OT + 1136 240 1 0.417 -2.24565225392 -0.0650409540408 20.4215129059 # HT + 1137 240 1 0.417 -3.75955290845 -0.0650409540408 20.4215129059 # HT + 1138 241 30 -0.834 -0.539397418816 -0.650923230659 22.8847180683 # OT + 1139 241 1 0.417 0.217552908448 -0.0650409540408 22.8847180683 # HT + 1140 241 1 0.417 -1.29634774608 -0.0650409540408 22.8847180683 # HT + 1141 242 30 -0.834 -3.00260258118 1.81228193171 22.8847180683 # OT + 1142 242 1 0.417 -2.24565225392 2.39816420833 22.8847180683 # HT + 1143 242 1 0.417 -3.75955290845 2.39816420833 22.8847180683 # HT + 1144 243 30 -0.834 -3.00260258118 -0.650923230659 25.3479232307 # OT + 1145 243 1 0.417 -2.24565225392 -0.0650409540408 25.3479232307 # HT + 1146 243 1 0.417 -3.75955290845 -0.0650409540408 25.3479232307 # HT + 1147 244 30 -0.834 -0.539397418816 1.81228193171 25.3479232307 # OT + 1148 244 1 0.417 0.217552908448 2.39816420833 25.3479232307 # HT + 1149 244 1 0.417 -1.29634774608 2.39816420833 25.3479232307 # HT + 1150 245 30 -0.834 -0.539397418816 -0.650923230659 27.811128393 # OT + 1151 245 1 0.417 0.217552908448 -0.0650409540408 27.811128393 # HT + 1152 245 1 0.417 -1.29634774608 -0.0650409540408 27.811128393 # HT + 1153 246 30 -0.834 -3.00260258118 1.81228193171 27.811128393 # OT + 1154 246 1 0.417 -2.24565225392 2.39816420833 27.811128393 # HT + 1155 246 1 0.417 -3.75955290845 2.39816420833 27.811128393 # HT + 1156 247 30 -0.834 -3.00260258118 -0.650923230659 30.2743335554 # OT + 1157 247 1 0.417 -2.24565225392 -0.0650409540408 30.2743335554 # HT + 1158 247 1 0.417 -3.75955290845 -0.0650409540408 30.2743335554 # HT + 1159 248 30 -0.834 -0.539397418816 1.81228193171 30.2743335554 # OT + 1160 248 1 0.417 0.217552908448 2.39816420833 30.2743335554 # HT + 1161 248 1 0.417 -1.29634774608 2.39816420833 30.2743335554 # HT + 1162 249 30 -0.834 -0.539397418816 -0.650923230659 32.7375387178 # OT + 1163 249 1 0.417 0.217552908448 -0.0650409540408 32.7375387178 # HT + 1164 249 1 0.417 -1.29634774608 -0.0650409540408 32.7375387178 # HT + 1165 250 30 -0.834 -3.00260258118 1.81228193171 32.7375387178 # OT + 1166 250 1 0.417 -2.24565225392 2.39816420833 32.7375387178 # HT + 1167 250 1 0.417 -3.75955290845 2.39816420833 32.7375387178 # HT + 1168 251 30 -0.834 -3.00260258118 4.27548709408 -4.21053871777 # OT + 1169 251 1 0.417 -2.24565225392 4.8613693707 -4.21053871777 # HT + 1170 251 1 0.417 -3.75955290845 4.8613693707 -4.21053871777 # HT + 1171 252 30 -0.834 -0.539397418816 6.73869225645 -4.21053871777 # OT + 1172 252 1 0.417 0.217552908448 7.32457453307 -4.21053871777 # HT + 1173 252 1 0.417 -1.29634774608 7.32457453307 -4.21053871777 # HT + 1174 253 30 -0.834 -3.00260258118 4.27548709408 0.715871606972 # OT + 1175 253 1 0.417 -2.24565225392 4.8613693707 0.715871606972 # HT + 1176 253 1 0.417 -3.75955290845 4.8613693707 0.715871606972 # HT + 1177 254 30 -0.834 -3.00260258118 4.27548709408 5.64228193171 # OT + 1178 254 1 0.417 -2.24565225392 4.8613693707 5.64228193171 # HT + 1179 254 1 0.417 -3.75955290845 4.8613693707 5.64228193171 # HT + 1180 255 30 -0.834 -0.539397418816 4.27548709408 8.10548709408 # OT + 1181 255 1 0.417 0.217552908448 4.8613693707 8.10548709408 # HT + 1182 255 1 0.417 -1.29634774608 4.8613693707 8.10548709408 # HT + 1183 256 30 -0.834 -3.00260258118 4.27548709408 10.5686922564 # OT + 1184 256 1 0.417 -2.24565225392 4.8613693707 10.5686922564 # HT + 1185 256 1 0.417 -3.75955290845 4.8613693707 10.5686922564 # HT + 1186 257 30 -0.834 -0.539397418816 4.27548709408 13.0318974188 # OT + 1187 257 1 0.417 0.217552908448 4.8613693707 13.0318974188 # HT + 1188 257 1 0.417 -1.29634774608 4.8613693707 13.0318974188 # HT + 1189 258 30 -0.834 -0.539397418816 4.27548709408 27.811128393 # OT + 1190 258 1 0.417 0.217552908448 4.8613693707 27.811128393 # HT + 1191 258 1 0.417 -1.29634774608 4.8613693707 27.811128393 # HT + 1192 259 30 -0.834 -3.00260258118 4.27548709408 30.2743335554 # OT + 1193 259 1 0.417 -2.24565225392 4.8613693707 30.2743335554 # HT + 1194 259 1 0.417 -3.75955290845 4.8613693707 30.2743335554 # HT + 1195 260 30 -0.834 -0.539397418816 6.73869225645 30.2743335554 # OT + 1196 260 1 0.417 0.217552908448 7.32457453307 30.2743335554 # HT + 1197 260 1 0.417 -1.29634774608 7.32457453307 30.2743335554 # HT + 1198 261 30 -0.834 -0.539397418816 4.27548709408 32.7375387178 # OT + 1199 261 1 0.417 0.217552908448 4.8613693707 32.7375387178 # HT + 1200 261 1 0.417 -1.29634774608 4.8613693707 32.7375387178 # HT + 1201 262 30 -0.834 -3.00260258118 6.73869225645 32.7375387178 # OT + 1202 262 1 0.417 -2.24565225392 7.32457453307 32.7375387178 # HT + 1203 262 1 0.417 -3.75955290845 7.32457453307 32.7375387178 # HT + 1204 263 38 1 -0.539397418816 9.20189741882 32.7375387178 # SOD + 1205 264 30 -0.834 -0.539397418816 21.5179232307 -4.21053871777 # OT + 1206 264 1 0.417 0.217552908448 22.1038055073 -4.21053871777 # HT + 1207 264 1 0.417 -1.29634774608 22.1038055073 -4.21053871777 # HT + 1208 265 30 -0.834 -3.00260258118 21.5179232307 -1.7473335554 # OT + 1209 265 1 0.417 -2.24565225392 22.1038055073 -1.7473335554 # HT + 1210 265 1 0.417 -3.75955290845 22.1038055073 -1.7473335554 # HT + 1211 266 30 -0.834 -0.539397418816 21.5179232307 0.715871606972 # OT + 1212 266 1 0.417 0.217552908448 22.1038055073 0.715871606972 # HT + 1213 266 1 0.417 -1.29634774608 22.1038055073 0.715871606972 # HT + 1214 267 30 -0.834 -0.539397418816 19.0547180683 3.17907676934 # OT + 1215 267 1 0.417 0.217552908448 19.6406003449 3.17907676934 # HT + 1216 267 1 0.417 -1.29634774608 19.6406003449 3.17907676934 # HT + 1217 268 38 1 -3.00260258118 21.5179232307 3.17907676934 # SOD + 1218 269 30 -0.834 -3.00260258118 19.0547180683 5.64228193171 # OT + 1219 269 1 0.417 -2.24565225392 19.6406003449 5.64228193171 # HT + 1220 269 1 0.417 -3.75955290845 19.6406003449 5.64228193171 # HT + 1221 270 30 -0.834 -0.539397418816 21.5179232307 5.64228193171 # OT + 1222 270 1 0.417 0.217552908448 22.1038055073 5.64228193171 # HT + 1223 270 1 0.417 -1.29634774608 22.1038055073 5.64228193171 # HT + 1224 271 30 -0.834 -0.539397418816 21.5179232307 15.4951025812 # OT + 1225 271 1 0.417 0.217552908448 22.1038055073 15.4951025812 # HT + 1226 271 1 0.417 -1.29634774608 22.1038055073 15.4951025812 # HT + 1227 272 30 -0.834 -3.00260258118 21.5179232307 17.9583077436 # OT + 1228 272 1 0.417 -2.24565225392 22.1038055073 17.9583077436 # HT + 1229 272 1 0.417 -3.75955290845 22.1038055073 17.9583077436 # HT + 1230 273 30 -0.834 -0.539397418816 21.5179232307 20.4215129059 # OT + 1231 273 1 0.417 0.217552908448 22.1038055073 20.4215129059 # HT + 1232 273 1 0.417 -1.29634774608 22.1038055073 20.4215129059 # HT + 1233 274 30 -0.834 -0.539397418816 19.0547180683 22.8847180683 # OT + 1234 274 1 0.417 0.217552908448 19.6406003449 22.8847180683 # HT + 1235 274 1 0.417 -1.29634774608 19.6406003449 22.8847180683 # HT + 1236 275 30 -0.834 -3.00260258118 21.5179232307 22.8847180683 # OT + 1237 275 1 0.417 -2.24565225392 22.1038055073 22.8847180683 # HT + 1238 275 1 0.417 -3.75955290845 22.1038055073 22.8847180683 # HT + 1239 276 30 -0.834 -0.539397418816 21.5179232307 25.3479232307 # OT + 1240 276 1 0.417 0.217552908448 22.1038055073 25.3479232307 # HT + 1241 276 1 0.417 -1.29634774608 22.1038055073 25.3479232307 # HT + 1242 277 30 -0.834 -0.539397418816 19.0547180683 27.811128393 # OT + 1243 277 1 0.417 0.217552908448 19.6406003449 27.811128393 # HT + 1244 277 1 0.417 -1.29634774608 19.6406003449 27.811128393 # HT + 1245 278 30 -0.834 -3.00260258118 21.5179232307 27.811128393 # OT + 1246 278 1 0.417 -2.24565225392 22.1038055073 27.811128393 # HT + 1247 278 1 0.417 -3.75955290845 22.1038055073 27.811128393 # HT + 1248 279 30 -0.834 -3.00260258118 19.0547180683 30.2743335554 # OT + 1249 279 1 0.417 -2.24565225392 19.6406003449 30.2743335554 # HT + 1250 279 1 0.417 -3.75955290845 19.6406003449 30.2743335554 # HT + 1251 280 30 -0.834 -0.539397418816 21.5179232307 30.2743335554 # OT + 1252 280 1 0.417 0.217552908448 22.1038055073 30.2743335554 # HT + 1253 280 1 0.417 -1.29634774608 22.1038055073 30.2743335554 # HT + 1254 281 30 -0.834 -0.539397418816 19.0547180683 32.7375387178 # OT + 1255 281 1 0.417 0.217552908448 19.6406003449 32.7375387178 # HT + 1256 281 1 0.417 -1.29634774608 19.6406003449 32.7375387178 # HT + 1257 282 30 -0.834 -3.00260258118 21.5179232307 32.7375387178 # OT + 1258 282 1 0.417 -2.24565225392 22.1038055073 32.7375387178 # HT + 1259 282 1 0.417 -3.75955290845 22.1038055073 32.7375387178 # HT + 1260 283 30 -0.834 1.92380774355 -0.650923230659 -4.21053871777 # OT + 1261 283 1 0.417 2.68075807082 -0.0650409540408 -4.21053871777 # HT + 1262 283 1 0.417 1.16685741629 -0.0650409540408 -4.21053871777 # HT + 1263 284 30 -0.834 1.92380774355 1.81228193171 3.17907676934 # OT + 1264 284 1 0.417 2.68075807082 2.39816420833 3.17907676934 # HT + 1265 284 1 0.417 1.16685741629 2.39816420833 3.17907676934 # HT + 1266 285 30 -0.834 1.92380774355 -0.650923230659 5.64228193171 # OT + 1267 285 1 0.417 2.68075807082 -0.0650409540408 5.64228193171 # HT + 1268 285 1 0.417 1.16685741629 -0.0650409540408 5.64228193171 # HT + 1269 286 30 -0.834 4.38701290592 1.81228193171 5.64228193171 # OT + 1270 286 1 0.417 5.14396323319 2.39816420833 5.64228193171 # HT + 1271 286 1 0.417 3.63006257866 2.39816420833 5.64228193171 # HT + 1272 287 30 -0.834 4.38701290592 -0.650923230659 8.10548709408 # OT + 1273 287 1 0.417 5.14396323319 -0.0650409540408 8.10548709408 # HT + 1274 287 1 0.417 3.63006257866 -0.0650409540408 8.10548709408 # HT + 1275 288 30 -0.834 1.92380774355 1.81228193171 8.10548709408 # OT + 1276 288 1 0.417 2.68075807082 2.39816420833 8.10548709408 # HT + 1277 288 1 0.417 1.16685741629 2.39816420833 8.10548709408 # HT + 1278 289 30 -0.834 1.92380774355 -0.650923230659 10.5686922564 # OT + 1279 289 1 0.417 2.68075807082 -0.0650409540408 10.5686922564 # HT + 1280 289 1 0.417 1.16685741629 -0.0650409540408 10.5686922564 # HT + 1281 290 30 -0.834 4.38701290592 1.81228193171 10.5686922564 # OT + 1282 290 1 0.417 5.14396323319 2.39816420833 10.5686922564 # HT + 1283 290 1 0.417 3.63006257866 2.39816420833 10.5686922564 # HT + 1284 291 30 -0.834 4.38701290592 -0.650923230659 13.0318974188 # OT + 1285 291 1 0.417 5.14396323319 -0.0650409540408 13.0318974188 # HT + 1286 291 1 0.417 3.63006257866 -0.0650409540408 13.0318974188 # HT + 1287 292 30 -0.834 1.92380774355 1.81228193171 13.0318974188 # OT + 1288 292 1 0.417 2.68075807082 2.39816420833 13.0318974188 # HT + 1289 292 1 0.417 1.16685741629 2.39816420833 13.0318974188 # HT + 1290 293 30 -0.834 1.92380774355 -0.650923230659 15.4951025812 # OT + 1291 293 1 0.417 2.68075807082 -0.0650409540408 15.4951025812 # HT + 1292 293 1 0.417 1.16685741629 -0.0650409540408 15.4951025812 # HT + 1293 294 30 -0.834 4.38701290592 1.81228193171 15.4951025812 # OT + 1294 294 1 0.417 5.14396323319 2.39816420833 15.4951025812 # HT + 1295 294 1 0.417 3.63006257866 2.39816420833 15.4951025812 # HT + 1296 295 30 -0.834 4.38701290592 -0.650923230659 17.9583077436 # OT + 1297 295 1 0.417 5.14396323319 -0.0650409540408 17.9583077436 # HT + 1298 295 1 0.417 3.63006257866 -0.0650409540408 17.9583077436 # HT + 1299 296 30 -0.834 1.92380774355 -0.650923230659 20.4215129059 # OT + 1300 296 1 0.417 2.68075807082 -0.0650409540408 20.4215129059 # HT + 1301 296 1 0.417 1.16685741629 -0.0650409540408 20.4215129059 # HT + 1302 297 30 -0.834 4.38701290592 1.81228193171 20.4215129059 # OT + 1303 297 1 0.417 5.14396323319 2.39816420833 20.4215129059 # HT + 1304 297 1 0.417 3.63006257866 2.39816420833 20.4215129059 # HT + 1305 298 30 -0.834 4.38701290592 -0.650923230659 22.8847180683 # OT + 1306 298 1 0.417 5.14396323319 -0.0650409540408 22.8847180683 # HT + 1307 298 1 0.417 3.63006257866 -0.0650409540408 22.8847180683 # HT + 1308 299 30 -0.834 1.92380774355 1.81228193171 22.8847180683 # OT + 1309 299 1 0.417 2.68075807082 2.39816420833 22.8847180683 # HT + 1310 299 1 0.417 1.16685741629 2.39816420833 22.8847180683 # HT + 1311 300 30 -0.834 1.92380774355 -0.650923230659 25.3479232307 # OT + 1312 300 1 0.417 2.68075807082 -0.0650409540408 25.3479232307 # HT + 1313 300 1 0.417 1.16685741629 -0.0650409540408 25.3479232307 # HT + 1314 301 30 -0.834 4.38701290592 1.81228193171 25.3479232307 # OT + 1315 301 1 0.417 5.14396323319 2.39816420833 25.3479232307 # HT + 1316 301 1 0.417 3.63006257866 2.39816420833 25.3479232307 # HT + 1317 302 30 -0.834 4.38701290592 -0.650923230659 27.811128393 # OT + 1318 302 1 0.417 5.14396323319 -0.0650409540408 27.811128393 # HT + 1319 302 1 0.417 3.63006257866 -0.0650409540408 27.811128393 # HT + 1320 303 30 -0.834 1.92380774355 1.81228193171 27.811128393 # OT + 1321 303 1 0.417 2.68075807082 2.39816420833 27.811128393 # HT + 1322 303 1 0.417 1.16685741629 2.39816420833 27.811128393 # HT + 1323 304 30 -0.834 1.92380774355 -0.650923230659 30.2743335554 # OT + 1324 304 1 0.417 2.68075807082 -0.0650409540408 30.2743335554 # HT + 1325 304 1 0.417 1.16685741629 -0.0650409540408 30.2743335554 # HT + 1326 305 30 -0.834 4.38701290592 1.81228193171 30.2743335554 # OT + 1327 305 1 0.417 5.14396323319 2.39816420833 30.2743335554 # HT + 1328 305 1 0.417 3.63006257866 2.39816420833 30.2743335554 # HT + 1329 306 30 -0.834 4.38701290592 -0.650923230659 32.7375387178 # OT + 1330 306 1 0.417 5.14396323319 -0.0650409540408 32.7375387178 # HT + 1331 306 1 0.417 3.63006257866 -0.0650409540408 32.7375387178 # HT + 1332 307 30 -0.834 1.92380774355 1.81228193171 32.7375387178 # OT + 1333 307 1 0.417 2.68075807082 2.39816420833 32.7375387178 # HT + 1334 307 1 0.417 1.16685741629 2.39816420833 32.7375387178 # HT + 1335 308 30 -0.834 1.92380774355 4.27548709408 -4.21053871777 # OT + 1336 308 1 0.417 2.68075807082 4.8613693707 -4.21053871777 # HT + 1337 308 1 0.417 1.16685741629 4.8613693707 -4.21053871777 # HT + 1338 309 30 -0.834 4.38701290592 6.73869225645 -4.21053871777 # OT + 1339 309 1 0.417 5.14396323319 7.32457453307 -4.21053871777 # HT + 1340 309 1 0.417 3.63006257866 7.32457453307 -4.21053871777 # HT + 1341 310 30 -0.834 4.38701290592 4.27548709408 8.10548709408 # OT + 1342 310 1 0.417 5.14396323319 4.8613693707 8.10548709408 # HT + 1343 310 1 0.417 3.63006257866 4.8613693707 8.10548709408 # HT + 1344 311 30 -0.834 1.92380774355 6.73869225645 8.10548709408 # OT + 1345 311 1 0.417 2.68075807082 7.32457453307 8.10548709408 # HT + 1346 311 1 0.417 1.16685741629 7.32457453307 8.10548709408 # HT + 1347 312 38 1 1.92380774355 4.27548709408 10.5686922564 # SOD + 1348 313 30 -0.834 4.38701290592 6.73869225645 10.5686922564 # OT + 1349 313 1 0.417 5.14396323319 7.32457453307 10.5686922564 # HT + 1350 313 1 0.417 3.63006257866 7.32457453307 10.5686922564 # HT + 1351 314 30 -0.834 4.38701290592 4.27548709408 13.0318974188 # OT + 1352 314 1 0.417 5.14396323319 4.8613693707 13.0318974188 # HT + 1353 314 1 0.417 3.63006257866 4.8613693707 13.0318974188 # HT + 1354 315 30 -0.834 1.92380774355 6.73869225645 13.0318974188 # OT + 1355 315 1 0.417 2.68075807082 7.32457453307 13.0318974188 # HT + 1356 315 1 0.417 1.16685741629 7.32457453307 13.0318974188 # HT + 1357 316 30 -0.834 1.92380774355 4.27548709408 15.4951025812 # OT + 1358 316 1 0.417 2.68075807082 4.8613693707 15.4951025812 # HT + 1359 316 1 0.417 1.16685741629 4.8613693707 15.4951025812 # HT + 1360 317 30 -0.834 4.38701290592 6.73869225645 15.4951025812 # OT + 1361 317 1 0.417 5.14396323319 7.32457453307 15.4951025812 # HT + 1362 317 1 0.417 3.63006257866 7.32457453307 15.4951025812 # HT + 1363 318 30 -0.834 4.38701290592 4.27548709408 17.9583077436 # OT + 1364 318 1 0.417 5.14396323319 4.8613693707 17.9583077436 # HT + 1365 318 1 0.417 3.63006257866 4.8613693707 17.9583077436 # HT + 1366 319 30 -0.834 4.38701290592 6.73869225645 20.4215129059 # OT + 1367 319 1 0.417 5.14396323319 7.32457453307 20.4215129059 # HT + 1368 319 1 0.417 3.63006257866 7.32457453307 20.4215129059 # HT + 1369 320 30 -0.834 4.38701290592 4.27548709408 22.8847180683 # OT + 1370 320 1 0.417 5.14396323319 4.8613693707 22.8847180683 # HT + 1371 320 1 0.417 3.63006257866 4.8613693707 22.8847180683 # HT + 1372 321 30 -0.834 1.92380774355 4.27548709408 25.3479232307 # OT + 1373 321 1 0.417 2.68075807082 4.8613693707 25.3479232307 # HT + 1374 321 1 0.417 1.16685741629 4.8613693707 25.3479232307 # HT + 1375 322 30 -0.834 4.38701290592 6.73869225645 25.3479232307 # OT + 1376 322 1 0.417 5.14396323319 7.32457453307 25.3479232307 # HT + 1377 322 1 0.417 3.63006257866 7.32457453307 25.3479232307 # HT + 1378 323 30 -0.834 4.38701290592 4.27548709408 27.811128393 # OT + 1379 323 1 0.417 5.14396323319 4.8613693707 27.811128393 # HT + 1380 323 1 0.417 3.63006257866 4.8613693707 27.811128393 # HT + 1381 324 30 -0.834 1.92380774355 6.73869225645 27.811128393 # OT + 1382 324 1 0.417 2.68075807082 7.32457453307 27.811128393 # HT + 1383 324 1 0.417 1.16685741629 7.32457453307 27.811128393 # HT + 1384 325 30 -0.834 1.92380774355 4.27548709408 30.2743335554 # OT + 1385 325 1 0.417 2.68075807082 4.8613693707 30.2743335554 # HT + 1386 325 1 0.417 1.16685741629 4.8613693707 30.2743335554 # HT + 1387 326 30 -0.834 4.38701290592 6.73869225645 30.2743335554 # OT + 1388 326 1 0.417 5.14396323319 7.32457453307 30.2743335554 # HT + 1389 326 1 0.417 3.63006257866 7.32457453307 30.2743335554 # HT + 1390 327 30 -0.834 4.38701290592 4.27548709408 32.7375387178 # OT + 1391 327 1 0.417 5.14396323319 4.8613693707 32.7375387178 # HT + 1392 327 1 0.417 3.63006257866 4.8613693707 32.7375387178 # HT + 1393 328 30 -0.834 1.92380774355 6.73869225645 32.7375387178 # OT + 1394 328 1 0.417 2.68075807082 7.32457453307 32.7375387178 # HT + 1395 328 1 0.417 1.16685741629 7.32457453307 32.7375387178 # HT + 1396 329 30 -0.834 1.92380774355 9.20189741882 -4.21053871777 # OT + 1397 329 1 0.417 2.68075807082 9.78777969543 -4.21053871777 # HT + 1398 329 1 0.417 1.16685741629 9.78777969543 -4.21053871777 # HT + 1399 330 30 -0.834 4.38701290592 11.6651025812 -4.21053871777 # OT + 1400 330 1 0.417 5.14396323319 12.2509848578 -4.21053871777 # HT + 1401 330 1 0.417 3.63006257866 12.2509848578 -4.21053871777 # HT + 1402 331 30 -0.834 4.38701290592 9.20189741882 13.0318974188 # OT + 1403 331 1 0.417 5.14396323319 9.78777969543 13.0318974188 # HT + 1404 331 1 0.417 3.63006257866 9.78777969543 13.0318974188 # HT + 1405 332 30 -0.834 4.38701290592 11.6651025812 15.4951025812 # OT + 1406 332 1 0.417 5.14396323319 12.2509848578 15.4951025812 # HT + 1407 332 1 0.417 3.63006257866 12.2509848578 15.4951025812 # HT + 1408 333 30 -0.834 4.38701290592 9.20189741882 17.9583077436 # OT + 1409 333 1 0.417 5.14396323319 9.78777969543 17.9583077436 # HT + 1410 333 1 0.417 3.63006257866 9.78777969543 17.9583077436 # HT + 1411 334 30 -0.834 1.92380774355 11.6651025812 17.9583077436 # OT + 1412 334 1 0.417 2.68075807082 12.2509848578 17.9583077436 # HT + 1413 334 1 0.417 1.16685741629 12.2509848578 17.9583077436 # HT + 1414 335 30 -0.834 4.38701290592 11.6651025812 20.4215129059 # OT + 1415 335 1 0.417 5.14396323319 12.2509848578 20.4215129059 # HT + 1416 335 1 0.417 3.63006257866 12.2509848578 20.4215129059 # HT + 1417 336 30 -0.834 4.38701290592 9.20189741882 22.8847180683 # OT + 1418 336 1 0.417 5.14396323319 9.78777969543 22.8847180683 # HT + 1419 336 1 0.417 3.63006257866 9.78777969543 22.8847180683 # HT + 1420 337 30 -0.834 1.92380774355 11.6651025812 22.8847180683 # OT + 1421 337 1 0.417 2.68075807082 12.2509848578 22.8847180683 # HT + 1422 337 1 0.417 1.16685741629 12.2509848578 22.8847180683 # HT + 1423 338 30 -0.834 4.38701290592 11.6651025812 25.3479232307 # OT + 1424 338 1 0.417 5.14396323319 12.2509848578 25.3479232307 # HT + 1425 338 1 0.417 3.63006257866 12.2509848578 25.3479232307 # HT + 1426 339 30 -0.834 4.38701290592 9.20189741882 27.811128393 # OT + 1427 339 1 0.417 5.14396323319 9.78777969543 27.811128393 # HT + 1428 339 1 0.417 3.63006257866 9.78777969543 27.811128393 # HT + 1429 340 30 -0.834 1.92380774355 9.20189741882 30.2743335554 # OT + 1430 340 1 0.417 2.68075807082 9.78777969543 30.2743335554 # HT + 1431 340 1 0.417 1.16685741629 9.78777969543 30.2743335554 # HT + 1432 341 30 -0.834 4.38701290592 11.6651025812 30.2743335554 # OT + 1433 341 1 0.417 5.14396323319 12.2509848578 30.2743335554 # HT + 1434 341 1 0.417 3.63006257866 12.2509848578 30.2743335554 # HT + 1435 342 30 -0.834 4.38701290592 9.20189741882 32.7375387178 # OT + 1436 342 1 0.417 5.14396323319 9.78777969543 32.7375387178 # HT + 1437 342 1 0.417 3.63006257866 9.78777969543 32.7375387178 # HT + 1438 343 38 1 1.92380774355 11.6651025812 32.7375387178 # SOD + 1439 344 30 -0.834 4.38701290592 16.5915129059 -4.21053871777 # OT + 1440 344 1 0.417 5.14396323319 17.1773951825 -4.21053871777 # HT + 1441 344 1 0.417 3.63006257866 17.1773951825 -4.21053871777 # HT + 1442 345 30 -0.834 4.38701290592 14.1283077436 -1.7473335554 # OT + 1443 345 1 0.417 5.14396323319 14.7141900202 -1.7473335554 # HT + 1444 345 1 0.417 3.63006257866 14.7141900202 -1.7473335554 # HT + 1445 346 30 -0.834 4.38701290592 16.5915129059 0.715871606972 # OT + 1446 346 1 0.417 5.14396323319 17.1773951825 0.715871606972 # HT + 1447 346 1 0.417 3.63006257866 17.1773951825 0.715871606972 # HT + 1448 347 38 1 1.92380774355 16.5915129059 3.17907676934 # SOD + 1449 348 30 -0.834 4.38701290592 16.5915129059 15.4951025812 # OT + 1450 348 1 0.417 5.14396323319 17.1773951825 15.4951025812 # HT + 1451 348 1 0.417 3.63006257866 17.1773951825 15.4951025812 # HT + 1452 349 30 -0.834 4.38701290592 14.1283077436 17.9583077436 # OT + 1453 349 1 0.417 5.14396323319 14.7141900202 17.9583077436 # HT + 1454 349 1 0.417 3.63006257866 14.7141900202 17.9583077436 # HT + 1455 350 30 -0.834 1.92380774355 16.5915129059 17.9583077436 # OT + 1456 350 1 0.417 2.68075807082 17.1773951825 17.9583077436 # HT + 1457 350 1 0.417 1.16685741629 17.1773951825 17.9583077436 # HT + 1458 351 30 -0.834 1.92380774355 14.1283077436 20.4215129059 # OT + 1459 351 1 0.417 2.68075807082 14.7141900202 20.4215129059 # HT + 1460 351 1 0.417 1.16685741629 14.7141900202 20.4215129059 # HT + 1461 352 30 -0.834 4.38701290592 16.5915129059 20.4215129059 # OT + 1462 352 1 0.417 5.14396323319 17.1773951825 20.4215129059 # HT + 1463 352 1 0.417 3.63006257866 17.1773951825 20.4215129059 # HT + 1464 353 30 -0.834 4.38701290592 14.1283077436 22.8847180683 # OT + 1465 353 1 0.417 5.14396323319 14.7141900202 22.8847180683 # HT + 1466 353 1 0.417 3.63006257866 14.7141900202 22.8847180683 # HT + 1467 354 30 -0.834 1.92380774355 16.5915129059 22.8847180683 # OT + 1468 354 1 0.417 2.68075807082 17.1773951825 22.8847180683 # HT + 1469 354 1 0.417 1.16685741629 17.1773951825 22.8847180683 # HT + 1470 355 30 -0.834 4.38701290592 16.5915129059 25.3479232307 # OT + 1471 355 1 0.417 5.14396323319 17.1773951825 25.3479232307 # HT + 1472 355 1 0.417 3.63006257866 17.1773951825 25.3479232307 # HT + 1473 356 30 -0.834 4.38701290592 14.1283077436 27.811128393 # OT + 1474 356 1 0.417 5.14396323319 14.7141900202 27.811128393 # HT + 1475 356 1 0.417 3.63006257866 14.7141900202 27.811128393 # HT + 1476 357 30 -0.834 1.92380774355 16.5915129059 27.811128393 # OT + 1477 357 1 0.417 2.68075807082 17.1773951825 27.811128393 # HT + 1478 357 1 0.417 1.16685741629 17.1773951825 27.811128393 # HT + 1479 358 30 -0.834 1.92380774355 14.1283077436 30.2743335554 # OT + 1480 358 1 0.417 2.68075807082 14.7141900202 30.2743335554 # HT + 1481 358 1 0.417 1.16685741629 14.7141900202 30.2743335554 # HT + 1482 359 30 -0.834 4.38701290592 16.5915129059 30.2743335554 # OT + 1483 359 1 0.417 5.14396323319 17.1773951825 30.2743335554 # HT + 1484 359 1 0.417 3.63006257866 17.1773951825 30.2743335554 # HT + 1485 360 30 -0.834 4.38701290592 14.1283077436 32.7375387178 # OT + 1486 360 1 0.417 5.14396323319 14.7141900202 32.7375387178 # HT + 1487 360 1 0.417 3.63006257866 14.7141900202 32.7375387178 # HT + 1488 361 30 -0.834 1.92380774355 16.5915129059 32.7375387178 # OT + 1489 361 1 0.417 2.68075807082 17.1773951825 32.7375387178 # HT + 1490 361 1 0.417 1.16685741629 17.1773951825 32.7375387178 # HT + 1491 362 30 -0.834 4.38701290592 21.5179232307 -4.21053871777 # OT + 1492 362 1 0.417 5.14396323319 22.1038055073 -4.21053871777 # HT + 1493 362 1 0.417 3.63006257866 22.1038055073 -4.21053871777 # HT + 1494 363 30 -0.834 4.38701290592 19.0547180683 -1.7473335554 # OT + 1495 363 1 0.417 5.14396323319 19.6406003449 -1.7473335554 # HT + 1496 363 1 0.417 3.63006257866 19.6406003449 -1.7473335554 # HT + 1497 364 30 -0.834 1.92380774355 21.5179232307 -1.7473335554 # OT + 1498 364 1 0.417 2.68075807082 22.1038055073 -1.7473335554 # HT + 1499 364 1 0.417 1.16685741629 22.1038055073 -1.7473335554 # HT + 1500 365 30 -0.834 1.92380774355 19.0547180683 0.715871606972 # OT + 1501 365 1 0.417 2.68075807082 19.6406003449 0.715871606972 # HT + 1502 365 1 0.417 1.16685741629 19.6406003449 0.715871606972 # HT + 1503 366 30 -0.834 4.38701290592 21.5179232307 0.715871606972 # OT + 1504 366 1 0.417 5.14396323319 22.1038055073 0.715871606972 # HT + 1505 366 1 0.417 3.63006257866 22.1038055073 0.715871606972 # HT + 1506 367 30 -0.834 4.38701290592 19.0547180683 3.17907676934 # OT + 1507 367 1 0.417 5.14396323319 19.6406003449 3.17907676934 # HT + 1508 367 1 0.417 3.63006257866 19.6406003449 3.17907676934 # HT + 1509 368 30 -0.834 1.92380774355 21.5179232307 3.17907676934 # OT + 1510 368 1 0.417 2.68075807082 22.1038055073 3.17907676934 # HT + 1511 368 1 0.417 1.16685741629 22.1038055073 3.17907676934 # HT + 1512 369 30 -0.834 4.38701290592 21.5179232307 5.64228193171 # OT + 1513 369 1 0.417 5.14396323319 22.1038055073 5.64228193171 # HT + 1514 369 1 0.417 3.63006257866 22.1038055073 5.64228193171 # HT + 1515 370 30 -0.834 4.38701290592 21.5179232307 10.5686922564 # OT + 1516 370 1 0.417 5.14396323319 22.1038055073 10.5686922564 # HT + 1517 370 1 0.417 3.63006257866 22.1038055073 10.5686922564 # HT + 1518 371 30 -0.834 4.38701290592 19.0547180683 13.0318974188 # OT + 1519 371 1 0.417 5.14396323319 19.6406003449 13.0318974188 # HT + 1520 371 1 0.417 3.63006257866 19.6406003449 13.0318974188 # HT + 1521 372 30 -0.834 1.92380774355 19.0547180683 15.4951025812 # OT + 1522 372 1 0.417 2.68075807082 19.6406003449 15.4951025812 # HT + 1523 372 1 0.417 1.16685741629 19.6406003449 15.4951025812 # HT + 1524 373 30 -0.834 4.38701290592 21.5179232307 15.4951025812 # OT + 1525 373 1 0.417 5.14396323319 22.1038055073 15.4951025812 # HT + 1526 373 1 0.417 3.63006257866 22.1038055073 15.4951025812 # HT + 1527 374 30 -0.834 4.38701290592 19.0547180683 17.9583077436 # OT + 1528 374 1 0.417 5.14396323319 19.6406003449 17.9583077436 # HT + 1529 374 1 0.417 3.63006257866 19.6406003449 17.9583077436 # HT + 1530 375 30 -0.834 1.92380774355 21.5179232307 17.9583077436 # OT + 1531 375 1 0.417 2.68075807082 22.1038055073 17.9583077436 # HT + 1532 375 1 0.417 1.16685741629 22.1038055073 17.9583077436 # HT + 1533 376 30 -0.834 1.92380774355 19.0547180683 20.4215129059 # OT + 1534 376 1 0.417 2.68075807082 19.6406003449 20.4215129059 # HT + 1535 376 1 0.417 1.16685741629 19.6406003449 20.4215129059 # HT + 1536 377 30 -0.834 4.38701290592 21.5179232307 20.4215129059 # OT + 1537 377 1 0.417 5.14396323319 22.1038055073 20.4215129059 # HT + 1538 377 1 0.417 3.63006257866 22.1038055073 20.4215129059 # HT + 1539 378 30 -0.834 4.38701290592 19.0547180683 22.8847180683 # OT + 1540 378 1 0.417 5.14396323319 19.6406003449 22.8847180683 # HT + 1541 378 1 0.417 3.63006257866 19.6406003449 22.8847180683 # HT + 1542 379 30 -0.834 1.92380774355 21.5179232307 22.8847180683 # OT + 1543 379 1 0.417 2.68075807082 22.1038055073 22.8847180683 # HT + 1544 379 1 0.417 1.16685741629 22.1038055073 22.8847180683 # HT + 1545 380 30 -0.834 1.92380774355 19.0547180683 25.3479232307 # OT + 1546 380 1 0.417 2.68075807082 19.6406003449 25.3479232307 # HT + 1547 380 1 0.417 1.16685741629 19.6406003449 25.3479232307 # HT + 1548 381 30 -0.834 4.38701290592 21.5179232307 25.3479232307 # OT + 1549 381 1 0.417 5.14396323319 22.1038055073 25.3479232307 # HT + 1550 381 1 0.417 3.63006257866 22.1038055073 25.3479232307 # HT + 1551 382 30 -0.834 4.38701290592 19.0547180683 27.811128393 # OT + 1552 382 1 0.417 5.14396323319 19.6406003449 27.811128393 # HT + 1553 382 1 0.417 3.63006257866 19.6406003449 27.811128393 # HT + 1554 383 30 -0.834 1.92380774355 21.5179232307 27.811128393 # OT + 1555 383 1 0.417 2.68075807082 22.1038055073 27.811128393 # HT + 1556 383 1 0.417 1.16685741629 22.1038055073 27.811128393 # HT + 1557 384 30 -0.834 1.92380774355 19.0547180683 30.2743335554 # OT + 1558 384 1 0.417 2.68075807082 19.6406003449 30.2743335554 # HT + 1559 384 1 0.417 1.16685741629 19.6406003449 30.2743335554 # HT + 1560 385 30 -0.834 4.38701290592 21.5179232307 30.2743335554 # OT + 1561 385 1 0.417 5.14396323319 22.1038055073 30.2743335554 # HT + 1562 385 1 0.417 3.63006257866 22.1038055073 30.2743335554 # HT + 1563 386 30 -0.834 4.38701290592 19.0547180683 32.7375387178 # OT + 1564 386 1 0.417 5.14396323319 19.6406003449 32.7375387178 # HT + 1565 386 1 0.417 3.63006257866 19.6406003449 32.7375387178 # HT + 1566 387 30 -0.834 1.92380774355 21.5179232307 32.7375387178 # OT + 1567 387 1 0.417 2.68075807082 22.1038055073 32.7375387178 # HT + 1568 387 1 0.417 1.16685741629 22.1038055073 32.7375387178 # HT + 1569 388 30 -0.834 6.85021806829 -0.650923230659 -4.21053871777 # OT + 1570 388 1 0.417 7.60716839555 -0.0650409540408 -4.21053871777 # HT + 1571 388 1 0.417 6.09326774103 -0.0650409540408 -4.21053871777 # HT + 1572 389 30 -0.834 9.31342323066 1.81228193171 -4.21053871777 # OT + 1573 389 1 0.417 10.0703735579 2.39816420833 -4.21053871777 # HT + 1574 389 1 0.417 8.5564729034 2.39816420833 -4.21053871777 # HT + 1575 390 30 -0.834 9.31342323066 -0.650923230659 -1.7473335554 # OT + 1576 390 1 0.417 10.0703735579 -0.0650409540408 -1.7473335554 # HT + 1577 390 1 0.417 8.5564729034 -0.0650409540408 -1.7473335554 # HT + 1578 391 30 -0.834 9.31342323066 1.81228193171 0.715871606972 # OT + 1579 391 1 0.417 10.0703735579 2.39816420833 0.715871606972 # HT + 1580 391 1 0.417 8.5564729034 2.39816420833 0.715871606972 # HT + 1581 392 30 -0.834 9.31342323066 -0.650923230659 3.17907676934 # OT + 1582 392 1 0.417 10.0703735579 -0.0650409540408 3.17907676934 # HT + 1583 392 1 0.417 8.5564729034 -0.0650409540408 3.17907676934 # HT + 1584 393 30 -0.834 6.85021806829 -0.650923230659 5.64228193171 # OT + 1585 393 1 0.417 7.60716839555 -0.0650409540408 5.64228193171 # HT + 1586 393 1 0.417 6.09326774103 -0.0650409540408 5.64228193171 # HT 1587 394 30 -0.834 9.31342323066 1.81228193171 5.64228193171 # OT 1588 394 1 0.417 10.0703735579 2.39816420833 5.64228193171 # HT 1589 394 1 0.417 8.5564729034 2.39816420833 5.64228193171 # HT @@ -1751,79 +1751,79 @@ Atoms # full 1647 414 30 -0.834 9.31342323066 1.81228193171 30.2743335554 # OT 1648 414 1 0.417 10.0703735579 2.39816420833 30.2743335554 # HT 1649 414 1 0.417 8.5564729034 2.39816420833 30.2743335554 # HT - 1650 415 38 1 9.31342323066 -0.650923230659 32.7375387178 # SOD - 1651 416 30 -0.834 6.85021806829 1.81228193171 32.7375387178 # OT - 1652 416 1 0.417 7.60716839555 2.39816420833 32.7375387178 # HT - 1653 416 1 0.417 6.09326774103 2.39816420833 32.7375387178 # HT - 1654 417 30 -0.834 9.31342323066 6.73869225645 -4.21053871777 # OT - 1655 417 1 0.417 10.0703735579 7.32457453307 -4.21053871777 # HT - 1656 417 1 0.417 8.5564729034 7.32457453307 -4.21053871777 # HT - 1657 418 30 -0.834 9.31342323066 6.73869225645 5.64228193171 # OT - 1658 418 1 0.417 10.0703735579 7.32457453307 5.64228193171 # HT - 1659 418 1 0.417 8.5564729034 7.32457453307 5.64228193171 # HT - 1660 419 30 -0.834 9.31342323066 4.27548709408 8.10548709408 # OT - 1661 419 1 0.417 10.0703735579 4.8613693707 8.10548709408 # HT - 1662 419 1 0.417 8.5564729034 4.8613693707 8.10548709408 # HT - 1663 420 30 -0.834 6.85021806829 6.73869225645 8.10548709408 # OT - 1664 420 1 0.417 7.60716839555 7.32457453307 8.10548709408 # HT - 1665 420 1 0.417 6.09326774103 7.32457453307 8.10548709408 # HT - 1666 421 30 -0.834 6.85021806829 4.27548709408 10.5686922564 # OT - 1667 421 1 0.417 7.60716839555 4.8613693707 10.5686922564 # HT - 1668 421 1 0.417 6.09326774103 4.8613693707 10.5686922564 # HT - 1669 422 30 -0.834 9.31342323066 6.73869225645 10.5686922564 # OT - 1670 422 1 0.417 10.0703735579 7.32457453307 10.5686922564 # HT - 1671 422 1 0.417 8.5564729034 7.32457453307 10.5686922564 # HT - 1672 423 30 -0.834 9.31342323066 4.27548709408 13.0318974188 # OT - 1673 423 1 0.417 10.0703735579 4.8613693707 13.0318974188 # HT - 1674 423 1 0.417 8.5564729034 4.8613693707 13.0318974188 # HT - 1675 424 30 -0.834 6.85021806829 6.73869225645 13.0318974188 # OT - 1676 424 1 0.417 7.60716839555 7.32457453307 13.0318974188 # HT - 1677 424 1 0.417 6.09326774103 7.32457453307 13.0318974188 # HT - 1678 425 30 -0.834 6.85021806829 4.27548709408 15.4951025812 # OT - 1679 425 1 0.417 7.60716839555 4.8613693707 15.4951025812 # HT - 1680 425 1 0.417 6.09326774103 4.8613693707 15.4951025812 # HT - 1681 426 30 -0.834 9.31342323066 6.73869225645 15.4951025812 # OT - 1682 426 1 0.417 10.0703735579 7.32457453307 15.4951025812 # HT - 1683 426 1 0.417 8.5564729034 7.32457453307 15.4951025812 # HT - 1684 427 30 -0.834 9.31342323066 4.27548709408 17.9583077436 # OT - 1685 427 1 0.417 10.0703735579 4.8613693707 17.9583077436 # HT - 1686 427 1 0.417 8.5564729034 4.8613693707 17.9583077436 # HT - 1687 428 30 -0.834 6.85021806829 6.73869225645 17.9583077436 # OT - 1688 428 1 0.417 7.60716839555 7.32457453307 17.9583077436 # HT - 1689 428 1 0.417 6.09326774103 7.32457453307 17.9583077436 # HT - 1690 429 30 -0.834 6.85021806829 4.27548709408 20.4215129059 # OT - 1691 429 1 0.417 7.60716839555 4.8613693707 20.4215129059 # HT - 1692 429 1 0.417 6.09326774103 4.8613693707 20.4215129059 # HT - 1693 430 30 -0.834 9.31342323066 6.73869225645 20.4215129059 # OT - 1694 430 1 0.417 10.0703735579 7.32457453307 20.4215129059 # HT - 1695 430 1 0.417 8.5564729034 7.32457453307 20.4215129059 # HT - 1696 431 30 -0.834 9.31342323066 4.27548709408 22.8847180683 # OT - 1697 431 1 0.417 10.0703735579 4.8613693707 22.8847180683 # HT - 1698 431 1 0.417 8.5564729034 4.8613693707 22.8847180683 # HT - 1699 432 30 -0.834 6.85021806829 6.73869225645 22.8847180683 # OT - 1700 432 1 0.417 7.60716839555 7.32457453307 22.8847180683 # HT - 1701 432 1 0.417 6.09326774103 7.32457453307 22.8847180683 # HT - 1702 433 30 -0.834 6.85021806829 4.27548709408 25.3479232307 # OT - 1703 433 1 0.417 7.60716839555 4.8613693707 25.3479232307 # HT - 1704 433 1 0.417 6.09326774103 4.8613693707 25.3479232307 # HT - 1705 434 30 -0.834 9.31342323066 6.73869225645 25.3479232307 # OT - 1706 434 1 0.417 10.0703735579 7.32457453307 25.3479232307 # HT - 1707 434 1 0.417 8.5564729034 7.32457453307 25.3479232307 # HT - 1708 435 30 -0.834 9.31342323066 4.27548709408 27.811128393 # OT - 1709 435 1 0.417 10.0703735579 4.8613693707 27.811128393 # HT - 1710 435 1 0.417 8.5564729034 4.8613693707 27.811128393 # HT - 1711 436 30 -0.834 6.85021806829 6.73869225645 27.811128393 # OT - 1712 436 1 0.417 7.60716839555 7.32457453307 27.811128393 # HT - 1713 436 1 0.417 6.09326774103 7.32457453307 27.811128393 # HT - 1714 437 30 -0.834 6.85021806829 4.27548709408 30.2743335554 # OT - 1715 437 1 0.417 7.60716839555 4.8613693707 30.2743335554 # HT - 1716 437 1 0.417 6.09326774103 4.8613693707 30.2743335554 # HT - 1717 438 30 -0.834 9.31342323066 6.73869225645 30.2743335554 # OT - 1718 438 1 0.417 10.0703735579 7.32457453307 30.2743335554 # HT - 1719 438 1 0.417 8.5564729034 7.32457453307 30.2743335554 # HT - 1720 439 30 -0.834 9.31342323066 4.27548709408 32.7375387178 # OT - 1721 439 1 0.417 10.0703735579 4.8613693707 32.7375387178 # HT - 1722 439 1 0.417 8.5564729034 4.8613693707 32.7375387178 # HT + 1650 415 30 -0.834 9.31342323066 -0.650923230659 32.7375387178 # OT + 1651 415 1 0.417 10.0703735579 -0.0650409540408 32.7375387178 # HT + 1652 415 1 0.417 8.5564729034 -0.0650409540408 32.7375387178 # HT + 1653 416 30 -0.834 6.85021806829 1.81228193171 32.7375387178 # OT + 1654 416 1 0.417 7.60716839555 2.39816420833 32.7375387178 # HT + 1655 416 1 0.417 6.09326774103 2.39816420833 32.7375387178 # HT + 1656 417 30 -0.834 9.31342323066 6.73869225645 -4.21053871777 # OT + 1657 417 1 0.417 10.0703735579 7.32457453307 -4.21053871777 # HT + 1658 417 1 0.417 8.5564729034 7.32457453307 -4.21053871777 # HT + 1659 418 30 -0.834 9.31342323066 6.73869225645 5.64228193171 # OT + 1660 418 1 0.417 10.0703735579 7.32457453307 5.64228193171 # HT + 1661 418 1 0.417 8.5564729034 7.32457453307 5.64228193171 # HT + 1662 419 30 -0.834 9.31342323066 4.27548709408 8.10548709408 # OT + 1663 419 1 0.417 10.0703735579 4.8613693707 8.10548709408 # HT + 1664 419 1 0.417 8.5564729034 4.8613693707 8.10548709408 # HT + 1665 420 30 -0.834 6.85021806829 6.73869225645 8.10548709408 # OT + 1666 420 1 0.417 7.60716839555 7.32457453307 8.10548709408 # HT + 1667 420 1 0.417 6.09326774103 7.32457453307 8.10548709408 # HT + 1668 421 30 -0.834 6.85021806829 4.27548709408 10.5686922564 # OT + 1669 421 1 0.417 7.60716839555 4.8613693707 10.5686922564 # HT + 1670 421 1 0.417 6.09326774103 4.8613693707 10.5686922564 # HT + 1671 422 30 -0.834 9.31342323066 6.73869225645 10.5686922564 # OT + 1672 422 1 0.417 10.0703735579 7.32457453307 10.5686922564 # HT + 1673 422 1 0.417 8.5564729034 7.32457453307 10.5686922564 # HT + 1674 423 30 -0.834 9.31342323066 4.27548709408 13.0318974188 # OT + 1675 423 1 0.417 10.0703735579 4.8613693707 13.0318974188 # HT + 1676 423 1 0.417 8.5564729034 4.8613693707 13.0318974188 # HT + 1677 424 30 -0.834 6.85021806829 6.73869225645 13.0318974188 # OT + 1678 424 1 0.417 7.60716839555 7.32457453307 13.0318974188 # HT + 1679 424 1 0.417 6.09326774103 7.32457453307 13.0318974188 # HT + 1680 425 30 -0.834 6.85021806829 4.27548709408 15.4951025812 # OT + 1681 425 1 0.417 7.60716839555 4.8613693707 15.4951025812 # HT + 1682 425 1 0.417 6.09326774103 4.8613693707 15.4951025812 # HT + 1683 426 30 -0.834 9.31342323066 6.73869225645 15.4951025812 # OT + 1684 426 1 0.417 10.0703735579 7.32457453307 15.4951025812 # HT + 1685 426 1 0.417 8.5564729034 7.32457453307 15.4951025812 # HT + 1686 427 30 -0.834 9.31342323066 4.27548709408 17.9583077436 # OT + 1687 427 1 0.417 10.0703735579 4.8613693707 17.9583077436 # HT + 1688 427 1 0.417 8.5564729034 4.8613693707 17.9583077436 # HT + 1689 428 30 -0.834 6.85021806829 6.73869225645 17.9583077436 # OT + 1690 428 1 0.417 7.60716839555 7.32457453307 17.9583077436 # HT + 1691 428 1 0.417 6.09326774103 7.32457453307 17.9583077436 # HT + 1692 429 30 -0.834 6.85021806829 4.27548709408 20.4215129059 # OT + 1693 429 1 0.417 7.60716839555 4.8613693707 20.4215129059 # HT + 1694 429 1 0.417 6.09326774103 4.8613693707 20.4215129059 # HT + 1695 430 30 -0.834 9.31342323066 6.73869225645 20.4215129059 # OT + 1696 430 1 0.417 10.0703735579 7.32457453307 20.4215129059 # HT + 1697 430 1 0.417 8.5564729034 7.32457453307 20.4215129059 # HT + 1698 431 30 -0.834 9.31342323066 4.27548709408 22.8847180683 # OT + 1699 431 1 0.417 10.0703735579 4.8613693707 22.8847180683 # HT + 1700 431 1 0.417 8.5564729034 4.8613693707 22.8847180683 # HT + 1701 432 30 -0.834 6.85021806829 6.73869225645 22.8847180683 # OT + 1702 432 1 0.417 7.60716839555 7.32457453307 22.8847180683 # HT + 1703 432 1 0.417 6.09326774103 7.32457453307 22.8847180683 # HT + 1704 433 30 -0.834 6.85021806829 4.27548709408 25.3479232307 # OT + 1705 433 1 0.417 7.60716839555 4.8613693707 25.3479232307 # HT + 1706 433 1 0.417 6.09326774103 4.8613693707 25.3479232307 # HT + 1707 434 30 -0.834 9.31342323066 6.73869225645 25.3479232307 # OT + 1708 434 1 0.417 10.0703735579 7.32457453307 25.3479232307 # HT + 1709 434 1 0.417 8.5564729034 7.32457453307 25.3479232307 # HT + 1710 435 30 -0.834 9.31342323066 4.27548709408 27.811128393 # OT + 1711 435 1 0.417 10.0703735579 4.8613693707 27.811128393 # HT + 1712 435 1 0.417 8.5564729034 4.8613693707 27.811128393 # HT + 1713 436 30 -0.834 6.85021806829 6.73869225645 27.811128393 # OT + 1714 436 1 0.417 7.60716839555 7.32457453307 27.811128393 # HT + 1715 436 1 0.417 6.09326774103 7.32457453307 27.811128393 # HT + 1716 437 30 -0.834 6.85021806829 4.27548709408 30.2743335554 # OT + 1717 437 1 0.417 7.60716839555 4.8613693707 30.2743335554 # HT + 1718 437 1 0.417 6.09326774103 4.8613693707 30.2743335554 # HT + 1719 438 30 -0.834 9.31342323066 6.73869225645 30.2743335554 # OT + 1720 438 1 0.417 10.0703735579 7.32457453307 30.2743335554 # HT + 1721 438 1 0.417 8.5564729034 7.32457453307 30.2743335554 # HT + 1722 439 38 1 9.31342323066 4.27548709408 32.7375387178 # SOD 1723 440 30 -0.834 6.85021806829 6.73869225645 32.7375387178 # OT 1724 440 1 0.417 7.60716839555 7.32457453307 32.7375387178 # HT 1725 440 1 0.417 6.09326774103 7.32457453307 32.7375387178 # HT @@ -1989,62 +1989,62 @@ Atoms # full 1885 494 30 -0.834 9.31342323066 21.5179232307 -4.21053871777 # OT 1886 494 1 0.417 10.0703735579 22.1038055073 -4.21053871777 # HT 1887 494 1 0.417 8.5564729034 22.1038055073 -4.21053871777 # HT - 1888 495 30 -0.834 9.31342323066 19.0547180683 -1.7473335554 # OT - 1889 495 1 0.417 10.0703735579 19.6406003449 -1.7473335554 # HT - 1890 495 1 0.417 8.5564729034 19.6406003449 -1.7473335554 # HT - 1891 496 30 -0.834 6.85021806829 21.5179232307 -1.7473335554 # OT - 1892 496 1 0.417 7.60716839555 22.1038055073 -1.7473335554 # HT - 1893 496 1 0.417 6.09326774103 22.1038055073 -1.7473335554 # HT - 1894 497 30 -0.834 6.85021806829 19.0547180683 0.715871606972 # OT - 1895 497 1 0.417 7.60716839555 19.6406003449 0.715871606972 # HT - 1896 497 1 0.417 6.09326774103 19.6406003449 0.715871606972 # HT - 1897 498 30 -0.834 9.31342323066 21.5179232307 0.715871606972 # OT - 1898 498 1 0.417 10.0703735579 22.1038055073 0.715871606972 # HT - 1899 498 1 0.417 8.5564729034 22.1038055073 0.715871606972 # HT - 1900 499 30 -0.834 9.31342323066 19.0547180683 3.17907676934 # OT - 1901 499 1 0.417 10.0703735579 19.6406003449 3.17907676934 # HT - 1902 499 1 0.417 8.5564729034 19.6406003449 3.17907676934 # HT - 1903 500 30 -0.834 6.85021806829 21.5179232307 3.17907676934 # OT - 1904 500 1 0.417 7.60716839555 22.1038055073 3.17907676934 # HT - 1905 500 1 0.417 6.09326774103 22.1038055073 3.17907676934 # HT - 1906 501 30 -0.834 9.31342323066 21.5179232307 5.64228193171 # OT - 1907 501 1 0.417 10.0703735579 22.1038055073 5.64228193171 # HT - 1908 501 1 0.417 8.5564729034 22.1038055073 5.64228193171 # HT - 1909 502 30 -0.834 9.31342323066 19.0547180683 8.10548709408 # OT - 1910 502 1 0.417 10.0703735579 19.6406003449 8.10548709408 # HT - 1911 502 1 0.417 8.5564729034 19.6406003449 8.10548709408 # HT - 1912 503 38 1 6.85021806829 21.5179232307 8.10548709408 # SOD - 1913 504 30 -0.834 6.85021806829 19.0547180683 10.5686922564 # OT - 1914 504 1 0.417 7.60716839555 19.6406003449 10.5686922564 # HT - 1915 504 1 0.417 6.09326774103 19.6406003449 10.5686922564 # HT - 1916 505 30 -0.834 9.31342323066 21.5179232307 10.5686922564 # OT - 1917 505 1 0.417 10.0703735579 22.1038055073 10.5686922564 # HT - 1918 505 1 0.417 8.5564729034 22.1038055073 10.5686922564 # HT - 1919 506 30 -0.834 9.31342323066 19.0547180683 13.0318974188 # OT - 1920 506 1 0.417 10.0703735579 19.6406003449 13.0318974188 # HT - 1921 506 1 0.417 8.5564729034 19.6406003449 13.0318974188 # HT - 1922 507 30 -0.834 6.85021806829 21.5179232307 13.0318974188 # OT - 1923 507 1 0.417 7.60716839555 22.1038055073 13.0318974188 # HT - 1924 507 1 0.417 6.09326774103 22.1038055073 13.0318974188 # HT - 1925 508 30 -0.834 6.85021806829 19.0547180683 15.4951025812 # OT - 1926 508 1 0.417 7.60716839555 19.6406003449 15.4951025812 # HT - 1927 508 1 0.417 6.09326774103 19.6406003449 15.4951025812 # HT - 1928 509 30 -0.834 9.31342323066 21.5179232307 15.4951025812 # OT - 1929 509 1 0.417 10.0703735579 22.1038055073 15.4951025812 # HT - 1930 509 1 0.417 8.5564729034 22.1038055073 15.4951025812 # HT - 1931 510 30 -0.834 9.31342323066 19.0547180683 17.9583077436 # OT - 1932 510 1 0.417 10.0703735579 19.6406003449 17.9583077436 # HT - 1933 510 1 0.417 8.5564729034 19.6406003449 17.9583077436 # HT - 1934 511 30 -0.834 6.85021806829 21.5179232307 17.9583077436 # OT - 1935 511 1 0.417 7.60716839555 22.1038055073 17.9583077436 # HT - 1936 511 1 0.417 6.09326774103 22.1038055073 17.9583077436 # HT - 1937 512 30 -0.834 6.85021806829 19.0547180683 20.4215129059 # OT - 1938 512 1 0.417 7.60716839555 19.6406003449 20.4215129059 # HT - 1939 512 1 0.417 6.09326774103 19.6406003449 20.4215129059 # HT - 1940 513 30 -0.834 9.31342323066 21.5179232307 20.4215129059 # OT - 1941 513 1 0.417 10.0703735579 22.1038055073 20.4215129059 # HT - 1942 513 1 0.417 8.5564729034 22.1038055073 20.4215129059 # HT - 1943 514 38 1 9.31342323066 19.0547180683 22.8847180683 # SOD + 1888 495 38 1 9.31342323066 19.0547180683 -1.7473335554 # SOD + 1889 496 30 -0.834 6.85021806829 21.5179232307 -1.7473335554 # OT + 1890 496 1 0.417 7.60716839555 22.1038055073 -1.7473335554 # HT + 1891 496 1 0.417 6.09326774103 22.1038055073 -1.7473335554 # HT + 1892 497 30 -0.834 6.85021806829 19.0547180683 0.715871606972 # OT + 1893 497 1 0.417 7.60716839555 19.6406003449 0.715871606972 # HT + 1894 497 1 0.417 6.09326774103 19.6406003449 0.715871606972 # HT + 1895 498 38 1 9.31342323066 21.5179232307 0.715871606972 # SOD + 1896 499 30 -0.834 9.31342323066 19.0547180683 3.17907676934 # OT + 1897 499 1 0.417 10.0703735579 19.6406003449 3.17907676934 # HT + 1898 499 1 0.417 8.5564729034 19.6406003449 3.17907676934 # HT + 1899 500 30 -0.834 6.85021806829 21.5179232307 3.17907676934 # OT + 1900 500 1 0.417 7.60716839555 22.1038055073 3.17907676934 # HT + 1901 500 1 0.417 6.09326774103 22.1038055073 3.17907676934 # HT + 1902 501 30 -0.834 9.31342323066 21.5179232307 5.64228193171 # OT + 1903 501 1 0.417 10.0703735579 22.1038055073 5.64228193171 # HT + 1904 501 1 0.417 8.5564729034 22.1038055073 5.64228193171 # HT + 1905 502 30 -0.834 9.31342323066 19.0547180683 8.10548709408 # OT + 1906 502 1 0.417 10.0703735579 19.6406003449 8.10548709408 # HT + 1907 502 1 0.417 8.5564729034 19.6406003449 8.10548709408 # HT + 1908 503 30 -0.834 6.85021806829 21.5179232307 8.10548709408 # OT + 1909 503 1 0.417 7.60716839555 22.1038055073 8.10548709408 # HT + 1910 503 1 0.417 6.09326774103 22.1038055073 8.10548709408 # HT + 1911 504 30 -0.834 6.85021806829 19.0547180683 10.5686922564 # OT + 1912 504 1 0.417 7.60716839555 19.6406003449 10.5686922564 # HT + 1913 504 1 0.417 6.09326774103 19.6406003449 10.5686922564 # HT + 1914 505 30 -0.834 9.31342323066 21.5179232307 10.5686922564 # OT + 1915 505 1 0.417 10.0703735579 22.1038055073 10.5686922564 # HT + 1916 505 1 0.417 8.5564729034 22.1038055073 10.5686922564 # HT + 1917 506 30 -0.834 9.31342323066 19.0547180683 13.0318974188 # OT + 1918 506 1 0.417 10.0703735579 19.6406003449 13.0318974188 # HT + 1919 506 1 0.417 8.5564729034 19.6406003449 13.0318974188 # HT + 1920 507 30 -0.834 6.85021806829 21.5179232307 13.0318974188 # OT + 1921 507 1 0.417 7.60716839555 22.1038055073 13.0318974188 # HT + 1922 507 1 0.417 6.09326774103 22.1038055073 13.0318974188 # HT + 1923 508 30 -0.834 6.85021806829 19.0547180683 15.4951025812 # OT + 1924 508 1 0.417 7.60716839555 19.6406003449 15.4951025812 # HT + 1925 508 1 0.417 6.09326774103 19.6406003449 15.4951025812 # HT + 1926 509 30 -0.834 9.31342323066 21.5179232307 15.4951025812 # OT + 1927 509 1 0.417 10.0703735579 22.1038055073 15.4951025812 # HT + 1928 509 1 0.417 8.5564729034 22.1038055073 15.4951025812 # HT + 1929 510 30 -0.834 9.31342323066 19.0547180683 17.9583077436 # OT + 1930 510 1 0.417 10.0703735579 19.6406003449 17.9583077436 # HT + 1931 510 1 0.417 8.5564729034 19.6406003449 17.9583077436 # HT + 1932 511 30 -0.834 6.85021806829 21.5179232307 17.9583077436 # OT + 1933 511 1 0.417 7.60716839555 22.1038055073 17.9583077436 # HT + 1934 511 1 0.417 6.09326774103 22.1038055073 17.9583077436 # HT + 1935 512 30 -0.834 6.85021806829 19.0547180683 20.4215129059 # OT + 1936 512 1 0.417 7.60716839555 19.6406003449 20.4215129059 # HT + 1937 512 1 0.417 6.09326774103 19.6406003449 20.4215129059 # HT + 1938 513 30 -0.834 9.31342323066 21.5179232307 20.4215129059 # OT + 1939 513 1 0.417 10.0703735579 22.1038055073 20.4215129059 # HT + 1940 513 1 0.417 8.5564729034 22.1038055073 20.4215129059 # HT + 1941 514 30 -0.834 9.31342323066 19.0547180683 22.8847180683 # OT + 1942 514 1 0.417 10.0703735579 19.6406003449 22.8847180683 # HT + 1943 514 1 0.417 8.5564729034 19.6406003449 22.8847180683 # HT 1944 515 30 -0.834 6.85021806829 21.5179232307 22.8847180683 # OT 1945 515 1 0.417 7.60716839555 22.1038055073 22.8847180683 # HT 1946 515 1 0.417 6.09326774103 22.1038055073 22.8847180683 # HT @@ -2057,13 +2057,13 @@ Atoms # full 1953 518 30 -0.834 9.31342323066 19.0547180683 27.811128393 # OT 1954 518 1 0.417 10.0703735579 19.6406003449 27.811128393 # HT 1955 518 1 0.417 8.5564729034 19.6406003449 27.811128393 # HT - 1956 519 38 1 6.85021806829 21.5179232307 27.811128393 # SOD - 1957 520 30 -0.834 6.85021806829 19.0547180683 30.2743335554 # OT - 1958 520 1 0.417 7.60716839555 19.6406003449 30.2743335554 # HT - 1959 520 1 0.417 6.09326774103 19.6406003449 30.2743335554 # HT - 1960 521 30 -0.834 9.31342323066 21.5179232307 30.2743335554 # OT - 1961 521 1 0.417 10.0703735579 22.1038055073 30.2743335554 # HT - 1962 521 1 0.417 8.5564729034 22.1038055073 30.2743335554 # HT + 1956 519 30 -0.834 6.85021806829 21.5179232307 27.811128393 # OT + 1957 519 1 0.417 7.60716839555 22.1038055073 27.811128393 # HT + 1958 519 1 0.417 6.09326774103 22.1038055073 27.811128393 # HT + 1959 520 30 -0.834 6.85021806829 19.0547180683 30.2743335554 # OT + 1960 520 1 0.417 7.60716839555 19.6406003449 30.2743335554 # HT + 1961 520 1 0.417 6.09326774103 19.6406003449 30.2743335554 # HT + 1962 521 38 1 9.31342323066 21.5179232307 30.2743335554 # SOD 1963 522 30 -0.834 9.31342323066 19.0547180683 32.7375387178 # OT 1964 522 1 0.417 10.0703735579 19.6406003449 32.7375387178 # HT 1965 522 1 0.417 8.5564729034 19.6406003449 32.7375387178 # HT @@ -2743,74 +2743,74 @@ Bonds 606 57 585 587 # HT OT 607 57 588 589 # HT OT 608 57 588 590 # HT OT - 609 57 592 593 # HT OT - 610 57 592 594 # HT OT - 611 57 595 596 # HT OT - 612 57 595 597 # HT OT - 613 57 598 599 # HT OT - 614 57 598 600 # HT OT - 615 57 601 602 # HT OT - 616 57 601 603 # HT OT - 617 57 604 605 # HT OT - 618 57 604 606 # HT OT - 619 57 607 608 # HT OT - 620 57 607 609 # HT OT - 621 57 610 611 # HT OT - 622 57 610 612 # HT OT - 623 57 613 614 # HT OT - 624 57 613 615 # HT OT - 625 57 616 617 # HT OT - 626 57 616 618 # HT OT - 627 57 619 620 # HT OT - 628 57 619 621 # HT OT - 629 57 622 623 # HT OT - 630 57 622 624 # HT OT - 631 57 625 626 # HT OT - 632 57 625 627 # HT OT - 633 57 628 629 # HT OT - 634 57 628 630 # HT OT - 635 57 631 632 # HT OT - 636 57 631 633 # HT OT - 637 57 634 635 # HT OT - 638 57 634 636 # HT OT - 639 57 637 638 # HT OT - 640 57 637 639 # HT OT - 641 57 640 641 # HT OT - 642 57 640 642 # HT OT - 643 57 643 644 # HT OT - 644 57 643 645 # HT OT - 645 57 646 647 # HT OT - 646 57 646 648 # HT OT - 647 57 649 650 # HT OT - 648 57 649 651 # HT OT - 649 57 652 653 # HT OT - 650 57 652 654 # HT OT - 651 57 655 656 # HT OT - 652 57 655 657 # HT OT - 653 57 658 659 # HT OT - 654 57 658 660 # HT OT - 655 57 661 662 # HT OT - 656 57 661 663 # HT OT - 657 57 664 665 # HT OT - 658 57 664 666 # HT OT - 659 57 667 668 # HT OT - 660 57 667 669 # HT OT - 661 57 670 671 # HT OT - 662 57 670 672 # HT OT - 663 57 673 674 # HT OT - 664 57 673 675 # HT OT - 665 57 676 677 # HT OT - 666 57 676 678 # HT OT - 667 57 679 680 # HT OT - 668 57 679 681 # HT OT - 669 57 682 683 # HT OT - 670 57 682 684 # HT OT - 671 57 685 686 # HT OT - 672 57 685 687 # HT OT - 673 57 688 689 # HT OT - 674 57 688 690 # HT OT - 675 57 691 692 # HT OT - 676 57 691 693 # HT OT + 609 57 591 592 # HT OT + 610 57 591 593 # HT OT + 611 57 594 595 # HT OT + 612 57 594 596 # HT OT + 613 57 597 598 # HT OT + 614 57 597 599 # HT OT + 615 57 600 601 # HT OT + 616 57 600 602 # HT OT + 617 57 603 604 # HT OT + 618 57 603 605 # HT OT + 619 57 606 607 # HT OT + 620 57 606 608 # HT OT + 621 57 609 610 # HT OT + 622 57 609 611 # HT OT + 623 57 612 613 # HT OT + 624 57 612 614 # HT OT + 625 57 615 616 # HT OT + 626 57 615 617 # HT OT + 627 57 618 619 # HT OT + 628 57 618 620 # HT OT + 629 57 621 622 # HT OT + 630 57 621 623 # HT OT + 631 57 624 625 # HT OT + 632 57 624 626 # HT OT + 633 57 627 628 # HT OT + 634 57 627 629 # HT OT + 635 57 630 631 # HT OT + 636 57 630 632 # HT OT + 637 57 633 634 # HT OT + 638 57 633 635 # HT OT + 639 57 636 637 # HT OT + 640 57 636 638 # HT OT + 641 57 639 640 # HT OT + 642 57 639 641 # HT OT + 643 57 642 643 # HT OT + 644 57 642 644 # HT OT + 645 57 645 646 # HT OT + 646 57 645 647 # HT OT + 647 57 648 649 # HT OT + 648 57 648 650 # HT OT + 649 57 651 652 # HT OT + 650 57 651 653 # HT OT + 651 57 654 655 # HT OT + 652 57 654 656 # HT OT + 653 57 657 658 # HT OT + 654 57 657 659 # HT OT + 655 57 660 661 # HT OT + 656 57 660 662 # HT OT + 657 57 663 664 # HT OT + 658 57 663 665 # HT OT + 659 57 666 667 # HT OT + 660 57 666 668 # HT OT + 661 57 669 670 # HT OT + 662 57 669 671 # HT OT + 663 57 672 673 # HT OT + 664 57 672 674 # HT OT + 665 57 675 676 # HT OT + 666 57 675 677 # HT OT + 667 57 678 679 # HT OT + 668 57 678 680 # HT OT + 669 57 681 682 # HT OT + 670 57 681 683 # HT OT + 671 57 684 685 # HT OT + 672 57 684 686 # HT OT + 673 57 687 688 # HT OT + 674 57 687 689 # HT OT + 675 57 690 691 # HT OT + 676 57 690 692 # HT OT 677 57 694 695 # HT OT 678 57 694 696 # HT OT 679 57 697 698 # HT OT @@ -2891,28 +2891,28 @@ Bonds 754 57 808 810 # HT OT 755 57 811 812 # HT OT 756 57 811 813 # HT OT - 757 57 814 815 # HT OT - 758 57 814 816 # HT OT - 759 57 817 818 # HT OT - 760 57 817 819 # HT OT - 761 57 820 821 # HT OT - 762 57 820 822 # HT OT - 763 57 823 824 # HT OT - 764 57 823 825 # HT OT - 765 57 826 827 # HT OT - 766 57 826 828 # HT OT - 767 57 829 830 # HT OT - 768 57 829 831 # HT OT - 769 57 832 833 # HT OT - 770 57 832 834 # HT OT - 771 57 835 836 # HT OT - 772 57 835 837 # HT OT - 773 57 838 839 # HT OT - 774 57 838 840 # HT OT - 775 57 841 842 # HT OT - 776 57 841 843 # HT OT - 777 57 844 845 # HT OT - 778 57 844 846 # HT OT + 757 57 815 816 # HT OT + 758 57 815 817 # HT OT + 759 57 818 819 # HT OT + 760 57 818 820 # HT OT + 761 57 821 822 # HT OT + 762 57 821 823 # HT OT + 763 57 824 825 # HT OT + 764 57 824 826 # HT OT + 765 57 827 828 # HT OT + 766 57 827 829 # HT OT + 767 57 830 831 # HT OT + 768 57 830 832 # HT OT + 769 57 833 834 # HT OT + 770 57 833 835 # HT OT + 771 57 836 837 # HT OT + 772 57 836 838 # HT OT + 773 57 839 840 # HT OT + 774 57 839 841 # HT OT + 775 57 842 843 # HT OT + 776 57 842 844 # HT OT + 777 57 845 846 # HT OT + 778 57 845 847 # HT OT 779 57 848 849 # HT OT 780 57 848 850 # HT OT 781 57 851 852 # HT OT @@ -2921,8 +2921,8 @@ Bonds 784 57 854 856 # HT OT 785 57 857 858 # HT OT 786 57 857 859 # HT OT - 787 57 861 862 # HT OT - 788 57 861 863 # HT OT + 787 57 860 861 # HT OT + 788 57 860 862 # HT OT 789 57 864 865 # HT OT 790 57 864 866 # HT OT 791 57 867 868 # HT OT @@ -2949,64 +2949,64 @@ Bonds 812 57 897 899 # HT OT 813 57 900 901 # HT OT 814 57 900 902 # HT OT - 815 57 904 905 # HT OT - 816 57 904 906 # HT OT - 817 57 907 908 # HT OT - 818 57 907 909 # HT OT - 819 57 910 911 # HT OT - 820 57 910 912 # HT OT - 821 57 913 914 # HT OT - 822 57 913 915 # HT OT - 823 57 916 917 # HT OT - 824 57 916 918 # HT OT - 825 57 919 920 # HT OT - 826 57 919 921 # HT OT - 827 57 922 923 # HT OT - 828 57 922 924 # HT OT - 829 57 925 926 # HT OT - 830 57 925 927 # HT OT - 831 57 928 929 # HT OT - 832 57 928 930 # HT OT - 833 57 931 932 # HT OT - 834 57 931 933 # HT OT - 835 57 934 935 # HT OT - 836 57 934 936 # HT OT - 837 57 937 938 # HT OT - 838 57 937 939 # HT OT - 839 57 940 941 # HT OT - 840 57 940 942 # HT OT - 841 57 943 944 # HT OT - 842 57 943 945 # HT OT - 843 57 946 947 # HT OT - 844 57 946 948 # HT OT - 845 57 949 950 # HT OT - 846 57 949 951 # HT OT - 847 57 952 953 # HT OT - 848 57 952 954 # HT OT - 849 57 955 956 # HT OT - 850 57 955 957 # HT OT - 851 57 959 960 # HT OT - 852 57 959 961 # HT OT - 853 57 962 963 # HT OT - 854 57 962 964 # HT OT - 855 57 965 966 # HT OT - 856 57 965 967 # HT OT - 857 57 968 969 # HT OT - 858 57 968 970 # HT OT - 859 57 971 972 # HT OT - 860 57 971 973 # HT OT - 861 57 974 975 # HT OT - 862 57 974 976 # HT OT - 863 57 977 978 # HT OT - 864 57 977 979 # HT OT - 865 57 980 981 # HT OT - 866 57 980 982 # HT OT - 867 57 983 984 # HT OT - 868 57 983 985 # HT OT - 869 57 986 987 # HT OT - 870 57 986 988 # HT OT - 871 57 989 990 # HT OT - 872 57 989 991 # HT OT + 815 57 903 904 # HT OT + 816 57 903 905 # HT OT + 817 57 906 907 # HT OT + 818 57 906 908 # HT OT + 819 57 909 910 # HT OT + 820 57 909 911 # HT OT + 821 57 912 913 # HT OT + 822 57 912 914 # HT OT + 823 57 915 916 # HT OT + 824 57 915 917 # HT OT + 825 57 918 919 # HT OT + 826 57 918 920 # HT OT + 827 57 921 922 # HT OT + 828 57 921 923 # HT OT + 829 57 924 925 # HT OT + 830 57 924 926 # HT OT + 831 57 927 928 # HT OT + 832 57 927 929 # HT OT + 833 57 930 931 # HT OT + 834 57 930 932 # HT OT + 835 57 933 934 # HT OT + 836 57 933 935 # HT OT + 837 57 936 937 # HT OT + 838 57 936 938 # HT OT + 839 57 939 940 # HT OT + 840 57 939 941 # HT OT + 841 57 942 943 # HT OT + 842 57 942 944 # HT OT + 843 57 945 946 # HT OT + 844 57 945 947 # HT OT + 845 57 948 949 # HT OT + 846 57 948 950 # HT OT + 847 57 951 952 # HT OT + 848 57 951 953 # HT OT + 849 57 954 955 # HT OT + 850 57 954 956 # HT OT + 851 57 957 958 # HT OT + 852 57 957 959 # HT OT + 853 57 960 961 # HT OT + 854 57 960 962 # HT OT + 855 57 963 964 # HT OT + 856 57 963 965 # HT OT + 857 57 966 967 # HT OT + 858 57 966 968 # HT OT + 859 57 969 970 # HT OT + 860 57 969 971 # HT OT + 861 57 972 973 # HT OT + 862 57 972 974 # HT OT + 863 57 975 976 # HT OT + 864 57 975 977 # HT OT + 865 57 978 979 # HT OT + 866 57 978 980 # HT OT + 867 57 981 982 # HT OT + 868 57 981 983 # HT OT + 869 57 985 986 # HT OT + 870 57 985 987 # HT OT + 871 57 988 989 # HT OT + 872 57 988 990 # HT OT 873 57 992 993 # HT OT 874 57 992 994 # HT OT 875 57 995 996 # HT OT @@ -3037,44 +3037,44 @@ Bonds 900 57 1031 1033 # HT OT 901 57 1034 1035 # HT OT 902 57 1034 1036 # HT OT - 903 57 1038 1039 # HT OT - 904 57 1038 1040 # HT OT - 905 57 1041 1042 # HT OT - 906 57 1041 1043 # HT OT - 907 57 1044 1045 # HT OT - 908 57 1044 1046 # HT OT - 909 57 1047 1048 # HT OT - 910 57 1047 1049 # HT OT - 911 57 1050 1051 # HT OT - 912 57 1050 1052 # HT OT - 913 57 1053 1054 # HT OT - 914 57 1053 1055 # HT OT - 915 57 1056 1057 # HT OT - 916 57 1056 1058 # HT OT - 917 57 1059 1060 # HT OT - 918 57 1059 1061 # HT OT - 919 57 1062 1063 # HT OT - 920 57 1062 1064 # HT OT - 921 57 1065 1066 # HT OT - 922 57 1065 1067 # HT OT - 923 57 1068 1069 # HT OT - 924 57 1068 1070 # HT OT - 925 57 1071 1072 # HT OT - 926 57 1071 1073 # HT OT - 927 57 1074 1075 # HT OT - 928 57 1074 1076 # HT OT - 929 57 1077 1078 # HT OT - 930 57 1077 1079 # HT OT - 931 57 1080 1081 # HT OT - 932 57 1080 1082 # HT OT - 933 57 1083 1084 # HT OT - 934 57 1083 1085 # HT OT - 935 57 1086 1087 # HT OT - 936 57 1086 1088 # HT OT - 937 57 1089 1090 # HT OT - 938 57 1089 1091 # HT OT - 939 57 1092 1093 # HT OT - 940 57 1092 1094 # HT OT + 903 57 1037 1038 # HT OT + 904 57 1037 1039 # HT OT + 905 57 1040 1041 # HT OT + 906 57 1040 1042 # HT OT + 907 57 1043 1044 # HT OT + 908 57 1043 1045 # HT OT + 909 57 1046 1047 # HT OT + 910 57 1046 1048 # HT OT + 911 57 1049 1050 # HT OT + 912 57 1049 1051 # HT OT + 913 57 1052 1053 # HT OT + 914 57 1052 1054 # HT OT + 915 57 1055 1056 # HT OT + 916 57 1055 1057 # HT OT + 917 57 1058 1059 # HT OT + 918 57 1058 1060 # HT OT + 919 57 1061 1062 # HT OT + 920 57 1061 1063 # HT OT + 921 57 1064 1065 # HT OT + 922 57 1064 1066 # HT OT + 923 57 1067 1068 # HT OT + 924 57 1067 1069 # HT OT + 925 57 1070 1071 # HT OT + 926 57 1070 1072 # HT OT + 927 57 1073 1074 # HT OT + 928 57 1073 1075 # HT OT + 929 57 1076 1077 # HT OT + 930 57 1076 1078 # HT OT + 931 57 1079 1080 # HT OT + 932 57 1079 1081 # HT OT + 933 57 1082 1083 # HT OT + 934 57 1082 1084 # HT OT + 935 57 1085 1086 # HT OT + 936 57 1085 1087 # HT OT + 937 57 1088 1089 # HT OT + 938 57 1088 1090 # HT OT + 939 57 1091 1092 # HT OT + 940 57 1091 1093 # HT OT 941 57 1095 1096 # HT OT 942 57 1095 1097 # HT OT 943 57 1098 1099 # HT OT @@ -3095,310 +3095,310 @@ Bonds 958 57 1119 1121 # HT OT 959 57 1122 1123 # HT OT 960 57 1122 1124 # HT OT - 961 57 1125 1126 # HT OT - 962 57 1125 1127 # HT OT - 963 57 1128 1129 # HT OT - 964 57 1128 1130 # HT OT - 965 57 1131 1132 # HT OT - 966 57 1131 1133 # HT OT - 967 57 1134 1135 # HT OT - 968 57 1134 1136 # HT OT - 969 57 1137 1138 # HT OT - 970 57 1137 1139 # HT OT - 971 57 1140 1141 # HT OT - 972 57 1140 1142 # HT OT - 973 57 1143 1144 # HT OT - 974 57 1143 1145 # HT OT - 975 57 1146 1147 # HT OT - 976 57 1146 1148 # HT OT - 977 57 1149 1150 # HT OT - 978 57 1149 1151 # HT OT - 979 57 1152 1153 # HT OT - 980 57 1152 1154 # HT OT - 981 57 1155 1156 # HT OT - 982 57 1155 1157 # HT OT - 983 57 1158 1159 # HT OT - 984 57 1158 1160 # HT OT - 985 57 1161 1162 # HT OT - 986 57 1161 1163 # HT OT - 987 57 1164 1165 # HT OT - 988 57 1164 1166 # HT OT - 989 57 1167 1168 # HT OT - 990 57 1167 1169 # HT OT - 991 57 1170 1171 # HT OT - 992 57 1170 1172 # HT OT - 993 57 1173 1174 # HT OT - 994 57 1173 1175 # HT OT - 995 57 1176 1177 # HT OT - 996 57 1176 1178 # HT OT - 997 57 1179 1180 # HT OT - 998 57 1179 1181 # HT OT - 999 57 1182 1183 # HT OT - 1000 57 1182 1184 # HT OT - 1001 57 1185 1186 # HT OT - 1002 57 1185 1187 # HT OT - 1003 57 1188 1189 # HT OT - 1004 57 1188 1190 # HT OT - 1005 57 1191 1192 # HT OT - 1006 57 1191 1193 # HT OT - 1007 57 1194 1195 # HT OT - 1008 57 1194 1196 # HT OT - 1009 57 1197 1198 # HT OT - 1010 57 1197 1199 # HT OT - 1011 57 1200 1201 # HT OT - 1012 57 1200 1202 # HT OT - 1013 57 1203 1204 # HT OT - 1014 57 1203 1205 # HT OT - 1015 57 1206 1207 # HT OT - 1016 57 1206 1208 # HT OT - 1017 57 1209 1210 # HT OT - 1018 57 1209 1211 # HT OT - 1019 57 1212 1213 # HT OT - 1020 57 1212 1214 # HT OT - 1021 57 1215 1216 # HT OT - 1022 57 1215 1217 # HT OT - 1023 57 1218 1219 # HT OT - 1024 57 1218 1220 # HT OT - 1025 57 1221 1222 # HT OT - 1026 57 1221 1223 # HT OT - 1027 57 1224 1225 # HT OT - 1028 57 1224 1226 # HT OT - 1029 57 1227 1228 # HT OT - 1030 57 1227 1229 # HT OT - 1031 57 1230 1231 # HT OT - 1032 57 1230 1232 # HT OT - 1033 57 1233 1234 # HT OT - 1034 57 1233 1235 # HT OT - 1035 57 1236 1237 # HT OT - 1036 57 1236 1238 # HT OT - 1037 57 1239 1240 # HT OT - 1038 57 1239 1241 # HT OT - 1039 57 1242 1243 # HT OT - 1040 57 1242 1244 # HT OT - 1041 57 1245 1246 # HT OT - 1042 57 1245 1247 # HT OT - 1043 57 1248 1249 # HT OT - 1044 57 1248 1250 # HT OT - 1045 57 1251 1252 # HT OT - 1046 57 1251 1253 # HT OT - 1047 57 1254 1255 # HT OT - 1048 57 1254 1256 # HT OT - 1049 57 1257 1258 # HT OT - 1050 57 1257 1259 # HT OT - 1051 57 1261 1262 # HT OT - 1052 57 1261 1263 # HT OT - 1053 57 1264 1265 # HT OT - 1054 57 1264 1266 # HT OT - 1055 57 1267 1268 # HT OT - 1056 57 1267 1269 # HT OT - 1057 57 1270 1271 # HT OT - 1058 57 1270 1272 # HT OT - 1059 57 1273 1274 # HT OT - 1060 57 1273 1275 # HT OT - 1061 57 1276 1277 # HT OT - 1062 57 1276 1278 # HT OT - 1063 57 1279 1280 # HT OT - 1064 57 1279 1281 # HT OT - 1065 57 1282 1283 # HT OT - 1066 57 1282 1284 # HT OT - 1067 57 1285 1286 # HT OT - 1068 57 1285 1287 # HT OT - 1069 57 1288 1289 # HT OT - 1070 57 1288 1290 # HT OT - 1071 57 1291 1292 # HT OT - 1072 57 1291 1293 # HT OT - 1073 57 1294 1295 # HT OT - 1074 57 1294 1296 # HT OT - 1075 57 1297 1298 # HT OT - 1076 57 1297 1299 # HT OT - 1077 57 1300 1301 # HT OT - 1078 57 1300 1302 # HT OT - 1079 57 1303 1304 # HT OT - 1080 57 1303 1305 # HT OT - 1081 57 1306 1307 # HT OT - 1082 57 1306 1308 # HT OT - 1083 57 1309 1310 # HT OT - 1084 57 1309 1311 # HT OT - 1085 57 1313 1314 # HT OT - 1086 57 1313 1315 # HT OT - 1087 57 1316 1317 # HT OT - 1088 57 1316 1318 # HT OT - 1089 57 1319 1320 # HT OT - 1090 57 1319 1321 # HT OT - 1091 57 1322 1323 # HT OT - 1092 57 1322 1324 # HT OT - 1093 57 1325 1326 # HT OT - 1094 57 1325 1327 # HT OT - 1095 57 1328 1329 # HT OT - 1096 57 1328 1330 # HT OT - 1097 57 1331 1332 # HT OT - 1098 57 1331 1333 # HT OT - 1099 57 1334 1335 # HT OT - 1100 57 1334 1336 # HT OT - 1101 57 1337 1338 # HT OT - 1102 57 1337 1339 # HT OT - 1103 57 1340 1341 # HT OT - 1104 57 1340 1342 # HT OT - 1105 57 1343 1344 # HT OT - 1106 57 1343 1345 # HT OT - 1107 57 1346 1347 # HT OT - 1108 57 1346 1348 # HT OT - 1109 57 1349 1350 # HT OT - 1110 57 1349 1351 # HT OT - 1111 57 1352 1353 # HT OT - 1112 57 1352 1354 # HT OT - 1113 57 1355 1356 # HT OT - 1114 57 1355 1357 # HT OT - 1115 57 1358 1359 # HT OT - 1116 57 1358 1360 # HT OT - 1117 57 1361 1362 # HT OT - 1118 57 1361 1363 # HT OT - 1119 57 1364 1365 # HT OT - 1120 57 1364 1366 # HT OT - 1121 57 1367 1368 # HT OT - 1122 57 1367 1369 # HT OT - 1123 57 1370 1371 # HT OT - 1124 57 1370 1372 # HT OT - 1125 57 1373 1374 # HT OT - 1126 57 1373 1375 # HT OT - 1127 57 1376 1377 # HT OT - 1128 57 1376 1378 # HT OT - 1129 57 1379 1380 # HT OT - 1130 57 1379 1381 # HT OT - 1131 57 1382 1383 # HT OT - 1132 57 1382 1384 # HT OT - 1133 57 1385 1386 # HT OT - 1134 57 1385 1387 # HT OT - 1135 57 1388 1389 # HT OT - 1136 57 1388 1390 # HT OT - 1137 57 1391 1392 # HT OT - 1138 57 1391 1393 # HT OT - 1139 57 1394 1395 # HT OT - 1140 57 1394 1396 # HT OT - 1141 57 1397 1398 # HT OT - 1142 57 1397 1399 # HT OT - 1143 57 1400 1401 # HT OT - 1144 57 1400 1402 # HT OT - 1145 57 1403 1404 # HT OT - 1146 57 1403 1405 # HT OT - 1147 57 1406 1407 # HT OT - 1148 57 1406 1408 # HT OT - 1149 57 1409 1410 # HT OT - 1150 57 1409 1411 # HT OT - 1151 57 1412 1413 # HT OT - 1152 57 1412 1414 # HT OT - 1153 57 1415 1416 # HT OT - 1154 57 1415 1417 # HT OT - 1155 57 1418 1419 # HT OT - 1156 57 1418 1420 # HT OT - 1157 57 1421 1422 # HT OT - 1158 57 1421 1423 # HT OT - 1159 57 1424 1425 # HT OT - 1160 57 1424 1426 # HT OT - 1161 57 1427 1428 # HT OT - 1162 57 1427 1429 # HT OT - 1163 57 1430 1431 # HT OT - 1164 57 1430 1432 # HT OT - 1165 57 1433 1434 # HT OT - 1166 57 1433 1435 # HT OT - 1167 57 1436 1437 # HT OT - 1168 57 1436 1438 # HT OT - 1169 57 1439 1440 # HT OT - 1170 57 1439 1441 # HT OT - 1171 57 1442 1443 # HT OT - 1172 57 1442 1444 # HT OT - 1173 57 1446 1447 # HT OT - 1174 57 1446 1448 # HT OT - 1175 57 1449 1450 # HT OT - 1176 57 1449 1451 # HT OT - 1177 57 1452 1453 # HT OT - 1178 57 1452 1454 # HT OT - 1179 57 1455 1456 # HT OT - 1180 57 1455 1457 # HT OT - 1181 57 1458 1459 # HT OT - 1182 57 1458 1460 # HT OT - 1183 57 1461 1462 # HT OT - 1184 57 1461 1463 # HT OT - 1185 57 1464 1465 # HT OT - 1186 57 1464 1466 # HT OT - 1187 57 1467 1468 # HT OT - 1188 57 1467 1469 # HT OT - 1189 57 1470 1471 # HT OT - 1190 57 1470 1472 # HT OT - 1191 57 1473 1474 # HT OT - 1192 57 1473 1475 # HT OT - 1193 57 1476 1477 # HT OT - 1194 57 1476 1478 # HT OT - 1195 57 1479 1480 # HT OT - 1196 57 1479 1481 # HT OT - 1197 57 1482 1483 # HT OT - 1198 57 1482 1484 # HT OT - 1199 57 1485 1486 # HT OT - 1200 57 1485 1487 # HT OT - 1201 57 1488 1489 # HT OT - 1202 57 1488 1490 # HT OT - 1203 57 1491 1492 # HT OT - 1204 57 1491 1493 # HT OT - 1205 57 1494 1495 # HT OT - 1206 57 1494 1496 # HT OT - 1207 57 1497 1498 # HT OT - 1208 57 1497 1499 # HT OT - 1209 57 1501 1502 # HT OT - 1210 57 1501 1503 # HT OT - 1211 57 1504 1505 # HT OT - 1212 57 1504 1506 # HT OT - 1213 57 1507 1508 # HT OT - 1214 57 1507 1509 # HT OT - 1215 57 1510 1511 # HT OT - 1216 57 1510 1512 # HT OT - 1217 57 1513 1514 # HT OT - 1218 57 1513 1515 # HT OT - 1219 57 1516 1517 # HT OT - 1220 57 1516 1518 # HT OT - 1221 57 1519 1520 # HT OT - 1222 57 1519 1521 # HT OT - 1223 57 1522 1523 # HT OT - 1224 57 1522 1524 # HT OT - 1225 57 1525 1526 # HT OT - 1226 57 1525 1527 # HT OT - 1227 57 1528 1529 # HT OT - 1228 57 1528 1530 # HT OT - 1229 57 1531 1532 # HT OT - 1230 57 1531 1533 # HT OT - 1231 57 1534 1535 # HT OT - 1232 57 1534 1536 # HT OT - 1233 57 1537 1538 # HT OT - 1234 57 1537 1539 # HT OT - 1235 57 1540 1541 # HT OT - 1236 57 1540 1542 # HT OT - 1237 57 1543 1544 # HT OT - 1238 57 1543 1545 # HT OT - 1239 57 1546 1547 # HT OT - 1240 57 1546 1548 # HT OT - 1241 57 1549 1550 # HT OT - 1242 57 1549 1551 # HT OT - 1243 57 1552 1553 # HT OT - 1244 57 1552 1554 # HT OT - 1245 57 1555 1556 # HT OT - 1246 57 1555 1557 # HT OT - 1247 57 1558 1559 # HT OT - 1248 57 1558 1560 # HT OT - 1249 57 1561 1562 # HT OT - 1250 57 1561 1563 # HT OT - 1251 57 1564 1565 # HT OT - 1252 57 1564 1566 # HT OT - 1253 57 1567 1568 # HT OT - 1254 57 1567 1569 # HT OT - 1255 57 1570 1571 # HT OT - 1256 57 1570 1572 # HT OT - 1257 57 1574 1575 # HT OT - 1258 57 1574 1576 # HT OT - 1259 57 1577 1578 # HT OT - 1260 57 1577 1579 # HT OT - 1261 57 1580 1581 # HT OT - 1262 57 1580 1582 # HT OT - 1263 57 1583 1584 # HT OT - 1264 57 1583 1585 # HT OT + 961 57 1126 1127 # HT OT + 962 57 1126 1128 # HT OT + 963 57 1129 1130 # HT OT + 964 57 1129 1131 # HT OT + 965 57 1132 1133 # HT OT + 966 57 1132 1134 # HT OT + 967 57 1135 1136 # HT OT + 968 57 1135 1137 # HT OT + 969 57 1138 1139 # HT OT + 970 57 1138 1140 # HT OT + 971 57 1141 1142 # HT OT + 972 57 1141 1143 # HT OT + 973 57 1144 1145 # HT OT + 974 57 1144 1146 # HT OT + 975 57 1147 1148 # HT OT + 976 57 1147 1149 # HT OT + 977 57 1150 1151 # HT OT + 978 57 1150 1152 # HT OT + 979 57 1153 1154 # HT OT + 980 57 1153 1155 # HT OT + 981 57 1156 1157 # HT OT + 982 57 1156 1158 # HT OT + 983 57 1159 1160 # HT OT + 984 57 1159 1161 # HT OT + 985 57 1162 1163 # HT OT + 986 57 1162 1164 # HT OT + 987 57 1165 1166 # HT OT + 988 57 1165 1167 # HT OT + 989 57 1168 1169 # HT OT + 990 57 1168 1170 # HT OT + 991 57 1171 1172 # HT OT + 992 57 1171 1173 # HT OT + 993 57 1174 1175 # HT OT + 994 57 1174 1176 # HT OT + 995 57 1177 1178 # HT OT + 996 57 1177 1179 # HT OT + 997 57 1180 1181 # HT OT + 998 57 1180 1182 # HT OT + 999 57 1183 1184 # HT OT + 1000 57 1183 1185 # HT OT + 1001 57 1186 1187 # HT OT + 1002 57 1186 1188 # HT OT + 1003 57 1189 1190 # HT OT + 1004 57 1189 1191 # HT OT + 1005 57 1192 1193 # HT OT + 1006 57 1192 1194 # HT OT + 1007 57 1195 1196 # HT OT + 1008 57 1195 1197 # HT OT + 1009 57 1198 1199 # HT OT + 1010 57 1198 1200 # HT OT + 1011 57 1201 1202 # HT OT + 1012 57 1201 1203 # HT OT + 1013 57 1205 1206 # HT OT + 1014 57 1205 1207 # HT OT + 1015 57 1208 1209 # HT OT + 1016 57 1208 1210 # HT OT + 1017 57 1211 1212 # HT OT + 1018 57 1211 1213 # HT OT + 1019 57 1214 1215 # HT OT + 1020 57 1214 1216 # HT OT + 1021 57 1218 1219 # HT OT + 1022 57 1218 1220 # HT OT + 1023 57 1221 1222 # HT OT + 1024 57 1221 1223 # HT OT + 1025 57 1224 1225 # HT OT + 1026 57 1224 1226 # HT OT + 1027 57 1227 1228 # HT OT + 1028 57 1227 1229 # HT OT + 1029 57 1230 1231 # HT OT + 1030 57 1230 1232 # HT OT + 1031 57 1233 1234 # HT OT + 1032 57 1233 1235 # HT OT + 1033 57 1236 1237 # HT OT + 1034 57 1236 1238 # HT OT + 1035 57 1239 1240 # HT OT + 1036 57 1239 1241 # HT OT + 1037 57 1242 1243 # HT OT + 1038 57 1242 1244 # HT OT + 1039 57 1245 1246 # HT OT + 1040 57 1245 1247 # HT OT + 1041 57 1248 1249 # HT OT + 1042 57 1248 1250 # HT OT + 1043 57 1251 1252 # HT OT + 1044 57 1251 1253 # HT OT + 1045 57 1254 1255 # HT OT + 1046 57 1254 1256 # HT OT + 1047 57 1257 1258 # HT OT + 1048 57 1257 1259 # HT OT + 1049 57 1260 1261 # HT OT + 1050 57 1260 1262 # HT OT + 1051 57 1263 1264 # HT OT + 1052 57 1263 1265 # HT OT + 1053 57 1266 1267 # HT OT + 1054 57 1266 1268 # HT OT + 1055 57 1269 1270 # HT OT + 1056 57 1269 1271 # HT OT + 1057 57 1272 1273 # HT OT + 1058 57 1272 1274 # HT OT + 1059 57 1275 1276 # HT OT + 1060 57 1275 1277 # HT OT + 1061 57 1278 1279 # HT OT + 1062 57 1278 1280 # HT OT + 1063 57 1281 1282 # HT OT + 1064 57 1281 1283 # HT OT + 1065 57 1284 1285 # HT OT + 1066 57 1284 1286 # HT OT + 1067 57 1287 1288 # HT OT + 1068 57 1287 1289 # HT OT + 1069 57 1290 1291 # HT OT + 1070 57 1290 1292 # HT OT + 1071 57 1293 1294 # HT OT + 1072 57 1293 1295 # HT OT + 1073 57 1296 1297 # HT OT + 1074 57 1296 1298 # HT OT + 1075 57 1299 1300 # HT OT + 1076 57 1299 1301 # HT OT + 1077 57 1302 1303 # HT OT + 1078 57 1302 1304 # HT OT + 1079 57 1305 1306 # HT OT + 1080 57 1305 1307 # HT OT + 1081 57 1308 1309 # HT OT + 1082 57 1308 1310 # HT OT + 1083 57 1311 1312 # HT OT + 1084 57 1311 1313 # HT OT + 1085 57 1314 1315 # HT OT + 1086 57 1314 1316 # HT OT + 1087 57 1317 1318 # HT OT + 1088 57 1317 1319 # HT OT + 1089 57 1320 1321 # HT OT + 1090 57 1320 1322 # HT OT + 1091 57 1323 1324 # HT OT + 1092 57 1323 1325 # HT OT + 1093 57 1326 1327 # HT OT + 1094 57 1326 1328 # HT OT + 1095 57 1329 1330 # HT OT + 1096 57 1329 1331 # HT OT + 1097 57 1332 1333 # HT OT + 1098 57 1332 1334 # HT OT + 1099 57 1335 1336 # HT OT + 1100 57 1335 1337 # HT OT + 1101 57 1338 1339 # HT OT + 1102 57 1338 1340 # HT OT + 1103 57 1341 1342 # HT OT + 1104 57 1341 1343 # HT OT + 1105 57 1344 1345 # HT OT + 1106 57 1344 1346 # HT OT + 1107 57 1348 1349 # HT OT + 1108 57 1348 1350 # HT OT + 1109 57 1351 1352 # HT OT + 1110 57 1351 1353 # HT OT + 1111 57 1354 1355 # HT OT + 1112 57 1354 1356 # HT OT + 1113 57 1357 1358 # HT OT + 1114 57 1357 1359 # HT OT + 1115 57 1360 1361 # HT OT + 1116 57 1360 1362 # HT OT + 1117 57 1363 1364 # HT OT + 1118 57 1363 1365 # HT OT + 1119 57 1366 1367 # HT OT + 1120 57 1366 1368 # HT OT + 1121 57 1369 1370 # HT OT + 1122 57 1369 1371 # HT OT + 1123 57 1372 1373 # HT OT + 1124 57 1372 1374 # HT OT + 1125 57 1375 1376 # HT OT + 1126 57 1375 1377 # HT OT + 1127 57 1378 1379 # HT OT + 1128 57 1378 1380 # HT OT + 1129 57 1381 1382 # HT OT + 1130 57 1381 1383 # HT OT + 1131 57 1384 1385 # HT OT + 1132 57 1384 1386 # HT OT + 1133 57 1387 1388 # HT OT + 1134 57 1387 1389 # HT OT + 1135 57 1390 1391 # HT OT + 1136 57 1390 1392 # HT OT + 1137 57 1393 1394 # HT OT + 1138 57 1393 1395 # HT OT + 1139 57 1396 1397 # HT OT + 1140 57 1396 1398 # HT OT + 1141 57 1399 1400 # HT OT + 1142 57 1399 1401 # HT OT + 1143 57 1402 1403 # HT OT + 1144 57 1402 1404 # HT OT + 1145 57 1405 1406 # HT OT + 1146 57 1405 1407 # HT OT + 1147 57 1408 1409 # HT OT + 1148 57 1408 1410 # HT OT + 1149 57 1411 1412 # HT OT + 1150 57 1411 1413 # HT OT + 1151 57 1414 1415 # HT OT + 1152 57 1414 1416 # HT OT + 1153 57 1417 1418 # HT OT + 1154 57 1417 1419 # HT OT + 1155 57 1420 1421 # HT OT + 1156 57 1420 1422 # HT OT + 1157 57 1423 1424 # HT OT + 1158 57 1423 1425 # HT OT + 1159 57 1426 1427 # HT OT + 1160 57 1426 1428 # HT OT + 1161 57 1429 1430 # HT OT + 1162 57 1429 1431 # HT OT + 1163 57 1432 1433 # HT OT + 1164 57 1432 1434 # HT OT + 1165 57 1435 1436 # HT OT + 1166 57 1435 1437 # HT OT + 1167 57 1439 1440 # HT OT + 1168 57 1439 1441 # HT OT + 1169 57 1442 1443 # HT OT + 1170 57 1442 1444 # HT OT + 1171 57 1445 1446 # HT OT + 1172 57 1445 1447 # HT OT + 1173 57 1449 1450 # HT OT + 1174 57 1449 1451 # HT OT + 1175 57 1452 1453 # HT OT + 1176 57 1452 1454 # HT OT + 1177 57 1455 1456 # HT OT + 1178 57 1455 1457 # HT OT + 1179 57 1458 1459 # HT OT + 1180 57 1458 1460 # HT OT + 1181 57 1461 1462 # HT OT + 1182 57 1461 1463 # HT OT + 1183 57 1464 1465 # HT OT + 1184 57 1464 1466 # HT OT + 1185 57 1467 1468 # HT OT + 1186 57 1467 1469 # HT OT + 1187 57 1470 1471 # HT OT + 1188 57 1470 1472 # HT OT + 1189 57 1473 1474 # HT OT + 1190 57 1473 1475 # HT OT + 1191 57 1476 1477 # HT OT + 1192 57 1476 1478 # HT OT + 1193 57 1479 1480 # HT OT + 1194 57 1479 1481 # HT OT + 1195 57 1482 1483 # HT OT + 1196 57 1482 1484 # HT OT + 1197 57 1485 1486 # HT OT + 1198 57 1485 1487 # HT OT + 1199 57 1488 1489 # HT OT + 1200 57 1488 1490 # HT OT + 1201 57 1491 1492 # HT OT + 1202 57 1491 1493 # HT OT + 1203 57 1494 1495 # HT OT + 1204 57 1494 1496 # HT OT + 1205 57 1497 1498 # HT OT + 1206 57 1497 1499 # HT OT + 1207 57 1500 1501 # HT OT + 1208 57 1500 1502 # HT OT + 1209 57 1503 1504 # HT OT + 1210 57 1503 1505 # HT OT + 1211 57 1506 1507 # HT OT + 1212 57 1506 1508 # HT OT + 1213 57 1509 1510 # HT OT + 1214 57 1509 1511 # HT OT + 1215 57 1512 1513 # HT OT + 1216 57 1512 1514 # HT OT + 1217 57 1515 1516 # HT OT + 1218 57 1515 1517 # HT OT + 1219 57 1518 1519 # HT OT + 1220 57 1518 1520 # HT OT + 1221 57 1521 1522 # HT OT + 1222 57 1521 1523 # HT OT + 1223 57 1524 1525 # HT OT + 1224 57 1524 1526 # HT OT + 1225 57 1527 1528 # HT OT + 1226 57 1527 1529 # HT OT + 1227 57 1530 1531 # HT OT + 1228 57 1530 1532 # HT OT + 1229 57 1533 1534 # HT OT + 1230 57 1533 1535 # HT OT + 1231 57 1536 1537 # HT OT + 1232 57 1536 1538 # HT OT + 1233 57 1539 1540 # HT OT + 1234 57 1539 1541 # HT OT + 1235 57 1542 1543 # HT OT + 1236 57 1542 1544 # HT OT + 1237 57 1545 1546 # HT OT + 1238 57 1545 1547 # HT OT + 1239 57 1548 1549 # HT OT + 1240 57 1548 1550 # HT OT + 1241 57 1551 1552 # HT OT + 1242 57 1551 1553 # HT OT + 1243 57 1554 1555 # HT OT + 1244 57 1554 1556 # HT OT + 1245 57 1557 1558 # HT OT + 1246 57 1557 1559 # HT OT + 1247 57 1560 1561 # HT OT + 1248 57 1560 1562 # HT OT + 1249 57 1563 1564 # HT OT + 1250 57 1563 1565 # HT OT + 1251 57 1566 1567 # HT OT + 1252 57 1566 1568 # HT OT + 1253 57 1569 1570 # HT OT + 1254 57 1569 1571 # HT OT + 1255 57 1572 1573 # HT OT + 1256 57 1572 1574 # HT OT + 1257 57 1575 1576 # HT OT + 1258 57 1575 1577 # HT OT + 1259 57 1578 1579 # HT OT + 1260 57 1578 1580 # HT OT + 1261 57 1581 1582 # HT OT + 1262 57 1581 1583 # HT OT + 1263 57 1584 1585 # HT OT + 1264 57 1584 1586 # HT OT 1265 57 1587 1588 # HT OT 1266 57 1587 1589 # HT OT 1267 57 1590 1591 # HT OT @@ -3441,54 +3441,54 @@ Bonds 1304 57 1644 1646 # HT OT 1305 57 1647 1648 # HT OT 1306 57 1647 1649 # HT OT - 1307 57 1651 1652 # HT OT - 1308 57 1651 1653 # HT OT - 1309 57 1654 1655 # HT OT - 1310 57 1654 1656 # HT OT - 1311 57 1657 1658 # HT OT - 1312 57 1657 1659 # HT OT - 1313 57 1660 1661 # HT OT - 1314 57 1660 1662 # HT OT - 1315 57 1663 1664 # HT OT - 1316 57 1663 1665 # HT OT - 1317 57 1666 1667 # HT OT - 1318 57 1666 1668 # HT OT - 1319 57 1669 1670 # HT OT - 1320 57 1669 1671 # HT OT - 1321 57 1672 1673 # HT OT - 1322 57 1672 1674 # HT OT - 1323 57 1675 1676 # HT OT - 1324 57 1675 1677 # HT OT - 1325 57 1678 1679 # HT OT - 1326 57 1678 1680 # HT OT - 1327 57 1681 1682 # HT OT - 1328 57 1681 1683 # HT OT - 1329 57 1684 1685 # HT OT - 1330 57 1684 1686 # HT OT - 1331 57 1687 1688 # HT OT - 1332 57 1687 1689 # HT OT - 1333 57 1690 1691 # HT OT - 1334 57 1690 1692 # HT OT - 1335 57 1693 1694 # HT OT - 1336 57 1693 1695 # HT OT - 1337 57 1696 1697 # HT OT - 1338 57 1696 1698 # HT OT - 1339 57 1699 1700 # HT OT - 1340 57 1699 1701 # HT OT - 1341 57 1702 1703 # HT OT - 1342 57 1702 1704 # HT OT - 1343 57 1705 1706 # HT OT - 1344 57 1705 1707 # HT OT - 1345 57 1708 1709 # HT OT - 1346 57 1708 1710 # HT OT - 1347 57 1711 1712 # HT OT - 1348 57 1711 1713 # HT OT - 1349 57 1714 1715 # HT OT - 1350 57 1714 1716 # HT OT - 1351 57 1717 1718 # HT OT - 1352 57 1717 1719 # HT OT - 1353 57 1720 1721 # HT OT - 1354 57 1720 1722 # HT OT + 1307 57 1650 1651 # HT OT + 1308 57 1650 1652 # HT OT + 1309 57 1653 1654 # HT OT + 1310 57 1653 1655 # HT OT + 1311 57 1656 1657 # HT OT + 1312 57 1656 1658 # HT OT + 1313 57 1659 1660 # HT OT + 1314 57 1659 1661 # HT OT + 1315 57 1662 1663 # HT OT + 1316 57 1662 1664 # HT OT + 1317 57 1665 1666 # HT OT + 1318 57 1665 1667 # HT OT + 1319 57 1668 1669 # HT OT + 1320 57 1668 1670 # HT OT + 1321 57 1671 1672 # HT OT + 1322 57 1671 1673 # HT OT + 1323 57 1674 1675 # HT OT + 1324 57 1674 1676 # HT OT + 1325 57 1677 1678 # HT OT + 1326 57 1677 1679 # HT OT + 1327 57 1680 1681 # HT OT + 1328 57 1680 1682 # HT OT + 1329 57 1683 1684 # HT OT + 1330 57 1683 1685 # HT OT + 1331 57 1686 1687 # HT OT + 1332 57 1686 1688 # HT OT + 1333 57 1689 1690 # HT OT + 1334 57 1689 1691 # HT OT + 1335 57 1692 1693 # HT OT + 1336 57 1692 1694 # HT OT + 1337 57 1695 1696 # HT OT + 1338 57 1695 1697 # HT OT + 1339 57 1698 1699 # HT OT + 1340 57 1698 1700 # HT OT + 1341 57 1701 1702 # HT OT + 1342 57 1701 1703 # HT OT + 1343 57 1704 1705 # HT OT + 1344 57 1704 1706 # HT OT + 1345 57 1707 1708 # HT OT + 1346 57 1707 1709 # HT OT + 1347 57 1710 1711 # HT OT + 1348 57 1710 1712 # HT OT + 1349 57 1713 1714 # HT OT + 1350 57 1713 1715 # HT OT + 1351 57 1716 1717 # HT OT + 1352 57 1716 1718 # HT OT + 1353 57 1719 1720 # HT OT + 1354 57 1719 1721 # HT OT 1355 57 1723 1724 # HT OT 1356 57 1723 1725 # HT OT 1357 57 1726 1727 # HT OT @@ -3599,42 +3599,42 @@ Bonds 1462 57 1882 1884 # HT OT 1463 57 1885 1886 # HT OT 1464 57 1885 1887 # HT OT - 1465 57 1888 1889 # HT OT - 1466 57 1888 1890 # HT OT - 1467 57 1891 1892 # HT OT - 1468 57 1891 1893 # HT OT - 1469 57 1894 1895 # HT OT - 1470 57 1894 1896 # HT OT - 1471 57 1897 1898 # HT OT - 1472 57 1897 1899 # HT OT - 1473 57 1900 1901 # HT OT - 1474 57 1900 1902 # HT OT - 1475 57 1903 1904 # HT OT - 1476 57 1903 1905 # HT OT - 1477 57 1906 1907 # HT OT - 1478 57 1906 1908 # HT OT - 1479 57 1909 1910 # HT OT - 1480 57 1909 1911 # HT OT - 1481 57 1913 1914 # HT OT - 1482 57 1913 1915 # HT OT - 1483 57 1916 1917 # HT OT - 1484 57 1916 1918 # HT OT - 1485 57 1919 1920 # HT OT - 1486 57 1919 1921 # HT OT - 1487 57 1922 1923 # HT OT - 1488 57 1922 1924 # HT OT - 1489 57 1925 1926 # HT OT - 1490 57 1925 1927 # HT OT - 1491 57 1928 1929 # HT OT - 1492 57 1928 1930 # HT OT - 1493 57 1931 1932 # HT OT - 1494 57 1931 1933 # HT OT - 1495 57 1934 1935 # HT OT - 1496 57 1934 1936 # HT OT - 1497 57 1937 1938 # HT OT - 1498 57 1937 1939 # HT OT - 1499 57 1940 1941 # HT OT - 1500 57 1940 1942 # HT OT + 1465 57 1889 1890 # HT OT + 1466 57 1889 1891 # HT OT + 1467 57 1892 1893 # HT OT + 1468 57 1892 1894 # HT OT + 1469 57 1896 1897 # HT OT + 1470 57 1896 1898 # HT OT + 1471 57 1899 1900 # HT OT + 1472 57 1899 1901 # HT OT + 1473 57 1902 1903 # HT OT + 1474 57 1902 1904 # HT OT + 1475 57 1905 1906 # HT OT + 1476 57 1905 1907 # HT OT + 1477 57 1908 1909 # HT OT + 1478 57 1908 1910 # HT OT + 1479 57 1911 1912 # HT OT + 1480 57 1911 1913 # HT OT + 1481 57 1914 1915 # HT OT + 1482 57 1914 1916 # HT OT + 1483 57 1917 1918 # HT OT + 1484 57 1917 1919 # HT OT + 1485 57 1920 1921 # HT OT + 1486 57 1920 1922 # HT OT + 1487 57 1923 1924 # HT OT + 1488 57 1923 1925 # HT OT + 1489 57 1926 1927 # HT OT + 1490 57 1926 1928 # HT OT + 1491 57 1929 1930 # HT OT + 1492 57 1929 1931 # HT OT + 1493 57 1932 1933 # HT OT + 1494 57 1932 1934 # HT OT + 1495 57 1935 1936 # HT OT + 1496 57 1935 1937 # HT OT + 1497 57 1938 1939 # HT OT + 1498 57 1938 1940 # HT OT + 1499 57 1941 1942 # HT OT + 1500 57 1941 1943 # HT OT 1501 57 1944 1945 # HT OT 1502 57 1944 1946 # HT OT 1503 57 1947 1948 # HT OT @@ -3643,10 +3643,10 @@ Bonds 1506 57 1950 1952 # HT OT 1507 57 1953 1954 # HT OT 1508 57 1953 1955 # HT OT - 1509 57 1957 1958 # HT OT - 1510 57 1957 1959 # HT OT - 1511 57 1960 1961 # HT OT - 1512 57 1960 1962 # HT OT + 1509 57 1956 1957 # HT OT + 1510 57 1956 1958 # HT OT + 1511 57 1959 1960 # HT OT + 1512 57 1959 1961 # HT OT 1513 57 1963 1964 # HT OT 1514 57 1963 1965 # HT OT 1515 57 1966 1967 # HT OT @@ -4810,40 +4810,40 @@ Angles 1035 93 583 582 584 # HT OT HT 1036 93 586 585 587 # HT OT HT 1037 93 589 588 590 # HT OT HT - 1038 93 593 592 594 # HT OT HT - 1039 93 596 595 597 # HT OT HT - 1040 93 599 598 600 # HT OT HT - 1041 93 602 601 603 # HT OT HT - 1042 93 605 604 606 # HT OT HT - 1043 93 608 607 609 # HT OT HT - 1044 93 611 610 612 # HT OT HT - 1045 93 614 613 615 # HT OT HT - 1046 93 617 616 618 # HT OT HT - 1047 93 620 619 621 # HT OT HT - 1048 93 623 622 624 # HT OT HT - 1049 93 626 625 627 # HT OT HT - 1050 93 629 628 630 # HT OT HT - 1051 93 632 631 633 # HT OT HT - 1052 93 635 634 636 # HT OT HT - 1053 93 638 637 639 # HT OT HT - 1054 93 641 640 642 # HT OT HT - 1055 93 644 643 645 # HT OT HT - 1056 93 647 646 648 # HT OT HT - 1057 93 650 649 651 # HT OT HT - 1058 93 653 652 654 # HT OT HT - 1059 93 656 655 657 # HT OT HT - 1060 93 659 658 660 # HT OT HT - 1061 93 662 661 663 # HT OT HT - 1062 93 665 664 666 # HT OT HT - 1063 93 668 667 669 # HT OT HT - 1064 93 671 670 672 # HT OT HT - 1065 93 674 673 675 # HT OT HT - 1066 93 677 676 678 # HT OT HT - 1067 93 680 679 681 # HT OT HT - 1068 93 683 682 684 # HT OT HT - 1069 93 686 685 687 # HT OT HT - 1070 93 689 688 690 # HT OT HT - 1071 93 692 691 693 # HT OT HT + 1038 93 592 591 593 # HT OT HT + 1039 93 595 594 596 # HT OT HT + 1040 93 598 597 599 # HT OT HT + 1041 93 601 600 602 # HT OT HT + 1042 93 604 603 605 # HT OT HT + 1043 93 607 606 608 # HT OT HT + 1044 93 610 609 611 # HT OT HT + 1045 93 613 612 614 # HT OT HT + 1046 93 616 615 617 # HT OT HT + 1047 93 619 618 620 # HT OT HT + 1048 93 622 621 623 # HT OT HT + 1049 93 625 624 626 # HT OT HT + 1050 93 628 627 629 # HT OT HT + 1051 93 631 630 632 # HT OT HT + 1052 93 634 633 635 # HT OT HT + 1053 93 637 636 638 # HT OT HT + 1054 93 640 639 641 # HT OT HT + 1055 93 643 642 644 # HT OT HT + 1056 93 646 645 647 # HT OT HT + 1057 93 649 648 650 # HT OT HT + 1058 93 652 651 653 # HT OT HT + 1059 93 655 654 656 # HT OT HT + 1060 93 658 657 659 # HT OT HT + 1061 93 661 660 662 # HT OT HT + 1062 93 664 663 665 # HT OT HT + 1063 93 667 666 668 # HT OT HT + 1064 93 670 669 671 # HT OT HT + 1065 93 673 672 674 # HT OT HT + 1066 93 676 675 677 # HT OT HT + 1067 93 679 678 680 # HT OT HT + 1068 93 682 681 683 # HT OT HT + 1069 93 685 684 686 # HT OT HT + 1070 93 688 687 689 # HT OT HT + 1071 93 691 690 692 # HT OT HT 1072 93 695 694 696 # HT OT HT 1073 93 698 697 699 # HT OT HT 1074 93 701 700 702 # HT OT HT @@ -4884,22 +4884,22 @@ Angles 1109 93 806 805 807 # HT OT HT 1110 93 809 808 810 # HT OT HT 1111 93 812 811 813 # HT OT HT - 1112 93 815 814 816 # HT OT HT - 1113 93 818 817 819 # HT OT HT - 1114 93 821 820 822 # HT OT HT - 1115 93 824 823 825 # HT OT HT - 1116 93 827 826 828 # HT OT HT - 1117 93 830 829 831 # HT OT HT - 1118 93 833 832 834 # HT OT HT - 1119 93 836 835 837 # HT OT HT - 1120 93 839 838 840 # HT OT HT - 1121 93 842 841 843 # HT OT HT - 1122 93 845 844 846 # HT OT HT + 1112 93 816 815 817 # HT OT HT + 1113 93 819 818 820 # HT OT HT + 1114 93 822 821 823 # HT OT HT + 1115 93 825 824 826 # HT OT HT + 1116 93 828 827 829 # HT OT HT + 1117 93 831 830 832 # HT OT HT + 1118 93 834 833 835 # HT OT HT + 1119 93 837 836 838 # HT OT HT + 1120 93 840 839 841 # HT OT HT + 1121 93 843 842 844 # HT OT HT + 1122 93 846 845 847 # HT OT HT 1123 93 849 848 850 # HT OT HT 1124 93 852 851 853 # HT OT HT 1125 93 855 854 856 # HT OT HT 1126 93 858 857 859 # HT OT HT - 1127 93 862 861 863 # HT OT HT + 1127 93 861 860 862 # HT OT HT 1128 93 865 864 866 # HT OT HT 1129 93 868 867 869 # HT OT HT 1130 93 871 870 872 # HT OT HT @@ -4913,35 +4913,35 @@ Angles 1138 93 895 894 896 # HT OT HT 1139 93 898 897 899 # HT OT HT 1140 93 901 900 902 # HT OT HT - 1141 93 905 904 906 # HT OT HT - 1142 93 908 907 909 # HT OT HT - 1143 93 911 910 912 # HT OT HT - 1144 93 914 913 915 # HT OT HT - 1145 93 917 916 918 # HT OT HT - 1146 93 920 919 921 # HT OT HT - 1147 93 923 922 924 # HT OT HT - 1148 93 926 925 927 # HT OT HT - 1149 93 929 928 930 # HT OT HT - 1150 93 932 931 933 # HT OT HT - 1151 93 935 934 936 # HT OT HT - 1152 93 938 937 939 # HT OT HT - 1153 93 941 940 942 # HT OT HT - 1154 93 944 943 945 # HT OT HT - 1155 93 947 946 948 # HT OT HT - 1156 93 950 949 951 # HT OT HT - 1157 93 953 952 954 # HT OT HT - 1158 93 956 955 957 # HT OT HT - 1159 93 960 959 961 # HT OT HT - 1160 93 963 962 964 # HT OT HT - 1161 93 966 965 967 # HT OT HT - 1162 93 969 968 970 # HT OT HT - 1163 93 972 971 973 # HT OT HT - 1164 93 975 974 976 # HT OT HT - 1165 93 978 977 979 # HT OT HT - 1166 93 981 980 982 # HT OT HT - 1167 93 984 983 985 # HT OT HT - 1168 93 987 986 988 # HT OT HT - 1169 93 990 989 991 # HT OT HT + 1141 93 904 903 905 # HT OT HT + 1142 93 907 906 908 # HT OT HT + 1143 93 910 909 911 # HT OT HT + 1144 93 913 912 914 # HT OT HT + 1145 93 916 915 917 # HT OT HT + 1146 93 919 918 920 # HT OT HT + 1147 93 922 921 923 # HT OT HT + 1148 93 925 924 926 # HT OT HT + 1149 93 928 927 929 # HT OT HT + 1150 93 931 930 932 # HT OT HT + 1151 93 934 933 935 # HT OT HT + 1152 93 937 936 938 # HT OT HT + 1153 93 940 939 941 # HT OT HT + 1154 93 943 942 944 # HT OT HT + 1155 93 946 945 947 # HT OT HT + 1156 93 949 948 950 # HT OT HT + 1157 93 952 951 953 # HT OT HT + 1158 93 955 954 956 # HT OT HT + 1159 93 958 957 959 # HT OT HT + 1160 93 961 960 962 # HT OT HT + 1161 93 964 963 965 # HT OT HT + 1162 93 967 966 968 # HT OT HT + 1163 93 970 969 971 # HT OT HT + 1164 93 973 972 974 # HT OT HT + 1165 93 976 975 977 # HT OT HT + 1166 93 979 978 980 # HT OT HT + 1167 93 982 981 983 # HT OT HT + 1168 93 986 985 987 # HT OT HT + 1169 93 989 988 990 # HT OT HT 1170 93 993 992 994 # HT OT HT 1171 93 996 995 997 # HT OT HT 1172 93 999 998 1000 # HT OT HT @@ -4957,25 +4957,25 @@ Angles 1182 93 1029 1028 1030 # HT OT HT 1183 93 1032 1031 1033 # HT OT HT 1184 93 1035 1034 1036 # HT OT HT - 1185 93 1039 1038 1040 # HT OT HT - 1186 93 1042 1041 1043 # HT OT HT - 1187 93 1045 1044 1046 # HT OT HT - 1188 93 1048 1047 1049 # HT OT HT - 1189 93 1051 1050 1052 # HT OT HT - 1190 93 1054 1053 1055 # HT OT HT - 1191 93 1057 1056 1058 # HT OT HT - 1192 93 1060 1059 1061 # HT OT HT - 1193 93 1063 1062 1064 # HT OT HT - 1194 93 1066 1065 1067 # HT OT HT - 1195 93 1069 1068 1070 # HT OT HT - 1196 93 1072 1071 1073 # HT OT HT - 1197 93 1075 1074 1076 # HT OT HT - 1198 93 1078 1077 1079 # HT OT HT - 1199 93 1081 1080 1082 # HT OT HT - 1200 93 1084 1083 1085 # HT OT HT - 1201 93 1087 1086 1088 # HT OT HT - 1202 93 1090 1089 1091 # HT OT HT - 1203 93 1093 1092 1094 # HT OT HT + 1185 93 1038 1037 1039 # HT OT HT + 1186 93 1041 1040 1042 # HT OT HT + 1187 93 1044 1043 1045 # HT OT HT + 1188 93 1047 1046 1048 # HT OT HT + 1189 93 1050 1049 1051 # HT OT HT + 1190 93 1053 1052 1054 # HT OT HT + 1191 93 1056 1055 1057 # HT OT HT + 1192 93 1059 1058 1060 # HT OT HT + 1193 93 1062 1061 1063 # HT OT HT + 1194 93 1065 1064 1066 # HT OT HT + 1195 93 1068 1067 1069 # HT OT HT + 1196 93 1071 1070 1072 # HT OT HT + 1197 93 1074 1073 1075 # HT OT HT + 1198 93 1077 1076 1078 # HT OT HT + 1199 93 1080 1079 1081 # HT OT HT + 1200 93 1083 1082 1084 # HT OT HT + 1201 93 1086 1085 1087 # HT OT HT + 1202 93 1089 1088 1090 # HT OT HT + 1203 93 1092 1091 1093 # HT OT HT 1204 93 1096 1095 1097 # HT OT HT 1205 93 1099 1098 1100 # HT OT HT 1206 93 1102 1101 1103 # HT OT HT @@ -4986,158 +4986,158 @@ Angles 1211 93 1117 1116 1118 # HT OT HT 1212 93 1120 1119 1121 # HT OT HT 1213 93 1123 1122 1124 # HT OT HT - 1214 93 1126 1125 1127 # HT OT HT - 1215 93 1129 1128 1130 # HT OT HT - 1216 93 1132 1131 1133 # HT OT HT - 1217 93 1135 1134 1136 # HT OT HT - 1218 93 1138 1137 1139 # HT OT HT - 1219 93 1141 1140 1142 # HT OT HT - 1220 93 1144 1143 1145 # HT OT HT - 1221 93 1147 1146 1148 # HT OT HT - 1222 93 1150 1149 1151 # HT OT HT - 1223 93 1153 1152 1154 # HT OT HT - 1224 93 1156 1155 1157 # HT OT HT - 1225 93 1159 1158 1160 # HT OT HT - 1226 93 1162 1161 1163 # HT OT HT - 1227 93 1165 1164 1166 # HT OT HT - 1228 93 1168 1167 1169 # HT OT HT - 1229 93 1171 1170 1172 # HT OT HT - 1230 93 1174 1173 1175 # HT OT HT - 1231 93 1177 1176 1178 # HT OT HT - 1232 93 1180 1179 1181 # HT OT HT - 1233 93 1183 1182 1184 # HT OT HT - 1234 93 1186 1185 1187 # HT OT HT - 1235 93 1189 1188 1190 # HT OT HT - 1236 93 1192 1191 1193 # HT OT HT - 1237 93 1195 1194 1196 # HT OT HT - 1238 93 1198 1197 1199 # HT OT HT - 1239 93 1201 1200 1202 # HT OT HT - 1240 93 1204 1203 1205 # HT OT HT - 1241 93 1207 1206 1208 # HT OT HT - 1242 93 1210 1209 1211 # HT OT HT - 1243 93 1213 1212 1214 # HT OT HT - 1244 93 1216 1215 1217 # HT OT HT - 1245 93 1219 1218 1220 # HT OT HT - 1246 93 1222 1221 1223 # HT OT HT - 1247 93 1225 1224 1226 # HT OT HT - 1248 93 1228 1227 1229 # HT OT HT - 1249 93 1231 1230 1232 # HT OT HT - 1250 93 1234 1233 1235 # HT OT HT - 1251 93 1237 1236 1238 # HT OT HT - 1252 93 1240 1239 1241 # HT OT HT - 1253 93 1243 1242 1244 # HT OT HT - 1254 93 1246 1245 1247 # HT OT HT - 1255 93 1249 1248 1250 # HT OT HT - 1256 93 1252 1251 1253 # HT OT HT - 1257 93 1255 1254 1256 # HT OT HT - 1258 93 1258 1257 1259 # HT OT HT - 1259 93 1262 1261 1263 # HT OT HT - 1260 93 1265 1264 1266 # HT OT HT - 1261 93 1268 1267 1269 # HT OT HT - 1262 93 1271 1270 1272 # HT OT HT - 1263 93 1274 1273 1275 # HT OT HT - 1264 93 1277 1276 1278 # HT OT HT - 1265 93 1280 1279 1281 # HT OT HT - 1266 93 1283 1282 1284 # HT OT HT - 1267 93 1286 1285 1287 # HT OT HT - 1268 93 1289 1288 1290 # HT OT HT - 1269 93 1292 1291 1293 # HT OT HT - 1270 93 1295 1294 1296 # HT OT HT - 1271 93 1298 1297 1299 # HT OT HT - 1272 93 1301 1300 1302 # HT OT HT - 1273 93 1304 1303 1305 # HT OT HT - 1274 93 1307 1306 1308 # HT OT HT - 1275 93 1310 1309 1311 # HT OT HT - 1276 93 1314 1313 1315 # HT OT HT - 1277 93 1317 1316 1318 # HT OT HT - 1278 93 1320 1319 1321 # HT OT HT - 1279 93 1323 1322 1324 # HT OT HT - 1280 93 1326 1325 1327 # HT OT HT - 1281 93 1329 1328 1330 # HT OT HT - 1282 93 1332 1331 1333 # HT OT HT - 1283 93 1335 1334 1336 # HT OT HT - 1284 93 1338 1337 1339 # HT OT HT - 1285 93 1341 1340 1342 # HT OT HT - 1286 93 1344 1343 1345 # HT OT HT - 1287 93 1347 1346 1348 # HT OT HT - 1288 93 1350 1349 1351 # HT OT HT - 1289 93 1353 1352 1354 # HT OT HT - 1290 93 1356 1355 1357 # HT OT HT - 1291 93 1359 1358 1360 # HT OT HT - 1292 93 1362 1361 1363 # HT OT HT - 1293 93 1365 1364 1366 # HT OT HT - 1294 93 1368 1367 1369 # HT OT HT - 1295 93 1371 1370 1372 # HT OT HT - 1296 93 1374 1373 1375 # HT OT HT - 1297 93 1377 1376 1378 # HT OT HT - 1298 93 1380 1379 1381 # HT OT HT - 1299 93 1383 1382 1384 # HT OT HT - 1300 93 1386 1385 1387 # HT OT HT - 1301 93 1389 1388 1390 # HT OT HT - 1302 93 1392 1391 1393 # HT OT HT - 1303 93 1395 1394 1396 # HT OT HT - 1304 93 1398 1397 1399 # HT OT HT - 1305 93 1401 1400 1402 # HT OT HT - 1306 93 1404 1403 1405 # HT OT HT - 1307 93 1407 1406 1408 # HT OT HT - 1308 93 1410 1409 1411 # HT OT HT - 1309 93 1413 1412 1414 # HT OT HT - 1310 93 1416 1415 1417 # HT OT HT - 1311 93 1419 1418 1420 # HT OT HT - 1312 93 1422 1421 1423 # HT OT HT - 1313 93 1425 1424 1426 # HT OT HT - 1314 93 1428 1427 1429 # HT OT HT - 1315 93 1431 1430 1432 # HT OT HT - 1316 93 1434 1433 1435 # HT OT HT - 1317 93 1437 1436 1438 # HT OT HT - 1318 93 1440 1439 1441 # HT OT HT - 1319 93 1443 1442 1444 # HT OT HT - 1320 93 1447 1446 1448 # HT OT HT - 1321 93 1450 1449 1451 # HT OT HT - 1322 93 1453 1452 1454 # HT OT HT - 1323 93 1456 1455 1457 # HT OT HT - 1324 93 1459 1458 1460 # HT OT HT - 1325 93 1462 1461 1463 # HT OT HT - 1326 93 1465 1464 1466 # HT OT HT - 1327 93 1468 1467 1469 # HT OT HT - 1328 93 1471 1470 1472 # HT OT HT - 1329 93 1474 1473 1475 # HT OT HT - 1330 93 1477 1476 1478 # HT OT HT - 1331 93 1480 1479 1481 # HT OT HT - 1332 93 1483 1482 1484 # HT OT HT - 1333 93 1486 1485 1487 # HT OT HT - 1334 93 1489 1488 1490 # HT OT HT - 1335 93 1492 1491 1493 # HT OT HT - 1336 93 1495 1494 1496 # HT OT HT - 1337 93 1498 1497 1499 # HT OT HT - 1338 93 1502 1501 1503 # HT OT HT - 1339 93 1505 1504 1506 # HT OT HT - 1340 93 1508 1507 1509 # HT OT HT - 1341 93 1511 1510 1512 # HT OT HT - 1342 93 1514 1513 1515 # HT OT HT - 1343 93 1517 1516 1518 # HT OT HT - 1344 93 1520 1519 1521 # HT OT HT - 1345 93 1523 1522 1524 # HT OT HT - 1346 93 1526 1525 1527 # HT OT HT - 1347 93 1529 1528 1530 # HT OT HT - 1348 93 1532 1531 1533 # HT OT HT - 1349 93 1535 1534 1536 # HT OT HT - 1350 93 1538 1537 1539 # HT OT HT - 1351 93 1541 1540 1542 # HT OT HT - 1352 93 1544 1543 1545 # HT OT HT - 1353 93 1547 1546 1548 # HT OT HT - 1354 93 1550 1549 1551 # HT OT HT - 1355 93 1553 1552 1554 # HT OT HT - 1356 93 1556 1555 1557 # HT OT HT - 1357 93 1559 1558 1560 # HT OT HT - 1358 93 1562 1561 1563 # HT OT HT - 1359 93 1565 1564 1566 # HT OT HT - 1360 93 1568 1567 1569 # HT OT HT - 1361 93 1571 1570 1572 # HT OT HT - 1362 93 1575 1574 1576 # HT OT HT - 1363 93 1578 1577 1579 # HT OT HT - 1364 93 1581 1580 1582 # HT OT HT - 1365 93 1584 1583 1585 # HT OT HT + 1214 93 1127 1126 1128 # HT OT HT + 1215 93 1130 1129 1131 # HT OT HT + 1216 93 1133 1132 1134 # HT OT HT + 1217 93 1136 1135 1137 # HT OT HT + 1218 93 1139 1138 1140 # HT OT HT + 1219 93 1142 1141 1143 # HT OT HT + 1220 93 1145 1144 1146 # HT OT HT + 1221 93 1148 1147 1149 # HT OT HT + 1222 93 1151 1150 1152 # HT OT HT + 1223 93 1154 1153 1155 # HT OT HT + 1224 93 1157 1156 1158 # HT OT HT + 1225 93 1160 1159 1161 # HT OT HT + 1226 93 1163 1162 1164 # HT OT HT + 1227 93 1166 1165 1167 # HT OT HT + 1228 93 1169 1168 1170 # HT OT HT + 1229 93 1172 1171 1173 # HT OT HT + 1230 93 1175 1174 1176 # HT OT HT + 1231 93 1178 1177 1179 # HT OT HT + 1232 93 1181 1180 1182 # HT OT HT + 1233 93 1184 1183 1185 # HT OT HT + 1234 93 1187 1186 1188 # HT OT HT + 1235 93 1190 1189 1191 # HT OT HT + 1236 93 1193 1192 1194 # HT OT HT + 1237 93 1196 1195 1197 # HT OT HT + 1238 93 1199 1198 1200 # HT OT HT + 1239 93 1202 1201 1203 # HT OT HT + 1240 93 1206 1205 1207 # HT OT HT + 1241 93 1209 1208 1210 # HT OT HT + 1242 93 1212 1211 1213 # HT OT HT + 1243 93 1215 1214 1216 # HT OT HT + 1244 93 1219 1218 1220 # HT OT HT + 1245 93 1222 1221 1223 # HT OT HT + 1246 93 1225 1224 1226 # HT OT HT + 1247 93 1228 1227 1229 # HT OT HT + 1248 93 1231 1230 1232 # HT OT HT + 1249 93 1234 1233 1235 # HT OT HT + 1250 93 1237 1236 1238 # HT OT HT + 1251 93 1240 1239 1241 # HT OT HT + 1252 93 1243 1242 1244 # HT OT HT + 1253 93 1246 1245 1247 # HT OT HT + 1254 93 1249 1248 1250 # HT OT HT + 1255 93 1252 1251 1253 # HT OT HT + 1256 93 1255 1254 1256 # HT OT HT + 1257 93 1258 1257 1259 # HT OT HT + 1258 93 1261 1260 1262 # HT OT HT + 1259 93 1264 1263 1265 # HT OT HT + 1260 93 1267 1266 1268 # HT OT HT + 1261 93 1270 1269 1271 # HT OT HT + 1262 93 1273 1272 1274 # HT OT HT + 1263 93 1276 1275 1277 # HT OT HT + 1264 93 1279 1278 1280 # HT OT HT + 1265 93 1282 1281 1283 # HT OT HT + 1266 93 1285 1284 1286 # HT OT HT + 1267 93 1288 1287 1289 # HT OT HT + 1268 93 1291 1290 1292 # HT OT HT + 1269 93 1294 1293 1295 # HT OT HT + 1270 93 1297 1296 1298 # HT OT HT + 1271 93 1300 1299 1301 # HT OT HT + 1272 93 1303 1302 1304 # HT OT HT + 1273 93 1306 1305 1307 # HT OT HT + 1274 93 1309 1308 1310 # HT OT HT + 1275 93 1312 1311 1313 # HT OT HT + 1276 93 1315 1314 1316 # HT OT HT + 1277 93 1318 1317 1319 # HT OT HT + 1278 93 1321 1320 1322 # HT OT HT + 1279 93 1324 1323 1325 # HT OT HT + 1280 93 1327 1326 1328 # HT OT HT + 1281 93 1330 1329 1331 # HT OT HT + 1282 93 1333 1332 1334 # HT OT HT + 1283 93 1336 1335 1337 # HT OT HT + 1284 93 1339 1338 1340 # HT OT HT + 1285 93 1342 1341 1343 # HT OT HT + 1286 93 1345 1344 1346 # HT OT HT + 1287 93 1349 1348 1350 # HT OT HT + 1288 93 1352 1351 1353 # HT OT HT + 1289 93 1355 1354 1356 # HT OT HT + 1290 93 1358 1357 1359 # HT OT HT + 1291 93 1361 1360 1362 # HT OT HT + 1292 93 1364 1363 1365 # HT OT HT + 1293 93 1367 1366 1368 # HT OT HT + 1294 93 1370 1369 1371 # HT OT HT + 1295 93 1373 1372 1374 # HT OT HT + 1296 93 1376 1375 1377 # HT OT HT + 1297 93 1379 1378 1380 # HT OT HT + 1298 93 1382 1381 1383 # HT OT HT + 1299 93 1385 1384 1386 # HT OT HT + 1300 93 1388 1387 1389 # HT OT HT + 1301 93 1391 1390 1392 # HT OT HT + 1302 93 1394 1393 1395 # HT OT HT + 1303 93 1397 1396 1398 # HT OT HT + 1304 93 1400 1399 1401 # HT OT HT + 1305 93 1403 1402 1404 # HT OT HT + 1306 93 1406 1405 1407 # HT OT HT + 1307 93 1409 1408 1410 # HT OT HT + 1308 93 1412 1411 1413 # HT OT HT + 1309 93 1415 1414 1416 # HT OT HT + 1310 93 1418 1417 1419 # HT OT HT + 1311 93 1421 1420 1422 # HT OT HT + 1312 93 1424 1423 1425 # HT OT HT + 1313 93 1427 1426 1428 # HT OT HT + 1314 93 1430 1429 1431 # HT OT HT + 1315 93 1433 1432 1434 # HT OT HT + 1316 93 1436 1435 1437 # HT OT HT + 1317 93 1440 1439 1441 # HT OT HT + 1318 93 1443 1442 1444 # HT OT HT + 1319 93 1446 1445 1447 # HT OT HT + 1320 93 1450 1449 1451 # HT OT HT + 1321 93 1453 1452 1454 # HT OT HT + 1322 93 1456 1455 1457 # HT OT HT + 1323 93 1459 1458 1460 # HT OT HT + 1324 93 1462 1461 1463 # HT OT HT + 1325 93 1465 1464 1466 # HT OT HT + 1326 93 1468 1467 1469 # HT OT HT + 1327 93 1471 1470 1472 # HT OT HT + 1328 93 1474 1473 1475 # HT OT HT + 1329 93 1477 1476 1478 # HT OT HT + 1330 93 1480 1479 1481 # HT OT HT + 1331 93 1483 1482 1484 # HT OT HT + 1332 93 1486 1485 1487 # HT OT HT + 1333 93 1489 1488 1490 # HT OT HT + 1334 93 1492 1491 1493 # HT OT HT + 1335 93 1495 1494 1496 # HT OT HT + 1336 93 1498 1497 1499 # HT OT HT + 1337 93 1501 1500 1502 # HT OT HT + 1338 93 1504 1503 1505 # HT OT HT + 1339 93 1507 1506 1508 # HT OT HT + 1340 93 1510 1509 1511 # HT OT HT + 1341 93 1513 1512 1514 # HT OT HT + 1342 93 1516 1515 1517 # HT OT HT + 1343 93 1519 1518 1520 # HT OT HT + 1344 93 1522 1521 1523 # HT OT HT + 1345 93 1525 1524 1526 # HT OT HT + 1346 93 1528 1527 1529 # HT OT HT + 1347 93 1531 1530 1532 # HT OT HT + 1348 93 1534 1533 1535 # HT OT HT + 1349 93 1537 1536 1538 # HT OT HT + 1350 93 1540 1539 1541 # HT OT HT + 1351 93 1543 1542 1544 # HT OT HT + 1352 93 1546 1545 1547 # HT OT HT + 1353 93 1549 1548 1550 # HT OT HT + 1354 93 1552 1551 1553 # HT OT HT + 1355 93 1555 1554 1556 # HT OT HT + 1356 93 1558 1557 1559 # HT OT HT + 1357 93 1561 1560 1562 # HT OT HT + 1358 93 1564 1563 1565 # HT OT HT + 1359 93 1567 1566 1568 # HT OT HT + 1360 93 1570 1569 1571 # HT OT HT + 1361 93 1573 1572 1574 # HT OT HT + 1362 93 1576 1575 1577 # HT OT HT + 1363 93 1579 1578 1580 # HT OT HT + 1364 93 1582 1581 1583 # HT OT HT + 1365 93 1585 1584 1586 # HT OT HT 1366 93 1588 1587 1589 # HT OT HT 1367 93 1591 1590 1592 # HT OT HT 1368 93 1594 1593 1595 # HT OT HT @@ -5159,30 +5159,30 @@ Angles 1384 93 1642 1641 1643 # HT OT HT 1385 93 1645 1644 1646 # HT OT HT 1386 93 1648 1647 1649 # HT OT HT - 1387 93 1652 1651 1653 # HT OT HT - 1388 93 1655 1654 1656 # HT OT HT - 1389 93 1658 1657 1659 # HT OT HT - 1390 93 1661 1660 1662 # HT OT HT - 1391 93 1664 1663 1665 # HT OT HT - 1392 93 1667 1666 1668 # HT OT HT - 1393 93 1670 1669 1671 # HT OT HT - 1394 93 1673 1672 1674 # HT OT HT - 1395 93 1676 1675 1677 # HT OT HT - 1396 93 1679 1678 1680 # HT OT HT - 1397 93 1682 1681 1683 # HT OT HT - 1398 93 1685 1684 1686 # HT OT HT - 1399 93 1688 1687 1689 # HT OT HT - 1400 93 1691 1690 1692 # HT OT HT - 1401 93 1694 1693 1695 # HT OT HT - 1402 93 1697 1696 1698 # HT OT HT - 1403 93 1700 1699 1701 # HT OT HT - 1404 93 1703 1702 1704 # HT OT HT - 1405 93 1706 1705 1707 # HT OT HT - 1406 93 1709 1708 1710 # HT OT HT - 1407 93 1712 1711 1713 # HT OT HT - 1408 93 1715 1714 1716 # HT OT HT - 1409 93 1718 1717 1719 # HT OT HT - 1410 93 1721 1720 1722 # HT OT HT + 1387 93 1651 1650 1652 # HT OT HT + 1388 93 1654 1653 1655 # HT OT HT + 1389 93 1657 1656 1658 # HT OT HT + 1390 93 1660 1659 1661 # HT OT HT + 1391 93 1663 1662 1664 # HT OT HT + 1392 93 1666 1665 1667 # HT OT HT + 1393 93 1669 1668 1670 # HT OT HT + 1394 93 1672 1671 1673 # HT OT HT + 1395 93 1675 1674 1676 # HT OT HT + 1396 93 1678 1677 1679 # HT OT HT + 1397 93 1681 1680 1682 # HT OT HT + 1398 93 1684 1683 1685 # HT OT HT + 1399 93 1687 1686 1688 # HT OT HT + 1400 93 1690 1689 1691 # HT OT HT + 1401 93 1693 1692 1694 # HT OT HT + 1402 93 1696 1695 1697 # HT OT HT + 1403 93 1699 1698 1700 # HT OT HT + 1404 93 1702 1701 1703 # HT OT HT + 1405 93 1705 1704 1706 # HT OT HT + 1406 93 1708 1707 1709 # HT OT HT + 1407 93 1711 1710 1712 # HT OT HT + 1408 93 1714 1713 1715 # HT OT HT + 1409 93 1717 1716 1718 # HT OT HT + 1410 93 1720 1719 1721 # HT OT HT 1411 93 1724 1723 1725 # HT OT HT 1412 93 1727 1726 1728 # HT OT HT 1413 93 1730 1729 1731 # HT OT HT @@ -5238,30 +5238,30 @@ Angles 1463 93 1880 1879 1881 # HT OT HT 1464 93 1883 1882 1884 # HT OT HT 1465 93 1886 1885 1887 # HT OT HT - 1466 93 1889 1888 1890 # HT OT HT - 1467 93 1892 1891 1893 # HT OT HT - 1468 93 1895 1894 1896 # HT OT HT - 1469 93 1898 1897 1899 # HT OT HT - 1470 93 1901 1900 1902 # HT OT HT - 1471 93 1904 1903 1905 # HT OT HT - 1472 93 1907 1906 1908 # HT OT HT - 1473 93 1910 1909 1911 # HT OT HT - 1474 93 1914 1913 1915 # HT OT HT - 1475 93 1917 1916 1918 # HT OT HT - 1476 93 1920 1919 1921 # HT OT HT - 1477 93 1923 1922 1924 # HT OT HT - 1478 93 1926 1925 1927 # HT OT HT - 1479 93 1929 1928 1930 # HT OT HT - 1480 93 1932 1931 1933 # HT OT HT - 1481 93 1935 1934 1936 # HT OT HT - 1482 93 1938 1937 1939 # HT OT HT - 1483 93 1941 1940 1942 # HT OT HT + 1466 93 1890 1889 1891 # HT OT HT + 1467 93 1893 1892 1894 # HT OT HT + 1468 93 1897 1896 1898 # HT OT HT + 1469 93 1900 1899 1901 # HT OT HT + 1470 93 1903 1902 1904 # HT OT HT + 1471 93 1906 1905 1907 # HT OT HT + 1472 93 1909 1908 1910 # HT OT HT + 1473 93 1912 1911 1913 # HT OT HT + 1474 93 1915 1914 1916 # HT OT HT + 1475 93 1918 1917 1919 # HT OT HT + 1476 93 1921 1920 1922 # HT OT HT + 1477 93 1924 1923 1925 # HT OT HT + 1478 93 1927 1926 1928 # HT OT HT + 1479 93 1930 1929 1931 # HT OT HT + 1480 93 1933 1932 1934 # HT OT HT + 1481 93 1936 1935 1937 # HT OT HT + 1482 93 1939 1938 1940 # HT OT HT + 1483 93 1942 1941 1943 # HT OT HT 1484 93 1945 1944 1946 # HT OT HT 1485 93 1948 1947 1949 # HT OT HT 1486 93 1951 1950 1952 # HT OT HT 1487 93 1954 1953 1955 # HT OT HT - 1488 93 1958 1957 1959 # HT OT HT - 1489 93 1961 1960 1962 # HT OT HT + 1488 93 1957 1956 1958 # HT OT HT + 1489 93 1960 1959 1961 # HT OT HT 1490 93 1964 1963 1965 # HT OT HT 1491 93 1967 1966 1968 # HT OT HT diff --git a/tools/ch2lmp/example/1ac7.in b/tools/ch2lmp/example/1ac7.in index 87d64ab0d6..97a471845a 100644 --- a/tools/ch2lmp/example/1ac7.in +++ b/tools/ch2lmp/example/1ac7.in @@ -1,4 +1,4 @@ -# Created by charmm2lammps v1.9.1 on Wed Oct 5 18:18:20 EDT 2016 +# Created by charmm2lammps v1.9.1 on Sun Jan 28 05:46:18 EST 2018 # Command: charmm2lammps.pl -water -ions -border=2.0 all27_na 1ac7 units real diff --git a/tools/ch2lmp/example/1ac7.log b/tools/ch2lmp/example/1ac7.log index b3ee181413..e5367711ca 100644 --- a/tools/ch2lmp/example/1ac7.log +++ b/tools/ch2lmp/example/1ac7.log @@ -1,7 +1,7 @@ -LAMMPS (5 Oct 2016) -package omp 0 -WARNING: OpenMP support not enabled during compilation; using 1 thread only. (../fix_omp.cpp:123) -# Created by charmm2lammps v1.9.1 on Wed Oct 5 18:18:20 EDT 2016 +LAMMPS (17 Jan 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# Created by charmm2lammps v1.9.1 on Sun Jan 28 05:46:18 EST 2018 # Command: charmm2lammps.pl -water -ions -border=2.0 all27_na 1ac7 units real @@ -19,7 +19,7 @@ kspace_style pppm 1e-6 read_data 1ac7.data orthogonal box = (-14.087 -1.88253 -5.44214) to (10.545 22.7495 33.9691) - 2 by 2 by 2 MPI processor grid + 2 by 1 by 2 MPI processor grid reading atoms ... 1968 atoms scanning bonds ... @@ -49,89 +49,93 @@ thermo_style multi timestep 1.0 minimize 0.0 0.0 50 200 -WARNING: Resetting reneighboring criteria during minimization (../min.cpp:168) +WARNING: Using 'neigh_modify every 1 delay 0 check yes' setting during minimization (../min.cpp:168) PPPM initialization ... -WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:316) +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) G vector (1/distance) = 0.280406 grid = 30 30 40 stencil order = 5 estimated absolute RMS force accuracy = 0.000302577 estimated relative force accuracy = 9.11202e-07 using double precision FFTs - 3d grid and FFT values/proc = 13068 4500 -Last active /omp style is kspace_style pppm/omp + 3d grid and FFT values/proc = 21978 9000 Neighbor list info ... - 1 neighbor list requests update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 master list distance cutoff = 14 ghost atom cutoff = 14 - binsize = 7 -> bins = 4 4 6 -Memory usage per processor = 15.8614 Mbytes + binsize = 7, bins = 4 4 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/charmm/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 17.89 | 17.89 | 17.9 Mbytes ---------------- Step 0 ----- CPU = 0.0000 (sec) ---------------- -TotEng = 16313.1962 KinEng = 0.0000 Temp = 0.0000 -PotEng = 16313.1962 E_bond = 12014.3479 E_angle = 5414.5475 -E_dihed = 557.2338 E_impro = 0.0516 E_vdwl = 1176.0283 -E_coul = 28218.0485 E_long = -31067.0615 Press = -18022.1296 ----------------- Step 10 ----- CPU = 0.1081 (sec) ---------------- -TotEng = -1447.9072 KinEng = 0.0000 Temp = 0.0000 -PotEng = -1447.9072 E_bond = 247.8926 E_angle = 2176.8245 -E_dihed = 555.8870 E_impro = 1.7628 E_vdwl = -407.3892 -E_coul = 27746.6549 E_long = -31769.5399 Press = -1411.7232 ----------------- Step 20 ----- CPU = 0.2182 (sec) ---------------- -TotEng = -4807.5054 KinEng = 0.0000 Temp = 0.0000 -PotEng = -4807.5054 E_bond = 177.3593 E_angle = 555.9353 -E_dihed = 551.4306 E_impro = 2.6640 E_vdwl = -581.3001 -E_coul = 27120.3184 E_long = -32633.9130 Press = -13576.9371 ----------------- Step 30 ----- CPU = 0.3443 (sec) ---------------- -TotEng = -5555.1803 KinEng = 0.0000 Temp = 0.0000 -PotEng = -5555.1803 E_bond = 147.6057 E_angle = 459.3239 -E_dihed = 539.1126 E_impro = 2.8843 E_vdwl = -576.4747 -E_coul = 26797.8386 E_long = -32925.4706 Press = -12870.0319 ----------------- Step 40 ----- CPU = 0.4657 (sec) ---------------- -TotEng = -5973.0779 KinEng = 0.0000 Temp = 0.0000 -PotEng = -5973.0779 E_bond = 150.6611 E_angle = 441.4999 -E_dihed = 528.1431 E_impro = 3.1819 E_vdwl = -519.1875 -E_coul = 26477.1520 E_long = -33054.5284 Press = -13277.6629 ----------------- Step 50 ----- CPU = 0.5988 (sec) ---------------- -TotEng = -6363.9506 KinEng = 0.0000 Temp = 0.0000 -PotEng = -6363.9506 E_bond = 165.0850 E_angle = 401.3082 -E_dihed = 518.3931 E_impro = 3.2379 E_vdwl = -463.1261 -E_coul = 26138.9684 E_long = -33127.8170 Press = -13085.4188 -Loop time of 0.598905 on 8 procs for 50 steps with 1968 atoms +TotEng = 16382.0106 KinEng = 0.0000 Temp = 0.0000 +PotEng = 16382.0106 E_bond = 12014.3479 E_angle = 5414.5475 +E_dihed = 557.2338 E_impro = 0.0516 E_vdwl = 1174.9839 +E_coul = 28273.7003 E_long = -31052.8544 Press = -17947.7297 +---------------- Step 10 ----- CPU = 0.2030 (sec) ---------------- +TotEng = -1386.3677 KinEng = 0.0000 Temp = 0.0000 +PotEng = -1386.3677 E_bond = 238.0964 E_angle = 2167.9109 +E_dihed = 556.7458 E_impro = 2.3622 E_vdwl = -407.1366 +E_coul = 27803.2765 E_long = -31747.6229 Press = -902.5957 +---------------- Step 20 ----- CPU = 0.4523 (sec) ---------------- +TotEng = -4643.9749 KinEng = 0.0000 Temp = 0.0000 +PotEng = -4643.9749 E_bond = 186.6424 E_angle = 546.1482 +E_dihed = 557.6115 E_impro = 3.7530 E_vdwl = -572.4168 +E_coul = 27184.6593 E_long = -32550.3724 Press = -13499.9676 +---------------- Step 30 ----- CPU = 0.7954 (sec) ---------------- +TotEng = -5356.2261 KinEng = 0.0000 Temp = 0.0000 +PotEng = -5356.2261 E_bond = 150.5494 E_angle = 451.1209 +E_dihed = 548.4804 E_impro = 3.8629 E_vdwl = -587.7229 +E_coul = 26908.1173 E_long = -32830.6340 Press = -12635.5249 +---------------- Step 40 ----- CPU = 1.1432 (sec) ---------------- +TotEng = -5814.9675 KinEng = 0.0000 Temp = 0.0000 +PotEng = -5814.9675 E_bond = 145.1741 E_angle = 424.9449 +E_dihed = 539.7599 E_impro = 3.8304 E_vdwl = -559.2034 +E_coul = 26618.2861 E_long = -32987.7596 Press = -13254.1066 +---------------- Step 50 ----- CPU = 1.4855 (sec) ---------------- +TotEng = -6207.1556 KinEng = 0.0000 Temp = 0.0000 +PotEng = -6207.1556 E_bond = 172.5209 E_angle = 400.9621 +E_dihed = 532.0702 E_impro = 3.4517 E_vdwl = -491.3979 +E_coul = 26261.2546 E_long = -33086.0173 Press = -13942.2342 +Loop time of 1.48576 on 4 procs for 50 steps with 1968 atoms -99.2% CPU use with 8 MPI tasks x 1 OpenMP threads +98.7% CPU use with 4 MPI tasks x 1 OpenMP threads Minimization stats: Stopping criterion = max iterations Energy initial, next-to-last, final = - 16313.1961904 -6328.33883947 -6363.95060584 - Force two-norm initial, final = 9108.55 292.099 - Force max component initial, final = 2254.31 67.3492 - Final line search alpha, max atom move = 0.00149026 0.100368 + 16382.0106166 -6167.68761847 -6207.15563509 + Force two-norm initial, final = 9111.03 289.249 + Force max component initial, final = 2253.01 63.7887 + Final line search alpha, max atom move = 0.000835537 0.0532979 Iterations, force evaluations = 50 75 MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.24051 | 0.28255 | 0.35023 | 7.1 | 47.18 -Bond | 0.0022576 | 0.0057876 | 0.0081606 | 2.6 | 0.97 -Kspace | 0.18978 | 0.25595 | 0.29717 | 7.2 | 42.74 -Neigh | 0.015369 | 0.01561 | 0.015768 | 0.1 | 2.61 -Comm | 0.031344 | 0.032818 | 0.034241 | 0.5 | 5.48 -Output | 0.00034261 | 0.00035512 | 0.00043511 | 0.2 | 0.06 -Modify | 0.0011175 | 0.001414 | 0.0016975 | 0.5 | 0.24 -Other | | 0.00442 | | | 0.74 +Pair | 0.86139 | 0.95604 | 1.1156 | 10.8 | 64.35 +Bond | 0.0054429 | 0.012373 | 0.015879 | 3.7 | 0.83 +Kspace | 0.29818 | 0.45076 | 0.54304 | 15.1 | 30.34 +Neigh | 0.037995 | 0.038014 | 0.038038 | 0.0 | 2.56 +Comm | 0.021986 | 0.022179 | 0.022257 | 0.1 | 1.49 +Output | 0.00028157 | 0.00048172 | 0.0010796 | 0.0 | 0.03 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 0.005911 | | | 0.40 -Nlocal: 246 ave 274 max 226 min -Histogram: 2 1 0 1 1 0 1 1 0 1 -Nghost: 6331 ave 6591 max 6075 min -Histogram: 1 1 0 0 2 2 0 0 1 1 -Neighs: 116074 ave 137552 max 99519 min -Histogram: 1 2 1 1 0 0 0 1 0 2 +Nlocal: 492 ave 538 max 472 min +Histogram: 2 0 1 0 0 0 0 0 0 1 +Nghost: 8001.25 ave 8242 max 7756 min +Histogram: 1 0 0 1 0 0 0 1 0 1 +Neighs: 232207 ave 275971 max 203927 min +Histogram: 2 0 0 0 1 0 0 0 0 1 -Total # of neighbors = 928592 -Ave neighs/atom = 471.846 +Total # of neighbors = 928828 +Ave neighs/atom = 471.965 Ave special neighs/atom = 4.4065 Neighbor list builds = 3 Dangerous builds = 0 @@ -152,105 +156,97 @@ dump_modify 1 image yes scale yes thermo 100 run 1000 PPPM initialization ... -WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:316) +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) G vector (1/distance) = 0.280406 grid = 30 30 40 stencil order = 5 estimated absolute RMS force accuracy = 0.000302577 estimated relative force accuracy = 9.11202e-07 using double precision FFTs - 3d grid and FFT values/proc = 13068 4500 -Last active /omp style is kspace_style pppm/omp -Neighbor list info ... - 1 neighbor list requests - update every 1 steps, delay 2 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 14 - ghost atom cutoff = 14 - binsize = 7 -> bins = 4 4 6 -Memory usage per processor = 16.6281 Mbytes + 3d grid and FFT values/proc = 21978 9000 +Per MPI rank memory allocation (min/avg/max) = 18.67 | 18.68 | 18.68 Mbytes ---------------- Step 0 ----- CPU = 0.0000 (sec) ---------------- -TotEng = -6507.5910 KinEng = 0.0000 Temp = 0.0000 -PotEng = -6507.5910 E_bond = 107.6907 E_angle = 315.0621 -E_dihed = 518.3931 E_impro = 3.2379 E_vdwl = -463.1261 -E_coul = 26138.9684 E_long = -33127.8170 Press = -12385.0996 ----------------- Step 100 ----- CPU = 0.6002 (sec) ---------------- -TotEng = -6239.1679 KinEng = 693.7285 Temp = 162.5977 -PotEng = -6932.8964 E_bond = 97.8328 E_angle = 278.8843 -E_dihed = 517.0395 E_impro = 2.5171 E_vdwl = 25.4169 -E_coul = 25297.7912 E_long = -33152.3783 Press = -7082.4023 ----------------- Step 200 ----- CPU = 1.2143 (sec) ---------------- -TotEng = -6239.2467 KinEng = 973.1878 Temp = 228.0980 -PotEng = -7212.4345 E_bond = 100.5993 E_angle = 320.4657 -E_dihed = 524.2274 E_impro = 2.4292 E_vdwl = 599.6228 -E_coul = 24399.1819 E_long = -33158.9608 Press = -876.3929 ----------------- Step 300 ----- CPU = 1.8629 (sec) ---------------- -TotEng = -6239.3074 KinEng = 1080.8940 Temp = 253.3425 -PotEng = -7320.2014 E_bond = 109.8163 E_angle = 341.6580 -E_dihed = 522.9161 E_impro = 3.3533 E_vdwl = 548.9557 -E_coul = 24315.8677 E_long = -33162.7685 Press = -2189.9473 ----------------- Step 400 ----- CPU = 2.5209 (sec) ---------------- -TotEng = -6239.4210 KinEng = 1085.2885 Temp = 254.3725 -PotEng = -7324.7096 E_bond = 95.4880 E_angle = 333.0840 -E_dihed = 531.5762 E_impro = 4.2236 E_vdwl = 547.4841 -E_coul = 24332.2081 E_long = -33168.7736 Press = -1741.7706 ----------------- Step 500 ----- CPU = 3.1762 (sec) ---------------- -TotEng = -6239.4511 KinEng = 1151.8207 Temp = 269.9665 -PotEng = -7391.2719 E_bond = 108.9390 E_angle = 328.6496 -E_dihed = 528.8096 E_impro = 3.4706 E_vdwl = 499.9982 -E_coul = 24309.7254 E_long = -33170.8642 Press = -2725.2316 ----------------- Step 600 ----- CPU = 3.8115 (sec) ---------------- -TotEng = -6239.4095 KinEng = 1129.5086 Temp = 264.7369 -PotEng = -7368.9182 E_bond = 102.3632 E_angle = 346.1347 -E_dihed = 534.3048 E_impro = 3.7134 E_vdwl = 473.9210 -E_coul = 24346.7523 E_long = -33176.1075 Press = -2684.1848 ----------------- Step 700 ----- CPU = 4.4501 (sec) ---------------- -TotEng = -6239.4955 KinEng = 1132.8803 Temp = 265.5272 -PotEng = -7372.3758 E_bond = 103.5625 E_angle = 340.8027 -E_dihed = 535.9840 E_impro = 4.0448 E_vdwl = 488.9549 -E_coul = 24323.6826 E_long = -33169.4072 Press = -2041.9019 ----------------- Step 800 ----- CPU = 5.0783 (sec) ---------------- -TotEng = -6239.5236 KinEng = 1192.2677 Temp = 279.4465 -PotEng = -7431.7912 E_bond = 110.5122 E_angle = 329.8173 -E_dihed = 534.5353 E_impro = 5.5900 E_vdwl = 541.3805 -E_coul = 24227.6695 E_long = -33181.2961 Press = -1628.5627 ----------------- Step 900 ----- CPU = 5.7072 (sec) ---------------- -TotEng = -6239.5270 KinEng = 1162.7914 Temp = 272.5378 -PotEng = -7402.3184 E_bond = 104.9538 E_angle = 347.6531 -E_dihed = 536.4713 E_impro = 4.6832 E_vdwl = 483.3306 -E_coul = 24295.7423 E_long = -33175.1528 Press = -1959.1567 ----------------- Step 1000 ----- CPU = 6.3345 (sec) ---------------- -TotEng = -6239.5020 KinEng = 1128.3312 Temp = 264.4609 -PotEng = -7367.8332 E_bond = 102.9814 E_angle = 352.0690 -E_dihed = 540.5086 E_impro = 3.6712 E_vdwl = 495.7763 -E_coul = 24316.4138 E_long = -33179.2534 Press = -1881.5655 -Loop time of 6.33458 on 8 procs for 1000 steps with 1968 atoms +TotEng = -6345.9602 KinEng = 0.0000 Temp = 0.0000 +PotEng = -6345.9602 E_bond = 118.9251 E_angle = 315.7533 +E_dihed = 532.0702 E_impro = 3.4517 E_vdwl = -491.3979 +E_coul = 26261.2546 E_long = -33086.0173 Press = -13274.6498 +---------------- Step 100 ----- CPU = 1.5587 (sec) ---------------- +TotEng = -6089.2059 KinEng = 737.9545 Temp = 172.9635 +PotEng = -6827.1604 E_bond = 99.2610 E_angle = 293.4796 +E_dihed = 518.3926 E_impro = 3.4260 E_vdwl = -53.1737 +E_coul = 25455.9659 E_long = -33144.5118 Press = -7582.0585 +---------------- Step 200 ----- CPU = 3.1808 (sec) ---------------- +TotEng = -6089.3334 KinEng = 1048.0815 Temp = 245.6518 +PotEng = -7137.4150 E_bond = 105.4181 E_angle = 314.1091 +E_dihed = 525.7575 E_impro = 2.0633 E_vdwl = 549.1716 +E_coul = 24511.2323 E_long = -33145.1669 Press = -1214.5095 +---------------- Step 300 ----- CPU = 4.8699 (sec) ---------------- +TotEng = -6089.3928 KinEng = 1163.3028 Temp = 272.6576 +PotEng = -7252.6956 E_bond = 101.6270 E_angle = 351.8828 +E_dihed = 525.2212 E_impro = 3.1286 E_vdwl = 516.2458 +E_coul = 24404.4712 E_long = -33155.2722 Press = -2323.5317 +---------------- Step 400 ----- CPU = 6.5652 (sec) ---------------- +TotEng = -6089.4987 KinEng = 1182.3885 Temp = 277.1310 +PotEng = -7271.8872 E_bond = 114.0720 E_angle = 325.6458 +E_dihed = 516.7310 E_impro = 3.1876 E_vdwl = 522.6196 +E_coul = 24402.0712 E_long = -33156.2144 Press = -2169.9377 +---------------- Step 500 ----- CPU = 8.2547 (sec) ---------------- +TotEng = -6089.4538 KinEng = 1158.7955 Temp = 271.6012 +PotEng = -7248.2493 E_bond = 103.0865 E_angle = 339.1037 +E_dihed = 522.7155 E_impro = 2.6322 E_vdwl = 439.8428 +E_coul = 24513.5109 E_long = -33169.1409 Press = -1803.4201 +---------------- Step 600 ----- CPU = 9.9107 (sec) ---------------- +TotEng = -6089.5529 KinEng = 1205.1352 Temp = 282.4624 +PotEng = -7294.6881 E_bond = 108.2588 E_angle = 346.6746 +E_dihed = 531.5390 E_impro = 3.2909 E_vdwl = 459.2427 +E_coul = 24426.5336 E_long = -33170.2276 Press = -2567.6797 +---------------- Step 700 ----- CPU = 11.5432 (sec) ---------------- +TotEng = -6089.5542 KinEng = 1192.6231 Temp = 279.5298 +PotEng = -7282.1773 E_bond = 111.1701 E_angle = 368.3148 +E_dihed = 531.3469 E_impro = 3.6338 E_vdwl = 526.5919 +E_coul = 24341.9242 E_long = -33165.1590 Press = -1918.0534 +---------------- Step 800 ----- CPU = 13.1827 (sec) ---------------- +TotEng = -6089.6409 KinEng = 1211.1193 Temp = 283.8650 +PotEng = -7300.7601 E_bond = 104.1488 E_angle = 343.9467 +E_dihed = 536.0043 E_impro = 5.1288 E_vdwl = 507.6841 +E_coul = 24380.9222 E_long = -33178.5951 Press = -1535.2124 +---------------- Step 900 ----- CPU = 14.8342 (sec) ---------------- +TotEng = -6089.6435 KinEng = 1219.9414 Temp = 285.9327 +PotEng = -7309.5848 E_bond = 106.3702 E_angle = 362.6403 +E_dihed = 531.9023 E_impro = 4.1736 E_vdwl = 532.4576 +E_coul = 24326.4696 E_long = -33173.5985 Press = -694.2393 +---------------- Step 1000 ----- CPU = 16.5041 (sec) ---------------- +TotEng = -6089.6045 KinEng = 1204.4192 Temp = 282.2946 +PotEng = -7294.0238 E_bond = 108.7432 E_angle = 365.2088 +E_dihed = 541.1125 E_impro = 5.8781 E_vdwl = 533.2755 +E_coul = 24329.0904 E_long = -33177.3322 Press = -1373.0623 +Loop time of 16.5043 on 4 procs for 1000 steps with 1968 atoms -Performance: 13.639 ns/day, 1.760 hours/ns, 157.864 timesteps/s -99.6% CPU use with 8 MPI tasks x 1 OpenMP threads +Performance: 5.235 ns/day, 4.585 hours/ns, 60.590 timesteps/s +98.8% 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.2335 | 2.5532 | 3.1707 | 18.5 | 40.31 -Bond | 0.01158 | 0.051889 | 0.080867 | 9.9 | 0.82 -Kspace | 2.1965 | 2.7773 | 3.0728 | 16.7 | 43.84 -Neigh | 0.24407 | 0.24588 | 0.24863 | 0.3 | 3.88 -Comm | 0.36894 | 0.37849 | 0.39142 | 1.3 | 5.97 -Output | 0.0083764 | 0.0085732 | 0.0087767 | 0.1 | 0.14 -Modify | 0.25864 | 0.28389 | 0.2976 | 2.5 | 4.48 -Other | | 0.03539 | | | 0.56 +Pair | 8.2128 | 9.5121 | 11.127 | 36.9 | 57.63 +Bond | 0.035131 | 0.11618 | 0.15792 | 14.0 | 0.70 +Kspace | 4.0276 | 5.4843 | 6.6741 | 44.1 | 33.23 +Neigh | 0.66517 | 0.66553 | 0.66594 | 0.0 | 4.03 +Comm | 0.28238 | 0.35525 | 0.41804 | 9.9 | 2.15 +Output | 0.01374 | 0.014323 | 0.015721 | 0.7 | 0.09 +Modify | 0.28166 | 0.28593 | 0.29397 | 0.9 | 1.73 +Other | | 0.07076 | | | 0.43 -Nlocal: 246 ave 290 max 210 min -Histogram: 1 1 0 1 2 0 2 0 0 1 -Nghost: 6160.5 ave 6438 max 5877 min -Histogram: 2 0 0 1 0 2 0 1 1 1 -Neighs: 116321 ave 144703 max 98946 min -Histogram: 1 2 1 1 0 2 0 0 0 1 +Nlocal: 492 ave 517 max 456 min +Histogram: 1 0 0 0 0 1 0 0 1 1 +Nghost: 7866 ave 8035 max 7664 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Neighs: 232474 ave 255787 max 198462 min +Histogram: 1 0 0 1 0 0 0 0 0 2 -Total # of neighbors = 930570 -Ave neighs/atom = 472.851 +Total # of neighbors = 929895 +Ave neighs/atom = 472.508 Ave special neighs/atom = 4.4065 -Neighbor list builds = 46 +Neighbor list builds = 47 Dangerous builds = 0 -Total wall time: 0:00:07 +Total wall time: 0:00:18 diff --git a/tools/ch2lmp/example/1ac7_ctrl.pdb b/tools/ch2lmp/example/1ac7_ctrl.pdb index 22c0d4bb31..24c1516ce9 100644 --- a/tools/ch2lmp/example/1ac7_ctrl.pdb +++ b/tools/ch2lmp/example/1ac7_ctrl.pdb @@ -1,6 +1,6 @@ REMARK REMARK CONTROL PDB 1ac7_ctrl.pdb -REMARK CREATED BY charmm2lammps v1.9.1 ON Wed Oct 5 18:18:20 EDT 2016 +REMARK CREATED BY charmm2lammps v1.9.1 ON Sun Jan 28 05:46:18 EST 2018 REMARK ATOM 1 P ADE 1 3.759 0.457 0.076 1.00 0.0 A ATOM 2 O1P ADE 1 2.779 0.279 0.171 1.00 0.0 A @@ -592,109 +592,109 @@ ATOM 587 HT HOH 52 -13.612 -0.0650 20.4215 1.00 0.00 WATR ATOM 588 OT HOH 53 -10.392 1.81228 20.4215 1.00 0.00 WATR ATOM 589 HT HOH 53 -9.6352 2.39816 20.4215 1.00 0.00 WATR ATOM 590 HT HOH 53 -11.149 2.39816 20.4215 1.00 0.00 WATR -ATOM 591 SOD ION 54 -10.392 -0.6509 22.8847 1.00 0.00 SALT -ATOM 592 OT HOH 55 -12.855 1.81228 22.8847 1.00 0.00 WATR -ATOM 593 HT HOH 55 -12.098 2.39816 22.8847 1.00 0.00 WATR -ATOM 594 HT HOH 55 -13.612 2.39816 22.8847 1.00 0.00 WATR -ATOM 595 OT HOH 56 -12.855 -0.6509 25.3479 1.00 0.00 WATR -ATOM 596 HT HOH 56 -12.098 -0.0650 25.3479 1.00 0.00 WATR -ATOM 597 HT HOH 56 -13.612 -0.0650 25.3479 1.00 0.00 WATR -ATOM 598 OT HOH 57 -10.392 1.81228 25.3479 1.00 0.00 WATR -ATOM 599 HT HOH 57 -9.6352 2.39816 25.3479 1.00 0.00 WATR -ATOM 600 HT HOH 57 -11.149 2.39816 25.3479 1.00 0.00 WATR -ATOM 601 OT HOH 58 -10.392 -0.6509 27.8111 1.00 0.00 WATR -ATOM 602 HT HOH 58 -9.6352 -0.0650 27.8111 1.00 0.00 WATR -ATOM 603 HT HOH 58 -11.149 -0.0650 27.8111 1.00 0.00 WATR -ATOM 604 OT HOH 59 -12.855 1.81228 27.8111 1.00 0.00 WATR -ATOM 605 HT HOH 59 -12.098 2.39816 27.8111 1.00 0.00 WATR -ATOM 606 HT HOH 59 -13.612 2.39816 27.8111 1.00 0.00 WATR -ATOM 607 OT HOH 60 -12.855 -0.6509 30.2743 1.00 0.00 WATR -ATOM 608 HT HOH 60 -12.098 -0.0650 30.2743 1.00 0.00 WATR -ATOM 609 HT HOH 60 -13.612 -0.0650 30.2743 1.00 0.00 WATR -ATOM 610 OT HOH 61 -10.392 1.81228 30.2743 1.00 0.00 WATR -ATOM 611 HT HOH 61 -9.6352 2.39816 30.2743 1.00 0.00 WATR -ATOM 612 HT HOH 61 -11.149 2.39816 30.2743 1.00 0.00 WATR -ATOM 613 OT HOH 62 -10.392 -0.6509 32.7375 1.00 0.00 WATR -ATOM 614 HT HOH 62 -9.6352 -0.0650 32.7375 1.00 0.00 WATR -ATOM 615 HT HOH 62 -11.149 -0.0650 32.7375 1.00 0.00 WATR -ATOM 616 OT HOH 63 -12.855 1.81228 32.7375 1.00 0.00 WATR -ATOM 617 HT HOH 63 -12.098 2.39816 32.7375 1.00 0.00 WATR -ATOM 618 HT HOH 63 -13.612 2.39816 32.7375 1.00 0.00 WATR -ATOM 619 OT HOH 64 -12.855 4.27548 -4.2105 1.00 0.00 WATR -ATOM 620 HT HOH 64 -12.098 4.86136 -4.2105 1.00 0.00 WATR -ATOM 621 HT HOH 64 -13.612 4.86136 -4.2105 1.00 0.00 WATR -ATOM 622 OT HOH 65 -10.392 6.73869 -4.2105 1.00 0.00 WATR -ATOM 623 HT HOH 65 -9.6352 7.32457 -4.2105 1.00 0.00 WATR -ATOM 624 HT HOH 65 -11.149 7.32457 -4.2105 1.00 0.00 WATR -ATOM 625 OT HOH 66 -10.392 4.27548 -1.7473 1.00 0.00 WATR -ATOM 626 HT HOH 66 -9.6352 4.86136 -1.7473 1.00 0.00 WATR -ATOM 627 HT HOH 66 -11.149 4.86136 -1.7473 1.00 0.00 WATR -ATOM 628 OT HOH 67 -12.855 6.73869 -1.7473 1.00 0.00 WATR -ATOM 629 HT HOH 67 -12.098 7.32457 -1.7473 1.00 0.00 WATR -ATOM 630 HT HOH 67 -13.612 7.32457 -1.7473 1.00 0.00 WATR -ATOM 631 OT HOH 68 -12.855 4.27548 0.71587 1.00 0.00 WATR -ATOM 632 HT HOH 68 -12.098 4.86136 0.71587 1.00 0.00 WATR -ATOM 633 HT HOH 68 -13.612 4.86136 0.71587 1.00 0.00 WATR -ATOM 634 OT HOH 69 -10.392 6.73869 0.71587 1.00 0.00 WATR -ATOM 635 HT HOH 69 -9.6352 7.32457 0.71587 1.00 0.00 WATR -ATOM 636 HT HOH 69 -11.149 7.32457 0.71587 1.00 0.00 WATR -ATOM 637 OT HOH 70 -10.392 4.27548 3.17907 1.00 0.00 WATR -ATOM 638 HT HOH 70 -9.6352 4.86136 3.17907 1.00 0.00 WATR -ATOM 639 HT HOH 70 -11.149 4.86136 3.17907 1.00 0.00 WATR -ATOM 640 OT HOH 71 -12.855 6.73869 3.17907 1.00 0.00 WATR -ATOM 641 HT HOH 71 -12.098 7.32457 3.17907 1.00 0.00 WATR -ATOM 642 HT HOH 71 -13.612 7.32457 3.17907 1.00 0.00 WATR -ATOM 643 OT HOH 72 -12.855 4.27548 5.64228 1.00 0.00 WATR -ATOM 644 HT HOH 72 -12.098 4.86136 5.64228 1.00 0.00 WATR -ATOM 645 HT HOH 72 -13.612 4.86136 5.64228 1.00 0.00 WATR -ATOM 646 OT HOH 73 -12.855 6.73869 13.0318 1.00 0.00 WATR -ATOM 647 HT HOH 73 -12.098 7.32457 13.0318 1.00 0.00 WATR -ATOM 648 HT HOH 73 -13.612 7.32457 13.0318 1.00 0.00 WATR -ATOM 649 OT HOH 74 -12.855 4.27548 15.4951 1.00 0.00 WATR -ATOM 650 HT HOH 74 -12.098 4.86136 15.4951 1.00 0.00 WATR -ATOM 651 HT HOH 74 -13.612 4.86136 15.4951 1.00 0.00 WATR -ATOM 652 OT HOH 75 -10.392 4.27548 17.9583 1.00 0.00 WATR -ATOM 653 HT HOH 75 -9.6352 4.86136 17.9583 1.00 0.00 WATR -ATOM 654 HT HOH 75 -11.149 4.86136 17.9583 1.00 0.00 WATR -ATOM 655 OT HOH 76 -12.855 6.73869 17.9583 1.00 0.00 WATR -ATOM 656 HT HOH 76 -12.098 7.32457 17.9583 1.00 0.00 WATR -ATOM 657 HT HOH 76 -13.612 7.32457 17.9583 1.00 0.00 WATR -ATOM 658 OT HOH 77 -12.855 4.27548 20.4215 1.00 0.00 WATR -ATOM 659 HT HOH 77 -12.098 4.86136 20.4215 1.00 0.00 WATR -ATOM 660 HT HOH 77 -13.612 4.86136 20.4215 1.00 0.00 WATR -ATOM 661 OT HOH 78 -10.392 6.73869 20.4215 1.00 0.00 WATR -ATOM 662 HT HOH 78 -9.6352 7.32457 20.4215 1.00 0.00 WATR -ATOM 663 HT HOH 78 -11.149 7.32457 20.4215 1.00 0.00 WATR -ATOM 664 OT HOH 79 -10.392 4.27548 22.8847 1.00 0.00 WATR -ATOM 665 HT HOH 79 -9.6352 4.86136 22.8847 1.00 0.00 WATR -ATOM 666 HT HOH 79 -11.149 4.86136 22.8847 1.00 0.00 WATR -ATOM 667 OT HOH 80 -12.855 6.73869 22.8847 1.00 0.00 WATR -ATOM 668 HT HOH 80 -12.098 7.32457 22.8847 1.00 0.00 WATR -ATOM 669 HT HOH 80 -13.612 7.32457 22.8847 1.00 0.00 WATR -ATOM 670 OT HOH 81 -12.855 4.27548 25.3479 1.00 0.00 WATR -ATOM 671 HT HOH 81 -12.098 4.86136 25.3479 1.00 0.00 WATR -ATOM 672 HT HOH 81 -13.612 4.86136 25.3479 1.00 0.00 WATR -ATOM 673 OT HOH 82 -10.392 6.73869 25.3479 1.00 0.00 WATR -ATOM 674 HT HOH 82 -9.6352 7.32457 25.3479 1.00 0.00 WATR -ATOM 675 HT HOH 82 -11.149 7.32457 25.3479 1.00 0.00 WATR -ATOM 676 OT HOH 83 -10.392 4.27548 27.8111 1.00 0.00 WATR -ATOM 677 HT HOH 83 -9.6352 4.86136 27.8111 1.00 0.00 WATR -ATOM 678 HT HOH 83 -11.149 4.86136 27.8111 1.00 0.00 WATR -ATOM 679 OT HOH 84 -12.855 6.73869 27.8111 1.00 0.00 WATR -ATOM 680 HT HOH 84 -12.098 7.32457 27.8111 1.00 0.00 WATR -ATOM 681 HT HOH 84 -13.612 7.32457 27.8111 1.00 0.00 WATR -ATOM 682 OT HOH 85 -12.855 4.27548 30.2743 1.00 0.00 WATR -ATOM 683 HT HOH 85 -12.098 4.86136 30.2743 1.00 0.00 WATR -ATOM 684 HT HOH 85 -13.612 4.86136 30.2743 1.00 0.00 WATR -ATOM 685 OT HOH 86 -10.392 6.73869 30.2743 1.00 0.00 WATR -ATOM 686 HT HOH 86 -9.6352 7.32457 30.2743 1.00 0.00 WATR -ATOM 687 HT HOH 86 -11.149 7.32457 30.2743 1.00 0.00 WATR -ATOM 688 OT HOH 87 -10.392 4.27548 32.7375 1.00 0.00 WATR -ATOM 689 HT HOH 87 -9.6352 4.86136 32.7375 1.00 0.00 WATR -ATOM 690 HT HOH 87 -11.149 4.86136 32.7375 1.00 0.00 WATR -ATOM 691 OT HOH 88 -12.855 6.73869 32.7375 1.00 0.00 WATR -ATOM 692 HT HOH 88 -12.098 7.32457 32.7375 1.00 0.00 WATR -ATOM 693 HT HOH 88 -13.612 7.32457 32.7375 1.00 0.00 WATR +ATOM 591 OT HOH 54 -10.392 -0.6509 22.8847 1.00 0.00 WATR +ATOM 592 HT HOH 54 -9.6352 -0.0650 22.8847 1.00 0.00 WATR +ATOM 593 HT HOH 54 -11.149 -0.0650 22.8847 1.00 0.00 WATR +ATOM 594 OT HOH 55 -12.855 1.81228 22.8847 1.00 0.00 WATR +ATOM 595 HT HOH 55 -12.098 2.39816 22.8847 1.00 0.00 WATR +ATOM 596 HT HOH 55 -13.612 2.39816 22.8847 1.00 0.00 WATR +ATOM 597 OT HOH 56 -12.855 -0.6509 25.3479 1.00 0.00 WATR +ATOM 598 HT HOH 56 -12.098 -0.0650 25.3479 1.00 0.00 WATR +ATOM 599 HT HOH 56 -13.612 -0.0650 25.3479 1.00 0.00 WATR +ATOM 600 OT HOH 57 -10.392 1.81228 25.3479 1.00 0.00 WATR +ATOM 601 HT HOH 57 -9.6352 2.39816 25.3479 1.00 0.00 WATR +ATOM 602 HT HOH 57 -11.149 2.39816 25.3479 1.00 0.00 WATR +ATOM 603 OT HOH 58 -10.392 -0.6509 27.8111 1.00 0.00 WATR +ATOM 604 HT HOH 58 -9.6352 -0.0650 27.8111 1.00 0.00 WATR +ATOM 605 HT HOH 58 -11.149 -0.0650 27.8111 1.00 0.00 WATR +ATOM 606 OT HOH 59 -12.855 1.81228 27.8111 1.00 0.00 WATR +ATOM 607 HT HOH 59 -12.098 2.39816 27.8111 1.00 0.00 WATR +ATOM 608 HT HOH 59 -13.612 2.39816 27.8111 1.00 0.00 WATR +ATOM 609 OT HOH 60 -12.855 -0.6509 30.2743 1.00 0.00 WATR +ATOM 610 HT HOH 60 -12.098 -0.0650 30.2743 1.00 0.00 WATR +ATOM 611 HT HOH 60 -13.612 -0.0650 30.2743 1.00 0.00 WATR +ATOM 612 OT HOH 61 -10.392 1.81228 30.2743 1.00 0.00 WATR +ATOM 613 HT HOH 61 -9.6352 2.39816 30.2743 1.00 0.00 WATR +ATOM 614 HT HOH 61 -11.149 2.39816 30.2743 1.00 0.00 WATR +ATOM 615 OT HOH 62 -10.392 -0.6509 32.7375 1.00 0.00 WATR +ATOM 616 HT HOH 62 -9.6352 -0.0650 32.7375 1.00 0.00 WATR +ATOM 617 HT HOH 62 -11.149 -0.0650 32.7375 1.00 0.00 WATR +ATOM 618 OT HOH 63 -12.855 1.81228 32.7375 1.00 0.00 WATR +ATOM 619 HT HOH 63 -12.098 2.39816 32.7375 1.00 0.00 WATR +ATOM 620 HT HOH 63 -13.612 2.39816 32.7375 1.00 0.00 WATR +ATOM 621 OT HOH 64 -12.855 4.27548 -4.2105 1.00 0.00 WATR +ATOM 622 HT HOH 64 -12.098 4.86136 -4.2105 1.00 0.00 WATR +ATOM 623 HT HOH 64 -13.612 4.86136 -4.2105 1.00 0.00 WATR +ATOM 624 OT HOH 65 -10.392 6.73869 -4.2105 1.00 0.00 WATR +ATOM 625 HT HOH 65 -9.6352 7.32457 -4.2105 1.00 0.00 WATR +ATOM 626 HT HOH 65 -11.149 7.32457 -4.2105 1.00 0.00 WATR +ATOM 627 OT HOH 66 -10.392 4.27548 -1.7473 1.00 0.00 WATR +ATOM 628 HT HOH 66 -9.6352 4.86136 -1.7473 1.00 0.00 WATR +ATOM 629 HT HOH 66 -11.149 4.86136 -1.7473 1.00 0.00 WATR +ATOM 630 OT HOH 67 -12.855 6.73869 -1.7473 1.00 0.00 WATR +ATOM 631 HT HOH 67 -12.098 7.32457 -1.7473 1.00 0.00 WATR +ATOM 632 HT HOH 67 -13.612 7.32457 -1.7473 1.00 0.00 WATR +ATOM 633 OT HOH 68 -12.855 4.27548 0.71587 1.00 0.00 WATR +ATOM 634 HT HOH 68 -12.098 4.86136 0.71587 1.00 0.00 WATR +ATOM 635 HT HOH 68 -13.612 4.86136 0.71587 1.00 0.00 WATR +ATOM 636 OT HOH 69 -10.392 6.73869 0.71587 1.00 0.00 WATR +ATOM 637 HT HOH 69 -9.6352 7.32457 0.71587 1.00 0.00 WATR +ATOM 638 HT HOH 69 -11.149 7.32457 0.71587 1.00 0.00 WATR +ATOM 639 OT HOH 70 -10.392 4.27548 3.17907 1.00 0.00 WATR +ATOM 640 HT HOH 70 -9.6352 4.86136 3.17907 1.00 0.00 WATR +ATOM 641 HT HOH 70 -11.149 4.86136 3.17907 1.00 0.00 WATR +ATOM 642 OT HOH 71 -12.855 6.73869 3.17907 1.00 0.00 WATR +ATOM 643 HT HOH 71 -12.098 7.32457 3.17907 1.00 0.00 WATR +ATOM 644 HT HOH 71 -13.612 7.32457 3.17907 1.00 0.00 WATR +ATOM 645 OT HOH 72 -12.855 4.27548 5.64228 1.00 0.00 WATR +ATOM 646 HT HOH 72 -12.098 4.86136 5.64228 1.00 0.00 WATR +ATOM 647 HT HOH 72 -13.612 4.86136 5.64228 1.00 0.00 WATR +ATOM 648 OT HOH 73 -12.855 6.73869 13.0318 1.00 0.00 WATR +ATOM 649 HT HOH 73 -12.098 7.32457 13.0318 1.00 0.00 WATR +ATOM 650 HT HOH 73 -13.612 7.32457 13.0318 1.00 0.00 WATR +ATOM 651 OT HOH 74 -12.855 4.27548 15.4951 1.00 0.00 WATR +ATOM 652 HT HOH 74 -12.098 4.86136 15.4951 1.00 0.00 WATR +ATOM 653 HT HOH 74 -13.612 4.86136 15.4951 1.00 0.00 WATR +ATOM 654 OT HOH 75 -10.392 4.27548 17.9583 1.00 0.00 WATR +ATOM 655 HT HOH 75 -9.6352 4.86136 17.9583 1.00 0.00 WATR +ATOM 656 HT HOH 75 -11.149 4.86136 17.9583 1.00 0.00 WATR +ATOM 657 OT HOH 76 -12.855 6.73869 17.9583 1.00 0.00 WATR +ATOM 658 HT HOH 76 -12.098 7.32457 17.9583 1.00 0.00 WATR +ATOM 659 HT HOH 76 -13.612 7.32457 17.9583 1.00 0.00 WATR +ATOM 660 OT HOH 77 -12.855 4.27548 20.4215 1.00 0.00 WATR +ATOM 661 HT HOH 77 -12.098 4.86136 20.4215 1.00 0.00 WATR +ATOM 662 HT HOH 77 -13.612 4.86136 20.4215 1.00 0.00 WATR +ATOM 663 OT HOH 78 -10.392 6.73869 20.4215 1.00 0.00 WATR +ATOM 664 HT HOH 78 -9.6352 7.32457 20.4215 1.00 0.00 WATR +ATOM 665 HT HOH 78 -11.149 7.32457 20.4215 1.00 0.00 WATR +ATOM 666 OT HOH 79 -10.392 4.27548 22.8847 1.00 0.00 WATR +ATOM 667 HT HOH 79 -9.6352 4.86136 22.8847 1.00 0.00 WATR +ATOM 668 HT HOH 79 -11.149 4.86136 22.8847 1.00 0.00 WATR +ATOM 669 OT HOH 80 -12.855 6.73869 22.8847 1.00 0.00 WATR +ATOM 670 HT HOH 80 -12.098 7.32457 22.8847 1.00 0.00 WATR +ATOM 671 HT HOH 80 -13.612 7.32457 22.8847 1.00 0.00 WATR +ATOM 672 OT HOH 81 -12.855 4.27548 25.3479 1.00 0.00 WATR +ATOM 673 HT HOH 81 -12.098 4.86136 25.3479 1.00 0.00 WATR +ATOM 674 HT HOH 81 -13.612 4.86136 25.3479 1.00 0.00 WATR +ATOM 675 OT HOH 82 -10.392 6.73869 25.3479 1.00 0.00 WATR +ATOM 676 HT HOH 82 -9.6352 7.32457 25.3479 1.00 0.00 WATR +ATOM 677 HT HOH 82 -11.149 7.32457 25.3479 1.00 0.00 WATR +ATOM 678 OT HOH 83 -10.392 4.27548 27.8111 1.00 0.00 WATR +ATOM 679 HT HOH 83 -9.6352 4.86136 27.8111 1.00 0.00 WATR +ATOM 680 HT HOH 83 -11.149 4.86136 27.8111 1.00 0.00 WATR +ATOM 681 OT HOH 84 -12.855 6.73869 27.8111 1.00 0.00 WATR +ATOM 682 HT HOH 84 -12.098 7.32457 27.8111 1.00 0.00 WATR +ATOM 683 HT HOH 84 -13.612 7.32457 27.8111 1.00 0.00 WATR +ATOM 684 OT HOH 85 -12.855 4.27548 30.2743 1.00 0.00 WATR +ATOM 685 HT HOH 85 -12.098 4.86136 30.2743 1.00 0.00 WATR +ATOM 686 HT HOH 85 -13.612 4.86136 30.2743 1.00 0.00 WATR +ATOM 687 OT HOH 86 -10.392 6.73869 30.2743 1.00 0.00 WATR +ATOM 688 HT HOH 86 -9.6352 7.32457 30.2743 1.00 0.00 WATR +ATOM 689 HT HOH 86 -11.149 7.32457 30.2743 1.00 0.00 WATR +ATOM 690 OT HOH 87 -10.392 4.27548 32.7375 1.00 0.00 WATR +ATOM 691 HT HOH 87 -9.6352 4.86136 32.7375 1.00 0.00 WATR +ATOM 692 HT HOH 87 -11.149 4.86136 32.7375 1.00 0.00 WATR +ATOM 693 SOD ION 88 -12.855 6.73869 32.7375 1.00 0.00 SALT ATOM 694 OT HOH 89 -12.855 9.20189 -4.2105 1.00 0.00 WATR ATOM 695 HT HOH 89 -12.098 9.78777 -4.2105 1.00 0.00 WATR ATOM 696 HT HOH 89 -13.612 9.78777 -4.2105 1.00 0.00 WATR @@ -815,40 +815,40 @@ ATOM 810 HT HOH 127 -13.612 22.1038 -1.7473 1.00 0.00 WATR ATOM 811 OT HOH 128 -12.855 19.0547 0.71587 1.00 0.00 WATR ATOM 812 HT HOH 128 -12.098 19.6406 0.71587 1.00 0.00 WATR ATOM 813 HT HOH 128 -13.612 19.6406 0.71587 1.00 0.00 WATR -ATOM 814 OT HOH 129 -10.392 21.5179 0.71587 1.00 0.00 WATR -ATOM 815 HT HOH 129 -9.6352 22.1038 0.71587 1.00 0.00 WATR -ATOM 816 HT HOH 129 -11.149 22.1038 0.71587 1.00 0.00 WATR -ATOM 817 OT HOH 130 -10.392 19.0547 3.17907 1.00 0.00 WATR -ATOM 818 HT HOH 130 -9.6352 19.6406 3.17907 1.00 0.00 WATR -ATOM 819 HT HOH 130 -11.149 19.6406 3.17907 1.00 0.00 WATR -ATOM 820 OT HOH 131 -12.855 21.5179 3.17907 1.00 0.00 WATR -ATOM 821 HT HOH 131 -12.098 22.1038 3.17907 1.00 0.00 WATR -ATOM 822 HT HOH 131 -13.612 22.1038 3.17907 1.00 0.00 WATR -ATOM 823 OT HOH 132 -12.855 19.0547 5.64228 1.00 0.00 WATR -ATOM 824 HT HOH 132 -12.098 19.6406 5.64228 1.00 0.00 WATR -ATOM 825 HT HOH 132 -13.612 19.6406 5.64228 1.00 0.00 WATR -ATOM 826 OT HOH 133 -10.392 21.5179 5.64228 1.00 0.00 WATR -ATOM 827 HT HOH 133 -9.6352 22.1038 5.64228 1.00 0.00 WATR -ATOM 828 HT HOH 133 -11.149 22.1038 5.64228 1.00 0.00 WATR -ATOM 829 OT HOH 134 -10.392 19.0547 8.10548 1.00 0.00 WATR -ATOM 830 HT HOH 134 -9.6352 19.6406 8.10548 1.00 0.00 WATR -ATOM 831 HT HOH 134 -11.149 19.6406 8.10548 1.00 0.00 WATR -ATOM 832 OT HOH 135 -12.855 21.5179 8.10548 1.00 0.00 WATR -ATOM 833 HT HOH 135 -12.098 22.1038 8.10548 1.00 0.00 WATR -ATOM 834 HT HOH 135 -13.612 22.1038 8.10548 1.00 0.00 WATR -ATOM 835 OT HOH 136 -12.855 19.0547 10.5686 1.00 0.00 WATR -ATOM 836 HT HOH 136 -12.098 19.6406 10.5686 1.00 0.00 WATR -ATOM 837 HT HOH 136 -13.612 19.6406 10.5686 1.00 0.00 WATR -ATOM 838 OT HOH 137 -10.392 21.5179 10.5686 1.00 0.00 WATR -ATOM 839 HT HOH 137 -9.6352 22.1038 10.5686 1.00 0.00 WATR -ATOM 840 HT HOH 137 -11.149 22.1038 10.5686 1.00 0.00 WATR -ATOM 841 OT HOH 138 -12.855 21.5179 13.0318 1.00 0.00 WATR -ATOM 842 HT HOH 138 -12.098 22.1038 13.0318 1.00 0.00 WATR -ATOM 843 HT HOH 138 -13.612 22.1038 13.0318 1.00 0.00 WATR -ATOM 844 OT HOH 139 -10.392 21.5179 15.4951 1.00 0.00 WATR -ATOM 845 HT HOH 139 -9.6352 22.1038 15.4951 1.00 0.00 WATR -ATOM 846 HT HOH 139 -11.149 22.1038 15.4951 1.00 0.00 WATR -ATOM 847 SOD ION 140 -12.855 21.5179 17.9583 1.00 0.00 SALT +ATOM 814 SOD ION 129 -10.392 21.5179 0.71587 1.00 0.00 SALT +ATOM 815 OT HOH 130 -10.392 19.0547 3.17907 1.00 0.00 WATR +ATOM 816 HT HOH 130 -9.6352 19.6406 3.17907 1.00 0.00 WATR +ATOM 817 HT HOH 130 -11.149 19.6406 3.17907 1.00 0.00 WATR +ATOM 818 OT HOH 131 -12.855 21.5179 3.17907 1.00 0.00 WATR +ATOM 819 HT HOH 131 -12.098 22.1038 3.17907 1.00 0.00 WATR +ATOM 820 HT HOH 131 -13.612 22.1038 3.17907 1.00 0.00 WATR +ATOM 821 OT HOH 132 -12.855 19.0547 5.64228 1.00 0.00 WATR +ATOM 822 HT HOH 132 -12.098 19.6406 5.64228 1.00 0.00 WATR +ATOM 823 HT HOH 132 -13.612 19.6406 5.64228 1.00 0.00 WATR +ATOM 824 OT HOH 133 -10.392 21.5179 5.64228 1.00 0.00 WATR +ATOM 825 HT HOH 133 -9.6352 22.1038 5.64228 1.00 0.00 WATR +ATOM 826 HT HOH 133 -11.149 22.1038 5.64228 1.00 0.00 WATR +ATOM 827 OT HOH 134 -10.392 19.0547 8.10548 1.00 0.00 WATR +ATOM 828 HT HOH 134 -9.6352 19.6406 8.10548 1.00 0.00 WATR +ATOM 829 HT HOH 134 -11.149 19.6406 8.10548 1.00 0.00 WATR +ATOM 830 OT HOH 135 -12.855 21.5179 8.10548 1.00 0.00 WATR +ATOM 831 HT HOH 135 -12.098 22.1038 8.10548 1.00 0.00 WATR +ATOM 832 HT HOH 135 -13.612 22.1038 8.10548 1.00 0.00 WATR +ATOM 833 OT HOH 136 -12.855 19.0547 10.5686 1.00 0.00 WATR +ATOM 834 HT HOH 136 -12.098 19.6406 10.5686 1.00 0.00 WATR +ATOM 835 HT HOH 136 -13.612 19.6406 10.5686 1.00 0.00 WATR +ATOM 836 OT HOH 137 -10.392 21.5179 10.5686 1.00 0.00 WATR +ATOM 837 HT HOH 137 -9.6352 22.1038 10.5686 1.00 0.00 WATR +ATOM 838 HT HOH 137 -11.149 22.1038 10.5686 1.00 0.00 WATR +ATOM 839 OT HOH 138 -12.855 21.5179 13.0318 1.00 0.00 WATR +ATOM 840 HT HOH 138 -12.098 22.1038 13.0318 1.00 0.00 WATR +ATOM 841 HT HOH 138 -13.612 22.1038 13.0318 1.00 0.00 WATR +ATOM 842 OT HOH 139 -10.392 21.5179 15.4951 1.00 0.00 WATR +ATOM 843 HT HOH 139 -9.6352 22.1038 15.4951 1.00 0.00 WATR +ATOM 844 HT HOH 139 -11.149 22.1038 15.4951 1.00 0.00 WATR +ATOM 845 OT HOH 140 -12.855 21.5179 17.9583 1.00 0.00 WATR +ATOM 846 HT HOH 140 -12.098 22.1038 17.9583 1.00 0.00 WATR +ATOM 847 HT HOH 140 -13.612 22.1038 17.9583 1.00 0.00 WATR ATOM 848 OT HOH 141 -12.855 19.0547 20.4215 1.00 0.00 WATR ATOM 849 HT HOH 141 -12.098 19.6406 20.4215 1.00 0.00 WATR ATOM 850 HT HOH 141 -13.612 19.6406 20.4215 1.00 0.00 WATR @@ -861,10 +861,10 @@ ATOM 856 HT HOH 143 -11.149 19.6406 22.8847 1.00 0.00 WATR ATOM 857 OT HOH 144 -12.855 21.5179 22.8847 1.00 0.00 WATR ATOM 858 HT HOH 144 -12.098 22.1038 22.8847 1.00 0.00 WATR ATOM 859 HT HOH 144 -13.612 22.1038 22.8847 1.00 0.00 WATR -ATOM 860 SOD ION 145 -12.855 19.0547 25.3479 1.00 0.00 SALT -ATOM 861 OT HOH 146 -10.392 21.5179 25.3479 1.00 0.00 WATR -ATOM 862 HT HOH 146 -9.6352 22.1038 25.3479 1.00 0.00 WATR -ATOM 863 HT HOH 146 -11.149 22.1038 25.3479 1.00 0.00 WATR +ATOM 860 OT HOH 145 -12.855 19.0547 25.3479 1.00 0.00 WATR +ATOM 861 HT HOH 145 -12.098 19.6406 25.3479 1.00 0.00 WATR +ATOM 862 HT HOH 145 -13.612 19.6406 25.3479 1.00 0.00 WATR +ATOM 863 SOD ION 146 -10.392 21.5179 25.3479 1.00 0.00 SALT ATOM 864 OT HOH 147 -10.392 19.0547 27.8111 1.00 0.00 WATR ATOM 865 HT HOH 147 -9.6352 19.6406 27.8111 1.00 0.00 WATR ATOM 866 HT HOH 147 -11.149 19.6406 27.8111 1.00 0.00 WATR @@ -904,95 +904,95 @@ ATOM 899 HT HOH 158 -6.2227 2.39816 0.71587 1.00 0.00 WATR ATOM 900 OT HOH 159 -5.4658 -0.6509 3.17907 1.00 0.00 WATR ATOM 901 HT HOH 159 -4.7088 -0.0650 3.17907 1.00 0.00 WATR ATOM 902 HT HOH 159 -6.2227 -0.0650 3.17907 1.00 0.00 WATR -ATOM 903 SOD ION 160 -7.9290 1.81228 3.17907 1.00 0.00 SALT -ATOM 904 OT HOH 161 -7.9290 -0.6509 5.64228 1.00 0.00 WATR -ATOM 905 HT HOH 161 -7.1720 -0.0650 5.64228 1.00 0.00 WATR -ATOM 906 HT HOH 161 -8.6859 -0.0650 5.64228 1.00 0.00 WATR -ATOM 907 OT HOH 162 -5.4658 1.81228 5.64228 1.00 0.00 WATR -ATOM 908 HT HOH 162 -4.7088 2.39816 5.64228 1.00 0.00 WATR -ATOM 909 HT HOH 162 -6.2227 2.39816 5.64228 1.00 0.00 WATR -ATOM 910 OT HOH 163 -5.4658 -0.6509 8.10548 1.00 0.00 WATR -ATOM 911 HT HOH 163 -4.7088 -0.0650 8.10548 1.00 0.00 WATR -ATOM 912 HT HOH 163 -6.2227 -0.0650 8.10548 1.00 0.00 WATR -ATOM 913 OT HOH 164 -7.9290 -0.6509 10.5686 1.00 0.00 WATR -ATOM 914 HT HOH 164 -7.1720 -0.0650 10.5686 1.00 0.00 WATR -ATOM 915 HT HOH 164 -8.6859 -0.0650 10.5686 1.00 0.00 WATR -ATOM 916 OT HOH 165 -5.4658 1.81228 10.5686 1.00 0.00 WATR -ATOM 917 HT HOH 165 -4.7088 2.39816 10.5686 1.00 0.00 WATR -ATOM 918 HT HOH 165 -6.2227 2.39816 10.5686 1.00 0.00 WATR -ATOM 919 OT HOH 166 -5.4658 -0.6509 17.9583 1.00 0.00 WATR -ATOM 920 HT HOH 166 -4.7088 -0.0650 17.9583 1.00 0.00 WATR -ATOM 921 HT HOH 166 -6.2227 -0.0650 17.9583 1.00 0.00 WATR -ATOM 922 OT HOH 167 -7.9290 1.81228 17.9583 1.00 0.00 WATR -ATOM 923 HT HOH 167 -7.1720 2.39816 17.9583 1.00 0.00 WATR -ATOM 924 HT HOH 167 -8.6859 2.39816 17.9583 1.00 0.00 WATR -ATOM 925 OT HOH 168 -7.9290 -0.6509 20.4215 1.00 0.00 WATR -ATOM 926 HT HOH 168 -7.1720 -0.0650 20.4215 1.00 0.00 WATR -ATOM 927 HT HOH 168 -8.6859 -0.0650 20.4215 1.00 0.00 WATR -ATOM 928 OT HOH 169 -5.4658 -0.6509 22.8847 1.00 0.00 WATR -ATOM 929 HT HOH 169 -4.7088 -0.0650 22.8847 1.00 0.00 WATR -ATOM 930 HT HOH 169 -6.2227 -0.0650 22.8847 1.00 0.00 WATR -ATOM 931 OT HOH 170 -7.9290 1.81228 22.8847 1.00 0.00 WATR -ATOM 932 HT HOH 170 -7.1720 2.39816 22.8847 1.00 0.00 WATR -ATOM 933 HT HOH 170 -8.6859 2.39816 22.8847 1.00 0.00 WATR -ATOM 934 OT HOH 171 -7.9290 -0.6509 25.3479 1.00 0.00 WATR -ATOM 935 HT HOH 171 -7.1720 -0.0650 25.3479 1.00 0.00 WATR -ATOM 936 HT HOH 171 -8.6859 -0.0650 25.3479 1.00 0.00 WATR -ATOM 937 OT HOH 172 -5.4658 1.81228 25.3479 1.00 0.00 WATR -ATOM 938 HT HOH 172 -4.7088 2.39816 25.3479 1.00 0.00 WATR -ATOM 939 HT HOH 172 -6.2227 2.39816 25.3479 1.00 0.00 WATR -ATOM 940 OT HOH 173 -5.4658 -0.6509 27.8111 1.00 0.00 WATR -ATOM 941 HT HOH 173 -4.7088 -0.0650 27.8111 1.00 0.00 WATR -ATOM 942 HT HOH 173 -6.2227 -0.0650 27.8111 1.00 0.00 WATR -ATOM 943 OT HOH 174 -7.9290 1.81228 27.8111 1.00 0.00 WATR -ATOM 944 HT HOH 174 -7.1720 2.39816 27.8111 1.00 0.00 WATR -ATOM 945 HT HOH 174 -8.6859 2.39816 27.8111 1.00 0.00 WATR -ATOM 946 OT HOH 175 -7.9290 -0.6509 30.2743 1.00 0.00 WATR -ATOM 947 HT HOH 175 -7.1720 -0.0650 30.2743 1.00 0.00 WATR -ATOM 948 HT HOH 175 -8.6859 -0.0650 30.2743 1.00 0.00 WATR -ATOM 949 OT HOH 176 -5.4658 1.81228 30.2743 1.00 0.00 WATR -ATOM 950 HT HOH 176 -4.7088 2.39816 30.2743 1.00 0.00 WATR -ATOM 951 HT HOH 176 -6.2227 2.39816 30.2743 1.00 0.00 WATR -ATOM 952 OT HOH 177 -5.4658 -0.6509 32.7375 1.00 0.00 WATR -ATOM 953 HT HOH 177 -4.7088 -0.0650 32.7375 1.00 0.00 WATR -ATOM 954 HT HOH 177 -6.2227 -0.0650 32.7375 1.00 0.00 WATR -ATOM 955 OT HOH 178 -7.9290 1.81228 32.7375 1.00 0.00 WATR -ATOM 956 HT HOH 178 -7.1720 2.39816 32.7375 1.00 0.00 WATR -ATOM 957 HT HOH 178 -8.6859 2.39816 32.7375 1.00 0.00 WATR -ATOM 958 SOD ION 179 -7.9290 4.27548 -4.2105 1.00 0.00 SALT -ATOM 959 OT HOH 180 -5.4658 6.73869 -4.2105 1.00 0.00 WATR -ATOM 960 HT HOH 180 -4.7088 7.32457 -4.2105 1.00 0.00 WATR -ATOM 961 HT HOH 180 -6.2227 7.32457 -4.2105 1.00 0.00 WATR -ATOM 962 OT HOH 181 -5.4658 4.27548 -1.7473 1.00 0.00 WATR -ATOM 963 HT HOH 181 -4.7088 4.86136 -1.7473 1.00 0.00 WATR -ATOM 964 HT HOH 181 -6.2227 4.86136 -1.7473 1.00 0.00 WATR -ATOM 965 OT HOH 182 -7.9290 6.73869 -1.7473 1.00 0.00 WATR -ATOM 966 HT HOH 182 -7.1720 7.32457 -1.7473 1.00 0.00 WATR -ATOM 967 HT HOH 182 -8.6859 7.32457 -1.7473 1.00 0.00 WATR -ATOM 968 OT HOH 183 -7.9290 4.27548 0.71587 1.00 0.00 WATR -ATOM 969 HT HOH 183 -7.1720 4.86136 0.71587 1.00 0.00 WATR -ATOM 970 HT HOH 183 -8.6859 4.86136 0.71587 1.00 0.00 WATR -ATOM 971 OT HOH 184 -5.4658 6.73869 0.71587 1.00 0.00 WATR -ATOM 972 HT HOH 184 -4.7088 7.32457 0.71587 1.00 0.00 WATR -ATOM 973 HT HOH 184 -6.2227 7.32457 0.71587 1.00 0.00 WATR -ATOM 974 OT HOH 185 -5.4658 4.27548 3.17907 1.00 0.00 WATR -ATOM 975 HT HOH 185 -4.7088 4.86136 3.17907 1.00 0.00 WATR -ATOM 976 HT HOH 185 -6.2227 4.86136 3.17907 1.00 0.00 WATR -ATOM 977 OT HOH 186 -7.9290 6.73869 3.17907 1.00 0.00 WATR -ATOM 978 HT HOH 186 -7.1720 7.32457 3.17907 1.00 0.00 WATR -ATOM 979 HT HOH 186 -8.6859 7.32457 3.17907 1.00 0.00 WATR -ATOM 980 OT HOH 187 -7.9290 4.27548 5.64228 1.00 0.00 WATR -ATOM 981 HT HOH 187 -7.1720 4.86136 5.64228 1.00 0.00 WATR -ATOM 982 HT HOH 187 -8.6859 4.86136 5.64228 1.00 0.00 WATR -ATOM 983 OT HOH 188 -7.9290 6.73869 17.9583 1.00 0.00 WATR -ATOM 984 HT HOH 188 -7.1720 7.32457 17.9583 1.00 0.00 WATR -ATOM 985 HT HOH 188 -8.6859 7.32457 17.9583 1.00 0.00 WATR -ATOM 986 OT HOH 189 -7.9290 4.27548 20.4215 1.00 0.00 WATR -ATOM 987 HT HOH 189 -7.1720 4.86136 20.4215 1.00 0.00 WATR -ATOM 988 HT HOH 189 -8.6859 4.86136 20.4215 1.00 0.00 WATR -ATOM 989 OT HOH 190 -7.9290 4.27548 25.3479 1.00 0.00 WATR -ATOM 990 HT HOH 190 -7.1720 4.86136 25.3479 1.00 0.00 WATR -ATOM 991 HT HOH 190 -8.6859 4.86136 25.3479 1.00 0.00 WATR +ATOM 903 OT HOH 160 -7.9290 1.81228 3.17907 1.00 0.00 WATR +ATOM 904 HT HOH 160 -7.1720 2.39816 3.17907 1.00 0.00 WATR +ATOM 905 HT HOH 160 -8.6859 2.39816 3.17907 1.00 0.00 WATR +ATOM 906 OT HOH 161 -7.9290 -0.6509 5.64228 1.00 0.00 WATR +ATOM 907 HT HOH 161 -7.1720 -0.0650 5.64228 1.00 0.00 WATR +ATOM 908 HT HOH 161 -8.6859 -0.0650 5.64228 1.00 0.00 WATR +ATOM 909 OT HOH 162 -5.4658 1.81228 5.64228 1.00 0.00 WATR +ATOM 910 HT HOH 162 -4.7088 2.39816 5.64228 1.00 0.00 WATR +ATOM 911 HT HOH 162 -6.2227 2.39816 5.64228 1.00 0.00 WATR +ATOM 912 OT HOH 163 -5.4658 -0.6509 8.10548 1.00 0.00 WATR +ATOM 913 HT HOH 163 -4.7088 -0.0650 8.10548 1.00 0.00 WATR +ATOM 914 HT HOH 163 -6.2227 -0.0650 8.10548 1.00 0.00 WATR +ATOM 915 OT HOH 164 -7.9290 -0.6509 10.5686 1.00 0.00 WATR +ATOM 916 HT HOH 164 -7.1720 -0.0650 10.5686 1.00 0.00 WATR +ATOM 917 HT HOH 164 -8.6859 -0.0650 10.5686 1.00 0.00 WATR +ATOM 918 OT HOH 165 -5.4658 1.81228 10.5686 1.00 0.00 WATR +ATOM 919 HT HOH 165 -4.7088 2.39816 10.5686 1.00 0.00 WATR +ATOM 920 HT HOH 165 -6.2227 2.39816 10.5686 1.00 0.00 WATR +ATOM 921 OT HOH 166 -5.4658 -0.6509 17.9583 1.00 0.00 WATR +ATOM 922 HT HOH 166 -4.7088 -0.0650 17.9583 1.00 0.00 WATR +ATOM 923 HT HOH 166 -6.2227 -0.0650 17.9583 1.00 0.00 WATR +ATOM 924 OT HOH 167 -7.9290 1.81228 17.9583 1.00 0.00 WATR +ATOM 925 HT HOH 167 -7.1720 2.39816 17.9583 1.00 0.00 WATR +ATOM 926 HT HOH 167 -8.6859 2.39816 17.9583 1.00 0.00 WATR +ATOM 927 OT HOH 168 -7.9290 -0.6509 20.4215 1.00 0.00 WATR +ATOM 928 HT HOH 168 -7.1720 -0.0650 20.4215 1.00 0.00 WATR +ATOM 929 HT HOH 168 -8.6859 -0.0650 20.4215 1.00 0.00 WATR +ATOM 930 OT HOH 169 -5.4658 -0.6509 22.8847 1.00 0.00 WATR +ATOM 931 HT HOH 169 -4.7088 -0.0650 22.8847 1.00 0.00 WATR +ATOM 932 HT HOH 169 -6.2227 -0.0650 22.8847 1.00 0.00 WATR +ATOM 933 OT HOH 170 -7.9290 1.81228 22.8847 1.00 0.00 WATR +ATOM 934 HT HOH 170 -7.1720 2.39816 22.8847 1.00 0.00 WATR +ATOM 935 HT HOH 170 -8.6859 2.39816 22.8847 1.00 0.00 WATR +ATOM 936 OT HOH 171 -7.9290 -0.6509 25.3479 1.00 0.00 WATR +ATOM 937 HT HOH 171 -7.1720 -0.0650 25.3479 1.00 0.00 WATR +ATOM 938 HT HOH 171 -8.6859 -0.0650 25.3479 1.00 0.00 WATR +ATOM 939 OT HOH 172 -5.4658 1.81228 25.3479 1.00 0.00 WATR +ATOM 940 HT HOH 172 -4.7088 2.39816 25.3479 1.00 0.00 WATR +ATOM 941 HT HOH 172 -6.2227 2.39816 25.3479 1.00 0.00 WATR +ATOM 942 OT HOH 173 -5.4658 -0.6509 27.8111 1.00 0.00 WATR +ATOM 943 HT HOH 173 -4.7088 -0.0650 27.8111 1.00 0.00 WATR +ATOM 944 HT HOH 173 -6.2227 -0.0650 27.8111 1.00 0.00 WATR +ATOM 945 OT HOH 174 -7.9290 1.81228 27.8111 1.00 0.00 WATR +ATOM 946 HT HOH 174 -7.1720 2.39816 27.8111 1.00 0.00 WATR +ATOM 947 HT HOH 174 -8.6859 2.39816 27.8111 1.00 0.00 WATR +ATOM 948 OT HOH 175 -7.9290 -0.6509 30.2743 1.00 0.00 WATR +ATOM 949 HT HOH 175 -7.1720 -0.0650 30.2743 1.00 0.00 WATR +ATOM 950 HT HOH 175 -8.6859 -0.0650 30.2743 1.00 0.00 WATR +ATOM 951 OT HOH 176 -5.4658 1.81228 30.2743 1.00 0.00 WATR +ATOM 952 HT HOH 176 -4.7088 2.39816 30.2743 1.00 0.00 WATR +ATOM 953 HT HOH 176 -6.2227 2.39816 30.2743 1.00 0.00 WATR +ATOM 954 OT HOH 177 -5.4658 -0.6509 32.7375 1.00 0.00 WATR +ATOM 955 HT HOH 177 -4.7088 -0.0650 32.7375 1.00 0.00 WATR +ATOM 956 HT HOH 177 -6.2227 -0.0650 32.7375 1.00 0.00 WATR +ATOM 957 OT HOH 178 -7.9290 1.81228 32.7375 1.00 0.00 WATR +ATOM 958 HT HOH 178 -7.1720 2.39816 32.7375 1.00 0.00 WATR +ATOM 959 HT HOH 178 -8.6859 2.39816 32.7375 1.00 0.00 WATR +ATOM 960 OT HOH 179 -7.9290 4.27548 -4.2105 1.00 0.00 WATR +ATOM 961 HT HOH 179 -7.1720 4.86136 -4.2105 1.00 0.00 WATR +ATOM 962 HT HOH 179 -8.6859 4.86136 -4.2105 1.00 0.00 WATR +ATOM 963 OT HOH 180 -5.4658 6.73869 -4.2105 1.00 0.00 WATR +ATOM 964 HT HOH 180 -4.7088 7.32457 -4.2105 1.00 0.00 WATR +ATOM 965 HT HOH 180 -6.2227 7.32457 -4.2105 1.00 0.00 WATR +ATOM 966 OT HOH 181 -5.4658 4.27548 -1.7473 1.00 0.00 WATR +ATOM 967 HT HOH 181 -4.7088 4.86136 -1.7473 1.00 0.00 WATR +ATOM 968 HT HOH 181 -6.2227 4.86136 -1.7473 1.00 0.00 WATR +ATOM 969 OT HOH 182 -7.9290 6.73869 -1.7473 1.00 0.00 WATR +ATOM 970 HT HOH 182 -7.1720 7.32457 -1.7473 1.00 0.00 WATR +ATOM 971 HT HOH 182 -8.6859 7.32457 -1.7473 1.00 0.00 WATR +ATOM 972 OT HOH 183 -7.9290 4.27548 0.71587 1.00 0.00 WATR +ATOM 973 HT HOH 183 -7.1720 4.86136 0.71587 1.00 0.00 WATR +ATOM 974 HT HOH 183 -8.6859 4.86136 0.71587 1.00 0.00 WATR +ATOM 975 OT HOH 184 -5.4658 6.73869 0.71587 1.00 0.00 WATR +ATOM 976 HT HOH 184 -4.7088 7.32457 0.71587 1.00 0.00 WATR +ATOM 977 HT HOH 184 -6.2227 7.32457 0.71587 1.00 0.00 WATR +ATOM 978 OT HOH 185 -5.4658 4.27548 3.17907 1.00 0.00 WATR +ATOM 979 HT HOH 185 -4.7088 4.86136 3.17907 1.00 0.00 WATR +ATOM 980 HT HOH 185 -6.2227 4.86136 3.17907 1.00 0.00 WATR +ATOM 981 OT HOH 186 -7.9290 6.73869 3.17907 1.00 0.00 WATR +ATOM 982 HT HOH 186 -7.1720 7.32457 3.17907 1.00 0.00 WATR +ATOM 983 HT HOH 186 -8.6859 7.32457 3.17907 1.00 0.00 WATR +ATOM 984 SOD ION 187 -7.9290 4.27548 5.64228 1.00 0.00 SALT +ATOM 985 OT HOH 188 -7.9290 6.73869 17.9583 1.00 0.00 WATR +ATOM 986 HT HOH 188 -7.1720 7.32457 17.9583 1.00 0.00 WATR +ATOM 987 HT HOH 188 -8.6859 7.32457 17.9583 1.00 0.00 WATR +ATOM 988 OT HOH 189 -7.9290 4.27548 20.4215 1.00 0.00 WATR +ATOM 989 HT HOH 189 -7.1720 4.86136 20.4215 1.00 0.00 WATR +ATOM 990 HT HOH 189 -8.6859 4.86136 20.4215 1.00 0.00 WATR +ATOM 991 SOD ION 190 -7.9290 4.27548 25.3479 1.00 0.00 SALT ATOM 992 OT HOH 191 -5.4658 4.27548 27.8111 1.00 0.00 WATR ATOM 993 HT HOH 191 -4.7088 4.86136 27.8111 1.00 0.00 WATR ATOM 994 HT HOH 191 -6.2227 4.86136 27.8111 1.00 0.00 WATR @@ -1038,64 +1038,64 @@ ATOM 1033 HT HOH 204 -8.6859 17.1773 27.8111 1.00 0.00 WATR ATOM 1034 OT HOH 205 -7.9290 14.1283 30.2743 1.00 0.00 WATR ATOM 1035 HT HOH 205 -7.1720 14.7141 30.2743 1.00 0.00 WATR ATOM 1036 HT HOH 205 -8.6859 14.7141 30.2743 1.00 0.00 WATR -ATOM 1037 SOD ION 206 -5.4658 16.5915 30.2743 1.00 0.00 SALT -ATOM 1038 OT HOH 207 -7.9290 16.5915 32.7375 1.00 0.00 WATR -ATOM 1039 HT HOH 207 -7.1720 17.1773 32.7375 1.00 0.00 WATR -ATOM 1040 HT HOH 207 -8.6859 17.1773 32.7375 1.00 0.00 WATR -ATOM 1041 OT HOH 208 -7.9290 19.0547 -4.2105 1.00 0.00 WATR -ATOM 1042 HT HOH 208 -7.1720 19.6406 -4.2105 1.00 0.00 WATR -ATOM 1043 HT HOH 208 -8.6859 19.6406 -4.2105 1.00 0.00 WATR -ATOM 1044 OT HOH 209 -5.4658 21.5179 -4.2105 1.00 0.00 WATR -ATOM 1045 HT HOH 209 -4.7088 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1046 HT HOH 209 -6.2227 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1047 OT HOH 210 -7.9290 21.5179 -1.7473 1.00 0.00 WATR -ATOM 1048 HT HOH 210 -7.1720 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1049 HT HOH 210 -8.6859 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1050 OT HOH 211 -7.9290 21.5179 3.17907 1.00 0.00 WATR -ATOM 1051 HT HOH 211 -7.1720 22.1038 3.17907 1.00 0.00 WATR -ATOM 1052 HT HOH 211 -8.6859 22.1038 3.17907 1.00 0.00 WATR -ATOM 1053 OT HOH 212 -7.9290 19.0547 5.64228 1.00 0.00 WATR -ATOM 1054 HT HOH 212 -7.1720 19.6406 5.64228 1.00 0.00 WATR -ATOM 1055 HT HOH 212 -8.6859 19.6406 5.64228 1.00 0.00 WATR -ATOM 1056 OT HOH 213 -5.4658 21.5179 5.64228 1.00 0.00 WATR -ATOM 1057 HT HOH 213 -4.7088 22.1038 5.64228 1.00 0.00 WATR -ATOM 1058 HT HOH 213 -6.2227 22.1038 5.64228 1.00 0.00 WATR -ATOM 1059 OT HOH 214 -7.9290 21.5179 8.10548 1.00 0.00 WATR -ATOM 1060 HT HOH 214 -7.1720 22.1038 8.10548 1.00 0.00 WATR -ATOM 1061 HT HOH 214 -8.6859 22.1038 8.10548 1.00 0.00 WATR -ATOM 1062 OT HOH 215 -5.4658 21.5179 20.4215 1.00 0.00 WATR -ATOM 1063 HT HOH 215 -4.7088 22.1038 20.4215 1.00 0.00 WATR -ATOM 1064 HT HOH 215 -6.2227 22.1038 20.4215 1.00 0.00 WATR -ATOM 1065 OT HOH 216 -7.9290 21.5179 22.8847 1.00 0.00 WATR -ATOM 1066 HT HOH 216 -7.1720 22.1038 22.8847 1.00 0.00 WATR -ATOM 1067 HT HOH 216 -8.6859 22.1038 22.8847 1.00 0.00 WATR -ATOM 1068 OT HOH 217 -5.4658 21.5179 25.3479 1.00 0.00 WATR -ATOM 1069 HT HOH 217 -4.7088 22.1038 25.3479 1.00 0.00 WATR -ATOM 1070 HT HOH 217 -6.2227 22.1038 25.3479 1.00 0.00 WATR -ATOM 1071 OT HOH 218 -5.4658 19.0547 27.8111 1.00 0.00 WATR -ATOM 1072 HT HOH 218 -4.7088 19.6406 27.8111 1.00 0.00 WATR -ATOM 1073 HT HOH 218 -6.2227 19.6406 27.8111 1.00 0.00 WATR -ATOM 1074 OT HOH 219 -7.9290 21.5179 27.8111 1.00 0.00 WATR -ATOM 1075 HT HOH 219 -7.1720 22.1038 27.8111 1.00 0.00 WATR -ATOM 1076 HT HOH 219 -8.6859 22.1038 27.8111 1.00 0.00 WATR -ATOM 1077 OT HOH 220 -7.9290 19.0547 30.2743 1.00 0.00 WATR -ATOM 1078 HT HOH 220 -7.1720 19.6406 30.2743 1.00 0.00 WATR -ATOM 1079 HT HOH 220 -8.6859 19.6406 30.2743 1.00 0.00 WATR -ATOM 1080 OT HOH 221 -5.4658 21.5179 30.2743 1.00 0.00 WATR -ATOM 1081 HT HOH 221 -4.7088 22.1038 30.2743 1.00 0.00 WATR -ATOM 1082 HT HOH 221 -6.2227 22.1038 30.2743 1.00 0.00 WATR -ATOM 1083 OT HOH 222 -5.4658 19.0547 32.7375 1.00 0.00 WATR -ATOM 1084 HT HOH 222 -4.7088 19.6406 32.7375 1.00 0.00 WATR -ATOM 1085 HT HOH 222 -6.2227 19.6406 32.7375 1.00 0.00 WATR -ATOM 1086 OT HOH 223 -7.9290 21.5179 32.7375 1.00 0.00 WATR -ATOM 1087 HT HOH 223 -7.1720 22.1038 32.7375 1.00 0.00 WATR -ATOM 1088 HT HOH 223 -8.6859 22.1038 32.7375 1.00 0.00 WATR -ATOM 1089 OT HOH 224 -3.0026 -0.6509 -4.2105 1.00 0.00 WATR -ATOM 1090 HT HOH 224 -2.2456 -0.0650 -4.2105 1.00 0.00 WATR -ATOM 1091 HT HOH 224 -3.7595 -0.0650 -4.2105 1.00 0.00 WATR -ATOM 1092 OT HOH 225 -0.5393 1.81228 -4.2105 1.00 0.00 WATR -ATOM 1093 HT HOH 225 0.21755 2.39816 -4.2105 1.00 0.00 WATR -ATOM 1094 HT HOH 225 -1.2963 2.39816 -4.2105 1.00 0.00 WATR +ATOM 1037 OT HOH 206 -5.4658 16.5915 30.2743 1.00 0.00 WATR +ATOM 1038 HT HOH 206 -4.7088 17.1773 30.2743 1.00 0.00 WATR +ATOM 1039 HT HOH 206 -6.2227 17.1773 30.2743 1.00 0.00 WATR +ATOM 1040 OT HOH 207 -7.9290 16.5915 32.7375 1.00 0.00 WATR +ATOM 1041 HT HOH 207 -7.1720 17.1773 32.7375 1.00 0.00 WATR +ATOM 1042 HT HOH 207 -8.6859 17.1773 32.7375 1.00 0.00 WATR +ATOM 1043 OT HOH 208 -7.9290 19.0547 -4.2105 1.00 0.00 WATR +ATOM 1044 HT HOH 208 -7.1720 19.6406 -4.2105 1.00 0.00 WATR +ATOM 1045 HT HOH 208 -8.6859 19.6406 -4.2105 1.00 0.00 WATR +ATOM 1046 OT HOH 209 -5.4658 21.5179 -4.2105 1.00 0.00 WATR +ATOM 1047 HT HOH 209 -4.7088 22.1038 -4.2105 1.00 0.00 WATR +ATOM 1048 HT HOH 209 -6.2227 22.1038 -4.2105 1.00 0.00 WATR +ATOM 1049 OT HOH 210 -7.9290 21.5179 -1.7473 1.00 0.00 WATR +ATOM 1050 HT HOH 210 -7.1720 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1051 HT HOH 210 -8.6859 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1052 OT HOH 211 -7.9290 21.5179 3.17907 1.00 0.00 WATR +ATOM 1053 HT HOH 211 -7.1720 22.1038 3.17907 1.00 0.00 WATR +ATOM 1054 HT HOH 211 -8.6859 22.1038 3.17907 1.00 0.00 WATR +ATOM 1055 OT HOH 212 -7.9290 19.0547 5.64228 1.00 0.00 WATR +ATOM 1056 HT HOH 212 -7.1720 19.6406 5.64228 1.00 0.00 WATR +ATOM 1057 HT HOH 212 -8.6859 19.6406 5.64228 1.00 0.00 WATR +ATOM 1058 OT HOH 213 -5.4658 21.5179 5.64228 1.00 0.00 WATR +ATOM 1059 HT HOH 213 -4.7088 22.1038 5.64228 1.00 0.00 WATR +ATOM 1060 HT HOH 213 -6.2227 22.1038 5.64228 1.00 0.00 WATR +ATOM 1061 OT HOH 214 -7.9290 21.5179 8.10548 1.00 0.00 WATR +ATOM 1062 HT HOH 214 -7.1720 22.1038 8.10548 1.00 0.00 WATR +ATOM 1063 HT HOH 214 -8.6859 22.1038 8.10548 1.00 0.00 WATR +ATOM 1064 OT HOH 215 -5.4658 21.5179 20.4215 1.00 0.00 WATR +ATOM 1065 HT HOH 215 -4.7088 22.1038 20.4215 1.00 0.00 WATR +ATOM 1066 HT HOH 215 -6.2227 22.1038 20.4215 1.00 0.00 WATR +ATOM 1067 OT HOH 216 -7.9290 21.5179 22.8847 1.00 0.00 WATR +ATOM 1068 HT HOH 216 -7.1720 22.1038 22.8847 1.00 0.00 WATR +ATOM 1069 HT HOH 216 -8.6859 22.1038 22.8847 1.00 0.00 WATR +ATOM 1070 OT HOH 217 -5.4658 21.5179 25.3479 1.00 0.00 WATR +ATOM 1071 HT HOH 217 -4.7088 22.1038 25.3479 1.00 0.00 WATR +ATOM 1072 HT HOH 217 -6.2227 22.1038 25.3479 1.00 0.00 WATR +ATOM 1073 OT HOH 218 -5.4658 19.0547 27.8111 1.00 0.00 WATR +ATOM 1074 HT HOH 218 -4.7088 19.6406 27.8111 1.00 0.00 WATR +ATOM 1075 HT HOH 218 -6.2227 19.6406 27.8111 1.00 0.00 WATR +ATOM 1076 OT HOH 219 -7.9290 21.5179 27.8111 1.00 0.00 WATR +ATOM 1077 HT HOH 219 -7.1720 22.1038 27.8111 1.00 0.00 WATR +ATOM 1078 HT HOH 219 -8.6859 22.1038 27.8111 1.00 0.00 WATR +ATOM 1079 OT HOH 220 -7.9290 19.0547 30.2743 1.00 0.00 WATR +ATOM 1080 HT HOH 220 -7.1720 19.6406 30.2743 1.00 0.00 WATR +ATOM 1081 HT HOH 220 -8.6859 19.6406 30.2743 1.00 0.00 WATR +ATOM 1082 OT HOH 221 -5.4658 21.5179 30.2743 1.00 0.00 WATR +ATOM 1083 HT HOH 221 -4.7088 22.1038 30.2743 1.00 0.00 WATR +ATOM 1084 HT HOH 221 -6.2227 22.1038 30.2743 1.00 0.00 WATR +ATOM 1085 OT HOH 222 -5.4658 19.0547 32.7375 1.00 0.00 WATR +ATOM 1086 HT HOH 222 -4.7088 19.6406 32.7375 1.00 0.00 WATR +ATOM 1087 HT HOH 222 -6.2227 19.6406 32.7375 1.00 0.00 WATR +ATOM 1088 OT HOH 223 -7.9290 21.5179 32.7375 1.00 0.00 WATR +ATOM 1089 HT HOH 223 -7.1720 22.1038 32.7375 1.00 0.00 WATR +ATOM 1090 HT HOH 223 -8.6859 22.1038 32.7375 1.00 0.00 WATR +ATOM 1091 OT HOH 224 -3.0026 -0.6509 -4.2105 1.00 0.00 WATR +ATOM 1092 HT HOH 224 -2.2456 -0.0650 -4.2105 1.00 0.00 WATR +ATOM 1093 HT HOH 224 -3.7595 -0.0650 -4.2105 1.00 0.00 WATR +ATOM 1094 SOD ION 225 -0.5393 1.81228 -4.2105 1.00 0.00 SALT ATOM 1095 OT HOH 226 -0.5393 -0.6509 -1.7473 1.00 0.00 WATR ATOM 1096 HT HOH 226 0.21755 -0.0650 -1.7473 1.00 0.00 WATR ATOM 1097 HT HOH 226 -1.2963 -0.0650 -1.7473 1.00 0.00 WATR @@ -1126,468 +1126,468 @@ ATOM 1121 HT HOH 234 -1.2963 -0.0650 8.10548 1.00 0.00 WATR ATOM 1122 OT HOH 235 -3.0026 1.81228 8.10548 1.00 0.00 WATR ATOM 1123 HT HOH 235 -2.2456 2.39816 8.10548 1.00 0.00 WATR ATOM 1124 HT HOH 235 -3.7595 2.39816 8.10548 1.00 0.00 WATR -ATOM 1125 OT HOH 236 -3.0026 -0.6509 10.5686 1.00 0.00 WATR -ATOM 1126 HT HOH 236 -2.2456 -0.0650 10.5686 1.00 0.00 WATR -ATOM 1127 HT HOH 236 -3.7595 -0.0650 10.5686 1.00 0.00 WATR -ATOM 1128 OT HOH 237 -0.5393 1.81228 10.5686 1.00 0.00 WATR -ATOM 1129 HT HOH 237 0.21755 2.39816 10.5686 1.00 0.00 WATR -ATOM 1130 HT HOH 237 -1.2963 2.39816 10.5686 1.00 0.00 WATR -ATOM 1131 OT HOH 238 -0.5393 -0.6509 13.0318 1.00 0.00 WATR -ATOM 1132 HT HOH 238 0.21755 -0.0650 13.0318 1.00 0.00 WATR -ATOM 1133 HT HOH 238 -1.2963 -0.0650 13.0318 1.00 0.00 WATR -ATOM 1134 OT HOH 239 -0.5393 -0.6509 17.9583 1.00 0.00 WATR -ATOM 1135 HT HOH 239 0.21755 -0.0650 17.9583 1.00 0.00 WATR -ATOM 1136 HT HOH 239 -1.2963 -0.0650 17.9583 1.00 0.00 WATR -ATOM 1137 OT HOH 240 -3.0026 -0.6509 20.4215 1.00 0.00 WATR -ATOM 1138 HT HOH 240 -2.2456 -0.0650 20.4215 1.00 0.00 WATR -ATOM 1139 HT HOH 240 -3.7595 -0.0650 20.4215 1.00 0.00 WATR -ATOM 1140 OT HOH 241 -0.5393 -0.6509 22.8847 1.00 0.00 WATR -ATOM 1141 HT HOH 241 0.21755 -0.0650 22.8847 1.00 0.00 WATR -ATOM 1142 HT HOH 241 -1.2963 -0.0650 22.8847 1.00 0.00 WATR -ATOM 1143 OT HOH 242 -3.0026 1.81228 22.8847 1.00 0.00 WATR -ATOM 1144 HT HOH 242 -2.2456 2.39816 22.8847 1.00 0.00 WATR -ATOM 1145 HT HOH 242 -3.7595 2.39816 22.8847 1.00 0.00 WATR -ATOM 1146 OT HOH 243 -3.0026 -0.6509 25.3479 1.00 0.00 WATR -ATOM 1147 HT HOH 243 -2.2456 -0.0650 25.3479 1.00 0.00 WATR -ATOM 1148 HT HOH 243 -3.7595 -0.0650 25.3479 1.00 0.00 WATR -ATOM 1149 OT HOH 244 -0.5393 1.81228 25.3479 1.00 0.00 WATR -ATOM 1150 HT HOH 244 0.21755 2.39816 25.3479 1.00 0.00 WATR -ATOM 1151 HT HOH 244 -1.2963 2.39816 25.3479 1.00 0.00 WATR -ATOM 1152 OT HOH 245 -0.5393 -0.6509 27.8111 1.00 0.00 WATR -ATOM 1153 HT HOH 245 0.21755 -0.0650 27.8111 1.00 0.00 WATR -ATOM 1154 HT HOH 245 -1.2963 -0.0650 27.8111 1.00 0.00 WATR -ATOM 1155 OT HOH 246 -3.0026 1.81228 27.8111 1.00 0.00 WATR -ATOM 1156 HT HOH 246 -2.2456 2.39816 27.8111 1.00 0.00 WATR -ATOM 1157 HT HOH 246 -3.7595 2.39816 27.8111 1.00 0.00 WATR -ATOM 1158 OT HOH 247 -3.0026 -0.6509 30.2743 1.00 0.00 WATR -ATOM 1159 HT HOH 247 -2.2456 -0.0650 30.2743 1.00 0.00 WATR -ATOM 1160 HT HOH 247 -3.7595 -0.0650 30.2743 1.00 0.00 WATR -ATOM 1161 OT HOH 248 -0.5393 1.81228 30.2743 1.00 0.00 WATR -ATOM 1162 HT HOH 248 0.21755 2.39816 30.2743 1.00 0.00 WATR -ATOM 1163 HT HOH 248 -1.2963 2.39816 30.2743 1.00 0.00 WATR -ATOM 1164 OT HOH 249 -0.5393 -0.6509 32.7375 1.00 0.00 WATR -ATOM 1165 HT HOH 249 0.21755 -0.0650 32.7375 1.00 0.00 WATR -ATOM 1166 HT HOH 249 -1.2963 -0.0650 32.7375 1.00 0.00 WATR -ATOM 1167 OT HOH 250 -3.0026 1.81228 32.7375 1.00 0.00 WATR -ATOM 1168 HT HOH 250 -2.2456 2.39816 32.7375 1.00 0.00 WATR -ATOM 1169 HT HOH 250 -3.7595 2.39816 32.7375 1.00 0.00 WATR -ATOM 1170 OT HOH 251 -3.0026 4.27548 -4.2105 1.00 0.00 WATR -ATOM 1171 HT HOH 251 -2.2456 4.86136 -4.2105 1.00 0.00 WATR -ATOM 1172 HT HOH 251 -3.7595 4.86136 -4.2105 1.00 0.00 WATR -ATOM 1173 OT HOH 252 -0.5393 6.73869 -4.2105 1.00 0.00 WATR -ATOM 1174 HT HOH 252 0.21755 7.32457 -4.2105 1.00 0.00 WATR -ATOM 1175 HT HOH 252 -1.2963 7.32457 -4.2105 1.00 0.00 WATR -ATOM 1176 OT HOH 253 -3.0026 4.27548 0.71587 1.00 0.00 WATR -ATOM 1177 HT HOH 253 -2.2456 4.86136 0.71587 1.00 0.00 WATR -ATOM 1178 HT HOH 253 -3.7595 4.86136 0.71587 1.00 0.00 WATR -ATOM 1179 OT HOH 254 -3.0026 4.27548 5.64228 1.00 0.00 WATR -ATOM 1180 HT HOH 254 -2.2456 4.86136 5.64228 1.00 0.00 WATR -ATOM 1181 HT HOH 254 -3.7595 4.86136 5.64228 1.00 0.00 WATR -ATOM 1182 OT HOH 255 -0.5393 4.27548 8.10548 1.00 0.00 WATR -ATOM 1183 HT HOH 255 0.21755 4.86136 8.10548 1.00 0.00 WATR -ATOM 1184 HT HOH 255 -1.2963 4.86136 8.10548 1.00 0.00 WATR -ATOM 1185 OT HOH 256 -3.0026 4.27548 10.5686 1.00 0.00 WATR -ATOM 1186 HT HOH 256 -2.2456 4.86136 10.5686 1.00 0.00 WATR -ATOM 1187 HT HOH 256 -3.7595 4.86136 10.5686 1.00 0.00 WATR -ATOM 1188 OT HOH 257 -0.5393 4.27548 13.0318 1.00 0.00 WATR -ATOM 1189 HT HOH 257 0.21755 4.86136 13.0318 1.00 0.00 WATR -ATOM 1190 HT HOH 257 -1.2963 4.86136 13.0318 1.00 0.00 WATR -ATOM 1191 OT HOH 258 -0.5393 4.27548 27.8111 1.00 0.00 WATR -ATOM 1192 HT HOH 258 0.21755 4.86136 27.8111 1.00 0.00 WATR -ATOM 1193 HT HOH 258 -1.2963 4.86136 27.8111 1.00 0.00 WATR -ATOM 1194 OT HOH 259 -3.0026 4.27548 30.2743 1.00 0.00 WATR -ATOM 1195 HT HOH 259 -2.2456 4.86136 30.2743 1.00 0.00 WATR -ATOM 1196 HT HOH 259 -3.7595 4.86136 30.2743 1.00 0.00 WATR -ATOM 1197 OT HOH 260 -0.5393 6.73869 30.2743 1.00 0.00 WATR -ATOM 1198 HT HOH 260 0.21755 7.32457 30.2743 1.00 0.00 WATR -ATOM 1199 HT HOH 260 -1.2963 7.32457 30.2743 1.00 0.00 WATR -ATOM 1200 OT HOH 261 -0.5393 4.27548 32.7375 1.00 0.00 WATR -ATOM 1201 HT HOH 261 0.21755 4.86136 32.7375 1.00 0.00 WATR -ATOM 1202 HT HOH 261 -1.2963 4.86136 32.7375 1.00 0.00 WATR -ATOM 1203 OT HOH 262 -3.0026 6.73869 32.7375 1.00 0.00 WATR -ATOM 1204 HT HOH 262 -2.2456 7.32457 32.7375 1.00 0.00 WATR -ATOM 1205 HT HOH 262 -3.7595 7.32457 32.7375 1.00 0.00 WATR -ATOM 1206 OT HOH 263 -0.5393 9.20189 32.7375 1.00 0.00 WATR -ATOM 1207 HT HOH 263 0.21755 9.78777 32.7375 1.00 0.00 WATR -ATOM 1208 HT HOH 263 -1.2963 9.78777 32.7375 1.00 0.00 WATR -ATOM 1209 OT HOH 264 -0.5393 21.5179 -4.2105 1.00 0.00 WATR -ATOM 1210 HT HOH 264 0.21755 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1211 HT HOH 264 -1.2963 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1212 OT HOH 265 -3.0026 21.5179 -1.7473 1.00 0.00 WATR -ATOM 1213 HT HOH 265 -2.2456 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1214 HT HOH 265 -3.7595 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1215 OT HOH 266 -0.5393 21.5179 0.71587 1.00 0.00 WATR -ATOM 1216 HT HOH 266 0.21755 22.1038 0.71587 1.00 0.00 WATR -ATOM 1217 HT HOH 266 -1.2963 22.1038 0.71587 1.00 0.00 WATR -ATOM 1218 OT HOH 267 -0.5393 19.0547 3.17907 1.00 0.00 WATR -ATOM 1219 HT HOH 267 0.21755 19.6406 3.17907 1.00 0.00 WATR -ATOM 1220 HT HOH 267 -1.2963 19.6406 3.17907 1.00 0.00 WATR -ATOM 1221 OT HOH 268 -3.0026 21.5179 3.17907 1.00 0.00 WATR -ATOM 1222 HT HOH 268 -2.2456 22.1038 3.17907 1.00 0.00 WATR -ATOM 1223 HT HOH 268 -3.7595 22.1038 3.17907 1.00 0.00 WATR -ATOM 1224 OT HOH 269 -3.0026 19.0547 5.64228 1.00 0.00 WATR -ATOM 1225 HT HOH 269 -2.2456 19.6406 5.64228 1.00 0.00 WATR -ATOM 1226 HT HOH 269 -3.7595 19.6406 5.64228 1.00 0.00 WATR -ATOM 1227 OT HOH 270 -0.5393 21.5179 5.64228 1.00 0.00 WATR -ATOM 1228 HT HOH 270 0.21755 22.1038 5.64228 1.00 0.00 WATR -ATOM 1229 HT HOH 270 -1.2963 22.1038 5.64228 1.00 0.00 WATR -ATOM 1230 OT HOH 271 -0.5393 21.5179 15.4951 1.00 0.00 WATR -ATOM 1231 HT HOH 271 0.21755 22.1038 15.4951 1.00 0.00 WATR -ATOM 1232 HT HOH 271 -1.2963 22.1038 15.4951 1.00 0.00 WATR -ATOM 1233 OT HOH 272 -3.0026 21.5179 17.9583 1.00 0.00 WATR -ATOM 1234 HT HOH 272 -2.2456 22.1038 17.9583 1.00 0.00 WATR -ATOM 1235 HT HOH 272 -3.7595 22.1038 17.9583 1.00 0.00 WATR -ATOM 1236 OT HOH 273 -0.5393 21.5179 20.4215 1.00 0.00 WATR -ATOM 1237 HT HOH 273 0.21755 22.1038 20.4215 1.00 0.00 WATR -ATOM 1238 HT HOH 273 -1.2963 22.1038 20.4215 1.00 0.00 WATR -ATOM 1239 OT HOH 274 -0.5393 19.0547 22.8847 1.00 0.00 WATR -ATOM 1240 HT HOH 274 0.21755 19.6406 22.8847 1.00 0.00 WATR -ATOM 1241 HT HOH 274 -1.2963 19.6406 22.8847 1.00 0.00 WATR -ATOM 1242 OT HOH 275 -3.0026 21.5179 22.8847 1.00 0.00 WATR -ATOM 1243 HT HOH 275 -2.2456 22.1038 22.8847 1.00 0.00 WATR -ATOM 1244 HT HOH 275 -3.7595 22.1038 22.8847 1.00 0.00 WATR -ATOM 1245 OT HOH 276 -0.5393 21.5179 25.3479 1.00 0.00 WATR -ATOM 1246 HT HOH 276 0.21755 22.1038 25.3479 1.00 0.00 WATR -ATOM 1247 HT HOH 276 -1.2963 22.1038 25.3479 1.00 0.00 WATR -ATOM 1248 OT HOH 277 -0.5393 19.0547 27.8111 1.00 0.00 WATR -ATOM 1249 HT HOH 277 0.21755 19.6406 27.8111 1.00 0.00 WATR -ATOM 1250 HT HOH 277 -1.2963 19.6406 27.8111 1.00 0.00 WATR -ATOM 1251 OT HOH 278 -3.0026 21.5179 27.8111 1.00 0.00 WATR -ATOM 1252 HT HOH 278 -2.2456 22.1038 27.8111 1.00 0.00 WATR -ATOM 1253 HT HOH 278 -3.7595 22.1038 27.8111 1.00 0.00 WATR -ATOM 1254 OT HOH 279 -3.0026 19.0547 30.2743 1.00 0.00 WATR -ATOM 1255 HT HOH 279 -2.2456 19.6406 30.2743 1.00 0.00 WATR -ATOM 1256 HT HOH 279 -3.7595 19.6406 30.2743 1.00 0.00 WATR -ATOM 1257 OT HOH 280 -0.5393 21.5179 30.2743 1.00 0.00 WATR -ATOM 1258 HT HOH 280 0.21755 22.1038 30.2743 1.00 0.00 WATR -ATOM 1259 HT HOH 280 -1.2963 22.1038 30.2743 1.00 0.00 WATR -ATOM 1260 SOD ION 281 -0.5393 19.0547 32.7375 1.00 0.00 SALT -ATOM 1261 OT HOH 282 -3.0026 21.5179 32.7375 1.00 0.00 WATR -ATOM 1262 HT HOH 282 -2.2456 22.1038 32.7375 1.00 0.00 WATR -ATOM 1263 HT HOH 282 -3.7595 22.1038 32.7375 1.00 0.00 WATR -ATOM 1264 OT HOH 283 1.92380 -0.6509 -4.2105 1.00 0.00 WATR -ATOM 1265 HT HOH 283 2.68075 -0.0650 -4.2105 1.00 0.00 WATR -ATOM 1266 HT HOH 283 1.16685 -0.0650 -4.2105 1.00 0.00 WATR -ATOM 1267 OT HOH 284 1.92380 1.81228 3.17907 1.00 0.00 WATR -ATOM 1268 HT HOH 284 2.68075 2.39816 3.17907 1.00 0.00 WATR -ATOM 1269 HT HOH 284 1.16685 2.39816 3.17907 1.00 0.00 WATR -ATOM 1270 OT HOH 285 1.92380 -0.6509 5.64228 1.00 0.00 WATR -ATOM 1271 HT HOH 285 2.68075 -0.0650 5.64228 1.00 0.00 WATR -ATOM 1272 HT HOH 285 1.16685 -0.0650 5.64228 1.00 0.00 WATR -ATOM 1273 OT HOH 286 4.38701 1.81228 5.64228 1.00 0.00 WATR -ATOM 1274 HT HOH 286 5.14396 2.39816 5.64228 1.00 0.00 WATR -ATOM 1275 HT HOH 286 3.63006 2.39816 5.64228 1.00 0.00 WATR -ATOM 1276 OT HOH 287 4.38701 -0.6509 8.10548 1.00 0.00 WATR -ATOM 1277 HT HOH 287 5.14396 -0.0650 8.10548 1.00 0.00 WATR -ATOM 1278 HT HOH 287 3.63006 -0.0650 8.10548 1.00 0.00 WATR -ATOM 1279 OT HOH 288 1.92380 1.81228 8.10548 1.00 0.00 WATR -ATOM 1280 HT HOH 288 2.68075 2.39816 8.10548 1.00 0.00 WATR -ATOM 1281 HT HOH 288 1.16685 2.39816 8.10548 1.00 0.00 WATR -ATOM 1282 OT HOH 289 1.92380 -0.6509 10.5686 1.00 0.00 WATR -ATOM 1283 HT HOH 289 2.68075 -0.0650 10.5686 1.00 0.00 WATR -ATOM 1284 HT HOH 289 1.16685 -0.0650 10.5686 1.00 0.00 WATR -ATOM 1285 OT HOH 290 4.38701 1.81228 10.5686 1.00 0.00 WATR -ATOM 1286 HT HOH 290 5.14396 2.39816 10.5686 1.00 0.00 WATR -ATOM 1287 HT HOH 290 3.63006 2.39816 10.5686 1.00 0.00 WATR -ATOM 1288 OT HOH 291 4.38701 -0.6509 13.0318 1.00 0.00 WATR -ATOM 1289 HT HOH 291 5.14396 -0.0650 13.0318 1.00 0.00 WATR -ATOM 1290 HT HOH 291 3.63006 -0.0650 13.0318 1.00 0.00 WATR -ATOM 1291 OT HOH 292 1.92380 1.81228 13.0318 1.00 0.00 WATR -ATOM 1292 HT HOH 292 2.68075 2.39816 13.0318 1.00 0.00 WATR -ATOM 1293 HT HOH 292 1.16685 2.39816 13.0318 1.00 0.00 WATR -ATOM 1294 OT HOH 293 1.92380 -0.6509 15.4951 1.00 0.00 WATR -ATOM 1295 HT HOH 293 2.68075 -0.0650 15.4951 1.00 0.00 WATR -ATOM 1296 HT HOH 293 1.16685 -0.0650 15.4951 1.00 0.00 WATR -ATOM 1297 OT HOH 294 4.38701 1.81228 15.4951 1.00 0.00 WATR -ATOM 1298 HT HOH 294 5.14396 2.39816 15.4951 1.00 0.00 WATR -ATOM 1299 HT HOH 294 3.63006 2.39816 15.4951 1.00 0.00 WATR -ATOM 1300 OT HOH 295 4.38701 -0.6509 17.9583 1.00 0.00 WATR -ATOM 1301 HT HOH 295 5.14396 -0.0650 17.9583 1.00 0.00 WATR -ATOM 1302 HT HOH 295 3.63006 -0.0650 17.9583 1.00 0.00 WATR -ATOM 1303 OT HOH 296 1.92380 -0.6509 20.4215 1.00 0.00 WATR -ATOM 1304 HT HOH 296 2.68075 -0.0650 20.4215 1.00 0.00 WATR -ATOM 1305 HT HOH 296 1.16685 -0.0650 20.4215 1.00 0.00 WATR -ATOM 1306 OT HOH 297 4.38701 1.81228 20.4215 1.00 0.00 WATR -ATOM 1307 HT HOH 297 5.14396 2.39816 20.4215 1.00 0.00 WATR -ATOM 1308 HT HOH 297 3.63006 2.39816 20.4215 1.00 0.00 WATR -ATOM 1309 OT HOH 298 4.38701 -0.6509 22.8847 1.00 0.00 WATR -ATOM 1310 HT HOH 298 5.14396 -0.0650 22.8847 1.00 0.00 WATR -ATOM 1311 HT HOH 298 3.63006 -0.0650 22.8847 1.00 0.00 WATR -ATOM 1312 SOD ION 299 1.92380 1.81228 22.8847 1.00 0.00 SALT -ATOM 1313 OT HOH 300 1.92380 -0.6509 25.3479 1.00 0.00 WATR -ATOM 1314 HT HOH 300 2.68075 -0.0650 25.3479 1.00 0.00 WATR -ATOM 1315 HT HOH 300 1.16685 -0.0650 25.3479 1.00 0.00 WATR -ATOM 1316 OT HOH 301 4.38701 1.81228 25.3479 1.00 0.00 WATR -ATOM 1317 HT HOH 301 5.14396 2.39816 25.3479 1.00 0.00 WATR -ATOM 1318 HT HOH 301 3.63006 2.39816 25.3479 1.00 0.00 WATR -ATOM 1319 OT HOH 302 4.38701 -0.6509 27.8111 1.00 0.00 WATR -ATOM 1320 HT HOH 302 5.14396 -0.0650 27.8111 1.00 0.00 WATR -ATOM 1321 HT HOH 302 3.63006 -0.0650 27.8111 1.00 0.00 WATR -ATOM 1322 OT HOH 303 1.92380 1.81228 27.8111 1.00 0.00 WATR -ATOM 1323 HT HOH 303 2.68075 2.39816 27.8111 1.00 0.00 WATR -ATOM 1324 HT HOH 303 1.16685 2.39816 27.8111 1.00 0.00 WATR -ATOM 1325 OT HOH 304 1.92380 -0.6509 30.2743 1.00 0.00 WATR -ATOM 1326 HT HOH 304 2.68075 -0.0650 30.2743 1.00 0.00 WATR -ATOM 1327 HT HOH 304 1.16685 -0.0650 30.2743 1.00 0.00 WATR -ATOM 1328 OT HOH 305 4.38701 1.81228 30.2743 1.00 0.00 WATR -ATOM 1329 HT HOH 305 5.14396 2.39816 30.2743 1.00 0.00 WATR -ATOM 1330 HT HOH 305 3.63006 2.39816 30.2743 1.00 0.00 WATR -ATOM 1331 OT HOH 306 4.38701 -0.6509 32.7375 1.00 0.00 WATR -ATOM 1332 HT HOH 306 5.14396 -0.0650 32.7375 1.00 0.00 WATR -ATOM 1333 HT HOH 306 3.63006 -0.0650 32.7375 1.00 0.00 WATR -ATOM 1334 OT HOH 307 1.92380 1.81228 32.7375 1.00 0.00 WATR -ATOM 1335 HT HOH 307 2.68075 2.39816 32.7375 1.00 0.00 WATR -ATOM 1336 HT HOH 307 1.16685 2.39816 32.7375 1.00 0.00 WATR -ATOM 1337 OT HOH 308 1.92380 4.27548 -4.2105 1.00 0.00 WATR -ATOM 1338 HT HOH 308 2.68075 4.86136 -4.2105 1.00 0.00 WATR -ATOM 1339 HT HOH 308 1.16685 4.86136 -4.2105 1.00 0.00 WATR -ATOM 1340 OT HOH 309 4.38701 6.73869 -4.2105 1.00 0.00 WATR -ATOM 1341 HT HOH 309 5.14396 7.32457 -4.2105 1.00 0.00 WATR -ATOM 1342 HT HOH 309 3.63006 7.32457 -4.2105 1.00 0.00 WATR -ATOM 1343 OT HOH 310 4.38701 4.27548 8.10548 1.00 0.00 WATR -ATOM 1344 HT HOH 310 5.14396 4.86136 8.10548 1.00 0.00 WATR -ATOM 1345 HT HOH 310 3.63006 4.86136 8.10548 1.00 0.00 WATR -ATOM 1346 OT HOH 311 1.92380 6.73869 8.10548 1.00 0.00 WATR -ATOM 1347 HT HOH 311 2.68075 7.32457 8.10548 1.00 0.00 WATR -ATOM 1348 HT HOH 311 1.16685 7.32457 8.10548 1.00 0.00 WATR -ATOM 1349 OT HOH 312 1.92380 4.27548 10.5686 1.00 0.00 WATR -ATOM 1350 HT HOH 312 2.68075 4.86136 10.5686 1.00 0.00 WATR -ATOM 1351 HT HOH 312 1.16685 4.86136 10.5686 1.00 0.00 WATR -ATOM 1352 OT HOH 313 4.38701 6.73869 10.5686 1.00 0.00 WATR -ATOM 1353 HT HOH 313 5.14396 7.32457 10.5686 1.00 0.00 WATR -ATOM 1354 HT HOH 313 3.63006 7.32457 10.5686 1.00 0.00 WATR -ATOM 1355 OT HOH 314 4.38701 4.27548 13.0318 1.00 0.00 WATR -ATOM 1356 HT HOH 314 5.14396 4.86136 13.0318 1.00 0.00 WATR -ATOM 1357 HT HOH 314 3.63006 4.86136 13.0318 1.00 0.00 WATR -ATOM 1358 OT HOH 315 1.92380 6.73869 13.0318 1.00 0.00 WATR -ATOM 1359 HT HOH 315 2.68075 7.32457 13.0318 1.00 0.00 WATR -ATOM 1360 HT HOH 315 1.16685 7.32457 13.0318 1.00 0.00 WATR -ATOM 1361 OT HOH 316 1.92380 4.27548 15.4951 1.00 0.00 WATR -ATOM 1362 HT HOH 316 2.68075 4.86136 15.4951 1.00 0.00 WATR -ATOM 1363 HT HOH 316 1.16685 4.86136 15.4951 1.00 0.00 WATR -ATOM 1364 OT HOH 317 4.38701 6.73869 15.4951 1.00 0.00 WATR -ATOM 1365 HT HOH 317 5.14396 7.32457 15.4951 1.00 0.00 WATR -ATOM 1366 HT HOH 317 3.63006 7.32457 15.4951 1.00 0.00 WATR -ATOM 1367 OT HOH 318 4.38701 4.27548 17.9583 1.00 0.00 WATR -ATOM 1368 HT HOH 318 5.14396 4.86136 17.9583 1.00 0.00 WATR -ATOM 1369 HT HOH 318 3.63006 4.86136 17.9583 1.00 0.00 WATR -ATOM 1370 OT HOH 319 4.38701 6.73869 20.4215 1.00 0.00 WATR -ATOM 1371 HT HOH 319 5.14396 7.32457 20.4215 1.00 0.00 WATR -ATOM 1372 HT HOH 319 3.63006 7.32457 20.4215 1.00 0.00 WATR -ATOM 1373 OT HOH 320 4.38701 4.27548 22.8847 1.00 0.00 WATR -ATOM 1374 HT HOH 320 5.14396 4.86136 22.8847 1.00 0.00 WATR -ATOM 1375 HT HOH 320 3.63006 4.86136 22.8847 1.00 0.00 WATR -ATOM 1376 OT HOH 321 1.92380 4.27548 25.3479 1.00 0.00 WATR -ATOM 1377 HT HOH 321 2.68075 4.86136 25.3479 1.00 0.00 WATR -ATOM 1378 HT HOH 321 1.16685 4.86136 25.3479 1.00 0.00 WATR -ATOM 1379 OT HOH 322 4.38701 6.73869 25.3479 1.00 0.00 WATR -ATOM 1380 HT HOH 322 5.14396 7.32457 25.3479 1.00 0.00 WATR -ATOM 1381 HT HOH 322 3.63006 7.32457 25.3479 1.00 0.00 WATR -ATOM 1382 OT HOH 323 4.38701 4.27548 27.8111 1.00 0.00 WATR -ATOM 1383 HT HOH 323 5.14396 4.86136 27.8111 1.00 0.00 WATR -ATOM 1384 HT HOH 323 3.63006 4.86136 27.8111 1.00 0.00 WATR -ATOM 1385 OT HOH 324 1.92380 6.73869 27.8111 1.00 0.00 WATR -ATOM 1386 HT HOH 324 2.68075 7.32457 27.8111 1.00 0.00 WATR -ATOM 1387 HT HOH 324 1.16685 7.32457 27.8111 1.00 0.00 WATR -ATOM 1388 OT HOH 325 1.92380 4.27548 30.2743 1.00 0.00 WATR -ATOM 1389 HT HOH 325 2.68075 4.86136 30.2743 1.00 0.00 WATR -ATOM 1390 HT HOH 325 1.16685 4.86136 30.2743 1.00 0.00 WATR -ATOM 1391 OT HOH 326 4.38701 6.73869 30.2743 1.00 0.00 WATR -ATOM 1392 HT HOH 326 5.14396 7.32457 30.2743 1.00 0.00 WATR -ATOM 1393 HT HOH 326 3.63006 7.32457 30.2743 1.00 0.00 WATR -ATOM 1394 OT HOH 327 4.38701 4.27548 32.7375 1.00 0.00 WATR -ATOM 1395 HT HOH 327 5.14396 4.86136 32.7375 1.00 0.00 WATR -ATOM 1396 HT HOH 327 3.63006 4.86136 32.7375 1.00 0.00 WATR -ATOM 1397 OT HOH 328 1.92380 6.73869 32.7375 1.00 0.00 WATR -ATOM 1398 HT HOH 328 2.68075 7.32457 32.7375 1.00 0.00 WATR -ATOM 1399 HT HOH 328 1.16685 7.32457 32.7375 1.00 0.00 WATR -ATOM 1400 OT HOH 329 1.92380 9.20189 -4.2105 1.00 0.00 WATR -ATOM 1401 HT HOH 329 2.68075 9.78777 -4.2105 1.00 0.00 WATR -ATOM 1402 HT HOH 329 1.16685 9.78777 -4.2105 1.00 0.00 WATR -ATOM 1403 OT HOH 330 4.38701 11.6651 -4.2105 1.00 0.00 WATR -ATOM 1404 HT HOH 330 5.14396 12.2509 -4.2105 1.00 0.00 WATR -ATOM 1405 HT HOH 330 3.63006 12.2509 -4.2105 1.00 0.00 WATR -ATOM 1406 OT HOH 331 4.38701 9.20189 13.0318 1.00 0.00 WATR -ATOM 1407 HT HOH 331 5.14396 9.78777 13.0318 1.00 0.00 WATR -ATOM 1408 HT HOH 331 3.63006 9.78777 13.0318 1.00 0.00 WATR -ATOM 1409 OT HOH 332 4.38701 11.6651 15.4951 1.00 0.00 WATR -ATOM 1410 HT HOH 332 5.14396 12.2509 15.4951 1.00 0.00 WATR -ATOM 1411 HT HOH 332 3.63006 12.2509 15.4951 1.00 0.00 WATR -ATOM 1412 OT HOH 333 4.38701 9.20189 17.9583 1.00 0.00 WATR -ATOM 1413 HT HOH 333 5.14396 9.78777 17.9583 1.00 0.00 WATR -ATOM 1414 HT HOH 333 3.63006 9.78777 17.9583 1.00 0.00 WATR -ATOM 1415 OT HOH 334 1.92380 11.6651 17.9583 1.00 0.00 WATR -ATOM 1416 HT HOH 334 2.68075 12.2509 17.9583 1.00 0.00 WATR -ATOM 1417 HT HOH 334 1.16685 12.2509 17.9583 1.00 0.00 WATR -ATOM 1418 OT HOH 335 4.38701 11.6651 20.4215 1.00 0.00 WATR -ATOM 1419 HT HOH 335 5.14396 12.2509 20.4215 1.00 0.00 WATR -ATOM 1420 HT HOH 335 3.63006 12.2509 20.4215 1.00 0.00 WATR -ATOM 1421 OT HOH 336 4.38701 9.20189 22.8847 1.00 0.00 WATR -ATOM 1422 HT HOH 336 5.14396 9.78777 22.8847 1.00 0.00 WATR -ATOM 1423 HT HOH 336 3.63006 9.78777 22.8847 1.00 0.00 WATR -ATOM 1424 OT HOH 337 1.92380 11.6651 22.8847 1.00 0.00 WATR -ATOM 1425 HT HOH 337 2.68075 12.2509 22.8847 1.00 0.00 WATR -ATOM 1426 HT HOH 337 1.16685 12.2509 22.8847 1.00 0.00 WATR -ATOM 1427 OT HOH 338 4.38701 11.6651 25.3479 1.00 0.00 WATR -ATOM 1428 HT HOH 338 5.14396 12.2509 25.3479 1.00 0.00 WATR -ATOM 1429 HT HOH 338 3.63006 12.2509 25.3479 1.00 0.00 WATR -ATOM 1430 OT HOH 339 4.38701 9.20189 27.8111 1.00 0.00 WATR -ATOM 1431 HT HOH 339 5.14396 9.78777 27.8111 1.00 0.00 WATR -ATOM 1432 HT HOH 339 3.63006 9.78777 27.8111 1.00 0.00 WATR -ATOM 1433 OT HOH 340 1.92380 9.20189 30.2743 1.00 0.00 WATR -ATOM 1434 HT HOH 340 2.68075 9.78777 30.2743 1.00 0.00 WATR -ATOM 1435 HT HOH 340 1.16685 9.78777 30.2743 1.00 0.00 WATR -ATOM 1436 OT HOH 341 4.38701 11.6651 30.2743 1.00 0.00 WATR -ATOM 1437 HT HOH 341 5.14396 12.2509 30.2743 1.00 0.00 WATR -ATOM 1438 HT HOH 341 3.63006 12.2509 30.2743 1.00 0.00 WATR -ATOM 1439 OT HOH 342 4.38701 9.20189 32.7375 1.00 0.00 WATR -ATOM 1440 HT HOH 342 5.14396 9.78777 32.7375 1.00 0.00 WATR -ATOM 1441 HT HOH 342 3.63006 9.78777 32.7375 1.00 0.00 WATR -ATOM 1442 OT HOH 343 1.92380 11.6651 32.7375 1.00 0.00 WATR -ATOM 1443 HT HOH 343 2.68075 12.2509 32.7375 1.00 0.00 WATR -ATOM 1444 HT HOH 343 1.16685 12.2509 32.7375 1.00 0.00 WATR -ATOM 1445 SOD ION 344 4.38701 16.5915 -4.2105 1.00 0.00 SALT -ATOM 1446 OT HOH 345 4.38701 14.1283 -1.7473 1.00 0.00 WATR -ATOM 1447 HT HOH 345 5.14396 14.7141 -1.7473 1.00 0.00 WATR -ATOM 1448 HT HOH 345 3.63006 14.7141 -1.7473 1.00 0.00 WATR -ATOM 1449 OT HOH 346 4.38701 16.5915 0.71587 1.00 0.00 WATR -ATOM 1450 HT HOH 346 5.14396 17.1773 0.71587 1.00 0.00 WATR -ATOM 1451 HT HOH 346 3.63006 17.1773 0.71587 1.00 0.00 WATR -ATOM 1452 OT HOH 347 1.92380 16.5915 3.17907 1.00 0.00 WATR -ATOM 1453 HT HOH 347 2.68075 17.1773 3.17907 1.00 0.00 WATR -ATOM 1454 HT HOH 347 1.16685 17.1773 3.17907 1.00 0.00 WATR -ATOM 1455 OT HOH 348 4.38701 16.5915 15.4951 1.00 0.00 WATR -ATOM 1456 HT HOH 348 5.14396 17.1773 15.4951 1.00 0.00 WATR -ATOM 1457 HT HOH 348 3.63006 17.1773 15.4951 1.00 0.00 WATR -ATOM 1458 OT HOH 349 4.38701 14.1283 17.9583 1.00 0.00 WATR -ATOM 1459 HT HOH 349 5.14396 14.7141 17.9583 1.00 0.00 WATR -ATOM 1460 HT HOH 349 3.63006 14.7141 17.9583 1.00 0.00 WATR -ATOM 1461 OT HOH 350 1.92380 16.5915 17.9583 1.00 0.00 WATR -ATOM 1462 HT HOH 350 2.68075 17.1773 17.9583 1.00 0.00 WATR -ATOM 1463 HT HOH 350 1.16685 17.1773 17.9583 1.00 0.00 WATR -ATOM 1464 OT HOH 351 1.92380 14.1283 20.4215 1.00 0.00 WATR -ATOM 1465 HT HOH 351 2.68075 14.7141 20.4215 1.00 0.00 WATR -ATOM 1466 HT HOH 351 1.16685 14.7141 20.4215 1.00 0.00 WATR -ATOM 1467 OT HOH 352 4.38701 16.5915 20.4215 1.00 0.00 WATR -ATOM 1468 HT HOH 352 5.14396 17.1773 20.4215 1.00 0.00 WATR -ATOM 1469 HT HOH 352 3.63006 17.1773 20.4215 1.00 0.00 WATR -ATOM 1470 OT HOH 353 4.38701 14.1283 22.8847 1.00 0.00 WATR -ATOM 1471 HT HOH 353 5.14396 14.7141 22.8847 1.00 0.00 WATR -ATOM 1472 HT HOH 353 3.63006 14.7141 22.8847 1.00 0.00 WATR -ATOM 1473 OT HOH 354 1.92380 16.5915 22.8847 1.00 0.00 WATR -ATOM 1474 HT HOH 354 2.68075 17.1773 22.8847 1.00 0.00 WATR -ATOM 1475 HT HOH 354 1.16685 17.1773 22.8847 1.00 0.00 WATR -ATOM 1476 OT HOH 355 4.38701 16.5915 25.3479 1.00 0.00 WATR -ATOM 1477 HT HOH 355 5.14396 17.1773 25.3479 1.00 0.00 WATR -ATOM 1478 HT HOH 355 3.63006 17.1773 25.3479 1.00 0.00 WATR -ATOM 1479 OT HOH 356 4.38701 14.1283 27.8111 1.00 0.00 WATR -ATOM 1480 HT HOH 356 5.14396 14.7141 27.8111 1.00 0.00 WATR -ATOM 1481 HT HOH 356 3.63006 14.7141 27.8111 1.00 0.00 WATR -ATOM 1482 OT HOH 357 1.92380 16.5915 27.8111 1.00 0.00 WATR -ATOM 1483 HT HOH 357 2.68075 17.1773 27.8111 1.00 0.00 WATR -ATOM 1484 HT HOH 357 1.16685 17.1773 27.8111 1.00 0.00 WATR -ATOM 1485 OT HOH 358 1.92380 14.1283 30.2743 1.00 0.00 WATR -ATOM 1486 HT HOH 358 2.68075 14.7141 30.2743 1.00 0.00 WATR -ATOM 1487 HT HOH 358 1.16685 14.7141 30.2743 1.00 0.00 WATR -ATOM 1488 OT HOH 359 4.38701 16.5915 30.2743 1.00 0.00 WATR -ATOM 1489 HT HOH 359 5.14396 17.1773 30.2743 1.00 0.00 WATR -ATOM 1490 HT HOH 359 3.63006 17.1773 30.2743 1.00 0.00 WATR -ATOM 1491 OT HOH 360 4.38701 14.1283 32.7375 1.00 0.00 WATR -ATOM 1492 HT HOH 360 5.14396 14.7141 32.7375 1.00 0.00 WATR -ATOM 1493 HT HOH 360 3.63006 14.7141 32.7375 1.00 0.00 WATR -ATOM 1494 OT HOH 361 1.92380 16.5915 32.7375 1.00 0.00 WATR -ATOM 1495 HT HOH 361 2.68075 17.1773 32.7375 1.00 0.00 WATR -ATOM 1496 HT HOH 361 1.16685 17.1773 32.7375 1.00 0.00 WATR -ATOM 1497 OT HOH 362 4.38701 21.5179 -4.2105 1.00 0.00 WATR -ATOM 1498 HT HOH 362 5.14396 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1499 HT HOH 362 3.63006 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1500 SOD ION 363 4.38701 19.0547 -1.7473 1.00 0.00 SALT -ATOM 1501 OT HOH 364 1.92380 21.5179 -1.7473 1.00 0.00 WATR -ATOM 1502 HT HOH 364 2.68075 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1503 HT HOH 364 1.16685 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1504 OT HOH 365 1.92380 19.0547 0.71587 1.00 0.00 WATR -ATOM 1505 HT HOH 365 2.68075 19.6406 0.71587 1.00 0.00 WATR -ATOM 1506 HT HOH 365 1.16685 19.6406 0.71587 1.00 0.00 WATR -ATOM 1507 OT HOH 366 4.38701 21.5179 0.71587 1.00 0.00 WATR -ATOM 1508 HT HOH 366 5.14396 22.1038 0.71587 1.00 0.00 WATR -ATOM 1509 HT HOH 366 3.63006 22.1038 0.71587 1.00 0.00 WATR -ATOM 1510 OT HOH 367 4.38701 19.0547 3.17907 1.00 0.00 WATR -ATOM 1511 HT HOH 367 5.14396 19.6406 3.17907 1.00 0.00 WATR -ATOM 1512 HT HOH 367 3.63006 19.6406 3.17907 1.00 0.00 WATR -ATOM 1513 OT HOH 368 1.92380 21.5179 3.17907 1.00 0.00 WATR -ATOM 1514 HT HOH 368 2.68075 22.1038 3.17907 1.00 0.00 WATR -ATOM 1515 HT HOH 368 1.16685 22.1038 3.17907 1.00 0.00 WATR -ATOM 1516 OT HOH 369 4.38701 21.5179 5.64228 1.00 0.00 WATR -ATOM 1517 HT HOH 369 5.14396 22.1038 5.64228 1.00 0.00 WATR -ATOM 1518 HT HOH 369 3.63006 22.1038 5.64228 1.00 0.00 WATR -ATOM 1519 OT HOH 370 4.38701 21.5179 10.5686 1.00 0.00 WATR -ATOM 1520 HT HOH 370 5.14396 22.1038 10.5686 1.00 0.00 WATR -ATOM 1521 HT HOH 370 3.63006 22.1038 10.5686 1.00 0.00 WATR -ATOM 1522 OT HOH 371 4.38701 19.0547 13.0318 1.00 0.00 WATR -ATOM 1523 HT HOH 371 5.14396 19.6406 13.0318 1.00 0.00 WATR -ATOM 1524 HT HOH 371 3.63006 19.6406 13.0318 1.00 0.00 WATR -ATOM 1525 OT HOH 372 1.92380 19.0547 15.4951 1.00 0.00 WATR -ATOM 1526 HT HOH 372 2.68075 19.6406 15.4951 1.00 0.00 WATR -ATOM 1527 HT HOH 372 1.16685 19.6406 15.4951 1.00 0.00 WATR -ATOM 1528 OT HOH 373 4.38701 21.5179 15.4951 1.00 0.00 WATR -ATOM 1529 HT HOH 373 5.14396 22.1038 15.4951 1.00 0.00 WATR -ATOM 1530 HT HOH 373 3.63006 22.1038 15.4951 1.00 0.00 WATR -ATOM 1531 OT HOH 374 4.38701 19.0547 17.9583 1.00 0.00 WATR -ATOM 1532 HT HOH 374 5.14396 19.6406 17.9583 1.00 0.00 WATR -ATOM 1533 HT HOH 374 3.63006 19.6406 17.9583 1.00 0.00 WATR -ATOM 1534 OT HOH 375 1.92380 21.5179 17.9583 1.00 0.00 WATR -ATOM 1535 HT HOH 375 2.68075 22.1038 17.9583 1.00 0.00 WATR -ATOM 1536 HT HOH 375 1.16685 22.1038 17.9583 1.00 0.00 WATR -ATOM 1537 OT HOH 376 1.92380 19.0547 20.4215 1.00 0.00 WATR -ATOM 1538 HT HOH 376 2.68075 19.6406 20.4215 1.00 0.00 WATR -ATOM 1539 HT HOH 376 1.16685 19.6406 20.4215 1.00 0.00 WATR -ATOM 1540 OT HOH 377 4.38701 21.5179 20.4215 1.00 0.00 WATR -ATOM 1541 HT HOH 377 5.14396 22.1038 20.4215 1.00 0.00 WATR -ATOM 1542 HT HOH 377 3.63006 22.1038 20.4215 1.00 0.00 WATR -ATOM 1543 OT HOH 378 4.38701 19.0547 22.8847 1.00 0.00 WATR -ATOM 1544 HT HOH 378 5.14396 19.6406 22.8847 1.00 0.00 WATR -ATOM 1545 HT HOH 378 3.63006 19.6406 22.8847 1.00 0.00 WATR -ATOM 1546 OT HOH 379 1.92380 21.5179 22.8847 1.00 0.00 WATR -ATOM 1547 HT HOH 379 2.68075 22.1038 22.8847 1.00 0.00 WATR -ATOM 1548 HT HOH 379 1.16685 22.1038 22.8847 1.00 0.00 WATR -ATOM 1549 OT HOH 380 1.92380 19.0547 25.3479 1.00 0.00 WATR -ATOM 1550 HT HOH 380 2.68075 19.6406 25.3479 1.00 0.00 WATR -ATOM 1551 HT HOH 380 1.16685 19.6406 25.3479 1.00 0.00 WATR -ATOM 1552 OT HOH 381 4.38701 21.5179 25.3479 1.00 0.00 WATR -ATOM 1553 HT HOH 381 5.14396 22.1038 25.3479 1.00 0.00 WATR -ATOM 1554 HT HOH 381 3.63006 22.1038 25.3479 1.00 0.00 WATR -ATOM 1555 OT HOH 382 4.38701 19.0547 27.8111 1.00 0.00 WATR -ATOM 1556 HT HOH 382 5.14396 19.6406 27.8111 1.00 0.00 WATR -ATOM 1557 HT HOH 382 3.63006 19.6406 27.8111 1.00 0.00 WATR -ATOM 1558 OT HOH 383 1.92380 21.5179 27.8111 1.00 0.00 WATR -ATOM 1559 HT HOH 383 2.68075 22.1038 27.8111 1.00 0.00 WATR -ATOM 1560 HT HOH 383 1.16685 22.1038 27.8111 1.00 0.00 WATR -ATOM 1561 OT HOH 384 1.92380 19.0547 30.2743 1.00 0.00 WATR -ATOM 1562 HT HOH 384 2.68075 19.6406 30.2743 1.00 0.00 WATR -ATOM 1563 HT HOH 384 1.16685 19.6406 30.2743 1.00 0.00 WATR -ATOM 1564 OT HOH 385 4.38701 21.5179 30.2743 1.00 0.00 WATR -ATOM 1565 HT HOH 385 5.14396 22.1038 30.2743 1.00 0.00 WATR -ATOM 1566 HT HOH 385 3.63006 22.1038 30.2743 1.00 0.00 WATR -ATOM 1567 OT HOH 386 4.38701 19.0547 32.7375 1.00 0.00 WATR -ATOM 1568 HT HOH 386 5.14396 19.6406 32.7375 1.00 0.00 WATR -ATOM 1569 HT HOH 386 3.63006 19.6406 32.7375 1.00 0.00 WATR -ATOM 1570 OT HOH 387 1.92380 21.5179 32.7375 1.00 0.00 WATR -ATOM 1571 HT HOH 387 2.68075 22.1038 32.7375 1.00 0.00 WATR -ATOM 1572 HT HOH 387 1.16685 22.1038 32.7375 1.00 0.00 WATR -ATOM 1573 SOD ION 388 6.85021 -0.6509 -4.2105 1.00 0.00 SALT -ATOM 1574 OT HOH 389 9.31342 1.81228 -4.2105 1.00 0.00 WATR -ATOM 1575 HT HOH 389 10.0703 2.39816 -4.2105 1.00 0.00 WATR -ATOM 1576 HT HOH 389 8.55647 2.39816 -4.2105 1.00 0.00 WATR -ATOM 1577 OT HOH 390 9.31342 -0.6509 -1.7473 1.00 0.00 WATR -ATOM 1578 HT HOH 390 10.0703 -0.0650 -1.7473 1.00 0.00 WATR -ATOM 1579 HT HOH 390 8.55647 -0.0650 -1.7473 1.00 0.00 WATR -ATOM 1580 OT HOH 391 9.31342 1.81228 0.71587 1.00 0.00 WATR -ATOM 1581 HT HOH 391 10.0703 2.39816 0.71587 1.00 0.00 WATR -ATOM 1582 HT HOH 391 8.55647 2.39816 0.71587 1.00 0.00 WATR -ATOM 1583 OT HOH 392 9.31342 -0.6509 3.17907 1.00 0.00 WATR -ATOM 1584 HT HOH 392 10.0703 -0.0650 3.17907 1.00 0.00 WATR -ATOM 1585 HT HOH 392 8.55647 -0.0650 3.17907 1.00 0.00 WATR -ATOM 1586 SOD ION 393 6.85021 -0.6509 5.64228 1.00 0.00 SALT +ATOM 1125 SOD ION 236 -3.0026 -0.6509 10.5686 1.00 0.00 SALT +ATOM 1126 OT HOH 237 -0.5393 1.81228 10.5686 1.00 0.00 WATR +ATOM 1127 HT HOH 237 0.21755 2.39816 10.5686 1.00 0.00 WATR +ATOM 1128 HT HOH 237 -1.2963 2.39816 10.5686 1.00 0.00 WATR +ATOM 1129 OT HOH 238 -0.5393 -0.6509 13.0318 1.00 0.00 WATR +ATOM 1130 HT HOH 238 0.21755 -0.0650 13.0318 1.00 0.00 WATR +ATOM 1131 HT HOH 238 -1.2963 -0.0650 13.0318 1.00 0.00 WATR +ATOM 1132 OT HOH 239 -0.5393 -0.6509 17.9583 1.00 0.00 WATR +ATOM 1133 HT HOH 239 0.21755 -0.0650 17.9583 1.00 0.00 WATR +ATOM 1134 HT HOH 239 -1.2963 -0.0650 17.9583 1.00 0.00 WATR +ATOM 1135 OT HOH 240 -3.0026 -0.6509 20.4215 1.00 0.00 WATR +ATOM 1136 HT HOH 240 -2.2456 -0.0650 20.4215 1.00 0.00 WATR +ATOM 1137 HT HOH 240 -3.7595 -0.0650 20.4215 1.00 0.00 WATR +ATOM 1138 OT HOH 241 -0.5393 -0.6509 22.8847 1.00 0.00 WATR +ATOM 1139 HT HOH 241 0.21755 -0.0650 22.8847 1.00 0.00 WATR +ATOM 1140 HT HOH 241 -1.2963 -0.0650 22.8847 1.00 0.00 WATR +ATOM 1141 OT HOH 242 -3.0026 1.81228 22.8847 1.00 0.00 WATR +ATOM 1142 HT HOH 242 -2.2456 2.39816 22.8847 1.00 0.00 WATR +ATOM 1143 HT HOH 242 -3.7595 2.39816 22.8847 1.00 0.00 WATR +ATOM 1144 OT HOH 243 -3.0026 -0.6509 25.3479 1.00 0.00 WATR +ATOM 1145 HT HOH 243 -2.2456 -0.0650 25.3479 1.00 0.00 WATR +ATOM 1146 HT HOH 243 -3.7595 -0.0650 25.3479 1.00 0.00 WATR +ATOM 1147 OT HOH 244 -0.5393 1.81228 25.3479 1.00 0.00 WATR +ATOM 1148 HT HOH 244 0.21755 2.39816 25.3479 1.00 0.00 WATR +ATOM 1149 HT HOH 244 -1.2963 2.39816 25.3479 1.00 0.00 WATR +ATOM 1150 OT HOH 245 -0.5393 -0.6509 27.8111 1.00 0.00 WATR +ATOM 1151 HT HOH 245 0.21755 -0.0650 27.8111 1.00 0.00 WATR +ATOM 1152 HT HOH 245 -1.2963 -0.0650 27.8111 1.00 0.00 WATR +ATOM 1153 OT HOH 246 -3.0026 1.81228 27.8111 1.00 0.00 WATR +ATOM 1154 HT HOH 246 -2.2456 2.39816 27.8111 1.00 0.00 WATR +ATOM 1155 HT HOH 246 -3.7595 2.39816 27.8111 1.00 0.00 WATR +ATOM 1156 OT HOH 247 -3.0026 -0.6509 30.2743 1.00 0.00 WATR +ATOM 1157 HT HOH 247 -2.2456 -0.0650 30.2743 1.00 0.00 WATR +ATOM 1158 HT HOH 247 -3.7595 -0.0650 30.2743 1.00 0.00 WATR +ATOM 1159 OT HOH 248 -0.5393 1.81228 30.2743 1.00 0.00 WATR +ATOM 1160 HT HOH 248 0.21755 2.39816 30.2743 1.00 0.00 WATR +ATOM 1161 HT HOH 248 -1.2963 2.39816 30.2743 1.00 0.00 WATR +ATOM 1162 OT HOH 249 -0.5393 -0.6509 32.7375 1.00 0.00 WATR +ATOM 1163 HT HOH 249 0.21755 -0.0650 32.7375 1.00 0.00 WATR +ATOM 1164 HT HOH 249 -1.2963 -0.0650 32.7375 1.00 0.00 WATR +ATOM 1165 OT HOH 250 -3.0026 1.81228 32.7375 1.00 0.00 WATR +ATOM 1166 HT HOH 250 -2.2456 2.39816 32.7375 1.00 0.00 WATR +ATOM 1167 HT HOH 250 -3.7595 2.39816 32.7375 1.00 0.00 WATR +ATOM 1168 OT HOH 251 -3.0026 4.27548 -4.2105 1.00 0.00 WATR +ATOM 1169 HT HOH 251 -2.2456 4.86136 -4.2105 1.00 0.00 WATR +ATOM 1170 HT HOH 251 -3.7595 4.86136 -4.2105 1.00 0.00 WATR +ATOM 1171 OT HOH 252 -0.5393 6.73869 -4.2105 1.00 0.00 WATR +ATOM 1172 HT HOH 252 0.21755 7.32457 -4.2105 1.00 0.00 WATR +ATOM 1173 HT HOH 252 -1.2963 7.32457 -4.2105 1.00 0.00 WATR +ATOM 1174 OT HOH 253 -3.0026 4.27548 0.71587 1.00 0.00 WATR +ATOM 1175 HT HOH 253 -2.2456 4.86136 0.71587 1.00 0.00 WATR +ATOM 1176 HT HOH 253 -3.7595 4.86136 0.71587 1.00 0.00 WATR +ATOM 1177 OT HOH 254 -3.0026 4.27548 5.64228 1.00 0.00 WATR +ATOM 1178 HT HOH 254 -2.2456 4.86136 5.64228 1.00 0.00 WATR +ATOM 1179 HT HOH 254 -3.7595 4.86136 5.64228 1.00 0.00 WATR +ATOM 1180 OT HOH 255 -0.5393 4.27548 8.10548 1.00 0.00 WATR +ATOM 1181 HT HOH 255 0.21755 4.86136 8.10548 1.00 0.00 WATR +ATOM 1182 HT HOH 255 -1.2963 4.86136 8.10548 1.00 0.00 WATR +ATOM 1183 OT HOH 256 -3.0026 4.27548 10.5686 1.00 0.00 WATR +ATOM 1184 HT HOH 256 -2.2456 4.86136 10.5686 1.00 0.00 WATR +ATOM 1185 HT HOH 256 -3.7595 4.86136 10.5686 1.00 0.00 WATR +ATOM 1186 OT HOH 257 -0.5393 4.27548 13.0318 1.00 0.00 WATR +ATOM 1187 HT HOH 257 0.21755 4.86136 13.0318 1.00 0.00 WATR +ATOM 1188 HT HOH 257 -1.2963 4.86136 13.0318 1.00 0.00 WATR +ATOM 1189 OT HOH 258 -0.5393 4.27548 27.8111 1.00 0.00 WATR +ATOM 1190 HT HOH 258 0.21755 4.86136 27.8111 1.00 0.00 WATR +ATOM 1191 HT HOH 258 -1.2963 4.86136 27.8111 1.00 0.00 WATR +ATOM 1192 OT HOH 259 -3.0026 4.27548 30.2743 1.00 0.00 WATR +ATOM 1193 HT HOH 259 -2.2456 4.86136 30.2743 1.00 0.00 WATR +ATOM 1194 HT HOH 259 -3.7595 4.86136 30.2743 1.00 0.00 WATR +ATOM 1195 OT HOH 260 -0.5393 6.73869 30.2743 1.00 0.00 WATR +ATOM 1196 HT HOH 260 0.21755 7.32457 30.2743 1.00 0.00 WATR +ATOM 1197 HT HOH 260 -1.2963 7.32457 30.2743 1.00 0.00 WATR +ATOM 1198 OT HOH 261 -0.5393 4.27548 32.7375 1.00 0.00 WATR +ATOM 1199 HT HOH 261 0.21755 4.86136 32.7375 1.00 0.00 WATR +ATOM 1200 HT HOH 261 -1.2963 4.86136 32.7375 1.00 0.00 WATR +ATOM 1201 OT HOH 262 -3.0026 6.73869 32.7375 1.00 0.00 WATR +ATOM 1202 HT HOH 262 -2.2456 7.32457 32.7375 1.00 0.00 WATR +ATOM 1203 HT HOH 262 -3.7595 7.32457 32.7375 1.00 0.00 WATR +ATOM 1204 SOD ION 263 -0.5393 9.20189 32.7375 1.00 0.00 SALT +ATOM 1205 OT HOH 264 -0.5393 21.5179 -4.2105 1.00 0.00 WATR +ATOM 1206 HT HOH 264 0.21755 22.1038 -4.2105 1.00 0.00 WATR +ATOM 1207 HT HOH 264 -1.2963 22.1038 -4.2105 1.00 0.00 WATR +ATOM 1208 OT HOH 265 -3.0026 21.5179 -1.7473 1.00 0.00 WATR +ATOM 1209 HT HOH 265 -2.2456 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1210 HT HOH 265 -3.7595 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1211 OT HOH 266 -0.5393 21.5179 0.71587 1.00 0.00 WATR +ATOM 1212 HT HOH 266 0.21755 22.1038 0.71587 1.00 0.00 WATR +ATOM 1213 HT HOH 266 -1.2963 22.1038 0.71587 1.00 0.00 WATR +ATOM 1214 OT HOH 267 -0.5393 19.0547 3.17907 1.00 0.00 WATR +ATOM 1215 HT HOH 267 0.21755 19.6406 3.17907 1.00 0.00 WATR +ATOM 1216 HT HOH 267 -1.2963 19.6406 3.17907 1.00 0.00 WATR +ATOM 1217 SOD ION 268 -3.0026 21.5179 3.17907 1.00 0.00 SALT +ATOM 1218 OT HOH 269 -3.0026 19.0547 5.64228 1.00 0.00 WATR +ATOM 1219 HT HOH 269 -2.2456 19.6406 5.64228 1.00 0.00 WATR +ATOM 1220 HT HOH 269 -3.7595 19.6406 5.64228 1.00 0.00 WATR +ATOM 1221 OT HOH 270 -0.5393 21.5179 5.64228 1.00 0.00 WATR +ATOM 1222 HT HOH 270 0.21755 22.1038 5.64228 1.00 0.00 WATR +ATOM 1223 HT HOH 270 -1.2963 22.1038 5.64228 1.00 0.00 WATR +ATOM 1224 OT HOH 271 -0.5393 21.5179 15.4951 1.00 0.00 WATR +ATOM 1225 HT HOH 271 0.21755 22.1038 15.4951 1.00 0.00 WATR +ATOM 1226 HT HOH 271 -1.2963 22.1038 15.4951 1.00 0.00 WATR +ATOM 1227 OT HOH 272 -3.0026 21.5179 17.9583 1.00 0.00 WATR +ATOM 1228 HT HOH 272 -2.2456 22.1038 17.9583 1.00 0.00 WATR +ATOM 1229 HT HOH 272 -3.7595 22.1038 17.9583 1.00 0.00 WATR +ATOM 1230 OT HOH 273 -0.5393 21.5179 20.4215 1.00 0.00 WATR +ATOM 1231 HT HOH 273 0.21755 22.1038 20.4215 1.00 0.00 WATR +ATOM 1232 HT HOH 273 -1.2963 22.1038 20.4215 1.00 0.00 WATR +ATOM 1233 OT HOH 274 -0.5393 19.0547 22.8847 1.00 0.00 WATR +ATOM 1234 HT HOH 274 0.21755 19.6406 22.8847 1.00 0.00 WATR +ATOM 1235 HT HOH 274 -1.2963 19.6406 22.8847 1.00 0.00 WATR +ATOM 1236 OT HOH 275 -3.0026 21.5179 22.8847 1.00 0.00 WATR +ATOM 1237 HT HOH 275 -2.2456 22.1038 22.8847 1.00 0.00 WATR +ATOM 1238 HT HOH 275 -3.7595 22.1038 22.8847 1.00 0.00 WATR +ATOM 1239 OT HOH 276 -0.5393 21.5179 25.3479 1.00 0.00 WATR +ATOM 1240 HT HOH 276 0.21755 22.1038 25.3479 1.00 0.00 WATR +ATOM 1241 HT HOH 276 -1.2963 22.1038 25.3479 1.00 0.00 WATR +ATOM 1242 OT HOH 277 -0.5393 19.0547 27.8111 1.00 0.00 WATR +ATOM 1243 HT HOH 277 0.21755 19.6406 27.8111 1.00 0.00 WATR +ATOM 1244 HT HOH 277 -1.2963 19.6406 27.8111 1.00 0.00 WATR +ATOM 1245 OT HOH 278 -3.0026 21.5179 27.8111 1.00 0.00 WATR +ATOM 1246 HT HOH 278 -2.2456 22.1038 27.8111 1.00 0.00 WATR +ATOM 1247 HT HOH 278 -3.7595 22.1038 27.8111 1.00 0.00 WATR +ATOM 1248 OT HOH 279 -3.0026 19.0547 30.2743 1.00 0.00 WATR +ATOM 1249 HT HOH 279 -2.2456 19.6406 30.2743 1.00 0.00 WATR +ATOM 1250 HT HOH 279 -3.7595 19.6406 30.2743 1.00 0.00 WATR +ATOM 1251 OT HOH 280 -0.5393 21.5179 30.2743 1.00 0.00 WATR +ATOM 1252 HT HOH 280 0.21755 22.1038 30.2743 1.00 0.00 WATR +ATOM 1253 HT HOH 280 -1.2963 22.1038 30.2743 1.00 0.00 WATR +ATOM 1254 OT HOH 281 -0.5393 19.0547 32.7375 1.00 0.00 WATR +ATOM 1255 HT HOH 281 0.21755 19.6406 32.7375 1.00 0.00 WATR +ATOM 1256 HT HOH 281 -1.2963 19.6406 32.7375 1.00 0.00 WATR +ATOM 1257 OT HOH 282 -3.0026 21.5179 32.7375 1.00 0.00 WATR +ATOM 1258 HT HOH 282 -2.2456 22.1038 32.7375 1.00 0.00 WATR +ATOM 1259 HT HOH 282 -3.7595 22.1038 32.7375 1.00 0.00 WATR +ATOM 1260 OT HOH 283 1.92380 -0.6509 -4.2105 1.00 0.00 WATR +ATOM 1261 HT HOH 283 2.68075 -0.0650 -4.2105 1.00 0.00 WATR +ATOM 1262 HT HOH 283 1.16685 -0.0650 -4.2105 1.00 0.00 WATR +ATOM 1263 OT HOH 284 1.92380 1.81228 3.17907 1.00 0.00 WATR +ATOM 1264 HT HOH 284 2.68075 2.39816 3.17907 1.00 0.00 WATR +ATOM 1265 HT HOH 284 1.16685 2.39816 3.17907 1.00 0.00 WATR +ATOM 1266 OT HOH 285 1.92380 -0.6509 5.64228 1.00 0.00 WATR +ATOM 1267 HT HOH 285 2.68075 -0.0650 5.64228 1.00 0.00 WATR +ATOM 1268 HT HOH 285 1.16685 -0.0650 5.64228 1.00 0.00 WATR +ATOM 1269 OT HOH 286 4.38701 1.81228 5.64228 1.00 0.00 WATR +ATOM 1270 HT HOH 286 5.14396 2.39816 5.64228 1.00 0.00 WATR +ATOM 1271 HT HOH 286 3.63006 2.39816 5.64228 1.00 0.00 WATR +ATOM 1272 OT HOH 287 4.38701 -0.6509 8.10548 1.00 0.00 WATR +ATOM 1273 HT HOH 287 5.14396 -0.0650 8.10548 1.00 0.00 WATR +ATOM 1274 HT HOH 287 3.63006 -0.0650 8.10548 1.00 0.00 WATR +ATOM 1275 OT HOH 288 1.92380 1.81228 8.10548 1.00 0.00 WATR +ATOM 1276 HT HOH 288 2.68075 2.39816 8.10548 1.00 0.00 WATR +ATOM 1277 HT HOH 288 1.16685 2.39816 8.10548 1.00 0.00 WATR +ATOM 1278 OT HOH 289 1.92380 -0.6509 10.5686 1.00 0.00 WATR +ATOM 1279 HT HOH 289 2.68075 -0.0650 10.5686 1.00 0.00 WATR +ATOM 1280 HT HOH 289 1.16685 -0.0650 10.5686 1.00 0.00 WATR +ATOM 1281 OT HOH 290 4.38701 1.81228 10.5686 1.00 0.00 WATR +ATOM 1282 HT HOH 290 5.14396 2.39816 10.5686 1.00 0.00 WATR +ATOM 1283 HT HOH 290 3.63006 2.39816 10.5686 1.00 0.00 WATR +ATOM 1284 OT HOH 291 4.38701 -0.6509 13.0318 1.00 0.00 WATR +ATOM 1285 HT HOH 291 5.14396 -0.0650 13.0318 1.00 0.00 WATR +ATOM 1286 HT HOH 291 3.63006 -0.0650 13.0318 1.00 0.00 WATR +ATOM 1287 OT HOH 292 1.92380 1.81228 13.0318 1.00 0.00 WATR +ATOM 1288 HT HOH 292 2.68075 2.39816 13.0318 1.00 0.00 WATR +ATOM 1289 HT HOH 292 1.16685 2.39816 13.0318 1.00 0.00 WATR +ATOM 1290 OT HOH 293 1.92380 -0.6509 15.4951 1.00 0.00 WATR +ATOM 1291 HT HOH 293 2.68075 -0.0650 15.4951 1.00 0.00 WATR +ATOM 1292 HT HOH 293 1.16685 -0.0650 15.4951 1.00 0.00 WATR +ATOM 1293 OT HOH 294 4.38701 1.81228 15.4951 1.00 0.00 WATR +ATOM 1294 HT HOH 294 5.14396 2.39816 15.4951 1.00 0.00 WATR +ATOM 1295 HT HOH 294 3.63006 2.39816 15.4951 1.00 0.00 WATR +ATOM 1296 OT HOH 295 4.38701 -0.6509 17.9583 1.00 0.00 WATR +ATOM 1297 HT HOH 295 5.14396 -0.0650 17.9583 1.00 0.00 WATR +ATOM 1298 HT HOH 295 3.63006 -0.0650 17.9583 1.00 0.00 WATR +ATOM 1299 OT HOH 296 1.92380 -0.6509 20.4215 1.00 0.00 WATR +ATOM 1300 HT HOH 296 2.68075 -0.0650 20.4215 1.00 0.00 WATR +ATOM 1301 HT HOH 296 1.16685 -0.0650 20.4215 1.00 0.00 WATR +ATOM 1302 OT HOH 297 4.38701 1.81228 20.4215 1.00 0.00 WATR +ATOM 1303 HT HOH 297 5.14396 2.39816 20.4215 1.00 0.00 WATR +ATOM 1304 HT HOH 297 3.63006 2.39816 20.4215 1.00 0.00 WATR +ATOM 1305 OT HOH 298 4.38701 -0.6509 22.8847 1.00 0.00 WATR +ATOM 1306 HT HOH 298 5.14396 -0.0650 22.8847 1.00 0.00 WATR +ATOM 1307 HT HOH 298 3.63006 -0.0650 22.8847 1.00 0.00 WATR +ATOM 1308 OT HOH 299 1.92380 1.81228 22.8847 1.00 0.00 WATR +ATOM 1309 HT HOH 299 2.68075 2.39816 22.8847 1.00 0.00 WATR +ATOM 1310 HT HOH 299 1.16685 2.39816 22.8847 1.00 0.00 WATR +ATOM 1311 OT HOH 300 1.92380 -0.6509 25.3479 1.00 0.00 WATR +ATOM 1312 HT HOH 300 2.68075 -0.0650 25.3479 1.00 0.00 WATR +ATOM 1313 HT HOH 300 1.16685 -0.0650 25.3479 1.00 0.00 WATR +ATOM 1314 OT HOH 301 4.38701 1.81228 25.3479 1.00 0.00 WATR +ATOM 1315 HT HOH 301 5.14396 2.39816 25.3479 1.00 0.00 WATR +ATOM 1316 HT HOH 301 3.63006 2.39816 25.3479 1.00 0.00 WATR +ATOM 1317 OT HOH 302 4.38701 -0.6509 27.8111 1.00 0.00 WATR +ATOM 1318 HT HOH 302 5.14396 -0.0650 27.8111 1.00 0.00 WATR +ATOM 1319 HT HOH 302 3.63006 -0.0650 27.8111 1.00 0.00 WATR +ATOM 1320 OT HOH 303 1.92380 1.81228 27.8111 1.00 0.00 WATR +ATOM 1321 HT HOH 303 2.68075 2.39816 27.8111 1.00 0.00 WATR +ATOM 1322 HT HOH 303 1.16685 2.39816 27.8111 1.00 0.00 WATR +ATOM 1323 OT HOH 304 1.92380 -0.6509 30.2743 1.00 0.00 WATR +ATOM 1324 HT HOH 304 2.68075 -0.0650 30.2743 1.00 0.00 WATR +ATOM 1325 HT HOH 304 1.16685 -0.0650 30.2743 1.00 0.00 WATR +ATOM 1326 OT HOH 305 4.38701 1.81228 30.2743 1.00 0.00 WATR +ATOM 1327 HT HOH 305 5.14396 2.39816 30.2743 1.00 0.00 WATR +ATOM 1328 HT HOH 305 3.63006 2.39816 30.2743 1.00 0.00 WATR +ATOM 1329 OT HOH 306 4.38701 -0.6509 32.7375 1.00 0.00 WATR +ATOM 1330 HT HOH 306 5.14396 -0.0650 32.7375 1.00 0.00 WATR +ATOM 1331 HT HOH 306 3.63006 -0.0650 32.7375 1.00 0.00 WATR +ATOM 1332 OT HOH 307 1.92380 1.81228 32.7375 1.00 0.00 WATR +ATOM 1333 HT HOH 307 2.68075 2.39816 32.7375 1.00 0.00 WATR +ATOM 1334 HT HOH 307 1.16685 2.39816 32.7375 1.00 0.00 WATR +ATOM 1335 OT HOH 308 1.92380 4.27548 -4.2105 1.00 0.00 WATR +ATOM 1336 HT HOH 308 2.68075 4.86136 -4.2105 1.00 0.00 WATR +ATOM 1337 HT HOH 308 1.16685 4.86136 -4.2105 1.00 0.00 WATR +ATOM 1338 OT HOH 309 4.38701 6.73869 -4.2105 1.00 0.00 WATR +ATOM 1339 HT HOH 309 5.14396 7.32457 -4.2105 1.00 0.00 WATR +ATOM 1340 HT HOH 309 3.63006 7.32457 -4.2105 1.00 0.00 WATR +ATOM 1341 OT HOH 310 4.38701 4.27548 8.10548 1.00 0.00 WATR +ATOM 1342 HT HOH 310 5.14396 4.86136 8.10548 1.00 0.00 WATR +ATOM 1343 HT HOH 310 3.63006 4.86136 8.10548 1.00 0.00 WATR +ATOM 1344 OT HOH 311 1.92380 6.73869 8.10548 1.00 0.00 WATR +ATOM 1345 HT HOH 311 2.68075 7.32457 8.10548 1.00 0.00 WATR +ATOM 1346 HT HOH 311 1.16685 7.32457 8.10548 1.00 0.00 WATR +ATOM 1347 SOD ION 312 1.92380 4.27548 10.5686 1.00 0.00 SALT +ATOM 1348 OT HOH 313 4.38701 6.73869 10.5686 1.00 0.00 WATR +ATOM 1349 HT HOH 313 5.14396 7.32457 10.5686 1.00 0.00 WATR +ATOM 1350 HT HOH 313 3.63006 7.32457 10.5686 1.00 0.00 WATR +ATOM 1351 OT HOH 314 4.38701 4.27548 13.0318 1.00 0.00 WATR +ATOM 1352 HT HOH 314 5.14396 4.86136 13.0318 1.00 0.00 WATR +ATOM 1353 HT HOH 314 3.63006 4.86136 13.0318 1.00 0.00 WATR +ATOM 1354 OT HOH 315 1.92380 6.73869 13.0318 1.00 0.00 WATR +ATOM 1355 HT HOH 315 2.68075 7.32457 13.0318 1.00 0.00 WATR +ATOM 1356 HT HOH 315 1.16685 7.32457 13.0318 1.00 0.00 WATR +ATOM 1357 OT HOH 316 1.92380 4.27548 15.4951 1.00 0.00 WATR +ATOM 1358 HT HOH 316 2.68075 4.86136 15.4951 1.00 0.00 WATR +ATOM 1359 HT HOH 316 1.16685 4.86136 15.4951 1.00 0.00 WATR +ATOM 1360 OT HOH 317 4.38701 6.73869 15.4951 1.00 0.00 WATR +ATOM 1361 HT HOH 317 5.14396 7.32457 15.4951 1.00 0.00 WATR +ATOM 1362 HT HOH 317 3.63006 7.32457 15.4951 1.00 0.00 WATR +ATOM 1363 OT HOH 318 4.38701 4.27548 17.9583 1.00 0.00 WATR +ATOM 1364 HT HOH 318 5.14396 4.86136 17.9583 1.00 0.00 WATR +ATOM 1365 HT HOH 318 3.63006 4.86136 17.9583 1.00 0.00 WATR +ATOM 1366 OT HOH 319 4.38701 6.73869 20.4215 1.00 0.00 WATR +ATOM 1367 HT HOH 319 5.14396 7.32457 20.4215 1.00 0.00 WATR +ATOM 1368 HT HOH 319 3.63006 7.32457 20.4215 1.00 0.00 WATR +ATOM 1369 OT HOH 320 4.38701 4.27548 22.8847 1.00 0.00 WATR +ATOM 1370 HT HOH 320 5.14396 4.86136 22.8847 1.00 0.00 WATR +ATOM 1371 HT HOH 320 3.63006 4.86136 22.8847 1.00 0.00 WATR +ATOM 1372 OT HOH 321 1.92380 4.27548 25.3479 1.00 0.00 WATR +ATOM 1373 HT HOH 321 2.68075 4.86136 25.3479 1.00 0.00 WATR +ATOM 1374 HT HOH 321 1.16685 4.86136 25.3479 1.00 0.00 WATR +ATOM 1375 OT HOH 322 4.38701 6.73869 25.3479 1.00 0.00 WATR +ATOM 1376 HT HOH 322 5.14396 7.32457 25.3479 1.00 0.00 WATR +ATOM 1377 HT HOH 322 3.63006 7.32457 25.3479 1.00 0.00 WATR +ATOM 1378 OT HOH 323 4.38701 4.27548 27.8111 1.00 0.00 WATR +ATOM 1379 HT HOH 323 5.14396 4.86136 27.8111 1.00 0.00 WATR +ATOM 1380 HT HOH 323 3.63006 4.86136 27.8111 1.00 0.00 WATR +ATOM 1381 OT HOH 324 1.92380 6.73869 27.8111 1.00 0.00 WATR +ATOM 1382 HT HOH 324 2.68075 7.32457 27.8111 1.00 0.00 WATR +ATOM 1383 HT HOH 324 1.16685 7.32457 27.8111 1.00 0.00 WATR +ATOM 1384 OT HOH 325 1.92380 4.27548 30.2743 1.00 0.00 WATR +ATOM 1385 HT HOH 325 2.68075 4.86136 30.2743 1.00 0.00 WATR +ATOM 1386 HT HOH 325 1.16685 4.86136 30.2743 1.00 0.00 WATR +ATOM 1387 OT HOH 326 4.38701 6.73869 30.2743 1.00 0.00 WATR +ATOM 1388 HT HOH 326 5.14396 7.32457 30.2743 1.00 0.00 WATR +ATOM 1389 HT HOH 326 3.63006 7.32457 30.2743 1.00 0.00 WATR +ATOM 1390 OT HOH 327 4.38701 4.27548 32.7375 1.00 0.00 WATR +ATOM 1391 HT HOH 327 5.14396 4.86136 32.7375 1.00 0.00 WATR +ATOM 1392 HT HOH 327 3.63006 4.86136 32.7375 1.00 0.00 WATR +ATOM 1393 OT HOH 328 1.92380 6.73869 32.7375 1.00 0.00 WATR +ATOM 1394 HT HOH 328 2.68075 7.32457 32.7375 1.00 0.00 WATR +ATOM 1395 HT HOH 328 1.16685 7.32457 32.7375 1.00 0.00 WATR +ATOM 1396 OT HOH 329 1.92380 9.20189 -4.2105 1.00 0.00 WATR +ATOM 1397 HT HOH 329 2.68075 9.78777 -4.2105 1.00 0.00 WATR +ATOM 1398 HT HOH 329 1.16685 9.78777 -4.2105 1.00 0.00 WATR +ATOM 1399 OT HOH 330 4.38701 11.6651 -4.2105 1.00 0.00 WATR +ATOM 1400 HT HOH 330 5.14396 12.2509 -4.2105 1.00 0.00 WATR +ATOM 1401 HT HOH 330 3.63006 12.2509 -4.2105 1.00 0.00 WATR +ATOM 1402 OT HOH 331 4.38701 9.20189 13.0318 1.00 0.00 WATR +ATOM 1403 HT HOH 331 5.14396 9.78777 13.0318 1.00 0.00 WATR +ATOM 1404 HT HOH 331 3.63006 9.78777 13.0318 1.00 0.00 WATR +ATOM 1405 OT HOH 332 4.38701 11.6651 15.4951 1.00 0.00 WATR +ATOM 1406 HT HOH 332 5.14396 12.2509 15.4951 1.00 0.00 WATR +ATOM 1407 HT HOH 332 3.63006 12.2509 15.4951 1.00 0.00 WATR +ATOM 1408 OT HOH 333 4.38701 9.20189 17.9583 1.00 0.00 WATR +ATOM 1409 HT HOH 333 5.14396 9.78777 17.9583 1.00 0.00 WATR +ATOM 1410 HT HOH 333 3.63006 9.78777 17.9583 1.00 0.00 WATR +ATOM 1411 OT HOH 334 1.92380 11.6651 17.9583 1.00 0.00 WATR +ATOM 1412 HT HOH 334 2.68075 12.2509 17.9583 1.00 0.00 WATR +ATOM 1413 HT HOH 334 1.16685 12.2509 17.9583 1.00 0.00 WATR +ATOM 1414 OT HOH 335 4.38701 11.6651 20.4215 1.00 0.00 WATR +ATOM 1415 HT HOH 335 5.14396 12.2509 20.4215 1.00 0.00 WATR +ATOM 1416 HT HOH 335 3.63006 12.2509 20.4215 1.00 0.00 WATR +ATOM 1417 OT HOH 336 4.38701 9.20189 22.8847 1.00 0.00 WATR +ATOM 1418 HT HOH 336 5.14396 9.78777 22.8847 1.00 0.00 WATR +ATOM 1419 HT HOH 336 3.63006 9.78777 22.8847 1.00 0.00 WATR +ATOM 1420 OT HOH 337 1.92380 11.6651 22.8847 1.00 0.00 WATR +ATOM 1421 HT HOH 337 2.68075 12.2509 22.8847 1.00 0.00 WATR +ATOM 1422 HT HOH 337 1.16685 12.2509 22.8847 1.00 0.00 WATR +ATOM 1423 OT HOH 338 4.38701 11.6651 25.3479 1.00 0.00 WATR +ATOM 1424 HT HOH 338 5.14396 12.2509 25.3479 1.00 0.00 WATR +ATOM 1425 HT HOH 338 3.63006 12.2509 25.3479 1.00 0.00 WATR +ATOM 1426 OT HOH 339 4.38701 9.20189 27.8111 1.00 0.00 WATR +ATOM 1427 HT HOH 339 5.14396 9.78777 27.8111 1.00 0.00 WATR +ATOM 1428 HT HOH 339 3.63006 9.78777 27.8111 1.00 0.00 WATR +ATOM 1429 OT HOH 340 1.92380 9.20189 30.2743 1.00 0.00 WATR +ATOM 1430 HT HOH 340 2.68075 9.78777 30.2743 1.00 0.00 WATR +ATOM 1431 HT HOH 340 1.16685 9.78777 30.2743 1.00 0.00 WATR +ATOM 1432 OT HOH 341 4.38701 11.6651 30.2743 1.00 0.00 WATR +ATOM 1433 HT HOH 341 5.14396 12.2509 30.2743 1.00 0.00 WATR +ATOM 1434 HT HOH 341 3.63006 12.2509 30.2743 1.00 0.00 WATR +ATOM 1435 OT HOH 342 4.38701 9.20189 32.7375 1.00 0.00 WATR +ATOM 1436 HT HOH 342 5.14396 9.78777 32.7375 1.00 0.00 WATR +ATOM 1437 HT HOH 342 3.63006 9.78777 32.7375 1.00 0.00 WATR +ATOM 1438 SOD ION 343 1.92380 11.6651 32.7375 1.00 0.00 SALT +ATOM 1439 OT HOH 344 4.38701 16.5915 -4.2105 1.00 0.00 WATR +ATOM 1440 HT HOH 344 5.14396 17.1773 -4.2105 1.00 0.00 WATR +ATOM 1441 HT HOH 344 3.63006 17.1773 -4.2105 1.00 0.00 WATR +ATOM 1442 OT HOH 345 4.38701 14.1283 -1.7473 1.00 0.00 WATR +ATOM 1443 HT HOH 345 5.14396 14.7141 -1.7473 1.00 0.00 WATR +ATOM 1444 HT HOH 345 3.63006 14.7141 -1.7473 1.00 0.00 WATR +ATOM 1445 OT HOH 346 4.38701 16.5915 0.71587 1.00 0.00 WATR +ATOM 1446 HT HOH 346 5.14396 17.1773 0.71587 1.00 0.00 WATR +ATOM 1447 HT HOH 346 3.63006 17.1773 0.71587 1.00 0.00 WATR +ATOM 1448 SOD ION 347 1.92380 16.5915 3.17907 1.00 0.00 SALT +ATOM 1449 OT HOH 348 4.38701 16.5915 15.4951 1.00 0.00 WATR +ATOM 1450 HT HOH 348 5.14396 17.1773 15.4951 1.00 0.00 WATR +ATOM 1451 HT HOH 348 3.63006 17.1773 15.4951 1.00 0.00 WATR +ATOM 1452 OT HOH 349 4.38701 14.1283 17.9583 1.00 0.00 WATR +ATOM 1453 HT HOH 349 5.14396 14.7141 17.9583 1.00 0.00 WATR +ATOM 1454 HT HOH 349 3.63006 14.7141 17.9583 1.00 0.00 WATR +ATOM 1455 OT HOH 350 1.92380 16.5915 17.9583 1.00 0.00 WATR +ATOM 1456 HT HOH 350 2.68075 17.1773 17.9583 1.00 0.00 WATR +ATOM 1457 HT HOH 350 1.16685 17.1773 17.9583 1.00 0.00 WATR +ATOM 1458 OT HOH 351 1.92380 14.1283 20.4215 1.00 0.00 WATR +ATOM 1459 HT HOH 351 2.68075 14.7141 20.4215 1.00 0.00 WATR +ATOM 1460 HT HOH 351 1.16685 14.7141 20.4215 1.00 0.00 WATR +ATOM 1461 OT HOH 352 4.38701 16.5915 20.4215 1.00 0.00 WATR +ATOM 1462 HT HOH 352 5.14396 17.1773 20.4215 1.00 0.00 WATR +ATOM 1463 HT HOH 352 3.63006 17.1773 20.4215 1.00 0.00 WATR +ATOM 1464 OT HOH 353 4.38701 14.1283 22.8847 1.00 0.00 WATR +ATOM 1465 HT HOH 353 5.14396 14.7141 22.8847 1.00 0.00 WATR +ATOM 1466 HT HOH 353 3.63006 14.7141 22.8847 1.00 0.00 WATR +ATOM 1467 OT HOH 354 1.92380 16.5915 22.8847 1.00 0.00 WATR +ATOM 1468 HT HOH 354 2.68075 17.1773 22.8847 1.00 0.00 WATR +ATOM 1469 HT HOH 354 1.16685 17.1773 22.8847 1.00 0.00 WATR +ATOM 1470 OT HOH 355 4.38701 16.5915 25.3479 1.00 0.00 WATR +ATOM 1471 HT HOH 355 5.14396 17.1773 25.3479 1.00 0.00 WATR +ATOM 1472 HT HOH 355 3.63006 17.1773 25.3479 1.00 0.00 WATR +ATOM 1473 OT HOH 356 4.38701 14.1283 27.8111 1.00 0.00 WATR +ATOM 1474 HT HOH 356 5.14396 14.7141 27.8111 1.00 0.00 WATR +ATOM 1475 HT HOH 356 3.63006 14.7141 27.8111 1.00 0.00 WATR +ATOM 1476 OT HOH 357 1.92380 16.5915 27.8111 1.00 0.00 WATR +ATOM 1477 HT HOH 357 2.68075 17.1773 27.8111 1.00 0.00 WATR +ATOM 1478 HT HOH 357 1.16685 17.1773 27.8111 1.00 0.00 WATR +ATOM 1479 OT HOH 358 1.92380 14.1283 30.2743 1.00 0.00 WATR +ATOM 1480 HT HOH 358 2.68075 14.7141 30.2743 1.00 0.00 WATR +ATOM 1481 HT HOH 358 1.16685 14.7141 30.2743 1.00 0.00 WATR +ATOM 1482 OT HOH 359 4.38701 16.5915 30.2743 1.00 0.00 WATR +ATOM 1483 HT HOH 359 5.14396 17.1773 30.2743 1.00 0.00 WATR +ATOM 1484 HT HOH 359 3.63006 17.1773 30.2743 1.00 0.00 WATR +ATOM 1485 OT HOH 360 4.38701 14.1283 32.7375 1.00 0.00 WATR +ATOM 1486 HT HOH 360 5.14396 14.7141 32.7375 1.00 0.00 WATR +ATOM 1487 HT HOH 360 3.63006 14.7141 32.7375 1.00 0.00 WATR +ATOM 1488 OT HOH 361 1.92380 16.5915 32.7375 1.00 0.00 WATR +ATOM 1489 HT HOH 361 2.68075 17.1773 32.7375 1.00 0.00 WATR +ATOM 1490 HT HOH 361 1.16685 17.1773 32.7375 1.00 0.00 WATR +ATOM 1491 OT HOH 362 4.38701 21.5179 -4.2105 1.00 0.00 WATR +ATOM 1492 HT HOH 362 5.14396 22.1038 -4.2105 1.00 0.00 WATR +ATOM 1493 HT HOH 362 3.63006 22.1038 -4.2105 1.00 0.00 WATR +ATOM 1494 OT HOH 363 4.38701 19.0547 -1.7473 1.00 0.00 WATR +ATOM 1495 HT HOH 363 5.14396 19.6406 -1.7473 1.00 0.00 WATR +ATOM 1496 HT HOH 363 3.63006 19.6406 -1.7473 1.00 0.00 WATR +ATOM 1497 OT HOH 364 1.92380 21.5179 -1.7473 1.00 0.00 WATR +ATOM 1498 HT HOH 364 2.68075 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1499 HT HOH 364 1.16685 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1500 OT HOH 365 1.92380 19.0547 0.71587 1.00 0.00 WATR +ATOM 1501 HT HOH 365 2.68075 19.6406 0.71587 1.00 0.00 WATR +ATOM 1502 HT HOH 365 1.16685 19.6406 0.71587 1.00 0.00 WATR +ATOM 1503 OT HOH 366 4.38701 21.5179 0.71587 1.00 0.00 WATR +ATOM 1504 HT HOH 366 5.14396 22.1038 0.71587 1.00 0.00 WATR +ATOM 1505 HT HOH 366 3.63006 22.1038 0.71587 1.00 0.00 WATR +ATOM 1506 OT HOH 367 4.38701 19.0547 3.17907 1.00 0.00 WATR +ATOM 1507 HT HOH 367 5.14396 19.6406 3.17907 1.00 0.00 WATR +ATOM 1508 HT HOH 367 3.63006 19.6406 3.17907 1.00 0.00 WATR +ATOM 1509 OT HOH 368 1.92380 21.5179 3.17907 1.00 0.00 WATR +ATOM 1510 HT HOH 368 2.68075 22.1038 3.17907 1.00 0.00 WATR +ATOM 1511 HT HOH 368 1.16685 22.1038 3.17907 1.00 0.00 WATR +ATOM 1512 OT HOH 369 4.38701 21.5179 5.64228 1.00 0.00 WATR +ATOM 1513 HT HOH 369 5.14396 22.1038 5.64228 1.00 0.00 WATR +ATOM 1514 HT HOH 369 3.63006 22.1038 5.64228 1.00 0.00 WATR +ATOM 1515 OT HOH 370 4.38701 21.5179 10.5686 1.00 0.00 WATR +ATOM 1516 HT HOH 370 5.14396 22.1038 10.5686 1.00 0.00 WATR +ATOM 1517 HT HOH 370 3.63006 22.1038 10.5686 1.00 0.00 WATR +ATOM 1518 OT HOH 371 4.38701 19.0547 13.0318 1.00 0.00 WATR +ATOM 1519 HT HOH 371 5.14396 19.6406 13.0318 1.00 0.00 WATR +ATOM 1520 HT HOH 371 3.63006 19.6406 13.0318 1.00 0.00 WATR +ATOM 1521 OT HOH 372 1.92380 19.0547 15.4951 1.00 0.00 WATR +ATOM 1522 HT HOH 372 2.68075 19.6406 15.4951 1.00 0.00 WATR +ATOM 1523 HT HOH 372 1.16685 19.6406 15.4951 1.00 0.00 WATR +ATOM 1524 OT HOH 373 4.38701 21.5179 15.4951 1.00 0.00 WATR +ATOM 1525 HT HOH 373 5.14396 22.1038 15.4951 1.00 0.00 WATR +ATOM 1526 HT HOH 373 3.63006 22.1038 15.4951 1.00 0.00 WATR +ATOM 1527 OT HOH 374 4.38701 19.0547 17.9583 1.00 0.00 WATR +ATOM 1528 HT HOH 374 5.14396 19.6406 17.9583 1.00 0.00 WATR +ATOM 1529 HT HOH 374 3.63006 19.6406 17.9583 1.00 0.00 WATR +ATOM 1530 OT HOH 375 1.92380 21.5179 17.9583 1.00 0.00 WATR +ATOM 1531 HT HOH 375 2.68075 22.1038 17.9583 1.00 0.00 WATR +ATOM 1532 HT HOH 375 1.16685 22.1038 17.9583 1.00 0.00 WATR +ATOM 1533 OT HOH 376 1.92380 19.0547 20.4215 1.00 0.00 WATR +ATOM 1534 HT HOH 376 2.68075 19.6406 20.4215 1.00 0.00 WATR +ATOM 1535 HT HOH 376 1.16685 19.6406 20.4215 1.00 0.00 WATR +ATOM 1536 OT HOH 377 4.38701 21.5179 20.4215 1.00 0.00 WATR +ATOM 1537 HT HOH 377 5.14396 22.1038 20.4215 1.00 0.00 WATR +ATOM 1538 HT HOH 377 3.63006 22.1038 20.4215 1.00 0.00 WATR +ATOM 1539 OT HOH 378 4.38701 19.0547 22.8847 1.00 0.00 WATR +ATOM 1540 HT HOH 378 5.14396 19.6406 22.8847 1.00 0.00 WATR +ATOM 1541 HT HOH 378 3.63006 19.6406 22.8847 1.00 0.00 WATR +ATOM 1542 OT HOH 379 1.92380 21.5179 22.8847 1.00 0.00 WATR +ATOM 1543 HT HOH 379 2.68075 22.1038 22.8847 1.00 0.00 WATR +ATOM 1544 HT HOH 379 1.16685 22.1038 22.8847 1.00 0.00 WATR +ATOM 1545 OT HOH 380 1.92380 19.0547 25.3479 1.00 0.00 WATR +ATOM 1546 HT HOH 380 2.68075 19.6406 25.3479 1.00 0.00 WATR +ATOM 1547 HT HOH 380 1.16685 19.6406 25.3479 1.00 0.00 WATR +ATOM 1548 OT HOH 381 4.38701 21.5179 25.3479 1.00 0.00 WATR +ATOM 1549 HT HOH 381 5.14396 22.1038 25.3479 1.00 0.00 WATR +ATOM 1550 HT HOH 381 3.63006 22.1038 25.3479 1.00 0.00 WATR +ATOM 1551 OT HOH 382 4.38701 19.0547 27.8111 1.00 0.00 WATR +ATOM 1552 HT HOH 382 5.14396 19.6406 27.8111 1.00 0.00 WATR +ATOM 1553 HT HOH 382 3.63006 19.6406 27.8111 1.00 0.00 WATR +ATOM 1554 OT HOH 383 1.92380 21.5179 27.8111 1.00 0.00 WATR +ATOM 1555 HT HOH 383 2.68075 22.1038 27.8111 1.00 0.00 WATR +ATOM 1556 HT HOH 383 1.16685 22.1038 27.8111 1.00 0.00 WATR +ATOM 1557 OT HOH 384 1.92380 19.0547 30.2743 1.00 0.00 WATR +ATOM 1558 HT HOH 384 2.68075 19.6406 30.2743 1.00 0.00 WATR +ATOM 1559 HT HOH 384 1.16685 19.6406 30.2743 1.00 0.00 WATR +ATOM 1560 OT HOH 385 4.38701 21.5179 30.2743 1.00 0.00 WATR +ATOM 1561 HT HOH 385 5.14396 22.1038 30.2743 1.00 0.00 WATR +ATOM 1562 HT HOH 385 3.63006 22.1038 30.2743 1.00 0.00 WATR +ATOM 1563 OT HOH 386 4.38701 19.0547 32.7375 1.00 0.00 WATR +ATOM 1564 HT HOH 386 5.14396 19.6406 32.7375 1.00 0.00 WATR +ATOM 1565 HT HOH 386 3.63006 19.6406 32.7375 1.00 0.00 WATR +ATOM 1566 OT HOH 387 1.92380 21.5179 32.7375 1.00 0.00 WATR +ATOM 1567 HT HOH 387 2.68075 22.1038 32.7375 1.00 0.00 WATR +ATOM 1568 HT HOH 387 1.16685 22.1038 32.7375 1.00 0.00 WATR +ATOM 1569 OT HOH 388 6.85021 -0.6509 -4.2105 1.00 0.00 WATR +ATOM 1570 HT HOH 388 7.60716 -0.0650 -4.2105 1.00 0.00 WATR +ATOM 1571 HT HOH 388 6.09326 -0.0650 -4.2105 1.00 0.00 WATR +ATOM 1572 OT HOH 389 9.31342 1.81228 -4.2105 1.00 0.00 WATR +ATOM 1573 HT HOH 389 10.0703 2.39816 -4.2105 1.00 0.00 WATR +ATOM 1574 HT HOH 389 8.55647 2.39816 -4.2105 1.00 0.00 WATR +ATOM 1575 OT HOH 390 9.31342 -0.6509 -1.7473 1.00 0.00 WATR +ATOM 1576 HT HOH 390 10.0703 -0.0650 -1.7473 1.00 0.00 WATR +ATOM 1577 HT HOH 390 8.55647 -0.0650 -1.7473 1.00 0.00 WATR +ATOM 1578 OT HOH 391 9.31342 1.81228 0.71587 1.00 0.00 WATR +ATOM 1579 HT HOH 391 10.0703 2.39816 0.71587 1.00 0.00 WATR +ATOM 1580 HT HOH 391 8.55647 2.39816 0.71587 1.00 0.00 WATR +ATOM 1581 OT HOH 392 9.31342 -0.6509 3.17907 1.00 0.00 WATR +ATOM 1582 HT HOH 392 10.0703 -0.0650 3.17907 1.00 0.00 WATR +ATOM 1583 HT HOH 392 8.55647 -0.0650 3.17907 1.00 0.00 WATR +ATOM 1584 OT HOH 393 6.85021 -0.6509 5.64228 1.00 0.00 WATR +ATOM 1585 HT HOH 393 7.60716 -0.0650 5.64228 1.00 0.00 WATR +ATOM 1586 HT HOH 393 6.09326 -0.0650 5.64228 1.00 0.00 WATR ATOM 1587 OT HOH 394 9.31342 1.81228 5.64228 1.00 0.00 WATR ATOM 1588 HT HOH 394 10.0703 2.39816 5.64228 1.00 0.00 WATR ATOM 1589 HT HOH 394 8.55647 2.39816 5.64228 1.00 0.00 WATR @@ -1651,79 +1651,79 @@ ATOM 1646 HT HOH 413 6.09326 -0.0650 30.2743 1.00 0.00 WATR ATOM 1647 OT HOH 414 9.31342 1.81228 30.2743 1.00 0.00 WATR ATOM 1648 HT HOH 414 10.0703 2.39816 30.2743 1.00 0.00 WATR ATOM 1649 HT HOH 414 8.55647 2.39816 30.2743 1.00 0.00 WATR -ATOM 1650 SOD ION 415 9.31342 -0.6509 32.7375 1.00 0.00 SALT -ATOM 1651 OT HOH 416 6.85021 1.81228 32.7375 1.00 0.00 WATR -ATOM 1652 HT HOH 416 7.60716 2.39816 32.7375 1.00 0.00 WATR -ATOM 1653 HT HOH 416 6.09326 2.39816 32.7375 1.00 0.00 WATR -ATOM 1654 OT HOH 417 9.31342 6.73869 -4.2105 1.00 0.00 WATR -ATOM 1655 HT HOH 417 10.0703 7.32457 -4.2105 1.00 0.00 WATR -ATOM 1656 HT HOH 417 8.55647 7.32457 -4.2105 1.00 0.00 WATR -ATOM 1657 OT HOH 418 9.31342 6.73869 5.64228 1.00 0.00 WATR -ATOM 1658 HT HOH 418 10.0703 7.32457 5.64228 1.00 0.00 WATR -ATOM 1659 HT HOH 418 8.55647 7.32457 5.64228 1.00 0.00 WATR -ATOM 1660 OT HOH 419 9.31342 4.27548 8.10548 1.00 0.00 WATR -ATOM 1661 HT HOH 419 10.0703 4.86136 8.10548 1.00 0.00 WATR -ATOM 1662 HT HOH 419 8.55647 4.86136 8.10548 1.00 0.00 WATR -ATOM 1663 OT HOH 420 6.85021 6.73869 8.10548 1.00 0.00 WATR -ATOM 1664 HT HOH 420 7.60716 7.32457 8.10548 1.00 0.00 WATR -ATOM 1665 HT HOH 420 6.09326 7.32457 8.10548 1.00 0.00 WATR -ATOM 1666 OT HOH 421 6.85021 4.27548 10.5686 1.00 0.00 WATR -ATOM 1667 HT HOH 421 7.60716 4.86136 10.5686 1.00 0.00 WATR -ATOM 1668 HT HOH 421 6.09326 4.86136 10.5686 1.00 0.00 WATR -ATOM 1669 OT HOH 422 9.31342 6.73869 10.5686 1.00 0.00 WATR -ATOM 1670 HT HOH 422 10.0703 7.32457 10.5686 1.00 0.00 WATR -ATOM 1671 HT HOH 422 8.55647 7.32457 10.5686 1.00 0.00 WATR -ATOM 1672 OT HOH 423 9.31342 4.27548 13.0318 1.00 0.00 WATR -ATOM 1673 HT HOH 423 10.0703 4.86136 13.0318 1.00 0.00 WATR -ATOM 1674 HT HOH 423 8.55647 4.86136 13.0318 1.00 0.00 WATR -ATOM 1675 OT HOH 424 6.85021 6.73869 13.0318 1.00 0.00 WATR -ATOM 1676 HT HOH 424 7.60716 7.32457 13.0318 1.00 0.00 WATR -ATOM 1677 HT HOH 424 6.09326 7.32457 13.0318 1.00 0.00 WATR -ATOM 1678 OT HOH 425 6.85021 4.27548 15.4951 1.00 0.00 WATR -ATOM 1679 HT HOH 425 7.60716 4.86136 15.4951 1.00 0.00 WATR -ATOM 1680 HT HOH 425 6.09326 4.86136 15.4951 1.00 0.00 WATR -ATOM 1681 OT HOH 426 9.31342 6.73869 15.4951 1.00 0.00 WATR -ATOM 1682 HT HOH 426 10.0703 7.32457 15.4951 1.00 0.00 WATR -ATOM 1683 HT HOH 426 8.55647 7.32457 15.4951 1.00 0.00 WATR -ATOM 1684 OT HOH 427 9.31342 4.27548 17.9583 1.00 0.00 WATR -ATOM 1685 HT HOH 427 10.0703 4.86136 17.9583 1.00 0.00 WATR -ATOM 1686 HT HOH 427 8.55647 4.86136 17.9583 1.00 0.00 WATR -ATOM 1687 OT HOH 428 6.85021 6.73869 17.9583 1.00 0.00 WATR -ATOM 1688 HT HOH 428 7.60716 7.32457 17.9583 1.00 0.00 WATR -ATOM 1689 HT HOH 428 6.09326 7.32457 17.9583 1.00 0.00 WATR -ATOM 1690 OT HOH 429 6.85021 4.27548 20.4215 1.00 0.00 WATR -ATOM 1691 HT HOH 429 7.60716 4.86136 20.4215 1.00 0.00 WATR -ATOM 1692 HT HOH 429 6.09326 4.86136 20.4215 1.00 0.00 WATR -ATOM 1693 OT HOH 430 9.31342 6.73869 20.4215 1.00 0.00 WATR -ATOM 1694 HT HOH 430 10.0703 7.32457 20.4215 1.00 0.00 WATR -ATOM 1695 HT HOH 430 8.55647 7.32457 20.4215 1.00 0.00 WATR -ATOM 1696 OT HOH 431 9.31342 4.27548 22.8847 1.00 0.00 WATR -ATOM 1697 HT HOH 431 10.0703 4.86136 22.8847 1.00 0.00 WATR -ATOM 1698 HT HOH 431 8.55647 4.86136 22.8847 1.00 0.00 WATR -ATOM 1699 OT HOH 432 6.85021 6.73869 22.8847 1.00 0.00 WATR -ATOM 1700 HT HOH 432 7.60716 7.32457 22.8847 1.00 0.00 WATR -ATOM 1701 HT HOH 432 6.09326 7.32457 22.8847 1.00 0.00 WATR -ATOM 1702 OT HOH 433 6.85021 4.27548 25.3479 1.00 0.00 WATR -ATOM 1703 HT HOH 433 7.60716 4.86136 25.3479 1.00 0.00 WATR -ATOM 1704 HT HOH 433 6.09326 4.86136 25.3479 1.00 0.00 WATR -ATOM 1705 OT HOH 434 9.31342 6.73869 25.3479 1.00 0.00 WATR -ATOM 1706 HT HOH 434 10.0703 7.32457 25.3479 1.00 0.00 WATR -ATOM 1707 HT HOH 434 8.55647 7.32457 25.3479 1.00 0.00 WATR -ATOM 1708 OT HOH 435 9.31342 4.27548 27.8111 1.00 0.00 WATR -ATOM 1709 HT HOH 435 10.0703 4.86136 27.8111 1.00 0.00 WATR -ATOM 1710 HT HOH 435 8.55647 4.86136 27.8111 1.00 0.00 WATR -ATOM 1711 OT HOH 436 6.85021 6.73869 27.8111 1.00 0.00 WATR -ATOM 1712 HT HOH 436 7.60716 7.32457 27.8111 1.00 0.00 WATR -ATOM 1713 HT HOH 436 6.09326 7.32457 27.8111 1.00 0.00 WATR -ATOM 1714 OT HOH 437 6.85021 4.27548 30.2743 1.00 0.00 WATR -ATOM 1715 HT HOH 437 7.60716 4.86136 30.2743 1.00 0.00 WATR -ATOM 1716 HT HOH 437 6.09326 4.86136 30.2743 1.00 0.00 WATR -ATOM 1717 OT HOH 438 9.31342 6.73869 30.2743 1.00 0.00 WATR -ATOM 1718 HT HOH 438 10.0703 7.32457 30.2743 1.00 0.00 WATR -ATOM 1719 HT HOH 438 8.55647 7.32457 30.2743 1.00 0.00 WATR -ATOM 1720 OT HOH 439 9.31342 4.27548 32.7375 1.00 0.00 WATR -ATOM 1721 HT HOH 439 10.0703 4.86136 32.7375 1.00 0.00 WATR -ATOM 1722 HT HOH 439 8.55647 4.86136 32.7375 1.00 0.00 WATR +ATOM 1650 OT HOH 415 9.31342 -0.6509 32.7375 1.00 0.00 WATR +ATOM 1651 HT HOH 415 10.0703 -0.0650 32.7375 1.00 0.00 WATR +ATOM 1652 HT HOH 415 8.55647 -0.0650 32.7375 1.00 0.00 WATR +ATOM 1653 OT HOH 416 6.85021 1.81228 32.7375 1.00 0.00 WATR +ATOM 1654 HT HOH 416 7.60716 2.39816 32.7375 1.00 0.00 WATR +ATOM 1655 HT HOH 416 6.09326 2.39816 32.7375 1.00 0.00 WATR +ATOM 1656 OT HOH 417 9.31342 6.73869 -4.2105 1.00 0.00 WATR +ATOM 1657 HT HOH 417 10.0703 7.32457 -4.2105 1.00 0.00 WATR +ATOM 1658 HT HOH 417 8.55647 7.32457 -4.2105 1.00 0.00 WATR +ATOM 1659 OT HOH 418 9.31342 6.73869 5.64228 1.00 0.00 WATR +ATOM 1660 HT HOH 418 10.0703 7.32457 5.64228 1.00 0.00 WATR +ATOM 1661 HT HOH 418 8.55647 7.32457 5.64228 1.00 0.00 WATR +ATOM 1662 OT HOH 419 9.31342 4.27548 8.10548 1.00 0.00 WATR +ATOM 1663 HT HOH 419 10.0703 4.86136 8.10548 1.00 0.00 WATR +ATOM 1664 HT HOH 419 8.55647 4.86136 8.10548 1.00 0.00 WATR +ATOM 1665 OT HOH 420 6.85021 6.73869 8.10548 1.00 0.00 WATR +ATOM 1666 HT HOH 420 7.60716 7.32457 8.10548 1.00 0.00 WATR +ATOM 1667 HT HOH 420 6.09326 7.32457 8.10548 1.00 0.00 WATR +ATOM 1668 OT HOH 421 6.85021 4.27548 10.5686 1.00 0.00 WATR +ATOM 1669 HT HOH 421 7.60716 4.86136 10.5686 1.00 0.00 WATR +ATOM 1670 HT HOH 421 6.09326 4.86136 10.5686 1.00 0.00 WATR +ATOM 1671 OT HOH 422 9.31342 6.73869 10.5686 1.00 0.00 WATR +ATOM 1672 HT HOH 422 10.0703 7.32457 10.5686 1.00 0.00 WATR +ATOM 1673 HT HOH 422 8.55647 7.32457 10.5686 1.00 0.00 WATR +ATOM 1674 OT HOH 423 9.31342 4.27548 13.0318 1.00 0.00 WATR +ATOM 1675 HT HOH 423 10.0703 4.86136 13.0318 1.00 0.00 WATR +ATOM 1676 HT HOH 423 8.55647 4.86136 13.0318 1.00 0.00 WATR +ATOM 1677 OT HOH 424 6.85021 6.73869 13.0318 1.00 0.00 WATR +ATOM 1678 HT HOH 424 7.60716 7.32457 13.0318 1.00 0.00 WATR +ATOM 1679 HT HOH 424 6.09326 7.32457 13.0318 1.00 0.00 WATR +ATOM 1680 OT HOH 425 6.85021 4.27548 15.4951 1.00 0.00 WATR +ATOM 1681 HT HOH 425 7.60716 4.86136 15.4951 1.00 0.00 WATR +ATOM 1682 HT HOH 425 6.09326 4.86136 15.4951 1.00 0.00 WATR +ATOM 1683 OT HOH 426 9.31342 6.73869 15.4951 1.00 0.00 WATR +ATOM 1684 HT HOH 426 10.0703 7.32457 15.4951 1.00 0.00 WATR +ATOM 1685 HT HOH 426 8.55647 7.32457 15.4951 1.00 0.00 WATR +ATOM 1686 OT HOH 427 9.31342 4.27548 17.9583 1.00 0.00 WATR +ATOM 1687 HT HOH 427 10.0703 4.86136 17.9583 1.00 0.00 WATR +ATOM 1688 HT HOH 427 8.55647 4.86136 17.9583 1.00 0.00 WATR +ATOM 1689 OT HOH 428 6.85021 6.73869 17.9583 1.00 0.00 WATR +ATOM 1690 HT HOH 428 7.60716 7.32457 17.9583 1.00 0.00 WATR +ATOM 1691 HT HOH 428 6.09326 7.32457 17.9583 1.00 0.00 WATR +ATOM 1692 OT HOH 429 6.85021 4.27548 20.4215 1.00 0.00 WATR +ATOM 1693 HT HOH 429 7.60716 4.86136 20.4215 1.00 0.00 WATR +ATOM 1694 HT HOH 429 6.09326 4.86136 20.4215 1.00 0.00 WATR +ATOM 1695 OT HOH 430 9.31342 6.73869 20.4215 1.00 0.00 WATR +ATOM 1696 HT HOH 430 10.0703 7.32457 20.4215 1.00 0.00 WATR +ATOM 1697 HT HOH 430 8.55647 7.32457 20.4215 1.00 0.00 WATR +ATOM 1698 OT HOH 431 9.31342 4.27548 22.8847 1.00 0.00 WATR +ATOM 1699 HT HOH 431 10.0703 4.86136 22.8847 1.00 0.00 WATR +ATOM 1700 HT HOH 431 8.55647 4.86136 22.8847 1.00 0.00 WATR +ATOM 1701 OT HOH 432 6.85021 6.73869 22.8847 1.00 0.00 WATR +ATOM 1702 HT HOH 432 7.60716 7.32457 22.8847 1.00 0.00 WATR +ATOM 1703 HT HOH 432 6.09326 7.32457 22.8847 1.00 0.00 WATR +ATOM 1704 OT HOH 433 6.85021 4.27548 25.3479 1.00 0.00 WATR +ATOM 1705 HT HOH 433 7.60716 4.86136 25.3479 1.00 0.00 WATR +ATOM 1706 HT HOH 433 6.09326 4.86136 25.3479 1.00 0.00 WATR +ATOM 1707 OT HOH 434 9.31342 6.73869 25.3479 1.00 0.00 WATR +ATOM 1708 HT HOH 434 10.0703 7.32457 25.3479 1.00 0.00 WATR +ATOM 1709 HT HOH 434 8.55647 7.32457 25.3479 1.00 0.00 WATR +ATOM 1710 OT HOH 435 9.31342 4.27548 27.8111 1.00 0.00 WATR +ATOM 1711 HT HOH 435 10.0703 4.86136 27.8111 1.00 0.00 WATR +ATOM 1712 HT HOH 435 8.55647 4.86136 27.8111 1.00 0.00 WATR +ATOM 1713 OT HOH 436 6.85021 6.73869 27.8111 1.00 0.00 WATR +ATOM 1714 HT HOH 436 7.60716 7.32457 27.8111 1.00 0.00 WATR +ATOM 1715 HT HOH 436 6.09326 7.32457 27.8111 1.00 0.00 WATR +ATOM 1716 OT HOH 437 6.85021 4.27548 30.2743 1.00 0.00 WATR +ATOM 1717 HT HOH 437 7.60716 4.86136 30.2743 1.00 0.00 WATR +ATOM 1718 HT HOH 437 6.09326 4.86136 30.2743 1.00 0.00 WATR +ATOM 1719 OT HOH 438 9.31342 6.73869 30.2743 1.00 0.00 WATR +ATOM 1720 HT HOH 438 10.0703 7.32457 30.2743 1.00 0.00 WATR +ATOM 1721 HT HOH 438 8.55647 7.32457 30.2743 1.00 0.00 WATR +ATOM 1722 SOD ION 439 9.31342 4.27548 32.7375 1.00 0.00 SALT ATOM 1723 OT HOH 440 6.85021 6.73869 32.7375 1.00 0.00 WATR ATOM 1724 HT HOH 440 7.60716 7.32457 32.7375 1.00 0.00 WATR ATOM 1725 HT HOH 440 6.09326 7.32457 32.7375 1.00 0.00 WATR @@ -1889,62 +1889,62 @@ ATOM 1884 HT HOH 493 6.09326 19.6406 -4.2105 1.00 0.00 WATR ATOM 1885 OT HOH 494 9.31342 21.5179 -4.2105 1.00 0.00 WATR ATOM 1886 HT HOH 494 10.0703 22.1038 -4.2105 1.00 0.00 WATR ATOM 1887 HT HOH 494 8.55647 22.1038 -4.2105 1.00 0.00 WATR -ATOM 1888 OT HOH 495 9.31342 19.0547 -1.7473 1.00 0.00 WATR -ATOM 1889 HT HOH 495 10.0703 19.6406 -1.7473 1.00 0.00 WATR -ATOM 1890 HT HOH 495 8.55647 19.6406 -1.7473 1.00 0.00 WATR -ATOM 1891 OT HOH 496 6.85021 21.5179 -1.7473 1.00 0.00 WATR -ATOM 1892 HT HOH 496 7.60716 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1893 HT HOH 496 6.09326 22.1038 -1.7473 1.00 0.00 WATR -ATOM 1894 OT HOH 497 6.85021 19.0547 0.71587 1.00 0.00 WATR -ATOM 1895 HT HOH 497 7.60716 19.6406 0.71587 1.00 0.00 WATR -ATOM 1896 HT HOH 497 6.09326 19.6406 0.71587 1.00 0.00 WATR -ATOM 1897 OT HOH 498 9.31342 21.5179 0.71587 1.00 0.00 WATR -ATOM 1898 HT HOH 498 10.0703 22.1038 0.71587 1.00 0.00 WATR -ATOM 1899 HT HOH 498 8.55647 22.1038 0.71587 1.00 0.00 WATR -ATOM 1900 OT HOH 499 9.31342 19.0547 3.17907 1.00 0.00 WATR -ATOM 1901 HT HOH 499 10.0703 19.6406 3.17907 1.00 0.00 WATR -ATOM 1902 HT HOH 499 8.55647 19.6406 3.17907 1.00 0.00 WATR -ATOM 1903 OT HOH 500 6.85021 21.5179 3.17907 1.00 0.00 WATR -ATOM 1904 HT HOH 500 7.60716 22.1038 3.17907 1.00 0.00 WATR -ATOM 1905 HT HOH 500 6.09326 22.1038 3.17907 1.00 0.00 WATR -ATOM 1906 OT HOH 501 9.31342 21.5179 5.64228 1.00 0.00 WATR -ATOM 1907 HT HOH 501 10.0703 22.1038 5.64228 1.00 0.00 WATR -ATOM 1908 HT HOH 501 8.55647 22.1038 5.64228 1.00 0.00 WATR -ATOM 1909 OT HOH 502 9.31342 19.0547 8.10548 1.00 0.00 WATR -ATOM 1910 HT HOH 502 10.0703 19.6406 8.10548 1.00 0.00 WATR -ATOM 1911 HT HOH 502 8.55647 19.6406 8.10548 1.00 0.00 WATR -ATOM 1912 SOD ION 503 6.85021 21.5179 8.10548 1.00 0.00 SALT -ATOM 1913 OT HOH 504 6.85021 19.0547 10.5686 1.00 0.00 WATR -ATOM 1914 HT HOH 504 7.60716 19.6406 10.5686 1.00 0.00 WATR -ATOM 1915 HT HOH 504 6.09326 19.6406 10.5686 1.00 0.00 WATR -ATOM 1916 OT HOH 505 9.31342 21.5179 10.5686 1.00 0.00 WATR -ATOM 1917 HT HOH 505 10.0703 22.1038 10.5686 1.00 0.00 WATR -ATOM 1918 HT HOH 505 8.55647 22.1038 10.5686 1.00 0.00 WATR -ATOM 1919 OT HOH 506 9.31342 19.0547 13.0318 1.00 0.00 WATR -ATOM 1920 HT HOH 506 10.0703 19.6406 13.0318 1.00 0.00 WATR -ATOM 1921 HT HOH 506 8.55647 19.6406 13.0318 1.00 0.00 WATR -ATOM 1922 OT HOH 507 6.85021 21.5179 13.0318 1.00 0.00 WATR -ATOM 1923 HT HOH 507 7.60716 22.1038 13.0318 1.00 0.00 WATR -ATOM 1924 HT HOH 507 6.09326 22.1038 13.0318 1.00 0.00 WATR -ATOM 1925 OT HOH 508 6.85021 19.0547 15.4951 1.00 0.00 WATR -ATOM 1926 HT HOH 508 7.60716 19.6406 15.4951 1.00 0.00 WATR -ATOM 1927 HT HOH 508 6.09326 19.6406 15.4951 1.00 0.00 WATR -ATOM 1928 OT HOH 509 9.31342 21.5179 15.4951 1.00 0.00 WATR -ATOM 1929 HT HOH 509 10.0703 22.1038 15.4951 1.00 0.00 WATR -ATOM 1930 HT HOH 509 8.55647 22.1038 15.4951 1.00 0.00 WATR -ATOM 1931 OT HOH 510 9.31342 19.0547 17.9583 1.00 0.00 WATR -ATOM 1932 HT HOH 510 10.0703 19.6406 17.9583 1.00 0.00 WATR -ATOM 1933 HT HOH 510 8.55647 19.6406 17.9583 1.00 0.00 WATR -ATOM 1934 OT HOH 511 6.85021 21.5179 17.9583 1.00 0.00 WATR -ATOM 1935 HT HOH 511 7.60716 22.1038 17.9583 1.00 0.00 WATR -ATOM 1936 HT HOH 511 6.09326 22.1038 17.9583 1.00 0.00 WATR -ATOM 1937 OT HOH 512 6.85021 19.0547 20.4215 1.00 0.00 WATR -ATOM 1938 HT HOH 512 7.60716 19.6406 20.4215 1.00 0.00 WATR -ATOM 1939 HT HOH 512 6.09326 19.6406 20.4215 1.00 0.00 WATR -ATOM 1940 OT HOH 513 9.31342 21.5179 20.4215 1.00 0.00 WATR -ATOM 1941 HT HOH 513 10.0703 22.1038 20.4215 1.00 0.00 WATR -ATOM 1942 HT HOH 513 8.55647 22.1038 20.4215 1.00 0.00 WATR -ATOM 1943 SOD ION 514 9.31342 19.0547 22.8847 1.00 0.00 SALT +ATOM 1888 SOD ION 495 9.31342 19.0547 -1.7473 1.00 0.00 SALT +ATOM 1889 OT HOH 496 6.85021 21.5179 -1.7473 1.00 0.00 WATR +ATOM 1890 HT HOH 496 7.60716 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1891 HT HOH 496 6.09326 22.1038 -1.7473 1.00 0.00 WATR +ATOM 1892 OT HOH 497 6.85021 19.0547 0.71587 1.00 0.00 WATR +ATOM 1893 HT HOH 497 7.60716 19.6406 0.71587 1.00 0.00 WATR +ATOM 1894 HT HOH 497 6.09326 19.6406 0.71587 1.00 0.00 WATR +ATOM 1895 SOD ION 498 9.31342 21.5179 0.71587 1.00 0.00 SALT +ATOM 1896 OT HOH 499 9.31342 19.0547 3.17907 1.00 0.00 WATR +ATOM 1897 HT HOH 499 10.0703 19.6406 3.17907 1.00 0.00 WATR +ATOM 1898 HT HOH 499 8.55647 19.6406 3.17907 1.00 0.00 WATR +ATOM 1899 OT HOH 500 6.85021 21.5179 3.17907 1.00 0.00 WATR +ATOM 1900 HT HOH 500 7.60716 22.1038 3.17907 1.00 0.00 WATR +ATOM 1901 HT HOH 500 6.09326 22.1038 3.17907 1.00 0.00 WATR +ATOM 1902 OT HOH 501 9.31342 21.5179 5.64228 1.00 0.00 WATR +ATOM 1903 HT HOH 501 10.0703 22.1038 5.64228 1.00 0.00 WATR +ATOM 1904 HT HOH 501 8.55647 22.1038 5.64228 1.00 0.00 WATR +ATOM 1905 OT HOH 502 9.31342 19.0547 8.10548 1.00 0.00 WATR +ATOM 1906 HT HOH 502 10.0703 19.6406 8.10548 1.00 0.00 WATR +ATOM 1907 HT HOH 502 8.55647 19.6406 8.10548 1.00 0.00 WATR +ATOM 1908 OT HOH 503 6.85021 21.5179 8.10548 1.00 0.00 WATR +ATOM 1909 HT HOH 503 7.60716 22.1038 8.10548 1.00 0.00 WATR +ATOM 1910 HT HOH 503 6.09326 22.1038 8.10548 1.00 0.00 WATR +ATOM 1911 OT HOH 504 6.85021 19.0547 10.5686 1.00 0.00 WATR +ATOM 1912 HT HOH 504 7.60716 19.6406 10.5686 1.00 0.00 WATR +ATOM 1913 HT HOH 504 6.09326 19.6406 10.5686 1.00 0.00 WATR +ATOM 1914 OT HOH 505 9.31342 21.5179 10.5686 1.00 0.00 WATR +ATOM 1915 HT HOH 505 10.0703 22.1038 10.5686 1.00 0.00 WATR +ATOM 1916 HT HOH 505 8.55647 22.1038 10.5686 1.00 0.00 WATR +ATOM 1917 OT HOH 506 9.31342 19.0547 13.0318 1.00 0.00 WATR +ATOM 1918 HT HOH 506 10.0703 19.6406 13.0318 1.00 0.00 WATR +ATOM 1919 HT HOH 506 8.55647 19.6406 13.0318 1.00 0.00 WATR +ATOM 1920 OT HOH 507 6.85021 21.5179 13.0318 1.00 0.00 WATR +ATOM 1921 HT HOH 507 7.60716 22.1038 13.0318 1.00 0.00 WATR +ATOM 1922 HT HOH 507 6.09326 22.1038 13.0318 1.00 0.00 WATR +ATOM 1923 OT HOH 508 6.85021 19.0547 15.4951 1.00 0.00 WATR +ATOM 1924 HT HOH 508 7.60716 19.6406 15.4951 1.00 0.00 WATR +ATOM 1925 HT HOH 508 6.09326 19.6406 15.4951 1.00 0.00 WATR +ATOM 1926 OT HOH 509 9.31342 21.5179 15.4951 1.00 0.00 WATR +ATOM 1927 HT HOH 509 10.0703 22.1038 15.4951 1.00 0.00 WATR +ATOM 1928 HT HOH 509 8.55647 22.1038 15.4951 1.00 0.00 WATR +ATOM 1929 OT HOH 510 9.31342 19.0547 17.9583 1.00 0.00 WATR +ATOM 1930 HT HOH 510 10.0703 19.6406 17.9583 1.00 0.00 WATR +ATOM 1931 HT HOH 510 8.55647 19.6406 17.9583 1.00 0.00 WATR +ATOM 1932 OT HOH 511 6.85021 21.5179 17.9583 1.00 0.00 WATR +ATOM 1933 HT HOH 511 7.60716 22.1038 17.9583 1.00 0.00 WATR +ATOM 1934 HT HOH 511 6.09326 22.1038 17.9583 1.00 0.00 WATR +ATOM 1935 OT HOH 512 6.85021 19.0547 20.4215 1.00 0.00 WATR +ATOM 1936 HT HOH 512 7.60716 19.6406 20.4215 1.00 0.00 WATR +ATOM 1937 HT HOH 512 6.09326 19.6406 20.4215 1.00 0.00 WATR +ATOM 1938 OT HOH 513 9.31342 21.5179 20.4215 1.00 0.00 WATR +ATOM 1939 HT HOH 513 10.0703 22.1038 20.4215 1.00 0.00 WATR +ATOM 1940 HT HOH 513 8.55647 22.1038 20.4215 1.00 0.00 WATR +ATOM 1941 OT HOH 514 9.31342 19.0547 22.8847 1.00 0.00 WATR +ATOM 1942 HT HOH 514 10.0703 19.6406 22.8847 1.00 0.00 WATR +ATOM 1943 HT HOH 514 8.55647 19.6406 22.8847 1.00 0.00 WATR ATOM 1944 OT HOH 515 6.85021 21.5179 22.8847 1.00 0.00 WATR ATOM 1945 HT HOH 515 7.60716 22.1038 22.8847 1.00 0.00 WATR ATOM 1946 HT HOH 515 6.09326 22.1038 22.8847 1.00 0.00 WATR @@ -1957,13 +1957,13 @@ ATOM 1952 HT HOH 517 8.55647 22.1038 25.3479 1.00 0.00 WATR ATOM 1953 OT HOH 518 9.31342 19.0547 27.8111 1.00 0.00 WATR ATOM 1954 HT HOH 518 10.0703 19.6406 27.8111 1.00 0.00 WATR ATOM 1955 HT HOH 518 8.55647 19.6406 27.8111 1.00 0.00 WATR -ATOM 1956 SOD ION 519 6.85021 21.5179 27.8111 1.00 0.00 SALT -ATOM 1957 OT HOH 520 6.85021 19.0547 30.2743 1.00 0.00 WATR -ATOM 1958 HT HOH 520 7.60716 19.6406 30.2743 1.00 0.00 WATR -ATOM 1959 HT HOH 520 6.09326 19.6406 30.2743 1.00 0.00 WATR -ATOM 1960 OT HOH 521 9.31342 21.5179 30.2743 1.00 0.00 WATR -ATOM 1961 HT HOH 521 10.0703 22.1038 30.2743 1.00 0.00 WATR -ATOM 1962 HT HOH 521 8.55647 22.1038 30.2743 1.00 0.00 WATR +ATOM 1956 OT HOH 519 6.85021 21.5179 27.8111 1.00 0.00 WATR +ATOM 1957 HT HOH 519 7.60716 22.1038 27.8111 1.00 0.00 WATR +ATOM 1958 HT HOH 519 6.09326 22.1038 27.8111 1.00 0.00 WATR +ATOM 1959 OT HOH 520 6.85021 19.0547 30.2743 1.00 0.00 WATR +ATOM 1960 HT HOH 520 7.60716 19.6406 30.2743 1.00 0.00 WATR +ATOM 1961 HT HOH 520 6.09326 19.6406 30.2743 1.00 0.00 WATR +ATOM 1962 SOD ION 521 9.31342 21.5179 30.2743 1.00 0.00 SALT ATOM 1963 OT HOH 522 9.31342 19.0547 32.7375 1.00 0.00 WATR ATOM 1964 HT HOH 522 10.0703 19.6406 32.7375 1.00 0.00 WATR ATOM 1965 HT HOH 522 8.55647 19.6406 32.7375 1.00 0.00 WATR diff --git a/tools/ch2lmp/example/1ac7_ctrl.psf b/tools/ch2lmp/example/1ac7_ctrl.psf index 59475bb007..8fc206d590 100644 --- a/tools/ch2lmp/example/1ac7_ctrl.psf +++ b/tools/ch2lmp/example/1ac7_ctrl.psf @@ -2,7 +2,7 @@ PSF 2 !NTITLE REMARKS CONTROL PSF 1ac7_ctrl.psf - REMARKS CREATED BY charmm2lammps v1.9.1 ON Wed Oct 5 18:18:20 EDT 2016 + REMARKS CREATED BY charmm2lammps v1.9.1 ON Sun Jan 28 05:46:18 EST 2018 1968 !NATOM 1 A 1 ADE P 82 1.50000000e+00 30.9740 0 @@ -595,109 +595,109 @@ PSF 588 WATR 21 HOH OT 70 -8.34000000e-01 15.9994 0 589 WATR 21 HOH HT 1 4.17000000e-01 1.00800 0 590 WATR 21 HOH HT 1 4.17000000e-01 1.00800 0 - 591 SALT 1 ION SOD 90 1.00000000e+00 22.9897 0 - 592 WATR 22 HOH OT 70 -8.34000000e-01 15.9994 0 + 591 WATR 22 HOH OT 70 -8.34000000e-01 15.9994 0 + 592 WATR 22 HOH HT 1 4.17000000e-01 1.00800 0 593 WATR 22 HOH HT 1 4.17000000e-01 1.00800 0 - 594 WATR 22 HOH HT 1 4.17000000e-01 1.00800 0 - 595 WATR 23 HOH OT 70 -8.34000000e-01 15.9994 0 + 594 WATR 23 HOH OT 70 -8.34000000e-01 15.9994 0 + 595 WATR 23 HOH HT 1 4.17000000e-01 1.00800 0 596 WATR 23 HOH HT 1 4.17000000e-01 1.00800 0 - 597 WATR 23 HOH HT 1 4.17000000e-01 1.00800 0 - 598 WATR 24 HOH OT 70 -8.34000000e-01 15.9994 0 + 597 WATR 24 HOH OT 70 -8.34000000e-01 15.9994 0 + 598 WATR 24 HOH HT 1 4.17000000e-01 1.00800 0 599 WATR 24 HOH HT 1 4.17000000e-01 1.00800 0 - 600 WATR 24 HOH HT 1 4.17000000e-01 1.00800 0 - 601 WATR 25 HOH OT 70 -8.34000000e-01 15.9994 0 + 600 WATR 25 HOH OT 70 -8.34000000e-01 15.9994 0 + 601 WATR 25 HOH HT 1 4.17000000e-01 1.00800 0 602 WATR 25 HOH HT 1 4.17000000e-01 1.00800 0 - 603 WATR 25 HOH HT 1 4.17000000e-01 1.00800 0 - 604 WATR 26 HOH OT 70 -8.34000000e-01 15.9994 0 + 603 WATR 26 HOH OT 70 -8.34000000e-01 15.9994 0 + 604 WATR 26 HOH HT 1 4.17000000e-01 1.00800 0 605 WATR 26 HOH HT 1 4.17000000e-01 1.00800 0 - 606 WATR 26 HOH HT 1 4.17000000e-01 1.00800 0 - 607 WATR 27 HOH OT 70 -8.34000000e-01 15.9994 0 + 606 WATR 27 HOH OT 70 -8.34000000e-01 15.9994 0 + 607 WATR 27 HOH HT 1 4.17000000e-01 1.00800 0 608 WATR 27 HOH HT 1 4.17000000e-01 1.00800 0 - 609 WATR 27 HOH HT 1 4.17000000e-01 1.00800 0 - 610 WATR 28 HOH OT 70 -8.34000000e-01 15.9994 0 + 609 WATR 28 HOH OT 70 -8.34000000e-01 15.9994 0 + 610 WATR 28 HOH HT 1 4.17000000e-01 1.00800 0 611 WATR 28 HOH HT 1 4.17000000e-01 1.00800 0 - 612 WATR 28 HOH HT 1 4.17000000e-01 1.00800 0 - 613 WATR 29 HOH OT 70 -8.34000000e-01 15.9994 0 + 612 WATR 29 HOH OT 70 -8.34000000e-01 15.9994 0 + 613 WATR 29 HOH HT 1 4.17000000e-01 1.00800 0 614 WATR 29 HOH HT 1 4.17000000e-01 1.00800 0 - 615 WATR 29 HOH HT 1 4.17000000e-01 1.00800 0 - 616 WATR 30 HOH OT 70 -8.34000000e-01 15.9994 0 + 615 WATR 30 HOH OT 70 -8.34000000e-01 15.9994 0 + 616 WATR 30 HOH HT 1 4.17000000e-01 1.00800 0 617 WATR 30 HOH HT 1 4.17000000e-01 1.00800 0 - 618 WATR 30 HOH HT 1 4.17000000e-01 1.00800 0 - 619 WATR 31 HOH OT 70 -8.34000000e-01 15.9994 0 + 618 WATR 31 HOH OT 70 -8.34000000e-01 15.9994 0 + 619 WATR 31 HOH HT 1 4.17000000e-01 1.00800 0 620 WATR 31 HOH HT 1 4.17000000e-01 1.00800 0 - 621 WATR 31 HOH HT 1 4.17000000e-01 1.00800 0 - 622 WATR 32 HOH OT 70 -8.34000000e-01 15.9994 0 + 621 WATR 32 HOH OT 70 -8.34000000e-01 15.9994 0 + 622 WATR 32 HOH HT 1 4.17000000e-01 1.00800 0 623 WATR 32 HOH HT 1 4.17000000e-01 1.00800 0 - 624 WATR 32 HOH HT 1 4.17000000e-01 1.00800 0 - 625 WATR 33 HOH OT 70 -8.34000000e-01 15.9994 0 + 624 WATR 33 HOH OT 70 -8.34000000e-01 15.9994 0 + 625 WATR 33 HOH HT 1 4.17000000e-01 1.00800 0 626 WATR 33 HOH HT 1 4.17000000e-01 1.00800 0 - 627 WATR 33 HOH HT 1 4.17000000e-01 1.00800 0 - 628 WATR 34 HOH OT 70 -8.34000000e-01 15.9994 0 + 627 WATR 34 HOH OT 70 -8.34000000e-01 15.9994 0 + 628 WATR 34 HOH HT 1 4.17000000e-01 1.00800 0 629 WATR 34 HOH HT 1 4.17000000e-01 1.00800 0 - 630 WATR 34 HOH HT 1 4.17000000e-01 1.00800 0 - 631 WATR 35 HOH OT 70 -8.34000000e-01 15.9994 0 + 630 WATR 35 HOH OT 70 -8.34000000e-01 15.9994 0 + 631 WATR 35 HOH HT 1 4.17000000e-01 1.00800 0 632 WATR 35 HOH HT 1 4.17000000e-01 1.00800 0 - 633 WATR 35 HOH HT 1 4.17000000e-01 1.00800 0 - 634 WATR 36 HOH OT 70 -8.34000000e-01 15.9994 0 + 633 WATR 36 HOH OT 70 -8.34000000e-01 15.9994 0 + 634 WATR 36 HOH HT 1 4.17000000e-01 1.00800 0 635 WATR 36 HOH HT 1 4.17000000e-01 1.00800 0 - 636 WATR 36 HOH HT 1 4.17000000e-01 1.00800 0 - 637 WATR 37 HOH OT 70 -8.34000000e-01 15.9994 0 + 636 WATR 37 HOH OT 70 -8.34000000e-01 15.9994 0 + 637 WATR 37 HOH HT 1 4.17000000e-01 1.00800 0 638 WATR 37 HOH HT 1 4.17000000e-01 1.00800 0 - 639 WATR 37 HOH HT 1 4.17000000e-01 1.00800 0 - 640 WATR 38 HOH OT 70 -8.34000000e-01 15.9994 0 + 639 WATR 38 HOH OT 70 -8.34000000e-01 15.9994 0 + 640 WATR 38 HOH HT 1 4.17000000e-01 1.00800 0 641 WATR 38 HOH HT 1 4.17000000e-01 1.00800 0 - 642 WATR 38 HOH HT 1 4.17000000e-01 1.00800 0 - 643 WATR 39 HOH OT 70 -8.34000000e-01 15.9994 0 + 642 WATR 39 HOH OT 70 -8.34000000e-01 15.9994 0 + 643 WATR 39 HOH HT 1 4.17000000e-01 1.00800 0 644 WATR 39 HOH HT 1 4.17000000e-01 1.00800 0 - 645 WATR 39 HOH HT 1 4.17000000e-01 1.00800 0 - 646 WATR 40 HOH OT 70 -8.34000000e-01 15.9994 0 + 645 WATR 40 HOH OT 70 -8.34000000e-01 15.9994 0 + 646 WATR 40 HOH HT 1 4.17000000e-01 1.00800 0 647 WATR 40 HOH HT 1 4.17000000e-01 1.00800 0 - 648 WATR 40 HOH HT 1 4.17000000e-01 1.00800 0 - 649 WATR 41 HOH OT 70 -8.34000000e-01 15.9994 0 + 648 WATR 41 HOH OT 70 -8.34000000e-01 15.9994 0 + 649 WATR 41 HOH HT 1 4.17000000e-01 1.00800 0 650 WATR 41 HOH HT 1 4.17000000e-01 1.00800 0 - 651 WATR 41 HOH HT 1 4.17000000e-01 1.00800 0 - 652 WATR 42 HOH OT 70 -8.34000000e-01 15.9994 0 + 651 WATR 42 HOH OT 70 -8.34000000e-01 15.9994 0 + 652 WATR 42 HOH HT 1 4.17000000e-01 1.00800 0 653 WATR 42 HOH HT 1 4.17000000e-01 1.00800 0 - 654 WATR 42 HOH HT 1 4.17000000e-01 1.00800 0 - 655 WATR 43 HOH OT 70 -8.34000000e-01 15.9994 0 + 654 WATR 43 HOH OT 70 -8.34000000e-01 15.9994 0 + 655 WATR 43 HOH HT 1 4.17000000e-01 1.00800 0 656 WATR 43 HOH HT 1 4.17000000e-01 1.00800 0 - 657 WATR 43 HOH HT 1 4.17000000e-01 1.00800 0 - 658 WATR 44 HOH OT 70 -8.34000000e-01 15.9994 0 + 657 WATR 44 HOH OT 70 -8.34000000e-01 15.9994 0 + 658 WATR 44 HOH HT 1 4.17000000e-01 1.00800 0 659 WATR 44 HOH HT 1 4.17000000e-01 1.00800 0 - 660 WATR 44 HOH HT 1 4.17000000e-01 1.00800 0 - 661 WATR 45 HOH OT 70 -8.34000000e-01 15.9994 0 + 660 WATR 45 HOH OT 70 -8.34000000e-01 15.9994 0 + 661 WATR 45 HOH HT 1 4.17000000e-01 1.00800 0 662 WATR 45 HOH HT 1 4.17000000e-01 1.00800 0 - 663 WATR 45 HOH HT 1 4.17000000e-01 1.00800 0 - 664 WATR 46 HOH OT 70 -8.34000000e-01 15.9994 0 + 663 WATR 46 HOH OT 70 -8.34000000e-01 15.9994 0 + 664 WATR 46 HOH HT 1 4.17000000e-01 1.00800 0 665 WATR 46 HOH HT 1 4.17000000e-01 1.00800 0 - 666 WATR 46 HOH HT 1 4.17000000e-01 1.00800 0 - 667 WATR 47 HOH OT 70 -8.34000000e-01 15.9994 0 + 666 WATR 47 HOH OT 70 -8.34000000e-01 15.9994 0 + 667 WATR 47 HOH HT 1 4.17000000e-01 1.00800 0 668 WATR 47 HOH HT 1 4.17000000e-01 1.00800 0 - 669 WATR 47 HOH HT 1 4.17000000e-01 1.00800 0 - 670 WATR 48 HOH OT 70 -8.34000000e-01 15.9994 0 + 669 WATR 48 HOH OT 70 -8.34000000e-01 15.9994 0 + 670 WATR 48 HOH HT 1 4.17000000e-01 1.00800 0 671 WATR 48 HOH HT 1 4.17000000e-01 1.00800 0 - 672 WATR 48 HOH HT 1 4.17000000e-01 1.00800 0 - 673 WATR 49 HOH OT 70 -8.34000000e-01 15.9994 0 + 672 WATR 49 HOH OT 70 -8.34000000e-01 15.9994 0 + 673 WATR 49 HOH HT 1 4.17000000e-01 1.00800 0 674 WATR 49 HOH HT 1 4.17000000e-01 1.00800 0 - 675 WATR 49 HOH HT 1 4.17000000e-01 1.00800 0 - 676 WATR 50 HOH OT 70 -8.34000000e-01 15.9994 0 + 675 WATR 50 HOH OT 70 -8.34000000e-01 15.9994 0 + 676 WATR 50 HOH HT 1 4.17000000e-01 1.00800 0 677 WATR 50 HOH HT 1 4.17000000e-01 1.00800 0 - 678 WATR 50 HOH HT 1 4.17000000e-01 1.00800 0 - 679 WATR 51 HOH OT 70 -8.34000000e-01 15.9994 0 + 678 WATR 51 HOH OT 70 -8.34000000e-01 15.9994 0 + 679 WATR 51 HOH HT 1 4.17000000e-01 1.00800 0 680 WATR 51 HOH HT 1 4.17000000e-01 1.00800 0 - 681 WATR 51 HOH HT 1 4.17000000e-01 1.00800 0 - 682 WATR 52 HOH OT 70 -8.34000000e-01 15.9994 0 + 681 WATR 52 HOH OT 70 -8.34000000e-01 15.9994 0 + 682 WATR 52 HOH HT 1 4.17000000e-01 1.00800 0 683 WATR 52 HOH HT 1 4.17000000e-01 1.00800 0 - 684 WATR 52 HOH HT 1 4.17000000e-01 1.00800 0 - 685 WATR 53 HOH OT 70 -8.34000000e-01 15.9994 0 + 684 WATR 53 HOH OT 70 -8.34000000e-01 15.9994 0 + 685 WATR 53 HOH HT 1 4.17000000e-01 1.00800 0 686 WATR 53 HOH HT 1 4.17000000e-01 1.00800 0 - 687 WATR 53 HOH HT 1 4.17000000e-01 1.00800 0 - 688 WATR 54 HOH OT 70 -8.34000000e-01 15.9994 0 + 687 WATR 54 HOH OT 70 -8.34000000e-01 15.9994 0 + 688 WATR 54 HOH HT 1 4.17000000e-01 1.00800 0 689 WATR 54 HOH HT 1 4.17000000e-01 1.00800 0 - 690 WATR 54 HOH HT 1 4.17000000e-01 1.00800 0 - 691 WATR 55 HOH OT 70 -8.34000000e-01 15.9994 0 + 690 WATR 55 HOH OT 70 -8.34000000e-01 15.9994 0 + 691 WATR 55 HOH HT 1 4.17000000e-01 1.00800 0 692 WATR 55 HOH HT 1 4.17000000e-01 1.00800 0 - 693 WATR 55 HOH HT 1 4.17000000e-01 1.00800 0 + 693 SALT 1 ION SOD 90 1.00000000e+00 22.9897 0 694 WATR 56 HOH OT 70 -8.34000000e-01 15.9994 0 695 WATR 56 HOH HT 1 4.17000000e-01 1.00800 0 696 WATR 56 HOH HT 1 4.17000000e-01 1.00800 0 @@ -818,40 +818,40 @@ PSF 811 WATR 95 HOH OT 70 -8.34000000e-01 15.9994 0 812 WATR 95 HOH HT 1 4.17000000e-01 1.00800 0 813 WATR 95 HOH HT 1 4.17000000e-01 1.00800 0 - 814 WATR 96 HOH OT 70 -8.34000000e-01 15.9994 0 - 815 WATR 96 HOH HT 1 4.17000000e-01 1.00800 0 + 814 SALT 2 ION SOD 90 1.00000000e+00 22.9897 0 + 815 WATR 96 HOH OT 70 -8.34000000e-01 15.9994 0 816 WATR 96 HOH HT 1 4.17000000e-01 1.00800 0 - 817 WATR 97 HOH OT 70 -8.34000000e-01 15.9994 0 - 818 WATR 97 HOH HT 1 4.17000000e-01 1.00800 0 + 817 WATR 96 HOH HT 1 4.17000000e-01 1.00800 0 + 818 WATR 97 HOH OT 70 -8.34000000e-01 15.9994 0 819 WATR 97 HOH HT 1 4.17000000e-01 1.00800 0 - 820 WATR 98 HOH OT 70 -8.34000000e-01 15.9994 0 - 821 WATR 98 HOH HT 1 4.17000000e-01 1.00800 0 + 820 WATR 97 HOH HT 1 4.17000000e-01 1.00800 0 + 821 WATR 98 HOH OT 70 -8.34000000e-01 15.9994 0 822 WATR 98 HOH HT 1 4.17000000e-01 1.00800 0 - 823 WATR 99 HOH OT 70 -8.34000000e-01 15.9994 0 - 824 WATR 99 HOH HT 1 4.17000000e-01 1.00800 0 + 823 WATR 98 HOH HT 1 4.17000000e-01 1.00800 0 + 824 WATR 99 HOH OT 70 -8.34000000e-01 15.9994 0 825 WATR 99 HOH HT 1 4.17000000e-01 1.00800 0 - 826 WATR 100 HOH OT 70 -8.34000000e-01 15.9994 0 - 827 WATR 100 HOH HT 1 4.17000000e-01 1.00800 0 + 826 WATR 99 HOH HT 1 4.17000000e-01 1.00800 0 + 827 WATR 100 HOH OT 70 -8.34000000e-01 15.9994 0 828 WATR 100 HOH HT 1 4.17000000e-01 1.00800 0 - 829 WATR 101 HOH OT 70 -8.34000000e-01 15.9994 0 - 830 WATR 101 HOH HT 1 4.17000000e-01 1.00800 0 + 829 WATR 100 HOH HT 1 4.17000000e-01 1.00800 0 + 830 WATR 101 HOH OT 70 -8.34000000e-01 15.9994 0 831 WATR 101 HOH HT 1 4.17000000e-01 1.00800 0 - 832 WATR 102 HOH OT 70 -8.34000000e-01 15.9994 0 - 833 WATR 102 HOH HT 1 4.17000000e-01 1.00800 0 + 832 WATR 101 HOH HT 1 4.17000000e-01 1.00800 0 + 833 WATR 102 HOH OT 70 -8.34000000e-01 15.9994 0 834 WATR 102 HOH HT 1 4.17000000e-01 1.00800 0 - 835 WATR 103 HOH OT 70 -8.34000000e-01 15.9994 0 - 836 WATR 103 HOH HT 1 4.17000000e-01 1.00800 0 + 835 WATR 102 HOH HT 1 4.17000000e-01 1.00800 0 + 836 WATR 103 HOH OT 70 -8.34000000e-01 15.9994 0 837 WATR 103 HOH HT 1 4.17000000e-01 1.00800 0 - 838 WATR 104 HOH OT 70 -8.34000000e-01 15.9994 0 - 839 WATR 104 HOH HT 1 4.17000000e-01 1.00800 0 + 838 WATR 103 HOH HT 1 4.17000000e-01 1.00800 0 + 839 WATR 104 HOH OT 70 -8.34000000e-01 15.9994 0 840 WATR 104 HOH HT 1 4.17000000e-01 1.00800 0 - 841 WATR 105 HOH OT 70 -8.34000000e-01 15.9994 0 - 842 WATR 105 HOH HT 1 4.17000000e-01 1.00800 0 + 841 WATR 104 HOH HT 1 4.17000000e-01 1.00800 0 + 842 WATR 105 HOH OT 70 -8.34000000e-01 15.9994 0 843 WATR 105 HOH HT 1 4.17000000e-01 1.00800 0 - 844 WATR 106 HOH OT 70 -8.34000000e-01 15.9994 0 - 845 WATR 106 HOH HT 1 4.17000000e-01 1.00800 0 + 844 WATR 105 HOH HT 1 4.17000000e-01 1.00800 0 + 845 WATR 106 HOH OT 70 -8.34000000e-01 15.9994 0 846 WATR 106 HOH HT 1 4.17000000e-01 1.00800 0 - 847 SALT 2 ION SOD 90 1.00000000e+00 22.9897 0 + 847 WATR 106 HOH HT 1 4.17000000e-01 1.00800 0 848 WATR 107 HOH OT 70 -8.34000000e-01 15.9994 0 849 WATR 107 HOH HT 1 4.17000000e-01 1.00800 0 850 WATR 107 HOH HT 1 4.17000000e-01 1.00800 0 @@ -864,10 +864,10 @@ PSF 857 WATR 110 HOH OT 70 -8.34000000e-01 15.9994 0 858 WATR 110 HOH HT 1 4.17000000e-01 1.00800 0 859 WATR 110 HOH HT 1 4.17000000e-01 1.00800 0 - 860 SALT 3 ION SOD 90 1.00000000e+00 22.9897 0 - 861 WATR 111 HOH OT 70 -8.34000000e-01 15.9994 0 + 860 WATR 111 HOH OT 70 -8.34000000e-01 15.9994 0 + 861 WATR 111 HOH HT 1 4.17000000e-01 1.00800 0 862 WATR 111 HOH HT 1 4.17000000e-01 1.00800 0 - 863 WATR 111 HOH HT 1 4.17000000e-01 1.00800 0 + 863 SALT 3 ION SOD 90 1.00000000e+00 22.9897 0 864 WATR 112 HOH OT 70 -8.34000000e-01 15.9994 0 865 WATR 112 HOH HT 1 4.17000000e-01 1.00800 0 866 WATR 112 HOH HT 1 4.17000000e-01 1.00800 0 @@ -907,95 +907,95 @@ PSF 900 WATR 124 HOH OT 70 -8.34000000e-01 15.9994 0 901 WATR 124 HOH HT 1 4.17000000e-01 1.00800 0 902 WATR 124 HOH HT 1 4.17000000e-01 1.00800 0 - 903 SALT 4 ION SOD 90 1.00000000e+00 22.9897 0 - 904 WATR 125 HOH OT 70 -8.34000000e-01 15.9994 0 + 903 WATR 125 HOH OT 70 -8.34000000e-01 15.9994 0 + 904 WATR 125 HOH HT 1 4.17000000e-01 1.00800 0 905 WATR 125 HOH HT 1 4.17000000e-01 1.00800 0 - 906 WATR 125 HOH HT 1 4.17000000e-01 1.00800 0 - 907 WATR 126 HOH OT 70 -8.34000000e-01 15.9994 0 + 906 WATR 126 HOH OT 70 -8.34000000e-01 15.9994 0 + 907 WATR 126 HOH HT 1 4.17000000e-01 1.00800 0 908 WATR 126 HOH HT 1 4.17000000e-01 1.00800 0 - 909 WATR 126 HOH HT 1 4.17000000e-01 1.00800 0 - 910 WATR 127 HOH OT 70 -8.34000000e-01 15.9994 0 + 909 WATR 127 HOH OT 70 -8.34000000e-01 15.9994 0 + 910 WATR 127 HOH HT 1 4.17000000e-01 1.00800 0 911 WATR 127 HOH HT 1 4.17000000e-01 1.00800 0 - 912 WATR 127 HOH HT 1 4.17000000e-01 1.00800 0 - 913 WATR 128 HOH OT 70 -8.34000000e-01 15.9994 0 + 912 WATR 128 HOH OT 70 -8.34000000e-01 15.9994 0 + 913 WATR 128 HOH HT 1 4.17000000e-01 1.00800 0 914 WATR 128 HOH HT 1 4.17000000e-01 1.00800 0 - 915 WATR 128 HOH HT 1 4.17000000e-01 1.00800 0 - 916 WATR 129 HOH OT 70 -8.34000000e-01 15.9994 0 + 915 WATR 129 HOH OT 70 -8.34000000e-01 15.9994 0 + 916 WATR 129 HOH HT 1 4.17000000e-01 1.00800 0 917 WATR 129 HOH HT 1 4.17000000e-01 1.00800 0 - 918 WATR 129 HOH HT 1 4.17000000e-01 1.00800 0 - 919 WATR 130 HOH OT 70 -8.34000000e-01 15.9994 0 + 918 WATR 130 HOH OT 70 -8.34000000e-01 15.9994 0 + 919 WATR 130 HOH HT 1 4.17000000e-01 1.00800 0 920 WATR 130 HOH HT 1 4.17000000e-01 1.00800 0 - 921 WATR 130 HOH HT 1 4.17000000e-01 1.00800 0 - 922 WATR 131 HOH OT 70 -8.34000000e-01 15.9994 0 + 921 WATR 131 HOH OT 70 -8.34000000e-01 15.9994 0 + 922 WATR 131 HOH HT 1 4.17000000e-01 1.00800 0 923 WATR 131 HOH HT 1 4.17000000e-01 1.00800 0 - 924 WATR 131 HOH HT 1 4.17000000e-01 1.00800 0 - 925 WATR 132 HOH OT 70 -8.34000000e-01 15.9994 0 + 924 WATR 132 HOH OT 70 -8.34000000e-01 15.9994 0 + 925 WATR 132 HOH HT 1 4.17000000e-01 1.00800 0 926 WATR 132 HOH HT 1 4.17000000e-01 1.00800 0 - 927 WATR 132 HOH HT 1 4.17000000e-01 1.00800 0 - 928 WATR 133 HOH OT 70 -8.34000000e-01 15.9994 0 + 927 WATR 133 HOH OT 70 -8.34000000e-01 15.9994 0 + 928 WATR 133 HOH HT 1 4.17000000e-01 1.00800 0 929 WATR 133 HOH HT 1 4.17000000e-01 1.00800 0 - 930 WATR 133 HOH HT 1 4.17000000e-01 1.00800 0 - 931 WATR 134 HOH OT 70 -8.34000000e-01 15.9994 0 + 930 WATR 134 HOH OT 70 -8.34000000e-01 15.9994 0 + 931 WATR 134 HOH HT 1 4.17000000e-01 1.00800 0 932 WATR 134 HOH HT 1 4.17000000e-01 1.00800 0 - 933 WATR 134 HOH HT 1 4.17000000e-01 1.00800 0 - 934 WATR 135 HOH OT 70 -8.34000000e-01 15.9994 0 + 933 WATR 135 HOH OT 70 -8.34000000e-01 15.9994 0 + 934 WATR 135 HOH HT 1 4.17000000e-01 1.00800 0 935 WATR 135 HOH HT 1 4.17000000e-01 1.00800 0 - 936 WATR 135 HOH HT 1 4.17000000e-01 1.00800 0 - 937 WATR 136 HOH OT 70 -8.34000000e-01 15.9994 0 + 936 WATR 136 HOH OT 70 -8.34000000e-01 15.9994 0 + 937 WATR 136 HOH HT 1 4.17000000e-01 1.00800 0 938 WATR 136 HOH HT 1 4.17000000e-01 1.00800 0 - 939 WATR 136 HOH HT 1 4.17000000e-01 1.00800 0 - 940 WATR 137 HOH OT 70 -8.34000000e-01 15.9994 0 + 939 WATR 137 HOH OT 70 -8.34000000e-01 15.9994 0 + 940 WATR 137 HOH HT 1 4.17000000e-01 1.00800 0 941 WATR 137 HOH HT 1 4.17000000e-01 1.00800 0 - 942 WATR 137 HOH HT 1 4.17000000e-01 1.00800 0 - 943 WATR 138 HOH OT 70 -8.34000000e-01 15.9994 0 + 942 WATR 138 HOH OT 70 -8.34000000e-01 15.9994 0 + 943 WATR 138 HOH HT 1 4.17000000e-01 1.00800 0 944 WATR 138 HOH HT 1 4.17000000e-01 1.00800 0 - 945 WATR 138 HOH HT 1 4.17000000e-01 1.00800 0 - 946 WATR 139 HOH OT 70 -8.34000000e-01 15.9994 0 + 945 WATR 139 HOH OT 70 -8.34000000e-01 15.9994 0 + 946 WATR 139 HOH HT 1 4.17000000e-01 1.00800 0 947 WATR 139 HOH HT 1 4.17000000e-01 1.00800 0 - 948 WATR 139 HOH HT 1 4.17000000e-01 1.00800 0 - 949 WATR 140 HOH OT 70 -8.34000000e-01 15.9994 0 + 948 WATR 140 HOH OT 70 -8.34000000e-01 15.9994 0 + 949 WATR 140 HOH HT 1 4.17000000e-01 1.00800 0 950 WATR 140 HOH HT 1 4.17000000e-01 1.00800 0 - 951 WATR 140 HOH HT 1 4.17000000e-01 1.00800 0 - 952 WATR 141 HOH OT 70 -8.34000000e-01 15.9994 0 + 951 WATR 141 HOH OT 70 -8.34000000e-01 15.9994 0 + 952 WATR 141 HOH HT 1 4.17000000e-01 1.00800 0 953 WATR 141 HOH HT 1 4.17000000e-01 1.00800 0 - 954 WATR 141 HOH HT 1 4.17000000e-01 1.00800 0 - 955 WATR 142 HOH OT 70 -8.34000000e-01 15.9994 0 + 954 WATR 142 HOH OT 70 -8.34000000e-01 15.9994 0 + 955 WATR 142 HOH HT 1 4.17000000e-01 1.00800 0 956 WATR 142 HOH HT 1 4.17000000e-01 1.00800 0 - 957 WATR 142 HOH HT 1 4.17000000e-01 1.00800 0 - 958 SALT 5 ION SOD 90 1.00000000e+00 22.9897 0 - 959 WATR 143 HOH OT 70 -8.34000000e-01 15.9994 0 - 960 WATR 143 HOH HT 1 4.17000000e-01 1.00800 0 - 961 WATR 143 HOH HT 1 4.17000000e-01 1.00800 0 - 962 WATR 144 HOH OT 70 -8.34000000e-01 15.9994 0 - 963 WATR 144 HOH HT 1 4.17000000e-01 1.00800 0 - 964 WATR 144 HOH HT 1 4.17000000e-01 1.00800 0 - 965 WATR 145 HOH OT 70 -8.34000000e-01 15.9994 0 - 966 WATR 145 HOH HT 1 4.17000000e-01 1.00800 0 - 967 WATR 145 HOH HT 1 4.17000000e-01 1.00800 0 - 968 WATR 146 HOH OT 70 -8.34000000e-01 15.9994 0 - 969 WATR 146 HOH HT 1 4.17000000e-01 1.00800 0 - 970 WATR 146 HOH HT 1 4.17000000e-01 1.00800 0 - 971 WATR 147 HOH OT 70 -8.34000000e-01 15.9994 0 - 972 WATR 147 HOH HT 1 4.17000000e-01 1.00800 0 - 973 WATR 147 HOH HT 1 4.17000000e-01 1.00800 0 - 974 WATR 148 HOH OT 70 -8.34000000e-01 15.9994 0 - 975 WATR 148 HOH HT 1 4.17000000e-01 1.00800 0 - 976 WATR 148 HOH HT 1 4.17000000e-01 1.00800 0 - 977 WATR 149 HOH OT 70 -8.34000000e-01 15.9994 0 - 978 WATR 149 HOH HT 1 4.17000000e-01 1.00800 0 - 979 WATR 149 HOH HT 1 4.17000000e-01 1.00800 0 - 980 WATR 150 HOH OT 70 -8.34000000e-01 15.9994 0 - 981 WATR 150 HOH HT 1 4.17000000e-01 1.00800 0 - 982 WATR 150 HOH HT 1 4.17000000e-01 1.00800 0 - 983 WATR 151 HOH OT 70 -8.34000000e-01 15.9994 0 - 984 WATR 151 HOH HT 1 4.17000000e-01 1.00800 0 - 985 WATR 151 HOH HT 1 4.17000000e-01 1.00800 0 - 986 WATR 152 HOH OT 70 -8.34000000e-01 15.9994 0 + 957 WATR 143 HOH OT 70 -8.34000000e-01 15.9994 0 + 958 WATR 143 HOH HT 1 4.17000000e-01 1.00800 0 + 959 WATR 143 HOH HT 1 4.17000000e-01 1.00800 0 + 960 WATR 144 HOH OT 70 -8.34000000e-01 15.9994 0 + 961 WATR 144 HOH HT 1 4.17000000e-01 1.00800 0 + 962 WATR 144 HOH HT 1 4.17000000e-01 1.00800 0 + 963 WATR 145 HOH OT 70 -8.34000000e-01 15.9994 0 + 964 WATR 145 HOH HT 1 4.17000000e-01 1.00800 0 + 965 WATR 145 HOH HT 1 4.17000000e-01 1.00800 0 + 966 WATR 146 HOH OT 70 -8.34000000e-01 15.9994 0 + 967 WATR 146 HOH HT 1 4.17000000e-01 1.00800 0 + 968 WATR 146 HOH HT 1 4.17000000e-01 1.00800 0 + 969 WATR 147 HOH OT 70 -8.34000000e-01 15.9994 0 + 970 WATR 147 HOH HT 1 4.17000000e-01 1.00800 0 + 971 WATR 147 HOH HT 1 4.17000000e-01 1.00800 0 + 972 WATR 148 HOH OT 70 -8.34000000e-01 15.9994 0 + 973 WATR 148 HOH HT 1 4.17000000e-01 1.00800 0 + 974 WATR 148 HOH HT 1 4.17000000e-01 1.00800 0 + 975 WATR 149 HOH OT 70 -8.34000000e-01 15.9994 0 + 976 WATR 149 HOH HT 1 4.17000000e-01 1.00800 0 + 977 WATR 149 HOH HT 1 4.17000000e-01 1.00800 0 + 978 WATR 150 HOH OT 70 -8.34000000e-01 15.9994 0 + 979 WATR 150 HOH HT 1 4.17000000e-01 1.00800 0 + 980 WATR 150 HOH HT 1 4.17000000e-01 1.00800 0 + 981 WATR 151 HOH OT 70 -8.34000000e-01 15.9994 0 + 982 WATR 151 HOH HT 1 4.17000000e-01 1.00800 0 + 983 WATR 151 HOH HT 1 4.17000000e-01 1.00800 0 + 984 SALT 4 ION SOD 90 1.00000000e+00 22.9897 0 + 985 WATR 152 HOH OT 70 -8.34000000e-01 15.9994 0 + 986 WATR 152 HOH HT 1 4.17000000e-01 1.00800 0 987 WATR 152 HOH HT 1 4.17000000e-01 1.00800 0 - 988 WATR 152 HOH HT 1 4.17000000e-01 1.00800 0 - 989 WATR 153 HOH OT 70 -8.34000000e-01 15.9994 0 + 988 WATR 153 HOH OT 70 -8.34000000e-01 15.9994 0 + 989 WATR 153 HOH HT 1 4.17000000e-01 1.00800 0 990 WATR 153 HOH HT 1 4.17000000e-01 1.00800 0 - 991 WATR 153 HOH HT 1 4.17000000e-01 1.00800 0 + 991 SALT 5 ION SOD 90 1.00000000e+00 22.9897 0 992 WATR 154 HOH OT 70 -8.34000000e-01 15.9994 0 993 WATR 154 HOH HT 1 4.17000000e-01 1.00800 0 994 WATR 154 HOH HT 1 4.17000000e-01 1.00800 0 @@ -1041,64 +1041,64 @@ PSF 1034 WATR 168 HOH OT 70 -8.34000000e-01 15.9994 0 1035 WATR 168 HOH HT 1 4.17000000e-01 1.00800 0 1036 WATR 168 HOH HT 1 4.17000000e-01 1.00800 0 - 1037 SALT 6 ION SOD 90 1.00000000e+00 22.9897 0 - 1038 WATR 169 HOH OT 70 -8.34000000e-01 15.9994 0 + 1037 WATR 169 HOH OT 70 -8.34000000e-01 15.9994 0 + 1038 WATR 169 HOH HT 1 4.17000000e-01 1.00800 0 1039 WATR 169 HOH HT 1 4.17000000e-01 1.00800 0 - 1040 WATR 169 HOH HT 1 4.17000000e-01 1.00800 0 - 1041 WATR 170 HOH OT 70 -8.34000000e-01 15.9994 0 + 1040 WATR 170 HOH OT 70 -8.34000000e-01 15.9994 0 + 1041 WATR 170 HOH HT 1 4.17000000e-01 1.00800 0 1042 WATR 170 HOH HT 1 4.17000000e-01 1.00800 0 - 1043 WATR 170 HOH HT 1 4.17000000e-01 1.00800 0 - 1044 WATR 171 HOH OT 70 -8.34000000e-01 15.9994 0 + 1043 WATR 171 HOH OT 70 -8.34000000e-01 15.9994 0 + 1044 WATR 171 HOH HT 1 4.17000000e-01 1.00800 0 1045 WATR 171 HOH HT 1 4.17000000e-01 1.00800 0 - 1046 WATR 171 HOH HT 1 4.17000000e-01 1.00800 0 - 1047 WATR 172 HOH OT 70 -8.34000000e-01 15.9994 0 + 1046 WATR 172 HOH OT 70 -8.34000000e-01 15.9994 0 + 1047 WATR 172 HOH HT 1 4.17000000e-01 1.00800 0 1048 WATR 172 HOH HT 1 4.17000000e-01 1.00800 0 - 1049 WATR 172 HOH HT 1 4.17000000e-01 1.00800 0 - 1050 WATR 173 HOH OT 70 -8.34000000e-01 15.9994 0 + 1049 WATR 173 HOH OT 70 -8.34000000e-01 15.9994 0 + 1050 WATR 173 HOH HT 1 4.17000000e-01 1.00800 0 1051 WATR 173 HOH HT 1 4.17000000e-01 1.00800 0 - 1052 WATR 173 HOH HT 1 4.17000000e-01 1.00800 0 - 1053 WATR 174 HOH OT 70 -8.34000000e-01 15.9994 0 + 1052 WATR 174 HOH OT 70 -8.34000000e-01 15.9994 0 + 1053 WATR 174 HOH HT 1 4.17000000e-01 1.00800 0 1054 WATR 174 HOH HT 1 4.17000000e-01 1.00800 0 - 1055 WATR 174 HOH HT 1 4.17000000e-01 1.00800 0 - 1056 WATR 175 HOH OT 70 -8.34000000e-01 15.9994 0 + 1055 WATR 175 HOH OT 70 -8.34000000e-01 15.9994 0 + 1056 WATR 175 HOH HT 1 4.17000000e-01 1.00800 0 1057 WATR 175 HOH HT 1 4.17000000e-01 1.00800 0 - 1058 WATR 175 HOH HT 1 4.17000000e-01 1.00800 0 - 1059 WATR 176 HOH OT 70 -8.34000000e-01 15.9994 0 + 1058 WATR 176 HOH OT 70 -8.34000000e-01 15.9994 0 + 1059 WATR 176 HOH HT 1 4.17000000e-01 1.00800 0 1060 WATR 176 HOH HT 1 4.17000000e-01 1.00800 0 - 1061 WATR 176 HOH HT 1 4.17000000e-01 1.00800 0 - 1062 WATR 177 HOH OT 70 -8.34000000e-01 15.9994 0 + 1061 WATR 177 HOH OT 70 -8.34000000e-01 15.9994 0 + 1062 WATR 177 HOH HT 1 4.17000000e-01 1.00800 0 1063 WATR 177 HOH HT 1 4.17000000e-01 1.00800 0 - 1064 WATR 177 HOH HT 1 4.17000000e-01 1.00800 0 - 1065 WATR 178 HOH OT 70 -8.34000000e-01 15.9994 0 + 1064 WATR 178 HOH OT 70 -8.34000000e-01 15.9994 0 + 1065 WATR 178 HOH HT 1 4.17000000e-01 1.00800 0 1066 WATR 178 HOH HT 1 4.17000000e-01 1.00800 0 - 1067 WATR 178 HOH HT 1 4.17000000e-01 1.00800 0 - 1068 WATR 179 HOH OT 70 -8.34000000e-01 15.9994 0 + 1067 WATR 179 HOH OT 70 -8.34000000e-01 15.9994 0 + 1068 WATR 179 HOH HT 1 4.17000000e-01 1.00800 0 1069 WATR 179 HOH HT 1 4.17000000e-01 1.00800 0 - 1070 WATR 179 HOH HT 1 4.17000000e-01 1.00800 0 - 1071 WATR 180 HOH OT 70 -8.34000000e-01 15.9994 0 + 1070 WATR 180 HOH OT 70 -8.34000000e-01 15.9994 0 + 1071 WATR 180 HOH HT 1 4.17000000e-01 1.00800 0 1072 WATR 180 HOH HT 1 4.17000000e-01 1.00800 0 - 1073 WATR 180 HOH HT 1 4.17000000e-01 1.00800 0 - 1074 WATR 181 HOH OT 70 -8.34000000e-01 15.9994 0 + 1073 WATR 181 HOH OT 70 -8.34000000e-01 15.9994 0 + 1074 WATR 181 HOH HT 1 4.17000000e-01 1.00800 0 1075 WATR 181 HOH HT 1 4.17000000e-01 1.00800 0 - 1076 WATR 181 HOH HT 1 4.17000000e-01 1.00800 0 - 1077 WATR 182 HOH OT 70 -8.34000000e-01 15.9994 0 + 1076 WATR 182 HOH OT 70 -8.34000000e-01 15.9994 0 + 1077 WATR 182 HOH HT 1 4.17000000e-01 1.00800 0 1078 WATR 182 HOH HT 1 4.17000000e-01 1.00800 0 - 1079 WATR 182 HOH HT 1 4.17000000e-01 1.00800 0 - 1080 WATR 183 HOH OT 70 -8.34000000e-01 15.9994 0 + 1079 WATR 183 HOH OT 70 -8.34000000e-01 15.9994 0 + 1080 WATR 183 HOH HT 1 4.17000000e-01 1.00800 0 1081 WATR 183 HOH HT 1 4.17000000e-01 1.00800 0 - 1082 WATR 183 HOH HT 1 4.17000000e-01 1.00800 0 - 1083 WATR 184 HOH OT 70 -8.34000000e-01 15.9994 0 + 1082 WATR 184 HOH OT 70 -8.34000000e-01 15.9994 0 + 1083 WATR 184 HOH HT 1 4.17000000e-01 1.00800 0 1084 WATR 184 HOH HT 1 4.17000000e-01 1.00800 0 - 1085 WATR 184 HOH HT 1 4.17000000e-01 1.00800 0 - 1086 WATR 185 HOH OT 70 -8.34000000e-01 15.9994 0 + 1085 WATR 185 HOH OT 70 -8.34000000e-01 15.9994 0 + 1086 WATR 185 HOH HT 1 4.17000000e-01 1.00800 0 1087 WATR 185 HOH HT 1 4.17000000e-01 1.00800 0 - 1088 WATR 185 HOH HT 1 4.17000000e-01 1.00800 0 - 1089 WATR 186 HOH OT 70 -8.34000000e-01 15.9994 0 + 1088 WATR 186 HOH OT 70 -8.34000000e-01 15.9994 0 + 1089 WATR 186 HOH HT 1 4.17000000e-01 1.00800 0 1090 WATR 186 HOH HT 1 4.17000000e-01 1.00800 0 - 1091 WATR 186 HOH HT 1 4.17000000e-01 1.00800 0 - 1092 WATR 187 HOH OT 70 -8.34000000e-01 15.9994 0 + 1091 WATR 187 HOH OT 70 -8.34000000e-01 15.9994 0 + 1092 WATR 187 HOH HT 1 4.17000000e-01 1.00800 0 1093 WATR 187 HOH HT 1 4.17000000e-01 1.00800 0 - 1094 WATR 187 HOH HT 1 4.17000000e-01 1.00800 0 + 1094 SALT 6 ION SOD 90 1.00000000e+00 22.9897 0 1095 WATR 188 HOH OT 70 -8.34000000e-01 15.9994 0 1096 WATR 188 HOH HT 1 4.17000000e-01 1.00800 0 1097 WATR 188 HOH HT 1 4.17000000e-01 1.00800 0 @@ -1129,468 +1129,468 @@ PSF 1122 WATR 197 HOH OT 70 -8.34000000e-01 15.9994 0 1123 WATR 197 HOH HT 1 4.17000000e-01 1.00800 0 1124 WATR 197 HOH HT 1 4.17000000e-01 1.00800 0 - 1125 WATR 198 HOH OT 70 -8.34000000e-01 15.9994 0 - 1126 WATR 198 HOH HT 1 4.17000000e-01 1.00800 0 + 1125 SALT 7 ION SOD 90 1.00000000e+00 22.9897 0 + 1126 WATR 198 HOH OT 70 -8.34000000e-01 15.9994 0 1127 WATR 198 HOH HT 1 4.17000000e-01 1.00800 0 - 1128 WATR 199 HOH OT 70 -8.34000000e-01 15.9994 0 - 1129 WATR 199 HOH HT 1 4.17000000e-01 1.00800 0 + 1128 WATR 198 HOH HT 1 4.17000000e-01 1.00800 0 + 1129 WATR 199 HOH OT 70 -8.34000000e-01 15.9994 0 1130 WATR 199 HOH HT 1 4.17000000e-01 1.00800 0 - 1131 WATR 200 HOH OT 70 -8.34000000e-01 15.9994 0 - 1132 WATR 200 HOH HT 1 4.17000000e-01 1.00800 0 + 1131 WATR 199 HOH HT 1 4.17000000e-01 1.00800 0 + 1132 WATR 200 HOH OT 70 -8.34000000e-01 15.9994 0 1133 WATR 200 HOH HT 1 4.17000000e-01 1.00800 0 - 1134 WATR 201 HOH OT 70 -8.34000000e-01 15.9994 0 - 1135 WATR 201 HOH HT 1 4.17000000e-01 1.00800 0 + 1134 WATR 200 HOH HT 1 4.17000000e-01 1.00800 0 + 1135 WATR 201 HOH OT 70 -8.34000000e-01 15.9994 0 1136 WATR 201 HOH HT 1 4.17000000e-01 1.00800 0 - 1137 WATR 202 HOH OT 70 -8.34000000e-01 15.9994 0 - 1138 WATR 202 HOH HT 1 4.17000000e-01 1.00800 0 + 1137 WATR 201 HOH HT 1 4.17000000e-01 1.00800 0 + 1138 WATR 202 HOH OT 70 -8.34000000e-01 15.9994 0 1139 WATR 202 HOH HT 1 4.17000000e-01 1.00800 0 - 1140 WATR 203 HOH OT 70 -8.34000000e-01 15.9994 0 - 1141 WATR 203 HOH HT 1 4.17000000e-01 1.00800 0 + 1140 WATR 202 HOH HT 1 4.17000000e-01 1.00800 0 + 1141 WATR 203 HOH OT 70 -8.34000000e-01 15.9994 0 1142 WATR 203 HOH HT 1 4.17000000e-01 1.00800 0 - 1143 WATR 204 HOH OT 70 -8.34000000e-01 15.9994 0 - 1144 WATR 204 HOH HT 1 4.17000000e-01 1.00800 0 + 1143 WATR 203 HOH HT 1 4.17000000e-01 1.00800 0 + 1144 WATR 204 HOH OT 70 -8.34000000e-01 15.9994 0 1145 WATR 204 HOH HT 1 4.17000000e-01 1.00800 0 - 1146 WATR 205 HOH OT 70 -8.34000000e-01 15.9994 0 - 1147 WATR 205 HOH HT 1 4.17000000e-01 1.00800 0 + 1146 WATR 204 HOH HT 1 4.17000000e-01 1.00800 0 + 1147 WATR 205 HOH OT 70 -8.34000000e-01 15.9994 0 1148 WATR 205 HOH HT 1 4.17000000e-01 1.00800 0 - 1149 WATR 206 HOH OT 70 -8.34000000e-01 15.9994 0 - 1150 WATR 206 HOH HT 1 4.17000000e-01 1.00800 0 + 1149 WATR 205 HOH HT 1 4.17000000e-01 1.00800 0 + 1150 WATR 206 HOH OT 70 -8.34000000e-01 15.9994 0 1151 WATR 206 HOH HT 1 4.17000000e-01 1.00800 0 - 1152 WATR 207 HOH OT 70 -8.34000000e-01 15.9994 0 - 1153 WATR 207 HOH HT 1 4.17000000e-01 1.00800 0 + 1152 WATR 206 HOH HT 1 4.17000000e-01 1.00800 0 + 1153 WATR 207 HOH OT 70 -8.34000000e-01 15.9994 0 1154 WATR 207 HOH HT 1 4.17000000e-01 1.00800 0 - 1155 WATR 208 HOH OT 70 -8.34000000e-01 15.9994 0 - 1156 WATR 208 HOH HT 1 4.17000000e-01 1.00800 0 + 1155 WATR 207 HOH HT 1 4.17000000e-01 1.00800 0 + 1156 WATR 208 HOH OT 70 -8.34000000e-01 15.9994 0 1157 WATR 208 HOH HT 1 4.17000000e-01 1.00800 0 - 1158 WATR 209 HOH OT 70 -8.34000000e-01 15.9994 0 - 1159 WATR 209 HOH HT 1 4.17000000e-01 1.00800 0 + 1158 WATR 208 HOH HT 1 4.17000000e-01 1.00800 0 + 1159 WATR 209 HOH OT 70 -8.34000000e-01 15.9994 0 1160 WATR 209 HOH HT 1 4.17000000e-01 1.00800 0 - 1161 WATR 210 HOH OT 70 -8.34000000e-01 15.9994 0 - 1162 WATR 210 HOH HT 1 4.17000000e-01 1.00800 0 + 1161 WATR 209 HOH HT 1 4.17000000e-01 1.00800 0 + 1162 WATR 210 HOH OT 70 -8.34000000e-01 15.9994 0 1163 WATR 210 HOH HT 1 4.17000000e-01 1.00800 0 - 1164 WATR 211 HOH OT 70 -8.34000000e-01 15.9994 0 - 1165 WATR 211 HOH HT 1 4.17000000e-01 1.00800 0 + 1164 WATR 210 HOH HT 1 4.17000000e-01 1.00800 0 + 1165 WATR 211 HOH OT 70 -8.34000000e-01 15.9994 0 1166 WATR 211 HOH HT 1 4.17000000e-01 1.00800 0 - 1167 WATR 212 HOH OT 70 -8.34000000e-01 15.9994 0 - 1168 WATR 212 HOH HT 1 4.17000000e-01 1.00800 0 + 1167 WATR 211 HOH HT 1 4.17000000e-01 1.00800 0 + 1168 WATR 212 HOH OT 70 -8.34000000e-01 15.9994 0 1169 WATR 212 HOH HT 1 4.17000000e-01 1.00800 0 - 1170 WATR 213 HOH OT 70 -8.34000000e-01 15.9994 0 - 1171 WATR 213 HOH HT 1 4.17000000e-01 1.00800 0 + 1170 WATR 212 HOH HT 1 4.17000000e-01 1.00800 0 + 1171 WATR 213 HOH OT 70 -8.34000000e-01 15.9994 0 1172 WATR 213 HOH HT 1 4.17000000e-01 1.00800 0 - 1173 WATR 214 HOH OT 70 -8.34000000e-01 15.9994 0 - 1174 WATR 214 HOH HT 1 4.17000000e-01 1.00800 0 + 1173 WATR 213 HOH HT 1 4.17000000e-01 1.00800 0 + 1174 WATR 214 HOH OT 70 -8.34000000e-01 15.9994 0 1175 WATR 214 HOH HT 1 4.17000000e-01 1.00800 0 - 1176 WATR 215 HOH OT 70 -8.34000000e-01 15.9994 0 - 1177 WATR 215 HOH HT 1 4.17000000e-01 1.00800 0 + 1176 WATR 214 HOH HT 1 4.17000000e-01 1.00800 0 + 1177 WATR 215 HOH OT 70 -8.34000000e-01 15.9994 0 1178 WATR 215 HOH HT 1 4.17000000e-01 1.00800 0 - 1179 WATR 216 HOH OT 70 -8.34000000e-01 15.9994 0 - 1180 WATR 216 HOH HT 1 4.17000000e-01 1.00800 0 + 1179 WATR 215 HOH HT 1 4.17000000e-01 1.00800 0 + 1180 WATR 216 HOH OT 70 -8.34000000e-01 15.9994 0 1181 WATR 216 HOH HT 1 4.17000000e-01 1.00800 0 - 1182 WATR 217 HOH OT 70 -8.34000000e-01 15.9994 0 - 1183 WATR 217 HOH HT 1 4.17000000e-01 1.00800 0 + 1182 WATR 216 HOH HT 1 4.17000000e-01 1.00800 0 + 1183 WATR 217 HOH OT 70 -8.34000000e-01 15.9994 0 1184 WATR 217 HOH HT 1 4.17000000e-01 1.00800 0 - 1185 WATR 218 HOH OT 70 -8.34000000e-01 15.9994 0 - 1186 WATR 218 HOH HT 1 4.17000000e-01 1.00800 0 + 1185 WATR 217 HOH HT 1 4.17000000e-01 1.00800 0 + 1186 WATR 218 HOH OT 70 -8.34000000e-01 15.9994 0 1187 WATR 218 HOH HT 1 4.17000000e-01 1.00800 0 - 1188 WATR 219 HOH OT 70 -8.34000000e-01 15.9994 0 - 1189 WATR 219 HOH HT 1 4.17000000e-01 1.00800 0 + 1188 WATR 218 HOH HT 1 4.17000000e-01 1.00800 0 + 1189 WATR 219 HOH OT 70 -8.34000000e-01 15.9994 0 1190 WATR 219 HOH HT 1 4.17000000e-01 1.00800 0 - 1191 WATR 220 HOH OT 70 -8.34000000e-01 15.9994 0 - 1192 WATR 220 HOH HT 1 4.17000000e-01 1.00800 0 + 1191 WATR 219 HOH HT 1 4.17000000e-01 1.00800 0 + 1192 WATR 220 HOH OT 70 -8.34000000e-01 15.9994 0 1193 WATR 220 HOH HT 1 4.17000000e-01 1.00800 0 - 1194 WATR 221 HOH OT 70 -8.34000000e-01 15.9994 0 - 1195 WATR 221 HOH HT 1 4.17000000e-01 1.00800 0 + 1194 WATR 220 HOH HT 1 4.17000000e-01 1.00800 0 + 1195 WATR 221 HOH OT 70 -8.34000000e-01 15.9994 0 1196 WATR 221 HOH HT 1 4.17000000e-01 1.00800 0 - 1197 WATR 222 HOH OT 70 -8.34000000e-01 15.9994 0 - 1198 WATR 222 HOH HT 1 4.17000000e-01 1.00800 0 + 1197 WATR 221 HOH HT 1 4.17000000e-01 1.00800 0 + 1198 WATR 222 HOH OT 70 -8.34000000e-01 15.9994 0 1199 WATR 222 HOH HT 1 4.17000000e-01 1.00800 0 - 1200 WATR 223 HOH OT 70 -8.34000000e-01 15.9994 0 - 1201 WATR 223 HOH HT 1 4.17000000e-01 1.00800 0 + 1200 WATR 222 HOH HT 1 4.17000000e-01 1.00800 0 + 1201 WATR 223 HOH OT 70 -8.34000000e-01 15.9994 0 1202 WATR 223 HOH HT 1 4.17000000e-01 1.00800 0 - 1203 WATR 224 HOH OT 70 -8.34000000e-01 15.9994 0 - 1204 WATR 224 HOH HT 1 4.17000000e-01 1.00800 0 - 1205 WATR 224 HOH HT 1 4.17000000e-01 1.00800 0 - 1206 WATR 225 HOH OT 70 -8.34000000e-01 15.9994 0 - 1207 WATR 225 HOH HT 1 4.17000000e-01 1.00800 0 - 1208 WATR 225 HOH HT 1 4.17000000e-01 1.00800 0 - 1209 WATR 226 HOH OT 70 -8.34000000e-01 15.9994 0 - 1210 WATR 226 HOH HT 1 4.17000000e-01 1.00800 0 - 1211 WATR 226 HOH HT 1 4.17000000e-01 1.00800 0 - 1212 WATR 227 HOH OT 70 -8.34000000e-01 15.9994 0 - 1213 WATR 227 HOH HT 1 4.17000000e-01 1.00800 0 - 1214 WATR 227 HOH HT 1 4.17000000e-01 1.00800 0 - 1215 WATR 228 HOH OT 70 -8.34000000e-01 15.9994 0 - 1216 WATR 228 HOH HT 1 4.17000000e-01 1.00800 0 - 1217 WATR 228 HOH HT 1 4.17000000e-01 1.00800 0 - 1218 WATR 229 HOH OT 70 -8.34000000e-01 15.9994 0 - 1219 WATR 229 HOH HT 1 4.17000000e-01 1.00800 0 - 1220 WATR 229 HOH HT 1 4.17000000e-01 1.00800 0 - 1221 WATR 230 HOH OT 70 -8.34000000e-01 15.9994 0 - 1222 WATR 230 HOH HT 1 4.17000000e-01 1.00800 0 - 1223 WATR 230 HOH HT 1 4.17000000e-01 1.00800 0 - 1224 WATR 231 HOH OT 70 -8.34000000e-01 15.9994 0 - 1225 WATR 231 HOH HT 1 4.17000000e-01 1.00800 0 - 1226 WATR 231 HOH HT 1 4.17000000e-01 1.00800 0 - 1227 WATR 232 HOH OT 70 -8.34000000e-01 15.9994 0 - 1228 WATR 232 HOH HT 1 4.17000000e-01 1.00800 0 - 1229 WATR 232 HOH HT 1 4.17000000e-01 1.00800 0 - 1230 WATR 233 HOH OT 70 -8.34000000e-01 15.9994 0 - 1231 WATR 233 HOH HT 1 4.17000000e-01 1.00800 0 - 1232 WATR 233 HOH HT 1 4.17000000e-01 1.00800 0 - 1233 WATR 234 HOH OT 70 -8.34000000e-01 15.9994 0 - 1234 WATR 234 HOH HT 1 4.17000000e-01 1.00800 0 - 1235 WATR 234 HOH HT 1 4.17000000e-01 1.00800 0 - 1236 WATR 235 HOH OT 70 -8.34000000e-01 15.9994 0 - 1237 WATR 235 HOH HT 1 4.17000000e-01 1.00800 0 - 1238 WATR 235 HOH HT 1 4.17000000e-01 1.00800 0 - 1239 WATR 236 HOH OT 70 -8.34000000e-01 15.9994 0 - 1240 WATR 236 HOH HT 1 4.17000000e-01 1.00800 0 - 1241 WATR 236 HOH HT 1 4.17000000e-01 1.00800 0 - 1242 WATR 237 HOH OT 70 -8.34000000e-01 15.9994 0 - 1243 WATR 237 HOH HT 1 4.17000000e-01 1.00800 0 - 1244 WATR 237 HOH HT 1 4.17000000e-01 1.00800 0 - 1245 WATR 238 HOH OT 70 -8.34000000e-01 15.9994 0 - 1246 WATR 238 HOH HT 1 4.17000000e-01 1.00800 0 - 1247 WATR 238 HOH HT 1 4.17000000e-01 1.00800 0 - 1248 WATR 239 HOH OT 70 -8.34000000e-01 15.9994 0 - 1249 WATR 239 HOH HT 1 4.17000000e-01 1.00800 0 - 1250 WATR 239 HOH HT 1 4.17000000e-01 1.00800 0 - 1251 WATR 240 HOH OT 70 -8.34000000e-01 15.9994 0 - 1252 WATR 240 HOH HT 1 4.17000000e-01 1.00800 0 - 1253 WATR 240 HOH HT 1 4.17000000e-01 1.00800 0 - 1254 WATR 241 HOH OT 70 -8.34000000e-01 15.9994 0 - 1255 WATR 241 HOH HT 1 4.17000000e-01 1.00800 0 - 1256 WATR 241 HOH HT 1 4.17000000e-01 1.00800 0 - 1257 WATR 242 HOH OT 70 -8.34000000e-01 15.9994 0 - 1258 WATR 242 HOH HT 1 4.17000000e-01 1.00800 0 - 1259 WATR 242 HOH HT 1 4.17000000e-01 1.00800 0 - 1260 SALT 7 ION SOD 90 1.00000000e+00 22.9897 0 - 1261 WATR 243 HOH OT 70 -8.34000000e-01 15.9994 0 - 1262 WATR 243 HOH HT 1 4.17000000e-01 1.00800 0 - 1263 WATR 243 HOH HT 1 4.17000000e-01 1.00800 0 - 1264 WATR 244 HOH OT 70 -8.34000000e-01 15.9994 0 - 1265 WATR 244 HOH HT 1 4.17000000e-01 1.00800 0 - 1266 WATR 244 HOH HT 1 4.17000000e-01 1.00800 0 - 1267 WATR 245 HOH OT 70 -8.34000000e-01 15.9994 0 - 1268 WATR 245 HOH HT 1 4.17000000e-01 1.00800 0 - 1269 WATR 245 HOH HT 1 4.17000000e-01 1.00800 0 - 1270 WATR 246 HOH OT 70 -8.34000000e-01 15.9994 0 - 1271 WATR 246 HOH HT 1 4.17000000e-01 1.00800 0 - 1272 WATR 246 HOH HT 1 4.17000000e-01 1.00800 0 - 1273 WATR 247 HOH OT 70 -8.34000000e-01 15.9994 0 - 1274 WATR 247 HOH HT 1 4.17000000e-01 1.00800 0 - 1275 WATR 247 HOH HT 1 4.17000000e-01 1.00800 0 - 1276 WATR 248 HOH OT 70 -8.34000000e-01 15.9994 0 - 1277 WATR 248 HOH HT 1 4.17000000e-01 1.00800 0 - 1278 WATR 248 HOH HT 1 4.17000000e-01 1.00800 0 - 1279 WATR 249 HOH OT 70 -8.34000000e-01 15.9994 0 - 1280 WATR 249 HOH HT 1 4.17000000e-01 1.00800 0 - 1281 WATR 249 HOH HT 1 4.17000000e-01 1.00800 0 - 1282 WATR 250 HOH OT 70 -8.34000000e-01 15.9994 0 - 1283 WATR 250 HOH HT 1 4.17000000e-01 1.00800 0 - 1284 WATR 250 HOH HT 1 4.17000000e-01 1.00800 0 - 1285 WATR 251 HOH OT 70 -8.34000000e-01 15.9994 0 - 1286 WATR 251 HOH HT 1 4.17000000e-01 1.00800 0 - 1287 WATR 251 HOH HT 1 4.17000000e-01 1.00800 0 - 1288 WATR 252 HOH OT 70 -8.34000000e-01 15.9994 0 - 1289 WATR 252 HOH HT 1 4.17000000e-01 1.00800 0 - 1290 WATR 252 HOH HT 1 4.17000000e-01 1.00800 0 - 1291 WATR 253 HOH OT 70 -8.34000000e-01 15.9994 0 - 1292 WATR 253 HOH HT 1 4.17000000e-01 1.00800 0 - 1293 WATR 253 HOH HT 1 4.17000000e-01 1.00800 0 - 1294 WATR 254 HOH OT 70 -8.34000000e-01 15.9994 0 - 1295 WATR 254 HOH HT 1 4.17000000e-01 1.00800 0 - 1296 WATR 254 HOH HT 1 4.17000000e-01 1.00800 0 - 1297 WATR 255 HOH OT 70 -8.34000000e-01 15.9994 0 - 1298 WATR 255 HOH HT 1 4.17000000e-01 1.00800 0 - 1299 WATR 255 HOH HT 1 4.17000000e-01 1.00800 0 - 1300 WATR 256 HOH OT 70 -8.34000000e-01 15.9994 0 - 1301 WATR 256 HOH HT 1 4.17000000e-01 1.00800 0 - 1302 WATR 256 HOH HT 1 4.17000000e-01 1.00800 0 - 1303 WATR 257 HOH OT 70 -8.34000000e-01 15.9994 0 - 1304 WATR 257 HOH HT 1 4.17000000e-01 1.00800 0 - 1305 WATR 257 HOH HT 1 4.17000000e-01 1.00800 0 - 1306 WATR 258 HOH OT 70 -8.34000000e-01 15.9994 0 - 1307 WATR 258 HOH HT 1 4.17000000e-01 1.00800 0 - 1308 WATR 258 HOH HT 1 4.17000000e-01 1.00800 0 - 1309 WATR 259 HOH OT 70 -8.34000000e-01 15.9994 0 - 1310 WATR 259 HOH HT 1 4.17000000e-01 1.00800 0 - 1311 WATR 259 HOH HT 1 4.17000000e-01 1.00800 0 - 1312 SALT 8 ION SOD 90 1.00000000e+00 22.9897 0 - 1313 WATR 260 HOH OT 70 -8.34000000e-01 15.9994 0 - 1314 WATR 260 HOH HT 1 4.17000000e-01 1.00800 0 + 1203 WATR 223 HOH HT 1 4.17000000e-01 1.00800 0 + 1204 SALT 8 ION SOD 90 1.00000000e+00 22.9897 0 + 1205 WATR 224 HOH OT 70 -8.34000000e-01 15.9994 0 + 1206 WATR 224 HOH HT 1 4.17000000e-01 1.00800 0 + 1207 WATR 224 HOH HT 1 4.17000000e-01 1.00800 0 + 1208 WATR 225 HOH OT 70 -8.34000000e-01 15.9994 0 + 1209 WATR 225 HOH HT 1 4.17000000e-01 1.00800 0 + 1210 WATR 225 HOH HT 1 4.17000000e-01 1.00800 0 + 1211 WATR 226 HOH OT 70 -8.34000000e-01 15.9994 0 + 1212 WATR 226 HOH HT 1 4.17000000e-01 1.00800 0 + 1213 WATR 226 HOH HT 1 4.17000000e-01 1.00800 0 + 1214 WATR 227 HOH OT 70 -8.34000000e-01 15.9994 0 + 1215 WATR 227 HOH HT 1 4.17000000e-01 1.00800 0 + 1216 WATR 227 HOH HT 1 4.17000000e-01 1.00800 0 + 1217 SALT 9 ION SOD 90 1.00000000e+00 22.9897 0 + 1218 WATR 228 HOH OT 70 -8.34000000e-01 15.9994 0 + 1219 WATR 228 HOH HT 1 4.17000000e-01 1.00800 0 + 1220 WATR 228 HOH HT 1 4.17000000e-01 1.00800 0 + 1221 WATR 229 HOH OT 70 -8.34000000e-01 15.9994 0 + 1222 WATR 229 HOH HT 1 4.17000000e-01 1.00800 0 + 1223 WATR 229 HOH HT 1 4.17000000e-01 1.00800 0 + 1224 WATR 230 HOH OT 70 -8.34000000e-01 15.9994 0 + 1225 WATR 230 HOH HT 1 4.17000000e-01 1.00800 0 + 1226 WATR 230 HOH HT 1 4.17000000e-01 1.00800 0 + 1227 WATR 231 HOH OT 70 -8.34000000e-01 15.9994 0 + 1228 WATR 231 HOH HT 1 4.17000000e-01 1.00800 0 + 1229 WATR 231 HOH HT 1 4.17000000e-01 1.00800 0 + 1230 WATR 232 HOH OT 70 -8.34000000e-01 15.9994 0 + 1231 WATR 232 HOH HT 1 4.17000000e-01 1.00800 0 + 1232 WATR 232 HOH HT 1 4.17000000e-01 1.00800 0 + 1233 WATR 233 HOH OT 70 -8.34000000e-01 15.9994 0 + 1234 WATR 233 HOH HT 1 4.17000000e-01 1.00800 0 + 1235 WATR 233 HOH HT 1 4.17000000e-01 1.00800 0 + 1236 WATR 234 HOH OT 70 -8.34000000e-01 15.9994 0 + 1237 WATR 234 HOH HT 1 4.17000000e-01 1.00800 0 + 1238 WATR 234 HOH HT 1 4.17000000e-01 1.00800 0 + 1239 WATR 235 HOH OT 70 -8.34000000e-01 15.9994 0 + 1240 WATR 235 HOH HT 1 4.17000000e-01 1.00800 0 + 1241 WATR 235 HOH HT 1 4.17000000e-01 1.00800 0 + 1242 WATR 236 HOH OT 70 -8.34000000e-01 15.9994 0 + 1243 WATR 236 HOH HT 1 4.17000000e-01 1.00800 0 + 1244 WATR 236 HOH HT 1 4.17000000e-01 1.00800 0 + 1245 WATR 237 HOH OT 70 -8.34000000e-01 15.9994 0 + 1246 WATR 237 HOH HT 1 4.17000000e-01 1.00800 0 + 1247 WATR 237 HOH HT 1 4.17000000e-01 1.00800 0 + 1248 WATR 238 HOH OT 70 -8.34000000e-01 15.9994 0 + 1249 WATR 238 HOH HT 1 4.17000000e-01 1.00800 0 + 1250 WATR 238 HOH HT 1 4.17000000e-01 1.00800 0 + 1251 WATR 239 HOH OT 70 -8.34000000e-01 15.9994 0 + 1252 WATR 239 HOH HT 1 4.17000000e-01 1.00800 0 + 1253 WATR 239 HOH HT 1 4.17000000e-01 1.00800 0 + 1254 WATR 240 HOH OT 70 -8.34000000e-01 15.9994 0 + 1255 WATR 240 HOH HT 1 4.17000000e-01 1.00800 0 + 1256 WATR 240 HOH HT 1 4.17000000e-01 1.00800 0 + 1257 WATR 241 HOH OT 70 -8.34000000e-01 15.9994 0 + 1258 WATR 241 HOH HT 1 4.17000000e-01 1.00800 0 + 1259 WATR 241 HOH HT 1 4.17000000e-01 1.00800 0 + 1260 WATR 242 HOH OT 70 -8.34000000e-01 15.9994 0 + 1261 WATR 242 HOH HT 1 4.17000000e-01 1.00800 0 + 1262 WATR 242 HOH HT 1 4.17000000e-01 1.00800 0 + 1263 WATR 243 HOH OT 70 -8.34000000e-01 15.9994 0 + 1264 WATR 243 HOH HT 1 4.17000000e-01 1.00800 0 + 1265 WATR 243 HOH HT 1 4.17000000e-01 1.00800 0 + 1266 WATR 244 HOH OT 70 -8.34000000e-01 15.9994 0 + 1267 WATR 244 HOH HT 1 4.17000000e-01 1.00800 0 + 1268 WATR 244 HOH HT 1 4.17000000e-01 1.00800 0 + 1269 WATR 245 HOH OT 70 -8.34000000e-01 15.9994 0 + 1270 WATR 245 HOH HT 1 4.17000000e-01 1.00800 0 + 1271 WATR 245 HOH HT 1 4.17000000e-01 1.00800 0 + 1272 WATR 246 HOH OT 70 -8.34000000e-01 15.9994 0 + 1273 WATR 246 HOH HT 1 4.17000000e-01 1.00800 0 + 1274 WATR 246 HOH HT 1 4.17000000e-01 1.00800 0 + 1275 WATR 247 HOH OT 70 -8.34000000e-01 15.9994 0 + 1276 WATR 247 HOH HT 1 4.17000000e-01 1.00800 0 + 1277 WATR 247 HOH HT 1 4.17000000e-01 1.00800 0 + 1278 WATR 248 HOH OT 70 -8.34000000e-01 15.9994 0 + 1279 WATR 248 HOH HT 1 4.17000000e-01 1.00800 0 + 1280 WATR 248 HOH HT 1 4.17000000e-01 1.00800 0 + 1281 WATR 249 HOH OT 70 -8.34000000e-01 15.9994 0 + 1282 WATR 249 HOH HT 1 4.17000000e-01 1.00800 0 + 1283 WATR 249 HOH HT 1 4.17000000e-01 1.00800 0 + 1284 WATR 250 HOH OT 70 -8.34000000e-01 15.9994 0 + 1285 WATR 250 HOH HT 1 4.17000000e-01 1.00800 0 + 1286 WATR 250 HOH HT 1 4.17000000e-01 1.00800 0 + 1287 WATR 251 HOH OT 70 -8.34000000e-01 15.9994 0 + 1288 WATR 251 HOH HT 1 4.17000000e-01 1.00800 0 + 1289 WATR 251 HOH HT 1 4.17000000e-01 1.00800 0 + 1290 WATR 252 HOH OT 70 -8.34000000e-01 15.9994 0 + 1291 WATR 252 HOH HT 1 4.17000000e-01 1.00800 0 + 1292 WATR 252 HOH HT 1 4.17000000e-01 1.00800 0 + 1293 WATR 253 HOH OT 70 -8.34000000e-01 15.9994 0 + 1294 WATR 253 HOH HT 1 4.17000000e-01 1.00800 0 + 1295 WATR 253 HOH HT 1 4.17000000e-01 1.00800 0 + 1296 WATR 254 HOH OT 70 -8.34000000e-01 15.9994 0 + 1297 WATR 254 HOH HT 1 4.17000000e-01 1.00800 0 + 1298 WATR 254 HOH HT 1 4.17000000e-01 1.00800 0 + 1299 WATR 255 HOH OT 70 -8.34000000e-01 15.9994 0 + 1300 WATR 255 HOH HT 1 4.17000000e-01 1.00800 0 + 1301 WATR 255 HOH HT 1 4.17000000e-01 1.00800 0 + 1302 WATR 256 HOH OT 70 -8.34000000e-01 15.9994 0 + 1303 WATR 256 HOH HT 1 4.17000000e-01 1.00800 0 + 1304 WATR 256 HOH HT 1 4.17000000e-01 1.00800 0 + 1305 WATR 257 HOH OT 70 -8.34000000e-01 15.9994 0 + 1306 WATR 257 HOH HT 1 4.17000000e-01 1.00800 0 + 1307 WATR 257 HOH HT 1 4.17000000e-01 1.00800 0 + 1308 WATR 258 HOH OT 70 -8.34000000e-01 15.9994 0 + 1309 WATR 258 HOH HT 1 4.17000000e-01 1.00800 0 + 1310 WATR 258 HOH HT 1 4.17000000e-01 1.00800 0 + 1311 WATR 259 HOH OT 70 -8.34000000e-01 15.9994 0 + 1312 WATR 259 HOH HT 1 4.17000000e-01 1.00800 0 + 1313 WATR 259 HOH HT 1 4.17000000e-01 1.00800 0 + 1314 WATR 260 HOH OT 70 -8.34000000e-01 15.9994 0 1315 WATR 260 HOH HT 1 4.17000000e-01 1.00800 0 - 1316 WATR 261 HOH OT 70 -8.34000000e-01 15.9994 0 - 1317 WATR 261 HOH HT 1 4.17000000e-01 1.00800 0 + 1316 WATR 260 HOH HT 1 4.17000000e-01 1.00800 0 + 1317 WATR 261 HOH OT 70 -8.34000000e-01 15.9994 0 1318 WATR 261 HOH HT 1 4.17000000e-01 1.00800 0 - 1319 WATR 262 HOH OT 70 -8.34000000e-01 15.9994 0 - 1320 WATR 262 HOH HT 1 4.17000000e-01 1.00800 0 + 1319 WATR 261 HOH HT 1 4.17000000e-01 1.00800 0 + 1320 WATR 262 HOH OT 70 -8.34000000e-01 15.9994 0 1321 WATR 262 HOH HT 1 4.17000000e-01 1.00800 0 - 1322 WATR 263 HOH OT 70 -8.34000000e-01 15.9994 0 - 1323 WATR 263 HOH HT 1 4.17000000e-01 1.00800 0 + 1322 WATR 262 HOH HT 1 4.17000000e-01 1.00800 0 + 1323 WATR 263 HOH OT 70 -8.34000000e-01 15.9994 0 1324 WATR 263 HOH HT 1 4.17000000e-01 1.00800 0 - 1325 WATR 264 HOH OT 70 -8.34000000e-01 15.9994 0 - 1326 WATR 264 HOH HT 1 4.17000000e-01 1.00800 0 + 1325 WATR 263 HOH HT 1 4.17000000e-01 1.00800 0 + 1326 WATR 264 HOH OT 70 -8.34000000e-01 15.9994 0 1327 WATR 264 HOH HT 1 4.17000000e-01 1.00800 0 - 1328 WATR 265 HOH OT 70 -8.34000000e-01 15.9994 0 - 1329 WATR 265 HOH HT 1 4.17000000e-01 1.00800 0 + 1328 WATR 264 HOH HT 1 4.17000000e-01 1.00800 0 + 1329 WATR 265 HOH OT 70 -8.34000000e-01 15.9994 0 1330 WATR 265 HOH HT 1 4.17000000e-01 1.00800 0 - 1331 WATR 266 HOH OT 70 -8.34000000e-01 15.9994 0 - 1332 WATR 266 HOH HT 1 4.17000000e-01 1.00800 0 + 1331 WATR 265 HOH HT 1 4.17000000e-01 1.00800 0 + 1332 WATR 266 HOH OT 70 -8.34000000e-01 15.9994 0 1333 WATR 266 HOH HT 1 4.17000000e-01 1.00800 0 - 1334 WATR 267 HOH OT 70 -8.34000000e-01 15.9994 0 - 1335 WATR 267 HOH HT 1 4.17000000e-01 1.00800 0 + 1334 WATR 266 HOH HT 1 4.17000000e-01 1.00800 0 + 1335 WATR 267 HOH OT 70 -8.34000000e-01 15.9994 0 1336 WATR 267 HOH HT 1 4.17000000e-01 1.00800 0 - 1337 WATR 268 HOH OT 70 -8.34000000e-01 15.9994 0 - 1338 WATR 268 HOH HT 1 4.17000000e-01 1.00800 0 + 1337 WATR 267 HOH HT 1 4.17000000e-01 1.00800 0 + 1338 WATR 268 HOH OT 70 -8.34000000e-01 15.9994 0 1339 WATR 268 HOH HT 1 4.17000000e-01 1.00800 0 - 1340 WATR 269 HOH OT 70 -8.34000000e-01 15.9994 0 - 1341 WATR 269 HOH HT 1 4.17000000e-01 1.00800 0 + 1340 WATR 268 HOH HT 1 4.17000000e-01 1.00800 0 + 1341 WATR 269 HOH OT 70 -8.34000000e-01 15.9994 0 1342 WATR 269 HOH HT 1 4.17000000e-01 1.00800 0 - 1343 WATR 270 HOH OT 70 -8.34000000e-01 15.9994 0 - 1344 WATR 270 HOH HT 1 4.17000000e-01 1.00800 0 + 1343 WATR 269 HOH HT 1 4.17000000e-01 1.00800 0 + 1344 WATR 270 HOH OT 70 -8.34000000e-01 15.9994 0 1345 WATR 270 HOH HT 1 4.17000000e-01 1.00800 0 - 1346 WATR 271 HOH OT 70 -8.34000000e-01 15.9994 0 - 1347 WATR 271 HOH HT 1 4.17000000e-01 1.00800 0 - 1348 WATR 271 HOH HT 1 4.17000000e-01 1.00800 0 - 1349 WATR 272 HOH OT 70 -8.34000000e-01 15.9994 0 - 1350 WATR 272 HOH HT 1 4.17000000e-01 1.00800 0 - 1351 WATR 272 HOH HT 1 4.17000000e-01 1.00800 0 - 1352 WATR 273 HOH OT 70 -8.34000000e-01 15.9994 0 - 1353 WATR 273 HOH HT 1 4.17000000e-01 1.00800 0 - 1354 WATR 273 HOH HT 1 4.17000000e-01 1.00800 0 - 1355 WATR 274 HOH OT 70 -8.34000000e-01 15.9994 0 - 1356 WATR 274 HOH HT 1 4.17000000e-01 1.00800 0 - 1357 WATR 274 HOH HT 1 4.17000000e-01 1.00800 0 - 1358 WATR 275 HOH OT 70 -8.34000000e-01 15.9994 0 - 1359 WATR 275 HOH HT 1 4.17000000e-01 1.00800 0 - 1360 WATR 275 HOH HT 1 4.17000000e-01 1.00800 0 - 1361 WATR 276 HOH OT 70 -8.34000000e-01 15.9994 0 - 1362 WATR 276 HOH HT 1 4.17000000e-01 1.00800 0 - 1363 WATR 276 HOH HT 1 4.17000000e-01 1.00800 0 - 1364 WATR 277 HOH OT 70 -8.34000000e-01 15.9994 0 - 1365 WATR 277 HOH HT 1 4.17000000e-01 1.00800 0 - 1366 WATR 277 HOH HT 1 4.17000000e-01 1.00800 0 - 1367 WATR 278 HOH OT 70 -8.34000000e-01 15.9994 0 - 1368 WATR 278 HOH HT 1 4.17000000e-01 1.00800 0 - 1369 WATR 278 HOH HT 1 4.17000000e-01 1.00800 0 - 1370 WATR 279 HOH OT 70 -8.34000000e-01 15.9994 0 - 1371 WATR 279 HOH HT 1 4.17000000e-01 1.00800 0 - 1372 WATR 279 HOH HT 1 4.17000000e-01 1.00800 0 - 1373 WATR 280 HOH OT 70 -8.34000000e-01 15.9994 0 - 1374 WATR 280 HOH HT 1 4.17000000e-01 1.00800 0 - 1375 WATR 280 HOH HT 1 4.17000000e-01 1.00800 0 - 1376 WATR 281 HOH OT 70 -8.34000000e-01 15.9994 0 - 1377 WATR 281 HOH HT 1 4.17000000e-01 1.00800 0 - 1378 WATR 281 HOH HT 1 4.17000000e-01 1.00800 0 - 1379 WATR 282 HOH OT 70 -8.34000000e-01 15.9994 0 - 1380 WATR 282 HOH HT 1 4.17000000e-01 1.00800 0 - 1381 WATR 282 HOH HT 1 4.17000000e-01 1.00800 0 - 1382 WATR 283 HOH OT 70 -8.34000000e-01 15.9994 0 - 1383 WATR 283 HOH HT 1 4.17000000e-01 1.00800 0 - 1384 WATR 283 HOH HT 1 4.17000000e-01 1.00800 0 - 1385 WATR 284 HOH OT 70 -8.34000000e-01 15.9994 0 - 1386 WATR 284 HOH HT 1 4.17000000e-01 1.00800 0 - 1387 WATR 284 HOH HT 1 4.17000000e-01 1.00800 0 - 1388 WATR 285 HOH OT 70 -8.34000000e-01 15.9994 0 - 1389 WATR 285 HOH HT 1 4.17000000e-01 1.00800 0 - 1390 WATR 285 HOH HT 1 4.17000000e-01 1.00800 0 - 1391 WATR 286 HOH OT 70 -8.34000000e-01 15.9994 0 - 1392 WATR 286 HOH HT 1 4.17000000e-01 1.00800 0 - 1393 WATR 286 HOH HT 1 4.17000000e-01 1.00800 0 - 1394 WATR 287 HOH OT 70 -8.34000000e-01 15.9994 0 - 1395 WATR 287 HOH HT 1 4.17000000e-01 1.00800 0 - 1396 WATR 287 HOH HT 1 4.17000000e-01 1.00800 0 - 1397 WATR 288 HOH OT 70 -8.34000000e-01 15.9994 0 - 1398 WATR 288 HOH HT 1 4.17000000e-01 1.00800 0 - 1399 WATR 288 HOH HT 1 4.17000000e-01 1.00800 0 - 1400 WATR 289 HOH OT 70 -8.34000000e-01 15.9994 0 - 1401 WATR 289 HOH HT 1 4.17000000e-01 1.00800 0 - 1402 WATR 289 HOH HT 1 4.17000000e-01 1.00800 0 - 1403 WATR 290 HOH OT 70 -8.34000000e-01 15.9994 0 - 1404 WATR 290 HOH HT 1 4.17000000e-01 1.00800 0 - 1405 WATR 290 HOH HT 1 4.17000000e-01 1.00800 0 - 1406 WATR 291 HOH OT 70 -8.34000000e-01 15.9994 0 - 1407 WATR 291 HOH HT 1 4.17000000e-01 1.00800 0 - 1408 WATR 291 HOH HT 1 4.17000000e-01 1.00800 0 - 1409 WATR 292 HOH OT 70 -8.34000000e-01 15.9994 0 - 1410 WATR 292 HOH HT 1 4.17000000e-01 1.00800 0 - 1411 WATR 292 HOH HT 1 4.17000000e-01 1.00800 0 - 1412 WATR 293 HOH OT 70 -8.34000000e-01 15.9994 0 - 1413 WATR 293 HOH HT 1 4.17000000e-01 1.00800 0 - 1414 WATR 293 HOH HT 1 4.17000000e-01 1.00800 0 - 1415 WATR 294 HOH OT 70 -8.34000000e-01 15.9994 0 - 1416 WATR 294 HOH HT 1 4.17000000e-01 1.00800 0 - 1417 WATR 294 HOH HT 1 4.17000000e-01 1.00800 0 - 1418 WATR 295 HOH OT 70 -8.34000000e-01 15.9994 0 - 1419 WATR 295 HOH HT 1 4.17000000e-01 1.00800 0 - 1420 WATR 295 HOH HT 1 4.17000000e-01 1.00800 0 - 1421 WATR 296 HOH OT 70 -8.34000000e-01 15.9994 0 - 1422 WATR 296 HOH HT 1 4.17000000e-01 1.00800 0 - 1423 WATR 296 HOH HT 1 4.17000000e-01 1.00800 0 - 1424 WATR 297 HOH OT 70 -8.34000000e-01 15.9994 0 - 1425 WATR 297 HOH HT 1 4.17000000e-01 1.00800 0 - 1426 WATR 297 HOH HT 1 4.17000000e-01 1.00800 0 - 1427 WATR 298 HOH OT 70 -8.34000000e-01 15.9994 0 - 1428 WATR 298 HOH HT 1 4.17000000e-01 1.00800 0 - 1429 WATR 298 HOH HT 1 4.17000000e-01 1.00800 0 - 1430 WATR 299 HOH OT 70 -8.34000000e-01 15.9994 0 - 1431 WATR 299 HOH HT 1 4.17000000e-01 1.00800 0 - 1432 WATR 299 HOH HT 1 4.17000000e-01 1.00800 0 - 1433 WATR 300 HOH OT 70 -8.34000000e-01 15.9994 0 - 1434 WATR 300 HOH HT 1 4.17000000e-01 1.00800 0 - 1435 WATR 300 HOH HT 1 4.17000000e-01 1.00800 0 - 1436 WATR 301 HOH OT 70 -8.34000000e-01 15.9994 0 - 1437 WATR 301 HOH HT 1 4.17000000e-01 1.00800 0 - 1438 WATR 301 HOH HT 1 4.17000000e-01 1.00800 0 - 1439 WATR 302 HOH OT 70 -8.34000000e-01 15.9994 0 - 1440 WATR 302 HOH HT 1 4.17000000e-01 1.00800 0 - 1441 WATR 302 HOH HT 1 4.17000000e-01 1.00800 0 - 1442 WATR 303 HOH OT 70 -8.34000000e-01 15.9994 0 - 1443 WATR 303 HOH HT 1 4.17000000e-01 1.00800 0 - 1444 WATR 303 HOH HT 1 4.17000000e-01 1.00800 0 - 1445 SALT 9 ION SOD 90 1.00000000e+00 22.9897 0 - 1446 WATR 304 HOH OT 70 -8.34000000e-01 15.9994 0 - 1447 WATR 304 HOH HT 1 4.17000000e-01 1.00800 0 - 1448 WATR 304 HOH HT 1 4.17000000e-01 1.00800 0 - 1449 WATR 305 HOH OT 70 -8.34000000e-01 15.9994 0 - 1450 WATR 305 HOH HT 1 4.17000000e-01 1.00800 0 - 1451 WATR 305 HOH HT 1 4.17000000e-01 1.00800 0 - 1452 WATR 306 HOH OT 70 -8.34000000e-01 15.9994 0 - 1453 WATR 306 HOH HT 1 4.17000000e-01 1.00800 0 - 1454 WATR 306 HOH HT 1 4.17000000e-01 1.00800 0 - 1455 WATR 307 HOH OT 70 -8.34000000e-01 15.9994 0 - 1456 WATR 307 HOH HT 1 4.17000000e-01 1.00800 0 - 1457 WATR 307 HOH HT 1 4.17000000e-01 1.00800 0 - 1458 WATR 308 HOH OT 70 -8.34000000e-01 15.9994 0 - 1459 WATR 308 HOH HT 1 4.17000000e-01 1.00800 0 - 1460 WATR 308 HOH HT 1 4.17000000e-01 1.00800 0 - 1461 WATR 309 HOH OT 70 -8.34000000e-01 15.9994 0 - 1462 WATR 309 HOH HT 1 4.17000000e-01 1.00800 0 - 1463 WATR 309 HOH HT 1 4.17000000e-01 1.00800 0 - 1464 WATR 310 HOH OT 70 -8.34000000e-01 15.9994 0 - 1465 WATR 310 HOH HT 1 4.17000000e-01 1.00800 0 - 1466 WATR 310 HOH HT 1 4.17000000e-01 1.00800 0 - 1467 WATR 311 HOH OT 70 -8.34000000e-01 15.9994 0 - 1468 WATR 311 HOH HT 1 4.17000000e-01 1.00800 0 - 1469 WATR 311 HOH HT 1 4.17000000e-01 1.00800 0 - 1470 WATR 312 HOH OT 70 -8.34000000e-01 15.9994 0 - 1471 WATR 312 HOH HT 1 4.17000000e-01 1.00800 0 - 1472 WATR 312 HOH HT 1 4.17000000e-01 1.00800 0 - 1473 WATR 313 HOH OT 70 -8.34000000e-01 15.9994 0 - 1474 WATR 313 HOH HT 1 4.17000000e-01 1.00800 0 - 1475 WATR 313 HOH HT 1 4.17000000e-01 1.00800 0 - 1476 WATR 314 HOH OT 70 -8.34000000e-01 15.9994 0 - 1477 WATR 314 HOH HT 1 4.17000000e-01 1.00800 0 - 1478 WATR 314 HOH HT 1 4.17000000e-01 1.00800 0 - 1479 WATR 315 HOH OT 70 -8.34000000e-01 15.9994 0 - 1480 WATR 315 HOH HT 1 4.17000000e-01 1.00800 0 - 1481 WATR 315 HOH HT 1 4.17000000e-01 1.00800 0 - 1482 WATR 316 HOH OT 70 -8.34000000e-01 15.9994 0 - 1483 WATR 316 HOH HT 1 4.17000000e-01 1.00800 0 - 1484 WATR 316 HOH HT 1 4.17000000e-01 1.00800 0 - 1485 WATR 317 HOH OT 70 -8.34000000e-01 15.9994 0 - 1486 WATR 317 HOH HT 1 4.17000000e-01 1.00800 0 - 1487 WATR 317 HOH HT 1 4.17000000e-01 1.00800 0 - 1488 WATR 318 HOH OT 70 -8.34000000e-01 15.9994 0 - 1489 WATR 318 HOH HT 1 4.17000000e-01 1.00800 0 - 1490 WATR 318 HOH HT 1 4.17000000e-01 1.00800 0 - 1491 WATR 319 HOH OT 70 -8.34000000e-01 15.9994 0 - 1492 WATR 319 HOH HT 1 4.17000000e-01 1.00800 0 - 1493 WATR 319 HOH HT 1 4.17000000e-01 1.00800 0 - 1494 WATR 320 HOH OT 70 -8.34000000e-01 15.9994 0 - 1495 WATR 320 HOH HT 1 4.17000000e-01 1.00800 0 - 1496 WATR 320 HOH HT 1 4.17000000e-01 1.00800 0 - 1497 WATR 321 HOH OT 70 -8.34000000e-01 15.9994 0 - 1498 WATR 321 HOH HT 1 4.17000000e-01 1.00800 0 - 1499 WATR 321 HOH HT 1 4.17000000e-01 1.00800 0 - 1500 SALT 10 ION SOD 90 1.00000000e+00 22.9897 0 - 1501 WATR 322 HOH OT 70 -8.34000000e-01 15.9994 0 - 1502 WATR 322 HOH HT 1 4.17000000e-01 1.00800 0 - 1503 WATR 322 HOH HT 1 4.17000000e-01 1.00800 0 - 1504 WATR 323 HOH OT 70 -8.34000000e-01 15.9994 0 - 1505 WATR 323 HOH HT 1 4.17000000e-01 1.00800 0 - 1506 WATR 323 HOH HT 1 4.17000000e-01 1.00800 0 - 1507 WATR 324 HOH OT 70 -8.34000000e-01 15.9994 0 - 1508 WATR 324 HOH HT 1 4.17000000e-01 1.00800 0 - 1509 WATR 324 HOH HT 1 4.17000000e-01 1.00800 0 - 1510 WATR 325 HOH OT 70 -8.34000000e-01 15.9994 0 - 1511 WATR 325 HOH HT 1 4.17000000e-01 1.00800 0 - 1512 WATR 325 HOH HT 1 4.17000000e-01 1.00800 0 - 1513 WATR 326 HOH OT 70 -8.34000000e-01 15.9994 0 - 1514 WATR 326 HOH HT 1 4.17000000e-01 1.00800 0 - 1515 WATR 326 HOH HT 1 4.17000000e-01 1.00800 0 - 1516 WATR 327 HOH OT 70 -8.34000000e-01 15.9994 0 - 1517 WATR 327 HOH HT 1 4.17000000e-01 1.00800 0 - 1518 WATR 327 HOH HT 1 4.17000000e-01 1.00800 0 - 1519 WATR 328 HOH OT 70 -8.34000000e-01 15.9994 0 - 1520 WATR 328 HOH HT 1 4.17000000e-01 1.00800 0 - 1521 WATR 328 HOH HT 1 4.17000000e-01 1.00800 0 - 1522 WATR 329 HOH OT 70 -8.34000000e-01 15.9994 0 - 1523 WATR 329 HOH HT 1 4.17000000e-01 1.00800 0 - 1524 WATR 329 HOH HT 1 4.17000000e-01 1.00800 0 - 1525 WATR 330 HOH OT 70 -8.34000000e-01 15.9994 0 - 1526 WATR 330 HOH HT 1 4.17000000e-01 1.00800 0 - 1527 WATR 330 HOH HT 1 4.17000000e-01 1.00800 0 - 1528 WATR 331 HOH OT 70 -8.34000000e-01 15.9994 0 - 1529 WATR 331 HOH HT 1 4.17000000e-01 1.00800 0 - 1530 WATR 331 HOH HT 1 4.17000000e-01 1.00800 0 - 1531 WATR 332 HOH OT 70 -8.34000000e-01 15.9994 0 - 1532 WATR 332 HOH HT 1 4.17000000e-01 1.00800 0 - 1533 WATR 332 HOH HT 1 4.17000000e-01 1.00800 0 - 1534 WATR 333 HOH OT 70 -8.34000000e-01 15.9994 0 - 1535 WATR 333 HOH HT 1 4.17000000e-01 1.00800 0 - 1536 WATR 333 HOH HT 1 4.17000000e-01 1.00800 0 - 1537 WATR 334 HOH OT 70 -8.34000000e-01 15.9994 0 - 1538 WATR 334 HOH HT 1 4.17000000e-01 1.00800 0 - 1539 WATR 334 HOH HT 1 4.17000000e-01 1.00800 0 - 1540 WATR 335 HOH OT 70 -8.34000000e-01 15.9994 0 - 1541 WATR 335 HOH HT 1 4.17000000e-01 1.00800 0 - 1542 WATR 335 HOH HT 1 4.17000000e-01 1.00800 0 - 1543 WATR 336 HOH OT 70 -8.34000000e-01 15.9994 0 - 1544 WATR 336 HOH HT 1 4.17000000e-01 1.00800 0 - 1545 WATR 336 HOH HT 1 4.17000000e-01 1.00800 0 - 1546 WATR 337 HOH OT 70 -8.34000000e-01 15.9994 0 - 1547 WATR 337 HOH HT 1 4.17000000e-01 1.00800 0 - 1548 WATR 337 HOH HT 1 4.17000000e-01 1.00800 0 - 1549 WATR 338 HOH OT 70 -8.34000000e-01 15.9994 0 - 1550 WATR 338 HOH HT 1 4.17000000e-01 1.00800 0 - 1551 WATR 338 HOH HT 1 4.17000000e-01 1.00800 0 - 1552 WATR 339 HOH OT 70 -8.34000000e-01 15.9994 0 - 1553 WATR 339 HOH HT 1 4.17000000e-01 1.00800 0 - 1554 WATR 339 HOH HT 1 4.17000000e-01 1.00800 0 - 1555 WATR 340 HOH OT 70 -8.34000000e-01 15.9994 0 - 1556 WATR 340 HOH HT 1 4.17000000e-01 1.00800 0 - 1557 WATR 340 HOH HT 1 4.17000000e-01 1.00800 0 - 1558 WATR 341 HOH OT 70 -8.34000000e-01 15.9994 0 - 1559 WATR 341 HOH HT 1 4.17000000e-01 1.00800 0 - 1560 WATR 341 HOH HT 1 4.17000000e-01 1.00800 0 - 1561 WATR 342 HOH OT 70 -8.34000000e-01 15.9994 0 - 1562 WATR 342 HOH HT 1 4.17000000e-01 1.00800 0 - 1563 WATR 342 HOH HT 1 4.17000000e-01 1.00800 0 - 1564 WATR 343 HOH OT 70 -8.34000000e-01 15.9994 0 - 1565 WATR 343 HOH HT 1 4.17000000e-01 1.00800 0 - 1566 WATR 343 HOH HT 1 4.17000000e-01 1.00800 0 - 1567 WATR 344 HOH OT 70 -8.34000000e-01 15.9994 0 - 1568 WATR 344 HOH HT 1 4.17000000e-01 1.00800 0 - 1569 WATR 344 HOH HT 1 4.17000000e-01 1.00800 0 - 1570 WATR 345 HOH OT 70 -8.34000000e-01 15.9994 0 - 1571 WATR 345 HOH HT 1 4.17000000e-01 1.00800 0 - 1572 WATR 345 HOH HT 1 4.17000000e-01 1.00800 0 - 1573 SALT 11 ION SOD 90 1.00000000e+00 22.9897 0 - 1574 WATR 346 HOH OT 70 -8.34000000e-01 15.9994 0 - 1575 WATR 346 HOH HT 1 4.17000000e-01 1.00800 0 + 1346 WATR 270 HOH HT 1 4.17000000e-01 1.00800 0 + 1347 SALT 10 ION SOD 90 1.00000000e+00 22.9897 0 + 1348 WATR 271 HOH OT 70 -8.34000000e-01 15.9994 0 + 1349 WATR 271 HOH HT 1 4.17000000e-01 1.00800 0 + 1350 WATR 271 HOH HT 1 4.17000000e-01 1.00800 0 + 1351 WATR 272 HOH OT 70 -8.34000000e-01 15.9994 0 + 1352 WATR 272 HOH HT 1 4.17000000e-01 1.00800 0 + 1353 WATR 272 HOH HT 1 4.17000000e-01 1.00800 0 + 1354 WATR 273 HOH OT 70 -8.34000000e-01 15.9994 0 + 1355 WATR 273 HOH HT 1 4.17000000e-01 1.00800 0 + 1356 WATR 273 HOH HT 1 4.17000000e-01 1.00800 0 + 1357 WATR 274 HOH OT 70 -8.34000000e-01 15.9994 0 + 1358 WATR 274 HOH HT 1 4.17000000e-01 1.00800 0 + 1359 WATR 274 HOH HT 1 4.17000000e-01 1.00800 0 + 1360 WATR 275 HOH OT 70 -8.34000000e-01 15.9994 0 + 1361 WATR 275 HOH HT 1 4.17000000e-01 1.00800 0 + 1362 WATR 275 HOH HT 1 4.17000000e-01 1.00800 0 + 1363 WATR 276 HOH OT 70 -8.34000000e-01 15.9994 0 + 1364 WATR 276 HOH HT 1 4.17000000e-01 1.00800 0 + 1365 WATR 276 HOH HT 1 4.17000000e-01 1.00800 0 + 1366 WATR 277 HOH OT 70 -8.34000000e-01 15.9994 0 + 1367 WATR 277 HOH HT 1 4.17000000e-01 1.00800 0 + 1368 WATR 277 HOH HT 1 4.17000000e-01 1.00800 0 + 1369 WATR 278 HOH OT 70 -8.34000000e-01 15.9994 0 + 1370 WATR 278 HOH HT 1 4.17000000e-01 1.00800 0 + 1371 WATR 278 HOH HT 1 4.17000000e-01 1.00800 0 + 1372 WATR 279 HOH OT 70 -8.34000000e-01 15.9994 0 + 1373 WATR 279 HOH HT 1 4.17000000e-01 1.00800 0 + 1374 WATR 279 HOH HT 1 4.17000000e-01 1.00800 0 + 1375 WATR 280 HOH OT 70 -8.34000000e-01 15.9994 0 + 1376 WATR 280 HOH HT 1 4.17000000e-01 1.00800 0 + 1377 WATR 280 HOH HT 1 4.17000000e-01 1.00800 0 + 1378 WATR 281 HOH OT 70 -8.34000000e-01 15.9994 0 + 1379 WATR 281 HOH HT 1 4.17000000e-01 1.00800 0 + 1380 WATR 281 HOH HT 1 4.17000000e-01 1.00800 0 + 1381 WATR 282 HOH OT 70 -8.34000000e-01 15.9994 0 + 1382 WATR 282 HOH HT 1 4.17000000e-01 1.00800 0 + 1383 WATR 282 HOH HT 1 4.17000000e-01 1.00800 0 + 1384 WATR 283 HOH OT 70 -8.34000000e-01 15.9994 0 + 1385 WATR 283 HOH HT 1 4.17000000e-01 1.00800 0 + 1386 WATR 283 HOH HT 1 4.17000000e-01 1.00800 0 + 1387 WATR 284 HOH OT 70 -8.34000000e-01 15.9994 0 + 1388 WATR 284 HOH HT 1 4.17000000e-01 1.00800 0 + 1389 WATR 284 HOH HT 1 4.17000000e-01 1.00800 0 + 1390 WATR 285 HOH OT 70 -8.34000000e-01 15.9994 0 + 1391 WATR 285 HOH HT 1 4.17000000e-01 1.00800 0 + 1392 WATR 285 HOH HT 1 4.17000000e-01 1.00800 0 + 1393 WATR 286 HOH OT 70 -8.34000000e-01 15.9994 0 + 1394 WATR 286 HOH HT 1 4.17000000e-01 1.00800 0 + 1395 WATR 286 HOH HT 1 4.17000000e-01 1.00800 0 + 1396 WATR 287 HOH OT 70 -8.34000000e-01 15.9994 0 + 1397 WATR 287 HOH HT 1 4.17000000e-01 1.00800 0 + 1398 WATR 287 HOH HT 1 4.17000000e-01 1.00800 0 + 1399 WATR 288 HOH OT 70 -8.34000000e-01 15.9994 0 + 1400 WATR 288 HOH HT 1 4.17000000e-01 1.00800 0 + 1401 WATR 288 HOH HT 1 4.17000000e-01 1.00800 0 + 1402 WATR 289 HOH OT 70 -8.34000000e-01 15.9994 0 + 1403 WATR 289 HOH HT 1 4.17000000e-01 1.00800 0 + 1404 WATR 289 HOH HT 1 4.17000000e-01 1.00800 0 + 1405 WATR 290 HOH OT 70 -8.34000000e-01 15.9994 0 + 1406 WATR 290 HOH HT 1 4.17000000e-01 1.00800 0 + 1407 WATR 290 HOH HT 1 4.17000000e-01 1.00800 0 + 1408 WATR 291 HOH OT 70 -8.34000000e-01 15.9994 0 + 1409 WATR 291 HOH HT 1 4.17000000e-01 1.00800 0 + 1410 WATR 291 HOH HT 1 4.17000000e-01 1.00800 0 + 1411 WATR 292 HOH OT 70 -8.34000000e-01 15.9994 0 + 1412 WATR 292 HOH HT 1 4.17000000e-01 1.00800 0 + 1413 WATR 292 HOH HT 1 4.17000000e-01 1.00800 0 + 1414 WATR 293 HOH OT 70 -8.34000000e-01 15.9994 0 + 1415 WATR 293 HOH HT 1 4.17000000e-01 1.00800 0 + 1416 WATR 293 HOH HT 1 4.17000000e-01 1.00800 0 + 1417 WATR 294 HOH OT 70 -8.34000000e-01 15.9994 0 + 1418 WATR 294 HOH HT 1 4.17000000e-01 1.00800 0 + 1419 WATR 294 HOH HT 1 4.17000000e-01 1.00800 0 + 1420 WATR 295 HOH OT 70 -8.34000000e-01 15.9994 0 + 1421 WATR 295 HOH HT 1 4.17000000e-01 1.00800 0 + 1422 WATR 295 HOH HT 1 4.17000000e-01 1.00800 0 + 1423 WATR 296 HOH OT 70 -8.34000000e-01 15.9994 0 + 1424 WATR 296 HOH HT 1 4.17000000e-01 1.00800 0 + 1425 WATR 296 HOH HT 1 4.17000000e-01 1.00800 0 + 1426 WATR 297 HOH OT 70 -8.34000000e-01 15.9994 0 + 1427 WATR 297 HOH HT 1 4.17000000e-01 1.00800 0 + 1428 WATR 297 HOH HT 1 4.17000000e-01 1.00800 0 + 1429 WATR 298 HOH OT 70 -8.34000000e-01 15.9994 0 + 1430 WATR 298 HOH HT 1 4.17000000e-01 1.00800 0 + 1431 WATR 298 HOH HT 1 4.17000000e-01 1.00800 0 + 1432 WATR 299 HOH OT 70 -8.34000000e-01 15.9994 0 + 1433 WATR 299 HOH HT 1 4.17000000e-01 1.00800 0 + 1434 WATR 299 HOH HT 1 4.17000000e-01 1.00800 0 + 1435 WATR 300 HOH OT 70 -8.34000000e-01 15.9994 0 + 1436 WATR 300 HOH HT 1 4.17000000e-01 1.00800 0 + 1437 WATR 300 HOH HT 1 4.17000000e-01 1.00800 0 + 1438 SALT 11 ION SOD 90 1.00000000e+00 22.9897 0 + 1439 WATR 301 HOH OT 70 -8.34000000e-01 15.9994 0 + 1440 WATR 301 HOH HT 1 4.17000000e-01 1.00800 0 + 1441 WATR 301 HOH HT 1 4.17000000e-01 1.00800 0 + 1442 WATR 302 HOH OT 70 -8.34000000e-01 15.9994 0 + 1443 WATR 302 HOH HT 1 4.17000000e-01 1.00800 0 + 1444 WATR 302 HOH HT 1 4.17000000e-01 1.00800 0 + 1445 WATR 303 HOH OT 70 -8.34000000e-01 15.9994 0 + 1446 WATR 303 HOH HT 1 4.17000000e-01 1.00800 0 + 1447 WATR 303 HOH HT 1 4.17000000e-01 1.00800 0 + 1448 SALT 12 ION SOD 90 1.00000000e+00 22.9897 0 + 1449 WATR 304 HOH OT 70 -8.34000000e-01 15.9994 0 + 1450 WATR 304 HOH HT 1 4.17000000e-01 1.00800 0 + 1451 WATR 304 HOH HT 1 4.17000000e-01 1.00800 0 + 1452 WATR 305 HOH OT 70 -8.34000000e-01 15.9994 0 + 1453 WATR 305 HOH HT 1 4.17000000e-01 1.00800 0 + 1454 WATR 305 HOH HT 1 4.17000000e-01 1.00800 0 + 1455 WATR 306 HOH OT 70 -8.34000000e-01 15.9994 0 + 1456 WATR 306 HOH HT 1 4.17000000e-01 1.00800 0 + 1457 WATR 306 HOH HT 1 4.17000000e-01 1.00800 0 + 1458 WATR 307 HOH OT 70 -8.34000000e-01 15.9994 0 + 1459 WATR 307 HOH HT 1 4.17000000e-01 1.00800 0 + 1460 WATR 307 HOH HT 1 4.17000000e-01 1.00800 0 + 1461 WATR 308 HOH OT 70 -8.34000000e-01 15.9994 0 + 1462 WATR 308 HOH HT 1 4.17000000e-01 1.00800 0 + 1463 WATR 308 HOH HT 1 4.17000000e-01 1.00800 0 + 1464 WATR 309 HOH OT 70 -8.34000000e-01 15.9994 0 + 1465 WATR 309 HOH HT 1 4.17000000e-01 1.00800 0 + 1466 WATR 309 HOH HT 1 4.17000000e-01 1.00800 0 + 1467 WATR 310 HOH OT 70 -8.34000000e-01 15.9994 0 + 1468 WATR 310 HOH HT 1 4.17000000e-01 1.00800 0 + 1469 WATR 310 HOH HT 1 4.17000000e-01 1.00800 0 + 1470 WATR 311 HOH OT 70 -8.34000000e-01 15.9994 0 + 1471 WATR 311 HOH HT 1 4.17000000e-01 1.00800 0 + 1472 WATR 311 HOH HT 1 4.17000000e-01 1.00800 0 + 1473 WATR 312 HOH OT 70 -8.34000000e-01 15.9994 0 + 1474 WATR 312 HOH HT 1 4.17000000e-01 1.00800 0 + 1475 WATR 312 HOH HT 1 4.17000000e-01 1.00800 0 + 1476 WATR 313 HOH OT 70 -8.34000000e-01 15.9994 0 + 1477 WATR 313 HOH HT 1 4.17000000e-01 1.00800 0 + 1478 WATR 313 HOH HT 1 4.17000000e-01 1.00800 0 + 1479 WATR 314 HOH OT 70 -8.34000000e-01 15.9994 0 + 1480 WATR 314 HOH HT 1 4.17000000e-01 1.00800 0 + 1481 WATR 314 HOH HT 1 4.17000000e-01 1.00800 0 + 1482 WATR 315 HOH OT 70 -8.34000000e-01 15.9994 0 + 1483 WATR 315 HOH HT 1 4.17000000e-01 1.00800 0 + 1484 WATR 315 HOH HT 1 4.17000000e-01 1.00800 0 + 1485 WATR 316 HOH OT 70 -8.34000000e-01 15.9994 0 + 1486 WATR 316 HOH HT 1 4.17000000e-01 1.00800 0 + 1487 WATR 316 HOH HT 1 4.17000000e-01 1.00800 0 + 1488 WATR 317 HOH OT 70 -8.34000000e-01 15.9994 0 + 1489 WATR 317 HOH HT 1 4.17000000e-01 1.00800 0 + 1490 WATR 317 HOH HT 1 4.17000000e-01 1.00800 0 + 1491 WATR 318 HOH OT 70 -8.34000000e-01 15.9994 0 + 1492 WATR 318 HOH HT 1 4.17000000e-01 1.00800 0 + 1493 WATR 318 HOH HT 1 4.17000000e-01 1.00800 0 + 1494 WATR 319 HOH OT 70 -8.34000000e-01 15.9994 0 + 1495 WATR 319 HOH HT 1 4.17000000e-01 1.00800 0 + 1496 WATR 319 HOH HT 1 4.17000000e-01 1.00800 0 + 1497 WATR 320 HOH OT 70 -8.34000000e-01 15.9994 0 + 1498 WATR 320 HOH HT 1 4.17000000e-01 1.00800 0 + 1499 WATR 320 HOH HT 1 4.17000000e-01 1.00800 0 + 1500 WATR 321 HOH OT 70 -8.34000000e-01 15.9994 0 + 1501 WATR 321 HOH HT 1 4.17000000e-01 1.00800 0 + 1502 WATR 321 HOH HT 1 4.17000000e-01 1.00800 0 + 1503 WATR 322 HOH OT 70 -8.34000000e-01 15.9994 0 + 1504 WATR 322 HOH HT 1 4.17000000e-01 1.00800 0 + 1505 WATR 322 HOH HT 1 4.17000000e-01 1.00800 0 + 1506 WATR 323 HOH OT 70 -8.34000000e-01 15.9994 0 + 1507 WATR 323 HOH HT 1 4.17000000e-01 1.00800 0 + 1508 WATR 323 HOH HT 1 4.17000000e-01 1.00800 0 + 1509 WATR 324 HOH OT 70 -8.34000000e-01 15.9994 0 + 1510 WATR 324 HOH HT 1 4.17000000e-01 1.00800 0 + 1511 WATR 324 HOH HT 1 4.17000000e-01 1.00800 0 + 1512 WATR 325 HOH OT 70 -8.34000000e-01 15.9994 0 + 1513 WATR 325 HOH HT 1 4.17000000e-01 1.00800 0 + 1514 WATR 325 HOH HT 1 4.17000000e-01 1.00800 0 + 1515 WATR 326 HOH OT 70 -8.34000000e-01 15.9994 0 + 1516 WATR 326 HOH HT 1 4.17000000e-01 1.00800 0 + 1517 WATR 326 HOH HT 1 4.17000000e-01 1.00800 0 + 1518 WATR 327 HOH OT 70 -8.34000000e-01 15.9994 0 + 1519 WATR 327 HOH HT 1 4.17000000e-01 1.00800 0 + 1520 WATR 327 HOH HT 1 4.17000000e-01 1.00800 0 + 1521 WATR 328 HOH OT 70 -8.34000000e-01 15.9994 0 + 1522 WATR 328 HOH HT 1 4.17000000e-01 1.00800 0 + 1523 WATR 328 HOH HT 1 4.17000000e-01 1.00800 0 + 1524 WATR 329 HOH OT 70 -8.34000000e-01 15.9994 0 + 1525 WATR 329 HOH HT 1 4.17000000e-01 1.00800 0 + 1526 WATR 329 HOH HT 1 4.17000000e-01 1.00800 0 + 1527 WATR 330 HOH OT 70 -8.34000000e-01 15.9994 0 + 1528 WATR 330 HOH HT 1 4.17000000e-01 1.00800 0 + 1529 WATR 330 HOH HT 1 4.17000000e-01 1.00800 0 + 1530 WATR 331 HOH OT 70 -8.34000000e-01 15.9994 0 + 1531 WATR 331 HOH HT 1 4.17000000e-01 1.00800 0 + 1532 WATR 331 HOH HT 1 4.17000000e-01 1.00800 0 + 1533 WATR 332 HOH OT 70 -8.34000000e-01 15.9994 0 + 1534 WATR 332 HOH HT 1 4.17000000e-01 1.00800 0 + 1535 WATR 332 HOH HT 1 4.17000000e-01 1.00800 0 + 1536 WATR 333 HOH OT 70 -8.34000000e-01 15.9994 0 + 1537 WATR 333 HOH HT 1 4.17000000e-01 1.00800 0 + 1538 WATR 333 HOH HT 1 4.17000000e-01 1.00800 0 + 1539 WATR 334 HOH OT 70 -8.34000000e-01 15.9994 0 + 1540 WATR 334 HOH HT 1 4.17000000e-01 1.00800 0 + 1541 WATR 334 HOH HT 1 4.17000000e-01 1.00800 0 + 1542 WATR 335 HOH OT 70 -8.34000000e-01 15.9994 0 + 1543 WATR 335 HOH HT 1 4.17000000e-01 1.00800 0 + 1544 WATR 335 HOH HT 1 4.17000000e-01 1.00800 0 + 1545 WATR 336 HOH OT 70 -8.34000000e-01 15.9994 0 + 1546 WATR 336 HOH HT 1 4.17000000e-01 1.00800 0 + 1547 WATR 336 HOH HT 1 4.17000000e-01 1.00800 0 + 1548 WATR 337 HOH OT 70 -8.34000000e-01 15.9994 0 + 1549 WATR 337 HOH HT 1 4.17000000e-01 1.00800 0 + 1550 WATR 337 HOH HT 1 4.17000000e-01 1.00800 0 + 1551 WATR 338 HOH OT 70 -8.34000000e-01 15.9994 0 + 1552 WATR 338 HOH HT 1 4.17000000e-01 1.00800 0 + 1553 WATR 338 HOH HT 1 4.17000000e-01 1.00800 0 + 1554 WATR 339 HOH OT 70 -8.34000000e-01 15.9994 0 + 1555 WATR 339 HOH HT 1 4.17000000e-01 1.00800 0 + 1556 WATR 339 HOH HT 1 4.17000000e-01 1.00800 0 + 1557 WATR 340 HOH OT 70 -8.34000000e-01 15.9994 0 + 1558 WATR 340 HOH HT 1 4.17000000e-01 1.00800 0 + 1559 WATR 340 HOH HT 1 4.17000000e-01 1.00800 0 + 1560 WATR 341 HOH OT 70 -8.34000000e-01 15.9994 0 + 1561 WATR 341 HOH HT 1 4.17000000e-01 1.00800 0 + 1562 WATR 341 HOH HT 1 4.17000000e-01 1.00800 0 + 1563 WATR 342 HOH OT 70 -8.34000000e-01 15.9994 0 + 1564 WATR 342 HOH HT 1 4.17000000e-01 1.00800 0 + 1565 WATR 342 HOH HT 1 4.17000000e-01 1.00800 0 + 1566 WATR 343 HOH OT 70 -8.34000000e-01 15.9994 0 + 1567 WATR 343 HOH HT 1 4.17000000e-01 1.00800 0 + 1568 WATR 343 HOH HT 1 4.17000000e-01 1.00800 0 + 1569 WATR 344 HOH OT 70 -8.34000000e-01 15.9994 0 + 1570 WATR 344 HOH HT 1 4.17000000e-01 1.00800 0 + 1571 WATR 344 HOH HT 1 4.17000000e-01 1.00800 0 + 1572 WATR 345 HOH OT 70 -8.34000000e-01 15.9994 0 + 1573 WATR 345 HOH HT 1 4.17000000e-01 1.00800 0 + 1574 WATR 345 HOH HT 1 4.17000000e-01 1.00800 0 + 1575 WATR 346 HOH OT 70 -8.34000000e-01 15.9994 0 1576 WATR 346 HOH HT 1 4.17000000e-01 1.00800 0 - 1577 WATR 347 HOH OT 70 -8.34000000e-01 15.9994 0 - 1578 WATR 347 HOH HT 1 4.17000000e-01 1.00800 0 + 1577 WATR 346 HOH HT 1 4.17000000e-01 1.00800 0 + 1578 WATR 347 HOH OT 70 -8.34000000e-01 15.9994 0 1579 WATR 347 HOH HT 1 4.17000000e-01 1.00800 0 - 1580 WATR 348 HOH OT 70 -8.34000000e-01 15.9994 0 - 1581 WATR 348 HOH HT 1 4.17000000e-01 1.00800 0 + 1580 WATR 347 HOH HT 1 4.17000000e-01 1.00800 0 + 1581 WATR 348 HOH OT 70 -8.34000000e-01 15.9994 0 1582 WATR 348 HOH HT 1 4.17000000e-01 1.00800 0 - 1583 WATR 349 HOH OT 70 -8.34000000e-01 15.9994 0 - 1584 WATR 349 HOH HT 1 4.17000000e-01 1.00800 0 + 1583 WATR 348 HOH HT 1 4.17000000e-01 1.00800 0 + 1584 WATR 349 HOH OT 70 -8.34000000e-01 15.9994 0 1585 WATR 349 HOH HT 1 4.17000000e-01 1.00800 0 - 1586 SALT 12 ION SOD 90 1.00000000e+00 22.9897 0 + 1586 WATR 349 HOH HT 1 4.17000000e-01 1.00800 0 1587 WATR 350 HOH OT 70 -8.34000000e-01 15.9994 0 1588 WATR 350 HOH HT 1 4.17000000e-01 1.00800 0 1589 WATR 350 HOH HT 1 4.17000000e-01 1.00800 0 @@ -1654,79 +1654,79 @@ PSF 1647 WATR 370 HOH OT 70 -8.34000000e-01 15.9994 0 1648 WATR 370 HOH HT 1 4.17000000e-01 1.00800 0 1649 WATR 370 HOH HT 1 4.17000000e-01 1.00800 0 - 1650 SALT 13 ION SOD 90 1.00000000e+00 22.9897 0 - 1651 WATR 371 HOH OT 70 -8.34000000e-01 15.9994 0 + 1650 WATR 371 HOH OT 70 -8.34000000e-01 15.9994 0 + 1651 WATR 371 HOH HT 1 4.17000000e-01 1.00800 0 1652 WATR 371 HOH HT 1 4.17000000e-01 1.00800 0 - 1653 WATR 371 HOH HT 1 4.17000000e-01 1.00800 0 - 1654 WATR 372 HOH OT 70 -8.34000000e-01 15.9994 0 + 1653 WATR 372 HOH OT 70 -8.34000000e-01 15.9994 0 + 1654 WATR 372 HOH HT 1 4.17000000e-01 1.00800 0 1655 WATR 372 HOH HT 1 4.17000000e-01 1.00800 0 - 1656 WATR 372 HOH HT 1 4.17000000e-01 1.00800 0 - 1657 WATR 373 HOH OT 70 -8.34000000e-01 15.9994 0 + 1656 WATR 373 HOH OT 70 -8.34000000e-01 15.9994 0 + 1657 WATR 373 HOH HT 1 4.17000000e-01 1.00800 0 1658 WATR 373 HOH HT 1 4.17000000e-01 1.00800 0 - 1659 WATR 373 HOH HT 1 4.17000000e-01 1.00800 0 - 1660 WATR 374 HOH OT 70 -8.34000000e-01 15.9994 0 + 1659 WATR 374 HOH OT 70 -8.34000000e-01 15.9994 0 + 1660 WATR 374 HOH HT 1 4.17000000e-01 1.00800 0 1661 WATR 374 HOH HT 1 4.17000000e-01 1.00800 0 - 1662 WATR 374 HOH HT 1 4.17000000e-01 1.00800 0 - 1663 WATR 375 HOH OT 70 -8.34000000e-01 15.9994 0 + 1662 WATR 375 HOH OT 70 -8.34000000e-01 15.9994 0 + 1663 WATR 375 HOH HT 1 4.17000000e-01 1.00800 0 1664 WATR 375 HOH HT 1 4.17000000e-01 1.00800 0 - 1665 WATR 375 HOH HT 1 4.17000000e-01 1.00800 0 - 1666 WATR 376 HOH OT 70 -8.34000000e-01 15.9994 0 + 1665 WATR 376 HOH OT 70 -8.34000000e-01 15.9994 0 + 1666 WATR 376 HOH HT 1 4.17000000e-01 1.00800 0 1667 WATR 376 HOH HT 1 4.17000000e-01 1.00800 0 - 1668 WATR 376 HOH HT 1 4.17000000e-01 1.00800 0 - 1669 WATR 377 HOH OT 70 -8.34000000e-01 15.9994 0 + 1668 WATR 377 HOH OT 70 -8.34000000e-01 15.9994 0 + 1669 WATR 377 HOH HT 1 4.17000000e-01 1.00800 0 1670 WATR 377 HOH HT 1 4.17000000e-01 1.00800 0 - 1671 WATR 377 HOH HT 1 4.17000000e-01 1.00800 0 - 1672 WATR 378 HOH OT 70 -8.34000000e-01 15.9994 0 + 1671 WATR 378 HOH OT 70 -8.34000000e-01 15.9994 0 + 1672 WATR 378 HOH HT 1 4.17000000e-01 1.00800 0 1673 WATR 378 HOH HT 1 4.17000000e-01 1.00800 0 - 1674 WATR 378 HOH HT 1 4.17000000e-01 1.00800 0 - 1675 WATR 379 HOH OT 70 -8.34000000e-01 15.9994 0 + 1674 WATR 379 HOH OT 70 -8.34000000e-01 15.9994 0 + 1675 WATR 379 HOH HT 1 4.17000000e-01 1.00800 0 1676 WATR 379 HOH HT 1 4.17000000e-01 1.00800 0 - 1677 WATR 379 HOH HT 1 4.17000000e-01 1.00800 0 - 1678 WATR 380 HOH OT 70 -8.34000000e-01 15.9994 0 + 1677 WATR 380 HOH OT 70 -8.34000000e-01 15.9994 0 + 1678 WATR 380 HOH HT 1 4.17000000e-01 1.00800 0 1679 WATR 380 HOH HT 1 4.17000000e-01 1.00800 0 - 1680 WATR 380 HOH HT 1 4.17000000e-01 1.00800 0 - 1681 WATR 381 HOH OT 70 -8.34000000e-01 15.9994 0 + 1680 WATR 381 HOH OT 70 -8.34000000e-01 15.9994 0 + 1681 WATR 381 HOH HT 1 4.17000000e-01 1.00800 0 1682 WATR 381 HOH HT 1 4.17000000e-01 1.00800 0 - 1683 WATR 381 HOH HT 1 4.17000000e-01 1.00800 0 - 1684 WATR 382 HOH OT 70 -8.34000000e-01 15.9994 0 + 1683 WATR 382 HOH OT 70 -8.34000000e-01 15.9994 0 + 1684 WATR 382 HOH HT 1 4.17000000e-01 1.00800 0 1685 WATR 382 HOH HT 1 4.17000000e-01 1.00800 0 - 1686 WATR 382 HOH HT 1 4.17000000e-01 1.00800 0 - 1687 WATR 383 HOH OT 70 -8.34000000e-01 15.9994 0 + 1686 WATR 383 HOH OT 70 -8.34000000e-01 15.9994 0 + 1687 WATR 383 HOH HT 1 4.17000000e-01 1.00800 0 1688 WATR 383 HOH HT 1 4.17000000e-01 1.00800 0 - 1689 WATR 383 HOH HT 1 4.17000000e-01 1.00800 0 - 1690 WATR 384 HOH OT 70 -8.34000000e-01 15.9994 0 + 1689 WATR 384 HOH OT 70 -8.34000000e-01 15.9994 0 + 1690 WATR 384 HOH HT 1 4.17000000e-01 1.00800 0 1691 WATR 384 HOH HT 1 4.17000000e-01 1.00800 0 - 1692 WATR 384 HOH HT 1 4.17000000e-01 1.00800 0 - 1693 WATR 385 HOH OT 70 -8.34000000e-01 15.9994 0 + 1692 WATR 385 HOH OT 70 -8.34000000e-01 15.9994 0 + 1693 WATR 385 HOH HT 1 4.17000000e-01 1.00800 0 1694 WATR 385 HOH HT 1 4.17000000e-01 1.00800 0 - 1695 WATR 385 HOH HT 1 4.17000000e-01 1.00800 0 - 1696 WATR 386 HOH OT 70 -8.34000000e-01 15.9994 0 + 1695 WATR 386 HOH OT 70 -8.34000000e-01 15.9994 0 + 1696 WATR 386 HOH HT 1 4.17000000e-01 1.00800 0 1697 WATR 386 HOH HT 1 4.17000000e-01 1.00800 0 - 1698 WATR 386 HOH HT 1 4.17000000e-01 1.00800 0 - 1699 WATR 387 HOH OT 70 -8.34000000e-01 15.9994 0 + 1698 WATR 387 HOH OT 70 -8.34000000e-01 15.9994 0 + 1699 WATR 387 HOH HT 1 4.17000000e-01 1.00800 0 1700 WATR 387 HOH HT 1 4.17000000e-01 1.00800 0 - 1701 WATR 387 HOH HT 1 4.17000000e-01 1.00800 0 - 1702 WATR 388 HOH OT 70 -8.34000000e-01 15.9994 0 + 1701 WATR 388 HOH OT 70 -8.34000000e-01 15.9994 0 + 1702 WATR 388 HOH HT 1 4.17000000e-01 1.00800 0 1703 WATR 388 HOH HT 1 4.17000000e-01 1.00800 0 - 1704 WATR 388 HOH HT 1 4.17000000e-01 1.00800 0 - 1705 WATR 389 HOH OT 70 -8.34000000e-01 15.9994 0 + 1704 WATR 389 HOH OT 70 -8.34000000e-01 15.9994 0 + 1705 WATR 389 HOH HT 1 4.17000000e-01 1.00800 0 1706 WATR 389 HOH HT 1 4.17000000e-01 1.00800 0 - 1707 WATR 389 HOH HT 1 4.17000000e-01 1.00800 0 - 1708 WATR 390 HOH OT 70 -8.34000000e-01 15.9994 0 + 1707 WATR 390 HOH OT 70 -8.34000000e-01 15.9994 0 + 1708 WATR 390 HOH HT 1 4.17000000e-01 1.00800 0 1709 WATR 390 HOH HT 1 4.17000000e-01 1.00800 0 - 1710 WATR 390 HOH HT 1 4.17000000e-01 1.00800 0 - 1711 WATR 391 HOH OT 70 -8.34000000e-01 15.9994 0 + 1710 WATR 391 HOH OT 70 -8.34000000e-01 15.9994 0 + 1711 WATR 391 HOH HT 1 4.17000000e-01 1.00800 0 1712 WATR 391 HOH HT 1 4.17000000e-01 1.00800 0 - 1713 WATR 391 HOH HT 1 4.17000000e-01 1.00800 0 - 1714 WATR 392 HOH OT 70 -8.34000000e-01 15.9994 0 + 1713 WATR 392 HOH OT 70 -8.34000000e-01 15.9994 0 + 1714 WATR 392 HOH HT 1 4.17000000e-01 1.00800 0 1715 WATR 392 HOH HT 1 4.17000000e-01 1.00800 0 - 1716 WATR 392 HOH HT 1 4.17000000e-01 1.00800 0 - 1717 WATR 393 HOH OT 70 -8.34000000e-01 15.9994 0 + 1716 WATR 393 HOH OT 70 -8.34000000e-01 15.9994 0 + 1717 WATR 393 HOH HT 1 4.17000000e-01 1.00800 0 1718 WATR 393 HOH HT 1 4.17000000e-01 1.00800 0 - 1719 WATR 393 HOH HT 1 4.17000000e-01 1.00800 0 - 1720 WATR 394 HOH OT 70 -8.34000000e-01 15.9994 0 + 1719 WATR 394 HOH OT 70 -8.34000000e-01 15.9994 0 + 1720 WATR 394 HOH HT 1 4.17000000e-01 1.00800 0 1721 WATR 394 HOH HT 1 4.17000000e-01 1.00800 0 - 1722 WATR 394 HOH HT 1 4.17000000e-01 1.00800 0 + 1722 SALT 13 ION SOD 90 1.00000000e+00 22.9897 0 1723 WATR 395 HOH OT 70 -8.34000000e-01 15.9994 0 1724 WATR 395 HOH HT 1 4.17000000e-01 1.00800 0 1725 WATR 395 HOH HT 1 4.17000000e-01 1.00800 0 @@ -1892,62 +1892,62 @@ PSF 1885 WATR 449 HOH OT 70 -8.34000000e-01 15.9994 0 1886 WATR 449 HOH HT 1 4.17000000e-01 1.00800 0 1887 WATR 449 HOH HT 1 4.17000000e-01 1.00800 0 - 1888 WATR 450 HOH OT 70 -8.34000000e-01 15.9994 0 - 1889 WATR 450 HOH HT 1 4.17000000e-01 1.00800 0 + 1888 SALT 14 ION SOD 90 1.00000000e+00 22.9897 0 + 1889 WATR 450 HOH OT 70 -8.34000000e-01 15.9994 0 1890 WATR 450 HOH HT 1 4.17000000e-01 1.00800 0 - 1891 WATR 451 HOH OT 70 -8.34000000e-01 15.9994 0 - 1892 WATR 451 HOH HT 1 4.17000000e-01 1.00800 0 + 1891 WATR 450 HOH HT 1 4.17000000e-01 1.00800 0 + 1892 WATR 451 HOH OT 70 -8.34000000e-01 15.9994 0 1893 WATR 451 HOH HT 1 4.17000000e-01 1.00800 0 - 1894 WATR 452 HOH OT 70 -8.34000000e-01 15.9994 0 - 1895 WATR 452 HOH HT 1 4.17000000e-01 1.00800 0 - 1896 WATR 452 HOH HT 1 4.17000000e-01 1.00800 0 - 1897 WATR 453 HOH OT 70 -8.34000000e-01 15.9994 0 - 1898 WATR 453 HOH HT 1 4.17000000e-01 1.00800 0 - 1899 WATR 453 HOH HT 1 4.17000000e-01 1.00800 0 - 1900 WATR 454 HOH OT 70 -8.34000000e-01 15.9994 0 - 1901 WATR 454 HOH HT 1 4.17000000e-01 1.00800 0 - 1902 WATR 454 HOH HT 1 4.17000000e-01 1.00800 0 - 1903 WATR 455 HOH OT 70 -8.34000000e-01 15.9994 0 - 1904 WATR 455 HOH HT 1 4.17000000e-01 1.00800 0 - 1905 WATR 455 HOH HT 1 4.17000000e-01 1.00800 0 - 1906 WATR 456 HOH OT 70 -8.34000000e-01 15.9994 0 - 1907 WATR 456 HOH HT 1 4.17000000e-01 1.00800 0 - 1908 WATR 456 HOH HT 1 4.17000000e-01 1.00800 0 - 1909 WATR 457 HOH OT 70 -8.34000000e-01 15.9994 0 - 1910 WATR 457 HOH HT 1 4.17000000e-01 1.00800 0 - 1911 WATR 457 HOH HT 1 4.17000000e-01 1.00800 0 - 1912 SALT 14 ION SOD 90 1.00000000e+00 22.9897 0 - 1913 WATR 458 HOH OT 70 -8.34000000e-01 15.9994 0 - 1914 WATR 458 HOH HT 1 4.17000000e-01 1.00800 0 + 1894 WATR 451 HOH HT 1 4.17000000e-01 1.00800 0 + 1895 SALT 15 ION SOD 90 1.00000000e+00 22.9897 0 + 1896 WATR 452 HOH OT 70 -8.34000000e-01 15.9994 0 + 1897 WATR 452 HOH HT 1 4.17000000e-01 1.00800 0 + 1898 WATR 452 HOH HT 1 4.17000000e-01 1.00800 0 + 1899 WATR 453 HOH OT 70 -8.34000000e-01 15.9994 0 + 1900 WATR 453 HOH HT 1 4.17000000e-01 1.00800 0 + 1901 WATR 453 HOH HT 1 4.17000000e-01 1.00800 0 + 1902 WATR 454 HOH OT 70 -8.34000000e-01 15.9994 0 + 1903 WATR 454 HOH HT 1 4.17000000e-01 1.00800 0 + 1904 WATR 454 HOH HT 1 4.17000000e-01 1.00800 0 + 1905 WATR 455 HOH OT 70 -8.34000000e-01 15.9994 0 + 1906 WATR 455 HOH HT 1 4.17000000e-01 1.00800 0 + 1907 WATR 455 HOH HT 1 4.17000000e-01 1.00800 0 + 1908 WATR 456 HOH OT 70 -8.34000000e-01 15.9994 0 + 1909 WATR 456 HOH HT 1 4.17000000e-01 1.00800 0 + 1910 WATR 456 HOH HT 1 4.17000000e-01 1.00800 0 + 1911 WATR 457 HOH OT 70 -8.34000000e-01 15.9994 0 + 1912 WATR 457 HOH HT 1 4.17000000e-01 1.00800 0 + 1913 WATR 457 HOH HT 1 4.17000000e-01 1.00800 0 + 1914 WATR 458 HOH OT 70 -8.34000000e-01 15.9994 0 1915 WATR 458 HOH HT 1 4.17000000e-01 1.00800 0 - 1916 WATR 459 HOH OT 70 -8.34000000e-01 15.9994 0 - 1917 WATR 459 HOH HT 1 4.17000000e-01 1.00800 0 + 1916 WATR 458 HOH HT 1 4.17000000e-01 1.00800 0 + 1917 WATR 459 HOH OT 70 -8.34000000e-01 15.9994 0 1918 WATR 459 HOH HT 1 4.17000000e-01 1.00800 0 - 1919 WATR 460 HOH OT 70 -8.34000000e-01 15.9994 0 - 1920 WATR 460 HOH HT 1 4.17000000e-01 1.00800 0 + 1919 WATR 459 HOH HT 1 4.17000000e-01 1.00800 0 + 1920 WATR 460 HOH OT 70 -8.34000000e-01 15.9994 0 1921 WATR 460 HOH HT 1 4.17000000e-01 1.00800 0 - 1922 WATR 461 HOH OT 70 -8.34000000e-01 15.9994 0 - 1923 WATR 461 HOH HT 1 4.17000000e-01 1.00800 0 + 1922 WATR 460 HOH HT 1 4.17000000e-01 1.00800 0 + 1923 WATR 461 HOH OT 70 -8.34000000e-01 15.9994 0 1924 WATR 461 HOH HT 1 4.17000000e-01 1.00800 0 - 1925 WATR 462 HOH OT 70 -8.34000000e-01 15.9994 0 - 1926 WATR 462 HOH HT 1 4.17000000e-01 1.00800 0 + 1925 WATR 461 HOH HT 1 4.17000000e-01 1.00800 0 + 1926 WATR 462 HOH OT 70 -8.34000000e-01 15.9994 0 1927 WATR 462 HOH HT 1 4.17000000e-01 1.00800 0 - 1928 WATR 463 HOH OT 70 -8.34000000e-01 15.9994 0 - 1929 WATR 463 HOH HT 1 4.17000000e-01 1.00800 0 + 1928 WATR 462 HOH HT 1 4.17000000e-01 1.00800 0 + 1929 WATR 463 HOH OT 70 -8.34000000e-01 15.9994 0 1930 WATR 463 HOH HT 1 4.17000000e-01 1.00800 0 - 1931 WATR 464 HOH OT 70 -8.34000000e-01 15.9994 0 - 1932 WATR 464 HOH HT 1 4.17000000e-01 1.00800 0 + 1931 WATR 463 HOH HT 1 4.17000000e-01 1.00800 0 + 1932 WATR 464 HOH OT 70 -8.34000000e-01 15.9994 0 1933 WATR 464 HOH HT 1 4.17000000e-01 1.00800 0 - 1934 WATR 465 HOH OT 70 -8.34000000e-01 15.9994 0 - 1935 WATR 465 HOH HT 1 4.17000000e-01 1.00800 0 + 1934 WATR 464 HOH HT 1 4.17000000e-01 1.00800 0 + 1935 WATR 465 HOH OT 70 -8.34000000e-01 15.9994 0 1936 WATR 465 HOH HT 1 4.17000000e-01 1.00800 0 - 1937 WATR 466 HOH OT 70 -8.34000000e-01 15.9994 0 - 1938 WATR 466 HOH HT 1 4.17000000e-01 1.00800 0 + 1937 WATR 465 HOH HT 1 4.17000000e-01 1.00800 0 + 1938 WATR 466 HOH OT 70 -8.34000000e-01 15.9994 0 1939 WATR 466 HOH HT 1 4.17000000e-01 1.00800 0 - 1940 WATR 467 HOH OT 70 -8.34000000e-01 15.9994 0 - 1941 WATR 467 HOH HT 1 4.17000000e-01 1.00800 0 + 1940 WATR 466 HOH HT 1 4.17000000e-01 1.00800 0 + 1941 WATR 467 HOH OT 70 -8.34000000e-01 15.9994 0 1942 WATR 467 HOH HT 1 4.17000000e-01 1.00800 0 - 1943 SALT 15 ION SOD 90 1.00000000e+00 22.9897 0 + 1943 WATR 467 HOH HT 1 4.17000000e-01 1.00800 0 1944 WATR 468 HOH OT 70 -8.34000000e-01 15.9994 0 1945 WATR 468 HOH HT 1 4.17000000e-01 1.00800 0 1946 WATR 468 HOH HT 1 4.17000000e-01 1.00800 0 @@ -1960,13 +1960,13 @@ PSF 1953 WATR 471 HOH OT 70 -8.34000000e-01 15.9994 0 1954 WATR 471 HOH HT 1 4.17000000e-01 1.00800 0 1955 WATR 471 HOH HT 1 4.17000000e-01 1.00800 0 - 1956 SALT 16 ION SOD 90 1.00000000e+00 22.9897 0 - 1957 WATR 472 HOH OT 70 -8.34000000e-01 15.9994 0 + 1956 WATR 472 HOH OT 70 -8.34000000e-01 15.9994 0 + 1957 WATR 472 HOH HT 1 4.17000000e-01 1.00800 0 1958 WATR 472 HOH HT 1 4.17000000e-01 1.00800 0 - 1959 WATR 472 HOH HT 1 4.17000000e-01 1.00800 0 - 1960 WATR 473 HOH OT 70 -8.34000000e-01 15.9994 0 + 1959 WATR 473 HOH OT 70 -8.34000000e-01 15.9994 0 + 1960 WATR 473 HOH HT 1 4.17000000e-01 1.00800 0 1961 WATR 473 HOH HT 1 4.17000000e-01 1.00800 0 - 1962 WATR 473 HOH HT 1 4.17000000e-01 1.00800 0 + 1962 SALT 16 ION SOD 90 1.00000000e+00 22.9897 0 1963 WATR 474 HOH OT 70 -8.34000000e-01 15.9994 0 1964 WATR 474 HOH HT 1 4.17000000e-01 1.00800 0 1965 WATR 474 HOH HT 1 4.17000000e-01 1.00800 0 @@ -2127,23 +2127,23 @@ PSF 573 574 573 575 576 577 576 578 579 580 579 581 582 583 582 584 585 586 585 587 588 589 588 590 - 592 593 592 594 595 596 595 597 - 598 599 598 600 601 602 601 603 - 604 605 604 606 607 608 607 609 - 610 611 610 612 613 614 613 615 - 616 617 616 618 619 620 619 621 - 622 623 622 624 625 626 625 627 - 628 629 628 630 631 632 631 633 - 634 635 634 636 637 638 637 639 - 640 641 640 642 643 644 643 645 - 646 647 646 648 649 650 649 651 - 652 653 652 654 655 656 655 657 - 658 659 658 660 661 662 661 663 - 664 665 664 666 667 668 667 669 - 670 671 670 672 673 674 673 675 - 676 677 676 678 679 680 679 681 - 682 683 682 684 685 686 685 687 - 688 689 688 690 691 692 691 693 + 591 592 591 593 594 595 594 596 + 597 598 597 599 600 601 600 602 + 603 604 603 605 606 607 606 608 + 609 610 609 611 612 613 612 614 + 615 616 615 617 618 619 618 620 + 621 622 621 623 624 625 624 626 + 627 628 627 629 630 631 630 632 + 633 634 633 635 636 637 636 638 + 639 640 639 641 642 643 642 644 + 645 646 645 647 648 649 648 650 + 651 652 651 653 654 655 654 656 + 657 658 657 659 660 661 660 662 + 663 664 663 665 666 667 666 668 + 669 670 669 671 672 673 672 674 + 675 676 675 677 678 679 678 680 + 681 682 681 683 684 685 684 686 + 687 688 687 689 690 691 690 692 694 695 694 696 697 698 697 699 700 701 700 702 703 704 703 705 706 707 706 708 709 710 709 711 @@ -2164,35 +2164,35 @@ PSF 796 797 796 798 799 800 799 801 802 803 802 804 805 806 805 807 808 809 808 810 811 812 811 813 - 814 815 814 816 817 818 817 819 - 820 821 820 822 823 824 823 825 - 826 827 826 828 829 830 829 831 - 832 833 832 834 835 836 835 837 - 838 839 838 840 841 842 841 843 - 844 845 844 846 848 849 848 850 + 815 816 815 817 818 819 818 820 + 821 822 821 823 824 825 824 826 + 827 828 827 829 830 831 830 832 + 833 834 833 835 836 837 836 838 + 839 840 839 841 842 843 842 844 + 845 846 845 847 848 849 848 850 851 852 851 853 854 855 854 856 - 857 858 857 859 861 862 861 863 + 857 858 857 859 860 861 860 862 864 865 864 866 867 868 867 869 870 871 870 872 873 874 873 875 876 877 876 878 879 880 879 881 882 883 882 884 885 886 885 887 888 889 888 890 891 892 891 893 894 895 894 896 897 898 897 899 - 900 901 900 902 904 905 904 906 - 907 908 907 909 910 911 910 912 - 913 914 913 915 916 917 916 918 - 919 920 919 921 922 923 922 924 - 925 926 925 927 928 929 928 930 - 931 932 931 933 934 935 934 936 - 937 938 937 939 940 941 940 942 - 943 944 943 945 946 947 946 948 - 949 950 949 951 952 953 952 954 - 955 956 955 957 959 960 959 961 - 962 963 962 964 965 966 965 967 - 968 969 968 970 971 972 971 973 - 974 975 974 976 977 978 977 979 - 980 981 980 982 983 984 983 985 - 986 987 986 988 989 990 989 991 + 900 901 900 902 903 904 903 905 + 906 907 906 908 909 910 909 911 + 912 913 912 914 915 916 915 917 + 918 919 918 920 921 922 921 923 + 924 925 924 926 927 928 927 929 + 930 931 930 932 933 934 933 935 + 936 937 936 938 939 940 939 941 + 942 943 942 944 945 946 945 947 + 948 949 948 950 951 952 951 953 + 954 955 954 956 957 958 957 959 + 960 961 960 962 963 964 963 965 + 966 967 966 968 969 970 969 971 + 972 973 972 974 975 976 975 977 + 978 979 978 980 981 982 981 983 + 985 986 985 987 988 989 988 990 992 993 992 994 995 996 995 997 998 999 998 1000 1001 1002 1001 1003 1004 1005 1004 1006 1007 1008 1007 1009 @@ -2200,97 +2200,97 @@ PSF 1016 1017 1016 1018 1019 1020 1019 1021 1022 1023 1022 1024 1025 1026 1025 1027 1028 1029 1028 1030 1031 1032 1031 1033 - 1034 1035 1034 1036 1038 1039 1038 1040 - 1041 1042 1041 1043 1044 1045 1044 1046 - 1047 1048 1047 1049 1050 1051 1050 1052 - 1053 1054 1053 1055 1056 1057 1056 1058 - 1059 1060 1059 1061 1062 1063 1062 1064 - 1065 1066 1065 1067 1068 1069 1068 1070 - 1071 1072 1071 1073 1074 1075 1074 1076 - 1077 1078 1077 1079 1080 1081 1080 1082 - 1083 1084 1083 1085 1086 1087 1086 1088 - 1089 1090 1089 1091 1092 1093 1092 1094 + 1034 1035 1034 1036 1037 1038 1037 1039 + 1040 1041 1040 1042 1043 1044 1043 1045 + 1046 1047 1046 1048 1049 1050 1049 1051 + 1052 1053 1052 1054 1055 1056 1055 1057 + 1058 1059 1058 1060 1061 1062 1061 1063 + 1064 1065 1064 1066 1067 1068 1067 1069 + 1070 1071 1070 1072 1073 1074 1073 1075 + 1076 1077 1076 1078 1079 1080 1079 1081 + 1082 1083 1082 1084 1085 1086 1085 1087 + 1088 1089 1088 1090 1091 1092 1091 1093 1095 1096 1095 1097 1098 1099 1098 1100 1101 1102 1101 1103 1104 1105 1104 1106 1107 1108 1107 1109 1110 1111 1110 1112 1113 1114 1113 1115 1116 1117 1116 1118 1119 1120 1119 1121 1122 1123 1122 1124 - 1125 1126 1125 1127 1128 1129 1128 1130 - 1131 1132 1131 1133 1134 1135 1134 1136 - 1137 1138 1137 1139 1140 1141 1140 1142 - 1143 1144 1143 1145 1146 1147 1146 1148 - 1149 1150 1149 1151 1152 1153 1152 1154 - 1155 1156 1155 1157 1158 1159 1158 1160 - 1161 1162 1161 1163 1164 1165 1164 1166 - 1167 1168 1167 1169 1170 1171 1170 1172 - 1173 1174 1173 1175 1176 1177 1176 1178 - 1179 1180 1179 1181 1182 1183 1182 1184 - 1185 1186 1185 1187 1188 1189 1188 1190 - 1191 1192 1191 1193 1194 1195 1194 1196 - 1197 1198 1197 1199 1200 1201 1200 1202 - 1203 1204 1203 1205 1206 1207 1206 1208 - 1209 1210 1209 1211 1212 1213 1212 1214 - 1215 1216 1215 1217 1218 1219 1218 1220 - 1221 1222 1221 1223 1224 1225 1224 1226 - 1227 1228 1227 1229 1230 1231 1230 1232 - 1233 1234 1233 1235 1236 1237 1236 1238 - 1239 1240 1239 1241 1242 1243 1242 1244 - 1245 1246 1245 1247 1248 1249 1248 1250 - 1251 1252 1251 1253 1254 1255 1254 1256 - 1257 1258 1257 1259 1261 1262 1261 1263 - 1264 1265 1264 1266 1267 1268 1267 1269 - 1270 1271 1270 1272 1273 1274 1273 1275 - 1276 1277 1276 1278 1279 1280 1279 1281 - 1282 1283 1282 1284 1285 1286 1285 1287 - 1288 1289 1288 1290 1291 1292 1291 1293 - 1294 1295 1294 1296 1297 1298 1297 1299 - 1300 1301 1300 1302 1303 1304 1303 1305 - 1306 1307 1306 1308 1309 1310 1309 1311 - 1313 1314 1313 1315 1316 1317 1316 1318 - 1319 1320 1319 1321 1322 1323 1322 1324 - 1325 1326 1325 1327 1328 1329 1328 1330 - 1331 1332 1331 1333 1334 1335 1334 1336 - 1337 1338 1337 1339 1340 1341 1340 1342 - 1343 1344 1343 1345 1346 1347 1346 1348 - 1349 1350 1349 1351 1352 1353 1352 1354 - 1355 1356 1355 1357 1358 1359 1358 1360 - 1361 1362 1361 1363 1364 1365 1364 1366 - 1367 1368 1367 1369 1370 1371 1370 1372 - 1373 1374 1373 1375 1376 1377 1376 1378 - 1379 1380 1379 1381 1382 1383 1382 1384 - 1385 1386 1385 1387 1388 1389 1388 1390 - 1391 1392 1391 1393 1394 1395 1394 1396 - 1397 1398 1397 1399 1400 1401 1400 1402 - 1403 1404 1403 1405 1406 1407 1406 1408 - 1409 1410 1409 1411 1412 1413 1412 1414 - 1415 1416 1415 1417 1418 1419 1418 1420 - 1421 1422 1421 1423 1424 1425 1424 1426 - 1427 1428 1427 1429 1430 1431 1430 1432 - 1433 1434 1433 1435 1436 1437 1436 1438 - 1439 1440 1439 1441 1442 1443 1442 1444 - 1446 1447 1446 1448 1449 1450 1449 1451 - 1452 1453 1452 1454 1455 1456 1455 1457 - 1458 1459 1458 1460 1461 1462 1461 1463 - 1464 1465 1464 1466 1467 1468 1467 1469 - 1470 1471 1470 1472 1473 1474 1473 1475 - 1476 1477 1476 1478 1479 1480 1479 1481 - 1482 1483 1482 1484 1485 1486 1485 1487 - 1488 1489 1488 1490 1491 1492 1491 1493 - 1494 1495 1494 1496 1497 1498 1497 1499 - 1501 1502 1501 1503 1504 1505 1504 1506 - 1507 1508 1507 1509 1510 1511 1510 1512 - 1513 1514 1513 1515 1516 1517 1516 1518 - 1519 1520 1519 1521 1522 1523 1522 1524 - 1525 1526 1525 1527 1528 1529 1528 1530 - 1531 1532 1531 1533 1534 1535 1534 1536 - 1537 1538 1537 1539 1540 1541 1540 1542 - 1543 1544 1543 1545 1546 1547 1546 1548 - 1549 1550 1549 1551 1552 1553 1552 1554 - 1555 1556 1555 1557 1558 1559 1558 1560 - 1561 1562 1561 1563 1564 1565 1564 1566 - 1567 1568 1567 1569 1570 1571 1570 1572 - 1574 1575 1574 1576 1577 1578 1577 1579 - 1580 1581 1580 1582 1583 1584 1583 1585 + 1126 1127 1126 1128 1129 1130 1129 1131 + 1132 1133 1132 1134 1135 1136 1135 1137 + 1138 1139 1138 1140 1141 1142 1141 1143 + 1144 1145 1144 1146 1147 1148 1147 1149 + 1150 1151 1150 1152 1153 1154 1153 1155 + 1156 1157 1156 1158 1159 1160 1159 1161 + 1162 1163 1162 1164 1165 1166 1165 1167 + 1168 1169 1168 1170 1171 1172 1171 1173 + 1174 1175 1174 1176 1177 1178 1177 1179 + 1180 1181 1180 1182 1183 1184 1183 1185 + 1186 1187 1186 1188 1189 1190 1189 1191 + 1192 1193 1192 1194 1195 1196 1195 1197 + 1198 1199 1198 1200 1201 1202 1201 1203 + 1205 1206 1205 1207 1208 1209 1208 1210 + 1211 1212 1211 1213 1214 1215 1214 1216 + 1218 1219 1218 1220 1221 1222 1221 1223 + 1224 1225 1224 1226 1227 1228 1227 1229 + 1230 1231 1230 1232 1233 1234 1233 1235 + 1236 1237 1236 1238 1239 1240 1239 1241 + 1242 1243 1242 1244 1245 1246 1245 1247 + 1248 1249 1248 1250 1251 1252 1251 1253 + 1254 1255 1254 1256 1257 1258 1257 1259 + 1260 1261 1260 1262 1263 1264 1263 1265 + 1266 1267 1266 1268 1269 1270 1269 1271 + 1272 1273 1272 1274 1275 1276 1275 1277 + 1278 1279 1278 1280 1281 1282 1281 1283 + 1284 1285 1284 1286 1287 1288 1287 1289 + 1290 1291 1290 1292 1293 1294 1293 1295 + 1296 1297 1296 1298 1299 1300 1299 1301 + 1302 1303 1302 1304 1305 1306 1305 1307 + 1308 1309 1308 1310 1311 1312 1311 1313 + 1314 1315 1314 1316 1317 1318 1317 1319 + 1320 1321 1320 1322 1323 1324 1323 1325 + 1326 1327 1326 1328 1329 1330 1329 1331 + 1332 1333 1332 1334 1335 1336 1335 1337 + 1338 1339 1338 1340 1341 1342 1341 1343 + 1344 1345 1344 1346 1348 1349 1348 1350 + 1351 1352 1351 1353 1354 1355 1354 1356 + 1357 1358 1357 1359 1360 1361 1360 1362 + 1363 1364 1363 1365 1366 1367 1366 1368 + 1369 1370 1369 1371 1372 1373 1372 1374 + 1375 1376 1375 1377 1378 1379 1378 1380 + 1381 1382 1381 1383 1384 1385 1384 1386 + 1387 1388 1387 1389 1390 1391 1390 1392 + 1393 1394 1393 1395 1396 1397 1396 1398 + 1399 1400 1399 1401 1402 1403 1402 1404 + 1405 1406 1405 1407 1408 1409 1408 1410 + 1411 1412 1411 1413 1414 1415 1414 1416 + 1417 1418 1417 1419 1420 1421 1420 1422 + 1423 1424 1423 1425 1426 1427 1426 1428 + 1429 1430 1429 1431 1432 1433 1432 1434 + 1435 1436 1435 1437 1439 1440 1439 1441 + 1442 1443 1442 1444 1445 1446 1445 1447 + 1449 1450 1449 1451 1452 1453 1452 1454 + 1455 1456 1455 1457 1458 1459 1458 1460 + 1461 1462 1461 1463 1464 1465 1464 1466 + 1467 1468 1467 1469 1470 1471 1470 1472 + 1473 1474 1473 1475 1476 1477 1476 1478 + 1479 1480 1479 1481 1482 1483 1482 1484 + 1485 1486 1485 1487 1488 1489 1488 1490 + 1491 1492 1491 1493 1494 1495 1494 1496 + 1497 1498 1497 1499 1500 1501 1500 1502 + 1503 1504 1503 1505 1506 1507 1506 1508 + 1509 1510 1509 1511 1512 1513 1512 1514 + 1515 1516 1515 1517 1518 1519 1518 1520 + 1521 1522 1521 1523 1524 1525 1524 1526 + 1527 1528 1527 1529 1530 1531 1530 1532 + 1533 1534 1533 1535 1536 1537 1536 1538 + 1539 1540 1539 1541 1542 1543 1542 1544 + 1545 1546 1545 1547 1548 1549 1548 1550 + 1551 1552 1551 1553 1554 1555 1554 1556 + 1557 1558 1557 1559 1560 1561 1560 1562 + 1563 1564 1563 1565 1566 1567 1566 1568 + 1569 1570 1569 1571 1572 1573 1572 1574 + 1575 1576 1575 1577 1578 1579 1578 1580 + 1581 1582 1581 1583 1584 1585 1584 1586 1587 1588 1587 1589 1590 1591 1590 1592 1593 1594 1593 1595 1596 1597 1596 1598 1599 1600 1599 1601 1602 1603 1602 1604 @@ -2301,19 +2301,19 @@ PSF 1629 1630 1629 1631 1632 1633 1632 1634 1635 1636 1635 1637 1638 1639 1638 1640 1641 1642 1641 1643 1644 1645 1644 1646 - 1647 1648 1647 1649 1651 1652 1651 1653 - 1654 1655 1654 1656 1657 1658 1657 1659 - 1660 1661 1660 1662 1663 1664 1663 1665 - 1666 1667 1666 1668 1669 1670 1669 1671 - 1672 1673 1672 1674 1675 1676 1675 1677 - 1678 1679 1678 1680 1681 1682 1681 1683 - 1684 1685 1684 1686 1687 1688 1687 1689 - 1690 1691 1690 1692 1693 1694 1693 1695 - 1696 1697 1696 1698 1699 1700 1699 1701 - 1702 1703 1702 1704 1705 1706 1705 1707 - 1708 1709 1708 1710 1711 1712 1711 1713 - 1714 1715 1714 1716 1717 1718 1717 1719 - 1720 1721 1720 1722 1723 1724 1723 1725 + 1647 1648 1647 1649 1650 1651 1650 1652 + 1653 1654 1653 1655 1656 1657 1656 1658 + 1659 1660 1659 1661 1662 1663 1662 1664 + 1665 1666 1665 1667 1668 1669 1668 1670 + 1671 1672 1671 1673 1674 1675 1674 1676 + 1677 1678 1677 1679 1680 1681 1680 1682 + 1683 1684 1683 1685 1686 1687 1686 1688 + 1689 1690 1689 1691 1692 1693 1692 1694 + 1695 1696 1695 1697 1698 1699 1698 1700 + 1701 1702 1701 1703 1704 1705 1704 1706 + 1707 1708 1707 1709 1710 1711 1710 1712 + 1713 1714 1713 1715 1716 1717 1716 1718 + 1719 1720 1719 1721 1723 1724 1723 1725 1726 1727 1726 1728 1729 1730 1729 1731 1732 1733 1732 1734 1735 1736 1735 1737 1738 1739 1738 1740 1741 1742 1741 1743 @@ -2341,18 +2341,18 @@ PSF 1870 1871 1870 1872 1873 1874 1873 1875 1876 1877 1876 1878 1879 1880 1879 1881 1882 1883 1882 1884 1885 1886 1885 1887 - 1888 1889 1888 1890 1891 1892 1891 1893 - 1894 1895 1894 1896 1897 1898 1897 1899 - 1900 1901 1900 1902 1903 1904 1903 1905 - 1906 1907 1906 1908 1909 1910 1909 1911 - 1913 1914 1913 1915 1916 1917 1916 1918 - 1919 1920 1919 1921 1922 1923 1922 1924 - 1925 1926 1925 1927 1928 1929 1928 1930 - 1931 1932 1931 1933 1934 1935 1934 1936 - 1937 1938 1937 1939 1940 1941 1940 1942 + 1889 1890 1889 1891 1892 1893 1892 1894 + 1896 1897 1896 1898 1899 1900 1899 1901 + 1902 1903 1902 1904 1905 1906 1905 1907 + 1908 1909 1908 1910 1911 1912 1911 1913 + 1914 1915 1914 1916 1917 1918 1917 1919 + 1920 1921 1920 1922 1923 1924 1923 1925 + 1926 1927 1926 1928 1929 1930 1929 1931 + 1932 1933 1932 1934 1935 1936 1935 1937 + 1938 1939 1938 1940 1941 1942 1941 1943 1944 1945 1944 1946 1947 1948 1947 1949 1950 1951 1950 1952 1953 1954 1953 1955 - 1957 1958 1957 1959 1960 1961 1960 1962 + 1956 1957 1956 1958 1959 1960 1959 1961 1963 1964 1963 1965 1966 1967 1966 1968 1491 !NTHETA: angles @@ -2701,18 +2701,18 @@ PSF 559 558 560 562 561 563 565 564 566 568 567 569 571 570 572 574 573 575 577 576 578 580 579 581 583 582 584 - 586 585 587 589 588 590 593 592 594 - 596 595 597 599 598 600 602 601 603 - 605 604 606 608 607 609 611 610 612 - 614 613 615 617 616 618 620 619 621 - 623 622 624 626 625 627 629 628 630 - 632 631 633 635 634 636 638 637 639 - 641 640 642 644 643 645 647 646 648 - 650 649 651 653 652 654 656 655 657 - 659 658 660 662 661 663 665 664 666 - 668 667 669 671 670 672 674 673 675 - 677 676 678 680 679 681 683 682 684 - 686 685 687 689 688 690 692 691 693 + 586 585 587 589 588 590 592 591 593 + 595 594 596 598 597 599 601 600 602 + 604 603 605 607 606 608 610 609 611 + 613 612 614 616 615 617 619 618 620 + 622 621 623 625 624 626 628 627 629 + 631 630 632 634 633 635 637 636 638 + 640 639 641 643 642 644 646 645 647 + 649 648 650 652 651 653 655 654 656 + 658 657 659 661 660 662 664 663 665 + 667 666 668 670 669 671 673 672 674 + 676 675 677 679 678 680 682 681 683 + 685 684 686 688 687 689 691 690 692 695 694 696 698 697 699 701 700 702 704 703 705 707 706 708 710 709 711 713 712 714 716 715 717 719 718 720 @@ -2726,91 +2726,91 @@ PSF 785 784 786 788 787 789 791 790 792 794 793 795 797 796 798 800 799 801 803 802 804 806 805 807 809 808 810 - 812 811 813 815 814 816 818 817 819 - 821 820 822 824 823 825 827 826 828 - 830 829 831 833 832 834 836 835 837 - 839 838 840 842 841 843 845 844 846 + 812 811 813 816 815 817 819 818 820 + 822 821 823 825 824 826 828 827 829 + 831 830 832 834 833 835 837 836 838 + 840 839 841 843 842 844 846 845 847 849 848 850 852 851 853 855 854 856 - 858 857 859 862 861 863 865 864 866 + 858 857 859 861 860 862 865 864 866 868 867 869 871 870 872 874 873 875 877 876 878 880 879 881 883 882 884 886 885 887 889 888 890 892 891 893 895 894 896 898 897 899 901 900 902 - 905 904 906 908 907 909 911 910 912 - 914 913 915 917 916 918 920 919 921 - 923 922 924 926 925 927 929 928 930 - 932 931 933 935 934 936 938 937 939 - 941 940 942 944 943 945 947 946 948 - 950 949 951 953 952 954 956 955 957 - 960 959 961 963 962 964 966 965 967 - 969 968 970 972 971 973 975 974 976 - 978 977 979 981 980 982 984 983 985 - 987 986 988 990 989 991 993 992 994 + 904 903 905 907 906 908 910 909 911 + 913 912 914 916 915 917 919 918 920 + 922 921 923 925 924 926 928 927 929 + 931 930 932 934 933 935 937 936 938 + 940 939 941 943 942 944 946 945 947 + 949 948 950 952 951 953 955 954 956 + 958 957 959 961 960 962 964 963 965 + 967 966 968 970 969 971 973 972 974 + 976 975 977 979 978 980 982 981 983 + 986 985 987 989 988 990 993 992 994 996 995 997 999 998 1000 1002 1001 1003 1005 1004 1006 1008 1007 1009 1011 1010 1012 1014 1013 1015 1017 1016 1018 1020 1019 1021 1023 1022 1024 1026 1025 1027 1029 1028 1030 - 1032 1031 1033 1035 1034 1036 1039 1038 1040 - 1042 1041 1043 1045 1044 1046 1048 1047 1049 - 1051 1050 1052 1054 1053 1055 1057 1056 1058 - 1060 1059 1061 1063 1062 1064 1066 1065 1067 - 1069 1068 1070 1072 1071 1073 1075 1074 1076 - 1078 1077 1079 1081 1080 1082 1084 1083 1085 - 1087 1086 1088 1090 1089 1091 1093 1092 1094 + 1032 1031 1033 1035 1034 1036 1038 1037 1039 + 1041 1040 1042 1044 1043 1045 1047 1046 1048 + 1050 1049 1051 1053 1052 1054 1056 1055 1057 + 1059 1058 1060 1062 1061 1063 1065 1064 1066 + 1068 1067 1069 1071 1070 1072 1074 1073 1075 + 1077 1076 1078 1080 1079 1081 1083 1082 1084 + 1086 1085 1087 1089 1088 1090 1092 1091 1093 1096 1095 1097 1099 1098 1100 1102 1101 1103 1105 1104 1106 1108 1107 1109 1111 1110 1112 1114 1113 1115 1117 1116 1118 1120 1119 1121 - 1123 1122 1124 1126 1125 1127 1129 1128 1130 - 1132 1131 1133 1135 1134 1136 1138 1137 1139 - 1141 1140 1142 1144 1143 1145 1147 1146 1148 - 1150 1149 1151 1153 1152 1154 1156 1155 1157 - 1159 1158 1160 1162 1161 1163 1165 1164 1166 - 1168 1167 1169 1171 1170 1172 1174 1173 1175 - 1177 1176 1178 1180 1179 1181 1183 1182 1184 - 1186 1185 1187 1189 1188 1190 1192 1191 1193 - 1195 1194 1196 1198 1197 1199 1201 1200 1202 - 1204 1203 1205 1207 1206 1208 1210 1209 1211 - 1213 1212 1214 1216 1215 1217 1219 1218 1220 - 1222 1221 1223 1225 1224 1226 1228 1227 1229 - 1231 1230 1232 1234 1233 1235 1237 1236 1238 - 1240 1239 1241 1243 1242 1244 1246 1245 1247 - 1249 1248 1250 1252 1251 1253 1255 1254 1256 - 1258 1257 1259 1262 1261 1263 1265 1264 1266 - 1268 1267 1269 1271 1270 1272 1274 1273 1275 - 1277 1276 1278 1280 1279 1281 1283 1282 1284 - 1286 1285 1287 1289 1288 1290 1292 1291 1293 - 1295 1294 1296 1298 1297 1299 1301 1300 1302 - 1304 1303 1305 1307 1306 1308 1310 1309 1311 - 1314 1313 1315 1317 1316 1318 1320 1319 1321 - 1323 1322 1324 1326 1325 1327 1329 1328 1330 - 1332 1331 1333 1335 1334 1336 1338 1337 1339 - 1341 1340 1342 1344 1343 1345 1347 1346 1348 - 1350 1349 1351 1353 1352 1354 1356 1355 1357 - 1359 1358 1360 1362 1361 1363 1365 1364 1366 - 1368 1367 1369 1371 1370 1372 1374 1373 1375 - 1377 1376 1378 1380 1379 1381 1383 1382 1384 - 1386 1385 1387 1389 1388 1390 1392 1391 1393 - 1395 1394 1396 1398 1397 1399 1401 1400 1402 - 1404 1403 1405 1407 1406 1408 1410 1409 1411 - 1413 1412 1414 1416 1415 1417 1419 1418 1420 - 1422 1421 1423 1425 1424 1426 1428 1427 1429 - 1431 1430 1432 1434 1433 1435 1437 1436 1438 - 1440 1439 1441 1443 1442 1444 1447 1446 1448 - 1450 1449 1451 1453 1452 1454 1456 1455 1457 - 1459 1458 1460 1462 1461 1463 1465 1464 1466 - 1468 1467 1469 1471 1470 1472 1474 1473 1475 - 1477 1476 1478 1480 1479 1481 1483 1482 1484 - 1486 1485 1487 1489 1488 1490 1492 1491 1493 - 1495 1494 1496 1498 1497 1499 1502 1501 1503 - 1505 1504 1506 1508 1507 1509 1511 1510 1512 - 1514 1513 1515 1517 1516 1518 1520 1519 1521 - 1523 1522 1524 1526 1525 1527 1529 1528 1530 - 1532 1531 1533 1535 1534 1536 1538 1537 1539 - 1541 1540 1542 1544 1543 1545 1547 1546 1548 - 1550 1549 1551 1553 1552 1554 1556 1555 1557 - 1559 1558 1560 1562 1561 1563 1565 1564 1566 - 1568 1567 1569 1571 1570 1572 1575 1574 1576 - 1578 1577 1579 1581 1580 1582 1584 1583 1585 + 1123 1122 1124 1127 1126 1128 1130 1129 1131 + 1133 1132 1134 1136 1135 1137 1139 1138 1140 + 1142 1141 1143 1145 1144 1146 1148 1147 1149 + 1151 1150 1152 1154 1153 1155 1157 1156 1158 + 1160 1159 1161 1163 1162 1164 1166 1165 1167 + 1169 1168 1170 1172 1171 1173 1175 1174 1176 + 1178 1177 1179 1181 1180 1182 1184 1183 1185 + 1187 1186 1188 1190 1189 1191 1193 1192 1194 + 1196 1195 1197 1199 1198 1200 1202 1201 1203 + 1206 1205 1207 1209 1208 1210 1212 1211 1213 + 1215 1214 1216 1219 1218 1220 1222 1221 1223 + 1225 1224 1226 1228 1227 1229 1231 1230 1232 + 1234 1233 1235 1237 1236 1238 1240 1239 1241 + 1243 1242 1244 1246 1245 1247 1249 1248 1250 + 1252 1251 1253 1255 1254 1256 1258 1257 1259 + 1261 1260 1262 1264 1263 1265 1267 1266 1268 + 1270 1269 1271 1273 1272 1274 1276 1275 1277 + 1279 1278 1280 1282 1281 1283 1285 1284 1286 + 1288 1287 1289 1291 1290 1292 1294 1293 1295 + 1297 1296 1298 1300 1299 1301 1303 1302 1304 + 1306 1305 1307 1309 1308 1310 1312 1311 1313 + 1315 1314 1316 1318 1317 1319 1321 1320 1322 + 1324 1323 1325 1327 1326 1328 1330 1329 1331 + 1333 1332 1334 1336 1335 1337 1339 1338 1340 + 1342 1341 1343 1345 1344 1346 1349 1348 1350 + 1352 1351 1353 1355 1354 1356 1358 1357 1359 + 1361 1360 1362 1364 1363 1365 1367 1366 1368 + 1370 1369 1371 1373 1372 1374 1376 1375 1377 + 1379 1378 1380 1382 1381 1383 1385 1384 1386 + 1388 1387 1389 1391 1390 1392 1394 1393 1395 + 1397 1396 1398 1400 1399 1401 1403 1402 1404 + 1406 1405 1407 1409 1408 1410 1412 1411 1413 + 1415 1414 1416 1418 1417 1419 1421 1420 1422 + 1424 1423 1425 1427 1426 1428 1430 1429 1431 + 1433 1432 1434 1436 1435 1437 1440 1439 1441 + 1443 1442 1444 1446 1445 1447 1450 1449 1451 + 1453 1452 1454 1456 1455 1457 1459 1458 1460 + 1462 1461 1463 1465 1464 1466 1468 1467 1469 + 1471 1470 1472 1474 1473 1475 1477 1476 1478 + 1480 1479 1481 1483 1482 1484 1486 1485 1487 + 1489 1488 1490 1492 1491 1493 1495 1494 1496 + 1498 1497 1499 1501 1500 1502 1504 1503 1505 + 1507 1506 1508 1510 1509 1511 1513 1512 1514 + 1516 1515 1517 1519 1518 1520 1522 1521 1523 + 1525 1524 1526 1528 1527 1529 1531 1530 1532 + 1534 1533 1535 1537 1536 1538 1540 1539 1541 + 1543 1542 1544 1546 1545 1547 1549 1548 1550 + 1552 1551 1553 1555 1554 1556 1558 1557 1559 + 1561 1560 1562 1564 1563 1565 1567 1566 1568 + 1570 1569 1571 1573 1572 1574 1576 1575 1577 + 1579 1578 1580 1582 1581 1583 1585 1584 1586 1588 1587 1589 1591 1590 1592 1594 1593 1595 1597 1596 1598 1600 1599 1601 1603 1602 1604 1606 1605 1607 1609 1608 1610 1612 1611 1613 @@ -2818,14 +2818,14 @@ PSF 1624 1623 1625 1627 1626 1628 1630 1629 1631 1633 1632 1634 1636 1635 1637 1639 1638 1640 1642 1641 1643 1645 1644 1646 1648 1647 1649 - 1652 1651 1653 1655 1654 1656 1658 1657 1659 - 1661 1660 1662 1664 1663 1665 1667 1666 1668 - 1670 1669 1671 1673 1672 1674 1676 1675 1677 - 1679 1678 1680 1682 1681 1683 1685 1684 1686 - 1688 1687 1689 1691 1690 1692 1694 1693 1695 - 1697 1696 1698 1700 1699 1701 1703 1702 1704 - 1706 1705 1707 1709 1708 1710 1712 1711 1713 - 1715 1714 1716 1718 1717 1719 1721 1720 1722 + 1651 1650 1652 1654 1653 1655 1657 1656 1658 + 1660 1659 1661 1663 1662 1664 1666 1665 1667 + 1669 1668 1670 1672 1671 1673 1675 1674 1676 + 1678 1677 1679 1681 1680 1682 1684 1683 1685 + 1687 1686 1688 1690 1689 1691 1693 1692 1694 + 1696 1695 1697 1699 1698 1700 1702 1701 1703 + 1705 1704 1706 1708 1707 1709 1711 1710 1712 + 1714 1713 1715 1717 1716 1718 1720 1719 1721 1724 1723 1725 1727 1726 1728 1730 1729 1731 1733 1732 1734 1736 1735 1737 1739 1738 1740 1742 1741 1743 1745 1744 1746 1748 1747 1749 @@ -2844,15 +2844,15 @@ PSF 1859 1858 1860 1862 1861 1863 1865 1864 1866 1868 1867 1869 1871 1870 1872 1874 1873 1875 1877 1876 1878 1880 1879 1881 1883 1882 1884 - 1886 1885 1887 1889 1888 1890 1892 1891 1893 - 1895 1894 1896 1898 1897 1899 1901 1900 1902 - 1904 1903 1905 1907 1906 1908 1910 1909 1911 - 1914 1913 1915 1917 1916 1918 1920 1919 1921 - 1923 1922 1924 1926 1925 1927 1929 1928 1930 - 1932 1931 1933 1935 1934 1936 1938 1937 1939 - 1941 1940 1942 1945 1944 1946 1948 1947 1949 - 1951 1950 1952 1954 1953 1955 1958 1957 1959 - 1961 1960 1962 1964 1963 1965 1967 1966 1968 + 1886 1885 1887 1890 1889 1891 1893 1892 1894 + 1897 1896 1898 1900 1899 1901 1903 1902 1904 + 1906 1905 1907 1909 1908 1910 1912 1911 1913 + 1915 1914 1916 1918 1917 1919 1921 1920 1922 + 1924 1923 1925 1927 1926 1928 1930 1929 1931 + 1933 1932 1934 1936 1935 1937 1939 1938 1940 + 1942 1941 1943 1945 1944 1946 1948 1947 1949 + 1951 1950 1952 1954 1953 1955 1957 1956 1958 + 1960 1959 1961 1964 1963 1965 1967 1966 1968 1497 !NPHI: dihedrals 1 4 5 8 1 4 5 6 diff --git a/tools/ch2lmp/example/convert.sh b/tools/ch2lmp/example/convert.sh new file mode 100755 index 0000000000..ccb4707999 --- /dev/null +++ b/tools/ch2lmp/example/convert.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -f 1ac7.restart* 1ac7.dump +../charmm2lammps.pl -water -ions -border=2.0 all27_na 1ac7 diff --git a/tools/ch2lmp/main_manual b/tools/ch2lmp/main_manual deleted file mode 100644 index f8a02454c2..0000000000 --- a/tools/ch2lmp/main_manual +++ /dev/null @@ -1,12 +0,0 @@ -The charmm2lmp sub-directory contains tools for converting files back-and-forth between -the CHARMM MD code and LAMMPS. - -The charmm2lammps.pl perl script converts CHARMM input files into LAMMPS input. -The lammps2pdb.pl perl script converts LAMMPS dump files into a pdb series file. -The mkpdb.f fortran 90 code also converts LAMMPS dump files into PDB files, and the -mkdcd.f tool converts LAMMPS dump files into CHARMM *.dcd trajectory files that can -be read-in to CHARMM for analysis. See the README file in the charmm2lmp sub-directory -for more information. - -These tools were written by Pieter J. in 't Veld (pjintve@sandia.gov) and Paul Crozier -(pscrozi@sandia.gov) at Sandia. \ No newline at end of file diff --git a/tools/doxygen/Developer.dox.lammps b/tools/doxygen/Developer.dox.lammps new file mode 100644 index 0000000000..8e9e3de232 --- /dev/null +++ b/tools/doxygen/Developer.dox.lammps @@ -0,0 +1,456 @@ +/** + +@mainpage Lammps Developer Guide +@tableofcontents + +

    LAMMPS Documentation

    +

    and

    +

    LAMMPS Developer Guide

    +

    LAMMPS_VERSION

    + + +This document is a developer guide to the LAMMPS molecular dynamics package, whose WWW site is at lammps.sandia.gov. It describes the internal structure and algorithms of the code. Sections will be added as we have time, and in response to requests from developers and users. + + +@section SCT_Lammps_source_files LAMMPS source files + +LAMMPS source files are in two directories of the distribution tarball. The src directory has the majority of them, all of which are C++ files (*.cpp and *.h). Many of these files are in the src directory itself. There are also dozens of "packages", which can be included or excluded when LAMMPS is built. See the doc/Section_start.html section of the manual for more information about packages, or type "make" from within the src directory, which lists package-related commands, such as "make package-status". The source files for each package are in an all-uppercase sub-directory of src, like src/MOLECULE or src/USER-CUDA. If the package is currently installed, copies of the package source files will also exist in the src directory itself. The src/STUBS sub-directory is not a package but contains a dummy version of the MPI library, used when building a serial version of the code. + +The lib directory also contains source code for external libraries, used by a few of the packages. Each sub-directory, like meam or gpu, contains the source files, some of which are in different languages such as Fortran. The files are compiled into libraries from within each sub-directory, e.g. performing a "make" in the lib/meam directory creates a libmeam.a file. These libraries are statically linked to during a LAMMPS build, if the corresponding package is installed. + +LAMMPS C++ source files almost always come in pairs, such as run.cpp and run.h. The pair of files defines a C++ class, the LAMMPS_NS::Run class in this case, which contains the code invoked by the run command in a LAMMPS input script. As this example illustrates, source file and class names often have a one-to-one correspondence with a command used in a LAMMPS input script. Some source files and classes do not have a corresponding input script command, e.g. force.cpp and the LAMMPS_NS::Force class. They are discussed in the next section. + + +@section SCT_Class_hierarchy_of_LAMMPS Class hierarchy of LAMMPS + +Though LAMMPS has a lot of source files and classes, its class hierarchy is quite simple, as outlined in figure @ref classes. Each boxed name refers to a class and has a pair of associated source files in lammps/src, e.g. memory.cpp and memory.h. More details on the class and its methods and data structures can be found by examining its *.h file. + +LAMMPS_NS::LAMMPS (src/lammps.cpp and src/lammps.h) is the top-level class for the entire code. It holds an "instance" of LAMMPS and can be instantiated one or more times by a calling code. For example, the file src/main.cpp simply instantiates one instance of LAMMPS and passes it the input script. + +The file src/library.cpp contains a C-style library interface to the LAMMPS_NS::LAMMPS class. See the lammps/couple and lammps/python directories for examples of simple programs that use LAMMPS through its library interface. A driver program can instantiate the LAMMPS_NS::LAMMPS class multiple times, e.g. to embed several atomistic simulation regions within a mesoscale or continuum simulation domain. + +There are a dozen or so top-level classes within the LAMMPS_NS::LAMMPS class that are visible everywhere in the code. They are shaded blue in figure @ref classes. Thus any class can refer to the y-coordinate of local atom "i" as atom@f$\rightarrow@f$x[i][1]. This visibility is enabled by a bit of cleverness in the LAMMPS_NS::Pointers class (see src/pointers.h) which every class inherits from. + +There are a handful of virtual parent classes in LAMMPS that define what LAMMPS calls "styles". They are shaded red in figure @ref classes. Each of these are parents of a number of child classes that implement the interface defined by the parent class. For example, the "fix style" has around 100 child classes. They are the possible fixes that can be specified by the fix command in an input script, e.g. fix nve, fix shake, fix ave/time, etc. The corresponding classes are LAMMPS_NS::Fix (for the parent class), LAMMPS_NS::FixNVE, LAMMPS_NS::FixShake, LAMMPS_NS::FixAveTime, etc. The source files for these classes are easy to identify in the src directory, since they begin with the word "fix", e,g, fix_nve.cpp, fix_shake.cpp, fix_ave_time.cpp, etc. + +The one exception is child class files for the "command" style. These implement specific commands in the input script that can be invoked before/after/between runs or which launch a simulation. Examples are the create_box, minimize, run, and velocity commands which encode the LAMMPS_NS::CreateBox, LAMMPS_NS::Minimize, LAMMPS_NS::Run, and LAMMPS_NS::Velocity classes. The corresponding files are create_box.cpp, minimize.cpp, run.cpp, and velocity.cpp. + +The list of command style files can be found by typing "grep COMMAND_CLASS *.h" from within the src directory, since that word in the header file identifies the class as an input script command. Similar words can be grepped to list files for the other LAMMPS styles. E.g. ATOM_CLASS, PAIR_CLASS, BOND_CLASS, REGION_CLASS, FIX_CLASS, COMPUTE_CLASS, DUMP_CLASS, etc. + +
    + +@anchor classes @image html classes.png "Class hierarchy within LAMMPS source code" + +@anchor classes @image latex classes.eps "Class hierarchy within LAMMPS source code" + +
    + +More details on individual classes in figure @ref classes are as +follows: + +- The LAMMPS_NS::Memory class handles allocation of all large vectors and arrays. + +- The LAMMPS_NS::Error class prints all error and warning messages. + +- The LAMMPS_NS::Universe class sets up partitions of processors so that multiple simulations can be run, each on a subset of the processors allocated for a run, e.g. by the mpirun command. + +- The LAMMPS_NS::Input class reads an input script, stores variables, and invokes stand-alone commands that are child classes of the LAMMPS_NS::Command class. + +- As discussed above, the LAMMPS_NS::Command class is a parent class for certain input script commands that perform a one-time operation before/after/between simulations or which invoke a simulation. They are instantiated from within the LAMMPS_NS::Input class, invoked, then immediately destructed. + +- The LAMMPS_NS::Finish class is instantiated to print statistics to the screen after a simulation is performed, by commands like run and minimize. + +- The LAMMPS_NS::Special class walks the bond topology of a molecular system to find 1st, 2nd, 3rd neighbors of each atom. It is invoked by several commands, like read_data, read_restart, and replicate. + +- The LAMMPS_NS::Atom class stores all per-atom arrays. More precisely, they are allocated and stored by the LAMMPS_NS::AtomVec class, and the LAMMPS_NS::Atom class simply stores a pointer to them. The LAMMPS_NS::AtomVec class is a parent class for atom styles, defined by the atom_style command. + +- The LAMMPS_NS::Update class holds an integrator and a minimizer. The LAMMPS_NS::Integrate class is a parent style for the Verlet and rRESPA time integrators, as defined by the run_style input command. The LAMMPS_NS::Min class is a parent style for various energy minimizers. + +- The LAMMPS_NS::Neighbor class builds and stores neighbor lists. The LAMMPS_NS::NeighList class stores a single list (for all atoms). The LAMMPS_NS::NeighRequest class is called by pair, fix, or compute styles when they need a particular kind of neighbor list. + +- The LAMMPS_NS::Comm class performs interprocessor communication, typically of ghost atom information. This usually involves MPI message exchanges with 6 neighboring processors in the 3d logical grid of processors mapped to the simulation box. Sometimes the LAMMPS_NS::Irregular class is used, when atoms may migrate to arbitrary processors. + +- The LAMMPS_NS::Domain class stores the simulation box geometry, as well as the geometric LAMMPS_NS::Region and any user definition of a LAMMPS_NS::Lattice. The latter are defined by region and lattice commands in an input script. + +- The LAMMPS_NS::Force class computes various forces between atoms. The LAMMPS_NS::Pair parent class is for non-bonded or pair-wise forces, which in LAMMPS lingo includes many-body forces such as the Tersoff 3-body potential. The LAMMPS_NS::Bond, LAMMPS_NS::Angle, LAMMPS_NS::Dihedral, LAMMPS_NS::Improper parent classes are styles for bonded interactions within a static molecular topology. The LAMMPS_NS::KSpace parent class is for computing long-range Coulombic interactions. One of its child classes, LAMMPS_NS::PPPM, uses the LAMMPS_NS::FFT3d and LAMMPS_NS::Remap classes to communicate grid-based information with neighboring processors. + +- The LAMMPS_NS::Modify class stores lists of LAMMPS_NS::Fix and LAMMPS_NS::Compute classes, both of which are parent styles. + +- The LAMMPS_NS::Group class manipulates groups that atoms are assigned to via the group command. It also computes various attributes of groups of atoms. + +- The LAMMPS_NS::Output class is used to generate 3 kinds of output from a LAMMPS simulation: thermodynamic information printed to the screen and log file, dump file snapshots, and restart files. These correspond to the LAMMPS_NS::Thermo, LAMMPS_NS::Dump, and LAMMPS_NS::WriteRestart classes respectively. The LAMMPS_NS::Dump class is a parent style. + +- The LAMMPS_NS::Timer class logs MPI timing information, output at the end of a run. + + +@section SCT_How_a_timestep_works How a timestep works + +The first and most fundamental operation within LAMMPS to understand is how a timestep is structured. Timestepping is performed by the LAMMPS_NS::Integrate class within the LAMMPS_NS::Update class. Since LAMMPS_NS::Integrate is a parent class, corresponding to the run_style input script command, it has child classes. In this section, the timestep implemented by the LAMMPS_NS::Verlet child class is described. A similar timestep is implemented by the LAMMPS_NS::Respa child class, for the rRESPA hierarchical timestepping method. The LAMMPS_NS::Min parent class performs energy minimization, so does not perform a literal timestep. But it has logic similar to what is described here, to compute forces and invoke fixes at each iteration of a minimization. Differences between time integration and minimization are highlighted at the end of this section. + +The LAMMPS_NS::Verlet class is encoded in the src/verlet.cpp and verlet.h files. It implements the velocity-Verlet timestepping algorithm. The workhorse method is LAMMPS_NS::Verlet::run(), but first we highlight several other methods in the class. + +- The LAMMPS_NS::Verlet::init() method is called at the beginning of each dynamics run. It simply sets some internal flags, based on user settings in other parts of the code. + +- The LAMMPS_NS::Verlet::setup() or LAMMPS_NS::Verlet::setup_minimal() methods are also called before each run. The velocity-Verlet method requires current forces be calculated before the first timestep, so these routines compute forces due to all atomic interactions, using the same logic that appears in the timestepping described next. A few fixes are also invoked, using the mechanism described in the next section. Various counters are also initialized before the run begins. The LAMMPS_NS::Verlet::setup_minimal() method is a variant that has a flag for performing less setup. This is used when runs are continued and information from the previous run is still valid. For example, if repeated short LAMMPS runs are being invoked, interleaved by other commands, via the "pre no" and "every" options of the run command, the LAMMPS_NS::Verlet::setup_minimal() method is used. + +- The LAMMPS_NS::Verlet::force_clear() method initializes force and other arrays to zero before each timestep, so that forces (torques, etc) can be accumulated. + +Now for the LAMMPS_NS::Verlet::run() method. Its structure in hi-level pseudo code is shown in figure @ref Verlet. In the actual code in src/verlet.cpp some of these operations are conditionally invoked. + + +@verbatim + +loop over N timesteps: + ev_set() + + fix->initial_integrate() + fix->post_integrate() + + nflag = neighbor->decide() + if nflag: + fix->pre_exchange() + domain->pbc() + domain->reset_box() + comm->setup() + neighbor->setup_bins() + comm->exchange() + comm->borders() + fix->pre_neighbor() + neighbor->build() + else + comm->forward_comm() + + force_clear() + fix->pre_force() + + pair->compute() + bond->compute() + angle->compute() + dihedral->compute() + improper->compute() + kspace->compute() + + comm->reverse_comm() + + fix->post_force() + fix->final_integrate() + fix->end_of_step() + + if any output on this step: output->write() + +@endverbatim + +@anchor Verlet
    **Pseudo-code for the Verlet::run() method**
    + + +The LAMMPS_NS::Integrate::ev_set() method (in the parent LAMMPS_NS::Integrate class), sets two flags LAMMPS_NS::Integrate::eflag and LAMMPS_NS::Integrate::vflag for energy and virial computation. Each flag encodes whether global and/or per-atom energy and virial should be calculated on this timestep, because some fix or variable or output will need it. These flags are passed to the various methods that compute particle interactions, so that they can skip the extra calculations if the energy and virial are not needed. See the comments with the LAMMPS_NS::Integrate::ev_set() method which document the flag values. + +At various points of the timestep, fixes are invoked, e.g. fix@f$\rightarrow@f$initial_integrate(). In the code, this is actually done via the LAMMPS_NS::Modify class which stores all the Fix objects and lists of which should be invoked at what point in the timestep. Fixes are the LAMMPS mechanism for tailoring the operations of a timestep for a particular simulation. As described elsewhere (unwritten section), each fix has one or more methods, each of which is invoked at a specific stage of the timestep, as in figure @ref Verlet. All the fixes defined in an input script with an LAMMPS_NS::Fix::initial_integrate() method are invoked at the beginning of each timestep. The fix commands fix nve, fix nvt and fix npt are examples, since they perform the start-of-timestep velocity-Verlet integration to update velocities by a half-step, and coordinates by a full step. The LAMMPS_NS::Fix::post_integrate() method is next. Only a few fixes use this, e.g. to reflect particles off box boundaries in the LAMMPS_NS::FixWallReflect class. + +The LAMMPS_NS::Neighbor::decide() method in the Neighbor class determines whether neighbor lists need to be rebuilt on the current timestep. If not, coordinates of ghost atoms are acquired by each processor via the LAMMPS_NS::Comm::forward_comm() method of the LAMMPS_NS::Comm class. If neighbor lists need to be built, several operations within the inner if clause of figure @ref Verlet are first invoked. The LAMMPS_NS::Fix::pre_exchange() method of any defined fixes is invoked first. Typically this inserts or deletes particles from the system. + +Periodic boundary conditions are then applied by the LAMMPS_NS::Domain class via its LAMMPS_NS::Domain::pbc() method to remap particles that have moved outside the simulation box back into the box. Note that this is not done every timestep. but only when neighbor lists are rebuilt. This is so that each processor’s sub-domain will have consistent (nearby) atom coordinates for its owned and ghost atoms. It is also why dumped atom coordinates can be slightly outside the simulation box. + +The box boundaries are then reset (if needed) via the LAMMPS_NS::Domain::reset_box() method of the Domain class, e.g. if box boundaries are shrink-wrapped to current particle coordinates. A change in the box size or shape requires internal information for communicating ghost atoms (LAMMPS_NS::Comm class) and neighbor list bins (LAMMPS_NS::Neighbor class) be updated. The LAMMPS_NS::Comm::setup() method of the LAMMPS_NS::Comm class and LAMMPS_NS::Neighbor::setup_bins() method of the LAMMPS_NS::Neighbor class perform the update. + +The code is now ready to migrate atoms that have left a processor’s geometric sub-domain to new processors. The LAMMPS_NS::Comm::exchange() method of the LAMMPS_NS::Comm class performs this operation. The LAMMPS_NS::Comm::borders() method of the LAMMPS_NS::Comm class then identifies ghost atoms surrounding each processor’s sub-domain and communicates ghost atom information to neighboring processors. It does this by looping over all the atoms owned by a processor to make lists of those to send to each neighbor processor. On subsequent timesteps, the lists are used by the LAMMPS_NS::Comm::forward_comm() method. + +Fixes with a LAMMPS_NS::Fix::pre_neighbor() method are then called. These typically re-build some data structure stored by the fix that depends on the current atoms owned by each processor. + +Now that each processor has a current list of its owned and ghost atoms, LAMMPS is ready to rebuild neighbor lists via the LAMMPS_NS::Neighbor::build() method of the LAMMPS_NS::Neighbor class. This is typically done by binning all owned and ghost atoms, and scanning a stencil of bins around each owned atom’s bin to make a Verlet list of neighboring atoms within the force cutoff plus neighbor skin distance. + +In the next portion of the timestep, all interaction forces between particles are computed, after zeroing the per-atom force vector via the LAMMPS_NS::Verlet::force_clear() method. If the newton flag is set to "on" by the newton command, forces on both owned and ghost atoms are calculated. + +Pairwise forces are calculated first, which enables the global virial (if requested) to be calculated cheaply (at the end of the LAMMPS_NS::Pair::compute() method), by a dot product of atom coordinates and forces. By including owned and ghost atoms in the dot product, the effect of periodic boundary conditions is correctly accounted for. Molecular topology interactions (bonds, angles, dihedrals, impropers) are calculated next. The final contribution is from long-range Coulombic interactions, invoked by the LAMMPS_NS::KSpace class. + +If the newton flag is on, forces on ghost atoms are communicated and summed back to their corresponding owned atoms. The LAMMPS_NS::Comm::reverse_comm() method of the LAMMPS_NS::Comm class performs this operation, which is essentially the inverse operation of sending copies of owned atom coordinates to other processor’s ghost atoms. + +At this point in the timestep, the total force on each atom is known. Additional force constraints (external forces, SHAKE, etc) are applied by Fixes that have a LAMMPS_NS::Fix::post_force() method. The second half of the velocity-Verlet integration is then performed (another half-step update of the velocities) via fixes like fix nve, fix nvt and fix npt. + +At the end of the timestep, fixes that define an LAMMPS_NS::Fix::end_of_step() method are invoked. These typically perform a diagnostic calculation, e.g. the fix ave/time and fix ave/spatial fixes. + +The final operation of the timestep is to perform any requested output, via the LAMMPS_NS::Output::write() method of the LAMMPS_NS::Output class. There are 3 kinds of LAMMPS output: + +- thermodynamic output to the screen and log file, +- snapshots of atom data to a dump file, and +- restart files. + +See the thermo_style, dump, and restart commands for more details. + +The iteration performed by an energy minimization is similar to the dynamics timestep of figure @ref Verlet. Forces are computed, neighbor lists are built as needed, atoms migrate to new processors, and atom coordinates and forces are communicated to neighboring processors. The only difference is what LAMMPS_NS::Fix class operations are invoked when. Only a subset of LAMMPS fixes are useful during energy minimization, as explained in their individual doc pages. The relevant LAMMPS_NS::Fix class methods are LAMMPS_NS::Fix::min_pre_exchange(), LAMMPS_NS::Fix::min_pre_force(), and LAMMPS_NS::Fix::min_post_force(). Each is invoked at the appropriate place within the minimization iteration. For example, the LAMMPS_NS::Fix::min_post_force() method is analogous to the LAMMPS_NS::Fix::post_force() method for dynamics; it is used to alter or constrain forces on each atom, which affects the minimization procedure. + + +@section SCT_Extending_LAMMPS Extending LAMMPS + +The Section_modify.html file in the doc directory of the LAMMPS distribution gives an overview of how LAMMPS can be extended by writing new classes that derive from existing parent classes in LAMMPS. + + +@subsection SST_New_fixes New fixes + +(this section has been provided by Kirill Lykov) + +Here, some specific coding details are provided for writing a new fix. + +Writing fixes is a flexible way of extending LAMMPS. Users can implement many things using fixes: + +- changing particles attributes (positions, velocities, forces, etc.). Example: LAMMPS_NS::FixFreeze. + +- reading/writing data. Example: LAMMPS_NS::FixReadRestart. + +- implementing boundary conditions. Example: LAMMPS_NS::FixWall. + +- saving information about particles for future use (previous positions, for instance). Example: LAMMPS_NS::FixStoreState. + +All fixes are derived from class LAMMPS_NS::Fix and must have constructor with the signature: + +@verbatim + +FixMine(class LAMMPS *, int, char **) + +@endverbatim + +Every fix must be registered in LAMMPS by writing the following lines of code in the header before include guards: + +@verbatim + +#ifdef FIX_CLASS +FixStyle(your/fix/name,FixMine) +#else + +@endverbatim + +Where `your/fix/name` is a name of your fix in the script and `FixMine` is the name of the class. This code allows LAMMPS to find your fix when it parses input script. In addition, your fix header must be included in the file style_fix.h. In case if you use LAMMPS make, this file is generated automatically - all files starting with prefix `fix_` are included, so call your header the same way. Otherwise, don’t forget to add your include into style_fix.h. + +Let’s write a simple fix which will print average velocity at the end of each timestep. First of all, implement a constructor: + +@verbatim + +FixPrintVel::FixPrintVel(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) +{ + + if (narg < 4) + error->all(FLERR,"Illegal fix print command"); + + nevery = atoi(arg[3]); + + if (nevery <= 0) + error->all(FLERR,"Illegal fix print command"); +} + +@endverbatim + +In the constructor you should parse your fix arguments which are specified in the script. All fixes have pretty the same syntax: + +@verbatim + +fix [fix_identifier] [group_name] [fix_name] [fix_arguments]. + +@endverbatim + +The first 3 parameters are parsed by Fix class constructor, while `[fix_arguments]` should be parsed by you. In our case, we need to specify how often we want to print an average velocity. For instance, once in 50 timesteps: `fix 1 print/vel 50`. There is a special variable in Fix class called nevery which specifies how often the method `end_of_step()` is called. Thus all we need to do is just set it up. + +The next method we need to implement is `setmask()`: + +@verbatim + +int FixPrintVel::setmask() +{ + int mask = 0; + mask |= FixConst::END_OF_STEP; + return mask; +} + +@endverbatim + +Here user specifies which methods of your fix should be called during the execution. For instance, `END_OF_STEP` corresponds to the LAMMPS_NS::Fix::end_of_step() method. Overall, there are 8 most important methods that are called in predefined order during the execution of the Verlet algorithm as was mentioned in Section 3: + +- LAMMPS_NS::Fix::initial_integrate() + +- LAMMPS_NS::Fix::post_integrate() + +- LAMMPS_NS::Fix::pre_exchange() + +- LAMMPS_NS::Fix::pre_neighbor() + +- LAMMPS_NS::Fix::pre_force() + +- LAMMPS_NS::Fix::post_force() + +- LAMMPS_NS::Fix::final_integrate() + +- LAMMPS_NS::Fix::end_of_step() + +The fix developer must understand when he wants to execute his code. In case if we want to write `FixPrintVel`, we need only LAMMPS_NS::Fix::end_of_step(): + +@verbatim + +void FixPrintVel::end_of_step() +{ + // for add3, scale3 + using namespace MathExtra; + + double** v = atom->v; + int nlocal = atom->nlocal; + double localAvgVel[4]; // 4th element for particles count + memset(localAvgVel, 0, 4 * sizeof(double)); + for (int particleInd = 0; particleInd < nlocal; ++particleInd) { + add3(localAvgVel, v[particleInd], localAvgVel); + } + localAvgVel[3] = nlocal; + double globalAvgVel[4]; + memset(globalAvgVel, 0, 4 * sizeof(double)); + MPI_Allreduce(localAvgVel, globalAvgVel, 4, MPI_DOUBLE, MPI_SUM, world); + scale3(1.0 / globalAvgVel[3], globalAvgVel); + if (comm->me == 0) { + printf("%e, %e, %e\n", globalAvgVel[0], globalAvgVel[1], globalAvgVel[2]); + } +} + +@endverbatim + + +In the code above, we use MathExtra routines defined in math_extra.h. There are bunch of math functions to work with arrays of doubles as with math vectors. + +In this code we use an instance of LAMMPS_NS::Atom class. This object is stored in the LAMMPS_NS::Pointers class (see pointers.h). This object contains all global information about the simulation system. Data from LAMMPS_NS::Pointers class available to all classes inherited from it using protected inheritance. Hence when you write you own class, which is going to use LAMMPS data, don’t forget to inherit from the class LAMMPS_NS::Pointers. When writing fixes we inherit from class LAMMPS_NS::Fix which is inherited from LAMMPS_NS::Pointers so there is no need to inherit from it directly. + +The code above computes average velocity for all particles in the simulation. Yet you have one unused parameter in fix call from the script - `[group_name]`. This parameter specifies the group of atoms used in the fix. So we should compute average for all particles in the simulation if `group_name == all`, but it can be any group. The group information is specified by groupbit which is defined in class LAMMPS_NS::Fix: + +@verbatim + +for (int particleInd = 0; particleInd < nlocal; ++particleInd) { + if (atom->mask[particleInd] & groupbit) { + // Do all job here + } + } + +@endverbatim + +Class LAMMPS_NS::Atom encapsulates atoms positions, velocities, forces, etc. The user can access them using particle index. Note, that particle indexes are usually changed every timestep because of sorting. + +Lets consider another LAMMPS_NS::Fix example. We want to have a fix which stores atoms position from previous time step in your fix. The local atoms indexes will not be valid on the next iteration. In order to handle this situation there are several methods which should be implemented: + +- LAMMPS_NS::Fix::memory_usage() `/double memory_usage(void)/` - return how much memory fix uses + +- LAMMPS_NS::Fix::grow_arrays() `/void grow_arrays(int)/` - do reallocation of the per particle arrays in your fix + +- LAMMPS_NS::Fix::copy_arrays() `/void copy_arrays(int i, int j)/` - copy i-th per-particle information to j-th. Used when atoms sorting is performed + +- LAMMPS_NS::Fix::set_arrays() `/void set_arrays(int i)/` - sets i-th particle related information to zero + +Note, that if your class implements these methods, it must call add calls of LAMMPS_NS::Atom::add_callback and LAMMPS_NS::Atom::delete_callback to constructor and destructor: + +@verbatim + +FixSavePos::FixSavePos(LAMMPS *lmp, int narg, char **arg) +{ + //... + atom->add_callback(0); +} + +FixSavePos::~FixSavePos() +{ + atom->delete_callback(id, 0); +} + +@endverbatim + +Since we want to store positions of atoms from previous timestep, we +need to add `double** x` to the header file. Than add allocation code to +constructor: + +@verbatim + +memory->create(this->x, atom->nmax, 3, "FixSavePos:x"); . + +@endverbatim + +Free memory at destructor: + +@verbatim + +memory->destroy(x); + +@endverbatim + +Finally, implement mentioned methods: + +@verbatim + +double FixSavePos::memory_usage() +{ + int nmax = atom->nmax; + double bytes = 0.0; + bytes += nmax * 3 * sizeof(double); + return bytes; +} + +void FixSavePos::grow_arrays(int nmax) +{ + memory->grow(this->x, nmax, 3, "FixSavePos:x"); +} + +void FixSavePos::copy_arrays(int i, int j) +{ + memcpy(this->x[j], this->x[i], sizeof(double) * 3); +} + +void FixSavePos::set_arrays(int i) +{ + memset(this->x[i], 0, sizeof(double) * 3); +} + +int FixSavePos::pack_exchange(int i, double *buf) +{ + int m = 0; + buf[m++] = x[i][0]; + buf[m++] = x[i][1]; + buf[m++] = x[i][2]; + + return m; +} + +int FixSavePos::unpack_exchange(int nlocal, double *buf) +{ + int m = 0; + x[nlocal][0] = buf[m++]; + x[nlocal][1] = buf[m++]; + x[nlocal][2] = buf[m++]; + + return m; +} + +@endverbatim + +Now, a little bit about memory allocation. We used LAMMPS_NS::Memory class which is just a bunch of template functions for allocating 1D and 2D arrays. So you need to add include memory.h to have access to them. + +Finally, if you need to write or read some global information used in your fix to of from a restart file, you might do it by setting flag + +@verbatim + +restart_global = 1 + +@endverbatim + +in the constructor and implementing methods LAMMPS_NS::Fix::write_restart() `/void write_restart(FILE *fp)/` and LAMMPS_NS::Fix::restart() `/void restart(char *buf)/`. + + +@subsection SST_New_commands New commands + +New commands can be added to LAMMPS input scripts by adding new classes that have a “command†method. For example, the create_atoms, read_data, velocity and run commands are all implemented in this fashion. When such a command is encountered in the LAMMPS input script, LAMMPS simply creates a class with the corresponding name, invokes the “command†method of the class, and passes it the arguments from the input script. The command method can perform whatever operations it wishes on LAMMPS data structures. + + +@subsection SST_New_computes New computes + +Classes that compute scalar and vector quantities like temperature and the pressure tensor, as well as classes that compute per-atom quantities like kinetic energy and the centro-symmetry parameter are derived from the LAMMPS_NS::Compute class. New styles can be created to add new calculations to LAMMPS. Compute_temp.cpp is a simple example of computing a scalar temperature. + + +@subsection SST_New_pair_styles New pair styles + +Classes that compute pairwise interactions are derived from the LAMMPS_NS::Pair class. In LAMMPS, pairwise calculation include manybody potentials such as EAM or Tersoff where particles interact without a static bond topology. New styles can be created to add new pair potentials to LAMMPS. + + +@subsection SST_New_bonds_angles_dihedrals_impropers New bonds, angles, dihedrals and impropers + +Classes that compute molecular interactions are derived from the LAMMPS_NS::Bond, LAMMPS_NS::Angle, LAMMPS_NS::Dihedral, and LAMMPS_NS::Improper classes. New styles can be created to add new potentials to LAMMPS. + +*/ diff --git a/tools/doxygen/Doxyfile.lammps b/tools/doxygen/Doxyfile.lammps new file mode 100644 index 0000000000..f872541857 --- /dev/null +++ b/tools/doxygen/Doxyfile.lammps @@ -0,0 +1,2557 @@ +# Doxyfile 1.8.15 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "LAMMPS - Large Atomic and Molecular Massive Parallel Simulator" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "LAMMPS - Developer Guide - LAMMPS_VERSION" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = tools/doxygen/doc + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = YES + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = YES + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = tools/doxygen/Developer.dox \ + src/ \ + src/ASPHERE \ + src/BODY \ + src/CLASS2 \ + src/COLLOID \ + src/COMPRESS \ + src/CORESHELL \ + src/DEPEND \ + src/DIPOLE \ + src/GPU \ + src/GRANULAR \ + src/KIM \ + src/KOKKOS \ + src/KSPACE \ + src/LATTE \ + src/MAKE \ + src/MANYBODY \ + src/MC \ + src/MEAM \ + src/MISC \ + src/MOLECULE \ + src/MPIIO \ + src/MSCG \ + src/OPT \ + src/PERI \ + src/POEMS \ + src/PYTHON \ + src/QEQ \ + src/REAX \ + src/REPLICA \ + src/RIGID \ + src/SHOCK \ + src/SNAP \ + src/SRD \ + src/VORONOI \ + src/USER-AWPMD \ + src/USER-CGDNA \ + src/USER-CGSDK \ + src/USER-COLVARS \ + src/USER-DIFFRACTION \ + src/USER-DPD \ + src/USER-DRUDE \ + src/USER-EFF \ + src/USER-FEP \ + src/USER-H5MD \ + src/USER-INTEL \ + src/USER-LB \ + src/USER-MANIFOLD \ + src/USER-MEAMC \ + src/USER-MESO \ + src/USER-MGPT \ + src/USER-MISC \ + src/USER-MOLFILE \ + src/USER-NETCDF \ + src/USER-OMP \ + src/USER-PHONON \ + src/USER-QMMM \ + src/USER-QTB \ + src/USER-QUIP \ + src/USER-REAXC \ + src/USER-SMD \ + src/USER-SMTBQ \ + src/USER-SPH \ + src/USER-TALLY \ + src/USER-UEF \ + src/USER-VTK \ + src/STUBS + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = examples + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = in.* + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = tools/doxygen + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via Javascript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have Javascript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: https://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /